/* Built for whs v2.2.0-beta.0 */ (function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : typeof define === 'function' && define.amd ? define(['exports'], factory) : (factory((global.VRKit = {}))); }(this, (function (exports) { 'use strict'; 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 _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); } /* 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=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=0;--i){var entry=this.tryEntries[i];if(entry.tryLoc<=this.prev&&hasOwn.call(entry,"finallyLoc")&&this.prev=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;iindex;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$1=_global.navigator;var _userAgent=navigator$1&&navigator$1.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;i1?_len-1:0),_key=1;_key<_len;_key++){extensions[_key-1]=arguments[_key];}// $.extend alternative, ... is the spread operator. for(var _i=0;_i0?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>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 to range 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 interval randInt:function(low,high){return low+Math.floor(Math.random()*(high-low+1));},// Random float from 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=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(rMath.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;i2048||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)yy&&xx>zz){// m11 is the largest diagonal term if(xxzz){// m22 is the largest diagonal term if(yymaxX)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;imaxX)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;ithis.max.x||point.ythis.max.y||point.zthis.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.xthis.max.x||box.max.ythis.max.y||box.max.zthis.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;ithis.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(distance0?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 \nvoid main() {\n\tvWorldPosition = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n\tgl_Position.z = gl_Position.w;\n}\n";var depth_frag="#if DEPTH_PACKING == 3200\n\tuniform float opacity;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( 1.0 );\n\t#if DEPTH_PACKING == 3200\n\t\tdiffuseColor.a = opacity;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \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 \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n";var distanceRGBA_frag="#define DISTANCE\nuniform vec3 referencePosition;\nuniform float nearDistance;\nuniform float farDistance;\nvarying vec3 vWorldPosition;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main () {\n\t#include \n\tvec4 diffuseColor = vec4( 1.0 );\n\t#include \n\t#include \n\t#include \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 \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include \n\t\t#include \n\t\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvWorldPosition = worldPosition.xyz;\n}\n";var equirect_frag="uniform sampler2D tEquirect;\nvarying vec3 vWorldPosition;\n#include \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 \nvoid main() {\n\tvWorldPosition = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n}\n";var linedashed_frag="uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \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 \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}\n";var linedashed_vert="uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvLineDistance = scale * lineDistance;\n\tvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include \n\t#include \n\t#include \n}\n";var meshbasic_frag="uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \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 \n\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}\n";var meshbasic_vert="#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#ifdef USE_ENVMAP\n\t#include \n\t#include \n\t#include \n\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \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 \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \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 \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\treflectedLight.indirectDiffuse = getAmbientLightIrradiance( ambientLightColor );\n\t#include \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 \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n";var meshlambert_vert="#define LAMBERT\nvarying vec3 vLightFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n";var meshphong_frag="#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \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 \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n";var meshphong_vert="#define PHONG\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n\t#include \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 \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \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 \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n";var meshphysical_vert="#define PHYSICAL\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \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 \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \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 \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \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 \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}\n";var points_vert="uniform float size;\nuniform float scale;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \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 \n\t#include \n\t#include \n\t#include \n\t#include \n}\n";var shadow_frag="uniform vec3 color;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\n\t#include \n}\n";var shadow_vert="#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \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>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+(g1){for(var i=0;i1){for(var i=0;i0){object.children=[];for(var i=0;i0)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;i0){for(var i=0;i0){this.normalsNeedUpdate=true;}},computeFlatVertexNormals:function(){var f,fl,face;this.computeFaceNormals();for(f=0,fl=this.faces.length;f0){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=0;i--){var idx=faceIndicesToRemove[i];this.faces.splice(idx,1);for(j=0,jl=this.faceVertexUvs.length;j0;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<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;i0;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;i0){morphTargetsNormal=[];for(var i=0;imax)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;i0){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;i0){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;i0){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;i0?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;iy0)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: , * opacity: , * map: new THREE.Texture( ), * * lightMap: new THREE.Texture( ), * lightMapIntensity: * * aoMap: new THREE.Texture( ), * aoMapIntensity: * * specularMap: new THREE.Texture( ), * * alphaMap: new THREE.Texture( ), * * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ), * combine: THREE.Multiply, * reflectivity: , * refractionRatio: , * * depthTest: , * depthWrite: , * * wireframe: , * wireframeLinewidth: , * * skinning: , * morphTargets: * } */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: , * vertexShader: , * * wireframe: , * wireframeLinewidth: , * * lights: , * * skinning: , * morphTargets: , * morphNormals: * } */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=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=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;i0){var morphAttribute=morphAttributes[keys[0]];if(morphAttribute!==undefined){this.morphTargetInfluences=[];this.morphTargetDictionary={};for(m=0,ml=morphAttribute.length;m0){this.morphTargetInfluences=[];this.morphTargetDictionary={};for(m=0,ml=morphTargets.length;mraycaster.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;i0)uvs=faceVertexUvs;for(var f=0,fl=faces.length;f0&&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.length65535?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;i0)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/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);i0?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&¶meters.fog?'#define USE_FOG':'',parameters.useFog&¶meters.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&¶meters.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&¶meters.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&¶meters.fog?'#define USE_FOG':'',parameters.useFog&¶meters.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(maxBones0,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;i1)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, * * map: new THREE.Texture( ), * * alphaMap: new THREE.Texture( ), * * displacementMap: new THREE.Texture( ), * displacementScale: , * displacementBias: , * * wireframe: , * wireframeLinewidth: * } */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: , * nearDistance: , * farDistance: , * * skinning: , * morphTargets: , * * map: new THREE.Texture( ), * * alphaMap: new THREE.Texture( ), * * displacementMap: new THREE.Texture( ), * displacementScale: , * displacementBias: * * } */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;i0;}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 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;imaxSize||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-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-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 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;i0){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=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: , * opacity: , * map: new THREE.Texture( ), * * 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(distanceraycaster.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;i1){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=levels[i].distance){levels[i-1].object.visible=false;levels[i].object.visible=true;}else{break;}}for(;i, * opacity: , * * linewidth: , * 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;iprecisionSq)continue;interRay.applyMatrix4(this.matrixWorld);//Move back to world space for distance calculation var distance=raycaster.ray.origin.distanceTo(interRay);if(distanceraycaster.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;iprecisionSq)continue;interRay.applyMatrix4(this.matrixWorld);//Move back to world space for distance calculation var distance=raycaster.ray.origin.distanceTo(interRay);if(distanceraycaster.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;iprecisionSq)continue;interRay.applyMatrix4(this.matrixWorld);//Move back to world space for distance calculation var distance=raycaster.ray.origin.distanceTo(interRay);if(distanceraycaster.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, * opacity: , * map: new THREE.Texture( ), * * size: , * sizeAttenuation: * } */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(rayPointDistanceSqraycaster.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=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=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;i0.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;i80*dim){minX=maxX=data[0];minY=maxY=data[1];for(var i=dim;imaxX)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=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.xb.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=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.x&&p.x>=mx&&hx!==p.x&&pointInTriangle(hym.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;i0||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=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;i2&&points[l-1].equals(points[0])){points.pop();}}function addContour(vertices,contour){for(var i=0;i, // number of points on the curves * steps: , // number of points for z-side extrusions / used for subdividing segments of extrude spline too * amount: , // Depth to extrude the shape * * bevelEnabled: , // turn on bevel * bevelThickness: , // how deep into the original shape bevel goes * bevelSize: , // how far from shape outline is bevel * bevelSegments: , // number of bevel layers * * extrudePath: // curve to extrude shape along * * UVGenerator: // 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;iNumber.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 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=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=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, // font * * size: , // size of the text * height: , // thickness to extrude text * curveSegments: , // number of points on the curves * * bevelEnabled: , // turn on bevel * bevelThickness: , // how deep into text bevel goes * bevelSize: // 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;iy0)indices.push(a,b,d);if(iy!==heightSegments-1||thetaEnd0)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 * } */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: , * roughness: , * metalness: , * opacity: , * * map: new THREE.Texture( ), * * lightMap: new THREE.Texture( ), * lightMapIntensity: * * aoMap: new THREE.Texture( ), * aoMapIntensity: * * emissive: , * emissiveIntensity: * emissiveMap: new THREE.Texture( ), * * bumpMap: new THREE.Texture( ), * bumpScale: , * * normalMap: new THREE.Texture( ), * normalScale: , * * displacementMap: new THREE.Texture( ), * displacementScale: , * displacementBias: , * * roughnessMap: new THREE.Texture( ), * * metalnessMap: new THREE.Texture( ), * * alphaMap: new THREE.Texture( ), * * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ), * envMapIntensity: * * refractionRatio: , * * wireframe: , * wireframeLinewidth: , * * skinning: , * morphTargets: , * morphNormals: * } */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: * } */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: , * specular: , * shininess: , * opacity: , * * map: new THREE.Texture( ), * * lightMap: new THREE.Texture( ), * lightMapIntensity: * * aoMap: new THREE.Texture( ), * aoMapIntensity: * * emissive: , * emissiveIntensity: * emissiveMap: new THREE.Texture( ), * * bumpMap: new THREE.Texture( ), * bumpScale: , * * normalMap: new THREE.Texture( ), * normalScale: , * * displacementMap: new THREE.Texture( ), * displacementScale: , * displacementBias: , * * specularMap: new THREE.Texture( ), * * alphaMap: new THREE.Texture( ), * * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ), * combine: THREE.Multiply, * reflectivity: , * refractionRatio: , * * wireframe: , * wireframeLinewidth: , * * skinning: , * morphTargets: , * morphNormals: * } */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( ) * } */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: , * * bumpMap: new THREE.Texture( ), * bumpScale: , * * normalMap: new THREE.Texture( ), * normalScale: , * * displacementMap: new THREE.Texture( ), * displacementScale: , * displacementBias: , * * wireframe: , * wireframeLinewidth: * * skinning: , * morphTargets: , * morphNormals: * } */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: , * opacity: , * * map: new THREE.Texture( ), * * lightMap: new THREE.Texture( ), * lightMapIntensity: * * aoMap: new THREE.Texture( ), * aoMapIntensity: * * emissive: , * emissiveIntensity: * emissiveMap: new THREE.Texture( ), * * specularMap: new THREE.Texture( ), * * alphaMap: new THREE.Texture( ), * * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ), * combine: THREE.Multiply, * reflectivity: , * refractionRatio: , * * wireframe: , * wireframeLinewidth: , * * skinning: , * morphTargets: , * morphNormals: * } */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: , * opacity: , * * linewidth: , * * scale: , * dashSize: , * gapSize: * } */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;i0||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)twoPi)deltaAngle-=twoPi;if(deltaAngle0?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+2points.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=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 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;i0){// 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= t1 || t1 === undefined ) { forward_scan:if(!(t=t0)){// looping? var t1global=pp[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>>1;if(t 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&×[from]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;i0){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;i1){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 uv index correspondence fi=geometry.faces.length;if(hasFaceVertexUv){for(i=0;i uv index correspondence fi=geometry.faces.length;if(hasFaceVertexUv){for(i=0;i1?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;i1?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;i0){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;i0)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;i0){var manager=new LoadingManager(onLoad);var loader=new ImageLoader(manager);loader.setCrossOrigin(this.crossOrigin);for(var i=0,l=json.length;i0){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 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;qNumber.EPSILON){// not parallel if(edgeDy<0){edgeLowPt=inPolygon[q];edgeDx=-edgeDx;edgeHighPt=inPolygon[p];edgeDy=-edgeDy;}if(inPt.yedgeHighPt.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 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;sIdx0){// console.log("to change: ", toChange); if(!ambiguous)newShapeHoles=betterShapeHoles;}}var tmpHoles;for(var i=0,il=newShapes.length;i0){this.source.connect(this.filters[0]);for(var i=1,l=this.filters.length;i0){this.source.disconnect(this.filters[0]);for(var i=1,l=this.filters.length;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' 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 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){// 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 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| 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;ithis.max.x||point.ythis.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.xthis.max.x||box.max.ythis.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;i0.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;i0?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;i3&&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.
* This class includes basic event system with those supported methods: *
.on()
.off()
.emit()
* @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;i0&&arguments[0]!==undefined?arguments[0]:{};var modules=this.modules;if(!modules)return bridgeMap;for(var i=0,max=modules.length;i 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;i1&&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 Piped modules * 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;i0&&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()

* Use this method if you know that you will overwrite existing dependency.
* 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 Get the 'hello' dependency * 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 Check whether the store has the 'hello' dependency * 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;i1&&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;iAdding a loop to an app * 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 Creating an AmbientLight * 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.

* This light will behave as though it is infinitely far away and the rays produced from it are all parallel.

* 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.

* 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 Creating a DirectionalLight to fall down from vec3(10, 20, 10) to vec3(0, 0, 0) * 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.
* It also doesn't need position and target properties. * @classDesc * * @param {Object} [params={light: {skyColor: 0xffffff, groundColor: 0xffffff, intensity: 1}}] - The params. * @extends module:core.LightComponent * @memberof module:components/lights * @example Creating a HemisphereLight * 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.)

* It has the same options as AmbientLight in light paramater, but it also supports position, distance and decay.
* @param {Object} [params={light: {color: 0xffffff, intensity: 1, distance: 100, decay: 1}}] - The params. * @extends LightComponent * @memberof module:components/lights * @example Creating a PointLight * 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.

* It has the same parameters as AmbientLight in light, but it also supports pos and target.

* SpotLight affects meshes with lambert and phong material. * @classDesc * * @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 Creating a SpotLight that falls down from vec3(10, 20, 10) to vec3(0, 0, 0) * 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 Creates a CubeCamera and set it as app's camera * 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
     * {
     *   camera: {
     *     near: 1,
     *     far: 1000,
     *     cubeResolution: 128
     *   }
     * }
*/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 Create an OrthographicCamera and set it as app's camera * 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
     * {
     *   near: 1,
     *   far: 1000,
     *   left: system.window.innerWidth / -2,
     *   right: system.window.innerWidth / 2,
     *   top: system.window.innerHeight / 2,
     *   bottom: system.window.innerHeight / -2
     * }
*/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 Create an PerspectiveCamera and set it as app's camera * 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
     * {
     *   near: 1,
     *   far: 1000,
     *   fov: 75,
     *   aspect: system.window.innerWidth / system.window.innerHeight
     * }
*/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 * * @param {Object} [params] - The params. * @extends module:core.MeshComponent * @memberof module:components/meshes * @example Creating a Box, and adding to app * 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
     * {
     *   geometry: {
     *     width: 1,
     *     height: 1,
     *     depth: 1,
     *     widthSegments: 1,
     *     heightSegments: 1,
     *     depthSegments: 1
     *   }
     * }
*/ /** * 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 * * @param {Object} [params] - The params. * @extends module:core.MeshComponent * @memberof module:components/meshes * @example Creating a Circle, and adding to app * 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
     * {
     *   geometry: {
     *     radius: 50,
     *     segments: 8,
     *     thetaStart: 0,
     *     thetaLength: Math.PI * 2
     *   }
     * }
*/ /** * 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.

* The solid enclosed by this surface and by two planes perpendicular to the axis is also called a cylinder.
* The surface area and the volume of a cylinder have been known since deep antiquity. * @classDesc * * @param {Object} [params] - The params. * @extends module:core.MeshComponent * @memberof module:components/meshes * @example Creating a Cone, and adding to app * 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
     * {
     *   geometry: {
     *     radius: 20,
     *     height: 100,
     *     radiusSegments: 32,
     *     heightSegments: 1,
     *     openEnded: false,
     *     thetaStart: 0,
     *     thetaLength: Math.PI * 2
     *   }
     * }
*/ /** * Instructions * @member {Object} module:components/meshes.Cone#instructions * @static * @default
     * geometry: [
     *   'radius',
     *   'height',
     *   'radiusSegments',
     *   'heightSegments',
     *   'openEnded',
     *   'thetaStart',
     *   'thetaLength'
     * ]
     * 
*/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.

* The solid enclosed by this surface and by two planes perpendicular to the axis is also called a cylinder.
* The surface area and the volume of a cylinder have been known since deep antiquity. * @classDesc * * @param {Object} [params] - The params. * @extends module:core.MeshComponent * @memberof module:components/meshes * @example Creating a Cylinder, and adding to app * 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
     * {
     *   geometry: {
     *     radiusTop: 20,
     *     radiusBottom: 20,
     *     height: 100,
     *     radiusSegments: 32,
     *     heightSegments: 1,
     *     openEnded: false,
     *     thetaStart: 0,
     *     thetaLength: Math.PI * 2
     *   }
     * }
*/ /** * Instructions * @member {Object} module:components/meshes.Cylinder#instructions * @static * @default
     * geometry: [
     *   'radiusTop',
     *   'radiusBottom',
     *   'height',
     *   'radiusSegments',
     *   'heightSegments',
     *   'openEnded',
     *   'thetaStart',
     *   'thetaLength'
     * ]
     * 
*/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.

* The most familiar dodecahedron is the regular dodecahedron, which is a Platonic solid.
* There are also three regular star dodecahedra, which are constructed as stellations of the convex form.
* All of these have icosahedral symmetry, order 120. * Dodecahedron creates Dodecahedron object by it's radius and detail. * @classDesc * * @param {Object} [params] - The params. * @extends module:core.MeshComponent * @memberof module:components/meshes * @example Creating a Dodecahedron, and adding to app * 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
     * geometry: {
     *   radius: 1,
     *   detail: 0
     * }
     * 
*/ /** * Instructions * @member {Object} module:components/meshes.Dodecahedron#instructions * @static * @default
     * geometry: ['radius', 'detail']
     * 
*/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 THREE.Vector2.
* Such implementation will help you to make volumed shapes that have their own depth and can be seen from all angels.

* You can also find some interesting examples made using three.js which is a core of whs.js, such as: * - Webgl geometry extrude * - Extrude shapes from geodata * - Extrude splines * * Such examples can be easily implemented using whitestorm.js or it's plugins. Use `Extrude` class with THREE.Shape to get extrude effect of shape defined by 2D vectors. * This class is similar to THREE.ExtrudeGeometry, * but it also contains all properties, applied by `Shape`, such as material, mass and vectors like position (pos) and rotation (rot). * @classDesc * * @param {Object} [params] - The params. * @extends module:core.MeshComponent * @memberof module:components/meshes * @example Creating a shape, then an Extrude from it * 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
     * {
     *   geometry: {
     *     shapes: [],
     *     options: {}
     *   }
     * }
     * 
*/ /** * Instructions * @member {Object} module:components/meshes.Extrude#instructions * @static * @default
     * {
     *   geometry: ['shapes', 'options']
     * }
     * 
*/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.
* There are many kinds of icosahedra, with some being more symmetrical than others. The most well known is the Platonic, convex regular icosahedron.
* `Icosahedron` creates an Icosahedron object by its radius and detail. * @classDesc * * @param {Object} [params] - The params. * @extends module:core.MeshComponent * @memberof module:components/meshes * @example Creating a Icosahedron, and adding to app * 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
     * {
     *   geometry: {
     *     radius: 1,
     *     detail: 0
     *   }
     * }
*/ /** * 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.

* 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.

* The following example shows a geometry which can be generated using `Lathe` class. * @classDesc * * @param {Object} [params] - The params. * @extends module:core.MeshComponent * @memberof module:components/meshes * @example Creating a Lath, and adding to app * 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
     * {
     *   geometry: {
     *     points: []
     *   }
     * }
     * 
*/ /** * Instructions * @member {Object} module:components/meshes.Lathe#instructions * @static * @default
{
     *   geometry: ['points']
     * }
     * 
*/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 Creating a Line, and adding to app * 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
     * {
     *   curve: new LineCurve3(new Vector3(0, 0, 0), new Vector3(10, 0, 0)),
     *   points: 50
     * }
     * 
*/ /** * Instructions * @member {Object} module:components/meshes.Line#instructions * @static * @default
{
     *   geometry: ['curve', 'points']
     * }
     * 
*/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;iCreating a Importer, and adding to app * 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
       * {
       *   url: '',
       *   loader: new JSONLoader(),
       *
       *   onLoad() {},
       *   onProgress() {},
       *   onError() {},
       *
       *   texturePath: null,
       *   useCustomMaterial: false,
       *
       *   parser(geometry, materials) {
       *     return new Mesh(geometry, materials);
       *   }
       * }
*/ /** * @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 Removing unnecessary lights from children * 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. *

* `Octahedron` creates an Octahedron object by its `radius` and `detail`. * @classDesc * * @param {Object} [params] - The params. * @extends module:core.MeshComponent * @memberof module:components/meshes * @example Creating an Octahedron, and adding to app * 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
     * {
     *   geometry: {
     *     radius: 1,
     *     detail: 0
     *   }
     * }
     * 
*/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 Parametric surface *

* It is usually used to develop different kinds of highfields or visualize a math function. *
* - Parametric surface * - "Graphulus" *

* @classDesc * * @param {Object} [params] - The params. * @extends module:core.MeshComponent * @memberof module:components/meshes * @example 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`. * 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
     * {
     *   geometry: {
     *     func: (u, v) => new Vector3(u, v, 0),
     *     slices: 10,
     *     tacks: 10
     *   }
     * }
     * 
*/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 * * @param {Object} [params] - The params. * @extends module:core.MeshComponent * @memberof module:components/meshes * @example Creating a Plane, and adding to app * 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
     * {
     *   geometry: {
     *     width: 10,
     *     height: 10,
     *     wSegments: 1,
     *     hSegments: 1
     *   }
     * }
     * 
*/ /** * Instructions * @member {Object} module:components/meshes.Plane#instructions * @static * @default
     * {
     *   geometry: ['width', 'height', 'wSegments', 'hSegments']
     * }
     * 
*/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. *

* `Polyhedron` creates a Polyhedron by its `radius` and `detail`. *

* @param {Object} [params] - The params. * @extends module:core.MeshComponent * @memberof module:components/meshes * @example Creating an Polyhedron, and adding to app * 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
     * {
     *   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
     *   }
     * }
     * 
*/ /** * Instructions * @member {Object} module:components/meshes.Polyhedron#instructions * @static * @default
     * {
     *   geometry: ['verticesOfCube', 'indicesOfFaces', 'radius', 'detail']
     * }
     * 
*/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 * * @param {Object} [params] - The params. * @extends module:core.MeshComponent * @memberof module:components/meshes * @example Creating a Ring, and adding to app * 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
     * {
     *   geometry: {
     *     innerRadius: 0,
     *     outerRadius: 50,
     *     thetaSegments: 8,
     *     phiSegments: 8,
     *     thetaStart: 0,
     *     thetaLength: Math.PI * 2
     *   }
     * }
     * 
*/ /** * Instructions * @member {Object} module:components/meshes.Ring#instructions * @static * @default
     * {
     *   geometry: [
     *     'innerRadius',
     *     'outerRadius',
     *     'thetaSegments',
     *     'phiSegments',
     *     'thetaStart',
     *     'thetaLength'
     *   ]
     * }
     * 
*/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.
* Unfortunately, not all of them support physics, an alternative is to make a similar 3D object and scale its width down to near zero. *

* `Shape` consists of shapes that are in its shapes parameter. * @classDesc * * @param {Object} [params] - The params. * @extends module:core.MeshComponent * @memberof module:components/meshes * @example Creating a plane looking Shape from a THREE.Shape, and adding it to app * 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
     * {
     *   geometry: {
     *     shapes: []
     * }
     * 
*/ /** * Instructions * @member {Object} module:components/meshes.Shape#instructions * @static * @default
     * {
     *   geometry: ['shapes']
     * }
     * 
*/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. *

* 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). *

* 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 * * @param {Object} [params] - The params. * @extends module:core.MeshComponent * @memberof module:components/meshes * @example Creating a Sphere, and adding it to app * 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
     * {
     *   geometry: {
     *     radius: 1,
     *     widthSegments: 8,
     *     heightSegments: 6
     * }
     * 
*/ /** * Instructions * @member {Object} module:components/meshes.Sphere#instructions * @static * @default
     * {
     *   geometry: ['radius', 'widthSegments', 'heightSegments']
     * }
     * 
*/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. *

* `Tetrahedron` creates a Tetrahedron object by its `radius` and `detail` * @classDesc * * @param {Object} [params] - The params. * @extends module:core.MeshComponent * @memberof module:components/meshes * @example Creating a Tetrahedron, and adding it to app * 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
     * {
     *   geometry: {
     *     radius: 1,
     *     detail: 0
     * }
     * 
*/ /** * Instructions * @member {Object} module:components/meshes.Tetrahedron#instructions * @static * @default
     * {
     *   geometry: ['radius', 'detail']
     * }
     * 
*/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 * *

* 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 Creating a Text, and adding it to app * 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
       * {
       *   text: 'Hello World!',
       *   font: null,
       *
       *   geometry: {
       *     size: 12,
       *     height: 50,
       *     curveSegments: 12,
       *     font: new Font(),
       *     bevelEnabled: false,
       *     bevelThickness: 10,
       *     bevelSize: 8
       *   }
       * }
       * 
*/ /** * 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 * * @param {Object} [params] - The params. * @extends module:core.MeshComponent * @memberof module:components/meshes * @example Creating a Torus, and adding it to app * 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
     * {
     *   geometry: {
     *     radius: 100,
     *     tube: 40,
     *     radialSegments: 8,
     *     tubularSegments: 6,
     *     arc: Math.PI * 2
     *   }
     * }
     * 
*/ /** * Instructions * @member {Object} module:components/meshes.Torus#instructions * @static * @default
     * {
     *   geometry: [
     *     'radius',
     *     'tube',
     *     'radialSegments',
     *     'tubularSegments',
     *     'arc'
     *   ]
     * }
     * 
*/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 * * @param {Object} [params] - The params. * @extends module:core.MeshComponent * @memberof module:components/meshes * @example Creating a Torusknot, and adding it to app * 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
     * {
     *   geometry: {
     *     radius: 100,
     *     tube: 40,
     *     radialSegments: 64,
     *     tubularSegments: 8,
     *     p: 2,
     *     q: 3
     *   }
     * }
     * 
*/ /** * Instructions * @member {Object} module:components/meshes.Torusknot#instructions * @static * @default
     * {
     *   geometry: [
     *     'radius',
     *     'tube',
     *     'radialSegments',
     *     'tubularSegments',
     *     'p',
     *     'q'
     *   ]
     * }
     * 
*/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 * * @param {Object} [params] - The params. * @extends module:core.MeshComponent * @memberof module:components/meshes * @example Creating a Tube from a three.js Curve, and adding it to app * 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
     * {
     *   geometry: {
     *     path: new THREE.LineCurve3(new Vector3(0, 0, 0), new Vector3(0, 0, 1)),
     *     segments: 20,
     *     radius: 2,
     *     radiusSegments: 8,
     *     closed: false
     *   }
     * }
     * 
*/ /** * Instructions * @member {Object} module:components/meshes.Tube#instructions * @static * @default
     * {
     *   geometry: [
     *     'path',
     *     'segments',
     *     'radius',
     *     'radiusSegments',
     *     'closed'
     *   ]
     * }
     * 
*/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).
* In Three.js you make it using `THREE.Object3D` and it's children.

* In whs.js we have `Group` * @extends module:core.MeshComponent * @memberof module:components/meshes * @example Approach 2 - Adding objects to an empty group * const sphere = new Sphere(); * const box = new Box(); * const group = new Group(); * * sphere.addTo(group); * box.addTo(group); * @example Approach 2 - Making a group from objects * 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;iCreating an element module, passing it to the App * 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 Creating a rendering module and passing it to App's modules * 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 \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 \r\n#include \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 \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 \r\n#include \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 \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 \r\n#include \r\n#include \r\n#include \r\n\r\nvarying float vViewZ;\r\nvarying vec4 vProjTexCoord;\r\n\r\nvoid main() {\r\n\r\n\t#include \r\n\r\n\t#include \r\n\t#include \r\n\t#include \r\n\t#include \r\n\r\n\tvViewZ = mvPosition.z;\r\n\tvProjTexCoord = gl_Position;\r\n\r\n\t#include \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 \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 \r\n#include \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 \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 \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 \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 \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 \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 \r\n#include \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 \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;i0&&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;i2&&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=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;i0){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<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;i2&&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 Creating a rendering module and passing it to App's modules * 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 Creating a rendering module and passing it to App's modules * 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 How to create and apply a FogModule * 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 Creating a state module * 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 Adding `green` configuration * 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 Update callback for `sphereColor` * 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 Changes configuration to `green` * 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 Creating a rendering module and passing it to App's modules * 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 Creating an instance. url takes a path, or a data object. * var woodTexture = new TextureModule({ * url: `${process.assetsPath}/textures/wood.jpg` * }); * @example More comprehensive example, wood texture applied to a Box. * 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 three.js animation system * @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 Create animation module and play a given clip of an imported model * 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 Creating a DefineModule with PerspectiveCamera as camera module and passing it to App's modules * 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;}(); // Polyfills 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 ( Function.prototype.name === undefined ) { // 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$1() {} Object.assign( EventDispatcher$1.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 = [], i = 0; var length = listenerArray.length; for ( i = 0; i < length; i ++ ) { array[ i ] = listenerArray[ i ]; } for ( i = 0; i < length; i ++ ) { array[ i ].call( this, event ); } } } } ); var REVISION$1 = '85'; var CullFaceNone$1 = 0; var CullFaceBack$1 = 1; var CullFaceFront$1 = 2; var FrontFaceDirectionCW = 0; var PCFShadowMap$1 = 1; var PCFSoftShadowMap$1 = 2; var FrontSide$1 = 0; var BackSide$1 = 1; var DoubleSide$1 = 2; var FlatShading$1 = 1; var SmoothShading = 2; var NoColors$1 = 0; var FaceColors$1 = 1; var VertexColors$1 = 2; var NoBlending$1 = 0; var NormalBlending$1 = 1; var AdditiveBlending$1 = 2; var SubtractiveBlending$1 = 3; var MultiplyBlending$1 = 4; var CustomBlending$1 = 5; var AddEquation$1 = 100; var SubtractEquation$1 = 101; var ReverseSubtractEquation$1 = 102; var MinEquation$1 = 103; var MaxEquation$1 = 104; var ZeroFactor$1 = 200; var OneFactor$1 = 201; var SrcColorFactor$1 = 202; var OneMinusSrcColorFactor$1 = 203; var SrcAlphaFactor$1 = 204; var OneMinusSrcAlphaFactor$1 = 205; var DstAlphaFactor$1 = 206; var OneMinusDstAlphaFactor$1 = 207; var DstColorFactor$1 = 208; var OneMinusDstColorFactor$1 = 209; var SrcAlphaSaturateFactor$1 = 210; var NeverDepth$1 = 0; var AlwaysDepth$1 = 1; var LessDepth$1 = 2; var LessEqualDepth$1 = 3; var EqualDepth$1 = 4; var GreaterEqualDepth$1 = 5; var GreaterDepth$1 = 6; var NotEqualDepth$1 = 7; var MultiplyOperation$1 = 0; var MixOperation$1 = 1; var AddOperation$1 = 2; var NoToneMapping$1 = 0; var LinearToneMapping$1 = 1; var ReinhardToneMapping$1 = 2; var Uncharted2ToneMapping$1 = 3; var CineonToneMapping$1 = 4; var UVMapping$1 = 300; var CubeReflectionMapping$1 = 301; var CubeRefractionMapping$1 = 302; var EquirectangularReflectionMapping$1 = 303; var EquirectangularRefractionMapping$1 = 304; var SphericalReflectionMapping$1 = 305; var CubeUVReflectionMapping$1 = 306; var CubeUVRefractionMapping$1 = 307; var RepeatWrapping$1 = 1000; var ClampToEdgeWrapping$1 = 1001; var MirroredRepeatWrapping$1 = 1002; var NearestFilter$1 = 1003; var NearestMipMapNearestFilter$1 = 1004; var NearestMipMapLinearFilter$1 = 1005; var LinearFilter$1 = 1006; var LinearMipMapNearestFilter$1 = 1007; var LinearMipMapLinearFilter$1 = 1008; var UnsignedByteType$1 = 1009; var ByteType$1 = 1010; var ShortType$1 = 1011; var UnsignedShortType$1 = 1012; var IntType$1 = 1013; var UnsignedIntType$1 = 1014; var FloatType$1 = 1015; var HalfFloatType$1 = 1016; var UnsignedShort4444Type$1 = 1017; var UnsignedShort5551Type$1 = 1018; var UnsignedShort565Type$1 = 1019; var UnsignedInt248Type$1 = 1020; var AlphaFormat$1 = 1021; var RGBFormat$1 = 1022; var RGBAFormat$1 = 1023; var LuminanceFormat$1 = 1024; var LuminanceAlphaFormat$1 = 1025; var DepthFormat$1 = 1026; var DepthStencilFormat$1 = 1027; var RGB_S3TC_DXT1_Format$1 = 2001; var RGBA_S3TC_DXT1_Format$1 = 2002; var RGBA_S3TC_DXT3_Format$1 = 2003; var RGBA_S3TC_DXT5_Format$1 = 2004; var RGB_PVRTC_4BPPV1_Format$1 = 2100; var RGB_PVRTC_2BPPV1_Format$1 = 2101; var RGBA_PVRTC_4BPPV1_Format$1 = 2102; var RGBA_PVRTC_2BPPV1_Format$1 = 2103; var RGB_ETC1_Format$1 = 2151; var LoopOnce$1 = 2200; var LoopRepeat$1 = 2201; var LoopPingPong$1 = 2202; var InterpolateDiscrete$1 = 2300; var InterpolateLinear$1 = 2301; var InterpolateSmooth$1 = 2302; var ZeroCurvatureEnding$1 = 2400; var ZeroSlopeEnding$1 = 2401; var WrapAroundEnding$1 = 2402; var TrianglesDrawMode$1 = 0; var TriangleStripDrawMode$1 = 1; var TriangleFanDrawMode$1 = 2; var LinearEncoding$1 = 3000; var sRGBEncoding$1 = 3001; var GammaEncoding$1 = 3007; var RGBEEncoding$1 = 3002; var RGBM7Encoding$1 = 3004; var RGBM16Encoding$1 = 3005; var RGBDEncoding$1 = 3006; var BasicDepthPacking$1 = 3200; var RGBADepthPacking$1 = 3201; /** * @author alteredq / http://alteredqualia.com/ * @author mrdoob / http://mrdoob.com/ */ var _Math$1 = { DEG2RAD: Math.PI / 180, RAD2DEG: 180 / Math.PI, generateUUID: function () { // http://www.broofa.com/Tools/Math.uuid.htm var chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split( '' ); var uuid = new Array( 36 ); var rnd = 0, r; return function generateUUID() { for ( var i = 0; i < 36; i ++ ) { if ( i === 8 || i === 13 || i === 18 || i === 23 ) { uuid[ i ] = '-'; } else if ( i === 14 ) { uuid[ i ] = '4'; } else { if ( rnd <= 0x02 ) rnd = 0x2000000 + ( Math.random() * 0x1000000 ) | 0; r = rnd & 0xf; rnd = rnd >> 4; uuid[ i ] = chars[ ( i === 19 ) ? ( r & 0x3 ) | 0x8 : r ]; } } return uuid.join( '' ); }; }(), 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 to range 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 interval randInt: function ( low, high ) { return low + Math.floor( Math.random() * ( high - low + 1 ) ); }, // Random float from 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$1.DEG2RAD; }, radToDeg: function ( radians ) { return radians * _Math$1.RAD2DEG; }, isPowerOfTwo: function ( value ) { return ( value & ( value - 1 ) ) === 0 && value !== 0; }, nearestPowerOfTwo: function ( value ) { return Math.pow( 2, Math.round( Math.log( value ) / Math.LN2 ) ); }, nextPowerOfTwo: function ( value ) { value --; value |= value >> 1; value |= value >> 2; value |= value >> 4; value |= value >> 8; value |= value >> 16; value ++; return value; } }; /** * @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$1( x, y ) { this.x = x || 0; this.y = y || 0; } Object.defineProperties( Vector2$1.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$1.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 ); }, 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 ) { // This function assumes min < max, if this assumption isn't true it will not operate correctly 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$1(); var max = new Vector2$1(); 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.multiplyScalar( Math.max( min, Math.min( max, length ) ) / 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 ); }, lengthManhattan: function() { return Math.abs( this.x ) + Math.abs( this.y ); }, normalize: function () { return this.divideScalar( this.length() ); }, 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; }, distanceToManhattan: function ( v ) { return Math.abs( this.x - v.x ) + Math.abs( this.y - v.y ); }, setLength: function ( length ) { return this.multiplyScalar( length / this.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 alteredq / http://alteredqualia.com/ * @author szimek / https://github.com/szimek/ */ var textureId$1 = 0; function Texture$1( image, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ) { Object.defineProperty( this, 'id', { value: textureId$1 ++ } ); this.uuid = _Math$1.generateUUID(); this.name = ''; this.image = image !== undefined ? image : Texture$1.DEFAULT_IMAGE; this.mipmaps = []; this.mapping = mapping !== undefined ? mapping : Texture$1.DEFAULT_MAPPING; this.wrapS = wrapS !== undefined ? wrapS : ClampToEdgeWrapping$1; this.wrapT = wrapT !== undefined ? wrapT : ClampToEdgeWrapping$1; this.magFilter = magFilter !== undefined ? magFilter : LinearFilter$1; this.minFilter = minFilter !== undefined ? minFilter : LinearMipMapLinearFilter$1; this.anisotropy = anisotropy !== undefined ? anisotropy : 1; this.format = format !== undefined ? format : RGBAFormat$1; this.type = type !== undefined ? type : UnsignedByteType$1; this.offset = new Vector2$1( 0, 0 ); this.repeat = new Vector2$1( 1, 1 ); 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$1; this.version = 0; this.onUpdate = null; } Texture$1.DEFAULT_IMAGE = undefined; Texture$1.DEFAULT_MAPPING = UVMapping$1; Object.defineProperty( Texture$1.prototype, "needsUpdate", { set: function ( value ) { if ( value === true ) this.version ++; } } ); Object.assign( Texture$1.prototype, EventDispatcher$1.prototype, { constructor: Texture$1, isTexture: true, 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.generateMipmaps = source.generateMipmaps; this.premultiplyAlpha = source.premultiplyAlpha; this.flipY = source.flipY; this.unpackAlignment = source.unpackAlignment; this.encoding = source.encoding; return this; }, toJSON: function ( meta ) { if ( meta.textures[ this.uuid ] !== undefined ) { return meta.textures[ this.uuid ]; } function getDataURL( image ) { var canvas; if ( image.toDataURL !== undefined ) { canvas = image; } else { canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ); canvas.width = image.width; canvas.height = image.height; canvas.getContext( '2d' ).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 ], wrap: [ this.wrapS, this.wrapT ], 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$1.generateUUID(); // UGH } if ( meta.images[ image.uuid ] === undefined ) { meta.images[ image.uuid ] = { uuid: image.uuid, url: getDataURL( image ) }; } output.image = image.uuid; } meta.textures[ this.uuid ] = output; return output; }, dispose: function () { this.dispatchEvent( { type: 'dispose' } ); }, transformUv: function ( uv ) { if ( this.mapping !== UVMapping$1 ) return; uv.multiply( this.repeat ); uv.add( this.offset ); if ( uv.x < 0 || uv.x > 1 ) { switch ( this.wrapS ) { case RepeatWrapping$1: uv.x = uv.x - Math.floor( uv.x ); break; case ClampToEdgeWrapping$1: uv.x = uv.x < 0 ? 0 : 1; break; case MirroredRepeatWrapping$1: 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$1: uv.y = uv.y - Math.floor( uv.y ); break; case ClampToEdgeWrapping$1: uv.y = uv.y < 0 ? 0 : 1; break; case MirroredRepeatWrapping$1: 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; } } } ); /** * @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$1( 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$1.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 ) { // This function assumes min < max, if this assumption isn't true it will not operate correctly 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 = new Vector4$1(); var max = new Vector4$1(); return function clampScalar( minVal, maxVal ) { min.set( minVal, minVal, minVal, minVal ); max.set( maxVal, maxVal, maxVal, maxVal ); return this.clamp( min, max ); }; }(), 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 ); }, lengthManhattan: 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() ); }, setLength: function ( length ) { return this.multiplyScalar( length / this.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$1( width, height, options ) { this.uuid = _Math$1.generateUUID(); this.width = width; this.height = height; this.scissor = new Vector4$1( 0, 0, width, height ); this.scissorTest = false; this.viewport = new Vector4$1( 0, 0, width, height ); options = options || {}; if ( options.minFilter === undefined ) options.minFilter = LinearFilter$1; this.texture = new Texture$1( 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; } Object.assign( WebGLRenderTarget$1.prototype, EventDispatcher$1.prototype, { 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$1( width, height, options ) { WebGLRenderTarget$1.call( this, width, height, options ); this.activeCubeFace = 0; // PX 0, NX 1, PY 2, NY 3, PZ 4, NZ 5 this.activeMipMapLevel = 0; } WebGLRenderTargetCube$1.prototype = Object.create( WebGLRenderTarget$1.prototype ); WebGLRenderTargetCube$1.prototype.constructor = WebGLRenderTargetCube$1; WebGLRenderTargetCube$1.prototype.isWebGLRenderTargetCube = true; /** * @author mikael emtinger / http://gomo.se/ * @author alteredq / http://alteredqualia.com/ * @author WestLangley / http://github.com/WestLangley * @author bhouston / http://clara.io */ function Quaternion$1( 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$1, { 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$1.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$1.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 ) === false ) { 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$1(); var r; var EPS = 0.000001; return function setFromUnitVectors( vFrom, vTo ) { if ( v1 === undefined ) v1 = new Vector3$1(); 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 () { return this.conjugate().normalize(); }, 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$1( x, y, z ) { this.x = x || 0; this.y = y || 0; this.z = z || 0; } Object.assign( Vector3$1.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$1(); return function applyEuler( euler ) { if ( ( euler && euler.isEuler ) === false ) { 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$1(); 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; this.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ]; this.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ]; this.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ]; var w = e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ]; return this.divideScalar( w ); }, 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$1(); return function project( camera ) { matrix.multiplyMatrices( camera.projectionMatrix, matrix.getInverse( camera.matrixWorld ) ); return this.applyMatrix4( matrix ); }; }(), unproject: function () { var matrix = new Matrix4$1(); 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 ) { // This function assumes min < max, if this assumption isn't true it will not operate correctly 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$1(); var max = new Vector3$1(); 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.multiplyScalar( Math.max( min, Math.min( max, length ) ) / 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 ); }, lengthManhattan: function () { return Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ); }, normalize: function () { return this.divideScalar( this.length() ); }, setLength: function ( length ) { return this.multiplyScalar( length / this.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 ); } var x = this.x, y = this.y, z = this.z; this.x = y * v.z - z * v.y; this.y = z * v.x - x * v.z; this.z = x * v.y - y * v.x; return this; }, 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$1(); 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$1(); 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$1.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; }, distanceToManhattan: 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 ) { return this.setFromMatrixColumn( m, 3 ); }, 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 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$1() { 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$1.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$1().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$1(); 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 ) === false ) { console.error( 'THREE.Matrix: .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$1(); var y = new Vector3$1(); var z = new Vector3$1(); 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 ) { // eye and target are in the same vertical z.z += 0.0001; 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$1(); 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$1(); var matrix = new Matrix4$1(); 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 alteredq / http://alteredqualia.com/ */ function DataTexture$1( data, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, encoding ) { Texture$1.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$1; this.minFilter = minFilter !== undefined ? minFilter : NearestFilter$1; this.generateMipmaps = false; this.flipY = false; this.unpackAlignment = 1; } DataTexture$1.prototype = Object.create( Texture$1.prototype ); DataTexture$1.prototype.constructor = DataTexture$1; DataTexture$1.prototype.isDataTexture = true; /** * @author mrdoob / http://mrdoob.com/ */ function CubeTexture$1( images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ) { images = images !== undefined ? images : []; mapping = mapping !== undefined ? mapping : CubeReflectionMapping$1; Texture$1.call( this, images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ); this.flipY = false; } CubeTexture$1.prototype = Object.create( Texture$1.prototype ); CubeTexture$1.prototype.constructor = CubeTexture$1; CubeTexture$1.prototype.isCubeTexture = true; Object.defineProperty( CubeTexture$1.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$1 = new Texture$1(); var emptyCubeTexture$1 = new CubeTexture$1(); // --- Base for inner nodes (including the root) --- function UniformContainer$1() { this.seq = []; this.map = {}; } // --- Utilities --- // Array Caches (provide typed arrays for temporary by size) var arrayCacheF32$1 = []; var arrayCacheI32$1 = []; // Float32Array caches used for uploading Matrix uniforms var mat4array$1 = new Float32Array( 16 ); var mat3array$1 = new Float32Array( 9 ); // Flattening for arrays of vectors and matrices function flatten$1( 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$1[ n ]; if ( r === undefined ) { r = new Float32Array( n ); arrayCacheF32$1[ 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$1( renderer, n ) { var r = arrayCacheI32$1[ n ]; if ( r === undefined ) { r = new Int32Array( n ); arrayCacheI32$1[ 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$1( gl, v ) { gl.uniform1f( this.addr, v ); } function setValue1i$1( gl, v ) { gl.uniform1i( this.addr, v ); } // Single float vector (from flat array or THREE.VectorN) function setValue2fv$1( gl, v ) { if ( v.x === undefined ) gl.uniform2fv( this.addr, v ); else gl.uniform2f( this.addr, v.x, v.y ); } function setValue3fv$1( 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$1( 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$1( gl, v ) { gl.uniformMatrix2fv( this.addr, false, v.elements || v ); } function setValue3fm$1( gl, v ) { if ( v.elements === undefined ) { gl.uniformMatrix3fv( this.addr, false, v ); } else { mat3array$1.set( v.elements ); gl.uniformMatrix3fv( this.addr, false, mat3array$1 ); } } function setValue4fm$1( gl, v ) { if ( v.elements === undefined ) { gl.uniformMatrix4fv( this.addr, false, v ); } else { mat4array$1.set( v.elements ); gl.uniformMatrix4fv( this.addr, false, mat4array$1 ); } } // Single texture (2D / Cube) function setValueT1$1( gl, v, renderer ) { var unit = renderer.allocTextureUnit(); gl.uniform1i( this.addr, unit ); renderer.setTexture2D( v || emptyTexture$1, unit ); } function setValueT6$1( gl, v, renderer ) { var unit = renderer.allocTextureUnit(); gl.uniform1i( this.addr, unit ); renderer.setTextureCube( v || emptyCubeTexture$1, unit ); } // Integer / Boolean vectors or arrays thereof (always flat arrays) function setValue2iv$1( gl, v ) { gl.uniform2iv( this.addr, v ); } function setValue3iv$1( gl, v ) { gl.uniform3iv( this.addr, v ); } function setValue4iv$1( gl, v ) { gl.uniform4iv( this.addr, v ); } // Helper to pick the right setter for the singular case function getSingularSetter$1( type ) { switch ( type ) { case 0x1406: return setValue1f$1; // FLOAT case 0x8b50: return setValue2fv$1; // _VEC2 case 0x8b51: return setValue3fv$1; // _VEC3 case 0x8b52: return setValue4fv$1; // _VEC4 case 0x8b5a: return setValue2fm$1; // _MAT2 case 0x8b5b: return setValue3fm$1; // _MAT3 case 0x8b5c: return setValue4fm$1; // _MAT4 case 0x8b5e: return setValueT1$1; // SAMPLER_2D case 0x8b60: return setValueT6$1; // SAMPLER_CUBE case 0x1404: case 0x8b56: return setValue1i$1; // INT, BOOL case 0x8b53: case 0x8b57: return setValue2iv$1; // _VEC2 case 0x8b54: case 0x8b58: return setValue3iv$1; // _VEC3 case 0x8b55: case 0x8b59: return setValue4iv$1; // _VEC4 } } // Array of scalars function setValue1fv$1( gl, v ) { gl.uniform1fv( this.addr, v ); } function setValue1iv$1( gl, v ) { gl.uniform1iv( this.addr, v ); } // Array of vectors (flat or from THREE classes) function setValueV2a$1( gl, v ) { gl.uniform2fv( this.addr, flatten$1( v, this.size, 2 ) ); } function setValueV3a$1( gl, v ) { gl.uniform3fv( this.addr, flatten$1( v, this.size, 3 ) ); } function setValueV4a$1( gl, v ) { gl.uniform4fv( this.addr, flatten$1( v, this.size, 4 ) ); } // Array of matrices (flat or from THREE clases) function setValueM2a$1( gl, v ) { gl.uniformMatrix2fv( this.addr, false, flatten$1( v, this.size, 4 ) ); } function setValueM3a$1( gl, v ) { gl.uniformMatrix3fv( this.addr, false, flatten$1( v, this.size, 9 ) ); } function setValueM4a$1( gl, v ) { gl.uniformMatrix4fv( this.addr, false, flatten$1( v, this.size, 16 ) ); } // Array of textures (2D / Cube) function setValueT1a$1( gl, v, renderer ) { var n = v.length, units = allocTexUnits$1( renderer, n ); gl.uniform1iv( this.addr, units ); for ( var i = 0; i !== n; ++ i ) { renderer.setTexture2D( v[ i ] || emptyTexture$1, units[ i ] ); } } function setValueT6a$1( gl, v, renderer ) { var n = v.length, units = allocTexUnits$1( renderer, n ); gl.uniform1iv( this.addr, units ); for ( var i = 0; i !== n; ++ i ) { renderer.setTextureCube( v[ i ] || emptyCubeTexture$1, units[ i ] ); } } // Helper to pick the right setter for a pure (bottom-level) array function getPureArraySetter$1( type ) { switch ( type ) { case 0x1406: return setValue1fv$1; // FLOAT case 0x8b50: return setValueV2a$1; // _VEC2 case 0x8b51: return setValueV3a$1; // _VEC3 case 0x8b52: return setValueV4a$1; // _VEC4 case 0x8b5a: return setValueM2a$1; // _MAT2 case 0x8b5b: return setValueM3a$1; // _MAT3 case 0x8b5c: return setValueM4a$1; // _MAT4 case 0x8b5e: return setValueT1a$1; // SAMPLER_2D case 0x8b60: return setValueT6a$1; // SAMPLER_CUBE case 0x1404: case 0x8b56: return setValue1iv$1; // INT, BOOL case 0x8b53: case 0x8b57: return setValue2iv$1; // _VEC2 case 0x8b54: case 0x8b58: return setValue3iv$1; // _VEC3 case 0x8b55: case 0x8b59: return setValue4iv$1; // _VEC4 } } // --- Uniform Classes --- function SingleUniform$1( id, activeInfo, addr ) { this.id = id; this.addr = addr; this.setValue = getSingularSetter$1( activeInfo.type ); // this.path = activeInfo.name; // DEBUG } function PureArrayUniform$1( id, activeInfo, addr ) { this.id = id; this.addr = addr; this.size = activeInfo.size; this.setValue = getPureArraySetter$1( activeInfo.type ); // this.path = activeInfo.name; // DEBUG } function StructuredUniform$1( id ) { this.id = id; UniformContainer$1.call( this ); // mix-in } StructuredUniform$1.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$1 = /([\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$1( container, uniformObject ) { container.seq.push( uniformObject ); container.map[ uniformObject.id ] = uniformObject; } function parseUniform$1( activeInfo, addr, container ) { var path = activeInfo.name, pathLength = path.length; // reset RegExp object, because of the early exit of a previous run RePathPart$1.lastIndex = 0; for ( ; ; ) { var match = RePathPart$1.exec( path ), matchEnd = RePathPart$1.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$1( container, subscript === undefined ? new SingleUniform$1( id, activeInfo, addr ) : new PureArrayUniform$1( 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$1( id ); addUniform$1( container, next ); } container = next; } } } // Root Container function WebGLUniforms$1( gl, program, renderer ) { UniformContainer$1.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 ), path = info.name, addr = gl.getUniformLocation( program, path ); parseUniform$1( info, addr, this ); } } WebGLUniforms$1.prototype.setValue = function ( gl, name, value ) { var u = this.map[ name ]; if ( u !== undefined ) u.setValue( gl, value, this.renderer ); }; WebGLUniforms$1.prototype.setOptional = function ( gl, object, name ) { var v = object[ name ]; if ( v !== undefined ) this.setValue( gl, name, v ); }; // Static interface WebGLUniforms$1.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$1.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/ */ var ColorKeywords$1 = { '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, '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$1( 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$1.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$1.euclideanModulo( h, 1 ); s = _Math$1.clamp( s, 0, 1 ); l = _Math$1.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$1[ 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 ( optionalTarget ) { // h,s,l ranges are in 0.0 - 1.0 var hsl = optionalTarget || { 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; } hsl.h = hue; hsl.s = saturation; hsl.l = lightness; return hsl; }, getStyle: function () { return 'rgb(' + ( ( this.r * 255 ) | 0 ) + ',' + ( ( this.g * 255 ) | 0 ) + ',' + ( ( this.b * 255 ) | 0 ) + ')'; }, offsetHSL: function ( h, s, l ) { var hsl = this.getHSL(); 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$1 = { common: { diffuse: { value: new Color$1( 0xeeeeee ) }, opacity: { value: 1.0 }, map: { value: null }, offsetRepeat: { value: new Vector4$1( 0, 0, 1, 1 ) }, specularMap: { value: null }, alphaMap: { value: null }, envMap: { value: null }, flipEnvMap: { value: - 1 }, reflectivity: { value: 1.0 }, refractionRatio: { value: 0.98 } }, 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, 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$1( 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: {} } }, 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$1( 0xeeeeee ) }, opacity: { value: 1.0 }, size: { value: 1.0 }, scale: { value: 1.0 }, map: { value: null }, offsetRepeat: { value: new Vector4$1( 0, 0, 1, 1 ) } } }; /** * Uniform Utilities */ var UniformsUtils$1 = { 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; } }; var alphamap_fragment$1 = "#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, vUv ).g;\n#endif\n"; var alphamap_pars_fragment$1 = "#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif\n"; var alphatest_fragment$1 = "#ifdef ALPHATEST\n\tif ( diffuseColor.a < ALPHATEST ) discard;\n#endif\n"; var aomap_fragment$1 = "#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$1 = "#ifdef USE_AOMAP\n\tuniform sampler2D aoMap;\n\tuniform float aoMapIntensity;\n#endif"; var begin_vertex$1 = "\nvec3 transformed = vec3( position );\n"; var beginnormal_vertex$1 = "\nvec3 objectNormal = vec3( normal );\n"; var bsdfs$1 = "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 theta = acos( dot( N, V ) );\n\tvec2 uv = vec2(\n\t\tsqrt( saturate( roughness ) ),\n\t\tsaturate( theta / ( 0.5 * PI ) ) );\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.86267 + (0.49788 + 0.01436 * y ) * y;\n\tfloat b = 3.45068 + (4.18814 + y) * y;\n\tfloat v = a / b;\n\tfloat theta_sintheta = (x > 0.0) ? v : 0.5 * inversesqrt( 1.0 - x * x ) - 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 * transpose( 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\tvec3 result = vec3( LTC_ClippedSphereFormFactor( vectorFormFactor ) );\n\treturn 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$1 = "#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 = dFdx( surf_pos );\n\t\tvec3 vSigmaY = dFdy( surf_pos );\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$1 = "#if NUM_CLIPPING_PLANES > 0\n\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; ++ i ) {\n\t\tvec4 plane = clippingPlanes[ i ];\n\t\tif ( dot( vViewPosition, plane.xyz ) > plane.w ) discard;\n\t}\n\t\t\n\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\tbool clipped = true;\n\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; ++ i ) {\n\t\t\tvec4 plane = clippingPlanes[ i ];\n\t\t\tclipped = ( dot( vViewPosition, plane.xyz ) > plane.w ) && clipped;\n\t\t}\n\t\tif ( clipped ) discard;\n\t\n\t#endif\n#endif\n"; var clipping_planes_pars_fragment$1 = "#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$1 = "#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\n\tvarying vec3 vViewPosition;\n#endif\n"; var clipping_planes_vertex$1 = "#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n"; var color_fragment$1 = "#ifdef USE_COLOR\n\tdiffuseColor.rgb *= vColor;\n#endif"; var color_pars_fragment$1 = "#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif\n"; var color_pars_vertex$1 = "#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif"; var color_vertex$1 = "#ifdef USE_COLOR\n\tvColor.xyz = color.xyz;\n#endif"; var common$1 = "#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 transpose( const in mat3 v ) {\n\tmat3 tmp;\n\ttmp[0] = vec3(v[0].x, v[1].x, v[2].x);\n\ttmp[1] = vec3(v[0].y, v[1].y, v[2].y);\n\ttmp[2] = vec3(v[0].z, v[1].z, v[2].z);\n\treturn tmp;\n}\n"; var cube_uv_reflection_fragment$1 = "#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$1 = "#ifdef FLIP_SIDED\n\tobjectNormal = -objectNormal;\n#endif\nvec3 transformedNormal = normalMatrix * objectNormal;\n"; var displacementmap_pars_vertex$1 = "#ifdef USE_DISPLACEMENTMAP\n\tuniform sampler2D displacementMap;\n\tuniform float displacementScale;\n\tuniform float displacementBias;\n#endif\n"; var displacementmap_vertex$1 = "#ifdef USE_DISPLACEMENTMAP\n\ttransformed += normal * ( texture2D( displacementMap, uv ).x * displacementScale + displacementBias );\n#endif\n"; var emissivemap_fragment$1 = "#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$1 = "#ifdef USE_EMISSIVEMAP\n\tuniform sampler2D emissiveMap;\n#endif\n"; var encodings_fragment$1 = " gl_FragColor = linearToOutputTexel( gl_FragColor );\n"; var encodings_pars_fragment$1 = "\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$1 = "#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, flipNormal * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\tvec2 sampleUV;\n\t\tsampleUV.y = saturate( flipNormal * reflectVec.y * 0.5 + 0.5 );\n\t\tsampleUV.x = atan( flipNormal * reflectVec.z, flipNormal * reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\n\t\tvec4 envColor = texture2D( envMap, sampleUV );\n\t#elif defined( ENVMAP_TYPE_SPHERE )\n\t\tvec3 reflectView = flipNormal * 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$1 = "#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\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$1 = "#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$1 = "#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$1 = "\n#ifdef USE_FOG\nfogDepth = -mvPosition.z;\n#endif"; var fog_pars_vertex$1 = "#ifdef USE_FOG\n varying float fogDepth;\n#endif\n"; var fog_fragment$1 = "#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$1 = "#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$1 = "#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$1 = "#ifdef USE_LIGHTMAP\n\treflectedLight.indirectDiffuse += PI * texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n#endif\n"; var lightmap_pars_fragment$1 = "#ifdef USE_LIGHTMAP\n\tuniform sampler2D lightMap;\n\tuniform float lightMapIntensity;\n#endif"; var lights_lambert_vertex$1 = "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\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\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\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\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 = "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};\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 ltcMat;\tuniform sampler2D ltcMag;\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#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 = saturate( reflectVec.y * 0.5 + 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$1 = "BlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;\n"; var lights_phong_pars_fragment$1 = "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};\n#if NUM_RECT_AREA_LIGHTS > 0\n\tvoid RE_Direct_RectArea_BlinnPhong( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in BlinnPhongMaterial 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 = BlinnExponentToGGXRoughness( material.specularShininess );\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\tfloat norm = texture2D( ltcMag, uv ).a;\n\t\tvec4 t = texture2D( ltcMat, uv );\n\t\tmat3 mInv = mat3(\n\t\t\tvec3( 1, 0, t.y ),\n\t\t\tvec3( 0, t.z, 0 ),\n\t\t\tvec3( t.w, 0, t.x )\n\t\t);\n\t\treflectedLight.directSpecular += lightColor * material.specularColor * norm * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1 ), rectCoords );\n\t}\n#endif\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_Direct_RectArea\t\tRE_Direct_RectArea_BlinnPhong\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_BlinnPhong\n#define Material_LightProbeLOD( material )\t(0)\n"; var lights_physical_fragment$1 = "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$1 = "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\tfloat norm = texture2D( ltcMag, uv ).a;\n\t\tvec4 t = texture2D( ltcMat, uv );\n\t\tmat3 mInv = mat3(\n\t\t\tvec3( 1, 0, t.y ),\n\t\t\tvec3( 0, t.z, 0 ),\n\t\t\tvec3( t.w, 0, t.x )\n\t\t);\n\t\treflectedLight.directSpecular += lightColor * material.specularColor * norm * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1 ), 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_template = "\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\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 ] ) : 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\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\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\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#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 ( NUM_HEMI_LIGHTS > 0 )\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\t#if defined( USE_ENVMAP ) && defined( PHYSICAL ) && defined( ENVMAP_TYPE_CUBE_UV )\n\t\tirradiance += getLightProbeIndirectIrradiance( geometry, 8 );\n\t#endif\n\tRE_IndirectDiffuse( irradiance, geometry, material, reflectedLight );\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\tvec3 radiance = getLightProbeIndirectRadiance( geometry, Material_BlinnShininessExponent( material ), 8 );\n\t#ifndef STANDARD\n\t\tvec3 clearCoatRadiance = getLightProbeIndirectRadiance( geometry, Material_ClearCoat_BlinnShininessExponent( material ), 8 );\n\t#else\n\t\tvec3 clearCoatRadiance = vec3( 0.0 );\n\t#endif\n\tRE_IndirectSpecular( radiance, clearCoatRadiance, geometry, material, reflectedLight );\n#endif\n"; var logdepthbuf_fragment$1 = "#if defined(USE_LOGDEPTHBUF) && defined(USE_LOGDEPTHBUF_EXT)\n\tgl_FragDepthEXT = log2(vFragDepth) * logDepthBufFC * 0.5;\n#endif"; var logdepthbuf_pars_fragment$1 = "#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$1 = "#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$1 = "#ifdef USE_LOGDEPTHBUF\n\tgl_Position.z = log2(max( EPSILON, gl_Position.w + 1.0 )) * logDepthBufFC;\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvFragDepth = 1.0 + gl_Position.w;\n\t#else\n\t\tgl_Position.z = (gl_Position.z - 1.0) * gl_Position.w;\n\t#endif\n#endif\n"; var map_fragment$1 = "#ifdef USE_MAP\n\tvec4 texelColor = texture2D( map, vUv );\n\ttexelColor = mapTexelToLinear( texelColor );\n\tdiffuseColor *= texelColor;\n#endif\n"; var map_pars_fragment$1 = "#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif\n"; var map_particle_fragment$1 = "#ifdef USE_MAP\n\tvec4 mapTexel = texture2D( map, vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y ) * offsetRepeat.zw + offsetRepeat.xy );\n\tdiffuseColor *= mapTexelToLinear( mapTexel );\n#endif\n"; var map_particle_pars_fragment$1 = "#ifdef USE_MAP\n\tuniform vec4 offsetRepeat;\n\tuniform sampler2D map;\n#endif\n"; var metalnessmap_fragment$1 = "float metalnessFactor = metalness;\n#ifdef USE_METALNESSMAP\n\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\n\tmetalnessFactor *= texelMetalness.b;\n#endif\n"; var metalnessmap_pars_fragment$1 = "#ifdef USE_METALNESSMAP\n\tuniform sampler2D metalnessMap;\n#endif"; var morphnormal_vertex$1 = "#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$1 = "#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$1 = "#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_flip = "#ifdef DOUBLE_SIDED\n\tfloat flipNormal = ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n#else\n\tfloat flipNormal = 1.0;\n#endif\n"; var normal_fragment = "#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 ) * flipNormal;\n#endif\n#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$1 = "#ifdef USE_NORMALMAP\n\tuniform sampler2D normalMap;\n\tuniform vec2 normalScale;\n\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm ) {\n\t\tvec3 q0 = dFdx( eye_pos.xyz );\n\t\tvec3 q1 = dFdy( eye_pos.xyz );\n\t\tvec2 st0 = dFdx( vUv.st );\n\t\tvec2 st1 = dFdy( vUv.st );\n\t\tvec3 S = normalize( q0 * st1.t - q1 * st0.t );\n\t\tvec3 T = normalize( -q0 * st1.s + q1 * st0.s );\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$1 = "vec3 packNormalToRGB( const in vec3 normal ) {\n\treturn normalize( normal ) * 0.5 + 0.5;\n}\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n\treturn 1.0 - 2.0 * rgb.xyz;\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$1 = "#ifdef PREMULTIPLIED_ALPHA\n\tgl_FragColor.rgb *= gl_FragColor.a;\n#endif\n"; var project_vertex$1 = "#ifdef USE_SKINNING\n\tvec4 mvPosition = modelViewMatrix * skinned;\n#else\n\tvec4 mvPosition = modelViewMatrix * vec4( transformed, 1.0 );\n#endif\ngl_Position = projectionMatrix * mvPosition;\n"; var dithering_fragment$1 = "#if defined( DITHERING )\n gl_FragColor.rgb = dithering( gl_FragColor.rgb );\n#endif\n"; var dithering_pars_fragment$1 = "#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$1 = "float roughnessFactor = roughness;\n#ifdef USE_ROUGHNESSMAP\n\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\n\troughnessFactor *= texelRoughness.g;\n#endif\n"; var roughnessmap_pars_fragment$1 = "#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif"; var shadowmap_pars_fragment$1 = "#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\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\treturn (\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\treturn (\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\treturn texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#endif\n\t\t}\n\t\treturn 1.0;\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 ) {\n\t\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tvec3 bd3D = normalize( lightToPosition );\n\t\tfloat dp = ( length( lightToPosition ) - shadowBias ) / 1000.0;\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$1 = "#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$1 = "#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\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\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\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$1 = "float getShadowMask() {\n\tfloat shadow = 1.0;\n\t#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\tDirectionalLight directionalLight;\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\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\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 ] ) : 1.0;\n\t}\n\t#endif\n\t#endif\n\treturn shadow;\n}\n"; var skinbase_vertex$1 = "#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$1 = "#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$1 = "#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\tskinned = bindMatrixInverse * skinned;\n#endif\n"; var skinnormal_vertex$1 = "#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$1 = "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$1 = "#ifdef USE_SPECULARMAP\n\tuniform sampler2D specularMap;\n#endif"; var tonemapping_fragment$1 = "#if defined( TONE_MAPPING )\n gl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\n#endif\n"; var tonemapping_pars_fragment$1 = "#define saturate(a) clamp( a, 0.0, 1.0 )\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$1 = "#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$1 = "#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 vec4 offsetRepeat;\n#endif\n"; var uv_vertex$1 = "#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 = uv * offsetRepeat.zw + offsetRepeat.xy;\n#endif"; var uv2_pars_fragment$1 = "#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvarying vec2 vUv2;\n#endif"; var uv2_pars_vertex$1 = "#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tattribute vec2 uv2;\n\tvarying vec2 vUv2;\n#endif"; var uv2_vertex$1 = "#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvUv2 = uv2;\n#endif"; var worldpos_vertex$1 = "#if defined( USE_ENVMAP ) || defined( PHONG ) || defined( PHYSICAL ) || defined( LAMBERT ) || defined ( USE_SHADOWMAP )\n\t#ifdef USE_SKINNING\n\t\tvec4 worldPosition = modelMatrix * skinned;\n\t#else\n\t\tvec4 worldPosition = modelMatrix * vec4( transformed, 1.0 );\n\t#endif\n#endif\n"; var cube_frag$1 = "uniform samplerCube tCube;\nuniform float tFlip;\nuniform float opacity;\nvarying vec3 vWorldPosition;\n#include \nvoid main() {\n\tgl_FragColor = textureCube( tCube, vec3( tFlip * vWorldPosition.x, vWorldPosition.yz ) );\n\tgl_FragColor.a *= opacity;\n}\n"; var cube_vert$1 = "varying vec3 vWorldPosition;\n#include \nvoid main() {\n\tvWorldPosition = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n}\n"; var depth_frag$1 = "#if DEPTH_PACKING == 3200\n\tuniform float opacity;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( 1.0 );\n\t#if DEPTH_PACKING == 3200\n\t\tdiffuseColor.a = opacity;\n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#if DEPTH_PACKING == 3200\n\t\tgl_FragColor = vec4( vec3( 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$1 = "#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; var distanceRGBA_frag$1 = "uniform vec3 lightPos;\nvarying vec4 vWorldPosition;\n#include \n#include \n#include \nvoid main () {\n\t#include \n\tgl_FragColor = packDepthToRGBA( length( vWorldPosition.xyz - lightPos.xyz ) / 1000.0 );\n}\n"; var distanceRGBA_vert$1 = "varying vec4 vWorldPosition;\n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvWorldPosition = worldPosition;\n}\n"; var equirect_frag$1 = "uniform sampler2D tEquirect;\nuniform float tFlip;\nvarying vec3 vWorldPosition;\n#include \nvoid main() {\n\tvec3 direction = normalize( vWorldPosition );\n\tvec2 sampleUV;\n\tsampleUV.y = saturate( tFlip * direction.y * -0.5 + 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$1 = "varying vec3 vWorldPosition;\n#include \nvoid main() {\n\tvWorldPosition = transformDirection( position, modelMatrix );\n\t#include \n\t#include \n}\n"; var linedashed_frag$1 = "uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \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 \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; var linedashed_vert$1 = "uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvLineDistance = scale * lineDistance;\n\tvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include \n\t#include \n\t#include \n}\n"; var meshbasic_frag$1 = "uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \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 \n\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\t#include \n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; var meshbasic_vert$1 = "#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#ifdef USE_ENVMAP\n\t#include \n\t#include \n\t#include \n\t#include \n\t#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; var meshlambert_frag$1 = "uniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\nvarying vec3 vLightFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \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 \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\treflectedLight.indirectDiffuse = getAmbientLightIrradiance( ambientLightColor );\n\t#include \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 \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include \n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; var meshlambert_vert$1 = "#define LAMBERT\nvarying vec3 vLightFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; var meshphong_frag$1 = "#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \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 \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include \n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; var meshphong_vert$1 = "#define PHONG\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; var meshphysical_frag$1 = "#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 \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \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 \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; var meshphysical_vert$1 = "#define PHYSICAL\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\tvViewPosition = - mvPosition.xyz;\n\t#include \n\t#include \n\t#include \n}\n"; var normal_frag$1 = "#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 \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\n}\n"; var normal_vert$1 = "#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 \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n\t#include \n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n}\n"; var points_frag$1 = "uniform vec3 diffuse;\nuniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include \n\t#include \n\t#include \n\t#include \n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; var points_vert$1 = "uniform float size;\nuniform float scale;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\t#include \n\t#include \n\t#include \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 \n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; var shadow_frag$1 = "uniform float opacity;\n#include \n#include \n#include \n#include \n#include \n#include \nvoid main() {\n\tgl_FragColor = vec4( 0.0, 0.0, 0.0, opacity * ( 1.0 - getShadowMask() ) );\n}\n"; var shadow_vert$1 = "#include \nvoid main() {\n\t#include \n\t#include \n\t#include \n\t#include \n}\n"; var ShaderChunk$1 = { alphamap_fragment: alphamap_fragment$1, alphamap_pars_fragment: alphamap_pars_fragment$1, alphatest_fragment: alphatest_fragment$1, aomap_fragment: aomap_fragment$1, aomap_pars_fragment: aomap_pars_fragment$1, begin_vertex: begin_vertex$1, beginnormal_vertex: beginnormal_vertex$1, bsdfs: bsdfs$1, bumpmap_pars_fragment: bumpmap_pars_fragment$1, clipping_planes_fragment: clipping_planes_fragment$1, clipping_planes_pars_fragment: clipping_planes_pars_fragment$1, clipping_planes_pars_vertex: clipping_planes_pars_vertex$1, clipping_planes_vertex: clipping_planes_vertex$1, color_fragment: color_fragment$1, color_pars_fragment: color_pars_fragment$1, color_pars_vertex: color_pars_vertex$1, color_vertex: color_vertex$1, common: common$1, cube_uv_reflection_fragment: cube_uv_reflection_fragment$1, defaultnormal_vertex: defaultnormal_vertex$1, displacementmap_pars_vertex: displacementmap_pars_vertex$1, displacementmap_vertex: displacementmap_vertex$1, emissivemap_fragment: emissivemap_fragment$1, emissivemap_pars_fragment: emissivemap_pars_fragment$1, encodings_fragment: encodings_fragment$1, encodings_pars_fragment: encodings_pars_fragment$1, envmap_fragment: envmap_fragment$1, envmap_pars_fragment: envmap_pars_fragment$1, envmap_pars_vertex: envmap_pars_vertex$1, envmap_vertex: envmap_vertex$1, fog_vertex: fog_vertex$1, fog_pars_vertex: fog_pars_vertex$1, fog_fragment: fog_fragment$1, fog_pars_fragment: fog_pars_fragment$1, gradientmap_pars_fragment: gradientmap_pars_fragment$1, lightmap_fragment: lightmap_fragment$1, lightmap_pars_fragment: lightmap_pars_fragment$1, lights_lambert_vertex: lights_lambert_vertex$1, lights_pars: lights_pars, lights_phong_fragment: lights_phong_fragment$1, lights_phong_pars_fragment: lights_phong_pars_fragment$1, lights_physical_fragment: lights_physical_fragment$1, lights_physical_pars_fragment: lights_physical_pars_fragment$1, lights_template: lights_template, logdepthbuf_fragment: logdepthbuf_fragment$1, logdepthbuf_pars_fragment: logdepthbuf_pars_fragment$1, logdepthbuf_pars_vertex: logdepthbuf_pars_vertex$1, logdepthbuf_vertex: logdepthbuf_vertex$1, map_fragment: map_fragment$1, map_pars_fragment: map_pars_fragment$1, map_particle_fragment: map_particle_fragment$1, map_particle_pars_fragment: map_particle_pars_fragment$1, metalnessmap_fragment: metalnessmap_fragment$1, metalnessmap_pars_fragment: metalnessmap_pars_fragment$1, morphnormal_vertex: morphnormal_vertex$1, morphtarget_pars_vertex: morphtarget_pars_vertex$1, morphtarget_vertex: morphtarget_vertex$1, normal_flip: normal_flip, normal_fragment: normal_fragment, normalmap_pars_fragment: normalmap_pars_fragment$1, packing: packing$1, premultiplied_alpha_fragment: premultiplied_alpha_fragment$1, project_vertex: project_vertex$1, dithering_fragment: dithering_fragment$1, dithering_pars_fragment: dithering_pars_fragment$1, roughnessmap_fragment: roughnessmap_fragment$1, roughnessmap_pars_fragment: roughnessmap_pars_fragment$1, shadowmap_pars_fragment: shadowmap_pars_fragment$1, shadowmap_pars_vertex: shadowmap_pars_vertex$1, shadowmap_vertex: shadowmap_vertex$1, shadowmask_pars_fragment: shadowmask_pars_fragment$1, skinbase_vertex: skinbase_vertex$1, skinning_pars_vertex: skinning_pars_vertex$1, skinning_vertex: skinning_vertex$1, skinnormal_vertex: skinnormal_vertex$1, specularmap_fragment: specularmap_fragment$1, specularmap_pars_fragment: specularmap_pars_fragment$1, tonemapping_fragment: tonemapping_fragment$1, tonemapping_pars_fragment: tonemapping_pars_fragment$1, uv_pars_fragment: uv_pars_fragment$1, uv_pars_vertex: uv_pars_vertex$1, uv_vertex: uv_vertex$1, uv2_pars_fragment: uv2_pars_fragment$1, uv2_pars_vertex: uv2_pars_vertex$1, uv2_vertex: uv2_vertex$1, worldpos_vertex: worldpos_vertex$1, cube_frag: cube_frag$1, cube_vert: cube_vert$1, depth_frag: depth_frag$1, depth_vert: depth_vert$1, distanceRGBA_frag: distanceRGBA_frag$1, distanceRGBA_vert: distanceRGBA_vert$1, equirect_frag: equirect_frag$1, equirect_vert: equirect_vert$1, linedashed_frag: linedashed_frag$1, linedashed_vert: linedashed_vert$1, meshbasic_frag: meshbasic_frag$1, meshbasic_vert: meshbasic_vert$1, meshlambert_frag: meshlambert_frag$1, meshlambert_vert: meshlambert_vert$1, meshphong_frag: meshphong_frag$1, meshphong_vert: meshphong_vert$1, meshphysical_frag: meshphysical_frag$1, meshphysical_vert: meshphysical_vert$1, normal_frag: normal_frag$1, normal_vert: normal_vert$1, points_frag: points_frag$1, points_vert: points_vert$1, shadow_frag: shadow_frag$1, shadow_vert: shadow_vert$1 }; /** * @author alteredq / http://alteredqualia.com/ * @author mrdoob / http://mrdoob.com/ * @author mikael emtinger / http://gomo.se/ */ var ShaderLib$1 = { basic: { uniforms: UniformsUtils$1.merge( [ UniformsLib$1.common, UniformsLib$1.aomap, UniformsLib$1.lightmap, UniformsLib$1.fog ] ), vertexShader: ShaderChunk$1.meshbasic_vert, fragmentShader: ShaderChunk$1.meshbasic_frag }, lambert: { uniforms: UniformsUtils$1.merge( [ UniformsLib$1.common, UniformsLib$1.aomap, UniformsLib$1.lightmap, UniformsLib$1.emissivemap, UniformsLib$1.fog, UniformsLib$1.lights, { emissive: { value: new Color$1( 0x000000 ) } } ] ), vertexShader: ShaderChunk$1.meshlambert_vert, fragmentShader: ShaderChunk$1.meshlambert_frag }, phong: { uniforms: UniformsUtils$1.merge( [ UniformsLib$1.common, UniformsLib$1.aomap, UniformsLib$1.lightmap, UniformsLib$1.emissivemap, UniformsLib$1.bumpmap, UniformsLib$1.normalmap, UniformsLib$1.displacementmap, UniformsLib$1.gradientmap, UniformsLib$1.fog, UniformsLib$1.lights, { emissive: { value: new Color$1( 0x000000 ) }, specular: { value: new Color$1( 0x111111 ) }, shininess: { value: 30 } } ] ), vertexShader: ShaderChunk$1.meshphong_vert, fragmentShader: ShaderChunk$1.meshphong_frag }, standard: { uniforms: UniformsUtils$1.merge( [ UniformsLib$1.common, UniformsLib$1.aomap, UniformsLib$1.lightmap, UniformsLib$1.emissivemap, UniformsLib$1.bumpmap, UniformsLib$1.normalmap, UniformsLib$1.displacementmap, UniformsLib$1.roughnessmap, UniformsLib$1.metalnessmap, UniformsLib$1.fog, UniformsLib$1.lights, { emissive: { value: new Color$1( 0x000000 ) }, roughness: { value: 0.5 }, metalness: { value: 0.5 }, envMapIntensity: { value: 1 } // temporary } ] ), vertexShader: ShaderChunk$1.meshphysical_vert, fragmentShader: ShaderChunk$1.meshphysical_frag }, points: { uniforms: UniformsUtils$1.merge( [ UniformsLib$1.points, UniformsLib$1.fog ] ), vertexShader: ShaderChunk$1.points_vert, fragmentShader: ShaderChunk$1.points_frag }, dashed: { uniforms: UniformsUtils$1.merge( [ UniformsLib$1.common, UniformsLib$1.fog, { scale: { value: 1 }, dashSize: { value: 1 }, totalSize: { value: 2 } } ] ), vertexShader: ShaderChunk$1.linedashed_vert, fragmentShader: ShaderChunk$1.linedashed_frag }, depth: { uniforms: UniformsUtils$1.merge( [ UniformsLib$1.common, UniformsLib$1.displacementmap ] ), vertexShader: ShaderChunk$1.depth_vert, fragmentShader: ShaderChunk$1.depth_frag }, normal: { uniforms: UniformsUtils$1.merge( [ UniformsLib$1.common, UniformsLib$1.bumpmap, UniformsLib$1.normalmap, UniformsLib$1.displacementmap, { opacity: { value: 1.0 } } ] ), vertexShader: ShaderChunk$1.normal_vert, fragmentShader: ShaderChunk$1.normal_frag }, /* ------------------------------------------------------------------------- // Cube map shader ------------------------------------------------------------------------- */ cube: { uniforms: { tCube: { value: null }, tFlip: { value: - 1 }, opacity: { value: 1.0 } }, vertexShader: ShaderChunk$1.cube_vert, fragmentShader: ShaderChunk$1.cube_frag }, /* ------------------------------------------------------------------------- // Cube map shader ------------------------------------------------------------------------- */ equirect: { uniforms: { tEquirect: { value: null }, tFlip: { value: - 1 } }, vertexShader: ShaderChunk$1.equirect_vert, fragmentShader: ShaderChunk$1.equirect_frag }, distanceRGBA: { uniforms: { lightPos: { value: new Vector3$1() } }, vertexShader: ShaderChunk$1.distanceRGBA_vert, fragmentShader: ShaderChunk$1.distanceRGBA_frag } }; ShaderLib$1.physical = { uniforms: UniformsUtils$1.merge( [ ShaderLib$1.standard.uniforms, { clearCoat: { value: 0 }, clearCoatRoughness: { value: 0 } } ] ), vertexShader: ShaderChunk$1.meshphysical_vert, fragmentShader: ShaderChunk$1.meshphysical_frag }; /** * @author bhouston / http://clara.io */ function Box2$1( min, max ) { this.min = ( min !== undefined ) ? min : new Vector2$1( + Infinity, + Infinity ); this.max = ( max !== undefined ) ? max : new Vector2$1( - Infinity, - Infinity ); } Object.assign( Box2$1.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$1(); 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 ( optionalTarget ) { var result = optionalTarget || new Vector2$1(); return this.isEmpty() ? result.set( 0, 0 ) : result.addVectors( this.min, this.max ).multiplyScalar( 0.5 ); }, getSize: function ( optionalTarget ) { var result = optionalTarget || new Vector2$1(); return this.isEmpty() ? result.set( 0, 0 ) : result.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, optionalTarget ) { // This can potentially have a divide by zero if the box // has a size dimension of 0. var result = optionalTarget || new Vector2$1(); return result.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, optionalTarget ) { var result = optionalTarget || new Vector2$1(); return result.copy( point ).clamp( this.min, this.max ); }, distanceToPoint: function () { var v1 = new Vector2$1(); 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 mikael emtinger / http://gomo.se/ * @author alteredq / http://alteredqualia.com/ */ function LensFlarePlugin( renderer, flares ) { var gl = renderer.context; var state = renderer.state; var vertexBuffer, elementBuffer; var shader, program, attributes, uniforms; var tempTexture, occlusionTexture; function init() { var vertices = new Float32Array( [ - 1, - 1, 0, 0, 1, - 1, 1, 0, 1, 1, 1, 1, - 1, 1, 0, 1 ] ); var faces = new Uint16Array( [ 0, 1, 2, 0, 2, 3 ] ); // buffers 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 ); // textures tempTexture = gl.createTexture(); occlusionTexture = gl.createTexture(); state.bindTexture( gl.TEXTURE_2D, tempTexture ); gl.texImage2D( gl.TEXTURE_2D, 0, gl.RGB, 16, 16, 0, gl.RGB, gl.UNSIGNED_BYTE, null ); gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE ); gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE ); gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST ); gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST ); state.bindTexture( gl.TEXTURE_2D, occlusionTexture ); gl.texImage2D( gl.TEXTURE_2D, 0, gl.RGBA, 16, 16, 0, gl.RGBA, gl.UNSIGNED_BYTE, null ); gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE ); gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE ); gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST ); gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST ); shader = { vertexShader: [ "uniform lowp int renderType;", "uniform vec3 screenPosition;", "uniform vec2 scale;", "uniform float rotation;", "uniform sampler2D occlusionMap;", "attribute vec2 position;", "attribute vec2 uv;", "varying vec2 vUV;", "varying float vVisibility;", "void main() {", "vUV = uv;", "vec2 pos = position;", "if ( renderType == 2 ) {", "vec4 visibility = texture2D( occlusionMap, vec2( 0.1, 0.1 ) );", "visibility += texture2D( occlusionMap, vec2( 0.5, 0.1 ) );", "visibility += texture2D( occlusionMap, vec2( 0.9, 0.1 ) );", "visibility += texture2D( occlusionMap, vec2( 0.9, 0.5 ) );", "visibility += texture2D( occlusionMap, vec2( 0.9, 0.9 ) );", "visibility += texture2D( occlusionMap, vec2( 0.5, 0.9 ) );", "visibility += texture2D( occlusionMap, vec2( 0.1, 0.9 ) );", "visibility += texture2D( occlusionMap, vec2( 0.1, 0.5 ) );", "visibility += texture2D( occlusionMap, vec2( 0.5, 0.5 ) );", "vVisibility = visibility.r / 9.0;", "vVisibility *= 1.0 - visibility.g / 9.0;", "vVisibility *= visibility.b / 9.0;", "vVisibility *= 1.0 - visibility.a / 9.0;", "pos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;", "pos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;", "}", "gl_Position = vec4( ( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );", "}" ].join( "\n" ), fragmentShader: [ "uniform lowp int renderType;", "uniform sampler2D map;", "uniform float opacity;", "uniform vec3 color;", "varying vec2 vUV;", "varying float vVisibility;", "void main() {", // pink square "if ( renderType == 0 ) {", "gl_FragColor = vec4( 1.0, 0.0, 1.0, 0.0 );", // restore "} else if ( renderType == 1 ) {", "gl_FragColor = texture2D( map, vUV );", // flare "} else {", "vec4 texture = texture2D( map, vUV );", "texture.a *= opacity * vVisibility;", "gl_FragColor = texture;", "gl_FragColor.rgb *= color;", "}", "}" ].join( "\n" ) }; program = createProgram( shader ); attributes = { vertex: gl.getAttribLocation ( program, "position" ), uv: gl.getAttribLocation ( program, "uv" ) }; uniforms = { renderType: gl.getUniformLocation( program, "renderType" ), map: gl.getUniformLocation( program, "map" ), occlusionMap: gl.getUniformLocation( program, "occlusionMap" ), opacity: gl.getUniformLocation( program, "opacity" ), color: gl.getUniformLocation( program, "color" ), scale: gl.getUniformLocation( program, "scale" ), rotation: gl.getUniformLocation( program, "rotation" ), screenPosition: gl.getUniformLocation( program, "screenPosition" ) }; } /* * Render lens flares * Method: renders 16x16 0xff00ff-colored points scattered over the light source area, * reads these back and calculates occlusion. */ this.render = function ( scene, camera, viewport ) { if ( flares.length === 0 ) return; var tempPosition = new Vector3$1(); var invAspect = viewport.w / viewport.z, halfViewportWidth = viewport.z * 0.5, halfViewportHeight = viewport.w * 0.5; var size = 16 / viewport.w, scale = new Vector2$1( size * invAspect, size ); var screenPosition = new Vector3$1( 1, 1, 0 ), screenPositionPixels = new Vector2$1( 1, 1 ); var validArea = new Box2$1(); validArea.min.set( viewport.x, viewport.y ); validArea.max.set( viewport.x + ( viewport.z - 16 ), viewport.y + ( viewport.w - 16 ) ); if ( program === undefined ) { init(); } gl.useProgram( program ); state.initAttributes(); state.enableAttribute( attributes.vertex ); state.enableAttribute( attributes.uv ); state.disableUnusedAttributes(); // loop through all lens flares to update their occlusion and positions // setup gl and common used attribs/uniforms gl.uniform1i( uniforms.occlusionMap, 0 ); gl.uniform1i( uniforms.map, 1 ); gl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer ); gl.vertexAttribPointer( attributes.vertex, 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 ); state.disable( gl.CULL_FACE ); state.buffers.depth.setMask( false ); for ( var i = 0, l = flares.length; i < l; i ++ ) { size = 16 / viewport.w; scale.set( size * invAspect, size ); // calc object screen position var flare = flares[ i ]; tempPosition.set( flare.matrixWorld.elements[ 12 ], flare.matrixWorld.elements[ 13 ], flare.matrixWorld.elements[ 14 ] ); tempPosition.applyMatrix4( camera.matrixWorldInverse ); tempPosition.applyMatrix4( camera.projectionMatrix ); // setup arrays for gl programs screenPosition.copy( tempPosition ); // horizontal and vertical coordinate of the lower left corner of the pixels to copy screenPositionPixels.x = viewport.x + ( screenPosition.x * halfViewportWidth ) + halfViewportWidth - 8; screenPositionPixels.y = viewport.y + ( screenPosition.y * halfViewportHeight ) + halfViewportHeight - 8; // screen cull if ( validArea.containsPoint( screenPositionPixels ) === true ) { // save current RGB to temp texture state.activeTexture( gl.TEXTURE0 ); state.bindTexture( gl.TEXTURE_2D, null ); state.activeTexture( gl.TEXTURE1 ); state.bindTexture( gl.TEXTURE_2D, tempTexture ); gl.copyTexImage2D( gl.TEXTURE_2D, 0, gl.RGB, screenPositionPixels.x, screenPositionPixels.y, 16, 16, 0 ); // render pink quad gl.uniform1i( uniforms.renderType, 0 ); gl.uniform2f( uniforms.scale, scale.x, scale.y ); gl.uniform3f( uniforms.screenPosition, screenPosition.x, screenPosition.y, screenPosition.z ); state.disable( gl.BLEND ); state.enable( gl.DEPTH_TEST ); gl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 ); // copy result to occlusionMap state.activeTexture( gl.TEXTURE0 ); state.bindTexture( gl.TEXTURE_2D, occlusionTexture ); gl.copyTexImage2D( gl.TEXTURE_2D, 0, gl.RGBA, screenPositionPixels.x, screenPositionPixels.y, 16, 16, 0 ); // restore graphics gl.uniform1i( uniforms.renderType, 1 ); state.disable( gl.DEPTH_TEST ); state.activeTexture( gl.TEXTURE1 ); state.bindTexture( gl.TEXTURE_2D, tempTexture ); gl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 ); // update object positions flare.positionScreen.copy( screenPosition ); if ( flare.customUpdateCallback ) { flare.customUpdateCallback( flare ); } else { flare.updateLensFlares(); } // render flares gl.uniform1i( uniforms.renderType, 2 ); state.enable( gl.BLEND ); for ( var j = 0, jl = flare.lensFlares.length; j < jl; j ++ ) { var sprite = flare.lensFlares[ j ]; if ( sprite.opacity > 0.001 && sprite.scale > 0.001 ) { screenPosition.x = sprite.x; screenPosition.y = sprite.y; screenPosition.z = sprite.z; size = sprite.size * sprite.scale / viewport.w; scale.x = size * invAspect; scale.y = size; gl.uniform3f( uniforms.screenPosition, screenPosition.x, screenPosition.y, screenPosition.z ); gl.uniform2f( uniforms.scale, scale.x, scale.y ); gl.uniform1f( uniforms.rotation, sprite.rotation ); gl.uniform1f( uniforms.opacity, sprite.opacity ); gl.uniform3f( uniforms.color, sprite.color.r, sprite.color.g, sprite.color.b ); state.setBlending( sprite.blending, sprite.blendEquation, sprite.blendSrc, sprite.blendDst ); renderer.setTexture2D( sprite.texture, 1 ); gl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 ); } } } } // restore gl state.enable( gl.CULL_FACE ); state.enable( gl.DEPTH_TEST ); state.buffers.depth.setMask( true ); renderer.resetGLState(); }; function createProgram( shader ) { var program = gl.createProgram(); var fragmentShader = gl.createShader( gl.FRAGMENT_SHADER ); var vertexShader = gl.createShader( gl.VERTEX_SHADER ); var prefix = "precision " + renderer.getPrecision() + " float;\n"; gl.shaderSource( fragmentShader, prefix + shader.fragmentShader ); gl.shaderSource( vertexShader, prefix + shader.vertexShader ); gl.compileShader( fragmentShader ); gl.compileShader( vertexShader ); gl.attachShader( program, fragmentShader ); gl.attachShader( program, vertexShader ); gl.linkProgram( program ); return program; } } /** * @author mikael emtinger / http://gomo.se/ * @author alteredq / http://alteredqualia.com/ */ function SpritePlugin( renderer, sprites ) { var gl = renderer.context; var state = renderer.state; var vertexBuffer, elementBuffer; var program, attributes, uniforms; var texture; // decompose matrixWorld var spritePosition = new Vector3$1(); var spriteRotation = new Quaternion$1(); var spriteScale = new Vector3$1(); 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' ), 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' ), 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 Texture$1( canvas ); texture.needsUpdate = true; } this.render = function ( scene, camera ) { if ( sprites.length === 0 ) return; // setup gl if ( program === undefined ) { init(); } gl.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 = []; for ( var i = 0, l = sprites.length; i < l; i ++ ) { var sprite = sprites[ i ]; var material = sprite.material; if ( material.visible === false ) continue; 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; 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.scale, scale ); state.setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst ); state.buffers.depth.setTest( material.depthTest ); state.buffers.depth.setMask( material.depthWrite ); if ( material.map ) { renderer.setTexture2D( material.map, 0 ); } else { renderer.setTexture2D( texture, 0 ); } gl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 ); } // restore gl state.enable( gl.CULL_FACE ); renderer.resetGLState(); }; function createProgram() { var program = gl.createProgram(); var vertexShader = gl.createShader( gl.VERTEX_SHADER ); var fragmentShader = gl.createShader( gl.FRAGMENT_SHADER ); gl.shaderSource( vertexShader, [ 'precision ' + renderer.getPrecision() + ' float;', 'uniform mat4 modelViewMatrix;', 'uniform mat4 projectionMatrix;', 'uniform float rotation;', 'uniform vec2 scale;', 'uniform vec2 uvOffset;', 'uniform vec2 uvScale;', 'attribute vec2 position;', 'attribute vec2 uv;', 'varying vec2 vUV;', 'void main() {', 'vUV = uvOffset + uv * uvScale;', 'vec2 alignedPosition = position * scale;', 'vec2 rotatedPosition;', 'rotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;', 'rotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;', 'vec4 finalPosition;', 'finalPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );', 'finalPosition.xy += rotatedPosition;', 'finalPosition = projectionMatrix * finalPosition;', 'gl_Position = finalPosition;', '}' ].join( '\n' ) ); gl.shaderSource( fragmentShader, [ 'precision ' + renderer.getPrecision() + ' float;', '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;', 'void main() {', 'vec4 texture = texture2D( map, vUV );', 'if ( texture.a < alphaTest ) discard;', 'gl_FragColor = vec4( color * texture.xyz, texture.a * opacity );', 'if ( fogType > 0 ) {', 'float depth = gl_FragCoord.z / gl_FragCoord.w;', 'float fogFactor = 0.0;', 'if ( fogType == 1 ) {', 'fogFactor = smoothstep( fogNear, fogFar, depth );', '} else {', 'const float LOG2 = 1.442695;', 'fogFactor = exp2( - fogDensity * fogDensity * depth * depth * LOG2 );', 'fogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );', '}', 'gl_FragColor = mix( gl_FragColor, vec4( fogColor, gl_FragColor.w ), 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/ * @author alteredq / http://alteredqualia.com/ */ var materialId$1 = 0; function Material$1() { Object.defineProperty( this, 'id', { value: materialId$1 ++ } ); this.uuid = _Math$1.generateUUID(); this.name = ''; this.type = 'Material'; this.fog = true; this.lights = true; this.blending = NormalBlending$1; this.side = FrontSide$1; this.shading = SmoothShading; // THREE.FlatShading, THREE.SmoothShading this.vertexColors = NoColors$1; // THREE.NoColors, THREE.VertexColors, THREE.FaceColors this.opacity = 1; this.transparent = false; this.blendSrc = SrcAlphaFactor$1; this.blendDst = OneMinusSrcAlphaFactor$1; this.blendEquation = AddEquation$1; this.blendSrcAlpha = null; this.blendDstAlpha = null; this.blendEquationAlpha = null; this.depthFunc = LessEqualDepth$1; this.depthTest = true; this.depthWrite = true; this.clippingPlanes = null; this.clipIntersection = false; this.clipShadows = false; 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.needsUpdate = true; } Object.assign( Material$1.prototype, EventDispatcher$1.prototype, { isMaterial: true, 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; } 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; 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.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$1 ) data.blending = this.blending; if ( this.shading !== SmoothShading ) data.shading = this.shading; if ( this.side !== FrontSide$1 ) data.side = this.side; if ( this.vertexColors !== NoColors$1 ) 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; 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; data.skinning = this.skinning; data.morphTargets = this.morphTargets; data.dithering = this.dithering; // 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.shading = source.shading; 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.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; return this; }, dispose: function () { this.dispatchEvent( { type: 'dispose' } ); } } ); /** * @author alteredq / http://alteredqualia.com/ * * parameters = { * defines: { "label" : "value" }, * uniforms: { "parameter1": { value: 1.0 }, "parameter2": { value2: 2 } }, * * fragmentShader: , * vertexShader: , * * wireframe: , * wireframeLinewidth: , * * lights: , * * skinning: , * morphTargets: , * morphNormals: * } */ function ShaderMaterial$1( parameters ) { Material$1.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; if ( parameters !== undefined ) { if ( parameters.attributes !== undefined ) { console.error( 'THREE.ShaderMaterial: attributes should now be defined in THREE.BufferGeometry instead.' ); } this.setValues( parameters ); } } ShaderMaterial$1.prototype = Object.create( Material$1.prototype ); ShaderMaterial$1.prototype.constructor = ShaderMaterial$1; ShaderMaterial$1.prototype.isShaderMaterial = true; ShaderMaterial$1.prototype.copy = function ( source ) { Material$1.prototype.copy.call( this, source ); this.fragmentShader = source.fragmentShader; this.vertexShader = source.vertexShader; this.uniforms = UniformsUtils$1.clone( source.uniforms ); this.defines = 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$1.prototype.toJSON = function ( meta ) { var data = Material$1.prototype.toJSON.call( this, meta ); data.uniforms = this.uniforms; data.vertexShader = this.vertexShader; data.fragmentShader = this.fragmentShader; return data; }; /** * @author mrdoob / http://mrdoob.com/ * @author alteredq / http://alteredqualia.com/ * @author bhouston / https://clara.io * @author WestLangley / http://github.com/WestLangley * * parameters = { * * opacity: , * * map: new THREE.Texture( ), * * alphaMap: new THREE.Texture( ), * * displacementMap: new THREE.Texture( ), * displacementScale: , * displacementBias: , * * wireframe: , * wireframeLinewidth: * } */ function MeshDepthMaterial$1( parameters ) { Material$1.call( this ); this.type = 'MeshDepthMaterial'; this.depthPacking = BasicDepthPacking$1; 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$1.prototype = Object.create( Material$1.prototype ); MeshDepthMaterial$1.prototype.constructor = MeshDepthMaterial$1; MeshDepthMaterial$1.prototype.isMeshDepthMaterial = true; MeshDepthMaterial$1.prototype.copy = function ( source ) { Material$1.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 bhouston / http://clara.io * @author WestLangley / http://github.com/WestLangley */ function Box3$1( min, max ) { this.min = ( min !== undefined ) ? min : new Vector3$1( + Infinity, + Infinity, + Infinity ); this.max = ( max !== undefined ) ? max : new Vector3$1( - Infinity, - Infinity, - Infinity ); } Object.assign( Box3$1.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$1(); 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 ( optionalTarget ) { var result = optionalTarget || new Vector3$1(); return this.isEmpty() ? result.set( 0, 0, 0 ) : result.addVectors( this.min, this.max ).multiplyScalar( 0.5 ); }, getSize: function ( optionalTarget ) { var result = optionalTarget || new Vector3$1(); return this.isEmpty() ? result.set( 0, 0, 0 ) : result.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 v1 = new Vector3$1(); return function expandByObject( object ) { var scope = this; object.updateMatrixWorld( true ); object.traverse( function ( node ) { var i, l; 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 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, optionalTarget ) { // This can potentially have a divide by zero if the box // has a size dimension of 0. var result = optionalTarget || new Vector3$1(); return result.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$1(); 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 ); }, clampPoint: function ( point, optionalTarget ) { var result = optionalTarget || new Vector3$1(); return result.copy( point ).clamp( this.min, this.max ); }, distanceToPoint: function () { var v1 = new Vector3$1(); 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$1(); return function getBoundingSphere( optionalTarget ) { var result = optionalTarget || new Sphere$2(); this.getCenter( result.center ); result.radius = this.getSize( v1 ).length() * 0.5; return result; }; }(), 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$1(), new Vector3$1(), new Vector3$1(), new Vector3$1(), new Vector3$1(), new Vector3$1(), new Vector3$1(), new Vector3$1() ]; 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$2( center, radius ) { this.center = ( center !== undefined ) ? center : new Vector3$1(); this.radius = ( radius !== undefined ) ? radius : 0; } Object.assign( Sphere$2.prototype, { set: function ( center, radius ) { this.center.copy( center ); this.radius = radius; return this; }, setFromPoints: function () { var box = new Box3$1(); 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 ) { // We use the following equation to compute the signed distance from // the center of the sphere to the plane. // // distance = q * n - d // // If this distance is greater than the radius of the sphere, // then there is no intersection. return Math.abs( this.center.dot( plane.normal ) - plane.constant ) <= this.radius; }, clampPoint: function ( point, optionalTarget ) { var deltaLengthSq = this.center.distanceToSquared( point ); var result = optionalTarget || new Vector3$1(); result.copy( point ); if ( deltaLengthSq > ( this.radius * this.radius ) ) { result.sub( this.center ).normalize(); result.multiplyScalar( this.radius ).add( this.center ); } return result; }, getBoundingBox: function ( optionalTarget ) { var box = optionalTarget || new Box3$1(); box.set( this.center, this.center ); box.expandByScalar( this.radius ); return box; }, 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 alteredq / http://alteredqualia.com/ * @author WestLangley / http://github.com/WestLangley * @author bhouston / http://clara.io * @author tschw */ function Matrix3$1() { 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$1.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$1(); 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; }, 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 bhouston / http://clara.io */ function Plane$2( normal, constant ) { this.normal = ( normal !== undefined ) ? normal : new Vector3$1( 1, 0, 0 ); this.constant = ( constant !== undefined ) ? constant : 0; } Object.assign( Plane$2.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 ); // must be this.normal, not normal, as this.normal is normalized return this; }, setFromCoplanarPoints: function () { var v1 = new Vector3$1(); var v2 = new Vector3$1(); 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, optionalTarget ) { return this.orthoPoint( point, optionalTarget ).sub( point ).negate(); }, orthoPoint: function ( point, optionalTarget ) { var perpendicularMagnitude = this.distanceToPoint( point ); var result = optionalTarget || new Vector3$1(); return result.copy( this.normal ).multiplyScalar( perpendicularMagnitude ); }, intersectLine: function () { var v1 = new Vector3$1(); return function intersectLine( line, optionalTarget ) { var result = optionalTarget || new Vector3$1(); 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 result.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 result.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 ( optionalTarget ) { var result = optionalTarget || new Vector3$1(); return result.copy( this.normal ).multiplyScalar( - this.constant ); }, applyMatrix4: function () { var v1 = new Vector3$1(); var m1 = new Matrix3$1(); return function applyMatrix4( matrix, optionalNormalMatrix ) { var referencePoint = this.coplanarPoint( v1 ).applyMatrix4( matrix ); // transform normal based on theory here: // http://www.songho.ca/opengl/gl_normaltransform.html var normalMatrix = optionalNormalMatrix || m1.getNormalMatrix( matrix ); var normal = this.normal.applyMatrix3( normalMatrix ).normalize(); // recalculate constant (like in setFromNormalAndCoplanarPoint) this.constant = - referencePoint.dot( normal ); return this; }; }(), translate: function ( offset ) { this.constant = 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$1( p0, p1, p2, p3, p4, p5 ) { this.planes = [ ( p0 !== undefined ) ? p0 : new Plane$2(), ( p1 !== undefined ) ? p1 : new Plane$2(), ( p2 !== undefined ) ? p2 : new Plane$2(), ( p3 !== undefined ) ? p3 : new Plane$2(), ( p4 !== undefined ) ? p4 : new Plane$2(), ( p5 !== undefined ) ? p5 : new Plane$2() ]; } Object.assign( Frustum$1.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$2(); 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$2(); 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$1(), p2 = new Vector3$1(); 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; } } ); /** * @author alteredq / http://alteredqualia.com/ * @author mrdoob / http://mrdoob.com/ */ function WebGLShadowMap$1( _renderer, _lights, _objects, capabilities ) { var _gl = _renderer.context, _state = _renderer.state, _frustum = new Frustum$1(), _projScreenMatrix = new Matrix4$1(), _lightShadows = _lights.shadows, _shadowMapSize = new Vector2$1(), _maxShadowMapSize = new Vector2$1( capabilities.maxTextureSize, capabilities.maxTextureSize ), _lookTarget = new Vector3$1(), _lightPositionWorld = new Vector3$1(), _MorphingFlag = 1, _SkinningFlag = 2, _NumberOfMaterialVariants = ( _MorphingFlag | _SkinningFlag ) + 1, _depthMaterials = new Array( _NumberOfMaterialVariants ), _distanceMaterials = new Array( _NumberOfMaterialVariants ), _materialCache = {}; var cubeDirections = [ new Vector3$1( 1, 0, 0 ), new Vector3$1( - 1, 0, 0 ), new Vector3$1( 0, 0, 1 ), new Vector3$1( 0, 0, - 1 ), new Vector3$1( 0, 1, 0 ), new Vector3$1( 0, - 1, 0 ) ]; var cubeUps = [ new Vector3$1( 0, 1, 0 ), new Vector3$1( 0, 1, 0 ), new Vector3$1( 0, 1, 0 ), new Vector3$1( 0, 1, 0 ), new Vector3$1( 0, 0, 1 ), new Vector3$1( 0, 0, - 1 ) ]; var cube2DViewPorts = [ new Vector4$1(), new Vector4$1(), new Vector4$1(), new Vector4$1(), new Vector4$1(), new Vector4$1() ]; // init var depthMaterialTemplate = new MeshDepthMaterial$1(); depthMaterialTemplate.depthPacking = RGBADepthPacking$1; depthMaterialTemplate.clipping = true; var distanceShader = ShaderLib$1[ "distanceRGBA" ]; var distanceUniforms = UniformsUtils$1.clone( distanceShader.uniforms ); for ( var i = 0; i !== _NumberOfMaterialVariants; ++ i ) { var useMorphing = ( i & _MorphingFlag ) !== 0; var useSkinning = ( i & _SkinningFlag ) !== 0; var depthMaterial = depthMaterialTemplate.clone(); depthMaterial.morphTargets = useMorphing; depthMaterial.skinning = useSkinning; _depthMaterials[ i ] = depthMaterial; var distanceMaterial = new ShaderMaterial$1( { defines: { 'USE_SHADOWMAP': '' }, uniforms: distanceUniforms, vertexShader: distanceShader.vertexShader, fragmentShader: distanceShader.fragmentShader, morphTargets: useMorphing, skinning: useSkinning, clipping: true } ); _distanceMaterials[ i ] = distanceMaterial; } // var scope = this; this.enabled = false; this.autoUpdate = true; this.needsUpdate = false; this.type = PCFShadowMap$1; this.renderReverseSided = true; this.renderSingleSided = true; this.render = function ( scene, camera ) { if ( scope.enabled === false ) return; if ( scope.autoUpdate === false && scope.needsUpdate === false ) return; if ( _lightShadows.length === 0 ) return; // 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, isPointLight; for ( var i = 0, il = _lightShadows.length; i < il; i ++ ) { var light = _lightShadows[ i ]; var shadow = light.shadow; if ( shadow === undefined ) { console.warn( 'THREE.WebGLShadowMap:', light, 'has no shadow.' ); continue; } var shadowCamera = shadow.camera; var shadowMatrix = shadow.matrix; _lightPositionWorld.setFromMatrixPosition( light.matrixWorld ); shadowCamera.position.copy( _lightPositionWorld ); _shadowMapSize.copy( shadow.mapSize ); _shadowMapSize.min( _maxShadowMapSize ); if ( light && light.isPointLight ) { faceCount = 6; isPointLight = true; 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; // 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; isPointLight = false; _lookTarget.setFromMatrixPosition( light.target.matrixWorld ); shadowCamera.lookAt( _lookTarget ); shadowCamera.updateMatrixWorld(); shadowCamera.matrixWorldInverse.getInverse( shadowCamera.matrixWorld ); // 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 ); } if ( shadow.map === null ) { var pars = { minFilter: NearestFilter$1, magFilter: NearestFilter$1, format: RGBAFormat$1 }; shadow.map = new WebGLRenderTarget$1( _shadowMapSize.x, _shadowMapSize.y, pars ); shadow.map.texture.name = light.name + ".shadowMap"; shadowCamera.updateProjectionMatrix(); } if ( shadow.isSpotLightShadow ) { shadow.update( light ); } var shadowMap = shadow.map; _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(); shadowCamera.matrixWorldInverse.getInverse( shadowCamera.matrixWorld ); 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 ); } } // Restore GL state. var clearColor = _renderer.getClearColor(); var clearAlpha = _renderer.getClearAlpha(); _renderer.setClearColor( clearColor, clearAlpha ); scope.needsUpdate = false; }; function getDepthMaterial( object, material, isPointLight, lightPositionWorld ) { 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; var side = material.side; if ( scope.renderSingleSided && side == DoubleSide$1 ) { side = FrontSide$1; } if ( scope.renderReverseSided ) { if ( side === FrontSide$1 ) side = BackSide$1; else if ( side === BackSide$1 ) side = FrontSide$1; } result.side = side; result.clipShadows = material.clipShadows; result.clippingPlanes = material.clippingPlanes; result.wireframeLinewidth = material.wireframeLinewidth; result.linewidth = material.linewidth; if ( isPointLight && result.uniforms.lightPos !== undefined ) { result.uniforms.lightPos.value.copy( lightPositionWorld ); } 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 ); _renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, group ); } } } else if ( material.visible ) { var depthMaterial = getDepthMaterial( object, material, isPointLight, _lightPositionWorld ); _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 bhouston / http://clara.io */ function Ray$1( origin, direction ) { this.origin = ( origin !== undefined ) ? origin : new Vector3$1(); this.direction = ( direction !== undefined ) ? direction : new Vector3$1(); } Object.assign( Ray$1.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, optionalTarget ) { var result = optionalTarget || new Vector3$1(); return result.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$1(); return function recast( t ) { this.origin.copy( this.at( t, v1 ) ); return this; }; }(), closestPointToPoint: function ( point, optionalTarget ) { var result = optionalTarget || new Vector3$1(); result.subVectors( point, this.origin ); var directionDistance = result.dot( this.direction ); if ( directionDistance < 0 ) { return result.copy( this.origin ); } return result.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin ); }, distanceToPoint: function ( point ) { return Math.sqrt( this.distanceSqToPoint( point ) ); }, distanceSqToPoint: function () { var v1 = new Vector3$1(); 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$1(); var segDir = new Vector3$1(); var diff = new Vector3$1(); 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$1(); return function intersectSphere( sphere, optionalTarget ) { 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, optionalTarget ); // else t0 is in front of the ray, so return the first collision point scaled by t0 return this.at( t0, optionalTarget ); }; }(), 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, optionalTarget ) { var t = this.distanceToPlane( plane ); if ( t === null ) { return null; } return this.at( t, optionalTarget ); }, 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, optionalTarget ) { 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, optionalTarget ); }, intersectsBox: ( function () { var v = new Vector3$1(); return function intersectsBox( box ) { return this.intersectBox( box, v ) !== null; }; } )(), intersectTriangle: function () { // Compute the offset origin, edges, and normal. var diff = new Vector3$1(); var edge1 = new Vector3$1(); var edge2 = new Vector3$1(); var normal = new Vector3$1(); return function intersectTriangle( a, b, c, backfaceCulling, optionalTarget ) { // 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, optionalTarget ); }; }(), applyMatrix4: function ( matrix4 ) { this.direction.add( this.origin ).applyMatrix4( matrix4 ); this.origin.applyMatrix4( matrix4 ); this.direction.sub( this.origin ); this.direction.normalize(); return this; }, equals: function ( ray ) { return ray.origin.equals( this.origin ) && ray.direction.equals( this.direction ); } } ); /** * @author mrdoob / http://mrdoob.com/ * @author WestLangley / http://github.com/WestLangley * @author bhouston / http://clara.io */ function Euler$1( x, y, z, order ) { this._x = x || 0; this._y = y || 0; this._z = z || 0; this._order = order || Euler$1.DefaultOrder; } Euler$1.RotationOrders = [ 'XYZ', 'YZX', 'ZXY', 'XZY', 'YXZ', 'ZYX' ]; Euler$1.DefaultOrder = 'XYZ'; Object.defineProperties( Euler$1.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$1.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$1.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$1(); 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$1(); 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$1( this._x, this._y, this._z ); } }, onChange: function ( callback ) { this.onChangeCallback = callback; return this; }, onChangeCallback: function () {} } ); /** * @author mrdoob / http://mrdoob.com/ */ function Layers$1() { this.mask = 1 | 0; } Object.assign( Layers$1.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$1 = 0; function Object3D$1() { Object.defineProperty( this, 'id', { value: object3DId$1 ++ } ); this.uuid = _Math$1.generateUUID(); this.name = ''; this.type = 'Object3D'; this.parent = null; this.children = []; this.up = Object3D$1.DefaultUp.clone(); var position = new Vector3$1(); var rotation = new Euler$1(); var quaternion = new Quaternion$1(); var scale = new Vector3$1( 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$1() }, normalMatrix: { value: new Matrix3$1() } } ); this.matrix = new Matrix4$1(); this.matrixWorld = new Matrix4$1(); this.matrixAutoUpdate = Object3D$1.DefaultMatrixAutoUpdate; this.matrixWorldNeedsUpdate = false; this.layers = new Layers$1(); this.visible = true; this.castShadow = false; this.receiveShadow = false; this.frustumCulled = true; this.renderOrder = 0; this.userData = {}; this.onBeforeRender = function () {}; this.onAfterRender = function () {}; } Object3D$1.DefaultUp = new Vector3$1( 0, 1, 0 ); Object3D$1.DefaultMatrixAutoUpdate = true; Object.assign( Object3D$1.prototype, EventDispatcher$1.prototype, { isObject3D: true, applyMatrix: function ( matrix ) { this.matrix.multiplyMatrices( matrix, this.matrix ); this.matrix.decompose( this.position, this.quaternion, this.scale ); }, 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$1(); return function rotateOnAxis( axis, angle ) { q1.setFromAxisAngle( axis, angle ); this.quaternion.multiply( q1 ); return this; }; }(), rotateX: function () { var v1 = new Vector3$1( 1, 0, 0 ); return function rotateX( angle ) { return this.rotateOnAxis( v1, angle ); }; }(), rotateY: function () { var v1 = new Vector3$1( 0, 1, 0 ); return function rotateY( angle ) { return this.rotateOnAxis( v1, angle ); }; }(), rotateZ: function () { var v1 = new Vector3$1( 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$1(); 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( 1, 0, 0 ); return function translateX( distance ) { return this.translateOnAxis( v1, distance ); }; }(), translateY: function () { var v1 = new Vector3$1( 0, 1, 0 ); return function translateY( distance ) { return this.translateOnAxis( v1, distance ); }; }(), translateZ: function () { var v1 = new Vector3$1( 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$1(); return function worldToLocal( vector ) { return vector.applyMatrix4( m1.getInverse( this.matrixWorld ) ); }; }(), lookAt: function () { // This routine does not support objects with rotated and/or translated parent(s) var m1 = new Matrix4$1(); return function lookAt( vector ) { 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 ] ); } } var index = this.children.indexOf( object ); if ( index !== - 1 ) { object.parent = null; object.dispatchEvent( { type: 'removed' } ); this.children.splice( index, 1 ); } }, 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 ( optionalTarget ) { var result = optionalTarget || new Vector3$1(); this.updateMatrixWorld( true ); return result.setFromMatrixPosition( this.matrixWorld ); }, getWorldQuaternion: function () { var position = new Vector3$1(); var scale = new Vector3$1(); return function getWorldQuaternion( optionalTarget ) { var result = optionalTarget || new Quaternion$1(); this.updateMatrixWorld( true ); this.matrixWorld.decompose( position, result, scale ); return result; }; }(), getWorldRotation: function () { var quaternion = new Quaternion$1(); return function getWorldRotation( optionalTarget ) { var result = optionalTarget || new Euler$1(); this.getWorldQuaternion( quaternion ); return result.setFromQuaternion( quaternion, this.rotation.order, false ); }; }(), getWorldScale: function () { var position = new Vector3$1(); var quaternion = new Quaternion$1(); return function getWorldScale( optionalTarget ) { var result = optionalTarget || new Vector3$1(); this.updateMatrixWorld( true ); this.matrixWorld.decompose( position, quaternion, result ); return result; }; }(), getWorldDirection: function () { var quaternion = new Quaternion$1(); return function getWorldDirection( optionalTarget ) { var result = optionalTarget || new Vector3$1(); this.getWorldQuaternion( quaternion ); return result.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 '' when called from JSON.stringify var isRootObject = ( meta === undefined || meta === '' ); 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: {} }; 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 ( JSON.stringify( this.userData ) !== '{}' ) object.userData = this.userData; if ( this.castShadow === true ) object.castShadow = true; if ( this.receiveShadow === true ) object.receiveShadow = true; if ( this.visible === false ) object.visible = false; object.matrix = this.matrix.toArray(); // 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 ); } 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 ); 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; } 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 bhouston / http://clara.io */ function Line3$1( start, end ) { this.start = ( start !== undefined ) ? start : new Vector3$1(); this.end = ( end !== undefined ) ? end : new Vector3$1(); } Object.assign( Line3$1.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 ( optionalTarget ) { var result = optionalTarget || new Vector3$1(); return result.addVectors( this.start, this.end ).multiplyScalar( 0.5 ); }, delta: function ( optionalTarget ) { var result = optionalTarget || new Vector3$1(); return result.subVectors( this.end, this.start ); }, distanceSq: function () { return this.start.distanceToSquared( this.end ); }, distance: function () { return this.start.distanceTo( this.end ); }, at: function ( t, optionalTarget ) { var result = optionalTarget || new Vector3$1(); return this.delta( result ).multiplyScalar( t ).add( this.start ); }, closestPointToPointParameter: function () { var startP = new Vector3$1(); var startEnd = new Vector3$1(); 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$1.clamp( t, 0, 1 ); } return t; }; }(), closestPointToPoint: function ( point, clampToLine, optionalTarget ) { var t = this.closestPointToPointParameter( point, clampToLine ); var result = optionalTarget || new Vector3$1(); return this.delta( result ).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$1( a, b, c ) { this.a = ( a !== undefined ) ? a : new Vector3$1(); this.b = ( b !== undefined ) ? b : new Vector3$1(); this.c = ( c !== undefined ) ? c : new Vector3$1(); } Object.assign( Triangle$1, { normal: function () { var v0 = new Vector3$1(); return function normal( a, b, c, optionalTarget ) { var result = optionalTarget || new Vector3$1(); result.subVectors( c, b ); v0.subVectors( a, b ); result.cross( v0 ); var resultLengthSq = result.lengthSq(); if ( resultLengthSq > 0 ) { return result.multiplyScalar( 1 / Math.sqrt( resultLengthSq ) ); } return result.set( 0, 0, 0 ); }; }(), // static/instance method to calculate barycentric coordinates // based on: http://www.blackpawn.com/texts/pointinpoly/default.html barycoordFromPoint: function () { var v0 = new Vector3$1(); var v1 = new Vector3$1(); var v2 = new Vector3$1(); return function barycoordFromPoint( point, a, b, c, optionalTarget ) { 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 ); var result = optionalTarget || new Vector3$1(); // 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 result.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 result.set( 1 - u - v, v, u ); }; }(), containsPoint: function () { var v1 = new Vector3$1(); return function containsPoint( point, a, b, c ) { var result = Triangle$1.barycoordFromPoint( point, a, b, c, v1 ); return ( result.x >= 0 ) && ( result.y >= 0 ) && ( ( result.x + result.y ) <= 1 ); }; }() } ); Object.assign( Triangle$1.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; }, area: function () { var v0 = new Vector3$1(); var v1 = new Vector3$1(); return function area() { v0.subVectors( this.c, this.b ); v1.subVectors( this.a, this.b ); return v0.cross( v1 ).length() * 0.5; }; }(), midpoint: function ( optionalTarget ) { var result = optionalTarget || new Vector3$1(); return result.addVectors( this.a, this.b ).add( this.c ).multiplyScalar( 1 / 3 ); }, normal: function ( optionalTarget ) { return Triangle$1.normal( this.a, this.b, this.c, optionalTarget ); }, plane: function ( optionalTarget ) { var result = optionalTarget || new Plane$2(); return result.setFromCoplanarPoints( this.a, this.b, this.c ); }, barycoordFromPoint: function ( point, optionalTarget ) { return Triangle$1.barycoordFromPoint( point, this.a, this.b, this.c, optionalTarget ); }, containsPoint: function ( point ) { return Triangle$1.containsPoint( point, this.a, this.b, this.c ); }, closestPointToPoint: function () { var plane = new Plane$2(); var edgeList = [ new Line3$1(), new Line3$1(), new Line3$1() ]; var projectedPoint = new Vector3$1(); var closestPoint = new Vector3$1(); return function closestPointToPoint( point, optionalTarget ) { var result = optionalTarget || new Vector3$1(); 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 result.copy( projectedPoint ); } else { // if not, the point falls outside the triangle. the result 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; result.copy( closestPoint ); } } } return result; }; }(), 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/ */ function Face3$1( a, b, c, normal, color, materialIndex ) { this.a = a; this.b = b; this.c = c; this.normal = ( normal && normal.isVector3 ) ? normal : new Vector3$1(); this.vertexNormals = Array.isArray( normal ) ? normal : []; this.color = ( color && color.isColor ) ? color : new Color$1(); this.vertexColors = Array.isArray( color ) ? color : []; this.materialIndex = materialIndex !== undefined ? materialIndex : 0; } Object.assign( Face3$1.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 alteredq / http://alteredqualia.com/ * * parameters = { * color: , * opacity: , * map: new THREE.Texture( ), * * lightMap: new THREE.Texture( ), * lightMapIntensity: * * aoMap: new THREE.Texture( ), * aoMapIntensity: * * specularMap: new THREE.Texture( ), * * alphaMap: new THREE.Texture( ), * * envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ), * combine: THREE.Multiply, * reflectivity: , * refractionRatio: , * * shading: THREE.SmoothShading, * depthTest: , * depthWrite: , * * wireframe: , * wireframeLinewidth: , * * skinning: , * morphTargets: * } */ function MeshBasicMaterial$1( parameters ) { Material$1.call( this ); this.type = 'MeshBasicMaterial'; this.color = new Color$1( 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$1; 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$1.prototype = Object.create( Material$1.prototype ); MeshBasicMaterial$1.prototype.constructor = MeshBasicMaterial$1; MeshBasicMaterial$1.prototype.isMeshBasicMaterial = true; MeshBasicMaterial$1.prototype.copy = function ( source ) { Material$1.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 mrdoob / http://mrdoob.com/ */ function BufferAttribute$1( array, itemSize, normalized ) { if ( Array.isArray( array ) ) { throw new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' ); } this.uuid = _Math$1.generateUUID(); 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.onUploadCallback = function () {}; this.version = 0; } Object.defineProperty( BufferAttribute$1.prototype, 'needsUpdate', { set: function ( value ) { if ( value === true ) this.version ++; } } ); Object.assign( BufferAttribute$1.prototype, { isBufferAttribute: true, 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; }, setDynamic: function ( value ) { this.dynamic = value; return this; }, copy: function ( source ) { 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$1(); } array[ offset ++ ] = color.r; array[ offset ++ ] = color.g; array[ offset ++ ] = color.b; } return this; }, copyIndicesArray: function ( indices ) { var array = this.array, offset = 0; for ( var i = 0, l = indices.length; i < l; i ++ ) { var index = indices[ i ]; array[ offset ++ ] = index.a; array[ offset ++ ] = index.b; array[ offset ++ ] = index.c; } 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$1(); } 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$1(); } 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$1(); } 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$1( array, itemSize ) { BufferAttribute$1.call( this, new Int8Array( array ), itemSize ); } Int8BufferAttribute$1.prototype = Object.create( BufferAttribute$1.prototype ); Int8BufferAttribute$1.prototype.constructor = Int8BufferAttribute$1; function Uint8BufferAttribute$1( array, itemSize ) { BufferAttribute$1.call( this, new Uint8Array( array ), itemSize ); } Uint8BufferAttribute$1.prototype = Object.create( BufferAttribute$1.prototype ); Uint8BufferAttribute$1.prototype.constructor = Uint8BufferAttribute$1; function Uint8ClampedBufferAttribute$1( array, itemSize ) { BufferAttribute$1.call( this, new Uint8ClampedArray( array ), itemSize ); } Uint8ClampedBufferAttribute$1.prototype = Object.create( BufferAttribute$1.prototype ); Uint8ClampedBufferAttribute$1.prototype.constructor = Uint8ClampedBufferAttribute$1; function Int16BufferAttribute$1( array, itemSize ) { BufferAttribute$1.call( this, new Int16Array( array ), itemSize ); } Int16BufferAttribute$1.prototype = Object.create( BufferAttribute$1.prototype ); Int16BufferAttribute$1.prototype.constructor = Int16BufferAttribute$1; function Uint16BufferAttribute$1( array, itemSize ) { BufferAttribute$1.call( this, new Uint16Array( array ), itemSize ); } Uint16BufferAttribute$1.prototype = Object.create( BufferAttribute$1.prototype ); Uint16BufferAttribute$1.prototype.constructor = Uint16BufferAttribute$1; function Int32BufferAttribute$1( array, itemSize ) { BufferAttribute$1.call( this, new Int32Array( array ), itemSize ); } Int32BufferAttribute$1.prototype = Object.create( BufferAttribute$1.prototype ); Int32BufferAttribute$1.prototype.constructor = Int32BufferAttribute$1; function Uint32BufferAttribute$1( array, itemSize ) { BufferAttribute$1.call( this, new Uint32Array( array ), itemSize ); } Uint32BufferAttribute$1.prototype = Object.create( BufferAttribute$1.prototype ); Uint32BufferAttribute$1.prototype.constructor = Uint32BufferAttribute$1; function Float32BufferAttribute$1( array, itemSize ) { BufferAttribute$1.call( this, new Float32Array( array ), itemSize ); } Float32BufferAttribute$1.prototype = Object.create( BufferAttribute$1.prototype ); Float32BufferAttribute$1.prototype.constructor = Float32BufferAttribute$1; function Float64BufferAttribute$1( array, itemSize ) { BufferAttribute$1.call( this, new Float64Array( array ), itemSize ); } Float64BufferAttribute$1.prototype = Object.create( BufferAttribute$1.prototype ); Float64BufferAttribute$1.prototype.constructor = Float64BufferAttribute$1; /** * @author mrdoob / http://mrdoob.com/ */ function DirectGeometry$1() { this.indices = []; 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$1.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$1(), new Vector2$1(), new Vector2$1() ); } } 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$1(), new Vector2$1(), new Vector2$1() ); } } // 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; } } ); function arrayMax$1( 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 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 count$1 = 0; function GeometryIdCount() { return count$1++; } function Geometry$1() { Object.defineProperty( this, 'id', { value: GeometryIdCount() } ); this.uuid = _Math$1.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; } Object.assign( Geometry$1.prototype, EventDispatcher$1.prototype, { isGeometry: true, applyMatrix: function ( matrix ) { var normalMatrix = new Matrix3$1().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$1(); return function rotateX( angle ) { m1.makeRotationX( angle ); this.applyMatrix( m1 ); return this; }; }(), rotateY: function () { // rotate geometry around world y-axis var m1 = new Matrix4$1(); return function rotateY( angle ) { m1.makeRotationY( angle ); this.applyMatrix( m1 ); return this; }; }(), rotateZ: function () { // rotate geometry around world z-axis var m1 = new Matrix4$1(); return function rotateZ( angle ) { m1.makeRotationZ( angle ); this.applyMatrix( m1 ); return this; }; }(), translate: function () { // translate geometry var m1 = new Matrix4$1(); return function translate( x, y, z ) { m1.makeTranslation( x, y, z ); this.applyMatrix( m1 ); return this; }; }(), scale: function () { // scale geometry var m1 = new Matrix4$1(); return function scale( x, y, z ) { m1.makeScale( x, y, z ); this.applyMatrix( m1 ); return this; }; }(), lookAt: function () { var obj = new Object3D$1(); 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$1( positions[ i ], positions[ i + 1 ], positions[ i + 2 ] ) ); if ( normals !== undefined ) { tempNormals.push( new Vector3$1( normals[ i ], normals[ i + 1 ], normals[ i + 2 ] ) ); } if ( colors !== undefined ) { scope.colors.push( new Color$1( colors[ i ], colors[ i + 1 ], colors[ i + 2 ] ) ); } if ( uvs !== undefined ) { tempUVs.push( new Vector2$1( uvs[ j ], uvs[ j + 1 ] ) ); } if ( uvs2 !== undefined ) { tempUVs2.push( new Vector2$1( 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$1( 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 () { this.computeBoundingBox(); var offset = this.boundingBox.getCenter().negate(); this.translate( offset.x, offset.y, offset.z ); return offset; }, 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$1(); 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$1(), ab = new Vector3$1(); 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$1(); } 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$1(), ab = new Vector3$1(); 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$1(); 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$1(); vertexNormals = { a: new Vector3$1(), b: new Vector3$1(), c: new Vector3$1() }; 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; } }, computeLineDistances: function () { var d = 0; var vertices = this.vertices; for ( var i = 0, il = vertices.length; i < il; i ++ ) { if ( i > 0 ) { d += vertices[ i ].distanceTo( vertices[ i - 1 ] ); } this.lineDistances[ i ] = d; } }, computeBoundingBox: function () { if ( this.boundingBox === null ) { this.boundingBox = new Box3$1(); } this.boundingBox.setFromPoints( this.vertices ); }, computeBoundingSphere: function () { if ( this.boundingSphere === null ) { this.boundingSphere = new Sphere$2(); } this.boundingSphere.setFromPoints( this.vertices ); }, merge: function ( geometry, matrix, materialIndexOffset ) { if ( ( geometry && geometry.isGeometry ) === false ) { 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$1().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$1( 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 ) === false ) { console.error( 'THREE.Geometry.mergeMesh(): mesh not an instance of THREE.Mesh.', mesh ); return; } 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; }, 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$1().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 alteredq / http://alteredqualia.com/ * @author mrdoob / http://mrdoob.com/ */ function BufferGeometry$1() { Object.defineProperty( this, 'id', { value: GeometryIdCount() } ); this.uuid = _Math$1.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$1.MaxIndex = 65535; Object.assign( BufferGeometry$1.prototype, EventDispatcher$1.prototype, { isBufferGeometry: true, getIndex: function () { return this.index; }, setIndex: function ( index ) { if ( Array.isArray( index ) ) { this.index = new ( arrayMax$1( index ) > 65535 ? Uint32BufferAttribute$1 : Uint16BufferAttribute$1 )( index, 1 ); } else { this.index = index; } }, addAttribute: function ( name, attribute ) { if ( ( attribute && attribute.isBufferAttribute ) === false && ( attribute && attribute.isInterleavedBufferAttribute ) === false ) { console.warn( 'THREE.BufferGeometry: .addAttribute() now expects ( name, attribute ).' ); this.addAttribute( name, new BufferAttribute$1( 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$1().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$1(); return function rotateX( angle ) { m1.makeRotationX( angle ); this.applyMatrix( m1 ); return this; }; }(), rotateY: function () { // rotate geometry around world y-axis var m1 = new Matrix4$1(); return function rotateY( angle ) { m1.makeRotationY( angle ); this.applyMatrix( m1 ); return this; }; }(), rotateZ: function () { // rotate geometry around world z-axis var m1 = new Matrix4$1(); return function rotateZ( angle ) { m1.makeRotationZ( angle ); this.applyMatrix( m1 ); return this; }; }(), translate: function () { // translate geometry var m1 = new Matrix4$1(); return function translate( x, y, z ) { m1.makeTranslation( x, y, z ); this.applyMatrix( m1 ); return this; }; }(), scale: function () { // scale geometry var m1 = new Matrix4$1(); return function scale( x, y, z ) { m1.makeScale( x, y, z ); this.applyMatrix( m1 ); return this; }; }(), lookAt: function () { var obj = new Object3D$1(); return function lookAt( vector ) { obj.lookAt( vector ); obj.updateMatrix(); this.applyMatrix( obj.matrix ); }; }(), center: function () { this.computeBoundingBox(); var offset = this.boundingBox.getCenter().negate(); this.translate( offset.x, offset.y, offset.z ); return offset; }, setFromObject: function ( object ) { // console.log( 'THREE.BufferGeometry.setFromObject(). Converting', object, this ); var geometry = object.geometry; if ( object.isPoints || object.isLine ) { var positions = new Float32BufferAttribute$1( geometry.vertices.length * 3, 3 ); var colors = new Float32BufferAttribute$1( 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$1( 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; }, 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$1().fromGeometry( geometry ); return this.fromDirectGeometry( geometry.__directGeometry ); }, fromDirectGeometry: function ( geometry ) { var positions = new Float32Array( geometry.vertices.length * 3 ); this.addAttribute( 'position', new BufferAttribute$1( positions, 3 ).copyVector3sArray( geometry.vertices ) ); if ( geometry.normals.length > 0 ) { var normals = new Float32Array( geometry.normals.length * 3 ); this.addAttribute( 'normal', new BufferAttribute$1( normals, 3 ).copyVector3sArray( geometry.normals ) ); } if ( geometry.colors.length > 0 ) { var colors = new Float32Array( geometry.colors.length * 3 ); this.addAttribute( 'color', new BufferAttribute$1( colors, 3 ).copyColorsArray( geometry.colors ) ); } if ( geometry.uvs.length > 0 ) { var uvs = new Float32Array( geometry.uvs.length * 2 ); this.addAttribute( 'uv', new BufferAttribute$1( uvs, 2 ).copyVector2sArray( geometry.uvs ) ); } if ( geometry.uvs2.length > 0 ) { var uvs2 = new Float32Array( geometry.uvs2.length * 2 ); this.addAttribute( 'uv2', new BufferAttribute$1( uvs2, 2 ).copyVector2sArray( geometry.uvs2 ) ); } if ( geometry.indices.length > 0 ) { var TypeArray = arrayMax$1( geometry.indices ) > 65535 ? Uint32Array : Uint16Array; var indices = new TypeArray( geometry.indices.length * 3 ); this.setIndex( new BufferAttribute$1( indices, 1 ).copyIndicesArray( geometry.indices ) ); } // 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$1( morphTarget.length * 3, 3 ); array.push( attribute.copyVector3sArray( morphTarget ) ); } this.morphAttributes[ name ] = array; } // skinning if ( geometry.skinIndices.length > 0 ) { var skinIndices = new Float32BufferAttribute$1( geometry.skinIndices.length * 4, 4 ); this.addAttribute( 'skinIndex', skinIndices.copyVector4sArray( geometry.skinIndices ) ); } if ( geometry.skinWeights.length > 0 ) { var skinWeights = new Float32BufferAttribute$1( 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$1(); } 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$1(); var vector = new Vector3$1(); return function computeBoundingSphere() { if ( this.boundingSphere === null ) { this.boundingSphere = new Sphere$2(); } 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$1( 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$1(), pB = new Vector3$1(), pC = new Vector3$1(); var cb = new Vector3$1(), ab = new Vector3$1(); // 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 ) === false ) { console.error( 'THREE.BufferGeometry.merge(): geometry not an instance of THREE.BufferGeometry.', geometry ); return; } if ( offset === undefined ) offset = 0; 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 normals = this.attributes.normal; var x, y, z, n; for ( var i = 0, il = normals.count; i < il; i ++ ) { x = normals.getX( i ); y = normals.getY( i ); z = normals.getZ( i ); n = 1.0 / Math.sqrt( x * x + y * y + z * z ); normals.setXYZ( i, x * n, y * n, z * n ); } }, toNonIndexed: function () { if ( this.index === null ) { console.warn( 'THREE.BufferGeometry.toNonIndexed(): Geometry is already non-indexed.' ); return this; } var geometry2 = new BufferGeometry$1(); 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$1( array2, itemSize ) ); } 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$1().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 alteredq / http://alteredqualia.com/ * @author mikael emtinger / http://gomo.se/ * @author jonobr1 / http://jonobr1.com/ */ function Mesh$1( geometry, material ) { Object3D$1.call( this ); this.type = 'Mesh'; this.geometry = geometry !== undefined ? geometry : new BufferGeometry$1(); this.material = material !== undefined ? material : new MeshBasicMaterial$1( { color: Math.random() * 0xffffff } ); this.drawMode = TrianglesDrawMode$1; this.updateMorphTargets(); } Mesh$1.prototype = Object.assign( Object.create( Object3D$1.prototype ), { constructor: Mesh$1, isMesh: true, setDrawMode: function ( value ) { this.drawMode = value; }, copy: function ( source ) { Object3D$1.prototype.copy.call( this, source ); this.drawMode = source.drawMode; return this; }, updateMorphTargets: function () { var morphTargets = this.geometry.morphTargets; if ( morphTargets !== undefined && morphTargets.length > 0 ) { this.morphTargetInfluences = []; this.morphTargetDictionary = {}; for ( var m = 0, ml = morphTargets.length; m < ml; m ++ ) { this.morphTargetInfluences.push( 0 ); this.morphTargetDictionary[ morphTargets[ m ].name ] = m; } } }, raycast: ( function () { var inverseMatrix = new Matrix4$1(); var ray = new Ray$1(); var sphere = new Sphere$2(); var vA = new Vector3$1(); var vB = new Vector3$1(); var vC = new Vector3$1(); var tempA = new Vector3$1(); var tempB = new Vector3$1(); var tempC = new Vector3$1(); var uvA = new Vector2$1(); var uvB = new Vector2$1(); var uvC = new Vector2$1(); var barycoord = new Vector3$1(); var intersectionPoint = new Vector3$1(); var intersectionPointWorld = new Vector3$1(); function uvIntersection( point, p1, p2, p3, uv1, uv2, uv3 ) { Triangle$1.barycoordFromPoint( 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, raycaster, ray, pA, pB, pC, point ) { var intersect; var material = object.material; if ( material.side === BackSide$1 ) { intersect = ray.intersectTriangle( pC, pB, pA, true, point ); } else { intersect = ray.intersectTriangle( pA, pB, pC, material.side !== DoubleSide$1, 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, 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 ); } intersection.face = new Face3$1( a, b, c, Triangle$1.normal( vA, vB, vC ) ); 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 { // 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 ) { intersection.index = a; // triangle number in positions buffer semantics 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, 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/ * @author Mugen87 / https://github.com/Mugen87 */ // BoxGeometry function BoxGeometry$1( width, height, depth, widthSegments, heightSegments, depthSegments ) { Geometry$1.call( this ); this.type = 'BoxGeometry'; this.parameters = { width: width, height: height, depth: depth, widthSegments: widthSegments, heightSegments: heightSegments, depthSegments: depthSegments }; this.fromBufferGeometry( new BoxBufferGeometry$1( width, height, depth, widthSegments, heightSegments, depthSegments ) ); this.mergeVertices(); } BoxGeometry$1.prototype = Object.create( Geometry$1.prototype ); BoxGeometry$1.prototype.constructor = BoxGeometry$1; // BoxBufferGeometry function BoxBufferGeometry$1( width, height, depth, widthSegments, heightSegments, depthSegments ) { BufferGeometry$1.call( this ); this.type = 'BoxBufferGeometry'; this.parameters = { width: width, height: height, depth: depth, widthSegments: widthSegments, heightSegments: heightSegments, depthSegments: depthSegments }; var scope = this; // 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$1( vertices, 3 ) ); this.addAttribute( 'normal', new Float32BufferAttribute$1( normals, 3 ) ); this.addAttribute( 'uv', new Float32BufferAttribute$1( 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$1(); // 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$1.prototype = Object.create( BufferGeometry$1.prototype ); BoxBufferGeometry$1.prototype.constructor = BoxBufferGeometry$1; /** * @author mrdoob / http://mrdoob.com/ * @author Mugen87 / https://github.com/Mugen87 */ // PlaneGeometry function PlaneGeometry$1( width, height, widthSegments, heightSegments ) { Geometry$1.call( this ); this.type = 'PlaneGeometry'; this.parameters = { width: width, height: height, widthSegments: widthSegments, heightSegments: heightSegments }; this.fromBufferGeometry( new PlaneBufferGeometry$1( width, height, widthSegments, heightSegments ) ); this.mergeVertices(); } PlaneGeometry$1.prototype = Object.create( Geometry$1.prototype ); PlaneGeometry$1.prototype.constructor = PlaneGeometry$1; // PlaneBufferGeometry function PlaneBufferGeometry$1( width, height, widthSegments, heightSegments ) { BufferGeometry$1.call( this ); this.type = 'PlaneBufferGeometry'; this.parameters = { width: width, height: height, widthSegments: widthSegments, heightSegments: heightSegments }; 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$1( vertices, 3 ) ); this.addAttribute( 'normal', new Float32BufferAttribute$1( normals, 3 ) ); this.addAttribute( 'uv', new Float32BufferAttribute$1( uvs, 2 ) ); } PlaneBufferGeometry$1.prototype = Object.create( BufferGeometry$1.prototype ); PlaneBufferGeometry$1.prototype.constructor = PlaneBufferGeometry$1; /** * @author mrdoob / http://mrdoob.com/ * @author mikael emtinger / http://gomo.se/ * @author WestLangley / http://github.com/WestLangley */ function Camera$1() { Object3D$1.call( this ); this.type = 'Camera'; this.matrixWorldInverse = new Matrix4$1(); this.projectionMatrix = new Matrix4$1(); } Camera$1.prototype = Object.assign( Object.create( Object3D$1.prototype ), { constructor: Camera$1, isCamera: true, copy: function ( source ) { Object3D$1.prototype.copy.call( this, source ); this.matrixWorldInverse.copy( source.matrixWorldInverse ); this.projectionMatrix.copy( source.projectionMatrix ); return this; }, getWorldDirection: function () { var quaternion = new Quaternion$1(); return function getWorldDirection( optionalTarget ) { var result = optionalTarget || new Vector3$1(); this.getWorldQuaternion( quaternion ); return result.set( 0, 0, - 1 ).applyQuaternion( quaternion ); }; }(), clone: function () { return new this.constructor().copy( this ); } } ); /** * @author mrdoob / http://mrdoob.com/ * @author greggman / http://games.greggman.com/ * @author zz85 / http://www.lab4games.net/zz85/blog * @author tschw */ function PerspectiveCamera$2( fov, aspect, near, far ) { Camera$1.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$2.prototype = Object.assign( Object.create( Camera$1.prototype ), { constructor: PerspectiveCamera$2, isPerspectiveCamera: true, copy: function ( source ) { Camera$1.prototype.copy.call( this, source ); 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$1.RAD2DEG * 2 * Math.atan( vExtentSlope ); this.updateProjectionMatrix(); }, /** * Calculates the focal length from the current .fov and .filmGauge. */ getFocalLength: function () { var vExtentSlope = Math.tan( _Math$1.DEG2RAD * 0.5 * this.fov ); return 0.5 * this.getFilmHeight() / vExtentSlope; }, getEffectiveFOV: function () { return _Math$1.RAD2DEG * 2 * Math.atan( Math.tan( _Math$1.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; this.view = { fullWidth: fullWidth, fullHeight: fullHeight, offsetX: x, offsetY: y, width: width, height: height }; this.updateProjectionMatrix(); }, clearViewOffset: function () { this.view = null; this.updateProjectionMatrix(); }, updateProjectionMatrix: function () { var near = this.near, top = near * Math.tan( _Math$1.DEG2RAD * 0.5 * this.fov ) / this.zoom, height = 2 * top, width = this.aspect * height, left = - 0.5 * width, view = this.view; if ( view !== null ) { 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$1.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 alteredq / http://alteredqualia.com/ * @author arose / http://github.com/arose */ function OrthographicCamera$2( left, right, top, bottom, near, far ) { Camera$1.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$2.prototype = Object.assign( Object.create( Camera$1.prototype ), { constructor: OrthographicCamera$2, isOrthographicCamera: true, copy: function ( source ) { Camera$1.prototype.copy.call( this, source ); 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 ) { this.view = { fullWidth: fullWidth, fullHeight: fullHeight, offsetX: x, offsetY: y, width: width, height: height }; this.updateProjectionMatrix(); }, clearViewOffset: function() { this.view = null; 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 ) { 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$1.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/ */ function WebGLAttributes$1( gl ) { var buffers = {}; 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( "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 = 0; // reset range } } // function get( attribute ) { if ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data; return buffers[ attribute.uuid ]; } function remove( attribute ) { var data = buffers[ attribute.uuid ]; if ( data ) { gl.deleteBuffer( data.buffer ); delete buffers[ attribute.uuid ]; } } function update( attribute, bufferType ) { if ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data; var data = buffers[ attribute.uuid ]; if ( data === undefined ) { buffers[ attribute.uuid ] = 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/ */ function painterSortStable$1( 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$1( 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$1() { var opaque = []; var opaqueLastIndex = - 1; var transparent = []; var transparentLastIndex = - 1; function init() { opaqueLastIndex = - 1; transparentLastIndex = - 1; } function push( object, geometry, material, z, group ) { var array, index; // allocate the next position in the appropriate array if ( material.transparent ) { array = transparent; index = ++ transparentLastIndex; } else { array = opaque; index = ++ opaqueLastIndex; } // recycle existing render item or grow the array var renderItem = array[ index ]; if ( renderItem ) { 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; } else { renderItem = { id: object.id, object: object, geometry: geometry, material: material, program: material.program, renderOrder: object.renderOrder, z: z, group: group }; // assert( index === array.length ); array.push( renderItem ); } } function finish() { opaque.length = opaqueLastIndex + 1; transparent.length = transparentLastIndex + 1; } function sort() { opaque.sort( painterSortStable$1 ); transparent.sort( reversePainterSortStable$1 ); } return { opaque: opaque, transparent: transparent, init: init, push: push, finish: finish, sort: sort }; } function WebGLRenderLists$1() { 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$1(); lists[ hash ] = list; } return list; } function dispose() { lists = {}; } return { get: get, dispose: dispose }; } /** * @author mrdoob / http://mrdoob.com/ */ function WebGLIndexedBufferRenderer$1( gl, extensions, infoRender ) { var mode; function setMode( value ) { mode = value; } var type, size; function setIndex( index ) { if ( index.array instanceof Uint32Array && extensions.get( 'OES_element_index_uint' ) ) { type = gl.UNSIGNED_INT; size = 4; } else if ( index.array instanceof Uint16Array ) { type = gl.UNSIGNED_SHORT; size = 2; } else { type = gl.UNSIGNED_BYTE; size = 1; } } function render( start, count ) { gl.drawElements( mode, count, type, start * size ); infoRender.calls ++; infoRender.vertices += count; if ( mode === gl.TRIANGLES ) infoRender.faces += count / 3; } 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 * size, geometry.maxInstancedCount ); infoRender.calls ++; infoRender.vertices += count * geometry.maxInstancedCount; if ( mode === gl.TRIANGLES ) infoRender.faces += geometry.maxInstancedCount * count / 3; } // this.setMode = setMode; this.setIndex = setIndex; this.render = render; this.renderInstances = renderInstances; } /** * @author mrdoob / http://mrdoob.com/ */ function WebGLBufferRenderer$1( gl, extensions, infoRender ) { var mode; function setMode( value ) { mode = value; } function render( start, count ) { gl.drawArrays( mode, start, count ); infoRender.calls ++; infoRender.vertices += count; if ( mode === gl.TRIANGLES ) infoRender.faces += count / 3; } 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 ); } infoRender.calls ++; infoRender.vertices += count * geometry.maxInstancedCount; if ( mode === gl.TRIANGLES ) infoRender.faces += geometry.maxInstancedCount * count / 3; } // this.setMode = setMode; this.render = render; this.renderInstances = renderInstances; } /** * @author mrdoob / http://mrdoob.com/ */ function WebGLGeometries$1( gl, attributes, infoMemory ) { 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 ]; } // infoMemory.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$1().setFromObject( object ); } buffergeometry = geometry._bufferGeometry; } geometries[ geometry.id ] = buffergeometry; infoMemory.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$1( indices ) > 65535 ? Uint32BufferAttribute$1 : Uint16BufferAttribute$1 )( 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 WebGLLights$1() { 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$1(), color: new Color$1(), shadow: false, shadowBias: 0, shadowRadius: 1, shadowMapSize: new Vector2$1() }; break; case 'SpotLight': uniforms = { position: new Vector3$1(), direction: new Vector3$1(), color: new Color$1(), distance: 0, coneCos: 0, penumbraCos: 0, decay: 0, shadow: false, shadowBias: 0, shadowRadius: 1, shadowMapSize: new Vector2$1() }; break; case 'PointLight': uniforms = { position: new Vector3$1(), color: new Color$1(), distance: 0, decay: 0, shadow: false, shadowBias: 0, shadowRadius: 1, shadowMapSize: new Vector2$1() }; break; case 'HemisphereLight': uniforms = { direction: new Vector3$1(), skyColor: new Color$1(), groundColor: new Color$1() }; break; case 'RectAreaLight': uniforms = { color: new Color$1(), position: new Vector3$1(), halfWidth: new Vector3$1(), halfHeight: new Vector3$1() // TODO (abelnation): set RectAreaLight shadow uniforms }; break; } lights[ light.id ] = uniforms; return uniforms; } }; } /** * @author mrdoob / http://mrdoob.com/ */ function WebGLObjects$1( gl, geometries, infoRender ) { var updateList = {}; function update( object ) { var frame = infoRender.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 clear() { updateList = {}; } return { update: update, clear: clear }; } /** * @author mrdoob / http://mrdoob.com/ */ function addLineNumbers$1( 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$1( 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$1( string ) ); } // --enable-privileged-webgl-extension // console.log( type, gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( shader ) ); return shader; } /** * @author mrdoob / http://mrdoob.com/ */ var programIdCount$1 = 0; function getEncodingComponents$1( encoding ) { switch ( encoding ) { case LinearEncoding$1: return [ 'Linear','( value )' ]; case sRGBEncoding$1: return [ 'sRGB','( value )' ]; case RGBEEncoding$1: return [ 'RGBE','( value )' ]; case RGBM7Encoding$1: return [ 'RGBM','( value, 7.0 )' ]; case RGBM16Encoding$1: return [ 'RGBM','( value, 16.0 )' ]; case RGBDEncoding$1: return [ 'RGBD','( value, 256.0 )' ]; case GammaEncoding$1: return [ 'Gamma','( value, float( GAMMA_FACTOR ) )' ]; default: throw new Error( 'unsupported encoding: ' + encoding ); } } function getTexelDecodingFunction$1( functionName, encoding ) { var components = getEncodingComponents$1( encoding ); return "vec4 " + functionName + "( vec4 value ) { return " + components[ 0 ] + "ToLinear" + components[ 1 ] + "; }"; } function getTexelEncodingFunction$1( functionName, encoding ) { var components = getEncodingComponents$1( encoding ); return "vec4 " + functionName + "( vec4 value ) { return LinearTo" + components[ 0 ] + components[ 1 ] + "; }"; } function getToneMappingFunction$1( functionName, toneMapping ) { var toneMappingName; switch ( toneMapping ) { case LinearToneMapping$1: toneMappingName = "Linear"; break; case ReinhardToneMapping$1: toneMappingName = "Reinhard"; break; case Uncharted2ToneMapping$1: toneMappingName = "Uncharted2"; break; case CineonToneMapping$1: toneMappingName = "OptimizedCineon"; break; default: throw new Error( 'unsupported toneMapping: ' + toneMapping ); } return "vec3 " + functionName + "( vec3 color ) { return " + toneMappingName + "ToneMapping( color ); }"; } function generateExtensions$1( 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$1 ).join( '\n' ); } function generateDefines$1( 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$1( gl, program, identifiers ) { 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$1( string ) { return string !== ''; } function replaceLightNums$1( 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 parseIncludes$1( string ) { var pattern = /^[ \t]*#include +<([\w\d.]+)>/gm; function replace( match, include ) { var replace = ShaderChunk$1[ include ]; if ( replace === undefined ) { throw new Error( 'Can not resolve #include <' + include + '>' ); } return parseIncludes$1( replace ); } return string.replace( pattern, replace ); } function unrollLoops$1( string ) { var pattern = /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$1( renderer, code, material, parameters ) { var gl = renderer.context; var extensions = material.extensions; var defines = material.defines; var vertexShader = material.__webglShader.vertexShader; var fragmentShader = material.__webglShader.fragmentShader; var shadowMapTypeDefine = 'SHADOWMAP_TYPE_BASIC'; if ( parameters.shadowMapType === PCFShadowMap$1 ) { shadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF'; } else if ( parameters.shadowMapType === PCFSoftShadowMap$1 ) { 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$1: case CubeRefractionMapping$1: envMapTypeDefine = 'ENVMAP_TYPE_CUBE'; break; case CubeUVReflectionMapping$1: case CubeUVRefractionMapping$1: envMapTypeDefine = 'ENVMAP_TYPE_CUBE_UV'; break; case EquirectangularReflectionMapping$1: case EquirectangularRefractionMapping$1: envMapTypeDefine = 'ENVMAP_TYPE_EQUIREC'; break; case SphericalReflectionMapping$1: envMapTypeDefine = 'ENVMAP_TYPE_SPHERE'; break; } switch ( material.envMap.mapping ) { case CubeRefractionMapping$1: case EquirectangularRefractionMapping$1: envMapModeDefine = 'ENVMAP_MODE_REFRACTION'; break; } switch ( material.combine ) { case MultiplyOperation$1: envMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY'; break; case MixOperation$1: envMapBlendingDefine = 'ENVMAP_BLENDING_MIX'; break; case AddOperation$1: envMapBlendingDefine = 'ENVMAP_BLENDING_ADD'; break; } } var gammaFactorDefine = ( renderer.gammaFactor > 0 ) ? renderer.gammaFactor : 1.0; // console.log( 'building new program ' ); // var customExtensions = generateExtensions$1( extensions, parameters, renderer.extensions ); var customDefines = generateDefines$1( defines ); // var program = gl.createProgram(); var prefixVertex, prefixFragment; if ( material.isRawShaderMaterial ) { prefixVertex = [ customDefines, '\n' ].filter( filterEmptyLine$1 ).join( '\n' ); prefixFragment = [ customExtensions, customDefines, '\n' ].filter( filterEmptyLine$1 ).join( '\n' ); } else { prefixVertex = [ 'precision ' + parameters.precision + ' float;', 'precision ' + parameters.precision + ' int;', '#define SHADER_NAME ' + material.__webglShader.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' : '', '#define NUM_CLIPPING_PLANES ' + parameters.numClippingPlanes, parameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '', parameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '', parameters.sizeAttenuation ? '#define USE_SIZEATTENUATION' : '', parameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '', parameters.logarithmicDepthBuffer && renderer.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$1 ).join( '\n' ); prefixFragment = [ customExtensions, 'precision ' + parameters.precision + ' float;', 'precision ' + parameters.precision + ' int;', '#define SHADER_NAME ' + material.__webglShader.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' : '', '#define NUM_CLIPPING_PLANES ' + parameters.numClippingPlanes, '#define UNION_CLIPPING_PLANES ' + (parameters.numClippingPlanes - parameters.numClipIntersection), 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 && renderer.extensions.get( 'EXT_frag_depth' ) ? '#define USE_LOGDEPTHBUF_EXT' : '', parameters.envMap && renderer.extensions.get( 'EXT_shader_texture_lod' ) ? '#define TEXTURE_LOD_EXT' : '', 'uniform mat4 viewMatrix;', 'uniform vec3 cameraPosition;', ( parameters.toneMapping !== NoToneMapping$1 ) ? "#define TONE_MAPPING" : '', ( parameters.toneMapping !== NoToneMapping$1 ) ? ShaderChunk$1[ 'tonemapping_pars_fragment' ] : '', // this code is required here because it is used by the toneMapping() function defined below ( parameters.toneMapping !== NoToneMapping$1 ) ? getToneMappingFunction$1( "toneMapping", parameters.toneMapping ) : '', parameters.dithering ? '#define DITHERING' : '', ( parameters.outputEncoding || parameters.mapEncoding || parameters.envMapEncoding || parameters.emissiveMapEncoding ) ? ShaderChunk$1[ 'encodings_pars_fragment' ] : '', // this code is required here because it is used by the various encoding/decoding function defined below parameters.mapEncoding ? getTexelDecodingFunction$1( 'mapTexelToLinear', parameters.mapEncoding ) : '', parameters.envMapEncoding ? getTexelDecodingFunction$1( 'envMapTexelToLinear', parameters.envMapEncoding ) : '', parameters.emissiveMapEncoding ? getTexelDecodingFunction$1( 'emissiveMapTexelToLinear', parameters.emissiveMapEncoding ) : '', parameters.outputEncoding ? getTexelEncodingFunction$1( "linearToOutputTexel", parameters.outputEncoding ) : '', parameters.depthPacking ? "#define DEPTH_PACKING " + material.depthPacking : '', '\n' ].filter( filterEmptyLine$1 ).join( '\n' ); } vertexShader = parseIncludes$1( vertexShader, parameters ); vertexShader = replaceLightNums$1( vertexShader, parameters ); fragmentShader = parseIncludes$1( fragmentShader, parameters ); fragmentShader = replaceLightNums$1( fragmentShader, parameters ); if ( ! material.isShaderMaterial ) { vertexShader = unrollLoops$1( vertexShader ); fragmentShader = unrollLoops$1( fragmentShader ); } var vertexGlsl = prefixVertex + vertexShader; var fragmentGlsl = prefixFragment + fragmentShader; // console.log( '*VERTEX*', vertexGlsl ); // console.log( '*FRAGMENT*', fragmentGlsl ); var glVertexShader = WebGLShader$1( gl, gl.VERTEX_SHADER, vertexGlsl ); var glFragmentShader = WebGLShader$1( 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 ); var vertexLog = gl.getShaderInfoLog( glVertexShader ); var fragmentLog = gl.getShaderInfoLog( glFragmentShader ); 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$1( gl, program, renderer ); } return cachedUniforms; }; // set up caching for attribute locations var cachedAttributes; this.getAttributes = function() { if ( cachedAttributes === undefined ) { cachedAttributes = fetchAttributeLocations$1( 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.id = programIdCount$1 ++; this.code = code; this.usedTimes = 1; this.program = program; this.vertexShader = glVertexShader; this.fragmentShader = glFragmentShader; return this; } /** * @author mrdoob / http://mrdoob.com/ */ function WebGLPrograms$1( renderer, capabilities ) { var programs = []; var shaderIDs = { MeshDepthMaterial: 'depth', MeshNormalMaterial: 'normal', MeshBasicMaterial: 'basic', MeshLambertMaterial: 'lambert', MeshPhongMaterial: 'phong', MeshToonMaterial: 'phong', MeshStandardMaterial: 'physical', MeshPhysicalMaterial: 'physical', LineBasicMaterial: 'basic', LineDashedMaterial: 'dashed', PointsMaterial: 'points' }; 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$1; } 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$1 && gammaOverrideLinear ) { encoding = GammaEncoding$1; } return encoding; } this.getParameters = function ( material, lights, 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 = renderer.getPrecision(); 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$1 ) || ( material.envMap.mapping === CubeUVRefractionMapping$1 ) ), 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.shading === FlatShading$1, 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 && lights.shadows.length > 0, shadowMapType: renderer.shadowMap.type, toneMapping: renderer.toneMapping, physicallyCorrectLights: renderer.physicallyCorrectLights, premultipliedAlpha: material.premultipliedAlpha, alphaTest: material.alphaTest, doubleSided: material.side === DoubleSide$1, flipSided: material.side === BackSide$1, 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 ] ] ); } return array.join(); }; this.acquireProgram = function ( material, 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$1( renderer, code, material, 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 mrdoob / http://mrdoob.com/ */ function WebGLTextures$1( _gl, extensions, state, properties, capabilities, paramThreeToGL, infoMemory ) { var _isWebGL2 = ( typeof WebGL2RenderingContext !== 'undefined' && _gl instanceof WebGL2RenderingContext ); // function clampToMaxSize( image, maxSize ) { if ( image.width > maxSize || image.height > maxSize ) { // 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$1.isPowerOfTwo( image.width ) && _Math$1.isPowerOfTwo( image.height ); } function makePowerOfTwo( image ) { if ( image instanceof HTMLImageElement || image instanceof HTMLCanvasElement ) { var canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ); canvas.width = _Math$1.nearestPowerOfTwo( image.width ); canvas.height = _Math$1.nearestPowerOfTwo( 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$1 || texture.wrapT !== ClampToEdgeWrapping$1 ) || ( texture.minFilter !== NearestFilter$1 && texture.minFilter !== LinearFilter$1 ); } // Fallback filters for non-power-of-2 textures function filterFallback( f ) { if ( f === NearestFilter$1 || f === NearestMipMapNearestFilter$1 || f === NearestMipMapLinearFilter$1 ) { return _gl.NEAREST; } return _gl.LINEAR; } // function onTextureDispose( event ) { var texture = event.target; texture.removeEventListener( 'dispose', onTextureDispose ); deallocateTexture( texture ); infoMemory.textures --; } function onRenderTargetDispose( event ) { var renderTarget = event.target; renderTarget.removeEventListener( 'dispose', onRenderTargetDispose ); deallocateRenderTarget( renderTarget ); infoMemory.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.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(); infoMemory.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 = paramThreeToGL( texture.format ), glType = paramThreeToGL( 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$1 && texture.format !== RGBFormat$1 ) { 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 ( texture.generateMipmaps && isPowerOfTwoImage ) { _gl.generateMipmap( _gl.TEXTURE_CUBE_MAP ); } 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, paramThreeToGL( texture.wrapS ) ); _gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, paramThreeToGL( texture.wrapT ) ); _gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, paramThreeToGL( texture.magFilter ) ); _gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, paramThreeToGL( 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$1 || texture.wrapT !== ClampToEdgeWrapping$1 ) { 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$1 && texture.minFilter !== LinearFilter$1 ) { 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$1 && extensions.get( 'OES_texture_float_linear' ) === null ) return; if ( texture.type === HalfFloatType$1 && 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(); infoMemory.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 = paramThreeToGL( texture.format ), glType = paramThreeToGL( 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$1 ) { 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$1 && 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$1 && texture.type !== UnsignedIntType$1 ) { console.warn( 'THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture.' ); texture.type = UnsignedShortType$1; glType = paramThreeToGL( 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$1 ) { 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$1 ) { console.warn( 'THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture.' ); texture.type = UnsignedInt248Type$1; glType = paramThreeToGL( 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; } else { state.texImage2D( _gl.TEXTURE_2D, 0, glFormat, image.width, image.height, 0, glFormat, glType, image.data ); } } else if ( texture.isCompressedTexture ) { for ( var i = 0, il = mipmaps.length; i < il; i ++ ) { mipmap = mipmaps[ i ]; if ( texture.format !== RGBAFormat$1 && texture.format !== RGBFormat$1 ) { 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 ); } } } 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; } else { state.texImage2D( _gl.TEXTURE_2D, 0, glFormat, glFormat, glType, image ); } } if ( texture.generateMipmaps && isPowerOfTwoImage ) _gl.generateMipmap( _gl.TEXTURE_2D ); 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 = paramThreeToGL( renderTarget.texture.format ); var glType = paramThreeToGL( 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$1 ) { _gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 ); } else if ( renderTarget.depthTexture.format === DepthStencilFormat$1 ) { _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(); infoMemory.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 ( renderTarget.texture.generateMipmaps && isTargetPowerOfTwo ) _gl.generateMipmap( _gl.TEXTURE_CUBE_MAP ); 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 ( renderTarget.texture.generateMipmaps && isTargetPowerOfTwo ) _gl.generateMipmap( _gl.TEXTURE_2D ); state.bindTexture( _gl.TEXTURE_2D, null ); } // Setup depth and stencil buffers if ( renderTarget.depthBuffer ) { setupDepthRenderbuffer( renderTarget ); } } function updateRenderTargetMipmap( renderTarget ) { var texture = renderTarget.texture; if ( texture.generateMipmaps && isPowerOfTwo( renderTarget ) && texture.minFilter !== NearestFilter$1 && texture.minFilter !== LinearFilter$1 ) { var target = (renderTarget && renderTarget.isWebGLRenderTargetCube) ? _gl.TEXTURE_CUBE_MAP : _gl.TEXTURE_2D; var webglTexture = properties.get( texture ).__webglTexture; state.bindTexture( target, webglTexture ); _gl.generateMipmap( target ); state.bindTexture( target, null ); } } this.setTexture2D = setTexture2D; this.setTextureCube = setTextureCube; this.setTextureCubeDynamic = setTextureCubeDynamic; this.setupRenderTarget = setupRenderTarget; this.updateRenderTargetMipmap = updateRenderTargetMipmap; } /** * @author fordacious / fordacious.github.io */ function WebGLProperties$1() { var properties = {}; function get( object ) { var uuid = object.uuid; var map = properties[ uuid ]; if ( map === undefined ) { map = {}; properties[ uuid ] = map; } return map; } function remove( object ) { delete properties[ object.uuid ]; } function clear() { properties = {}; } return { get: get, remove: remove, clear: clear }; } /** * @author mrdoob / http://mrdoob.com/ */ function WebGLState$1( gl, extensions, paramThreeToGL ) { function ColorBuffer() { var locked = false; var color = new Vector4$1(); var currentColorMask = null; var currentColorClear = new Vector4$1(); 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( 0, 0, 0, 1 ); } }; } 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$1: gl.depthFunc( gl.NEVER ); break; case AlwaysDepth$1: gl.depthFunc( gl.ALWAYS ); break; case LessDepth$1: gl.depthFunc( gl.LESS ); break; case LessEqualDepth$1: gl.depthFunc( gl.LEQUAL ); break; case EqualDepth$1: gl.depthFunc( gl.EQUAL ); break; case GreaterEqualDepth$1: gl.depthFunc( gl.GEQUAL ); break; case GreaterDepth$1: gl.depthFunc( gl.GREATER ); break; case NotEqualDepth$1: 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 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 currentScissorTest = null; var maxTextures = gl.getParameter( gl.MAX_TEXTURE_IMAGE_UNITS ); var version = parseFloat( /^WebGL\ ([0-9])/.exec( gl.getParameter( gl.VERSION ) )[ 1 ] ); var lineWidthAvailable = parseFloat( version ) >= 1.0; var currentTextureSlot = null; var currentBoundTextures = {}; var currentScissor = new Vector4$1(); var currentViewport = new Vector4$1(); 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 ); // function init() { colorBuffer.setClear( 0, 0, 0, 1 ); depthBuffer.setClear( 1 ); stencilBuffer.setClear( 0 ); enable( gl.DEPTH_TEST ); depthBuffer.setFunc( LessEqualDepth$1 ); setFlipSided( false ); setCullFace( CullFaceBack$1 ); enable( gl.CULL_FACE ); enable( gl.BLEND ); setBlending( NormalBlending$1 ); } 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' ) ) { var formats = gl.getParameter( gl.COMPRESSED_TEXTURE_FORMATS ); for ( var i = 0; i < formats.length; i ++ ) { compressedTextureFormats.push( formats[ i ] ); } } } return compressedTextureFormats; } function setBlending( blending, blendEquation, blendSrc, blendDst, blendEquationAlpha, blendSrcAlpha, blendDstAlpha, premultipliedAlpha ) { if ( blending !== NoBlending$1 ) { enable( gl.BLEND ); } else { disable( gl.BLEND ); } if ( blending !== currentBlending || premultipliedAlpha !== currentPremultipledAlpha ) { if ( blending === AdditiveBlending$1 ) { 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 ); } } else if ( blending === SubtractiveBlending$1 ) { 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 ); } } else if ( blending === MultiplyBlending$1 ) { 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 ); } } else { 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 ); } } currentBlending = blending; currentPremultipledAlpha = premultipliedAlpha; } if ( blending === CustomBlending$1 ) { blendEquationAlpha = blendEquationAlpha || blendEquation; blendSrcAlpha = blendSrcAlpha || blendSrc; blendDstAlpha = blendDstAlpha || blendDst; if ( blendEquation !== currentBlendEquation || blendEquationAlpha !== currentBlendEquationAlpha ) { gl.blendEquationSeparate( paramThreeToGL( blendEquation ), paramThreeToGL( blendEquationAlpha ) ); currentBlendEquation = blendEquation; currentBlendEquationAlpha = blendEquationAlpha; } if ( blendSrc !== currentBlendSrc || blendDst !== currentBlendDst || blendSrcAlpha !== currentBlendSrcAlpha || blendDstAlpha !== currentBlendDstAlpha ) { gl.blendFuncSeparate( paramThreeToGL( blendSrc ), paramThreeToGL( blendDst ), paramThreeToGL( blendSrcAlpha ), paramThreeToGL( blendDstAlpha ) ); currentBlendSrc = blendSrc; currentBlendDst = blendDst; currentBlendSrcAlpha = blendSrcAlpha; currentBlendDstAlpha = blendDstAlpha; } } else { currentBlendEquation = null; currentBlendSrc = null; currentBlendDst = null; currentBlendEquationAlpha = null; currentBlendSrcAlpha = null; currentBlendDstAlpha = null; } } function setMaterial( material ) { material.side === DoubleSide$1 ? disable( gl.CULL_FACE ) : enable( gl.CULL_FACE ); setFlipSided( material.side === BackSide$1 ); material.transparent === true ? setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.premultipliedAlpha ) : setBlending( NoBlending$1 ); 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$1 ) { enable( gl.CULL_FACE ); if ( cullFace !== currentCullFace ) { if ( cullFace === CullFaceBack$1 ) { gl.cullFace( gl.BACK ); } else if ( cullFace === CullFaceFront$1 ) { 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 getScissorTest() { return currentScissorTest; } function setScissorTest( scissorTest ) { currentScissorTest = 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( error ); } } function texImage2D() { try { gl.texImage2D.apply( gl, arguments ); } catch ( error ) { console.error( 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 = {}; currentBlending = null; currentFlipSided = null; currentCullFace = null; colorBuffer.reset(); depthBuffer.reset(); stencilBuffer.reset(); } return { buffers: { color: colorBuffer, depth: depthBuffer, stencil: stencilBuffer }, init: init, initAttributes: initAttributes, enableAttribute: enableAttribute, enableAttributeAndDivisor: enableAttributeAndDivisor, disableUnusedAttributes: disableUnusedAttributes, enable: enable, disable: disable, getCompressedTextureFormats: getCompressedTextureFormats, setBlending: setBlending, setMaterial: setMaterial, setFlipSided: setFlipSided, setCullFace: setCullFace, setLineWidth: setLineWidth, setPolygonOffset: setPolygonOffset, getScissorTest: getScissorTest, setScissorTest: setScissorTest, activeTexture: activeTexture, bindTexture: bindTexture, compressedTexImage2D: compressedTexImage2D, texImage2D: texImage2D, scissor: scissor, viewport: viewport, reset: reset }; } /** * @author mrdoob / http://mrdoob.com/ */ function WebGLCapabilities$1( 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 && !! extensions.get( 'EXT_frag_depth' ); 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 mrdoob / http://mrdoob.com/ */ function WebGLExtensions$1( 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; case 'WEBGL_compressed_texture_etc1': extension = gl.getExtension( 'WEBGL_compressed_texture_etc1' ); break; default: extension = gl.getExtension( name ); } if ( extension === null ) { console.warn( 'THREE.WebGLRenderer: ' + name + ' extension not supported.' ); } extensions[ name ] = extension; return extension; } }; } /** * @author tschw */ function WebGLClipping$1() { var scope = this, globalState = null, numGlobalPlanes = 0, localClippingEnabled = false, renderingShadows = false, plane = new Plane$2(), viewNormalMatrix = new Matrix3$1(), 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; } } // import { Sphere } from '../math/Sphere'; /** * @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$1( parameters ) { console.log( 'THREE.WebGLRenderer', REVISION$1 ); 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; var lights = []; var currentRenderList = null; var morphInfluences = new Float32Array( 8 ); var sprites = []; var lensFlares = []; // 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$1; this.toneMappingExposure = 1.0; this.toneMappingWhitePoint = 1.0; // morphs this.maxMorphTargets = 8; this.maxMorphNormals = 4; // internal properties var _this = this, // internal state cache _currentProgram = null, _currentRenderTarget = null, _currentFramebuffer = null, _currentMaterialId = - 1, _currentGeometryProgram = '', _currentCamera = null, _currentScissor = new Vector4$1(), _currentScissorTest = null, _currentViewport = new Vector4$1(), // _usedTextureUnits = 0, // _clearColor = new Color$1( 0x000000 ), _clearAlpha = 0, _width = _canvas.width, _height = _canvas.height, _pixelRatio = 1, _scissor = new Vector4$1( 0, 0, _width, _height ), _scissorTest = false, _viewport = new Vector4$1( 0, 0, _width, _height ), // frustum _frustum = new Frustum$1(), // clipping _clipping = new WebGLClipping$1(), _clippingEnabled = false, _localClippingEnabled = false, // camera matrices cache _projScreenMatrix = new Matrix4$1(), _vector3 = new Vector3$1(), _matrix4 = new Matrix4$1(), _matrix42 = new Matrix4$1(), // light arrays cache _lights = { hash: '', ambient: [ 0, 0, 0 ], directional: [], directionalShadowMap: [], directionalShadowMatrix: [], spot: [], spotShadowMap: [], spotShadowMatrix: [], rectArea: [], point: [], pointShadowMap: [], pointShadowMatrix: [], hemi: [], shadows: [] }, // info _infoMemory = { geometries: 0, textures: 0 }, _infoRender = { frame: 0, calls: 0, vertices: 0, faces: 0, points: 0 }; this.info = { render: _infoRender, memory: _infoMemory, programs: null }; // initialize var _gl; try { var contextAttributes = { alpha: _alpha, depth: _depth, stencil: _stencil, antialias: _antialias, premultipliedAlpha: _premultipliedAlpha, preserveDrawingBuffer: _preserveDrawingBuffer }; _gl = _context || _canvas.getContext( 'webgl', contextAttributes ) || _canvas.getContext( 'experimental-webgl', contextAttributes ); if ( _gl === null ) { if ( _canvas.getContext( 'webgl' ) !== null ) { throw 'Error creating WebGL context with your selected attributes.'; } else { throw '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 }; }; } _canvas.addEventListener( 'webglcontextlost', onContextLost, false ); } catch ( error ) { console.error( 'THREE.WebGLRenderer: ' + error ); } var extensions = new WebGLExtensions$1( _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( 'ANGLE_instanced_arrays' ); if ( extensions.get( 'OES_element_index_uint' ) ) { BufferGeometry$1.MaxIndex = 4294967296; } var capabilities = new WebGLCapabilities$1( _gl, extensions, parameters ); var state = new WebGLState$1( _gl, extensions, paramThreeToGL ); var properties = new WebGLProperties$1(); var textures = new WebGLTextures$1( _gl, extensions, state, properties, capabilities, paramThreeToGL, _infoMemory ); var attributes = new WebGLAttributes$1( _gl ); var geometries = new WebGLGeometries$1( _gl, attributes, _infoMemory ); var objects = new WebGLObjects$1( _gl, geometries, _infoRender ); var programCache = new WebGLPrograms$1( this, capabilities ); var lightCache = new WebGLLights$1(); var renderLists = new WebGLRenderLists$1(); this.info.programs = programCache.programs; var bufferRenderer = new WebGLBufferRenderer$1( _gl, extensions, _infoRender ); var indexedBufferRenderer = new WebGLIndexedBufferRenderer$1( _gl, extensions, _infoRender ); // var backgroundPlaneCamera, backgroundPlaneMesh; var backgroundBoxCamera, backgroundBoxMesh; // function getTargetPixelRatio() { return _currentRenderTarget === null ? _pixelRatio : 1; } function setDefaultGLState() { state.init(); state.scissor( _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ) ); state.viewport( _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ) ); state.buffers.color.setClear( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha, _premultipliedAlpha ); } function resetGLState() { _currentProgram = null; _currentCamera = null; _currentGeometryProgram = ''; _currentMaterialId = - 1; state.reset(); } setDefaultGLState(); this.context = _gl; this.capabilities = capabilities; this.extensions = extensions; this.properties = properties; this.state = state; // shadow map var shadowMap = new WebGLShadowMap$1( this, _lights, objects, capabilities ); this.shadowMap = shadowMap; // Plugins var spritePlugin = new SpritePlugin( this, sprites ); var lensFlarePlugin = new LensFlarePlugin( this, lensFlares ); // 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.getMaxAnisotropy = function () { return capabilities.getMaxAnisotropy(); }; this.getPrecision = function () { return capabilities.precision; }; this.getPixelRatio = function () { return _pixelRatio; }; this.setPixelRatio = function ( value ) { if ( value === undefined ) return; _pixelRatio = value; this.setSize( _viewport.z, _viewport.w, false ); }; this.getSize = function () { return { width: _width, height: _height }; }; this.setSize = function ( width, height, updateStyle ) { _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.setViewport = function ( x, y, width, height ) { state.viewport( _viewport.set( x, y, width, height ) ); }; this.setScissor = function ( x, y, width, height ) { state.scissor( _scissor.set( x, y, width, height ) ); }; this.setScissorTest = function ( boolean ) { state.setScissorTest( _scissorTest = boolean ); }; // Clearing this.getClearColor = function () { return _clearColor; }; this.setClearColor = function ( color, alpha ) { _clearColor.set( color ); _clearAlpha = alpha !== undefined ? alpha : 1; state.buffers.color.setClear( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha, _premultipliedAlpha ); }; this.getClearAlpha = function () { return _clearAlpha; }; this.setClearAlpha = function ( alpha ) { _clearAlpha = alpha; state.buffers.color.setClear( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha, _premultipliedAlpha ); }; 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 ); }; // Reset this.resetGLState = resetGLState; this.dispose = function () { _canvas.removeEventListener( 'webglcontextlost', onContextLost, false ); renderLists.dispose(); }; // Events function onContextLost( event ) { event.preventDefault(); resetGLState(); setDefaultGLState(); properties.clear(); objects.clear(); } 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.shading === FlatShading$1 ) { 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( attributes.uv, 2, _gl.FLOAT, false, 0, 0 ); } if ( object.hasColors && material.vertexColors !== NoColors$1 ) { _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; }; function absNumericalSort( a, b ) { return Math.abs( b[ 0 ] ) - Math.abs( a[ 0 ] ); } this.renderBufferDirect = function ( camera, fog, geometry, material, object, group ) { state.setMaterial( material ); 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; } // morph targets var morphTargetInfluences = object.morphTargetInfluences; if ( morphTargetInfluences !== undefined ) { // TODO Remove allocations var activeInfluences = []; for ( var i = 0, l = morphTargetInfluences.length; i < l; i ++ ) { var influence = morphTargetInfluences[ i ]; activeInfluences.push( [ influence, i ] ); } activeInfluences.sort( absNumericalSort ); if ( activeInfluences.length > 8 ) { activeInfluences.length = 8; } var morphAttributes = geometry.morphAttributes; for ( var i = 0, l = activeInfluences.length; i < l; i ++ ) { var influence = activeInfluences[ i ]; morphInfluences[ i ] = influence[ 0 ]; if ( influence[ 0 ] !== 0 ) { var index = influence[ 1 ]; if ( material.morphTargets === true && morphAttributes.position ) geometry.addAttribute( 'morphTarget' + i, morphAttributes.position[ index ] ); if ( material.morphNormals === true && morphAttributes.normal ) geometry.addAttribute( 'morphNormal' + i, morphAttributes.normal[ index ] ); } else { if ( material.morphTargets === true ) geometry.removeAttribute( 'morphTarget' + i ); if ( material.morphNormals === true ) geometry.removeAttribute( 'morphNormal' + i ); } } for ( var i = activeInfluences.length, il = morphInfluences.length; i < il; i ++ ) { morphInfluences[ i ] = 0.0; } program.getUniforms().setValue( _gl, 'morphTargetInfluences', morphInfluences ); 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 renderer = bufferRenderer; if ( index !== null ) { renderer = indexedBufferRenderer; renderer.setIndex( index ); } if ( updateBuffers ) { setupVertexAttributes( material, program, geometry ); if ( index !== null ) { _gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, attributes.get( index ).buffer ); } } // var dataCount = 0; 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$1: renderer.setMode( _gl.TRIANGLES ); break; case TriangleStripDrawMode$1: renderer.setMode( _gl.TRIANGLE_STRIP ); break; case TriangleFanDrawMode$1: 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, startIndex ) { 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; } } if ( startIndex === undefined ) startIndex = 0; 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 attributeProperties = attributes.get( geometryAttribute ); var buffer = attributeProperties.buffer; var type = attributeProperties.type; var bytesPerElement = attributeProperties.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, ( startIndex * stride + 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, startIndex * size * bytesPerElement ); } } 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 ) { lights = []; scene.traverse( function ( object ) { if ( object.isLight ) { lights.push( object ); } } ); setupLights( lights, 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 ); } } } ); }; // Rendering this.render = function ( scene, camera, renderTarget, forceClear ) { if ( camera !== undefined && camera.isCamera !== true ) { console.error( 'THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.' ); 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 camera.onBeforeRender( _this ); if ( camera.parent === null ) camera.updateMatrixWorld(); camera.matrixWorldInverse.getInverse( camera.matrixWorld ); _projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse ); _frustum.setFromMatrix( _projScreenMatrix ); lights.length = 0; sprites.length = 0; lensFlares.length = 0; _localClippingEnabled = this.localClippingEnabled; _clippingEnabled = _clipping.init( this.clippingPlanes, _localClippingEnabled, camera ); currentRenderList = renderLists.get( scene, camera ); currentRenderList.init(); projectObject( scene, camera, _this.sortObjects ); currentRenderList.finish(); if ( _this.sortObjects === true ) { currentRenderList.sort(); } // if ( _clippingEnabled ) _clipping.beginShadows(); setupShadows( lights ); shadowMap.render( scene, camera ); setupLights( lights, camera ); if ( _clippingEnabled ) _clipping.endShadows(); // _infoRender.frame ++; _infoRender.calls = 0; _infoRender.vertices = 0; _infoRender.faces = 0; _infoRender.points = 0; if ( renderTarget === undefined ) { renderTarget = null; } this.setRenderTarget( renderTarget ); // var background = scene.background; if ( background === null ) { state.buffers.color.setClear( _clearColor.r, _clearColor.g, _clearColor.b, _clearAlpha, _premultipliedAlpha ); } else if ( background && background.isColor ) { state.buffers.color.setClear( background.r, background.g, background.b, 1, _premultipliedAlpha ); forceClear = true; } if ( this.autoClear || forceClear ) { this.clear( this.autoClearColor, this.autoClearDepth, this.autoClearStencil ); } if ( background && background.isCubeTexture ) { if ( backgroundBoxCamera === undefined ) { backgroundBoxCamera = new PerspectiveCamera$2(); backgroundBoxMesh = new Mesh$1( new BoxBufferGeometry$1( 5, 5, 5 ), new ShaderMaterial$1( { uniforms: ShaderLib$1.cube.uniforms, vertexShader: ShaderLib$1.cube.vertexShader, fragmentShader: ShaderLib$1.cube.fragmentShader, side: BackSide$1, depthTest: false, depthWrite: false, fog: false } ) ); } backgroundBoxCamera.projectionMatrix.copy( camera.projectionMatrix ); backgroundBoxCamera.matrixWorld.extractRotation( camera.matrixWorld ); backgroundBoxCamera.matrixWorldInverse.getInverse( backgroundBoxCamera.matrixWorld ); backgroundBoxMesh.material.uniforms[ "tCube" ].value = background; backgroundBoxMesh.modelViewMatrix.multiplyMatrices( backgroundBoxCamera.matrixWorldInverse, backgroundBoxMesh.matrixWorld ); objects.update( backgroundBoxMesh ); _this.renderBufferDirect( backgroundBoxCamera, null, backgroundBoxMesh.geometry, backgroundBoxMesh.material, backgroundBoxMesh, null ); } else if ( background && background.isTexture ) { if ( backgroundPlaneCamera === undefined ) { backgroundPlaneCamera = new OrthographicCamera$2( - 1, 1, 1, - 1, 0, 1 ); backgroundPlaneMesh = new Mesh$1( new PlaneBufferGeometry$1( 2, 2 ), new MeshBasicMaterial$1( { depthTest: false, depthWrite: false, fog: false } ) ); } backgroundPlaneMesh.material.map = background; objects.update( backgroundPlaneMesh ); _this.renderBufferDirect( backgroundPlaneCamera, null, backgroundPlaneMesh.geometry, backgroundPlaneMesh.material, backgroundPlaneMesh, null ); } // 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 render plugins (post pass) spritePlugin.render( scene, camera ); lensFlarePlugin.render( scene, camera, _currentViewport ); // 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 ); if ( camera.isArrayCamera && camera.enabled ) { _this.setScissorTest( false ); } camera.onAfterRender( _this ); // _gl.finish(); }; /* // 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 ) return; var visible = object.layers.test( camera.layers ); if ( visible ) { if ( object.isLight ) { lights.push( object ); } else if ( object.isSprite ) { if ( ! object.frustumCulled || _frustum.intersectsSprite( object ) ) { sprites.push( object ); } } else if ( object.isLensFlare ) { lensFlares.push( 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; object.onBeforeRender( _this, scene, camera, geometry, material, group ); if ( camera.isArrayCamera && camera.enabled ) { var cameras = camera.cameras; for ( var j = 0, jl = cameras.length; j < jl; j ++ ) { var camera2 = cameras[ j ]; var bounds = camera2.bounds; _this.setViewport( bounds.x * _width * _pixelRatio, bounds.y * _height * _pixelRatio, bounds.z * _width * _pixelRatio, bounds.w * _height * _pixelRatio ); _this.setScissor( bounds.x * _width * _pixelRatio, bounds.y * _height * _pixelRatio, bounds.z * _width * _pixelRatio, bounds.w * _height * _pixelRatio ); _this.setScissorTest( true ); renderObject( object, scene, camera2, geometry, material, group ); } } else { renderObject( object, scene, camera, geometry, material, group ); } object.onAfterRender( _this, scene, camera, geometry, material, group ); } } function renderObject( object, scene, camera, geometry, material, group ) { object.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld ); object.normalMatrix.getNormalMatrix( object.modelViewMatrix ); if ( object.isImmediateRenderObject ) { state.setMaterial( material ); var program = setProgram( camera, scene.fog, material, object ); _currentGeometryProgram = ''; renderObjectImmediate( object, program, material ); } else { _this.renderBufferDirect( camera, scene.fog, geometry, material, object, group ); } } function initMaterial( material, fog, object ) { var materialProperties = properties.get( material ); var parameters = programCache.getParameters( material, _lights, 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 ( parameters.shaderID !== undefined ) { // same glsl and uniform list return; } else { // only rebuild uniform list programChange = false; } if ( programChange ) { if ( parameters.shaderID ) { var shader = ShaderLib$1[ parameters.shaderID ]; materialProperties.__webglShader = { name: material.type, uniforms: UniformsUtils$1.clone( shader.uniforms ), vertexShader: shader.vertexShader, fragmentShader: shader.fragmentShader }; } else { materialProperties.__webglShader = { name: material.type, uniforms: material.uniforms, vertexShader: material.vertexShader, fragmentShader: material.fragmentShader }; } material.__webglShader = materialProperties.__webglShader; program = programCache.acquireProgram( material, 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.__webglShader.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.hash; if ( material.lights ) { // wire up the material to this renderer's lighting state uniforms.ambientLightColor.value = _lights.ambient; uniforms.directionalLights.value = _lights.directional; uniforms.spotLights.value = _lights.spot; uniforms.rectAreaLights.value = _lights.rectArea; uniforms.pointLights.value = _lights.point; uniforms.hemisphereLights.value = _lights.hemi; uniforms.directionalShadowMap.value = _lights.directionalShadowMap; uniforms.directionalShadowMatrix.value = _lights.directionalShadowMatrix; uniforms.spotShadowMap.value = _lights.spotShadowMap; uniforms.spotShadowMatrix.value = _lights.spotShadowMatrix; uniforms.pointShadowMap.value = _lights.pointShadowMap; uniforms.pointShadowMatrix.value = _lights.pointShadowMatrix; // TODO (abelnation): add area lights shadow info to uniforms } var progUniforms = materialProperties.program.getUniforms(), uniformsList = WebGLUniforms$1.seqWithValue( progUniforms.seq, uniforms ); materialProperties.uniformsList = uniformsList; } function setProgram( camera, fog, material, object ) { _usedTextureUnits = 0; var materialProperties = properties.get( material ); 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.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.__webglShader.uniforms; if ( program.id !== _currentProgram ) { _gl.useProgram( program.program ); _currentProgram = program.id; 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 ) ); } if ( camera !== _currentCamera ) { _currentCamera = 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 ); } p_uniforms.setValue( _gl, 'toneMappingExposure', _this.toneMappingExposure ); p_uniforms.setValue( _gl, 'toneMappingWhitePoint', _this.toneMappingWhitePoint ); } // 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$1.nextPowerOfTwo( Math.ceil( 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$1( boneMatrices, size, size, RGBAFormat$1, FloatType$1 ); 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 ) { 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 || material.isMeshLambertMaterial || material.isMeshPhongMaterial || material.isMeshStandardMaterial || material.isMeshNormalMaterial || material.isMeshDepthMaterial ) { refreshUniformsCommon( m_uniforms, material ); } // refresh single material specific uniforms if ( material.isLineBasicMaterial ) { refreshUniformsLine( m_uniforms, material ); } else if ( material.isLineDashedMaterial ) { refreshUniformsLine( m_uniforms, material ); refreshUniformsDash( m_uniforms, material ); } else if ( material.isPointsMaterial ) { refreshUniformsPoints( m_uniforms, material ); } else if ( material.isMeshLambertMaterial ) { refreshUniformsLambert( m_uniforms, material ); } else if ( material.isMeshToonMaterial ) { refreshUniformsToon( m_uniforms, material ); } else if ( material.isMeshPhongMaterial ) { refreshUniformsPhong( m_uniforms, material ); } else if ( material.isMeshPhysicalMaterial ) { refreshUniformsPhysical( m_uniforms, material ); } else if ( material.isMeshStandardMaterial ) { refreshUniformsStandard( m_uniforms, material ); } else if ( material.isMeshDepthMaterial ) { if ( material.displacementMap ) { m_uniforms.displacementMap.value = material.displacementMap; m_uniforms.displacementScale.value = material.displacementScale; m_uniforms.displacementBias.value = material.displacementBias; } } else if ( material.isMeshNormalMaterial ) { refreshUniformsNormal( m_uniforms, material ); } // RectAreaLight Texture // TODO (mrdoob): Find a nicer implementation if ( m_uniforms.ltcMat !== undefined ) m_uniforms.ltcMat.value = UniformsLib$1.LTC_MAT_TEXTURE; if ( m_uniforms.ltcMag !== undefined ) m_uniforms.ltcMag.value = UniformsLib$1.LTC_MAG_TEXTURE; WebGLUniforms$1.upload( _gl, materialProperties.uniformsList, m_uniforms, _this ); } // 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; uniforms.diffuse.value = material.color; if ( material.emissive ) { uniforms.emissive.value.copy( material.emissive ).multiplyScalar( material.emissiveIntensity ); } uniforms.map.value = material.map; uniforms.specularMap.value = material.specularMap; uniforms.alphaMap.value = material.alphaMap; 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; } var offset = uvScaleMap.offset; var repeat = uvScaleMap.repeat; uniforms.offsetRepeat.value.set( offset.x, offset.y, repeat.x, repeat.y ); } 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; } 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 ) { var offset = material.map.offset; var repeat = material.map.repeat; uniforms.offsetRepeat.value.set( offset.x, offset.y, repeat.x, repeat.y ); } } 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 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; } // Lighting function setupShadows( lights ) { var lightShadowsLength = 0; for ( var i = 0, l = lights.length; i < l; i ++ ) { var light = lights[ i ]; if ( light.castShadow ) { _lights.shadows[ lightShadowsLength ] = light; lightShadowsLength ++; } } _lights.shadows.length = lightShadowsLength; } function setupLights( lights, camera ) { var l, ll, light, shadow, r = 0, g = 0, b = 0, color, intensity, distance, shadowMap, viewMatrix = camera.matrixWorldInverse, directionalLength = 0, pointLength = 0, spotLength = 0, rectAreaLength = 0, hemiLength = 0; for ( l = 0, ll = lights.length; l < ll; l ++ ) { light = lights[ l ]; color = light.color; intensity = light.intensity; distance = light.distance; 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 = lightCache.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 ) { shadow = light.shadow; uniforms.shadowBias = shadow.bias; uniforms.shadowRadius = shadow.radius; uniforms.shadowMapSize = shadow.mapSize; } _lights.directionalShadowMap[ directionalLength ] = shadowMap; _lights.directionalShadowMatrix[ directionalLength ] = light.shadow.matrix; _lights.directional[ directionalLength ] = uniforms; directionalLength ++; } else if ( light.isSpotLight ) { var uniforms = lightCache.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 ) { shadow = light.shadow; uniforms.shadowBias = shadow.bias; uniforms.shadowRadius = shadow.radius; uniforms.shadowMapSize = shadow.mapSize; } _lights.spotShadowMap[ spotLength ] = shadowMap; _lights.spotShadowMatrix[ spotLength ] = light.shadow.matrix; _lights.spot[ spotLength ] = uniforms; spotLength ++; } else if ( light.isRectAreaLight ) { var uniforms = lightCache.get( light ); // (a) intensity controls irradiance of entire light uniforms.color .copy( color ) .multiplyScalar( intensity / ( light.width * light.height ) ); // (b) intensity controls the radiance per light area // 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; _lights.rectArea[ rectAreaLength ] = uniforms; rectAreaLength ++; } else if ( light.isPointLight ) { var uniforms = lightCache.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 ) { shadow = light.shadow; uniforms.shadowBias = shadow.bias; uniforms.shadowRadius = shadow.radius; uniforms.shadowMapSize = shadow.mapSize; } _lights.pointShadowMap[ pointLength ] = shadowMap; _lights.pointShadowMatrix[ pointLength ] = light.shadow.matrix; _lights.point[ pointLength ] = uniforms; pointLength ++; } else if ( light.isHemisphereLight ) { var uniforms = lightCache.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 ); _lights.hemi[ hemiLength ] = uniforms; hemiLength ++; } } _lights.ambient[ 0 ] = r; _lights.ambient[ 1 ] = g; _lights.ambient[ 2 ] = b; _lights.directional.length = directionalLength; _lights.spot.length = spotLength; _lights.rectArea.length = rectAreaLength; _lights.point.length = pointLength; _lights.hemi.length = hemiLength; // TODO (sam-g-steel) why aren't we using join _lights.hash = directionalLength + ',' + pointLength + ',' + spotLength + ',' + rectAreaLength + ',' + hemiLength + ',' + _lights.shadows.length; } // GL state setting this.setFaceCulling = function ( cullFace, frontFaceDirection ) { state.setCullFace( cullFace ); state.setFlipSided( frontFaceDirection === FrontFaceDirectionCW ); }; // Textures function allocTextureUnit() { var textureUnit = _usedTextureUnits; if ( textureUnit >= capabilities.maxTextures ) { console.warn( '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 isCube = ( renderTarget && renderTarget.isWebGLRenderTargetCube ); var framebuffer; if ( renderTarget ) { var renderTargetProperties = properties.get( renderTarget ); if ( isCube ) { framebuffer = renderTargetProperties.__webglFramebuffer[ renderTarget.activeCubeFace ]; } else { framebuffer = renderTargetProperties.__webglFramebuffer; } _currentScissor.copy( renderTarget.scissor ); _currentScissorTest = renderTarget.scissorTest; _currentViewport.copy( renderTarget.viewport ); } else { framebuffer = null; _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ); _currentScissorTest = _scissorTest; _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ); } if ( _currentFramebuffer !== framebuffer ) { _gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer ); _currentFramebuffer = framebuffer; } state.scissor( _currentScissor ); state.setScissorTest( _currentScissorTest ); state.viewport( _currentViewport ); 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 ) === false ) { 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$1 && paramThreeToGL( 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$1 && paramThreeToGL( textureType ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_TYPE ) && // IE11, Edge and Chrome Mac < 52 (#9513) ! ( textureType === FloatType$1 && ( extensions.get( 'OES_texture_float' ) || extensions.get( 'WEBGL_color_buffer_float' ) ) ) && // Chrome Mac >= 52 and Firefox ! ( textureType === HalfFloatType$1 && 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, paramThreeToGL( textureFormat ), paramThreeToGL( textureType ), buffer ); } } else { console.error( 'THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete.' ); } } finally { if ( restore ) { _gl.bindFramebuffer( _gl.FRAMEBUFFER, _currentFramebuffer ); } } } }; // Map three.js constants to WebGL constants function paramThreeToGL( p ) { var extension; if ( p === RepeatWrapping$1 ) return _gl.REPEAT; if ( p === ClampToEdgeWrapping$1 ) return _gl.CLAMP_TO_EDGE; if ( p === MirroredRepeatWrapping$1 ) return _gl.MIRRORED_REPEAT; if ( p === NearestFilter$1 ) return _gl.NEAREST; if ( p === NearestMipMapNearestFilter$1 ) return _gl.NEAREST_MIPMAP_NEAREST; if ( p === NearestMipMapLinearFilter$1 ) return _gl.NEAREST_MIPMAP_LINEAR; if ( p === LinearFilter$1 ) return _gl.LINEAR; if ( p === LinearMipMapNearestFilter$1 ) return _gl.LINEAR_MIPMAP_NEAREST; if ( p === LinearMipMapLinearFilter$1 ) return _gl.LINEAR_MIPMAP_LINEAR; if ( p === UnsignedByteType$1 ) return _gl.UNSIGNED_BYTE; if ( p === UnsignedShort4444Type$1 ) return _gl.UNSIGNED_SHORT_4_4_4_4; if ( p === UnsignedShort5551Type$1 ) return _gl.UNSIGNED_SHORT_5_5_5_1; if ( p === UnsignedShort565Type$1 ) return _gl.UNSIGNED_SHORT_5_6_5; if ( p === ByteType$1 ) return _gl.BYTE; if ( p === ShortType$1 ) return _gl.SHORT; if ( p === UnsignedShortType$1 ) return _gl.UNSIGNED_SHORT; if ( p === IntType$1 ) return _gl.INT; if ( p === UnsignedIntType$1 ) return _gl.UNSIGNED_INT; if ( p === FloatType$1 ) return _gl.FLOAT; if ( p === HalfFloatType$1 ) { extension = extensions.get( 'OES_texture_half_float' ); if ( extension !== null ) return extension.HALF_FLOAT_OES; } if ( p === AlphaFormat$1 ) return _gl.ALPHA; if ( p === RGBFormat$1 ) return _gl.RGB; if ( p === RGBAFormat$1 ) return _gl.RGBA; if ( p === LuminanceFormat$1 ) return _gl.LUMINANCE; if ( p === LuminanceAlphaFormat$1 ) return _gl.LUMINANCE_ALPHA; if ( p === DepthFormat$1 ) return _gl.DEPTH_COMPONENT; if ( p === DepthStencilFormat$1 ) return _gl.DEPTH_STENCIL; if ( p === AddEquation$1 ) return _gl.FUNC_ADD; if ( p === SubtractEquation$1 ) return _gl.FUNC_SUBTRACT; if ( p === ReverseSubtractEquation$1 ) return _gl.FUNC_REVERSE_SUBTRACT; if ( p === ZeroFactor$1 ) return _gl.ZERO; if ( p === OneFactor$1 ) return _gl.ONE; if ( p === SrcColorFactor$1 ) return _gl.SRC_COLOR; if ( p === OneMinusSrcColorFactor$1 ) return _gl.ONE_MINUS_SRC_COLOR; if ( p === SrcAlphaFactor$1 ) return _gl.SRC_ALPHA; if ( p === OneMinusSrcAlphaFactor$1 ) return _gl.ONE_MINUS_SRC_ALPHA; if ( p === DstAlphaFactor$1 ) return _gl.DST_ALPHA; if ( p === OneMinusDstAlphaFactor$1 ) return _gl.ONE_MINUS_DST_ALPHA; if ( p === DstColorFactor$1 ) return _gl.DST_COLOR; if ( p === OneMinusDstColorFactor$1 ) return _gl.ONE_MINUS_DST_COLOR; if ( p === SrcAlphaSaturateFactor$1 ) return _gl.SRC_ALPHA_SATURATE; if ( p === RGB_S3TC_DXT1_Format$1 || p === RGBA_S3TC_DXT1_Format$1 || p === RGBA_S3TC_DXT3_Format$1 || p === RGBA_S3TC_DXT5_Format$1 ) { extension = extensions.get( 'WEBGL_compressed_texture_s3tc' ); if ( extension !== null ) { if ( p === RGB_S3TC_DXT1_Format$1 ) return extension.COMPRESSED_RGB_S3TC_DXT1_EXT; if ( p === RGBA_S3TC_DXT1_Format$1 ) return extension.COMPRESSED_RGBA_S3TC_DXT1_EXT; if ( p === RGBA_S3TC_DXT3_Format$1 ) return extension.COMPRESSED_RGBA_S3TC_DXT3_EXT; if ( p === RGBA_S3TC_DXT5_Format$1 ) return extension.COMPRESSED_RGBA_S3TC_DXT5_EXT; } } if ( p === RGB_PVRTC_4BPPV1_Format$1 || p === RGB_PVRTC_2BPPV1_Format$1 || p === RGBA_PVRTC_4BPPV1_Format$1 || p === RGBA_PVRTC_2BPPV1_Format$1 ) { extension = extensions.get( 'WEBGL_compressed_texture_pvrtc' ); if ( extension !== null ) { if ( p === RGB_PVRTC_4BPPV1_Format$1 ) return extension.COMPRESSED_RGB_PVRTC_4BPPV1_IMG; if ( p === RGB_PVRTC_2BPPV1_Format$1 ) return extension.COMPRESSED_RGB_PVRTC_2BPPV1_IMG; if ( p === RGBA_PVRTC_4BPPV1_Format$1 ) return extension.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG; if ( p === RGBA_PVRTC_2BPPV1_Format$1 ) return extension.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG; } } if ( p === RGB_ETC1_Format$1 ) { extension = extensions.get( 'WEBGL_compressed_texture_etc1' ); if ( extension !== null ) return extension.COMPRESSED_RGB_ETC1_WEBGL; } if ( p === MinEquation$1 || p === MaxEquation$1 ) { extension = extensions.get( 'EXT_blend_minmax' ); if ( extension !== null ) { if ( p === MinEquation$1 ) return extension.MIN_EXT; if ( p === MaxEquation$1 ) return extension.MAX_EXT; } } if ( p === UnsignedInt248Type$1 ) { extension = extensions.get( 'WEBGL_depth_texture' ); if ( extension !== null ) return extension.UNSIGNED_INT_24_8_WEBGL; } return 0; } } /** * @author mrdoob / http://mrdoob.com/ * @author alteredq / http://alteredqualia.com/ */ function FogExp2$1 ( color, density ) { this.name = ''; this.color = new Color$1( color ); this.density = ( density !== undefined ) ? density : 0.00025; } FogExp2$1.prototype.isFogExp2 = true; FogExp2$1.prototype.clone = function () { return new FogExp2$1( this.color.getHex(), this.density ); }; FogExp2$1.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$1 ( color, near, far ) { this.name = ''; this.color = new Color$1( color ); this.near = ( near !== undefined ) ? near : 1; this.far = ( far !== undefined ) ? far : 1000; } Fog$1.prototype.isFog = true; Fog$1.prototype.clone = function () { return new Fog$1( this.color.getHex(), this.near, this.far ); }; Fog$1.prototype.toJSON = function ( meta ) { return { type: 'Fog', color: this.color.getHex(), near: this.near, far: this.far }; }; /** * @author mrdoob / http://mrdoob.com/ */ function Scene$1 () { Object3D$1.call( this ); this.type = 'Scene'; this.background = null; this.fog = null; this.overrideMaterial = null; this.autoUpdate = true; // checked by the renderer } Scene$1.prototype = Object.assign( Object.create( Object3D$1.prototype ), { constructor: Scene$1, copy: function ( source, recursive ) { Object3D$1.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$1.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 mikael emtinger / http://gomo.se/ * @author alteredq / http://alteredqualia.com/ */ function LensFlare( texture, size, distance, blending, color ) { Object3D$1.call( this ); this.lensFlares = []; this.positionScreen = new Vector3$1(); this.customUpdateCallback = undefined; if ( texture !== undefined ) { this.add( texture, size, distance, blending, color ); } } LensFlare.prototype = Object.assign( Object.create( Object3D$1.prototype ), { constructor: LensFlare, isLensFlare: true, copy: function ( source ) { Object3D$1.prototype.copy.call( this, source ); this.positionScreen.copy( source.positionScreen ); this.customUpdateCallback = source.customUpdateCallback; for ( var i = 0, l = source.lensFlares.length; i < l; i ++ ) { this.lensFlares.push( source.lensFlares[ i ] ); } return this; }, add: function ( texture, size, distance, blending, color, opacity ) { if ( size === undefined ) size = - 1; if ( distance === undefined ) distance = 0; if ( opacity === undefined ) opacity = 1; if ( color === undefined ) color = new Color$1( 0xffffff ); if ( blending === undefined ) blending = NormalBlending$1; distance = Math.min( distance, Math.max( 0, distance ) ); this.lensFlares.push( { texture: texture, // THREE.Texture size: size, // size in pixels (-1 = use texture.width) distance: distance, // distance (0-1) from light source (0=at light source) x: 0, y: 0, z: 0, // screen position (-1 => 1) z = 0 is in front z = 1 is back scale: 1, // scale rotation: 0, // rotation opacity: opacity, // opacity color: color, // color blending: blending // blending } ); }, /* * Update lens flares update positions on all flares based on the screen position * Set myLensFlare.customUpdateCallback to alter the flares in your project specific way. */ updateLensFlares: function () { var f, fl = this.lensFlares.length; var flare; var vecX = - this.positionScreen.x * 2; var vecY = - this.positionScreen.y * 2; for ( f = 0; f < fl; f ++ ) { flare = this.lensFlares[ f ]; flare.x = this.positionScreen.x + vecX * flare.distance; flare.y = this.positionScreen.y + vecY * flare.distance; flare.wantedRotation = flare.x * Math.PI * 0.25; flare.rotation += ( flare.wantedRotation - flare.rotation ) * 0.25; } } } ); /** * @author alteredq / http://alteredqualia.com/ * * parameters = { * color: , * opacity: , * map: new THREE.Texture( ), * * uvOffset: new THREE.Vector2(), * uvScale: new THREE.Vector2() * } */ function SpriteMaterial$1( parameters ) { Material$1.call( this ); this.type = 'SpriteMaterial'; this.color = new Color$1( 0xffffff ); this.map = null; this.rotation = 0; this.fog = false; this.lights = false; this.setValues( parameters ); } SpriteMaterial$1.prototype = Object.create( Material$1.prototype ); SpriteMaterial$1.prototype.constructor = SpriteMaterial$1; SpriteMaterial$1.prototype.isSpriteMaterial = true; SpriteMaterial$1.prototype.copy = function ( source ) { Material$1.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$1( material ) { Object3D$1.call( this ); this.type = 'Sprite'; this.material = ( material !== undefined ) ? material : new SpriteMaterial$1(); } Sprite$1.prototype = Object.assign( Object.create( Object3D$1.prototype ), { constructor: Sprite$1, isSprite: true, raycast: ( function () { var intersectPoint = new Vector3$1(); var worldPosition = new Vector3$1(); var worldScale = new Vector3$1(); 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 ); } } ); /** * @author mikael emtinger / http://gomo.se/ * @author alteredq / http://alteredqualia.com/ * @author mrdoob / http://mrdoob.com/ */ function LOD$1() { Object3D$1.call( this ); this.type = 'LOD'; Object.defineProperties( this, { levels: { enumerable: true, value: [] } } ); } LOD$1.prototype = Object.assign( Object.create( Object3D$1.prototype ), { constructor: LOD$1, copy: function ( source ) { Object3D$1.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$1(); 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$1(); var v2 = new Vector3$1(); 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$1.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$1( 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$1() ); } } } } Object.assign( Skeleton$1.prototype, { calculateInverses: function () { this.boneInverses = []; for ( var i = 0, il = this.bones.length; i < il; i ++ ) { var inverse = new Matrix4$1(); 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$1(); var identityMatrix = new Matrix4$1(); 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$1( this.bones, this.boneInverses ); } } ); /** * @author mikael emtinger / http://gomo.se/ * @author alteredq / http://alteredqualia.com/ * @author ikerr / http://verold.com */ function Bone$1() { Object3D$1.call( this ); this.type = 'Bone'; } Bone$1.prototype = Object.assign( Object.create( Object3D$1.prototype ), { constructor: Bone$1, isBone: true } ); /** * @author mikael emtinger / http://gomo.se/ * @author alteredq / http://alteredqualia.com/ * @author ikerr / http://verold.com */ function SkinnedMesh$1( geometry, material ) { Mesh$1.call( this, geometry, material ); this.type = 'SkinnedMesh'; this.bindMode = 'attached'; this.bindMatrix = new Matrix4$1(); this.bindMatrixInverse = new Matrix4$1(); var bones = this.initBones(); var skeleton = new Skeleton$1( bones ); this.bind( skeleton, this.matrixWorld ); this.normalizeSkinWeights(); } SkinnedMesh$1.prototype = Object.assign( Object.create( Mesh$1.prototype ), { constructor: SkinnedMesh$1, 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$1(); 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.lengthManhattan(); 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$1(); 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.lengthManhattan(); 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$1.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: , * opacity: , * * linewidth: , * linecap: "round", * linejoin: "round" * } */ function LineBasicMaterial$1( parameters ) { Material$1.call( this ); this.type = 'LineBasicMaterial'; this.color = new Color$1( 0xffffff ); this.linewidth = 1; this.linecap = 'round'; this.linejoin = 'round'; this.lights = false; this.setValues( parameters ); } LineBasicMaterial$1.prototype = Object.create( Material$1.prototype ); LineBasicMaterial$1.prototype.constructor = LineBasicMaterial$1; LineBasicMaterial$1.prototype.isLineBasicMaterial = true; LineBasicMaterial$1.prototype.copy = function ( source ) { Material$1.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$2( geometry, material, mode ) { if ( mode === 1 ) { console.warn( 'THREE.Line: parameter THREE.LinePieces no longer supported. Created THREE.LineSegments instead.' ); return new LineSegments$1( geometry, material ); } Object3D$1.call( this ); this.type = 'Line'; this.geometry = geometry !== undefined ? geometry : new BufferGeometry$1(); this.material = material !== undefined ? material : new LineBasicMaterial$1( { color: Math.random() * 0xffffff } ); } Line$2.prototype = Object.assign( Object.create( Object3D$1.prototype ), { constructor: Line$2, isLine: true, raycast: ( function () { var inverseMatrix = new Matrix4$1(); var ray = new Ray$1(); var sphere = new Sphere$2(); 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$1(); var vEnd = new Vector3$1(); var interSegment = new Vector3$1(); var interRay = new Vector3$1(); 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$1( geometry, material ) { Line$2.call( this, geometry, material ); this.type = 'LineSegments'; } LineSegments$1.prototype = Object.assign( Object.create( Line$2.prototype ), { constructor: LineSegments$1, isLineSegments: true } ); /** * @author mgreter / http://github.com/mgreter */ function LineLoop$1( geometry, material ) { Line$2.call( this, geometry, material ); this.type = 'LineLoop'; } LineLoop$1.prototype = Object.assign( Object.create( Line$2.prototype ), { constructor: LineLoop$1, isLineLoop: true, } ); /** * @author mrdoob / http://mrdoob.com/ * @author alteredq / http://alteredqualia.com/ * * parameters = { * color: , * opacity: , * map: new THREE.Texture( ), * * size: , * sizeAttenuation: * } */ function PointsMaterial$1( parameters ) { Material$1.call( this ); this.type = 'PointsMaterial'; this.color = new Color$1( 0xffffff ); this.map = null; this.size = 1; this.sizeAttenuation = true; this.lights = false; this.setValues( parameters ); } PointsMaterial$1.prototype = Object.create( Material$1.prototype ); PointsMaterial$1.prototype.constructor = PointsMaterial$1; PointsMaterial$1.prototype.isPointsMaterial = true; PointsMaterial$1.prototype.copy = function ( source ) { Material$1.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$1( geometry, material ) { Object3D$1.call( this ); this.type = 'Points'; this.geometry = geometry !== undefined ? geometry : new BufferGeometry$1(); this.material = material !== undefined ? material : new PointsMaterial$1( { color: Math.random() * 0xffffff } ); } Points$1.prototype = Object.assign( Object.create( Object3D$1.prototype ), { constructor: Points$1, isPoints: true, raycast: ( function () { var inverseMatrix = new Matrix4$1(); var ray = new Ray$1(); var sphere = new Sphere$2(); 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$1(); function testPoint( point, index ) { var rayPointDistanceSq = ray.distanceSqToPoint( point ); if ( rayPointDistanceSq < localThresholdSq ) { var intersectPoint = ray.closestPointToPoint( point ); 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$2() { Object3D$1.call( this ); this.type = 'Group'; } Group$2.prototype = Object.assign( Object.create( Object3D$1.prototype ), { constructor: Group$2 } ); /** * @author mrdoob / http://mrdoob.com/ */ function VideoTexture$1( video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) { Texture$1.call( this, video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ); this.generateMipmaps = false; var scope = this; function update() { requestAnimationFrame( update ); if ( video.readyState >= video.HAVE_CURRENT_DATA ) { scope.needsUpdate = true; } } update(); } VideoTexture$1.prototype = Object.create( Texture$1.prototype ); VideoTexture$1.prototype.constructor = VideoTexture$1; /** * @author alteredq / http://alteredqualia.com/ */ function CompressedTexture$1( mipmaps, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, encoding ) { Texture$1.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$1.prototype = Object.create( Texture$1.prototype ); CompressedTexture$1.prototype.constructor = CompressedTexture$1; CompressedTexture$1.prototype.isCompressedTexture = true; /** * @author mrdoob / http://mrdoob.com/ */ function CanvasTexture$1( canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) { Texture$1.call( this, canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ); this.needsUpdate = true; } CanvasTexture$1.prototype = Object.create( Texture$1.prototype ); CanvasTexture$1.prototype.constructor = CanvasTexture$1; /** * @author Matt DesLauriers / @mattdesl * @author atix / arthursilber.de */ function DepthTexture$1( width, height, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, format ) { format = format !== undefined ? format : DepthFormat$1; if ( format !== DepthFormat$1 && format !== DepthStencilFormat$1 ) { throw new Error( 'DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat' ) } if ( type === undefined && format === DepthFormat$1 ) type = UnsignedShortType$1; if ( type === undefined && format === DepthStencilFormat$1 ) type = UnsignedInt248Type$1; Texture$1.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ); this.image = { width: width, height: height }; this.magFilter = magFilter !== undefined ? magFilter : NearestFilter$1; this.minFilter = minFilter !== undefined ? minFilter : NearestFilter$1; this.flipY = false; this.generateMipmaps = false; } DepthTexture$1.prototype = Object.create( Texture$1.prototype ); DepthTexture$1.prototype.constructor = DepthTexture$1; DepthTexture$1.prototype.isDepthTexture = true; /** * @author mrdoob / http://mrdoob.com/ * @author Mugen87 / https://github.com/Mugen87 */ function WireframeGeometry$1( geometry ) { BufferGeometry$1.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$1(); 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$1( vertices, 3 ) ); } WireframeGeometry$1.prototype = Object.create( BufferGeometry$1.prototype ); WireframeGeometry$1.prototype.constructor = WireframeGeometry$1; /** * @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$1( func, slices, stacks ) { Geometry$1.call( this ); this.type = 'ParametricGeometry'; this.parameters = { func: func, slices: slices, stacks: stacks }; this.fromBufferGeometry( new ParametricBufferGeometry$1( func, slices, stacks ) ); this.mergeVertices(); } ParametricGeometry$1.prototype = Object.create( Geometry$1.prototype ); ParametricGeometry$1.prototype.constructor = ParametricGeometry$1; // ParametricBufferGeometry function ParametricBufferGeometry$1( func, slices, stacks ) { BufferGeometry$1.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$1(); var p0 = new Vector3$1(), p1 = new Vector3$1(); var pu = new Vector3$1(), pv = new Vector3$1(); 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 p0 = func( u, v, p0 ); vertices.push( p0.x, p0.y, p0.z ); // normal // approximate tangent vectors via finite differences if ( u - EPS >= 0 ) { p1 = func( u - EPS, v, p1 ); pu.subVectors( p0, p1 ); } else { p1 = func( u + EPS, v, p1 ); pu.subVectors( p1, p0 ); } if ( v - EPS >= 0 ) { p1 = func( u, v - EPS, p1 ); pv.subVectors( p0, p1 ); } else { p1 = 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$1( vertices, 3 ) ); this.addAttribute( 'normal', new Float32BufferAttribute$1( normals, 3 ) ); this.addAttribute( 'uv', new Float32BufferAttribute$1( uvs, 2 ) ); } ParametricBufferGeometry$1.prototype = Object.create( BufferGeometry$1.prototype ); ParametricBufferGeometry$1.prototype.constructor = ParametricBufferGeometry$1; /** * @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$1( vertices, indices, radius, detail ) { Geometry$1.call( this ); this.type = 'PolyhedronGeometry'; this.parameters = { vertices: vertices, indices: indices, radius: radius, detail: detail }; this.fromBufferGeometry( new PolyhedronBufferGeometry$1( vertices, indices, radius, detail ) ); this.mergeVertices(); } PolyhedronGeometry$1.prototype = Object.create( Geometry$1.prototype ); PolyhedronGeometry$1.prototype.constructor = PolyhedronGeometry$1; // PolyhedronBufferGeometry function PolyhedronBufferGeometry$1( vertices, indices, radius, detail ) { BufferGeometry$1.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$1( vertexBuffer, 3 ) ); this.addAttribute( 'normal', new Float32BufferAttribute$1( vertexBuffer.slice(), 3 ) ); this.addAttribute( 'uv', new Float32BufferAttribute$1( uvBuffer, 2 ) ); this.normalizeNormals(); // helper functions function subdivide( detail ) { var a = new Vector3$1(); var b = new Vector3$1(); var c = new Vector3$1(); // 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$1(); // 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$1(); 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$1(); var b = new Vector3$1(); var c = new Vector3$1(); var centroid = new Vector3$1(); var uvA = new Vector2$1(); var uvB = new Vector2$1(); var uvC = new Vector2$1(); 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$1.prototype = Object.create( BufferGeometry$1.prototype ); PolyhedronBufferGeometry$1.prototype.constructor = PolyhedronBufferGeometry$1; /** * @author timothypratley / https://github.com/timothypratley * @author Mugen87 / https://github.com/Mugen87 */ // TetrahedronGeometry function TetrahedronGeometry$1( radius, detail ) { Geometry$1.call( this ); this.type = 'TetrahedronGeometry'; this.parameters = { radius: radius, detail: detail }; this.fromBufferGeometry( new TetrahedronBufferGeometry$1( radius, detail ) ); this.mergeVertices(); } TetrahedronGeometry$1.prototype = Object.create( Geometry$1.prototype ); TetrahedronGeometry$1.prototype.constructor = TetrahedronGeometry$1; // TetrahedronBufferGeometry function TetrahedronBufferGeometry$1( 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$1.call( this, vertices, indices, radius, detail ); this.type = 'TetrahedronBufferGeometry'; this.parameters = { radius: radius, detail: detail }; } TetrahedronBufferGeometry$1.prototype = Object.create( PolyhedronBufferGeometry$1.prototype ); TetrahedronBufferGeometry$1.prototype.constructor = TetrahedronBufferGeometry$1; /** * @author timothypratley / https://github.com/timothypratley * @author Mugen87 / https://github.com/Mugen87 */ // OctahedronGeometry function OctahedronGeometry$1( radius, detail ) { Geometry$1.call( this ); this.type = 'OctahedronGeometry'; this.parameters = { radius: radius, detail: detail }; this.fromBufferGeometry( new OctahedronBufferGeometry$1( radius, detail ) ); this.mergeVertices(); } OctahedronGeometry$1.prototype = Object.create( Geometry$1.prototype ); OctahedronGeometry$1.prototype.constructor = OctahedronGeometry$1; // OctahedronBufferGeometry function OctahedronBufferGeometry$1( 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$1.call( this, vertices, indices, radius, detail ); this.type = 'OctahedronBufferGeometry'; this.parameters = { radius: radius, detail: detail }; } OctahedronBufferGeometry$1.prototype = Object.create( PolyhedronBufferGeometry$1.prototype ); OctahedronBufferGeometry$1.prototype.constructor = OctahedronBufferGeometry$1; /** * @author timothypratley / https://github.com/timothypratley * @author Mugen87 / https://github.com/Mugen87 */ // IcosahedronGeometry function IcosahedronGeometry$1( radius, detail ) { Geometry$1.call( this ); this.type = 'IcosahedronGeometry'; this.parameters = { radius: radius, detail: detail }; this.fromBufferGeometry( new IcosahedronBufferGeometry$1( radius, detail ) ); this.mergeVertices(); } IcosahedronGeometry$1.prototype = Object.create( Geometry$1.prototype ); IcosahedronGeometry$1.prototype.constructor = IcosahedronGeometry$1; // IcosahedronBufferGeometry function IcosahedronBufferGeometry$1( 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$1.call( this, vertices, indices, radius, detail ); this.type = 'IcosahedronBufferGeometry'; this.parameters = { radius: radius, detail: detail }; } IcosahedronBufferGeometry$1.prototype = Object.create( PolyhedronBufferGeometry$1.prototype ); IcosahedronBufferGeometry$1.prototype.constructor = IcosahedronBufferGeometry$1; /** * @author Abe Pazos / https://hamoid.com * @author Mugen87 / https://github.com/Mugen87 */ // DodecahedronGeometry function DodecahedronGeometry$1( radius, detail ) { Geometry$1.call( this ); this.type = 'DodecahedronGeometry'; this.parameters = { radius: radius, detail: detail }; this.fromBufferGeometry( new DodecahedronBufferGeometry$1( radius, detail ) ); this.mergeVertices(); } DodecahedronGeometry$1.prototype = Object.create( Geometry$1.prototype ); DodecahedronGeometry$1.prototype.constructor = DodecahedronGeometry$1; // DodecahedronBufferGeometry function DodecahedronBufferGeometry$1( 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$1.call( this, vertices, indices, radius, detail ); this.type = 'DodecahedronBufferGeometry'; this.parameters = { radius: radius, detail: detail }; } DodecahedronBufferGeometry$1.prototype = Object.create( PolyhedronBufferGeometry$1.prototype ); DodecahedronBufferGeometry$1.prototype.constructor = DodecahedronBufferGeometry$1; /** * @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$1( path, tubularSegments, radius, radialSegments, closed, taper ) { Geometry$1.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$1( 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$1.prototype = Object.create( Geometry$1.prototype ); TubeGeometry$1.prototype.constructor = TubeGeometry$1; // TubeBufferGeometry function TubeBufferGeometry$1( path, tubularSegments, radius, radialSegments, closed ) { BufferGeometry$1.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$1(); var normal = new Vector3$1(); var uv = new Vector2$1(); 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$1( vertices, 3 ) ); this.addAttribute( 'normal', new Float32BufferAttribute$1( normals, 3 ) ); this.addAttribute( 'uv', new Float32BufferAttribute$1( 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 var P = path.getPointAt( i / tubularSegments ); // 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$1.prototype = Object.create( BufferGeometry$1.prototype ); TubeBufferGeometry$1.prototype.constructor = TubeBufferGeometry$1; /** * @author oosmoxiecode * @author Mugen87 / https://github.com/Mugen87 * * based on http://www.blackpawn.com/texts/pqtorus/ */ // TorusKnotGeometry function TorusKnotGeometry$1( radius, tube, tubularSegments, radialSegments, p, q, heightScale ) { Geometry$1.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$1( radius, tube, tubularSegments, radialSegments, p, q ) ); this.mergeVertices(); } TorusKnotGeometry$1.prototype = Object.create( Geometry$1.prototype ); TorusKnotGeometry$1.prototype.constructor = TorusKnotGeometry$1; // TorusKnotBufferGeometry function TorusKnotBufferGeometry$1( radius, tube, tubularSegments, radialSegments, p, q ) { BufferGeometry$1.call( this ); this.type = 'TorusKnotBufferGeometry'; this.parameters = { radius: radius, tube: tube, tubularSegments: tubularSegments, radialSegments: radialSegments, p: p, q: q }; radius = radius || 100; tube = tube || 40; 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$1(); var normal = new Vector3$1(); var P1 = new Vector3$1(); var P2 = new Vector3$1(); var B = new Vector3$1(); var T = new Vector3$1(); var N = new Vector3$1(); // 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$1( vertices, 3 ) ); this.addAttribute( 'normal', new Float32BufferAttribute$1( normals, 3 ) ); this.addAttribute( 'uv', new Float32BufferAttribute$1( 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$1.prototype = Object.create( BufferGeometry$1.prototype ); TorusKnotBufferGeometry$1.prototype.constructor = TorusKnotBufferGeometry$1; /** * @author oosmoxiecode * @author mrdoob / http://mrdoob.com/ * @author Mugen87 / https://github.com/Mugen87 */ // TorusGeometry function TorusGeometry$1( radius, tube, radialSegments, tubularSegments, arc ) { Geometry$1.call( this ); this.type = 'TorusGeometry'; this.parameters = { radius: radius, tube: tube, radialSegments: radialSegments, tubularSegments: tubularSegments, arc: arc }; this.fromBufferGeometry( new TorusBufferGeometry$1( radius, tube, radialSegments, tubularSegments, arc ) ); this.mergeVertices(); } TorusGeometry$1.prototype = Object.create( Geometry$1.prototype ); TorusGeometry$1.prototype.constructor = TorusGeometry$1; // TorusBufferGeometry function TorusBufferGeometry$1( radius, tube, radialSegments, tubularSegments, arc ) { BufferGeometry$1.call( this ); this.type = 'TorusBufferGeometry'; this.parameters = { radius: radius, tube: tube, radialSegments: radialSegments, tubularSegments: tubularSegments, arc: arc }; radius = radius || 100; tube = tube || 40; 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$1(); var vertex = new Vector3$1(); var normal = new Vector3$1(); 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$1( vertices, 3 ) ); this.addAttribute( 'normal', new Float32BufferAttribute$1( normals, 3 ) ); this.addAttribute( 'uv', new Float32BufferAttribute$1( uvs, 2 ) ); } TorusBufferGeometry$1.prototype = Object.create( BufferGeometry$1.prototype ); TorusBufferGeometry$1.prototype.constructor = TorusBufferGeometry$1; /** * @author zz85 / http://www.lab4games.net/zz85/blog */ var ShapeUtils$1 = { // 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; }, triangulate: ( function () { /** * This code is a quick port of code written in C++ which was submitted to * flipcode.com by John W. Ratcliff // July 22, 2000 * See original code and more information here: * http://www.flipcode.com/archives/Efficient_Polygon_Triangulation.shtml * * ported to actionscript by Zevan Rosser * www.actionsnippet.com * * ported to javascript by Joshua Koo * http://www.lab4games.net/zz85/blog * */ function snip( contour, u, v, w, n, verts ) { var p; var ax, ay, bx, by; var cx, cy, px, py; ax = contour[ verts[ u ] ].x; ay = contour[ verts[ u ] ].y; bx = contour[ verts[ v ] ].x; by = contour[ verts[ v ] ].y; cx = contour[ verts[ w ] ].x; cy = contour[ verts[ w ] ].y; if ( ( bx - ax ) * ( cy - ay ) - ( by - ay ) * ( cx - ax ) <= 0 ) return false; var aX, aY, bX, bY, cX, cY; var apx, apy, bpx, bpy, cpx, cpy; var cCROSSap, bCROSScp, aCROSSbp; aX = cx - bx; aY = cy - by; bX = ax - cx; bY = ay - cy; cX = bx - ax; cY = by - ay; for ( p = 0; p < n; p ++ ) { px = contour[ verts[ p ] ].x; py = contour[ verts[ p ] ].y; if ( ( ( px === ax ) && ( py === ay ) ) || ( ( px === bx ) && ( py === by ) ) || ( ( px === cx ) && ( py === cy ) ) ) continue; apx = px - ax; apy = py - ay; bpx = px - bx; bpy = py - by; cpx = px - cx; cpy = py - cy; // see if p is inside triangle abc aCROSSbp = aX * bpy - aY * bpx; cCROSSap = cX * apy - cY * apx; bCROSScp = bX * cpy - bY * cpx; if ( ( aCROSSbp >= - Number.EPSILON ) && ( bCROSScp >= - Number.EPSILON ) && ( cCROSSap >= - Number.EPSILON ) ) return false; } return true; } // takes in an contour array and returns return function triangulate( contour, indices ) { var n = contour.length; if ( n < 3 ) return null; var result = [], verts = [], vertIndices = []; /* we want a counter-clockwise polygon in verts */ var u, v, w; if ( ShapeUtils$1.area( contour ) > 0.0 ) { for ( v = 0; v < n; v ++ ) verts[ v ] = v; } else { for ( v = 0; v < n; v ++ ) verts[ v ] = ( n - 1 ) - v; } var nv = n; /* remove nv - 2 vertices, creating 1 triangle every time */ var count = 2 * nv; /* error detection */ for ( v = nv - 1; nv > 2; ) { /* if we loop, it is probably a non-simple polygon */ if ( ( count -- ) <= 0 ) { //** Triangulate: ERROR - probable bad polygon! //throw ( "Warning, unable to triangulate polygon!" ); //return null; // Sometimes warning is fine, especially polygons are triangulated in reverse. console.warn( 'THREE.ShapeUtils: Unable to triangulate polygon! in triangulate()' ); if ( indices ) return vertIndices; return result; } /* three consecutive vertices in current polygon, */ u = v; if ( nv <= u ) u = 0; /* previous */ v = u + 1; if ( nv <= v ) v = 0; /* new v */ w = v + 1; if ( nv <= w ) w = 0; /* next */ if ( snip( contour, u, v, w, nv, verts ) ) { var a, b, c, s, t; /* true names of the vertices */ a = verts[ u ]; b = verts[ v ]; c = verts[ w ]; /* output Triangle */ result.push( [ contour[ a ], contour[ b ], contour[ c ] ] ); vertIndices.push( [ verts[ u ], verts[ v ], verts[ w ] ] ); /* remove v from the remaining polygon */ for ( s = v, t = v + 1; t < nv; s ++, t ++ ) { verts[ s ] = verts[ t ]; } nv --; /* reset error detection counter */ count = 2 * nv; } } if ( indices ) return vertIndices; return result; } } )(), triangulateShape: function ( contour, holes ) { function removeDupEndPts(points) { var l = points.length; if ( l > 2 && points[ l - 1 ].equals( points[ 0 ] ) ) { points.pop(); } } removeDupEndPts( contour ); holes.forEach( removeDupEndPts ); function point_in_segment_2D_colin( inSegPt1, inSegPt2, inOtherPt ) { // inOtherPt needs to be collinear to the inSegment if ( inSegPt1.x !== inSegPt2.x ) { if ( inSegPt1.x < inSegPt2.x ) { return ( ( inSegPt1.x <= inOtherPt.x ) && ( inOtherPt.x <= inSegPt2.x ) ); } else { return ( ( inSegPt2.x <= inOtherPt.x ) && ( inOtherPt.x <= inSegPt1.x ) ); } } else { if ( inSegPt1.y < inSegPt2.y ) { return ( ( inSegPt1.y <= inOtherPt.y ) && ( inOtherPt.y <= inSegPt2.y ) ); } else { return ( ( inSegPt2.y <= inOtherPt.y ) && ( inOtherPt.y <= inSegPt1.y ) ); } } } function intersect_segments_2D( inSeg1Pt1, inSeg1Pt2, inSeg2Pt1, inSeg2Pt2, inExcludeAdjacentSegs ) { var seg1dx = inSeg1Pt2.x - inSeg1Pt1.x, seg1dy = inSeg1Pt2.y - inSeg1Pt1.y; var seg2dx = inSeg2Pt2.x - inSeg2Pt1.x, seg2dy = inSeg2Pt2.y - inSeg2Pt1.y; var seg1seg2dx = inSeg1Pt1.x - inSeg2Pt1.x; var seg1seg2dy = inSeg1Pt1.y - inSeg2Pt1.y; var limit = seg1dy * seg2dx - seg1dx * seg2dy; var perpSeg1 = seg1dy * seg1seg2dx - seg1dx * seg1seg2dy; if ( Math.abs( limit ) > Number.EPSILON ) { // not parallel var perpSeg2; if ( limit > 0 ) { if ( ( perpSeg1 < 0 ) || ( perpSeg1 > limit ) ) return []; perpSeg2 = seg2dy * seg1seg2dx - seg2dx * seg1seg2dy; if ( ( perpSeg2 < 0 ) || ( perpSeg2 > limit ) ) return []; } else { if ( ( perpSeg1 > 0 ) || ( perpSeg1 < limit ) ) return []; perpSeg2 = seg2dy * seg1seg2dx - seg2dx * seg1seg2dy; if ( ( perpSeg2 > 0 ) || ( perpSeg2 < limit ) ) return []; } // i.e. to reduce rounding errors // intersection at endpoint of segment#1? if ( perpSeg2 === 0 ) { if ( ( inExcludeAdjacentSegs ) && ( ( perpSeg1 === 0 ) || ( perpSeg1 === limit ) ) ) return []; return [ inSeg1Pt1 ]; } if ( perpSeg2 === limit ) { if ( ( inExcludeAdjacentSegs ) && ( ( perpSeg1 === 0 ) || ( perpSeg1 === limit ) ) ) return []; return [ inSeg1Pt2 ]; } // intersection at endpoint of segment#2? if ( perpSeg1 === 0 ) return [ inSeg2Pt1 ]; if ( perpSeg1 === limit ) return [ inSeg2Pt2 ]; // return real intersection point var factorSeg1 = perpSeg2 / limit; return [ { x: inSeg1Pt1.x + factorSeg1 * seg1dx, y: inSeg1Pt1.y + factorSeg1 * seg1dy } ]; } else { // parallel or collinear if ( ( perpSeg1 !== 0 ) || ( seg2dy * seg1seg2dx !== seg2dx * seg1seg2dy ) ) return []; // they are collinear or degenerate var seg1Pt = ( ( seg1dx === 0 ) && ( seg1dy === 0 ) ); // segment1 is just a point? var seg2Pt = ( ( seg2dx === 0 ) && ( seg2dy === 0 ) ); // segment2 is just a point? // both segments are points if ( seg1Pt && seg2Pt ) { if ( ( inSeg1Pt1.x !== inSeg2Pt1.x ) || ( inSeg1Pt1.y !== inSeg2Pt1.y ) ) return []; // they are distinct points return [ inSeg1Pt1 ]; // they are the same point } // segment#1 is a single point if ( seg1Pt ) { if ( ! point_in_segment_2D_colin( inSeg2Pt1, inSeg2Pt2, inSeg1Pt1 ) ) return []; // but not in segment#2 return [ inSeg1Pt1 ]; } // segment#2 is a single point if ( seg2Pt ) { if ( ! point_in_segment_2D_colin( inSeg1Pt1, inSeg1Pt2, inSeg2Pt1 ) ) return []; // but not in segment#1 return [ inSeg2Pt1 ]; } // they are collinear segments, which might overlap var seg1min, seg1max, seg1minVal, seg1maxVal; var seg2min, seg2max, seg2minVal, seg2maxVal; if ( seg1dx !== 0 ) { // the segments are NOT on a vertical line if ( inSeg1Pt1.x < inSeg1Pt2.x ) { seg1min = inSeg1Pt1; seg1minVal = inSeg1Pt1.x; seg1max = inSeg1Pt2; seg1maxVal = inSeg1Pt2.x; } else { seg1min = inSeg1Pt2; seg1minVal = inSeg1Pt2.x; seg1max = inSeg1Pt1; seg1maxVal = inSeg1Pt1.x; } if ( inSeg2Pt1.x < inSeg2Pt2.x ) { seg2min = inSeg2Pt1; seg2minVal = inSeg2Pt1.x; seg2max = inSeg2Pt2; seg2maxVal = inSeg2Pt2.x; } else { seg2min = inSeg2Pt2; seg2minVal = inSeg2Pt2.x; seg2max = inSeg2Pt1; seg2maxVal = inSeg2Pt1.x; } } else { // the segments are on a vertical line if ( inSeg1Pt1.y < inSeg1Pt2.y ) { seg1min = inSeg1Pt1; seg1minVal = inSeg1Pt1.y; seg1max = inSeg1Pt2; seg1maxVal = inSeg1Pt2.y; } else { seg1min = inSeg1Pt2; seg1minVal = inSeg1Pt2.y; seg1max = inSeg1Pt1; seg1maxVal = inSeg1Pt1.y; } if ( inSeg2Pt1.y < inSeg2Pt2.y ) { seg2min = inSeg2Pt1; seg2minVal = inSeg2Pt1.y; seg2max = inSeg2Pt2; seg2maxVal = inSeg2Pt2.y; } else { seg2min = inSeg2Pt2; seg2minVal = inSeg2Pt2.y; seg2max = inSeg2Pt1; seg2maxVal = inSeg2Pt1.y; } } if ( seg1minVal <= seg2minVal ) { if ( seg1maxVal < seg2minVal ) return []; if ( seg1maxVal === seg2minVal ) { if ( inExcludeAdjacentSegs ) return []; return [ seg2min ]; } if ( seg1maxVal <= seg2maxVal ) return [ seg2min, seg1max ]; return [ seg2min, seg2max ]; } else { if ( seg1minVal > seg2maxVal ) return []; if ( seg1minVal === seg2maxVal ) { if ( inExcludeAdjacentSegs ) return []; return [ seg1min ]; } if ( seg1maxVal <= seg2maxVal ) return [ seg1min, seg1max ]; return [ seg1min, seg2max ]; } } } function isPointInsideAngle( inVertex, inLegFromPt, inLegToPt, inOtherPt ) { // The order of legs is important // translation of all points, so that Vertex is at (0,0) var legFromPtX = inLegFromPt.x - inVertex.x, legFromPtY = inLegFromPt.y - inVertex.y; var legToPtX = inLegToPt.x - inVertex.x, legToPtY = inLegToPt.y - inVertex.y; var otherPtX = inOtherPt.x - inVertex.x, otherPtY = inOtherPt.y - inVertex.y; // main angle >0: < 180 deg.; 0: 180 deg.; <0: > 180 deg. var from2toAngle = legFromPtX * legToPtY - legFromPtY * legToPtX; var from2otherAngle = legFromPtX * otherPtY - legFromPtY * otherPtX; if ( Math.abs( from2toAngle ) > Number.EPSILON ) { // angle != 180 deg. var other2toAngle = otherPtX * legToPtY - otherPtY * legToPtX; // console.log( "from2to: " + from2toAngle + ", from2other: " + from2otherAngle + ", other2to: " + other2toAngle ); if ( from2toAngle > 0 ) { // main angle < 180 deg. return ( ( from2otherAngle >= 0 ) && ( other2toAngle >= 0 ) ); } else { // main angle > 180 deg. return ( ( from2otherAngle >= 0 ) || ( other2toAngle >= 0 ) ); } } else { // angle == 180 deg. // console.log( "from2to: 180 deg., from2other: " + from2otherAngle ); return ( from2otherAngle > 0 ); } } function removeHoles( contour, holes ) { var shape = contour.concat(); // work on this shape var hole; function isCutLineInsideAngles( inShapeIdx, inHoleIdx ) { // Check if hole point lies within angle around shape point var lastShapeIdx = shape.length - 1; var prevShapeIdx = inShapeIdx - 1; if ( prevShapeIdx < 0 ) prevShapeIdx = lastShapeIdx; var nextShapeIdx = inShapeIdx + 1; if ( nextShapeIdx > lastShapeIdx ) nextShapeIdx = 0; var insideAngle = isPointInsideAngle( shape[ inShapeIdx ], shape[ prevShapeIdx ], shape[ nextShapeIdx ], hole[ inHoleIdx ] ); if ( ! insideAngle ) { // console.log( "Vertex (Shape): " + inShapeIdx + ", Point: " + hole[inHoleIdx].x + "/" + hole[inHoleIdx].y ); return false; } // Check if shape point lies within angle around hole point var lastHoleIdx = hole.length - 1; var prevHoleIdx = inHoleIdx - 1; if ( prevHoleIdx < 0 ) prevHoleIdx = lastHoleIdx; var nextHoleIdx = inHoleIdx + 1; if ( nextHoleIdx > lastHoleIdx ) nextHoleIdx = 0; insideAngle = isPointInsideAngle( hole[ inHoleIdx ], hole[ prevHoleIdx ], hole[ nextHoleIdx ], shape[ inShapeIdx ] ); if ( ! insideAngle ) { // console.log( "Vertex (Hole): " + inHoleIdx + ", Point: " + shape[inShapeIdx].x + "/" + shape[inShapeIdx].y ); return false; } return true; } function intersectsShapeEdge( inShapePt, inHolePt ) { // checks for intersections with shape edges var sIdx, nextIdx, intersection; for ( sIdx = 0; sIdx < shape.length; sIdx ++ ) { nextIdx = sIdx + 1; nextIdx %= shape.length; intersection = intersect_segments_2D( inShapePt, inHolePt, shape[ sIdx ], shape[ nextIdx ], true ); if ( intersection.length > 0 ) return true; } return false; } var indepHoles = []; function intersectsHoleEdge( inShapePt, inHolePt ) { // checks for intersections with hole edges var ihIdx, chkHole, hIdx, nextIdx, intersection; for ( ihIdx = 0; ihIdx < indepHoles.length; ihIdx ++ ) { chkHole = holes[ indepHoles[ ihIdx ]]; for ( hIdx = 0; hIdx < chkHole.length; hIdx ++ ) { nextIdx = hIdx + 1; nextIdx %= chkHole.length; intersection = intersect_segments_2D( inShapePt, inHolePt, chkHole[ hIdx ], chkHole[ nextIdx ], true ); if ( intersection.length > 0 ) return true; } } return false; } var holeIndex, shapeIndex, shapePt, holePt, holeIdx, cutKey, failedCuts = [], tmpShape1, tmpShape2, tmpHole1, tmpHole2; for ( var h = 0, hl = holes.length; h < hl; h ++ ) { indepHoles.push( h ); } var minShapeIndex = 0; var counter = indepHoles.length * 2; while ( indepHoles.length > 0 ) { counter --; if ( counter < 0 ) { console.log( "Infinite Loop! Holes left:" + indepHoles.length + ", Probably Hole outside Shape!" ); break; } // search for shape-vertex and hole-vertex, // which can be connected without intersections for ( shapeIndex = minShapeIndex; shapeIndex < shape.length; shapeIndex ++ ) { shapePt = shape[ shapeIndex ]; holeIndex = - 1; // search for hole which can be reached without intersections for ( var h = 0; h < indepHoles.length; h ++ ) { holeIdx = indepHoles[ h ]; // prevent multiple checks cutKey = shapePt.x + ":" + shapePt.y + ":" + holeIdx; if ( failedCuts[ cutKey ] !== undefined ) continue; hole = holes[ holeIdx ]; for ( var h2 = 0; h2 < hole.length; h2 ++ ) { holePt = hole[ h2 ]; if ( ! isCutLineInsideAngles( shapeIndex, h2 ) ) continue; if ( intersectsShapeEdge( shapePt, holePt ) ) continue; if ( intersectsHoleEdge( shapePt, holePt ) ) continue; holeIndex = h2; indepHoles.splice( h, 1 ); tmpShape1 = shape.slice( 0, shapeIndex + 1 ); tmpShape2 = shape.slice( shapeIndex ); tmpHole1 = hole.slice( holeIndex ); tmpHole2 = hole.slice( 0, holeIndex + 1 ); shape = tmpShape1.concat( tmpHole1 ).concat( tmpHole2 ).concat( tmpShape2 ); minShapeIndex = shapeIndex; // Debug only, to show the selected cuts // glob_CutLines.push( [ shapePt, holePt ] ); break; } if ( holeIndex >= 0 ) break; // hole-vertex found failedCuts[ cutKey ] = true; // remember failure } if ( holeIndex >= 0 ) break; // hole-vertex found } } return shape; /* shape with no holes */ } var i, il, f, face, key, index, allPointsMap = {}; // To maintain reference to old shape, one must match coordinates, or offset the indices from original arrays. It's probably easier to do the first. var allpoints = contour.concat(); for ( var h = 0, hl = holes.length; h < hl; h ++ ) { Array.prototype.push.apply( allpoints, holes[ h ] ); } //console.log( "allpoints",allpoints, allpoints.length ); // prepare all points map for ( i = 0, il = allpoints.length; i < il; i ++ ) { key = allpoints[ i ].x + ":" + allpoints[ i ].y; if ( allPointsMap[ key ] !== undefined ) { console.warn( "THREE.ShapeUtils: Duplicate point", key, i ); } allPointsMap[ key ] = i; } // remove holes by cutting paths to holes and adding them to the shape var shapeWithoutHoles = removeHoles( contour, holes ); var triangles = ShapeUtils$1.triangulate( shapeWithoutHoles, false ); // True returns indices for points of spooled shape //console.log( "triangles",triangles, triangles.length ); // check all face vertices against all points map for ( i = 0, il = triangles.length; i < il; i ++ ) { face = triangles[ i ]; for ( f = 0; f < 3; f ++ ) { key = face[ f ].x + ":" + face[ f ].y; index = allPointsMap[ key ]; if ( index !== undefined ) { face[ f ] = index; } } } return triangles.concat(); }, isClockWise: function ( pts ) { return ShapeUtils$1.area( pts ) < 0; } }; /** * @author zz85 / http://www.lab4games.net/zz85/blog * * Creates extruded geometry from a path shape. * * parameters = { * * curveSegments: , // number of points on the curves * steps: , // number of points for z-side extrusions / used for subdividing segments of extrude spline too * amount: , // Depth to extrude the shape * * bevelEnabled: , // turn on bevel * bevelThickness: , // how deep into the original shape bevel goes * bevelSize: , // how far from shape outline is bevel * bevelSegments: , // number of bevel layers * * extrudePath: // curve to extrude shape along * frames: // containing arrays of tangents, normals, binormals * * UVGenerator: // object that provides UV generator functions * * } */ // ExtrudeGeometry function ExtrudeGeometry$1( shapes, options ) { Geometry$1.call( this ); this.type = 'ExtrudeGeometry'; this.parameters = { shapes: shapes, options: options }; this.fromBufferGeometry( new ExtrudeBufferGeometry$1( shapes, options ) ); this.mergeVertices(); } ExtrudeGeometry$1.prototype = Object.create( Geometry$1.prototype ); ExtrudeGeometry$1.prototype.constructor = ExtrudeGeometry$1; // ExtrudeBufferGeometry function ExtrudeBufferGeometry$1( shapes, options ) { if ( typeof ( shapes ) === "undefined" ) { shapes = []; return; } BufferGeometry$1.call( this ); this.type = 'ExtrudeBufferGeometry'; shapes = Array.isArray( shapes ) ? shapes : [ shapes ]; this.addShapeList( shapes, options ); this.computeVertexNormals(); // can't really use automatic vertex normals // as then front and back sides get smoothed too // should do separate smoothing just for sides //this.computeVertexNormals(); //console.log( "took", ( Date.now() - startTime ) ); } ExtrudeBufferGeometry$1.prototype = Object.create( BufferGeometry$1.prototype ); ExtrudeBufferGeometry$1.prototype.constructor = ExtrudeBufferGeometry$1; ExtrudeBufferGeometry$1.prototype.getArrays = function () { var positionAttribute = this.getAttribute( "position" ); var verticesArray = positionAttribute ? Array.prototype.slice.call( positionAttribute.array ) : []; var uvAttribute = this.getAttribute( "uv" ); var uvArray = uvAttribute ? Array.prototype.slice.call( uvAttribute.array ) : []; var IndexAttribute = this.index; var indicesArray = IndexAttribute ? Array.prototype.slice.call( IndexAttribute.array ) : []; return { position: verticesArray, uv: uvArray, index: indicesArray }; }; ExtrudeBufferGeometry$1.prototype.addShapeList = function ( shapes, options ) { var sl = shapes.length; options.arrays = this.getArrays(); for ( var s = 0; s < sl; s ++ ) { var shape = shapes[ s ]; this.addShape( shape, options ); } this.setIndex( options.arrays.index ); this.addAttribute( 'position', new Float32BufferAttribute$1( options.arrays.position, 3 ) ); this.addAttribute( 'uv', new Float32BufferAttribute$1( options.arrays.uv, 2 ) ); }; ExtrudeBufferGeometry$1.prototype.addShape = function ( shape, options ) { var arrays = options.arrays ? options.arrays : this.getArrays(); var verticesArray = arrays.position; var indicesArray = arrays.index; var uvArray = arrays.uv; var placeholder = []; var amount = options.amount !== undefined ? options.amount : 100; var bevelThickness = options.bevelThickness !== undefined ? options.bevelThickness : 6; // 10 var bevelSize = options.bevelSize !== undefined ? options.bevelSize : bevelThickness - 2; // 8 var bevelSegments = options.bevelSegments !== undefined ? options.bevelSegments : 3; var bevelEnabled = options.bevelEnabled !== undefined ? options.bevelEnabled : true; // false var curveSegments = options.curveSegments !== undefined ? options.curveSegments : 12; var steps = options.steps !== undefined ? options.steps : 1; var extrudePath = options.extrudePath; var extrudePts, extrudeByPath = false; // Use default WorldUVGenerator if no UV generators are specified. var uvgen = options.UVGenerator !== undefined ? options.UVGenerator : ExtrudeGeometry$1.WorldUVGenerator; 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 = options.frames !== undefined ? options.frames : extrudePath.computeFrenetFrames( steps, false ); // console.log(splineTube, 'splineTube', splineTube.normals.length, 'steps', steps, 'extrudePts', extrudePts.length); binormal = new Vector3$1(); normal = new Vector3$1(); position2 = new Vector3$1(); } // Safeguards if bevels are not enabled if ( ! bevelEnabled ) { bevelSegments = 0; bevelThickness = 0; bevelSize = 0; } // Variables initialization var ahole, h, hl; // looping of holes var scope = this; var shapePoints = shape.extractPoints( curveSegments ); var vertices = shapePoints.shape; var holes = shapePoints.holes; var reverse = ! ShapeUtils$1.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$1.isClockWise( ahole ) ) { holes[ h ] = ahole.reverse(); } } reverse = false; // If vertices are in order now, we shouldn't need to worry about them again (hopefully)! } var faces = ShapeUtils$1.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 = 1; // 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$1( 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$1( 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, options.material !== undefined ? options.material : 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, options.extrudeMaterial !== undefined ? options.extrudeMaterial : 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, contour, s, sl, j, k ); } } } 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, wallContour, stepIndex, stepsLength, contourIndex1, contourIndex2 ) { 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 ) { indicesArray.push( verticesArray.length / 3 ); 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 ); } if ( ! options.arrays ) { this.setIndex( indicesArray ); this.addAttribute( 'position', new Float32BufferAttribute$1( verticesArray, 3 ) ); this.addAttribute( 'uv', new Float32BufferAttribute$1( options.arrays.uv, 2 ) ); } }; ExtrudeGeometry$1.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$1( a_x, a_y ), new Vector2$1( b_x, b_y ), new Vector2$1( 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$1( a_x, 1 - a_z ), new Vector2$1( b_x, 1 - b_z ), new Vector2$1( c_x, 1 - c_z ), new Vector2$1( d_x, 1 - d_z ) ]; } else { return [ new Vector2$1( a_y, 1 - a_z ), new Vector2$1( b_y, 1 - b_z ), new Vector2$1( c_y, 1 - c_z ), new Vector2$1( d_y, 1 - d_z ) ]; } } }; /** * @author zz85 / http://www.lab4games.net/zz85/blog * @author alteredq / http://alteredqualia.com/ * * Text = 3D Text * * parameters = { * font: , // font * * size: , // size of the text * height: , // thickness to extrude text * curveSegments: , // number of points on the curves * * bevelEnabled: , // turn on bevel * bevelThickness: , // how deep into text bevel goes * bevelSize: // how far from text outline is bevel * } */ // TextGeometry function TextGeometry$1( text, parameters ) { Geometry$1.call( this ); this.type = 'TextGeometry'; this.parameters = { text: text, parameters: parameters }; this.fromBufferGeometry( new TextBufferGeometry$1( text, parameters ) ); this.mergeVertices(); } TextGeometry$1.prototype = Object.create( Geometry$1.prototype ); TextGeometry$1.prototype.constructor = TextGeometry$1; // TextBufferGeometry function TextBufferGeometry$1( text, parameters ) { parameters = parameters || {}; var font = parameters.font; if ( ( font && font.isFont ) === false ) { console.error( 'THREE.TextGeometry: font parameter is not an instance of THREE.Font.' ); return new Geometry$1(); } 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$1.call( this, shapes, parameters ); this.type = 'TextBufferGeometry'; } TextBufferGeometry$1.prototype = Object.create( ExtrudeBufferGeometry$1.prototype ); TextBufferGeometry$1.prototype.constructor = TextBufferGeometry$1; /** * @author mrdoob / http://mrdoob.com/ * @author benaadams / https://twitter.com/ben_a_adams * @author Mugen87 / https://github.com/Mugen87 */ // SphereGeometry function SphereGeometry$1( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) { Geometry$1.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$1( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) ); this.mergeVertices(); } SphereGeometry$1.prototype = Object.create( Geometry$1.prototype ); SphereGeometry$1.prototype.constructor = SphereGeometry$1; // SphereBufferGeometry function SphereBufferGeometry$1( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) { BufferGeometry$1.call( this ); this.type = 'SphereBufferGeometry'; this.parameters = { radius: radius, widthSegments: widthSegments, heightSegments: heightSegments, phiStart: phiStart, phiLength: phiLength, thetaStart: thetaStart, thetaLength: thetaLength }; radius = radius || 50; 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$1(); var normal = new Vector3$1(); // 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$1( vertices, 3 ) ); this.addAttribute( 'normal', new Float32BufferAttribute$1( normals, 3 ) ); this.addAttribute( 'uv', new Float32BufferAttribute$1( uvs, 2 ) ); } SphereBufferGeometry$1.prototype = Object.create( BufferGeometry$1.prototype ); SphereBufferGeometry$1.prototype.constructor = SphereBufferGeometry$1; /** * @author Kaleb Murphy * @author Mugen87 / https://github.com/Mugen87 */ // RingGeometry function RingGeometry$1( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) { Geometry$1.call( this ); this.type = 'RingGeometry'; this.parameters = { innerRadius: innerRadius, outerRadius: outerRadius, thetaSegments: thetaSegments, phiSegments: phiSegments, thetaStart: thetaStart, thetaLength: thetaLength }; this.fromBufferGeometry( new RingBufferGeometry$1( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) ); this.mergeVertices(); } RingGeometry$1.prototype = Object.create( Geometry$1.prototype ); RingGeometry$1.prototype.constructor = RingGeometry$1; // RingBufferGeometry function RingBufferGeometry$1( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) { BufferGeometry$1.call( this ); this.type = 'RingBufferGeometry'; this.parameters = { innerRadius: innerRadius, outerRadius: outerRadius, thetaSegments: thetaSegments, phiSegments: phiSegments, thetaStart: thetaStart, thetaLength: thetaLength }; innerRadius = innerRadius || 20; outerRadius = outerRadius || 50; 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$1(); var uv = new Vector2$1(); 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$1( vertices, 3 ) ); this.addAttribute( 'normal', new Float32BufferAttribute$1( normals, 3 ) ); this.addAttribute( 'uv', new Float32BufferAttribute$1( uvs, 2 ) ); } RingBufferGeometry$1.prototype = Object.create( BufferGeometry$1.prototype ); RingBufferGeometry$1.prototype.constructor = RingBufferGeometry$1; /** * @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$1( points, segments, phiStart, phiLength ) { Geometry$1.call( this ); this.type = 'LatheGeometry'; this.parameters = { points: points, segments: segments, phiStart: phiStart, phiLength: phiLength }; this.fromBufferGeometry( new LatheBufferGeometry$1( points, segments, phiStart, phiLength ) ); this.mergeVertices(); } LatheGeometry$1.prototype = Object.create( Geometry$1.prototype ); LatheGeometry$1.prototype.constructor = LatheGeometry$1; // LatheBufferGeometry function LatheBufferGeometry$1( points, segments, phiStart, phiLength ) { BufferGeometry$1.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$1.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$1(); var uv = new Vector2$1(); 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$1( vertices, 3 ) ); this.addAttribute( 'uv', new Float32BufferAttribute$1( 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$1(); var n2 = new Vector3$1(); var n = new Vector3$1(); // 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$1.prototype = Object.create( BufferGeometry$1.prototype ); LatheBufferGeometry$1.prototype.constructor = LatheBufferGeometry$1; /** * @author jonobr1 / http://jonobr1.com * @author Mugen87 / https://github.com/Mugen87 */ // ShapeGeometry function ShapeGeometry$1( shapes, curveSegments ) { Geometry$1.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$1( shapes, curveSegments ) ); this.mergeVertices(); } ShapeGeometry$1.prototype = Object.create( Geometry$1.prototype ); ShapeGeometry$1.prototype.constructor = ShapeGeometry$1; // ShapeBufferGeometry function ShapeBufferGeometry$1( shapes, curveSegments ) { BufferGeometry$1.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$1( vertices, 3 ) ); this.addAttribute( 'normal', new Float32BufferAttribute$1( normals, 3 ) ); this.addAttribute( 'uv', new Float32BufferAttribute$1( 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$1.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$1.isClockWise( shapeHole ) === true ) { shapeHoles[ i ] = shapeHole.reverse(); } } } var faces = ShapeUtils$1.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$1.prototype = Object.create( BufferGeometry$1.prototype ); ShapeBufferGeometry$1.prototype.constructor = ShapeBufferGeometry$1; /** * @author WestLangley / http://github.com/WestLangley * @author Mugen87 / https://github.com/Mugen87 */ function EdgesGeometry$1( geometry, thresholdAngle ) { BufferGeometry$1.call( this ); this.type = 'EdgesGeometry'; this.parameters = { thresholdAngle: thresholdAngle }; thresholdAngle = ( thresholdAngle !== undefined ) ? thresholdAngle : 1; // buffer var vertices = []; // helper variables var thresholdDot = Math.cos( _Math$1.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$1(); 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$1( vertices, 3 ) ); } EdgesGeometry$1.prototype = Object.create( BufferGeometry$1.prototype ); EdgesGeometry$1.prototype.constructor = EdgesGeometry$1; /** * @author mrdoob / http://mrdoob.com/ * @author Mugen87 / https://github.com/Mugen87 */ // CylinderGeometry function CylinderGeometry$1( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) { Geometry$1.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$1( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) ); this.mergeVertices(); } CylinderGeometry$1.prototype = Object.create( Geometry$1.prototype ); CylinderGeometry$1.prototype.constructor = CylinderGeometry$1; // CylinderBufferGeometry function CylinderBufferGeometry$1( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) { BufferGeometry$1.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 : 20; radiusBottom = radiusBottom !== undefined ? radiusBottom : 20; height = height !== undefined ? height : 100; 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 : 2.0 * Math.PI; // 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$1( vertices, 3 ) ); this.addAttribute( 'normal', new Float32BufferAttribute$1( normals, 3 ) ); this.addAttribute( 'uv', new Float32BufferAttribute$1( uvs, 2 ) ); function generateTorso() { var x, y; var normal = new Vector3$1(); var vertex = new Vector3$1(); 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$1(); var vertex = new Vector3$1(); 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$1.prototype = Object.create( BufferGeometry$1.prototype ); CylinderBufferGeometry$1.prototype.constructor = CylinderBufferGeometry$1; /** * @author abelnation / http://github.com/abelnation */ // ConeGeometry function ConeGeometry$1( radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) { CylinderGeometry$1.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$1.prototype = Object.create( CylinderGeometry$1.prototype ); ConeGeometry$1.prototype.constructor = ConeGeometry$1; // ConeBufferGeometry function ConeBufferGeometry$1( radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) { CylinderBufferGeometry$1.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$1.prototype = Object.create( CylinderBufferGeometry$1.prototype ); ConeBufferGeometry$1.prototype.constructor = ConeBufferGeometry$1; /** * @author benaadams / https://twitter.com/ben_a_adams * @author Mugen87 / https://github.com/Mugen87 * @author hughes */ // CircleGeometry function CircleGeometry$1( radius, segments, thetaStart, thetaLength ) { Geometry$1.call( this ); this.type = 'CircleGeometry'; this.parameters = { radius: radius, segments: segments, thetaStart: thetaStart, thetaLength: thetaLength }; this.fromBufferGeometry( new CircleBufferGeometry$1( radius, segments, thetaStart, thetaLength ) ); this.mergeVertices(); } CircleGeometry$1.prototype = Object.create( Geometry$1.prototype ); CircleGeometry$1.prototype.constructor = CircleGeometry$1; // CircleBufferGeometry function CircleBufferGeometry$1( radius, segments, thetaStart, thetaLength ) { BufferGeometry$1.call( this ); this.type = 'CircleBufferGeometry'; this.parameters = { radius: radius, segments: segments, thetaStart: thetaStart, thetaLength: thetaLength }; radius = radius || 50; 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$1(); var uv = new Vector2$1(); // 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$1( vertices, 3 ) ); this.addAttribute( 'normal', new Float32BufferAttribute$1( normals, 3 ) ); this.addAttribute( 'uv', new Float32BufferAttribute$1( uvs, 2 ) ); } CircleBufferGeometry$1.prototype = Object.create( BufferGeometry$1.prototype ); CircleBufferGeometry$1.prototype.constructor = CircleBufferGeometry$1; var Geometries$1 = Object.freeze({ WireframeGeometry: WireframeGeometry$1, ParametricGeometry: ParametricGeometry$1, ParametricBufferGeometry: ParametricBufferGeometry$1, TetrahedronGeometry: TetrahedronGeometry$1, TetrahedronBufferGeometry: TetrahedronBufferGeometry$1, OctahedronGeometry: OctahedronGeometry$1, OctahedronBufferGeometry: OctahedronBufferGeometry$1, IcosahedronGeometry: IcosahedronGeometry$1, IcosahedronBufferGeometry: IcosahedronBufferGeometry$1, DodecahedronGeometry: DodecahedronGeometry$1, DodecahedronBufferGeometry: DodecahedronBufferGeometry$1, PolyhedronGeometry: PolyhedronGeometry$1, PolyhedronBufferGeometry: PolyhedronBufferGeometry$1, TubeGeometry: TubeGeometry$1, TubeBufferGeometry: TubeBufferGeometry$1, TorusKnotGeometry: TorusKnotGeometry$1, TorusKnotBufferGeometry: TorusKnotBufferGeometry$1, TorusGeometry: TorusGeometry$1, TorusBufferGeometry: TorusBufferGeometry$1, TextGeometry: TextGeometry$1, TextBufferGeometry: TextBufferGeometry$1, SphereGeometry: SphereGeometry$1, SphereBufferGeometry: SphereBufferGeometry$1, RingGeometry: RingGeometry$1, RingBufferGeometry: RingBufferGeometry$1, PlaneGeometry: PlaneGeometry$1, PlaneBufferGeometry: PlaneBufferGeometry$1, LatheGeometry: LatheGeometry$1, LatheBufferGeometry: LatheBufferGeometry$1, ShapeGeometry: ShapeGeometry$1, ShapeBufferGeometry: ShapeBufferGeometry$1, ExtrudeGeometry: ExtrudeGeometry$1, ExtrudeBufferGeometry: ExtrudeBufferGeometry$1, EdgesGeometry: EdgesGeometry$1, ConeGeometry: ConeGeometry$1, ConeBufferGeometry: ConeBufferGeometry$1, CylinderGeometry: CylinderGeometry$1, CylinderBufferGeometry: CylinderBufferGeometry$1, CircleGeometry: CircleGeometry$1, CircleBufferGeometry: CircleBufferGeometry$1, BoxGeometry: BoxGeometry$1, BoxBufferGeometry: BoxBufferGeometry$1 }); /** * @author mrdoob / http://mrdoob.com/ * * parameters = { * opacity: * } */ function ShadowMaterial$1( parameters ) { ShaderMaterial$1.call( this, { uniforms: UniformsUtils$1.merge( [ UniformsLib$1.lights, { opacity: { value: 1.0 } } ] ), vertexShader: ShaderChunk$1[ 'shadow_vert' ], fragmentShader: ShaderChunk$1[ 'shadow_frag' ] } ); this.lights = true; this.transparent = true; Object.defineProperties( this, { opacity: { enumerable: true, get: function () { return this.uniforms.opacity.value; }, set: function ( value ) { this.uniforms.opacity.value = value; } } } ); this.setValues( parameters ); } ShadowMaterial$1.prototype = Object.create( ShaderMaterial$1.prototype ); ShadowMaterial$1.prototype.constructor = ShadowMaterial$1; ShadowMaterial$1.prototype.isShadowMaterial = true; /** * @author mrdoob / http://mrdoob.com/ */ function RawShaderMaterial$1( parameters ) { ShaderMaterial$1.call( this, parameters ); this.type = 'RawShaderMaterial'; } RawShaderMaterial$1.prototype = Object.create( ShaderMaterial$1.prototype ); RawShaderMaterial$1.prototype.constructor = RawShaderMaterial$1; RawShaderMaterial$1.prototype.isRawShaderMaterial = true; /** * @author WestLangley / http://github.com/WestLangley * * parameters = { * color: , * roughness: , * metalness: , * opacity: , * * map: new THREE.Texture( ), * * lightMap: new THREE.Texture( ), * lightMapIntensity: * * aoMap: new THREE.Texture( ), * aoMapIntensity: * * emissive: , * emissiveIntensity: * emissiveMap: new THREE.Texture( ), * * bumpMap: new THREE.Texture( ), * bumpScale: , * * normalMap: new THREE.Texture( ), * normalScale: , * * displacementMap: new THREE.Texture( ), * displacementScale: , * displacementBias: , * * roughnessMap: new THREE.Texture( ), * * metalnessMap: new THREE.Texture( ), * * alphaMap: new THREE.Texture( ), * * envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ), * envMapIntensity: * * refractionRatio: , * * wireframe: , * wireframeLinewidth: , * * skinning: , * morphTargets: , * morphNormals: * } */ function MeshStandardMaterial$1( parameters ) { Material$1.call( this ); this.defines = { 'STANDARD': '' }; this.type = 'MeshStandardMaterial'; this.color = new Color$1( 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$1( 0x000000 ); this.emissiveIntensity = 1.0; this.emissiveMap = null; this.bumpMap = null; this.bumpScale = 1; this.normalMap = null; this.normalScale = new Vector2$1( 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$1.prototype = Object.create( Material$1.prototype ); MeshStandardMaterial$1.prototype.constructor = MeshStandardMaterial$1; MeshStandardMaterial$1.prototype.isMeshStandardMaterial = true; MeshStandardMaterial$1.prototype.copy = function ( source ) { Material$1.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: * } */ function MeshPhysicalMaterial$1( parameters ) { MeshStandardMaterial$1.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$1.prototype = Object.create( MeshStandardMaterial$1.prototype ); MeshPhysicalMaterial$1.prototype.constructor = MeshPhysicalMaterial$1; MeshPhysicalMaterial$1.prototype.isMeshPhysicalMaterial = true; MeshPhysicalMaterial$1.prototype.copy = function ( source ) { MeshStandardMaterial$1.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: , * specular: , * shininess: , * opacity: , * * map: new THREE.Texture( ), * * lightMap: new THREE.Texture( ), * lightMapIntensity: * * aoMap: new THREE.Texture( ), * aoMapIntensity: * * emissive: , * emissiveIntensity: * emissiveMap: new THREE.Texture( ), * * bumpMap: new THREE.Texture( ), * bumpScale: , * * normalMap: new THREE.Texture( ), * normalScale: , * * displacementMap: new THREE.Texture( ), * displacementScale: , * displacementBias: , * * specularMap: new THREE.Texture( ), * * alphaMap: new THREE.Texture( ), * * envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ), * combine: THREE.Multiply, * reflectivity: , * refractionRatio: , * * wireframe: , * wireframeLinewidth: , * * skinning: , * morphTargets: , * morphNormals: * } */ function MeshPhongMaterial$1( parameters ) { Material$1.call( this ); this.type = 'MeshPhongMaterial'; this.color = new Color$1( 0xffffff ); // diffuse this.specular = new Color$1( 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$1( 0x000000 ); this.emissiveIntensity = 1.0; this.emissiveMap = null; this.bumpMap = null; this.bumpScale = 1; this.normalMap = null; this.normalScale = new Vector2$1( 1, 1 ); this.displacementMap = null; this.displacementScale = 1; this.displacementBias = 0; this.specularMap = null; this.alphaMap = null; this.envMap = null; this.combine = MultiplyOperation$1; 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$1.prototype = Object.create( Material$1.prototype ); MeshPhongMaterial$1.prototype.constructor = MeshPhongMaterial$1; MeshPhongMaterial$1.prototype.isMeshPhongMaterial = true; MeshPhongMaterial$1.prototype.copy = function ( source ) { Material$1.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( ) * } */ function MeshToonMaterial$1( parameters ) { MeshPhongMaterial$1.call( this ); this.defines = { 'TOON': '' }; this.type = 'MeshToonMaterial'; this.gradientMap = null; this.setValues( parameters ); } MeshToonMaterial$1.prototype = Object.create( MeshPhongMaterial$1.prototype ); MeshToonMaterial$1.prototype.constructor = MeshToonMaterial$1; MeshToonMaterial$1.prototype.isMeshToonMaterial = true; MeshToonMaterial$1.prototype.copy = function ( source ) { MeshPhongMaterial$1.prototype.copy.call( this, source ); this.gradientMap = source.gradientMap; return this; }; /** * @author mrdoob / http://mrdoob.com/ * @author WestLangley / http://github.com/WestLangley * * parameters = { * opacity: , * * bumpMap: new THREE.Texture( ), * bumpScale: , * * normalMap: new THREE.Texture( ), * normalScale: , * * displacementMap: new THREE.Texture( ), * displacementScale: , * displacementBias: , * * wireframe: , * wireframeLinewidth: * * skinning: , * morphTargets: , * morphNormals: * } */ function MeshNormalMaterial$1( parameters ) { Material$1.call( this, parameters ); this.type = 'MeshNormalMaterial'; this.bumpMap = null; this.bumpScale = 1; this.normalMap = null; this.normalScale = new Vector2$1( 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$1.prototype = Object.create( Material$1.prototype ); MeshNormalMaterial$1.prototype.constructor = MeshNormalMaterial$1; MeshNormalMaterial$1.prototype.isMeshNormalMaterial = true; MeshNormalMaterial$1.prototype.copy = function ( source ) { Material$1.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: , * opacity: , * * map: new THREE.Texture( ), * * lightMap: new THREE.Texture( ), * lightMapIntensity: * * aoMap: new THREE.Texture( ), * aoMapIntensity: * * emissive: , * emissiveIntensity: * emissiveMap: new THREE.Texture( ), * * specularMap: new THREE.Texture( ), * * alphaMap: new THREE.Texture( ), * * envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ), * combine: THREE.Multiply, * reflectivity: , * refractionRatio: , * * wireframe: , * wireframeLinewidth: , * * skinning: , * morphTargets: , * morphNormals: * } */ function MeshLambertMaterial$1( parameters ) { Material$1.call( this ); this.type = 'MeshLambertMaterial'; this.color = new Color$1( 0xffffff ); // diffuse this.map = null; this.lightMap = null; this.lightMapIntensity = 1.0; this.aoMap = null; this.aoMapIntensity = 1.0; this.emissive = new Color$1( 0x000000 ); this.emissiveIntensity = 1.0; this.emissiveMap = null; this.specularMap = null; this.alphaMap = null; this.envMap = null; this.combine = MultiplyOperation$1; 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$1.prototype = Object.create( Material$1.prototype ); MeshLambertMaterial$1.prototype.constructor = MeshLambertMaterial$1; MeshLambertMaterial$1.prototype.isMeshLambertMaterial = true; MeshLambertMaterial$1.prototype.copy = function ( source ) { Material$1.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: , * opacity: , * * linewidth: , * * scale: , * dashSize: , * gapSize: * } */ function LineDashedMaterial$1( parameters ) { Material$1.call( this ); this.type = 'LineDashedMaterial'; this.color = new Color$1( 0xffffff ); this.linewidth = 1; this.scale = 1; this.dashSize = 3; this.gapSize = 1; this.lights = false; this.setValues( parameters ); } LineDashedMaterial$1.prototype = Object.create( Material$1.prototype ); LineDashedMaterial$1.prototype.constructor = LineDashedMaterial$1; LineDashedMaterial$1.prototype.isLineDashedMaterial = true; LineDashedMaterial$1.prototype.copy = function ( source ) { Material$1.prototype.copy.call( this, source ); this.color.copy( source.color ); this.linewidth = source.linewidth; this.scale = source.scale; this.dashSize = source.dashSize; this.gapSize = source.gapSize; return this; }; var Materials$1 = Object.freeze({ ShadowMaterial: ShadowMaterial$1, SpriteMaterial: SpriteMaterial$1, RawShaderMaterial: RawShaderMaterial$1, ShaderMaterial: ShaderMaterial$1, PointsMaterial: PointsMaterial$1, MeshPhysicalMaterial: MeshPhysicalMaterial$1, MeshStandardMaterial: MeshStandardMaterial$1, MeshPhongMaterial: MeshPhongMaterial$1, MeshToonMaterial: MeshToonMaterial$1, MeshNormalMaterial: MeshNormalMaterial$1, MeshLambertMaterial: MeshLambertMaterial$1, MeshDepthMaterial: MeshDepthMaterial$1, MeshBasicMaterial: MeshBasicMaterial$1, LineDashedMaterial: LineDashedMaterial$1, LineBasicMaterial: LineBasicMaterial$1, Material: Material$1 }); /** * @author mrdoob / http://mrdoob.com/ */ var Cache$1 = { 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$1( onLoad, onProgress, onError ) { var scope = this; var isLoading = false, itemsLoaded = 0, itemsTotal = 0; 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 ); } }; } var DefaultLoadingManager$1 = new LoadingManager$1(); /** * @author mrdoob / http://mrdoob.com/ */ function FileLoader$1( manager ) { this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager$1; } Object.assign( FileLoader$1.prototype, { load: function ( url, onLoad, onProgress, onError ) { if ( url === undefined ) url = ''; if ( this.path !== undefined ) url = this.path + url; var scope = this; var cached = Cache$1.get( url ); if ( cached !== undefined ) { scope.manager.itemStart( url ); setTimeout( function () { if ( onLoad ) onLoad( cached ); scope.manager.itemEnd( url ); }, 0 ); return cached; } // 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': response = new ArrayBuffer( data.length ); var view = new Uint8Array( response ); for ( var i = 0; i < data.length; i ++ ) { view[ i ] = data.charCodeAt( i ); } if ( responseType === 'blob' ) { response = new Blob( [ response ], { type: mimeType } ); } 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 window.setTimeout( function () { if ( onLoad ) onLoad( response ); scope.manager.itemEnd( url ); }, 0 ); } catch ( error ) { // Wait for next browser tick window.setTimeout( function () { if ( onError ) onError( error ); scope.manager.itemEnd( url ); scope.manager.itemError( url ); }, 0 ); } } else { var request = new XMLHttpRequest(); request.open( 'GET', url, true ); request.addEventListener( 'load', function ( event ) { var response = event.target.response; Cache$1.add( url, response ); if ( this.status === 200 ) { if ( onLoad ) 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.' ); if ( onLoad ) onLoad( response ); scope.manager.itemEnd( url ); } else { if ( onError ) onError( event ); scope.manager.itemEnd( url ); scope.manager.itemError( url ); } }, false ); if ( onProgress !== undefined ) { request.addEventListener( 'progress', function ( event ) { onProgress( event ); }, false ); } request.addEventListener( 'error', function ( event ) { if ( onError ) 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$1( manager ) { this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager$1; // override in sub classes this._parser = null; } Object.assign( CompressedTextureLoader$1.prototype, { load: function ( url, onLoad, onProgress, onError ) { var scope = this; var images = []; var texture = new CompressedTexture$1(); texture.image = images; var loader = new FileLoader$1( 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$1; 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$1; } 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$1( manager ) { this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager$1; // override in sub classes this._parser = null; } Object.assign( DataTextureLoader$1.prototype, { load: function ( url, onLoad, onProgress, onError ) { var scope = this; var texture = new DataTexture$1(); var loader = new FileLoader$1( 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$1; texture.wrapT = undefined !== texData.wrapT ? texData.wrapT : ClampToEdgeWrapping$1; texture.magFilter = undefined !== texData.magFilter ? texData.magFilter : LinearFilter$1; texture.minFilter = undefined !== texData.minFilter ? texData.minFilter : LinearMipMapLinearFilter$1; 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$1; } texture.needsUpdate = true; if ( onLoad ) onLoad( texture, texData ); }, onProgress, onError ); return texture; } } ); /** * @author mrdoob / http://mrdoob.com/ */ function ImageLoader$1( manager ) { this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager$1; } Object.assign( ImageLoader$1.prototype, { load: function ( url, onLoad, onProgress, onError ) { if ( url === undefined ) url = ''; if ( this.path !== undefined ) url = this.path + url; var scope = this; var cached = Cache$1.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$1.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$1( manager ) { this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager$1; } Object.assign( CubeTextureLoader$1.prototype, { load: function ( urls, onLoad, onProgress, onError ) { var texture = new CubeTexture$1(); var loader = new ImageLoader$1( 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$1( manager ) { this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager$1; } Object.assign( TextureLoader$1.prototype, { load: function ( url, onLoad, onProgress, onError ) { var loader = new ImageLoader$1( this.manager ); loader.setCrossOrigin( this.crossOrigin ); loader.setPath( this.path ); var texture = new Texture$1(); texture.image = loader.load( url, function () { // 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$1 : RGBAFormat$1; 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 mrdoob / http://mrdoob.com/ * @author alteredq / http://alteredqualia.com/ */ function Light$1( color, intensity ) { Object3D$1.call( this ); this.type = 'Light'; this.color = new Color$1( color ); this.intensity = intensity !== undefined ? intensity : 1; this.receiveShadow = undefined; } Light$1.prototype = Object.assign( Object.create( Object3D$1.prototype ), { constructor: Light$1, isLight: true, copy: function ( source ) { Object3D$1.prototype.copy.call( this, source ); this.color.copy( source.color ); this.intensity = source.intensity; return this; }, toJSON: function ( meta ) { var data = Object3D$1.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$2( skyColor, groundColor, intensity ) { Light$1.call( this, skyColor, intensity ); this.type = 'HemisphereLight'; this.castShadow = undefined; this.position.copy( Object3D$1.DefaultUp ); this.updateMatrix(); this.groundColor = new Color$1( groundColor ); } HemisphereLight$2.prototype = Object.assign( Object.create( Light$1.prototype ), { constructor: HemisphereLight$2, isHemisphereLight: true, copy: function ( source ) { Light$1.prototype.copy.call( this, source ); this.groundColor.copy( source.groundColor ); return this; } } ); /** * @author mrdoob / http://mrdoob.com/ */ function LightShadow$1( camera ) { this.camera = camera; this.bias = 0; this.radius = 1; this.mapSize = new Vector2$1( 512, 512 ); this.map = null; this.matrix = new Matrix4$1(); } Object.assign( LightShadow$1.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$1() { LightShadow$1.call( this, new PerspectiveCamera$2( 50, 1, 0.5, 500 ) ); } SpotLightShadow$1.prototype = Object.assign( Object.create( LightShadow$1.prototype ), { constructor: SpotLightShadow$1, isSpotLightShadow: true, update: function ( light ) { var camera = this.camera; var fov = _Math$1.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$2( color, intensity, distance, angle, penumbra, decay ) { Light$1.call( this, color, intensity ); this.type = 'SpotLight'; this.position.copy( Object3D$1.DefaultUp ); this.updateMatrix(); this.target = new Object3D$1(); Object.defineProperty( this, 'power', { get: function () { // intensity = power per solid angle. // ref: equation (17) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf return this.intensity * Math.PI; }, set: function ( power ) { // intensity = power per solid angle. // ref: equation (17) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.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$1(); } SpotLight$2.prototype = Object.assign( Object.create( Light$1.prototype ), { constructor: SpotLight$2, isSpotLight: true, copy: function ( source ) { Light$1.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$2( color, intensity, distance, decay ) { Light$1.call( this, color, intensity ); this.type = 'PointLight'; Object.defineProperty( this, 'power', { get: function () { // intensity = power per solid angle. // ref: equation (15) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf return this.intensity * 4 * Math.PI; }, set: function ( power ) { // intensity = power per solid angle. // ref: equation (15) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.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$1( new PerspectiveCamera$2( 90, 1, 0.5, 500 ) ); } PointLight$2.prototype = Object.assign( Object.create( Light$1.prototype ), { constructor: PointLight$2, isPointLight: true, copy: function ( source ) { Light$1.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$1( ) { LightShadow$1.call( this, new OrthographicCamera$2( - 5, 5, 5, - 5, 0.5, 500 ) ); } DirectionalLightShadow$1.prototype = Object.assign( Object.create( LightShadow$1.prototype ), { constructor: DirectionalLightShadow$1 } ); /** * @author mrdoob / http://mrdoob.com/ * @author alteredq / http://alteredqualia.com/ */ function DirectionalLight$2( color, intensity ) { Light$1.call( this, color, intensity ); this.type = 'DirectionalLight'; this.position.copy( Object3D$1.DefaultUp ); this.updateMatrix(); this.target = new Object3D$1(); this.shadow = new DirectionalLightShadow$1(); } DirectionalLight$2.prototype = Object.assign( Object.create( Light$1.prototype ), { constructor: DirectionalLight$2, isDirectionalLight: true, copy: function ( source ) { Light$1.prototype.copy.call( this, source ); this.target = source.target.clone(); this.shadow = source.shadow.clone(); return this; } } ); /** * @author mrdoob / http://mrdoob.com/ */ function AmbientLight$2( color, intensity ) { Light$1.call( this, color, intensity ); this.type = 'AmbientLight'; this.castShadow = undefined; } AmbientLight$2.prototype = Object.assign( Object.create( Light$1.prototype ), { constructor: AmbientLight$2, isAmbientLight: true } ); /** * @author abelnation / http://github.com/abelnation */ function RectAreaLight$1( color, intensity, width, height ) { Light$1.call( this, color, intensity ); this.type = 'RectAreaLight'; this.position.set( 0, 1, 0 ); this.updateMatrix(); this.width = ( width !== undefined ) ? width : 10; this.height = ( height !== undefined ) ? height : 10; // TODO (abelnation): distance/decay // TODO (abelnation): update method for RectAreaLight to update transform to lookat target // TODO (abelnation): shadows } // TODO (abelnation): RectAreaLight update when light shape is changed RectAreaLight$1.prototype = Object.assign( Object.create( Light$1.prototype ), { constructor: RectAreaLight$1, isRectAreaLight: true, copy: function ( source ) { Light$1.prototype.copy.call( this, source ); this.width = source.width; this.height = source.height; return this; }, toJSON: function ( meta ) { var data = Light$1.prototype.toJSON.call( this, meta ); data.object.width = this.width; data.object.height = this.height; return data; } } ); /** * @author tschw * @author Ben Houston / http://clara.io/ * @author David Sarno / http://lighthaus.us/ */ var AnimationUtils$1 = { // same as Array.prototype.slice, but also works on typed arrays arraySlice: function ( array, from, to ) { if ( AnimationUtils$1.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 ); } } }; /** * 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$1( 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$1.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$1.prototype, { //( 0, t, t0 ), returns this.resultBuffer beforeStart_: Interpolant$1.prototype.copySampleValue_, //( N-1, tN-1, t ), returns this.resultBuffer afterEnd_: Interpolant$1.prototype.copySampleValue_, } ); /** * 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$1( parameterPositions, sampleValues, sampleSize, resultBuffer ) { Interpolant$1.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer ); this._weightPrev = -0; this._offsetPrev = -0; this._weightNext = -0; this._offsetNext = -0; } CubicInterpolant$1.prototype = Object.assign( Object.create( Interpolant$1.prototype ), { constructor: CubicInterpolant$1, DefaultSettings_: { endingStart: ZeroCurvatureEnding$1, endingEnd: ZeroCurvatureEnding$1 }, 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$1: // f'(t0) = 0 iPrev = i1; tPrev = 2 * t0 - t1; break; case WrapAroundEnding$1: // 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$1: // f'(tN) = 0 iNext = i1; tNext = 2 * t1 - t0; break; case WrapAroundEnding$1: // 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$1( parameterPositions, sampleValues, sampleSize, resultBuffer ) { Interpolant$1.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer ); } LinearInterpolant$1.prototype = Object.assign( Object.create( Interpolant$1.prototype ), { constructor: LinearInterpolant$1, 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$1( parameterPositions, sampleValues, sampleSize, resultBuffer ) { Interpolant$1.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer ); } DiscreteInterpolant$1.prototype = Object.assign( Object.create( Interpolant$1.prototype ), { constructor: DiscreteInterpolant$1, interpolate_: function( i1, t0, t, t1 ) { return this.copySampleValue_( i1 - 1 ); } } ); var KeyframeTrackPrototype; KeyframeTrackPrototype = { TimeBufferType: Float32Array, ValueBufferType: Float32Array, DefaultInterpolation: InterpolateLinear$1, InterpolantFactoryMethodDiscrete: function ( result ) { return new DiscreteInterpolant$1( this.times, this.values, this.getValueSize(), result ); }, InterpolantFactoryMethodLinear: function ( result ) { return new LinearInterpolant$1( this.times, this.values, this.getValueSize(), result ); }, InterpolantFactoryMethodSmooth: function ( result ) { return new CubicInterpolant$1( this.times, this.values, this.getValueSize(), result ); }, setInterpolation: function ( interpolation ) { var factoryMethod; switch ( interpolation ) { case InterpolateDiscrete$1: factoryMethod = this.InterpolantFactoryMethodDiscrete; break; case InterpolateLinear$1: factoryMethod = this.InterpolantFactoryMethodLinear; break; case InterpolateSmooth$1: 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( message ); return; } this.createInterpolant = factoryMethod; }, getInterpolation: function () { switch ( this.createInterpolant ) { case this.InterpolantFactoryMethodDiscrete: return InterpolateDiscrete$1; case this.InterpolantFactoryMethodLinear: return InterpolateLinear$1; case this.InterpolantFactoryMethodSmooth: return InterpolateSmooth$1; } }, 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$1.arraySlice( times, from, to ); this.values = AnimationUtils$1. 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( "invalid value size in track", this ); valid = false; } var times = this.times, values = this.values, nKeys = times.length; if ( nKeys === 0 ) { console.error( "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( "time is not a valid number", this, i, currTime ); valid = false; break; } if ( prevTime !== null && prevTime > currTime ) { console.error( "out of order keys", this, i, currTime, prevTime ); valid = false; break; } prevTime = currTime; } if ( values !== undefined ) { if ( AnimationUtils$1.isTypedArray( values ) ) { for ( var i = 0, n = values.length; i !== n; ++ i ) { var value = values[ i ]; if ( isNaN( value ) ) { console.error( "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$1, 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$1.arraySlice( times, 0, writeIndex ); this.values = AnimationUtils$1.arraySlice( values, 0, writeIndex * stride ); } return this; } }; function KeyframeTrackConstructor( name, times, values, interpolation ) { if ( name === undefined ) throw new Error( "track name is undefined" ); if ( times === undefined || times.length === 0 ) { throw new Error( "no keyframes in track named " + name ); } this.name = name; this.times = AnimationUtils$1.convertArray( times, this.TimeBufferType ); this.values = AnimationUtils$1.convertArray( values, this.ValueBufferType ); this.setInterpolation( interpolation || this.DefaultInterpolation ); this.validate(); this.optimize(); } /** * * A Track of vectored keyframe values. * * * @author Ben Houston / http://clara.io/ * @author David Sarno / http://lighthaus.us/ * @author tschw */ function VectorKeyframeTrack$1( name, times, values, interpolation ) { KeyframeTrackConstructor.call( this, name, times, values, interpolation ); } VectorKeyframeTrack$1.prototype = Object.assign( Object.create( KeyframeTrackPrototype ), { constructor: VectorKeyframeTrack$1, ValueTypeName: 'vector' // ValueBufferType is inherited // DefaultInterpolation is inherited } ); /** * Spherical linear unit quaternion interpolant. * * @author tschw */ function QuaternionLinearInterpolant$1( parameterPositions, sampleValues, sampleSize, resultBuffer ) { Interpolant$1.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer ); } QuaternionLinearInterpolant$1.prototype = Object.assign( Object.create( Interpolant$1.prototype ), { constructor: QuaternionLinearInterpolant$1, 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$1.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$1( name, times, values, interpolation ) { KeyframeTrackConstructor.call( this, name, times, values, interpolation ); } QuaternionKeyframeTrack$1.prototype = Object.assign( Object.create( KeyframeTrackPrototype ), { constructor: QuaternionKeyframeTrack$1, ValueTypeName: 'quaternion', // ValueBufferType is inherited DefaultInterpolation: InterpolateLinear$1, InterpolantFactoryMethodLinear: function( result ) { return new QuaternionLinearInterpolant$1( this.times, this.values, this.getValueSize(), result ); }, InterpolantFactoryMethodSmooth: undefined // not yet implemented } ); /** * * A Track of numeric keyframe values. * * @author Ben Houston / http://clara.io/ * @author David Sarno / http://lighthaus.us/ * @author tschw */ function NumberKeyframeTrack$1( name, times, values, interpolation ) { KeyframeTrackConstructor.call( this, name, times, values, interpolation ); } NumberKeyframeTrack$1.prototype = Object.assign( Object.create( KeyframeTrackPrototype ), { constructor: NumberKeyframeTrack$1, ValueTypeName: 'number' // ValueBufferType is inherited // DefaultInterpolation is inherited } ); /** * * A Track that interpolates Strings * * * @author Ben Houston / http://clara.io/ * @author David Sarno / http://lighthaus.us/ * @author tschw */ function StringKeyframeTrack$1( name, times, values, interpolation ) { KeyframeTrackConstructor.call( this, name, times, values, interpolation ); } StringKeyframeTrack$1.prototype = Object.assign( Object.create( KeyframeTrackPrototype ), { constructor: StringKeyframeTrack$1, ValueTypeName: 'string', ValueBufferType: Array, DefaultInterpolation: InterpolateDiscrete$1, 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$1( name, times, values ) { KeyframeTrackConstructor.call( this, name, times, values ); } BooleanKeyframeTrack$1.prototype = Object.assign( Object.create( KeyframeTrackPrototype ), { constructor: BooleanKeyframeTrack$1, ValueTypeName: 'bool', ValueBufferType: Array, DefaultInterpolation: InterpolateDiscrete$1, 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 )". } ); /** * * A Track of keyframe values that represent color. * * * @author Ben Houston / http://clara.io/ * @author David Sarno / http://lighthaus.us/ * @author tschw */ function ColorKeyframeTrack$1( name, times, values, interpolation ) { KeyframeTrackConstructor.call( this, name, times, values, interpolation ); } ColorKeyframeTrack$1.prototype = Object.assign( Object.create( KeyframeTrackPrototype ), { constructor: ColorKeyframeTrack$1, 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 timed sequence of keyframes for a specific property. * * * @author Ben Houston / http://clara.io/ * @author David Sarno / http://lighthaus.us/ * @author tschw */ function KeyframeTrack$1( name, times, values, interpolation ) { KeyframeTrackConstructor.apply( this, arguments ); } KeyframeTrack$1.prototype = KeyframeTrackPrototype; KeyframeTrackPrototype.constructor = KeyframeTrack$1; // Static methods: Object.assign( KeyframeTrack$1, { // Serialization (in static context, because of constructor invocation // and automatic invocation of .toJSON): parse: function( json ) { if( json.type === undefined ) { throw new Error( "track type undefined, can not parse" ); } var trackType = KeyframeTrack$1._getTrackTypeForValueTypeName( json.type ); if ( json.times === undefined ) { var times = [], values = []; AnimationUtils$1.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 asssume 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$1.convertArray( track.times, Array ), 'values': AnimationUtils$1.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$1; case "vector": case "vector2": case "vector3": case "vector4": return VectorKeyframeTrack$1; case "color": return ColorKeyframeTrack$1; case "quaternion": return QuaternionKeyframeTrack$1; case "bool": case "boolean": return BooleanKeyframeTrack$1; case "string": return StringKeyframeTrack$1; } throw new Error( "Unsupported typeName: " + typeName ); } } ); /** * * Reusable set of Tracks that represent an animation. * * @author Ben Houston / http://clara.io/ * @author David Sarno / http://lighthaus.us/ */ function AnimationClip$1( name, duration, tracks ) { this.name = name; this.tracks = tracks; this.duration = ( duration !== undefined ) ? duration : - 1; this.uuid = _Math$1.generateUUID(); // this means it should figure out its duration by scanning the tracks if ( this.duration < 0 ) { this.resetDuration(); } this.optimize(); } Object.assign( AnimationClip$1, { 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$1.parse( jsonTracks[ i ] ).scale( frameTime ) ); } return new AnimationClip$1( 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$1.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$1.getKeyframeOrder( times ); times = AnimationUtils$1.sortedArray( times, 1, order ); values = AnimationUtils$1.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$1( '.morphTargetInfluences[' + morphTargetSequence[ i ].name + ']', times, values ).scale( 1.0 / fps ) ); } return new AnimationClip$1( 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$1.CreateFromMorphTargetSequence( name, animationToMorphTargets[ name ], fps, noLoop ) ); } return clips; }, // parse the animation.hierarchy format parseAnimation: function ( animation, bones ) { if ( ! animation ) { console.error( " 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$1.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 in a way exactly compatible // with AnimationHandler.init( animation ) 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$1( '.morphTargetInfluence[' + morphTargetName + ']', times, values ) ); } duration = morphTargetNames.length * ( fps || 1.0 ); } else { // ...assume skeletal animation var boneName = '.bones[' + bones[ h ].name + ']'; addNonemptyTrack( VectorKeyframeTrack$1, boneName + '.position', animationKeys, 'pos', tracks ); addNonemptyTrack( QuaternionKeyframeTrack$1, boneName + '.quaternion', animationKeys, 'rot', tracks ); addNonemptyTrack( VectorKeyframeTrack$1, boneName + '.scale', animationKeys, 'scl', tracks ); } } if ( tracks.length === 0 ) { return null; } var clip = new AnimationClip$1( clipName, duration, tracks ); return clip; } } ); Object.assign( AnimationClip$1.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$1( manager ) { this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager$1; this.textures = {}; } Object.assign( MaterialLoader$1.prototype, { load: function ( url, onLoad, onProgress, onError ) { var scope = this; var loader = new FileLoader$1( scope.manager ); loader.setResponseType( 'json' ); loader.load( url, function ( json ) { onLoad( scope.parse( json ) ); }, 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$1[ 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.shading !== undefined ) material.shading = json.shading; 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.skinning !== undefined ) material.skinning = json.skinning; if ( json.morphTargets !== undefined ) material.morphTargets = json.morphTargets; // 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$1().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$1( manager ) { this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager$1; } Object.assign( BufferGeometryLoader$1.prototype, { load: function ( url, onLoad, onProgress, onError ) { var scope = this; var loader = new FileLoader$1( scope.manager ); loader.setResponseType( 'json' ); loader.load( url, function ( json ) { onLoad( scope.parse( json ) ); }, onProgress, onError ); }, parse: function ( json ) { var geometry = new BufferGeometry$1(); var index = json.data.index; if ( index !== undefined ) { var typedArray = new TYPED_ARRAYS$1[ index.type ]( index.array ); geometry.setIndex( new BufferAttribute$1( typedArray, 1 ) ); } var attributes = json.data.attributes; for ( var key in attributes ) { var attribute = attributes[ key ]; var typedArray = new TYPED_ARRAYS$1[ attribute.type ]( attribute.array ); geometry.addAttribute( key, new BufferAttribute$1( 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$1(); if ( boundingSphere.center !== undefined ) { center.fromArray( boundingSphere.center ); } geometry.boundingSphere = new Sphere$2( center, boundingSphere.radius ); } return geometry; } } ); var TYPED_ARRAYS$1 = { Int8Array: Int8Array, Uint8Array: Uint8Array, Uint8ClampedArray: Uint8ClampedArray, Int16Array: Int16Array, Uint16Array: Uint16Array, Int32Array: Int32Array, Uint32Array: Uint32Array, Float32Array: Float32Array, Float64Array: Float64Array }; /** * @author alteredq / http://alteredqualia.com/ */ function Loader$1() { this.onLoadStart = function () {}; this.onLoadProgress = function () {}; this.onLoadComplete = function () {}; } Loader$1.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$1.prototype, { crossOrigin: undefined, extractUrlBase: function ( url ) { var parts = url.split( '/' ); if ( parts.length === 1 ) return './'; parts.pop(); return parts.join( '/' ) + '/'; }, 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$1, NormalBlending: NormalBlending$1, AdditiveBlending: AdditiveBlending$1, SubtractiveBlending: SubtractiveBlending$1, MultiplyBlending: MultiplyBlending$1, CustomBlending: CustomBlending$1 }; var color = new Color$1(); var textureLoader = new TextureLoader$1(); var materialLoader = new MaterialLoader$1(); 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$1.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$1; if ( repeat[ 1 ] !== 1 ) texture.wrapT = RepeatWrapping$1; } if ( offset !== undefined ) { texture.offset.fromArray( offset ); } if ( wrap !== undefined ) { if ( wrap[ 0 ] === 'repeat' ) texture.wrapS = RepeatWrapping$1; if ( wrap[ 0 ] === 'mirror' ) texture.wrapS = MirroredRepeatWrapping$1; if ( wrap[ 1 ] === 'repeat' ) texture.wrapT = RepeatWrapping$1; if ( wrap[ 1 ] === 'mirror' ) texture.wrapT = MirroredRepeatWrapping$1; } if ( anisotropy !== undefined ) { texture.anisotropy = anisotropy; } var uuid = _Math$1.generateUUID(); textures[ uuid ] = texture; return uuid; } // var json = { uuid: _Math$1.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, 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$1; break; case 'doubleSided': json.side = DoubleSide$1; 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$1; if ( value === 'face' ) json.vertexColors = FaceColors$1; 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 mrdoob / http://mrdoob.com/ * @author alteredq / http://alteredqualia.com/ */ function JSONLoader$1( manager ) { if ( typeof manager === 'boolean' ) { console.warn( 'THREE.JSONLoader: showStatus parameter has been removed from constructor.' ); manager = undefined; } this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager$1; this.withCredentials = false; } Object.assign( JSONLoader$1.prototype, { load: function ( url, onLoad, onProgress, onError ) { var scope = this; var texturePath = this.texturePath && ( typeof this.texturePath === "string" ) ? this.texturePath : Loader$1.prototype.extractUrlBase( url ); var loader = new FileLoader$1( this.manager ); loader.setResponseType( 'json' ); loader.setWithCredentials( this.withCredentials ); loader.load( url, function ( json ) { 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; } if ( type.toLowerCase() === 'scene' ) { console.error( 'THREE.JSONLoader: ' + url + ' should be loaded with THREE.SceneLoader 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$1(); 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$1(); faceA.a = faces[ offset ]; faceA.b = faces[ offset + 1 ]; faceA.c = faces[ offset + 3 ]; faceB = new Face3$1(); 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$1( 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$1( 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$1( hex ) ); if ( i !== 0 ) faceB.vertexColors.push( new Color$1( hex ) ); } } geometry.faces.push( faceA ); geometry.faces.push( faceB ); } else { face = new Face3$1(); 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$1( 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$1( 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$1( 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$1( 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$1( 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$1(); 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$1.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$1.CreateClipsFromMorphTargetSequences( geometry.morphTargets, 10 ); outputAnimations = outputAnimations.concat( morphAnimationClips ); } if ( outputAnimations.length > 0 ) geometry.animations = outputAnimations; } return function ( 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$1(); 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$1.prototype.initMaterials( json.materials, texturePath, this.crossOrigin ); return { geometry: geometry, materials: materials }; } }; } )() } ); /** * @author mrdoob / http://mrdoob.com/ */ function ObjectLoader$1( manager ) { this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager$1; this.texturePath = ''; } Object.assign( ObjectLoader$1.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$1( 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 geometries = this.parseGeometries( json.geometries ); 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; }, parseGeometries: function ( json ) { var geometries = {}; if ( json !== undefined ) { var geometryLoader = new JSONLoader$1(); var bufferGeometryLoader = new BufferGeometryLoader$1(); 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$1[ data.type ]( data.width, data.height, data.widthSegments, data.heightSegments ); break; case 'BoxGeometry': case 'BoxBufferGeometry': case 'CubeGeometry': // backwards compatible geometry = new Geometries$1[ data.type ]( data.width, data.height, data.depth, data.widthSegments, data.heightSegments, data.depthSegments ); break; case 'CircleGeometry': case 'CircleBufferGeometry': geometry = new Geometries$1[ data.type ]( data.radius, data.segments, data.thetaStart, data.thetaLength ); break; case 'CylinderGeometry': case 'CylinderBufferGeometry': geometry = new Geometries$1[ 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$1[ data.type ]( data.radius, data.height, data.radialSegments, data.heightSegments, data.openEnded, data.thetaStart, data.thetaLength ); break; case 'SphereGeometry': case 'SphereBufferGeometry': geometry = new Geometries$1[ data.type ]( data.radius, data.widthSegments, data.heightSegments, data.phiStart, data.phiLength, data.thetaStart, data.thetaLength ); break; case 'DodecahedronGeometry': case 'IcosahedronGeometry': case 'OctahedronGeometry': case 'TetrahedronGeometry': geometry = new Geometries$1[ data.type ]( data.radius, data.detail ); break; case 'RingGeometry': case 'RingBufferGeometry': geometry = new Geometries$1[ data.type ]( data.innerRadius, data.outerRadius, data.thetaSegments, data.phiSegments, data.thetaStart, data.thetaLength ); break; case 'TorusGeometry': case 'TorusBufferGeometry': geometry = new Geometries$1[ data.type ]( data.radius, data.tube, data.radialSegments, data.tubularSegments, data.arc ); break; case 'TorusKnotGeometry': case 'TorusKnotBufferGeometry': geometry = new Geometries$1[ data.type ]( data.radius, data.tube, data.tubularSegments, data.radialSegments, data.p, data.q ); break; case 'LatheGeometry': case 'LatheBufferGeometry': geometry = new Geometries$1[ data.type ]( data.points, data.segments, data.phiStart, data.phiLength ); 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$1(); 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$1.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$1( onLoad ); var loader = new ImageLoader$1( 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$1( 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$1 ); if ( data.offset !== undefined ) texture.offset.fromArray( data.offset ); if ( data.repeat !== undefined ) texture.repeat.fromArray( data.repeat ); if ( data.wrap !== undefined ) { texture.wrapS = parseConstant( data.wrap[ 0 ], TEXTURE_WRAPPING$1 ); texture.wrapT = parseConstant( data.wrap[ 1 ], TEXTURE_WRAPPING$1 ); } if ( data.minFilter !== undefined ) texture.minFilter = parseConstant( data.minFilter, TEXTURE_FILTER$1 ); if ( data.magFilter !== undefined ) texture.magFilter = parseConstant( data.magFilter, TEXTURE_FILTER$1 ); if ( data.anisotropy !== undefined ) texture.anisotropy = data.anisotropy; if ( data.flipY !== undefined ) texture.flipY = data.flipY; textures[ data.uuid ] = texture; } } return textures; }, parseObject: function () { var matrix = new Matrix4$1(); return function parseObject( 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$1(); if ( data.background !== undefined ) { if ( Number.isInteger( data.background ) ) { object.background = new Color$1( data.background ); } } if ( data.fog !== undefined ) { if ( data.fog.type === 'Fog' ) { object.fog = new Fog$1( data.fog.color, data.fog.near, data.fog.far ); } else if ( data.fog.type === 'FogExp2' ) { object.fog = new FogExp2$1( data.fog.color, data.fog.density ); } } break; case 'PerspectiveCamera': object = new PerspectiveCamera$2( 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$2( data.left, data.right, data.top, data.bottom, data.near, data.far ); break; case 'AmbientLight': object = new AmbientLight$2( data.color, data.intensity ); break; case 'DirectionalLight': object = new DirectionalLight$2( data.color, data.intensity ); break; case 'PointLight': object = new PointLight$2( data.color, data.intensity, data.distance, data.decay ); break; case 'RectAreaLight': object = new RectAreaLight$1( data.color, data.intensity, data.width, data.height ); break; case 'SpotLight': object = new SpotLight$2( data.color, data.intensity, data.distance, data.angle, data.penumbra, data.decay ); break; case 'HemisphereLight': object = new HemisphereLight$2( 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$1( geometry, material ); } else { object = new Mesh$1( geometry, material ); } break; case 'LOD': object = new LOD$1(); break; case 'Line': object = new Line$2( getGeometry( data.geometry ), getMaterial( data.material ), data.mode ); break; case 'LineLoop': object = new LineLoop$1( getGeometry( data.geometry ), getMaterial( data.material ) ); break; case 'LineSegments': object = new LineSegments$1( getGeometry( data.geometry ), getMaterial( data.material ) ); break; case 'PointCloud': case 'Points': object = new Points$1( getGeometry( data.geometry ), getMaterial( data.material ) ); break; case 'Sprite': object = new Sprite$1( getMaterial( data.material ) ); break; case 'Group': object = new Group$2(); break; default: object = new Object3D$1(); } object.uuid = data.uuid; if ( data.name !== undefined ) object.name = data.name; if ( data.matrix !== undefined ) { matrix.fromArray( data.matrix ); 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.userData !== undefined ) object.userData = data.userData; if ( data.children !== undefined ) { for ( var child in data.children ) { object.add( this.parseObject( data.children[ child ], 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$1 = { UVMapping: UVMapping$1, CubeReflectionMapping: CubeReflectionMapping$1, CubeRefractionMapping: CubeRefractionMapping$1, EquirectangularReflectionMapping: EquirectangularReflectionMapping$1, EquirectangularRefractionMapping: EquirectangularRefractionMapping$1, SphericalReflectionMapping: SphericalReflectionMapping$1, CubeUVReflectionMapping: CubeUVReflectionMapping$1, CubeUVRefractionMapping: CubeUVRefractionMapping$1 }; var TEXTURE_WRAPPING$1 = { RepeatWrapping: RepeatWrapping$1, ClampToEdgeWrapping: ClampToEdgeWrapping$1, MirroredRepeatWrapping: MirroredRepeatWrapping$1 }; var TEXTURE_FILTER$1 = { NearestFilter: NearestFilter$1, NearestMipMapNearestFilter: NearestMipMapNearestFilter$1, NearestMipMapLinearFilter: NearestMipMapLinearFilter$1, LinearFilter: LinearFilter$1, LinearMipMapNearestFilter: LinearMipMapNearestFilter$1, LinearMipMapLinearFilter: LinearMipMapLinearFilter$1 }; /** * @author zz85 / http://www.lab4games.net/zz85/blog * * Bezier Curves formulas obtained from * http://en.wikipedia.org/wiki/Bézier_curve */ function CatmullRom$1( 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$1( t, p ) { var k = 1 - t; return k * k * p; } function QuadraticBezierP1$1( t, p ) { return 2 * ( 1 - t ) * t * p; } function QuadraticBezierP2$1( t, p ) { return t * t * p; } function QuadraticBezier$1( t, p0, p1, p2 ) { return QuadraticBezierP0$1( t, p0 ) + QuadraticBezierP1$1( t, p1 ) + QuadraticBezierP2$1( t, p2 ); } // function CubicBezierP0$1( t, p ) { var k = 1 - t; return k * k * k * p; } function CubicBezierP1$1( t, p ) { var k = 1 - t; return 3 * k * k * t * p; } function CubicBezierP2$1( t, p ) { return 3 * ( 1 - t ) * t * t * p; } function CubicBezierP3$1( t, p ) { return t * t * t * p; } function CubicBezier$1( t, p0, p1, p2, p3 ) { return CubicBezierP0$1( t, p0 ) + CubicBezierP1$1( t, p1 ) + CubicBezierP2$1( t, p2 ) + CubicBezierP3$1( t, p3 ); } /** * @author zz85 / http://www.lab4games.net/zz85/blog * Extensible curve object * * Some common of curve methods: * .getPoint(t), getTangent(t) * .getPointAt(u), 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$1() { this.arcLengthDivisions = 200; } Object.assign( Curve$1.prototype, { // Virtual base class method to overwrite and implement in subclasses // - t [0 .. 1] getPoint: function () { 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 ) { var t = this.getUtoTmapping( u ); return this.getPoint( t ); }, // 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$1(); var tangents = []; var normals = []; var binormals = []; var vec = new Vector3$1(); var mat = new Matrix4$1(); 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$1(); binormals[ 0 ] = new Vector3$1(); 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$1.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$1.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 }; } } ); function LineCurve$1( v1, v2 ) { Curve$1.call( this ); this.v1 = v1; this.v2 = v2; } LineCurve$1.prototype = Object.create( Curve$1.prototype ); LineCurve$1.prototype.constructor = LineCurve$1; LineCurve$1.prototype.isLineCurve = true; LineCurve$1.prototype.getPoint = function ( t ) { if ( t === 1 ) { return this.v2.clone(); } var point = this.v2.clone().sub( this.v1 ); point.multiplyScalar( t ).add( this.v1 ); return point; }; // Line curve is linear, so we can overwrite default getPointAt LineCurve$1.prototype.getPointAt = function ( u ) { return this.getPoint( u ); }; LineCurve$1.prototype.getTangent = function ( t ) { var tangent = this.v2.clone().sub( this.v1 ); return tangent.normalize(); }; /** * @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$1() { Curve$1.call( this ); this.curves = []; this.autoClose = false; // Automatically closes the path } CurvePath$1.prototype = Object.assign( Object.create( Curve$1.prototype ), { constructor: CurvePath$1, 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$1( 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 1 && !points[ points.length - 1 ].equals( points[ 0 ] ) ) { points.push( points[ 0 ] ); } return points; }, /************************************************************** * Create Geometries Helpers **************************************************************/ /// Generate geometry from path points (for Line or Points objects) createPointsGeometry: function ( divisions ) { var pts = this.getPoints( divisions ); return this.createGeometry( pts ); }, // Generate geometry from equidistant sampling along the path createSpacedPointsGeometry: function ( divisions ) { var pts = this.getSpacedPoints( divisions ); return this.createGeometry( pts ); }, createGeometry: function ( points ) { var geometry = new Geometry$1(); for ( var i = 0, l = points.length; i < l; i ++ ) { var point = points[ i ]; geometry.vertices.push( new Vector3$1( point.x, point.y, point.z || 0 ) ); } return geometry; } } ); function EllipseCurve$1( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) { Curve$1.call( this ); this.aX = aX; this.aY = aY; this.xRadius = xRadius; this.yRadius = yRadius; this.aStartAngle = aStartAngle; this.aEndAngle = aEndAngle; this.aClockwise = aClockwise; this.aRotation = aRotation || 0; } EllipseCurve$1.prototype = Object.create( Curve$1.prototype ); EllipseCurve$1.prototype.constructor = EllipseCurve$1; EllipseCurve$1.prototype.isEllipseCurve = true; EllipseCurve$1.prototype.getPoint = function ( t ) { 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 new Vector2$1( x, y ); }; function SplineCurve$1( points /* array of Vector2 */ ) { Curve$1.call( this ); this.points = ( points === undefined ) ? [] : points; } SplineCurve$1.prototype = Object.create( Curve$1.prototype ); SplineCurve$1.prototype.constructor = SplineCurve$1; SplineCurve$1.prototype.isSplineCurve = true; SplineCurve$1.prototype.getPoint = function ( t ) { var points = this.points; var point = ( points.length - 1 ) * t; var intPoint = Math.floor( point ); var weight = point - intPoint; var point0 = points[ intPoint === 0 ? intPoint : intPoint - 1 ]; var point1 = points[ intPoint ]; var point2 = points[ intPoint > points.length - 2 ? points.length - 1 : intPoint + 1 ]; var point3 = points[ intPoint > points.length - 3 ? points.length - 1 : intPoint + 2 ]; return new Vector2$1( CatmullRom$1( weight, point0.x, point1.x, point2.x, point3.x ), CatmullRom$1( weight, point0.y, point1.y, point2.y, point3.y ) ); }; function CubicBezierCurve$1( v0, v1, v2, v3 ) { Curve$1.call( this ); this.v0 = v0; this.v1 = v1; this.v2 = v2; this.v3 = v3; } CubicBezierCurve$1.prototype = Object.create( Curve$1.prototype ); CubicBezierCurve$1.prototype.constructor = CubicBezierCurve$1; CubicBezierCurve$1.prototype.getPoint = function ( t ) { var v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3; return new Vector2$1( CubicBezier$1( t, v0.x, v1.x, v2.x, v3.x ), CubicBezier$1( t, v0.y, v1.y, v2.y, v3.y ) ); }; function QuadraticBezierCurve$1( v0, v1, v2 ) { Curve$1.call( this ); this.v0 = v0; this.v1 = v1; this.v2 = v2; } QuadraticBezierCurve$1.prototype = Object.create( Curve$1.prototype ); QuadraticBezierCurve$1.prototype.constructor = QuadraticBezierCurve$1; QuadraticBezierCurve$1.prototype.getPoint = function ( t ) { var v0 = this.v0, v1 = this.v1, v2 = this.v2; return new Vector2$1( QuadraticBezier$1( t, v0.x, v1.x, v2.x ), QuadraticBezier$1( t, v0.y, v1.y, v2.y ) ); }; var PathPrototype = Object.assign( Object.create( CurvePath$1.prototype ), { fromPoints: function ( vectors ) { this.moveTo( vectors[ 0 ].x, vectors[ 0 ].y ); for ( var i = 1, l = vectors.length; i < l; i ++ ) { this.lineTo( vectors[ i ].x, vectors[ 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$1( this.currentPoint.clone(), new Vector2$1( x, y ) ); this.curves.push( curve ); this.currentPoint.set( x, y ); }, quadraticCurveTo: function ( aCPx, aCPy, aX, aY ) { var curve = new QuadraticBezierCurve$1( this.currentPoint.clone(), new Vector2$1( aCPx, aCPy ), new Vector2$1( aX, aY ) ); this.curves.push( curve ); this.currentPoint.set( aX, aY ); }, bezierCurveTo: function ( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) { var curve = new CubicBezierCurve$1( this.currentPoint.clone(), new Vector2$1( aCP1x, aCP1y ), new Vector2$1( aCP2x, aCP2y ), new Vector2$1( 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$1( 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$1( 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 ); } } ); /** * @author zz85 / http://www.lab4games.net/zz85/blog * Creates free form 2d path using series of points, lines or curves. **/ function Path$1( points ) { CurvePath$1.call( this ); this.currentPoint = new Vector2$1(); if ( points ) { this.fromPoints( points ); } } Path$1.prototype = PathPrototype; PathPrototype.constructor = Path$1; /** * @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$2() { Path$1.apply( this, arguments ); this.holes = []; } Shape$2.prototype = Object.assign( Object.create( PathPrototype ), { constructor: Shape$2, 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) extractAllPoints: function ( divisions ) { return { shape: this.getPoints( divisions ), holes: this.getPointsHoles( divisions ) }; }, extractPoints: function ( divisions ) { return this.extractAllPoints( divisions ); } } ); /** * @author zz85 / http://www.lab4games.net/zz85/blog * minimal class for proxing functions to Path. Replaces old "extractSubpaths()" **/ function ShapePath$1() { this.subPaths = []; this.currentPath = null; } Object.assign( ShapePath$1.prototype, { moveTo: function ( x, y ) { this.currentPath = new Path$1(); 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$2(); 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$1.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$2(); 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$2(), 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$1( data ) { this.data = data; } Object.assign( Font$1.prototype, { isFont: true, generateShapes: function ( text, size, divisions ) { function createPaths( text ) { var chars = String( text ).split( '' ); var scale = size / data.resolution; var line_height = ( data.boundingBox.yMax - data.boundingBox.yMin + data.underlineThickness ) * scale; var offsetX = 0, offsetY = 0; var paths = []; 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, scale, offsetX, offsetY ); offsetX += ret.offsetX; paths.push( ret.path ); } } return paths; } function createPath( c, scale, offsetX, offsetY ) { var glyph = data.glyphs[ c ] || data.glyphs[ '?' ]; if ( ! glyph ) return; var path = new ShapePath$1(); var pts = []; var x, y, cpx, cpy, cpx0, cpy0, cpx1, cpy1, cpx2, cpy2, laste; 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 ); laste = pts[ pts.length - 1 ]; if ( laste ) { cpx0 = laste.x; cpy0 = laste.y; } 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 ); laste = pts[ pts.length - 1 ]; if ( laste ) { cpx0 = laste.x; cpy0 = laste.y; } break; } } } return { offsetX: glyph.ha * scale, path: path }; } // if ( size === undefined ) size = 100; if ( divisions === undefined ) divisions = 4; var data = this.data; var paths = createPaths( text ); var shapes = []; for ( var p = 0, pl = paths.length; p < pl; p ++ ) { Array.prototype.push.apply( shapes, paths[ p ].toShapes() ); } return shapes; } } ); /** * @author mrdoob / http://mrdoob.com/ */ function FontLoader$1( manager ) { this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager$1; } Object.assign( FontLoader$1.prototype, { load: function ( url, onLoad, onProgress, onError ) { var scope = this; var loader = new FileLoader$1( this.manager ); 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$1( json ); } } ); var context$1; var AudioContext$1 = { getContext: function () { if ( context$1 === undefined ) { context$1 = new ( window.AudioContext || window.webkitAudioContext )(); } return context$1; }, setContext: function ( value ) { context$1 = value; } }; /** * @author Reece Aaron Lecrivain / http://reecenotes.com/ */ function AudioLoader$1( manager ) { this.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager$1; } Object.assign( AudioLoader$1.prototype, { load: function ( url, onLoad, onProgress, onError ) { var loader = new FileLoader$1( this.manager ); loader.setResponseType( 'arraybuffer' ); loader.load( url, function ( buffer ) { var context = AudioContext$1.getContext(); context.decodeAudioData( buffer, function ( audioBuffer ) { onLoad( audioBuffer ); } ); }, onProgress, onError ); } } ); /** * @author mrdoob / http://mrdoob.com/ */ function StereoCamera$1() { this.type = 'StereoCamera'; this.aspect = 1; this.eyeSep = 0.064; this.cameraL = new PerspectiveCamera$2(); this.cameraL.layers.enable( 1 ); this.cameraL.matrixAutoUpdate = false; this.cameraR = new PerspectiveCamera$2(); this.cameraR.layers.enable( 2 ); this.cameraR.matrixAutoUpdate = false; } Object.assign( StereoCamera$1.prototype, { update: ( function () { var instance, focus, fov, aspect, near, far, zoom, eyeSep; var eyeRight = new Matrix4$1(); var eyeLeft = new Matrix4$1(); 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$1.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$2( near, far, cubeResolution ) { Object3D$1.call( this ); this.type = 'CubeCamera'; var fov = 90, aspect = 1; var cameraPX = new PerspectiveCamera$2( fov, aspect, near, far ); cameraPX.up.set( 0, - 1, 0 ); cameraPX.lookAt( new Vector3$1( 1, 0, 0 ) ); this.add( cameraPX ); var cameraNX = new PerspectiveCamera$2( fov, aspect, near, far ); cameraNX.up.set( 0, - 1, 0 ); cameraNX.lookAt( new Vector3$1( - 1, 0, 0 ) ); this.add( cameraNX ); var cameraPY = new PerspectiveCamera$2( fov, aspect, near, far ); cameraPY.up.set( 0, 0, 1 ); cameraPY.lookAt( new Vector3$1( 0, 1, 0 ) ); this.add( cameraPY ); var cameraNY = new PerspectiveCamera$2( fov, aspect, near, far ); cameraNY.up.set( 0, 0, - 1 ); cameraNY.lookAt( new Vector3$1( 0, - 1, 0 ) ); this.add( cameraNY ); var cameraPZ = new PerspectiveCamera$2( fov, aspect, near, far ); cameraPZ.up.set( 0, - 1, 0 ); cameraPZ.lookAt( new Vector3$1( 0, 0, 1 ) ); this.add( cameraPZ ); var cameraNZ = new PerspectiveCamera$2( fov, aspect, near, far ); cameraNZ.up.set( 0, - 1, 0 ); cameraNZ.lookAt( new Vector3$1( 0, 0, - 1 ) ); this.add( cameraNZ ); var options = { format: RGBFormat$1, magFilter: LinearFilter$1, minFilter: LinearFilter$1 }; this.renderTarget = new WebGLRenderTargetCube$1( cubeResolution, cubeResolution, options ); this.renderTarget.texture.name = "CubeCamera"; this.updateCubeMap = 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 ); }; } CubeCamera$2.prototype = Object.create( Object3D$1.prototype ); CubeCamera$2.prototype.constructor = CubeCamera$2; /** * @author mrdoob / http://mrdoob.com/ */ function ArrayCamera$1( array ) { PerspectiveCamera$2.call( this ); this.enabled = false; this.cameras = array || []; } ArrayCamera$1.prototype = Object.assign( Object.create( PerspectiveCamera$2.prototype ), { constructor: ArrayCamera$1, isArrayCamera: true } ); /** * @author mrdoob / http://mrdoob.com/ */ function AudioListener$1() { Object3D$1.call( this ); this.type = 'AudioListener'; this.context = AudioContext$1.getContext(); this.gain = this.context.createGain(); this.gain.connect( this.context.destination ); this.filter = null; } AudioListener$1.prototype = Object.assign( Object.create( Object3D$1.prototype ), { constructor: AudioListener$1, 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.value = value; }, updateMatrixWorld: ( function () { var position = new Vector3$1(); var quaternion = new Quaternion$1(); var scale = new Vector3$1(); var orientation = new Vector3$1(); return function updateMatrixWorld( force ) { Object3D$1.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$1( listener ) { Object3D$1.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.playbackRate = 1; this.isPlaying = false; this.hasPlaybackControl = true; this.sourceType = 'empty'; this.filters = []; } Audio$1.prototype = Object.assign( Object.create( Object3D$1.prototype ), { constructor: Audio$1, 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 ); source.start( 0, this.startTime ); 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; } this.source.stop(); this.startTime = this.context.currentTime; 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.startTime = 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.value = value; return this; } } ); /** * @author mrdoob / http://mrdoob.com/ */ function PositionalAudio$1( listener ) { Audio$1.call( this, listener ); this.panner = this.context.createPanner(); this.panner.connect( this.gain ); } PositionalAudio$1.prototype = Object.assign( Object.create( Audio$1.prototype ), { constructor: PositionalAudio$1, 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$1(); return function updateMatrixWorld( force ) { Object3D$1.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$1( 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$1.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$1( 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$1.prototype, { // accumulate data in the 'incoming' region into 'accu' 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' 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$1.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 */ function Composite$1( targetGroup, path, optionalParsedPath ) { var parsedPath = optionalParsedPath || PropertyBinding$1.parseTrackName( path ); this._targetGroup = targetGroup; this._bindings = targetGroup.subscribe_( path, parsedPath ); } Object.assign( Composite$1.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$1( rootNode, path, parsedPath ) { this.path = path; this.parsedPath = parsedPath || PropertyBinding$1.parseTrackName( path ); this.node = PropertyBinding$1.findNode( rootNode, this.parsedPath.nodeName ) || rootNode; this.rootNode = rootNode; } Object.assign( PropertyBinding$1, { Composite: Composite$1, create: function ( root, path, parsedPath ) { if ( ! ( root && root.isAnimationObjectGroup ) ) { return new PropertyBinding$1( root, path, parsedPath ); } else { return new PropertyBinding$1.Composite( root, path, parsedPath ); } }, parseTrackName: function () { // Parent directories, delimited by '/' or ':'. Currently unused, but must // be matched to parse the rest of the track name. var directoryRe = /((?:[\w-]+[\/:])*)/; // Target node. May contain word characters (a-zA-Z0-9_) and '.' or '-'. var nodeRe = /([\w-\.]+)?/; // Object on target node, and accessor. Name may contain only word // characters. Accessor may contain any character except closing bracket. var objectRe = /(?:\.([\w-]+)(?:\[(.+)\])?)?/; // Property and accessor. May contain only word characters. Accessor may // contain any non-bracket characters. var propertyRe = /\.([\w-]+)(?:\[(.+)\])?/; var trackRe = new RegExp('' + '^' + directoryRe.source + nodeRe.source + objectRe.source + propertyRe.source + '$' ); var supportedObjectNames = [ 'material', 'materials', 'bones' ]; return function ( 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 searchSkeleton = function ( skeleton ) { for ( var i = 0; i < skeleton.bones.length; i ++ ) { var bone = skeleton.bones[ i ]; if ( bone.name === nodeName ) { return bone; } } return null; }; var bone = searchSkeleton( root.skeleton ); if ( bone ) { 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$1.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.node[ this.propertyName ] = buffer[ offset ]; }, function setValue_direct_setNeedsUpdate( buffer, offset ) { this.node[ this.propertyName ] = buffer[ offset ]; this.targetObject.needsUpdate = true; }, function setValue_direct_setMatrixWorldNeedsUpdate( buffer, offset ) { this.node[ 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$1.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( " 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( ' can not bind to material as node does not have a material', this ); return; } if ( ! targetObject.material.materials ) { console.error( ' 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( ' 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( ' can not bind to objectName of node, undefined', this ); return; } targetObject = targetObject[ objectName ]; } if ( objectIndex !== undefined ) { if ( targetObject[ objectIndex ] === undefined ) { console.error( " 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( " 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( ' can not bind to morphTargetInfluences becasuse node does not have a geometry', this ); return; } if ( ! targetObject.geometry.morphTargets ) { console.error( ' can not bind to morphTargetInfluences becasuse 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$1.prototype, { // initial state of these methods that calls 'bind' _getValue_unbound: PropertyBinding$1.prototype.getValue, _setValue_unbound: PropertyBinding$1.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$1( var_args ) { this.uuid = _Math$1.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$1.prototype, { isAnimationObjectGroup: true, add: function( var_args ) { 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; for ( var i = 0, n = arguments.length; i !== n; ++ i ) { var object = arguments[ i ], uuid = object.uuid, index = indicesByUUID[ uuid ], knownObject = undefined; 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$1( 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$1( object, paths[ j ], parsedPaths[ j ] ); } bindingsForPath[ firstActiveIndex ] = binding; } } else if ( objects[ index ] !== knownObject ) { console.error( "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_args ) { 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_args ) { 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$1( 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$1( 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$1, endingEnd: ZeroCurvatureEnding$1 }; 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$1; 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$1.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$1 ) { 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$1 ); 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 === 0 ) { // 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$1; settings.endingEnd = ZeroSlopeEnding$1; } else { // assuming for LoopOnce atStart == atEnd == true if ( atStart ) { settings.endingStart = this.zeroSlopeAtStart ? ZeroSlopeEnding$1 : ZeroCurvatureEnding$1; } else { settings.endingStart = WrapAroundEnding$1; } if ( atEnd ) { settings.endingEnd = this.zeroSlopeAtEnd ? ZeroSlopeEnding$1 : ZeroCurvatureEnding$1; } else { settings.endingEnd = WrapAroundEnding$1; } } }, _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$1( root ) { this._root = root; this._initMemoryManager(); this._accuIndex = 0; this.time = 0; this.timeScale = 1.0; } Object.assign( AnimationMixer$1.prototype, EventDispatcher$1.prototype, { _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$1( PropertyBinding$1.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; 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$1( 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$1.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$1( 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$1.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$1( value ) { if ( typeof value === 'string' ) { console.warn( 'THREE.Uniform: Type parameter is no longer needed.' ); value = arguments[ 1 ]; } this.value = value; } Uniform$1.prototype.clone = function () { return new Uniform$1( this.value.clone === undefined ? this.value : this.value.clone() ); }; /** * @author benaadams / https://twitter.com/ben_a_adams */ function InstancedBufferGeometry$1() { BufferGeometry$1.call( this ); this.type = 'InstancedBufferGeometry'; this.maxInstancedCount = undefined; } InstancedBufferGeometry$1.prototype = Object.assign( Object.create( BufferGeometry$1.prototype ), { constructor: InstancedBufferGeometry$1, isInstancedBufferGeometry: true, addGroup: function ( start, count, materialIndex ) { this.groups.push( { start: start, count: count, materialIndex: materialIndex } ); }, copy: function ( source ) { var index = source.index; if ( index !== null ) { this.setIndex( index.clone() ); } var attributes = source.attributes; for ( var name in attributes ) { var attribute = attributes[ name ]; this.addAttribute( name, attribute.clone() ); } var groups = source.groups; for ( var i = 0, l = groups.length; i < l; i ++ ) { var group = groups[ i ]; this.addGroup( group.start, group.count, group.materialIndex ); } return this; } } ); /** * @author benaadams / https://twitter.com/ben_a_adams */ function InterleavedBufferAttribute$1( interleavedBuffer, itemSize, offset, normalized ) { this.uuid = _Math$1.generateUUID(); this.data = interleavedBuffer; this.itemSize = itemSize; this.offset = offset; this.normalized = normalized === true; } Object.defineProperties( InterleavedBufferAttribute$1.prototype, { count: { get: function () { return this.data.count; } }, array: { get: function () { return this.data.array; } } } ); Object.assign( InterleavedBufferAttribute$1.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$1( array, stride ) { this.uuid = _Math$1.generateUUID(); this.array = array; this.stride = stride; this.count = array !== undefined ? array.length / stride : 0; this.dynamic = false; this.updateRange = { offset: 0, count: - 1 }; this.onUploadCallback = function () {}; this.version = 0; } Object.defineProperty( InterleavedBuffer$1.prototype, 'needsUpdate', { set: function ( value ) { if ( value === true ) this.version ++; } } ); Object.assign( InterleavedBuffer$1.prototype, { isInterleavedBuffer: true, 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; }, 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$1( array, stride, meshPerAttribute ) { InterleavedBuffer$1.call( this, array, stride ); this.meshPerAttribute = meshPerAttribute || 1; } InstancedInterleavedBuffer$1.prototype = Object.assign( Object.create( InterleavedBuffer$1.prototype ), { constructor: InstancedInterleavedBuffer$1, isInstancedInterleavedBuffer: true, copy: function ( source ) { InterleavedBuffer$1.prototype.copy.call( this, source ); this.meshPerAttribute = source.meshPerAttribute; return this; } } ); /** * @author benaadams / https://twitter.com/ben_a_adams */ function InstancedBufferAttribute$1( array, itemSize, meshPerAttribute ) { BufferAttribute$1.call( this, array, itemSize ); this.meshPerAttribute = meshPerAttribute || 1; } InstancedBufferAttribute$1.prototype = Object.assign( Object.create( BufferAttribute$1.prototype ), { constructor: InstancedBufferAttribute$1, isInstancedBufferAttribute: true, copy: function ( source ) { BufferAttribute$1.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$1( origin, direction, near, far ) { this.ray = new Ray$1( 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$1( a, b ) { return a.distance - b.distance; } function intersectObject$1( 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$1( children[ i ], raycaster, intersects, true ); } } } Object.assign( Raycaster$1.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 ) { var intersects = []; intersectObject$1( object, this, intersects, recursive ); intersects.sort( ascSort$1 ); return intersects; }, intersectObjects: function ( objects, recursive ) { var intersects = []; 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$1( objects[ i ], this, intersects, recursive ); } intersects.sort( ascSort$1 ); return intersects; } } ); /** * @author alteredq / http://alteredqualia.com/ */ function Clock$1( autoStart ) { this.autoStart = ( autoStart !== undefined ) ? autoStart : true; this.startTime = 0; this.oldTime = 0; this.elapsedTime = 0; this.running = false; } Object.assign( Clock$1.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; }, 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$1( 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$1.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$1.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$1( 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$1.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 alteredq / http://alteredqualia.com/ */ function MorphBlendMesh( geometry, material ) { Mesh$1.call( this, geometry, material ); this.animationsMap = {}; this.animationsList = []; // prepare default animation // (all frames played together in 1 second) var numFrames = this.geometry.morphTargets.length; var name = "__default"; var startFrame = 0; var endFrame = numFrames - 1; var fps = numFrames / 1; this.createAnimation( name, startFrame, endFrame, fps ); this.setAnimationWeight( name, 1 ); } MorphBlendMesh.prototype = Object.create( Mesh$1.prototype ); MorphBlendMesh.prototype.constructor = MorphBlendMesh; MorphBlendMesh.prototype.createAnimation = function ( name, start, end, fps ) { var animation = { start: start, end: end, length: end - start + 1, fps: fps, duration: ( end - start ) / fps, lastFrame: 0, currentFrame: 0, active: false, time: 0, direction: 1, weight: 1, directionBackwards: false, mirroredLoop: false }; this.animationsMap[ name ] = animation; this.animationsList.push( animation ); }; MorphBlendMesh.prototype.autoCreateAnimations = function ( fps ) { var pattern = /([a-z]+)_?(\d+)/i; var firstAnimation, frameRanges = {}; var geometry = this.geometry; for ( var i = 0, il = geometry.morphTargets.length; i < il; i ++ ) { var morph = geometry.morphTargets[ i ]; var chunks = morph.name.match( pattern ); if ( chunks && chunks.length > 1 ) { var name = chunks[ 1 ]; if ( ! frameRanges[ name ] ) frameRanges[ name ] = { start: Infinity, end: - Infinity }; var range = frameRanges[ name ]; if ( i < range.start ) range.start = i; if ( i > range.end ) range.end = i; if ( ! firstAnimation ) firstAnimation = name; } } for ( var name in frameRanges ) { var range = frameRanges[ name ]; this.createAnimation( name, range.start, range.end, fps ); } this.firstAnimation = firstAnimation; }; MorphBlendMesh.prototype.setAnimationDirectionForward = function ( name ) { var animation = this.animationsMap[ name ]; if ( animation ) { animation.direction = 1; animation.directionBackwards = false; } }; MorphBlendMesh.prototype.setAnimationDirectionBackward = function ( name ) { var animation = this.animationsMap[ name ]; if ( animation ) { animation.direction = - 1; animation.directionBackwards = true; } }; MorphBlendMesh.prototype.setAnimationFPS = function ( name, fps ) { var animation = this.animationsMap[ name ]; if ( animation ) { animation.fps = fps; animation.duration = ( animation.end - animation.start ) / animation.fps; } }; MorphBlendMesh.prototype.setAnimationDuration = function ( name, duration ) { var animation = this.animationsMap[ name ]; if ( animation ) { animation.duration = duration; animation.fps = ( animation.end - animation.start ) / animation.duration; } }; MorphBlendMesh.prototype.setAnimationWeight = function ( name, weight ) { var animation = this.animationsMap[ name ]; if ( animation ) { animation.weight = weight; } }; MorphBlendMesh.prototype.setAnimationTime = function ( name, time ) { var animation = this.animationsMap[ name ]; if ( animation ) { animation.time = time; } }; MorphBlendMesh.prototype.getAnimationTime = function ( name ) { var time = 0; var animation = this.animationsMap[ name ]; if ( animation ) { time = animation.time; } return time; }; MorphBlendMesh.prototype.getAnimationDuration = function ( name ) { var duration = - 1; var animation = this.animationsMap[ name ]; if ( animation ) { duration = animation.duration; } return duration; }; MorphBlendMesh.prototype.playAnimation = function ( name ) { var animation = this.animationsMap[ name ]; if ( animation ) { animation.time = 0; animation.active = true; } else { console.warn( "THREE.MorphBlendMesh: animation[" + name + "] undefined in .playAnimation()" ); } }; MorphBlendMesh.prototype.stopAnimation = function ( name ) { var animation = this.animationsMap[ name ]; if ( animation ) { animation.active = false; } }; MorphBlendMesh.prototype.update = function ( delta ) { for ( var i = 0, il = this.animationsList.length; i < il; i ++ ) { var animation = this.animationsList[ i ]; if ( ! animation.active ) continue; var frameTime = animation.duration / animation.length; animation.time += animation.direction * delta; if ( animation.mirroredLoop ) { if ( animation.time > animation.duration || animation.time < 0 ) { animation.direction *= - 1; if ( animation.time > animation.duration ) { animation.time = animation.duration; animation.directionBackwards = true; } if ( animation.time < 0 ) { animation.time = 0; animation.directionBackwards = false; } } } else { animation.time = animation.time % animation.duration; if ( animation.time < 0 ) animation.time += animation.duration; } var keyframe = animation.start + _Math$1.clamp( Math.floor( animation.time / frameTime ), 0, animation.length - 1 ); var weight = animation.weight; if ( keyframe !== animation.currentFrame ) { this.morphTargetInfluences[ animation.lastFrame ] = 0; this.morphTargetInfluences[ animation.currentFrame ] = 1 * weight; this.morphTargetInfluences[ keyframe ] = 0; animation.lastFrame = animation.currentFrame; animation.currentFrame = keyframe; } var mix = ( animation.time % frameTime ) / frameTime; if ( animation.directionBackwards ) mix = 1 - mix; if ( animation.currentFrame !== animation.lastFrame ) { this.morphTargetInfluences[ animation.currentFrame ] = mix * weight; this.morphTargetInfluences[ animation.lastFrame ] = ( 1 - mix ) * weight; } else { this.morphTargetInfluences[ animation.currentFrame ] = weight; } } }; /** * @author alteredq / http://alteredqualia.com/ */ function ImmediateRenderObject$1( material ) { Object3D$1.call( this ); this.material = material; this.render = function ( renderCallback ) {}; } ImmediateRenderObject$1.prototype = Object.create( Object3D$1.prototype ); ImmediateRenderObject$1.prototype.constructor = ImmediateRenderObject$1; ImmediateRenderObject$1.prototype.isImmediateRenderObject = true; /** * @author mrdoob / http://mrdoob.com/ * @author WestLangley / http://github.com/WestLangley */ function VertexNormalsHelper$1( 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$1(); var positions = new Float32BufferAttribute$1( nNormals * 2 * 3, 3 ); geometry.addAttribute( 'position', positions ); LineSegments$1.call( this, geometry, new LineBasicMaterial$1( { color: color, linewidth: width } ) ); // this.matrixAutoUpdate = false; this.update(); } VertexNormalsHelper$1.prototype = Object.create( LineSegments$1.prototype ); VertexNormalsHelper$1.prototype.constructor = VertexNormalsHelper$1; VertexNormalsHelper$1.prototype.update = ( function () { var v1 = new Vector3$1(); var v2 = new Vector3$1(); var normalMatrix = new Matrix3$1(); 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$1( light ) { Object3D$1.call( this ); this.light = light; this.light.updateMatrixWorld(); this.matrix = light.matrixWorld; this.matrixAutoUpdate = false; var geometry = new BufferGeometry$1(); 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$1( positions, 3 ) ); var material = new LineBasicMaterial$1( { fog: false } ); this.cone = new LineSegments$1( geometry, material ); this.add( this.cone ); this.update(); } SpotLightHelper$1.prototype = Object.create( Object3D$1.prototype ); SpotLightHelper$1.prototype.constructor = SpotLightHelper$1; SpotLightHelper$1.prototype.dispose = function () { this.cone.geometry.dispose(); this.cone.material.dispose(); }; SpotLightHelper$1.prototype.update = function () { var vector = new Vector3$1(); var vector2 = new Vector3$1(); return function update() { 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 ) ); 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 SkeletonHelper$1( object ) { this.bones = this.getBoneList( object ); var geometry = new BufferGeometry$1(); var vertices = []; var colors = []; var color1 = new Color$1( 0, 0, 1 ); var color2 = new Color$1( 0, 1, 0 ); for ( var i = 0; i < this.bones.length; i ++ ) { var bone = this.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$1( vertices, 3 ) ); geometry.addAttribute( 'color', new Float32BufferAttribute$1( colors, 3 ) ); var material = new LineBasicMaterial$1( { vertexColors: VertexColors$1, depthTest: false, depthWrite: false, transparent: true } ); LineSegments$1.call( this, geometry, material ); this.root = object; this.matrix = object.matrixWorld; this.matrixAutoUpdate = false; this.update(); } SkeletonHelper$1.prototype = Object.create( LineSegments$1.prototype ); SkeletonHelper$1.prototype.constructor = SkeletonHelper$1; SkeletonHelper$1.prototype.getBoneList = function( object ) { var boneList = []; if ( object && object.isBone ) { boneList.push( object ); } for ( var i = 0; i < object.children.length; i ++ ) { boneList.push.apply( boneList, this.getBoneList( object.children[ i ] ) ); } return boneList; }; SkeletonHelper$1.prototype.update = function () { var vector = new Vector3$1(); var boneMatrix = new Matrix4$1(); var matrixWorldInv = new Matrix4$1(); return function update() { var geometry = this.geometry; var position = geometry.getAttribute( 'position' ); matrixWorldInv.getInverse( this.root.matrixWorld ); for ( var i = 0, j = 0; i < this.bones.length; i ++ ) { var bone = this.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; }; }(); /** * @author alteredq / http://alteredqualia.com/ * @author mrdoob / http://mrdoob.com/ */ function PointLightHelper$1( light, sphereSize ) { this.light = light; this.light.updateMatrixWorld(); var geometry = new SphereBufferGeometry$1( sphereSize, 4, 2 ); var material = new MeshBasicMaterial$1( { wireframe: true, fog: false } ); material.color.copy( this.light.color ); Mesh$1.call( this, geometry, material ); this.matrix = this.light.matrixWorld; this.matrixAutoUpdate = false; /* 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$1.prototype = Object.create( Mesh$1.prototype ); PointLightHelper$1.prototype.constructor = PointLightHelper$1; PointLightHelper$1.prototype.dispose = function () { this.geometry.dispose(); this.material.dispose(); }; PointLightHelper$1.prototype.update = function () { 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$1( light ) { Object3D$1.call( this ); this.light = light; this.light.updateMatrixWorld(); this.matrix = light.matrixWorld; this.matrixAutoUpdate = false; var material = new LineBasicMaterial$1( { color: light.color } ); var geometry = new BufferGeometry$1(); geometry.addAttribute( 'position', new BufferAttribute$1( new Float32Array( 5 * 3 ), 3 ) ); this.add( new Line$2( geometry, material ) ); this.update(); } RectAreaLightHelper$1.prototype = Object.create( Object3D$1.prototype ); RectAreaLightHelper$1.prototype.constructor = RectAreaLightHelper$1; RectAreaLightHelper$1.prototype.dispose = function () { this.children[ 0 ].geometry.dispose(); this.children[ 0 ].material.dispose(); }; RectAreaLightHelper$1.prototype.update = function () { var line = this.children[ 0 ]; // update material line.material.color.copy( this.light.color ); // calculate new dimensions of the helper var hx = this.light.width * 0.5; var hy = this.light.height * 0.5; var position = 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; }; /** * @author alteredq / http://alteredqualia.com/ * @author mrdoob / http://mrdoob.com/ * @author Mugen87 / https://github.com/Mugen87 */ function HemisphereLightHelper$1( light, size ) { Object3D$1.call( this ); this.light = light; this.light.updateMatrixWorld(); this.matrix = light.matrixWorld; this.matrixAutoUpdate = false; var geometry = new OctahedronBufferGeometry$1( size ); geometry.rotateY( Math.PI * 0.5 ); var material = new MeshBasicMaterial$1( { vertexColors: VertexColors$1, wireframe: true } ); var position = geometry.getAttribute( 'position' ); var colors = new Float32Array( position.count * 3 ); geometry.addAttribute( 'color', new BufferAttribute$1( colors, 3 ) ); this.add( new Mesh$1( geometry, material ) ); this.update(); } HemisphereLightHelper$1.prototype = Object.create( Object3D$1.prototype ); HemisphereLightHelper$1.prototype.constructor = HemisphereLightHelper$1; HemisphereLightHelper$1.prototype.dispose = function () { this.children[ 0 ].geometry.dispose(); this.children[ 0 ].material.dispose(); }; HemisphereLightHelper$1.prototype.update = function () { var vector = new Vector3$1(); var color1 = new Color$1(); var color2 = new Color$1(); return function update() { var mesh = this.children[ 0 ]; 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 ); } mesh.lookAt( vector.setFromMatrixPosition( this.light.matrixWorld ).negate() ); colors.needsUpdate = true; }; }(); /** * @author mrdoob / http://mrdoob.com/ */ function GridHelper$1( size, divisions, color1, color2 ) { size = size || 10; divisions = divisions || 10; color1 = new Color$1( color1 !== undefined ? color1 : 0x444444 ); color2 = new Color$1( 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$1(); geometry.addAttribute( 'position', new Float32BufferAttribute$1( vertices, 3 ) ); geometry.addAttribute( 'color', new Float32BufferAttribute$1( colors, 3 ) ); var material = new LineBasicMaterial$1( { vertexColors: VertexColors$1 } ); LineSegments$1.call( this, geometry, material ); } GridHelper$1.prototype = Object.create( LineSegments$1.prototype ); GridHelper$1.prototype.constructor = GridHelper$1; /** * @author mrdoob / http://mrdoob.com/ * @author Mugen87 / http://github.com/Mugen87 * @author Hectate / http://www.github.com/Hectate */ function PolarGridHelper$1( radius, radials, circles, divisions, color1, color2 ) { radius = radius || 10; radials = radials || 16; circles = circles || 8; divisions = divisions || 64; color1 = new Color$1( color1 !== undefined ? color1 : 0x444444 ); color2 = new Color$1( 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$1(); geometry.addAttribute( 'position', new Float32BufferAttribute$1( vertices, 3 ) ); geometry.addAttribute( 'color', new Float32BufferAttribute$1( colors, 3 ) ); var material = new LineBasicMaterial$1( { vertexColors: VertexColors$1 } ); LineSegments$1.call( this, geometry, material ); } PolarGridHelper$1.prototype = Object.create( LineSegments$1.prototype ); PolarGridHelper$1.prototype.constructor = PolarGridHelper$1; /** * @author mrdoob / http://mrdoob.com/ * @author WestLangley / http://github.com/WestLangley */ function FaceNormalsHelper$1( 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$1(); var positions = new Float32BufferAttribute$1( nNormals * 2 * 3, 3 ); geometry.addAttribute( 'position', positions ); LineSegments$1.call( this, geometry, new LineBasicMaterial$1( { color: color, linewidth: width } ) ); // this.matrixAutoUpdate = false; this.update(); } FaceNormalsHelper$1.prototype = Object.create( LineSegments$1.prototype ); FaceNormalsHelper$1.prototype.constructor = FaceNormalsHelper$1; FaceNormalsHelper$1.prototype.update = ( function () { var v1 = new Vector3$1(); var v2 = new Vector3$1(); var normalMatrix = new Matrix3$1(); 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$1( light, size ) { Object3D$1.call( this ); this.light = light; this.light.updateMatrixWorld(); this.matrix = light.matrixWorld; this.matrixAutoUpdate = false; if ( size === undefined ) size = 1; var geometry = new BufferGeometry$1(); geometry.addAttribute( 'position', new Float32BufferAttribute$1( [ - size, size, 0, size, size, 0, size, - size, 0, - size, - size, 0, - size, size, 0 ], 3 ) ); var material = new LineBasicMaterial$1( { fog: false } ); this.add( new Line$2( geometry, material ) ); geometry = new BufferGeometry$1(); geometry.addAttribute( 'position', new Float32BufferAttribute$1( [ 0, 0, 0, 0, 0, 1 ], 3 ) ); this.add( new Line$2( geometry, material )); this.update(); } DirectionalLightHelper$1.prototype = Object.create( Object3D$1.prototype ); DirectionalLightHelper$1.prototype.constructor = DirectionalLightHelper$1; DirectionalLightHelper$1.prototype.dispose = function () { var lightPlane = this.children[ 0 ]; var targetLine = this.children[ 1 ]; lightPlane.geometry.dispose(); lightPlane.material.dispose(); targetLine.geometry.dispose(); targetLine.material.dispose(); }; DirectionalLightHelper$1.prototype.update = function () { var v1 = new Vector3$1(); var v2 = new Vector3$1(); var v3 = new Vector3$1(); return function update() { v1.setFromMatrixPosition( this.light.matrixWorld ); v2.setFromMatrixPosition( this.light.target.matrixWorld ); v3.subVectors( v2, v1 ); var lightPlane = this.children[ 0 ]; var targetLine = this.children[ 1 ]; lightPlane.lookAt( v3 ); lightPlane.material.color.copy( this.light.color ); targetLine.lookAt( v3 ); 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$1( camera ) { var geometry = new BufferGeometry$1(); var material = new LineBasicMaterial$1( { color: 0xffffff, vertexColors: FaceColors$1 } ); var vertices = []; var colors = []; var pointMap = {}; // colors var colorFrustum = new Color$1( 0xffaa00 ); var colorCone = new Color$1( 0xff0000 ); var colorUp = new Color$1( 0x00aaff ); var colorTarget = new Color$1( 0xffffff ); var colorCross = new Color$1( 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$1( vertices, 3 ) ); geometry.addAttribute( 'color', new Float32BufferAttribute$1( colors, 3 ) ); LineSegments$1.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$1.prototype = Object.create( LineSegments$1.prototype ); CameraHelper$1.prototype.constructor = CameraHelper$1; CameraHelper$1.prototype.update = function () { var geometry, pointMap; var vector = new Vector3$1(); var camera = new Camera$1(); 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$1( 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$1(); geometry.setIndex( new BufferAttribute$1( indices, 1 ) ); geometry.addAttribute( 'position', new BufferAttribute$1( positions, 3 ) ); LineSegments$1.call( this, geometry, new LineBasicMaterial$1( { color: color } ) ); this.matrixAutoUpdate = false; this.update(); } BoxHelper$1.prototype = Object.create( LineSegments$1.prototype ); BoxHelper$1.prototype.constructor = BoxHelper$1; BoxHelper$1.prototype.update = ( function () { var box = new Box3$1(); 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$1.prototype.setFromObject = function ( object ) { this.object = object; this.update(); return this; }; /** * @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$1; var coneGeometry$1; function ArrowHelper$1( dir, origin, length, color, headLength, headWidth ) { // dir is assumed to be normalized Object3D$1.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$1 === undefined ) { lineGeometry$1 = new BufferGeometry$1(); lineGeometry$1.addAttribute( 'position', new Float32BufferAttribute$1( [ 0, 0, 0, 0, 1, 0 ], 3 ) ); coneGeometry$1 = new CylinderBufferGeometry$1( 0, 0.5, 1, 5, 1 ); coneGeometry$1.translate( 0, - 0.5, 0 ); } this.position.copy( origin ); this.line = new Line$2( lineGeometry$1, new LineBasicMaterial$1( { color: color } ) ); this.line.matrixAutoUpdate = false; this.add( this.line ); this.cone = new Mesh$1( coneGeometry$1, new MeshBasicMaterial$1( { color: color } ) ); this.cone.matrixAutoUpdate = false; this.add( this.cone ); this.setDirection( dir ); this.setLength( length, headLength, headWidth ); } ArrowHelper$1.prototype = Object.create( Object3D$1.prototype ); ArrowHelper$1.prototype.constructor = ArrowHelper$1; ArrowHelper$1.prototype.setDirection = ( function () { var axis = new Vector3$1(); 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$1.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$1.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 AxisHelper( 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$1(); geometry.addAttribute( 'position', new Float32BufferAttribute$1( vertices, 3 ) ); geometry.addAttribute( 'color', new Float32BufferAttribute$1( colors, 3 ) ); var material = new LineBasicMaterial$1( { vertexColors: VertexColors$1 } ); LineSegments$1.call( this, geometry, material ); } AxisHelper.prototype = Object.create( LineSegments$1.prototype ); AxisHelper.prototype.constructor = AxisHelper; /** * @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$1() { 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$1 = new Vector3$1(); var px$2 = new CubicPoly$1(); var py$1 = new CubicPoly$1(); var pz$1 = new CubicPoly$1(); function CatmullRomCurve3$1( p /* array of Vector3 */ ) { Curve$1.call( this ); this.points = p || []; this.closed = false; } CatmullRomCurve3$1.prototype = Object.create( Curve$1.prototype ); CatmullRomCurve3$1.prototype.constructor = CatmullRomCurve3$1; CatmullRomCurve3$1.prototype.getPoint = function ( t ) { var points = this.points; var l = points.length; if ( l < 2 ) console.log( 'duh, you need at least 2 points' ); var point = ( l - ( this.closed ? 0 : 1 ) ) * t; var intPoint = Math.floor( point ); var weight = point - intPoint; if ( this.closed ) { intPoint += intPoint > 0 ? 0 : ( Math.floor( Math.abs( intPoint ) / points.length ) + 1 ) * points.length; } 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$1.subVectors( points[ 0 ], points[ 1 ] ).add( points[ 0 ] ); p0 = tmp$1; } 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$1.subVectors( points[ l - 1 ], points[ l - 2 ] ).add( points[ l - 1 ] ); p3 = tmp$1; } if ( this.type === undefined || this.type === 'centripetal' || this.type === 'chordal' ) { // init Centripetal / Chordal Catmull-Rom var pow = this.type === '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$2.initNonuniformCatmullRom( p0.x, p1.x, p2.x, p3.x, dt0, dt1, dt2 ); py$1.initNonuniformCatmullRom( p0.y, p1.y, p2.y, p3.y, dt0, dt1, dt2 ); pz$1.initNonuniformCatmullRom( p0.z, p1.z, p2.z, p3.z, dt0, dt1, dt2 ); } else if ( this.type === 'catmullrom' ) { var tension = this.tension !== undefined ? this.tension : 0.5; px$2.initCatmullRom( p0.x, p1.x, p2.x, p3.x, tension ); py$1.initCatmullRom( p0.y, p1.y, p2.y, p3.y, tension ); pz$1.initCatmullRom( p0.z, p1.z, p2.z, p3.z, tension ); } return new Vector3$1( px$2.calc( weight ), py$1.calc( weight ), pz$1.calc( weight ) ); }; function CubicBezierCurve3$1( v0, v1, v2, v3 ) { Curve$1.call( this ); this.v0 = v0; this.v1 = v1; this.v2 = v2; this.v3 = v3; } CubicBezierCurve3$1.prototype = Object.create( Curve$1.prototype ); CubicBezierCurve3$1.prototype.constructor = CubicBezierCurve3$1; CubicBezierCurve3$1.prototype.getPoint = function ( t ) { var v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3; return new Vector3$1( CubicBezier$1( t, v0.x, v1.x, v2.x, v3.x ), CubicBezier$1( t, v0.y, v1.y, v2.y, v3.y ), CubicBezier$1( t, v0.z, v1.z, v2.z, v3.z ) ); }; function QuadraticBezierCurve3$1( v0, v1, v2 ) { Curve$1.call( this ); this.v0 = v0; this.v1 = v1; this.v2 = v2; } QuadraticBezierCurve3$1.prototype = Object.create( Curve$1.prototype ); QuadraticBezierCurve3$1.prototype.constructor = QuadraticBezierCurve3$1; QuadraticBezierCurve3$1.prototype.getPoint = function ( t ) { var v0 = this.v0, v1 = this.v1, v2 = this.v2; return new Vector3$1( QuadraticBezier$1( t, v0.x, v1.x, v2.x ), QuadraticBezier$1( t, v0.y, v1.y, v2.y ), QuadraticBezier$1( t, v0.z, v1.z, v2.z ) ); }; function LineCurve3$1( v1, v2 ) { Curve$1.call( this ); this.v1 = v1; this.v2 = v2; } LineCurve3$1.prototype = Object.create( Curve$1.prototype ); LineCurve3$1.prototype.constructor = LineCurve3$1; LineCurve3$1.prototype.getPoint = function ( t ) { if ( t === 1 ) { return this.v2.clone(); } var vector = new Vector3$1(); vector.subVectors( this.v2, this.v1 ); // diff vector.multiplyScalar( t ); vector.add( this.v1 ); return vector; }; function ArcCurve$1( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) { EllipseCurve$1.call( this, aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise ); } ArcCurve$1.prototype = Object.create( EllipseCurve$1.prototype ); ArcCurve$1.prototype.constructor = ArcCurve$1; // Curve$1.create = function ( construct, getPoint ) { console.log( 'THREE.Curve.create() has been deprecated' ); construct.prototype = Object.create( Curve$1.prototype ); construct.prototype.constructor = construct; construct.prototype.getPoint = getPoint; return construct; }; // function Spline$1( points ) { console.warn( 'THREE.Spline has been removed. Use THREE.CatmullRomCurve3 instead.' ); CatmullRomCurve3$1.call( this, points ); this.type = 'catmullrom'; } Spline$1.prototype = Object.create( CatmullRomCurve3$1.prototype ); Object.assign( Spline$1.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$1.prototype.setColors = function () { console.error( 'THREE.GridHelper: setColors() has been deprecated, pass them in the constructor instead.' ); }; // Object.assign( Box2$1.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$1.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$1.prototype.center = function ( optionalTarget ) { console.warn( 'THREE.Line3: .center() has been renamed to .getCenter().' ); return this.getCenter( optionalTarget ); }; _Math$1.random16 = function () { console.warn( 'THREE.Math.random16() has been deprecated. Use Math.random() instead.' ); return Math.random(); }; Object.assign( Matrix3$1.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.warn( 'THREE.Matrix3: .multiplyVector3Array() has been renamed. Use matrix.applyToVector3Array( array ) instead.' ); return this.applyToVector3Array( a ); }, 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$1.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$1(); 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.warn( 'THREE.Matrix4: .multiplyVector3Array() has been renamed. Use matrix.applyToVector3Array( array ) instead.' ); return this.applyToVector3Array( a ); }, 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$2.prototype.isIntersectionLine = function ( line ) { console.warn( 'THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine().' ); return this.intersectsLine( line ); }; Quaternion$1.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$1.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( Shape$2.prototype, { extrude: function ( options ) { console.warn( 'THREE.Shape: .extrude() has been removed. Use ExtrudeGeometry() instead.' ); return new ExtrudeGeometry$1( this, options ); }, makeGeometry: function ( options ) { console.warn( 'THREE.Shape: .makeGeometry() has been removed. Use ShapeGeometry() instead.' ); return new ShapeGeometry$1( this, options ); } } ); Object.assign( Vector2$1.prototype, { fromAttribute: function ( attribute, index, offset ) { console.error( 'THREE.Vector2: .fromAttribute() has been renamed to .fromBufferAttribute().' ); return this.fromBufferAttribute( attribute, index, offset ); } } ); Object.assign( Vector3$1.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.error( 'THREE.Vector3: .fromAttribute() has been renamed to .fromBufferAttribute().' ); return this.fromBufferAttribute( attribute, index, offset ); } } ); Object.assign( Vector4$1.prototype, { fromAttribute: function ( attribute, index, offset ) { console.error( 'THREE.Vector4: .fromAttribute() has been renamed to .fromBufferAttribute().' ); return this.fromBufferAttribute( attribute, index, offset ); } } ); // Geometry$1.prototype.computeTangents = function () { console.warn( 'THREE.Geometry: .computeTangents() has been removed.' ); }; Object.assign( Object3D$1.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 ); } } ); Object.defineProperties( Object3D$1.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$1.prototype, { objects: { get: function () { console.warn( 'THREE.LOD: .objects has been renamed to .levels.' ); return this.levels; } } } ); Object.defineProperty( Skeleton$1.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$1.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$2.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$1.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$1.prototype, { length: { get: function () { console.warn( 'THREE.BufferAttribute: .length has been deprecated. Use .count instead.' ); return this.array.length; } } } ); Object.assign( BufferGeometry$1.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$1.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.defineProperties( Uniform$1.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$1.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$1(); } } } ); Object.defineProperties( MeshPhongMaterial$1.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$1.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$1.prototype, { getCurrentRenderTarget: function () { console.warn( 'THREE.WebGLRenderer: .getCurrentRenderTarget() is now .getRenderTarget().' ); return this.getRenderTarget(); }, 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.' ); } } ); Object.defineProperties( WebGLRenderer$1.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 () { return this.shadowMap.cullFace; }, set: function ( value ) { console.warn( 'THREE.WebGLRenderer: .shadowMapCullFace is now .shadowMap.cullFace.' ); this.shadowMap.cullFace = value; } } } ); Object.defineProperties( WebGLShadowMap$1.prototype, { cullFace: { get: function () { return this.renderReverseSided ? CullFaceFront$1 : CullFaceBack$1; }, set: function ( cullFace ) { var value = ( cullFace !== CullFaceBack$1 ); console.warn( "WebGLRenderer: .shadowMap.cullFace is deprecated. Set .shadowMap.renderReverseSided to " + value + "." ); this.renderReverseSided = value; } } } ); // Object.defineProperties( WebGLRenderTarget$1.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; } } } ); // Audio$1.prototype.load = function ( file ) { console.warn( 'THREE.Audio: .load has been deprecated. Use THREE.AudioLoader instead.' ); var scope = this; var audioLoader = new AudioLoader$1(); audioLoader.load( file, function ( buffer ) { scope.setBuffer( buffer ); } ); return this; }; AudioAnalyser$1.prototype.getData = function () { console.warn( 'THREE.AudioAnalyser: .getData() is now .getFrequencyData().' ); return this.getFrequencyData(); }; /** * @author dmarcos / https://github.com/dmarcos * @author mrdoob / http://mrdoob.com * * WebVR Spec: http://mozvr.github.io/webvr-spec/webvr.html * * Firefox: http://mozvr.com/downloads/ * Chromium: https://webvr.info/get-chrome * */ var VREffect = function VREffect(renderer, onError) { var vrDisplay, vrDisplays; var eyeTranslationL = new Vector3$1(); var eyeTranslationR = new Vector3$1(); var renderRectL, renderRectR; var frameData = null; if ('VRFrameData' in window) { frameData = new VRFrameData(); } function gotVRDisplays(displays) { vrDisplays = displays; if (displays.length > 0) { vrDisplay = displays[0]; } else { if (onError) onError('HMD not available'); } } if (navigator.getVRDisplays) { navigator.getVRDisplays().then(gotVRDisplays).catch(function () { console.warn('THREE.VREffect: Unable to get VR Displays'); }); } // this.isPresenting = false; this.scale = 1; var scope = this; var rendererSize = renderer.getSize(); var rendererUpdateStyle = false; var rendererPixelRatio = renderer.getPixelRatio(); this.getVRDisplay = function () { return vrDisplay; }; this.setVRDisplay = function (value) { vrDisplay = value; }; this.getVRDisplays = function () { console.warn('THREE.VREffect: getVRDisplays() is being deprecated.'); return vrDisplays; }; this.setSize = function (width, height, updateStyle) { rendererSize = { width: width, height: height }; rendererUpdateStyle = updateStyle; if (scope.isPresenting) { var eyeParamsL = vrDisplay.getEyeParameters('left'); renderer.setPixelRatio(1); renderer.setSize(eyeParamsL.renderWidth * 2, eyeParamsL.renderHeight, false); } else { renderer.setPixelRatio(rendererPixelRatio); renderer.setSize(width, height, updateStyle); } }; // fullscreen var canvas = renderer.domElement; var defaultLeftBounds = [0.0, 0.0, 0.5, 1.0]; var defaultRightBounds = [0.5, 0.0, 0.5, 1.0]; function onVRDisplayPresentChange() { var wasPresenting = scope.isPresenting; scope.isPresenting = vrDisplay !== undefined && vrDisplay.isPresenting; if (scope.isPresenting) { var eyeParamsL = vrDisplay.getEyeParameters('left'); var eyeWidth = eyeParamsL.renderWidth; var eyeHeight = eyeParamsL.renderHeight; if (!wasPresenting) { rendererPixelRatio = renderer.getPixelRatio(); rendererSize = renderer.getSize(); renderer.setPixelRatio(1); renderer.setSize(eyeWidth * 2, eyeHeight, false); } } else if (wasPresenting) { renderer.setPixelRatio(rendererPixelRatio); renderer.setSize(rendererSize.width, rendererSize.height, rendererUpdateStyle); } } window.addEventListener('vrdisplaypresentchange', onVRDisplayPresentChange, false); this.setFullScreen = function (boolean) { return new Promise(function (resolve, reject) { if (vrDisplay === undefined) { reject(new Error('No VR hardware found.')); return; } if (scope.isPresenting === boolean) { resolve(); return; } if (boolean) { resolve(vrDisplay.requestPresent([{ source: canvas }])); } else { resolve(vrDisplay.exitPresent()); } }); }; this.requestPresent = function () { return this.setFullScreen(true); }; this.exitPresent = function () { return this.setFullScreen(false); }; this.requestAnimationFrame = function (f) { if (vrDisplay !== undefined) { return vrDisplay.requestAnimationFrame(f); } else { return window.requestAnimationFrame(f); } }; this.cancelAnimationFrame = function (h) { if (vrDisplay !== undefined) { vrDisplay.cancelAnimationFrame(h); } else { window.cancelAnimationFrame(h); } }; this.submitFrame = function () { if (vrDisplay !== undefined && scope.isPresenting) { vrDisplay.submitFrame(); } }; this.autoSubmitFrame = true; // render var cameraL = new PerspectiveCamera$2(); cameraL.layers.enable(1); var cameraR = new PerspectiveCamera$2(); cameraR.layers.enable(2); this.render = function (scene, camera, renderTarget, forceClear) { if (vrDisplay && scope.isPresenting) { var autoUpdate = scene.autoUpdate; if (autoUpdate) { scene.updateMatrixWorld(); scene.autoUpdate = false; } var eyeParamsL = vrDisplay.getEyeParameters('left'); var eyeParamsR = vrDisplay.getEyeParameters('right'); eyeTranslationL.fromArray(eyeParamsL.offset); eyeTranslationR.fromArray(eyeParamsR.offset); if (Array.isArray(scene)) { console.warn('THREE.VREffect.render() no longer supports arrays. Use object.layers instead.'); scene = scene[0]; } // When rendering we don't care what the recommended size is, only what the actual size // of the backbuffer is. var size = renderer.getSize(); var layers = vrDisplay.getLayers(); var leftBounds; var rightBounds; if (layers.length) { var layer = layers[0]; leftBounds = layer.leftBounds !== null && layer.leftBounds.length === 4 ? layer.leftBounds : defaultLeftBounds; rightBounds = layer.rightBounds !== null && layer.rightBounds.length === 4 ? layer.rightBounds : defaultRightBounds; } else { leftBounds = defaultLeftBounds; rightBounds = defaultRightBounds; } renderRectL = { x: Math.round(size.width * leftBounds[0]), y: Math.round(size.height * leftBounds[1]), width: Math.round(size.width * leftBounds[2]), height: Math.round(size.height * leftBounds[3]) }; renderRectR = { x: Math.round(size.width * rightBounds[0]), y: Math.round(size.height * rightBounds[1]), width: Math.round(size.width * rightBounds[2]), height: Math.round(size.height * rightBounds[3]) }; if (renderTarget) { renderer.setRenderTarget(renderTarget); renderTarget.scissorTest = true; } else { renderer.setRenderTarget(null); renderer.setScissorTest(true); } if (renderer.autoClear || forceClear) renderer.clear(); if (camera.parent === null) camera.updateMatrixWorld(); camera.matrixWorld.decompose(cameraL.position, cameraL.quaternion, cameraL.scale); camera.matrixWorld.decompose(cameraR.position, cameraR.quaternion, cameraR.scale); var scale = this.scale; cameraL.translateOnAxis(eyeTranslationL, scale); cameraR.translateOnAxis(eyeTranslationR, scale); if (vrDisplay.getFrameData) { vrDisplay.depthNear = camera.near; vrDisplay.depthFar = camera.far; vrDisplay.getFrameData(frameData); cameraL.projectionMatrix.elements = frameData.leftProjectionMatrix; cameraR.projectionMatrix.elements = frameData.rightProjectionMatrix; } else { cameraL.projectionMatrix = fovToProjection(eyeParamsL.fieldOfView, true, camera.near, camera.far); cameraR.projectionMatrix = fovToProjection(eyeParamsR.fieldOfView, true, camera.near, camera.far); } // render left eye if (renderTarget) { renderTarget.viewport.set(renderRectL.x, renderRectL.y, renderRectL.width, renderRectL.height); renderTarget.scissor.set(renderRectL.x, renderRectL.y, renderRectL.width, renderRectL.height); } else { renderer.setViewport(renderRectL.x, renderRectL.y, renderRectL.width, renderRectL.height); renderer.setScissor(renderRectL.x, renderRectL.y, renderRectL.width, renderRectL.height); } renderer.render(scene, cameraL, renderTarget, forceClear); // render right eye if (renderTarget) { renderTarget.viewport.set(renderRectR.x, renderRectR.y, renderRectR.width, renderRectR.height); renderTarget.scissor.set(renderRectR.x, renderRectR.y, renderRectR.width, renderRectR.height); } else { renderer.setViewport(renderRectR.x, renderRectR.y, renderRectR.width, renderRectR.height); renderer.setScissor(renderRectR.x, renderRectR.y, renderRectR.width, renderRectR.height); } renderer.render(scene, cameraR, renderTarget, forceClear); if (renderTarget) { renderTarget.viewport.set(0, 0, size.width, size.height); renderTarget.scissor.set(0, 0, size.width, size.height); renderTarget.scissorTest = false; renderer.setRenderTarget(null); } else { renderer.setViewport(0, 0, size.width, size.height); renderer.setScissorTest(false); } if (autoUpdate) { scene.autoUpdate = true; } if (scope.autoSubmitFrame) { scope.submitFrame(); } return; } // Regular render mode if not HMD renderer.render(scene, camera, renderTarget, forceClear); }; this.dispose = function () { window.removeEventListener('vrdisplaypresentchange', onVRDisplayPresentChange, false); }; // function fovToNDCScaleOffset(fov) { var pxscale = 2.0 / (fov.leftTan + fov.rightTan); var pxoffset = (fov.leftTan - fov.rightTan) * pxscale * 0.5; var pyscale = 2.0 / (fov.upTan + fov.downTan); var pyoffset = (fov.upTan - fov.downTan) * pyscale * 0.5; return { scale: [pxscale, pyscale], offset: [pxoffset, pyoffset] }; } function fovPortToProjection(fov, rightHanded, zNear, zFar) { rightHanded = rightHanded === undefined ? true : rightHanded; zNear = zNear === undefined ? 0.01 : zNear; zFar = zFar === undefined ? 10000.0 : zFar; var handednessScale = rightHanded ? -1.0 : 1.0; // start with an identity matrix var mobj = new Matrix4$1(); var m = mobj.elements; // and with scale/offset info for normalized device coords var scaleAndOffset = fovToNDCScaleOffset(fov); // X result, map clip edges to [-w,+w] m[0 * 4 + 0] = scaleAndOffset.scale[0]; m[0 * 4 + 1] = 0.0; m[0 * 4 + 2] = scaleAndOffset.offset[0] * handednessScale; m[0 * 4 + 3] = 0.0; // Y result, map clip edges to [-w,+w] // Y offset is negated because this proj matrix transforms from world coords with Y=up, // but the NDC scaling has Y=down (thanks D3D?) m[1 * 4 + 0] = 0.0; m[1 * 4 + 1] = scaleAndOffset.scale[1]; m[1 * 4 + 2] = -scaleAndOffset.offset[1] * handednessScale; m[1 * 4 + 3] = 0.0; // Z result (up to the app) m[2 * 4 + 0] = 0.0; m[2 * 4 + 1] = 0.0; m[2 * 4 + 2] = zFar / (zNear - zFar) * -handednessScale; m[2 * 4 + 3] = zFar * zNear / (zNear - zFar); // W result (= Z in) m[3 * 4 + 0] = 0.0; m[3 * 4 + 1] = 0.0; m[3 * 4 + 2] = handednessScale; m[3 * 4 + 3] = 0.0; mobj.transpose(); return mobj; } function fovToProjection(fov, rightHanded, zNear, zFar) { var DEG2RAD = Math.PI / 180.0; var fovPort = { upTan: Math.tan(fov.upDegrees * DEG2RAD), downTan: Math.tan(fov.downDegrees * DEG2RAD), leftTan: Math.tan(fov.leftDegrees * DEG2RAD), rightTan: Math.tan(fov.rightDegrees * DEG2RAD) }; return fovPortToProjection(fovPort, rightHanded, zNear, zFar); } }; /** * @author dmarcos / https://github.com/dmarcos * @author mrdoob / http://mrdoob.com * @author halvves / https://github.com/halvves (i only es6 moduled it) */ class VRControls { constructor(camera, onError) { this.camera = camera; this.vrDisplay; this.vrDisplays; this.standingMatrix = new Matrix4$1(); this.frameData = null; if ('VRFrameData' in window) { this.frameData = new VRFrameData(); } if (navigator.getVRDisplays) { navigator .getVRDisplays() .then((displays) => { this.vrDisplays = displays; if (displays.length > 0) { this.vrDisplay = displays[0]; } else { if (onError) onError('VR input not available.'); } }) .catch(() => { console.warn('VRControls: Unable to get VR Displays'); }); } // the Rift SDK returns the position in meters // this scale factor allows the user to define how meters // are converted to scene units. this.scale = 1; // If true will use "standing space" coordinate system where y=0 is the // floor and x=0, z=0 is the center of the room. this.standing = false; // Distance from the users eyes to the floor in meters. Used when // standing=true but the VRDisplay doesn't provide stageParameters. this.userHeight = 1.6; } getVRDisplay() { return this.vrDisplay; }; setVRDisplay(value) { this.vrDisplay = value; }; getVRDisplays() { console.warn('VRControls: getVRDisplays() is being deprecated.'); return this.vrDisplays; }; getStandingMatrix() { return this.standingMatrix; }; update() { const camera = this.camera; if (this.vrDisplay) { let pose; if (this.vrDisplay.getFrameData) { this.vrDisplay.getFrameData(this.frameData); pose = this.frameData.pose; } else if (this.vrDisplay.getPose) { pose = this.vrDisplay.getPose(); } if (pose.orientation !== null) { camera.quaternion.fromArray(pose.orientation); } if (pose.position !== null) { camera.position.fromArray(pose.position); } else { camera.position.set(0, 0, 0); } if (this.standing) { if (this.vrDisplay.stageParameters) { camera.updateMatrix(); this.standingMatrix.fromArray(this.vrDisplay.stageParameters.sittingToStandingTransform); camera.applyMatrix(this.standingMatrix); } else { camera.position.setY(camera.position.y + this.userHeight); } } camera.position.multiplyScalar(this.scale); } }; dispose() { this.vrDisplay = null; }; } /** * @author mrdoob / http://mrdoob.com * @author Mugen87 / https://github.com/Mugen87 * * Based on @tojiro's vr-samples-utils.js */ var WEBVR = { isAvailable: function isAvailable() { console.warn('WEBVR: isAvailable() is being deprecated. Use .checkAvailability() instead.'); return navigator.getVRDisplays !== undefined; }, checkAvailability: function checkAvailability() { return new Promise(function (resolve, reject) { if (navigator.getVRDisplays !== undefined) { navigator.getVRDisplays().then(function (displays) { if (displays.length === 0) { reject('WebVR supported, but no VRDisplays found.'); } else { resolve(); } }); } else { reject('Your browser does not support WebVR. See webvr.info for assistance.'); } }); }, getVRDisplay: function getVRDisplay(onDisplay) { if ('getVRDisplays' in navigator) { navigator.getVRDisplays().then(function (displays) { onDisplay(displays[0]); }); } }, getMessage: function getMessage() { console.warn('WEBVR: getMessage() is being deprecated. Use .getMessageContainer( message ) instead.'); var message; if (navigator.getVRDisplays) { navigator.getVRDisplays().then(function (displays) { if (displays.length === 0) message = 'WebVR supported, but no VRDisplays found.'; }); } else { message = 'Your browser does not support WebVR. See webvr.info for assistance.'; } if (message !== undefined) { var container = document.createElement('div'); container.style.position = 'absolute'; container.style.left = '0'; container.style.top = '0'; container.style.right = '0'; container.style.zIndex = '999'; container.align = 'center'; var error = document.createElement('div'); error.style.fontFamily = 'sans-serif'; error.style.fontSize = '16px'; error.style.fontStyle = 'normal'; error.style.lineHeight = '26px'; error.style.backgroundColor = '#fff'; error.style.color = '#000'; error.style.padding = '10px 20px'; error.style.margin = '50px'; error.style.display = 'inline-block'; error.innerHTML = message; container.appendChild(error); return container; } }, getMessageContainer: function getMessageContainer(message) { var container = document.createElement('div'); container.style.position = 'absolute'; container.style.left = '0'; container.style.top = '0'; container.style.right = '0'; container.style.zIndex = '999'; container.align = 'center'; var error = document.createElement('div'); error.style.fontFamily = 'sans-serif'; error.style.fontSize = '16px'; error.style.fontStyle = 'normal'; error.style.lineHeight = '26px'; error.style.backgroundColor = '#fff'; error.style.color = '#000'; error.style.padding = '10px 20px'; error.style.margin = '50px'; error.style.display = 'inline-block'; error.innerHTML = message; container.appendChild(error); return container; }, getButton: function getButton(display, canvas) { if ('VREffect' in THREE && display instanceof THREE.VREffect) { console.error('WebVR.getButton() now expects a VRDisplay.'); return document.createElement('button'); } var button = document.createElement('button'); button.style.position = 'absolute'; button.style.left = 'calc(50% - 50px)'; button.style.bottom = '20px'; button.style.width = '100px'; button.style.border = '0'; button.style.padding = '8px'; button.style.cursor = 'pointer'; button.style.backgroundColor = '#000'; button.style.color = '#fff'; button.style.fontFamily = 'sans-serif'; button.style.fontSize = '13px'; button.style.fontStyle = 'normal'; button.style.textAlign = 'center'; button.style.zIndex = '999'; if (display) { button.textContent = 'ENTER VR'; button.onclick = function () { display.isPresenting ? display.exitPresent() : display.requestPresent([{ source: canvas }]); }; window.addEventListener('vrdisplaypresentchange', function () { button.textContent = display.isPresenting ? 'EXIT VR' : 'ENTER VR'; }, false); } else { button.textContent = 'NO VR DISPLAY'; } return button; } }; var VRModule = /*#__PURE__*/ function () { function VRModule() { var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; _classCallCheck(this, VRModule); this.params = Object.assign(params, { message: true, button: true }); this.scene = null; this.camera = null; this.effect = null; } _createClass(VRModule, [{ key: "manager", value: function manager(_manager) { var _this = this; _manager.define('vr'); var rendering = _manager.use('rendering'); var renderer = _manager.get('renderer'); var resize = _manager.use('resize'); this.effect = new VREffect(renderer); this.scene = _manager.get('scene'); this.camera = _manager.get('camera'); rendering.effect(this.effect); // TODO: Fix resize. resize.addCallback(function (width, height) { _this.effect.setSize(+width, +height); }); // WEBVR var _this$params = this.params, message = _this$params.message, button = _this$params.button; if (message) WEBVR.checkAvailability().catch(function (message) { document.body.appendChild(WEBVR.getMessageContainer(message)); }); if (button) WEBVR.getVRDisplay(function (display) { var vrbtn = WEBVR.getButton(display, renderer.domElement); vrbtn.className = 'vr-btn'; document.body.appendChild(vrbtn); }); } }]); return VRModule; }(); var VR2Module = /*#__PURE__*/ function () { function VR2Module() { _classCallCheck(this, VR2Module); this.display = new Promise(function (resolve) { return WEBVR.getVRDisplay(function (display) { return resolve(display); }); }); } _createClass(VR2Module, [{ key: "manager", value: function manager(_manager2) { _manager2.define('vr'); var renderer = _manager2.get('renderer'); renderer.vr.enabled = true; console.log(REVISION$1); console.log(1); this.display.then(function (display) { renderer.vr.setDevice(display); var vrbtn = WEBVR.getButton(display, renderer.domElement); vrbtn.className = 'vr-btn'; document.body.appendChild(vrbtn); }); } }]); return VR2Module; }(); var VRControls$1 = /*#__PURE__*/ function (_ControlsModule) { function VRControls$$1(_ref) { var object = _ref.object, onError = _ref.onError, intensity = _ref.intensity; _classCallCheck(this, VRControls$$1); var controls = new VRControls(object.native, onError); controls.standing = true; controls.scale = intensity; return _possibleConstructorReturn(this, _getPrototypeOf(VRControls$$1).call(this, { controls: controls })); } _inherits(VRControls$$1, _ControlsModule); return VRControls$$1; }(ControlsModule); exports.WEBVR = WEBVR; exports.VRModule = VRModule; exports.VR2Module = VR2Module; exports.VRControls = VRControls$1; Object.defineProperty(exports, '__esModule', { value: true }); }))); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVlJLaXQuanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9tb2R1bGVzL2V4dHJhL3JvbGx1cFBsdWdpbkJhYmVsSGVscGVycyIsIi4uLy4uL25vZGVfbW9kdWxlcy93aHMvYnVpbGQvd2hzLm1vZHVsZS5qcyIsIi4uL3NyYy9tb2R1bGVzL2V4dHJhL25vZGVfbW9kdWxlcy90aHJlZS9idWlsZC90aHJlZS5tb2R1bGUuanMiLCIuLi9zcmMvbW9kdWxlcy9leHRyYS92ci9WUkVmZmVjdC5qcyIsIi4uL3NyYy9tb2R1bGVzL2V4dHJhL25vZGVfbW9kdWxlcy90aHJlZS12cmNvbnRyb2xzLW1vZHVsZS9zcmMvdnItY29udHJvbHMuanMiLCIuLi9zcmMvbW9kdWxlcy9leHRyYS92ci9XZWJWUi5qcyIsIi4uL3NyYy9tb2R1bGVzL2V4dHJhL1ZSS2l0LmpzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IF90eXBlb2YgYXMgdHlwZW9mLCBfanN4IGFzIGpzeCwgX2FzeW5jSXRlcmF0b3IgYXMgYXN5bmNJdGVyYXRvciwgX0F3YWl0VmFsdWUgYXMgQXdhaXRWYWx1ZSwgX0FzeW5jR2VuZXJhdG9yIGFzIEFzeW5jR2VuZXJhdG9yLCBfd3JhcEFzeW5jR2VuZXJhdG9yIGFzIHdyYXBBc3luY0dlbmVyYXRvciwgX2F3YWl0QXN5bmNHZW5lcmF0b3IgYXMgYXdhaXRBc3luY0dlbmVyYXRvciwgX2FzeW5jR2VuZXJhdG9yRGVsZWdhdGUgYXMgYXN5bmNHZW5lcmF0b3JEZWxlZ2F0ZSwgX2FzeW5jVG9HZW5lcmF0b3IgYXMgYXN5bmNUb0dlbmVyYXRvciwgX2NsYXNzQ2FsbENoZWNrIGFzIGNsYXNzQ2FsbENoZWNrLCBfY3JlYXRlQ2xhc3MgYXMgY3JlYXRlQ2xhc3MsIF9kZWZpbmVFbnVtZXJhYmxlUHJvcGVydGllcyBhcyBkZWZpbmVFbnVtZXJhYmxlUHJvcGVydGllcywgX2RlZmF1bHRzIGFzIGRlZmF1bHRzLCBfZGVmaW5lUHJvcGVydHkgYXMgZGVmaW5lUHJvcGVydHksIF9leHRlbmRzIGFzIGV4dGVuZHMsIF9vYmplY3RTcHJlYWQgYXMgb2JqZWN0U3ByZWFkLCBfaW5oZXJpdHMgYXMgaW5oZXJpdHMsIF9pbmhlcml0c0xvb3NlIGFzIGluaGVyaXRzTG9vc2UsIF9nZXRQcm90b3R5cGVPZiBhcyBnZXRQcm90b3R5cGVPZiwgX3NldFByb3RvdHlwZU9mIGFzIHNldFByb3RvdHlwZU9mLCBfY29uc3RydWN0IGFzIGNvbnN0cnVjdCwgX3dyYXBOYXRpdmVTdXBlciBhcyB3cmFwTmF0aXZlU3VwZXIsIF9pbnN0YW5jZW9mIGFzIGluc3RhbmNlb2YsIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQgYXMgaW50ZXJvcFJlcXVpcmVEZWZhdWx0LCBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCBhcyBpbnRlcm9wUmVxdWlyZVdpbGRjYXJkLCBfbmV3QXJyb3dDaGVjayBhcyBuZXdBcnJvd0NoZWNrLCBfb2JqZWN0RGVzdHJ1Y3R1cmluZ0VtcHR5IGFzIG9iamVjdERlc3RydWN0dXJpbmdFbXB0eSwgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGFzIG9iamVjdFdpdGhvdXRQcm9wZXJ0aWVzLCBfYXNzZXJ0VGhpc0luaXRpYWxpemVkIGFzIGFzc2VydFRoaXNJbml0aWFsaXplZCwgX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4gYXMgcG9zc2libGVDb25zdHJ1Y3RvclJldHVybiwgX3N1cGVyUHJvcEJhc2UgYXMgc3VwZXJQcm9wQmFzZSwgX2dldCBhcyBnZXQsIF9zZXQgYXMgc2V0LCBfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsIGFzIHRhZ2dlZFRlbXBsYXRlTGl0ZXJhbCwgX3RhZ2dlZFRlbXBsYXRlTGl0ZXJhbExvb3NlIGFzIHRhZ2dlZFRlbXBsYXRlTGl0ZXJhbExvb3NlLCBfdGVtcG9yYWxSZWYgYXMgdGVtcG9yYWxSZWYsIF9yZWFkT25seUVycm9yIGFzIHJlYWRPbmx5RXJyb3IsIF9jbGFzc05hbWVURFpFcnJvciBhcyBjbGFzc05hbWVURFpFcnJvciwgX3RlbXBvcmFsVW5kZWZpbmVkIGFzIHRlbXBvcmFsVW5kZWZpbmVkLCBfc2xpY2VkVG9BcnJheSBhcyBzbGljZWRUb0FycmF5LCBfc2xpY2VkVG9BcnJheUxvb3NlIGFzIHNsaWNlZFRvQXJyYXlMb29zZSwgX3RvQXJyYXkgYXMgdG9BcnJheSwgX3RvQ29uc3VtYWJsZUFycmF5IGFzIHRvQ29uc3VtYWJsZUFycmF5LCBfYXJyYXlXaXRob3V0SG9sZXMgYXMgYXJyYXlXaXRob3V0SG9sZXMsIF9hcnJheVdpdGhIb2xlcyBhcyBhcnJheVdpdGhIb2xlcywgX2l0ZXJhYmxlVG9BcnJheSBhcyBpdGVyYWJsZVRvQXJyYXksIF9pdGVyYWJsZVRvQXJyYXlMaW1pdCBhcyBpdGVyYWJsZVRvQXJyYXlMaW1pdCwgX2l0ZXJhYmxlVG9BcnJheUxpbWl0TG9vc2UgYXMgaXRlcmFibGVUb0FycmF5TGltaXRMb29zZSwgX25vbkl0ZXJhYmxlU3ByZWFkIGFzIG5vbkl0ZXJhYmxlU3ByZWFkLCBfbm9uSXRlcmFibGVSZXN0IGFzIG5vbkl0ZXJhYmxlUmVzdCwgX3NraXBGaXJzdEdlbmVyYXRvck5leHQgYXMgc2tpcEZpcnN0R2VuZXJhdG9yTmV4dCwgX3RvUHJvcGVydHlLZXkgYXMgdG9Qcm9wZXJ0eUtleSwgX2luaXRpYWxpemVyV2FybmluZ0hlbHBlciBhcyBpbml0aWFsaXplcldhcm5pbmdIZWxwZXIsIF9pbml0aWFsaXplckRlZmluZVByb3BlcnR5IGFzIGluaXRpYWxpemVyRGVmaW5lUHJvcGVydHksIF9hcHBseURlY29yYXRlZERlc2NyaXB0b3IgYXMgYXBwbHlEZWNvcmF0ZWREZXNjcmlwdG9yLCBfY2xhc3NQcml2YXRlRmllbGRMb29zZUtleSBhcyBjbGFzc1ByaXZhdGVGaWVsZExvb3NlS2V5LCBfY2xhc3NQcml2YXRlRmllbGRMb29zZUJhc2UgYXMgY2xhc3NQcml2YXRlRmllbGRMb29zZUJhc2UsIF9jbGFzc1ByaXZhdGVGaWVsZEdldCBhcyBjbGFzc1ByaXZhdGVGaWVsZEdldCwgX2NsYXNzUHJpdmF0ZUZpZWxkU2V0IGFzIGNsYXNzUHJpdmF0ZUZpZWxkU2V0IH07XG5cbmZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7XG4gIGlmICh0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIikge1xuICAgIF90eXBlb2YgPSBmdW5jdGlvbiAob2JqKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIG9iajtcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIF90eXBlb2YgPSBmdW5jdGlvbiAob2JqKSB7XG4gICAgICByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIF90eXBlb2Yob2JqKTtcbn1cblxudmFyIFJFQUNUX0VMRU1FTlRfVFlQRTtcblxuZnVuY3Rpb24gX2pzeCh0eXBlLCBwcm9wcywga2V5LCBjaGlsZHJlbikge1xuICBpZiAoIVJFQUNUX0VMRU1FTlRfVFlQRSkge1xuICAgIFJFQUNUX0VMRU1FTlRfVFlQRSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wuZm9yICYmIFN5bWJvbC5mb3IoXCJyZWFjdC5lbGVtZW50XCIpIHx8IDB4ZWFjNztcbiAgfVxuXG4gIHZhciBkZWZhdWx0UHJvcHMgPSB0eXBlICYmIHR5cGUuZGVmYXVsdFByb3BzO1xuICB2YXIgY2hpbGRyZW5MZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoIC0gMztcblxuICBpZiAoIXByb3BzICYmIGNoaWxkcmVuTGVuZ3RoICE9PSAwKSB7XG4gICAgcHJvcHMgPSB7XG4gICAgICBjaGlsZHJlbjogdm9pZCAwXG4gICAgfTtcbiAgfVxuXG4gIGlmIChwcm9wcyAmJiBkZWZhdWx0UHJvcHMpIHtcbiAgICBmb3IgKHZhciBwcm9wTmFtZSBpbiBkZWZhdWx0UHJvcHMpIHtcbiAgICAgIGlmIChwcm9wc1twcm9wTmFtZV0gPT09IHZvaWQgMCkge1xuICAgICAgICBwcm9wc1twcm9wTmFtZV0gPSBkZWZhdWx0UHJvcHNbcHJvcE5hbWVdO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmICghcHJvcHMpIHtcbiAgICBwcm9wcyA9IGRlZmF1bHRQcm9wcyB8fCB7fTtcbiAgfVxuXG4gIGlmIChjaGlsZHJlbkxlbmd0aCA9PT0gMSkge1xuICAgIHByb3BzLmNoaWxkcmVuID0gY2hpbGRyZW47XG4gIH0gZWxzZSBpZiAoY2hpbGRyZW5MZW5ndGggPiAxKSB7XG4gICAgdmFyIGNoaWxkQXJyYXkgPSBuZXcgQXJyYXkoY2hpbGRyZW5MZW5ndGgpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbkxlbmd0aDsgaSsrKSB7XG4gICAgICBjaGlsZEFycmF5W2ldID0gYXJndW1lbnRzW2kgKyAzXTtcbiAgICB9XG5cbiAgICBwcm9wcy5jaGlsZHJlbiA9IGNoaWxkQXJyYXk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgICQkdHlwZW9mOiBSRUFDVF9FTEVNRU5UX1RZUEUsXG4gICAgdHlwZTogdHlwZSxcbiAgICBrZXk6IGtleSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6ICcnICsga2V5LFxuICAgIHJlZjogbnVsbCxcbiAgICBwcm9wczogcHJvcHMsXG4gICAgX293bmVyOiBudWxsXG4gIH07XG59XG5cbmZ1bmN0aW9uIF9hc3luY0l0ZXJhdG9yKGl0ZXJhYmxlKSB7XG4gIHZhciBtZXRob2Q7XG5cbiAgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGlmIChTeW1ib2wuYXN5bmNJdGVyYXRvcikge1xuICAgICAgbWV0aG9kID0gaXRlcmFibGVbU3ltYm9sLmFzeW5jSXRlcmF0b3JdO1xuICAgICAgaWYgKG1ldGhvZCAhPSBudWxsKSByZXR1cm4gbWV0aG9kLmNhbGwoaXRlcmFibGUpO1xuICAgIH1cblxuICAgIGlmIChTeW1ib2wuaXRlcmF0b3IpIHtcbiAgICAgIG1ldGhvZCA9IGl0ZXJhYmxlW1N5bWJvbC5pdGVyYXRvcl07XG4gICAgICBpZiAobWV0aG9kICE9IG51bGwpIHJldHVybiBtZXRob2QuY2FsbChpdGVyYWJsZSk7XG4gICAgfVxuICB9XG5cbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk9iamVjdCBpcyBub3QgYXN5bmMgaXRlcmFibGVcIik7XG59XG5cbmZ1bmN0aW9uIF9Bd2FpdFZhbHVlKHZhbHVlKSB7XG4gIHRoaXMud3JhcHBlZCA9IHZhbHVlO1xufVxuXG5mdW5jdGlvbiBfQXN5bmNHZW5lcmF0b3IoZ2VuKSB7XG4gIHZhciBmcm9udCwgYmFjaztcblxuICBmdW5jdGlvbiBzZW5kKGtleSwgYXJnKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIHZhciByZXF1ZXN0ID0ge1xuICAgICAgICBrZXk6IGtleSxcbiAgICAgICAgYXJnOiBhcmcsXG4gICAgICAgIHJlc29sdmU6IHJlc29sdmUsXG4gICAgICAgIHJlamVjdDogcmVqZWN0LFxuICAgICAgICBuZXh0OiBudWxsXG4gICAgICB9O1xuXG4gICAgICBpZiAoYmFjaykge1xuICAgICAgICBiYWNrID0gYmFjay5uZXh0ID0gcmVxdWVzdDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZyb250ID0gYmFjayA9IHJlcXVlc3Q7XG4gICAgICAgIHJlc3VtZShrZXksIGFyZyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiByZXN1bWUoa2V5LCBhcmcpIHtcbiAgICB0cnkge1xuICAgICAgdmFyIHJlc3VsdCA9IGdlbltrZXldKGFyZyk7XG4gICAgICB2YXIgdmFsdWUgPSByZXN1bHQudmFsdWU7XG4gICAgICB2YXIgd3JhcHBlZEF3YWl0ID0gdmFsdWUgaW5zdGFuY2VvZiBfQXdhaXRWYWx1ZTtcbiAgICAgIFByb21pc2UucmVzb2x2ZSh3cmFwcGVkQXdhaXQgPyB2YWx1ZS53cmFwcGVkIDogdmFsdWUpLnRoZW4oZnVuY3Rpb24gKGFyZykge1xuICAgICAgICBpZiAod3JhcHBlZEF3YWl0KSB7XG4gICAgICAgICAgcmVzdW1lKFwibmV4dFwiLCBhcmcpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHNldHRsZShyZXN1bHQuZG9uZSA/IFwicmV0dXJuXCIgOiBcIm5vcm1hbFwiLCBhcmcpO1xuICAgICAgfSwgZnVuY3Rpb24gKGVycikge1xuICAgICAgICByZXN1bWUoXCJ0aHJvd1wiLCBlcnIpO1xuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBzZXR0bGUoXCJ0aHJvd1wiLCBlcnIpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHNldHRsZSh0eXBlLCB2YWx1ZSkge1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBcInJldHVyblwiOlxuICAgICAgICBmcm9udC5yZXNvbHZlKHtcbiAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgZG9uZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgXCJ0aHJvd1wiOlxuICAgICAgICBmcm9udC5yZWplY3QodmFsdWUpO1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgZnJvbnQucmVzb2x2ZSh7XG4gICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgIGRvbmU6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICBmcm9udCA9IGZyb250Lm5leHQ7XG5cbiAgICBpZiAoZnJvbnQpIHtcbiAgICAgIHJlc3VtZShmcm9udC5rZXksIGZyb250LmFyZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJhY2sgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHRoaXMuX2ludm9rZSA9IHNlbmQ7XG5cbiAgaWYgKHR5cGVvZiBnZW4ucmV0dXJuICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICB0aGlzLnJldHVybiA9IHVuZGVmaW5lZDtcbiAgfVxufVxuXG5pZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIFN5bWJvbC5hc3luY0l0ZXJhdG9yKSB7XG4gIF9Bc3luY0dlbmVyYXRvci5wcm90b3R5cGVbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xufVxuXG5fQXN5bmNHZW5lcmF0b3IucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAoYXJnKSB7XG4gIHJldHVybiB0aGlzLl9pbnZva2UoXCJuZXh0XCIsIGFyZyk7XG59O1xuXG5fQXN5bmNHZW5lcmF0b3IucHJvdG90eXBlLnRocm93ID0gZnVuY3Rpb24gKGFyZykge1xuICByZXR1cm4gdGhpcy5faW52b2tlKFwidGhyb3dcIiwgYXJnKTtcbn07XG5cbl9Bc3luY0dlbmVyYXRvci5wcm90b3R5cGUucmV0dXJuID0gZnVuY3Rpb24gKGFyZykge1xuICByZXR1cm4gdGhpcy5faW52b2tlKFwicmV0dXJuXCIsIGFyZyk7XG59O1xuXG5mdW5jdGlvbiBfd3JhcEFzeW5jR2VuZXJhdG9yKGZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIG5ldyBfQXN5bmNHZW5lcmF0b3IoZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIF9hd2FpdEFzeW5jR2VuZXJhdG9yKHZhbHVlKSB7XG4gIHJldHVybiBuZXcgX0F3YWl0VmFsdWUodmFsdWUpO1xufVxuXG5mdW5jdGlvbiBfYXN5bmNHZW5lcmF0b3JEZWxlZ2F0ZShpbm5lciwgYXdhaXRXcmFwKSB7XG4gIHZhciBpdGVyID0ge30sXG4gICAgICB3YWl0aW5nID0gZmFsc2U7XG5cbiAgZnVuY3Rpb24gcHVtcChrZXksIHZhbHVlKSB7XG4gICAgd2FpdGluZyA9IHRydWU7XG4gICAgdmFsdWUgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgcmVzb2x2ZShpbm5lcltrZXldKHZhbHVlKSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRvbmU6IGZhbHNlLFxuICAgICAgdmFsdWU6IGF3YWl0V3JhcCh2YWx1ZSlcbiAgICB9O1xuICB9XG5cbiAgO1xuXG4gIGlmICh0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLml0ZXJhdG9yKSB7XG4gICAgaXRlcltTeW1ib2wuaXRlcmF0b3JdID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgfVxuXG4gIGl0ZXIubmV4dCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIGlmICh3YWl0aW5nKSB7XG4gICAgICB3YWl0aW5nID0gZmFsc2U7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHB1bXAoXCJuZXh0XCIsIHZhbHVlKTtcbiAgfTtcblxuICBpZiAodHlwZW9mIGlubmVyLnRocm93ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBpdGVyLnRocm93ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICBpZiAod2FpdGluZykge1xuICAgICAgICB3YWl0aW5nID0gZmFsc2U7XG4gICAgICAgIHRocm93IHZhbHVlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcHVtcChcInRocm93XCIsIHZhbHVlKTtcbiAgICB9O1xuICB9XG5cbiAgaWYgKHR5cGVvZiBpbm5lci5yZXR1cm4gPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGl0ZXIucmV0dXJuID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICByZXR1cm4gcHVtcChcInJldHVyblwiLCB2YWx1ZSk7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBpdGVyO1xufVxuXG5mdW5jdGlvbiBfYXN5bmNUb0dlbmVyYXRvcihmbikge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHZhciBzZWxmID0gdGhpcyxcbiAgICAgICAgYXJncyA9IGFyZ3VtZW50cztcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgdmFyIGdlbiA9IGZuLmFwcGx5KHNlbGYsIGFyZ3MpO1xuXG4gICAgICBmdW5jdGlvbiBzdGVwKGtleSwgYXJnKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdmFyIGluZm8gPSBnZW5ba2V5XShhcmcpO1xuICAgICAgICAgIHZhciB2YWx1ZSA9IGluZm8udmFsdWU7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaW5mby5kb25lKSB7XG4gICAgICAgICAgcmVzb2x2ZSh2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKHZhbHVlKS50aGVuKF9uZXh0LCBfdGhyb3cpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIF9uZXh0KHZhbHVlKSB7XG4gICAgICAgIHN0ZXAoXCJuZXh0XCIsIHZhbHVlKTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gX3Rocm93KGVycikge1xuICAgICAgICBzdGVwKFwidGhyb3dcIiwgZXJyKTtcbiAgICAgIH1cblxuICAgICAgX25leHQoKTtcbiAgICB9KTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3Rvcikge1xuICBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTtcbiAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7XG4gICAgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlO1xuICAgIGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHtcbiAgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7XG4gIGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTtcbiAgcmV0dXJuIENvbnN0cnVjdG9yO1xufVxuXG5mdW5jdGlvbiBfZGVmaW5lRW51bWVyYWJsZVByb3BlcnRpZXMob2JqLCBkZXNjcykge1xuICBmb3IgKHZhciBrZXkgaW4gZGVzY3MpIHtcbiAgICB2YXIgZGVzYyA9IGRlc2NzW2tleV07XG4gICAgZGVzYy5jb25maWd1cmFibGUgPSBkZXNjLmVudW1lcmFibGUgPSB0cnVlO1xuICAgIGlmIChcInZhbHVlXCIgaW4gZGVzYykgZGVzYy53cml0YWJsZSA9IHRydWU7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCBkZXNjKTtcbiAgfVxuXG4gIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgdmFyIG9iamVjdFN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGRlc2NzKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb2JqZWN0U3ltYm9scy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHN5bSA9IG9iamVjdFN5bWJvbHNbaV07XG4gICAgICB2YXIgZGVzYyA9IGRlc2NzW3N5bV07XG4gICAgICBkZXNjLmNvbmZpZ3VyYWJsZSA9IGRlc2MuZW51bWVyYWJsZSA9IHRydWU7XG4gICAgICBpZiAoXCJ2YWx1ZVwiIGluIGRlc2MpIGRlc2Mud3JpdGFibGUgPSB0cnVlO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwgc3ltLCBkZXNjKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gb2JqO1xufVxuXG5mdW5jdGlvbiBfZGVmYXVsdHMob2JqLCBkZWZhdWx0cykge1xuICB2YXIga2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGRlZmF1bHRzKTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIga2V5ID0ga2V5c1tpXTtcbiAgICB2YXIgdmFsdWUgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGRlZmF1bHRzLCBrZXkpO1xuXG4gICAgaWYgKHZhbHVlICYmIHZhbHVlLmNvbmZpZ3VyYWJsZSAmJiBvYmpba2V5XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gb2JqO1xufVxuXG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7XG4gIGlmIChrZXkgaW4gb2JqKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7XG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IHRydWVcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBvYmpba2V5XSA9IHZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIG9iajtcbn1cblxuZnVuY3Rpb24gX2V4dGVuZHMoKSB7XG4gIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07XG5cbiAgICAgIGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHtcbiAgICAgICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRhcmdldDtcbiAgfTtcblxuICByZXR1cm4gX2V4dGVuZHMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldICE9IG51bGwgPyBhcmd1bWVudHNbaV0gOiB7fTtcbiAgICB2YXIgb3duS2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7XG5cbiAgICBpZiAodHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIG93bktleXMgPSBvd25LZXlzLmNvbmNhdChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHNvdXJjZSkuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBzeW0pLmVudW1lcmFibGU7XG4gICAgICB9KSk7XG4gICAgfVxuXG4gICAgb3duS2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuZnVuY3Rpb24gX2luaGVyaXRzKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7XG4gIGlmICh0eXBlb2Ygc3VwZXJDbGFzcyAhPT0gXCJmdW5jdGlvblwiICYmIHN1cGVyQ2xhc3MgIT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb25cIik7XG4gIH1cblxuICBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MgJiYgc3VwZXJDbGFzcy5wcm90b3R5cGUsIHtcbiAgICBjb25zdHJ1Y3Rvcjoge1xuICAgICAgdmFsdWU6IHN1YkNsYXNzLFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9XG4gIH0pO1xuICBpZiAoc3VwZXJDbGFzcykgX3NldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKTtcbn1cblxuZnVuY3Rpb24gX2luaGVyaXRzTG9vc2Uoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHtcbiAgc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzLnByb3RvdHlwZSk7XG4gIHN1YkNsYXNzLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IHN1YkNsYXNzO1xuICBzdWJDbGFzcy5fX3Byb3RvX18gPSBzdXBlckNsYXNzO1xufVxuXG5mdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2Yobykge1xuICBfZ2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YgOiBmdW5jdGlvbiBfZ2V0UHJvdG90eXBlT2Yobykge1xuICAgIHJldHVybiBvLl9fcHJvdG9fXyB8fCBPYmplY3QuZ2V0UHJvdG90eXBlT2Yobyk7XG4gIH07XG4gIHJldHVybiBfZ2V0UHJvdG90eXBlT2Yobyk7XG59XG5cbmZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7XG4gIF9zZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCBmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkge1xuICAgIG8uX19wcm90b19fID0gcDtcbiAgICByZXR1cm4gbztcbiAgfTtcblxuICByZXR1cm4gX3NldFByb3RvdHlwZU9mKG8sIHApO1xufVxuXG5mdW5jdGlvbiBpc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSB7XG4gIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJ1bmRlZmluZWRcIiB8fCAhUmVmbGVjdC5jb25zdHJ1Y3QpIHJldHVybiBmYWxzZTtcbiAgaWYgKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pIHJldHVybiBmYWxzZTtcbiAgaWYgKHR5cGVvZiBQcm94eSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdHJ1ZTtcblxuICB0cnkge1xuICAgIERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoUmVmbGVjdC5jb25zdHJ1Y3QoRGF0ZSwgW10sIGZ1bmN0aW9uICgpIHt9KSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2NvbnN0cnVjdChQYXJlbnQsIGFyZ3MsIENsYXNzKSB7XG4gIGlmIChpc05hdGl2ZVJlZmxlY3RDb25zdHJ1Y3QoKSkge1xuICAgIF9jb25zdHJ1Y3QgPSBSZWZsZWN0LmNvbnN0cnVjdDtcbiAgfSBlbHNlIHtcbiAgICBfY29uc3RydWN0ID0gZnVuY3Rpb24gX2NvbnN0cnVjdChQYXJlbnQsIGFyZ3MsIENsYXNzKSB7XG4gICAgICB2YXIgYSA9IFtudWxsXTtcbiAgICAgIGEucHVzaC5hcHBseShhLCBhcmdzKTtcbiAgICAgIHZhciBDb25zdHJ1Y3RvciA9IEZ1bmN0aW9uLmJpbmQuYXBwbHkoUGFyZW50LCBhKTtcbiAgICAgIHZhciBpbnN0YW5jZSA9IG5ldyBDb25zdHJ1Y3RvcigpO1xuICAgICAgaWYgKENsYXNzKSBfc2V0UHJvdG90eXBlT2YoaW5zdGFuY2UsIENsYXNzLnByb3RvdHlwZSk7XG4gICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBfY29uc3RydWN0LmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG59XG5cbmZ1bmN0aW9uIF93cmFwTmF0aXZlU3VwZXIoQ2xhc3MpIHtcbiAgdmFyIF9jYWNoZSA9IHR5cGVvZiBNYXAgPT09IFwiZnVuY3Rpb25cIiA/IG5ldyBNYXAoKSA6IHVuZGVmaW5lZDtcblxuICBfd3JhcE5hdGl2ZVN1cGVyID0gZnVuY3Rpb24gX3dyYXBOYXRpdmVTdXBlcihDbGFzcykge1xuICAgIGlmIChDbGFzcyA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG5cbiAgICBpZiAodHlwZW9mIENsYXNzICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvblwiKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIF9jYWNoZSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgaWYgKF9jYWNoZS5oYXMoQ2xhc3MpKSByZXR1cm4gX2NhY2hlLmdldChDbGFzcyk7XG5cbiAgICAgIF9jYWNoZS5zZXQoQ2xhc3MsIFdyYXBwZXIpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIFdyYXBwZXIoKSB7XG4gICAgICByZXR1cm4gX2NvbnN0cnVjdChDbGFzcywgYXJndW1lbnRzLCBfZ2V0UHJvdG90eXBlT2YodGhpcykuY29uc3RydWN0b3IpO1xuICAgIH1cblxuICAgIFdyYXBwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShDbGFzcy5wcm90b3R5cGUsIHtcbiAgICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICAgIHZhbHVlOiBXcmFwcGVyLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBfc2V0UHJvdG90eXBlT2YoV3JhcHBlciwgQ2xhc3MpO1xuICB9O1xuXG4gIHJldHVybiBfd3JhcE5hdGl2ZVN1cGVyKENsYXNzKTtcbn1cblxuZnVuY3Rpb24gX2luc3RhbmNlb2YobGVmdCwgcmlnaHQpIHtcbiAgaWYgKHJpZ2h0ICE9IG51bGwgJiYgdHlwZW9mIFN5bWJvbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiByaWdodFtTeW1ib2wuaGFzSW5zdGFuY2VdKSB7XG4gICAgcmV0dXJuIHJpZ2h0W1N5bWJvbC5oYXNJbnN0YW5jZV0obGVmdCk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGxlZnQgaW5zdGFuY2VvZiByaWdodDtcbiAgfVxufVxuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikge1xuICByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDoge1xuICAgIGRlZmF1bHQ6IG9ialxuICB9O1xufVxuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZChvYmopIHtcbiAgaWYgKG9iaiAmJiBvYmouX19lc01vZHVsZSkge1xuICAgIHJldHVybiBvYmo7XG4gIH0gZWxzZSB7XG4gICAgdmFyIG5ld09iaiA9IHt9O1xuXG4gICAgaWYgKG9iaiAhPSBudWxsKSB7XG4gICAgICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSB7XG4gICAgICAgICAgdmFyIGRlc2MgPSBPYmplY3QuZGVmaW5lUHJvcGVydHkgJiYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvciA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBrZXkpIDoge307XG5cbiAgICAgICAgICBpZiAoZGVzYy5nZXQgfHwgZGVzYy5zZXQpIHtcbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuZXdPYmosIGtleSwgZGVzYyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG5ld09ialtrZXldID0gb2JqW2tleV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgbmV3T2JqLmRlZmF1bHQgPSBvYmo7XG4gICAgcmV0dXJuIG5ld09iajtcbiAgfVxufVxuXG5mdW5jdGlvbiBfbmV3QXJyb3dDaGVjayhpbm5lclRoaXMsIGJvdW5kVGhpcykge1xuICBpZiAoaW5uZXJUaGlzICE9PSBib3VuZFRoaXMpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGluc3RhbnRpYXRlIGFuIGFycm93IGZ1bmN0aW9uXCIpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9vYmplY3REZXN0cnVjdHVyaW5nRW1wdHkob2JqKSB7XG4gIGlmIChvYmogPT0gbnVsbCkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBkZXN0cnVjdHVyZSB1bmRlZmluZWRcIik7XG59XG5cbmZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhzb3VyY2UsIGV4Y2x1ZGVkKSB7XG4gIGlmIChzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIHt9O1xuICB2YXIgdGFyZ2V0ID0ge307XG4gIHZhciBzb3VyY2VLZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTtcbiAgdmFyIGtleSwgaTtcblxuICBmb3IgKGkgPSAwOyBpIDwgc291cmNlS2V5cy5sZW5ndGg7IGkrKykge1xuICAgIGtleSA9IHNvdXJjZUtleXNbaV07XG4gICAgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTtcbiAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICB9XG5cbiAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICB2YXIgc291cmNlU3ltYm9sS2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoc291cmNlKTtcblxuICAgIGZvciAoaSA9IDA7IGkgPCBzb3VyY2VTeW1ib2xLZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBrZXkgPSBzb3VyY2VTeW1ib2xLZXlzW2ldO1xuICAgICAgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTtcbiAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHNvdXJjZSwga2V5KSkgY29udGludWU7XG4gICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbmZ1bmN0aW9uIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoc2VsZikge1xuICBpZiAoc2VsZiA9PT0gdm9pZCAwKSB7XG4gICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpO1xuICB9XG5cbiAgcmV0dXJuIHNlbGY7XG59XG5cbmZ1bmN0aW9uIF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHNlbGYsIGNhbGwpIHtcbiAgaWYgKGNhbGwgJiYgKHR5cGVvZiBjYWxsID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpKSB7XG4gICAgcmV0dXJuIGNhbGw7XG4gIH1cblxuICByZXR1cm4gX2Fzc2VydFRoaXNJbml0aWFsaXplZChzZWxmKTtcbn1cblxuZnVuY3Rpb24gX3N1cGVyUHJvcEJhc2Uob2JqZWN0LCBwcm9wZXJ0eSkge1xuICB3aGlsZSAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KSkge1xuICAgIG9iamVjdCA9IF9nZXRQcm90b3R5cGVPZihvYmplY3QpO1xuICAgIGlmIChvYmplY3QgPT09IG51bGwpIGJyZWFrO1xuICB9XG5cbiAgcmV0dXJuIG9iamVjdDtcbn1cblxuZnVuY3Rpb24gX2dldCh0YXJnZXQsIHByb3BlcnR5LCByZWNlaXZlcikge1xuICBpZiAodHlwZW9mIFJlZmxlY3QgIT09IFwidW5kZWZpbmVkXCIgJiYgUmVmbGVjdC5nZXQpIHtcbiAgICBfZ2V0ID0gUmVmbGVjdC5nZXQ7XG4gIH0gZWxzZSB7XG4gICAgX2dldCA9IGZ1bmN0aW9uIF9nZXQodGFyZ2V0LCBwcm9wZXJ0eSwgcmVjZWl2ZXIpIHtcbiAgICAgIHZhciBiYXNlID0gX3N1cGVyUHJvcEJhc2UodGFyZ2V0LCBwcm9wZXJ0eSk7XG5cbiAgICAgIGlmICghYmFzZSkgcmV0dXJuO1xuICAgICAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGJhc2UsIHByb3BlcnR5KTtcblxuICAgICAgaWYgKGRlc2MuZ2V0KSB7XG4gICAgICAgIHJldHVybiBkZXNjLmdldC5jYWxsKHJlY2VpdmVyKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGRlc2MudmFsdWU7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBfZ2V0KHRhcmdldCwgcHJvcGVydHksIHJlY2VpdmVyIHx8IHRhcmdldCk7XG59XG5cbmZ1bmN0aW9uIHNldCh0YXJnZXQsIHByb3BlcnR5LCB2YWx1ZSwgcmVjZWl2ZXIpIHtcbiAgaWYgKHR5cGVvZiBSZWZsZWN0ICE9PSBcInVuZGVmaW5lZFwiICYmIFJlZmxlY3Quc2V0KSB7XG4gICAgc2V0ID0gUmVmbGVjdC5zZXQ7XG4gIH0gZWxzZSB7XG4gICAgc2V0ID0gZnVuY3Rpb24gc2V0KHRhcmdldCwgcHJvcGVydHksIHZhbHVlLCByZWNlaXZlcikge1xuICAgICAgdmFyIGJhc2UgPSBfc3VwZXJQcm9wQmFzZSh0YXJnZXQsIHByb3BlcnR5KTtcblxuICAgICAgdmFyIGRlc2M7XG5cbiAgICAgIGlmIChiYXNlKSB7XG4gICAgICAgIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGJhc2UsIHByb3BlcnR5KTtcblxuICAgICAgICBpZiAoZGVzYy5zZXQpIHtcbiAgICAgICAgICBkZXNjLnNldC5jYWxsKHJlY2VpdmVyLCB2YWx1ZSk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAoIWRlc2Mud3JpdGFibGUpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocmVjZWl2ZXIsIHByb3BlcnR5KTtcblxuICAgICAgaWYgKGRlc2MpIHtcbiAgICAgICAgaWYgKCFkZXNjLndyaXRhYmxlKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVzYy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmVjZWl2ZXIsIHByb3BlcnR5LCBkZXNjKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIF9kZWZpbmVQcm9wZXJ0eShyZWNlaXZlciwgcHJvcGVydHksIHZhbHVlKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBzZXQodGFyZ2V0LCBwcm9wZXJ0eSwgdmFsdWUsIHJlY2VpdmVyKTtcbn1cblxuZnVuY3Rpb24gX3NldCh0YXJnZXQsIHByb3BlcnR5LCB2YWx1ZSwgcmVjZWl2ZXIsIGlzU3RyaWN0KSB7XG4gIHZhciBzID0gc2V0KHRhcmdldCwgcHJvcGVydHksIHZhbHVlLCByZWNlaXZlciB8fCB0YXJnZXQpO1xuXG4gIGlmICghcyAmJiBpc1N0cmljdCkge1xuICAgIHRocm93IG5ldyBFcnJvcignZmFpbGVkIHRvIHNldCBwcm9wZXJ0eScpO1xuICB9XG5cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5mdW5jdGlvbiBfdGFnZ2VkVGVtcGxhdGVMaXRlcmFsKHN0cmluZ3MsIHJhdykge1xuICBpZiAoIXJhdykge1xuICAgIHJhdyA9IHN0cmluZ3Muc2xpY2UoMCk7XG4gIH1cblxuICByZXR1cm4gT2JqZWN0LmZyZWV6ZShPYmplY3QuZGVmaW5lUHJvcGVydGllcyhzdHJpbmdzLCB7XG4gICAgcmF3OiB7XG4gICAgICB2YWx1ZTogT2JqZWN0LmZyZWV6ZShyYXcpXG4gICAgfVxuICB9KSk7XG59XG5cbmZ1bmN0aW9uIF90YWdnZWRUZW1wbGF0ZUxpdGVyYWxMb29zZShzdHJpbmdzLCByYXcpIHtcbiAgaWYgKCFyYXcpIHtcbiAgICByYXcgPSBzdHJpbmdzLnNsaWNlKDApO1xuICB9XG5cbiAgc3RyaW5ncy5yYXcgPSByYXc7XG4gIHJldHVybiBzdHJpbmdzO1xufVxuXG5mdW5jdGlvbiBfdGVtcG9yYWxSZWYodmFsLCBuYW1lKSB7XG4gIGlmICh2YWwgPT09IF90ZW1wb3JhbFVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihuYW1lICsgXCIgaXMgbm90IGRlZmluZWQgLSB0ZW1wb3JhbCBkZWFkIHpvbmVcIik7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHZhbDtcbiAgfVxufVxuXG5mdW5jdGlvbiBfcmVhZE9ubHlFcnJvcihuYW1lKSB7XG4gIHRocm93IG5ldyBFcnJvcihcIlxcXCJcIiArIG5hbWUgKyBcIlxcXCIgaXMgcmVhZC1vbmx5XCIpO1xufVxuXG5mdW5jdGlvbiBfY2xhc3NOYW1lVERaRXJyb3IobmFtZSkge1xuICB0aHJvdyBuZXcgRXJyb3IoXCJDbGFzcyBcXFwiXCIgKyBuYW1lICsgXCJcXFwiIGNhbm5vdCBiZSByZWZlcmVuY2VkIGluIGNvbXB1dGVkIHByb3BlcnR5IGtleXMuXCIpO1xufVxuXG52YXIgX3RlbXBvcmFsVW5kZWZpbmVkID0ge307XG5cbmZ1bmN0aW9uIF9zbGljZWRUb0FycmF5KGFyciwgaSkge1xuICByZXR1cm4gX2FycmF5V2l0aEhvbGVzKGFycikgfHwgX2l0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkgfHwgX25vbkl0ZXJhYmxlUmVzdCgpO1xufVxuXG5mdW5jdGlvbiBfc2xpY2VkVG9BcnJheUxvb3NlKGFyciwgaSkge1xuICByZXR1cm4gX2FycmF5V2l0aEhvbGVzKGFycikgfHwgX2l0ZXJhYmxlVG9BcnJheUxpbWl0TG9vc2UoYXJyLCBpKSB8fCBfbm9uSXRlcmFibGVSZXN0KCk7XG59XG5cbmZ1bmN0aW9uIF90b0FycmF5KGFycikge1xuICByZXR1cm4gX2FycmF5V2l0aEhvbGVzKGFycikgfHwgX2l0ZXJhYmxlVG9BcnJheShhcnIpIHx8IF9ub25JdGVyYWJsZVJlc3QoKTtcbn1cblxuZnVuY3Rpb24gX3RvQ29uc3VtYWJsZUFycmF5KGFycikge1xuICByZXR1cm4gX2FycmF5V2l0aG91dEhvbGVzKGFycikgfHwgX2l0ZXJhYmxlVG9BcnJheShhcnIpIHx8IF9ub25JdGVyYWJsZVNwcmVhZCgpO1xufVxuXG5mdW5jdGlvbiBfYXJyYXlXaXRob3V0SG9sZXMoYXJyKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGFycikpIHtcbiAgICBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShhcnIubGVuZ3RoKTsgaSA8IGFyci5sZW5ndGg7IGkrKykgYXJyMltpXSA9IGFycltpXTtcblxuICAgIHJldHVybiBhcnIyO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9hcnJheVdpdGhIb2xlcyhhcnIpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSkgcmV0dXJuIGFycjtcbn1cblxuZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheShpdGVyKSB7XG4gIGlmIChTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KGl0ZXIpIHx8IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChpdGVyKSA9PT0gXCJbb2JqZWN0IEFyZ3VtZW50c11cIikgcmV0dXJuIEFycmF5LmZyb20oaXRlcik7XG59XG5cbmZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHtcbiAgdmFyIF9hcnIgPSBbXTtcbiAgdmFyIF9uID0gdHJ1ZTtcbiAgdmFyIF9kID0gZmFsc2U7XG4gIHZhciBfZSA9IHVuZGVmaW5lZDtcblxuICB0cnkge1xuICAgIGZvciAodmFyIF9pID0gYXJyW1N5bWJvbC5pdGVyYXRvcl0oKSwgX3M7ICEoX24gPSAoX3MgPSBfaS5uZXh0KCkpLmRvbmUpOyBfbiA9IHRydWUpIHtcbiAgICAgIF9hcnIucHVzaChfcy52YWx1ZSk7XG5cbiAgICAgIGlmIChpICYmIF9hcnIubGVuZ3RoID09PSBpKSBicmVhaztcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIF9kID0gdHJ1ZTtcbiAgICBfZSA9IGVycjtcbiAgfSBmaW5hbGx5IHtcbiAgICB0cnkge1xuICAgICAgaWYgKCFfbiAmJiBfaVtcInJldHVyblwiXSAhPSBudWxsKSBfaVtcInJldHVyblwiXSgpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAoX2QpIHRocm93IF9lO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBfYXJyO1xufVxuXG5mdW5jdGlvbiBfaXRlcmFibGVUb0FycmF5TGltaXRMb29zZShhcnIsIGkpIHtcbiAgdmFyIF9hcnIgPSBbXTtcblxuICBmb3IgKHZhciBfaXRlcmF0b3IgPSBhcnJbU3ltYm9sLml0ZXJhdG9yXSgpLCBfc3RlcDsgIShfc3RlcCA9IF9pdGVyYXRvci5uZXh0KCkpLmRvbmU7KSB7XG4gICAgX2Fyci5wdXNoKF9zdGVwLnZhbHVlKTtcblxuICAgIGlmIChpICYmIF9hcnIubGVuZ3RoID09PSBpKSBicmVhaztcbiAgfVxuXG4gIHJldHVybiBfYXJyO1xufVxuXG5mdW5jdGlvbiBfbm9uSXRlcmFibGVTcHJlYWQoKSB7XG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZVwiKTtcbn1cblxuZnVuY3Rpb24gX25vbkl0ZXJhYmxlUmVzdCgpIHtcbiAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2VcIik7XG59XG5cbmZ1bmN0aW9uIF9za2lwRmlyc3RHZW5lcmF0b3JOZXh0KGZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGl0ID0gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBpdC5uZXh0KCk7XG4gICAgcmV0dXJuIGl0O1xuICB9O1xufVxuXG5mdW5jdGlvbiBfdG9Qcm9wZXJ0eUtleShrZXkpIHtcbiAgaWYgKHR5cGVvZiBrZXkgPT09IFwic3ltYm9sXCIpIHtcbiAgICByZXR1cm4ga2V5O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBTdHJpbmcoa2V5KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfaW5pdGlhbGl6ZXJXYXJuaW5nSGVscGVyKGRlc2NyaXB0b3IsIGNvbnRleHQpIHtcbiAgdGhyb3cgbmV3IEVycm9yKCdEZWNvcmF0aW5nIGNsYXNzIHByb3BlcnR5IGZhaWxlZC4gUGxlYXNlIGVuc3VyZSB0aGF0ICcgKyAncHJvcG9zYWwtY2xhc3MtcHJvcGVydGllcyBpcyBlbmFibGVkIGFuZCBzZXQgdG8gdXNlIGxvb3NlIG1vZGUuICcgKyAnVG8gdXNlIHByb3Bvc2FsLWNsYXNzLXByb3BlcnRpZXMgaW4gc3BlYyBtb2RlIHdpdGggZGVjb3JhdG9ycywgd2FpdCBmb3IgJyArICd0aGUgbmV4dCBtYWpvciB2ZXJzaW9uIG9mIGRlY29yYXRvcnMgaW4gc3RhZ2UgMi4nKTtcbn1cblxuZnVuY3Rpb24gX2luaXRpYWxpemVyRGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eSwgZGVzY3JpcHRvciwgY29udGV4dCkge1xuICBpZiAoIWRlc2NyaXB0b3IpIHJldHVybjtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHksIHtcbiAgICBlbnVtZXJhYmxlOiBkZXNjcmlwdG9yLmVudW1lcmFibGUsXG4gICAgY29uZmlndXJhYmxlOiBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSxcbiAgICB3cml0YWJsZTogZGVzY3JpcHRvci53cml0YWJsZSxcbiAgICB2YWx1ZTogZGVzY3JpcHRvci5pbml0aWFsaXplciA/IGRlc2NyaXB0b3IuaW5pdGlhbGl6ZXIuY2FsbChjb250ZXh0KSA6IHZvaWQgMFxuICB9KTtcbn1cblxuZnVuY3Rpb24gX2FwcGx5RGVjb3JhdGVkRGVzY3JpcHRvcih0YXJnZXQsIHByb3BlcnR5LCBkZWNvcmF0b3JzLCBkZXNjcmlwdG9yLCBjb250ZXh0KSB7XG4gIHZhciBkZXNjID0ge307XG4gIE9iamVjdFsna2UnICsgJ3lzJ10oZGVzY3JpcHRvcikuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgZGVzY1trZXldID0gZGVzY3JpcHRvcltrZXldO1xuICB9KTtcbiAgZGVzYy5lbnVtZXJhYmxlID0gISFkZXNjLmVudW1lcmFibGU7XG4gIGRlc2MuY29uZmlndXJhYmxlID0gISFkZXNjLmNvbmZpZ3VyYWJsZTtcblxuICBpZiAoJ3ZhbHVlJyBpbiBkZXNjIHx8IGRlc2MuaW5pdGlhbGl6ZXIpIHtcbiAgICBkZXNjLndyaXRhYmxlID0gdHJ1ZTtcbiAgfVxuXG4gIGRlc2MgPSBkZWNvcmF0b3JzLnNsaWNlKCkucmV2ZXJzZSgpLnJlZHVjZShmdW5jdGlvbiAoZGVzYywgZGVjb3JhdG9yKSB7XG4gICAgcmV0dXJuIGRlY29yYXRvcih0YXJnZXQsIHByb3BlcnR5LCBkZXNjKSB8fCBkZXNjO1xuICB9LCBkZXNjKTtcblxuICBpZiAoY29udGV4dCAmJiBkZXNjLmluaXRpYWxpemVyICE9PSB2b2lkIDApIHtcbiAgICBkZXNjLnZhbHVlID0gZGVzYy5pbml0aWFsaXplciA/IGRlc2MuaW5pdGlhbGl6ZXIuY2FsbChjb250ZXh0KSA6IHZvaWQgMDtcbiAgICBkZXNjLmluaXRpYWxpemVyID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKGRlc2MuaW5pdGlhbGl6ZXIgPT09IHZvaWQgMCkge1xuICAgIE9iamVjdFsnZGVmaW5lJyArICdQcm9wZXJ0eSddKHRhcmdldCwgcHJvcGVydHksIGRlc2MpO1xuICAgIGRlc2MgPSBudWxsO1xuICB9XG5cbiAgcmV0dXJuIGRlc2M7XG59XG5cbnZhciBpZCA9IDA7XG5cbmZ1bmN0aW9uIF9jbGFzc1ByaXZhdGVGaWVsZExvb3NlS2V5KG5hbWUpIHtcbiAgcmV0dXJuIFwiX19wcml2YXRlX1wiICsgaWQrKyArIFwiX1wiICsgbmFtZTtcbn1cblxuZnVuY3Rpb24gX2NsYXNzUHJpdmF0ZUZpZWxkTG9vc2VCYXNlKHJlY2VpdmVyLCBwcml2YXRlS2V5KSB7XG4gIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHJlY2VpdmVyLCBwcml2YXRlS2V5KSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJhdHRlbXB0ZWQgdG8gdXNlIHByaXZhdGUgZmllbGQgb24gbm9uLWluc3RhbmNlXCIpO1xuICB9XG5cbiAgcmV0dXJuIHJlY2VpdmVyO1xufVxuXG5mdW5jdGlvbiBfY2xhc3NQcml2YXRlRmllbGRHZXQocmVjZWl2ZXIsIHByaXZhdGVNYXApIHtcbiAgaWYgKCFwcml2YXRlTWFwLmhhcyhyZWNlaXZlcikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiYXR0ZW1wdGVkIHRvIGdldCBwcml2YXRlIGZpZWxkIG9uIG5vbi1pbnN0YW5jZVwiKTtcbiAgfVxuXG4gIHJldHVybiBwcml2YXRlTWFwLmdldChyZWNlaXZlcik7XG59XG5cbmZ1bmN0aW9uIF9jbGFzc1ByaXZhdGVGaWVsZFNldChyZWNlaXZlciwgcHJpdmF0ZU1hcCwgdmFsdWUpIHtcbiAgaWYgKCFwcml2YXRlTWFwLmhhcyhyZWNlaXZlcikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiYXR0ZW1wdGVkIHRvIHNldCBwcml2YXRlIGZpZWxkIG9uIG5vbi1pbnN0YW5jZVwiKTtcbiAgfVxuXG4gIHByaXZhdGVNYXAuc2V0KHJlY2VpdmVyLCB2YWx1ZSk7XG4gIHJldHVybiB2YWx1ZTtcbn0iLCIvKiBXaGl0ZXN0b3JtSlMgRnJhbWV3b3JrIHYyLjIuMC1hbHBoYS4wICovXG5mdW5jdGlvbiBjcmVhdGVDb21tb25qc01vZHVsZShmbiwgbW9kdWxlKSB7XG5cdHJldHVybiBtb2R1bGUgPSB7IGV4cG9ydHM6IHt9IH0sIGZuKG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMpLCBtb2R1bGUuZXhwb3J0cztcbn1cblxudmFyIHJ1bnRpbWUgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlKSB7XG4vKipcbiAqIENvcHlyaWdodCAoYykgMjAxNC1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbiEoZnVuY3Rpb24oZ2xvYmFsKSB7XG5cbiAgdmFyIE9wID0gT2JqZWN0LnByb3RvdHlwZTtcbiAgdmFyIGhhc093biA9IE9wLmhhc093blByb3BlcnR5O1xuICB2YXIgdW5kZWZpbmVkOyAvLyBNb3JlIGNvbXByZXNzaWJsZSB0aGFuIHZvaWQgMC5cbiAgdmFyICRTeW1ib2wgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgPyBTeW1ib2wgOiB7fTtcbiAgdmFyIGl0ZXJhdG9yU3ltYm9sID0gJFN5bWJvbC5pdGVyYXRvciB8fCBcIkBAaXRlcmF0b3JcIjtcbiAgdmFyIGFzeW5jSXRlcmF0b3JTeW1ib2wgPSAkU3ltYm9sLmFzeW5jSXRlcmF0b3IgfHwgXCJAQGFzeW5jSXRlcmF0b3JcIjtcbiAgdmFyIHRvU3RyaW5nVGFnU3ltYm9sID0gJFN5bWJvbC50b1N0cmluZ1RhZyB8fCBcIkBAdG9TdHJpbmdUYWdcIjtcblxuICB2YXIgaW5Nb2R1bGUgPSAnb2JqZWN0JyA9PT0gXCJvYmplY3RcIjtcbiAgdmFyIHJ1bnRpbWUgPSBnbG9iYWwucmVnZW5lcmF0b3JSdW50aW1lO1xuICBpZiAocnVudGltZSkge1xuICAgIGlmIChpbk1vZHVsZSkge1xuICAgICAgLy8gSWYgcmVnZW5lcmF0b3JSdW50aW1lIGlzIGRlZmluZWQgZ2xvYmFsbHkgYW5kIHdlJ3JlIGluIGEgbW9kdWxlLFxuICAgICAgLy8gbWFrZSB0aGUgZXhwb3J0cyBvYmplY3QgaWRlbnRpY2FsIHRvIHJlZ2VuZXJhdG9yUnVudGltZS5cbiAgICAgIG1vZHVsZS5leHBvcnRzID0gcnVudGltZTtcbiAgICB9XG4gICAgLy8gRG9uJ3QgYm90aGVyIGV2YWx1YXRpbmcgdGhlIHJlc3Qgb2YgdGhpcyBmaWxlIGlmIHRoZSBydW50aW1lIHdhc1xuICAgIC8vIGFscmVhZHkgZGVmaW5lZCBnbG9iYWxseS5cbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBEZWZpbmUgdGhlIHJ1bnRpbWUgZ2xvYmFsbHkgKGFzIGV4cGVjdGVkIGJ5IGdlbmVyYXRlZCBjb2RlKSBhcyBlaXRoZXJcbiAgLy8gbW9kdWxlLmV4cG9ydHMgKGlmIHdlJ3JlIGluIGEgbW9kdWxlKSBvciBhIG5ldywgZW1wdHkgb2JqZWN0LlxuICBydW50aW1lID0gZ2xvYmFsLnJlZ2VuZXJhdG9yUnVudGltZSA9IGluTW9kdWxlID8gbW9kdWxlLmV4cG9ydHMgOiB7fTtcblxuICBmdW5jdGlvbiB3cmFwKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0KSB7XG4gICAgLy8gSWYgb3V0ZXJGbiBwcm92aWRlZCBhbmQgb3V0ZXJGbi5wcm90b3R5cGUgaXMgYSBHZW5lcmF0b3IsIHRoZW4gb3V0ZXJGbi5wcm90b3R5cGUgaW5zdGFuY2VvZiBHZW5lcmF0b3IuXG4gICAgdmFyIHByb3RvR2VuZXJhdG9yID0gb3V0ZXJGbiAmJiBvdXRlckZuLnByb3RvdHlwZSBpbnN0YW5jZW9mIEdlbmVyYXRvciA/IG91dGVyRm4gOiBHZW5lcmF0b3I7XG4gICAgdmFyIGdlbmVyYXRvciA9IE9iamVjdC5jcmVhdGUocHJvdG9HZW5lcmF0b3IucHJvdG90eXBlKTtcbiAgICB2YXIgY29udGV4dCA9IG5ldyBDb250ZXh0KHRyeUxvY3NMaXN0IHx8IFtdKTtcblxuICAgIC8vIFRoZSAuX2ludm9rZSBtZXRob2QgdW5pZmllcyB0aGUgaW1wbGVtZW50YXRpb25zIG9mIHRoZSAubmV4dCxcbiAgICAvLyAudGhyb3csIGFuZCAucmV0dXJuIG1ldGhvZHMuXG4gICAgZ2VuZXJhdG9yLl9pbnZva2UgPSBtYWtlSW52b2tlTWV0aG9kKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpO1xuXG4gICAgcmV0dXJuIGdlbmVyYXRvcjtcbiAgfVxuICBydW50aW1lLndyYXAgPSB3cmFwO1xuXG4gIC8vIFRyeS9jYXRjaCBoZWxwZXIgdG8gbWluaW1pemUgZGVvcHRpbWl6YXRpb25zLiBSZXR1cm5zIGEgY29tcGxldGlvblxuICAvLyByZWNvcmQgbGlrZSBjb250ZXh0LnRyeUVudHJpZXNbaV0uY29tcGxldGlvbi4gVGhpcyBpbnRlcmZhY2UgY291bGRcbiAgLy8gaGF2ZSBiZWVuIChhbmQgd2FzIHByZXZpb3VzbHkpIGRlc2lnbmVkIHRvIHRha2UgYSBjbG9zdXJlIHRvIGJlXG4gIC8vIGludm9rZWQgd2l0aG91dCBhcmd1bWVudHMsIGJ1dCBpbiBhbGwgdGhlIGNhc2VzIHdlIGNhcmUgYWJvdXQgd2VcbiAgLy8gYWxyZWFkeSBoYXZlIGFuIGV4aXN0aW5nIG1ldGhvZCB3ZSB3YW50IHRvIGNhbGwsIHNvIHRoZXJlJ3Mgbm8gbmVlZFxuICAvLyB0byBjcmVhdGUgYSBuZXcgZnVuY3Rpb24gb2JqZWN0LiBXZSBjYW4gZXZlbiBnZXQgYXdheSB3aXRoIGFzc3VtaW5nXG4gIC8vIHRoZSBtZXRob2QgdGFrZXMgZXhhY3RseSBvbmUgYXJndW1lbnQsIHNpbmNlIHRoYXQgaGFwcGVucyB0byBiZSB0cnVlXG4gIC8vIGluIGV2ZXJ5IGNhc2UsIHNvIHdlIGRvbid0IGhhdmUgdG8gdG91Y2ggdGhlIGFyZ3VtZW50cyBvYmplY3QuIFRoZVxuICAvLyBvbmx5IGFkZGl0aW9uYWwgYWxsb2NhdGlvbiByZXF1aXJlZCBpcyB0aGUgY29tcGxldGlvbiByZWNvcmQsIHdoaWNoXG4gIC8vIGhhcyBhIHN0YWJsZSBzaGFwZSBhbmQgc28gaG9wZWZ1bGx5IHNob3VsZCBiZSBjaGVhcCB0byBhbGxvY2F0ZS5cbiAgZnVuY3Rpb24gdHJ5Q2F0Y2goZm4sIG9iaiwgYXJnKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB7IHR5cGU6IFwibm9ybWFsXCIsIGFyZzogZm4uY2FsbChvYmosIGFyZykgfTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHJldHVybiB7IHR5cGU6IFwidGhyb3dcIiwgYXJnOiBlcnIgfTtcbiAgICB9XG4gIH1cblxuICB2YXIgR2VuU3RhdGVTdXNwZW5kZWRTdGFydCA9IFwic3VzcGVuZGVkU3RhcnRcIjtcbiAgdmFyIEdlblN0YXRlU3VzcGVuZGVkWWllbGQgPSBcInN1c3BlbmRlZFlpZWxkXCI7XG4gIHZhciBHZW5TdGF0ZUV4ZWN1dGluZyA9IFwiZXhlY3V0aW5nXCI7XG4gIHZhciBHZW5TdGF0ZUNvbXBsZXRlZCA9IFwiY29tcGxldGVkXCI7XG5cbiAgLy8gUmV0dXJuaW5nIHRoaXMgb2JqZWN0IGZyb20gdGhlIGlubmVyRm4gaGFzIHRoZSBzYW1lIGVmZmVjdCBhc1xuICAvLyBicmVha2luZyBvdXQgb2YgdGhlIGRpc3BhdGNoIHN3aXRjaCBzdGF0ZW1lbnQuXG4gIHZhciBDb250aW51ZVNlbnRpbmVsID0ge307XG5cbiAgLy8gRHVtbXkgY29uc3RydWN0b3IgZnVuY3Rpb25zIHRoYXQgd2UgdXNlIGFzIHRoZSAuY29uc3RydWN0b3IgYW5kXG4gIC8vIC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUgcHJvcGVydGllcyBmb3IgZnVuY3Rpb25zIHRoYXQgcmV0dXJuIEdlbmVyYXRvclxuICAvLyBvYmplY3RzLiBGb3IgZnVsbCBzcGVjIGNvbXBsaWFuY2UsIHlvdSBtYXkgd2lzaCB0byBjb25maWd1cmUgeW91clxuICAvLyBtaW5pZmllciBub3QgdG8gbWFuZ2xlIHRoZSBuYW1lcyBvZiB0aGVzZSB0d28gZnVuY3Rpb25zLlxuICBmdW5jdGlvbiBHZW5lcmF0b3IoKSB7fVxuICBmdW5jdGlvbiBHZW5lcmF0b3JGdW5jdGlvbigpIHt9XG4gIGZ1bmN0aW9uIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlKCkge31cblxuICAvLyBUaGlzIGlzIGEgcG9seWZpbGwgZm9yICVJdGVyYXRvclByb3RvdHlwZSUgZm9yIGVudmlyb25tZW50cyB0aGF0XG4gIC8vIGRvbid0IG5hdGl2ZWx5IHN1cHBvcnQgaXQuXG4gIHZhciBJdGVyYXRvclByb3RvdHlwZSA9IHt9O1xuICBJdGVyYXRvclByb3RvdHlwZVtpdGVyYXRvclN5bWJvbF0gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgdmFyIGdldFByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mO1xuICB2YXIgTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUgPSBnZXRQcm90byAmJiBnZXRQcm90byhnZXRQcm90byh2YWx1ZXMoW10pKSk7XG4gIGlmIChOYXRpdmVJdGVyYXRvclByb3RvdHlwZSAmJlxuICAgICAgTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUgIT09IE9wICYmXG4gICAgICBoYXNPd24uY2FsbChOYXRpdmVJdGVyYXRvclByb3RvdHlwZSwgaXRlcmF0b3JTeW1ib2wpKSB7XG4gICAgLy8gVGhpcyBlbnZpcm9ubWVudCBoYXMgYSBuYXRpdmUgJUl0ZXJhdG9yUHJvdG90eXBlJTsgdXNlIGl0IGluc3RlYWRcbiAgICAvLyBvZiB0aGUgcG9seWZpbGwuXG4gICAgSXRlcmF0b3JQcm90b3R5cGUgPSBOYXRpdmVJdGVyYXRvclByb3RvdHlwZTtcbiAgfVxuXG4gIHZhciBHcCA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlLnByb3RvdHlwZSA9XG4gICAgR2VuZXJhdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoSXRlcmF0b3JQcm90b3R5cGUpO1xuICBHZW5lcmF0b3JGdW5jdGlvbi5wcm90b3R5cGUgPSBHcC5jb25zdHJ1Y3RvciA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlO1xuICBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEdlbmVyYXRvckZ1bmN0aW9uO1xuICBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZVt0b1N0cmluZ1RhZ1N5bWJvbF0gPVxuICAgIEdlbmVyYXRvckZ1bmN0aW9uLmRpc3BsYXlOYW1lID0gXCJHZW5lcmF0b3JGdW5jdGlvblwiO1xuXG4gIC8vIEhlbHBlciBmb3IgZGVmaW5pbmcgdGhlIC5uZXh0LCAudGhyb3csIGFuZCAucmV0dXJuIG1ldGhvZHMgb2YgdGhlXG4gIC8vIEl0ZXJhdG9yIGludGVyZmFjZSBpbiB0ZXJtcyBvZiBhIHNpbmdsZSAuX2ludm9rZSBtZXRob2QuXG4gIGZ1bmN0aW9uIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhwcm90b3R5cGUpIHtcbiAgICBbXCJuZXh0XCIsIFwidGhyb3dcIiwgXCJyZXR1cm5cIl0uZm9yRWFjaChmdW5jdGlvbihtZXRob2QpIHtcbiAgICAgIHByb3RvdHlwZVttZXRob2RdID0gZnVuY3Rpb24oYXJnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnZva2UobWV0aG9kLCBhcmcpO1xuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHJ1bnRpbWUuaXNHZW5lcmF0b3JGdW5jdGlvbiA9IGZ1bmN0aW9uKGdlbkZ1bikge1xuICAgIHZhciBjdG9yID0gdHlwZW9mIGdlbkZ1biA9PT0gXCJmdW5jdGlvblwiICYmIGdlbkZ1bi5jb25zdHJ1Y3RvcjtcbiAgICByZXR1cm4gY3RvclxuICAgICAgPyBjdG9yID09PSBHZW5lcmF0b3JGdW5jdGlvbiB8fFxuICAgICAgICAvLyBGb3IgdGhlIG5hdGl2ZSBHZW5lcmF0b3JGdW5jdGlvbiBjb25zdHJ1Y3RvciwgdGhlIGJlc3Qgd2UgY2FuXG4gICAgICAgIC8vIGRvIGlzIHRvIGNoZWNrIGl0cyAubmFtZSBwcm9wZXJ0eS5cbiAgICAgICAgKGN0b3IuZGlzcGxheU5hbWUgfHwgY3Rvci5uYW1lKSA9PT0gXCJHZW5lcmF0b3JGdW5jdGlvblwiXG4gICAgICA6IGZhbHNlO1xuICB9O1xuXG4gIHJ1bnRpbWUubWFyayA9IGZ1bmN0aW9uKGdlbkZ1bikge1xuICAgIGlmIChPYmplY3Quc2V0UHJvdG90eXBlT2YpIHtcbiAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihnZW5GdW4sIEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZ2VuRnVuLl9fcHJvdG9fXyA9IEdlbmVyYXRvckZ1bmN0aW9uUHJvdG90eXBlO1xuICAgICAgaWYgKCEodG9TdHJpbmdUYWdTeW1ib2wgaW4gZ2VuRnVuKSkge1xuICAgICAgICBnZW5GdW5bdG9TdHJpbmdUYWdTeW1ib2xdID0gXCJHZW5lcmF0b3JGdW5jdGlvblwiO1xuICAgICAgfVxuICAgIH1cbiAgICBnZW5GdW4ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShHcCk7XG4gICAgcmV0dXJuIGdlbkZ1bjtcbiAgfTtcblxuICAvLyBXaXRoaW4gdGhlIGJvZHkgb2YgYW55IGFzeW5jIGZ1bmN0aW9uLCBgYXdhaXQgeGAgaXMgdHJhbnNmb3JtZWQgdG9cbiAgLy8gYHlpZWxkIHJlZ2VuZXJhdG9yUnVudGltZS5hd3JhcCh4KWAsIHNvIHRoYXQgdGhlIHJ1bnRpbWUgY2FuIHRlc3RcbiAgLy8gYGhhc093bi5jYWxsKHZhbHVlLCBcIl9fYXdhaXRcIilgIHRvIGRldGVybWluZSBpZiB0aGUgeWllbGRlZCB2YWx1ZSBpc1xuICAvLyBtZWFudCB0byBiZSBhd2FpdGVkLlxuICBydW50aW1lLmF3cmFwID0gZnVuY3Rpb24oYXJnKSB7XG4gICAgcmV0dXJuIHsgX19hd2FpdDogYXJnIH07XG4gIH07XG5cbiAgZnVuY3Rpb24gQXN5bmNJdGVyYXRvcihnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBpbnZva2UobWV0aG9kLCBhcmcsIHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKGdlbmVyYXRvclttZXRob2RdLCBnZW5lcmF0b3IsIGFyZyk7XG4gICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICByZWplY3QocmVjb3JkLmFyZyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgcmVzdWx0ID0gcmVjb3JkLmFyZztcbiAgICAgICAgdmFyIHZhbHVlID0gcmVzdWx0LnZhbHVlO1xuICAgICAgICBpZiAodmFsdWUgJiZcbiAgICAgICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICAgICAgaGFzT3duLmNhbGwodmFsdWUsIFwiX19hd2FpdFwiKSkge1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodmFsdWUuX19hd2FpdCkudGhlbihmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgICAgaW52b2tlKFwibmV4dFwiLCB2YWx1ZSwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICB9LCBmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgICAgIGludm9rZShcInRocm93XCIsIGVyciwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodmFsdWUpLnRoZW4oZnVuY3Rpb24odW53cmFwcGVkKSB7XG4gICAgICAgICAgLy8gV2hlbiBhIHlpZWxkZWQgUHJvbWlzZSBpcyByZXNvbHZlZCwgaXRzIGZpbmFsIHZhbHVlIGJlY29tZXNcbiAgICAgICAgICAvLyB0aGUgLnZhbHVlIG9mIHRoZSBQcm9taXNlPHt2YWx1ZSxkb25lfT4gcmVzdWx0IGZvciB0aGVcbiAgICAgICAgICAvLyBjdXJyZW50IGl0ZXJhdGlvbi4gSWYgdGhlIFByb21pc2UgaXMgcmVqZWN0ZWQsIGhvd2V2ZXIsIHRoZVxuICAgICAgICAgIC8vIHJlc3VsdCBmb3IgdGhpcyBpdGVyYXRpb24gd2lsbCBiZSByZWplY3RlZCB3aXRoIHRoZSBzYW1lXG4gICAgICAgICAgLy8gcmVhc29uLiBOb3RlIHRoYXQgcmVqZWN0aW9ucyBvZiB5aWVsZGVkIFByb21pc2VzIGFyZSBub3RcbiAgICAgICAgICAvLyB0aHJvd24gYmFjayBpbnRvIHRoZSBnZW5lcmF0b3IgZnVuY3Rpb24sIGFzIGlzIHRoZSBjYXNlXG4gICAgICAgICAgLy8gd2hlbiBhbiBhd2FpdGVkIFByb21pc2UgaXMgcmVqZWN0ZWQuIFRoaXMgZGlmZmVyZW5jZSBpblxuICAgICAgICAgIC8vIGJlaGF2aW9yIGJldHdlZW4geWllbGQgYW5kIGF3YWl0IGlzIGltcG9ydGFudCwgYmVjYXVzZSBpdFxuICAgICAgICAgIC8vIGFsbG93cyB0aGUgY29uc3VtZXIgdG8gZGVjaWRlIHdoYXQgdG8gZG8gd2l0aCB0aGUgeWllbGRlZFxuICAgICAgICAgIC8vIHJlamVjdGlvbiAoc3dhbGxvdyBpdCBhbmQgY29udGludWUsIG1hbnVhbGx5IC50aHJvdyBpdCBiYWNrXG4gICAgICAgICAgLy8gaW50byB0aGUgZ2VuZXJhdG9yLCBhYmFuZG9uIGl0ZXJhdGlvbiwgd2hhdGV2ZXIpLiBXaXRoXG4gICAgICAgICAgLy8gYXdhaXQsIGJ5IGNvbnRyYXN0LCB0aGVyZSBpcyBubyBvcHBvcnR1bml0eSB0byBleGFtaW5lIHRoZVxuICAgICAgICAgIC8vIHJlamVjdGlvbiByZWFzb24gb3V0c2lkZSB0aGUgZ2VuZXJhdG9yIGZ1bmN0aW9uLCBzbyB0aGVcbiAgICAgICAgICAvLyBvbmx5IG9wdGlvbiBpcyB0byB0aHJvdyBpdCBmcm9tIHRoZSBhd2FpdCBleHByZXNzaW9uLCBhbmRcbiAgICAgICAgICAvLyBsZXQgdGhlIGdlbmVyYXRvciBmdW5jdGlvbiBoYW5kbGUgdGhlIGV4Y2VwdGlvbi5cbiAgICAgICAgICByZXN1bHQudmFsdWUgPSB1bndyYXBwZWQ7XG4gICAgICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICB9LCByZWplY3QpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBwcmV2aW91c1Byb21pc2U7XG5cbiAgICBmdW5jdGlvbiBlbnF1ZXVlKG1ldGhvZCwgYXJnKSB7XG4gICAgICBmdW5jdGlvbiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgIGludm9rZShtZXRob2QsIGFyZywgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwcmV2aW91c1Byb21pc2UgPVxuICAgICAgICAvLyBJZiBlbnF1ZXVlIGhhcyBiZWVuIGNhbGxlZCBiZWZvcmUsIHRoZW4gd2Ugd2FudCB0byB3YWl0IHVudGlsXG4gICAgICAgIC8vIGFsbCBwcmV2aW91cyBQcm9taXNlcyBoYXZlIGJlZW4gcmVzb2x2ZWQgYmVmb3JlIGNhbGxpbmcgaW52b2tlLFxuICAgICAgICAvLyBzbyB0aGF0IHJlc3VsdHMgYXJlIGFsd2F5cyBkZWxpdmVyZWQgaW4gdGhlIGNvcnJlY3Qgb3JkZXIuIElmXG4gICAgICAgIC8vIGVucXVldWUgaGFzIG5vdCBiZWVuIGNhbGxlZCBiZWZvcmUsIHRoZW4gaXQgaXMgaW1wb3J0YW50IHRvXG4gICAgICAgIC8vIGNhbGwgaW52b2tlIGltbWVkaWF0ZWx5LCB3aXRob3V0IHdhaXRpbmcgb24gYSBjYWxsYmFjayB0byBmaXJlLFxuICAgICAgICAvLyBzbyB0aGF0IHRoZSBhc3luYyBnZW5lcmF0b3IgZnVuY3Rpb24gaGFzIHRoZSBvcHBvcnR1bml0eSB0byBkb1xuICAgICAgICAvLyBhbnkgbmVjZXNzYXJ5IHNldHVwIGluIGEgcHJlZGljdGFibGUgd2F5LiBUaGlzIHByZWRpY3RhYmlsaXR5XG4gICAgICAgIC8vIGlzIHdoeSB0aGUgUHJvbWlzZSBjb25zdHJ1Y3RvciBzeW5jaHJvbm91c2x5IGludm9rZXMgaXRzXG4gICAgICAgIC8vIGV4ZWN1dG9yIGNhbGxiYWNrLCBhbmQgd2h5IGFzeW5jIGZ1bmN0aW9ucyBzeW5jaHJvbm91c2x5XG4gICAgICAgIC8vIGV4ZWN1dGUgY29kZSBiZWZvcmUgdGhlIGZpcnN0IGF3YWl0LiBTaW5jZSB3ZSBpbXBsZW1lbnQgc2ltcGxlXG4gICAgICAgIC8vIGFzeW5jIGZ1bmN0aW9ucyBpbiB0ZXJtcyBvZiBhc3luYyBnZW5lcmF0b3JzLCBpdCBpcyBlc3BlY2lhbGx5XG4gICAgICAgIC8vIGltcG9ydGFudCB0byBnZXQgdGhpcyByaWdodCwgZXZlbiB0aG91Z2ggaXQgcmVxdWlyZXMgY2FyZS5cbiAgICAgICAgcHJldmlvdXNQcm9taXNlID8gcHJldmlvdXNQcm9taXNlLnRoZW4oXG4gICAgICAgICAgY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcsXG4gICAgICAgICAgLy8gQXZvaWQgcHJvcGFnYXRpbmcgZmFpbHVyZXMgdG8gUHJvbWlzZXMgcmV0dXJuZWQgYnkgbGF0ZXJcbiAgICAgICAgICAvLyBpbnZvY2F0aW9ucyBvZiB0aGUgaXRlcmF0b3IuXG4gICAgICAgICAgY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmdcbiAgICAgICAgKSA6IGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnKCk7XG4gICAgfVxuXG4gICAgLy8gRGVmaW5lIHRoZSB1bmlmaWVkIGhlbHBlciBtZXRob2QgdGhhdCBpcyB1c2VkIHRvIGltcGxlbWVudCAubmV4dCxcbiAgICAvLyAudGhyb3csIGFuZCAucmV0dXJuIChzZWUgZGVmaW5lSXRlcmF0b3JNZXRob2RzKS5cbiAgICB0aGlzLl9pbnZva2UgPSBlbnF1ZXVlO1xuICB9XG5cbiAgZGVmaW5lSXRlcmF0b3JNZXRob2RzKEFzeW5jSXRlcmF0b3IucHJvdG90eXBlKTtcbiAgQXN5bmNJdGVyYXRvci5wcm90b3R5cGVbYXN5bmNJdGVyYXRvclN5bWJvbF0gPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG4gIHJ1bnRpbWUuQXN5bmNJdGVyYXRvciA9IEFzeW5jSXRlcmF0b3I7XG5cbiAgLy8gTm90ZSB0aGF0IHNpbXBsZSBhc3luYyBmdW5jdGlvbnMgYXJlIGltcGxlbWVudGVkIG9uIHRvcCBvZlxuICAvLyBBc3luY0l0ZXJhdG9yIG9iamVjdHM7IHRoZXkganVzdCByZXR1cm4gYSBQcm9taXNlIGZvciB0aGUgdmFsdWUgb2ZcbiAgLy8gdGhlIGZpbmFsIHJlc3VsdCBwcm9kdWNlZCBieSB0aGUgaXRlcmF0b3IuXG4gIHJ1bnRpbWUuYXN5bmMgPSBmdW5jdGlvbihpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdCkge1xuICAgIHZhciBpdGVyID0gbmV3IEFzeW5jSXRlcmF0b3IoXG4gICAgICB3cmFwKGlubmVyRm4sIG91dGVyRm4sIHNlbGYsIHRyeUxvY3NMaXN0KVxuICAgICk7XG5cbiAgICByZXR1cm4gcnVudGltZS5pc0dlbmVyYXRvckZ1bmN0aW9uKG91dGVyRm4pXG4gICAgICA/IGl0ZXIgLy8gSWYgb3V0ZXJGbiBpcyBhIGdlbmVyYXRvciwgcmV0dXJuIHRoZSBmdWxsIGl0ZXJhdG9yLlxuICAgICAgOiBpdGVyLm5leHQoKS50aGVuKGZ1bmN0aW9uKHJlc3VsdCkge1xuICAgICAgICAgIHJldHVybiByZXN1bHQuZG9uZSA/IHJlc3VsdC52YWx1ZSA6IGl0ZXIubmV4dCgpO1xuICAgICAgICB9KTtcbiAgfTtcblxuICBmdW5jdGlvbiBtYWtlSW52b2tlTWV0aG9kKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpIHtcbiAgICB2YXIgc3RhdGUgPSBHZW5TdGF0ZVN1c3BlbmRlZFN0YXJ0O1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIGludm9rZShtZXRob2QsIGFyZykge1xuICAgICAgaWYgKHN0YXRlID09PSBHZW5TdGF0ZUV4ZWN1dGluZykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBydW5uaW5nXCIpO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3RhdGUgPT09IEdlblN0YXRlQ29tcGxldGVkKSB7XG4gICAgICAgIGlmIChtZXRob2QgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgIHRocm93IGFyZztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEJlIGZvcmdpdmluZywgcGVyIDI1LjMuMy4zLjMgb2YgdGhlIHNwZWM6XG4gICAgICAgIC8vIGh0dHBzOi8vcGVvcGxlLm1vemlsbGEub3JnL35qb3JlbmRvcmZmL2VzNi1kcmFmdC5odG1sI3NlYy1nZW5lcmF0b3JyZXN1bWVcbiAgICAgICAgcmV0dXJuIGRvbmVSZXN1bHQoKTtcbiAgICAgIH1cblxuICAgICAgY29udGV4dC5tZXRob2QgPSBtZXRob2Q7XG4gICAgICBjb250ZXh0LmFyZyA9IGFyZztcblxuICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgdmFyIGRlbGVnYXRlID0gY29udGV4dC5kZWxlZ2F0ZTtcbiAgICAgICAgaWYgKGRlbGVnYXRlKSB7XG4gICAgICAgICAgdmFyIGRlbGVnYXRlUmVzdWx0ID0gbWF5YmVJbnZva2VEZWxlZ2F0ZShkZWxlZ2F0ZSwgY29udGV4dCk7XG4gICAgICAgICAgaWYgKGRlbGVnYXRlUmVzdWx0KSB7XG4gICAgICAgICAgICBpZiAoZGVsZWdhdGVSZXN1bHQgPT09IENvbnRpbnVlU2VudGluZWwpIGNvbnRpbnVlO1xuICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlUmVzdWx0O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJuZXh0XCIpIHtcbiAgICAgICAgICAvLyBTZXR0aW5nIGNvbnRleHQuX3NlbnQgZm9yIGxlZ2FjeSBzdXBwb3J0IG9mIEJhYmVsJ3NcbiAgICAgICAgICAvLyBmdW5jdGlvbi5zZW50IGltcGxlbWVudGF0aW9uLlxuICAgICAgICAgIGNvbnRleHQuc2VudCA9IGNvbnRleHQuX3NlbnQgPSBjb250ZXh0LmFyZztcblxuICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHQubWV0aG9kID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICBpZiAoc3RhdGUgPT09IEdlblN0YXRlU3VzcGVuZGVkU3RhcnQpIHtcbiAgICAgICAgICAgIHN0YXRlID0gR2VuU3RhdGVDb21wbGV0ZWQ7XG4gICAgICAgICAgICB0aHJvdyBjb250ZXh0LmFyZztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb250ZXh0LmRpc3BhdGNoRXhjZXB0aW9uKGNvbnRleHQuYXJnKTtcblxuICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHQubWV0aG9kID09PSBcInJldHVyblwiKSB7XG4gICAgICAgICAgY29udGV4dC5hYnJ1cHQoXCJyZXR1cm5cIiwgY29udGV4dC5hcmcpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3RhdGUgPSBHZW5TdGF0ZUV4ZWN1dGluZztcblxuICAgICAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2goaW5uZXJGbiwgc2VsZiwgY29udGV4dCk7XG4gICAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJub3JtYWxcIikge1xuICAgICAgICAgIC8vIElmIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gZnJvbSBpbm5lckZuLCB3ZSBsZWF2ZSBzdGF0ZSA9PT1cbiAgICAgICAgICAvLyBHZW5TdGF0ZUV4ZWN1dGluZyBhbmQgbG9vcCBiYWNrIGZvciBhbm90aGVyIGludm9jYXRpb24uXG4gICAgICAgICAgc3RhdGUgPSBjb250ZXh0LmRvbmVcbiAgICAgICAgICAgID8gR2VuU3RhdGVDb21wbGV0ZWRcbiAgICAgICAgICAgIDogR2VuU3RhdGVTdXNwZW5kZWRZaWVsZDtcblxuICAgICAgICAgIGlmIChyZWNvcmQuYXJnID09PSBDb250aW51ZVNlbnRpbmVsKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdmFsdWU6IHJlY29yZC5hcmcsXG4gICAgICAgICAgICBkb25lOiBjb250ZXh0LmRvbmVcbiAgICAgICAgICB9O1xuXG4gICAgICAgIH0gZWxzZSBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICAgIHN0YXRlID0gR2VuU3RhdGVDb21wbGV0ZWQ7XG4gICAgICAgICAgLy8gRGlzcGF0Y2ggdGhlIGV4Y2VwdGlvbiBieSBsb29waW5nIGJhY2sgYXJvdW5kIHRvIHRoZVxuICAgICAgICAgIC8vIGNvbnRleHQuZGlzcGF0Y2hFeGNlcHRpb24oY29udGV4dC5hcmcpIGNhbGwgYWJvdmUuXG4gICAgICAgICAgY29udGV4dC5tZXRob2QgPSBcInRocm93XCI7XG4gICAgICAgICAgY29udGV4dC5hcmcgPSByZWNvcmQuYXJnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8vIENhbGwgZGVsZWdhdGUuaXRlcmF0b3JbY29udGV4dC5tZXRob2RdKGNvbnRleHQuYXJnKSBhbmQgaGFuZGxlIHRoZVxuICAvLyByZXN1bHQsIGVpdGhlciBieSByZXR1cm5pbmcgYSB7IHZhbHVlLCBkb25lIH0gcmVzdWx0IGZyb20gdGhlXG4gIC8vIGRlbGVnYXRlIGl0ZXJhdG9yLCBvciBieSBtb2RpZnlpbmcgY29udGV4dC5tZXRob2QgYW5kIGNvbnRleHQuYXJnLFxuICAvLyBzZXR0aW5nIGNvbnRleHQuZGVsZWdhdGUgdG8gbnVsbCwgYW5kIHJldHVybmluZyB0aGUgQ29udGludWVTZW50aW5lbC5cbiAgZnVuY3Rpb24gbWF5YmVJbnZva2VEZWxlZ2F0ZShkZWxlZ2F0ZSwgY29udGV4dCkge1xuICAgIHZhciBtZXRob2QgPSBkZWxlZ2F0ZS5pdGVyYXRvcltjb250ZXh0Lm1ldGhvZF07XG4gICAgaWYgKG1ldGhvZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBBIC50aHJvdyBvciAucmV0dXJuIHdoZW4gdGhlIGRlbGVnYXRlIGl0ZXJhdG9yIGhhcyBubyAudGhyb3dcbiAgICAgIC8vIG1ldGhvZCBhbHdheXMgdGVybWluYXRlcyB0aGUgeWllbGQqIGxvb3AuXG4gICAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDtcblxuICAgICAgaWYgKGNvbnRleHQubWV0aG9kID09PSBcInRocm93XCIpIHtcbiAgICAgICAgaWYgKGRlbGVnYXRlLml0ZXJhdG9yLnJldHVybikge1xuICAgICAgICAgIC8vIElmIHRoZSBkZWxlZ2F0ZSBpdGVyYXRvciBoYXMgYSByZXR1cm4gbWV0aG9kLCBnaXZlIGl0IGFcbiAgICAgICAgICAvLyBjaGFuY2UgdG8gY2xlYW4gdXAuXG4gICAgICAgICAgY29udGV4dC5tZXRob2QgPSBcInJldHVyblwiO1xuICAgICAgICAgIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkO1xuICAgICAgICAgIG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpO1xuXG4gICAgICAgICAgaWYgKGNvbnRleHQubWV0aG9kID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICAgIC8vIElmIG1heWJlSW52b2tlRGVsZWdhdGUoY29udGV4dCkgY2hhbmdlZCBjb250ZXh0Lm1ldGhvZCBmcm9tXG4gICAgICAgICAgICAvLyBcInJldHVyblwiIHRvIFwidGhyb3dcIiwgbGV0IHRoYXQgb3ZlcnJpZGUgdGhlIFR5cGVFcnJvciBiZWxvdy5cbiAgICAgICAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgICBjb250ZXh0LmFyZyA9IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgXCJUaGUgaXRlcmF0b3IgZG9lcyBub3QgcHJvdmlkZSBhICd0aHJvdycgbWV0aG9kXCIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9XG5cbiAgICB2YXIgcmVjb3JkID0gdHJ5Q2F0Y2gobWV0aG9kLCBkZWxlZ2F0ZS5pdGVyYXRvciwgY29udGV4dC5hcmcpO1xuXG4gICAgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgY29udGV4dC5hcmcgPSByZWNvcmQuYXJnO1xuICAgICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9XG5cbiAgICB2YXIgaW5mbyA9IHJlY29yZC5hcmc7XG5cbiAgICBpZiAoISBpbmZvKSB7XG4gICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgIGNvbnRleHQuYXJnID0gbmV3IFR5cGVFcnJvcihcIml0ZXJhdG9yIHJlc3VsdCBpcyBub3QgYW4gb2JqZWN0XCIpO1xuICAgICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9XG5cbiAgICBpZiAoaW5mby5kb25lKSB7XG4gICAgICAvLyBBc3NpZ24gdGhlIHJlc3VsdCBvZiB0aGUgZmluaXNoZWQgZGVsZWdhdGUgdG8gdGhlIHRlbXBvcmFyeVxuICAgICAgLy8gdmFyaWFibGUgc3BlY2lmaWVkIGJ5IGRlbGVnYXRlLnJlc3VsdE5hbWUgKHNlZSBkZWxlZ2F0ZVlpZWxkKS5cbiAgICAgIGNvbnRleHRbZGVsZWdhdGUucmVzdWx0TmFtZV0gPSBpbmZvLnZhbHVlO1xuXG4gICAgICAvLyBSZXN1bWUgZXhlY3V0aW9uIGF0IHRoZSBkZXNpcmVkIGxvY2F0aW9uIChzZWUgZGVsZWdhdGVZaWVsZCkuXG4gICAgICBjb250ZXh0Lm5leHQgPSBkZWxlZ2F0ZS5uZXh0TG9jO1xuXG4gICAgICAvLyBJZiBjb250ZXh0Lm1ldGhvZCB3YXMgXCJ0aHJvd1wiIGJ1dCB0aGUgZGVsZWdhdGUgaGFuZGxlZCB0aGVcbiAgICAgIC8vIGV4Y2VwdGlvbiwgbGV0IHRoZSBvdXRlciBnZW5lcmF0b3IgcHJvY2VlZCBub3JtYWxseS4gSWZcbiAgICAgIC8vIGNvbnRleHQubWV0aG9kIHdhcyBcIm5leHRcIiwgZm9yZ2V0IGNvbnRleHQuYXJnIHNpbmNlIGl0IGhhcyBiZWVuXG4gICAgICAvLyBcImNvbnN1bWVkXCIgYnkgdGhlIGRlbGVnYXRlIGl0ZXJhdG9yLiBJZiBjb250ZXh0Lm1ldGhvZCB3YXNcbiAgICAgIC8vIFwicmV0dXJuXCIsIGFsbG93IHRoZSBvcmlnaW5hbCAucmV0dXJuIGNhbGwgdG8gY29udGludWUgaW4gdGhlXG4gICAgICAvLyBvdXRlciBnZW5lcmF0b3IuXG4gICAgICBpZiAoY29udGV4dC5tZXRob2QgIT09IFwicmV0dXJuXCIpIHtcbiAgICAgICAgY29udGV4dC5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgICAgY29udGV4dC5hcmcgPSB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUmUteWllbGQgdGhlIHJlc3VsdCByZXR1cm5lZCBieSB0aGUgZGVsZWdhdGUgbWV0aG9kLlxuICAgICAgcmV0dXJuIGluZm87XG4gICAgfVxuXG4gICAgLy8gVGhlIGRlbGVnYXRlIGl0ZXJhdG9yIGlzIGZpbmlzaGVkLCBzbyBmb3JnZXQgaXQgYW5kIGNvbnRpbnVlIHdpdGhcbiAgICAvLyB0aGUgb3V0ZXIgZ2VuZXJhdG9yLlxuICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICB9XG5cbiAgLy8gRGVmaW5lIEdlbmVyYXRvci5wcm90b3R5cGUue25leHQsdGhyb3cscmV0dXJufSBpbiB0ZXJtcyBvZiB0aGVcbiAgLy8gdW5pZmllZCAuX2ludm9rZSBoZWxwZXIgbWV0aG9kLlxuICBkZWZpbmVJdGVyYXRvck1ldGhvZHMoR3ApO1xuXG4gIEdwW3RvU3RyaW5nVGFnU3ltYm9sXSA9IFwiR2VuZXJhdG9yXCI7XG5cbiAgLy8gQSBHZW5lcmF0b3Igc2hvdWxkIGFsd2F5cyByZXR1cm4gaXRzZWxmIGFzIHRoZSBpdGVyYXRvciBvYmplY3Qgd2hlbiB0aGVcbiAgLy8gQEBpdGVyYXRvciBmdW5jdGlvbiBpcyBjYWxsZWQgb24gaXQuIFNvbWUgYnJvd3NlcnMnIGltcGxlbWVudGF0aW9ucyBvZiB0aGVcbiAgLy8gaXRlcmF0b3IgcHJvdG90eXBlIGNoYWluIGluY29ycmVjdGx5IGltcGxlbWVudCB0aGlzLCBjYXVzaW5nIHRoZSBHZW5lcmF0b3JcbiAgLy8gb2JqZWN0IHRvIG5vdCBiZSByZXR1cm5lZCBmcm9tIHRoaXMgY2FsbC4gVGhpcyBlbnN1cmVzIHRoYXQgZG9lc24ndCBoYXBwZW4uXG4gIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVnZW5lcmF0b3IvaXNzdWVzLzI3NCBmb3IgbW9yZSBkZXRhaWxzLlxuICBHcFtpdGVyYXRvclN5bWJvbF0gPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBHcC50b1N0cmluZyA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBcIltvYmplY3QgR2VuZXJhdG9yXVwiO1xuICB9O1xuXG4gIGZ1bmN0aW9uIHB1c2hUcnlFbnRyeShsb2NzKSB7XG4gICAgdmFyIGVudHJ5ID0geyB0cnlMb2M6IGxvY3NbMF0gfTtcblxuICAgIGlmICgxIGluIGxvY3MpIHtcbiAgICAgIGVudHJ5LmNhdGNoTG9jID0gbG9jc1sxXTtcbiAgICB9XG5cbiAgICBpZiAoMiBpbiBsb2NzKSB7XG4gICAgICBlbnRyeS5maW5hbGx5TG9jID0gbG9jc1syXTtcbiAgICAgIGVudHJ5LmFmdGVyTG9jID0gbG9jc1szXTtcbiAgICB9XG5cbiAgICB0aGlzLnRyeUVudHJpZXMucHVzaChlbnRyeSk7XG4gIH1cblxuICBmdW5jdGlvbiByZXNldFRyeUVudHJ5KGVudHJ5KSB7XG4gICAgdmFyIHJlY29yZCA9IGVudHJ5LmNvbXBsZXRpb24gfHwge307XG4gICAgcmVjb3JkLnR5cGUgPSBcIm5vcm1hbFwiO1xuICAgIGRlbGV0ZSByZWNvcmQuYXJnO1xuICAgIGVudHJ5LmNvbXBsZXRpb24gPSByZWNvcmQ7XG4gIH1cblxuICBmdW5jdGlvbiBDb250ZXh0KHRyeUxvY3NMaXN0KSB7XG4gICAgLy8gVGhlIHJvb3QgZW50cnkgb2JqZWN0IChlZmZlY3RpdmVseSBhIHRyeSBzdGF0ZW1lbnQgd2l0aG91dCBhIGNhdGNoXG4gICAgLy8gb3IgYSBmaW5hbGx5IGJsb2NrKSBnaXZlcyB1cyBhIHBsYWNlIHRvIHN0b3JlIHZhbHVlcyB0aHJvd24gZnJvbVxuICAgIC8vIGxvY2F0aW9ucyB3aGVyZSB0aGVyZSBpcyBubyBlbmNsb3NpbmcgdHJ5IHN0YXRlbWVudC5cbiAgICB0aGlzLnRyeUVudHJpZXMgPSBbeyB0cnlMb2M6IFwicm9vdFwiIH1dO1xuICAgIHRyeUxvY3NMaXN0LmZvckVhY2gocHVzaFRyeUVudHJ5LCB0aGlzKTtcbiAgICB0aGlzLnJlc2V0KHRydWUpO1xuICB9XG5cbiAgcnVudGltZS5rZXlzID0gZnVuY3Rpb24ob2JqZWN0KSB7XG4gICAgdmFyIGtleXMgPSBbXTtcbiAgICBmb3IgKHZhciBrZXkgaW4gb2JqZWN0KSB7XG4gICAgICBrZXlzLnB1c2goa2V5KTtcbiAgICB9XG4gICAga2V5cy5yZXZlcnNlKCk7XG5cbiAgICAvLyBSYXRoZXIgdGhhbiByZXR1cm5pbmcgYW4gb2JqZWN0IHdpdGggYSBuZXh0IG1ldGhvZCwgd2Uga2VlcFxuICAgIC8vIHRoaW5ncyBzaW1wbGUgYW5kIHJldHVybiB0aGUgbmV4dCBmdW5jdGlvbiBpdHNlbGYuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICB3aGlsZSAoa2V5cy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIGtleSA9IGtleXMucG9wKCk7XG4gICAgICAgIGlmIChrZXkgaW4gb2JqZWN0KSB7XG4gICAgICAgICAgbmV4dC52YWx1ZSA9IGtleTtcbiAgICAgICAgICBuZXh0LmRvbmUgPSBmYWxzZTtcbiAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBUbyBhdm9pZCBjcmVhdGluZyBhbiBhZGRpdGlvbmFsIG9iamVjdCwgd2UganVzdCBoYW5nIHRoZSAudmFsdWVcbiAgICAgIC8vIGFuZCAuZG9uZSBwcm9wZXJ0aWVzIG9mZiB0aGUgbmV4dCBmdW5jdGlvbiBvYmplY3QgaXRzZWxmLiBUaGlzXG4gICAgICAvLyBhbHNvIGVuc3VyZXMgdGhhdCB0aGUgbWluaWZpZXIgd2lsbCBub3QgYW5vbnltaXplIHRoZSBmdW5jdGlvbi5cbiAgICAgIG5leHQuZG9uZSA9IHRydWU7XG4gICAgICByZXR1cm4gbmV4dDtcbiAgICB9O1xuICB9O1xuXG4gIGZ1bmN0aW9uIHZhbHVlcyhpdGVyYWJsZSkge1xuICAgIGlmIChpdGVyYWJsZSkge1xuICAgICAgdmFyIGl0ZXJhdG9yTWV0aG9kID0gaXRlcmFibGVbaXRlcmF0b3JTeW1ib2xdO1xuICAgICAgaWYgKGl0ZXJhdG9yTWV0aG9kKSB7XG4gICAgICAgIHJldHVybiBpdGVyYXRvck1ldGhvZC5jYWxsKGl0ZXJhYmxlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBpdGVyYWJsZS5uZXh0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgcmV0dXJuIGl0ZXJhYmxlO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWlzTmFOKGl0ZXJhYmxlLmxlbmd0aCkpIHtcbiAgICAgICAgdmFyIGkgPSAtMSwgbmV4dCA9IGZ1bmN0aW9uIG5leHQoKSB7XG4gICAgICAgICAgd2hpbGUgKCsraSA8IGl0ZXJhYmxlLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKGhhc093bi5jYWxsKGl0ZXJhYmxlLCBpKSkge1xuICAgICAgICAgICAgICBuZXh0LnZhbHVlID0gaXRlcmFibGVbaV07XG4gICAgICAgICAgICAgIG5leHQuZG9uZSA9IGZhbHNlO1xuICAgICAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBuZXh0LnZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICAgIG5leHQuZG9uZSA9IHRydWU7XG5cbiAgICAgICAgICByZXR1cm4gbmV4dDtcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gbmV4dC5uZXh0ID0gbmV4dDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gYW4gaXRlcmF0b3Igd2l0aCBubyB2YWx1ZXMuXG4gICAgcmV0dXJuIHsgbmV4dDogZG9uZVJlc3VsdCB9O1xuICB9XG4gIHJ1bnRpbWUudmFsdWVzID0gdmFsdWVzO1xuXG4gIGZ1bmN0aW9uIGRvbmVSZXN1bHQoKSB7XG4gICAgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9O1xuICB9XG5cbiAgQ29udGV4dC5wcm90b3R5cGUgPSB7XG4gICAgY29uc3RydWN0b3I6IENvbnRleHQsXG5cbiAgICByZXNldDogZnVuY3Rpb24oc2tpcFRlbXBSZXNldCkge1xuICAgICAgdGhpcy5wcmV2ID0gMDtcbiAgICAgIHRoaXMubmV4dCA9IDA7XG4gICAgICAvLyBSZXNldHRpbmcgY29udGV4dC5fc2VudCBmb3IgbGVnYWN5IHN1cHBvcnQgb2YgQmFiZWwnc1xuICAgICAgLy8gZnVuY3Rpb24uc2VudCBpbXBsZW1lbnRhdGlvbi5cbiAgICAgIHRoaXMuc2VudCA9IHRoaXMuX3NlbnQgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLmRvbmUgPSBmYWxzZTtcbiAgICAgIHRoaXMuZGVsZWdhdGUgPSBudWxsO1xuXG4gICAgICB0aGlzLm1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgdGhpcy5hcmcgPSB1bmRlZmluZWQ7XG5cbiAgICAgIHRoaXMudHJ5RW50cmllcy5mb3JFYWNoKHJlc2V0VHJ5RW50cnkpO1xuXG4gICAgICBpZiAoIXNraXBUZW1wUmVzZXQpIHtcbiAgICAgICAgZm9yICh2YXIgbmFtZSBpbiB0aGlzKSB7XG4gICAgICAgICAgLy8gTm90IHN1cmUgYWJvdXQgdGhlIG9wdGltYWwgb3JkZXIgb2YgdGhlc2UgY29uZGl0aW9uczpcbiAgICAgICAgICBpZiAobmFtZS5jaGFyQXQoMCkgPT09IFwidFwiICYmXG4gICAgICAgICAgICAgIGhhc093bi5jYWxsKHRoaXMsIG5hbWUpICYmXG4gICAgICAgICAgICAgICFpc05hTigrbmFtZS5zbGljZSgxKSkpIHtcbiAgICAgICAgICAgIHRoaXNbbmFtZV0gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIHN0b3A6IGZ1bmN0aW9uKCkge1xuICAgICAgdGhpcy5kb25lID0gdHJ1ZTtcblxuICAgICAgdmFyIHJvb3RFbnRyeSA9IHRoaXMudHJ5RW50cmllc1swXTtcbiAgICAgIHZhciByb290UmVjb3JkID0gcm9vdEVudHJ5LmNvbXBsZXRpb247XG4gICAgICBpZiAocm9vdFJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgdGhyb3cgcm9vdFJlY29yZC5hcmc7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLnJ2YWw7XG4gICAgfSxcblxuICAgIGRpc3BhdGNoRXhjZXB0aW9uOiBmdW5jdGlvbihleGNlcHRpb24pIHtcbiAgICAgIGlmICh0aGlzLmRvbmUpIHtcbiAgICAgICAgdGhyb3cgZXhjZXB0aW9uO1xuICAgICAgfVxuXG4gICAgICB2YXIgY29udGV4dCA9IHRoaXM7XG4gICAgICBmdW5jdGlvbiBoYW5kbGUobG9jLCBjYXVnaHQpIHtcbiAgICAgICAgcmVjb3JkLnR5cGUgPSBcInRocm93XCI7XG4gICAgICAgIHJlY29yZC5hcmcgPSBleGNlcHRpb247XG4gICAgICAgIGNvbnRleHQubmV4dCA9IGxvYztcblxuICAgICAgICBpZiAoY2F1Z2h0KSB7XG4gICAgICAgICAgLy8gSWYgdGhlIGRpc3BhdGNoZWQgZXhjZXB0aW9uIHdhcyBjYXVnaHQgYnkgYSBjYXRjaCBibG9jayxcbiAgICAgICAgICAvLyB0aGVuIGxldCB0aGF0IGNhdGNoIGJsb2NrIGhhbmRsZSB0aGUgZXhjZXB0aW9uIG5vcm1hbGx5LlxuICAgICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJuZXh0XCI7XG4gICAgICAgICAgY29udGV4dC5hcmcgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gISEgY2F1Z2h0O1xuICAgICAgfVxuXG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgdmFyIHJlY29yZCA9IGVudHJ5LmNvbXBsZXRpb247XG5cbiAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA9PT0gXCJyb290XCIpIHtcbiAgICAgICAgICAvLyBFeGNlcHRpb24gdGhyb3duIG91dHNpZGUgb2YgYW55IHRyeSBibG9jayB0aGF0IGNvdWxkIGhhbmRsZVxuICAgICAgICAgIC8vIGl0LCBzbyBzZXQgdGhlIGNvbXBsZXRpb24gdmFsdWUgb2YgdGhlIGVudGlyZSBmdW5jdGlvbiB0b1xuICAgICAgICAgIC8vIHRocm93IHRoZSBleGNlcHRpb24uXG4gICAgICAgICAgcmV0dXJuIGhhbmRsZShcImVuZFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPD0gdGhpcy5wcmV2KSB7XG4gICAgICAgICAgdmFyIGhhc0NhdGNoID0gaGFzT3duLmNhbGwoZW50cnksIFwiY2F0Y2hMb2NcIik7XG4gICAgICAgICAgdmFyIGhhc0ZpbmFsbHkgPSBoYXNPd24uY2FsbChlbnRyeSwgXCJmaW5hbGx5TG9jXCIpO1xuXG4gICAgICAgICAgaWYgKGhhc0NhdGNoICYmIGhhc0ZpbmFsbHkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5jYXRjaExvYykge1xuICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmNhdGNoTG9jLCB0cnVlKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykge1xuICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmZpbmFsbHlMb2MpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgfSBlbHNlIGlmIChoYXNDYXRjaCkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmNhdGNoTG9jKSB7XG4gICAgICAgICAgICAgIHJldHVybiBoYW5kbGUoZW50cnkuY2F0Y2hMb2MsIHRydWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgfSBlbHNlIGlmIChoYXNGaW5hbGx5KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykge1xuICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmZpbmFsbHlMb2MpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInRyeSBzdGF0ZW1lbnQgd2l0aG91dCBjYXRjaCBvciBmaW5hbGx5XCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBhYnJ1cHQ6IGZ1bmN0aW9uKHR5cGUsIGFyZykge1xuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPD0gdGhpcy5wcmV2ICYmXG4gICAgICAgICAgICBoYXNPd24uY2FsbChlbnRyeSwgXCJmaW5hbGx5TG9jXCIpICYmXG4gICAgICAgICAgICB0aGlzLnByZXYgPCBlbnRyeS5maW5hbGx5TG9jKSB7XG4gICAgICAgICAgdmFyIGZpbmFsbHlFbnRyeSA9IGVudHJ5O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChmaW5hbGx5RW50cnkgJiZcbiAgICAgICAgICAodHlwZSA9PT0gXCJicmVha1wiIHx8XG4gICAgICAgICAgIHR5cGUgPT09IFwiY29udGludWVcIikgJiZcbiAgICAgICAgICBmaW5hbGx5RW50cnkudHJ5TG9jIDw9IGFyZyAmJlxuICAgICAgICAgIGFyZyA8PSBmaW5hbGx5RW50cnkuZmluYWxseUxvYykge1xuICAgICAgICAvLyBJZ25vcmUgdGhlIGZpbmFsbHkgZW50cnkgaWYgY29udHJvbCBpcyBub3QganVtcGluZyB0byBhXG4gICAgICAgIC8vIGxvY2F0aW9uIG91dHNpZGUgdGhlIHRyeS9jYXRjaCBibG9jay5cbiAgICAgICAgZmluYWxseUVudHJ5ID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgdmFyIHJlY29yZCA9IGZpbmFsbHlFbnRyeSA/IGZpbmFsbHlFbnRyeS5jb21wbGV0aW9uIDoge307XG4gICAgICByZWNvcmQudHlwZSA9IHR5cGU7XG4gICAgICByZWNvcmQuYXJnID0gYXJnO1xuXG4gICAgICBpZiAoZmluYWxseUVudHJ5KSB7XG4gICAgICAgIHRoaXMubWV0aG9kID0gXCJuZXh0XCI7XG4gICAgICAgIHRoaXMubmV4dCA9IGZpbmFsbHlFbnRyeS5maW5hbGx5TG9jO1xuICAgICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuY29tcGxldGUocmVjb3JkKTtcbiAgICB9LFxuXG4gICAgY29tcGxldGU6IGZ1bmN0aW9uKHJlY29yZCwgYWZ0ZXJMb2MpIHtcbiAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIHRocm93IHJlY29yZC5hcmc7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJicmVha1wiIHx8XG4gICAgICAgICAgcmVjb3JkLnR5cGUgPT09IFwiY29udGludWVcIikge1xuICAgICAgICB0aGlzLm5leHQgPSByZWNvcmQuYXJnO1xuICAgICAgfSBlbHNlIGlmIChyZWNvcmQudHlwZSA9PT0gXCJyZXR1cm5cIikge1xuICAgICAgICB0aGlzLnJ2YWwgPSB0aGlzLmFyZyA9IHJlY29yZC5hcmc7XG4gICAgICAgIHRoaXMubWV0aG9kID0gXCJyZXR1cm5cIjtcbiAgICAgICAgdGhpcy5uZXh0ID0gXCJlbmRcIjtcbiAgICAgIH0gZWxzZSBpZiAocmVjb3JkLnR5cGUgPT09IFwibm9ybWFsXCIgJiYgYWZ0ZXJMb2MpIHtcbiAgICAgICAgdGhpcy5uZXh0ID0gYWZ0ZXJMb2M7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgIH0sXG5cbiAgICBmaW5pc2g6IGZ1bmN0aW9uKGZpbmFsbHlMb2MpIHtcbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICBpZiAoZW50cnkuZmluYWxseUxvYyA9PT0gZmluYWxseUxvYykge1xuICAgICAgICAgIHRoaXMuY29tcGxldGUoZW50cnkuY29tcGxldGlvbiwgZW50cnkuYWZ0ZXJMb2MpO1xuICAgICAgICAgIHJlc2V0VHJ5RW50cnkoZW50cnkpO1xuICAgICAgICAgIHJldHVybiBDb250aW51ZVNlbnRpbmVsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIFwiY2F0Y2hcIjogZnVuY3Rpb24odHJ5TG9jKSB7XG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgaWYgKGVudHJ5LnRyeUxvYyA9PT0gdHJ5TG9jKSB7XG4gICAgICAgICAgdmFyIHJlY29yZCA9IGVudHJ5LmNvbXBsZXRpb247XG4gICAgICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICAgIHZhciB0aHJvd24gPSByZWNvcmQuYXJnO1xuICAgICAgICAgICAgcmVzZXRUcnlFbnRyeShlbnRyeSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0aHJvd247XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVGhlIGNvbnRleHQuY2F0Y2ggbWV0aG9kIG11c3Qgb25seSBiZSBjYWxsZWQgd2l0aCBhIGxvY2F0aW9uXG4gICAgICAvLyBhcmd1bWVudCB0aGF0IGNvcnJlc3BvbmRzIHRvIGEga25vd24gY2F0Y2ggYmxvY2suXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbGxlZ2FsIGNhdGNoIGF0dGVtcHRcIik7XG4gICAgfSxcblxuICAgIGRlbGVnYXRlWWllbGQ6IGZ1bmN0aW9uKGl0ZXJhYmxlLCByZXN1bHROYW1lLCBuZXh0TG9jKSB7XG4gICAgICB0aGlzLmRlbGVnYXRlID0ge1xuICAgICAgICBpdGVyYXRvcjogdmFsdWVzKGl0ZXJhYmxlKSxcbiAgICAgICAgcmVzdWx0TmFtZTogcmVzdWx0TmFtZSxcbiAgICAgICAgbmV4dExvYzogbmV4dExvY1xuICAgICAgfTtcblxuICAgICAgaWYgKHRoaXMubWV0aG9kID09PSBcIm5leHRcIikge1xuICAgICAgICAvLyBEZWxpYmVyYXRlbHkgZm9yZ2V0IHRoZSBsYXN0IHNlbnQgdmFsdWUgc28gdGhhdCB3ZSBkb24ndFxuICAgICAgICAvLyBhY2NpZGVudGFsbHkgcGFzcyBpdCBvbiB0byB0aGUgZGVsZWdhdGUuXG4gICAgICAgIHRoaXMuYXJnID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9XG4gIH07XG59KShcbiAgLy8gSW4gc2xvcHB5IG1vZGUsIHVuYm91bmQgYHRoaXNgIHJlZmVycyB0byB0aGUgZ2xvYmFsIG9iamVjdCwgZmFsbGJhY2sgdG9cbiAgLy8gRnVuY3Rpb24gY29uc3RydWN0b3IgaWYgd2UncmUgaW4gZ2xvYmFsIHN0cmljdCBtb2RlLiBUaGF0IGlzIHNhZGx5IGEgZm9ybVxuICAvLyBvZiBpbmRpcmVjdCBldmFsIHdoaWNoIHZpb2xhdGVzIENvbnRlbnQgU2VjdXJpdHkgUG9saWN5LlxuICAoZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzIH0pKCkgfHwgRnVuY3Rpb24oXCJyZXR1cm4gdGhpc1wiKSgpXG4pO1xufSk7XG5cbi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuLy8gVGhpcyBtZXRob2Qgb2Ygb2J0YWluaW5nIGEgcmVmZXJlbmNlIHRvIHRoZSBnbG9iYWwgb2JqZWN0IG5lZWRzIHRvIGJlXG4vLyBrZXB0IGlkZW50aWNhbCB0byB0aGUgd2F5IGl0IGlzIG9idGFpbmVkIGluIHJ1bnRpbWUuanNcbnZhciBnID0gKGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcyB9KSgpIHx8IEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKTtcblxuLy8gVXNlIGBnZXRPd25Qcm9wZXJ0eU5hbWVzYCBiZWNhdXNlIG5vdCBhbGwgYnJvd3NlcnMgc3VwcG9ydCBjYWxsaW5nXG4vLyBgaGFzT3duUHJvcGVydHlgIG9uIHRoZSBnbG9iYWwgYHNlbGZgIG9iamVjdCBpbiBhIHdvcmtlci4gU2VlICMxODMuXG52YXIgaGFkUnVudGltZSA9IGcucmVnZW5lcmF0b3JSdW50aW1lICYmXG4gIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGcpLmluZGV4T2YoXCJyZWdlbmVyYXRvclJ1bnRpbWVcIikgPj0gMDtcblxuLy8gU2F2ZSB0aGUgb2xkIHJlZ2VuZXJhdG9yUnVudGltZSBpbiBjYXNlIGl0IG5lZWRzIHRvIGJlIHJlc3RvcmVkIGxhdGVyLlxudmFyIG9sZFJ1bnRpbWUgPSBoYWRSdW50aW1lICYmIGcucmVnZW5lcmF0b3JSdW50aW1lO1xuXG4vLyBGb3JjZSByZWV2YWx1dGF0aW9uIG9mIHJ1bnRpbWUuanMuXG5nLnJlZ2VuZXJhdG9yUnVudGltZSA9IHVuZGVmaW5lZDtcblxudmFyIHJ1bnRpbWVNb2R1bGUgPSBydW50aW1lO1xuXG5pZiAoaGFkUnVudGltZSkge1xuICAvLyBSZXN0b3JlIHRoZSBvcmlnaW5hbCBydW50aW1lLlxuICBnLnJlZ2VuZXJhdG9yUnVudGltZSA9IG9sZFJ1bnRpbWU7XG59IGVsc2Uge1xuICAvLyBSZW1vdmUgdGhlIGdsb2JhbCBwcm9wZXJ0eSBhZGRlZCBieSBydW50aW1lLmpzLlxuICB0cnkge1xuICAgIGRlbGV0ZSBnLnJlZ2VuZXJhdG9yUnVudGltZTtcbiAgfSBjYXRjaChlKSB7XG4gICAgZy5yZWdlbmVyYXRvclJ1bnRpbWUgPSB1bmRlZmluZWQ7XG4gIH1cbn1cblxudmFyIHJlZ2VuZXJhdG9yID0gcnVudGltZU1vZHVsZTtcblxuLy8gNy4xLjQgVG9JbnRlZ2VyXG52YXIgY2VpbCA9IE1hdGguY2VpbDtcbnZhciBmbG9vciA9IE1hdGguZmxvb3I7XG52YXIgX3RvSW50ZWdlciA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXNOYU4oaXQgPSAraXQpID8gMCA6IChpdCA+IDAgPyBmbG9vciA6IGNlaWwpKGl0KTtcbn07XG5cbi8vIDcuMi4xIFJlcXVpcmVPYmplY3RDb2VyY2libGUoYXJndW1lbnQpXG52YXIgX2RlZmluZWQgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKGl0ID09IHVuZGVmaW5lZCkgdGhyb3cgVHlwZUVycm9yKFwiQ2FuJ3QgY2FsbCBtZXRob2Qgb24gIFwiICsgaXQpO1xuICByZXR1cm4gaXQ7XG59O1xuXG4vLyB0cnVlICAtPiBTdHJpbmcjYXRcbi8vIGZhbHNlIC0+IFN0cmluZyNjb2RlUG9pbnRBdFxudmFyIF9zdHJpbmdBdCA9IGZ1bmN0aW9uIChUT19TVFJJTkcpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh0aGF0LCBwb3MpIHtcbiAgICB2YXIgcyA9IFN0cmluZyhfZGVmaW5lZCh0aGF0KSk7XG4gICAgdmFyIGkgPSBfdG9JbnRlZ2VyKHBvcyk7XG4gICAgdmFyIGwgPSBzLmxlbmd0aDtcbiAgICB2YXIgYSwgYjtcbiAgICBpZiAoaSA8IDAgfHwgaSA+PSBsKSByZXR1cm4gVE9fU1RSSU5HID8gJycgOiB1bmRlZmluZWQ7XG4gICAgYSA9IHMuY2hhckNvZGVBdChpKTtcbiAgICByZXR1cm4gYSA8IDB4ZDgwMCB8fCBhID4gMHhkYmZmIHx8IGkgKyAxID09PSBsIHx8IChiID0gcy5jaGFyQ29kZUF0KGkgKyAxKSkgPCAweGRjMDAgfHwgYiA+IDB4ZGZmZlxuICAgICAgPyBUT19TVFJJTkcgPyBzLmNoYXJBdChpKSA6IGFcbiAgICAgIDogVE9fU1RSSU5HID8gcy5zbGljZShpLCBpICsgMikgOiAoYSAtIDB4ZDgwMCA8PCAxMCkgKyAoYiAtIDB4ZGMwMCkgKyAweDEwMDAwO1xuICB9O1xufTtcblxudmFyIF9saWJyYXJ5ID0gdHJ1ZTtcblxudmFyIF9nbG9iYWwgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlKSB7XG4vLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvODYjaXNzdWVjb21tZW50LTExNTc1OTAyOFxudmFyIGdsb2JhbCA9IG1vZHVsZS5leHBvcnRzID0gdHlwZW9mIHdpbmRvdyAhPSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuTWF0aCA9PSBNYXRoXG4gID8gd2luZG93IDogdHlwZW9mIHNlbGYgIT0gJ3VuZGVmaW5lZCcgJiYgc2VsZi5NYXRoID09IE1hdGggPyBzZWxmXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXctZnVuY1xuICA6IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5pZiAodHlwZW9mIF9fZyA9PSAnbnVtYmVyJykgX19nID0gZ2xvYmFsOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG59KTtcblxudmFyIF9jb3JlID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSkge1xudmFyIGNvcmUgPSBtb2R1bGUuZXhwb3J0cyA9IHsgdmVyc2lvbjogJzIuNS42JyB9O1xuaWYgKHR5cGVvZiBfX2UgPT0gJ251bWJlcicpIF9fZSA9IGNvcmU7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcbn0pO1xudmFyIF9jb3JlXzEgPSBfY29yZS52ZXJzaW9uO1xuXG52YXIgX2FGdW5jdGlvbiA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAodHlwZW9mIGl0ICE9ICdmdW5jdGlvbicpIHRocm93IFR5cGVFcnJvcihpdCArICcgaXMgbm90IGEgZnVuY3Rpb24hJyk7XG4gIHJldHVybiBpdDtcbn07XG5cbi8vIG9wdGlvbmFsIC8gc2ltcGxlIGNvbnRleHQgYmluZGluZ1xuXG52YXIgX2N0eCA9IGZ1bmN0aW9uIChmbiwgdGhhdCwgbGVuZ3RoKSB7XG4gIF9hRnVuY3Rpb24oZm4pO1xuICBpZiAodGhhdCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gZm47XG4gIHN3aXRjaCAobGVuZ3RoKSB7XG4gICAgY2FzZSAxOiByZXR1cm4gZnVuY3Rpb24gKGEpIHtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEpO1xuICAgIH07XG4gICAgY2FzZSAyOiByZXR1cm4gZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEsIGIpO1xuICAgIH07XG4gICAgY2FzZSAzOiByZXR1cm4gZnVuY3Rpb24gKGEsIGIsIGMpIHtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEsIGIsIGMpO1xuICAgIH07XG4gIH1cbiAgcmV0dXJuIGZ1bmN0aW9uICgvKiAuLi5hcmdzICovKSB7XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoYXQsIGFyZ3VtZW50cyk7XG4gIH07XG59O1xuXG52YXIgX2lzT2JqZWN0ID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiB0eXBlb2YgaXQgPT09ICdvYmplY3QnID8gaXQgIT09IG51bGwgOiB0eXBlb2YgaXQgPT09ICdmdW5jdGlvbic7XG59O1xuXG52YXIgX2FuT2JqZWN0ID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmICghX2lzT2JqZWN0KGl0KSkgdGhyb3cgVHlwZUVycm9yKGl0ICsgJyBpcyBub3QgYW4gb2JqZWN0IScpO1xuICByZXR1cm4gaXQ7XG59O1xuXG52YXIgX2ZhaWxzID0gZnVuY3Rpb24gKGV4ZWMpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gISFleGVjKCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufTtcblxuLy8gVGhhbmsncyBJRTggZm9yIGhpcyBmdW5ueSBkZWZpbmVQcm9wZXJ0eVxudmFyIF9kZXNjcmlwdG9ycyA9ICFfZmFpbHMoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCAnYScsIHsgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiA3OyB9IH0pLmEgIT0gNztcbn0pO1xuXG52YXIgZG9jdW1lbnQkMSA9IF9nbG9iYWwuZG9jdW1lbnQ7XG4vLyB0eXBlb2YgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCBpcyAnb2JqZWN0JyBpbiBvbGQgSUVcbnZhciBpcyA9IF9pc09iamVjdChkb2N1bWVudCQxKSAmJiBfaXNPYmplY3QoZG9jdW1lbnQkMS5jcmVhdGVFbGVtZW50KTtcbnZhciBfZG9tQ3JlYXRlID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBpcyA/IGRvY3VtZW50JDEuY3JlYXRlRWxlbWVudChpdCkgOiB7fTtcbn07XG5cbnZhciBfaWU4RG9tRGVmaW5lID0gIV9kZXNjcmlwdG9ycyAmJiAhX2ZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfZG9tQ3JlYXRlKCdkaXYnKSwgJ2EnLCB7IGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gNzsgfSB9KS5hICE9IDc7XG59KTtcblxuLy8gNy4xLjEgVG9QcmltaXRpdmUoaW5wdXQgWywgUHJlZmVycmVkVHlwZV0pXG5cbi8vIGluc3RlYWQgb2YgdGhlIEVTNiBzcGVjIHZlcnNpb24sIHdlIGRpZG4ndCBpbXBsZW1lbnQgQEB0b1ByaW1pdGl2ZSBjYXNlXG4vLyBhbmQgdGhlIHNlY29uZCBhcmd1bWVudCAtIGZsYWcgLSBwcmVmZXJyZWQgdHlwZSBpcyBhIHN0cmluZ1xudmFyIF90b1ByaW1pdGl2ZSA9IGZ1bmN0aW9uIChpdCwgUykge1xuICBpZiAoIV9pc09iamVjdChpdCkpIHJldHVybiBpdDtcbiAgdmFyIGZuLCB2YWw7XG4gIGlmIChTICYmIHR5cGVvZiAoZm4gPSBpdC50b1N0cmluZykgPT0gJ2Z1bmN0aW9uJyAmJiAhX2lzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaXQpKSkgcmV0dXJuIHZhbDtcbiAgaWYgKHR5cGVvZiAoZm4gPSBpdC52YWx1ZU9mKSA9PSAnZnVuY3Rpb24nICYmICFfaXNPYmplY3QodmFsID0gZm4uY2FsbChpdCkpKSByZXR1cm4gdmFsO1xuICBpZiAoIVMgJiYgdHlwZW9mIChmbiA9IGl0LnRvU3RyaW5nKSA9PSAnZnVuY3Rpb24nICYmICFfaXNPYmplY3QodmFsID0gZm4uY2FsbChpdCkpKSByZXR1cm4gdmFsO1xuICB0aHJvdyBUeXBlRXJyb3IoXCJDYW4ndCBjb252ZXJ0IG9iamVjdCB0byBwcmltaXRpdmUgdmFsdWVcIik7XG59O1xuXG52YXIgZFAgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG5cbnZhciBmID0gX2Rlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnR5IDogZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcykge1xuICBfYW5PYmplY3QoTyk7XG4gIFAgPSBfdG9QcmltaXRpdmUoUCwgdHJ1ZSk7XG4gIF9hbk9iamVjdChBdHRyaWJ1dGVzKTtcbiAgaWYgKF9pZThEb21EZWZpbmUpIHRyeSB7XG4gICAgcmV0dXJuIGRQKE8sIFAsIEF0dHJpYnV0ZXMpO1xuICB9IGNhdGNoIChlKSB7IC8qIGVtcHR5ICovIH1cbiAgaWYgKCdnZXQnIGluIEF0dHJpYnV0ZXMgfHwgJ3NldCcgaW4gQXR0cmlidXRlcykgdGhyb3cgVHlwZUVycm9yKCdBY2Nlc3NvcnMgbm90IHN1cHBvcnRlZCEnKTtcbiAgaWYgKCd2YWx1ZScgaW4gQXR0cmlidXRlcykgT1tQXSA9IEF0dHJpYnV0ZXMudmFsdWU7XG4gIHJldHVybiBPO1xufTtcblxudmFyIF9vYmplY3REcCA9IHtcblx0ZjogZlxufTtcblxudmFyIF9wcm9wZXJ0eURlc2MgPSBmdW5jdGlvbiAoYml0bWFwLCB2YWx1ZSkge1xuICByZXR1cm4ge1xuICAgIGVudW1lcmFibGU6ICEoYml0bWFwICYgMSksXG4gICAgY29uZmlndXJhYmxlOiAhKGJpdG1hcCAmIDIpLFxuICAgIHdyaXRhYmxlOiAhKGJpdG1hcCAmIDQpLFxuICAgIHZhbHVlOiB2YWx1ZVxuICB9O1xufTtcblxudmFyIF9oaWRlID0gX2Rlc2NyaXB0b3JzID8gZnVuY3Rpb24gKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICByZXR1cm4gX29iamVjdERwLmYob2JqZWN0LCBrZXksIF9wcm9wZXJ0eURlc2MoMSwgdmFsdWUpKTtcbn0gOiBmdW5jdGlvbiAob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIG9iamVjdFtrZXldID0gdmFsdWU7XG4gIHJldHVybiBvYmplY3Q7XG59O1xuXG52YXIgaGFzT3duUHJvcGVydHkgPSB7fS5oYXNPd25Qcm9wZXJ0eTtcbnZhciBfaGFzID0gZnVuY3Rpb24gKGl0LCBrZXkpIHtcbiAgcmV0dXJuIGhhc093blByb3BlcnR5LmNhbGwoaXQsIGtleSk7XG59O1xuXG52YXIgUFJPVE9UWVBFID0gJ3Byb3RvdHlwZSc7XG5cbnZhciAkZXhwb3J0ID0gZnVuY3Rpb24gKHR5cGUsIG5hbWUsIHNvdXJjZSkge1xuICB2YXIgSVNfRk9SQ0VEID0gdHlwZSAmICRleHBvcnQuRjtcbiAgdmFyIElTX0dMT0JBTCA9IHR5cGUgJiAkZXhwb3J0Lkc7XG4gIHZhciBJU19TVEFUSUMgPSB0eXBlICYgJGV4cG9ydC5TO1xuICB2YXIgSVNfUFJPVE8gPSB0eXBlICYgJGV4cG9ydC5QO1xuICB2YXIgSVNfQklORCA9IHR5cGUgJiAkZXhwb3J0LkI7XG4gIHZhciBJU19XUkFQID0gdHlwZSAmICRleHBvcnQuVztcbiAgdmFyIGV4cG9ydHMgPSBJU19HTE9CQUwgPyBfY29yZSA6IF9jb3JlW25hbWVdIHx8IChfY29yZVtuYW1lXSA9IHt9KTtcbiAgdmFyIGV4cFByb3RvID0gZXhwb3J0c1tQUk9UT1RZUEVdO1xuICB2YXIgdGFyZ2V0ID0gSVNfR0xPQkFMID8gX2dsb2JhbCA6IElTX1NUQVRJQyA/IF9nbG9iYWxbbmFtZV0gOiAoX2dsb2JhbFtuYW1lXSB8fCB7fSlbUFJPVE9UWVBFXTtcbiAgdmFyIGtleSwgb3duLCBvdXQ7XG4gIGlmIChJU19HTE9CQUwpIHNvdXJjZSA9IG5hbWU7XG4gIGZvciAoa2V5IGluIHNvdXJjZSkge1xuICAgIC8vIGNvbnRhaW5zIGluIG5hdGl2ZVxuICAgIG93biA9ICFJU19GT1JDRUQgJiYgdGFyZ2V0ICYmIHRhcmdldFtrZXldICE9PSB1bmRlZmluZWQ7XG4gICAgaWYgKG93biAmJiBfaGFzKGV4cG9ydHMsIGtleSkpIGNvbnRpbnVlO1xuICAgIC8vIGV4cG9ydCBuYXRpdmUgb3IgcGFzc2VkXG4gICAgb3V0ID0gb3duID8gdGFyZ2V0W2tleV0gOiBzb3VyY2Vba2V5XTtcbiAgICAvLyBwcmV2ZW50IGdsb2JhbCBwb2xsdXRpb24gZm9yIG5hbWVzcGFjZXNcbiAgICBleHBvcnRzW2tleV0gPSBJU19HTE9CQUwgJiYgdHlwZW9mIHRhcmdldFtrZXldICE9ICdmdW5jdGlvbicgPyBzb3VyY2Vba2V5XVxuICAgIC8vIGJpbmQgdGltZXJzIHRvIGdsb2JhbCBmb3IgY2FsbCBmcm9tIGV4cG9ydCBjb250ZXh0XG4gICAgOiBJU19CSU5EICYmIG93biA/IF9jdHgob3V0LCBfZ2xvYmFsKVxuICAgIC8vIHdyYXAgZ2xvYmFsIGNvbnN0cnVjdG9ycyBmb3IgcHJldmVudCBjaGFuZ2UgdGhlbSBpbiBsaWJyYXJ5XG4gICAgOiBJU19XUkFQICYmIHRhcmdldFtrZXldID09IG91dCA/IChmdW5jdGlvbiAoQykge1xuICAgICAgdmFyIEYgPSBmdW5jdGlvbiAoYSwgYiwgYykge1xuICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIEMpIHtcbiAgICAgICAgICBzd2l0Y2ggKGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIG5ldyBDKCk7XG4gICAgICAgICAgICBjYXNlIDE6IHJldHVybiBuZXcgQyhhKTtcbiAgICAgICAgICAgIGNhc2UgMjogcmV0dXJuIG5ldyBDKGEsIGIpO1xuICAgICAgICAgIH0gcmV0dXJuIG5ldyBDKGEsIGIsIGMpO1xuICAgICAgICB9IHJldHVybiBDLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9O1xuICAgICAgRltQUk9UT1RZUEVdID0gQ1tQUk9UT1RZUEVdO1xuICAgICAgcmV0dXJuIEY7XG4gICAgLy8gbWFrZSBzdGF0aWMgdmVyc2lvbnMgZm9yIHByb3RvdHlwZSBtZXRob2RzXG4gICAgfSkob3V0KSA6IElTX1BST1RPICYmIHR5cGVvZiBvdXQgPT0gJ2Z1bmN0aW9uJyA/IF9jdHgoRnVuY3Rpb24uY2FsbCwgb3V0KSA6IG91dDtcbiAgICAvLyBleHBvcnQgcHJvdG8gbWV0aG9kcyB0byBjb3JlLiVDT05TVFJVQ1RPUiUubWV0aG9kcy4lTkFNRSVcbiAgICBpZiAoSVNfUFJPVE8pIHtcbiAgICAgIChleHBvcnRzLnZpcnR1YWwgfHwgKGV4cG9ydHMudmlydHVhbCA9IHt9KSlba2V5XSA9IG91dDtcbiAgICAgIC8vIGV4cG9ydCBwcm90byBtZXRob2RzIHRvIGNvcmUuJUNPTlNUUlVDVE9SJS5wcm90b3R5cGUuJU5BTUUlXG4gICAgICBpZiAodHlwZSAmICRleHBvcnQuUiAmJiBleHBQcm90byAmJiAhZXhwUHJvdG9ba2V5XSkgX2hpZGUoZXhwUHJvdG8sIGtleSwgb3V0KTtcbiAgICB9XG4gIH1cbn07XG4vLyB0eXBlIGJpdG1hcFxuJGV4cG9ydC5GID0gMTsgICAvLyBmb3JjZWRcbiRleHBvcnQuRyA9IDI7ICAgLy8gZ2xvYmFsXG4kZXhwb3J0LlMgPSA0OyAgIC8vIHN0YXRpY1xuJGV4cG9ydC5QID0gODsgICAvLyBwcm90b1xuJGV4cG9ydC5CID0gMTY7ICAvLyBiaW5kXG4kZXhwb3J0LlcgPSAzMjsgIC8vIHdyYXBcbiRleHBvcnQuVSA9IDY0OyAgLy8gc2FmZVxuJGV4cG9ydC5SID0gMTI4OyAvLyByZWFsIHByb3RvIG1ldGhvZCBmb3IgYGxpYnJhcnlgXG52YXIgX2V4cG9ydCA9ICRleHBvcnQ7XG5cbnZhciBfcmVkZWZpbmUgPSBfaGlkZTtcblxudmFyIF9pdGVyYXRvcnMgPSB7fTtcblxudmFyIHRvU3RyaW5nID0ge30udG9TdHJpbmc7XG5cbnZhciBfY29mID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKGl0KS5zbGljZSg4LCAtMSk7XG59O1xuXG4vLyBmYWxsYmFjayBmb3Igbm9uLWFycmF5LWxpa2UgRVMzIGFuZCBub24tZW51bWVyYWJsZSBvbGQgVjggc3RyaW5nc1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG52YXIgX2lvYmplY3QgPSBPYmplY3QoJ3onKS5wcm9wZXJ0eUlzRW51bWVyYWJsZSgwKSA/IE9iamVjdCA6IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gX2NvZihpdCkgPT0gJ1N0cmluZycgPyBpdC5zcGxpdCgnJykgOiBPYmplY3QoaXQpO1xufTtcblxuLy8gdG8gaW5kZXhlZCBvYmplY3QsIHRvT2JqZWN0IHdpdGggZmFsbGJhY2sgZm9yIG5vbi1hcnJheS1saWtlIEVTMyBzdHJpbmdzXG5cblxudmFyIF90b0lvYmplY3QgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIF9pb2JqZWN0KF9kZWZpbmVkKGl0KSk7XG59O1xuXG4vLyA3LjEuMTUgVG9MZW5ndGhcblxudmFyIG1pbiA9IE1hdGgubWluO1xudmFyIF90b0xlbmd0aCA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXQgPiAwID8gbWluKF90b0ludGVnZXIoaXQpLCAweDFmZmZmZmZmZmZmZmZmKSA6IDA7IC8vIHBvdygyLCA1MykgLSAxID09IDkwMDcxOTkyNTQ3NDA5OTFcbn07XG5cbnZhciBtYXggPSBNYXRoLm1heDtcbnZhciBtaW4kMSA9IE1hdGgubWluO1xudmFyIF90b0Fic29sdXRlSW5kZXggPSBmdW5jdGlvbiAoaW5kZXgsIGxlbmd0aCkge1xuICBpbmRleCA9IF90b0ludGVnZXIoaW5kZXgpO1xuICByZXR1cm4gaW5kZXggPCAwID8gbWF4KGluZGV4ICsgbGVuZ3RoLCAwKSA6IG1pbiQxKGluZGV4LCBsZW5ndGgpO1xufTtcblxuLy8gZmFsc2UgLT4gQXJyYXkjaW5kZXhPZlxuLy8gdHJ1ZSAgLT4gQXJyYXkjaW5jbHVkZXNcblxuXG5cbnZhciBfYXJyYXlJbmNsdWRlcyA9IGZ1bmN0aW9uIChJU19JTkNMVURFUykge1xuICByZXR1cm4gZnVuY3Rpb24gKCR0aGlzLCBlbCwgZnJvbUluZGV4KSB7XG4gICAgdmFyIE8gPSBfdG9Jb2JqZWN0KCR0aGlzKTtcbiAgICB2YXIgbGVuZ3RoID0gX3RvTGVuZ3RoKE8ubGVuZ3RoKTtcbiAgICB2YXIgaW5kZXggPSBfdG9BYnNvbHV0ZUluZGV4KGZyb21JbmRleCwgbGVuZ3RoKTtcbiAgICB2YXIgdmFsdWU7XG4gICAgLy8gQXJyYXkjaW5jbHVkZXMgdXNlcyBTYW1lVmFsdWVaZXJvIGVxdWFsaXR5IGFsZ29yaXRobVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgICBpZiAoSVNfSU5DTFVERVMgJiYgZWwgIT0gZWwpIHdoaWxlIChsZW5ndGggPiBpbmRleCkge1xuICAgICAgdmFsdWUgPSBPW2luZGV4KytdO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICAgICAgaWYgKHZhbHVlICE9IHZhbHVlKSByZXR1cm4gdHJ1ZTtcbiAgICAvLyBBcnJheSNpbmRleE9mIGlnbm9yZXMgaG9sZXMsIEFycmF5I2luY2x1ZGVzIC0gbm90XG4gICAgfSBlbHNlIGZvciAoO2xlbmd0aCA+IGluZGV4OyBpbmRleCsrKSBpZiAoSVNfSU5DTFVERVMgfHwgaW5kZXggaW4gTykge1xuICAgICAgaWYgKE9baW5kZXhdID09PSBlbCkgcmV0dXJuIElTX0lOQ0xVREVTIHx8IGluZGV4IHx8IDA7XG4gICAgfSByZXR1cm4gIUlTX0lOQ0xVREVTICYmIC0xO1xuICB9O1xufTtcblxudmFyIF9zaGFyZWQgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlKSB7XG52YXIgU0hBUkVEID0gJ19fY29yZS1qc19zaGFyZWRfXyc7XG52YXIgc3RvcmUgPSBfZ2xvYmFsW1NIQVJFRF0gfHwgKF9nbG9iYWxbU0hBUkVEXSA9IHt9KTtcblxuKG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgcmV0dXJuIHN0b3JlW2tleV0gfHwgKHN0b3JlW2tleV0gPSB2YWx1ZSAhPT0gdW5kZWZpbmVkID8gdmFsdWUgOiB7fSk7XG59KSgndmVyc2lvbnMnLCBbXSkucHVzaCh7XG4gIHZlcnNpb246IF9jb3JlLnZlcnNpb24sXG4gIG1vZGU6IF9saWJyYXJ5ID8gJ3B1cmUnIDogJ2dsb2JhbCcsXG4gIGNvcHlyaWdodDogJ8KpIDIwMTggRGVuaXMgUHVzaGthcmV2ICh6bG9pcm9jay5ydSknXG59KTtcbn0pO1xuXG52YXIgaWQgPSAwO1xudmFyIHB4ID0gTWF0aC5yYW5kb20oKTtcbnZhciBfdWlkID0gZnVuY3Rpb24gKGtleSkge1xuICByZXR1cm4gJ1N5bWJvbCgnLmNvbmNhdChrZXkgPT09IHVuZGVmaW5lZCA/ICcnIDoga2V5LCAnKV8nLCAoKytpZCArIHB4KS50b1N0cmluZygzNikpO1xufTtcblxudmFyIHNoYXJlZCA9IF9zaGFyZWQoJ2tleXMnKTtcblxudmFyIF9zaGFyZWRLZXkgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIHJldHVybiBzaGFyZWRba2V5XSB8fCAoc2hhcmVkW2tleV0gPSBfdWlkKGtleSkpO1xufTtcblxudmFyIGFycmF5SW5kZXhPZiA9IF9hcnJheUluY2x1ZGVzKGZhbHNlKTtcbnZhciBJRV9QUk9UTyA9IF9zaGFyZWRLZXkoJ0lFX1BST1RPJyk7XG5cbnZhciBfb2JqZWN0S2V5c0ludGVybmFsID0gZnVuY3Rpb24gKG9iamVjdCwgbmFtZXMpIHtcbiAgdmFyIE8gPSBfdG9Jb2JqZWN0KG9iamVjdCk7XG4gIHZhciBpID0gMDtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICB2YXIga2V5O1xuICBmb3IgKGtleSBpbiBPKSBpZiAoa2V5ICE9IElFX1BST1RPKSBfaGFzKE8sIGtleSkgJiYgcmVzdWx0LnB1c2goa2V5KTtcbiAgLy8gRG9uJ3QgZW51bSBidWcgJiBoaWRkZW4ga2V5c1xuICB3aGlsZSAobmFtZXMubGVuZ3RoID4gaSkgaWYgKF9oYXMoTywga2V5ID0gbmFtZXNbaSsrXSkpIHtcbiAgICB+YXJyYXlJbmRleE9mKHJlc3VsdCwga2V5KSB8fCByZXN1bHQucHVzaChrZXkpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vLyBJRSA4LSBkb24ndCBlbnVtIGJ1ZyBrZXlzXG52YXIgX2VudW1CdWdLZXlzID0gKFxuICAnY29uc3RydWN0b3IsaGFzT3duUHJvcGVydHksaXNQcm90b3R5cGVPZixwcm9wZXJ0eUlzRW51bWVyYWJsZSx0b0xvY2FsZVN0cmluZyx0b1N0cmluZyx2YWx1ZU9mJ1xuKS5zcGxpdCgnLCcpO1xuXG4vLyAxOS4xLjIuMTQgLyAxNS4yLjMuMTQgT2JqZWN0LmtleXMoTylcblxuXG5cbnZhciBfb2JqZWN0S2V5cyA9IE9iamVjdC5rZXlzIHx8IGZ1bmN0aW9uIGtleXMoTykge1xuICByZXR1cm4gX29iamVjdEtleXNJbnRlcm5hbChPLCBfZW51bUJ1Z0tleXMpO1xufTtcblxudmFyIF9vYmplY3REcHMgPSBfZGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyA6IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXMoTywgUHJvcGVydGllcykge1xuICBfYW5PYmplY3QoTyk7XG4gIHZhciBrZXlzID0gX29iamVjdEtleXMoUHJvcGVydGllcyk7XG4gIHZhciBsZW5ndGggPSBrZXlzLmxlbmd0aDtcbiAgdmFyIGkgPSAwO1xuICB2YXIgUDtcbiAgd2hpbGUgKGxlbmd0aCA+IGkpIF9vYmplY3REcC5mKE8sIFAgPSBrZXlzW2krK10sIFByb3BlcnRpZXNbUF0pO1xuICByZXR1cm4gTztcbn07XG5cbnZhciBkb2N1bWVudCQyID0gX2dsb2JhbC5kb2N1bWVudDtcbnZhciBfaHRtbCA9IGRvY3VtZW50JDIgJiYgZG9jdW1lbnQkMi5kb2N1bWVudEVsZW1lbnQ7XG5cbi8vIDE5LjEuMi4yIC8gMTUuMi4zLjUgT2JqZWN0LmNyZWF0ZShPIFssIFByb3BlcnRpZXNdKVxuXG5cblxudmFyIElFX1BST1RPJDEgPSBfc2hhcmVkS2V5KCdJRV9QUk9UTycpO1xudmFyIEVtcHR5ID0gZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9O1xudmFyIFBST1RPVFlQRSQxID0gJ3Byb3RvdHlwZSc7XG5cbi8vIENyZWF0ZSBvYmplY3Qgd2l0aCBmYWtlIGBudWxsYCBwcm90b3R5cGU6IHVzZSBpZnJhbWUgT2JqZWN0IHdpdGggY2xlYXJlZCBwcm90b3R5cGVcbnZhciBjcmVhdGVEaWN0ID0gZnVuY3Rpb24gKCkge1xuICAvLyBUaHJhc2gsIHdhc3RlIGFuZCBzb2RvbXk6IElFIEdDIGJ1Z1xuICB2YXIgaWZyYW1lID0gX2RvbUNyZWF0ZSgnaWZyYW1lJyk7XG4gIHZhciBpID0gX2VudW1CdWdLZXlzLmxlbmd0aDtcbiAgdmFyIGx0ID0gJzwnO1xuICB2YXIgZ3QgPSAnPic7XG4gIHZhciBpZnJhbWVEb2N1bWVudDtcbiAgaWZyYW1lLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIF9odG1sLmFwcGVuZENoaWxkKGlmcmFtZSk7XG4gIGlmcmFtZS5zcmMgPSAnamF2YXNjcmlwdDonOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNjcmlwdC11cmxcbiAgLy8gY3JlYXRlRGljdCA9IGlmcmFtZS5jb250ZW50V2luZG93Lk9iamVjdDtcbiAgLy8gaHRtbC5yZW1vdmVDaGlsZChpZnJhbWUpO1xuICBpZnJhbWVEb2N1bWVudCA9IGlmcmFtZS5jb250ZW50V2luZG93LmRvY3VtZW50O1xuICBpZnJhbWVEb2N1bWVudC5vcGVuKCk7XG4gIGlmcmFtZURvY3VtZW50LndyaXRlKGx0ICsgJ3NjcmlwdCcgKyBndCArICdkb2N1bWVudC5GPU9iamVjdCcgKyBsdCArICcvc2NyaXB0JyArIGd0KTtcbiAgaWZyYW1lRG9jdW1lbnQuY2xvc2UoKTtcbiAgY3JlYXRlRGljdCA9IGlmcmFtZURvY3VtZW50LkY7XG4gIHdoaWxlIChpLS0pIGRlbGV0ZSBjcmVhdGVEaWN0W1BST1RPVFlQRSQxXVtfZW51bUJ1Z0tleXNbaV1dO1xuICByZXR1cm4gY3JlYXRlRGljdCgpO1xufTtcblxudmFyIF9vYmplY3RDcmVhdGUgPSBPYmplY3QuY3JlYXRlIHx8IGZ1bmN0aW9uIGNyZWF0ZShPLCBQcm9wZXJ0aWVzKSB7XG4gIHZhciByZXN1bHQ7XG4gIGlmIChPICE9PSBudWxsKSB7XG4gICAgRW1wdHlbUFJPVE9UWVBFJDFdID0gX2FuT2JqZWN0KE8pO1xuICAgIHJlc3VsdCA9IG5ldyBFbXB0eSgpO1xuICAgIEVtcHR5W1BST1RPVFlQRSQxXSA9IG51bGw7XG4gICAgLy8gYWRkIFwiX19wcm90b19fXCIgZm9yIE9iamVjdC5nZXRQcm90b3R5cGVPZiBwb2x5ZmlsbFxuICAgIHJlc3VsdFtJRV9QUk9UTyQxXSA9IE87XG4gIH0gZWxzZSByZXN1bHQgPSBjcmVhdGVEaWN0KCk7XG4gIHJldHVybiBQcm9wZXJ0aWVzID09PSB1bmRlZmluZWQgPyByZXN1bHQgOiBfb2JqZWN0RHBzKHJlc3VsdCwgUHJvcGVydGllcyk7XG59O1xuXG52YXIgX3drcyA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUpIHtcbnZhciBzdG9yZSA9IF9zaGFyZWQoJ3drcycpO1xuXG52YXIgU3ltYm9sID0gX2dsb2JhbC5TeW1ib2w7XG52YXIgVVNFX1NZTUJPTCA9IHR5cGVvZiBTeW1ib2wgPT0gJ2Z1bmN0aW9uJztcblxudmFyICRleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobmFtZSkge1xuICByZXR1cm4gc3RvcmVbbmFtZV0gfHwgKHN0b3JlW25hbWVdID1cbiAgICBVU0VfU1lNQk9MICYmIFN5bWJvbFtuYW1lXSB8fCAoVVNFX1NZTUJPTCA/IFN5bWJvbCA6IF91aWQpKCdTeW1ib2wuJyArIG5hbWUpKTtcbn07XG5cbiRleHBvcnRzLnN0b3JlID0gc3RvcmU7XG59KTtcblxudmFyIGRlZiA9IF9vYmplY3REcC5mO1xuXG52YXIgVEFHID0gX3drcygndG9TdHJpbmdUYWcnKTtcblxudmFyIF9zZXRUb1N0cmluZ1RhZyA9IGZ1bmN0aW9uIChpdCwgdGFnLCBzdGF0KSB7XG4gIGlmIChpdCAmJiAhX2hhcyhpdCA9IHN0YXQgPyBpdCA6IGl0LnByb3RvdHlwZSwgVEFHKSkgZGVmKGl0LCBUQUcsIHsgY29uZmlndXJhYmxlOiB0cnVlLCB2YWx1ZTogdGFnIH0pO1xufTtcblxudmFyIEl0ZXJhdG9yUHJvdG90eXBlID0ge307XG5cbi8vIDI1LjEuMi4xLjEgJUl0ZXJhdG9yUHJvdG90eXBlJVtAQGl0ZXJhdG9yXSgpXG5faGlkZShJdGVyYXRvclByb3RvdHlwZSwgX3drcygnaXRlcmF0b3InKSwgZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSk7XG5cbnZhciBfaXRlckNyZWF0ZSA9IGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgTkFNRSwgbmV4dCkge1xuICBDb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBfb2JqZWN0Q3JlYXRlKEl0ZXJhdG9yUHJvdG90eXBlLCB7IG5leHQ6IF9wcm9wZXJ0eURlc2MoMSwgbmV4dCkgfSk7XG4gIF9zZXRUb1N0cmluZ1RhZyhDb25zdHJ1Y3RvciwgTkFNRSArICcgSXRlcmF0b3InKTtcbn07XG5cbi8vIDcuMS4xMyBUb09iamVjdChhcmd1bWVudClcblxudmFyIF90b09iamVjdCA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gT2JqZWN0KF9kZWZpbmVkKGl0KSk7XG59O1xuXG4vLyAxOS4xLjIuOSAvIDE1LjIuMy4yIE9iamVjdC5nZXRQcm90b3R5cGVPZihPKVxuXG5cbnZhciBJRV9QUk9UTyQyID0gX3NoYXJlZEtleSgnSUVfUFJPVE8nKTtcbnZhciBPYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbnZhciBfb2JqZWN0R3BvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mIHx8IGZ1bmN0aW9uIChPKSB7XG4gIE8gPSBfdG9PYmplY3QoTyk7XG4gIGlmIChfaGFzKE8sIElFX1BST1RPJDIpKSByZXR1cm4gT1tJRV9QUk9UTyQyXTtcbiAgaWYgKHR5cGVvZiBPLmNvbnN0cnVjdG9yID09ICdmdW5jdGlvbicgJiYgTyBpbnN0YW5jZW9mIE8uY29uc3RydWN0b3IpIHtcbiAgICByZXR1cm4gTy5jb25zdHJ1Y3Rvci5wcm90b3R5cGU7XG4gIH0gcmV0dXJuIE8gaW5zdGFuY2VvZiBPYmplY3QgPyBPYmplY3RQcm90byA6IG51bGw7XG59O1xuXG52YXIgSVRFUkFUT1IgPSBfd2tzKCdpdGVyYXRvcicpO1xudmFyIEJVR0dZID0gIShbXS5rZXlzICYmICduZXh0JyBpbiBbXS5rZXlzKCkpOyAvLyBTYWZhcmkgaGFzIGJ1Z2d5IGl0ZXJhdG9ycyB3L28gYG5leHRgXG52YXIgRkZfSVRFUkFUT1IgPSAnQEBpdGVyYXRvcic7XG52YXIgS0VZUyA9ICdrZXlzJztcbnZhciBWQUxVRVMgPSAndmFsdWVzJztcblxudmFyIHJldHVyblRoaXMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9O1xuXG52YXIgX2l0ZXJEZWZpbmUgPSBmdW5jdGlvbiAoQmFzZSwgTkFNRSwgQ29uc3RydWN0b3IsIG5leHQsIERFRkFVTFQsIElTX1NFVCwgRk9SQ0VEKSB7XG4gIF9pdGVyQ3JlYXRlKENvbnN0cnVjdG9yLCBOQU1FLCBuZXh0KTtcbiAgdmFyIGdldE1ldGhvZCA9IGZ1bmN0aW9uIChraW5kKSB7XG4gICAgaWYgKCFCVUdHWSAmJiBraW5kIGluIHByb3RvKSByZXR1cm4gcHJvdG9ba2luZF07XG4gICAgc3dpdGNoIChraW5kKSB7XG4gICAgICBjYXNlIEtFWVM6IHJldHVybiBmdW5jdGlvbiBrZXlzKCkgeyByZXR1cm4gbmV3IENvbnN0cnVjdG9yKHRoaXMsIGtpbmQpOyB9O1xuICAgICAgY2FzZSBWQUxVRVM6IHJldHVybiBmdW5jdGlvbiB2YWx1ZXMoKSB7IHJldHVybiBuZXcgQ29uc3RydWN0b3IodGhpcywga2luZCk7IH07XG4gICAgfSByZXR1cm4gZnVuY3Rpb24gZW50cmllcygpIHsgcmV0dXJuIG5ldyBDb25zdHJ1Y3Rvcih0aGlzLCBraW5kKTsgfTtcbiAgfTtcbiAgdmFyIFRBRyA9IE5BTUUgKyAnIEl0ZXJhdG9yJztcbiAgdmFyIERFRl9WQUxVRVMgPSBERUZBVUxUID09IFZBTFVFUztcbiAgdmFyIFZBTFVFU19CVUcgPSBmYWxzZTtcbiAgdmFyIHByb3RvID0gQmFzZS5wcm90b3R5cGU7XG4gIHZhciAkbmF0aXZlID0gcHJvdG9bSVRFUkFUT1JdIHx8IHByb3RvW0ZGX0lURVJBVE9SXSB8fCBERUZBVUxUICYmIHByb3RvW0RFRkFVTFRdO1xuICB2YXIgJGRlZmF1bHQgPSAkbmF0aXZlIHx8IGdldE1ldGhvZChERUZBVUxUKTtcbiAgdmFyICRlbnRyaWVzID0gREVGQVVMVCA/ICFERUZfVkFMVUVTID8gJGRlZmF1bHQgOiBnZXRNZXRob2QoJ2VudHJpZXMnKSA6IHVuZGVmaW5lZDtcbiAgdmFyICRhbnlOYXRpdmUgPSBOQU1FID09ICdBcnJheScgPyBwcm90by5lbnRyaWVzIHx8ICRuYXRpdmUgOiAkbmF0aXZlO1xuICB2YXIgbWV0aG9kcywga2V5LCBJdGVyYXRvclByb3RvdHlwZTtcbiAgLy8gRml4IG5hdGl2ZVxuICBpZiAoJGFueU5hdGl2ZSkge1xuICAgIEl0ZXJhdG9yUHJvdG90eXBlID0gX29iamVjdEdwbygkYW55TmF0aXZlLmNhbGwobmV3IEJhc2UoKSkpO1xuICAgIGlmIChJdGVyYXRvclByb3RvdHlwZSAhPT0gT2JqZWN0LnByb3RvdHlwZSAmJiBJdGVyYXRvclByb3RvdHlwZS5uZXh0KSB7XG4gICAgICAvLyBTZXQgQEB0b1N0cmluZ1RhZyB0byBuYXRpdmUgaXRlcmF0b3JzXG4gICAgICBfc2V0VG9TdHJpbmdUYWcoSXRlcmF0b3JQcm90b3R5cGUsIFRBRywgdHJ1ZSk7XG4gICAgICAvLyBmaXggZm9yIHNvbWUgb2xkIGVuZ2luZXNcbiAgICAgIGlmICghX2xpYnJhcnkgJiYgdHlwZW9mIEl0ZXJhdG9yUHJvdG90eXBlW0lURVJBVE9SXSAhPSAnZnVuY3Rpb24nKSBfaGlkZShJdGVyYXRvclByb3RvdHlwZSwgSVRFUkFUT1IsIHJldHVyblRoaXMpO1xuICAgIH1cbiAgfVxuICAvLyBmaXggQXJyYXkje3ZhbHVlcywgQEBpdGVyYXRvcn0ubmFtZSBpbiBWOCAvIEZGXG4gIGlmIChERUZfVkFMVUVTICYmICRuYXRpdmUgJiYgJG5hdGl2ZS5uYW1lICE9PSBWQUxVRVMpIHtcbiAgICBWQUxVRVNfQlVHID0gdHJ1ZTtcbiAgICAkZGVmYXVsdCA9IGZ1bmN0aW9uIHZhbHVlcygpIHsgcmV0dXJuICRuYXRpdmUuY2FsbCh0aGlzKTsgfTtcbiAgfVxuICAvLyBEZWZpbmUgaXRlcmF0b3JcbiAgaWYgKCghX2xpYnJhcnkgfHwgRk9SQ0VEKSAmJiAoQlVHR1kgfHwgVkFMVUVTX0JVRyB8fCAhcHJvdG9bSVRFUkFUT1JdKSkge1xuICAgIF9oaWRlKHByb3RvLCBJVEVSQVRPUiwgJGRlZmF1bHQpO1xuICB9XG4gIC8vIFBsdWcgZm9yIGxpYnJhcnlcbiAgX2l0ZXJhdG9yc1tOQU1FXSA9ICRkZWZhdWx0O1xuICBfaXRlcmF0b3JzW1RBR10gPSByZXR1cm5UaGlzO1xuICBpZiAoREVGQVVMVCkge1xuICAgIG1ldGhvZHMgPSB7XG4gICAgICB2YWx1ZXM6IERFRl9WQUxVRVMgPyAkZGVmYXVsdCA6IGdldE1ldGhvZChWQUxVRVMpLFxuICAgICAga2V5czogSVNfU0VUID8gJGRlZmF1bHQgOiBnZXRNZXRob2QoS0VZUyksXG4gICAgICBlbnRyaWVzOiAkZW50cmllc1xuICAgIH07XG4gICAgaWYgKEZPUkNFRCkgZm9yIChrZXkgaW4gbWV0aG9kcykge1xuICAgICAgaWYgKCEoa2V5IGluIHByb3RvKSkgX3JlZGVmaW5lKHByb3RvLCBrZXksIG1ldGhvZHNba2V5XSk7XG4gICAgfSBlbHNlIF9leHBvcnQoX2V4cG9ydC5QICsgX2V4cG9ydC5GICogKEJVR0dZIHx8IFZBTFVFU19CVUcpLCBOQU1FLCBtZXRob2RzKTtcbiAgfVxuICByZXR1cm4gbWV0aG9kcztcbn07XG5cbnZhciAkYXQgPSBfc3RyaW5nQXQodHJ1ZSk7XG5cbi8vIDIxLjEuMy4yNyBTdHJpbmcucHJvdG90eXBlW0BAaXRlcmF0b3JdKClcbl9pdGVyRGVmaW5lKFN0cmluZywgJ1N0cmluZycsIGZ1bmN0aW9uIChpdGVyYXRlZCkge1xuICB0aGlzLl90ID0gU3RyaW5nKGl0ZXJhdGVkKTsgLy8gdGFyZ2V0XG4gIHRoaXMuX2kgPSAwOyAgICAgICAgICAgICAgICAvLyBuZXh0IGluZGV4XG4vLyAyMS4xLjUuMi4xICVTdHJpbmdJdGVyYXRvclByb3RvdHlwZSUubmV4dCgpXG59LCBmdW5jdGlvbiAoKSB7XG4gIHZhciBPID0gdGhpcy5fdDtcbiAgdmFyIGluZGV4ID0gdGhpcy5faTtcbiAgdmFyIHBvaW50O1xuICBpZiAoaW5kZXggPj0gTy5sZW5ndGgpIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgcG9pbnQgPSAkYXQoTywgaW5kZXgpO1xuICB0aGlzLl9pICs9IHBvaW50Lmxlbmd0aDtcbiAgcmV0dXJuIHsgdmFsdWU6IHBvaW50LCBkb25lOiBmYWxzZSB9O1xufSk7XG5cbnZhciBfaXRlclN0ZXAgPSBmdW5jdGlvbiAoZG9uZSwgdmFsdWUpIHtcbiAgcmV0dXJuIHsgdmFsdWU6IHZhbHVlLCBkb25lOiAhIWRvbmUgfTtcbn07XG5cbi8vIDIyLjEuMy40IEFycmF5LnByb3RvdHlwZS5lbnRyaWVzKClcbi8vIDIyLjEuMy4xMyBBcnJheS5wcm90b3R5cGUua2V5cygpXG4vLyAyMi4xLjMuMjkgQXJyYXkucHJvdG90eXBlLnZhbHVlcygpXG4vLyAyMi4xLjMuMzAgQXJyYXkucHJvdG90eXBlW0BAaXRlcmF0b3JdKClcbnZhciBlczZfYXJyYXlfaXRlcmF0b3IgPSBfaXRlckRlZmluZShBcnJheSwgJ0FycmF5JywgZnVuY3Rpb24gKGl0ZXJhdGVkLCBraW5kKSB7XG4gIHRoaXMuX3QgPSBfdG9Jb2JqZWN0KGl0ZXJhdGVkKTsgLy8gdGFyZ2V0XG4gIHRoaXMuX2kgPSAwOyAgICAgICAgICAgICAgICAgICAvLyBuZXh0IGluZGV4XG4gIHRoaXMuX2sgPSBraW5kOyAgICAgICAgICAgICAgICAvLyBraW5kXG4vLyAyMi4xLjUuMi4xICVBcnJheUl0ZXJhdG9yUHJvdG90eXBlJS5uZXh0KClcbn0sIGZ1bmN0aW9uICgpIHtcbiAgdmFyIE8gPSB0aGlzLl90O1xuICB2YXIga2luZCA9IHRoaXMuX2s7XG4gIHZhciBpbmRleCA9IHRoaXMuX2krKztcbiAgaWYgKCFPIHx8IGluZGV4ID49IE8ubGVuZ3RoKSB7XG4gICAgdGhpcy5fdCA9IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gX2l0ZXJTdGVwKDEpO1xuICB9XG4gIGlmIChraW5kID09ICdrZXlzJykgcmV0dXJuIF9pdGVyU3RlcCgwLCBpbmRleCk7XG4gIGlmIChraW5kID09ICd2YWx1ZXMnKSByZXR1cm4gX2l0ZXJTdGVwKDAsIE9baW5kZXhdKTtcbiAgcmV0dXJuIF9pdGVyU3RlcCgwLCBbaW5kZXgsIE9baW5kZXhdXSk7XG59LCAndmFsdWVzJyk7XG5cbi8vIGFyZ3VtZW50c0xpc3RbQEBpdGVyYXRvcl0gaXMgJUFycmF5UHJvdG9fdmFsdWVzJSAoOS40LjQuNiwgOS40LjQuNylcbl9pdGVyYXRvcnMuQXJndW1lbnRzID0gX2l0ZXJhdG9ycy5BcnJheTtcblxudmFyIFRPX1NUUklOR19UQUcgPSBfd2tzKCd0b1N0cmluZ1RhZycpO1xuXG52YXIgRE9NSXRlcmFibGVzID0gKCdDU1NSdWxlTGlzdCxDU1NTdHlsZURlY2xhcmF0aW9uLENTU1ZhbHVlTGlzdCxDbGllbnRSZWN0TGlzdCxET01SZWN0TGlzdCxET01TdHJpbmdMaXN0LCcgK1xuICAnRE9NVG9rZW5MaXN0LERhdGFUcmFuc2Zlckl0ZW1MaXN0LEZpbGVMaXN0LEhUTUxBbGxDb2xsZWN0aW9uLEhUTUxDb2xsZWN0aW9uLEhUTUxGb3JtRWxlbWVudCxIVE1MU2VsZWN0RWxlbWVudCwnICtcbiAgJ01lZGlhTGlzdCxNaW1lVHlwZUFycmF5LE5hbWVkTm9kZU1hcCxOb2RlTGlzdCxQYWludFJlcXVlc3RMaXN0LFBsdWdpbixQbHVnaW5BcnJheSxTVkdMZW5ndGhMaXN0LFNWR051bWJlckxpc3QsJyArXG4gICdTVkdQYXRoU2VnTGlzdCxTVkdQb2ludExpc3QsU1ZHU3RyaW5nTGlzdCxTVkdUcmFuc2Zvcm1MaXN0LFNvdXJjZUJ1ZmZlckxpc3QsU3R5bGVTaGVldExpc3QsVGV4dFRyYWNrQ3VlTGlzdCwnICtcbiAgJ1RleHRUcmFja0xpc3QsVG91Y2hMaXN0Jykuc3BsaXQoJywnKTtcblxuZm9yICh2YXIgaSA9IDA7IGkgPCBET01JdGVyYWJsZXMubGVuZ3RoOyBpKyspIHtcbiAgdmFyIE5BTUUgPSBET01JdGVyYWJsZXNbaV07XG4gIHZhciBDb2xsZWN0aW9uID0gX2dsb2JhbFtOQU1FXTtcbiAgdmFyIHByb3RvID0gQ29sbGVjdGlvbiAmJiBDb2xsZWN0aW9uLnByb3RvdHlwZTtcbiAgaWYgKHByb3RvICYmICFwcm90b1tUT19TVFJJTkdfVEFHXSkgX2hpZGUocHJvdG8sIFRPX1NUUklOR19UQUcsIE5BTUUpO1xuICBfaXRlcmF0b3JzW05BTUVdID0gX2l0ZXJhdG9ycy5BcnJheTtcbn1cblxuLy8gZ2V0dGluZyB0YWcgZnJvbSAxOS4xLjMuNiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nKClcblxudmFyIFRBRyQxID0gX3drcygndG9TdHJpbmdUYWcnKTtcbi8vIEVTMyB3cm9uZyBoZXJlXG52YXIgQVJHID0gX2NvZihmdW5jdGlvbiAoKSB7IHJldHVybiBhcmd1bWVudHM7IH0oKSkgPT0gJ0FyZ3VtZW50cyc7XG5cbi8vIGZhbGxiYWNrIGZvciBJRTExIFNjcmlwdCBBY2Nlc3MgRGVuaWVkIGVycm9yXG52YXIgdHJ5R2V0ID0gZnVuY3Rpb24gKGl0LCBrZXkpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gaXRba2V5XTtcbiAgfSBjYXRjaCAoZSkgeyAvKiBlbXB0eSAqLyB9XG59O1xuXG52YXIgX2NsYXNzb2YgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIE8sIFQsIEI7XG4gIHJldHVybiBpdCA9PT0gdW5kZWZpbmVkID8gJ1VuZGVmaW5lZCcgOiBpdCA9PT0gbnVsbCA/ICdOdWxsJ1xuICAgIC8vIEBAdG9TdHJpbmdUYWcgY2FzZVxuICAgIDogdHlwZW9mIChUID0gdHJ5R2V0KE8gPSBPYmplY3QoaXQpLCBUQUckMSkpID09ICdzdHJpbmcnID8gVFxuICAgIC8vIGJ1aWx0aW5UYWcgY2FzZVxuICAgIDogQVJHID8gX2NvZihPKVxuICAgIC8vIEVTMyBhcmd1bWVudHMgZmFsbGJhY2tcbiAgICA6IChCID0gX2NvZihPKSkgPT0gJ09iamVjdCcgJiYgdHlwZW9mIE8uY2FsbGVlID09ICdmdW5jdGlvbicgPyAnQXJndW1lbnRzJyA6IEI7XG59O1xuXG52YXIgX2FuSW5zdGFuY2UgPSBmdW5jdGlvbiAoaXQsIENvbnN0cnVjdG9yLCBuYW1lLCBmb3JiaWRkZW5GaWVsZCkge1xuICBpZiAoIShpdCBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSB8fCAoZm9yYmlkZGVuRmllbGQgIT09IHVuZGVmaW5lZCAmJiBmb3JiaWRkZW5GaWVsZCBpbiBpdCkpIHtcbiAgICB0aHJvdyBUeXBlRXJyb3IobmFtZSArICc6IGluY29ycmVjdCBpbnZvY2F0aW9uIScpO1xuICB9IHJldHVybiBpdDtcbn07XG5cbi8vIGNhbGwgc29tZXRoaW5nIG9uIGl0ZXJhdG9yIHN0ZXAgd2l0aCBzYWZlIGNsb3Npbmcgb24gZXJyb3JcblxudmFyIF9pdGVyQ2FsbCA9IGZ1bmN0aW9uIChpdGVyYXRvciwgZm4sIHZhbHVlLCBlbnRyaWVzKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGVudHJpZXMgPyBmbihfYW5PYmplY3QodmFsdWUpWzBdLCB2YWx1ZVsxXSkgOiBmbih2YWx1ZSk7XG4gIC8vIDcuNC42IEl0ZXJhdG9yQ2xvc2UoaXRlcmF0b3IsIGNvbXBsZXRpb24pXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB2YXIgcmV0ID0gaXRlcmF0b3JbJ3JldHVybiddO1xuICAgIGlmIChyZXQgIT09IHVuZGVmaW5lZCkgX2FuT2JqZWN0KHJldC5jYWxsKGl0ZXJhdG9yKSk7XG4gICAgdGhyb3cgZTtcbiAgfVxufTtcblxuLy8gY2hlY2sgb24gZGVmYXVsdCBBcnJheSBpdGVyYXRvclxuXG52YXIgSVRFUkFUT1IkMSA9IF93a3MoJ2l0ZXJhdG9yJyk7XG52YXIgQXJyYXlQcm90byA9IEFycmF5LnByb3RvdHlwZTtcblxudmFyIF9pc0FycmF5SXRlciA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXQgIT09IHVuZGVmaW5lZCAmJiAoX2l0ZXJhdG9ycy5BcnJheSA9PT0gaXQgfHwgQXJyYXlQcm90b1tJVEVSQVRPUiQxXSA9PT0gaXQpO1xufTtcblxudmFyIElURVJBVE9SJDIgPSBfd2tzKCdpdGVyYXRvcicpO1xuXG52YXIgY29yZV9nZXRJdGVyYXRvck1ldGhvZCA9IF9jb3JlLmdldEl0ZXJhdG9yTWV0aG9kID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmIChpdCAhPSB1bmRlZmluZWQpIHJldHVybiBpdFtJVEVSQVRPUiQyXVxuICAgIHx8IGl0WydAQGl0ZXJhdG9yJ11cbiAgICB8fCBfaXRlcmF0b3JzW19jbGFzc29mKGl0KV07XG59O1xuXG52YXIgX2Zvck9mID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSkge1xudmFyIEJSRUFLID0ge307XG52YXIgUkVUVVJOID0ge307XG52YXIgZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0ZXJhYmxlLCBlbnRyaWVzLCBmbiwgdGhhdCwgSVRFUkFUT1IpIHtcbiAgdmFyIGl0ZXJGbiA9IElURVJBVE9SID8gZnVuY3Rpb24gKCkgeyByZXR1cm4gaXRlcmFibGU7IH0gOiBjb3JlX2dldEl0ZXJhdG9yTWV0aG9kKGl0ZXJhYmxlKTtcbiAgdmFyIGYgPSBfY3R4KGZuLCB0aGF0LCBlbnRyaWVzID8gMiA6IDEpO1xuICB2YXIgaW5kZXggPSAwO1xuICB2YXIgbGVuZ3RoLCBzdGVwLCBpdGVyYXRvciwgcmVzdWx0O1xuICBpZiAodHlwZW9mIGl0ZXJGbiAhPSAnZnVuY3Rpb24nKSB0aHJvdyBUeXBlRXJyb3IoaXRlcmFibGUgKyAnIGlzIG5vdCBpdGVyYWJsZSEnKTtcbiAgLy8gZmFzdCBjYXNlIGZvciBhcnJheXMgd2l0aCBkZWZhdWx0IGl0ZXJhdG9yXG4gIGlmIChfaXNBcnJheUl0ZXIoaXRlckZuKSkgZm9yIChsZW5ndGggPSBfdG9MZW5ndGgoaXRlcmFibGUubGVuZ3RoKTsgbGVuZ3RoID4gaW5kZXg7IGluZGV4KyspIHtcbiAgICByZXN1bHQgPSBlbnRyaWVzID8gZihfYW5PYmplY3Qoc3RlcCA9IGl0ZXJhYmxlW2luZGV4XSlbMF0sIHN0ZXBbMV0pIDogZihpdGVyYWJsZVtpbmRleF0pO1xuICAgIGlmIChyZXN1bHQgPT09IEJSRUFLIHx8IHJlc3VsdCA9PT0gUkVUVVJOKSByZXR1cm4gcmVzdWx0O1xuICB9IGVsc2UgZm9yIChpdGVyYXRvciA9IGl0ZXJGbi5jYWxsKGl0ZXJhYmxlKTsgIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lOykge1xuICAgIHJlc3VsdCA9IF9pdGVyQ2FsbChpdGVyYXRvciwgZiwgc3RlcC52YWx1ZSwgZW50cmllcyk7XG4gICAgaWYgKHJlc3VsdCA9PT0gQlJFQUsgfHwgcmVzdWx0ID09PSBSRVRVUk4pIHJldHVybiByZXN1bHQ7XG4gIH1cbn07XG5leHBvcnRzLkJSRUFLID0gQlJFQUs7XG5leHBvcnRzLlJFVFVSTiA9IFJFVFVSTjtcbn0pO1xuXG4vLyA3LjMuMjAgU3BlY2llc0NvbnN0cnVjdG9yKE8sIGRlZmF1bHRDb25zdHJ1Y3RvcilcblxuXG52YXIgU1BFQ0lFUyA9IF93a3MoJ3NwZWNpZXMnKTtcbnZhciBfc3BlY2llc0NvbnN0cnVjdG9yID0gZnVuY3Rpb24gKE8sIEQpIHtcbiAgdmFyIEMgPSBfYW5PYmplY3QoTykuY29uc3RydWN0b3I7XG4gIHZhciBTO1xuICByZXR1cm4gQyA9PT0gdW5kZWZpbmVkIHx8IChTID0gX2FuT2JqZWN0KEMpW1NQRUNJRVNdKSA9PSB1bmRlZmluZWQgPyBEIDogX2FGdW5jdGlvbihTKTtcbn07XG5cbi8vIGZhc3QgYXBwbHksIGh0dHA6Ly9qc3BlcmYubG5raXQuY29tL2Zhc3QtYXBwbHkvNVxudmFyIF9pbnZva2UgPSBmdW5jdGlvbiAoZm4sIGFyZ3MsIHRoYXQpIHtcbiAgdmFyIHVuID0gdGhhdCA9PT0gdW5kZWZpbmVkO1xuICBzd2l0Y2ggKGFyZ3MubGVuZ3RoKSB7XG4gICAgY2FzZSAwOiByZXR1cm4gdW4gPyBmbigpXG4gICAgICAgICAgICAgICAgICAgICAgOiBmbi5jYWxsKHRoYXQpO1xuICAgIGNhc2UgMTogcmV0dXJuIHVuID8gZm4oYXJnc1swXSlcbiAgICAgICAgICAgICAgICAgICAgICA6IGZuLmNhbGwodGhhdCwgYXJnc1swXSk7XG4gICAgY2FzZSAyOiByZXR1cm4gdW4gPyBmbihhcmdzWzBdLCBhcmdzWzFdKVxuICAgICAgICAgICAgICAgICAgICAgIDogZm4uY2FsbCh0aGF0LCBhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICBjYXNlIDM6IHJldHVybiB1biA/IGZuKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pXG4gICAgICAgICAgICAgICAgICAgICAgOiBmbi5jYWxsKHRoYXQsIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pO1xuICAgIGNhc2UgNDogcmV0dXJuIHVuID8gZm4oYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSlcbiAgICAgICAgICAgICAgICAgICAgICA6IGZuLmNhbGwodGhhdCwgYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSk7XG4gIH0gcmV0dXJuIGZuLmFwcGx5KHRoYXQsIGFyZ3MpO1xufTtcblxudmFyIHByb2Nlc3MgPSBfZ2xvYmFsLnByb2Nlc3M7XG52YXIgc2V0VGFzayA9IF9nbG9iYWwuc2V0SW1tZWRpYXRlO1xudmFyIGNsZWFyVGFzayA9IF9nbG9iYWwuY2xlYXJJbW1lZGlhdGU7XG52YXIgTWVzc2FnZUNoYW5uZWwgPSBfZ2xvYmFsLk1lc3NhZ2VDaGFubmVsO1xudmFyIERpc3BhdGNoID0gX2dsb2JhbC5EaXNwYXRjaDtcbnZhciBjb3VudGVyID0gMDtcbnZhciBxdWV1ZSA9IHt9O1xudmFyIE9OUkVBRFlTVEFURUNIQU5HRSA9ICdvbnJlYWR5c3RhdGVjaGFuZ2UnO1xudmFyIGRlZmVyLCBjaGFubmVsLCBwb3J0O1xudmFyIHJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGlkID0gK3RoaXM7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgaWYgKHF1ZXVlLmhhc093blByb3BlcnR5KGlkKSkge1xuICAgIHZhciBmbiA9IHF1ZXVlW2lkXTtcbiAgICBkZWxldGUgcXVldWVbaWRdO1xuICAgIGZuKCk7XG4gIH1cbn07XG52YXIgbGlzdGVuZXIgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgcnVuLmNhbGwoZXZlbnQuZGF0YSk7XG59O1xuLy8gTm9kZS5qcyAwLjkrICYgSUUxMCsgaGFzIHNldEltbWVkaWF0ZSwgb3RoZXJ3aXNlOlxuaWYgKCFzZXRUYXNrIHx8ICFjbGVhclRhc2spIHtcbiAgc2V0VGFzayA9IGZ1bmN0aW9uIHNldEltbWVkaWF0ZShmbikge1xuICAgIHZhciBhcmdzID0gW107XG4gICAgdmFyIGkgPSAxO1xuICAgIHdoaWxlIChhcmd1bWVudHMubGVuZ3RoID4gaSkgYXJncy5wdXNoKGFyZ3VtZW50c1tpKytdKTtcbiAgICBxdWV1ZVsrK2NvdW50ZXJdID0gZnVuY3Rpb24gKCkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ldy1mdW5jXG4gICAgICBfaW52b2tlKHR5cGVvZiBmbiA9PSAnZnVuY3Rpb24nID8gZm4gOiBGdW5jdGlvbihmbiksIGFyZ3MpO1xuICAgIH07XG4gICAgZGVmZXIoY291bnRlcik7XG4gICAgcmV0dXJuIGNvdW50ZXI7XG4gIH07XG4gIGNsZWFyVGFzayA9IGZ1bmN0aW9uIGNsZWFySW1tZWRpYXRlKGlkKSB7XG4gICAgZGVsZXRlIHF1ZXVlW2lkXTtcbiAgfTtcbiAgLy8gTm9kZS5qcyAwLjgtXG4gIGlmIChfY29mKHByb2Nlc3MpID09ICdwcm9jZXNzJykge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKF9jdHgocnVuLCBpZCwgMSkpO1xuICAgIH07XG4gIC8vIFNwaGVyZSAoSlMgZ2FtZSBlbmdpbmUpIERpc3BhdGNoIEFQSVxuICB9IGVsc2UgaWYgKERpc3BhdGNoICYmIERpc3BhdGNoLm5vdykge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBEaXNwYXRjaC5ub3coX2N0eChydW4sIGlkLCAxKSk7XG4gICAgfTtcbiAgLy8gQnJvd3NlcnMgd2l0aCBNZXNzYWdlQ2hhbm5lbCwgaW5jbHVkZXMgV2ViV29ya2Vyc1xuICB9IGVsc2UgaWYgKE1lc3NhZ2VDaGFubmVsKSB7XG4gICAgY2hhbm5lbCA9IG5ldyBNZXNzYWdlQ2hhbm5lbCgpO1xuICAgIHBvcnQgPSBjaGFubmVsLnBvcnQyO1xuICAgIGNoYW5uZWwucG9ydDEub25tZXNzYWdlID0gbGlzdGVuZXI7XG4gICAgZGVmZXIgPSBfY3R4KHBvcnQucG9zdE1lc3NhZ2UsIHBvcnQsIDEpO1xuICAvLyBCcm93c2VycyB3aXRoIHBvc3RNZXNzYWdlLCBza2lwIFdlYldvcmtlcnNcbiAgLy8gSUU4IGhhcyBwb3N0TWVzc2FnZSwgYnV0IGl0J3Mgc3luYyAmIHR5cGVvZiBpdHMgcG9zdE1lc3NhZ2UgaXMgJ29iamVjdCdcbiAgfSBlbHNlIGlmIChfZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIgJiYgdHlwZW9mIHBvc3RNZXNzYWdlID09ICdmdW5jdGlvbicgJiYgIV9nbG9iYWwuaW1wb3J0U2NyaXB0cykge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBfZ2xvYmFsLnBvc3RNZXNzYWdlKGlkICsgJycsICcqJyk7XG4gICAgfTtcbiAgICBfZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBsaXN0ZW5lciwgZmFsc2UpO1xuICAvLyBJRTgtXG4gIH0gZWxzZSBpZiAoT05SRUFEWVNUQVRFQ0hBTkdFIGluIF9kb21DcmVhdGUoJ3NjcmlwdCcpKSB7XG4gICAgZGVmZXIgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgIF9odG1sLmFwcGVuZENoaWxkKF9kb21DcmVhdGUoJ3NjcmlwdCcpKVtPTlJFQURZU1RBVEVDSEFOR0VdID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBfaHRtbC5yZW1vdmVDaGlsZCh0aGlzKTtcbiAgICAgICAgcnVuLmNhbGwoaWQpO1xuICAgICAgfTtcbiAgICB9O1xuICAvLyBSZXN0IG9sZCBicm93c2Vyc1xuICB9IGVsc2Uge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBzZXRUaW1lb3V0KF9jdHgocnVuLCBpZCwgMSksIDApO1xuICAgIH07XG4gIH1cbn1cbnZhciBfdGFzayA9IHtcbiAgc2V0OiBzZXRUYXNrLFxuICBjbGVhcjogY2xlYXJUYXNrXG59O1xuXG52YXIgbWFjcm90YXNrID0gX3Rhc2suc2V0O1xudmFyIE9ic2VydmVyID0gX2dsb2JhbC5NdXRhdGlvbk9ic2VydmVyIHx8IF9nbG9iYWwuV2ViS2l0TXV0YXRpb25PYnNlcnZlcjtcbnZhciBwcm9jZXNzJDEgPSBfZ2xvYmFsLnByb2Nlc3M7XG52YXIgUHJvbWlzZSQxID0gX2dsb2JhbC5Qcm9taXNlO1xudmFyIGlzTm9kZSA9IF9jb2YocHJvY2VzcyQxKSA9PSAncHJvY2Vzcyc7XG5cbnZhciBfbWljcm90YXNrID0gZnVuY3Rpb24gKCkge1xuICB2YXIgaGVhZCwgbGFzdCwgbm90aWZ5O1xuXG4gIHZhciBmbHVzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcGFyZW50LCBmbjtcbiAgICBpZiAoaXNOb2RlICYmIChwYXJlbnQgPSBwcm9jZXNzJDEuZG9tYWluKSkgcGFyZW50LmV4aXQoKTtcbiAgICB3aGlsZSAoaGVhZCkge1xuICAgICAgZm4gPSBoZWFkLmZuO1xuICAgICAgaGVhZCA9IGhlYWQubmV4dDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGZuKCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChoZWFkKSBub3RpZnkoKTtcbiAgICAgICAgZWxzZSBsYXN0ID0gdW5kZWZpbmVkO1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgIH0gbGFzdCA9IHVuZGVmaW5lZDtcbiAgICBpZiAocGFyZW50KSBwYXJlbnQuZW50ZXIoKTtcbiAgfTtcblxuICAvLyBOb2RlLmpzXG4gIGlmIChpc05vZGUpIHtcbiAgICBub3RpZnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBwcm9jZXNzJDEubmV4dFRpY2soZmx1c2gpO1xuICAgIH07XG4gIC8vIGJyb3dzZXJzIHdpdGggTXV0YXRpb25PYnNlcnZlciwgZXhjZXB0IGlPUyBTYWZhcmkgLSBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvMzM5XG4gIH0gZWxzZSBpZiAoT2JzZXJ2ZXIgJiYgIShfZ2xvYmFsLm5hdmlnYXRvciAmJiBfZ2xvYmFsLm5hdmlnYXRvci5zdGFuZGFsb25lKSkge1xuICAgIHZhciB0b2dnbGUgPSB0cnVlO1xuICAgIHZhciBub2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJycpO1xuICAgIG5ldyBPYnNlcnZlcihmbHVzaCkub2JzZXJ2ZShub2RlLCB7IGNoYXJhY3RlckRhdGE6IHRydWUgfSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgbm9kZS5kYXRhID0gdG9nZ2xlID0gIXRvZ2dsZTtcbiAgICB9O1xuICAvLyBlbnZpcm9ubWVudHMgd2l0aCBtYXliZSBub24tY29tcGxldGVseSBjb3JyZWN0LCBidXQgZXhpc3RlbnQgUHJvbWlzZVxuICB9IGVsc2UgaWYgKFByb21pc2UkMSAmJiBQcm9taXNlJDEucmVzb2x2ZSkge1xuICAgIC8vIFByb21pc2UucmVzb2x2ZSB3aXRob3V0IGFuIGFyZ3VtZW50IHRocm93cyBhbiBlcnJvciBpbiBMRyBXZWJPUyAyXG4gICAgdmFyIHByb21pc2UgPSBQcm9taXNlJDEucmVzb2x2ZSh1bmRlZmluZWQpO1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHByb21pc2UudGhlbihmbHVzaCk7XG4gICAgfTtcbiAgLy8gZm9yIG90aGVyIGVudmlyb25tZW50cyAtIG1hY3JvdGFzayBiYXNlZCBvbjpcbiAgLy8gLSBzZXRJbW1lZGlhdGVcbiAgLy8gLSBNZXNzYWdlQ2hhbm5lbFxuICAvLyAtIHdpbmRvdy5wb3N0TWVzc2FnXG4gIC8vIC0gb25yZWFkeXN0YXRlY2hhbmdlXG4gIC8vIC0gc2V0VGltZW91dFxuICB9IGVsc2Uge1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIHN0cmFuZ2UgSUUgKyB3ZWJwYWNrIGRldiBzZXJ2ZXIgYnVnIC0gdXNlIC5jYWxsKGdsb2JhbClcbiAgICAgIG1hY3JvdGFzay5jYWxsKF9nbG9iYWwsIGZsdXNoKTtcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChmbikge1xuICAgIHZhciB0YXNrID0geyBmbjogZm4sIG5leHQ6IHVuZGVmaW5lZCB9O1xuICAgIGlmIChsYXN0KSBsYXN0Lm5leHQgPSB0YXNrO1xuICAgIGlmICghaGVhZCkge1xuICAgICAgaGVhZCA9IHRhc2s7XG4gICAgICBub3RpZnkoKTtcbiAgICB9IGxhc3QgPSB0YXNrO1xuICB9O1xufTtcblxuLy8gMjUuNC4xLjUgTmV3UHJvbWlzZUNhcGFiaWxpdHkoQylcblxuXG5mdW5jdGlvbiBQcm9taXNlQ2FwYWJpbGl0eShDKSB7XG4gIHZhciByZXNvbHZlLCByZWplY3Q7XG4gIHRoaXMucHJvbWlzZSA9IG5ldyBDKGZ1bmN0aW9uICgkJHJlc29sdmUsICQkcmVqZWN0KSB7XG4gICAgaWYgKHJlc29sdmUgIT09IHVuZGVmaW5lZCB8fCByZWplY3QgIT09IHVuZGVmaW5lZCkgdGhyb3cgVHlwZUVycm9yKCdCYWQgUHJvbWlzZSBjb25zdHJ1Y3RvcicpO1xuICAgIHJlc29sdmUgPSAkJHJlc29sdmU7XG4gICAgcmVqZWN0ID0gJCRyZWplY3Q7XG4gIH0pO1xuICB0aGlzLnJlc29sdmUgPSBfYUZ1bmN0aW9uKHJlc29sdmUpO1xuICB0aGlzLnJlamVjdCA9IF9hRnVuY3Rpb24ocmVqZWN0KTtcbn1cblxudmFyIGYkMSA9IGZ1bmN0aW9uIChDKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZUNhcGFiaWxpdHkoQyk7XG59O1xuXG52YXIgX25ld1Byb21pc2VDYXBhYmlsaXR5ID0ge1xuXHRmOiBmJDFcbn07XG5cbnZhciBfcGVyZm9ybSA9IGZ1bmN0aW9uIChleGVjKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHsgZTogZmFsc2UsIHY6IGV4ZWMoKSB9O1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIHsgZTogdHJ1ZSwgdjogZSB9O1xuICB9XG59O1xuXG52YXIgbmF2aWdhdG9yID0gX2dsb2JhbC5uYXZpZ2F0b3I7XG5cbnZhciBfdXNlckFnZW50ID0gbmF2aWdhdG9yICYmIG5hdmlnYXRvci51c2VyQWdlbnQgfHwgJyc7XG5cbnZhciBfcHJvbWlzZVJlc29sdmUgPSBmdW5jdGlvbiAoQywgeCkge1xuICBfYW5PYmplY3QoQyk7XG4gIGlmIChfaXNPYmplY3QoeCkgJiYgeC5jb25zdHJ1Y3RvciA9PT0gQykgcmV0dXJuIHg7XG4gIHZhciBwcm9taXNlQ2FwYWJpbGl0eSA9IF9uZXdQcm9taXNlQ2FwYWJpbGl0eS5mKEMpO1xuICB2YXIgcmVzb2x2ZSA9IHByb21pc2VDYXBhYmlsaXR5LnJlc29sdmU7XG4gIHJlc29sdmUoeCk7XG4gIHJldHVybiBwcm9taXNlQ2FwYWJpbGl0eS5wcm9taXNlO1xufTtcblxudmFyIF9yZWRlZmluZUFsbCA9IGZ1bmN0aW9uICh0YXJnZXQsIHNyYywgc2FmZSkge1xuICBmb3IgKHZhciBrZXkgaW4gc3JjKSB7XG4gICAgaWYgKHNhZmUgJiYgdGFyZ2V0W2tleV0pIHRhcmdldFtrZXldID0gc3JjW2tleV07XG4gICAgZWxzZSBfaGlkZSh0YXJnZXQsIGtleSwgc3JjW2tleV0pO1xuICB9IHJldHVybiB0YXJnZXQ7XG59O1xuXG52YXIgU1BFQ0lFUyQxID0gX3drcygnc3BlY2llcycpO1xuXG52YXIgX3NldFNwZWNpZXMgPSBmdW5jdGlvbiAoS0VZKSB7XG4gIHZhciBDID0gdHlwZW9mIF9jb3JlW0tFWV0gPT0gJ2Z1bmN0aW9uJyA/IF9jb3JlW0tFWV0gOiBfZ2xvYmFsW0tFWV07XG4gIGlmIChfZGVzY3JpcHRvcnMgJiYgQyAmJiAhQ1tTUEVDSUVTJDFdKSBfb2JqZWN0RHAuZihDLCBTUEVDSUVTJDEsIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9XG4gIH0pO1xufTtcblxudmFyIElURVJBVE9SJDMgPSBfd2tzKCdpdGVyYXRvcicpO1xudmFyIFNBRkVfQ0xPU0lORyA9IGZhbHNlO1xuXG50cnkge1xuICB2YXIgcml0ZXIgPSBbN11bSVRFUkFUT1IkM10oKTtcbiAgcml0ZXJbJ3JldHVybiddID0gZnVuY3Rpb24gKCkgeyBTQUZFX0NMT1NJTkcgPSB0cnVlOyB9O1xufSBjYXRjaCAoZSkgeyAvKiBlbXB0eSAqLyB9XG5cbnZhciBfaXRlckRldGVjdCA9IGZ1bmN0aW9uIChleGVjLCBza2lwQ2xvc2luZykge1xuICBpZiAoIXNraXBDbG9zaW5nICYmICFTQUZFX0NMT1NJTkcpIHJldHVybiBmYWxzZTtcbiAgdmFyIHNhZmUgPSBmYWxzZTtcbiAgdHJ5IHtcbiAgICB2YXIgYXJyID0gWzddO1xuICAgIHZhciBpdGVyID0gYXJyW0lURVJBVE9SJDNdKCk7XG4gICAgaXRlci5uZXh0ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4geyBkb25lOiBzYWZlID0gdHJ1ZSB9OyB9O1xuICAgIGFycltJVEVSQVRPUiQzXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGl0ZXI7IH07XG4gICAgZXhlYyhhcnIpO1xuICB9IGNhdGNoIChlKSB7IC8qIGVtcHR5ICovIH1cbiAgcmV0dXJuIHNhZmU7XG59O1xuXG52YXIgdGFzayA9IF90YXNrLnNldDtcbnZhciBtaWNyb3Rhc2sgPSBfbWljcm90YXNrKCk7XG5cblxuXG5cbnZhciBQUk9NSVNFID0gJ1Byb21pc2UnO1xudmFyIFR5cGVFcnJvciQxID0gX2dsb2JhbC5UeXBlRXJyb3I7XG52YXIgcHJvY2VzcyQyID0gX2dsb2JhbC5wcm9jZXNzO1xudmFyIHZlcnNpb25zID0gcHJvY2VzcyQyICYmIHByb2Nlc3MkMi52ZXJzaW9ucztcbnZhciB2OCA9IHZlcnNpb25zICYmIHZlcnNpb25zLnY4IHx8ICcnO1xudmFyICRQcm9taXNlID0gX2dsb2JhbFtQUk9NSVNFXTtcbnZhciBpc05vZGUkMSA9IF9jbGFzc29mKHByb2Nlc3MkMikgPT0gJ3Byb2Nlc3MnO1xudmFyIGVtcHR5ID0gZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9O1xudmFyIEludGVybmFsLCBuZXdHZW5lcmljUHJvbWlzZUNhcGFiaWxpdHksIE93blByb21pc2VDYXBhYmlsaXR5LCBXcmFwcGVyO1xudmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5ID0gbmV3R2VuZXJpY1Byb21pc2VDYXBhYmlsaXR5ID0gX25ld1Byb21pc2VDYXBhYmlsaXR5LmY7XG5cbnZhciBVU0VfTkFUSVZFID0gISFmdW5jdGlvbiAoKSB7XG4gIHRyeSB7XG4gICAgLy8gY29ycmVjdCBzdWJjbGFzc2luZyB3aXRoIEBAc3BlY2llcyBzdXBwb3J0XG4gICAgdmFyIHByb21pc2UgPSAkUHJvbWlzZS5yZXNvbHZlKDEpO1xuICAgIHZhciBGYWtlUHJvbWlzZSA9IChwcm9taXNlLmNvbnN0cnVjdG9yID0ge30pW193a3MoJ3NwZWNpZXMnKV0gPSBmdW5jdGlvbiAoZXhlYykge1xuICAgICAgZXhlYyhlbXB0eSwgZW1wdHkpO1xuICAgIH07XG4gICAgLy8gdW5oYW5kbGVkIHJlamVjdGlvbnMgdHJhY2tpbmcgc3VwcG9ydCwgTm9kZUpTIFByb21pc2Ugd2l0aG91dCBpdCBmYWlscyBAQHNwZWNpZXMgdGVzdFxuICAgIHJldHVybiAoaXNOb2RlJDEgfHwgdHlwZW9mIFByb21pc2VSZWplY3Rpb25FdmVudCA9PSAnZnVuY3Rpb24nKVxuICAgICAgJiYgcHJvbWlzZS50aGVuKGVtcHR5KSBpbnN0YW5jZW9mIEZha2VQcm9taXNlXG4gICAgICAvLyB2OCA2LjYgKE5vZGUgMTAgYW5kIENocm9tZSA2NikgaGF2ZSBhIGJ1ZyB3aXRoIHJlc29sdmluZyBjdXN0b20gdGhlbmFibGVzXG4gICAgICAvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD04MzA1NjVcbiAgICAgIC8vIHdlIGNhbid0IGRldGVjdCBpdCBzeW5jaHJvbm91c2x5LCBzbyBqdXN0IGNoZWNrIHZlcnNpb25zXG4gICAgICAmJiB2OC5pbmRleE9mKCc2LjYnKSAhPT0gMFxuICAgICAgJiYgX3VzZXJBZ2VudC5pbmRleE9mKCdDaHJvbWUvNjYnKSA9PT0gLTE7XG4gIH0gY2F0Y2ggKGUpIHsgLyogZW1wdHkgKi8gfVxufSgpO1xuXG4vLyBoZWxwZXJzXG52YXIgaXNUaGVuYWJsZSA9IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgdGhlbjtcbiAgcmV0dXJuIF9pc09iamVjdChpdCkgJiYgdHlwZW9mICh0aGVuID0gaXQudGhlbikgPT0gJ2Z1bmN0aW9uJyA/IHRoZW4gOiBmYWxzZTtcbn07XG52YXIgbm90aWZ5ID0gZnVuY3Rpb24gKHByb21pc2UsIGlzUmVqZWN0KSB7XG4gIGlmIChwcm9taXNlLl9uKSByZXR1cm47XG4gIHByb21pc2UuX24gPSB0cnVlO1xuICB2YXIgY2hhaW4gPSBwcm9taXNlLl9jO1xuICBtaWNyb3Rhc2soZnVuY3Rpb24gKCkge1xuICAgIHZhciB2YWx1ZSA9IHByb21pc2UuX3Y7XG4gICAgdmFyIG9rID0gcHJvbWlzZS5fcyA9PSAxO1xuICAgIHZhciBpID0gMDtcbiAgICB2YXIgcnVuID0gZnVuY3Rpb24gKHJlYWN0aW9uKSB7XG4gICAgICB2YXIgaGFuZGxlciA9IG9rID8gcmVhY3Rpb24ub2sgOiByZWFjdGlvbi5mYWlsO1xuICAgICAgdmFyIHJlc29sdmUgPSByZWFjdGlvbi5yZXNvbHZlO1xuICAgICAgdmFyIHJlamVjdCA9IHJlYWN0aW9uLnJlamVjdDtcbiAgICAgIHZhciBkb21haW4gPSByZWFjdGlvbi5kb21haW47XG4gICAgICB2YXIgcmVzdWx0LCB0aGVuLCBleGl0ZWQ7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoaGFuZGxlcikge1xuICAgICAgICAgIGlmICghb2spIHtcbiAgICAgICAgICAgIGlmIChwcm9taXNlLl9oID09IDIpIG9uSGFuZGxlVW5oYW5kbGVkKHByb21pc2UpO1xuICAgICAgICAgICAgcHJvbWlzZS5faCA9IDE7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChoYW5kbGVyID09PSB0cnVlKSByZXN1bHQgPSB2YWx1ZTtcbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChkb21haW4pIGRvbWFpbi5lbnRlcigpO1xuICAgICAgICAgICAgcmVzdWx0ID0gaGFuZGxlcih2YWx1ZSk7IC8vIG1heSB0aHJvd1xuICAgICAgICAgICAgaWYgKGRvbWFpbikge1xuICAgICAgICAgICAgICBkb21haW4uZXhpdCgpO1xuICAgICAgICAgICAgICBleGl0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocmVzdWx0ID09PSByZWFjdGlvbi5wcm9taXNlKSB7XG4gICAgICAgICAgICByZWplY3QoVHlwZUVycm9yJDEoJ1Byb21pc2UtY2hhaW4gY3ljbGUnKSk7XG4gICAgICAgICAgfSBlbHNlIGlmICh0aGVuID0gaXNUaGVuYWJsZShyZXN1bHQpKSB7XG4gICAgICAgICAgICB0aGVuLmNhbGwocmVzdWx0LCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgIH0gZWxzZSByZXNvbHZlKHJlc3VsdCk7XG4gICAgICAgIH0gZWxzZSByZWplY3QodmFsdWUpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoZG9tYWluICYmICFleGl0ZWQpIGRvbWFpbi5leGl0KCk7XG4gICAgICAgIHJlamVjdChlKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHdoaWxlIChjaGFpbi5sZW5ndGggPiBpKSBydW4oY2hhaW5baSsrXSk7IC8vIHZhcmlhYmxlIGxlbmd0aCAtIGNhbid0IHVzZSBmb3JFYWNoXG4gICAgcHJvbWlzZS5fYyA9IFtdO1xuICAgIHByb21pc2UuX24gPSBmYWxzZTtcbiAgICBpZiAoaXNSZWplY3QgJiYgIXByb21pc2UuX2gpIG9uVW5oYW5kbGVkKHByb21pc2UpO1xuICB9KTtcbn07XG52YXIgb25VbmhhbmRsZWQgPSBmdW5jdGlvbiAocHJvbWlzZSkge1xuICB0YXNrLmNhbGwoX2dsb2JhbCwgZnVuY3Rpb24gKCkge1xuICAgIHZhciB2YWx1ZSA9IHByb21pc2UuX3Y7XG4gICAgdmFyIHVuaGFuZGxlZCA9IGlzVW5oYW5kbGVkKHByb21pc2UpO1xuICAgIHZhciByZXN1bHQsIGhhbmRsZXIsIGNvbnNvbGU7XG4gICAgaWYgKHVuaGFuZGxlZCkge1xuICAgICAgcmVzdWx0ID0gX3BlcmZvcm0oZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoaXNOb2RlJDEpIHtcbiAgICAgICAgICBwcm9jZXNzJDIuZW1pdCgndW5oYW5kbGVkUmVqZWN0aW9uJywgdmFsdWUsIHByb21pc2UpO1xuICAgICAgICB9IGVsc2UgaWYgKGhhbmRsZXIgPSBfZ2xvYmFsLm9udW5oYW5kbGVkcmVqZWN0aW9uKSB7XG4gICAgICAgICAgaGFuZGxlcih7IHByb21pc2U6IHByb21pc2UsIHJlYXNvbjogdmFsdWUgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoKGNvbnNvbGUgPSBfZ2xvYmFsLmNvbnNvbGUpICYmIGNvbnNvbGUuZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdVbmhhbmRsZWQgcHJvbWlzZSByZWplY3Rpb24nLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgLy8gQnJvd3NlcnMgc2hvdWxkIG5vdCB0cmlnZ2VyIGByZWplY3Rpb25IYW5kbGVkYCBldmVudCBpZiBpdCB3YXMgaGFuZGxlZCBoZXJlLCBOb2RlSlMgLSBzaG91bGRcbiAgICAgIHByb21pc2UuX2ggPSBpc05vZGUkMSB8fCBpc1VuaGFuZGxlZChwcm9taXNlKSA/IDIgOiAxO1xuICAgIH0gcHJvbWlzZS5fYSA9IHVuZGVmaW5lZDtcbiAgICBpZiAodW5oYW5kbGVkICYmIHJlc3VsdC5lKSB0aHJvdyByZXN1bHQudjtcbiAgfSk7XG59O1xudmFyIGlzVW5oYW5kbGVkID0gZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgcmV0dXJuIHByb21pc2UuX2ggIT09IDEgJiYgKHByb21pc2UuX2EgfHwgcHJvbWlzZS5fYykubGVuZ3RoID09PSAwO1xufTtcbnZhciBvbkhhbmRsZVVuaGFuZGxlZCA9IGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gIHRhc2suY2FsbChfZ2xvYmFsLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGhhbmRsZXI7XG4gICAgaWYgKGlzTm9kZSQxKSB7XG4gICAgICBwcm9jZXNzJDIuZW1pdCgncmVqZWN0aW9uSGFuZGxlZCcsIHByb21pc2UpO1xuICAgIH0gZWxzZSBpZiAoaGFuZGxlciA9IF9nbG9iYWwub25yZWplY3Rpb25oYW5kbGVkKSB7XG4gICAgICBoYW5kbGVyKHsgcHJvbWlzZTogcHJvbWlzZSwgcmVhc29uOiBwcm9taXNlLl92IH0pO1xuICAgIH1cbiAgfSk7XG59O1xudmFyICRyZWplY3QgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgdmFyIHByb21pc2UgPSB0aGlzO1xuICBpZiAocHJvbWlzZS5fZCkgcmV0dXJuO1xuICBwcm9taXNlLl9kID0gdHJ1ZTtcbiAgcHJvbWlzZSA9IHByb21pc2UuX3cgfHwgcHJvbWlzZTsgLy8gdW53cmFwXG4gIHByb21pc2UuX3YgPSB2YWx1ZTtcbiAgcHJvbWlzZS5fcyA9IDI7XG4gIGlmICghcHJvbWlzZS5fYSkgcHJvbWlzZS5fYSA9IHByb21pc2UuX2Muc2xpY2UoKTtcbiAgbm90aWZ5KHByb21pc2UsIHRydWUpO1xufTtcbnZhciAkcmVzb2x2ZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICB2YXIgcHJvbWlzZSA9IHRoaXM7XG4gIHZhciB0aGVuO1xuICBpZiAocHJvbWlzZS5fZCkgcmV0dXJuO1xuICBwcm9taXNlLl9kID0gdHJ1ZTtcbiAgcHJvbWlzZSA9IHByb21pc2UuX3cgfHwgcHJvbWlzZTsgLy8gdW53cmFwXG4gIHRyeSB7XG4gICAgaWYgKHByb21pc2UgPT09IHZhbHVlKSB0aHJvdyBUeXBlRXJyb3IkMShcIlByb21pc2UgY2FuJ3QgYmUgcmVzb2x2ZWQgaXRzZWxmXCIpO1xuICAgIGlmICh0aGVuID0gaXNUaGVuYWJsZSh2YWx1ZSkpIHtcbiAgICAgIG1pY3JvdGFzayhmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB3cmFwcGVyID0geyBfdzogcHJvbWlzZSwgX2Q6IGZhbHNlIH07IC8vIHdyYXBcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aGVuLmNhbGwodmFsdWUsIF9jdHgoJHJlc29sdmUsIHdyYXBwZXIsIDEpLCBfY3R4KCRyZWplY3QsIHdyYXBwZXIsIDEpKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICRyZWplY3QuY2FsbCh3cmFwcGVyLCBlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb21pc2UuX3YgPSB2YWx1ZTtcbiAgICAgIHByb21pc2UuX3MgPSAxO1xuICAgICAgbm90aWZ5KHByb21pc2UsIGZhbHNlKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAkcmVqZWN0LmNhbGwoeyBfdzogcHJvbWlzZSwgX2Q6IGZhbHNlIH0sIGUpOyAvLyB3cmFwXG4gIH1cbn07XG5cbi8vIGNvbnN0cnVjdG9yIHBvbHlmaWxsXG5pZiAoIVVTRV9OQVRJVkUpIHtcbiAgLy8gMjUuNC4zLjEgUHJvbWlzZShleGVjdXRvcilcbiAgJFByb21pc2UgPSBmdW5jdGlvbiBQcm9taXNlKGV4ZWN1dG9yKSB7XG4gICAgX2FuSW5zdGFuY2UodGhpcywgJFByb21pc2UsIFBST01JU0UsICdfaCcpO1xuICAgIF9hRnVuY3Rpb24oZXhlY3V0b3IpO1xuICAgIEludGVybmFsLmNhbGwodGhpcyk7XG4gICAgdHJ5IHtcbiAgICAgIGV4ZWN1dG9yKF9jdHgoJHJlc29sdmUsIHRoaXMsIDEpLCBfY3R4KCRyZWplY3QsIHRoaXMsIDEpKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICRyZWplY3QuY2FsbCh0aGlzLCBlcnIpO1xuICAgIH1cbiAgfTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gIEludGVybmFsID0gZnVuY3Rpb24gUHJvbWlzZShleGVjdXRvcikge1xuICAgIHRoaXMuX2MgPSBbXTsgICAgICAgICAgICAgLy8gPC0gYXdhaXRpbmcgcmVhY3Rpb25zXG4gICAgdGhpcy5fYSA9IHVuZGVmaW5lZDsgICAgICAvLyA8LSBjaGVja2VkIGluIGlzVW5oYW5kbGVkIHJlYWN0aW9uc1xuICAgIHRoaXMuX3MgPSAwOyAgICAgICAgICAgICAgLy8gPC0gc3RhdGVcbiAgICB0aGlzLl9kID0gZmFsc2U7ICAgICAgICAgIC8vIDwtIGRvbmVcbiAgICB0aGlzLl92ID0gdW5kZWZpbmVkOyAgICAgIC8vIDwtIHZhbHVlXG4gICAgdGhpcy5faCA9IDA7ICAgICAgICAgICAgICAvLyA8LSByZWplY3Rpb24gc3RhdGUsIDAgLSBkZWZhdWx0LCAxIC0gaGFuZGxlZCwgMiAtIHVuaGFuZGxlZFxuICAgIHRoaXMuX24gPSBmYWxzZTsgICAgICAgICAgLy8gPC0gbm90aWZ5XG4gIH07XG4gIEludGVybmFsLnByb3RvdHlwZSA9IF9yZWRlZmluZUFsbCgkUHJvbWlzZS5wcm90b3R5cGUsIHtcbiAgICAvLyAyNS40LjUuMyBQcm9taXNlLnByb3RvdHlwZS50aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKVxuICAgIHRoZW46IGZ1bmN0aW9uIHRoZW4ob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpIHtcbiAgICAgIHZhciByZWFjdGlvbiA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KF9zcGVjaWVzQ29uc3RydWN0b3IodGhpcywgJFByb21pc2UpKTtcbiAgICAgIHJlYWN0aW9uLm9rID0gdHlwZW9mIG9uRnVsZmlsbGVkID09ICdmdW5jdGlvbicgPyBvbkZ1bGZpbGxlZCA6IHRydWU7XG4gICAgICByZWFjdGlvbi5mYWlsID0gdHlwZW9mIG9uUmVqZWN0ZWQgPT0gJ2Z1bmN0aW9uJyAmJiBvblJlamVjdGVkO1xuICAgICAgcmVhY3Rpb24uZG9tYWluID0gaXNOb2RlJDEgPyBwcm9jZXNzJDIuZG9tYWluIDogdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fYy5wdXNoKHJlYWN0aW9uKTtcbiAgICAgIGlmICh0aGlzLl9hKSB0aGlzLl9hLnB1c2gocmVhY3Rpb24pO1xuICAgICAgaWYgKHRoaXMuX3MpIG5vdGlmeSh0aGlzLCBmYWxzZSk7XG4gICAgICByZXR1cm4gcmVhY3Rpb24ucHJvbWlzZTtcbiAgICB9LFxuICAgIC8vIDI1LjQuNS4xIFByb21pc2UucHJvdG90eXBlLmNhdGNoKG9uUmVqZWN0ZWQpXG4gICAgJ2NhdGNoJzogZnVuY3Rpb24gKG9uUmVqZWN0ZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLnRoZW4odW5kZWZpbmVkLCBvblJlamVjdGVkKTtcbiAgICB9XG4gIH0pO1xuICBPd25Qcm9taXNlQ2FwYWJpbGl0eSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcHJvbWlzZSA9IG5ldyBJbnRlcm5hbCgpO1xuICAgIHRoaXMucHJvbWlzZSA9IHByb21pc2U7XG4gICAgdGhpcy5yZXNvbHZlID0gX2N0eCgkcmVzb2x2ZSwgcHJvbWlzZSwgMSk7XG4gICAgdGhpcy5yZWplY3QgPSBfY3R4KCRyZWplY3QsIHByb21pc2UsIDEpO1xuICB9O1xuICBfbmV3UHJvbWlzZUNhcGFiaWxpdHkuZiA9IG5ld1Byb21pc2VDYXBhYmlsaXR5ID0gZnVuY3Rpb24gKEMpIHtcbiAgICByZXR1cm4gQyA9PT0gJFByb21pc2UgfHwgQyA9PT0gV3JhcHBlclxuICAgICAgPyBuZXcgT3duUHJvbWlzZUNhcGFiaWxpdHkoQylcbiAgICAgIDogbmV3R2VuZXJpY1Byb21pc2VDYXBhYmlsaXR5KEMpO1xuICB9O1xufVxuXG5fZXhwb3J0KF9leHBvcnQuRyArIF9leHBvcnQuVyArIF9leHBvcnQuRiAqICFVU0VfTkFUSVZFLCB7IFByb21pc2U6ICRQcm9taXNlIH0pO1xuX3NldFRvU3RyaW5nVGFnKCRQcm9taXNlLCBQUk9NSVNFKTtcbl9zZXRTcGVjaWVzKFBST01JU0UpO1xuV3JhcHBlciA9IF9jb3JlW1BST01JU0VdO1xuXG4vLyBzdGF0aWNzXG5fZXhwb3J0KF9leHBvcnQuUyArIF9leHBvcnQuRiAqICFVU0VfTkFUSVZFLCBQUk9NSVNFLCB7XG4gIC8vIDI1LjQuNC41IFByb21pc2UucmVqZWN0KHIpXG4gIHJlamVjdDogZnVuY3Rpb24gcmVqZWN0KHIpIHtcbiAgICB2YXIgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KHRoaXMpO1xuICAgIHZhciAkJHJlamVjdCA9IGNhcGFiaWxpdHkucmVqZWN0O1xuICAgICQkcmVqZWN0KHIpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbn0pO1xuX2V4cG9ydChfZXhwb3J0LlMgKyBfZXhwb3J0LkYgKiAoX2xpYnJhcnkgfHwgIVVTRV9OQVRJVkUpLCBQUk9NSVNFLCB7XG4gIC8vIDI1LjQuNC42IFByb21pc2UucmVzb2x2ZSh4KVxuICByZXNvbHZlOiBmdW5jdGlvbiByZXNvbHZlKHgpIHtcbiAgICByZXR1cm4gX3Byb21pc2VSZXNvbHZlKF9saWJyYXJ5ICYmIHRoaXMgPT09IFdyYXBwZXIgPyAkUHJvbWlzZSA6IHRoaXMsIHgpO1xuICB9XG59KTtcbl9leHBvcnQoX2V4cG9ydC5TICsgX2V4cG9ydC5GICogIShVU0VfTkFUSVZFICYmIF9pdGVyRGV0ZWN0KGZ1bmN0aW9uIChpdGVyKSB7XG4gICRQcm9taXNlLmFsbChpdGVyKVsnY2F0Y2gnXShlbXB0eSk7XG59KSksIFBST01JU0UsIHtcbiAgLy8gMjUuNC40LjEgUHJvbWlzZS5hbGwoaXRlcmFibGUpXG4gIGFsbDogZnVuY3Rpb24gYWxsKGl0ZXJhYmxlKSB7XG4gICAgdmFyIEMgPSB0aGlzO1xuICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkoQyk7XG4gICAgdmFyIHJlc29sdmUgPSBjYXBhYmlsaXR5LnJlc29sdmU7XG4gICAgdmFyIHJlamVjdCA9IGNhcGFiaWxpdHkucmVqZWN0O1xuICAgIHZhciByZXN1bHQgPSBfcGVyZm9ybShmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgdmFsdWVzID0gW107XG4gICAgICB2YXIgaW5kZXggPSAwO1xuICAgICAgdmFyIHJlbWFpbmluZyA9IDE7XG4gICAgICBfZm9yT2YoaXRlcmFibGUsIGZhbHNlLCBmdW5jdGlvbiAocHJvbWlzZSkge1xuICAgICAgICB2YXIgJGluZGV4ID0gaW5kZXgrKztcbiAgICAgICAgdmFyIGFscmVhZHlDYWxsZWQgPSBmYWxzZTtcbiAgICAgICAgdmFsdWVzLnB1c2godW5kZWZpbmVkKTtcbiAgICAgICAgcmVtYWluaW5nKys7XG4gICAgICAgIEMucmVzb2x2ZShwcm9taXNlKS50aGVuKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgIGlmIChhbHJlYWR5Q2FsbGVkKSByZXR1cm47XG4gICAgICAgICAgYWxyZWFkeUNhbGxlZCA9IHRydWU7XG4gICAgICAgICAgdmFsdWVzWyRpbmRleF0gPSB2YWx1ZTtcbiAgICAgICAgICAtLXJlbWFpbmluZyB8fCByZXNvbHZlKHZhbHVlcyk7XG4gICAgICAgIH0sIHJlamVjdCk7XG4gICAgICB9KTtcbiAgICAgIC0tcmVtYWluaW5nIHx8IHJlc29sdmUodmFsdWVzKTtcbiAgICB9KTtcbiAgICBpZiAocmVzdWx0LmUpIHJlamVjdChyZXN1bHQudik7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfSxcbiAgLy8gMjUuNC40LjQgUHJvbWlzZS5yYWNlKGl0ZXJhYmxlKVxuICByYWNlOiBmdW5jdGlvbiByYWNlKGl0ZXJhYmxlKSB7XG4gICAgdmFyIEMgPSB0aGlzO1xuICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkoQyk7XG4gICAgdmFyIHJlamVjdCA9IGNhcGFiaWxpdHkucmVqZWN0O1xuICAgIHZhciByZXN1bHQgPSBfcGVyZm9ybShmdW5jdGlvbiAoKSB7XG4gICAgICBfZm9yT2YoaXRlcmFibGUsIGZhbHNlLCBmdW5jdGlvbiAocHJvbWlzZSkge1xuICAgICAgICBDLnJlc29sdmUocHJvbWlzZSkudGhlbihjYXBhYmlsaXR5LnJlc29sdmUsIHJlamVjdCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBpZiAocmVzdWx0LmUpIHJlamVjdChyZXN1bHQudik7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxufSk7XG5cbl9leHBvcnQoX2V4cG9ydC5QICsgX2V4cG9ydC5SLCAnUHJvbWlzZScsIHsgJ2ZpbmFsbHknOiBmdW5jdGlvbiAob25GaW5hbGx5KSB7XG4gIHZhciBDID0gX3NwZWNpZXNDb25zdHJ1Y3Rvcih0aGlzLCBfY29yZS5Qcm9taXNlIHx8IF9nbG9iYWwuUHJvbWlzZSk7XG4gIHZhciBpc0Z1bmN0aW9uID0gdHlwZW9mIG9uRmluYWxseSA9PSAnZnVuY3Rpb24nO1xuICByZXR1cm4gdGhpcy50aGVuKFxuICAgIGlzRnVuY3Rpb24gPyBmdW5jdGlvbiAoeCkge1xuICAgICAgcmV0dXJuIF9wcm9taXNlUmVzb2x2ZShDLCBvbkZpbmFsbHkoKSkudGhlbihmdW5jdGlvbiAoKSB7IHJldHVybiB4OyB9KTtcbiAgICB9IDogb25GaW5hbGx5LFxuICAgIGlzRnVuY3Rpb24gPyBmdW5jdGlvbiAoZSkge1xuICAgICAgcmV0dXJuIF9wcm9taXNlUmVzb2x2ZShDLCBvbkZpbmFsbHkoKSkudGhlbihmdW5jdGlvbiAoKSB7IHRocm93IGU7IH0pO1xuICAgIH0gOiBvbkZpbmFsbHlcbiAgKTtcbn0gfSk7XG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLXByb21pc2UtdHJ5XG5cblxuXG5cbl9leHBvcnQoX2V4cG9ydC5TLCAnUHJvbWlzZScsIHsgJ3RyeSc6IGZ1bmN0aW9uIChjYWxsYmFja2ZuKSB7XG4gIHZhciBwcm9taXNlQ2FwYWJpbGl0eSA9IF9uZXdQcm9taXNlQ2FwYWJpbGl0eS5mKHRoaXMpO1xuICB2YXIgcmVzdWx0ID0gX3BlcmZvcm0oY2FsbGJhY2tmbik7XG4gIChyZXN1bHQuZSA/IHByb21pc2VDYXBhYmlsaXR5LnJlamVjdCA6IHByb21pc2VDYXBhYmlsaXR5LnJlc29sdmUpKHJlc3VsdC52KTtcbiAgcmV0dXJuIHByb21pc2VDYXBhYmlsaXR5LnByb21pc2U7XG59IH0pO1xuXG52YXIgcHJvbWlzZSA9IF9jb3JlLlByb21pc2U7XG5cbnZhciBwcm9taXNlJDEgPSBwcm9taXNlO1xuXG5mdW5jdGlvbiBfYXN5bmNUb0dlbmVyYXRvcihmbikge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHZhciBzZWxmID0gdGhpcyxcbiAgICAgICAgYXJncyA9IGFyZ3VtZW50cztcbiAgICByZXR1cm4gbmV3IHByb21pc2UkMShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICB2YXIgZ2VuID0gZm4uYXBwbHkoc2VsZiwgYXJncyk7XG5cbiAgICAgIGZ1bmN0aW9uIHN0ZXAoa2V5LCBhcmcpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB2YXIgaW5mbyA9IGdlbltrZXldKGFyZyk7XG4gICAgICAgICAgdmFyIHZhbHVlID0gaW5mby52YWx1ZTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbmZvLmRvbmUpIHtcbiAgICAgICAgICByZXNvbHZlKHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcm9taXNlJDEucmVzb2x2ZSh2YWx1ZSkudGhlbihfbmV4dCwgX3Rocm93KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBfbmV4dCh2YWx1ZSkge1xuICAgICAgICBzdGVwKFwibmV4dFwiLCB2YWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIGZ1bmN0aW9uIF90aHJvdyhlcnIpIHtcbiAgICAgICAgc3RlcChcInRocm93XCIsIGVycik7XG4gICAgICB9XG5cbiAgICAgIF9uZXh0KCk7XG4gICAgfSk7XG4gIH07XG59XG5cbnZhciBhc3luY1RvR2VuZXJhdG9yID0gX2FzeW5jVG9HZW5lcmF0b3I7XG5cbnZhciBmJDIgPSB7fS5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcblxudmFyIF9vYmplY3RQaWUgPSB7XG5cdGY6IGYkMlxufTtcblxudmFyIGdPUEQgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuXG52YXIgZiQzID0gX2Rlc2NyaXB0b3JzID8gZ09QRCA6IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihPLCBQKSB7XG4gIE8gPSBfdG9Jb2JqZWN0KE8pO1xuICBQID0gX3RvUHJpbWl0aXZlKFAsIHRydWUpO1xuICBpZiAoX2llOERvbURlZmluZSkgdHJ5IHtcbiAgICByZXR1cm4gZ09QRChPLCBQKTtcbiAgfSBjYXRjaCAoZSkgeyAvKiBlbXB0eSAqLyB9XG4gIGlmIChfaGFzKE8sIFApKSByZXR1cm4gX3Byb3BlcnR5RGVzYyghX29iamVjdFBpZS5mLmNhbGwoTywgUCksIE9bUF0pO1xufTtcblxudmFyIF9vYmplY3RHb3BkID0ge1xuXHRmOiBmJDNcbn07XG5cbi8vIG1vc3QgT2JqZWN0IG1ldGhvZHMgYnkgRVM2IHNob3VsZCBhY2NlcHQgcHJpbWl0aXZlc1xuXG5cblxudmFyIF9vYmplY3RTYXAgPSBmdW5jdGlvbiAoS0VZLCBleGVjKSB7XG4gIHZhciBmbiA9IChfY29yZS5PYmplY3QgfHwge30pW0tFWV0gfHwgT2JqZWN0W0tFWV07XG4gIHZhciBleHAgPSB7fTtcbiAgZXhwW0tFWV0gPSBleGVjKGZuKTtcbiAgX2V4cG9ydChfZXhwb3J0LlMgKyBfZXhwb3J0LkYgKiBfZmFpbHMoZnVuY3Rpb24gKCkgeyBmbigxKTsgfSksICdPYmplY3QnLCBleHApO1xufTtcblxuLy8gMTkuMS4yLjYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihPLCBQKVxuXG52YXIgJGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IF9vYmplY3RHb3BkLmY7XG5cbl9vYmplY3RTYXAoJ2dldE93blByb3BlcnR5RGVzY3JpcHRvcicsIGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihpdCwga2V5KSB7XG4gICAgcmV0dXJuICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoX3RvSW9iamVjdChpdCksIGtleSk7XG4gIH07XG59KTtcblxudmFyICRPYmplY3QgPSBfY29yZS5PYmplY3Q7XG52YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGl0LCBrZXkpIHtcbiAgcmV0dXJuICRPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGl0LCBrZXkpO1xufTtcblxudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciQxID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuXG52YXIgX21ldGEgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlKSB7XG52YXIgTUVUQSA9IF91aWQoJ21ldGEnKTtcblxuXG52YXIgc2V0RGVzYyA9IF9vYmplY3REcC5mO1xudmFyIGlkID0gMDtcbnZhciBpc0V4dGVuc2libGUgPSBPYmplY3QuaXNFeHRlbnNpYmxlIHx8IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRydWU7XG59O1xudmFyIEZSRUVaRSA9ICFfZmFpbHMoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gaXNFeHRlbnNpYmxlKE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyh7fSkpO1xufSk7XG52YXIgc2V0TWV0YSA9IGZ1bmN0aW9uIChpdCkge1xuICBzZXREZXNjKGl0LCBNRVRBLCB7IHZhbHVlOiB7XG4gICAgaTogJ08nICsgKytpZCwgLy8gb2JqZWN0IElEXG4gICAgdzoge30gICAgICAgICAgLy8gd2VhayBjb2xsZWN0aW9ucyBJRHNcbiAgfSB9KTtcbn07XG52YXIgZmFzdEtleSA9IGZ1bmN0aW9uIChpdCwgY3JlYXRlKSB7XG4gIC8vIHJldHVybiBwcmltaXRpdmUgd2l0aCBwcmVmaXhcbiAgaWYgKCFfaXNPYmplY3QoaXQpKSByZXR1cm4gdHlwZW9mIGl0ID09ICdzeW1ib2wnID8gaXQgOiAodHlwZW9mIGl0ID09ICdzdHJpbmcnID8gJ1MnIDogJ1AnKSArIGl0O1xuICBpZiAoIV9oYXMoaXQsIE1FVEEpKSB7XG4gICAgLy8gY2FuJ3Qgc2V0IG1ldGFkYXRhIHRvIHVuY2F1Z2h0IGZyb3plbiBvYmplY3RcbiAgICBpZiAoIWlzRXh0ZW5zaWJsZShpdCkpIHJldHVybiAnRic7XG4gICAgLy8gbm90IG5lY2Vzc2FyeSB0byBhZGQgbWV0YWRhdGFcbiAgICBpZiAoIWNyZWF0ZSkgcmV0dXJuICdFJztcbiAgICAvLyBhZGQgbWlzc2luZyBtZXRhZGF0YVxuICAgIHNldE1ldGEoaXQpO1xuICAvLyByZXR1cm4gb2JqZWN0IElEXG4gIH0gcmV0dXJuIGl0W01FVEFdLmk7XG59O1xudmFyIGdldFdlYWsgPSBmdW5jdGlvbiAoaXQsIGNyZWF0ZSkge1xuICBpZiAoIV9oYXMoaXQsIE1FVEEpKSB7XG4gICAgLy8gY2FuJ3Qgc2V0IG1ldGFkYXRhIHRvIHVuY2F1Z2h0IGZyb3plbiBvYmplY3RcbiAgICBpZiAoIWlzRXh0ZW5zaWJsZShpdCkpIHJldHVybiB0cnVlO1xuICAgIC8vIG5vdCBuZWNlc3NhcnkgdG8gYWRkIG1ldGFkYXRhXG4gICAgaWYgKCFjcmVhdGUpIHJldHVybiBmYWxzZTtcbiAgICAvLyBhZGQgbWlzc2luZyBtZXRhZGF0YVxuICAgIHNldE1ldGEoaXQpO1xuICAvLyByZXR1cm4gaGFzaCB3ZWFrIGNvbGxlY3Rpb25zIElEc1xuICB9IHJldHVybiBpdFtNRVRBXS53O1xufTtcbi8vIGFkZCBtZXRhZGF0YSBvbiBmcmVlemUtZmFtaWx5IG1ldGhvZHMgY2FsbGluZ1xudmFyIG9uRnJlZXplID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmIChGUkVFWkUgJiYgbWV0YS5ORUVEICYmIGlzRXh0ZW5zaWJsZShpdCkgJiYgIV9oYXMoaXQsIE1FVEEpKSBzZXRNZXRhKGl0KTtcbiAgcmV0dXJuIGl0O1xufTtcbnZhciBtZXRhID0gbW9kdWxlLmV4cG9ydHMgPSB7XG4gIEtFWTogTUVUQSxcbiAgTkVFRDogZmFsc2UsXG4gIGZhc3RLZXk6IGZhc3RLZXksXG4gIGdldFdlYWs6IGdldFdlYWssXG4gIG9uRnJlZXplOiBvbkZyZWV6ZVxufTtcbn0pO1xudmFyIF9tZXRhXzEgPSBfbWV0YS5LRVk7XG52YXIgX21ldGFfMiA9IF9tZXRhLk5FRUQ7XG52YXIgX21ldGFfMyA9IF9tZXRhLmZhc3RLZXk7XG52YXIgX21ldGFfNCA9IF9tZXRhLmdldFdlYWs7XG52YXIgX21ldGFfNSA9IF9tZXRhLm9uRnJlZXplO1xuXG52YXIgZiQ0ID0gX3drcztcblxudmFyIF93a3NFeHQgPSB7XG5cdGY6IGYkNFxufTtcblxudmFyIGRlZmluZVByb3BlcnR5ID0gX29iamVjdERwLmY7XG52YXIgX3drc0RlZmluZSA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gIHZhciAkU3ltYm9sID0gX2NvcmUuU3ltYm9sIHx8IChfY29yZS5TeW1ib2wgPSBfbGlicmFyeSA/IHt9IDogX2dsb2JhbC5TeW1ib2wgfHwge30pO1xuICBpZiAobmFtZS5jaGFyQXQoMCkgIT0gJ18nICYmICEobmFtZSBpbiAkU3ltYm9sKSkgZGVmaW5lUHJvcGVydHkoJFN5bWJvbCwgbmFtZSwgeyB2YWx1ZTogX3drc0V4dC5mKG5hbWUpIH0pO1xufTtcblxudmFyIGYkNSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG5cbnZhciBfb2JqZWN0R29wcyA9IHtcblx0ZjogZiQ1XG59O1xuXG4vLyBhbGwgZW51bWVyYWJsZSBvYmplY3Qga2V5cywgaW5jbHVkZXMgc3ltYm9sc1xuXG5cblxudmFyIF9lbnVtS2V5cyA9IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgcmVzdWx0ID0gX29iamVjdEtleXMoaXQpO1xuICB2YXIgZ2V0U3ltYm9scyA9IF9vYmplY3RHb3BzLmY7XG4gIGlmIChnZXRTeW1ib2xzKSB7XG4gICAgdmFyIHN5bWJvbHMgPSBnZXRTeW1ib2xzKGl0KTtcbiAgICB2YXIgaXNFbnVtID0gX29iamVjdFBpZS5mO1xuICAgIHZhciBpID0gMDtcbiAgICB2YXIga2V5O1xuICAgIHdoaWxlIChzeW1ib2xzLmxlbmd0aCA+IGkpIGlmIChpc0VudW0uY2FsbChpdCwga2V5ID0gc3ltYm9sc1tpKytdKSkgcmVzdWx0LnB1c2goa2V5KTtcbiAgfSByZXR1cm4gcmVzdWx0O1xufTtcblxuLy8gNy4yLjIgSXNBcnJheShhcmd1bWVudClcblxudmFyIF9pc0FycmF5ID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbiBpc0FycmF5KGFyZykge1xuICByZXR1cm4gX2NvZihhcmcpID09ICdBcnJheSc7XG59O1xuXG4vLyAxOS4xLjIuNyAvIDE1LjIuMy40IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKE8pXG5cbnZhciBoaWRkZW5LZXlzID0gX2VudW1CdWdLZXlzLmNvbmNhdCgnbGVuZ3RoJywgJ3Byb3RvdHlwZScpO1xuXG52YXIgZiQ2ID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgfHwgZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyhPKSB7XG4gIHJldHVybiBfb2JqZWN0S2V5c0ludGVybmFsKE8sIGhpZGRlbktleXMpO1xufTtcblxudmFyIF9vYmplY3RHb3BuID0ge1xuXHRmOiBmJDZcbn07XG5cbi8vIGZhbGxiYWNrIGZvciBJRTExIGJ1Z2d5IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzIHdpdGggaWZyYW1lIGFuZCB3aW5kb3dcblxudmFyIGdPUE4gPSBfb2JqZWN0R29wbi5mO1xudmFyIHRvU3RyaW5nJDEgPSB7fS50b1N0cmluZztcblxudmFyIHdpbmRvd05hbWVzID0gdHlwZW9mIHdpbmRvdyA9PSAnb2JqZWN0JyAmJiB3aW5kb3cgJiYgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXNcbiAgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh3aW5kb3cpIDogW107XG5cbnZhciBnZXRXaW5kb3dOYW1lcyA9IGZ1bmN0aW9uIChpdCkge1xuICB0cnkge1xuICAgIHJldHVybiBnT1BOKGl0KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiB3aW5kb3dOYW1lcy5zbGljZSgpO1xuICB9XG59O1xuXG52YXIgZiQ3ID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyhpdCkge1xuICByZXR1cm4gd2luZG93TmFtZXMgJiYgdG9TdHJpbmckMS5jYWxsKGl0KSA9PSAnW29iamVjdCBXaW5kb3ddJyA/IGdldFdpbmRvd05hbWVzKGl0KSA6IGdPUE4oX3RvSW9iamVjdChpdCkpO1xufTtcblxudmFyIF9vYmplY3RHb3BuRXh0ID0ge1xuXHRmOiBmJDdcbn07XG5cbi8vIEVDTUFTY3JpcHQgNiBzeW1ib2xzIHNoaW1cblxuXG5cblxuXG52YXIgTUVUQSA9IF9tZXRhLktFWTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxudmFyIGdPUEQkMSA9IF9vYmplY3RHb3BkLmY7XG52YXIgZFAkMSA9IF9vYmplY3REcC5mO1xudmFyIGdPUE4kMSA9IF9vYmplY3RHb3BuRXh0LmY7XG52YXIgJFN5bWJvbCA9IF9nbG9iYWwuU3ltYm9sO1xudmFyICRKU09OID0gX2dsb2JhbC5KU09OO1xudmFyIF9zdHJpbmdpZnkgPSAkSlNPTiAmJiAkSlNPTi5zdHJpbmdpZnk7XG52YXIgUFJPVE9UWVBFJDIgPSAncHJvdG90eXBlJztcbnZhciBISURERU4gPSBfd2tzKCdfaGlkZGVuJyk7XG52YXIgVE9fUFJJTUlUSVZFID0gX3drcygndG9QcmltaXRpdmUnKTtcbnZhciBpc0VudW0gPSB7fS5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcbnZhciBTeW1ib2xSZWdpc3RyeSA9IF9zaGFyZWQoJ3N5bWJvbC1yZWdpc3RyeScpO1xudmFyIEFsbFN5bWJvbHMgPSBfc2hhcmVkKCdzeW1ib2xzJyk7XG52YXIgT1BTeW1ib2xzID0gX3NoYXJlZCgnb3Atc3ltYm9scycpO1xudmFyIE9iamVjdFByb3RvJDEgPSBPYmplY3RbUFJPVE9UWVBFJDJdO1xudmFyIFVTRV9OQVRJVkUkMSA9IHR5cGVvZiAkU3ltYm9sID09ICdmdW5jdGlvbic7XG52YXIgUU9iamVjdCA9IF9nbG9iYWwuUU9iamVjdDtcbi8vIERvbid0IHVzZSBzZXR0ZXJzIGluIFF0IFNjcmlwdCwgaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzE3M1xudmFyIHNldHRlciA9ICFRT2JqZWN0IHx8ICFRT2JqZWN0W1BST1RPVFlQRSQyXSB8fCAhUU9iamVjdFtQUk9UT1RZUEUkMl0uZmluZENoaWxkO1xuXG4vLyBmYWxsYmFjayBmb3Igb2xkIEFuZHJvaWQsIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvdjgvaXNzdWVzL2RldGFpbD9pZD02ODdcbnZhciBzZXRTeW1ib2xEZXNjID0gX2Rlc2NyaXB0b3JzICYmIF9mYWlscyhmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBfb2JqZWN0Q3JlYXRlKGRQJDEoe30sICdhJywge1xuICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gZFAkMSh0aGlzLCAnYScsIHsgdmFsdWU6IDcgfSkuYTsgfVxuICB9KSkuYSAhPSA3O1xufSkgPyBmdW5jdGlvbiAoaXQsIGtleSwgRCkge1xuICB2YXIgcHJvdG9EZXNjID0gZ09QRCQxKE9iamVjdFByb3RvJDEsIGtleSk7XG4gIGlmIChwcm90b0Rlc2MpIGRlbGV0ZSBPYmplY3RQcm90byQxW2tleV07XG4gIGRQJDEoaXQsIGtleSwgRCk7XG4gIGlmIChwcm90b0Rlc2MgJiYgaXQgIT09IE9iamVjdFByb3RvJDEpIGRQJDEoT2JqZWN0UHJvdG8kMSwga2V5LCBwcm90b0Rlc2MpO1xufSA6IGRQJDE7XG5cbnZhciB3cmFwID0gZnVuY3Rpb24gKHRhZykge1xuICB2YXIgc3ltID0gQWxsU3ltYm9sc1t0YWddID0gX29iamVjdENyZWF0ZSgkU3ltYm9sW1BST1RPVFlQRSQyXSk7XG4gIHN5bS5fayA9IHRhZztcbiAgcmV0dXJuIHN5bTtcbn07XG5cbnZhciBpc1N5bWJvbCA9IFVTRV9OQVRJVkUkMSAmJiB0eXBlb2YgJFN5bWJvbC5pdGVyYXRvciA9PSAnc3ltYm9sJyA/IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gdHlwZW9mIGl0ID09ICdzeW1ib2wnO1xufSA6IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXQgaW5zdGFuY2VvZiAkU3ltYm9sO1xufTtcblxudmFyICRkZWZpbmVQcm9wZXJ0eSA9IGZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KGl0LCBrZXksIEQpIHtcbiAgaWYgKGl0ID09PSBPYmplY3RQcm90byQxKSAkZGVmaW5lUHJvcGVydHkoT1BTeW1ib2xzLCBrZXksIEQpO1xuICBfYW5PYmplY3QoaXQpO1xuICBrZXkgPSBfdG9QcmltaXRpdmUoa2V5LCB0cnVlKTtcbiAgX2FuT2JqZWN0KEQpO1xuICBpZiAoX2hhcyhBbGxTeW1ib2xzLCBrZXkpKSB7XG4gICAgaWYgKCFELmVudW1lcmFibGUpIHtcbiAgICAgIGlmICghX2hhcyhpdCwgSElEREVOKSkgZFAkMShpdCwgSElEREVOLCBfcHJvcGVydHlEZXNjKDEsIHt9KSk7XG4gICAgICBpdFtISURERU5dW2tleV0gPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoX2hhcyhpdCwgSElEREVOKSAmJiBpdFtISURERU5dW2tleV0pIGl0W0hJRERFTl1ba2V5XSA9IGZhbHNlO1xuICAgICAgRCA9IF9vYmplY3RDcmVhdGUoRCwgeyBlbnVtZXJhYmxlOiBfcHJvcGVydHlEZXNjKDAsIGZhbHNlKSB9KTtcbiAgICB9IHJldHVybiBzZXRTeW1ib2xEZXNjKGl0LCBrZXksIEQpO1xuICB9IHJldHVybiBkUCQxKGl0LCBrZXksIEQpO1xufTtcbnZhciAkZGVmaW5lUHJvcGVydGllcyA9IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXMoaXQsIFApIHtcbiAgX2FuT2JqZWN0KGl0KTtcbiAgdmFyIGtleXMgPSBfZW51bUtleXMoUCA9IF90b0lvYmplY3QoUCkpO1xuICB2YXIgaSA9IDA7XG4gIHZhciBsID0ga2V5cy5sZW5ndGg7XG4gIHZhciBrZXk7XG4gIHdoaWxlIChsID4gaSkgJGRlZmluZVByb3BlcnR5KGl0LCBrZXkgPSBrZXlzW2krK10sIFBba2V5XSk7XG4gIHJldHVybiBpdDtcbn07XG52YXIgJGNyZWF0ZSA9IGZ1bmN0aW9uIGNyZWF0ZShpdCwgUCkge1xuICByZXR1cm4gUCA9PT0gdW5kZWZpbmVkID8gX29iamVjdENyZWF0ZShpdCkgOiAkZGVmaW5lUHJvcGVydGllcyhfb2JqZWN0Q3JlYXRlKGl0KSwgUCk7XG59O1xudmFyICRwcm9wZXJ0eUlzRW51bWVyYWJsZSA9IGZ1bmN0aW9uIHByb3BlcnR5SXNFbnVtZXJhYmxlKGtleSkge1xuICB2YXIgRSA9IGlzRW51bS5jYWxsKHRoaXMsIGtleSA9IF90b1ByaW1pdGl2ZShrZXksIHRydWUpKTtcbiAgaWYgKHRoaXMgPT09IE9iamVjdFByb3RvJDEgJiYgX2hhcyhBbGxTeW1ib2xzLCBrZXkpICYmICFfaGFzKE9QU3ltYm9scywga2V5KSkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gRSB8fCAhX2hhcyh0aGlzLCBrZXkpIHx8ICFfaGFzKEFsbFN5bWJvbHMsIGtleSkgfHwgX2hhcyh0aGlzLCBISURERU4pICYmIHRoaXNbSElEREVOXVtrZXldID8gRSA6IHRydWU7XG59O1xudmFyICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IkMSA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihpdCwga2V5KSB7XG4gIGl0ID0gX3RvSW9iamVjdChpdCk7XG4gIGtleSA9IF90b1ByaW1pdGl2ZShrZXksIHRydWUpO1xuICBpZiAoaXQgPT09IE9iamVjdFByb3RvJDEgJiYgX2hhcyhBbGxTeW1ib2xzLCBrZXkpICYmICFfaGFzKE9QU3ltYm9scywga2V5KSkgcmV0dXJuO1xuICB2YXIgRCA9IGdPUEQkMShpdCwga2V5KTtcbiAgaWYgKEQgJiYgX2hhcyhBbGxTeW1ib2xzLCBrZXkpICYmICEoX2hhcyhpdCwgSElEREVOKSAmJiBpdFtISURERU5dW2tleV0pKSBELmVudW1lcmFibGUgPSB0cnVlO1xuICByZXR1cm4gRDtcbn07XG52YXIgJGdldE93blByb3BlcnR5TmFtZXMgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKGl0KSB7XG4gIHZhciBuYW1lcyA9IGdPUE4kMShfdG9Jb2JqZWN0KGl0KSk7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgdmFyIGkgPSAwO1xuICB2YXIga2V5O1xuICB3aGlsZSAobmFtZXMubGVuZ3RoID4gaSkge1xuICAgIGlmICghX2hhcyhBbGxTeW1ib2xzLCBrZXkgPSBuYW1lc1tpKytdKSAmJiBrZXkgIT0gSElEREVOICYmIGtleSAhPSBNRVRBKSByZXN1bHQucHVzaChrZXkpO1xuICB9IHJldHVybiByZXN1bHQ7XG59O1xudmFyICRnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPSBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMoaXQpIHtcbiAgdmFyIElTX09QID0gaXQgPT09IE9iamVjdFByb3RvJDE7XG4gIHZhciBuYW1lcyA9IGdPUE4kMShJU19PUCA/IE9QU3ltYm9scyA6IF90b0lvYmplY3QoaXQpKTtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICB2YXIgaSA9IDA7XG4gIHZhciBrZXk7XG4gIHdoaWxlIChuYW1lcy5sZW5ndGggPiBpKSB7XG4gICAgaWYgKF9oYXMoQWxsU3ltYm9scywga2V5ID0gbmFtZXNbaSsrXSkgJiYgKElTX09QID8gX2hhcyhPYmplY3RQcm90byQxLCBrZXkpIDogdHJ1ZSkpIHJlc3VsdC5wdXNoKEFsbFN5bWJvbHNba2V5XSk7XG4gIH0gcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8vIDE5LjQuMS4xIFN5bWJvbChbZGVzY3JpcHRpb25dKVxuaWYgKCFVU0VfTkFUSVZFJDEpIHtcbiAgJFN5bWJvbCA9IGZ1bmN0aW9uIFN5bWJvbCgpIHtcbiAgICBpZiAodGhpcyBpbnN0YW5jZW9mICRTeW1ib2wpIHRocm93IFR5cGVFcnJvcignU3ltYm9sIGlzIG5vdCBhIGNvbnN0cnVjdG9yIScpO1xuICAgIHZhciB0YWcgPSBfdWlkKGFyZ3VtZW50cy5sZW5ndGggPiAwID8gYXJndW1lbnRzWzBdIDogdW5kZWZpbmVkKTtcbiAgICB2YXIgJHNldCA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgaWYgKHRoaXMgPT09IE9iamVjdFByb3RvJDEpICRzZXQuY2FsbChPUFN5bWJvbHMsIHZhbHVlKTtcbiAgICAgIGlmIChfaGFzKHRoaXMsIEhJRERFTikgJiYgX2hhcyh0aGlzW0hJRERFTl0sIHRhZykpIHRoaXNbSElEREVOXVt0YWddID0gZmFsc2U7XG4gICAgICBzZXRTeW1ib2xEZXNjKHRoaXMsIHRhZywgX3Byb3BlcnR5RGVzYygxLCB2YWx1ZSkpO1xuICAgIH07XG4gICAgaWYgKF9kZXNjcmlwdG9ycyAmJiBzZXR0ZXIpIHNldFN5bWJvbERlc2MoT2JqZWN0UHJvdG8kMSwgdGFnLCB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgc2V0OiAkc2V0IH0pO1xuICAgIHJldHVybiB3cmFwKHRhZyk7XG4gIH07XG4gIF9yZWRlZmluZSgkU3ltYm9sW1BST1RPVFlQRSQyXSwgJ3RvU3RyaW5nJywgZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2s7XG4gIH0pO1xuXG4gIF9vYmplY3RHb3BkLmYgPSAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yJDE7XG4gIF9vYmplY3REcC5mID0gJGRlZmluZVByb3BlcnR5O1xuICBfb2JqZWN0R29wbi5mID0gX29iamVjdEdvcG5FeHQuZiA9ICRnZXRPd25Qcm9wZXJ0eU5hbWVzO1xuICBfb2JqZWN0UGllLmYgPSAkcHJvcGVydHlJc0VudW1lcmFibGU7XG4gIF9vYmplY3RHb3BzLmYgPSAkZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xuXG4gIGlmIChfZGVzY3JpcHRvcnMgJiYgIV9saWJyYXJ5KSB7XG4gICAgX3JlZGVmaW5lKE9iamVjdFByb3RvJDEsICdwcm9wZXJ0eUlzRW51bWVyYWJsZScsICRwcm9wZXJ0eUlzRW51bWVyYWJsZSwgdHJ1ZSk7XG4gIH1cblxuICBfd2tzRXh0LmYgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIHJldHVybiB3cmFwKF93a3MobmFtZSkpO1xuICB9O1xufVxuXG5fZXhwb3J0KF9leHBvcnQuRyArIF9leHBvcnQuVyArIF9leHBvcnQuRiAqICFVU0VfTkFUSVZFJDEsIHsgU3ltYm9sOiAkU3ltYm9sIH0pO1xuXG5mb3IgKHZhciBlczZTeW1ib2xzID0gKFxuICAvLyAxOS40LjIuMiwgMTkuNC4yLjMsIDE5LjQuMi40LCAxOS40LjIuNiwgMTkuNC4yLjgsIDE5LjQuMi45LCAxOS40LjIuMTAsIDE5LjQuMi4xMSwgMTkuNC4yLjEyLCAxOS40LjIuMTMsIDE5LjQuMi4xNFxuICAnaGFzSW5zdGFuY2UsaXNDb25jYXRTcHJlYWRhYmxlLGl0ZXJhdG9yLG1hdGNoLHJlcGxhY2Usc2VhcmNoLHNwZWNpZXMsc3BsaXQsdG9QcmltaXRpdmUsdG9TdHJpbmdUYWcsdW5zY29wYWJsZXMnXG4pLnNwbGl0KCcsJyksIGogPSAwOyBlczZTeW1ib2xzLmxlbmd0aCA+IGo7KV93a3MoZXM2U3ltYm9sc1tqKytdKTtcblxuZm9yICh2YXIgd2VsbEtub3duU3ltYm9scyA9IF9vYmplY3RLZXlzKF93a3Muc3RvcmUpLCBrID0gMDsgd2VsbEtub3duU3ltYm9scy5sZW5ndGggPiBrOykgX3drc0RlZmluZSh3ZWxsS25vd25TeW1ib2xzW2srK10pO1xuXG5fZXhwb3J0KF9leHBvcnQuUyArIF9leHBvcnQuRiAqICFVU0VfTkFUSVZFJDEsICdTeW1ib2wnLCB7XG4gIC8vIDE5LjQuMi4xIFN5bWJvbC5mb3Ioa2V5KVxuICAnZm9yJzogZnVuY3Rpb24gKGtleSkge1xuICAgIHJldHVybiBfaGFzKFN5bWJvbFJlZ2lzdHJ5LCBrZXkgKz0gJycpXG4gICAgICA/IFN5bWJvbFJlZ2lzdHJ5W2tleV1cbiAgICAgIDogU3ltYm9sUmVnaXN0cnlba2V5XSA9ICRTeW1ib2woa2V5KTtcbiAgfSxcbiAgLy8gMTkuNC4yLjUgU3ltYm9sLmtleUZvcihzeW0pXG4gIGtleUZvcjogZnVuY3Rpb24ga2V5Rm9yKHN5bSkge1xuICAgIGlmICghaXNTeW1ib2woc3ltKSkgdGhyb3cgVHlwZUVycm9yKHN5bSArICcgaXMgbm90IGEgc3ltYm9sIScpO1xuICAgIGZvciAodmFyIGtleSBpbiBTeW1ib2xSZWdpc3RyeSkgaWYgKFN5bWJvbFJlZ2lzdHJ5W2tleV0gPT09IHN5bSkgcmV0dXJuIGtleTtcbiAgfSxcbiAgdXNlU2V0dGVyOiBmdW5jdGlvbiAoKSB7IHNldHRlciA9IHRydWU7IH0sXG4gIHVzZVNpbXBsZTogZnVuY3Rpb24gKCkgeyBzZXR0ZXIgPSBmYWxzZTsgfVxufSk7XG5cbl9leHBvcnQoX2V4cG9ydC5TICsgX2V4cG9ydC5GICogIVVTRV9OQVRJVkUkMSwgJ09iamVjdCcsIHtcbiAgLy8gMTkuMS4yLjIgT2JqZWN0LmNyZWF0ZShPIFssIFByb3BlcnRpZXNdKVxuICBjcmVhdGU6ICRjcmVhdGUsXG4gIC8vIDE5LjEuMi40IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKVxuICBkZWZpbmVQcm9wZXJ0eTogJGRlZmluZVByb3BlcnR5LFxuICAvLyAxOS4xLjIuMyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhPLCBQcm9wZXJ0aWVzKVxuICBkZWZpbmVQcm9wZXJ0aWVzOiAkZGVmaW5lUHJvcGVydGllcyxcbiAgLy8gMTkuMS4yLjYgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihPLCBQKVxuICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6ICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IkMSxcbiAgLy8gMTkuMS4yLjcgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoTylcbiAgZ2V0T3duUHJvcGVydHlOYW1lczogJGdldE93blByb3BlcnR5TmFtZXMsXG4gIC8vIDE5LjEuMi44IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoTylcbiAgZ2V0T3duUHJvcGVydHlTeW1ib2xzOiAkZ2V0T3duUHJvcGVydHlTeW1ib2xzXG59KTtcblxuLy8gMjQuMy4yIEpTT04uc3RyaW5naWZ5KHZhbHVlIFssIHJlcGxhY2VyIFssIHNwYWNlXV0pXG4kSlNPTiAmJiBfZXhwb3J0KF9leHBvcnQuUyArIF9leHBvcnQuRiAqICghVVNFX05BVElWRSQxIHx8IF9mYWlscyhmdW5jdGlvbiAoKSB7XG4gIHZhciBTID0gJFN5bWJvbCgpO1xuICAvLyBNUyBFZGdlIGNvbnZlcnRzIHN5bWJvbCB2YWx1ZXMgdG8gSlNPTiBhcyB7fVxuICAvLyBXZWJLaXQgY29udmVydHMgc3ltYm9sIHZhbHVlcyB0byBKU09OIGFzIG51bGxcbiAgLy8gVjggdGhyb3dzIG9uIGJveGVkIHN5bWJvbHNcbiAgcmV0dXJuIF9zdHJpbmdpZnkoW1NdKSAhPSAnW251bGxdJyB8fCBfc3RyaW5naWZ5KHsgYTogUyB9KSAhPSAne30nIHx8IF9zdHJpbmdpZnkoT2JqZWN0KFMpKSAhPSAne30nO1xufSkpLCAnSlNPTicsIHtcbiAgc3RyaW5naWZ5OiBmdW5jdGlvbiBzdHJpbmdpZnkoaXQpIHtcbiAgICB2YXIgYXJncyA9IFtpdF07XG4gICAgdmFyIGkgPSAxO1xuICAgIHZhciByZXBsYWNlciwgJHJlcGxhY2VyO1xuICAgIHdoaWxlIChhcmd1bWVudHMubGVuZ3RoID4gaSkgYXJncy5wdXNoKGFyZ3VtZW50c1tpKytdKTtcbiAgICAkcmVwbGFjZXIgPSByZXBsYWNlciA9IGFyZ3NbMV07XG4gICAgaWYgKCFfaXNPYmplY3QocmVwbGFjZXIpICYmIGl0ID09PSB1bmRlZmluZWQgfHwgaXNTeW1ib2woaXQpKSByZXR1cm47IC8vIElFOCByZXR1cm5zIHN0cmluZyBvbiB1bmRlZmluZWRcbiAgICBpZiAoIV9pc0FycmF5KHJlcGxhY2VyKSkgcmVwbGFjZXIgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgICAgaWYgKHR5cGVvZiAkcmVwbGFjZXIgPT0gJ2Z1bmN0aW9uJykgdmFsdWUgPSAkcmVwbGFjZXIuY2FsbCh0aGlzLCBrZXksIHZhbHVlKTtcbiAgICAgIGlmICghaXNTeW1ib2wodmFsdWUpKSByZXR1cm4gdmFsdWU7XG4gICAgfTtcbiAgICBhcmdzWzFdID0gcmVwbGFjZXI7XG4gICAgcmV0dXJuIF9zdHJpbmdpZnkuYXBwbHkoJEpTT04sIGFyZ3MpO1xuICB9XG59KTtcblxuLy8gMTkuNC4zLjQgU3ltYm9sLnByb3RvdHlwZVtAQHRvUHJpbWl0aXZlXShoaW50KVxuJFN5bWJvbFtQUk9UT1RZUEUkMl1bVE9fUFJJTUlUSVZFXSB8fCBfaGlkZSgkU3ltYm9sW1BST1RPVFlQRSQyXSwgVE9fUFJJTUlUSVZFLCAkU3ltYm9sW1BST1RPVFlQRSQyXS52YWx1ZU9mKTtcbi8vIDE5LjQuMy41IFN5bWJvbC5wcm90b3R5cGVbQEB0b1N0cmluZ1RhZ11cbl9zZXRUb1N0cmluZ1RhZygkU3ltYm9sLCAnU3ltYm9sJyk7XG4vLyAyMC4yLjEuOSBNYXRoW0BAdG9TdHJpbmdUYWddXG5fc2V0VG9TdHJpbmdUYWcoTWF0aCwgJ01hdGgnLCB0cnVlKTtcbi8vIDI0LjMuMyBKU09OW0BAdG9TdHJpbmdUYWddXG5fc2V0VG9TdHJpbmdUYWcoX2dsb2JhbC5KU09OLCAnSlNPTicsIHRydWUpO1xuXG52YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzID0gX2NvcmUuT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scztcblxudmFyIGdldE93blByb3BlcnR5U3ltYm9scyQxID0gZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xuXG4vLyAxOS4xLjIuMTQgT2JqZWN0LmtleXMoTylcblxuXG5cbl9vYmplY3RTYXAoJ2tleXMnLCBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBmdW5jdGlvbiBrZXlzKGl0KSB7XG4gICAgcmV0dXJuIF9vYmplY3RLZXlzKF90b09iamVjdChpdCkpO1xuICB9O1xufSk7XG5cbnZhciBrZXlzID0gX2NvcmUuT2JqZWN0LmtleXM7XG5cbnZhciBrZXlzJDEgPSBrZXlzO1xuXG4vLyAxOS4xLjIuNCAvIDE1LjIuMy42IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKVxuX2V4cG9ydChfZXhwb3J0LlMgKyBfZXhwb3J0LkYgKiAhX2Rlc2NyaXB0b3JzLCAnT2JqZWN0JywgeyBkZWZpbmVQcm9wZXJ0eTogX29iamVjdERwLmYgfSk7XG5cbnZhciAkT2JqZWN0JDEgPSBfY29yZS5PYmplY3Q7XG52YXIgZGVmaW5lUHJvcGVydHkkMSA9IGZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KGl0LCBrZXksIGRlc2MpIHtcbiAgcmV0dXJuICRPYmplY3QkMS5kZWZpbmVQcm9wZXJ0eShpdCwga2V5LCBkZXNjKTtcbn07XG5cbnZhciBkZWZpbmVQcm9wZXJ0eSQyID0gZGVmaW5lUHJvcGVydHkkMTtcblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkge1xuICBpZiAoa2V5IGluIG9iaikge1xuICAgIGRlZmluZVByb3BlcnR5JDIob2JqLCBrZXksIHtcbiAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogdHJ1ZVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIG9ialtrZXldID0gdmFsdWU7XG4gIH1cblxuICByZXR1cm4gb2JqO1xufVxuXG52YXIgZGVmaW5lUHJvcGVydHkkMyA9IF9kZWZpbmVQcm9wZXJ0eTtcblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldICE9IG51bGwgPyBhcmd1bWVudHNbaV0gOiB7fTtcblxuICAgIHZhciBvd25LZXlzID0ga2V5cyQxKHNvdXJjZSk7XG5cbiAgICBpZiAodHlwZW9mIGdldE93blByb3BlcnR5U3ltYm9scyQxID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBvd25LZXlzID0gb3duS2V5cy5jb25jYXQoZ2V0T3duUHJvcGVydHlTeW1ib2xzJDEoc291cmNlKS5maWx0ZXIoZnVuY3Rpb24gKHN5bSkge1xuICAgICAgICByZXR1cm4gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yJDEoc291cmNlLCBzeW0pLmVudW1lcmFibGU7XG4gICAgICB9KSk7XG4gICAgfVxuXG4gICAgb3duS2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIGRlZmluZVByb3BlcnR5JDModGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbnZhciBvYmplY3RTcHJlYWQgPSBfb2JqZWN0U3ByZWFkO1xuXG5mdW5jdGlvbiBfY2xhc3NDYWxsQ2hlY2soaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7XG4gIGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTtcbiAgfVxufVxuXG52YXIgY2xhc3NDYWxsQ2hlY2sgPSBfY2xhc3NDYWxsQ2hlY2s7XG5cbi8vIFdvcmtzIHdpdGggX19wcm90b19fIG9ubHkuIE9sZCB2OCBjYW4ndCB3b3JrIHdpdGggbnVsbCBwcm90byBvYmplY3RzLlxuLyogZXNsaW50LWRpc2FibGUgbm8tcHJvdG8gKi9cblxuXG52YXIgY2hlY2sgPSBmdW5jdGlvbiAoTywgcHJvdG8pIHtcbiAgX2FuT2JqZWN0KE8pO1xuICBpZiAoIV9pc09iamVjdChwcm90bykgJiYgcHJvdG8gIT09IG51bGwpIHRocm93IFR5cGVFcnJvcihwcm90byArIFwiOiBjYW4ndCBzZXQgYXMgcHJvdG90eXBlIVwiKTtcbn07XG52YXIgX3NldFByb3RvID0ge1xuICBzZXQ6IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCAoJ19fcHJvdG9fXycgaW4ge30gPyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gICAgZnVuY3Rpb24gKHRlc3QsIGJ1Z2d5LCBzZXQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHNldCA9IF9jdHgoRnVuY3Rpb24uY2FsbCwgX29iamVjdEdvcGQuZihPYmplY3QucHJvdG90eXBlLCAnX19wcm90b19fJykuc2V0LCAyKTtcbiAgICAgICAgc2V0KHRlc3QsIFtdKTtcbiAgICAgICAgYnVnZ3kgPSAhKHRlc3QgaW5zdGFuY2VvZiBBcnJheSk7XG4gICAgICB9IGNhdGNoIChlKSB7IGJ1Z2d5ID0gdHJ1ZTsgfVxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIHNldFByb3RvdHlwZU9mKE8sIHByb3RvKSB7XG4gICAgICAgIGNoZWNrKE8sIHByb3RvKTtcbiAgICAgICAgaWYgKGJ1Z2d5KSBPLl9fcHJvdG9fXyA9IHByb3RvO1xuICAgICAgICBlbHNlIHNldChPLCBwcm90byk7XG4gICAgICAgIHJldHVybiBPO1xuICAgICAgfTtcbiAgICB9KHt9LCBmYWxzZSkgOiB1bmRlZmluZWQpLFxuICBjaGVjazogY2hlY2tcbn07XG5cbi8vIDE5LjEuMy4xOSBPYmplY3Quc2V0UHJvdG90eXBlT2YoTywgcHJvdG8pXG5cbl9leHBvcnQoX2V4cG9ydC5TLCAnT2JqZWN0JywgeyBzZXRQcm90b3R5cGVPZjogX3NldFByb3RvLnNldCB9KTtcblxudmFyIHNldFByb3RvdHlwZU9mID0gX2NvcmUuT2JqZWN0LnNldFByb3RvdHlwZU9mO1xuXG52YXIgc2V0UHJvdG90eXBlT2YkMSA9IHNldFByb3RvdHlwZU9mO1xuXG52YXIgc2V0UHJvdG90eXBlT2YkMiA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUpIHtcbmZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gX3NldFByb3RvdHlwZU9mID0gc2V0UHJvdG90eXBlT2YkMSB8fCBmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkge1xuICAgIG8uX19wcm90b19fID0gcDtcbiAgICByZXR1cm4gbztcbiAgfTtcblxuICByZXR1cm4gX3NldFByb3RvdHlwZU9mKG8sIHApO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF9zZXRQcm90b3R5cGVPZjtcbn0pO1xuXG5mdW5jdGlvbiBfaW5oZXJpdHMoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHtcbiAgaWYgKHR5cGVvZiBzdXBlckNsYXNzICE9PSBcImZ1bmN0aW9uXCIgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvblwiKTtcbiAgfVxuXG4gIHNldFByb3RvdHlwZU9mJDIoc3ViQ2xhc3MucHJvdG90eXBlLCBzdXBlckNsYXNzICYmIHN1cGVyQ2xhc3MucHJvdG90eXBlKTtcbiAgaWYgKHN1cGVyQ2xhc3MpIHNldFByb3RvdHlwZU9mJDIoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpO1xufVxuXG52YXIgaW5oZXJpdHMgPSBfaW5oZXJpdHM7XG5cbmZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07XG4gICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlO1xuICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTtcbiAgICBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlO1xuXG4gICAgZGVmaW5lUHJvcGVydHkkMih0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7XG4gIGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpO1xuICBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7XG4gIHJldHVybiBDb25zdHJ1Y3Rvcjtcbn1cblxudmFyIGNyZWF0ZUNsYXNzID0gX2NyZWF0ZUNsYXNzO1xuXG52YXIgaXRlcmF0b3IgPSBfd2tzRXh0LmYoJ2l0ZXJhdG9yJyk7XG5cbnZhciBpdGVyYXRvciQxID0gaXRlcmF0b3I7XG5cbl93a3NEZWZpbmUoJ2FzeW5jSXRlcmF0b3InKTtcblxuX3drc0RlZmluZSgnb2JzZXJ2YWJsZScpO1xuXG52YXIgc3ltYm9sID0gX2NvcmUuU3ltYm9sO1xuXG52YXIgc3ltYm9sJDEgPSBzeW1ib2w7XG5cbnZhciBfdHlwZW9mXzEgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlKSB7XG5mdW5jdGlvbiBfdHlwZW9mMihvYmopIHsgaWYgKHR5cGVvZiBzeW1ib2wkMSA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBpdGVyYXRvciQxID09PSBcInN5bWJvbFwiKSB7IF90eXBlb2YyID0gZnVuY3Rpb24gX3R5cGVvZjIob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9OyB9IGVsc2UgeyBfdHlwZW9mMiA9IGZ1bmN0aW9uIF90eXBlb2YyKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBzeW1ib2wkMSA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gc3ltYm9sJDEgJiYgb2JqICE9PSBzeW1ib2wkMS5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajsgfTsgfSByZXR1cm4gX3R5cGVvZjIob2JqKTsgfVxuXG5mdW5jdGlvbiBfdHlwZW9mKG9iaikge1xuICBpZiAodHlwZW9mIHN5bWJvbCQxID09PSBcImZ1bmN0aW9uXCIgJiYgX3R5cGVvZjIoaXRlcmF0b3IkMSkgPT09IFwic3ltYm9sXCIpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikge1xuICAgICAgcmV0dXJuIF90eXBlb2YyKG9iaik7XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IF90eXBlb2YgPSBmdW5jdGlvbiBfdHlwZW9mKG9iaikge1xuICAgICAgcmV0dXJuIG9iaiAmJiB0eXBlb2Ygc3ltYm9sJDEgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IHN5bWJvbCQxICYmIG9iaiAhPT0gc3ltYm9sJDEucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IF90eXBlb2YyKG9iaik7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBfdHlwZW9mKG9iaik7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX3R5cGVvZjtcbn0pO1xuXG5mdW5jdGlvbiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpIHtcbiAgaWYgKHNlbGYgPT09IHZvaWQgMCkge1xuICAgIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZFwiKTtcbiAgfVxuXG4gIHJldHVybiBzZWxmO1xufVxuXG52YXIgYXNzZXJ0VGhpc0luaXRpYWxpemVkID0gX2Fzc2VydFRoaXNJbml0aWFsaXplZDtcblxuZnVuY3Rpb24gX3Bvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4oc2VsZiwgY2FsbCkge1xuICBpZiAoY2FsbCAmJiAoX3R5cGVvZl8xKGNhbGwpID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBjYWxsID09PSBcImZ1bmN0aW9uXCIpKSB7XG4gICAgcmV0dXJuIGNhbGw7XG4gIH1cblxuICByZXR1cm4gYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpO1xufVxuXG52YXIgcG9zc2libGVDb25zdHJ1Y3RvclJldHVybiA9IF9wb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuO1xuXG4vLyAxOS4xLjIuOSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoTylcblxuXG5cbl9vYmplY3RTYXAoJ2dldFByb3RvdHlwZU9mJywgZnVuY3Rpb24gKCkge1xuICByZXR1cm4gZnVuY3Rpb24gZ2V0UHJvdG90eXBlT2YoaXQpIHtcbiAgICByZXR1cm4gX29iamVjdEdwbyhfdG9PYmplY3QoaXQpKTtcbiAgfTtcbn0pO1xuXG52YXIgZ2V0UHJvdG90eXBlT2YgPSBfY29yZS5PYmplY3QuZ2V0UHJvdG90eXBlT2Y7XG5cbnZhciBnZXRQcm90b3R5cGVPZiQxID0gZ2V0UHJvdG90eXBlT2Y7XG5cbnZhciBnZXRQcm90b3R5cGVPZiQyID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSkge1xuZnVuY3Rpb24gX2dldFByb3RvdHlwZU9mKG8pIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSBfZ2V0UHJvdG90eXBlT2YgPSBnZXRQcm90b3R5cGVPZiQxIHx8IGZ1bmN0aW9uIF9nZXRQcm90b3R5cGVPZihvKSB7XG4gICAgcmV0dXJuIG8uX19wcm90b19fO1xuICB9O1xuXG4gIHJldHVybiBfZ2V0UHJvdG90eXBlT2Yobyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2dldFByb3RvdHlwZU9mO1xufSk7XG5cbnZhciBleHRlbmQgPSBmdW5jdGlvbiBleHRlbmQob2JqZWN0KSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBleHRlbnNpb25zID0gbmV3IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICBleHRlbnNpb25zW19rZXkgLSAxXSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuXG4gIC8vICQuZXh0ZW5kIGFsdGVybmF0aXZlLCAuLi4gaXMgdGhlIHNwcmVhZCBvcGVyYXRvci5cbiAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBfaSsrKSB7XG4gICAgdmFyIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbX2ldO1xuICAgIC8vIGNvbnNvbGUubG9nKGV4dGVuc2lvbik7XG4gICAgLy8gY29uc29sZS5sb2codHlwZW9mIGV4dGVuc2lvbik7XG4gICAgaWYgKCFleHRlbnNpb24pIGNvbnRpbnVlOyAvLyBJZ25vcmUgbnVsbCBhbmQgdW5kZWZpbmVkIG9iamVjdHMgYW5kIHBhcmFtZXRlcnMuXG5cbiAgICB2YXIgX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiA9IHRydWU7XG4gICAgdmFyIF9kaWRJdGVyYXRvckVycm9yID0gZmFsc2U7XG4gICAgdmFyIF9pdGVyYXRvckVycm9yID0gdW5kZWZpbmVkO1xuXG4gICAgdHJ5IHtcbiAgICAgIGZvciAodmFyIF9pdGVyYXRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGV4dGVuc2lvbilbU3ltYm9sLml0ZXJhdG9yXSgpLCBfc3RlcDsgIShfaXRlcmF0b3JOb3JtYWxDb21wbGV0aW9uID0gKF9zdGVwID0gX2l0ZXJhdG9yLm5leHQoKSkuZG9uZSk7IF9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24gPSB0cnVlKSB7XG4gICAgICAgIHZhciBwcm9wID0gX3N0ZXAudmFsdWU7XG5cbiAgICAgICAgLy8gRG8gbm90IHRyYXZlcnNlIHRoZSBwcm90b3R5cGUgY2hhaW4uXG4gICAgICAgIGlmIChvYmplY3RbcHJvcF0gIT09IHVuZGVmaW5lZCAmJiBleHRlbnNpb25bcHJvcF0gJiYgb2JqZWN0W3Byb3BdLnRvU3RyaW5nKCkgPT09ICdbb2JqZWN0IE9iamVjdF0nICYmIGV4dGVuc2lvbltwcm9wXS50b1N0cmluZygpID09PSAnW29iamVjdCBPYmplY3RdJykge1xuICAgICAgICAgIC8vIEdvZXMgZGVlcCBvbmx5IGlmIG9iamVjdFtwcm9wXSBhbmQgZXh0ZW5zaW9uW3Byb3BdIGFyZSBib3RoIG9iamVjdHMgIVxuICAgICAgICAgIGlmIChvYmplY3RbcHJvcF0uY29uc3RydWN0b3IgPT09IE9iamVjdCkgZXh0ZW5kKG9iamVjdFtwcm9wXSwgZXh0ZW5zaW9uW3Byb3BdKTtcbiAgICAgICAgfSBlbHNlIG9iamVjdFtwcm9wXSA9IHR5cGVvZiBvYmplY3RbcHJvcF0gPT09ICd1bmRlZmluZWQnID8gZXh0ZW5zaW9uW3Byb3BdIDogb2JqZWN0W3Byb3BdO1xuXG4gICAgICAgIGlmICh0eXBlb2Ygb2JqZWN0W3Byb3BdID09PSAndW5kZWZpbmVkJyAmJiBBcnJheS5pc0FycmF5KGV4dGVuc2lvbltwcm9wXSkpIG9iamVjdFtwcm9wXSA9IGV4dGVuc2lvbltwcm9wXS5zbGljZSgpOyAvLyBBZGQgdmFsdWVzIHRoYXQgZG8gbm90IGFscmVhZHkgZXhpc3QuXG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiBvYmplY3RbcHJvcF0gPT09ICd1bmRlZmluZWQnICYmIEFycmF5LmlzQXJyYXkoZXh0ZW5zaW9uW3Byb3BdKSkgb2JqZWN0W3Byb3BdID0gZXh0ZW5zaW9uW3Byb3BdO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgX2RpZEl0ZXJhdG9yRXJyb3IgPSB0cnVlO1xuICAgICAgX2l0ZXJhdG9yRXJyb3IgPSBlcnI7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICghX2l0ZXJhdG9yTm9ybWFsQ29tcGxldGlvbiAmJiBfaXRlcmF0b3IucmV0dXJuICE9IG51bGwpIHtcbiAgICAgICAgICBfaXRlcmF0b3IucmV0dXJuKCk7XG4gICAgICAgIH1cbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmIChfZGlkSXRlcmF0b3JFcnJvcikge1xuICAgICAgICAgIHRocm93IF9pdGVyYXRvckVycm9yO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG9iamVjdDtcbn07XG5cbnZhciBpbnN0cnVjdCA9IGZ1bmN0aW9uIGluc3RydWN0KGFycmF5LCBpbnN0QXJyYXkpIHtcbiAgdmFyIHRlbXBPYmplY3QgPSB7fTtcblxuICBmb3IgKHZhciBpID0gMCwgbWF4ID0gaW5zdEFycmF5Lmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7XG4gICAgdmFyIGd1aWRlID0gaW5zdEFycmF5W2ldO1xuICAgIHRlbXBPYmplY3RbZ3VpZGVdID0gYXJyYXlbaV07XG4gIH1cblxuICByZXR1cm4gdGVtcE9iamVjdDtcbn07XG52YXIgdHJhbnNmb3JtRGF0YSA9IGZ1bmN0aW9uIHRyYW5zZm9ybURhdGEob2JqZWN0LCBpbnN0cnVjdGlvbnMpIHtcbiAgZm9yICh2YXIga2V5IGluIGluc3RydWN0aW9ucykge1xuICAgIGlmIChBcnJheS5pc0FycmF5KG9iamVjdFtrZXldKSkgb2JqZWN0W2tleV0gPSBpbnN0cnVjdChvYmplY3Rba2V5XSwgaW5zdHJ1Y3Rpb25zW2tleV0pO2Vsc2UgaWYgKG9iamVjdFtrZXldIGluc3RhbmNlb2YgT2JqZWN0ICYmICFBcnJheS5pc0FycmF5KGluc3RydWN0aW9uc1trZXldKSkgb2JqZWN0W2tleV0gPSB0cmFuc2Zvcm1EYXRhKG9iamVjdFtrZXldLCBpbnN0cnVjdGlvbnNba2V5XSk7XG4gIH1cblxuICByZXR1cm4gb2JqZWN0O1xufTtcbnZhciB0b0FycmF5ID0gZnVuY3Rpb24gdG9BcnJheShvYmplY3QsIGluc3RydWN0aW9uKSB7XG4gIHZhciB0ZW1wQXJyYXkgPSBbXTtcblxuICBmb3IgKHZhciBpID0gMCwgbWF4ID0gaW5zdHJ1Y3Rpb24ubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHtcbiAgICB2YXIgZ3VpZGUgPSBpbnN0cnVjdGlvbltpXTtcbiAgICB0ZW1wQXJyYXlbaV0gPSBvYmplY3RbZ3VpZGVdO1xuICB9XG5cbiAgcmV0dXJuIHRlbXBBcnJheTtcbn07XG5cbi8vIFBvbHlmaWxsc1xuXG5pZiAoIE51bWJlci5FUFNJTE9OID09PSB1bmRlZmluZWQgKSB7XG5cblx0TnVtYmVyLkVQU0lMT04gPSBNYXRoLnBvdyggMiwgLSA1MiApO1xuXG59XG5cbmlmICggTnVtYmVyLmlzSW50ZWdlciA9PT0gdW5kZWZpbmVkICkge1xuXG5cdC8vIE1pc3NpbmcgaW4gSUVcblx0Ly8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvTnVtYmVyL2lzSW50ZWdlclxuXG5cdE51bWJlci5pc0ludGVnZXIgPSBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0cmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgaXNGaW5pdGUoIHZhbHVlICkgJiYgTWF0aC5mbG9vciggdmFsdWUgKSA9PT0gdmFsdWU7XG5cblx0fTtcblxufVxuXG4vL1xuXG5pZiAoIE1hdGguc2lnbiA9PT0gdW5kZWZpbmVkICkge1xuXG5cdC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL01hdGgvc2lnblxuXG5cdE1hdGguc2lnbiA9IGZ1bmN0aW9uICggeCApIHtcblxuXHRcdHJldHVybiAoIHggPCAwICkgPyAtIDEgOiAoIHggPiAwICkgPyAxIDogKyB4O1xuXG5cdH07XG5cbn1cblxuaWYgKCAnbmFtZScgaW4gRnVuY3Rpb24ucHJvdG90eXBlID09PSBmYWxzZSApIHtcblxuXHQvLyBNaXNzaW5nIGluIElFXG5cdC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0Z1bmN0aW9uL25hbWVcblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoIEZ1bmN0aW9uLnByb3RvdHlwZSwgJ25hbWUnLCB7XG5cblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMudG9TdHJpbmcoKS5tYXRjaCggL15cXHMqZnVuY3Rpb25cXHMqKFteXFwoXFxzXSopLyApWyAxIF07XG5cblx0XHR9XG5cblx0fSApO1xuXG59XG5cbmlmICggT2JqZWN0LmFzc2lnbiA9PT0gdW5kZWZpbmVkICkge1xuXG5cdC8vIE1pc3NpbmcgaW4gSUVcblx0Ly8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvT2JqZWN0L2Fzc2lnblxuXG5cdCggZnVuY3Rpb24gKCkge1xuXG5cdFx0T2JqZWN0LmFzc2lnbiA9IGZ1bmN0aW9uICggdGFyZ2V0ICkge1xuXG5cdFx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkIHx8IHRhcmdldCA9PT0gbnVsbCApIHtcblxuXHRcdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCAnQ2Fubm90IGNvbnZlcnQgdW5kZWZpbmVkIG9yIG51bGwgdG8gb2JqZWN0JyApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHZhciBvdXRwdXQgPSBPYmplY3QoIHRhcmdldCApO1xuXG5cdFx0XHRmb3IgKCB2YXIgaW5kZXggPSAxOyBpbmRleCA8IGFyZ3VtZW50cy5sZW5ndGg7IGluZGV4ICsrICkge1xuXG5cdFx0XHRcdHZhciBzb3VyY2UgPSBhcmd1bWVudHNbIGluZGV4IF07XG5cblx0XHRcdFx0aWYgKCBzb3VyY2UgIT09IHVuZGVmaW5lZCAmJiBzb3VyY2UgIT09IG51bGwgKSB7XG5cblx0XHRcdFx0XHRmb3IgKCB2YXIgbmV4dEtleSBpbiBzb3VyY2UgKSB7XG5cblx0XHRcdFx0XHRcdGlmICggT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKCBzb3VyY2UsIG5leHRLZXkgKSApIHtcblxuXHRcdFx0XHRcdFx0XHRvdXRwdXRbIG5leHRLZXkgXSA9IHNvdXJjZVsgbmV4dEtleSBdO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBvdXRwdXQ7XG5cblx0XHR9O1xuXG5cdH0gKSgpO1xuXG59XG5cbi8qKlxuICogaHR0cHM6Ly9naXRodWIuY29tL21yZG9vYi9ldmVudGRpc3BhdGNoZXIuanMvXG4gKi9cblxuZnVuY3Rpb24gRXZlbnREaXNwYXRjaGVyKCkge31cblxuT2JqZWN0LmFzc2lnbiggRXZlbnREaXNwYXRjaGVyLnByb3RvdHlwZSwge1xuXG5cdGFkZEV2ZW50TGlzdGVuZXI6IGZ1bmN0aW9uICggdHlwZSwgbGlzdGVuZXIgKSB7XG5cblx0XHRpZiAoIHRoaXMuX2xpc3RlbmVycyA9PT0gdW5kZWZpbmVkICkgdGhpcy5fbGlzdGVuZXJzID0ge307XG5cblx0XHR2YXIgbGlzdGVuZXJzID0gdGhpcy5fbGlzdGVuZXJzO1xuXG5cdFx0aWYgKCBsaXN0ZW5lcnNbIHR5cGUgXSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRsaXN0ZW5lcnNbIHR5cGUgXSA9IFtdO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBsaXN0ZW5lcnNbIHR5cGUgXS5pbmRleE9mKCBsaXN0ZW5lciApID09PSAtIDEgKSB7XG5cblx0XHRcdGxpc3RlbmVyc1sgdHlwZSBdLnB1c2goIGxpc3RlbmVyICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHRoYXNFdmVudExpc3RlbmVyOiBmdW5jdGlvbiAoIHR5cGUsIGxpc3RlbmVyICkge1xuXG5cdFx0aWYgKCB0aGlzLl9saXN0ZW5lcnMgPT09IHVuZGVmaW5lZCApIHJldHVybiBmYWxzZTtcblxuXHRcdHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9saXN0ZW5lcnM7XG5cblx0XHRyZXR1cm4gbGlzdGVuZXJzWyB0eXBlIF0gIT09IHVuZGVmaW5lZCAmJiBsaXN0ZW5lcnNbIHR5cGUgXS5pbmRleE9mKCBsaXN0ZW5lciApICE9PSAtIDE7XG5cblx0fSxcblxuXHRyZW1vdmVFdmVudExpc3RlbmVyOiBmdW5jdGlvbiAoIHR5cGUsIGxpc3RlbmVyICkge1xuXG5cdFx0aWYgKCB0aGlzLl9saXN0ZW5lcnMgPT09IHVuZGVmaW5lZCApIHJldHVybjtcblxuXHRcdHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9saXN0ZW5lcnM7XG5cdFx0dmFyIGxpc3RlbmVyQXJyYXkgPSBsaXN0ZW5lcnNbIHR5cGUgXTtcblxuXHRcdGlmICggbGlzdGVuZXJBcnJheSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR2YXIgaW5kZXggPSBsaXN0ZW5lckFycmF5LmluZGV4T2YoIGxpc3RlbmVyICk7XG5cblx0XHRcdGlmICggaW5kZXggIT09IC0gMSApIHtcblxuXHRcdFx0XHRsaXN0ZW5lckFycmF5LnNwbGljZSggaW5kZXgsIDEgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH0sXG5cblx0ZGlzcGF0Y2hFdmVudDogZnVuY3Rpb24gKCBldmVudCApIHtcblxuXHRcdGlmICggdGhpcy5fbGlzdGVuZXJzID09PSB1bmRlZmluZWQgKSByZXR1cm47XG5cblx0XHR2YXIgbGlzdGVuZXJzID0gdGhpcy5fbGlzdGVuZXJzO1xuXHRcdHZhciBsaXN0ZW5lckFycmF5ID0gbGlzdGVuZXJzWyBldmVudC50eXBlIF07XG5cblx0XHRpZiAoIGxpc3RlbmVyQXJyYXkgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0ZXZlbnQudGFyZ2V0ID0gdGhpcztcblxuXHRcdFx0dmFyIGFycmF5ID0gbGlzdGVuZXJBcnJheS5zbGljZSggMCApO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBhcnJheS5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdGFycmF5WyBpIF0uY2FsbCggdGhpcywgZXZlbnQgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH1cblxufSApO1xuXG52YXIgUkVWSVNJT04gPSAnOTInO1xudmFyIE1PVVNFID0geyBMRUZUOiAwLCBNSURETEU6IDEsIFJJR0hUOiAyIH07XG52YXIgQ3VsbEZhY2VOb25lID0gMDtcbnZhciBDdWxsRmFjZUJhY2sgPSAxO1xudmFyIEN1bGxGYWNlRnJvbnQgPSAyO1xudmFyIFBDRlNoYWRvd01hcCA9IDE7XG52YXIgUENGU29mdFNoYWRvd01hcCA9IDI7XG52YXIgRnJvbnRTaWRlID0gMDtcbnZhciBCYWNrU2lkZSA9IDE7XG52YXIgRG91YmxlU2lkZSA9IDI7XG52YXIgRmxhdFNoYWRpbmcgPSAxO1xudmFyIE5vQ29sb3JzID0gMDtcbnZhciBGYWNlQ29sb3JzID0gMTtcbnZhciBWZXJ0ZXhDb2xvcnMgPSAyO1xudmFyIE5vQmxlbmRpbmcgPSAwO1xudmFyIE5vcm1hbEJsZW5kaW5nID0gMTtcbnZhciBBZGRpdGl2ZUJsZW5kaW5nID0gMjtcbnZhciBTdWJ0cmFjdGl2ZUJsZW5kaW5nID0gMztcbnZhciBNdWx0aXBseUJsZW5kaW5nID0gNDtcbnZhciBDdXN0b21CbGVuZGluZyA9IDU7XG52YXIgQWRkRXF1YXRpb24gPSAxMDA7XG52YXIgU3VidHJhY3RFcXVhdGlvbiA9IDEwMTtcbnZhciBSZXZlcnNlU3VidHJhY3RFcXVhdGlvbiA9IDEwMjtcbnZhciBNaW5FcXVhdGlvbiA9IDEwMztcbnZhciBNYXhFcXVhdGlvbiA9IDEwNDtcbnZhciBaZXJvRmFjdG9yID0gMjAwO1xudmFyIE9uZUZhY3RvciA9IDIwMTtcbnZhciBTcmNDb2xvckZhY3RvciA9IDIwMjtcbnZhciBPbmVNaW51c1NyY0NvbG9yRmFjdG9yID0gMjAzO1xudmFyIFNyY0FscGhhRmFjdG9yID0gMjA0O1xudmFyIE9uZU1pbnVzU3JjQWxwaGFGYWN0b3IgPSAyMDU7XG52YXIgRHN0QWxwaGFGYWN0b3IgPSAyMDY7XG52YXIgT25lTWludXNEc3RBbHBoYUZhY3RvciA9IDIwNztcbnZhciBEc3RDb2xvckZhY3RvciA9IDIwODtcbnZhciBPbmVNaW51c0RzdENvbG9yRmFjdG9yID0gMjA5O1xudmFyIFNyY0FscGhhU2F0dXJhdGVGYWN0b3IgPSAyMTA7XG52YXIgTmV2ZXJEZXB0aCA9IDA7XG52YXIgQWx3YXlzRGVwdGggPSAxO1xudmFyIExlc3NEZXB0aCA9IDI7XG52YXIgTGVzc0VxdWFsRGVwdGggPSAzO1xudmFyIEVxdWFsRGVwdGggPSA0O1xudmFyIEdyZWF0ZXJFcXVhbERlcHRoID0gNTtcbnZhciBHcmVhdGVyRGVwdGggPSA2O1xudmFyIE5vdEVxdWFsRGVwdGggPSA3O1xudmFyIE11bHRpcGx5T3BlcmF0aW9uID0gMDtcbnZhciBNaXhPcGVyYXRpb24gPSAxO1xudmFyIEFkZE9wZXJhdGlvbiA9IDI7XG52YXIgTm9Ub25lTWFwcGluZyA9IDA7XG52YXIgTGluZWFyVG9uZU1hcHBpbmcgPSAxO1xudmFyIFJlaW5oYXJkVG9uZU1hcHBpbmcgPSAyO1xudmFyIFVuY2hhcnRlZDJUb25lTWFwcGluZyA9IDM7XG52YXIgQ2luZW9uVG9uZU1hcHBpbmcgPSA0O1xudmFyIFVWTWFwcGluZyA9IDMwMDtcbnZhciBDdWJlUmVmbGVjdGlvbk1hcHBpbmcgPSAzMDE7XG52YXIgQ3ViZVJlZnJhY3Rpb25NYXBwaW5nID0gMzAyO1xudmFyIEVxdWlyZWN0YW5ndWxhclJlZmxlY3Rpb25NYXBwaW5nID0gMzAzO1xudmFyIEVxdWlyZWN0YW5ndWxhclJlZnJhY3Rpb25NYXBwaW5nID0gMzA0O1xudmFyIFNwaGVyaWNhbFJlZmxlY3Rpb25NYXBwaW5nID0gMzA1O1xudmFyIEN1YmVVVlJlZmxlY3Rpb25NYXBwaW5nID0gMzA2O1xudmFyIEN1YmVVVlJlZnJhY3Rpb25NYXBwaW5nID0gMzA3O1xudmFyIFJlcGVhdFdyYXBwaW5nID0gMTAwMDtcbnZhciBDbGFtcFRvRWRnZVdyYXBwaW5nID0gMTAwMTtcbnZhciBNaXJyb3JlZFJlcGVhdFdyYXBwaW5nID0gMTAwMjtcbnZhciBOZWFyZXN0RmlsdGVyID0gMTAwMztcbnZhciBOZWFyZXN0TWlwTWFwTmVhcmVzdEZpbHRlciA9IDEwMDQ7XG52YXIgTmVhcmVzdE1pcE1hcExpbmVhckZpbHRlciA9IDEwMDU7XG52YXIgTGluZWFyRmlsdGVyID0gMTAwNjtcbnZhciBMaW5lYXJNaXBNYXBOZWFyZXN0RmlsdGVyID0gMTAwNztcbnZhciBMaW5lYXJNaXBNYXBMaW5lYXJGaWx0ZXIgPSAxMDA4O1xudmFyIFVuc2lnbmVkQnl0ZVR5cGUgPSAxMDA5O1xudmFyIEJ5dGVUeXBlID0gMTAxMDtcbnZhciBTaG9ydFR5cGUgPSAxMDExO1xudmFyIFVuc2lnbmVkU2hvcnRUeXBlID0gMTAxMjtcbnZhciBJbnRUeXBlID0gMTAxMztcbnZhciBVbnNpZ25lZEludFR5cGUgPSAxMDE0O1xudmFyIEZsb2F0VHlwZSA9IDEwMTU7XG52YXIgSGFsZkZsb2F0VHlwZSA9IDEwMTY7XG52YXIgVW5zaWduZWRTaG9ydDQ0NDRUeXBlID0gMTAxNztcbnZhciBVbnNpZ25lZFNob3J0NTU1MVR5cGUgPSAxMDE4O1xudmFyIFVuc2lnbmVkU2hvcnQ1NjVUeXBlID0gMTAxOTtcbnZhciBVbnNpZ25lZEludDI0OFR5cGUgPSAxMDIwO1xudmFyIEFscGhhRm9ybWF0ID0gMTAyMTtcbnZhciBSR0JGb3JtYXQgPSAxMDIyO1xudmFyIFJHQkFGb3JtYXQgPSAxMDIzO1xudmFyIEx1bWluYW5jZUZvcm1hdCA9IDEwMjQ7XG52YXIgTHVtaW5hbmNlQWxwaGFGb3JtYXQgPSAxMDI1O1xudmFyIERlcHRoRm9ybWF0ID0gMTAyNjtcbnZhciBEZXB0aFN0ZW5jaWxGb3JtYXQgPSAxMDI3O1xudmFyIFJHQl9TM1RDX0RYVDFfRm9ybWF0ID0gMzM3NzY7XG52YXIgUkdCQV9TM1RDX0RYVDFfRm9ybWF0ID0gMzM3Nzc7XG52YXIgUkdCQV9TM1RDX0RYVDNfRm9ybWF0ID0gMzM3Nzg7XG52YXIgUkdCQV9TM1RDX0RYVDVfRm9ybWF0ID0gMzM3Nzk7XG52YXIgUkdCX1BWUlRDXzRCUFBWMV9Gb3JtYXQgPSAzNTg0MDtcbnZhciBSR0JfUFZSVENfMkJQUFYxX0Zvcm1hdCA9IDM1ODQxO1xudmFyIFJHQkFfUFZSVENfNEJQUFYxX0Zvcm1hdCA9IDM1ODQyO1xudmFyIFJHQkFfUFZSVENfMkJQUFYxX0Zvcm1hdCA9IDM1ODQzO1xudmFyIFJHQl9FVEMxX0Zvcm1hdCA9IDM2MTk2O1xudmFyIFJHQkFfQVNUQ180eDRfRm9ybWF0ID0gMzc4MDg7XG52YXIgUkdCQV9BU1RDXzV4NF9Gb3JtYXQgPSAzNzgwOTtcbnZhciBSR0JBX0FTVENfNXg1X0Zvcm1hdCA9IDM3ODEwO1xudmFyIFJHQkFfQVNUQ182eDVfRm9ybWF0ID0gMzc4MTE7XG52YXIgUkdCQV9BU1RDXzZ4Nl9Gb3JtYXQgPSAzNzgxMjtcbnZhciBSR0JBX0FTVENfOHg1X0Zvcm1hdCA9IDM3ODEzO1xudmFyIFJHQkFfQVNUQ184eDZfRm9ybWF0ID0gMzc4MTQ7XG52YXIgUkdCQV9BU1RDXzh4OF9Gb3JtYXQgPSAzNzgxNTtcbnZhciBSR0JBX0FTVENfMTB4NV9Gb3JtYXQgPSAzNzgxNjtcbnZhciBSR0JBX0FTVENfMTB4Nl9Gb3JtYXQgPSAzNzgxNztcbnZhciBSR0JBX0FTVENfMTB4OF9Gb3JtYXQgPSAzNzgxODtcbnZhciBSR0JBX0FTVENfMTB4MTBfRm9ybWF0ID0gMzc4MTk7XG52YXIgUkdCQV9BU1RDXzEyeDEwX0Zvcm1hdCA9IDM3ODIwO1xudmFyIFJHQkFfQVNUQ18xMngxMl9Gb3JtYXQgPSAzNzgyMTtcbnZhciBMb29wT25jZSA9IDIyMDA7XG52YXIgTG9vcFJlcGVhdCA9IDIyMDE7XG52YXIgTG9vcFBpbmdQb25nID0gMjIwMjtcbnZhciBJbnRlcnBvbGF0ZURpc2NyZXRlID0gMjMwMDtcbnZhciBJbnRlcnBvbGF0ZUxpbmVhciA9IDIzMDE7XG52YXIgSW50ZXJwb2xhdGVTbW9vdGggPSAyMzAyO1xudmFyIFplcm9DdXJ2YXR1cmVFbmRpbmcgPSAyNDAwO1xudmFyIFplcm9TbG9wZUVuZGluZyA9IDI0MDE7XG52YXIgV3JhcEFyb3VuZEVuZGluZyA9IDI0MDI7XG52YXIgVHJpYW5nbGVzRHJhd01vZGUgPSAwO1xudmFyIFRyaWFuZ2xlU3RyaXBEcmF3TW9kZSA9IDE7XG52YXIgVHJpYW5nbGVGYW5EcmF3TW9kZSA9IDI7XG52YXIgTGluZWFyRW5jb2RpbmcgPSAzMDAwO1xudmFyIHNSR0JFbmNvZGluZyA9IDMwMDE7XG52YXIgR2FtbWFFbmNvZGluZyA9IDMwMDc7XG52YXIgUkdCRUVuY29kaW5nID0gMzAwMjtcbnZhciBSR0JNN0VuY29kaW5nID0gMzAwNDtcbnZhciBSR0JNMTZFbmNvZGluZyA9IDMwMDU7XG52YXIgUkdCREVuY29kaW5nID0gMzAwNjtcbnZhciBCYXNpY0RlcHRoUGFja2luZyA9IDMyMDA7XG52YXIgUkdCQURlcHRoUGFja2luZyA9IDMyMDE7XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxudmFyIF9NYXRoID0ge1xuXG5cdERFRzJSQUQ6IE1hdGguUEkgLyAxODAsXG5cdFJBRDJERUc6IDE4MCAvIE1hdGguUEksXG5cblx0Z2VuZXJhdGVVVUlEOiAoIGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTA1MDM0L2hvdy10by1jcmVhdGUtYS1ndWlkLXV1aWQtaW4tamF2YXNjcmlwdC8yMTk2MzEzNiMyMTk2MzEzNlxuXG5cdFx0dmFyIGx1dCA9IFtdO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgMjU2OyBpICsrICkge1xuXG5cdFx0XHRsdXRbIGkgXSA9ICggaSA8IDE2ID8gJzAnIDogJycgKSArICggaSApLnRvU3RyaW5nKCAxNiApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGdlbmVyYXRlVVVJRCgpIHtcblxuXHRcdFx0dmFyIGQwID0gTWF0aC5yYW5kb20oKSAqIDB4ZmZmZmZmZmYgfCAwO1xuXHRcdFx0dmFyIGQxID0gTWF0aC5yYW5kb20oKSAqIDB4ZmZmZmZmZmYgfCAwO1xuXHRcdFx0dmFyIGQyID0gTWF0aC5yYW5kb20oKSAqIDB4ZmZmZmZmZmYgfCAwO1xuXHRcdFx0dmFyIGQzID0gTWF0aC5yYW5kb20oKSAqIDB4ZmZmZmZmZmYgfCAwO1xuXHRcdFx0dmFyIHV1aWQgPSBsdXRbIGQwICYgMHhmZiBdICsgbHV0WyBkMCA+PiA4ICYgMHhmZiBdICsgbHV0WyBkMCA+PiAxNiAmIDB4ZmYgXSArIGx1dFsgZDAgPj4gMjQgJiAweGZmIF0gKyAnLScgK1xuXHRcdFx0XHRsdXRbIGQxICYgMHhmZiBdICsgbHV0WyBkMSA+PiA4ICYgMHhmZiBdICsgJy0nICsgbHV0WyBkMSA+PiAxNiAmIDB4MGYgfCAweDQwIF0gKyBsdXRbIGQxID4+IDI0ICYgMHhmZiBdICsgJy0nICtcblx0XHRcdFx0bHV0WyBkMiAmIDB4M2YgfCAweDgwIF0gKyBsdXRbIGQyID4+IDggJiAweGZmIF0gKyAnLScgKyBsdXRbIGQyID4+IDE2ICYgMHhmZiBdICsgbHV0WyBkMiA+PiAyNCAmIDB4ZmYgXSArXG5cdFx0XHRcdGx1dFsgZDMgJiAweGZmIF0gKyBsdXRbIGQzID4+IDggJiAweGZmIF0gKyBsdXRbIGQzID4+IDE2ICYgMHhmZiBdICsgbHV0WyBkMyA+PiAyNCAmIDB4ZmYgXTtcblxuXHRcdFx0Ly8gLnRvVXBwZXJDYXNlKCkgaGVyZSBmbGF0dGVucyBjb25jYXRlbmF0ZWQgc3RyaW5ncyB0byBzYXZlIGhlYXAgbWVtb3J5IHNwYWNlLlxuXHRcdFx0cmV0dXJuIHV1aWQudG9VcHBlckNhc2UoKTtcblxuXHRcdH07XG5cblx0fSApKCksXG5cblx0Y2xhbXA6IGZ1bmN0aW9uICggdmFsdWUsIG1pbiwgbWF4ICkge1xuXG5cdFx0cmV0dXJuIE1hdGgubWF4KCBtaW4sIE1hdGgubWluKCBtYXgsIHZhbHVlICkgKTtcblxuXHR9LFxuXG5cdC8vIGNvbXB1dGUgZXVjbGlkaWFuIG1vZHVsbyBvZiBtICUgblxuXHQvLyBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Nb2R1bG9fb3BlcmF0aW9uXG5cblx0ZXVjbGlkZWFuTW9kdWxvOiBmdW5jdGlvbiAoIG4sIG0gKSB7XG5cblx0XHRyZXR1cm4gKCAoIG4gJSBtICkgKyBtICkgJSBtO1xuXG5cdH0sXG5cblx0Ly8gTGluZWFyIG1hcHBpbmcgZnJvbSByYW5nZSA8YTEsIGEyPiB0byByYW5nZSA8YjEsIGIyPlxuXG5cdG1hcExpbmVhcjogZnVuY3Rpb24gKCB4LCBhMSwgYTIsIGIxLCBiMiApIHtcblxuXHRcdHJldHVybiBiMSArICggeCAtIGExICkgKiAoIGIyIC0gYjEgKSAvICggYTIgLSBhMSApO1xuXG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTGluZWFyX2ludGVycG9sYXRpb25cblxuXHRsZXJwOiBmdW5jdGlvbiAoIHgsIHksIHQgKSB7XG5cblx0XHRyZXR1cm4gKCAxIC0gdCApICogeCArIHQgKiB5O1xuXG5cdH0sXG5cblx0Ly8gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TbW9vdGhzdGVwXG5cblx0c21vb3Roc3RlcDogZnVuY3Rpb24gKCB4LCBtaW4sIG1heCApIHtcblxuXHRcdGlmICggeCA8PSBtaW4gKSByZXR1cm4gMDtcblx0XHRpZiAoIHggPj0gbWF4ICkgcmV0dXJuIDE7XG5cblx0XHR4ID0gKCB4IC0gbWluICkgLyAoIG1heCAtIG1pbiApO1xuXG5cdFx0cmV0dXJuIHggKiB4ICogKCAzIC0gMiAqIHggKTtcblxuXHR9LFxuXG5cdHNtb290aGVyc3RlcDogZnVuY3Rpb24gKCB4LCBtaW4sIG1heCApIHtcblxuXHRcdGlmICggeCA8PSBtaW4gKSByZXR1cm4gMDtcblx0XHRpZiAoIHggPj0gbWF4ICkgcmV0dXJuIDE7XG5cblx0XHR4ID0gKCB4IC0gbWluICkgLyAoIG1heCAtIG1pbiApO1xuXG5cdFx0cmV0dXJuIHggKiB4ICogeCAqICggeCAqICggeCAqIDYgLSAxNSApICsgMTAgKTtcblxuXHR9LFxuXG5cdC8vIFJhbmRvbSBpbnRlZ2VyIGZyb20gPGxvdywgaGlnaD4gaW50ZXJ2YWxcblxuXHRyYW5kSW50OiBmdW5jdGlvbiAoIGxvdywgaGlnaCApIHtcblxuXHRcdHJldHVybiBsb3cgKyBNYXRoLmZsb29yKCBNYXRoLnJhbmRvbSgpICogKCBoaWdoIC0gbG93ICsgMSApICk7XG5cblx0fSxcblxuXHQvLyBSYW5kb20gZmxvYXQgZnJvbSA8bG93LCBoaWdoPiBpbnRlcnZhbFxuXG5cdHJhbmRGbG9hdDogZnVuY3Rpb24gKCBsb3csIGhpZ2ggKSB7XG5cblx0XHRyZXR1cm4gbG93ICsgTWF0aC5yYW5kb20oKSAqICggaGlnaCAtIGxvdyApO1xuXG5cdH0sXG5cblx0Ly8gUmFuZG9tIGZsb2F0IGZyb20gPC1yYW5nZS8yLCByYW5nZS8yPiBpbnRlcnZhbFxuXG5cdHJhbmRGbG9hdFNwcmVhZDogZnVuY3Rpb24gKCByYW5nZSApIHtcblxuXHRcdHJldHVybiByYW5nZSAqICggMC41IC0gTWF0aC5yYW5kb20oKSApO1xuXG5cdH0sXG5cblx0ZGVnVG9SYWQ6IGZ1bmN0aW9uICggZGVncmVlcyApIHtcblxuXHRcdHJldHVybiBkZWdyZWVzICogX01hdGguREVHMlJBRDtcblxuXHR9LFxuXG5cdHJhZFRvRGVnOiBmdW5jdGlvbiAoIHJhZGlhbnMgKSB7XG5cblx0XHRyZXR1cm4gcmFkaWFucyAqIF9NYXRoLlJBRDJERUc7XG5cblx0fSxcblxuXHRpc1Bvd2VyT2ZUd286IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRyZXR1cm4gKCB2YWx1ZSAmICggdmFsdWUgLSAxICkgKSA9PT0gMCAmJiB2YWx1ZSAhPT0gMDtcblxuXHR9LFxuXG5cdGNlaWxQb3dlck9mVHdvOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0cmV0dXJuIE1hdGgucG93KCAyLCBNYXRoLmNlaWwoIE1hdGgubG9nKCB2YWx1ZSApIC8gTWF0aC5MTjIgKSApO1xuXG5cdH0sXG5cblx0Zmxvb3JQb3dlck9mVHdvOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0cmV0dXJuIE1hdGgucG93KCAyLCBNYXRoLmZsb29yKCBNYXRoLmxvZyggdmFsdWUgKSAvIE1hdGguTE4yICkgKTtcblxuXHR9XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgcGhpbG9nYiAvIGh0dHA6Ly9ibG9nLnRoZWppdC5vcmcvXG4gKiBAYXV0aG9yIGVncmFldGhlciAvIGh0dHA6Ly9lZ3JhZXRoZXIuY29tL1xuICogQGF1dGhvciB6ejg1IC8gaHR0cDovL3d3dy5sYWI0Z2FtZXMubmV0L3p6ODUvYmxvZ1xuICovXG5cbmZ1bmN0aW9uIFZlY3RvcjIoIHgsIHkgKSB7XG5cblx0dGhpcy54ID0geCB8fCAwO1xuXHR0aGlzLnkgPSB5IHx8IDA7XG5cbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIFZlY3RvcjIucHJvdG90eXBlLCB7XG5cblx0XCJ3aWR0aFwiOiB7XG5cblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMueDtcblxuXHRcdH0sXG5cblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdHRoaXMueCA9IHZhbHVlO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0XCJoZWlnaHRcIjoge1xuXG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLnk7XG5cblx0XHR9LFxuXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHR0aGlzLnkgPSB2YWx1ZTtcblxuXHRcdH1cblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmFzc2lnbiggVmVjdG9yMi5wcm90b3R5cGUsIHtcblxuXHRpc1ZlY3RvcjI6IHRydWUsXG5cblx0c2V0OiBmdW5jdGlvbiAoIHgsIHkgKSB7XG5cblx0XHR0aGlzLnggPSB4O1xuXHRcdHRoaXMueSA9IHk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFNjYWxhcjogZnVuY3Rpb24gKCBzY2FsYXIgKSB7XG5cblx0XHR0aGlzLnggPSBzY2FsYXI7XG5cdFx0dGhpcy55ID0gc2NhbGFyO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRYOiBmdW5jdGlvbiAoIHggKSB7XG5cblx0XHR0aGlzLnggPSB4O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRZOiBmdW5jdGlvbiAoIHkgKSB7XG5cblx0XHR0aGlzLnkgPSB5O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRDb21wb25lbnQ6IGZ1bmN0aW9uICggaW5kZXgsIHZhbHVlICkge1xuXG5cdFx0c3dpdGNoICggaW5kZXggKSB7XG5cblx0XHRcdGNhc2UgMDogdGhpcy54ID0gdmFsdWU7IGJyZWFrO1xuXHRcdFx0Y2FzZSAxOiB0aGlzLnkgPSB2YWx1ZTsgYnJlYWs7XG5cdFx0XHRkZWZhdWx0OiB0aHJvdyBuZXcgRXJyb3IoICdpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICcgKyBpbmRleCApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRnZXRDb21wb25lbnQ6IGZ1bmN0aW9uICggaW5kZXggKSB7XG5cblx0XHRzd2l0Y2ggKCBpbmRleCApIHtcblxuXHRcdFx0Y2FzZSAwOiByZXR1cm4gdGhpcy54O1xuXHRcdFx0Y2FzZSAxOiByZXR1cm4gdGhpcy55O1xuXHRcdFx0ZGVmYXVsdDogdGhyb3cgbmV3IEVycm9yKCAnaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAnICsgaW5kZXggKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoIHRoaXMueCwgdGhpcy55ICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHR0aGlzLnggPSB2Lng7XG5cdFx0dGhpcy55ID0gdi55O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRhZGQ6IGZ1bmN0aW9uICggdiwgdyApIHtcblxuXHRcdGlmICggdyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IyOiAuYWRkKCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAuYWRkVmVjdG9ycyggYSwgYiApIGluc3RlYWQuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMuYWRkVmVjdG9ycyggdiwgdyApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy54ICs9IHYueDtcblx0XHR0aGlzLnkgKz0gdi55O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRhZGRTY2FsYXI6IGZ1bmN0aW9uICggcyApIHtcblxuXHRcdHRoaXMueCArPSBzO1xuXHRcdHRoaXMueSArPSBzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRhZGRWZWN0b3JzOiBmdW5jdGlvbiAoIGEsIGIgKSB7XG5cblx0XHR0aGlzLnggPSBhLnggKyBiLng7XG5cdFx0dGhpcy55ID0gYS55ICsgYi55O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRhZGRTY2FsZWRWZWN0b3I6IGZ1bmN0aW9uICggdiwgcyApIHtcblxuXHRcdHRoaXMueCArPSB2LnggKiBzO1xuXHRcdHRoaXMueSArPSB2LnkgKiBzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzdWI6IGZ1bmN0aW9uICggdiwgdyApIHtcblxuXHRcdGlmICggdyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IyOiAuc3ViKCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAuc3ViVmVjdG9ycyggYSwgYiApIGluc3RlYWQuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMuc3ViVmVjdG9ycyggdiwgdyApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy54IC09IHYueDtcblx0XHR0aGlzLnkgLT0gdi55O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzdWJTY2FsYXI6IGZ1bmN0aW9uICggcyApIHtcblxuXHRcdHRoaXMueCAtPSBzO1xuXHRcdHRoaXMueSAtPSBzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzdWJWZWN0b3JzOiBmdW5jdGlvbiAoIGEsIGIgKSB7XG5cblx0XHR0aGlzLnggPSBhLnggLSBiLng7XG5cdFx0dGhpcy55ID0gYS55IC0gYi55O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtdWx0aXBseTogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0dGhpcy54ICo9IHYueDtcblx0XHR0aGlzLnkgKj0gdi55O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtdWx0aXBseVNjYWxhcjogZnVuY3Rpb24gKCBzY2FsYXIgKSB7XG5cblx0XHR0aGlzLnggKj0gc2NhbGFyO1xuXHRcdHRoaXMueSAqPSBzY2FsYXI7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGRpdmlkZTogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0dGhpcy54IC89IHYueDtcblx0XHR0aGlzLnkgLz0gdi55O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRkaXZpZGVTY2FsYXI6IGZ1bmN0aW9uICggc2NhbGFyICkge1xuXG5cdFx0cmV0dXJuIHRoaXMubXVsdGlwbHlTY2FsYXIoIDEgLyBzY2FsYXIgKTtcblxuXHR9LFxuXG5cdGFwcGx5TWF0cml4MzogZnVuY3Rpb24gKCBtICkge1xuXG5cdFx0dmFyIHggPSB0aGlzLngsIHkgPSB0aGlzLnk7XG5cdFx0dmFyIGUgPSBtLmVsZW1lbnRzO1xuXG5cdFx0dGhpcy54ID0gZVsgMCBdICogeCArIGVbIDMgXSAqIHkgKyBlWyA2IF07XG5cdFx0dGhpcy55ID0gZVsgMSBdICogeCArIGVbIDQgXSAqIHkgKyBlWyA3IF07XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG1pbjogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0dGhpcy54ID0gTWF0aC5taW4oIHRoaXMueCwgdi54ICk7XG5cdFx0dGhpcy55ID0gTWF0aC5taW4oIHRoaXMueSwgdi55ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG1heDogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0dGhpcy54ID0gTWF0aC5tYXgoIHRoaXMueCwgdi54ICk7XG5cdFx0dGhpcy55ID0gTWF0aC5tYXgoIHRoaXMueSwgdi55ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNsYW1wOiBmdW5jdGlvbiAoIG1pbiwgbWF4ICkge1xuXG5cdFx0Ly8gYXNzdW1lcyBtaW4gPCBtYXgsIGNvbXBvbmVudHdpc2VcblxuXHRcdHRoaXMueCA9IE1hdGgubWF4KCBtaW4ueCwgTWF0aC5taW4oIG1heC54LCB0aGlzLnggKSApO1xuXHRcdHRoaXMueSA9IE1hdGgubWF4KCBtaW4ueSwgTWF0aC5taW4oIG1heC55LCB0aGlzLnkgKSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjbGFtcFNjYWxhcjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIG1pbiA9IG5ldyBWZWN0b3IyKCk7XG5cdFx0dmFyIG1heCA9IG5ldyBWZWN0b3IyKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gY2xhbXBTY2FsYXIoIG1pblZhbCwgbWF4VmFsICkge1xuXG5cdFx0XHRtaW4uc2V0KCBtaW5WYWwsIG1pblZhbCApO1xuXHRcdFx0bWF4LnNldCggbWF4VmFsLCBtYXhWYWwgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXMuY2xhbXAoIG1pbiwgbWF4ICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRjbGFtcExlbmd0aDogZnVuY3Rpb24gKCBtaW4sIG1heCApIHtcblxuXHRcdHZhciBsZW5ndGggPSB0aGlzLmxlbmd0aCgpO1xuXG5cdFx0cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKCBsZW5ndGggfHwgMSApLm11bHRpcGx5U2NhbGFyKCBNYXRoLm1heCggbWluLCBNYXRoLm1pbiggbWF4LCBsZW5ndGggKSApICk7XG5cblx0fSxcblxuXHRmbG9vcjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy54ID0gTWF0aC5mbG9vciggdGhpcy54ICk7XG5cdFx0dGhpcy55ID0gTWF0aC5mbG9vciggdGhpcy55ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNlaWw6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMueCA9IE1hdGguY2VpbCggdGhpcy54ICk7XG5cdFx0dGhpcy55ID0gTWF0aC5jZWlsKCB0aGlzLnkgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0cm91bmQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMueCA9IE1hdGgucm91bmQoIHRoaXMueCApO1xuXHRcdHRoaXMueSA9IE1hdGgucm91bmQoIHRoaXMueSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRyb3VuZFRvWmVybzogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy54ID0gKCB0aGlzLnggPCAwICkgPyBNYXRoLmNlaWwoIHRoaXMueCApIDogTWF0aC5mbG9vciggdGhpcy54ICk7XG5cdFx0dGhpcy55ID0gKCB0aGlzLnkgPCAwICkgPyBNYXRoLmNlaWwoIHRoaXMueSApIDogTWF0aC5mbG9vciggdGhpcy55ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG5lZ2F0ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy54ID0gLSB0aGlzLng7XG5cdFx0dGhpcy55ID0gLSB0aGlzLnk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGRvdDogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0cmV0dXJuIHRoaXMueCAqIHYueCArIHRoaXMueSAqIHYueTtcblxuXHR9LFxuXG5cdGxlbmd0aFNxOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy54ICogdGhpcy54ICsgdGhpcy55ICogdGhpcy55O1xuXG5cdH0sXG5cblx0bGVuZ3RoOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gTWF0aC5zcXJ0KCB0aGlzLnggKiB0aGlzLnggKyB0aGlzLnkgKiB0aGlzLnkgKTtcblxuXHR9LFxuXG5cdG1hbmhhdHRhbkxlbmd0aDogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIE1hdGguYWJzKCB0aGlzLnggKSArIE1hdGguYWJzKCB0aGlzLnkgKTtcblxuXHR9LFxuXG5cdG5vcm1hbGl6ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKCB0aGlzLmxlbmd0aCgpIHx8IDEgKTtcblxuXHR9LFxuXG5cdGFuZ2xlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyBjb21wdXRlcyB0aGUgYW5nbGUgaW4gcmFkaWFucyB3aXRoIHJlc3BlY3QgdG8gdGhlIHBvc2l0aXZlIHgtYXhpc1xuXG5cdFx0dmFyIGFuZ2xlID0gTWF0aC5hdGFuMiggdGhpcy55LCB0aGlzLnggKTtcblxuXHRcdGlmICggYW5nbGUgPCAwICkgYW5nbGUgKz0gMiAqIE1hdGguUEk7XG5cblx0XHRyZXR1cm4gYW5nbGU7XG5cblx0fSxcblxuXHRkaXN0YW5jZVRvOiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHRyZXR1cm4gTWF0aC5zcXJ0KCB0aGlzLmRpc3RhbmNlVG9TcXVhcmVkKCB2ICkgKTtcblxuXHR9LFxuXG5cdGRpc3RhbmNlVG9TcXVhcmVkOiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHR2YXIgZHggPSB0aGlzLnggLSB2LngsIGR5ID0gdGhpcy55IC0gdi55O1xuXHRcdHJldHVybiBkeCAqIGR4ICsgZHkgKiBkeTtcblxuXHR9LFxuXG5cdG1hbmhhdHRhbkRpc3RhbmNlVG86IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHJldHVybiBNYXRoLmFicyggdGhpcy54IC0gdi54ICkgKyBNYXRoLmFicyggdGhpcy55IC0gdi55ICk7XG5cblx0fSxcblxuXHRzZXRMZW5ndGg6IGZ1bmN0aW9uICggbGVuZ3RoICkge1xuXG5cdFx0cmV0dXJuIHRoaXMubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIoIGxlbmd0aCApO1xuXG5cdH0sXG5cblx0bGVycDogZnVuY3Rpb24gKCB2LCBhbHBoYSApIHtcblxuXHRcdHRoaXMueCArPSAoIHYueCAtIHRoaXMueCApICogYWxwaGE7XG5cdFx0dGhpcy55ICs9ICggdi55IC0gdGhpcy55ICkgKiBhbHBoYTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bGVycFZlY3RvcnM6IGZ1bmN0aW9uICggdjEsIHYyLCBhbHBoYSApIHtcblxuXHRcdHJldHVybiB0aGlzLnN1YlZlY3RvcnMoIHYyLCB2MSApLm11bHRpcGx5U2NhbGFyKCBhbHBoYSApLmFkZCggdjEgKTtcblxuXHR9LFxuXG5cdGVxdWFsczogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0cmV0dXJuICggKCB2LnggPT09IHRoaXMueCApICYmICggdi55ID09PSB0aGlzLnkgKSApO1xuXG5cdH0sXG5cblx0ZnJvbUFycmF5OiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0gMDtcblxuXHRcdHRoaXMueCA9IGFycmF5WyBvZmZzZXQgXTtcblx0XHR0aGlzLnkgPSBhcnJheVsgb2Zmc2V0ICsgMSBdO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHR0b0FycmF5OiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoIGFycmF5ID09PSB1bmRlZmluZWQgKSBhcnJheSA9IFtdO1xuXHRcdGlmICggb2Zmc2V0ID09PSB1bmRlZmluZWQgKSBvZmZzZXQgPSAwO1xuXG5cdFx0YXJyYXlbIG9mZnNldCBdID0gdGhpcy54O1xuXHRcdGFycmF5WyBvZmZzZXQgKyAxIF0gPSB0aGlzLnk7XG5cblx0XHRyZXR1cm4gYXJyYXk7XG5cblx0fSxcblxuXHRmcm9tQnVmZmVyQXR0cmlidXRlOiBmdW5jdGlvbiAoIGF0dHJpYnV0ZSwgaW5kZXgsIG9mZnNldCApIHtcblxuXHRcdGlmICggb2Zmc2V0ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjI6IG9mZnNldCBoYXMgYmVlbiByZW1vdmVkIGZyb20gLmZyb21CdWZmZXJBdHRyaWJ1dGUoKS4nICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLnggPSBhdHRyaWJ1dGUuZ2V0WCggaW5kZXggKTtcblx0XHR0aGlzLnkgPSBhdHRyaWJ1dGUuZ2V0WSggaW5kZXggKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0cm90YXRlQXJvdW5kOiBmdW5jdGlvbiAoIGNlbnRlciwgYW5nbGUgKSB7XG5cblx0XHR2YXIgYyA9IE1hdGguY29zKCBhbmdsZSApLCBzID0gTWF0aC5zaW4oIGFuZ2xlICk7XG5cblx0XHR2YXIgeCA9IHRoaXMueCAtIGNlbnRlci54O1xuXHRcdHZhciB5ID0gdGhpcy55IC0gY2VudGVyLnk7XG5cblx0XHR0aGlzLnggPSB4ICogYyAtIHkgKiBzICsgY2VudGVyLng7XG5cdFx0dGhpcy55ID0geCAqIHMgKyB5ICogYyArIGNlbnRlci55O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3Igc3VwZXJlZ2diZXJ0IC8gaHR0cDovL3d3dy5wYXVsYnJ1bnQuY28udWsvXG4gKiBAYXV0aG9yIHBoaWxvZ2IgLyBodHRwOi8vYmxvZy50aGVqaXQub3JnL1xuICogQGF1dGhvciBqb3JkaV9yb3MgLyBodHRwOi8vcGxhdHRzb2Z0LmNvbVxuICogQGF1dGhvciBEMXBsbzFkIC8gaHR0cDovL2dpdGh1Yi5jb20vRDFwbG8xZFxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3IgbWlrYWVsIGVtdGluZ2VyIC8gaHR0cDovL2dvbW8uc2UvXG4gKiBAYXV0aG9yIHRpbWtuaXAgLyBodHRwOi8vd3d3LmZsb29ycGxhbm5lci5jb20vXG4gKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqL1xuXG5mdW5jdGlvbiBNYXRyaXg0KCkge1xuXG5cdHRoaXMuZWxlbWVudHMgPSBbXG5cblx0XHQxLCAwLCAwLCAwLFxuXHRcdDAsIDEsIDAsIDAsXG5cdFx0MCwgMCwgMSwgMCxcblx0XHQwLCAwLCAwLCAxXG5cblx0XTtcblxuXHRpZiAoIGFyZ3VtZW50cy5sZW5ndGggPiAwICkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLk1hdHJpeDQ6IHRoZSBjb25zdHJ1Y3RvciBubyBsb25nZXIgcmVhZHMgYXJndW1lbnRzLiB1c2UgLnNldCgpIGluc3RlYWQuJyApO1xuXG5cdH1cblxufVxuXG5PYmplY3QuYXNzaWduKCBNYXRyaXg0LnByb3RvdHlwZSwge1xuXG5cdGlzTWF0cml4NDogdHJ1ZSxcblxuXHRzZXQ6IGZ1bmN0aW9uICggbjExLCBuMTIsIG4xMywgbjE0LCBuMjEsIG4yMiwgbjIzLCBuMjQsIG4zMSwgbjMyLCBuMzMsIG4zNCwgbjQxLCBuNDIsIG40MywgbjQ0ICkge1xuXG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblxuXHRcdHRlWyAwIF0gPSBuMTE7IHRlWyA0IF0gPSBuMTI7IHRlWyA4IF0gPSBuMTM7IHRlWyAxMiBdID0gbjE0O1xuXHRcdHRlWyAxIF0gPSBuMjE7IHRlWyA1IF0gPSBuMjI7IHRlWyA5IF0gPSBuMjM7IHRlWyAxMyBdID0gbjI0O1xuXHRcdHRlWyAyIF0gPSBuMzE7IHRlWyA2IF0gPSBuMzI7IHRlWyAxMCBdID0gbjMzOyB0ZVsgMTQgXSA9IG4zNDtcblx0XHR0ZVsgMyBdID0gbjQxOyB0ZVsgNyBdID0gbjQyOyB0ZVsgMTEgXSA9IG40MzsgdGVbIDE1IF0gPSBuNDQ7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGlkZW50aXR5OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLnNldChcblxuXHRcdFx0MSwgMCwgMCwgMCxcblx0XHRcdDAsIDEsIDAsIDAsXG5cdFx0XHQwLCAwLCAxLCAwLFxuXHRcdFx0MCwgMCwgMCwgMVxuXG5cdFx0KTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgTWF0cml4NCgpLmZyb21BcnJheSggdGhpcy5lbGVtZW50cyApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBtICkge1xuXG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblx0XHR2YXIgbWUgPSBtLmVsZW1lbnRzO1xuXG5cdFx0dGVbIDAgXSA9IG1lWyAwIF07IHRlWyAxIF0gPSBtZVsgMSBdOyB0ZVsgMiBdID0gbWVbIDIgXTsgdGVbIDMgXSA9IG1lWyAzIF07XG5cdFx0dGVbIDQgXSA9IG1lWyA0IF07IHRlWyA1IF0gPSBtZVsgNSBdOyB0ZVsgNiBdID0gbWVbIDYgXTsgdGVbIDcgXSA9IG1lWyA3IF07XG5cdFx0dGVbIDggXSA9IG1lWyA4IF07IHRlWyA5IF0gPSBtZVsgOSBdOyB0ZVsgMTAgXSA9IG1lWyAxMCBdOyB0ZVsgMTEgXSA9IG1lWyAxMSBdO1xuXHRcdHRlWyAxMiBdID0gbWVbIDEyIF07IHRlWyAxMyBdID0gbWVbIDEzIF07IHRlWyAxNCBdID0gbWVbIDE0IF07IHRlWyAxNSBdID0gbWVbIDE1IF07XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvcHlQb3NpdGlvbjogZnVuY3Rpb24gKCBtICkge1xuXG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cywgbWUgPSBtLmVsZW1lbnRzO1xuXG5cdFx0dGVbIDEyIF0gPSBtZVsgMTIgXTtcblx0XHR0ZVsgMTMgXSA9IG1lWyAxMyBdO1xuXHRcdHRlWyAxNCBdID0gbWVbIDE0IF07XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGV4dHJhY3RCYXNpczogZnVuY3Rpb24gKCB4QXhpcywgeUF4aXMsIHpBeGlzICkge1xuXG5cdFx0eEF4aXMuc2V0RnJvbU1hdHJpeENvbHVtbiggdGhpcywgMCApO1xuXHRcdHlBeGlzLnNldEZyb21NYXRyaXhDb2x1bW4oIHRoaXMsIDEgKTtcblx0XHR6QXhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKCB0aGlzLCAyICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG1ha2VCYXNpczogZnVuY3Rpb24gKCB4QXhpcywgeUF4aXMsIHpBeGlzICkge1xuXG5cdFx0dGhpcy5zZXQoXG5cdFx0XHR4QXhpcy54LCB5QXhpcy54LCB6QXhpcy54LCAwLFxuXHRcdFx0eEF4aXMueSwgeUF4aXMueSwgekF4aXMueSwgMCxcblx0XHRcdHhBeGlzLnosIHlBeGlzLnosIHpBeGlzLnosIDAsXG5cdFx0XHQwLCAwLCAwLCAxXG5cdFx0KTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZXh0cmFjdFJvdGF0aW9uOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGV4dHJhY3RSb3RhdGlvbiggbSApIHtcblxuXHRcdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblx0XHRcdHZhciBtZSA9IG0uZWxlbWVudHM7XG5cblx0XHRcdHZhciBzY2FsZVggPSAxIC8gdjEuc2V0RnJvbU1hdHJpeENvbHVtbiggbSwgMCApLmxlbmd0aCgpO1xuXHRcdFx0dmFyIHNjYWxlWSA9IDEgLyB2MS5zZXRGcm9tTWF0cml4Q29sdW1uKCBtLCAxICkubGVuZ3RoKCk7XG5cdFx0XHR2YXIgc2NhbGVaID0gMSAvIHYxLnNldEZyb21NYXRyaXhDb2x1bW4oIG0sIDIgKS5sZW5ndGgoKTtcblxuXHRcdFx0dGVbIDAgXSA9IG1lWyAwIF0gKiBzY2FsZVg7XG5cdFx0XHR0ZVsgMSBdID0gbWVbIDEgXSAqIHNjYWxlWDtcblx0XHRcdHRlWyAyIF0gPSBtZVsgMiBdICogc2NhbGVYO1xuXG5cdFx0XHR0ZVsgNCBdID0gbWVbIDQgXSAqIHNjYWxlWTtcblx0XHRcdHRlWyA1IF0gPSBtZVsgNSBdICogc2NhbGVZO1xuXHRcdFx0dGVbIDYgXSA9IG1lWyA2IF0gKiBzY2FsZVk7XG5cblx0XHRcdHRlWyA4IF0gPSBtZVsgOCBdICogc2NhbGVaO1xuXHRcdFx0dGVbIDkgXSA9IG1lWyA5IF0gKiBzY2FsZVo7XG5cdFx0XHR0ZVsgMTAgXSA9IG1lWyAxMCBdICogc2NhbGVaO1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdG1ha2VSb3RhdGlvbkZyb21FdWxlcjogZnVuY3Rpb24gKCBldWxlciApIHtcblxuXHRcdGlmICggISAoIGV1bGVyICYmIGV1bGVyLmlzRXVsZXIgKSApIHtcblxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLk1hdHJpeDQ6IC5tYWtlUm90YXRpb25Gcm9tRXVsZXIoKSBub3cgZXhwZWN0cyBhIEV1bGVyIHJvdGF0aW9uIHJhdGhlciB0aGFuIGEgVmVjdG9yMyBhbmQgb3JkZXIuJyApO1xuXG5cdFx0fVxuXG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblxuXHRcdHZhciB4ID0gZXVsZXIueCwgeSA9IGV1bGVyLnksIHogPSBldWxlci56O1xuXHRcdHZhciBhID0gTWF0aC5jb3MoIHggKSwgYiA9IE1hdGguc2luKCB4ICk7XG5cdFx0dmFyIGMgPSBNYXRoLmNvcyggeSApLCBkID0gTWF0aC5zaW4oIHkgKTtcblx0XHR2YXIgZSA9IE1hdGguY29zKCB6ICksIGYgPSBNYXRoLnNpbiggeiApO1xuXG5cdFx0aWYgKCBldWxlci5vcmRlciA9PT0gJ1hZWicgKSB7XG5cblx0XHRcdHZhciBhZSA9IGEgKiBlLCBhZiA9IGEgKiBmLCBiZSA9IGIgKiBlLCBiZiA9IGIgKiBmO1xuXG5cdFx0XHR0ZVsgMCBdID0gYyAqIGU7XG5cdFx0XHR0ZVsgNCBdID0gLSBjICogZjtcblx0XHRcdHRlWyA4IF0gPSBkO1xuXG5cdFx0XHR0ZVsgMSBdID0gYWYgKyBiZSAqIGQ7XG5cdFx0XHR0ZVsgNSBdID0gYWUgLSBiZiAqIGQ7XG5cdFx0XHR0ZVsgOSBdID0gLSBiICogYztcblxuXHRcdFx0dGVbIDIgXSA9IGJmIC0gYWUgKiBkO1xuXHRcdFx0dGVbIDYgXSA9IGJlICsgYWYgKiBkO1xuXHRcdFx0dGVbIDEwIF0gPSBhICogYztcblxuXHRcdH0gZWxzZSBpZiAoIGV1bGVyLm9yZGVyID09PSAnWVhaJyApIHtcblxuXHRcdFx0dmFyIGNlID0gYyAqIGUsIGNmID0gYyAqIGYsIGRlID0gZCAqIGUsIGRmID0gZCAqIGY7XG5cblx0XHRcdHRlWyAwIF0gPSBjZSArIGRmICogYjtcblx0XHRcdHRlWyA0IF0gPSBkZSAqIGIgLSBjZjtcblx0XHRcdHRlWyA4IF0gPSBhICogZDtcblxuXHRcdFx0dGVbIDEgXSA9IGEgKiBmO1xuXHRcdFx0dGVbIDUgXSA9IGEgKiBlO1xuXHRcdFx0dGVbIDkgXSA9IC0gYjtcblxuXHRcdFx0dGVbIDIgXSA9IGNmICogYiAtIGRlO1xuXHRcdFx0dGVbIDYgXSA9IGRmICsgY2UgKiBiO1xuXHRcdFx0dGVbIDEwIF0gPSBhICogYztcblxuXHRcdH0gZWxzZSBpZiAoIGV1bGVyLm9yZGVyID09PSAnWlhZJyApIHtcblxuXHRcdFx0dmFyIGNlID0gYyAqIGUsIGNmID0gYyAqIGYsIGRlID0gZCAqIGUsIGRmID0gZCAqIGY7XG5cblx0XHRcdHRlWyAwIF0gPSBjZSAtIGRmICogYjtcblx0XHRcdHRlWyA0IF0gPSAtIGEgKiBmO1xuXHRcdFx0dGVbIDggXSA9IGRlICsgY2YgKiBiO1xuXG5cdFx0XHR0ZVsgMSBdID0gY2YgKyBkZSAqIGI7XG5cdFx0XHR0ZVsgNSBdID0gYSAqIGU7XG5cdFx0XHR0ZVsgOSBdID0gZGYgLSBjZSAqIGI7XG5cblx0XHRcdHRlWyAyIF0gPSAtIGEgKiBkO1xuXHRcdFx0dGVbIDYgXSA9IGI7XG5cdFx0XHR0ZVsgMTAgXSA9IGEgKiBjO1xuXG5cdFx0fSBlbHNlIGlmICggZXVsZXIub3JkZXIgPT09ICdaWVgnICkge1xuXG5cdFx0XHR2YXIgYWUgPSBhICogZSwgYWYgPSBhICogZiwgYmUgPSBiICogZSwgYmYgPSBiICogZjtcblxuXHRcdFx0dGVbIDAgXSA9IGMgKiBlO1xuXHRcdFx0dGVbIDQgXSA9IGJlICogZCAtIGFmO1xuXHRcdFx0dGVbIDggXSA9IGFlICogZCArIGJmO1xuXG5cdFx0XHR0ZVsgMSBdID0gYyAqIGY7XG5cdFx0XHR0ZVsgNSBdID0gYmYgKiBkICsgYWU7XG5cdFx0XHR0ZVsgOSBdID0gYWYgKiBkIC0gYmU7XG5cblx0XHRcdHRlWyAyIF0gPSAtIGQ7XG5cdFx0XHR0ZVsgNiBdID0gYiAqIGM7XG5cdFx0XHR0ZVsgMTAgXSA9IGEgKiBjO1xuXG5cdFx0fSBlbHNlIGlmICggZXVsZXIub3JkZXIgPT09ICdZWlgnICkge1xuXG5cdFx0XHR2YXIgYWMgPSBhICogYywgYWQgPSBhICogZCwgYmMgPSBiICogYywgYmQgPSBiICogZDtcblxuXHRcdFx0dGVbIDAgXSA9IGMgKiBlO1xuXHRcdFx0dGVbIDQgXSA9IGJkIC0gYWMgKiBmO1xuXHRcdFx0dGVbIDggXSA9IGJjICogZiArIGFkO1xuXG5cdFx0XHR0ZVsgMSBdID0gZjtcblx0XHRcdHRlWyA1IF0gPSBhICogZTtcblx0XHRcdHRlWyA5IF0gPSAtIGIgKiBlO1xuXG5cdFx0XHR0ZVsgMiBdID0gLSBkICogZTtcblx0XHRcdHRlWyA2IF0gPSBhZCAqIGYgKyBiYztcblx0XHRcdHRlWyAxMCBdID0gYWMgLSBiZCAqIGY7XG5cblx0XHR9IGVsc2UgaWYgKCBldWxlci5vcmRlciA9PT0gJ1haWScgKSB7XG5cblx0XHRcdHZhciBhYyA9IGEgKiBjLCBhZCA9IGEgKiBkLCBiYyA9IGIgKiBjLCBiZCA9IGIgKiBkO1xuXG5cdFx0XHR0ZVsgMCBdID0gYyAqIGU7XG5cdFx0XHR0ZVsgNCBdID0gLSBmO1xuXHRcdFx0dGVbIDggXSA9IGQgKiBlO1xuXG5cdFx0XHR0ZVsgMSBdID0gYWMgKiBmICsgYmQ7XG5cdFx0XHR0ZVsgNSBdID0gYSAqIGU7XG5cdFx0XHR0ZVsgOSBdID0gYWQgKiBmIC0gYmM7XG5cblx0XHRcdHRlWyAyIF0gPSBiYyAqIGYgLSBhZDtcblx0XHRcdHRlWyA2IF0gPSBiICogZTtcblx0XHRcdHRlWyAxMCBdID0gYmQgKiBmICsgYWM7XG5cblx0XHR9XG5cblx0XHQvLyBsYXN0IGNvbHVtblxuXHRcdHRlWyAzIF0gPSAwO1xuXHRcdHRlWyA3IF0gPSAwO1xuXHRcdHRlWyAxMSBdID0gMDtcblxuXHRcdC8vIGJvdHRvbSByb3dcblx0XHR0ZVsgMTIgXSA9IDA7XG5cdFx0dGVbIDEzIF0gPSAwO1xuXHRcdHRlWyAxNCBdID0gMDtcblx0XHR0ZVsgMTUgXSA9IDE7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG1ha2VSb3RhdGlvbkZyb21RdWF0ZXJuaW9uOiBmdW5jdGlvbiAoIHEgKSB7XG5cblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXG5cdFx0dmFyIHggPSBxLl94LCB5ID0gcS5feSwgeiA9IHEuX3osIHcgPSBxLl93O1xuXHRcdHZhciB4MiA9IHggKyB4LCB5MiA9IHkgKyB5LCB6MiA9IHogKyB6O1xuXHRcdHZhciB4eCA9IHggKiB4MiwgeHkgPSB4ICogeTIsIHh6ID0geCAqIHoyO1xuXHRcdHZhciB5eSA9IHkgKiB5MiwgeXogPSB5ICogejIsIHp6ID0geiAqIHoyO1xuXHRcdHZhciB3eCA9IHcgKiB4Miwgd3kgPSB3ICogeTIsIHd6ID0gdyAqIHoyO1xuXG5cdFx0dGVbIDAgXSA9IDEgLSAoIHl5ICsgenogKTtcblx0XHR0ZVsgNCBdID0geHkgLSB3ejtcblx0XHR0ZVsgOCBdID0geHogKyB3eTtcblxuXHRcdHRlWyAxIF0gPSB4eSArIHd6O1xuXHRcdHRlWyA1IF0gPSAxIC0gKCB4eCArIHp6ICk7XG5cdFx0dGVbIDkgXSA9IHl6IC0gd3g7XG5cblx0XHR0ZVsgMiBdID0geHogLSB3eTtcblx0XHR0ZVsgNiBdID0geXogKyB3eDtcblx0XHR0ZVsgMTAgXSA9IDEgLSAoIHh4ICsgeXkgKTtcblxuXHRcdC8vIGxhc3QgY29sdW1uXG5cdFx0dGVbIDMgXSA9IDA7XG5cdFx0dGVbIDcgXSA9IDA7XG5cdFx0dGVbIDExIF0gPSAwO1xuXG5cdFx0Ly8gYm90dG9tIHJvd1xuXHRcdHRlWyAxMiBdID0gMDtcblx0XHR0ZVsgMTMgXSA9IDA7XG5cdFx0dGVbIDE0IF0gPSAwO1xuXHRcdHRlWyAxNSBdID0gMTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bG9va0F0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgeCA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIHkgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciB6ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBsb29rQXQoIGV5ZSwgdGFyZ2V0LCB1cCApIHtcblxuXHRcdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblxuXHRcdFx0ei5zdWJWZWN0b3JzKCBleWUsIHRhcmdldCApO1xuXG5cdFx0XHRpZiAoIHoubGVuZ3RoU3EoKSA9PT0gMCApIHtcblxuXHRcdFx0XHQvLyBleWUgYW5kIHRhcmdldCBhcmUgaW4gdGhlIHNhbWUgcG9zaXRpb25cblxuXHRcdFx0XHR6LnogPSAxO1xuXG5cdFx0XHR9XG5cblx0XHRcdHoubm9ybWFsaXplKCk7XG5cdFx0XHR4LmNyb3NzVmVjdG9ycyggdXAsIHogKTtcblxuXHRcdFx0aWYgKCB4Lmxlbmd0aFNxKCkgPT09IDAgKSB7XG5cblx0XHRcdFx0Ly8gdXAgYW5kIHogYXJlIHBhcmFsbGVsXG5cblx0XHRcdFx0aWYgKCBNYXRoLmFicyggdXAueiApID09PSAxICkge1xuXG5cdFx0XHRcdFx0ei54ICs9IDAuMDAwMTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0ei56ICs9IDAuMDAwMTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0ei5ub3JtYWxpemUoKTtcblx0XHRcdFx0eC5jcm9zc1ZlY3RvcnMoIHVwLCB6ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0eC5ub3JtYWxpemUoKTtcblx0XHRcdHkuY3Jvc3NWZWN0b3JzKCB6LCB4ICk7XG5cblx0XHRcdHRlWyAwIF0gPSB4Lng7IHRlWyA0IF0gPSB5Lng7IHRlWyA4IF0gPSB6Lng7XG5cdFx0XHR0ZVsgMSBdID0geC55OyB0ZVsgNSBdID0geS55OyB0ZVsgOSBdID0gei55O1xuXHRcdFx0dGVbIDIgXSA9IHguejsgdGVbIDYgXSA9IHkuejsgdGVbIDEwIF0gPSB6Lno7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0bXVsdGlwbHk6IGZ1bmN0aW9uICggbSwgbiApIHtcblxuXHRcdGlmICggbiAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5NYXRyaXg0OiAubXVsdGlwbHkoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5tdWx0aXBseU1hdHJpY2VzKCBhLCBiICkgaW5zdGVhZC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5tdWx0aXBseU1hdHJpY2VzKCBtLCBuICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5tdWx0aXBseU1hdHJpY2VzKCB0aGlzLCBtICk7XG5cblx0fSxcblxuXHRwcmVtdWx0aXBseTogZnVuY3Rpb24gKCBtICkge1xuXG5cdFx0cmV0dXJuIHRoaXMubXVsdGlwbHlNYXRyaWNlcyggbSwgdGhpcyApO1xuXG5cdH0sXG5cblx0bXVsdGlwbHlNYXRyaWNlczogZnVuY3Rpb24gKCBhLCBiICkge1xuXG5cdFx0dmFyIGFlID0gYS5lbGVtZW50cztcblx0XHR2YXIgYmUgPSBiLmVsZW1lbnRzO1xuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHR2YXIgYTExID0gYWVbIDAgXSwgYTEyID0gYWVbIDQgXSwgYTEzID0gYWVbIDggXSwgYTE0ID0gYWVbIDEyIF07XG5cdFx0dmFyIGEyMSA9IGFlWyAxIF0sIGEyMiA9IGFlWyA1IF0sIGEyMyA9IGFlWyA5IF0sIGEyNCA9IGFlWyAxMyBdO1xuXHRcdHZhciBhMzEgPSBhZVsgMiBdLCBhMzIgPSBhZVsgNiBdLCBhMzMgPSBhZVsgMTAgXSwgYTM0ID0gYWVbIDE0IF07XG5cdFx0dmFyIGE0MSA9IGFlWyAzIF0sIGE0MiA9IGFlWyA3IF0sIGE0MyA9IGFlWyAxMSBdLCBhNDQgPSBhZVsgMTUgXTtcblxuXHRcdHZhciBiMTEgPSBiZVsgMCBdLCBiMTIgPSBiZVsgNCBdLCBiMTMgPSBiZVsgOCBdLCBiMTQgPSBiZVsgMTIgXTtcblx0XHR2YXIgYjIxID0gYmVbIDEgXSwgYjIyID0gYmVbIDUgXSwgYjIzID0gYmVbIDkgXSwgYjI0ID0gYmVbIDEzIF07XG5cdFx0dmFyIGIzMSA9IGJlWyAyIF0sIGIzMiA9IGJlWyA2IF0sIGIzMyA9IGJlWyAxMCBdLCBiMzQgPSBiZVsgMTQgXTtcblx0XHR2YXIgYjQxID0gYmVbIDMgXSwgYjQyID0gYmVbIDcgXSwgYjQzID0gYmVbIDExIF0sIGI0NCA9IGJlWyAxNSBdO1xuXG5cdFx0dGVbIDAgXSA9IGExMSAqIGIxMSArIGExMiAqIGIyMSArIGExMyAqIGIzMSArIGExNCAqIGI0MTtcblx0XHR0ZVsgNCBdID0gYTExICogYjEyICsgYTEyICogYjIyICsgYTEzICogYjMyICsgYTE0ICogYjQyO1xuXHRcdHRlWyA4IF0gPSBhMTEgKiBiMTMgKyBhMTIgKiBiMjMgKyBhMTMgKiBiMzMgKyBhMTQgKiBiNDM7XG5cdFx0dGVbIDEyIF0gPSBhMTEgKiBiMTQgKyBhMTIgKiBiMjQgKyBhMTMgKiBiMzQgKyBhMTQgKiBiNDQ7XG5cblx0XHR0ZVsgMSBdID0gYTIxICogYjExICsgYTIyICogYjIxICsgYTIzICogYjMxICsgYTI0ICogYjQxO1xuXHRcdHRlWyA1IF0gPSBhMjEgKiBiMTIgKyBhMjIgKiBiMjIgKyBhMjMgKiBiMzIgKyBhMjQgKiBiNDI7XG5cdFx0dGVbIDkgXSA9IGEyMSAqIGIxMyArIGEyMiAqIGIyMyArIGEyMyAqIGIzMyArIGEyNCAqIGI0Mztcblx0XHR0ZVsgMTMgXSA9IGEyMSAqIGIxNCArIGEyMiAqIGIyNCArIGEyMyAqIGIzNCArIGEyNCAqIGI0NDtcblxuXHRcdHRlWyAyIF0gPSBhMzEgKiBiMTEgKyBhMzIgKiBiMjEgKyBhMzMgKiBiMzEgKyBhMzQgKiBiNDE7XG5cdFx0dGVbIDYgXSA9IGEzMSAqIGIxMiArIGEzMiAqIGIyMiArIGEzMyAqIGIzMiArIGEzNCAqIGI0Mjtcblx0XHR0ZVsgMTAgXSA9IGEzMSAqIGIxMyArIGEzMiAqIGIyMyArIGEzMyAqIGIzMyArIGEzNCAqIGI0Mztcblx0XHR0ZVsgMTQgXSA9IGEzMSAqIGIxNCArIGEzMiAqIGIyNCArIGEzMyAqIGIzNCArIGEzNCAqIGI0NDtcblxuXHRcdHRlWyAzIF0gPSBhNDEgKiBiMTEgKyBhNDIgKiBiMjEgKyBhNDMgKiBiMzEgKyBhNDQgKiBiNDE7XG5cdFx0dGVbIDcgXSA9IGE0MSAqIGIxMiArIGE0MiAqIGIyMiArIGE0MyAqIGIzMiArIGE0NCAqIGI0Mjtcblx0XHR0ZVsgMTEgXSA9IGE0MSAqIGIxMyArIGE0MiAqIGIyMyArIGE0MyAqIGIzMyArIGE0NCAqIGI0Mztcblx0XHR0ZVsgMTUgXSA9IGE0MSAqIGIxNCArIGE0MiAqIGIyNCArIGE0MyAqIGIzNCArIGE0NCAqIGI0NDtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bXVsdGlwbHlTY2FsYXI6IGZ1bmN0aW9uICggcyApIHtcblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHR0ZVsgMCBdICo9IHM7IHRlWyA0IF0gKj0gczsgdGVbIDggXSAqPSBzOyB0ZVsgMTIgXSAqPSBzO1xuXHRcdHRlWyAxIF0gKj0gczsgdGVbIDUgXSAqPSBzOyB0ZVsgOSBdICo9IHM7IHRlWyAxMyBdICo9IHM7XG5cdFx0dGVbIDIgXSAqPSBzOyB0ZVsgNiBdICo9IHM7IHRlWyAxMCBdICo9IHM7IHRlWyAxNCBdICo9IHM7XG5cdFx0dGVbIDMgXSAqPSBzOyB0ZVsgNyBdICo9IHM7IHRlWyAxMSBdICo9IHM7IHRlWyAxNSBdICo9IHM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFwcGx5VG9CdWZmZXJBdHRyaWJ1dGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gYXBwbHlUb0J1ZmZlckF0dHJpYnV0ZSggYXR0cmlidXRlICkge1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBhdHRyaWJ1dGUuY291bnQ7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdHYxLnggPSBhdHRyaWJ1dGUuZ2V0WCggaSApO1xuXHRcdFx0XHR2MS55ID0gYXR0cmlidXRlLmdldFkoIGkgKTtcblx0XHRcdFx0djEueiA9IGF0dHJpYnV0ZS5nZXRaKCBpICk7XG5cblx0XHRcdFx0djEuYXBwbHlNYXRyaXg0KCB0aGlzICk7XG5cblx0XHRcdFx0YXR0cmlidXRlLnNldFhZWiggaSwgdjEueCwgdjEueSwgdjEueiApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBhdHRyaWJ1dGU7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRkZXRlcm1pbmFudDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblxuXHRcdHZhciBuMTEgPSB0ZVsgMCBdLCBuMTIgPSB0ZVsgNCBdLCBuMTMgPSB0ZVsgOCBdLCBuMTQgPSB0ZVsgMTIgXTtcblx0XHR2YXIgbjIxID0gdGVbIDEgXSwgbjIyID0gdGVbIDUgXSwgbjIzID0gdGVbIDkgXSwgbjI0ID0gdGVbIDEzIF07XG5cdFx0dmFyIG4zMSA9IHRlWyAyIF0sIG4zMiA9IHRlWyA2IF0sIG4zMyA9IHRlWyAxMCBdLCBuMzQgPSB0ZVsgMTQgXTtcblx0XHR2YXIgbjQxID0gdGVbIDMgXSwgbjQyID0gdGVbIDcgXSwgbjQzID0gdGVbIDExIF0sIG40NCA9IHRlWyAxNSBdO1xuXG5cdFx0Ly9UT0RPOiBtYWtlIHRoaXMgbW9yZSBlZmZpY2llbnRcblx0XHQvLyggYmFzZWQgb24gaHR0cDovL3d3dy5ldWNsaWRlYW5zcGFjZS5jb20vbWF0aHMvYWxnZWJyYS9tYXRyaXgvZnVuY3Rpb25zL2ludmVyc2UvZm91ckQvaW5kZXguaHRtIClcblxuXHRcdHJldHVybiAoXG5cdFx0XHRuNDEgKiAoXG5cdFx0XHRcdCsgbjE0ICogbjIzICogbjMyXG5cdFx0XHRcdCAtIG4xMyAqIG4yNCAqIG4zMlxuXHRcdFx0XHQgLSBuMTQgKiBuMjIgKiBuMzNcblx0XHRcdFx0ICsgbjEyICogbjI0ICogbjMzXG5cdFx0XHRcdCArIG4xMyAqIG4yMiAqIG4zNFxuXHRcdFx0XHQgLSBuMTIgKiBuMjMgKiBuMzRcblx0XHRcdCkgK1xuXHRcdFx0bjQyICogKFxuXHRcdFx0XHQrIG4xMSAqIG4yMyAqIG4zNFxuXHRcdFx0XHQgLSBuMTEgKiBuMjQgKiBuMzNcblx0XHRcdFx0ICsgbjE0ICogbjIxICogbjMzXG5cdFx0XHRcdCAtIG4xMyAqIG4yMSAqIG4zNFxuXHRcdFx0XHQgKyBuMTMgKiBuMjQgKiBuMzFcblx0XHRcdFx0IC0gbjE0ICogbjIzICogbjMxXG5cdFx0XHQpICtcblx0XHRcdG40MyAqIChcblx0XHRcdFx0KyBuMTEgKiBuMjQgKiBuMzJcblx0XHRcdFx0IC0gbjExICogbjIyICogbjM0XG5cdFx0XHRcdCAtIG4xNCAqIG4yMSAqIG4zMlxuXHRcdFx0XHQgKyBuMTIgKiBuMjEgKiBuMzRcblx0XHRcdFx0ICsgbjE0ICogbjIyICogbjMxXG5cdFx0XHRcdCAtIG4xMiAqIG4yNCAqIG4zMVxuXHRcdFx0KSArXG5cdFx0XHRuNDQgKiAoXG5cdFx0XHRcdC0gbjEzICogbjIyICogbjMxXG5cdFx0XHRcdCAtIG4xMSAqIG4yMyAqIG4zMlxuXHRcdFx0XHQgKyBuMTEgKiBuMjIgKiBuMzNcblx0XHRcdFx0ICsgbjEzICogbjIxICogbjMyXG5cdFx0XHRcdCAtIG4xMiAqIG4yMSAqIG4zM1xuXHRcdFx0XHQgKyBuMTIgKiBuMjMgKiBuMzFcblx0XHRcdClcblxuXHRcdCk7XG5cblx0fSxcblxuXHR0cmFuc3Bvc2U6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cdFx0dmFyIHRtcDtcblxuXHRcdHRtcCA9IHRlWyAxIF07IHRlWyAxIF0gPSB0ZVsgNCBdOyB0ZVsgNCBdID0gdG1wO1xuXHRcdHRtcCA9IHRlWyAyIF07IHRlWyAyIF0gPSB0ZVsgOCBdOyB0ZVsgOCBdID0gdG1wO1xuXHRcdHRtcCA9IHRlWyA2IF07IHRlWyA2IF0gPSB0ZVsgOSBdOyB0ZVsgOSBdID0gdG1wO1xuXG5cdFx0dG1wID0gdGVbIDMgXTsgdGVbIDMgXSA9IHRlWyAxMiBdOyB0ZVsgMTIgXSA9IHRtcDtcblx0XHR0bXAgPSB0ZVsgNyBdOyB0ZVsgNyBdID0gdGVbIDEzIF07IHRlWyAxMyBdID0gdG1wO1xuXHRcdHRtcCA9IHRlWyAxMSBdOyB0ZVsgMTEgXSA9IHRlWyAxNCBdOyB0ZVsgMTQgXSA9IHRtcDtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0UG9zaXRpb246IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHR0ZVsgMTIgXSA9IHYueDtcblx0XHR0ZVsgMTMgXSA9IHYueTtcblx0XHR0ZVsgMTQgXSA9IHYuejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Z2V0SW52ZXJzZTogZnVuY3Rpb24gKCBtLCB0aHJvd09uRGVnZW5lcmF0ZSApIHtcblxuXHRcdC8vIGJhc2VkIG9uIGh0dHA6Ly93d3cuZXVjbGlkZWFuc3BhY2UuY29tL21hdGhzL2FsZ2VicmEvbWF0cml4L2Z1bmN0aW9ucy9pbnZlcnNlL2ZvdXJEL2luZGV4Lmh0bVxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHMsXG5cdFx0XHRtZSA9IG0uZWxlbWVudHMsXG5cblx0XHRcdG4xMSA9IG1lWyAwIF0sIG4yMSA9IG1lWyAxIF0sIG4zMSA9IG1lWyAyIF0sIG40MSA9IG1lWyAzIF0sXG5cdFx0XHRuMTIgPSBtZVsgNCBdLCBuMjIgPSBtZVsgNSBdLCBuMzIgPSBtZVsgNiBdLCBuNDIgPSBtZVsgNyBdLFxuXHRcdFx0bjEzID0gbWVbIDggXSwgbjIzID0gbWVbIDkgXSwgbjMzID0gbWVbIDEwIF0sIG40MyA9IG1lWyAxMSBdLFxuXHRcdFx0bjE0ID0gbWVbIDEyIF0sIG4yNCA9IG1lWyAxMyBdLCBuMzQgPSBtZVsgMTQgXSwgbjQ0ID0gbWVbIDE1IF0sXG5cblx0XHRcdHQxMSA9IG4yMyAqIG4zNCAqIG40MiAtIG4yNCAqIG4zMyAqIG40MiArIG4yNCAqIG4zMiAqIG40MyAtIG4yMiAqIG4zNCAqIG40MyAtIG4yMyAqIG4zMiAqIG40NCArIG4yMiAqIG4zMyAqIG40NCxcblx0XHRcdHQxMiA9IG4xNCAqIG4zMyAqIG40MiAtIG4xMyAqIG4zNCAqIG40MiAtIG4xNCAqIG4zMiAqIG40MyArIG4xMiAqIG4zNCAqIG40MyArIG4xMyAqIG4zMiAqIG40NCAtIG4xMiAqIG4zMyAqIG40NCxcblx0XHRcdHQxMyA9IG4xMyAqIG4yNCAqIG40MiAtIG4xNCAqIG4yMyAqIG40MiArIG4xNCAqIG4yMiAqIG40MyAtIG4xMiAqIG4yNCAqIG40MyAtIG4xMyAqIG4yMiAqIG40NCArIG4xMiAqIG4yMyAqIG40NCxcblx0XHRcdHQxNCA9IG4xNCAqIG4yMyAqIG4zMiAtIG4xMyAqIG4yNCAqIG4zMiAtIG4xNCAqIG4yMiAqIG4zMyArIG4xMiAqIG4yNCAqIG4zMyArIG4xMyAqIG4yMiAqIG4zNCAtIG4xMiAqIG4yMyAqIG4zNDtcblxuXHRcdHZhciBkZXQgPSBuMTEgKiB0MTEgKyBuMjEgKiB0MTIgKyBuMzEgKiB0MTMgKyBuNDEgKiB0MTQ7XG5cblx0XHRpZiAoIGRldCA9PT0gMCApIHtcblxuXHRcdFx0dmFyIG1zZyA9IFwiVEhSRUUuTWF0cml4NDogLmdldEludmVyc2UoKSBjYW4ndCBpbnZlcnQgbWF0cml4LCBkZXRlcm1pbmFudCBpcyAwXCI7XG5cblx0XHRcdGlmICggdGhyb3dPbkRlZ2VuZXJhdGUgPT09IHRydWUgKSB7XG5cblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCBtc2cgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oIG1zZyApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0aGlzLmlkZW50aXR5KCk7XG5cblx0XHR9XG5cblx0XHR2YXIgZGV0SW52ID0gMSAvIGRldDtcblxuXHRcdHRlWyAwIF0gPSB0MTEgKiBkZXRJbnY7XG5cdFx0dGVbIDEgXSA9ICggbjI0ICogbjMzICogbjQxIC0gbjIzICogbjM0ICogbjQxIC0gbjI0ICogbjMxICogbjQzICsgbjIxICogbjM0ICogbjQzICsgbjIzICogbjMxICogbjQ0IC0gbjIxICogbjMzICogbjQ0ICkgKiBkZXRJbnY7XG5cdFx0dGVbIDIgXSA9ICggbjIyICogbjM0ICogbjQxIC0gbjI0ICogbjMyICogbjQxICsgbjI0ICogbjMxICogbjQyIC0gbjIxICogbjM0ICogbjQyIC0gbjIyICogbjMxICogbjQ0ICsgbjIxICogbjMyICogbjQ0ICkgKiBkZXRJbnY7XG5cdFx0dGVbIDMgXSA9ICggbjIzICogbjMyICogbjQxIC0gbjIyICogbjMzICogbjQxIC0gbjIzICogbjMxICogbjQyICsgbjIxICogbjMzICogbjQyICsgbjIyICogbjMxICogbjQzIC0gbjIxICogbjMyICogbjQzICkgKiBkZXRJbnY7XG5cblx0XHR0ZVsgNCBdID0gdDEyICogZGV0SW52O1xuXHRcdHRlWyA1IF0gPSAoIG4xMyAqIG4zNCAqIG40MSAtIG4xNCAqIG4zMyAqIG40MSArIG4xNCAqIG4zMSAqIG40MyAtIG4xMSAqIG4zNCAqIG40MyAtIG4xMyAqIG4zMSAqIG40NCArIG4xMSAqIG4zMyAqIG40NCApICogZGV0SW52O1xuXHRcdHRlWyA2IF0gPSAoIG4xNCAqIG4zMiAqIG40MSAtIG4xMiAqIG4zNCAqIG40MSAtIG4xNCAqIG4zMSAqIG40MiArIG4xMSAqIG4zNCAqIG40MiArIG4xMiAqIG4zMSAqIG40NCAtIG4xMSAqIG4zMiAqIG40NCApICogZGV0SW52O1xuXHRcdHRlWyA3IF0gPSAoIG4xMiAqIG4zMyAqIG40MSAtIG4xMyAqIG4zMiAqIG40MSArIG4xMyAqIG4zMSAqIG40MiAtIG4xMSAqIG4zMyAqIG40MiAtIG4xMiAqIG4zMSAqIG40MyArIG4xMSAqIG4zMiAqIG40MyApICogZGV0SW52O1xuXG5cdFx0dGVbIDggXSA9IHQxMyAqIGRldEludjtcblx0XHR0ZVsgOSBdID0gKCBuMTQgKiBuMjMgKiBuNDEgLSBuMTMgKiBuMjQgKiBuNDEgLSBuMTQgKiBuMjEgKiBuNDMgKyBuMTEgKiBuMjQgKiBuNDMgKyBuMTMgKiBuMjEgKiBuNDQgLSBuMTEgKiBuMjMgKiBuNDQgKSAqIGRldEludjtcblx0XHR0ZVsgMTAgXSA9ICggbjEyICogbjI0ICogbjQxIC0gbjE0ICogbjIyICogbjQxICsgbjE0ICogbjIxICogbjQyIC0gbjExICogbjI0ICogbjQyIC0gbjEyICogbjIxICogbjQ0ICsgbjExICogbjIyICogbjQ0ICkgKiBkZXRJbnY7XG5cdFx0dGVbIDExIF0gPSAoIG4xMyAqIG4yMiAqIG40MSAtIG4xMiAqIG4yMyAqIG40MSAtIG4xMyAqIG4yMSAqIG40MiArIG4xMSAqIG4yMyAqIG40MiArIG4xMiAqIG4yMSAqIG40MyAtIG4xMSAqIG4yMiAqIG40MyApICogZGV0SW52O1xuXG5cdFx0dGVbIDEyIF0gPSB0MTQgKiBkZXRJbnY7XG5cdFx0dGVbIDEzIF0gPSAoIG4xMyAqIG4yNCAqIG4zMSAtIG4xNCAqIG4yMyAqIG4zMSArIG4xNCAqIG4yMSAqIG4zMyAtIG4xMSAqIG4yNCAqIG4zMyAtIG4xMyAqIG4yMSAqIG4zNCArIG4xMSAqIG4yMyAqIG4zNCApICogZGV0SW52O1xuXHRcdHRlWyAxNCBdID0gKCBuMTQgKiBuMjIgKiBuMzEgLSBuMTIgKiBuMjQgKiBuMzEgLSBuMTQgKiBuMjEgKiBuMzIgKyBuMTEgKiBuMjQgKiBuMzIgKyBuMTIgKiBuMjEgKiBuMzQgLSBuMTEgKiBuMjIgKiBuMzQgKSAqIGRldEludjtcblx0XHR0ZVsgMTUgXSA9ICggbjEyICogbjIzICogbjMxIC0gbjEzICogbjIyICogbjMxICsgbjEzICogbjIxICogbjMyIC0gbjExICogbjIzICogbjMyIC0gbjEyICogbjIxICogbjMzICsgbjExICogbjIyICogbjMzICkgKiBkZXRJbnY7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNjYWxlOiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXHRcdHZhciB4ID0gdi54LCB5ID0gdi55LCB6ID0gdi56O1xuXG5cdFx0dGVbIDAgXSAqPSB4OyB0ZVsgNCBdICo9IHk7IHRlWyA4IF0gKj0gejtcblx0XHR0ZVsgMSBdICo9IHg7IHRlWyA1IF0gKj0geTsgdGVbIDkgXSAqPSB6O1xuXHRcdHRlWyAyIF0gKj0geDsgdGVbIDYgXSAqPSB5OyB0ZVsgMTAgXSAqPSB6O1xuXHRcdHRlWyAzIF0gKj0geDsgdGVbIDcgXSAqPSB5OyB0ZVsgMTEgXSAqPSB6O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRnZXRNYXhTY2FsZU9uQXhpczogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblxuXHRcdHZhciBzY2FsZVhTcSA9IHRlWyAwIF0gKiB0ZVsgMCBdICsgdGVbIDEgXSAqIHRlWyAxIF0gKyB0ZVsgMiBdICogdGVbIDIgXTtcblx0XHR2YXIgc2NhbGVZU3EgPSB0ZVsgNCBdICogdGVbIDQgXSArIHRlWyA1IF0gKiB0ZVsgNSBdICsgdGVbIDYgXSAqIHRlWyA2IF07XG5cdFx0dmFyIHNjYWxlWlNxID0gdGVbIDggXSAqIHRlWyA4IF0gKyB0ZVsgOSBdICogdGVbIDkgXSArIHRlWyAxMCBdICogdGVbIDEwIF07XG5cblx0XHRyZXR1cm4gTWF0aC5zcXJ0KCBNYXRoLm1heCggc2NhbGVYU3EsIHNjYWxlWVNxLCBzY2FsZVpTcSApICk7XG5cblx0fSxcblxuXHRtYWtlVHJhbnNsYXRpb246IGZ1bmN0aW9uICggeCwgeSwgeiApIHtcblxuXHRcdHRoaXMuc2V0KFxuXG5cdFx0XHQxLCAwLCAwLCB4LFxuXHRcdFx0MCwgMSwgMCwgeSxcblx0XHRcdDAsIDAsIDEsIHosXG5cdFx0XHQwLCAwLCAwLCAxXG5cblx0XHQpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtYWtlUm90YXRpb25YOiBmdW5jdGlvbiAoIHRoZXRhICkge1xuXG5cdFx0dmFyIGMgPSBNYXRoLmNvcyggdGhldGEgKSwgcyA9IE1hdGguc2luKCB0aGV0YSApO1xuXG5cdFx0dGhpcy5zZXQoXG5cblx0XHRcdDEsIDAsIDAsIDAsXG5cdFx0XHQwLCBjLCAtIHMsIDAsXG5cdFx0XHQwLCBzLCBjLCAwLFxuXHRcdFx0MCwgMCwgMCwgMVxuXG5cdFx0KTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bWFrZVJvdGF0aW9uWTogZnVuY3Rpb24gKCB0aGV0YSApIHtcblxuXHRcdHZhciBjID0gTWF0aC5jb3MoIHRoZXRhICksIHMgPSBNYXRoLnNpbiggdGhldGEgKTtcblxuXHRcdHRoaXMuc2V0KFxuXG5cdFx0XHQgYywgMCwgcywgMCxcblx0XHRcdCAwLCAxLCAwLCAwLFxuXHRcdFx0LSBzLCAwLCBjLCAwLFxuXHRcdFx0IDAsIDAsIDAsIDFcblxuXHRcdCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG1ha2VSb3RhdGlvblo6IGZ1bmN0aW9uICggdGhldGEgKSB7XG5cblx0XHR2YXIgYyA9IE1hdGguY29zKCB0aGV0YSApLCBzID0gTWF0aC5zaW4oIHRoZXRhICk7XG5cblx0XHR0aGlzLnNldChcblxuXHRcdFx0YywgLSBzLCAwLCAwLFxuXHRcdFx0cywgYywgMCwgMCxcblx0XHRcdDAsIDAsIDEsIDAsXG5cdFx0XHQwLCAwLCAwLCAxXG5cblx0XHQpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtYWtlUm90YXRpb25BeGlzOiBmdW5jdGlvbiAoIGF4aXMsIGFuZ2xlICkge1xuXG5cdFx0Ly8gQmFzZWQgb24gaHR0cDovL3d3dy5nYW1lZGV2Lm5ldC9yZWZlcmVuY2UvYXJ0aWNsZXMvYXJ0aWNsZTExOTkuYXNwXG5cblx0XHR2YXIgYyA9IE1hdGguY29zKCBhbmdsZSApO1xuXHRcdHZhciBzID0gTWF0aC5zaW4oIGFuZ2xlICk7XG5cdFx0dmFyIHQgPSAxIC0gYztcblx0XHR2YXIgeCA9IGF4aXMueCwgeSA9IGF4aXMueSwgeiA9IGF4aXMuejtcblx0XHR2YXIgdHggPSB0ICogeCwgdHkgPSB0ICogeTtcblxuXHRcdHRoaXMuc2V0KFxuXG5cdFx0XHR0eCAqIHggKyBjLCB0eCAqIHkgLSBzICogeiwgdHggKiB6ICsgcyAqIHksIDAsXG5cdFx0XHR0eCAqIHkgKyBzICogeiwgdHkgKiB5ICsgYywgdHkgKiB6IC0gcyAqIHgsIDAsXG5cdFx0XHR0eCAqIHogLSBzICogeSwgdHkgKiB6ICsgcyAqIHgsIHQgKiB6ICogeiArIGMsIDAsXG5cdFx0XHQwLCAwLCAwLCAxXG5cblx0XHQpO1xuXG5cdFx0IHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bWFrZVNjYWxlOiBmdW5jdGlvbiAoIHgsIHksIHogKSB7XG5cblx0XHR0aGlzLnNldChcblxuXHRcdFx0eCwgMCwgMCwgMCxcblx0XHRcdDAsIHksIDAsIDAsXG5cdFx0XHQwLCAwLCB6LCAwLFxuXHRcdFx0MCwgMCwgMCwgMVxuXG5cdFx0KTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bWFrZVNoZWFyOiBmdW5jdGlvbiAoIHgsIHksIHogKSB7XG5cblx0XHR0aGlzLnNldChcblxuXHRcdFx0MSwgeSwgeiwgMCxcblx0XHRcdHgsIDEsIHosIDAsXG5cdFx0XHR4LCB5LCAxLCAwLFxuXHRcdFx0MCwgMCwgMCwgMVxuXG5cdFx0KTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y29tcG9zZTogZnVuY3Rpb24gKCBwb3NpdGlvbiwgcXVhdGVybmlvbiwgc2NhbGUgKSB7XG5cblx0XHR0aGlzLm1ha2VSb3RhdGlvbkZyb21RdWF0ZXJuaW9uKCBxdWF0ZXJuaW9uICk7XG5cdFx0dGhpcy5zY2FsZSggc2NhbGUgKTtcblx0XHR0aGlzLnNldFBvc2l0aW9uKCBwb3NpdGlvbiApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRkZWNvbXBvc2U6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2ZWN0b3IgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciBtYXRyaXggPSBuZXcgTWF0cml4NCgpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGRlY29tcG9zZSggcG9zaXRpb24sIHF1YXRlcm5pb24sIHNjYWxlICkge1xuXG5cdFx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXG5cdFx0XHR2YXIgc3ggPSB2ZWN0b3Iuc2V0KCB0ZVsgMCBdLCB0ZVsgMSBdLCB0ZVsgMiBdICkubGVuZ3RoKCk7XG5cdFx0XHR2YXIgc3kgPSB2ZWN0b3Iuc2V0KCB0ZVsgNCBdLCB0ZVsgNSBdLCB0ZVsgNiBdICkubGVuZ3RoKCk7XG5cdFx0XHR2YXIgc3ogPSB2ZWN0b3Iuc2V0KCB0ZVsgOCBdLCB0ZVsgOSBdLCB0ZVsgMTAgXSApLmxlbmd0aCgpO1xuXG5cdFx0XHQvLyBpZiBkZXRlcm1pbmUgaXMgbmVnYXRpdmUsIHdlIG5lZWQgdG8gaW52ZXJ0IG9uZSBzY2FsZVxuXHRcdFx0dmFyIGRldCA9IHRoaXMuZGV0ZXJtaW5hbnQoKTtcblx0XHRcdGlmICggZGV0IDwgMCApIHN4ID0gLSBzeDtcblxuXHRcdFx0cG9zaXRpb24ueCA9IHRlWyAxMiBdO1xuXHRcdFx0cG9zaXRpb24ueSA9IHRlWyAxMyBdO1xuXHRcdFx0cG9zaXRpb24ueiA9IHRlWyAxNCBdO1xuXG5cdFx0XHQvLyBzY2FsZSB0aGUgcm90YXRpb24gcGFydFxuXHRcdFx0bWF0cml4LmNvcHkoIHRoaXMgKTtcblxuXHRcdFx0dmFyIGludlNYID0gMSAvIHN4O1xuXHRcdFx0dmFyIGludlNZID0gMSAvIHN5O1xuXHRcdFx0dmFyIGludlNaID0gMSAvIHN6O1xuXG5cdFx0XHRtYXRyaXguZWxlbWVudHNbIDAgXSAqPSBpbnZTWDtcblx0XHRcdG1hdHJpeC5lbGVtZW50c1sgMSBdICo9IGludlNYO1xuXHRcdFx0bWF0cml4LmVsZW1lbnRzWyAyIF0gKj0gaW52U1g7XG5cblx0XHRcdG1hdHJpeC5lbGVtZW50c1sgNCBdICo9IGludlNZO1xuXHRcdFx0bWF0cml4LmVsZW1lbnRzWyA1IF0gKj0gaW52U1k7XG5cdFx0XHRtYXRyaXguZWxlbWVudHNbIDYgXSAqPSBpbnZTWTtcblxuXHRcdFx0bWF0cml4LmVsZW1lbnRzWyA4IF0gKj0gaW52U1o7XG5cdFx0XHRtYXRyaXguZWxlbWVudHNbIDkgXSAqPSBpbnZTWjtcblx0XHRcdG1hdHJpeC5lbGVtZW50c1sgMTAgXSAqPSBpbnZTWjtcblxuXHRcdFx0cXVhdGVybmlvbi5zZXRGcm9tUm90YXRpb25NYXRyaXgoIG1hdHJpeCApO1xuXG5cdFx0XHRzY2FsZS54ID0gc3g7XG5cdFx0XHRzY2FsZS55ID0gc3k7XG5cdFx0XHRzY2FsZS56ID0gc3o7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0bWFrZVBlcnNwZWN0aXZlOiBmdW5jdGlvbiAoIGxlZnQsIHJpZ2h0LCB0b3AsIGJvdHRvbSwgbmVhciwgZmFyICkge1xuXG5cdFx0aWYgKCBmYXIgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0cml4NDogLm1ha2VQZXJzcGVjdGl2ZSgpIGhhcyBiZWVuIHJlZGVmaW5lZCBhbmQgaGFzIGEgbmV3IHNpZ25hdHVyZS4gUGxlYXNlIGNoZWNrIHRoZSBkb2NzLicgKTtcblxuXHRcdH1cblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cdFx0dmFyIHggPSAyICogbmVhciAvICggcmlnaHQgLSBsZWZ0ICk7XG5cdFx0dmFyIHkgPSAyICogbmVhciAvICggdG9wIC0gYm90dG9tICk7XG5cblx0XHR2YXIgYSA9ICggcmlnaHQgKyBsZWZ0ICkgLyAoIHJpZ2h0IC0gbGVmdCApO1xuXHRcdHZhciBiID0gKCB0b3AgKyBib3R0b20gKSAvICggdG9wIC0gYm90dG9tICk7XG5cdFx0dmFyIGMgPSAtICggZmFyICsgbmVhciApIC8gKCBmYXIgLSBuZWFyICk7XG5cdFx0dmFyIGQgPSAtIDIgKiBmYXIgKiBuZWFyIC8gKCBmYXIgLSBuZWFyICk7XG5cblx0XHR0ZVsgMCBdID0geDtcdHRlWyA0IF0gPSAwO1x0dGVbIDggXSA9IGE7XHR0ZVsgMTIgXSA9IDA7XG5cdFx0dGVbIDEgXSA9IDA7XHR0ZVsgNSBdID0geTtcdHRlWyA5IF0gPSBiO1x0dGVbIDEzIF0gPSAwO1xuXHRcdHRlWyAyIF0gPSAwO1x0dGVbIDYgXSA9IDA7XHR0ZVsgMTAgXSA9IGM7XHR0ZVsgMTQgXSA9IGQ7XG5cdFx0dGVbIDMgXSA9IDA7XHR0ZVsgNyBdID0gMDtcdHRlWyAxMSBdID0gLSAxO1x0dGVbIDE1IF0gPSAwO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtYWtlT3J0aG9ncmFwaGljOiBmdW5jdGlvbiAoIGxlZnQsIHJpZ2h0LCB0b3AsIGJvdHRvbSwgbmVhciwgZmFyICkge1xuXG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblx0XHR2YXIgdyA9IDEuMCAvICggcmlnaHQgLSBsZWZ0ICk7XG5cdFx0dmFyIGggPSAxLjAgLyAoIHRvcCAtIGJvdHRvbSApO1xuXHRcdHZhciBwID0gMS4wIC8gKCBmYXIgLSBuZWFyICk7XG5cblx0XHR2YXIgeCA9ICggcmlnaHQgKyBsZWZ0ICkgKiB3O1xuXHRcdHZhciB5ID0gKCB0b3AgKyBib3R0b20gKSAqIGg7XG5cdFx0dmFyIHogPSAoIGZhciArIG5lYXIgKSAqIHA7XG5cblx0XHR0ZVsgMCBdID0gMiAqIHc7XHR0ZVsgNCBdID0gMDtcdHRlWyA4IF0gPSAwO1x0dGVbIDEyIF0gPSAtIHg7XG5cdFx0dGVbIDEgXSA9IDA7XHR0ZVsgNSBdID0gMiAqIGg7XHR0ZVsgOSBdID0gMDtcdHRlWyAxMyBdID0gLSB5O1xuXHRcdHRlWyAyIF0gPSAwO1x0dGVbIDYgXSA9IDA7XHR0ZVsgMTAgXSA9IC0gMiAqIHA7XHR0ZVsgMTQgXSA9IC0gejtcblx0XHR0ZVsgMyBdID0gMDtcdHRlWyA3IF0gPSAwO1x0dGVbIDExIF0gPSAwO1x0dGVbIDE1IF0gPSAxO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRlcXVhbHM6IGZ1bmN0aW9uICggbWF0cml4ICkge1xuXG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblx0XHR2YXIgbWUgPSBtYXRyaXguZWxlbWVudHM7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCAxNjsgaSArKyApIHtcblxuXHRcdFx0aWYgKCB0ZVsgaSBdICE9PSBtZVsgaSBdICkgcmV0dXJuIGZhbHNlO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRydWU7XG5cblx0fSxcblxuXHRmcm9tQXJyYXk6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCApIHtcblxuXHRcdGlmICggb2Zmc2V0ID09PSB1bmRlZmluZWQgKSBvZmZzZXQgPSAwO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgMTY7IGkgKysgKSB7XG5cblx0XHRcdHRoaXMuZWxlbWVudHNbIGkgXSA9IGFycmF5WyBpICsgb2Zmc2V0IF07XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHRvQXJyYXk6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCApIHtcblxuXHRcdGlmICggYXJyYXkgPT09IHVuZGVmaW5lZCApIGFycmF5ID0gW107XG5cdFx0aWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7XG5cblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXG5cdFx0YXJyYXlbIG9mZnNldCBdID0gdGVbIDAgXTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMSBdID0gdGVbIDEgXTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMiBdID0gdGVbIDIgXTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMyBdID0gdGVbIDMgXTtcblxuXHRcdGFycmF5WyBvZmZzZXQgKyA0IF0gPSB0ZVsgNCBdO1xuXHRcdGFycmF5WyBvZmZzZXQgKyA1IF0gPSB0ZVsgNSBdO1xuXHRcdGFycmF5WyBvZmZzZXQgKyA2IF0gPSB0ZVsgNiBdO1xuXHRcdGFycmF5WyBvZmZzZXQgKyA3IF0gPSB0ZVsgNyBdO1xuXG5cdFx0YXJyYXlbIG9mZnNldCArIDggXSA9IHRlWyA4IF07XG5cdFx0YXJyYXlbIG9mZnNldCArIDkgXSA9IHRlWyA5IF07XG5cdFx0YXJyYXlbIG9mZnNldCArIDEwIF0gPSB0ZVsgMTAgXTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMTEgXSA9IHRlWyAxMSBdO1xuXG5cdFx0YXJyYXlbIG9mZnNldCArIDEyIF0gPSB0ZVsgMTIgXTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMTMgXSA9IHRlWyAxMyBdO1xuXHRcdGFycmF5WyBvZmZzZXQgKyAxNCBdID0gdGVbIDE0IF07XG5cdFx0YXJyYXlbIG9mZnNldCArIDE1IF0gPSB0ZVsgMTUgXTtcblxuXHRcdHJldHVybiBhcnJheTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1pa2FlbCBlbXRpbmdlciAvIGh0dHA6Ly9nb21vLnNlL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleVxuICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pb1xuICovXG5cbmZ1bmN0aW9uIFF1YXRlcm5pb24oIHgsIHksIHosIHcgKSB7XG5cblx0dGhpcy5feCA9IHggfHwgMDtcblx0dGhpcy5feSA9IHkgfHwgMDtcblx0dGhpcy5feiA9IHogfHwgMDtcblx0dGhpcy5fdyA9ICggdyAhPT0gdW5kZWZpbmVkICkgPyB3IDogMTtcblxufVxuXG5PYmplY3QuYXNzaWduKCBRdWF0ZXJuaW9uLCB7XG5cblx0c2xlcnA6IGZ1bmN0aW9uICggcWEsIHFiLCBxbSwgdCApIHtcblxuXHRcdHJldHVybiBxbS5jb3B5KCBxYSApLnNsZXJwKCBxYiwgdCApO1xuXG5cdH0sXG5cblx0c2xlcnBGbGF0OiBmdW5jdGlvbiAoIGRzdCwgZHN0T2Zmc2V0LCBzcmMwLCBzcmNPZmZzZXQwLCBzcmMxLCBzcmNPZmZzZXQxLCB0ICkge1xuXG5cdFx0Ly8gZnV6ei1mcmVlLCBhcnJheS1iYXNlZCBRdWF0ZXJuaW9uIFNMRVJQIG9wZXJhdGlvblxuXG5cdFx0dmFyIHgwID0gc3JjMFsgc3JjT2Zmc2V0MCArIDAgXSxcblx0XHRcdHkwID0gc3JjMFsgc3JjT2Zmc2V0MCArIDEgXSxcblx0XHRcdHowID0gc3JjMFsgc3JjT2Zmc2V0MCArIDIgXSxcblx0XHRcdHcwID0gc3JjMFsgc3JjT2Zmc2V0MCArIDMgXSxcblxuXHRcdFx0eDEgPSBzcmMxWyBzcmNPZmZzZXQxICsgMCBdLFxuXHRcdFx0eTEgPSBzcmMxWyBzcmNPZmZzZXQxICsgMSBdLFxuXHRcdFx0ejEgPSBzcmMxWyBzcmNPZmZzZXQxICsgMiBdLFxuXHRcdFx0dzEgPSBzcmMxWyBzcmNPZmZzZXQxICsgMyBdO1xuXG5cdFx0aWYgKCB3MCAhPT0gdzEgfHwgeDAgIT09IHgxIHx8IHkwICE9PSB5MSB8fCB6MCAhPT0gejEgKSB7XG5cblx0XHRcdHZhciBzID0gMSAtIHQsXG5cblx0XHRcdFx0Y29zID0geDAgKiB4MSArIHkwICogeTEgKyB6MCAqIHoxICsgdzAgKiB3MSxcblxuXHRcdFx0XHRkaXIgPSAoIGNvcyA+PSAwID8gMSA6IC0gMSApLFxuXHRcdFx0XHRzcXJTaW4gPSAxIC0gY29zICogY29zO1xuXG5cdFx0XHQvLyBTa2lwIHRoZSBTbGVycCBmb3IgdGlueSBzdGVwcyB0byBhdm9pZCBudW1lcmljIHByb2JsZW1zOlxuXHRcdFx0aWYgKCBzcXJTaW4gPiBOdW1iZXIuRVBTSUxPTiApIHtcblxuXHRcdFx0XHR2YXIgc2luID0gTWF0aC5zcXJ0KCBzcXJTaW4gKSxcblx0XHRcdFx0XHRsZW4gPSBNYXRoLmF0YW4yKCBzaW4sIGNvcyAqIGRpciApO1xuXG5cdFx0XHRcdHMgPSBNYXRoLnNpbiggcyAqIGxlbiApIC8gc2luO1xuXHRcdFx0XHR0ID0gTWF0aC5zaW4oIHQgKiBsZW4gKSAvIHNpbjtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgdERpciA9IHQgKiBkaXI7XG5cblx0XHRcdHgwID0geDAgKiBzICsgeDEgKiB0RGlyO1xuXHRcdFx0eTAgPSB5MCAqIHMgKyB5MSAqIHREaXI7XG5cdFx0XHR6MCA9IHowICogcyArIHoxICogdERpcjtcblx0XHRcdHcwID0gdzAgKiBzICsgdzEgKiB0RGlyO1xuXG5cdFx0XHQvLyBOb3JtYWxpemUgaW4gY2FzZSB3ZSBqdXN0IGRpZCBhIGxlcnA6XG5cdFx0XHRpZiAoIHMgPT09IDEgLSB0ICkge1xuXG5cdFx0XHRcdHZhciBmID0gMSAvIE1hdGguc3FydCggeDAgKiB4MCArIHkwICogeTAgKyB6MCAqIHowICsgdzAgKiB3MCApO1xuXG5cdFx0XHRcdHgwICo9IGY7XG5cdFx0XHRcdHkwICo9IGY7XG5cdFx0XHRcdHowICo9IGY7XG5cdFx0XHRcdHcwICo9IGY7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGRzdFsgZHN0T2Zmc2V0IF0gPSB4MDtcblx0XHRkc3RbIGRzdE9mZnNldCArIDEgXSA9IHkwO1xuXHRcdGRzdFsgZHN0T2Zmc2V0ICsgMiBdID0gejA7XG5cdFx0ZHN0WyBkc3RPZmZzZXQgKyAzIF0gPSB3MDtcblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIFF1YXRlcm5pb24ucHJvdG90eXBlLCB7XG5cblx0eDoge1xuXG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLl94O1xuXG5cdFx0fSxcblxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0dGhpcy5feCA9IHZhbHVlO1xuXHRcdFx0dGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHR9XG5cblx0fSxcblxuXHR5OiB7XG5cblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMuX3k7XG5cblx0XHR9LFxuXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHR0aGlzLl95ID0gdmFsdWU7XG5cdFx0XHR0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdHo6IHtcblxuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5fejtcblxuXHRcdH0sXG5cblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdHRoaXMuX3ogPSB2YWx1ZTtcblx0XHRcdHRoaXMub25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0dzoge1xuXG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLl93O1xuXG5cdFx0fSxcblxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0dGhpcy5fdyA9IHZhbHVlO1xuXHRcdFx0dGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHR9XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5hc3NpZ24oIFF1YXRlcm5pb24ucHJvdG90eXBlLCB7XG5cblx0c2V0OiBmdW5jdGlvbiAoIHgsIHksIHosIHcgKSB7XG5cblx0XHR0aGlzLl94ID0geDtcblx0XHR0aGlzLl95ID0geTtcblx0XHR0aGlzLl96ID0gejtcblx0XHR0aGlzLl93ID0gdztcblxuXHRcdHRoaXMub25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCB0aGlzLl94LCB0aGlzLl95LCB0aGlzLl96LCB0aGlzLl93ICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHF1YXRlcm5pb24gKSB7XG5cblx0XHR0aGlzLl94ID0gcXVhdGVybmlvbi54O1xuXHRcdHRoaXMuX3kgPSBxdWF0ZXJuaW9uLnk7XG5cdFx0dGhpcy5feiA9IHF1YXRlcm5pb24uejtcblx0XHR0aGlzLl93ID0gcXVhdGVybmlvbi53O1xuXG5cdFx0dGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21FdWxlcjogZnVuY3Rpb24gKCBldWxlciwgdXBkYXRlICkge1xuXG5cdFx0aWYgKCAhICggZXVsZXIgJiYgZXVsZXIuaXNFdWxlciApICkge1xuXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoICdUSFJFRS5RdWF0ZXJuaW9uOiAuc2V0RnJvbUV1bGVyKCkgbm93IGV4cGVjdHMgYW4gRXVsZXIgcm90YXRpb24gcmF0aGVyIHRoYW4gYSBWZWN0b3IzIGFuZCBvcmRlci4nICk7XG5cblx0XHR9XG5cblx0XHR2YXIgeCA9IGV1bGVyLl94LCB5ID0gZXVsZXIuX3ksIHogPSBldWxlci5feiwgb3JkZXIgPSBldWxlci5vcmRlcjtcblxuXHRcdC8vIGh0dHA6Ly93d3cubWF0aHdvcmtzLmNvbS9tYXRsYWJjZW50cmFsL2ZpbGVleGNoYW5nZS9cblx0XHQvLyBcdDIwNjk2LWZ1bmN0aW9uLXRvLWNvbnZlcnQtYmV0d2Vlbi1kY20tZXVsZXItYW5nbGVzLXF1YXRlcm5pb25zLWFuZC1ldWxlci12ZWN0b3JzL1xuXHRcdC8vXHRjb250ZW50L1NwaW5DYWxjLm1cblxuXHRcdHZhciBjb3MgPSBNYXRoLmNvcztcblx0XHR2YXIgc2luID0gTWF0aC5zaW47XG5cblx0XHR2YXIgYzEgPSBjb3MoIHggLyAyICk7XG5cdFx0dmFyIGMyID0gY29zKCB5IC8gMiApO1xuXHRcdHZhciBjMyA9IGNvcyggeiAvIDIgKTtcblxuXHRcdHZhciBzMSA9IHNpbiggeCAvIDIgKTtcblx0XHR2YXIgczIgPSBzaW4oIHkgLyAyICk7XG5cdFx0dmFyIHMzID0gc2luKCB6IC8gMiApO1xuXG5cdFx0aWYgKCBvcmRlciA9PT0gJ1hZWicgKSB7XG5cblx0XHRcdHRoaXMuX3ggPSBzMSAqIGMyICogYzMgKyBjMSAqIHMyICogczM7XG5cdFx0XHR0aGlzLl95ID0gYzEgKiBzMiAqIGMzIC0gczEgKiBjMiAqIHMzO1xuXHRcdFx0dGhpcy5feiA9IGMxICogYzIgKiBzMyArIHMxICogczIgKiBjMztcblx0XHRcdHRoaXMuX3cgPSBjMSAqIGMyICogYzMgLSBzMSAqIHMyICogczM7XG5cblx0XHR9IGVsc2UgaWYgKCBvcmRlciA9PT0gJ1lYWicgKSB7XG5cblx0XHRcdHRoaXMuX3ggPSBzMSAqIGMyICogYzMgKyBjMSAqIHMyICogczM7XG5cdFx0XHR0aGlzLl95ID0gYzEgKiBzMiAqIGMzIC0gczEgKiBjMiAqIHMzO1xuXHRcdFx0dGhpcy5feiA9IGMxICogYzIgKiBzMyAtIHMxICogczIgKiBjMztcblx0XHRcdHRoaXMuX3cgPSBjMSAqIGMyICogYzMgKyBzMSAqIHMyICogczM7XG5cblx0XHR9IGVsc2UgaWYgKCBvcmRlciA9PT0gJ1pYWScgKSB7XG5cblx0XHRcdHRoaXMuX3ggPSBzMSAqIGMyICogYzMgLSBjMSAqIHMyICogczM7XG5cdFx0XHR0aGlzLl95ID0gYzEgKiBzMiAqIGMzICsgczEgKiBjMiAqIHMzO1xuXHRcdFx0dGhpcy5feiA9IGMxICogYzIgKiBzMyArIHMxICogczIgKiBjMztcblx0XHRcdHRoaXMuX3cgPSBjMSAqIGMyICogYzMgLSBzMSAqIHMyICogczM7XG5cblx0XHR9IGVsc2UgaWYgKCBvcmRlciA9PT0gJ1pZWCcgKSB7XG5cblx0XHRcdHRoaXMuX3ggPSBzMSAqIGMyICogYzMgLSBjMSAqIHMyICogczM7XG5cdFx0XHR0aGlzLl95ID0gYzEgKiBzMiAqIGMzICsgczEgKiBjMiAqIHMzO1xuXHRcdFx0dGhpcy5feiA9IGMxICogYzIgKiBzMyAtIHMxICogczIgKiBjMztcblx0XHRcdHRoaXMuX3cgPSBjMSAqIGMyICogYzMgKyBzMSAqIHMyICogczM7XG5cblx0XHR9IGVsc2UgaWYgKCBvcmRlciA9PT0gJ1laWCcgKSB7XG5cblx0XHRcdHRoaXMuX3ggPSBzMSAqIGMyICogYzMgKyBjMSAqIHMyICogczM7XG5cdFx0XHR0aGlzLl95ID0gYzEgKiBzMiAqIGMzICsgczEgKiBjMiAqIHMzO1xuXHRcdFx0dGhpcy5feiA9IGMxICogYzIgKiBzMyAtIHMxICogczIgKiBjMztcblx0XHRcdHRoaXMuX3cgPSBjMSAqIGMyICogYzMgLSBzMSAqIHMyICogczM7XG5cblx0XHR9IGVsc2UgaWYgKCBvcmRlciA9PT0gJ1haWScgKSB7XG5cblx0XHRcdHRoaXMuX3ggPSBzMSAqIGMyICogYzMgLSBjMSAqIHMyICogczM7XG5cdFx0XHR0aGlzLl95ID0gYzEgKiBzMiAqIGMzIC0gczEgKiBjMiAqIHMzO1xuXHRcdFx0dGhpcy5feiA9IGMxICogYzIgKiBzMyArIHMxICogczIgKiBjMztcblx0XHRcdHRoaXMuX3cgPSBjMSAqIGMyICogYzMgKyBzMSAqIHMyICogczM7XG5cblx0XHR9XG5cblx0XHRpZiAoIHVwZGF0ZSAhPT0gZmFsc2UgKSB0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbUF4aXNBbmdsZTogZnVuY3Rpb24gKCBheGlzLCBhbmdsZSApIHtcblxuXHRcdC8vIGh0dHA6Ly93d3cuZXVjbGlkZWFuc3BhY2UuY29tL21hdGhzL2dlb21ldHJ5L3JvdGF0aW9ucy9jb252ZXJzaW9ucy9hbmdsZVRvUXVhdGVybmlvbi9pbmRleC5odG1cblxuXHRcdC8vIGFzc3VtZXMgYXhpcyBpcyBub3JtYWxpemVkXG5cblx0XHR2YXIgaGFsZkFuZ2xlID0gYW5nbGUgLyAyLCBzID0gTWF0aC5zaW4oIGhhbGZBbmdsZSApO1xuXG5cdFx0dGhpcy5feCA9IGF4aXMueCAqIHM7XG5cdFx0dGhpcy5feSA9IGF4aXMueSAqIHM7XG5cdFx0dGhpcy5feiA9IGF4aXMueiAqIHM7XG5cdFx0dGhpcy5fdyA9IE1hdGguY29zKCBoYWxmQW5nbGUgKTtcblxuXHRcdHRoaXMub25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRGcm9tUm90YXRpb25NYXRyaXg6IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdC8vIGh0dHA6Ly93d3cuZXVjbGlkZWFuc3BhY2UuY29tL21hdGhzL2dlb21ldHJ5L3JvdGF0aW9ucy9jb252ZXJzaW9ucy9tYXRyaXhUb1F1YXRlcm5pb24vaW5kZXguaHRtXG5cblx0XHQvLyBhc3N1bWVzIHRoZSB1cHBlciAzeDMgb2YgbSBpcyBhIHB1cmUgcm90YXRpb24gbWF0cml4IChpLmUsIHVuc2NhbGVkKVxuXG5cdFx0dmFyIHRlID0gbS5lbGVtZW50cyxcblxuXHRcdFx0bTExID0gdGVbIDAgXSwgbTEyID0gdGVbIDQgXSwgbTEzID0gdGVbIDggXSxcblx0XHRcdG0yMSA9IHRlWyAxIF0sIG0yMiA9IHRlWyA1IF0sIG0yMyA9IHRlWyA5IF0sXG5cdFx0XHRtMzEgPSB0ZVsgMiBdLCBtMzIgPSB0ZVsgNiBdLCBtMzMgPSB0ZVsgMTAgXSxcblxuXHRcdFx0dHJhY2UgPSBtMTEgKyBtMjIgKyBtMzMsXG5cdFx0XHRzO1xuXG5cdFx0aWYgKCB0cmFjZSA+IDAgKSB7XG5cblx0XHRcdHMgPSAwLjUgLyBNYXRoLnNxcnQoIHRyYWNlICsgMS4wICk7XG5cblx0XHRcdHRoaXMuX3cgPSAwLjI1IC8gcztcblx0XHRcdHRoaXMuX3ggPSAoIG0zMiAtIG0yMyApICogcztcblx0XHRcdHRoaXMuX3kgPSAoIG0xMyAtIG0zMSApICogcztcblx0XHRcdHRoaXMuX3ogPSAoIG0yMSAtIG0xMiApICogcztcblxuXHRcdH0gZWxzZSBpZiAoIG0xMSA+IG0yMiAmJiBtMTEgPiBtMzMgKSB7XG5cblx0XHRcdHMgPSAyLjAgKiBNYXRoLnNxcnQoIDEuMCArIG0xMSAtIG0yMiAtIG0zMyApO1xuXG5cdFx0XHR0aGlzLl93ID0gKCBtMzIgLSBtMjMgKSAvIHM7XG5cdFx0XHR0aGlzLl94ID0gMC4yNSAqIHM7XG5cdFx0XHR0aGlzLl95ID0gKCBtMTIgKyBtMjEgKSAvIHM7XG5cdFx0XHR0aGlzLl96ID0gKCBtMTMgKyBtMzEgKSAvIHM7XG5cblx0XHR9IGVsc2UgaWYgKCBtMjIgPiBtMzMgKSB7XG5cblx0XHRcdHMgPSAyLjAgKiBNYXRoLnNxcnQoIDEuMCArIG0yMiAtIG0xMSAtIG0zMyApO1xuXG5cdFx0XHR0aGlzLl93ID0gKCBtMTMgLSBtMzEgKSAvIHM7XG5cdFx0XHR0aGlzLl94ID0gKCBtMTIgKyBtMjEgKSAvIHM7XG5cdFx0XHR0aGlzLl95ID0gMC4yNSAqIHM7XG5cdFx0XHR0aGlzLl96ID0gKCBtMjMgKyBtMzIgKSAvIHM7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRzID0gMi4wICogTWF0aC5zcXJ0KCAxLjAgKyBtMzMgLSBtMTEgLSBtMjIgKTtcblxuXHRcdFx0dGhpcy5fdyA9ICggbTIxIC0gbTEyICkgLyBzO1xuXHRcdFx0dGhpcy5feCA9ICggbTEzICsgbTMxICkgLyBzO1xuXHRcdFx0dGhpcy5feSA9ICggbTIzICsgbTMyICkgLyBzO1xuXHRcdFx0dGhpcy5feiA9IDAuMjUgKiBzO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21Vbml0VmVjdG9yczogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gYXNzdW1lcyBkaXJlY3Rpb24gdmVjdG9ycyB2RnJvbSBhbmQgdlRvIGFyZSBub3JtYWxpemVkXG5cblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciByO1xuXG5cdFx0dmFyIEVQUyA9IDAuMDAwMDAxO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHNldEZyb21Vbml0VmVjdG9ycyggdkZyb20sIHZUbyApIHtcblxuXHRcdFx0aWYgKCB2MSA9PT0gdW5kZWZpbmVkICkgdjEgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0XHRyID0gdkZyb20uZG90KCB2VG8gKSArIDE7XG5cblx0XHRcdGlmICggciA8IEVQUyApIHtcblxuXHRcdFx0XHRyID0gMDtcblxuXHRcdFx0XHRpZiAoIE1hdGguYWJzKCB2RnJvbS54ICkgPiBNYXRoLmFicyggdkZyb20ueiApICkge1xuXG5cdFx0XHRcdFx0djEuc2V0KCAtIHZGcm9tLnksIHZGcm9tLngsIDAgKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0djEuc2V0KCAwLCAtIHZGcm9tLnosIHZGcm9tLnkgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0djEuY3Jvc3NWZWN0b3JzKCB2RnJvbSwgdlRvICk7XG5cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5feCA9IHYxLng7XG5cdFx0XHR0aGlzLl95ID0gdjEueTtcblx0XHRcdHRoaXMuX3ogPSB2MS56O1xuXHRcdFx0dGhpcy5fdyA9IHI7XG5cblx0XHRcdHJldHVybiB0aGlzLm5vcm1hbGl6ZSgpO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0aW52ZXJzZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gcXVhdGVybmlvbiBpcyBhc3N1bWVkIHRvIGhhdmUgdW5pdCBsZW5ndGhcblxuXHRcdHJldHVybiB0aGlzLmNvbmp1Z2F0ZSgpO1xuXG5cdH0sXG5cblx0Y29uanVnYXRlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLl94ICo9IC0gMTtcblx0XHR0aGlzLl95ICo9IC0gMTtcblx0XHR0aGlzLl96ICo9IC0gMTtcblxuXHRcdHRoaXMub25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRkb3Q6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHJldHVybiB0aGlzLl94ICogdi5feCArIHRoaXMuX3kgKiB2Ll95ICsgdGhpcy5feiAqIHYuX3ogKyB0aGlzLl93ICogdi5fdztcblxuXHR9LFxuXG5cdGxlbmd0aFNxOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5feCAqIHRoaXMuX3ggKyB0aGlzLl95ICogdGhpcy5feSArIHRoaXMuX3ogKiB0aGlzLl96ICsgdGhpcy5fdyAqIHRoaXMuX3c7XG5cblx0fSxcblxuXHRsZW5ndGg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBNYXRoLnNxcnQoIHRoaXMuX3ggKiB0aGlzLl94ICsgdGhpcy5feSAqIHRoaXMuX3kgKyB0aGlzLl96ICogdGhpcy5feiArIHRoaXMuX3cgKiB0aGlzLl93ICk7XG5cblx0fSxcblxuXHRub3JtYWxpemU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBsID0gdGhpcy5sZW5ndGgoKTtcblxuXHRcdGlmICggbCA9PT0gMCApIHtcblxuXHRcdFx0dGhpcy5feCA9IDA7XG5cdFx0XHR0aGlzLl95ID0gMDtcblx0XHRcdHRoaXMuX3ogPSAwO1xuXHRcdFx0dGhpcy5fdyA9IDE7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRsID0gMSAvIGw7XG5cblx0XHRcdHRoaXMuX3ggPSB0aGlzLl94ICogbDtcblx0XHRcdHRoaXMuX3kgPSB0aGlzLl95ICogbDtcblx0XHRcdHRoaXMuX3ogPSB0aGlzLl96ICogbDtcblx0XHRcdHRoaXMuX3cgPSB0aGlzLl93ICogbDtcblxuXHRcdH1cblxuXHRcdHRoaXMub25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtdWx0aXBseTogZnVuY3Rpb24gKCBxLCBwICkge1xuXG5cdFx0aWYgKCBwICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlF1YXRlcm5pb246IC5tdWx0aXBseSgpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLm11bHRpcGx5UXVhdGVybmlvbnMoIGEsIGIgKSBpbnN0ZWFkLicgKTtcblx0XHRcdHJldHVybiB0aGlzLm11bHRpcGx5UXVhdGVybmlvbnMoIHEsIHAgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLm11bHRpcGx5UXVhdGVybmlvbnMoIHRoaXMsIHEgKTtcblxuXHR9LFxuXG5cdHByZW11bHRpcGx5OiBmdW5jdGlvbiAoIHEgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5tdWx0aXBseVF1YXRlcm5pb25zKCBxLCB0aGlzICk7XG5cblx0fSxcblxuXHRtdWx0aXBseVF1YXRlcm5pb25zOiBmdW5jdGlvbiAoIGEsIGIgKSB7XG5cblx0XHQvLyBmcm9tIGh0dHA6Ly93d3cuZXVjbGlkZWFuc3BhY2UuY29tL21hdGhzL2FsZ2VicmEvcmVhbE5vcm1lZEFsZ2VicmEvcXVhdGVybmlvbnMvY29kZS9pbmRleC5odG1cblxuXHRcdHZhciBxYXggPSBhLl94LCBxYXkgPSBhLl95LCBxYXogPSBhLl96LCBxYXcgPSBhLl93O1xuXHRcdHZhciBxYnggPSBiLl94LCBxYnkgPSBiLl95LCBxYnogPSBiLl96LCBxYncgPSBiLl93O1xuXG5cdFx0dGhpcy5feCA9IHFheCAqIHFidyArIHFhdyAqIHFieCArIHFheSAqIHFieiAtIHFheiAqIHFieTtcblx0XHR0aGlzLl95ID0gcWF5ICogcWJ3ICsgcWF3ICogcWJ5ICsgcWF6ICogcWJ4IC0gcWF4ICogcWJ6O1xuXHRcdHRoaXMuX3ogPSBxYXogKiBxYncgKyBxYXcgKiBxYnogKyBxYXggKiBxYnkgLSBxYXkgKiBxYng7XG5cdFx0dGhpcy5fdyA9IHFhdyAqIHFidyAtIHFheCAqIHFieCAtIHFheSAqIHFieSAtIHFheiAqIHFiejtcblxuXHRcdHRoaXMub25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzbGVycDogZnVuY3Rpb24gKCBxYiwgdCApIHtcblxuXHRcdGlmICggdCA9PT0gMCApIHJldHVybiB0aGlzO1xuXHRcdGlmICggdCA9PT0gMSApIHJldHVybiB0aGlzLmNvcHkoIHFiICk7XG5cblx0XHR2YXIgeCA9IHRoaXMuX3gsIHkgPSB0aGlzLl95LCB6ID0gdGhpcy5feiwgdyA9IHRoaXMuX3c7XG5cblx0XHQvLyBodHRwOi8vd3d3LmV1Y2xpZGVhbnNwYWNlLmNvbS9tYXRocy9hbGdlYnJhL3JlYWxOb3JtZWRBbGdlYnJhL3F1YXRlcm5pb25zL3NsZXJwL1xuXG5cdFx0dmFyIGNvc0hhbGZUaGV0YSA9IHcgKiBxYi5fdyArIHggKiBxYi5feCArIHkgKiBxYi5feSArIHogKiBxYi5fejtcblxuXHRcdGlmICggY29zSGFsZlRoZXRhIDwgMCApIHtcblxuXHRcdFx0dGhpcy5fdyA9IC0gcWIuX3c7XG5cdFx0XHR0aGlzLl94ID0gLSBxYi5feDtcblx0XHRcdHRoaXMuX3kgPSAtIHFiLl95O1xuXHRcdFx0dGhpcy5feiA9IC0gcWIuX3o7XG5cblx0XHRcdGNvc0hhbGZUaGV0YSA9IC0gY29zSGFsZlRoZXRhO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dGhpcy5jb3B5KCBxYiApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBjb3NIYWxmVGhldGEgPj0gMS4wICkge1xuXG5cdFx0XHR0aGlzLl93ID0gdztcblx0XHRcdHRoaXMuX3ggPSB4O1xuXHRcdFx0dGhpcy5feSA9IHk7XG5cdFx0XHR0aGlzLl96ID0gejtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9XG5cblx0XHR2YXIgc2luSGFsZlRoZXRhID0gTWF0aC5zcXJ0KCAxLjAgLSBjb3NIYWxmVGhldGEgKiBjb3NIYWxmVGhldGEgKTtcblxuXHRcdGlmICggTWF0aC5hYnMoIHNpbkhhbGZUaGV0YSApIDwgMC4wMDEgKSB7XG5cblx0XHRcdHRoaXMuX3cgPSAwLjUgKiAoIHcgKyB0aGlzLl93ICk7XG5cdFx0XHR0aGlzLl94ID0gMC41ICogKCB4ICsgdGhpcy5feCApO1xuXHRcdFx0dGhpcy5feSA9IDAuNSAqICggeSArIHRoaXMuX3kgKTtcblx0XHRcdHRoaXMuX3ogPSAwLjUgKiAoIHogKyB0aGlzLl96ICk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fVxuXG5cdFx0dmFyIGhhbGZUaGV0YSA9IE1hdGguYXRhbjIoIHNpbkhhbGZUaGV0YSwgY29zSGFsZlRoZXRhICk7XG5cdFx0dmFyIHJhdGlvQSA9IE1hdGguc2luKCAoIDEgLSB0ICkgKiBoYWxmVGhldGEgKSAvIHNpbkhhbGZUaGV0YSxcblx0XHRcdHJhdGlvQiA9IE1hdGguc2luKCB0ICogaGFsZlRoZXRhICkgLyBzaW5IYWxmVGhldGE7XG5cblx0XHR0aGlzLl93ID0gKCB3ICogcmF0aW9BICsgdGhpcy5fdyAqIHJhdGlvQiApO1xuXHRcdHRoaXMuX3ggPSAoIHggKiByYXRpb0EgKyB0aGlzLl94ICogcmF0aW9CICk7XG5cdFx0dGhpcy5feSA9ICggeSAqIHJhdGlvQSArIHRoaXMuX3kgKiByYXRpb0IgKTtcblx0XHR0aGlzLl96ID0gKCB6ICogcmF0aW9BICsgdGhpcy5feiAqIHJhdGlvQiApO1xuXG5cdFx0dGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGVxdWFsczogZnVuY3Rpb24gKCBxdWF0ZXJuaW9uICkge1xuXG5cdFx0cmV0dXJuICggcXVhdGVybmlvbi5feCA9PT0gdGhpcy5feCApICYmICggcXVhdGVybmlvbi5feSA9PT0gdGhpcy5feSApICYmICggcXVhdGVybmlvbi5feiA9PT0gdGhpcy5feiApICYmICggcXVhdGVybmlvbi5fdyA9PT0gdGhpcy5fdyApO1xuXG5cdH0sXG5cblx0ZnJvbUFycmF5OiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0gMDtcblxuXHRcdHRoaXMuX3ggPSBhcnJheVsgb2Zmc2V0IF07XG5cdFx0dGhpcy5feSA9IGFycmF5WyBvZmZzZXQgKyAxIF07XG5cdFx0dGhpcy5feiA9IGFycmF5WyBvZmZzZXQgKyAyIF07XG5cdFx0dGhpcy5fdyA9IGFycmF5WyBvZmZzZXQgKyAzIF07XG5cblx0XHR0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dG9BcnJheTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0aWYgKCBhcnJheSA9PT0gdW5kZWZpbmVkICkgYXJyYXkgPSBbXTtcblx0XHRpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0gMDtcblxuXHRcdGFycmF5WyBvZmZzZXQgXSA9IHRoaXMuX3g7XG5cdFx0YXJyYXlbIG9mZnNldCArIDEgXSA9IHRoaXMuX3k7XG5cdFx0YXJyYXlbIG9mZnNldCArIDIgXSA9IHRoaXMuX3o7XG5cdFx0YXJyYXlbIG9mZnNldCArIDMgXSA9IHRoaXMuX3c7XG5cblx0XHRyZXR1cm4gYXJyYXk7XG5cblx0fSxcblxuXHRvbkNoYW5nZTogZnVuY3Rpb24gKCBjYWxsYmFjayApIHtcblxuXHRcdHRoaXMub25DaGFuZ2VDYWxsYmFjayA9IGNhbGxiYWNrO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRvbkNoYW5nZUNhbGxiYWNrOiBmdW5jdGlvbiAoKSB7fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3Iga2lsZSAvIGh0dHA6Ly9raWxlLnN0cmF2YWdhbnphLm9yZy9cbiAqIEBhdXRob3IgcGhpbG9nYiAvIGh0dHA6Ly9ibG9nLnRoZWppdC5vcmcvXG4gKiBAYXV0aG9yIG1pa2FlbCBlbXRpbmdlciAvIGh0dHA6Ly9nb21vLnNlL1xuICogQGF1dGhvciBlZ3JhZXRoZXIgLyBodHRwOi8vZWdyYWV0aGVyLmNvbS9cbiAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleVxuICovXG5cbmZ1bmN0aW9uIFZlY3RvcjMoIHgsIHksIHogKSB7XG5cblx0dGhpcy54ID0geCB8fCAwO1xuXHR0aGlzLnkgPSB5IHx8IDA7XG5cdHRoaXMueiA9IHogfHwgMDtcblxufVxuXG5PYmplY3QuYXNzaWduKCBWZWN0b3IzLnByb3RvdHlwZSwge1xuXG5cdGlzVmVjdG9yMzogdHJ1ZSxcblxuXHRzZXQ6IGZ1bmN0aW9uICggeCwgeSwgeiApIHtcblxuXHRcdHRoaXMueCA9IHg7XG5cdFx0dGhpcy55ID0geTtcblx0XHR0aGlzLnogPSB6O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRTY2FsYXI6IGZ1bmN0aW9uICggc2NhbGFyICkge1xuXG5cdFx0dGhpcy54ID0gc2NhbGFyO1xuXHRcdHRoaXMueSA9IHNjYWxhcjtcblx0XHR0aGlzLnogPSBzY2FsYXI7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFg6IGZ1bmN0aW9uICggeCApIHtcblxuXHRcdHRoaXMueCA9IHg7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFk6IGZ1bmN0aW9uICggeSApIHtcblxuXHRcdHRoaXMueSA9IHk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFo6IGZ1bmN0aW9uICggeiApIHtcblxuXHRcdHRoaXMueiA9IHo7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldENvbXBvbmVudDogZnVuY3Rpb24gKCBpbmRleCwgdmFsdWUgKSB7XG5cblx0XHRzd2l0Y2ggKCBpbmRleCApIHtcblxuXHRcdFx0Y2FzZSAwOiB0aGlzLnggPSB2YWx1ZTsgYnJlYWs7XG5cdFx0XHRjYXNlIDE6IHRoaXMueSA9IHZhbHVlOyBicmVhaztcblx0XHRcdGNhc2UgMjogdGhpcy56ID0gdmFsdWU7IGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDogdGhyb3cgbmV3IEVycm9yKCAnaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAnICsgaW5kZXggKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Z2V0Q29tcG9uZW50OiBmdW5jdGlvbiAoIGluZGV4ICkge1xuXG5cdFx0c3dpdGNoICggaW5kZXggKSB7XG5cblx0XHRcdGNhc2UgMDogcmV0dXJuIHRoaXMueDtcblx0XHRcdGNhc2UgMTogcmV0dXJuIHRoaXMueTtcblx0XHRcdGNhc2UgMjogcmV0dXJuIHRoaXMuejtcblx0XHRcdGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvciggJ2luZGV4IGlzIG91dCBvZiByYW5nZTogJyArIGluZGV4ICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCB0aGlzLngsIHRoaXMueSwgdGhpcy56ICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHR0aGlzLnggPSB2Lng7XG5cdFx0dGhpcy55ID0gdi55O1xuXHRcdHRoaXMueiA9IHYuejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YWRkOiBmdW5jdGlvbiAoIHYsIHcgKSB7XG5cblx0XHRpZiAoIHcgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yMzogLmFkZCgpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLmFkZFZlY3RvcnMoIGEsIGIgKSBpbnN0ZWFkLicgKTtcblx0XHRcdHJldHVybiB0aGlzLmFkZFZlY3RvcnMoIHYsIHcgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMueCArPSB2Lng7XG5cdFx0dGhpcy55ICs9IHYueTtcblx0XHR0aGlzLnogKz0gdi56O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRhZGRTY2FsYXI6IGZ1bmN0aW9uICggcyApIHtcblxuXHRcdHRoaXMueCArPSBzO1xuXHRcdHRoaXMueSArPSBzO1xuXHRcdHRoaXMueiArPSBzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRhZGRWZWN0b3JzOiBmdW5jdGlvbiAoIGEsIGIgKSB7XG5cblx0XHR0aGlzLnggPSBhLnggKyBiLng7XG5cdFx0dGhpcy55ID0gYS55ICsgYi55O1xuXHRcdHRoaXMueiA9IGEueiArIGIuejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YWRkU2NhbGVkVmVjdG9yOiBmdW5jdGlvbiAoIHYsIHMgKSB7XG5cblx0XHR0aGlzLnggKz0gdi54ICogcztcblx0XHR0aGlzLnkgKz0gdi55ICogcztcblx0XHR0aGlzLnogKz0gdi56ICogcztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c3ViOiBmdW5jdGlvbiAoIHYsIHcgKSB7XG5cblx0XHRpZiAoIHcgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yMzogLnN1YigpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLnN1YlZlY3RvcnMoIGEsIGIgKSBpbnN0ZWFkLicgKTtcblx0XHRcdHJldHVybiB0aGlzLnN1YlZlY3RvcnMoIHYsIHcgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMueCAtPSB2Lng7XG5cdFx0dGhpcy55IC09IHYueTtcblx0XHR0aGlzLnogLT0gdi56O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzdWJTY2FsYXI6IGZ1bmN0aW9uICggcyApIHtcblxuXHRcdHRoaXMueCAtPSBzO1xuXHRcdHRoaXMueSAtPSBzO1xuXHRcdHRoaXMueiAtPSBzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzdWJWZWN0b3JzOiBmdW5jdGlvbiAoIGEsIGIgKSB7XG5cblx0XHR0aGlzLnggPSBhLnggLSBiLng7XG5cdFx0dGhpcy55ID0gYS55IC0gYi55O1xuXHRcdHRoaXMueiA9IGEueiAtIGIuejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bXVsdGlwbHk6IGZ1bmN0aW9uICggdiwgdyApIHtcblxuXHRcdGlmICggdyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IzOiAubXVsdGlwbHkoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5tdWx0aXBseVZlY3RvcnMoIGEsIGIgKSBpbnN0ZWFkLicgKTtcblx0XHRcdHJldHVybiB0aGlzLm11bHRpcGx5VmVjdG9ycyggdiwgdyApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy54ICo9IHYueDtcblx0XHR0aGlzLnkgKj0gdi55O1xuXHRcdHRoaXMueiAqPSB2Lno7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG11bHRpcGx5U2NhbGFyOiBmdW5jdGlvbiAoIHNjYWxhciApIHtcblxuXHRcdHRoaXMueCAqPSBzY2FsYXI7XG5cdFx0dGhpcy55ICo9IHNjYWxhcjtcblx0XHR0aGlzLnogKj0gc2NhbGFyO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtdWx0aXBseVZlY3RvcnM6IGZ1bmN0aW9uICggYSwgYiApIHtcblxuXHRcdHRoaXMueCA9IGEueCAqIGIueDtcblx0XHR0aGlzLnkgPSBhLnkgKiBiLnk7XG5cdFx0dGhpcy56ID0gYS56ICogYi56O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRhcHBseUV1bGVyOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgcXVhdGVybmlvbiA9IG5ldyBRdWF0ZXJuaW9uKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gYXBwbHlFdWxlciggZXVsZXIgKSB7XG5cblx0XHRcdGlmICggISAoIGV1bGVyICYmIGV1bGVyLmlzRXVsZXIgKSApIHtcblxuXHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuVmVjdG9yMzogLmFwcGx5RXVsZXIoKSBub3cgZXhwZWN0cyBhbiBFdWxlciByb3RhdGlvbiByYXRoZXIgdGhhbiBhIFZlY3RvcjMgYW5kIG9yZGVyLicgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdGhpcy5hcHBseVF1YXRlcm5pb24oIHF1YXRlcm5pb24uc2V0RnJvbUV1bGVyKCBldWxlciApICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRhcHBseUF4aXNBbmdsZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHF1YXRlcm5pb24gPSBuZXcgUXVhdGVybmlvbigpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGFwcGx5QXhpc0FuZ2xlKCBheGlzLCBhbmdsZSApIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMuYXBwbHlRdWF0ZXJuaW9uKCBxdWF0ZXJuaW9uLnNldEZyb21BeGlzQW5nbGUoIGF4aXMsIGFuZ2xlICkgKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGFwcGx5TWF0cml4MzogZnVuY3Rpb24gKCBtICkge1xuXG5cdFx0dmFyIHggPSB0aGlzLngsIHkgPSB0aGlzLnksIHogPSB0aGlzLno7XG5cdFx0dmFyIGUgPSBtLmVsZW1lbnRzO1xuXG5cdFx0dGhpcy54ID0gZVsgMCBdICogeCArIGVbIDMgXSAqIHkgKyBlWyA2IF0gKiB6O1xuXHRcdHRoaXMueSA9IGVbIDEgXSAqIHggKyBlWyA0IF0gKiB5ICsgZVsgNyBdICogejtcblx0XHR0aGlzLnogPSBlWyAyIF0gKiB4ICsgZVsgNSBdICogeSArIGVbIDggXSAqIHo7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFwcGx5TWF0cml4NDogZnVuY3Rpb24gKCBtICkge1xuXG5cdFx0dmFyIHggPSB0aGlzLngsIHkgPSB0aGlzLnksIHogPSB0aGlzLno7XG5cdFx0dmFyIGUgPSBtLmVsZW1lbnRzO1xuXG5cdFx0dmFyIHcgPSAxIC8gKCBlWyAzIF0gKiB4ICsgZVsgNyBdICogeSArIGVbIDExIF0gKiB6ICsgZVsgMTUgXSApO1xuXG5cdFx0dGhpcy54ID0gKCBlWyAwIF0gKiB4ICsgZVsgNCBdICogeSArIGVbIDggXSAqIHogKyBlWyAxMiBdICkgKiB3O1xuXHRcdHRoaXMueSA9ICggZVsgMSBdICogeCArIGVbIDUgXSAqIHkgKyBlWyA5IF0gKiB6ICsgZVsgMTMgXSApICogdztcblx0XHR0aGlzLnogPSAoIGVbIDIgXSAqIHggKyBlWyA2IF0gKiB5ICsgZVsgMTAgXSAqIHogKyBlWyAxNCBdICkgKiB3O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRhcHBseVF1YXRlcm5pb246IGZ1bmN0aW9uICggcSApIHtcblxuXHRcdHZhciB4ID0gdGhpcy54LCB5ID0gdGhpcy55LCB6ID0gdGhpcy56O1xuXHRcdHZhciBxeCA9IHEueCwgcXkgPSBxLnksIHF6ID0gcS56LCBxdyA9IHEudztcblxuXHRcdC8vIGNhbGN1bGF0ZSBxdWF0ICogdmVjdG9yXG5cblx0XHR2YXIgaXggPSBxdyAqIHggKyBxeSAqIHogLSBxeiAqIHk7XG5cdFx0dmFyIGl5ID0gcXcgKiB5ICsgcXogKiB4IC0gcXggKiB6O1xuXHRcdHZhciBpeiA9IHF3ICogeiArIHF4ICogeSAtIHF5ICogeDtcblx0XHR2YXIgaXcgPSAtIHF4ICogeCAtIHF5ICogeSAtIHF6ICogejtcblxuXHRcdC8vIGNhbGN1bGF0ZSByZXN1bHQgKiBpbnZlcnNlIHF1YXRcblxuXHRcdHRoaXMueCA9IGl4ICogcXcgKyBpdyAqIC0gcXggKyBpeSAqIC0gcXogLSBpeiAqIC0gcXk7XG5cdFx0dGhpcy55ID0gaXkgKiBxdyArIGl3ICogLSBxeSArIGl6ICogLSBxeCAtIGl4ICogLSBxejtcblx0XHR0aGlzLnogPSBpeiAqIHF3ICsgaXcgKiAtIHF6ICsgaXggKiAtIHF5IC0gaXkgKiAtIHF4O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRwcm9qZWN0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgbWF0cml4ID0gbmV3IE1hdHJpeDQoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBwcm9qZWN0KCBjYW1lcmEgKSB7XG5cblx0XHRcdG1hdHJpeC5tdWx0aXBseU1hdHJpY2VzKCBjYW1lcmEucHJvamVjdGlvbk1hdHJpeCwgbWF0cml4LmdldEludmVyc2UoIGNhbWVyYS5tYXRyaXhXb3JsZCApICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5hcHBseU1hdHJpeDQoIG1hdHJpeCApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0dW5wcm9qZWN0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgbWF0cml4ID0gbmV3IE1hdHJpeDQoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiB1bnByb2plY3QoIGNhbWVyYSApIHtcblxuXHRcdFx0bWF0cml4Lm11bHRpcGx5TWF0cmljZXMoIGNhbWVyYS5tYXRyaXhXb3JsZCwgbWF0cml4LmdldEludmVyc2UoIGNhbWVyYS5wcm9qZWN0aW9uTWF0cml4ICkgKTtcblx0XHRcdHJldHVybiB0aGlzLmFwcGx5TWF0cml4NCggbWF0cml4ICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHR0cmFuc2Zvcm1EaXJlY3Rpb246IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdC8vIGlucHV0OiBUSFJFRS5NYXRyaXg0IGFmZmluZSBtYXRyaXhcblx0XHQvLyB2ZWN0b3IgaW50ZXJwcmV0ZWQgYXMgYSBkaXJlY3Rpb25cblxuXHRcdHZhciB4ID0gdGhpcy54LCB5ID0gdGhpcy55LCB6ID0gdGhpcy56O1xuXHRcdHZhciBlID0gbS5lbGVtZW50cztcblxuXHRcdHRoaXMueCA9IGVbIDAgXSAqIHggKyBlWyA0IF0gKiB5ICsgZVsgOCBdICogejtcblx0XHR0aGlzLnkgPSBlWyAxIF0gKiB4ICsgZVsgNSBdICogeSArIGVbIDkgXSAqIHo7XG5cdFx0dGhpcy56ID0gZVsgMiBdICogeCArIGVbIDYgXSAqIHkgKyBlWyAxMCBdICogejtcblxuXHRcdHJldHVybiB0aGlzLm5vcm1hbGl6ZSgpO1xuXG5cdH0sXG5cblx0ZGl2aWRlOiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHR0aGlzLnggLz0gdi54O1xuXHRcdHRoaXMueSAvPSB2Lnk7XG5cdFx0dGhpcy56IC89IHYuejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZGl2aWRlU2NhbGFyOiBmdW5jdGlvbiAoIHNjYWxhciApIHtcblxuXHRcdHJldHVybiB0aGlzLm11bHRpcGx5U2NhbGFyKCAxIC8gc2NhbGFyICk7XG5cblx0fSxcblxuXHRtaW46IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHRoaXMueCA9IE1hdGgubWluKCB0aGlzLngsIHYueCApO1xuXHRcdHRoaXMueSA9IE1hdGgubWluKCB0aGlzLnksIHYueSApO1xuXHRcdHRoaXMueiA9IE1hdGgubWluKCB0aGlzLnosIHYueiApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtYXg6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHRoaXMueCA9IE1hdGgubWF4KCB0aGlzLngsIHYueCApO1xuXHRcdHRoaXMueSA9IE1hdGgubWF4KCB0aGlzLnksIHYueSApO1xuXHRcdHRoaXMueiA9IE1hdGgubWF4KCB0aGlzLnosIHYueiApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjbGFtcDogZnVuY3Rpb24gKCBtaW4sIG1heCApIHtcblxuXHRcdC8vIGFzc3VtZXMgbWluIDwgbWF4LCBjb21wb25lbnR3aXNlXG5cblx0XHR0aGlzLnggPSBNYXRoLm1heCggbWluLngsIE1hdGgubWluKCBtYXgueCwgdGhpcy54ICkgKTtcblx0XHR0aGlzLnkgPSBNYXRoLm1heCggbWluLnksIE1hdGgubWluKCBtYXgueSwgdGhpcy55ICkgKTtcblx0XHR0aGlzLnogPSBNYXRoLm1heCggbWluLnosIE1hdGgubWluKCBtYXgueiwgdGhpcy56ICkgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xhbXBTY2FsYXI6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBtaW4gPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciBtYXggPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGNsYW1wU2NhbGFyKCBtaW5WYWwsIG1heFZhbCApIHtcblxuXHRcdFx0bWluLnNldCggbWluVmFsLCBtaW5WYWwsIG1pblZhbCApO1xuXHRcdFx0bWF4LnNldCggbWF4VmFsLCBtYXhWYWwsIG1heFZhbCApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5jbGFtcCggbWluLCBtYXggKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGNsYW1wTGVuZ3RoOiBmdW5jdGlvbiAoIG1pbiwgbWF4ICkge1xuXG5cdFx0dmFyIGxlbmd0aCA9IHRoaXMubGVuZ3RoKCk7XG5cblx0XHRyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIoIGxlbmd0aCB8fCAxICkubXVsdGlwbHlTY2FsYXIoIE1hdGgubWF4KCBtaW4sIE1hdGgubWluKCBtYXgsIGxlbmd0aCApICkgKTtcblxuXHR9LFxuXG5cdGZsb29yOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLnggPSBNYXRoLmZsb29yKCB0aGlzLnggKTtcblx0XHR0aGlzLnkgPSBNYXRoLmZsb29yKCB0aGlzLnkgKTtcblx0XHR0aGlzLnogPSBNYXRoLmZsb29yKCB0aGlzLnogKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2VpbDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy54ID0gTWF0aC5jZWlsKCB0aGlzLnggKTtcblx0XHR0aGlzLnkgPSBNYXRoLmNlaWwoIHRoaXMueSApO1xuXHRcdHRoaXMueiA9IE1hdGguY2VpbCggdGhpcy56ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHJvdW5kOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLnggPSBNYXRoLnJvdW5kKCB0aGlzLnggKTtcblx0XHR0aGlzLnkgPSBNYXRoLnJvdW5kKCB0aGlzLnkgKTtcblx0XHR0aGlzLnogPSBNYXRoLnJvdW5kKCB0aGlzLnogKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0cm91bmRUb1plcm86IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMueCA9ICggdGhpcy54IDwgMCApID8gTWF0aC5jZWlsKCB0aGlzLnggKSA6IE1hdGguZmxvb3IoIHRoaXMueCApO1xuXHRcdHRoaXMueSA9ICggdGhpcy55IDwgMCApID8gTWF0aC5jZWlsKCB0aGlzLnkgKSA6IE1hdGguZmxvb3IoIHRoaXMueSApO1xuXHRcdHRoaXMueiA9ICggdGhpcy56IDwgMCApID8gTWF0aC5jZWlsKCB0aGlzLnogKSA6IE1hdGguZmxvb3IoIHRoaXMueiApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRuZWdhdGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMueCA9IC0gdGhpcy54O1xuXHRcdHRoaXMueSA9IC0gdGhpcy55O1xuXHRcdHRoaXMueiA9IC0gdGhpcy56O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRkb3Q6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHJldHVybiB0aGlzLnggKiB2LnggKyB0aGlzLnkgKiB2LnkgKyB0aGlzLnogKiB2Lno7XG5cblx0fSxcblxuXHQvLyBUT0RPIGxlbmd0aFNxdWFyZWQ/XG5cblx0bGVuZ3RoU3E6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLnggKiB0aGlzLnggKyB0aGlzLnkgKiB0aGlzLnkgKyB0aGlzLnogKiB0aGlzLno7XG5cblx0fSxcblxuXHRsZW5ndGg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBNYXRoLnNxcnQoIHRoaXMueCAqIHRoaXMueCArIHRoaXMueSAqIHRoaXMueSArIHRoaXMueiAqIHRoaXMueiApO1xuXG5cdH0sXG5cblx0bWFuaGF0dGFuTGVuZ3RoOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gTWF0aC5hYnMoIHRoaXMueCApICsgTWF0aC5hYnMoIHRoaXMueSApICsgTWF0aC5hYnMoIHRoaXMueiApO1xuXG5cdH0sXG5cblx0bm9ybWFsaXplOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIoIHRoaXMubGVuZ3RoKCkgfHwgMSApO1xuXG5cdH0sXG5cblx0c2V0TGVuZ3RoOiBmdW5jdGlvbiAoIGxlbmd0aCApIHtcblxuXHRcdHJldHVybiB0aGlzLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKCBsZW5ndGggKTtcblxuXHR9LFxuXG5cdGxlcnA6IGZ1bmN0aW9uICggdiwgYWxwaGEgKSB7XG5cblx0XHR0aGlzLnggKz0gKCB2LnggLSB0aGlzLnggKSAqIGFscGhhO1xuXHRcdHRoaXMueSArPSAoIHYueSAtIHRoaXMueSApICogYWxwaGE7XG5cdFx0dGhpcy56ICs9ICggdi56IC0gdGhpcy56ICkgKiBhbHBoYTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bGVycFZlY3RvcnM6IGZ1bmN0aW9uICggdjEsIHYyLCBhbHBoYSApIHtcblxuXHRcdHJldHVybiB0aGlzLnN1YlZlY3RvcnMoIHYyLCB2MSApLm11bHRpcGx5U2NhbGFyKCBhbHBoYSApLmFkZCggdjEgKTtcblxuXHR9LFxuXG5cdGNyb3NzOiBmdW5jdGlvbiAoIHYsIHcgKSB7XG5cblx0XHRpZiAoIHcgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yMzogLmNyb3NzKCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAuY3Jvc3NWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5jcm9zc1ZlY3RvcnMoIHYsIHcgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmNyb3NzVmVjdG9ycyggdGhpcywgdiApO1xuXG5cdH0sXG5cblx0Y3Jvc3NWZWN0b3JzOiBmdW5jdGlvbiAoIGEsIGIgKSB7XG5cblx0XHR2YXIgYXggPSBhLngsIGF5ID0gYS55LCBheiA9IGEuejtcblx0XHR2YXIgYnggPSBiLngsIGJ5ID0gYi55LCBieiA9IGIuejtcblxuXHRcdHRoaXMueCA9IGF5ICogYnogLSBheiAqIGJ5O1xuXHRcdHRoaXMueSA9IGF6ICogYnggLSBheCAqIGJ6O1xuXHRcdHRoaXMueiA9IGF4ICogYnkgLSBheSAqIGJ4O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRwcm9qZWN0T25WZWN0b3I6IGZ1bmN0aW9uICggdmVjdG9yICkge1xuXG5cdFx0dmFyIHNjYWxhciA9IHZlY3Rvci5kb3QoIHRoaXMgKSAvIHZlY3Rvci5sZW5ndGhTcSgpO1xuXG5cdFx0cmV0dXJuIHRoaXMuY29weSggdmVjdG9yICkubXVsdGlwbHlTY2FsYXIoIHNjYWxhciApO1xuXG5cdH0sXG5cblx0cHJvamVjdE9uUGxhbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gcHJvamVjdE9uUGxhbmUoIHBsYW5lTm9ybWFsICkge1xuXG5cdFx0XHR2MS5jb3B5KCB0aGlzICkucHJvamVjdE9uVmVjdG9yKCBwbGFuZU5vcm1hbCApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5zdWIoIHYxICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRyZWZsZWN0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyByZWZsZWN0IGluY2lkZW50IHZlY3RvciBvZmYgcGxhbmUgb3J0aG9nb25hbCB0byBub3JtYWxcblx0XHQvLyBub3JtYWwgaXMgYXNzdW1lZCB0byBoYXZlIHVuaXQgbGVuZ3RoXG5cblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHJlZmxlY3QoIG5vcm1hbCApIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMuc3ViKCB2MS5jb3B5KCBub3JtYWwgKS5tdWx0aXBseVNjYWxhciggMiAqIHRoaXMuZG90KCBub3JtYWwgKSApICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRhbmdsZVRvOiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHR2YXIgdGhldGEgPSB0aGlzLmRvdCggdiApIC8gKCBNYXRoLnNxcnQoIHRoaXMubGVuZ3RoU3EoKSAqIHYubGVuZ3RoU3EoKSApICk7XG5cblx0XHQvLyBjbGFtcCwgdG8gaGFuZGxlIG51bWVyaWNhbCBwcm9ibGVtc1xuXG5cdFx0cmV0dXJuIE1hdGguYWNvcyggX01hdGguY2xhbXAoIHRoZXRhLCAtIDEsIDEgKSApO1xuXG5cdH0sXG5cblx0ZGlzdGFuY2VUbzogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0cmV0dXJuIE1hdGguc3FydCggdGhpcy5kaXN0YW5jZVRvU3F1YXJlZCggdiApICk7XG5cblx0fSxcblxuXHRkaXN0YW5jZVRvU3F1YXJlZDogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0dmFyIGR4ID0gdGhpcy54IC0gdi54LCBkeSA9IHRoaXMueSAtIHYueSwgZHogPSB0aGlzLnogLSB2Lno7XG5cblx0XHRyZXR1cm4gZHggKiBkeCArIGR5ICogZHkgKyBkeiAqIGR6O1xuXG5cdH0sXG5cblx0bWFuaGF0dGFuRGlzdGFuY2VUbzogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0cmV0dXJuIE1hdGguYWJzKCB0aGlzLnggLSB2LnggKSArIE1hdGguYWJzKCB0aGlzLnkgLSB2LnkgKSArIE1hdGguYWJzKCB0aGlzLnogLSB2LnogKTtcblxuXHR9LFxuXG5cdHNldEZyb21TcGhlcmljYWw6IGZ1bmN0aW9uICggcyApIHtcblxuXHRcdHZhciBzaW5QaGlSYWRpdXMgPSBNYXRoLnNpbiggcy5waGkgKSAqIHMucmFkaXVzO1xuXG5cdFx0dGhpcy54ID0gc2luUGhpUmFkaXVzICogTWF0aC5zaW4oIHMudGhldGEgKTtcblx0XHR0aGlzLnkgPSBNYXRoLmNvcyggcy5waGkgKSAqIHMucmFkaXVzO1xuXHRcdHRoaXMueiA9IHNpblBoaVJhZGl1cyAqIE1hdGguY29zKCBzLnRoZXRhICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21DeWxpbmRyaWNhbDogZnVuY3Rpb24gKCBjICkge1xuXG5cdFx0dGhpcy54ID0gYy5yYWRpdXMgKiBNYXRoLnNpbiggYy50aGV0YSApO1xuXHRcdHRoaXMueSA9IGMueTtcblx0XHR0aGlzLnogPSBjLnJhZGl1cyAqIE1hdGguY29zKCBjLnRoZXRhICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21NYXRyaXhQb3NpdGlvbjogZnVuY3Rpb24gKCBtICkge1xuXG5cdFx0dmFyIGUgPSBtLmVsZW1lbnRzO1xuXG5cdFx0dGhpcy54ID0gZVsgMTIgXTtcblx0XHR0aGlzLnkgPSBlWyAxMyBdO1xuXHRcdHRoaXMueiA9IGVbIDE0IF07XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21NYXRyaXhTY2FsZTogZnVuY3Rpb24gKCBtICkge1xuXG5cdFx0dmFyIHN4ID0gdGhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKCBtLCAwICkubGVuZ3RoKCk7XG5cdFx0dmFyIHN5ID0gdGhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKCBtLCAxICkubGVuZ3RoKCk7XG5cdFx0dmFyIHN6ID0gdGhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKCBtLCAyICkubGVuZ3RoKCk7XG5cblx0XHR0aGlzLnggPSBzeDtcblx0XHR0aGlzLnkgPSBzeTtcblx0XHR0aGlzLnogPSBzejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbU1hdHJpeENvbHVtbjogZnVuY3Rpb24gKCBtLCBpbmRleCApIHtcblxuXHRcdHJldHVybiB0aGlzLmZyb21BcnJheSggbS5lbGVtZW50cywgaW5kZXggKiA0ICk7XG5cblx0fSxcblxuXHRlcXVhbHM6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHJldHVybiAoICggdi54ID09PSB0aGlzLnggKSAmJiAoIHYueSA9PT0gdGhpcy55ICkgJiYgKCB2LnogPT09IHRoaXMueiApICk7XG5cblx0fSxcblxuXHRmcm9tQXJyYXk6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCApIHtcblxuXHRcdGlmICggb2Zmc2V0ID09PSB1bmRlZmluZWQgKSBvZmZzZXQgPSAwO1xuXG5cdFx0dGhpcy54ID0gYXJyYXlbIG9mZnNldCBdO1xuXHRcdHRoaXMueSA9IGFycmF5WyBvZmZzZXQgKyAxIF07XG5cdFx0dGhpcy56ID0gYXJyYXlbIG9mZnNldCArIDIgXTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dG9BcnJheTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0aWYgKCBhcnJheSA9PT0gdW5kZWZpbmVkICkgYXJyYXkgPSBbXTtcblx0XHRpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0gMDtcblxuXHRcdGFycmF5WyBvZmZzZXQgXSA9IHRoaXMueDtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMSBdID0gdGhpcy55O1xuXHRcdGFycmF5WyBvZmZzZXQgKyAyIF0gPSB0aGlzLno7XG5cblx0XHRyZXR1cm4gYXJyYXk7XG5cblx0fSxcblxuXHRmcm9tQnVmZmVyQXR0cmlidXRlOiBmdW5jdGlvbiAoIGF0dHJpYnV0ZSwgaW5kZXgsIG9mZnNldCApIHtcblxuXHRcdGlmICggb2Zmc2V0ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjM6IG9mZnNldCBoYXMgYmVlbiByZW1vdmVkIGZyb20gLmZyb21CdWZmZXJBdHRyaWJ1dGUoKS4nICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLnggPSBhdHRyaWJ1dGUuZ2V0WCggaW5kZXggKTtcblx0XHR0aGlzLnkgPSBhdHRyaWJ1dGUuZ2V0WSggaW5kZXggKTtcblx0XHR0aGlzLnogPSBhdHRyaWJ1dGUuZ2V0WiggaW5kZXggKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqIEBhdXRob3IgYmhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW9cbiAqIEBhdXRob3IgdHNjaHdcbiAqL1xuXG5mdW5jdGlvbiBNYXRyaXgzKCkge1xuXG5cdHRoaXMuZWxlbWVudHMgPSBbXG5cblx0XHQxLCAwLCAwLFxuXHRcdDAsIDEsIDAsXG5cdFx0MCwgMCwgMVxuXG5cdF07XG5cblx0aWYgKCBhcmd1bWVudHMubGVuZ3RoID4gMCApIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5NYXRyaXgzOiB0aGUgY29uc3RydWN0b3Igbm8gbG9uZ2VyIHJlYWRzIGFyZ3VtZW50cy4gdXNlIC5zZXQoKSBpbnN0ZWFkLicgKTtcblxuXHR9XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggTWF0cml4My5wcm90b3R5cGUsIHtcblxuXHRpc01hdHJpeDM6IHRydWUsXG5cblx0c2V0OiBmdW5jdGlvbiAoIG4xMSwgbjEyLCBuMTMsIG4yMSwgbjIyLCBuMjMsIG4zMSwgbjMyLCBuMzMgKSB7XG5cblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXG5cdFx0dGVbIDAgXSA9IG4xMTsgdGVbIDEgXSA9IG4yMTsgdGVbIDIgXSA9IG4zMTtcblx0XHR0ZVsgMyBdID0gbjEyOyB0ZVsgNCBdID0gbjIyOyB0ZVsgNSBdID0gbjMyO1xuXHRcdHRlWyA2IF0gPSBuMTM7IHRlWyA3IF0gPSBuMjM7IHRlWyA4IF0gPSBuMzM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGlkZW50aXR5OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLnNldChcblxuXHRcdFx0MSwgMCwgMCxcblx0XHRcdDAsIDEsIDAsXG5cdFx0XHQwLCAwLCAxXG5cblx0XHQpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuZnJvbUFycmF5KCB0aGlzLmVsZW1lbnRzICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIG0gKSB7XG5cblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXHRcdHZhciBtZSA9IG0uZWxlbWVudHM7XG5cblx0XHR0ZVsgMCBdID0gbWVbIDAgXTsgdGVbIDEgXSA9IG1lWyAxIF07IHRlWyAyIF0gPSBtZVsgMiBdO1xuXHRcdHRlWyAzIF0gPSBtZVsgMyBdOyB0ZVsgNCBdID0gbWVbIDQgXTsgdGVbIDUgXSA9IG1lWyA1IF07XG5cdFx0dGVbIDYgXSA9IG1lWyA2IF07IHRlWyA3IF0gPSBtZVsgNyBdOyB0ZVsgOCBdID0gbWVbIDggXTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbU1hdHJpeDQ6IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdHZhciBtZSA9IG0uZWxlbWVudHM7XG5cblx0XHR0aGlzLnNldChcblxuXHRcdFx0bWVbIDAgXSwgbWVbIDQgXSwgbWVbIDggXSxcblx0XHRcdG1lWyAxIF0sIG1lWyA1IF0sIG1lWyA5IF0sXG5cdFx0XHRtZVsgMiBdLCBtZVsgNiBdLCBtZVsgMTAgXVxuXG5cdFx0KTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YXBwbHlUb0J1ZmZlckF0dHJpYnV0ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBhcHBseVRvQnVmZmVyQXR0cmlidXRlKCBhdHRyaWJ1dGUgKSB7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGF0dHJpYnV0ZS5jb3VudDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0djEueCA9IGF0dHJpYnV0ZS5nZXRYKCBpICk7XG5cdFx0XHRcdHYxLnkgPSBhdHRyaWJ1dGUuZ2V0WSggaSApO1xuXHRcdFx0XHR2MS56ID0gYXR0cmlidXRlLmdldFooIGkgKTtcblxuXHRcdFx0XHR2MS5hcHBseU1hdHJpeDMoIHRoaXMgKTtcblxuXHRcdFx0XHRhdHRyaWJ1dGUuc2V0WFlaKCBpLCB2MS54LCB2MS55LCB2MS56ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGF0dHJpYnV0ZTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdG11bHRpcGx5OiBmdW5jdGlvbiAoIG0gKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5tdWx0aXBseU1hdHJpY2VzKCB0aGlzLCBtICk7XG5cblx0fSxcblxuXHRwcmVtdWx0aXBseTogZnVuY3Rpb24gKCBtICkge1xuXG5cdFx0cmV0dXJuIHRoaXMubXVsdGlwbHlNYXRyaWNlcyggbSwgdGhpcyApO1xuXG5cdH0sXG5cblx0bXVsdGlwbHlNYXRyaWNlczogZnVuY3Rpb24gKCBhLCBiICkge1xuXG5cdFx0dmFyIGFlID0gYS5lbGVtZW50cztcblx0XHR2YXIgYmUgPSBiLmVsZW1lbnRzO1xuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHR2YXIgYTExID0gYWVbIDAgXSwgYTEyID0gYWVbIDMgXSwgYTEzID0gYWVbIDYgXTtcblx0XHR2YXIgYTIxID0gYWVbIDEgXSwgYTIyID0gYWVbIDQgXSwgYTIzID0gYWVbIDcgXTtcblx0XHR2YXIgYTMxID0gYWVbIDIgXSwgYTMyID0gYWVbIDUgXSwgYTMzID0gYWVbIDggXTtcblxuXHRcdHZhciBiMTEgPSBiZVsgMCBdLCBiMTIgPSBiZVsgMyBdLCBiMTMgPSBiZVsgNiBdO1xuXHRcdHZhciBiMjEgPSBiZVsgMSBdLCBiMjIgPSBiZVsgNCBdLCBiMjMgPSBiZVsgNyBdO1xuXHRcdHZhciBiMzEgPSBiZVsgMiBdLCBiMzIgPSBiZVsgNSBdLCBiMzMgPSBiZVsgOCBdO1xuXG5cdFx0dGVbIDAgXSA9IGExMSAqIGIxMSArIGExMiAqIGIyMSArIGExMyAqIGIzMTtcblx0XHR0ZVsgMyBdID0gYTExICogYjEyICsgYTEyICogYjIyICsgYTEzICogYjMyO1xuXHRcdHRlWyA2IF0gPSBhMTEgKiBiMTMgKyBhMTIgKiBiMjMgKyBhMTMgKiBiMzM7XG5cblx0XHR0ZVsgMSBdID0gYTIxICogYjExICsgYTIyICogYjIxICsgYTIzICogYjMxO1xuXHRcdHRlWyA0IF0gPSBhMjEgKiBiMTIgKyBhMjIgKiBiMjIgKyBhMjMgKiBiMzI7XG5cdFx0dGVbIDcgXSA9IGEyMSAqIGIxMyArIGEyMiAqIGIyMyArIGEyMyAqIGIzMztcblxuXHRcdHRlWyAyIF0gPSBhMzEgKiBiMTEgKyBhMzIgKiBiMjEgKyBhMzMgKiBiMzE7XG5cdFx0dGVbIDUgXSA9IGEzMSAqIGIxMiArIGEzMiAqIGIyMiArIGEzMyAqIGIzMjtcblx0XHR0ZVsgOCBdID0gYTMxICogYjEzICsgYTMyICogYjIzICsgYTMzICogYjMzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtdWx0aXBseVNjYWxhcjogZnVuY3Rpb24gKCBzICkge1xuXG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblxuXHRcdHRlWyAwIF0gKj0gczsgdGVbIDMgXSAqPSBzOyB0ZVsgNiBdICo9IHM7XG5cdFx0dGVbIDEgXSAqPSBzOyB0ZVsgNCBdICo9IHM7IHRlWyA3IF0gKj0gcztcblx0XHR0ZVsgMiBdICo9IHM7IHRlWyA1IF0gKj0gczsgdGVbIDggXSAqPSBzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRkZXRlcm1pbmFudDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblxuXHRcdHZhciBhID0gdGVbIDAgXSwgYiA9IHRlWyAxIF0sIGMgPSB0ZVsgMiBdLFxuXHRcdFx0ZCA9IHRlWyAzIF0sIGUgPSB0ZVsgNCBdLCBmID0gdGVbIDUgXSxcblx0XHRcdGcgPSB0ZVsgNiBdLCBoID0gdGVbIDcgXSwgaSA9IHRlWyA4IF07XG5cblx0XHRyZXR1cm4gYSAqIGUgKiBpIC0gYSAqIGYgKiBoIC0gYiAqIGQgKiBpICsgYiAqIGYgKiBnICsgYyAqIGQgKiBoIC0gYyAqIGUgKiBnO1xuXG5cdH0sXG5cblx0Z2V0SW52ZXJzZTogZnVuY3Rpb24gKCBtYXRyaXgsIHRocm93T25EZWdlbmVyYXRlICkge1xuXG5cdFx0aWYgKCBtYXRyaXggJiYgbWF0cml4LmlzTWF0cml4NCApIHtcblxuXHRcdFx0Y29uc29sZS5lcnJvciggXCJUSFJFRS5NYXRyaXgzOiAuZ2V0SW52ZXJzZSgpIG5vIGxvbmdlciB0YWtlcyBhIE1hdHJpeDQgYXJndW1lbnQuXCIgKTtcblxuXHRcdH1cblxuXHRcdHZhciBtZSA9IG1hdHJpeC5lbGVtZW50cyxcblx0XHRcdHRlID0gdGhpcy5lbGVtZW50cyxcblxuXHRcdFx0bjExID0gbWVbIDAgXSwgbjIxID0gbWVbIDEgXSwgbjMxID0gbWVbIDIgXSxcblx0XHRcdG4xMiA9IG1lWyAzIF0sIG4yMiA9IG1lWyA0IF0sIG4zMiA9IG1lWyA1IF0sXG5cdFx0XHRuMTMgPSBtZVsgNiBdLCBuMjMgPSBtZVsgNyBdLCBuMzMgPSBtZVsgOCBdLFxuXG5cdFx0XHR0MTEgPSBuMzMgKiBuMjIgLSBuMzIgKiBuMjMsXG5cdFx0XHR0MTIgPSBuMzIgKiBuMTMgLSBuMzMgKiBuMTIsXG5cdFx0XHR0MTMgPSBuMjMgKiBuMTIgLSBuMjIgKiBuMTMsXG5cblx0XHRcdGRldCA9IG4xMSAqIHQxMSArIG4yMSAqIHQxMiArIG4zMSAqIHQxMztcblxuXHRcdGlmICggZGV0ID09PSAwICkge1xuXG5cdFx0XHR2YXIgbXNnID0gXCJUSFJFRS5NYXRyaXgzOiAuZ2V0SW52ZXJzZSgpIGNhbid0IGludmVydCBtYXRyaXgsIGRldGVybWluYW50IGlzIDBcIjtcblxuXHRcdFx0aWYgKCB0aHJvd09uRGVnZW5lcmF0ZSA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoIG1zZyApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggbXNnICk7XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRoaXMuaWRlbnRpdHkoKTtcblxuXHRcdH1cblxuXHRcdHZhciBkZXRJbnYgPSAxIC8gZGV0O1xuXG5cdFx0dGVbIDAgXSA9IHQxMSAqIGRldEludjtcblx0XHR0ZVsgMSBdID0gKCBuMzEgKiBuMjMgLSBuMzMgKiBuMjEgKSAqIGRldEludjtcblx0XHR0ZVsgMiBdID0gKCBuMzIgKiBuMjEgLSBuMzEgKiBuMjIgKSAqIGRldEludjtcblxuXHRcdHRlWyAzIF0gPSB0MTIgKiBkZXRJbnY7XG5cdFx0dGVbIDQgXSA9ICggbjMzICogbjExIC0gbjMxICogbjEzICkgKiBkZXRJbnY7XG5cdFx0dGVbIDUgXSA9ICggbjMxICogbjEyIC0gbjMyICogbjExICkgKiBkZXRJbnY7XG5cblx0XHR0ZVsgNiBdID0gdDEzICogZGV0SW52O1xuXHRcdHRlWyA3IF0gPSAoIG4yMSAqIG4xMyAtIG4yMyAqIG4xMSApICogZGV0SW52O1xuXHRcdHRlWyA4IF0gPSAoIG4yMiAqIG4xMSAtIG4yMSAqIG4xMiApICogZGV0SW52O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHR0cmFuc3Bvc2U6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB0bXAsIG0gPSB0aGlzLmVsZW1lbnRzO1xuXG5cdFx0dG1wID0gbVsgMSBdOyBtWyAxIF0gPSBtWyAzIF07IG1bIDMgXSA9IHRtcDtcblx0XHR0bXAgPSBtWyAyIF07IG1bIDIgXSA9IG1bIDYgXTsgbVsgNiBdID0gdG1wO1xuXHRcdHRtcCA9IG1bIDUgXTsgbVsgNSBdID0gbVsgNyBdOyBtWyA3IF0gPSB0bXA7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGdldE5vcm1hbE1hdHJpeDogZnVuY3Rpb24gKCBtYXRyaXg0ICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuc2V0RnJvbU1hdHJpeDQoIG1hdHJpeDQgKS5nZXRJbnZlcnNlKCB0aGlzICkudHJhbnNwb3NlKCk7XG5cblx0fSxcblxuXHR0cmFuc3Bvc2VJbnRvQXJyYXk6IGZ1bmN0aW9uICggciApIHtcblxuXHRcdHZhciBtID0gdGhpcy5lbGVtZW50cztcblxuXHRcdHJbIDAgXSA9IG1bIDAgXTtcblx0XHRyWyAxIF0gPSBtWyAzIF07XG5cdFx0clsgMiBdID0gbVsgNiBdO1xuXHRcdHJbIDMgXSA9IG1bIDEgXTtcblx0XHRyWyA0IF0gPSBtWyA0IF07XG5cdFx0clsgNSBdID0gbVsgNyBdO1xuXHRcdHJbIDYgXSA9IG1bIDIgXTtcblx0XHRyWyA3IF0gPSBtWyA1IF07XG5cdFx0clsgOCBdID0gbVsgOCBdO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRVdlRyYW5zZm9ybTogZnVuY3Rpb24gKCB0eCwgdHksIHN4LCBzeSwgcm90YXRpb24sIGN4LCBjeSApIHtcblxuXHRcdHZhciBjID0gTWF0aC5jb3MoIHJvdGF0aW9uICk7XG5cdFx0dmFyIHMgPSBNYXRoLnNpbiggcm90YXRpb24gKTtcblxuXHRcdHRoaXMuc2V0KFxuXHRcdFx0c3ggKiBjLCBzeCAqIHMsIC0gc3ggKiAoIGMgKiBjeCArIHMgKiBjeSApICsgY3ggKyB0eCxcblx0XHRcdC0gc3kgKiBzLCBzeSAqIGMsIC0gc3kgKiAoIC0gcyAqIGN4ICsgYyAqIGN5ICkgKyBjeSArIHR5LFxuXHRcdFx0MCwgMCwgMVxuXHRcdCk7XG5cblx0fSxcblxuXHRzY2FsZTogZnVuY3Rpb24gKCBzeCwgc3kgKSB7XG5cblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXG5cdFx0dGVbIDAgXSAqPSBzeDsgdGVbIDMgXSAqPSBzeDsgdGVbIDYgXSAqPSBzeDtcblx0XHR0ZVsgMSBdICo9IHN5OyB0ZVsgNCBdICo9IHN5OyB0ZVsgNyBdICo9IHN5O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRyb3RhdGU6IGZ1bmN0aW9uICggdGhldGEgKSB7XG5cblx0XHR2YXIgYyA9IE1hdGguY29zKCB0aGV0YSApO1xuXHRcdHZhciBzID0gTWF0aC5zaW4oIHRoZXRhICk7XG5cblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXG5cdFx0dmFyIGExMSA9IHRlWyAwIF0sIGExMiA9IHRlWyAzIF0sIGExMyA9IHRlWyA2IF07XG5cdFx0dmFyIGEyMSA9IHRlWyAxIF0sIGEyMiA9IHRlWyA0IF0sIGEyMyA9IHRlWyA3IF07XG5cblx0XHR0ZVsgMCBdID0gYyAqIGExMSArIHMgKiBhMjE7XG5cdFx0dGVbIDMgXSA9IGMgKiBhMTIgKyBzICogYTIyO1xuXHRcdHRlWyA2IF0gPSBjICogYTEzICsgcyAqIGEyMztcblxuXHRcdHRlWyAxIF0gPSAtIHMgKiBhMTEgKyBjICogYTIxO1xuXHRcdHRlWyA0IF0gPSAtIHMgKiBhMTIgKyBjICogYTIyO1xuXHRcdHRlWyA3IF0gPSAtIHMgKiBhMTMgKyBjICogYTIzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHR0cmFuc2xhdGU6IGZ1bmN0aW9uICggdHgsIHR5ICkge1xuXG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblxuXHRcdHRlWyAwIF0gKz0gdHggKiB0ZVsgMiBdOyB0ZVsgMyBdICs9IHR4ICogdGVbIDUgXTsgdGVbIDYgXSArPSB0eCAqIHRlWyA4IF07XG5cdFx0dGVbIDEgXSArPSB0eSAqIHRlWyAyIF07IHRlWyA0IF0gKz0gdHkgKiB0ZVsgNSBdOyB0ZVsgNyBdICs9IHR5ICogdGVbIDggXTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZXF1YWxzOiBmdW5jdGlvbiAoIG1hdHJpeCApIHtcblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cdFx0dmFyIG1lID0gbWF0cml4LmVsZW1lbnRzO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgOTsgaSArKyApIHtcblxuXHRcdFx0aWYgKCB0ZVsgaSBdICE9PSBtZVsgaSBdICkgcmV0dXJuIGZhbHNlO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRydWU7XG5cblx0fSxcblxuXHRmcm9tQXJyYXk6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCApIHtcblxuXHRcdGlmICggb2Zmc2V0ID09PSB1bmRlZmluZWQgKSBvZmZzZXQgPSAwO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgOTsgaSArKyApIHtcblxuXHRcdFx0dGhpcy5lbGVtZW50c1sgaSBdID0gYXJyYXlbIGkgKyBvZmZzZXQgXTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dG9BcnJheTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0aWYgKCBhcnJheSA9PT0gdW5kZWZpbmVkICkgYXJyYXkgPSBbXTtcblx0XHRpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0gMDtcblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHRhcnJheVsgb2Zmc2V0IF0gPSB0ZVsgMCBdO1xuXHRcdGFycmF5WyBvZmZzZXQgKyAxIF0gPSB0ZVsgMSBdO1xuXHRcdGFycmF5WyBvZmZzZXQgKyAyIF0gPSB0ZVsgMiBdO1xuXG5cdFx0YXJyYXlbIG9mZnNldCArIDMgXSA9IHRlWyAzIF07XG5cdFx0YXJyYXlbIG9mZnNldCArIDQgXSA9IHRlWyA0IF07XG5cdFx0YXJyYXlbIG9mZnNldCArIDUgXSA9IHRlWyA1IF07XG5cblx0XHRhcnJheVsgb2Zmc2V0ICsgNiBdID0gdGVbIDYgXTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgNyBdID0gdGVbIDcgXTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgOCBdID0gdGVbIDggXTtcblxuXHRcdHJldHVybiBhcnJheTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3Igc3ppbWVrIC8gaHR0cHM6Ly9naXRodWIuY29tL3N6aW1lay9cbiAqL1xuXG52YXIgdGV4dHVyZUlkID0gMDtcblxuZnVuY3Rpb24gVGV4dHVyZSggaW1hZ2UsIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGZvcm1hdCwgdHlwZSwgYW5pc290cm9weSwgZW5jb2RpbmcgKSB7XG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KCB0aGlzLCAnaWQnLCB7IHZhbHVlOiB0ZXh0dXJlSWQgKysgfSApO1xuXG5cdHRoaXMudXVpZCA9IF9NYXRoLmdlbmVyYXRlVVVJRCgpO1xuXG5cdHRoaXMubmFtZSA9ICcnO1xuXG5cdHRoaXMuaW1hZ2UgPSBpbWFnZSAhPT0gdW5kZWZpbmVkID8gaW1hZ2UgOiBUZXh0dXJlLkRFRkFVTFRfSU1BR0U7XG5cdHRoaXMubWlwbWFwcyA9IFtdO1xuXG5cdHRoaXMubWFwcGluZyA9IG1hcHBpbmcgIT09IHVuZGVmaW5lZCA/IG1hcHBpbmcgOiBUZXh0dXJlLkRFRkFVTFRfTUFQUElORztcblxuXHR0aGlzLndyYXBTID0gd3JhcFMgIT09IHVuZGVmaW5lZCA/IHdyYXBTIDogQ2xhbXBUb0VkZ2VXcmFwcGluZztcblx0dGhpcy53cmFwVCA9IHdyYXBUICE9PSB1bmRlZmluZWQgPyB3cmFwVCA6IENsYW1wVG9FZGdlV3JhcHBpbmc7XG5cblx0dGhpcy5tYWdGaWx0ZXIgPSBtYWdGaWx0ZXIgIT09IHVuZGVmaW5lZCA/IG1hZ0ZpbHRlciA6IExpbmVhckZpbHRlcjtcblx0dGhpcy5taW5GaWx0ZXIgPSBtaW5GaWx0ZXIgIT09IHVuZGVmaW5lZCA/IG1pbkZpbHRlciA6IExpbmVhck1pcE1hcExpbmVhckZpbHRlcjtcblxuXHR0aGlzLmFuaXNvdHJvcHkgPSBhbmlzb3Ryb3B5ICE9PSB1bmRlZmluZWQgPyBhbmlzb3Ryb3B5IDogMTtcblxuXHR0aGlzLmZvcm1hdCA9IGZvcm1hdCAhPT0gdW5kZWZpbmVkID8gZm9ybWF0IDogUkdCQUZvcm1hdDtcblx0dGhpcy50eXBlID0gdHlwZSAhPT0gdW5kZWZpbmVkID8gdHlwZSA6IFVuc2lnbmVkQnl0ZVR5cGU7XG5cblx0dGhpcy5vZmZzZXQgPSBuZXcgVmVjdG9yMiggMCwgMCApO1xuXHR0aGlzLnJlcGVhdCA9IG5ldyBWZWN0b3IyKCAxLCAxICk7XG5cdHRoaXMuY2VudGVyID0gbmV3IFZlY3RvcjIoIDAsIDAgKTtcblx0dGhpcy5yb3RhdGlvbiA9IDA7XG5cblx0dGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gdHJ1ZTtcblx0dGhpcy5tYXRyaXggPSBuZXcgTWF0cml4MygpO1xuXG5cdHRoaXMuZ2VuZXJhdGVNaXBtYXBzID0gdHJ1ZTtcblx0dGhpcy5wcmVtdWx0aXBseUFscGhhID0gZmFsc2U7XG5cdHRoaXMuZmxpcFkgPSB0cnVlO1xuXHR0aGlzLnVucGFja0FsaWdubWVudCA9IDQ7XHQvLyB2YWxpZCB2YWx1ZXM6IDEsIDIsIDQsIDggKHNlZSBodHRwOi8vd3d3Lmtocm9ub3Mub3JnL29wZW5nbGVzL3Nkay9kb2NzL21hbi94aHRtbC9nbFBpeGVsU3RvcmVpLnhtbClcblxuXHQvLyBWYWx1ZXMgb2YgZW5jb2RpbmcgIT09IFRIUkVFLkxpbmVhckVuY29kaW5nIG9ubHkgc3VwcG9ydGVkIG9uIG1hcCwgZW52TWFwIGFuZCBlbWlzc2l2ZU1hcC5cblx0Ly9cblx0Ly8gQWxzbyBjaGFuZ2luZyB0aGUgZW5jb2RpbmcgYWZ0ZXIgYWxyZWFkeSB1c2VkIGJ5IGEgTWF0ZXJpYWwgd2lsbCBub3QgYXV0b21hdGljYWxseSBtYWtlIHRoZSBNYXRlcmlhbFxuXHQvLyB1cGRhdGUuICBZb3UgbmVlZCB0byBleHBsaWNpdGx5IGNhbGwgTWF0ZXJpYWwubmVlZHNVcGRhdGUgdG8gdHJpZ2dlciBpdCB0byByZWNvbXBpbGUuXG5cdHRoaXMuZW5jb2RpbmcgPSBlbmNvZGluZyAhPT0gdW5kZWZpbmVkID8gZW5jb2RpbmcgOiBMaW5lYXJFbmNvZGluZztcblxuXHR0aGlzLnZlcnNpb24gPSAwO1xuXHR0aGlzLm9uVXBkYXRlID0gbnVsbDtcblxufVxuXG5UZXh0dXJlLkRFRkFVTFRfSU1BR0UgPSB1bmRlZmluZWQ7XG5UZXh0dXJlLkRFRkFVTFRfTUFQUElORyA9IFVWTWFwcGluZztcblxuVGV4dHVyZS5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBFdmVudERpc3BhdGNoZXIucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogVGV4dHVyZSxcblxuXHRpc1RleHR1cmU6IHRydWUsXG5cblx0dXBkYXRlTWF0cml4OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLm1hdHJpeC5zZXRVdlRyYW5zZm9ybSggdGhpcy5vZmZzZXQueCwgdGhpcy5vZmZzZXQueSwgdGhpcy5yZXBlYXQueCwgdGhpcy5yZXBlYXQueSwgdGhpcy5yb3RhdGlvbiwgdGhpcy5jZW50ZXIueCwgdGhpcy5jZW50ZXIueSApO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0dGhpcy5uYW1lID0gc291cmNlLm5hbWU7XG5cblx0XHR0aGlzLmltYWdlID0gc291cmNlLmltYWdlO1xuXHRcdHRoaXMubWlwbWFwcyA9IHNvdXJjZS5taXBtYXBzLnNsaWNlKCAwICk7XG5cblx0XHR0aGlzLm1hcHBpbmcgPSBzb3VyY2UubWFwcGluZztcblxuXHRcdHRoaXMud3JhcFMgPSBzb3VyY2Uud3JhcFM7XG5cdFx0dGhpcy53cmFwVCA9IHNvdXJjZS53cmFwVDtcblxuXHRcdHRoaXMubWFnRmlsdGVyID0gc291cmNlLm1hZ0ZpbHRlcjtcblx0XHR0aGlzLm1pbkZpbHRlciA9IHNvdXJjZS5taW5GaWx0ZXI7XG5cblx0XHR0aGlzLmFuaXNvdHJvcHkgPSBzb3VyY2UuYW5pc290cm9weTtcblxuXHRcdHRoaXMuZm9ybWF0ID0gc291cmNlLmZvcm1hdDtcblx0XHR0aGlzLnR5cGUgPSBzb3VyY2UudHlwZTtcblxuXHRcdHRoaXMub2Zmc2V0LmNvcHkoIHNvdXJjZS5vZmZzZXQgKTtcblx0XHR0aGlzLnJlcGVhdC5jb3B5KCBzb3VyY2UucmVwZWF0ICk7XG5cdFx0dGhpcy5jZW50ZXIuY29weSggc291cmNlLmNlbnRlciApO1xuXHRcdHRoaXMucm90YXRpb24gPSBzb3VyY2Uucm90YXRpb247XG5cblx0XHR0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSBzb3VyY2UubWF0cml4QXV0b1VwZGF0ZTtcblx0XHR0aGlzLm1hdHJpeC5jb3B5KCBzb3VyY2UubWF0cml4ICk7XG5cblx0XHR0aGlzLmdlbmVyYXRlTWlwbWFwcyA9IHNvdXJjZS5nZW5lcmF0ZU1pcG1hcHM7XG5cdFx0dGhpcy5wcmVtdWx0aXBseUFscGhhID0gc291cmNlLnByZW11bHRpcGx5QWxwaGE7XG5cdFx0dGhpcy5mbGlwWSA9IHNvdXJjZS5mbGlwWTtcblx0XHR0aGlzLnVucGFja0FsaWdubWVudCA9IHNvdXJjZS51bnBhY2tBbGlnbm1lbnQ7XG5cdFx0dGhpcy5lbmNvZGluZyA9IHNvdXJjZS5lbmNvZGluZztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dG9KU09OOiBmdW5jdGlvbiAoIG1ldGEgKSB7XG5cblx0XHR2YXIgaXNSb290T2JqZWN0ID0gKCBtZXRhID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIG1ldGEgPT09ICdzdHJpbmcnICk7XG5cblx0XHRpZiAoICEgaXNSb290T2JqZWN0ICYmIG1ldGEudGV4dHVyZXNbIHRoaXMudXVpZCBdICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHJldHVybiBtZXRhLnRleHR1cmVzWyB0aGlzLnV1aWQgXTtcblxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIGdldERhdGFVUkwoIGltYWdlICkge1xuXG5cdFx0XHR2YXIgY2FudmFzO1xuXG5cdFx0XHRpZiAoIGltYWdlIGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnQgKSB7XG5cblx0XHRcdFx0Y2FudmFzID0gaW1hZ2U7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Y2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCcsICdjYW52YXMnICk7XG5cdFx0XHRcdGNhbnZhcy53aWR0aCA9IGltYWdlLndpZHRoO1xuXHRcdFx0XHRjYW52YXMuaGVpZ2h0ID0gaW1hZ2UuaGVpZ2h0O1xuXG5cdFx0XHRcdHZhciBjb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoICcyZCcgKTtcblxuXHRcdFx0XHRpZiAoIGltYWdlIGluc3RhbmNlb2YgSW1hZ2VEYXRhICkge1xuXG5cdFx0XHRcdFx0Y29udGV4dC5wdXRJbWFnZURhdGEoIGltYWdlLCAwLCAwICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGNvbnRleHQuZHJhd0ltYWdlKCBpbWFnZSwgMCwgMCwgaW1hZ2Uud2lkdGgsIGltYWdlLmhlaWdodCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGNhbnZhcy53aWR0aCA+IDIwNDggfHwgY2FudmFzLmhlaWdodCA+IDIwNDggKSB7XG5cblx0XHRcdFx0cmV0dXJuIGNhbnZhcy50b0RhdGFVUkwoICdpbWFnZS9qcGVnJywgMC42ICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0cmV0dXJuIGNhbnZhcy50b0RhdGFVUkwoICdpbWFnZS9wbmcnICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHZhciBvdXRwdXQgPSB7XG5cblx0XHRcdG1ldGFkYXRhOiB7XG5cdFx0XHRcdHZlcnNpb246IDQuNSxcblx0XHRcdFx0dHlwZTogJ1RleHR1cmUnLFxuXHRcdFx0XHRnZW5lcmF0b3I6ICdUZXh0dXJlLnRvSlNPTidcblx0XHRcdH0sXG5cblx0XHRcdHV1aWQ6IHRoaXMudXVpZCxcblx0XHRcdG5hbWU6IHRoaXMubmFtZSxcblxuXHRcdFx0bWFwcGluZzogdGhpcy5tYXBwaW5nLFxuXG5cdFx0XHRyZXBlYXQ6IFsgdGhpcy5yZXBlYXQueCwgdGhpcy5yZXBlYXQueSBdLFxuXHRcdFx0b2Zmc2V0OiBbIHRoaXMub2Zmc2V0LngsIHRoaXMub2Zmc2V0LnkgXSxcblx0XHRcdGNlbnRlcjogWyB0aGlzLmNlbnRlci54LCB0aGlzLmNlbnRlci55IF0sXG5cdFx0XHRyb3RhdGlvbjogdGhpcy5yb3RhdGlvbixcblxuXHRcdFx0d3JhcDogWyB0aGlzLndyYXBTLCB0aGlzLndyYXBUIF0sXG5cblx0XHRcdGZvcm1hdDogdGhpcy5mb3JtYXQsXG5cdFx0XHRtaW5GaWx0ZXI6IHRoaXMubWluRmlsdGVyLFxuXHRcdFx0bWFnRmlsdGVyOiB0aGlzLm1hZ0ZpbHRlcixcblx0XHRcdGFuaXNvdHJvcHk6IHRoaXMuYW5pc290cm9weSxcblxuXHRcdFx0ZmxpcFk6IHRoaXMuZmxpcFlcblxuXHRcdH07XG5cblx0XHRpZiAoIHRoaXMuaW1hZ2UgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Ly8gVE9ETzogTW92ZSB0byBUSFJFRS5JbWFnZVxuXG5cdFx0XHR2YXIgaW1hZ2UgPSB0aGlzLmltYWdlO1xuXG5cdFx0XHRpZiAoIGltYWdlLnV1aWQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRpbWFnZS51dWlkID0gX01hdGguZ2VuZXJhdGVVVUlEKCk7IC8vIFVHSFxuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggISBpc1Jvb3RPYmplY3QgJiYgbWV0YS5pbWFnZXNbIGltYWdlLnV1aWQgXSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdG1ldGEuaW1hZ2VzWyBpbWFnZS51dWlkIF0gPSB7XG5cdFx0XHRcdFx0dXVpZDogaW1hZ2UudXVpZCxcblx0XHRcdFx0XHR1cmw6IGdldERhdGFVUkwoIGltYWdlIClcblx0XHRcdFx0fTtcblxuXHRcdFx0fVxuXG5cdFx0XHRvdXRwdXQuaW1hZ2UgPSBpbWFnZS51dWlkO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCAhIGlzUm9vdE9iamVjdCApIHtcblxuXHRcdFx0bWV0YS50ZXh0dXJlc1sgdGhpcy51dWlkIF0gPSBvdXRwdXQ7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gb3V0cHV0O1xuXG5cdH0sXG5cblx0ZGlzcG9zZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5kaXNwYXRjaEV2ZW50KCB7IHR5cGU6ICdkaXNwb3NlJyB9ICk7XG5cblx0fSxcblxuXHR0cmFuc2Zvcm1VdjogZnVuY3Rpb24gKCB1diApIHtcblxuXHRcdGlmICggdGhpcy5tYXBwaW5nICE9PSBVVk1hcHBpbmcgKSByZXR1cm47XG5cblx0XHR1di5hcHBseU1hdHJpeDMoIHRoaXMubWF0cml4ICk7XG5cblx0XHRpZiAoIHV2LnggPCAwIHx8IHV2LnggPiAxICkge1xuXG5cdFx0XHRzd2l0Y2ggKCB0aGlzLndyYXBTICkge1xuXG5cdFx0XHRcdGNhc2UgUmVwZWF0V3JhcHBpbmc6XG5cblx0XHRcdFx0XHR1di54ID0gdXYueCAtIE1hdGguZmxvb3IoIHV2LnggKTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlIENsYW1wVG9FZGdlV3JhcHBpbmc6XG5cblx0XHRcdFx0XHR1di54ID0gdXYueCA8IDAgPyAwIDogMTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlIE1pcnJvcmVkUmVwZWF0V3JhcHBpbmc6XG5cblx0XHRcdFx0XHRpZiAoIE1hdGguYWJzKCBNYXRoLmZsb29yKCB1di54ICkgJSAyICkgPT09IDEgKSB7XG5cblx0XHRcdFx0XHRcdHV2LnggPSBNYXRoLmNlaWwoIHV2LnggKSAtIHV2Lng7XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHR1di54ID0gdXYueCAtIE1hdGguZmxvb3IoIHV2LnggKTtcblxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCB1di55IDwgMCB8fCB1di55ID4gMSApIHtcblxuXHRcdFx0c3dpdGNoICggdGhpcy53cmFwVCApIHtcblxuXHRcdFx0XHRjYXNlIFJlcGVhdFdyYXBwaW5nOlxuXG5cdFx0XHRcdFx0dXYueSA9IHV2LnkgLSBNYXRoLmZsb29yKCB1di55ICk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSBDbGFtcFRvRWRnZVdyYXBwaW5nOlxuXG5cdFx0XHRcdFx0dXYueSA9IHV2LnkgPCAwID8gMCA6IDE7XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSBNaXJyb3JlZFJlcGVhdFdyYXBwaW5nOlxuXG5cdFx0XHRcdFx0aWYgKCBNYXRoLmFicyggTWF0aC5mbG9vciggdXYueSApICUgMiApID09PSAxICkge1xuXG5cdFx0XHRcdFx0XHR1di55ID0gTWF0aC5jZWlsKCB1di55ICkgLSB1di55O1xuXG5cdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0dXYueSA9IHV2LnkgLSBNYXRoLmZsb29yKCB1di55ICk7XG5cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5mbGlwWSApIHtcblxuXHRcdFx0dXYueSA9IDEgLSB1di55O1xuXG5cdFx0fVxuXG5cdH1cblxufSApO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoIFRleHR1cmUucHJvdG90eXBlLCBcIm5lZWRzVXBkYXRlXCIsIHtcblxuXHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRpZiAoIHZhbHVlID09PSB0cnVlICkgdGhpcy52ZXJzaW9uICsrO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3Igc3VwZXJlZ2diZXJ0IC8gaHR0cDovL3d3dy5wYXVsYnJ1bnQuY28udWsvXG4gKiBAYXV0aG9yIHBoaWxvZ2IgLyBodHRwOi8vYmxvZy50aGVqaXQub3JnL1xuICogQGF1dGhvciBtaWthZWwgZW10aW5nZXIgLyBodHRwOi8vZ29tby5zZS9cbiAqIEBhdXRob3IgZWdyYWV0aGVyIC8gaHR0cDovL2VncmFldGhlci5jb20vXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqL1xuXG5mdW5jdGlvbiBWZWN0b3I0KCB4LCB5LCB6LCB3ICkge1xuXG5cdHRoaXMueCA9IHggfHwgMDtcblx0dGhpcy55ID0geSB8fCAwO1xuXHR0aGlzLnogPSB6IHx8IDA7XG5cdHRoaXMudyA9ICggdyAhPT0gdW5kZWZpbmVkICkgPyB3IDogMTtcblxufVxuXG5PYmplY3QuYXNzaWduKCBWZWN0b3I0LnByb3RvdHlwZSwge1xuXG5cdGlzVmVjdG9yNDogdHJ1ZSxcblxuXHRzZXQ6IGZ1bmN0aW9uICggeCwgeSwgeiwgdyApIHtcblxuXHRcdHRoaXMueCA9IHg7XG5cdFx0dGhpcy55ID0geTtcblx0XHR0aGlzLnogPSB6O1xuXHRcdHRoaXMudyA9IHc7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFNjYWxhcjogZnVuY3Rpb24gKCBzY2FsYXIgKSB7XG5cblx0XHR0aGlzLnggPSBzY2FsYXI7XG5cdFx0dGhpcy55ID0gc2NhbGFyO1xuXHRcdHRoaXMueiA9IHNjYWxhcjtcblx0XHR0aGlzLncgPSBzY2FsYXI7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFg6IGZ1bmN0aW9uICggeCApIHtcblxuXHRcdHRoaXMueCA9IHg7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFk6IGZ1bmN0aW9uICggeSApIHtcblxuXHRcdHRoaXMueSA9IHk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFo6IGZ1bmN0aW9uICggeiApIHtcblxuXHRcdHRoaXMueiA9IHo7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFc6IGZ1bmN0aW9uICggdyApIHtcblxuXHRcdHRoaXMudyA9IHc7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldENvbXBvbmVudDogZnVuY3Rpb24gKCBpbmRleCwgdmFsdWUgKSB7XG5cblx0XHRzd2l0Y2ggKCBpbmRleCApIHtcblxuXHRcdFx0Y2FzZSAwOiB0aGlzLnggPSB2YWx1ZTsgYnJlYWs7XG5cdFx0XHRjYXNlIDE6IHRoaXMueSA9IHZhbHVlOyBicmVhaztcblx0XHRcdGNhc2UgMjogdGhpcy56ID0gdmFsdWU7IGJyZWFrO1xuXHRcdFx0Y2FzZSAzOiB0aGlzLncgPSB2YWx1ZTsgYnJlYWs7XG5cdFx0XHRkZWZhdWx0OiB0aHJvdyBuZXcgRXJyb3IoICdpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICcgKyBpbmRleCApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRnZXRDb21wb25lbnQ6IGZ1bmN0aW9uICggaW5kZXggKSB7XG5cblx0XHRzd2l0Y2ggKCBpbmRleCApIHtcblxuXHRcdFx0Y2FzZSAwOiByZXR1cm4gdGhpcy54O1xuXHRcdFx0Y2FzZSAxOiByZXR1cm4gdGhpcy55O1xuXHRcdFx0Y2FzZSAyOiByZXR1cm4gdGhpcy56O1xuXHRcdFx0Y2FzZSAzOiByZXR1cm4gdGhpcy53O1xuXHRcdFx0ZGVmYXVsdDogdGhyb3cgbmV3IEVycm9yKCAnaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAnICsgaW5kZXggKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoIHRoaXMueCwgdGhpcy55LCB0aGlzLnosIHRoaXMudyApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0dGhpcy54ID0gdi54O1xuXHRcdHRoaXMueSA9IHYueTtcblx0XHR0aGlzLnogPSB2Lno7XG5cdFx0dGhpcy53ID0gKCB2LncgIT09IHVuZGVmaW5lZCApID8gdi53IDogMTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YWRkOiBmdW5jdGlvbiAoIHYsIHcgKSB7XG5cblx0XHRpZiAoIHcgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yNDogLmFkZCgpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLmFkZFZlY3RvcnMoIGEsIGIgKSBpbnN0ZWFkLicgKTtcblx0XHRcdHJldHVybiB0aGlzLmFkZFZlY3RvcnMoIHYsIHcgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMueCArPSB2Lng7XG5cdFx0dGhpcy55ICs9IHYueTtcblx0XHR0aGlzLnogKz0gdi56O1xuXHRcdHRoaXMudyArPSB2Lnc7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFkZFNjYWxhcjogZnVuY3Rpb24gKCBzICkge1xuXG5cdFx0dGhpcy54ICs9IHM7XG5cdFx0dGhpcy55ICs9IHM7XG5cdFx0dGhpcy56ICs9IHM7XG5cdFx0dGhpcy53ICs9IHM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFkZFZlY3RvcnM6IGZ1bmN0aW9uICggYSwgYiApIHtcblxuXHRcdHRoaXMueCA9IGEueCArIGIueDtcblx0XHR0aGlzLnkgPSBhLnkgKyBiLnk7XG5cdFx0dGhpcy56ID0gYS56ICsgYi56O1xuXHRcdHRoaXMudyA9IGEudyArIGIudztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YWRkU2NhbGVkVmVjdG9yOiBmdW5jdGlvbiAoIHYsIHMgKSB7XG5cblx0XHR0aGlzLnggKz0gdi54ICogcztcblx0XHR0aGlzLnkgKz0gdi55ICogcztcblx0XHR0aGlzLnogKz0gdi56ICogcztcblx0XHR0aGlzLncgKz0gdi53ICogcztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c3ViOiBmdW5jdGlvbiAoIHYsIHcgKSB7XG5cblx0XHRpZiAoIHcgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yNDogLnN1YigpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLnN1YlZlY3RvcnMoIGEsIGIgKSBpbnN0ZWFkLicgKTtcblx0XHRcdHJldHVybiB0aGlzLnN1YlZlY3RvcnMoIHYsIHcgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMueCAtPSB2Lng7XG5cdFx0dGhpcy55IC09IHYueTtcblx0XHR0aGlzLnogLT0gdi56O1xuXHRcdHRoaXMudyAtPSB2Lnc7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHN1YlNjYWxhcjogZnVuY3Rpb24gKCBzICkge1xuXG5cdFx0dGhpcy54IC09IHM7XG5cdFx0dGhpcy55IC09IHM7XG5cdFx0dGhpcy56IC09IHM7XG5cdFx0dGhpcy53IC09IHM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHN1YlZlY3RvcnM6IGZ1bmN0aW9uICggYSwgYiApIHtcblxuXHRcdHRoaXMueCA9IGEueCAtIGIueDtcblx0XHR0aGlzLnkgPSBhLnkgLSBiLnk7XG5cdFx0dGhpcy56ID0gYS56IC0gYi56O1xuXHRcdHRoaXMudyA9IGEudyAtIGIudztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bXVsdGlwbHlTY2FsYXI6IGZ1bmN0aW9uICggc2NhbGFyICkge1xuXG5cdFx0dGhpcy54ICo9IHNjYWxhcjtcblx0XHR0aGlzLnkgKj0gc2NhbGFyO1xuXHRcdHRoaXMueiAqPSBzY2FsYXI7XG5cdFx0dGhpcy53ICo9IHNjYWxhcjtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YXBwbHlNYXRyaXg0OiBmdW5jdGlvbiAoIG0gKSB7XG5cblx0XHR2YXIgeCA9IHRoaXMueCwgeSA9IHRoaXMueSwgeiA9IHRoaXMueiwgdyA9IHRoaXMudztcblx0XHR2YXIgZSA9IG0uZWxlbWVudHM7XG5cblx0XHR0aGlzLnggPSBlWyAwIF0gKiB4ICsgZVsgNCBdICogeSArIGVbIDggXSAqIHogKyBlWyAxMiBdICogdztcblx0XHR0aGlzLnkgPSBlWyAxIF0gKiB4ICsgZVsgNSBdICogeSArIGVbIDkgXSAqIHogKyBlWyAxMyBdICogdztcblx0XHR0aGlzLnogPSBlWyAyIF0gKiB4ICsgZVsgNiBdICogeSArIGVbIDEwIF0gKiB6ICsgZVsgMTQgXSAqIHc7XG5cdFx0dGhpcy53ID0gZVsgMyBdICogeCArIGVbIDcgXSAqIHkgKyBlWyAxMSBdICogeiArIGVbIDE1IF0gKiB3O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRkaXZpZGVTY2FsYXI6IGZ1bmN0aW9uICggc2NhbGFyICkge1xuXG5cdFx0cmV0dXJuIHRoaXMubXVsdGlwbHlTY2FsYXIoIDEgLyBzY2FsYXIgKTtcblxuXHR9LFxuXG5cdHNldEF4aXNBbmdsZUZyb21RdWF0ZXJuaW9uOiBmdW5jdGlvbiAoIHEgKSB7XG5cblx0XHQvLyBodHRwOi8vd3d3LmV1Y2xpZGVhbnNwYWNlLmNvbS9tYXRocy9nZW9tZXRyeS9yb3RhdGlvbnMvY29udmVyc2lvbnMvcXVhdGVybmlvblRvQW5nbGUvaW5kZXguaHRtXG5cblx0XHQvLyBxIGlzIGFzc3VtZWQgdG8gYmUgbm9ybWFsaXplZFxuXG5cdFx0dGhpcy53ID0gMiAqIE1hdGguYWNvcyggcS53ICk7XG5cblx0XHR2YXIgcyA9IE1hdGguc3FydCggMSAtIHEudyAqIHEudyApO1xuXG5cdFx0aWYgKCBzIDwgMC4wMDAxICkge1xuXG5cdFx0XHR0aGlzLnggPSAxO1xuXHRcdFx0dGhpcy55ID0gMDtcblx0XHRcdHRoaXMueiA9IDA7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR0aGlzLnggPSBxLnggLyBzO1xuXHRcdFx0dGhpcy55ID0gcS55IC8gcztcblx0XHRcdHRoaXMueiA9IHEueiAvIHM7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEF4aXNBbmdsZUZyb21Sb3RhdGlvbk1hdHJpeDogZnVuY3Rpb24gKCBtICkge1xuXG5cdFx0Ly8gaHR0cDovL3d3dy5ldWNsaWRlYW5zcGFjZS5jb20vbWF0aHMvZ2VvbWV0cnkvcm90YXRpb25zL2NvbnZlcnNpb25zL21hdHJpeFRvQW5nbGUvaW5kZXguaHRtXG5cblx0XHQvLyBhc3N1bWVzIHRoZSB1cHBlciAzeDMgb2YgbSBpcyBhIHB1cmUgcm90YXRpb24gbWF0cml4IChpLmUsIHVuc2NhbGVkKVxuXG5cdFx0dmFyIGFuZ2xlLCB4LCB5LCB6LFx0XHQvLyB2YXJpYWJsZXMgZm9yIHJlc3VsdFxuXHRcdFx0ZXBzaWxvbiA9IDAuMDEsXHRcdC8vIG1hcmdpbiB0byBhbGxvdyBmb3Igcm91bmRpbmcgZXJyb3JzXG5cdFx0XHRlcHNpbG9uMiA9IDAuMSxcdFx0Ly8gbWFyZ2luIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gMCBhbmQgMTgwIGRlZ3JlZXNcblxuXHRcdFx0dGUgPSBtLmVsZW1lbnRzLFxuXG5cdFx0XHRtMTEgPSB0ZVsgMCBdLCBtMTIgPSB0ZVsgNCBdLCBtMTMgPSB0ZVsgOCBdLFxuXHRcdFx0bTIxID0gdGVbIDEgXSwgbTIyID0gdGVbIDUgXSwgbTIzID0gdGVbIDkgXSxcblx0XHRcdG0zMSA9IHRlWyAyIF0sIG0zMiA9IHRlWyA2IF0sIG0zMyA9IHRlWyAxMCBdO1xuXG5cdFx0aWYgKCAoIE1hdGguYWJzKCBtMTIgLSBtMjEgKSA8IGVwc2lsb24gKSAmJlxuXHRcdCAgICAgKCBNYXRoLmFicyggbTEzIC0gbTMxICkgPCBlcHNpbG9uICkgJiZcblx0XHQgICAgICggTWF0aC5hYnMoIG0yMyAtIG0zMiApIDwgZXBzaWxvbiApICkge1xuXG5cdFx0XHQvLyBzaW5ndWxhcml0eSBmb3VuZFxuXHRcdFx0Ly8gZmlyc3QgY2hlY2sgZm9yIGlkZW50aXR5IG1hdHJpeCB3aGljaCBtdXN0IGhhdmUgKzEgZm9yIGFsbCB0ZXJtc1xuXHRcdFx0Ly8gaW4gbGVhZGluZyBkaWFnb25hbCBhbmQgemVybyBpbiBvdGhlciB0ZXJtc1xuXG5cdFx0XHRpZiAoICggTWF0aC5hYnMoIG0xMiArIG0yMSApIDwgZXBzaWxvbjIgKSAmJlxuXHRcdFx0ICAgICAoIE1hdGguYWJzKCBtMTMgKyBtMzEgKSA8IGVwc2lsb24yICkgJiZcblx0XHRcdCAgICAgKCBNYXRoLmFicyggbTIzICsgbTMyICkgPCBlcHNpbG9uMiApICYmXG5cdFx0XHQgICAgICggTWF0aC5hYnMoIG0xMSArIG0yMiArIG0zMyAtIDMgKSA8IGVwc2lsb24yICkgKSB7XG5cblx0XHRcdFx0Ly8gdGhpcyBzaW5ndWxhcml0eSBpcyBpZGVudGl0eSBtYXRyaXggc28gYW5nbGUgPSAwXG5cblx0XHRcdFx0dGhpcy5zZXQoIDEsIDAsIDAsIDAgKTtcblxuXHRcdFx0XHRyZXR1cm4gdGhpczsgLy8gemVybyBhbmdsZSwgYXJiaXRyYXJ5IGF4aXNcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBvdGhlcndpc2UgdGhpcyBzaW5ndWxhcml0eSBpcyBhbmdsZSA9IDE4MFxuXG5cdFx0XHRhbmdsZSA9IE1hdGguUEk7XG5cblx0XHRcdHZhciB4eCA9ICggbTExICsgMSApIC8gMjtcblx0XHRcdHZhciB5eSA9ICggbTIyICsgMSApIC8gMjtcblx0XHRcdHZhciB6eiA9ICggbTMzICsgMSApIC8gMjtcblx0XHRcdHZhciB4eSA9ICggbTEyICsgbTIxICkgLyA0O1xuXHRcdFx0dmFyIHh6ID0gKCBtMTMgKyBtMzEgKSAvIDQ7XG5cdFx0XHR2YXIgeXogPSAoIG0yMyArIG0zMiApIC8gNDtcblxuXHRcdFx0aWYgKCAoIHh4ID4geXkgKSAmJiAoIHh4ID4genogKSApIHtcblxuXHRcdFx0XHQvLyBtMTEgaXMgdGhlIGxhcmdlc3QgZGlhZ29uYWwgdGVybVxuXG5cdFx0XHRcdGlmICggeHggPCBlcHNpbG9uICkge1xuXG5cdFx0XHRcdFx0eCA9IDA7XG5cdFx0XHRcdFx0eSA9IDAuNzA3MTA2NzgxO1xuXHRcdFx0XHRcdHogPSAwLjcwNzEwNjc4MTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0eCA9IE1hdGguc3FydCggeHggKTtcblx0XHRcdFx0XHR5ID0geHkgLyB4O1xuXHRcdFx0XHRcdHogPSB4eiAvIHg7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IGVsc2UgaWYgKCB5eSA+IHp6ICkge1xuXG5cdFx0XHRcdC8vIG0yMiBpcyB0aGUgbGFyZ2VzdCBkaWFnb25hbCB0ZXJtXG5cblx0XHRcdFx0aWYgKCB5eSA8IGVwc2lsb24gKSB7XG5cblx0XHRcdFx0XHR4ID0gMC43MDcxMDY3ODE7XG5cdFx0XHRcdFx0eSA9IDA7XG5cdFx0XHRcdFx0eiA9IDAuNzA3MTA2NzgxO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHR5ID0gTWF0aC5zcXJ0KCB5eSApO1xuXHRcdFx0XHRcdHggPSB4eSAvIHk7XG5cdFx0XHRcdFx0eiA9IHl6IC8geTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Ly8gbTMzIGlzIHRoZSBsYXJnZXN0IGRpYWdvbmFsIHRlcm0gc28gYmFzZSByZXN1bHQgb24gdGhpc1xuXG5cdFx0XHRcdGlmICggenogPCBlcHNpbG9uICkge1xuXG5cdFx0XHRcdFx0eCA9IDAuNzA3MTA2NzgxO1xuXHRcdFx0XHRcdHkgPSAwLjcwNzEwNjc4MTtcblx0XHRcdFx0XHR6ID0gMDtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0eiA9IE1hdGguc3FydCggenogKTtcblx0XHRcdFx0XHR4ID0geHogLyB6O1xuXHRcdFx0XHRcdHkgPSB5eiAvIHo7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuc2V0KCB4LCB5LCB6LCBhbmdsZSApO1xuXG5cdFx0XHRyZXR1cm4gdGhpczsgLy8gcmV0dXJuIDE4MCBkZWcgcm90YXRpb25cblxuXHRcdH1cblxuXHRcdC8vIGFzIHdlIGhhdmUgcmVhY2hlZCBoZXJlIHRoZXJlIGFyZSBubyBzaW5ndWxhcml0aWVzIHNvIHdlIGNhbiBoYW5kbGUgbm9ybWFsbHlcblxuXHRcdHZhciBzID0gTWF0aC5zcXJ0KCAoIG0zMiAtIG0yMyApICogKCBtMzIgLSBtMjMgKSArXG5cdFx0ICAgICAgICAgICAgICAgICAgICggbTEzIC0gbTMxICkgKiAoIG0xMyAtIG0zMSApICtcblx0XHQgICAgICAgICAgICAgICAgICAgKCBtMjEgLSBtMTIgKSAqICggbTIxIC0gbTEyICkgKTsgLy8gdXNlZCB0byBub3JtYWxpemVcblxuXHRcdGlmICggTWF0aC5hYnMoIHMgKSA8IDAuMDAxICkgcyA9IDE7XG5cblx0XHQvLyBwcmV2ZW50IGRpdmlkZSBieSB6ZXJvLCBzaG91bGQgbm90IGhhcHBlbiBpZiBtYXRyaXggaXMgb3J0aG9nb25hbCBhbmQgc2hvdWxkIGJlXG5cdFx0Ly8gY2F1Z2h0IGJ5IHNpbmd1bGFyaXR5IHRlc3QgYWJvdmUsIGJ1dCBJJ3ZlIGxlZnQgaXQgaW4ganVzdCBpbiBjYXNlXG5cblx0XHR0aGlzLnggPSAoIG0zMiAtIG0yMyApIC8gcztcblx0XHR0aGlzLnkgPSAoIG0xMyAtIG0zMSApIC8gcztcblx0XHR0aGlzLnogPSAoIG0yMSAtIG0xMiApIC8gcztcblx0XHR0aGlzLncgPSBNYXRoLmFjb3MoICggbTExICsgbTIyICsgbTMzIC0gMSApIC8gMiApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtaW46IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHRoaXMueCA9IE1hdGgubWluKCB0aGlzLngsIHYueCApO1xuXHRcdHRoaXMueSA9IE1hdGgubWluKCB0aGlzLnksIHYueSApO1xuXHRcdHRoaXMueiA9IE1hdGgubWluKCB0aGlzLnosIHYueiApO1xuXHRcdHRoaXMudyA9IE1hdGgubWluKCB0aGlzLncsIHYudyApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtYXg6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHRoaXMueCA9IE1hdGgubWF4KCB0aGlzLngsIHYueCApO1xuXHRcdHRoaXMueSA9IE1hdGgubWF4KCB0aGlzLnksIHYueSApO1xuXHRcdHRoaXMueiA9IE1hdGgubWF4KCB0aGlzLnosIHYueiApO1xuXHRcdHRoaXMudyA9IE1hdGgubWF4KCB0aGlzLncsIHYudyApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjbGFtcDogZnVuY3Rpb24gKCBtaW4sIG1heCApIHtcblxuXHRcdC8vIGFzc3VtZXMgbWluIDwgbWF4LCBjb21wb25lbnR3aXNlXG5cblx0XHR0aGlzLnggPSBNYXRoLm1heCggbWluLngsIE1hdGgubWluKCBtYXgueCwgdGhpcy54ICkgKTtcblx0XHR0aGlzLnkgPSBNYXRoLm1heCggbWluLnksIE1hdGgubWluKCBtYXgueSwgdGhpcy55ICkgKTtcblx0XHR0aGlzLnogPSBNYXRoLm1heCggbWluLnosIE1hdGgubWluKCBtYXgueiwgdGhpcy56ICkgKTtcblx0XHR0aGlzLncgPSBNYXRoLm1heCggbWluLncsIE1hdGgubWluKCBtYXgudywgdGhpcy53ICkgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xhbXBTY2FsYXI6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBtaW4sIG1heDtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBjbGFtcFNjYWxhciggbWluVmFsLCBtYXhWYWwgKSB7XG5cblx0XHRcdGlmICggbWluID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0bWluID0gbmV3IFZlY3RvcjQoKTtcblx0XHRcdFx0bWF4ID0gbmV3IFZlY3RvcjQoKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRtaW4uc2V0KCBtaW5WYWwsIG1pblZhbCwgbWluVmFsLCBtaW5WYWwgKTtcblx0XHRcdG1heC5zZXQoIG1heFZhbCwgbWF4VmFsLCBtYXhWYWwsIG1heFZhbCApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5jbGFtcCggbWluLCBtYXggKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGNsYW1wTGVuZ3RoOiBmdW5jdGlvbiAoIG1pbiwgbWF4ICkge1xuXG5cdFx0dmFyIGxlbmd0aCA9IHRoaXMubGVuZ3RoKCk7XG5cblx0XHRyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIoIGxlbmd0aCB8fCAxICkubXVsdGlwbHlTY2FsYXIoIE1hdGgubWF4KCBtaW4sIE1hdGgubWluKCBtYXgsIGxlbmd0aCApICkgKTtcblxuXHR9LFxuXG5cdGZsb29yOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLnggPSBNYXRoLmZsb29yKCB0aGlzLnggKTtcblx0XHR0aGlzLnkgPSBNYXRoLmZsb29yKCB0aGlzLnkgKTtcblx0XHR0aGlzLnogPSBNYXRoLmZsb29yKCB0aGlzLnogKTtcblx0XHR0aGlzLncgPSBNYXRoLmZsb29yKCB0aGlzLncgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2VpbDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy54ID0gTWF0aC5jZWlsKCB0aGlzLnggKTtcblx0XHR0aGlzLnkgPSBNYXRoLmNlaWwoIHRoaXMueSApO1xuXHRcdHRoaXMueiA9IE1hdGguY2VpbCggdGhpcy56ICk7XG5cdFx0dGhpcy53ID0gTWF0aC5jZWlsKCB0aGlzLncgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0cm91bmQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMueCA9IE1hdGgucm91bmQoIHRoaXMueCApO1xuXHRcdHRoaXMueSA9IE1hdGgucm91bmQoIHRoaXMueSApO1xuXHRcdHRoaXMueiA9IE1hdGgucm91bmQoIHRoaXMueiApO1xuXHRcdHRoaXMudyA9IE1hdGgucm91bmQoIHRoaXMudyApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRyb3VuZFRvWmVybzogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy54ID0gKCB0aGlzLnggPCAwICkgPyBNYXRoLmNlaWwoIHRoaXMueCApIDogTWF0aC5mbG9vciggdGhpcy54ICk7XG5cdFx0dGhpcy55ID0gKCB0aGlzLnkgPCAwICkgPyBNYXRoLmNlaWwoIHRoaXMueSApIDogTWF0aC5mbG9vciggdGhpcy55ICk7XG5cdFx0dGhpcy56ID0gKCB0aGlzLnogPCAwICkgPyBNYXRoLmNlaWwoIHRoaXMueiApIDogTWF0aC5mbG9vciggdGhpcy56ICk7XG5cdFx0dGhpcy53ID0gKCB0aGlzLncgPCAwICkgPyBNYXRoLmNlaWwoIHRoaXMudyApIDogTWF0aC5mbG9vciggdGhpcy53ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG5lZ2F0ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy54ID0gLSB0aGlzLng7XG5cdFx0dGhpcy55ID0gLSB0aGlzLnk7XG5cdFx0dGhpcy56ID0gLSB0aGlzLno7XG5cdFx0dGhpcy53ID0gLSB0aGlzLnc7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGRvdDogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0cmV0dXJuIHRoaXMueCAqIHYueCArIHRoaXMueSAqIHYueSArIHRoaXMueiAqIHYueiArIHRoaXMudyAqIHYudztcblxuXHR9LFxuXG5cdGxlbmd0aFNxOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy54ICogdGhpcy54ICsgdGhpcy55ICogdGhpcy55ICsgdGhpcy56ICogdGhpcy56ICsgdGhpcy53ICogdGhpcy53O1xuXG5cdH0sXG5cblx0bGVuZ3RoOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gTWF0aC5zcXJ0KCB0aGlzLnggKiB0aGlzLnggKyB0aGlzLnkgKiB0aGlzLnkgKyB0aGlzLnogKiB0aGlzLnogKyB0aGlzLncgKiB0aGlzLncgKTtcblxuXHR9LFxuXG5cdG1hbmhhdHRhbkxlbmd0aDogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIE1hdGguYWJzKCB0aGlzLnggKSArIE1hdGguYWJzKCB0aGlzLnkgKSArIE1hdGguYWJzKCB0aGlzLnogKSArIE1hdGguYWJzKCB0aGlzLncgKTtcblxuXHR9LFxuXG5cdG5vcm1hbGl6ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKCB0aGlzLmxlbmd0aCgpIHx8IDEgKTtcblxuXHR9LFxuXG5cdHNldExlbmd0aDogZnVuY3Rpb24gKCBsZW5ndGggKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhciggbGVuZ3RoICk7XG5cblx0fSxcblxuXHRsZXJwOiBmdW5jdGlvbiAoIHYsIGFscGhhICkge1xuXG5cdFx0dGhpcy54ICs9ICggdi54IC0gdGhpcy54ICkgKiBhbHBoYTtcblx0XHR0aGlzLnkgKz0gKCB2LnkgLSB0aGlzLnkgKSAqIGFscGhhO1xuXHRcdHRoaXMueiArPSAoIHYueiAtIHRoaXMueiApICogYWxwaGE7XG5cdFx0dGhpcy53ICs9ICggdi53IC0gdGhpcy53ICkgKiBhbHBoYTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bGVycFZlY3RvcnM6IGZ1bmN0aW9uICggdjEsIHYyLCBhbHBoYSApIHtcblxuXHRcdHJldHVybiB0aGlzLnN1YlZlY3RvcnMoIHYyLCB2MSApLm11bHRpcGx5U2NhbGFyKCBhbHBoYSApLmFkZCggdjEgKTtcblxuXHR9LFxuXG5cdGVxdWFsczogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0cmV0dXJuICggKCB2LnggPT09IHRoaXMueCApICYmICggdi55ID09PSB0aGlzLnkgKSAmJiAoIHYueiA9PT0gdGhpcy56ICkgJiYgKCB2LncgPT09IHRoaXMudyApICk7XG5cblx0fSxcblxuXHRmcm9tQXJyYXk6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCApIHtcblxuXHRcdGlmICggb2Zmc2V0ID09PSB1bmRlZmluZWQgKSBvZmZzZXQgPSAwO1xuXG5cdFx0dGhpcy54ID0gYXJyYXlbIG9mZnNldCBdO1xuXHRcdHRoaXMueSA9IGFycmF5WyBvZmZzZXQgKyAxIF07XG5cdFx0dGhpcy56ID0gYXJyYXlbIG9mZnNldCArIDIgXTtcblx0XHR0aGlzLncgPSBhcnJheVsgb2Zmc2V0ICsgMyBdO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHR0b0FycmF5OiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoIGFycmF5ID09PSB1bmRlZmluZWQgKSBhcnJheSA9IFtdO1xuXHRcdGlmICggb2Zmc2V0ID09PSB1bmRlZmluZWQgKSBvZmZzZXQgPSAwO1xuXG5cdFx0YXJyYXlbIG9mZnNldCBdID0gdGhpcy54O1xuXHRcdGFycmF5WyBvZmZzZXQgKyAxIF0gPSB0aGlzLnk7XG5cdFx0YXJyYXlbIG9mZnNldCArIDIgXSA9IHRoaXMuejtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMyBdID0gdGhpcy53O1xuXG5cdFx0cmV0dXJuIGFycmF5O1xuXG5cdH0sXG5cblx0ZnJvbUJ1ZmZlckF0dHJpYnV0ZTogZnVuY3Rpb24gKCBhdHRyaWJ1dGUsIGluZGV4LCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoIG9mZnNldCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3I0OiBvZmZzZXQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIC5mcm9tQnVmZmVyQXR0cmlidXRlKCkuJyApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy54ID0gYXR0cmlidXRlLmdldFgoIGluZGV4ICk7XG5cdFx0dGhpcy55ID0gYXR0cmlidXRlLmdldFkoIGluZGV4ICk7XG5cdFx0dGhpcy56ID0gYXR0cmlidXRlLmdldFooIGluZGV4ICk7XG5cdFx0dGhpcy53ID0gYXR0cmlidXRlLmdldFcoIGluZGV4ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIHN6aW1layAvIGh0dHBzOi8vZ2l0aHViLmNvbS9zemltZWsvXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBNYXJpdXMgS2ludGVsIC8gaHR0cHM6Ly9naXRodWIuY29tL2tpbnRlbFxuICovXG5cbi8qXG4gSW4gb3B0aW9ucywgd2UgY2FuIHNwZWNpZnk6XG4gKiBUZXh0dXJlIHBhcmFtZXRlcnMgZm9yIGFuIGF1dG8tZ2VuZXJhdGVkIHRhcmdldCB0ZXh0dXJlXG4gKiBkZXB0aEJ1ZmZlci9zdGVuY2lsQnVmZmVyOiBCb29sZWFucyB0byBpbmRpY2F0ZSBpZiB3ZSBzaG91bGQgZ2VuZXJhdGUgdGhlc2UgYnVmZmVyc1xuKi9cbmZ1bmN0aW9uIFdlYkdMUmVuZGVyVGFyZ2V0KCB3aWR0aCwgaGVpZ2h0LCBvcHRpb25zICkge1xuXG5cdHRoaXMud2lkdGggPSB3aWR0aDtcblx0dGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG5cblx0dGhpcy5zY2lzc29yID0gbmV3IFZlY3RvcjQoIDAsIDAsIHdpZHRoLCBoZWlnaHQgKTtcblx0dGhpcy5zY2lzc29yVGVzdCA9IGZhbHNlO1xuXG5cdHRoaXMudmlld3BvcnQgPSBuZXcgVmVjdG9yNCggMCwgMCwgd2lkdGgsIGhlaWdodCApO1xuXG5cdG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG5cdGlmICggb3B0aW9ucy5taW5GaWx0ZXIgPT09IHVuZGVmaW5lZCApIG9wdGlvbnMubWluRmlsdGVyID0gTGluZWFyRmlsdGVyO1xuXG5cdHRoaXMudGV4dHVyZSA9IG5ldyBUZXh0dXJlKCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgb3B0aW9ucy53cmFwUywgb3B0aW9ucy53cmFwVCwgb3B0aW9ucy5tYWdGaWx0ZXIsIG9wdGlvbnMubWluRmlsdGVyLCBvcHRpb25zLmZvcm1hdCwgb3B0aW9ucy50eXBlLCBvcHRpb25zLmFuaXNvdHJvcHksIG9wdGlvbnMuZW5jb2RpbmcgKTtcblxuXHR0aGlzLmRlcHRoQnVmZmVyID0gb3B0aW9ucy5kZXB0aEJ1ZmZlciAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5kZXB0aEJ1ZmZlciA6IHRydWU7XG5cdHRoaXMuc3RlbmNpbEJ1ZmZlciA9IG9wdGlvbnMuc3RlbmNpbEJ1ZmZlciAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5zdGVuY2lsQnVmZmVyIDogdHJ1ZTtcblx0dGhpcy5kZXB0aFRleHR1cmUgPSBvcHRpb25zLmRlcHRoVGV4dHVyZSAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5kZXB0aFRleHR1cmUgOiBudWxsO1xuXG59XG5cbldlYkdMUmVuZGVyVGFyZ2V0LnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEV2ZW50RGlzcGF0Y2hlci5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBXZWJHTFJlbmRlclRhcmdldCxcblxuXHRpc1dlYkdMUmVuZGVyVGFyZ2V0OiB0cnVlLFxuXG5cdHNldFNpemU6IGZ1bmN0aW9uICggd2lkdGgsIGhlaWdodCApIHtcblxuXHRcdGlmICggdGhpcy53aWR0aCAhPT0gd2lkdGggfHwgdGhpcy5oZWlnaHQgIT09IGhlaWdodCApIHtcblxuXHRcdFx0dGhpcy53aWR0aCA9IHdpZHRoO1xuXHRcdFx0dGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG5cblx0XHRcdHRoaXMuZGlzcG9zZSgpO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy52aWV3cG9ydC5zZXQoIDAsIDAsIHdpZHRoLCBoZWlnaHQgKTtcblx0XHR0aGlzLnNjaXNzb3Iuc2V0KCAwLCAwLCB3aWR0aCwgaGVpZ2h0ICk7XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHR0aGlzLndpZHRoID0gc291cmNlLndpZHRoO1xuXHRcdHRoaXMuaGVpZ2h0ID0gc291cmNlLmhlaWdodDtcblxuXHRcdHRoaXMudmlld3BvcnQuY29weSggc291cmNlLnZpZXdwb3J0ICk7XG5cblx0XHR0aGlzLnRleHR1cmUgPSBzb3VyY2UudGV4dHVyZS5jbG9uZSgpO1xuXG5cdFx0dGhpcy5kZXB0aEJ1ZmZlciA9IHNvdXJjZS5kZXB0aEJ1ZmZlcjtcblx0XHR0aGlzLnN0ZW5jaWxCdWZmZXIgPSBzb3VyY2Uuc3RlbmNpbEJ1ZmZlcjtcblx0XHR0aGlzLmRlcHRoVGV4dHVyZSA9IHNvdXJjZS5kZXB0aFRleHR1cmU7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGRpc3Bvc2U6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuZGlzcGF0Y2hFdmVudCggeyB0eXBlOiAnZGlzcG9zZScgfSApO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb21cbiAqL1xuXG5mdW5jdGlvbiBXZWJHTFJlbmRlclRhcmdldEN1YmUoIHdpZHRoLCBoZWlnaHQsIG9wdGlvbnMgKSB7XG5cblx0V2ViR0xSZW5kZXJUYXJnZXQuY2FsbCggdGhpcywgd2lkdGgsIGhlaWdodCwgb3B0aW9ucyApO1xuXG5cdHRoaXMuYWN0aXZlQ3ViZUZhY2UgPSAwOyAvLyBQWCAwLCBOWCAxLCBQWSAyLCBOWSAzLCBQWiA0LCBOWiA1XG5cdHRoaXMuYWN0aXZlTWlwTWFwTGV2ZWwgPSAwO1xuXG59XG5cbldlYkdMUmVuZGVyVGFyZ2V0Q3ViZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBXZWJHTFJlbmRlclRhcmdldC5wcm90b3R5cGUgKTtcbldlYkdMUmVuZGVyVGFyZ2V0Q3ViZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBXZWJHTFJlbmRlclRhcmdldEN1YmU7XG5cbldlYkdMUmVuZGVyVGFyZ2V0Q3ViZS5wcm90b3R5cGUuaXNXZWJHTFJlbmRlclRhcmdldEN1YmUgPSB0cnVlO1xuXG4vKipcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKi9cblxuZnVuY3Rpb24gRGF0YVRleHR1cmUoIGRhdGEsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdHlwZSwgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIsIG1pbkZpbHRlciwgYW5pc290cm9weSwgZW5jb2RpbmcgKSB7XG5cblx0VGV4dHVyZS5jYWxsKCB0aGlzLCBudWxsLCBtYXBwaW5nLCB3cmFwUywgd3JhcFQsIG1hZ0ZpbHRlciwgbWluRmlsdGVyLCBmb3JtYXQsIHR5cGUsIGFuaXNvdHJvcHksIGVuY29kaW5nICk7XG5cblx0dGhpcy5pbWFnZSA9IHsgZGF0YTogZGF0YSwgd2lkdGg6IHdpZHRoLCBoZWlnaHQ6IGhlaWdodCB9O1xuXG5cdHRoaXMubWFnRmlsdGVyID0gbWFnRmlsdGVyICE9PSB1bmRlZmluZWQgPyBtYWdGaWx0ZXIgOiBOZWFyZXN0RmlsdGVyO1xuXHR0aGlzLm1pbkZpbHRlciA9IG1pbkZpbHRlciAhPT0gdW5kZWZpbmVkID8gbWluRmlsdGVyIDogTmVhcmVzdEZpbHRlcjtcblxuXHR0aGlzLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlO1xuXHR0aGlzLmZsaXBZID0gZmFsc2U7XG5cdHRoaXMudW5wYWNrQWxpZ25tZW50ID0gMTtcblxufVxuXG5EYXRhVGV4dHVyZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBUZXh0dXJlLnByb3RvdHlwZSApO1xuRGF0YVRleHR1cmUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gRGF0YVRleHR1cmU7XG5cbkRhdGFUZXh0dXJlLnByb3RvdHlwZS5pc0RhdGFUZXh0dXJlID0gdHJ1ZTtcblxuLyoqXG4gKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqL1xuXG5mdW5jdGlvbiBCb3gzKCBtaW4sIG1heCApIHtcblxuXHR0aGlzLm1pbiA9ICggbWluICE9PSB1bmRlZmluZWQgKSA/IG1pbiA6IG5ldyBWZWN0b3IzKCArIEluZmluaXR5LCArIEluZmluaXR5LCArIEluZmluaXR5ICk7XG5cdHRoaXMubWF4ID0gKCBtYXggIT09IHVuZGVmaW5lZCApID8gbWF4IDogbmV3IFZlY3RvcjMoIC0gSW5maW5pdHksIC0gSW5maW5pdHksIC0gSW5maW5pdHkgKTtcblxufVxuXG5PYmplY3QuYXNzaWduKCBCb3gzLnByb3RvdHlwZSwge1xuXG5cdGlzQm94MzogdHJ1ZSxcblxuXHRzZXQ6IGZ1bmN0aW9uICggbWluLCBtYXggKSB7XG5cblx0XHR0aGlzLm1pbi5jb3B5KCBtaW4gKTtcblx0XHR0aGlzLm1heC5jb3B5KCBtYXggKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbUFycmF5OiBmdW5jdGlvbiAoIGFycmF5ICkge1xuXG5cdFx0dmFyIG1pblggPSArIEluZmluaXR5O1xuXHRcdHZhciBtaW5ZID0gKyBJbmZpbml0eTtcblx0XHR2YXIgbWluWiA9ICsgSW5maW5pdHk7XG5cblx0XHR2YXIgbWF4WCA9IC0gSW5maW5pdHk7XG5cdFx0dmFyIG1heFkgPSAtIEluZmluaXR5O1xuXHRcdHZhciBtYXhaID0gLSBJbmZpbml0eTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGFycmF5Lmxlbmd0aDsgaSA8IGw7IGkgKz0gMyApIHtcblxuXHRcdFx0dmFyIHggPSBhcnJheVsgaSBdO1xuXHRcdFx0dmFyIHkgPSBhcnJheVsgaSArIDEgXTtcblx0XHRcdHZhciB6ID0gYXJyYXlbIGkgKyAyIF07XG5cblx0XHRcdGlmICggeCA8IG1pblggKSBtaW5YID0geDtcblx0XHRcdGlmICggeSA8IG1pblkgKSBtaW5ZID0geTtcblx0XHRcdGlmICggeiA8IG1pblogKSBtaW5aID0gejtcblxuXHRcdFx0aWYgKCB4ID4gbWF4WCApIG1heFggPSB4O1xuXHRcdFx0aWYgKCB5ID4gbWF4WSApIG1heFkgPSB5O1xuXHRcdFx0aWYgKCB6ID4gbWF4WiApIG1heFogPSB6O1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5taW4uc2V0KCBtaW5YLCBtaW5ZLCBtaW5aICk7XG5cdFx0dGhpcy5tYXguc2V0KCBtYXhYLCBtYXhZLCBtYXhaICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21CdWZmZXJBdHRyaWJ1dGU6IGZ1bmN0aW9uICggYXR0cmlidXRlICkge1xuXG5cdFx0dmFyIG1pblggPSArIEluZmluaXR5O1xuXHRcdHZhciBtaW5ZID0gKyBJbmZpbml0eTtcblx0XHR2YXIgbWluWiA9ICsgSW5maW5pdHk7XG5cblx0XHR2YXIgbWF4WCA9IC0gSW5maW5pdHk7XG5cdFx0dmFyIG1heFkgPSAtIEluZmluaXR5O1xuXHRcdHZhciBtYXhaID0gLSBJbmZpbml0eTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGF0dHJpYnV0ZS5jb3VudDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciB4ID0gYXR0cmlidXRlLmdldFgoIGkgKTtcblx0XHRcdHZhciB5ID0gYXR0cmlidXRlLmdldFkoIGkgKTtcblx0XHRcdHZhciB6ID0gYXR0cmlidXRlLmdldFooIGkgKTtcblxuXHRcdFx0aWYgKCB4IDwgbWluWCApIG1pblggPSB4O1xuXHRcdFx0aWYgKCB5IDwgbWluWSApIG1pblkgPSB5O1xuXHRcdFx0aWYgKCB6IDwgbWluWiApIG1pblogPSB6O1xuXG5cdFx0XHRpZiAoIHggPiBtYXhYICkgbWF4WCA9IHg7XG5cdFx0XHRpZiAoIHkgPiBtYXhZICkgbWF4WSA9IHk7XG5cdFx0XHRpZiAoIHogPiBtYXhaICkgbWF4WiA9IHo7XG5cblx0XHR9XG5cblx0XHR0aGlzLm1pbi5zZXQoIG1pblgsIG1pblksIG1pblogKTtcblx0XHR0aGlzLm1heC5zZXQoIG1heFgsIG1heFksIG1heFogKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbVBvaW50czogZnVuY3Rpb24gKCBwb2ludHMgKSB7XG5cblx0XHR0aGlzLm1ha2VFbXB0eSgpO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IHBvaW50cy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0dGhpcy5leHBhbmRCeVBvaW50KCBwb2ludHNbIGkgXSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRGcm9tQ2VudGVyQW5kU2l6ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBzZXRGcm9tQ2VudGVyQW5kU2l6ZSggY2VudGVyLCBzaXplICkge1xuXG5cdFx0XHR2YXIgaGFsZlNpemUgPSB2MS5jb3B5KCBzaXplICkubXVsdGlwbHlTY2FsYXIoIDAuNSApO1xuXG5cdFx0XHR0aGlzLm1pbi5jb3B5KCBjZW50ZXIgKS5zdWIoIGhhbGZTaXplICk7XG5cdFx0XHR0aGlzLm1heC5jb3B5KCBjZW50ZXIgKS5hZGQoIGhhbGZTaXplICk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0c2V0RnJvbU9iamVjdDogZnVuY3Rpb24gKCBvYmplY3QgKSB7XG5cblx0XHR0aGlzLm1ha2VFbXB0eSgpO1xuXG5cdFx0cmV0dXJuIHRoaXMuZXhwYW5kQnlPYmplY3QoIG9iamVjdCApO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggYm94ICkge1xuXG5cdFx0dGhpcy5taW4uY29weSggYm94Lm1pbiApO1xuXHRcdHRoaXMubWF4LmNvcHkoIGJveC5tYXggKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bWFrZUVtcHR5OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLm1pbi54ID0gdGhpcy5taW4ueSA9IHRoaXMubWluLnogPSArIEluZmluaXR5O1xuXHRcdHRoaXMubWF4LnggPSB0aGlzLm1heC55ID0gdGhpcy5tYXgueiA9IC0gSW5maW5pdHk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGlzRW1wdHk6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIHRoaXMgaXMgYSBtb3JlIHJvYnVzdCBjaGVjayBmb3IgZW1wdHkgdGhhbiAoIHZvbHVtZSA8PSAwICkgYmVjYXVzZSB2b2x1bWUgY2FuIGdldCBwb3NpdGl2ZSB3aXRoIHR3byBuZWdhdGl2ZSBheGVzXG5cblx0XHRyZXR1cm4gKCB0aGlzLm1heC54IDwgdGhpcy5taW4ueCApIHx8ICggdGhpcy5tYXgueSA8IHRoaXMubWluLnkgKSB8fCAoIHRoaXMubWF4LnogPCB0aGlzLm1pbi56ICk7XG5cblx0fSxcblxuXHRnZXRDZW50ZXI6IGZ1bmN0aW9uICggdGFyZ2V0ICkge1xuXG5cdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQm94MzogLmdldENlbnRlcigpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHR0YXJnZXQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuaXNFbXB0eSgpID8gdGFyZ2V0LnNldCggMCwgMCwgMCApIDogdGFyZ2V0LmFkZFZlY3RvcnMoIHRoaXMubWluLCB0aGlzLm1heCApLm11bHRpcGx5U2NhbGFyKCAwLjUgKTtcblxuXHR9LFxuXG5cdGdldFNpemU6IGZ1bmN0aW9uICggdGFyZ2V0ICkge1xuXG5cdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQm94MzogLmdldFNpemUoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApO1xuXHRcdFx0dGFyZ2V0ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmlzRW1wdHkoKSA/IHRhcmdldC5zZXQoIDAsIDAsIDAgKSA6IHRhcmdldC5zdWJWZWN0b3JzKCB0aGlzLm1heCwgdGhpcy5taW4gKTtcblxuXHR9LFxuXG5cdGV4cGFuZEJ5UG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQgKSB7XG5cblx0XHR0aGlzLm1pbi5taW4oIHBvaW50ICk7XG5cdFx0dGhpcy5tYXgubWF4KCBwb2ludCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRleHBhbmRCeVZlY3RvcjogZnVuY3Rpb24gKCB2ZWN0b3IgKSB7XG5cblx0XHR0aGlzLm1pbi5zdWIoIHZlY3RvciApO1xuXHRcdHRoaXMubWF4LmFkZCggdmVjdG9yICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGV4cGFuZEJ5U2NhbGFyOiBmdW5jdGlvbiAoIHNjYWxhciApIHtcblxuXHRcdHRoaXMubWluLmFkZFNjYWxhciggLSBzY2FsYXIgKTtcblx0XHR0aGlzLm1heC5hZGRTY2FsYXIoIHNjYWxhciApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRleHBhbmRCeU9iamVjdDogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gQ29tcHV0ZXMgdGhlIHdvcmxkLWF4aXMtYWxpZ25lZCBib3VuZGluZyBib3ggb2YgYW4gb2JqZWN0IChpbmNsdWRpbmcgaXRzIGNoaWxkcmVuKSxcblx0XHQvLyBhY2NvdW50aW5nIGZvciBib3RoIHRoZSBvYmplY3QncywgYW5kIGNoaWxkcmVuJ3MsIHdvcmxkIHRyYW5zZm9ybXNcblxuXHRcdHZhciBzY29wZSwgaSwgbDtcblxuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRmdW5jdGlvbiB0cmF2ZXJzZSggbm9kZSApIHtcblxuXHRcdFx0dmFyIGdlb21ldHJ5ID0gbm9kZS5nZW9tZXRyeTtcblxuXHRcdFx0aWYgKCBnZW9tZXRyeSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGlmICggZ2VvbWV0cnkuaXNHZW9tZXRyeSApIHtcblxuXHRcdFx0XHRcdHZhciB2ZXJ0aWNlcyA9IGdlb21ldHJ5LnZlcnRpY2VzO1xuXG5cdFx0XHRcdFx0Zm9yICggaSA9IDAsIGwgPSB2ZXJ0aWNlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0XHR2MS5jb3B5KCB2ZXJ0aWNlc1sgaSBdICk7XG5cdFx0XHRcdFx0XHR2MS5hcHBseU1hdHJpeDQoIG5vZGUubWF0cml4V29ybGQgKTtcblxuXHRcdFx0XHRcdFx0c2NvcGUuZXhwYW5kQnlQb2ludCggdjEgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9IGVsc2UgaWYgKCBnZW9tZXRyeS5pc0J1ZmZlckdlb21ldHJ5ICkge1xuXG5cdFx0XHRcdFx0dmFyIGF0dHJpYnV0ZSA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247XG5cblx0XHRcdFx0XHRpZiAoIGF0dHJpYnV0ZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0XHRmb3IgKCBpID0gMCwgbCA9IGF0dHJpYnV0ZS5jb3VudDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdFx0djEuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggYXR0cmlidXRlLCBpICkuYXBwbHlNYXRyaXg0KCBub2RlLm1hdHJpeFdvcmxkICk7XG5cblx0XHRcdFx0XHRcdFx0c2NvcGUuZXhwYW5kQnlQb2ludCggdjEgKTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGV4cGFuZEJ5T2JqZWN0KCBvYmplY3QgKSB7XG5cblx0XHRcdHNjb3BlID0gdGhpcztcblxuXHRcdFx0b2JqZWN0LnVwZGF0ZU1hdHJpeFdvcmxkKCB0cnVlICk7XG5cblx0XHRcdG9iamVjdC50cmF2ZXJzZSggdHJhdmVyc2UgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRjb250YWluc1BvaW50OiBmdW5jdGlvbiAoIHBvaW50ICkge1xuXG5cdFx0cmV0dXJuIHBvaW50LnggPCB0aGlzLm1pbi54IHx8IHBvaW50LnggPiB0aGlzLm1heC54IHx8XG5cdFx0XHRwb2ludC55IDwgdGhpcy5taW4ueSB8fCBwb2ludC55ID4gdGhpcy5tYXgueSB8fFxuXHRcdFx0cG9pbnQueiA8IHRoaXMubWluLnogfHwgcG9pbnQueiA+IHRoaXMubWF4LnogPyBmYWxzZSA6IHRydWU7XG5cblx0fSxcblxuXHRjb250YWluc0JveDogZnVuY3Rpb24gKCBib3ggKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5taW4ueCA8PSBib3gubWluLnggJiYgYm94Lm1heC54IDw9IHRoaXMubWF4LnggJiZcblx0XHRcdHRoaXMubWluLnkgPD0gYm94Lm1pbi55ICYmIGJveC5tYXgueSA8PSB0aGlzLm1heC55ICYmXG5cdFx0XHR0aGlzLm1pbi56IDw9IGJveC5taW4ueiAmJiBib3gubWF4LnogPD0gdGhpcy5tYXguejtcblxuXHR9LFxuXG5cdGdldFBhcmFtZXRlcjogZnVuY3Rpb24gKCBwb2ludCwgdGFyZ2V0ICkge1xuXG5cdFx0Ly8gVGhpcyBjYW4gcG90ZW50aWFsbHkgaGF2ZSBhIGRpdmlkZSBieSB6ZXJvIGlmIHRoZSBib3hcblx0XHQvLyBoYXMgYSBzaXplIGRpbWVuc2lvbiBvZiAwLlxuXG5cdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQm94MzogLmdldFBhcmFtZXRlcigpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHR0YXJnZXQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRhcmdldC5zZXQoXG5cdFx0XHQoIHBvaW50LnggLSB0aGlzLm1pbi54ICkgLyAoIHRoaXMubWF4LnggLSB0aGlzLm1pbi54ICksXG5cdFx0XHQoIHBvaW50LnkgLSB0aGlzLm1pbi55ICkgLyAoIHRoaXMubWF4LnkgLSB0aGlzLm1pbi55ICksXG5cdFx0XHQoIHBvaW50LnogLSB0aGlzLm1pbi56ICkgLyAoIHRoaXMubWF4LnogLSB0aGlzLm1pbi56IClcblx0XHQpO1xuXG5cdH0sXG5cblx0aW50ZXJzZWN0c0JveDogZnVuY3Rpb24gKCBib3ggKSB7XG5cblx0XHQvLyB1c2luZyA2IHNwbGl0dGluZyBwbGFuZXMgdG8gcnVsZSBvdXQgaW50ZXJzZWN0aW9ucy5cblx0XHRyZXR1cm4gYm94Lm1heC54IDwgdGhpcy5taW4ueCB8fCBib3gubWluLnggPiB0aGlzLm1heC54IHx8XG5cdFx0XHRib3gubWF4LnkgPCB0aGlzLm1pbi55IHx8IGJveC5taW4ueSA+IHRoaXMubWF4LnkgfHxcblx0XHRcdGJveC5tYXgueiA8IHRoaXMubWluLnogfHwgYm94Lm1pbi56ID4gdGhpcy5tYXgueiA/IGZhbHNlIDogdHJ1ZTtcblxuXHR9LFxuXG5cdGludGVyc2VjdHNTcGhlcmU6ICggZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGNsb3Nlc3RQb2ludCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gaW50ZXJzZWN0c1NwaGVyZSggc3BoZXJlICkge1xuXG5cdFx0XHQvLyBGaW5kIHRoZSBwb2ludCBvbiB0aGUgQUFCQiBjbG9zZXN0IHRvIHRoZSBzcGhlcmUgY2VudGVyLlxuXHRcdFx0dGhpcy5jbGFtcFBvaW50KCBzcGhlcmUuY2VudGVyLCBjbG9zZXN0UG9pbnQgKTtcblxuXHRcdFx0Ly8gSWYgdGhhdCBwb2ludCBpcyBpbnNpZGUgdGhlIHNwaGVyZSwgdGhlIEFBQkIgYW5kIHNwaGVyZSBpbnRlcnNlY3QuXG5cdFx0XHRyZXR1cm4gY2xvc2VzdFBvaW50LmRpc3RhbmNlVG9TcXVhcmVkKCBzcGhlcmUuY2VudGVyICkgPD0gKCBzcGhlcmUucmFkaXVzICogc3BoZXJlLnJhZGl1cyApO1xuXG5cdFx0fTtcblxuXHR9ICkoKSxcblxuXHRpbnRlcnNlY3RzUGxhbmU6IGZ1bmN0aW9uICggcGxhbmUgKSB7XG5cblx0XHQvLyBXZSBjb21wdXRlIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIGRvdCBwcm9kdWN0IHZhbHVlcy4gSWYgdGhvc2UgdmFsdWVzXG5cdFx0Ly8gYXJlIG9uIHRoZSBzYW1lIHNpZGUgKGJhY2sgb3IgZnJvbnQpIG9mIHRoZSBwbGFuZSwgdGhlbiB0aGVyZSBpcyBubyBpbnRlcnNlY3Rpb24uXG5cblx0XHR2YXIgbWluLCBtYXg7XG5cblx0XHRpZiAoIHBsYW5lLm5vcm1hbC54ID4gMCApIHtcblxuXHRcdFx0bWluID0gcGxhbmUubm9ybWFsLnggKiB0aGlzLm1pbi54O1xuXHRcdFx0bWF4ID0gcGxhbmUubm9ybWFsLnggKiB0aGlzLm1heC54O1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0bWluID0gcGxhbmUubm9ybWFsLnggKiB0aGlzLm1heC54O1xuXHRcdFx0bWF4ID0gcGxhbmUubm9ybWFsLnggKiB0aGlzLm1pbi54O1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBwbGFuZS5ub3JtYWwueSA+IDAgKSB7XG5cblx0XHRcdG1pbiArPSBwbGFuZS5ub3JtYWwueSAqIHRoaXMubWluLnk7XG5cdFx0XHRtYXggKz0gcGxhbmUubm9ybWFsLnkgKiB0aGlzLm1heC55O1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0bWluICs9IHBsYW5lLm5vcm1hbC55ICogdGhpcy5tYXgueTtcblx0XHRcdG1heCArPSBwbGFuZS5ub3JtYWwueSAqIHRoaXMubWluLnk7XG5cblx0XHR9XG5cblx0XHRpZiAoIHBsYW5lLm5vcm1hbC56ID4gMCApIHtcblxuXHRcdFx0bWluICs9IHBsYW5lLm5vcm1hbC56ICogdGhpcy5taW4uejtcblx0XHRcdG1heCArPSBwbGFuZS5ub3JtYWwueiAqIHRoaXMubWF4Lno7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRtaW4gKz0gcGxhbmUubm9ybWFsLnogKiB0aGlzLm1heC56O1xuXHRcdFx0bWF4ICs9IHBsYW5lLm5vcm1hbC56ICogdGhpcy5taW4uejtcblxuXHRcdH1cblxuXHRcdHJldHVybiAoIG1pbiA8PSBwbGFuZS5jb25zdGFudCAmJiBtYXggPj0gcGxhbmUuY29uc3RhbnQgKTtcblxuXHR9LFxuXG5cdGludGVyc2VjdHNUcmlhbmdsZTogKCBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyB0cmlhbmdsZSBjZW50ZXJlZCB2ZXJ0aWNlc1xuXHRcdHZhciB2MCA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgdjIgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0Ly8gdHJpYW5nbGUgZWRnZSB2ZWN0b3JzXG5cdFx0dmFyIGYwID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgZjEgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciBmMiA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR2YXIgdGVzdEF4aXMgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0dmFyIGNlbnRlciA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIGV4dGVudHMgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0dmFyIHRyaWFuZ2xlTm9ybWFsID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdGZ1bmN0aW9uIHNhdEZvckF4ZXMoIGF4ZXMgKSB7XG5cblx0XHRcdHZhciBpLCBqO1xuXG5cdFx0XHRmb3IgKCBpID0gMCwgaiA9IGF4ZXMubGVuZ3RoIC0gMzsgaSA8PSBqOyBpICs9IDMgKSB7XG5cblx0XHRcdFx0dGVzdEF4aXMuZnJvbUFycmF5KCBheGVzLCBpICk7XG5cdFx0XHRcdC8vIHByb2plY3QgdGhlIGFhYmIgb250byB0aGUgc2VwZXJhdGluZyBheGlzXG5cdFx0XHRcdHZhciByID0gZXh0ZW50cy54ICogTWF0aC5hYnMoIHRlc3RBeGlzLnggKSArIGV4dGVudHMueSAqIE1hdGguYWJzKCB0ZXN0QXhpcy55ICkgKyBleHRlbnRzLnogKiBNYXRoLmFicyggdGVzdEF4aXMueiApO1xuXHRcdFx0XHQvLyBwcm9qZWN0IGFsbCAzIHZlcnRpY2VzIG9mIHRoZSB0cmlhbmdsZSBvbnRvIHRoZSBzZXBlcmF0aW5nIGF4aXNcblx0XHRcdFx0dmFyIHAwID0gdjAuZG90KCB0ZXN0QXhpcyApO1xuXHRcdFx0XHR2YXIgcDEgPSB2MS5kb3QoIHRlc3RBeGlzICk7XG5cdFx0XHRcdHZhciBwMiA9IHYyLmRvdCggdGVzdEF4aXMgKTtcblx0XHRcdFx0Ly8gYWN0dWFsIHRlc3QsIGJhc2ljYWxseSBzZWUgaWYgZWl0aGVyIG9mIHRoZSBtb3N0IGV4dHJlbWUgb2YgdGhlIHRyaWFuZ2xlIHBvaW50cyBpbnRlcnNlY3RzIHJcblx0XHRcdFx0aWYgKCBNYXRoLm1heCggLSBNYXRoLm1heCggcDAsIHAxLCBwMiApLCBNYXRoLm1pbiggcDAsIHAxLCBwMiApICkgPiByICkge1xuXG5cdFx0XHRcdFx0Ly8gcG9pbnRzIG9mIHRoZSBwcm9qZWN0ZWQgdHJpYW5nbGUgYXJlIG91dHNpZGUgdGhlIHByb2plY3RlZCBoYWxmLWxlbmd0aCBvZiB0aGUgYWFiYlxuXHRcdFx0XHRcdC8vIHRoZSBheGlzIGlzIHNlcGVyYXRpbmcgYW5kIHdlIGNhbiBleGl0XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBmdW5jdGlvbiBpbnRlcnNlY3RzVHJpYW5nbGUoIHRyaWFuZ2xlICkge1xuXG5cdFx0XHRpZiAoIHRoaXMuaXNFbXB0eSgpICkge1xuXG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBjb21wdXRlIGJveCBjZW50ZXIgYW5kIGV4dGVudHNcblx0XHRcdHRoaXMuZ2V0Q2VudGVyKCBjZW50ZXIgKTtcblx0XHRcdGV4dGVudHMuc3ViVmVjdG9ycyggdGhpcy5tYXgsIGNlbnRlciApO1xuXG5cdFx0XHQvLyB0cmFuc2xhdGUgdHJpYW5nbGUgdG8gYWFiYiBvcmlnaW5cblx0XHRcdHYwLnN1YlZlY3RvcnMoIHRyaWFuZ2xlLmEsIGNlbnRlciApO1xuXHRcdFx0djEuc3ViVmVjdG9ycyggdHJpYW5nbGUuYiwgY2VudGVyICk7XG5cdFx0XHR2Mi5zdWJWZWN0b3JzKCB0cmlhbmdsZS5jLCBjZW50ZXIgKTtcblxuXHRcdFx0Ly8gY29tcHV0ZSBlZGdlIHZlY3RvcnMgZm9yIHRyaWFuZ2xlXG5cdFx0XHRmMC5zdWJWZWN0b3JzKCB2MSwgdjAgKTtcblx0XHRcdGYxLnN1YlZlY3RvcnMoIHYyLCB2MSApO1xuXHRcdFx0ZjIuc3ViVmVjdG9ycyggdjAsIHYyICk7XG5cblx0XHRcdC8vIHRlc3QgYWdhaW5zdCBheGVzIHRoYXQgYXJlIGdpdmVuIGJ5IGNyb3NzIHByb2R1Y3QgY29tYmluYXRpb25zIG9mIHRoZSBlZGdlcyBvZiB0aGUgdHJpYW5nbGUgYW5kIHRoZSBlZGdlcyBvZiB0aGUgYWFiYlxuXHRcdFx0Ly8gbWFrZSBhbiBheGlzIHRlc3Rpbmcgb2YgZWFjaCBvZiB0aGUgMyBzaWRlcyBvZiB0aGUgYWFiYiBhZ2FpbnN0IGVhY2ggb2YgdGhlIDMgc2lkZXMgb2YgdGhlIHRyaWFuZ2xlID0gOSBheGlzIG9mIHNlcGFyYXRpb25cblx0XHRcdC8vIGF4aXNfaWogPSB1X2kgeCBmX2ogKHUwLCB1MSwgdTIgPSBmYWNlIG5vcm1hbHMgb2YgYWFiYiA9IHgseSx6IGF4ZXMgdmVjdG9ycyBzaW5jZSBhYWJiIGlzIGF4aXMgYWxpZ25lZClcblx0XHRcdHZhciBheGVzID0gW1xuXHRcdFx0XHQwLCAtIGYwLnosIGYwLnksIDAsIC0gZjEueiwgZjEueSwgMCwgLSBmMi56LCBmMi55LFxuXHRcdFx0XHRmMC56LCAwLCAtIGYwLngsIGYxLnosIDAsIC0gZjEueCwgZjIueiwgMCwgLSBmMi54LFxuXHRcdFx0XHQtIGYwLnksIGYwLngsIDAsIC0gZjEueSwgZjEueCwgMCwgLSBmMi55LCBmMi54LCAwXG5cdFx0XHRdO1xuXHRcdFx0aWYgKCAhIHNhdEZvckF4ZXMoIGF4ZXMgKSApIHtcblxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gdGVzdCAzIGZhY2Ugbm9ybWFscyBmcm9tIHRoZSBhYWJiXG5cdFx0XHRheGVzID0gWyAxLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAxIF07XG5cdFx0XHRpZiAoICEgc2F0Rm9yQXhlcyggYXhlcyApICkge1xuXG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBmaW5hbGx5IHRlc3RpbmcgdGhlIGZhY2Ugbm9ybWFsIG9mIHRoZSB0cmlhbmdsZVxuXHRcdFx0Ly8gdXNlIGFscmVhZHkgZXhpc3RpbmcgdHJpYW5nbGUgZWRnZSB2ZWN0b3JzIGhlcmVcblx0XHRcdHRyaWFuZ2xlTm9ybWFsLmNyb3NzVmVjdG9ycyggZjAsIGYxICk7XG5cdFx0XHRheGVzID0gWyB0cmlhbmdsZU5vcm1hbC54LCB0cmlhbmdsZU5vcm1hbC55LCB0cmlhbmdsZU5vcm1hbC56IF07XG5cdFx0XHRyZXR1cm4gc2F0Rm9yQXhlcyggYXhlcyApO1xuXG5cdFx0fTtcblxuXHR9ICkoKSxcblxuXHRjbGFtcFBvaW50OiBmdW5jdGlvbiAoIHBvaW50LCB0YXJnZXQgKSB7XG5cblx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Cb3gzOiAuY2xhbXBQb2ludCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHR0YXJnZXQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRhcmdldC5jb3B5KCBwb2ludCApLmNsYW1wKCB0aGlzLm1pbiwgdGhpcy5tYXggKTtcblxuXHR9LFxuXG5cdGRpc3RhbmNlVG9Qb2ludDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBkaXN0YW5jZVRvUG9pbnQoIHBvaW50ICkge1xuXG5cdFx0XHR2YXIgY2xhbXBlZFBvaW50ID0gdjEuY29weSggcG9pbnQgKS5jbGFtcCggdGhpcy5taW4sIHRoaXMubWF4ICk7XG5cdFx0XHRyZXR1cm4gY2xhbXBlZFBvaW50LnN1YiggcG9pbnQgKS5sZW5ndGgoKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGdldEJvdW5kaW5nU3BoZXJlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGdldEJvdW5kaW5nU3BoZXJlKCB0YXJnZXQgKSB7XG5cblx0XHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQm94MzogLmdldEJvdW5kaW5nU3BoZXJlKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdFx0dGFyZ2V0ID0gbmV3IFNwaGVyZSgpO1xuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuZ2V0Q2VudGVyKCB0YXJnZXQuY2VudGVyICk7XG5cblx0XHRcdHRhcmdldC5yYWRpdXMgPSB0aGlzLmdldFNpemUoIHYxICkubGVuZ3RoKCkgKiAwLjU7XG5cblx0XHRcdHJldHVybiB0YXJnZXQ7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRpbnRlcnNlY3Q6IGZ1bmN0aW9uICggYm94ICkge1xuXG5cdFx0dGhpcy5taW4ubWF4KCBib3gubWluICk7XG5cdFx0dGhpcy5tYXgubWluKCBib3gubWF4ICk7XG5cblx0XHQvLyBlbnN1cmUgdGhhdCBpZiB0aGVyZSBpcyBubyBvdmVybGFwLCB0aGUgcmVzdWx0IGlzIGZ1bGx5IGVtcHR5LCBub3Qgc2xpZ2h0bHkgZW1wdHkgd2l0aCBub24taW5mLytpbmYgdmFsdWVzIHRoYXQgd2lsbCBjYXVzZSBzdWJzZXF1ZW5jZSBpbnRlcnNlY3RzIHRvIGVycm9uZW91c2x5IHJldHVybiB2YWxpZCB2YWx1ZXMuXG5cdFx0aWYgKCB0aGlzLmlzRW1wdHkoKSApIHRoaXMubWFrZUVtcHR5KCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHVuaW9uOiBmdW5jdGlvbiAoIGJveCApIHtcblxuXHRcdHRoaXMubWluLm1pbiggYm94Lm1pbiApO1xuXHRcdHRoaXMubWF4Lm1heCggYm94Lm1heCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRhcHBseU1hdHJpeDQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBwb2ludHMgPSBbXG5cdFx0XHRuZXcgVmVjdG9yMygpLFxuXHRcdFx0bmV3IFZlY3RvcjMoKSxcblx0XHRcdG5ldyBWZWN0b3IzKCksXG5cdFx0XHRuZXcgVmVjdG9yMygpLFxuXHRcdFx0bmV3IFZlY3RvcjMoKSxcblx0XHRcdG5ldyBWZWN0b3IzKCksXG5cdFx0XHRuZXcgVmVjdG9yMygpLFxuXHRcdFx0bmV3IFZlY3RvcjMoKVxuXHRcdF07XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gYXBwbHlNYXRyaXg0KCBtYXRyaXggKSB7XG5cblx0XHRcdC8vIHRyYW5zZm9ybSBvZiBlbXB0eSBib3ggaXMgYW4gZW1wdHkgYm94LlxuXHRcdFx0aWYgKCB0aGlzLmlzRW1wdHkoKSApIHJldHVybiB0aGlzO1xuXG5cdFx0XHQvLyBOT1RFOiBJIGFtIHVzaW5nIGEgYmluYXJ5IHBhdHRlcm4gdG8gc3BlY2lmeSBhbGwgMl4zIGNvbWJpbmF0aW9ucyBiZWxvd1xuXHRcdFx0cG9pbnRzWyAwIF0uc2V0KCB0aGlzLm1pbi54LCB0aGlzLm1pbi55LCB0aGlzLm1pbi56ICkuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTsgLy8gMDAwXG5cdFx0XHRwb2ludHNbIDEgXS5zZXQoIHRoaXMubWluLngsIHRoaXMubWluLnksIHRoaXMubWF4LnogKS5hcHBseU1hdHJpeDQoIG1hdHJpeCApOyAvLyAwMDFcblx0XHRcdHBvaW50c1sgMiBdLnNldCggdGhpcy5taW4ueCwgdGhpcy5tYXgueSwgdGhpcy5taW4ueiApLmFwcGx5TWF0cml4NCggbWF0cml4ICk7IC8vIDAxMFxuXHRcdFx0cG9pbnRzWyAzIF0uc2V0KCB0aGlzLm1pbi54LCB0aGlzLm1heC55LCB0aGlzLm1heC56ICkuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTsgLy8gMDExXG5cdFx0XHRwb2ludHNbIDQgXS5zZXQoIHRoaXMubWF4LngsIHRoaXMubWluLnksIHRoaXMubWluLnogKS5hcHBseU1hdHJpeDQoIG1hdHJpeCApOyAvLyAxMDBcblx0XHRcdHBvaW50c1sgNSBdLnNldCggdGhpcy5tYXgueCwgdGhpcy5taW4ueSwgdGhpcy5tYXgueiApLmFwcGx5TWF0cml4NCggbWF0cml4ICk7IC8vIDEwMVxuXHRcdFx0cG9pbnRzWyA2IF0uc2V0KCB0aGlzLm1heC54LCB0aGlzLm1heC55LCB0aGlzLm1pbi56ICkuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTsgLy8gMTEwXG5cdFx0XHRwb2ludHNbIDcgXS5zZXQoIHRoaXMubWF4LngsIHRoaXMubWF4LnksIHRoaXMubWF4LnogKS5hcHBseU1hdHJpeDQoIG1hdHJpeCApO1x0Ly8gMTExXG5cblx0XHRcdHRoaXMuc2V0RnJvbVBvaW50cyggcG9pbnRzICk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0dHJhbnNsYXRlOiBmdW5jdGlvbiAoIG9mZnNldCApIHtcblxuXHRcdHRoaXMubWluLmFkZCggb2Zmc2V0ICk7XG5cdFx0dGhpcy5tYXguYWRkKCBvZmZzZXQgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZXF1YWxzOiBmdW5jdGlvbiAoIGJveCApIHtcblxuXHRcdHJldHVybiBib3gubWluLmVxdWFscyggdGhpcy5taW4gKSAmJiBib3gubWF4LmVxdWFscyggdGhpcy5tYXggKTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIFNwaGVyZSggY2VudGVyLCByYWRpdXMgKSB7XG5cblx0dGhpcy5jZW50ZXIgPSAoIGNlbnRlciAhPT0gdW5kZWZpbmVkICkgPyBjZW50ZXIgOiBuZXcgVmVjdG9yMygpO1xuXHR0aGlzLnJhZGl1cyA9ICggcmFkaXVzICE9PSB1bmRlZmluZWQgKSA/IHJhZGl1cyA6IDA7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggU3BoZXJlLnByb3RvdHlwZSwge1xuXG5cdHNldDogZnVuY3Rpb24gKCBjZW50ZXIsIHJhZGl1cyApIHtcblxuXHRcdHRoaXMuY2VudGVyLmNvcHkoIGNlbnRlciApO1xuXHRcdHRoaXMucmFkaXVzID0gcmFkaXVzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRGcm9tUG9pbnRzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgYm94ID0gbmV3IEJveDMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBzZXRGcm9tUG9pbnRzKCBwb2ludHMsIG9wdGlvbmFsQ2VudGVyICkge1xuXG5cdFx0XHR2YXIgY2VudGVyID0gdGhpcy5jZW50ZXI7XG5cblx0XHRcdGlmICggb3B0aW9uYWxDZW50ZXIgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRjZW50ZXIuY29weSggb3B0aW9uYWxDZW50ZXIgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRib3guc2V0RnJvbVBvaW50cyggcG9pbnRzICkuZ2V0Q2VudGVyKCBjZW50ZXIgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgbWF4UmFkaXVzU3EgPSAwO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gcG9pbnRzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdG1heFJhZGl1c1NxID0gTWF0aC5tYXgoIG1heFJhZGl1c1NxLCBjZW50ZXIuZGlzdGFuY2VUb1NxdWFyZWQoIHBvaW50c1sgaSBdICkgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLnJhZGl1cyA9IE1hdGguc3FydCggbWF4UmFkaXVzU3EgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBzcGhlcmUgKSB7XG5cblx0XHR0aGlzLmNlbnRlci5jb3B5KCBzcGhlcmUuY2VudGVyICk7XG5cdFx0dGhpcy5yYWRpdXMgPSBzcGhlcmUucmFkaXVzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRlbXB0eTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuICggdGhpcy5yYWRpdXMgPD0gMCApO1xuXG5cdH0sXG5cblx0Y29udGFpbnNQb2ludDogZnVuY3Rpb24gKCBwb2ludCApIHtcblxuXHRcdHJldHVybiAoIHBvaW50LmRpc3RhbmNlVG9TcXVhcmVkKCB0aGlzLmNlbnRlciApIDw9ICggdGhpcy5yYWRpdXMgKiB0aGlzLnJhZGl1cyApICk7XG5cblx0fSxcblxuXHRkaXN0YW5jZVRvUG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQgKSB7XG5cblx0XHRyZXR1cm4gKCBwb2ludC5kaXN0YW5jZVRvKCB0aGlzLmNlbnRlciApIC0gdGhpcy5yYWRpdXMgKTtcblxuXHR9LFxuXG5cdGludGVyc2VjdHNTcGhlcmU6IGZ1bmN0aW9uICggc3BoZXJlICkge1xuXG5cdFx0dmFyIHJhZGl1c1N1bSA9IHRoaXMucmFkaXVzICsgc3BoZXJlLnJhZGl1cztcblxuXHRcdHJldHVybiBzcGhlcmUuY2VudGVyLmRpc3RhbmNlVG9TcXVhcmVkKCB0aGlzLmNlbnRlciApIDw9ICggcmFkaXVzU3VtICogcmFkaXVzU3VtICk7XG5cblx0fSxcblxuXHRpbnRlcnNlY3RzQm94OiBmdW5jdGlvbiAoIGJveCApIHtcblxuXHRcdHJldHVybiBib3guaW50ZXJzZWN0c1NwaGVyZSggdGhpcyApO1xuXG5cdH0sXG5cblx0aW50ZXJzZWN0c1BsYW5lOiBmdW5jdGlvbiAoIHBsYW5lICkge1xuXG5cdFx0cmV0dXJuIE1hdGguYWJzKCBwbGFuZS5kaXN0YW5jZVRvUG9pbnQoIHRoaXMuY2VudGVyICkgKSA8PSB0aGlzLnJhZGl1cztcblxuXHR9LFxuXG5cdGNsYW1wUG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQsIHRhcmdldCApIHtcblxuXHRcdHZhciBkZWx0YUxlbmd0aFNxID0gdGhpcy5jZW50ZXIuZGlzdGFuY2VUb1NxdWFyZWQoIHBvaW50ICk7XG5cblx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5TcGhlcmU6IC5jbGFtcFBvaW50KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR9XG5cblx0XHR0YXJnZXQuY29weSggcG9pbnQgKTtcblxuXHRcdGlmICggZGVsdGFMZW5ndGhTcSA+ICggdGhpcy5yYWRpdXMgKiB0aGlzLnJhZGl1cyApICkge1xuXG5cdFx0XHR0YXJnZXQuc3ViKCB0aGlzLmNlbnRlciApLm5vcm1hbGl6ZSgpO1xuXHRcdFx0dGFyZ2V0Lm11bHRpcGx5U2NhbGFyKCB0aGlzLnJhZGl1cyApLmFkZCggdGhpcy5jZW50ZXIgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0YXJnZXQ7XG5cblx0fSxcblxuXHRnZXRCb3VuZGluZ0JveDogZnVuY3Rpb24gKCB0YXJnZXQgKSB7XG5cblx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5TcGhlcmU6IC5nZXRCb3VuZGluZ0JveCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHR0YXJnZXQgPSBuZXcgQm94MygpO1xuXG5cdFx0fVxuXG5cdFx0dGFyZ2V0LnNldCggdGhpcy5jZW50ZXIsIHRoaXMuY2VudGVyICk7XG5cdFx0dGFyZ2V0LmV4cGFuZEJ5U2NhbGFyKCB0aGlzLnJhZGl1cyApO1xuXG5cdFx0cmV0dXJuIHRhcmdldDtcblxuXHR9LFxuXG5cdGFwcGx5TWF0cml4NDogZnVuY3Rpb24gKCBtYXRyaXggKSB7XG5cblx0XHR0aGlzLmNlbnRlci5hcHBseU1hdHJpeDQoIG1hdHJpeCApO1xuXHRcdHRoaXMucmFkaXVzID0gdGhpcy5yYWRpdXMgKiBtYXRyaXguZ2V0TWF4U2NhbGVPbkF4aXMoKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dHJhbnNsYXRlOiBmdW5jdGlvbiAoIG9mZnNldCApIHtcblxuXHRcdHRoaXMuY2VudGVyLmFkZCggb2Zmc2V0ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGVxdWFsczogZnVuY3Rpb24gKCBzcGhlcmUgKSB7XG5cblx0XHRyZXR1cm4gc3BoZXJlLmNlbnRlci5lcXVhbHMoIHRoaXMuY2VudGVyICkgJiYgKCBzcGhlcmUucmFkaXVzID09PSB0aGlzLnJhZGl1cyApO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgYmhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW9cbiAqL1xuXG5mdW5jdGlvbiBQbGFuZSggbm9ybWFsLCBjb25zdGFudCApIHtcblxuXHQvLyBub3JtYWwgaXMgYXNzdW1lZCB0byBiZSBub3JtYWxpemVkXG5cblx0dGhpcy5ub3JtYWwgPSAoIG5vcm1hbCAhPT0gdW5kZWZpbmVkICkgPyBub3JtYWwgOiBuZXcgVmVjdG9yMyggMSwgMCwgMCApO1xuXHR0aGlzLmNvbnN0YW50ID0gKCBjb25zdGFudCAhPT0gdW5kZWZpbmVkICkgPyBjb25zdGFudCA6IDA7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggUGxhbmUucHJvdG90eXBlLCB7XG5cblx0c2V0OiBmdW5jdGlvbiAoIG5vcm1hbCwgY29uc3RhbnQgKSB7XG5cblx0XHR0aGlzLm5vcm1hbC5jb3B5KCBub3JtYWwgKTtcblx0XHR0aGlzLmNvbnN0YW50ID0gY29uc3RhbnQ7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldENvbXBvbmVudHM6IGZ1bmN0aW9uICggeCwgeSwgeiwgdyApIHtcblxuXHRcdHRoaXMubm9ybWFsLnNldCggeCwgeSwgeiApO1xuXHRcdHRoaXMuY29uc3RhbnQgPSB3O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRGcm9tTm9ybWFsQW5kQ29wbGFuYXJQb2ludDogZnVuY3Rpb24gKCBub3JtYWwsIHBvaW50ICkge1xuXG5cdFx0dGhpcy5ub3JtYWwuY29weSggbm9ybWFsICk7XG5cdFx0dGhpcy5jb25zdGFudCA9IC0gcG9pbnQuZG90KCB0aGlzLm5vcm1hbCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRGcm9tQ29wbGFuYXJQb2ludHM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIHYyID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBzZXRGcm9tQ29wbGFuYXJQb2ludHMoIGEsIGIsIGMgKSB7XG5cblx0XHRcdHZhciBub3JtYWwgPSB2MS5zdWJWZWN0b3JzKCBjLCBiICkuY3Jvc3MoIHYyLnN1YlZlY3RvcnMoIGEsIGIgKSApLm5vcm1hbGl6ZSgpO1xuXG5cdFx0XHQvLyBROiBzaG91bGQgYW4gZXJyb3IgYmUgdGhyb3duIGlmIG5vcm1hbCBpcyB6ZXJvIChlLmcuIGRlZ2VuZXJhdGUgcGxhbmUpP1xuXG5cdFx0XHR0aGlzLnNldEZyb21Ob3JtYWxBbmRDb3BsYW5hclBvaW50KCBub3JtYWwsIGEgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBwbGFuZSApIHtcblxuXHRcdHRoaXMubm9ybWFsLmNvcHkoIHBsYW5lLm5vcm1hbCApO1xuXHRcdHRoaXMuY29uc3RhbnQgPSBwbGFuZS5jb25zdGFudDtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bm9ybWFsaXplOiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyBOb3RlOiB3aWxsIGxlYWQgdG8gYSBkaXZpZGUgYnkgemVybyBpZiB0aGUgcGxhbmUgaXMgaW52YWxpZC5cblxuXHRcdHZhciBpbnZlcnNlTm9ybWFsTGVuZ3RoID0gMS4wIC8gdGhpcy5ub3JtYWwubGVuZ3RoKCk7XG5cdFx0dGhpcy5ub3JtYWwubXVsdGlwbHlTY2FsYXIoIGludmVyc2VOb3JtYWxMZW5ndGggKTtcblx0XHR0aGlzLmNvbnN0YW50ICo9IGludmVyc2VOb3JtYWxMZW5ndGg7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG5lZ2F0ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5jb25zdGFudCAqPSAtIDE7XG5cdFx0dGhpcy5ub3JtYWwubmVnYXRlKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGRpc3RhbmNlVG9Qb2ludDogZnVuY3Rpb24gKCBwb2ludCApIHtcblxuXHRcdHJldHVybiB0aGlzLm5vcm1hbC5kb3QoIHBvaW50ICkgKyB0aGlzLmNvbnN0YW50O1xuXG5cdH0sXG5cblx0ZGlzdGFuY2VUb1NwaGVyZTogZnVuY3Rpb24gKCBzcGhlcmUgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5kaXN0YW5jZVRvUG9pbnQoIHNwaGVyZS5jZW50ZXIgKSAtIHNwaGVyZS5yYWRpdXM7XG5cblx0fSxcblxuXHRwcm9qZWN0UG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQsIHRhcmdldCApIHtcblxuXHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlBsYW5lOiAucHJvamVjdFBvaW50KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGFyZ2V0LmNvcHkoIHRoaXMubm9ybWFsICkubXVsdGlwbHlTY2FsYXIoIC0gdGhpcy5kaXN0YW5jZVRvUG9pbnQoIHBvaW50ICkgKS5hZGQoIHBvaW50ICk7XG5cblx0fSxcblxuXHRpbnRlcnNlY3RMaW5lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGludGVyc2VjdExpbmUoIGxpbmUsIHRhcmdldCApIHtcblxuXHRcdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5QbGFuZTogLmludGVyc2VjdExpbmUoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApO1xuXHRcdFx0XHR0YXJnZXQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0XHR9XG5cblx0XHRcdHZhciBkaXJlY3Rpb24gPSBsaW5lLmRlbHRhKCB2MSApO1xuXG5cdFx0XHR2YXIgZGVub21pbmF0b3IgPSB0aGlzLm5vcm1hbC5kb3QoIGRpcmVjdGlvbiApO1xuXG5cdFx0XHRpZiAoIGRlbm9taW5hdG9yID09PSAwICkge1xuXG5cdFx0XHRcdC8vIGxpbmUgaXMgY29wbGFuYXIsIHJldHVybiBvcmlnaW5cblx0XHRcdFx0aWYgKCB0aGlzLmRpc3RhbmNlVG9Qb2ludCggbGluZS5zdGFydCApID09PSAwICkge1xuXG5cdFx0XHRcdFx0cmV0dXJuIHRhcmdldC5jb3B5KCBsaW5lLnN0YXJ0ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFVuc3VyZSBpZiB0aGlzIGlzIHRoZSBjb3JyZWN0IG1ldGhvZCB0byBoYW5kbGUgdGhpcyBjYXNlLlxuXHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXG5cdFx0XHR9XG5cblx0XHRcdHZhciB0ID0gLSAoIGxpbmUuc3RhcnQuZG90KCB0aGlzLm5vcm1hbCApICsgdGhpcy5jb25zdGFudCApIC8gZGVub21pbmF0b3I7XG5cblx0XHRcdGlmICggdCA8IDAgfHwgdCA+IDEgKSB7XG5cblx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdGFyZ2V0LmNvcHkoIGRpcmVjdGlvbiApLm11bHRpcGx5U2NhbGFyKCB0ICkuYWRkKCBsaW5lLnN0YXJ0ICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRpbnRlcnNlY3RzTGluZTogZnVuY3Rpb24gKCBsaW5lICkge1xuXG5cdFx0Ly8gTm90ZTogdGhpcyB0ZXN0cyBpZiBhIGxpbmUgaW50ZXJzZWN0cyB0aGUgcGxhbmUsIG5vdCB3aGV0aGVyIGl0IChvciBpdHMgZW5kLXBvaW50cykgYXJlIGNvcGxhbmFyIHdpdGggaXQuXG5cblx0XHR2YXIgc3RhcnRTaWduID0gdGhpcy5kaXN0YW5jZVRvUG9pbnQoIGxpbmUuc3RhcnQgKTtcblx0XHR2YXIgZW5kU2lnbiA9IHRoaXMuZGlzdGFuY2VUb1BvaW50KCBsaW5lLmVuZCApO1xuXG5cdFx0cmV0dXJuICggc3RhcnRTaWduIDwgMCAmJiBlbmRTaWduID4gMCApIHx8ICggZW5kU2lnbiA8IDAgJiYgc3RhcnRTaWduID4gMCApO1xuXG5cdH0sXG5cblx0aW50ZXJzZWN0c0JveDogZnVuY3Rpb24gKCBib3ggKSB7XG5cblx0XHRyZXR1cm4gYm94LmludGVyc2VjdHNQbGFuZSggdGhpcyApO1xuXG5cdH0sXG5cblx0aW50ZXJzZWN0c1NwaGVyZTogZnVuY3Rpb24gKCBzcGhlcmUgKSB7XG5cblx0XHRyZXR1cm4gc3BoZXJlLmludGVyc2VjdHNQbGFuZSggdGhpcyApO1xuXG5cdH0sXG5cblx0Y29wbGFuYXJQb2ludDogZnVuY3Rpb24gKCB0YXJnZXQgKSB7XG5cblx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5QbGFuZTogLmNvcGxhbmFyUG9pbnQoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApO1xuXHRcdFx0dGFyZ2V0ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0YXJnZXQuY29weSggdGhpcy5ub3JtYWwgKS5tdWx0aXBseVNjYWxhciggLSB0aGlzLmNvbnN0YW50ICk7XG5cblx0fSxcblxuXHRhcHBseU1hdHJpeDQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIG0xID0gbmV3IE1hdHJpeDMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBhcHBseU1hdHJpeDQoIG1hdHJpeCwgb3B0aW9uYWxOb3JtYWxNYXRyaXggKSB7XG5cblx0XHRcdHZhciBub3JtYWxNYXRyaXggPSBvcHRpb25hbE5vcm1hbE1hdHJpeCB8fCBtMS5nZXROb3JtYWxNYXRyaXgoIG1hdHJpeCApO1xuXG5cdFx0XHR2YXIgcmVmZXJlbmNlUG9pbnQgPSB0aGlzLmNvcGxhbmFyUG9pbnQoIHYxICkuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTtcblxuXHRcdFx0dmFyIG5vcm1hbCA9IHRoaXMubm9ybWFsLmFwcGx5TWF0cml4Myggbm9ybWFsTWF0cml4ICkubm9ybWFsaXplKCk7XG5cblx0XHRcdHRoaXMuY29uc3RhbnQgPSAtIHJlZmVyZW5jZVBvaW50LmRvdCggbm9ybWFsICk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0dHJhbnNsYXRlOiBmdW5jdGlvbiAoIG9mZnNldCApIHtcblxuXHRcdHRoaXMuY29uc3RhbnQgLT0gb2Zmc2V0LmRvdCggdGhpcy5ub3JtYWwgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZXF1YWxzOiBmdW5jdGlvbiAoIHBsYW5lICkge1xuXG5cdFx0cmV0dXJuIHBsYW5lLm5vcm1hbC5lcXVhbHMoIHRoaXMubm9ybWFsICkgJiYgKCBwbGFuZS5jb25zdGFudCA9PT0gdGhpcy5jb25zdGFudCApO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pb1xuICovXG5cbmZ1bmN0aW9uIEZydXN0dW0oIHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUgKSB7XG5cblx0dGhpcy5wbGFuZXMgPSBbXG5cblx0XHQoIHAwICE9PSB1bmRlZmluZWQgKSA/IHAwIDogbmV3IFBsYW5lKCksXG5cdFx0KCBwMSAhPT0gdW5kZWZpbmVkICkgPyBwMSA6IG5ldyBQbGFuZSgpLFxuXHRcdCggcDIgIT09IHVuZGVmaW5lZCApID8gcDIgOiBuZXcgUGxhbmUoKSxcblx0XHQoIHAzICE9PSB1bmRlZmluZWQgKSA/IHAzIDogbmV3IFBsYW5lKCksXG5cdFx0KCBwNCAhPT0gdW5kZWZpbmVkICkgPyBwNCA6IG5ldyBQbGFuZSgpLFxuXHRcdCggcDUgIT09IHVuZGVmaW5lZCApID8gcDUgOiBuZXcgUGxhbmUoKVxuXG5cdF07XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggRnJ1c3R1bS5wcm90b3R5cGUsIHtcblxuXHRzZXQ6IGZ1bmN0aW9uICggcDAsIHAxLCBwMiwgcDMsIHA0LCBwNSApIHtcblxuXHRcdHZhciBwbGFuZXMgPSB0aGlzLnBsYW5lcztcblxuXHRcdHBsYW5lc1sgMCBdLmNvcHkoIHAwICk7XG5cdFx0cGxhbmVzWyAxIF0uY29weSggcDEgKTtcblx0XHRwbGFuZXNbIDIgXS5jb3B5KCBwMiApO1xuXHRcdHBsYW5lc1sgMyBdLmNvcHkoIHAzICk7XG5cdFx0cGxhbmVzWyA0IF0uY29weSggcDQgKTtcblx0XHRwbGFuZXNbIDUgXS5jb3B5KCBwNSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBmcnVzdHVtICkge1xuXG5cdFx0dmFyIHBsYW5lcyA9IHRoaXMucGxhbmVzO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgNjsgaSArKyApIHtcblxuXHRcdFx0cGxhbmVzWyBpIF0uY29weSggZnJ1c3R1bS5wbGFuZXNbIGkgXSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRGcm9tTWF0cml4OiBmdW5jdGlvbiAoIG0gKSB7XG5cblx0XHR2YXIgcGxhbmVzID0gdGhpcy5wbGFuZXM7XG5cdFx0dmFyIG1lID0gbS5lbGVtZW50cztcblx0XHR2YXIgbWUwID0gbWVbIDAgXSwgbWUxID0gbWVbIDEgXSwgbWUyID0gbWVbIDIgXSwgbWUzID0gbWVbIDMgXTtcblx0XHR2YXIgbWU0ID0gbWVbIDQgXSwgbWU1ID0gbWVbIDUgXSwgbWU2ID0gbWVbIDYgXSwgbWU3ID0gbWVbIDcgXTtcblx0XHR2YXIgbWU4ID0gbWVbIDggXSwgbWU5ID0gbWVbIDkgXSwgbWUxMCA9IG1lWyAxMCBdLCBtZTExID0gbWVbIDExIF07XG5cdFx0dmFyIG1lMTIgPSBtZVsgMTIgXSwgbWUxMyA9IG1lWyAxMyBdLCBtZTE0ID0gbWVbIDE0IF0sIG1lMTUgPSBtZVsgMTUgXTtcblxuXHRcdHBsYW5lc1sgMCBdLnNldENvbXBvbmVudHMoIG1lMyAtIG1lMCwgbWU3IC0gbWU0LCBtZTExIC0gbWU4LCBtZTE1IC0gbWUxMiApLm5vcm1hbGl6ZSgpO1xuXHRcdHBsYW5lc1sgMSBdLnNldENvbXBvbmVudHMoIG1lMyArIG1lMCwgbWU3ICsgbWU0LCBtZTExICsgbWU4LCBtZTE1ICsgbWUxMiApLm5vcm1hbGl6ZSgpO1xuXHRcdHBsYW5lc1sgMiBdLnNldENvbXBvbmVudHMoIG1lMyArIG1lMSwgbWU3ICsgbWU1LCBtZTExICsgbWU5LCBtZTE1ICsgbWUxMyApLm5vcm1hbGl6ZSgpO1xuXHRcdHBsYW5lc1sgMyBdLnNldENvbXBvbmVudHMoIG1lMyAtIG1lMSwgbWU3IC0gbWU1LCBtZTExIC0gbWU5LCBtZTE1IC0gbWUxMyApLm5vcm1hbGl6ZSgpO1xuXHRcdHBsYW5lc1sgNCBdLnNldENvbXBvbmVudHMoIG1lMyAtIG1lMiwgbWU3IC0gbWU2LCBtZTExIC0gbWUxMCwgbWUxNSAtIG1lMTQgKS5ub3JtYWxpemUoKTtcblx0XHRwbGFuZXNbIDUgXS5zZXRDb21wb25lbnRzKCBtZTMgKyBtZTIsIG1lNyArIG1lNiwgbWUxMSArIG1lMTAsIG1lMTUgKyBtZTE0ICkubm9ybWFsaXplKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGludGVyc2VjdHNPYmplY3Q6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBzcGhlcmUgPSBuZXcgU3BoZXJlKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gaW50ZXJzZWN0c09iamVjdCggb2JqZWN0ICkge1xuXG5cdFx0XHR2YXIgZ2VvbWV0cnkgPSBvYmplY3QuZ2VvbWV0cnk7XG5cblx0XHRcdGlmICggZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgPT09IG51bGwgKVxuXHRcdFx0XHRnZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtcblxuXHRcdFx0c3BoZXJlLmNvcHkoIGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlIClcblx0XHRcdFx0LmFwcGx5TWF0cml4NCggb2JqZWN0Lm1hdHJpeFdvcmxkICk7XG5cblx0XHRcdHJldHVybiB0aGlzLmludGVyc2VjdHNTcGhlcmUoIHNwaGVyZSApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0aW50ZXJzZWN0c1Nwcml0ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHNwaGVyZSA9IG5ldyBTcGhlcmUoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBpbnRlcnNlY3RzU3ByaXRlKCBzcHJpdGUgKSB7XG5cblx0XHRcdHNwaGVyZS5jZW50ZXIuc2V0KCAwLCAwLCAwICk7XG5cdFx0XHRzcGhlcmUucmFkaXVzID0gMC43MDcxMDY3ODExODY1NDc2O1xuXHRcdFx0c3BoZXJlLmFwcGx5TWF0cml4NCggc3ByaXRlLm1hdHJpeFdvcmxkICk7XG5cblx0XHRcdHJldHVybiB0aGlzLmludGVyc2VjdHNTcGhlcmUoIHNwaGVyZSApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0aW50ZXJzZWN0c1NwaGVyZTogZnVuY3Rpb24gKCBzcGhlcmUgKSB7XG5cblx0XHR2YXIgcGxhbmVzID0gdGhpcy5wbGFuZXM7XG5cdFx0dmFyIGNlbnRlciA9IHNwaGVyZS5jZW50ZXI7XG5cdFx0dmFyIG5lZ1JhZGl1cyA9IC0gc3BoZXJlLnJhZGl1cztcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IDY7IGkgKysgKSB7XG5cblx0XHRcdHZhciBkaXN0YW5jZSA9IHBsYW5lc1sgaSBdLmRpc3RhbmNlVG9Qb2ludCggY2VudGVyICk7XG5cblx0XHRcdGlmICggZGlzdGFuY2UgPCBuZWdSYWRpdXMgKSB7XG5cblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblxuXHR9LFxuXG5cdGludGVyc2VjdHNCb3g6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBwMSA9IG5ldyBWZWN0b3IzKCksXG5cdFx0XHRwMiA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gaW50ZXJzZWN0c0JveCggYm94ICkge1xuXG5cdFx0XHR2YXIgcGxhbmVzID0gdGhpcy5wbGFuZXM7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IDY7IGkgKysgKSB7XG5cblx0XHRcdFx0dmFyIHBsYW5lID0gcGxhbmVzWyBpIF07XG5cblx0XHRcdFx0cDEueCA9IHBsYW5lLm5vcm1hbC54ID4gMCA/IGJveC5taW4ueCA6IGJveC5tYXgueDtcblx0XHRcdFx0cDIueCA9IHBsYW5lLm5vcm1hbC54ID4gMCA/IGJveC5tYXgueCA6IGJveC5taW4ueDtcblx0XHRcdFx0cDEueSA9IHBsYW5lLm5vcm1hbC55ID4gMCA/IGJveC5taW4ueSA6IGJveC5tYXgueTtcblx0XHRcdFx0cDIueSA9IHBsYW5lLm5vcm1hbC55ID4gMCA/IGJveC5tYXgueSA6IGJveC5taW4ueTtcblx0XHRcdFx0cDEueiA9IHBsYW5lLm5vcm1hbC56ID4gMCA/IGJveC5taW4ueiA6IGJveC5tYXguejtcblx0XHRcdFx0cDIueiA9IHBsYW5lLm5vcm1hbC56ID4gMCA/IGJveC5tYXgueiA6IGJveC5taW4uejtcblxuXHRcdFx0XHR2YXIgZDEgPSBwbGFuZS5kaXN0YW5jZVRvUG9pbnQoIHAxICk7XG5cdFx0XHRcdHZhciBkMiA9IHBsYW5lLmRpc3RhbmNlVG9Qb2ludCggcDIgKTtcblxuXHRcdFx0XHQvLyBpZiBib3RoIG91dHNpZGUgcGxhbmUsIG5vIGludGVyc2VjdGlvblxuXG5cdFx0XHRcdGlmICggZDEgPCAwICYmIGQyIDwgMCApIHtcblxuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRydWU7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRjb250YWluc1BvaW50OiBmdW5jdGlvbiAoIHBvaW50ICkge1xuXG5cdFx0dmFyIHBsYW5lcyA9IHRoaXMucGxhbmVzO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgNjsgaSArKyApIHtcblxuXHRcdFx0aWYgKCBwbGFuZXNbIGkgXS5kaXN0YW5jZVRvUG9pbnQoIHBvaW50ICkgPCAwICkge1xuXG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRydWU7XG5cblx0fVxuXG59ICk7XG5cbnZhciBhbHBoYW1hcF9mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9BTFBIQU1BUFxcblxcdGRpZmZ1c2VDb2xvci5hICo9IHRleHR1cmUyRCggYWxwaGFNYXAsIHZVdiApLmc7XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBhbHBoYW1hcF9wYXJzX2ZyYWdtZW50ID0gXCIjaWZkZWYgVVNFX0FMUEhBTUFQXFxuXFx0dW5pZm9ybSBzYW1wbGVyMkQgYWxwaGFNYXA7XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBhbHBoYXRlc3RfZnJhZ21lbnQgPSBcIiNpZmRlZiBBTFBIQVRFU1RcXG5cXHRpZiAoIGRpZmZ1c2VDb2xvci5hIDwgQUxQSEFURVNUICkgZGlzY2FyZDtcXG4jZW5kaWZcXG5cIjtcblxudmFyIGFvbWFwX2ZyYWdtZW50ID0gXCIjaWZkZWYgVVNFX0FPTUFQXFxuXFx0ZmxvYXQgYW1iaWVudE9jY2x1c2lvbiA9ICggdGV4dHVyZTJEKCBhb01hcCwgdlV2MiApLnIgLSAxLjAgKSAqIGFvTWFwSW50ZW5zaXR5ICsgMS4wO1xcblxcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSAqPSBhbWJpZW50T2NjbHVzaW9uO1xcblxcdCNpZiBkZWZpbmVkKCBVU0VfRU5WTUFQICkgJiYgZGVmaW5lZCggUEhZU0lDQUwgKVxcblxcdFxcdGZsb2F0IGRvdE5WID0gc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBnZW9tZXRyeS52aWV3RGlyICkgKTtcXG5cXHRcXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICo9IGNvbXB1dGVTcGVjdWxhck9jY2x1c2lvbiggZG90TlYsIGFtYmllbnRPY2NsdXNpb24sIG1hdGVyaWFsLnNwZWN1bGFyUm91Z2huZXNzICk7XFxuXFx0I2VuZGlmXFxuI2VuZGlmXFxuXCI7XG5cbnZhciBhb21hcF9wYXJzX2ZyYWdtZW50ID0gXCIjaWZkZWYgVVNFX0FPTUFQXFxuXFx0dW5pZm9ybSBzYW1wbGVyMkQgYW9NYXA7XFxuXFx0dW5pZm9ybSBmbG9hdCBhb01hcEludGVuc2l0eTtcXG4jZW5kaWZcIjtcblxudmFyIGJlZ2luX3ZlcnRleCA9IFwiXFxudmVjMyB0cmFuc2Zvcm1lZCA9IHZlYzMoIHBvc2l0aW9uICk7XFxuXCI7XG5cbnZhciBiZWdpbm5vcm1hbF92ZXJ0ZXggPSBcIlxcbnZlYzMgb2JqZWN0Tm9ybWFsID0gdmVjMyggbm9ybWFsICk7XFxuXCI7XG5cbnZhciBic2RmcyA9IFwiZmxvYXQgcHVuY3R1YWxMaWdodEludGVuc2l0eVRvSXJyYWRpYW5jZUZhY3RvciggY29uc3QgaW4gZmxvYXQgbGlnaHREaXN0YW5jZSwgY29uc3QgaW4gZmxvYXQgY3V0b2ZmRGlzdGFuY2UsIGNvbnN0IGluIGZsb2F0IGRlY2F5RXhwb25lbnQgKSB7XFxuXFx0aWYoIGRlY2F5RXhwb25lbnQgPiAwLjAgKSB7XFxuI2lmIGRlZmluZWQgKCBQSFlTSUNBTExZX0NPUlJFQ1RfTElHSFRTIClcXG5cXHRcXHRmbG9hdCBkaXN0YW5jZUZhbGxvZmYgPSAxLjAgLyBtYXgoIHBvdyggbGlnaHREaXN0YW5jZSwgZGVjYXlFeHBvbmVudCApLCAwLjAxICk7XFxuXFx0XFx0ZmxvYXQgbWF4RGlzdGFuY2VDdXRvZmZGYWN0b3IgPSBwb3cyKCBzYXR1cmF0ZSggMS4wIC0gcG93NCggbGlnaHREaXN0YW5jZSAvIGN1dG9mZkRpc3RhbmNlICkgKSApO1xcblxcdFxcdHJldHVybiBkaXN0YW5jZUZhbGxvZmYgKiBtYXhEaXN0YW5jZUN1dG9mZkZhY3RvcjtcXG4jZWxzZVxcblxcdFxcdHJldHVybiBwb3coIHNhdHVyYXRlKCAtbGlnaHREaXN0YW5jZSAvIGN1dG9mZkRpc3RhbmNlICsgMS4wICksIGRlY2F5RXhwb25lbnQgKTtcXG4jZW5kaWZcXG5cXHR9XFxuXFx0cmV0dXJuIDEuMDtcXG59XFxudmVjMyBCUkRGX0RpZmZ1c2VfTGFtYmVydCggY29uc3QgaW4gdmVjMyBkaWZmdXNlQ29sb3IgKSB7XFxuXFx0cmV0dXJuIFJFQ0lQUk9DQUxfUEkgKiBkaWZmdXNlQ29sb3I7XFxufVxcbnZlYzMgRl9TY2hsaWNrKCBjb25zdCBpbiB2ZWMzIHNwZWN1bGFyQ29sb3IsIGNvbnN0IGluIGZsb2F0IGRvdExIICkge1xcblxcdGZsb2F0IGZyZXNuZWwgPSBleHAyKCAoIC01LjU1NDczICogZG90TEggLSA2Ljk4MzE2ICkgKiBkb3RMSCApO1xcblxcdHJldHVybiAoIDEuMCAtIHNwZWN1bGFyQ29sb3IgKSAqIGZyZXNuZWwgKyBzcGVjdWxhckNvbG9yO1xcbn1cXG5mbG9hdCBHX0dHWF9TbWl0aCggY29uc3QgaW4gZmxvYXQgYWxwaGEsIGNvbnN0IGluIGZsb2F0IGRvdE5MLCBjb25zdCBpbiBmbG9hdCBkb3ROViApIHtcXG5cXHRmbG9hdCBhMiA9IHBvdzIoIGFscGhhICk7XFxuXFx0ZmxvYXQgZ2wgPSBkb3ROTCArIHNxcnQoIGEyICsgKCAxLjAgLSBhMiApICogcG93MiggZG90TkwgKSApO1xcblxcdGZsb2F0IGd2ID0gZG90TlYgKyBzcXJ0KCBhMiArICggMS4wIC0gYTIgKSAqIHBvdzIoIGRvdE5WICkgKTtcXG5cXHRyZXR1cm4gMS4wIC8gKCBnbCAqIGd2ICk7XFxufVxcbmZsb2F0IEdfR0dYX1NtaXRoQ29ycmVsYXRlZCggY29uc3QgaW4gZmxvYXQgYWxwaGEsIGNvbnN0IGluIGZsb2F0IGRvdE5MLCBjb25zdCBpbiBmbG9hdCBkb3ROViApIHtcXG5cXHRmbG9hdCBhMiA9IHBvdzIoIGFscGhhICk7XFxuXFx0ZmxvYXQgZ3YgPSBkb3ROTCAqIHNxcnQoIGEyICsgKCAxLjAgLSBhMiApICogcG93MiggZG90TlYgKSApO1xcblxcdGZsb2F0IGdsID0gZG90TlYgKiBzcXJ0KCBhMiArICggMS4wIC0gYTIgKSAqIHBvdzIoIGRvdE5MICkgKTtcXG5cXHRyZXR1cm4gMC41IC8gbWF4KCBndiArIGdsLCBFUFNJTE9OICk7XFxufVxcbmZsb2F0IERfR0dYKCBjb25zdCBpbiBmbG9hdCBhbHBoYSwgY29uc3QgaW4gZmxvYXQgZG90TkggKSB7XFxuXFx0ZmxvYXQgYTIgPSBwb3cyKCBhbHBoYSApO1xcblxcdGZsb2F0IGRlbm9tID0gcG93MiggZG90TkggKSAqICggYTIgLSAxLjAgKSArIDEuMDtcXG5cXHRyZXR1cm4gUkVDSVBST0NBTF9QSSAqIGEyIC8gcG93MiggZGVub20gKTtcXG59XFxudmVjMyBCUkRGX1NwZWN1bGFyX0dHWCggY29uc3QgaW4gSW5jaWRlbnRMaWdodCBpbmNpZGVudExpZ2h0LCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiB2ZWMzIHNwZWN1bGFyQ29sb3IsIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcyApIHtcXG5cXHRmbG9hdCBhbHBoYSA9IHBvdzIoIHJvdWdobmVzcyApO1xcblxcdHZlYzMgaGFsZkRpciA9IG5vcm1hbGl6ZSggaW5jaWRlbnRMaWdodC5kaXJlY3Rpb24gKyBnZW9tZXRyeS52aWV3RGlyICk7XFxuXFx0ZmxvYXQgZG90TkwgPSBzYXR1cmF0ZSggZG90KCBnZW9tZXRyeS5ub3JtYWwsIGluY2lkZW50TGlnaHQuZGlyZWN0aW9uICkgKTtcXG5cXHRmbG9hdCBkb3ROViA9IHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZ2VvbWV0cnkudmlld0RpciApICk7XFxuXFx0ZmxvYXQgZG90TkggPSBzYXR1cmF0ZSggZG90KCBnZW9tZXRyeS5ub3JtYWwsIGhhbGZEaXIgKSApO1xcblxcdGZsb2F0IGRvdExIID0gc2F0dXJhdGUoIGRvdCggaW5jaWRlbnRMaWdodC5kaXJlY3Rpb24sIGhhbGZEaXIgKSApO1xcblxcdHZlYzMgRiA9IEZfU2NobGljayggc3BlY3VsYXJDb2xvciwgZG90TEggKTtcXG5cXHRmbG9hdCBHID0gR19HR1hfU21pdGhDb3JyZWxhdGVkKCBhbHBoYSwgZG90TkwsIGRvdE5WICk7XFxuXFx0ZmxvYXQgRCA9IERfR0dYKCBhbHBoYSwgZG90TkggKTtcXG5cXHRyZXR1cm4gRiAqICggRyAqIEQgKTtcXG59XFxudmVjMiBMVENfVXYoIGNvbnN0IGluIHZlYzMgTiwgY29uc3QgaW4gdmVjMyBWLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7XFxuXFx0Y29uc3QgZmxvYXQgTFVUX1NJWkUgID0gNjQuMDtcXG5cXHRjb25zdCBmbG9hdCBMVVRfU0NBTEUgPSAoIExVVF9TSVpFIC0gMS4wICkgLyBMVVRfU0laRTtcXG5cXHRjb25zdCBmbG9hdCBMVVRfQklBUyAgPSAwLjUgLyBMVVRfU0laRTtcXG5cXHRmbG9hdCBkb3ROViA9IHNhdHVyYXRlKCBkb3QoIE4sIFYgKSApO1xcblxcdHZlYzIgdXYgPSB2ZWMyKCByb3VnaG5lc3MsIHNxcnQoIDEuMCAtIGRvdE5WICkgKTtcXG5cXHR1diA9IHV2ICogTFVUX1NDQUxFICsgTFVUX0JJQVM7XFxuXFx0cmV0dXJuIHV2O1xcbn1cXG5mbG9hdCBMVENfQ2xpcHBlZFNwaGVyZUZvcm1GYWN0b3IoIGNvbnN0IGluIHZlYzMgZiApIHtcXG5cXHRmbG9hdCBsID0gbGVuZ3RoKCBmICk7XFxuXFx0cmV0dXJuIG1heCggKCBsICogbCArIGYueiApIC8gKCBsICsgMS4wICksIDAuMCApO1xcbn1cXG52ZWMzIExUQ19FZGdlVmVjdG9yRm9ybUZhY3RvciggY29uc3QgaW4gdmVjMyB2MSwgY29uc3QgaW4gdmVjMyB2MiApIHtcXG5cXHRmbG9hdCB4ID0gZG90KCB2MSwgdjIgKTtcXG5cXHRmbG9hdCB5ID0gYWJzKCB4ICk7XFxuXFx0ZmxvYXQgYSA9IDAuODU0Mzk4NSArICggMC40OTY1MTU1ICsgMC4wMTQ1MjA2ICogeSApICogeTtcXG5cXHRmbG9hdCBiID0gMy40MTc1OTQwICsgKCA0LjE2MTY3MjQgKyB5ICkgKiB5O1xcblxcdGZsb2F0IHYgPSBhIC8gYjtcXG5cXHRmbG9hdCB0aGV0YV9zaW50aGV0YSA9ICggeCA+IDAuMCApID8gdiA6IDAuNSAqIGludmVyc2VzcXJ0KCBtYXgoIDEuMCAtIHggKiB4LCAxZS03ICkgKSAtIHY7XFxuXFx0cmV0dXJuIGNyb3NzKCB2MSwgdjIgKSAqIHRoZXRhX3NpbnRoZXRhO1xcbn1cXG52ZWMzIExUQ19FdmFsdWF0ZSggY29uc3QgaW4gdmVjMyBOLCBjb25zdCBpbiB2ZWMzIFYsIGNvbnN0IGluIHZlYzMgUCwgY29uc3QgaW4gbWF0MyBtSW52LCBjb25zdCBpbiB2ZWMzIHJlY3RDb29yZHNbIDQgXSApIHtcXG5cXHR2ZWMzIHYxID0gcmVjdENvb3Jkc1sgMSBdIC0gcmVjdENvb3Jkc1sgMCBdO1xcblxcdHZlYzMgdjIgPSByZWN0Q29vcmRzWyAzIF0gLSByZWN0Q29vcmRzWyAwIF07XFxuXFx0dmVjMyBsaWdodE5vcm1hbCA9IGNyb3NzKCB2MSwgdjIgKTtcXG5cXHRpZiggZG90KCBsaWdodE5vcm1hbCwgUCAtIHJlY3RDb29yZHNbIDAgXSApIDwgMC4wICkgcmV0dXJuIHZlYzMoIDAuMCApO1xcblxcdHZlYzMgVDEsIFQyO1xcblxcdFQxID0gbm9ybWFsaXplKCBWIC0gTiAqIGRvdCggViwgTiApICk7XFxuXFx0VDIgPSAtIGNyb3NzKCBOLCBUMSApO1xcblxcdG1hdDMgbWF0ID0gbUludiAqIHRyYW5zcG9zZU1hdDMoIG1hdDMoIFQxLCBUMiwgTiApICk7XFxuXFx0dmVjMyBjb29yZHNbIDQgXTtcXG5cXHRjb29yZHNbIDAgXSA9IG1hdCAqICggcmVjdENvb3Jkc1sgMCBdIC0gUCApO1xcblxcdGNvb3Jkc1sgMSBdID0gbWF0ICogKCByZWN0Q29vcmRzWyAxIF0gLSBQICk7XFxuXFx0Y29vcmRzWyAyIF0gPSBtYXQgKiAoIHJlY3RDb29yZHNbIDIgXSAtIFAgKTtcXG5cXHRjb29yZHNbIDMgXSA9IG1hdCAqICggcmVjdENvb3Jkc1sgMyBdIC0gUCApO1xcblxcdGNvb3Jkc1sgMCBdID0gbm9ybWFsaXplKCBjb29yZHNbIDAgXSApO1xcblxcdGNvb3Jkc1sgMSBdID0gbm9ybWFsaXplKCBjb29yZHNbIDEgXSApO1xcblxcdGNvb3Jkc1sgMiBdID0gbm9ybWFsaXplKCBjb29yZHNbIDIgXSApO1xcblxcdGNvb3Jkc1sgMyBdID0gbm9ybWFsaXplKCBjb29yZHNbIDMgXSApO1xcblxcdHZlYzMgdmVjdG9yRm9ybUZhY3RvciA9IHZlYzMoIDAuMCApO1xcblxcdHZlY3RvckZvcm1GYWN0b3IgKz0gTFRDX0VkZ2VWZWN0b3JGb3JtRmFjdG9yKCBjb29yZHNbIDAgXSwgY29vcmRzWyAxIF0gKTtcXG5cXHR2ZWN0b3JGb3JtRmFjdG9yICs9IExUQ19FZGdlVmVjdG9yRm9ybUZhY3RvciggY29vcmRzWyAxIF0sIGNvb3Jkc1sgMiBdICk7XFxuXFx0dmVjdG9yRm9ybUZhY3RvciArPSBMVENfRWRnZVZlY3RvckZvcm1GYWN0b3IoIGNvb3Jkc1sgMiBdLCBjb29yZHNbIDMgXSApO1xcblxcdHZlY3RvckZvcm1GYWN0b3IgKz0gTFRDX0VkZ2VWZWN0b3JGb3JtRmFjdG9yKCBjb29yZHNbIDMgXSwgY29vcmRzWyAwIF0gKTtcXG5cXHRmbG9hdCByZXN1bHQgPSBMVENfQ2xpcHBlZFNwaGVyZUZvcm1GYWN0b3IoIHZlY3RvckZvcm1GYWN0b3IgKTtcXG5cXHRyZXR1cm4gdmVjMyggcmVzdWx0ICk7XFxufVxcbnZlYzMgQlJERl9TcGVjdWxhcl9HR1hfRW52aXJvbm1lbnQoIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIHZlYzMgc3BlY3VsYXJDb2xvciwgY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzICkge1xcblxcdGZsb2F0IGRvdE5WID0gc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBnZW9tZXRyeS52aWV3RGlyICkgKTtcXG5cXHRjb25zdCB2ZWM0IGMwID0gdmVjNCggLSAxLCAtIDAuMDI3NSwgLSAwLjU3MiwgMC4wMjIgKTtcXG5cXHRjb25zdCB2ZWM0IGMxID0gdmVjNCggMSwgMC4wNDI1LCAxLjA0LCAtIDAuMDQgKTtcXG5cXHR2ZWM0IHIgPSByb3VnaG5lc3MgKiBjMCArIGMxO1xcblxcdGZsb2F0IGEwMDQgPSBtaW4oIHIueCAqIHIueCwgZXhwMiggLSA5LjI4ICogZG90TlYgKSApICogci54ICsgci55O1xcblxcdHZlYzIgQUIgPSB2ZWMyKCAtMS4wNCwgMS4wNCApICogYTAwNCArIHIuenc7XFxuXFx0cmV0dXJuIHNwZWN1bGFyQ29sb3IgKiBBQi54ICsgQUIueTtcXG59XFxuZmxvYXQgR19CbGlublBob25nX0ltcGxpY2l0KCApIHtcXG5cXHRyZXR1cm4gMC4yNTtcXG59XFxuZmxvYXQgRF9CbGlublBob25nKCBjb25zdCBpbiBmbG9hdCBzaGluaW5lc3MsIGNvbnN0IGluIGZsb2F0IGRvdE5IICkge1xcblxcdHJldHVybiBSRUNJUFJPQ0FMX1BJICogKCBzaGluaW5lc3MgKiAwLjUgKyAxLjAgKSAqIHBvdyggZG90TkgsIHNoaW5pbmVzcyApO1xcbn1cXG52ZWMzIEJSREZfU3BlY3VsYXJfQmxpbm5QaG9uZyggY29uc3QgaW4gSW5jaWRlbnRMaWdodCBpbmNpZGVudExpZ2h0LCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiB2ZWMzIHNwZWN1bGFyQ29sb3IsIGNvbnN0IGluIGZsb2F0IHNoaW5pbmVzcyApIHtcXG5cXHR2ZWMzIGhhbGZEaXIgPSBub3JtYWxpemUoIGluY2lkZW50TGlnaHQuZGlyZWN0aW9uICsgZ2VvbWV0cnkudmlld0RpciApO1xcblxcdGZsb2F0IGRvdE5IID0gc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBoYWxmRGlyICkgKTtcXG5cXHRmbG9hdCBkb3RMSCA9IHNhdHVyYXRlKCBkb3QoIGluY2lkZW50TGlnaHQuZGlyZWN0aW9uLCBoYWxmRGlyICkgKTtcXG5cXHR2ZWMzIEYgPSBGX1NjaGxpY2soIHNwZWN1bGFyQ29sb3IsIGRvdExIICk7XFxuXFx0ZmxvYXQgRyA9IEdfQmxpbm5QaG9uZ19JbXBsaWNpdCggKTtcXG5cXHRmbG9hdCBEID0gRF9CbGlublBob25nKCBzaGluaW5lc3MsIGRvdE5IICk7XFxuXFx0cmV0dXJuIEYgKiAoIEcgKiBEICk7XFxufVxcbmZsb2F0IEdHWFJvdWdobmVzc1RvQmxpbm5FeHBvbmVudCggY29uc3QgaW4gZmxvYXQgZ2d4Um91Z2huZXNzICkge1xcblxcdHJldHVybiAoIDIuMCAvIHBvdzIoIGdneFJvdWdobmVzcyArIDAuMDAwMSApIC0gMi4wICk7XFxufVxcbmZsb2F0IEJsaW5uRXhwb25lbnRUb0dHWFJvdWdobmVzcyggY29uc3QgaW4gZmxvYXQgYmxpbm5FeHBvbmVudCApIHtcXG5cXHRyZXR1cm4gc3FydCggMi4wIC8gKCBibGlubkV4cG9uZW50ICsgMi4wICkgKTtcXG59XFxuXCI7XG5cbnZhciBidW1wbWFwX3BhcnNfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfQlVNUE1BUFxcblxcdHVuaWZvcm0gc2FtcGxlcjJEIGJ1bXBNYXA7XFxuXFx0dW5pZm9ybSBmbG9hdCBidW1wU2NhbGU7XFxuXFx0dmVjMiBkSGR4eV9md2QoKSB7XFxuXFx0XFx0dmVjMiBkU1RkeCA9IGRGZHgoIHZVdiApO1xcblxcdFxcdHZlYzIgZFNUZHkgPSBkRmR5KCB2VXYgKTtcXG5cXHRcXHRmbG9hdCBIbGwgPSBidW1wU2NhbGUgKiB0ZXh0dXJlMkQoIGJ1bXBNYXAsIHZVdiApLng7XFxuXFx0XFx0ZmxvYXQgZEJ4ID0gYnVtcFNjYWxlICogdGV4dHVyZTJEKCBidW1wTWFwLCB2VXYgKyBkU1RkeCApLnggLSBIbGw7XFxuXFx0XFx0ZmxvYXQgZEJ5ID0gYnVtcFNjYWxlICogdGV4dHVyZTJEKCBidW1wTWFwLCB2VXYgKyBkU1RkeSApLnggLSBIbGw7XFxuXFx0XFx0cmV0dXJuIHZlYzIoIGRCeCwgZEJ5ICk7XFxuXFx0fVxcblxcdHZlYzMgcGVydHVyYk5vcm1hbEFyYiggdmVjMyBzdXJmX3BvcywgdmVjMyBzdXJmX25vcm0sIHZlYzIgZEhkeHkgKSB7XFxuXFx0XFx0dmVjMyB2U2lnbWFYID0gdmVjMyggZEZkeCggc3VyZl9wb3MueCApLCBkRmR4KCBzdXJmX3Bvcy55ICksIGRGZHgoIHN1cmZfcG9zLnogKSApO1xcblxcdFxcdHZlYzMgdlNpZ21hWSA9IHZlYzMoIGRGZHkoIHN1cmZfcG9zLnggKSwgZEZkeSggc3VyZl9wb3MueSApLCBkRmR5KCBzdXJmX3Bvcy56ICkgKTtcXG5cXHRcXHR2ZWMzIHZOID0gc3VyZl9ub3JtO1xcblxcdFxcdHZlYzMgUjEgPSBjcm9zcyggdlNpZ21hWSwgdk4gKTtcXG5cXHRcXHR2ZWMzIFIyID0gY3Jvc3MoIHZOLCB2U2lnbWFYICk7XFxuXFx0XFx0ZmxvYXQgZkRldCA9IGRvdCggdlNpZ21hWCwgUjEgKTtcXG5cXHRcXHR2ZWMzIHZHcmFkID0gc2lnbiggZkRldCApICogKCBkSGR4eS54ICogUjEgKyBkSGR4eS55ICogUjIgKTtcXG5cXHRcXHRyZXR1cm4gbm9ybWFsaXplKCBhYnMoIGZEZXQgKSAqIHN1cmZfbm9ybSAtIHZHcmFkICk7XFxuXFx0fVxcbiNlbmRpZlxcblwiO1xuXG52YXIgY2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50ID0gXCIjaWYgTlVNX0NMSVBQSU5HX1BMQU5FUyA+IDBcXG5cXHR2ZWM0IHBsYW5lO1xcblxcdCNwcmFnbWEgdW5yb2xsX2xvb3BcXG5cXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBVTklPTl9DTElQUElOR19QTEFORVM7IGkgKysgKSB7XFxuXFx0XFx0cGxhbmUgPSBjbGlwcGluZ1BsYW5lc1sgaSBdO1xcblxcdFxcdGlmICggZG90KCB2Vmlld1Bvc2l0aW9uLCBwbGFuZS54eXogKSA+IHBsYW5lLncgKSBkaXNjYXJkO1xcblxcdH1cXG5cXHQjaWYgVU5JT05fQ0xJUFBJTkdfUExBTkVTIDwgTlVNX0NMSVBQSU5HX1BMQU5FU1xcblxcdFxcdGJvb2wgY2xpcHBlZCA9IHRydWU7XFxuXFx0XFx0I3ByYWdtYSB1bnJvbGxfbG9vcFxcblxcdFxcdGZvciAoIGludCBpID0gVU5JT05fQ0xJUFBJTkdfUExBTkVTOyBpIDwgTlVNX0NMSVBQSU5HX1BMQU5FUzsgaSArKyApIHtcXG5cXHRcXHRcXHRwbGFuZSA9IGNsaXBwaW5nUGxhbmVzWyBpIF07XFxuXFx0XFx0XFx0Y2xpcHBlZCA9ICggZG90KCB2Vmlld1Bvc2l0aW9uLCBwbGFuZS54eXogKSA+IHBsYW5lLncgKSAmJiBjbGlwcGVkO1xcblxcdFxcdH1cXG5cXHRcXHRpZiAoIGNsaXBwZWQgKSBkaXNjYXJkO1xcblxcdCNlbmRpZlxcbiNlbmRpZlxcblwiO1xuXG52YXIgY2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQgPSBcIiNpZiBOVU1fQ0xJUFBJTkdfUExBTkVTID4gMFxcblxcdCNpZiAhIGRlZmluZWQoIFBIWVNJQ0FMICkgJiYgISBkZWZpbmVkKCBQSE9ORyApXFxuXFx0XFx0dmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XFxuXFx0I2VuZGlmXFxuXFx0dW5pZm9ybSB2ZWM0IGNsaXBwaW5nUGxhbmVzWyBOVU1fQ0xJUFBJTkdfUExBTkVTIF07XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXggPSBcIiNpZiBOVU1fQ0xJUFBJTkdfUExBTkVTID4gMCAmJiAhIGRlZmluZWQoIFBIWVNJQ0FMICkgJiYgISBkZWZpbmVkKCBQSE9ORyApXFxuXFx0dmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBjbGlwcGluZ19wbGFuZXNfdmVydGV4ID0gXCIjaWYgTlVNX0NMSVBQSU5HX1BMQU5FUyA+IDAgJiYgISBkZWZpbmVkKCBQSFlTSUNBTCApICYmICEgZGVmaW5lZCggUEhPTkcgKVxcblxcdHZWaWV3UG9zaXRpb24gPSAtIG12UG9zaXRpb24ueHl6O1xcbiNlbmRpZlxcblwiO1xuXG52YXIgY29sb3JfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfQ09MT1JcXG5cXHRkaWZmdXNlQ29sb3IucmdiICo9IHZDb2xvcjtcXG4jZW5kaWZcIjtcblxudmFyIGNvbG9yX3BhcnNfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfQ09MT1JcXG5cXHR2YXJ5aW5nIHZlYzMgdkNvbG9yO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgY29sb3JfcGFyc192ZXJ0ZXggPSBcIiNpZmRlZiBVU0VfQ09MT1JcXG5cXHR2YXJ5aW5nIHZlYzMgdkNvbG9yO1xcbiNlbmRpZlwiO1xuXG52YXIgY29sb3JfdmVydGV4ID0gXCIjaWZkZWYgVVNFX0NPTE9SXFxuXFx0dkNvbG9yLnh5eiA9IGNvbG9yLnh5ejtcXG4jZW5kaWZcIjtcblxudmFyIGNvbW1vbiA9IFwiI2RlZmluZSBQSSAzLjE0MTU5MjY1MzU5XFxuI2RlZmluZSBQSTIgNi4yODMxODUzMDcxOFxcbiNkZWZpbmUgUElfSEFMRiAxLjU3MDc5NjMyNjc5NDlcXG4jZGVmaW5lIFJFQ0lQUk9DQUxfUEkgMC4zMTgzMDk4ODYxOFxcbiNkZWZpbmUgUkVDSVBST0NBTF9QSTIgMC4xNTkxNTQ5NFxcbiNkZWZpbmUgTE9HMiAxLjQ0MjY5NVxcbiNkZWZpbmUgRVBTSUxPTiAxZS02XFxuI2RlZmluZSBzYXR1cmF0ZShhKSBjbGFtcCggYSwgMC4wLCAxLjAgKVxcbiNkZWZpbmUgd2hpdGVDb21wbGltZW50KGEpICggMS4wIC0gc2F0dXJhdGUoIGEgKSApXFxuZmxvYXQgcG93MiggY29uc3QgaW4gZmxvYXQgeCApIHsgcmV0dXJuIHgqeDsgfVxcbmZsb2F0IHBvdzMoIGNvbnN0IGluIGZsb2F0IHggKSB7IHJldHVybiB4KngqeDsgfVxcbmZsb2F0IHBvdzQoIGNvbnN0IGluIGZsb2F0IHggKSB7IGZsb2F0IHgyID0geCp4OyByZXR1cm4geDIqeDI7IH1cXG5mbG9hdCBhdmVyYWdlKCBjb25zdCBpbiB2ZWMzIGNvbG9yICkgeyByZXR1cm4gZG90KCBjb2xvciwgdmVjMyggMC4zMzMzICkgKTsgfVxcbmhpZ2hwIGZsb2F0IHJhbmQoIGNvbnN0IGluIHZlYzIgdXYgKSB7XFxuXFx0Y29uc3QgaGlnaHAgZmxvYXQgYSA9IDEyLjk4OTgsIGIgPSA3OC4yMzMsIGMgPSA0Mzc1OC41NDUzO1xcblxcdGhpZ2hwIGZsb2F0IGR0ID0gZG90KCB1di54eSwgdmVjMiggYSxiICkgKSwgc24gPSBtb2QoIGR0LCBQSSApO1xcblxcdHJldHVybiBmcmFjdChzaW4oc24pICogYyk7XFxufVxcbnN0cnVjdCBJbmNpZGVudExpZ2h0IHtcXG5cXHR2ZWMzIGNvbG9yO1xcblxcdHZlYzMgZGlyZWN0aW9uO1xcblxcdGJvb2wgdmlzaWJsZTtcXG59O1xcbnN0cnVjdCBSZWZsZWN0ZWRMaWdodCB7XFxuXFx0dmVjMyBkaXJlY3REaWZmdXNlO1xcblxcdHZlYzMgZGlyZWN0U3BlY3VsYXI7XFxuXFx0dmVjMyBpbmRpcmVjdERpZmZ1c2U7XFxuXFx0dmVjMyBpbmRpcmVjdFNwZWN1bGFyO1xcbn07XFxuc3RydWN0IEdlb21ldHJpY0NvbnRleHQge1xcblxcdHZlYzMgcG9zaXRpb247XFxuXFx0dmVjMyBub3JtYWw7XFxuXFx0dmVjMyB2aWV3RGlyO1xcbn07XFxudmVjMyB0cmFuc2Zvcm1EaXJlY3Rpb24oIGluIHZlYzMgZGlyLCBpbiBtYXQ0IG1hdHJpeCApIHtcXG5cXHRyZXR1cm4gbm9ybWFsaXplKCAoIG1hdHJpeCAqIHZlYzQoIGRpciwgMC4wICkgKS54eXogKTtcXG59XFxudmVjMyBpbnZlcnNlVHJhbnNmb3JtRGlyZWN0aW9uKCBpbiB2ZWMzIGRpciwgaW4gbWF0NCBtYXRyaXggKSB7XFxuXFx0cmV0dXJuIG5vcm1hbGl6ZSggKCB2ZWM0KCBkaXIsIDAuMCApICogbWF0cml4ICkueHl6ICk7XFxufVxcbnZlYzMgcHJvamVjdE9uUGxhbmUoaW4gdmVjMyBwb2ludCwgaW4gdmVjMyBwb2ludE9uUGxhbmUsIGluIHZlYzMgcGxhbmVOb3JtYWwgKSB7XFxuXFx0ZmxvYXQgZGlzdGFuY2UgPSBkb3QoIHBsYW5lTm9ybWFsLCBwb2ludCAtIHBvaW50T25QbGFuZSApO1xcblxcdHJldHVybiAtIGRpc3RhbmNlICogcGxhbmVOb3JtYWwgKyBwb2ludDtcXG59XFxuZmxvYXQgc2lkZU9mUGxhbmUoIGluIHZlYzMgcG9pbnQsIGluIHZlYzMgcG9pbnRPblBsYW5lLCBpbiB2ZWMzIHBsYW5lTm9ybWFsICkge1xcblxcdHJldHVybiBzaWduKCBkb3QoIHBvaW50IC0gcG9pbnRPblBsYW5lLCBwbGFuZU5vcm1hbCApICk7XFxufVxcbnZlYzMgbGluZVBsYW5lSW50ZXJzZWN0KCBpbiB2ZWMzIHBvaW50T25MaW5lLCBpbiB2ZWMzIGxpbmVEaXJlY3Rpb24sIGluIHZlYzMgcG9pbnRPblBsYW5lLCBpbiB2ZWMzIHBsYW5lTm9ybWFsICkge1xcblxcdHJldHVybiBsaW5lRGlyZWN0aW9uICogKCBkb3QoIHBsYW5lTm9ybWFsLCBwb2ludE9uUGxhbmUgLSBwb2ludE9uTGluZSApIC8gZG90KCBwbGFuZU5vcm1hbCwgbGluZURpcmVjdGlvbiApICkgKyBwb2ludE9uTGluZTtcXG59XFxubWF0MyB0cmFuc3Bvc2VNYXQzKCBjb25zdCBpbiBtYXQzIG0gKSB7XFxuXFx0bWF0MyB0bXA7XFxuXFx0dG1wWyAwIF0gPSB2ZWMzKCBtWyAwIF0ueCwgbVsgMSBdLngsIG1bIDIgXS54ICk7XFxuXFx0dG1wWyAxIF0gPSB2ZWMzKCBtWyAwIF0ueSwgbVsgMSBdLnksIG1bIDIgXS55ICk7XFxuXFx0dG1wWyAyIF0gPSB2ZWMzKCBtWyAwIF0ueiwgbVsgMSBdLnosIG1bIDIgXS56ICk7XFxuXFx0cmV0dXJuIHRtcDtcXG59XFxuZmxvYXQgbGluZWFyVG9SZWxhdGl2ZUx1bWluYW5jZSggY29uc3QgaW4gdmVjMyBjb2xvciApIHtcXG5cXHR2ZWMzIHdlaWdodHMgPSB2ZWMzKCAwLjIxMjYsIDAuNzE1MiwgMC4wNzIyICk7XFxuXFx0cmV0dXJuIGRvdCggd2VpZ2h0cywgY29sb3IucmdiICk7XFxufVxcblwiO1xuXG52YXIgY3ViZV91dl9yZWZsZWN0aW9uX2ZyYWdtZW50ID0gXCIjaWZkZWYgRU5WTUFQX1RZUEVfQ1VCRV9VVlxcbiNkZWZpbmUgY3ViZVVWX3RleHR1cmVTaXplICgxMDI0LjApXFxuaW50IGdldEZhY2VGcm9tRGlyZWN0aW9uKHZlYzMgZGlyZWN0aW9uKSB7XFxuXFx0dmVjMyBhYnNEaXJlY3Rpb24gPSBhYnMoZGlyZWN0aW9uKTtcXG5cXHRpbnQgZmFjZSA9IC0xO1xcblxcdGlmKCBhYnNEaXJlY3Rpb24ueCA+IGFic0RpcmVjdGlvbi56ICkge1xcblxcdFxcdGlmKGFic0RpcmVjdGlvbi54ID4gYWJzRGlyZWN0aW9uLnkgKVxcblxcdFxcdFxcdGZhY2UgPSBkaXJlY3Rpb24ueCA+IDAuMCA/IDAgOiAzO1xcblxcdFxcdGVsc2VcXG5cXHRcXHRcXHRmYWNlID0gZGlyZWN0aW9uLnkgPiAwLjAgPyAxIDogNDtcXG5cXHR9XFxuXFx0ZWxzZSB7XFxuXFx0XFx0aWYoYWJzRGlyZWN0aW9uLnogPiBhYnNEaXJlY3Rpb24ueSApXFxuXFx0XFx0XFx0ZmFjZSA9IGRpcmVjdGlvbi56ID4gMC4wID8gMiA6IDU7XFxuXFx0XFx0ZWxzZVxcblxcdFxcdFxcdGZhY2UgPSBkaXJlY3Rpb24ueSA+IDAuMCA/IDEgOiA0O1xcblxcdH1cXG5cXHRyZXR1cm4gZmFjZTtcXG59XFxuI2RlZmluZSBjdWJlVVZfbWF4TG9kczEgIChsb2cyKGN1YmVVVl90ZXh0dXJlU2l6ZSowLjI1KSAtIDEuMClcXG4jZGVmaW5lIGN1YmVVVl9yYW5nZUNsYW1wIChleHAyKCg2LjAgLSAxLjApICogMi4wKSlcXG52ZWMyIE1pcExldmVsSW5mbyggdmVjMyB2ZWMsIGZsb2F0IHJvdWdobmVzc0xldmVsLCBmbG9hdCByb3VnaG5lc3MgKSB7XFxuXFx0ZmxvYXQgc2NhbGUgPSBleHAyKGN1YmVVVl9tYXhMb2RzMSAtIHJvdWdobmVzc0xldmVsKTtcXG5cXHRmbG9hdCBkeFJvdWdobmVzcyA9IGRGZHgocm91Z2huZXNzKTtcXG5cXHRmbG9hdCBkeVJvdWdobmVzcyA9IGRGZHkocm91Z2huZXNzKTtcXG5cXHR2ZWMzIGR4ID0gZEZkeCggdmVjICogc2NhbGUgKiBkeFJvdWdobmVzcyApO1xcblxcdHZlYzMgZHkgPSBkRmR5KCB2ZWMgKiBzY2FsZSAqIGR5Um91Z2huZXNzICk7XFxuXFx0ZmxvYXQgZCA9IG1heCggZG90KCBkeCwgZHggKSwgZG90KCBkeSwgZHkgKSApO1xcblxcdGQgPSBjbGFtcChkLCAxLjAsIGN1YmVVVl9yYW5nZUNsYW1wKTtcXG5cXHRmbG9hdCBtaXBMZXZlbCA9IDAuNSAqIGxvZzIoZCk7XFxuXFx0cmV0dXJuIHZlYzIoZmxvb3IobWlwTGV2ZWwpLCBmcmFjdChtaXBMZXZlbCkpO1xcbn1cXG4jZGVmaW5lIGN1YmVVVl9tYXhMb2RzMiAobG9nMihjdWJlVVZfdGV4dHVyZVNpemUqMC4yNSkgLSAyLjApXFxuI2RlZmluZSBjdWJlVVZfcmNwVGV4dHVyZVNpemUgKDEuMCAvIGN1YmVVVl90ZXh0dXJlU2l6ZSlcXG52ZWMyIGdldEN1YmVVVih2ZWMzIGRpcmVjdGlvbiwgZmxvYXQgcm91Z2huZXNzTGV2ZWwsIGZsb2F0IG1pcExldmVsKSB7XFxuXFx0bWlwTGV2ZWwgPSByb3VnaG5lc3NMZXZlbCA+IGN1YmVVVl9tYXhMb2RzMiAtIDMuMCA/IDAuMCA6IG1pcExldmVsO1xcblxcdGZsb2F0IGEgPSAxNi4wICogY3ViZVVWX3JjcFRleHR1cmVTaXplO1xcblxcdHZlYzIgZXhwMl9wYWNrZWQgPSBleHAyKCB2ZWMyKCByb3VnaG5lc3NMZXZlbCwgbWlwTGV2ZWwgKSApO1xcblxcdHZlYzIgcmNwX2V4cDJfcGFja2VkID0gdmVjMiggMS4wICkgLyBleHAyX3BhY2tlZDtcXG5cXHRmbG9hdCBwb3dTY2FsZSA9IGV4cDJfcGFja2VkLnggKiBleHAyX3BhY2tlZC55O1xcblxcdGZsb2F0IHNjYWxlID0gcmNwX2V4cDJfcGFja2VkLnggKiByY3BfZXhwMl9wYWNrZWQueSAqIDAuMjU7XFxuXFx0ZmxvYXQgbWlwT2Zmc2V0ID0gMC43NSooMS4wIC0gcmNwX2V4cDJfcGFja2VkLnkpICogcmNwX2V4cDJfcGFja2VkLng7XFxuXFx0Ym9vbCBiUmVzID0gbWlwTGV2ZWwgPT0gMC4wO1xcblxcdHNjYWxlID0gIGJSZXMgJiYgKHNjYWxlIDwgYSkgPyBhIDogc2NhbGU7XFxuXFx0dmVjMyByO1xcblxcdHZlYzIgb2Zmc2V0O1xcblxcdGludCBmYWNlID0gZ2V0RmFjZUZyb21EaXJlY3Rpb24oZGlyZWN0aW9uKTtcXG5cXHRmbG9hdCByY3BQb3dTY2FsZSA9IDEuMCAvIHBvd1NjYWxlO1xcblxcdGlmKCBmYWNlID09IDApIHtcXG5cXHRcXHRyID0gdmVjMyhkaXJlY3Rpb24ueCwgLWRpcmVjdGlvbi56LCBkaXJlY3Rpb24ueSk7XFxuXFx0XFx0b2Zmc2V0ID0gdmVjMigwLjArbWlwT2Zmc2V0LDAuNzUgKiByY3BQb3dTY2FsZSk7XFxuXFx0XFx0b2Zmc2V0LnkgPSBiUmVzICYmIChvZmZzZXQueSA8IDIuMCphKSA/IGEgOiBvZmZzZXQueTtcXG5cXHR9XFxuXFx0ZWxzZSBpZiggZmFjZSA9PSAxKSB7XFxuXFx0XFx0ciA9IHZlYzMoZGlyZWN0aW9uLnksIGRpcmVjdGlvbi54LCBkaXJlY3Rpb24ueik7XFxuXFx0XFx0b2Zmc2V0ID0gdmVjMihzY2FsZSttaXBPZmZzZXQsIDAuNzUgKiByY3BQb3dTY2FsZSk7XFxuXFx0XFx0b2Zmc2V0LnkgPSBiUmVzICYmIChvZmZzZXQueSA8IDIuMCphKSA/IGEgOiBvZmZzZXQueTtcXG5cXHR9XFxuXFx0ZWxzZSBpZiggZmFjZSA9PSAyKSB7XFxuXFx0XFx0ciA9IHZlYzMoZGlyZWN0aW9uLnosIGRpcmVjdGlvbi54LCBkaXJlY3Rpb24ueSk7XFxuXFx0XFx0b2Zmc2V0ID0gdmVjMigyLjAqc2NhbGUrbWlwT2Zmc2V0LCAwLjc1ICogcmNwUG93U2NhbGUpO1xcblxcdFxcdG9mZnNldC55ID0gYlJlcyAmJiAob2Zmc2V0LnkgPCAyLjAqYSkgPyBhIDogb2Zmc2V0Lnk7XFxuXFx0fVxcblxcdGVsc2UgaWYoIGZhY2UgPT0gMykge1xcblxcdFxcdHIgPSB2ZWMzKGRpcmVjdGlvbi54LCBkaXJlY3Rpb24ueiwgZGlyZWN0aW9uLnkpO1xcblxcdFxcdG9mZnNldCA9IHZlYzIoMC4wK21pcE9mZnNldCwwLjUgKiByY3BQb3dTY2FsZSk7XFxuXFx0XFx0b2Zmc2V0LnkgPSBiUmVzICYmIChvZmZzZXQueSA8IDIuMCphKSA/IDAuMCA6IG9mZnNldC55O1xcblxcdH1cXG5cXHRlbHNlIGlmKCBmYWNlID09IDQpIHtcXG5cXHRcXHRyID0gdmVjMyhkaXJlY3Rpb24ueSwgZGlyZWN0aW9uLngsIC1kaXJlY3Rpb24ueik7XFxuXFx0XFx0b2Zmc2V0ID0gdmVjMihzY2FsZSttaXBPZmZzZXQsIDAuNSAqIHJjcFBvd1NjYWxlKTtcXG5cXHRcXHRvZmZzZXQueSA9IGJSZXMgJiYgKG9mZnNldC55IDwgMi4wKmEpID8gMC4wIDogb2Zmc2V0Lnk7XFxuXFx0fVxcblxcdGVsc2Uge1xcblxcdFxcdHIgPSB2ZWMzKGRpcmVjdGlvbi56LCAtZGlyZWN0aW9uLngsIGRpcmVjdGlvbi55KTtcXG5cXHRcXHRvZmZzZXQgPSB2ZWMyKDIuMCpzY2FsZSttaXBPZmZzZXQsIDAuNSAqIHJjcFBvd1NjYWxlKTtcXG5cXHRcXHRvZmZzZXQueSA9IGJSZXMgJiYgKG9mZnNldC55IDwgMi4wKmEpID8gMC4wIDogb2Zmc2V0Lnk7XFxuXFx0fVxcblxcdHIgPSBub3JtYWxpemUocik7XFxuXFx0ZmxvYXQgdGV4ZWxPZmZzZXQgPSAwLjUgKiBjdWJlVVZfcmNwVGV4dHVyZVNpemU7XFxuXFx0dmVjMiBzID0gKCByLnl6IC8gYWJzKCByLnggKSArIHZlYzIoIDEuMCApICkgKiAwLjU7XFxuXFx0dmVjMiBiYXNlID0gb2Zmc2V0ICsgdmVjMiggdGV4ZWxPZmZzZXQgKTtcXG5cXHRyZXR1cm4gYmFzZSArIHMgKiAoIHNjYWxlIC0gMi4wICogdGV4ZWxPZmZzZXQgKTtcXG59XFxuI2RlZmluZSBjdWJlVVZfbWF4TG9kczMgKGxvZzIoY3ViZVVWX3RleHR1cmVTaXplKjAuMjUpIC0gMy4wKVxcbnZlYzQgdGV4dHVyZUN1YmVVVih2ZWMzIHJlZmxlY3RlZERpcmVjdGlvbiwgZmxvYXQgcm91Z2huZXNzICkge1xcblxcdGZsb2F0IHJvdWdobmVzc1ZhbCA9IHJvdWdobmVzcyogY3ViZVVWX21heExvZHMzO1xcblxcdGZsb2F0IHIxID0gZmxvb3Iocm91Z2huZXNzVmFsKTtcXG5cXHRmbG9hdCByMiA9IHIxICsgMS4wO1xcblxcdGZsb2F0IHQgPSBmcmFjdChyb3VnaG5lc3NWYWwpO1xcblxcdHZlYzIgbWlwSW5mbyA9IE1pcExldmVsSW5mbyhyZWZsZWN0ZWREaXJlY3Rpb24sIHIxLCByb3VnaG5lc3MpO1xcblxcdGZsb2F0IHMgPSBtaXBJbmZvLnk7XFxuXFx0ZmxvYXQgbGV2ZWwwID0gbWlwSW5mby54O1xcblxcdGZsb2F0IGxldmVsMSA9IGxldmVsMCArIDEuMDtcXG5cXHRsZXZlbDEgPSBsZXZlbDEgPiA1LjAgPyA1LjAgOiBsZXZlbDE7XFxuXFx0bGV2ZWwwICs9IG1pbiggZmxvb3IoIHMgKyAwLjUgKSwgNS4wICk7XFxuXFx0dmVjMiB1dl8xMCA9IGdldEN1YmVVVihyZWZsZWN0ZWREaXJlY3Rpb24sIHIxLCBsZXZlbDApO1xcblxcdHZlYzQgY29sb3IxMCA9IGVudk1hcFRleGVsVG9MaW5lYXIodGV4dHVyZTJEKGVudk1hcCwgdXZfMTApKTtcXG5cXHR2ZWMyIHV2XzIwID0gZ2V0Q3ViZVVWKHJlZmxlY3RlZERpcmVjdGlvbiwgcjIsIGxldmVsMCk7XFxuXFx0dmVjNCBjb2xvcjIwID0gZW52TWFwVGV4ZWxUb0xpbmVhcih0ZXh0dXJlMkQoZW52TWFwLCB1dl8yMCkpO1xcblxcdHZlYzQgcmVzdWx0ID0gbWl4KGNvbG9yMTAsIGNvbG9yMjAsIHQpO1xcblxcdHJldHVybiB2ZWM0KHJlc3VsdC5yZ2IsIDEuMCk7XFxufVxcbiNlbmRpZlxcblwiO1xuXG52YXIgZGVmYXVsdG5vcm1hbF92ZXJ0ZXggPSBcInZlYzMgdHJhbnNmb3JtZWROb3JtYWwgPSBub3JtYWxNYXRyaXggKiBvYmplY3ROb3JtYWw7XFxuI2lmZGVmIEZMSVBfU0lERURcXG5cXHR0cmFuc2Zvcm1lZE5vcm1hbCA9IC0gdHJhbnNmb3JtZWROb3JtYWw7XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXggPSBcIiNpZmRlZiBVU0VfRElTUExBQ0VNRU5UTUFQXFxuXFx0dW5pZm9ybSBzYW1wbGVyMkQgZGlzcGxhY2VtZW50TWFwO1xcblxcdHVuaWZvcm0gZmxvYXQgZGlzcGxhY2VtZW50U2NhbGU7XFxuXFx0dW5pZm9ybSBmbG9hdCBkaXNwbGFjZW1lbnRCaWFzO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgZGlzcGxhY2VtZW50bWFwX3ZlcnRleCA9IFwiI2lmZGVmIFVTRV9ESVNQTEFDRU1FTlRNQVBcXG5cXHR0cmFuc2Zvcm1lZCArPSBub3JtYWxpemUoIG9iamVjdE5vcm1hbCApICogKCB0ZXh0dXJlMkQoIGRpc3BsYWNlbWVudE1hcCwgdXYgKS54ICogZGlzcGxhY2VtZW50U2NhbGUgKyBkaXNwbGFjZW1lbnRCaWFzICk7XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBlbWlzc2l2ZW1hcF9mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9FTUlTU0lWRU1BUFxcblxcdHZlYzQgZW1pc3NpdmVDb2xvciA9IHRleHR1cmUyRCggZW1pc3NpdmVNYXAsIHZVdiApO1xcblxcdGVtaXNzaXZlQ29sb3IucmdiID0gZW1pc3NpdmVNYXBUZXhlbFRvTGluZWFyKCBlbWlzc2l2ZUNvbG9yICkucmdiO1xcblxcdHRvdGFsRW1pc3NpdmVSYWRpYW5jZSAqPSBlbWlzc2l2ZUNvbG9yLnJnYjtcXG4jZW5kaWZcXG5cIjtcblxudmFyIGVtaXNzaXZlbWFwX3BhcnNfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfRU1JU1NJVkVNQVBcXG5cXHR1bmlmb3JtIHNhbXBsZXIyRCBlbWlzc2l2ZU1hcDtcXG4jZW5kaWZcXG5cIjtcblxudmFyIGVuY29kaW5nc19mcmFnbWVudCA9IFwiICBnbF9GcmFnQ29sb3IgPSBsaW5lYXJUb091dHB1dFRleGVsKCBnbF9GcmFnQ29sb3IgKTtcXG5cIjtcblxudmFyIGVuY29kaW5nc19wYXJzX2ZyYWdtZW50ID0gXCJcXG52ZWM0IExpbmVhclRvTGluZWFyKCBpbiB2ZWM0IHZhbHVlICkge1xcblxcdHJldHVybiB2YWx1ZTtcXG59XFxudmVjNCBHYW1tYVRvTGluZWFyKCBpbiB2ZWM0IHZhbHVlLCBpbiBmbG9hdCBnYW1tYUZhY3RvciApIHtcXG5cXHRyZXR1cm4gdmVjNCggcG93KCB2YWx1ZS54eXosIHZlYzMoIGdhbW1hRmFjdG9yICkgKSwgdmFsdWUudyApO1xcbn1cXG52ZWM0IExpbmVhclRvR2FtbWEoIGluIHZlYzQgdmFsdWUsIGluIGZsb2F0IGdhbW1hRmFjdG9yICkge1xcblxcdHJldHVybiB2ZWM0KCBwb3coIHZhbHVlLnh5eiwgdmVjMyggMS4wIC8gZ2FtbWFGYWN0b3IgKSApLCB2YWx1ZS53ICk7XFxufVxcbnZlYzQgc1JHQlRvTGluZWFyKCBpbiB2ZWM0IHZhbHVlICkge1xcblxcdHJldHVybiB2ZWM0KCBtaXgoIHBvdyggdmFsdWUucmdiICogMC45NDc4NjcyOTg2ICsgdmVjMyggMC4wNTIxMzI3MDE0ICksIHZlYzMoIDIuNCApICksIHZhbHVlLnJnYiAqIDAuMDc3Mzk5MzgwOCwgdmVjMyggbGVzc1RoYW5FcXVhbCggdmFsdWUucmdiLCB2ZWMzKCAwLjA0MDQ1ICkgKSApICksIHZhbHVlLncgKTtcXG59XFxudmVjNCBMaW5lYXJUb3NSR0IoIGluIHZlYzQgdmFsdWUgKSB7XFxuXFx0cmV0dXJuIHZlYzQoIG1peCggcG93KCB2YWx1ZS5yZ2IsIHZlYzMoIDAuNDE2NjYgKSApICogMS4wNTUgLSB2ZWMzKCAwLjA1NSApLCB2YWx1ZS5yZ2IgKiAxMi45MiwgdmVjMyggbGVzc1RoYW5FcXVhbCggdmFsdWUucmdiLCB2ZWMzKCAwLjAwMzEzMDggKSApICkgKSwgdmFsdWUudyApO1xcbn1cXG52ZWM0IFJHQkVUb0xpbmVhciggaW4gdmVjNCB2YWx1ZSApIHtcXG5cXHRyZXR1cm4gdmVjNCggdmFsdWUucmdiICogZXhwMiggdmFsdWUuYSAqIDI1NS4wIC0gMTI4LjAgKSwgMS4wICk7XFxufVxcbnZlYzQgTGluZWFyVG9SR0JFKCBpbiB2ZWM0IHZhbHVlICkge1xcblxcdGZsb2F0IG1heENvbXBvbmVudCA9IG1heCggbWF4KCB2YWx1ZS5yLCB2YWx1ZS5nICksIHZhbHVlLmIgKTtcXG5cXHRmbG9hdCBmRXhwID0gY2xhbXAoIGNlaWwoIGxvZzIoIG1heENvbXBvbmVudCApICksIC0xMjguMCwgMTI3LjAgKTtcXG5cXHRyZXR1cm4gdmVjNCggdmFsdWUucmdiIC8gZXhwMiggZkV4cCApLCAoIGZFeHAgKyAxMjguMCApIC8gMjU1LjAgKTtcXG59XFxudmVjNCBSR0JNVG9MaW5lYXIoIGluIHZlYzQgdmFsdWUsIGluIGZsb2F0IG1heFJhbmdlICkge1xcblxcdHJldHVybiB2ZWM0KCB2YWx1ZS54eXogKiB2YWx1ZS53ICogbWF4UmFuZ2UsIDEuMCApO1xcbn1cXG52ZWM0IExpbmVhclRvUkdCTSggaW4gdmVjNCB2YWx1ZSwgaW4gZmxvYXQgbWF4UmFuZ2UgKSB7XFxuXFx0ZmxvYXQgbWF4UkdCID0gbWF4KCB2YWx1ZS54LCBtYXgoIHZhbHVlLmcsIHZhbHVlLmIgKSApO1xcblxcdGZsb2F0IE0gICAgICA9IGNsYW1wKCBtYXhSR0IgLyBtYXhSYW5nZSwgMC4wLCAxLjAgKTtcXG5cXHRNICAgICAgICAgICAgPSBjZWlsKCBNICogMjU1LjAgKSAvIDI1NS4wO1xcblxcdHJldHVybiB2ZWM0KCB2YWx1ZS5yZ2IgLyAoIE0gKiBtYXhSYW5nZSApLCBNICk7XFxufVxcbnZlYzQgUkdCRFRvTGluZWFyKCBpbiB2ZWM0IHZhbHVlLCBpbiBmbG9hdCBtYXhSYW5nZSApIHtcXG5cXHRyZXR1cm4gdmVjNCggdmFsdWUucmdiICogKCAoIG1heFJhbmdlIC8gMjU1LjAgKSAvIHZhbHVlLmEgKSwgMS4wICk7XFxufVxcbnZlYzQgTGluZWFyVG9SR0JEKCBpbiB2ZWM0IHZhbHVlLCBpbiBmbG9hdCBtYXhSYW5nZSApIHtcXG5cXHRmbG9hdCBtYXhSR0IgPSBtYXgoIHZhbHVlLngsIG1heCggdmFsdWUuZywgdmFsdWUuYiApICk7XFxuXFx0ZmxvYXQgRCAgICAgID0gbWF4KCBtYXhSYW5nZSAvIG1heFJHQiwgMS4wICk7XFxuXFx0RCAgICAgICAgICAgID0gbWluKCBmbG9vciggRCApIC8gMjU1LjAsIDEuMCApO1xcblxcdHJldHVybiB2ZWM0KCB2YWx1ZS5yZ2IgKiAoIEQgKiAoIDI1NS4wIC8gbWF4UmFuZ2UgKSApLCBEICk7XFxufVxcbmNvbnN0IG1hdDMgY0xvZ0x1dk0gPSBtYXQzKCAwLjIyMDksIDAuMzM5MCwgMC40MTg0LCAwLjExMzgsIDAuNjc4MCwgMC43MzE5LCAwLjAxMDIsIDAuMTEzMCwgMC4yOTY5ICk7XFxudmVjNCBMaW5lYXJUb0xvZ0x1diggaW4gdmVjNCB2YWx1ZSApICB7XFxuXFx0dmVjMyBYcF9ZX1hZWnAgPSB2YWx1ZS5yZ2IgKiBjTG9nTHV2TTtcXG5cXHRYcF9ZX1hZWnAgPSBtYXgoWHBfWV9YWVpwLCB2ZWMzKDFlLTYsIDFlLTYsIDFlLTYpKTtcXG5cXHR2ZWM0IHZSZXN1bHQ7XFxuXFx0dlJlc3VsdC54eSA9IFhwX1lfWFlacC54eSAvIFhwX1lfWFlacC56O1xcblxcdGZsb2F0IExlID0gMi4wICogbG9nMihYcF9ZX1hZWnAueSkgKyAxMjcuMDtcXG5cXHR2UmVzdWx0LncgPSBmcmFjdChMZSk7XFxuXFx0dlJlc3VsdC56ID0gKExlIC0gKGZsb29yKHZSZXN1bHQudyoyNTUuMCkpLzI1NS4wKS8yNTUuMDtcXG5cXHRyZXR1cm4gdlJlc3VsdDtcXG59XFxuY29uc3QgbWF0MyBjTG9nTHV2SW52ZXJzZU0gPSBtYXQzKCA2LjAwMTQsIC0yLjcwMDgsIC0xLjc5OTYsIC0xLjMzMjAsIDMuMTAyOSwgLTUuNzcyMSwgMC4zMDA4LCAtMS4wODgyLCA1LjYyNjggKTtcXG52ZWM0IExvZ0x1dlRvTGluZWFyKCBpbiB2ZWM0IHZhbHVlICkge1xcblxcdGZsb2F0IExlID0gdmFsdWUueiAqIDI1NS4wICsgdmFsdWUudztcXG5cXHR2ZWMzIFhwX1lfWFlacDtcXG5cXHRYcF9ZX1hZWnAueSA9IGV4cDIoKExlIC0gMTI3LjApIC8gMi4wKTtcXG5cXHRYcF9ZX1hZWnAueiA9IFhwX1lfWFlacC55IC8gdmFsdWUueTtcXG5cXHRYcF9ZX1hZWnAueCA9IHZhbHVlLnggKiBYcF9ZX1hZWnAuejtcXG5cXHR2ZWMzIHZSR0IgPSBYcF9ZX1hZWnAucmdiICogY0xvZ0x1dkludmVyc2VNO1xcblxcdHJldHVybiB2ZWM0KCBtYXgodlJHQiwgMC4wKSwgMS4wICk7XFxufVxcblwiO1xuXG52YXIgZW52bWFwX2ZyYWdtZW50ID0gXCIjaWZkZWYgVVNFX0VOVk1BUFxcblxcdCNpZiBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFVTRV9OT1JNQUxNQVAgKSB8fCBkZWZpbmVkKCBQSE9ORyApXFxuXFx0XFx0dmVjMyBjYW1lcmFUb1ZlcnRleCA9IG5vcm1hbGl6ZSggdldvcmxkUG9zaXRpb24gLSBjYW1lcmFQb3NpdGlvbiApO1xcblxcdFxcdHZlYzMgd29ybGROb3JtYWwgPSBpbnZlcnNlVHJhbnNmb3JtRGlyZWN0aW9uKCBub3JtYWwsIHZpZXdNYXRyaXggKTtcXG5cXHRcXHQjaWZkZWYgRU5WTUFQX01PREVfUkVGTEVDVElPTlxcblxcdFxcdFxcdHZlYzMgcmVmbGVjdFZlYyA9IHJlZmxlY3QoIGNhbWVyYVRvVmVydGV4LCB3b3JsZE5vcm1hbCApO1xcblxcdFxcdCNlbHNlXFxuXFx0XFx0XFx0dmVjMyByZWZsZWN0VmVjID0gcmVmcmFjdCggY2FtZXJhVG9WZXJ0ZXgsIHdvcmxkTm9ybWFsLCByZWZyYWN0aW9uUmF0aW8gKTtcXG5cXHRcXHQjZW5kaWZcXG5cXHQjZWxzZVxcblxcdFxcdHZlYzMgcmVmbGVjdFZlYyA9IHZSZWZsZWN0O1xcblxcdCNlbmRpZlxcblxcdCNpZmRlZiBFTlZNQVBfVFlQRV9DVUJFXFxuXFx0XFx0dmVjNCBlbnZDb2xvciA9IHRleHR1cmVDdWJlKCBlbnZNYXAsIHZlYzMoIGZsaXBFbnZNYXAgKiByZWZsZWN0VmVjLngsIHJlZmxlY3RWZWMueXogKSApO1xcblxcdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9UWVBFX0VRVUlSRUMgKVxcblxcdFxcdHZlYzIgc2FtcGxlVVY7XFxuXFx0XFx0cmVmbGVjdFZlYyA9IG5vcm1hbGl6ZSggcmVmbGVjdFZlYyApO1xcblxcdFxcdHNhbXBsZVVWLnkgPSBhc2luKCBjbGFtcCggcmVmbGVjdFZlYy55LCAtIDEuMCwgMS4wICkgKSAqIFJFQ0lQUk9DQUxfUEkgKyAwLjU7XFxuXFx0XFx0c2FtcGxlVVYueCA9IGF0YW4oIHJlZmxlY3RWZWMueiwgcmVmbGVjdFZlYy54ICkgKiBSRUNJUFJPQ0FMX1BJMiArIDAuNTtcXG5cXHRcXHR2ZWM0IGVudkNvbG9yID0gdGV4dHVyZTJEKCBlbnZNYXAsIHNhbXBsZVVWICk7XFxuXFx0I2VsaWYgZGVmaW5lZCggRU5WTUFQX1RZUEVfU1BIRVJFIClcXG5cXHRcXHRyZWZsZWN0VmVjID0gbm9ybWFsaXplKCByZWZsZWN0VmVjICk7XFxuXFx0XFx0dmVjMyByZWZsZWN0VmlldyA9IG5vcm1hbGl6ZSggKCB2aWV3TWF0cml4ICogdmVjNCggcmVmbGVjdFZlYywgMC4wICkgKS54eXogKyB2ZWMzKCAwLjAsIDAuMCwgMS4wICkgKTtcXG5cXHRcXHR2ZWM0IGVudkNvbG9yID0gdGV4dHVyZTJEKCBlbnZNYXAsIHJlZmxlY3RWaWV3Lnh5ICogMC41ICsgMC41ICk7XFxuXFx0I2Vsc2VcXG5cXHRcXHR2ZWM0IGVudkNvbG9yID0gdmVjNCggMC4wICk7XFxuXFx0I2VuZGlmXFxuXFx0ZW52Q29sb3IgPSBlbnZNYXBUZXhlbFRvTGluZWFyKCBlbnZDb2xvciApO1xcblxcdCNpZmRlZiBFTlZNQVBfQkxFTkRJTkdfTVVMVElQTFlcXG5cXHRcXHRvdXRnb2luZ0xpZ2h0ID0gbWl4KCBvdXRnb2luZ0xpZ2h0LCBvdXRnb2luZ0xpZ2h0ICogZW52Q29sb3IueHl6LCBzcGVjdWxhclN0cmVuZ3RoICogcmVmbGVjdGl2aXR5ICk7XFxuXFx0I2VsaWYgZGVmaW5lZCggRU5WTUFQX0JMRU5ESU5HX01JWCApXFxuXFx0XFx0b3V0Z29pbmdMaWdodCA9IG1peCggb3V0Z29pbmdMaWdodCwgZW52Q29sb3IueHl6LCBzcGVjdWxhclN0cmVuZ3RoICogcmVmbGVjdGl2aXR5ICk7XFxuXFx0I2VsaWYgZGVmaW5lZCggRU5WTUFQX0JMRU5ESU5HX0FERCApXFxuXFx0XFx0b3V0Z29pbmdMaWdodCArPSBlbnZDb2xvci54eXogKiBzcGVjdWxhclN0cmVuZ3RoICogcmVmbGVjdGl2aXR5O1xcblxcdCNlbmRpZlxcbiNlbmRpZlxcblwiO1xuXG52YXIgZW52bWFwX3BhcnNfZnJhZ21lbnQgPSBcIiNpZiBkZWZpbmVkKCBVU0VfRU5WTUFQICkgfHwgZGVmaW5lZCggUEhZU0lDQUwgKVxcblxcdHVuaWZvcm0gZmxvYXQgcmVmbGVjdGl2aXR5O1xcblxcdHVuaWZvcm0gZmxvYXQgZW52TWFwSW50ZW5zaXR5O1xcbiNlbmRpZlxcbiNpZmRlZiBVU0VfRU5WTUFQXFxuXFx0I2lmICEgZGVmaW5lZCggUEhZU0lDQUwgKSAmJiAoIGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVVNFX05PUk1BTE1BUCApIHx8IGRlZmluZWQoIFBIT05HICkgKVxcblxcdFxcdHZhcnlpbmcgdmVjMyB2V29ybGRQb3NpdGlvbjtcXG5cXHQjZW5kaWZcXG5cXHQjaWZkZWYgRU5WTUFQX1RZUEVfQ1VCRVxcblxcdFxcdHVuaWZvcm0gc2FtcGxlckN1YmUgZW52TWFwO1xcblxcdCNlbHNlXFxuXFx0XFx0dW5pZm9ybSBzYW1wbGVyMkQgZW52TWFwO1xcblxcdCNlbmRpZlxcblxcdHVuaWZvcm0gZmxvYXQgZmxpcEVudk1hcDtcXG5cXHR1bmlmb3JtIGludCBtYXhNaXBMZXZlbDtcXG5cXHQjaWYgZGVmaW5lZCggVVNFX0JVTVBNQVAgKSB8fCBkZWZpbmVkKCBVU0VfTk9STUFMTUFQICkgfHwgZGVmaW5lZCggUEhPTkcgKSB8fCBkZWZpbmVkKCBQSFlTSUNBTCApXFxuXFx0XFx0dW5pZm9ybSBmbG9hdCByZWZyYWN0aW9uUmF0aW87XFxuXFx0I2Vsc2VcXG5cXHRcXHR2YXJ5aW5nIHZlYzMgdlJlZmxlY3Q7XFxuXFx0I2VuZGlmXFxuI2VuZGlmXFxuXCI7XG5cbnZhciBlbnZtYXBfcGFyc192ZXJ0ZXggPSBcIiNpZmRlZiBVU0VfRU5WTUFQXFxuXFx0I2lmIGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVVNFX05PUk1BTE1BUCApIHx8IGRlZmluZWQoIFBIT05HIClcXG5cXHRcXHR2YXJ5aW5nIHZlYzMgdldvcmxkUG9zaXRpb247XFxuXFx0I2Vsc2VcXG5cXHRcXHR2YXJ5aW5nIHZlYzMgdlJlZmxlY3Q7XFxuXFx0XFx0dW5pZm9ybSBmbG9hdCByZWZyYWN0aW9uUmF0aW87XFxuXFx0I2VuZGlmXFxuI2VuZGlmXFxuXCI7XG5cbnZhciBlbnZtYXBfdmVydGV4ID0gXCIjaWZkZWYgVVNFX0VOVk1BUFxcblxcdCNpZiBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFVTRV9OT1JNQUxNQVAgKSB8fCBkZWZpbmVkKCBQSE9ORyApXFxuXFx0XFx0dldvcmxkUG9zaXRpb24gPSB3b3JsZFBvc2l0aW9uLnh5ejtcXG5cXHQjZWxzZVxcblxcdFxcdHZlYzMgY2FtZXJhVG9WZXJ0ZXggPSBub3JtYWxpemUoIHdvcmxkUG9zaXRpb24ueHl6IC0gY2FtZXJhUG9zaXRpb24gKTtcXG5cXHRcXHR2ZWMzIHdvcmxkTm9ybWFsID0gaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggdHJhbnNmb3JtZWROb3JtYWwsIHZpZXdNYXRyaXggKTtcXG5cXHRcXHQjaWZkZWYgRU5WTUFQX01PREVfUkVGTEVDVElPTlxcblxcdFxcdFxcdHZSZWZsZWN0ID0gcmVmbGVjdCggY2FtZXJhVG9WZXJ0ZXgsIHdvcmxkTm9ybWFsICk7XFxuXFx0XFx0I2Vsc2VcXG5cXHRcXHRcXHR2UmVmbGVjdCA9IHJlZnJhY3QoIGNhbWVyYVRvVmVydGV4LCB3b3JsZE5vcm1hbCwgcmVmcmFjdGlvblJhdGlvICk7XFxuXFx0XFx0I2VuZGlmXFxuXFx0I2VuZGlmXFxuI2VuZGlmXFxuXCI7XG5cbnZhciBmb2dfdmVydGV4ID0gXCJcXG4jaWZkZWYgVVNFX0ZPR1xcbmZvZ0RlcHRoID0gLW12UG9zaXRpb24uejtcXG4jZW5kaWZcIjtcblxudmFyIGZvZ19wYXJzX3ZlcnRleCA9IFwiI2lmZGVmIFVTRV9GT0dcXG4gIHZhcnlpbmcgZmxvYXQgZm9nRGVwdGg7XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBmb2dfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfRk9HXFxuXFx0I2lmZGVmIEZPR19FWFAyXFxuXFx0XFx0ZmxvYXQgZm9nRmFjdG9yID0gd2hpdGVDb21wbGltZW50KCBleHAyKCAtIGZvZ0RlbnNpdHkgKiBmb2dEZW5zaXR5ICogZm9nRGVwdGggKiBmb2dEZXB0aCAqIExPRzIgKSApO1xcblxcdCNlbHNlXFxuXFx0XFx0ZmxvYXQgZm9nRmFjdG9yID0gc21vb3Roc3RlcCggZm9nTmVhciwgZm9nRmFyLCBmb2dEZXB0aCApO1xcblxcdCNlbmRpZlxcblxcdGdsX0ZyYWdDb2xvci5yZ2IgPSBtaXgoIGdsX0ZyYWdDb2xvci5yZ2IsIGZvZ0NvbG9yLCBmb2dGYWN0b3IgKTtcXG4jZW5kaWZcXG5cIjtcblxudmFyIGZvZ19wYXJzX2ZyYWdtZW50ID0gXCIjaWZkZWYgVVNFX0ZPR1xcblxcdHVuaWZvcm0gdmVjMyBmb2dDb2xvcjtcXG5cXHR2YXJ5aW5nIGZsb2F0IGZvZ0RlcHRoO1xcblxcdCNpZmRlZiBGT0dfRVhQMlxcblxcdFxcdHVuaWZvcm0gZmxvYXQgZm9nRGVuc2l0eTtcXG5cXHQjZWxzZVxcblxcdFxcdHVuaWZvcm0gZmxvYXQgZm9nTmVhcjtcXG5cXHRcXHR1bmlmb3JtIGZsb2F0IGZvZ0ZhcjtcXG5cXHQjZW5kaWZcXG4jZW5kaWZcXG5cIjtcblxudmFyIGdyYWRpZW50bWFwX3BhcnNfZnJhZ21lbnQgPSBcIiNpZmRlZiBUT09OXFxuXFx0dW5pZm9ybSBzYW1wbGVyMkQgZ3JhZGllbnRNYXA7XFxuXFx0dmVjMyBnZXRHcmFkaWVudElycmFkaWFuY2UoIHZlYzMgbm9ybWFsLCB2ZWMzIGxpZ2h0RGlyZWN0aW9uICkge1xcblxcdFxcdGZsb2F0IGRvdE5MID0gZG90KCBub3JtYWwsIGxpZ2h0RGlyZWN0aW9uICk7XFxuXFx0XFx0dmVjMiBjb29yZCA9IHZlYzIoIGRvdE5MICogMC41ICsgMC41LCAwLjAgKTtcXG5cXHRcXHQjaWZkZWYgVVNFX0dSQURJRU5UTUFQXFxuXFx0XFx0XFx0cmV0dXJuIHRleHR1cmUyRCggZ3JhZGllbnRNYXAsIGNvb3JkICkucmdiO1xcblxcdFxcdCNlbHNlXFxuXFx0XFx0XFx0cmV0dXJuICggY29vcmQueCA8IDAuNyApID8gdmVjMyggMC43ICkgOiB2ZWMzKCAxLjAgKTtcXG5cXHRcXHQjZW5kaWZcXG5cXHR9XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBsaWdodG1hcF9mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9MSUdIVE1BUFxcblxcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArPSBQSSAqIHRleHR1cmUyRCggbGlnaHRNYXAsIHZVdjIgKS54eXogKiBsaWdodE1hcEludGVuc2l0eTtcXG4jZW5kaWZcXG5cIjtcblxudmFyIGxpZ2h0bWFwX3BhcnNfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfTElHSFRNQVBcXG5cXHR1bmlmb3JtIHNhbXBsZXIyRCBsaWdodE1hcDtcXG5cXHR1bmlmb3JtIGZsb2F0IGxpZ2h0TWFwSW50ZW5zaXR5O1xcbiNlbmRpZlwiO1xuXG52YXIgbGlnaHRzX2xhbWJlcnRfdmVydGV4ID0gXCJ2ZWMzIGRpZmZ1c2UgPSB2ZWMzKCAxLjAgKTtcXG5HZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5O1xcbmdlb21ldHJ5LnBvc2l0aW9uID0gbXZQb3NpdGlvbi54eXo7XFxuZ2VvbWV0cnkubm9ybWFsID0gbm9ybWFsaXplKCB0cmFuc2Zvcm1lZE5vcm1hbCApO1xcbmdlb21ldHJ5LnZpZXdEaXIgPSBub3JtYWxpemUoIC1tdlBvc2l0aW9uLnh5eiApO1xcbkdlb21ldHJpY0NvbnRleHQgYmFja0dlb21ldHJ5O1xcbmJhY2tHZW9tZXRyeS5wb3NpdGlvbiA9IGdlb21ldHJ5LnBvc2l0aW9uO1xcbmJhY2tHZW9tZXRyeS5ub3JtYWwgPSAtZ2VvbWV0cnkubm9ybWFsO1xcbmJhY2tHZW9tZXRyeS52aWV3RGlyID0gZ2VvbWV0cnkudmlld0RpcjtcXG52TGlnaHRGcm9udCA9IHZlYzMoIDAuMCApO1xcbiNpZmRlZiBET1VCTEVfU0lERURcXG5cXHR2TGlnaHRCYWNrID0gdmVjMyggMC4wICk7XFxuI2VuZGlmXFxuSW5jaWRlbnRMaWdodCBkaXJlY3RMaWdodDtcXG5mbG9hdCBkb3ROTDtcXG52ZWMzIGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZTtcXG4jaWYgTlVNX1BPSU5UX0xJR0hUUyA+IDBcXG5cXHQjcHJhZ21hIHVucm9sbF9sb29wXFxuXFx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX1BPSU5UX0xJR0hUUzsgaSArKyApIHtcXG5cXHRcXHRnZXRQb2ludERpcmVjdExpZ2h0SXJyYWRpYW5jZSggcG9pbnRMaWdodHNbIGkgXSwgZ2VvbWV0cnksIGRpcmVjdExpZ2h0ICk7XFxuXFx0XFx0ZG90TkwgPSBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICk7XFxuXFx0XFx0ZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlID0gUEkgKiBkaXJlY3RMaWdodC5jb2xvcjtcXG5cXHRcXHR2TGlnaHRGcm9udCArPSBzYXR1cmF0ZSggZG90TkwgKSAqIGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZTtcXG5cXHRcXHQjaWZkZWYgRE9VQkxFX1NJREVEXFxuXFx0XFx0XFx0dkxpZ2h0QmFjayArPSBzYXR1cmF0ZSggLWRvdE5MICkgKiBkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2U7XFxuXFx0XFx0I2VuZGlmXFxuXFx0fVxcbiNlbmRpZlxcbiNpZiBOVU1fU1BPVF9MSUdIVFMgPiAwXFxuXFx0I3ByYWdtYSB1bnJvbGxfbG9vcFxcblxcdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9TUE9UX0xJR0hUUzsgaSArKyApIHtcXG5cXHRcXHRnZXRTcG90RGlyZWN0TGlnaHRJcnJhZGlhbmNlKCBzcG90TGlnaHRzWyBpIF0sIGdlb21ldHJ5LCBkaXJlY3RMaWdodCApO1xcblxcdFxcdGRvdE5MID0gZG90KCBnZW9tZXRyeS5ub3JtYWwsIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiApO1xcblxcdFxcdGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZSA9IFBJICogZGlyZWN0TGlnaHQuY29sb3I7XFxuXFx0XFx0dkxpZ2h0RnJvbnQgKz0gc2F0dXJhdGUoIGRvdE5MICkgKiBkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2U7XFxuXFx0XFx0I2lmZGVmIERPVUJMRV9TSURFRFxcblxcdFxcdFxcdHZMaWdodEJhY2sgKz0gc2F0dXJhdGUoIC1kb3ROTCApICogZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlO1xcblxcdFxcdCNlbmRpZlxcblxcdH1cXG4jZW5kaWZcXG4jaWYgTlVNX0RJUl9MSUdIVFMgPiAwXFxuXFx0I3ByYWdtYSB1bnJvbGxfbG9vcFxcblxcdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9ESVJfTElHSFRTOyBpICsrICkge1xcblxcdFxcdGdldERpcmVjdGlvbmFsRGlyZWN0TGlnaHRJcnJhZGlhbmNlKCBkaXJlY3Rpb25hbExpZ2h0c1sgaSBdLCBnZW9tZXRyeSwgZGlyZWN0TGlnaHQgKTtcXG5cXHRcXHRkb3ROTCA9IGRvdCggZ2VvbWV0cnkubm9ybWFsLCBkaXJlY3RMaWdodC5kaXJlY3Rpb24gKTtcXG5cXHRcXHRkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2UgPSBQSSAqIGRpcmVjdExpZ2h0LmNvbG9yO1xcblxcdFxcdHZMaWdodEZyb250ICs9IHNhdHVyYXRlKCBkb3ROTCApICogZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlO1xcblxcdFxcdCNpZmRlZiBET1VCTEVfU0lERURcXG5cXHRcXHRcXHR2TGlnaHRCYWNrICs9IHNhdHVyYXRlKCAtZG90TkwgKSAqIGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZTtcXG5cXHRcXHQjZW5kaWZcXG5cXHR9XFxuI2VuZGlmXFxuI2lmIE5VTV9IRU1JX0xJR0hUUyA+IDBcXG5cXHQjcHJhZ21hIHVucm9sbF9sb29wXFxuXFx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX0hFTUlfTElHSFRTOyBpICsrICkge1xcblxcdFxcdHZMaWdodEZyb250ICs9IGdldEhlbWlzcGhlcmVMaWdodElycmFkaWFuY2UoIGhlbWlzcGhlcmVMaWdodHNbIGkgXSwgZ2VvbWV0cnkgKTtcXG5cXHRcXHQjaWZkZWYgRE9VQkxFX1NJREVEXFxuXFx0XFx0XFx0dkxpZ2h0QmFjayArPSBnZXRIZW1pc3BoZXJlTGlnaHRJcnJhZGlhbmNlKCBoZW1pc3BoZXJlTGlnaHRzWyBpIF0sIGJhY2tHZW9tZXRyeSApO1xcblxcdFxcdCNlbmRpZlxcblxcdH1cXG4jZW5kaWZcXG5cIjtcblxudmFyIGxpZ2h0c19wYXJzX2JlZ2luID0gXCJ1bmlmb3JtIHZlYzMgYW1iaWVudExpZ2h0Q29sb3I7XFxudmVjMyBnZXRBbWJpZW50TGlnaHRJcnJhZGlhbmNlKCBjb25zdCBpbiB2ZWMzIGFtYmllbnRMaWdodENvbG9yICkge1xcblxcdHZlYzMgaXJyYWRpYW5jZSA9IGFtYmllbnRMaWdodENvbG9yO1xcblxcdCNpZm5kZWYgUEhZU0lDQUxMWV9DT1JSRUNUX0xJR0hUU1xcblxcdFxcdGlycmFkaWFuY2UgKj0gUEk7XFxuXFx0I2VuZGlmXFxuXFx0cmV0dXJuIGlycmFkaWFuY2U7XFxufVxcbiNpZiBOVU1fRElSX0xJR0hUUyA+IDBcXG5cXHRzdHJ1Y3QgRGlyZWN0aW9uYWxMaWdodCB7XFxuXFx0XFx0dmVjMyBkaXJlY3Rpb247XFxuXFx0XFx0dmVjMyBjb2xvcjtcXG5cXHRcXHRpbnQgc2hhZG93O1xcblxcdFxcdGZsb2F0IHNoYWRvd0JpYXM7XFxuXFx0XFx0ZmxvYXQgc2hhZG93UmFkaXVzO1xcblxcdFxcdHZlYzIgc2hhZG93TWFwU2l6ZTtcXG5cXHR9O1xcblxcdHVuaWZvcm0gRGlyZWN0aW9uYWxMaWdodCBkaXJlY3Rpb25hbExpZ2h0c1sgTlVNX0RJUl9MSUdIVFMgXTtcXG5cXHR2b2lkIGdldERpcmVjdGlvbmFsRGlyZWN0TGlnaHRJcnJhZGlhbmNlKCBjb25zdCBpbiBEaXJlY3Rpb25hbExpZ2h0IGRpcmVjdGlvbmFsTGlnaHQsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIG91dCBJbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0ICkge1xcblxcdFxcdGRpcmVjdExpZ2h0LmNvbG9yID0gZGlyZWN0aW9uYWxMaWdodC5jb2xvcjtcXG5cXHRcXHRkaXJlY3RMaWdodC5kaXJlY3Rpb24gPSBkaXJlY3Rpb25hbExpZ2h0LmRpcmVjdGlvbjtcXG5cXHRcXHRkaXJlY3RMaWdodC52aXNpYmxlID0gdHJ1ZTtcXG5cXHR9XFxuI2VuZGlmXFxuI2lmIE5VTV9QT0lOVF9MSUdIVFMgPiAwXFxuXFx0c3RydWN0IFBvaW50TGlnaHQge1xcblxcdFxcdHZlYzMgcG9zaXRpb247XFxuXFx0XFx0dmVjMyBjb2xvcjtcXG5cXHRcXHRmbG9hdCBkaXN0YW5jZTtcXG5cXHRcXHRmbG9hdCBkZWNheTtcXG5cXHRcXHRpbnQgc2hhZG93O1xcblxcdFxcdGZsb2F0IHNoYWRvd0JpYXM7XFxuXFx0XFx0ZmxvYXQgc2hhZG93UmFkaXVzO1xcblxcdFxcdHZlYzIgc2hhZG93TWFwU2l6ZTtcXG5cXHRcXHRmbG9hdCBzaGFkb3dDYW1lcmFOZWFyO1xcblxcdFxcdGZsb2F0IHNoYWRvd0NhbWVyYUZhcjtcXG5cXHR9O1xcblxcdHVuaWZvcm0gUG9pbnRMaWdodCBwb2ludExpZ2h0c1sgTlVNX1BPSU5UX0xJR0hUUyBdO1xcblxcdHZvaWQgZ2V0UG9pbnREaXJlY3RMaWdodElycmFkaWFuY2UoIGNvbnN0IGluIFBvaW50TGlnaHQgcG9pbnRMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgb3V0IEluY2lkZW50TGlnaHQgZGlyZWN0TGlnaHQgKSB7XFxuXFx0XFx0dmVjMyBsVmVjdG9yID0gcG9pbnRMaWdodC5wb3NpdGlvbiAtIGdlb21ldHJ5LnBvc2l0aW9uO1xcblxcdFxcdGRpcmVjdExpZ2h0LmRpcmVjdGlvbiA9IG5vcm1hbGl6ZSggbFZlY3RvciApO1xcblxcdFxcdGZsb2F0IGxpZ2h0RGlzdGFuY2UgPSBsZW5ndGgoIGxWZWN0b3IgKTtcXG5cXHRcXHRkaXJlY3RMaWdodC5jb2xvciA9IHBvaW50TGlnaHQuY29sb3I7XFxuXFx0XFx0ZGlyZWN0TGlnaHQuY29sb3IgKj0gcHVuY3R1YWxMaWdodEludGVuc2l0eVRvSXJyYWRpYW5jZUZhY3RvciggbGlnaHREaXN0YW5jZSwgcG9pbnRMaWdodC5kaXN0YW5jZSwgcG9pbnRMaWdodC5kZWNheSApO1xcblxcdFxcdGRpcmVjdExpZ2h0LnZpc2libGUgPSAoIGRpcmVjdExpZ2h0LmNvbG9yICE9IHZlYzMoIDAuMCApICk7XFxuXFx0fVxcbiNlbmRpZlxcbiNpZiBOVU1fU1BPVF9MSUdIVFMgPiAwXFxuXFx0c3RydWN0IFNwb3RMaWdodCB7XFxuXFx0XFx0dmVjMyBwb3NpdGlvbjtcXG5cXHRcXHR2ZWMzIGRpcmVjdGlvbjtcXG5cXHRcXHR2ZWMzIGNvbG9yO1xcblxcdFxcdGZsb2F0IGRpc3RhbmNlO1xcblxcdFxcdGZsb2F0IGRlY2F5O1xcblxcdFxcdGZsb2F0IGNvbmVDb3M7XFxuXFx0XFx0ZmxvYXQgcGVudW1icmFDb3M7XFxuXFx0XFx0aW50IHNoYWRvdztcXG5cXHRcXHRmbG9hdCBzaGFkb3dCaWFzO1xcblxcdFxcdGZsb2F0IHNoYWRvd1JhZGl1cztcXG5cXHRcXHR2ZWMyIHNoYWRvd01hcFNpemU7XFxuXFx0fTtcXG5cXHR1bmlmb3JtIFNwb3RMaWdodCBzcG90TGlnaHRzWyBOVU1fU1BPVF9MSUdIVFMgXTtcXG5cXHR2b2lkIGdldFNwb3REaXJlY3RMaWdodElycmFkaWFuY2UoIGNvbnN0IGluIFNwb3RMaWdodCBzcG90TGlnaHQsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIG91dCBJbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0ICApIHtcXG5cXHRcXHR2ZWMzIGxWZWN0b3IgPSBzcG90TGlnaHQucG9zaXRpb24gLSBnZW9tZXRyeS5wb3NpdGlvbjtcXG5cXHRcXHRkaXJlY3RMaWdodC5kaXJlY3Rpb24gPSBub3JtYWxpemUoIGxWZWN0b3IgKTtcXG5cXHRcXHRmbG9hdCBsaWdodERpc3RhbmNlID0gbGVuZ3RoKCBsVmVjdG9yICk7XFxuXFx0XFx0ZmxvYXQgYW5nbGVDb3MgPSBkb3QoIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiwgc3BvdExpZ2h0LmRpcmVjdGlvbiApO1xcblxcdFxcdGlmICggYW5nbGVDb3MgPiBzcG90TGlnaHQuY29uZUNvcyApIHtcXG5cXHRcXHRcXHRmbG9hdCBzcG90RWZmZWN0ID0gc21vb3Roc3RlcCggc3BvdExpZ2h0LmNvbmVDb3MsIHNwb3RMaWdodC5wZW51bWJyYUNvcywgYW5nbGVDb3MgKTtcXG5cXHRcXHRcXHRkaXJlY3RMaWdodC5jb2xvciA9IHNwb3RMaWdodC5jb2xvcjtcXG5cXHRcXHRcXHRkaXJlY3RMaWdodC5jb2xvciAqPSBzcG90RWZmZWN0ICogcHVuY3R1YWxMaWdodEludGVuc2l0eVRvSXJyYWRpYW5jZUZhY3RvciggbGlnaHREaXN0YW5jZSwgc3BvdExpZ2h0LmRpc3RhbmNlLCBzcG90TGlnaHQuZGVjYXkgKTtcXG5cXHRcXHRcXHRkaXJlY3RMaWdodC52aXNpYmxlID0gdHJ1ZTtcXG5cXHRcXHR9IGVsc2Uge1xcblxcdFxcdFxcdGRpcmVjdExpZ2h0LmNvbG9yID0gdmVjMyggMC4wICk7XFxuXFx0XFx0XFx0ZGlyZWN0TGlnaHQudmlzaWJsZSA9IGZhbHNlO1xcblxcdFxcdH1cXG5cXHR9XFxuI2VuZGlmXFxuI2lmIE5VTV9SRUNUX0FSRUFfTElHSFRTID4gMFxcblxcdHN0cnVjdCBSZWN0QXJlYUxpZ2h0IHtcXG5cXHRcXHR2ZWMzIGNvbG9yO1xcblxcdFxcdHZlYzMgcG9zaXRpb247XFxuXFx0XFx0dmVjMyBoYWxmV2lkdGg7XFxuXFx0XFx0dmVjMyBoYWxmSGVpZ2h0O1xcblxcdH07XFxuXFx0dW5pZm9ybSBzYW1wbGVyMkQgbHRjXzE7XFx0dW5pZm9ybSBzYW1wbGVyMkQgbHRjXzI7XFxuXFx0dW5pZm9ybSBSZWN0QXJlYUxpZ2h0IHJlY3RBcmVhTGlnaHRzWyBOVU1fUkVDVF9BUkVBX0xJR0hUUyBdO1xcbiNlbmRpZlxcbiNpZiBOVU1fSEVNSV9MSUdIVFMgPiAwXFxuXFx0c3RydWN0IEhlbWlzcGhlcmVMaWdodCB7XFxuXFx0XFx0dmVjMyBkaXJlY3Rpb247XFxuXFx0XFx0dmVjMyBza3lDb2xvcjtcXG5cXHRcXHR2ZWMzIGdyb3VuZENvbG9yO1xcblxcdH07XFxuXFx0dW5pZm9ybSBIZW1pc3BoZXJlTGlnaHQgaGVtaXNwaGVyZUxpZ2h0c1sgTlVNX0hFTUlfTElHSFRTIF07XFxuXFx0dmVjMyBnZXRIZW1pc3BoZXJlTGlnaHRJcnJhZGlhbmNlKCBjb25zdCBpbiBIZW1pc3BoZXJlTGlnaHQgaGVtaUxpZ2h0LCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5ICkge1xcblxcdFxcdGZsb2F0IGRvdE5MID0gZG90KCBnZW9tZXRyeS5ub3JtYWwsIGhlbWlMaWdodC5kaXJlY3Rpb24gKTtcXG5cXHRcXHRmbG9hdCBoZW1pRGlmZnVzZVdlaWdodCA9IDAuNSAqIGRvdE5MICsgMC41O1xcblxcdFxcdHZlYzMgaXJyYWRpYW5jZSA9IG1peCggaGVtaUxpZ2h0Lmdyb3VuZENvbG9yLCBoZW1pTGlnaHQuc2t5Q29sb3IsIGhlbWlEaWZmdXNlV2VpZ2h0ICk7XFxuXFx0XFx0I2lmbmRlZiBQSFlTSUNBTExZX0NPUlJFQ1RfTElHSFRTXFxuXFx0XFx0XFx0aXJyYWRpYW5jZSAqPSBQSTtcXG5cXHRcXHQjZW5kaWZcXG5cXHRcXHRyZXR1cm4gaXJyYWRpYW5jZTtcXG5cXHR9XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBsaWdodHNfcGFyc19tYXBzID0gXCIjaWYgZGVmaW5lZCggVVNFX0VOVk1BUCApICYmIGRlZmluZWQoIFBIWVNJQ0FMIClcXG5cXHR2ZWMzIGdldExpZ2h0UHJvYmVJbmRpcmVjdElycmFkaWFuY2UoIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIGludCBtYXhNSVBMZXZlbCApIHtcXG5cXHRcXHR2ZWMzIHdvcmxkTm9ybWFsID0gaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggZ2VvbWV0cnkubm9ybWFsLCB2aWV3TWF0cml4ICk7XFxuXFx0XFx0I2lmZGVmIEVOVk1BUF9UWVBFX0NVQkVcXG5cXHRcXHRcXHR2ZWMzIHF1ZXJ5VmVjID0gdmVjMyggZmxpcEVudk1hcCAqIHdvcmxkTm9ybWFsLngsIHdvcmxkTm9ybWFsLnl6ICk7XFxuXFx0XFx0XFx0I2lmZGVmIFRFWFRVUkVfTE9EX0VYVFxcblxcdFxcdFxcdFxcdHZlYzQgZW52TWFwQ29sb3IgPSB0ZXh0dXJlQ3ViZUxvZEVYVCggZW52TWFwLCBxdWVyeVZlYywgZmxvYXQoIG1heE1JUExldmVsICkgKTtcXG5cXHRcXHRcXHQjZWxzZVxcblxcdFxcdFxcdFxcdHZlYzQgZW52TWFwQ29sb3IgPSB0ZXh0dXJlQ3ViZSggZW52TWFwLCBxdWVyeVZlYywgZmxvYXQoIG1heE1JUExldmVsICkgKTtcXG5cXHRcXHRcXHQjZW5kaWZcXG5cXHRcXHRcXHRlbnZNYXBDb2xvci5yZ2IgPSBlbnZNYXBUZXhlbFRvTGluZWFyKCBlbnZNYXBDb2xvciApLnJnYjtcXG5cXHRcXHQjZWxpZiBkZWZpbmVkKCBFTlZNQVBfVFlQRV9DVUJFX1VWIClcXG5cXHRcXHRcXHR2ZWMzIHF1ZXJ5VmVjID0gdmVjMyggZmxpcEVudk1hcCAqIHdvcmxkTm9ybWFsLngsIHdvcmxkTm9ybWFsLnl6ICk7XFxuXFx0XFx0XFx0dmVjNCBlbnZNYXBDb2xvciA9IHRleHR1cmVDdWJlVVYoIHF1ZXJ5VmVjLCAxLjAgKTtcXG5cXHRcXHQjZWxzZVxcblxcdFxcdFxcdHZlYzQgZW52TWFwQ29sb3IgPSB2ZWM0KCAwLjAgKTtcXG5cXHRcXHQjZW5kaWZcXG5cXHRcXHRyZXR1cm4gUEkgKiBlbnZNYXBDb2xvci5yZ2IgKiBlbnZNYXBJbnRlbnNpdHk7XFxuXFx0fVxcblxcdGZsb2F0IGdldFNwZWN1bGFyTUlQTGV2ZWwoIGNvbnN0IGluIGZsb2F0IGJsaW5uU2hpbmluZXNzRXhwb25lbnQsIGNvbnN0IGluIGludCBtYXhNSVBMZXZlbCApIHtcXG5cXHRcXHRmbG9hdCBtYXhNSVBMZXZlbFNjYWxhciA9IGZsb2F0KCBtYXhNSVBMZXZlbCApO1xcblxcdFxcdGZsb2F0IGRlc2lyZWRNSVBMZXZlbCA9IG1heE1JUExldmVsU2NhbGFyICsgMC43OTI0OCAtIDAuNSAqIGxvZzIoIHBvdzIoIGJsaW5uU2hpbmluZXNzRXhwb25lbnQgKSArIDEuMCApO1xcblxcdFxcdHJldHVybiBjbGFtcCggZGVzaXJlZE1JUExldmVsLCAwLjAsIG1heE1JUExldmVsU2NhbGFyICk7XFxuXFx0fVxcblxcdHZlYzMgZ2V0TGlnaHRQcm9iZUluZGlyZWN0UmFkaWFuY2UoIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIGZsb2F0IGJsaW5uU2hpbmluZXNzRXhwb25lbnQsIGNvbnN0IGluIGludCBtYXhNSVBMZXZlbCApIHtcXG5cXHRcXHQjaWZkZWYgRU5WTUFQX01PREVfUkVGTEVDVElPTlxcblxcdFxcdFxcdHZlYzMgcmVmbGVjdFZlYyA9IHJlZmxlY3QoIC1nZW9tZXRyeS52aWV3RGlyLCBnZW9tZXRyeS5ub3JtYWwgKTtcXG5cXHRcXHQjZWxzZVxcblxcdFxcdFxcdHZlYzMgcmVmbGVjdFZlYyA9IHJlZnJhY3QoIC1nZW9tZXRyeS52aWV3RGlyLCBnZW9tZXRyeS5ub3JtYWwsIHJlZnJhY3Rpb25SYXRpbyApO1xcblxcdFxcdCNlbmRpZlxcblxcdFxcdHJlZmxlY3RWZWMgPSBpbnZlcnNlVHJhbnNmb3JtRGlyZWN0aW9uKCByZWZsZWN0VmVjLCB2aWV3TWF0cml4ICk7XFxuXFx0XFx0ZmxvYXQgc3BlY3VsYXJNSVBMZXZlbCA9IGdldFNwZWN1bGFyTUlQTGV2ZWwoIGJsaW5uU2hpbmluZXNzRXhwb25lbnQsIG1heE1JUExldmVsICk7XFxuXFx0XFx0I2lmZGVmIEVOVk1BUF9UWVBFX0NVQkVcXG5cXHRcXHRcXHR2ZWMzIHF1ZXJ5UmVmbGVjdFZlYyA9IHZlYzMoIGZsaXBFbnZNYXAgKiByZWZsZWN0VmVjLngsIHJlZmxlY3RWZWMueXogKTtcXG5cXHRcXHRcXHQjaWZkZWYgVEVYVFVSRV9MT0RfRVhUXFxuXFx0XFx0XFx0XFx0dmVjNCBlbnZNYXBDb2xvciA9IHRleHR1cmVDdWJlTG9kRVhUKCBlbnZNYXAsIHF1ZXJ5UmVmbGVjdFZlYywgc3BlY3VsYXJNSVBMZXZlbCApO1xcblxcdFxcdFxcdCNlbHNlXFxuXFx0XFx0XFx0XFx0dmVjNCBlbnZNYXBDb2xvciA9IHRleHR1cmVDdWJlKCBlbnZNYXAsIHF1ZXJ5UmVmbGVjdFZlYywgc3BlY3VsYXJNSVBMZXZlbCApO1xcblxcdFxcdFxcdCNlbmRpZlxcblxcdFxcdFxcdGVudk1hcENvbG9yLnJnYiA9IGVudk1hcFRleGVsVG9MaW5lYXIoIGVudk1hcENvbG9yICkucmdiO1xcblxcdFxcdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9UWVBFX0NVQkVfVVYgKVxcblxcdFxcdFxcdHZlYzMgcXVlcnlSZWZsZWN0VmVjID0gdmVjMyggZmxpcEVudk1hcCAqIHJlZmxlY3RWZWMueCwgcmVmbGVjdFZlYy55eiApO1xcblxcdFxcdFxcdHZlYzQgZW52TWFwQ29sb3IgPSB0ZXh0dXJlQ3ViZVVWKHF1ZXJ5UmVmbGVjdFZlYywgQmxpbm5FeHBvbmVudFRvR0dYUm91Z2huZXNzKGJsaW5uU2hpbmluZXNzRXhwb25lbnQpKTtcXG5cXHRcXHQjZWxpZiBkZWZpbmVkKCBFTlZNQVBfVFlQRV9FUVVJUkVDIClcXG5cXHRcXHRcXHR2ZWMyIHNhbXBsZVVWO1xcblxcdFxcdFxcdHNhbXBsZVVWLnkgPSBhc2luKCBjbGFtcCggcmVmbGVjdFZlYy55LCAtIDEuMCwgMS4wICkgKSAqIFJFQ0lQUk9DQUxfUEkgKyAwLjU7XFxuXFx0XFx0XFx0c2FtcGxlVVYueCA9IGF0YW4oIHJlZmxlY3RWZWMueiwgcmVmbGVjdFZlYy54ICkgKiBSRUNJUFJPQ0FMX1BJMiArIDAuNTtcXG5cXHRcXHRcXHQjaWZkZWYgVEVYVFVSRV9MT0RfRVhUXFxuXFx0XFx0XFx0XFx0dmVjNCBlbnZNYXBDb2xvciA9IHRleHR1cmUyRExvZEVYVCggZW52TWFwLCBzYW1wbGVVViwgc3BlY3VsYXJNSVBMZXZlbCApO1xcblxcdFxcdFxcdCNlbHNlXFxuXFx0XFx0XFx0XFx0dmVjNCBlbnZNYXBDb2xvciA9IHRleHR1cmUyRCggZW52TWFwLCBzYW1wbGVVViwgc3BlY3VsYXJNSVBMZXZlbCApO1xcblxcdFxcdFxcdCNlbmRpZlxcblxcdFxcdFxcdGVudk1hcENvbG9yLnJnYiA9IGVudk1hcFRleGVsVG9MaW5lYXIoIGVudk1hcENvbG9yICkucmdiO1xcblxcdFxcdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9UWVBFX1NQSEVSRSApXFxuXFx0XFx0XFx0dmVjMyByZWZsZWN0VmlldyA9IG5vcm1hbGl6ZSggKCB2aWV3TWF0cml4ICogdmVjNCggcmVmbGVjdFZlYywgMC4wICkgKS54eXogKyB2ZWMzKCAwLjAsMC4wLDEuMCApICk7XFxuXFx0XFx0XFx0I2lmZGVmIFRFWFRVUkVfTE9EX0VYVFxcblxcdFxcdFxcdFxcdHZlYzQgZW52TWFwQ29sb3IgPSB0ZXh0dXJlMkRMb2RFWFQoIGVudk1hcCwgcmVmbGVjdFZpZXcueHkgKiAwLjUgKyAwLjUsIHNwZWN1bGFyTUlQTGV2ZWwgKTtcXG5cXHRcXHRcXHQjZWxzZVxcblxcdFxcdFxcdFxcdHZlYzQgZW52TWFwQ29sb3IgPSB0ZXh0dXJlMkQoIGVudk1hcCwgcmVmbGVjdFZpZXcueHkgKiAwLjUgKyAwLjUsIHNwZWN1bGFyTUlQTGV2ZWwgKTtcXG5cXHRcXHRcXHQjZW5kaWZcXG5cXHRcXHRcXHRlbnZNYXBDb2xvci5yZ2IgPSBlbnZNYXBUZXhlbFRvTGluZWFyKCBlbnZNYXBDb2xvciApLnJnYjtcXG5cXHRcXHQjZW5kaWZcXG5cXHRcXHRyZXR1cm4gZW52TWFwQ29sb3IucmdiICogZW52TWFwSW50ZW5zaXR5O1xcblxcdH1cXG4jZW5kaWZcXG5cIjtcblxudmFyIGxpZ2h0c19waG9uZ19mcmFnbWVudCA9IFwiQmxpbm5QaG9uZ01hdGVyaWFsIG1hdGVyaWFsO1xcbm1hdGVyaWFsLmRpZmZ1c2VDb2xvciA9IGRpZmZ1c2VDb2xvci5yZ2I7XFxubWF0ZXJpYWwuc3BlY3VsYXJDb2xvciA9IHNwZWN1bGFyO1xcbm1hdGVyaWFsLnNwZWN1bGFyU2hpbmluZXNzID0gc2hpbmluZXNzO1xcbm1hdGVyaWFsLnNwZWN1bGFyU3RyZW5ndGggPSBzcGVjdWxhclN0cmVuZ3RoO1xcblwiO1xuXG52YXIgbGlnaHRzX3Bob25nX3BhcnNfZnJhZ21lbnQgPSBcInZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xcbiNpZm5kZWYgRkxBVF9TSEFERURcXG5cXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcXG4jZW5kaWZcXG5zdHJ1Y3QgQmxpbm5QaG9uZ01hdGVyaWFsIHtcXG5cXHR2ZWMzXFx0ZGlmZnVzZUNvbG9yO1xcblxcdHZlYzNcXHRzcGVjdWxhckNvbG9yO1xcblxcdGZsb2F0XFx0c3BlY3VsYXJTaGluaW5lc3M7XFxuXFx0ZmxvYXRcXHRzcGVjdWxhclN0cmVuZ3RoO1xcbn07XFxudm9pZCBSRV9EaXJlY3RfQmxpbm5QaG9uZyggY29uc3QgaW4gSW5jaWRlbnRMaWdodCBkaXJlY3RMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gQmxpbm5QaG9uZ01hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHtcXG5cXHQjaWZkZWYgVE9PTlxcblxcdFxcdHZlYzMgaXJyYWRpYW5jZSA9IGdldEdyYWRpZW50SXJyYWRpYW5jZSggZ2VvbWV0cnkubm9ybWFsLCBkaXJlY3RMaWdodC5kaXJlY3Rpb24gKSAqIGRpcmVjdExpZ2h0LmNvbG9yO1xcblxcdCNlbHNlXFxuXFx0XFx0ZmxvYXQgZG90TkwgPSBzYXR1cmF0ZSggZG90KCBnZW9tZXRyeS5ub3JtYWwsIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiApICk7XFxuXFx0XFx0dmVjMyBpcnJhZGlhbmNlID0gZG90TkwgKiBkaXJlY3RMaWdodC5jb2xvcjtcXG5cXHQjZW5kaWZcXG5cXHQjaWZuZGVmIFBIWVNJQ0FMTFlfQ09SUkVDVF9MSUdIVFNcXG5cXHRcXHRpcnJhZGlhbmNlICo9IFBJO1xcblxcdCNlbmRpZlxcblxcdHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKz0gaXJyYWRpYW5jZSAqIEJSREZfRGlmZnVzZV9MYW1iZXJ0KCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKTtcXG5cXHRyZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArPSBpcnJhZGlhbmNlICogQlJERl9TcGVjdWxhcl9CbGlublBob25nKCBkaXJlY3RMaWdodCwgZ2VvbWV0cnksIG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IsIG1hdGVyaWFsLnNwZWN1bGFyU2hpbmluZXNzICkgKiBtYXRlcmlhbC5zcGVjdWxhclN0cmVuZ3RoO1xcbn1cXG52b2lkIFJFX0luZGlyZWN0RGlmZnVzZV9CbGlublBob25nKCBjb25zdCBpbiB2ZWMzIGlycmFkaWFuY2UsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIEJsaW5uUGhvbmdNYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7XFxuXFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICs9IGlycmFkaWFuY2UgKiBCUkRGX0RpZmZ1c2VfTGFtYmVydCggbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICk7XFxufVxcbiNkZWZpbmUgUkVfRGlyZWN0XFx0XFx0XFx0XFx0UkVfRGlyZWN0X0JsaW5uUGhvbmdcXG4jZGVmaW5lIFJFX0luZGlyZWN0RGlmZnVzZVxcdFxcdFJFX0luZGlyZWN0RGlmZnVzZV9CbGlublBob25nXFxuI2RlZmluZSBNYXRlcmlhbF9MaWdodFByb2JlTE9EKCBtYXRlcmlhbCApXFx0KDApXFxuXCI7XG5cbnZhciBsaWdodHNfcGh5c2ljYWxfZnJhZ21lbnQgPSBcIlBoeXNpY2FsTWF0ZXJpYWwgbWF0ZXJpYWw7XFxubWF0ZXJpYWwuZGlmZnVzZUNvbG9yID0gZGlmZnVzZUNvbG9yLnJnYiAqICggMS4wIC0gbWV0YWxuZXNzRmFjdG9yICk7XFxubWF0ZXJpYWwuc3BlY3VsYXJSb3VnaG5lc3MgPSBjbGFtcCggcm91Z2huZXNzRmFjdG9yLCAwLjA0LCAxLjAgKTtcXG4jaWZkZWYgU1RBTkRBUkRcXG5cXHRtYXRlcmlhbC5zcGVjdWxhckNvbG9yID0gbWl4KCB2ZWMzKCBERUZBVUxUX1NQRUNVTEFSX0NPRUZGSUNJRU5UICksIGRpZmZ1c2VDb2xvci5yZ2IsIG1ldGFsbmVzc0ZhY3RvciApO1xcbiNlbHNlXFxuXFx0bWF0ZXJpYWwuc3BlY3VsYXJDb2xvciA9IG1peCggdmVjMyggTUFYSU1VTV9TUEVDVUxBUl9DT0VGRklDSUVOVCAqIHBvdzIoIHJlZmxlY3Rpdml0eSApICksIGRpZmZ1c2VDb2xvci5yZ2IsIG1ldGFsbmVzc0ZhY3RvciApO1xcblxcdG1hdGVyaWFsLmNsZWFyQ29hdCA9IHNhdHVyYXRlKCBjbGVhckNvYXQgKTtcXHRtYXRlcmlhbC5jbGVhckNvYXRSb3VnaG5lc3MgPSBjbGFtcCggY2xlYXJDb2F0Um91Z2huZXNzLCAwLjA0LCAxLjAgKTtcXG4jZW5kaWZcXG5cIjtcblxudmFyIGxpZ2h0c19waHlzaWNhbF9wYXJzX2ZyYWdtZW50ID0gXCJzdHJ1Y3QgUGh5c2ljYWxNYXRlcmlhbCB7XFxuXFx0dmVjM1xcdGRpZmZ1c2VDb2xvcjtcXG5cXHRmbG9hdFxcdHNwZWN1bGFyUm91Z2huZXNzO1xcblxcdHZlYzNcXHRzcGVjdWxhckNvbG9yO1xcblxcdCNpZm5kZWYgU1RBTkRBUkRcXG5cXHRcXHRmbG9hdCBjbGVhckNvYXQ7XFxuXFx0XFx0ZmxvYXQgY2xlYXJDb2F0Um91Z2huZXNzO1xcblxcdCNlbmRpZlxcbn07XFxuI2RlZmluZSBNQVhJTVVNX1NQRUNVTEFSX0NPRUZGSUNJRU5UIDAuMTZcXG4jZGVmaW5lIERFRkFVTFRfU1BFQ1VMQVJfQ09FRkZJQ0lFTlQgMC4wNFxcbmZsb2F0IGNsZWFyQ29hdERIUkFwcHJveCggY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzLCBjb25zdCBpbiBmbG9hdCBkb3ROTCApIHtcXG5cXHRyZXR1cm4gREVGQVVMVF9TUEVDVUxBUl9DT0VGRklDSUVOVCArICggMS4wIC0gREVGQVVMVF9TUEVDVUxBUl9DT0VGRklDSUVOVCApICogKCBwb3coIDEuMCAtIGRvdE5MLCA1LjAgKSAqIHBvdyggMS4wIC0gcm91Z2huZXNzLCAyLjAgKSApO1xcbn1cXG4jaWYgTlVNX1JFQ1RfQVJFQV9MSUdIVFMgPiAwXFxuXFx0dm9pZCBSRV9EaXJlY3RfUmVjdEFyZWFfUGh5c2ljYWwoIGNvbnN0IGluIFJlY3RBcmVhTGlnaHQgcmVjdEFyZWFMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gUGh5c2ljYWxNYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7XFxuXFx0XFx0dmVjMyBub3JtYWwgPSBnZW9tZXRyeS5ub3JtYWw7XFxuXFx0XFx0dmVjMyB2aWV3RGlyID0gZ2VvbWV0cnkudmlld0RpcjtcXG5cXHRcXHR2ZWMzIHBvc2l0aW9uID0gZ2VvbWV0cnkucG9zaXRpb247XFxuXFx0XFx0dmVjMyBsaWdodFBvcyA9IHJlY3RBcmVhTGlnaHQucG9zaXRpb247XFxuXFx0XFx0dmVjMyBoYWxmV2lkdGggPSByZWN0QXJlYUxpZ2h0LmhhbGZXaWR0aDtcXG5cXHRcXHR2ZWMzIGhhbGZIZWlnaHQgPSByZWN0QXJlYUxpZ2h0LmhhbGZIZWlnaHQ7XFxuXFx0XFx0dmVjMyBsaWdodENvbG9yID0gcmVjdEFyZWFMaWdodC5jb2xvcjtcXG5cXHRcXHRmbG9hdCByb3VnaG5lc3MgPSBtYXRlcmlhbC5zcGVjdWxhclJvdWdobmVzcztcXG5cXHRcXHR2ZWMzIHJlY3RDb29yZHNbIDQgXTtcXG5cXHRcXHRyZWN0Q29vcmRzWyAwIF0gPSBsaWdodFBvcyAtIGhhbGZXaWR0aCAtIGhhbGZIZWlnaHQ7XFx0XFx0cmVjdENvb3Jkc1sgMSBdID0gbGlnaHRQb3MgKyBoYWxmV2lkdGggLSBoYWxmSGVpZ2h0O1xcblxcdFxcdHJlY3RDb29yZHNbIDIgXSA9IGxpZ2h0UG9zICsgaGFsZldpZHRoICsgaGFsZkhlaWdodDtcXG5cXHRcXHRyZWN0Q29vcmRzWyAzIF0gPSBsaWdodFBvcyAtIGhhbGZXaWR0aCArIGhhbGZIZWlnaHQ7XFxuXFx0XFx0dmVjMiB1diA9IExUQ19Vdiggbm9ybWFsLCB2aWV3RGlyLCByb3VnaG5lc3MgKTtcXG5cXHRcXHR2ZWM0IHQxID0gdGV4dHVyZTJEKCBsdGNfMSwgdXYgKTtcXG5cXHRcXHR2ZWM0IHQyID0gdGV4dHVyZTJEKCBsdGNfMiwgdXYgKTtcXG5cXHRcXHRtYXQzIG1JbnYgPSBtYXQzKFxcblxcdFxcdFxcdHZlYzMoIHQxLngsIDAsIHQxLnkgKSxcXG5cXHRcXHRcXHR2ZWMzKCAgICAwLCAxLCAgICAwICksXFxuXFx0XFx0XFx0dmVjMyggdDEueiwgMCwgdDEudyApXFxuXFx0XFx0KTtcXG5cXHRcXHR2ZWMzIGZyZXNuZWwgPSAoIG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IgKiB0Mi54ICsgKCB2ZWMzKCAxLjAgKSAtIG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IgKSAqIHQyLnkgKTtcXG5cXHRcXHRyZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArPSBsaWdodENvbG9yICogZnJlc25lbCAqIExUQ19FdmFsdWF0ZSggbm9ybWFsLCB2aWV3RGlyLCBwb3NpdGlvbiwgbUludiwgcmVjdENvb3JkcyApO1xcblxcdFxcdHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKz0gbGlnaHRDb2xvciAqIG1hdGVyaWFsLmRpZmZ1c2VDb2xvciAqIExUQ19FdmFsdWF0ZSggbm9ybWFsLCB2aWV3RGlyLCBwb3NpdGlvbiwgbWF0MyggMS4wICksIHJlY3RDb29yZHMgKTtcXG5cXHR9XFxuI2VuZGlmXFxudm9pZCBSRV9EaXJlY3RfUGh5c2ljYWwoIGNvbnN0IGluIEluY2lkZW50TGlnaHQgZGlyZWN0TGlnaHQsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIFBoeXNpY2FsTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ICkge1xcblxcdGZsb2F0IGRvdE5MID0gc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBkaXJlY3RMaWdodC5kaXJlY3Rpb24gKSApO1xcblxcdHZlYzMgaXJyYWRpYW5jZSA9IGRvdE5MICogZGlyZWN0TGlnaHQuY29sb3I7XFxuXFx0I2lmbmRlZiBQSFlTSUNBTExZX0NPUlJFQ1RfTElHSFRTXFxuXFx0XFx0aXJyYWRpYW5jZSAqPSBQSTtcXG5cXHQjZW5kaWZcXG5cXHQjaWZuZGVmIFNUQU5EQVJEXFxuXFx0XFx0ZmxvYXQgY2xlYXJDb2F0REhSID0gbWF0ZXJpYWwuY2xlYXJDb2F0ICogY2xlYXJDb2F0REhSQXBwcm94KCBtYXRlcmlhbC5jbGVhckNvYXRSb3VnaG5lc3MsIGRvdE5MICk7XFxuXFx0I2Vsc2VcXG5cXHRcXHRmbG9hdCBjbGVhckNvYXRESFIgPSAwLjA7XFxuXFx0I2VuZGlmXFxuXFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgKz0gKCAxLjAgLSBjbGVhckNvYXRESFIgKSAqIGlycmFkaWFuY2UgKiBCUkRGX1NwZWN1bGFyX0dHWCggZGlyZWN0TGlnaHQsIGdlb21ldHJ5LCBtYXRlcmlhbC5zcGVjdWxhckNvbG9yLCBtYXRlcmlhbC5zcGVjdWxhclJvdWdobmVzcyApO1xcblxcdHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKz0gKCAxLjAgLSBjbGVhckNvYXRESFIgKSAqIGlycmFkaWFuY2UgKiBCUkRGX0RpZmZ1c2VfTGFtYmVydCggbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICk7XFxuXFx0I2lmbmRlZiBTVEFOREFSRFxcblxcdFxcdHJlZmxlY3RlZExpZ2h0LmRpcmVjdFNwZWN1bGFyICs9IGlycmFkaWFuY2UgKiBtYXRlcmlhbC5jbGVhckNvYXQgKiBCUkRGX1NwZWN1bGFyX0dHWCggZGlyZWN0TGlnaHQsIGdlb21ldHJ5LCB2ZWMzKCBERUZBVUxUX1NQRUNVTEFSX0NPRUZGSUNJRU5UICksIG1hdGVyaWFsLmNsZWFyQ29hdFJvdWdobmVzcyApO1xcblxcdCNlbmRpZlxcbn1cXG52b2lkIFJFX0luZGlyZWN0RGlmZnVzZV9QaHlzaWNhbCggY29uc3QgaW4gdmVjMyBpcnJhZGlhbmNlLCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiBQaHlzaWNhbE1hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHtcXG5cXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKz0gaXJyYWRpYW5jZSAqIEJSREZfRGlmZnVzZV9MYW1iZXJ0KCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKTtcXG59XFxudm9pZCBSRV9JbmRpcmVjdFNwZWN1bGFyX1BoeXNpY2FsKCBjb25zdCBpbiB2ZWMzIHJhZGlhbmNlLCBjb25zdCBpbiB2ZWMzIGNsZWFyQ29hdFJhZGlhbmNlLCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiBQaHlzaWNhbE1hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHtcXG5cXHQjaWZuZGVmIFNUQU5EQVJEXFxuXFx0XFx0ZmxvYXQgZG90TlYgPSBzYXR1cmF0ZSggZG90KCBnZW9tZXRyeS5ub3JtYWwsIGdlb21ldHJ5LnZpZXdEaXIgKSApO1xcblxcdFxcdGZsb2F0IGRvdE5MID0gZG90TlY7XFxuXFx0XFx0ZmxvYXQgY2xlYXJDb2F0REhSID0gbWF0ZXJpYWwuY2xlYXJDb2F0ICogY2xlYXJDb2F0REhSQXBwcm94KCBtYXRlcmlhbC5jbGVhckNvYXRSb3VnaG5lc3MsIGRvdE5MICk7XFxuXFx0I2Vsc2VcXG5cXHRcXHRmbG9hdCBjbGVhckNvYXRESFIgPSAwLjA7XFxuXFx0I2VuZGlmXFxuXFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3RTcGVjdWxhciArPSAoIDEuMCAtIGNsZWFyQ29hdERIUiApICogcmFkaWFuY2UgKiBCUkRGX1NwZWN1bGFyX0dHWF9FbnZpcm9ubWVudCggZ2VvbWV0cnksIG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IsIG1hdGVyaWFsLnNwZWN1bGFyUm91Z2huZXNzICk7XFxuXFx0I2lmbmRlZiBTVEFOREFSRFxcblxcdFxcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0U3BlY3VsYXIgKz0gY2xlYXJDb2F0UmFkaWFuY2UgKiBtYXRlcmlhbC5jbGVhckNvYXQgKiBCUkRGX1NwZWN1bGFyX0dHWF9FbnZpcm9ubWVudCggZ2VvbWV0cnksIHZlYzMoIERFRkFVTFRfU1BFQ1VMQVJfQ09FRkZJQ0lFTlQgKSwgbWF0ZXJpYWwuY2xlYXJDb2F0Um91Z2huZXNzICk7XFxuXFx0I2VuZGlmXFxufVxcbiNkZWZpbmUgUkVfRGlyZWN0XFx0XFx0XFx0XFx0UkVfRGlyZWN0X1BoeXNpY2FsXFxuI2RlZmluZSBSRV9EaXJlY3RfUmVjdEFyZWFcXHRcXHRSRV9EaXJlY3RfUmVjdEFyZWFfUGh5c2ljYWxcXG4jZGVmaW5lIFJFX0luZGlyZWN0RGlmZnVzZVxcdFxcdFJFX0luZGlyZWN0RGlmZnVzZV9QaHlzaWNhbFxcbiNkZWZpbmUgUkVfSW5kaXJlY3RTcGVjdWxhclxcdFxcdFJFX0luZGlyZWN0U3BlY3VsYXJfUGh5c2ljYWxcXG4jZGVmaW5lIE1hdGVyaWFsX0JsaW5uU2hpbmluZXNzRXhwb25lbnQoIG1hdGVyaWFsICkgICBHR1hSb3VnaG5lc3NUb0JsaW5uRXhwb25lbnQoIG1hdGVyaWFsLnNwZWN1bGFyUm91Z2huZXNzIClcXG4jZGVmaW5lIE1hdGVyaWFsX0NsZWFyQ29hdF9CbGlublNoaW5pbmVzc0V4cG9uZW50KCBtYXRlcmlhbCApICAgR0dYUm91Z2huZXNzVG9CbGlubkV4cG9uZW50KCBtYXRlcmlhbC5jbGVhckNvYXRSb3VnaG5lc3MgKVxcbmZsb2F0IGNvbXB1dGVTcGVjdWxhck9jY2x1c2lvbiggY29uc3QgaW4gZmxvYXQgZG90TlYsIGNvbnN0IGluIGZsb2F0IGFtYmllbnRPY2NsdXNpb24sIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcyApIHtcXG5cXHRyZXR1cm4gc2F0dXJhdGUoIHBvdyggZG90TlYgKyBhbWJpZW50T2NjbHVzaW9uLCBleHAyKCAtIDE2LjAgKiByb3VnaG5lc3MgLSAxLjAgKSApIC0gMS4wICsgYW1iaWVudE9jY2x1c2lvbiApO1xcbn1cXG5cIjtcblxudmFyIGxpZ2h0c19mcmFnbWVudF9iZWdpbiA9IFwiXFxuR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeTtcXG5nZW9tZXRyeS5wb3NpdGlvbiA9IC0gdlZpZXdQb3NpdGlvbjtcXG5nZW9tZXRyeS5ub3JtYWwgPSBub3JtYWw7XFxuZ2VvbWV0cnkudmlld0RpciA9IG5vcm1hbGl6ZSggdlZpZXdQb3NpdGlvbiApO1xcbkluY2lkZW50TGlnaHQgZGlyZWN0TGlnaHQ7XFxuI2lmICggTlVNX1BPSU5UX0xJR0hUUyA+IDAgKSAmJiBkZWZpbmVkKCBSRV9EaXJlY3QgKVxcblxcdFBvaW50TGlnaHQgcG9pbnRMaWdodDtcXG5cXHQjcHJhZ21hIHVucm9sbF9sb29wXFxuXFx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX1BPSU5UX0xJR0hUUzsgaSArKyApIHtcXG5cXHRcXHRwb2ludExpZ2h0ID0gcG9pbnRMaWdodHNbIGkgXTtcXG5cXHRcXHRnZXRQb2ludERpcmVjdExpZ2h0SXJyYWRpYW5jZSggcG9pbnRMaWdodCwgZ2VvbWV0cnksIGRpcmVjdExpZ2h0ICk7XFxuXFx0XFx0I2lmZGVmIFVTRV9TSEFET1dNQVBcXG5cXHRcXHRkaXJlY3RMaWdodC5jb2xvciAqPSBhbGwoIGJ2ZWMyKCBwb2ludExpZ2h0LnNoYWRvdywgZGlyZWN0TGlnaHQudmlzaWJsZSApICkgPyBnZXRQb2ludFNoYWRvdyggcG9pbnRTaGFkb3dNYXBbIGkgXSwgcG9pbnRMaWdodC5zaGFkb3dNYXBTaXplLCBwb2ludExpZ2h0LnNoYWRvd0JpYXMsIHBvaW50TGlnaHQuc2hhZG93UmFkaXVzLCB2UG9pbnRTaGFkb3dDb29yZFsgaSBdLCBwb2ludExpZ2h0LnNoYWRvd0NhbWVyYU5lYXIsIHBvaW50TGlnaHQuc2hhZG93Q2FtZXJhRmFyICkgOiAxLjA7XFxuXFx0XFx0I2VuZGlmXFxuXFx0XFx0UkVfRGlyZWN0KCBkaXJlY3RMaWdodCwgZ2VvbWV0cnksIG1hdGVyaWFsLCByZWZsZWN0ZWRMaWdodCApO1xcblxcdH1cXG4jZW5kaWZcXG4jaWYgKCBOVU1fU1BPVF9MSUdIVFMgPiAwICkgJiYgZGVmaW5lZCggUkVfRGlyZWN0IClcXG5cXHRTcG90TGlnaHQgc3BvdExpZ2h0O1xcblxcdCNwcmFnbWEgdW5yb2xsX2xvb3BcXG5cXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fU1BPVF9MSUdIVFM7IGkgKysgKSB7XFxuXFx0XFx0c3BvdExpZ2h0ID0gc3BvdExpZ2h0c1sgaSBdO1xcblxcdFxcdGdldFNwb3REaXJlY3RMaWdodElycmFkaWFuY2UoIHNwb3RMaWdodCwgZ2VvbWV0cnksIGRpcmVjdExpZ2h0ICk7XFxuXFx0XFx0I2lmZGVmIFVTRV9TSEFET1dNQVBcXG5cXHRcXHRkaXJlY3RMaWdodC5jb2xvciAqPSBhbGwoIGJ2ZWMyKCBzcG90TGlnaHQuc2hhZG93LCBkaXJlY3RMaWdodC52aXNpYmxlICkgKSA/IGdldFNoYWRvdyggc3BvdFNoYWRvd01hcFsgaSBdLCBzcG90TGlnaHQuc2hhZG93TWFwU2l6ZSwgc3BvdExpZ2h0LnNoYWRvd0JpYXMsIHNwb3RMaWdodC5zaGFkb3dSYWRpdXMsIHZTcG90U2hhZG93Q29vcmRbIGkgXSApIDogMS4wO1xcblxcdFxcdCNlbmRpZlxcblxcdFxcdFJFX0RpcmVjdCggZGlyZWN0TGlnaHQsIGdlb21ldHJ5LCBtYXRlcmlhbCwgcmVmbGVjdGVkTGlnaHQgKTtcXG5cXHR9XFxuI2VuZGlmXFxuI2lmICggTlVNX0RJUl9MSUdIVFMgPiAwICkgJiYgZGVmaW5lZCggUkVfRGlyZWN0IClcXG5cXHREaXJlY3Rpb25hbExpZ2h0IGRpcmVjdGlvbmFsTGlnaHQ7XFxuXFx0I3ByYWdtYSB1bnJvbGxfbG9vcFxcblxcdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9ESVJfTElHSFRTOyBpICsrICkge1xcblxcdFxcdGRpcmVjdGlvbmFsTGlnaHQgPSBkaXJlY3Rpb25hbExpZ2h0c1sgaSBdO1xcblxcdFxcdGdldERpcmVjdGlvbmFsRGlyZWN0TGlnaHRJcnJhZGlhbmNlKCBkaXJlY3Rpb25hbExpZ2h0LCBnZW9tZXRyeSwgZGlyZWN0TGlnaHQgKTtcXG5cXHRcXHQjaWZkZWYgVVNFX1NIQURPV01BUFxcblxcdFxcdGRpcmVjdExpZ2h0LmNvbG9yICo9IGFsbCggYnZlYzIoIGRpcmVjdGlvbmFsTGlnaHQuc2hhZG93LCBkaXJlY3RMaWdodC52aXNpYmxlICkgKSA/IGdldFNoYWRvdyggZGlyZWN0aW9uYWxTaGFkb3dNYXBbIGkgXSwgZGlyZWN0aW9uYWxMaWdodC5zaGFkb3dNYXBTaXplLCBkaXJlY3Rpb25hbExpZ2h0LnNoYWRvd0JpYXMsIGRpcmVjdGlvbmFsTGlnaHQuc2hhZG93UmFkaXVzLCB2RGlyZWN0aW9uYWxTaGFkb3dDb29yZFsgaSBdICkgOiAxLjA7XFxuXFx0XFx0I2VuZGlmXFxuXFx0XFx0UkVfRGlyZWN0KCBkaXJlY3RMaWdodCwgZ2VvbWV0cnksIG1hdGVyaWFsLCByZWZsZWN0ZWRMaWdodCApO1xcblxcdH1cXG4jZW5kaWZcXG4jaWYgKCBOVU1fUkVDVF9BUkVBX0xJR0hUUyA+IDAgKSAmJiBkZWZpbmVkKCBSRV9EaXJlY3RfUmVjdEFyZWEgKVxcblxcdFJlY3RBcmVhTGlnaHQgcmVjdEFyZWFMaWdodDtcXG5cXHQjcHJhZ21hIHVucm9sbF9sb29wXFxuXFx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX1JFQ1RfQVJFQV9MSUdIVFM7IGkgKysgKSB7XFxuXFx0XFx0cmVjdEFyZWFMaWdodCA9IHJlY3RBcmVhTGlnaHRzWyBpIF07XFxuXFx0XFx0UkVfRGlyZWN0X1JlY3RBcmVhKCByZWN0QXJlYUxpZ2h0LCBnZW9tZXRyeSwgbWF0ZXJpYWwsIHJlZmxlY3RlZExpZ2h0ICk7XFxuXFx0fVxcbiNlbmRpZlxcbiNpZiBkZWZpbmVkKCBSRV9JbmRpcmVjdERpZmZ1c2UgKVxcblxcdHZlYzMgaXJyYWRpYW5jZSA9IGdldEFtYmllbnRMaWdodElycmFkaWFuY2UoIGFtYmllbnRMaWdodENvbG9yICk7XFxuXFx0I2lmICggTlVNX0hFTUlfTElHSFRTID4gMCApXFxuXFx0XFx0I3ByYWdtYSB1bnJvbGxfbG9vcFxcblxcdFxcdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9IRU1JX0xJR0hUUzsgaSArKyApIHtcXG5cXHRcXHRcXHRpcnJhZGlhbmNlICs9IGdldEhlbWlzcGhlcmVMaWdodElycmFkaWFuY2UoIGhlbWlzcGhlcmVMaWdodHNbIGkgXSwgZ2VvbWV0cnkgKTtcXG5cXHRcXHR9XFxuXFx0I2VuZGlmXFxuI2VuZGlmXFxuI2lmIGRlZmluZWQoIFJFX0luZGlyZWN0U3BlY3VsYXIgKVxcblxcdHZlYzMgcmFkaWFuY2UgPSB2ZWMzKCAwLjAgKTtcXG5cXHR2ZWMzIGNsZWFyQ29hdFJhZGlhbmNlID0gdmVjMyggMC4wICk7XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBsaWdodHNfZnJhZ21lbnRfbWFwcyA9IFwiI2lmIGRlZmluZWQoIFJFX0luZGlyZWN0RGlmZnVzZSApXFxuXFx0I2lmZGVmIFVTRV9MSUdIVE1BUFxcblxcdFxcdHZlYzMgbGlnaHRNYXBJcnJhZGlhbmNlID0gdGV4dHVyZTJEKCBsaWdodE1hcCwgdlV2MiApLnh5eiAqIGxpZ2h0TWFwSW50ZW5zaXR5O1xcblxcdFxcdCNpZm5kZWYgUEhZU0lDQUxMWV9DT1JSRUNUX0xJR0hUU1xcblxcdFxcdFxcdGxpZ2h0TWFwSXJyYWRpYW5jZSAqPSBQSTtcXG5cXHRcXHQjZW5kaWZcXG5cXHRcXHRpcnJhZGlhbmNlICs9IGxpZ2h0TWFwSXJyYWRpYW5jZTtcXG5cXHQjZW5kaWZcXG5cXHQjaWYgZGVmaW5lZCggVVNFX0VOVk1BUCApICYmIGRlZmluZWQoIFBIWVNJQ0FMICkgJiYgZGVmaW5lZCggRU5WTUFQX1RZUEVfQ1VCRV9VViApXFxuXFx0XFx0aXJyYWRpYW5jZSArPSBnZXRMaWdodFByb2JlSW5kaXJlY3RJcnJhZGlhbmNlKCBnZW9tZXRyeSwgbWF4TWlwTGV2ZWwgKTtcXG5cXHQjZW5kaWZcXG4jZW5kaWZcXG4jaWYgZGVmaW5lZCggVVNFX0VOVk1BUCApICYmIGRlZmluZWQoIFJFX0luZGlyZWN0U3BlY3VsYXIgKVxcblxcdHJhZGlhbmNlICs9IGdldExpZ2h0UHJvYmVJbmRpcmVjdFJhZGlhbmNlKCBnZW9tZXRyeSwgTWF0ZXJpYWxfQmxpbm5TaGluaW5lc3NFeHBvbmVudCggbWF0ZXJpYWwgKSwgbWF4TWlwTGV2ZWwgKTtcXG5cXHQjaWZuZGVmIFNUQU5EQVJEXFxuXFx0XFx0Y2xlYXJDb2F0UmFkaWFuY2UgKz0gZ2V0TGlnaHRQcm9iZUluZGlyZWN0UmFkaWFuY2UoIGdlb21ldHJ5LCBNYXRlcmlhbF9DbGVhckNvYXRfQmxpbm5TaGluaW5lc3NFeHBvbmVudCggbWF0ZXJpYWwgKSwgbWF4TWlwTGV2ZWwgKTtcXG5cXHQjZW5kaWZcXG4jZW5kaWZcXG5cIjtcblxudmFyIGxpZ2h0c19mcmFnbWVudF9lbmQgPSBcIiNpZiBkZWZpbmVkKCBSRV9JbmRpcmVjdERpZmZ1c2UgKVxcblxcdFJFX0luZGlyZWN0RGlmZnVzZSggaXJyYWRpYW5jZSwgZ2VvbWV0cnksIG1hdGVyaWFsLCByZWZsZWN0ZWRMaWdodCApO1xcbiNlbmRpZlxcbiNpZiBkZWZpbmVkKCBSRV9JbmRpcmVjdFNwZWN1bGFyIClcXG5cXHRSRV9JbmRpcmVjdFNwZWN1bGFyKCByYWRpYW5jZSwgY2xlYXJDb2F0UmFkaWFuY2UsIGdlb21ldHJ5LCBtYXRlcmlhbCwgcmVmbGVjdGVkTGlnaHQgKTtcXG4jZW5kaWZcXG5cIjtcblxudmFyIGxvZ2RlcHRoYnVmX2ZyYWdtZW50ID0gXCIjaWYgZGVmaW5lZCggVVNFX0xPR0RFUFRIQlVGICkgJiYgZGVmaW5lZCggVVNFX0xPR0RFUFRIQlVGX0VYVCApXFxuXFx0Z2xfRnJhZ0RlcHRoRVhUID0gbG9nMiggdkZyYWdEZXB0aCApICogbG9nRGVwdGhCdWZGQyAqIDAuNTtcXG4jZW5kaWZcIjtcblxudmFyIGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfTE9HREVQVEhCVUZcXG5cXHR1bmlmb3JtIGZsb2F0IGxvZ0RlcHRoQnVmRkM7XFxuXFx0I2lmZGVmIFVTRV9MT0dERVBUSEJVRl9FWFRcXG5cXHRcXHR2YXJ5aW5nIGZsb2F0IHZGcmFnRGVwdGg7XFxuXFx0I2VuZGlmXFxuI2VuZGlmXFxuXCI7XG5cbnZhciBsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleCA9IFwiI2lmZGVmIFVTRV9MT0dERVBUSEJVRlxcblxcdCNpZmRlZiBVU0VfTE9HREVQVEhCVUZfRVhUXFxuXFx0XFx0dmFyeWluZyBmbG9hdCB2RnJhZ0RlcHRoO1xcblxcdCNlbmRpZlxcblxcdHVuaWZvcm0gZmxvYXQgbG9nRGVwdGhCdWZGQztcXG4jZW5kaWZcIjtcblxudmFyIGxvZ2RlcHRoYnVmX3ZlcnRleCA9IFwiI2lmZGVmIFVTRV9MT0dERVBUSEJVRlxcblxcdCNpZmRlZiBVU0VfTE9HREVQVEhCVUZfRVhUXFxuXFx0XFx0dkZyYWdEZXB0aCA9IDEuMCArIGdsX1Bvc2l0aW9uLnc7XFxuXFx0I2Vsc2VcXG5cXHRcXHRnbF9Qb3NpdGlvbi56ID0gbG9nMiggbWF4KCBFUFNJTE9OLCBnbF9Qb3NpdGlvbi53ICsgMS4wICkgKSAqIGxvZ0RlcHRoQnVmRkMgLSAxLjA7XFxuXFx0XFx0Z2xfUG9zaXRpb24ueiAqPSBnbF9Qb3NpdGlvbi53O1xcblxcdCNlbmRpZlxcbiNlbmRpZlxcblwiO1xuXG52YXIgbWFwX2ZyYWdtZW50ID0gXCIjaWZkZWYgVVNFX01BUFxcblxcdHZlYzQgdGV4ZWxDb2xvciA9IHRleHR1cmUyRCggbWFwLCB2VXYgKTtcXG5cXHR0ZXhlbENvbG9yID0gbWFwVGV4ZWxUb0xpbmVhciggdGV4ZWxDb2xvciApO1xcblxcdGRpZmZ1c2VDb2xvciAqPSB0ZXhlbENvbG9yO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgbWFwX3BhcnNfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfTUFQXFxuXFx0dW5pZm9ybSBzYW1wbGVyMkQgbWFwO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgbWFwX3BhcnRpY2xlX2ZyYWdtZW50ID0gXCIjaWZkZWYgVVNFX01BUFxcblxcdHZlYzIgdXYgPSAoIHV2VHJhbnNmb3JtICogdmVjMyggZ2xfUG9pbnRDb29yZC54LCAxLjAgLSBnbF9Qb2ludENvb3JkLnksIDEgKSApLnh5O1xcblxcdHZlYzQgbWFwVGV4ZWwgPSB0ZXh0dXJlMkQoIG1hcCwgdXYgKTtcXG5cXHRkaWZmdXNlQ29sb3IgKj0gbWFwVGV4ZWxUb0xpbmVhciggbWFwVGV4ZWwgKTtcXG4jZW5kaWZcXG5cIjtcblxudmFyIG1hcF9wYXJ0aWNsZV9wYXJzX2ZyYWdtZW50ID0gXCIjaWZkZWYgVVNFX01BUFxcblxcdHVuaWZvcm0gbWF0MyB1dlRyYW5zZm9ybTtcXG5cXHR1bmlmb3JtIHNhbXBsZXIyRCBtYXA7XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBtZXRhbG5lc3NtYXBfZnJhZ21lbnQgPSBcImZsb2F0IG1ldGFsbmVzc0ZhY3RvciA9IG1ldGFsbmVzcztcXG4jaWZkZWYgVVNFX01FVEFMTkVTU01BUFxcblxcdHZlYzQgdGV4ZWxNZXRhbG5lc3MgPSB0ZXh0dXJlMkQoIG1ldGFsbmVzc01hcCwgdlV2ICk7XFxuXFx0bWV0YWxuZXNzRmFjdG9yICo9IHRleGVsTWV0YWxuZXNzLmI7XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBtZXRhbG5lc3NtYXBfcGFyc19mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9NRVRBTE5FU1NNQVBcXG5cXHR1bmlmb3JtIHNhbXBsZXIyRCBtZXRhbG5lc3NNYXA7XFxuI2VuZGlmXCI7XG5cbnZhciBtb3JwaG5vcm1hbF92ZXJ0ZXggPSBcIiNpZmRlZiBVU0VfTU9SUEhOT1JNQUxTXFxuXFx0b2JqZWN0Tm9ybWFsICs9ICggbW9ycGhOb3JtYWwwIC0gbm9ybWFsICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDAgXTtcXG5cXHRvYmplY3ROb3JtYWwgKz0gKCBtb3JwaE5vcm1hbDEgLSBub3JtYWwgKSAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgMSBdO1xcblxcdG9iamVjdE5vcm1hbCArPSAoIG1vcnBoTm9ybWFsMiAtIG5vcm1hbCApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAyIF07XFxuXFx0b2JqZWN0Tm9ybWFsICs9ICggbW9ycGhOb3JtYWwzIC0gbm9ybWFsICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDMgXTtcXG4jZW5kaWZcXG5cIjtcblxudmFyIG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4ID0gXCIjaWZkZWYgVVNFX01PUlBIVEFSR0VUU1xcblxcdCNpZm5kZWYgVVNFX01PUlBITk9STUFMU1xcblxcdHVuaWZvcm0gZmxvYXQgbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyA4IF07XFxuXFx0I2Vsc2VcXG5cXHR1bmlmb3JtIGZsb2F0IG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgNCBdO1xcblxcdCNlbmRpZlxcbiNlbmRpZlwiO1xuXG52YXIgbW9ycGh0YXJnZXRfdmVydGV4ID0gXCIjaWZkZWYgVVNFX01PUlBIVEFSR0VUU1xcblxcdHRyYW5zZm9ybWVkICs9ICggbW9ycGhUYXJnZXQwIC0gcG9zaXRpb24gKSAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgMCBdO1xcblxcdHRyYW5zZm9ybWVkICs9ICggbW9ycGhUYXJnZXQxIC0gcG9zaXRpb24gKSAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgMSBdO1xcblxcdHRyYW5zZm9ybWVkICs9ICggbW9ycGhUYXJnZXQyIC0gcG9zaXRpb24gKSAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgMiBdO1xcblxcdHRyYW5zZm9ybWVkICs9ICggbW9ycGhUYXJnZXQzIC0gcG9zaXRpb24gKSAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgMyBdO1xcblxcdCNpZm5kZWYgVVNFX01PUlBITk9STUFMU1xcblxcdHRyYW5zZm9ybWVkICs9ICggbW9ycGhUYXJnZXQ0IC0gcG9zaXRpb24gKSAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgNCBdO1xcblxcdHRyYW5zZm9ybWVkICs9ICggbW9ycGhUYXJnZXQ1IC0gcG9zaXRpb24gKSAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgNSBdO1xcblxcdHRyYW5zZm9ybWVkICs9ICggbW9ycGhUYXJnZXQ2IC0gcG9zaXRpb24gKSAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgNiBdO1xcblxcdHRyYW5zZm9ybWVkICs9ICggbW9ycGhUYXJnZXQ3IC0gcG9zaXRpb24gKSAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgNyBdO1xcblxcdCNlbmRpZlxcbiNlbmRpZlxcblwiO1xuXG52YXIgbm9ybWFsX2ZyYWdtZW50X2JlZ2luID0gXCIjaWZkZWYgRkxBVF9TSEFERURcXG5cXHR2ZWMzIGZkeCA9IHZlYzMoIGRGZHgoIHZWaWV3UG9zaXRpb24ueCApLCBkRmR4KCB2Vmlld1Bvc2l0aW9uLnkgKSwgZEZkeCggdlZpZXdQb3NpdGlvbi56ICkgKTtcXG5cXHR2ZWMzIGZkeSA9IHZlYzMoIGRGZHkoIHZWaWV3UG9zaXRpb24ueCApLCBkRmR5KCB2Vmlld1Bvc2l0aW9uLnkgKSwgZEZkeSggdlZpZXdQb3NpdGlvbi56ICkgKTtcXG5cXHR2ZWMzIG5vcm1hbCA9IG5vcm1hbGl6ZSggY3Jvc3MoIGZkeCwgZmR5ICkgKTtcXG4jZWxzZVxcblxcdHZlYzMgbm9ybWFsID0gbm9ybWFsaXplKCB2Tm9ybWFsICk7XFxuXFx0I2lmZGVmIERPVUJMRV9TSURFRFxcblxcdFxcdG5vcm1hbCA9IG5vcm1hbCAqICggZmxvYXQoIGdsX0Zyb250RmFjaW5nICkgKiAyLjAgLSAxLjAgKTtcXG5cXHQjZW5kaWZcXG4jZW5kaWZcXG5cIjtcblxudmFyIG5vcm1hbF9mcmFnbWVudF9tYXBzID0gXCIjaWZkZWYgVVNFX05PUk1BTE1BUFxcblxcdG5vcm1hbCA9IHBlcnR1cmJOb3JtYWwyQXJiKCAtdlZpZXdQb3NpdGlvbiwgbm9ybWFsICk7XFxuI2VsaWYgZGVmaW5lZCggVVNFX0JVTVBNQVAgKVxcblxcdG5vcm1hbCA9IHBlcnR1cmJOb3JtYWxBcmIoIC12Vmlld1Bvc2l0aW9uLCBub3JtYWwsIGRIZHh5X2Z3ZCgpICk7XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBub3JtYWxtYXBfcGFyc19mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9OT1JNQUxNQVBcXG5cXHR1bmlmb3JtIHNhbXBsZXIyRCBub3JtYWxNYXA7XFxuXFx0dW5pZm9ybSB2ZWMyIG5vcm1hbFNjYWxlO1xcblxcdHZlYzMgcGVydHVyYk5vcm1hbDJBcmIoIHZlYzMgZXllX3BvcywgdmVjMyBzdXJmX25vcm0gKSB7XFxuXFx0XFx0dmVjMyBxMCA9IHZlYzMoIGRGZHgoIGV5ZV9wb3MueCApLCBkRmR4KCBleWVfcG9zLnkgKSwgZEZkeCggZXllX3Bvcy56ICkgKTtcXG5cXHRcXHR2ZWMzIHExID0gdmVjMyggZEZkeSggZXllX3Bvcy54ICksIGRGZHkoIGV5ZV9wb3MueSApLCBkRmR5KCBleWVfcG9zLnogKSApO1xcblxcdFxcdHZlYzIgc3QwID0gZEZkeCggdlV2LnN0ICk7XFxuXFx0XFx0dmVjMiBzdDEgPSBkRmR5KCB2VXYuc3QgKTtcXG5cXHRcXHRmbG9hdCBzY2FsZSA9IHNpZ24oIHN0MS50ICogc3QwLnMgLSBzdDAudCAqIHN0MS5zICk7XFx0XFx0c2NhbGUgKj0gZmxvYXQoIGdsX0Zyb250RmFjaW5nICkgKiAyLjAgLSAxLjA7XFxuXFx0XFx0dmVjMyBTID0gbm9ybWFsaXplKCAoIHEwICogc3QxLnQgLSBxMSAqIHN0MC50ICkgKiBzY2FsZSApO1xcblxcdFxcdHZlYzMgVCA9IG5vcm1hbGl6ZSggKCAtIHEwICogc3QxLnMgKyBxMSAqIHN0MC5zICkgKiBzY2FsZSApO1xcblxcdFxcdHZlYzMgTiA9IG5vcm1hbGl6ZSggc3VyZl9ub3JtICk7XFxuXFx0XFx0dmVjMyBtYXBOID0gdGV4dHVyZTJEKCBub3JtYWxNYXAsIHZVdiApLnh5eiAqIDIuMCAtIDEuMDtcXG5cXHRcXHRtYXBOLnh5ID0gbm9ybWFsU2NhbGUgKiBtYXBOLnh5O1xcblxcdFxcdG1hdDMgdHNuID0gbWF0MyggUywgVCwgTiApO1xcblxcdFxcdHJldHVybiBub3JtYWxpemUoIHRzbiAqIG1hcE4gKTtcXG5cXHR9XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBwYWNraW5nID0gXCJ2ZWMzIHBhY2tOb3JtYWxUb1JHQiggY29uc3QgaW4gdmVjMyBub3JtYWwgKSB7XFxuXFx0cmV0dXJuIG5vcm1hbGl6ZSggbm9ybWFsICkgKiAwLjUgKyAwLjU7XFxufVxcbnZlYzMgdW5wYWNrUkdCVG9Ob3JtYWwoIGNvbnN0IGluIHZlYzMgcmdiICkge1xcblxcdHJldHVybiAyLjAgKiByZ2IueHl6IC0gMS4wO1xcbn1cXG5jb25zdCBmbG9hdCBQYWNrVXBzY2FsZSA9IDI1Ni4gLyAyNTUuO2NvbnN0IGZsb2F0IFVucGFja0Rvd25zY2FsZSA9IDI1NS4gLyAyNTYuO1xcbmNvbnN0IHZlYzMgUGFja0ZhY3RvcnMgPSB2ZWMzKCAyNTYuICogMjU2LiAqIDI1Ni4sIDI1Ni4gKiAyNTYuLCAgMjU2LiApO1xcbmNvbnN0IHZlYzQgVW5wYWNrRmFjdG9ycyA9IFVucGFja0Rvd25zY2FsZSAvIHZlYzQoIFBhY2tGYWN0b3JzLCAxLiApO1xcbmNvbnN0IGZsb2F0IFNoaWZ0UmlnaHQ4ID0gMS4gLyAyNTYuO1xcbnZlYzQgcGFja0RlcHRoVG9SR0JBKCBjb25zdCBpbiBmbG9hdCB2ICkge1xcblxcdHZlYzQgciA9IHZlYzQoIGZyYWN0KCB2ICogUGFja0ZhY3RvcnMgKSwgdiApO1xcblxcdHIueXp3IC09IHIueHl6ICogU2hpZnRSaWdodDg7XFx0cmV0dXJuIHIgKiBQYWNrVXBzY2FsZTtcXG59XFxuZmxvYXQgdW5wYWNrUkdCQVRvRGVwdGgoIGNvbnN0IGluIHZlYzQgdiApIHtcXG5cXHRyZXR1cm4gZG90KCB2LCBVbnBhY2tGYWN0b3JzICk7XFxufVxcbmZsb2F0IHZpZXdaVG9PcnRob2dyYXBoaWNEZXB0aCggY29uc3QgaW4gZmxvYXQgdmlld1osIGNvbnN0IGluIGZsb2F0IG5lYXIsIGNvbnN0IGluIGZsb2F0IGZhciApIHtcXG5cXHRyZXR1cm4gKCB2aWV3WiArIG5lYXIgKSAvICggbmVhciAtIGZhciApO1xcbn1cXG5mbG9hdCBvcnRob2dyYXBoaWNEZXB0aFRvVmlld1ooIGNvbnN0IGluIGZsb2F0IGxpbmVhckNsaXBaLCBjb25zdCBpbiBmbG9hdCBuZWFyLCBjb25zdCBpbiBmbG9hdCBmYXIgKSB7XFxuXFx0cmV0dXJuIGxpbmVhckNsaXBaICogKCBuZWFyIC0gZmFyICkgLSBuZWFyO1xcbn1cXG5mbG9hdCB2aWV3WlRvUGVyc3BlY3RpdmVEZXB0aCggY29uc3QgaW4gZmxvYXQgdmlld1osIGNvbnN0IGluIGZsb2F0IG5lYXIsIGNvbnN0IGluIGZsb2F0IGZhciApIHtcXG5cXHRyZXR1cm4gKCggbmVhciArIHZpZXdaICkgKiBmYXIgKSAvICgoIGZhciAtIG5lYXIgKSAqIHZpZXdaICk7XFxufVxcbmZsb2F0IHBlcnNwZWN0aXZlRGVwdGhUb1ZpZXdaKCBjb25zdCBpbiBmbG9hdCBpbnZDbGlwWiwgY29uc3QgaW4gZmxvYXQgbmVhciwgY29uc3QgaW4gZmxvYXQgZmFyICkge1xcblxcdHJldHVybiAoIG5lYXIgKiBmYXIgKSAvICggKCBmYXIgLSBuZWFyICkgKiBpbnZDbGlwWiAtIGZhciApO1xcbn1cXG5cIjtcblxudmFyIHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQgPSBcIiNpZmRlZiBQUkVNVUxUSVBMSUVEX0FMUEhBXFxuXFx0Z2xfRnJhZ0NvbG9yLnJnYiAqPSBnbF9GcmFnQ29sb3IuYTtcXG4jZW5kaWZcXG5cIjtcblxudmFyIHByb2plY3RfdmVydGV4ID0gXCJ2ZWM0IG12UG9zaXRpb24gPSBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KCB0cmFuc2Zvcm1lZCwgMS4wICk7XFxuZ2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbXZQb3NpdGlvbjtcXG5cIjtcblxudmFyIGRpdGhlcmluZ19mcmFnbWVudCA9IFwiI2lmIGRlZmluZWQoIERJVEhFUklORyApXFxuICBnbF9GcmFnQ29sb3IucmdiID0gZGl0aGVyaW5nKCBnbF9GcmFnQ29sb3IucmdiICk7XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBkaXRoZXJpbmdfcGFyc19mcmFnbWVudCA9IFwiI2lmIGRlZmluZWQoIERJVEhFUklORyApXFxuXFx0dmVjMyBkaXRoZXJpbmcoIHZlYzMgY29sb3IgKSB7XFxuXFx0XFx0ZmxvYXQgZ3JpZF9wb3NpdGlvbiA9IHJhbmQoIGdsX0ZyYWdDb29yZC54eSApO1xcblxcdFxcdHZlYzMgZGl0aGVyX3NoaWZ0X1JHQiA9IHZlYzMoIDAuMjUgLyAyNTUuMCwgLTAuMjUgLyAyNTUuMCwgMC4yNSAvIDI1NS4wICk7XFxuXFx0XFx0ZGl0aGVyX3NoaWZ0X1JHQiA9IG1peCggMi4wICogZGl0aGVyX3NoaWZ0X1JHQiwgLTIuMCAqIGRpdGhlcl9zaGlmdF9SR0IsIGdyaWRfcG9zaXRpb24gKTtcXG5cXHRcXHRyZXR1cm4gY29sb3IgKyBkaXRoZXJfc2hpZnRfUkdCO1xcblxcdH1cXG4jZW5kaWZcXG5cIjtcblxudmFyIHJvdWdobmVzc21hcF9mcmFnbWVudCA9IFwiZmxvYXQgcm91Z2huZXNzRmFjdG9yID0gcm91Z2huZXNzO1xcbiNpZmRlZiBVU0VfUk9VR0hORVNTTUFQXFxuXFx0dmVjNCB0ZXhlbFJvdWdobmVzcyA9IHRleHR1cmUyRCggcm91Z2huZXNzTWFwLCB2VXYgKTtcXG5cXHRyb3VnaG5lc3NGYWN0b3IgKj0gdGV4ZWxSb3VnaG5lc3MuZztcXG4jZW5kaWZcXG5cIjtcblxudmFyIHJvdWdobmVzc21hcF9wYXJzX2ZyYWdtZW50ID0gXCIjaWZkZWYgVVNFX1JPVUdITkVTU01BUFxcblxcdHVuaWZvcm0gc2FtcGxlcjJEIHJvdWdobmVzc01hcDtcXG4jZW5kaWZcIjtcblxudmFyIHNoYWRvd21hcF9wYXJzX2ZyYWdtZW50ID0gXCIjaWZkZWYgVVNFX1NIQURPV01BUFxcblxcdCNpZiBOVU1fRElSX0xJR0hUUyA+IDBcXG5cXHRcXHR1bmlmb3JtIHNhbXBsZXIyRCBkaXJlY3Rpb25hbFNoYWRvd01hcFsgTlVNX0RJUl9MSUdIVFMgXTtcXG5cXHRcXHR2YXJ5aW5nIHZlYzQgdkRpcmVjdGlvbmFsU2hhZG93Q29vcmRbIE5VTV9ESVJfTElHSFRTIF07XFxuXFx0I2VuZGlmXFxuXFx0I2lmIE5VTV9TUE9UX0xJR0hUUyA+IDBcXG5cXHRcXHR1bmlmb3JtIHNhbXBsZXIyRCBzcG90U2hhZG93TWFwWyBOVU1fU1BPVF9MSUdIVFMgXTtcXG5cXHRcXHR2YXJ5aW5nIHZlYzQgdlNwb3RTaGFkb3dDb29yZFsgTlVNX1NQT1RfTElHSFRTIF07XFxuXFx0I2VuZGlmXFxuXFx0I2lmIE5VTV9QT0lOVF9MSUdIVFMgPiAwXFxuXFx0XFx0dW5pZm9ybSBzYW1wbGVyMkQgcG9pbnRTaGFkb3dNYXBbIE5VTV9QT0lOVF9MSUdIVFMgXTtcXG5cXHRcXHR2YXJ5aW5nIHZlYzQgdlBvaW50U2hhZG93Q29vcmRbIE5VTV9QT0lOVF9MSUdIVFMgXTtcXG5cXHQjZW5kaWZcXG5cXHRmbG9hdCB0ZXh0dXJlMkRDb21wYXJlKCBzYW1wbGVyMkQgZGVwdGhzLCB2ZWMyIHV2LCBmbG9hdCBjb21wYXJlICkge1xcblxcdFxcdHJldHVybiBzdGVwKCBjb21wYXJlLCB1bnBhY2tSR0JBVG9EZXB0aCggdGV4dHVyZTJEKCBkZXB0aHMsIHV2ICkgKSApO1xcblxcdH1cXG5cXHRmbG9hdCB0ZXh0dXJlMkRTaGFkb3dMZXJwKCBzYW1wbGVyMkQgZGVwdGhzLCB2ZWMyIHNpemUsIHZlYzIgdXYsIGZsb2F0IGNvbXBhcmUgKSB7XFxuXFx0XFx0Y29uc3QgdmVjMiBvZmZzZXQgPSB2ZWMyKCAwLjAsIDEuMCApO1xcblxcdFxcdHZlYzIgdGV4ZWxTaXplID0gdmVjMiggMS4wICkgLyBzaXplO1xcblxcdFxcdHZlYzIgY2VudHJvaWRVViA9IGZsb29yKCB1diAqIHNpemUgKyAwLjUgKSAvIHNpemU7XFxuXFx0XFx0ZmxvYXQgbGIgPSB0ZXh0dXJlMkRDb21wYXJlKCBkZXB0aHMsIGNlbnRyb2lkVVYgKyB0ZXhlbFNpemUgKiBvZmZzZXQueHgsIGNvbXBhcmUgKTtcXG5cXHRcXHRmbG9hdCBsdCA9IHRleHR1cmUyRENvbXBhcmUoIGRlcHRocywgY2VudHJvaWRVViArIHRleGVsU2l6ZSAqIG9mZnNldC54eSwgY29tcGFyZSApO1xcblxcdFxcdGZsb2F0IHJiID0gdGV4dHVyZTJEQ29tcGFyZSggZGVwdGhzLCBjZW50cm9pZFVWICsgdGV4ZWxTaXplICogb2Zmc2V0Lnl4LCBjb21wYXJlICk7XFxuXFx0XFx0ZmxvYXQgcnQgPSB0ZXh0dXJlMkRDb21wYXJlKCBkZXB0aHMsIGNlbnRyb2lkVVYgKyB0ZXhlbFNpemUgKiBvZmZzZXQueXksIGNvbXBhcmUgKTtcXG5cXHRcXHR2ZWMyIGYgPSBmcmFjdCggdXYgKiBzaXplICsgMC41ICk7XFxuXFx0XFx0ZmxvYXQgYSA9IG1peCggbGIsIGx0LCBmLnkgKTtcXG5cXHRcXHRmbG9hdCBiID0gbWl4KCByYiwgcnQsIGYueSApO1xcblxcdFxcdGZsb2F0IGMgPSBtaXgoIGEsIGIsIGYueCApO1xcblxcdFxcdHJldHVybiBjO1xcblxcdH1cXG5cXHRmbG9hdCBnZXRTaGFkb3coIHNhbXBsZXIyRCBzaGFkb3dNYXAsIHZlYzIgc2hhZG93TWFwU2l6ZSwgZmxvYXQgc2hhZG93QmlhcywgZmxvYXQgc2hhZG93UmFkaXVzLCB2ZWM0IHNoYWRvd0Nvb3JkICkge1xcblxcdFxcdGZsb2F0IHNoYWRvdyA9IDEuMDtcXG5cXHRcXHRzaGFkb3dDb29yZC54eXogLz0gc2hhZG93Q29vcmQudztcXG5cXHRcXHRzaGFkb3dDb29yZC56ICs9IHNoYWRvd0JpYXM7XFxuXFx0XFx0YnZlYzQgaW5GcnVzdHVtVmVjID0gYnZlYzQgKCBzaGFkb3dDb29yZC54ID49IDAuMCwgc2hhZG93Q29vcmQueCA8PSAxLjAsIHNoYWRvd0Nvb3JkLnkgPj0gMC4wLCBzaGFkb3dDb29yZC55IDw9IDEuMCApO1xcblxcdFxcdGJvb2wgaW5GcnVzdHVtID0gYWxsKCBpbkZydXN0dW1WZWMgKTtcXG5cXHRcXHRidmVjMiBmcnVzdHVtVGVzdFZlYyA9IGJ2ZWMyKCBpbkZydXN0dW0sIHNoYWRvd0Nvb3JkLnogPD0gMS4wICk7XFxuXFx0XFx0Ym9vbCBmcnVzdHVtVGVzdCA9IGFsbCggZnJ1c3R1bVRlc3RWZWMgKTtcXG5cXHRcXHRpZiAoIGZydXN0dW1UZXN0ICkge1xcblxcdFxcdCNpZiBkZWZpbmVkKCBTSEFET1dNQVBfVFlQRV9QQ0YgKVxcblxcdFxcdFxcdHZlYzIgdGV4ZWxTaXplID0gdmVjMiggMS4wICkgLyBzaGFkb3dNYXBTaXplO1xcblxcdFxcdFxcdGZsb2F0IGR4MCA9IC0gdGV4ZWxTaXplLnggKiBzaGFkb3dSYWRpdXM7XFxuXFx0XFx0XFx0ZmxvYXQgZHkwID0gLSB0ZXhlbFNpemUueSAqIHNoYWRvd1JhZGl1cztcXG5cXHRcXHRcXHRmbG9hdCBkeDEgPSArIHRleGVsU2l6ZS54ICogc2hhZG93UmFkaXVzO1xcblxcdFxcdFxcdGZsb2F0IGR5MSA9ICsgdGV4ZWxTaXplLnkgKiBzaGFkb3dSYWRpdXM7XFxuXFx0XFx0XFx0c2hhZG93ID0gKFxcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDAsIGR5MCApLCBzaGFkb3dDb29yZC56ICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCAwLjAsIGR5MCApLCBzaGFkb3dDb29yZC56ICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDEsIGR5MCApLCBzaGFkb3dDb29yZC56ICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDAsIDAuMCApLCBzaGFkb3dDb29yZC56ICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHksIHNoYWRvd0Nvb3JkLnogKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MSwgMC4wICksIHNoYWRvd0Nvb3JkLnogKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MCwgZHkxICksIHNoYWRvd0Nvb3JkLnogKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIDAuMCwgZHkxICksIHNoYWRvd0Nvb3JkLnogKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MSwgZHkxICksIHNoYWRvd0Nvb3JkLnogKVxcblxcdFxcdFxcdCkgKiAoIDEuMCAvIDkuMCApO1xcblxcdFxcdCNlbGlmIGRlZmluZWQoIFNIQURPV01BUF9UWVBFX1BDRl9TT0ZUIClcXG5cXHRcXHRcXHR2ZWMyIHRleGVsU2l6ZSA9IHZlYzIoIDEuMCApIC8gc2hhZG93TWFwU2l6ZTtcXG5cXHRcXHRcXHRmbG9hdCBkeDAgPSAtIHRleGVsU2l6ZS54ICogc2hhZG93UmFkaXVzO1xcblxcdFxcdFxcdGZsb2F0IGR5MCA9IC0gdGV4ZWxTaXplLnkgKiBzaGFkb3dSYWRpdXM7XFxuXFx0XFx0XFx0ZmxvYXQgZHgxID0gKyB0ZXhlbFNpemUueCAqIHNoYWRvd1JhZGl1cztcXG5cXHRcXHRcXHRmbG9hdCBkeTEgPSArIHRleGVsU2l6ZS55ICogc2hhZG93UmFkaXVzO1xcblxcdFxcdFxcdHNoYWRvdyA9IChcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRTaGFkb3dMZXJwKCBzaGFkb3dNYXAsIHNoYWRvd01hcFNpemUsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgwLCBkeTAgKSwgc2hhZG93Q29vcmQueiApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRTaGFkb3dMZXJwKCBzaGFkb3dNYXAsIHNoYWRvd01hcFNpemUsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggMC4wLCBkeTAgKSwgc2hhZG93Q29vcmQueiApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRTaGFkb3dMZXJwKCBzaGFkb3dNYXAsIHNoYWRvd01hcFNpemUsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgxLCBkeTAgKSwgc2hhZG93Q29vcmQueiApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRTaGFkb3dMZXJwKCBzaGFkb3dNYXAsIHNoYWRvd01hcFNpemUsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgwLCAwLjAgKSwgc2hhZG93Q29vcmQueiApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRTaGFkb3dMZXJwKCBzaGFkb3dNYXAsIHNoYWRvd01hcFNpemUsIHNoYWRvd0Nvb3JkLnh5LCBzaGFkb3dDb29yZC56ICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRFNoYWRvd0xlcnAoIHNoYWRvd01hcCwgc2hhZG93TWFwU2l6ZSwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDEsIDAuMCApLCBzaGFkb3dDb29yZC56ICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRFNoYWRvd0xlcnAoIHNoYWRvd01hcCwgc2hhZG93TWFwU2l6ZSwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDAsIGR5MSApLCBzaGFkb3dDb29yZC56ICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRFNoYWRvd0xlcnAoIHNoYWRvd01hcCwgc2hhZG93TWFwU2l6ZSwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCAwLjAsIGR5MSApLCBzaGFkb3dDb29yZC56ICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRFNoYWRvd0xlcnAoIHNoYWRvd01hcCwgc2hhZG93TWFwU2l6ZSwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDEsIGR5MSApLCBzaGFkb3dDb29yZC56IClcXG5cXHRcXHRcXHQpICogKCAxLjAgLyA5LjAgKTtcXG5cXHRcXHQjZWxzZVxcblxcdFxcdFxcdHNoYWRvdyA9IHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHksIHNoYWRvd0Nvb3JkLnogKTtcXG5cXHRcXHQjZW5kaWZcXG5cXHRcXHR9XFxuXFx0XFx0cmV0dXJuIHNoYWRvdztcXG5cXHR9XFxuXFx0dmVjMiBjdWJlVG9VViggdmVjMyB2LCBmbG9hdCB0ZXhlbFNpemVZICkge1xcblxcdFxcdHZlYzMgYWJzViA9IGFicyggdiApO1xcblxcdFxcdGZsb2F0IHNjYWxlVG9DdWJlID0gMS4wIC8gbWF4KCBhYnNWLngsIG1heCggYWJzVi55LCBhYnNWLnogKSApO1xcblxcdFxcdGFic1YgKj0gc2NhbGVUb0N1YmU7XFxuXFx0XFx0diAqPSBzY2FsZVRvQ3ViZSAqICggMS4wIC0gMi4wICogdGV4ZWxTaXplWSApO1xcblxcdFxcdHZlYzIgcGxhbmFyID0gdi54eTtcXG5cXHRcXHRmbG9hdCBhbG1vc3RBVGV4ZWwgPSAxLjUgKiB0ZXhlbFNpemVZO1xcblxcdFxcdGZsb2F0IGFsbW9zdE9uZSA9IDEuMCAtIGFsbW9zdEFUZXhlbDtcXG5cXHRcXHRpZiAoIGFic1YueiA+PSBhbG1vc3RPbmUgKSB7XFxuXFx0XFx0XFx0aWYgKCB2LnogPiAwLjAgKVxcblxcdFxcdFxcdFxcdHBsYW5hci54ID0gNC4wIC0gdi54O1xcblxcdFxcdH0gZWxzZSBpZiAoIGFic1YueCA+PSBhbG1vc3RPbmUgKSB7XFxuXFx0XFx0XFx0ZmxvYXQgc2lnblggPSBzaWduKCB2LnggKTtcXG5cXHRcXHRcXHRwbGFuYXIueCA9IHYueiAqIHNpZ25YICsgMi4wICogc2lnblg7XFxuXFx0XFx0fSBlbHNlIGlmICggYWJzVi55ID49IGFsbW9zdE9uZSApIHtcXG5cXHRcXHRcXHRmbG9hdCBzaWduWSA9IHNpZ24oIHYueSApO1xcblxcdFxcdFxcdHBsYW5hci54ID0gdi54ICsgMi4wICogc2lnblkgKyAyLjA7XFxuXFx0XFx0XFx0cGxhbmFyLnkgPSB2LnogKiBzaWduWSAtIDIuMDtcXG5cXHRcXHR9XFxuXFx0XFx0cmV0dXJuIHZlYzIoIDAuMTI1LCAwLjI1ICkgKiBwbGFuYXIgKyB2ZWMyKCAwLjM3NSwgMC43NSApO1xcblxcdH1cXG5cXHRmbG9hdCBnZXRQb2ludFNoYWRvdyggc2FtcGxlcjJEIHNoYWRvd01hcCwgdmVjMiBzaGFkb3dNYXBTaXplLCBmbG9hdCBzaGFkb3dCaWFzLCBmbG9hdCBzaGFkb3dSYWRpdXMsIHZlYzQgc2hhZG93Q29vcmQsIGZsb2F0IHNoYWRvd0NhbWVyYU5lYXIsIGZsb2F0IHNoYWRvd0NhbWVyYUZhciApIHtcXG5cXHRcXHR2ZWMyIHRleGVsU2l6ZSA9IHZlYzIoIDEuMCApIC8gKCBzaGFkb3dNYXBTaXplICogdmVjMiggNC4wLCAyLjAgKSApO1xcblxcdFxcdHZlYzMgbGlnaHRUb1Bvc2l0aW9uID0gc2hhZG93Q29vcmQueHl6O1xcblxcdFxcdGZsb2F0IGRwID0gKCBsZW5ndGgoIGxpZ2h0VG9Qb3NpdGlvbiApIC0gc2hhZG93Q2FtZXJhTmVhciApIC8gKCBzaGFkb3dDYW1lcmFGYXIgLSBzaGFkb3dDYW1lcmFOZWFyICk7XFx0XFx0ZHAgKz0gc2hhZG93QmlhcztcXG5cXHRcXHR2ZWMzIGJkM0QgPSBub3JtYWxpemUoIGxpZ2h0VG9Qb3NpdGlvbiApO1xcblxcdFxcdCNpZiBkZWZpbmVkKCBTSEFET1dNQVBfVFlQRV9QQ0YgKSB8fCBkZWZpbmVkKCBTSEFET1dNQVBfVFlQRV9QQ0ZfU09GVCApXFxuXFx0XFx0XFx0dmVjMiBvZmZzZXQgPSB2ZWMyKCAtIDEsIDEgKSAqIHNoYWRvd1JhZGl1cyAqIHRleGVsU2l6ZS55O1xcblxcdFxcdFxcdHJldHVybiAoXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC54eXksIHRleGVsU2l6ZS55ICksIGRwICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueXl5LCB0ZXhlbFNpemUueSApLCBkcCApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnh5eCwgdGV4ZWxTaXplLnkgKSwgZHAgKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC55eXgsIHRleGVsU2l6ZS55ICksIGRwICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QsIHRleGVsU2l6ZS55ICksIGRwICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueHh5LCB0ZXhlbFNpemUueSApLCBkcCApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnl4eSwgdGV4ZWxTaXplLnkgKSwgZHAgKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC54eHgsIHRleGVsU2l6ZS55ICksIGRwICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueXh4LCB0ZXhlbFNpemUueSApLCBkcCApXFxuXFx0XFx0XFx0KSAqICggMS4wIC8gOS4wICk7XFxuXFx0XFx0I2Vsc2VcXG5cXHRcXHRcXHRyZXR1cm4gdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCwgdGV4ZWxTaXplLnkgKSwgZHAgKTtcXG5cXHRcXHQjZW5kaWZcXG5cXHR9XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBzaGFkb3dtYXBfcGFyc192ZXJ0ZXggPSBcIiNpZmRlZiBVU0VfU0hBRE9XTUFQXFxuXFx0I2lmIE5VTV9ESVJfTElHSFRTID4gMFxcblxcdFxcdHVuaWZvcm0gbWF0NCBkaXJlY3Rpb25hbFNoYWRvd01hdHJpeFsgTlVNX0RJUl9MSUdIVFMgXTtcXG5cXHRcXHR2YXJ5aW5nIHZlYzQgdkRpcmVjdGlvbmFsU2hhZG93Q29vcmRbIE5VTV9ESVJfTElHSFRTIF07XFxuXFx0I2VuZGlmXFxuXFx0I2lmIE5VTV9TUE9UX0xJR0hUUyA+IDBcXG5cXHRcXHR1bmlmb3JtIG1hdDQgc3BvdFNoYWRvd01hdHJpeFsgTlVNX1NQT1RfTElHSFRTIF07XFxuXFx0XFx0dmFyeWluZyB2ZWM0IHZTcG90U2hhZG93Q29vcmRbIE5VTV9TUE9UX0xJR0hUUyBdO1xcblxcdCNlbmRpZlxcblxcdCNpZiBOVU1fUE9JTlRfTElHSFRTID4gMFxcblxcdFxcdHVuaWZvcm0gbWF0NCBwb2ludFNoYWRvd01hdHJpeFsgTlVNX1BPSU5UX0xJR0hUUyBdO1xcblxcdFxcdHZhcnlpbmcgdmVjNCB2UG9pbnRTaGFkb3dDb29yZFsgTlVNX1BPSU5UX0xJR0hUUyBdO1xcblxcdCNlbmRpZlxcbiNlbmRpZlxcblwiO1xuXG52YXIgc2hhZG93bWFwX3ZlcnRleCA9IFwiI2lmZGVmIFVTRV9TSEFET1dNQVBcXG5cXHQjaWYgTlVNX0RJUl9MSUdIVFMgPiAwXFxuXFx0I3ByYWdtYSB1bnJvbGxfbG9vcFxcblxcdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9ESVJfTElHSFRTOyBpICsrICkge1xcblxcdFxcdHZEaXJlY3Rpb25hbFNoYWRvd0Nvb3JkWyBpIF0gPSBkaXJlY3Rpb25hbFNoYWRvd01hdHJpeFsgaSBdICogd29ybGRQb3NpdGlvbjtcXG5cXHR9XFxuXFx0I2VuZGlmXFxuXFx0I2lmIE5VTV9TUE9UX0xJR0hUUyA+IDBcXG5cXHQjcHJhZ21hIHVucm9sbF9sb29wXFxuXFx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX1NQT1RfTElHSFRTOyBpICsrICkge1xcblxcdFxcdHZTcG90U2hhZG93Q29vcmRbIGkgXSA9IHNwb3RTaGFkb3dNYXRyaXhbIGkgXSAqIHdvcmxkUG9zaXRpb247XFxuXFx0fVxcblxcdCNlbmRpZlxcblxcdCNpZiBOVU1fUE9JTlRfTElHSFRTID4gMFxcblxcdCNwcmFnbWEgdW5yb2xsX2xvb3BcXG5cXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fUE9JTlRfTElHSFRTOyBpICsrICkge1xcblxcdFxcdHZQb2ludFNoYWRvd0Nvb3JkWyBpIF0gPSBwb2ludFNoYWRvd01hdHJpeFsgaSBdICogd29ybGRQb3NpdGlvbjtcXG5cXHR9XFxuXFx0I2VuZGlmXFxuI2VuZGlmXFxuXCI7XG5cbnZhciBzaGFkb3dtYXNrX3BhcnNfZnJhZ21lbnQgPSBcImZsb2F0IGdldFNoYWRvd01hc2soKSB7XFxuXFx0ZmxvYXQgc2hhZG93ID0gMS4wO1xcblxcdCNpZmRlZiBVU0VfU0hBRE9XTUFQXFxuXFx0I2lmIE5VTV9ESVJfTElHSFRTID4gMFxcblxcdERpcmVjdGlvbmFsTGlnaHQgZGlyZWN0aW9uYWxMaWdodDtcXG5cXHQjcHJhZ21hIHVucm9sbF9sb29wXFxuXFx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX0RJUl9MSUdIVFM7IGkgKysgKSB7XFxuXFx0XFx0ZGlyZWN0aW9uYWxMaWdodCA9IGRpcmVjdGlvbmFsTGlnaHRzWyBpIF07XFxuXFx0XFx0c2hhZG93ICo9IGJvb2woIGRpcmVjdGlvbmFsTGlnaHQuc2hhZG93ICkgPyBnZXRTaGFkb3coIGRpcmVjdGlvbmFsU2hhZG93TWFwWyBpIF0sIGRpcmVjdGlvbmFsTGlnaHQuc2hhZG93TWFwU2l6ZSwgZGlyZWN0aW9uYWxMaWdodC5zaGFkb3dCaWFzLCBkaXJlY3Rpb25hbExpZ2h0LnNoYWRvd1JhZGl1cywgdkRpcmVjdGlvbmFsU2hhZG93Q29vcmRbIGkgXSApIDogMS4wO1xcblxcdH1cXG5cXHQjZW5kaWZcXG5cXHQjaWYgTlVNX1NQT1RfTElHSFRTID4gMFxcblxcdFNwb3RMaWdodCBzcG90TGlnaHQ7XFxuXFx0I3ByYWdtYSB1bnJvbGxfbG9vcFxcblxcdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9TUE9UX0xJR0hUUzsgaSArKyApIHtcXG5cXHRcXHRzcG90TGlnaHQgPSBzcG90TGlnaHRzWyBpIF07XFxuXFx0XFx0c2hhZG93ICo9IGJvb2woIHNwb3RMaWdodC5zaGFkb3cgKSA/IGdldFNoYWRvdyggc3BvdFNoYWRvd01hcFsgaSBdLCBzcG90TGlnaHQuc2hhZG93TWFwU2l6ZSwgc3BvdExpZ2h0LnNoYWRvd0JpYXMsIHNwb3RMaWdodC5zaGFkb3dSYWRpdXMsIHZTcG90U2hhZG93Q29vcmRbIGkgXSApIDogMS4wO1xcblxcdH1cXG5cXHQjZW5kaWZcXG5cXHQjaWYgTlVNX1BPSU5UX0xJR0hUUyA+IDBcXG5cXHRQb2ludExpZ2h0IHBvaW50TGlnaHQ7XFxuXFx0I3ByYWdtYSB1bnJvbGxfbG9vcFxcblxcdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9QT0lOVF9MSUdIVFM7IGkgKysgKSB7XFxuXFx0XFx0cG9pbnRMaWdodCA9IHBvaW50TGlnaHRzWyBpIF07XFxuXFx0XFx0c2hhZG93ICo9IGJvb2woIHBvaW50TGlnaHQuc2hhZG93ICkgPyBnZXRQb2ludFNoYWRvdyggcG9pbnRTaGFkb3dNYXBbIGkgXSwgcG9pbnRMaWdodC5zaGFkb3dNYXBTaXplLCBwb2ludExpZ2h0LnNoYWRvd0JpYXMsIHBvaW50TGlnaHQuc2hhZG93UmFkaXVzLCB2UG9pbnRTaGFkb3dDb29yZFsgaSBdLCBwb2ludExpZ2h0LnNoYWRvd0NhbWVyYU5lYXIsIHBvaW50TGlnaHQuc2hhZG93Q2FtZXJhRmFyICkgOiAxLjA7XFxuXFx0fVxcblxcdCNlbmRpZlxcblxcdCNlbmRpZlxcblxcdHJldHVybiBzaGFkb3c7XFxufVxcblwiO1xuXG52YXIgc2tpbmJhc2VfdmVydGV4ID0gXCIjaWZkZWYgVVNFX1NLSU5OSU5HXFxuXFx0bWF0NCBib25lTWF0WCA9IGdldEJvbmVNYXRyaXgoIHNraW5JbmRleC54ICk7XFxuXFx0bWF0NCBib25lTWF0WSA9IGdldEJvbmVNYXRyaXgoIHNraW5JbmRleC55ICk7XFxuXFx0bWF0NCBib25lTWF0WiA9IGdldEJvbmVNYXRyaXgoIHNraW5JbmRleC56ICk7XFxuXFx0bWF0NCBib25lTWF0VyA9IGdldEJvbmVNYXRyaXgoIHNraW5JbmRleC53ICk7XFxuI2VuZGlmXCI7XG5cbnZhciBza2lubmluZ19wYXJzX3ZlcnRleCA9IFwiI2lmZGVmIFVTRV9TS0lOTklOR1xcblxcdHVuaWZvcm0gbWF0NCBiaW5kTWF0cml4O1xcblxcdHVuaWZvcm0gbWF0NCBiaW5kTWF0cml4SW52ZXJzZTtcXG5cXHQjaWZkZWYgQk9ORV9URVhUVVJFXFxuXFx0XFx0dW5pZm9ybSBzYW1wbGVyMkQgYm9uZVRleHR1cmU7XFxuXFx0XFx0dW5pZm9ybSBpbnQgYm9uZVRleHR1cmVTaXplO1xcblxcdFxcdG1hdDQgZ2V0Qm9uZU1hdHJpeCggY29uc3QgaW4gZmxvYXQgaSApIHtcXG5cXHRcXHRcXHRmbG9hdCBqID0gaSAqIDQuMDtcXG5cXHRcXHRcXHRmbG9hdCB4ID0gbW9kKCBqLCBmbG9hdCggYm9uZVRleHR1cmVTaXplICkgKTtcXG5cXHRcXHRcXHRmbG9hdCB5ID0gZmxvb3IoIGogLyBmbG9hdCggYm9uZVRleHR1cmVTaXplICkgKTtcXG5cXHRcXHRcXHRmbG9hdCBkeCA9IDEuMCAvIGZsb2F0KCBib25lVGV4dHVyZVNpemUgKTtcXG5cXHRcXHRcXHRmbG9hdCBkeSA9IDEuMCAvIGZsb2F0KCBib25lVGV4dHVyZVNpemUgKTtcXG5cXHRcXHRcXHR5ID0gZHkgKiAoIHkgKyAwLjUgKTtcXG5cXHRcXHRcXHR2ZWM0IHYxID0gdGV4dHVyZTJEKCBib25lVGV4dHVyZSwgdmVjMiggZHggKiAoIHggKyAwLjUgKSwgeSApICk7XFxuXFx0XFx0XFx0dmVjNCB2MiA9IHRleHR1cmUyRCggYm9uZVRleHR1cmUsIHZlYzIoIGR4ICogKCB4ICsgMS41ICksIHkgKSApO1xcblxcdFxcdFxcdHZlYzQgdjMgPSB0ZXh0dXJlMkQoIGJvbmVUZXh0dXJlLCB2ZWMyKCBkeCAqICggeCArIDIuNSApLCB5ICkgKTtcXG5cXHRcXHRcXHR2ZWM0IHY0ID0gdGV4dHVyZTJEKCBib25lVGV4dHVyZSwgdmVjMiggZHggKiAoIHggKyAzLjUgKSwgeSApICk7XFxuXFx0XFx0XFx0bWF0NCBib25lID0gbWF0NCggdjEsIHYyLCB2MywgdjQgKTtcXG5cXHRcXHRcXHRyZXR1cm4gYm9uZTtcXG5cXHRcXHR9XFxuXFx0I2Vsc2VcXG5cXHRcXHR1bmlmb3JtIG1hdDQgYm9uZU1hdHJpY2VzWyBNQVhfQk9ORVMgXTtcXG5cXHRcXHRtYXQ0IGdldEJvbmVNYXRyaXgoIGNvbnN0IGluIGZsb2F0IGkgKSB7XFxuXFx0XFx0XFx0bWF0NCBib25lID0gYm9uZU1hdHJpY2VzWyBpbnQoaSkgXTtcXG5cXHRcXHRcXHRyZXR1cm4gYm9uZTtcXG5cXHRcXHR9XFxuXFx0I2VuZGlmXFxuI2VuZGlmXFxuXCI7XG5cbnZhciBza2lubmluZ192ZXJ0ZXggPSBcIiNpZmRlZiBVU0VfU0tJTk5JTkdcXG5cXHR2ZWM0IHNraW5WZXJ0ZXggPSBiaW5kTWF0cml4ICogdmVjNCggdHJhbnNmb3JtZWQsIDEuMCApO1xcblxcdHZlYzQgc2tpbm5lZCA9IHZlYzQoIDAuMCApO1xcblxcdHNraW5uZWQgKz0gYm9uZU1hdFggKiBza2luVmVydGV4ICogc2tpbldlaWdodC54O1xcblxcdHNraW5uZWQgKz0gYm9uZU1hdFkgKiBza2luVmVydGV4ICogc2tpbldlaWdodC55O1xcblxcdHNraW5uZWQgKz0gYm9uZU1hdFogKiBza2luVmVydGV4ICogc2tpbldlaWdodC56O1xcblxcdHNraW5uZWQgKz0gYm9uZU1hdFcgKiBza2luVmVydGV4ICogc2tpbldlaWdodC53O1xcblxcdHRyYW5zZm9ybWVkID0gKCBiaW5kTWF0cml4SW52ZXJzZSAqIHNraW5uZWQgKS54eXo7XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBza2lubm9ybWFsX3ZlcnRleCA9IFwiI2lmZGVmIFVTRV9TS0lOTklOR1xcblxcdG1hdDQgc2tpbk1hdHJpeCA9IG1hdDQoIDAuMCApO1xcblxcdHNraW5NYXRyaXggKz0gc2tpbldlaWdodC54ICogYm9uZU1hdFg7XFxuXFx0c2tpbk1hdHJpeCArPSBza2luV2VpZ2h0LnkgKiBib25lTWF0WTtcXG5cXHRza2luTWF0cml4ICs9IHNraW5XZWlnaHQueiAqIGJvbmVNYXRaO1xcblxcdHNraW5NYXRyaXggKz0gc2tpbldlaWdodC53ICogYm9uZU1hdFc7XFxuXFx0c2tpbk1hdHJpeCAgPSBiaW5kTWF0cml4SW52ZXJzZSAqIHNraW5NYXRyaXggKiBiaW5kTWF0cml4O1xcblxcdG9iamVjdE5vcm1hbCA9IHZlYzQoIHNraW5NYXRyaXggKiB2ZWM0KCBvYmplY3ROb3JtYWwsIDAuMCApICkueHl6O1xcbiNlbmRpZlxcblwiO1xuXG52YXIgc3BlY3VsYXJtYXBfZnJhZ21lbnQgPSBcImZsb2F0IHNwZWN1bGFyU3RyZW5ndGg7XFxuI2lmZGVmIFVTRV9TUEVDVUxBUk1BUFxcblxcdHZlYzQgdGV4ZWxTcGVjdWxhciA9IHRleHR1cmUyRCggc3BlY3VsYXJNYXAsIHZVdiApO1xcblxcdHNwZWN1bGFyU3RyZW5ndGggPSB0ZXhlbFNwZWN1bGFyLnI7XFxuI2Vsc2VcXG5cXHRzcGVjdWxhclN0cmVuZ3RoID0gMS4wO1xcbiNlbmRpZlwiO1xuXG52YXIgc3BlY3VsYXJtYXBfcGFyc19mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9TUEVDVUxBUk1BUFxcblxcdHVuaWZvcm0gc2FtcGxlcjJEIHNwZWN1bGFyTWFwO1xcbiNlbmRpZlwiO1xuXG52YXIgdG9uZW1hcHBpbmdfZnJhZ21lbnQgPSBcIiNpZiBkZWZpbmVkKCBUT05FX01BUFBJTkcgKVxcbiAgZ2xfRnJhZ0NvbG9yLnJnYiA9IHRvbmVNYXBwaW5nKCBnbF9GcmFnQ29sb3IucmdiICk7XFxuI2VuZGlmXFxuXCI7XG5cbnZhciB0b25lbWFwcGluZ19wYXJzX2ZyYWdtZW50ID0gXCIjaWZuZGVmIHNhdHVyYXRlXFxuXFx0I2RlZmluZSBzYXR1cmF0ZShhKSBjbGFtcCggYSwgMC4wLCAxLjAgKVxcbiNlbmRpZlxcbnVuaWZvcm0gZmxvYXQgdG9uZU1hcHBpbmdFeHBvc3VyZTtcXG51bmlmb3JtIGZsb2F0IHRvbmVNYXBwaW5nV2hpdGVQb2ludDtcXG52ZWMzIExpbmVhclRvbmVNYXBwaW5nKCB2ZWMzIGNvbG9yICkge1xcblxcdHJldHVybiB0b25lTWFwcGluZ0V4cG9zdXJlICogY29sb3I7XFxufVxcbnZlYzMgUmVpbmhhcmRUb25lTWFwcGluZyggdmVjMyBjb2xvciApIHtcXG5cXHRjb2xvciAqPSB0b25lTWFwcGluZ0V4cG9zdXJlO1xcblxcdHJldHVybiBzYXR1cmF0ZSggY29sb3IgLyAoIHZlYzMoIDEuMCApICsgY29sb3IgKSApO1xcbn1cXG4jZGVmaW5lIFVuY2hhcnRlZDJIZWxwZXIoIHggKSBtYXgoICggKCB4ICogKCAwLjE1ICogeCArIDAuMTAgKiAwLjUwICkgKyAwLjIwICogMC4wMiApIC8gKCB4ICogKCAwLjE1ICogeCArIDAuNTAgKSArIDAuMjAgKiAwLjMwICkgKSAtIDAuMDIgLyAwLjMwLCB2ZWMzKCAwLjAgKSApXFxudmVjMyBVbmNoYXJ0ZWQyVG9uZU1hcHBpbmcoIHZlYzMgY29sb3IgKSB7XFxuXFx0Y29sb3IgKj0gdG9uZU1hcHBpbmdFeHBvc3VyZTtcXG5cXHRyZXR1cm4gc2F0dXJhdGUoIFVuY2hhcnRlZDJIZWxwZXIoIGNvbG9yICkgLyBVbmNoYXJ0ZWQySGVscGVyKCB2ZWMzKCB0b25lTWFwcGluZ1doaXRlUG9pbnQgKSApICk7XFxufVxcbnZlYzMgT3B0aW1pemVkQ2luZW9uVG9uZU1hcHBpbmcoIHZlYzMgY29sb3IgKSB7XFxuXFx0Y29sb3IgKj0gdG9uZU1hcHBpbmdFeHBvc3VyZTtcXG5cXHRjb2xvciA9IG1heCggdmVjMyggMC4wICksIGNvbG9yIC0gMC4wMDQgKTtcXG5cXHRyZXR1cm4gcG93KCAoIGNvbG9yICogKCA2LjIgKiBjb2xvciArIDAuNSApICkgLyAoIGNvbG9yICogKCA2LjIgKiBjb2xvciArIDEuNyApICsgMC4wNiApLCB2ZWMzKCAyLjIgKSApO1xcbn1cXG5cIjtcblxudmFyIHV2X3BhcnNfZnJhZ21lbnQgPSBcIiNpZiBkZWZpbmVkKCBVU0VfTUFQICkgfHwgZGVmaW5lZCggVVNFX0JVTVBNQVAgKSB8fCBkZWZpbmVkKCBVU0VfTk9STUFMTUFQICkgfHwgZGVmaW5lZCggVVNFX1NQRUNVTEFSTUFQICkgfHwgZGVmaW5lZCggVVNFX0FMUEhBTUFQICkgfHwgZGVmaW5lZCggVVNFX0VNSVNTSVZFTUFQICkgfHwgZGVmaW5lZCggVVNFX1JPVUdITkVTU01BUCApIHx8IGRlZmluZWQoIFVTRV9NRVRBTE5FU1NNQVAgKVxcblxcdHZhcnlpbmcgdmVjMiB2VXY7XFxuI2VuZGlmXCI7XG5cbnZhciB1dl9wYXJzX3ZlcnRleCA9IFwiI2lmIGRlZmluZWQoIFVTRV9NQVAgKSB8fCBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFVTRV9OT1JNQUxNQVAgKSB8fCBkZWZpbmVkKCBVU0VfU1BFQ1VMQVJNQVAgKSB8fCBkZWZpbmVkKCBVU0VfQUxQSEFNQVAgKSB8fCBkZWZpbmVkKCBVU0VfRU1JU1NJVkVNQVAgKSB8fCBkZWZpbmVkKCBVU0VfUk9VR0hORVNTTUFQICkgfHwgZGVmaW5lZCggVVNFX01FVEFMTkVTU01BUCApXFxuXFx0dmFyeWluZyB2ZWMyIHZVdjtcXG5cXHR1bmlmb3JtIG1hdDMgdXZUcmFuc2Zvcm07XFxuI2VuZGlmXFxuXCI7XG5cbnZhciB1dl92ZXJ0ZXggPSBcIiNpZiBkZWZpbmVkKCBVU0VfTUFQICkgfHwgZGVmaW5lZCggVVNFX0JVTVBNQVAgKSB8fCBkZWZpbmVkKCBVU0VfTk9STUFMTUFQICkgfHwgZGVmaW5lZCggVVNFX1NQRUNVTEFSTUFQICkgfHwgZGVmaW5lZCggVVNFX0FMUEhBTUFQICkgfHwgZGVmaW5lZCggVVNFX0VNSVNTSVZFTUFQICkgfHwgZGVmaW5lZCggVVNFX1JPVUdITkVTU01BUCApIHx8IGRlZmluZWQoIFVTRV9NRVRBTE5FU1NNQVAgKVxcblxcdHZVdiA9ICggdXZUcmFuc2Zvcm0gKiB2ZWMzKCB1diwgMSApICkueHk7XFxuI2VuZGlmXCI7XG5cbnZhciB1djJfcGFyc19mcmFnbWVudCA9IFwiI2lmIGRlZmluZWQoIFVTRV9MSUdIVE1BUCApIHx8IGRlZmluZWQoIFVTRV9BT01BUCApXFxuXFx0dmFyeWluZyB2ZWMyIHZVdjI7XFxuI2VuZGlmXCI7XG5cbnZhciB1djJfcGFyc192ZXJ0ZXggPSBcIiNpZiBkZWZpbmVkKCBVU0VfTElHSFRNQVAgKSB8fCBkZWZpbmVkKCBVU0VfQU9NQVAgKVxcblxcdGF0dHJpYnV0ZSB2ZWMyIHV2MjtcXG5cXHR2YXJ5aW5nIHZlYzIgdlV2MjtcXG4jZW5kaWZcIjtcblxudmFyIHV2Ml92ZXJ0ZXggPSBcIiNpZiBkZWZpbmVkKCBVU0VfTElHSFRNQVAgKSB8fCBkZWZpbmVkKCBVU0VfQU9NQVAgKVxcblxcdHZVdjIgPSB1djI7XFxuI2VuZGlmXCI7XG5cbnZhciB3b3JsZHBvc192ZXJ0ZXggPSBcIiNpZiBkZWZpbmVkKCBVU0VfRU5WTUFQICkgfHwgZGVmaW5lZCggRElTVEFOQ0UgKSB8fCBkZWZpbmVkICggVVNFX1NIQURPV01BUCApXFxuXFx0dmVjNCB3b3JsZFBvc2l0aW9uID0gbW9kZWxNYXRyaXggKiB2ZWM0KCB0cmFuc2Zvcm1lZCwgMS4wICk7XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBjdWJlX2ZyYWcgPSBcInVuaWZvcm0gc2FtcGxlckN1YmUgdEN1YmU7XFxudW5pZm9ybSBmbG9hdCB0RmxpcDtcXG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XFxudmFyeWluZyB2ZWMzIHZXb3JsZFBvc2l0aW9uO1xcbnZvaWQgbWFpbigpIHtcXG5cXHRnbF9GcmFnQ29sb3IgPSB0ZXh0dXJlQ3ViZSggdEN1YmUsIHZlYzMoIHRGbGlwICogdldvcmxkUG9zaXRpb24ueCwgdldvcmxkUG9zaXRpb24ueXogKSApO1xcblxcdGdsX0ZyYWdDb2xvci5hICo9IG9wYWNpdHk7XFxufVxcblwiO1xuXG52YXIgY3ViZV92ZXJ0ID0gXCJ2YXJ5aW5nIHZlYzMgdldvcmxkUG9zaXRpb247XFxuI2luY2x1ZGUgPGNvbW1vbj5cXG52b2lkIG1haW4oKSB7XFxuXFx0dldvcmxkUG9zaXRpb24gPSB0cmFuc2Zvcm1EaXJlY3Rpb24oIHBvc2l0aW9uLCBtb2RlbE1hdHJpeCApO1xcblxcdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxcblxcdGdsX1Bvc2l0aW9uLnogPSBnbF9Qb3NpdGlvbi53O1xcbn1cXG5cIjtcblxudmFyIGRlcHRoX2ZyYWcgPSBcIiNpZiBERVBUSF9QQUNLSU5HID09IDMyMDBcXG5cXHR1bmlmb3JtIGZsb2F0IG9wYWNpdHk7XFxuI2VuZGlmXFxuI2luY2x1ZGUgPGNvbW1vbj5cXG4jaW5jbHVkZSA8cGFja2luZz5cXG4jaW5jbHVkZSA8dXZfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGFscGhhbWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50PlxcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxcblxcdHZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggMS4wICk7XFxuXFx0I2lmIERFUFRIX1BBQ0tJTkcgPT0gMzIwMFxcblxcdFxcdGRpZmZ1c2VDb2xvci5hID0gb3BhY2l0eTtcXG5cXHQjZW5kaWZcXG5cXHQjaW5jbHVkZSA8bWFwX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxhbHBoYW1hcF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8YWxwaGF0ZXN0X2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD5cXG5cXHQjaWYgREVQVEhfUEFDS0lORyA9PSAzMjAwXFxuXFx0XFx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggdmVjMyggMS4wIC0gZ2xfRnJhZ0Nvb3JkLnogKSwgb3BhY2l0eSApO1xcblxcdCNlbGlmIERFUFRIX1BBQ0tJTkcgPT0gMzIwMVxcblxcdFxcdGdsX0ZyYWdDb2xvciA9IHBhY2tEZXB0aFRvUkdCQSggZ2xfRnJhZ0Nvb3JkLnogKTtcXG5cXHQjZW5kaWZcXG59XFxuXCI7XG5cbnZhciBkZXB0aF92ZXJ0ID0gXCIjaW5jbHVkZSA8Y29tbW9uPlxcbiNpbmNsdWRlIDx1dl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+XFxudm9pZCBtYWluKCkge1xcblxcdCNpbmNsdWRlIDx1dl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNraW5iYXNlX3ZlcnRleD5cXG5cXHQjaWZkZWYgVVNFX0RJU1BMQUNFTUVOVE1BUFxcblxcdFxcdCNpbmNsdWRlIDxiZWdpbm5vcm1hbF92ZXJ0ZXg+XFxuXFx0XFx0I2luY2x1ZGUgPG1vcnBobm9ybWFsX3ZlcnRleD5cXG5cXHRcXHQjaW5jbHVkZSA8c2tpbm5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2VuZGlmXFxuXFx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+XFxufVxcblwiO1xuXG52YXIgZGlzdGFuY2VSR0JBX2ZyYWcgPSBcIiNkZWZpbmUgRElTVEFOQ0VcXG51bmlmb3JtIHZlYzMgcmVmZXJlbmNlUG9zaXRpb247XFxudW5pZm9ybSBmbG9hdCBuZWFyRGlzdGFuY2U7XFxudW5pZm9ybSBmbG9hdCBmYXJEaXN0YW5jZTtcXG52YXJ5aW5nIHZlYzMgdldvcmxkUG9zaXRpb247XFxuI2luY2x1ZGUgPGNvbW1vbj5cXG4jaW5jbHVkZSA8cGFja2luZz5cXG4jaW5jbHVkZSA8dXZfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGFscGhhbWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50PlxcbnZvaWQgbWFpbiAoKSB7XFxuXFx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD5cXG5cXHR2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIDEuMCApO1xcblxcdCNpbmNsdWRlIDxtYXBfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGFscGhhbWFwX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+XFxuXFx0ZmxvYXQgZGlzdCA9IGxlbmd0aCggdldvcmxkUG9zaXRpb24gLSByZWZlcmVuY2VQb3NpdGlvbiApO1xcblxcdGRpc3QgPSAoIGRpc3QgLSBuZWFyRGlzdGFuY2UgKSAvICggZmFyRGlzdGFuY2UgLSBuZWFyRGlzdGFuY2UgKTtcXG5cXHRkaXN0ID0gc2F0dXJhdGUoIGRpc3QgKTtcXG5cXHRnbF9GcmFnQ29sb3IgPSBwYWNrRGVwdGhUb1JHQkEoIGRpc3QgKTtcXG59XFxuXCI7XG5cbnZhciBkaXN0YW5jZVJHQkFfdmVydCA9IFwiI2RlZmluZSBESVNUQU5DRVxcbnZhcnlpbmcgdmVjMyB2V29ybGRQb3NpdGlvbjtcXG4jaW5jbHVkZSA8Y29tbW9uPlxcbiNpbmNsdWRlIDx1dl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD5cXG52b2lkIG1haW4oKSB7XFxuXFx0I2luY2x1ZGUgPHV2X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PlxcblxcdCNpZmRlZiBVU0VfRElTUExBQ0VNRU5UTUFQXFxuXFx0XFx0I2luY2x1ZGUgPGJlZ2lubm9ybWFsX3ZlcnRleD5cXG5cXHRcXHQjaW5jbHVkZSA8bW9ycGhub3JtYWxfdmVydGV4PlxcblxcdFxcdCNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRleD5cXG5cXHQjZW5kaWZcXG5cXHQjaW5jbHVkZSA8YmVnaW5fdmVydGV4PlxcblxcdCNpbmNsdWRlIDxtb3JwaHRhcmdldF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNraW5uaW5nX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHdvcmxkcG9zX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD5cXG5cXHR2V29ybGRQb3NpdGlvbiA9IHdvcmxkUG9zaXRpb24ueHl6O1xcbn1cXG5cIjtcblxudmFyIGVxdWlyZWN0X2ZyYWcgPSBcInVuaWZvcm0gc2FtcGxlcjJEIHRFcXVpcmVjdDtcXG52YXJ5aW5nIHZlYzMgdldvcmxkUG9zaXRpb247XFxuI2luY2x1ZGUgPGNvbW1vbj5cXG52b2lkIG1haW4oKSB7XFxuXFx0dmVjMyBkaXJlY3Rpb24gPSBub3JtYWxpemUoIHZXb3JsZFBvc2l0aW9uICk7XFxuXFx0dmVjMiBzYW1wbGVVVjtcXG5cXHRzYW1wbGVVVi55ID0gYXNpbiggY2xhbXAoIGRpcmVjdGlvbi55LCAtIDEuMCwgMS4wICkgKSAqIFJFQ0lQUk9DQUxfUEkgKyAwLjU7XFxuXFx0c2FtcGxlVVYueCA9IGF0YW4oIGRpcmVjdGlvbi56LCBkaXJlY3Rpb24ueCApICogUkVDSVBST0NBTF9QSTIgKyAwLjU7XFxuXFx0Z2xfRnJhZ0NvbG9yID0gdGV4dHVyZTJEKCB0RXF1aXJlY3QsIHNhbXBsZVVWICk7XFxufVxcblwiO1xuXG52YXIgZXF1aXJlY3RfdmVydCA9IFwidmFyeWluZyB2ZWMzIHZXb3JsZFBvc2l0aW9uO1xcbiNpbmNsdWRlIDxjb21tb24+XFxudm9pZCBtYWluKCkge1xcblxcdHZXb3JsZFBvc2l0aW9uID0gdHJhbnNmb3JtRGlyZWN0aW9uKCBwb3NpdGlvbiwgbW9kZWxNYXRyaXggKTtcXG5cXHQjaW5jbHVkZSA8YmVnaW5fdmVydGV4PlxcblxcdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cXG59XFxuXCI7XG5cbnZhciBsaW5lZGFzaGVkX2ZyYWcgPSBcInVuaWZvcm0gdmVjMyBkaWZmdXNlO1xcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcXG51bmlmb3JtIGZsb2F0IGRhc2hTaXplO1xcbnVuaWZvcm0gZmxvYXQgdG90YWxTaXplO1xcbnZhcnlpbmcgZmxvYXQgdkxpbmVEaXN0YW5jZTtcXG4jaW5jbHVkZSA8Y29tbW9uPlxcbiNpbmNsdWRlIDxjb2xvcl9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxmb2dfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+XFxudm9pZCBtYWluKCkge1xcblxcdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+XFxuXFx0aWYgKCBtb2QoIHZMaW5lRGlzdGFuY2UsIHRvdGFsU2l6ZSApID4gZGFzaFNpemUgKSB7XFxuXFx0XFx0ZGlzY2FyZDtcXG5cXHR9XFxuXFx0dmVjMyBvdXRnb2luZ0xpZ2h0ID0gdmVjMyggMC4wICk7XFxuXFx0dmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7XFxuXFx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxjb2xvcl9mcmFnbWVudD5cXG5cXHRvdXRnb2luZ0xpZ2h0ID0gZGlmZnVzZUNvbG9yLnJnYjtcXG5cXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KCBvdXRnb2luZ0xpZ2h0LCBkaWZmdXNlQ29sb3IuYSApO1xcblxcdCNpbmNsdWRlIDxwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8ZW5jb2RpbmdzX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+XFxufVxcblwiO1xuXG52YXIgbGluZWRhc2hlZF92ZXJ0ID0gXCJ1bmlmb3JtIGZsb2F0IHNjYWxlO1xcbmF0dHJpYnV0ZSBmbG9hdCBsaW5lRGlzdGFuY2U7XFxudmFyeWluZyBmbG9hdCB2TGluZURpc3RhbmNlO1xcbiNpbmNsdWRlIDxjb21tb24+XFxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+XFxudm9pZCBtYWluKCkge1xcblxcdCNpbmNsdWRlIDxjb2xvcl92ZXJ0ZXg+XFxuXFx0dkxpbmVEaXN0YW5jZSA9IHNjYWxlICogbGluZURpc3RhbmNlO1xcblxcdHZlYzQgbXZQb3NpdGlvbiA9IG1vZGVsVmlld01hdHJpeCAqIHZlYzQoIHBvc2l0aW9uLCAxLjAgKTtcXG5cXHRnbF9Qb3NpdGlvbiA9IHByb2plY3Rpb25NYXRyaXggKiBtdlBvc2l0aW9uO1xcblxcdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGZvZ192ZXJ0ZXg+XFxufVxcblwiO1xuXG52YXIgbWVzaGJhc2ljX2ZyYWcgPSBcInVuaWZvcm0gdmVjMyBkaWZmdXNlO1xcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcXG4jaWZuZGVmIEZMQVRfU0hBREVEXFxuXFx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XFxuI2VuZGlmXFxuI2luY2x1ZGUgPGNvbW1vbj5cXG4jaW5jbHVkZSA8Y29sb3JfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8dXZfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8dXYyX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPG1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxhbHBoYW1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxhb21hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxsaWdodG1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxlbnZtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHNwZWN1bGFybWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50PlxcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxcblxcdHZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApO1xcblxcdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8bWFwX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxjb2xvcl9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8YWxwaGFtYXBfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGFscGhhdGVzdF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8c3BlY3VsYXJtYXBfZnJhZ21lbnQ+XFxuXFx0UmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgPSBSZWZsZWN0ZWRMaWdodCggdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICkgKTtcXG5cXHQjaWZkZWYgVVNFX0xJR0hUTUFQXFxuXFx0XFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICs9IHRleHR1cmUyRCggbGlnaHRNYXAsIHZVdjIgKS54eXogKiBsaWdodE1hcEludGVuc2l0eTtcXG5cXHQjZWxzZVxcblxcdFxcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArPSB2ZWMzKCAxLjAgKTtcXG5cXHQjZW5kaWZcXG5cXHQjaW5jbHVkZSA8YW9tYXBfZnJhZ21lbnQ+XFxuXFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICo9IGRpZmZ1c2VDb2xvci5yZ2I7XFxuXFx0dmVjMyBvdXRnb2luZ0xpZ2h0ID0gcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlO1xcblxcdCNpbmNsdWRlIDxlbnZtYXBfZnJhZ21lbnQ+XFxuXFx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggb3V0Z29pbmdMaWdodCwgZGlmZnVzZUNvbG9yLmEgKTtcXG5cXHQjaW5jbHVkZSA8cHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGVuY29kaW5nc19mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8Zm9nX2ZyYWdtZW50Plxcbn1cXG5cIjtcblxudmFyIG1lc2hiYXNpY192ZXJ0ID0gXCIjaW5jbHVkZSA8Y29tbW9uPlxcbiNpbmNsdWRlIDx1dl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8dXYyX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxlbnZtYXBfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxza2lubmluZ19wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD5cXG52b2lkIG1haW4oKSB7XFxuXFx0I2luY2x1ZGUgPHV2X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8dXYyX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8Y29sb3JfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2luYmFzZV92ZXJ0ZXg+XFxuXFx0I2lmZGVmIFVTRV9FTlZNQVBcXG5cXHQjaW5jbHVkZSA8YmVnaW5ub3JtYWxfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNraW5ub3JtYWxfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxkZWZhdWx0bm9ybWFsX3ZlcnRleD5cXG5cXHQjZW5kaWZcXG5cXHQjaW5jbHVkZSA8YmVnaW5fdmVydGV4PlxcblxcdCNpbmNsdWRlIDxtb3JwaHRhcmdldF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNraW5uaW5nX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8d29ybGRwb3NfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxlbnZtYXBfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxmb2dfdmVydGV4Plxcbn1cXG5cIjtcblxudmFyIG1lc2hsYW1iZXJ0X2ZyYWcgPSBcInVuaWZvcm0gdmVjMyBkaWZmdXNlO1xcbnVuaWZvcm0gdmVjMyBlbWlzc2l2ZTtcXG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XFxudmFyeWluZyB2ZWMzIHZMaWdodEZyb250O1xcbiNpZmRlZiBET1VCTEVfU0lERURcXG5cXHR2YXJ5aW5nIHZlYzMgdkxpZ2h0QmFjaztcXG4jZW5kaWZcXG4jaW5jbHVkZSA8Y29tbW9uPlxcbiNpbmNsdWRlIDxwYWNraW5nPlxcbiNpbmNsdWRlIDxkaXRoZXJpbmdfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8Y29sb3JfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8dXZfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8dXYyX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPG1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxhbHBoYW1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxhb21hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxsaWdodG1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxlbWlzc2l2ZW1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxlbnZtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8YnNkZnM+XFxuI2luY2x1ZGUgPGxpZ2h0c19wYXJzX2JlZ2luPlxcbiNpbmNsdWRlIDxsaWdodHNfcGFyc19tYXBzPlxcbiNpbmNsdWRlIDxmb2dfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHNoYWRvd21hc2tfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8c3BlY3VsYXJtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+XFxudm9pZCBtYWluKCkge1xcblxcdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+XFxuXFx0dmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7XFxuXFx0UmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgPSBSZWZsZWN0ZWRMaWdodCggdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICkgKTtcXG5cXHR2ZWMzIHRvdGFsRW1pc3NpdmVSYWRpYW5jZSA9IGVtaXNzaXZlO1xcblxcdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8bWFwX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxjb2xvcl9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8YWxwaGFtYXBfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGFscGhhdGVzdF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8c3BlY3VsYXJtYXBfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGVtaXNzaXZlbWFwX2ZyYWdtZW50PlxcblxcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSA9IGdldEFtYmllbnRMaWdodElycmFkaWFuY2UoIGFtYmllbnRMaWdodENvbG9yICk7XFxuXFx0I2luY2x1ZGUgPGxpZ2h0bWFwX2ZyYWdtZW50PlxcblxcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSAqPSBCUkRGX0RpZmZ1c2VfTGFtYmVydCggZGlmZnVzZUNvbG9yLnJnYiApO1xcblxcdCNpZmRlZiBET1VCTEVfU0lERURcXG5cXHRcXHRyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlID0gKCBnbF9Gcm9udEZhY2luZyApID8gdkxpZ2h0RnJvbnQgOiB2TGlnaHRCYWNrO1xcblxcdCNlbHNlXFxuXFx0XFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSA9IHZMaWdodEZyb250O1xcblxcdCNlbmRpZlxcblxcdHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKj0gQlJERl9EaWZmdXNlX0xhbWJlcnQoIGRpZmZ1c2VDb2xvci5yZ2IgKSAqIGdldFNoYWRvd01hc2soKTtcXG5cXHQjaW5jbHVkZSA8YW9tYXBfZnJhZ21lbnQ+XFxuXFx0dmVjMyBvdXRnb2luZ0xpZ2h0ID0gcmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSArIHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArIHRvdGFsRW1pc3NpdmVSYWRpYW5jZTtcXG5cXHQjaW5jbHVkZSA8ZW52bWFwX2ZyYWdtZW50PlxcblxcdGdsX0ZyYWdDb2xvciA9IHZlYzQoIG91dGdvaW5nTGlnaHQsIGRpZmZ1c2VDb2xvci5hICk7XFxuXFx0I2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxlbmNvZGluZ3NfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGZvZ19mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8cHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8ZGl0aGVyaW5nX2ZyYWdtZW50Plxcbn1cXG5cIjtcblxudmFyIG1lc2hsYW1iZXJ0X3ZlcnQgPSBcIiNkZWZpbmUgTEFNQkVSVFxcbnZhcnlpbmcgdmVjMyB2TGlnaHRGcm9udDtcXG4jaWZkZWYgRE9VQkxFX1NJREVEXFxuXFx0dmFyeWluZyB2ZWMzIHZMaWdodEJhY2s7XFxuI2VuZGlmXFxuI2luY2x1ZGUgPGNvbW1vbj5cXG4jaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPHV2Ml9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8ZW52bWFwX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxic2Rmcz5cXG4jaW5jbHVkZSA8bGlnaHRzX3BhcnNfYmVnaW4+XFxuI2luY2x1ZGUgPGxpZ2h0c19wYXJzX21hcHM+XFxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxza2lubmluZ19wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4PlxcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8dXZfdmVydGV4PlxcblxcdCNpbmNsdWRlIDx1djJfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxjb2xvcl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGJlZ2lubm9ybWFsX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bW9ycGhub3JtYWxfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2luYmFzZV92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNraW5ub3JtYWxfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxkZWZhdWx0bm9ybWFsX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8YmVnaW5fdmVydGV4PlxcblxcdCNpbmNsdWRlIDxtb3JwaHRhcmdldF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNraW5uaW5nX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8d29ybGRwb3NfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxlbnZtYXBfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxsaWdodHNfbGFtYmVydF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNoYWRvd21hcF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGZvZ192ZXJ0ZXg+XFxufVxcblwiO1xuXG52YXIgbWVzaHBob25nX2ZyYWcgPSBcIiNkZWZpbmUgUEhPTkdcXG51bmlmb3JtIHZlYzMgZGlmZnVzZTtcXG51bmlmb3JtIHZlYzMgZW1pc3NpdmU7XFxudW5pZm9ybSB2ZWMzIHNwZWN1bGFyO1xcbnVuaWZvcm0gZmxvYXQgc2hpbmluZXNzO1xcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcXG4jaW5jbHVkZSA8Y29tbW9uPlxcbiNpbmNsdWRlIDxwYWNraW5nPlxcbiNpbmNsdWRlIDxkaXRoZXJpbmdfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8Y29sb3JfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8dXZfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8dXYyX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPG1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxhbHBoYW1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxhb21hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxsaWdodG1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxlbWlzc2l2ZW1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxlbnZtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8Z3JhZGllbnRtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGJzZGZzPlxcbiNpbmNsdWRlIDxsaWdodHNfcGFyc19iZWdpbj5cXG4jaW5jbHVkZSA8bGlnaHRzX3BhcnNfbWFwcz5cXG4jaW5jbHVkZSA8bGlnaHRzX3Bob25nX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxidW1wbWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPG5vcm1hbG1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxzcGVjdWxhcm1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD5cXG52b2lkIG1haW4oKSB7XFxuXFx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD5cXG5cXHR2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTtcXG5cXHRSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCA9IFJlZmxlY3RlZExpZ2h0KCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSApO1xcblxcdHZlYzMgdG90YWxFbWlzc2l2ZVJhZGlhbmNlID0gZW1pc3NpdmU7XFxuXFx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxtYXBfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGNvbG9yX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxhbHBoYW1hcF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8YWxwaGF0ZXN0X2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxzcGVjdWxhcm1hcF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8bm9ybWFsX2ZyYWdtZW50X2JlZ2luPlxcblxcdCNpbmNsdWRlIDxub3JtYWxfZnJhZ21lbnRfbWFwcz5cXG5cXHQjaW5jbHVkZSA8ZW1pc3NpdmVtYXBfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGxpZ2h0c19waG9uZ19mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8bGlnaHRzX2ZyYWdtZW50X2JlZ2luPlxcblxcdCNpbmNsdWRlIDxsaWdodHNfZnJhZ21lbnRfbWFwcz5cXG5cXHQjaW5jbHVkZSA8bGlnaHRzX2ZyYWdtZW50X2VuZD5cXG5cXHQjaW5jbHVkZSA8YW9tYXBfZnJhZ21lbnQ+XFxuXFx0dmVjMyBvdXRnb2luZ0xpZ2h0ID0gcmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSArIHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArIHJlZmxlY3RlZExpZ2h0LmRpcmVjdFNwZWN1bGFyICsgcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3RTcGVjdWxhciArIHRvdGFsRW1pc3NpdmVSYWRpYW5jZTtcXG5cXHQjaW5jbHVkZSA8ZW52bWFwX2ZyYWdtZW50PlxcblxcdGdsX0ZyYWdDb2xvciA9IHZlYzQoIG91dGdvaW5nTGlnaHQsIGRpZmZ1c2VDb2xvci5hICk7XFxuXFx0I2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxlbmNvZGluZ3NfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGZvZ19mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8cHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8ZGl0aGVyaW5nX2ZyYWdtZW50Plxcbn1cXG5cIjtcblxudmFyIG1lc2hwaG9uZ192ZXJ0ID0gXCIjZGVmaW5lIFBIT05HXFxudmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XFxuI2lmbmRlZiBGTEFUX1NIQURFRFxcblxcdHZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xcbiNlbmRpZlxcbiNpbmNsdWRlIDxjb21tb24+XFxuI2luY2x1ZGUgPHV2X3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDx1djJfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8ZW52bWFwX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxjb2xvcl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8Zm9nX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD5cXG52b2lkIG1haW4oKSB7XFxuXFx0I2luY2x1ZGUgPHV2X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8dXYyX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8Y29sb3JfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxiZWdpbm5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPG1vcnBobm9ybWFsX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8ZGVmYXVsdG5vcm1hbF92ZXJ0ZXg+XFxuI2lmbmRlZiBGTEFUX1NIQURFRFxcblxcdHZOb3JtYWwgPSBub3JtYWxpemUoIHRyYW5zZm9ybWVkTm9ybWFsICk7XFxuI2VuZGlmXFxuXFx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+XFxuXFx0dlZpZXdQb3NpdGlvbiA9IC0gbXZQb3NpdGlvbi54eXo7XFxuXFx0I2luY2x1ZGUgPHdvcmxkcG9zX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8ZW52bWFwX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2hhZG93bWFwX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8Zm9nX3ZlcnRleD5cXG59XFxuXCI7XG5cbnZhciBtZXNocGh5c2ljYWxfZnJhZyA9IFwiI2RlZmluZSBQSFlTSUNBTFxcbnVuaWZvcm0gdmVjMyBkaWZmdXNlO1xcbnVuaWZvcm0gdmVjMyBlbWlzc2l2ZTtcXG51bmlmb3JtIGZsb2F0IHJvdWdobmVzcztcXG51bmlmb3JtIGZsb2F0IG1ldGFsbmVzcztcXG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XFxuI2lmbmRlZiBTVEFOREFSRFxcblxcdHVuaWZvcm0gZmxvYXQgY2xlYXJDb2F0O1xcblxcdHVuaWZvcm0gZmxvYXQgY2xlYXJDb2F0Um91Z2huZXNzO1xcbiNlbmRpZlxcbnZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xcbiNpZm5kZWYgRkxBVF9TSEFERURcXG5cXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcXG4jZW5kaWZcXG4jaW5jbHVkZSA8Y29tbW9uPlxcbiNpbmNsdWRlIDxwYWNraW5nPlxcbiNpbmNsdWRlIDxkaXRoZXJpbmdfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8Y29sb3JfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8dXZfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8dXYyX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPG1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxhbHBoYW1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxhb21hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxsaWdodG1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxlbWlzc2l2ZW1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxlbnZtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGJzZGZzPlxcbiNpbmNsdWRlIDxjdWJlX3V2X3JlZmxlY3Rpb25fZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGxpZ2h0c19wYXJzX2JlZ2luPlxcbiNpbmNsdWRlIDxsaWdodHNfcGFyc19tYXBzPlxcbiNpbmNsdWRlIDxsaWdodHNfcGh5c2ljYWxfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGJ1bXBtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bm9ybWFsbWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHJvdWdobmVzc21hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxtZXRhbG5lc3NtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+XFxudm9pZCBtYWluKCkge1xcblxcdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+XFxuXFx0dmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7XFxuXFx0UmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgPSBSZWZsZWN0ZWRMaWdodCggdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICkgKTtcXG5cXHR2ZWMzIHRvdGFsRW1pc3NpdmVSYWRpYW5jZSA9IGVtaXNzaXZlO1xcblxcdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8bWFwX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxjb2xvcl9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8YWxwaGFtYXBfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGFscGhhdGVzdF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8cm91Z2huZXNzbWFwX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxtZXRhbG5lc3NtYXBfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudF9iZWdpbj5cXG5cXHQjaW5jbHVkZSA8bm9ybWFsX2ZyYWdtZW50X21hcHM+XFxuXFx0I2luY2x1ZGUgPGVtaXNzaXZlbWFwX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxsaWdodHNfcGh5c2ljYWxfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGxpZ2h0c19mcmFnbWVudF9iZWdpbj5cXG5cXHQjaW5jbHVkZSA8bGlnaHRzX2ZyYWdtZW50X21hcHM+XFxuXFx0I2luY2x1ZGUgPGxpZ2h0c19mcmFnbWVudF9lbmQ+XFxuXFx0I2luY2x1ZGUgPGFvbWFwX2ZyYWdtZW50PlxcblxcdHZlYzMgb3V0Z29pbmdMaWdodCA9IHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKyByZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArIHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0U3BlY3VsYXIgKyB0b3RhbEVtaXNzaXZlUmFkaWFuY2U7XFxuXFx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggb3V0Z29pbmdMaWdodCwgZGlmZnVzZUNvbG9yLmEgKTtcXG5cXHQjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGVuY29kaW5nc19mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8Zm9nX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxkaXRoZXJpbmdfZnJhZ21lbnQ+XFxufVxcblwiO1xuXG52YXIgbWVzaHBoeXNpY2FsX3ZlcnQgPSBcIiNkZWZpbmUgUEhZU0lDQUxcXG52YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcXG4jaWZuZGVmIEZMQVRfU0hBREVEXFxuXFx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XFxuI2VuZGlmXFxuI2luY2x1ZGUgPGNvbW1vbj5cXG4jaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPHV2Ml9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxjb2xvcl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8Zm9nX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD5cXG52b2lkIG1haW4oKSB7XFxuXFx0I2luY2x1ZGUgPHV2X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8dXYyX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8Y29sb3JfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxiZWdpbm5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPG1vcnBobm9ybWFsX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8ZGVmYXVsdG5vcm1hbF92ZXJ0ZXg+XFxuI2lmbmRlZiBGTEFUX1NIQURFRFxcblxcdHZOb3JtYWwgPSBub3JtYWxpemUoIHRyYW5zZm9ybWVkTm9ybWFsICk7XFxuI2VuZGlmXFxuXFx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+XFxuXFx0dlZpZXdQb3NpdGlvbiA9IC0gbXZQb3NpdGlvbi54eXo7XFxuXFx0I2luY2x1ZGUgPHdvcmxkcG9zX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2hhZG93bWFwX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8Zm9nX3ZlcnRleD5cXG59XFxuXCI7XG5cbnZhciBub3JtYWxfZnJhZyA9IFwiI2RlZmluZSBOT1JNQUxcXG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XFxuI2lmIGRlZmluZWQoIEZMQVRfU0hBREVEICkgfHwgZGVmaW5lZCggVVNFX0JVTVBNQVAgKSB8fCBkZWZpbmVkKCBVU0VfTk9STUFMTUFQIClcXG5cXHR2YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcXG4jZW5kaWZcXG4jaWZuZGVmIEZMQVRfU0hBREVEXFxuXFx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XFxuI2VuZGlmXFxuI2luY2x1ZGUgPHBhY2tpbmc+XFxuI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGJ1bXBtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bm9ybWFsbWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+XFxudm9pZCBtYWluKCkge1xcblxcdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8bm9ybWFsX2ZyYWdtZW50X2JlZ2luPlxcblxcdCNpbmNsdWRlIDxub3JtYWxfZnJhZ21lbnRfbWFwcz5cXG5cXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KCBwYWNrTm9ybWFsVG9SR0IoIG5vcm1hbCApLCBvcGFjaXR5ICk7XFxufVxcblwiO1xuXG52YXIgbm9ybWFsX3ZlcnQgPSBcIiNkZWZpbmUgTk9STUFMXFxuI2lmIGRlZmluZWQoIEZMQVRfU0hBREVEICkgfHwgZGVmaW5lZCggVVNFX0JVTVBNQVAgKSB8fCBkZWZpbmVkKCBVU0VfTk9STUFMTUFQIClcXG5cXHR2YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcXG4jZW5kaWZcXG4jaWZuZGVmIEZMQVRfU0hBREVEXFxuXFx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XFxuI2VuZGlmXFxuI2luY2x1ZGUgPHV2X3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxza2lubmluZ19wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg+XFxudm9pZCBtYWluKCkge1xcblxcdCNpbmNsdWRlIDx1dl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGJlZ2lubm9ybWFsX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bW9ycGhub3JtYWxfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2luYmFzZV92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNraW5ub3JtYWxfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxkZWZhdWx0bm9ybWFsX3ZlcnRleD5cXG4jaWZuZGVmIEZMQVRfU0hBREVEXFxuXFx0dk5vcm1hbCA9IG5vcm1hbGl6ZSggdHJhbnNmb3JtZWROb3JtYWwgKTtcXG4jZW5kaWZcXG5cXHQjaW5jbHVkZSA8YmVnaW5fdmVydGV4PlxcblxcdCNpbmNsdWRlIDxtb3JwaHRhcmdldF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNraW5uaW5nX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD5cXG4jaWYgZGVmaW5lZCggRkxBVF9TSEFERUQgKSB8fCBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFVTRV9OT1JNQUxNQVAgKVxcblxcdHZWaWV3UG9zaXRpb24gPSAtIG12UG9zaXRpb24ueHl6O1xcbiNlbmRpZlxcbn1cXG5cIjtcblxudmFyIHBvaW50c19mcmFnID0gXCJ1bmlmb3JtIHZlYzMgZGlmZnVzZTtcXG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XFxuI2luY2x1ZGUgPGNvbW1vbj5cXG4jaW5jbHVkZSA8cGFja2luZz5cXG4jaW5jbHVkZSA8Y29sb3JfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bWFwX3BhcnRpY2xlX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGZvZ19wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+XFxudm9pZCBtYWluKCkge1xcblxcdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+XFxuXFx0dmVjMyBvdXRnb2luZ0xpZ2h0ID0gdmVjMyggMC4wICk7XFxuXFx0dmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7XFxuXFx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxtYXBfcGFydGljbGVfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGNvbG9yX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+XFxuXFx0b3V0Z29pbmdMaWdodCA9IGRpZmZ1c2VDb2xvci5yZ2I7XFxuXFx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggb3V0Z29pbmdMaWdodCwgZGlmZnVzZUNvbG9yLmEgKTtcXG5cXHQjaW5jbHVkZSA8cHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGVuY29kaW5nc19mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8Zm9nX2ZyYWdtZW50Plxcbn1cXG5cIjtcblxudmFyIHBvaW50c192ZXJ0ID0gXCJ1bmlmb3JtIGZsb2F0IHNpemU7XFxudW5pZm9ybSBmbG9hdCBzY2FsZTtcXG4jaW5jbHVkZSA8Y29tbW9uPlxcbiNpbmNsdWRlIDxjb2xvcl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8Zm9nX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+XFxudm9pZCBtYWluKCkge1xcblxcdCNpbmNsdWRlIDxjb2xvcl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XFxuXFx0I2lmZGVmIFVTRV9TSVpFQVRURU5VQVRJT05cXG5cXHRcXHRnbF9Qb2ludFNpemUgPSBzaXplICogKCBzY2FsZSAvIC0gbXZQb3NpdGlvbi56ICk7XFxuXFx0I2Vsc2VcXG5cXHRcXHRnbF9Qb2ludFNpemUgPSBzaXplO1xcblxcdCNlbmRpZlxcblxcdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHdvcmxkcG9zX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2hhZG93bWFwX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8Zm9nX3ZlcnRleD5cXG59XFxuXCI7XG5cbnZhciBzaGFkb3dfZnJhZyA9IFwidW5pZm9ybSB2ZWMzIGNvbG9yO1xcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcXG4jaW5jbHVkZSA8Y29tbW9uPlxcbiNpbmNsdWRlIDxwYWNraW5nPlxcbiNpbmNsdWRlIDxmb2dfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8YnNkZnM+XFxuI2luY2x1ZGUgPGxpZ2h0c19wYXJzX2JlZ2luPlxcbiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8c2hhZG93bWFza19wYXJzX2ZyYWdtZW50PlxcbnZvaWQgbWFpbigpIHtcXG5cXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KCBjb2xvciwgb3BhY2l0eSAqICggMS4wIC0gZ2V0U2hhZG93TWFzaygpICkgKTtcXG5cXHQjaW5jbHVkZSA8Zm9nX2ZyYWdtZW50Plxcbn1cXG5cIjtcblxudmFyIHNoYWRvd192ZXJ0ID0gXCIjaW5jbHVkZSA8Zm9nX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc192ZXJ0ZXg+XFxudm9pZCBtYWluKCkge1xcblxcdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxcblxcdCNpbmNsdWRlIDx3b3JsZHBvc192ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNoYWRvd21hcF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGZvZ192ZXJ0ZXg+XFxufVxcblwiO1xuXG52YXIgU2hhZGVyQ2h1bmsgPSB7XG5cdGFscGhhbWFwX2ZyYWdtZW50OiBhbHBoYW1hcF9mcmFnbWVudCxcblx0YWxwaGFtYXBfcGFyc19mcmFnbWVudDogYWxwaGFtYXBfcGFyc19mcmFnbWVudCxcblx0YWxwaGF0ZXN0X2ZyYWdtZW50OiBhbHBoYXRlc3RfZnJhZ21lbnQsXG5cdGFvbWFwX2ZyYWdtZW50OiBhb21hcF9mcmFnbWVudCxcblx0YW9tYXBfcGFyc19mcmFnbWVudDogYW9tYXBfcGFyc19mcmFnbWVudCxcblx0YmVnaW5fdmVydGV4OiBiZWdpbl92ZXJ0ZXgsXG5cdGJlZ2lubm9ybWFsX3ZlcnRleDogYmVnaW5ub3JtYWxfdmVydGV4LFxuXHRic2RmczogYnNkZnMsXG5cdGJ1bXBtYXBfcGFyc19mcmFnbWVudDogYnVtcG1hcF9wYXJzX2ZyYWdtZW50LFxuXHRjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ6IGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudCxcblx0Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ6IGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50LFxuXHRjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg6IGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleCxcblx0Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleDogY2xpcHBpbmdfcGxhbmVzX3ZlcnRleCxcblx0Y29sb3JfZnJhZ21lbnQ6IGNvbG9yX2ZyYWdtZW50LFxuXHRjb2xvcl9wYXJzX2ZyYWdtZW50OiBjb2xvcl9wYXJzX2ZyYWdtZW50LFxuXHRjb2xvcl9wYXJzX3ZlcnRleDogY29sb3JfcGFyc192ZXJ0ZXgsXG5cdGNvbG9yX3ZlcnRleDogY29sb3JfdmVydGV4LFxuXHRjb21tb246IGNvbW1vbixcblx0Y3ViZV91dl9yZWZsZWN0aW9uX2ZyYWdtZW50OiBjdWJlX3V2X3JlZmxlY3Rpb25fZnJhZ21lbnQsXG5cdGRlZmF1bHRub3JtYWxfdmVydGV4OiBkZWZhdWx0bm9ybWFsX3ZlcnRleCxcblx0ZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4OiBkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXgsXG5cdGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXg6IGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXgsXG5cdGVtaXNzaXZlbWFwX2ZyYWdtZW50OiBlbWlzc2l2ZW1hcF9mcmFnbWVudCxcblx0ZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudDogZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudCxcblx0ZW5jb2RpbmdzX2ZyYWdtZW50OiBlbmNvZGluZ3NfZnJhZ21lbnQsXG5cdGVuY29kaW5nc19wYXJzX2ZyYWdtZW50OiBlbmNvZGluZ3NfcGFyc19mcmFnbWVudCxcblx0ZW52bWFwX2ZyYWdtZW50OiBlbnZtYXBfZnJhZ21lbnQsXG5cdGVudm1hcF9wYXJzX2ZyYWdtZW50OiBlbnZtYXBfcGFyc19mcmFnbWVudCxcblx0ZW52bWFwX3BhcnNfdmVydGV4OiBlbnZtYXBfcGFyc192ZXJ0ZXgsXG5cdGVudm1hcF92ZXJ0ZXg6IGVudm1hcF92ZXJ0ZXgsXG5cdGZvZ192ZXJ0ZXg6IGZvZ192ZXJ0ZXgsXG5cdGZvZ19wYXJzX3ZlcnRleDogZm9nX3BhcnNfdmVydGV4LFxuXHRmb2dfZnJhZ21lbnQ6IGZvZ19mcmFnbWVudCxcblx0Zm9nX3BhcnNfZnJhZ21lbnQ6IGZvZ19wYXJzX2ZyYWdtZW50LFxuXHRncmFkaWVudG1hcF9wYXJzX2ZyYWdtZW50OiBncmFkaWVudG1hcF9wYXJzX2ZyYWdtZW50LFxuXHRsaWdodG1hcF9mcmFnbWVudDogbGlnaHRtYXBfZnJhZ21lbnQsXG5cdGxpZ2h0bWFwX3BhcnNfZnJhZ21lbnQ6IGxpZ2h0bWFwX3BhcnNfZnJhZ21lbnQsXG5cdGxpZ2h0c19sYW1iZXJ0X3ZlcnRleDogbGlnaHRzX2xhbWJlcnRfdmVydGV4LFxuXHRsaWdodHNfcGFyc19iZWdpbjogbGlnaHRzX3BhcnNfYmVnaW4sXG5cdGxpZ2h0c19wYXJzX21hcHM6IGxpZ2h0c19wYXJzX21hcHMsXG5cdGxpZ2h0c19waG9uZ19mcmFnbWVudDogbGlnaHRzX3Bob25nX2ZyYWdtZW50LFxuXHRsaWdodHNfcGhvbmdfcGFyc19mcmFnbWVudDogbGlnaHRzX3Bob25nX3BhcnNfZnJhZ21lbnQsXG5cdGxpZ2h0c19waHlzaWNhbF9mcmFnbWVudDogbGlnaHRzX3BoeXNpY2FsX2ZyYWdtZW50LFxuXHRsaWdodHNfcGh5c2ljYWxfcGFyc19mcmFnbWVudDogbGlnaHRzX3BoeXNpY2FsX3BhcnNfZnJhZ21lbnQsXG5cdGxpZ2h0c19mcmFnbWVudF9iZWdpbjogbGlnaHRzX2ZyYWdtZW50X2JlZ2luLFxuXHRsaWdodHNfZnJhZ21lbnRfbWFwczogbGlnaHRzX2ZyYWdtZW50X21hcHMsXG5cdGxpZ2h0c19mcmFnbWVudF9lbmQ6IGxpZ2h0c19mcmFnbWVudF9lbmQsXG5cdGxvZ2RlcHRoYnVmX2ZyYWdtZW50OiBsb2dkZXB0aGJ1Zl9mcmFnbWVudCxcblx0bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudDogbG9nZGVwdGhidWZfcGFyc19mcmFnbWVudCxcblx0bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg6IGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4LFxuXHRsb2dkZXB0aGJ1Zl92ZXJ0ZXg6IGxvZ2RlcHRoYnVmX3ZlcnRleCxcblx0bWFwX2ZyYWdtZW50OiBtYXBfZnJhZ21lbnQsXG5cdG1hcF9wYXJzX2ZyYWdtZW50OiBtYXBfcGFyc19mcmFnbWVudCxcblx0bWFwX3BhcnRpY2xlX2ZyYWdtZW50OiBtYXBfcGFydGljbGVfZnJhZ21lbnQsXG5cdG1hcF9wYXJ0aWNsZV9wYXJzX2ZyYWdtZW50OiBtYXBfcGFydGljbGVfcGFyc19mcmFnbWVudCxcblx0bWV0YWxuZXNzbWFwX2ZyYWdtZW50OiBtZXRhbG5lc3NtYXBfZnJhZ21lbnQsXG5cdG1ldGFsbmVzc21hcF9wYXJzX2ZyYWdtZW50OiBtZXRhbG5lc3NtYXBfcGFyc19mcmFnbWVudCxcblx0bW9ycGhub3JtYWxfdmVydGV4OiBtb3JwaG5vcm1hbF92ZXJ0ZXgsXG5cdG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4OiBtb3JwaHRhcmdldF9wYXJzX3ZlcnRleCxcblx0bW9ycGh0YXJnZXRfdmVydGV4OiBtb3JwaHRhcmdldF92ZXJ0ZXgsXG5cdG5vcm1hbF9mcmFnbWVudF9iZWdpbjogbm9ybWFsX2ZyYWdtZW50X2JlZ2luLFxuXHRub3JtYWxfZnJhZ21lbnRfbWFwczogbm9ybWFsX2ZyYWdtZW50X21hcHMsXG5cdG5vcm1hbG1hcF9wYXJzX2ZyYWdtZW50OiBub3JtYWxtYXBfcGFyc19mcmFnbWVudCxcblx0cGFja2luZzogcGFja2luZyxcblx0cHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudDogcHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudCxcblx0cHJvamVjdF92ZXJ0ZXg6IHByb2plY3RfdmVydGV4LFxuXHRkaXRoZXJpbmdfZnJhZ21lbnQ6IGRpdGhlcmluZ19mcmFnbWVudCxcblx0ZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnQ6IGRpdGhlcmluZ19wYXJzX2ZyYWdtZW50LFxuXHRyb3VnaG5lc3NtYXBfZnJhZ21lbnQ6IHJvdWdobmVzc21hcF9mcmFnbWVudCxcblx0cm91Z2huZXNzbWFwX3BhcnNfZnJhZ21lbnQ6IHJvdWdobmVzc21hcF9wYXJzX2ZyYWdtZW50LFxuXHRzaGFkb3dtYXBfcGFyc19mcmFnbWVudDogc2hhZG93bWFwX3BhcnNfZnJhZ21lbnQsXG5cdHNoYWRvd21hcF9wYXJzX3ZlcnRleDogc2hhZG93bWFwX3BhcnNfdmVydGV4LFxuXHRzaGFkb3dtYXBfdmVydGV4OiBzaGFkb3dtYXBfdmVydGV4LFxuXHRzaGFkb3dtYXNrX3BhcnNfZnJhZ21lbnQ6IHNoYWRvd21hc2tfcGFyc19mcmFnbWVudCxcblx0c2tpbmJhc2VfdmVydGV4OiBza2luYmFzZV92ZXJ0ZXgsXG5cdHNraW5uaW5nX3BhcnNfdmVydGV4OiBza2lubmluZ19wYXJzX3ZlcnRleCxcblx0c2tpbm5pbmdfdmVydGV4OiBza2lubmluZ192ZXJ0ZXgsXG5cdHNraW5ub3JtYWxfdmVydGV4OiBza2lubm9ybWFsX3ZlcnRleCxcblx0c3BlY3VsYXJtYXBfZnJhZ21lbnQ6IHNwZWN1bGFybWFwX2ZyYWdtZW50LFxuXHRzcGVjdWxhcm1hcF9wYXJzX2ZyYWdtZW50OiBzcGVjdWxhcm1hcF9wYXJzX2ZyYWdtZW50LFxuXHR0b25lbWFwcGluZ19mcmFnbWVudDogdG9uZW1hcHBpbmdfZnJhZ21lbnQsXG5cdHRvbmVtYXBwaW5nX3BhcnNfZnJhZ21lbnQ6IHRvbmVtYXBwaW5nX3BhcnNfZnJhZ21lbnQsXG5cdHV2X3BhcnNfZnJhZ21lbnQ6IHV2X3BhcnNfZnJhZ21lbnQsXG5cdHV2X3BhcnNfdmVydGV4OiB1dl9wYXJzX3ZlcnRleCxcblx0dXZfdmVydGV4OiB1dl92ZXJ0ZXgsXG5cdHV2Ml9wYXJzX2ZyYWdtZW50OiB1djJfcGFyc19mcmFnbWVudCxcblx0dXYyX3BhcnNfdmVydGV4OiB1djJfcGFyc192ZXJ0ZXgsXG5cdHV2Ml92ZXJ0ZXg6IHV2Ml92ZXJ0ZXgsXG5cdHdvcmxkcG9zX3ZlcnRleDogd29ybGRwb3NfdmVydGV4LFxuXG5cdGN1YmVfZnJhZzogY3ViZV9mcmFnLFxuXHRjdWJlX3ZlcnQ6IGN1YmVfdmVydCxcblx0ZGVwdGhfZnJhZzogZGVwdGhfZnJhZyxcblx0ZGVwdGhfdmVydDogZGVwdGhfdmVydCxcblx0ZGlzdGFuY2VSR0JBX2ZyYWc6IGRpc3RhbmNlUkdCQV9mcmFnLFxuXHRkaXN0YW5jZVJHQkFfdmVydDogZGlzdGFuY2VSR0JBX3ZlcnQsXG5cdGVxdWlyZWN0X2ZyYWc6IGVxdWlyZWN0X2ZyYWcsXG5cdGVxdWlyZWN0X3ZlcnQ6IGVxdWlyZWN0X3ZlcnQsXG5cdGxpbmVkYXNoZWRfZnJhZzogbGluZWRhc2hlZF9mcmFnLFxuXHRsaW5lZGFzaGVkX3ZlcnQ6IGxpbmVkYXNoZWRfdmVydCxcblx0bWVzaGJhc2ljX2ZyYWc6IG1lc2hiYXNpY19mcmFnLFxuXHRtZXNoYmFzaWNfdmVydDogbWVzaGJhc2ljX3ZlcnQsXG5cdG1lc2hsYW1iZXJ0X2ZyYWc6IG1lc2hsYW1iZXJ0X2ZyYWcsXG5cdG1lc2hsYW1iZXJ0X3ZlcnQ6IG1lc2hsYW1iZXJ0X3ZlcnQsXG5cdG1lc2hwaG9uZ19mcmFnOiBtZXNocGhvbmdfZnJhZyxcblx0bWVzaHBob25nX3ZlcnQ6IG1lc2hwaG9uZ192ZXJ0LFxuXHRtZXNocGh5c2ljYWxfZnJhZzogbWVzaHBoeXNpY2FsX2ZyYWcsXG5cdG1lc2hwaHlzaWNhbF92ZXJ0OiBtZXNocGh5c2ljYWxfdmVydCxcblx0bm9ybWFsX2ZyYWc6IG5vcm1hbF9mcmFnLFxuXHRub3JtYWxfdmVydDogbm9ybWFsX3ZlcnQsXG5cdHBvaW50c19mcmFnOiBwb2ludHNfZnJhZyxcblx0cG9pbnRzX3ZlcnQ6IHBvaW50c192ZXJ0LFxuXHRzaGFkb3dfZnJhZzogc2hhZG93X2ZyYWcsXG5cdHNoYWRvd192ZXJ0OiBzaGFkb3dfdmVydFxufTtcblxuLyoqXG4gKiBVbmlmb3JtIFV0aWxpdGllc1xuICovXG5cbnZhciBVbmlmb3Jtc1V0aWxzID0ge1xuXG5cdG1lcmdlOiBmdW5jdGlvbiAoIHVuaWZvcm1zICkge1xuXG5cdFx0dmFyIG1lcmdlZCA9IHt9O1xuXG5cdFx0Zm9yICggdmFyIHUgPSAwOyB1IDwgdW5pZm9ybXMubGVuZ3RoOyB1ICsrICkge1xuXG5cdFx0XHR2YXIgdG1wID0gdGhpcy5jbG9uZSggdW5pZm9ybXNbIHUgXSApO1xuXG5cdFx0XHRmb3IgKCB2YXIgcCBpbiB0bXAgKSB7XG5cblx0XHRcdFx0bWVyZ2VkWyBwIF0gPSB0bXBbIHAgXTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIG1lcmdlZDtcblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoIHVuaWZvcm1zX3NyYyApIHtcblxuXHRcdHZhciB1bmlmb3Jtc19kc3QgPSB7fTtcblxuXHRcdGZvciAoIHZhciB1IGluIHVuaWZvcm1zX3NyYyApIHtcblxuXHRcdFx0dW5pZm9ybXNfZHN0WyB1IF0gPSB7fTtcblxuXHRcdFx0Zm9yICggdmFyIHAgaW4gdW5pZm9ybXNfc3JjWyB1IF0gKSB7XG5cblx0XHRcdFx0dmFyIHBhcmFtZXRlcl9zcmMgPSB1bmlmb3Jtc19zcmNbIHUgXVsgcCBdO1xuXG5cdFx0XHRcdGlmICggcGFyYW1ldGVyX3NyYyAmJiAoIHBhcmFtZXRlcl9zcmMuaXNDb2xvciB8fFxuXHRcdFx0XHRcdHBhcmFtZXRlcl9zcmMuaXNNYXRyaXgzIHx8IHBhcmFtZXRlcl9zcmMuaXNNYXRyaXg0IHx8XG5cdFx0XHRcdFx0cGFyYW1ldGVyX3NyYy5pc1ZlY3RvcjIgfHwgcGFyYW1ldGVyX3NyYy5pc1ZlY3RvcjMgfHwgcGFyYW1ldGVyX3NyYy5pc1ZlY3RvcjQgfHxcblx0XHRcdFx0XHRwYXJhbWV0ZXJfc3JjLmlzVGV4dHVyZSApICkge1xuXG5cdFx0XHRcdFx0dW5pZm9ybXNfZHN0WyB1IF1bIHAgXSA9IHBhcmFtZXRlcl9zcmMuY2xvbmUoKTtcblxuXHRcdFx0XHR9IGVsc2UgaWYgKCBBcnJheS5pc0FycmF5KCBwYXJhbWV0ZXJfc3JjICkgKSB7XG5cblx0XHRcdFx0XHR1bmlmb3Jtc19kc3RbIHUgXVsgcCBdID0gcGFyYW1ldGVyX3NyYy5zbGljZSgpO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHR1bmlmb3Jtc19kc3RbIHUgXVsgcCBdID0gcGFyYW1ldGVyX3NyYztcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiB1bmlmb3Jtc19kc3Q7XG5cblx0fVxuXG59O1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxudmFyIENvbG9yS2V5d29yZHMgPSB7ICdhbGljZWJsdWUnOiAweEYwRjhGRiwgJ2FudGlxdWV3aGl0ZSc6IDB4RkFFQkQ3LCAnYXF1YSc6IDB4MDBGRkZGLCAnYXF1YW1hcmluZSc6IDB4N0ZGRkQ0LCAnYXp1cmUnOiAweEYwRkZGRixcblx0J2JlaWdlJzogMHhGNUY1REMsICdiaXNxdWUnOiAweEZGRTRDNCwgJ2JsYWNrJzogMHgwMDAwMDAsICdibGFuY2hlZGFsbW9uZCc6IDB4RkZFQkNELCAnYmx1ZSc6IDB4MDAwMEZGLCAnYmx1ZXZpb2xldCc6IDB4OEEyQkUyLFxuXHQnYnJvd24nOiAweEE1MkEyQSwgJ2J1cmx5d29vZCc6IDB4REVCODg3LCAnY2FkZXRibHVlJzogMHg1RjlFQTAsICdjaGFydHJldXNlJzogMHg3RkZGMDAsICdjaG9jb2xhdGUnOiAweEQyNjkxRSwgJ2NvcmFsJzogMHhGRjdGNTAsXG5cdCdjb3JuZmxvd2VyYmx1ZSc6IDB4NjQ5NUVELCAnY29ybnNpbGsnOiAweEZGRjhEQywgJ2NyaW1zb24nOiAweERDMTQzQywgJ2N5YW4nOiAweDAwRkZGRiwgJ2RhcmtibHVlJzogMHgwMDAwOEIsICdkYXJrY3lhbic6IDB4MDA4QjhCLFxuXHQnZGFya2dvbGRlbnJvZCc6IDB4Qjg4NjBCLCAnZGFya2dyYXknOiAweEE5QTlBOSwgJ2RhcmtncmVlbic6IDB4MDA2NDAwLCAnZGFya2dyZXknOiAweEE5QTlBOSwgJ2RhcmtraGFraSc6IDB4QkRCNzZCLCAnZGFya21hZ2VudGEnOiAweDhCMDA4Qixcblx0J2RhcmtvbGl2ZWdyZWVuJzogMHg1NTZCMkYsICdkYXJrb3JhbmdlJzogMHhGRjhDMDAsICdkYXJrb3JjaGlkJzogMHg5OTMyQ0MsICdkYXJrcmVkJzogMHg4QjAwMDAsICdkYXJrc2FsbW9uJzogMHhFOTk2N0EsICdkYXJrc2VhZ3JlZW4nOiAweDhGQkM4Rixcblx0J2RhcmtzbGF0ZWJsdWUnOiAweDQ4M0Q4QiwgJ2RhcmtzbGF0ZWdyYXknOiAweDJGNEY0RiwgJ2RhcmtzbGF0ZWdyZXknOiAweDJGNEY0RiwgJ2Rhcmt0dXJxdW9pc2UnOiAweDAwQ0VEMSwgJ2Rhcmt2aW9sZXQnOiAweDk0MDBEMyxcblx0J2RlZXBwaW5rJzogMHhGRjE0OTMsICdkZWVwc2t5Ymx1ZSc6IDB4MDBCRkZGLCAnZGltZ3JheSc6IDB4Njk2OTY5LCAnZGltZ3JleSc6IDB4Njk2OTY5LCAnZG9kZ2VyYmx1ZSc6IDB4MUU5MEZGLCAnZmlyZWJyaWNrJzogMHhCMjIyMjIsXG5cdCdmbG9yYWx3aGl0ZSc6IDB4RkZGQUYwLCAnZm9yZXN0Z3JlZW4nOiAweDIyOEIyMiwgJ2Z1Y2hzaWEnOiAweEZGMDBGRiwgJ2dhaW5zYm9ybyc6IDB4RENEQ0RDLCAnZ2hvc3R3aGl0ZSc6IDB4RjhGOEZGLCAnZ29sZCc6IDB4RkZENzAwLFxuXHQnZ29sZGVucm9kJzogMHhEQUE1MjAsICdncmF5JzogMHg4MDgwODAsICdncmVlbic6IDB4MDA4MDAwLCAnZ3JlZW55ZWxsb3cnOiAweEFERkYyRiwgJ2dyZXknOiAweDgwODA4MCwgJ2hvbmV5ZGV3JzogMHhGMEZGRjAsICdob3RwaW5rJzogMHhGRjY5QjQsXG5cdCdpbmRpYW5yZWQnOiAweENENUM1QywgJ2luZGlnbyc6IDB4NEIwMDgyLCAnaXZvcnknOiAweEZGRkZGMCwgJ2toYWtpJzogMHhGMEU2OEMsICdsYXZlbmRlcic6IDB4RTZFNkZBLCAnbGF2ZW5kZXJibHVzaCc6IDB4RkZGMEY1LCAnbGF3bmdyZWVuJzogMHg3Q0ZDMDAsXG5cdCdsZW1vbmNoaWZmb24nOiAweEZGRkFDRCwgJ2xpZ2h0Ymx1ZSc6IDB4QUREOEU2LCAnbGlnaHRjb3JhbCc6IDB4RjA4MDgwLCAnbGlnaHRjeWFuJzogMHhFMEZGRkYsICdsaWdodGdvbGRlbnJvZHllbGxvdyc6IDB4RkFGQUQyLCAnbGlnaHRncmF5JzogMHhEM0QzRDMsXG5cdCdsaWdodGdyZWVuJzogMHg5MEVFOTAsICdsaWdodGdyZXknOiAweEQzRDNEMywgJ2xpZ2h0cGluayc6IDB4RkZCNkMxLCAnbGlnaHRzYWxtb24nOiAweEZGQTA3QSwgJ2xpZ2h0c2VhZ3JlZW4nOiAweDIwQjJBQSwgJ2xpZ2h0c2t5Ymx1ZSc6IDB4ODdDRUZBLFxuXHQnbGlnaHRzbGF0ZWdyYXknOiAweDc3ODg5OSwgJ2xpZ2h0c2xhdGVncmV5JzogMHg3Nzg4OTksICdsaWdodHN0ZWVsYmx1ZSc6IDB4QjBDNERFLCAnbGlnaHR5ZWxsb3cnOiAweEZGRkZFMCwgJ2xpbWUnOiAweDAwRkYwMCwgJ2xpbWVncmVlbic6IDB4MzJDRDMyLFxuXHQnbGluZW4nOiAweEZBRjBFNiwgJ21hZ2VudGEnOiAweEZGMDBGRiwgJ21hcm9vbic6IDB4ODAwMDAwLCAnbWVkaXVtYXF1YW1hcmluZSc6IDB4NjZDREFBLCAnbWVkaXVtYmx1ZSc6IDB4MDAwMENELCAnbWVkaXVtb3JjaGlkJzogMHhCQTU1RDMsXG5cdCdtZWRpdW1wdXJwbGUnOiAweDkzNzBEQiwgJ21lZGl1bXNlYWdyZWVuJzogMHgzQ0IzNzEsICdtZWRpdW1zbGF0ZWJsdWUnOiAweDdCNjhFRSwgJ21lZGl1bXNwcmluZ2dyZWVuJzogMHgwMEZBOUEsICdtZWRpdW10dXJxdW9pc2UnOiAweDQ4RDFDQyxcblx0J21lZGl1bXZpb2xldHJlZCc6IDB4QzcxNTg1LCAnbWlkbmlnaHRibHVlJzogMHgxOTE5NzAsICdtaW50Y3JlYW0nOiAweEY1RkZGQSwgJ21pc3R5cm9zZSc6IDB4RkZFNEUxLCAnbW9jY2FzaW4nOiAweEZGRTRCNSwgJ25hdmFqb3doaXRlJzogMHhGRkRFQUQsXG5cdCduYXZ5JzogMHgwMDAwODAsICdvbGRsYWNlJzogMHhGREY1RTYsICdvbGl2ZSc6IDB4ODA4MDAwLCAnb2xpdmVkcmFiJzogMHg2QjhFMjMsICdvcmFuZ2UnOiAweEZGQTUwMCwgJ29yYW5nZXJlZCc6IDB4RkY0NTAwLCAnb3JjaGlkJzogMHhEQTcwRDYsXG5cdCdwYWxlZ29sZGVucm9kJzogMHhFRUU4QUEsICdwYWxlZ3JlZW4nOiAweDk4RkI5OCwgJ3BhbGV0dXJxdW9pc2UnOiAweEFGRUVFRSwgJ3BhbGV2aW9sZXRyZWQnOiAweERCNzA5MywgJ3BhcGF5YXdoaXAnOiAweEZGRUZENSwgJ3BlYWNocHVmZic6IDB4RkZEQUI5LFxuXHQncGVydSc6IDB4Q0Q4NTNGLCAncGluayc6IDB4RkZDMENCLCAncGx1bSc6IDB4RERBMERELCAncG93ZGVyYmx1ZSc6IDB4QjBFMEU2LCAncHVycGxlJzogMHg4MDAwODAsICdyZWJlY2NhcHVycGxlJzogMHg2NjMzOTksICdyZWQnOiAweEZGMDAwMCwgJ3Jvc3licm93bic6IDB4QkM4RjhGLFxuXHQncm95YWxibHVlJzogMHg0MTY5RTEsICdzYWRkbGVicm93bic6IDB4OEI0NTEzLCAnc2FsbW9uJzogMHhGQTgwNzIsICdzYW5keWJyb3duJzogMHhGNEE0NjAsICdzZWFncmVlbic6IDB4MkU4QjU3LCAnc2Vhc2hlbGwnOiAweEZGRjVFRSxcblx0J3NpZW5uYSc6IDB4QTA1MjJELCAnc2lsdmVyJzogMHhDMEMwQzAsICdza3libHVlJzogMHg4N0NFRUIsICdzbGF0ZWJsdWUnOiAweDZBNUFDRCwgJ3NsYXRlZ3JheSc6IDB4NzA4MDkwLCAnc2xhdGVncmV5JzogMHg3MDgwOTAsICdzbm93JzogMHhGRkZBRkEsXG5cdCdzcHJpbmdncmVlbic6IDB4MDBGRjdGLCAnc3RlZWxibHVlJzogMHg0NjgyQjQsICd0YW4nOiAweEQyQjQ4QywgJ3RlYWwnOiAweDAwODA4MCwgJ3RoaXN0bGUnOiAweEQ4QkZEOCwgJ3RvbWF0byc6IDB4RkY2MzQ3LCAndHVycXVvaXNlJzogMHg0MEUwRDAsXG5cdCd2aW9sZXQnOiAweEVFODJFRSwgJ3doZWF0JzogMHhGNURFQjMsICd3aGl0ZSc6IDB4RkZGRkZGLCAnd2hpdGVzbW9rZSc6IDB4RjVGNUY1LCAneWVsbG93JzogMHhGRkZGMDAsICd5ZWxsb3dncmVlbic6IDB4OUFDRDMyIH07XG5cbmZ1bmN0aW9uIENvbG9yKCByLCBnLCBiICkge1xuXG5cdGlmICggZyA9PT0gdW5kZWZpbmVkICYmIGIgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdC8vIHIgaXMgVEhSRUUuQ29sb3IsIGhleCBvciBzdHJpbmdcblx0XHRyZXR1cm4gdGhpcy5zZXQoIHIgKTtcblxuXHR9XG5cblx0cmV0dXJuIHRoaXMuc2V0UkdCKCByLCBnLCBiICk7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggQ29sb3IucHJvdG90eXBlLCB7XG5cblx0aXNDb2xvcjogdHJ1ZSxcblxuXHRyOiAxLCBnOiAxLCBiOiAxLFxuXG5cdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdGlmICggdmFsdWUgJiYgdmFsdWUuaXNDb2xvciApIHtcblxuXHRcdFx0dGhpcy5jb3B5KCB2YWx1ZSApO1xuXG5cdFx0fSBlbHNlIGlmICggdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyApIHtcblxuXHRcdFx0dGhpcy5zZXRIZXgoIHZhbHVlICk7XG5cblx0XHR9IGVsc2UgaWYgKCB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICkge1xuXG5cdFx0XHR0aGlzLnNldFN0eWxlKCB2YWx1ZSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRTY2FsYXI6IGZ1bmN0aW9uICggc2NhbGFyICkge1xuXG5cdFx0dGhpcy5yID0gc2NhbGFyO1xuXHRcdHRoaXMuZyA9IHNjYWxhcjtcblx0XHR0aGlzLmIgPSBzY2FsYXI7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEhleDogZnVuY3Rpb24gKCBoZXggKSB7XG5cblx0XHRoZXggPSBNYXRoLmZsb29yKCBoZXggKTtcblxuXHRcdHRoaXMuciA9ICggaGV4ID4+IDE2ICYgMjU1ICkgLyAyNTU7XG5cdFx0dGhpcy5nID0gKCBoZXggPj4gOCAmIDI1NSApIC8gMjU1O1xuXHRcdHRoaXMuYiA9ICggaGV4ICYgMjU1ICkgLyAyNTU7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFJHQjogZnVuY3Rpb24gKCByLCBnLCBiICkge1xuXG5cdFx0dGhpcy5yID0gcjtcblx0XHR0aGlzLmcgPSBnO1xuXHRcdHRoaXMuYiA9IGI7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEhTTDogZnVuY3Rpb24gKCkge1xuXG5cdFx0ZnVuY3Rpb24gaHVlMnJnYiggcCwgcSwgdCApIHtcblxuXHRcdFx0aWYgKCB0IDwgMCApIHQgKz0gMTtcblx0XHRcdGlmICggdCA+IDEgKSB0IC09IDE7XG5cdFx0XHRpZiAoIHQgPCAxIC8gNiApIHJldHVybiBwICsgKCBxIC0gcCApICogNiAqIHQ7XG5cdFx0XHRpZiAoIHQgPCAxIC8gMiApIHJldHVybiBxO1xuXHRcdFx0aWYgKCB0IDwgMiAvIDMgKSByZXR1cm4gcCArICggcSAtIHAgKSAqIDYgKiAoIDIgLyAzIC0gdCApO1xuXHRcdFx0cmV0dXJuIHA7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gc2V0SFNMKCBoLCBzLCBsICkge1xuXG5cdFx0XHQvLyBoLHMsbCByYW5nZXMgYXJlIGluIDAuMCAtIDEuMFxuXHRcdFx0aCA9IF9NYXRoLmV1Y2xpZGVhbk1vZHVsbyggaCwgMSApO1xuXHRcdFx0cyA9IF9NYXRoLmNsYW1wKCBzLCAwLCAxICk7XG5cdFx0XHRsID0gX01hdGguY2xhbXAoIGwsIDAsIDEgKTtcblxuXHRcdFx0aWYgKCBzID09PSAwICkge1xuXG5cdFx0XHRcdHRoaXMuciA9IHRoaXMuZyA9IHRoaXMuYiA9IGw7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0dmFyIHAgPSBsIDw9IDAuNSA/IGwgKiAoIDEgKyBzICkgOiBsICsgcyAtICggbCAqIHMgKTtcblx0XHRcdFx0dmFyIHEgPSAoIDIgKiBsICkgLSBwO1xuXG5cdFx0XHRcdHRoaXMuciA9IGh1ZTJyZ2IoIHEsIHAsIGggKyAxIC8gMyApO1xuXHRcdFx0XHR0aGlzLmcgPSBodWUycmdiKCBxLCBwLCBoICk7XG5cdFx0XHRcdHRoaXMuYiA9IGh1ZTJyZ2IoIHEsIHAsIGggLSAxIC8gMyApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0c2V0U3R5bGU6IGZ1bmN0aW9uICggc3R5bGUgKSB7XG5cblx0XHRmdW5jdGlvbiBoYW5kbGVBbHBoYSggc3RyaW5nICkge1xuXG5cdFx0XHRpZiAoIHN0cmluZyA9PT0gdW5kZWZpbmVkICkgcmV0dXJuO1xuXG5cdFx0XHRpZiAoIHBhcnNlRmxvYXQoIHN0cmluZyApIDwgMSApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Db2xvcjogQWxwaGEgY29tcG9uZW50IG9mICcgKyBzdHlsZSArICcgd2lsbCBiZSBpZ25vcmVkLicgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cblx0XHR2YXIgbTtcblxuXHRcdGlmICggbSA9IC9eKCg/OnJnYnxoc2wpYT8pXFwoXFxzKihbXlxcKV0qKVxcKS8uZXhlYyggc3R5bGUgKSApIHtcblxuXHRcdFx0Ly8gcmdiIC8gaHNsXG5cblx0XHRcdHZhciBjb2xvcjtcblx0XHRcdHZhciBuYW1lID0gbVsgMSBdO1xuXHRcdFx0dmFyIGNvbXBvbmVudHMgPSBtWyAyIF07XG5cblx0XHRcdHN3aXRjaCAoIG5hbWUgKSB7XG5cblx0XHRcdFx0Y2FzZSAncmdiJzpcblx0XHRcdFx0Y2FzZSAncmdiYSc6XG5cblx0XHRcdFx0XHRpZiAoIGNvbG9yID0gL14oXFxkKylcXHMqLFxccyooXFxkKylcXHMqLFxccyooXFxkKylcXHMqKCxcXHMqKFswLTldKlxcLj9bMC05XSspXFxzKik/JC8uZXhlYyggY29tcG9uZW50cyApICkge1xuXG5cdFx0XHRcdFx0XHQvLyByZ2IoMjU1LDAsMCkgcmdiYSgyNTUsMCwwLDAuNSlcblx0XHRcdFx0XHRcdHRoaXMuciA9IE1hdGgubWluKCAyNTUsIHBhcnNlSW50KCBjb2xvclsgMSBdLCAxMCApICkgLyAyNTU7XG5cdFx0XHRcdFx0XHR0aGlzLmcgPSBNYXRoLm1pbiggMjU1LCBwYXJzZUludCggY29sb3JbIDIgXSwgMTAgKSApIC8gMjU1O1xuXHRcdFx0XHRcdFx0dGhpcy5iID0gTWF0aC5taW4oIDI1NSwgcGFyc2VJbnQoIGNvbG9yWyAzIF0sIDEwICkgKSAvIDI1NTtcblxuXHRcdFx0XHRcdFx0aGFuZGxlQWxwaGEoIGNvbG9yWyA1IF0gKTtcblxuXHRcdFx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoIGNvbG9yID0gL14oXFxkKylcXCVcXHMqLFxccyooXFxkKylcXCVcXHMqLFxccyooXFxkKylcXCVcXHMqKCxcXHMqKFswLTldKlxcLj9bMC05XSspXFxzKik/JC8uZXhlYyggY29tcG9uZW50cyApICkge1xuXG5cdFx0XHRcdFx0XHQvLyByZ2IoMTAwJSwwJSwwJSkgcmdiYSgxMDAlLDAlLDAlLDAuNSlcblx0XHRcdFx0XHRcdHRoaXMuciA9IE1hdGgubWluKCAxMDAsIHBhcnNlSW50KCBjb2xvclsgMSBdLCAxMCApICkgLyAxMDA7XG5cdFx0XHRcdFx0XHR0aGlzLmcgPSBNYXRoLm1pbiggMTAwLCBwYXJzZUludCggY29sb3JbIDIgXSwgMTAgKSApIC8gMTAwO1xuXHRcdFx0XHRcdFx0dGhpcy5iID0gTWF0aC5taW4oIDEwMCwgcGFyc2VJbnQoIGNvbG9yWyAzIF0sIDEwICkgKSAvIDEwMDtcblxuXHRcdFx0XHRcdFx0aGFuZGxlQWxwaGEoIGNvbG9yWyA1IF0gKTtcblxuXHRcdFx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlICdoc2wnOlxuXHRcdFx0XHRjYXNlICdoc2xhJzpcblxuXHRcdFx0XHRcdGlmICggY29sb3IgPSAvXihbMC05XSpcXC4/WzAtOV0rKVxccyosXFxzKihcXGQrKVxcJVxccyosXFxzKihcXGQrKVxcJVxccyooLFxccyooWzAtOV0qXFwuP1swLTldKylcXHMqKT8kLy5leGVjKCBjb21wb25lbnRzICkgKSB7XG5cblx0XHRcdFx0XHRcdC8vIGhzbCgxMjAsNTAlLDUwJSkgaHNsYSgxMjAsNTAlLDUwJSwwLjUpXG5cdFx0XHRcdFx0XHR2YXIgaCA9IHBhcnNlRmxvYXQoIGNvbG9yWyAxIF0gKSAvIDM2MDtcblx0XHRcdFx0XHRcdHZhciBzID0gcGFyc2VJbnQoIGNvbG9yWyAyIF0sIDEwICkgLyAxMDA7XG5cdFx0XHRcdFx0XHR2YXIgbCA9IHBhcnNlSW50KCBjb2xvclsgMyBdLCAxMCApIC8gMTAwO1xuXG5cdFx0XHRcdFx0XHRoYW5kbGVBbHBoYSggY29sb3JbIDUgXSApO1xuXG5cdFx0XHRcdFx0XHRyZXR1cm4gdGhpcy5zZXRIU0woIGgsIHMsIGwgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2UgaWYgKCBtID0gL15cXCMoW0EtRmEtZjAtOV0rKSQvLmV4ZWMoIHN0eWxlICkgKSB7XG5cblx0XHRcdC8vIGhleCBjb2xvclxuXG5cdFx0XHR2YXIgaGV4ID0gbVsgMSBdO1xuXHRcdFx0dmFyIHNpemUgPSBoZXgubGVuZ3RoO1xuXG5cdFx0XHRpZiAoIHNpemUgPT09IDMgKSB7XG5cblx0XHRcdFx0Ly8gI2ZmMFxuXHRcdFx0XHR0aGlzLnIgPSBwYXJzZUludCggaGV4LmNoYXJBdCggMCApICsgaGV4LmNoYXJBdCggMCApLCAxNiApIC8gMjU1O1xuXHRcdFx0XHR0aGlzLmcgPSBwYXJzZUludCggaGV4LmNoYXJBdCggMSApICsgaGV4LmNoYXJBdCggMSApLCAxNiApIC8gMjU1O1xuXHRcdFx0XHR0aGlzLmIgPSBwYXJzZUludCggaGV4LmNoYXJBdCggMiApICsgaGV4LmNoYXJBdCggMiApLCAxNiApIC8gMjU1O1xuXG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBzaXplID09PSA2ICkge1xuXG5cdFx0XHRcdC8vICNmZjAwMDBcblx0XHRcdFx0dGhpcy5yID0gcGFyc2VJbnQoIGhleC5jaGFyQXQoIDAgKSArIGhleC5jaGFyQXQoIDEgKSwgMTYgKSAvIDI1NTtcblx0XHRcdFx0dGhpcy5nID0gcGFyc2VJbnQoIGhleC5jaGFyQXQoIDIgKSArIGhleC5jaGFyQXQoIDMgKSwgMTYgKSAvIDI1NTtcblx0XHRcdFx0dGhpcy5iID0gcGFyc2VJbnQoIGhleC5jaGFyQXQoIDQgKSArIGhleC5jaGFyQXQoIDUgKSwgMTYgKSAvIDI1NTtcblxuXHRcdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCBzdHlsZSAmJiBzdHlsZS5sZW5ndGggPiAwICkge1xuXG5cdFx0XHQvLyBjb2xvciBrZXl3b3Jkc1xuXHRcdFx0dmFyIGhleCA9IENvbG9yS2V5d29yZHNbIHN0eWxlIF07XG5cblx0XHRcdGlmICggaGV4ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Ly8gcmVkXG5cdFx0XHRcdHRoaXMuc2V0SGV4KCBoZXggKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyB1bmtub3duIGNvbG9yXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkNvbG9yOiBVbmtub3duIGNvbG9yICcgKyBzdHlsZSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoIHRoaXMuciwgdGhpcy5nLCB0aGlzLmIgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggY29sb3IgKSB7XG5cblx0XHR0aGlzLnIgPSBjb2xvci5yO1xuXHRcdHRoaXMuZyA9IGNvbG9yLmc7XG5cdFx0dGhpcy5iID0gY29sb3IuYjtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y29weUdhbW1hVG9MaW5lYXI6IGZ1bmN0aW9uICggY29sb3IsIGdhbW1hRmFjdG9yICkge1xuXG5cdFx0aWYgKCBnYW1tYUZhY3RvciA9PT0gdW5kZWZpbmVkICkgZ2FtbWFGYWN0b3IgPSAyLjA7XG5cblx0XHR0aGlzLnIgPSBNYXRoLnBvdyggY29sb3IuciwgZ2FtbWFGYWN0b3IgKTtcblx0XHR0aGlzLmcgPSBNYXRoLnBvdyggY29sb3IuZywgZ2FtbWFGYWN0b3IgKTtcblx0XHR0aGlzLmIgPSBNYXRoLnBvdyggY29sb3IuYiwgZ2FtbWFGYWN0b3IgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y29weUxpbmVhclRvR2FtbWE6IGZ1bmN0aW9uICggY29sb3IsIGdhbW1hRmFjdG9yICkge1xuXG5cdFx0aWYgKCBnYW1tYUZhY3RvciA9PT0gdW5kZWZpbmVkICkgZ2FtbWFGYWN0b3IgPSAyLjA7XG5cblx0XHR2YXIgc2FmZUludmVyc2UgPSAoIGdhbW1hRmFjdG9yID4gMCApID8gKCAxLjAgLyBnYW1tYUZhY3RvciApIDogMS4wO1xuXG5cdFx0dGhpcy5yID0gTWF0aC5wb3coIGNvbG9yLnIsIHNhZmVJbnZlcnNlICk7XG5cdFx0dGhpcy5nID0gTWF0aC5wb3coIGNvbG9yLmcsIHNhZmVJbnZlcnNlICk7XG5cdFx0dGhpcy5iID0gTWF0aC5wb3coIGNvbG9yLmIsIHNhZmVJbnZlcnNlICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvbnZlcnRHYW1tYVRvTGluZWFyOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgciA9IHRoaXMuciwgZyA9IHRoaXMuZywgYiA9IHRoaXMuYjtcblxuXHRcdHRoaXMuciA9IHIgKiByO1xuXHRcdHRoaXMuZyA9IGcgKiBnO1xuXHRcdHRoaXMuYiA9IGIgKiBiO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjb252ZXJ0TGluZWFyVG9HYW1tYTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5yID0gTWF0aC5zcXJ0KCB0aGlzLnIgKTtcblx0XHR0aGlzLmcgPSBNYXRoLnNxcnQoIHRoaXMuZyApO1xuXHRcdHRoaXMuYiA9IE1hdGguc3FydCggdGhpcy5iICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGdldEhleDogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuICggdGhpcy5yICogMjU1ICkgPDwgMTYgXiAoIHRoaXMuZyAqIDI1NSApIDw8IDggXiAoIHRoaXMuYiAqIDI1NSApIDw8IDA7XG5cblx0fSxcblxuXHRnZXRIZXhTdHJpbmc6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiAoICcwMDAwMDAnICsgdGhpcy5nZXRIZXgoKS50b1N0cmluZyggMTYgKSApLnNsaWNlKCAtIDYgKTtcblxuXHR9LFxuXG5cdGdldEhTTDogZnVuY3Rpb24gKCB0YXJnZXQgKSB7XG5cblx0XHQvLyBoLHMsbCByYW5nZXMgYXJlIGluIDAuMCAtIDEuMFxuXG5cdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQ29sb3I6IC5nZXRIU0woKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApO1xuXHRcdFx0dGFyZ2V0ID0geyBoOiAwLCBzOiAwLCBsOiAwIH07XG5cblx0XHR9XG5cblx0XHR2YXIgciA9IHRoaXMuciwgZyA9IHRoaXMuZywgYiA9IHRoaXMuYjtcblxuXHRcdHZhciBtYXggPSBNYXRoLm1heCggciwgZywgYiApO1xuXHRcdHZhciBtaW4gPSBNYXRoLm1pbiggciwgZywgYiApO1xuXG5cdFx0dmFyIGh1ZSwgc2F0dXJhdGlvbjtcblx0XHR2YXIgbGlnaHRuZXNzID0gKCBtaW4gKyBtYXggKSAvIDIuMDtcblxuXHRcdGlmICggbWluID09PSBtYXggKSB7XG5cblx0XHRcdGh1ZSA9IDA7XG5cdFx0XHRzYXR1cmF0aW9uID0gMDtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHZhciBkZWx0YSA9IG1heCAtIG1pbjtcblxuXHRcdFx0c2F0dXJhdGlvbiA9IGxpZ2h0bmVzcyA8PSAwLjUgPyBkZWx0YSAvICggbWF4ICsgbWluICkgOiBkZWx0YSAvICggMiAtIG1heCAtIG1pbiApO1xuXG5cdFx0XHRzd2l0Y2ggKCBtYXggKSB7XG5cblx0XHRcdFx0Y2FzZSByOiBodWUgPSAoIGcgLSBiICkgLyBkZWx0YSArICggZyA8IGIgPyA2IDogMCApOyBicmVhaztcblx0XHRcdFx0Y2FzZSBnOiBodWUgPSAoIGIgLSByICkgLyBkZWx0YSArIDI7IGJyZWFrO1xuXHRcdFx0XHRjYXNlIGI6IGh1ZSA9ICggciAtIGcgKSAvIGRlbHRhICsgNDsgYnJlYWs7XG5cblx0XHRcdH1cblxuXHRcdFx0aHVlIC89IDY7XG5cblx0XHR9XG5cblx0XHR0YXJnZXQuaCA9IGh1ZTtcblx0XHR0YXJnZXQucyA9IHNhdHVyYXRpb247XG5cdFx0dGFyZ2V0LmwgPSBsaWdodG5lc3M7XG5cblx0XHRyZXR1cm4gdGFyZ2V0O1xuXG5cdH0sXG5cblx0Z2V0U3R5bGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiAncmdiKCcgKyAoICggdGhpcy5yICogMjU1ICkgfCAwICkgKyAnLCcgKyAoICggdGhpcy5nICogMjU1ICkgfCAwICkgKyAnLCcgKyAoICggdGhpcy5iICogMjU1ICkgfCAwICkgKyAnKSc7XG5cblx0fSxcblxuXHRvZmZzZXRIU0w6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBoc2wgPSB7fTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiAoIGgsIHMsIGwgKSB7XG5cblx0XHRcdHRoaXMuZ2V0SFNMKCBoc2wgKTtcblxuXHRcdFx0aHNsLmggKz0gaDsgaHNsLnMgKz0gczsgaHNsLmwgKz0gbDtcblxuXHRcdFx0dGhpcy5zZXRIU0woIGhzbC5oLCBoc2wucywgaHNsLmwgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRhZGQ6IGZ1bmN0aW9uICggY29sb3IgKSB7XG5cblx0XHR0aGlzLnIgKz0gY29sb3Iucjtcblx0XHR0aGlzLmcgKz0gY29sb3IuZztcblx0XHR0aGlzLmIgKz0gY29sb3IuYjtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YWRkQ29sb3JzOiBmdW5jdGlvbiAoIGNvbG9yMSwgY29sb3IyICkge1xuXG5cdFx0dGhpcy5yID0gY29sb3IxLnIgKyBjb2xvcjIucjtcblx0XHR0aGlzLmcgPSBjb2xvcjEuZyArIGNvbG9yMi5nO1xuXHRcdHRoaXMuYiA9IGNvbG9yMS5iICsgY29sb3IyLmI7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFkZFNjYWxhcjogZnVuY3Rpb24gKCBzICkge1xuXG5cdFx0dGhpcy5yICs9IHM7XG5cdFx0dGhpcy5nICs9IHM7XG5cdFx0dGhpcy5iICs9IHM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHN1YjogZnVuY3Rpb24gKCBjb2xvciApIHtcblxuXHRcdHRoaXMuciA9IE1hdGgubWF4KCAwLCB0aGlzLnIgLSBjb2xvci5yICk7XG5cdFx0dGhpcy5nID0gTWF0aC5tYXgoIDAsIHRoaXMuZyAtIGNvbG9yLmcgKTtcblx0XHR0aGlzLmIgPSBNYXRoLm1heCggMCwgdGhpcy5iIC0gY29sb3IuYiApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtdWx0aXBseTogZnVuY3Rpb24gKCBjb2xvciApIHtcblxuXHRcdHRoaXMuciAqPSBjb2xvci5yO1xuXHRcdHRoaXMuZyAqPSBjb2xvci5nO1xuXHRcdHRoaXMuYiAqPSBjb2xvci5iO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtdWx0aXBseVNjYWxhcjogZnVuY3Rpb24gKCBzICkge1xuXG5cdFx0dGhpcy5yICo9IHM7XG5cdFx0dGhpcy5nICo9IHM7XG5cdFx0dGhpcy5iICo9IHM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGxlcnA6IGZ1bmN0aW9uICggY29sb3IsIGFscGhhICkge1xuXG5cdFx0dGhpcy5yICs9ICggY29sb3IuciAtIHRoaXMuciApICogYWxwaGE7XG5cdFx0dGhpcy5nICs9ICggY29sb3IuZyAtIHRoaXMuZyApICogYWxwaGE7XG5cdFx0dGhpcy5iICs9ICggY29sb3IuYiAtIHRoaXMuYiApICogYWxwaGE7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGVxdWFsczogZnVuY3Rpb24gKCBjICkge1xuXG5cdFx0cmV0dXJuICggYy5yID09PSB0aGlzLnIgKSAmJiAoIGMuZyA9PT0gdGhpcy5nICkgJiYgKCBjLmIgPT09IHRoaXMuYiApO1xuXG5cdH0sXG5cblx0ZnJvbUFycmF5OiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0gMDtcblxuXHRcdHRoaXMuciA9IGFycmF5WyBvZmZzZXQgXTtcblx0XHR0aGlzLmcgPSBhcnJheVsgb2Zmc2V0ICsgMSBdO1xuXHRcdHRoaXMuYiA9IGFycmF5WyBvZmZzZXQgKyAyIF07XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHRvQXJyYXk6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCApIHtcblxuXHRcdGlmICggYXJyYXkgPT09IHVuZGVmaW5lZCApIGFycmF5ID0gW107XG5cdFx0aWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7XG5cblx0XHRhcnJheVsgb2Zmc2V0IF0gPSB0aGlzLnI7XG5cdFx0YXJyYXlbIG9mZnNldCArIDEgXSA9IHRoaXMuZztcblx0XHRhcnJheVsgb2Zmc2V0ICsgMiBdID0gdGhpcy5iO1xuXG5cdFx0cmV0dXJuIGFycmF5O1xuXG5cdH0sXG5cblx0dG9KU09OOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5nZXRIZXgoKTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBVbmlmb3JtcyBsaWJyYXJ5IGZvciBzaGFyZWQgd2ViZ2wgc2hhZGVyc1xuICovXG5cbnZhciBVbmlmb3Jtc0xpYiA9IHtcblxuXHRjb21tb246IHtcblxuXHRcdGRpZmZ1c2U6IHsgdmFsdWU6IG5ldyBDb2xvciggMHhlZWVlZWUgKSB9LFxuXHRcdG9wYWNpdHk6IHsgdmFsdWU6IDEuMCB9LFxuXG5cdFx0bWFwOiB7IHZhbHVlOiBudWxsIH0sXG5cdFx0dXZUcmFuc2Zvcm06IHsgdmFsdWU6IG5ldyBNYXRyaXgzKCkgfSxcblxuXHRcdGFscGhhTWFwOiB7IHZhbHVlOiBudWxsIH0sXG5cblx0fSxcblxuXHRzcGVjdWxhcm1hcDoge1xuXG5cdFx0c3BlY3VsYXJNYXA6IHsgdmFsdWU6IG51bGwgfSxcblxuXHR9LFxuXG5cdGVudm1hcDoge1xuXG5cdFx0ZW52TWFwOiB7IHZhbHVlOiBudWxsIH0sXG5cdFx0ZmxpcEVudk1hcDogeyB2YWx1ZTogLSAxIH0sXG5cdFx0cmVmbGVjdGl2aXR5OiB7IHZhbHVlOiAxLjAgfSxcblx0XHRyZWZyYWN0aW9uUmF0aW86IHsgdmFsdWU6IDAuOTggfSxcblx0XHRtYXhNaXBMZXZlbDogeyB2YWx1ZTogMCB9XG5cblx0fSxcblxuXHRhb21hcDoge1xuXG5cdFx0YW9NYXA6IHsgdmFsdWU6IG51bGwgfSxcblx0XHRhb01hcEludGVuc2l0eTogeyB2YWx1ZTogMSB9XG5cblx0fSxcblxuXHRsaWdodG1hcDoge1xuXG5cdFx0bGlnaHRNYXA6IHsgdmFsdWU6IG51bGwgfSxcblx0XHRsaWdodE1hcEludGVuc2l0eTogeyB2YWx1ZTogMSB9XG5cblx0fSxcblxuXHRlbWlzc2l2ZW1hcDoge1xuXG5cdFx0ZW1pc3NpdmVNYXA6IHsgdmFsdWU6IG51bGwgfVxuXG5cdH0sXG5cblx0YnVtcG1hcDoge1xuXG5cdFx0YnVtcE1hcDogeyB2YWx1ZTogbnVsbCB9LFxuXHRcdGJ1bXBTY2FsZTogeyB2YWx1ZTogMSB9XG5cblx0fSxcblxuXHRub3JtYWxtYXA6IHtcblxuXHRcdG5vcm1hbE1hcDogeyB2YWx1ZTogbnVsbCB9LFxuXHRcdG5vcm1hbFNjYWxlOiB7IHZhbHVlOiBuZXcgVmVjdG9yMiggMSwgMSApIH1cblxuXHR9LFxuXG5cdGRpc3BsYWNlbWVudG1hcDoge1xuXG5cdFx0ZGlzcGxhY2VtZW50TWFwOiB7IHZhbHVlOiBudWxsIH0sXG5cdFx0ZGlzcGxhY2VtZW50U2NhbGU6IHsgdmFsdWU6IDEgfSxcblx0XHRkaXNwbGFjZW1lbnRCaWFzOiB7IHZhbHVlOiAwIH1cblxuXHR9LFxuXG5cdHJvdWdobmVzc21hcDoge1xuXG5cdFx0cm91Z2huZXNzTWFwOiB7IHZhbHVlOiBudWxsIH1cblxuXHR9LFxuXG5cdG1ldGFsbmVzc21hcDoge1xuXG5cdFx0bWV0YWxuZXNzTWFwOiB7IHZhbHVlOiBudWxsIH1cblxuXHR9LFxuXG5cdGdyYWRpZW50bWFwOiB7XG5cblx0XHRncmFkaWVudE1hcDogeyB2YWx1ZTogbnVsbCB9XG5cblx0fSxcblxuXHRmb2c6IHtcblxuXHRcdGZvZ0RlbnNpdHk6IHsgdmFsdWU6IDAuMDAwMjUgfSxcblx0XHRmb2dOZWFyOiB7IHZhbHVlOiAxIH0sXG5cdFx0Zm9nRmFyOiB7IHZhbHVlOiAyMDAwIH0sXG5cdFx0Zm9nQ29sb3I6IHsgdmFsdWU6IG5ldyBDb2xvciggMHhmZmZmZmYgKSB9XG5cblx0fSxcblxuXHRsaWdodHM6IHtcblxuXHRcdGFtYmllbnRMaWdodENvbG9yOiB7IHZhbHVlOiBbXSB9LFxuXG5cdFx0ZGlyZWN0aW9uYWxMaWdodHM6IHsgdmFsdWU6IFtdLCBwcm9wZXJ0aWVzOiB7XG5cdFx0XHRkaXJlY3Rpb246IHt9LFxuXHRcdFx0Y29sb3I6IHt9LFxuXG5cdFx0XHRzaGFkb3c6IHt9LFxuXHRcdFx0c2hhZG93Qmlhczoge30sXG5cdFx0XHRzaGFkb3dSYWRpdXM6IHt9LFxuXHRcdFx0c2hhZG93TWFwU2l6ZToge31cblx0XHR9IH0sXG5cblx0XHRkaXJlY3Rpb25hbFNoYWRvd01hcDogeyB2YWx1ZTogW10gfSxcblx0XHRkaXJlY3Rpb25hbFNoYWRvd01hdHJpeDogeyB2YWx1ZTogW10gfSxcblxuXHRcdHNwb3RMaWdodHM6IHsgdmFsdWU6IFtdLCBwcm9wZXJ0aWVzOiB7XG5cdFx0XHRjb2xvcjoge30sXG5cdFx0XHRwb3NpdGlvbjoge30sXG5cdFx0XHRkaXJlY3Rpb246IHt9LFxuXHRcdFx0ZGlzdGFuY2U6IHt9LFxuXHRcdFx0Y29uZUNvczoge30sXG5cdFx0XHRwZW51bWJyYUNvczoge30sXG5cdFx0XHRkZWNheToge30sXG5cblx0XHRcdHNoYWRvdzoge30sXG5cdFx0XHRzaGFkb3dCaWFzOiB7fSxcblx0XHRcdHNoYWRvd1JhZGl1czoge30sXG5cdFx0XHRzaGFkb3dNYXBTaXplOiB7fVxuXHRcdH0gfSxcblxuXHRcdHNwb3RTaGFkb3dNYXA6IHsgdmFsdWU6IFtdIH0sXG5cdFx0c3BvdFNoYWRvd01hdHJpeDogeyB2YWx1ZTogW10gfSxcblxuXHRcdHBvaW50TGlnaHRzOiB7IHZhbHVlOiBbXSwgcHJvcGVydGllczoge1xuXHRcdFx0Y29sb3I6IHt9LFxuXHRcdFx0cG9zaXRpb246IHt9LFxuXHRcdFx0ZGVjYXk6IHt9LFxuXHRcdFx0ZGlzdGFuY2U6IHt9LFxuXG5cdFx0XHRzaGFkb3c6IHt9LFxuXHRcdFx0c2hhZG93Qmlhczoge30sXG5cdFx0XHRzaGFkb3dSYWRpdXM6IHt9LFxuXHRcdFx0c2hhZG93TWFwU2l6ZToge30sXG5cdFx0XHRzaGFkb3dDYW1lcmFOZWFyOiB7fSxcblx0XHRcdHNoYWRvd0NhbWVyYUZhcjoge31cblx0XHR9IH0sXG5cblx0XHRwb2ludFNoYWRvd01hcDogeyB2YWx1ZTogW10gfSxcblx0XHRwb2ludFNoYWRvd01hdHJpeDogeyB2YWx1ZTogW10gfSxcblxuXHRcdGhlbWlzcGhlcmVMaWdodHM6IHsgdmFsdWU6IFtdLCBwcm9wZXJ0aWVzOiB7XG5cdFx0XHRkaXJlY3Rpb246IHt9LFxuXHRcdFx0c2t5Q29sb3I6IHt9LFxuXHRcdFx0Z3JvdW5kQ29sb3I6IHt9XG5cdFx0fSB9LFxuXG5cdFx0Ly8gVE9ETyAoYWJlbG5hdGlvbik6IFJlY3RBcmVhTGlnaHQgQlJERiBkYXRhIG5lZWRzIHRvIGJlIG1vdmVkIGZyb20gZXhhbXBsZSB0byBtYWluIHNyY1xuXHRcdHJlY3RBcmVhTGlnaHRzOiB7IHZhbHVlOiBbXSwgcHJvcGVydGllczoge1xuXHRcdFx0Y29sb3I6IHt9LFxuXHRcdFx0cG9zaXRpb246IHt9LFxuXHRcdFx0d2lkdGg6IHt9LFxuXHRcdFx0aGVpZ2h0OiB7fVxuXHRcdH0gfVxuXG5cdH0sXG5cblx0cG9pbnRzOiB7XG5cblx0XHRkaWZmdXNlOiB7IHZhbHVlOiBuZXcgQ29sb3IoIDB4ZWVlZWVlICkgfSxcblx0XHRvcGFjaXR5OiB7IHZhbHVlOiAxLjAgfSxcblx0XHRzaXplOiB7IHZhbHVlOiAxLjAgfSxcblx0XHRzY2FsZTogeyB2YWx1ZTogMS4wIH0sXG5cdFx0bWFwOiB7IHZhbHVlOiBudWxsIH0sXG5cdFx0dXZUcmFuc2Zvcm06IHsgdmFsdWU6IG5ldyBNYXRyaXgzKCkgfVxuXG5cdH1cblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgbWlrYWVsIGVtdGluZ2VyIC8gaHR0cDovL2dvbW8uc2UvXG4gKi9cblxudmFyIFNoYWRlckxpYiA9IHtcblxuXHRiYXNpYzoge1xuXG5cdFx0dW5pZm9ybXM6IFVuaWZvcm1zVXRpbHMubWVyZ2UoIFtcblx0XHRcdFVuaWZvcm1zTGliLmNvbW1vbixcblx0XHRcdFVuaWZvcm1zTGliLnNwZWN1bGFybWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuZW52bWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuYW9tYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5saWdodG1hcCxcblx0XHRcdFVuaWZvcm1zTGliLmZvZ1xuXHRcdF0gKSxcblxuXHRcdHZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsubWVzaGJhc2ljX3ZlcnQsXG5cdFx0ZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLm1lc2hiYXNpY19mcmFnXG5cblx0fSxcblxuXHRsYW1iZXJ0OiB7XG5cblx0XHR1bmlmb3JtczogVW5pZm9ybXNVdGlscy5tZXJnZSggW1xuXHRcdFx0VW5pZm9ybXNMaWIuY29tbW9uLFxuXHRcdFx0VW5pZm9ybXNMaWIuc3BlY3VsYXJtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5lbnZtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5hb21hcCxcblx0XHRcdFVuaWZvcm1zTGliLmxpZ2h0bWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuZW1pc3NpdmVtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5mb2csXG5cdFx0XHRVbmlmb3Jtc0xpYi5saWdodHMsXG5cdFx0XHR7XG5cdFx0XHRcdGVtaXNzaXZlOiB7IHZhbHVlOiBuZXcgQ29sb3IoIDB4MDAwMDAwICkgfVxuXHRcdFx0fVxuXHRcdF0gKSxcblxuXHRcdHZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsubWVzaGxhbWJlcnRfdmVydCxcblx0XHRmcmFnbWVudFNoYWRlcjogU2hhZGVyQ2h1bmsubWVzaGxhbWJlcnRfZnJhZ1xuXG5cdH0sXG5cblx0cGhvbmc6IHtcblxuXHRcdHVuaWZvcm1zOiBVbmlmb3Jtc1V0aWxzLm1lcmdlKCBbXG5cdFx0XHRVbmlmb3Jtc0xpYi5jb21tb24sXG5cdFx0XHRVbmlmb3Jtc0xpYi5zcGVjdWxhcm1hcCxcblx0XHRcdFVuaWZvcm1zTGliLmVudm1hcCxcblx0XHRcdFVuaWZvcm1zTGliLmFvbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIubGlnaHRtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5lbWlzc2l2ZW1hcCxcblx0XHRcdFVuaWZvcm1zTGliLmJ1bXBtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5ub3JtYWxtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5kaXNwbGFjZW1lbnRtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5ncmFkaWVudG1hcCxcblx0XHRcdFVuaWZvcm1zTGliLmZvZyxcblx0XHRcdFVuaWZvcm1zTGliLmxpZ2h0cyxcblx0XHRcdHtcblx0XHRcdFx0ZW1pc3NpdmU6IHsgdmFsdWU6IG5ldyBDb2xvciggMHgwMDAwMDAgKSB9LFxuXHRcdFx0XHRzcGVjdWxhcjogeyB2YWx1ZTogbmV3IENvbG9yKCAweDExMTExMSApIH0sXG5cdFx0XHRcdHNoaW5pbmVzczogeyB2YWx1ZTogMzAgfVxuXHRcdFx0fVxuXHRcdF0gKSxcblxuXHRcdHZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsubWVzaHBob25nX3ZlcnQsXG5cdFx0ZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLm1lc2hwaG9uZ19mcmFnXG5cblx0fSxcblxuXHRzdGFuZGFyZDoge1xuXG5cdFx0dW5pZm9ybXM6IFVuaWZvcm1zVXRpbHMubWVyZ2UoIFtcblx0XHRcdFVuaWZvcm1zTGliLmNvbW1vbixcblx0XHRcdFVuaWZvcm1zTGliLmVudm1hcCxcblx0XHRcdFVuaWZvcm1zTGliLmFvbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIubGlnaHRtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5lbWlzc2l2ZW1hcCxcblx0XHRcdFVuaWZvcm1zTGliLmJ1bXBtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5ub3JtYWxtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5kaXNwbGFjZW1lbnRtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5yb3VnaG5lc3NtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5tZXRhbG5lc3NtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5mb2csXG5cdFx0XHRVbmlmb3Jtc0xpYi5saWdodHMsXG5cdFx0XHR7XG5cdFx0XHRcdGVtaXNzaXZlOiB7IHZhbHVlOiBuZXcgQ29sb3IoIDB4MDAwMDAwICkgfSxcblx0XHRcdFx0cm91Z2huZXNzOiB7IHZhbHVlOiAwLjUgfSxcblx0XHRcdFx0bWV0YWxuZXNzOiB7IHZhbHVlOiAwLjUgfSxcblx0XHRcdFx0ZW52TWFwSW50ZW5zaXR5OiB7IHZhbHVlOiAxIH0gLy8gdGVtcG9yYXJ5XG5cdFx0XHR9XG5cdFx0XSApLFxuXG5cdFx0dmVydGV4U2hhZGVyOiBTaGFkZXJDaHVuay5tZXNocGh5c2ljYWxfdmVydCxcblx0XHRmcmFnbWVudFNoYWRlcjogU2hhZGVyQ2h1bmsubWVzaHBoeXNpY2FsX2ZyYWdcblxuXHR9LFxuXG5cdHBvaW50czoge1xuXG5cdFx0dW5pZm9ybXM6IFVuaWZvcm1zVXRpbHMubWVyZ2UoIFtcblx0XHRcdFVuaWZvcm1zTGliLnBvaW50cyxcblx0XHRcdFVuaWZvcm1zTGliLmZvZ1xuXHRcdF0gKSxcblxuXHRcdHZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsucG9pbnRzX3ZlcnQsXG5cdFx0ZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLnBvaW50c19mcmFnXG5cblx0fSxcblxuXHRkYXNoZWQ6IHtcblxuXHRcdHVuaWZvcm1zOiBVbmlmb3Jtc1V0aWxzLm1lcmdlKCBbXG5cdFx0XHRVbmlmb3Jtc0xpYi5jb21tb24sXG5cdFx0XHRVbmlmb3Jtc0xpYi5mb2csXG5cdFx0XHR7XG5cdFx0XHRcdHNjYWxlOiB7IHZhbHVlOiAxIH0sXG5cdFx0XHRcdGRhc2hTaXplOiB7IHZhbHVlOiAxIH0sXG5cdFx0XHRcdHRvdGFsU2l6ZTogeyB2YWx1ZTogMiB9XG5cdFx0XHR9XG5cdFx0XSApLFxuXG5cdFx0dmVydGV4U2hhZGVyOiBTaGFkZXJDaHVuay5saW5lZGFzaGVkX3ZlcnQsXG5cdFx0ZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLmxpbmVkYXNoZWRfZnJhZ1xuXG5cdH0sXG5cblx0ZGVwdGg6IHtcblxuXHRcdHVuaWZvcm1zOiBVbmlmb3Jtc1V0aWxzLm1lcmdlKCBbXG5cdFx0XHRVbmlmb3Jtc0xpYi5jb21tb24sXG5cdFx0XHRVbmlmb3Jtc0xpYi5kaXNwbGFjZW1lbnRtYXBcblx0XHRdICksXG5cblx0XHR2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLmRlcHRoX3ZlcnQsXG5cdFx0ZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLmRlcHRoX2ZyYWdcblxuXHR9LFxuXG5cdG5vcm1hbDoge1xuXG5cdFx0dW5pZm9ybXM6IFVuaWZvcm1zVXRpbHMubWVyZ2UoIFtcblx0XHRcdFVuaWZvcm1zTGliLmNvbW1vbixcblx0XHRcdFVuaWZvcm1zTGliLmJ1bXBtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5ub3JtYWxtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5kaXNwbGFjZW1lbnRtYXAsXG5cdFx0XHR7XG5cdFx0XHRcdG9wYWNpdHk6IHsgdmFsdWU6IDEuMCB9XG5cdFx0XHR9XG5cdFx0XSApLFxuXG5cdFx0dmVydGV4U2hhZGVyOiBTaGFkZXJDaHVuay5ub3JtYWxfdmVydCxcblx0XHRmcmFnbWVudFNoYWRlcjogU2hhZGVyQ2h1bmsubm9ybWFsX2ZyYWdcblxuXHR9LFxuXG5cdC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0Ly9cdEN1YmUgbWFwIHNoYWRlclxuXHQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5cdGN1YmU6IHtcblxuXHRcdHVuaWZvcm1zOiB7XG5cdFx0XHR0Q3ViZTogeyB2YWx1ZTogbnVsbCB9LFxuXHRcdFx0dEZsaXA6IHsgdmFsdWU6IC0gMSB9LFxuXHRcdFx0b3BhY2l0eTogeyB2YWx1ZTogMS4wIH1cblx0XHR9LFxuXG5cdFx0dmVydGV4U2hhZGVyOiBTaGFkZXJDaHVuay5jdWJlX3ZlcnQsXG5cdFx0ZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLmN1YmVfZnJhZ1xuXG5cdH0sXG5cblx0ZXF1aXJlY3Q6IHtcblxuXHRcdHVuaWZvcm1zOiB7XG5cdFx0XHR0RXF1aXJlY3Q6IHsgdmFsdWU6IG51bGwgfSxcblx0XHR9LFxuXG5cdFx0dmVydGV4U2hhZGVyOiBTaGFkZXJDaHVuay5lcXVpcmVjdF92ZXJ0LFxuXHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5lcXVpcmVjdF9mcmFnXG5cblx0fSxcblxuXHRkaXN0YW5jZVJHQkE6IHtcblxuXHRcdHVuaWZvcm1zOiBVbmlmb3Jtc1V0aWxzLm1lcmdlKCBbXG5cdFx0XHRVbmlmb3Jtc0xpYi5jb21tb24sXG5cdFx0XHRVbmlmb3Jtc0xpYi5kaXNwbGFjZW1lbnRtYXAsXG5cdFx0XHR7XG5cdFx0XHRcdHJlZmVyZW5jZVBvc2l0aW9uOiB7IHZhbHVlOiBuZXcgVmVjdG9yMygpIH0sXG5cdFx0XHRcdG5lYXJEaXN0YW5jZTogeyB2YWx1ZTogMSB9LFxuXHRcdFx0XHRmYXJEaXN0YW5jZTogeyB2YWx1ZTogMTAwMCB9XG5cdFx0XHR9XG5cdFx0XSApLFxuXG5cdFx0dmVydGV4U2hhZGVyOiBTaGFkZXJDaHVuay5kaXN0YW5jZVJHQkFfdmVydCxcblx0XHRmcmFnbWVudFNoYWRlcjogU2hhZGVyQ2h1bmsuZGlzdGFuY2VSR0JBX2ZyYWdcblxuXHR9LFxuXG5cdHNoYWRvdzoge1xuXG5cdFx0dW5pZm9ybXM6IFVuaWZvcm1zVXRpbHMubWVyZ2UoIFtcblx0XHRcdFVuaWZvcm1zTGliLmxpZ2h0cyxcblx0XHRcdFVuaWZvcm1zTGliLmZvZyxcblx0XHRcdHtcblx0XHRcdFx0Y29sb3I6IHsgdmFsdWU6IG5ldyBDb2xvciggMHgwMDAwMCApIH0sXG5cdFx0XHRcdG9wYWNpdHk6IHsgdmFsdWU6IDEuMCB9XG5cdFx0XHR9LFxuXHRcdF0gKSxcblxuXHRcdHZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsuc2hhZG93X3ZlcnQsXG5cdFx0ZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLnNoYWRvd19mcmFnXG5cblx0fVxuXG59O1xuXG5TaGFkZXJMaWIucGh5c2ljYWwgPSB7XG5cblx0dW5pZm9ybXM6IFVuaWZvcm1zVXRpbHMubWVyZ2UoIFtcblx0XHRTaGFkZXJMaWIuc3RhbmRhcmQudW5pZm9ybXMsXG5cdFx0e1xuXHRcdFx0Y2xlYXJDb2F0OiB7IHZhbHVlOiAwIH0sXG5cdFx0XHRjbGVhckNvYXRSb3VnaG5lc3M6IHsgdmFsdWU6IDAgfVxuXHRcdH1cblx0XSApLFxuXG5cdHZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsubWVzaHBoeXNpY2FsX3ZlcnQsXG5cdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5tZXNocGh5c2ljYWxfZnJhZ1xuXG59O1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gV2ViR0xBdHRyaWJ1dGVzKCBnbCApIHtcblxuXHR2YXIgYnVmZmVycyA9IG5ldyBXZWFrTWFwKCk7XG5cblx0ZnVuY3Rpb24gY3JlYXRlQnVmZmVyKCBhdHRyaWJ1dGUsIGJ1ZmZlclR5cGUgKSB7XG5cblx0XHR2YXIgYXJyYXkgPSBhdHRyaWJ1dGUuYXJyYXk7XG5cdFx0dmFyIHVzYWdlID0gYXR0cmlidXRlLmR5bmFtaWMgPyBnbC5EWU5BTUlDX0RSQVcgOiBnbC5TVEFUSUNfRFJBVztcblxuXHRcdHZhciBidWZmZXIgPSBnbC5jcmVhdGVCdWZmZXIoKTtcblxuXHRcdGdsLmJpbmRCdWZmZXIoIGJ1ZmZlclR5cGUsIGJ1ZmZlciApO1xuXHRcdGdsLmJ1ZmZlckRhdGEoIGJ1ZmZlclR5cGUsIGFycmF5LCB1c2FnZSApO1xuXG5cdFx0YXR0cmlidXRlLm9uVXBsb2FkQ2FsbGJhY2soKTtcblxuXHRcdHZhciB0eXBlID0gZ2wuRkxPQVQ7XG5cblx0XHRpZiAoIGFycmF5IGluc3RhbmNlb2YgRmxvYXQzMkFycmF5ICkge1xuXG5cdFx0XHR0eXBlID0gZ2wuRkxPQVQ7XG5cblx0XHR9IGVsc2UgaWYgKCBhcnJheSBpbnN0YW5jZW9mIEZsb2F0NjRBcnJheSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xBdHRyaWJ1dGVzOiBVbnN1cHBvcnRlZCBkYXRhIGJ1ZmZlciBmb3JtYXQ6IEZsb2F0NjRBcnJheS4nICk7XG5cblx0XHR9IGVsc2UgaWYgKCBhcnJheSBpbnN0YW5jZW9mIFVpbnQxNkFycmF5ICkge1xuXG5cdFx0XHR0eXBlID0gZ2wuVU5TSUdORURfU0hPUlQ7XG5cblx0XHR9IGVsc2UgaWYgKCBhcnJheSBpbnN0YW5jZW9mIEludDE2QXJyYXkgKSB7XG5cblx0XHRcdHR5cGUgPSBnbC5TSE9SVDtcblxuXHRcdH0gZWxzZSBpZiAoIGFycmF5IGluc3RhbmNlb2YgVWludDMyQXJyYXkgKSB7XG5cblx0XHRcdHR5cGUgPSBnbC5VTlNJR05FRF9JTlQ7XG5cblx0XHR9IGVsc2UgaWYgKCBhcnJheSBpbnN0YW5jZW9mIEludDMyQXJyYXkgKSB7XG5cblx0XHRcdHR5cGUgPSBnbC5JTlQ7XG5cblx0XHR9IGVsc2UgaWYgKCBhcnJheSBpbnN0YW5jZW9mIEludDhBcnJheSApIHtcblxuXHRcdFx0dHlwZSA9IGdsLkJZVEU7XG5cblx0XHR9IGVsc2UgaWYgKCBhcnJheSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgKSB7XG5cblx0XHRcdHR5cGUgPSBnbC5VTlNJR05FRF9CWVRFO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHtcblx0XHRcdGJ1ZmZlcjogYnVmZmVyLFxuXHRcdFx0dHlwZTogdHlwZSxcblx0XHRcdGJ5dGVzUGVyRWxlbWVudDogYXJyYXkuQllURVNfUEVSX0VMRU1FTlQsXG5cdFx0XHR2ZXJzaW9uOiBhdHRyaWJ1dGUudmVyc2lvblxuXHRcdH07XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHVwZGF0ZUJ1ZmZlciggYnVmZmVyLCBhdHRyaWJ1dGUsIGJ1ZmZlclR5cGUgKSB7XG5cblx0XHR2YXIgYXJyYXkgPSBhdHRyaWJ1dGUuYXJyYXk7XG5cdFx0dmFyIHVwZGF0ZVJhbmdlID0gYXR0cmlidXRlLnVwZGF0ZVJhbmdlO1xuXG5cdFx0Z2wuYmluZEJ1ZmZlciggYnVmZmVyVHlwZSwgYnVmZmVyICk7XG5cblx0XHRpZiAoIGF0dHJpYnV0ZS5keW5hbWljID09PSBmYWxzZSApIHtcblxuXHRcdFx0Z2wuYnVmZmVyRGF0YSggYnVmZmVyVHlwZSwgYXJyYXksIGdsLlNUQVRJQ19EUkFXICk7XG5cblx0XHR9IGVsc2UgaWYgKCB1cGRhdGVSYW5nZS5jb3VudCA9PT0gLSAxICkge1xuXG5cdFx0XHQvLyBOb3QgdXNpbmcgdXBkYXRlIHJhbmdlc1xuXG5cdFx0XHRnbC5idWZmZXJTdWJEYXRhKCBidWZmZXJUeXBlLCAwLCBhcnJheSApO1xuXG5cdFx0fSBlbHNlIGlmICggdXBkYXRlUmFuZ2UuY291bnQgPT09IDAgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTE9iamVjdHMudXBkYXRlQnVmZmVyOiBkeW5hbWljIFRIUkVFLkJ1ZmZlckF0dHJpYnV0ZSBtYXJrZWQgYXMgbmVlZHNVcGRhdGUgYnV0IHVwZGF0ZVJhbmdlLmNvdW50IGlzIDAsIGVuc3VyZSB5b3UgYXJlIHVzaW5nIHNldCBtZXRob2RzIG9yIHVwZGF0aW5nIG1hbnVhbGx5LicgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGdsLmJ1ZmZlclN1YkRhdGEoIGJ1ZmZlclR5cGUsIHVwZGF0ZVJhbmdlLm9mZnNldCAqIGFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULFxuXHRcdFx0XHRhcnJheS5zdWJhcnJheSggdXBkYXRlUmFuZ2Uub2Zmc2V0LCB1cGRhdGVSYW5nZS5vZmZzZXQgKyB1cGRhdGVSYW5nZS5jb3VudCApICk7XG5cblx0XHRcdHVwZGF0ZVJhbmdlLmNvdW50ID0gLSAxOyAvLyByZXNldCByYW5nZVxuXG5cdFx0fVxuXG5cdH1cblxuXHQvL1xuXG5cdGZ1bmN0aW9uIGdldCggYXR0cmlidXRlICkge1xuXG5cdFx0aWYgKCBhdHRyaWJ1dGUuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSApIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZS5kYXRhO1xuXG5cdFx0cmV0dXJuIGJ1ZmZlcnMuZ2V0KCBhdHRyaWJ1dGUgKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVtb3ZlKCBhdHRyaWJ1dGUgKSB7XG5cblx0XHRpZiAoIGF0dHJpYnV0ZS5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlICkgYXR0cmlidXRlID0gYXR0cmlidXRlLmRhdGE7XG5cblx0XHR2YXIgZGF0YSA9IGJ1ZmZlcnMuZ2V0KCBhdHRyaWJ1dGUgKTtcblxuXHRcdGlmICggZGF0YSApIHtcblxuXHRcdFx0Z2wuZGVsZXRlQnVmZmVyKCBkYXRhLmJ1ZmZlciApO1xuXG5cdFx0XHRidWZmZXJzLmRlbGV0ZSggYXR0cmlidXRlICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHVwZGF0ZSggYXR0cmlidXRlLCBidWZmZXJUeXBlICkge1xuXG5cdFx0aWYgKCBhdHRyaWJ1dGUuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSApIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZS5kYXRhO1xuXG5cdFx0dmFyIGRhdGEgPSBidWZmZXJzLmdldCggYXR0cmlidXRlICk7XG5cblx0XHRpZiAoIGRhdGEgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0YnVmZmVycy5zZXQoIGF0dHJpYnV0ZSwgY3JlYXRlQnVmZmVyKCBhdHRyaWJ1dGUsIGJ1ZmZlclR5cGUgKSApO1xuXG5cdFx0fSBlbHNlIGlmICggZGF0YS52ZXJzaW9uIDwgYXR0cmlidXRlLnZlcnNpb24gKSB7XG5cblx0XHRcdHVwZGF0ZUJ1ZmZlciggZGF0YS5idWZmZXIsIGF0dHJpYnV0ZSwgYnVmZmVyVHlwZSApO1xuXG5cdFx0XHRkYXRhLnZlcnNpb24gPSBhdHRyaWJ1dGUudmVyc2lvbjtcblxuXHRcdH1cblxuXHR9XG5cblx0cmV0dXJuIHtcblxuXHRcdGdldDogZ2V0LFxuXHRcdHJlbW92ZTogcmVtb3ZlLFxuXHRcdHVwZGF0ZTogdXBkYXRlXG5cblx0fTtcblxufVxuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqIEBhdXRob3IgYmhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW9cbiAqL1xuXG5mdW5jdGlvbiBFdWxlciggeCwgeSwgeiwgb3JkZXIgKSB7XG5cblx0dGhpcy5feCA9IHggfHwgMDtcblx0dGhpcy5feSA9IHkgfHwgMDtcblx0dGhpcy5feiA9IHogfHwgMDtcblx0dGhpcy5fb3JkZXIgPSBvcmRlciB8fCBFdWxlci5EZWZhdWx0T3JkZXI7XG5cbn1cblxuRXVsZXIuUm90YXRpb25PcmRlcnMgPSBbICdYWVonLCAnWVpYJywgJ1pYWScsICdYWlknLCAnWVhaJywgJ1pZWCcgXTtcblxuRXVsZXIuRGVmYXVsdE9yZGVyID0gJ1hZWic7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBFdWxlci5wcm90b3R5cGUsIHtcblxuXHR4OiB7XG5cblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMuX3g7XG5cblx0XHR9LFxuXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHR0aGlzLl94ID0gdmFsdWU7XG5cdFx0XHR0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdHk6IHtcblxuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5feTtcblxuXHRcdH0sXG5cblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdHRoaXMuX3kgPSB2YWx1ZTtcblx0XHRcdHRoaXMub25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0ejoge1xuXG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLl96O1xuXG5cdFx0fSxcblxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0dGhpcy5feiA9IHZhbHVlO1xuXHRcdFx0dGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHR9XG5cblx0fSxcblxuXHRvcmRlcjoge1xuXG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLl9vcmRlcjtcblxuXHRcdH0sXG5cblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdHRoaXMuX29yZGVyID0gdmFsdWU7XG5cdFx0XHR0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdH1cblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmFzc2lnbiggRXVsZXIucHJvdG90eXBlLCB7XG5cblx0aXNFdWxlcjogdHJ1ZSxcblxuXHRzZXQ6IGZ1bmN0aW9uICggeCwgeSwgeiwgb3JkZXIgKSB7XG5cblx0XHR0aGlzLl94ID0geDtcblx0XHR0aGlzLl95ID0geTtcblx0XHR0aGlzLl96ID0gejtcblx0XHR0aGlzLl9vcmRlciA9IG9yZGVyIHx8IHRoaXMuX29yZGVyO1xuXG5cdFx0dGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoIHRoaXMuX3gsIHRoaXMuX3ksIHRoaXMuX3osIHRoaXMuX29yZGVyICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIGV1bGVyICkge1xuXG5cdFx0dGhpcy5feCA9IGV1bGVyLl94O1xuXHRcdHRoaXMuX3kgPSBldWxlci5feTtcblx0XHR0aGlzLl96ID0gZXVsZXIuX3o7XG5cdFx0dGhpcy5fb3JkZXIgPSBldWxlci5fb3JkZXI7XG5cblx0XHR0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbVJvdGF0aW9uTWF0cml4OiBmdW5jdGlvbiAoIG0sIG9yZGVyLCB1cGRhdGUgKSB7XG5cblx0XHR2YXIgY2xhbXAgPSBfTWF0aC5jbGFtcDtcblxuXHRcdC8vIGFzc3VtZXMgdGhlIHVwcGVyIDN4MyBvZiBtIGlzIGEgcHVyZSByb3RhdGlvbiBtYXRyaXggKGkuZSwgdW5zY2FsZWQpXG5cblx0XHR2YXIgdGUgPSBtLmVsZW1lbnRzO1xuXHRcdHZhciBtMTEgPSB0ZVsgMCBdLCBtMTIgPSB0ZVsgNCBdLCBtMTMgPSB0ZVsgOCBdO1xuXHRcdHZhciBtMjEgPSB0ZVsgMSBdLCBtMjIgPSB0ZVsgNSBdLCBtMjMgPSB0ZVsgOSBdO1xuXHRcdHZhciBtMzEgPSB0ZVsgMiBdLCBtMzIgPSB0ZVsgNiBdLCBtMzMgPSB0ZVsgMTAgXTtcblxuXHRcdG9yZGVyID0gb3JkZXIgfHwgdGhpcy5fb3JkZXI7XG5cblx0XHRpZiAoIG9yZGVyID09PSAnWFlaJyApIHtcblxuXHRcdFx0dGhpcy5feSA9IE1hdGguYXNpbiggY2xhbXAoIG0xMywgLSAxLCAxICkgKTtcblxuXHRcdFx0aWYgKCBNYXRoLmFicyggbTEzICkgPCAwLjk5OTk5ICkge1xuXG5cdFx0XHRcdHRoaXMuX3ggPSBNYXRoLmF0YW4yKCAtIG0yMywgbTMzICk7XG5cdFx0XHRcdHRoaXMuX3ogPSBNYXRoLmF0YW4yKCAtIG0xMiwgbTExICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0dGhpcy5feCA9IE1hdGguYXRhbjIoIG0zMiwgbTIyICk7XG5cdFx0XHRcdHRoaXMuX3ogPSAwO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2UgaWYgKCBvcmRlciA9PT0gJ1lYWicgKSB7XG5cblx0XHRcdHRoaXMuX3ggPSBNYXRoLmFzaW4oIC0gY2xhbXAoIG0yMywgLSAxLCAxICkgKTtcblxuXHRcdFx0aWYgKCBNYXRoLmFicyggbTIzICkgPCAwLjk5OTk5ICkge1xuXG5cdFx0XHRcdHRoaXMuX3kgPSBNYXRoLmF0YW4yKCBtMTMsIG0zMyApO1xuXHRcdFx0XHR0aGlzLl96ID0gTWF0aC5hdGFuMiggbTIxLCBtMjIgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHR0aGlzLl95ID0gTWF0aC5hdGFuMiggLSBtMzEsIG0xMSApO1xuXHRcdFx0XHR0aGlzLl96ID0gMDtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIGlmICggb3JkZXIgPT09ICdaWFknICkge1xuXG5cdFx0XHR0aGlzLl94ID0gTWF0aC5hc2luKCBjbGFtcCggbTMyLCAtIDEsIDEgKSApO1xuXG5cdFx0XHRpZiAoIE1hdGguYWJzKCBtMzIgKSA8IDAuOTk5OTkgKSB7XG5cblx0XHRcdFx0dGhpcy5feSA9IE1hdGguYXRhbjIoIC0gbTMxLCBtMzMgKTtcblx0XHRcdFx0dGhpcy5feiA9IE1hdGguYXRhbjIoIC0gbTEyLCBtMjIgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHR0aGlzLl95ID0gMDtcblx0XHRcdFx0dGhpcy5feiA9IE1hdGguYXRhbjIoIG0yMSwgbTExICk7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSBpZiAoIG9yZGVyID09PSAnWllYJyApIHtcblxuXHRcdFx0dGhpcy5feSA9IE1hdGguYXNpbiggLSBjbGFtcCggbTMxLCAtIDEsIDEgKSApO1xuXG5cdFx0XHRpZiAoIE1hdGguYWJzKCBtMzEgKSA8IDAuOTk5OTkgKSB7XG5cblx0XHRcdFx0dGhpcy5feCA9IE1hdGguYXRhbjIoIG0zMiwgbTMzICk7XG5cdFx0XHRcdHRoaXMuX3ogPSBNYXRoLmF0YW4yKCBtMjEsIG0xMSApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHRoaXMuX3ggPSAwO1xuXHRcdFx0XHR0aGlzLl96ID0gTWF0aC5hdGFuMiggLSBtMTIsIG0yMiApO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2UgaWYgKCBvcmRlciA9PT0gJ1laWCcgKSB7XG5cblx0XHRcdHRoaXMuX3ogPSBNYXRoLmFzaW4oIGNsYW1wKCBtMjEsIC0gMSwgMSApICk7XG5cblx0XHRcdGlmICggTWF0aC5hYnMoIG0yMSApIDwgMC45OTk5OSApIHtcblxuXHRcdFx0XHR0aGlzLl94ID0gTWF0aC5hdGFuMiggLSBtMjMsIG0yMiApO1xuXHRcdFx0XHR0aGlzLl95ID0gTWF0aC5hdGFuMiggLSBtMzEsIG0xMSApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHRoaXMuX3ggPSAwO1xuXHRcdFx0XHR0aGlzLl95ID0gTWF0aC5hdGFuMiggbTEzLCBtMzMgKTtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIGlmICggb3JkZXIgPT09ICdYWlknICkge1xuXG5cdFx0XHR0aGlzLl96ID0gTWF0aC5hc2luKCAtIGNsYW1wKCBtMTIsIC0gMSwgMSApICk7XG5cblx0XHRcdGlmICggTWF0aC5hYnMoIG0xMiApIDwgMC45OTk5OSApIHtcblxuXHRcdFx0XHR0aGlzLl94ID0gTWF0aC5hdGFuMiggbTMyLCBtMjIgKTtcblx0XHRcdFx0dGhpcy5feSA9IE1hdGguYXRhbjIoIG0xMywgbTExICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0dGhpcy5feCA9IE1hdGguYXRhbjIoIC0gbTIzLCBtMzMgKTtcblx0XHRcdFx0dGhpcy5feSA9IDA7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkV1bGVyOiAuc2V0RnJvbVJvdGF0aW9uTWF0cml4KCkgZ2l2ZW4gdW5zdXBwb3J0ZWQgb3JkZXI6ICcgKyBvcmRlciApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5fb3JkZXIgPSBvcmRlcjtcblxuXHRcdGlmICggdXBkYXRlICE9PSBmYWxzZSApIHRoaXMub25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRGcm9tUXVhdGVybmlvbjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIG1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gc2V0RnJvbVF1YXRlcm5pb24oIHEsIG9yZGVyLCB1cGRhdGUgKSB7XG5cblx0XHRcdG1hdHJpeC5tYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbiggcSApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5zZXRGcm9tUm90YXRpb25NYXRyaXgoIG1hdHJpeCwgb3JkZXIsIHVwZGF0ZSApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0c2V0RnJvbVZlY3RvcjM6IGZ1bmN0aW9uICggdiwgb3JkZXIgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5zZXQoIHYueCwgdi55LCB2LnosIG9yZGVyIHx8IHRoaXMuX29yZGVyICk7XG5cblx0fSxcblxuXHRyZW9yZGVyOiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyBXQVJOSU5HOiB0aGlzIGRpc2NhcmRzIHJldm9sdXRpb24gaW5mb3JtYXRpb24gLWJob3VzdG9uXG5cblx0XHR2YXIgcSA9IG5ldyBRdWF0ZXJuaW9uKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gcmVvcmRlciggbmV3T3JkZXIgKSB7XG5cblx0XHRcdHEuc2V0RnJvbUV1bGVyKCB0aGlzICk7XG5cblx0XHRcdHJldHVybiB0aGlzLnNldEZyb21RdWF0ZXJuaW9uKCBxLCBuZXdPcmRlciApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0ZXF1YWxzOiBmdW5jdGlvbiAoIGV1bGVyICkge1xuXG5cdFx0cmV0dXJuICggZXVsZXIuX3ggPT09IHRoaXMuX3ggKSAmJiAoIGV1bGVyLl95ID09PSB0aGlzLl95ICkgJiYgKCBldWxlci5feiA9PT0gdGhpcy5feiApICYmICggZXVsZXIuX29yZGVyID09PSB0aGlzLl9vcmRlciApO1xuXG5cdH0sXG5cblx0ZnJvbUFycmF5OiBmdW5jdGlvbiAoIGFycmF5ICkge1xuXG5cdFx0dGhpcy5feCA9IGFycmF5WyAwIF07XG5cdFx0dGhpcy5feSA9IGFycmF5WyAxIF07XG5cdFx0dGhpcy5feiA9IGFycmF5WyAyIF07XG5cdFx0aWYgKCBhcnJheVsgMyBdICE9PSB1bmRlZmluZWQgKSB0aGlzLl9vcmRlciA9IGFycmF5WyAzIF07XG5cblx0XHR0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dG9BcnJheTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0aWYgKCBhcnJheSA9PT0gdW5kZWZpbmVkICkgYXJyYXkgPSBbXTtcblx0XHRpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0gMDtcblxuXHRcdGFycmF5WyBvZmZzZXQgXSA9IHRoaXMuX3g7XG5cdFx0YXJyYXlbIG9mZnNldCArIDEgXSA9IHRoaXMuX3k7XG5cdFx0YXJyYXlbIG9mZnNldCArIDIgXSA9IHRoaXMuX3o7XG5cdFx0YXJyYXlbIG9mZnNldCArIDMgXSA9IHRoaXMuX29yZGVyO1xuXG5cdFx0cmV0dXJuIGFycmF5O1xuXG5cdH0sXG5cblx0dG9WZWN0b3IzOiBmdW5jdGlvbiAoIG9wdGlvbmFsUmVzdWx0ICkge1xuXG5cdFx0aWYgKCBvcHRpb25hbFJlc3VsdCApIHtcblxuXHRcdFx0cmV0dXJuIG9wdGlvbmFsUmVzdWx0LnNldCggdGhpcy5feCwgdGhpcy5feSwgdGhpcy5feiApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0cmV0dXJuIG5ldyBWZWN0b3IzKCB0aGlzLl94LCB0aGlzLl95LCB0aGlzLl96ICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHRvbkNoYW5nZTogZnVuY3Rpb24gKCBjYWxsYmFjayApIHtcblxuXHRcdHRoaXMub25DaGFuZ2VDYWxsYmFjayA9IGNhbGxiYWNrO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRvbkNoYW5nZUNhbGxiYWNrOiBmdW5jdGlvbiAoKSB7fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBMYXllcnMoKSB7XG5cblx0dGhpcy5tYXNrID0gMSB8IDA7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggTGF5ZXJzLnByb3RvdHlwZSwge1xuXG5cdHNldDogZnVuY3Rpb24gKCBjaGFubmVsICkge1xuXG5cdFx0dGhpcy5tYXNrID0gMSA8PCBjaGFubmVsIHwgMDtcblxuXHR9LFxuXG5cdGVuYWJsZTogZnVuY3Rpb24gKCBjaGFubmVsICkge1xuXG5cdFx0dGhpcy5tYXNrIHw9IDEgPDwgY2hhbm5lbCB8IDA7XG5cblx0fSxcblxuXHR0b2dnbGU6IGZ1bmN0aW9uICggY2hhbm5lbCApIHtcblxuXHRcdHRoaXMubWFzayBePSAxIDw8IGNoYW5uZWwgfCAwO1xuXG5cdH0sXG5cblx0ZGlzYWJsZTogZnVuY3Rpb24gKCBjaGFubmVsICkge1xuXG5cdFx0dGhpcy5tYXNrICY9IH4gKCAxIDw8IGNoYW5uZWwgfCAwICk7XG5cblx0fSxcblxuXHR0ZXN0OiBmdW5jdGlvbiAoIGxheWVycyApIHtcblxuXHRcdHJldHVybiAoIHRoaXMubWFzayAmIGxheWVycy5tYXNrICkgIT09IDA7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgbWlrYWVsIGVtdGluZ2VyIC8gaHR0cDovL2dvbW8uc2UvXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKiBAYXV0aG9yIGVsZXBoYW50YXR3b3JrIC8gd3d3LmVsZXBoYW50YXR3b3JrLmNoXG4gKi9cblxudmFyIG9iamVjdDNESWQgPSAwO1xuXG5mdW5jdGlvbiBPYmplY3QzRCgpIHtcblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoIHRoaXMsICdpZCcsIHsgdmFsdWU6IG9iamVjdDNESWQgKysgfSApO1xuXG5cdHRoaXMudXVpZCA9IF9NYXRoLmdlbmVyYXRlVVVJRCgpO1xuXG5cdHRoaXMubmFtZSA9ICcnO1xuXHR0aGlzLnR5cGUgPSAnT2JqZWN0M0QnO1xuXG5cdHRoaXMucGFyZW50ID0gbnVsbDtcblx0dGhpcy5jaGlsZHJlbiA9IFtdO1xuXG5cdHRoaXMudXAgPSBPYmplY3QzRC5EZWZhdWx0VXAuY2xvbmUoKTtcblxuXHR2YXIgcG9zaXRpb24gPSBuZXcgVmVjdG9yMygpO1xuXHR2YXIgcm90YXRpb24gPSBuZXcgRXVsZXIoKTtcblx0dmFyIHF1YXRlcm5pb24gPSBuZXcgUXVhdGVybmlvbigpO1xuXHR2YXIgc2NhbGUgPSBuZXcgVmVjdG9yMyggMSwgMSwgMSApO1xuXG5cdGZ1bmN0aW9uIG9uUm90YXRpb25DaGFuZ2UoKSB7XG5cblx0XHRxdWF0ZXJuaW9uLnNldEZyb21FdWxlciggcm90YXRpb24sIGZhbHNlICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIG9uUXVhdGVybmlvbkNoYW5nZSgpIHtcblxuXHRcdHJvdGF0aW9uLnNldEZyb21RdWF0ZXJuaW9uKCBxdWF0ZXJuaW9uLCB1bmRlZmluZWQsIGZhbHNlICk7XG5cblx0fVxuXG5cdHJvdGF0aW9uLm9uQ2hhbmdlKCBvblJvdGF0aW9uQ2hhbmdlICk7XG5cdHF1YXRlcm5pb24ub25DaGFuZ2UoIG9uUXVhdGVybmlvbkNoYW5nZSApO1xuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCB0aGlzLCB7XG5cdFx0cG9zaXRpb246IHtcblx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHR2YWx1ZTogcG9zaXRpb25cblx0XHR9LFxuXHRcdHJvdGF0aW9uOiB7XG5cdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0dmFsdWU6IHJvdGF0aW9uXG5cdFx0fSxcblx0XHRxdWF0ZXJuaW9uOiB7XG5cdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0dmFsdWU6IHF1YXRlcm5pb25cblx0XHR9LFxuXHRcdHNjYWxlOiB7XG5cdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0dmFsdWU6IHNjYWxlXG5cdFx0fSxcblx0XHRtb2RlbFZpZXdNYXRyaXg6IHtcblx0XHRcdHZhbHVlOiBuZXcgTWF0cml4NCgpXG5cdFx0fSxcblx0XHRub3JtYWxNYXRyaXg6IHtcblx0XHRcdHZhbHVlOiBuZXcgTWF0cml4MygpXG5cdFx0fVxuXHR9ICk7XG5cblx0dGhpcy5tYXRyaXggPSBuZXcgTWF0cml4NCgpO1xuXHR0aGlzLm1hdHJpeFdvcmxkID0gbmV3IE1hdHJpeDQoKTtcblxuXHR0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSBPYmplY3QzRC5EZWZhdWx0TWF0cml4QXV0b1VwZGF0ZTtcblx0dGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlID0gZmFsc2U7XG5cblx0dGhpcy5sYXllcnMgPSBuZXcgTGF5ZXJzKCk7XG5cdHRoaXMudmlzaWJsZSA9IHRydWU7XG5cblx0dGhpcy5jYXN0U2hhZG93ID0gZmFsc2U7XG5cdHRoaXMucmVjZWl2ZVNoYWRvdyA9IGZhbHNlO1xuXG5cdHRoaXMuZnJ1c3R1bUN1bGxlZCA9IHRydWU7XG5cdHRoaXMucmVuZGVyT3JkZXIgPSAwO1xuXG5cdHRoaXMudXNlckRhdGEgPSB7fTtcblxufVxuXG5PYmplY3QzRC5EZWZhdWx0VXAgPSBuZXcgVmVjdG9yMyggMCwgMSwgMCApO1xuT2JqZWN0M0QuRGVmYXVsdE1hdHJpeEF1dG9VcGRhdGUgPSB0cnVlO1xuXG5PYmplY3QzRC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBFdmVudERpc3BhdGNoZXIucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogT2JqZWN0M0QsXG5cblx0aXNPYmplY3QzRDogdHJ1ZSxcblxuXHRvbkJlZm9yZVJlbmRlcjogZnVuY3Rpb24gKCkge30sXG5cdG9uQWZ0ZXJSZW5kZXI6IGZ1bmN0aW9uICgpIHt9LFxuXG5cdGFwcGx5TWF0cml4OiBmdW5jdGlvbiAoIG1hdHJpeCApIHtcblxuXHRcdHRoaXMubWF0cml4Lm11bHRpcGx5TWF0cmljZXMoIG1hdHJpeCwgdGhpcy5tYXRyaXggKTtcblxuXHRcdHRoaXMubWF0cml4LmRlY29tcG9zZSggdGhpcy5wb3NpdGlvbiwgdGhpcy5xdWF0ZXJuaW9uLCB0aGlzLnNjYWxlICk7XG5cblx0fSxcblxuXHRhcHBseVF1YXRlcm5pb246IGZ1bmN0aW9uICggcSApIHtcblxuXHRcdHRoaXMucXVhdGVybmlvbi5wcmVtdWx0aXBseSggcSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRSb3RhdGlvbkZyb21BeGlzQW5nbGU6IGZ1bmN0aW9uICggYXhpcywgYW5nbGUgKSB7XG5cblx0XHQvLyBhc3N1bWVzIGF4aXMgaXMgbm9ybWFsaXplZFxuXG5cdFx0dGhpcy5xdWF0ZXJuaW9uLnNldEZyb21BeGlzQW5nbGUoIGF4aXMsIGFuZ2xlICk7XG5cblx0fSxcblxuXHRzZXRSb3RhdGlvbkZyb21FdWxlcjogZnVuY3Rpb24gKCBldWxlciApIHtcblxuXHRcdHRoaXMucXVhdGVybmlvbi5zZXRGcm9tRXVsZXIoIGV1bGVyLCB0cnVlICk7XG5cblx0fSxcblxuXHRzZXRSb3RhdGlvbkZyb21NYXRyaXg6IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdC8vIGFzc3VtZXMgdGhlIHVwcGVyIDN4MyBvZiBtIGlzIGEgcHVyZSByb3RhdGlvbiBtYXRyaXggKGkuZSwgdW5zY2FsZWQpXG5cblx0XHR0aGlzLnF1YXRlcm5pb24uc2V0RnJvbVJvdGF0aW9uTWF0cml4KCBtICk7XG5cblx0fSxcblxuXHRzZXRSb3RhdGlvbkZyb21RdWF0ZXJuaW9uOiBmdW5jdGlvbiAoIHEgKSB7XG5cblx0XHQvLyBhc3N1bWVzIHEgaXMgbm9ybWFsaXplZFxuXG5cdFx0dGhpcy5xdWF0ZXJuaW9uLmNvcHkoIHEgKTtcblxuXHR9LFxuXG5cdHJvdGF0ZU9uQXhpczogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gcm90YXRlIG9iamVjdCBvbiBheGlzIGluIG9iamVjdCBzcGFjZVxuXHRcdC8vIGF4aXMgaXMgYXNzdW1lZCB0byBiZSBub3JtYWxpemVkXG5cblx0XHR2YXIgcTEgPSBuZXcgUXVhdGVybmlvbigpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHJvdGF0ZU9uQXhpcyggYXhpcywgYW5nbGUgKSB7XG5cblx0XHRcdHExLnNldEZyb21BeGlzQW5nbGUoIGF4aXMsIGFuZ2xlICk7XG5cblx0XHRcdHRoaXMucXVhdGVybmlvbi5tdWx0aXBseSggcTEgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRyb3RhdGVPbldvcmxkQXhpczogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gcm90YXRlIG9iamVjdCBvbiBheGlzIGluIHdvcmxkIHNwYWNlXG5cdFx0Ly8gYXhpcyBpcyBhc3N1bWVkIHRvIGJlIG5vcm1hbGl6ZWRcblx0XHQvLyBtZXRob2QgYXNzdW1lcyBubyByb3RhdGVkIHBhcmVudFxuXG5cdFx0dmFyIHExID0gbmV3IFF1YXRlcm5pb24oKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiByb3RhdGVPbldvcmxkQXhpcyggYXhpcywgYW5nbGUgKSB7XG5cblx0XHRcdHExLnNldEZyb21BeGlzQW5nbGUoIGF4aXMsIGFuZ2xlICk7XG5cblx0XHRcdHRoaXMucXVhdGVybmlvbi5wcmVtdWx0aXBseSggcTEgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRyb3RhdGVYOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMyggMSwgMCwgMCApO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHJvdGF0ZVgoIGFuZ2xlICkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5yb3RhdGVPbkF4aXMoIHYxLCBhbmdsZSApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0cm90YXRlWTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoIDAsIDEsIDAgKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiByb3RhdGVZKCBhbmdsZSApIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMucm90YXRlT25BeGlzKCB2MSwgYW5nbGUgKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHJvdGF0ZVo6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IzKCAwLCAwLCAxICk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gcm90YXRlWiggYW5nbGUgKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLnJvdGF0ZU9uQXhpcyggdjEsIGFuZ2xlICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHR0cmFuc2xhdGVPbkF4aXM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIHRyYW5zbGF0ZSBvYmplY3QgYnkgZGlzdGFuY2UgYWxvbmcgYXhpcyBpbiBvYmplY3Qgc3BhY2Vcblx0XHQvLyBheGlzIGlzIGFzc3VtZWQgdG8gYmUgbm9ybWFsaXplZFxuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiB0cmFuc2xhdGVPbkF4aXMoIGF4aXMsIGRpc3RhbmNlICkge1xuXG5cdFx0XHR2MS5jb3B5KCBheGlzICkuYXBwbHlRdWF0ZXJuaW9uKCB0aGlzLnF1YXRlcm5pb24gKTtcblxuXHRcdFx0dGhpcy5wb3NpdGlvbi5hZGQoIHYxLm11bHRpcGx5U2NhbGFyKCBkaXN0YW5jZSApICk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0dHJhbnNsYXRlWDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoIDEsIDAsIDAgKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiB0cmFuc2xhdGVYKCBkaXN0YW5jZSApIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMudHJhbnNsYXRlT25BeGlzKCB2MSwgZGlzdGFuY2UgKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHRyYW5zbGF0ZVk6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IzKCAwLCAxLCAwICk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gdHJhbnNsYXRlWSggZGlzdGFuY2UgKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLnRyYW5zbGF0ZU9uQXhpcyggdjEsIGRpc3RhbmNlICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHR0cmFuc2xhdGVaOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMyggMCwgMCwgMSApO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHRyYW5zbGF0ZVooIGRpc3RhbmNlICkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy50cmFuc2xhdGVPbkF4aXMoIHYxLCBkaXN0YW5jZSApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0bG9jYWxUb1dvcmxkOiBmdW5jdGlvbiAoIHZlY3RvciApIHtcblxuXHRcdHJldHVybiB2ZWN0b3IuYXBwbHlNYXRyaXg0KCB0aGlzLm1hdHJpeFdvcmxkICk7XG5cblx0fSxcblxuXHR3b3JsZFRvTG9jYWw6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBtMSA9IG5ldyBNYXRyaXg0KCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gd29ybGRUb0xvY2FsKCB2ZWN0b3IgKSB7XG5cblx0XHRcdHJldHVybiB2ZWN0b3IuYXBwbHlNYXRyaXg0KCBtMS5nZXRJbnZlcnNlKCB0aGlzLm1hdHJpeFdvcmxkICkgKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGxvb2tBdDogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gVGhpcyBtZXRob2QgZG9lcyBub3Qgc3VwcG9ydCBvYmplY3RzIHdpdGggcm90YXRlZCBhbmQvb3IgdHJhbnNsYXRlZCBwYXJlbnQocylcblxuXHRcdHZhciBtMSA9IG5ldyBNYXRyaXg0KCk7XG5cdFx0dmFyIHZlY3RvciA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gbG9va0F0KCB4LCB5LCB6ICkge1xuXG5cdFx0XHRpZiAoIHguaXNWZWN0b3IzICkge1xuXG5cdFx0XHRcdHZlY3Rvci5jb3B5KCB4ICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0dmVjdG9yLnNldCggeCwgeSwgeiApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggdGhpcy5pc0NhbWVyYSApIHtcblxuXHRcdFx0XHRtMS5sb29rQXQoIHRoaXMucG9zaXRpb24sIHZlY3RvciwgdGhpcy51cCApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdG0xLmxvb2tBdCggdmVjdG9yLCB0aGlzLnBvc2l0aW9uLCB0aGlzLnVwICk7XG5cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5xdWF0ZXJuaW9uLnNldEZyb21Sb3RhdGlvbk1hdHJpeCggbTEgKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGFkZDogZnVuY3Rpb24gKCBvYmplY3QgKSB7XG5cblx0XHRpZiAoIGFyZ3VtZW50cy5sZW5ndGggPiAxICkge1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRcdHRoaXMuYWRkKCBhcmd1bWVudHNbIGkgXSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBvYmplY3QgPT09IHRoaXMgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoIFwiVEhSRUUuT2JqZWN0M0QuYWRkOiBvYmplY3QgY2FuJ3QgYmUgYWRkZWQgYXMgYSBjaGlsZCBvZiBpdHNlbGYuXCIsIG9iamVjdCApO1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9XG5cblx0XHRpZiAoICggb2JqZWN0ICYmIG9iamVjdC5pc09iamVjdDNEICkgKSB7XG5cblx0XHRcdGlmICggb2JqZWN0LnBhcmVudCAhPT0gbnVsbCApIHtcblxuXHRcdFx0XHRvYmplY3QucGFyZW50LnJlbW92ZSggb2JqZWN0ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0b2JqZWN0LnBhcmVudCA9IHRoaXM7XG5cdFx0XHRvYmplY3QuZGlzcGF0Y2hFdmVudCggeyB0eXBlOiAnYWRkZWQnIH0gKTtcblxuXHRcdFx0dGhpcy5jaGlsZHJlbi5wdXNoKCBvYmplY3QgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoIFwiVEhSRUUuT2JqZWN0M0QuYWRkOiBvYmplY3Qgbm90IGFuIGluc3RhbmNlIG9mIFRIUkVFLk9iamVjdDNELlwiLCBvYmplY3QgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0cmVtb3ZlOiBmdW5jdGlvbiAoIG9iamVjdCApIHtcblxuXHRcdGlmICggYXJndW1lbnRzLmxlbmd0aCA+IDEgKSB7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdFx0dGhpcy5yZW1vdmUoIGFyZ3VtZW50c1sgaSBdICk7XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9XG5cblx0XHR2YXIgaW5kZXggPSB0aGlzLmNoaWxkcmVuLmluZGV4T2YoIG9iamVjdCApO1xuXG5cdFx0aWYgKCBpbmRleCAhPT0gLSAxICkge1xuXG5cdFx0XHRvYmplY3QucGFyZW50ID0gbnVsbDtcblxuXHRcdFx0b2JqZWN0LmRpc3BhdGNoRXZlbnQoIHsgdHlwZTogJ3JlbW92ZWQnIH0gKTtcblxuXHRcdFx0dGhpcy5jaGlsZHJlbi5zcGxpY2UoIGluZGV4LCAxICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGdldE9iamVjdEJ5SWQ6IGZ1bmN0aW9uICggaWQgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5nZXRPYmplY3RCeVByb3BlcnR5KCAnaWQnLCBpZCApO1xuXG5cdH0sXG5cblx0Z2V0T2JqZWN0QnlOYW1lOiBmdW5jdGlvbiAoIG5hbWUgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5nZXRPYmplY3RCeVByb3BlcnR5KCAnbmFtZScsIG5hbWUgKTtcblxuXHR9LFxuXG5cdGdldE9iamVjdEJ5UHJvcGVydHk6IGZ1bmN0aW9uICggbmFtZSwgdmFsdWUgKSB7XG5cblx0XHRpZiAoIHRoaXNbIG5hbWUgXSA9PT0gdmFsdWUgKSByZXR1cm4gdGhpcztcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGNoaWxkID0gdGhpcy5jaGlsZHJlblsgaSBdO1xuXHRcdFx0dmFyIG9iamVjdCA9IGNoaWxkLmdldE9iamVjdEJ5UHJvcGVydHkoIG5hbWUsIHZhbHVlICk7XG5cblx0XHRcdGlmICggb2JqZWN0ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0cmV0dXJuIG9iamVjdDtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblxuXHR9LFxuXG5cdGdldFdvcmxkUG9zaXRpb246IGZ1bmN0aW9uICggdGFyZ2V0ICkge1xuXG5cdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0M0Q6IC5nZXRXb3JsZFBvc2l0aW9uKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR9XG5cblx0XHR0aGlzLnVwZGF0ZU1hdHJpeFdvcmxkKCB0cnVlICk7XG5cblx0XHRyZXR1cm4gdGFyZ2V0LnNldEZyb21NYXRyaXhQb3NpdGlvbiggdGhpcy5tYXRyaXhXb3JsZCApO1xuXG5cdH0sXG5cblx0Z2V0V29ybGRRdWF0ZXJuaW9uOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgcG9zaXRpb24gPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciBzY2FsZSA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gZ2V0V29ybGRRdWF0ZXJuaW9uKCB0YXJnZXQgKSB7XG5cblx0XHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0M0Q6IC5nZXRXb3JsZFF1YXRlcm5pb24oKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApO1xuXHRcdFx0XHR0YXJnZXQgPSBuZXcgUXVhdGVybmlvbigpO1xuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMudXBkYXRlTWF0cml4V29ybGQoIHRydWUgKTtcblxuXHRcdFx0dGhpcy5tYXRyaXhXb3JsZC5kZWNvbXBvc2UoIHBvc2l0aW9uLCB0YXJnZXQsIHNjYWxlICk7XG5cblx0XHRcdHJldHVybiB0YXJnZXQ7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRnZXRXb3JsZFNjYWxlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgcG9zaXRpb24gPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciBxdWF0ZXJuaW9uID0gbmV3IFF1YXRlcm5pb24oKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBnZXRXb3JsZFNjYWxlKCB0YXJnZXQgKSB7XG5cblx0XHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0M0Q6IC5nZXRXb3JsZFNjYWxlKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdFx0dGFyZ2V0ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLnVwZGF0ZU1hdHJpeFdvcmxkKCB0cnVlICk7XG5cblx0XHRcdHRoaXMubWF0cml4V29ybGQuZGVjb21wb3NlKCBwb3NpdGlvbiwgcXVhdGVybmlvbiwgdGFyZ2V0ICk7XG5cblx0XHRcdHJldHVybiB0YXJnZXQ7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRnZXRXb3JsZERpcmVjdGlvbjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHF1YXRlcm5pb24gPSBuZXcgUXVhdGVybmlvbigpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGdldFdvcmxkRGlyZWN0aW9uKCB0YXJnZXQgKSB7XG5cblx0XHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0M0Q6IC5nZXRXb3JsZERpcmVjdGlvbigpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5nZXRXb3JsZFF1YXRlcm5pb24oIHF1YXRlcm5pb24gKTtcblxuXHRcdFx0cmV0dXJuIHRhcmdldC5zZXQoIDAsIDAsIDEgKS5hcHBseVF1YXRlcm5pb24oIHF1YXRlcm5pb24gKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHJheWNhc3Q6IGZ1bmN0aW9uICgpIHt9LFxuXG5cdHRyYXZlcnNlOiBmdW5jdGlvbiAoIGNhbGxiYWNrICkge1xuXG5cdFx0Y2FsbGJhY2soIHRoaXMgKTtcblxuXHRcdHZhciBjaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW47XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRjaGlsZHJlblsgaSBdLnRyYXZlcnNlKCBjYWxsYmFjayApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0dHJhdmVyc2VWaXNpYmxlOiBmdW5jdGlvbiAoIGNhbGxiYWNrICkge1xuXG5cdFx0aWYgKCB0aGlzLnZpc2libGUgPT09IGZhbHNlICkgcmV0dXJuO1xuXG5cdFx0Y2FsbGJhY2soIHRoaXMgKTtcblxuXHRcdHZhciBjaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW47XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRjaGlsZHJlblsgaSBdLnRyYXZlcnNlVmlzaWJsZSggY2FsbGJhY2sgKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdHRyYXZlcnNlQW5jZXN0b3JzOiBmdW5jdGlvbiAoIGNhbGxiYWNrICkge1xuXG5cdFx0dmFyIHBhcmVudCA9IHRoaXMucGFyZW50O1xuXG5cdFx0aWYgKCBwYXJlbnQgIT09IG51bGwgKSB7XG5cblx0XHRcdGNhbGxiYWNrKCBwYXJlbnQgKTtcblxuXHRcdFx0cGFyZW50LnRyYXZlcnNlQW5jZXN0b3JzKCBjYWxsYmFjayApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0dXBkYXRlTWF0cml4OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLm1hdHJpeC5jb21wb3NlKCB0aGlzLnBvc2l0aW9uLCB0aGlzLnF1YXRlcm5pb24sIHRoaXMuc2NhbGUgKTtcblxuXHRcdHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0fSxcblxuXHR1cGRhdGVNYXRyaXhXb3JsZDogZnVuY3Rpb24gKCBmb3JjZSApIHtcblxuXHRcdGlmICggdGhpcy5tYXRyaXhBdXRvVXBkYXRlICkgdGhpcy51cGRhdGVNYXRyaXgoKTtcblxuXHRcdGlmICggdGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlIHx8IGZvcmNlICkge1xuXG5cdFx0XHRpZiAoIHRoaXMucGFyZW50ID09PSBudWxsICkge1xuXG5cdFx0XHRcdHRoaXMubWF0cml4V29ybGQuY29weSggdGhpcy5tYXRyaXggKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHR0aGlzLm1hdHJpeFdvcmxkLm11bHRpcGx5TWF0cmljZXMoIHRoaXMucGFyZW50Lm1hdHJpeFdvcmxkLCB0aGlzLm1hdHJpeCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZSA9IGZhbHNlO1xuXG5cdFx0XHRmb3JjZSA9IHRydWU7XG5cblx0XHR9XG5cblx0XHQvLyB1cGRhdGUgY2hpbGRyZW5cblxuXHRcdHZhciBjaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW47XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRjaGlsZHJlblsgaSBdLnVwZGF0ZU1hdHJpeFdvcmxkKCBmb3JjZSApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0dG9KU09OOiBmdW5jdGlvbiAoIG1ldGEgKSB7XG5cblx0XHQvLyBtZXRhIGlzIGEgc3RyaW5nIHdoZW4gY2FsbGVkIGZyb20gSlNPTi5zdHJpbmdpZnlcblx0XHR2YXIgaXNSb290T2JqZWN0ID0gKCBtZXRhID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIG1ldGEgPT09ICdzdHJpbmcnICk7XG5cblx0XHR2YXIgb3V0cHV0ID0ge307XG5cblx0XHQvLyBtZXRhIGlzIGEgaGFzaCB1c2VkIHRvIGNvbGxlY3QgZ2VvbWV0cmllcywgbWF0ZXJpYWxzLlxuXHRcdC8vIG5vdCBwcm92aWRpbmcgaXQgaW1wbGllcyB0aGF0IHRoaXMgaXMgdGhlIHJvb3Qgb2JqZWN0XG5cdFx0Ly8gYmVpbmcgc2VyaWFsaXplZC5cblx0XHRpZiAoIGlzUm9vdE9iamVjdCApIHtcblxuXHRcdFx0Ly8gaW5pdGlhbGl6ZSBtZXRhIG9ialxuXHRcdFx0bWV0YSA9IHtcblx0XHRcdFx0Z2VvbWV0cmllczoge30sXG5cdFx0XHRcdG1hdGVyaWFsczoge30sXG5cdFx0XHRcdHRleHR1cmVzOiB7fSxcblx0XHRcdFx0aW1hZ2VzOiB7fSxcblx0XHRcdFx0c2hhcGVzOiB7fVxuXHRcdFx0fTtcblxuXHRcdFx0b3V0cHV0Lm1ldGFkYXRhID0ge1xuXHRcdFx0XHR2ZXJzaW9uOiA0LjUsXG5cdFx0XHRcdHR5cGU6ICdPYmplY3QnLFxuXHRcdFx0XHRnZW5lcmF0b3I6ICdPYmplY3QzRC50b0pTT04nXG5cdFx0XHR9O1xuXG5cdFx0fVxuXG5cdFx0Ly8gc3RhbmRhcmQgT2JqZWN0M0Qgc2VyaWFsaXphdGlvblxuXG5cdFx0dmFyIG9iamVjdCA9IHt9O1xuXG5cdFx0b2JqZWN0LnV1aWQgPSB0aGlzLnV1aWQ7XG5cdFx0b2JqZWN0LnR5cGUgPSB0aGlzLnR5cGU7XG5cblx0XHRpZiAoIHRoaXMubmFtZSAhPT0gJycgKSBvYmplY3QubmFtZSA9IHRoaXMubmFtZTtcblx0XHRpZiAoIHRoaXMuY2FzdFNoYWRvdyA9PT0gdHJ1ZSApIG9iamVjdC5jYXN0U2hhZG93ID0gdHJ1ZTtcblx0XHRpZiAoIHRoaXMucmVjZWl2ZVNoYWRvdyA9PT0gdHJ1ZSApIG9iamVjdC5yZWNlaXZlU2hhZG93ID0gdHJ1ZTtcblx0XHRpZiAoIHRoaXMudmlzaWJsZSA9PT0gZmFsc2UgKSBvYmplY3QudmlzaWJsZSA9IGZhbHNlO1xuXHRcdGlmICggdGhpcy5mcnVzdHVtQ3VsbGVkID09PSBmYWxzZSApIG9iamVjdC5mcnVzdHVtQ3VsbGVkID0gZmFsc2U7XG5cdFx0aWYgKCB0aGlzLnJlbmRlck9yZGVyICE9PSAwICkgb2JqZWN0LnJlbmRlck9yZGVyID0gdGhpcy5yZW5kZXJPcmRlcjtcblx0XHRpZiAoIEpTT04uc3RyaW5naWZ5KCB0aGlzLnVzZXJEYXRhICkgIT09ICd7fScgKSBvYmplY3QudXNlckRhdGEgPSB0aGlzLnVzZXJEYXRhO1xuXG5cdFx0b2JqZWN0Lm1hdHJpeCA9IHRoaXMubWF0cml4LnRvQXJyYXkoKTtcblxuXHRcdGlmICggdGhpcy5tYXRyaXhBdXRvVXBkYXRlID09PSBmYWxzZSApIG9iamVjdC5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7XG5cblx0XHQvL1xuXG5cdFx0ZnVuY3Rpb24gc2VyaWFsaXplKCBsaWJyYXJ5LCBlbGVtZW50ICkge1xuXG5cdFx0XHRpZiAoIGxpYnJhcnlbIGVsZW1lbnQudXVpZCBdID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0bGlicmFyeVsgZWxlbWVudC51dWlkIF0gPSBlbGVtZW50LnRvSlNPTiggbWV0YSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBlbGVtZW50LnV1aWQ7XG5cblx0XHR9XG5cblx0XHRpZiAoIHRoaXMuZ2VvbWV0cnkgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0b2JqZWN0Lmdlb21ldHJ5ID0gc2VyaWFsaXplKCBtZXRhLmdlb21ldHJpZXMsIHRoaXMuZ2VvbWV0cnkgKTtcblxuXHRcdFx0dmFyIHBhcmFtZXRlcnMgPSB0aGlzLmdlb21ldHJ5LnBhcmFtZXRlcnM7XG5cblx0XHRcdGlmICggcGFyYW1ldGVycyAhPT0gdW5kZWZpbmVkICYmIHBhcmFtZXRlcnMuc2hhcGVzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0dmFyIHNoYXBlcyA9IHBhcmFtZXRlcnMuc2hhcGVzO1xuXG5cdFx0XHRcdGlmICggQXJyYXkuaXNBcnJheSggc2hhcGVzICkgKSB7XG5cblx0XHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBzaGFwZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdFx0dmFyIHNoYXBlID0gc2hhcGVzWyBpIF07XG5cblx0XHRcdFx0XHRcdHNlcmlhbGl6ZSggbWV0YS5zaGFwZXMsIHNoYXBlICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHNlcmlhbGl6ZSggbWV0YS5zaGFwZXMsIHNoYXBlcyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLm1hdGVyaWFsICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGlmICggQXJyYXkuaXNBcnJheSggdGhpcy5tYXRlcmlhbCApICkge1xuXG5cdFx0XHRcdHZhciB1dWlkcyA9IFtdO1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHRoaXMubWF0ZXJpYWwubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdHV1aWRzLnB1c2goIHNlcmlhbGl6ZSggbWV0YS5tYXRlcmlhbHMsIHRoaXMubWF0ZXJpYWxbIGkgXSApICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdG9iamVjdC5tYXRlcmlhbCA9IHV1aWRzO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdG9iamVjdC5tYXRlcmlhbCA9IHNlcmlhbGl6ZSggbWV0YS5tYXRlcmlhbHMsIHRoaXMubWF0ZXJpYWwgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly9cblxuXHRcdGlmICggdGhpcy5jaGlsZHJlbi5sZW5ndGggPiAwICkge1xuXG5cdFx0XHRvYmplY3QuY2hpbGRyZW4gPSBbXTtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdFx0b2JqZWN0LmNoaWxkcmVuLnB1c2goIHRoaXMuY2hpbGRyZW5bIGkgXS50b0pTT04oIG1ldGEgKS5vYmplY3QgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCBpc1Jvb3RPYmplY3QgKSB7XG5cblx0XHRcdHZhciBnZW9tZXRyaWVzID0gZXh0cmFjdEZyb21DYWNoZSggbWV0YS5nZW9tZXRyaWVzICk7XG5cdFx0XHR2YXIgbWF0ZXJpYWxzID0gZXh0cmFjdEZyb21DYWNoZSggbWV0YS5tYXRlcmlhbHMgKTtcblx0XHRcdHZhciB0ZXh0dXJlcyA9IGV4dHJhY3RGcm9tQ2FjaGUoIG1ldGEudGV4dHVyZXMgKTtcblx0XHRcdHZhciBpbWFnZXMgPSBleHRyYWN0RnJvbUNhY2hlKCBtZXRhLmltYWdlcyApO1xuXHRcdFx0dmFyIHNoYXBlcyA9IGV4dHJhY3RGcm9tQ2FjaGUoIG1ldGEuc2hhcGVzICk7XG5cblx0XHRcdGlmICggZ2VvbWV0cmllcy5sZW5ndGggPiAwICkgb3V0cHV0Lmdlb21ldHJpZXMgPSBnZW9tZXRyaWVzO1xuXHRcdFx0aWYgKCBtYXRlcmlhbHMubGVuZ3RoID4gMCApIG91dHB1dC5tYXRlcmlhbHMgPSBtYXRlcmlhbHM7XG5cdFx0XHRpZiAoIHRleHR1cmVzLmxlbmd0aCA+IDAgKSBvdXRwdXQudGV4dHVyZXMgPSB0ZXh0dXJlcztcblx0XHRcdGlmICggaW1hZ2VzLmxlbmd0aCA+IDAgKSBvdXRwdXQuaW1hZ2VzID0gaW1hZ2VzO1xuXHRcdFx0aWYgKCBzaGFwZXMubGVuZ3RoID4gMCApIG91dHB1dC5zaGFwZXMgPSBzaGFwZXM7XG5cblx0XHR9XG5cblx0XHRvdXRwdXQub2JqZWN0ID0gb2JqZWN0O1xuXG5cdFx0cmV0dXJuIG91dHB1dDtcblxuXHRcdC8vIGV4dHJhY3QgZGF0YSBmcm9tIHRoZSBjYWNoZSBoYXNoXG5cdFx0Ly8gcmVtb3ZlIG1ldGFkYXRhIG9uIGVhY2ggaXRlbVxuXHRcdC8vIGFuZCByZXR1cm4gYXMgYXJyYXlcblx0XHRmdW5jdGlvbiBleHRyYWN0RnJvbUNhY2hlKCBjYWNoZSApIHtcblxuXHRcdFx0dmFyIHZhbHVlcyA9IFtdO1xuXHRcdFx0Zm9yICggdmFyIGtleSBpbiBjYWNoZSApIHtcblxuXHRcdFx0XHR2YXIgZGF0YSA9IGNhY2hlWyBrZXkgXTtcblx0XHRcdFx0ZGVsZXRlIGRhdGEubWV0YWRhdGE7XG5cdFx0XHRcdHZhbHVlcy5wdXNoKCBkYXRhICk7XG5cblx0XHRcdH1cblx0XHRcdHJldHVybiB2YWx1ZXM7XG5cblx0XHR9XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCByZWN1cnNpdmUgKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzLCByZWN1cnNpdmUgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlLCByZWN1cnNpdmUgKSB7XG5cblx0XHRpZiAoIHJlY3Vyc2l2ZSA9PT0gdW5kZWZpbmVkICkgcmVjdXJzaXZlID0gdHJ1ZTtcblxuXHRcdHRoaXMubmFtZSA9IHNvdXJjZS5uYW1lO1xuXG5cdFx0dGhpcy51cC5jb3B5KCBzb3VyY2UudXAgKTtcblxuXHRcdHRoaXMucG9zaXRpb24uY29weSggc291cmNlLnBvc2l0aW9uICk7XG5cdFx0dGhpcy5xdWF0ZXJuaW9uLmNvcHkoIHNvdXJjZS5xdWF0ZXJuaW9uICk7XG5cdFx0dGhpcy5zY2FsZS5jb3B5KCBzb3VyY2Uuc2NhbGUgKTtcblxuXHRcdHRoaXMubWF0cml4LmNvcHkoIHNvdXJjZS5tYXRyaXggKTtcblx0XHR0aGlzLm1hdHJpeFdvcmxkLmNvcHkoIHNvdXJjZS5tYXRyaXhXb3JsZCApO1xuXG5cdFx0dGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gc291cmNlLm1hdHJpeEF1dG9VcGRhdGU7XG5cdFx0dGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlID0gc291cmNlLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU7XG5cblx0XHR0aGlzLmxheWVycy5tYXNrID0gc291cmNlLmxheWVycy5tYXNrO1xuXHRcdHRoaXMudmlzaWJsZSA9IHNvdXJjZS52aXNpYmxlO1xuXG5cdFx0dGhpcy5jYXN0U2hhZG93ID0gc291cmNlLmNhc3RTaGFkb3c7XG5cdFx0dGhpcy5yZWNlaXZlU2hhZG93ID0gc291cmNlLnJlY2VpdmVTaGFkb3c7XG5cblx0XHR0aGlzLmZydXN0dW1DdWxsZWQgPSBzb3VyY2UuZnJ1c3R1bUN1bGxlZDtcblx0XHR0aGlzLnJlbmRlck9yZGVyID0gc291cmNlLnJlbmRlck9yZGVyO1xuXG5cdFx0dGhpcy51c2VyRGF0YSA9IEpTT04ucGFyc2UoIEpTT04uc3RyaW5naWZ5KCBzb3VyY2UudXNlckRhdGEgKSApO1xuXG5cdFx0aWYgKCByZWN1cnNpdmUgPT09IHRydWUgKSB7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IHNvdXJjZS5jaGlsZHJlbi5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdFx0dmFyIGNoaWxkID0gc291cmNlLmNoaWxkcmVuWyBpIF07XG5cdFx0XHRcdHRoaXMuYWRkKCBjaGlsZC5jbG9uZSgpICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIG1pa2FlbCBlbXRpbmdlciAvIGh0dHA6Ly9nb21vLnNlL1xuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4qL1xuXG5mdW5jdGlvbiBDYW1lcmEoKSB7XG5cblx0T2JqZWN0M0QuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdDYW1lcmEnO1xuXG5cdHRoaXMubWF0cml4V29ybGRJbnZlcnNlID0gbmV3IE1hdHJpeDQoKTtcblx0dGhpcy5wcm9qZWN0aW9uTWF0cml4ID0gbmV3IE1hdHJpeDQoKTtcblxufVxuXG5DYW1lcmEucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogQ2FtZXJhLFxuXG5cdGlzQ2FtZXJhOiB0cnVlLFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlLCByZWN1cnNpdmUgKSB7XG5cblx0XHRPYmplY3QzRC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UsIHJlY3Vyc2l2ZSApO1xuXG5cdFx0dGhpcy5tYXRyaXhXb3JsZEludmVyc2UuY29weSggc291cmNlLm1hdHJpeFdvcmxkSW52ZXJzZSApO1xuXHRcdHRoaXMucHJvamVjdGlvbk1hdHJpeC5jb3B5KCBzb3VyY2UucHJvamVjdGlvbk1hdHJpeCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRnZXRXb3JsZERpcmVjdGlvbjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHF1YXRlcm5pb24gPSBuZXcgUXVhdGVybmlvbigpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGdldFdvcmxkRGlyZWN0aW9uKCB0YXJnZXQgKSB7XG5cblx0XHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQ2FtZXJhOiAuZ2V0V29ybGREaXJlY3Rpb24oKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApO1xuXHRcdFx0XHR0YXJnZXQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuZ2V0V29ybGRRdWF0ZXJuaW9uKCBxdWF0ZXJuaW9uICk7XG5cblx0XHRcdHJldHVybiB0YXJnZXQuc2V0KCAwLCAwLCAtIDEgKS5hcHBseVF1YXRlcm5pb24oIHF1YXRlcm5pb24gKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHVwZGF0ZU1hdHJpeFdvcmxkOiBmdW5jdGlvbiAoIGZvcmNlICkge1xuXG5cdFx0T2JqZWN0M0QucHJvdG90eXBlLnVwZGF0ZU1hdHJpeFdvcmxkLmNhbGwoIHRoaXMsIGZvcmNlICk7XG5cblx0XHR0aGlzLm1hdHJpeFdvcmxkSW52ZXJzZS5nZXRJbnZlcnNlKCB0aGlzLm1hdHJpeFdvcmxkICk7XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKiBAYXV0aG9yIGFyb3NlIC8gaHR0cDovL2dpdGh1Yi5jb20vYXJvc2VcbiAqL1xuXG5mdW5jdGlvbiBPcnRob2dyYXBoaWNDYW1lcmEoIGxlZnQsIHJpZ2h0LCB0b3AsIGJvdHRvbSwgbmVhciwgZmFyICkge1xuXG5cdENhbWVyYS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ09ydGhvZ3JhcGhpY0NhbWVyYSc7XG5cblx0dGhpcy56b29tID0gMTtcblx0dGhpcy52aWV3ID0gbnVsbDtcblxuXHR0aGlzLmxlZnQgPSBsZWZ0O1xuXHR0aGlzLnJpZ2h0ID0gcmlnaHQ7XG5cdHRoaXMudG9wID0gdG9wO1xuXHR0aGlzLmJvdHRvbSA9IGJvdHRvbTtcblxuXHR0aGlzLm5lYXIgPSAoIG5lYXIgIT09IHVuZGVmaW5lZCApID8gbmVhciA6IDAuMTtcblx0dGhpcy5mYXIgPSAoIGZhciAhPT0gdW5kZWZpbmVkICkgPyBmYXIgOiAyMDAwO1xuXG5cdHRoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xuXG59XG5cbk9ydGhvZ3JhcGhpY0NhbWVyYS5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBDYW1lcmEucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogT3J0aG9ncmFwaGljQ2FtZXJhLFxuXG5cdGlzT3J0aG9ncmFwaGljQ2FtZXJhOiB0cnVlLFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlLCByZWN1cnNpdmUgKSB7XG5cblx0XHRDYW1lcmEucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlLCByZWN1cnNpdmUgKTtcblxuXHRcdHRoaXMubGVmdCA9IHNvdXJjZS5sZWZ0O1xuXHRcdHRoaXMucmlnaHQgPSBzb3VyY2UucmlnaHQ7XG5cdFx0dGhpcy50b3AgPSBzb3VyY2UudG9wO1xuXHRcdHRoaXMuYm90dG9tID0gc291cmNlLmJvdHRvbTtcblx0XHR0aGlzLm5lYXIgPSBzb3VyY2UubmVhcjtcblx0XHR0aGlzLmZhciA9IHNvdXJjZS5mYXI7XG5cblx0XHR0aGlzLnpvb20gPSBzb3VyY2Uuem9vbTtcblx0XHR0aGlzLnZpZXcgPSBzb3VyY2UudmlldyA9PT0gbnVsbCA/IG51bGwgOiBPYmplY3QuYXNzaWduKCB7fSwgc291cmNlLnZpZXcgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0Vmlld09mZnNldDogZnVuY3Rpb24gKCBmdWxsV2lkdGgsIGZ1bGxIZWlnaHQsIHgsIHksIHdpZHRoLCBoZWlnaHQgKSB7XG5cblx0XHRpZiAoIHRoaXMudmlldyA9PT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy52aWV3ID0ge1xuXHRcdFx0XHRlbmFibGVkOiB0cnVlLFxuXHRcdFx0XHRmdWxsV2lkdGg6IDEsXG5cdFx0XHRcdGZ1bGxIZWlnaHQ6IDEsXG5cdFx0XHRcdG9mZnNldFg6IDAsXG5cdFx0XHRcdG9mZnNldFk6IDAsXG5cdFx0XHRcdHdpZHRoOiAxLFxuXHRcdFx0XHRoZWlnaHQ6IDFcblx0XHRcdH07XG5cblx0XHR9XG5cblx0XHR0aGlzLnZpZXcuZW5hYmxlZCA9IHRydWU7XG5cdFx0dGhpcy52aWV3LmZ1bGxXaWR0aCA9IGZ1bGxXaWR0aDtcblx0XHR0aGlzLnZpZXcuZnVsbEhlaWdodCA9IGZ1bGxIZWlnaHQ7XG5cdFx0dGhpcy52aWV3Lm9mZnNldFggPSB4O1xuXHRcdHRoaXMudmlldy5vZmZzZXRZID0geTtcblx0XHR0aGlzLnZpZXcud2lkdGggPSB3aWR0aDtcblx0XHR0aGlzLnZpZXcuaGVpZ2h0ID0gaGVpZ2h0O1xuXG5cdFx0dGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XG5cblx0fSxcblxuXHRjbGVhclZpZXdPZmZzZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGlmICggdGhpcy52aWV3ICE9PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLnZpZXcuZW5hYmxlZCA9IGZhbHNlO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XG5cblx0fSxcblxuXHR1cGRhdGVQcm9qZWN0aW9uTWF0cml4OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgZHggPSAoIHRoaXMucmlnaHQgLSB0aGlzLmxlZnQgKSAvICggMiAqIHRoaXMuem9vbSApO1xuXHRcdHZhciBkeSA9ICggdGhpcy50b3AgLSB0aGlzLmJvdHRvbSApIC8gKCAyICogdGhpcy56b29tICk7XG5cdFx0dmFyIGN4ID0gKCB0aGlzLnJpZ2h0ICsgdGhpcy5sZWZ0ICkgLyAyO1xuXHRcdHZhciBjeSA9ICggdGhpcy50b3AgKyB0aGlzLmJvdHRvbSApIC8gMjtcblxuXHRcdHZhciBsZWZ0ID0gY3ggLSBkeDtcblx0XHR2YXIgcmlnaHQgPSBjeCArIGR4O1xuXHRcdHZhciB0b3AgPSBjeSArIGR5O1xuXHRcdHZhciBib3R0b20gPSBjeSAtIGR5O1xuXG5cdFx0aWYgKCB0aGlzLnZpZXcgIT09IG51bGwgJiYgdGhpcy52aWV3LmVuYWJsZWQgKSB7XG5cblx0XHRcdHZhciB6b29tVyA9IHRoaXMuem9vbSAvICggdGhpcy52aWV3LndpZHRoIC8gdGhpcy52aWV3LmZ1bGxXaWR0aCApO1xuXHRcdFx0dmFyIHpvb21IID0gdGhpcy56b29tIC8gKCB0aGlzLnZpZXcuaGVpZ2h0IC8gdGhpcy52aWV3LmZ1bGxIZWlnaHQgKTtcblx0XHRcdHZhciBzY2FsZVcgPSAoIHRoaXMucmlnaHQgLSB0aGlzLmxlZnQgKSAvIHRoaXMudmlldy53aWR0aDtcblx0XHRcdHZhciBzY2FsZUggPSAoIHRoaXMudG9wIC0gdGhpcy5ib3R0b20gKSAvIHRoaXMudmlldy5oZWlnaHQ7XG5cblx0XHRcdGxlZnQgKz0gc2NhbGVXICogKCB0aGlzLnZpZXcub2Zmc2V0WCAvIHpvb21XICk7XG5cdFx0XHRyaWdodCA9IGxlZnQgKyBzY2FsZVcgKiAoIHRoaXMudmlldy53aWR0aCAvIHpvb21XICk7XG5cdFx0XHR0b3AgLT0gc2NhbGVIICogKCB0aGlzLnZpZXcub2Zmc2V0WSAvIHpvb21IICk7XG5cdFx0XHRib3R0b20gPSB0b3AgLSBzY2FsZUggKiAoIHRoaXMudmlldy5oZWlnaHQgLyB6b29tSCApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5wcm9qZWN0aW9uTWF0cml4Lm1ha2VPcnRob2dyYXBoaWMoIGxlZnQsIHJpZ2h0LCB0b3AsIGJvdHRvbSwgdGhpcy5uZWFyLCB0aGlzLmZhciApO1xuXG5cdH0sXG5cblx0dG9KU09OOiBmdW5jdGlvbiAoIG1ldGEgKSB7XG5cblx0XHR2YXIgZGF0YSA9IE9iamVjdDNELnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcywgbWV0YSApO1xuXG5cdFx0ZGF0YS5vYmplY3Quem9vbSA9IHRoaXMuem9vbTtcblx0XHRkYXRhLm9iamVjdC5sZWZ0ID0gdGhpcy5sZWZ0O1xuXHRcdGRhdGEub2JqZWN0LnJpZ2h0ID0gdGhpcy5yaWdodDtcblx0XHRkYXRhLm9iamVjdC50b3AgPSB0aGlzLnRvcDtcblx0XHRkYXRhLm9iamVjdC5ib3R0b20gPSB0aGlzLmJvdHRvbTtcblx0XHRkYXRhLm9iamVjdC5uZWFyID0gdGhpcy5uZWFyO1xuXHRcdGRhdGEub2JqZWN0LmZhciA9IHRoaXMuZmFyO1xuXG5cdFx0aWYgKCB0aGlzLnZpZXcgIT09IG51bGwgKSBkYXRhLm9iamVjdC52aWV3ID0gT2JqZWN0LmFzc2lnbigge30sIHRoaXMudmlldyApO1xuXG5cdFx0cmV0dXJuIGRhdGE7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKi9cblxuZnVuY3Rpb24gRmFjZTMoIGEsIGIsIGMsIG5vcm1hbCwgY29sb3IsIG1hdGVyaWFsSW5kZXggKSB7XG5cblx0dGhpcy5hID0gYTtcblx0dGhpcy5iID0gYjtcblx0dGhpcy5jID0gYztcblxuXHR0aGlzLm5vcm1hbCA9ICggbm9ybWFsICYmIG5vcm1hbC5pc1ZlY3RvcjMgKSA/IG5vcm1hbCA6IG5ldyBWZWN0b3IzKCk7XG5cdHRoaXMudmVydGV4Tm9ybWFscyA9IEFycmF5LmlzQXJyYXkoIG5vcm1hbCApID8gbm9ybWFsIDogW107XG5cblx0dGhpcy5jb2xvciA9ICggY29sb3IgJiYgY29sb3IuaXNDb2xvciApID8gY29sb3IgOiBuZXcgQ29sb3IoKTtcblx0dGhpcy52ZXJ0ZXhDb2xvcnMgPSBBcnJheS5pc0FycmF5KCBjb2xvciApID8gY29sb3IgOiBbXTtcblxuXHR0aGlzLm1hdGVyaWFsSW5kZXggPSBtYXRlcmlhbEluZGV4ICE9PSB1bmRlZmluZWQgPyBtYXRlcmlhbEluZGV4IDogMDtcblxufVxuXG5PYmplY3QuYXNzaWduKCBGYWNlMy5wcm90b3R5cGUsIHtcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHR0aGlzLmEgPSBzb3VyY2UuYTtcblx0XHR0aGlzLmIgPSBzb3VyY2UuYjtcblx0XHR0aGlzLmMgPSBzb3VyY2UuYztcblxuXHRcdHRoaXMubm9ybWFsLmNvcHkoIHNvdXJjZS5ub3JtYWwgKTtcblx0XHR0aGlzLmNvbG9yLmNvcHkoIHNvdXJjZS5jb2xvciApO1xuXG5cdFx0dGhpcy5tYXRlcmlhbEluZGV4ID0gc291cmNlLm1hdGVyaWFsSW5kZXg7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gc291cmNlLnZlcnRleE5vcm1hbHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHRoaXMudmVydGV4Tm9ybWFsc1sgaSBdID0gc291cmNlLnZlcnRleE5vcm1hbHNbIGkgXS5jbG9uZSgpO1xuXG5cdFx0fVxuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IHNvdXJjZS52ZXJ0ZXhDb2xvcnMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHRoaXMudmVydGV4Q29sb3JzWyBpIF0gPSBzb3VyY2UudmVydGV4Q29sb3JzWyBpIF0uY2xvbmUoKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIGtpbGUgLyBodHRwOi8va2lsZS5zdHJhdmFnYW56YS5vcmcvXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBtaWthZWwgZW10aW5nZXIgLyBodHRwOi8vZ29tby5zZS9cbiAqIEBhdXRob3Igeno4NSAvIGh0dHA6Ly93d3cubGFiNGdhbWVzLm5ldC96ejg1L2Jsb2dcbiAqIEBhdXRob3IgYmhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW9cbiAqL1xuXG52YXIgZ2VvbWV0cnlJZCA9IDA7IC8vIEdlb21ldHJ5IHVzZXMgZXZlbiBudW1iZXJzIGFzIElkXG5cbmZ1bmN0aW9uIEdlb21ldHJ5KCkge1xuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggdGhpcywgJ2lkJywgeyB2YWx1ZTogZ2VvbWV0cnlJZCArPSAyIH0gKTtcblxuXHR0aGlzLnV1aWQgPSBfTWF0aC5nZW5lcmF0ZVVVSUQoKTtcblxuXHR0aGlzLm5hbWUgPSAnJztcblx0dGhpcy50eXBlID0gJ0dlb21ldHJ5JztcblxuXHR0aGlzLnZlcnRpY2VzID0gW107XG5cdHRoaXMuY29sb3JzID0gW107XG5cdHRoaXMuZmFjZXMgPSBbXTtcblx0dGhpcy5mYWNlVmVydGV4VXZzID0gW1tdXTtcblxuXHR0aGlzLm1vcnBoVGFyZ2V0cyA9IFtdO1xuXHR0aGlzLm1vcnBoTm9ybWFscyA9IFtdO1xuXG5cdHRoaXMuc2tpbldlaWdodHMgPSBbXTtcblx0dGhpcy5za2luSW5kaWNlcyA9IFtdO1xuXG5cdHRoaXMubGluZURpc3RhbmNlcyA9IFtdO1xuXG5cdHRoaXMuYm91bmRpbmdCb3ggPSBudWxsO1xuXHR0aGlzLmJvdW5kaW5nU3BoZXJlID0gbnVsbDtcblxuXHQvLyB1cGRhdGUgZmxhZ3NcblxuXHR0aGlzLmVsZW1lbnRzTmVlZFVwZGF0ZSA9IGZhbHNlO1xuXHR0aGlzLnZlcnRpY2VzTmVlZFVwZGF0ZSA9IGZhbHNlO1xuXHR0aGlzLnV2c05lZWRVcGRhdGUgPSBmYWxzZTtcblx0dGhpcy5ub3JtYWxzTmVlZFVwZGF0ZSA9IGZhbHNlO1xuXHR0aGlzLmNvbG9yc05lZWRVcGRhdGUgPSBmYWxzZTtcblx0dGhpcy5saW5lRGlzdGFuY2VzTmVlZFVwZGF0ZSA9IGZhbHNlO1xuXHR0aGlzLmdyb3Vwc05lZWRVcGRhdGUgPSBmYWxzZTtcblxufVxuXG5HZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBFdmVudERpc3BhdGNoZXIucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogR2VvbWV0cnksXG5cblx0aXNHZW9tZXRyeTogdHJ1ZSxcblxuXHRhcHBseU1hdHJpeDogZnVuY3Rpb24gKCBtYXRyaXggKSB7XG5cblx0XHR2YXIgbm9ybWFsTWF0cml4ID0gbmV3IE1hdHJpeDMoKS5nZXROb3JtYWxNYXRyaXgoIG1hdHJpeCApO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IHRoaXMudmVydGljZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHZhciB2ZXJ0ZXggPSB0aGlzLnZlcnRpY2VzWyBpIF07XG5cdFx0XHR2ZXJ0ZXguYXBwbHlNYXRyaXg0KCBtYXRyaXggKTtcblxuXHRcdH1cblxuXHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSB0aGlzLmZhY2VzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgZmFjZSA9IHRoaXMuZmFjZXNbIGkgXTtcblx0XHRcdGZhY2Uubm9ybWFsLmFwcGx5TWF0cml4Myggbm9ybWFsTWF0cml4ICkubm9ybWFsaXplKCk7XG5cblx0XHRcdGZvciAoIHZhciBqID0gMCwgamwgPSBmYWNlLnZlcnRleE5vcm1hbHMubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7XG5cblx0XHRcdFx0ZmFjZS52ZXJ0ZXhOb3JtYWxzWyBqIF0uYXBwbHlNYXRyaXgzKCBub3JtYWxNYXRyaXggKS5ub3JtYWxpemUoKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLmJvdW5kaW5nQm94ICE9PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLmNvbXB1dGVCb3VuZGluZ0JveCgpO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLmJvdW5kaW5nU3BoZXJlICE9PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy52ZXJ0aWNlc05lZWRVcGRhdGUgPSB0cnVlO1xuXHRcdHRoaXMubm9ybWFsc05lZWRVcGRhdGUgPSB0cnVlO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRyb3RhdGVYOiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyByb3RhdGUgZ2VvbWV0cnkgYXJvdW5kIHdvcmxkIHgtYXhpc1xuXG5cdFx0dmFyIG0xID0gbmV3IE1hdHJpeDQoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiByb3RhdGVYKCBhbmdsZSApIHtcblxuXHRcdFx0bTEubWFrZVJvdGF0aW9uWCggYW5nbGUgKTtcblxuXHRcdFx0dGhpcy5hcHBseU1hdHJpeCggbTEgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRyb3RhdGVZOiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyByb3RhdGUgZ2VvbWV0cnkgYXJvdW5kIHdvcmxkIHktYXhpc1xuXG5cdFx0dmFyIG0xID0gbmV3IE1hdHJpeDQoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiByb3RhdGVZKCBhbmdsZSApIHtcblxuXHRcdFx0bTEubWFrZVJvdGF0aW9uWSggYW5nbGUgKTtcblxuXHRcdFx0dGhpcy5hcHBseU1hdHJpeCggbTEgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRyb3RhdGVaOiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyByb3RhdGUgZ2VvbWV0cnkgYXJvdW5kIHdvcmxkIHotYXhpc1xuXG5cdFx0dmFyIG0xID0gbmV3IE1hdHJpeDQoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiByb3RhdGVaKCBhbmdsZSApIHtcblxuXHRcdFx0bTEubWFrZVJvdGF0aW9uWiggYW5nbGUgKTtcblxuXHRcdFx0dGhpcy5hcHBseU1hdHJpeCggbTEgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHR0cmFuc2xhdGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIHRyYW5zbGF0ZSBnZW9tZXRyeVxuXG5cdFx0dmFyIG0xID0gbmV3IE1hdHJpeDQoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiB0cmFuc2xhdGUoIHgsIHksIHogKSB7XG5cblx0XHRcdG0xLm1ha2VUcmFuc2xhdGlvbiggeCwgeSwgeiApO1xuXG5cdFx0XHR0aGlzLmFwcGx5TWF0cml4KCBtMSApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHNjYWxlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyBzY2FsZSBnZW9tZXRyeVxuXG5cdFx0dmFyIG0xID0gbmV3IE1hdHJpeDQoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBzY2FsZSggeCwgeSwgeiApIHtcblxuXHRcdFx0bTEubWFrZVNjYWxlKCB4LCB5LCB6ICk7XG5cblx0XHRcdHRoaXMuYXBwbHlNYXRyaXgoIG0xICk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0bG9va0F0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgb2JqID0gbmV3IE9iamVjdDNEKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gbG9va0F0KCB2ZWN0b3IgKSB7XG5cblx0XHRcdG9iai5sb29rQXQoIHZlY3RvciApO1xuXG5cdFx0XHRvYmoudXBkYXRlTWF0cml4KCk7XG5cblx0XHRcdHRoaXMuYXBwbHlNYXRyaXgoIG9iai5tYXRyaXggKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGZyb21CdWZmZXJHZW9tZXRyeTogZnVuY3Rpb24gKCBnZW9tZXRyeSApIHtcblxuXHRcdHZhciBzY29wZSA9IHRoaXM7XG5cblx0XHR2YXIgaW5kaWNlcyA9IGdlb21ldHJ5LmluZGV4ICE9PSBudWxsID8gZ2VvbWV0cnkuaW5kZXguYXJyYXkgOiB1bmRlZmluZWQ7XG5cdFx0dmFyIGF0dHJpYnV0ZXMgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzO1xuXG5cdFx0dmFyIHBvc2l0aW9ucyA9IGF0dHJpYnV0ZXMucG9zaXRpb24uYXJyYXk7XG5cdFx0dmFyIG5vcm1hbHMgPSBhdHRyaWJ1dGVzLm5vcm1hbCAhPT0gdW5kZWZpbmVkID8gYXR0cmlidXRlcy5ub3JtYWwuYXJyYXkgOiB1bmRlZmluZWQ7XG5cdFx0dmFyIGNvbG9ycyA9IGF0dHJpYnV0ZXMuY29sb3IgIT09IHVuZGVmaW5lZCA/IGF0dHJpYnV0ZXMuY29sb3IuYXJyYXkgOiB1bmRlZmluZWQ7XG5cdFx0dmFyIHV2cyA9IGF0dHJpYnV0ZXMudXYgIT09IHVuZGVmaW5lZCA/IGF0dHJpYnV0ZXMudXYuYXJyYXkgOiB1bmRlZmluZWQ7XG5cdFx0dmFyIHV2czIgPSBhdHRyaWJ1dGVzLnV2MiAhPT0gdW5kZWZpbmVkID8gYXR0cmlidXRlcy51djIuYXJyYXkgOiB1bmRlZmluZWQ7XG5cblx0XHRpZiAoIHV2czIgIT09IHVuZGVmaW5lZCApIHRoaXMuZmFjZVZlcnRleFV2c1sgMSBdID0gW107XG5cblx0XHR2YXIgdGVtcE5vcm1hbHMgPSBbXTtcblx0XHR2YXIgdGVtcFVWcyA9IFtdO1xuXHRcdHZhciB0ZW1wVVZzMiA9IFtdO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBqID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkgKz0gMywgaiArPSAyICkge1xuXG5cdFx0XHRzY29wZS52ZXJ0aWNlcy5wdXNoKCBuZXcgVmVjdG9yMyggcG9zaXRpb25zWyBpIF0sIHBvc2l0aW9uc1sgaSArIDEgXSwgcG9zaXRpb25zWyBpICsgMiBdICkgKTtcblxuXHRcdFx0aWYgKCBub3JtYWxzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0dGVtcE5vcm1hbHMucHVzaCggbmV3IFZlY3RvcjMoIG5vcm1hbHNbIGkgXSwgbm9ybWFsc1sgaSArIDEgXSwgbm9ybWFsc1sgaSArIDIgXSApICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBjb2xvcnMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRzY29wZS5jb2xvcnMucHVzaCggbmV3IENvbG9yKCBjb2xvcnNbIGkgXSwgY29sb3JzWyBpICsgMSBdLCBjb2xvcnNbIGkgKyAyIF0gKSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggdXZzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0dGVtcFVWcy5wdXNoKCBuZXcgVmVjdG9yMiggdXZzWyBqIF0sIHV2c1sgaiArIDEgXSApICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCB1dnMyICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0dGVtcFVWczIucHVzaCggbmV3IFZlY3RvcjIoIHV2czJbIGogXSwgdXZzMlsgaiArIDEgXSApICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIGFkZEZhY2UoIGEsIGIsIGMsIG1hdGVyaWFsSW5kZXggKSB7XG5cblx0XHRcdHZhciB2ZXJ0ZXhOb3JtYWxzID0gbm9ybWFscyAhPT0gdW5kZWZpbmVkID8gWyB0ZW1wTm9ybWFsc1sgYSBdLmNsb25lKCksIHRlbXBOb3JtYWxzWyBiIF0uY2xvbmUoKSwgdGVtcE5vcm1hbHNbIGMgXS5jbG9uZSgpIF0gOiBbXTtcblx0XHRcdHZhciB2ZXJ0ZXhDb2xvcnMgPSBjb2xvcnMgIT09IHVuZGVmaW5lZCA/IFsgc2NvcGUuY29sb3JzWyBhIF0uY2xvbmUoKSwgc2NvcGUuY29sb3JzWyBiIF0uY2xvbmUoKSwgc2NvcGUuY29sb3JzWyBjIF0uY2xvbmUoKSBdIDogW107XG5cblx0XHRcdHZhciBmYWNlID0gbmV3IEZhY2UzKCBhLCBiLCBjLCB2ZXJ0ZXhOb3JtYWxzLCB2ZXJ0ZXhDb2xvcnMsIG1hdGVyaWFsSW5kZXggKTtcblxuXHRcdFx0c2NvcGUuZmFjZXMucHVzaCggZmFjZSApO1xuXG5cdFx0XHRpZiAoIHV2cyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHNjb3BlLmZhY2VWZXJ0ZXhVdnNbIDAgXS5wdXNoKCBbIHRlbXBVVnNbIGEgXS5jbG9uZSgpLCB0ZW1wVVZzWyBiIF0uY2xvbmUoKSwgdGVtcFVWc1sgYyBdLmNsb25lKCkgXSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggdXZzMiAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHNjb3BlLmZhY2VWZXJ0ZXhVdnNbIDEgXS5wdXNoKCBbIHRlbXBVVnMyWyBhIF0uY2xvbmUoKSwgdGVtcFVWczJbIGIgXS5jbG9uZSgpLCB0ZW1wVVZzMlsgYyBdLmNsb25lKCkgXSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHR2YXIgZ3JvdXBzID0gZ2VvbWV0cnkuZ3JvdXBzO1xuXG5cdFx0aWYgKCBncm91cHMubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgZ3JvdXBzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0XHR2YXIgZ3JvdXAgPSBncm91cHNbIGkgXTtcblxuXHRcdFx0XHR2YXIgc3RhcnQgPSBncm91cC5zdGFydDtcblx0XHRcdFx0dmFyIGNvdW50ID0gZ3JvdXAuY291bnQ7XG5cblx0XHRcdFx0Zm9yICggdmFyIGogPSBzdGFydCwgamwgPSBzdGFydCArIGNvdW50OyBqIDwgamw7IGogKz0gMyApIHtcblxuXHRcdFx0XHRcdGlmICggaW5kaWNlcyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0XHRhZGRGYWNlKCBpbmRpY2VzWyBqIF0sIGluZGljZXNbIGogKyAxIF0sIGluZGljZXNbIGogKyAyIF0sIGdyb3VwLm1hdGVyaWFsSW5kZXggKTtcblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdGFkZEZhY2UoIGosIGogKyAxLCBqICsgMiwgZ3JvdXAubWF0ZXJpYWxJbmRleCApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0aWYgKCBpbmRpY2VzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgaW5kaWNlcy5sZW5ndGg7IGkgKz0gMyApIHtcblxuXHRcdFx0XHRcdGFkZEZhY2UoIGluZGljZXNbIGkgXSwgaW5kaWNlc1sgaSArIDEgXSwgaW5kaWNlc1sgaSArIDIgXSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBwb3NpdGlvbnMubGVuZ3RoIC8gMzsgaSArPSAzICkge1xuXG5cdFx0XHRcdFx0YWRkRmFjZSggaSwgaSArIDEsIGkgKyAyICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHR0aGlzLmNvbXB1dGVGYWNlTm9ybWFscygpO1xuXG5cdFx0aWYgKCBnZW9tZXRyeS5ib3VuZGluZ0JveCAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5ib3VuZGluZ0JveCA9IGdlb21ldHJ5LmJvdW5kaW5nQm94LmNsb25lKCk7XG5cblx0XHR9XG5cblx0XHRpZiAoIGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlICE9PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLmJvdW5kaW5nU3BoZXJlID0gZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUuY2xvbmUoKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2VudGVyOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgb2Zmc2V0ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBjZW50ZXIoKSB7XG5cblx0XHRcdHRoaXMuY29tcHV0ZUJvdW5kaW5nQm94KCk7XG5cblx0XHRcdHRoaXMuYm91bmRpbmdCb3guZ2V0Q2VudGVyKCBvZmZzZXQgKS5uZWdhdGUoKTtcblxuXHRcdFx0dGhpcy50cmFuc2xhdGUoIG9mZnNldC54LCBvZmZzZXQueSwgb2Zmc2V0LnogKTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRub3JtYWxpemU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7XG5cblx0XHR2YXIgY2VudGVyID0gdGhpcy5ib3VuZGluZ1NwaGVyZS5jZW50ZXI7XG5cdFx0dmFyIHJhZGl1cyA9IHRoaXMuYm91bmRpbmdTcGhlcmUucmFkaXVzO1xuXG5cdFx0dmFyIHMgPSByYWRpdXMgPT09IDAgPyAxIDogMS4wIC8gcmFkaXVzO1xuXG5cdFx0dmFyIG1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7XG5cdFx0bWF0cml4LnNldChcblx0XHRcdHMsIDAsIDAsIC0gcyAqIGNlbnRlci54LFxuXHRcdFx0MCwgcywgMCwgLSBzICogY2VudGVyLnksXG5cdFx0XHQwLCAwLCBzLCAtIHMgKiBjZW50ZXIueixcblx0XHRcdDAsIDAsIDAsIDFcblx0XHQpO1xuXG5cdFx0dGhpcy5hcHBseU1hdHJpeCggbWF0cml4ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvbXB1dGVGYWNlTm9ybWFsczogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGNiID0gbmV3IFZlY3RvcjMoKSwgYWIgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0Zm9yICggdmFyIGYgPSAwLCBmbCA9IHRoaXMuZmFjZXMubGVuZ3RoOyBmIDwgZmw7IGYgKysgKSB7XG5cblx0XHRcdHZhciBmYWNlID0gdGhpcy5mYWNlc1sgZiBdO1xuXG5cdFx0XHR2YXIgdkEgPSB0aGlzLnZlcnRpY2VzWyBmYWNlLmEgXTtcblx0XHRcdHZhciB2QiA9IHRoaXMudmVydGljZXNbIGZhY2UuYiBdO1xuXHRcdFx0dmFyIHZDID0gdGhpcy52ZXJ0aWNlc1sgZmFjZS5jIF07XG5cblx0XHRcdGNiLnN1YlZlY3RvcnMoIHZDLCB2QiApO1xuXHRcdFx0YWIuc3ViVmVjdG9ycyggdkEsIHZCICk7XG5cdFx0XHRjYi5jcm9zcyggYWIgKTtcblxuXHRcdFx0Y2Iubm9ybWFsaXplKCk7XG5cblx0XHRcdGZhY2Uubm9ybWFsLmNvcHkoIGNiICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHRjb21wdXRlVmVydGV4Tm9ybWFsczogZnVuY3Rpb24gKCBhcmVhV2VpZ2h0ZWQgKSB7XG5cblx0XHRpZiAoIGFyZWFXZWlnaHRlZCA9PT0gdW5kZWZpbmVkICkgYXJlYVdlaWdodGVkID0gdHJ1ZTtcblxuXHRcdHZhciB2LCB2bCwgZiwgZmwsIGZhY2UsIHZlcnRpY2VzO1xuXG5cdFx0dmVydGljZXMgPSBuZXcgQXJyYXkoIHRoaXMudmVydGljZXMubGVuZ3RoICk7XG5cblx0XHRmb3IgKCB2ID0gMCwgdmwgPSB0aGlzLnZlcnRpY2VzLmxlbmd0aDsgdiA8IHZsOyB2ICsrICkge1xuXG5cdFx0XHR2ZXJ0aWNlc1sgdiBdID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdH1cblxuXHRcdGlmICggYXJlYVdlaWdodGVkICkge1xuXG5cdFx0XHQvLyB2ZXJ0ZXggbm9ybWFscyB3ZWlnaHRlZCBieSB0cmlhbmdsZSBhcmVhc1xuXHRcdFx0Ly8gaHR0cDovL3d3dy5pcXVpbGV6bGVzLm9yZy93d3cvYXJ0aWNsZXMvbm9ybWFscy9ub3JtYWxzLmh0bVxuXG5cdFx0XHR2YXIgdkEsIHZCLCB2Qztcblx0XHRcdHZhciBjYiA9IG5ldyBWZWN0b3IzKCksIGFiID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdFx0Zm9yICggZiA9IDAsIGZsID0gdGhpcy5mYWNlcy5sZW5ndGg7IGYgPCBmbDsgZiArKyApIHtcblxuXHRcdFx0XHRmYWNlID0gdGhpcy5mYWNlc1sgZiBdO1xuXG5cdFx0XHRcdHZBID0gdGhpcy52ZXJ0aWNlc1sgZmFjZS5hIF07XG5cdFx0XHRcdHZCID0gdGhpcy52ZXJ0aWNlc1sgZmFjZS5iIF07XG5cdFx0XHRcdHZDID0gdGhpcy52ZXJ0aWNlc1sgZmFjZS5jIF07XG5cblx0XHRcdFx0Y2Iuc3ViVmVjdG9ycyggdkMsIHZCICk7XG5cdFx0XHRcdGFiLnN1YlZlY3RvcnMoIHZBLCB2QiApO1xuXHRcdFx0XHRjYi5jcm9zcyggYWIgKTtcblxuXHRcdFx0XHR2ZXJ0aWNlc1sgZmFjZS5hIF0uYWRkKCBjYiApO1xuXHRcdFx0XHR2ZXJ0aWNlc1sgZmFjZS5iIF0uYWRkKCBjYiApO1xuXHRcdFx0XHR2ZXJ0aWNlc1sgZmFjZS5jIF0uYWRkKCBjYiApO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR0aGlzLmNvbXB1dGVGYWNlTm9ybWFscygpO1xuXG5cdFx0XHRmb3IgKCBmID0gMCwgZmwgPSB0aGlzLmZhY2VzLmxlbmd0aDsgZiA8IGZsOyBmICsrICkge1xuXG5cdFx0XHRcdGZhY2UgPSB0aGlzLmZhY2VzWyBmIF07XG5cblx0XHRcdFx0dmVydGljZXNbIGZhY2UuYSBdLmFkZCggZmFjZS5ub3JtYWwgKTtcblx0XHRcdFx0dmVydGljZXNbIGZhY2UuYiBdLmFkZCggZmFjZS5ub3JtYWwgKTtcblx0XHRcdFx0dmVydGljZXNbIGZhY2UuYyBdLmFkZCggZmFjZS5ub3JtYWwgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Zm9yICggdiA9IDAsIHZsID0gdGhpcy52ZXJ0aWNlcy5sZW5ndGg7IHYgPCB2bDsgdiArKyApIHtcblxuXHRcdFx0dmVydGljZXNbIHYgXS5ub3JtYWxpemUoKTtcblxuXHRcdH1cblxuXHRcdGZvciAoIGYgPSAwLCBmbCA9IHRoaXMuZmFjZXMubGVuZ3RoOyBmIDwgZmw7IGYgKysgKSB7XG5cblx0XHRcdGZhY2UgPSB0aGlzLmZhY2VzWyBmIF07XG5cblx0XHRcdHZhciB2ZXJ0ZXhOb3JtYWxzID0gZmFjZS52ZXJ0ZXhOb3JtYWxzO1xuXG5cdFx0XHRpZiAoIHZlcnRleE5vcm1hbHMubGVuZ3RoID09PSAzICkge1xuXG5cdFx0XHRcdHZlcnRleE5vcm1hbHNbIDAgXS5jb3B5KCB2ZXJ0aWNlc1sgZmFjZS5hIF0gKTtcblx0XHRcdFx0dmVydGV4Tm9ybWFsc1sgMSBdLmNvcHkoIHZlcnRpY2VzWyBmYWNlLmIgXSApO1xuXHRcdFx0XHR2ZXJ0ZXhOb3JtYWxzWyAyIF0uY29weSggdmVydGljZXNbIGZhY2UuYyBdICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0dmVydGV4Tm9ybWFsc1sgMCBdID0gdmVydGljZXNbIGZhY2UuYSBdLmNsb25lKCk7XG5cdFx0XHRcdHZlcnRleE5vcm1hbHNbIDEgXSA9IHZlcnRpY2VzWyBmYWNlLmIgXS5jbG9uZSgpO1xuXHRcdFx0XHR2ZXJ0ZXhOb3JtYWxzWyAyIF0gPSB2ZXJ0aWNlc1sgZmFjZS5jIF0uY2xvbmUoKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLmZhY2VzLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdHRoaXMubm9ybWFsc05lZWRVcGRhdGUgPSB0cnVlO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0Y29tcHV0ZUZsYXRWZXJ0ZXhOb3JtYWxzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgZiwgZmwsIGZhY2U7XG5cblx0XHR0aGlzLmNvbXB1dGVGYWNlTm9ybWFscygpO1xuXG5cdFx0Zm9yICggZiA9IDAsIGZsID0gdGhpcy5mYWNlcy5sZW5ndGg7IGYgPCBmbDsgZiArKyApIHtcblxuXHRcdFx0ZmFjZSA9IHRoaXMuZmFjZXNbIGYgXTtcblxuXHRcdFx0dmFyIHZlcnRleE5vcm1hbHMgPSBmYWNlLnZlcnRleE5vcm1hbHM7XG5cblx0XHRcdGlmICggdmVydGV4Tm9ybWFscy5sZW5ndGggPT09IDMgKSB7XG5cblx0XHRcdFx0dmVydGV4Tm9ybWFsc1sgMCBdLmNvcHkoIGZhY2Uubm9ybWFsICk7XG5cdFx0XHRcdHZlcnRleE5vcm1hbHNbIDEgXS5jb3B5KCBmYWNlLm5vcm1hbCApO1xuXHRcdFx0XHR2ZXJ0ZXhOb3JtYWxzWyAyIF0uY29weSggZmFjZS5ub3JtYWwgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHR2ZXJ0ZXhOb3JtYWxzWyAwIF0gPSBmYWNlLm5vcm1hbC5jbG9uZSgpO1xuXHRcdFx0XHR2ZXJ0ZXhOb3JtYWxzWyAxIF0gPSBmYWNlLm5vcm1hbC5jbG9uZSgpO1xuXHRcdFx0XHR2ZXJ0ZXhOb3JtYWxzWyAyIF0gPSBmYWNlLm5vcm1hbC5jbG9uZSgpO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIHRoaXMuZmFjZXMubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0dGhpcy5ub3JtYWxzTmVlZFVwZGF0ZSA9IHRydWU7XG5cblx0XHR9XG5cblx0fSxcblxuXHRjb21wdXRlTW9ycGhOb3JtYWxzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgaSwgaWwsIGYsIGZsLCBmYWNlO1xuXG5cdFx0Ly8gc2F2ZSBvcmlnaW5hbCBub3JtYWxzXG5cdFx0Ly8gLSBjcmVhdGUgdGVtcCB2YXJpYWJsZXMgb24gZmlyc3QgYWNjZXNzXG5cdFx0Ly8gICBvdGhlcndpc2UganVzdCBjb3B5IChmb3IgZmFzdGVyIHJlcGVhdGVkIGNhbGxzKVxuXG5cdFx0Zm9yICggZiA9IDAsIGZsID0gdGhpcy5mYWNlcy5sZW5ndGg7IGYgPCBmbDsgZiArKyApIHtcblxuXHRcdFx0ZmFjZSA9IHRoaXMuZmFjZXNbIGYgXTtcblxuXHRcdFx0aWYgKCAhIGZhY2UuX19vcmlnaW5hbEZhY2VOb3JtYWwgKSB7XG5cblx0XHRcdFx0ZmFjZS5fX29yaWdpbmFsRmFjZU5vcm1hbCA9IGZhY2Uubm9ybWFsLmNsb25lKCk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0ZmFjZS5fX29yaWdpbmFsRmFjZU5vcm1hbC5jb3B5KCBmYWNlLm5vcm1hbCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggISBmYWNlLl9fb3JpZ2luYWxWZXJ0ZXhOb3JtYWxzICkgZmFjZS5fX29yaWdpbmFsVmVydGV4Tm9ybWFscyA9IFtdO1xuXG5cdFx0XHRmb3IgKCBpID0gMCwgaWwgPSBmYWNlLnZlcnRleE5vcm1hbHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdFx0aWYgKCAhIGZhY2UuX19vcmlnaW5hbFZlcnRleE5vcm1hbHNbIGkgXSApIHtcblxuXHRcdFx0XHRcdGZhY2UuX19vcmlnaW5hbFZlcnRleE5vcm1hbHNbIGkgXSA9IGZhY2UudmVydGV4Tm9ybWFsc1sgaSBdLmNsb25lKCk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGZhY2UuX19vcmlnaW5hbFZlcnRleE5vcm1hbHNbIGkgXS5jb3B5KCBmYWNlLnZlcnRleE5vcm1hbHNbIGkgXSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gdXNlIHRlbXAgZ2VvbWV0cnkgdG8gY29tcHV0ZSBmYWNlIGFuZCB2ZXJ0ZXggbm9ybWFscyBmb3IgZWFjaCBtb3JwaFxuXG5cdFx0dmFyIHRtcEdlbyA9IG5ldyBHZW9tZXRyeSgpO1xuXHRcdHRtcEdlby5mYWNlcyA9IHRoaXMuZmFjZXM7XG5cblx0XHRmb3IgKCBpID0gMCwgaWwgPSB0aGlzLm1vcnBoVGFyZ2V0cy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0Ly8gY3JlYXRlIG9uIGZpcnN0IGFjY2Vzc1xuXG5cdFx0XHRpZiAoICEgdGhpcy5tb3JwaE5vcm1hbHNbIGkgXSApIHtcblxuXHRcdFx0XHR0aGlzLm1vcnBoTm9ybWFsc1sgaSBdID0ge307XG5cdFx0XHRcdHRoaXMubW9ycGhOb3JtYWxzWyBpIF0uZmFjZU5vcm1hbHMgPSBbXTtcblx0XHRcdFx0dGhpcy5tb3JwaE5vcm1hbHNbIGkgXS52ZXJ0ZXhOb3JtYWxzID0gW107XG5cblx0XHRcdFx0dmFyIGRzdE5vcm1hbHNGYWNlID0gdGhpcy5tb3JwaE5vcm1hbHNbIGkgXS5mYWNlTm9ybWFscztcblx0XHRcdFx0dmFyIGRzdE5vcm1hbHNWZXJ0ZXggPSB0aGlzLm1vcnBoTm9ybWFsc1sgaSBdLnZlcnRleE5vcm1hbHM7XG5cblx0XHRcdFx0dmFyIGZhY2VOb3JtYWwsIHZlcnRleE5vcm1hbHM7XG5cblx0XHRcdFx0Zm9yICggZiA9IDAsIGZsID0gdGhpcy5mYWNlcy5sZW5ndGg7IGYgPCBmbDsgZiArKyApIHtcblxuXHRcdFx0XHRcdGZhY2VOb3JtYWwgPSBuZXcgVmVjdG9yMygpO1xuXHRcdFx0XHRcdHZlcnRleE5vcm1hbHMgPSB7IGE6IG5ldyBWZWN0b3IzKCksIGI6IG5ldyBWZWN0b3IzKCksIGM6IG5ldyBWZWN0b3IzKCkgfTtcblxuXHRcdFx0XHRcdGRzdE5vcm1hbHNGYWNlLnB1c2goIGZhY2VOb3JtYWwgKTtcblx0XHRcdFx0XHRkc3ROb3JtYWxzVmVydGV4LnB1c2goIHZlcnRleE5vcm1hbHMgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIG1vcnBoTm9ybWFscyA9IHRoaXMubW9ycGhOb3JtYWxzWyBpIF07XG5cblx0XHRcdC8vIHNldCB2ZXJ0aWNlcyB0byBtb3JwaCB0YXJnZXRcblxuXHRcdFx0dG1wR2VvLnZlcnRpY2VzID0gdGhpcy5tb3JwaFRhcmdldHNbIGkgXS52ZXJ0aWNlcztcblxuXHRcdFx0Ly8gY29tcHV0ZSBtb3JwaCBub3JtYWxzXG5cblx0XHRcdHRtcEdlby5jb21wdXRlRmFjZU5vcm1hbHMoKTtcblx0XHRcdHRtcEdlby5jb21wdXRlVmVydGV4Tm9ybWFscygpO1xuXG5cdFx0XHQvLyBzdG9yZSBtb3JwaCBub3JtYWxzXG5cblx0XHRcdHZhciBmYWNlTm9ybWFsLCB2ZXJ0ZXhOb3JtYWxzO1xuXG5cdFx0XHRmb3IgKCBmID0gMCwgZmwgPSB0aGlzLmZhY2VzLmxlbmd0aDsgZiA8IGZsOyBmICsrICkge1xuXG5cdFx0XHRcdGZhY2UgPSB0aGlzLmZhY2VzWyBmIF07XG5cblx0XHRcdFx0ZmFjZU5vcm1hbCA9IG1vcnBoTm9ybWFscy5mYWNlTm9ybWFsc1sgZiBdO1xuXHRcdFx0XHR2ZXJ0ZXhOb3JtYWxzID0gbW9ycGhOb3JtYWxzLnZlcnRleE5vcm1hbHNbIGYgXTtcblxuXHRcdFx0XHRmYWNlTm9ybWFsLmNvcHkoIGZhY2Uubm9ybWFsICk7XG5cblx0XHRcdFx0dmVydGV4Tm9ybWFscy5hLmNvcHkoIGZhY2UudmVydGV4Tm9ybWFsc1sgMCBdICk7XG5cdFx0XHRcdHZlcnRleE5vcm1hbHMuYi5jb3B5KCBmYWNlLnZlcnRleE5vcm1hbHNbIDEgXSApO1xuXHRcdFx0XHR2ZXJ0ZXhOb3JtYWxzLmMuY29weSggZmFjZS52ZXJ0ZXhOb3JtYWxzWyAyIF0gKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gcmVzdG9yZSBvcmlnaW5hbCBub3JtYWxzXG5cblx0XHRmb3IgKCBmID0gMCwgZmwgPSB0aGlzLmZhY2VzLmxlbmd0aDsgZiA8IGZsOyBmICsrICkge1xuXG5cdFx0XHRmYWNlID0gdGhpcy5mYWNlc1sgZiBdO1xuXG5cdFx0XHRmYWNlLm5vcm1hbCA9IGZhY2UuX19vcmlnaW5hbEZhY2VOb3JtYWw7XG5cdFx0XHRmYWNlLnZlcnRleE5vcm1hbHMgPSBmYWNlLl9fb3JpZ2luYWxWZXJ0ZXhOb3JtYWxzO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0Y29tcHV0ZUJvdW5kaW5nQm94OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRpZiAoIHRoaXMuYm91bmRpbmdCb3ggPT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuYm91bmRpbmdCb3ggPSBuZXcgQm94MygpO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5ib3VuZGluZ0JveC5zZXRGcm9tUG9pbnRzKCB0aGlzLnZlcnRpY2VzICk7XG5cblx0fSxcblxuXHRjb21wdXRlQm91bmRpbmdTcGhlcmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGlmICggdGhpcy5ib3VuZGluZ1NwaGVyZSA9PT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5ib3VuZGluZ1NwaGVyZSA9IG5ldyBTcGhlcmUoKTtcblxuXHRcdH1cblxuXHRcdHRoaXMuYm91bmRpbmdTcGhlcmUuc2V0RnJvbVBvaW50cyggdGhpcy52ZXJ0aWNlcyApO1xuXG5cdH0sXG5cblx0bWVyZ2U6IGZ1bmN0aW9uICggZ2VvbWV0cnksIG1hdHJpeCwgbWF0ZXJpYWxJbmRleE9mZnNldCApIHtcblxuXHRcdGlmICggISAoIGdlb21ldHJ5ICYmIGdlb21ldHJ5LmlzR2VvbWV0cnkgKSApIHtcblxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLkdlb21ldHJ5Lm1lcmdlKCk6IGdlb21ldHJ5IG5vdCBhbiBpbnN0YW5jZSBvZiBUSFJFRS5HZW9tZXRyeS4nLCBnZW9tZXRyeSApO1xuXHRcdFx0cmV0dXJuO1xuXG5cdFx0fVxuXG5cdFx0dmFyIG5vcm1hbE1hdHJpeCxcblx0XHRcdHZlcnRleE9mZnNldCA9IHRoaXMudmVydGljZXMubGVuZ3RoLFxuXHRcdFx0dmVydGljZXMxID0gdGhpcy52ZXJ0aWNlcyxcblx0XHRcdHZlcnRpY2VzMiA9IGdlb21ldHJ5LnZlcnRpY2VzLFxuXHRcdFx0ZmFjZXMxID0gdGhpcy5mYWNlcyxcblx0XHRcdGZhY2VzMiA9IGdlb21ldHJ5LmZhY2VzLFxuXHRcdFx0dXZzMSA9IHRoaXMuZmFjZVZlcnRleFV2c1sgMCBdLFxuXHRcdFx0dXZzMiA9IGdlb21ldHJ5LmZhY2VWZXJ0ZXhVdnNbIDAgXSxcblx0XHRcdGNvbG9yczEgPSB0aGlzLmNvbG9ycyxcblx0XHRcdGNvbG9yczIgPSBnZW9tZXRyeS5jb2xvcnM7XG5cblx0XHRpZiAoIG1hdGVyaWFsSW5kZXhPZmZzZXQgPT09IHVuZGVmaW5lZCApIG1hdGVyaWFsSW5kZXhPZmZzZXQgPSAwO1xuXG5cdFx0aWYgKCBtYXRyaXggIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0bm9ybWFsTWF0cml4ID0gbmV3IE1hdHJpeDMoKS5nZXROb3JtYWxNYXRyaXgoIG1hdHJpeCApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gdmVydGljZXNcblxuXHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSB2ZXJ0aWNlczIubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHZhciB2ZXJ0ZXggPSB2ZXJ0aWNlczJbIGkgXTtcblxuXHRcdFx0dmFyIHZlcnRleENvcHkgPSB2ZXJ0ZXguY2xvbmUoKTtcblxuXHRcdFx0aWYgKCBtYXRyaXggIT09IHVuZGVmaW5lZCApIHZlcnRleENvcHkuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTtcblxuXHRcdFx0dmVydGljZXMxLnB1c2goIHZlcnRleENvcHkgKTtcblxuXHRcdH1cblxuXHRcdC8vIGNvbG9yc1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IGNvbG9yczIubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdGNvbG9yczEucHVzaCggY29sb3JzMlsgaSBdLmNsb25lKCkgKTtcblxuXHRcdH1cblxuXHRcdC8vIGZhY2VzXG5cblx0XHRmb3IgKCBpID0gMCwgaWwgPSBmYWNlczIubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBmYWNlID0gZmFjZXMyWyBpIF0sIGZhY2VDb3B5LCBub3JtYWwsIGNvbG9yLFxuXHRcdFx0XHRmYWNlVmVydGV4Tm9ybWFscyA9IGZhY2UudmVydGV4Tm9ybWFscyxcblx0XHRcdFx0ZmFjZVZlcnRleENvbG9ycyA9IGZhY2UudmVydGV4Q29sb3JzO1xuXG5cdFx0XHRmYWNlQ29weSA9IG5ldyBGYWNlMyggZmFjZS5hICsgdmVydGV4T2Zmc2V0LCBmYWNlLmIgKyB2ZXJ0ZXhPZmZzZXQsIGZhY2UuYyArIHZlcnRleE9mZnNldCApO1xuXHRcdFx0ZmFjZUNvcHkubm9ybWFsLmNvcHkoIGZhY2Uubm9ybWFsICk7XG5cblx0XHRcdGlmICggbm9ybWFsTWF0cml4ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0ZmFjZUNvcHkubm9ybWFsLmFwcGx5TWF0cml4Myggbm9ybWFsTWF0cml4ICkubm9ybWFsaXplKCk7XG5cblx0XHRcdH1cblxuXHRcdFx0Zm9yICggdmFyIGogPSAwLCBqbCA9IGZhY2VWZXJ0ZXhOb3JtYWxzLmxlbmd0aDsgaiA8IGpsOyBqICsrICkge1xuXG5cdFx0XHRcdG5vcm1hbCA9IGZhY2VWZXJ0ZXhOb3JtYWxzWyBqIF0uY2xvbmUoKTtcblxuXHRcdFx0XHRpZiAoIG5vcm1hbE1hdHJpeCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0bm9ybWFsLmFwcGx5TWF0cml4Myggbm9ybWFsTWF0cml4ICkubm9ybWFsaXplKCk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGZhY2VDb3B5LnZlcnRleE5vcm1hbHMucHVzaCggbm9ybWFsICk7XG5cblx0XHRcdH1cblxuXHRcdFx0ZmFjZUNvcHkuY29sb3IuY29weSggZmFjZS5jb2xvciApO1xuXG5cdFx0XHRmb3IgKCB2YXIgaiA9IDAsIGpsID0gZmFjZVZlcnRleENvbG9ycy5sZW5ndGg7IGogPCBqbDsgaiArKyApIHtcblxuXHRcdFx0XHRjb2xvciA9IGZhY2VWZXJ0ZXhDb2xvcnNbIGogXTtcblx0XHRcdFx0ZmFjZUNvcHkudmVydGV4Q29sb3JzLnB1c2goIGNvbG9yLmNsb25lKCkgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRmYWNlQ29weS5tYXRlcmlhbEluZGV4ID0gZmFjZS5tYXRlcmlhbEluZGV4ICsgbWF0ZXJpYWxJbmRleE9mZnNldDtcblxuXHRcdFx0ZmFjZXMxLnB1c2goIGZhY2VDb3B5ICk7XG5cblx0XHR9XG5cblx0XHQvLyB1dnNcblxuXHRcdGZvciAoIGkgPSAwLCBpbCA9IHV2czIubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHZhciB1diA9IHV2czJbIGkgXSwgdXZDb3B5ID0gW107XG5cblx0XHRcdGlmICggdXYgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRjb250aW51ZTtcblxuXHRcdFx0fVxuXG5cdFx0XHRmb3IgKCB2YXIgaiA9IDAsIGpsID0gdXYubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7XG5cblx0XHRcdFx0dXZDb3B5LnB1c2goIHV2WyBqIF0uY2xvbmUoKSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHV2czEucHVzaCggdXZDb3B5ICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHRtZXJnZU1lc2g6IGZ1bmN0aW9uICggbWVzaCApIHtcblxuXHRcdGlmICggISAoIG1lc2ggJiYgbWVzaC5pc01lc2ggKSApIHtcblxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLkdlb21ldHJ5Lm1lcmdlTWVzaCgpOiBtZXNoIG5vdCBhbiBpbnN0YW5jZSBvZiBUSFJFRS5NZXNoLicsIG1lc2ggKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdGlmICggbWVzaC5tYXRyaXhBdXRvVXBkYXRlICkgbWVzaC51cGRhdGVNYXRyaXgoKTtcblxuXHRcdHRoaXMubWVyZ2UoIG1lc2guZ2VvbWV0cnksIG1lc2gubWF0cml4ICk7XG5cblx0fSxcblxuXHQvKlxuXHQgKiBDaGVja3MgZm9yIGR1cGxpY2F0ZSB2ZXJ0aWNlcyB3aXRoIGhhc2htYXAuXG5cdCAqIER1cGxpY2F0ZWQgdmVydGljZXMgYXJlIHJlbW92ZWRcblx0ICogYW5kIGZhY2VzJyB2ZXJ0aWNlcyBhcmUgdXBkYXRlZC5cblx0ICovXG5cblx0bWVyZ2VWZXJ0aWNlczogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHZlcnRpY2VzTWFwID0ge307IC8vIEhhc2htYXAgZm9yIGxvb2tpbmcgdXAgdmVydGljZXMgYnkgcG9zaXRpb24gY29vcmRpbmF0ZXMgKGFuZCBtYWtpbmcgc3VyZSB0aGV5IGFyZSB1bmlxdWUpXG5cdFx0dmFyIHVuaXF1ZSA9IFtdLCBjaGFuZ2VzID0gW107XG5cblx0XHR2YXIgdiwga2V5O1xuXHRcdHZhciBwcmVjaXNpb25Qb2ludHMgPSA0OyAvLyBudW1iZXIgb2YgZGVjaW1hbCBwb2ludHMsIGUuZy4gNCBmb3IgZXBzaWxvbiBvZiAwLjAwMDFcblx0XHR2YXIgcHJlY2lzaW9uID0gTWF0aC5wb3coIDEwLCBwcmVjaXNpb25Qb2ludHMgKTtcblx0XHR2YXIgaSwgaWwsIGZhY2U7XG5cdFx0dmFyIGluZGljZXMsIGosIGpsO1xuXG5cdFx0Zm9yICggaSA9IDAsIGlsID0gdGhpcy52ZXJ0aWNlcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0diA9IHRoaXMudmVydGljZXNbIGkgXTtcblx0XHRcdGtleSA9IE1hdGgucm91bmQoIHYueCAqIHByZWNpc2lvbiApICsgJ18nICsgTWF0aC5yb3VuZCggdi55ICogcHJlY2lzaW9uICkgKyAnXycgKyBNYXRoLnJvdW5kKCB2LnogKiBwcmVjaXNpb24gKTtcblxuXHRcdFx0aWYgKCB2ZXJ0aWNlc01hcFsga2V5IF0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHR2ZXJ0aWNlc01hcFsga2V5IF0gPSBpO1xuXHRcdFx0XHR1bmlxdWUucHVzaCggdGhpcy52ZXJ0aWNlc1sgaSBdICk7XG5cdFx0XHRcdGNoYW5nZXNbIGkgXSA9IHVuaXF1ZS5sZW5ndGggLSAxO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdC8vY29uc29sZS5sb2coJ0R1cGxpY2F0ZSB2ZXJ0ZXggZm91bmQuICcsIGksICcgY291bGQgYmUgdXNpbmcgJywgdmVydGljZXNNYXBba2V5XSk7XG5cdFx0XHRcdGNoYW5nZXNbIGkgXSA9IGNoYW5nZXNbIHZlcnRpY2VzTWFwWyBrZXkgXSBdO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblxuXHRcdC8vIGlmIGZhY2VzIGFyZSBjb21wbGV0ZWx5IGRlZ2VuZXJhdGUgYWZ0ZXIgbWVyZ2luZyB2ZXJ0aWNlcywgd2Vcblx0XHQvLyBoYXZlIHRvIHJlbW92ZSB0aGVtIGZyb20gdGhlIGdlb21ldHJ5LlxuXHRcdHZhciBmYWNlSW5kaWNlc1RvUmVtb3ZlID0gW107XG5cblx0XHRmb3IgKCBpID0gMCwgaWwgPSB0aGlzLmZhY2VzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRmYWNlID0gdGhpcy5mYWNlc1sgaSBdO1xuXG5cdFx0XHRmYWNlLmEgPSBjaGFuZ2VzWyBmYWNlLmEgXTtcblx0XHRcdGZhY2UuYiA9IGNoYW5nZXNbIGZhY2UuYiBdO1xuXHRcdFx0ZmFjZS5jID0gY2hhbmdlc1sgZmFjZS5jIF07XG5cblx0XHRcdGluZGljZXMgPSBbIGZhY2UuYSwgZmFjZS5iLCBmYWNlLmMgXTtcblxuXHRcdFx0Ly8gaWYgYW55IGR1cGxpY2F0ZSB2ZXJ0aWNlcyBhcmUgZm91bmQgaW4gYSBGYWNlM1xuXHRcdFx0Ly8gd2UgaGF2ZSB0byByZW1vdmUgdGhlIGZhY2UgYXMgbm90aGluZyBjYW4gYmUgc2F2ZWRcblx0XHRcdGZvciAoIHZhciBuID0gMDsgbiA8IDM7IG4gKysgKSB7XG5cblx0XHRcdFx0aWYgKCBpbmRpY2VzWyBuIF0gPT09IGluZGljZXNbICggbiArIDEgKSAlIDMgXSApIHtcblxuXHRcdFx0XHRcdGZhY2VJbmRpY2VzVG9SZW1vdmUucHVzaCggaSApO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Zm9yICggaSA9IGZhY2VJbmRpY2VzVG9SZW1vdmUubGVuZ3RoIC0gMTsgaSA+PSAwOyBpIC0tICkge1xuXG5cdFx0XHR2YXIgaWR4ID0gZmFjZUluZGljZXNUb1JlbW92ZVsgaSBdO1xuXG5cdFx0XHR0aGlzLmZhY2VzLnNwbGljZSggaWR4LCAxICk7XG5cblx0XHRcdGZvciAoIGogPSAwLCBqbCA9IHRoaXMuZmFjZVZlcnRleFV2cy5sZW5ndGg7IGogPCBqbDsgaiArKyApIHtcblxuXHRcdFx0XHR0aGlzLmZhY2VWZXJ0ZXhVdnNbIGogXS5zcGxpY2UoIGlkeCwgMSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvLyBVc2UgdW5pcXVlIHNldCBvZiB2ZXJ0aWNlc1xuXG5cdFx0dmFyIGRpZmYgPSB0aGlzLnZlcnRpY2VzLmxlbmd0aCAtIHVuaXF1ZS5sZW5ndGg7XG5cdFx0dGhpcy52ZXJ0aWNlcyA9IHVuaXF1ZTtcblx0XHRyZXR1cm4gZGlmZjtcblxuXHR9LFxuXG5cdHNldEZyb21Qb2ludHM6IGZ1bmN0aW9uICggcG9pbnRzICkge1xuXG5cdFx0dGhpcy52ZXJ0aWNlcyA9IFtdO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gcG9pbnRzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBwb2ludCA9IHBvaW50c1sgaSBdO1xuXHRcdFx0dGhpcy52ZXJ0aWNlcy5wdXNoKCBuZXcgVmVjdG9yMyggcG9pbnQueCwgcG9pbnQueSwgcG9pbnQueiB8fCAwICkgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c29ydEZhY2VzQnlNYXRlcmlhbEluZGV4OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgZmFjZXMgPSB0aGlzLmZhY2VzO1xuXHRcdHZhciBsZW5ndGggPSBmYWNlcy5sZW5ndGg7XG5cblx0XHQvLyB0YWcgZmFjZXNcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0ZmFjZXNbIGkgXS5faWQgPSBpO1xuXG5cdFx0fVxuXG5cdFx0Ly8gc29ydCBmYWNlc1xuXG5cdFx0ZnVuY3Rpb24gbWF0ZXJpYWxJbmRleFNvcnQoIGEsIGIgKSB7XG5cblx0XHRcdHJldHVybiBhLm1hdGVyaWFsSW5kZXggLSBiLm1hdGVyaWFsSW5kZXg7XG5cblx0XHR9XG5cblx0XHRmYWNlcy5zb3J0KCBtYXRlcmlhbEluZGV4U29ydCApO1xuXG5cdFx0Ly8gc29ydCB1dnNcblxuXHRcdHZhciB1dnMxID0gdGhpcy5mYWNlVmVydGV4VXZzWyAwIF07XG5cdFx0dmFyIHV2czIgPSB0aGlzLmZhY2VWZXJ0ZXhVdnNbIDEgXTtcblxuXHRcdHZhciBuZXdVdnMxLCBuZXdVdnMyO1xuXG5cdFx0aWYgKCB1dnMxICYmIHV2czEubGVuZ3RoID09PSBsZW5ndGggKSBuZXdVdnMxID0gW107XG5cdFx0aWYgKCB1dnMyICYmIHV2czIubGVuZ3RoID09PSBsZW5ndGggKSBuZXdVdnMyID0gW107XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdHZhciBpZCA9IGZhY2VzWyBpIF0uX2lkO1xuXG5cdFx0XHRpZiAoIG5ld1V2czEgKSBuZXdVdnMxLnB1c2goIHV2czFbIGlkIF0gKTtcblx0XHRcdGlmICggbmV3VXZzMiApIG5ld1V2czIucHVzaCggdXZzMlsgaWQgXSApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBuZXdVdnMxICkgdGhpcy5mYWNlVmVydGV4VXZzWyAwIF0gPSBuZXdVdnMxO1xuXHRcdGlmICggbmV3VXZzMiApIHRoaXMuZmFjZVZlcnRleFV2c1sgMSBdID0gbmV3VXZzMjtcblxuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGRhdGEgPSB7XG5cdFx0XHRtZXRhZGF0YToge1xuXHRcdFx0XHR2ZXJzaW9uOiA0LjUsXG5cdFx0XHRcdHR5cGU6ICdHZW9tZXRyeScsXG5cdFx0XHRcdGdlbmVyYXRvcjogJ0dlb21ldHJ5LnRvSlNPTidcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0Ly8gc3RhbmRhcmQgR2VvbWV0cnkgc2VyaWFsaXphdGlvblxuXG5cdFx0ZGF0YS51dWlkID0gdGhpcy51dWlkO1xuXHRcdGRhdGEudHlwZSA9IHRoaXMudHlwZTtcblx0XHRpZiAoIHRoaXMubmFtZSAhPT0gJycgKSBkYXRhLm5hbWUgPSB0aGlzLm5hbWU7XG5cblx0XHRpZiAoIHRoaXMucGFyYW1ldGVycyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR2YXIgcGFyYW1ldGVycyA9IHRoaXMucGFyYW1ldGVycztcblxuXHRcdFx0Zm9yICggdmFyIGtleSBpbiBwYXJhbWV0ZXJzICkge1xuXG5cdFx0XHRcdGlmICggcGFyYW1ldGVyc1sga2V5IF0gIT09IHVuZGVmaW5lZCApIGRhdGFbIGtleSBdID0gcGFyYW1ldGVyc1sga2V5IF07XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGRhdGE7XG5cblx0XHR9XG5cblx0XHR2YXIgdmVydGljZXMgPSBbXTtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IHRoaXMudmVydGljZXMubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHR2YXIgdmVydGV4ID0gdGhpcy52ZXJ0aWNlc1sgaSBdO1xuXHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0fVxuXG5cdFx0dmFyIGZhY2VzID0gW107XG5cdFx0dmFyIG5vcm1hbHMgPSBbXTtcblx0XHR2YXIgbm9ybWFsc0hhc2ggPSB7fTtcblx0XHR2YXIgY29sb3JzID0gW107XG5cdFx0dmFyIGNvbG9yc0hhc2ggPSB7fTtcblx0XHR2YXIgdXZzID0gW107XG5cdFx0dmFyIHV2c0hhc2ggPSB7fTtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IHRoaXMuZmFjZXMubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHR2YXIgZmFjZSA9IHRoaXMuZmFjZXNbIGkgXTtcblxuXHRcdFx0dmFyIGhhc01hdGVyaWFsID0gdHJ1ZTtcblx0XHRcdHZhciBoYXNGYWNlVXYgPSBmYWxzZTsgLy8gZGVwcmVjYXRlZFxuXHRcdFx0dmFyIGhhc0ZhY2VWZXJ0ZXhVdiA9IHRoaXMuZmFjZVZlcnRleFV2c1sgMCBdWyBpIF0gIT09IHVuZGVmaW5lZDtcblx0XHRcdHZhciBoYXNGYWNlTm9ybWFsID0gZmFjZS5ub3JtYWwubGVuZ3RoKCkgPiAwO1xuXHRcdFx0dmFyIGhhc0ZhY2VWZXJ0ZXhOb3JtYWwgPSBmYWNlLnZlcnRleE5vcm1hbHMubGVuZ3RoID4gMDtcblx0XHRcdHZhciBoYXNGYWNlQ29sb3IgPSBmYWNlLmNvbG9yLnIgIT09IDEgfHwgZmFjZS5jb2xvci5nICE9PSAxIHx8IGZhY2UuY29sb3IuYiAhPT0gMTtcblx0XHRcdHZhciBoYXNGYWNlVmVydGV4Q29sb3IgPSBmYWNlLnZlcnRleENvbG9ycy5sZW5ndGggPiAwO1xuXG5cdFx0XHR2YXIgZmFjZVR5cGUgPSAwO1xuXG5cdFx0XHRmYWNlVHlwZSA9IHNldEJpdCggZmFjZVR5cGUsIDAsIDAgKTsgLy8gaXNRdWFkXG5cdFx0XHRmYWNlVHlwZSA9IHNldEJpdCggZmFjZVR5cGUsIDEsIGhhc01hdGVyaWFsICk7XG5cdFx0XHRmYWNlVHlwZSA9IHNldEJpdCggZmFjZVR5cGUsIDIsIGhhc0ZhY2VVdiApO1xuXHRcdFx0ZmFjZVR5cGUgPSBzZXRCaXQoIGZhY2VUeXBlLCAzLCBoYXNGYWNlVmVydGV4VXYgKTtcblx0XHRcdGZhY2VUeXBlID0gc2V0Qml0KCBmYWNlVHlwZSwgNCwgaGFzRmFjZU5vcm1hbCApO1xuXHRcdFx0ZmFjZVR5cGUgPSBzZXRCaXQoIGZhY2VUeXBlLCA1LCBoYXNGYWNlVmVydGV4Tm9ybWFsICk7XG5cdFx0XHRmYWNlVHlwZSA9IHNldEJpdCggZmFjZVR5cGUsIDYsIGhhc0ZhY2VDb2xvciApO1xuXHRcdFx0ZmFjZVR5cGUgPSBzZXRCaXQoIGZhY2VUeXBlLCA3LCBoYXNGYWNlVmVydGV4Q29sb3IgKTtcblxuXHRcdFx0ZmFjZXMucHVzaCggZmFjZVR5cGUgKTtcblx0XHRcdGZhY2VzLnB1c2goIGZhY2UuYSwgZmFjZS5iLCBmYWNlLmMgKTtcblx0XHRcdGZhY2VzLnB1c2goIGZhY2UubWF0ZXJpYWxJbmRleCApO1xuXG5cdFx0XHRpZiAoIGhhc0ZhY2VWZXJ0ZXhVdiApIHtcblxuXHRcdFx0XHR2YXIgZmFjZVZlcnRleFV2cyA9IHRoaXMuZmFjZVZlcnRleFV2c1sgMCBdWyBpIF07XG5cblx0XHRcdFx0ZmFjZXMucHVzaChcblx0XHRcdFx0XHRnZXRVdkluZGV4KCBmYWNlVmVydGV4VXZzWyAwIF0gKSxcblx0XHRcdFx0XHRnZXRVdkluZGV4KCBmYWNlVmVydGV4VXZzWyAxIF0gKSxcblx0XHRcdFx0XHRnZXRVdkluZGV4KCBmYWNlVmVydGV4VXZzWyAyIF0gKVxuXHRcdFx0XHQpO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggaGFzRmFjZU5vcm1hbCApIHtcblxuXHRcdFx0XHRmYWNlcy5wdXNoKCBnZXROb3JtYWxJbmRleCggZmFjZS5ub3JtYWwgKSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggaGFzRmFjZVZlcnRleE5vcm1hbCApIHtcblxuXHRcdFx0XHR2YXIgdmVydGV4Tm9ybWFscyA9IGZhY2UudmVydGV4Tm9ybWFscztcblxuXHRcdFx0XHRmYWNlcy5wdXNoKFxuXHRcdFx0XHRcdGdldE5vcm1hbEluZGV4KCB2ZXJ0ZXhOb3JtYWxzWyAwIF0gKSxcblx0XHRcdFx0XHRnZXROb3JtYWxJbmRleCggdmVydGV4Tm9ybWFsc1sgMSBdICksXG5cdFx0XHRcdFx0Z2V0Tm9ybWFsSW5kZXgoIHZlcnRleE5vcm1hbHNbIDIgXSApXG5cdFx0XHRcdCk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBoYXNGYWNlQ29sb3IgKSB7XG5cblx0XHRcdFx0ZmFjZXMucHVzaCggZ2V0Q29sb3JJbmRleCggZmFjZS5jb2xvciApICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBoYXNGYWNlVmVydGV4Q29sb3IgKSB7XG5cblx0XHRcdFx0dmFyIHZlcnRleENvbG9ycyA9IGZhY2UudmVydGV4Q29sb3JzO1xuXG5cdFx0XHRcdGZhY2VzLnB1c2goXG5cdFx0XHRcdFx0Z2V0Q29sb3JJbmRleCggdmVydGV4Q29sb3JzWyAwIF0gKSxcblx0XHRcdFx0XHRnZXRDb2xvckluZGV4KCB2ZXJ0ZXhDb2xvcnNbIDEgXSApLFxuXHRcdFx0XHRcdGdldENvbG9ySW5kZXgoIHZlcnRleENvbG9yc1sgMiBdIClcblx0XHRcdFx0KTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gc2V0Qml0KCB2YWx1ZSwgcG9zaXRpb24sIGVuYWJsZWQgKSB7XG5cblx0XHRcdHJldHVybiBlbmFibGVkID8gdmFsdWUgfCAoIDEgPDwgcG9zaXRpb24gKSA6IHZhbHVlICYgKCB+ICggMSA8PCBwb3NpdGlvbiApICk7XG5cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBnZXROb3JtYWxJbmRleCggbm9ybWFsICkge1xuXG5cdFx0XHR2YXIgaGFzaCA9IG5vcm1hbC54LnRvU3RyaW5nKCkgKyBub3JtYWwueS50b1N0cmluZygpICsgbm9ybWFsLnoudG9TdHJpbmcoKTtcblxuXHRcdFx0aWYgKCBub3JtYWxzSGFzaFsgaGFzaCBdICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0cmV0dXJuIG5vcm1hbHNIYXNoWyBoYXNoIF07XG5cblx0XHRcdH1cblxuXHRcdFx0bm9ybWFsc0hhc2hbIGhhc2ggXSA9IG5vcm1hbHMubGVuZ3RoIC8gMztcblx0XHRcdG5vcm1hbHMucHVzaCggbm9ybWFsLngsIG5vcm1hbC55LCBub3JtYWwueiApO1xuXG5cdFx0XHRyZXR1cm4gbm9ybWFsc0hhc2hbIGhhc2ggXTtcblxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIGdldENvbG9ySW5kZXgoIGNvbG9yICkge1xuXG5cdFx0XHR2YXIgaGFzaCA9IGNvbG9yLnIudG9TdHJpbmcoKSArIGNvbG9yLmcudG9TdHJpbmcoKSArIGNvbG9yLmIudG9TdHJpbmcoKTtcblxuXHRcdFx0aWYgKCBjb2xvcnNIYXNoWyBoYXNoIF0gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRyZXR1cm4gY29sb3JzSGFzaFsgaGFzaCBdO1xuXG5cdFx0XHR9XG5cblx0XHRcdGNvbG9yc0hhc2hbIGhhc2ggXSA9IGNvbG9ycy5sZW5ndGg7XG5cdFx0XHRjb2xvcnMucHVzaCggY29sb3IuZ2V0SGV4KCkgKTtcblxuXHRcdFx0cmV0dXJuIGNvbG9yc0hhc2hbIGhhc2ggXTtcblxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIGdldFV2SW5kZXgoIHV2ICkge1xuXG5cdFx0XHR2YXIgaGFzaCA9IHV2LngudG9TdHJpbmcoKSArIHV2LnkudG9TdHJpbmcoKTtcblxuXHRcdFx0aWYgKCB1dnNIYXNoWyBoYXNoIF0gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRyZXR1cm4gdXZzSGFzaFsgaGFzaCBdO1xuXG5cdFx0XHR9XG5cblx0XHRcdHV2c0hhc2hbIGhhc2ggXSA9IHV2cy5sZW5ndGggLyAyO1xuXHRcdFx0dXZzLnB1c2goIHV2LngsIHV2LnkgKTtcblxuXHRcdFx0cmV0dXJuIHV2c0hhc2hbIGhhc2ggXTtcblxuXHRcdH1cblxuXHRcdGRhdGEuZGF0YSA9IHt9O1xuXG5cdFx0ZGF0YS5kYXRhLnZlcnRpY2VzID0gdmVydGljZXM7XG5cdFx0ZGF0YS5kYXRhLm5vcm1hbHMgPSBub3JtYWxzO1xuXHRcdGlmICggY29sb3JzLmxlbmd0aCA+IDAgKSBkYXRhLmRhdGEuY29sb3JzID0gY29sb3JzO1xuXHRcdGlmICggdXZzLmxlbmd0aCA+IDAgKSBkYXRhLmRhdGEudXZzID0gWyB1dnMgXTsgLy8gdGVtcG9yYWwgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuXHRcdGRhdGEuZGF0YS5mYWNlcyA9IGZhY2VzO1xuXG5cdFx0cmV0dXJuIGRhdGE7XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Lypcblx0XHQgLy8gSGFuZGxlIHByaW1pdGl2ZXNcblxuXHRcdCB2YXIgcGFyYW1ldGVycyA9IHRoaXMucGFyYW1ldGVycztcblxuXHRcdCBpZiAoIHBhcmFtZXRlcnMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdCB2YXIgdmFsdWVzID0gW107XG5cblx0XHQgZm9yICggdmFyIGtleSBpbiBwYXJhbWV0ZXJzICkge1xuXG5cdFx0IHZhbHVlcy5wdXNoKCBwYXJhbWV0ZXJzWyBrZXkgXSApO1xuXG5cdFx0IH1cblxuXHRcdCB2YXIgZ2VvbWV0cnkgPSBPYmplY3QuY3JlYXRlKCB0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZSApO1xuXHRcdCB0aGlzLmNvbnN0cnVjdG9yLmFwcGx5KCBnZW9tZXRyeSwgdmFsdWVzICk7XG5cdFx0IHJldHVybiBnZW9tZXRyeTtcblxuXHRcdCB9XG5cblx0XHQgcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xuXHRcdCAqL1xuXG5cdFx0cmV0dXJuIG5ldyBHZW9tZXRyeSgpLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0dmFyIGksIGlsLCBqLCBqbCwgaywga2w7XG5cblx0XHQvLyByZXNldFxuXG5cdFx0dGhpcy52ZXJ0aWNlcyA9IFtdO1xuXHRcdHRoaXMuY29sb3JzID0gW107XG5cdFx0dGhpcy5mYWNlcyA9IFtdO1xuXHRcdHRoaXMuZmFjZVZlcnRleFV2cyA9IFtbXV07XG5cdFx0dGhpcy5tb3JwaFRhcmdldHMgPSBbXTtcblx0XHR0aGlzLm1vcnBoTm9ybWFscyA9IFtdO1xuXHRcdHRoaXMuc2tpbldlaWdodHMgPSBbXTtcblx0XHR0aGlzLnNraW5JbmRpY2VzID0gW107XG5cdFx0dGhpcy5saW5lRGlzdGFuY2VzID0gW107XG5cdFx0dGhpcy5ib3VuZGluZ0JveCA9IG51bGw7XG5cdFx0dGhpcy5ib3VuZGluZ1NwaGVyZSA9IG51bGw7XG5cblx0XHQvLyBuYW1lXG5cblx0XHR0aGlzLm5hbWUgPSBzb3VyY2UubmFtZTtcblxuXHRcdC8vIHZlcnRpY2VzXG5cblx0XHR2YXIgdmVydGljZXMgPSBzb3VyY2UudmVydGljZXM7XG5cblx0XHRmb3IgKCBpID0gMCwgaWwgPSB2ZXJ0aWNlcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0dGhpcy52ZXJ0aWNlcy5wdXNoKCB2ZXJ0aWNlc1sgaSBdLmNsb25lKCkgKTtcblxuXHRcdH1cblxuXHRcdC8vIGNvbG9yc1xuXG5cdFx0dmFyIGNvbG9ycyA9IHNvdXJjZS5jb2xvcnM7XG5cblx0XHRmb3IgKCBpID0gMCwgaWwgPSBjb2xvcnMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHRoaXMuY29sb3JzLnB1c2goIGNvbG9yc1sgaSBdLmNsb25lKCkgKTtcblxuXHRcdH1cblxuXHRcdC8vIGZhY2VzXG5cblx0XHR2YXIgZmFjZXMgPSBzb3VyY2UuZmFjZXM7XG5cblx0XHRmb3IgKCBpID0gMCwgaWwgPSBmYWNlcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0dGhpcy5mYWNlcy5wdXNoKCBmYWNlc1sgaSBdLmNsb25lKCkgKTtcblxuXHRcdH1cblxuXHRcdC8vIGZhY2UgdmVydGV4IHV2c1xuXG5cdFx0Zm9yICggaSA9IDAsIGlsID0gc291cmNlLmZhY2VWZXJ0ZXhVdnMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBmYWNlVmVydGV4VXZzID0gc291cmNlLmZhY2VWZXJ0ZXhVdnNbIGkgXTtcblxuXHRcdFx0aWYgKCB0aGlzLmZhY2VWZXJ0ZXhVdnNbIGkgXSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHRoaXMuZmFjZVZlcnRleFV2c1sgaSBdID0gW107XG5cblx0XHRcdH1cblxuXHRcdFx0Zm9yICggaiA9IDAsIGpsID0gZmFjZVZlcnRleFV2cy5sZW5ndGg7IGogPCBqbDsgaiArKyApIHtcblxuXHRcdFx0XHR2YXIgdXZzID0gZmFjZVZlcnRleFV2c1sgaiBdLCB1dnNDb3B5ID0gW107XG5cblx0XHRcdFx0Zm9yICggayA9IDAsIGtsID0gdXZzLmxlbmd0aDsgayA8IGtsOyBrICsrICkge1xuXG5cdFx0XHRcdFx0dmFyIHV2ID0gdXZzWyBrIF07XG5cblx0XHRcdFx0XHR1dnNDb3B5LnB1c2goIHV2LmNsb25lKCkgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGhpcy5mYWNlVmVydGV4VXZzWyBpIF0ucHVzaCggdXZzQ29weSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvLyBtb3JwaCB0YXJnZXRzXG5cblx0XHR2YXIgbW9ycGhUYXJnZXRzID0gc291cmNlLm1vcnBoVGFyZ2V0cztcblxuXHRcdGZvciAoIGkgPSAwLCBpbCA9IG1vcnBoVGFyZ2V0cy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIG1vcnBoVGFyZ2V0ID0ge307XG5cdFx0XHRtb3JwaFRhcmdldC5uYW1lID0gbW9ycGhUYXJnZXRzWyBpIF0ubmFtZTtcblxuXHRcdFx0Ly8gdmVydGljZXNcblxuXHRcdFx0aWYgKCBtb3JwaFRhcmdldHNbIGkgXS52ZXJ0aWNlcyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdG1vcnBoVGFyZ2V0LnZlcnRpY2VzID0gW107XG5cblx0XHRcdFx0Zm9yICggaiA9IDAsIGpsID0gbW9ycGhUYXJnZXRzWyBpIF0udmVydGljZXMubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7XG5cblx0XHRcdFx0XHRtb3JwaFRhcmdldC52ZXJ0aWNlcy5wdXNoKCBtb3JwaFRhcmdldHNbIGkgXS52ZXJ0aWNlc1sgaiBdLmNsb25lKCkgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gbm9ybWFsc1xuXG5cdFx0XHRpZiAoIG1vcnBoVGFyZ2V0c1sgaSBdLm5vcm1hbHMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRtb3JwaFRhcmdldC5ub3JtYWxzID0gW107XG5cblx0XHRcdFx0Zm9yICggaiA9IDAsIGpsID0gbW9ycGhUYXJnZXRzWyBpIF0ubm9ybWFscy5sZW5ndGg7IGogPCBqbDsgaiArKyApIHtcblxuXHRcdFx0XHRcdG1vcnBoVGFyZ2V0Lm5vcm1hbHMucHVzaCggbW9ycGhUYXJnZXRzWyBpIF0ubm9ybWFsc1sgaiBdLmNsb25lKCkgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5tb3JwaFRhcmdldHMucHVzaCggbW9ycGhUYXJnZXQgKTtcblxuXHRcdH1cblxuXHRcdC8vIG1vcnBoIG5vcm1hbHNcblxuXHRcdHZhciBtb3JwaE5vcm1hbHMgPSBzb3VyY2UubW9ycGhOb3JtYWxzO1xuXG5cdFx0Zm9yICggaSA9IDAsIGlsID0gbW9ycGhOb3JtYWxzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgbW9ycGhOb3JtYWwgPSB7fTtcblxuXHRcdFx0Ly8gdmVydGV4IG5vcm1hbHNcblxuXHRcdFx0aWYgKCBtb3JwaE5vcm1hbHNbIGkgXS52ZXJ0ZXhOb3JtYWxzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0bW9ycGhOb3JtYWwudmVydGV4Tm9ybWFscyA9IFtdO1xuXG5cdFx0XHRcdGZvciAoIGogPSAwLCBqbCA9IG1vcnBoTm9ybWFsc1sgaSBdLnZlcnRleE5vcm1hbHMubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7XG5cblx0XHRcdFx0XHR2YXIgc3JjVmVydGV4Tm9ybWFsID0gbW9ycGhOb3JtYWxzWyBpIF0udmVydGV4Tm9ybWFsc1sgaiBdO1xuXHRcdFx0XHRcdHZhciBkZXN0VmVydGV4Tm9ybWFsID0ge307XG5cblx0XHRcdFx0XHRkZXN0VmVydGV4Tm9ybWFsLmEgPSBzcmNWZXJ0ZXhOb3JtYWwuYS5jbG9uZSgpO1xuXHRcdFx0XHRcdGRlc3RWZXJ0ZXhOb3JtYWwuYiA9IHNyY1ZlcnRleE5vcm1hbC5iLmNsb25lKCk7XG5cdFx0XHRcdFx0ZGVzdFZlcnRleE5vcm1hbC5jID0gc3JjVmVydGV4Tm9ybWFsLmMuY2xvbmUoKTtcblxuXHRcdFx0XHRcdG1vcnBoTm9ybWFsLnZlcnRleE5vcm1hbHMucHVzaCggZGVzdFZlcnRleE5vcm1hbCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBmYWNlIG5vcm1hbHNcblxuXHRcdFx0aWYgKCBtb3JwaE5vcm1hbHNbIGkgXS5mYWNlTm9ybWFscyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdG1vcnBoTm9ybWFsLmZhY2VOb3JtYWxzID0gW107XG5cblx0XHRcdFx0Zm9yICggaiA9IDAsIGpsID0gbW9ycGhOb3JtYWxzWyBpIF0uZmFjZU5vcm1hbHMubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7XG5cblx0XHRcdFx0XHRtb3JwaE5vcm1hbC5mYWNlTm9ybWFscy5wdXNoKCBtb3JwaE5vcm1hbHNbIGkgXS5mYWNlTm9ybWFsc1sgaiBdLmNsb25lKCkgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5tb3JwaE5vcm1hbHMucHVzaCggbW9ycGhOb3JtYWwgKTtcblxuXHRcdH1cblxuXHRcdC8vIHNraW4gd2VpZ2h0c1xuXG5cdFx0dmFyIHNraW5XZWlnaHRzID0gc291cmNlLnNraW5XZWlnaHRzO1xuXG5cdFx0Zm9yICggaSA9IDAsIGlsID0gc2tpbldlaWdodHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHRoaXMuc2tpbldlaWdodHMucHVzaCggc2tpbldlaWdodHNbIGkgXS5jbG9uZSgpICk7XG5cblx0XHR9XG5cblx0XHQvLyBza2luIGluZGljZXNcblxuXHRcdHZhciBza2luSW5kaWNlcyA9IHNvdXJjZS5za2luSW5kaWNlcztcblxuXHRcdGZvciAoIGkgPSAwLCBpbCA9IHNraW5JbmRpY2VzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR0aGlzLnNraW5JbmRpY2VzLnB1c2goIHNraW5JbmRpY2VzWyBpIF0uY2xvbmUoKSApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gbGluZSBkaXN0YW5jZXNcblxuXHRcdHZhciBsaW5lRGlzdGFuY2VzID0gc291cmNlLmxpbmVEaXN0YW5jZXM7XG5cblx0XHRmb3IgKCBpID0gMCwgaWwgPSBsaW5lRGlzdGFuY2VzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR0aGlzLmxpbmVEaXN0YW5jZXMucHVzaCggbGluZURpc3RhbmNlc1sgaSBdICk7XG5cblx0XHR9XG5cblx0XHQvLyBib3VuZGluZyBib3hcblxuXHRcdHZhciBib3VuZGluZ0JveCA9IHNvdXJjZS5ib3VuZGluZ0JveDtcblxuXHRcdGlmICggYm91bmRpbmdCb3ggIT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuYm91bmRpbmdCb3ggPSBib3VuZGluZ0JveC5jbG9uZSgpO1xuXG5cdFx0fVxuXG5cdFx0Ly8gYm91bmRpbmcgc3BoZXJlXG5cblx0XHR2YXIgYm91bmRpbmdTcGhlcmUgPSBzb3VyY2UuYm91bmRpbmdTcGhlcmU7XG5cblx0XHRpZiAoIGJvdW5kaW5nU3BoZXJlICE9PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLmJvdW5kaW5nU3BoZXJlID0gYm91bmRpbmdTcGhlcmUuY2xvbmUoKTtcblxuXHRcdH1cblxuXHRcdC8vIHVwZGF0ZSBmbGFnc1xuXG5cdFx0dGhpcy5lbGVtZW50c05lZWRVcGRhdGUgPSBzb3VyY2UuZWxlbWVudHNOZWVkVXBkYXRlO1xuXHRcdHRoaXMudmVydGljZXNOZWVkVXBkYXRlID0gc291cmNlLnZlcnRpY2VzTmVlZFVwZGF0ZTtcblx0XHR0aGlzLnV2c05lZWRVcGRhdGUgPSBzb3VyY2UudXZzTmVlZFVwZGF0ZTtcblx0XHR0aGlzLm5vcm1hbHNOZWVkVXBkYXRlID0gc291cmNlLm5vcm1hbHNOZWVkVXBkYXRlO1xuXHRcdHRoaXMuY29sb3JzTmVlZFVwZGF0ZSA9IHNvdXJjZS5jb2xvcnNOZWVkVXBkYXRlO1xuXHRcdHRoaXMubGluZURpc3RhbmNlc05lZWRVcGRhdGUgPSBzb3VyY2UubGluZURpc3RhbmNlc05lZWRVcGRhdGU7XG5cdFx0dGhpcy5ncm91cHNOZWVkVXBkYXRlID0gc291cmNlLmdyb3Vwc05lZWRVcGRhdGU7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGRpc3Bvc2U6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuZGlzcGF0Y2hFdmVudCggeyB0eXBlOiAnZGlzcG9zZScgfSApO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gQnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKSB7XG5cblx0aWYgKCBBcnJheS5pc0FycmF5KCBhcnJheSApICkge1xuXG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvciggJ1RIUkVFLkJ1ZmZlckF0dHJpYnV0ZTogYXJyYXkgc2hvdWxkIGJlIGEgVHlwZWQgQXJyYXkuJyApO1xuXG5cdH1cblxuXHR0aGlzLm5hbWUgPSAnJztcblxuXHR0aGlzLmFycmF5ID0gYXJyYXk7XG5cdHRoaXMuaXRlbVNpemUgPSBpdGVtU2l6ZTtcblx0dGhpcy5jb3VudCA9IGFycmF5ICE9PSB1bmRlZmluZWQgPyBhcnJheS5sZW5ndGggLyBpdGVtU2l6ZSA6IDA7XG5cdHRoaXMubm9ybWFsaXplZCA9IG5vcm1hbGl6ZWQgPT09IHRydWU7XG5cblx0dGhpcy5keW5hbWljID0gZmFsc2U7XG5cdHRoaXMudXBkYXRlUmFuZ2UgPSB7IG9mZnNldDogMCwgY291bnQ6IC0gMSB9O1xuXG5cdHRoaXMudmVyc2lvbiA9IDA7XG5cbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KCBCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLCAnbmVlZHNVcGRhdGUnLCB7XG5cblx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0aWYgKCB2YWx1ZSA9PT0gdHJ1ZSApIHRoaXMudmVyc2lvbiArKztcblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmFzc2lnbiggQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSwge1xuXG5cdGlzQnVmZmVyQXR0cmlidXRlOiB0cnVlLFxuXG5cdG9uVXBsb2FkQ2FsbGJhY2s6IGZ1bmN0aW9uICgpIHt9LFxuXG5cdHNldEFycmF5OiBmdW5jdGlvbiAoIGFycmF5ICkge1xuXG5cdFx0aWYgKCBBcnJheS5pc0FycmF5KCBhcnJheSApICkge1xuXG5cdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCAnVEhSRUUuQnVmZmVyQXR0cmlidXRlOiBhcnJheSBzaG91bGQgYmUgYSBUeXBlZCBBcnJheS4nICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLmNvdW50ID0gYXJyYXkgIT09IHVuZGVmaW5lZCA/IGFycmF5Lmxlbmd0aCAvIHRoaXMuaXRlbVNpemUgOiAwO1xuXHRcdHRoaXMuYXJyYXkgPSBhcnJheTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RHluYW1pYzogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMuZHluYW1pYyA9IHZhbHVlO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRcdHRoaXMubmFtZSA9IHNvdXJjZS5uYW1lO1xuXHRcdHRoaXMuYXJyYXkgPSBuZXcgc291cmNlLmFycmF5LmNvbnN0cnVjdG9yKCBzb3VyY2UuYXJyYXkgKTtcblx0XHR0aGlzLml0ZW1TaXplID0gc291cmNlLml0ZW1TaXplO1xuXHRcdHRoaXMuY291bnQgPSBzb3VyY2UuY291bnQ7XG5cdFx0dGhpcy5ub3JtYWxpemVkID0gc291cmNlLm5vcm1hbGl6ZWQ7XG5cblx0XHR0aGlzLmR5bmFtaWMgPSBzb3VyY2UuZHluYW1pYztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y29weUF0OiBmdW5jdGlvbiAoIGluZGV4MSwgYXR0cmlidXRlLCBpbmRleDIgKSB7XG5cblx0XHRpbmRleDEgKj0gdGhpcy5pdGVtU2l6ZTtcblx0XHRpbmRleDIgKj0gYXR0cmlidXRlLml0ZW1TaXplO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gdGhpcy5pdGVtU2l6ZTsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHRoaXMuYXJyYXlbIGluZGV4MSArIGkgXSA9IGF0dHJpYnV0ZS5hcnJheVsgaW5kZXgyICsgaSBdO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjb3B5QXJyYXk6IGZ1bmN0aW9uICggYXJyYXkgKSB7XG5cblx0XHR0aGlzLmFycmF5LnNldCggYXJyYXkgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y29weUNvbG9yc0FycmF5OiBmdW5jdGlvbiAoIGNvbG9ycyApIHtcblxuXHRcdHZhciBhcnJheSA9IHRoaXMuYXJyYXksIG9mZnNldCA9IDA7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBjb2xvcnMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGNvbG9yID0gY29sb3JzWyBpIF07XG5cblx0XHRcdGlmICggY29sb3IgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJBdHRyaWJ1dGUuY29weUNvbG9yc0FycmF5KCk6IGNvbG9yIGlzIHVuZGVmaW5lZCcsIGkgKTtcblx0XHRcdFx0Y29sb3IgPSBuZXcgQ29sb3IoKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRhcnJheVsgb2Zmc2V0ICsrIF0gPSBjb2xvci5yO1xuXHRcdFx0YXJyYXlbIG9mZnNldCArKyBdID0gY29sb3IuZztcblx0XHRcdGFycmF5WyBvZmZzZXQgKysgXSA9IGNvbG9yLmI7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvcHlWZWN0b3Iyc0FycmF5OiBmdW5jdGlvbiAoIHZlY3RvcnMgKSB7XG5cblx0XHR2YXIgYXJyYXkgPSB0aGlzLmFycmF5LCBvZmZzZXQgPSAwO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gdmVjdG9ycy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgdmVjdG9yID0gdmVjdG9yc1sgaSBdO1xuXG5cdFx0XHRpZiAoIHZlY3RvciA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckF0dHJpYnV0ZS5jb3B5VmVjdG9yMnNBcnJheSgpOiB2ZWN0b3IgaXMgdW5kZWZpbmVkJywgaSApO1xuXHRcdFx0XHR2ZWN0b3IgPSBuZXcgVmVjdG9yMigpO1xuXG5cdFx0XHR9XG5cblx0XHRcdGFycmF5WyBvZmZzZXQgKysgXSA9IHZlY3Rvci54O1xuXHRcdFx0YXJyYXlbIG9mZnNldCArKyBdID0gdmVjdG9yLnk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvcHlWZWN0b3Izc0FycmF5OiBmdW5jdGlvbiAoIHZlY3RvcnMgKSB7XG5cblx0XHR2YXIgYXJyYXkgPSB0aGlzLmFycmF5LCBvZmZzZXQgPSAwO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gdmVjdG9ycy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgdmVjdG9yID0gdmVjdG9yc1sgaSBdO1xuXG5cdFx0XHRpZiAoIHZlY3RvciA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckF0dHJpYnV0ZS5jb3B5VmVjdG9yM3NBcnJheSgpOiB2ZWN0b3IgaXMgdW5kZWZpbmVkJywgaSApO1xuXHRcdFx0XHR2ZWN0b3IgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0XHR9XG5cblx0XHRcdGFycmF5WyBvZmZzZXQgKysgXSA9IHZlY3Rvci54O1xuXHRcdFx0YXJyYXlbIG9mZnNldCArKyBdID0gdmVjdG9yLnk7XG5cdFx0XHRhcnJheVsgb2Zmc2V0ICsrIF0gPSB2ZWN0b3IuejtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y29weVZlY3RvcjRzQXJyYXk6IGZ1bmN0aW9uICggdmVjdG9ycyApIHtcblxuXHRcdHZhciBhcnJheSA9IHRoaXMuYXJyYXksIG9mZnNldCA9IDA7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSB2ZWN0b3JzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciB2ZWN0b3IgPSB2ZWN0b3JzWyBpIF07XG5cblx0XHRcdGlmICggdmVjdG9yID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQnVmZmVyQXR0cmlidXRlLmNvcHlWZWN0b3I0c0FycmF5KCk6IHZlY3RvciBpcyB1bmRlZmluZWQnLCBpICk7XG5cdFx0XHRcdHZlY3RvciA9IG5ldyBWZWN0b3I0KCk7XG5cblx0XHRcdH1cblxuXHRcdFx0YXJyYXlbIG9mZnNldCArKyBdID0gdmVjdG9yLng7XG5cdFx0XHRhcnJheVsgb2Zmc2V0ICsrIF0gPSB2ZWN0b3IueTtcblx0XHRcdGFycmF5WyBvZmZzZXQgKysgXSA9IHZlY3Rvci56O1xuXHRcdFx0YXJyYXlbIG9mZnNldCArKyBdID0gdmVjdG9yLnc7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldDogZnVuY3Rpb24gKCB2YWx1ZSwgb2Zmc2V0ICkge1xuXG5cdFx0aWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7XG5cblx0XHR0aGlzLmFycmF5LnNldCggdmFsdWUsIG9mZnNldCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRnZXRYOiBmdW5jdGlvbiAoIGluZGV4ICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuYXJyYXlbIGluZGV4ICogdGhpcy5pdGVtU2l6ZSBdO1xuXG5cdH0sXG5cblx0c2V0WDogZnVuY3Rpb24gKCBpbmRleCwgeCApIHtcblxuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICogdGhpcy5pdGVtU2l6ZSBdID0geDtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Z2V0WTogZnVuY3Rpb24gKCBpbmRleCApIHtcblxuXHRcdHJldHVybiB0aGlzLmFycmF5WyBpbmRleCAqIHRoaXMuaXRlbVNpemUgKyAxIF07XG5cblx0fSxcblxuXHRzZXRZOiBmdW5jdGlvbiAoIGluZGV4LCB5ICkge1xuXG5cdFx0dGhpcy5hcnJheVsgaW5kZXggKiB0aGlzLml0ZW1TaXplICsgMSBdID0geTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Z2V0WjogZnVuY3Rpb24gKCBpbmRleCApIHtcblxuXHRcdHJldHVybiB0aGlzLmFycmF5WyBpbmRleCAqIHRoaXMuaXRlbVNpemUgKyAyIF07XG5cblx0fSxcblxuXHRzZXRaOiBmdW5jdGlvbiAoIGluZGV4LCB6ICkge1xuXG5cdFx0dGhpcy5hcnJheVsgaW5kZXggKiB0aGlzLml0ZW1TaXplICsgMiBdID0gejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Z2V0VzogZnVuY3Rpb24gKCBpbmRleCApIHtcblxuXHRcdHJldHVybiB0aGlzLmFycmF5WyBpbmRleCAqIHRoaXMuaXRlbVNpemUgKyAzIF07XG5cblx0fSxcblxuXHRzZXRXOiBmdW5jdGlvbiAoIGluZGV4LCB3ICkge1xuXG5cdFx0dGhpcy5hcnJheVsgaW5kZXggKiB0aGlzLml0ZW1TaXplICsgMyBdID0gdztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0WFk6IGZ1bmN0aW9uICggaW5kZXgsIHgsIHkgKSB7XG5cblx0XHRpbmRleCAqPSB0aGlzLml0ZW1TaXplO1xuXG5cdFx0dGhpcy5hcnJheVsgaW5kZXggKyAwIF0gPSB4O1xuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICsgMSBdID0geTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0WFlaOiBmdW5jdGlvbiAoIGluZGV4LCB4LCB5LCB6ICkge1xuXG5cdFx0aW5kZXggKj0gdGhpcy5pdGVtU2l6ZTtcblxuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICsgMCBdID0geDtcblx0XHR0aGlzLmFycmF5WyBpbmRleCArIDEgXSA9IHk7XG5cdFx0dGhpcy5hcnJheVsgaW5kZXggKyAyIF0gPSB6O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRYWVpXOiBmdW5jdGlvbiAoIGluZGV4LCB4LCB5LCB6LCB3ICkge1xuXG5cdFx0aW5kZXggKj0gdGhpcy5pdGVtU2l6ZTtcblxuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICsgMCBdID0geDtcblx0XHR0aGlzLmFycmF5WyBpbmRleCArIDEgXSA9IHk7XG5cdFx0dGhpcy5hcnJheVsgaW5kZXggKyAyIF0gPSB6O1xuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICsgMyBdID0gdztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0b25VcGxvYWQ6IGZ1bmN0aW9uICggY2FsbGJhY2sgKSB7XG5cblx0XHR0aGlzLm9uVXBsb2FkQ2FsbGJhY2sgPSBjYWxsYmFjaztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvciggdGhpcy5hcnJheSwgdGhpcy5pdGVtU2l6ZSApLmNvcHkoIHRoaXMgKTtcblxuXHR9XG5cbn0gKTtcblxuLy9cblxuZnVuY3Rpb24gSW50OEJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplLCBub3JtYWxpemVkICkge1xuXG5cdEJ1ZmZlckF0dHJpYnV0ZS5jYWxsKCB0aGlzLCBuZXcgSW50OEFycmF5KCBhcnJheSApLCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApO1xuXG59XG5cbkludDhCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSApO1xuSW50OEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBJbnQ4QnVmZmVyQXR0cmlidXRlO1xuXG5cbmZ1bmN0aW9uIFVpbnQ4QnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKSB7XG5cblx0QnVmZmVyQXR0cmlidXRlLmNhbGwoIHRoaXMsIG5ldyBVaW50OEFycmF5KCBhcnJheSApLCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApO1xuXG59XG5cblVpbnQ4QnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgKTtcblVpbnQ4QnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFVpbnQ4QnVmZmVyQXR0cmlidXRlO1xuXG5cbmZ1bmN0aW9uIFVpbnQ4Q2xhbXBlZEJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplLCBub3JtYWxpemVkICkge1xuXG5cdEJ1ZmZlckF0dHJpYnV0ZS5jYWxsKCB0aGlzLCBuZXcgVWludDhDbGFtcGVkQXJyYXkoIGFycmF5ICksIGl0ZW1TaXplLCBub3JtYWxpemVkICk7XG5cbn1cblxuVWludDhDbGFtcGVkQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgKTtcblVpbnQ4Q2xhbXBlZEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBVaW50OENsYW1wZWRCdWZmZXJBdHRyaWJ1dGU7XG5cblxuZnVuY3Rpb24gSW50MTZCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApIHtcblxuXHRCdWZmZXJBdHRyaWJ1dGUuY2FsbCggdGhpcywgbmV3IEludDE2QXJyYXkoIGFycmF5ICksIGl0ZW1TaXplLCBub3JtYWxpemVkICk7XG5cbn1cblxuSW50MTZCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSApO1xuSW50MTZCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gSW50MTZCdWZmZXJBdHRyaWJ1dGU7XG5cblxuZnVuY3Rpb24gVWludDE2QnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKSB7XG5cblx0QnVmZmVyQXR0cmlidXRlLmNhbGwoIHRoaXMsIG5ldyBVaW50MTZBcnJheSggYXJyYXkgKSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKTtcblxufVxuXG5VaW50MTZCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSApO1xuVWludDE2QnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFVpbnQxNkJ1ZmZlckF0dHJpYnV0ZTtcblxuXG5mdW5jdGlvbiBJbnQzMkJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplLCBub3JtYWxpemVkICkge1xuXG5cdEJ1ZmZlckF0dHJpYnV0ZS5jYWxsKCB0aGlzLCBuZXcgSW50MzJBcnJheSggYXJyYXkgKSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKTtcblxufVxuXG5JbnQzMkJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlICk7XG5JbnQzMkJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBJbnQzMkJ1ZmZlckF0dHJpYnV0ZTtcblxuXG5mdW5jdGlvbiBVaW50MzJCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApIHtcblxuXHRCdWZmZXJBdHRyaWJ1dGUuY2FsbCggdGhpcywgbmV3IFVpbnQzMkFycmF5KCBhcnJheSApLCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApO1xuXG59XG5cblVpbnQzMkJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlICk7XG5VaW50MzJCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVWludDMyQnVmZmVyQXR0cmlidXRlO1xuXG5cbmZ1bmN0aW9uIEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApIHtcblxuXHRCdWZmZXJBdHRyaWJ1dGUuY2FsbCggdGhpcywgbmV3IEZsb2F0MzJBcnJheSggYXJyYXkgKSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKTtcblxufVxuXG5GbG9hdDMyQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgKTtcbkZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZTtcblxuXG5mdW5jdGlvbiBGbG9hdDY0QnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKSB7XG5cblx0QnVmZmVyQXR0cmlidXRlLmNhbGwoIHRoaXMsIG5ldyBGbG9hdDY0QXJyYXkoIGFycmF5ICksIGl0ZW1TaXplLCBub3JtYWxpemVkICk7XG5cbn1cblxuRmxvYXQ2NEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlICk7XG5GbG9hdDY0QnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEZsb2F0NjRCdWZmZXJBdHRyaWJ1dGU7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBEaXJlY3RHZW9tZXRyeSgpIHtcblxuXHR0aGlzLnZlcnRpY2VzID0gW107XG5cdHRoaXMubm9ybWFscyA9IFtdO1xuXHR0aGlzLmNvbG9ycyA9IFtdO1xuXHR0aGlzLnV2cyA9IFtdO1xuXHR0aGlzLnV2czIgPSBbXTtcblxuXHR0aGlzLmdyb3VwcyA9IFtdO1xuXG5cdHRoaXMubW9ycGhUYXJnZXRzID0ge307XG5cblx0dGhpcy5za2luV2VpZ2h0cyA9IFtdO1xuXHR0aGlzLnNraW5JbmRpY2VzID0gW107XG5cblx0Ly8gdGhpcy5saW5lRGlzdGFuY2VzID0gW107XG5cblx0dGhpcy5ib3VuZGluZ0JveCA9IG51bGw7XG5cdHRoaXMuYm91bmRpbmdTcGhlcmUgPSBudWxsO1xuXG5cdC8vIHVwZGF0ZSBmbGFnc1xuXG5cdHRoaXMudmVydGljZXNOZWVkVXBkYXRlID0gZmFsc2U7XG5cdHRoaXMubm9ybWFsc05lZWRVcGRhdGUgPSBmYWxzZTtcblx0dGhpcy5jb2xvcnNOZWVkVXBkYXRlID0gZmFsc2U7XG5cdHRoaXMudXZzTmVlZFVwZGF0ZSA9IGZhbHNlO1xuXHR0aGlzLmdyb3Vwc05lZWRVcGRhdGUgPSBmYWxzZTtcblxufVxuXG5PYmplY3QuYXNzaWduKCBEaXJlY3RHZW9tZXRyeS5wcm90b3R5cGUsIHtcblxuXHRjb21wdXRlR3JvdXBzOiBmdW5jdGlvbiAoIGdlb21ldHJ5ICkge1xuXG5cdFx0dmFyIGdyb3VwO1xuXHRcdHZhciBncm91cHMgPSBbXTtcblx0XHR2YXIgbWF0ZXJpYWxJbmRleCA9IHVuZGVmaW5lZDtcblxuXHRcdHZhciBmYWNlcyA9IGdlb21ldHJ5LmZhY2VzO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgZmFjZXMubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHR2YXIgZmFjZSA9IGZhY2VzWyBpIF07XG5cblx0XHRcdC8vIG1hdGVyaWFsc1xuXG5cdFx0XHRpZiAoIGZhY2UubWF0ZXJpYWxJbmRleCAhPT0gbWF0ZXJpYWxJbmRleCApIHtcblxuXHRcdFx0XHRtYXRlcmlhbEluZGV4ID0gZmFjZS5tYXRlcmlhbEluZGV4O1xuXG5cdFx0XHRcdGlmICggZ3JvdXAgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdGdyb3VwLmNvdW50ID0gKCBpICogMyApIC0gZ3JvdXAuc3RhcnQ7XG5cdFx0XHRcdFx0Z3JvdXBzLnB1c2goIGdyb3VwICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGdyb3VwID0ge1xuXHRcdFx0XHRcdHN0YXJ0OiBpICogMyxcblx0XHRcdFx0XHRtYXRlcmlhbEluZGV4OiBtYXRlcmlhbEluZGV4XG5cdFx0XHRcdH07XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggZ3JvdXAgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Z3JvdXAuY291bnQgPSAoIGkgKiAzICkgLSBncm91cC5zdGFydDtcblx0XHRcdGdyb3Vwcy5wdXNoKCBncm91cCApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5ncm91cHMgPSBncm91cHM7XG5cblx0fSxcblxuXHRmcm9tR2VvbWV0cnk6IGZ1bmN0aW9uICggZ2VvbWV0cnkgKSB7XG5cblx0XHR2YXIgZmFjZXMgPSBnZW9tZXRyeS5mYWNlcztcblx0XHR2YXIgdmVydGljZXMgPSBnZW9tZXRyeS52ZXJ0aWNlcztcblx0XHR2YXIgZmFjZVZlcnRleFV2cyA9IGdlb21ldHJ5LmZhY2VWZXJ0ZXhVdnM7XG5cblx0XHR2YXIgaGFzRmFjZVZlcnRleFV2ID0gZmFjZVZlcnRleFV2c1sgMCBdICYmIGZhY2VWZXJ0ZXhVdnNbIDAgXS5sZW5ndGggPiAwO1xuXHRcdHZhciBoYXNGYWNlVmVydGV4VXYyID0gZmFjZVZlcnRleFV2c1sgMSBdICYmIGZhY2VWZXJ0ZXhVdnNbIDEgXS5sZW5ndGggPiAwO1xuXG5cdFx0Ly8gbW9ycGhzXG5cblx0XHR2YXIgbW9ycGhUYXJnZXRzID0gZ2VvbWV0cnkubW9ycGhUYXJnZXRzO1xuXHRcdHZhciBtb3JwaFRhcmdldHNMZW5ndGggPSBtb3JwaFRhcmdldHMubGVuZ3RoO1xuXG5cdFx0dmFyIG1vcnBoVGFyZ2V0c1Bvc2l0aW9uO1xuXG5cdFx0aWYgKCBtb3JwaFRhcmdldHNMZW5ndGggPiAwICkge1xuXG5cdFx0XHRtb3JwaFRhcmdldHNQb3NpdGlvbiA9IFtdO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBtb3JwaFRhcmdldHNMZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdFx0bW9ycGhUYXJnZXRzUG9zaXRpb25bIGkgXSA9IFtdO1xuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMubW9ycGhUYXJnZXRzLnBvc2l0aW9uID0gbW9ycGhUYXJnZXRzUG9zaXRpb247XG5cblx0XHR9XG5cblx0XHR2YXIgbW9ycGhOb3JtYWxzID0gZ2VvbWV0cnkubW9ycGhOb3JtYWxzO1xuXHRcdHZhciBtb3JwaE5vcm1hbHNMZW5ndGggPSBtb3JwaE5vcm1hbHMubGVuZ3RoO1xuXG5cdFx0dmFyIG1vcnBoVGFyZ2V0c05vcm1hbDtcblxuXHRcdGlmICggbW9ycGhOb3JtYWxzTGVuZ3RoID4gMCApIHtcblxuXHRcdFx0bW9ycGhUYXJnZXRzTm9ybWFsID0gW107XG5cblx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IG1vcnBoTm9ybWFsc0xlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0XHRtb3JwaFRhcmdldHNOb3JtYWxbIGkgXSA9IFtdO1xuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMubW9ycGhUYXJnZXRzLm5vcm1hbCA9IG1vcnBoVGFyZ2V0c05vcm1hbDtcblxuXHRcdH1cblxuXHRcdC8vIHNraW5zXG5cblx0XHR2YXIgc2tpbkluZGljZXMgPSBnZW9tZXRyeS5za2luSW5kaWNlcztcblx0XHR2YXIgc2tpbldlaWdodHMgPSBnZW9tZXRyeS5za2luV2VpZ2h0cztcblxuXHRcdHZhciBoYXNTa2luSW5kaWNlcyA9IHNraW5JbmRpY2VzLmxlbmd0aCA9PT0gdmVydGljZXMubGVuZ3RoO1xuXHRcdHZhciBoYXNTa2luV2VpZ2h0cyA9IHNraW5XZWlnaHRzLmxlbmd0aCA9PT0gdmVydGljZXMubGVuZ3RoO1xuXG5cdFx0Ly9cblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGZhY2VzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGZhY2UgPSBmYWNlc1sgaSBdO1xuXG5cdFx0XHR0aGlzLnZlcnRpY2VzLnB1c2goIHZlcnRpY2VzWyBmYWNlLmEgXSwgdmVydGljZXNbIGZhY2UuYiBdLCB2ZXJ0aWNlc1sgZmFjZS5jIF0gKTtcblxuXHRcdFx0dmFyIHZlcnRleE5vcm1hbHMgPSBmYWNlLnZlcnRleE5vcm1hbHM7XG5cblx0XHRcdGlmICggdmVydGV4Tm9ybWFscy5sZW5ndGggPT09IDMgKSB7XG5cblx0XHRcdFx0dGhpcy5ub3JtYWxzLnB1c2goIHZlcnRleE5vcm1hbHNbIDAgXSwgdmVydGV4Tm9ybWFsc1sgMSBdLCB2ZXJ0ZXhOb3JtYWxzWyAyIF0gKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHR2YXIgbm9ybWFsID0gZmFjZS5ub3JtYWw7XG5cblx0XHRcdFx0dGhpcy5ub3JtYWxzLnB1c2goIG5vcm1hbCwgbm9ybWFsLCBub3JtYWwgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgdmVydGV4Q29sb3JzID0gZmFjZS52ZXJ0ZXhDb2xvcnM7XG5cblx0XHRcdGlmICggdmVydGV4Q29sb3JzLmxlbmd0aCA9PT0gMyApIHtcblxuXHRcdFx0XHR0aGlzLmNvbG9ycy5wdXNoKCB2ZXJ0ZXhDb2xvcnNbIDAgXSwgdmVydGV4Q29sb3JzWyAxIF0sIHZlcnRleENvbG9yc1sgMiBdICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0dmFyIGNvbG9yID0gZmFjZS5jb2xvcjtcblxuXHRcdFx0XHR0aGlzLmNvbG9ycy5wdXNoKCBjb2xvciwgY29sb3IsIGNvbG9yICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBoYXNGYWNlVmVydGV4VXYgPT09IHRydWUgKSB7XG5cblx0XHRcdFx0dmFyIHZlcnRleFV2cyA9IGZhY2VWZXJ0ZXhVdnNbIDAgXVsgaSBdO1xuXG5cdFx0XHRcdGlmICggdmVydGV4VXZzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHR0aGlzLnV2cy5wdXNoKCB2ZXJ0ZXhVdnNbIDAgXSwgdmVydGV4VXZzWyAxIF0sIHZlcnRleFV2c1sgMiBdICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkRpcmVjdEdlb21ldHJ5LmZyb21HZW9tZXRyeSgpOiBVbmRlZmluZWQgdmVydGV4VXYgJywgaSApO1xuXG5cdFx0XHRcdFx0dGhpcy51dnMucHVzaCggbmV3IFZlY3RvcjIoKSwgbmV3IFZlY3RvcjIoKSwgbmV3IFZlY3RvcjIoKSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGhhc0ZhY2VWZXJ0ZXhVdjIgPT09IHRydWUgKSB7XG5cblx0XHRcdFx0dmFyIHZlcnRleFV2cyA9IGZhY2VWZXJ0ZXhVdnNbIDEgXVsgaSBdO1xuXG5cdFx0XHRcdGlmICggdmVydGV4VXZzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHR0aGlzLnV2czIucHVzaCggdmVydGV4VXZzWyAwIF0sIHZlcnRleFV2c1sgMSBdLCB2ZXJ0ZXhVdnNbIDIgXSApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5EaXJlY3RHZW9tZXRyeS5mcm9tR2VvbWV0cnkoKTogVW5kZWZpbmVkIHZlcnRleFV2MiAnLCBpICk7XG5cblx0XHRcdFx0XHR0aGlzLnV2czIucHVzaCggbmV3IFZlY3RvcjIoKSwgbmV3IFZlY3RvcjIoKSwgbmV3IFZlY3RvcjIoKSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBtb3JwaHNcblxuXHRcdFx0Zm9yICggdmFyIGogPSAwOyBqIDwgbW9ycGhUYXJnZXRzTGVuZ3RoOyBqICsrICkge1xuXG5cdFx0XHRcdHZhciBtb3JwaFRhcmdldCA9IG1vcnBoVGFyZ2V0c1sgaiBdLnZlcnRpY2VzO1xuXG5cdFx0XHRcdG1vcnBoVGFyZ2V0c1Bvc2l0aW9uWyBqIF0ucHVzaCggbW9ycGhUYXJnZXRbIGZhY2UuYSBdLCBtb3JwaFRhcmdldFsgZmFjZS5iIF0sIG1vcnBoVGFyZ2V0WyBmYWNlLmMgXSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGZvciAoIHZhciBqID0gMDsgaiA8IG1vcnBoTm9ybWFsc0xlbmd0aDsgaiArKyApIHtcblxuXHRcdFx0XHR2YXIgbW9ycGhOb3JtYWwgPSBtb3JwaE5vcm1hbHNbIGogXS52ZXJ0ZXhOb3JtYWxzWyBpIF07XG5cblx0XHRcdFx0bW9ycGhUYXJnZXRzTm9ybWFsWyBqIF0ucHVzaCggbW9ycGhOb3JtYWwuYSwgbW9ycGhOb3JtYWwuYiwgbW9ycGhOb3JtYWwuYyApO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIHNraW5zXG5cblx0XHRcdGlmICggaGFzU2tpbkluZGljZXMgKSB7XG5cblx0XHRcdFx0dGhpcy5za2luSW5kaWNlcy5wdXNoKCBza2luSW5kaWNlc1sgZmFjZS5hIF0sIHNraW5JbmRpY2VzWyBmYWNlLmIgXSwgc2tpbkluZGljZXNbIGZhY2UuYyBdICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBoYXNTa2luV2VpZ2h0cyApIHtcblxuXHRcdFx0XHR0aGlzLnNraW5XZWlnaHRzLnB1c2goIHNraW5XZWlnaHRzWyBmYWNlLmEgXSwgc2tpbldlaWdodHNbIGZhY2UuYiBdLCBza2luV2VpZ2h0c1sgZmFjZS5jIF0gKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0dGhpcy5jb21wdXRlR3JvdXBzKCBnZW9tZXRyeSApO1xuXG5cdFx0dGhpcy52ZXJ0aWNlc05lZWRVcGRhdGUgPSBnZW9tZXRyeS52ZXJ0aWNlc05lZWRVcGRhdGU7XG5cdFx0dGhpcy5ub3JtYWxzTmVlZFVwZGF0ZSA9IGdlb21ldHJ5Lm5vcm1hbHNOZWVkVXBkYXRlO1xuXHRcdHRoaXMuY29sb3JzTmVlZFVwZGF0ZSA9IGdlb21ldHJ5LmNvbG9yc05lZWRVcGRhdGU7XG5cdFx0dGhpcy51dnNOZWVkVXBkYXRlID0gZ2VvbWV0cnkudXZzTmVlZFVwZGF0ZTtcblx0XHR0aGlzLmdyb3Vwc05lZWRVcGRhdGUgPSBnZW9tZXRyeS5ncm91cHNOZWVkVXBkYXRlO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBhcnJheU1heCggYXJyYXkgKSB7XG5cblx0aWYgKCBhcnJheS5sZW5ndGggPT09IDAgKSByZXR1cm4gLSBJbmZpbml0eTtcblxuXHR2YXIgbWF4ID0gYXJyYXlbIDAgXTtcblxuXHRmb3IgKCB2YXIgaSA9IDEsIGwgPSBhcnJheS5sZW5ndGg7IGkgPCBsOyArKyBpICkge1xuXG5cdFx0aWYgKCBhcnJheVsgaSBdID4gbWF4ICkgbWF4ID0gYXJyYXlbIGkgXTtcblxuXHR9XG5cblx0cmV0dXJuIG1heDtcblxufVxuXG4vKipcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbnZhciBidWZmZXJHZW9tZXRyeUlkID0gMTsgLy8gQnVmZmVyR2VvbWV0cnkgdXNlcyBvZGQgbnVtYmVycyBhcyBJZFxuXG5mdW5jdGlvbiBCdWZmZXJHZW9tZXRyeSgpIHtcblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoIHRoaXMsICdpZCcsIHsgdmFsdWU6IGJ1ZmZlckdlb21ldHJ5SWQgKz0gMiB9ICk7XG5cblx0dGhpcy51dWlkID0gX01hdGguZ2VuZXJhdGVVVUlEKCk7XG5cblx0dGhpcy5uYW1lID0gJyc7XG5cdHRoaXMudHlwZSA9ICdCdWZmZXJHZW9tZXRyeSc7XG5cblx0dGhpcy5pbmRleCA9IG51bGw7XG5cdHRoaXMuYXR0cmlidXRlcyA9IHt9O1xuXG5cdHRoaXMubW9ycGhBdHRyaWJ1dGVzID0ge307XG5cblx0dGhpcy5ncm91cHMgPSBbXTtcblxuXHR0aGlzLmJvdW5kaW5nQm94ID0gbnVsbDtcblx0dGhpcy5ib3VuZGluZ1NwaGVyZSA9IG51bGw7XG5cblx0dGhpcy5kcmF3UmFuZ2UgPSB7IHN0YXJ0OiAwLCBjb3VudDogSW5maW5pdHkgfTtcblxufVxuXG5CdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBFdmVudERpc3BhdGNoZXIucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogQnVmZmVyR2VvbWV0cnksXG5cblx0aXNCdWZmZXJHZW9tZXRyeTogdHJ1ZSxcblxuXHRnZXRJbmRleDogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuaW5kZXg7XG5cblx0fSxcblxuXHRzZXRJbmRleDogZnVuY3Rpb24gKCBpbmRleCApIHtcblxuXHRcdGlmICggQXJyYXkuaXNBcnJheSggaW5kZXggKSApIHtcblxuXHRcdFx0dGhpcy5pbmRleCA9IG5ldyAoIGFycmF5TWF4KCBpbmRleCApID4gNjU1MzUgPyBVaW50MzJCdWZmZXJBdHRyaWJ1dGUgOiBVaW50MTZCdWZmZXJBdHRyaWJ1dGUgKSggaW5kZXgsIDEgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHRoaXMuaW5kZXggPSBpbmRleDtcblxuXHRcdH1cblxuXHR9LFxuXG5cdGFkZEF0dHJpYnV0ZTogZnVuY3Rpb24gKCBuYW1lLCBhdHRyaWJ1dGUgKSB7XG5cblx0XHRpZiAoICEgKCBhdHRyaWJ1dGUgJiYgYXR0cmlidXRlLmlzQnVmZmVyQXR0cmlidXRlICkgJiYgISAoIGF0dHJpYnV0ZSAmJiBhdHRyaWJ1dGUuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSApICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmFkZEF0dHJpYnV0ZSgpIG5vdyBleHBlY3RzICggbmFtZSwgYXR0cmlidXRlICkuJyApO1xuXG5cdFx0XHR0aGlzLmFkZEF0dHJpYnV0ZSggbmFtZSwgbmV3IEJ1ZmZlckF0dHJpYnV0ZSggYXJndW1lbnRzWyAxIF0sIGFyZ3VtZW50c1sgMiBdICkgKTtcblxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBuYW1lID09PSAnaW5kZXgnICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJHZW9tZXRyeS5hZGRBdHRyaWJ1dGU6IFVzZSAuc2V0SW5kZXgoKSBmb3IgaW5kZXggYXR0cmlidXRlLicgKTtcblx0XHRcdHRoaXMuc2V0SW5kZXgoIGF0dHJpYnV0ZSApO1xuXG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHR0aGlzLmF0dHJpYnV0ZXNbIG5hbWUgXSA9IGF0dHJpYnV0ZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Z2V0QXR0cmlidXRlOiBmdW5jdGlvbiAoIG5hbWUgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5hdHRyaWJ1dGVzWyBuYW1lIF07XG5cblx0fSxcblxuXHRyZW1vdmVBdHRyaWJ1dGU6IGZ1bmN0aW9uICggbmFtZSApIHtcblxuXHRcdGRlbGV0ZSB0aGlzLmF0dHJpYnV0ZXNbIG5hbWUgXTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YWRkR3JvdXA6IGZ1bmN0aW9uICggc3RhcnQsIGNvdW50LCBtYXRlcmlhbEluZGV4ICkge1xuXG5cdFx0dGhpcy5ncm91cHMucHVzaCgge1xuXG5cdFx0XHRzdGFydDogc3RhcnQsXG5cdFx0XHRjb3VudDogY291bnQsXG5cdFx0XHRtYXRlcmlhbEluZGV4OiBtYXRlcmlhbEluZGV4ICE9PSB1bmRlZmluZWQgPyBtYXRlcmlhbEluZGV4IDogMFxuXG5cdFx0fSApO1xuXG5cdH0sXG5cblx0Y2xlYXJHcm91cHM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuZ3JvdXBzID0gW107XG5cblx0fSxcblxuXHRzZXREcmF3UmFuZ2U6IGZ1bmN0aW9uICggc3RhcnQsIGNvdW50ICkge1xuXG5cdFx0dGhpcy5kcmF3UmFuZ2Uuc3RhcnQgPSBzdGFydDtcblx0XHR0aGlzLmRyYXdSYW5nZS5jb3VudCA9IGNvdW50O1xuXG5cdH0sXG5cblx0YXBwbHlNYXRyaXg6IGZ1bmN0aW9uICggbWF0cml4ICkge1xuXG5cdFx0dmFyIHBvc2l0aW9uID0gdGhpcy5hdHRyaWJ1dGVzLnBvc2l0aW9uO1xuXG5cdFx0aWYgKCBwb3NpdGlvbiAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRtYXRyaXguYXBwbHlUb0J1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb24gKTtcblx0XHRcdHBvc2l0aW9uLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdH1cblxuXHRcdHZhciBub3JtYWwgPSB0aGlzLmF0dHJpYnV0ZXMubm9ybWFsO1xuXG5cdFx0aWYgKCBub3JtYWwgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dmFyIG5vcm1hbE1hdHJpeCA9IG5ldyBNYXRyaXgzKCkuZ2V0Tm9ybWFsTWF0cml4KCBtYXRyaXggKTtcblxuXHRcdFx0bm9ybWFsTWF0cml4LmFwcGx5VG9CdWZmZXJBdHRyaWJ1dGUoIG5vcm1hbCApO1xuXHRcdFx0bm9ybWFsLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5ib3VuZGluZ0JveCAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5jb21wdXRlQm91bmRpbmdCb3goKTtcblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5ib3VuZGluZ1NwaGVyZSAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0cm90YXRlWDogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gcm90YXRlIGdlb21ldHJ5IGFyb3VuZCB3b3JsZCB4LWF4aXNcblxuXHRcdHZhciBtMSA9IG5ldyBNYXRyaXg0KCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gcm90YXRlWCggYW5nbGUgKSB7XG5cblx0XHRcdG0xLm1ha2VSb3RhdGlvblgoIGFuZ2xlICk7XG5cblx0XHRcdHRoaXMuYXBwbHlNYXRyaXgoIG0xICk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0cm90YXRlWTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gcm90YXRlIGdlb21ldHJ5IGFyb3VuZCB3b3JsZCB5LWF4aXNcblxuXHRcdHZhciBtMSA9IG5ldyBNYXRyaXg0KCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gcm90YXRlWSggYW5nbGUgKSB7XG5cblx0XHRcdG0xLm1ha2VSb3RhdGlvblkoIGFuZ2xlICk7XG5cblx0XHRcdHRoaXMuYXBwbHlNYXRyaXgoIG0xICk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0cm90YXRlWjogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gcm90YXRlIGdlb21ldHJ5IGFyb3VuZCB3b3JsZCB6LWF4aXNcblxuXHRcdHZhciBtMSA9IG5ldyBNYXRyaXg0KCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gcm90YXRlWiggYW5nbGUgKSB7XG5cblx0XHRcdG0xLm1ha2VSb3RhdGlvblooIGFuZ2xlICk7XG5cblx0XHRcdHRoaXMuYXBwbHlNYXRyaXgoIG0xICk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0dHJhbnNsYXRlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyB0cmFuc2xhdGUgZ2VvbWV0cnlcblxuXHRcdHZhciBtMSA9IG5ldyBNYXRyaXg0KCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gdHJhbnNsYXRlKCB4LCB5LCB6ICkge1xuXG5cdFx0XHRtMS5tYWtlVHJhbnNsYXRpb24oIHgsIHksIHogKTtcblxuXHRcdFx0dGhpcy5hcHBseU1hdHJpeCggbTEgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRzY2FsZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gc2NhbGUgZ2VvbWV0cnlcblxuXHRcdHZhciBtMSA9IG5ldyBNYXRyaXg0KCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gc2NhbGUoIHgsIHksIHogKSB7XG5cblx0XHRcdG0xLm1ha2VTY2FsZSggeCwgeSwgeiApO1xuXG5cdFx0XHR0aGlzLmFwcGx5TWF0cml4KCBtMSApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGxvb2tBdDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIG9iaiA9IG5ldyBPYmplY3QzRCgpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGxvb2tBdCggdmVjdG9yICkge1xuXG5cdFx0XHRvYmoubG9va0F0KCB2ZWN0b3IgKTtcblxuXHRcdFx0b2JqLnVwZGF0ZU1hdHJpeCgpO1xuXG5cdFx0XHR0aGlzLmFwcGx5TWF0cml4KCBvYmoubWF0cml4ICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRjZW50ZXI6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBvZmZzZXQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGNlbnRlcigpIHtcblxuXHRcdFx0dGhpcy5jb21wdXRlQm91bmRpbmdCb3goKTtcblxuXHRcdFx0dGhpcy5ib3VuZGluZ0JveC5nZXRDZW50ZXIoIG9mZnNldCApLm5lZ2F0ZSgpO1xuXG5cdFx0XHR0aGlzLnRyYW5zbGF0ZSggb2Zmc2V0LngsIG9mZnNldC55LCBvZmZzZXQueiApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHNldEZyb21PYmplY3Q6IGZ1bmN0aW9uICggb2JqZWN0ICkge1xuXG5cdFx0Ly8gY29uc29sZS5sb2coICdUSFJFRS5CdWZmZXJHZW9tZXRyeS5zZXRGcm9tT2JqZWN0KCkuIENvbnZlcnRpbmcnLCBvYmplY3QsIHRoaXMgKTtcblxuXHRcdHZhciBnZW9tZXRyeSA9IG9iamVjdC5nZW9tZXRyeTtcblxuXHRcdGlmICggb2JqZWN0LmlzUG9pbnRzIHx8IG9iamVjdC5pc0xpbmUgKSB7XG5cblx0XHRcdHZhciBwb3NpdGlvbnMgPSBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggZ2VvbWV0cnkudmVydGljZXMubGVuZ3RoICogMywgMyApO1xuXHRcdFx0dmFyIGNvbG9ycyA9IG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBnZW9tZXRyeS5jb2xvcnMubGVuZ3RoICogMywgMyApO1xuXG5cdFx0XHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgcG9zaXRpb25zLmNvcHlWZWN0b3Izc0FycmF5KCBnZW9tZXRyeS52ZXJ0aWNlcyApICk7XG5cdFx0XHR0aGlzLmFkZEF0dHJpYnV0ZSggJ2NvbG9yJywgY29sb3JzLmNvcHlDb2xvcnNBcnJheSggZ2VvbWV0cnkuY29sb3JzICkgKTtcblxuXHRcdFx0aWYgKCBnZW9tZXRyeS5saW5lRGlzdGFuY2VzICYmIGdlb21ldHJ5LmxpbmVEaXN0YW5jZXMubGVuZ3RoID09PSBnZW9tZXRyeS52ZXJ0aWNlcy5sZW5ndGggKSB7XG5cblx0XHRcdFx0dmFyIGxpbmVEaXN0YW5jZXMgPSBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggZ2VvbWV0cnkubGluZURpc3RhbmNlcy5sZW5ndGgsIDEgKTtcblxuXHRcdFx0XHR0aGlzLmFkZEF0dHJpYnV0ZSggJ2xpbmVEaXN0YW5jZScsIGxpbmVEaXN0YW5jZXMuY29weUFycmF5KCBnZW9tZXRyeS5saW5lRGlzdGFuY2VzICkgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlICE9PSBudWxsICkge1xuXG5cdFx0XHRcdHRoaXMuYm91bmRpbmdTcGhlcmUgPSBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZS5jbG9uZSgpO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggZ2VvbWV0cnkuYm91bmRpbmdCb3ggIT09IG51bGwgKSB7XG5cblx0XHRcdFx0dGhpcy5ib3VuZGluZ0JveCA9IGdlb21ldHJ5LmJvdW5kaW5nQm94LmNsb25lKCk7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSBpZiAoIG9iamVjdC5pc01lc2ggKSB7XG5cblx0XHRcdGlmICggZ2VvbWV0cnkgJiYgZ2VvbWV0cnkuaXNHZW9tZXRyeSApIHtcblxuXHRcdFx0XHR0aGlzLmZyb21HZW9tZXRyeSggZ2VvbWV0cnkgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRGcm9tUG9pbnRzOiBmdW5jdGlvbiAoIHBvaW50cyApIHtcblxuXHRcdHZhciBwb3NpdGlvbiA9IFtdO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gcG9pbnRzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBwb2ludCA9IHBvaW50c1sgaSBdO1xuXHRcdFx0cG9zaXRpb24ucHVzaCggcG9pbnQueCwgcG9pbnQueSwgcG9pbnQueiB8fCAwICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uLCAzICkgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dXBkYXRlRnJvbU9iamVjdDogZnVuY3Rpb24gKCBvYmplY3QgKSB7XG5cblx0XHR2YXIgZ2VvbWV0cnkgPSBvYmplY3QuZ2VvbWV0cnk7XG5cblx0XHRpZiAoIG9iamVjdC5pc01lc2ggKSB7XG5cblx0XHRcdHZhciBkaXJlY3QgPSBnZW9tZXRyeS5fX2RpcmVjdEdlb21ldHJ5O1xuXG5cdFx0XHRpZiAoIGdlb21ldHJ5LmVsZW1lbnRzTmVlZFVwZGF0ZSA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0XHRkaXJlY3QgPSB1bmRlZmluZWQ7XG5cdFx0XHRcdGdlb21ldHJ5LmVsZW1lbnRzTmVlZFVwZGF0ZSA9IGZhbHNlO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggZGlyZWN0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0cmV0dXJuIHRoaXMuZnJvbUdlb21ldHJ5KCBnZW9tZXRyeSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGRpcmVjdC52ZXJ0aWNlc05lZWRVcGRhdGUgPSBnZW9tZXRyeS52ZXJ0aWNlc05lZWRVcGRhdGU7XG5cdFx0XHRkaXJlY3Qubm9ybWFsc05lZWRVcGRhdGUgPSBnZW9tZXRyeS5ub3JtYWxzTmVlZFVwZGF0ZTtcblx0XHRcdGRpcmVjdC5jb2xvcnNOZWVkVXBkYXRlID0gZ2VvbWV0cnkuY29sb3JzTmVlZFVwZGF0ZTtcblx0XHRcdGRpcmVjdC51dnNOZWVkVXBkYXRlID0gZ2VvbWV0cnkudXZzTmVlZFVwZGF0ZTtcblx0XHRcdGRpcmVjdC5ncm91cHNOZWVkVXBkYXRlID0gZ2VvbWV0cnkuZ3JvdXBzTmVlZFVwZGF0ZTtcblxuXHRcdFx0Z2VvbWV0cnkudmVydGljZXNOZWVkVXBkYXRlID0gZmFsc2U7XG5cdFx0XHRnZW9tZXRyeS5ub3JtYWxzTmVlZFVwZGF0ZSA9IGZhbHNlO1xuXHRcdFx0Z2VvbWV0cnkuY29sb3JzTmVlZFVwZGF0ZSA9IGZhbHNlO1xuXHRcdFx0Z2VvbWV0cnkudXZzTmVlZFVwZGF0ZSA9IGZhbHNlO1xuXHRcdFx0Z2VvbWV0cnkuZ3JvdXBzTmVlZFVwZGF0ZSA9IGZhbHNlO1xuXG5cdFx0XHRnZW9tZXRyeSA9IGRpcmVjdDtcblxuXHRcdH1cblxuXHRcdHZhciBhdHRyaWJ1dGU7XG5cblx0XHRpZiAoIGdlb21ldHJ5LnZlcnRpY2VzTmVlZFVwZGF0ZSA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0YXR0cmlidXRlID0gdGhpcy5hdHRyaWJ1dGVzLnBvc2l0aW9uO1xuXG5cdFx0XHRpZiAoIGF0dHJpYnV0ZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGF0dHJpYnV0ZS5jb3B5VmVjdG9yM3NBcnJheSggZ2VvbWV0cnkudmVydGljZXMgKTtcblx0XHRcdFx0YXR0cmlidXRlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0fVxuXG5cdFx0XHRnZW9tZXRyeS52ZXJ0aWNlc05lZWRVcGRhdGUgPSBmYWxzZTtcblxuXHRcdH1cblxuXHRcdGlmICggZ2VvbWV0cnkubm9ybWFsc05lZWRVcGRhdGUgPT09IHRydWUgKSB7XG5cblx0XHRcdGF0dHJpYnV0ZSA9IHRoaXMuYXR0cmlidXRlcy5ub3JtYWw7XG5cblx0XHRcdGlmICggYXR0cmlidXRlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0YXR0cmlidXRlLmNvcHlWZWN0b3Izc0FycmF5KCBnZW9tZXRyeS5ub3JtYWxzICk7XG5cdFx0XHRcdGF0dHJpYnV0ZS5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdH1cblxuXHRcdFx0Z2VvbWV0cnkubm9ybWFsc05lZWRVcGRhdGUgPSBmYWxzZTtcblxuXHRcdH1cblxuXHRcdGlmICggZ2VvbWV0cnkuY29sb3JzTmVlZFVwZGF0ZSA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0YXR0cmlidXRlID0gdGhpcy5hdHRyaWJ1dGVzLmNvbG9yO1xuXG5cdFx0XHRpZiAoIGF0dHJpYnV0ZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGF0dHJpYnV0ZS5jb3B5Q29sb3JzQXJyYXkoIGdlb21ldHJ5LmNvbG9ycyApO1xuXHRcdFx0XHRhdHRyaWJ1dGUubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHR9XG5cblx0XHRcdGdlb21ldHJ5LmNvbG9yc05lZWRVcGRhdGUgPSBmYWxzZTtcblxuXHRcdH1cblxuXHRcdGlmICggZ2VvbWV0cnkudXZzTmVlZFVwZGF0ZSApIHtcblxuXHRcdFx0YXR0cmlidXRlID0gdGhpcy5hdHRyaWJ1dGVzLnV2O1xuXG5cdFx0XHRpZiAoIGF0dHJpYnV0ZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGF0dHJpYnV0ZS5jb3B5VmVjdG9yMnNBcnJheSggZ2VvbWV0cnkudXZzICk7XG5cdFx0XHRcdGF0dHJpYnV0ZS5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdH1cblxuXHRcdFx0Z2VvbWV0cnkudXZzTmVlZFVwZGF0ZSA9IGZhbHNlO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBnZW9tZXRyeS5saW5lRGlzdGFuY2VzTmVlZFVwZGF0ZSApIHtcblxuXHRcdFx0YXR0cmlidXRlID0gdGhpcy5hdHRyaWJ1dGVzLmxpbmVEaXN0YW5jZTtcblxuXHRcdFx0aWYgKCBhdHRyaWJ1dGUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRhdHRyaWJ1dGUuY29weUFycmF5KCBnZW9tZXRyeS5saW5lRGlzdGFuY2VzICk7XG5cdFx0XHRcdGF0dHJpYnV0ZS5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdH1cblxuXHRcdFx0Z2VvbWV0cnkubGluZURpc3RhbmNlc05lZWRVcGRhdGUgPSBmYWxzZTtcblxuXHRcdH1cblxuXHRcdGlmICggZ2VvbWV0cnkuZ3JvdXBzTmVlZFVwZGF0ZSApIHtcblxuXHRcdFx0Z2VvbWV0cnkuY29tcHV0ZUdyb3Vwcyggb2JqZWN0Lmdlb21ldHJ5ICk7XG5cdFx0XHR0aGlzLmdyb3VwcyA9IGdlb21ldHJ5Lmdyb3VwcztcblxuXHRcdFx0Z2VvbWV0cnkuZ3JvdXBzTmVlZFVwZGF0ZSA9IGZhbHNlO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRmcm9tR2VvbWV0cnk6IGZ1bmN0aW9uICggZ2VvbWV0cnkgKSB7XG5cblx0XHRnZW9tZXRyeS5fX2RpcmVjdEdlb21ldHJ5ID0gbmV3IERpcmVjdEdlb21ldHJ5KCkuZnJvbUdlb21ldHJ5KCBnZW9tZXRyeSApO1xuXG5cdFx0cmV0dXJuIHRoaXMuZnJvbURpcmVjdEdlb21ldHJ5KCBnZW9tZXRyeS5fX2RpcmVjdEdlb21ldHJ5ICk7XG5cblx0fSxcblxuXHRmcm9tRGlyZWN0R2VvbWV0cnk6IGZ1bmN0aW9uICggZ2VvbWV0cnkgKSB7XG5cblx0XHR2YXIgcG9zaXRpb25zID0gbmV3IEZsb2F0MzJBcnJheSggZ2VvbWV0cnkudmVydGljZXMubGVuZ3RoICogMyApO1xuXHRcdHRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbnMsIDMgKS5jb3B5VmVjdG9yM3NBcnJheSggZ2VvbWV0cnkudmVydGljZXMgKSApO1xuXG5cdFx0aWYgKCBnZW9tZXRyeS5ub3JtYWxzLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdHZhciBub3JtYWxzID0gbmV3IEZsb2F0MzJBcnJheSggZ2VvbWV0cnkubm9ybWFscy5sZW5ndGggKiAzICk7XG5cdFx0XHR0aGlzLmFkZEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBCdWZmZXJBdHRyaWJ1dGUoIG5vcm1hbHMsIDMgKS5jb3B5VmVjdG9yM3NBcnJheSggZ2VvbWV0cnkubm9ybWFscyApICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIGdlb21ldHJ5LmNvbG9ycy5sZW5ndGggPiAwICkge1xuXG5cdFx0XHR2YXIgY29sb3JzID0gbmV3IEZsb2F0MzJBcnJheSggZ2VvbWV0cnkuY29sb3JzLmxlbmd0aCAqIDMgKTtcblx0XHRcdHRoaXMuYWRkQXR0cmlidXRlKCAnY29sb3InLCBuZXcgQnVmZmVyQXR0cmlidXRlKCBjb2xvcnMsIDMgKS5jb3B5Q29sb3JzQXJyYXkoIGdlb21ldHJ5LmNvbG9ycyApICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIGdlb21ldHJ5LnV2cy5sZW5ndGggPiAwICkge1xuXG5cdFx0XHR2YXIgdXZzID0gbmV3IEZsb2F0MzJBcnJheSggZ2VvbWV0cnkudXZzLmxlbmd0aCAqIDIgKTtcblx0XHRcdHRoaXMuYWRkQXR0cmlidXRlKCAndXYnLCBuZXcgQnVmZmVyQXR0cmlidXRlKCB1dnMsIDIgKS5jb3B5VmVjdG9yMnNBcnJheSggZ2VvbWV0cnkudXZzICkgKTtcblxuXHRcdH1cblxuXHRcdGlmICggZ2VvbWV0cnkudXZzMi5sZW5ndGggPiAwICkge1xuXG5cdFx0XHR2YXIgdXZzMiA9IG5ldyBGbG9hdDMyQXJyYXkoIGdlb21ldHJ5LnV2czIubGVuZ3RoICogMiApO1xuXHRcdFx0dGhpcy5hZGRBdHRyaWJ1dGUoICd1djInLCBuZXcgQnVmZmVyQXR0cmlidXRlKCB1dnMyLCAyICkuY29weVZlY3RvcjJzQXJyYXkoIGdlb21ldHJ5LnV2czIgKSApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gZ3JvdXBzXG5cblx0XHR0aGlzLmdyb3VwcyA9IGdlb21ldHJ5Lmdyb3VwcztcblxuXHRcdC8vIG1vcnBoc1xuXG5cdFx0Zm9yICggdmFyIG5hbWUgaW4gZ2VvbWV0cnkubW9ycGhUYXJnZXRzICkge1xuXG5cdFx0XHR2YXIgYXJyYXkgPSBbXTtcblx0XHRcdHZhciBtb3JwaFRhcmdldHMgPSBnZW9tZXRyeS5tb3JwaFRhcmdldHNbIG5hbWUgXTtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gbW9ycGhUYXJnZXRzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0dmFyIG1vcnBoVGFyZ2V0ID0gbW9ycGhUYXJnZXRzWyBpIF07XG5cblx0XHRcdFx0dmFyIGF0dHJpYnV0ZSA9IG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBtb3JwaFRhcmdldC5sZW5ndGggKiAzLCAzICk7XG5cblx0XHRcdFx0YXJyYXkucHVzaCggYXR0cmlidXRlLmNvcHlWZWN0b3Izc0FycmF5KCBtb3JwaFRhcmdldCApICk7XG5cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5tb3JwaEF0dHJpYnV0ZXNbIG5hbWUgXSA9IGFycmF5O1xuXG5cdFx0fVxuXG5cdFx0Ly8gc2tpbm5pbmdcblxuXHRcdGlmICggZ2VvbWV0cnkuc2tpbkluZGljZXMubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0dmFyIHNraW5JbmRpY2VzID0gbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIGdlb21ldHJ5LnNraW5JbmRpY2VzLmxlbmd0aCAqIDQsIDQgKTtcblx0XHRcdHRoaXMuYWRkQXR0cmlidXRlKCAnc2tpbkluZGV4Jywgc2tpbkluZGljZXMuY29weVZlY3RvcjRzQXJyYXkoIGdlb21ldHJ5LnNraW5JbmRpY2VzICkgKTtcblxuXHRcdH1cblxuXHRcdGlmICggZ2VvbWV0cnkuc2tpbldlaWdodHMubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0dmFyIHNraW5XZWlnaHRzID0gbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIGdlb21ldHJ5LnNraW5XZWlnaHRzLmxlbmd0aCAqIDQsIDQgKTtcblx0XHRcdHRoaXMuYWRkQXR0cmlidXRlKCAnc2tpbldlaWdodCcsIHNraW5XZWlnaHRzLmNvcHlWZWN0b3I0c0FycmF5KCBnZW9tZXRyeS5za2luV2VpZ2h0cyApICk7XG5cblx0XHR9XG5cblx0XHQvL1xuXG5cdFx0aWYgKCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5ib3VuZGluZ1NwaGVyZSA9IGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlLmNsb25lKCk7XG5cblx0XHR9XG5cblx0XHRpZiAoIGdlb21ldHJ5LmJvdW5kaW5nQm94ICE9PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLmJvdW5kaW5nQm94ID0gZ2VvbWV0cnkuYm91bmRpbmdCb3guY2xvbmUoKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y29tcHV0ZUJvdW5kaW5nQm94OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRpZiAoIHRoaXMuYm91bmRpbmdCb3ggPT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuYm91bmRpbmdCb3ggPSBuZXcgQm94MygpO1xuXG5cdFx0fVxuXG5cdFx0dmFyIHBvc2l0aW9uID0gdGhpcy5hdHRyaWJ1dGVzLnBvc2l0aW9uO1xuXG5cdFx0aWYgKCBwb3NpdGlvbiAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR0aGlzLmJvdW5kaW5nQm94LnNldEZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR0aGlzLmJvdW5kaW5nQm94Lm1ha2VFbXB0eSgpO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBpc05hTiggdGhpcy5ib3VuZGluZ0JveC5taW4ueCApIHx8IGlzTmFOKCB0aGlzLmJvdW5kaW5nQm94Lm1pbi55ICkgfHwgaXNOYU4oIHRoaXMuYm91bmRpbmdCb3gubWluLnogKSApIHtcblxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ0JveDogQ29tcHV0ZWQgbWluL21heCBoYXZlIE5hTiB2YWx1ZXMuIFRoZSBcInBvc2l0aW9uXCIgYXR0cmlidXRlIGlzIGxpa2VseSB0byBoYXZlIE5hTiB2YWx1ZXMuJywgdGhpcyApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0Y29tcHV0ZUJvdW5kaW5nU3BoZXJlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgYm94ID0gbmV3IEJveDMoKTtcblx0XHR2YXIgdmVjdG9yID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBjb21wdXRlQm91bmRpbmdTcGhlcmUoKSB7XG5cblx0XHRcdGlmICggdGhpcy5ib3VuZGluZ1NwaGVyZSA9PT0gbnVsbCApIHtcblxuXHRcdFx0XHR0aGlzLmJvdW5kaW5nU3BoZXJlID0gbmV3IFNwaGVyZSgpO1xuXG5cdFx0XHR9XG5cblx0XHRcdHZhciBwb3NpdGlvbiA9IHRoaXMuYXR0cmlidXRlcy5wb3NpdGlvbjtcblxuXHRcdFx0aWYgKCBwb3NpdGlvbiApIHtcblxuXHRcdFx0XHR2YXIgY2VudGVyID0gdGhpcy5ib3VuZGluZ1NwaGVyZS5jZW50ZXI7XG5cblx0XHRcdFx0Ym94LnNldEZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uICk7XG5cdFx0XHRcdGJveC5nZXRDZW50ZXIoIGNlbnRlciApO1xuXG5cdFx0XHRcdC8vIGhvcGluZyB0byBmaW5kIGEgYm91bmRpbmdTcGhlcmUgd2l0aCBhIHJhZGl1cyBzbWFsbGVyIHRoYW4gdGhlXG5cdFx0XHRcdC8vIGJvdW5kaW5nU3BoZXJlIG9mIHRoZSBib3VuZGluZ0JveDogc3FydCgzKSBzbWFsbGVyIGluIHRoZSBiZXN0IGNhc2VcblxuXHRcdFx0XHR2YXIgbWF4UmFkaXVzU3EgPSAwO1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBwb3NpdGlvbi5jb3VudDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0dmVjdG9yLnggPSBwb3NpdGlvbi5nZXRYKCBpICk7XG5cdFx0XHRcdFx0dmVjdG9yLnkgPSBwb3NpdGlvbi5nZXRZKCBpICk7XG5cdFx0XHRcdFx0dmVjdG9yLnogPSBwb3NpdGlvbi5nZXRaKCBpICk7XG5cdFx0XHRcdFx0bWF4UmFkaXVzU3EgPSBNYXRoLm1heCggbWF4UmFkaXVzU3EsIGNlbnRlci5kaXN0YW5jZVRvU3F1YXJlZCggdmVjdG9yICkgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGhpcy5ib3VuZGluZ1NwaGVyZS5yYWRpdXMgPSBNYXRoLnNxcnQoIG1heFJhZGl1c1NxICk7XG5cblx0XHRcdFx0aWYgKCBpc05hTiggdGhpcy5ib3VuZGluZ1NwaGVyZS5yYWRpdXMgKSApIHtcblxuXHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5CdWZmZXJHZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTogQ29tcHV0ZWQgcmFkaXVzIGlzIE5hTi4gVGhlIFwicG9zaXRpb25cIiBhdHRyaWJ1dGUgaXMgbGlrZWx5IHRvIGhhdmUgTmFOIHZhbHVlcy4nLCB0aGlzICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRjb21wdXRlRmFjZU5vcm1hbHM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG5cblx0fSxcblxuXHRjb21wdXRlVmVydGV4Tm9ybWFsczogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGluZGV4ID0gdGhpcy5pbmRleDtcblx0XHR2YXIgYXR0cmlidXRlcyA9IHRoaXMuYXR0cmlidXRlcztcblx0XHR2YXIgZ3JvdXBzID0gdGhpcy5ncm91cHM7XG5cblx0XHRpZiAoIGF0dHJpYnV0ZXMucG9zaXRpb24gKSB7XG5cblx0XHRcdHZhciBwb3NpdGlvbnMgPSBhdHRyaWJ1dGVzLnBvc2l0aW9uLmFycmF5O1xuXG5cdFx0XHRpZiAoIGF0dHJpYnV0ZXMubm9ybWFsID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0dGhpcy5hZGRBdHRyaWJ1dGUoICdub3JtYWwnLCBuZXcgQnVmZmVyQXR0cmlidXRlKCBuZXcgRmxvYXQzMkFycmF5KCBwb3NpdGlvbnMubGVuZ3RoICksIDMgKSApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdC8vIHJlc2V0IGV4aXN0aW5nIG5vcm1hbHMgdG8gemVyb1xuXG5cdFx0XHRcdHZhciBhcnJheSA9IGF0dHJpYnV0ZXMubm9ybWFsLmFycmF5O1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBhcnJheS5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdGFycmF5WyBpIF0gPSAwO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgbm9ybWFscyA9IGF0dHJpYnV0ZXMubm9ybWFsLmFycmF5O1xuXG5cdFx0XHR2YXIgdkEsIHZCLCB2Qztcblx0XHRcdHZhciBwQSA9IG5ldyBWZWN0b3IzKCksIHBCID0gbmV3IFZlY3RvcjMoKSwgcEMgPSBuZXcgVmVjdG9yMygpO1xuXHRcdFx0dmFyIGNiID0gbmV3IFZlY3RvcjMoKSwgYWIgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0XHQvLyBpbmRleGVkIGVsZW1lbnRzXG5cblx0XHRcdGlmICggaW5kZXggKSB7XG5cblx0XHRcdFx0dmFyIGluZGljZXMgPSBpbmRleC5hcnJheTtcblxuXHRcdFx0XHRpZiAoIGdyb3Vwcy5sZW5ndGggPT09IDAgKSB7XG5cblx0XHRcdFx0XHR0aGlzLmFkZEdyb3VwKCAwLCBpbmRpY2VzLmxlbmd0aCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRmb3IgKCB2YXIgaiA9IDAsIGpsID0gZ3JvdXBzLmxlbmd0aDsgaiA8IGpsOyArKyBqICkge1xuXG5cdFx0XHRcdFx0dmFyIGdyb3VwID0gZ3JvdXBzWyBqIF07XG5cblx0XHRcdFx0XHR2YXIgc3RhcnQgPSBncm91cC5zdGFydDtcblx0XHRcdFx0XHR2YXIgY291bnQgPSBncm91cC5jb3VudDtcblxuXHRcdFx0XHRcdGZvciAoIHZhciBpID0gc3RhcnQsIGlsID0gc3RhcnQgKyBjb3VudDsgaSA8IGlsOyBpICs9IDMgKSB7XG5cblx0XHRcdFx0XHRcdHZBID0gaW5kaWNlc1sgaSArIDAgXSAqIDM7XG5cdFx0XHRcdFx0XHR2QiA9IGluZGljZXNbIGkgKyAxIF0gKiAzO1xuXHRcdFx0XHRcdFx0dkMgPSBpbmRpY2VzWyBpICsgMiBdICogMztcblxuXHRcdFx0XHRcdFx0cEEuZnJvbUFycmF5KCBwb3NpdGlvbnMsIHZBICk7XG5cdFx0XHRcdFx0XHRwQi5mcm9tQXJyYXkoIHBvc2l0aW9ucywgdkIgKTtcblx0XHRcdFx0XHRcdHBDLmZyb21BcnJheSggcG9zaXRpb25zLCB2QyApO1xuXG5cdFx0XHRcdFx0XHRjYi5zdWJWZWN0b3JzKCBwQywgcEIgKTtcblx0XHRcdFx0XHRcdGFiLnN1YlZlY3RvcnMoIHBBLCBwQiApO1xuXHRcdFx0XHRcdFx0Y2IuY3Jvc3MoIGFiICk7XG5cblx0XHRcdFx0XHRcdG5vcm1hbHNbIHZBIF0gKz0gY2IueDtcblx0XHRcdFx0XHRcdG5vcm1hbHNbIHZBICsgMSBdICs9IGNiLnk7XG5cdFx0XHRcdFx0XHRub3JtYWxzWyB2QSArIDIgXSArPSBjYi56O1xuXG5cdFx0XHRcdFx0XHRub3JtYWxzWyB2QiBdICs9IGNiLng7XG5cdFx0XHRcdFx0XHRub3JtYWxzWyB2QiArIDEgXSArPSBjYi55O1xuXHRcdFx0XHRcdFx0bm9ybWFsc1sgdkIgKyAyIF0gKz0gY2IuejtcblxuXHRcdFx0XHRcdFx0bm9ybWFsc1sgdkMgXSArPSBjYi54O1xuXHRcdFx0XHRcdFx0bm9ybWFsc1sgdkMgKyAxIF0gKz0gY2IueTtcblx0XHRcdFx0XHRcdG5vcm1hbHNbIHZDICsgMiBdICs9IGNiLno7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdC8vIG5vbi1pbmRleGVkIGVsZW1lbnRzICh1bmNvbm5lY3RlZCB0cmlhbmdsZSBzb3VwKVxuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBwb3NpdGlvbnMubGVuZ3RoOyBpIDwgaWw7IGkgKz0gOSApIHtcblxuXHRcdFx0XHRcdHBBLmZyb21BcnJheSggcG9zaXRpb25zLCBpICk7XG5cdFx0XHRcdFx0cEIuZnJvbUFycmF5KCBwb3NpdGlvbnMsIGkgKyAzICk7XG5cdFx0XHRcdFx0cEMuZnJvbUFycmF5KCBwb3NpdGlvbnMsIGkgKyA2ICk7XG5cblx0XHRcdFx0XHRjYi5zdWJWZWN0b3JzKCBwQywgcEIgKTtcblx0XHRcdFx0XHRhYi5zdWJWZWN0b3JzKCBwQSwgcEIgKTtcblx0XHRcdFx0XHRjYi5jcm9zcyggYWIgKTtcblxuXHRcdFx0XHRcdG5vcm1hbHNbIGkgXSA9IGNiLng7XG5cdFx0XHRcdFx0bm9ybWFsc1sgaSArIDEgXSA9IGNiLnk7XG5cdFx0XHRcdFx0bm9ybWFsc1sgaSArIDIgXSA9IGNiLno7XG5cblx0XHRcdFx0XHRub3JtYWxzWyBpICsgMyBdID0gY2IueDtcblx0XHRcdFx0XHRub3JtYWxzWyBpICsgNCBdID0gY2IueTtcblx0XHRcdFx0XHRub3JtYWxzWyBpICsgNSBdID0gY2IuejtcblxuXHRcdFx0XHRcdG5vcm1hbHNbIGkgKyA2IF0gPSBjYi54O1xuXHRcdFx0XHRcdG5vcm1hbHNbIGkgKyA3IF0gPSBjYi55O1xuXHRcdFx0XHRcdG5vcm1hbHNbIGkgKyA4IF0gPSBjYi56O1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLm5vcm1hbGl6ZU5vcm1hbHMoKTtcblxuXHRcdFx0YXR0cmlidXRlcy5ub3JtYWwubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0bWVyZ2U6IGZ1bmN0aW9uICggZ2VvbWV0cnksIG9mZnNldCApIHtcblxuXHRcdGlmICggISAoIGdlb21ldHJ5ICYmIGdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgKSApIHtcblxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5Lm1lcmdlKCk6IGdlb21ldHJ5IG5vdCBhbiBpbnN0YW5jZSBvZiBUSFJFRS5CdWZmZXJHZW9tZXRyeS4nLCBnZW9tZXRyeSApO1xuXHRcdFx0cmV0dXJuO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0b2Zmc2V0ID0gMDtcblxuXHRcdFx0Y29uc29sZS53YXJuKFxuXHRcdFx0XHQnVEhSRUUuQnVmZmVyR2VvbWV0cnkubWVyZ2UoKTogT3ZlcndyaXRpbmcgb3JpZ2luYWwgZ2VvbWV0cnksIHN0YXJ0aW5nIGF0IG9mZnNldD0wLiAnXG5cdFx0XHRcdCsgJ1VzZSBCdWZmZXJHZW9tZXRyeVV0aWxzLm1lcmdlQnVmZmVyR2VvbWV0cmllcygpIGZvciBsb3NzbGVzcyBtZXJnZS4nXG5cdFx0XHQpO1xuXG5cdFx0fVxuXG5cdFx0dmFyIGF0dHJpYnV0ZXMgPSB0aGlzLmF0dHJpYnV0ZXM7XG5cblx0XHRmb3IgKCB2YXIga2V5IGluIGF0dHJpYnV0ZXMgKSB7XG5cblx0XHRcdGlmICggZ2VvbWV0cnkuYXR0cmlidXRlc1sga2V5IF0gPT09IHVuZGVmaW5lZCApIGNvbnRpbnVlO1xuXG5cdFx0XHR2YXIgYXR0cmlidXRlMSA9IGF0dHJpYnV0ZXNbIGtleSBdO1xuXHRcdFx0dmFyIGF0dHJpYnV0ZUFycmF5MSA9IGF0dHJpYnV0ZTEuYXJyYXk7XG5cblx0XHRcdHZhciBhdHRyaWJ1dGUyID0gZ2VvbWV0cnkuYXR0cmlidXRlc1sga2V5IF07XG5cdFx0XHR2YXIgYXR0cmlidXRlQXJyYXkyID0gYXR0cmlidXRlMi5hcnJheTtcblxuXHRcdFx0dmFyIGF0dHJpYnV0ZVNpemUgPSBhdHRyaWJ1dGUyLml0ZW1TaXplO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGogPSBhdHRyaWJ1dGVTaXplICogb2Zmc2V0OyBpIDwgYXR0cmlidXRlQXJyYXkyLmxlbmd0aDsgaSArKywgaiArKyApIHtcblxuXHRcdFx0XHRhdHRyaWJ1dGVBcnJheTFbIGogXSA9IGF0dHJpYnV0ZUFycmF5MlsgaSBdO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG5vcm1hbGl6ZU5vcm1hbHM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2ZWN0b3IgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIG5vcm1hbGl6ZU5vcm1hbHMoKSB7XG5cblx0XHRcdHZhciBub3JtYWxzID0gdGhpcy5hdHRyaWJ1dGVzLm5vcm1hbDtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IG5vcm1hbHMuY291bnQ7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHR2ZWN0b3IueCA9IG5vcm1hbHMuZ2V0WCggaSApO1xuXHRcdFx0XHR2ZWN0b3IueSA9IG5vcm1hbHMuZ2V0WSggaSApO1xuXHRcdFx0XHR2ZWN0b3IueiA9IG5vcm1hbHMuZ2V0WiggaSApO1xuXG5cdFx0XHRcdHZlY3Rvci5ub3JtYWxpemUoKTtcblxuXHRcdFx0XHRub3JtYWxzLnNldFhZWiggaSwgdmVjdG9yLngsIHZlY3Rvci55LCB2ZWN0b3IueiApO1xuXG5cdFx0XHR9XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHR0b05vbkluZGV4ZWQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGlmICggdGhpcy5pbmRleCA9PT0gbnVsbCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnkudG9Ob25JbmRleGVkKCk6IEdlb21ldHJ5IGlzIGFscmVhZHkgbm9uLWluZGV4ZWQuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9XG5cblx0XHR2YXIgZ2VvbWV0cnkyID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cblx0XHR2YXIgaW5kaWNlcyA9IHRoaXMuaW5kZXguYXJyYXk7XG5cdFx0dmFyIGF0dHJpYnV0ZXMgPSB0aGlzLmF0dHJpYnV0ZXM7XG5cblx0XHRmb3IgKCB2YXIgbmFtZSBpbiBhdHRyaWJ1dGVzICkge1xuXG5cdFx0XHR2YXIgYXR0cmlidXRlID0gYXR0cmlidXRlc1sgbmFtZSBdO1xuXG5cdFx0XHR2YXIgYXJyYXkgPSBhdHRyaWJ1dGUuYXJyYXk7XG5cdFx0XHR2YXIgaXRlbVNpemUgPSBhdHRyaWJ1dGUuaXRlbVNpemU7XG5cblx0XHRcdHZhciBhcnJheTIgPSBuZXcgYXJyYXkuY29uc3RydWN0b3IoIGluZGljZXMubGVuZ3RoICogaXRlbVNpemUgKTtcblxuXHRcdFx0dmFyIGluZGV4ID0gMCwgaW5kZXgyID0gMDtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gaW5kaWNlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdGluZGV4ID0gaW5kaWNlc1sgaSBdICogaXRlbVNpemU7XG5cblx0XHRcdFx0Zm9yICggdmFyIGogPSAwOyBqIDwgaXRlbVNpemU7IGogKysgKSB7XG5cblx0XHRcdFx0XHRhcnJheTJbIGluZGV4MiArKyBdID0gYXJyYXlbIGluZGV4ICsrIF07XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdGdlb21ldHJ5Mi5hZGRBdHRyaWJ1dGUoIG5hbWUsIG5ldyBCdWZmZXJBdHRyaWJ1dGUoIGFycmF5MiwgaXRlbVNpemUgKSApO1xuXG5cdFx0fVxuXG5cdFx0dmFyIGdyb3VwcyA9IHRoaXMuZ3JvdXBzO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gZ3JvdXBzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBncm91cCA9IGdyb3Vwc1sgaSBdO1xuXHRcdFx0Z2VvbWV0cnkyLmFkZEdyb3VwKCBncm91cC5zdGFydCwgZ3JvdXAuY291bnQsIGdyb3VwLm1hdGVyaWFsSW5kZXggKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBnZW9tZXRyeTI7XG5cblx0fSxcblxuXHR0b0pTT046IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBkYXRhID0ge1xuXHRcdFx0bWV0YWRhdGE6IHtcblx0XHRcdFx0dmVyc2lvbjogNC41LFxuXHRcdFx0XHR0eXBlOiAnQnVmZmVyR2VvbWV0cnknLFxuXHRcdFx0XHRnZW5lcmF0b3I6ICdCdWZmZXJHZW9tZXRyeS50b0pTT04nXG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdC8vIHN0YW5kYXJkIEJ1ZmZlckdlb21ldHJ5IHNlcmlhbGl6YXRpb25cblxuXHRcdGRhdGEudXVpZCA9IHRoaXMudXVpZDtcblx0XHRkYXRhLnR5cGUgPSB0aGlzLnR5cGU7XG5cdFx0aWYgKCB0aGlzLm5hbWUgIT09ICcnICkgZGF0YS5uYW1lID0gdGhpcy5uYW1lO1xuXG5cdFx0aWYgKCB0aGlzLnBhcmFtZXRlcnMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dmFyIHBhcmFtZXRlcnMgPSB0aGlzLnBhcmFtZXRlcnM7XG5cblx0XHRcdGZvciAoIHZhciBrZXkgaW4gcGFyYW1ldGVycyApIHtcblxuXHRcdFx0XHRpZiAoIHBhcmFtZXRlcnNbIGtleSBdICE9PSB1bmRlZmluZWQgKSBkYXRhWyBrZXkgXSA9IHBhcmFtZXRlcnNbIGtleSBdO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBkYXRhO1xuXG5cdFx0fVxuXG5cdFx0ZGF0YS5kYXRhID0geyBhdHRyaWJ1dGVzOiB7fSB9O1xuXG5cdFx0dmFyIGluZGV4ID0gdGhpcy5pbmRleDtcblxuXHRcdGlmICggaW5kZXggIT09IG51bGwgKSB7XG5cblx0XHRcdHZhciBhcnJheSA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKCBpbmRleC5hcnJheSApO1xuXG5cdFx0XHRkYXRhLmRhdGEuaW5kZXggPSB7XG5cdFx0XHRcdHR5cGU6IGluZGV4LmFycmF5LmNvbnN0cnVjdG9yLm5hbWUsXG5cdFx0XHRcdGFycmF5OiBhcnJheVxuXHRcdFx0fTtcblxuXHRcdH1cblxuXHRcdHZhciBhdHRyaWJ1dGVzID0gdGhpcy5hdHRyaWJ1dGVzO1xuXG5cdFx0Zm9yICggdmFyIGtleSBpbiBhdHRyaWJ1dGVzICkge1xuXG5cdFx0XHR2YXIgYXR0cmlidXRlID0gYXR0cmlidXRlc1sga2V5IF07XG5cblx0XHRcdHZhciBhcnJheSA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKCBhdHRyaWJ1dGUuYXJyYXkgKTtcblxuXHRcdFx0ZGF0YS5kYXRhLmF0dHJpYnV0ZXNbIGtleSBdID0ge1xuXHRcdFx0XHRpdGVtU2l6ZTogYXR0cmlidXRlLml0ZW1TaXplLFxuXHRcdFx0XHR0eXBlOiBhdHRyaWJ1dGUuYXJyYXkuY29uc3RydWN0b3IubmFtZSxcblx0XHRcdFx0YXJyYXk6IGFycmF5LFxuXHRcdFx0XHRub3JtYWxpemVkOiBhdHRyaWJ1dGUubm9ybWFsaXplZFxuXHRcdFx0fTtcblxuXHRcdH1cblxuXHRcdHZhciBncm91cHMgPSB0aGlzLmdyb3VwcztcblxuXHRcdGlmICggZ3JvdXBzLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdGRhdGEuZGF0YS5ncm91cHMgPSBKU09OLnBhcnNlKCBKU09OLnN0cmluZ2lmeSggZ3JvdXBzICkgKTtcblxuXHRcdH1cblxuXHRcdHZhciBib3VuZGluZ1NwaGVyZSA9IHRoaXMuYm91bmRpbmdTcGhlcmU7XG5cblx0XHRpZiAoIGJvdW5kaW5nU3BoZXJlICE9PSBudWxsICkge1xuXG5cdFx0XHRkYXRhLmRhdGEuYm91bmRpbmdTcGhlcmUgPSB7XG5cdFx0XHRcdGNlbnRlcjogYm91bmRpbmdTcGhlcmUuY2VudGVyLnRvQXJyYXkoKSxcblx0XHRcdFx0cmFkaXVzOiBib3VuZGluZ1NwaGVyZS5yYWRpdXNcblx0XHRcdH07XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gZGF0YTtcblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvKlxuXHRcdCAvLyBIYW5kbGUgcHJpbWl0aXZlc1xuXG5cdFx0IHZhciBwYXJhbWV0ZXJzID0gdGhpcy5wYXJhbWV0ZXJzO1xuXG5cdFx0IGlmICggcGFyYW1ldGVycyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0IHZhciB2YWx1ZXMgPSBbXTtcblxuXHRcdCBmb3IgKCB2YXIga2V5IGluIHBhcmFtZXRlcnMgKSB7XG5cblx0XHQgdmFsdWVzLnB1c2goIHBhcmFtZXRlcnNbIGtleSBdICk7XG5cblx0XHQgfVxuXG5cdFx0IHZhciBnZW9tZXRyeSA9IE9iamVjdC5jcmVhdGUoIHRoaXMuY29uc3RydWN0b3IucHJvdG90eXBlICk7XG5cdFx0IHRoaXMuY29uc3RydWN0b3IuYXBwbHkoIGdlb21ldHJ5LCB2YWx1ZXMgKTtcblx0XHQgcmV0dXJuIGdlb21ldHJ5O1xuXG5cdFx0IH1cblxuXHRcdCByZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XG5cdFx0ICovXG5cblx0XHRyZXR1cm4gbmV3IEJ1ZmZlckdlb21ldHJ5KCkuY29weSggdGhpcyApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHR2YXIgbmFtZSwgaSwgbDtcblxuXHRcdC8vIHJlc2V0XG5cblx0XHR0aGlzLmluZGV4ID0gbnVsbDtcblx0XHR0aGlzLmF0dHJpYnV0ZXMgPSB7fTtcblx0XHR0aGlzLm1vcnBoQXR0cmlidXRlcyA9IHt9O1xuXHRcdHRoaXMuZ3JvdXBzID0gW107XG5cdFx0dGhpcy5ib3VuZGluZ0JveCA9IG51bGw7XG5cdFx0dGhpcy5ib3VuZGluZ1NwaGVyZSA9IG51bGw7XG5cblx0XHQvLyBuYW1lXG5cblx0XHR0aGlzLm5hbWUgPSBzb3VyY2UubmFtZTtcblxuXHRcdC8vIGluZGV4XG5cblx0XHR2YXIgaW5kZXggPSBzb3VyY2UuaW5kZXg7XG5cblx0XHRpZiAoIGluZGV4ICE9PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLnNldEluZGV4KCBpbmRleC5jbG9uZSgpICk7XG5cblx0XHR9XG5cblx0XHQvLyBhdHRyaWJ1dGVzXG5cblx0XHR2YXIgYXR0cmlidXRlcyA9IHNvdXJjZS5hdHRyaWJ1dGVzO1xuXG5cdFx0Zm9yICggbmFtZSBpbiBhdHRyaWJ1dGVzICkge1xuXG5cdFx0XHR2YXIgYXR0cmlidXRlID0gYXR0cmlidXRlc1sgbmFtZSBdO1xuXHRcdFx0dGhpcy5hZGRBdHRyaWJ1dGUoIG5hbWUsIGF0dHJpYnV0ZS5jbG9uZSgpICk7XG5cblx0XHR9XG5cblx0XHQvLyBtb3JwaCBhdHRyaWJ1dGVzXG5cblx0XHR2YXIgbW9ycGhBdHRyaWJ1dGVzID0gc291cmNlLm1vcnBoQXR0cmlidXRlcztcblxuXHRcdGZvciAoIG5hbWUgaW4gbW9ycGhBdHRyaWJ1dGVzICkge1xuXG5cdFx0XHR2YXIgYXJyYXkgPSBbXTtcblx0XHRcdHZhciBtb3JwaEF0dHJpYnV0ZSA9IG1vcnBoQXR0cmlidXRlc1sgbmFtZSBdOyAvLyBtb3JwaEF0dHJpYnV0ZTogYXJyYXkgb2YgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZXNcblxuXHRcdFx0Zm9yICggaSA9IDAsIGwgPSBtb3JwaEF0dHJpYnV0ZS5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdGFycmF5LnB1c2goIG1vcnBoQXR0cmlidXRlWyBpIF0uY2xvbmUoKSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMubW9ycGhBdHRyaWJ1dGVzWyBuYW1lIF0gPSBhcnJheTtcblxuXHRcdH1cblxuXHRcdC8vIGdyb3Vwc1xuXG5cdFx0dmFyIGdyb3VwcyA9IHNvdXJjZS5ncm91cHM7XG5cblx0XHRmb3IgKCBpID0gMCwgbCA9IGdyb3Vwcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgZ3JvdXAgPSBncm91cHNbIGkgXTtcblx0XHRcdHRoaXMuYWRkR3JvdXAoIGdyb3VwLnN0YXJ0LCBncm91cC5jb3VudCwgZ3JvdXAubWF0ZXJpYWxJbmRleCApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gYm91bmRpbmcgYm94XG5cblx0XHR2YXIgYm91bmRpbmdCb3ggPSBzb3VyY2UuYm91bmRpbmdCb3g7XG5cblx0XHRpZiAoIGJvdW5kaW5nQm94ICE9PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLmJvdW5kaW5nQm94ID0gYm91bmRpbmdCb3guY2xvbmUoKTtcblxuXHRcdH1cblxuXHRcdC8vIGJvdW5kaW5nIHNwaGVyZVxuXG5cdFx0dmFyIGJvdW5kaW5nU3BoZXJlID0gc291cmNlLmJvdW5kaW5nU3BoZXJlO1xuXG5cdFx0aWYgKCBib3VuZGluZ1NwaGVyZSAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5ib3VuZGluZ1NwaGVyZSA9IGJvdW5kaW5nU3BoZXJlLmNsb25lKCk7XG5cblx0XHR9XG5cblx0XHQvLyBkcmF3IHJhbmdlXG5cblx0XHR0aGlzLmRyYXdSYW5nZS5zdGFydCA9IHNvdXJjZS5kcmF3UmFuZ2Uuc3RhcnQ7XG5cdFx0dGhpcy5kcmF3UmFuZ2UuY291bnQgPSBzb3VyY2UuZHJhd1JhbmdlLmNvdW50O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRkaXNwb3NlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLmRpc3BhdGNoRXZlbnQoIHsgdHlwZTogJ2Rpc3Bvc2UnIH0gKTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqL1xuXG4vLyBCb3hHZW9tZXRyeVxuXG5mdW5jdGlvbiBCb3hHZW9tZXRyeSggd2lkdGgsIGhlaWdodCwgZGVwdGgsIHdpZHRoU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCBkZXB0aFNlZ21lbnRzICkge1xuXG5cdEdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnQm94R2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHR3aWR0aDogd2lkdGgsXG5cdFx0aGVpZ2h0OiBoZWlnaHQsXG5cdFx0ZGVwdGg6IGRlcHRoLFxuXHRcdHdpZHRoU2VnbWVudHM6IHdpZHRoU2VnbWVudHMsXG5cdFx0aGVpZ2h0U2VnbWVudHM6IGhlaWdodFNlZ21lbnRzLFxuXHRcdGRlcHRoU2VnbWVudHM6IGRlcHRoU2VnbWVudHNcblx0fTtcblxuXHR0aGlzLmZyb21CdWZmZXJHZW9tZXRyeSggbmV3IEJveEJ1ZmZlckdlb21ldHJ5KCB3aWR0aCwgaGVpZ2h0LCBkZXB0aCwgd2lkdGhTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIGRlcHRoU2VnbWVudHMgKSApO1xuXHR0aGlzLm1lcmdlVmVydGljZXMoKTtcblxufVxuXG5Cb3hHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBHZW9tZXRyeS5wcm90b3R5cGUgKTtcbkJveEdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEJveEdlb21ldHJ5O1xuXG4vLyBCb3hCdWZmZXJHZW9tZXRyeVxuXG5mdW5jdGlvbiBCb3hCdWZmZXJHZW9tZXRyeSggd2lkdGgsIGhlaWdodCwgZGVwdGgsIHdpZHRoU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCBkZXB0aFNlZ21lbnRzICkge1xuXG5cdEJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnQm94QnVmZmVyR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHR3aWR0aDogd2lkdGgsXG5cdFx0aGVpZ2h0OiBoZWlnaHQsXG5cdFx0ZGVwdGg6IGRlcHRoLFxuXHRcdHdpZHRoU2VnbWVudHM6IHdpZHRoU2VnbWVudHMsXG5cdFx0aGVpZ2h0U2VnbWVudHM6IGhlaWdodFNlZ21lbnRzLFxuXHRcdGRlcHRoU2VnbWVudHM6IGRlcHRoU2VnbWVudHNcblx0fTtcblxuXHR2YXIgc2NvcGUgPSB0aGlzO1xuXG5cdHdpZHRoID0gd2lkdGggfHwgMTtcblx0aGVpZ2h0ID0gaGVpZ2h0IHx8IDE7XG5cdGRlcHRoID0gZGVwdGggfHwgMTtcblxuXHQvLyBzZWdtZW50c1xuXG5cdHdpZHRoU2VnbWVudHMgPSBNYXRoLmZsb29yKCB3aWR0aFNlZ21lbnRzICkgfHwgMTtcblx0aGVpZ2h0U2VnbWVudHMgPSBNYXRoLmZsb29yKCBoZWlnaHRTZWdtZW50cyApIHx8IDE7XG5cdGRlcHRoU2VnbWVudHMgPSBNYXRoLmZsb29yKCBkZXB0aFNlZ21lbnRzICkgfHwgMTtcblxuXHQvLyBidWZmZXJzXG5cblx0dmFyIGluZGljZXMgPSBbXTtcblx0dmFyIHZlcnRpY2VzID0gW107XG5cdHZhciBub3JtYWxzID0gW107XG5cdHZhciB1dnMgPSBbXTtcblxuXHQvLyBoZWxwZXIgdmFyaWFibGVzXG5cblx0dmFyIG51bWJlck9mVmVydGljZXMgPSAwO1xuXHR2YXIgZ3JvdXBTdGFydCA9IDA7XG5cblx0Ly8gYnVpbGQgZWFjaCBzaWRlIG9mIHRoZSBib3ggZ2VvbWV0cnlcblxuXHRidWlsZFBsYW5lKCAneicsICd5JywgJ3gnLCAtIDEsIC0gMSwgZGVwdGgsIGhlaWdodCwgd2lkdGgsIGRlcHRoU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCAwICk7IC8vIHB4XG5cdGJ1aWxkUGxhbmUoICd6JywgJ3knLCAneCcsIDEsIC0gMSwgZGVwdGgsIGhlaWdodCwgLSB3aWR0aCwgZGVwdGhTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIDEgKTsgLy8gbnhcblx0YnVpbGRQbGFuZSggJ3gnLCAneicsICd5JywgMSwgMSwgd2lkdGgsIGRlcHRoLCBoZWlnaHQsIHdpZHRoU2VnbWVudHMsIGRlcHRoU2VnbWVudHMsIDIgKTsgLy8gcHlcblx0YnVpbGRQbGFuZSggJ3gnLCAneicsICd5JywgMSwgLSAxLCB3aWR0aCwgZGVwdGgsIC0gaGVpZ2h0LCB3aWR0aFNlZ21lbnRzLCBkZXB0aFNlZ21lbnRzLCAzICk7IC8vIG55XG5cdGJ1aWxkUGxhbmUoICd4JywgJ3knLCAneicsIDEsIC0gMSwgd2lkdGgsIGhlaWdodCwgZGVwdGgsIHdpZHRoU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCA0ICk7IC8vIHB6XG5cdGJ1aWxkUGxhbmUoICd4JywgJ3knLCAneicsIC0gMSwgLSAxLCB3aWR0aCwgaGVpZ2h0LCAtIGRlcHRoLCB3aWR0aFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgNSApOyAvLyBuelxuXG5cdC8vIGJ1aWxkIGdlb21ldHJ5XG5cblx0dGhpcy5zZXRJbmRleCggaW5kaWNlcyApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICdub3JtYWwnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbm9ybWFscywgMyApICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAyICkgKTtcblxuXHRmdW5jdGlvbiBidWlsZFBsYW5lKCB1LCB2LCB3LCB1ZGlyLCB2ZGlyLCB3aWR0aCwgaGVpZ2h0LCBkZXB0aCwgZ3JpZFgsIGdyaWRZLCBtYXRlcmlhbEluZGV4ICkge1xuXG5cdFx0dmFyIHNlZ21lbnRXaWR0aCA9IHdpZHRoIC8gZ3JpZFg7XG5cdFx0dmFyIHNlZ21lbnRIZWlnaHQgPSBoZWlnaHQgLyBncmlkWTtcblxuXHRcdHZhciB3aWR0aEhhbGYgPSB3aWR0aCAvIDI7XG5cdFx0dmFyIGhlaWdodEhhbGYgPSBoZWlnaHQgLyAyO1xuXHRcdHZhciBkZXB0aEhhbGYgPSBkZXB0aCAvIDI7XG5cblx0XHR2YXIgZ3JpZFgxID0gZ3JpZFggKyAxO1xuXHRcdHZhciBncmlkWTEgPSBncmlkWSArIDE7XG5cblx0XHR2YXIgdmVydGV4Q291bnRlciA9IDA7XG5cdFx0dmFyIGdyb3VwQ291bnQgPSAwO1xuXG5cdFx0dmFyIGl4LCBpeTtcblxuXHRcdHZhciB2ZWN0b3IgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0Ly8gZ2VuZXJhdGUgdmVydGljZXMsIG5vcm1hbHMgYW5kIHV2c1xuXG5cdFx0Zm9yICggaXkgPSAwOyBpeSA8IGdyaWRZMTsgaXkgKysgKSB7XG5cblx0XHRcdHZhciB5ID0gaXkgKiBzZWdtZW50SGVpZ2h0IC0gaGVpZ2h0SGFsZjtcblxuXHRcdFx0Zm9yICggaXggPSAwOyBpeCA8IGdyaWRYMTsgaXggKysgKSB7XG5cblx0XHRcdFx0dmFyIHggPSBpeCAqIHNlZ21lbnRXaWR0aCAtIHdpZHRoSGFsZjtcblxuXHRcdFx0XHQvLyBzZXQgdmFsdWVzIHRvIGNvcnJlY3QgdmVjdG9yIGNvbXBvbmVudFxuXG5cdFx0XHRcdHZlY3RvclsgdSBdID0geCAqIHVkaXI7XG5cdFx0XHRcdHZlY3RvclsgdiBdID0geSAqIHZkaXI7XG5cdFx0XHRcdHZlY3RvclsgdyBdID0gZGVwdGhIYWxmO1xuXG5cdFx0XHRcdC8vIG5vdyBhcHBseSB2ZWN0b3IgdG8gdmVydGV4IGJ1ZmZlclxuXG5cdFx0XHRcdHZlcnRpY2VzLnB1c2goIHZlY3Rvci54LCB2ZWN0b3IueSwgdmVjdG9yLnogKTtcblxuXHRcdFx0XHQvLyBzZXQgdmFsdWVzIHRvIGNvcnJlY3QgdmVjdG9yIGNvbXBvbmVudFxuXG5cdFx0XHRcdHZlY3RvclsgdSBdID0gMDtcblx0XHRcdFx0dmVjdG9yWyB2IF0gPSAwO1xuXHRcdFx0XHR2ZWN0b3JbIHcgXSA9IGRlcHRoID4gMCA/IDEgOiAtIDE7XG5cblx0XHRcdFx0Ly8gbm93IGFwcGx5IHZlY3RvciB0byBub3JtYWwgYnVmZmVyXG5cblx0XHRcdFx0bm9ybWFscy5wdXNoKCB2ZWN0b3IueCwgdmVjdG9yLnksIHZlY3Rvci56ICk7XG5cblx0XHRcdFx0Ly8gdXZzXG5cblx0XHRcdFx0dXZzLnB1c2goIGl4IC8gZ3JpZFggKTtcblx0XHRcdFx0dXZzLnB1c2goIDEgLSAoIGl5IC8gZ3JpZFkgKSApO1xuXG5cdFx0XHRcdC8vIGNvdW50ZXJzXG5cblx0XHRcdFx0dmVydGV4Q291bnRlciArPSAxO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvLyBpbmRpY2VzXG5cblx0XHQvLyAxLiB5b3UgbmVlZCB0aHJlZSBpbmRpY2VzIHRvIGRyYXcgYSBzaW5nbGUgZmFjZVxuXHRcdC8vIDIuIGEgc2luZ2xlIHNlZ21lbnQgY29uc2lzdHMgb2YgdHdvIGZhY2VzXG5cdFx0Ly8gMy4gc28gd2UgbmVlZCB0byBnZW5lcmF0ZSBzaXggKDIqMykgaW5kaWNlcyBwZXIgc2VnbWVudFxuXG5cdFx0Zm9yICggaXkgPSAwOyBpeSA8IGdyaWRZOyBpeSArKyApIHtcblxuXHRcdFx0Zm9yICggaXggPSAwOyBpeCA8IGdyaWRYOyBpeCArKyApIHtcblxuXHRcdFx0XHR2YXIgYSA9IG51bWJlck9mVmVydGljZXMgKyBpeCArIGdyaWRYMSAqIGl5O1xuXHRcdFx0XHR2YXIgYiA9IG51bWJlck9mVmVydGljZXMgKyBpeCArIGdyaWRYMSAqICggaXkgKyAxICk7XG5cdFx0XHRcdHZhciBjID0gbnVtYmVyT2ZWZXJ0aWNlcyArICggaXggKyAxICkgKyBncmlkWDEgKiAoIGl5ICsgMSApO1xuXHRcdFx0XHR2YXIgZCA9IG51bWJlck9mVmVydGljZXMgKyAoIGl4ICsgMSApICsgZ3JpZFgxICogaXk7XG5cblx0XHRcdFx0Ly8gZmFjZXNcblxuXHRcdFx0XHRpbmRpY2VzLnB1c2goIGEsIGIsIGQgKTtcblx0XHRcdFx0aW5kaWNlcy5wdXNoKCBiLCBjLCBkICk7XG5cblx0XHRcdFx0Ly8gaW5jcmVhc2UgY291bnRlclxuXG5cdFx0XHRcdGdyb3VwQ291bnQgKz0gNjtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gYWRkIGEgZ3JvdXAgdG8gdGhlIGdlb21ldHJ5LiB0aGlzIHdpbGwgZW5zdXJlIG11bHRpIG1hdGVyaWFsIHN1cHBvcnRcblxuXHRcdHNjb3BlLmFkZEdyb3VwKCBncm91cFN0YXJ0LCBncm91cENvdW50LCBtYXRlcmlhbEluZGV4ICk7XG5cblx0XHQvLyBjYWxjdWxhdGUgbmV3IHN0YXJ0IHZhbHVlIGZvciBncm91cHNcblxuXHRcdGdyb3VwU3RhcnQgKz0gZ3JvdXBDb3VudDtcblxuXHRcdC8vIHVwZGF0ZSB0b3RhbCBudW1iZXIgb2YgdmVydGljZXNcblxuXHRcdG51bWJlck9mVmVydGljZXMgKz0gdmVydGV4Q291bnRlcjtcblxuXHR9XG5cbn1cblxuQm94QnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7XG5Cb3hCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBCb3hCdWZmZXJHZW9tZXRyeTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqL1xuXG4vLyBQbGFuZUdlb21ldHJ5XG5cbmZ1bmN0aW9uIFBsYW5lR2VvbWV0cnkoIHdpZHRoLCBoZWlnaHQsIHdpZHRoU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzICkge1xuXG5cdEdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnUGxhbmVHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHdpZHRoOiB3aWR0aCxcblx0XHRoZWlnaHQ6IGhlaWdodCxcblx0XHR3aWR0aFNlZ21lbnRzOiB3aWR0aFNlZ21lbnRzLFxuXHRcdGhlaWdodFNlZ21lbnRzOiBoZWlnaHRTZWdtZW50c1xuXHR9O1xuXG5cdHRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgUGxhbmVCdWZmZXJHZW9tZXRyeSggd2lkdGgsIGhlaWdodCwgd2lkdGhTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMgKSApO1xuXHR0aGlzLm1lcmdlVmVydGljZXMoKTtcblxufVxuXG5QbGFuZUdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEdlb21ldHJ5LnByb3RvdHlwZSApO1xuUGxhbmVHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBQbGFuZUdlb21ldHJ5O1xuXG4vLyBQbGFuZUJ1ZmZlckdlb21ldHJ5XG5cbmZ1bmN0aW9uIFBsYW5lQnVmZmVyR2VvbWV0cnkoIHdpZHRoLCBoZWlnaHQsIHdpZHRoU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzICkge1xuXG5cdEJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnUGxhbmVCdWZmZXJHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHdpZHRoOiB3aWR0aCxcblx0XHRoZWlnaHQ6IGhlaWdodCxcblx0XHR3aWR0aFNlZ21lbnRzOiB3aWR0aFNlZ21lbnRzLFxuXHRcdGhlaWdodFNlZ21lbnRzOiBoZWlnaHRTZWdtZW50c1xuXHR9O1xuXG5cdHdpZHRoID0gd2lkdGggfHwgMTtcblx0aGVpZ2h0ID0gaGVpZ2h0IHx8IDE7XG5cblx0dmFyIHdpZHRoX2hhbGYgPSB3aWR0aCAvIDI7XG5cdHZhciBoZWlnaHRfaGFsZiA9IGhlaWdodCAvIDI7XG5cblx0dmFyIGdyaWRYID0gTWF0aC5mbG9vciggd2lkdGhTZWdtZW50cyApIHx8IDE7XG5cdHZhciBncmlkWSA9IE1hdGguZmxvb3IoIGhlaWdodFNlZ21lbnRzICkgfHwgMTtcblxuXHR2YXIgZ3JpZFgxID0gZ3JpZFggKyAxO1xuXHR2YXIgZ3JpZFkxID0gZ3JpZFkgKyAxO1xuXG5cdHZhciBzZWdtZW50X3dpZHRoID0gd2lkdGggLyBncmlkWDtcblx0dmFyIHNlZ21lbnRfaGVpZ2h0ID0gaGVpZ2h0IC8gZ3JpZFk7XG5cblx0dmFyIGl4LCBpeTtcblxuXHQvLyBidWZmZXJzXG5cblx0dmFyIGluZGljZXMgPSBbXTtcblx0dmFyIHZlcnRpY2VzID0gW107XG5cdHZhciBub3JtYWxzID0gW107XG5cdHZhciB1dnMgPSBbXTtcblxuXHQvLyBnZW5lcmF0ZSB2ZXJ0aWNlcywgbm9ybWFscyBhbmQgdXZzXG5cblx0Zm9yICggaXkgPSAwOyBpeSA8IGdyaWRZMTsgaXkgKysgKSB7XG5cblx0XHR2YXIgeSA9IGl5ICogc2VnbWVudF9oZWlnaHQgLSBoZWlnaHRfaGFsZjtcblxuXHRcdGZvciAoIGl4ID0gMDsgaXggPCBncmlkWDE7IGl4ICsrICkge1xuXG5cdFx0XHR2YXIgeCA9IGl4ICogc2VnbWVudF93aWR0aCAtIHdpZHRoX2hhbGY7XG5cblx0XHRcdHZlcnRpY2VzLnB1c2goIHgsIC0geSwgMCApO1xuXG5cdFx0XHRub3JtYWxzLnB1c2goIDAsIDAsIDEgKTtcblxuXHRcdFx0dXZzLnB1c2goIGl4IC8gZ3JpZFggKTtcblx0XHRcdHV2cy5wdXNoKCAxIC0gKCBpeSAvIGdyaWRZICkgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gaW5kaWNlc1xuXG5cdGZvciAoIGl5ID0gMDsgaXkgPCBncmlkWTsgaXkgKysgKSB7XG5cblx0XHRmb3IgKCBpeCA9IDA7IGl4IDwgZ3JpZFg7IGl4ICsrICkge1xuXG5cdFx0XHR2YXIgYSA9IGl4ICsgZ3JpZFgxICogaXk7XG5cdFx0XHR2YXIgYiA9IGl4ICsgZ3JpZFgxICogKCBpeSArIDEgKTtcblx0XHRcdHZhciBjID0gKCBpeCArIDEgKSArIGdyaWRYMSAqICggaXkgKyAxICk7XG5cdFx0XHR2YXIgZCA9ICggaXggKyAxICkgKyBncmlkWDEgKiBpeTtcblxuXHRcdFx0Ly8gZmFjZXNcblxuXHRcdFx0aW5kaWNlcy5wdXNoKCBhLCBiLCBkICk7XG5cdFx0XHRpbmRpY2VzLnB1c2goIGIsIGMsIGQgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gYnVpbGQgZ2VvbWV0cnlcblxuXHR0aGlzLnNldEluZGV4KCBpbmRpY2VzICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBub3JtYWxzLCAzICkgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICd1dicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB1dnMsIDIgKSApO1xuXG59XG5cblBsYW5lQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7XG5QbGFuZUJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFBsYW5lQnVmZmVyR2VvbWV0cnk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKi9cblxudmFyIG1hdGVyaWFsSWQgPSAwO1xuXG5mdW5jdGlvbiBNYXRlcmlhbCgpIHtcblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoIHRoaXMsICdpZCcsIHsgdmFsdWU6IG1hdGVyaWFsSWQgKysgfSApO1xuXG5cdHRoaXMudXVpZCA9IF9NYXRoLmdlbmVyYXRlVVVJRCgpO1xuXG5cdHRoaXMubmFtZSA9ICcnO1xuXHR0aGlzLnR5cGUgPSAnTWF0ZXJpYWwnO1xuXG5cdHRoaXMuZm9nID0gdHJ1ZTtcblx0dGhpcy5saWdodHMgPSB0cnVlO1xuXG5cdHRoaXMuYmxlbmRpbmcgPSBOb3JtYWxCbGVuZGluZztcblx0dGhpcy5zaWRlID0gRnJvbnRTaWRlO1xuXHR0aGlzLmZsYXRTaGFkaW5nID0gZmFsc2U7XG5cdHRoaXMudmVydGV4Q29sb3JzID0gTm9Db2xvcnM7IC8vIFRIUkVFLk5vQ29sb3JzLCBUSFJFRS5WZXJ0ZXhDb2xvcnMsIFRIUkVFLkZhY2VDb2xvcnNcblxuXHR0aGlzLm9wYWNpdHkgPSAxO1xuXHR0aGlzLnRyYW5zcGFyZW50ID0gZmFsc2U7XG5cblx0dGhpcy5ibGVuZFNyYyA9IFNyY0FscGhhRmFjdG9yO1xuXHR0aGlzLmJsZW5kRHN0ID0gT25lTWludXNTcmNBbHBoYUZhY3Rvcjtcblx0dGhpcy5ibGVuZEVxdWF0aW9uID0gQWRkRXF1YXRpb247XG5cdHRoaXMuYmxlbmRTcmNBbHBoYSA9IG51bGw7XG5cdHRoaXMuYmxlbmREc3RBbHBoYSA9IG51bGw7XG5cdHRoaXMuYmxlbmRFcXVhdGlvbkFscGhhID0gbnVsbDtcblxuXHR0aGlzLmRlcHRoRnVuYyA9IExlc3NFcXVhbERlcHRoO1xuXHR0aGlzLmRlcHRoVGVzdCA9IHRydWU7XG5cdHRoaXMuZGVwdGhXcml0ZSA9IHRydWU7XG5cblx0dGhpcy5jbGlwcGluZ1BsYW5lcyA9IG51bGw7XG5cdHRoaXMuY2xpcEludGVyc2VjdGlvbiA9IGZhbHNlO1xuXHR0aGlzLmNsaXBTaGFkb3dzID0gZmFsc2U7XG5cblx0dGhpcy5zaGFkb3dTaWRlID0gbnVsbDtcblxuXHR0aGlzLmNvbG9yV3JpdGUgPSB0cnVlO1xuXG5cdHRoaXMucHJlY2lzaW9uID0gbnVsbDsgLy8gb3ZlcnJpZGUgdGhlIHJlbmRlcmVyJ3MgZGVmYXVsdCBwcmVjaXNpb24gZm9yIHRoaXMgbWF0ZXJpYWxcblxuXHR0aGlzLnBvbHlnb25PZmZzZXQgPSBmYWxzZTtcblx0dGhpcy5wb2x5Z29uT2Zmc2V0RmFjdG9yID0gMDtcblx0dGhpcy5wb2x5Z29uT2Zmc2V0VW5pdHMgPSAwO1xuXG5cdHRoaXMuZGl0aGVyaW5nID0gZmFsc2U7XG5cblx0dGhpcy5hbHBoYVRlc3QgPSAwO1xuXHR0aGlzLnByZW11bHRpcGxpZWRBbHBoYSA9IGZhbHNlO1xuXG5cdHRoaXMub3ZlcmRyYXcgPSAwOyAvLyBPdmVyZHJhd24gcGl4ZWxzICh0eXBpY2FsbHkgYmV0d2VlbiAwIGFuZCAxKSBmb3IgZml4aW5nIGFudGlhbGlhc2luZyBnYXBzIGluIENhbnZhc1JlbmRlcmVyXG5cblx0dGhpcy52aXNpYmxlID0gdHJ1ZTtcblxuXHR0aGlzLnVzZXJEYXRhID0ge307XG5cblx0dGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cbn1cblxuTWF0ZXJpYWwucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggRXZlbnREaXNwYXRjaGVyLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IE1hdGVyaWFsLFxuXG5cdGlzTWF0ZXJpYWw6IHRydWUsXG5cblx0b25CZWZvcmVDb21waWxlOiBmdW5jdGlvbiAoKSB7fSxcblxuXHRzZXRWYWx1ZXM6IGZ1bmN0aW9uICggdmFsdWVzICkge1xuXG5cdFx0aWYgKCB2YWx1ZXMgPT09IHVuZGVmaW5lZCApIHJldHVybjtcblxuXHRcdGZvciAoIHZhciBrZXkgaW4gdmFsdWVzICkge1xuXG5cdFx0XHR2YXIgbmV3VmFsdWUgPSB2YWx1ZXNbIGtleSBdO1xuXG5cdFx0XHRpZiAoIG5ld1ZhbHVlID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCBcIlRIUkVFLk1hdGVyaWFsOiAnXCIgKyBrZXkgKyBcIicgcGFyYW1ldGVyIGlzIHVuZGVmaW5lZC5cIiApO1xuXHRcdFx0XHRjb250aW51ZTtcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBmb3IgYmFja3dhcmQgY29tcGF0YWJpbGl0eSBpZiBzaGFkaW5nIGlzIHNldCBpbiB0aGUgY29uc3RydWN0b3Jcblx0XHRcdGlmICgga2V5ID09PSAnc2hhZGluZycgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuJyArIHRoaXMudHlwZSArICc6IC5zaGFkaW5nIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSB0aGUgYm9vbGVhbiAuZmxhdFNoYWRpbmcgaW5zdGVhZC4nICk7XG5cdFx0XHRcdHRoaXMuZmxhdFNoYWRpbmcgPSAoIG5ld1ZhbHVlID09PSBGbGF0U2hhZGluZyApID8gdHJ1ZSA6IGZhbHNlO1xuXHRcdFx0XHRjb250aW51ZTtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgY3VycmVudFZhbHVlID0gdGhpc1sga2V5IF07XG5cblx0XHRcdGlmICggY3VycmVudFZhbHVlID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCBcIlRIUkVFLlwiICsgdGhpcy50eXBlICsgXCI6ICdcIiArIGtleSArIFwiJyBpcyBub3QgYSBwcm9wZXJ0eSBvZiB0aGlzIG1hdGVyaWFsLlwiICk7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggY3VycmVudFZhbHVlICYmIGN1cnJlbnRWYWx1ZS5pc0NvbG9yICkge1xuXG5cdFx0XHRcdGN1cnJlbnRWYWx1ZS5zZXQoIG5ld1ZhbHVlICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoICggY3VycmVudFZhbHVlICYmIGN1cnJlbnRWYWx1ZS5pc1ZlY3RvcjMgKSAmJiAoIG5ld1ZhbHVlICYmIG5ld1ZhbHVlLmlzVmVjdG9yMyApICkge1xuXG5cdFx0XHRcdGN1cnJlbnRWYWx1ZS5jb3B5KCBuZXdWYWx1ZSApO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBrZXkgPT09ICdvdmVyZHJhdycgKSB7XG5cblx0XHRcdFx0Ly8gZW5zdXJlIG92ZXJkcmF3IGlzIGJhY2t3YXJkcy1jb21wYXRpYmxlIHdpdGggbGVnYWN5IGJvb2xlYW4gdHlwZVxuXHRcdFx0XHR0aGlzWyBrZXkgXSA9IE51bWJlciggbmV3VmFsdWUgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHR0aGlzWyBrZXkgXSA9IG5ld1ZhbHVlO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fSxcblxuXHR0b0pTT046IGZ1bmN0aW9uICggbWV0YSApIHtcblxuXHRcdHZhciBpc1Jvb3QgPSAoIG1ldGEgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgbWV0YSA9PT0gJ3N0cmluZycgKTtcblxuXHRcdGlmICggaXNSb290ICkge1xuXG5cdFx0XHRtZXRhID0ge1xuXHRcdFx0XHR0ZXh0dXJlczoge30sXG5cdFx0XHRcdGltYWdlczoge31cblx0XHRcdH07XG5cblx0XHR9XG5cblx0XHR2YXIgZGF0YSA9IHtcblx0XHRcdG1ldGFkYXRhOiB7XG5cdFx0XHRcdHZlcnNpb246IDQuNSxcblx0XHRcdFx0dHlwZTogJ01hdGVyaWFsJyxcblx0XHRcdFx0Z2VuZXJhdG9yOiAnTWF0ZXJpYWwudG9KU09OJ1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHQvLyBzdGFuZGFyZCBNYXRlcmlhbCBzZXJpYWxpemF0aW9uXG5cdFx0ZGF0YS51dWlkID0gdGhpcy51dWlkO1xuXHRcdGRhdGEudHlwZSA9IHRoaXMudHlwZTtcblxuXHRcdGlmICggdGhpcy5uYW1lICE9PSAnJyApIGRhdGEubmFtZSA9IHRoaXMubmFtZTtcblxuXHRcdGlmICggdGhpcy5jb2xvciAmJiB0aGlzLmNvbG9yLmlzQ29sb3IgKSBkYXRhLmNvbG9yID0gdGhpcy5jb2xvci5nZXRIZXgoKTtcblxuXHRcdGlmICggdGhpcy5yb3VnaG5lc3MgIT09IHVuZGVmaW5lZCApIGRhdGEucm91Z2huZXNzID0gdGhpcy5yb3VnaG5lc3M7XG5cdFx0aWYgKCB0aGlzLm1ldGFsbmVzcyAhPT0gdW5kZWZpbmVkICkgZGF0YS5tZXRhbG5lc3MgPSB0aGlzLm1ldGFsbmVzcztcblxuXHRcdGlmICggdGhpcy5lbWlzc2l2ZSAmJiB0aGlzLmVtaXNzaXZlLmlzQ29sb3IgKSBkYXRhLmVtaXNzaXZlID0gdGhpcy5lbWlzc2l2ZS5nZXRIZXgoKTtcblx0XHRpZiAoIHRoaXMuZW1pc3NpdmVJbnRlbnNpdHkgIT09IDEgKSBkYXRhLmVtaXNzaXZlSW50ZW5zaXR5ID0gdGhpcy5lbWlzc2l2ZUludGVuc2l0eTtcblxuXHRcdGlmICggdGhpcy5zcGVjdWxhciAmJiB0aGlzLnNwZWN1bGFyLmlzQ29sb3IgKSBkYXRhLnNwZWN1bGFyID0gdGhpcy5zcGVjdWxhci5nZXRIZXgoKTtcblx0XHRpZiAoIHRoaXMuc2hpbmluZXNzICE9PSB1bmRlZmluZWQgKSBkYXRhLnNoaW5pbmVzcyA9IHRoaXMuc2hpbmluZXNzO1xuXHRcdGlmICggdGhpcy5jbGVhckNvYXQgIT09IHVuZGVmaW5lZCApIGRhdGEuY2xlYXJDb2F0ID0gdGhpcy5jbGVhckNvYXQ7XG5cdFx0aWYgKCB0aGlzLmNsZWFyQ29hdFJvdWdobmVzcyAhPT0gdW5kZWZpbmVkICkgZGF0YS5jbGVhckNvYXRSb3VnaG5lc3MgPSB0aGlzLmNsZWFyQ29hdFJvdWdobmVzcztcblxuXHRcdGlmICggdGhpcy5tYXAgJiYgdGhpcy5tYXAuaXNUZXh0dXJlICkgZGF0YS5tYXAgPSB0aGlzLm1hcC50b0pTT04oIG1ldGEgKS51dWlkO1xuXHRcdGlmICggdGhpcy5hbHBoYU1hcCAmJiB0aGlzLmFscGhhTWFwLmlzVGV4dHVyZSApIGRhdGEuYWxwaGFNYXAgPSB0aGlzLmFscGhhTWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7XG5cdFx0aWYgKCB0aGlzLmxpZ2h0TWFwICYmIHRoaXMubGlnaHRNYXAuaXNUZXh0dXJlICkgZGF0YS5saWdodE1hcCA9IHRoaXMubGlnaHRNYXAudG9KU09OKCBtZXRhICkudXVpZDtcblx0XHRpZiAoIHRoaXMuYnVtcE1hcCAmJiB0aGlzLmJ1bXBNYXAuaXNUZXh0dXJlICkge1xuXG5cdFx0XHRkYXRhLmJ1bXBNYXAgPSB0aGlzLmJ1bXBNYXAudG9KU09OKCBtZXRhICkudXVpZDtcblx0XHRcdGRhdGEuYnVtcFNjYWxlID0gdGhpcy5idW1wU2NhbGU7XG5cblx0XHR9XG5cdFx0aWYgKCB0aGlzLm5vcm1hbE1hcCAmJiB0aGlzLm5vcm1hbE1hcC5pc1RleHR1cmUgKSB7XG5cblx0XHRcdGRhdGEubm9ybWFsTWFwID0gdGhpcy5ub3JtYWxNYXAudG9KU09OKCBtZXRhICkudXVpZDtcblx0XHRcdGRhdGEubm9ybWFsU2NhbGUgPSB0aGlzLm5vcm1hbFNjYWxlLnRvQXJyYXkoKTtcblxuXHRcdH1cblx0XHRpZiAoIHRoaXMuZGlzcGxhY2VtZW50TWFwICYmIHRoaXMuZGlzcGxhY2VtZW50TWFwLmlzVGV4dHVyZSApIHtcblxuXHRcdFx0ZGF0YS5kaXNwbGFjZW1lbnRNYXAgPSB0aGlzLmRpc3BsYWNlbWVudE1hcC50b0pTT04oIG1ldGEgKS51dWlkO1xuXHRcdFx0ZGF0YS5kaXNwbGFjZW1lbnRTY2FsZSA9IHRoaXMuZGlzcGxhY2VtZW50U2NhbGU7XG5cdFx0XHRkYXRhLmRpc3BsYWNlbWVudEJpYXMgPSB0aGlzLmRpc3BsYWNlbWVudEJpYXM7XG5cblx0XHR9XG5cdFx0aWYgKCB0aGlzLnJvdWdobmVzc01hcCAmJiB0aGlzLnJvdWdobmVzc01hcC5pc1RleHR1cmUgKSBkYXRhLnJvdWdobmVzc01hcCA9IHRoaXMucm91Z2huZXNzTWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7XG5cdFx0aWYgKCB0aGlzLm1ldGFsbmVzc01hcCAmJiB0aGlzLm1ldGFsbmVzc01hcC5pc1RleHR1cmUgKSBkYXRhLm1ldGFsbmVzc01hcCA9IHRoaXMubWV0YWxuZXNzTWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7XG5cblx0XHRpZiAoIHRoaXMuZW1pc3NpdmVNYXAgJiYgdGhpcy5lbWlzc2l2ZU1hcC5pc1RleHR1cmUgKSBkYXRhLmVtaXNzaXZlTWFwID0gdGhpcy5lbWlzc2l2ZU1hcC50b0pTT04oIG1ldGEgKS51dWlkO1xuXHRcdGlmICggdGhpcy5zcGVjdWxhck1hcCAmJiB0aGlzLnNwZWN1bGFyTWFwLmlzVGV4dHVyZSApIGRhdGEuc3BlY3VsYXJNYXAgPSB0aGlzLnNwZWN1bGFyTWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7XG5cblx0XHRpZiAoIHRoaXMuZW52TWFwICYmIHRoaXMuZW52TWFwLmlzVGV4dHVyZSApIHtcblxuXHRcdFx0ZGF0YS5lbnZNYXAgPSB0aGlzLmVudk1hcC50b0pTT04oIG1ldGEgKS51dWlkO1xuXHRcdFx0ZGF0YS5yZWZsZWN0aXZpdHkgPSB0aGlzLnJlZmxlY3Rpdml0eTsgLy8gU2NhbGUgYmVoaW5kIGVudk1hcFxuXG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLmdyYWRpZW50TWFwICYmIHRoaXMuZ3JhZGllbnRNYXAuaXNUZXh0dXJlICkge1xuXG5cdFx0XHRkYXRhLmdyYWRpZW50TWFwID0gdGhpcy5ncmFkaWVudE1hcC50b0pTT04oIG1ldGEgKS51dWlkO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLnNpemUgIT09IHVuZGVmaW5lZCApIGRhdGEuc2l6ZSA9IHRoaXMuc2l6ZTtcblx0XHRpZiAoIHRoaXMuc2l6ZUF0dGVudWF0aW9uICE9PSB1bmRlZmluZWQgKSBkYXRhLnNpemVBdHRlbnVhdGlvbiA9IHRoaXMuc2l6ZUF0dGVudWF0aW9uO1xuXG5cdFx0aWYgKCB0aGlzLmJsZW5kaW5nICE9PSBOb3JtYWxCbGVuZGluZyApIGRhdGEuYmxlbmRpbmcgPSB0aGlzLmJsZW5kaW5nO1xuXHRcdGlmICggdGhpcy5mbGF0U2hhZGluZyA9PT0gdHJ1ZSApIGRhdGEuZmxhdFNoYWRpbmcgPSB0aGlzLmZsYXRTaGFkaW5nO1xuXHRcdGlmICggdGhpcy5zaWRlICE9PSBGcm9udFNpZGUgKSBkYXRhLnNpZGUgPSB0aGlzLnNpZGU7XG5cdFx0aWYgKCB0aGlzLnZlcnRleENvbG9ycyAhPT0gTm9Db2xvcnMgKSBkYXRhLnZlcnRleENvbG9ycyA9IHRoaXMudmVydGV4Q29sb3JzO1xuXG5cdFx0aWYgKCB0aGlzLm9wYWNpdHkgPCAxICkgZGF0YS5vcGFjaXR5ID0gdGhpcy5vcGFjaXR5O1xuXHRcdGlmICggdGhpcy50cmFuc3BhcmVudCA9PT0gdHJ1ZSApIGRhdGEudHJhbnNwYXJlbnQgPSB0aGlzLnRyYW5zcGFyZW50O1xuXG5cdFx0ZGF0YS5kZXB0aEZ1bmMgPSB0aGlzLmRlcHRoRnVuYztcblx0XHRkYXRhLmRlcHRoVGVzdCA9IHRoaXMuZGVwdGhUZXN0O1xuXHRcdGRhdGEuZGVwdGhXcml0ZSA9IHRoaXMuZGVwdGhXcml0ZTtcblxuXHRcdC8vIHJvdGF0aW9uIChTcHJpdGVNYXRlcmlhbClcblx0XHRpZiAoIHRoaXMucm90YXRpb24gIT09IDAgKSBkYXRhLnJvdGF0aW9uID0gdGhpcy5yb3RhdGlvbjtcblxuXHRcdGlmICggdGhpcy5saW5ld2lkdGggIT09IDEgKSBkYXRhLmxpbmV3aWR0aCA9IHRoaXMubGluZXdpZHRoO1xuXHRcdGlmICggdGhpcy5kYXNoU2l6ZSAhPT0gdW5kZWZpbmVkICkgZGF0YS5kYXNoU2l6ZSA9IHRoaXMuZGFzaFNpemU7XG5cdFx0aWYgKCB0aGlzLmdhcFNpemUgIT09IHVuZGVmaW5lZCApIGRhdGEuZ2FwU2l6ZSA9IHRoaXMuZ2FwU2l6ZTtcblx0XHRpZiAoIHRoaXMuc2NhbGUgIT09IHVuZGVmaW5lZCApIGRhdGEuc2NhbGUgPSB0aGlzLnNjYWxlO1xuXG5cdFx0aWYgKCB0aGlzLmRpdGhlcmluZyA9PT0gdHJ1ZSApIGRhdGEuZGl0aGVyaW5nID0gdHJ1ZTtcblxuXHRcdGlmICggdGhpcy5hbHBoYVRlc3QgPiAwICkgZGF0YS5hbHBoYVRlc3QgPSB0aGlzLmFscGhhVGVzdDtcblx0XHRpZiAoIHRoaXMucHJlbXVsdGlwbGllZEFscGhhID09PSB0cnVlICkgZGF0YS5wcmVtdWx0aXBsaWVkQWxwaGEgPSB0aGlzLnByZW11bHRpcGxpZWRBbHBoYTtcblxuXHRcdGlmICggdGhpcy53aXJlZnJhbWUgPT09IHRydWUgKSBkYXRhLndpcmVmcmFtZSA9IHRoaXMud2lyZWZyYW1lO1xuXHRcdGlmICggdGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPiAxICkgZGF0YS53aXJlZnJhbWVMaW5ld2lkdGggPSB0aGlzLndpcmVmcmFtZUxpbmV3aWR0aDtcblx0XHRpZiAoIHRoaXMud2lyZWZyYW1lTGluZWNhcCAhPT0gJ3JvdW5kJyApIGRhdGEud2lyZWZyYW1lTGluZWNhcCA9IHRoaXMud2lyZWZyYW1lTGluZWNhcDtcblx0XHRpZiAoIHRoaXMud2lyZWZyYW1lTGluZWpvaW4gIT09ICdyb3VuZCcgKSBkYXRhLndpcmVmcmFtZUxpbmVqb2luID0gdGhpcy53aXJlZnJhbWVMaW5lam9pbjtcblxuXHRcdGlmICggdGhpcy5tb3JwaFRhcmdldHMgPT09IHRydWUgKSBkYXRhLm1vcnBoVGFyZ2V0cyA9IHRydWU7XG5cdFx0aWYgKCB0aGlzLnNraW5uaW5nID09PSB0cnVlICkgZGF0YS5za2lubmluZyA9IHRydWU7XG5cblx0XHRpZiAoIHRoaXMudmlzaWJsZSA9PT0gZmFsc2UgKSBkYXRhLnZpc2libGUgPSBmYWxzZTtcblx0XHRpZiAoIEpTT04uc3RyaW5naWZ5KCB0aGlzLnVzZXJEYXRhICkgIT09ICd7fScgKSBkYXRhLnVzZXJEYXRhID0gdGhpcy51c2VyRGF0YTtcblxuXHRcdC8vIFRPRE86IENvcGllZCBmcm9tIE9iamVjdDNELnRvSlNPTlxuXG5cdFx0ZnVuY3Rpb24gZXh0cmFjdEZyb21DYWNoZSggY2FjaGUgKSB7XG5cblx0XHRcdHZhciB2YWx1ZXMgPSBbXTtcblxuXHRcdFx0Zm9yICggdmFyIGtleSBpbiBjYWNoZSApIHtcblxuXHRcdFx0XHR2YXIgZGF0YSA9IGNhY2hlWyBrZXkgXTtcblx0XHRcdFx0ZGVsZXRlIGRhdGEubWV0YWRhdGE7XG5cdFx0XHRcdHZhbHVlcy5wdXNoKCBkYXRhICk7XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHZhbHVlcztcblxuXHRcdH1cblxuXHRcdGlmICggaXNSb290ICkge1xuXG5cdFx0XHR2YXIgdGV4dHVyZXMgPSBleHRyYWN0RnJvbUNhY2hlKCBtZXRhLnRleHR1cmVzICk7XG5cdFx0XHR2YXIgaW1hZ2VzID0gZXh0cmFjdEZyb21DYWNoZSggbWV0YS5pbWFnZXMgKTtcblxuXHRcdFx0aWYgKCB0ZXh0dXJlcy5sZW5ndGggPiAwICkgZGF0YS50ZXh0dXJlcyA9IHRleHR1cmVzO1xuXHRcdFx0aWYgKCBpbWFnZXMubGVuZ3RoID4gMCApIGRhdGEuaW1hZ2VzID0gaW1hZ2VzO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGRhdGE7XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHR0aGlzLm5hbWUgPSBzb3VyY2UubmFtZTtcblxuXHRcdHRoaXMuZm9nID0gc291cmNlLmZvZztcblx0XHR0aGlzLmxpZ2h0cyA9IHNvdXJjZS5saWdodHM7XG5cblx0XHR0aGlzLmJsZW5kaW5nID0gc291cmNlLmJsZW5kaW5nO1xuXHRcdHRoaXMuc2lkZSA9IHNvdXJjZS5zaWRlO1xuXHRcdHRoaXMuZmxhdFNoYWRpbmcgPSBzb3VyY2UuZmxhdFNoYWRpbmc7XG5cdFx0dGhpcy52ZXJ0ZXhDb2xvcnMgPSBzb3VyY2UudmVydGV4Q29sb3JzO1xuXG5cdFx0dGhpcy5vcGFjaXR5ID0gc291cmNlLm9wYWNpdHk7XG5cdFx0dGhpcy50cmFuc3BhcmVudCA9IHNvdXJjZS50cmFuc3BhcmVudDtcblxuXHRcdHRoaXMuYmxlbmRTcmMgPSBzb3VyY2UuYmxlbmRTcmM7XG5cdFx0dGhpcy5ibGVuZERzdCA9IHNvdXJjZS5ibGVuZERzdDtcblx0XHR0aGlzLmJsZW5kRXF1YXRpb24gPSBzb3VyY2UuYmxlbmRFcXVhdGlvbjtcblx0XHR0aGlzLmJsZW5kU3JjQWxwaGEgPSBzb3VyY2UuYmxlbmRTcmNBbHBoYTtcblx0XHR0aGlzLmJsZW5kRHN0QWxwaGEgPSBzb3VyY2UuYmxlbmREc3RBbHBoYTtcblx0XHR0aGlzLmJsZW5kRXF1YXRpb25BbHBoYSA9IHNvdXJjZS5ibGVuZEVxdWF0aW9uQWxwaGE7XG5cblx0XHR0aGlzLmRlcHRoRnVuYyA9IHNvdXJjZS5kZXB0aEZ1bmM7XG5cdFx0dGhpcy5kZXB0aFRlc3QgPSBzb3VyY2UuZGVwdGhUZXN0O1xuXHRcdHRoaXMuZGVwdGhXcml0ZSA9IHNvdXJjZS5kZXB0aFdyaXRlO1xuXG5cdFx0dGhpcy5jb2xvcldyaXRlID0gc291cmNlLmNvbG9yV3JpdGU7XG5cblx0XHR0aGlzLnByZWNpc2lvbiA9IHNvdXJjZS5wcmVjaXNpb247XG5cblx0XHR0aGlzLnBvbHlnb25PZmZzZXQgPSBzb3VyY2UucG9seWdvbk9mZnNldDtcblx0XHR0aGlzLnBvbHlnb25PZmZzZXRGYWN0b3IgPSBzb3VyY2UucG9seWdvbk9mZnNldEZhY3Rvcjtcblx0XHR0aGlzLnBvbHlnb25PZmZzZXRVbml0cyA9IHNvdXJjZS5wb2x5Z29uT2Zmc2V0VW5pdHM7XG5cblx0XHR0aGlzLmRpdGhlcmluZyA9IHNvdXJjZS5kaXRoZXJpbmc7XG5cblx0XHR0aGlzLmFscGhhVGVzdCA9IHNvdXJjZS5hbHBoYVRlc3Q7XG5cdFx0dGhpcy5wcmVtdWx0aXBsaWVkQWxwaGEgPSBzb3VyY2UucHJlbXVsdGlwbGllZEFscGhhO1xuXG5cdFx0dGhpcy5vdmVyZHJhdyA9IHNvdXJjZS5vdmVyZHJhdztcblxuXHRcdHRoaXMudmlzaWJsZSA9IHNvdXJjZS52aXNpYmxlO1xuXHRcdHRoaXMudXNlckRhdGEgPSBKU09OLnBhcnNlKCBKU09OLnN0cmluZ2lmeSggc291cmNlLnVzZXJEYXRhICkgKTtcblxuXHRcdHRoaXMuY2xpcFNoYWRvd3MgPSBzb3VyY2UuY2xpcFNoYWRvd3M7XG5cdFx0dGhpcy5jbGlwSW50ZXJzZWN0aW9uID0gc291cmNlLmNsaXBJbnRlcnNlY3Rpb247XG5cblx0XHR2YXIgc3JjUGxhbmVzID0gc291cmNlLmNsaXBwaW5nUGxhbmVzLFxuXHRcdFx0ZHN0UGxhbmVzID0gbnVsbDtcblxuXHRcdGlmICggc3JjUGxhbmVzICE9PSBudWxsICkge1xuXG5cdFx0XHR2YXIgbiA9IHNyY1BsYW5lcy5sZW5ndGg7XG5cdFx0XHRkc3RQbGFuZXMgPSBuZXcgQXJyYXkoIG4gKTtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpICE9PSBuOyArKyBpIClcblx0XHRcdFx0ZHN0UGxhbmVzWyBpIF0gPSBzcmNQbGFuZXNbIGkgXS5jbG9uZSgpO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5jbGlwcGluZ1BsYW5lcyA9IGRzdFBsYW5lcztcblxuXHRcdHRoaXMuc2hhZG93U2lkZSA9IHNvdXJjZS5zaGFkb3dTaWRlO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRkaXNwb3NlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLmRpc3BhdGNoRXZlbnQoIHsgdHlwZTogJ2Rpc3Bvc2UnIH0gKTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqXG4gKiBwYXJhbWV0ZXJzID0ge1xuICogIGNvbG9yOiA8aGV4PixcbiAqICBvcGFjaXR5OiA8ZmxvYXQ+LFxuICogIG1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgbGlnaHRNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKiAgbGlnaHRNYXBJbnRlbnNpdHk6IDxmbG9hdD5cbiAqXG4gKiAgYW9NYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKiAgYW9NYXBJbnRlbnNpdHk6IDxmbG9hdD5cbiAqXG4gKiAgc3BlY3VsYXJNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIGFscGhhTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBlbnZNYXA6IG5ldyBUSFJFRS5DdWJlVGV4dHVyZSggW3Bvc3gsIG5lZ3gsIHBvc3ksIG5lZ3ksIHBvc3osIG5lZ3pdICksXG4gKiAgY29tYmluZTogVEhSRUUuTXVsdGlwbHksXG4gKiAgcmVmbGVjdGl2aXR5OiA8ZmxvYXQ+LFxuICogIHJlZnJhY3Rpb25SYXRpbzogPGZsb2F0PixcbiAqXG4gKiAgZGVwdGhUZXN0OiA8Ym9vbD4sXG4gKiAgZGVwdGhXcml0ZTogPGJvb2w+LFxuICpcbiAqICB3aXJlZnJhbWU6IDxib29sZWFuPixcbiAqICB3aXJlZnJhbWVMaW5ld2lkdGg6IDxmbG9hdD4sXG4gKlxuICogIHNraW5uaW5nOiA8Ym9vbD4sXG4gKiAgbW9ycGhUYXJnZXRzOiA8Ym9vbD5cbiAqIH1cbiAqL1xuXG5mdW5jdGlvbiBNZXNoQmFzaWNNYXRlcmlhbCggcGFyYW1ldGVycyApIHtcblxuXHRNYXRlcmlhbC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ01lc2hCYXNpY01hdGVyaWFsJztcblxuXHR0aGlzLmNvbG9yID0gbmV3IENvbG9yKCAweGZmZmZmZiApOyAvLyBlbWlzc2l2ZVxuXG5cdHRoaXMubWFwID0gbnVsbDtcblxuXHR0aGlzLmxpZ2h0TWFwID0gbnVsbDtcblx0dGhpcy5saWdodE1hcEludGVuc2l0eSA9IDEuMDtcblxuXHR0aGlzLmFvTWFwID0gbnVsbDtcblx0dGhpcy5hb01hcEludGVuc2l0eSA9IDEuMDtcblxuXHR0aGlzLnNwZWN1bGFyTWFwID0gbnVsbDtcblxuXHR0aGlzLmFscGhhTWFwID0gbnVsbDtcblxuXHR0aGlzLmVudk1hcCA9IG51bGw7XG5cdHRoaXMuY29tYmluZSA9IE11bHRpcGx5T3BlcmF0aW9uO1xuXHR0aGlzLnJlZmxlY3Rpdml0eSA9IDE7XG5cdHRoaXMucmVmcmFjdGlvblJhdGlvID0gMC45ODtcblxuXHR0aGlzLndpcmVmcmFtZSA9IGZhbHNlO1xuXHR0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IDE7XG5cdHRoaXMud2lyZWZyYW1lTGluZWNhcCA9ICdyb3VuZCc7XG5cdHRoaXMud2lyZWZyYW1lTGluZWpvaW4gPSAncm91bmQnO1xuXG5cdHRoaXMuc2tpbm5pbmcgPSBmYWxzZTtcblx0dGhpcy5tb3JwaFRhcmdldHMgPSBmYWxzZTtcblxuXHR0aGlzLmxpZ2h0cyA9IGZhbHNlO1xuXG5cdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XG5cbn1cblxuTWVzaEJhc2ljTWF0ZXJpYWwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTWF0ZXJpYWwucHJvdG90eXBlICk7XG5NZXNoQmFzaWNNYXRlcmlhbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNZXNoQmFzaWNNYXRlcmlhbDtcblxuTWVzaEJhc2ljTWF0ZXJpYWwucHJvdG90eXBlLmlzTWVzaEJhc2ljTWF0ZXJpYWwgPSB0cnVlO1xuXG5NZXNoQmFzaWNNYXRlcmlhbC5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMuY29sb3IuY29weSggc291cmNlLmNvbG9yICk7XG5cblx0dGhpcy5tYXAgPSBzb3VyY2UubWFwO1xuXG5cdHRoaXMubGlnaHRNYXAgPSBzb3VyY2UubGlnaHRNYXA7XG5cdHRoaXMubGlnaHRNYXBJbnRlbnNpdHkgPSBzb3VyY2UubGlnaHRNYXBJbnRlbnNpdHk7XG5cblx0dGhpcy5hb01hcCA9IHNvdXJjZS5hb01hcDtcblx0dGhpcy5hb01hcEludGVuc2l0eSA9IHNvdXJjZS5hb01hcEludGVuc2l0eTtcblxuXHR0aGlzLnNwZWN1bGFyTWFwID0gc291cmNlLnNwZWN1bGFyTWFwO1xuXG5cdHRoaXMuYWxwaGFNYXAgPSBzb3VyY2UuYWxwaGFNYXA7XG5cblx0dGhpcy5lbnZNYXAgPSBzb3VyY2UuZW52TWFwO1xuXHR0aGlzLmNvbWJpbmUgPSBzb3VyY2UuY29tYmluZTtcblx0dGhpcy5yZWZsZWN0aXZpdHkgPSBzb3VyY2UucmVmbGVjdGl2aXR5O1xuXHR0aGlzLnJlZnJhY3Rpb25SYXRpbyA9IHNvdXJjZS5yZWZyYWN0aW9uUmF0aW87XG5cblx0dGhpcy53aXJlZnJhbWUgPSBzb3VyY2Uud2lyZWZyYW1lO1xuXHR0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IHNvdXJjZS53aXJlZnJhbWVMaW5ld2lkdGg7XG5cdHRoaXMud2lyZWZyYW1lTGluZWNhcCA9IHNvdXJjZS53aXJlZnJhbWVMaW5lY2FwO1xuXHR0aGlzLndpcmVmcmFtZUxpbmVqb2luID0gc291cmNlLndpcmVmcmFtZUxpbmVqb2luO1xuXG5cdHRoaXMuc2tpbm5pbmcgPSBzb3VyY2Uuc2tpbm5pbmc7XG5cdHRoaXMubW9ycGhUYXJnZXRzID0gc291cmNlLm1vcnBoVGFyZ2V0cztcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICpcbiAqIHBhcmFtZXRlcnMgPSB7XG4gKiAgZGVmaW5lczogeyBcImxhYmVsXCIgOiBcInZhbHVlXCIgfSxcbiAqICB1bmlmb3JtczogeyBcInBhcmFtZXRlcjFcIjogeyB2YWx1ZTogMS4wIH0sIFwicGFyYW1ldGVyMlwiOiB7IHZhbHVlMjogMiB9IH0sXG4gKlxuICogIGZyYWdtZW50U2hhZGVyOiA8c3RyaW5nPixcbiAqICB2ZXJ0ZXhTaGFkZXI6IDxzdHJpbmc+LFxuICpcbiAqICB3aXJlZnJhbWU6IDxib29sZWFuPixcbiAqICB3aXJlZnJhbWVMaW5ld2lkdGg6IDxmbG9hdD4sXG4gKlxuICogIGxpZ2h0czogPGJvb2w+LFxuICpcbiAqICBza2lubmluZzogPGJvb2w+LFxuICogIG1vcnBoVGFyZ2V0czogPGJvb2w+LFxuICogIG1vcnBoTm9ybWFsczogPGJvb2w+XG4gKiB9XG4gKi9cblxuZnVuY3Rpb24gU2hhZGVyTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7XG5cblx0TWF0ZXJpYWwuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdTaGFkZXJNYXRlcmlhbCc7XG5cblx0dGhpcy5kZWZpbmVzID0ge307XG5cdHRoaXMudW5pZm9ybXMgPSB7fTtcblxuXHR0aGlzLnZlcnRleFNoYWRlciA9ICd2b2lkIG1haW4oKSB7XFxuXFx0Z2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbW9kZWxWaWV3TWF0cml4ICogdmVjNCggcG9zaXRpb24sIDEuMCApO1xcbn0nO1xuXHR0aGlzLmZyYWdtZW50U2hhZGVyID0gJ3ZvaWQgbWFpbigpIHtcXG5cXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KCAxLjAsIDAuMCwgMC4wLCAxLjAgKTtcXG59JztcblxuXHR0aGlzLmxpbmV3aWR0aCA9IDE7XG5cblx0dGhpcy53aXJlZnJhbWUgPSBmYWxzZTtcblx0dGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSAxO1xuXG5cdHRoaXMuZm9nID0gZmFsc2U7IC8vIHNldCB0byB1c2Ugc2NlbmUgZm9nXG5cdHRoaXMubGlnaHRzID0gZmFsc2U7IC8vIHNldCB0byB1c2Ugc2NlbmUgbGlnaHRzXG5cdHRoaXMuY2xpcHBpbmcgPSBmYWxzZTsgLy8gc2V0IHRvIHVzZSB1c2VyLWRlZmluZWQgY2xpcHBpbmcgcGxhbmVzXG5cblx0dGhpcy5za2lubmluZyA9IGZhbHNlOyAvLyBzZXQgdG8gdXNlIHNraW5uaW5nIGF0dHJpYnV0ZSBzdHJlYW1zXG5cdHRoaXMubW9ycGhUYXJnZXRzID0gZmFsc2U7IC8vIHNldCB0byB1c2UgbW9ycGggdGFyZ2V0c1xuXHR0aGlzLm1vcnBoTm9ybWFscyA9IGZhbHNlOyAvLyBzZXQgdG8gdXNlIG1vcnBoIG5vcm1hbHNcblxuXHR0aGlzLmV4dGVuc2lvbnMgPSB7XG5cdFx0ZGVyaXZhdGl2ZXM6IGZhbHNlLCAvLyBzZXQgdG8gdXNlIGRlcml2YXRpdmVzXG5cdFx0ZnJhZ0RlcHRoOiBmYWxzZSwgLy8gc2V0IHRvIHVzZSBmcmFnbWVudCBkZXB0aCB2YWx1ZXNcblx0XHRkcmF3QnVmZmVyczogZmFsc2UsIC8vIHNldCB0byB1c2UgZHJhdyBidWZmZXJzXG5cdFx0c2hhZGVyVGV4dHVyZUxPRDogZmFsc2UgLy8gc2V0IHRvIHVzZSBzaGFkZXIgdGV4dHVyZSBMT0Rcblx0fTtcblxuXHQvLyBXaGVuIHJlbmRlcmVkIGdlb21ldHJ5IGRvZXNuJ3QgaW5jbHVkZSB0aGVzZSBhdHRyaWJ1dGVzIGJ1dCB0aGUgbWF0ZXJpYWwgZG9lcyxcblx0Ly8gdXNlIHRoZXNlIGRlZmF1bHQgdmFsdWVzIGluIFdlYkdMLiBUaGlzIGF2b2lkcyBlcnJvcnMgd2hlbiBidWZmZXIgZGF0YSBpcyBtaXNzaW5nLlxuXHR0aGlzLmRlZmF1bHRBdHRyaWJ1dGVWYWx1ZXMgPSB7XG5cdFx0J2NvbG9yJzogWyAxLCAxLCAxIF0sXG5cdFx0J3V2JzogWyAwLCAwIF0sXG5cdFx0J3V2Mic6IFsgMCwgMCBdXG5cdH07XG5cblx0dGhpcy5pbmRleDBBdHRyaWJ1dGVOYW1lID0gdW5kZWZpbmVkO1xuXHR0aGlzLnVuaWZvcm1zTmVlZFVwZGF0ZSA9IGZhbHNlO1xuXG5cdGlmICggcGFyYW1ldGVycyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0aWYgKCBwYXJhbWV0ZXJzLmF0dHJpYnV0ZXMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlNoYWRlck1hdGVyaWFsOiBhdHRyaWJ1dGVzIHNob3VsZCBub3cgYmUgZGVmaW5lZCBpbiBUSFJFRS5CdWZmZXJHZW9tZXRyeSBpbnN0ZWFkLicgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XG5cblx0fVxuXG59XG5cblNoYWRlck1hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE1hdGVyaWFsLnByb3RvdHlwZSApO1xuU2hhZGVyTWF0ZXJpYWwucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU2hhZGVyTWF0ZXJpYWw7XG5cblNoYWRlck1hdGVyaWFsLnByb3RvdHlwZS5pc1NoYWRlck1hdGVyaWFsID0gdHJ1ZTtcblxuU2hhZGVyTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRNYXRlcmlhbC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHR0aGlzLmZyYWdtZW50U2hhZGVyID0gc291cmNlLmZyYWdtZW50U2hhZGVyO1xuXHR0aGlzLnZlcnRleFNoYWRlciA9IHNvdXJjZS52ZXJ0ZXhTaGFkZXI7XG5cblx0dGhpcy51bmlmb3JtcyA9IFVuaWZvcm1zVXRpbHMuY2xvbmUoIHNvdXJjZS51bmlmb3JtcyApO1xuXG5cdHRoaXMuZGVmaW5lcyA9IE9iamVjdC5hc3NpZ24oIHt9LCBzb3VyY2UuZGVmaW5lcyApO1xuXG5cdHRoaXMud2lyZWZyYW1lID0gc291cmNlLndpcmVmcmFtZTtcblx0dGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSBzb3VyY2Uud2lyZWZyYW1lTGluZXdpZHRoO1xuXG5cdHRoaXMubGlnaHRzID0gc291cmNlLmxpZ2h0cztcblx0dGhpcy5jbGlwcGluZyA9IHNvdXJjZS5jbGlwcGluZztcblxuXHR0aGlzLnNraW5uaW5nID0gc291cmNlLnNraW5uaW5nO1xuXG5cdHRoaXMubW9ycGhUYXJnZXRzID0gc291cmNlLm1vcnBoVGFyZ2V0cztcblx0dGhpcy5tb3JwaE5vcm1hbHMgPSBzb3VyY2UubW9ycGhOb3JtYWxzO1xuXG5cdHRoaXMuZXh0ZW5zaW9ucyA9IHNvdXJjZS5leHRlbnNpb25zO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG5TaGFkZXJNYXRlcmlhbC5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gKCBtZXRhICkge1xuXG5cdHZhciBkYXRhID0gTWF0ZXJpYWwucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzLCBtZXRhICk7XG5cblx0ZGF0YS51bmlmb3JtcyA9IHRoaXMudW5pZm9ybXM7XG5cdGRhdGEudmVydGV4U2hhZGVyID0gdGhpcy52ZXJ0ZXhTaGFkZXI7XG5cdGRhdGEuZnJhZ21lbnRTaGFkZXIgPSB0aGlzLmZyYWdtZW50U2hhZGVyO1xuXG5cdHJldHVybiBkYXRhO1xuXG59O1xuXG4vKipcbiAqIEBhdXRob3IgYmhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW9cbiAqL1xuXG5mdW5jdGlvbiBSYXkoIG9yaWdpbiwgZGlyZWN0aW9uICkge1xuXG5cdHRoaXMub3JpZ2luID0gKCBvcmlnaW4gIT09IHVuZGVmaW5lZCApID8gb3JpZ2luIDogbmV3IFZlY3RvcjMoKTtcblx0dGhpcy5kaXJlY3Rpb24gPSAoIGRpcmVjdGlvbiAhPT0gdW5kZWZpbmVkICkgPyBkaXJlY3Rpb24gOiBuZXcgVmVjdG9yMygpO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIFJheS5wcm90b3R5cGUsIHtcblxuXHRzZXQ6IGZ1bmN0aW9uICggb3JpZ2luLCBkaXJlY3Rpb24gKSB7XG5cblx0XHR0aGlzLm9yaWdpbi5jb3B5KCBvcmlnaW4gKTtcblx0XHR0aGlzLmRpcmVjdGlvbi5jb3B5KCBkaXJlY3Rpb24gKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggcmF5ICkge1xuXG5cdFx0dGhpcy5vcmlnaW4uY29weSggcmF5Lm9yaWdpbiApO1xuXHRcdHRoaXMuZGlyZWN0aW9uLmNvcHkoIHJheS5kaXJlY3Rpb24gKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YXQ6IGZ1bmN0aW9uICggdCwgdGFyZ2V0ICkge1xuXG5cdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuUmF5OiAuYXQoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApO1xuXHRcdFx0dGFyZ2V0ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0YXJnZXQuY29weSggdGhpcy5kaXJlY3Rpb24gKS5tdWx0aXBseVNjYWxhciggdCApLmFkZCggdGhpcy5vcmlnaW4gKTtcblxuXHR9LFxuXG5cdGxvb2tBdDogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0dGhpcy5kaXJlY3Rpb24uY29weSggdiApLnN1YiggdGhpcy5vcmlnaW4gKS5ub3JtYWxpemUoKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0cmVjYXN0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHJlY2FzdCggdCApIHtcblxuXHRcdFx0dGhpcy5vcmlnaW4uY29weSggdGhpcy5hdCggdCwgdjEgKSApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGNsb3Nlc3RQb2ludFRvUG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQsIHRhcmdldCApIHtcblxuXHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlJheTogLmNsb3Nlc3RQb2ludFRvUG9pbnQoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApO1xuXHRcdFx0dGFyZ2V0ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdH1cblxuXHRcdHRhcmdldC5zdWJWZWN0b3JzKCBwb2ludCwgdGhpcy5vcmlnaW4gKTtcblxuXHRcdHZhciBkaXJlY3Rpb25EaXN0YW5jZSA9IHRhcmdldC5kb3QoIHRoaXMuZGlyZWN0aW9uICk7XG5cblx0XHRpZiAoIGRpcmVjdGlvbkRpc3RhbmNlIDwgMCApIHtcblxuXHRcdFx0cmV0dXJuIHRhcmdldC5jb3B5KCB0aGlzLm9yaWdpbiApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRhcmdldC5jb3B5KCB0aGlzLmRpcmVjdGlvbiApLm11bHRpcGx5U2NhbGFyKCBkaXJlY3Rpb25EaXN0YW5jZSApLmFkZCggdGhpcy5vcmlnaW4gKTtcblxuXHR9LFxuXG5cdGRpc3RhbmNlVG9Qb2ludDogZnVuY3Rpb24gKCBwb2ludCApIHtcblxuXHRcdHJldHVybiBNYXRoLnNxcnQoIHRoaXMuZGlzdGFuY2VTcVRvUG9pbnQoIHBvaW50ICkgKTtcblxuXHR9LFxuXG5cdGRpc3RhbmNlU3FUb1BvaW50OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGRpc3RhbmNlU3FUb1BvaW50KCBwb2ludCApIHtcblxuXHRcdFx0dmFyIGRpcmVjdGlvbkRpc3RhbmNlID0gdjEuc3ViVmVjdG9ycyggcG9pbnQsIHRoaXMub3JpZ2luICkuZG90KCB0aGlzLmRpcmVjdGlvbiApO1xuXG5cdFx0XHQvLyBwb2ludCBiZWhpbmQgdGhlIHJheVxuXG5cdFx0XHRpZiAoIGRpcmVjdGlvbkRpc3RhbmNlIDwgMCApIHtcblxuXHRcdFx0XHRyZXR1cm4gdGhpcy5vcmlnaW4uZGlzdGFuY2VUb1NxdWFyZWQoIHBvaW50ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0djEuY29weSggdGhpcy5kaXJlY3Rpb24gKS5tdWx0aXBseVNjYWxhciggZGlyZWN0aW9uRGlzdGFuY2UgKS5hZGQoIHRoaXMub3JpZ2luICk7XG5cblx0XHRcdHJldHVybiB2MS5kaXN0YW5jZVRvU3F1YXJlZCggcG9pbnQgKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGRpc3RhbmNlU3FUb1NlZ21lbnQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBzZWdDZW50ZXIgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciBzZWdEaXIgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciBkaWZmID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBkaXN0YW5jZVNxVG9TZWdtZW50KCB2MCwgdjEsIG9wdGlvbmFsUG9pbnRPblJheSwgb3B0aW9uYWxQb2ludE9uU2VnbWVudCApIHtcblxuXHRcdFx0Ly8gZnJvbSBodHRwOi8vd3d3Lmdlb21ldHJpY3Rvb2xzLmNvbS9HVEVuZ2luZS9JbmNsdWRlL01hdGhlbWF0aWNzL0d0ZURpc3RSYXlTZWdtZW50Lmhcblx0XHRcdC8vIEl0IHJldHVybnMgdGhlIG1pbiBkaXN0YW5jZSBiZXR3ZWVuIHRoZSByYXkgYW5kIHRoZSBzZWdtZW50XG5cdFx0XHQvLyBkZWZpbmVkIGJ5IHYwIGFuZCB2MVxuXHRcdFx0Ly8gSXQgY2FuIGFsc28gc2V0IHR3byBvcHRpb25hbCB0YXJnZXRzIDpcblx0XHRcdC8vIC0gVGhlIGNsb3Nlc3QgcG9pbnQgb24gdGhlIHJheVxuXHRcdFx0Ly8gLSBUaGUgY2xvc2VzdCBwb2ludCBvbiB0aGUgc2VnbWVudFxuXG5cdFx0XHRzZWdDZW50ZXIuY29weSggdjAgKS5hZGQoIHYxICkubXVsdGlwbHlTY2FsYXIoIDAuNSApO1xuXHRcdFx0c2VnRGlyLmNvcHkoIHYxICkuc3ViKCB2MCApLm5vcm1hbGl6ZSgpO1xuXHRcdFx0ZGlmZi5jb3B5KCB0aGlzLm9yaWdpbiApLnN1Yiggc2VnQ2VudGVyICk7XG5cblx0XHRcdHZhciBzZWdFeHRlbnQgPSB2MC5kaXN0YW5jZVRvKCB2MSApICogMC41O1xuXHRcdFx0dmFyIGEwMSA9IC0gdGhpcy5kaXJlY3Rpb24uZG90KCBzZWdEaXIgKTtcblx0XHRcdHZhciBiMCA9IGRpZmYuZG90KCB0aGlzLmRpcmVjdGlvbiApO1xuXHRcdFx0dmFyIGIxID0gLSBkaWZmLmRvdCggc2VnRGlyICk7XG5cdFx0XHR2YXIgYyA9IGRpZmYubGVuZ3RoU3EoKTtcblx0XHRcdHZhciBkZXQgPSBNYXRoLmFicyggMSAtIGEwMSAqIGEwMSApO1xuXHRcdFx0dmFyIHMwLCBzMSwgc3FyRGlzdCwgZXh0RGV0O1xuXG5cdFx0XHRpZiAoIGRldCA+IDAgKSB7XG5cblx0XHRcdFx0Ly8gVGhlIHJheSBhbmQgc2VnbWVudCBhcmUgbm90IHBhcmFsbGVsLlxuXG5cdFx0XHRcdHMwID0gYTAxICogYjEgLSBiMDtcblx0XHRcdFx0czEgPSBhMDEgKiBiMCAtIGIxO1xuXHRcdFx0XHRleHREZXQgPSBzZWdFeHRlbnQgKiBkZXQ7XG5cblx0XHRcdFx0aWYgKCBzMCA+PSAwICkge1xuXG5cdFx0XHRcdFx0aWYgKCBzMSA+PSAtIGV4dERldCApIHtcblxuXHRcdFx0XHRcdFx0aWYgKCBzMSA8PSBleHREZXQgKSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gcmVnaW9uIDBcblx0XHRcdFx0XHRcdFx0Ly8gTWluaW11bSBhdCBpbnRlcmlvciBwb2ludHMgb2YgcmF5IGFuZCBzZWdtZW50LlxuXG5cdFx0XHRcdFx0XHRcdHZhciBpbnZEZXQgPSAxIC8gZGV0O1xuXHRcdFx0XHRcdFx0XHRzMCAqPSBpbnZEZXQ7XG5cdFx0XHRcdFx0XHRcdHMxICo9IGludkRldDtcblx0XHRcdFx0XHRcdFx0c3FyRGlzdCA9IHMwICogKCBzMCArIGEwMSAqIHMxICsgMiAqIGIwICkgKyBzMSAqICggYTAxICogczAgKyBzMSArIDIgKiBiMSApICsgYztcblxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0XHQvLyByZWdpb24gMVxuXG5cdFx0XHRcdFx0XHRcdHMxID0gc2VnRXh0ZW50O1xuXHRcdFx0XHRcdFx0XHRzMCA9IE1hdGgubWF4KCAwLCAtICggYTAxICogczEgKyBiMCApICk7XG5cdFx0XHRcdFx0XHRcdHNxckRpc3QgPSAtIHMwICogczAgKyBzMSAqICggczEgKyAyICogYjEgKSArIGM7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdC8vIHJlZ2lvbiA1XG5cblx0XHRcdFx0XHRcdHMxID0gLSBzZWdFeHRlbnQ7XG5cdFx0XHRcdFx0XHRzMCA9IE1hdGgubWF4KCAwLCAtICggYTAxICogczEgKyBiMCApICk7XG5cdFx0XHRcdFx0XHRzcXJEaXN0ID0gLSBzMCAqIHMwICsgczEgKiAoIHMxICsgMiAqIGIxICkgKyBjO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRpZiAoIHMxIDw9IC0gZXh0RGV0ICkge1xuXG5cdFx0XHRcdFx0XHQvLyByZWdpb24gNFxuXG5cdFx0XHRcdFx0XHRzMCA9IE1hdGgubWF4KCAwLCAtICggLSBhMDEgKiBzZWdFeHRlbnQgKyBiMCApICk7XG5cdFx0XHRcdFx0XHRzMSA9ICggczAgPiAwICkgPyAtIHNlZ0V4dGVudCA6IE1hdGgubWluKCBNYXRoLm1heCggLSBzZWdFeHRlbnQsIC0gYjEgKSwgc2VnRXh0ZW50ICk7XG5cdFx0XHRcdFx0XHRzcXJEaXN0ID0gLSBzMCAqIHMwICsgczEgKiAoIHMxICsgMiAqIGIxICkgKyBjO1xuXG5cdFx0XHRcdFx0fSBlbHNlIGlmICggczEgPD0gZXh0RGV0ICkge1xuXG5cdFx0XHRcdFx0XHQvLyByZWdpb24gM1xuXG5cdFx0XHRcdFx0XHRzMCA9IDA7XG5cdFx0XHRcdFx0XHRzMSA9IE1hdGgubWluKCBNYXRoLm1heCggLSBzZWdFeHRlbnQsIC0gYjEgKSwgc2VnRXh0ZW50ICk7XG5cdFx0XHRcdFx0XHRzcXJEaXN0ID0gczEgKiAoIHMxICsgMiAqIGIxICkgKyBjO1xuXG5cdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0Ly8gcmVnaW9uIDJcblxuXHRcdFx0XHRcdFx0czAgPSBNYXRoLm1heCggMCwgLSAoIGEwMSAqIHNlZ0V4dGVudCArIGIwICkgKTtcblx0XHRcdFx0XHRcdHMxID0gKCBzMCA+IDAgKSA/IHNlZ0V4dGVudCA6IE1hdGgubWluKCBNYXRoLm1heCggLSBzZWdFeHRlbnQsIC0gYjEgKSwgc2VnRXh0ZW50ICk7XG5cdFx0XHRcdFx0XHRzcXJEaXN0ID0gLSBzMCAqIHMwICsgczEgKiAoIHMxICsgMiAqIGIxICkgKyBjO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyBSYXkgYW5kIHNlZ21lbnQgYXJlIHBhcmFsbGVsLlxuXG5cdFx0XHRcdHMxID0gKCBhMDEgPiAwICkgPyAtIHNlZ0V4dGVudCA6IHNlZ0V4dGVudDtcblx0XHRcdFx0czAgPSBNYXRoLm1heCggMCwgLSAoIGEwMSAqIHMxICsgYjAgKSApO1xuXHRcdFx0XHRzcXJEaXN0ID0gLSBzMCAqIHMwICsgczEgKiAoIHMxICsgMiAqIGIxICkgKyBjO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggb3B0aW9uYWxQb2ludE9uUmF5ICkge1xuXG5cdFx0XHRcdG9wdGlvbmFsUG9pbnRPblJheS5jb3B5KCB0aGlzLmRpcmVjdGlvbiApLm11bHRpcGx5U2NhbGFyKCBzMCApLmFkZCggdGhpcy5vcmlnaW4gKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIG9wdGlvbmFsUG9pbnRPblNlZ21lbnQgKSB7XG5cblx0XHRcdFx0b3B0aW9uYWxQb2ludE9uU2VnbWVudC5jb3B5KCBzZWdEaXIgKS5tdWx0aXBseVNjYWxhciggczEgKS5hZGQoIHNlZ0NlbnRlciApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBzcXJEaXN0O1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0aW50ZXJzZWN0U3BoZXJlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGludGVyc2VjdFNwaGVyZSggc3BoZXJlLCB0YXJnZXQgKSB7XG5cblx0XHRcdHYxLnN1YlZlY3RvcnMoIHNwaGVyZS5jZW50ZXIsIHRoaXMub3JpZ2luICk7XG5cdFx0XHR2YXIgdGNhID0gdjEuZG90KCB0aGlzLmRpcmVjdGlvbiApO1xuXHRcdFx0dmFyIGQyID0gdjEuZG90KCB2MSApIC0gdGNhICogdGNhO1xuXHRcdFx0dmFyIHJhZGl1czIgPSBzcGhlcmUucmFkaXVzICogc3BoZXJlLnJhZGl1cztcblxuXHRcdFx0aWYgKCBkMiA+IHJhZGl1czIgKSByZXR1cm4gbnVsbDtcblxuXHRcdFx0dmFyIHRoYyA9IE1hdGguc3FydCggcmFkaXVzMiAtIGQyICk7XG5cblx0XHRcdC8vIHQwID0gZmlyc3QgaW50ZXJzZWN0IHBvaW50IC0gZW50cmFuY2Ugb24gZnJvbnQgb2Ygc3BoZXJlXG5cdFx0XHR2YXIgdDAgPSB0Y2EgLSB0aGM7XG5cblx0XHRcdC8vIHQxID0gc2Vjb25kIGludGVyc2VjdCBwb2ludCAtIGV4aXQgcG9pbnQgb24gYmFjayBvZiBzcGhlcmVcblx0XHRcdHZhciB0MSA9IHRjYSArIHRoYztcblxuXHRcdFx0Ly8gdGVzdCB0byBzZWUgaWYgYm90aCB0MCBhbmQgdDEgYXJlIGJlaGluZCB0aGUgcmF5IC0gaWYgc28sIHJldHVybiBudWxsXG5cdFx0XHRpZiAoIHQwIDwgMCAmJiB0MSA8IDAgKSByZXR1cm4gbnVsbDtcblxuXHRcdFx0Ly8gdGVzdCB0byBzZWUgaWYgdDAgaXMgYmVoaW5kIHRoZSByYXk6XG5cdFx0XHQvLyBpZiBpdCBpcywgdGhlIHJheSBpcyBpbnNpZGUgdGhlIHNwaGVyZSwgc28gcmV0dXJuIHRoZSBzZWNvbmQgZXhpdCBwb2ludCBzY2FsZWQgYnkgdDEsXG5cdFx0XHQvLyBpbiBvcmRlciB0byBhbHdheXMgcmV0dXJuIGFuIGludGVyc2VjdCBwb2ludCB0aGF0IGlzIGluIGZyb250IG9mIHRoZSByYXkuXG5cdFx0XHRpZiAoIHQwIDwgMCApIHJldHVybiB0aGlzLmF0KCB0MSwgdGFyZ2V0ICk7XG5cblx0XHRcdC8vIGVsc2UgdDAgaXMgaW4gZnJvbnQgb2YgdGhlIHJheSwgc28gcmV0dXJuIHRoZSBmaXJzdCBjb2xsaXNpb24gcG9pbnQgc2NhbGVkIGJ5IHQwXG5cdFx0XHRyZXR1cm4gdGhpcy5hdCggdDAsIHRhcmdldCApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0aW50ZXJzZWN0c1NwaGVyZTogZnVuY3Rpb24gKCBzcGhlcmUgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5kaXN0YW5jZVRvUG9pbnQoIHNwaGVyZS5jZW50ZXIgKSA8PSBzcGhlcmUucmFkaXVzO1xuXG5cdH0sXG5cblx0ZGlzdGFuY2VUb1BsYW5lOiBmdW5jdGlvbiAoIHBsYW5lICkge1xuXG5cdFx0dmFyIGRlbm9taW5hdG9yID0gcGxhbmUubm9ybWFsLmRvdCggdGhpcy5kaXJlY3Rpb24gKTtcblxuXHRcdGlmICggZGVub21pbmF0b3IgPT09IDAgKSB7XG5cblx0XHRcdC8vIGxpbmUgaXMgY29wbGFuYXIsIHJldHVybiBvcmlnaW5cblx0XHRcdGlmICggcGxhbmUuZGlzdGFuY2VUb1BvaW50KCB0aGlzLm9yaWdpbiApID09PSAwICkge1xuXG5cdFx0XHRcdHJldHVybiAwO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIE51bGwgaXMgcHJlZmVyYWJsZSB0byB1bmRlZmluZWQgc2luY2UgdW5kZWZpbmVkIG1lYW5zLi4uLiBpdCBpcyB1bmRlZmluZWRcblxuXHRcdFx0cmV0dXJuIG51bGw7XG5cblx0XHR9XG5cblx0XHR2YXIgdCA9IC0gKCB0aGlzLm9yaWdpbi5kb3QoIHBsYW5lLm5vcm1hbCApICsgcGxhbmUuY29uc3RhbnQgKSAvIGRlbm9taW5hdG9yO1xuXG5cdFx0Ly8gUmV0dXJuIGlmIHRoZSByYXkgbmV2ZXIgaW50ZXJzZWN0cyB0aGUgcGxhbmVcblxuXHRcdHJldHVybiB0ID49IDAgPyB0IDogbnVsbDtcblxuXHR9LFxuXG5cdGludGVyc2VjdFBsYW5lOiBmdW5jdGlvbiAoIHBsYW5lLCB0YXJnZXQgKSB7XG5cblx0XHR2YXIgdCA9IHRoaXMuZGlzdGFuY2VUb1BsYW5lKCBwbGFuZSApO1xuXG5cdFx0aWYgKCB0ID09PSBudWxsICkge1xuXG5cdFx0XHRyZXR1cm4gbnVsbDtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmF0KCB0LCB0YXJnZXQgKTtcblxuXHR9LFxuXG5cdGludGVyc2VjdHNQbGFuZTogZnVuY3Rpb24gKCBwbGFuZSApIHtcblxuXHRcdC8vIGNoZWNrIGlmIHRoZSByYXkgbGllcyBvbiB0aGUgcGxhbmUgZmlyc3RcblxuXHRcdHZhciBkaXN0VG9Qb2ludCA9IHBsYW5lLmRpc3RhbmNlVG9Qb2ludCggdGhpcy5vcmlnaW4gKTtcblxuXHRcdGlmICggZGlzdFRvUG9pbnQgPT09IDAgKSB7XG5cblx0XHRcdHJldHVybiB0cnVlO1xuXG5cdFx0fVxuXG5cdFx0dmFyIGRlbm9taW5hdG9yID0gcGxhbmUubm9ybWFsLmRvdCggdGhpcy5kaXJlY3Rpb24gKTtcblxuXHRcdGlmICggZGVub21pbmF0b3IgKiBkaXN0VG9Qb2ludCA8IDAgKSB7XG5cblx0XHRcdHJldHVybiB0cnVlO1xuXG5cdFx0fVxuXG5cdFx0Ly8gcmF5IG9yaWdpbiBpcyBiZWhpbmQgdGhlIHBsYW5lIChhbmQgaXMgcG9pbnRpbmcgYmVoaW5kIGl0KVxuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXG5cdH0sXG5cblx0aW50ZXJzZWN0Qm94OiBmdW5jdGlvbiAoIGJveCwgdGFyZ2V0ICkge1xuXG5cdFx0dmFyIHRtaW4sIHRtYXgsIHR5bWluLCB0eW1heCwgdHptaW4sIHR6bWF4O1xuXG5cdFx0dmFyIGludmRpcnggPSAxIC8gdGhpcy5kaXJlY3Rpb24ueCxcblx0XHRcdGludmRpcnkgPSAxIC8gdGhpcy5kaXJlY3Rpb24ueSxcblx0XHRcdGludmRpcnogPSAxIC8gdGhpcy5kaXJlY3Rpb24uejtcblxuXHRcdHZhciBvcmlnaW4gPSB0aGlzLm9yaWdpbjtcblxuXHRcdGlmICggaW52ZGlyeCA+PSAwICkge1xuXG5cdFx0XHR0bWluID0gKCBib3gubWluLnggLSBvcmlnaW4ueCApICogaW52ZGlyeDtcblx0XHRcdHRtYXggPSAoIGJveC5tYXgueCAtIG9yaWdpbi54ICkgKiBpbnZkaXJ4O1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dG1pbiA9ICggYm94Lm1heC54IC0gb3JpZ2luLnggKSAqIGludmRpcng7XG5cdFx0XHR0bWF4ID0gKCBib3gubWluLnggLSBvcmlnaW4ueCApICogaW52ZGlyeDtcblxuXHRcdH1cblxuXHRcdGlmICggaW52ZGlyeSA+PSAwICkge1xuXG5cdFx0XHR0eW1pbiA9ICggYm94Lm1pbi55IC0gb3JpZ2luLnkgKSAqIGludmRpcnk7XG5cdFx0XHR0eW1heCA9ICggYm94Lm1heC55IC0gb3JpZ2luLnkgKSAqIGludmRpcnk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR0eW1pbiA9ICggYm94Lm1heC55IC0gb3JpZ2luLnkgKSAqIGludmRpcnk7XG5cdFx0XHR0eW1heCA9ICggYm94Lm1pbi55IC0gb3JpZ2luLnkgKSAqIGludmRpcnk7XG5cblx0XHR9XG5cblx0XHRpZiAoICggdG1pbiA+IHR5bWF4ICkgfHwgKCB0eW1pbiA+IHRtYXggKSApIHJldHVybiBudWxsO1xuXG5cdFx0Ly8gVGhlc2UgbGluZXMgYWxzbyBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdG1pbiBvciB0bWF4IGlzIE5hTlxuXHRcdC8vIChyZXN1bHQgb2YgMCAqIEluZmluaXR5KS4geCAhPT0geCByZXR1cm5zIHRydWUgaWYgeCBpcyBOYU5cblxuXHRcdGlmICggdHltaW4gPiB0bWluIHx8IHRtaW4gIT09IHRtaW4gKSB0bWluID0gdHltaW47XG5cblx0XHRpZiAoIHR5bWF4IDwgdG1heCB8fCB0bWF4ICE9PSB0bWF4ICkgdG1heCA9IHR5bWF4O1xuXG5cdFx0aWYgKCBpbnZkaXJ6ID49IDAgKSB7XG5cblx0XHRcdHR6bWluID0gKCBib3gubWluLnogLSBvcmlnaW4ueiApICogaW52ZGlyejtcblx0XHRcdHR6bWF4ID0gKCBib3gubWF4LnogLSBvcmlnaW4ueiApICogaW52ZGlyejtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHR6bWluID0gKCBib3gubWF4LnogLSBvcmlnaW4ueiApICogaW52ZGlyejtcblx0XHRcdHR6bWF4ID0gKCBib3gubWluLnogLSBvcmlnaW4ueiApICogaW52ZGlyejtcblxuXHRcdH1cblxuXHRcdGlmICggKCB0bWluID4gdHptYXggKSB8fCAoIHR6bWluID4gdG1heCApICkgcmV0dXJuIG51bGw7XG5cblx0XHRpZiAoIHR6bWluID4gdG1pbiB8fCB0bWluICE9PSB0bWluICkgdG1pbiA9IHR6bWluO1xuXG5cdFx0aWYgKCB0em1heCA8IHRtYXggfHwgdG1heCAhPT0gdG1heCApIHRtYXggPSB0em1heDtcblxuXHRcdC8vcmV0dXJuIHBvaW50IGNsb3Nlc3QgdG8gdGhlIHJheSAocG9zaXRpdmUgc2lkZSlcblxuXHRcdGlmICggdG1heCA8IDAgKSByZXR1cm4gbnVsbDtcblxuXHRcdHJldHVybiB0aGlzLmF0KCB0bWluID49IDAgPyB0bWluIDogdG1heCwgdGFyZ2V0ICk7XG5cblx0fSxcblxuXHRpbnRlcnNlY3RzQm94OiAoIGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBpbnRlcnNlY3RzQm94KCBib3ggKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLmludGVyc2VjdEJveCggYm94LCB2ICkgIT09IG51bGw7XG5cblx0XHR9O1xuXG5cdH0gKSgpLFxuXG5cdGludGVyc2VjdFRyaWFuZ2xlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyBDb21wdXRlIHRoZSBvZmZzZXQgb3JpZ2luLCBlZGdlcywgYW5kIG5vcm1hbC5cblx0XHR2YXIgZGlmZiA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIGVkZ2UxID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgZWRnZTIgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciBub3JtYWwgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGludGVyc2VjdFRyaWFuZ2xlKCBhLCBiLCBjLCBiYWNrZmFjZUN1bGxpbmcsIHRhcmdldCApIHtcblxuXHRcdFx0Ly8gZnJvbSBodHRwOi8vd3d3Lmdlb21ldHJpY3Rvb2xzLmNvbS9HVEVuZ2luZS9JbmNsdWRlL01hdGhlbWF0aWNzL0d0ZUludHJSYXkzVHJpYW5nbGUzLmhcblxuXHRcdFx0ZWRnZTEuc3ViVmVjdG9ycyggYiwgYSApO1xuXHRcdFx0ZWRnZTIuc3ViVmVjdG9ycyggYywgYSApO1xuXHRcdFx0bm9ybWFsLmNyb3NzVmVjdG9ycyggZWRnZTEsIGVkZ2UyICk7XG5cblx0XHRcdC8vIFNvbHZlIFEgKyB0KkQgPSBiMSpFMSArIGIyKkUyIChRID0ga0RpZmYsIEQgPSByYXkgZGlyZWN0aW9uLFxuXHRcdFx0Ly8gRTEgPSBrRWRnZTEsIEUyID0ga0VkZ2UyLCBOID0gQ3Jvc3MoRTEsRTIpKSBieVxuXHRcdFx0Ly8gICB8RG90KEQsTil8KmIxID0gc2lnbihEb3QoRCxOKSkqRG90KEQsQ3Jvc3MoUSxFMikpXG5cdFx0XHQvLyAgIHxEb3QoRCxOKXwqYjIgPSBzaWduKERvdChELE4pKSpEb3QoRCxDcm9zcyhFMSxRKSlcblx0XHRcdC8vICAgfERvdChELE4pfCp0ID0gLXNpZ24oRG90KEQsTikpKkRvdChRLE4pXG5cdFx0XHR2YXIgRGROID0gdGhpcy5kaXJlY3Rpb24uZG90KCBub3JtYWwgKTtcblx0XHRcdHZhciBzaWduO1xuXG5cdFx0XHRpZiAoIERkTiA+IDAgKSB7XG5cblx0XHRcdFx0aWYgKCBiYWNrZmFjZUN1bGxpbmcgKSByZXR1cm4gbnVsbDtcblx0XHRcdFx0c2lnbiA9IDE7XG5cblx0XHRcdH0gZWxzZSBpZiAoIERkTiA8IDAgKSB7XG5cblx0XHRcdFx0c2lnbiA9IC0gMTtcblx0XHRcdFx0RGROID0gLSBEZE47XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cblx0XHRcdH1cblxuXHRcdFx0ZGlmZi5zdWJWZWN0b3JzKCB0aGlzLm9yaWdpbiwgYSApO1xuXHRcdFx0dmFyIERkUXhFMiA9IHNpZ24gKiB0aGlzLmRpcmVjdGlvbi5kb3QoIGVkZ2UyLmNyb3NzVmVjdG9ycyggZGlmZiwgZWRnZTIgKSApO1xuXG5cdFx0XHQvLyBiMSA8IDAsIG5vIGludGVyc2VjdGlvblxuXHRcdFx0aWYgKCBEZFF4RTIgPCAwICkge1xuXG5cdFx0XHRcdHJldHVybiBudWxsO1xuXG5cdFx0XHR9XG5cblx0XHRcdHZhciBEZEUxeFEgPSBzaWduICogdGhpcy5kaXJlY3Rpb24uZG90KCBlZGdlMS5jcm9zcyggZGlmZiApICk7XG5cblx0XHRcdC8vIGIyIDwgMCwgbm8gaW50ZXJzZWN0aW9uXG5cdFx0XHRpZiAoIERkRTF4USA8IDAgKSB7XG5cblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gYjErYjIgPiAxLCBubyBpbnRlcnNlY3Rpb25cblx0XHRcdGlmICggRGRReEUyICsgRGRFMXhRID4gRGROICkge1xuXG5cdFx0XHRcdHJldHVybiBudWxsO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIExpbmUgaW50ZXJzZWN0cyB0cmlhbmdsZSwgY2hlY2sgaWYgcmF5IGRvZXMuXG5cdFx0XHR2YXIgUWROID0gLSBzaWduICogZGlmZi5kb3QoIG5vcm1hbCApO1xuXG5cdFx0XHQvLyB0IDwgMCwgbm8gaW50ZXJzZWN0aW9uXG5cdFx0XHRpZiAoIFFkTiA8IDAgKSB7XG5cblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gUmF5IGludGVyc2VjdHMgdHJpYW5nbGUuXG5cdFx0XHRyZXR1cm4gdGhpcy5hdCggUWROIC8gRGROLCB0YXJnZXQgKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGFwcGx5TWF0cml4NDogZnVuY3Rpb24gKCBtYXRyaXg0ICkge1xuXG5cdFx0dGhpcy5vcmlnaW4uYXBwbHlNYXRyaXg0KCBtYXRyaXg0ICk7XG5cdFx0dGhpcy5kaXJlY3Rpb24udHJhbnNmb3JtRGlyZWN0aW9uKCBtYXRyaXg0ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGVxdWFsczogZnVuY3Rpb24gKCByYXkgKSB7XG5cblx0XHRyZXR1cm4gcmF5Lm9yaWdpbi5lcXVhbHMoIHRoaXMub3JpZ2luICkgJiYgcmF5LmRpcmVjdGlvbi5lcXVhbHMoIHRoaXMuZGlyZWN0aW9uICk7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pb1xuICovXG5cbmZ1bmN0aW9uIExpbmUzKCBzdGFydCwgZW5kICkge1xuXG5cdHRoaXMuc3RhcnQgPSAoIHN0YXJ0ICE9PSB1bmRlZmluZWQgKSA/IHN0YXJ0IDogbmV3IFZlY3RvcjMoKTtcblx0dGhpcy5lbmQgPSAoIGVuZCAhPT0gdW5kZWZpbmVkICkgPyBlbmQgOiBuZXcgVmVjdG9yMygpO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIExpbmUzLnByb3RvdHlwZSwge1xuXG5cdHNldDogZnVuY3Rpb24gKCBzdGFydCwgZW5kICkge1xuXG5cdFx0dGhpcy5zdGFydC5jb3B5KCBzdGFydCApO1xuXHRcdHRoaXMuZW5kLmNvcHkoIGVuZCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBsaW5lICkge1xuXG5cdFx0dGhpcy5zdGFydC5jb3B5KCBsaW5lLnN0YXJ0ICk7XG5cdFx0dGhpcy5lbmQuY29weSggbGluZS5lbmQgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Z2V0Q2VudGVyOiBmdW5jdGlvbiAoIHRhcmdldCApIHtcblxuXHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxpbmUzOiAuZ2V0Q2VudGVyKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGFyZ2V0LmFkZFZlY3RvcnMoIHRoaXMuc3RhcnQsIHRoaXMuZW5kICkubXVsdGlwbHlTY2FsYXIoIDAuNSApO1xuXG5cdH0sXG5cblx0ZGVsdGE6IGZ1bmN0aW9uICggdGFyZ2V0ICkge1xuXG5cdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGluZTM6IC5kZWx0YSgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHR0YXJnZXQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRhcmdldC5zdWJWZWN0b3JzKCB0aGlzLmVuZCwgdGhpcy5zdGFydCApO1xuXG5cdH0sXG5cblx0ZGlzdGFuY2VTcTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuc3RhcnQuZGlzdGFuY2VUb1NxdWFyZWQoIHRoaXMuZW5kICk7XG5cblx0fSxcblxuXHRkaXN0YW5jZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuc3RhcnQuZGlzdGFuY2VUbyggdGhpcy5lbmQgKTtcblxuXHR9LFxuXG5cdGF0OiBmdW5jdGlvbiAoIHQsIHRhcmdldCApIHtcblxuXHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxpbmUzOiAuYXQoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApO1xuXHRcdFx0dGFyZ2V0ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmRlbHRhKCB0YXJnZXQgKS5tdWx0aXBseVNjYWxhciggdCApLmFkZCggdGhpcy5zdGFydCApO1xuXG5cdH0sXG5cblx0Y2xvc2VzdFBvaW50VG9Qb2ludFBhcmFtZXRlcjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHN0YXJ0UCA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIHN0YXJ0RW5kID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBjbG9zZXN0UG9pbnRUb1BvaW50UGFyYW1ldGVyKCBwb2ludCwgY2xhbXBUb0xpbmUgKSB7XG5cblx0XHRcdHN0YXJ0UC5zdWJWZWN0b3JzKCBwb2ludCwgdGhpcy5zdGFydCApO1xuXHRcdFx0c3RhcnRFbmQuc3ViVmVjdG9ycyggdGhpcy5lbmQsIHRoaXMuc3RhcnQgKTtcblxuXHRcdFx0dmFyIHN0YXJ0RW5kMiA9IHN0YXJ0RW5kLmRvdCggc3RhcnRFbmQgKTtcblx0XHRcdHZhciBzdGFydEVuZF9zdGFydFAgPSBzdGFydEVuZC5kb3QoIHN0YXJ0UCApO1xuXG5cdFx0XHR2YXIgdCA9IHN0YXJ0RW5kX3N0YXJ0UCAvIHN0YXJ0RW5kMjtcblxuXHRcdFx0aWYgKCBjbGFtcFRvTGluZSApIHtcblxuXHRcdFx0XHR0ID0gX01hdGguY2xhbXAoIHQsIDAsIDEgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdDtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGNsb3Nlc3RQb2ludFRvUG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQsIGNsYW1wVG9MaW5lLCB0YXJnZXQgKSB7XG5cblx0XHR2YXIgdCA9IHRoaXMuY2xvc2VzdFBvaW50VG9Qb2ludFBhcmFtZXRlciggcG9pbnQsIGNsYW1wVG9MaW5lICk7XG5cblx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5MaW5lMzogLmNsb3Nlc3RQb2ludFRvUG9pbnQoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApO1xuXHRcdFx0dGFyZ2V0ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmRlbHRhKCB0YXJnZXQgKS5tdWx0aXBseVNjYWxhciggdCApLmFkZCggdGhpcy5zdGFydCApO1xuXG5cdH0sXG5cblx0YXBwbHlNYXRyaXg0OiBmdW5jdGlvbiAoIG1hdHJpeCApIHtcblxuXHRcdHRoaXMuc3RhcnQuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTtcblx0XHR0aGlzLmVuZC5hcHBseU1hdHJpeDQoIG1hdHJpeCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRlcXVhbHM6IGZ1bmN0aW9uICggbGluZSApIHtcblxuXHRcdHJldHVybiBsaW5lLnN0YXJ0LmVxdWFscyggdGhpcy5zdGFydCApICYmIGxpbmUuZW5kLmVxdWFscyggdGhpcy5lbmQgKTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIFRyaWFuZ2xlKCBhLCBiLCBjICkge1xuXG5cdHRoaXMuYSA9ICggYSAhPT0gdW5kZWZpbmVkICkgPyBhIDogbmV3IFZlY3RvcjMoKTtcblx0dGhpcy5iID0gKCBiICE9PSB1bmRlZmluZWQgKSA/IGIgOiBuZXcgVmVjdG9yMygpO1xuXHR0aGlzLmMgPSAoIGMgIT09IHVuZGVmaW5lZCApID8gYyA6IG5ldyBWZWN0b3IzKCk7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggVHJpYW5nbGUsIHtcblxuXHRnZXROb3JtYWw6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gZ2V0Tm9ybWFsKCBhLCBiLCBjLCB0YXJnZXQgKSB7XG5cblx0XHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVHJpYW5nbGU6IC5nZXROb3JtYWwoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApO1xuXHRcdFx0XHR0YXJnZXQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0XHR9XG5cblx0XHRcdHRhcmdldC5zdWJWZWN0b3JzKCBjLCBiICk7XG5cdFx0XHR2MC5zdWJWZWN0b3JzKCBhLCBiICk7XG5cdFx0XHR0YXJnZXQuY3Jvc3MoIHYwICk7XG5cblx0XHRcdHZhciB0YXJnZXRMZW5ndGhTcSA9IHRhcmdldC5sZW5ndGhTcSgpO1xuXHRcdFx0aWYgKCB0YXJnZXRMZW5ndGhTcSA+IDAgKSB7XG5cblx0XHRcdFx0cmV0dXJuIHRhcmdldC5tdWx0aXBseVNjYWxhciggMSAvIE1hdGguc3FydCggdGFyZ2V0TGVuZ3RoU3EgKSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0YXJnZXQuc2V0KCAwLCAwLCAwICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHQvLyBzdGF0aWMvaW5zdGFuY2UgbWV0aG9kIHRvIGNhbGN1bGF0ZSBiYXJ5Y2VudHJpYyBjb29yZGluYXRlc1xuXHQvLyBiYXNlZCBvbjogaHR0cDovL3d3dy5ibGFja3Bhd24uY29tL3RleHRzL3BvaW50aW5wb2x5L2RlZmF1bHQuaHRtbFxuXHRnZXRCYXJ5Y29vcmQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MCA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgdjIgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGdldEJhcnljb29yZCggcG9pbnQsIGEsIGIsIGMsIHRhcmdldCApIHtcblxuXHRcdFx0djAuc3ViVmVjdG9ycyggYywgYSApO1xuXHRcdFx0djEuc3ViVmVjdG9ycyggYiwgYSApO1xuXHRcdFx0djIuc3ViVmVjdG9ycyggcG9pbnQsIGEgKTtcblxuXHRcdFx0dmFyIGRvdDAwID0gdjAuZG90KCB2MCApO1xuXHRcdFx0dmFyIGRvdDAxID0gdjAuZG90KCB2MSApO1xuXHRcdFx0dmFyIGRvdDAyID0gdjAuZG90KCB2MiApO1xuXHRcdFx0dmFyIGRvdDExID0gdjEuZG90KCB2MSApO1xuXHRcdFx0dmFyIGRvdDEyID0gdjEuZG90KCB2MiApO1xuXG5cdFx0XHR2YXIgZGVub20gPSAoIGRvdDAwICogZG90MTEgLSBkb3QwMSAqIGRvdDAxICk7XG5cblx0XHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVHJpYW5nbGU6IC5nZXRCYXJ5Y29vcmQoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApO1xuXHRcdFx0XHR0YXJnZXQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIGNvbGxpbmVhciBvciBzaW5ndWxhciB0cmlhbmdsZVxuXHRcdFx0aWYgKCBkZW5vbSA9PT0gMCApIHtcblxuXHRcdFx0XHQvLyBhcmJpdHJhcnkgbG9jYXRpb24gb3V0c2lkZSBvZiB0cmlhbmdsZT9cblx0XHRcdFx0Ly8gbm90IHN1cmUgaWYgdGhpcyBpcyB0aGUgYmVzdCBpZGVhLCBtYXliZSBzaG91bGQgYmUgcmV0dXJuaW5nIHVuZGVmaW5lZFxuXHRcdFx0XHRyZXR1cm4gdGFyZ2V0LnNldCggLSAyLCAtIDEsIC0gMSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHZhciBpbnZEZW5vbSA9IDEgLyBkZW5vbTtcblx0XHRcdHZhciB1ID0gKCBkb3QxMSAqIGRvdDAyIC0gZG90MDEgKiBkb3QxMiApICogaW52RGVub207XG5cdFx0XHR2YXIgdiA9ICggZG90MDAgKiBkb3QxMiAtIGRvdDAxICogZG90MDIgKSAqIGludkRlbm9tO1xuXG5cdFx0XHQvLyBiYXJ5Y2VudHJpYyBjb29yZGluYXRlcyBtdXN0IGFsd2F5cyBzdW0gdG8gMVxuXHRcdFx0cmV0dXJuIHRhcmdldC5zZXQoIDEgLSB1IC0gdiwgdiwgdSApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0Y29udGFpbnNQb2ludDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBjb250YWluc1BvaW50KCBwb2ludCwgYSwgYiwgYyApIHtcblxuXHRcdFx0VHJpYW5nbGUuZ2V0QmFyeWNvb3JkKCBwb2ludCwgYSwgYiwgYywgdjEgKTtcblxuXHRcdFx0cmV0dXJuICggdjEueCA+PSAwICkgJiYgKCB2MS55ID49IDAgKSAmJiAoICggdjEueCArIHYxLnkgKSA8PSAxICk7XG5cblx0XHR9O1xuXG5cdH0oKVxuXG59ICk7XG5cbk9iamVjdC5hc3NpZ24oIFRyaWFuZ2xlLnByb3RvdHlwZSwge1xuXG5cdHNldDogZnVuY3Rpb24gKCBhLCBiLCBjICkge1xuXG5cdFx0dGhpcy5hLmNvcHkoIGEgKTtcblx0XHR0aGlzLmIuY29weSggYiApO1xuXHRcdHRoaXMuYy5jb3B5KCBjICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21Qb2ludHNBbmRJbmRpY2VzOiBmdW5jdGlvbiAoIHBvaW50cywgaTAsIGkxLCBpMiApIHtcblxuXHRcdHRoaXMuYS5jb3B5KCBwb2ludHNbIGkwIF0gKTtcblx0XHR0aGlzLmIuY29weSggcG9pbnRzWyBpMSBdICk7XG5cdFx0dGhpcy5jLmNvcHkoIHBvaW50c1sgaTIgXSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCB0cmlhbmdsZSApIHtcblxuXHRcdHRoaXMuYS5jb3B5KCB0cmlhbmdsZS5hICk7XG5cdFx0dGhpcy5iLmNvcHkoIHRyaWFuZ2xlLmIgKTtcblx0XHR0aGlzLmMuY29weSggdHJpYW5nbGUuYyApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRnZXRBcmVhOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjAgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gZ2V0QXJlYSgpIHtcblxuXHRcdFx0djAuc3ViVmVjdG9ycyggdGhpcy5jLCB0aGlzLmIgKTtcblx0XHRcdHYxLnN1YlZlY3RvcnMoIHRoaXMuYSwgdGhpcy5iICk7XG5cblx0XHRcdHJldHVybiB2MC5jcm9zcyggdjEgKS5sZW5ndGgoKSAqIDAuNTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGdldE1pZHBvaW50OiBmdW5jdGlvbiAoIHRhcmdldCApIHtcblxuXHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlRyaWFuZ2xlOiAuZ2V0TWlkcG9pbnQoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApO1xuXHRcdFx0dGFyZ2V0ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0YXJnZXQuYWRkVmVjdG9ycyggdGhpcy5hLCB0aGlzLmIgKS5hZGQoIHRoaXMuYyApLm11bHRpcGx5U2NhbGFyKCAxIC8gMyApO1xuXG5cdH0sXG5cblx0Z2V0Tm9ybWFsOiBmdW5jdGlvbiAoIHRhcmdldCApIHtcblxuXHRcdHJldHVybiBUcmlhbmdsZS5nZXROb3JtYWwoIHRoaXMuYSwgdGhpcy5iLCB0aGlzLmMsIHRhcmdldCApO1xuXG5cdH0sXG5cblx0Z2V0UGxhbmU6IGZ1bmN0aW9uICggdGFyZ2V0ICkge1xuXG5cdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVHJpYW5nbGU6IC5nZXRQbGFuZSgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHR0YXJnZXQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRhcmdldC5zZXRGcm9tQ29wbGFuYXJQb2ludHMoIHRoaXMuYSwgdGhpcy5iLCB0aGlzLmMgKTtcblxuXHR9LFxuXG5cdGdldEJhcnljb29yZDogZnVuY3Rpb24gKCBwb2ludCwgdGFyZ2V0ICkge1xuXG5cdFx0cmV0dXJuIFRyaWFuZ2xlLmdldEJhcnljb29yZCggcG9pbnQsIHRoaXMuYSwgdGhpcy5iLCB0aGlzLmMsIHRhcmdldCApO1xuXG5cdH0sXG5cblx0Y29udGFpbnNQb2ludDogZnVuY3Rpb24gKCBwb2ludCApIHtcblxuXHRcdHJldHVybiBUcmlhbmdsZS5jb250YWluc1BvaW50KCBwb2ludCwgdGhpcy5hLCB0aGlzLmIsIHRoaXMuYyApO1xuXG5cdH0sXG5cblx0aW50ZXJzZWN0c0JveDogZnVuY3Rpb24gKCBib3ggKSB7XG5cblx0XHRyZXR1cm4gYm94LmludGVyc2VjdHNUcmlhbmdsZSggdGhpcyApO1xuXG5cdH0sXG5cblx0Y2xvc2VzdFBvaW50VG9Qb2ludDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHBsYW5lID0gbmV3IFBsYW5lKCk7XG5cdFx0dmFyIGVkZ2VMaXN0ID0gWyBuZXcgTGluZTMoKSwgbmV3IExpbmUzKCksIG5ldyBMaW5lMygpIF07XG5cdFx0dmFyIHByb2plY3RlZFBvaW50ID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgY2xvc2VzdFBvaW50ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBjbG9zZXN0UG9pbnRUb1BvaW50KCBwb2ludCwgdGFyZ2V0ICkge1xuXG5cdFx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlRyaWFuZ2xlOiAuY2xvc2VzdFBvaW50VG9Qb2ludCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIG1pbkRpc3RhbmNlID0gSW5maW5pdHk7XG5cblx0XHRcdC8vIHByb2plY3QgdGhlIHBvaW50IG9udG8gdGhlIHBsYW5lIG9mIHRoZSB0cmlhbmdsZVxuXG5cdFx0XHRwbGFuZS5zZXRGcm9tQ29wbGFuYXJQb2ludHMoIHRoaXMuYSwgdGhpcy5iLCB0aGlzLmMgKTtcblx0XHRcdHBsYW5lLnByb2plY3RQb2ludCggcG9pbnQsIHByb2plY3RlZFBvaW50ICk7XG5cblx0XHRcdC8vIGNoZWNrIGlmIHRoZSBwcm9qZWN0aW9uIGxpZXMgd2l0aGluIHRoZSB0cmlhbmdsZVxuXG5cdFx0XHRpZiAoIHRoaXMuY29udGFpbnNQb2ludCggcHJvamVjdGVkUG9pbnQgKSA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0XHQvLyBpZiBzbywgdGhpcyBpcyB0aGUgY2xvc2VzdCBwb2ludFxuXG5cdFx0XHRcdHRhcmdldC5jb3B5KCBwcm9qZWN0ZWRQb2ludCApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdC8vIGlmIG5vdCwgdGhlIHBvaW50IGZhbGxzIG91dHNpZGUgdGhlIHRyaWFuZ2xlLiB0aGUgdGFyZ2V0IGlzIHRoZSBjbG9zZXN0IHBvaW50IHRvIHRoZSB0cmlhbmdsZSdzIGVkZ2VzIG9yIHZlcnRpY2VzXG5cblx0XHRcdFx0ZWRnZUxpc3RbIDAgXS5zZXQoIHRoaXMuYSwgdGhpcy5iICk7XG5cdFx0XHRcdGVkZ2VMaXN0WyAxIF0uc2V0KCB0aGlzLmIsIHRoaXMuYyApO1xuXHRcdFx0XHRlZGdlTGlzdFsgMiBdLnNldCggdGhpcy5jLCB0aGlzLmEgKTtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBlZGdlTGlzdC5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRlZGdlTGlzdFsgaSBdLmNsb3Nlc3RQb2ludFRvUG9pbnQoIHByb2plY3RlZFBvaW50LCB0cnVlLCBjbG9zZXN0UG9pbnQgKTtcblxuXHRcdFx0XHRcdHZhciBkaXN0YW5jZSA9IHByb2plY3RlZFBvaW50LmRpc3RhbmNlVG9TcXVhcmVkKCBjbG9zZXN0UG9pbnQgKTtcblxuXHRcdFx0XHRcdGlmICggZGlzdGFuY2UgPCBtaW5EaXN0YW5jZSApIHtcblxuXHRcdFx0XHRcdFx0bWluRGlzdGFuY2UgPSBkaXN0YW5jZTtcblxuXHRcdFx0XHRcdFx0dGFyZ2V0LmNvcHkoIGNsb3Nlc3RQb2ludCApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdGFyZ2V0O1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0ZXF1YWxzOiBmdW5jdGlvbiAoIHRyaWFuZ2xlICkge1xuXG5cdFx0cmV0dXJuIHRyaWFuZ2xlLmEuZXF1YWxzKCB0aGlzLmEgKSAmJiB0cmlhbmdsZS5iLmVxdWFscyggdGhpcy5iICkgJiYgdHJpYW5nbGUuYy5lcXVhbHMoIHRoaXMuYyApO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBtaWthZWwgZW10aW5nZXIgLyBodHRwOi8vZ29tby5zZS9cbiAqIEBhdXRob3Igam9ub2JyMSAvIGh0dHA6Ly9qb25vYnIxLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBNZXNoKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKSB7XG5cblx0T2JqZWN0M0QuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdNZXNoJztcblxuXHR0aGlzLmdlb21ldHJ5ID0gZ2VvbWV0cnkgIT09IHVuZGVmaW5lZCA/IGdlb21ldHJ5IDogbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cdHRoaXMubWF0ZXJpYWwgPSBtYXRlcmlhbCAhPT0gdW5kZWZpbmVkID8gbWF0ZXJpYWwgOiBuZXcgTWVzaEJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IE1hdGgucmFuZG9tKCkgKiAweGZmZmZmZiB9ICk7XG5cblx0dGhpcy5kcmF3TW9kZSA9IFRyaWFuZ2xlc0RyYXdNb2RlO1xuXG5cdHRoaXMudXBkYXRlTW9ycGhUYXJnZXRzKCk7XG5cbn1cblxuTWVzaC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBNZXNoLFxuXG5cdGlzTWVzaDogdHJ1ZSxcblxuXHRzZXREcmF3TW9kZTogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMuZHJhd01vZGUgPSB2YWx1ZTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0T2JqZWN0M0QucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0XHR0aGlzLmRyYXdNb2RlID0gc291cmNlLmRyYXdNb2RlO1xuXG5cdFx0aWYgKCBzb3VyY2UubW9ycGhUYXJnZXRJbmZsdWVuY2VzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHRoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzID0gc291cmNlLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcy5zbGljZSgpO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBzb3VyY2UubW9ycGhUYXJnZXREaWN0aW9uYXJ5ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5ID0gT2JqZWN0LmFzc2lnbigge30sIHNvdXJjZS5tb3JwaFRhcmdldERpY3Rpb25hcnkgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dXBkYXRlTW9ycGhUYXJnZXRzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5O1xuXHRcdHZhciBtLCBtbCwgbmFtZTtcblxuXHRcdGlmICggZ2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSApIHtcblxuXHRcdFx0dmFyIG1vcnBoQXR0cmlidXRlcyA9IGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcztcblx0XHRcdHZhciBrZXlzID0gT2JqZWN0LmtleXMoIG1vcnBoQXR0cmlidXRlcyApO1xuXG5cdFx0XHRpZiAoIGtleXMubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0XHR2YXIgbW9ycGhBdHRyaWJ1dGUgPSBtb3JwaEF0dHJpYnV0ZXNbIGtleXNbIDAgXSBdO1xuXG5cdFx0XHRcdGlmICggbW9ycGhBdHRyaWJ1dGUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdHRoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzID0gW107XG5cdFx0XHRcdFx0dGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnkgPSB7fTtcblxuXHRcdFx0XHRcdGZvciAoIG0gPSAwLCBtbCA9IG1vcnBoQXR0cmlidXRlLmxlbmd0aDsgbSA8IG1sOyBtICsrICkge1xuXG5cdFx0XHRcdFx0XHRuYW1lID0gbW9ycGhBdHRyaWJ1dGVbIG0gXS5uYW1lIHx8IFN0cmluZyggbSApO1xuXG5cdFx0XHRcdFx0XHR0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcy5wdXNoKCAwICk7XG5cdFx0XHRcdFx0XHR0aGlzLm1vcnBoVGFyZ2V0RGljdGlvbmFyeVsgbmFtZSBdID0gbTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHZhciBtb3JwaFRhcmdldHMgPSBnZW9tZXRyeS5tb3JwaFRhcmdldHM7XG5cblx0XHRcdGlmICggbW9ycGhUYXJnZXRzICE9PSB1bmRlZmluZWQgJiYgbW9ycGhUYXJnZXRzLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdFx0dGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXMgPSBbXTtcblx0XHRcdFx0dGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnkgPSB7fTtcblxuXHRcdFx0XHRmb3IgKCBtID0gMCwgbWwgPSBtb3JwaFRhcmdldHMubGVuZ3RoOyBtIDwgbWw7IG0gKysgKSB7XG5cblx0XHRcdFx0XHRuYW1lID0gbW9ycGhUYXJnZXRzWyBtIF0ubmFtZSB8fCBTdHJpbmcoIG0gKTtcblxuXHRcdFx0XHRcdHRoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzLnB1c2goIDAgKTtcblx0XHRcdFx0XHR0aGlzLm1vcnBoVGFyZ2V0RGljdGlvbmFyeVsgbmFtZSBdID0gbTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9LFxuXG5cdHJheWNhc3Q6ICggZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGludmVyc2VNYXRyaXggPSBuZXcgTWF0cml4NCgpO1xuXHRcdHZhciByYXkgPSBuZXcgUmF5KCk7XG5cdFx0dmFyIHNwaGVyZSA9IG5ldyBTcGhlcmUoKTtcblxuXHRcdHZhciB2QSA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIHZCID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgdkMgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0dmFyIHRlbXBBID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgdGVtcEIgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciB0ZW1wQyA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR2YXIgdXZBID0gbmV3IFZlY3RvcjIoKTtcblx0XHR2YXIgdXZCID0gbmV3IFZlY3RvcjIoKTtcblx0XHR2YXIgdXZDID0gbmV3IFZlY3RvcjIoKTtcblxuXHRcdHZhciBiYXJ5Y29vcmQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0dmFyIGludGVyc2VjdGlvblBvaW50ID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgaW50ZXJzZWN0aW9uUG9pbnRXb3JsZCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRmdW5jdGlvbiB1dkludGVyc2VjdGlvbiggcG9pbnQsIHAxLCBwMiwgcDMsIHV2MSwgdXYyLCB1djMgKSB7XG5cblx0XHRcdFRyaWFuZ2xlLmdldEJhcnljb29yZCggcG9pbnQsIHAxLCBwMiwgcDMsIGJhcnljb29yZCApO1xuXG5cdFx0XHR1djEubXVsdGlwbHlTY2FsYXIoIGJhcnljb29yZC54ICk7XG5cdFx0XHR1djIubXVsdGlwbHlTY2FsYXIoIGJhcnljb29yZC55ICk7XG5cdFx0XHR1djMubXVsdGlwbHlTY2FsYXIoIGJhcnljb29yZC56ICk7XG5cblx0XHRcdHV2MS5hZGQoIHV2MiApLmFkZCggdXYzICk7XG5cblx0XHRcdHJldHVybiB1djEuY2xvbmUoKTtcblxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIGNoZWNrSW50ZXJzZWN0aW9uKCBvYmplY3QsIG1hdGVyaWFsLCByYXljYXN0ZXIsIHJheSwgcEEsIHBCLCBwQywgcG9pbnQgKSB7XG5cblx0XHRcdHZhciBpbnRlcnNlY3Q7XG5cblx0XHRcdGlmICggbWF0ZXJpYWwuc2lkZSA9PT0gQmFja1NpZGUgKSB7XG5cblx0XHRcdFx0aW50ZXJzZWN0ID0gcmF5LmludGVyc2VjdFRyaWFuZ2xlKCBwQywgcEIsIHBBLCB0cnVlLCBwb2ludCApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGludGVyc2VjdCA9IHJheS5pbnRlcnNlY3RUcmlhbmdsZSggcEEsIHBCLCBwQywgbWF0ZXJpYWwuc2lkZSAhPT0gRG91YmxlU2lkZSwgcG9pbnQgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGludGVyc2VjdCA9PT0gbnVsbCApIHJldHVybiBudWxsO1xuXG5cdFx0XHRpbnRlcnNlY3Rpb25Qb2ludFdvcmxkLmNvcHkoIHBvaW50ICk7XG5cdFx0XHRpbnRlcnNlY3Rpb25Qb2ludFdvcmxkLmFwcGx5TWF0cml4NCggb2JqZWN0Lm1hdHJpeFdvcmxkICk7XG5cblx0XHRcdHZhciBkaXN0YW5jZSA9IHJheWNhc3Rlci5yYXkub3JpZ2luLmRpc3RhbmNlVG8oIGludGVyc2VjdGlvblBvaW50V29ybGQgKTtcblxuXHRcdFx0aWYgKCBkaXN0YW5jZSA8IHJheWNhc3Rlci5uZWFyIHx8IGRpc3RhbmNlID4gcmF5Y2FzdGVyLmZhciApIHJldHVybiBudWxsO1xuXG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRkaXN0YW5jZTogZGlzdGFuY2UsXG5cdFx0XHRcdHBvaW50OiBpbnRlcnNlY3Rpb25Qb2ludFdvcmxkLmNsb25lKCksXG5cdFx0XHRcdG9iamVjdDogb2JqZWN0XG5cdFx0XHR9O1xuXG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gY2hlY2tCdWZmZXJHZW9tZXRyeUludGVyc2VjdGlvbiggb2JqZWN0LCByYXljYXN0ZXIsIHJheSwgcG9zaXRpb24sIHV2LCBhLCBiLCBjICkge1xuXG5cdFx0XHR2QS5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbiwgYSApO1xuXHRcdFx0dkIuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb24sIGIgKTtcblx0XHRcdHZDLmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uLCBjICk7XG5cblx0XHRcdHZhciBpbnRlcnNlY3Rpb24gPSBjaGVja0ludGVyc2VjdGlvbiggb2JqZWN0LCBvYmplY3QubWF0ZXJpYWwsIHJheWNhc3RlciwgcmF5LCB2QSwgdkIsIHZDLCBpbnRlcnNlY3Rpb25Qb2ludCApO1xuXG5cdFx0XHRpZiAoIGludGVyc2VjdGlvbiApIHtcblxuXHRcdFx0XHRpZiAoIHV2ICkge1xuXG5cdFx0XHRcdFx0dXZBLmZyb21CdWZmZXJBdHRyaWJ1dGUoIHV2LCBhICk7XG5cdFx0XHRcdFx0dXZCLmZyb21CdWZmZXJBdHRyaWJ1dGUoIHV2LCBiICk7XG5cdFx0XHRcdFx0dXZDLmZyb21CdWZmZXJBdHRyaWJ1dGUoIHV2LCBjICk7XG5cblx0XHRcdFx0XHRpbnRlcnNlY3Rpb24udXYgPSB1dkludGVyc2VjdGlvbiggaW50ZXJzZWN0aW9uUG9pbnQsIHZBLCB2QiwgdkMsIHV2QSwgdXZCLCB1dkMgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dmFyIGZhY2UgPSBuZXcgRmFjZTMoIGEsIGIsIGMgKTtcblx0XHRcdFx0VHJpYW5nbGUuZ2V0Tm9ybWFsKCB2QSwgdkIsIHZDLCBmYWNlLm5vcm1hbCApO1xuXG5cdFx0XHRcdGludGVyc2VjdGlvbi5mYWNlID0gZmFjZTtcblx0XHRcdFx0aW50ZXJzZWN0aW9uLmZhY2VJbmRleCA9IGE7XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGludGVyc2VjdGlvbjtcblxuXHRcdH1cblxuXHRcdHJldHVybiBmdW5jdGlvbiByYXljYXN0KCByYXljYXN0ZXIsIGludGVyc2VjdHMgKSB7XG5cblx0XHRcdHZhciBnZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7XG5cdFx0XHR2YXIgbWF0ZXJpYWwgPSB0aGlzLm1hdGVyaWFsO1xuXHRcdFx0dmFyIG1hdHJpeFdvcmxkID0gdGhpcy5tYXRyaXhXb3JsZDtcblxuXHRcdFx0aWYgKCBtYXRlcmlhbCA9PT0gdW5kZWZpbmVkICkgcmV0dXJuO1xuXG5cdFx0XHQvLyBDaGVja2luZyBib3VuZGluZ1NwaGVyZSBkaXN0YW5jZSB0byByYXlcblxuXHRcdFx0aWYgKCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSA9PT0gbnVsbCApIGdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO1xuXG5cdFx0XHRzcGhlcmUuY29weSggZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgKTtcblx0XHRcdHNwaGVyZS5hcHBseU1hdHJpeDQoIG1hdHJpeFdvcmxkICk7XG5cblx0XHRcdGlmICggcmF5Y2FzdGVyLnJheS5pbnRlcnNlY3RzU3BoZXJlKCBzcGhlcmUgKSA9PT0gZmFsc2UgKSByZXR1cm47XG5cblx0XHRcdC8vXG5cblx0XHRcdGludmVyc2VNYXRyaXguZ2V0SW52ZXJzZSggbWF0cml4V29ybGQgKTtcblx0XHRcdHJheS5jb3B5KCByYXljYXN0ZXIucmF5ICkuYXBwbHlNYXRyaXg0KCBpbnZlcnNlTWF0cml4ICk7XG5cblx0XHRcdC8vIENoZWNrIGJvdW5kaW5nQm94IGJlZm9yZSBjb250aW51aW5nXG5cblx0XHRcdGlmICggZ2VvbWV0cnkuYm91bmRpbmdCb3ggIT09IG51bGwgKSB7XG5cblx0XHRcdFx0aWYgKCByYXkuaW50ZXJzZWN0c0JveCggZ2VvbWV0cnkuYm91bmRpbmdCb3ggKSA9PT0gZmFsc2UgKSByZXR1cm47XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIGludGVyc2VjdGlvbjtcblxuXHRcdFx0aWYgKCBnZW9tZXRyeS5pc0J1ZmZlckdlb21ldHJ5ICkge1xuXG5cdFx0XHRcdHZhciBhLCBiLCBjO1xuXHRcdFx0XHR2YXIgaW5kZXggPSBnZW9tZXRyeS5pbmRleDtcblx0XHRcdFx0dmFyIHBvc2l0aW9uID0gZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbjtcblx0XHRcdFx0dmFyIHV2ID0gZ2VvbWV0cnkuYXR0cmlidXRlcy51djtcblx0XHRcdFx0dmFyIGksIGw7XG5cblx0XHRcdFx0aWYgKCBpbmRleCAhPT0gbnVsbCApIHtcblxuXHRcdFx0XHRcdC8vIGluZGV4ZWQgYnVmZmVyIGdlb21ldHJ5XG5cblx0XHRcdFx0XHRmb3IgKCBpID0gMCwgbCA9IGluZGV4LmNvdW50OyBpIDwgbDsgaSArPSAzICkge1xuXG5cdFx0XHRcdFx0XHRhID0gaW5kZXguZ2V0WCggaSApO1xuXHRcdFx0XHRcdFx0YiA9IGluZGV4LmdldFgoIGkgKyAxICk7XG5cdFx0XHRcdFx0XHRjID0gaW5kZXguZ2V0WCggaSArIDIgKTtcblxuXHRcdFx0XHRcdFx0aW50ZXJzZWN0aW9uID0gY2hlY2tCdWZmZXJHZW9tZXRyeUludGVyc2VjdGlvbiggdGhpcywgcmF5Y2FzdGVyLCByYXksIHBvc2l0aW9uLCB1diwgYSwgYiwgYyApO1xuXG5cdFx0XHRcdFx0XHRpZiAoIGludGVyc2VjdGlvbiApIHtcblxuXHRcdFx0XHRcdFx0XHRpbnRlcnNlY3Rpb24uZmFjZUluZGV4ID0gTWF0aC5mbG9vciggaSAvIDMgKTsgLy8gdHJpYW5nbGUgbnVtYmVyIGluIGluZGljZXMgYnVmZmVyIHNlbWFudGljc1xuXHRcdFx0XHRcdFx0XHRpbnRlcnNlY3RzLnB1c2goIGludGVyc2VjdGlvbiApO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSBlbHNlIGlmICggcG9zaXRpb24gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdC8vIG5vbi1pbmRleGVkIGJ1ZmZlciBnZW9tZXRyeVxuXG5cdFx0XHRcdFx0Zm9yICggaSA9IDAsIGwgPSBwb3NpdGlvbi5jb3VudDsgaSA8IGw7IGkgKz0gMyApIHtcblxuXHRcdFx0XHRcdFx0YSA9IGk7XG5cdFx0XHRcdFx0XHRiID0gaSArIDE7XG5cdFx0XHRcdFx0XHRjID0gaSArIDI7XG5cblx0XHRcdFx0XHRcdGludGVyc2VjdGlvbiA9IGNoZWNrQnVmZmVyR2VvbWV0cnlJbnRlcnNlY3Rpb24oIHRoaXMsIHJheWNhc3RlciwgcmF5LCBwb3NpdGlvbiwgdXYsIGEsIGIsIGMgKTtcblxuXHRcdFx0XHRcdFx0aWYgKCBpbnRlcnNlY3Rpb24gKSBpbnRlcnNlY3RzLnB1c2goIGludGVyc2VjdGlvbiApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIGlmICggZ2VvbWV0cnkuaXNHZW9tZXRyeSApIHtcblxuXHRcdFx0XHR2YXIgZnZBLCBmdkIsIGZ2Qztcblx0XHRcdFx0dmFyIGlzTXVsdGlNYXRlcmlhbCA9IEFycmF5LmlzQXJyYXkoIG1hdGVyaWFsICk7XG5cblx0XHRcdFx0dmFyIHZlcnRpY2VzID0gZ2VvbWV0cnkudmVydGljZXM7XG5cdFx0XHRcdHZhciBmYWNlcyA9IGdlb21ldHJ5LmZhY2VzO1xuXHRcdFx0XHR2YXIgdXZzO1xuXG5cdFx0XHRcdHZhciBmYWNlVmVydGV4VXZzID0gZ2VvbWV0cnkuZmFjZVZlcnRleFV2c1sgMCBdO1xuXHRcdFx0XHRpZiAoIGZhY2VWZXJ0ZXhVdnMubGVuZ3RoID4gMCApIHV2cyA9IGZhY2VWZXJ0ZXhVdnM7XG5cblx0XHRcdFx0Zm9yICggdmFyIGYgPSAwLCBmbCA9IGZhY2VzLmxlbmd0aDsgZiA8IGZsOyBmICsrICkge1xuXG5cdFx0XHRcdFx0dmFyIGZhY2UgPSBmYWNlc1sgZiBdO1xuXHRcdFx0XHRcdHZhciBmYWNlTWF0ZXJpYWwgPSBpc011bHRpTWF0ZXJpYWwgPyBtYXRlcmlhbFsgZmFjZS5tYXRlcmlhbEluZGV4IF0gOiBtYXRlcmlhbDtcblxuXHRcdFx0XHRcdGlmICggZmFjZU1hdGVyaWFsID09PSB1bmRlZmluZWQgKSBjb250aW51ZTtcblxuXHRcdFx0XHRcdGZ2QSA9IHZlcnRpY2VzWyBmYWNlLmEgXTtcblx0XHRcdFx0XHRmdkIgPSB2ZXJ0aWNlc1sgZmFjZS5iIF07XG5cdFx0XHRcdFx0ZnZDID0gdmVydGljZXNbIGZhY2UuYyBdO1xuXG5cdFx0XHRcdFx0aWYgKCBmYWNlTWF0ZXJpYWwubW9ycGhUYXJnZXRzID09PSB0cnVlICkge1xuXG5cdFx0XHRcdFx0XHR2YXIgbW9ycGhUYXJnZXRzID0gZ2VvbWV0cnkubW9ycGhUYXJnZXRzO1xuXHRcdFx0XHRcdFx0dmFyIG1vcnBoSW5mbHVlbmNlcyA9IHRoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzO1xuXG5cdFx0XHRcdFx0XHR2QS5zZXQoIDAsIDAsIDAgKTtcblx0XHRcdFx0XHRcdHZCLnNldCggMCwgMCwgMCApO1xuXHRcdFx0XHRcdFx0dkMuc2V0KCAwLCAwLCAwICk7XG5cblx0XHRcdFx0XHRcdGZvciAoIHZhciB0ID0gMCwgdGwgPSBtb3JwaFRhcmdldHMubGVuZ3RoOyB0IDwgdGw7IHQgKysgKSB7XG5cblx0XHRcdFx0XHRcdFx0dmFyIGluZmx1ZW5jZSA9IG1vcnBoSW5mbHVlbmNlc1sgdCBdO1xuXG5cdFx0XHRcdFx0XHRcdGlmICggaW5mbHVlbmNlID09PSAwICkgY29udGludWU7XG5cblx0XHRcdFx0XHRcdFx0dmFyIHRhcmdldHMgPSBtb3JwaFRhcmdldHNbIHQgXS52ZXJ0aWNlcztcblxuXHRcdFx0XHRcdFx0XHR2QS5hZGRTY2FsZWRWZWN0b3IoIHRlbXBBLnN1YlZlY3RvcnMoIHRhcmdldHNbIGZhY2UuYSBdLCBmdkEgKSwgaW5mbHVlbmNlICk7XG5cdFx0XHRcdFx0XHRcdHZCLmFkZFNjYWxlZFZlY3RvciggdGVtcEIuc3ViVmVjdG9ycyggdGFyZ2V0c1sgZmFjZS5iIF0sIGZ2QiApLCBpbmZsdWVuY2UgKTtcblx0XHRcdFx0XHRcdFx0dkMuYWRkU2NhbGVkVmVjdG9yKCB0ZW1wQy5zdWJWZWN0b3JzKCB0YXJnZXRzWyBmYWNlLmMgXSwgZnZDICksIGluZmx1ZW5jZSApO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdHZBLmFkZCggZnZBICk7XG5cdFx0XHRcdFx0XHR2Qi5hZGQoIGZ2QiApO1xuXHRcdFx0XHRcdFx0dkMuYWRkKCBmdkMgKTtcblxuXHRcdFx0XHRcdFx0ZnZBID0gdkE7XG5cdFx0XHRcdFx0XHRmdkIgPSB2Qjtcblx0XHRcdFx0XHRcdGZ2QyA9IHZDO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aW50ZXJzZWN0aW9uID0gY2hlY2tJbnRlcnNlY3Rpb24oIHRoaXMsIGZhY2VNYXRlcmlhbCwgcmF5Y2FzdGVyLCByYXksIGZ2QSwgZnZCLCBmdkMsIGludGVyc2VjdGlvblBvaW50ICk7XG5cblx0XHRcdFx0XHRpZiAoIGludGVyc2VjdGlvbiApIHtcblxuXHRcdFx0XHRcdFx0aWYgKCB1dnMgJiYgdXZzWyBmIF0gKSB7XG5cblx0XHRcdFx0XHRcdFx0dmFyIHV2c19mID0gdXZzWyBmIF07XG5cdFx0XHRcdFx0XHRcdHV2QS5jb3B5KCB1dnNfZlsgMCBdICk7XG5cdFx0XHRcdFx0XHRcdHV2Qi5jb3B5KCB1dnNfZlsgMSBdICk7XG5cdFx0XHRcdFx0XHRcdHV2Qy5jb3B5KCB1dnNfZlsgMiBdICk7XG5cblx0XHRcdFx0XHRcdFx0aW50ZXJzZWN0aW9uLnV2ID0gdXZJbnRlcnNlY3Rpb24oIGludGVyc2VjdGlvblBvaW50LCBmdkEsIGZ2QiwgZnZDLCB1dkEsIHV2QiwgdXZDICk7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aW50ZXJzZWN0aW9uLmZhY2UgPSBmYWNlO1xuXHRcdFx0XHRcdFx0aW50ZXJzZWN0aW9uLmZhY2VJbmRleCA9IGY7XG5cdFx0XHRcdFx0XHRpbnRlcnNlY3RzLnB1c2goIGludGVyc2VjdGlvbiApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fTtcblxuXHR9KCkgKSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCB0aGlzLmdlb21ldHJ5LCB0aGlzLm1hdGVyaWFsICkuY29weSggdGhpcyApO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gV2ViR0xCYWNrZ3JvdW5kKCByZW5kZXJlciwgc3RhdGUsIGdlb21ldHJpZXMsIHByZW11bHRpcGxpZWRBbHBoYSApIHtcblxuXHR2YXIgY2xlYXJDb2xvciA9IG5ldyBDb2xvciggMHgwMDAwMDAgKTtcblx0dmFyIGNsZWFyQWxwaGEgPSAwO1xuXG5cdHZhciBwbGFuZUNhbWVyYSwgcGxhbmVNZXNoO1xuXHR2YXIgYm94TWVzaDtcblxuXHRmdW5jdGlvbiByZW5kZXIoIHJlbmRlckxpc3QsIHNjZW5lLCBjYW1lcmEsIGZvcmNlQ2xlYXIgKSB7XG5cblx0XHR2YXIgYmFja2dyb3VuZCA9IHNjZW5lLmJhY2tncm91bmQ7XG5cblx0XHRpZiAoIGJhY2tncm91bmQgPT09IG51bGwgKSB7XG5cblx0XHRcdHNldENsZWFyKCBjbGVhckNvbG9yLCBjbGVhckFscGhhICk7XG5cblx0XHR9IGVsc2UgaWYgKCBiYWNrZ3JvdW5kICYmIGJhY2tncm91bmQuaXNDb2xvciApIHtcblxuXHRcdFx0c2V0Q2xlYXIoIGJhY2tncm91bmQsIDEgKTtcblx0XHRcdGZvcmNlQ2xlYXIgPSB0cnVlO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCByZW5kZXJlci5hdXRvQ2xlYXIgfHwgZm9yY2VDbGVhciApIHtcblxuXHRcdFx0cmVuZGVyZXIuY2xlYXIoIHJlbmRlcmVyLmF1dG9DbGVhckNvbG9yLCByZW5kZXJlci5hdXRvQ2xlYXJEZXB0aCwgcmVuZGVyZXIuYXV0b0NsZWFyU3RlbmNpbCApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBiYWNrZ3JvdW5kICYmIGJhY2tncm91bmQuaXNDdWJlVGV4dHVyZSApIHtcblxuXHRcdFx0aWYgKCBib3hNZXNoID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Ym94TWVzaCA9IG5ldyBNZXNoKFxuXHRcdFx0XHRcdG5ldyBCb3hCdWZmZXJHZW9tZXRyeSggMSwgMSwgMSApLFxuXHRcdFx0XHRcdG5ldyBTaGFkZXJNYXRlcmlhbCgge1xuXHRcdFx0XHRcdFx0dW5pZm9ybXM6IFNoYWRlckxpYi5jdWJlLnVuaWZvcm1zLFxuXHRcdFx0XHRcdFx0dmVydGV4U2hhZGVyOiBTaGFkZXJMaWIuY3ViZS52ZXJ0ZXhTaGFkZXIsXG5cdFx0XHRcdFx0XHRmcmFnbWVudFNoYWRlcjogU2hhZGVyTGliLmN1YmUuZnJhZ21lbnRTaGFkZXIsXG5cdFx0XHRcdFx0XHRzaWRlOiBCYWNrU2lkZSxcblx0XHRcdFx0XHRcdGRlcHRoVGVzdDogdHJ1ZSxcblx0XHRcdFx0XHRcdGRlcHRoV3JpdGU6IGZhbHNlLFxuXHRcdFx0XHRcdFx0Zm9nOiBmYWxzZVxuXHRcdFx0XHRcdH0gKVxuXHRcdFx0XHQpO1xuXG5cdFx0XHRcdGJveE1lc2guZ2VvbWV0cnkucmVtb3ZlQXR0cmlidXRlKCAnbm9ybWFsJyApO1xuXHRcdFx0XHRib3hNZXNoLmdlb21ldHJ5LnJlbW92ZUF0dHJpYnV0ZSggJ3V2JyApO1xuXG5cdFx0XHRcdGJveE1lc2gub25CZWZvcmVSZW5kZXIgPSBmdW5jdGlvbiAoIHJlbmRlcmVyLCBzY2VuZSwgY2FtZXJhICkge1xuXG5cdFx0XHRcdFx0dGhpcy5tYXRyaXhXb3JsZC5jb3B5UG9zaXRpb24oIGNhbWVyYS5tYXRyaXhXb3JsZCApO1xuXG5cdFx0XHRcdH07XG5cblx0XHRcdFx0Z2VvbWV0cmllcy51cGRhdGUoIGJveE1lc2guZ2VvbWV0cnkgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRib3hNZXNoLm1hdGVyaWFsLnVuaWZvcm1zLnRDdWJlLnZhbHVlID0gYmFja2dyb3VuZDtcblxuXHRcdFx0cmVuZGVyTGlzdC5wdXNoKCBib3hNZXNoLCBib3hNZXNoLmdlb21ldHJ5LCBib3hNZXNoLm1hdGVyaWFsLCAwLCBudWxsICk7XG5cblx0XHR9IGVsc2UgaWYgKCBiYWNrZ3JvdW5kICYmIGJhY2tncm91bmQuaXNUZXh0dXJlICkge1xuXG5cdFx0XHRpZiAoIHBsYW5lQ2FtZXJhID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0cGxhbmVDYW1lcmEgPSBuZXcgT3J0aG9ncmFwaGljQ2FtZXJhKCAtIDEsIDEsIDEsIC0gMSwgMCwgMSApO1xuXG5cdFx0XHRcdHBsYW5lTWVzaCA9IG5ldyBNZXNoKFxuXHRcdFx0XHRcdG5ldyBQbGFuZUJ1ZmZlckdlb21ldHJ5KCAyLCAyICksXG5cdFx0XHRcdFx0bmV3IE1lc2hCYXNpY01hdGVyaWFsKCB7IGRlcHRoVGVzdDogZmFsc2UsIGRlcHRoV3JpdGU6IGZhbHNlLCBmb2c6IGZhbHNlIH0gKVxuXHRcdFx0XHQpO1xuXG5cdFx0XHRcdGdlb21ldHJpZXMudXBkYXRlKCBwbGFuZU1lc2guZ2VvbWV0cnkgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRwbGFuZU1lc2gubWF0ZXJpYWwubWFwID0gYmFja2dyb3VuZDtcblxuXHRcdFx0Ly8gVE9ETyBQdXNoIHRoaXMgdG8gcmVuZGVyTGlzdFxuXG5cdFx0XHRyZW5kZXJlci5yZW5kZXJCdWZmZXJEaXJlY3QoIHBsYW5lQ2FtZXJhLCBudWxsLCBwbGFuZU1lc2guZ2VvbWV0cnksIHBsYW5lTWVzaC5tYXRlcmlhbCwgcGxhbmVNZXNoLCBudWxsICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHNldENsZWFyKCBjb2xvciwgYWxwaGEgKSB7XG5cblx0XHRzdGF0ZS5idWZmZXJzLmNvbG9yLnNldENsZWFyKCBjb2xvci5yLCBjb2xvci5nLCBjb2xvci5iLCBhbHBoYSwgcHJlbXVsdGlwbGllZEFscGhhICk7XG5cblx0fVxuXG5cdHJldHVybiB7XG5cblx0XHRnZXRDbGVhckNvbG9yOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdHJldHVybiBjbGVhckNvbG9yO1xuXG5cdFx0fSxcblx0XHRzZXRDbGVhckNvbG9yOiBmdW5jdGlvbiAoIGNvbG9yLCBhbHBoYSApIHtcblxuXHRcdFx0Y2xlYXJDb2xvci5zZXQoIGNvbG9yICk7XG5cdFx0XHRjbGVhckFscGhhID0gYWxwaGEgIT09IHVuZGVmaW5lZCA/IGFscGhhIDogMTtcblx0XHRcdHNldENsZWFyKCBjbGVhckNvbG9yLCBjbGVhckFscGhhICk7XG5cblx0XHR9LFxuXHRcdGdldENsZWFyQWxwaGE6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0cmV0dXJuIGNsZWFyQWxwaGE7XG5cblx0XHR9LFxuXHRcdHNldENsZWFyQWxwaGE6IGZ1bmN0aW9uICggYWxwaGEgKSB7XG5cblx0XHRcdGNsZWFyQWxwaGEgPSBhbHBoYTtcblx0XHRcdHNldENsZWFyKCBjbGVhckNvbG9yLCBjbGVhckFscGhhICk7XG5cblx0XHR9LFxuXHRcdHJlbmRlcjogcmVuZGVyXG5cblx0fTtcblxufVxuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gV2ViR0xCdWZmZXJSZW5kZXJlciggZ2wsIGV4dGVuc2lvbnMsIGluZm8gKSB7XG5cblx0dmFyIG1vZGU7XG5cblx0ZnVuY3Rpb24gc2V0TW9kZSggdmFsdWUgKSB7XG5cblx0XHRtb2RlID0gdmFsdWU7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlbmRlciggc3RhcnQsIGNvdW50ICkge1xuXG5cdFx0Z2wuZHJhd0FycmF5cyggbW9kZSwgc3RhcnQsIGNvdW50ICk7XG5cblx0XHRpbmZvLnVwZGF0ZSggY291bnQsIG1vZGUgKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVuZGVySW5zdGFuY2VzKCBnZW9tZXRyeSwgc3RhcnQsIGNvdW50ICkge1xuXG5cdFx0dmFyIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCAnQU5HTEVfaW5zdGFuY2VkX2FycmF5cycgKTtcblxuXHRcdGlmICggZXh0ZW5zaW9uID09PSBudWxsICkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuV2ViR0xCdWZmZXJSZW5kZXJlcjogdXNpbmcgVEhSRUUuSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkgYnV0IGhhcmR3YXJlIGRvZXMgbm90IHN1cHBvcnQgZXh0ZW5zaW9uIEFOR0xFX2luc3RhbmNlZF9hcnJheXMuJyApO1xuXHRcdFx0cmV0dXJuO1xuXG5cdFx0fVxuXG5cdFx0dmFyIHBvc2l0aW9uID0gZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbjtcblxuXHRcdGlmICggcG9zaXRpb24uaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSApIHtcblxuXHRcdFx0Y291bnQgPSBwb3NpdGlvbi5kYXRhLmNvdW50O1xuXG5cdFx0XHRleHRlbnNpb24uZHJhd0FycmF5c0luc3RhbmNlZEFOR0xFKCBtb2RlLCAwLCBjb3VudCwgZ2VvbWV0cnkubWF4SW5zdGFuY2VkQ291bnQgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGV4dGVuc2lvbi5kcmF3QXJyYXlzSW5zdGFuY2VkQU5HTEUoIG1vZGUsIHN0YXJ0LCBjb3VudCwgZ2VvbWV0cnkubWF4SW5zdGFuY2VkQ291bnQgKTtcblxuXHRcdH1cblxuXHRcdGluZm8udXBkYXRlKCBjb3VudCwgbW9kZSwgZ2VvbWV0cnkubWF4SW5zdGFuY2VkQ291bnQgKTtcblxuXHR9XG5cblx0Ly9cblxuXHR0aGlzLnNldE1vZGUgPSBzZXRNb2RlO1xuXHR0aGlzLnJlbmRlciA9IHJlbmRlcjtcblx0dGhpcy5yZW5kZXJJbnN0YW5jZXMgPSByZW5kZXJJbnN0YW5jZXM7XG5cbn1cblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIFdlYkdMQ2FwYWJpbGl0aWVzKCBnbCwgZXh0ZW5zaW9ucywgcGFyYW1ldGVycyApIHtcblxuXHR2YXIgbWF4QW5pc290cm9weTtcblxuXHRmdW5jdGlvbiBnZXRNYXhBbmlzb3Ryb3B5KCkge1xuXG5cdFx0aWYgKCBtYXhBbmlzb3Ryb3B5ICE9PSB1bmRlZmluZWQgKSByZXR1cm4gbWF4QW5pc290cm9weTtcblxuXHRcdHZhciBleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ0VYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYycgKTtcblxuXHRcdGlmICggZXh0ZW5zaW9uICE9PSBudWxsICkge1xuXG5cdFx0XHRtYXhBbmlzb3Ryb3B5ID0gZ2wuZ2V0UGFyYW1ldGVyKCBleHRlbnNpb24uTUFYX1RFWFRVUkVfTUFYX0FOSVNPVFJPUFlfRVhUICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRtYXhBbmlzb3Ryb3B5ID0gMDtcblxuXHRcdH1cblxuXHRcdHJldHVybiBtYXhBbmlzb3Ryb3B5O1xuXG5cdH1cblxuXHRmdW5jdGlvbiBnZXRNYXhQcmVjaXNpb24oIHByZWNpc2lvbiApIHtcblxuXHRcdGlmICggcHJlY2lzaW9uID09PSAnaGlnaHAnICkge1xuXG5cdFx0XHRpZiAoIGdsLmdldFNoYWRlclByZWNpc2lvbkZvcm1hdCggZ2wuVkVSVEVYX1NIQURFUiwgZ2wuSElHSF9GTE9BVCApLnByZWNpc2lvbiA+IDAgJiZcblx0XHRcdCAgICAgZ2wuZ2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0KCBnbC5GUkFHTUVOVF9TSEFERVIsIGdsLkhJR0hfRkxPQVQgKS5wcmVjaXNpb24gPiAwICkge1xuXG5cdFx0XHRcdHJldHVybiAnaGlnaHAnO1xuXG5cdFx0XHR9XG5cblx0XHRcdHByZWNpc2lvbiA9ICdtZWRpdW1wJztcblxuXHRcdH1cblxuXHRcdGlmICggcHJlY2lzaW9uID09PSAnbWVkaXVtcCcgKSB7XG5cblx0XHRcdGlmICggZ2wuZ2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0KCBnbC5WRVJURVhfU0hBREVSLCBnbC5NRURJVU1fRkxPQVQgKS5wcmVjaXNpb24gPiAwICYmXG5cdFx0XHQgICAgIGdsLmdldFNoYWRlclByZWNpc2lvbkZvcm1hdCggZ2wuRlJBR01FTlRfU0hBREVSLCBnbC5NRURJVU1fRkxPQVQgKS5wcmVjaXNpb24gPiAwICkge1xuXG5cdFx0XHRcdHJldHVybiAnbWVkaXVtcCc7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiAnbG93cCc7XG5cblx0fVxuXG5cdHZhciBwcmVjaXNpb24gPSBwYXJhbWV0ZXJzLnByZWNpc2lvbiAhPT0gdW5kZWZpbmVkID8gcGFyYW1ldGVycy5wcmVjaXNpb24gOiAnaGlnaHAnO1xuXHR2YXIgbWF4UHJlY2lzaW9uID0gZ2V0TWF4UHJlY2lzaW9uKCBwcmVjaXNpb24gKTtcblxuXHRpZiAoIG1heFByZWNpc2lvbiAhPT0gcHJlY2lzaW9uICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjonLCBwcmVjaXNpb24sICdub3Qgc3VwcG9ydGVkLCB1c2luZycsIG1heFByZWNpc2lvbiwgJ2luc3RlYWQuJyApO1xuXHRcdHByZWNpc2lvbiA9IG1heFByZWNpc2lvbjtcblxuXHR9XG5cblx0dmFyIGxvZ2FyaXRobWljRGVwdGhCdWZmZXIgPSBwYXJhbWV0ZXJzLmxvZ2FyaXRobWljRGVwdGhCdWZmZXIgPT09IHRydWU7XG5cblx0dmFyIG1heFRleHR1cmVzID0gZ2wuZ2V0UGFyYW1ldGVyKCBnbC5NQVhfVEVYVFVSRV9JTUFHRV9VTklUUyApO1xuXHR2YXIgbWF4VmVydGV4VGV4dHVyZXMgPSBnbC5nZXRQYXJhbWV0ZXIoIGdsLk1BWF9WRVJURVhfVEVYVFVSRV9JTUFHRV9VTklUUyApO1xuXHR2YXIgbWF4VGV4dHVyZVNpemUgPSBnbC5nZXRQYXJhbWV0ZXIoIGdsLk1BWF9URVhUVVJFX1NJWkUgKTtcblx0dmFyIG1heEN1YmVtYXBTaXplID0gZ2wuZ2V0UGFyYW1ldGVyKCBnbC5NQVhfQ1VCRV9NQVBfVEVYVFVSRV9TSVpFICk7XG5cblx0dmFyIG1heEF0dHJpYnV0ZXMgPSBnbC5nZXRQYXJhbWV0ZXIoIGdsLk1BWF9WRVJURVhfQVRUUklCUyApO1xuXHR2YXIgbWF4VmVydGV4VW5pZm9ybXMgPSBnbC5nZXRQYXJhbWV0ZXIoIGdsLk1BWF9WRVJURVhfVU5JRk9STV9WRUNUT1JTICk7XG5cdHZhciBtYXhWYXJ5aW5ncyA9IGdsLmdldFBhcmFtZXRlciggZ2wuTUFYX1ZBUllJTkdfVkVDVE9SUyApO1xuXHR2YXIgbWF4RnJhZ21lbnRVbmlmb3JtcyA9IGdsLmdldFBhcmFtZXRlciggZ2wuTUFYX0ZSQUdNRU5UX1VOSUZPUk1fVkVDVE9SUyApO1xuXG5cdHZhciB2ZXJ0ZXhUZXh0dXJlcyA9IG1heFZlcnRleFRleHR1cmVzID4gMDtcblx0dmFyIGZsb2F0RnJhZ21lbnRUZXh0dXJlcyA9ICEhIGV4dGVuc2lvbnMuZ2V0KCAnT0VTX3RleHR1cmVfZmxvYXQnICk7XG5cdHZhciBmbG9hdFZlcnRleFRleHR1cmVzID0gdmVydGV4VGV4dHVyZXMgJiYgZmxvYXRGcmFnbWVudFRleHR1cmVzO1xuXG5cdHJldHVybiB7XG5cblx0XHRnZXRNYXhBbmlzb3Ryb3B5OiBnZXRNYXhBbmlzb3Ryb3B5LFxuXHRcdGdldE1heFByZWNpc2lvbjogZ2V0TWF4UHJlY2lzaW9uLFxuXG5cdFx0cHJlY2lzaW9uOiBwcmVjaXNpb24sXG5cdFx0bG9nYXJpdGhtaWNEZXB0aEJ1ZmZlcjogbG9nYXJpdGhtaWNEZXB0aEJ1ZmZlcixcblxuXHRcdG1heFRleHR1cmVzOiBtYXhUZXh0dXJlcyxcblx0XHRtYXhWZXJ0ZXhUZXh0dXJlczogbWF4VmVydGV4VGV4dHVyZXMsXG5cdFx0bWF4VGV4dHVyZVNpemU6IG1heFRleHR1cmVTaXplLFxuXHRcdG1heEN1YmVtYXBTaXplOiBtYXhDdWJlbWFwU2l6ZSxcblxuXHRcdG1heEF0dHJpYnV0ZXM6IG1heEF0dHJpYnV0ZXMsXG5cdFx0bWF4VmVydGV4VW5pZm9ybXM6IG1heFZlcnRleFVuaWZvcm1zLFxuXHRcdG1heFZhcnlpbmdzOiBtYXhWYXJ5aW5ncyxcblx0XHRtYXhGcmFnbWVudFVuaWZvcm1zOiBtYXhGcmFnbWVudFVuaWZvcm1zLFxuXG5cdFx0dmVydGV4VGV4dHVyZXM6IHZlcnRleFRleHR1cmVzLFxuXHRcdGZsb2F0RnJhZ21lbnRUZXh0dXJlczogZmxvYXRGcmFnbWVudFRleHR1cmVzLFxuXHRcdGZsb2F0VmVydGV4VGV4dHVyZXM6IGZsb2F0VmVydGV4VGV4dHVyZXNcblxuXHR9O1xuXG59XG5cbi8qKlxuICogQGF1dGhvciB0c2Nod1xuICovXG5cbmZ1bmN0aW9uIFdlYkdMQ2xpcHBpbmcoKSB7XG5cblx0dmFyIHNjb3BlID0gdGhpcyxcblxuXHRcdGdsb2JhbFN0YXRlID0gbnVsbCxcblx0XHRudW1HbG9iYWxQbGFuZXMgPSAwLFxuXHRcdGxvY2FsQ2xpcHBpbmdFbmFibGVkID0gZmFsc2UsXG5cdFx0cmVuZGVyaW5nU2hhZG93cyA9IGZhbHNlLFxuXG5cdFx0cGxhbmUgPSBuZXcgUGxhbmUoKSxcblx0XHR2aWV3Tm9ybWFsTWF0cml4ID0gbmV3IE1hdHJpeDMoKSxcblxuXHRcdHVuaWZvcm0gPSB7IHZhbHVlOiBudWxsLCBuZWVkc1VwZGF0ZTogZmFsc2UgfTtcblxuXHR0aGlzLnVuaWZvcm0gPSB1bmlmb3JtO1xuXHR0aGlzLm51bVBsYW5lcyA9IDA7XG5cdHRoaXMubnVtSW50ZXJzZWN0aW9uID0gMDtcblxuXHR0aGlzLmluaXQgPSBmdW5jdGlvbiAoIHBsYW5lcywgZW5hYmxlTG9jYWxDbGlwcGluZywgY2FtZXJhICkge1xuXG5cdFx0dmFyIGVuYWJsZWQgPVxuXHRcdFx0cGxhbmVzLmxlbmd0aCAhPT0gMCB8fFxuXHRcdFx0ZW5hYmxlTG9jYWxDbGlwcGluZyB8fFxuXHRcdFx0Ly8gZW5hYmxlIHN0YXRlIG9mIHByZXZpb3VzIGZyYW1lIC0gdGhlIGNsaXBwaW5nIGNvZGUgaGFzIHRvXG5cdFx0XHQvLyBydW4gYW5vdGhlciBmcmFtZSBpbiBvcmRlciB0byByZXNldCB0aGUgc3RhdGU6XG5cdFx0XHRudW1HbG9iYWxQbGFuZXMgIT09IDAgfHxcblx0XHRcdGxvY2FsQ2xpcHBpbmdFbmFibGVkO1xuXG5cdFx0bG9jYWxDbGlwcGluZ0VuYWJsZWQgPSBlbmFibGVMb2NhbENsaXBwaW5nO1xuXG5cdFx0Z2xvYmFsU3RhdGUgPSBwcm9qZWN0UGxhbmVzKCBwbGFuZXMsIGNhbWVyYSwgMCApO1xuXHRcdG51bUdsb2JhbFBsYW5lcyA9IHBsYW5lcy5sZW5ndGg7XG5cblx0XHRyZXR1cm4gZW5hYmxlZDtcblxuXHR9O1xuXG5cdHRoaXMuYmVnaW5TaGFkb3dzID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0cmVuZGVyaW5nU2hhZG93cyA9IHRydWU7XG5cdFx0cHJvamVjdFBsYW5lcyggbnVsbCApO1xuXG5cdH07XG5cblx0dGhpcy5lbmRTaGFkb3dzID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0cmVuZGVyaW5nU2hhZG93cyA9IGZhbHNlO1xuXHRcdHJlc2V0R2xvYmFsU3RhdGUoKTtcblxuXHR9O1xuXG5cdHRoaXMuc2V0U3RhdGUgPSBmdW5jdGlvbiAoIHBsYW5lcywgY2xpcEludGVyc2VjdGlvbiwgY2xpcFNoYWRvd3MsIGNhbWVyYSwgY2FjaGUsIGZyb21DYWNoZSApIHtcblxuXHRcdGlmICggISBsb2NhbENsaXBwaW5nRW5hYmxlZCB8fCBwbGFuZXMgPT09IG51bGwgfHwgcGxhbmVzLmxlbmd0aCA9PT0gMCB8fCByZW5kZXJpbmdTaGFkb3dzICYmICEgY2xpcFNoYWRvd3MgKSB7XG5cblx0XHRcdC8vIHRoZXJlJ3Mgbm8gbG9jYWwgY2xpcHBpbmdcblxuXHRcdFx0aWYgKCByZW5kZXJpbmdTaGFkb3dzICkge1xuXG5cdFx0XHRcdC8vIHRoZXJlJ3Mgbm8gZ2xvYmFsIGNsaXBwaW5nXG5cblx0XHRcdFx0cHJvamVjdFBsYW5lcyggbnVsbCApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHJlc2V0R2xvYmFsU3RhdGUoKTtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dmFyIG5HbG9iYWwgPSByZW5kZXJpbmdTaGFkb3dzID8gMCA6IG51bUdsb2JhbFBsYW5lcyxcblx0XHRcdFx0bEdsb2JhbCA9IG5HbG9iYWwgKiA0LFxuXG5cdFx0XHRcdGRzdEFycmF5ID0gY2FjaGUuY2xpcHBpbmdTdGF0ZSB8fCBudWxsO1xuXG5cdFx0XHR1bmlmb3JtLnZhbHVlID0gZHN0QXJyYXk7IC8vIGVuc3VyZSB1bmlxdWUgc3RhdGVcblxuXHRcdFx0ZHN0QXJyYXkgPSBwcm9qZWN0UGxhbmVzKCBwbGFuZXMsIGNhbWVyYSwgbEdsb2JhbCwgZnJvbUNhY2hlICk7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMDsgaSAhPT0gbEdsb2JhbDsgKysgaSApIHtcblxuXHRcdFx0XHRkc3RBcnJheVsgaSBdID0gZ2xvYmFsU3RhdGVbIGkgXTtcblxuXHRcdFx0fVxuXG5cdFx0XHRjYWNoZS5jbGlwcGluZ1N0YXRlID0gZHN0QXJyYXk7XG5cdFx0XHR0aGlzLm51bUludGVyc2VjdGlvbiA9IGNsaXBJbnRlcnNlY3Rpb24gPyB0aGlzLm51bVBsYW5lcyA6IDA7XG5cdFx0XHR0aGlzLm51bVBsYW5lcyArPSBuR2xvYmFsO1xuXG5cdFx0fVxuXG5cblx0fTtcblxuXHRmdW5jdGlvbiByZXNldEdsb2JhbFN0YXRlKCkge1xuXG5cdFx0aWYgKCB1bmlmb3JtLnZhbHVlICE9PSBnbG9iYWxTdGF0ZSApIHtcblxuXHRcdFx0dW5pZm9ybS52YWx1ZSA9IGdsb2JhbFN0YXRlO1xuXHRcdFx0dW5pZm9ybS5uZWVkc1VwZGF0ZSA9IG51bUdsb2JhbFBsYW5lcyA+IDA7XG5cblx0XHR9XG5cblx0XHRzY29wZS5udW1QbGFuZXMgPSBudW1HbG9iYWxQbGFuZXM7XG5cdFx0c2NvcGUubnVtSW50ZXJzZWN0aW9uID0gMDtcblxuXHR9XG5cblx0ZnVuY3Rpb24gcHJvamVjdFBsYW5lcyggcGxhbmVzLCBjYW1lcmEsIGRzdE9mZnNldCwgc2tpcFRyYW5zZm9ybSApIHtcblxuXHRcdHZhciBuUGxhbmVzID0gcGxhbmVzICE9PSBudWxsID8gcGxhbmVzLmxlbmd0aCA6IDAsXG5cdFx0XHRkc3RBcnJheSA9IG51bGw7XG5cblx0XHRpZiAoIG5QbGFuZXMgIT09IDAgKSB7XG5cblx0XHRcdGRzdEFycmF5ID0gdW5pZm9ybS52YWx1ZTtcblxuXHRcdFx0aWYgKCBza2lwVHJhbnNmb3JtICE9PSB0cnVlIHx8IGRzdEFycmF5ID09PSBudWxsICkge1xuXG5cdFx0XHRcdHZhciBmbGF0U2l6ZSA9IGRzdE9mZnNldCArIG5QbGFuZXMgKiA0LFxuXHRcdFx0XHRcdHZpZXdNYXRyaXggPSBjYW1lcmEubWF0cml4V29ybGRJbnZlcnNlO1xuXG5cdFx0XHRcdHZpZXdOb3JtYWxNYXRyaXguZ2V0Tm9ybWFsTWF0cml4KCB2aWV3TWF0cml4ICk7XG5cblx0XHRcdFx0aWYgKCBkc3RBcnJheSA9PT0gbnVsbCB8fCBkc3RBcnJheS5sZW5ndGggPCBmbGF0U2l6ZSApIHtcblxuXHRcdFx0XHRcdGRzdEFycmF5ID0gbmV3IEZsb2F0MzJBcnJheSggZmxhdFNpemUgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBpNCA9IGRzdE9mZnNldDsgaSAhPT0gblBsYW5lczsgKysgaSwgaTQgKz0gNCApIHtcblxuXHRcdFx0XHRcdHBsYW5lLmNvcHkoIHBsYW5lc1sgaSBdICkuYXBwbHlNYXRyaXg0KCB2aWV3TWF0cml4LCB2aWV3Tm9ybWFsTWF0cml4ICk7XG5cblx0XHRcdFx0XHRwbGFuZS5ub3JtYWwudG9BcnJheSggZHN0QXJyYXksIGk0ICk7XG5cdFx0XHRcdFx0ZHN0QXJyYXlbIGk0ICsgMyBdID0gcGxhbmUuY29uc3RhbnQ7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdHVuaWZvcm0udmFsdWUgPSBkc3RBcnJheTtcblx0XHRcdHVuaWZvcm0ubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0fVxuXG5cdFx0c2NvcGUubnVtUGxhbmVzID0gblBsYW5lcztcblxuXHRcdHJldHVybiBkc3RBcnJheTtcblxuXHR9XG5cbn1cblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIFdlYkdMRXh0ZW5zaW9ucyggZ2wgKSB7XG5cblx0dmFyIGV4dGVuc2lvbnMgPSB7fTtcblxuXHRyZXR1cm4ge1xuXG5cdFx0Z2V0OiBmdW5jdGlvbiAoIG5hbWUgKSB7XG5cblx0XHRcdGlmICggZXh0ZW5zaW9uc1sgbmFtZSBdICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0cmV0dXJuIGV4dGVuc2lvbnNbIG5hbWUgXTtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgZXh0ZW5zaW9uO1xuXG5cdFx0XHRzd2l0Y2ggKCBuYW1lICkge1xuXG5cdFx0XHRcdGNhc2UgJ1dFQkdMX2RlcHRoX3RleHR1cmUnOlxuXHRcdFx0XHRcdGV4dGVuc2lvbiA9IGdsLmdldEV4dGVuc2lvbiggJ1dFQkdMX2RlcHRoX3RleHR1cmUnICkgfHwgZ2wuZ2V0RXh0ZW5zaW9uKCAnTU9aX1dFQkdMX2RlcHRoX3RleHR1cmUnICkgfHwgZ2wuZ2V0RXh0ZW5zaW9uKCAnV0VCS0lUX1dFQkdMX2RlcHRoX3RleHR1cmUnICk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSAnRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljJzpcblx0XHRcdFx0XHRleHRlbnNpb24gPSBnbC5nZXRFeHRlbnNpb24oICdFWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMnICkgfHwgZ2wuZ2V0RXh0ZW5zaW9uKCAnTU9aX0VYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYycgKSB8fCBnbC5nZXRFeHRlbnNpb24oICdXRUJLSVRfRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljJyApO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjJzpcblx0XHRcdFx0XHRleHRlbnNpb24gPSBnbC5nZXRFeHRlbnNpb24oICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0YycgKSB8fCBnbC5nZXRFeHRlbnNpb24oICdNT1pfV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMnICkgfHwgZ2wuZ2V0RXh0ZW5zaW9uKCAnV0VCS0lUX1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjJyApO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0Yyc6XG5cdFx0XHRcdFx0ZXh0ZW5zaW9uID0gZ2wuZ2V0RXh0ZW5zaW9uKCAnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjJyApIHx8IGdsLmdldEV4dGVuc2lvbiggJ1dFQktJVF9XRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfcHZydGMnICk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRleHRlbnNpb24gPSBnbC5nZXRFeHRlbnNpb24oIG5hbWUgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGV4dGVuc2lvbiA9PT0gbnVsbCApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAnICsgbmFtZSArICcgZXh0ZW5zaW9uIG5vdCBzdXBwb3J0ZWQuJyApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGV4dGVuc2lvbnNbIG5hbWUgXSA9IGV4dGVuc2lvbjtcblxuXHRcdFx0cmV0dXJuIGV4dGVuc2lvbjtcblxuXHRcdH1cblxuXHR9O1xuXG59XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBXZWJHTEdlb21ldHJpZXMoIGdsLCBhdHRyaWJ1dGVzLCBpbmZvICkge1xuXG5cdHZhciBnZW9tZXRyaWVzID0ge307XG5cdHZhciB3aXJlZnJhbWVBdHRyaWJ1dGVzID0ge307XG5cblx0ZnVuY3Rpb24gb25HZW9tZXRyeURpc3Bvc2UoIGV2ZW50ICkge1xuXG5cdFx0dmFyIGdlb21ldHJ5ID0gZXZlbnQudGFyZ2V0O1xuXHRcdHZhciBidWZmZXJnZW9tZXRyeSA9IGdlb21ldHJpZXNbIGdlb21ldHJ5LmlkIF07XG5cblx0XHRpZiAoIGJ1ZmZlcmdlb21ldHJ5LmluZGV4ICE9PSBudWxsICkge1xuXG5cdFx0XHRhdHRyaWJ1dGVzLnJlbW92ZSggYnVmZmVyZ2VvbWV0cnkuaW5kZXggKTtcblxuXHRcdH1cblxuXHRcdGZvciAoIHZhciBuYW1lIGluIGJ1ZmZlcmdlb21ldHJ5LmF0dHJpYnV0ZXMgKSB7XG5cblx0XHRcdGF0dHJpYnV0ZXMucmVtb3ZlKCBidWZmZXJnZW9tZXRyeS5hdHRyaWJ1dGVzWyBuYW1lIF0gKTtcblxuXHRcdH1cblxuXHRcdGdlb21ldHJ5LnJlbW92ZUV2ZW50TGlzdGVuZXIoICdkaXNwb3NlJywgb25HZW9tZXRyeURpc3Bvc2UgKTtcblxuXHRcdGRlbGV0ZSBnZW9tZXRyaWVzWyBnZW9tZXRyeS5pZCBdO1xuXG5cdFx0Ly8gVE9ETyBSZW1vdmUgZHVwbGljYXRlIGNvZGVcblxuXHRcdHZhciBhdHRyaWJ1dGUgPSB3aXJlZnJhbWVBdHRyaWJ1dGVzWyBnZW9tZXRyeS5pZCBdO1xuXG5cdFx0aWYgKCBhdHRyaWJ1dGUgKSB7XG5cblx0XHRcdGF0dHJpYnV0ZXMucmVtb3ZlKCBhdHRyaWJ1dGUgKTtcblx0XHRcdGRlbGV0ZSB3aXJlZnJhbWVBdHRyaWJ1dGVzWyBnZW9tZXRyeS5pZCBdO1xuXG5cdFx0fVxuXG5cdFx0YXR0cmlidXRlID0gd2lyZWZyYW1lQXR0cmlidXRlc1sgYnVmZmVyZ2VvbWV0cnkuaWQgXTtcblxuXHRcdGlmICggYXR0cmlidXRlICkge1xuXG5cdFx0XHRhdHRyaWJ1dGVzLnJlbW92ZSggYXR0cmlidXRlICk7XG5cdFx0XHRkZWxldGUgd2lyZWZyYW1lQXR0cmlidXRlc1sgYnVmZmVyZ2VvbWV0cnkuaWQgXTtcblxuXHRcdH1cblxuXHRcdC8vXG5cblx0XHRpbmZvLm1lbW9yeS5nZW9tZXRyaWVzIC0tO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBnZXQoIG9iamVjdCwgZ2VvbWV0cnkgKSB7XG5cblx0XHR2YXIgYnVmZmVyZ2VvbWV0cnkgPSBnZW9tZXRyaWVzWyBnZW9tZXRyeS5pZCBdO1xuXG5cdFx0aWYgKCBidWZmZXJnZW9tZXRyeSApIHJldHVybiBidWZmZXJnZW9tZXRyeTtcblxuXHRcdGdlb21ldHJ5LmFkZEV2ZW50TGlzdGVuZXIoICdkaXNwb3NlJywgb25HZW9tZXRyeURpc3Bvc2UgKTtcblxuXHRcdGlmICggZ2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSApIHtcblxuXHRcdFx0YnVmZmVyZ2VvbWV0cnkgPSBnZW9tZXRyeTtcblxuXHRcdH0gZWxzZSBpZiAoIGdlb21ldHJ5LmlzR2VvbWV0cnkgKSB7XG5cblx0XHRcdGlmICggZ2VvbWV0cnkuX2J1ZmZlckdlb21ldHJ5ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Z2VvbWV0cnkuX2J1ZmZlckdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCkuc2V0RnJvbU9iamVjdCggb2JqZWN0ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0YnVmZmVyZ2VvbWV0cnkgPSBnZW9tZXRyeS5fYnVmZmVyR2VvbWV0cnk7XG5cblx0XHR9XG5cblx0XHRnZW9tZXRyaWVzWyBnZW9tZXRyeS5pZCBdID0gYnVmZmVyZ2VvbWV0cnk7XG5cblx0XHRpbmZvLm1lbW9yeS5nZW9tZXRyaWVzICsrO1xuXG5cdFx0cmV0dXJuIGJ1ZmZlcmdlb21ldHJ5O1xuXG5cdH1cblxuXHRmdW5jdGlvbiB1cGRhdGUoIGdlb21ldHJ5ICkge1xuXG5cdFx0dmFyIGluZGV4ID0gZ2VvbWV0cnkuaW5kZXg7XG5cdFx0dmFyIGdlb21ldHJ5QXR0cmlidXRlcyA9IGdlb21ldHJ5LmF0dHJpYnV0ZXM7XG5cblx0XHRpZiAoIGluZGV4ICE9PSBudWxsICkge1xuXG5cdFx0XHRhdHRyaWJ1dGVzLnVwZGF0ZSggaW5kZXgsIGdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSICk7XG5cblx0XHR9XG5cblx0XHRmb3IgKCB2YXIgbmFtZSBpbiBnZW9tZXRyeUF0dHJpYnV0ZXMgKSB7XG5cblx0XHRcdGF0dHJpYnV0ZXMudXBkYXRlKCBnZW9tZXRyeUF0dHJpYnV0ZXNbIG5hbWUgXSwgZ2wuQVJSQVlfQlVGRkVSICk7XG5cblx0XHR9XG5cblx0XHQvLyBtb3JwaCB0YXJnZXRzXG5cblx0XHR2YXIgbW9ycGhBdHRyaWJ1dGVzID0gZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzO1xuXG5cdFx0Zm9yICggdmFyIG5hbWUgaW4gbW9ycGhBdHRyaWJ1dGVzICkge1xuXG5cdFx0XHR2YXIgYXJyYXkgPSBtb3JwaEF0dHJpYnV0ZXNbIG5hbWUgXTtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gYXJyYXkubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRhdHRyaWJ1dGVzLnVwZGF0ZSggYXJyYXlbIGkgXSwgZ2wuQVJSQVlfQlVGRkVSICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gZ2V0V2lyZWZyYW1lQXR0cmlidXRlKCBnZW9tZXRyeSApIHtcblxuXHRcdHZhciBhdHRyaWJ1dGUgPSB3aXJlZnJhbWVBdHRyaWJ1dGVzWyBnZW9tZXRyeS5pZCBdO1xuXG5cdFx0aWYgKCBhdHRyaWJ1dGUgKSByZXR1cm4gYXR0cmlidXRlO1xuXG5cdFx0dmFyIGluZGljZXMgPSBbXTtcblxuXHRcdHZhciBnZW9tZXRyeUluZGV4ID0gZ2VvbWV0cnkuaW5kZXg7XG5cdFx0dmFyIGdlb21ldHJ5QXR0cmlidXRlcyA9IGdlb21ldHJ5LmF0dHJpYnV0ZXM7XG5cblx0XHQvLyBjb25zb2xlLnRpbWUoICd3aXJlZnJhbWUnICk7XG5cblx0XHRpZiAoIGdlb21ldHJ5SW5kZXggIT09IG51bGwgKSB7XG5cblx0XHRcdHZhciBhcnJheSA9IGdlb21ldHJ5SW5kZXguYXJyYXk7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGFycmF5Lmxlbmd0aDsgaSA8IGw7IGkgKz0gMyApIHtcblxuXHRcdFx0XHR2YXIgYSA9IGFycmF5WyBpICsgMCBdO1xuXHRcdFx0XHR2YXIgYiA9IGFycmF5WyBpICsgMSBdO1xuXHRcdFx0XHR2YXIgYyA9IGFycmF5WyBpICsgMiBdO1xuXG5cdFx0XHRcdGluZGljZXMucHVzaCggYSwgYiwgYiwgYywgYywgYSApO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR2YXIgYXJyYXkgPSBnZW9tZXRyeUF0dHJpYnV0ZXMucG9zaXRpb24uYXJyYXk7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9ICggYXJyYXkubGVuZ3RoIC8gMyApIC0gMTsgaSA8IGw7IGkgKz0gMyApIHtcblxuXHRcdFx0XHR2YXIgYSA9IGkgKyAwO1xuXHRcdFx0XHR2YXIgYiA9IGkgKyAxO1xuXHRcdFx0XHR2YXIgYyA9IGkgKyAyO1xuXG5cdFx0XHRcdGluZGljZXMucHVzaCggYSwgYiwgYiwgYywgYywgYSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvLyBjb25zb2xlLnRpbWVFbmQoICd3aXJlZnJhbWUnICk7XG5cblx0XHRhdHRyaWJ1dGUgPSBuZXcgKCBhcnJheU1heCggaW5kaWNlcyApID4gNjU1MzUgPyBVaW50MzJCdWZmZXJBdHRyaWJ1dGUgOiBVaW50MTZCdWZmZXJBdHRyaWJ1dGUgKSggaW5kaWNlcywgMSApO1xuXG5cdFx0YXR0cmlidXRlcy51cGRhdGUoIGF0dHJpYnV0ZSwgZ2wuRUxFTUVOVF9BUlJBWV9CVUZGRVIgKTtcblxuXHRcdHdpcmVmcmFtZUF0dHJpYnV0ZXNbIGdlb21ldHJ5LmlkIF0gPSBhdHRyaWJ1dGU7XG5cblx0XHRyZXR1cm4gYXR0cmlidXRlO1xuXG5cdH1cblxuXHRyZXR1cm4ge1xuXG5cdFx0Z2V0OiBnZXQsXG5cdFx0dXBkYXRlOiB1cGRhdGUsXG5cblx0XHRnZXRXaXJlZnJhbWVBdHRyaWJ1dGU6IGdldFdpcmVmcmFtZUF0dHJpYnV0ZVxuXG5cdH07XG5cbn1cblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIFdlYkdMSW5kZXhlZEJ1ZmZlclJlbmRlcmVyKCBnbCwgZXh0ZW5zaW9ucywgaW5mbyApIHtcblxuXHR2YXIgbW9kZTtcblxuXHRmdW5jdGlvbiBzZXRNb2RlKCB2YWx1ZSApIHtcblxuXHRcdG1vZGUgPSB2YWx1ZTtcblxuXHR9XG5cblx0dmFyIHR5cGUsIGJ5dGVzUGVyRWxlbWVudDtcblxuXHRmdW5jdGlvbiBzZXRJbmRleCggdmFsdWUgKSB7XG5cblx0XHR0eXBlID0gdmFsdWUudHlwZTtcblx0XHRieXRlc1BlckVsZW1lbnQgPSB2YWx1ZS5ieXRlc1BlckVsZW1lbnQ7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlbmRlciggc3RhcnQsIGNvdW50ICkge1xuXG5cdFx0Z2wuZHJhd0VsZW1lbnRzKCBtb2RlLCBjb3VudCwgdHlwZSwgc3RhcnQgKiBieXRlc1BlckVsZW1lbnQgKTtcblxuXHRcdGluZm8udXBkYXRlKCBjb3VudCwgbW9kZSApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiByZW5kZXJJbnN0YW5jZXMoIGdlb21ldHJ5LCBzdGFydCwgY291bnQgKSB7XG5cblx0XHR2YXIgZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdBTkdMRV9pbnN0YW5jZWRfYXJyYXlzJyApO1xuXG5cdFx0aWYgKCBleHRlbnNpb24gPT09IG51bGwgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTEluZGV4ZWRCdWZmZXJSZW5kZXJlcjogdXNpbmcgVEhSRUUuSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkgYnV0IGhhcmR3YXJlIGRvZXMgbm90IHN1cHBvcnQgZXh0ZW5zaW9uIEFOR0xFX2luc3RhbmNlZF9hcnJheXMuJyApO1xuXHRcdFx0cmV0dXJuO1xuXG5cdFx0fVxuXG5cdFx0ZXh0ZW5zaW9uLmRyYXdFbGVtZW50c0luc3RhbmNlZEFOR0xFKCBtb2RlLCBjb3VudCwgdHlwZSwgc3RhcnQgKiBieXRlc1BlckVsZW1lbnQsIGdlb21ldHJ5Lm1heEluc3RhbmNlZENvdW50ICk7XG5cblx0XHRpbmZvLnVwZGF0ZSggY291bnQsIG1vZGUsIGdlb21ldHJ5Lm1heEluc3RhbmNlZENvdW50ICk7XG5cblx0fVxuXG5cdC8vXG5cblx0dGhpcy5zZXRNb2RlID0gc2V0TW9kZTtcblx0dGhpcy5zZXRJbmRleCA9IHNldEluZGV4O1xuXHR0aGlzLnJlbmRlciA9IHJlbmRlcjtcblx0dGhpcy5yZW5kZXJJbnN0YW5jZXMgPSByZW5kZXJJbnN0YW5jZXM7XG5cbn1cblxuLyoqXG4gKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44N1xuICovXG5cbmZ1bmN0aW9uIFdlYkdMSW5mbyggZ2wgKSB7XG5cblx0dmFyIG1lbW9yeSA9IHtcblx0XHRnZW9tZXRyaWVzOiAwLFxuXHRcdHRleHR1cmVzOiAwXG5cdH07XG5cblx0dmFyIHJlbmRlciA9IHtcblx0XHRmcmFtZTogMCxcblx0XHRjYWxsczogMCxcblx0XHR0cmlhbmdsZXM6IDAsXG5cdFx0cG9pbnRzOiAwLFxuXHRcdGxpbmVzOiAwXG5cdH07XG5cblx0ZnVuY3Rpb24gdXBkYXRlKCBjb3VudCwgbW9kZSwgaW5zdGFuY2VDb3VudCApIHtcblxuXHRcdGluc3RhbmNlQ291bnQgPSBpbnN0YW5jZUNvdW50IHx8IDE7XG5cblx0XHRyZW5kZXIuY2FsbHMgKys7XG5cblx0XHRzd2l0Y2ggKCBtb2RlICkge1xuXG5cdFx0XHRjYXNlIGdsLlRSSUFOR0xFUzpcblx0XHRcdFx0cmVuZGVyLnRyaWFuZ2xlcyArPSBpbnN0YW5jZUNvdW50ICogKCBjb3VudCAvIDMgKTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgZ2wuVFJJQU5HTEVfU1RSSVA6XG5cdFx0XHRjYXNlIGdsLlRSSUFOR0xFX0ZBTjpcblx0XHRcdFx0cmVuZGVyLnRyaWFuZ2xlcyArPSBpbnN0YW5jZUNvdW50ICogKCBjb3VudCAtIDIgKTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgZ2wuTElORVM6XG5cdFx0XHRcdHJlbmRlci5saW5lcyArPSBpbnN0YW5jZUNvdW50ICogKCBjb3VudCAvIDIgKTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgZ2wuTElORV9TVFJJUDpcblx0XHRcdFx0cmVuZGVyLmxpbmVzICs9IGluc3RhbmNlQ291bnQgKiAoIGNvdW50IC0gMSApO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBnbC5MSU5FX0xPT1A6XG5cdFx0XHRcdHJlbmRlci5saW5lcyArPSBpbnN0YW5jZUNvdW50ICogY291bnQ7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIGdsLlBPSU5UUzpcblx0XHRcdFx0cmVuZGVyLnBvaW50cyArPSBpbnN0YW5jZUNvdW50ICogY291bnQ7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuV2ViR0xJbmZvOiBVbmtub3duIGRyYXcgbW9kZTonLCBtb2RlICk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiByZXNldCgpIHtcblxuXHRcdHJlbmRlci5mcmFtZSArKztcblx0XHRyZW5kZXIuY2FsbHMgPSAwO1xuXHRcdHJlbmRlci50cmlhbmdsZXMgPSAwO1xuXHRcdHJlbmRlci5wb2ludHMgPSAwO1xuXHRcdHJlbmRlci5saW5lcyA9IDA7XG5cblx0fVxuXG5cdHJldHVybiB7XG5cdFx0bWVtb3J5OiBtZW1vcnksXG5cdFx0cmVuZGVyOiByZW5kZXIsXG5cdFx0cHJvZ3JhbXM6IG51bGwsXG5cdFx0YXV0b1Jlc2V0OiB0cnVlLFxuXHRcdHJlc2V0OiByZXNldCxcblx0XHR1cGRhdGU6IHVwZGF0ZVxuXHR9O1xuXG59XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBhYnNOdW1lcmljYWxTb3J0KCBhLCBiICkge1xuXG5cdHJldHVybiBNYXRoLmFicyggYlsgMSBdICkgLSBNYXRoLmFicyggYVsgMSBdICk7XG5cbn1cblxuZnVuY3Rpb24gV2ViR0xNb3JwaHRhcmdldHMoIGdsICkge1xuXG5cdHZhciBpbmZsdWVuY2VzTGlzdCA9IHt9O1xuXHR2YXIgbW9ycGhJbmZsdWVuY2VzID0gbmV3IEZsb2F0MzJBcnJheSggOCApO1xuXG5cdGZ1bmN0aW9uIHVwZGF0ZSggb2JqZWN0LCBnZW9tZXRyeSwgbWF0ZXJpYWwsIHByb2dyYW0gKSB7XG5cblx0XHR2YXIgb2JqZWN0SW5mbHVlbmNlcyA9IG9iamVjdC5tb3JwaFRhcmdldEluZmx1ZW5jZXM7XG5cblx0XHR2YXIgbGVuZ3RoID0gb2JqZWN0SW5mbHVlbmNlcy5sZW5ndGg7XG5cblx0XHR2YXIgaW5mbHVlbmNlcyA9IGluZmx1ZW5jZXNMaXN0WyBnZW9tZXRyeS5pZCBdO1xuXG5cdFx0aWYgKCBpbmZsdWVuY2VzID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdC8vIGluaXRpYWxpc2UgbGlzdFxuXG5cdFx0XHRpbmZsdWVuY2VzID0gW107XG5cblx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0XHRpbmZsdWVuY2VzWyBpIF0gPSBbIGksIDAgXTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpbmZsdWVuY2VzTGlzdFsgZ2VvbWV0cnkuaWQgXSA9IGluZmx1ZW5jZXM7XG5cblx0XHR9XG5cblx0XHR2YXIgbW9ycGhUYXJnZXRzID0gbWF0ZXJpYWwubW9ycGhUYXJnZXRzICYmIGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbjtcblx0XHR2YXIgbW9ycGhOb3JtYWxzID0gbWF0ZXJpYWwubW9ycGhOb3JtYWxzICYmIGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy5ub3JtYWw7XG5cblx0XHQvLyBSZW1vdmUgY3VycmVudCBtb3JwaEF0dHJpYnV0ZXNcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGluZmx1ZW5jZSA9IGluZmx1ZW5jZXNbIGkgXTtcblxuXHRcdFx0aWYgKCBpbmZsdWVuY2VbIDEgXSAhPT0gMCApIHtcblxuXHRcdFx0XHRpZiAoIG1vcnBoVGFyZ2V0cyApIGdlb21ldHJ5LnJlbW92ZUF0dHJpYnV0ZSggJ21vcnBoVGFyZ2V0JyArIGkgKTtcblx0XHRcdFx0aWYgKCBtb3JwaE5vcm1hbHMgKSBnZW9tZXRyeS5yZW1vdmVBdHRyaWJ1dGUoICdtb3JwaE5vcm1hbCcgKyBpICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIENvbGxlY3QgaW5mbHVlbmNlc1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHR2YXIgaW5mbHVlbmNlID0gaW5mbHVlbmNlc1sgaSBdO1xuXG5cdFx0XHRpbmZsdWVuY2VbIDAgXSA9IGk7XG5cdFx0XHRpbmZsdWVuY2VbIDEgXSA9IG9iamVjdEluZmx1ZW5jZXNbIGkgXTtcblxuXHRcdH1cblxuXHRcdGluZmx1ZW5jZXMuc29ydCggYWJzTnVtZXJpY2FsU29ydCApO1xuXG5cdFx0Ly8gQWRkIG1vcnBoQXR0cmlidXRlc1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgODsgaSArKyApIHtcblxuXHRcdFx0dmFyIGluZmx1ZW5jZSA9IGluZmx1ZW5jZXNbIGkgXTtcblxuXHRcdFx0aWYgKCBpbmZsdWVuY2UgKSB7XG5cblx0XHRcdFx0dmFyIGluZGV4ID0gaW5mbHVlbmNlWyAwIF07XG5cdFx0XHRcdHZhciB2YWx1ZSA9IGluZmx1ZW5jZVsgMSBdO1xuXG5cdFx0XHRcdGlmICggdmFsdWUgKSB7XG5cblx0XHRcdFx0XHRpZiAoIG1vcnBoVGFyZ2V0cyApIGdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ21vcnBoVGFyZ2V0JyArIGksIG1vcnBoVGFyZ2V0c1sgaW5kZXggXSApO1xuXHRcdFx0XHRcdGlmICggbW9ycGhOb3JtYWxzICkgZ2VvbWV0cnkuYWRkQXR0cmlidXRlKCAnbW9ycGhOb3JtYWwnICsgaSwgbW9ycGhOb3JtYWxzWyBpbmRleCBdICk7XG5cblx0XHRcdFx0XHRtb3JwaEluZmx1ZW5jZXNbIGkgXSA9IHZhbHVlO1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRtb3JwaEluZmx1ZW5jZXNbIGkgXSA9IDA7XG5cblx0XHR9XG5cblx0XHRwcm9ncmFtLmdldFVuaWZvcm1zKCkuc2V0VmFsdWUoIGdsLCAnbW9ycGhUYXJnZXRJbmZsdWVuY2VzJywgbW9ycGhJbmZsdWVuY2VzICk7XG5cblx0fVxuXG5cdHJldHVybiB7XG5cblx0XHR1cGRhdGU6IHVwZGF0ZVxuXG5cdH07XG5cbn1cblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIFdlYkdMT2JqZWN0cyggZ2VvbWV0cmllcywgaW5mbyApIHtcblxuXHR2YXIgdXBkYXRlTGlzdCA9IHt9O1xuXG5cdGZ1bmN0aW9uIHVwZGF0ZSggb2JqZWN0ICkge1xuXG5cdFx0dmFyIGZyYW1lID0gaW5mby5yZW5kZXIuZnJhbWU7XG5cblx0XHR2YXIgZ2VvbWV0cnkgPSBvYmplY3QuZ2VvbWV0cnk7XG5cdFx0dmFyIGJ1ZmZlcmdlb21ldHJ5ID0gZ2VvbWV0cmllcy5nZXQoIG9iamVjdCwgZ2VvbWV0cnkgKTtcblxuXHRcdC8vIFVwZGF0ZSBvbmNlIHBlciBmcmFtZVxuXG5cdFx0aWYgKCB1cGRhdGVMaXN0WyBidWZmZXJnZW9tZXRyeS5pZCBdICE9PSBmcmFtZSApIHtcblxuXHRcdFx0aWYgKCBnZW9tZXRyeS5pc0dlb21ldHJ5ICkge1xuXG5cdFx0XHRcdGJ1ZmZlcmdlb21ldHJ5LnVwZGF0ZUZyb21PYmplY3QoIG9iamVjdCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGdlb21ldHJpZXMudXBkYXRlKCBidWZmZXJnZW9tZXRyeSApO1xuXG5cdFx0XHR1cGRhdGVMaXN0WyBidWZmZXJnZW9tZXRyeS5pZCBdID0gZnJhbWU7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gYnVmZmVyZ2VvbWV0cnk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGRpc3Bvc2UoKSB7XG5cblx0XHR1cGRhdGVMaXN0ID0ge307XG5cblx0fVxuXG5cdHJldHVybiB7XG5cblx0XHR1cGRhdGU6IHVwZGF0ZSxcblx0XHRkaXNwb3NlOiBkaXNwb3NlXG5cblx0fTtcblxufVxuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gQ3ViZVRleHR1cmUoIGltYWdlcywgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIsIG1pbkZpbHRlciwgZm9ybWF0LCB0eXBlLCBhbmlzb3Ryb3B5LCBlbmNvZGluZyApIHtcblxuXHRpbWFnZXMgPSBpbWFnZXMgIT09IHVuZGVmaW5lZCA/IGltYWdlcyA6IFtdO1xuXHRtYXBwaW5nID0gbWFwcGluZyAhPT0gdW5kZWZpbmVkID8gbWFwcGluZyA6IEN1YmVSZWZsZWN0aW9uTWFwcGluZztcblxuXHRUZXh0dXJlLmNhbGwoIHRoaXMsIGltYWdlcywgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIsIG1pbkZpbHRlciwgZm9ybWF0LCB0eXBlLCBhbmlzb3Ryb3B5LCBlbmNvZGluZyApO1xuXG5cdHRoaXMuZmxpcFkgPSBmYWxzZTtcblxufVxuXG5DdWJlVGV4dHVyZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBUZXh0dXJlLnByb3RvdHlwZSApO1xuQ3ViZVRleHR1cmUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ3ViZVRleHR1cmU7XG5cbkN1YmVUZXh0dXJlLnByb3RvdHlwZS5pc0N1YmVUZXh0dXJlID0gdHJ1ZTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KCBDdWJlVGV4dHVyZS5wcm90b3R5cGUsICdpbWFnZXMnLCB7XG5cblx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5pbWFnZTtcblxuXHR9LFxuXG5cdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMuaW1hZ2UgPSB2YWx1ZTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIHRzY2h3XG4gKlxuICogVW5pZm9ybXMgb2YgYSBwcm9ncmFtLlxuICogVGhvc2UgZm9ybSBhIHRyZWUgc3RydWN0dXJlIHdpdGggYSBzcGVjaWFsIHRvcC1sZXZlbCBjb250YWluZXIgZm9yIHRoZSByb290LFxuICogd2hpY2ggeW91IGdldCBieSBjYWxsaW5nICduZXcgV2ViR0xVbmlmb3JtcyggZ2wsIHByb2dyYW0sIHJlbmRlcmVyICknLlxuICpcbiAqXG4gKiBQcm9wZXJ0aWVzIG9mIGlubmVyIG5vZGVzIGluY2x1ZGluZyB0aGUgdG9wLWxldmVsIGNvbnRhaW5lcjpcbiAqXG4gKiAuc2VxIC0gYXJyYXkgb2YgbmVzdGVkIHVuaWZvcm1zXG4gKiAubWFwIC0gbmVzdGVkIHVuaWZvcm1zIGJ5IG5hbWVcbiAqXG4gKlxuICogTWV0aG9kcyBvZiBhbGwgbm9kZXMgZXhjZXB0IHRoZSB0b3AtbGV2ZWwgY29udGFpbmVyOlxuICpcbiAqIC5zZXRWYWx1ZSggZ2wsIHZhbHVlLCBbcmVuZGVyZXJdIClcbiAqXG4gKiBcdFx0dXBsb2FkcyBhIHVuaWZvcm0gdmFsdWUocylcbiAqICBcdHRoZSAncmVuZGVyZXInIHBhcmFtZXRlciBpcyBuZWVkZWQgZm9yIHNhbXBsZXIgdW5pZm9ybXNcbiAqXG4gKlxuICogU3RhdGljIG1ldGhvZHMgb2YgdGhlIHRvcC1sZXZlbCBjb250YWluZXIgKHJlbmRlcmVyIGZhY3Rvcml6YXRpb25zKTpcbiAqXG4gKiAudXBsb2FkKCBnbCwgc2VxLCB2YWx1ZXMsIHJlbmRlcmVyIClcbiAqXG4gKiBcdFx0c2V0cyB1bmlmb3JtcyBpbiAnc2VxJyB0byAndmFsdWVzW2lkXS52YWx1ZSdcbiAqXG4gKiAuc2VxV2l0aFZhbHVlKCBzZXEsIHZhbHVlcyApIDogZmlsdGVyZWRTZXFcbiAqXG4gKiBcdFx0ZmlsdGVycyAnc2VxJyBlbnRyaWVzIHdpdGggY29ycmVzcG9uZGluZyBlbnRyeSBpbiB2YWx1ZXNcbiAqXG4gKlxuICogTWV0aG9kcyBvZiB0aGUgdG9wLWxldmVsIGNvbnRhaW5lciAocmVuZGVyZXIgZmFjdG9yaXphdGlvbnMpOlxuICpcbiAqIC5zZXRWYWx1ZSggZ2wsIG5hbWUsIHZhbHVlIClcbiAqXG4gKiBcdFx0c2V0cyB1bmlmb3JtIHdpdGggIG5hbWUgJ25hbWUnIHRvICd2YWx1ZSdcbiAqXG4gKiAuc2V0KCBnbCwgb2JqLCBwcm9wIClcbiAqXG4gKiBcdFx0c2V0cyB1bmlmb3JtIGZyb20gb2JqZWN0IGFuZCBwcm9wZXJ0eSB3aXRoIHNhbWUgbmFtZSB0aGFuIHVuaWZvcm1cbiAqXG4gKiAuc2V0T3B0aW9uYWwoIGdsLCBvYmosIHByb3AgKVxuICpcbiAqIFx0XHRsaWtlIC5zZXQgZm9yIGFuIG9wdGlvbmFsIHByb3BlcnR5IG9mIHRoZSBvYmplY3RcbiAqXG4gKi9cblxudmFyIGVtcHR5VGV4dHVyZSA9IG5ldyBUZXh0dXJlKCk7XG52YXIgZW1wdHlDdWJlVGV4dHVyZSA9IG5ldyBDdWJlVGV4dHVyZSgpO1xuXG4vLyAtLS0gQmFzZSBmb3IgaW5uZXIgbm9kZXMgKGluY2x1ZGluZyB0aGUgcm9vdCkgLS0tXG5cbmZ1bmN0aW9uIFVuaWZvcm1Db250YWluZXIoKSB7XG5cblx0dGhpcy5zZXEgPSBbXTtcblx0dGhpcy5tYXAgPSB7fTtcblxufVxuXG4vLyAtLS0gVXRpbGl0aWVzIC0tLVxuXG4vLyBBcnJheSBDYWNoZXMgKHByb3ZpZGUgdHlwZWQgYXJyYXlzIGZvciB0ZW1wb3JhcnkgYnkgc2l6ZSlcblxudmFyIGFycmF5Q2FjaGVGMzIgPSBbXTtcbnZhciBhcnJheUNhY2hlSTMyID0gW107XG5cbi8vIEZsb2F0MzJBcnJheSBjYWNoZXMgdXNlZCBmb3IgdXBsb2FkaW5nIE1hdHJpeCB1bmlmb3Jtc1xuXG52YXIgbWF0NGFycmF5ID0gbmV3IEZsb2F0MzJBcnJheSggMTYgKTtcbnZhciBtYXQzYXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KCA5ICk7XG5cbi8vIEZsYXR0ZW5pbmcgZm9yIGFycmF5cyBvZiB2ZWN0b3JzIGFuZCBtYXRyaWNlc1xuXG5mdW5jdGlvbiBmbGF0dGVuKCBhcnJheSwgbkJsb2NrcywgYmxvY2tTaXplICkge1xuXG5cdHZhciBmaXJzdEVsZW0gPSBhcnJheVsgMCBdO1xuXG5cdGlmICggZmlyc3RFbGVtIDw9IDAgfHwgZmlyc3RFbGVtID4gMCApIHJldHVybiBhcnJheTtcblx0Ly8gdW5vcHRpbWl6ZWQ6ICEgaXNOYU4oIGZpcnN0RWxlbSApXG5cdC8vIHNlZSBodHRwOi8vamFja3NvbmR1bnN0YW4uY29tL2FydGljbGVzLzk4M1xuXG5cdHZhciBuID0gbkJsb2NrcyAqIGJsb2NrU2l6ZSxcblx0XHRyID0gYXJyYXlDYWNoZUYzMlsgbiBdO1xuXG5cdGlmICggciA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0ciA9IG5ldyBGbG9hdDMyQXJyYXkoIG4gKTtcblx0XHRhcnJheUNhY2hlRjMyWyBuIF0gPSByO1xuXG5cdH1cblxuXHRpZiAoIG5CbG9ja3MgIT09IDAgKSB7XG5cblx0XHRmaXJzdEVsZW0udG9BcnJheSggciwgMCApO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAxLCBvZmZzZXQgPSAwOyBpICE9PSBuQmxvY2tzOyArKyBpICkge1xuXG5cdFx0XHRvZmZzZXQgKz0gYmxvY2tTaXplO1xuXHRcdFx0YXJyYXlbIGkgXS50b0FycmF5KCByLCBvZmZzZXQgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0cmV0dXJuIHI7XG5cbn1cblxuLy8gVGV4dHVyZSB1bml0IGFsbG9jYXRpb25cblxuZnVuY3Rpb24gYWxsb2NUZXhVbml0cyggcmVuZGVyZXIsIG4gKSB7XG5cblx0dmFyIHIgPSBhcnJheUNhY2hlSTMyWyBuIF07XG5cblx0aWYgKCByID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRyID0gbmV3IEludDMyQXJyYXkoIG4gKTtcblx0XHRhcnJheUNhY2hlSTMyWyBuIF0gPSByO1xuXG5cdH1cblxuXHRmb3IgKCB2YXIgaSA9IDA7IGkgIT09IG47ICsrIGkgKVxuXHRcdHJbIGkgXSA9IHJlbmRlcmVyLmFsbG9jVGV4dHVyZVVuaXQoKTtcblxuXHRyZXR1cm4gcjtcblxufVxuXG4vLyAtLS0gU2V0dGVycyAtLS1cblxuLy8gTm90ZTogRGVmaW5pbmcgdGhlc2UgbWV0aG9kcyBleHRlcm5hbGx5LCBiZWNhdXNlIHRoZXkgY29tZSBpbiBhIGJ1bmNoXG4vLyBhbmQgdGhpcyB3YXkgdGhlaXIgbmFtZXMgbWluaWZ5LlxuXG4vLyBTaW5nbGUgc2NhbGFyXG5cbmZ1bmN0aW9uIHNldFZhbHVlMWYoIGdsLCB2ICkge1xuXG5cdGdsLnVuaWZvcm0xZiggdGhpcy5hZGRyLCB2ICk7XG5cbn1cblxuZnVuY3Rpb24gc2V0VmFsdWUxaSggZ2wsIHYgKSB7XG5cblx0Z2wudW5pZm9ybTFpKCB0aGlzLmFkZHIsIHYgKTtcblxufVxuXG4vLyBTaW5nbGUgZmxvYXQgdmVjdG9yIChmcm9tIGZsYXQgYXJyYXkgb3IgVEhSRUUuVmVjdG9yTilcblxuZnVuY3Rpb24gc2V0VmFsdWUyZnYoIGdsLCB2ICkge1xuXG5cdGlmICggdi54ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRnbC51bmlmb3JtMmZ2KCB0aGlzLmFkZHIsIHYgKTtcblxuXHR9IGVsc2Uge1xuXG5cdFx0Z2wudW5pZm9ybTJmKCB0aGlzLmFkZHIsIHYueCwgdi55ICk7XG5cblx0fVxuXG59XG5cbmZ1bmN0aW9uIHNldFZhbHVlM2Z2KCBnbCwgdiApIHtcblxuXHRpZiAoIHYueCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0Z2wudW5pZm9ybTNmKCB0aGlzLmFkZHIsIHYueCwgdi55LCB2LnogKTtcblxuXHR9IGVsc2UgaWYgKCB2LnIgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdGdsLnVuaWZvcm0zZiggdGhpcy5hZGRyLCB2LnIsIHYuZywgdi5iICk7XG5cblx0fSBlbHNlIHtcblxuXHRcdGdsLnVuaWZvcm0zZnYoIHRoaXMuYWRkciwgdiApO1xuXG5cdH1cblxufVxuXG5mdW5jdGlvbiBzZXRWYWx1ZTRmdiggZ2wsIHYgKSB7XG5cblx0aWYgKCB2LnggPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdGdsLnVuaWZvcm00ZnYoIHRoaXMuYWRkciwgdiApO1xuXG5cdH0gZWxzZSB7XG5cblx0XHQgZ2wudW5pZm9ybTRmKCB0aGlzLmFkZHIsIHYueCwgdi55LCB2LnosIHYudyApO1xuXG5cdH1cblxufVxuXG4vLyBTaW5nbGUgbWF0cml4IChmcm9tIGZsYXQgYXJyYXkgb3IgTWF0cml4TilcblxuZnVuY3Rpb24gc2V0VmFsdWUyZm0oIGdsLCB2ICkge1xuXG5cdGdsLnVuaWZvcm1NYXRyaXgyZnYoIHRoaXMuYWRkciwgZmFsc2UsIHYuZWxlbWVudHMgfHwgdiApO1xuXG59XG5cbmZ1bmN0aW9uIHNldFZhbHVlM2ZtKCBnbCwgdiApIHtcblxuXHRpZiAoIHYuZWxlbWVudHMgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdGdsLnVuaWZvcm1NYXRyaXgzZnYoIHRoaXMuYWRkciwgZmFsc2UsIHYgKTtcblxuXHR9IGVsc2Uge1xuXG5cdFx0bWF0M2FycmF5LnNldCggdi5lbGVtZW50cyApO1xuXHRcdGdsLnVuaWZvcm1NYXRyaXgzZnYoIHRoaXMuYWRkciwgZmFsc2UsIG1hdDNhcnJheSApO1xuXG5cdH1cblxufVxuXG5mdW5jdGlvbiBzZXRWYWx1ZTRmbSggZ2wsIHYgKSB7XG5cblx0aWYgKCB2LmVsZW1lbnRzID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRnbC51bmlmb3JtTWF0cml4NGZ2KCB0aGlzLmFkZHIsIGZhbHNlLCB2ICk7XG5cblx0fSBlbHNlIHtcblxuXHRcdG1hdDRhcnJheS5zZXQoIHYuZWxlbWVudHMgKTtcblx0XHRnbC51bmlmb3JtTWF0cml4NGZ2KCB0aGlzLmFkZHIsIGZhbHNlLCBtYXQ0YXJyYXkgKTtcblxuXHR9XG5cbn1cblxuLy8gU2luZ2xlIHRleHR1cmUgKDJEIC8gQ3ViZSlcblxuZnVuY3Rpb24gc2V0VmFsdWVUMSggZ2wsIHYsIHJlbmRlcmVyICkge1xuXG5cdHZhciB1bml0ID0gcmVuZGVyZXIuYWxsb2NUZXh0dXJlVW5pdCgpO1xuXHRnbC51bmlmb3JtMWkoIHRoaXMuYWRkciwgdW5pdCApO1xuXHRyZW5kZXJlci5zZXRUZXh0dXJlMkQoIHYgfHwgZW1wdHlUZXh0dXJlLCB1bml0ICk7XG5cbn1cblxuZnVuY3Rpb24gc2V0VmFsdWVUNiggZ2wsIHYsIHJlbmRlcmVyICkge1xuXG5cdHZhciB1bml0ID0gcmVuZGVyZXIuYWxsb2NUZXh0dXJlVW5pdCgpO1xuXHRnbC51bmlmb3JtMWkoIHRoaXMuYWRkciwgdW5pdCApO1xuXHRyZW5kZXJlci5zZXRUZXh0dXJlQ3ViZSggdiB8fCBlbXB0eUN1YmVUZXh0dXJlLCB1bml0ICk7XG5cbn1cblxuLy8gSW50ZWdlciAvIEJvb2xlYW4gdmVjdG9ycyBvciBhcnJheXMgdGhlcmVvZiAoYWx3YXlzIGZsYXQgYXJyYXlzKVxuXG5mdW5jdGlvbiBzZXRWYWx1ZTJpdiggZ2wsIHYgKSB7XG5cblx0Z2wudW5pZm9ybTJpdiggdGhpcy5hZGRyLCB2ICk7XG5cbn1cblxuZnVuY3Rpb24gc2V0VmFsdWUzaXYoIGdsLCB2ICkge1xuXG5cdGdsLnVuaWZvcm0zaXYoIHRoaXMuYWRkciwgdiApO1xuXG59XG5cbmZ1bmN0aW9uIHNldFZhbHVlNGl2KCBnbCwgdiApIHtcblxuXHRnbC51bmlmb3JtNGl2KCB0aGlzLmFkZHIsIHYgKTtcblxufVxuXG4vLyBIZWxwZXIgdG8gcGljayB0aGUgcmlnaHQgc2V0dGVyIGZvciB0aGUgc2luZ3VsYXIgY2FzZVxuXG5mdW5jdGlvbiBnZXRTaW5ndWxhclNldHRlciggdHlwZSApIHtcblxuXHRzd2l0Y2ggKCB0eXBlICkge1xuXG5cdFx0Y2FzZSAweDE0MDY6IHJldHVybiBzZXRWYWx1ZTFmOyAvLyBGTE9BVFxuXHRcdGNhc2UgMHg4YjUwOiByZXR1cm4gc2V0VmFsdWUyZnY7IC8vIF9WRUMyXG5cdFx0Y2FzZSAweDhiNTE6IHJldHVybiBzZXRWYWx1ZTNmdjsgLy8gX1ZFQzNcblx0XHRjYXNlIDB4OGI1MjogcmV0dXJuIHNldFZhbHVlNGZ2OyAvLyBfVkVDNFxuXG5cdFx0Y2FzZSAweDhiNWE6IHJldHVybiBzZXRWYWx1ZTJmbTsgLy8gX01BVDJcblx0XHRjYXNlIDB4OGI1YjogcmV0dXJuIHNldFZhbHVlM2ZtOyAvLyBfTUFUM1xuXHRcdGNhc2UgMHg4YjVjOiByZXR1cm4gc2V0VmFsdWU0Zm07IC8vIF9NQVQ0XG5cblx0XHRjYXNlIDB4OGI1ZTogY2FzZSAweDhkNjY6IHJldHVybiBzZXRWYWx1ZVQxOyAvLyBTQU1QTEVSXzJELCBTQU1QTEVSX0VYVEVSTkFMX09FU1xuXHRcdGNhc2UgMHg4YjYwOiByZXR1cm4gc2V0VmFsdWVUNjsgLy8gU0FNUExFUl9DVUJFXG5cblx0XHRjYXNlIDB4MTQwNDogY2FzZSAweDhiNTY6IHJldHVybiBzZXRWYWx1ZTFpOyAvLyBJTlQsIEJPT0xcblx0XHRjYXNlIDB4OGI1MzogY2FzZSAweDhiNTc6IHJldHVybiBzZXRWYWx1ZTJpdjsgLy8gX1ZFQzJcblx0XHRjYXNlIDB4OGI1NDogY2FzZSAweDhiNTg6IHJldHVybiBzZXRWYWx1ZTNpdjsgLy8gX1ZFQzNcblx0XHRjYXNlIDB4OGI1NTogY2FzZSAweDhiNTk6IHJldHVybiBzZXRWYWx1ZTRpdjsgLy8gX1ZFQzRcblxuXHR9XG5cbn1cblxuLy8gQXJyYXkgb2Ygc2NhbGFyc1xuXG5mdW5jdGlvbiBzZXRWYWx1ZTFmdiggZ2wsIHYgKSB7XG5cblx0Z2wudW5pZm9ybTFmdiggdGhpcy5hZGRyLCB2ICk7XG5cbn1cbmZ1bmN0aW9uIHNldFZhbHVlMWl2KCBnbCwgdiApIHtcblxuXHRnbC51bmlmb3JtMWl2KCB0aGlzLmFkZHIsIHYgKTtcblxufVxuXG4vLyBBcnJheSBvZiB2ZWN0b3JzIChmbGF0IG9yIGZyb20gVEhSRUUgY2xhc3NlcylcblxuZnVuY3Rpb24gc2V0VmFsdWVWMmEoIGdsLCB2ICkge1xuXG5cdGdsLnVuaWZvcm0yZnYoIHRoaXMuYWRkciwgZmxhdHRlbiggdiwgdGhpcy5zaXplLCAyICkgKTtcblxufVxuXG5mdW5jdGlvbiBzZXRWYWx1ZVYzYSggZ2wsIHYgKSB7XG5cblx0Z2wudW5pZm9ybTNmdiggdGhpcy5hZGRyLCBmbGF0dGVuKCB2LCB0aGlzLnNpemUsIDMgKSApO1xuXG59XG5cbmZ1bmN0aW9uIHNldFZhbHVlVjRhKCBnbCwgdiApIHtcblxuXHRnbC51bmlmb3JtNGZ2KCB0aGlzLmFkZHIsIGZsYXR0ZW4oIHYsIHRoaXMuc2l6ZSwgNCApICk7XG5cbn1cblxuLy8gQXJyYXkgb2YgbWF0cmljZXMgKGZsYXQgb3IgZnJvbSBUSFJFRSBjbGFzZXMpXG5cbmZ1bmN0aW9uIHNldFZhbHVlTTJhKCBnbCwgdiApIHtcblxuXHRnbC51bmlmb3JtTWF0cml4MmZ2KCB0aGlzLmFkZHIsIGZhbHNlLCBmbGF0dGVuKCB2LCB0aGlzLnNpemUsIDQgKSApO1xuXG59XG5cbmZ1bmN0aW9uIHNldFZhbHVlTTNhKCBnbCwgdiApIHtcblxuXHRnbC51bmlmb3JtTWF0cml4M2Z2KCB0aGlzLmFkZHIsIGZhbHNlLCBmbGF0dGVuKCB2LCB0aGlzLnNpemUsIDkgKSApO1xuXG59XG5cbmZ1bmN0aW9uIHNldFZhbHVlTTRhKCBnbCwgdiApIHtcblxuXHRnbC51bmlmb3JtTWF0cml4NGZ2KCB0aGlzLmFkZHIsIGZhbHNlLCBmbGF0dGVuKCB2LCB0aGlzLnNpemUsIDE2ICkgKTtcblxufVxuXG4vLyBBcnJheSBvZiB0ZXh0dXJlcyAoMkQgLyBDdWJlKVxuXG5mdW5jdGlvbiBzZXRWYWx1ZVQxYSggZ2wsIHYsIHJlbmRlcmVyICkge1xuXG5cdHZhciBuID0gdi5sZW5ndGgsXG5cdFx0dW5pdHMgPSBhbGxvY1RleFVuaXRzKCByZW5kZXJlciwgbiApO1xuXG5cdGdsLnVuaWZvcm0xaXYoIHRoaXMuYWRkciwgdW5pdHMgKTtcblxuXHRmb3IgKCB2YXIgaSA9IDA7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRyZW5kZXJlci5zZXRUZXh0dXJlMkQoIHZbIGkgXSB8fCBlbXB0eVRleHR1cmUsIHVuaXRzWyBpIF0gKTtcblxuXHR9XG5cbn1cblxuZnVuY3Rpb24gc2V0VmFsdWVUNmEoIGdsLCB2LCByZW5kZXJlciApIHtcblxuXHR2YXIgbiA9IHYubGVuZ3RoLFxuXHRcdHVuaXRzID0gYWxsb2NUZXhVbml0cyggcmVuZGVyZXIsIG4gKTtcblxuXHRnbC51bmlmb3JtMWl2KCB0aGlzLmFkZHIsIHVuaXRzICk7XG5cblx0Zm9yICggdmFyIGkgPSAwOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0cmVuZGVyZXIuc2V0VGV4dHVyZUN1YmUoIHZbIGkgXSB8fCBlbXB0eUN1YmVUZXh0dXJlLCB1bml0c1sgaSBdICk7XG5cblx0fVxuXG59XG5cbi8vIEhlbHBlciB0byBwaWNrIHRoZSByaWdodCBzZXR0ZXIgZm9yIGEgcHVyZSAoYm90dG9tLWxldmVsKSBhcnJheVxuXG5mdW5jdGlvbiBnZXRQdXJlQXJyYXlTZXR0ZXIoIHR5cGUgKSB7XG5cblx0c3dpdGNoICggdHlwZSApIHtcblxuXHRcdGNhc2UgMHgxNDA2OiByZXR1cm4gc2V0VmFsdWUxZnY7IC8vIEZMT0FUXG5cdFx0Y2FzZSAweDhiNTA6IHJldHVybiBzZXRWYWx1ZVYyYTsgLy8gX1ZFQzJcblx0XHRjYXNlIDB4OGI1MTogcmV0dXJuIHNldFZhbHVlVjNhOyAvLyBfVkVDM1xuXHRcdGNhc2UgMHg4YjUyOiByZXR1cm4gc2V0VmFsdWVWNGE7IC8vIF9WRUM0XG5cblx0XHRjYXNlIDB4OGI1YTogcmV0dXJuIHNldFZhbHVlTTJhOyAvLyBfTUFUMlxuXHRcdGNhc2UgMHg4YjViOiByZXR1cm4gc2V0VmFsdWVNM2E7IC8vIF9NQVQzXG5cdFx0Y2FzZSAweDhiNWM6IHJldHVybiBzZXRWYWx1ZU00YTsgLy8gX01BVDRcblxuXHRcdGNhc2UgMHg4YjVlOiByZXR1cm4gc2V0VmFsdWVUMWE7IC8vIFNBTVBMRVJfMkRcblx0XHRjYXNlIDB4OGI2MDogcmV0dXJuIHNldFZhbHVlVDZhOyAvLyBTQU1QTEVSX0NVQkVcblxuXHRcdGNhc2UgMHgxNDA0OiBjYXNlIDB4OGI1NjogcmV0dXJuIHNldFZhbHVlMWl2OyAvLyBJTlQsIEJPT0xcblx0XHRjYXNlIDB4OGI1MzogY2FzZSAweDhiNTc6IHJldHVybiBzZXRWYWx1ZTJpdjsgLy8gX1ZFQzJcblx0XHRjYXNlIDB4OGI1NDogY2FzZSAweDhiNTg6IHJldHVybiBzZXRWYWx1ZTNpdjsgLy8gX1ZFQzNcblx0XHRjYXNlIDB4OGI1NTogY2FzZSAweDhiNTk6IHJldHVybiBzZXRWYWx1ZTRpdjsgLy8gX1ZFQzRcblxuXHR9XG5cbn1cblxuLy8gLS0tIFVuaWZvcm0gQ2xhc3NlcyAtLS1cblxuZnVuY3Rpb24gU2luZ2xlVW5pZm9ybSggaWQsIGFjdGl2ZUluZm8sIGFkZHIgKSB7XG5cblx0dGhpcy5pZCA9IGlkO1xuXHR0aGlzLmFkZHIgPSBhZGRyO1xuXHR0aGlzLnNldFZhbHVlID0gZ2V0U2luZ3VsYXJTZXR0ZXIoIGFjdGl2ZUluZm8udHlwZSApO1xuXG5cdC8vIHRoaXMucGF0aCA9IGFjdGl2ZUluZm8ubmFtZTsgLy8gREVCVUdcblxufVxuXG5mdW5jdGlvbiBQdXJlQXJyYXlVbmlmb3JtKCBpZCwgYWN0aXZlSW5mbywgYWRkciApIHtcblxuXHR0aGlzLmlkID0gaWQ7XG5cdHRoaXMuYWRkciA9IGFkZHI7XG5cdHRoaXMuc2l6ZSA9IGFjdGl2ZUluZm8uc2l6ZTtcblx0dGhpcy5zZXRWYWx1ZSA9IGdldFB1cmVBcnJheVNldHRlciggYWN0aXZlSW5mby50eXBlICk7XG5cblx0Ly8gdGhpcy5wYXRoID0gYWN0aXZlSW5mby5uYW1lOyAvLyBERUJVR1xuXG59XG5cbmZ1bmN0aW9uIFN0cnVjdHVyZWRVbmlmb3JtKCBpZCApIHtcblxuXHR0aGlzLmlkID0gaWQ7XG5cblx0VW5pZm9ybUNvbnRhaW5lci5jYWxsKCB0aGlzICk7IC8vIG1peC1pblxuXG59XG5cblN0cnVjdHVyZWRVbmlmb3JtLnByb3RvdHlwZS5zZXRWYWx1ZSA9IGZ1bmN0aW9uICggZ2wsIHZhbHVlICkge1xuXG5cdC8vIE5vdGU6IERvbid0IG5lZWQgYW4gZXh0cmEgJ3JlbmRlcmVyJyBwYXJhbWV0ZXIsIHNpbmNlIHNhbXBsZXJzXG5cdC8vIGFyZSBub3QgYWxsb3dlZCBpbiBzdHJ1Y3R1cmVkIHVuaWZvcm1zLlxuXG5cdHZhciBzZXEgPSB0aGlzLnNlcTtcblxuXHRmb3IgKCB2YXIgaSA9IDAsIG4gPSBzZXEubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0dmFyIHUgPSBzZXFbIGkgXTtcblx0XHR1LnNldFZhbHVlKCBnbCwgdmFsdWVbIHUuaWQgXSApO1xuXG5cdH1cblxufTtcblxuLy8gLS0tIFRvcC1sZXZlbCAtLS1cblxuLy8gUGFyc2VyIC0gYnVpbGRzIHVwIHRoZSBwcm9wZXJ0eSB0cmVlIGZyb20gdGhlIHBhdGggc3RyaW5nc1xuXG52YXIgUmVQYXRoUGFydCA9IC8oW1xcd1xcZF9dKykoXFxdKT8oXFxbfFxcLik/L2c7XG5cbi8vIGV4dHJhY3RzXG4vLyBcdC0gdGhlIGlkZW50aWZpZXIgKG1lbWJlciBuYW1lIG9yIGFycmF5IGluZGV4KVxuLy8gIC0gZm9sbG93ZWQgYnkgYW4gb3B0aW9uYWwgcmlnaHQgYnJhY2tldCAoZm91bmQgd2hlbiBhcnJheSBpbmRleClcbi8vICAtIGZvbGxvd2VkIGJ5IGFuIG9wdGlvbmFsIGxlZnQgYnJhY2tldCBvciBkb3QgKHR5cGUgb2Ygc3Vic2NyaXB0KVxuLy9cbi8vIE5vdGU6IFRoZXNlIHBvcnRpb25zIGNhbiBiZSByZWFkIGluIGEgbm9uLW92ZXJsYXBwaW5nIGZhc2hpb24gYW5kXG4vLyBhbGxvdyBzdHJhaWdodGZvcndhcmQgcGFyc2luZyBvZiB0aGUgaGllcmFyY2h5IHRoYXQgV2ViR0wgZW5jb2Rlc1xuLy8gaW4gdGhlIHVuaWZvcm0gbmFtZXMuXG5cbmZ1bmN0aW9uIGFkZFVuaWZvcm0oIGNvbnRhaW5lciwgdW5pZm9ybU9iamVjdCApIHtcblxuXHRjb250YWluZXIuc2VxLnB1c2goIHVuaWZvcm1PYmplY3QgKTtcblx0Y29udGFpbmVyLm1hcFsgdW5pZm9ybU9iamVjdC5pZCBdID0gdW5pZm9ybU9iamVjdDtcblxufVxuXG5mdW5jdGlvbiBwYXJzZVVuaWZvcm0oIGFjdGl2ZUluZm8sIGFkZHIsIGNvbnRhaW5lciApIHtcblxuXHR2YXIgcGF0aCA9IGFjdGl2ZUluZm8ubmFtZSxcblx0XHRwYXRoTGVuZ3RoID0gcGF0aC5sZW5ndGg7XG5cblx0Ly8gcmVzZXQgUmVnRXhwIG9iamVjdCwgYmVjYXVzZSBvZiB0aGUgZWFybHkgZXhpdCBvZiBhIHByZXZpb3VzIHJ1blxuXHRSZVBhdGhQYXJ0Lmxhc3RJbmRleCA9IDA7XG5cblx0Zm9yICggOyA7ICkge1xuXG5cdFx0dmFyIG1hdGNoID0gUmVQYXRoUGFydC5leGVjKCBwYXRoICksXG5cdFx0XHRtYXRjaEVuZCA9IFJlUGF0aFBhcnQubGFzdEluZGV4LFxuXG5cdFx0XHRpZCA9IG1hdGNoWyAxIF0sXG5cdFx0XHRpZElzSW5kZXggPSBtYXRjaFsgMiBdID09PSAnXScsXG5cdFx0XHRzdWJzY3JpcHQgPSBtYXRjaFsgMyBdO1xuXG5cdFx0aWYgKCBpZElzSW5kZXggKSBpZCA9IGlkIHwgMDsgLy8gY29udmVydCB0byBpbnRlZ2VyXG5cblx0XHRpZiAoIHN1YnNjcmlwdCA9PT0gdW5kZWZpbmVkIHx8IHN1YnNjcmlwdCA9PT0gJ1snICYmIG1hdGNoRW5kICsgMiA9PT0gcGF0aExlbmd0aCApIHtcblxuXHRcdFx0Ly8gYmFyZSBuYW1lIG9yIFwicHVyZVwiIGJvdHRvbS1sZXZlbCBhcnJheSBcIlswXVwiIHN1ZmZpeFxuXG5cdFx0XHRhZGRVbmlmb3JtKCBjb250YWluZXIsIHN1YnNjcmlwdCA9PT0gdW5kZWZpbmVkID9cblx0XHRcdFx0bmV3IFNpbmdsZVVuaWZvcm0oIGlkLCBhY3RpdmVJbmZvLCBhZGRyICkgOlxuXHRcdFx0XHRuZXcgUHVyZUFycmF5VW5pZm9ybSggaWQsIGFjdGl2ZUluZm8sIGFkZHIgKSApO1xuXG5cdFx0XHRicmVhaztcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIHN0ZXAgaW50byBpbm5lciBub2RlIC8gY3JlYXRlIGl0IGluIGNhc2UgaXQgZG9lc24ndCBleGlzdFxuXG5cdFx0XHR2YXIgbWFwID0gY29udGFpbmVyLm1hcCwgbmV4dCA9IG1hcFsgaWQgXTtcblxuXHRcdFx0aWYgKCBuZXh0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0bmV4dCA9IG5ldyBTdHJ1Y3R1cmVkVW5pZm9ybSggaWQgKTtcblx0XHRcdFx0YWRkVW5pZm9ybSggY29udGFpbmVyLCBuZXh0ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Y29udGFpbmVyID0gbmV4dDtcblxuXHRcdH1cblxuXHR9XG5cbn1cblxuLy8gUm9vdCBDb250YWluZXJcblxuZnVuY3Rpb24gV2ViR0xVbmlmb3JtcyggZ2wsIHByb2dyYW0sIHJlbmRlcmVyICkge1xuXG5cdFVuaWZvcm1Db250YWluZXIuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMucmVuZGVyZXIgPSByZW5kZXJlcjtcblxuXHR2YXIgbiA9IGdsLmdldFByb2dyYW1QYXJhbWV0ZXIoIHByb2dyYW0sIGdsLkFDVElWRV9VTklGT1JNUyApO1xuXG5cdGZvciAoIHZhciBpID0gMDsgaSA8IG47ICsrIGkgKSB7XG5cblx0XHR2YXIgaW5mbyA9IGdsLmdldEFjdGl2ZVVuaWZvcm0oIHByb2dyYW0sIGkgKSxcblx0XHRcdGFkZHIgPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24oIHByb2dyYW0sIGluZm8ubmFtZSApO1xuXG5cdFx0cGFyc2VVbmlmb3JtKCBpbmZvLCBhZGRyLCB0aGlzICk7XG5cblx0fVxuXG59XG5cbldlYkdMVW5pZm9ybXMucHJvdG90eXBlLnNldFZhbHVlID0gZnVuY3Rpb24gKCBnbCwgbmFtZSwgdmFsdWUgKSB7XG5cblx0dmFyIHUgPSB0aGlzLm1hcFsgbmFtZSBdO1xuXG5cdGlmICggdSAhPT0gdW5kZWZpbmVkICkgdS5zZXRWYWx1ZSggZ2wsIHZhbHVlLCB0aGlzLnJlbmRlcmVyICk7XG5cbn07XG5cbldlYkdMVW5pZm9ybXMucHJvdG90eXBlLnNldE9wdGlvbmFsID0gZnVuY3Rpb24gKCBnbCwgb2JqZWN0LCBuYW1lICkge1xuXG5cdHZhciB2ID0gb2JqZWN0WyBuYW1lIF07XG5cblx0aWYgKCB2ICE9PSB1bmRlZmluZWQgKSB0aGlzLnNldFZhbHVlKCBnbCwgbmFtZSwgdiApO1xuXG59O1xuXG5cbi8vIFN0YXRpYyBpbnRlcmZhY2VcblxuV2ViR0xVbmlmb3Jtcy51cGxvYWQgPSBmdW5jdGlvbiAoIGdsLCBzZXEsIHZhbHVlcywgcmVuZGVyZXIgKSB7XG5cblx0Zm9yICggdmFyIGkgPSAwLCBuID0gc2VxLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdHZhciB1ID0gc2VxWyBpIF0sXG5cdFx0XHR2ID0gdmFsdWVzWyB1LmlkIF07XG5cblx0XHRpZiAoIHYubmVlZHNVcGRhdGUgIT09IGZhbHNlICkge1xuXG5cdFx0XHQvLyBub3RlOiBhbHdheXMgdXBkYXRpbmcgd2hlbiAubmVlZHNVcGRhdGUgaXMgdW5kZWZpbmVkXG5cdFx0XHR1LnNldFZhbHVlKCBnbCwgdi52YWx1ZSwgcmVuZGVyZXIgKTtcblxuXHRcdH1cblxuXHR9XG5cbn07XG5cbldlYkdMVW5pZm9ybXMuc2VxV2l0aFZhbHVlID0gZnVuY3Rpb24gKCBzZXEsIHZhbHVlcyApIHtcblxuXHR2YXIgciA9IFtdO1xuXG5cdGZvciAoIHZhciBpID0gMCwgbiA9IHNlcS5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHR2YXIgdSA9IHNlcVsgaSBdO1xuXHRcdGlmICggdS5pZCBpbiB2YWx1ZXMgKSByLnB1c2goIHUgKTtcblxuXHR9XG5cblx0cmV0dXJuIHI7XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBhZGRMaW5lTnVtYmVycyggc3RyaW5nICkge1xuXG5cdHZhciBsaW5lcyA9IHN0cmluZy5zcGxpdCggJ1xcbicgKTtcblxuXHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRsaW5lc1sgaSBdID0gKCBpICsgMSApICsgJzogJyArIGxpbmVzWyBpIF07XG5cblx0fVxuXG5cdHJldHVybiBsaW5lcy5qb2luKCAnXFxuJyApO1xuXG59XG5cbmZ1bmN0aW9uIFdlYkdMU2hhZGVyKCBnbCwgdHlwZSwgc3RyaW5nICkge1xuXG5cdHZhciBzaGFkZXIgPSBnbC5jcmVhdGVTaGFkZXIoIHR5cGUgKTtcblxuXHRnbC5zaGFkZXJTb3VyY2UoIHNoYWRlciwgc3RyaW5nICk7XG5cdGdsLmNvbXBpbGVTaGFkZXIoIHNoYWRlciApO1xuXG5cdGlmICggZ2wuZ2V0U2hhZGVyUGFyYW1ldGVyKCBzaGFkZXIsIGdsLkNPTVBJTEVfU1RBVFVTICkgPT09IGZhbHNlICkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdMU2hhZGVyOiBTaGFkZXIgY291bGRuXFwndCBjb21waWxlLicgKTtcblxuXHR9XG5cblx0aWYgKCBnbC5nZXRTaGFkZXJJbmZvTG9nKCBzaGFkZXIgKSAhPT0gJycgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFNoYWRlcjogZ2wuZ2V0U2hhZGVySW5mb0xvZygpJywgdHlwZSA9PT0gZ2wuVkVSVEVYX1NIQURFUiA/ICd2ZXJ0ZXgnIDogJ2ZyYWdtZW50JywgZ2wuZ2V0U2hhZGVySW5mb0xvZyggc2hhZGVyICksIGFkZExpbmVOdW1iZXJzKCBzdHJpbmcgKSApO1xuXG5cdH1cblxuXHQvLyAtLWVuYWJsZS1wcml2aWxlZ2VkLXdlYmdsLWV4dGVuc2lvblxuXHQvLyBjb25zb2xlLmxvZyggdHlwZSwgZ2wuZ2V0RXh0ZW5zaW9uKCAnV0VCR0xfZGVidWdfc2hhZGVycycgKS5nZXRUcmFuc2xhdGVkU2hhZGVyU291cmNlKCBzaGFkZXIgKSApO1xuXG5cdHJldHVybiBzaGFkZXI7XG5cbn1cblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbnZhciBwcm9ncmFtSWRDb3VudCA9IDA7XG5cbmZ1bmN0aW9uIGdldEVuY29kaW5nQ29tcG9uZW50cyggZW5jb2RpbmcgKSB7XG5cblx0c3dpdGNoICggZW5jb2RpbmcgKSB7XG5cblx0XHRjYXNlIExpbmVhckVuY29kaW5nOlxuXHRcdFx0cmV0dXJuIFsgJ0xpbmVhcicsICcoIHZhbHVlICknIF07XG5cdFx0Y2FzZSBzUkdCRW5jb2Rpbmc6XG5cdFx0XHRyZXR1cm4gWyAnc1JHQicsICcoIHZhbHVlICknIF07XG5cdFx0Y2FzZSBSR0JFRW5jb2Rpbmc6XG5cdFx0XHRyZXR1cm4gWyAnUkdCRScsICcoIHZhbHVlICknIF07XG5cdFx0Y2FzZSBSR0JNN0VuY29kaW5nOlxuXHRcdFx0cmV0dXJuIFsgJ1JHQk0nLCAnKCB2YWx1ZSwgNy4wICknIF07XG5cdFx0Y2FzZSBSR0JNMTZFbmNvZGluZzpcblx0XHRcdHJldHVybiBbICdSR0JNJywgJyggdmFsdWUsIDE2LjAgKScgXTtcblx0XHRjYXNlIFJHQkRFbmNvZGluZzpcblx0XHRcdHJldHVybiBbICdSR0JEJywgJyggdmFsdWUsIDI1Ni4wICknIF07XG5cdFx0Y2FzZSBHYW1tYUVuY29kaW5nOlxuXHRcdFx0cmV0dXJuIFsgJ0dhbW1hJywgJyggdmFsdWUsIGZsb2F0KCBHQU1NQV9GQUNUT1IgKSApJyBdO1xuXHRcdGRlZmF1bHQ6XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoICd1bnN1cHBvcnRlZCBlbmNvZGluZzogJyArIGVuY29kaW5nICk7XG5cblx0fVxuXG59XG5cbmZ1bmN0aW9uIGdldFRleGVsRGVjb2RpbmdGdW5jdGlvbiggZnVuY3Rpb25OYW1lLCBlbmNvZGluZyApIHtcblxuXHR2YXIgY29tcG9uZW50cyA9IGdldEVuY29kaW5nQ29tcG9uZW50cyggZW5jb2RpbmcgKTtcblx0cmV0dXJuICd2ZWM0ICcgKyBmdW5jdGlvbk5hbWUgKyAnKCB2ZWM0IHZhbHVlICkgeyByZXR1cm4gJyArIGNvbXBvbmVudHNbIDAgXSArICdUb0xpbmVhcicgKyBjb21wb25lbnRzWyAxIF0gKyAnOyB9JztcblxufVxuXG5mdW5jdGlvbiBnZXRUZXhlbEVuY29kaW5nRnVuY3Rpb24oIGZ1bmN0aW9uTmFtZSwgZW5jb2RpbmcgKSB7XG5cblx0dmFyIGNvbXBvbmVudHMgPSBnZXRFbmNvZGluZ0NvbXBvbmVudHMoIGVuY29kaW5nICk7XG5cdHJldHVybiAndmVjNCAnICsgZnVuY3Rpb25OYW1lICsgJyggdmVjNCB2YWx1ZSApIHsgcmV0dXJuIExpbmVhclRvJyArIGNvbXBvbmVudHNbIDAgXSArIGNvbXBvbmVudHNbIDEgXSArICc7IH0nO1xuXG59XG5cbmZ1bmN0aW9uIGdldFRvbmVNYXBwaW5nRnVuY3Rpb24oIGZ1bmN0aW9uTmFtZSwgdG9uZU1hcHBpbmcgKSB7XG5cblx0dmFyIHRvbmVNYXBwaW5nTmFtZTtcblxuXHRzd2l0Y2ggKCB0b25lTWFwcGluZyApIHtcblxuXHRcdGNhc2UgTGluZWFyVG9uZU1hcHBpbmc6XG5cdFx0XHR0b25lTWFwcGluZ05hbWUgPSAnTGluZWFyJztcblx0XHRcdGJyZWFrO1xuXG5cdFx0Y2FzZSBSZWluaGFyZFRvbmVNYXBwaW5nOlxuXHRcdFx0dG9uZU1hcHBpbmdOYW1lID0gJ1JlaW5oYXJkJztcblx0XHRcdGJyZWFrO1xuXG5cdFx0Y2FzZSBVbmNoYXJ0ZWQyVG9uZU1hcHBpbmc6XG5cdFx0XHR0b25lTWFwcGluZ05hbWUgPSAnVW5jaGFydGVkMic7XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgQ2luZW9uVG9uZU1hcHBpbmc6XG5cdFx0XHR0b25lTWFwcGluZ05hbWUgPSAnT3B0aW1pemVkQ2luZW9uJztcblx0XHRcdGJyZWFrO1xuXG5cdFx0ZGVmYXVsdDpcblx0XHRcdHRocm93IG5ldyBFcnJvciggJ3Vuc3VwcG9ydGVkIHRvbmVNYXBwaW5nOiAnICsgdG9uZU1hcHBpbmcgKTtcblxuXHR9XG5cblx0cmV0dXJuICd2ZWMzICcgKyBmdW5jdGlvbk5hbWUgKyAnKCB2ZWMzIGNvbG9yICkgeyByZXR1cm4gJyArIHRvbmVNYXBwaW5nTmFtZSArICdUb25lTWFwcGluZyggY29sb3IgKTsgfSc7XG5cbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVFeHRlbnNpb25zKCBleHRlbnNpb25zLCBwYXJhbWV0ZXJzLCByZW5kZXJlckV4dGVuc2lvbnMgKSB7XG5cblx0ZXh0ZW5zaW9ucyA9IGV4dGVuc2lvbnMgfHwge307XG5cblx0dmFyIGNodW5rcyA9IFtcblx0XHQoIGV4dGVuc2lvbnMuZGVyaXZhdGl2ZXMgfHwgcGFyYW1ldGVycy5lbnZNYXBDdWJlVVYgfHwgcGFyYW1ldGVycy5idW1wTWFwIHx8IHBhcmFtZXRlcnMubm9ybWFsTWFwIHx8IHBhcmFtZXRlcnMuZmxhdFNoYWRpbmcgKSA/ICcjZXh0ZW5zaW9uIEdMX09FU19zdGFuZGFyZF9kZXJpdmF0aXZlcyA6IGVuYWJsZScgOiAnJyxcblx0XHQoIGV4dGVuc2lvbnMuZnJhZ0RlcHRoIHx8IHBhcmFtZXRlcnMubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciApICYmIHJlbmRlcmVyRXh0ZW5zaW9ucy5nZXQoICdFWFRfZnJhZ19kZXB0aCcgKSA/ICcjZXh0ZW5zaW9uIEdMX0VYVF9mcmFnX2RlcHRoIDogZW5hYmxlJyA6ICcnLFxuXHRcdCggZXh0ZW5zaW9ucy5kcmF3QnVmZmVycyApICYmIHJlbmRlcmVyRXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9kcmF3X2J1ZmZlcnMnICkgPyAnI2V4dGVuc2lvbiBHTF9FWFRfZHJhd19idWZmZXJzIDogcmVxdWlyZScgOiAnJyxcblx0XHQoIGV4dGVuc2lvbnMuc2hhZGVyVGV4dHVyZUxPRCB8fCBwYXJhbWV0ZXJzLmVudk1hcCApICYmIHJlbmRlcmVyRXh0ZW5zaW9ucy5nZXQoICdFWFRfc2hhZGVyX3RleHR1cmVfbG9kJyApID8gJyNleHRlbnNpb24gR0xfRVhUX3NoYWRlcl90ZXh0dXJlX2xvZCA6IGVuYWJsZScgOiAnJ1xuXHRdO1xuXG5cdHJldHVybiBjaHVua3MuZmlsdGVyKCBmaWx0ZXJFbXB0eUxpbmUgKS5qb2luKCAnXFxuJyApO1xuXG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlRGVmaW5lcyggZGVmaW5lcyApIHtcblxuXHR2YXIgY2h1bmtzID0gW107XG5cblx0Zm9yICggdmFyIG5hbWUgaW4gZGVmaW5lcyApIHtcblxuXHRcdHZhciB2YWx1ZSA9IGRlZmluZXNbIG5hbWUgXTtcblxuXHRcdGlmICggdmFsdWUgPT09IGZhbHNlICkgY29udGludWU7XG5cblx0XHRjaHVua3MucHVzaCggJyNkZWZpbmUgJyArIG5hbWUgKyAnICcgKyB2YWx1ZSApO1xuXG5cdH1cblxuXHRyZXR1cm4gY2h1bmtzLmpvaW4oICdcXG4nICk7XG5cbn1cblxuZnVuY3Rpb24gZmV0Y2hBdHRyaWJ1dGVMb2NhdGlvbnMoIGdsLCBwcm9ncmFtICkge1xuXG5cdHZhciBhdHRyaWJ1dGVzID0ge307XG5cblx0dmFyIG4gPSBnbC5nZXRQcm9ncmFtUGFyYW1ldGVyKCBwcm9ncmFtLCBnbC5BQ1RJVkVfQVRUUklCVVRFUyApO1xuXG5cdGZvciAoIHZhciBpID0gMDsgaSA8IG47IGkgKysgKSB7XG5cblx0XHR2YXIgaW5mbyA9IGdsLmdldEFjdGl2ZUF0dHJpYiggcHJvZ3JhbSwgaSApO1xuXHRcdHZhciBuYW1lID0gaW5mby5uYW1lO1xuXG5cdFx0Ly8gY29uc29sZS5sb2coICdUSFJFRS5XZWJHTFByb2dyYW06IEFDVElWRSBWRVJURVggQVRUUklCVVRFOicsIG5hbWUsIGkgKTtcblxuXHRcdGF0dHJpYnV0ZXNbIG5hbWUgXSA9IGdsLmdldEF0dHJpYkxvY2F0aW9uKCBwcm9ncmFtLCBuYW1lICk7XG5cblx0fVxuXG5cdHJldHVybiBhdHRyaWJ1dGVzO1xuXG59XG5cbmZ1bmN0aW9uIGZpbHRlckVtcHR5TGluZSggc3RyaW5nICkge1xuXG5cdHJldHVybiBzdHJpbmcgIT09ICcnO1xuXG59XG5cbmZ1bmN0aW9uIHJlcGxhY2VMaWdodE51bXMoIHN0cmluZywgcGFyYW1ldGVycyApIHtcblxuXHRyZXR1cm4gc3RyaW5nXG5cdFx0LnJlcGxhY2UoIC9OVU1fRElSX0xJR0hUUy9nLCBwYXJhbWV0ZXJzLm51bURpckxpZ2h0cyApXG5cdFx0LnJlcGxhY2UoIC9OVU1fU1BPVF9MSUdIVFMvZywgcGFyYW1ldGVycy5udW1TcG90TGlnaHRzIClcblx0XHQucmVwbGFjZSggL05VTV9SRUNUX0FSRUFfTElHSFRTL2csIHBhcmFtZXRlcnMubnVtUmVjdEFyZWFMaWdodHMgKVxuXHRcdC5yZXBsYWNlKCAvTlVNX1BPSU5UX0xJR0hUUy9nLCBwYXJhbWV0ZXJzLm51bVBvaW50TGlnaHRzIClcblx0XHQucmVwbGFjZSggL05VTV9IRU1JX0xJR0hUUy9nLCBwYXJhbWV0ZXJzLm51bUhlbWlMaWdodHMgKTtcblxufVxuXG5mdW5jdGlvbiByZXBsYWNlQ2xpcHBpbmdQbGFuZU51bXMoIHN0cmluZywgcGFyYW1ldGVycyApIHtcblxuXHRyZXR1cm4gc3RyaW5nXG5cdFx0LnJlcGxhY2UoIC9OVU1fQ0xJUFBJTkdfUExBTkVTL2csIHBhcmFtZXRlcnMubnVtQ2xpcHBpbmdQbGFuZXMgKVxuXHRcdC5yZXBsYWNlKCAvVU5JT05fQ0xJUFBJTkdfUExBTkVTL2csICggcGFyYW1ldGVycy5udW1DbGlwcGluZ1BsYW5lcyAtIHBhcmFtZXRlcnMubnVtQ2xpcEludGVyc2VjdGlvbiApICk7XG5cbn1cblxuZnVuY3Rpb24gcGFyc2VJbmNsdWRlcyggc3RyaW5nICkge1xuXG5cdHZhciBwYXR0ZXJuID0gL15bIFxcdF0qI2luY2x1ZGUgKzwoW1xcd1xcZC5dKyk+L2dtO1xuXG5cdGZ1bmN0aW9uIHJlcGxhY2UoIG1hdGNoLCBpbmNsdWRlICkge1xuXG5cdFx0dmFyIHJlcGxhY2UgPSBTaGFkZXJDaHVua1sgaW5jbHVkZSBdO1xuXG5cdFx0aWYgKCByZXBsYWNlID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHRocm93IG5ldyBFcnJvciggJ0NhbiBub3QgcmVzb2x2ZSAjaW5jbHVkZSA8JyArIGluY2x1ZGUgKyAnPicgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBwYXJzZUluY2x1ZGVzKCByZXBsYWNlICk7XG5cblx0fVxuXG5cdHJldHVybiBzdHJpbmcucmVwbGFjZSggcGF0dGVybiwgcmVwbGFjZSApO1xuXG59XG5cbmZ1bmN0aW9uIHVucm9sbExvb3BzKCBzdHJpbmcgKSB7XG5cblx0dmFyIHBhdHRlcm4gPSAvI3ByYWdtYSB1bnJvbGxfbG9vcFtcXHNdKz9mb3IgXFwoIGludCBpIFxcPSAoXFxkKylcXDsgaSA8IChcXGQrKVxcOyBpIFxcK1xcKyBcXCkgXFx7KFtcXHNcXFNdKz8pKD89XFx9KVxcfS9nO1xuXG5cdGZ1bmN0aW9uIHJlcGxhY2UoIG1hdGNoLCBzdGFydCwgZW5kLCBzbmlwcGV0ICkge1xuXG5cdFx0dmFyIHVucm9sbCA9ICcnO1xuXG5cdFx0Zm9yICggdmFyIGkgPSBwYXJzZUludCggc3RhcnQgKTsgaSA8IHBhcnNlSW50KCBlbmQgKTsgaSArKyApIHtcblxuXHRcdFx0dW5yb2xsICs9IHNuaXBwZXQucmVwbGFjZSggL1xcWyBpIFxcXS9nLCAnWyAnICsgaSArICcgXScgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB1bnJvbGw7XG5cblx0fVxuXG5cdHJldHVybiBzdHJpbmcucmVwbGFjZSggcGF0dGVybiwgcmVwbGFjZSApO1xuXG59XG5cbmZ1bmN0aW9uIFdlYkdMUHJvZ3JhbSggcmVuZGVyZXIsIGV4dGVuc2lvbnMsIGNvZGUsIG1hdGVyaWFsLCBzaGFkZXIsIHBhcmFtZXRlcnMgKSB7XG5cblx0dmFyIGdsID0gcmVuZGVyZXIuY29udGV4dDtcblxuXHR2YXIgZGVmaW5lcyA9IG1hdGVyaWFsLmRlZmluZXM7XG5cblx0dmFyIHZlcnRleFNoYWRlciA9IHNoYWRlci52ZXJ0ZXhTaGFkZXI7XG5cdHZhciBmcmFnbWVudFNoYWRlciA9IHNoYWRlci5mcmFnbWVudFNoYWRlcjtcblxuXHR2YXIgc2hhZG93TWFwVHlwZURlZmluZSA9ICdTSEFET1dNQVBfVFlQRV9CQVNJQyc7XG5cblx0aWYgKCBwYXJhbWV0ZXJzLnNoYWRvd01hcFR5cGUgPT09IFBDRlNoYWRvd01hcCApIHtcblxuXHRcdHNoYWRvd01hcFR5cGVEZWZpbmUgPSAnU0hBRE9XTUFQX1RZUEVfUENGJztcblxuXHR9IGVsc2UgaWYgKCBwYXJhbWV0ZXJzLnNoYWRvd01hcFR5cGUgPT09IFBDRlNvZnRTaGFkb3dNYXAgKSB7XG5cblx0XHRzaGFkb3dNYXBUeXBlRGVmaW5lID0gJ1NIQURPV01BUF9UWVBFX1BDRl9TT0ZUJztcblxuXHR9XG5cblx0dmFyIGVudk1hcFR5cGVEZWZpbmUgPSAnRU5WTUFQX1RZUEVfQ1VCRSc7XG5cdHZhciBlbnZNYXBNb2RlRGVmaW5lID0gJ0VOVk1BUF9NT0RFX1JFRkxFQ1RJT04nO1xuXHR2YXIgZW52TWFwQmxlbmRpbmdEZWZpbmUgPSAnRU5WTUFQX0JMRU5ESU5HX01VTFRJUExZJztcblxuXHRpZiAoIHBhcmFtZXRlcnMuZW52TWFwICkge1xuXG5cdFx0c3dpdGNoICggbWF0ZXJpYWwuZW52TWFwLm1hcHBpbmcgKSB7XG5cblx0XHRcdGNhc2UgQ3ViZVJlZmxlY3Rpb25NYXBwaW5nOlxuXHRcdFx0Y2FzZSBDdWJlUmVmcmFjdGlvbk1hcHBpbmc6XG5cdFx0XHRcdGVudk1hcFR5cGVEZWZpbmUgPSAnRU5WTUFQX1RZUEVfQ1VCRSc7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIEN1YmVVVlJlZmxlY3Rpb25NYXBwaW5nOlxuXHRcdFx0Y2FzZSBDdWJlVVZSZWZyYWN0aW9uTWFwcGluZzpcblx0XHRcdFx0ZW52TWFwVHlwZURlZmluZSA9ICdFTlZNQVBfVFlQRV9DVUJFX1VWJztcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgRXF1aXJlY3Rhbmd1bGFyUmVmbGVjdGlvbk1hcHBpbmc6XG5cdFx0XHRjYXNlIEVxdWlyZWN0YW5ndWxhclJlZnJhY3Rpb25NYXBwaW5nOlxuXHRcdFx0XHRlbnZNYXBUeXBlRGVmaW5lID0gJ0VOVk1BUF9UWVBFX0VRVUlSRUMnO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBTcGhlcmljYWxSZWZsZWN0aW9uTWFwcGluZzpcblx0XHRcdFx0ZW52TWFwVHlwZURlZmluZSA9ICdFTlZNQVBfVFlQRV9TUEhFUkUnO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdH1cblxuXHRcdHN3aXRjaCAoIG1hdGVyaWFsLmVudk1hcC5tYXBwaW5nICkge1xuXG5cdFx0XHRjYXNlIEN1YmVSZWZyYWN0aW9uTWFwcGluZzpcblx0XHRcdGNhc2UgRXF1aXJlY3Rhbmd1bGFyUmVmcmFjdGlvbk1hcHBpbmc6XG5cdFx0XHRcdGVudk1hcE1vZGVEZWZpbmUgPSAnRU5WTUFQX01PREVfUkVGUkFDVElPTic7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0fVxuXG5cdFx0c3dpdGNoICggbWF0ZXJpYWwuY29tYmluZSApIHtcblxuXHRcdFx0Y2FzZSBNdWx0aXBseU9wZXJhdGlvbjpcblx0XHRcdFx0ZW52TWFwQmxlbmRpbmdEZWZpbmUgPSAnRU5WTUFQX0JMRU5ESU5HX01VTFRJUExZJztcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgTWl4T3BlcmF0aW9uOlxuXHRcdFx0XHRlbnZNYXBCbGVuZGluZ0RlZmluZSA9ICdFTlZNQVBfQkxFTkRJTkdfTUlYJztcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgQWRkT3BlcmF0aW9uOlxuXHRcdFx0XHRlbnZNYXBCbGVuZGluZ0RlZmluZSA9ICdFTlZNQVBfQkxFTkRJTkdfQUREJztcblx0XHRcdFx0YnJlYWs7XG5cblx0XHR9XG5cblx0fVxuXG5cdHZhciBnYW1tYUZhY3RvckRlZmluZSA9ICggcmVuZGVyZXIuZ2FtbWFGYWN0b3IgPiAwICkgPyByZW5kZXJlci5nYW1tYUZhY3RvciA6IDEuMDtcblxuXHQvLyBjb25zb2xlLmxvZyggJ2J1aWxkaW5nIG5ldyBwcm9ncmFtICcgKTtcblxuXHQvL1xuXG5cdHZhciBjdXN0b21FeHRlbnNpb25zID0gZ2VuZXJhdGVFeHRlbnNpb25zKCBtYXRlcmlhbC5leHRlbnNpb25zLCBwYXJhbWV0ZXJzLCBleHRlbnNpb25zICk7XG5cblx0dmFyIGN1c3RvbURlZmluZXMgPSBnZW5lcmF0ZURlZmluZXMoIGRlZmluZXMgKTtcblxuXHQvL1xuXG5cdHZhciBwcm9ncmFtID0gZ2wuY3JlYXRlUHJvZ3JhbSgpO1xuXG5cdHZhciBwcmVmaXhWZXJ0ZXgsIHByZWZpeEZyYWdtZW50O1xuXG5cdGlmICggbWF0ZXJpYWwuaXNSYXdTaGFkZXJNYXRlcmlhbCApIHtcblxuXHRcdHByZWZpeFZlcnRleCA9IFtcblxuXHRcdFx0Y3VzdG9tRGVmaW5lc1xuXG5cdFx0XS5maWx0ZXIoIGZpbHRlckVtcHR5TGluZSApLmpvaW4oICdcXG4nICk7XG5cblx0XHRpZiAoIHByZWZpeFZlcnRleC5sZW5ndGggPiAwICkge1xuXG5cdFx0XHRwcmVmaXhWZXJ0ZXggKz0gJ1xcbic7XG5cblx0XHR9XG5cblx0XHRwcmVmaXhGcmFnbWVudCA9IFtcblxuXHRcdFx0Y3VzdG9tRXh0ZW5zaW9ucyxcblx0XHRcdGN1c3RvbURlZmluZXNcblxuXHRcdF0uZmlsdGVyKCBmaWx0ZXJFbXB0eUxpbmUgKS5qb2luKCAnXFxuJyApO1xuXG5cdFx0aWYgKCBwcmVmaXhGcmFnbWVudC5sZW5ndGggPiAwICkge1xuXG5cdFx0XHRwcmVmaXhGcmFnbWVudCArPSAnXFxuJztcblxuXHRcdH1cblxuXHR9IGVsc2Uge1xuXG5cdFx0cHJlZml4VmVydGV4ID0gW1xuXG5cdFx0XHQncHJlY2lzaW9uICcgKyBwYXJhbWV0ZXJzLnByZWNpc2lvbiArICcgZmxvYXQ7Jyxcblx0XHRcdCdwcmVjaXNpb24gJyArIHBhcmFtZXRlcnMucHJlY2lzaW9uICsgJyBpbnQ7JyxcblxuXHRcdFx0JyNkZWZpbmUgU0hBREVSX05BTUUgJyArIHNoYWRlci5uYW1lLFxuXG5cdFx0XHRjdXN0b21EZWZpbmVzLFxuXG5cdFx0XHRwYXJhbWV0ZXJzLnN1cHBvcnRzVmVydGV4VGV4dHVyZXMgPyAnI2RlZmluZSBWRVJURVhfVEVYVFVSRVMnIDogJycsXG5cblx0XHRcdCcjZGVmaW5lIEdBTU1BX0ZBQ1RPUiAnICsgZ2FtbWFGYWN0b3JEZWZpbmUsXG5cblx0XHRcdCcjZGVmaW5lIE1BWF9CT05FUyAnICsgcGFyYW1ldGVycy5tYXhCb25lcyxcblx0XHRcdCggcGFyYW1ldGVycy51c2VGb2cgJiYgcGFyYW1ldGVycy5mb2cgKSA/ICcjZGVmaW5lIFVTRV9GT0cnIDogJycsXG5cdFx0XHQoIHBhcmFtZXRlcnMudXNlRm9nICYmIHBhcmFtZXRlcnMuZm9nRXhwICkgPyAnI2RlZmluZSBGT0dfRVhQMicgOiAnJyxcblxuXHRcdFx0cGFyYW1ldGVycy5tYXAgPyAnI2RlZmluZSBVU0VfTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5lbnZNYXAgPyAnI2RlZmluZSBVU0VfRU5WTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5lbnZNYXAgPyAnI2RlZmluZSAnICsgZW52TWFwTW9kZURlZmluZSA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5saWdodE1hcCA/ICcjZGVmaW5lIFVTRV9MSUdIVE1BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuYW9NYXAgPyAnI2RlZmluZSBVU0VfQU9NQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmVtaXNzaXZlTWFwID8gJyNkZWZpbmUgVVNFX0VNSVNTSVZFTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5idW1wTWFwID8gJyNkZWZpbmUgVVNFX0JVTVBNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLm5vcm1hbE1hcCA/ICcjZGVmaW5lIFVTRV9OT1JNQUxNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmRpc3BsYWNlbWVudE1hcCAmJiBwYXJhbWV0ZXJzLnN1cHBvcnRzVmVydGV4VGV4dHVyZXMgPyAnI2RlZmluZSBVU0VfRElTUExBQ0VNRU5UTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5zcGVjdWxhck1hcCA/ICcjZGVmaW5lIFVTRV9TUEVDVUxBUk1BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMucm91Z2huZXNzTWFwID8gJyNkZWZpbmUgVVNFX1JPVUdITkVTU01BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMubWV0YWxuZXNzTWFwID8gJyNkZWZpbmUgVVNFX01FVEFMTkVTU01BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuYWxwaGFNYXAgPyAnI2RlZmluZSBVU0VfQUxQSEFNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLnZlcnRleENvbG9ycyA/ICcjZGVmaW5lIFVTRV9DT0xPUicgOiAnJyxcblxuXHRcdFx0cGFyYW1ldGVycy5mbGF0U2hhZGluZyA/ICcjZGVmaW5lIEZMQVRfU0hBREVEJyA6ICcnLFxuXG5cdFx0XHRwYXJhbWV0ZXJzLnNraW5uaW5nID8gJyNkZWZpbmUgVVNFX1NLSU5OSU5HJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy51c2VWZXJ0ZXhUZXh0dXJlID8gJyNkZWZpbmUgQk9ORV9URVhUVVJFJyA6ICcnLFxuXG5cdFx0XHRwYXJhbWV0ZXJzLm1vcnBoVGFyZ2V0cyA/ICcjZGVmaW5lIFVTRV9NT1JQSFRBUkdFVFMnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLm1vcnBoTm9ybWFscyAmJiBwYXJhbWV0ZXJzLmZsYXRTaGFkaW5nID09PSBmYWxzZSA/ICcjZGVmaW5lIFVTRV9NT1JQSE5PUk1BTFMnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmRvdWJsZVNpZGVkID8gJyNkZWZpbmUgRE9VQkxFX1NJREVEJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5mbGlwU2lkZWQgPyAnI2RlZmluZSBGTElQX1NJREVEJyA6ICcnLFxuXG5cdFx0XHRwYXJhbWV0ZXJzLnNoYWRvd01hcEVuYWJsZWQgPyAnI2RlZmluZSBVU0VfU0hBRE9XTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5zaGFkb3dNYXBFbmFibGVkID8gJyNkZWZpbmUgJyArIHNoYWRvd01hcFR5cGVEZWZpbmUgOiAnJyxcblxuXHRcdFx0cGFyYW1ldGVycy5zaXplQXR0ZW51YXRpb24gPyAnI2RlZmluZSBVU0VfU0laRUFUVEVOVUFUSU9OJyA6ICcnLFxuXG5cdFx0XHRwYXJhbWV0ZXJzLmxvZ2FyaXRobWljRGVwdGhCdWZmZXIgPyAnI2RlZmluZSBVU0VfTE9HREVQVEhCVUYnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmxvZ2FyaXRobWljRGVwdGhCdWZmZXIgJiYgZXh0ZW5zaW9ucy5nZXQoICdFWFRfZnJhZ19kZXB0aCcgKSA/ICcjZGVmaW5lIFVTRV9MT0dERVBUSEJVRl9FWFQnIDogJycsXG5cblx0XHRcdCd1bmlmb3JtIG1hdDQgbW9kZWxNYXRyaXg7Jyxcblx0XHRcdCd1bmlmb3JtIG1hdDQgbW9kZWxWaWV3TWF0cml4OycsXG5cdFx0XHQndW5pZm9ybSBtYXQ0IHByb2plY3Rpb25NYXRyaXg7Jyxcblx0XHRcdCd1bmlmb3JtIG1hdDQgdmlld01hdHJpeDsnLFxuXHRcdFx0J3VuaWZvcm0gbWF0MyBub3JtYWxNYXRyaXg7Jyxcblx0XHRcdCd1bmlmb3JtIHZlYzMgY2FtZXJhUG9zaXRpb247JyxcblxuXHRcdFx0J2F0dHJpYnV0ZSB2ZWMzIHBvc2l0aW9uOycsXG5cdFx0XHQnYXR0cmlidXRlIHZlYzMgbm9ybWFsOycsXG5cdFx0XHQnYXR0cmlidXRlIHZlYzIgdXY7JyxcblxuXHRcdFx0JyNpZmRlZiBVU0VfQ09MT1InLFxuXG5cdFx0XHQnXHRhdHRyaWJ1dGUgdmVjMyBjb2xvcjsnLFxuXG5cdFx0XHQnI2VuZGlmJyxcblxuXHRcdFx0JyNpZmRlZiBVU0VfTU9SUEhUQVJHRVRTJyxcblxuXHRcdFx0J1x0YXR0cmlidXRlIHZlYzMgbW9ycGhUYXJnZXQwOycsXG5cdFx0XHQnXHRhdHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDE7Jyxcblx0XHRcdCdcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0MjsnLFxuXHRcdFx0J1x0YXR0cmlidXRlIHZlYzMgbW9ycGhUYXJnZXQzOycsXG5cblx0XHRcdCdcdCNpZmRlZiBVU0VfTU9SUEhOT1JNQUxTJyxcblxuXHRcdFx0J1x0XHRhdHRyaWJ1dGUgdmVjMyBtb3JwaE5vcm1hbDA7Jyxcblx0XHRcdCdcdFx0YXR0cmlidXRlIHZlYzMgbW9ycGhOb3JtYWwxOycsXG5cdFx0XHQnXHRcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoTm9ybWFsMjsnLFxuXHRcdFx0J1x0XHRhdHRyaWJ1dGUgdmVjMyBtb3JwaE5vcm1hbDM7JyxcblxuXHRcdFx0J1x0I2Vsc2UnLFxuXG5cdFx0XHQnXHRcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0NDsnLFxuXHRcdFx0J1x0XHRhdHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDU7Jyxcblx0XHRcdCdcdFx0YXR0cmlidXRlIHZlYzMgbW9ycGhUYXJnZXQ2OycsXG5cdFx0XHQnXHRcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0NzsnLFxuXG5cdFx0XHQnXHQjZW5kaWYnLFxuXG5cdFx0XHQnI2VuZGlmJyxcblxuXHRcdFx0JyNpZmRlZiBVU0VfU0tJTk5JTkcnLFxuXG5cdFx0XHQnXHRhdHRyaWJ1dGUgdmVjNCBza2luSW5kZXg7Jyxcblx0XHRcdCdcdGF0dHJpYnV0ZSB2ZWM0IHNraW5XZWlnaHQ7JyxcblxuXHRcdFx0JyNlbmRpZicsXG5cblx0XHRcdCdcXG4nXG5cblx0XHRdLmZpbHRlciggZmlsdGVyRW1wdHlMaW5lICkuam9pbiggJ1xcbicgKTtcblxuXHRcdHByZWZpeEZyYWdtZW50ID0gW1xuXG5cdFx0XHRjdXN0b21FeHRlbnNpb25zLFxuXG5cdFx0XHQncHJlY2lzaW9uICcgKyBwYXJhbWV0ZXJzLnByZWNpc2lvbiArICcgZmxvYXQ7Jyxcblx0XHRcdCdwcmVjaXNpb24gJyArIHBhcmFtZXRlcnMucHJlY2lzaW9uICsgJyBpbnQ7JyxcblxuXHRcdFx0JyNkZWZpbmUgU0hBREVSX05BTUUgJyArIHNoYWRlci5uYW1lLFxuXG5cdFx0XHRjdXN0b21EZWZpbmVzLFxuXG5cdFx0XHRwYXJhbWV0ZXJzLmFscGhhVGVzdCA/ICcjZGVmaW5lIEFMUEhBVEVTVCAnICsgcGFyYW1ldGVycy5hbHBoYVRlc3QgOiAnJyxcblxuXHRcdFx0JyNkZWZpbmUgR0FNTUFfRkFDVE9SICcgKyBnYW1tYUZhY3RvckRlZmluZSxcblxuXHRcdFx0KCBwYXJhbWV0ZXJzLnVzZUZvZyAmJiBwYXJhbWV0ZXJzLmZvZyApID8gJyNkZWZpbmUgVVNFX0ZPRycgOiAnJyxcblx0XHRcdCggcGFyYW1ldGVycy51c2VGb2cgJiYgcGFyYW1ldGVycy5mb2dFeHAgKSA/ICcjZGVmaW5lIEZPR19FWFAyJyA6ICcnLFxuXG5cdFx0XHRwYXJhbWV0ZXJzLm1hcCA/ICcjZGVmaW5lIFVTRV9NQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmVudk1hcCA/ICcjZGVmaW5lIFVTRV9FTlZNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmVudk1hcCA/ICcjZGVmaW5lICcgKyBlbnZNYXBUeXBlRGVmaW5lIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmVudk1hcCA/ICcjZGVmaW5lICcgKyBlbnZNYXBNb2RlRGVmaW5lIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmVudk1hcCA/ICcjZGVmaW5lICcgKyBlbnZNYXBCbGVuZGluZ0RlZmluZSA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5saWdodE1hcCA/ICcjZGVmaW5lIFVTRV9MSUdIVE1BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuYW9NYXAgPyAnI2RlZmluZSBVU0VfQU9NQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmVtaXNzaXZlTWFwID8gJyNkZWZpbmUgVVNFX0VNSVNTSVZFTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5idW1wTWFwID8gJyNkZWZpbmUgVVNFX0JVTVBNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLm5vcm1hbE1hcCA/ICcjZGVmaW5lIFVTRV9OT1JNQUxNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLnNwZWN1bGFyTWFwID8gJyNkZWZpbmUgVVNFX1NQRUNVTEFSTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5yb3VnaG5lc3NNYXAgPyAnI2RlZmluZSBVU0VfUk9VR0hORVNTTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5tZXRhbG5lc3NNYXAgPyAnI2RlZmluZSBVU0VfTUVUQUxORVNTTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5hbHBoYU1hcCA/ICcjZGVmaW5lIFVTRV9BTFBIQU1BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMudmVydGV4Q29sb3JzID8gJyNkZWZpbmUgVVNFX0NPTE9SJyA6ICcnLFxuXG5cdFx0XHRwYXJhbWV0ZXJzLmdyYWRpZW50TWFwID8gJyNkZWZpbmUgVVNFX0dSQURJRU5UTUFQJyA6ICcnLFxuXG5cdFx0XHRwYXJhbWV0ZXJzLmZsYXRTaGFkaW5nID8gJyNkZWZpbmUgRkxBVF9TSEFERUQnIDogJycsXG5cblx0XHRcdHBhcmFtZXRlcnMuZG91YmxlU2lkZWQgPyAnI2RlZmluZSBET1VCTEVfU0lERUQnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmZsaXBTaWRlZCA/ICcjZGVmaW5lIEZMSVBfU0lERUQnIDogJycsXG5cblx0XHRcdHBhcmFtZXRlcnMuc2hhZG93TWFwRW5hYmxlZCA/ICcjZGVmaW5lIFVTRV9TSEFET1dNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLnNoYWRvd01hcEVuYWJsZWQgPyAnI2RlZmluZSAnICsgc2hhZG93TWFwVHlwZURlZmluZSA6ICcnLFxuXG5cdFx0XHRwYXJhbWV0ZXJzLnByZW11bHRpcGxpZWRBbHBoYSA/ICcjZGVmaW5lIFBSRU1VTFRJUExJRURfQUxQSEEnIDogJycsXG5cblx0XHRcdHBhcmFtZXRlcnMucGh5c2ljYWxseUNvcnJlY3RMaWdodHMgPyAnI2RlZmluZSBQSFlTSUNBTExZX0NPUlJFQ1RfTElHSFRTJyA6ICcnLFxuXG5cdFx0XHRwYXJhbWV0ZXJzLmxvZ2FyaXRobWljRGVwdGhCdWZmZXIgPyAnI2RlZmluZSBVU0VfTE9HREVQVEhCVUYnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmxvZ2FyaXRobWljRGVwdGhCdWZmZXIgJiYgZXh0ZW5zaW9ucy5nZXQoICdFWFRfZnJhZ19kZXB0aCcgKSA/ICcjZGVmaW5lIFVTRV9MT0dERVBUSEJVRl9FWFQnIDogJycsXG5cblx0XHRcdHBhcmFtZXRlcnMuZW52TWFwICYmIGV4dGVuc2lvbnMuZ2V0KCAnRVhUX3NoYWRlcl90ZXh0dXJlX2xvZCcgKSA/ICcjZGVmaW5lIFRFWFRVUkVfTE9EX0VYVCcgOiAnJyxcblxuXHRcdFx0J3VuaWZvcm0gbWF0NCB2aWV3TWF0cml4OycsXG5cdFx0XHQndW5pZm9ybSB2ZWMzIGNhbWVyYVBvc2l0aW9uOycsXG5cblx0XHRcdCggcGFyYW1ldGVycy50b25lTWFwcGluZyAhPT0gTm9Ub25lTWFwcGluZyApID8gJyNkZWZpbmUgVE9ORV9NQVBQSU5HJyA6ICcnLFxuXHRcdFx0KCBwYXJhbWV0ZXJzLnRvbmVNYXBwaW5nICE9PSBOb1RvbmVNYXBwaW5nICkgPyBTaGFkZXJDaHVua1sgJ3RvbmVtYXBwaW5nX3BhcnNfZnJhZ21lbnQnIF0gOiAnJywgLy8gdGhpcyBjb2RlIGlzIHJlcXVpcmVkIGhlcmUgYmVjYXVzZSBpdCBpcyB1c2VkIGJ5IHRoZSB0b25lTWFwcGluZygpIGZ1bmN0aW9uIGRlZmluZWQgYmVsb3dcblx0XHRcdCggcGFyYW1ldGVycy50b25lTWFwcGluZyAhPT0gTm9Ub25lTWFwcGluZyApID8gZ2V0VG9uZU1hcHBpbmdGdW5jdGlvbiggJ3RvbmVNYXBwaW5nJywgcGFyYW1ldGVycy50b25lTWFwcGluZyApIDogJycsXG5cblx0XHRcdHBhcmFtZXRlcnMuZGl0aGVyaW5nID8gJyNkZWZpbmUgRElUSEVSSU5HJyA6ICcnLFxuXG5cdFx0XHQoIHBhcmFtZXRlcnMub3V0cHV0RW5jb2RpbmcgfHwgcGFyYW1ldGVycy5tYXBFbmNvZGluZyB8fCBwYXJhbWV0ZXJzLmVudk1hcEVuY29kaW5nIHx8IHBhcmFtZXRlcnMuZW1pc3NpdmVNYXBFbmNvZGluZyApID8gU2hhZGVyQ2h1bmtbICdlbmNvZGluZ3NfcGFyc19mcmFnbWVudCcgXSA6ICcnLCAvLyB0aGlzIGNvZGUgaXMgcmVxdWlyZWQgaGVyZSBiZWNhdXNlIGl0IGlzIHVzZWQgYnkgdGhlIHZhcmlvdXMgZW5jb2RpbmcvZGVjb2RpbmcgZnVuY3Rpb24gZGVmaW5lZCBiZWxvd1xuXHRcdFx0cGFyYW1ldGVycy5tYXBFbmNvZGluZyA/IGdldFRleGVsRGVjb2RpbmdGdW5jdGlvbiggJ21hcFRleGVsVG9MaW5lYXInLCBwYXJhbWV0ZXJzLm1hcEVuY29kaW5nICkgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuZW52TWFwRW5jb2RpbmcgPyBnZXRUZXhlbERlY29kaW5nRnVuY3Rpb24oICdlbnZNYXBUZXhlbFRvTGluZWFyJywgcGFyYW1ldGVycy5lbnZNYXBFbmNvZGluZyApIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmVtaXNzaXZlTWFwRW5jb2RpbmcgPyBnZXRUZXhlbERlY29kaW5nRnVuY3Rpb24oICdlbWlzc2l2ZU1hcFRleGVsVG9MaW5lYXInLCBwYXJhbWV0ZXJzLmVtaXNzaXZlTWFwRW5jb2RpbmcgKSA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5vdXRwdXRFbmNvZGluZyA/IGdldFRleGVsRW5jb2RpbmdGdW5jdGlvbiggJ2xpbmVhclRvT3V0cHV0VGV4ZWwnLCBwYXJhbWV0ZXJzLm91dHB1dEVuY29kaW5nICkgOiAnJyxcblxuXHRcdFx0cGFyYW1ldGVycy5kZXB0aFBhY2tpbmcgPyAnI2RlZmluZSBERVBUSF9QQUNLSU5HICcgKyBtYXRlcmlhbC5kZXB0aFBhY2tpbmcgOiAnJyxcblxuXHRcdFx0J1xcbidcblxuXHRcdF0uZmlsdGVyKCBmaWx0ZXJFbXB0eUxpbmUgKS5qb2luKCAnXFxuJyApO1xuXG5cdH1cblxuXHR2ZXJ0ZXhTaGFkZXIgPSBwYXJzZUluY2x1ZGVzKCB2ZXJ0ZXhTaGFkZXIgKTtcblx0dmVydGV4U2hhZGVyID0gcmVwbGFjZUxpZ2h0TnVtcyggdmVydGV4U2hhZGVyLCBwYXJhbWV0ZXJzICk7XG5cdHZlcnRleFNoYWRlciA9IHJlcGxhY2VDbGlwcGluZ1BsYW5lTnVtcyggdmVydGV4U2hhZGVyLCBwYXJhbWV0ZXJzICk7XG5cblx0ZnJhZ21lbnRTaGFkZXIgPSBwYXJzZUluY2x1ZGVzKCBmcmFnbWVudFNoYWRlciApO1xuXHRmcmFnbWVudFNoYWRlciA9IHJlcGxhY2VMaWdodE51bXMoIGZyYWdtZW50U2hhZGVyLCBwYXJhbWV0ZXJzICk7XG5cdGZyYWdtZW50U2hhZGVyID0gcmVwbGFjZUNsaXBwaW5nUGxhbmVOdW1zKCBmcmFnbWVudFNoYWRlciwgcGFyYW1ldGVycyApO1xuXG5cdHZlcnRleFNoYWRlciA9IHVucm9sbExvb3BzKCB2ZXJ0ZXhTaGFkZXIgKTtcblx0ZnJhZ21lbnRTaGFkZXIgPSB1bnJvbGxMb29wcyggZnJhZ21lbnRTaGFkZXIgKTtcblxuXHR2YXIgdmVydGV4R2xzbCA9IHByZWZpeFZlcnRleCArIHZlcnRleFNoYWRlcjtcblx0dmFyIGZyYWdtZW50R2xzbCA9IHByZWZpeEZyYWdtZW50ICsgZnJhZ21lbnRTaGFkZXI7XG5cblx0Ly8gY29uc29sZS5sb2coICcqVkVSVEVYKicsIHZlcnRleEdsc2wgKTtcblx0Ly8gY29uc29sZS5sb2coICcqRlJBR01FTlQqJywgZnJhZ21lbnRHbHNsICk7XG5cblx0dmFyIGdsVmVydGV4U2hhZGVyID0gV2ViR0xTaGFkZXIoIGdsLCBnbC5WRVJURVhfU0hBREVSLCB2ZXJ0ZXhHbHNsICk7XG5cdHZhciBnbEZyYWdtZW50U2hhZGVyID0gV2ViR0xTaGFkZXIoIGdsLCBnbC5GUkFHTUVOVF9TSEFERVIsIGZyYWdtZW50R2xzbCApO1xuXG5cdGdsLmF0dGFjaFNoYWRlciggcHJvZ3JhbSwgZ2xWZXJ0ZXhTaGFkZXIgKTtcblx0Z2wuYXR0YWNoU2hhZGVyKCBwcm9ncmFtLCBnbEZyYWdtZW50U2hhZGVyICk7XG5cblx0Ly8gRm9yY2UgYSBwYXJ0aWN1bGFyIGF0dHJpYnV0ZSB0byBpbmRleCAwLlxuXG5cdGlmICggbWF0ZXJpYWwuaW5kZXgwQXR0cmlidXRlTmFtZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0Z2wuYmluZEF0dHJpYkxvY2F0aW9uKCBwcm9ncmFtLCAwLCBtYXRlcmlhbC5pbmRleDBBdHRyaWJ1dGVOYW1lICk7XG5cblx0fSBlbHNlIGlmICggcGFyYW1ldGVycy5tb3JwaFRhcmdldHMgPT09IHRydWUgKSB7XG5cblx0XHQvLyBwcm9ncmFtcyB3aXRoIG1vcnBoVGFyZ2V0cyBkaXNwbGFjZSBwb3NpdGlvbiBvdXQgb2YgYXR0cmlidXRlIDBcblx0XHRnbC5iaW5kQXR0cmliTG9jYXRpb24oIHByb2dyYW0sIDAsICdwb3NpdGlvbicgKTtcblxuXHR9XG5cblx0Z2wubGlua1Byb2dyYW0oIHByb2dyYW0gKTtcblxuXHR2YXIgcHJvZ3JhbUxvZyA9IGdsLmdldFByb2dyYW1JbmZvTG9nKCBwcm9ncmFtICkudHJpbSgpO1xuXHR2YXIgdmVydGV4TG9nID0gZ2wuZ2V0U2hhZGVySW5mb0xvZyggZ2xWZXJ0ZXhTaGFkZXIgKS50cmltKCk7XG5cdHZhciBmcmFnbWVudExvZyA9IGdsLmdldFNoYWRlckluZm9Mb2coIGdsRnJhZ21lbnRTaGFkZXIgKS50cmltKCk7XG5cblx0dmFyIHJ1bm5hYmxlID0gdHJ1ZTtcblx0dmFyIGhhdmVEaWFnbm9zdGljcyA9IHRydWU7XG5cblx0Ly8gY29uc29sZS5sb2coICcqKlZFUlRFWCoqJywgZ2wuZ2V0RXh0ZW5zaW9uKCAnV0VCR0xfZGVidWdfc2hhZGVycycgKS5nZXRUcmFuc2xhdGVkU2hhZGVyU291cmNlKCBnbFZlcnRleFNoYWRlciApICk7XG5cdC8vIGNvbnNvbGUubG9nKCAnKipGUkFHTUVOVCoqJywgZ2wuZ2V0RXh0ZW5zaW9uKCAnV0VCR0xfZGVidWdfc2hhZGVycycgKS5nZXRUcmFuc2xhdGVkU2hhZGVyU291cmNlKCBnbEZyYWdtZW50U2hhZGVyICkgKTtcblxuXHRpZiAoIGdsLmdldFByb2dyYW1QYXJhbWV0ZXIoIHByb2dyYW0sIGdsLkxJTktfU1RBVFVTICkgPT09IGZhbHNlICkge1xuXG5cdFx0cnVubmFibGUgPSBmYWxzZTtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFByb2dyYW06IHNoYWRlciBlcnJvcjogJywgZ2wuZ2V0RXJyb3IoKSwgJ2dsLlZBTElEQVRFX1NUQVRVUycsIGdsLmdldFByb2dyYW1QYXJhbWV0ZXIoIHByb2dyYW0sIGdsLlZBTElEQVRFX1NUQVRVUyApLCAnZ2wuZ2V0UHJvZ3JhbUluZm9Mb2cnLCBwcm9ncmFtTG9nLCB2ZXJ0ZXhMb2csIGZyYWdtZW50TG9nICk7XG5cblx0fSBlbHNlIGlmICggcHJvZ3JhbUxvZyAhPT0gJycgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFByb2dyYW06IGdsLmdldFByb2dyYW1JbmZvTG9nKCknLCBwcm9ncmFtTG9nICk7XG5cblx0fSBlbHNlIGlmICggdmVydGV4TG9nID09PSAnJyB8fCBmcmFnbWVudExvZyA9PT0gJycgKSB7XG5cblx0XHRoYXZlRGlhZ25vc3RpY3MgPSBmYWxzZTtcblxuXHR9XG5cblx0aWYgKCBoYXZlRGlhZ25vc3RpY3MgKSB7XG5cblx0XHR0aGlzLmRpYWdub3N0aWNzID0ge1xuXG5cdFx0XHRydW5uYWJsZTogcnVubmFibGUsXG5cdFx0XHRtYXRlcmlhbDogbWF0ZXJpYWwsXG5cblx0XHRcdHByb2dyYW1Mb2c6IHByb2dyYW1Mb2csXG5cblx0XHRcdHZlcnRleFNoYWRlcjoge1xuXG5cdFx0XHRcdGxvZzogdmVydGV4TG9nLFxuXHRcdFx0XHRwcmVmaXg6IHByZWZpeFZlcnRleFxuXG5cdFx0XHR9LFxuXG5cdFx0XHRmcmFnbWVudFNoYWRlcjoge1xuXG5cdFx0XHRcdGxvZzogZnJhZ21lbnRMb2csXG5cdFx0XHRcdHByZWZpeDogcHJlZml4RnJhZ21lbnRcblxuXHRcdFx0fVxuXG5cdFx0fTtcblxuXHR9XG5cblx0Ly8gY2xlYW4gdXBcblxuXHRnbC5kZWxldGVTaGFkZXIoIGdsVmVydGV4U2hhZGVyICk7XG5cdGdsLmRlbGV0ZVNoYWRlciggZ2xGcmFnbWVudFNoYWRlciApO1xuXG5cdC8vIHNldCB1cCBjYWNoaW5nIGZvciB1bmlmb3JtIGxvY2F0aW9uc1xuXG5cdHZhciBjYWNoZWRVbmlmb3JtcztcblxuXHR0aGlzLmdldFVuaWZvcm1zID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0aWYgKCBjYWNoZWRVbmlmb3JtcyA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjYWNoZWRVbmlmb3JtcyA9IG5ldyBXZWJHTFVuaWZvcm1zKCBnbCwgcHJvZ3JhbSwgcmVuZGVyZXIgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBjYWNoZWRVbmlmb3JtcztcblxuXHR9O1xuXG5cdC8vIHNldCB1cCBjYWNoaW5nIGZvciBhdHRyaWJ1dGUgbG9jYXRpb25zXG5cblx0dmFyIGNhY2hlZEF0dHJpYnV0ZXM7XG5cblx0dGhpcy5nZXRBdHRyaWJ1dGVzID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0aWYgKCBjYWNoZWRBdHRyaWJ1dGVzID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNhY2hlZEF0dHJpYnV0ZXMgPSBmZXRjaEF0dHJpYnV0ZUxvY2F0aW9ucyggZ2wsIHByb2dyYW0gKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBjYWNoZWRBdHRyaWJ1dGVzO1xuXG5cdH07XG5cblx0Ly8gZnJlZSByZXNvdXJjZVxuXG5cdHRoaXMuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdGdsLmRlbGV0ZVByb2dyYW0oIHByb2dyYW0gKTtcblx0XHR0aGlzLnByb2dyYW0gPSB1bmRlZmluZWQ7XG5cblx0fTtcblxuXHQvLyBERVBSRUNBVEVEXG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIHRoaXMsIHtcblxuXHRcdHVuaWZvcm1zOiB7XG5cdFx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFByb2dyYW06IC51bmlmb3JtcyBpcyBub3cgLmdldFVuaWZvcm1zKCkuJyApO1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5nZXRVbmlmb3JtcygpO1xuXG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdGF0dHJpYnV0ZXM6IHtcblx0XHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUHJvZ3JhbTogLmF0dHJpYnV0ZXMgaXMgbm93IC5nZXRBdHRyaWJ1dGVzKCkuJyApO1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGVzKCk7XG5cblx0XHRcdH1cblx0XHR9XG5cblx0fSApO1xuXG5cblx0Ly9cblxuXHR0aGlzLm5hbWUgPSBzaGFkZXIubmFtZTtcblx0dGhpcy5pZCA9IHByb2dyYW1JZENvdW50ICsrO1xuXHR0aGlzLmNvZGUgPSBjb2RlO1xuXHR0aGlzLnVzZWRUaW1lcyA9IDE7XG5cdHRoaXMucHJvZ3JhbSA9IHByb2dyYW07XG5cdHRoaXMudmVydGV4U2hhZGVyID0gZ2xWZXJ0ZXhTaGFkZXI7XG5cdHRoaXMuZnJhZ21lbnRTaGFkZXIgPSBnbEZyYWdtZW50U2hhZGVyO1xuXG5cdHJldHVybiB0aGlzO1xuXG59XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBXZWJHTFByb2dyYW1zKCByZW5kZXJlciwgZXh0ZW5zaW9ucywgY2FwYWJpbGl0aWVzICkge1xuXG5cdHZhciBwcm9ncmFtcyA9IFtdO1xuXG5cdHZhciBzaGFkZXJJRHMgPSB7XG5cdFx0TWVzaERlcHRoTWF0ZXJpYWw6ICdkZXB0aCcsXG5cdFx0TWVzaERpc3RhbmNlTWF0ZXJpYWw6ICdkaXN0YW5jZVJHQkEnLFxuXHRcdE1lc2hOb3JtYWxNYXRlcmlhbDogJ25vcm1hbCcsXG5cdFx0TWVzaEJhc2ljTWF0ZXJpYWw6ICdiYXNpYycsXG5cdFx0TWVzaExhbWJlcnRNYXRlcmlhbDogJ2xhbWJlcnQnLFxuXHRcdE1lc2hQaG9uZ01hdGVyaWFsOiAncGhvbmcnLFxuXHRcdE1lc2hUb29uTWF0ZXJpYWw6ICdwaG9uZycsXG5cdFx0TWVzaFN0YW5kYXJkTWF0ZXJpYWw6ICdwaHlzaWNhbCcsXG5cdFx0TWVzaFBoeXNpY2FsTWF0ZXJpYWw6ICdwaHlzaWNhbCcsXG5cdFx0TGluZUJhc2ljTWF0ZXJpYWw6ICdiYXNpYycsXG5cdFx0TGluZURhc2hlZE1hdGVyaWFsOiAnZGFzaGVkJyxcblx0XHRQb2ludHNNYXRlcmlhbDogJ3BvaW50cycsXG5cdFx0U2hhZG93TWF0ZXJpYWw6ICdzaGFkb3cnXG5cdH07XG5cblx0dmFyIHBhcmFtZXRlck5hbWVzID0gW1xuXHRcdFwicHJlY2lzaW9uXCIsIFwic3VwcG9ydHNWZXJ0ZXhUZXh0dXJlc1wiLCBcIm1hcFwiLCBcIm1hcEVuY29kaW5nXCIsIFwiZW52TWFwXCIsIFwiZW52TWFwTW9kZVwiLCBcImVudk1hcEVuY29kaW5nXCIsXG5cdFx0XCJsaWdodE1hcFwiLCBcImFvTWFwXCIsIFwiZW1pc3NpdmVNYXBcIiwgXCJlbWlzc2l2ZU1hcEVuY29kaW5nXCIsIFwiYnVtcE1hcFwiLCBcIm5vcm1hbE1hcFwiLCBcImRpc3BsYWNlbWVudE1hcFwiLCBcInNwZWN1bGFyTWFwXCIsXG5cdFx0XCJyb3VnaG5lc3NNYXBcIiwgXCJtZXRhbG5lc3NNYXBcIiwgXCJncmFkaWVudE1hcFwiLFxuXHRcdFwiYWxwaGFNYXBcIiwgXCJjb21iaW5lXCIsIFwidmVydGV4Q29sb3JzXCIsIFwiZm9nXCIsIFwidXNlRm9nXCIsIFwiZm9nRXhwXCIsXG5cdFx0XCJmbGF0U2hhZGluZ1wiLCBcInNpemVBdHRlbnVhdGlvblwiLCBcImxvZ2FyaXRobWljRGVwdGhCdWZmZXJcIiwgXCJza2lubmluZ1wiLFxuXHRcdFwibWF4Qm9uZXNcIiwgXCJ1c2VWZXJ0ZXhUZXh0dXJlXCIsIFwibW9ycGhUYXJnZXRzXCIsIFwibW9ycGhOb3JtYWxzXCIsXG5cdFx0XCJtYXhNb3JwaFRhcmdldHNcIiwgXCJtYXhNb3JwaE5vcm1hbHNcIiwgXCJwcmVtdWx0aXBsaWVkQWxwaGFcIixcblx0XHRcIm51bURpckxpZ2h0c1wiLCBcIm51bVBvaW50TGlnaHRzXCIsIFwibnVtU3BvdExpZ2h0c1wiLCBcIm51bUhlbWlMaWdodHNcIiwgXCJudW1SZWN0QXJlYUxpZ2h0c1wiLFxuXHRcdFwic2hhZG93TWFwRW5hYmxlZFwiLCBcInNoYWRvd01hcFR5cGVcIiwgXCJ0b25lTWFwcGluZ1wiLCAncGh5c2ljYWxseUNvcnJlY3RMaWdodHMnLFxuXHRcdFwiYWxwaGFUZXN0XCIsIFwiZG91YmxlU2lkZWRcIiwgXCJmbGlwU2lkZWRcIiwgXCJudW1DbGlwcGluZ1BsYW5lc1wiLCBcIm51bUNsaXBJbnRlcnNlY3Rpb25cIiwgXCJkZXB0aFBhY2tpbmdcIiwgXCJkaXRoZXJpbmdcIlxuXHRdO1xuXG5cblx0ZnVuY3Rpb24gYWxsb2NhdGVCb25lcyggb2JqZWN0ICkge1xuXG5cdFx0dmFyIHNrZWxldG9uID0gb2JqZWN0LnNrZWxldG9uO1xuXHRcdHZhciBib25lcyA9IHNrZWxldG9uLmJvbmVzO1xuXG5cdFx0aWYgKCBjYXBhYmlsaXRpZXMuZmxvYXRWZXJ0ZXhUZXh0dXJlcyApIHtcblxuXHRcdFx0cmV0dXJuIDEwMjQ7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBkZWZhdWx0IGZvciB3aGVuIG9iamVjdCBpcyBub3Qgc3BlY2lmaWVkXG5cdFx0XHQvLyAoIGZvciBleGFtcGxlIHdoZW4gcHJlYnVpbGRpbmcgc2hhZGVyIHRvIGJlIHVzZWQgd2l0aCBtdWx0aXBsZSBvYmplY3RzIClcblx0XHRcdC8vXG5cdFx0XHQvLyAgLSBsZWF2ZSBzb21lIGV4dHJhIHNwYWNlIGZvciBvdGhlciB1bmlmb3Jtc1xuXHRcdFx0Ly8gIC0gbGltaXQgaGVyZSBpcyBBTkdMRSdzIDI1NCBtYXggdW5pZm9ybSB2ZWN0b3JzXG5cdFx0XHQvLyAgICAodXAgdG8gNTQgc2hvdWxkIGJlIHNhZmUpXG5cblx0XHRcdHZhciBuVmVydGV4VW5pZm9ybXMgPSBjYXBhYmlsaXRpZXMubWF4VmVydGV4VW5pZm9ybXM7XG5cdFx0XHR2YXIgblZlcnRleE1hdHJpY2VzID0gTWF0aC5mbG9vciggKCBuVmVydGV4VW5pZm9ybXMgLSAyMCApIC8gNCApO1xuXG5cdFx0XHR2YXIgbWF4Qm9uZXMgPSBNYXRoLm1pbiggblZlcnRleE1hdHJpY2VzLCBib25lcy5sZW5ndGggKTtcblxuXHRcdFx0aWYgKCBtYXhCb25lcyA8IGJvbmVzLmxlbmd0aCApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBTa2VsZXRvbiBoYXMgJyArIGJvbmVzLmxlbmd0aCArICcgYm9uZXMuIFRoaXMgR1BVIHN1cHBvcnRzICcgKyBtYXhCb25lcyArICcuJyApO1xuXHRcdFx0XHRyZXR1cm4gMDtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gbWF4Qm9uZXM7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGdldFRleHR1cmVFbmNvZGluZ0Zyb21NYXAoIG1hcCwgZ2FtbWFPdmVycmlkZUxpbmVhciApIHtcblxuXHRcdHZhciBlbmNvZGluZztcblxuXHRcdGlmICggISBtYXAgKSB7XG5cblx0XHRcdGVuY29kaW5nID0gTGluZWFyRW5jb2Rpbmc7XG5cblx0XHR9IGVsc2UgaWYgKCBtYXAuaXNUZXh0dXJlICkge1xuXG5cdFx0XHRlbmNvZGluZyA9IG1hcC5lbmNvZGluZztcblxuXHRcdH0gZWxzZSBpZiAoIG1hcC5pc1dlYkdMUmVuZGVyVGFyZ2V0ICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oIFwiVEhSRUUuV2ViR0xQcm9ncmFtcy5nZXRUZXh0dXJlRW5jb2RpbmdGcm9tTWFwOiBkb24ndCB1c2UgcmVuZGVyIHRhcmdldHMgYXMgdGV4dHVyZXMuIFVzZSB0aGVpciAudGV4dHVyZSBwcm9wZXJ0eSBpbnN0ZWFkLlwiICk7XG5cdFx0XHRlbmNvZGluZyA9IG1hcC50ZXh0dXJlLmVuY29kaW5nO1xuXG5cdFx0fVxuXG5cdFx0Ly8gYWRkIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGZvciBXZWJHTFJlbmRlcmVyLmdhbW1hSW5wdXQvZ2FtbWFPdXRwdXQgcGFyYW1ldGVyLCBzaG91bGQgcHJvYmFibHkgYmUgcmVtb3ZlZCBhdCBzb21lIHBvaW50LlxuXHRcdGlmICggZW5jb2RpbmcgPT09IExpbmVhckVuY29kaW5nICYmIGdhbW1hT3ZlcnJpZGVMaW5lYXIgKSB7XG5cblx0XHRcdGVuY29kaW5nID0gR2FtbWFFbmNvZGluZztcblxuXHRcdH1cblxuXHRcdHJldHVybiBlbmNvZGluZztcblxuXHR9XG5cblx0dGhpcy5nZXRQYXJhbWV0ZXJzID0gZnVuY3Rpb24gKCBtYXRlcmlhbCwgbGlnaHRzLCBzaGFkb3dzLCBmb2csIG5DbGlwUGxhbmVzLCBuQ2xpcEludGVyc2VjdGlvbiwgb2JqZWN0ICkge1xuXG5cdFx0dmFyIHNoYWRlcklEID0gc2hhZGVySURzWyBtYXRlcmlhbC50eXBlIF07XG5cblx0XHQvLyBoZXVyaXN0aWNzIHRvIGNyZWF0ZSBzaGFkZXIgcGFyYW1ldGVycyBhY2NvcmRpbmcgdG8gbGlnaHRzIGluIHRoZSBzY2VuZVxuXHRcdC8vIChub3QgdG8gYmxvdyBvdmVyIG1heExpZ2h0cyBidWRnZXQpXG5cblx0XHR2YXIgbWF4Qm9uZXMgPSBvYmplY3QuaXNTa2lubmVkTWVzaCA/IGFsbG9jYXRlQm9uZXMoIG9iamVjdCApIDogMDtcblx0XHR2YXIgcHJlY2lzaW9uID0gY2FwYWJpbGl0aWVzLnByZWNpc2lvbjtcblxuXHRcdGlmICggbWF0ZXJpYWwucHJlY2lzaW9uICE9PSBudWxsICkge1xuXG5cdFx0XHRwcmVjaXNpb24gPSBjYXBhYmlsaXRpZXMuZ2V0TWF4UHJlY2lzaW9uKCBtYXRlcmlhbC5wcmVjaXNpb24gKTtcblxuXHRcdFx0aWYgKCBwcmVjaXNpb24gIT09IG1hdGVyaWFsLnByZWNpc2lvbiApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFByb2dyYW0uZ2V0UGFyYW1ldGVyczonLCBtYXRlcmlhbC5wcmVjaXNpb24sICdub3Qgc3VwcG9ydGVkLCB1c2luZycsIHByZWNpc2lvbiwgJ2luc3RlYWQuJyApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHR2YXIgY3VycmVudFJlbmRlclRhcmdldCA9IHJlbmRlcmVyLmdldFJlbmRlclRhcmdldCgpO1xuXG5cdFx0dmFyIHBhcmFtZXRlcnMgPSB7XG5cblx0XHRcdHNoYWRlcklEOiBzaGFkZXJJRCxcblxuXHRcdFx0cHJlY2lzaW9uOiBwcmVjaXNpb24sXG5cdFx0XHRzdXBwb3J0c1ZlcnRleFRleHR1cmVzOiBjYXBhYmlsaXRpZXMudmVydGV4VGV4dHVyZXMsXG5cdFx0XHRvdXRwdXRFbmNvZGluZzogZ2V0VGV4dHVyZUVuY29kaW5nRnJvbU1hcCggKCAhIGN1cnJlbnRSZW5kZXJUYXJnZXQgKSA/IG51bGwgOiBjdXJyZW50UmVuZGVyVGFyZ2V0LnRleHR1cmUsIHJlbmRlcmVyLmdhbW1hT3V0cHV0ICksXG5cdFx0XHRtYXA6ICEhIG1hdGVyaWFsLm1hcCxcblx0XHRcdG1hcEVuY29kaW5nOiBnZXRUZXh0dXJlRW5jb2RpbmdGcm9tTWFwKCBtYXRlcmlhbC5tYXAsIHJlbmRlcmVyLmdhbW1hSW5wdXQgKSxcblx0XHRcdGVudk1hcDogISEgbWF0ZXJpYWwuZW52TWFwLFxuXHRcdFx0ZW52TWFwTW9kZTogbWF0ZXJpYWwuZW52TWFwICYmIG1hdGVyaWFsLmVudk1hcC5tYXBwaW5nLFxuXHRcdFx0ZW52TWFwRW5jb2Rpbmc6IGdldFRleHR1cmVFbmNvZGluZ0Zyb21NYXAoIG1hdGVyaWFsLmVudk1hcCwgcmVuZGVyZXIuZ2FtbWFJbnB1dCApLFxuXHRcdFx0ZW52TWFwQ3ViZVVWOiAoICEhIG1hdGVyaWFsLmVudk1hcCApICYmICggKCBtYXRlcmlhbC5lbnZNYXAubWFwcGluZyA9PT0gQ3ViZVVWUmVmbGVjdGlvbk1hcHBpbmcgKSB8fCAoIG1hdGVyaWFsLmVudk1hcC5tYXBwaW5nID09PSBDdWJlVVZSZWZyYWN0aW9uTWFwcGluZyApICksXG5cdFx0XHRsaWdodE1hcDogISEgbWF0ZXJpYWwubGlnaHRNYXAsXG5cdFx0XHRhb01hcDogISEgbWF0ZXJpYWwuYW9NYXAsXG5cdFx0XHRlbWlzc2l2ZU1hcDogISEgbWF0ZXJpYWwuZW1pc3NpdmVNYXAsXG5cdFx0XHRlbWlzc2l2ZU1hcEVuY29kaW5nOiBnZXRUZXh0dXJlRW5jb2RpbmdGcm9tTWFwKCBtYXRlcmlhbC5lbWlzc2l2ZU1hcCwgcmVuZGVyZXIuZ2FtbWFJbnB1dCApLFxuXHRcdFx0YnVtcE1hcDogISEgbWF0ZXJpYWwuYnVtcE1hcCxcblx0XHRcdG5vcm1hbE1hcDogISEgbWF0ZXJpYWwubm9ybWFsTWFwLFxuXHRcdFx0ZGlzcGxhY2VtZW50TWFwOiAhISBtYXRlcmlhbC5kaXNwbGFjZW1lbnRNYXAsXG5cdFx0XHRyb3VnaG5lc3NNYXA6ICEhIG1hdGVyaWFsLnJvdWdobmVzc01hcCxcblx0XHRcdG1ldGFsbmVzc01hcDogISEgbWF0ZXJpYWwubWV0YWxuZXNzTWFwLFxuXHRcdFx0c3BlY3VsYXJNYXA6ICEhIG1hdGVyaWFsLnNwZWN1bGFyTWFwLFxuXHRcdFx0YWxwaGFNYXA6ICEhIG1hdGVyaWFsLmFscGhhTWFwLFxuXG5cdFx0XHRncmFkaWVudE1hcDogISEgbWF0ZXJpYWwuZ3JhZGllbnRNYXAsXG5cblx0XHRcdGNvbWJpbmU6IG1hdGVyaWFsLmNvbWJpbmUsXG5cblx0XHRcdHZlcnRleENvbG9yczogbWF0ZXJpYWwudmVydGV4Q29sb3JzLFxuXG5cdFx0XHRmb2c6ICEhIGZvZyxcblx0XHRcdHVzZUZvZzogbWF0ZXJpYWwuZm9nLFxuXHRcdFx0Zm9nRXhwOiAoIGZvZyAmJiBmb2cuaXNGb2dFeHAyICksXG5cblx0XHRcdGZsYXRTaGFkaW5nOiBtYXRlcmlhbC5mbGF0U2hhZGluZyxcblxuXHRcdFx0c2l6ZUF0dGVudWF0aW9uOiBtYXRlcmlhbC5zaXplQXR0ZW51YXRpb24sXG5cdFx0XHRsb2dhcml0aG1pY0RlcHRoQnVmZmVyOiBjYXBhYmlsaXRpZXMubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlcixcblxuXHRcdFx0c2tpbm5pbmc6IG1hdGVyaWFsLnNraW5uaW5nICYmIG1heEJvbmVzID4gMCxcblx0XHRcdG1heEJvbmVzOiBtYXhCb25lcyxcblx0XHRcdHVzZVZlcnRleFRleHR1cmU6IGNhcGFiaWxpdGllcy5mbG9hdFZlcnRleFRleHR1cmVzLFxuXG5cdFx0XHRtb3JwaFRhcmdldHM6IG1hdGVyaWFsLm1vcnBoVGFyZ2V0cyxcblx0XHRcdG1vcnBoTm9ybWFsczogbWF0ZXJpYWwubW9ycGhOb3JtYWxzLFxuXHRcdFx0bWF4TW9ycGhUYXJnZXRzOiByZW5kZXJlci5tYXhNb3JwaFRhcmdldHMsXG5cdFx0XHRtYXhNb3JwaE5vcm1hbHM6IHJlbmRlcmVyLm1heE1vcnBoTm9ybWFscyxcblxuXHRcdFx0bnVtRGlyTGlnaHRzOiBsaWdodHMuZGlyZWN0aW9uYWwubGVuZ3RoLFxuXHRcdFx0bnVtUG9pbnRMaWdodHM6IGxpZ2h0cy5wb2ludC5sZW5ndGgsXG5cdFx0XHRudW1TcG90TGlnaHRzOiBsaWdodHMuc3BvdC5sZW5ndGgsXG5cdFx0XHRudW1SZWN0QXJlYUxpZ2h0czogbGlnaHRzLnJlY3RBcmVhLmxlbmd0aCxcblx0XHRcdG51bUhlbWlMaWdodHM6IGxpZ2h0cy5oZW1pLmxlbmd0aCxcblxuXHRcdFx0bnVtQ2xpcHBpbmdQbGFuZXM6IG5DbGlwUGxhbmVzLFxuXHRcdFx0bnVtQ2xpcEludGVyc2VjdGlvbjogbkNsaXBJbnRlcnNlY3Rpb24sXG5cblx0XHRcdGRpdGhlcmluZzogbWF0ZXJpYWwuZGl0aGVyaW5nLFxuXG5cdFx0XHRzaGFkb3dNYXBFbmFibGVkOiByZW5kZXJlci5zaGFkb3dNYXAuZW5hYmxlZCAmJiBvYmplY3QucmVjZWl2ZVNoYWRvdyAmJiBzaGFkb3dzLmxlbmd0aCA+IDAsXG5cdFx0XHRzaGFkb3dNYXBUeXBlOiByZW5kZXJlci5zaGFkb3dNYXAudHlwZSxcblxuXHRcdFx0dG9uZU1hcHBpbmc6IHJlbmRlcmVyLnRvbmVNYXBwaW5nLFxuXHRcdFx0cGh5c2ljYWxseUNvcnJlY3RMaWdodHM6IHJlbmRlcmVyLnBoeXNpY2FsbHlDb3JyZWN0TGlnaHRzLFxuXG5cdFx0XHRwcmVtdWx0aXBsaWVkQWxwaGE6IG1hdGVyaWFsLnByZW11bHRpcGxpZWRBbHBoYSxcblxuXHRcdFx0YWxwaGFUZXN0OiBtYXRlcmlhbC5hbHBoYVRlc3QsXG5cdFx0XHRkb3VibGVTaWRlZDogbWF0ZXJpYWwuc2lkZSA9PT0gRG91YmxlU2lkZSxcblx0XHRcdGZsaXBTaWRlZDogbWF0ZXJpYWwuc2lkZSA9PT0gQmFja1NpZGUsXG5cblx0XHRcdGRlcHRoUGFja2luZzogKCBtYXRlcmlhbC5kZXB0aFBhY2tpbmcgIT09IHVuZGVmaW5lZCApID8gbWF0ZXJpYWwuZGVwdGhQYWNraW5nIDogZmFsc2VcblxuXHRcdH07XG5cblx0XHRyZXR1cm4gcGFyYW1ldGVycztcblxuXHR9O1xuXG5cdHRoaXMuZ2V0UHJvZ3JhbUNvZGUgPSBmdW5jdGlvbiAoIG1hdGVyaWFsLCBwYXJhbWV0ZXJzICkge1xuXG5cdFx0dmFyIGFycmF5ID0gW107XG5cblx0XHRpZiAoIHBhcmFtZXRlcnMuc2hhZGVySUQgKSB7XG5cblx0XHRcdGFycmF5LnB1c2goIHBhcmFtZXRlcnMuc2hhZGVySUQgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGFycmF5LnB1c2goIG1hdGVyaWFsLmZyYWdtZW50U2hhZGVyICk7XG5cdFx0XHRhcnJheS5wdXNoKCBtYXRlcmlhbC52ZXJ0ZXhTaGFkZXIgKTtcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwuZGVmaW5lcyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRmb3IgKCB2YXIgbmFtZSBpbiBtYXRlcmlhbC5kZWZpbmVzICkge1xuXG5cdFx0XHRcdGFycmF5LnB1c2goIG5hbWUgKTtcblx0XHRcdFx0YXJyYXkucHVzaCggbWF0ZXJpYWwuZGVmaW5lc1sgbmFtZSBdICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IHBhcmFtZXRlck5hbWVzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0YXJyYXkucHVzaCggcGFyYW1ldGVyc1sgcGFyYW1ldGVyTmFtZXNbIGkgXSBdICk7XG5cblx0XHR9XG5cblx0XHRhcnJheS5wdXNoKCBtYXRlcmlhbC5vbkJlZm9yZUNvbXBpbGUudG9TdHJpbmcoKSApO1xuXG5cdFx0YXJyYXkucHVzaCggcmVuZGVyZXIuZ2FtbWFPdXRwdXQgKTtcblxuXHRcdHJldHVybiBhcnJheS5qb2luKCk7XG5cblx0fTtcblxuXHR0aGlzLmFjcXVpcmVQcm9ncmFtID0gZnVuY3Rpb24gKCBtYXRlcmlhbCwgc2hhZGVyLCBwYXJhbWV0ZXJzLCBjb2RlICkge1xuXG5cdFx0dmFyIHByb2dyYW07XG5cblx0XHQvLyBDaGVjayBpZiBjb2RlIGhhcyBiZWVuIGFscmVhZHkgY29tcGlsZWRcblx0XHRmb3IgKCB2YXIgcCA9IDAsIHBsID0gcHJvZ3JhbXMubGVuZ3RoOyBwIDwgcGw7IHAgKysgKSB7XG5cblx0XHRcdHZhciBwcm9ncmFtSW5mbyA9IHByb2dyYW1zWyBwIF07XG5cblx0XHRcdGlmICggcHJvZ3JhbUluZm8uY29kZSA9PT0gY29kZSApIHtcblxuXHRcdFx0XHRwcm9ncmFtID0gcHJvZ3JhbUluZm87XG5cdFx0XHRcdCsrIHByb2dyYW0udXNlZFRpbWVzO1xuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIHByb2dyYW0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0cHJvZ3JhbSA9IG5ldyBXZWJHTFByb2dyYW0oIHJlbmRlcmVyLCBleHRlbnNpb25zLCBjb2RlLCBtYXRlcmlhbCwgc2hhZGVyLCBwYXJhbWV0ZXJzICk7XG5cdFx0XHRwcm9ncmFtcy5wdXNoKCBwcm9ncmFtICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gcHJvZ3JhbTtcblxuXHR9O1xuXG5cdHRoaXMucmVsZWFzZVByb2dyYW0gPSBmdW5jdGlvbiAoIHByb2dyYW0gKSB7XG5cblx0XHRpZiAoIC0tIHByb2dyYW0udXNlZFRpbWVzID09PSAwICkge1xuXG5cdFx0XHQvLyBSZW1vdmUgZnJvbSB1bm9yZGVyZWQgc2V0XG5cdFx0XHR2YXIgaSA9IHByb2dyYW1zLmluZGV4T2YoIHByb2dyYW0gKTtcblx0XHRcdHByb2dyYW1zWyBpIF0gPSBwcm9ncmFtc1sgcHJvZ3JhbXMubGVuZ3RoIC0gMSBdO1xuXHRcdFx0cHJvZ3JhbXMucG9wKCk7XG5cblx0XHRcdC8vIEZyZWUgV2ViR0wgcmVzb3VyY2VzXG5cdFx0XHRwcm9ncmFtLmRlc3Ryb3koKTtcblxuXHRcdH1cblxuXHR9O1xuXG5cdC8vIEV4cG9zZWQgZm9yIHJlc291cmNlIG1vbml0b3JpbmcgJiBlcnJvciBmZWVkYmFjayB2aWEgcmVuZGVyZXIuaW5mbzpcblx0dGhpcy5wcm9ncmFtcyA9IHByb2dyYW1zO1xuXG59XG5cbi8qKlxuICogQGF1dGhvciBmb3JkYWNpb3VzIC8gZm9yZGFjaW91cy5naXRodWIuaW9cbiAqL1xuXG5mdW5jdGlvbiBXZWJHTFByb3BlcnRpZXMoKSB7XG5cblx0dmFyIHByb3BlcnRpZXMgPSBuZXcgV2Vha01hcCgpO1xuXG5cdGZ1bmN0aW9uIGdldCggb2JqZWN0ICkge1xuXG5cdFx0dmFyIG1hcCA9IHByb3BlcnRpZXMuZ2V0KCBvYmplY3QgKTtcblxuXHRcdGlmICggbWFwID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdG1hcCA9IHt9O1xuXHRcdFx0cHJvcGVydGllcy5zZXQoIG9iamVjdCwgbWFwICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gbWFwO1xuXG5cdH1cblxuXHRmdW5jdGlvbiByZW1vdmUoIG9iamVjdCApIHtcblxuXHRcdHByb3BlcnRpZXMuZGVsZXRlKCBvYmplY3QgKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gdXBkYXRlKCBvYmplY3QsIGtleSwgdmFsdWUgKSB7XG5cblx0XHRwcm9wZXJ0aWVzLmdldCggb2JqZWN0IClbIGtleSBdID0gdmFsdWU7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGRpc3Bvc2UoKSB7XG5cblx0XHRwcm9wZXJ0aWVzID0gbmV3IFdlYWtNYXAoKTtcblxuXHR9XG5cblx0cmV0dXJuIHtcblx0XHRnZXQ6IGdldCxcblx0XHRyZW1vdmU6IHJlbW92ZSxcblx0XHR1cGRhdGU6IHVwZGF0ZSxcblx0XHRkaXNwb3NlOiBkaXNwb3NlXG5cdH07XG5cbn1cblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIHBhaW50ZXJTb3J0U3RhYmxlKCBhLCBiICkge1xuXG5cdGlmICggYS5yZW5kZXJPcmRlciAhPT0gYi5yZW5kZXJPcmRlciApIHtcblxuXHRcdHJldHVybiBhLnJlbmRlck9yZGVyIC0gYi5yZW5kZXJPcmRlcjtcblxuXHR9IGVsc2UgaWYgKCBhLnByb2dyYW0gJiYgYi5wcm9ncmFtICYmIGEucHJvZ3JhbSAhPT0gYi5wcm9ncmFtICkge1xuXG5cdFx0cmV0dXJuIGEucHJvZ3JhbS5pZCAtIGIucHJvZ3JhbS5pZDtcblxuXHR9IGVsc2UgaWYgKCBhLm1hdGVyaWFsLmlkICE9PSBiLm1hdGVyaWFsLmlkICkge1xuXG5cdFx0cmV0dXJuIGEubWF0ZXJpYWwuaWQgLSBiLm1hdGVyaWFsLmlkO1xuXG5cdH0gZWxzZSBpZiAoIGEueiAhPT0gYi56ICkge1xuXG5cdFx0cmV0dXJuIGEueiAtIGIuejtcblxuXHR9IGVsc2Uge1xuXG5cdFx0cmV0dXJuIGEuaWQgLSBiLmlkO1xuXG5cdH1cblxufVxuXG5mdW5jdGlvbiByZXZlcnNlUGFpbnRlclNvcnRTdGFibGUoIGEsIGIgKSB7XG5cblx0aWYgKCBhLnJlbmRlck9yZGVyICE9PSBiLnJlbmRlck9yZGVyICkge1xuXG5cdFx0cmV0dXJuIGEucmVuZGVyT3JkZXIgLSBiLnJlbmRlck9yZGVyO1xuXG5cdH0gaWYgKCBhLnogIT09IGIueiApIHtcblxuXHRcdHJldHVybiBiLnogLSBhLno7XG5cblx0fSBlbHNlIHtcblxuXHRcdHJldHVybiBhLmlkIC0gYi5pZDtcblxuXHR9XG5cbn1cblxuZnVuY3Rpb24gV2ViR0xSZW5kZXJMaXN0KCkge1xuXG5cdHZhciByZW5kZXJJdGVtcyA9IFtdO1xuXHR2YXIgcmVuZGVySXRlbXNJbmRleCA9IDA7XG5cblx0dmFyIG9wYXF1ZSA9IFtdO1xuXHR2YXIgdHJhbnNwYXJlbnQgPSBbXTtcblxuXHRmdW5jdGlvbiBpbml0KCkge1xuXG5cdFx0cmVuZGVySXRlbXNJbmRleCA9IDA7XG5cblx0XHRvcGFxdWUubGVuZ3RoID0gMDtcblx0XHR0cmFuc3BhcmVudC5sZW5ndGggPSAwO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBwdXNoKCBvYmplY3QsIGdlb21ldHJ5LCBtYXRlcmlhbCwgeiwgZ3JvdXAgKSB7XG5cblx0XHR2YXIgcmVuZGVySXRlbSA9IHJlbmRlckl0ZW1zWyByZW5kZXJJdGVtc0luZGV4IF07XG5cblx0XHRpZiAoIHJlbmRlckl0ZW0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0cmVuZGVySXRlbSA9IHtcblx0XHRcdFx0aWQ6IG9iamVjdC5pZCxcblx0XHRcdFx0b2JqZWN0OiBvYmplY3QsXG5cdFx0XHRcdGdlb21ldHJ5OiBnZW9tZXRyeSxcblx0XHRcdFx0bWF0ZXJpYWw6IG1hdGVyaWFsLFxuXHRcdFx0XHRwcm9ncmFtOiBtYXRlcmlhbC5wcm9ncmFtLFxuXHRcdFx0XHRyZW5kZXJPcmRlcjogb2JqZWN0LnJlbmRlck9yZGVyLFxuXHRcdFx0XHR6OiB6LFxuXHRcdFx0XHRncm91cDogZ3JvdXBcblx0XHRcdH07XG5cblx0XHRcdHJlbmRlckl0ZW1zWyByZW5kZXJJdGVtc0luZGV4IF0gPSByZW5kZXJJdGVtO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0cmVuZGVySXRlbS5pZCA9IG9iamVjdC5pZDtcblx0XHRcdHJlbmRlckl0ZW0ub2JqZWN0ID0gb2JqZWN0O1xuXHRcdFx0cmVuZGVySXRlbS5nZW9tZXRyeSA9IGdlb21ldHJ5O1xuXHRcdFx0cmVuZGVySXRlbS5tYXRlcmlhbCA9IG1hdGVyaWFsO1xuXHRcdFx0cmVuZGVySXRlbS5wcm9ncmFtID0gbWF0ZXJpYWwucHJvZ3JhbTtcblx0XHRcdHJlbmRlckl0ZW0ucmVuZGVyT3JkZXIgPSBvYmplY3QucmVuZGVyT3JkZXI7XG5cdFx0XHRyZW5kZXJJdGVtLnogPSB6O1xuXHRcdFx0cmVuZGVySXRlbS5ncm91cCA9IGdyb3VwO1xuXG5cdFx0fVxuXG5cdFx0KCBtYXRlcmlhbC50cmFuc3BhcmVudCA9PT0gdHJ1ZSA/IHRyYW5zcGFyZW50IDogb3BhcXVlICkucHVzaCggcmVuZGVySXRlbSApO1xuXG5cdFx0cmVuZGVySXRlbXNJbmRleCArKztcblxuXHR9XG5cblx0ZnVuY3Rpb24gc29ydCgpIHtcblxuXHRcdGlmICggb3BhcXVlLmxlbmd0aCA+IDEgKSBvcGFxdWUuc29ydCggcGFpbnRlclNvcnRTdGFibGUgKTtcblx0XHRpZiAoIHRyYW5zcGFyZW50Lmxlbmd0aCA+IDEgKSB0cmFuc3BhcmVudC5zb3J0KCByZXZlcnNlUGFpbnRlclNvcnRTdGFibGUgKTtcblxuXHR9XG5cblx0cmV0dXJuIHtcblx0XHRvcGFxdWU6IG9wYXF1ZSxcblx0XHR0cmFuc3BhcmVudDogdHJhbnNwYXJlbnQsXG5cblx0XHRpbml0OiBpbml0LFxuXHRcdHB1c2g6IHB1c2gsXG5cblx0XHRzb3J0OiBzb3J0XG5cdH07XG5cbn1cblxuZnVuY3Rpb24gV2ViR0xSZW5kZXJMaXN0cygpIHtcblxuXHR2YXIgbGlzdHMgPSB7fTtcblxuXHRmdW5jdGlvbiBnZXQoIHNjZW5lLCBjYW1lcmEgKSB7XG5cblx0XHR2YXIgaGFzaCA9IHNjZW5lLmlkICsgJywnICsgY2FtZXJhLmlkO1xuXHRcdHZhciBsaXN0ID0gbGlzdHNbIGhhc2ggXTtcblxuXHRcdGlmICggbGlzdCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHQvLyBjb25zb2xlLmxvZyggJ1RIUkVFLldlYkdMUmVuZGVyTGlzdHM6JywgaGFzaCApO1xuXG5cdFx0XHRsaXN0ID0gbmV3IFdlYkdMUmVuZGVyTGlzdCgpO1xuXHRcdFx0bGlzdHNbIGhhc2ggXSA9IGxpc3Q7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gbGlzdDtcblxuXHR9XG5cblx0ZnVuY3Rpb24gZGlzcG9zZSgpIHtcblxuXHRcdGxpc3RzID0ge307XG5cblx0fVxuXG5cdHJldHVybiB7XG5cdFx0Z2V0OiBnZXQsXG5cdFx0ZGlzcG9zZTogZGlzcG9zZVxuXHR9O1xuXG59XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBVbmlmb3Jtc0NhY2hlKCkge1xuXG5cdHZhciBsaWdodHMgPSB7fTtcblxuXHRyZXR1cm4ge1xuXG5cdFx0Z2V0OiBmdW5jdGlvbiAoIGxpZ2h0ICkge1xuXG5cdFx0XHRpZiAoIGxpZ2h0c1sgbGlnaHQuaWQgXSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHJldHVybiBsaWdodHNbIGxpZ2h0LmlkIF07XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIHVuaWZvcm1zO1xuXG5cdFx0XHRzd2l0Y2ggKCBsaWdodC50eXBlICkge1xuXG5cdFx0XHRcdGNhc2UgJ0RpcmVjdGlvbmFsTGlnaHQnOlxuXHRcdFx0XHRcdHVuaWZvcm1zID0ge1xuXHRcdFx0XHRcdFx0ZGlyZWN0aW9uOiBuZXcgVmVjdG9yMygpLFxuXHRcdFx0XHRcdFx0Y29sb3I6IG5ldyBDb2xvcigpLFxuXG5cdFx0XHRcdFx0XHRzaGFkb3c6IGZhbHNlLFxuXHRcdFx0XHRcdFx0c2hhZG93QmlhczogMCxcblx0XHRcdFx0XHRcdHNoYWRvd1JhZGl1czogMSxcblx0XHRcdFx0XHRcdHNoYWRvd01hcFNpemU6IG5ldyBWZWN0b3IyKClcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgJ1Nwb3RMaWdodCc6XG5cdFx0XHRcdFx0dW5pZm9ybXMgPSB7XG5cdFx0XHRcdFx0XHRwb3NpdGlvbjogbmV3IFZlY3RvcjMoKSxcblx0XHRcdFx0XHRcdGRpcmVjdGlvbjogbmV3IFZlY3RvcjMoKSxcblx0XHRcdFx0XHRcdGNvbG9yOiBuZXcgQ29sb3IoKSxcblx0XHRcdFx0XHRcdGRpc3RhbmNlOiAwLFxuXHRcdFx0XHRcdFx0Y29uZUNvczogMCxcblx0XHRcdFx0XHRcdHBlbnVtYnJhQ29zOiAwLFxuXHRcdFx0XHRcdFx0ZGVjYXk6IDAsXG5cblx0XHRcdFx0XHRcdHNoYWRvdzogZmFsc2UsXG5cdFx0XHRcdFx0XHRzaGFkb3dCaWFzOiAwLFxuXHRcdFx0XHRcdFx0c2hhZG93UmFkaXVzOiAxLFxuXHRcdFx0XHRcdFx0c2hhZG93TWFwU2l6ZTogbmV3IFZlY3RvcjIoKVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSAnUG9pbnRMaWdodCc6XG5cdFx0XHRcdFx0dW5pZm9ybXMgPSB7XG5cdFx0XHRcdFx0XHRwb3NpdGlvbjogbmV3IFZlY3RvcjMoKSxcblx0XHRcdFx0XHRcdGNvbG9yOiBuZXcgQ29sb3IoKSxcblx0XHRcdFx0XHRcdGRpc3RhbmNlOiAwLFxuXHRcdFx0XHRcdFx0ZGVjYXk6IDAsXG5cblx0XHRcdFx0XHRcdHNoYWRvdzogZmFsc2UsXG5cdFx0XHRcdFx0XHRzaGFkb3dCaWFzOiAwLFxuXHRcdFx0XHRcdFx0c2hhZG93UmFkaXVzOiAxLFxuXHRcdFx0XHRcdFx0c2hhZG93TWFwU2l6ZTogbmV3IFZlY3RvcjIoKSxcblx0XHRcdFx0XHRcdHNoYWRvd0NhbWVyYU5lYXI6IDEsXG5cdFx0XHRcdFx0XHRzaGFkb3dDYW1lcmFGYXI6IDEwMDBcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgJ0hlbWlzcGhlcmVMaWdodCc6XG5cdFx0XHRcdFx0dW5pZm9ybXMgPSB7XG5cdFx0XHRcdFx0XHRkaXJlY3Rpb246IG5ldyBWZWN0b3IzKCksXG5cdFx0XHRcdFx0XHRza3lDb2xvcjogbmV3IENvbG9yKCksXG5cdFx0XHRcdFx0XHRncm91bmRDb2xvcjogbmV3IENvbG9yKClcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgJ1JlY3RBcmVhTGlnaHQnOlxuXHRcdFx0XHRcdHVuaWZvcm1zID0ge1xuXHRcdFx0XHRcdFx0Y29sb3I6IG5ldyBDb2xvcigpLFxuXHRcdFx0XHRcdFx0cG9zaXRpb246IG5ldyBWZWN0b3IzKCksXG5cdFx0XHRcdFx0XHRoYWxmV2lkdGg6IG5ldyBWZWN0b3IzKCksXG5cdFx0XHRcdFx0XHRoYWxmSGVpZ2h0OiBuZXcgVmVjdG9yMygpXG5cdFx0XHRcdFx0XHQvLyBUT0RPIChhYmVsbmF0aW9uKTogc2V0IFJlY3RBcmVhTGlnaHQgc2hhZG93IHVuaWZvcm1zXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0fVxuXG5cdFx0XHRsaWdodHNbIGxpZ2h0LmlkIF0gPSB1bmlmb3JtcztcblxuXHRcdFx0cmV0dXJuIHVuaWZvcm1zO1xuXG5cdFx0fVxuXG5cdH07XG5cbn1cblxudmFyIGNvdW50ID0gMDtcblxuZnVuY3Rpb24gV2ViR0xMaWdodHMoKSB7XG5cblx0dmFyIGNhY2hlID0gbmV3IFVuaWZvcm1zQ2FjaGUoKTtcblxuXHR2YXIgc3RhdGUgPSB7XG5cblx0XHRpZDogY291bnQgKyssXG5cblx0XHRoYXNoOiAnJyxcblxuXHRcdGFtYmllbnQ6IFsgMCwgMCwgMCBdLFxuXHRcdGRpcmVjdGlvbmFsOiBbXSxcblx0XHRkaXJlY3Rpb25hbFNoYWRvd01hcDogW10sXG5cdFx0ZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXg6IFtdLFxuXHRcdHNwb3Q6IFtdLFxuXHRcdHNwb3RTaGFkb3dNYXA6IFtdLFxuXHRcdHNwb3RTaGFkb3dNYXRyaXg6IFtdLFxuXHRcdHJlY3RBcmVhOiBbXSxcblx0XHRwb2ludDogW10sXG5cdFx0cG9pbnRTaGFkb3dNYXA6IFtdLFxuXHRcdHBvaW50U2hhZG93TWF0cml4OiBbXSxcblx0XHRoZW1pOiBbXVxuXG5cdH07XG5cblx0dmFyIHZlY3RvcjMgPSBuZXcgVmVjdG9yMygpO1xuXHR2YXIgbWF0cml4NCA9IG5ldyBNYXRyaXg0KCk7XG5cdHZhciBtYXRyaXg0MiA9IG5ldyBNYXRyaXg0KCk7XG5cblx0ZnVuY3Rpb24gc2V0dXAoIGxpZ2h0cywgc2hhZG93cywgY2FtZXJhICkge1xuXG5cdFx0dmFyIHIgPSAwLCBnID0gMCwgYiA9IDA7XG5cblx0XHR2YXIgZGlyZWN0aW9uYWxMZW5ndGggPSAwO1xuXHRcdHZhciBwb2ludExlbmd0aCA9IDA7XG5cdFx0dmFyIHNwb3RMZW5ndGggPSAwO1xuXHRcdHZhciByZWN0QXJlYUxlbmd0aCA9IDA7XG5cdFx0dmFyIGhlbWlMZW5ndGggPSAwO1xuXG5cdFx0dmFyIHZpZXdNYXRyaXggPSBjYW1lcmEubWF0cml4V29ybGRJbnZlcnNlO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gbGlnaHRzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBsaWdodCA9IGxpZ2h0c1sgaSBdO1xuXG5cdFx0XHR2YXIgY29sb3IgPSBsaWdodC5jb2xvcjtcblx0XHRcdHZhciBpbnRlbnNpdHkgPSBsaWdodC5pbnRlbnNpdHk7XG5cdFx0XHR2YXIgZGlzdGFuY2UgPSBsaWdodC5kaXN0YW5jZTtcblxuXHRcdFx0dmFyIHNoYWRvd01hcCA9ICggbGlnaHQuc2hhZG93ICYmIGxpZ2h0LnNoYWRvdy5tYXAgKSA/IGxpZ2h0LnNoYWRvdy5tYXAudGV4dHVyZSA6IG51bGw7XG5cblx0XHRcdGlmICggbGlnaHQuaXNBbWJpZW50TGlnaHQgKSB7XG5cblx0XHRcdFx0ciArPSBjb2xvci5yICogaW50ZW5zaXR5O1xuXHRcdFx0XHRnICs9IGNvbG9yLmcgKiBpbnRlbnNpdHk7XG5cdFx0XHRcdGIgKz0gY29sb3IuYiAqIGludGVuc2l0eTtcblxuXHRcdFx0fSBlbHNlIGlmICggbGlnaHQuaXNEaXJlY3Rpb25hbExpZ2h0ICkge1xuXG5cdFx0XHRcdHZhciB1bmlmb3JtcyA9IGNhY2hlLmdldCggbGlnaHQgKTtcblxuXHRcdFx0XHR1bmlmb3Jtcy5jb2xvci5jb3B5KCBsaWdodC5jb2xvciApLm11bHRpcGx5U2NhbGFyKCBsaWdodC5pbnRlbnNpdHkgKTtcblx0XHRcdFx0dW5pZm9ybXMuZGlyZWN0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbiggbGlnaHQubWF0cml4V29ybGQgKTtcblx0XHRcdFx0dmVjdG9yMy5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGxpZ2h0LnRhcmdldC5tYXRyaXhXb3JsZCApO1xuXHRcdFx0XHR1bmlmb3Jtcy5kaXJlY3Rpb24uc3ViKCB2ZWN0b3IzICk7XG5cdFx0XHRcdHVuaWZvcm1zLmRpcmVjdGlvbi50cmFuc2Zvcm1EaXJlY3Rpb24oIHZpZXdNYXRyaXggKTtcblxuXHRcdFx0XHR1bmlmb3Jtcy5zaGFkb3cgPSBsaWdodC5jYXN0U2hhZG93O1xuXG5cdFx0XHRcdGlmICggbGlnaHQuY2FzdFNoYWRvdyApIHtcblxuXHRcdFx0XHRcdHZhciBzaGFkb3cgPSBsaWdodC5zaGFkb3c7XG5cblx0XHRcdFx0XHR1bmlmb3Jtcy5zaGFkb3dCaWFzID0gc2hhZG93LmJpYXM7XG5cdFx0XHRcdFx0dW5pZm9ybXMuc2hhZG93UmFkaXVzID0gc2hhZG93LnJhZGl1cztcblx0XHRcdFx0XHR1bmlmb3Jtcy5zaGFkb3dNYXBTaXplID0gc2hhZG93Lm1hcFNpemU7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHN0YXRlLmRpcmVjdGlvbmFsU2hhZG93TWFwWyBkaXJlY3Rpb25hbExlbmd0aCBdID0gc2hhZG93TWFwO1xuXHRcdFx0XHRzdGF0ZS5kaXJlY3Rpb25hbFNoYWRvd01hdHJpeFsgZGlyZWN0aW9uYWxMZW5ndGggXSA9IGxpZ2h0LnNoYWRvdy5tYXRyaXg7XG5cdFx0XHRcdHN0YXRlLmRpcmVjdGlvbmFsWyBkaXJlY3Rpb25hbExlbmd0aCBdID0gdW5pZm9ybXM7XG5cblx0XHRcdFx0ZGlyZWN0aW9uYWxMZW5ndGggKys7XG5cblx0XHRcdH0gZWxzZSBpZiAoIGxpZ2h0LmlzU3BvdExpZ2h0ICkge1xuXG5cdFx0XHRcdHZhciB1bmlmb3JtcyA9IGNhY2hlLmdldCggbGlnaHQgKTtcblxuXHRcdFx0XHR1bmlmb3Jtcy5wb3NpdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGxpZ2h0Lm1hdHJpeFdvcmxkICk7XG5cdFx0XHRcdHVuaWZvcm1zLnBvc2l0aW9uLmFwcGx5TWF0cml4NCggdmlld01hdHJpeCApO1xuXG5cdFx0XHRcdHVuaWZvcm1zLmNvbG9yLmNvcHkoIGNvbG9yICkubXVsdGlwbHlTY2FsYXIoIGludGVuc2l0eSApO1xuXHRcdFx0XHR1bmlmb3Jtcy5kaXN0YW5jZSA9IGRpc3RhbmNlO1xuXG5cdFx0XHRcdHVuaWZvcm1zLmRpcmVjdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGxpZ2h0Lm1hdHJpeFdvcmxkICk7XG5cdFx0XHRcdHZlY3RvcjMuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBsaWdodC50YXJnZXQubWF0cml4V29ybGQgKTtcblx0XHRcdFx0dW5pZm9ybXMuZGlyZWN0aW9uLnN1YiggdmVjdG9yMyApO1xuXHRcdFx0XHR1bmlmb3Jtcy5kaXJlY3Rpb24udHJhbnNmb3JtRGlyZWN0aW9uKCB2aWV3TWF0cml4ICk7XG5cblx0XHRcdFx0dW5pZm9ybXMuY29uZUNvcyA9IE1hdGguY29zKCBsaWdodC5hbmdsZSApO1xuXHRcdFx0XHR1bmlmb3Jtcy5wZW51bWJyYUNvcyA9IE1hdGguY29zKCBsaWdodC5hbmdsZSAqICggMSAtIGxpZ2h0LnBlbnVtYnJhICkgKTtcblx0XHRcdFx0dW5pZm9ybXMuZGVjYXkgPSAoIGxpZ2h0LmRpc3RhbmNlID09PSAwICkgPyAwLjAgOiBsaWdodC5kZWNheTtcblxuXHRcdFx0XHR1bmlmb3Jtcy5zaGFkb3cgPSBsaWdodC5jYXN0U2hhZG93O1xuXG5cdFx0XHRcdGlmICggbGlnaHQuY2FzdFNoYWRvdyApIHtcblxuXHRcdFx0XHRcdHZhciBzaGFkb3cgPSBsaWdodC5zaGFkb3c7XG5cblx0XHRcdFx0XHR1bmlmb3Jtcy5zaGFkb3dCaWFzID0gc2hhZG93LmJpYXM7XG5cdFx0XHRcdFx0dW5pZm9ybXMuc2hhZG93UmFkaXVzID0gc2hhZG93LnJhZGl1cztcblx0XHRcdFx0XHR1bmlmb3Jtcy5zaGFkb3dNYXBTaXplID0gc2hhZG93Lm1hcFNpemU7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHN0YXRlLnNwb3RTaGFkb3dNYXBbIHNwb3RMZW5ndGggXSA9IHNoYWRvd01hcDtcblx0XHRcdFx0c3RhdGUuc3BvdFNoYWRvd01hdHJpeFsgc3BvdExlbmd0aCBdID0gbGlnaHQuc2hhZG93Lm1hdHJpeDtcblx0XHRcdFx0c3RhdGUuc3BvdFsgc3BvdExlbmd0aCBdID0gdW5pZm9ybXM7XG5cblx0XHRcdFx0c3BvdExlbmd0aCArKztcblxuXHRcdFx0fSBlbHNlIGlmICggbGlnaHQuaXNSZWN0QXJlYUxpZ2h0ICkge1xuXG5cdFx0XHRcdHZhciB1bmlmb3JtcyA9IGNhY2hlLmdldCggbGlnaHQgKTtcblxuXHRcdFx0XHQvLyAoYSkgaW50ZW5zaXR5IGlzIHRoZSB0b3RhbCB2aXNpYmxlIGxpZ2h0IGVtaXR0ZWRcblx0XHRcdFx0Ly91bmlmb3Jtcy5jb2xvci5jb3B5KCBjb2xvciApLm11bHRpcGx5U2NhbGFyKCBpbnRlbnNpdHkgLyAoIGxpZ2h0LndpZHRoICogbGlnaHQuaGVpZ2h0ICogTWF0aC5QSSApICk7XG5cblx0XHRcdFx0Ly8gKGIpIGludGVuc2l0eSBpcyB0aGUgYnJpZ2h0bmVzcyBvZiB0aGUgbGlnaHRcblx0XHRcdFx0dW5pZm9ybXMuY29sb3IuY29weSggY29sb3IgKS5tdWx0aXBseVNjYWxhciggaW50ZW5zaXR5ICk7XG5cblx0XHRcdFx0dW5pZm9ybXMucG9zaXRpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBsaWdodC5tYXRyaXhXb3JsZCApO1xuXHRcdFx0XHR1bmlmb3Jtcy5wb3NpdGlvbi5hcHBseU1hdHJpeDQoIHZpZXdNYXRyaXggKTtcblxuXHRcdFx0XHQvLyBleHRyYWN0IGxvY2FsIHJvdGF0aW9uIG9mIGxpZ2h0IHRvIGRlcml2ZSB3aWR0aC9oZWlnaHQgaGFsZiB2ZWN0b3JzXG5cdFx0XHRcdG1hdHJpeDQyLmlkZW50aXR5KCk7XG5cdFx0XHRcdG1hdHJpeDQuY29weSggbGlnaHQubWF0cml4V29ybGQgKTtcblx0XHRcdFx0bWF0cml4NC5wcmVtdWx0aXBseSggdmlld01hdHJpeCApO1xuXHRcdFx0XHRtYXRyaXg0Mi5leHRyYWN0Um90YXRpb24oIG1hdHJpeDQgKTtcblxuXHRcdFx0XHR1bmlmb3Jtcy5oYWxmV2lkdGguc2V0KCBsaWdodC53aWR0aCAqIDAuNSwgMC4wLCAwLjAgKTtcblx0XHRcdFx0dW5pZm9ybXMuaGFsZkhlaWdodC5zZXQoIDAuMCwgbGlnaHQuaGVpZ2h0ICogMC41LCAwLjAgKTtcblxuXHRcdFx0XHR1bmlmb3Jtcy5oYWxmV2lkdGguYXBwbHlNYXRyaXg0KCBtYXRyaXg0MiApO1xuXHRcdFx0XHR1bmlmb3Jtcy5oYWxmSGVpZ2h0LmFwcGx5TWF0cml4NCggbWF0cml4NDIgKTtcblxuXHRcdFx0XHQvLyBUT0RPIChhYmVsbmF0aW9uKTogUmVjdEFyZWFMaWdodCBkaXN0YW5jZT9cblx0XHRcdFx0Ly8gdW5pZm9ybXMuZGlzdGFuY2UgPSBkaXN0YW5jZTtcblxuXHRcdFx0XHRzdGF0ZS5yZWN0QXJlYVsgcmVjdEFyZWFMZW5ndGggXSA9IHVuaWZvcm1zO1xuXG5cdFx0XHRcdHJlY3RBcmVhTGVuZ3RoICsrO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBsaWdodC5pc1BvaW50TGlnaHQgKSB7XG5cblx0XHRcdFx0dmFyIHVuaWZvcm1zID0gY2FjaGUuZ2V0KCBsaWdodCApO1xuXG5cdFx0XHRcdHVuaWZvcm1zLnBvc2l0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbiggbGlnaHQubWF0cml4V29ybGQgKTtcblx0XHRcdFx0dW5pZm9ybXMucG9zaXRpb24uYXBwbHlNYXRyaXg0KCB2aWV3TWF0cml4ICk7XG5cblx0XHRcdFx0dW5pZm9ybXMuY29sb3IuY29weSggbGlnaHQuY29sb3IgKS5tdWx0aXBseVNjYWxhciggbGlnaHQuaW50ZW5zaXR5ICk7XG5cdFx0XHRcdHVuaWZvcm1zLmRpc3RhbmNlID0gbGlnaHQuZGlzdGFuY2U7XG5cdFx0XHRcdHVuaWZvcm1zLmRlY2F5ID0gKCBsaWdodC5kaXN0YW5jZSA9PT0gMCApID8gMC4wIDogbGlnaHQuZGVjYXk7XG5cblx0XHRcdFx0dW5pZm9ybXMuc2hhZG93ID0gbGlnaHQuY2FzdFNoYWRvdztcblxuXHRcdFx0XHRpZiAoIGxpZ2h0LmNhc3RTaGFkb3cgKSB7XG5cblx0XHRcdFx0XHR2YXIgc2hhZG93ID0gbGlnaHQuc2hhZG93O1xuXG5cdFx0XHRcdFx0dW5pZm9ybXMuc2hhZG93QmlhcyA9IHNoYWRvdy5iaWFzO1xuXHRcdFx0XHRcdHVuaWZvcm1zLnNoYWRvd1JhZGl1cyA9IHNoYWRvdy5yYWRpdXM7XG5cdFx0XHRcdFx0dW5pZm9ybXMuc2hhZG93TWFwU2l6ZSA9IHNoYWRvdy5tYXBTaXplO1xuXHRcdFx0XHRcdHVuaWZvcm1zLnNoYWRvd0NhbWVyYU5lYXIgPSBzaGFkb3cuY2FtZXJhLm5lYXI7XG5cdFx0XHRcdFx0dW5pZm9ybXMuc2hhZG93Q2FtZXJhRmFyID0gc2hhZG93LmNhbWVyYS5mYXI7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHN0YXRlLnBvaW50U2hhZG93TWFwWyBwb2ludExlbmd0aCBdID0gc2hhZG93TWFwO1xuXHRcdFx0XHRzdGF0ZS5wb2ludFNoYWRvd01hdHJpeFsgcG9pbnRMZW5ndGggXSA9IGxpZ2h0LnNoYWRvdy5tYXRyaXg7XG5cdFx0XHRcdHN0YXRlLnBvaW50WyBwb2ludExlbmd0aCBdID0gdW5pZm9ybXM7XG5cblx0XHRcdFx0cG9pbnRMZW5ndGggKys7XG5cblx0XHRcdH0gZWxzZSBpZiAoIGxpZ2h0LmlzSGVtaXNwaGVyZUxpZ2h0ICkge1xuXG5cdFx0XHRcdHZhciB1bmlmb3JtcyA9IGNhY2hlLmdldCggbGlnaHQgKTtcblxuXHRcdFx0XHR1bmlmb3Jtcy5kaXJlY3Rpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBsaWdodC5tYXRyaXhXb3JsZCApO1xuXHRcdFx0XHR1bmlmb3Jtcy5kaXJlY3Rpb24udHJhbnNmb3JtRGlyZWN0aW9uKCB2aWV3TWF0cml4ICk7XG5cdFx0XHRcdHVuaWZvcm1zLmRpcmVjdGlvbi5ub3JtYWxpemUoKTtcblxuXHRcdFx0XHR1bmlmb3Jtcy5za3lDb2xvci5jb3B5KCBsaWdodC5jb2xvciApLm11bHRpcGx5U2NhbGFyKCBpbnRlbnNpdHkgKTtcblx0XHRcdFx0dW5pZm9ybXMuZ3JvdW5kQ29sb3IuY29weSggbGlnaHQuZ3JvdW5kQ29sb3IgKS5tdWx0aXBseVNjYWxhciggaW50ZW5zaXR5ICk7XG5cblx0XHRcdFx0c3RhdGUuaGVtaVsgaGVtaUxlbmd0aCBdID0gdW5pZm9ybXM7XG5cblx0XHRcdFx0aGVtaUxlbmd0aCArKztcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0c3RhdGUuYW1iaWVudFsgMCBdID0gcjtcblx0XHRzdGF0ZS5hbWJpZW50WyAxIF0gPSBnO1xuXHRcdHN0YXRlLmFtYmllbnRbIDIgXSA9IGI7XG5cblx0XHRzdGF0ZS5kaXJlY3Rpb25hbC5sZW5ndGggPSBkaXJlY3Rpb25hbExlbmd0aDtcblx0XHRzdGF0ZS5zcG90Lmxlbmd0aCA9IHNwb3RMZW5ndGg7XG5cdFx0c3RhdGUucmVjdEFyZWEubGVuZ3RoID0gcmVjdEFyZWFMZW5ndGg7XG5cdFx0c3RhdGUucG9pbnQubGVuZ3RoID0gcG9pbnRMZW5ndGg7XG5cdFx0c3RhdGUuaGVtaS5sZW5ndGggPSBoZW1pTGVuZ3RoO1xuXG5cdFx0c3RhdGUuaGFzaCA9IHN0YXRlLmlkICsgJywnICsgZGlyZWN0aW9uYWxMZW5ndGggKyAnLCcgKyBwb2ludExlbmd0aCArICcsJyArIHNwb3RMZW5ndGggKyAnLCcgKyByZWN0QXJlYUxlbmd0aCArICcsJyArIGhlbWlMZW5ndGggKyAnLCcgKyBzaGFkb3dzLmxlbmd0aDtcblxuXHR9XG5cblx0cmV0dXJuIHtcblx0XHRzZXR1cDogc2V0dXAsXG5cdFx0c3RhdGU6IHN0YXRlXG5cdH07XG5cbn1cblxuLyoqXG4gKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44N1xuICovXG5cbmZ1bmN0aW9uIFdlYkdMUmVuZGVyU3RhdGUoKSB7XG5cblx0dmFyIGxpZ2h0cyA9IG5ldyBXZWJHTExpZ2h0cygpO1xuXG5cdHZhciBsaWdodHNBcnJheSA9IFtdO1xuXHR2YXIgc2hhZG93c0FycmF5ID0gW107XG5cdHZhciBzcHJpdGVzQXJyYXkgPSBbXTtcblxuXHRmdW5jdGlvbiBpbml0KCkge1xuXG5cdFx0bGlnaHRzQXJyYXkubGVuZ3RoID0gMDtcblx0XHRzaGFkb3dzQXJyYXkubGVuZ3RoID0gMDtcblx0XHRzcHJpdGVzQXJyYXkubGVuZ3RoID0gMDtcblxuXHR9XG5cblx0ZnVuY3Rpb24gcHVzaExpZ2h0KCBsaWdodCApIHtcblxuXHRcdGxpZ2h0c0FycmF5LnB1c2goIGxpZ2h0ICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHB1c2hTaGFkb3coIHNoYWRvd0xpZ2h0ICkge1xuXG5cdFx0c2hhZG93c0FycmF5LnB1c2goIHNoYWRvd0xpZ2h0ICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHB1c2hTcHJpdGUoIHNoYWRvd0xpZ2h0ICkge1xuXG5cdFx0c3ByaXRlc0FycmF5LnB1c2goIHNoYWRvd0xpZ2h0ICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHNldHVwTGlnaHRzKCBjYW1lcmEgKSB7XG5cblx0XHRsaWdodHMuc2V0dXAoIGxpZ2h0c0FycmF5LCBzaGFkb3dzQXJyYXksIGNhbWVyYSApO1xuXG5cdH1cblxuXHR2YXIgc3RhdGUgPSB7XG5cdFx0bGlnaHRzQXJyYXk6IGxpZ2h0c0FycmF5LFxuXHRcdHNoYWRvd3NBcnJheTogc2hhZG93c0FycmF5LFxuXHRcdHNwcml0ZXNBcnJheTogc3ByaXRlc0FycmF5LFxuXG5cdFx0bGlnaHRzOiBsaWdodHNcblx0fTtcblxuXHRyZXR1cm4ge1xuXHRcdGluaXQ6IGluaXQsXG5cdFx0c3RhdGU6IHN0YXRlLFxuXHRcdHNldHVwTGlnaHRzOiBzZXR1cExpZ2h0cyxcblxuXHRcdHB1c2hMaWdodDogcHVzaExpZ2h0LFxuXHRcdHB1c2hTaGFkb3c6IHB1c2hTaGFkb3csXG5cdFx0cHVzaFNwcml0ZTogcHVzaFNwcml0ZVxuXHR9O1xuXG59XG5cbmZ1bmN0aW9uIFdlYkdMUmVuZGVyU3RhdGVzKCkge1xuXG5cdHZhciByZW5kZXJTdGF0ZXMgPSB7fTtcblxuXHRmdW5jdGlvbiBnZXQoIHNjZW5lLCBjYW1lcmEgKSB7XG5cblx0XHR2YXIgaGFzaCA9IHNjZW5lLmlkICsgJywnICsgY2FtZXJhLmlkO1xuXG5cdFx0dmFyIHJlbmRlclN0YXRlID0gcmVuZGVyU3RhdGVzWyBoYXNoIF07XG5cblx0XHRpZiAoIHJlbmRlclN0YXRlID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHJlbmRlclN0YXRlID0gbmV3IFdlYkdMUmVuZGVyU3RhdGUoKTtcblx0XHRcdHJlbmRlclN0YXRlc1sgaGFzaCBdID0gcmVuZGVyU3RhdGU7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gcmVuZGVyU3RhdGU7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGRpc3Bvc2UoKSB7XG5cblx0XHRyZW5kZXJTdGF0ZXMgPSB7fTtcblxuXHR9XG5cblx0cmV0dXJuIHtcblx0XHRnZXQ6IGdldCxcblx0XHRkaXNwb3NlOiBkaXNwb3NlXG5cdH07XG5cbn1cblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3IgYmhvdXN0b24gLyBodHRwczovL2NsYXJhLmlvXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqXG4gKiBwYXJhbWV0ZXJzID0ge1xuICpcbiAqICBvcGFjaXR5OiA8ZmxvYXQ+LFxuICpcbiAqICBtYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIGFscGhhTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBkaXNwbGFjZW1lbnRNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKiAgZGlzcGxhY2VtZW50U2NhbGU6IDxmbG9hdD4sXG4gKiAgZGlzcGxhY2VtZW50QmlhczogPGZsb2F0PixcbiAqXG4gKiAgd2lyZWZyYW1lOiA8Ym9vbGVhbj4sXG4gKiAgd2lyZWZyYW1lTGluZXdpZHRoOiA8ZmxvYXQ+XG4gKiB9XG4gKi9cblxuZnVuY3Rpb24gTWVzaERlcHRoTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7XG5cblx0TWF0ZXJpYWwuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdNZXNoRGVwdGhNYXRlcmlhbCc7XG5cblx0dGhpcy5kZXB0aFBhY2tpbmcgPSBCYXNpY0RlcHRoUGFja2luZztcblxuXHR0aGlzLnNraW5uaW5nID0gZmFsc2U7XG5cdHRoaXMubW9ycGhUYXJnZXRzID0gZmFsc2U7XG5cblx0dGhpcy5tYXAgPSBudWxsO1xuXG5cdHRoaXMuYWxwaGFNYXAgPSBudWxsO1xuXG5cdHRoaXMuZGlzcGxhY2VtZW50TWFwID0gbnVsbDtcblx0dGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IDE7XG5cdHRoaXMuZGlzcGxhY2VtZW50QmlhcyA9IDA7XG5cblx0dGhpcy53aXJlZnJhbWUgPSBmYWxzZTtcblx0dGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSAxO1xuXG5cdHRoaXMuZm9nID0gZmFsc2U7XG5cdHRoaXMubGlnaHRzID0gZmFsc2U7XG5cblx0dGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTtcblxufVxuXG5NZXNoRGVwdGhNYXRlcmlhbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBNYXRlcmlhbC5wcm90b3R5cGUgKTtcbk1lc2hEZXB0aE1hdGVyaWFsLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE1lc2hEZXB0aE1hdGVyaWFsO1xuXG5NZXNoRGVwdGhNYXRlcmlhbC5wcm90b3R5cGUuaXNNZXNoRGVwdGhNYXRlcmlhbCA9IHRydWU7XG5cbk1lc2hEZXB0aE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0TWF0ZXJpYWwucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0dGhpcy5kZXB0aFBhY2tpbmcgPSBzb3VyY2UuZGVwdGhQYWNraW5nO1xuXG5cdHRoaXMuc2tpbm5pbmcgPSBzb3VyY2Uuc2tpbm5pbmc7XG5cdHRoaXMubW9ycGhUYXJnZXRzID0gc291cmNlLm1vcnBoVGFyZ2V0cztcblxuXHR0aGlzLm1hcCA9IHNvdXJjZS5tYXA7XG5cblx0dGhpcy5hbHBoYU1hcCA9IHNvdXJjZS5hbHBoYU1hcDtcblxuXHR0aGlzLmRpc3BsYWNlbWVudE1hcCA9IHNvdXJjZS5kaXNwbGFjZW1lbnRNYXA7XG5cdHRoaXMuZGlzcGxhY2VtZW50U2NhbGUgPSBzb3VyY2UuZGlzcGxhY2VtZW50U2NhbGU7XG5cdHRoaXMuZGlzcGxhY2VtZW50QmlhcyA9IHNvdXJjZS5kaXNwbGFjZW1lbnRCaWFzO1xuXG5cdHRoaXMud2lyZWZyYW1lID0gc291cmNlLndpcmVmcmFtZTtcblx0dGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSBzb3VyY2Uud2lyZWZyYW1lTGluZXdpZHRoO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG4vKipcbiAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleVxuICpcbiAqIHBhcmFtZXRlcnMgPSB7XG4gKlxuICogIHJlZmVyZW5jZVBvc2l0aW9uOiA8ZmxvYXQ+LFxuICogIG5lYXJEaXN0YW5jZTogPGZsb2F0PixcbiAqICBmYXJEaXN0YW5jZTogPGZsb2F0PixcbiAqXG4gKiAgc2tpbm5pbmc6IDxib29sPixcbiAqICBtb3JwaFRhcmdldHM6IDxib29sPixcbiAqXG4gKiAgbWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBhbHBoYU1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgZGlzcGxhY2VtZW50TWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGRpc3BsYWNlbWVudFNjYWxlOiA8ZmxvYXQ+LFxuICogIGRpc3BsYWNlbWVudEJpYXM6IDxmbG9hdD5cbiAqXG4gKiB9XG4gKi9cblxuZnVuY3Rpb24gTWVzaERpc3RhbmNlTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7XG5cblx0TWF0ZXJpYWwuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdNZXNoRGlzdGFuY2VNYXRlcmlhbCc7XG5cblx0dGhpcy5yZWZlcmVuY2VQb3NpdGlvbiA9IG5ldyBWZWN0b3IzKCk7XG5cdHRoaXMubmVhckRpc3RhbmNlID0gMTtcblx0dGhpcy5mYXJEaXN0YW5jZSA9IDEwMDA7XG5cblx0dGhpcy5za2lubmluZyA9IGZhbHNlO1xuXHR0aGlzLm1vcnBoVGFyZ2V0cyA9IGZhbHNlO1xuXG5cdHRoaXMubWFwID0gbnVsbDtcblxuXHR0aGlzLmFscGhhTWFwID0gbnVsbDtcblxuXHR0aGlzLmRpc3BsYWNlbWVudE1hcCA9IG51bGw7XG5cdHRoaXMuZGlzcGxhY2VtZW50U2NhbGUgPSAxO1xuXHR0aGlzLmRpc3BsYWNlbWVudEJpYXMgPSAwO1xuXG5cdHRoaXMuZm9nID0gZmFsc2U7XG5cdHRoaXMubGlnaHRzID0gZmFsc2U7XG5cblx0dGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTtcblxufVxuXG5NZXNoRGlzdGFuY2VNYXRlcmlhbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBNYXRlcmlhbC5wcm90b3R5cGUgKTtcbk1lc2hEaXN0YW5jZU1hdGVyaWFsLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE1lc2hEaXN0YW5jZU1hdGVyaWFsO1xuXG5NZXNoRGlzdGFuY2VNYXRlcmlhbC5wcm90b3R5cGUuaXNNZXNoRGlzdGFuY2VNYXRlcmlhbCA9IHRydWU7XG5cbk1lc2hEaXN0YW5jZU1hdGVyaWFsLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0TWF0ZXJpYWwucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0dGhpcy5yZWZlcmVuY2VQb3NpdGlvbi5jb3B5KCBzb3VyY2UucmVmZXJlbmNlUG9zaXRpb24gKTtcblx0dGhpcy5uZWFyRGlzdGFuY2UgPSBzb3VyY2UubmVhckRpc3RhbmNlO1xuXHR0aGlzLmZhckRpc3RhbmNlID0gc291cmNlLmZhckRpc3RhbmNlO1xuXG5cdHRoaXMuc2tpbm5pbmcgPSBzb3VyY2Uuc2tpbm5pbmc7XG5cdHRoaXMubW9ycGhUYXJnZXRzID0gc291cmNlLm1vcnBoVGFyZ2V0cztcblxuXHR0aGlzLm1hcCA9IHNvdXJjZS5tYXA7XG5cblx0dGhpcy5hbHBoYU1hcCA9IHNvdXJjZS5hbHBoYU1hcDtcblxuXHR0aGlzLmRpc3BsYWNlbWVudE1hcCA9IHNvdXJjZS5kaXNwbGFjZW1lbnRNYXA7XG5cdHRoaXMuZGlzcGxhY2VtZW50U2NhbGUgPSBzb3VyY2UuZGlzcGxhY2VtZW50U2NhbGU7XG5cdHRoaXMuZGlzcGxhY2VtZW50QmlhcyA9IHNvdXJjZS5kaXNwbGFjZW1lbnRCaWFzO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG4vKipcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIFdlYkdMU2hhZG93TWFwKCBfcmVuZGVyZXIsIF9vYmplY3RzLCBtYXhUZXh0dXJlU2l6ZSApIHtcblxuXHR2YXIgX2ZydXN0dW0gPSBuZXcgRnJ1c3R1bSgpLFxuXHRcdF9wcm9qU2NyZWVuTWF0cml4ID0gbmV3IE1hdHJpeDQoKSxcblxuXHRcdF9zaGFkb3dNYXBTaXplID0gbmV3IFZlY3RvcjIoKSxcblx0XHRfbWF4U2hhZG93TWFwU2l6ZSA9IG5ldyBWZWN0b3IyKCBtYXhUZXh0dXJlU2l6ZSwgbWF4VGV4dHVyZVNpemUgKSxcblxuXHRcdF9sb29rVGFyZ2V0ID0gbmV3IFZlY3RvcjMoKSxcblx0XHRfbGlnaHRQb3NpdGlvbldvcmxkID0gbmV3IFZlY3RvcjMoKSxcblxuXHRcdF9Nb3JwaGluZ0ZsYWcgPSAxLFxuXHRcdF9Ta2lubmluZ0ZsYWcgPSAyLFxuXG5cdFx0X051bWJlck9mTWF0ZXJpYWxWYXJpYW50cyA9ICggX01vcnBoaW5nRmxhZyB8IF9Ta2lubmluZ0ZsYWcgKSArIDEsXG5cblx0XHRfZGVwdGhNYXRlcmlhbHMgPSBuZXcgQXJyYXkoIF9OdW1iZXJPZk1hdGVyaWFsVmFyaWFudHMgKSxcblx0XHRfZGlzdGFuY2VNYXRlcmlhbHMgPSBuZXcgQXJyYXkoIF9OdW1iZXJPZk1hdGVyaWFsVmFyaWFudHMgKSxcblxuXHRcdF9tYXRlcmlhbENhY2hlID0ge307XG5cblx0dmFyIHNoYWRvd1NpZGUgPSB7IDA6IEJhY2tTaWRlLCAxOiBGcm9udFNpZGUsIDI6IERvdWJsZVNpZGUgfTtcblxuXHR2YXIgY3ViZURpcmVjdGlvbnMgPSBbXG5cdFx0bmV3IFZlY3RvcjMoIDEsIDAsIDAgKSwgbmV3IFZlY3RvcjMoIC0gMSwgMCwgMCApLCBuZXcgVmVjdG9yMyggMCwgMCwgMSApLFxuXHRcdG5ldyBWZWN0b3IzKCAwLCAwLCAtIDEgKSwgbmV3IFZlY3RvcjMoIDAsIDEsIDAgKSwgbmV3IFZlY3RvcjMoIDAsIC0gMSwgMCApXG5cdF07XG5cblx0dmFyIGN1YmVVcHMgPSBbXG5cdFx0bmV3IFZlY3RvcjMoIDAsIDEsIDAgKSwgbmV3IFZlY3RvcjMoIDAsIDEsIDAgKSwgbmV3IFZlY3RvcjMoIDAsIDEsIDAgKSxcblx0XHRuZXcgVmVjdG9yMyggMCwgMSwgMCApLCBuZXcgVmVjdG9yMyggMCwgMCwgMSApLFx0bmV3IFZlY3RvcjMoIDAsIDAsIC0gMSApXG5cdF07XG5cblx0dmFyIGN1YmUyRFZpZXdQb3J0cyA9IFtcblx0XHRuZXcgVmVjdG9yNCgpLCBuZXcgVmVjdG9yNCgpLCBuZXcgVmVjdG9yNCgpLFxuXHRcdG5ldyBWZWN0b3I0KCksIG5ldyBWZWN0b3I0KCksIG5ldyBWZWN0b3I0KClcblx0XTtcblxuXHQvLyBpbml0XG5cblx0Zm9yICggdmFyIGkgPSAwOyBpICE9PSBfTnVtYmVyT2ZNYXRlcmlhbFZhcmlhbnRzOyArKyBpICkge1xuXG5cdFx0dmFyIHVzZU1vcnBoaW5nID0gKCBpICYgX01vcnBoaW5nRmxhZyApICE9PSAwO1xuXHRcdHZhciB1c2VTa2lubmluZyA9ICggaSAmIF9Ta2lubmluZ0ZsYWcgKSAhPT0gMDtcblxuXHRcdHZhciBkZXB0aE1hdGVyaWFsID0gbmV3IE1lc2hEZXB0aE1hdGVyaWFsKCB7XG5cblx0XHRcdGRlcHRoUGFja2luZzogUkdCQURlcHRoUGFja2luZyxcblxuXHRcdFx0bW9ycGhUYXJnZXRzOiB1c2VNb3JwaGluZyxcblx0XHRcdHNraW5uaW5nOiB1c2VTa2lubmluZ1xuXG5cdFx0fSApO1xuXG5cdFx0X2RlcHRoTWF0ZXJpYWxzWyBpIF0gPSBkZXB0aE1hdGVyaWFsO1xuXG5cdFx0Ly9cblxuXHRcdHZhciBkaXN0YW5jZU1hdGVyaWFsID0gbmV3IE1lc2hEaXN0YW5jZU1hdGVyaWFsKCB7XG5cblx0XHRcdG1vcnBoVGFyZ2V0czogdXNlTW9ycGhpbmcsXG5cdFx0XHRza2lubmluZzogdXNlU2tpbm5pbmdcblxuXHRcdH0gKTtcblxuXHRcdF9kaXN0YW5jZU1hdGVyaWFsc1sgaSBdID0gZGlzdGFuY2VNYXRlcmlhbDtcblxuXHR9XG5cblx0Ly9cblxuXHR2YXIgc2NvcGUgPSB0aGlzO1xuXG5cdHRoaXMuZW5hYmxlZCA9IGZhbHNlO1xuXG5cdHRoaXMuYXV0b1VwZGF0ZSA9IHRydWU7XG5cdHRoaXMubmVlZHNVcGRhdGUgPSBmYWxzZTtcblxuXHR0aGlzLnR5cGUgPSBQQ0ZTaGFkb3dNYXA7XG5cblx0dGhpcy5yZW5kZXIgPSBmdW5jdGlvbiAoIGxpZ2h0cywgc2NlbmUsIGNhbWVyYSApIHtcblxuXHRcdGlmICggc2NvcGUuZW5hYmxlZCA9PT0gZmFsc2UgKSByZXR1cm47XG5cdFx0aWYgKCBzY29wZS5hdXRvVXBkYXRlID09PSBmYWxzZSAmJiBzY29wZS5uZWVkc1VwZGF0ZSA9PT0gZmFsc2UgKSByZXR1cm47XG5cblx0XHRpZiAoIGxpZ2h0cy5sZW5ndGggPT09IDAgKSByZXR1cm47XG5cblx0XHQvLyBUT0RPIENsZWFuIHVwIChuZWVkZWQgaW4gY2FzZSBvZiBjb250ZXh0bG9zdClcblx0XHR2YXIgX2dsID0gX3JlbmRlcmVyLmNvbnRleHQ7XG5cdFx0dmFyIF9zdGF0ZSA9IF9yZW5kZXJlci5zdGF0ZTtcblxuXHRcdC8vIFNldCBHTCBzdGF0ZSBmb3IgZGVwdGggbWFwLlxuXHRcdF9zdGF0ZS5kaXNhYmxlKCBfZ2wuQkxFTkQgKTtcblx0XHRfc3RhdGUuYnVmZmVycy5jb2xvci5zZXRDbGVhciggMSwgMSwgMSwgMSApO1xuXHRcdF9zdGF0ZS5idWZmZXJzLmRlcHRoLnNldFRlc3QoIHRydWUgKTtcblx0XHRfc3RhdGUuc2V0U2Npc3NvclRlc3QoIGZhbHNlICk7XG5cblx0XHQvLyByZW5kZXIgZGVwdGggbWFwXG5cblx0XHR2YXIgZmFjZUNvdW50O1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IGxpZ2h0cy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGxpZ2h0ID0gbGlnaHRzWyBpIF07XG5cdFx0XHR2YXIgc2hhZG93ID0gbGlnaHQuc2hhZG93O1xuXHRcdFx0dmFyIGlzUG9pbnRMaWdodCA9IGxpZ2h0ICYmIGxpZ2h0LmlzUG9pbnRMaWdodDtcblxuXHRcdFx0aWYgKCBzaGFkb3cgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFNoYWRvd01hcDonLCBsaWdodCwgJ2hhcyBubyBzaGFkb3cuJyApO1xuXHRcdFx0XHRjb250aW51ZTtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgc2hhZG93Q2FtZXJhID0gc2hhZG93LmNhbWVyYTtcblxuXHRcdFx0X3NoYWRvd01hcFNpemUuY29weSggc2hhZG93Lm1hcFNpemUgKTtcblx0XHRcdF9zaGFkb3dNYXBTaXplLm1pbiggX21heFNoYWRvd01hcFNpemUgKTtcblxuXHRcdFx0aWYgKCBpc1BvaW50TGlnaHQgKSB7XG5cblx0XHRcdFx0dmFyIHZwV2lkdGggPSBfc2hhZG93TWFwU2l6ZS54O1xuXHRcdFx0XHR2YXIgdnBIZWlnaHQgPSBfc2hhZG93TWFwU2l6ZS55O1xuXG5cdFx0XHRcdC8vIFRoZXNlIHZpZXdwb3J0cyBtYXAgYSBjdWJlLW1hcCBvbnRvIGEgMkQgdGV4dHVyZSB3aXRoIHRoZVxuXHRcdFx0XHQvLyBmb2xsb3dpbmcgb3JpZW50YXRpb246XG5cdFx0XHRcdC8vXG5cdFx0XHRcdC8vICB4elhaXG5cdFx0XHRcdC8vICAgeSBZXG5cdFx0XHRcdC8vXG5cdFx0XHRcdC8vIFggLSBQb3NpdGl2ZSB4IGRpcmVjdGlvblxuXHRcdFx0XHQvLyB4IC0gTmVnYXRpdmUgeCBkaXJlY3Rpb25cblx0XHRcdFx0Ly8gWSAtIFBvc2l0aXZlIHkgZGlyZWN0aW9uXG5cdFx0XHRcdC8vIHkgLSBOZWdhdGl2ZSB5IGRpcmVjdGlvblxuXHRcdFx0XHQvLyBaIC0gUG9zaXRpdmUgeiBkaXJlY3Rpb25cblx0XHRcdFx0Ly8geiAtIE5lZ2F0aXZlIHogZGlyZWN0aW9uXG5cblx0XHRcdFx0Ly8gcG9zaXRpdmUgWFxuXHRcdFx0XHRjdWJlMkRWaWV3UG9ydHNbIDAgXS5zZXQoIHZwV2lkdGggKiAyLCB2cEhlaWdodCwgdnBXaWR0aCwgdnBIZWlnaHQgKTtcblx0XHRcdFx0Ly8gbmVnYXRpdmUgWFxuXHRcdFx0XHRjdWJlMkRWaWV3UG9ydHNbIDEgXS5zZXQoIDAsIHZwSGVpZ2h0LCB2cFdpZHRoLCB2cEhlaWdodCApO1xuXHRcdFx0XHQvLyBwb3NpdGl2ZSBaXG5cdFx0XHRcdGN1YmUyRFZpZXdQb3J0c1sgMiBdLnNldCggdnBXaWR0aCAqIDMsIHZwSGVpZ2h0LCB2cFdpZHRoLCB2cEhlaWdodCApO1xuXHRcdFx0XHQvLyBuZWdhdGl2ZSBaXG5cdFx0XHRcdGN1YmUyRFZpZXdQb3J0c1sgMyBdLnNldCggdnBXaWR0aCwgdnBIZWlnaHQsIHZwV2lkdGgsIHZwSGVpZ2h0ICk7XG5cdFx0XHRcdC8vIHBvc2l0aXZlIFlcblx0XHRcdFx0Y3ViZTJEVmlld1BvcnRzWyA0IF0uc2V0KCB2cFdpZHRoICogMywgMCwgdnBXaWR0aCwgdnBIZWlnaHQgKTtcblx0XHRcdFx0Ly8gbmVnYXRpdmUgWVxuXHRcdFx0XHRjdWJlMkRWaWV3UG9ydHNbIDUgXS5zZXQoIHZwV2lkdGgsIDAsIHZwV2lkdGgsIHZwSGVpZ2h0ICk7XG5cblx0XHRcdFx0X3NoYWRvd01hcFNpemUueCAqPSA0LjA7XG5cdFx0XHRcdF9zaGFkb3dNYXBTaXplLnkgKj0gMi4wO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggc2hhZG93Lm1hcCA9PT0gbnVsbCApIHtcblxuXHRcdFx0XHR2YXIgcGFycyA9IHsgbWluRmlsdGVyOiBOZWFyZXN0RmlsdGVyLCBtYWdGaWx0ZXI6IE5lYXJlc3RGaWx0ZXIsIGZvcm1hdDogUkdCQUZvcm1hdCB9O1xuXG5cdFx0XHRcdHNoYWRvdy5tYXAgPSBuZXcgV2ViR0xSZW5kZXJUYXJnZXQoIF9zaGFkb3dNYXBTaXplLngsIF9zaGFkb3dNYXBTaXplLnksIHBhcnMgKTtcblx0XHRcdFx0c2hhZG93Lm1hcC50ZXh0dXJlLm5hbWUgPSBsaWdodC5uYW1lICsgXCIuc2hhZG93TWFwXCI7XG5cblx0XHRcdFx0c2hhZG93Q2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHNoYWRvdy5pc1Nwb3RMaWdodFNoYWRvdyApIHtcblxuXHRcdFx0XHRzaGFkb3cudXBkYXRlKCBsaWdodCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHZhciBzaGFkb3dNYXAgPSBzaGFkb3cubWFwO1xuXHRcdFx0dmFyIHNoYWRvd01hdHJpeCA9IHNoYWRvdy5tYXRyaXg7XG5cblx0XHRcdF9saWdodFBvc2l0aW9uV29ybGQuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBsaWdodC5tYXRyaXhXb3JsZCApO1xuXHRcdFx0c2hhZG93Q2FtZXJhLnBvc2l0aW9uLmNvcHkoIF9saWdodFBvc2l0aW9uV29ybGQgKTtcblxuXHRcdFx0aWYgKCBpc1BvaW50TGlnaHQgKSB7XG5cblx0XHRcdFx0ZmFjZUNvdW50ID0gNjtcblxuXHRcdFx0XHQvLyBmb3IgcG9pbnQgbGlnaHRzIHdlIHNldCB0aGUgc2hhZG93IG1hdHJpeCB0byBiZSBhIHRyYW5zbGF0aW9uLW9ubHkgbWF0cml4XG5cdFx0XHRcdC8vIGVxdWFsIHRvIGludmVyc2Ugb2YgdGhlIGxpZ2h0J3MgcG9zaXRpb25cblxuXHRcdFx0XHRzaGFkb3dNYXRyaXgubWFrZVRyYW5zbGF0aW9uKCAtIF9saWdodFBvc2l0aW9uV29ybGQueCwgLSBfbGlnaHRQb3NpdGlvbldvcmxkLnksIC0gX2xpZ2h0UG9zaXRpb25Xb3JsZC56ICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0ZmFjZUNvdW50ID0gMTtcblxuXHRcdFx0XHRfbG9va1RhcmdldC5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGxpZ2h0LnRhcmdldC5tYXRyaXhXb3JsZCApO1xuXHRcdFx0XHRzaGFkb3dDYW1lcmEubG9va0F0KCBfbG9va1RhcmdldCApO1xuXHRcdFx0XHRzaGFkb3dDYW1lcmEudXBkYXRlTWF0cml4V29ybGQoKTtcblxuXHRcdFx0XHQvLyBjb21wdXRlIHNoYWRvdyBtYXRyaXhcblxuXHRcdFx0XHRzaGFkb3dNYXRyaXguc2V0KFxuXHRcdFx0XHRcdDAuNSwgMC4wLCAwLjAsIDAuNSxcblx0XHRcdFx0XHQwLjAsIDAuNSwgMC4wLCAwLjUsXG5cdFx0XHRcdFx0MC4wLCAwLjAsIDAuNSwgMC41LFxuXHRcdFx0XHRcdDAuMCwgMC4wLCAwLjAsIDEuMFxuXHRcdFx0XHQpO1xuXG5cdFx0XHRcdHNoYWRvd01hdHJpeC5tdWx0aXBseSggc2hhZG93Q2FtZXJhLnByb2plY3Rpb25NYXRyaXggKTtcblx0XHRcdFx0c2hhZG93TWF0cml4Lm11bHRpcGx5KCBzaGFkb3dDYW1lcmEubWF0cml4V29ybGRJbnZlcnNlICk7XG5cblx0XHRcdH1cblxuXHRcdFx0X3JlbmRlcmVyLnNldFJlbmRlclRhcmdldCggc2hhZG93TWFwICk7XG5cdFx0XHRfcmVuZGVyZXIuY2xlYXIoKTtcblxuXHRcdFx0Ly8gcmVuZGVyIHNoYWRvdyBtYXAgZm9yIGVhY2ggY3ViZSBmYWNlIChpZiBvbW5pLWRpcmVjdGlvbmFsKSBvclxuXHRcdFx0Ly8gcnVuIGEgc2luZ2xlIHBhc3MgaWYgbm90XG5cblx0XHRcdGZvciAoIHZhciBmYWNlID0gMDsgZmFjZSA8IGZhY2VDb3VudDsgZmFjZSArKyApIHtcblxuXHRcdFx0XHRpZiAoIGlzUG9pbnRMaWdodCApIHtcblxuXHRcdFx0XHRcdF9sb29rVGFyZ2V0LmNvcHkoIHNoYWRvd0NhbWVyYS5wb3NpdGlvbiApO1xuXHRcdFx0XHRcdF9sb29rVGFyZ2V0LmFkZCggY3ViZURpcmVjdGlvbnNbIGZhY2UgXSApO1xuXHRcdFx0XHRcdHNoYWRvd0NhbWVyYS51cC5jb3B5KCBjdWJlVXBzWyBmYWNlIF0gKTtcblx0XHRcdFx0XHRzaGFkb3dDYW1lcmEubG9va0F0KCBfbG9va1RhcmdldCApO1xuXHRcdFx0XHRcdHNoYWRvd0NhbWVyYS51cGRhdGVNYXRyaXhXb3JsZCgpO1xuXG5cdFx0XHRcdFx0dmFyIHZwRGltZW5zaW9ucyA9IGN1YmUyRFZpZXdQb3J0c1sgZmFjZSBdO1xuXHRcdFx0XHRcdF9zdGF0ZS52aWV3cG9ydCggdnBEaW1lbnNpb25zICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIHVwZGF0ZSBjYW1lcmEgbWF0cmljZXMgYW5kIGZydXN0dW1cblxuXHRcdFx0XHRfcHJvalNjcmVlbk1hdHJpeC5tdWx0aXBseU1hdHJpY2VzKCBzaGFkb3dDYW1lcmEucHJvamVjdGlvbk1hdHJpeCwgc2hhZG93Q2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZSApO1xuXHRcdFx0XHRfZnJ1c3R1bS5zZXRGcm9tTWF0cml4KCBfcHJvalNjcmVlbk1hdHJpeCApO1xuXG5cdFx0XHRcdC8vIHNldCBvYmplY3QgbWF0cmljZXMgJiBmcnVzdHVtIGN1bGxpbmdcblxuXHRcdFx0XHRyZW5kZXJPYmplY3QoIHNjZW5lLCBjYW1lcmEsIHNoYWRvd0NhbWVyYSwgaXNQb2ludExpZ2h0ICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHNjb3BlLm5lZWRzVXBkYXRlID0gZmFsc2U7XG5cblx0fTtcblxuXHRmdW5jdGlvbiBnZXREZXB0aE1hdGVyaWFsKCBvYmplY3QsIG1hdGVyaWFsLCBpc1BvaW50TGlnaHQsIGxpZ2h0UG9zaXRpb25Xb3JsZCwgc2hhZG93Q2FtZXJhTmVhciwgc2hhZG93Q2FtZXJhRmFyICkge1xuXG5cdFx0dmFyIGdlb21ldHJ5ID0gb2JqZWN0Lmdlb21ldHJ5O1xuXG5cdFx0dmFyIHJlc3VsdCA9IG51bGw7XG5cblx0XHR2YXIgbWF0ZXJpYWxWYXJpYW50cyA9IF9kZXB0aE1hdGVyaWFscztcblx0XHR2YXIgY3VzdG9tTWF0ZXJpYWwgPSBvYmplY3QuY3VzdG9tRGVwdGhNYXRlcmlhbDtcblxuXHRcdGlmICggaXNQb2ludExpZ2h0ICkge1xuXG5cdFx0XHRtYXRlcmlhbFZhcmlhbnRzID0gX2Rpc3RhbmNlTWF0ZXJpYWxzO1xuXHRcdFx0Y3VzdG9tTWF0ZXJpYWwgPSBvYmplY3QuY3VzdG9tRGlzdGFuY2VNYXRlcmlhbDtcblxuXHRcdH1cblxuXHRcdGlmICggISBjdXN0b21NYXRlcmlhbCApIHtcblxuXHRcdFx0dmFyIHVzZU1vcnBoaW5nID0gZmFsc2U7XG5cblx0XHRcdGlmICggbWF0ZXJpYWwubW9ycGhUYXJnZXRzICkge1xuXG5cdFx0XHRcdGlmICggZ2VvbWV0cnkgJiYgZ2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSApIHtcblxuXHRcdFx0XHRcdHVzZU1vcnBoaW5nID0gZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzICYmIGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbiAmJiBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb24ubGVuZ3RoID4gMDtcblxuXHRcdFx0XHR9IGVsc2UgaWYgKCBnZW9tZXRyeSAmJiBnZW9tZXRyeS5pc0dlb21ldHJ5ICkge1xuXG5cdFx0XHRcdFx0dXNlTW9ycGhpbmcgPSBnZW9tZXRyeS5tb3JwaFRhcmdldHMgJiYgZ2VvbWV0cnkubW9ycGhUYXJnZXRzLmxlbmd0aCA+IDA7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggb2JqZWN0LmlzU2tpbm5lZE1lc2ggJiYgbWF0ZXJpYWwuc2tpbm5pbmcgPT09IGZhbHNlICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMU2hhZG93TWFwOiBUSFJFRS5Ta2lubmVkTWVzaCB3aXRoIG1hdGVyaWFsLnNraW5uaW5nIHNldCB0byBmYWxzZTonLCBvYmplY3QgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgdXNlU2tpbm5pbmcgPSBvYmplY3QuaXNTa2lubmVkTWVzaCAmJiBtYXRlcmlhbC5za2lubmluZztcblxuXHRcdFx0dmFyIHZhcmlhbnRJbmRleCA9IDA7XG5cblx0XHRcdGlmICggdXNlTW9ycGhpbmcgKSB2YXJpYW50SW5kZXggfD0gX01vcnBoaW5nRmxhZztcblx0XHRcdGlmICggdXNlU2tpbm5pbmcgKSB2YXJpYW50SW5kZXggfD0gX1NraW5uaW5nRmxhZztcblxuXHRcdFx0cmVzdWx0ID0gbWF0ZXJpYWxWYXJpYW50c1sgdmFyaWFudEluZGV4IF07XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRyZXN1bHQgPSBjdXN0b21NYXRlcmlhbDtcblxuXHRcdH1cblxuXHRcdGlmICggX3JlbmRlcmVyLmxvY2FsQ2xpcHBpbmdFbmFibGVkICYmXG5cdFx0XHRcdG1hdGVyaWFsLmNsaXBTaGFkb3dzID09PSB0cnVlICYmXG5cdFx0XHRcdG1hdGVyaWFsLmNsaXBwaW5nUGxhbmVzLmxlbmd0aCAhPT0gMCApIHtcblxuXHRcdFx0Ly8gaW4gdGhpcyBjYXNlIHdlIG5lZWQgYSB1bmlxdWUgbWF0ZXJpYWwgaW5zdGFuY2UgcmVmbGVjdGluZyB0aGVcblx0XHRcdC8vIGFwcHJvcHJpYXRlIHN0YXRlXG5cblx0XHRcdHZhciBrZXlBID0gcmVzdWx0LnV1aWQsIGtleUIgPSBtYXRlcmlhbC51dWlkO1xuXG5cdFx0XHR2YXIgbWF0ZXJpYWxzRm9yVmFyaWFudCA9IF9tYXRlcmlhbENhY2hlWyBrZXlBIF07XG5cblx0XHRcdGlmICggbWF0ZXJpYWxzRm9yVmFyaWFudCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdG1hdGVyaWFsc0ZvclZhcmlhbnQgPSB7fTtcblx0XHRcdFx0X21hdGVyaWFsQ2FjaGVbIGtleUEgXSA9IG1hdGVyaWFsc0ZvclZhcmlhbnQ7XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIGNhY2hlZE1hdGVyaWFsID0gbWF0ZXJpYWxzRm9yVmFyaWFudFsga2V5QiBdO1xuXG5cdFx0XHRpZiAoIGNhY2hlZE1hdGVyaWFsID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Y2FjaGVkTWF0ZXJpYWwgPSByZXN1bHQuY2xvbmUoKTtcblx0XHRcdFx0bWF0ZXJpYWxzRm9yVmFyaWFudFsga2V5QiBdID0gY2FjaGVkTWF0ZXJpYWw7XG5cblx0XHRcdH1cblxuXHRcdFx0cmVzdWx0ID0gY2FjaGVkTWF0ZXJpYWw7XG5cblx0XHR9XG5cblx0XHRyZXN1bHQudmlzaWJsZSA9IG1hdGVyaWFsLnZpc2libGU7XG5cdFx0cmVzdWx0LndpcmVmcmFtZSA9IG1hdGVyaWFsLndpcmVmcmFtZTtcblxuXHRcdHJlc3VsdC5zaWRlID0gKCBtYXRlcmlhbC5zaGFkb3dTaWRlICE9IG51bGwgKSA/IG1hdGVyaWFsLnNoYWRvd1NpZGUgOiBzaGFkb3dTaWRlWyBtYXRlcmlhbC5zaWRlIF07XG5cblx0XHRyZXN1bHQuY2xpcFNoYWRvd3MgPSBtYXRlcmlhbC5jbGlwU2hhZG93cztcblx0XHRyZXN1bHQuY2xpcHBpbmdQbGFuZXMgPSBtYXRlcmlhbC5jbGlwcGluZ1BsYW5lcztcblx0XHRyZXN1bHQuY2xpcEludGVyc2VjdGlvbiA9IG1hdGVyaWFsLmNsaXBJbnRlcnNlY3Rpb247XG5cblx0XHRyZXN1bHQud2lyZWZyYW1lTGluZXdpZHRoID0gbWF0ZXJpYWwud2lyZWZyYW1lTGluZXdpZHRoO1xuXHRcdHJlc3VsdC5saW5ld2lkdGggPSBtYXRlcmlhbC5saW5ld2lkdGg7XG5cblx0XHRpZiAoIGlzUG9pbnRMaWdodCAmJiByZXN1bHQuaXNNZXNoRGlzdGFuY2VNYXRlcmlhbCApIHtcblxuXHRcdFx0cmVzdWx0LnJlZmVyZW5jZVBvc2l0aW9uLmNvcHkoIGxpZ2h0UG9zaXRpb25Xb3JsZCApO1xuXHRcdFx0cmVzdWx0Lm5lYXJEaXN0YW5jZSA9IHNoYWRvd0NhbWVyYU5lYXI7XG5cdFx0XHRyZXN1bHQuZmFyRGlzdGFuY2UgPSBzaGFkb3dDYW1lcmFGYXI7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXG5cdH1cblxuXHRmdW5jdGlvbiByZW5kZXJPYmplY3QoIG9iamVjdCwgY2FtZXJhLCBzaGFkb3dDYW1lcmEsIGlzUG9pbnRMaWdodCApIHtcblxuXHRcdGlmICggb2JqZWN0LnZpc2libGUgPT09IGZhbHNlICkgcmV0dXJuO1xuXG5cdFx0dmFyIHZpc2libGUgPSBvYmplY3QubGF5ZXJzLnRlc3QoIGNhbWVyYS5sYXllcnMgKTtcblxuXHRcdGlmICggdmlzaWJsZSAmJiAoIG9iamVjdC5pc01lc2ggfHwgb2JqZWN0LmlzTGluZSB8fCBvYmplY3QuaXNQb2ludHMgKSApIHtcblxuXHRcdFx0aWYgKCBvYmplY3QuY2FzdFNoYWRvdyAmJiAoICEgb2JqZWN0LmZydXN0dW1DdWxsZWQgfHwgX2ZydXN0dW0uaW50ZXJzZWN0c09iamVjdCggb2JqZWN0ICkgKSApIHtcblxuXHRcdFx0XHRvYmplY3QubW9kZWxWaWV3TWF0cml4Lm11bHRpcGx5TWF0cmljZXMoIHNoYWRvd0NhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UsIG9iamVjdC5tYXRyaXhXb3JsZCApO1xuXG5cdFx0XHRcdHZhciBnZW9tZXRyeSA9IF9vYmplY3RzLnVwZGF0ZSggb2JqZWN0ICk7XG5cdFx0XHRcdHZhciBtYXRlcmlhbCA9IG9iamVjdC5tYXRlcmlhbDtcblxuXHRcdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIG1hdGVyaWFsICkgKSB7XG5cblx0XHRcdFx0XHR2YXIgZ3JvdXBzID0gZ2VvbWV0cnkuZ3JvdXBzO1xuXG5cdFx0XHRcdFx0Zm9yICggdmFyIGsgPSAwLCBrbCA9IGdyb3Vwcy5sZW5ndGg7IGsgPCBrbDsgayArKyApIHtcblxuXHRcdFx0XHRcdFx0dmFyIGdyb3VwID0gZ3JvdXBzWyBrIF07XG5cdFx0XHRcdFx0XHR2YXIgZ3JvdXBNYXRlcmlhbCA9IG1hdGVyaWFsWyBncm91cC5tYXRlcmlhbEluZGV4IF07XG5cblx0XHRcdFx0XHRcdGlmICggZ3JvdXBNYXRlcmlhbCAmJiBncm91cE1hdGVyaWFsLnZpc2libGUgKSB7XG5cblx0XHRcdFx0XHRcdFx0dmFyIGRlcHRoTWF0ZXJpYWwgPSBnZXREZXB0aE1hdGVyaWFsKCBvYmplY3QsIGdyb3VwTWF0ZXJpYWwsIGlzUG9pbnRMaWdodCwgX2xpZ2h0UG9zaXRpb25Xb3JsZCwgc2hhZG93Q2FtZXJhLm5lYXIsIHNoYWRvd0NhbWVyYS5mYXIgKTtcblx0XHRcdFx0XHRcdFx0X3JlbmRlcmVyLnJlbmRlckJ1ZmZlckRpcmVjdCggc2hhZG93Q2FtZXJhLCBudWxsLCBnZW9tZXRyeSwgZGVwdGhNYXRlcmlhbCwgb2JqZWN0LCBncm91cCApO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwudmlzaWJsZSApIHtcblxuXHRcdFx0XHRcdHZhciBkZXB0aE1hdGVyaWFsID0gZ2V0RGVwdGhNYXRlcmlhbCggb2JqZWN0LCBtYXRlcmlhbCwgaXNQb2ludExpZ2h0LCBfbGlnaHRQb3NpdGlvbldvcmxkLCBzaGFkb3dDYW1lcmEubmVhciwgc2hhZG93Q2FtZXJhLmZhciApO1xuXHRcdFx0XHRcdF9yZW5kZXJlci5yZW5kZXJCdWZmZXJEaXJlY3QoIHNoYWRvd0NhbWVyYSwgbnVsbCwgZ2VvbWV0cnksIGRlcHRoTWF0ZXJpYWwsIG9iamVjdCwgbnVsbCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0dmFyIGNoaWxkcmVuID0gb2JqZWN0LmNoaWxkcmVuO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0cmVuZGVyT2JqZWN0KCBjaGlsZHJlblsgaSBdLCBjYW1lcmEsIHNoYWRvd0NhbWVyYSwgaXNQb2ludExpZ2h0ICk7XG5cblx0XHR9XG5cblx0fVxuXG59XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBDYW52YXNUZXh0dXJlKCBjYW52YXMsIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGZvcm1hdCwgdHlwZSwgYW5pc290cm9weSApIHtcblxuXHRUZXh0dXJlLmNhbGwoIHRoaXMsIGNhbnZhcywgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIsIG1pbkZpbHRlciwgZm9ybWF0LCB0eXBlLCBhbmlzb3Ryb3B5ICk7XG5cblx0dGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cbn1cblxuQ2FudmFzVGV4dHVyZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBUZXh0dXJlLnByb3RvdHlwZSApO1xuQ2FudmFzVGV4dHVyZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDYW52YXNUZXh0dXJlO1xuXG4vKipcbiAqIEBhdXRob3IgbWlrYWVsIGVtdGluZ2VyIC8gaHR0cDovL2dvbW8uc2UvXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICovXG5cbmZ1bmN0aW9uIFdlYkdMU3ByaXRlUmVuZGVyZXIoIHJlbmRlcmVyLCBnbCwgc3RhdGUsIHRleHR1cmVzLCBjYXBhYmlsaXRpZXMgKSB7XG5cblx0dmFyIHZlcnRleEJ1ZmZlciwgZWxlbWVudEJ1ZmZlcjtcblx0dmFyIHByb2dyYW0sIGF0dHJpYnV0ZXMsIHVuaWZvcm1zO1xuXG5cdHZhciB0ZXh0dXJlO1xuXG5cdC8vIGRlY29tcG9zZSBtYXRyaXhXb3JsZFxuXG5cdHZhciBzcHJpdGVQb3NpdGlvbiA9IG5ldyBWZWN0b3IzKCk7XG5cdHZhciBzcHJpdGVSb3RhdGlvbiA9IG5ldyBRdWF0ZXJuaW9uKCk7XG5cdHZhciBzcHJpdGVTY2FsZSA9IG5ldyBWZWN0b3IzKCk7XG5cblx0ZnVuY3Rpb24gaW5pdCgpIHtcblxuXHRcdHZhciB2ZXJ0aWNlcyA9IG5ldyBGbG9hdDMyQXJyYXkoIFtcblx0XHRcdC0gMC41LCAtIDAuNSwgMCwgMCxcblx0XHRcdCAgMC41LCAtIDAuNSwgMSwgMCxcblx0XHRcdCAgMC41LCAwLjUsIDEsIDEsXG5cdFx0XHQtIDAuNSwgMC41LCAwLCAxXG5cdFx0XSApO1xuXG5cdFx0dmFyIGZhY2VzID0gbmV3IFVpbnQxNkFycmF5KCBbXG5cdFx0XHQwLCAxLCAyLFxuXHRcdFx0MCwgMiwgM1xuXHRcdF0gKTtcblxuXHRcdHZlcnRleEJ1ZmZlciA9IGdsLmNyZWF0ZUJ1ZmZlcigpO1xuXHRcdGVsZW1lbnRCdWZmZXIgPSBnbC5jcmVhdGVCdWZmZXIoKTtcblxuXHRcdGdsLmJpbmRCdWZmZXIoIGdsLkFSUkFZX0JVRkZFUiwgdmVydGV4QnVmZmVyICk7XG5cdFx0Z2wuYnVmZmVyRGF0YSggZ2wuQVJSQVlfQlVGRkVSLCB2ZXJ0aWNlcywgZ2wuU1RBVElDX0RSQVcgKTtcblxuXHRcdGdsLmJpbmRCdWZmZXIoIGdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCBlbGVtZW50QnVmZmVyICk7XG5cdFx0Z2wuYnVmZmVyRGF0YSggZ2wuRUxFTUVOVF9BUlJBWV9CVUZGRVIsIGZhY2VzLCBnbC5TVEFUSUNfRFJBVyApO1xuXG5cdFx0cHJvZ3JhbSA9IGNyZWF0ZVByb2dyYW0oKTtcblxuXHRcdGF0dHJpYnV0ZXMgPSB7XG5cdFx0XHRwb3NpdGlvbjogZ2wuZ2V0QXR0cmliTG9jYXRpb24oIHByb2dyYW0sICdwb3NpdGlvbicgKSxcblx0XHRcdHV2OiBnbC5nZXRBdHRyaWJMb2NhdGlvbiggcHJvZ3JhbSwgJ3V2JyApXG5cdFx0fTtcblxuXHRcdHVuaWZvcm1zID0ge1xuXHRcdFx0dXZPZmZzZXQ6IGdsLmdldFVuaWZvcm1Mb2NhdGlvbiggcHJvZ3JhbSwgJ3V2T2Zmc2V0JyApLFxuXHRcdFx0dXZTY2FsZTogZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCAndXZTY2FsZScgKSxcblxuXHRcdFx0cm90YXRpb246IGdsLmdldFVuaWZvcm1Mb2NhdGlvbiggcHJvZ3JhbSwgJ3JvdGF0aW9uJyApLFxuXHRcdFx0Y2VudGVyOiBnbC5nZXRVbmlmb3JtTG9jYXRpb24oIHByb2dyYW0sICdjZW50ZXInICksXG5cdFx0XHRzY2FsZTogZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCAnc2NhbGUnICksXG5cblx0XHRcdGNvbG9yOiBnbC5nZXRVbmlmb3JtTG9jYXRpb24oIHByb2dyYW0sICdjb2xvcicgKSxcblx0XHRcdG1hcDogZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCAnbWFwJyApLFxuXHRcdFx0b3BhY2l0eTogZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCAnb3BhY2l0eScgKSxcblxuXHRcdFx0bW9kZWxWaWV3TWF0cml4OiBnbC5nZXRVbmlmb3JtTG9jYXRpb24oIHByb2dyYW0sICdtb2RlbFZpZXdNYXRyaXgnICksXG5cdFx0XHRwcm9qZWN0aW9uTWF0cml4OiBnbC5nZXRVbmlmb3JtTG9jYXRpb24oIHByb2dyYW0sICdwcm9qZWN0aW9uTWF0cml4JyApLFxuXG5cdFx0XHRmb2dUeXBlOiBnbC5nZXRVbmlmb3JtTG9jYXRpb24oIHByb2dyYW0sICdmb2dUeXBlJyApLFxuXHRcdFx0Zm9nRGVuc2l0eTogZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCAnZm9nRGVuc2l0eScgKSxcblx0XHRcdGZvZ05lYXI6IGdsLmdldFVuaWZvcm1Mb2NhdGlvbiggcHJvZ3JhbSwgJ2ZvZ05lYXInICksXG5cdFx0XHRmb2dGYXI6IGdsLmdldFVuaWZvcm1Mb2NhdGlvbiggcHJvZ3JhbSwgJ2ZvZ0ZhcicgKSxcblx0XHRcdGZvZ0NvbG9yOiBnbC5nZXRVbmlmb3JtTG9jYXRpb24oIHByb2dyYW0sICdmb2dDb2xvcicgKSxcblx0XHRcdGZvZ0RlcHRoOiBnbC5nZXRVbmlmb3JtTG9jYXRpb24oIHByb2dyYW0sICdmb2dEZXB0aCcgKSxcblxuXHRcdFx0YWxwaGFUZXN0OiBnbC5nZXRVbmlmb3JtTG9jYXRpb24oIHByb2dyYW0sICdhbHBoYVRlc3QnIClcblx0XHR9O1xuXG5cdFx0dmFyIGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyggJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnLCAnY2FudmFzJyApO1xuXHRcdGNhbnZhcy53aWR0aCA9IDg7XG5cdFx0Y2FudmFzLmhlaWdodCA9IDg7XG5cblx0XHR2YXIgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KCAnMmQnICk7XG5cdFx0Y29udGV4dC5maWxsU3R5bGUgPSAnd2hpdGUnO1xuXHRcdGNvbnRleHQuZmlsbFJlY3QoIDAsIDAsIDgsIDggKTtcblxuXHRcdHRleHR1cmUgPSBuZXcgQ2FudmFzVGV4dHVyZSggY2FudmFzICk7XG5cblx0fVxuXG5cdHRoaXMucmVuZGVyID0gZnVuY3Rpb24gKCBzcHJpdGVzLCBzY2VuZSwgY2FtZXJhICkge1xuXG5cdFx0aWYgKCBzcHJpdGVzLmxlbmd0aCA9PT0gMCApIHJldHVybjtcblxuXHRcdC8vIHNldHVwIGdsXG5cblx0XHRpZiAoIHByb2dyYW0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0aW5pdCgpO1xuXG5cdFx0fVxuXG5cdFx0c3RhdGUudXNlUHJvZ3JhbSggcHJvZ3JhbSApO1xuXG5cdFx0c3RhdGUuaW5pdEF0dHJpYnV0ZXMoKTtcblx0XHRzdGF0ZS5lbmFibGVBdHRyaWJ1dGUoIGF0dHJpYnV0ZXMucG9zaXRpb24gKTtcblx0XHRzdGF0ZS5lbmFibGVBdHRyaWJ1dGUoIGF0dHJpYnV0ZXMudXYgKTtcblx0XHRzdGF0ZS5kaXNhYmxlVW51c2VkQXR0cmlidXRlcygpO1xuXG5cdFx0c3RhdGUuZGlzYWJsZSggZ2wuQ1VMTF9GQUNFICk7XG5cdFx0c3RhdGUuZW5hYmxlKCBnbC5CTEVORCApO1xuXG5cdFx0Z2wuYmluZEJ1ZmZlciggZ2wuQVJSQVlfQlVGRkVSLCB2ZXJ0ZXhCdWZmZXIgKTtcblx0XHRnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKCBhdHRyaWJ1dGVzLnBvc2l0aW9uLCAyLCBnbC5GTE9BVCwgZmFsc2UsIDIgKiA4LCAwICk7XG5cdFx0Z2wudmVydGV4QXR0cmliUG9pbnRlciggYXR0cmlidXRlcy51diwgMiwgZ2wuRkxPQVQsIGZhbHNlLCAyICogOCwgOCApO1xuXG5cdFx0Z2wuYmluZEJ1ZmZlciggZ2wuRUxFTUVOVF9BUlJBWV9CVUZGRVIsIGVsZW1lbnRCdWZmZXIgKTtcblxuXHRcdGdsLnVuaWZvcm1NYXRyaXg0ZnYoIHVuaWZvcm1zLnByb2plY3Rpb25NYXRyaXgsIGZhbHNlLCBjYW1lcmEucHJvamVjdGlvbk1hdHJpeC5lbGVtZW50cyApO1xuXG5cdFx0c3RhdGUuYWN0aXZlVGV4dHVyZSggZ2wuVEVYVFVSRTAgKTtcblx0XHRnbC51bmlmb3JtMWkoIHVuaWZvcm1zLm1hcCwgMCApO1xuXG5cdFx0dmFyIG9sZEZvZ1R5cGUgPSAwO1xuXHRcdHZhciBzY2VuZUZvZ1R5cGUgPSAwO1xuXHRcdHZhciBmb2cgPSBzY2VuZS5mb2c7XG5cblx0XHRpZiAoIGZvZyApIHtcblxuXHRcdFx0Z2wudW5pZm9ybTNmKCB1bmlmb3Jtcy5mb2dDb2xvciwgZm9nLmNvbG9yLnIsIGZvZy5jb2xvci5nLCBmb2cuY29sb3IuYiApO1xuXG5cdFx0XHRpZiAoIGZvZy5pc0ZvZyApIHtcblxuXHRcdFx0XHRnbC51bmlmb3JtMWYoIHVuaWZvcm1zLmZvZ05lYXIsIGZvZy5uZWFyICk7XG5cdFx0XHRcdGdsLnVuaWZvcm0xZiggdW5pZm9ybXMuZm9nRmFyLCBmb2cuZmFyICk7XG5cblx0XHRcdFx0Z2wudW5pZm9ybTFpKCB1bmlmb3Jtcy5mb2dUeXBlLCAxICk7XG5cdFx0XHRcdG9sZEZvZ1R5cGUgPSAxO1xuXHRcdFx0XHRzY2VuZUZvZ1R5cGUgPSAxO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBmb2cuaXNGb2dFeHAyICkge1xuXG5cdFx0XHRcdGdsLnVuaWZvcm0xZiggdW5pZm9ybXMuZm9nRGVuc2l0eSwgZm9nLmRlbnNpdHkgKTtcblxuXHRcdFx0XHRnbC51bmlmb3JtMWkoIHVuaWZvcm1zLmZvZ1R5cGUsIDIgKTtcblx0XHRcdFx0b2xkRm9nVHlwZSA9IDI7XG5cdFx0XHRcdHNjZW5lRm9nVHlwZSA9IDI7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGdsLnVuaWZvcm0xaSggdW5pZm9ybXMuZm9nVHlwZSwgMCApO1xuXHRcdFx0b2xkRm9nVHlwZSA9IDA7XG5cdFx0XHRzY2VuZUZvZ1R5cGUgPSAwO1xuXG5cdFx0fVxuXG5cblx0XHQvLyB1cGRhdGUgcG9zaXRpb25zIGFuZCBzb3J0XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBzcHJpdGVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBzcHJpdGUgPSBzcHJpdGVzWyBpIF07XG5cblx0XHRcdHNwcml0ZS5tb2RlbFZpZXdNYXRyaXgubXVsdGlwbHlNYXRyaWNlcyggY2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZSwgc3ByaXRlLm1hdHJpeFdvcmxkICk7XG5cdFx0XHRzcHJpdGUueiA9IC0gc3ByaXRlLm1vZGVsVmlld01hdHJpeC5lbGVtZW50c1sgMTQgXTtcblxuXHRcdH1cblxuXHRcdHNwcml0ZXMuc29ydCggcGFpbnRlclNvcnRTdGFibGUgKTtcblxuXHRcdC8vIHJlbmRlciBhbGwgc3ByaXRlc1xuXG5cdFx0dmFyIHNjYWxlID0gW107XG5cdFx0dmFyIGNlbnRlciA9IFtdO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gc3ByaXRlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgc3ByaXRlID0gc3ByaXRlc1sgaSBdO1xuXHRcdFx0dmFyIG1hdGVyaWFsID0gc3ByaXRlLm1hdGVyaWFsO1xuXG5cdFx0XHRpZiAoIG1hdGVyaWFsLnZpc2libGUgPT09IGZhbHNlICkgY29udGludWU7XG5cblx0XHRcdHNwcml0ZS5vbkJlZm9yZVJlbmRlciggcmVuZGVyZXIsIHNjZW5lLCBjYW1lcmEsIHVuZGVmaW5lZCwgbWF0ZXJpYWwsIHVuZGVmaW5lZCApO1xuXG5cdFx0XHRnbC51bmlmb3JtMWYoIHVuaWZvcm1zLmFscGhhVGVzdCwgbWF0ZXJpYWwuYWxwaGFUZXN0ICk7XG5cdFx0XHRnbC51bmlmb3JtTWF0cml4NGZ2KCB1bmlmb3Jtcy5tb2RlbFZpZXdNYXRyaXgsIGZhbHNlLCBzcHJpdGUubW9kZWxWaWV3TWF0cml4LmVsZW1lbnRzICk7XG5cblx0XHRcdHNwcml0ZS5tYXRyaXhXb3JsZC5kZWNvbXBvc2UoIHNwcml0ZVBvc2l0aW9uLCBzcHJpdGVSb3RhdGlvbiwgc3ByaXRlU2NhbGUgKTtcblxuXHRcdFx0c2NhbGVbIDAgXSA9IHNwcml0ZVNjYWxlLng7XG5cdFx0XHRzY2FsZVsgMSBdID0gc3ByaXRlU2NhbGUueTtcblxuXHRcdFx0Y2VudGVyWyAwIF0gPSBzcHJpdGUuY2VudGVyLnggLSAwLjU7XG5cdFx0XHRjZW50ZXJbIDEgXSA9IHNwcml0ZS5jZW50ZXIueSAtIDAuNTtcblxuXHRcdFx0dmFyIGZvZ1R5cGUgPSAwO1xuXG5cdFx0XHRpZiAoIHNjZW5lLmZvZyAmJiBtYXRlcmlhbC5mb2cgKSB7XG5cblx0XHRcdFx0Zm9nVHlwZSA9IHNjZW5lRm9nVHlwZTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIG9sZEZvZ1R5cGUgIT09IGZvZ1R5cGUgKSB7XG5cblx0XHRcdFx0Z2wudW5pZm9ybTFpKCB1bmlmb3Jtcy5mb2dUeXBlLCBmb2dUeXBlICk7XG5cdFx0XHRcdG9sZEZvZ1R5cGUgPSBmb2dUeXBlO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggbWF0ZXJpYWwubWFwICE9PSBudWxsICkge1xuXG5cdFx0XHRcdGdsLnVuaWZvcm0yZiggdW5pZm9ybXMudXZPZmZzZXQsIG1hdGVyaWFsLm1hcC5vZmZzZXQueCwgbWF0ZXJpYWwubWFwLm9mZnNldC55ICk7XG5cdFx0XHRcdGdsLnVuaWZvcm0yZiggdW5pZm9ybXMudXZTY2FsZSwgbWF0ZXJpYWwubWFwLnJlcGVhdC54LCBtYXRlcmlhbC5tYXAucmVwZWF0LnkgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRnbC51bmlmb3JtMmYoIHVuaWZvcm1zLnV2T2Zmc2V0LCAwLCAwICk7XG5cdFx0XHRcdGdsLnVuaWZvcm0yZiggdW5pZm9ybXMudXZTY2FsZSwgMSwgMSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGdsLnVuaWZvcm0xZiggdW5pZm9ybXMub3BhY2l0eSwgbWF0ZXJpYWwub3BhY2l0eSApO1xuXHRcdFx0Z2wudW5pZm9ybTNmKCB1bmlmb3Jtcy5jb2xvciwgbWF0ZXJpYWwuY29sb3IuciwgbWF0ZXJpYWwuY29sb3IuZywgbWF0ZXJpYWwuY29sb3IuYiApO1xuXG5cdFx0XHRnbC51bmlmb3JtMWYoIHVuaWZvcm1zLnJvdGF0aW9uLCBtYXRlcmlhbC5yb3RhdGlvbiApO1xuXHRcdFx0Z2wudW5pZm9ybTJmdiggdW5pZm9ybXMuY2VudGVyLCBjZW50ZXIgKTtcblx0XHRcdGdsLnVuaWZvcm0yZnYoIHVuaWZvcm1zLnNjYWxlLCBzY2FsZSApO1xuXG5cdFx0XHRzdGF0ZS5zZXRCbGVuZGluZyggbWF0ZXJpYWwuYmxlbmRpbmcsIG1hdGVyaWFsLmJsZW5kRXF1YXRpb24sIG1hdGVyaWFsLmJsZW5kU3JjLCBtYXRlcmlhbC5ibGVuZERzdCwgbWF0ZXJpYWwuYmxlbmRFcXVhdGlvbkFscGhhLCBtYXRlcmlhbC5ibGVuZFNyY0FscGhhLCBtYXRlcmlhbC5ibGVuZERzdEFscGhhLCBtYXRlcmlhbC5wcmVtdWx0aXBsaWVkQWxwaGEgKTtcblx0XHRcdHN0YXRlLmJ1ZmZlcnMuZGVwdGguc2V0VGVzdCggbWF0ZXJpYWwuZGVwdGhUZXN0ICk7XG5cdFx0XHRzdGF0ZS5idWZmZXJzLmRlcHRoLnNldE1hc2soIG1hdGVyaWFsLmRlcHRoV3JpdGUgKTtcblx0XHRcdHN0YXRlLmJ1ZmZlcnMuY29sb3Iuc2V0TWFzayggbWF0ZXJpYWwuY29sb3JXcml0ZSApO1xuXG5cdFx0XHR0ZXh0dXJlcy5zZXRUZXh0dXJlMkQoIG1hdGVyaWFsLm1hcCB8fCB0ZXh0dXJlLCAwICk7XG5cblx0XHRcdGdsLmRyYXdFbGVtZW50cyggZ2wuVFJJQU5HTEVTLCA2LCBnbC5VTlNJR05FRF9TSE9SVCwgMCApO1xuXG5cdFx0XHRzcHJpdGUub25BZnRlclJlbmRlciggcmVuZGVyZXIsIHNjZW5lLCBjYW1lcmEsIHVuZGVmaW5lZCwgbWF0ZXJpYWwsIHVuZGVmaW5lZCApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gcmVzdG9yZSBnbFxuXG5cdFx0c3RhdGUuZW5hYmxlKCBnbC5DVUxMX0ZBQ0UgKTtcblxuXHRcdHN0YXRlLnJlc2V0KCk7XG5cblx0fTtcblxuXHRmdW5jdGlvbiBjcmVhdGVQcm9ncmFtKCkge1xuXG5cdFx0dmFyIHByb2dyYW0gPSBnbC5jcmVhdGVQcm9ncmFtKCk7XG5cblx0XHR2YXIgdmVydGV4U2hhZGVyID0gZ2wuY3JlYXRlU2hhZGVyKCBnbC5WRVJURVhfU0hBREVSICk7XG5cdFx0dmFyIGZyYWdtZW50U2hhZGVyID0gZ2wuY3JlYXRlU2hhZGVyKCBnbC5GUkFHTUVOVF9TSEFERVIgKTtcblxuXHRcdGdsLnNoYWRlclNvdXJjZSggdmVydGV4U2hhZGVyLCBbXG5cblx0XHRcdCdwcmVjaXNpb24gJyArIGNhcGFiaWxpdGllcy5wcmVjaXNpb24gKyAnIGZsb2F0OycsXG5cblx0XHRcdCcjZGVmaW5lIFNIQURFUl9OQU1FICcgKyAnU3ByaXRlTWF0ZXJpYWwnLFxuXG5cdFx0XHQndW5pZm9ybSBtYXQ0IG1vZGVsVmlld01hdHJpeDsnLFxuXHRcdFx0J3VuaWZvcm0gbWF0NCBwcm9qZWN0aW9uTWF0cml4OycsXG5cdFx0XHQndW5pZm9ybSBmbG9hdCByb3RhdGlvbjsnLFxuXHRcdFx0J3VuaWZvcm0gdmVjMiBjZW50ZXI7Jyxcblx0XHRcdCd1bmlmb3JtIHZlYzIgc2NhbGU7Jyxcblx0XHRcdCd1bmlmb3JtIHZlYzIgdXZPZmZzZXQ7Jyxcblx0XHRcdCd1bmlmb3JtIHZlYzIgdXZTY2FsZTsnLFxuXG5cdFx0XHQnYXR0cmlidXRlIHZlYzIgcG9zaXRpb247Jyxcblx0XHRcdCdhdHRyaWJ1dGUgdmVjMiB1djsnLFxuXG5cdFx0XHQndmFyeWluZyB2ZWMyIHZVVjsnLFxuXHRcdFx0J3ZhcnlpbmcgZmxvYXQgZm9nRGVwdGg7JyxcblxuXHRcdFx0J3ZvaWQgbWFpbigpIHsnLFxuXG5cdFx0XHQnXHR2VVYgPSB1dk9mZnNldCArIHV2ICogdXZTY2FsZTsnLFxuXG5cdFx0XHQnXHR2ZWMyIGFsaWduZWRQb3NpdGlvbiA9ICggcG9zaXRpb24gLSBjZW50ZXIgKSAqIHNjYWxlOycsXG5cblx0XHRcdCdcdHZlYzIgcm90YXRlZFBvc2l0aW9uOycsXG5cdFx0XHQnXHRyb3RhdGVkUG9zaXRpb24ueCA9IGNvcyggcm90YXRpb24gKSAqIGFsaWduZWRQb3NpdGlvbi54IC0gc2luKCByb3RhdGlvbiApICogYWxpZ25lZFBvc2l0aW9uLnk7Jyxcblx0XHRcdCdcdHJvdGF0ZWRQb3NpdGlvbi55ID0gc2luKCByb3RhdGlvbiApICogYWxpZ25lZFBvc2l0aW9uLnggKyBjb3MoIHJvdGF0aW9uICkgKiBhbGlnbmVkUG9zaXRpb24ueTsnLFxuXG5cdFx0XHQnXHR2ZWM0IG12UG9zaXRpb247JyxcblxuXHRcdFx0J1x0bXZQb3NpdGlvbiA9IG1vZGVsVmlld01hdHJpeCAqIHZlYzQoIDAuMCwgMC4wLCAwLjAsIDEuMCApOycsXG5cdFx0XHQnXHRtdlBvc2l0aW9uLnh5ICs9IHJvdGF0ZWRQb3NpdGlvbjsnLFxuXG5cdFx0XHQnXHRnbF9Qb3NpdGlvbiA9IHByb2plY3Rpb25NYXRyaXggKiBtdlBvc2l0aW9uOycsXG5cblx0XHRcdCdcdGZvZ0RlcHRoID0gLSBtdlBvc2l0aW9uLno7JyxcblxuXHRcdFx0J30nXG5cblx0XHRdLmpvaW4oICdcXG4nICkgKTtcblxuXHRcdGdsLnNoYWRlclNvdXJjZSggZnJhZ21lbnRTaGFkZXIsIFtcblxuXHRcdFx0J3ByZWNpc2lvbiAnICsgY2FwYWJpbGl0aWVzLnByZWNpc2lvbiArICcgZmxvYXQ7JyxcblxuXHRcdFx0JyNkZWZpbmUgU0hBREVSX05BTUUgJyArICdTcHJpdGVNYXRlcmlhbCcsXG5cblx0XHRcdCd1bmlmb3JtIHZlYzMgY29sb3I7Jyxcblx0XHRcdCd1bmlmb3JtIHNhbXBsZXIyRCBtYXA7Jyxcblx0XHRcdCd1bmlmb3JtIGZsb2F0IG9wYWNpdHk7JyxcblxuXHRcdFx0J3VuaWZvcm0gaW50IGZvZ1R5cGU7Jyxcblx0XHRcdCd1bmlmb3JtIHZlYzMgZm9nQ29sb3I7Jyxcblx0XHRcdCd1bmlmb3JtIGZsb2F0IGZvZ0RlbnNpdHk7Jyxcblx0XHRcdCd1bmlmb3JtIGZsb2F0IGZvZ05lYXI7Jyxcblx0XHRcdCd1bmlmb3JtIGZsb2F0IGZvZ0ZhcjsnLFxuXHRcdFx0J3VuaWZvcm0gZmxvYXQgYWxwaGFUZXN0OycsXG5cblx0XHRcdCd2YXJ5aW5nIHZlYzIgdlVWOycsXG5cdFx0XHQndmFyeWluZyBmbG9hdCBmb2dEZXB0aDsnLFxuXG5cdFx0XHQndm9pZCBtYWluKCkgeycsXG5cblx0XHRcdCdcdHZlYzQgdGV4dHVyZSA9IHRleHR1cmUyRCggbWFwLCB2VVYgKTsnLFxuXG5cdFx0XHQnXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KCBjb2xvciAqIHRleHR1cmUueHl6LCB0ZXh0dXJlLmEgKiBvcGFjaXR5ICk7JyxcblxuXHRcdFx0J1x0aWYgKCBnbF9GcmFnQ29sb3IuYSA8IGFscGhhVGVzdCApIGRpc2NhcmQ7JyxcblxuXHRcdFx0J1x0aWYgKCBmb2dUeXBlID4gMCApIHsnLFxuXG5cdFx0XHQnXHRcdGZsb2F0IGZvZ0ZhY3RvciA9IDAuMDsnLFxuXG5cdFx0XHQnXHRcdGlmICggZm9nVHlwZSA9PSAxICkgeycsXG5cblx0XHRcdCdcdFx0XHRmb2dGYWN0b3IgPSBzbW9vdGhzdGVwKCBmb2dOZWFyLCBmb2dGYXIsIGZvZ0RlcHRoICk7JyxcblxuXHRcdFx0J1x0XHR9IGVsc2UgeycsXG5cblx0XHRcdCdcdFx0XHRjb25zdCBmbG9hdCBMT0cyID0gMS40NDI2OTU7Jyxcblx0XHRcdCdcdFx0XHRmb2dGYWN0b3IgPSBleHAyKCAtIGZvZ0RlbnNpdHkgKiBmb2dEZW5zaXR5ICogZm9nRGVwdGggKiBmb2dEZXB0aCAqIExPRzIgKTsnLFxuXHRcdFx0J1x0XHRcdGZvZ0ZhY3RvciA9IDEuMCAtIGNsYW1wKCBmb2dGYWN0b3IsIDAuMCwgMS4wICk7JyxcblxuXHRcdFx0J1x0XHR9JyxcblxuXHRcdFx0J1x0XHRnbF9GcmFnQ29sb3IucmdiID0gbWl4KCBnbF9GcmFnQ29sb3IucmdiLCBmb2dDb2xvciwgZm9nRmFjdG9yICk7JyxcblxuXHRcdFx0J1x0fScsXG5cblx0XHRcdCd9J1xuXG5cdFx0XS5qb2luKCAnXFxuJyApICk7XG5cblx0XHRnbC5jb21waWxlU2hhZGVyKCB2ZXJ0ZXhTaGFkZXIgKTtcblx0XHRnbC5jb21waWxlU2hhZGVyKCBmcmFnbWVudFNoYWRlciApO1xuXG5cdFx0Z2wuYXR0YWNoU2hhZGVyKCBwcm9ncmFtLCB2ZXJ0ZXhTaGFkZXIgKTtcblx0XHRnbC5hdHRhY2hTaGFkZXIoIHByb2dyYW0sIGZyYWdtZW50U2hhZGVyICk7XG5cblx0XHRnbC5saW5rUHJvZ3JhbSggcHJvZ3JhbSApO1xuXG5cdFx0cmV0dXJuIHByb2dyYW07XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHBhaW50ZXJTb3J0U3RhYmxlKCBhLCBiICkge1xuXG5cdFx0aWYgKCBhLnJlbmRlck9yZGVyICE9PSBiLnJlbmRlck9yZGVyICkge1xuXG5cdFx0XHRyZXR1cm4gYS5yZW5kZXJPcmRlciAtIGIucmVuZGVyT3JkZXI7XG5cblx0XHR9IGVsc2UgaWYgKCBhLnogIT09IGIueiApIHtcblxuXHRcdFx0cmV0dXJuIGIueiAtIGEuejtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHJldHVybiBiLmlkIC0gYS5pZDtcblxuXHRcdH1cblxuXHR9XG5cbn1cblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIFdlYkdMU3RhdGUoIGdsLCBleHRlbnNpb25zLCB1dGlscyApIHtcblxuXHRmdW5jdGlvbiBDb2xvckJ1ZmZlcigpIHtcblxuXHRcdHZhciBsb2NrZWQgPSBmYWxzZTtcblxuXHRcdHZhciBjb2xvciA9IG5ldyBWZWN0b3I0KCk7XG5cdFx0dmFyIGN1cnJlbnRDb2xvck1hc2sgPSBudWxsO1xuXHRcdHZhciBjdXJyZW50Q29sb3JDbGVhciA9IG5ldyBWZWN0b3I0KCAwLCAwLCAwLCAwICk7XG5cblx0XHRyZXR1cm4ge1xuXG5cdFx0XHRzZXRNYXNrOiBmdW5jdGlvbiAoIGNvbG9yTWFzayApIHtcblxuXHRcdFx0XHRpZiAoIGN1cnJlbnRDb2xvck1hc2sgIT09IGNvbG9yTWFzayAmJiAhIGxvY2tlZCApIHtcblxuXHRcdFx0XHRcdGdsLmNvbG9yTWFzayggY29sb3JNYXNrLCBjb2xvck1hc2ssIGNvbG9yTWFzaywgY29sb3JNYXNrICk7XG5cdFx0XHRcdFx0Y3VycmVudENvbG9yTWFzayA9IGNvbG9yTWFzaztcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0sXG5cblx0XHRcdHNldExvY2tlZDogZnVuY3Rpb24gKCBsb2NrICkge1xuXG5cdFx0XHRcdGxvY2tlZCA9IGxvY2s7XG5cblx0XHRcdH0sXG5cblx0XHRcdHNldENsZWFyOiBmdW5jdGlvbiAoIHIsIGcsIGIsIGEsIHByZW11bHRpcGxpZWRBbHBoYSApIHtcblxuXHRcdFx0XHRpZiAoIHByZW11bHRpcGxpZWRBbHBoYSA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0XHRcdHIgKj0gYTsgZyAqPSBhOyBiICo9IGE7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbG9yLnNldCggciwgZywgYiwgYSApO1xuXG5cdFx0XHRcdGlmICggY3VycmVudENvbG9yQ2xlYXIuZXF1YWxzKCBjb2xvciApID09PSBmYWxzZSApIHtcblxuXHRcdFx0XHRcdGdsLmNsZWFyQ29sb3IoIHIsIGcsIGIsIGEgKTtcblx0XHRcdFx0XHRjdXJyZW50Q29sb3JDbGVhci5jb3B5KCBjb2xvciApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSxcblxuXHRcdFx0cmVzZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0XHRsb2NrZWQgPSBmYWxzZTtcblxuXHRcdFx0XHRjdXJyZW50Q29sb3JNYXNrID0gbnVsbDtcblx0XHRcdFx0Y3VycmVudENvbG9yQ2xlYXIuc2V0KCAtIDEsIDAsIDAsIDAgKTsgLy8gc2V0IHRvIGludmFsaWQgc3RhdGVcblxuXHRcdFx0fVxuXG5cdFx0fTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gRGVwdGhCdWZmZXIoKSB7XG5cblx0XHR2YXIgbG9ja2VkID0gZmFsc2U7XG5cblx0XHR2YXIgY3VycmVudERlcHRoTWFzayA9IG51bGw7XG5cdFx0dmFyIGN1cnJlbnREZXB0aEZ1bmMgPSBudWxsO1xuXHRcdHZhciBjdXJyZW50RGVwdGhDbGVhciA9IG51bGw7XG5cblx0XHRyZXR1cm4ge1xuXG5cdFx0XHRzZXRUZXN0OiBmdW5jdGlvbiAoIGRlcHRoVGVzdCApIHtcblxuXHRcdFx0XHRpZiAoIGRlcHRoVGVzdCApIHtcblxuXHRcdFx0XHRcdGVuYWJsZSggZ2wuREVQVEhfVEVTVCApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRkaXNhYmxlKCBnbC5ERVBUSF9URVNUICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9LFxuXG5cdFx0XHRzZXRNYXNrOiBmdW5jdGlvbiAoIGRlcHRoTWFzayApIHtcblxuXHRcdFx0XHRpZiAoIGN1cnJlbnREZXB0aE1hc2sgIT09IGRlcHRoTWFzayAmJiAhIGxvY2tlZCApIHtcblxuXHRcdFx0XHRcdGdsLmRlcHRoTWFzayggZGVwdGhNYXNrICk7XG5cdFx0XHRcdFx0Y3VycmVudERlcHRoTWFzayA9IGRlcHRoTWFzaztcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0sXG5cblx0XHRcdHNldEZ1bmM6IGZ1bmN0aW9uICggZGVwdGhGdW5jICkge1xuXG5cdFx0XHRcdGlmICggY3VycmVudERlcHRoRnVuYyAhPT0gZGVwdGhGdW5jICkge1xuXG5cdFx0XHRcdFx0aWYgKCBkZXB0aEZ1bmMgKSB7XG5cblx0XHRcdFx0XHRcdHN3aXRjaCAoIGRlcHRoRnVuYyApIHtcblxuXHRcdFx0XHRcdFx0XHRjYXNlIE5ldmVyRGVwdGg6XG5cblx0XHRcdFx0XHRcdFx0XHRnbC5kZXB0aEZ1bmMoIGdsLk5FVkVSICk7XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRcdFx0Y2FzZSBBbHdheXNEZXB0aDpcblxuXHRcdFx0XHRcdFx0XHRcdGdsLmRlcHRoRnVuYyggZ2wuQUxXQVlTICk7XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRcdFx0Y2FzZSBMZXNzRGVwdGg6XG5cblx0XHRcdFx0XHRcdFx0XHRnbC5kZXB0aEZ1bmMoIGdsLkxFU1MgKTtcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdFx0XHRjYXNlIExlc3NFcXVhbERlcHRoOlxuXG5cdFx0XHRcdFx0XHRcdFx0Z2wuZGVwdGhGdW5jKCBnbC5MRVFVQUwgKTtcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdFx0XHRjYXNlIEVxdWFsRGVwdGg6XG5cblx0XHRcdFx0XHRcdFx0XHRnbC5kZXB0aEZ1bmMoIGdsLkVRVUFMICk7XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRcdFx0Y2FzZSBHcmVhdGVyRXF1YWxEZXB0aDpcblxuXHRcdFx0XHRcdFx0XHRcdGdsLmRlcHRoRnVuYyggZ2wuR0VRVUFMICk7XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRcdFx0Y2FzZSBHcmVhdGVyRGVwdGg6XG5cblx0XHRcdFx0XHRcdFx0XHRnbC5kZXB0aEZ1bmMoIGdsLkdSRUFURVIgKTtcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdFx0XHRjYXNlIE5vdEVxdWFsRGVwdGg6XG5cblx0XHRcdFx0XHRcdFx0XHRnbC5kZXB0aEZ1bmMoIGdsLk5PVEVRVUFMICk7XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRcdFx0ZGVmYXVsdDpcblxuXHRcdFx0XHRcdFx0XHRcdGdsLmRlcHRoRnVuYyggZ2wuTEVRVUFMICk7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdGdsLmRlcHRoRnVuYyggZ2wuTEVRVUFMICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRjdXJyZW50RGVwdGhGdW5jID0gZGVwdGhGdW5jO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSxcblxuXHRcdFx0c2V0TG9ja2VkOiBmdW5jdGlvbiAoIGxvY2sgKSB7XG5cblx0XHRcdFx0bG9ja2VkID0gbG9jaztcblxuXHRcdFx0fSxcblxuXHRcdFx0c2V0Q2xlYXI6IGZ1bmN0aW9uICggZGVwdGggKSB7XG5cblx0XHRcdFx0aWYgKCBjdXJyZW50RGVwdGhDbGVhciAhPT0gZGVwdGggKSB7XG5cblx0XHRcdFx0XHRnbC5jbGVhckRlcHRoKCBkZXB0aCApO1xuXHRcdFx0XHRcdGN1cnJlbnREZXB0aENsZWFyID0gZGVwdGg7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9LFxuXG5cdFx0XHRyZXNldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRcdGxvY2tlZCA9IGZhbHNlO1xuXG5cdFx0XHRcdGN1cnJlbnREZXB0aE1hc2sgPSBudWxsO1xuXHRcdFx0XHRjdXJyZW50RGVwdGhGdW5jID0gbnVsbDtcblx0XHRcdFx0Y3VycmVudERlcHRoQ2xlYXIgPSBudWxsO1xuXG5cdFx0XHR9XG5cblx0XHR9O1xuXG5cdH1cblxuXHRmdW5jdGlvbiBTdGVuY2lsQnVmZmVyKCkge1xuXG5cdFx0dmFyIGxvY2tlZCA9IGZhbHNlO1xuXG5cdFx0dmFyIGN1cnJlbnRTdGVuY2lsTWFzayA9IG51bGw7XG5cdFx0dmFyIGN1cnJlbnRTdGVuY2lsRnVuYyA9IG51bGw7XG5cdFx0dmFyIGN1cnJlbnRTdGVuY2lsUmVmID0gbnVsbDtcblx0XHR2YXIgY3VycmVudFN0ZW5jaWxGdW5jTWFzayA9IG51bGw7XG5cdFx0dmFyIGN1cnJlbnRTdGVuY2lsRmFpbCA9IG51bGw7XG5cdFx0dmFyIGN1cnJlbnRTdGVuY2lsWkZhaWwgPSBudWxsO1xuXHRcdHZhciBjdXJyZW50U3RlbmNpbFpQYXNzID0gbnVsbDtcblx0XHR2YXIgY3VycmVudFN0ZW5jaWxDbGVhciA9IG51bGw7XG5cblx0XHRyZXR1cm4ge1xuXG5cdFx0XHRzZXRUZXN0OiBmdW5jdGlvbiAoIHN0ZW5jaWxUZXN0ICkge1xuXG5cdFx0XHRcdGlmICggc3RlbmNpbFRlc3QgKSB7XG5cblx0XHRcdFx0XHRlbmFibGUoIGdsLlNURU5DSUxfVEVTVCApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRkaXNhYmxlKCBnbC5TVEVOQ0lMX1RFU1QgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0sXG5cblx0XHRcdHNldE1hc2s6IGZ1bmN0aW9uICggc3RlbmNpbE1hc2sgKSB7XG5cblx0XHRcdFx0aWYgKCBjdXJyZW50U3RlbmNpbE1hc2sgIT09IHN0ZW5jaWxNYXNrICYmICEgbG9ja2VkICkge1xuXG5cdFx0XHRcdFx0Z2wuc3RlbmNpbE1hc2soIHN0ZW5jaWxNYXNrICk7XG5cdFx0XHRcdFx0Y3VycmVudFN0ZW5jaWxNYXNrID0gc3RlbmNpbE1hc2s7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9LFxuXG5cdFx0XHRzZXRGdW5jOiBmdW5jdGlvbiAoIHN0ZW5jaWxGdW5jLCBzdGVuY2lsUmVmLCBzdGVuY2lsTWFzayApIHtcblxuXHRcdFx0XHRpZiAoIGN1cnJlbnRTdGVuY2lsRnVuYyAhPT0gc3RlbmNpbEZ1bmMgfHxcblx0XHRcdFx0ICAgICBjdXJyZW50U3RlbmNpbFJlZiBcdCE9PSBzdGVuY2lsUmVmIFx0fHxcblx0XHRcdFx0ICAgICBjdXJyZW50U3RlbmNpbEZ1bmNNYXNrICE9PSBzdGVuY2lsTWFzayApIHtcblxuXHRcdFx0XHRcdGdsLnN0ZW5jaWxGdW5jKCBzdGVuY2lsRnVuYywgc3RlbmNpbFJlZiwgc3RlbmNpbE1hc2sgKTtcblxuXHRcdFx0XHRcdGN1cnJlbnRTdGVuY2lsRnVuYyA9IHN0ZW5jaWxGdW5jO1xuXHRcdFx0XHRcdGN1cnJlbnRTdGVuY2lsUmVmID0gc3RlbmNpbFJlZjtcblx0XHRcdFx0XHRjdXJyZW50U3RlbmNpbEZ1bmNNYXNrID0gc3RlbmNpbE1hc2s7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9LFxuXG5cdFx0XHRzZXRPcDogZnVuY3Rpb24gKCBzdGVuY2lsRmFpbCwgc3RlbmNpbFpGYWlsLCBzdGVuY2lsWlBhc3MgKSB7XG5cblx0XHRcdFx0aWYgKCBjdXJyZW50U3RlbmNpbEZhaWxcdCAhPT0gc3RlbmNpbEZhaWwgXHR8fFxuXHRcdFx0XHQgICAgIGN1cnJlbnRTdGVuY2lsWkZhaWwgIT09IHN0ZW5jaWxaRmFpbCB8fFxuXHRcdFx0XHQgICAgIGN1cnJlbnRTdGVuY2lsWlBhc3MgIT09IHN0ZW5jaWxaUGFzcyApIHtcblxuXHRcdFx0XHRcdGdsLnN0ZW5jaWxPcCggc3RlbmNpbEZhaWwsIHN0ZW5jaWxaRmFpbCwgc3RlbmNpbFpQYXNzICk7XG5cblx0XHRcdFx0XHRjdXJyZW50U3RlbmNpbEZhaWwgPSBzdGVuY2lsRmFpbDtcblx0XHRcdFx0XHRjdXJyZW50U3RlbmNpbFpGYWlsID0gc3RlbmNpbFpGYWlsO1xuXHRcdFx0XHRcdGN1cnJlbnRTdGVuY2lsWlBhc3MgPSBzdGVuY2lsWlBhc3M7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9LFxuXG5cdFx0XHRzZXRMb2NrZWQ6IGZ1bmN0aW9uICggbG9jayApIHtcblxuXHRcdFx0XHRsb2NrZWQgPSBsb2NrO1xuXG5cdFx0XHR9LFxuXG5cdFx0XHRzZXRDbGVhcjogZnVuY3Rpb24gKCBzdGVuY2lsICkge1xuXG5cdFx0XHRcdGlmICggY3VycmVudFN0ZW5jaWxDbGVhciAhPT0gc3RlbmNpbCApIHtcblxuXHRcdFx0XHRcdGdsLmNsZWFyU3RlbmNpbCggc3RlbmNpbCApO1xuXHRcdFx0XHRcdGN1cnJlbnRTdGVuY2lsQ2xlYXIgPSBzdGVuY2lsO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSxcblxuXHRcdFx0cmVzZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0XHRsb2NrZWQgPSBmYWxzZTtcblxuXHRcdFx0XHRjdXJyZW50U3RlbmNpbE1hc2sgPSBudWxsO1xuXHRcdFx0XHRjdXJyZW50U3RlbmNpbEZ1bmMgPSBudWxsO1xuXHRcdFx0XHRjdXJyZW50U3RlbmNpbFJlZiA9IG51bGw7XG5cdFx0XHRcdGN1cnJlbnRTdGVuY2lsRnVuY01hc2sgPSBudWxsO1xuXHRcdFx0XHRjdXJyZW50U3RlbmNpbEZhaWwgPSBudWxsO1xuXHRcdFx0XHRjdXJyZW50U3RlbmNpbFpGYWlsID0gbnVsbDtcblx0XHRcdFx0Y3VycmVudFN0ZW5jaWxaUGFzcyA9IG51bGw7XG5cdFx0XHRcdGN1cnJlbnRTdGVuY2lsQ2xlYXIgPSBudWxsO1xuXG5cdFx0XHR9XG5cblx0XHR9O1xuXG5cdH1cblxuXHQvL1xuXG5cdHZhciBjb2xvckJ1ZmZlciA9IG5ldyBDb2xvckJ1ZmZlcigpO1xuXHR2YXIgZGVwdGhCdWZmZXIgPSBuZXcgRGVwdGhCdWZmZXIoKTtcblx0dmFyIHN0ZW5jaWxCdWZmZXIgPSBuZXcgU3RlbmNpbEJ1ZmZlcigpO1xuXG5cdHZhciBtYXhWZXJ0ZXhBdHRyaWJ1dGVzID0gZ2wuZ2V0UGFyYW1ldGVyKCBnbC5NQVhfVkVSVEVYX0FUVFJJQlMgKTtcblx0dmFyIG5ld0F0dHJpYnV0ZXMgPSBuZXcgVWludDhBcnJheSggbWF4VmVydGV4QXR0cmlidXRlcyApO1xuXHR2YXIgZW5hYmxlZEF0dHJpYnV0ZXMgPSBuZXcgVWludDhBcnJheSggbWF4VmVydGV4QXR0cmlidXRlcyApO1xuXHR2YXIgYXR0cmlidXRlRGl2aXNvcnMgPSBuZXcgVWludDhBcnJheSggbWF4VmVydGV4QXR0cmlidXRlcyApO1xuXG5cdHZhciBjYXBhYmlsaXRpZXMgPSB7fTtcblxuXHR2YXIgY29tcHJlc3NlZFRleHR1cmVGb3JtYXRzID0gbnVsbDtcblxuXHR2YXIgY3VycmVudFByb2dyYW0gPSBudWxsO1xuXG5cdHZhciBjdXJyZW50QmxlbmRpbmcgPSBudWxsO1xuXHR2YXIgY3VycmVudEJsZW5kRXF1YXRpb24gPSBudWxsO1xuXHR2YXIgY3VycmVudEJsZW5kU3JjID0gbnVsbDtcblx0dmFyIGN1cnJlbnRCbGVuZERzdCA9IG51bGw7XG5cdHZhciBjdXJyZW50QmxlbmRFcXVhdGlvbkFscGhhID0gbnVsbDtcblx0dmFyIGN1cnJlbnRCbGVuZFNyY0FscGhhID0gbnVsbDtcblx0dmFyIGN1cnJlbnRCbGVuZERzdEFscGhhID0gbnVsbDtcblx0dmFyIGN1cnJlbnRQcmVtdWx0aXBsZWRBbHBoYSA9IGZhbHNlO1xuXG5cdHZhciBjdXJyZW50RmxpcFNpZGVkID0gbnVsbDtcblx0dmFyIGN1cnJlbnRDdWxsRmFjZSA9IG51bGw7XG5cblx0dmFyIGN1cnJlbnRMaW5lV2lkdGggPSBudWxsO1xuXG5cdHZhciBjdXJyZW50UG9seWdvbk9mZnNldEZhY3RvciA9IG51bGw7XG5cdHZhciBjdXJyZW50UG9seWdvbk9mZnNldFVuaXRzID0gbnVsbDtcblxuXHR2YXIgbWF4VGV4dHVyZXMgPSBnbC5nZXRQYXJhbWV0ZXIoIGdsLk1BWF9DT01CSU5FRF9URVhUVVJFX0lNQUdFX1VOSVRTICk7XG5cblx0dmFyIGxpbmVXaWR0aEF2YWlsYWJsZSA9IGZhbHNlO1xuXHR2YXIgdmVyc2lvbiA9IDA7XG5cdHZhciBnbFZlcnNpb24gPSBnbC5nZXRQYXJhbWV0ZXIoIGdsLlZFUlNJT04gKTtcblxuXHRpZiAoIGdsVmVyc2lvbi5pbmRleE9mKCAnV2ViR0wnICkgIT09IC0gMSApIHtcblxuXHRcdHZlcnNpb24gPSBwYXJzZUZsb2F0KCAvXldlYkdMXFwgKFswLTldKS8uZXhlYyggZ2xWZXJzaW9uIClbIDEgXSApO1xuXHRcdGxpbmVXaWR0aEF2YWlsYWJsZSA9ICggdmVyc2lvbiA+PSAxLjAgKTtcblxuXHR9IGVsc2UgaWYgKCBnbFZlcnNpb24uaW5kZXhPZiggJ09wZW5HTCBFUycgKSAhPT0gLSAxICkge1xuXG5cdFx0dmVyc2lvbiA9IHBhcnNlRmxvYXQoIC9eT3BlbkdMXFwgRVNcXCAoWzAtOV0pLy5leGVjKCBnbFZlcnNpb24gKVsgMSBdICk7XG5cdFx0bGluZVdpZHRoQXZhaWxhYmxlID0gKCB2ZXJzaW9uID49IDIuMCApO1xuXG5cdH1cblxuXHR2YXIgY3VycmVudFRleHR1cmVTbG90ID0gbnVsbDtcblx0dmFyIGN1cnJlbnRCb3VuZFRleHR1cmVzID0ge307XG5cblx0dmFyIGN1cnJlbnRTY2lzc29yID0gbmV3IFZlY3RvcjQoKTtcblx0dmFyIGN1cnJlbnRWaWV3cG9ydCA9IG5ldyBWZWN0b3I0KCk7XG5cblx0ZnVuY3Rpb24gY3JlYXRlVGV4dHVyZSggdHlwZSwgdGFyZ2V0LCBjb3VudCApIHtcblxuXHRcdHZhciBkYXRhID0gbmV3IFVpbnQ4QXJyYXkoIDQgKTsgLy8gNCBpcyByZXF1aXJlZCB0byBtYXRjaCBkZWZhdWx0IHVucGFjayBhbGlnbm1lbnQgb2YgNC5cblx0XHR2YXIgdGV4dHVyZSA9IGdsLmNyZWF0ZVRleHR1cmUoKTtcblxuXHRcdGdsLmJpbmRUZXh0dXJlKCB0eXBlLCB0ZXh0dXJlICk7XG5cdFx0Z2wudGV4UGFyYW1ldGVyaSggdHlwZSwgZ2wuVEVYVFVSRV9NSU5fRklMVEVSLCBnbC5ORUFSRVNUICk7XG5cdFx0Z2wudGV4UGFyYW1ldGVyaSggdHlwZSwgZ2wuVEVYVFVSRV9NQUdfRklMVEVSLCBnbC5ORUFSRVNUICk7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBjb3VudDsgaSArKyApIHtcblxuXHRcdFx0Z2wudGV4SW1hZ2UyRCggdGFyZ2V0ICsgaSwgMCwgZ2wuUkdCQSwgMSwgMSwgMCwgZ2wuUkdCQSwgZ2wuVU5TSUdORURfQllURSwgZGF0YSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRleHR1cmU7XG5cblx0fVxuXG5cdHZhciBlbXB0eVRleHR1cmVzID0ge307XG5cdGVtcHR5VGV4dHVyZXNbIGdsLlRFWFRVUkVfMkQgXSA9IGNyZWF0ZVRleHR1cmUoIGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfMkQsIDEgKTtcblx0ZW1wdHlUZXh0dXJlc1sgZ2wuVEVYVFVSRV9DVUJFX01BUCBdID0gY3JlYXRlVGV4dHVyZSggZ2wuVEVYVFVSRV9DVUJFX01BUCwgZ2wuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YLCA2ICk7XG5cblx0Ly8gaW5pdFxuXG5cdGNvbG9yQnVmZmVyLnNldENsZWFyKCAwLCAwLCAwLCAxICk7XG5cdGRlcHRoQnVmZmVyLnNldENsZWFyKCAxICk7XG5cdHN0ZW5jaWxCdWZmZXIuc2V0Q2xlYXIoIDAgKTtcblxuXHRlbmFibGUoIGdsLkRFUFRIX1RFU1QgKTtcblx0ZGVwdGhCdWZmZXIuc2V0RnVuYyggTGVzc0VxdWFsRGVwdGggKTtcblxuXHRzZXRGbGlwU2lkZWQoIGZhbHNlICk7XG5cdHNldEN1bGxGYWNlKCBDdWxsRmFjZUJhY2sgKTtcblx0ZW5hYmxlKCBnbC5DVUxMX0ZBQ0UgKTtcblxuXHRlbmFibGUoIGdsLkJMRU5EICk7XG5cdHNldEJsZW5kaW5nKCBOb3JtYWxCbGVuZGluZyApO1xuXG5cdC8vXG5cblx0ZnVuY3Rpb24gaW5pdEF0dHJpYnV0ZXMoKSB7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBuZXdBdHRyaWJ1dGVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdG5ld0F0dHJpYnV0ZXNbIGkgXSA9IDA7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGVuYWJsZUF0dHJpYnV0ZSggYXR0cmlidXRlICkge1xuXG5cdFx0bmV3QXR0cmlidXRlc1sgYXR0cmlidXRlIF0gPSAxO1xuXG5cdFx0aWYgKCBlbmFibGVkQXR0cmlidXRlc1sgYXR0cmlidXRlIF0gPT09IDAgKSB7XG5cblx0XHRcdGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KCBhdHRyaWJ1dGUgKTtcblx0XHRcdGVuYWJsZWRBdHRyaWJ1dGVzWyBhdHRyaWJ1dGUgXSA9IDE7XG5cblx0XHR9XG5cblx0XHRpZiAoIGF0dHJpYnV0ZURpdmlzb3JzWyBhdHRyaWJ1dGUgXSAhPT0gMCApIHtcblxuXHRcdFx0dmFyIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCAnQU5HTEVfaW5zdGFuY2VkX2FycmF5cycgKTtcblxuXHRcdFx0ZXh0ZW5zaW9uLnZlcnRleEF0dHJpYkRpdmlzb3JBTkdMRSggYXR0cmlidXRlLCAwICk7XG5cdFx0XHRhdHRyaWJ1dGVEaXZpc29yc1sgYXR0cmlidXRlIF0gPSAwO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBlbmFibGVBdHRyaWJ1dGVBbmREaXZpc29yKCBhdHRyaWJ1dGUsIG1lc2hQZXJBdHRyaWJ1dGUgKSB7XG5cblx0XHRuZXdBdHRyaWJ1dGVzWyBhdHRyaWJ1dGUgXSA9IDE7XG5cblx0XHRpZiAoIGVuYWJsZWRBdHRyaWJ1dGVzWyBhdHRyaWJ1dGUgXSA9PT0gMCApIHtcblxuXHRcdFx0Z2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoIGF0dHJpYnV0ZSApO1xuXHRcdFx0ZW5hYmxlZEF0dHJpYnV0ZXNbIGF0dHJpYnV0ZSBdID0gMTtcblxuXHRcdH1cblxuXHRcdGlmICggYXR0cmlidXRlRGl2aXNvcnNbIGF0dHJpYnV0ZSBdICE9PSBtZXNoUGVyQXR0cmlidXRlICkge1xuXG5cdFx0XHR2YXIgZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdBTkdMRV9pbnN0YW5jZWRfYXJyYXlzJyApO1xuXG5cdFx0XHRleHRlbnNpb24udmVydGV4QXR0cmliRGl2aXNvckFOR0xFKCBhdHRyaWJ1dGUsIG1lc2hQZXJBdHRyaWJ1dGUgKTtcblx0XHRcdGF0dHJpYnV0ZURpdmlzb3JzWyBhdHRyaWJ1dGUgXSA9IG1lc2hQZXJBdHRyaWJ1dGU7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGRpc2FibGVVbnVzZWRBdHRyaWJ1dGVzKCkge1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gZW5hYmxlZEF0dHJpYnV0ZXMubGVuZ3RoOyBpICE9PSBsOyArKyBpICkge1xuXG5cdFx0XHRpZiAoIGVuYWJsZWRBdHRyaWJ1dGVzWyBpIF0gIT09IG5ld0F0dHJpYnV0ZXNbIGkgXSApIHtcblxuXHRcdFx0XHRnbC5kaXNhYmxlVmVydGV4QXR0cmliQXJyYXkoIGkgKTtcblx0XHRcdFx0ZW5hYmxlZEF0dHJpYnV0ZXNbIGkgXSA9IDA7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gZW5hYmxlKCBpZCApIHtcblxuXHRcdGlmICggY2FwYWJpbGl0aWVzWyBpZCBdICE9PSB0cnVlICkge1xuXG5cdFx0XHRnbC5lbmFibGUoIGlkICk7XG5cdFx0XHRjYXBhYmlsaXRpZXNbIGlkIF0gPSB0cnVlO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBkaXNhYmxlKCBpZCApIHtcblxuXHRcdGlmICggY2FwYWJpbGl0aWVzWyBpZCBdICE9PSBmYWxzZSApIHtcblxuXHRcdFx0Z2wuZGlzYWJsZSggaWQgKTtcblx0XHRcdGNhcGFiaWxpdGllc1sgaWQgXSA9IGZhbHNlO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBnZXRDb21wcmVzc2VkVGV4dHVyZUZvcm1hdHMoKSB7XG5cblx0XHRpZiAoIGNvbXByZXNzZWRUZXh0dXJlRm9ybWF0cyA9PT0gbnVsbCApIHtcblxuXHRcdFx0Y29tcHJlc3NlZFRleHR1cmVGb3JtYXRzID0gW107XG5cblx0XHRcdGlmICggZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfcHZydGMnICkgfHxcblx0XHRcdCAgICAgZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0YycgKSB8fFxuXHRcdFx0ICAgICBleHRlbnNpb25zLmdldCggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9ldGMxJyApIHx8XG5cdFx0XHQgICAgIGV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX2FzdGMnICkgKSB7XG5cblx0XHRcdFx0dmFyIGZvcm1hdHMgPSBnbC5nZXRQYXJhbWV0ZXIoIGdsLkNPTVBSRVNTRURfVEVYVFVSRV9GT1JNQVRTICk7XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgZm9ybWF0cy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRjb21wcmVzc2VkVGV4dHVyZUZvcm1hdHMucHVzaCggZm9ybWF0c1sgaSBdICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gY29tcHJlc3NlZFRleHR1cmVGb3JtYXRzO1xuXG5cdH1cblxuXHRmdW5jdGlvbiB1c2VQcm9ncmFtKCBwcm9ncmFtICkge1xuXG5cdFx0aWYgKCBjdXJyZW50UHJvZ3JhbSAhPT0gcHJvZ3JhbSApIHtcblxuXHRcdFx0Z2wudXNlUHJvZ3JhbSggcHJvZ3JhbSApO1xuXG5cdFx0XHRjdXJyZW50UHJvZ3JhbSA9IHByb2dyYW07XG5cblx0XHRcdHJldHVybiB0cnVlO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBzZXRCbGVuZGluZyggYmxlbmRpbmcsIGJsZW5kRXF1YXRpb24sIGJsZW5kU3JjLCBibGVuZERzdCwgYmxlbmRFcXVhdGlvbkFscGhhLCBibGVuZFNyY0FscGhhLCBibGVuZERzdEFscGhhLCBwcmVtdWx0aXBsaWVkQWxwaGEgKSB7XG5cblx0XHRpZiAoIGJsZW5kaW5nICE9PSBOb0JsZW5kaW5nICkge1xuXG5cdFx0XHRlbmFibGUoIGdsLkJMRU5EICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRkaXNhYmxlKCBnbC5CTEVORCApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBibGVuZGluZyAhPT0gQ3VzdG9tQmxlbmRpbmcgKSB7XG5cblx0XHRcdGlmICggYmxlbmRpbmcgIT09IGN1cnJlbnRCbGVuZGluZyB8fCBwcmVtdWx0aXBsaWVkQWxwaGEgIT09IGN1cnJlbnRQcmVtdWx0aXBsZWRBbHBoYSApIHtcblxuXHRcdFx0XHRzd2l0Y2ggKCBibGVuZGluZyApIHtcblxuXHRcdFx0XHRcdGNhc2UgQWRkaXRpdmVCbGVuZGluZzpcblxuXHRcdFx0XHRcdFx0aWYgKCBwcmVtdWx0aXBsaWVkQWxwaGEgKSB7XG5cblx0XHRcdFx0XHRcdFx0Z2wuYmxlbmRFcXVhdGlvblNlcGFyYXRlKCBnbC5GVU5DX0FERCwgZ2wuRlVOQ19BREQgKTtcblx0XHRcdFx0XHRcdFx0Z2wuYmxlbmRGdW5jU2VwYXJhdGUoIGdsLk9ORSwgZ2wuT05FLCBnbC5PTkUsIGdsLk9ORSApO1xuXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdGdsLmJsZW5kRXF1YXRpb24oIGdsLkZVTkNfQUREICk7XG5cdFx0XHRcdFx0XHRcdGdsLmJsZW5kRnVuYyggZ2wuU1JDX0FMUEhBLCBnbC5PTkUgKTtcblxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlIFN1YnRyYWN0aXZlQmxlbmRpbmc6XG5cblx0XHRcdFx0XHRcdGlmICggcHJlbXVsdGlwbGllZEFscGhhICkge1xuXG5cdFx0XHRcdFx0XHRcdGdsLmJsZW5kRXF1YXRpb25TZXBhcmF0ZSggZ2wuRlVOQ19BREQsIGdsLkZVTkNfQUREICk7XG5cdFx0XHRcdFx0XHRcdGdsLmJsZW5kRnVuY1NlcGFyYXRlKCBnbC5aRVJPLCBnbC5aRVJPLCBnbC5PTkVfTUlOVVNfU1JDX0NPTE9SLCBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBICk7XG5cblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdFx0Z2wuYmxlbmRFcXVhdGlvbiggZ2wuRlVOQ19BREQgKTtcblx0XHRcdFx0XHRcdFx0Z2wuYmxlbmRGdW5jKCBnbC5aRVJPLCBnbC5PTkVfTUlOVVNfU1JDX0NPTE9SICk7XG5cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSBNdWx0aXBseUJsZW5kaW5nOlxuXG5cdFx0XHRcdFx0XHRpZiAoIHByZW11bHRpcGxpZWRBbHBoYSApIHtcblxuXHRcdFx0XHRcdFx0XHRnbC5ibGVuZEVxdWF0aW9uU2VwYXJhdGUoIGdsLkZVTkNfQURELCBnbC5GVU5DX0FERCApO1xuXHRcdFx0XHRcdFx0XHRnbC5ibGVuZEZ1bmNTZXBhcmF0ZSggZ2wuWkVSTywgZ2wuU1JDX0NPTE9SLCBnbC5aRVJPLCBnbC5TUkNfQUxQSEEgKTtcblxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0XHRnbC5ibGVuZEVxdWF0aW9uKCBnbC5GVU5DX0FERCApO1xuXHRcdFx0XHRcdFx0XHRnbC5ibGVuZEZ1bmMoIGdsLlpFUk8sIGdsLlNSQ19DT0xPUiApO1xuXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGRlZmF1bHQ6XG5cblx0XHRcdFx0XHRcdGlmICggcHJlbXVsdGlwbGllZEFscGhhICkge1xuXG5cdFx0XHRcdFx0XHRcdGdsLmJsZW5kRXF1YXRpb25TZXBhcmF0ZSggZ2wuRlVOQ19BREQsIGdsLkZVTkNfQUREICk7XG5cdFx0XHRcdFx0XHRcdGdsLmJsZW5kRnVuY1NlcGFyYXRlKCBnbC5PTkUsIGdsLk9ORV9NSU5VU19TUkNfQUxQSEEsIGdsLk9ORSwgZ2wuT05FX01JTlVTX1NSQ19BTFBIQSApO1xuXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdGdsLmJsZW5kRXF1YXRpb25TZXBhcmF0ZSggZ2wuRlVOQ19BREQsIGdsLkZVTkNfQUREICk7XG5cdFx0XHRcdFx0XHRcdGdsLmJsZW5kRnVuY1NlcGFyYXRlKCBnbC5TUkNfQUxQSEEsIGdsLk9ORV9NSU5VU19TUkNfQUxQSEEsIGdsLk9ORSwgZ2wuT05FX01JTlVTX1NSQ19BTFBIQSApO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdGN1cnJlbnRCbGVuZEVxdWF0aW9uID0gbnVsbDtcblx0XHRcdGN1cnJlbnRCbGVuZFNyYyA9IG51bGw7XG5cdFx0XHRjdXJyZW50QmxlbmREc3QgPSBudWxsO1xuXHRcdFx0Y3VycmVudEJsZW5kRXF1YXRpb25BbHBoYSA9IG51bGw7XG5cdFx0XHRjdXJyZW50QmxlbmRTcmNBbHBoYSA9IG51bGw7XG5cdFx0XHRjdXJyZW50QmxlbmREc3RBbHBoYSA9IG51bGw7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRibGVuZEVxdWF0aW9uQWxwaGEgPSBibGVuZEVxdWF0aW9uQWxwaGEgfHwgYmxlbmRFcXVhdGlvbjtcblx0XHRcdGJsZW5kU3JjQWxwaGEgPSBibGVuZFNyY0FscGhhIHx8IGJsZW5kU3JjO1xuXHRcdFx0YmxlbmREc3RBbHBoYSA9IGJsZW5kRHN0QWxwaGEgfHwgYmxlbmREc3Q7XG5cblx0XHRcdGlmICggYmxlbmRFcXVhdGlvbiAhPT0gY3VycmVudEJsZW5kRXF1YXRpb24gfHwgYmxlbmRFcXVhdGlvbkFscGhhICE9PSBjdXJyZW50QmxlbmRFcXVhdGlvbkFscGhhICkge1xuXG5cdFx0XHRcdGdsLmJsZW5kRXF1YXRpb25TZXBhcmF0ZSggdXRpbHMuY29udmVydCggYmxlbmRFcXVhdGlvbiApLCB1dGlscy5jb252ZXJ0KCBibGVuZEVxdWF0aW9uQWxwaGEgKSApO1xuXG5cdFx0XHRcdGN1cnJlbnRCbGVuZEVxdWF0aW9uID0gYmxlbmRFcXVhdGlvbjtcblx0XHRcdFx0Y3VycmVudEJsZW5kRXF1YXRpb25BbHBoYSA9IGJsZW5kRXF1YXRpb25BbHBoYTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGJsZW5kU3JjICE9PSBjdXJyZW50QmxlbmRTcmMgfHwgYmxlbmREc3QgIT09IGN1cnJlbnRCbGVuZERzdCB8fCBibGVuZFNyY0FscGhhICE9PSBjdXJyZW50QmxlbmRTcmNBbHBoYSB8fCBibGVuZERzdEFscGhhICE9PSBjdXJyZW50QmxlbmREc3RBbHBoYSApIHtcblxuXHRcdFx0XHRnbC5ibGVuZEZ1bmNTZXBhcmF0ZSggdXRpbHMuY29udmVydCggYmxlbmRTcmMgKSwgdXRpbHMuY29udmVydCggYmxlbmREc3QgKSwgdXRpbHMuY29udmVydCggYmxlbmRTcmNBbHBoYSApLCB1dGlscy5jb252ZXJ0KCBibGVuZERzdEFscGhhICkgKTtcblxuXHRcdFx0XHRjdXJyZW50QmxlbmRTcmMgPSBibGVuZFNyYztcblx0XHRcdFx0Y3VycmVudEJsZW5kRHN0ID0gYmxlbmREc3Q7XG5cdFx0XHRcdGN1cnJlbnRCbGVuZFNyY0FscGhhID0gYmxlbmRTcmNBbHBoYTtcblx0XHRcdFx0Y3VycmVudEJsZW5kRHN0QWxwaGEgPSBibGVuZERzdEFscGhhO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRjdXJyZW50QmxlbmRpbmcgPSBibGVuZGluZztcblx0XHRjdXJyZW50UHJlbXVsdGlwbGVkQWxwaGEgPSBwcmVtdWx0aXBsaWVkQWxwaGE7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHNldE1hdGVyaWFsKCBtYXRlcmlhbCwgZnJvbnRGYWNlQ1cgKSB7XG5cblx0XHRtYXRlcmlhbC5zaWRlID09PSBEb3VibGVTaWRlXG5cdFx0XHQ/IGRpc2FibGUoIGdsLkNVTExfRkFDRSApXG5cdFx0XHQ6IGVuYWJsZSggZ2wuQ1VMTF9GQUNFICk7XG5cblx0XHR2YXIgZmxpcFNpZGVkID0gKCBtYXRlcmlhbC5zaWRlID09PSBCYWNrU2lkZSApO1xuXHRcdGlmICggZnJvbnRGYWNlQ1cgKSBmbGlwU2lkZWQgPSAhIGZsaXBTaWRlZDtcblxuXHRcdHNldEZsaXBTaWRlZCggZmxpcFNpZGVkICk7XG5cblx0XHRtYXRlcmlhbC50cmFuc3BhcmVudCA9PT0gdHJ1ZVxuXHRcdFx0PyBzZXRCbGVuZGluZyggbWF0ZXJpYWwuYmxlbmRpbmcsIG1hdGVyaWFsLmJsZW5kRXF1YXRpb24sIG1hdGVyaWFsLmJsZW5kU3JjLCBtYXRlcmlhbC5ibGVuZERzdCwgbWF0ZXJpYWwuYmxlbmRFcXVhdGlvbkFscGhhLCBtYXRlcmlhbC5ibGVuZFNyY0FscGhhLCBtYXRlcmlhbC5ibGVuZERzdEFscGhhLCBtYXRlcmlhbC5wcmVtdWx0aXBsaWVkQWxwaGEgKVxuXHRcdFx0OiBzZXRCbGVuZGluZyggTm9CbGVuZGluZyApO1xuXG5cdFx0ZGVwdGhCdWZmZXIuc2V0RnVuYyggbWF0ZXJpYWwuZGVwdGhGdW5jICk7XG5cdFx0ZGVwdGhCdWZmZXIuc2V0VGVzdCggbWF0ZXJpYWwuZGVwdGhUZXN0ICk7XG5cdFx0ZGVwdGhCdWZmZXIuc2V0TWFzayggbWF0ZXJpYWwuZGVwdGhXcml0ZSApO1xuXHRcdGNvbG9yQnVmZmVyLnNldE1hc2soIG1hdGVyaWFsLmNvbG9yV3JpdGUgKTtcblxuXHRcdHNldFBvbHlnb25PZmZzZXQoIG1hdGVyaWFsLnBvbHlnb25PZmZzZXQsIG1hdGVyaWFsLnBvbHlnb25PZmZzZXRGYWN0b3IsIG1hdGVyaWFsLnBvbHlnb25PZmZzZXRVbml0cyApO1xuXG5cdH1cblxuXHQvL1xuXG5cdGZ1bmN0aW9uIHNldEZsaXBTaWRlZCggZmxpcFNpZGVkICkge1xuXG5cdFx0aWYgKCBjdXJyZW50RmxpcFNpZGVkICE9PSBmbGlwU2lkZWQgKSB7XG5cblx0XHRcdGlmICggZmxpcFNpZGVkICkge1xuXG5cdFx0XHRcdGdsLmZyb250RmFjZSggZ2wuQ1cgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRnbC5mcm9udEZhY2UoIGdsLkNDVyApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGN1cnJlbnRGbGlwU2lkZWQgPSBmbGlwU2lkZWQ7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHNldEN1bGxGYWNlKCBjdWxsRmFjZSApIHtcblxuXHRcdGlmICggY3VsbEZhY2UgIT09IEN1bGxGYWNlTm9uZSApIHtcblxuXHRcdFx0ZW5hYmxlKCBnbC5DVUxMX0ZBQ0UgKTtcblxuXHRcdFx0aWYgKCBjdWxsRmFjZSAhPT0gY3VycmVudEN1bGxGYWNlICkge1xuXG5cdFx0XHRcdGlmICggY3VsbEZhY2UgPT09IEN1bGxGYWNlQmFjayApIHtcblxuXHRcdFx0XHRcdGdsLmN1bGxGYWNlKCBnbC5CQUNLICk7XG5cblx0XHRcdFx0fSBlbHNlIGlmICggY3VsbEZhY2UgPT09IEN1bGxGYWNlRnJvbnQgKSB7XG5cblx0XHRcdFx0XHRnbC5jdWxsRmFjZSggZ2wuRlJPTlQgKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Z2wuY3VsbEZhY2UoIGdsLkZST05UX0FORF9CQUNLICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRkaXNhYmxlKCBnbC5DVUxMX0ZBQ0UgKTtcblxuXHRcdH1cblxuXHRcdGN1cnJlbnRDdWxsRmFjZSA9IGN1bGxGYWNlO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBzZXRMaW5lV2lkdGgoIHdpZHRoICkge1xuXG5cdFx0aWYgKCB3aWR0aCAhPT0gY3VycmVudExpbmVXaWR0aCApIHtcblxuXHRcdFx0aWYgKCBsaW5lV2lkdGhBdmFpbGFibGUgKSBnbC5saW5lV2lkdGgoIHdpZHRoICk7XG5cblx0XHRcdGN1cnJlbnRMaW5lV2lkdGggPSB3aWR0aDtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gc2V0UG9seWdvbk9mZnNldCggcG9seWdvbk9mZnNldCwgZmFjdG9yLCB1bml0cyApIHtcblxuXHRcdGlmICggcG9seWdvbk9mZnNldCApIHtcblxuXHRcdFx0ZW5hYmxlKCBnbC5QT0xZR09OX09GRlNFVF9GSUxMICk7XG5cblx0XHRcdGlmICggY3VycmVudFBvbHlnb25PZmZzZXRGYWN0b3IgIT09IGZhY3RvciB8fCBjdXJyZW50UG9seWdvbk9mZnNldFVuaXRzICE9PSB1bml0cyApIHtcblxuXHRcdFx0XHRnbC5wb2x5Z29uT2Zmc2V0KCBmYWN0b3IsIHVuaXRzICk7XG5cblx0XHRcdFx0Y3VycmVudFBvbHlnb25PZmZzZXRGYWN0b3IgPSBmYWN0b3I7XG5cdFx0XHRcdGN1cnJlbnRQb2x5Z29uT2Zmc2V0VW5pdHMgPSB1bml0cztcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0ZGlzYWJsZSggZ2wuUE9MWUdPTl9PRkZTRVRfRklMTCApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBzZXRTY2lzc29yVGVzdCggc2Npc3NvclRlc3QgKSB7XG5cblx0XHRpZiAoIHNjaXNzb3JUZXN0ICkge1xuXG5cdFx0XHRlbmFibGUoIGdsLlNDSVNTT1JfVEVTVCApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0ZGlzYWJsZSggZ2wuU0NJU1NPUl9URVNUICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIHRleHR1cmVcblxuXHRmdW5jdGlvbiBhY3RpdmVUZXh0dXJlKCB3ZWJnbFNsb3QgKSB7XG5cblx0XHRpZiAoIHdlYmdsU2xvdCA9PT0gdW5kZWZpbmVkICkgd2ViZ2xTbG90ID0gZ2wuVEVYVFVSRTAgKyBtYXhUZXh0dXJlcyAtIDE7XG5cblx0XHRpZiAoIGN1cnJlbnRUZXh0dXJlU2xvdCAhPT0gd2ViZ2xTbG90ICkge1xuXG5cdFx0XHRnbC5hY3RpdmVUZXh0dXJlKCB3ZWJnbFNsb3QgKTtcblx0XHRcdGN1cnJlbnRUZXh0dXJlU2xvdCA9IHdlYmdsU2xvdDtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gYmluZFRleHR1cmUoIHdlYmdsVHlwZSwgd2ViZ2xUZXh0dXJlICkge1xuXG5cdFx0aWYgKCBjdXJyZW50VGV4dHVyZVNsb3QgPT09IG51bGwgKSB7XG5cblx0XHRcdGFjdGl2ZVRleHR1cmUoKTtcblxuXHRcdH1cblxuXHRcdHZhciBib3VuZFRleHR1cmUgPSBjdXJyZW50Qm91bmRUZXh0dXJlc1sgY3VycmVudFRleHR1cmVTbG90IF07XG5cblx0XHRpZiAoIGJvdW5kVGV4dHVyZSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRib3VuZFRleHR1cmUgPSB7IHR5cGU6IHVuZGVmaW5lZCwgdGV4dHVyZTogdW5kZWZpbmVkIH07XG5cdFx0XHRjdXJyZW50Qm91bmRUZXh0dXJlc1sgY3VycmVudFRleHR1cmVTbG90IF0gPSBib3VuZFRleHR1cmU7XG5cblx0XHR9XG5cblx0XHRpZiAoIGJvdW5kVGV4dHVyZS50eXBlICE9PSB3ZWJnbFR5cGUgfHwgYm91bmRUZXh0dXJlLnRleHR1cmUgIT09IHdlYmdsVGV4dHVyZSApIHtcblxuXHRcdFx0Z2wuYmluZFRleHR1cmUoIHdlYmdsVHlwZSwgd2ViZ2xUZXh0dXJlIHx8IGVtcHR5VGV4dHVyZXNbIHdlYmdsVHlwZSBdICk7XG5cblx0XHRcdGJvdW5kVGV4dHVyZS50eXBlID0gd2ViZ2xUeXBlO1xuXHRcdFx0Ym91bmRUZXh0dXJlLnRleHR1cmUgPSB3ZWJnbFRleHR1cmU7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGNvbXByZXNzZWRUZXhJbWFnZTJEKCkge1xuXG5cdFx0dHJ5IHtcblxuXHRcdFx0Z2wuY29tcHJlc3NlZFRleEltYWdlMkQuYXBwbHkoIGdsLCBhcmd1bWVudHMgKTtcblxuXHRcdH0gY2F0Y2ggKCBlcnJvciApIHtcblxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdMU3RhdGU6JywgZXJyb3IgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gdGV4SW1hZ2UyRCgpIHtcblxuXHRcdHRyeSB7XG5cblx0XHRcdGdsLnRleEltYWdlMkQuYXBwbHkoIGdsLCBhcmd1bWVudHMgKTtcblxuXHRcdH0gY2F0Y2ggKCBlcnJvciApIHtcblxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdMU3RhdGU6JywgZXJyb3IgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0Ly9cblxuXHRmdW5jdGlvbiBzY2lzc29yKCBzY2lzc29yICkge1xuXG5cdFx0aWYgKCBjdXJyZW50U2Npc3Nvci5lcXVhbHMoIHNjaXNzb3IgKSA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdGdsLnNjaXNzb3IoIHNjaXNzb3IueCwgc2Npc3Nvci55LCBzY2lzc29yLnosIHNjaXNzb3IudyApO1xuXHRcdFx0Y3VycmVudFNjaXNzb3IuY29weSggc2Npc3NvciApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiB2aWV3cG9ydCggdmlld3BvcnQgKSB7XG5cblx0XHRpZiAoIGN1cnJlbnRWaWV3cG9ydC5lcXVhbHMoIHZpZXdwb3J0ICkgPT09IGZhbHNlICkge1xuXG5cdFx0XHRnbC52aWV3cG9ydCggdmlld3BvcnQueCwgdmlld3BvcnQueSwgdmlld3BvcnQueiwgdmlld3BvcnQudyApO1xuXHRcdFx0Y3VycmVudFZpZXdwb3J0LmNvcHkoIHZpZXdwb3J0ICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vXG5cblx0ZnVuY3Rpb24gcmVzZXQoKSB7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBlbmFibGVkQXR0cmlidXRlcy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdGlmICggZW5hYmxlZEF0dHJpYnV0ZXNbIGkgXSA9PT0gMSApIHtcblxuXHRcdFx0XHRnbC5kaXNhYmxlVmVydGV4QXR0cmliQXJyYXkoIGkgKTtcblx0XHRcdFx0ZW5hYmxlZEF0dHJpYnV0ZXNbIGkgXSA9IDA7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGNhcGFiaWxpdGllcyA9IHt9O1xuXG5cdFx0Y29tcHJlc3NlZFRleHR1cmVGb3JtYXRzID0gbnVsbDtcblxuXHRcdGN1cnJlbnRUZXh0dXJlU2xvdCA9IG51bGw7XG5cdFx0Y3VycmVudEJvdW5kVGV4dHVyZXMgPSB7fTtcblxuXHRcdGN1cnJlbnRQcm9ncmFtID0gbnVsbDtcblxuXHRcdGN1cnJlbnRCbGVuZGluZyA9IG51bGw7XG5cblx0XHRjdXJyZW50RmxpcFNpZGVkID0gbnVsbDtcblx0XHRjdXJyZW50Q3VsbEZhY2UgPSBudWxsO1xuXG5cdFx0Y29sb3JCdWZmZXIucmVzZXQoKTtcblx0XHRkZXB0aEJ1ZmZlci5yZXNldCgpO1xuXHRcdHN0ZW5jaWxCdWZmZXIucmVzZXQoKTtcblxuXHR9XG5cblx0cmV0dXJuIHtcblxuXHRcdGJ1ZmZlcnM6IHtcblx0XHRcdGNvbG9yOiBjb2xvckJ1ZmZlcixcblx0XHRcdGRlcHRoOiBkZXB0aEJ1ZmZlcixcblx0XHRcdHN0ZW5jaWw6IHN0ZW5jaWxCdWZmZXJcblx0XHR9LFxuXG5cdFx0aW5pdEF0dHJpYnV0ZXM6IGluaXRBdHRyaWJ1dGVzLFxuXHRcdGVuYWJsZUF0dHJpYnV0ZTogZW5hYmxlQXR0cmlidXRlLFxuXHRcdGVuYWJsZUF0dHJpYnV0ZUFuZERpdmlzb3I6IGVuYWJsZUF0dHJpYnV0ZUFuZERpdmlzb3IsXG5cdFx0ZGlzYWJsZVVudXNlZEF0dHJpYnV0ZXM6IGRpc2FibGVVbnVzZWRBdHRyaWJ1dGVzLFxuXHRcdGVuYWJsZTogZW5hYmxlLFxuXHRcdGRpc2FibGU6IGRpc2FibGUsXG5cdFx0Z2V0Q29tcHJlc3NlZFRleHR1cmVGb3JtYXRzOiBnZXRDb21wcmVzc2VkVGV4dHVyZUZvcm1hdHMsXG5cblx0XHR1c2VQcm9ncmFtOiB1c2VQcm9ncmFtLFxuXG5cdFx0c2V0QmxlbmRpbmc6IHNldEJsZW5kaW5nLFxuXHRcdHNldE1hdGVyaWFsOiBzZXRNYXRlcmlhbCxcblxuXHRcdHNldEZsaXBTaWRlZDogc2V0RmxpcFNpZGVkLFxuXHRcdHNldEN1bGxGYWNlOiBzZXRDdWxsRmFjZSxcblxuXHRcdHNldExpbmVXaWR0aDogc2V0TGluZVdpZHRoLFxuXHRcdHNldFBvbHlnb25PZmZzZXQ6IHNldFBvbHlnb25PZmZzZXQsXG5cblx0XHRzZXRTY2lzc29yVGVzdDogc2V0U2Npc3NvclRlc3QsXG5cblx0XHRhY3RpdmVUZXh0dXJlOiBhY3RpdmVUZXh0dXJlLFxuXHRcdGJpbmRUZXh0dXJlOiBiaW5kVGV4dHVyZSxcblx0XHRjb21wcmVzc2VkVGV4SW1hZ2UyRDogY29tcHJlc3NlZFRleEltYWdlMkQsXG5cdFx0dGV4SW1hZ2UyRDogdGV4SW1hZ2UyRCxcblxuXHRcdHNjaXNzb3I6IHNjaXNzb3IsXG5cdFx0dmlld3BvcnQ6IHZpZXdwb3J0LFxuXG5cdFx0cmVzZXQ6IHJlc2V0XG5cblx0fTtcblxufVxuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gV2ViR0xUZXh0dXJlcyggX2dsLCBleHRlbnNpb25zLCBzdGF0ZSwgcHJvcGVydGllcywgY2FwYWJpbGl0aWVzLCB1dGlscywgaW5mbyApIHtcblxuXHR2YXIgX2lzV2ViR0wyID0gKCB0eXBlb2YgV2ViR0wyUmVuZGVyaW5nQ29udGV4dCAhPT0gJ3VuZGVmaW5lZCcgJiYgX2dsIGluc3RhbmNlb2YgV2ViR0wyUmVuZGVyaW5nQ29udGV4dCApOyAvKiBnbG9iYWwgV2ViR0wyUmVuZGVyaW5nQ29udGV4dCAqL1xuXHR2YXIgX3ZpZGVvVGV4dHVyZXMgPSB7fTtcblx0dmFyIF9jYW52YXM7XG5cblx0Ly9cblxuXHRmdW5jdGlvbiBjbGFtcFRvTWF4U2l6ZSggaW1hZ2UsIG1heFNpemUgKSB7XG5cblx0XHRpZiAoIGltYWdlLndpZHRoID4gbWF4U2l6ZSB8fCBpbWFnZS5oZWlnaHQgPiBtYXhTaXplICkge1xuXG5cdFx0XHRpZiAoICdkYXRhJyBpbiBpbWFnZSApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBpbWFnZSBpbiBEYXRhVGV4dHVyZSBpcyB0b28gYmlnICgnICsgaW1hZ2Uud2lkdGggKyAneCcgKyBpbWFnZS5oZWlnaHQgKyAnKS4nICk7XG5cdFx0XHRcdHJldHVybjtcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBXYXJuaW5nOiBTY2FsaW5nIHRocm91Z2ggdGhlIGNhbnZhcyB3aWxsIG9ubHkgd29yayB3aXRoIGltYWdlcyB0aGF0IHVzZVxuXHRcdFx0Ly8gcHJlbXVsdGlwbGllZCBhbHBoYS5cblxuXHRcdFx0dmFyIHNjYWxlID0gbWF4U2l6ZSAvIE1hdGgubWF4KCBpbWFnZS53aWR0aCwgaW1hZ2UuaGVpZ2h0ICk7XG5cblx0XHRcdHZhciBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJywgJ2NhbnZhcycgKTtcblx0XHRcdGNhbnZhcy53aWR0aCA9IE1hdGguZmxvb3IoIGltYWdlLndpZHRoICogc2NhbGUgKTtcblx0XHRcdGNhbnZhcy5oZWlnaHQgPSBNYXRoLmZsb29yKCBpbWFnZS5oZWlnaHQgKiBzY2FsZSApO1xuXG5cdFx0XHR2YXIgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KCAnMmQnICk7XG5cdFx0XHRjb250ZXh0LmRyYXdJbWFnZSggaW1hZ2UsIDAsIDAsIGltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHQsIDAsIDAsIGNhbnZhcy53aWR0aCwgY2FudmFzLmhlaWdodCApO1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBpbWFnZSBpcyB0b28gYmlnICgnICsgaW1hZ2Uud2lkdGggKyAneCcgKyBpbWFnZS5oZWlnaHQgKyAnKS4gUmVzaXplZCB0byAnICsgY2FudmFzLndpZHRoICsgJ3gnICsgY2FudmFzLmhlaWdodCwgaW1hZ2UgKTtcblxuXHRcdFx0cmV0dXJuIGNhbnZhcztcblxuXHRcdH1cblxuXHRcdHJldHVybiBpbWFnZTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gaXNQb3dlck9mVHdvKCBpbWFnZSApIHtcblxuXHRcdHJldHVybiBfTWF0aC5pc1Bvd2VyT2ZUd28oIGltYWdlLndpZHRoICkgJiYgX01hdGguaXNQb3dlck9mVHdvKCBpbWFnZS5oZWlnaHQgKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gbWFrZVBvd2VyT2ZUd28oIGltYWdlICkge1xuXG5cdFx0aWYgKCBpbWFnZSBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnQgfHwgaW1hZ2UgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudCB8fCBpbWFnZSBpbnN0YW5jZW9mIEltYWdlQml0bWFwICkge1xuXG5cdFx0XHRpZiAoIF9jYW52YXMgPT09IHVuZGVmaW5lZCApIF9jYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJywgJ2NhbnZhcycgKTtcblxuXHRcdFx0X2NhbnZhcy53aWR0aCA9IF9NYXRoLmZsb29yUG93ZXJPZlR3byggaW1hZ2Uud2lkdGggKTtcblx0XHRcdF9jYW52YXMuaGVpZ2h0ID0gX01hdGguZmxvb3JQb3dlck9mVHdvKCBpbWFnZS5oZWlnaHQgKTtcblxuXHRcdFx0dmFyIGNvbnRleHQgPSBfY2FudmFzLmdldENvbnRleHQoICcyZCcgKTtcblx0XHRcdGNvbnRleHQuZHJhd0ltYWdlKCBpbWFnZSwgMCwgMCwgX2NhbnZhcy53aWR0aCwgX2NhbnZhcy5oZWlnaHQgKTtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogaW1hZ2UgaXMgbm90IHBvd2VyIG9mIHR3byAoJyArIGltYWdlLndpZHRoICsgJ3gnICsgaW1hZ2UuaGVpZ2h0ICsgJykuIFJlc2l6ZWQgdG8gJyArIF9jYW52YXMud2lkdGggKyAneCcgKyBfY2FudmFzLmhlaWdodCwgaW1hZ2UgKTtcblxuXHRcdFx0cmV0dXJuIF9jYW52YXM7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gaW1hZ2U7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHRleHR1cmVOZWVkc1Bvd2VyT2ZUd28oIHRleHR1cmUgKSB7XG5cblx0XHRyZXR1cm4gKCB0ZXh0dXJlLndyYXBTICE9PSBDbGFtcFRvRWRnZVdyYXBwaW5nIHx8IHRleHR1cmUud3JhcFQgIT09IENsYW1wVG9FZGdlV3JhcHBpbmcgKSB8fFxuXHRcdFx0KCB0ZXh0dXJlLm1pbkZpbHRlciAhPT0gTmVhcmVzdEZpbHRlciAmJiB0ZXh0dXJlLm1pbkZpbHRlciAhPT0gTGluZWFyRmlsdGVyICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHRleHR1cmVOZWVkc0dlbmVyYXRlTWlwbWFwcyggdGV4dHVyZSwgaXNQb3dlck9mVHdvICkge1xuXG5cdFx0cmV0dXJuIHRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzICYmIGlzUG93ZXJPZlR3byAmJlxuXHRcdFx0dGV4dHVyZS5taW5GaWx0ZXIgIT09IE5lYXJlc3RGaWx0ZXIgJiYgdGV4dHVyZS5taW5GaWx0ZXIgIT09IExpbmVhckZpbHRlcjtcblxuXHR9XG5cblx0ZnVuY3Rpb24gZ2VuZXJhdGVNaXBtYXAoIHRhcmdldCwgdGV4dHVyZSwgd2lkdGgsIGhlaWdodCApIHtcblxuXHRcdF9nbC5nZW5lcmF0ZU1pcG1hcCggdGFyZ2V0ICk7XG5cblx0XHR2YXIgdGV4dHVyZVByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggdGV4dHVyZSApO1xuXG5cdFx0Ly8gTm90ZTogTWF0aC5sb2coIHggKSAqIE1hdGguTE9HMkUgdXNlZCBpbnN0ZWFkIG9mIE1hdGgubG9nMiggeCApIHdoaWNoIGlzIG5vdCBzdXBwb3J0ZWQgYnkgSUUxMVxuXHRcdHRleHR1cmVQcm9wZXJ0aWVzLl9fbWF4TWlwTGV2ZWwgPSBNYXRoLmxvZyggTWF0aC5tYXgoIHdpZHRoLCBoZWlnaHQgKSApICogTWF0aC5MT0cyRTtcblxuXHR9XG5cblx0Ly8gRmFsbGJhY2sgZmlsdGVycyBmb3Igbm9uLXBvd2VyLW9mLTIgdGV4dHVyZXNcblxuXHRmdW5jdGlvbiBmaWx0ZXJGYWxsYmFjayggZiApIHtcblxuXHRcdGlmICggZiA9PT0gTmVhcmVzdEZpbHRlciB8fCBmID09PSBOZWFyZXN0TWlwTWFwTmVhcmVzdEZpbHRlciB8fCBmID09PSBOZWFyZXN0TWlwTWFwTGluZWFyRmlsdGVyICkge1xuXG5cdFx0XHRyZXR1cm4gX2dsLk5FQVJFU1Q7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gX2dsLkxJTkVBUjtcblxuXHR9XG5cblx0Ly9cblxuXHRmdW5jdGlvbiBvblRleHR1cmVEaXNwb3NlKCBldmVudCApIHtcblxuXHRcdHZhciB0ZXh0dXJlID0gZXZlbnQudGFyZ2V0O1xuXG5cdFx0dGV4dHVyZS5yZW1vdmVFdmVudExpc3RlbmVyKCAnZGlzcG9zZScsIG9uVGV4dHVyZURpc3Bvc2UgKTtcblxuXHRcdGRlYWxsb2NhdGVUZXh0dXJlKCB0ZXh0dXJlICk7XG5cblx0XHRpZiAoIHRleHR1cmUuaXNWaWRlb1RleHR1cmUgKSB7XG5cblx0XHRcdGRlbGV0ZSBfdmlkZW9UZXh0dXJlc1sgdGV4dHVyZS5pZCBdO1xuXG5cdFx0fVxuXG5cdFx0aW5mby5tZW1vcnkudGV4dHVyZXMgLS07XG5cblx0fVxuXG5cdGZ1bmN0aW9uIG9uUmVuZGVyVGFyZ2V0RGlzcG9zZSggZXZlbnQgKSB7XG5cblx0XHR2YXIgcmVuZGVyVGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuXG5cdFx0cmVuZGVyVGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoICdkaXNwb3NlJywgb25SZW5kZXJUYXJnZXREaXNwb3NlICk7XG5cblx0XHRkZWFsbG9jYXRlUmVuZGVyVGFyZ2V0KCByZW5kZXJUYXJnZXQgKTtcblxuXHRcdGluZm8ubWVtb3J5LnRleHR1cmVzIC0tO1xuXG5cdH1cblxuXHQvL1xuXG5cdGZ1bmN0aW9uIGRlYWxsb2NhdGVUZXh0dXJlKCB0ZXh0dXJlICkge1xuXG5cdFx0dmFyIHRleHR1cmVQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIHRleHR1cmUgKTtcblxuXHRcdGlmICggdGV4dHVyZS5pbWFnZSAmJiB0ZXh0dXJlUHJvcGVydGllcy5fX2ltYWdlX193ZWJnbFRleHR1cmVDdWJlICkge1xuXG5cdFx0XHQvLyBjdWJlIHRleHR1cmVcblxuXHRcdFx0X2dsLmRlbGV0ZVRleHR1cmUoIHRleHR1cmVQcm9wZXJ0aWVzLl9faW1hZ2VfX3dlYmdsVGV4dHVyZUN1YmUgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIDJEIHRleHR1cmVcblxuXHRcdFx0aWYgKCB0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsSW5pdCA9PT0gdW5kZWZpbmVkICkgcmV0dXJuO1xuXG5cdFx0XHRfZ2wuZGVsZXRlVGV4dHVyZSggdGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbFRleHR1cmUgKTtcblxuXHRcdH1cblxuXHRcdC8vIHJlbW92ZSBhbGwgd2ViZ2wgcHJvcGVydGllc1xuXHRcdHByb3BlcnRpZXMucmVtb3ZlKCB0ZXh0dXJlICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGRlYWxsb2NhdGVSZW5kZXJUYXJnZXQoIHJlbmRlclRhcmdldCApIHtcblxuXHRcdHZhciByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIHJlbmRlclRhcmdldCApO1xuXHRcdHZhciB0ZXh0dXJlUHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCByZW5kZXJUYXJnZXQudGV4dHVyZSApO1xuXG5cdFx0aWYgKCAhIHJlbmRlclRhcmdldCApIHJldHVybjtcblxuXHRcdGlmICggdGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbFRleHR1cmUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0X2dsLmRlbGV0ZVRleHR1cmUoIHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUgKSB7XG5cblx0XHRcdHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUuZGlzcG9zZSgpO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCByZW5kZXJUYXJnZXQuaXNXZWJHTFJlbmRlclRhcmdldEN1YmUgKSB7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IDY7IGkgKysgKSB7XG5cblx0XHRcdFx0X2dsLmRlbGV0ZUZyYW1lYnVmZmVyKCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlclsgaSBdICk7XG5cdFx0XHRcdGlmICggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRGVwdGhidWZmZXIgKSBfZ2wuZGVsZXRlUmVuZGVyYnVmZmVyKCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xEZXB0aGJ1ZmZlclsgaSBdICk7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdF9nbC5kZWxldGVGcmFtZWJ1ZmZlciggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXIgKTtcblx0XHRcdGlmICggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRGVwdGhidWZmZXIgKSBfZ2wuZGVsZXRlUmVuZGVyYnVmZmVyKCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xEZXB0aGJ1ZmZlciApO1xuXG5cdFx0fVxuXG5cdFx0cHJvcGVydGllcy5yZW1vdmUoIHJlbmRlclRhcmdldC50ZXh0dXJlICk7XG5cdFx0cHJvcGVydGllcy5yZW1vdmUoIHJlbmRlclRhcmdldCApO1xuXG5cdH1cblxuXHQvL1xuXG5cblxuXHRmdW5jdGlvbiBzZXRUZXh0dXJlMkQoIHRleHR1cmUsIHNsb3QgKSB7XG5cblx0XHR2YXIgdGV4dHVyZVByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggdGV4dHVyZSApO1xuXG5cdFx0aWYgKCB0ZXh0dXJlLmlzVmlkZW9UZXh0dXJlICkgdXBkYXRlVmlkZW9UZXh0dXJlKCB0ZXh0dXJlICk7XG5cblx0XHRpZiAoIHRleHR1cmUudmVyc2lvbiA+IDAgJiYgdGV4dHVyZVByb3BlcnRpZXMuX192ZXJzaW9uICE9PSB0ZXh0dXJlLnZlcnNpb24gKSB7XG5cblx0XHRcdHZhciBpbWFnZSA9IHRleHR1cmUuaW1hZ2U7XG5cblx0XHRcdGlmICggaW1hZ2UgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBUZXh0dXJlIG1hcmtlZCBmb3IgdXBkYXRlIGJ1dCBpbWFnZSBpcyB1bmRlZmluZWQnLCB0ZXh0dXJlICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIGltYWdlLmNvbXBsZXRlID09PSBmYWxzZSApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBUZXh0dXJlIG1hcmtlZCBmb3IgdXBkYXRlIGJ1dCBpbWFnZSBpcyBpbmNvbXBsZXRlJywgdGV4dHVyZSApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHVwbG9hZFRleHR1cmUoIHRleHR1cmVQcm9wZXJ0aWVzLCB0ZXh0dXJlLCBzbG90ICk7XG5cdFx0XHRcdHJldHVybjtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0c3RhdGUuYWN0aXZlVGV4dHVyZSggX2dsLlRFWFRVUkUwICsgc2xvdCApO1xuXHRcdHN0YXRlLmJpbmRUZXh0dXJlKCBfZ2wuVEVYVFVSRV8yRCwgdGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbFRleHR1cmUgKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gc2V0VGV4dHVyZUN1YmUoIHRleHR1cmUsIHNsb3QgKSB7XG5cblx0XHR2YXIgdGV4dHVyZVByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggdGV4dHVyZSApO1xuXG5cdFx0aWYgKCB0ZXh0dXJlLmltYWdlLmxlbmd0aCA9PT0gNiApIHtcblxuXHRcdFx0aWYgKCB0ZXh0dXJlLnZlcnNpb24gPiAwICYmIHRleHR1cmVQcm9wZXJ0aWVzLl9fdmVyc2lvbiAhPT0gdGV4dHVyZS52ZXJzaW9uICkge1xuXG5cdFx0XHRcdGlmICggISB0ZXh0dXJlUHJvcGVydGllcy5fX2ltYWdlX193ZWJnbFRleHR1cmVDdWJlICkge1xuXG5cdFx0XHRcdFx0dGV4dHVyZS5hZGRFdmVudExpc3RlbmVyKCAnZGlzcG9zZScsIG9uVGV4dHVyZURpc3Bvc2UgKTtcblxuXHRcdFx0XHRcdHRleHR1cmVQcm9wZXJ0aWVzLl9faW1hZ2VfX3dlYmdsVGV4dHVyZUN1YmUgPSBfZ2wuY3JlYXRlVGV4dHVyZSgpO1xuXG5cdFx0XHRcdFx0aW5mby5tZW1vcnkudGV4dHVyZXMgKys7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHN0YXRlLmFjdGl2ZVRleHR1cmUoIF9nbC5URVhUVVJFMCArIHNsb3QgKTtcblx0XHRcdFx0c3RhdGUuYmluZFRleHR1cmUoIF9nbC5URVhUVVJFX0NVQkVfTUFQLCB0ZXh0dXJlUHJvcGVydGllcy5fX2ltYWdlX193ZWJnbFRleHR1cmVDdWJlICk7XG5cblx0XHRcdFx0X2dsLnBpeGVsU3RvcmVpKCBfZ2wuVU5QQUNLX0ZMSVBfWV9XRUJHTCwgdGV4dHVyZS5mbGlwWSApO1xuXG5cdFx0XHRcdHZhciBpc0NvbXByZXNzZWQgPSAoIHRleHR1cmUgJiYgdGV4dHVyZS5pc0NvbXByZXNzZWRUZXh0dXJlICk7XG5cdFx0XHRcdHZhciBpc0RhdGFUZXh0dXJlID0gKCB0ZXh0dXJlLmltYWdlWyAwIF0gJiYgdGV4dHVyZS5pbWFnZVsgMCBdLmlzRGF0YVRleHR1cmUgKTtcblxuXHRcdFx0XHR2YXIgY3ViZUltYWdlID0gW107XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgNjsgaSArKyApIHtcblxuXHRcdFx0XHRcdGlmICggISBpc0NvbXByZXNzZWQgJiYgISBpc0RhdGFUZXh0dXJlICkge1xuXG5cdFx0XHRcdFx0XHRjdWJlSW1hZ2VbIGkgXSA9IGNsYW1wVG9NYXhTaXplKCB0ZXh0dXJlLmltYWdlWyBpIF0sIGNhcGFiaWxpdGllcy5tYXhDdWJlbWFwU2l6ZSApO1xuXG5cdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0Y3ViZUltYWdlWyBpIF0gPSBpc0RhdGFUZXh0dXJlID8gdGV4dHVyZS5pbWFnZVsgaSBdLmltYWdlIDogdGV4dHVyZS5pbWFnZVsgaSBdO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHR2YXIgaW1hZ2UgPSBjdWJlSW1hZ2VbIDAgXSxcblx0XHRcdFx0XHRpc1Bvd2VyT2ZUd29JbWFnZSA9IGlzUG93ZXJPZlR3byggaW1hZ2UgKSxcblx0XHRcdFx0XHRnbEZvcm1hdCA9IHV0aWxzLmNvbnZlcnQoIHRleHR1cmUuZm9ybWF0ICksXG5cdFx0XHRcdFx0Z2xUeXBlID0gdXRpbHMuY29udmVydCggdGV4dHVyZS50eXBlICk7XG5cblx0XHRcdFx0c2V0VGV4dHVyZVBhcmFtZXRlcnMoIF9nbC5URVhUVVJFX0NVQkVfTUFQLCB0ZXh0dXJlLCBpc1Bvd2VyT2ZUd29JbWFnZSApO1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IDY7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRpZiAoICEgaXNDb21wcmVzc2VkICkge1xuXG5cdFx0XHRcdFx0XHRpZiAoIGlzRGF0YVRleHR1cmUgKSB7XG5cblx0XHRcdFx0XHRcdFx0c3RhdGUudGV4SW1hZ2UyRCggX2dsLlRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCArIGksIDAsIGdsRm9ybWF0LCBjdWJlSW1hZ2VbIGkgXS53aWR0aCwgY3ViZUltYWdlWyBpIF0uaGVpZ2h0LCAwLCBnbEZvcm1hdCwgZ2xUeXBlLCBjdWJlSW1hZ2VbIGkgXS5kYXRhICk7XG5cblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdFx0c3RhdGUudGV4SW1hZ2UyRCggX2dsLlRFWFRVUkVfQ1VCRV9NQVBfUE9TSVRJVkVfWCArIGksIDAsIGdsRm9ybWF0LCBnbEZvcm1hdCwgZ2xUeXBlLCBjdWJlSW1hZ2VbIGkgXSApO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHR2YXIgbWlwbWFwLCBtaXBtYXBzID0gY3ViZUltYWdlWyBpIF0ubWlwbWFwcztcblxuXHRcdFx0XHRcdFx0Zm9yICggdmFyIGogPSAwLCBqbCA9IG1pcG1hcHMubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7XG5cblx0XHRcdFx0XHRcdFx0bWlwbWFwID0gbWlwbWFwc1sgaiBdO1xuXG5cdFx0XHRcdFx0XHRcdGlmICggdGV4dHVyZS5mb3JtYXQgIT09IFJHQkFGb3JtYXQgJiYgdGV4dHVyZS5mb3JtYXQgIT09IFJHQkZvcm1hdCApIHtcblxuXHRcdFx0XHRcdFx0XHRcdGlmICggc3RhdGUuZ2V0Q29tcHJlc3NlZFRleHR1cmVGb3JtYXRzKCkuaW5kZXhPZiggZ2xGb3JtYXQgKSA+IC0gMSApIHtcblxuXHRcdFx0XHRcdFx0XHRcdFx0c3RhdGUuY29tcHJlc3NlZFRleEltYWdlMkQoIF9nbC5URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1ggKyBpLCBqLCBnbEZvcm1hdCwgbWlwbWFwLndpZHRoLCBtaXBtYXAuaGVpZ2h0LCAwLCBtaXBtYXAuZGF0YSApO1xuXG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogQXR0ZW1wdCB0byBsb2FkIHVuc3VwcG9ydGVkIGNvbXByZXNzZWQgdGV4dHVyZSBmb3JtYXQgaW4gLnNldFRleHR1cmVDdWJlKCknICk7XG5cblx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0XHRcdHN0YXRlLnRleEltYWdlMkQoIF9nbC5URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1ggKyBpLCBqLCBnbEZvcm1hdCwgbWlwbWFwLndpZHRoLCBtaXBtYXAuaGVpZ2h0LCAwLCBnbEZvcm1hdCwgZ2xUeXBlLCBtaXBtYXAuZGF0YSApO1xuXG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoICEgaXNDb21wcmVzc2VkICkge1xuXG5cdFx0XHRcdFx0dGV4dHVyZVByb3BlcnRpZXMuX19tYXhNaXBMZXZlbCA9IDA7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHRleHR1cmVQcm9wZXJ0aWVzLl9fbWF4TWlwTGV2ZWwgPSBtaXBtYXBzLmxlbmd0aCAtIDE7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggdGV4dHVyZU5lZWRzR2VuZXJhdGVNaXBtYXBzKCB0ZXh0dXJlLCBpc1Bvd2VyT2ZUd29JbWFnZSApICkge1xuXG5cdFx0XHRcdFx0Ly8gV2UgYXNzdW1lIGltYWdlcyBmb3IgY3ViZSBtYXAgaGF2ZSB0aGUgc2FtZSBzaXplLlxuXHRcdFx0XHRcdGdlbmVyYXRlTWlwbWFwKCBfZ2wuVEVYVFVSRV9DVUJFX01BUCwgdGV4dHVyZSwgaW1hZ2Uud2lkdGgsIGltYWdlLmhlaWdodCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0ZXh0dXJlUHJvcGVydGllcy5fX3ZlcnNpb24gPSB0ZXh0dXJlLnZlcnNpb247XG5cblx0XHRcdFx0aWYgKCB0ZXh0dXJlLm9uVXBkYXRlICkgdGV4dHVyZS5vblVwZGF0ZSggdGV4dHVyZSApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHN0YXRlLmFjdGl2ZVRleHR1cmUoIF9nbC5URVhUVVJFMCArIHNsb3QgKTtcblx0XHRcdFx0c3RhdGUuYmluZFRleHR1cmUoIF9nbC5URVhUVVJFX0NVQkVfTUFQLCB0ZXh0dXJlUHJvcGVydGllcy5fX2ltYWdlX193ZWJnbFRleHR1cmVDdWJlICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gc2V0VGV4dHVyZUN1YmVEeW5hbWljKCB0ZXh0dXJlLCBzbG90ICkge1xuXG5cdFx0c3RhdGUuYWN0aXZlVGV4dHVyZSggX2dsLlRFWFRVUkUwICsgc2xvdCApO1xuXHRcdHN0YXRlLmJpbmRUZXh0dXJlKCBfZ2wuVEVYVFVSRV9DVUJFX01BUCwgcHJvcGVydGllcy5nZXQoIHRleHR1cmUgKS5fX3dlYmdsVGV4dHVyZSApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBzZXRUZXh0dXJlUGFyYW1ldGVycyggdGV4dHVyZVR5cGUsIHRleHR1cmUsIGlzUG93ZXJPZlR3b0ltYWdlICkge1xuXG5cdFx0dmFyIGV4dGVuc2lvbjtcblxuXHRcdGlmICggaXNQb3dlck9mVHdvSW1hZ2UgKSB7XG5cblx0XHRcdF9nbC50ZXhQYXJhbWV0ZXJpKCB0ZXh0dXJlVHlwZSwgX2dsLlRFWFRVUkVfV1JBUF9TLCB1dGlscy5jb252ZXJ0KCB0ZXh0dXJlLndyYXBTICkgKTtcblx0XHRcdF9nbC50ZXhQYXJhbWV0ZXJpKCB0ZXh0dXJlVHlwZSwgX2dsLlRFWFRVUkVfV1JBUF9ULCB1dGlscy5jb252ZXJ0KCB0ZXh0dXJlLndyYXBUICkgKTtcblxuXHRcdFx0X2dsLnRleFBhcmFtZXRlcmkoIHRleHR1cmVUeXBlLCBfZ2wuVEVYVFVSRV9NQUdfRklMVEVSLCB1dGlscy5jb252ZXJ0KCB0ZXh0dXJlLm1hZ0ZpbHRlciApICk7XG5cdFx0XHRfZ2wudGV4UGFyYW1ldGVyaSggdGV4dHVyZVR5cGUsIF9nbC5URVhUVVJFX01JTl9GSUxURVIsIHV0aWxzLmNvbnZlcnQoIHRleHR1cmUubWluRmlsdGVyICkgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdF9nbC50ZXhQYXJhbWV0ZXJpKCB0ZXh0dXJlVHlwZSwgX2dsLlRFWFRVUkVfV1JBUF9TLCBfZ2wuQ0xBTVBfVE9fRURHRSApO1xuXHRcdFx0X2dsLnRleFBhcmFtZXRlcmkoIHRleHR1cmVUeXBlLCBfZ2wuVEVYVFVSRV9XUkFQX1QsIF9nbC5DTEFNUF9UT19FREdFICk7XG5cblx0XHRcdGlmICggdGV4dHVyZS53cmFwUyAhPT0gQ2xhbXBUb0VkZ2VXcmFwcGluZyB8fCB0ZXh0dXJlLndyYXBUICE9PSBDbGFtcFRvRWRnZVdyYXBwaW5nICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IFRleHR1cmUgaXMgbm90IHBvd2VyIG9mIHR3by4gVGV4dHVyZS53cmFwUyBhbmQgVGV4dHVyZS53cmFwVCBzaG91bGQgYmUgc2V0IHRvIFRIUkVFLkNsYW1wVG9FZGdlV3JhcHBpbmcuJywgdGV4dHVyZSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdF9nbC50ZXhQYXJhbWV0ZXJpKCB0ZXh0dXJlVHlwZSwgX2dsLlRFWFRVUkVfTUFHX0ZJTFRFUiwgZmlsdGVyRmFsbGJhY2soIHRleHR1cmUubWFnRmlsdGVyICkgKTtcblx0XHRcdF9nbC50ZXhQYXJhbWV0ZXJpKCB0ZXh0dXJlVHlwZSwgX2dsLlRFWFRVUkVfTUlOX0ZJTFRFUiwgZmlsdGVyRmFsbGJhY2soIHRleHR1cmUubWluRmlsdGVyICkgKTtcblxuXHRcdFx0aWYgKCB0ZXh0dXJlLm1pbkZpbHRlciAhPT0gTmVhcmVzdEZpbHRlciAmJiB0ZXh0dXJlLm1pbkZpbHRlciAhPT0gTGluZWFyRmlsdGVyICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IFRleHR1cmUgaXMgbm90IHBvd2VyIG9mIHR3by4gVGV4dHVyZS5taW5GaWx0ZXIgc2hvdWxkIGJlIHNldCB0byBUSFJFRS5OZWFyZXN0RmlsdGVyIG9yIFRIUkVFLkxpbmVhckZpbHRlci4nLCB0ZXh0dXJlICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCAnRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljJyApO1xuXG5cdFx0aWYgKCBleHRlbnNpb24gKSB7XG5cblx0XHRcdGlmICggdGV4dHVyZS50eXBlID09PSBGbG9hdFR5cGUgJiYgZXh0ZW5zaW9ucy5nZXQoICdPRVNfdGV4dHVyZV9mbG9hdF9saW5lYXInICkgPT09IG51bGwgKSByZXR1cm47XG5cdFx0XHRpZiAoIHRleHR1cmUudHlwZSA9PT0gSGFsZkZsb2F0VHlwZSAmJiBleHRlbnNpb25zLmdldCggJ09FU190ZXh0dXJlX2hhbGZfZmxvYXRfbGluZWFyJyApID09PSBudWxsICkgcmV0dXJuO1xuXG5cdFx0XHRpZiAoIHRleHR1cmUuYW5pc290cm9weSA+IDEgfHwgcHJvcGVydGllcy5nZXQoIHRleHR1cmUgKS5fX2N1cnJlbnRBbmlzb3Ryb3B5ICkge1xuXG5cdFx0XHRcdF9nbC50ZXhQYXJhbWV0ZXJmKCB0ZXh0dXJlVHlwZSwgZXh0ZW5zaW9uLlRFWFRVUkVfTUFYX0FOSVNPVFJPUFlfRVhULCBNYXRoLm1pbiggdGV4dHVyZS5hbmlzb3Ryb3B5LCBjYXBhYmlsaXRpZXMuZ2V0TWF4QW5pc290cm9weSgpICkgKTtcblx0XHRcdFx0cHJvcGVydGllcy5nZXQoIHRleHR1cmUgKS5fX2N1cnJlbnRBbmlzb3Ryb3B5ID0gdGV4dHVyZS5hbmlzb3Ryb3B5O1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHVwbG9hZFRleHR1cmUoIHRleHR1cmVQcm9wZXJ0aWVzLCB0ZXh0dXJlLCBzbG90ICkge1xuXG5cdFx0aWYgKCB0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsSW5pdCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsSW5pdCA9IHRydWU7XG5cblx0XHRcdHRleHR1cmUuYWRkRXZlbnRMaXN0ZW5lciggJ2Rpc3Bvc2UnLCBvblRleHR1cmVEaXNwb3NlICk7XG5cblx0XHRcdHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlID0gX2dsLmNyZWF0ZVRleHR1cmUoKTtcblxuXHRcdFx0aW5mby5tZW1vcnkudGV4dHVyZXMgKys7XG5cblx0XHR9XG5cblx0XHRzdGF0ZS5hY3RpdmVUZXh0dXJlKCBfZ2wuVEVYVFVSRTAgKyBzbG90ICk7XG5cdFx0c3RhdGUuYmluZFRleHR1cmUoIF9nbC5URVhUVVJFXzJELCB0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSApO1xuXG5cdFx0X2dsLnBpeGVsU3RvcmVpKCBfZ2wuVU5QQUNLX0ZMSVBfWV9XRUJHTCwgdGV4dHVyZS5mbGlwWSApO1xuXHRcdF9nbC5waXhlbFN0b3JlaSggX2dsLlVOUEFDS19QUkVNVUxUSVBMWV9BTFBIQV9XRUJHTCwgdGV4dHVyZS5wcmVtdWx0aXBseUFscGhhICk7XG5cdFx0X2dsLnBpeGVsU3RvcmVpKCBfZ2wuVU5QQUNLX0FMSUdOTUVOVCwgdGV4dHVyZS51bnBhY2tBbGlnbm1lbnQgKTtcblxuXHRcdHZhciBpbWFnZSA9IGNsYW1wVG9NYXhTaXplKCB0ZXh0dXJlLmltYWdlLCBjYXBhYmlsaXRpZXMubWF4VGV4dHVyZVNpemUgKTtcblxuXHRcdGlmICggdGV4dHVyZU5lZWRzUG93ZXJPZlR3byggdGV4dHVyZSApICYmIGlzUG93ZXJPZlR3byggaW1hZ2UgKSA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdGltYWdlID0gbWFrZVBvd2VyT2ZUd28oIGltYWdlICk7XG5cblx0XHR9XG5cblx0XHR2YXIgaXNQb3dlck9mVHdvSW1hZ2UgPSBpc1Bvd2VyT2ZUd28oIGltYWdlICksXG5cdFx0XHRnbEZvcm1hdCA9IHV0aWxzLmNvbnZlcnQoIHRleHR1cmUuZm9ybWF0ICksXG5cdFx0XHRnbFR5cGUgPSB1dGlscy5jb252ZXJ0KCB0ZXh0dXJlLnR5cGUgKTtcblxuXHRcdHNldFRleHR1cmVQYXJhbWV0ZXJzKCBfZ2wuVEVYVFVSRV8yRCwgdGV4dHVyZSwgaXNQb3dlck9mVHdvSW1hZ2UgKTtcblxuXHRcdHZhciBtaXBtYXAsIG1pcG1hcHMgPSB0ZXh0dXJlLm1pcG1hcHM7XG5cblx0XHRpZiAoIHRleHR1cmUuaXNEZXB0aFRleHR1cmUgKSB7XG5cblx0XHRcdC8vIHBvcHVsYXRlIGRlcHRoIHRleHR1cmUgd2l0aCBkdW1teSBkYXRhXG5cblx0XHRcdHZhciBpbnRlcm5hbEZvcm1hdCA9IF9nbC5ERVBUSF9DT01QT05FTlQ7XG5cblx0XHRcdGlmICggdGV4dHVyZS50eXBlID09PSBGbG9hdFR5cGUgKSB7XG5cblx0XHRcdFx0aWYgKCAhIF9pc1dlYkdMMiApIHRocm93IG5ldyBFcnJvciggJ0Zsb2F0IERlcHRoIFRleHR1cmUgb25seSBzdXBwb3J0ZWQgaW4gV2ViR0wyLjAnICk7XG5cdFx0XHRcdGludGVybmFsRm9ybWF0ID0gX2dsLkRFUFRIX0NPTVBPTkVOVDMyRjtcblxuXHRcdFx0fSBlbHNlIGlmICggX2lzV2ViR0wyICkge1xuXG5cdFx0XHRcdC8vIFdlYkdMIDIuMCByZXF1aXJlcyBzaWduZWQgaW50ZXJuYWxmb3JtYXQgZm9yIGdsVGV4SW1hZ2UyRFxuXHRcdFx0XHRpbnRlcm5hbEZvcm1hdCA9IF9nbC5ERVBUSF9DT01QT05FTlQxNjtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHRleHR1cmUuZm9ybWF0ID09PSBEZXB0aEZvcm1hdCAmJiBpbnRlcm5hbEZvcm1hdCA9PT0gX2dsLkRFUFRIX0NPTVBPTkVOVCApIHtcblxuXHRcdFx0XHQvLyBUaGUgZXJyb3IgSU5WQUxJRF9PUEVSQVRJT04gaXMgZ2VuZXJhdGVkIGJ5IHRleEltYWdlMkQgaWYgZm9ybWF0IGFuZCBpbnRlcm5hbGZvcm1hdCBhcmVcblx0XHRcdFx0Ly8gREVQVEhfQ09NUE9ORU5UIGFuZCB0eXBlIGlzIG5vdCBVTlNJR05FRF9TSE9SVCBvciBVTlNJR05FRF9JTlRcblx0XHRcdFx0Ly8gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3dlYmdsL2V4dGVuc2lvbnMvV0VCR0xfZGVwdGhfdGV4dHVyZS8pXG5cdFx0XHRcdGlmICggdGV4dHVyZS50eXBlICE9PSBVbnNpZ25lZFNob3J0VHlwZSAmJiB0ZXh0dXJlLnR5cGUgIT09IFVuc2lnbmVkSW50VHlwZSApIHtcblxuXHRcdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IFVzZSBVbnNpZ25lZFNob3J0VHlwZSBvciBVbnNpZ25lZEludFR5cGUgZm9yIERlcHRoRm9ybWF0IERlcHRoVGV4dHVyZS4nICk7XG5cblx0XHRcdFx0XHR0ZXh0dXJlLnR5cGUgPSBVbnNpZ25lZFNob3J0VHlwZTtcblx0XHRcdFx0XHRnbFR5cGUgPSB1dGlscy5jb252ZXJ0KCB0ZXh0dXJlLnR5cGUgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gRGVwdGggc3RlbmNpbCB0ZXh0dXJlcyBuZWVkIHRoZSBERVBUSF9TVEVOQ0lMIGludGVybmFsIGZvcm1hdFxuXHRcdFx0Ly8gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3dlYmdsL2V4dGVuc2lvbnMvV0VCR0xfZGVwdGhfdGV4dHVyZS8pXG5cdFx0XHRpZiAoIHRleHR1cmUuZm9ybWF0ID09PSBEZXB0aFN0ZW5jaWxGb3JtYXQgKSB7XG5cblx0XHRcdFx0aW50ZXJuYWxGb3JtYXQgPSBfZ2wuREVQVEhfU1RFTkNJTDtcblxuXHRcdFx0XHQvLyBUaGUgZXJyb3IgSU5WQUxJRF9PUEVSQVRJT04gaXMgZ2VuZXJhdGVkIGJ5IHRleEltYWdlMkQgaWYgZm9ybWF0IGFuZCBpbnRlcm5hbGZvcm1hdCBhcmVcblx0XHRcdFx0Ly8gREVQVEhfU1RFTkNJTCBhbmQgdHlwZSBpcyBub3QgVU5TSUdORURfSU5UXzI0XzhfV0VCR0wuXG5cdFx0XHRcdC8vIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS93ZWJnbC9leHRlbnNpb25zL1dFQkdMX2RlcHRoX3RleHR1cmUvKVxuXHRcdFx0XHRpZiAoIHRleHR1cmUudHlwZSAhPT0gVW5zaWduZWRJbnQyNDhUeXBlICkge1xuXG5cdFx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogVXNlIFVuc2lnbmVkSW50MjQ4VHlwZSBmb3IgRGVwdGhTdGVuY2lsRm9ybWF0IERlcHRoVGV4dHVyZS4nICk7XG5cblx0XHRcdFx0XHR0ZXh0dXJlLnR5cGUgPSBVbnNpZ25lZEludDI0OFR5cGU7XG5cdFx0XHRcdFx0Z2xUeXBlID0gdXRpbHMuY29udmVydCggdGV4dHVyZS50eXBlICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdHN0YXRlLnRleEltYWdlMkQoIF9nbC5URVhUVVJFXzJELCAwLCBpbnRlcm5hbEZvcm1hdCwgaW1hZ2Uud2lkdGgsIGltYWdlLmhlaWdodCwgMCwgZ2xGb3JtYXQsIGdsVHlwZSwgbnVsbCApO1xuXG5cdFx0fSBlbHNlIGlmICggdGV4dHVyZS5pc0RhdGFUZXh0dXJlICkge1xuXG5cdFx0XHQvLyB1c2UgbWFudWFsbHkgY3JlYXRlZCBtaXBtYXBzIGlmIGF2YWlsYWJsZVxuXHRcdFx0Ly8gaWYgdGhlcmUgYXJlIG5vIG1hbnVhbCBtaXBtYXBzXG5cdFx0XHQvLyBzZXQgMCBsZXZlbCBtaXBtYXAgYW5kIHRoZW4gdXNlIEdMIHRvIGdlbmVyYXRlIG90aGVyIG1pcG1hcCBsZXZlbHNcblxuXHRcdFx0aWYgKCBtaXBtYXBzLmxlbmd0aCA+IDAgJiYgaXNQb3dlck9mVHdvSW1hZ2UgKSB7XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IG1pcG1hcHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRtaXBtYXAgPSBtaXBtYXBzWyBpIF07XG5cdFx0XHRcdFx0c3RhdGUudGV4SW1hZ2UyRCggX2dsLlRFWFRVUkVfMkQsIGksIGdsRm9ybWF0LCBtaXBtYXAud2lkdGgsIG1pcG1hcC5oZWlnaHQsIDAsIGdsRm9ybWF0LCBnbFR5cGUsIG1pcG1hcC5kYXRhICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzID0gZmFsc2U7XG5cdFx0XHRcdHRleHR1cmVQcm9wZXJ0aWVzLl9fbWF4TWlwTGV2ZWwgPSBtaXBtYXBzLmxlbmd0aCAtIDE7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0c3RhdGUudGV4SW1hZ2UyRCggX2dsLlRFWFRVUkVfMkQsIDAsIGdsRm9ybWF0LCBpbWFnZS53aWR0aCwgaW1hZ2UuaGVpZ2h0LCAwLCBnbEZvcm1hdCwgZ2xUeXBlLCBpbWFnZS5kYXRhICk7XG5cdFx0XHRcdHRleHR1cmVQcm9wZXJ0aWVzLl9fbWF4TWlwTGV2ZWwgPSAwO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2UgaWYgKCB0ZXh0dXJlLmlzQ29tcHJlc3NlZFRleHR1cmUgKSB7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBtaXBtYXBzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdG1pcG1hcCA9IG1pcG1hcHNbIGkgXTtcblxuXHRcdFx0XHRpZiAoIHRleHR1cmUuZm9ybWF0ICE9PSBSR0JBRm9ybWF0ICYmIHRleHR1cmUuZm9ybWF0ICE9PSBSR0JGb3JtYXQgKSB7XG5cblx0XHRcdFx0XHRpZiAoIHN0YXRlLmdldENvbXByZXNzZWRUZXh0dXJlRm9ybWF0cygpLmluZGV4T2YoIGdsRm9ybWF0ICkgPiAtIDEgKSB7XG5cblx0XHRcdFx0XHRcdHN0YXRlLmNvbXByZXNzZWRUZXhJbWFnZTJEKCBfZ2wuVEVYVFVSRV8yRCwgaSwgZ2xGb3JtYXQsIG1pcG1hcC53aWR0aCwgbWlwbWFwLmhlaWdodCwgMCwgbWlwbWFwLmRhdGEgKTtcblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IEF0dGVtcHQgdG8gbG9hZCB1bnN1cHBvcnRlZCBjb21wcmVzc2VkIHRleHR1cmUgZm9ybWF0IGluIC51cGxvYWRUZXh0dXJlKCknICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHN0YXRlLnRleEltYWdlMkQoIF9nbC5URVhUVVJFXzJELCBpLCBnbEZvcm1hdCwgbWlwbWFwLndpZHRoLCBtaXBtYXAuaGVpZ2h0LCAwLCBnbEZvcm1hdCwgZ2xUeXBlLCBtaXBtYXAuZGF0YSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHR0ZXh0dXJlUHJvcGVydGllcy5fX21heE1pcExldmVsID0gbWlwbWFwcy5sZW5ndGggLSAxO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gcmVndWxhciBUZXh0dXJlIChpbWFnZSwgdmlkZW8sIGNhbnZhcylcblxuXHRcdFx0Ly8gdXNlIG1hbnVhbGx5IGNyZWF0ZWQgbWlwbWFwcyBpZiBhdmFpbGFibGVcblx0XHRcdC8vIGlmIHRoZXJlIGFyZSBubyBtYW51YWwgbWlwbWFwc1xuXHRcdFx0Ly8gc2V0IDAgbGV2ZWwgbWlwbWFwIGFuZCB0aGVuIHVzZSBHTCB0byBnZW5lcmF0ZSBvdGhlciBtaXBtYXAgbGV2ZWxzXG5cblx0XHRcdGlmICggbWlwbWFwcy5sZW5ndGggPiAwICYmIGlzUG93ZXJPZlR3b0ltYWdlICkge1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBtaXBtYXBzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0bWlwbWFwID0gbWlwbWFwc1sgaSBdO1xuXHRcdFx0XHRcdHN0YXRlLnRleEltYWdlMkQoIF9nbC5URVhUVVJFXzJELCBpLCBnbEZvcm1hdCwgZ2xGb3JtYXQsIGdsVHlwZSwgbWlwbWFwICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzID0gZmFsc2U7XG5cdFx0XHRcdHRleHR1cmVQcm9wZXJ0aWVzLl9fbWF4TWlwTGV2ZWwgPSBtaXBtYXBzLmxlbmd0aCAtIDE7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0c3RhdGUudGV4SW1hZ2UyRCggX2dsLlRFWFRVUkVfMkQsIDAsIGdsRm9ybWF0LCBnbEZvcm1hdCwgZ2xUeXBlLCBpbWFnZSApO1xuXHRcdFx0XHR0ZXh0dXJlUHJvcGVydGllcy5fX21heE1pcExldmVsID0gMDtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCB0ZXh0dXJlTmVlZHNHZW5lcmF0ZU1pcG1hcHMoIHRleHR1cmUsIGlzUG93ZXJPZlR3b0ltYWdlICkgKSB7XG5cblx0XHRcdGdlbmVyYXRlTWlwbWFwKCBfZ2wuVEVYVFVSRV8yRCwgdGV4dHVyZSwgaW1hZ2Uud2lkdGgsIGltYWdlLmhlaWdodCApO1xuXG5cdFx0fVxuXG5cdFx0dGV4dHVyZVByb3BlcnRpZXMuX192ZXJzaW9uID0gdGV4dHVyZS52ZXJzaW9uO1xuXG5cdFx0aWYgKCB0ZXh0dXJlLm9uVXBkYXRlICkgdGV4dHVyZS5vblVwZGF0ZSggdGV4dHVyZSApO1xuXG5cdH1cblxuXHQvLyBSZW5kZXIgdGFyZ2V0c1xuXG5cdC8vIFNldHVwIHN0b3JhZ2UgZm9yIHRhcmdldCB0ZXh0dXJlIGFuZCBiaW5kIGl0IHRvIGNvcnJlY3QgZnJhbWVidWZmZXJcblx0ZnVuY3Rpb24gc2V0dXBGcmFtZUJ1ZmZlclRleHR1cmUoIGZyYW1lYnVmZmVyLCByZW5kZXJUYXJnZXQsIGF0dGFjaG1lbnQsIHRleHR1cmVUYXJnZXQgKSB7XG5cblx0XHR2YXIgZ2xGb3JtYXQgPSB1dGlscy5jb252ZXJ0KCByZW5kZXJUYXJnZXQudGV4dHVyZS5mb3JtYXQgKTtcblx0XHR2YXIgZ2xUeXBlID0gdXRpbHMuY29udmVydCggcmVuZGVyVGFyZ2V0LnRleHR1cmUudHlwZSApO1xuXHRcdHN0YXRlLnRleEltYWdlMkQoIHRleHR1cmVUYXJnZXQsIDAsIGdsRm9ybWF0LCByZW5kZXJUYXJnZXQud2lkdGgsIHJlbmRlclRhcmdldC5oZWlnaHQsIDAsIGdsRm9ybWF0LCBnbFR5cGUsIG51bGwgKTtcblx0XHRfZ2wuYmluZEZyYW1lYnVmZmVyKCBfZ2wuRlJBTUVCVUZGRVIsIGZyYW1lYnVmZmVyICk7XG5cdFx0X2dsLmZyYW1lYnVmZmVyVGV4dHVyZTJEKCBfZ2wuRlJBTUVCVUZGRVIsIGF0dGFjaG1lbnQsIHRleHR1cmVUYXJnZXQsIHByb3BlcnRpZXMuZ2V0KCByZW5kZXJUYXJnZXQudGV4dHVyZSApLl9fd2ViZ2xUZXh0dXJlLCAwICk7XG5cdFx0X2dsLmJpbmRGcmFtZWJ1ZmZlciggX2dsLkZSQU1FQlVGRkVSLCBudWxsICk7XG5cblx0fVxuXG5cdC8vIFNldHVwIHN0b3JhZ2UgZm9yIGludGVybmFsIGRlcHRoL3N0ZW5jaWwgYnVmZmVycyBhbmQgYmluZCB0byBjb3JyZWN0IGZyYW1lYnVmZmVyXG5cdGZ1bmN0aW9uIHNldHVwUmVuZGVyQnVmZmVyU3RvcmFnZSggcmVuZGVyYnVmZmVyLCByZW5kZXJUYXJnZXQgKSB7XG5cblx0XHRfZ2wuYmluZFJlbmRlcmJ1ZmZlciggX2dsLlJFTkRFUkJVRkZFUiwgcmVuZGVyYnVmZmVyICk7XG5cblx0XHRpZiAoIHJlbmRlclRhcmdldC5kZXB0aEJ1ZmZlciAmJiAhIHJlbmRlclRhcmdldC5zdGVuY2lsQnVmZmVyICkge1xuXG5cdFx0XHRfZ2wucmVuZGVyYnVmZmVyU3RvcmFnZSggX2dsLlJFTkRFUkJVRkZFUiwgX2dsLkRFUFRIX0NPTVBPTkVOVDE2LCByZW5kZXJUYXJnZXQud2lkdGgsIHJlbmRlclRhcmdldC5oZWlnaHQgKTtcblx0XHRcdF9nbC5mcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlciggX2dsLkZSQU1FQlVGRkVSLCBfZ2wuREVQVEhfQVRUQUNITUVOVCwgX2dsLlJFTkRFUkJVRkZFUiwgcmVuZGVyYnVmZmVyICk7XG5cblx0XHR9IGVsc2UgaWYgKCByZW5kZXJUYXJnZXQuZGVwdGhCdWZmZXIgJiYgcmVuZGVyVGFyZ2V0LnN0ZW5jaWxCdWZmZXIgKSB7XG5cblx0XHRcdF9nbC5yZW5kZXJidWZmZXJTdG9yYWdlKCBfZ2wuUkVOREVSQlVGRkVSLCBfZ2wuREVQVEhfU1RFTkNJTCwgcmVuZGVyVGFyZ2V0LndpZHRoLCByZW5kZXJUYXJnZXQuaGVpZ2h0ICk7XG5cdFx0XHRfZ2wuZnJhbWVidWZmZXJSZW5kZXJidWZmZXIoIF9nbC5GUkFNRUJVRkZFUiwgX2dsLkRFUFRIX1NURU5DSUxfQVRUQUNITUVOVCwgX2dsLlJFTkRFUkJVRkZFUiwgcmVuZGVyYnVmZmVyICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBGSVhNRTogV2UgZG9uJ3Qgc3VwcG9ydCAhZGVwdGggIXN0ZW5jaWxcblx0XHRcdF9nbC5yZW5kZXJidWZmZXJTdG9yYWdlKCBfZ2wuUkVOREVSQlVGRkVSLCBfZ2wuUkdCQTQsIHJlbmRlclRhcmdldC53aWR0aCwgcmVuZGVyVGFyZ2V0LmhlaWdodCApO1xuXG5cdFx0fVxuXG5cdFx0X2dsLmJpbmRSZW5kZXJidWZmZXIoIF9nbC5SRU5ERVJCVUZGRVIsIG51bGwgKTtcblxuXHR9XG5cblx0Ly8gU2V0dXAgcmVzb3VyY2VzIGZvciBhIERlcHRoIFRleHR1cmUgZm9yIGEgRkJPIChuZWVkcyBhbiBleHRlbnNpb24pXG5cdGZ1bmN0aW9uIHNldHVwRGVwdGhUZXh0dXJlKCBmcmFtZWJ1ZmZlciwgcmVuZGVyVGFyZ2V0ICkge1xuXG5cdFx0dmFyIGlzQ3ViZSA9ICggcmVuZGVyVGFyZ2V0ICYmIHJlbmRlclRhcmdldC5pc1dlYkdMUmVuZGVyVGFyZ2V0Q3ViZSApO1xuXHRcdGlmICggaXNDdWJlICkgdGhyb3cgbmV3IEVycm9yKCAnRGVwdGggVGV4dHVyZSB3aXRoIGN1YmUgcmVuZGVyIHRhcmdldHMgaXMgbm90IHN1cHBvcnRlZCcgKTtcblxuXHRcdF9nbC5iaW5kRnJhbWVidWZmZXIoIF9nbC5GUkFNRUJVRkZFUiwgZnJhbWVidWZmZXIgKTtcblxuXHRcdGlmICggISAoIHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUgJiYgcmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZS5pc0RlcHRoVGV4dHVyZSApICkge1xuXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoICdyZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlIG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgVEhSRUUuRGVwdGhUZXh0dXJlJyApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gdXBsb2FkIGFuIGVtcHR5IGRlcHRoIHRleHR1cmUgd2l0aCBmcmFtZWJ1ZmZlciBzaXplXG5cdFx0aWYgKCAhIHByb3BlcnRpZXMuZ2V0KCByZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlICkuX193ZWJnbFRleHR1cmUgfHxcblx0XHRcdFx0cmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZS5pbWFnZS53aWR0aCAhPT0gcmVuZGVyVGFyZ2V0LndpZHRoIHx8XG5cdFx0XHRcdHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUuaW1hZ2UuaGVpZ2h0ICE9PSByZW5kZXJUYXJnZXQuaGVpZ2h0ICkge1xuXG5cdFx0XHRyZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlLmltYWdlLndpZHRoID0gcmVuZGVyVGFyZ2V0LndpZHRoO1xuXHRcdFx0cmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZS5pbWFnZS5oZWlnaHQgPSByZW5kZXJUYXJnZXQuaGVpZ2h0O1xuXHRcdFx0cmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHR9XG5cblx0XHRzZXRUZXh0dXJlMkQoIHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUsIDAgKTtcblxuXHRcdHZhciB3ZWJnbERlcHRoVGV4dHVyZSA9IHByb3BlcnRpZXMuZ2V0KCByZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlICkuX193ZWJnbFRleHR1cmU7XG5cblx0XHRpZiAoIHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUuZm9ybWF0ID09PSBEZXB0aEZvcm1hdCApIHtcblxuXHRcdFx0X2dsLmZyYW1lYnVmZmVyVGV4dHVyZTJEKCBfZ2wuRlJBTUVCVUZGRVIsIF9nbC5ERVBUSF9BVFRBQ0hNRU5ULCBfZ2wuVEVYVFVSRV8yRCwgd2ViZ2xEZXB0aFRleHR1cmUsIDAgKTtcblxuXHRcdH0gZWxzZSBpZiAoIHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUuZm9ybWF0ID09PSBEZXB0aFN0ZW5jaWxGb3JtYXQgKSB7XG5cblx0XHRcdF9nbC5mcmFtZWJ1ZmZlclRleHR1cmUyRCggX2dsLkZSQU1FQlVGRkVSLCBfZ2wuREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5ULCBfZ2wuVEVYVFVSRV8yRCwgd2ViZ2xEZXB0aFRleHR1cmUsIDAgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHRocm93IG5ldyBFcnJvciggJ1Vua25vd24gZGVwdGhUZXh0dXJlIGZvcm1hdCcgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gU2V0dXAgR0wgcmVzb3VyY2VzIGZvciBhIG5vbi10ZXh0dXJlIGRlcHRoIGJ1ZmZlclxuXHRmdW5jdGlvbiBzZXR1cERlcHRoUmVuZGVyYnVmZmVyKCByZW5kZXJUYXJnZXQgKSB7XG5cblx0XHR2YXIgcmVuZGVyVGFyZ2V0UHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCByZW5kZXJUYXJnZXQgKTtcblxuXHRcdHZhciBpc0N1YmUgPSAoIHJlbmRlclRhcmdldC5pc1dlYkdMUmVuZGVyVGFyZ2V0Q3ViZSA9PT0gdHJ1ZSApO1xuXG5cdFx0aWYgKCByZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlICkge1xuXG5cdFx0XHRpZiAoIGlzQ3ViZSApIHRocm93IG5ldyBFcnJvciggJ3RhcmdldC5kZXB0aFRleHR1cmUgbm90IHN1cHBvcnRlZCBpbiBDdWJlIHJlbmRlciB0YXJnZXRzJyApO1xuXG5cdFx0XHRzZXR1cERlcHRoVGV4dHVyZSggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXIsIHJlbmRlclRhcmdldCApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0aWYgKCBpc0N1YmUgKSB7XG5cblx0XHRcdFx0cmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRGVwdGhidWZmZXIgPSBbXTtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCA2OyBpICsrICkge1xuXG5cdFx0XHRcdFx0X2dsLmJpbmRGcmFtZWJ1ZmZlciggX2dsLkZSQU1FQlVGRkVSLCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlclsgaSBdICk7XG5cdFx0XHRcdFx0cmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRGVwdGhidWZmZXJbIGkgXSA9IF9nbC5jcmVhdGVSZW5kZXJidWZmZXIoKTtcblx0XHRcdFx0XHRzZXR1cFJlbmRlckJ1ZmZlclN0b3JhZ2UoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbERlcHRoYnVmZmVyWyBpIF0sIHJlbmRlclRhcmdldCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRfZ2wuYmluZEZyYW1lYnVmZmVyKCBfZ2wuRlJBTUVCVUZGRVIsIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyICk7XG5cdFx0XHRcdHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbERlcHRoYnVmZmVyID0gX2dsLmNyZWF0ZVJlbmRlcmJ1ZmZlcigpO1xuXHRcdFx0XHRzZXR1cFJlbmRlckJ1ZmZlclN0b3JhZ2UoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbERlcHRoYnVmZmVyLCByZW5kZXJUYXJnZXQgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0X2dsLmJpbmRGcmFtZWJ1ZmZlciggX2dsLkZSQU1FQlVGRkVSLCBudWxsICk7XG5cblx0fVxuXG5cdC8vIFNldCB1cCBHTCByZXNvdXJjZXMgZm9yIHRoZSByZW5kZXIgdGFyZ2V0XG5cdGZ1bmN0aW9uIHNldHVwUmVuZGVyVGFyZ2V0KCByZW5kZXJUYXJnZXQgKSB7XG5cblx0XHR2YXIgcmVuZGVyVGFyZ2V0UHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCByZW5kZXJUYXJnZXQgKTtcblx0XHR2YXIgdGV4dHVyZVByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0LnRleHR1cmUgKTtcblxuXHRcdHJlbmRlclRhcmdldC5hZGRFdmVudExpc3RlbmVyKCAnZGlzcG9zZScsIG9uUmVuZGVyVGFyZ2V0RGlzcG9zZSApO1xuXG5cdFx0dGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbFRleHR1cmUgPSBfZ2wuY3JlYXRlVGV4dHVyZSgpO1xuXG5cdFx0aW5mby5tZW1vcnkudGV4dHVyZXMgKys7XG5cblx0XHR2YXIgaXNDdWJlID0gKCByZW5kZXJUYXJnZXQuaXNXZWJHTFJlbmRlclRhcmdldEN1YmUgPT09IHRydWUgKTtcblx0XHR2YXIgaXNUYXJnZXRQb3dlck9mVHdvID0gaXNQb3dlck9mVHdvKCByZW5kZXJUYXJnZXQgKTtcblxuXHRcdC8vIFNldHVwIGZyYW1lYnVmZmVyXG5cblx0XHRpZiAoIGlzQ3ViZSApIHtcblxuXHRcdFx0cmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXIgPSBbXTtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgNjsgaSArKyApIHtcblxuXHRcdFx0XHRyZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlclsgaSBdID0gX2dsLmNyZWF0ZUZyYW1lYnVmZmVyKCk7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyID0gX2dsLmNyZWF0ZUZyYW1lYnVmZmVyKCk7XG5cblx0XHR9XG5cblx0XHQvLyBTZXR1cCBjb2xvciBidWZmZXJcblxuXHRcdGlmICggaXNDdWJlICkge1xuXG5cdFx0XHRzdGF0ZS5iaW5kVGV4dHVyZSggX2dsLlRFWFRVUkVfQ1VCRV9NQVAsIHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlICk7XG5cdFx0XHRzZXRUZXh0dXJlUGFyYW1ldGVycyggX2dsLlRFWFRVUkVfQ1VCRV9NQVAsIHJlbmRlclRhcmdldC50ZXh0dXJlLCBpc1RhcmdldFBvd2VyT2ZUd28gKTtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgNjsgaSArKyApIHtcblxuXHRcdFx0XHRzZXR1cEZyYW1lQnVmZmVyVGV4dHVyZSggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXJbIGkgXSwgcmVuZGVyVGFyZ2V0LCBfZ2wuQ09MT1JfQVRUQUNITUVOVDAsIF9nbC5URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1ggKyBpICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCB0ZXh0dXJlTmVlZHNHZW5lcmF0ZU1pcG1hcHMoIHJlbmRlclRhcmdldC50ZXh0dXJlLCBpc1RhcmdldFBvd2VyT2ZUd28gKSApIHtcblxuXHRcdFx0XHRnZW5lcmF0ZU1pcG1hcCggX2dsLlRFWFRVUkVfQ1VCRV9NQVAsIHJlbmRlclRhcmdldC50ZXh0dXJlLCByZW5kZXJUYXJnZXQud2lkdGgsIHJlbmRlclRhcmdldC5oZWlnaHQgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRzdGF0ZS5iaW5kVGV4dHVyZSggX2dsLlRFWFRVUkVfQ1VCRV9NQVAsIG51bGwgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHN0YXRlLmJpbmRUZXh0dXJlKCBfZ2wuVEVYVFVSRV8yRCwgdGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbFRleHR1cmUgKTtcblx0XHRcdHNldFRleHR1cmVQYXJhbWV0ZXJzKCBfZ2wuVEVYVFVSRV8yRCwgcmVuZGVyVGFyZ2V0LnRleHR1cmUsIGlzVGFyZ2V0UG93ZXJPZlR3byApO1xuXHRcdFx0c2V0dXBGcmFtZUJ1ZmZlclRleHR1cmUoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyLCByZW5kZXJUYXJnZXQsIF9nbC5DT0xPUl9BVFRBQ0hNRU5UMCwgX2dsLlRFWFRVUkVfMkQgKTtcblxuXHRcdFx0aWYgKCB0ZXh0dXJlTmVlZHNHZW5lcmF0ZU1pcG1hcHMoIHJlbmRlclRhcmdldC50ZXh0dXJlLCBpc1RhcmdldFBvd2VyT2ZUd28gKSApIHtcblxuXHRcdFx0XHRnZW5lcmF0ZU1pcG1hcCggX2dsLlRFWFRVUkVfMkQsIHJlbmRlclRhcmdldC50ZXh0dXJlLCByZW5kZXJUYXJnZXQud2lkdGgsIHJlbmRlclRhcmdldC5oZWlnaHQgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRzdGF0ZS5iaW5kVGV4dHVyZSggX2dsLlRFWFRVUkVfMkQsIG51bGwgKTtcblxuXHRcdH1cblxuXHRcdC8vIFNldHVwIGRlcHRoIGFuZCBzdGVuY2lsIGJ1ZmZlcnNcblxuXHRcdGlmICggcmVuZGVyVGFyZ2V0LmRlcHRoQnVmZmVyICkge1xuXG5cdFx0XHRzZXR1cERlcHRoUmVuZGVyYnVmZmVyKCByZW5kZXJUYXJnZXQgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gdXBkYXRlUmVuZGVyVGFyZ2V0TWlwbWFwKCByZW5kZXJUYXJnZXQgKSB7XG5cblx0XHR2YXIgdGV4dHVyZSA9IHJlbmRlclRhcmdldC50ZXh0dXJlO1xuXHRcdHZhciBpc1RhcmdldFBvd2VyT2ZUd28gPSBpc1Bvd2VyT2ZUd28oIHJlbmRlclRhcmdldCApO1xuXG5cdFx0aWYgKCB0ZXh0dXJlTmVlZHNHZW5lcmF0ZU1pcG1hcHMoIHRleHR1cmUsIGlzVGFyZ2V0UG93ZXJPZlR3byApICkge1xuXG5cdFx0XHR2YXIgdGFyZ2V0ID0gcmVuZGVyVGFyZ2V0LmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlID8gX2dsLlRFWFRVUkVfQ1VCRV9NQVAgOiBfZ2wuVEVYVFVSRV8yRDtcblx0XHRcdHZhciB3ZWJnbFRleHR1cmUgPSBwcm9wZXJ0aWVzLmdldCggdGV4dHVyZSApLl9fd2ViZ2xUZXh0dXJlO1xuXG5cdFx0XHRzdGF0ZS5iaW5kVGV4dHVyZSggdGFyZ2V0LCB3ZWJnbFRleHR1cmUgKTtcblx0XHRcdGdlbmVyYXRlTWlwbWFwKCB0YXJnZXQsIHRleHR1cmUsIHJlbmRlclRhcmdldC53aWR0aCwgcmVuZGVyVGFyZ2V0LmhlaWdodCApO1xuXHRcdFx0c3RhdGUuYmluZFRleHR1cmUoIHRhcmdldCwgbnVsbCApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiB1cGRhdGVWaWRlb1RleHR1cmUoIHRleHR1cmUgKSB7XG5cblx0XHR2YXIgaWQgPSB0ZXh0dXJlLmlkO1xuXHRcdHZhciBmcmFtZSA9IGluZm8ucmVuZGVyLmZyYW1lO1xuXG5cdFx0Ly8gQ2hlY2sgdGhlIGxhc3QgZnJhbWUgd2UgdXBkYXRlZCB0aGUgVmlkZW9UZXh0dXJlXG5cblx0XHRpZiAoIF92aWRlb1RleHR1cmVzWyBpZCBdICE9PSBmcmFtZSApIHtcblxuXHRcdFx0X3ZpZGVvVGV4dHVyZXNbIGlkIF0gPSBmcmFtZTtcblx0XHRcdHRleHR1cmUudXBkYXRlKCk7XG5cblx0XHR9XG5cblx0fVxuXG5cdHRoaXMuc2V0VGV4dHVyZTJEID0gc2V0VGV4dHVyZTJEO1xuXHR0aGlzLnNldFRleHR1cmVDdWJlID0gc2V0VGV4dHVyZUN1YmU7XG5cdHRoaXMuc2V0VGV4dHVyZUN1YmVEeW5hbWljID0gc2V0VGV4dHVyZUN1YmVEeW5hbWljO1xuXHR0aGlzLnNldHVwUmVuZGVyVGFyZ2V0ID0gc2V0dXBSZW5kZXJUYXJnZXQ7XG5cdHRoaXMudXBkYXRlUmVuZGVyVGFyZ2V0TWlwbWFwID0gdXBkYXRlUmVuZGVyVGFyZ2V0TWlwbWFwO1xuXG59XG5cbi8qKlxuICogQGF1dGhvciB0aGVzcGl0ZSAvIGh0dHA6Ly93d3cudHdpdHRlci5jb20vdGhlc3BpdGVcbiAqL1xuXG5mdW5jdGlvbiBXZWJHTFV0aWxzKCBnbCwgZXh0ZW5zaW9ucyApIHtcblxuXHRmdW5jdGlvbiBjb252ZXJ0KCBwICkge1xuXG5cdFx0dmFyIGV4dGVuc2lvbjtcblxuXHRcdGlmICggcCA9PT0gUmVwZWF0V3JhcHBpbmcgKSByZXR1cm4gZ2wuUkVQRUFUO1xuXHRcdGlmICggcCA9PT0gQ2xhbXBUb0VkZ2VXcmFwcGluZyApIHJldHVybiBnbC5DTEFNUF9UT19FREdFO1xuXHRcdGlmICggcCA9PT0gTWlycm9yZWRSZXBlYXRXcmFwcGluZyApIHJldHVybiBnbC5NSVJST1JFRF9SRVBFQVQ7XG5cblx0XHRpZiAoIHAgPT09IE5lYXJlc3RGaWx0ZXIgKSByZXR1cm4gZ2wuTkVBUkVTVDtcblx0XHRpZiAoIHAgPT09IE5lYXJlc3RNaXBNYXBOZWFyZXN0RmlsdGVyICkgcmV0dXJuIGdsLk5FQVJFU1RfTUlQTUFQX05FQVJFU1Q7XG5cdFx0aWYgKCBwID09PSBOZWFyZXN0TWlwTWFwTGluZWFyRmlsdGVyICkgcmV0dXJuIGdsLk5FQVJFU1RfTUlQTUFQX0xJTkVBUjtcblxuXHRcdGlmICggcCA9PT0gTGluZWFyRmlsdGVyICkgcmV0dXJuIGdsLkxJTkVBUjtcblx0XHRpZiAoIHAgPT09IExpbmVhck1pcE1hcE5lYXJlc3RGaWx0ZXIgKSByZXR1cm4gZ2wuTElORUFSX01JUE1BUF9ORUFSRVNUO1xuXHRcdGlmICggcCA9PT0gTGluZWFyTWlwTWFwTGluZWFyRmlsdGVyICkgcmV0dXJuIGdsLkxJTkVBUl9NSVBNQVBfTElORUFSO1xuXG5cdFx0aWYgKCBwID09PSBVbnNpZ25lZEJ5dGVUeXBlICkgcmV0dXJuIGdsLlVOU0lHTkVEX0JZVEU7XG5cdFx0aWYgKCBwID09PSBVbnNpZ25lZFNob3J0NDQ0NFR5cGUgKSByZXR1cm4gZ2wuVU5TSUdORURfU0hPUlRfNF80XzRfNDtcblx0XHRpZiAoIHAgPT09IFVuc2lnbmVkU2hvcnQ1NTUxVHlwZSApIHJldHVybiBnbC5VTlNJR05FRF9TSE9SVF81XzVfNV8xO1xuXHRcdGlmICggcCA9PT0gVW5zaWduZWRTaG9ydDU2NVR5cGUgKSByZXR1cm4gZ2wuVU5TSUdORURfU0hPUlRfNV82XzU7XG5cblx0XHRpZiAoIHAgPT09IEJ5dGVUeXBlICkgcmV0dXJuIGdsLkJZVEU7XG5cdFx0aWYgKCBwID09PSBTaG9ydFR5cGUgKSByZXR1cm4gZ2wuU0hPUlQ7XG5cdFx0aWYgKCBwID09PSBVbnNpZ25lZFNob3J0VHlwZSApIHJldHVybiBnbC5VTlNJR05FRF9TSE9SVDtcblx0XHRpZiAoIHAgPT09IEludFR5cGUgKSByZXR1cm4gZ2wuSU5UO1xuXHRcdGlmICggcCA9PT0gVW5zaWduZWRJbnRUeXBlICkgcmV0dXJuIGdsLlVOU0lHTkVEX0lOVDtcblx0XHRpZiAoIHAgPT09IEZsb2F0VHlwZSApIHJldHVybiBnbC5GTE9BVDtcblxuXHRcdGlmICggcCA9PT0gSGFsZkZsb2F0VHlwZSApIHtcblxuXHRcdFx0ZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0JyApO1xuXG5cdFx0XHRpZiAoIGV4dGVuc2lvbiAhPT0gbnVsbCApIHJldHVybiBleHRlbnNpb24uSEFMRl9GTE9BVF9PRVM7XG5cblx0XHR9XG5cblx0XHRpZiAoIHAgPT09IEFscGhhRm9ybWF0ICkgcmV0dXJuIGdsLkFMUEhBO1xuXHRcdGlmICggcCA9PT0gUkdCRm9ybWF0ICkgcmV0dXJuIGdsLlJHQjtcblx0XHRpZiAoIHAgPT09IFJHQkFGb3JtYXQgKSByZXR1cm4gZ2wuUkdCQTtcblx0XHRpZiAoIHAgPT09IEx1bWluYW5jZUZvcm1hdCApIHJldHVybiBnbC5MVU1JTkFOQ0U7XG5cdFx0aWYgKCBwID09PSBMdW1pbmFuY2VBbHBoYUZvcm1hdCApIHJldHVybiBnbC5MVU1JTkFOQ0VfQUxQSEE7XG5cdFx0aWYgKCBwID09PSBEZXB0aEZvcm1hdCApIHJldHVybiBnbC5ERVBUSF9DT01QT05FTlQ7XG5cdFx0aWYgKCBwID09PSBEZXB0aFN0ZW5jaWxGb3JtYXQgKSByZXR1cm4gZ2wuREVQVEhfU1RFTkNJTDtcblxuXHRcdGlmICggcCA9PT0gQWRkRXF1YXRpb24gKSByZXR1cm4gZ2wuRlVOQ19BREQ7XG5cdFx0aWYgKCBwID09PSBTdWJ0cmFjdEVxdWF0aW9uICkgcmV0dXJuIGdsLkZVTkNfU1VCVFJBQ1Q7XG5cdFx0aWYgKCBwID09PSBSZXZlcnNlU3VidHJhY3RFcXVhdGlvbiApIHJldHVybiBnbC5GVU5DX1JFVkVSU0VfU1VCVFJBQ1Q7XG5cblx0XHRpZiAoIHAgPT09IFplcm9GYWN0b3IgKSByZXR1cm4gZ2wuWkVSTztcblx0XHRpZiAoIHAgPT09IE9uZUZhY3RvciApIHJldHVybiBnbC5PTkU7XG5cdFx0aWYgKCBwID09PSBTcmNDb2xvckZhY3RvciApIHJldHVybiBnbC5TUkNfQ09MT1I7XG5cdFx0aWYgKCBwID09PSBPbmVNaW51c1NyY0NvbG9yRmFjdG9yICkgcmV0dXJuIGdsLk9ORV9NSU5VU19TUkNfQ09MT1I7XG5cdFx0aWYgKCBwID09PSBTcmNBbHBoYUZhY3RvciApIHJldHVybiBnbC5TUkNfQUxQSEE7XG5cdFx0aWYgKCBwID09PSBPbmVNaW51c1NyY0FscGhhRmFjdG9yICkgcmV0dXJuIGdsLk9ORV9NSU5VU19TUkNfQUxQSEE7XG5cdFx0aWYgKCBwID09PSBEc3RBbHBoYUZhY3RvciApIHJldHVybiBnbC5EU1RfQUxQSEE7XG5cdFx0aWYgKCBwID09PSBPbmVNaW51c0RzdEFscGhhRmFjdG9yICkgcmV0dXJuIGdsLk9ORV9NSU5VU19EU1RfQUxQSEE7XG5cblx0XHRpZiAoIHAgPT09IERzdENvbG9yRmFjdG9yICkgcmV0dXJuIGdsLkRTVF9DT0xPUjtcblx0XHRpZiAoIHAgPT09IE9uZU1pbnVzRHN0Q29sb3JGYWN0b3IgKSByZXR1cm4gZ2wuT05FX01JTlVTX0RTVF9DT0xPUjtcblx0XHRpZiAoIHAgPT09IFNyY0FscGhhU2F0dXJhdGVGYWN0b3IgKSByZXR1cm4gZ2wuU1JDX0FMUEhBX1NBVFVSQVRFO1xuXG5cdFx0aWYgKCBwID09PSBSR0JfUzNUQ19EWFQxX0Zvcm1hdCB8fCBwID09PSBSR0JBX1MzVENfRFhUMV9Gb3JtYXQgfHxcblx0XHRcdHAgPT09IFJHQkFfUzNUQ19EWFQzX0Zvcm1hdCB8fCBwID09PSBSR0JBX1MzVENfRFhUNV9Gb3JtYXQgKSB7XG5cblx0XHRcdGV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMnICk7XG5cblx0XHRcdGlmICggZXh0ZW5zaW9uICE9PSBudWxsICkge1xuXG5cdFx0XHRcdGlmICggcCA9PT0gUkdCX1MzVENfRFhUMV9Gb3JtYXQgKSByZXR1cm4gZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCX1MzVENfRFhUMV9FWFQ7XG5cdFx0XHRcdGlmICggcCA9PT0gUkdCQV9TM1RDX0RYVDFfRm9ybWF0ICkgcmV0dXJuIGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQxX0VYVDtcblx0XHRcdFx0aWYgKCBwID09PSBSR0JBX1MzVENfRFhUM19Gb3JtYXQgKSByZXR1cm4gZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDNfRVhUO1xuXHRcdFx0XHRpZiAoIHAgPT09IFJHQkFfUzNUQ19EWFQ1X0Zvcm1hdCApIHJldHVybiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUNV9FWFQ7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggcCA9PT0gUkdCX1BWUlRDXzRCUFBWMV9Gb3JtYXQgfHwgcCA9PT0gUkdCX1BWUlRDXzJCUFBWMV9Gb3JtYXQgfHxcblx0XHRcdHAgPT09IFJHQkFfUFZSVENfNEJQUFYxX0Zvcm1hdCB8fCBwID09PSBSR0JBX1BWUlRDXzJCUFBWMV9Gb3JtYXQgKSB7XG5cblx0XHRcdGV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjJyApO1xuXG5cdFx0XHRpZiAoIGV4dGVuc2lvbiAhPT0gbnVsbCApIHtcblxuXHRcdFx0XHRpZiAoIHAgPT09IFJHQl9QVlJUQ180QlBQVjFfRm9ybWF0ICkgcmV0dXJuIGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQl9QVlJUQ180QlBQVjFfSU1HO1xuXHRcdFx0XHRpZiAoIHAgPT09IFJHQl9QVlJUQ18yQlBQVjFfRm9ybWF0ICkgcmV0dXJuIGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQl9QVlJUQ18yQlBQVjFfSU1HO1xuXHRcdFx0XHRpZiAoIHAgPT09IFJHQkFfUFZSVENfNEJQUFYxX0Zvcm1hdCApIHJldHVybiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JBX1BWUlRDXzRCUFBWMV9JTUc7XG5cdFx0XHRcdGlmICggcCA9PT0gUkdCQV9QVlJUQ18yQlBQVjFfRm9ybWF0ICkgcmV0dXJuIGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQkFfUFZSVENfMkJQUFYxX0lNRztcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCBwID09PSBSR0JfRVRDMV9Gb3JtYXQgKSB7XG5cblx0XHRcdGV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX2V0YzEnICk7XG5cblx0XHRcdGlmICggZXh0ZW5zaW9uICE9PSBudWxsICkgcmV0dXJuIGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQl9FVEMxX1dFQkdMO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBwID09PSBSR0JBX0FTVENfNHg0X0Zvcm1hdCB8fCBwID09PSBSR0JBX0FTVENfNXg0X0Zvcm1hdCB8fCBwID09PSBSR0JBX0FTVENfNXg1X0Zvcm1hdCB8fFxuXHRcdFx0cCA9PT0gUkdCQV9BU1RDXzZ4NV9Gb3JtYXQgfHwgcCA9PT0gUkdCQV9BU1RDXzZ4Nl9Gb3JtYXQgfHwgcCA9PT0gUkdCQV9BU1RDXzh4NV9Gb3JtYXQgfHxcblx0XHRcdHAgPT09IFJHQkFfQVNUQ184eDZfRm9ybWF0IHx8IHAgPT09IFJHQkFfQVNUQ184eDhfRm9ybWF0IHx8IHAgPT09IFJHQkFfQVNUQ18xMHg1X0Zvcm1hdCB8fFxuXHRcdFx0cCA9PT0gUkdCQV9BU1RDXzEweDZfRm9ybWF0IHx8IHAgPT09IFJHQkFfQVNUQ18xMHg4X0Zvcm1hdCB8fCBwID09PSBSR0JBX0FTVENfMTB4MTBfRm9ybWF0IHx8XG5cdFx0XHRwID09PSBSR0JBX0FTVENfMTJ4MTBfRm9ybWF0IHx8IHAgPT09IFJHQkFfQVNUQ18xMngxMl9Gb3JtYXQgKSB7XG5cblx0XHRcdGV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX2FzdGMnICk7XG5cblx0XHRcdGlmICggZXh0ZW5zaW9uICE9PSBudWxsICkge1xuXG5cdFx0XHRcdHJldHVybiBwO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIHAgPT09IE1pbkVxdWF0aW9uIHx8IHAgPT09IE1heEVxdWF0aW9uICkge1xuXG5cdFx0XHRleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ0VYVF9ibGVuZF9taW5tYXgnICk7XG5cblx0XHRcdGlmICggZXh0ZW5zaW9uICE9PSBudWxsICkge1xuXG5cdFx0XHRcdGlmICggcCA9PT0gTWluRXF1YXRpb24gKSByZXR1cm4gZXh0ZW5zaW9uLk1JTl9FWFQ7XG5cdFx0XHRcdGlmICggcCA9PT0gTWF4RXF1YXRpb24gKSByZXR1cm4gZXh0ZW5zaW9uLk1BWF9FWFQ7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggcCA9PT0gVW5zaWduZWRJbnQyNDhUeXBlICkge1xuXG5cdFx0XHRleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ1dFQkdMX2RlcHRoX3RleHR1cmUnICk7XG5cblx0XHRcdGlmICggZXh0ZW5zaW9uICE9PSBudWxsICkgcmV0dXJuIGV4dGVuc2lvbi5VTlNJR05FRF9JTlRfMjRfOF9XRUJHTDtcblxuXHRcdH1cblxuXHRcdHJldHVybiAwO1xuXG5cdH1cblxuXHRyZXR1cm4geyBjb252ZXJ0OiBjb252ZXJ0IH07XG5cbn1cblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBncmVnZ21hbiAvIGh0dHA6Ly9nYW1lcy5ncmVnZ21hbi5jb20vXG4gKiBAYXV0aG9yIHp6ODUgLyBodHRwOi8vd3d3LmxhYjRnYW1lcy5uZXQveno4NS9ibG9nXG4gKiBAYXV0aG9yIHRzY2h3XG4gKi9cblxuZnVuY3Rpb24gUGVyc3BlY3RpdmVDYW1lcmEoIGZvdiwgYXNwZWN0LCBuZWFyLCBmYXIgKSB7XG5cblx0Q2FtZXJhLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnUGVyc3BlY3RpdmVDYW1lcmEnO1xuXG5cdHRoaXMuZm92ID0gZm92ICE9PSB1bmRlZmluZWQgPyBmb3YgOiA1MDtcblx0dGhpcy56b29tID0gMTtcblxuXHR0aGlzLm5lYXIgPSBuZWFyICE9PSB1bmRlZmluZWQgPyBuZWFyIDogMC4xO1xuXHR0aGlzLmZhciA9IGZhciAhPT0gdW5kZWZpbmVkID8gZmFyIDogMjAwMDtcblx0dGhpcy5mb2N1cyA9IDEwO1xuXG5cdHRoaXMuYXNwZWN0ID0gYXNwZWN0ICE9PSB1bmRlZmluZWQgPyBhc3BlY3QgOiAxO1xuXHR0aGlzLnZpZXcgPSBudWxsO1xuXG5cdHRoaXMuZmlsbUdhdWdlID0gMzU7XHQvLyB3aWR0aCBvZiB0aGUgZmlsbSAoZGVmYXVsdCBpbiBtaWxsaW1ldGVycylcblx0dGhpcy5maWxtT2Zmc2V0ID0gMDtcdC8vIGhvcml6b250YWwgZmlsbSBvZmZzZXQgKHNhbWUgdW5pdCBhcyBnYXVnZSlcblxuXHR0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtcblxufVxuXG5QZXJzcGVjdGl2ZUNhbWVyYS5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBDYW1lcmEucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogUGVyc3BlY3RpdmVDYW1lcmEsXG5cblx0aXNQZXJzcGVjdGl2ZUNhbWVyYTogdHJ1ZSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSwgcmVjdXJzaXZlICkge1xuXG5cdFx0Q2FtZXJhLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSwgcmVjdXJzaXZlICk7XG5cblx0XHR0aGlzLmZvdiA9IHNvdXJjZS5mb3Y7XG5cdFx0dGhpcy56b29tID0gc291cmNlLnpvb207XG5cblx0XHR0aGlzLm5lYXIgPSBzb3VyY2UubmVhcjtcblx0XHR0aGlzLmZhciA9IHNvdXJjZS5mYXI7XG5cdFx0dGhpcy5mb2N1cyA9IHNvdXJjZS5mb2N1cztcblxuXHRcdHRoaXMuYXNwZWN0ID0gc291cmNlLmFzcGVjdDtcblx0XHR0aGlzLnZpZXcgPSBzb3VyY2UudmlldyA9PT0gbnVsbCA/IG51bGwgOiBPYmplY3QuYXNzaWduKCB7fSwgc291cmNlLnZpZXcgKTtcblxuXHRcdHRoaXMuZmlsbUdhdWdlID0gc291cmNlLmZpbG1HYXVnZTtcblx0XHR0aGlzLmZpbG1PZmZzZXQgPSBzb3VyY2UuZmlsbU9mZnNldDtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIEZPViBieSBmb2NhbCBsZW5ndGggaW4gcmVzcGVjdCB0byB0aGUgY3VycmVudCAuZmlsbUdhdWdlLlxuXHQgKlxuXHQgKiBUaGUgZGVmYXVsdCBmaWxtIGdhdWdlIGlzIDM1LCBzbyB0aGF0IHRoZSBmb2NhbCBsZW5ndGggY2FuIGJlIHNwZWNpZmllZCBmb3Jcblx0ICogYSAzNW1tIChmdWxsIGZyYW1lKSBjYW1lcmEuXG5cdCAqXG5cdCAqIFZhbHVlcyBmb3IgZm9jYWwgbGVuZ3RoIGFuZCBmaWxtIGdhdWdlIG11c3QgaGF2ZSB0aGUgc2FtZSB1bml0LlxuXHQgKi9cblx0c2V0Rm9jYWxMZW5ndGg6IGZ1bmN0aW9uICggZm9jYWxMZW5ndGggKSB7XG5cblx0XHQvLyBzZWUgaHR0cDovL3d3dy5ib2JhdGtpbnMuY29tL3Bob3RvZ3JhcGh5L3RlY2huaWNhbC9maWVsZF9vZl92aWV3Lmh0bWxcblx0XHR2YXIgdkV4dGVudFNsb3BlID0gMC41ICogdGhpcy5nZXRGaWxtSGVpZ2h0KCkgLyBmb2NhbExlbmd0aDtcblxuXHRcdHRoaXMuZm92ID0gX01hdGguUkFEMkRFRyAqIDIgKiBNYXRoLmF0YW4oIHZFeHRlbnRTbG9wZSApO1xuXHRcdHRoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xuXG5cdH0sXG5cblx0LyoqXG5cdCAqIENhbGN1bGF0ZXMgdGhlIGZvY2FsIGxlbmd0aCBmcm9tIHRoZSBjdXJyZW50IC5mb3YgYW5kIC5maWxtR2F1Z2UuXG5cdCAqL1xuXHRnZXRGb2NhbExlbmd0aDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHZFeHRlbnRTbG9wZSA9IE1hdGgudGFuKCBfTWF0aC5ERUcyUkFEICogMC41ICogdGhpcy5mb3YgKTtcblxuXHRcdHJldHVybiAwLjUgKiB0aGlzLmdldEZpbG1IZWlnaHQoKSAvIHZFeHRlbnRTbG9wZTtcblxuXHR9LFxuXG5cdGdldEVmZmVjdGl2ZUZPVjogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIF9NYXRoLlJBRDJERUcgKiAyICogTWF0aC5hdGFuKFxuXHRcdFx0TWF0aC50YW4oIF9NYXRoLkRFRzJSQUQgKiAwLjUgKiB0aGlzLmZvdiApIC8gdGhpcy56b29tICk7XG5cblx0fSxcblxuXHRnZXRGaWxtV2lkdGg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIGZpbG0gbm90IGNvbXBsZXRlbHkgY292ZXJlZCBpbiBwb3J0cmFpdCBmb3JtYXQgKGFzcGVjdCA8IDEpXG5cdFx0cmV0dXJuIHRoaXMuZmlsbUdhdWdlICogTWF0aC5taW4oIHRoaXMuYXNwZWN0LCAxICk7XG5cblx0fSxcblxuXHRnZXRGaWxtSGVpZ2h0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyBmaWxtIG5vdCBjb21wbGV0ZWx5IGNvdmVyZWQgaW4gbGFuZHNjYXBlIGZvcm1hdCAoYXNwZWN0ID4gMSlcblx0XHRyZXR1cm4gdGhpcy5maWxtR2F1Z2UgLyBNYXRoLm1heCggdGhpcy5hc3BlY3QsIDEgKTtcblxuXHR9LFxuXG5cdC8qKlxuXHQgKiBTZXRzIGFuIG9mZnNldCBpbiBhIGxhcmdlciBmcnVzdHVtLiBUaGlzIGlzIHVzZWZ1bCBmb3IgbXVsdGktd2luZG93IG9yXG5cdCAqIG11bHRpLW1vbml0b3IvbXVsdGktbWFjaGluZSBzZXR1cHMuXG5cdCAqXG5cdCAqIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSAzeDIgbW9uaXRvcnMgYW5kIGVhY2ggbW9uaXRvciBpcyAxOTIweDEwODAgYW5kXG5cdCAqIHRoZSBtb25pdG9ycyBhcmUgaW4gZ3JpZCBsaWtlIHRoaXNcblx0ICpcblx0ICogICArLS0tKy0tLSstLS0rXG5cdCAqICAgfCBBIHwgQiB8IEMgfFxuXHQgKiAgICstLS0rLS0tKy0tLStcblx0ICogICB8IEQgfCBFIHwgRiB8XG5cdCAqICAgKy0tLSstLS0rLS0tK1xuXHQgKlxuXHQgKiB0aGVuIGZvciBlYWNoIG1vbml0b3IgeW91IHdvdWxkIGNhbGwgaXQgbGlrZSB0aGlzXG5cdCAqXG5cdCAqICAgdmFyIHcgPSAxOTIwO1xuXHQgKiAgIHZhciBoID0gMTA4MDtcblx0ICogICB2YXIgZnVsbFdpZHRoID0gdyAqIDM7XG5cdCAqICAgdmFyIGZ1bGxIZWlnaHQgPSBoICogMjtcblx0ICpcblx0ICogICAtLUEtLVxuXHQgKiAgIGNhbWVyYS5zZXRPZmZzZXQoIGZ1bGxXaWR0aCwgZnVsbEhlaWdodCwgdyAqIDAsIGggKiAwLCB3LCBoICk7XG5cdCAqICAgLS1CLS1cblx0ICogICBjYW1lcmEuc2V0T2Zmc2V0KCBmdWxsV2lkdGgsIGZ1bGxIZWlnaHQsIHcgKiAxLCBoICogMCwgdywgaCApO1xuXHQgKiAgIC0tQy0tXG5cdCAqICAgY2FtZXJhLnNldE9mZnNldCggZnVsbFdpZHRoLCBmdWxsSGVpZ2h0LCB3ICogMiwgaCAqIDAsIHcsIGggKTtcblx0ICogICAtLUQtLVxuXHQgKiAgIGNhbWVyYS5zZXRPZmZzZXQoIGZ1bGxXaWR0aCwgZnVsbEhlaWdodCwgdyAqIDAsIGggKiAxLCB3LCBoICk7XG5cdCAqICAgLS1FLS1cblx0ICogICBjYW1lcmEuc2V0T2Zmc2V0KCBmdWxsV2lkdGgsIGZ1bGxIZWlnaHQsIHcgKiAxLCBoICogMSwgdywgaCApO1xuXHQgKiAgIC0tRi0tXG5cdCAqICAgY2FtZXJhLnNldE9mZnNldCggZnVsbFdpZHRoLCBmdWxsSGVpZ2h0LCB3ICogMiwgaCAqIDEsIHcsIGggKTtcblx0ICpcblx0ICogICBOb3RlIHRoZXJlIGlzIG5vIHJlYXNvbiBtb25pdG9ycyBoYXZlIHRvIGJlIHRoZSBzYW1lIHNpemUgb3IgaW4gYSBncmlkLlxuXHQgKi9cblx0c2V0Vmlld09mZnNldDogZnVuY3Rpb24gKCBmdWxsV2lkdGgsIGZ1bGxIZWlnaHQsIHgsIHksIHdpZHRoLCBoZWlnaHQgKSB7XG5cblx0XHR0aGlzLmFzcGVjdCA9IGZ1bGxXaWR0aCAvIGZ1bGxIZWlnaHQ7XG5cblx0XHRpZiAoIHRoaXMudmlldyA9PT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy52aWV3ID0ge1xuXHRcdFx0XHRlbmFibGVkOiB0cnVlLFxuXHRcdFx0XHRmdWxsV2lkdGg6IDEsXG5cdFx0XHRcdGZ1bGxIZWlnaHQ6IDEsXG5cdFx0XHRcdG9mZnNldFg6IDAsXG5cdFx0XHRcdG9mZnNldFk6IDAsXG5cdFx0XHRcdHdpZHRoOiAxLFxuXHRcdFx0XHRoZWlnaHQ6IDFcblx0XHRcdH07XG5cblx0XHR9XG5cblx0XHR0aGlzLnZpZXcuZW5hYmxlZCA9IHRydWU7XG5cdFx0dGhpcy52aWV3LmZ1bGxXaWR0aCA9IGZ1bGxXaWR0aDtcblx0XHR0aGlzLnZpZXcuZnVsbEhlaWdodCA9IGZ1bGxIZWlnaHQ7XG5cdFx0dGhpcy52aWV3Lm9mZnNldFggPSB4O1xuXHRcdHRoaXMudmlldy5vZmZzZXRZID0geTtcblx0XHR0aGlzLnZpZXcud2lkdGggPSB3aWR0aDtcblx0XHR0aGlzLnZpZXcuaGVpZ2h0ID0gaGVpZ2h0O1xuXG5cdFx0dGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XG5cblx0fSxcblxuXHRjbGVhclZpZXdPZmZzZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGlmICggdGhpcy52aWV3ICE9PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLnZpZXcuZW5hYmxlZCA9IGZhbHNlO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XG5cblx0fSxcblxuXHR1cGRhdGVQcm9qZWN0aW9uTWF0cml4OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgbmVhciA9IHRoaXMubmVhcixcblx0XHRcdHRvcCA9IG5lYXIgKiBNYXRoLnRhbihcblx0XHRcdFx0X01hdGguREVHMlJBRCAqIDAuNSAqIHRoaXMuZm92ICkgLyB0aGlzLnpvb20sXG5cdFx0XHRoZWlnaHQgPSAyICogdG9wLFxuXHRcdFx0d2lkdGggPSB0aGlzLmFzcGVjdCAqIGhlaWdodCxcblx0XHRcdGxlZnQgPSAtIDAuNSAqIHdpZHRoLFxuXHRcdFx0dmlldyA9IHRoaXMudmlldztcblxuXHRcdGlmICggdGhpcy52aWV3ICE9PSBudWxsICYmIHRoaXMudmlldy5lbmFibGVkICkge1xuXG5cdFx0XHR2YXIgZnVsbFdpZHRoID0gdmlldy5mdWxsV2lkdGgsXG5cdFx0XHRcdGZ1bGxIZWlnaHQgPSB2aWV3LmZ1bGxIZWlnaHQ7XG5cblx0XHRcdGxlZnQgKz0gdmlldy5vZmZzZXRYICogd2lkdGggLyBmdWxsV2lkdGg7XG5cdFx0XHR0b3AgLT0gdmlldy5vZmZzZXRZICogaGVpZ2h0IC8gZnVsbEhlaWdodDtcblx0XHRcdHdpZHRoICo9IHZpZXcud2lkdGggLyBmdWxsV2lkdGg7XG5cdFx0XHRoZWlnaHQgKj0gdmlldy5oZWlnaHQgLyBmdWxsSGVpZ2h0O1xuXG5cdFx0fVxuXG5cdFx0dmFyIHNrZXcgPSB0aGlzLmZpbG1PZmZzZXQ7XG5cdFx0aWYgKCBza2V3ICE9PSAwICkgbGVmdCArPSBuZWFyICogc2tldyAvIHRoaXMuZ2V0RmlsbVdpZHRoKCk7XG5cblx0XHR0aGlzLnByb2plY3Rpb25NYXRyaXgubWFrZVBlcnNwZWN0aXZlKCBsZWZ0LCBsZWZ0ICsgd2lkdGgsIHRvcCwgdG9wIC0gaGVpZ2h0LCBuZWFyLCB0aGlzLmZhciApO1xuXG5cdH0sXG5cblx0dG9KU09OOiBmdW5jdGlvbiAoIG1ldGEgKSB7XG5cblx0XHR2YXIgZGF0YSA9IE9iamVjdDNELnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcywgbWV0YSApO1xuXG5cdFx0ZGF0YS5vYmplY3QuZm92ID0gdGhpcy5mb3Y7XG5cdFx0ZGF0YS5vYmplY3Quem9vbSA9IHRoaXMuem9vbTtcblxuXHRcdGRhdGEub2JqZWN0Lm5lYXIgPSB0aGlzLm5lYXI7XG5cdFx0ZGF0YS5vYmplY3QuZmFyID0gdGhpcy5mYXI7XG5cdFx0ZGF0YS5vYmplY3QuZm9jdXMgPSB0aGlzLmZvY3VzO1xuXG5cdFx0ZGF0YS5vYmplY3QuYXNwZWN0ID0gdGhpcy5hc3BlY3Q7XG5cblx0XHRpZiAoIHRoaXMudmlldyAhPT0gbnVsbCApIGRhdGEub2JqZWN0LnZpZXcgPSBPYmplY3QuYXNzaWduKCB7fSwgdGhpcy52aWV3ICk7XG5cblx0XHRkYXRhLm9iamVjdC5maWxtR2F1Z2UgPSB0aGlzLmZpbG1HYXVnZTtcblx0XHRkYXRhLm9iamVjdC5maWxtT2Zmc2V0ID0gdGhpcy5maWxtT2Zmc2V0O1xuXG5cdFx0cmV0dXJuIGRhdGE7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBBcnJheUNhbWVyYSggYXJyYXkgKSB7XG5cblx0UGVyc3BlY3RpdmVDYW1lcmEuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMuY2FtZXJhcyA9IGFycmF5IHx8IFtdO1xuXG59XG5cbkFycmF5Q2FtZXJhLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIFBlcnNwZWN0aXZlQ2FtZXJhLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IEFycmF5Q2FtZXJhLFxuXG5cdGlzQXJyYXlDYW1lcmE6IHRydWVcblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gV2ViVlJNYW5hZ2VyKCByZW5kZXJlciApIHtcblxuXHR2YXIgc2NvcGUgPSB0aGlzO1xuXG5cdHZhciBkZXZpY2UgPSBudWxsO1xuXHR2YXIgZnJhbWVEYXRhID0gbnVsbDtcblxuXHR2YXIgcG9zZVRhcmdldCA9IG51bGw7XG5cblx0dmFyIHN0YW5kaW5nTWF0cml4ID0gbmV3IE1hdHJpeDQoKTtcblx0dmFyIHN0YW5kaW5nTWF0cml4SW52ZXJzZSA9IG5ldyBNYXRyaXg0KCk7XG5cblx0aWYgKCB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiAnVlJGcmFtZURhdGEnIGluIHdpbmRvdyApIHtcblxuXHRcdGZyYW1lRGF0YSA9IG5ldyB3aW5kb3cuVlJGcmFtZURhdGEoKTtcblx0XHR3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciggJ3ZyZGlzcGxheXByZXNlbnRjaGFuZ2UnLCBvblZSRGlzcGxheVByZXNlbnRDaGFuZ2UsIGZhbHNlICk7XG5cblx0fVxuXG5cdHZhciBtYXRyaXhXb3JsZEludmVyc2UgPSBuZXcgTWF0cml4NCgpO1xuXHR2YXIgdGVtcFF1YXRlcm5pb24gPSBuZXcgUXVhdGVybmlvbigpO1xuXHR2YXIgdGVtcFBvc2l0aW9uID0gbmV3IFZlY3RvcjMoKTtcblxuXHR2YXIgY2FtZXJhTCA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSgpO1xuXHRjYW1lcmFMLmJvdW5kcyA9IG5ldyBWZWN0b3I0KCAwLjAsIDAuMCwgMC41LCAxLjAgKTtcblx0Y2FtZXJhTC5sYXllcnMuZW5hYmxlKCAxICk7XG5cblx0dmFyIGNhbWVyYVIgPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoKTtcblx0Y2FtZXJhUi5ib3VuZHMgPSBuZXcgVmVjdG9yNCggMC41LCAwLjAsIDAuNSwgMS4wICk7XG5cdGNhbWVyYVIubGF5ZXJzLmVuYWJsZSggMiApO1xuXG5cdHZhciBjYW1lcmFWUiA9IG5ldyBBcnJheUNhbWVyYSggWyBjYW1lcmFMLCBjYW1lcmFSIF0gKTtcblx0Y2FtZXJhVlIubGF5ZXJzLmVuYWJsZSggMSApO1xuXHRjYW1lcmFWUi5sYXllcnMuZW5hYmxlKCAyICk7XG5cblx0Ly9cblxuXHRmdW5jdGlvbiBpc1ByZXNlbnRpbmcoKSB7XG5cblx0XHRyZXR1cm4gZGV2aWNlICE9PSBudWxsICYmIGRldmljZS5pc1ByZXNlbnRpbmcgPT09IHRydWU7XG5cblx0fVxuXG5cdHZhciBjdXJyZW50U2l6ZSwgY3VycmVudFBpeGVsUmF0aW87XG5cblx0ZnVuY3Rpb24gb25WUkRpc3BsYXlQcmVzZW50Q2hhbmdlKCkge1xuXG5cdFx0aWYgKCBpc1ByZXNlbnRpbmcoKSApIHtcblxuXHRcdFx0dmFyIGV5ZVBhcmFtZXRlcnMgPSBkZXZpY2UuZ2V0RXllUGFyYW1ldGVycyggJ2xlZnQnICk7XG5cdFx0XHR2YXIgcmVuZGVyV2lkdGggPSBleWVQYXJhbWV0ZXJzLnJlbmRlcldpZHRoO1xuXHRcdFx0dmFyIHJlbmRlckhlaWdodCA9IGV5ZVBhcmFtZXRlcnMucmVuZGVySGVpZ2h0O1xuXG5cdFx0XHRjdXJyZW50UGl4ZWxSYXRpbyA9IHJlbmRlcmVyLmdldFBpeGVsUmF0aW8oKTtcblx0XHRcdGN1cnJlbnRTaXplID0gcmVuZGVyZXIuZ2V0U2l6ZSgpO1xuXG5cdFx0XHRyZW5kZXJlci5zZXREcmF3aW5nQnVmZmVyU2l6ZSggcmVuZGVyV2lkdGggKiAyLCByZW5kZXJIZWlnaHQsIDEgKTtcblxuXHRcdH0gZWxzZSBpZiAoIHNjb3BlLmVuYWJsZWQgKSB7XG5cblx0XHRcdHJlbmRlcmVyLnNldERyYXdpbmdCdWZmZXJTaXplKCBjdXJyZW50U2l6ZS53aWR0aCwgY3VycmVudFNpemUuaGVpZ2h0LCBjdXJyZW50UGl4ZWxSYXRpbyApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHQvL1xuXG5cdHRoaXMuZW5hYmxlZCA9IGZhbHNlO1xuXHR0aGlzLnVzZXJIZWlnaHQgPSAxLjY7XG5cblx0dGhpcy5nZXREZXZpY2UgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gZGV2aWNlO1xuXG5cdH07XG5cblx0dGhpcy5zZXREZXZpY2UgPSBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0aWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkgZGV2aWNlID0gdmFsdWU7XG5cblx0fTtcblxuXHR0aGlzLnNldFBvc2VUYXJnZXQgPSBmdW5jdGlvbiAoIG9iamVjdCApIHtcblxuXHRcdGlmICggb2JqZWN0ICE9PSB1bmRlZmluZWQgKSBwb3NlVGFyZ2V0ID0gb2JqZWN0O1xuXG5cdH07XG5cblx0dGhpcy5nZXRDYW1lcmEgPSBmdW5jdGlvbiAoIGNhbWVyYSApIHtcblxuXHRcdGlmICggZGV2aWNlID09PSBudWxsICkgcmV0dXJuIGNhbWVyYTtcblxuXHRcdGRldmljZS5kZXB0aE5lYXIgPSBjYW1lcmEubmVhcjtcblx0XHRkZXZpY2UuZGVwdGhGYXIgPSBjYW1lcmEuZmFyO1xuXG5cdFx0ZGV2aWNlLmdldEZyYW1lRGF0YSggZnJhbWVEYXRhICk7XG5cblx0XHQvL1xuXG5cdFx0dmFyIHN0YWdlUGFyYW1ldGVycyA9IGRldmljZS5zdGFnZVBhcmFtZXRlcnM7XG5cblx0XHRpZiAoIHN0YWdlUGFyYW1ldGVycyApIHtcblxuXHRcdFx0c3RhbmRpbmdNYXRyaXguZnJvbUFycmF5KCBzdGFnZVBhcmFtZXRlcnMuc2l0dGluZ1RvU3RhbmRpbmdUcmFuc2Zvcm0gKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHN0YW5kaW5nTWF0cml4Lm1ha2VUcmFuc2xhdGlvbiggMCwgc2NvcGUudXNlckhlaWdodCwgMCApO1xuXG5cdFx0fVxuXG5cblx0XHR2YXIgcG9zZSA9IGZyYW1lRGF0YS5wb3NlO1xuXHRcdHZhciBwb3NlT2JqZWN0ID0gcG9zZVRhcmdldCAhPT0gbnVsbCA/IHBvc2VUYXJnZXQgOiBjYW1lcmE7XG5cblx0XHQvLyBXZSB3YW50IHRvIG1hbmlwdWxhdGUgcG9zZU9iamVjdCBieSBpdHMgcG9zaXRpb24gYW5kIHF1YXRlcm5pb24gY29tcG9uZW50cyBzaW5jZSB1c2VycyBtYXkgcmVseSBvbiB0aGVtLlxuXHRcdHBvc2VPYmplY3QubWF0cml4LmNvcHkoIHN0YW5kaW5nTWF0cml4ICk7XG5cdFx0cG9zZU9iamVjdC5tYXRyaXguZGVjb21wb3NlKCBwb3NlT2JqZWN0LnBvc2l0aW9uLCBwb3NlT2JqZWN0LnF1YXRlcm5pb24sIHBvc2VPYmplY3Quc2NhbGUgKTtcblxuXHRcdGlmICggcG9zZS5vcmllbnRhdGlvbiAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGVtcFF1YXRlcm5pb24uZnJvbUFycmF5KCBwb3NlLm9yaWVudGF0aW9uICk7XG5cdFx0XHRwb3NlT2JqZWN0LnF1YXRlcm5pb24ubXVsdGlwbHkoIHRlbXBRdWF0ZXJuaW9uICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIHBvc2UucG9zaXRpb24gIT09IG51bGwgKSB7XG5cblx0XHRcdHRlbXBRdWF0ZXJuaW9uLnNldEZyb21Sb3RhdGlvbk1hdHJpeCggc3RhbmRpbmdNYXRyaXggKTtcblx0XHRcdHRlbXBQb3NpdGlvbi5mcm9tQXJyYXkoIHBvc2UucG9zaXRpb24gKTtcblx0XHRcdHRlbXBQb3NpdGlvbi5hcHBseVF1YXRlcm5pb24oIHRlbXBRdWF0ZXJuaW9uICk7XG5cdFx0XHRwb3NlT2JqZWN0LnBvc2l0aW9uLmFkZCggdGVtcFBvc2l0aW9uICk7XG5cblx0XHR9XG5cblx0XHRwb3NlT2JqZWN0LnVwZGF0ZU1hdHJpeFdvcmxkKCk7XG5cblx0XHRpZiAoIGRldmljZS5pc1ByZXNlbnRpbmcgPT09IGZhbHNlICkgcmV0dXJuIGNhbWVyYTtcblxuXHRcdC8vXG5cblx0XHRjYW1lcmFMLm5lYXIgPSBjYW1lcmEubmVhcjtcblx0XHRjYW1lcmFSLm5lYXIgPSBjYW1lcmEubmVhcjtcblxuXHRcdGNhbWVyYUwuZmFyID0gY2FtZXJhLmZhcjtcblx0XHRjYW1lcmFSLmZhciA9IGNhbWVyYS5mYXI7XG5cblx0XHRjYW1lcmFWUi5tYXRyaXhXb3JsZC5jb3B5KCBjYW1lcmEubWF0cml4V29ybGQgKTtcblx0XHRjYW1lcmFWUi5tYXRyaXhXb3JsZEludmVyc2UuY29weSggY2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZSApO1xuXG5cdFx0Y2FtZXJhTC5tYXRyaXhXb3JsZEludmVyc2UuZnJvbUFycmF5KCBmcmFtZURhdGEubGVmdFZpZXdNYXRyaXggKTtcblx0XHRjYW1lcmFSLm1hdHJpeFdvcmxkSW52ZXJzZS5mcm9tQXJyYXkoIGZyYW1lRGF0YS5yaWdodFZpZXdNYXRyaXggKTtcblxuXHRcdC8vIFRPRE8gKG1yZG9vYikgRG91YmxlIGNoZWNrIHRoaXMgY29kZVxuXG5cdFx0c3RhbmRpbmdNYXRyaXhJbnZlcnNlLmdldEludmVyc2UoIHN0YW5kaW5nTWF0cml4ICk7XG5cblx0XHRjYW1lcmFMLm1hdHJpeFdvcmxkSW52ZXJzZS5tdWx0aXBseSggc3RhbmRpbmdNYXRyaXhJbnZlcnNlICk7XG5cdFx0Y2FtZXJhUi5tYXRyaXhXb3JsZEludmVyc2UubXVsdGlwbHkoIHN0YW5kaW5nTWF0cml4SW52ZXJzZSApO1xuXG5cdFx0dmFyIHBhcmVudCA9IHBvc2VPYmplY3QucGFyZW50O1xuXG5cdFx0aWYgKCBwYXJlbnQgIT09IG51bGwgKSB7XG5cblx0XHRcdG1hdHJpeFdvcmxkSW52ZXJzZS5nZXRJbnZlcnNlKCBwYXJlbnQubWF0cml4V29ybGQgKTtcblxuXHRcdFx0Y2FtZXJhTC5tYXRyaXhXb3JsZEludmVyc2UubXVsdGlwbHkoIG1hdHJpeFdvcmxkSW52ZXJzZSApO1xuXHRcdFx0Y2FtZXJhUi5tYXRyaXhXb3JsZEludmVyc2UubXVsdGlwbHkoIG1hdHJpeFdvcmxkSW52ZXJzZSApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gZW52TWFwIGFuZCBNaXJyb3IgbmVlZHMgY2FtZXJhLm1hdHJpeFdvcmxkXG5cblx0XHRjYW1lcmFMLm1hdHJpeFdvcmxkLmdldEludmVyc2UoIGNhbWVyYUwubWF0cml4V29ybGRJbnZlcnNlICk7XG5cdFx0Y2FtZXJhUi5tYXRyaXhXb3JsZC5nZXRJbnZlcnNlKCBjYW1lcmFSLm1hdHJpeFdvcmxkSW52ZXJzZSApO1xuXG5cdFx0Y2FtZXJhTC5wcm9qZWN0aW9uTWF0cml4LmZyb21BcnJheSggZnJhbWVEYXRhLmxlZnRQcm9qZWN0aW9uTWF0cml4ICk7XG5cdFx0Y2FtZXJhUi5wcm9qZWN0aW9uTWF0cml4LmZyb21BcnJheSggZnJhbWVEYXRhLnJpZ2h0UHJvamVjdGlvbk1hdHJpeCApO1xuXG5cdFx0Ly8gSEFDSyAobXJkb29iKVxuXHRcdC8vIGh0dHBzOi8vZ2l0aHViLmNvbS93M2Mvd2VidnIvaXNzdWVzLzIwM1xuXG5cdFx0Y2FtZXJhVlIucHJvamVjdGlvbk1hdHJpeC5jb3B5KCBjYW1lcmFMLnByb2plY3Rpb25NYXRyaXggKTtcblxuXHRcdC8vXG5cblx0XHR2YXIgbGF5ZXJzID0gZGV2aWNlLmdldExheWVycygpO1xuXG5cdFx0aWYgKCBsYXllcnMubGVuZ3RoICkge1xuXG5cdFx0XHR2YXIgbGF5ZXIgPSBsYXllcnNbIDAgXTtcblxuXHRcdFx0aWYgKCBsYXllci5sZWZ0Qm91bmRzICE9PSBudWxsICYmIGxheWVyLmxlZnRCb3VuZHMubGVuZ3RoID09PSA0ICkge1xuXG5cdFx0XHRcdGNhbWVyYUwuYm91bmRzLmZyb21BcnJheSggbGF5ZXIubGVmdEJvdW5kcyApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggbGF5ZXIucmlnaHRCb3VuZHMgIT09IG51bGwgJiYgbGF5ZXIucmlnaHRCb3VuZHMubGVuZ3RoID09PSA0ICkge1xuXG5cdFx0XHRcdGNhbWVyYVIuYm91bmRzLmZyb21BcnJheSggbGF5ZXIucmlnaHRCb3VuZHMgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNhbWVyYVZSO1xuXG5cdH07XG5cblx0dGhpcy5nZXRTdGFuZGluZ01hdHJpeCA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBzdGFuZGluZ01hdHJpeDtcblxuXHR9O1xuXG5cdHRoaXMuc3VibWl0RnJhbWUgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRpZiAoIGlzUHJlc2VudGluZygpICkgZGV2aWNlLnN1Ym1pdEZyYW1lKCk7XG5cblx0fTtcblxuXHR0aGlzLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRpZiAoIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICkge1xuXG5cdFx0XHR3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ3ZyZGlzcGxheXByZXNlbnRjaGFuZ2UnLCBvblZSRGlzcGxheVByZXNlbnRDaGFuZ2UgKTtcblxuXHRcdH1cblxuXHR9O1xuXG59XG5cbi8qKlxuICogQGF1dGhvciBzdXBlcmVnZ2JlcnQgLyBodHRwOi8vd3d3LnBhdWxicnVudC5jby51ay9cbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBzemltZWsgLyBodHRwczovL2dpdGh1Yi5jb20vc3ppbWVrL1xuICogQGF1dGhvciB0c2Nod1xuICovXG5cbmZ1bmN0aW9uIFdlYkdMUmVuZGVyZXIoIHBhcmFtZXRlcnMgKSB7XG5cblx0Y29uc29sZS5sb2coICdUSFJFRS5XZWJHTFJlbmRlcmVyJywgUkVWSVNJT04gKTtcblxuXHRwYXJhbWV0ZXJzID0gcGFyYW1ldGVycyB8fCB7fTtcblxuXHR2YXIgX2NhbnZhcyA9IHBhcmFtZXRlcnMuY2FudmFzICE9PSB1bmRlZmluZWQgPyBwYXJhbWV0ZXJzLmNhbnZhcyA6IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyggJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnLCAnY2FudmFzJyApLFxuXHRcdF9jb250ZXh0ID0gcGFyYW1ldGVycy5jb250ZXh0ICE9PSB1bmRlZmluZWQgPyBwYXJhbWV0ZXJzLmNvbnRleHQgOiBudWxsLFxuXG5cdFx0X2FscGhhID0gcGFyYW1ldGVycy5hbHBoYSAhPT0gdW5kZWZpbmVkID8gcGFyYW1ldGVycy5hbHBoYSA6IGZhbHNlLFxuXHRcdF9kZXB0aCA9IHBhcmFtZXRlcnMuZGVwdGggIT09IHVuZGVmaW5lZCA/IHBhcmFtZXRlcnMuZGVwdGggOiB0cnVlLFxuXHRcdF9zdGVuY2lsID0gcGFyYW1ldGVycy5zdGVuY2lsICE9PSB1bmRlZmluZWQgPyBwYXJhbWV0ZXJzLnN0ZW5jaWwgOiB0cnVlLFxuXHRcdF9hbnRpYWxpYXMgPSBwYXJhbWV0ZXJzLmFudGlhbGlhcyAhPT0gdW5kZWZpbmVkID8gcGFyYW1ldGVycy5hbnRpYWxpYXMgOiBmYWxzZSxcblx0XHRfcHJlbXVsdGlwbGllZEFscGhhID0gcGFyYW1ldGVycy5wcmVtdWx0aXBsaWVkQWxwaGEgIT09IHVuZGVmaW5lZCA/IHBhcmFtZXRlcnMucHJlbXVsdGlwbGllZEFscGhhIDogdHJ1ZSxcblx0XHRfcHJlc2VydmVEcmF3aW5nQnVmZmVyID0gcGFyYW1ldGVycy5wcmVzZXJ2ZURyYXdpbmdCdWZmZXIgIT09IHVuZGVmaW5lZCA/IHBhcmFtZXRlcnMucHJlc2VydmVEcmF3aW5nQnVmZmVyIDogZmFsc2UsXG5cdFx0X3Bvd2VyUHJlZmVyZW5jZSA9IHBhcmFtZXRlcnMucG93ZXJQcmVmZXJlbmNlICE9PSB1bmRlZmluZWQgPyBwYXJhbWV0ZXJzLnBvd2VyUHJlZmVyZW5jZSA6ICdkZWZhdWx0JztcblxuXHR2YXIgY3VycmVudFJlbmRlckxpc3QgPSBudWxsO1xuXHR2YXIgY3VycmVudFJlbmRlclN0YXRlID0gbnVsbDtcblxuXHQvLyBwdWJsaWMgcHJvcGVydGllc1xuXG5cdHRoaXMuZG9tRWxlbWVudCA9IF9jYW52YXM7XG5cdHRoaXMuY29udGV4dCA9IG51bGw7XG5cblx0Ly8gY2xlYXJpbmdcblxuXHR0aGlzLmF1dG9DbGVhciA9IHRydWU7XG5cdHRoaXMuYXV0b0NsZWFyQ29sb3IgPSB0cnVlO1xuXHR0aGlzLmF1dG9DbGVhckRlcHRoID0gdHJ1ZTtcblx0dGhpcy5hdXRvQ2xlYXJTdGVuY2lsID0gdHJ1ZTtcblxuXHQvLyBzY2VuZSBncmFwaFxuXG5cdHRoaXMuc29ydE9iamVjdHMgPSB0cnVlO1xuXG5cdC8vIHVzZXItZGVmaW5lZCBjbGlwcGluZ1xuXG5cdHRoaXMuY2xpcHBpbmdQbGFuZXMgPSBbXTtcblx0dGhpcy5sb2NhbENsaXBwaW5nRW5hYmxlZCA9IGZhbHNlO1xuXG5cdC8vIHBoeXNpY2FsbHkgYmFzZWQgc2hhZGluZ1xuXG5cdHRoaXMuZ2FtbWFGYWN0b3IgPSAyLjA7XHQvLyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcblx0dGhpcy5nYW1tYUlucHV0ID0gZmFsc2U7XG5cdHRoaXMuZ2FtbWFPdXRwdXQgPSBmYWxzZTtcblxuXHQvLyBwaHlzaWNhbCBsaWdodHNcblxuXHR0aGlzLnBoeXNpY2FsbHlDb3JyZWN0TGlnaHRzID0gZmFsc2U7XG5cblx0Ly8gdG9uZSBtYXBwaW5nXG5cblx0dGhpcy50b25lTWFwcGluZyA9IExpbmVhclRvbmVNYXBwaW5nO1xuXHR0aGlzLnRvbmVNYXBwaW5nRXhwb3N1cmUgPSAxLjA7XG5cdHRoaXMudG9uZU1hcHBpbmdXaGl0ZVBvaW50ID0gMS4wO1xuXG5cdC8vIG1vcnBoc1xuXG5cdHRoaXMubWF4TW9ycGhUYXJnZXRzID0gODtcblx0dGhpcy5tYXhNb3JwaE5vcm1hbHMgPSA0O1xuXG5cdC8vIGludGVybmFsIHByb3BlcnRpZXNcblxuXHR2YXIgX3RoaXMgPSB0aGlzLFxuXG5cdFx0X2lzQ29udGV4dExvc3QgPSBmYWxzZSxcblxuXHRcdC8vIGludGVybmFsIHN0YXRlIGNhY2hlXG5cblx0XHRfY3VycmVudFJlbmRlclRhcmdldCA9IG51bGwsXG5cdFx0X2N1cnJlbnRGcmFtZWJ1ZmZlciA9IG51bGwsXG5cdFx0X2N1cnJlbnRNYXRlcmlhbElkID0gLSAxLFxuXHRcdF9jdXJyZW50R2VvbWV0cnlQcm9ncmFtID0gJycsXG5cblx0XHRfY3VycmVudENhbWVyYSA9IG51bGwsXG5cdFx0X2N1cnJlbnRBcnJheUNhbWVyYSA9IG51bGwsXG5cblx0XHRfY3VycmVudFZpZXdwb3J0ID0gbmV3IFZlY3RvcjQoKSxcblx0XHRfY3VycmVudFNjaXNzb3IgPSBuZXcgVmVjdG9yNCgpLFxuXHRcdF9jdXJyZW50U2Npc3NvclRlc3QgPSBudWxsLFxuXG5cdFx0Ly9cblxuXHRcdF91c2VkVGV4dHVyZVVuaXRzID0gMCxcblxuXHRcdC8vXG5cblx0XHRfd2lkdGggPSBfY2FudmFzLndpZHRoLFxuXHRcdF9oZWlnaHQgPSBfY2FudmFzLmhlaWdodCxcblxuXHRcdF9waXhlbFJhdGlvID0gMSxcblxuXHRcdF92aWV3cG9ydCA9IG5ldyBWZWN0b3I0KCAwLCAwLCBfd2lkdGgsIF9oZWlnaHQgKSxcblx0XHRfc2Npc3NvciA9IG5ldyBWZWN0b3I0KCAwLCAwLCBfd2lkdGgsIF9oZWlnaHQgKSxcblx0XHRfc2Npc3NvclRlc3QgPSBmYWxzZSxcblxuXHRcdC8vIGZydXN0dW1cblxuXHRcdF9mcnVzdHVtID0gbmV3IEZydXN0dW0oKSxcblxuXHRcdC8vIGNsaXBwaW5nXG5cblx0XHRfY2xpcHBpbmcgPSBuZXcgV2ViR0xDbGlwcGluZygpLFxuXHRcdF9jbGlwcGluZ0VuYWJsZWQgPSBmYWxzZSxcblx0XHRfbG9jYWxDbGlwcGluZ0VuYWJsZWQgPSBmYWxzZSxcblxuXHRcdC8vIGNhbWVyYSBtYXRyaWNlcyBjYWNoZVxuXG5cdFx0X3Byb2pTY3JlZW5NYXRyaXggPSBuZXcgTWF0cml4NCgpLFxuXG5cdFx0X3ZlY3RvcjMgPSBuZXcgVmVjdG9yMygpO1xuXG5cdGZ1bmN0aW9uIGdldFRhcmdldFBpeGVsUmF0aW8oKSB7XG5cblx0XHRyZXR1cm4gX2N1cnJlbnRSZW5kZXJUYXJnZXQgPT09IG51bGwgPyBfcGl4ZWxSYXRpbyA6IDE7XG5cblx0fVxuXG5cdC8vIGluaXRpYWxpemVcblxuXHR2YXIgX2dsO1xuXG5cdHRyeSB7XG5cblx0XHR2YXIgY29udGV4dEF0dHJpYnV0ZXMgPSB7XG5cdFx0XHRhbHBoYTogX2FscGhhLFxuXHRcdFx0ZGVwdGg6IF9kZXB0aCxcblx0XHRcdHN0ZW5jaWw6IF9zdGVuY2lsLFxuXHRcdFx0YW50aWFsaWFzOiBfYW50aWFsaWFzLFxuXHRcdFx0cHJlbXVsdGlwbGllZEFscGhhOiBfcHJlbXVsdGlwbGllZEFscGhhLFxuXHRcdFx0cHJlc2VydmVEcmF3aW5nQnVmZmVyOiBfcHJlc2VydmVEcmF3aW5nQnVmZmVyLFxuXHRcdFx0cG93ZXJQcmVmZXJlbmNlOiBfcG93ZXJQcmVmZXJlbmNlXG5cdFx0fTtcblxuXHRcdC8vIGV2ZW50IGxpc3RlbmVycyBtdXN0IGJlIHJlZ2lzdGVyZWQgYmVmb3JlIFdlYkdMIGNvbnRleHQgaXMgY3JlYXRlZCwgc2VlICMxMjc1M1xuXG5cdFx0X2NhbnZhcy5hZGRFdmVudExpc3RlbmVyKCAnd2ViZ2xjb250ZXh0bG9zdCcsIG9uQ29udGV4dExvc3QsIGZhbHNlICk7XG5cdFx0X2NhbnZhcy5hZGRFdmVudExpc3RlbmVyKCAnd2ViZ2xjb250ZXh0cmVzdG9yZWQnLCBvbkNvbnRleHRSZXN0b3JlLCBmYWxzZSApO1xuXG5cdFx0X2dsID0gX2NvbnRleHQgfHwgX2NhbnZhcy5nZXRDb250ZXh0KCAnd2ViZ2wnLCBjb250ZXh0QXR0cmlidXRlcyApIHx8IF9jYW52YXMuZ2V0Q29udGV4dCggJ2V4cGVyaW1lbnRhbC13ZWJnbCcsIGNvbnRleHRBdHRyaWJ1dGVzICk7XG5cblx0XHRpZiAoIF9nbCA9PT0gbnVsbCApIHtcblxuXHRcdFx0aWYgKCBfY2FudmFzLmdldENvbnRleHQoICd3ZWJnbCcgKSAhPT0gbnVsbCApIHtcblxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoICdFcnJvciBjcmVhdGluZyBXZWJHTCBjb250ZXh0IHdpdGggeW91ciBzZWxlY3RlZCBhdHRyaWJ1dGVzLicgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoICdFcnJvciBjcmVhdGluZyBXZWJHTCBjb250ZXh0LicgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gU29tZSBleHBlcmltZW50YWwtd2ViZ2wgaW1wbGVtZW50YXRpb25zIGRvIG5vdCBoYXZlIGdldFNoYWRlclByZWNpc2lvbkZvcm1hdFxuXG5cdFx0aWYgKCBfZ2wuZ2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdF9nbC5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdFx0cmV0dXJuIHsgJ3JhbmdlTWluJzogMSwgJ3JhbmdlTWF4JzogMSwgJ3ByZWNpc2lvbic6IDEgfTtcblxuXHRcdFx0fTtcblxuXHRcdH1cblxuXHR9IGNhdGNoICggZXJyb3IgKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogJyArIGVycm9yLm1lc3NhZ2UgKTtcblxuXHR9XG5cblx0dmFyIGV4dGVuc2lvbnMsIGNhcGFiaWxpdGllcywgc3RhdGUsIGluZm87XG5cdHZhciBwcm9wZXJ0aWVzLCB0ZXh0dXJlcywgYXR0cmlidXRlcywgZ2VvbWV0cmllcywgb2JqZWN0cztcblx0dmFyIHByb2dyYW1DYWNoZSwgcmVuZGVyTGlzdHMsIHJlbmRlclN0YXRlcztcblxuXHR2YXIgYmFja2dyb3VuZCwgbW9ycGh0YXJnZXRzLCBidWZmZXJSZW5kZXJlciwgaW5kZXhlZEJ1ZmZlclJlbmRlcmVyO1xuXHR2YXIgc3ByaXRlUmVuZGVyZXI7XG5cblx0dmFyIHV0aWxzO1xuXG5cdGZ1bmN0aW9uIGluaXRHTENvbnRleHQoKSB7XG5cblx0XHRleHRlbnNpb25zID0gbmV3IFdlYkdMRXh0ZW5zaW9ucyggX2dsICk7XG5cdFx0ZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9kZXB0aF90ZXh0dXJlJyApO1xuXHRcdGV4dGVuc2lvbnMuZ2V0KCAnT0VTX3RleHR1cmVfZmxvYXQnICk7XG5cdFx0ZXh0ZW5zaW9ucy5nZXQoICdPRVNfdGV4dHVyZV9mbG9hdF9saW5lYXInICk7XG5cdFx0ZXh0ZW5zaW9ucy5nZXQoICdPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0JyApO1xuXHRcdGV4dGVuc2lvbnMuZ2V0KCAnT0VTX3RleHR1cmVfaGFsZl9mbG9hdF9saW5lYXInICk7XG5cdFx0ZXh0ZW5zaW9ucy5nZXQoICdPRVNfc3RhbmRhcmRfZGVyaXZhdGl2ZXMnICk7XG5cdFx0ZXh0ZW5zaW9ucy5nZXQoICdPRVNfZWxlbWVudF9pbmRleF91aW50JyApO1xuXHRcdGV4dGVuc2lvbnMuZ2V0KCAnQU5HTEVfaW5zdGFuY2VkX2FycmF5cycgKTtcblxuXHRcdHV0aWxzID0gbmV3IFdlYkdMVXRpbHMoIF9nbCwgZXh0ZW5zaW9ucyApO1xuXG5cdFx0Y2FwYWJpbGl0aWVzID0gbmV3IFdlYkdMQ2FwYWJpbGl0aWVzKCBfZ2wsIGV4dGVuc2lvbnMsIHBhcmFtZXRlcnMgKTtcblxuXHRcdHN0YXRlID0gbmV3IFdlYkdMU3RhdGUoIF9nbCwgZXh0ZW5zaW9ucywgdXRpbHMgKTtcblx0XHRzdGF0ZS5zY2lzc29yKCBfY3VycmVudFNjaXNzb3IuY29weSggX3NjaXNzb3IgKS5tdWx0aXBseVNjYWxhciggX3BpeGVsUmF0aW8gKSApO1xuXHRcdHN0YXRlLnZpZXdwb3J0KCBfY3VycmVudFZpZXdwb3J0LmNvcHkoIF92aWV3cG9ydCApLm11bHRpcGx5U2NhbGFyKCBfcGl4ZWxSYXRpbyApICk7XG5cblx0XHRpbmZvID0gbmV3IFdlYkdMSW5mbyggX2dsICk7XG5cdFx0cHJvcGVydGllcyA9IG5ldyBXZWJHTFByb3BlcnRpZXMoKTtcblx0XHR0ZXh0dXJlcyA9IG5ldyBXZWJHTFRleHR1cmVzKCBfZ2wsIGV4dGVuc2lvbnMsIHN0YXRlLCBwcm9wZXJ0aWVzLCBjYXBhYmlsaXRpZXMsIHV0aWxzLCBpbmZvICk7XG5cdFx0YXR0cmlidXRlcyA9IG5ldyBXZWJHTEF0dHJpYnV0ZXMoIF9nbCApO1xuXHRcdGdlb21ldHJpZXMgPSBuZXcgV2ViR0xHZW9tZXRyaWVzKCBfZ2wsIGF0dHJpYnV0ZXMsIGluZm8gKTtcblx0XHRvYmplY3RzID0gbmV3IFdlYkdMT2JqZWN0cyggZ2VvbWV0cmllcywgaW5mbyApO1xuXHRcdG1vcnBodGFyZ2V0cyA9IG5ldyBXZWJHTE1vcnBodGFyZ2V0cyggX2dsICk7XG5cdFx0cHJvZ3JhbUNhY2hlID0gbmV3IFdlYkdMUHJvZ3JhbXMoIF90aGlzLCBleHRlbnNpb25zLCBjYXBhYmlsaXRpZXMgKTtcblx0XHRyZW5kZXJMaXN0cyA9IG5ldyBXZWJHTFJlbmRlckxpc3RzKCk7XG5cdFx0cmVuZGVyU3RhdGVzID0gbmV3IFdlYkdMUmVuZGVyU3RhdGVzKCk7XG5cblx0XHRiYWNrZ3JvdW5kID0gbmV3IFdlYkdMQmFja2dyb3VuZCggX3RoaXMsIHN0YXRlLCBnZW9tZXRyaWVzLCBfcHJlbXVsdGlwbGllZEFscGhhICk7XG5cblx0XHRidWZmZXJSZW5kZXJlciA9IG5ldyBXZWJHTEJ1ZmZlclJlbmRlcmVyKCBfZ2wsIGV4dGVuc2lvbnMsIGluZm8gKTtcblx0XHRpbmRleGVkQnVmZmVyUmVuZGVyZXIgPSBuZXcgV2ViR0xJbmRleGVkQnVmZmVyUmVuZGVyZXIoIF9nbCwgZXh0ZW5zaW9ucywgaW5mbyApO1xuXG5cdFx0c3ByaXRlUmVuZGVyZXIgPSBuZXcgV2ViR0xTcHJpdGVSZW5kZXJlciggX3RoaXMsIF9nbCwgc3RhdGUsIHRleHR1cmVzLCBjYXBhYmlsaXRpZXMgKTtcblxuXHRcdGluZm8ucHJvZ3JhbXMgPSBwcm9ncmFtQ2FjaGUucHJvZ3JhbXM7XG5cblx0XHRfdGhpcy5jb250ZXh0ID0gX2dsO1xuXHRcdF90aGlzLmNhcGFiaWxpdGllcyA9IGNhcGFiaWxpdGllcztcblx0XHRfdGhpcy5leHRlbnNpb25zID0gZXh0ZW5zaW9ucztcblx0XHRfdGhpcy5wcm9wZXJ0aWVzID0gcHJvcGVydGllcztcblx0XHRfdGhpcy5yZW5kZXJMaXN0cyA9IHJlbmRlckxpc3RzO1xuXHRcdF90aGlzLnN0YXRlID0gc3RhdGU7XG5cdFx0X3RoaXMuaW5mbyA9IGluZm87XG5cblx0fVxuXG5cdGluaXRHTENvbnRleHQoKTtcblxuXHQvLyB2clxuXG5cdHZhciB2ciA9IG5ldyBXZWJWUk1hbmFnZXIoIF90aGlzICk7XG5cblx0dGhpcy52ciA9IHZyO1xuXG5cdC8vIHNoYWRvdyBtYXBcblxuXHR2YXIgc2hhZG93TWFwID0gbmV3IFdlYkdMU2hhZG93TWFwKCBfdGhpcywgb2JqZWN0cywgY2FwYWJpbGl0aWVzLm1heFRleHR1cmVTaXplICk7XG5cblx0dGhpcy5zaGFkb3dNYXAgPSBzaGFkb3dNYXA7XG5cblx0Ly8gQVBJXG5cblx0dGhpcy5nZXRDb250ZXh0ID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIF9nbDtcblxuXHR9O1xuXG5cdHRoaXMuZ2V0Q29udGV4dEF0dHJpYnV0ZXMgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gX2dsLmdldENvbnRleHRBdHRyaWJ1dGVzKCk7XG5cblx0fTtcblxuXHR0aGlzLmZvcmNlQ29udGV4dExvc3MgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9sb3NlX2NvbnRleHQnICk7XG5cdFx0aWYgKCBleHRlbnNpb24gKSBleHRlbnNpb24ubG9zZUNvbnRleHQoKTtcblxuXHR9O1xuXG5cdHRoaXMuZm9yY2VDb250ZXh0UmVzdG9yZSA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ1dFQkdMX2xvc2VfY29udGV4dCcgKTtcblx0XHRpZiAoIGV4dGVuc2lvbiApIGV4dGVuc2lvbi5yZXN0b3JlQ29udGV4dCgpO1xuXG5cdH07XG5cblx0dGhpcy5nZXRQaXhlbFJhdGlvID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIF9waXhlbFJhdGlvO1xuXG5cdH07XG5cblx0dGhpcy5zZXRQaXhlbFJhdGlvID0gZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdGlmICggdmFsdWUgPT09IHVuZGVmaW5lZCApIHJldHVybjtcblxuXHRcdF9waXhlbFJhdGlvID0gdmFsdWU7XG5cblx0XHR0aGlzLnNldFNpemUoIF93aWR0aCwgX2hlaWdodCwgZmFsc2UgKTtcblxuXHR9O1xuXG5cdHRoaXMuZ2V0U2l6ZSA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB7XG5cdFx0XHR3aWR0aDogX3dpZHRoLFxuXHRcdFx0aGVpZ2h0OiBfaGVpZ2h0XG5cdFx0fTtcblxuXHR9O1xuXG5cdHRoaXMuc2V0U2l6ZSA9IGZ1bmN0aW9uICggd2lkdGgsIGhlaWdodCwgdXBkYXRlU3R5bGUgKSB7XG5cblx0XHR2YXIgZGV2aWNlID0gdnIuZ2V0RGV2aWNlKCk7XG5cblx0XHRpZiAoIGRldmljZSAmJiBkZXZpY2UuaXNQcmVzZW50aW5nICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBDYW5cXCd0IGNoYW5nZSBzaXplIHdoaWxlIFZSIGRldmljZSBpcyBwcmVzZW50aW5nLicgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdF93aWR0aCA9IHdpZHRoO1xuXHRcdF9oZWlnaHQgPSBoZWlnaHQ7XG5cblx0XHRfY2FudmFzLndpZHRoID0gd2lkdGggKiBfcGl4ZWxSYXRpbztcblx0XHRfY2FudmFzLmhlaWdodCA9IGhlaWdodCAqIF9waXhlbFJhdGlvO1xuXG5cdFx0aWYgKCB1cGRhdGVTdHlsZSAhPT0gZmFsc2UgKSB7XG5cblx0XHRcdF9jYW52YXMuc3R5bGUud2lkdGggPSB3aWR0aCArICdweCc7XG5cdFx0XHRfY2FudmFzLnN0eWxlLmhlaWdodCA9IGhlaWdodCArICdweCc7XG5cblx0XHR9XG5cblx0XHR0aGlzLnNldFZpZXdwb3J0KCAwLCAwLCB3aWR0aCwgaGVpZ2h0ICk7XG5cblx0fTtcblxuXHR0aGlzLmdldERyYXdpbmdCdWZmZXJTaXplID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHtcblx0XHRcdHdpZHRoOiBfd2lkdGggKiBfcGl4ZWxSYXRpbyxcblx0XHRcdGhlaWdodDogX2hlaWdodCAqIF9waXhlbFJhdGlvXG5cdFx0fTtcblxuXHR9O1xuXG5cdHRoaXMuc2V0RHJhd2luZ0J1ZmZlclNpemUgPSBmdW5jdGlvbiAoIHdpZHRoLCBoZWlnaHQsIHBpeGVsUmF0aW8gKSB7XG5cblx0XHRfd2lkdGggPSB3aWR0aDtcblx0XHRfaGVpZ2h0ID0gaGVpZ2h0O1xuXG5cdFx0X3BpeGVsUmF0aW8gPSBwaXhlbFJhdGlvO1xuXG5cdFx0X2NhbnZhcy53aWR0aCA9IHdpZHRoICogcGl4ZWxSYXRpbztcblx0XHRfY2FudmFzLmhlaWdodCA9IGhlaWdodCAqIHBpeGVsUmF0aW87XG5cblx0XHR0aGlzLnNldFZpZXdwb3J0KCAwLCAwLCB3aWR0aCwgaGVpZ2h0ICk7XG5cblx0fTtcblxuXHR0aGlzLmdldEN1cnJlbnRWaWV3cG9ydCA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBfY3VycmVudFZpZXdwb3J0O1xuXG5cdH07XG5cblx0dGhpcy5zZXRWaWV3cG9ydCA9IGZ1bmN0aW9uICggeCwgeSwgd2lkdGgsIGhlaWdodCApIHtcblxuXHRcdF92aWV3cG9ydC5zZXQoIHgsIF9oZWlnaHQgLSB5IC0gaGVpZ2h0LCB3aWR0aCwgaGVpZ2h0ICk7XG5cdFx0c3RhdGUudmlld3BvcnQoIF9jdXJyZW50Vmlld3BvcnQuY29weSggX3ZpZXdwb3J0ICkubXVsdGlwbHlTY2FsYXIoIF9waXhlbFJhdGlvICkgKTtcblxuXHR9O1xuXG5cdHRoaXMuc2V0U2Npc3NvciA9IGZ1bmN0aW9uICggeCwgeSwgd2lkdGgsIGhlaWdodCApIHtcblxuXHRcdF9zY2lzc29yLnNldCggeCwgX2hlaWdodCAtIHkgLSBoZWlnaHQsIHdpZHRoLCBoZWlnaHQgKTtcblx0XHRzdGF0ZS5zY2lzc29yKCBfY3VycmVudFNjaXNzb3IuY29weSggX3NjaXNzb3IgKS5tdWx0aXBseVNjYWxhciggX3BpeGVsUmF0aW8gKSApO1xuXG5cdH07XG5cblx0dGhpcy5zZXRTY2lzc29yVGVzdCA9IGZ1bmN0aW9uICggYm9vbGVhbiApIHtcblxuXHRcdHN0YXRlLnNldFNjaXNzb3JUZXN0KCBfc2Npc3NvclRlc3QgPSBib29sZWFuICk7XG5cblx0fTtcblxuXHQvLyBDbGVhcmluZ1xuXG5cdHRoaXMuZ2V0Q2xlYXJDb2xvciA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBiYWNrZ3JvdW5kLmdldENsZWFyQ29sb3IoKTtcblxuXHR9O1xuXG5cdHRoaXMuc2V0Q2xlYXJDb2xvciA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdGJhY2tncm91bmQuc2V0Q2xlYXJDb2xvci5hcHBseSggYmFja2dyb3VuZCwgYXJndW1lbnRzICk7XG5cblx0fTtcblxuXHR0aGlzLmdldENsZWFyQWxwaGEgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gYmFja2dyb3VuZC5nZXRDbGVhckFscGhhKCk7XG5cblx0fTtcblxuXHR0aGlzLnNldENsZWFyQWxwaGEgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRiYWNrZ3JvdW5kLnNldENsZWFyQWxwaGEuYXBwbHkoIGJhY2tncm91bmQsIGFyZ3VtZW50cyApO1xuXG5cdH07XG5cblx0dGhpcy5jbGVhciA9IGZ1bmN0aW9uICggY29sb3IsIGRlcHRoLCBzdGVuY2lsICkge1xuXG5cdFx0dmFyIGJpdHMgPSAwO1xuXG5cdFx0aWYgKCBjb2xvciA9PT0gdW5kZWZpbmVkIHx8IGNvbG9yICkgYml0cyB8PSBfZ2wuQ09MT1JfQlVGRkVSX0JJVDtcblx0XHRpZiAoIGRlcHRoID09PSB1bmRlZmluZWQgfHwgZGVwdGggKSBiaXRzIHw9IF9nbC5ERVBUSF9CVUZGRVJfQklUO1xuXHRcdGlmICggc3RlbmNpbCA9PT0gdW5kZWZpbmVkIHx8IHN0ZW5jaWwgKSBiaXRzIHw9IF9nbC5TVEVOQ0lMX0JVRkZFUl9CSVQ7XG5cblx0XHRfZ2wuY2xlYXIoIGJpdHMgKTtcblxuXHR9O1xuXG5cdHRoaXMuY2xlYXJDb2xvciA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuY2xlYXIoIHRydWUsIGZhbHNlLCBmYWxzZSApO1xuXG5cdH07XG5cblx0dGhpcy5jbGVhckRlcHRoID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5jbGVhciggZmFsc2UsIHRydWUsIGZhbHNlICk7XG5cblx0fTtcblxuXHR0aGlzLmNsZWFyU3RlbmNpbCA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuY2xlYXIoIGZhbHNlLCBmYWxzZSwgdHJ1ZSApO1xuXG5cdH07XG5cblx0dGhpcy5jbGVhclRhcmdldCA9IGZ1bmN0aW9uICggcmVuZGVyVGFyZ2V0LCBjb2xvciwgZGVwdGgsIHN0ZW5jaWwgKSB7XG5cblx0XHR0aGlzLnNldFJlbmRlclRhcmdldCggcmVuZGVyVGFyZ2V0ICk7XG5cdFx0dGhpcy5jbGVhciggY29sb3IsIGRlcHRoLCBzdGVuY2lsICk7XG5cblx0fTtcblxuXHQvL1xuXG5cdHRoaXMuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdF9jYW52YXMucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ3dlYmdsY29udGV4dGxvc3QnLCBvbkNvbnRleHRMb3N0LCBmYWxzZSApO1xuXHRcdF9jYW52YXMucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ3dlYmdsY29udGV4dHJlc3RvcmVkJywgb25Db250ZXh0UmVzdG9yZSwgZmFsc2UgKTtcblxuXHRcdHJlbmRlckxpc3RzLmRpc3Bvc2UoKTtcblx0XHRyZW5kZXJTdGF0ZXMuZGlzcG9zZSgpO1xuXHRcdHByb3BlcnRpZXMuZGlzcG9zZSgpO1xuXHRcdG9iamVjdHMuZGlzcG9zZSgpO1xuXG5cdFx0dnIuZGlzcG9zZSgpO1xuXG5cdFx0c3RvcEFuaW1hdGlvbigpO1xuXG5cdH07XG5cblx0Ly8gRXZlbnRzXG5cblx0ZnVuY3Rpb24gb25Db250ZXh0TG9zdCggZXZlbnQgKSB7XG5cblx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG5cdFx0Y29uc29sZS5sb2coICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBDb250ZXh0IExvc3QuJyApO1xuXG5cdFx0X2lzQ29udGV4dExvc3QgPSB0cnVlO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBvbkNvbnRleHRSZXN0b3JlKCAvKiBldmVudCAqLyApIHtcblxuXHRcdGNvbnNvbGUubG9nKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogQ29udGV4dCBSZXN0b3JlZC4nICk7XG5cblx0XHRfaXNDb250ZXh0TG9zdCA9IGZhbHNlO1xuXG5cdFx0aW5pdEdMQ29udGV4dCgpO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBvbk1hdGVyaWFsRGlzcG9zZSggZXZlbnQgKSB7XG5cblx0XHR2YXIgbWF0ZXJpYWwgPSBldmVudC50YXJnZXQ7XG5cblx0XHRtYXRlcmlhbC5yZW1vdmVFdmVudExpc3RlbmVyKCAnZGlzcG9zZScsIG9uTWF0ZXJpYWxEaXNwb3NlICk7XG5cblx0XHRkZWFsbG9jYXRlTWF0ZXJpYWwoIG1hdGVyaWFsICk7XG5cblx0fVxuXG5cdC8vIEJ1ZmZlciBkZWFsbG9jYXRpb25cblxuXHRmdW5jdGlvbiBkZWFsbG9jYXRlTWF0ZXJpYWwoIG1hdGVyaWFsICkge1xuXG5cdFx0cmVsZWFzZU1hdGVyaWFsUHJvZ3JhbVJlZmVyZW5jZSggbWF0ZXJpYWwgKTtcblxuXHRcdHByb3BlcnRpZXMucmVtb3ZlKCBtYXRlcmlhbCApO1xuXG5cdH1cblxuXG5cdGZ1bmN0aW9uIHJlbGVhc2VNYXRlcmlhbFByb2dyYW1SZWZlcmVuY2UoIG1hdGVyaWFsICkge1xuXG5cdFx0dmFyIHByb2dyYW1JbmZvID0gcHJvcGVydGllcy5nZXQoIG1hdGVyaWFsICkucHJvZ3JhbTtcblxuXHRcdG1hdGVyaWFsLnByb2dyYW0gPSB1bmRlZmluZWQ7XG5cblx0XHRpZiAoIHByb2dyYW1JbmZvICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHByb2dyYW1DYWNoZS5yZWxlYXNlUHJvZ3JhbSggcHJvZ3JhbUluZm8gKTtcblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gQnVmZmVyIHJlbmRlcmluZ1xuXG5cdGZ1bmN0aW9uIHJlbmRlck9iamVjdEltbWVkaWF0ZSggb2JqZWN0LCBwcm9ncmFtLCBtYXRlcmlhbCApIHtcblxuXHRcdG9iamVjdC5yZW5kZXIoIGZ1bmN0aW9uICggb2JqZWN0ICkge1xuXG5cdFx0XHRfdGhpcy5yZW5kZXJCdWZmZXJJbW1lZGlhdGUoIG9iamVjdCwgcHJvZ3JhbSwgbWF0ZXJpYWwgKTtcblxuXHRcdH0gKTtcblxuXHR9XG5cblx0dGhpcy5yZW5kZXJCdWZmZXJJbW1lZGlhdGUgPSBmdW5jdGlvbiAoIG9iamVjdCwgcHJvZ3JhbSwgbWF0ZXJpYWwgKSB7XG5cblx0XHRzdGF0ZS5pbml0QXR0cmlidXRlcygpO1xuXG5cdFx0dmFyIGJ1ZmZlcnMgPSBwcm9wZXJ0aWVzLmdldCggb2JqZWN0ICk7XG5cblx0XHRpZiAoIG9iamVjdC5oYXNQb3NpdGlvbnMgJiYgISBidWZmZXJzLnBvc2l0aW9uICkgYnVmZmVycy5wb3NpdGlvbiA9IF9nbC5jcmVhdGVCdWZmZXIoKTtcblx0XHRpZiAoIG9iamVjdC5oYXNOb3JtYWxzICYmICEgYnVmZmVycy5ub3JtYWwgKSBidWZmZXJzLm5vcm1hbCA9IF9nbC5jcmVhdGVCdWZmZXIoKTtcblx0XHRpZiAoIG9iamVjdC5oYXNVdnMgJiYgISBidWZmZXJzLnV2ICkgYnVmZmVycy51diA9IF9nbC5jcmVhdGVCdWZmZXIoKTtcblx0XHRpZiAoIG9iamVjdC5oYXNDb2xvcnMgJiYgISBidWZmZXJzLmNvbG9yICkgYnVmZmVycy5jb2xvciA9IF9nbC5jcmVhdGVCdWZmZXIoKTtcblxuXHRcdHZhciBwcm9ncmFtQXR0cmlidXRlcyA9IHByb2dyYW0uZ2V0QXR0cmlidXRlcygpO1xuXG5cdFx0aWYgKCBvYmplY3QuaGFzUG9zaXRpb25zICkge1xuXG5cdFx0XHRfZ2wuYmluZEJ1ZmZlciggX2dsLkFSUkFZX0JVRkZFUiwgYnVmZmVycy5wb3NpdGlvbiApO1xuXHRcdFx0X2dsLmJ1ZmZlckRhdGEoIF9nbC5BUlJBWV9CVUZGRVIsIG9iamVjdC5wb3NpdGlvbkFycmF5LCBfZ2wuRFlOQU1JQ19EUkFXICk7XG5cblx0XHRcdHN0YXRlLmVuYWJsZUF0dHJpYnV0ZSggcHJvZ3JhbUF0dHJpYnV0ZXMucG9zaXRpb24gKTtcblx0XHRcdF9nbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKCBwcm9ncmFtQXR0cmlidXRlcy5wb3NpdGlvbiwgMywgX2dsLkZMT0FULCBmYWxzZSwgMCwgMCApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBvYmplY3QuaGFzTm9ybWFscyApIHtcblxuXHRcdFx0X2dsLmJpbmRCdWZmZXIoIF9nbC5BUlJBWV9CVUZGRVIsIGJ1ZmZlcnMubm9ybWFsICk7XG5cblx0XHRcdGlmICggISBtYXRlcmlhbC5pc01lc2hQaG9uZ01hdGVyaWFsICYmXG5cdFx0XHRcdCEgbWF0ZXJpYWwuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbCAmJlxuXHRcdFx0XHQhIG1hdGVyaWFsLmlzTWVzaE5vcm1hbE1hdGVyaWFsICYmXG5cdFx0XHRcdG1hdGVyaWFsLmZsYXRTaGFkaW5nID09PSB0cnVlICkge1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IG9iamVjdC5jb3VudCAqIDM7IGkgPCBsOyBpICs9IDkgKSB7XG5cblx0XHRcdFx0XHR2YXIgYXJyYXkgPSBvYmplY3Qubm9ybWFsQXJyYXk7XG5cblx0XHRcdFx0XHR2YXIgbnggPSAoIGFycmF5WyBpICsgMCBdICsgYXJyYXlbIGkgKyAzIF0gKyBhcnJheVsgaSArIDYgXSApIC8gMztcblx0XHRcdFx0XHR2YXIgbnkgPSAoIGFycmF5WyBpICsgMSBdICsgYXJyYXlbIGkgKyA0IF0gKyBhcnJheVsgaSArIDcgXSApIC8gMztcblx0XHRcdFx0XHR2YXIgbnogPSAoIGFycmF5WyBpICsgMiBdICsgYXJyYXlbIGkgKyA1IF0gKyBhcnJheVsgaSArIDggXSApIC8gMztcblxuXHRcdFx0XHRcdGFycmF5WyBpICsgMCBdID0gbng7XG5cdFx0XHRcdFx0YXJyYXlbIGkgKyAxIF0gPSBueTtcblx0XHRcdFx0XHRhcnJheVsgaSArIDIgXSA9IG56O1xuXG5cdFx0XHRcdFx0YXJyYXlbIGkgKyAzIF0gPSBueDtcblx0XHRcdFx0XHRhcnJheVsgaSArIDQgXSA9IG55O1xuXHRcdFx0XHRcdGFycmF5WyBpICsgNSBdID0gbno7XG5cblx0XHRcdFx0XHRhcnJheVsgaSArIDYgXSA9IG54O1xuXHRcdFx0XHRcdGFycmF5WyBpICsgNyBdID0gbnk7XG5cdFx0XHRcdFx0YXJyYXlbIGkgKyA4IF0gPSBuejtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0X2dsLmJ1ZmZlckRhdGEoIF9nbC5BUlJBWV9CVUZGRVIsIG9iamVjdC5ub3JtYWxBcnJheSwgX2dsLkRZTkFNSUNfRFJBVyApO1xuXG5cdFx0XHRzdGF0ZS5lbmFibGVBdHRyaWJ1dGUoIHByb2dyYW1BdHRyaWJ1dGVzLm5vcm1hbCApO1xuXG5cdFx0XHRfZ2wudmVydGV4QXR0cmliUG9pbnRlciggcHJvZ3JhbUF0dHJpYnV0ZXMubm9ybWFsLCAzLCBfZ2wuRkxPQVQsIGZhbHNlLCAwLCAwICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIG9iamVjdC5oYXNVdnMgJiYgbWF0ZXJpYWwubWFwICkge1xuXG5cdFx0XHRfZ2wuYmluZEJ1ZmZlciggX2dsLkFSUkFZX0JVRkZFUiwgYnVmZmVycy51diApO1xuXHRcdFx0X2dsLmJ1ZmZlckRhdGEoIF9nbC5BUlJBWV9CVUZGRVIsIG9iamVjdC51dkFycmF5LCBfZ2wuRFlOQU1JQ19EUkFXICk7XG5cblx0XHRcdHN0YXRlLmVuYWJsZUF0dHJpYnV0ZSggcHJvZ3JhbUF0dHJpYnV0ZXMudXYgKTtcblxuXHRcdFx0X2dsLnZlcnRleEF0dHJpYlBvaW50ZXIoIHByb2dyYW1BdHRyaWJ1dGVzLnV2LCAyLCBfZ2wuRkxPQVQsIGZhbHNlLCAwLCAwICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIG9iamVjdC5oYXNDb2xvcnMgJiYgbWF0ZXJpYWwudmVydGV4Q29sb3JzICE9PSBOb0NvbG9ycyApIHtcblxuXHRcdFx0X2dsLmJpbmRCdWZmZXIoIF9nbC5BUlJBWV9CVUZGRVIsIGJ1ZmZlcnMuY29sb3IgKTtcblx0XHRcdF9nbC5idWZmZXJEYXRhKCBfZ2wuQVJSQVlfQlVGRkVSLCBvYmplY3QuY29sb3JBcnJheSwgX2dsLkRZTkFNSUNfRFJBVyApO1xuXG5cdFx0XHRzdGF0ZS5lbmFibGVBdHRyaWJ1dGUoIHByb2dyYW1BdHRyaWJ1dGVzLmNvbG9yICk7XG5cblx0XHRcdF9nbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKCBwcm9ncmFtQXR0cmlidXRlcy5jb2xvciwgMywgX2dsLkZMT0FULCBmYWxzZSwgMCwgMCApO1xuXG5cdFx0fVxuXG5cdFx0c3RhdGUuZGlzYWJsZVVudXNlZEF0dHJpYnV0ZXMoKTtcblxuXHRcdF9nbC5kcmF3QXJyYXlzKCBfZ2wuVFJJQU5HTEVTLCAwLCBvYmplY3QuY291bnQgKTtcblxuXHRcdG9iamVjdC5jb3VudCA9IDA7XG5cblx0fTtcblxuXHR0aGlzLnJlbmRlckJ1ZmZlckRpcmVjdCA9IGZ1bmN0aW9uICggY2FtZXJhLCBmb2csIGdlb21ldHJ5LCBtYXRlcmlhbCwgb2JqZWN0LCBncm91cCApIHtcblxuXHRcdHZhciBmcm9udEZhY2VDVyA9ICggb2JqZWN0LmlzTWVzaCAmJiBvYmplY3QubWF0cml4V29ybGQuZGV0ZXJtaW5hbnQoKSA8IDAgKTtcblxuXHRcdHN0YXRlLnNldE1hdGVyaWFsKCBtYXRlcmlhbCwgZnJvbnRGYWNlQ1cgKTtcblxuXHRcdHZhciBwcm9ncmFtID0gc2V0UHJvZ3JhbSggY2FtZXJhLCBmb2csIG1hdGVyaWFsLCBvYmplY3QgKTtcblx0XHR2YXIgZ2VvbWV0cnlQcm9ncmFtID0gZ2VvbWV0cnkuaWQgKyAnXycgKyBwcm9ncmFtLmlkICsgJ18nICsgKCBtYXRlcmlhbC53aXJlZnJhbWUgPT09IHRydWUgKTtcblxuXHRcdHZhciB1cGRhdGVCdWZmZXJzID0gZmFsc2U7XG5cblx0XHRpZiAoIGdlb21ldHJ5UHJvZ3JhbSAhPT0gX2N1cnJlbnRHZW9tZXRyeVByb2dyYW0gKSB7XG5cblx0XHRcdF9jdXJyZW50R2VvbWV0cnlQcm9ncmFtID0gZ2VvbWV0cnlQcm9ncmFtO1xuXHRcdFx0dXBkYXRlQnVmZmVycyA9IHRydWU7XG5cblx0XHR9XG5cblx0XHRpZiAoIG9iamVjdC5tb3JwaFRhcmdldEluZmx1ZW5jZXMgKSB7XG5cblx0XHRcdG1vcnBodGFyZ2V0cy51cGRhdGUoIG9iamVjdCwgZ2VvbWV0cnksIG1hdGVyaWFsLCBwcm9ncmFtICk7XG5cblx0XHRcdHVwZGF0ZUJ1ZmZlcnMgPSB0cnVlO1xuXG5cdFx0fVxuXG5cdFx0Ly9cblxuXHRcdHZhciBpbmRleCA9IGdlb21ldHJ5LmluZGV4O1xuXHRcdHZhciBwb3NpdGlvbiA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247XG5cdFx0dmFyIHJhbmdlRmFjdG9yID0gMTtcblxuXHRcdGlmICggbWF0ZXJpYWwud2lyZWZyYW1lID09PSB0cnVlICkge1xuXG5cdFx0XHRpbmRleCA9IGdlb21ldHJpZXMuZ2V0V2lyZWZyYW1lQXR0cmlidXRlKCBnZW9tZXRyeSApO1xuXHRcdFx0cmFuZ2VGYWN0b3IgPSAyO1xuXG5cdFx0fVxuXG5cdFx0dmFyIGF0dHJpYnV0ZTtcblx0XHR2YXIgcmVuZGVyZXIgPSBidWZmZXJSZW5kZXJlcjtcblxuXHRcdGlmICggaW5kZXggIT09IG51bGwgKSB7XG5cblx0XHRcdGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMuZ2V0KCBpbmRleCApO1xuXG5cdFx0XHRyZW5kZXJlciA9IGluZGV4ZWRCdWZmZXJSZW5kZXJlcjtcblx0XHRcdHJlbmRlcmVyLnNldEluZGV4KCBhdHRyaWJ1dGUgKTtcblxuXHRcdH1cblxuXHRcdGlmICggdXBkYXRlQnVmZmVycyApIHtcblxuXHRcdFx0c2V0dXBWZXJ0ZXhBdHRyaWJ1dGVzKCBtYXRlcmlhbCwgcHJvZ3JhbSwgZ2VvbWV0cnkgKTtcblxuXHRcdFx0aWYgKCBpbmRleCAhPT0gbnVsbCApIHtcblxuXHRcdFx0XHRfZ2wuYmluZEJ1ZmZlciggX2dsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCBhdHRyaWJ1dGUuYnVmZmVyICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vXG5cblx0XHR2YXIgZGF0YUNvdW50ID0gSW5maW5pdHk7XG5cblx0XHRpZiAoIGluZGV4ICE9PSBudWxsICkge1xuXG5cdFx0XHRkYXRhQ291bnQgPSBpbmRleC5jb3VudDtcblxuXHRcdH0gZWxzZSBpZiAoIHBvc2l0aW9uICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGRhdGFDb3VudCA9IHBvc2l0aW9uLmNvdW50O1xuXG5cdFx0fVxuXG5cdFx0dmFyIHJhbmdlU3RhcnQgPSBnZW9tZXRyeS5kcmF3UmFuZ2Uuc3RhcnQgKiByYW5nZUZhY3Rvcjtcblx0XHR2YXIgcmFuZ2VDb3VudCA9IGdlb21ldHJ5LmRyYXdSYW5nZS5jb3VudCAqIHJhbmdlRmFjdG9yO1xuXG5cdFx0dmFyIGdyb3VwU3RhcnQgPSBncm91cCAhPT0gbnVsbCA/IGdyb3VwLnN0YXJ0ICogcmFuZ2VGYWN0b3IgOiAwO1xuXHRcdHZhciBncm91cENvdW50ID0gZ3JvdXAgIT09IG51bGwgPyBncm91cC5jb3VudCAqIHJhbmdlRmFjdG9yIDogSW5maW5pdHk7XG5cblx0XHR2YXIgZHJhd1N0YXJ0ID0gTWF0aC5tYXgoIHJhbmdlU3RhcnQsIGdyb3VwU3RhcnQgKTtcblx0XHR2YXIgZHJhd0VuZCA9IE1hdGgubWluKCBkYXRhQ291bnQsIHJhbmdlU3RhcnQgKyByYW5nZUNvdW50LCBncm91cFN0YXJ0ICsgZ3JvdXBDb3VudCApIC0gMTtcblxuXHRcdHZhciBkcmF3Q291bnQgPSBNYXRoLm1heCggMCwgZHJhd0VuZCAtIGRyYXdTdGFydCArIDEgKTtcblxuXHRcdGlmICggZHJhd0NvdW50ID09PSAwICkgcmV0dXJuO1xuXG5cdFx0Ly9cblxuXHRcdGlmICggb2JqZWN0LmlzTWVzaCApIHtcblxuXHRcdFx0aWYgKCBtYXRlcmlhbC53aXJlZnJhbWUgPT09IHRydWUgKSB7XG5cblx0XHRcdFx0c3RhdGUuc2V0TGluZVdpZHRoKCBtYXRlcmlhbC53aXJlZnJhbWVMaW5ld2lkdGggKiBnZXRUYXJnZXRQaXhlbFJhdGlvKCkgKTtcblx0XHRcdFx0cmVuZGVyZXIuc2V0TW9kZSggX2dsLkxJTkVTICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0c3dpdGNoICggb2JqZWN0LmRyYXdNb2RlICkge1xuXG5cdFx0XHRcdFx0Y2FzZSBUcmlhbmdsZXNEcmF3TW9kZTpcblx0XHRcdFx0XHRcdHJlbmRlcmVyLnNldE1vZGUoIF9nbC5UUklBTkdMRVMgKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSBUcmlhbmdsZVN0cmlwRHJhd01vZGU6XG5cdFx0XHRcdFx0XHRyZW5kZXJlci5zZXRNb2RlKCBfZ2wuVFJJQU5HTEVfU1RSSVAgKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSBUcmlhbmdsZUZhbkRyYXdNb2RlOlxuXHRcdFx0XHRcdFx0cmVuZGVyZXIuc2V0TW9kZSggX2dsLlRSSUFOR0xFX0ZBTiApO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblxuXHRcdH0gZWxzZSBpZiAoIG9iamVjdC5pc0xpbmUgKSB7XG5cblx0XHRcdHZhciBsaW5lV2lkdGggPSBtYXRlcmlhbC5saW5ld2lkdGg7XG5cblx0XHRcdGlmICggbGluZVdpZHRoID09PSB1bmRlZmluZWQgKSBsaW5lV2lkdGggPSAxOyAvLyBOb3QgdXNpbmcgTGluZSpNYXRlcmlhbFxuXG5cdFx0XHRzdGF0ZS5zZXRMaW5lV2lkdGgoIGxpbmVXaWR0aCAqIGdldFRhcmdldFBpeGVsUmF0aW8oKSApO1xuXG5cdFx0XHRpZiAoIG9iamVjdC5pc0xpbmVTZWdtZW50cyApIHtcblxuXHRcdFx0XHRyZW5kZXJlci5zZXRNb2RlKCBfZ2wuTElORVMgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggb2JqZWN0LmlzTGluZUxvb3AgKSB7XG5cblx0XHRcdFx0cmVuZGVyZXIuc2V0TW9kZSggX2dsLkxJTkVfTE9PUCApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHJlbmRlcmVyLnNldE1vZGUoIF9nbC5MSU5FX1NUUklQICk7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSBpZiAoIG9iamVjdC5pc1BvaW50cyApIHtcblxuXHRcdFx0cmVuZGVyZXIuc2V0TW9kZSggX2dsLlBPSU5UUyApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBnZW9tZXRyeSAmJiBnZW9tZXRyeS5pc0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5ICkge1xuXG5cdFx0XHRpZiAoIGdlb21ldHJ5Lm1heEluc3RhbmNlZENvdW50ID4gMCApIHtcblxuXHRcdFx0XHRyZW5kZXJlci5yZW5kZXJJbnN0YW5jZXMoIGdlb21ldHJ5LCBkcmF3U3RhcnQsIGRyYXdDb3VudCApO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRyZW5kZXJlci5yZW5kZXIoIGRyYXdTdGFydCwgZHJhd0NvdW50ICk7XG5cblx0XHR9XG5cblx0fTtcblxuXHRmdW5jdGlvbiBzZXR1cFZlcnRleEF0dHJpYnV0ZXMoIG1hdGVyaWFsLCBwcm9ncmFtLCBnZW9tZXRyeSApIHtcblxuXHRcdGlmICggZ2VvbWV0cnkgJiYgZ2VvbWV0cnkuaXNJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSApIHtcblxuXHRcdFx0aWYgKCBleHRlbnNpb25zLmdldCggJ0FOR0xFX2luc3RhbmNlZF9hcnJheXMnICkgPT09IG51bGwgKSB7XG5cblx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdMUmVuZGVyZXIuc2V0dXBWZXJ0ZXhBdHRyaWJ1dGVzOiB1c2luZyBUSFJFRS5JbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSBidXQgaGFyZHdhcmUgZG9lcyBub3Qgc3VwcG9ydCBleHRlbnNpb24gQU5HTEVfaW5zdGFuY2VkX2FycmF5cy4nICk7XG5cdFx0XHRcdHJldHVybjtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0c3RhdGUuaW5pdEF0dHJpYnV0ZXMoKTtcblxuXHRcdHZhciBnZW9tZXRyeUF0dHJpYnV0ZXMgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzO1xuXG5cdFx0dmFyIHByb2dyYW1BdHRyaWJ1dGVzID0gcHJvZ3JhbS5nZXRBdHRyaWJ1dGVzKCk7XG5cblx0XHR2YXIgbWF0ZXJpYWxEZWZhdWx0QXR0cmlidXRlVmFsdWVzID0gbWF0ZXJpYWwuZGVmYXVsdEF0dHJpYnV0ZVZhbHVlcztcblxuXHRcdGZvciAoIHZhciBuYW1lIGluIHByb2dyYW1BdHRyaWJ1dGVzICkge1xuXG5cdFx0XHR2YXIgcHJvZ3JhbUF0dHJpYnV0ZSA9IHByb2dyYW1BdHRyaWJ1dGVzWyBuYW1lIF07XG5cblx0XHRcdGlmICggcHJvZ3JhbUF0dHJpYnV0ZSA+PSAwICkge1xuXG5cdFx0XHRcdHZhciBnZW9tZXRyeUF0dHJpYnV0ZSA9IGdlb21ldHJ5QXR0cmlidXRlc1sgbmFtZSBdO1xuXG5cdFx0XHRcdGlmICggZ2VvbWV0cnlBdHRyaWJ1dGUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdHZhciBub3JtYWxpemVkID0gZ2VvbWV0cnlBdHRyaWJ1dGUubm9ybWFsaXplZDtcblx0XHRcdFx0XHR2YXIgc2l6ZSA9IGdlb21ldHJ5QXR0cmlidXRlLml0ZW1TaXplO1xuXG5cdFx0XHRcdFx0dmFyIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMuZ2V0KCBnZW9tZXRyeUF0dHJpYnV0ZSApO1xuXG5cdFx0XHRcdFx0Ly8gVE9ETyBBdHRyaWJ1dGUgbWF5IG5vdCBiZSBhdmFpbGFibGUgb24gY29udGV4dCByZXN0b3JlXG5cblx0XHRcdFx0XHRpZiAoIGF0dHJpYnV0ZSA9PT0gdW5kZWZpbmVkICkgY29udGludWU7XG5cblx0XHRcdFx0XHR2YXIgYnVmZmVyID0gYXR0cmlidXRlLmJ1ZmZlcjtcblx0XHRcdFx0XHR2YXIgdHlwZSA9IGF0dHJpYnV0ZS50eXBlO1xuXHRcdFx0XHRcdHZhciBieXRlc1BlckVsZW1lbnQgPSBhdHRyaWJ1dGUuYnl0ZXNQZXJFbGVtZW50O1xuXG5cdFx0XHRcdFx0aWYgKCBnZW9tZXRyeUF0dHJpYnV0ZS5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlICkge1xuXG5cdFx0XHRcdFx0XHR2YXIgZGF0YSA9IGdlb21ldHJ5QXR0cmlidXRlLmRhdGE7XG5cdFx0XHRcdFx0XHR2YXIgc3RyaWRlID0gZGF0YS5zdHJpZGU7XG5cdFx0XHRcdFx0XHR2YXIgb2Zmc2V0ID0gZ2VvbWV0cnlBdHRyaWJ1dGUub2Zmc2V0O1xuXG5cdFx0XHRcdFx0XHRpZiAoIGRhdGEgJiYgZGF0YS5pc0luc3RhbmNlZEludGVybGVhdmVkQnVmZmVyICkge1xuXG5cdFx0XHRcdFx0XHRcdHN0YXRlLmVuYWJsZUF0dHJpYnV0ZUFuZERpdmlzb3IoIHByb2dyYW1BdHRyaWJ1dGUsIGRhdGEubWVzaFBlckF0dHJpYnV0ZSApO1xuXG5cdFx0XHRcdFx0XHRcdGlmICggZ2VvbWV0cnkubWF4SW5zdGFuY2VkQ291bnQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdFx0XHRcdGdlb21ldHJ5Lm1heEluc3RhbmNlZENvdW50ID0gZGF0YS5tZXNoUGVyQXR0cmlidXRlICogZGF0YS5jb3VudDtcblxuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdFx0c3RhdGUuZW5hYmxlQXR0cmlidXRlKCBwcm9ncmFtQXR0cmlidXRlICk7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0X2dsLmJpbmRCdWZmZXIoIF9nbC5BUlJBWV9CVUZGRVIsIGJ1ZmZlciApO1xuXHRcdFx0XHRcdFx0X2dsLnZlcnRleEF0dHJpYlBvaW50ZXIoIHByb2dyYW1BdHRyaWJ1dGUsIHNpemUsIHR5cGUsIG5vcm1hbGl6ZWQsIHN0cmlkZSAqIGJ5dGVzUGVyRWxlbWVudCwgb2Zmc2V0ICogYnl0ZXNQZXJFbGVtZW50ICk7XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRpZiAoIGdlb21ldHJ5QXR0cmlidXRlLmlzSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlICkge1xuXG5cdFx0XHRcdFx0XHRcdHN0YXRlLmVuYWJsZUF0dHJpYnV0ZUFuZERpdmlzb3IoIHByb2dyYW1BdHRyaWJ1dGUsIGdlb21ldHJ5QXR0cmlidXRlLm1lc2hQZXJBdHRyaWJ1dGUgKTtcblxuXHRcdFx0XHRcdFx0XHRpZiAoIGdlb21ldHJ5Lm1heEluc3RhbmNlZENvdW50ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRnZW9tZXRyeS5tYXhJbnN0YW5jZWRDb3VudCA9IGdlb21ldHJ5QXR0cmlidXRlLm1lc2hQZXJBdHRyaWJ1dGUgKiBnZW9tZXRyeUF0dHJpYnV0ZS5jb3VudDtcblxuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdFx0c3RhdGUuZW5hYmxlQXR0cmlidXRlKCBwcm9ncmFtQXR0cmlidXRlICk7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0X2dsLmJpbmRCdWZmZXIoIF9nbC5BUlJBWV9CVUZGRVIsIGJ1ZmZlciApO1xuXHRcdFx0XHRcdFx0X2dsLnZlcnRleEF0dHJpYlBvaW50ZXIoIHByb2dyYW1BdHRyaWJ1dGUsIHNpemUsIHR5cGUsIG5vcm1hbGl6ZWQsIDAsIDAgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbERlZmF1bHRBdHRyaWJ1dGVWYWx1ZXMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdHZhciB2YWx1ZSA9IG1hdGVyaWFsRGVmYXVsdEF0dHJpYnV0ZVZhbHVlc1sgbmFtZSBdO1xuXG5cdFx0XHRcdFx0aWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0XHRzd2l0Y2ggKCB2YWx1ZS5sZW5ndGggKSB7XG5cblx0XHRcdFx0XHRcdFx0Y2FzZSAyOlxuXHRcdFx0XHRcdFx0XHRcdF9nbC52ZXJ0ZXhBdHRyaWIyZnYoIHByb2dyYW1BdHRyaWJ1dGUsIHZhbHVlICk7XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRcdFx0Y2FzZSAzOlxuXHRcdFx0XHRcdFx0XHRcdF9nbC52ZXJ0ZXhBdHRyaWIzZnYoIHByb2dyYW1BdHRyaWJ1dGUsIHZhbHVlICk7XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRcdFx0Y2FzZSA0OlxuXHRcdFx0XHRcdFx0XHRcdF9nbC52ZXJ0ZXhBdHRyaWI0ZnYoIHByb2dyYW1BdHRyaWJ1dGUsIHZhbHVlICk7XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdFx0XHRfZ2wudmVydGV4QXR0cmliMWZ2KCBwcm9ncmFtQXR0cmlidXRlLCB2YWx1ZSApO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRzdGF0ZS5kaXNhYmxlVW51c2VkQXR0cmlidXRlcygpO1xuXG5cdH1cblxuXHQvLyBDb21waWxlXG5cblx0dGhpcy5jb21waWxlID0gZnVuY3Rpb24gKCBzY2VuZSwgY2FtZXJhICkge1xuXG5cdFx0Y3VycmVudFJlbmRlclN0YXRlID0gcmVuZGVyU3RhdGVzLmdldCggc2NlbmUsIGNhbWVyYSApO1xuXHRcdGN1cnJlbnRSZW5kZXJTdGF0ZS5pbml0KCk7XG5cblx0XHRzY2VuZS50cmF2ZXJzZSggZnVuY3Rpb24gKCBvYmplY3QgKSB7XG5cblx0XHRcdGlmICggb2JqZWN0LmlzTGlnaHQgKSB7XG5cblx0XHRcdFx0Y3VycmVudFJlbmRlclN0YXRlLnB1c2hMaWdodCggb2JqZWN0ICk7XG5cblx0XHRcdFx0aWYgKCBvYmplY3QuY2FzdFNoYWRvdyApIHtcblxuXHRcdFx0XHRcdGN1cnJlbnRSZW5kZXJTdGF0ZS5wdXNoU2hhZG93KCBvYmplY3QgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH0gKTtcblxuXHRcdGN1cnJlbnRSZW5kZXJTdGF0ZS5zZXR1cExpZ2h0cyggY2FtZXJhICk7XG5cblx0XHRzY2VuZS50cmF2ZXJzZSggZnVuY3Rpb24gKCBvYmplY3QgKSB7XG5cblx0XHRcdGlmICggb2JqZWN0Lm1hdGVyaWFsICkge1xuXG5cdFx0XHRcdGlmICggQXJyYXkuaXNBcnJheSggb2JqZWN0Lm1hdGVyaWFsICkgKSB7XG5cblx0XHRcdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBvYmplY3QubWF0ZXJpYWwubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRcdFx0XHRpbml0TWF0ZXJpYWwoIG9iamVjdC5tYXRlcmlhbFsgaSBdLCBzY2VuZS5mb2csIG9iamVjdCApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRpbml0TWF0ZXJpYWwoIG9iamVjdC5tYXRlcmlhbCwgc2NlbmUuZm9nLCBvYmplY3QgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH0gKTtcblxuXHR9O1xuXG5cdC8vIEFuaW1hdGlvbiBMb29wXG5cblx0dmFyIGlzQW5pbWF0aW5nID0gZmFsc2U7XG5cdHZhciBvbkFuaW1hdGlvbkZyYW1lID0gbnVsbDtcblxuXHRmdW5jdGlvbiBzdGFydEFuaW1hdGlvbigpIHtcblxuXHRcdGlmICggaXNBbmltYXRpbmcgKSByZXR1cm47XG5cblx0XHRyZXF1ZXN0QW5pbWF0aW9uTG9vcEZyYW1lKCk7XG5cblx0XHRpc0FuaW1hdGluZyA9IHRydWU7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHN0b3BBbmltYXRpb24oKSB7XG5cblx0XHRpc0FuaW1hdGluZyA9IGZhbHNlO1xuXG5cdH1cblxuXHRmdW5jdGlvbiByZXF1ZXN0QW5pbWF0aW9uTG9vcEZyYW1lKCkge1xuXG5cdFx0dmFyIGRldmljZSA9IHZyLmdldERldmljZSgpO1xuXG5cdFx0aWYgKCBkZXZpY2UgJiYgZGV2aWNlLmlzUHJlc2VudGluZyApIHtcblxuXHRcdFx0ZGV2aWNlLnJlcXVlc3RBbmltYXRpb25GcmFtZSggYW5pbWF0aW9uTG9vcCApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSggYW5pbWF0aW9uTG9vcCApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBhbmltYXRpb25Mb29wKCB0aW1lICkge1xuXG5cdFx0aWYgKCBpc0FuaW1hdGluZyA9PT0gZmFsc2UgKSByZXR1cm47XG5cblx0XHRvbkFuaW1hdGlvbkZyYW1lKCB0aW1lICk7XG5cblx0XHRyZXF1ZXN0QW5pbWF0aW9uTG9vcEZyYW1lKCk7XG5cblx0fVxuXG5cdHRoaXMuYW5pbWF0ZSA9IGZ1bmN0aW9uICggY2FsbGJhY2sgKSB7XG5cblx0XHRvbkFuaW1hdGlvbkZyYW1lID0gY2FsbGJhY2s7XG5cdFx0b25BbmltYXRpb25GcmFtZSAhPT0gbnVsbCA/IHN0YXJ0QW5pbWF0aW9uKCkgOiBzdG9wQW5pbWF0aW9uKCk7XG5cblx0fTtcblxuXHQvLyBSZW5kZXJpbmdcblxuXHR0aGlzLnJlbmRlciA9IGZ1bmN0aW9uICggc2NlbmUsIGNhbWVyYSwgcmVuZGVyVGFyZ2V0LCBmb3JjZUNsZWFyICkge1xuXG5cdFx0aWYgKCAhICggY2FtZXJhICYmIGNhbWVyYS5pc0NhbWVyYSApICkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuV2ViR0xSZW5kZXJlci5yZW5kZXI6IGNhbWVyYSBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgVEhSRUUuQ2FtZXJhLicgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdGlmICggX2lzQ29udGV4dExvc3QgKSByZXR1cm47XG5cblx0XHQvLyByZXNldCBjYWNoaW5nIGZvciB0aGlzIGZyYW1lXG5cblx0XHRfY3VycmVudEdlb21ldHJ5UHJvZ3JhbSA9ICcnO1xuXHRcdF9jdXJyZW50TWF0ZXJpYWxJZCA9IC0gMTtcblx0XHRfY3VycmVudENhbWVyYSA9IG51bGw7XG5cblx0XHQvLyB1cGRhdGUgc2NlbmUgZ3JhcGhcblxuXHRcdGlmICggc2NlbmUuYXV0b1VwZGF0ZSA9PT0gdHJ1ZSApIHNjZW5lLnVwZGF0ZU1hdHJpeFdvcmxkKCk7XG5cblx0XHQvLyB1cGRhdGUgY2FtZXJhIG1hdHJpY2VzIGFuZCBmcnVzdHVtXG5cblx0XHRpZiAoIGNhbWVyYS5wYXJlbnQgPT09IG51bGwgKSBjYW1lcmEudXBkYXRlTWF0cml4V29ybGQoKTtcblxuXHRcdGlmICggdnIuZW5hYmxlZCApIHtcblxuXHRcdFx0Y2FtZXJhID0gdnIuZ2V0Q2FtZXJhKCBjYW1lcmEgKTtcblxuXHRcdH1cblxuXHRcdC8vXG5cblx0XHRjdXJyZW50UmVuZGVyU3RhdGUgPSByZW5kZXJTdGF0ZXMuZ2V0KCBzY2VuZSwgY2FtZXJhICk7XG5cdFx0Y3VycmVudFJlbmRlclN0YXRlLmluaXQoKTtcblxuXHRcdHNjZW5lLm9uQmVmb3JlUmVuZGVyKCBfdGhpcywgc2NlbmUsIGNhbWVyYSwgcmVuZGVyVGFyZ2V0ICk7XG5cblx0XHRfcHJvalNjcmVlbk1hdHJpeC5tdWx0aXBseU1hdHJpY2VzKCBjYW1lcmEucHJvamVjdGlvbk1hdHJpeCwgY2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZSApO1xuXHRcdF9mcnVzdHVtLnNldEZyb21NYXRyaXgoIF9wcm9qU2NyZWVuTWF0cml4ICk7XG5cblx0XHRfbG9jYWxDbGlwcGluZ0VuYWJsZWQgPSB0aGlzLmxvY2FsQ2xpcHBpbmdFbmFibGVkO1xuXHRcdF9jbGlwcGluZ0VuYWJsZWQgPSBfY2xpcHBpbmcuaW5pdCggdGhpcy5jbGlwcGluZ1BsYW5lcywgX2xvY2FsQ2xpcHBpbmdFbmFibGVkLCBjYW1lcmEgKTtcblxuXHRcdGN1cnJlbnRSZW5kZXJMaXN0ID0gcmVuZGVyTGlzdHMuZ2V0KCBzY2VuZSwgY2FtZXJhICk7XG5cdFx0Y3VycmVudFJlbmRlckxpc3QuaW5pdCgpO1xuXG5cdFx0cHJvamVjdE9iamVjdCggc2NlbmUsIGNhbWVyYSwgX3RoaXMuc29ydE9iamVjdHMgKTtcblxuXHRcdGlmICggX3RoaXMuc29ydE9iamVjdHMgPT09IHRydWUgKSB7XG5cblx0XHRcdGN1cnJlbnRSZW5kZXJMaXN0LnNvcnQoKTtcblxuXHRcdH1cblxuXHRcdC8vXG5cblx0XHRpZiAoIF9jbGlwcGluZ0VuYWJsZWQgKSBfY2xpcHBpbmcuYmVnaW5TaGFkb3dzKCk7XG5cblx0XHR2YXIgc2hhZG93c0FycmF5ID0gY3VycmVudFJlbmRlclN0YXRlLnN0YXRlLnNoYWRvd3NBcnJheTtcblxuXHRcdHNoYWRvd01hcC5yZW5kZXIoIHNoYWRvd3NBcnJheSwgc2NlbmUsIGNhbWVyYSApO1xuXG5cdFx0Y3VycmVudFJlbmRlclN0YXRlLnNldHVwTGlnaHRzKCBjYW1lcmEgKTtcblxuXHRcdGlmICggX2NsaXBwaW5nRW5hYmxlZCApIF9jbGlwcGluZy5lbmRTaGFkb3dzKCk7XG5cblx0XHQvL1xuXG5cdFx0aWYgKCB0aGlzLmluZm8uYXV0b1Jlc2V0ICkgdGhpcy5pbmZvLnJlc2V0KCk7XG5cblx0XHRpZiAoIHJlbmRlclRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRyZW5kZXJUYXJnZXQgPSBudWxsO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5zZXRSZW5kZXJUYXJnZXQoIHJlbmRlclRhcmdldCApO1xuXG5cdFx0Ly9cblxuXHRcdGJhY2tncm91bmQucmVuZGVyKCBjdXJyZW50UmVuZGVyTGlzdCwgc2NlbmUsIGNhbWVyYSwgZm9yY2VDbGVhciApO1xuXG5cdFx0Ly8gcmVuZGVyIHNjZW5lXG5cblx0XHR2YXIgb3BhcXVlT2JqZWN0cyA9IGN1cnJlbnRSZW5kZXJMaXN0Lm9wYXF1ZTtcblx0XHR2YXIgdHJhbnNwYXJlbnRPYmplY3RzID0gY3VycmVudFJlbmRlckxpc3QudHJhbnNwYXJlbnQ7XG5cblx0XHRpZiAoIHNjZW5lLm92ZXJyaWRlTWF0ZXJpYWwgKSB7XG5cblx0XHRcdHZhciBvdmVycmlkZU1hdGVyaWFsID0gc2NlbmUub3ZlcnJpZGVNYXRlcmlhbDtcblxuXHRcdFx0aWYgKCBvcGFxdWVPYmplY3RzLmxlbmd0aCApIHJlbmRlck9iamVjdHMoIG9wYXF1ZU9iamVjdHMsIHNjZW5lLCBjYW1lcmEsIG92ZXJyaWRlTWF0ZXJpYWwgKTtcblx0XHRcdGlmICggdHJhbnNwYXJlbnRPYmplY3RzLmxlbmd0aCApIHJlbmRlck9iamVjdHMoIHRyYW5zcGFyZW50T2JqZWN0cywgc2NlbmUsIGNhbWVyYSwgb3ZlcnJpZGVNYXRlcmlhbCApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gb3BhcXVlIHBhc3MgKGZyb250LXRvLWJhY2sgb3JkZXIpXG5cblx0XHRcdGlmICggb3BhcXVlT2JqZWN0cy5sZW5ndGggKSByZW5kZXJPYmplY3RzKCBvcGFxdWVPYmplY3RzLCBzY2VuZSwgY2FtZXJhICk7XG5cblx0XHRcdC8vIHRyYW5zcGFyZW50IHBhc3MgKGJhY2stdG8tZnJvbnQgb3JkZXIpXG5cblx0XHRcdGlmICggdHJhbnNwYXJlbnRPYmplY3RzLmxlbmd0aCApIHJlbmRlck9iamVjdHMoIHRyYW5zcGFyZW50T2JqZWN0cywgc2NlbmUsIGNhbWVyYSApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gY3VzdG9tIHJlbmRlcmVyc1xuXG5cdFx0dmFyIHNwcml0ZXNBcnJheSA9IGN1cnJlbnRSZW5kZXJTdGF0ZS5zdGF0ZS5zcHJpdGVzQXJyYXk7XG5cblx0XHRzcHJpdGVSZW5kZXJlci5yZW5kZXIoIHNwcml0ZXNBcnJheSwgc2NlbmUsIGNhbWVyYSApO1xuXG5cdFx0Ly8gR2VuZXJhdGUgbWlwbWFwIGlmIHdlJ3JlIHVzaW5nIGFueSBraW5kIG9mIG1pcG1hcCBmaWx0ZXJpbmdcblxuXHRcdGlmICggcmVuZGVyVGFyZ2V0ICkge1xuXG5cdFx0XHR0ZXh0dXJlcy51cGRhdGVSZW5kZXJUYXJnZXRNaXBtYXAoIHJlbmRlclRhcmdldCApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gRW5zdXJlIGRlcHRoIGJ1ZmZlciB3cml0aW5nIGlzIGVuYWJsZWQgc28gaXQgY2FuIGJlIGNsZWFyZWQgb24gbmV4dCByZW5kZXJcblxuXHRcdHN0YXRlLmJ1ZmZlcnMuZGVwdGguc2V0VGVzdCggdHJ1ZSApO1xuXHRcdHN0YXRlLmJ1ZmZlcnMuZGVwdGguc2V0TWFzayggdHJ1ZSApO1xuXHRcdHN0YXRlLmJ1ZmZlcnMuY29sb3Iuc2V0TWFzayggdHJ1ZSApO1xuXG5cdFx0c3RhdGUuc2V0UG9seWdvbk9mZnNldCggZmFsc2UgKTtcblxuXHRcdHNjZW5lLm9uQWZ0ZXJSZW5kZXIoIF90aGlzLCBzY2VuZSwgY2FtZXJhICk7XG5cblx0XHRpZiAoIHZyLmVuYWJsZWQgKSB7XG5cblx0XHRcdHZyLnN1Ym1pdEZyYW1lKCk7XG5cblx0XHR9XG5cblx0XHQvLyBfZ2wuZmluaXNoKCk7XG5cblx0XHRjdXJyZW50UmVuZGVyTGlzdCA9IG51bGw7XG5cdFx0Y3VycmVudFJlbmRlclN0YXRlID0gbnVsbDtcblxuXHR9O1xuXG5cdC8qXG5cdC8vIFRPRE8gRHVwbGljYXRlZCBjb2RlIChGcnVzdHVtKVxuXG5cdHZhciBfc3BoZXJlID0gbmV3IFNwaGVyZSgpO1xuXG5cdGZ1bmN0aW9uIGlzT2JqZWN0Vmlld2FibGUoIG9iamVjdCApIHtcblxuXHRcdHZhciBnZW9tZXRyeSA9IG9iamVjdC5nZW9tZXRyeTtcblxuXHRcdGlmICggZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgPT09IG51bGwgKVxuXHRcdFx0Z2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7XG5cblx0XHRfc3BoZXJlLmNvcHkoIGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlICkuXG5cdFx0YXBwbHlNYXRyaXg0KCBvYmplY3QubWF0cml4V29ybGQgKTtcblxuXHRcdHJldHVybiBpc1NwaGVyZVZpZXdhYmxlKCBfc3BoZXJlICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGlzU3ByaXRlVmlld2FibGUoIHNwcml0ZSApIHtcblxuXHRcdF9zcGhlcmUuY2VudGVyLnNldCggMCwgMCwgMCApO1xuXHRcdF9zcGhlcmUucmFkaXVzID0gMC43MDcxMDY3ODExODY1NDc2O1xuXHRcdF9zcGhlcmUuYXBwbHlNYXRyaXg0KCBzcHJpdGUubWF0cml4V29ybGQgKTtcblxuXHRcdHJldHVybiBpc1NwaGVyZVZpZXdhYmxlKCBfc3BoZXJlICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGlzU3BoZXJlVmlld2FibGUoIHNwaGVyZSApIHtcblxuXHRcdGlmICggISBfZnJ1c3R1bS5pbnRlcnNlY3RzU3BoZXJlKCBzcGhlcmUgKSApIHJldHVybiBmYWxzZTtcblxuXHRcdHZhciBudW1QbGFuZXMgPSBfY2xpcHBpbmcubnVtUGxhbmVzO1xuXG5cdFx0aWYgKCBudW1QbGFuZXMgPT09IDAgKSByZXR1cm4gdHJ1ZTtcblxuXHRcdHZhciBwbGFuZXMgPSBfdGhpcy5jbGlwcGluZ1BsYW5lcyxcblxuXHRcdFx0Y2VudGVyID0gc3BoZXJlLmNlbnRlcixcblx0XHRcdG5lZ1JhZCA9IC0gc3BoZXJlLnJhZGl1cyxcblx0XHRcdGkgPSAwO1xuXG5cdFx0ZG8ge1xuXG5cdFx0XHQvLyBvdXQgd2hlbiBkZWVwZXIgdGhhbiByYWRpdXMgaW4gdGhlIG5lZ2F0aXZlIGhhbGZzcGFjZVxuXHRcdFx0aWYgKCBwbGFuZXNbIGkgXS5kaXN0YW5jZVRvUG9pbnQoIGNlbnRlciApIDwgbmVnUmFkICkgcmV0dXJuIGZhbHNlO1xuXG5cdFx0fSB3aGlsZSAoICsrIGkgIT09IG51bVBsYW5lcyApO1xuXG5cdFx0cmV0dXJuIHRydWU7XG5cblx0fVxuXHQqL1xuXG5cdGZ1bmN0aW9uIHByb2plY3RPYmplY3QoIG9iamVjdCwgY2FtZXJhLCBzb3J0T2JqZWN0cyApIHtcblxuXHRcdGlmICggb2JqZWN0LnZpc2libGUgPT09IGZhbHNlICkgcmV0dXJuO1xuXG5cdFx0dmFyIHZpc2libGUgPSBvYmplY3QubGF5ZXJzLnRlc3QoIGNhbWVyYS5sYXllcnMgKTtcblxuXHRcdGlmICggdmlzaWJsZSApIHtcblxuXHRcdFx0aWYgKCBvYmplY3QuaXNMaWdodCApIHtcblxuXHRcdFx0XHRjdXJyZW50UmVuZGVyU3RhdGUucHVzaExpZ2h0KCBvYmplY3QgKTtcblxuXHRcdFx0XHRpZiAoIG9iamVjdC5jYXN0U2hhZG93ICkge1xuXG5cdFx0XHRcdFx0Y3VycmVudFJlbmRlclN0YXRlLnB1c2hTaGFkb3coIG9iamVjdCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIGlmICggb2JqZWN0LmlzU3ByaXRlICkge1xuXG5cdFx0XHRcdGlmICggISBvYmplY3QuZnJ1c3R1bUN1bGxlZCB8fCBfZnJ1c3R1bS5pbnRlcnNlY3RzU3ByaXRlKCBvYmplY3QgKSApIHtcblxuXHRcdFx0XHRcdGN1cnJlbnRSZW5kZXJTdGF0ZS5wdXNoU3ByaXRlKCBvYmplY3QgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSBpZiAoIG9iamVjdC5pc0ltbWVkaWF0ZVJlbmRlck9iamVjdCApIHtcblxuXHRcdFx0XHRpZiAoIHNvcnRPYmplY3RzICkge1xuXG5cdFx0XHRcdFx0X3ZlY3RvcjMuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBvYmplY3QubWF0cml4V29ybGQgKVxuXHRcdFx0XHRcdFx0LmFwcGx5TWF0cml4NCggX3Byb2pTY3JlZW5NYXRyaXggKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y3VycmVudFJlbmRlckxpc3QucHVzaCggb2JqZWN0LCBudWxsLCBvYmplY3QubWF0ZXJpYWwsIF92ZWN0b3IzLnosIG51bGwgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggb2JqZWN0LmlzTWVzaCB8fCBvYmplY3QuaXNMaW5lIHx8IG9iamVjdC5pc1BvaW50cyApIHtcblxuXHRcdFx0XHRpZiAoIG9iamVjdC5pc1NraW5uZWRNZXNoICkge1xuXG5cdFx0XHRcdFx0b2JqZWN0LnNrZWxldG9uLnVwZGF0ZSgpO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoICEgb2JqZWN0LmZydXN0dW1DdWxsZWQgfHwgX2ZydXN0dW0uaW50ZXJzZWN0c09iamVjdCggb2JqZWN0ICkgKSB7XG5cblx0XHRcdFx0XHRpZiAoIHNvcnRPYmplY3RzICkge1xuXG5cdFx0XHRcdFx0XHRfdmVjdG9yMy5zZXRGcm9tTWF0cml4UG9zaXRpb24oIG9iamVjdC5tYXRyaXhXb3JsZCApXG5cdFx0XHRcdFx0XHRcdC5hcHBseU1hdHJpeDQoIF9wcm9qU2NyZWVuTWF0cml4ICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR2YXIgZ2VvbWV0cnkgPSBvYmplY3RzLnVwZGF0ZSggb2JqZWN0ICk7XG5cdFx0XHRcdFx0dmFyIG1hdGVyaWFsID0gb2JqZWN0Lm1hdGVyaWFsO1xuXG5cdFx0XHRcdFx0aWYgKCBBcnJheS5pc0FycmF5KCBtYXRlcmlhbCApICkge1xuXG5cdFx0XHRcdFx0XHR2YXIgZ3JvdXBzID0gZ2VvbWV0cnkuZ3JvdXBzO1xuXG5cdFx0XHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBncm91cHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdFx0XHR2YXIgZ3JvdXAgPSBncm91cHNbIGkgXTtcblx0XHRcdFx0XHRcdFx0dmFyIGdyb3VwTWF0ZXJpYWwgPSBtYXRlcmlhbFsgZ3JvdXAubWF0ZXJpYWxJbmRleCBdO1xuXG5cdFx0XHRcdFx0XHRcdGlmICggZ3JvdXBNYXRlcmlhbCAmJiBncm91cE1hdGVyaWFsLnZpc2libGUgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRjdXJyZW50UmVuZGVyTGlzdC5wdXNoKCBvYmplY3QsIGdlb21ldHJ5LCBncm91cE1hdGVyaWFsLCBfdmVjdG9yMy56LCBncm91cCApO1xuXG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwudmlzaWJsZSApIHtcblxuXHRcdFx0XHRcdFx0Y3VycmVudFJlbmRlckxpc3QucHVzaCggb2JqZWN0LCBnZW9tZXRyeSwgbWF0ZXJpYWwsIF92ZWN0b3IzLnosIG51bGwgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHZhciBjaGlsZHJlbiA9IG9iamVjdC5jaGlsZHJlbjtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHByb2plY3RPYmplY3QoIGNoaWxkcmVuWyBpIF0sIGNhbWVyYSwgc29ydE9iamVjdHMgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVuZGVyT2JqZWN0cyggcmVuZGVyTGlzdCwgc2NlbmUsIGNhbWVyYSwgb3ZlcnJpZGVNYXRlcmlhbCApIHtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHJlbmRlckxpc3QubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIHJlbmRlckl0ZW0gPSByZW5kZXJMaXN0WyBpIF07XG5cblx0XHRcdHZhciBvYmplY3QgPSByZW5kZXJJdGVtLm9iamVjdDtcblx0XHRcdHZhciBnZW9tZXRyeSA9IHJlbmRlckl0ZW0uZ2VvbWV0cnk7XG5cdFx0XHR2YXIgbWF0ZXJpYWwgPSBvdmVycmlkZU1hdGVyaWFsID09PSB1bmRlZmluZWQgPyByZW5kZXJJdGVtLm1hdGVyaWFsIDogb3ZlcnJpZGVNYXRlcmlhbDtcblx0XHRcdHZhciBncm91cCA9IHJlbmRlckl0ZW0uZ3JvdXA7XG5cblx0XHRcdGlmICggY2FtZXJhLmlzQXJyYXlDYW1lcmEgKSB7XG5cblx0XHRcdFx0X2N1cnJlbnRBcnJheUNhbWVyYSA9IGNhbWVyYTtcblxuXHRcdFx0XHR2YXIgY2FtZXJhcyA9IGNhbWVyYS5jYW1lcmFzO1xuXG5cdFx0XHRcdGZvciAoIHZhciBqID0gMCwgamwgPSBjYW1lcmFzLmxlbmd0aDsgaiA8IGpsOyBqICsrICkge1xuXG5cdFx0XHRcdFx0dmFyIGNhbWVyYTIgPSBjYW1lcmFzWyBqIF07XG5cblx0XHRcdFx0XHRpZiAoIG9iamVjdC5sYXllcnMudGVzdCggY2FtZXJhMi5sYXllcnMgKSApIHtcblxuXHRcdFx0XHRcdFx0dmFyIGJvdW5kcyA9IGNhbWVyYTIuYm91bmRzO1xuXG5cdFx0XHRcdFx0XHR2YXIgeCA9IGJvdW5kcy54ICogX3dpZHRoO1xuXHRcdFx0XHRcdFx0dmFyIHkgPSBib3VuZHMueSAqIF9oZWlnaHQ7XG5cdFx0XHRcdFx0XHR2YXIgd2lkdGggPSBib3VuZHMueiAqIF93aWR0aDtcblx0XHRcdFx0XHRcdHZhciBoZWlnaHQgPSBib3VuZHMudyAqIF9oZWlnaHQ7XG5cblx0XHRcdFx0XHRcdHN0YXRlLnZpZXdwb3J0KCBfY3VycmVudFZpZXdwb3J0LnNldCggeCwgeSwgd2lkdGgsIGhlaWdodCApLm11bHRpcGx5U2NhbGFyKCBfcGl4ZWxSYXRpbyApICk7XG5cblx0XHRcdFx0XHRcdHJlbmRlck9iamVjdCggb2JqZWN0LCBzY2VuZSwgY2FtZXJhMiwgZ2VvbWV0cnksIG1hdGVyaWFsLCBncm91cCApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRfY3VycmVudEFycmF5Q2FtZXJhID0gbnVsbDtcblxuXHRcdFx0XHRyZW5kZXJPYmplY3QoIG9iamVjdCwgc2NlbmUsIGNhbWVyYSwgZ2VvbWV0cnksIG1hdGVyaWFsLCBncm91cCApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlbmRlck9iamVjdCggb2JqZWN0LCBzY2VuZSwgY2FtZXJhLCBnZW9tZXRyeSwgbWF0ZXJpYWwsIGdyb3VwICkge1xuXG5cdFx0b2JqZWN0Lm9uQmVmb3JlUmVuZGVyKCBfdGhpcywgc2NlbmUsIGNhbWVyYSwgZ2VvbWV0cnksIG1hdGVyaWFsLCBncm91cCApO1xuXHRcdGN1cnJlbnRSZW5kZXJTdGF0ZSA9IHJlbmRlclN0YXRlcy5nZXQoIHNjZW5lLCBfY3VycmVudEFycmF5Q2FtZXJhIHx8IGNhbWVyYSApO1xuXG5cdFx0b2JqZWN0Lm1vZGVsVmlld01hdHJpeC5tdWx0aXBseU1hdHJpY2VzKCBjYW1lcmEubWF0cml4V29ybGRJbnZlcnNlLCBvYmplY3QubWF0cml4V29ybGQgKTtcblx0XHRvYmplY3Qubm9ybWFsTWF0cml4LmdldE5vcm1hbE1hdHJpeCggb2JqZWN0Lm1vZGVsVmlld01hdHJpeCApO1xuXG5cdFx0aWYgKCBvYmplY3QuaXNJbW1lZGlhdGVSZW5kZXJPYmplY3QgKSB7XG5cblx0XHRcdHZhciBmcm9udEZhY2VDVyA9ICggb2JqZWN0LmlzTWVzaCAmJiBvYmplY3QubWF0cml4V29ybGQuZGV0ZXJtaW5hbnQoKSA8IDAgKTtcblxuXHRcdFx0c3RhdGUuc2V0TWF0ZXJpYWwoIG1hdGVyaWFsLCBmcm9udEZhY2VDVyApO1xuXG5cdFx0XHR2YXIgcHJvZ3JhbSA9IHNldFByb2dyYW0oIGNhbWVyYSwgc2NlbmUuZm9nLCBtYXRlcmlhbCwgb2JqZWN0ICk7XG5cblx0XHRcdF9jdXJyZW50R2VvbWV0cnlQcm9ncmFtID0gJyc7XG5cblx0XHRcdHJlbmRlck9iamVjdEltbWVkaWF0ZSggb2JqZWN0LCBwcm9ncmFtLCBtYXRlcmlhbCApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0X3RoaXMucmVuZGVyQnVmZmVyRGlyZWN0KCBjYW1lcmEsIHNjZW5lLmZvZywgZ2VvbWV0cnksIG1hdGVyaWFsLCBvYmplY3QsIGdyb3VwICk7XG5cblx0XHR9XG5cblx0XHRvYmplY3Qub25BZnRlclJlbmRlciggX3RoaXMsIHNjZW5lLCBjYW1lcmEsIGdlb21ldHJ5LCBtYXRlcmlhbCwgZ3JvdXAgKTtcblx0XHRjdXJyZW50UmVuZGVyU3RhdGUgPSByZW5kZXJTdGF0ZXMuZ2V0KCBzY2VuZSwgX2N1cnJlbnRBcnJheUNhbWVyYSB8fCBjYW1lcmEgKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gaW5pdE1hdGVyaWFsKCBtYXRlcmlhbCwgZm9nLCBvYmplY3QgKSB7XG5cblx0XHR2YXIgbWF0ZXJpYWxQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIG1hdGVyaWFsICk7XG5cblx0XHR2YXIgbGlnaHRzID0gY3VycmVudFJlbmRlclN0YXRlLnN0YXRlLmxpZ2h0cztcblx0XHR2YXIgc2hhZG93c0FycmF5ID0gY3VycmVudFJlbmRlclN0YXRlLnN0YXRlLnNoYWRvd3NBcnJheTtcblxuXHRcdHZhciBwYXJhbWV0ZXJzID0gcHJvZ3JhbUNhY2hlLmdldFBhcmFtZXRlcnMoXG5cdFx0XHRtYXRlcmlhbCwgbGlnaHRzLnN0YXRlLCBzaGFkb3dzQXJyYXksIGZvZywgX2NsaXBwaW5nLm51bVBsYW5lcywgX2NsaXBwaW5nLm51bUludGVyc2VjdGlvbiwgb2JqZWN0ICk7XG5cblx0XHR2YXIgY29kZSA9IHByb2dyYW1DYWNoZS5nZXRQcm9ncmFtQ29kZSggbWF0ZXJpYWwsIHBhcmFtZXRlcnMgKTtcblxuXHRcdHZhciBwcm9ncmFtID0gbWF0ZXJpYWxQcm9wZXJ0aWVzLnByb2dyYW07XG5cdFx0dmFyIHByb2dyYW1DaGFuZ2UgPSB0cnVlO1xuXG5cdFx0aWYgKCBwcm9ncmFtID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdC8vIG5ldyBtYXRlcmlhbFxuXHRcdFx0bWF0ZXJpYWwuYWRkRXZlbnRMaXN0ZW5lciggJ2Rpc3Bvc2UnLCBvbk1hdGVyaWFsRGlzcG9zZSApO1xuXG5cdFx0fSBlbHNlIGlmICggcHJvZ3JhbS5jb2RlICE9PSBjb2RlICkge1xuXG5cdFx0XHQvLyBjaGFuZ2VkIGdsc2wgb3IgcGFyYW1ldGVyc1xuXHRcdFx0cmVsZWFzZU1hdGVyaWFsUHJvZ3JhbVJlZmVyZW5jZSggbWF0ZXJpYWwgKTtcblxuXHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsUHJvcGVydGllcy5saWdodHNIYXNoICE9PSBsaWdodHMuc3RhdGUuaGFzaCApIHtcblxuXHRcdFx0cHJvcGVydGllcy51cGRhdGUoIG1hdGVyaWFsLCAnbGlnaHRzSGFzaCcsIGxpZ2h0cy5zdGF0ZS5oYXNoICk7XG5cdFx0XHRwcm9ncmFtQ2hhbmdlID0gZmFsc2U7XG5cblx0XHR9IGVsc2UgaWYgKCBwYXJhbWV0ZXJzLnNoYWRlcklEICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdC8vIHNhbWUgZ2xzbCBhbmQgdW5pZm9ybSBsaXN0XG5cdFx0XHRyZXR1cm47XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBvbmx5IHJlYnVpbGQgdW5pZm9ybSBsaXN0XG5cdFx0XHRwcm9ncmFtQ2hhbmdlID0gZmFsc2U7XG5cblx0XHR9XG5cblx0XHRpZiAoIHByb2dyYW1DaGFuZ2UgKSB7XG5cblx0XHRcdGlmICggcGFyYW1ldGVycy5zaGFkZXJJRCApIHtcblxuXHRcdFx0XHR2YXIgc2hhZGVyID0gU2hhZGVyTGliWyBwYXJhbWV0ZXJzLnNoYWRlcklEIF07XG5cblx0XHRcdFx0bWF0ZXJpYWxQcm9wZXJ0aWVzLnNoYWRlciA9IHtcblx0XHRcdFx0XHRuYW1lOiBtYXRlcmlhbC50eXBlLFxuXHRcdFx0XHRcdHVuaWZvcm1zOiBVbmlmb3Jtc1V0aWxzLmNsb25lKCBzaGFkZXIudW5pZm9ybXMgKSxcblx0XHRcdFx0XHR2ZXJ0ZXhTaGFkZXI6IHNoYWRlci52ZXJ0ZXhTaGFkZXIsXG5cdFx0XHRcdFx0ZnJhZ21lbnRTaGFkZXI6IHNoYWRlci5mcmFnbWVudFNoYWRlclxuXHRcdFx0XHR9O1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdG1hdGVyaWFsUHJvcGVydGllcy5zaGFkZXIgPSB7XG5cdFx0XHRcdFx0bmFtZTogbWF0ZXJpYWwudHlwZSxcblx0XHRcdFx0XHR1bmlmb3JtczogbWF0ZXJpYWwudW5pZm9ybXMsXG5cdFx0XHRcdFx0dmVydGV4U2hhZGVyOiBtYXRlcmlhbC52ZXJ0ZXhTaGFkZXIsXG5cdFx0XHRcdFx0ZnJhZ21lbnRTaGFkZXI6IG1hdGVyaWFsLmZyYWdtZW50U2hhZGVyXG5cdFx0XHRcdH07XG5cblx0XHRcdH1cblxuXHRcdFx0bWF0ZXJpYWwub25CZWZvcmVDb21waWxlKCBtYXRlcmlhbFByb3BlcnRpZXMuc2hhZGVyLCBfdGhpcyApO1xuXG5cdFx0XHRwcm9ncmFtID0gcHJvZ3JhbUNhY2hlLmFjcXVpcmVQcm9ncmFtKCBtYXRlcmlhbCwgbWF0ZXJpYWxQcm9wZXJ0aWVzLnNoYWRlciwgcGFyYW1ldGVycywgY29kZSApO1xuXG5cdFx0XHRtYXRlcmlhbFByb3BlcnRpZXMucHJvZ3JhbSA9IHByb2dyYW07XG5cdFx0XHRtYXRlcmlhbC5wcm9ncmFtID0gcHJvZ3JhbTtcblxuXHRcdH1cblxuXHRcdHZhciBwcm9ncmFtQXR0cmlidXRlcyA9IHByb2dyYW0uZ2V0QXR0cmlidXRlcygpO1xuXG5cdFx0aWYgKCBtYXRlcmlhbC5tb3JwaFRhcmdldHMgKSB7XG5cblx0XHRcdG1hdGVyaWFsLm51bVN1cHBvcnRlZE1vcnBoVGFyZ2V0cyA9IDA7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IF90aGlzLm1heE1vcnBoVGFyZ2V0czsgaSArKyApIHtcblxuXHRcdFx0XHRpZiAoIHByb2dyYW1BdHRyaWJ1dGVzWyAnbW9ycGhUYXJnZXQnICsgaSBdID49IDAgKSB7XG5cblx0XHRcdFx0XHRtYXRlcmlhbC5udW1TdXBwb3J0ZWRNb3JwaFRhcmdldHMgKys7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLm1vcnBoTm9ybWFscyApIHtcblxuXHRcdFx0bWF0ZXJpYWwubnVtU3VwcG9ydGVkTW9ycGhOb3JtYWxzID0gMDtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgX3RoaXMubWF4TW9ycGhOb3JtYWxzOyBpICsrICkge1xuXG5cdFx0XHRcdGlmICggcHJvZ3JhbUF0dHJpYnV0ZXNbICdtb3JwaE5vcm1hbCcgKyBpIF0gPj0gMCApIHtcblxuXHRcdFx0XHRcdG1hdGVyaWFsLm51bVN1cHBvcnRlZE1vcnBoTm9ybWFscyArKztcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHZhciB1bmlmb3JtcyA9IG1hdGVyaWFsUHJvcGVydGllcy5zaGFkZXIudW5pZm9ybXM7XG5cblx0XHRpZiAoICEgbWF0ZXJpYWwuaXNTaGFkZXJNYXRlcmlhbCAmJlxuXHRcdFx0ISBtYXRlcmlhbC5pc1Jhd1NoYWRlck1hdGVyaWFsIHx8XG5cdFx0XHRtYXRlcmlhbC5jbGlwcGluZyA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0bWF0ZXJpYWxQcm9wZXJ0aWVzLm51bUNsaXBwaW5nUGxhbmVzID0gX2NsaXBwaW5nLm51bVBsYW5lcztcblx0XHRcdG1hdGVyaWFsUHJvcGVydGllcy5udW1JbnRlcnNlY3Rpb24gPSBfY2xpcHBpbmcubnVtSW50ZXJzZWN0aW9uO1xuXHRcdFx0dW5pZm9ybXMuY2xpcHBpbmdQbGFuZXMgPSBfY2xpcHBpbmcudW5pZm9ybTtcblxuXHRcdH1cblxuXHRcdG1hdGVyaWFsUHJvcGVydGllcy5mb2cgPSBmb2c7XG5cblx0XHQvLyBzdG9yZSB0aGUgbGlnaHQgc2V0dXAgaXQgd2FzIGNyZWF0ZWQgZm9yXG5cblx0XHRtYXRlcmlhbFByb3BlcnRpZXMubGlnaHRzSGFzaCA9IGxpZ2h0cy5zdGF0ZS5oYXNoO1xuXG5cdFx0aWYgKCBtYXRlcmlhbC5saWdodHMgKSB7XG5cblx0XHRcdC8vIHdpcmUgdXAgdGhlIG1hdGVyaWFsIHRvIHRoaXMgcmVuZGVyZXIncyBsaWdodGluZyBzdGF0ZVxuXG5cdFx0XHR1bmlmb3Jtcy5hbWJpZW50TGlnaHRDb2xvci52YWx1ZSA9IGxpZ2h0cy5zdGF0ZS5hbWJpZW50O1xuXHRcdFx0dW5pZm9ybXMuZGlyZWN0aW9uYWxMaWdodHMudmFsdWUgPSBsaWdodHMuc3RhdGUuZGlyZWN0aW9uYWw7XG5cdFx0XHR1bmlmb3Jtcy5zcG90TGlnaHRzLnZhbHVlID0gbGlnaHRzLnN0YXRlLnNwb3Q7XG5cdFx0XHR1bmlmb3Jtcy5yZWN0QXJlYUxpZ2h0cy52YWx1ZSA9IGxpZ2h0cy5zdGF0ZS5yZWN0QXJlYTtcblx0XHRcdHVuaWZvcm1zLnBvaW50TGlnaHRzLnZhbHVlID0gbGlnaHRzLnN0YXRlLnBvaW50O1xuXHRcdFx0dW5pZm9ybXMuaGVtaXNwaGVyZUxpZ2h0cy52YWx1ZSA9IGxpZ2h0cy5zdGF0ZS5oZW1pO1xuXG5cdFx0XHR1bmlmb3Jtcy5kaXJlY3Rpb25hbFNoYWRvd01hcC52YWx1ZSA9IGxpZ2h0cy5zdGF0ZS5kaXJlY3Rpb25hbFNoYWRvd01hcDtcblx0XHRcdHVuaWZvcm1zLmRpcmVjdGlvbmFsU2hhZG93TWF0cml4LnZhbHVlID0gbGlnaHRzLnN0YXRlLmRpcmVjdGlvbmFsU2hhZG93TWF0cml4O1xuXHRcdFx0dW5pZm9ybXMuc3BvdFNoYWRvd01hcC52YWx1ZSA9IGxpZ2h0cy5zdGF0ZS5zcG90U2hhZG93TWFwO1xuXHRcdFx0dW5pZm9ybXMuc3BvdFNoYWRvd01hdHJpeC52YWx1ZSA9IGxpZ2h0cy5zdGF0ZS5zcG90U2hhZG93TWF0cml4O1xuXHRcdFx0dW5pZm9ybXMucG9pbnRTaGFkb3dNYXAudmFsdWUgPSBsaWdodHMuc3RhdGUucG9pbnRTaGFkb3dNYXA7XG5cdFx0XHR1bmlmb3Jtcy5wb2ludFNoYWRvd01hdHJpeC52YWx1ZSA9IGxpZ2h0cy5zdGF0ZS5wb2ludFNoYWRvd01hdHJpeDtcblx0XHRcdC8vIFRPRE8gKGFiZWxuYXRpb24pOiBhZGQgYXJlYSBsaWdodHMgc2hhZG93IGluZm8gdG8gdW5pZm9ybXNcblxuXHRcdH1cblxuXHRcdHZhciBwcm9nVW5pZm9ybXMgPSBtYXRlcmlhbFByb3BlcnRpZXMucHJvZ3JhbS5nZXRVbmlmb3JtcygpLFxuXHRcdFx0dW5pZm9ybXNMaXN0ID1cblx0XHRcdFx0V2ViR0xVbmlmb3Jtcy5zZXFXaXRoVmFsdWUoIHByb2dVbmlmb3Jtcy5zZXEsIHVuaWZvcm1zICk7XG5cblx0XHRtYXRlcmlhbFByb3BlcnRpZXMudW5pZm9ybXNMaXN0ID0gdW5pZm9ybXNMaXN0O1xuXG5cdH1cblxuXHRmdW5jdGlvbiBzZXRQcm9ncmFtKCBjYW1lcmEsIGZvZywgbWF0ZXJpYWwsIG9iamVjdCApIHtcblxuXHRcdF91c2VkVGV4dHVyZVVuaXRzID0gMDtcblxuXHRcdHZhciBtYXRlcmlhbFByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggbWF0ZXJpYWwgKTtcblx0XHR2YXIgbGlnaHRzID0gY3VycmVudFJlbmRlclN0YXRlLnN0YXRlLmxpZ2h0cztcblxuXHRcdGlmICggX2NsaXBwaW5nRW5hYmxlZCApIHtcblxuXHRcdFx0aWYgKCBfbG9jYWxDbGlwcGluZ0VuYWJsZWQgfHwgY2FtZXJhICE9PSBfY3VycmVudENhbWVyYSApIHtcblxuXHRcdFx0XHR2YXIgdXNlQ2FjaGUgPVxuXHRcdFx0XHRcdGNhbWVyYSA9PT0gX2N1cnJlbnRDYW1lcmEgJiZcblx0XHRcdFx0XHRtYXRlcmlhbC5pZCA9PT0gX2N1cnJlbnRNYXRlcmlhbElkO1xuXG5cdFx0XHRcdC8vIHdlIG1pZ2h0IHdhbnQgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIHdpdGggc29tZSBDbGlwcGluZ0dyb3VwXG5cdFx0XHRcdC8vIG9iamVjdCBpbnN0ZWFkIG9mIHRoZSBtYXRlcmlhbCwgb25jZSBpdCBiZWNvbWVzIGZlYXNpYmxlXG5cdFx0XHRcdC8vICgjODQ2NSwgIzgzNzkpXG5cdFx0XHRcdF9jbGlwcGluZy5zZXRTdGF0ZShcblx0XHRcdFx0XHRtYXRlcmlhbC5jbGlwcGluZ1BsYW5lcywgbWF0ZXJpYWwuY2xpcEludGVyc2VjdGlvbiwgbWF0ZXJpYWwuY2xpcFNoYWRvd3MsXG5cdFx0XHRcdFx0Y2FtZXJhLCBtYXRlcmlhbFByb3BlcnRpZXMsIHVzZUNhY2hlICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwubmVlZHNVcGRhdGUgPT09IGZhbHNlICkge1xuXG5cdFx0XHRpZiAoIG1hdGVyaWFsUHJvcGVydGllcy5wcm9ncmFtID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0bWF0ZXJpYWwubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC5mb2cgJiYgbWF0ZXJpYWxQcm9wZXJ0aWVzLmZvZyAhPT0gZm9nICkge1xuXG5cdFx0XHRcdG1hdGVyaWFsLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwubGlnaHRzICYmIG1hdGVyaWFsUHJvcGVydGllcy5saWdodHNIYXNoICE9PSBsaWdodHMuc3RhdGUuaGFzaCApIHtcblxuXHRcdFx0XHRtYXRlcmlhbC5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsUHJvcGVydGllcy5udW1DbGlwcGluZ1BsYW5lcyAhPT0gdW5kZWZpbmVkICYmXG5cdFx0XHRcdCggbWF0ZXJpYWxQcm9wZXJ0aWVzLm51bUNsaXBwaW5nUGxhbmVzICE9PSBfY2xpcHBpbmcubnVtUGxhbmVzIHx8XG5cdFx0XHRcdG1hdGVyaWFsUHJvcGVydGllcy5udW1JbnRlcnNlY3Rpb24gIT09IF9jbGlwcGluZy5udW1JbnRlcnNlY3Rpb24gKSApIHtcblxuXHRcdFx0XHRtYXRlcmlhbC5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwubmVlZHNVcGRhdGUgKSB7XG5cblx0XHRcdGluaXRNYXRlcmlhbCggbWF0ZXJpYWwsIGZvZywgb2JqZWN0ICk7XG5cdFx0XHRtYXRlcmlhbC5uZWVkc1VwZGF0ZSA9IGZhbHNlO1xuXG5cdFx0fVxuXG5cdFx0dmFyIHJlZnJlc2hQcm9ncmFtID0gZmFsc2U7XG5cdFx0dmFyIHJlZnJlc2hNYXRlcmlhbCA9IGZhbHNlO1xuXHRcdHZhciByZWZyZXNoTGlnaHRzID0gZmFsc2U7XG5cblx0XHR2YXIgcHJvZ3JhbSA9IG1hdGVyaWFsUHJvcGVydGllcy5wcm9ncmFtLFxuXHRcdFx0cF91bmlmb3JtcyA9IHByb2dyYW0uZ2V0VW5pZm9ybXMoKSxcblx0XHRcdG1fdW5pZm9ybXMgPSBtYXRlcmlhbFByb3BlcnRpZXMuc2hhZGVyLnVuaWZvcm1zO1xuXG5cdFx0aWYgKCBzdGF0ZS51c2VQcm9ncmFtKCBwcm9ncmFtLnByb2dyYW0gKSApIHtcblxuXHRcdFx0cmVmcmVzaFByb2dyYW0gPSB0cnVlO1xuXHRcdFx0cmVmcmVzaE1hdGVyaWFsID0gdHJ1ZTtcblx0XHRcdHJlZnJlc2hMaWdodHMgPSB0cnVlO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5pZCAhPT0gX2N1cnJlbnRNYXRlcmlhbElkICkge1xuXG5cdFx0XHRfY3VycmVudE1hdGVyaWFsSWQgPSBtYXRlcmlhbC5pZDtcblxuXHRcdFx0cmVmcmVzaE1hdGVyaWFsID0gdHJ1ZTtcblxuXHRcdH1cblxuXHRcdGlmICggcmVmcmVzaFByb2dyYW0gfHwgY2FtZXJhICE9PSBfY3VycmVudENhbWVyYSApIHtcblxuXHRcdFx0cF91bmlmb3Jtcy5zZXRWYWx1ZSggX2dsLCAncHJvamVjdGlvbk1hdHJpeCcsIGNhbWVyYS5wcm9qZWN0aW9uTWF0cml4ICk7XG5cblx0XHRcdGlmICggY2FwYWJpbGl0aWVzLmxvZ2FyaXRobWljRGVwdGhCdWZmZXIgKSB7XG5cblx0XHRcdFx0cF91bmlmb3Jtcy5zZXRWYWx1ZSggX2dsLCAnbG9nRGVwdGhCdWZGQycsXG5cdFx0XHRcdFx0Mi4wIC8gKCBNYXRoLmxvZyggY2FtZXJhLmZhciArIDEuMCApIC8gTWF0aC5MTjIgKSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIEF2b2lkIHVubmVlZGVkIHVuaWZvcm0gdXBkYXRlcyBwZXIgQXJyYXlDYW1lcmEncyBzdWItY2FtZXJhXG5cblx0XHRcdGlmICggX2N1cnJlbnRDYW1lcmEgIT09ICggX2N1cnJlbnRBcnJheUNhbWVyYSB8fCBjYW1lcmEgKSApIHtcblxuXHRcdFx0XHRfY3VycmVudENhbWVyYSA9ICggX2N1cnJlbnRBcnJheUNhbWVyYSB8fCBjYW1lcmEgKTtcblxuXHRcdFx0XHQvLyBsaWdodGluZyB1bmlmb3JtcyBkZXBlbmQgb24gdGhlIGNhbWVyYSBzbyBlbmZvcmNlIGFuIHVwZGF0ZVxuXHRcdFx0XHQvLyBub3csIGluIGNhc2UgdGhpcyBtYXRlcmlhbCBzdXBwb3J0cyBsaWdodHMgLSBvciBsYXRlciwgd2hlblxuXHRcdFx0XHQvLyB0aGUgbmV4dCBtYXRlcmlhbCB0aGF0IGRvZXMgZ2V0cyBhY3RpdmF0ZWQ6XG5cblx0XHRcdFx0cmVmcmVzaE1hdGVyaWFsID0gdHJ1ZTtcdFx0Ly8gc2V0IHRvIHRydWUgb24gbWF0ZXJpYWwgY2hhbmdlXG5cdFx0XHRcdHJlZnJlc2hMaWdodHMgPSB0cnVlO1x0XHQvLyByZW1haW5zIHNldCB1bnRpbCB1cGRhdGUgZG9uZVxuXG5cdFx0XHR9XG5cblx0XHRcdC8vIGxvYWQgbWF0ZXJpYWwgc3BlY2lmaWMgdW5pZm9ybXNcblx0XHRcdC8vIChzaGFkZXIgbWF0ZXJpYWwgYWxzbyBnZXRzIHRoZW0gZm9yIHRoZSBzYWtlIG9mIGdlbmVyaWNpdHkpXG5cblx0XHRcdGlmICggbWF0ZXJpYWwuaXNTaGFkZXJNYXRlcmlhbCB8fFxuXHRcdFx0XHRtYXRlcmlhbC5pc01lc2hQaG9uZ01hdGVyaWFsIHx8XG5cdFx0XHRcdG1hdGVyaWFsLmlzTWVzaFN0YW5kYXJkTWF0ZXJpYWwgfHxcblx0XHRcdFx0bWF0ZXJpYWwuZW52TWFwICkge1xuXG5cdFx0XHRcdHZhciB1Q2FtUG9zID0gcF91bmlmb3Jtcy5tYXAuY2FtZXJhUG9zaXRpb247XG5cblx0XHRcdFx0aWYgKCB1Q2FtUG9zICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHR1Q2FtUG9zLnNldFZhbHVlKCBfZ2wsXG5cdFx0XHRcdFx0XHRfdmVjdG9yMy5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGNhbWVyYS5tYXRyaXhXb3JsZCApICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggbWF0ZXJpYWwuaXNNZXNoUGhvbmdNYXRlcmlhbCB8fFxuXHRcdFx0XHRtYXRlcmlhbC5pc01lc2hMYW1iZXJ0TWF0ZXJpYWwgfHxcblx0XHRcdFx0bWF0ZXJpYWwuaXNNZXNoQmFzaWNNYXRlcmlhbCB8fFxuXHRcdFx0XHRtYXRlcmlhbC5pc01lc2hTdGFuZGFyZE1hdGVyaWFsIHx8XG5cdFx0XHRcdG1hdGVyaWFsLmlzU2hhZGVyTWF0ZXJpYWwgfHxcblx0XHRcdFx0bWF0ZXJpYWwuc2tpbm5pbmcgKSB7XG5cblx0XHRcdFx0cF91bmlmb3Jtcy5zZXRWYWx1ZSggX2dsLCAndmlld01hdHJpeCcsIGNhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gc2tpbm5pbmcgdW5pZm9ybXMgbXVzdCBiZSBzZXQgZXZlbiBpZiBtYXRlcmlhbCBkaWRuJ3QgY2hhbmdlXG5cdFx0Ly8gYXV0by1zZXR0aW5nIG9mIHRleHR1cmUgdW5pdCBmb3IgYm9uZSB0ZXh0dXJlIG11c3QgZ28gYmVmb3JlIG90aGVyIHRleHR1cmVzXG5cdFx0Ly8gbm90IHN1cmUgd2h5LCBidXQgb3RoZXJ3aXNlIHdlaXJkIHRoaW5ncyBoYXBwZW5cblxuXHRcdGlmICggbWF0ZXJpYWwuc2tpbm5pbmcgKSB7XG5cblx0XHRcdHBfdW5pZm9ybXMuc2V0T3B0aW9uYWwoIF9nbCwgb2JqZWN0LCAnYmluZE1hdHJpeCcgKTtcblx0XHRcdHBfdW5pZm9ybXMuc2V0T3B0aW9uYWwoIF9nbCwgb2JqZWN0LCAnYmluZE1hdHJpeEludmVyc2UnICk7XG5cblx0XHRcdHZhciBza2VsZXRvbiA9IG9iamVjdC5za2VsZXRvbjtcblxuXHRcdFx0aWYgKCBza2VsZXRvbiApIHtcblxuXHRcdFx0XHR2YXIgYm9uZXMgPSBza2VsZXRvbi5ib25lcztcblxuXHRcdFx0XHRpZiAoIGNhcGFiaWxpdGllcy5mbG9hdFZlcnRleFRleHR1cmVzICkge1xuXG5cdFx0XHRcdFx0aWYgKCBza2VsZXRvbi5ib25lVGV4dHVyZSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0XHQvLyBsYXlvdXQgKDEgbWF0cml4ID0gNCBwaXhlbHMpXG5cdFx0XHRcdFx0XHQvLyAgICAgIFJHQkEgUkdCQSBSR0JBIFJHQkEgKD0+IGNvbHVtbjEsIGNvbHVtbjIsIGNvbHVtbjMsIGNvbHVtbjQpXG5cdFx0XHRcdFx0XHQvLyAgd2l0aCAgOHg4ICBwaXhlbCB0ZXh0dXJlIG1heCAgIDE2IGJvbmVzICogNCBwaXhlbHMgPSAgKDggKiA4KVxuXHRcdFx0XHRcdFx0Ly8gICAgICAgMTZ4MTYgcGl4ZWwgdGV4dHVyZSBtYXggICA2NCBib25lcyAqIDQgcGl4ZWxzID0gKDE2ICogMTYpXG5cdFx0XHRcdFx0XHQvLyAgICAgICAzMngzMiBwaXhlbCB0ZXh0dXJlIG1heCAgMjU2IGJvbmVzICogNCBwaXhlbHMgPSAoMzIgKiAzMilcblx0XHRcdFx0XHRcdC8vICAgICAgIDY0eDY0IHBpeGVsIHRleHR1cmUgbWF4IDEwMjQgYm9uZXMgKiA0IHBpeGVscyA9ICg2NCAqIDY0KVxuXG5cblx0XHRcdFx0XHRcdHZhciBzaXplID0gTWF0aC5zcXJ0KCBib25lcy5sZW5ndGggKiA0ICk7IC8vIDQgcGl4ZWxzIG5lZWRlZCBmb3IgMSBtYXRyaXhcblx0XHRcdFx0XHRcdHNpemUgPSBfTWF0aC5jZWlsUG93ZXJPZlR3byggc2l6ZSApO1xuXHRcdFx0XHRcdFx0c2l6ZSA9IE1hdGgubWF4KCBzaXplLCA0ICk7XG5cblx0XHRcdFx0XHRcdHZhciBib25lTWF0cmljZXMgPSBuZXcgRmxvYXQzMkFycmF5KCBzaXplICogc2l6ZSAqIDQgKTsgLy8gNCBmbG9hdHMgcGVyIFJHQkEgcGl4ZWxcblx0XHRcdFx0XHRcdGJvbmVNYXRyaWNlcy5zZXQoIHNrZWxldG9uLmJvbmVNYXRyaWNlcyApOyAvLyBjb3B5IGN1cnJlbnQgdmFsdWVzXG5cblx0XHRcdFx0XHRcdHZhciBib25lVGV4dHVyZSA9IG5ldyBEYXRhVGV4dHVyZSggYm9uZU1hdHJpY2VzLCBzaXplLCBzaXplLCBSR0JBRm9ybWF0LCBGbG9hdFR5cGUgKTtcblx0XHRcdFx0XHRcdGJvbmVUZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0XHRcdFx0c2tlbGV0b24uYm9uZU1hdHJpY2VzID0gYm9uZU1hdHJpY2VzO1xuXHRcdFx0XHRcdFx0c2tlbGV0b24uYm9uZVRleHR1cmUgPSBib25lVGV4dHVyZTtcblx0XHRcdFx0XHRcdHNrZWxldG9uLmJvbmVUZXh0dXJlU2l6ZSA9IHNpemU7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRwX3VuaWZvcm1zLnNldFZhbHVlKCBfZ2wsICdib25lVGV4dHVyZScsIHNrZWxldG9uLmJvbmVUZXh0dXJlICk7XG5cdFx0XHRcdFx0cF91bmlmb3Jtcy5zZXRWYWx1ZSggX2dsLCAnYm9uZVRleHR1cmVTaXplJywgc2tlbGV0b24uYm9uZVRleHR1cmVTaXplICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHBfdW5pZm9ybXMuc2V0T3B0aW9uYWwoIF9nbCwgc2tlbGV0b24sICdib25lTWF0cmljZXMnICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIHJlZnJlc2hNYXRlcmlhbCApIHtcblxuXHRcdFx0cF91bmlmb3Jtcy5zZXRWYWx1ZSggX2dsLCAndG9uZU1hcHBpbmdFeHBvc3VyZScsIF90aGlzLnRvbmVNYXBwaW5nRXhwb3N1cmUgKTtcblx0XHRcdHBfdW5pZm9ybXMuc2V0VmFsdWUoIF9nbCwgJ3RvbmVNYXBwaW5nV2hpdGVQb2ludCcsIF90aGlzLnRvbmVNYXBwaW5nV2hpdGVQb2ludCApO1xuXG5cdFx0XHRpZiAoIG1hdGVyaWFsLmxpZ2h0cyApIHtcblxuXHRcdFx0XHQvLyB0aGUgY3VycmVudCBtYXRlcmlhbCByZXF1aXJlcyBsaWdodGluZyBpbmZvXG5cblx0XHRcdFx0Ly8gbm90ZTogYWxsIGxpZ2h0aW5nIHVuaWZvcm1zIGFyZSBhbHdheXMgc2V0IGNvcnJlY3RseVxuXHRcdFx0XHQvLyB0aGV5IHNpbXBseSByZWZlcmVuY2UgdGhlIHJlbmRlcmVyJ3Mgc3RhdGUgZm9yIHRoZWlyXG5cdFx0XHRcdC8vIHZhbHVlc1xuXHRcdFx0XHQvL1xuXHRcdFx0XHQvLyB1c2UgdGhlIGN1cnJlbnQgbWF0ZXJpYWwncyAubmVlZHNVcGRhdGUgZmxhZ3MgdG8gc2V0XG5cdFx0XHRcdC8vIHRoZSBHTCBzdGF0ZSB3aGVuIHJlcXVpcmVkXG5cblx0XHRcdFx0bWFya1VuaWZvcm1zTGlnaHRzTmVlZHNVcGRhdGUoIG1fdW5pZm9ybXMsIHJlZnJlc2hMaWdodHMgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyByZWZyZXNoIHVuaWZvcm1zIGNvbW1vbiB0byBzZXZlcmFsIG1hdGVyaWFsc1xuXG5cdFx0XHRpZiAoIGZvZyAmJiBtYXRlcmlhbC5mb2cgKSB7XG5cblx0XHRcdFx0cmVmcmVzaFVuaWZvcm1zRm9nKCBtX3VuaWZvcm1zLCBmb2cgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIG1hdGVyaWFsLmlzTWVzaEJhc2ljTWF0ZXJpYWwgKSB7XG5cblx0XHRcdFx0cmVmcmVzaFVuaWZvcm1zQ29tbW9uKCBtX3VuaWZvcm1zLCBtYXRlcmlhbCApO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC5pc01lc2hMYW1iZXJ0TWF0ZXJpYWwgKSB7XG5cblx0XHRcdFx0cmVmcmVzaFVuaWZvcm1zQ29tbW9uKCBtX3VuaWZvcm1zLCBtYXRlcmlhbCApO1xuXHRcdFx0XHRyZWZyZXNoVW5pZm9ybXNMYW1iZXJ0KCBtX3VuaWZvcm1zLCBtYXRlcmlhbCApO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC5pc01lc2hQaG9uZ01hdGVyaWFsICkge1xuXG5cdFx0XHRcdHJlZnJlc2hVbmlmb3Jtc0NvbW1vbiggbV91bmlmb3JtcywgbWF0ZXJpYWwgKTtcblxuXHRcdFx0XHRpZiAoIG1hdGVyaWFsLmlzTWVzaFRvb25NYXRlcmlhbCApIHtcblxuXHRcdFx0XHRcdHJlZnJlc2hVbmlmb3Jtc1Rvb24oIG1fdW5pZm9ybXMsIG1hdGVyaWFsICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHJlZnJlc2hVbmlmb3Jtc1Bob25nKCBtX3VuaWZvcm1zLCBtYXRlcmlhbCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbCApIHtcblxuXHRcdFx0XHRyZWZyZXNoVW5pZm9ybXNDb21tb24oIG1fdW5pZm9ybXMsIG1hdGVyaWFsICk7XG5cblx0XHRcdFx0aWYgKCBtYXRlcmlhbC5pc01lc2hQaHlzaWNhbE1hdGVyaWFsICkge1xuXG5cdFx0XHRcdFx0cmVmcmVzaFVuaWZvcm1zUGh5c2ljYWwoIG1fdW5pZm9ybXMsIG1hdGVyaWFsICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHJlZnJlc2hVbmlmb3Jtc1N0YW5kYXJkKCBtX3VuaWZvcm1zLCBtYXRlcmlhbCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuaXNNZXNoRGVwdGhNYXRlcmlhbCApIHtcblxuXHRcdFx0XHRyZWZyZXNoVW5pZm9ybXNDb21tb24oIG1fdW5pZm9ybXMsIG1hdGVyaWFsICk7XG5cdFx0XHRcdHJlZnJlc2hVbmlmb3Jtc0RlcHRoKCBtX3VuaWZvcm1zLCBtYXRlcmlhbCApO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC5pc01lc2hEaXN0YW5jZU1hdGVyaWFsICkge1xuXG5cdFx0XHRcdHJlZnJlc2hVbmlmb3Jtc0NvbW1vbiggbV91bmlmb3JtcywgbWF0ZXJpYWwgKTtcblx0XHRcdFx0cmVmcmVzaFVuaWZvcm1zRGlzdGFuY2UoIG1fdW5pZm9ybXMsIG1hdGVyaWFsICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLmlzTWVzaE5vcm1hbE1hdGVyaWFsICkge1xuXG5cdFx0XHRcdHJlZnJlc2hVbmlmb3Jtc0NvbW1vbiggbV91bmlmb3JtcywgbWF0ZXJpYWwgKTtcblx0XHRcdFx0cmVmcmVzaFVuaWZvcm1zTm9ybWFsKCBtX3VuaWZvcm1zLCBtYXRlcmlhbCApO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC5pc0xpbmVCYXNpY01hdGVyaWFsICkge1xuXG5cdFx0XHRcdHJlZnJlc2hVbmlmb3Jtc0xpbmUoIG1fdW5pZm9ybXMsIG1hdGVyaWFsICk7XG5cblx0XHRcdFx0aWYgKCBtYXRlcmlhbC5pc0xpbmVEYXNoZWRNYXRlcmlhbCApIHtcblxuXHRcdFx0XHRcdHJlZnJlc2hVbmlmb3Jtc0Rhc2goIG1fdW5pZm9ybXMsIG1hdGVyaWFsICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC5pc1BvaW50c01hdGVyaWFsICkge1xuXG5cdFx0XHRcdHJlZnJlc2hVbmlmb3Jtc1BvaW50cyggbV91bmlmb3JtcywgbWF0ZXJpYWwgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuaXNTaGFkb3dNYXRlcmlhbCApIHtcblxuXHRcdFx0XHRtX3VuaWZvcm1zLmNvbG9yLnZhbHVlID0gbWF0ZXJpYWwuY29sb3I7XG5cdFx0XHRcdG1fdW5pZm9ybXMub3BhY2l0eS52YWx1ZSA9IG1hdGVyaWFsLm9wYWNpdHk7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gUmVjdEFyZWFMaWdodCBUZXh0dXJlXG5cdFx0XHQvLyBUT0RPIChtcmRvb2IpOiBGaW5kIGEgbmljZXIgaW1wbGVtZW50YXRpb25cblxuXHRcdFx0aWYgKCBtX3VuaWZvcm1zLmx0Y18xICE9PSB1bmRlZmluZWQgKSBtX3VuaWZvcm1zLmx0Y18xLnZhbHVlID0gVW5pZm9ybXNMaWIuTFRDXzE7XG5cdFx0XHRpZiAoIG1fdW5pZm9ybXMubHRjXzIgIT09IHVuZGVmaW5lZCApIG1fdW5pZm9ybXMubHRjXzIudmFsdWUgPSBVbmlmb3Jtc0xpYi5MVENfMjtcblxuXHRcdFx0V2ViR0xVbmlmb3Jtcy51cGxvYWQoIF9nbCwgbWF0ZXJpYWxQcm9wZXJ0aWVzLnVuaWZvcm1zTGlzdCwgbV91bmlmb3JtcywgX3RoaXMgKTtcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwuaXNTaGFkZXJNYXRlcmlhbCAmJiBtYXRlcmlhbC51bmlmb3Jtc05lZWRVcGRhdGUgPT09IHRydWUgKSB7XG5cblx0XHRcdFdlYkdMVW5pZm9ybXMudXBsb2FkKCBfZ2wsIG1hdGVyaWFsUHJvcGVydGllcy51bmlmb3Jtc0xpc3QsIG1fdW5pZm9ybXMsIF90aGlzICk7XG5cdFx0XHRtYXRlcmlhbC51bmlmb3Jtc05lZWRVcGRhdGUgPSBmYWxzZTtcblxuXHRcdH1cblxuXHRcdC8vIGNvbW1vbiBtYXRyaWNlc1xuXG5cdFx0cF91bmlmb3Jtcy5zZXRWYWx1ZSggX2dsLCAnbW9kZWxWaWV3TWF0cml4Jywgb2JqZWN0Lm1vZGVsVmlld01hdHJpeCApO1xuXHRcdHBfdW5pZm9ybXMuc2V0VmFsdWUoIF9nbCwgJ25vcm1hbE1hdHJpeCcsIG9iamVjdC5ub3JtYWxNYXRyaXggKTtcblx0XHRwX3VuaWZvcm1zLnNldFZhbHVlKCBfZ2wsICdtb2RlbE1hdHJpeCcsIG9iamVjdC5tYXRyaXhXb3JsZCApO1xuXG5cdFx0cmV0dXJuIHByb2dyYW07XG5cblx0fVxuXG5cdC8vIFVuaWZvcm1zIChyZWZyZXNoIHVuaWZvcm1zIG9iamVjdHMpXG5cblx0ZnVuY3Rpb24gcmVmcmVzaFVuaWZvcm1zQ29tbW9uKCB1bmlmb3JtcywgbWF0ZXJpYWwgKSB7XG5cblx0XHR1bmlmb3Jtcy5vcGFjaXR5LnZhbHVlID0gbWF0ZXJpYWwub3BhY2l0eTtcblxuXHRcdGlmICggbWF0ZXJpYWwuY29sb3IgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmRpZmZ1c2UudmFsdWUgPSBtYXRlcmlhbC5jb2xvcjtcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwuZW1pc3NpdmUgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmVtaXNzaXZlLnZhbHVlLmNvcHkoIG1hdGVyaWFsLmVtaXNzaXZlICkubXVsdGlwbHlTY2FsYXIoIG1hdGVyaWFsLmVtaXNzaXZlSW50ZW5zaXR5ICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLm1hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMubWFwLnZhbHVlID0gbWF0ZXJpYWwubWFwO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5hbHBoYU1hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMuYWxwaGFNYXAudmFsdWUgPSBtYXRlcmlhbC5hbHBoYU1hcDtcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwuc3BlY3VsYXJNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLnNwZWN1bGFyTWFwLnZhbHVlID0gbWF0ZXJpYWwuc3BlY3VsYXJNYXA7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLmVudk1hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMuZW52TWFwLnZhbHVlID0gbWF0ZXJpYWwuZW52TWFwO1xuXG5cdFx0XHQvLyBkb24ndCBmbGlwIEN1YmVUZXh0dXJlIGVudk1hcHMsIGZsaXAgZXZlcnl0aGluZyBlbHNlOlxuXHRcdFx0Ly8gIFdlYkdMUmVuZGVyVGFyZ2V0Q3ViZSB3aWxsIGJlIGZsaXBwZWQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG5cdFx0XHQvLyAgV2ViR0xSZW5kZXJUYXJnZXRDdWJlLnRleHR1cmUgd2lsbCBiZSBmbGlwcGVkIGJlY2F1c2UgaXQncyBhIFRleHR1cmUgYW5kIE5PVCBhIEN1YmVUZXh0dXJlXG5cdFx0XHQvLyB0aGlzIGNoZWNrIG11c3QgYmUgaGFuZGxlZCBkaWZmZXJlbnRseSwgb3IgcmVtb3ZlZCBlbnRpcmVseSwgaWYgV2ViR0xSZW5kZXJUYXJnZXRDdWJlIHVzZXMgYSBDdWJlVGV4dHVyZSBpbiB0aGUgZnV0dXJlXG5cdFx0XHR1bmlmb3Jtcy5mbGlwRW52TWFwLnZhbHVlID0gKCAhICggbWF0ZXJpYWwuZW52TWFwICYmIG1hdGVyaWFsLmVudk1hcC5pc0N1YmVUZXh0dXJlICkgKSA/IDEgOiAtIDE7XG5cblx0XHRcdHVuaWZvcm1zLnJlZmxlY3Rpdml0eS52YWx1ZSA9IG1hdGVyaWFsLnJlZmxlY3Rpdml0eTtcblx0XHRcdHVuaWZvcm1zLnJlZnJhY3Rpb25SYXRpby52YWx1ZSA9IG1hdGVyaWFsLnJlZnJhY3Rpb25SYXRpbztcblxuXHRcdFx0dW5pZm9ybXMubWF4TWlwTGV2ZWwudmFsdWUgPSBwcm9wZXJ0aWVzLmdldCggbWF0ZXJpYWwuZW52TWFwICkuX19tYXhNaXBMZXZlbDtcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwubGlnaHRNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmxpZ2h0TWFwLnZhbHVlID0gbWF0ZXJpYWwubGlnaHRNYXA7XG5cdFx0XHR1bmlmb3Jtcy5saWdodE1hcEludGVuc2l0eS52YWx1ZSA9IG1hdGVyaWFsLmxpZ2h0TWFwSW50ZW5zaXR5O1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5hb01hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMuYW9NYXAudmFsdWUgPSBtYXRlcmlhbC5hb01hcDtcblx0XHRcdHVuaWZvcm1zLmFvTWFwSW50ZW5zaXR5LnZhbHVlID0gbWF0ZXJpYWwuYW9NYXBJbnRlbnNpdHk7XG5cblx0XHR9XG5cblx0XHQvLyB1diByZXBlYXQgYW5kIG9mZnNldCBzZXR0aW5nIHByaW9yaXRpZXNcblx0XHQvLyAxLiBjb2xvciBtYXBcblx0XHQvLyAyLiBzcGVjdWxhciBtYXBcblx0XHQvLyAzLiBub3JtYWwgbWFwXG5cdFx0Ly8gNC4gYnVtcCBtYXBcblx0XHQvLyA1LiBhbHBoYSBtYXBcblx0XHQvLyA2LiBlbWlzc2l2ZSBtYXBcblxuXHRcdHZhciB1dlNjYWxlTWFwO1xuXG5cdFx0aWYgKCBtYXRlcmlhbC5tYXAgKSB7XG5cblx0XHRcdHV2U2NhbGVNYXAgPSBtYXRlcmlhbC5tYXA7XG5cblx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC5zcGVjdWxhck1hcCApIHtcblxuXHRcdFx0dXZTY2FsZU1hcCA9IG1hdGVyaWFsLnNwZWN1bGFyTWFwO1xuXG5cdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwICkge1xuXG5cdFx0XHR1dlNjYWxlTWFwID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwO1xuXG5cdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwubm9ybWFsTWFwICkge1xuXG5cdFx0XHR1dlNjYWxlTWFwID0gbWF0ZXJpYWwubm9ybWFsTWFwO1xuXG5cdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuYnVtcE1hcCApIHtcblxuXHRcdFx0dXZTY2FsZU1hcCA9IG1hdGVyaWFsLmJ1bXBNYXA7XG5cblx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC5yb3VnaG5lc3NNYXAgKSB7XG5cblx0XHRcdHV2U2NhbGVNYXAgPSBtYXRlcmlhbC5yb3VnaG5lc3NNYXA7XG5cblx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC5tZXRhbG5lc3NNYXAgKSB7XG5cblx0XHRcdHV2U2NhbGVNYXAgPSBtYXRlcmlhbC5tZXRhbG5lc3NNYXA7XG5cblx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC5hbHBoYU1hcCApIHtcblxuXHRcdFx0dXZTY2FsZU1hcCA9IG1hdGVyaWFsLmFscGhhTWFwO1xuXG5cdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuZW1pc3NpdmVNYXAgKSB7XG5cblx0XHRcdHV2U2NhbGVNYXAgPSBtYXRlcmlhbC5lbWlzc2l2ZU1hcDtcblxuXHRcdH1cblxuXHRcdGlmICggdXZTY2FsZU1hcCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHQvLyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuXHRcdFx0aWYgKCB1dlNjYWxlTWFwLmlzV2ViR0xSZW5kZXJUYXJnZXQgKSB7XG5cblx0XHRcdFx0dXZTY2FsZU1hcCA9IHV2U2NhbGVNYXAudGV4dHVyZTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHV2U2NhbGVNYXAubWF0cml4QXV0b1VwZGF0ZSA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0XHR1dlNjYWxlTWFwLnVwZGF0ZU1hdHJpeCgpO1xuXG5cdFx0XHR9XG5cblx0XHRcdHVuaWZvcm1zLnV2VHJhbnNmb3JtLnZhbHVlLmNvcHkoIHV2U2NhbGVNYXAubWF0cml4ICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc0xpbmUoIHVuaWZvcm1zLCBtYXRlcmlhbCApIHtcblxuXHRcdHVuaWZvcm1zLmRpZmZ1c2UudmFsdWUgPSBtYXRlcmlhbC5jb2xvcjtcblx0XHR1bmlmb3Jtcy5vcGFjaXR5LnZhbHVlID0gbWF0ZXJpYWwub3BhY2l0eTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVmcmVzaFVuaWZvcm1zRGFzaCggdW5pZm9ybXMsIG1hdGVyaWFsICkge1xuXG5cdFx0dW5pZm9ybXMuZGFzaFNpemUudmFsdWUgPSBtYXRlcmlhbC5kYXNoU2l6ZTtcblx0XHR1bmlmb3Jtcy50b3RhbFNpemUudmFsdWUgPSBtYXRlcmlhbC5kYXNoU2l6ZSArIG1hdGVyaWFsLmdhcFNpemU7XG5cdFx0dW5pZm9ybXMuc2NhbGUudmFsdWUgPSBtYXRlcmlhbC5zY2FsZTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVmcmVzaFVuaWZvcm1zUG9pbnRzKCB1bmlmb3JtcywgbWF0ZXJpYWwgKSB7XG5cblx0XHR1bmlmb3Jtcy5kaWZmdXNlLnZhbHVlID0gbWF0ZXJpYWwuY29sb3I7XG5cdFx0dW5pZm9ybXMub3BhY2l0eS52YWx1ZSA9IG1hdGVyaWFsLm9wYWNpdHk7XG5cdFx0dW5pZm9ybXMuc2l6ZS52YWx1ZSA9IG1hdGVyaWFsLnNpemUgKiBfcGl4ZWxSYXRpbztcblx0XHR1bmlmb3Jtcy5zY2FsZS52YWx1ZSA9IF9oZWlnaHQgKiAwLjU7XG5cblx0XHR1bmlmb3Jtcy5tYXAudmFsdWUgPSBtYXRlcmlhbC5tYXA7XG5cblx0XHRpZiAoIG1hdGVyaWFsLm1hcCAhPT0gbnVsbCApIHtcblxuXHRcdFx0aWYgKCBtYXRlcmlhbC5tYXAubWF0cml4QXV0b1VwZGF0ZSA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0XHRtYXRlcmlhbC5tYXAudXBkYXRlTWF0cml4KCk7XG5cblx0XHRcdH1cblxuXHRcdFx0dW5pZm9ybXMudXZUcmFuc2Zvcm0udmFsdWUuY29weSggbWF0ZXJpYWwubWFwLm1hdHJpeCApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiByZWZyZXNoVW5pZm9ybXNGb2coIHVuaWZvcm1zLCBmb2cgKSB7XG5cblx0XHR1bmlmb3Jtcy5mb2dDb2xvci52YWx1ZSA9IGZvZy5jb2xvcjtcblxuXHRcdGlmICggZm9nLmlzRm9nICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5mb2dOZWFyLnZhbHVlID0gZm9nLm5lYXI7XG5cdFx0XHR1bmlmb3Jtcy5mb2dGYXIudmFsdWUgPSBmb2cuZmFyO1xuXG5cdFx0fSBlbHNlIGlmICggZm9nLmlzRm9nRXhwMiApIHtcblxuXHRcdFx0dW5pZm9ybXMuZm9nRGVuc2l0eS52YWx1ZSA9IGZvZy5kZW5zaXR5O1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiByZWZyZXNoVW5pZm9ybXNMYW1iZXJ0KCB1bmlmb3JtcywgbWF0ZXJpYWwgKSB7XG5cblx0XHRpZiAoIG1hdGVyaWFsLmVtaXNzaXZlTWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5lbWlzc2l2ZU1hcC52YWx1ZSA9IG1hdGVyaWFsLmVtaXNzaXZlTWFwO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiByZWZyZXNoVW5pZm9ybXNQaG9uZyggdW5pZm9ybXMsIG1hdGVyaWFsICkge1xuXG5cdFx0dW5pZm9ybXMuc3BlY3VsYXIudmFsdWUgPSBtYXRlcmlhbC5zcGVjdWxhcjtcblx0XHR1bmlmb3Jtcy5zaGluaW5lc3MudmFsdWUgPSBNYXRoLm1heCggbWF0ZXJpYWwuc2hpbmluZXNzLCAxZS00ICk7IC8vIHRvIHByZXZlbnQgcG93KCAwLjAsIDAuMCApXG5cblx0XHRpZiAoIG1hdGVyaWFsLmVtaXNzaXZlTWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5lbWlzc2l2ZU1hcC52YWx1ZSA9IG1hdGVyaWFsLmVtaXNzaXZlTWFwO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5idW1wTWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5idW1wTWFwLnZhbHVlID0gbWF0ZXJpYWwuYnVtcE1hcDtcblx0XHRcdHVuaWZvcm1zLmJ1bXBTY2FsZS52YWx1ZSA9IG1hdGVyaWFsLmJ1bXBTY2FsZTtcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwubm9ybWFsTWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5ub3JtYWxNYXAudmFsdWUgPSBtYXRlcmlhbC5ub3JtYWxNYXA7XG5cdFx0XHR1bmlmb3Jtcy5ub3JtYWxTY2FsZS52YWx1ZS5jb3B5KCBtYXRlcmlhbC5ub3JtYWxTY2FsZSApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5kaXNwbGFjZW1lbnRNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmRpc3BsYWNlbWVudE1hcC52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcDtcblx0XHRcdHVuaWZvcm1zLmRpc3BsYWNlbWVudFNjYWxlLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50U2NhbGU7XG5cdFx0XHR1bmlmb3Jtcy5kaXNwbGFjZW1lbnRCaWFzLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50QmlhcztcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVmcmVzaFVuaWZvcm1zVG9vbiggdW5pZm9ybXMsIG1hdGVyaWFsICkge1xuXG5cdFx0cmVmcmVzaFVuaWZvcm1zUGhvbmcoIHVuaWZvcm1zLCBtYXRlcmlhbCApO1xuXG5cdFx0aWYgKCBtYXRlcmlhbC5ncmFkaWVudE1hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMuZ3JhZGllbnRNYXAudmFsdWUgPSBtYXRlcmlhbC5ncmFkaWVudE1hcDtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVmcmVzaFVuaWZvcm1zU3RhbmRhcmQoIHVuaWZvcm1zLCBtYXRlcmlhbCApIHtcblxuXHRcdHVuaWZvcm1zLnJvdWdobmVzcy52YWx1ZSA9IG1hdGVyaWFsLnJvdWdobmVzcztcblx0XHR1bmlmb3Jtcy5tZXRhbG5lc3MudmFsdWUgPSBtYXRlcmlhbC5tZXRhbG5lc3M7XG5cblx0XHRpZiAoIG1hdGVyaWFsLnJvdWdobmVzc01hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMucm91Z2huZXNzTWFwLnZhbHVlID0gbWF0ZXJpYWwucm91Z2huZXNzTWFwO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5tZXRhbG5lc3NNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLm1ldGFsbmVzc01hcC52YWx1ZSA9IG1hdGVyaWFsLm1ldGFsbmVzc01hcDtcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwuZW1pc3NpdmVNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmVtaXNzaXZlTWFwLnZhbHVlID0gbWF0ZXJpYWwuZW1pc3NpdmVNYXA7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLmJ1bXBNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmJ1bXBNYXAudmFsdWUgPSBtYXRlcmlhbC5idW1wTWFwO1xuXHRcdFx0dW5pZm9ybXMuYnVtcFNjYWxlLnZhbHVlID0gbWF0ZXJpYWwuYnVtcFNjYWxlO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5ub3JtYWxNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLm5vcm1hbE1hcC52YWx1ZSA9IG1hdGVyaWFsLm5vcm1hbE1hcDtcblx0XHRcdHVuaWZvcm1zLm5vcm1hbFNjYWxlLnZhbHVlLmNvcHkoIG1hdGVyaWFsLm5vcm1hbFNjYWxlICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMuZGlzcGxhY2VtZW50TWFwLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwO1xuXHRcdFx0dW5pZm9ybXMuZGlzcGxhY2VtZW50U2NhbGUudmFsdWUgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRTY2FsZTtcblx0XHRcdHVuaWZvcm1zLmRpc3BsYWNlbWVudEJpYXMudmFsdWUgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRCaWFzO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5lbnZNYXAgKSB7XG5cblx0XHRcdC8vdW5pZm9ybXMuZW52TWFwLnZhbHVlID0gbWF0ZXJpYWwuZW52TWFwOyAvLyBwYXJ0IG9mIHVuaWZvcm1zIGNvbW1vblxuXHRcdFx0dW5pZm9ybXMuZW52TWFwSW50ZW5zaXR5LnZhbHVlID0gbWF0ZXJpYWwuZW52TWFwSW50ZW5zaXR5O1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiByZWZyZXNoVW5pZm9ybXNQaHlzaWNhbCggdW5pZm9ybXMsIG1hdGVyaWFsICkge1xuXG5cdFx0dW5pZm9ybXMuY2xlYXJDb2F0LnZhbHVlID0gbWF0ZXJpYWwuY2xlYXJDb2F0O1xuXHRcdHVuaWZvcm1zLmNsZWFyQ29hdFJvdWdobmVzcy52YWx1ZSA9IG1hdGVyaWFsLmNsZWFyQ29hdFJvdWdobmVzcztcblxuXHRcdHJlZnJlc2hVbmlmb3Jtc1N0YW5kYXJkKCB1bmlmb3JtcywgbWF0ZXJpYWwgKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVmcmVzaFVuaWZvcm1zRGVwdGgoIHVuaWZvcm1zLCBtYXRlcmlhbCApIHtcblxuXHRcdGlmICggbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5kaXNwbGFjZW1lbnRNYXAudmFsdWUgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRNYXA7XG5cdFx0XHR1bmlmb3Jtcy5kaXNwbGFjZW1lbnRTY2FsZS52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudFNjYWxlO1xuXHRcdFx0dW5pZm9ybXMuZGlzcGxhY2VtZW50Qmlhcy52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudEJpYXM7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc0Rpc3RhbmNlKCB1bmlmb3JtcywgbWF0ZXJpYWwgKSB7XG5cblx0XHRpZiAoIG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMuZGlzcGxhY2VtZW50TWFwLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwO1xuXHRcdFx0dW5pZm9ybXMuZGlzcGxhY2VtZW50U2NhbGUudmFsdWUgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRTY2FsZTtcblx0XHRcdHVuaWZvcm1zLmRpc3BsYWNlbWVudEJpYXMudmFsdWUgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRCaWFzO1xuXG5cdFx0fVxuXG5cdFx0dW5pZm9ybXMucmVmZXJlbmNlUG9zaXRpb24udmFsdWUuY29weSggbWF0ZXJpYWwucmVmZXJlbmNlUG9zaXRpb24gKTtcblx0XHR1bmlmb3Jtcy5uZWFyRGlzdGFuY2UudmFsdWUgPSBtYXRlcmlhbC5uZWFyRGlzdGFuY2U7XG5cdFx0dW5pZm9ybXMuZmFyRGlzdGFuY2UudmFsdWUgPSBtYXRlcmlhbC5mYXJEaXN0YW5jZTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVmcmVzaFVuaWZvcm1zTm9ybWFsKCB1bmlmb3JtcywgbWF0ZXJpYWwgKSB7XG5cblx0XHRpZiAoIG1hdGVyaWFsLmJ1bXBNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmJ1bXBNYXAudmFsdWUgPSBtYXRlcmlhbC5idW1wTWFwO1xuXHRcdFx0dW5pZm9ybXMuYnVtcFNjYWxlLnZhbHVlID0gbWF0ZXJpYWwuYnVtcFNjYWxlO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5ub3JtYWxNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLm5vcm1hbE1hcC52YWx1ZSA9IG1hdGVyaWFsLm5vcm1hbE1hcDtcblx0XHRcdHVuaWZvcm1zLm5vcm1hbFNjYWxlLnZhbHVlLmNvcHkoIG1hdGVyaWFsLm5vcm1hbFNjYWxlICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMuZGlzcGxhY2VtZW50TWFwLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwO1xuXHRcdFx0dW5pZm9ybXMuZGlzcGxhY2VtZW50U2NhbGUudmFsdWUgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRTY2FsZTtcblx0XHRcdHVuaWZvcm1zLmRpc3BsYWNlbWVudEJpYXMudmFsdWUgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRCaWFzO1xuXG5cdFx0fVxuXG5cdH1cblxuXHQvLyBJZiB1bmlmb3JtcyBhcmUgbWFya2VkIGFzIGNsZWFuLCB0aGV5IGRvbid0IG5lZWQgdG8gYmUgbG9hZGVkIHRvIHRoZSBHUFUuXG5cblx0ZnVuY3Rpb24gbWFya1VuaWZvcm1zTGlnaHRzTmVlZHNVcGRhdGUoIHVuaWZvcm1zLCB2YWx1ZSApIHtcblxuXHRcdHVuaWZvcm1zLmFtYmllbnRMaWdodENvbG9yLm5lZWRzVXBkYXRlID0gdmFsdWU7XG5cblx0XHR1bmlmb3Jtcy5kaXJlY3Rpb25hbExpZ2h0cy5uZWVkc1VwZGF0ZSA9IHZhbHVlO1xuXHRcdHVuaWZvcm1zLnBvaW50TGlnaHRzLm5lZWRzVXBkYXRlID0gdmFsdWU7XG5cdFx0dW5pZm9ybXMuc3BvdExpZ2h0cy5uZWVkc1VwZGF0ZSA9IHZhbHVlO1xuXHRcdHVuaWZvcm1zLnJlY3RBcmVhTGlnaHRzLm5lZWRzVXBkYXRlID0gdmFsdWU7XG5cdFx0dW5pZm9ybXMuaGVtaXNwaGVyZUxpZ2h0cy5uZWVkc1VwZGF0ZSA9IHZhbHVlO1xuXG5cdH1cblxuXHQvLyBUZXh0dXJlc1xuXG5cdGZ1bmN0aW9uIGFsbG9jVGV4dHVyZVVuaXQoKSB7XG5cblx0XHR2YXIgdGV4dHVyZVVuaXQgPSBfdXNlZFRleHR1cmVVbml0cztcblxuXHRcdGlmICggdGV4dHVyZVVuaXQgPj0gY2FwYWJpbGl0aWVzLm1heFRleHR1cmVzICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBUcnlpbmcgdG8gdXNlICcgKyB0ZXh0dXJlVW5pdCArICcgdGV4dHVyZSB1bml0cyB3aGlsZSB0aGlzIEdQVSBzdXBwb3J0cyBvbmx5ICcgKyBjYXBhYmlsaXRpZXMubWF4VGV4dHVyZXMgKTtcblxuXHRcdH1cblxuXHRcdF91c2VkVGV4dHVyZVVuaXRzICs9IDE7XG5cblx0XHRyZXR1cm4gdGV4dHVyZVVuaXQ7XG5cblx0fVxuXG5cdHRoaXMuYWxsb2NUZXh0dXJlVW5pdCA9IGFsbG9jVGV4dHVyZVVuaXQ7XG5cblx0Ly8gdGhpcy5zZXRUZXh0dXJlMkQgPSBzZXRUZXh0dXJlMkQ7XG5cdHRoaXMuc2V0VGV4dHVyZTJEID0gKCBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgd2FybmVkID0gZmFsc2U7XG5cblx0XHQvLyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eTogcGVlbCB0ZXh0dXJlLnRleHR1cmVcblx0XHRyZXR1cm4gZnVuY3Rpb24gc2V0VGV4dHVyZTJEKCB0ZXh0dXJlLCBzbG90ICkge1xuXG5cdFx0XHRpZiAoIHRleHR1cmUgJiYgdGV4dHVyZS5pc1dlYkdMUmVuZGVyVGFyZ2V0ICkge1xuXG5cdFx0XHRcdGlmICggISB3YXJuZWQgKSB7XG5cblx0XHRcdFx0XHRjb25zb2xlLndhcm4oIFwiVEhSRUUuV2ViR0xSZW5kZXJlci5zZXRUZXh0dXJlMkQ6IGRvbid0IHVzZSByZW5kZXIgdGFyZ2V0cyBhcyB0ZXh0dXJlcy4gVXNlIHRoZWlyIC50ZXh0dXJlIHByb3BlcnR5IGluc3RlYWQuXCIgKTtcblx0XHRcdFx0XHR3YXJuZWQgPSB0cnVlO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0ZXh0dXJlID0gdGV4dHVyZS50ZXh0dXJlO1xuXG5cdFx0XHR9XG5cblx0XHRcdHRleHR1cmVzLnNldFRleHR1cmUyRCggdGV4dHVyZSwgc2xvdCApO1xuXG5cdFx0fTtcblxuXHR9KCkgKTtcblxuXHR0aGlzLnNldFRleHR1cmUgPSAoIGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB3YXJuZWQgPSBmYWxzZTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBzZXRUZXh0dXJlKCB0ZXh0dXJlLCBzbG90ICkge1xuXG5cdFx0XHRpZiAoICEgd2FybmVkICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggXCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2V0VGV4dHVyZSBpcyBkZXByZWNhdGVkLCB1c2Ugc2V0VGV4dHVyZTJEIGluc3RlYWQuXCIgKTtcblx0XHRcdFx0d2FybmVkID0gdHJ1ZTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0ZXh0dXJlcy5zZXRUZXh0dXJlMkQoIHRleHR1cmUsIHNsb3QgKTtcblxuXHRcdH07XG5cblx0fSgpICk7XG5cblx0dGhpcy5zZXRUZXh0dXJlQ3ViZSA9ICggZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHdhcm5lZCA9IGZhbHNlO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHNldFRleHR1cmVDdWJlKCB0ZXh0dXJlLCBzbG90ICkge1xuXG5cdFx0XHQvLyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eTogcGVlbCB0ZXh0dXJlLnRleHR1cmVcblx0XHRcdGlmICggdGV4dHVyZSAmJiB0ZXh0dXJlLmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlICkge1xuXG5cdFx0XHRcdGlmICggISB3YXJuZWQgKSB7XG5cblx0XHRcdFx0XHRjb25zb2xlLndhcm4oIFwiVEhSRUUuV2ViR0xSZW5kZXJlci5zZXRUZXh0dXJlQ3ViZTogZG9uJ3QgdXNlIGN1YmUgcmVuZGVyIHRhcmdldHMgYXMgdGV4dHVyZXMuIFVzZSB0aGVpciAudGV4dHVyZSBwcm9wZXJ0eSBpbnN0ZWFkLlwiICk7XG5cdFx0XHRcdFx0d2FybmVkID0gdHJ1ZTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGV4dHVyZSA9IHRleHR1cmUudGV4dHVyZTtcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBjdXJyZW50bHkgcmVseWluZyBvbiB0aGUgZmFjdCB0aGF0IFdlYkdMUmVuZGVyVGFyZ2V0Q3ViZS50ZXh0dXJlIGlzIGEgVGV4dHVyZSBhbmQgTk9UIGEgQ3ViZVRleHR1cmVcblx0XHRcdC8vIFRPRE86IHVuaWZ5IHRoZXNlIGNvZGUgcGF0aHNcblx0XHRcdGlmICggKCB0ZXh0dXJlICYmIHRleHR1cmUuaXNDdWJlVGV4dHVyZSApIHx8XG5cdFx0XHRcdCggQXJyYXkuaXNBcnJheSggdGV4dHVyZS5pbWFnZSApICYmIHRleHR1cmUuaW1hZ2UubGVuZ3RoID09PSA2ICkgKSB7XG5cblx0XHRcdFx0Ly8gQ29tcHJlc3NlZFRleHR1cmUgY2FuIGhhdmUgQXJyYXkgaW4gaW1hZ2UgOi9cblxuXHRcdFx0XHQvLyB0aGlzIGZ1bmN0aW9uIGFsb25lIHNob3VsZCB0YWtlIGNhcmUgb2YgY3ViZSB0ZXh0dXJlc1xuXHRcdFx0XHR0ZXh0dXJlcy5zZXRUZXh0dXJlQ3ViZSggdGV4dHVyZSwgc2xvdCApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdC8vIGFzc3VtZWQ6IHRleHR1cmUgcHJvcGVydHkgb2YgVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXRDdWJlXG5cblx0XHRcdFx0dGV4dHVyZXMuc2V0VGV4dHVyZUN1YmVEeW5hbWljKCB0ZXh0dXJlLCBzbG90ICk7XG5cblx0XHRcdH1cblxuXHRcdH07XG5cblx0fSgpICk7XG5cblx0dGhpcy5nZXRSZW5kZXJUYXJnZXQgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gX2N1cnJlbnRSZW5kZXJUYXJnZXQ7XG5cblx0fTtcblxuXHR0aGlzLnNldFJlbmRlclRhcmdldCA9IGZ1bmN0aW9uICggcmVuZGVyVGFyZ2V0ICkge1xuXG5cdFx0X2N1cnJlbnRSZW5kZXJUYXJnZXQgPSByZW5kZXJUYXJnZXQ7XG5cblx0XHRpZiAoIHJlbmRlclRhcmdldCAmJiBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0ICkuX193ZWJnbEZyYW1lYnVmZmVyID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHRleHR1cmVzLnNldHVwUmVuZGVyVGFyZ2V0KCByZW5kZXJUYXJnZXQgKTtcblxuXHRcdH1cblxuXHRcdHZhciBmcmFtZWJ1ZmZlciA9IG51bGw7XG5cdFx0dmFyIGlzQ3ViZSA9IGZhbHNlO1xuXG5cdFx0aWYgKCByZW5kZXJUYXJnZXQgKSB7XG5cblx0XHRcdHZhciBfX3dlYmdsRnJhbWVidWZmZXIgPSBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0ICkuX193ZWJnbEZyYW1lYnVmZmVyO1xuXG5cdFx0XHRpZiAoIHJlbmRlclRhcmdldC5pc1dlYkdMUmVuZGVyVGFyZ2V0Q3ViZSApIHtcblxuXHRcdFx0XHRmcmFtZWJ1ZmZlciA9IF9fd2ViZ2xGcmFtZWJ1ZmZlclsgcmVuZGVyVGFyZ2V0LmFjdGl2ZUN1YmVGYWNlIF07XG5cdFx0XHRcdGlzQ3ViZSA9IHRydWU7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0ZnJhbWVidWZmZXIgPSBfX3dlYmdsRnJhbWVidWZmZXI7XG5cblx0XHRcdH1cblxuXHRcdFx0X2N1cnJlbnRWaWV3cG9ydC5jb3B5KCByZW5kZXJUYXJnZXQudmlld3BvcnQgKTtcblx0XHRcdF9jdXJyZW50U2Npc3Nvci5jb3B5KCByZW5kZXJUYXJnZXQuc2Npc3NvciApO1xuXHRcdFx0X2N1cnJlbnRTY2lzc29yVGVzdCA9IHJlbmRlclRhcmdldC5zY2lzc29yVGVzdDtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdF9jdXJyZW50Vmlld3BvcnQuY29weSggX3ZpZXdwb3J0ICkubXVsdGlwbHlTY2FsYXIoIF9waXhlbFJhdGlvICk7XG5cdFx0XHRfY3VycmVudFNjaXNzb3IuY29weSggX3NjaXNzb3IgKS5tdWx0aXBseVNjYWxhciggX3BpeGVsUmF0aW8gKTtcblx0XHRcdF9jdXJyZW50U2Npc3NvclRlc3QgPSBfc2Npc3NvclRlc3Q7XG5cblx0XHR9XG5cblx0XHRpZiAoIF9jdXJyZW50RnJhbWVidWZmZXIgIT09IGZyYW1lYnVmZmVyICkge1xuXG5cdFx0XHRfZ2wuYmluZEZyYW1lYnVmZmVyKCBfZ2wuRlJBTUVCVUZGRVIsIGZyYW1lYnVmZmVyICk7XG5cdFx0XHRfY3VycmVudEZyYW1lYnVmZmVyID0gZnJhbWVidWZmZXI7XG5cblx0XHR9XG5cblx0XHRzdGF0ZS52aWV3cG9ydCggX2N1cnJlbnRWaWV3cG9ydCApO1xuXHRcdHN0YXRlLnNjaXNzb3IoIF9jdXJyZW50U2Npc3NvciApO1xuXHRcdHN0YXRlLnNldFNjaXNzb3JUZXN0KCBfY3VycmVudFNjaXNzb3JUZXN0ICk7XG5cblx0XHRpZiAoIGlzQ3ViZSApIHtcblxuXHRcdFx0dmFyIHRleHR1cmVQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIHJlbmRlclRhcmdldC50ZXh0dXJlICk7XG5cdFx0XHRfZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoIF9nbC5GUkFNRUJVRkZFUiwgX2dsLkNPTE9SX0FUVEFDSE1FTlQwLCBfZ2wuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YICsgcmVuZGVyVGFyZ2V0LmFjdGl2ZUN1YmVGYWNlLCB0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSwgcmVuZGVyVGFyZ2V0LmFjdGl2ZU1pcE1hcExldmVsICk7XG5cblx0XHR9XG5cblx0fTtcblxuXHR0aGlzLnJlYWRSZW5kZXJUYXJnZXRQaXhlbHMgPSBmdW5jdGlvbiAoIHJlbmRlclRhcmdldCwgeCwgeSwgd2lkdGgsIGhlaWdodCwgYnVmZmVyICkge1xuXG5cdFx0aWYgKCAhICggcmVuZGVyVGFyZ2V0ICYmIHJlbmRlclRhcmdldC5pc1dlYkdMUmVuZGVyVGFyZ2V0ICkgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFJlbmRlcmVyLnJlYWRSZW5kZXJUYXJnZXRQaXhlbHM6IHJlbmRlclRhcmdldCBpcyBub3QgVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQuJyApO1xuXHRcdFx0cmV0dXJuO1xuXG5cdFx0fVxuXG5cdFx0dmFyIGZyYW1lYnVmZmVyID0gcHJvcGVydGllcy5nZXQoIHJlbmRlclRhcmdldCApLl9fd2ViZ2xGcmFtZWJ1ZmZlcjtcblxuXHRcdGlmICggZnJhbWVidWZmZXIgKSB7XG5cblx0XHRcdHZhciByZXN0b3JlID0gZmFsc2U7XG5cblx0XHRcdGlmICggZnJhbWVidWZmZXIgIT09IF9jdXJyZW50RnJhbWVidWZmZXIgKSB7XG5cblx0XHRcdFx0X2dsLmJpbmRGcmFtZWJ1ZmZlciggX2dsLkZSQU1FQlVGRkVSLCBmcmFtZWJ1ZmZlciApO1xuXG5cdFx0XHRcdHJlc3RvcmUgPSB0cnVlO1xuXG5cdFx0XHR9XG5cblx0XHRcdHRyeSB7XG5cblx0XHRcdFx0dmFyIHRleHR1cmUgPSByZW5kZXJUYXJnZXQudGV4dHVyZTtcblx0XHRcdFx0dmFyIHRleHR1cmVGb3JtYXQgPSB0ZXh0dXJlLmZvcm1hdDtcblx0XHRcdFx0dmFyIHRleHR1cmVUeXBlID0gdGV4dHVyZS50eXBlO1xuXG5cdFx0XHRcdGlmICggdGV4dHVyZUZvcm1hdCAhPT0gUkdCQUZvcm1hdCAmJiB1dGlscy5jb252ZXJ0KCB0ZXh0dXJlRm9ybWF0ICkgIT09IF9nbC5nZXRQYXJhbWV0ZXIoIF9nbC5JTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX0ZPUk1BVCApICkge1xuXG5cdFx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdMUmVuZGVyZXIucmVhZFJlbmRlclRhcmdldFBpeGVsczogcmVuZGVyVGFyZ2V0IGlzIG5vdCBpbiBSR0JBIG9yIGltcGxlbWVudGF0aW9uIGRlZmluZWQgZm9ybWF0LicgKTtcblx0XHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggdGV4dHVyZVR5cGUgIT09IFVuc2lnbmVkQnl0ZVR5cGUgJiYgdXRpbHMuY29udmVydCggdGV4dHVyZVR5cGUgKSAhPT0gX2dsLmdldFBhcmFtZXRlciggX2dsLklNUExFTUVOVEFUSU9OX0NPTE9SX1JFQURfVFlQRSApICYmIC8vIElFMTEsIEVkZ2UgYW5kIENocm9tZSBNYWMgPCA1MiAoIzk1MTMpXG5cdFx0XHRcdFx0ISAoIHRleHR1cmVUeXBlID09PSBGbG9hdFR5cGUgJiYgKCBleHRlbnNpb25zLmdldCggJ09FU190ZXh0dXJlX2Zsb2F0JyApIHx8IGV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfY29sb3JfYnVmZmVyX2Zsb2F0JyApICkgKSAmJiAvLyBDaHJvbWUgTWFjID49IDUyIGFuZCBGaXJlZm94XG5cdFx0XHRcdFx0ISAoIHRleHR1cmVUeXBlID09PSBIYWxmRmxvYXRUeXBlICYmIGV4dGVuc2lvbnMuZ2V0KCAnRVhUX2NvbG9yX2J1ZmZlcl9oYWxmX2Zsb2F0JyApICkgKSB7XG5cblx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuV2ViR0xSZW5kZXJlci5yZWFkUmVuZGVyVGFyZ2V0UGl4ZWxzOiByZW5kZXJUYXJnZXQgaXMgbm90IGluIFVuc2lnbmVkQnl0ZVR5cGUgb3IgaW1wbGVtZW50YXRpb24gZGVmaW5lZCB0eXBlLicgKTtcblx0XHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggX2dsLmNoZWNrRnJhbWVidWZmZXJTdGF0dXMoIF9nbC5GUkFNRUJVRkZFUiApID09PSBfZ2wuRlJBTUVCVUZGRVJfQ09NUExFVEUgKSB7XG5cblx0XHRcdFx0XHQvLyB0aGUgZm9sbG93aW5nIGlmIHN0YXRlbWVudCBlbnN1cmVzIHZhbGlkIHJlYWQgcmVxdWVzdHMgKG5vIG91dC1vZi1ib3VuZHMgcGl4ZWxzLCBzZWUgIzg2MDQpXG5cblx0XHRcdFx0XHRpZiAoICggeCA+PSAwICYmIHggPD0gKCByZW5kZXJUYXJnZXQud2lkdGggLSB3aWR0aCApICkgJiYgKCB5ID49IDAgJiYgeSA8PSAoIHJlbmRlclRhcmdldC5oZWlnaHQgLSBoZWlnaHQgKSApICkge1xuXG5cdFx0XHRcdFx0XHRfZ2wucmVhZFBpeGVscyggeCwgeSwgd2lkdGgsIGhlaWdodCwgdXRpbHMuY29udmVydCggdGV4dHVyZUZvcm1hdCApLCB1dGlscy5jb252ZXJ0KCB0ZXh0dXJlVHlwZSApLCBidWZmZXIgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdMUmVuZGVyZXIucmVhZFJlbmRlclRhcmdldFBpeGVsczogcmVhZFBpeGVscyBmcm9tIHJlbmRlclRhcmdldCBmYWlsZWQuIEZyYW1lYnVmZmVyIG5vdCBjb21wbGV0ZS4nICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IGZpbmFsbHkge1xuXG5cdFx0XHRcdGlmICggcmVzdG9yZSApIHtcblxuXHRcdFx0XHRcdF9nbC5iaW5kRnJhbWVidWZmZXIoIF9nbC5GUkFNRUJVRkZFUiwgX2N1cnJlbnRGcmFtZWJ1ZmZlciApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH07XG5cblx0dGhpcy5jb3B5RnJhbWVidWZmZXJUb1RleHR1cmUgPSBmdW5jdGlvbiAoIHBvc2l0aW9uLCB0ZXh0dXJlLCBsZXZlbCApIHtcblxuXHRcdHZhciB3aWR0aCA9IHRleHR1cmUuaW1hZ2Uud2lkdGg7XG5cdFx0dmFyIGhlaWdodCA9IHRleHR1cmUuaW1hZ2UuaGVpZ2h0O1xuXHRcdHZhciBnbEZvcm1hdCA9IHV0aWxzLmNvbnZlcnQoIHRleHR1cmUuZm9ybWF0ICk7XG5cblx0XHR0aGlzLnNldFRleHR1cmUyRCggdGV4dHVyZSwgMCApO1xuXG5cdFx0X2dsLmNvcHlUZXhJbWFnZTJEKCBfZ2wuVEVYVFVSRV8yRCwgbGV2ZWwgfHwgMCwgZ2xGb3JtYXQsIHBvc2l0aW9uLngsIHBvc2l0aW9uLnksIHdpZHRoLCBoZWlnaHQsIDAgKTtcblxuXHR9O1xuXG5cdHRoaXMuY29weVRleHR1cmVUb1RleHR1cmUgPSBmdW5jdGlvbiAoIHBvc2l0aW9uLCBzcmNUZXh0dXJlLCBkc3RUZXh0dXJlLCBsZXZlbCApIHtcblxuXHRcdHZhciB3aWR0aCA9IHNyY1RleHR1cmUuaW1hZ2Uud2lkdGg7XG5cdFx0dmFyIGhlaWdodCA9IHNyY1RleHR1cmUuaW1hZ2UuaGVpZ2h0O1xuXHRcdHZhciBnbEZvcm1hdCA9IHV0aWxzLmNvbnZlcnQoIGRzdFRleHR1cmUuZm9ybWF0ICk7XG5cdFx0dmFyIGdsVHlwZSA9IHV0aWxzLmNvbnZlcnQoIGRzdFRleHR1cmUudHlwZSApO1xuXHRcdHZhciBwaXhlbHMgPSBzcmNUZXh0dXJlLmlzRGF0YVRleHR1cmUgPyBzcmNUZXh0dXJlLmltYWdlLmRhdGEgOiBzcmNUZXh0dXJlLmltYWdlO1xuXG5cdFx0dGhpcy5zZXRUZXh0dXJlMkQoIGRzdFRleHR1cmUsIDAgKTtcblxuXHRcdF9nbC50ZXhTdWJJbWFnZTJEKCBfZ2wuVEVYVFVSRV8yRCwgbGV2ZWwgfHwgMCwgcG9zaXRpb24ueCwgcG9zaXRpb24ueSwgd2lkdGgsIGhlaWdodCwgZ2xGb3JtYXQsIGdsVHlwZSwgcGl4ZWxzICk7XG5cblx0fTtcblxufVxuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICovXG5cbmZ1bmN0aW9uIEZvZ0V4cDIoIGNvbG9yLCBkZW5zaXR5ICkge1xuXG5cdHRoaXMubmFtZSA9ICcnO1xuXG5cdHRoaXMuY29sb3IgPSBuZXcgQ29sb3IoIGNvbG9yICk7XG5cdHRoaXMuZGVuc2l0eSA9ICggZGVuc2l0eSAhPT0gdW5kZWZpbmVkICkgPyBkZW5zaXR5IDogMC4wMDAyNTtcblxufVxuXG5Gb2dFeHAyLnByb3RvdHlwZS5pc0ZvZ0V4cDIgPSB0cnVlO1xuXG5Gb2dFeHAyLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uICgpIHtcblxuXHRyZXR1cm4gbmV3IEZvZ0V4cDIoIHRoaXMuY29sb3IuZ2V0SGV4KCksIHRoaXMuZGVuc2l0eSApO1xuXG59O1xuXG5Gb2dFeHAyLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoIC8qIG1ldGEgKi8gKSB7XG5cblx0cmV0dXJuIHtcblx0XHR0eXBlOiAnRm9nRXhwMicsXG5cdFx0Y29sb3I6IHRoaXMuY29sb3IuZ2V0SGV4KCksXG5cdFx0ZGVuc2l0eTogdGhpcy5kZW5zaXR5XG5cdH07XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKi9cblxuZnVuY3Rpb24gRm9nKCBjb2xvciwgbmVhciwgZmFyICkge1xuXG5cdHRoaXMubmFtZSA9ICcnO1xuXG5cdHRoaXMuY29sb3IgPSBuZXcgQ29sb3IoIGNvbG9yICk7XG5cblx0dGhpcy5uZWFyID0gKCBuZWFyICE9PSB1bmRlZmluZWQgKSA/IG5lYXIgOiAxO1xuXHR0aGlzLmZhciA9ICggZmFyICE9PSB1bmRlZmluZWQgKSA/IGZhciA6IDEwMDA7XG5cbn1cblxuRm9nLnByb3RvdHlwZS5pc0ZvZyA9IHRydWU7XG5cbkZvZy5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbiAoKSB7XG5cblx0cmV0dXJuIG5ldyBGb2coIHRoaXMuY29sb3IuZ2V0SGV4KCksIHRoaXMubmVhciwgdGhpcy5mYXIgKTtcblxufTtcblxuRm9nLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoIC8qIG1ldGEgKi8gKSB7XG5cblx0cmV0dXJuIHtcblx0XHR0eXBlOiAnRm9nJyxcblx0XHRjb2xvcjogdGhpcy5jb2xvci5nZXRIZXgoKSxcblx0XHRuZWFyOiB0aGlzLm5lYXIsXG5cdFx0ZmFyOiB0aGlzLmZhclxuXHR9O1xuXG59O1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gU2NlbmUoKSB7XG5cblx0T2JqZWN0M0QuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdTY2VuZSc7XG5cblx0dGhpcy5iYWNrZ3JvdW5kID0gbnVsbDtcblx0dGhpcy5mb2cgPSBudWxsO1xuXHR0aGlzLm92ZXJyaWRlTWF0ZXJpYWwgPSBudWxsO1xuXG5cdHRoaXMuYXV0b1VwZGF0ZSA9IHRydWU7IC8vIGNoZWNrZWQgYnkgdGhlIHJlbmRlcmVyXG5cbn1cblxuU2NlbmUucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogU2NlbmUsXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UsIHJlY3Vyc2l2ZSApIHtcblxuXHRcdE9iamVjdDNELnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSwgcmVjdXJzaXZlICk7XG5cblx0XHRpZiAoIHNvdXJjZS5iYWNrZ3JvdW5kICE9PSBudWxsICkgdGhpcy5iYWNrZ3JvdW5kID0gc291cmNlLmJhY2tncm91bmQuY2xvbmUoKTtcblx0XHRpZiAoIHNvdXJjZS5mb2cgIT09IG51bGwgKSB0aGlzLmZvZyA9IHNvdXJjZS5mb2cuY2xvbmUoKTtcblx0XHRpZiAoIHNvdXJjZS5vdmVycmlkZU1hdGVyaWFsICE9PSBudWxsICkgdGhpcy5vdmVycmlkZU1hdGVyaWFsID0gc291cmNlLm92ZXJyaWRlTWF0ZXJpYWwuY2xvbmUoKTtcblxuXHRcdHRoaXMuYXV0b1VwZGF0ZSA9IHNvdXJjZS5hdXRvVXBkYXRlO1xuXHRcdHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IHNvdXJjZS5tYXRyaXhBdXRvVXBkYXRlO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHR0b0pTT046IGZ1bmN0aW9uICggbWV0YSApIHtcblxuXHRcdHZhciBkYXRhID0gT2JqZWN0M0QucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzLCBtZXRhICk7XG5cblx0XHRpZiAoIHRoaXMuYmFja2dyb3VuZCAhPT0gbnVsbCApIGRhdGEub2JqZWN0LmJhY2tncm91bmQgPSB0aGlzLmJhY2tncm91bmQudG9KU09OKCBtZXRhICk7XG5cdFx0aWYgKCB0aGlzLmZvZyAhPT0gbnVsbCApIGRhdGEub2JqZWN0LmZvZyA9IHRoaXMuZm9nLnRvSlNPTigpO1xuXG5cdFx0cmV0dXJuIGRhdGE7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqXG4gKiBwYXJhbWV0ZXJzID0ge1xuICogIGNvbG9yOiA8aGV4PixcbiAqICBvcGFjaXR5OiA8ZmxvYXQ+LFxuICogIG1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKlx0dXZPZmZzZXQ6IG5ldyBUSFJFRS5WZWN0b3IyKCksXG4gKlx0dXZTY2FsZTogbmV3IFRIUkVFLlZlY3RvcjIoKVxuICogfVxuICovXG5cbmZ1bmN0aW9uIFNwcml0ZU1hdGVyaWFsKCBwYXJhbWV0ZXJzICkge1xuXG5cdE1hdGVyaWFsLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnU3ByaXRlTWF0ZXJpYWwnO1xuXG5cdHRoaXMuY29sb3IgPSBuZXcgQ29sb3IoIDB4ZmZmZmZmICk7XG5cdHRoaXMubWFwID0gbnVsbDtcblxuXHR0aGlzLnJvdGF0aW9uID0gMDtcblxuXHR0aGlzLmZvZyA9IGZhbHNlO1xuXHR0aGlzLmxpZ2h0cyA9IGZhbHNlO1xuXG5cdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XG5cbn1cblxuU3ByaXRlTWF0ZXJpYWwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTWF0ZXJpYWwucHJvdG90eXBlICk7XG5TcHJpdGVNYXRlcmlhbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBTcHJpdGVNYXRlcmlhbDtcblNwcml0ZU1hdGVyaWFsLnByb3RvdHlwZS5pc1Nwcml0ZU1hdGVyaWFsID0gdHJ1ZTtcblxuU3ByaXRlTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRNYXRlcmlhbC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHR0aGlzLmNvbG9yLmNvcHkoIHNvdXJjZS5jb2xvciApO1xuXHR0aGlzLm1hcCA9IHNvdXJjZS5tYXA7XG5cblx0dGhpcy5yb3RhdGlvbiA9IHNvdXJjZS5yb3RhdGlvbjtcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIG1pa2FlbCBlbXRpbmdlciAvIGh0dHA6Ly9nb21vLnNlL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBTcHJpdGUoIG1hdGVyaWFsICkge1xuXG5cdE9iamVjdDNELmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnU3ByaXRlJztcblxuXHR0aGlzLm1hdGVyaWFsID0gKCBtYXRlcmlhbCAhPT0gdW5kZWZpbmVkICkgPyBtYXRlcmlhbCA6IG5ldyBTcHJpdGVNYXRlcmlhbCgpO1xuXG5cdHRoaXMuY2VudGVyID0gbmV3IFZlY3RvcjIoIDAuNSwgMC41ICk7XG5cbn1cblxuU3ByaXRlLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IFNwcml0ZSxcblxuXHRpc1Nwcml0ZTogdHJ1ZSxcblxuXHRyYXljYXN0OiAoIGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBpbnRlcnNlY3RQb2ludCA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIHdvcmxkUG9zaXRpb24gPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciB3b3JsZFNjYWxlID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiByYXljYXN0KCByYXljYXN0ZXIsIGludGVyc2VjdHMgKSB7XG5cblx0XHRcdHdvcmxkUG9zaXRpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCB0aGlzLm1hdHJpeFdvcmxkICk7XG5cdFx0XHRyYXljYXN0ZXIucmF5LmNsb3Nlc3RQb2ludFRvUG9pbnQoIHdvcmxkUG9zaXRpb24sIGludGVyc2VjdFBvaW50ICk7XG5cblx0XHRcdHdvcmxkU2NhbGUuc2V0RnJvbU1hdHJpeFNjYWxlKCB0aGlzLm1hdHJpeFdvcmxkICk7XG5cdFx0XHR2YXIgZ3Vlc3NTaXplU3EgPSB3b3JsZFNjYWxlLnggKiB3b3JsZFNjYWxlLnkgLyA0O1xuXG5cdFx0XHRpZiAoIHdvcmxkUG9zaXRpb24uZGlzdGFuY2VUb1NxdWFyZWQoIGludGVyc2VjdFBvaW50ICkgPiBndWVzc1NpemVTcSApIHJldHVybjtcblxuXHRcdFx0dmFyIGRpc3RhbmNlID0gcmF5Y2FzdGVyLnJheS5vcmlnaW4uZGlzdGFuY2VUbyggaW50ZXJzZWN0UG9pbnQgKTtcblxuXHRcdFx0aWYgKCBkaXN0YW5jZSA8IHJheWNhc3Rlci5uZWFyIHx8IGRpc3RhbmNlID4gcmF5Y2FzdGVyLmZhciApIHJldHVybjtcblxuXHRcdFx0aW50ZXJzZWN0cy5wdXNoKCB7XG5cblx0XHRcdFx0ZGlzdGFuY2U6IGRpc3RhbmNlLFxuXHRcdFx0XHRwb2ludDogaW50ZXJzZWN0UG9pbnQuY2xvbmUoKSxcblx0XHRcdFx0ZmFjZTogbnVsbCxcblx0XHRcdFx0b2JqZWN0OiB0aGlzXG5cblx0XHRcdH0gKTtcblxuXHRcdH07XG5cblx0fSgpICksXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvciggdGhpcy5tYXRlcmlhbCApLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0T2JqZWN0M0QucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0XHRpZiAoIHNvdXJjZS5jZW50ZXIgIT09IHVuZGVmaW5lZCApIHRoaXMuY2VudGVyLmNvcHkoIHNvdXJjZS5jZW50ZXIgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtaWthZWwgZW10aW5nZXIgLyBodHRwOi8vZ29tby5zZS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIExPRCgpIHtcblxuXHRPYmplY3QzRC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0xPRCc7XG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIHRoaXMsIHtcblx0XHRsZXZlbHM6IHtcblx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHR2YWx1ZTogW11cblx0XHR9XG5cdH0gKTtcblxufVxuXG5MT0QucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogTE9ELFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0T2JqZWN0M0QucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlLCBmYWxzZSApO1xuXG5cdFx0dmFyIGxldmVscyA9IHNvdXJjZS5sZXZlbHM7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBsZXZlbHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGxldmVsID0gbGV2ZWxzWyBpIF07XG5cblx0XHRcdHRoaXMuYWRkTGV2ZWwoIGxldmVsLm9iamVjdC5jbG9uZSgpLCBsZXZlbC5kaXN0YW5jZSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRhZGRMZXZlbDogZnVuY3Rpb24gKCBvYmplY3QsIGRpc3RhbmNlICkge1xuXG5cdFx0aWYgKCBkaXN0YW5jZSA9PT0gdW5kZWZpbmVkICkgZGlzdGFuY2UgPSAwO1xuXG5cdFx0ZGlzdGFuY2UgPSBNYXRoLmFicyggZGlzdGFuY2UgKTtcblxuXHRcdHZhciBsZXZlbHMgPSB0aGlzLmxldmVscztcblxuXHRcdGZvciAoIHZhciBsID0gMDsgbCA8IGxldmVscy5sZW5ndGg7IGwgKysgKSB7XG5cblx0XHRcdGlmICggZGlzdGFuY2UgPCBsZXZlbHNbIGwgXS5kaXN0YW5jZSApIHtcblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0bGV2ZWxzLnNwbGljZSggbCwgMCwgeyBkaXN0YW5jZTogZGlzdGFuY2UsIG9iamVjdDogb2JqZWN0IH0gKTtcblxuXHRcdHRoaXMuYWRkKCBvYmplY3QgKTtcblxuXHR9LFxuXG5cdGdldE9iamVjdEZvckRpc3RhbmNlOiBmdW5jdGlvbiAoIGRpc3RhbmNlICkge1xuXG5cdFx0dmFyIGxldmVscyA9IHRoaXMubGV2ZWxzO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAxLCBsID0gbGV2ZWxzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdGlmICggZGlzdGFuY2UgPCBsZXZlbHNbIGkgXS5kaXN0YW5jZSApIHtcblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGxldmVsc1sgaSAtIDEgXS5vYmplY3Q7XG5cblx0fSxcblxuXHRyYXljYXN0OiAoIGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBtYXRyaXhQb3NpdGlvbiA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gcmF5Y2FzdCggcmF5Y2FzdGVyLCBpbnRlcnNlY3RzICkge1xuXG5cdFx0XHRtYXRyaXhQb3NpdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oIHRoaXMubWF0cml4V29ybGQgKTtcblxuXHRcdFx0dmFyIGRpc3RhbmNlID0gcmF5Y2FzdGVyLnJheS5vcmlnaW4uZGlzdGFuY2VUbyggbWF0cml4UG9zaXRpb24gKTtcblxuXHRcdFx0dGhpcy5nZXRPYmplY3RGb3JEaXN0YW5jZSggZGlzdGFuY2UgKS5yYXljYXN0KCByYXljYXN0ZXIsIGludGVyc2VjdHMgKTtcblxuXHRcdH07XG5cblx0fSgpICksXG5cblx0dXBkYXRlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciB2MiA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gdXBkYXRlKCBjYW1lcmEgKSB7XG5cblx0XHRcdHZhciBsZXZlbHMgPSB0aGlzLmxldmVscztcblxuXHRcdFx0aWYgKCBsZXZlbHMubGVuZ3RoID4gMSApIHtcblxuXHRcdFx0XHR2MS5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGNhbWVyYS5tYXRyaXhXb3JsZCApO1xuXHRcdFx0XHR2Mi5zZXRGcm9tTWF0cml4UG9zaXRpb24oIHRoaXMubWF0cml4V29ybGQgKTtcblxuXHRcdFx0XHR2YXIgZGlzdGFuY2UgPSB2MS5kaXN0YW5jZVRvKCB2MiApO1xuXG5cdFx0XHRcdGxldmVsc1sgMCBdLm9iamVjdC52aXNpYmxlID0gdHJ1ZTtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDEsIGwgPSBsZXZlbHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdGlmICggZGlzdGFuY2UgPj0gbGV2ZWxzWyBpIF0uZGlzdGFuY2UgKSB7XG5cblx0XHRcdFx0XHRcdGxldmVsc1sgaSAtIDEgXS5vYmplY3QudmlzaWJsZSA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0bGV2ZWxzWyBpIF0ub2JqZWN0LnZpc2libGUgPSB0cnVlO1xuXG5cdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGZvciAoIDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRsZXZlbHNbIGkgXS5vYmplY3QudmlzaWJsZSA9IGZhbHNlO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0dG9KU09OOiBmdW5jdGlvbiAoIG1ldGEgKSB7XG5cblx0XHR2YXIgZGF0YSA9IE9iamVjdDNELnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcywgbWV0YSApO1xuXG5cdFx0ZGF0YS5vYmplY3QubGV2ZWxzID0gW107XG5cblx0XHR2YXIgbGV2ZWxzID0gdGhpcy5sZXZlbHM7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBsZXZlbHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGxldmVsID0gbGV2ZWxzWyBpIF07XG5cblx0XHRcdGRhdGEub2JqZWN0LmxldmVscy5wdXNoKCB7XG5cdFx0XHRcdG9iamVjdDogbGV2ZWwub2JqZWN0LnV1aWQsXG5cdFx0XHRcdGRpc3RhbmNlOiBsZXZlbC5kaXN0YW5jZVxuXHRcdFx0fSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGRhdGE7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtaWthZWwgZW10aW5nZXIgLyBodHRwOi8vZ29tby5zZS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKiBAYXV0aG9yIG1pY2hhZWwgZ3VlcnJlcm8gLyBodHRwOi8vcmVhbGl0eW1lbHRkb3duLmNvbVxuICogQGF1dGhvciBpa2VyciAvIGh0dHA6Ly92ZXJvbGQuY29tXG4gKi9cblxuZnVuY3Rpb24gU2tlbGV0b24oIGJvbmVzLCBib25lSW52ZXJzZXMgKSB7XG5cblx0Ly8gY29weSB0aGUgYm9uZSBhcnJheVxuXG5cdGJvbmVzID0gYm9uZXMgfHwgW107XG5cblx0dGhpcy5ib25lcyA9IGJvbmVzLnNsaWNlKCAwICk7XG5cdHRoaXMuYm9uZU1hdHJpY2VzID0gbmV3IEZsb2F0MzJBcnJheSggdGhpcy5ib25lcy5sZW5ndGggKiAxNiApO1xuXG5cdC8vIHVzZSB0aGUgc3VwcGxpZWQgYm9uZSBpbnZlcnNlcyBvciBjYWxjdWxhdGUgdGhlIGludmVyc2VzXG5cblx0aWYgKCBib25lSW52ZXJzZXMgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdHRoaXMuY2FsY3VsYXRlSW52ZXJzZXMoKTtcblxuXHR9IGVsc2Uge1xuXG5cdFx0aWYgKCB0aGlzLmJvbmVzLmxlbmd0aCA9PT0gYm9uZUludmVyc2VzLmxlbmd0aCApIHtcblxuXHRcdFx0dGhpcy5ib25lSW52ZXJzZXMgPSBib25lSW52ZXJzZXMuc2xpY2UoIDAgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlNrZWxldG9uIGJvbmVJbnZlcnNlcyBpcyB0aGUgd3JvbmcgbGVuZ3RoLicgKTtcblxuXHRcdFx0dGhpcy5ib25lSW52ZXJzZXMgPSBbXTtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IHRoaXMuYm9uZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdFx0dGhpcy5ib25lSW52ZXJzZXMucHVzaCggbmV3IE1hdHJpeDQoKSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fVxuXG59XG5cbk9iamVjdC5hc3NpZ24oIFNrZWxldG9uLnByb3RvdHlwZSwge1xuXG5cdGNhbGN1bGF0ZUludmVyc2VzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLmJvbmVJbnZlcnNlcyA9IFtdO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IHRoaXMuYm9uZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBpbnZlcnNlID0gbmV3IE1hdHJpeDQoKTtcblxuXHRcdFx0aWYgKCB0aGlzLmJvbmVzWyBpIF0gKSB7XG5cblx0XHRcdFx0aW52ZXJzZS5nZXRJbnZlcnNlKCB0aGlzLmJvbmVzWyBpIF0ubWF0cml4V29ybGQgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmJvbmVJbnZlcnNlcy5wdXNoKCBpbnZlcnNlICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHRwb3NlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgYm9uZSwgaSwgaWw7XG5cblx0XHQvLyByZWNvdmVyIHRoZSBiaW5kLXRpbWUgd29ybGQgbWF0cmljZXNcblxuXHRcdGZvciAoIGkgPSAwLCBpbCA9IHRoaXMuYm9uZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdGJvbmUgPSB0aGlzLmJvbmVzWyBpIF07XG5cblx0XHRcdGlmICggYm9uZSApIHtcblxuXHRcdFx0XHRib25lLm1hdHJpeFdvcmxkLmdldEludmVyc2UoIHRoaXMuYm9uZUludmVyc2VzWyBpIF0gKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gY29tcHV0ZSB0aGUgbG9jYWwgbWF0cmljZXMsIHBvc2l0aW9ucywgcm90YXRpb25zIGFuZCBzY2FsZXNcblxuXHRcdGZvciAoIGkgPSAwLCBpbCA9IHRoaXMuYm9uZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdGJvbmUgPSB0aGlzLmJvbmVzWyBpIF07XG5cblx0XHRcdGlmICggYm9uZSApIHtcblxuXHRcdFx0XHRpZiAoIGJvbmUucGFyZW50ICYmIGJvbmUucGFyZW50LmlzQm9uZSApIHtcblxuXHRcdFx0XHRcdGJvbmUubWF0cml4LmdldEludmVyc2UoIGJvbmUucGFyZW50Lm1hdHJpeFdvcmxkICk7XG5cdFx0XHRcdFx0Ym9uZS5tYXRyaXgubXVsdGlwbHkoIGJvbmUubWF0cml4V29ybGQgKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Ym9uZS5tYXRyaXguY29weSggYm9uZS5tYXRyaXhXb3JsZCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRib25lLm1hdHJpeC5kZWNvbXBvc2UoIGJvbmUucG9zaXRpb24sIGJvbmUucXVhdGVybmlvbiwgYm9uZS5zY2FsZSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fSxcblxuXHR1cGRhdGU6ICggZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIG9mZnNldE1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7XG5cdFx0dmFyIGlkZW50aXR5TWF0cml4ID0gbmV3IE1hdHJpeDQoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiB1cGRhdGUoKSB7XG5cblx0XHRcdHZhciBib25lcyA9IHRoaXMuYm9uZXM7XG5cdFx0XHR2YXIgYm9uZUludmVyc2VzID0gdGhpcy5ib25lSW52ZXJzZXM7XG5cdFx0XHR2YXIgYm9uZU1hdHJpY2VzID0gdGhpcy5ib25lTWF0cmljZXM7XG5cdFx0XHR2YXIgYm9uZVRleHR1cmUgPSB0aGlzLmJvbmVUZXh0dXJlO1xuXG5cdFx0XHQvLyBmbGF0dGVuIGJvbmUgbWF0cmljZXMgdG8gYXJyYXlcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IGJvbmVzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdC8vIGNvbXB1dGUgdGhlIG9mZnNldCBiZXR3ZWVuIHRoZSBjdXJyZW50IGFuZCB0aGUgb3JpZ2luYWwgdHJhbnNmb3JtXG5cblx0XHRcdFx0dmFyIG1hdHJpeCA9IGJvbmVzWyBpIF0gPyBib25lc1sgaSBdLm1hdHJpeFdvcmxkIDogaWRlbnRpdHlNYXRyaXg7XG5cblx0XHRcdFx0b2Zmc2V0TWF0cml4Lm11bHRpcGx5TWF0cmljZXMoIG1hdHJpeCwgYm9uZUludmVyc2VzWyBpIF0gKTtcblx0XHRcdFx0b2Zmc2V0TWF0cml4LnRvQXJyYXkoIGJvbmVNYXRyaWNlcywgaSAqIDE2ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBib25lVGV4dHVyZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGJvbmVUZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0fVxuXG5cdFx0fTtcblxuXHR9ICkoKSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyBTa2VsZXRvbiggdGhpcy5ib25lcywgdGhpcy5ib25lSW52ZXJzZXMgKTtcblxuXHR9LFxuXG5cdGdldEJvbmVCeU5hbWU6IGZ1bmN0aW9uICggbmFtZSApIHtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSB0aGlzLmJvbmVzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgYm9uZSA9IHRoaXMuYm9uZXNbIGkgXTtcblxuXHRcdFx0aWYgKCBib25lLm5hbWUgPT09IG5hbWUgKSB7XG5cblx0XHRcdFx0cmV0dXJuIGJvbmU7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtaWthZWwgZW10aW5nZXIgLyBodHRwOi8vZ29tby5zZS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKiBAYXV0aG9yIGlrZXJyIC8gaHR0cDovL3Zlcm9sZC5jb21cbiAqL1xuXG5mdW5jdGlvbiBCb25lKCkge1xuXG5cdE9iamVjdDNELmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnQm9uZSc7XG5cbn1cblxuQm9uZS5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBCb25lLFxuXG5cdGlzQm9uZTogdHJ1ZVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtaWthZWwgZW10aW5nZXIgLyBodHRwOi8vZ29tby5zZS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKiBAYXV0aG9yIGlrZXJyIC8gaHR0cDovL3Zlcm9sZC5jb21cbiAqL1xuXG5mdW5jdGlvbiBTa2lubmVkTWVzaCggZ2VvbWV0cnksIG1hdGVyaWFsICkge1xuXG5cdE1lc2guY2FsbCggdGhpcywgZ2VvbWV0cnksIG1hdGVyaWFsICk7XG5cblx0dGhpcy50eXBlID0gJ1NraW5uZWRNZXNoJztcblxuXHR0aGlzLmJpbmRNb2RlID0gJ2F0dGFjaGVkJztcblx0dGhpcy5iaW5kTWF0cml4ID0gbmV3IE1hdHJpeDQoKTtcblx0dGhpcy5iaW5kTWF0cml4SW52ZXJzZSA9IG5ldyBNYXRyaXg0KCk7XG5cblx0dmFyIGJvbmVzID0gdGhpcy5pbml0Qm9uZXMoKTtcblx0dmFyIHNrZWxldG9uID0gbmV3IFNrZWxldG9uKCBib25lcyApO1xuXG5cdHRoaXMuYmluZCggc2tlbGV0b24sIHRoaXMubWF0cml4V29ybGQgKTtcblxuXHR0aGlzLm5vcm1hbGl6ZVNraW5XZWlnaHRzKCk7XG5cbn1cblxuU2tpbm5lZE1lc2gucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggTWVzaC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBTa2lubmVkTWVzaCxcblxuXHRpc1NraW5uZWRNZXNoOiB0cnVlLFxuXG5cdGluaXRCb25lczogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGJvbmVzID0gW10sIGJvbmUsIGdib25lO1xuXHRcdHZhciBpLCBpbDtcblxuXHRcdGlmICggdGhpcy5nZW9tZXRyeSAmJiB0aGlzLmdlb21ldHJ5LmJvbmVzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdC8vIGZpcnN0LCBjcmVhdGUgYXJyYXkgb2YgJ0JvbmUnIG9iamVjdHMgZnJvbSBnZW9tZXRyeSBkYXRhXG5cblx0XHRcdGZvciAoIGkgPSAwLCBpbCA9IHRoaXMuZ2VvbWV0cnkuYm9uZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdFx0Z2JvbmUgPSB0aGlzLmdlb21ldHJ5LmJvbmVzWyBpIF07XG5cblx0XHRcdFx0Ly8gY3JlYXRlIG5ldyAnQm9uZScgb2JqZWN0XG5cblx0XHRcdFx0Ym9uZSA9IG5ldyBCb25lKCk7XG5cdFx0XHRcdGJvbmVzLnB1c2goIGJvbmUgKTtcblxuXHRcdFx0XHQvLyBhcHBseSB2YWx1ZXNcblxuXHRcdFx0XHRib25lLm5hbWUgPSBnYm9uZS5uYW1lO1xuXHRcdFx0XHRib25lLnBvc2l0aW9uLmZyb21BcnJheSggZ2JvbmUucG9zICk7XG5cdFx0XHRcdGJvbmUucXVhdGVybmlvbi5mcm9tQXJyYXkoIGdib25lLnJvdHEgKTtcblx0XHRcdFx0aWYgKCBnYm9uZS5zY2wgIT09IHVuZGVmaW5lZCApIGJvbmUuc2NhbGUuZnJvbUFycmF5KCBnYm9uZS5zY2wgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBzZWNvbmQsIGNyZWF0ZSBib25lIGhpZXJhcmNoeVxuXG5cdFx0XHRmb3IgKCBpID0gMCwgaWwgPSB0aGlzLmdlb21ldHJ5LmJvbmVzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdGdib25lID0gdGhpcy5nZW9tZXRyeS5ib25lc1sgaSBdO1xuXG5cdFx0XHRcdGlmICggKCBnYm9uZS5wYXJlbnQgIT09IC0gMSApICYmICggZ2JvbmUucGFyZW50ICE9PSBudWxsICkgJiYgKCBib25lc1sgZ2JvbmUucGFyZW50IF0gIT09IHVuZGVmaW5lZCApICkge1xuXG5cdFx0XHRcdFx0Ly8gc3Vic2VxdWVudCBib25lcyBpbiB0aGUgaGllcmFyY2h5XG5cblx0XHRcdFx0XHRib25lc1sgZ2JvbmUucGFyZW50IF0uYWRkKCBib25lc1sgaSBdICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdC8vIHRvcG1vc3QgYm9uZSwgaW1tZWRpYXRlIGNoaWxkIG9mIHRoZSBza2lubmVkIG1lc2hcblxuXHRcdFx0XHRcdHRoaXMuYWRkKCBib25lc1sgaSBdICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvLyBub3cgdGhlIGJvbmVzIGFyZSBwYXJ0IG9mIHRoZSBzY2VuZSBncmFwaCBhbmQgY2hpbGRyZW4gb2YgdGhlIHNraW5uZWQgbWVzaC5cblx0XHQvLyBsZXQncyB1cGRhdGUgdGhlIGNvcnJlc3BvbmRpbmcgbWF0cmljZXNcblxuXHRcdHRoaXMudXBkYXRlTWF0cml4V29ybGQoIHRydWUgKTtcblxuXHRcdHJldHVybiBib25lcztcblxuXHR9LFxuXG5cdGJpbmQ6IGZ1bmN0aW9uICggc2tlbGV0b24sIGJpbmRNYXRyaXggKSB7XG5cblx0XHR0aGlzLnNrZWxldG9uID0gc2tlbGV0b247XG5cblx0XHRpZiAoIGJpbmRNYXRyaXggPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dGhpcy51cGRhdGVNYXRyaXhXb3JsZCggdHJ1ZSApO1xuXG5cdFx0XHR0aGlzLnNrZWxldG9uLmNhbGN1bGF0ZUludmVyc2VzKCk7XG5cblx0XHRcdGJpbmRNYXRyaXggPSB0aGlzLm1hdHJpeFdvcmxkO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5iaW5kTWF0cml4LmNvcHkoIGJpbmRNYXRyaXggKTtcblx0XHR0aGlzLmJpbmRNYXRyaXhJbnZlcnNlLmdldEludmVyc2UoIGJpbmRNYXRyaXggKTtcblxuXHR9LFxuXG5cdHBvc2U6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuc2tlbGV0b24ucG9zZSgpO1xuXG5cdH0sXG5cblx0bm9ybWFsaXplU2tpbldlaWdodHM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBzY2FsZSwgaTtcblxuXHRcdGlmICggdGhpcy5nZW9tZXRyeSAmJiB0aGlzLmdlb21ldHJ5LmlzR2VvbWV0cnkgKSB7XG5cblx0XHRcdGZvciAoIGkgPSAwOyBpIDwgdGhpcy5nZW9tZXRyeS5za2luV2VpZ2h0cy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdFx0dmFyIHN3ID0gdGhpcy5nZW9tZXRyeS5za2luV2VpZ2h0c1sgaSBdO1xuXG5cdFx0XHRcdHNjYWxlID0gMS4wIC8gc3cubWFuaGF0dGFuTGVuZ3RoKCk7XG5cblx0XHRcdFx0aWYgKCBzY2FsZSAhPT0gSW5maW5pdHkgKSB7XG5cblx0XHRcdFx0XHRzdy5tdWx0aXBseVNjYWxhciggc2NhbGUgKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0c3cuc2V0KCAxLCAwLCAwLCAwICk7IC8vIGRvIHNvbWV0aGluZyByZWFzb25hYmxlXG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2UgaWYgKCB0aGlzLmdlb21ldHJ5ICYmIHRoaXMuZ2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSApIHtcblxuXHRcdFx0dmFyIHZlYyA9IG5ldyBWZWN0b3I0KCk7XG5cblx0XHRcdHZhciBza2luV2VpZ2h0ID0gdGhpcy5nZW9tZXRyeS5hdHRyaWJ1dGVzLnNraW5XZWlnaHQ7XG5cblx0XHRcdGZvciAoIGkgPSAwOyBpIDwgc2tpbldlaWdodC5jb3VudDsgaSArKyApIHtcblxuXHRcdFx0XHR2ZWMueCA9IHNraW5XZWlnaHQuZ2V0WCggaSApO1xuXHRcdFx0XHR2ZWMueSA9IHNraW5XZWlnaHQuZ2V0WSggaSApO1xuXHRcdFx0XHR2ZWMueiA9IHNraW5XZWlnaHQuZ2V0WiggaSApO1xuXHRcdFx0XHR2ZWMudyA9IHNraW5XZWlnaHQuZ2V0VyggaSApO1xuXG5cdFx0XHRcdHNjYWxlID0gMS4wIC8gdmVjLm1hbmhhdHRhbkxlbmd0aCgpO1xuXG5cdFx0XHRcdGlmICggc2NhbGUgIT09IEluZmluaXR5ICkge1xuXG5cdFx0XHRcdFx0dmVjLm11bHRpcGx5U2NhbGFyKCBzY2FsZSApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHR2ZWMuc2V0KCAxLCAwLCAwLCAwICk7IC8vIGRvIHNvbWV0aGluZyByZWFzb25hYmxlXG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHNraW5XZWlnaHQuc2V0WFlaVyggaSwgdmVjLngsIHZlYy55LCB2ZWMueiwgdmVjLncgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH0sXG5cblx0dXBkYXRlTWF0cml4V29ybGQ6IGZ1bmN0aW9uICggZm9yY2UgKSB7XG5cblx0XHRNZXNoLnByb3RvdHlwZS51cGRhdGVNYXRyaXhXb3JsZC5jYWxsKCB0aGlzLCBmb3JjZSApO1xuXG5cdFx0aWYgKCB0aGlzLmJpbmRNb2RlID09PSAnYXR0YWNoZWQnICkge1xuXG5cdFx0XHR0aGlzLmJpbmRNYXRyaXhJbnZlcnNlLmdldEludmVyc2UoIHRoaXMubWF0cml4V29ybGQgKTtcblxuXHRcdH0gZWxzZSBpZiAoIHRoaXMuYmluZE1vZGUgPT09ICdkZXRhY2hlZCcgKSB7XG5cblx0XHRcdHRoaXMuYmluZE1hdHJpeEludmVyc2UuZ2V0SW52ZXJzZSggdGhpcy5iaW5kTWF0cml4ICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Ta2lubmVkTWVzaDogVW5yZWNvZ25pemVkIGJpbmRNb2RlOiAnICsgdGhpcy5iaW5kTW9kZSApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvciggdGhpcy5nZW9tZXRyeSwgdGhpcy5tYXRlcmlhbCApLmNvcHkoIHRoaXMgKTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqXG4gKiBwYXJhbWV0ZXJzID0ge1xuICogIGNvbG9yOiA8aGV4PixcbiAqICBvcGFjaXR5OiA8ZmxvYXQ+LFxuICpcbiAqICBsaW5ld2lkdGg6IDxmbG9hdD4sXG4gKiAgbGluZWNhcDogXCJyb3VuZFwiLFxuICogIGxpbmVqb2luOiBcInJvdW5kXCJcbiAqIH1cbiAqL1xuXG5mdW5jdGlvbiBMaW5lQmFzaWNNYXRlcmlhbCggcGFyYW1ldGVycyApIHtcblxuXHRNYXRlcmlhbC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0xpbmVCYXNpY01hdGVyaWFsJztcblxuXHR0aGlzLmNvbG9yID0gbmV3IENvbG9yKCAweGZmZmZmZiApO1xuXG5cdHRoaXMubGluZXdpZHRoID0gMTtcblx0dGhpcy5saW5lY2FwID0gJ3JvdW5kJztcblx0dGhpcy5saW5lam9pbiA9ICdyb3VuZCc7XG5cblx0dGhpcy5saWdodHMgPSBmYWxzZTtcblxuXHR0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApO1xuXG59XG5cbkxpbmVCYXNpY01hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE1hdGVyaWFsLnByb3RvdHlwZSApO1xuTGluZUJhc2ljTWF0ZXJpYWwucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTGluZUJhc2ljTWF0ZXJpYWw7XG5cbkxpbmVCYXNpY01hdGVyaWFsLnByb3RvdHlwZS5pc0xpbmVCYXNpY01hdGVyaWFsID0gdHJ1ZTtcblxuTGluZUJhc2ljTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRNYXRlcmlhbC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHR0aGlzLmNvbG9yLmNvcHkoIHNvdXJjZS5jb2xvciApO1xuXG5cdHRoaXMubGluZXdpZHRoID0gc291cmNlLmxpbmV3aWR0aDtcblx0dGhpcy5saW5lY2FwID0gc291cmNlLmxpbmVjYXA7XG5cdHRoaXMubGluZWpvaW4gPSBzb3VyY2UubGluZWpvaW47XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBMaW5lKCBnZW9tZXRyeSwgbWF0ZXJpYWwsIG1vZGUgKSB7XG5cblx0aWYgKCBtb2RlID09PSAxICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGluZTogcGFyYW1ldGVyIFRIUkVFLkxpbmVQaWVjZXMgbm8gbG9uZ2VyIHN1cHBvcnRlZC4gQ3JlYXRlZCBUSFJFRS5MaW5lU2VnbWVudHMgaW5zdGVhZC4nICk7XG5cdFx0cmV0dXJuIG5ldyBMaW5lU2VnbWVudHMoIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xuXG5cdH1cblxuXHRPYmplY3QzRC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0xpbmUnO1xuXG5cdHRoaXMuZ2VvbWV0cnkgPSBnZW9tZXRyeSAhPT0gdW5kZWZpbmVkID8gZ2VvbWV0cnkgOiBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcblx0dGhpcy5tYXRlcmlhbCA9IG1hdGVyaWFsICE9PSB1bmRlZmluZWQgPyBtYXRlcmlhbCA6IG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogTWF0aC5yYW5kb20oKSAqIDB4ZmZmZmZmIH0gKTtcblxufVxuXG5MaW5lLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IExpbmUsXG5cblx0aXNMaW5lOiB0cnVlLFxuXG5cdGNvbXB1dGVMaW5lRGlzdGFuY2VzOiAoIGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBzdGFydCA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIGVuZCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gY29tcHV0ZUxpbmVEaXN0YW5jZXMoKSB7XG5cblx0XHRcdHZhciBnZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7XG5cblx0XHRcdGlmICggZ2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSApIHtcblxuXHRcdFx0XHQvLyB3ZSBhc3N1bWUgbm9uLWluZGV4ZWQgZ2VvbWV0cnlcblxuXHRcdFx0XHRpZiAoIGdlb21ldHJ5LmluZGV4ID09PSBudWxsICkge1xuXG5cdFx0XHRcdFx0dmFyIHBvc2l0aW9uQXR0cmlidXRlID0gZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbjtcblx0XHRcdFx0XHR2YXIgbGluZURpc3RhbmNlcyA9IFsgMCBdO1xuXG5cdFx0XHRcdFx0Zm9yICggdmFyIGkgPSAxLCBsID0gcG9zaXRpb25BdHRyaWJ1dGUuY291bnQ7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0XHRzdGFydC5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbkF0dHJpYnV0ZSwgaSAtIDEgKTtcblx0XHRcdFx0XHRcdGVuZC5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbkF0dHJpYnV0ZSwgaSApO1xuXG5cdFx0XHRcdFx0XHRsaW5lRGlzdGFuY2VzWyBpIF0gPSBsaW5lRGlzdGFuY2VzWyBpIC0gMSBdO1xuXHRcdFx0XHRcdFx0bGluZURpc3RhbmNlc1sgaSBdICs9IHN0YXJ0LmRpc3RhbmNlVG8oIGVuZCApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Z2VvbWV0cnkuYWRkQXR0cmlidXRlKCAnbGluZURpc3RhbmNlJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIGxpbmVEaXN0YW5jZXMsIDEgKSApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5MaW5lLmNvbXB1dGVMaW5lRGlzdGFuY2VzKCk6IENvbXB1dGF0aW9uIG9ubHkgcG9zc2libGUgd2l0aCBub24taW5kZXhlZCBCdWZmZXJHZW9tZXRyeS4nICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IGVsc2UgaWYgKCBnZW9tZXRyeS5pc0dlb21ldHJ5ICkge1xuXG5cdFx0XHRcdHZhciB2ZXJ0aWNlcyA9IGdlb21ldHJ5LnZlcnRpY2VzO1xuXHRcdFx0XHR2YXIgbGluZURpc3RhbmNlcyA9IGdlb21ldHJ5LmxpbmVEaXN0YW5jZXM7XG5cblx0XHRcdFx0bGluZURpc3RhbmNlc1sgMCBdID0gMDtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDEsIGwgPSB2ZXJ0aWNlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0bGluZURpc3RhbmNlc1sgaSBdID0gbGluZURpc3RhbmNlc1sgaSAtIDEgXTtcblx0XHRcdFx0XHRsaW5lRGlzdGFuY2VzWyBpIF0gKz0gdmVydGljZXNbIGkgLSAxIF0uZGlzdGFuY2VUbyggdmVydGljZXNbIGkgXSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpICksXG5cblx0cmF5Y2FzdDogKCBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgaW52ZXJzZU1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7XG5cdFx0dmFyIHJheSA9IG5ldyBSYXkoKTtcblx0XHR2YXIgc3BoZXJlID0gbmV3IFNwaGVyZSgpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHJheWNhc3QoIHJheWNhc3RlciwgaW50ZXJzZWN0cyApIHtcblxuXHRcdFx0dmFyIHByZWNpc2lvbiA9IHJheWNhc3Rlci5saW5lUHJlY2lzaW9uO1xuXHRcdFx0dmFyIHByZWNpc2lvblNxID0gcHJlY2lzaW9uICogcHJlY2lzaW9uO1xuXG5cdFx0XHR2YXIgZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5O1xuXHRcdFx0dmFyIG1hdHJpeFdvcmxkID0gdGhpcy5tYXRyaXhXb3JsZDtcblxuXHRcdFx0Ly8gQ2hlY2tpbmcgYm91bmRpbmdTcGhlcmUgZGlzdGFuY2UgdG8gcmF5XG5cblx0XHRcdGlmICggZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgPT09IG51bGwgKSBnZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtcblxuXHRcdFx0c3BoZXJlLmNvcHkoIGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlICk7XG5cdFx0XHRzcGhlcmUuYXBwbHlNYXRyaXg0KCBtYXRyaXhXb3JsZCApO1xuXG5cdFx0XHRpZiAoIHJheWNhc3Rlci5yYXkuaW50ZXJzZWN0c1NwaGVyZSggc3BoZXJlICkgPT09IGZhbHNlICkgcmV0dXJuO1xuXG5cdFx0XHQvL1xuXG5cdFx0XHRpbnZlcnNlTWF0cml4LmdldEludmVyc2UoIG1hdHJpeFdvcmxkICk7XG5cdFx0XHRyYXkuY29weSggcmF5Y2FzdGVyLnJheSApLmFwcGx5TWF0cml4NCggaW52ZXJzZU1hdHJpeCApO1xuXG5cdFx0XHR2YXIgdlN0YXJ0ID0gbmV3IFZlY3RvcjMoKTtcblx0XHRcdHZhciB2RW5kID0gbmV3IFZlY3RvcjMoKTtcblx0XHRcdHZhciBpbnRlclNlZ21lbnQgPSBuZXcgVmVjdG9yMygpO1xuXHRcdFx0dmFyIGludGVyUmF5ID0gbmV3IFZlY3RvcjMoKTtcblx0XHRcdHZhciBzdGVwID0gKCB0aGlzICYmIHRoaXMuaXNMaW5lU2VnbWVudHMgKSA/IDIgOiAxO1xuXG5cdFx0XHRpZiAoIGdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgKSB7XG5cblx0XHRcdFx0dmFyIGluZGV4ID0gZ2VvbWV0cnkuaW5kZXg7XG5cdFx0XHRcdHZhciBhdHRyaWJ1dGVzID0gZ2VvbWV0cnkuYXR0cmlidXRlcztcblx0XHRcdFx0dmFyIHBvc2l0aW9ucyA9IGF0dHJpYnV0ZXMucG9zaXRpb24uYXJyYXk7XG5cblx0XHRcdFx0aWYgKCBpbmRleCAhPT0gbnVsbCApIHtcblxuXHRcdFx0XHRcdHZhciBpbmRpY2VzID0gaW5kZXguYXJyYXk7XG5cblx0XHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBpbmRpY2VzLmxlbmd0aCAtIDE7IGkgPCBsOyBpICs9IHN0ZXAgKSB7XG5cblx0XHRcdFx0XHRcdHZhciBhID0gaW5kaWNlc1sgaSBdO1xuXHRcdFx0XHRcdFx0dmFyIGIgPSBpbmRpY2VzWyBpICsgMSBdO1xuXG5cdFx0XHRcdFx0XHR2U3RhcnQuZnJvbUFycmF5KCBwb3NpdGlvbnMsIGEgKiAzICk7XG5cdFx0XHRcdFx0XHR2RW5kLmZyb21BcnJheSggcG9zaXRpb25zLCBiICogMyApO1xuXG5cdFx0XHRcdFx0XHR2YXIgZGlzdFNxID0gcmF5LmRpc3RhbmNlU3FUb1NlZ21lbnQoIHZTdGFydCwgdkVuZCwgaW50ZXJSYXksIGludGVyU2VnbWVudCApO1xuXG5cdFx0XHRcdFx0XHRpZiAoIGRpc3RTcSA+IHByZWNpc2lvblNxICkgY29udGludWU7XG5cblx0XHRcdFx0XHRcdGludGVyUmF5LmFwcGx5TWF0cml4NCggdGhpcy5tYXRyaXhXb3JsZCApOyAvL01vdmUgYmFjayB0byB3b3JsZCBzcGFjZSBmb3IgZGlzdGFuY2UgY2FsY3VsYXRpb25cblxuXHRcdFx0XHRcdFx0dmFyIGRpc3RhbmNlID0gcmF5Y2FzdGVyLnJheS5vcmlnaW4uZGlzdGFuY2VUbyggaW50ZXJSYXkgKTtcblxuXHRcdFx0XHRcdFx0aWYgKCBkaXN0YW5jZSA8IHJheWNhc3Rlci5uZWFyIHx8IGRpc3RhbmNlID4gcmF5Y2FzdGVyLmZhciApIGNvbnRpbnVlO1xuXG5cdFx0XHRcdFx0XHRpbnRlcnNlY3RzLnB1c2goIHtcblxuXHRcdFx0XHRcdFx0XHRkaXN0YW5jZTogZGlzdGFuY2UsXG5cdFx0XHRcdFx0XHRcdC8vIFdoYXQgZG8gd2Ugd2FudD8gaW50ZXJzZWN0aW9uIHBvaW50IG9uIHRoZSByYXkgb3Igb24gdGhlIHNlZ21lbnQ/P1xuXHRcdFx0XHRcdFx0XHQvLyBwb2ludDogcmF5Y2FzdGVyLnJheS5hdCggZGlzdGFuY2UgKSxcblx0XHRcdFx0XHRcdFx0cG9pbnQ6IGludGVyU2VnbWVudC5jbG9uZSgpLmFwcGx5TWF0cml4NCggdGhpcy5tYXRyaXhXb3JsZCApLFxuXHRcdFx0XHRcdFx0XHRpbmRleDogaSxcblx0XHRcdFx0XHRcdFx0ZmFjZTogbnVsbCxcblx0XHRcdFx0XHRcdFx0ZmFjZUluZGV4OiBudWxsLFxuXHRcdFx0XHRcdFx0XHRvYmplY3Q6IHRoaXNcblxuXHRcdFx0XHRcdFx0fSApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBwb3NpdGlvbnMubGVuZ3RoIC8gMyAtIDE7IGkgPCBsOyBpICs9IHN0ZXAgKSB7XG5cblx0XHRcdFx0XHRcdHZTdGFydC5mcm9tQXJyYXkoIHBvc2l0aW9ucywgMyAqIGkgKTtcblx0XHRcdFx0XHRcdHZFbmQuZnJvbUFycmF5KCBwb3NpdGlvbnMsIDMgKiBpICsgMyApO1xuXG5cdFx0XHRcdFx0XHR2YXIgZGlzdFNxID0gcmF5LmRpc3RhbmNlU3FUb1NlZ21lbnQoIHZTdGFydCwgdkVuZCwgaW50ZXJSYXksIGludGVyU2VnbWVudCApO1xuXG5cdFx0XHRcdFx0XHRpZiAoIGRpc3RTcSA+IHByZWNpc2lvblNxICkgY29udGludWU7XG5cblx0XHRcdFx0XHRcdGludGVyUmF5LmFwcGx5TWF0cml4NCggdGhpcy5tYXRyaXhXb3JsZCApOyAvL01vdmUgYmFjayB0byB3b3JsZCBzcGFjZSBmb3IgZGlzdGFuY2UgY2FsY3VsYXRpb25cblxuXHRcdFx0XHRcdFx0dmFyIGRpc3RhbmNlID0gcmF5Y2FzdGVyLnJheS5vcmlnaW4uZGlzdGFuY2VUbyggaW50ZXJSYXkgKTtcblxuXHRcdFx0XHRcdFx0aWYgKCBkaXN0YW5jZSA8IHJheWNhc3Rlci5uZWFyIHx8IGRpc3RhbmNlID4gcmF5Y2FzdGVyLmZhciApIGNvbnRpbnVlO1xuXG5cdFx0XHRcdFx0XHRpbnRlcnNlY3RzLnB1c2goIHtcblxuXHRcdFx0XHRcdFx0XHRkaXN0YW5jZTogZGlzdGFuY2UsXG5cdFx0XHRcdFx0XHRcdC8vIFdoYXQgZG8gd2Ugd2FudD8gaW50ZXJzZWN0aW9uIHBvaW50IG9uIHRoZSByYXkgb3Igb24gdGhlIHNlZ21lbnQ/P1xuXHRcdFx0XHRcdFx0XHQvLyBwb2ludDogcmF5Y2FzdGVyLnJheS5hdCggZGlzdGFuY2UgKSxcblx0XHRcdFx0XHRcdFx0cG9pbnQ6IGludGVyU2VnbWVudC5jbG9uZSgpLmFwcGx5TWF0cml4NCggdGhpcy5tYXRyaXhXb3JsZCApLFxuXHRcdFx0XHRcdFx0XHRpbmRleDogaSxcblx0XHRcdFx0XHRcdFx0ZmFjZTogbnVsbCxcblx0XHRcdFx0XHRcdFx0ZmFjZUluZGV4OiBudWxsLFxuXHRcdFx0XHRcdFx0XHRvYmplY3Q6IHRoaXNcblxuXHRcdFx0XHRcdFx0fSApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIGlmICggZ2VvbWV0cnkuaXNHZW9tZXRyeSApIHtcblxuXHRcdFx0XHR2YXIgdmVydGljZXMgPSBnZW9tZXRyeS52ZXJ0aWNlcztcblx0XHRcdFx0dmFyIG5iVmVydGljZXMgPSB2ZXJ0aWNlcy5sZW5ndGg7XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgbmJWZXJ0aWNlcyAtIDE7IGkgKz0gc3RlcCApIHtcblxuXHRcdFx0XHRcdHZhciBkaXN0U3EgPSByYXkuZGlzdGFuY2VTcVRvU2VnbWVudCggdmVydGljZXNbIGkgXSwgdmVydGljZXNbIGkgKyAxIF0sIGludGVyUmF5LCBpbnRlclNlZ21lbnQgKTtcblxuXHRcdFx0XHRcdGlmICggZGlzdFNxID4gcHJlY2lzaW9uU3EgKSBjb250aW51ZTtcblxuXHRcdFx0XHRcdGludGVyUmF5LmFwcGx5TWF0cml4NCggdGhpcy5tYXRyaXhXb3JsZCApOyAvL01vdmUgYmFjayB0byB3b3JsZCBzcGFjZSBmb3IgZGlzdGFuY2UgY2FsY3VsYXRpb25cblxuXHRcdFx0XHRcdHZhciBkaXN0YW5jZSA9IHJheWNhc3Rlci5yYXkub3JpZ2luLmRpc3RhbmNlVG8oIGludGVyUmF5ICk7XG5cblx0XHRcdFx0XHRpZiAoIGRpc3RhbmNlIDwgcmF5Y2FzdGVyLm5lYXIgfHwgZGlzdGFuY2UgPiByYXljYXN0ZXIuZmFyICkgY29udGludWU7XG5cblx0XHRcdFx0XHRpbnRlcnNlY3RzLnB1c2goIHtcblxuXHRcdFx0XHRcdFx0ZGlzdGFuY2U6IGRpc3RhbmNlLFxuXHRcdFx0XHRcdFx0Ly8gV2hhdCBkbyB3ZSB3YW50PyBpbnRlcnNlY3Rpb24gcG9pbnQgb24gdGhlIHJheSBvciBvbiB0aGUgc2VnbWVudD8/XG5cdFx0XHRcdFx0XHQvLyBwb2ludDogcmF5Y2FzdGVyLnJheS5hdCggZGlzdGFuY2UgKSxcblx0XHRcdFx0XHRcdHBvaW50OiBpbnRlclNlZ21lbnQuY2xvbmUoKS5hcHBseU1hdHJpeDQoIHRoaXMubWF0cml4V29ybGQgKSxcblx0XHRcdFx0XHRcdGluZGV4OiBpLFxuXHRcdFx0XHRcdFx0ZmFjZTogbnVsbCxcblx0XHRcdFx0XHRcdGZhY2VJbmRleDogbnVsbCxcblx0XHRcdFx0XHRcdG9iamVjdDogdGhpc1xuXG5cdFx0XHRcdFx0fSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fTtcblxuXHR9KCkgKSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCB0aGlzLmdlb21ldHJ5LCB0aGlzLm1hdGVyaWFsICkuY29weSggdGhpcyApO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gTGluZVNlZ21lbnRzKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKSB7XG5cblx0TGluZS5jYWxsKCB0aGlzLCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcblxuXHR0aGlzLnR5cGUgPSAnTGluZVNlZ21lbnRzJztcblxufVxuXG5MaW5lU2VnbWVudHMucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggTGluZS5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBMaW5lU2VnbWVudHMsXG5cblx0aXNMaW5lU2VnbWVudHM6IHRydWUsXG5cblx0Y29tcHV0ZUxpbmVEaXN0YW5jZXM6ICggZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHN0YXJ0ID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgZW5kID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBjb21wdXRlTGluZURpc3RhbmNlcygpIHtcblxuXHRcdFx0dmFyIGdlb21ldHJ5ID0gdGhpcy5nZW9tZXRyeTtcblxuXHRcdFx0aWYgKCBnZW9tZXRyeS5pc0J1ZmZlckdlb21ldHJ5ICkge1xuXG5cdFx0XHRcdC8vIHdlIGFzc3VtZSBub24taW5kZXhlZCBnZW9tZXRyeVxuXG5cdFx0XHRcdGlmICggZ2VvbWV0cnkuaW5kZXggPT09IG51bGwgKSB7XG5cblx0XHRcdFx0XHR2YXIgcG9zaXRpb25BdHRyaWJ1dGUgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uO1xuXHRcdFx0XHRcdHZhciBsaW5lRGlzdGFuY2VzID0gW107XG5cblx0XHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBwb3NpdGlvbkF0dHJpYnV0ZS5jb3VudDsgaSA8IGw7IGkgKz0gMiApIHtcblxuXHRcdFx0XHRcdFx0c3RhcnQuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25BdHRyaWJ1dGUsIGkgKTtcblx0XHRcdFx0XHRcdGVuZC5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbkF0dHJpYnV0ZSwgaSArIDEgKTtcblxuXHRcdFx0XHRcdFx0bGluZURpc3RhbmNlc1sgaSBdID0gKCBpID09PSAwICkgPyAwIDogbGluZURpc3RhbmNlc1sgaSAtIDEgXTtcblx0XHRcdFx0XHRcdGxpbmVEaXN0YW5jZXNbIGkgKyAxIF0gPSBsaW5lRGlzdGFuY2VzWyBpIF0gKyBzdGFydC5kaXN0YW5jZVRvKCBlbmQgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ2xpbmVEaXN0YW5jZScsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBsaW5lRGlzdGFuY2VzLCAxICkgKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGluZVNlZ21lbnRzLmNvbXB1dGVMaW5lRGlzdGFuY2VzKCk6IENvbXB1dGF0aW9uIG9ubHkgcG9zc2libGUgd2l0aCBub24taW5kZXhlZCBCdWZmZXJHZW9tZXRyeS4nICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IGVsc2UgaWYgKCBnZW9tZXRyeS5pc0dlb21ldHJ5ICkge1xuXG5cdFx0XHRcdHZhciB2ZXJ0aWNlcyA9IGdlb21ldHJ5LnZlcnRpY2VzO1xuXHRcdFx0XHR2YXIgbGluZURpc3RhbmNlcyA9IGdlb21ldHJ5LmxpbmVEaXN0YW5jZXM7XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gdmVydGljZXMubGVuZ3RoOyBpIDwgbDsgaSArPSAyICkge1xuXG5cdFx0XHRcdFx0c3RhcnQuY29weSggdmVydGljZXNbIGkgXSApO1xuXHRcdFx0XHRcdGVuZC5jb3B5KCB2ZXJ0aWNlc1sgaSArIDEgXSApO1xuXG5cdFx0XHRcdFx0bGluZURpc3RhbmNlc1sgaSBdID0gKCBpID09PSAwICkgPyAwIDogbGluZURpc3RhbmNlc1sgaSAtIDEgXTtcblx0XHRcdFx0XHRsaW5lRGlzdGFuY2VzWyBpICsgMSBdID0gbGluZURpc3RhbmNlc1sgaSBdICsgc3RhcnQuZGlzdGFuY2VUbyggZW5kICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCkgKVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtZ3JldGVyIC8gaHR0cDovL2dpdGh1Yi5jb20vbWdyZXRlclxuICovXG5cbmZ1bmN0aW9uIExpbmVMb29wKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKSB7XG5cblx0TGluZS5jYWxsKCB0aGlzLCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcblxuXHR0aGlzLnR5cGUgPSAnTGluZUxvb3AnO1xuXG59XG5cbkxpbmVMb29wLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIExpbmUucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogTGluZUxvb3AsXG5cblx0aXNMaW5lTG9vcDogdHJ1ZSxcblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICpcbiAqIHBhcmFtZXRlcnMgPSB7XG4gKiAgY29sb3I6IDxoZXg+LFxuICogIG9wYWNpdHk6IDxmbG9hdD4sXG4gKiAgbWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBzaXplOiA8ZmxvYXQ+LFxuICogIHNpemVBdHRlbnVhdGlvbjogPGJvb2w+XG4gKiB9XG4gKi9cblxuZnVuY3Rpb24gUG9pbnRzTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7XG5cblx0TWF0ZXJpYWwuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdQb2ludHNNYXRlcmlhbCc7XG5cblx0dGhpcy5jb2xvciA9IG5ldyBDb2xvciggMHhmZmZmZmYgKTtcblxuXHR0aGlzLm1hcCA9IG51bGw7XG5cblx0dGhpcy5zaXplID0gMTtcblx0dGhpcy5zaXplQXR0ZW51YXRpb24gPSB0cnVlO1xuXG5cdHRoaXMubGlnaHRzID0gZmFsc2U7XG5cblx0dGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTtcblxufVxuXG5Qb2ludHNNYXRlcmlhbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBNYXRlcmlhbC5wcm90b3R5cGUgKTtcblBvaW50c01hdGVyaWFsLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFBvaW50c01hdGVyaWFsO1xuXG5Qb2ludHNNYXRlcmlhbC5wcm90b3R5cGUuaXNQb2ludHNNYXRlcmlhbCA9IHRydWU7XG5cblBvaW50c01hdGVyaWFsLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0TWF0ZXJpYWwucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0dGhpcy5jb2xvci5jb3B5KCBzb3VyY2UuY29sb3IgKTtcblxuXHR0aGlzLm1hcCA9IHNvdXJjZS5tYXA7XG5cblx0dGhpcy5zaXplID0gc291cmNlLnNpemU7XG5cdHRoaXMuc2l6ZUF0dGVudWF0aW9uID0gc291cmNlLnNpemVBdHRlbnVhdGlvbjtcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICovXG5cbmZ1bmN0aW9uIFBvaW50cyggZ2VvbWV0cnksIG1hdGVyaWFsICkge1xuXG5cdE9iamVjdDNELmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnUG9pbnRzJztcblxuXHR0aGlzLmdlb21ldHJ5ID0gZ2VvbWV0cnkgIT09IHVuZGVmaW5lZCA/IGdlb21ldHJ5IDogbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cdHRoaXMubWF0ZXJpYWwgPSBtYXRlcmlhbCAhPT0gdW5kZWZpbmVkID8gbWF0ZXJpYWwgOiBuZXcgUG9pbnRzTWF0ZXJpYWwoIHsgY29sb3I6IE1hdGgucmFuZG9tKCkgKiAweGZmZmZmZiB9ICk7XG5cbn1cblxuUG9pbnRzLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IFBvaW50cyxcblxuXHRpc1BvaW50czogdHJ1ZSxcblxuXHRyYXljYXN0OiAoIGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBpbnZlcnNlTWF0cml4ID0gbmV3IE1hdHJpeDQoKTtcblx0XHR2YXIgcmF5ID0gbmV3IFJheSgpO1xuXHRcdHZhciBzcGhlcmUgPSBuZXcgU3BoZXJlKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gcmF5Y2FzdCggcmF5Y2FzdGVyLCBpbnRlcnNlY3RzICkge1xuXG5cdFx0XHR2YXIgb2JqZWN0ID0gdGhpcztcblx0XHRcdHZhciBnZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7XG5cdFx0XHR2YXIgbWF0cml4V29ybGQgPSB0aGlzLm1hdHJpeFdvcmxkO1xuXHRcdFx0dmFyIHRocmVzaG9sZCA9IHJheWNhc3Rlci5wYXJhbXMuUG9pbnRzLnRocmVzaG9sZDtcblxuXHRcdFx0Ly8gQ2hlY2tpbmcgYm91bmRpbmdTcGhlcmUgZGlzdGFuY2UgdG8gcmF5XG5cblx0XHRcdGlmICggZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgPT09IG51bGwgKSBnZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtcblxuXHRcdFx0c3BoZXJlLmNvcHkoIGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlICk7XG5cdFx0XHRzcGhlcmUuYXBwbHlNYXRyaXg0KCBtYXRyaXhXb3JsZCApO1xuXHRcdFx0c3BoZXJlLnJhZGl1cyArPSB0aHJlc2hvbGQ7XG5cblx0XHRcdGlmICggcmF5Y2FzdGVyLnJheS5pbnRlcnNlY3RzU3BoZXJlKCBzcGhlcmUgKSA9PT0gZmFsc2UgKSByZXR1cm47XG5cblx0XHRcdC8vXG5cblx0XHRcdGludmVyc2VNYXRyaXguZ2V0SW52ZXJzZSggbWF0cml4V29ybGQgKTtcblx0XHRcdHJheS5jb3B5KCByYXljYXN0ZXIucmF5ICkuYXBwbHlNYXRyaXg0KCBpbnZlcnNlTWF0cml4ICk7XG5cblx0XHRcdHZhciBsb2NhbFRocmVzaG9sZCA9IHRocmVzaG9sZCAvICggKCB0aGlzLnNjYWxlLnggKyB0aGlzLnNjYWxlLnkgKyB0aGlzLnNjYWxlLnogKSAvIDMgKTtcblx0XHRcdHZhciBsb2NhbFRocmVzaG9sZFNxID0gbG9jYWxUaHJlc2hvbGQgKiBsb2NhbFRocmVzaG9sZDtcblx0XHRcdHZhciBwb3NpdGlvbiA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0XHR2YXIgaW50ZXJzZWN0UG9pbnQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0XHRmdW5jdGlvbiB0ZXN0UG9pbnQoIHBvaW50LCBpbmRleCApIHtcblxuXHRcdFx0XHR2YXIgcmF5UG9pbnREaXN0YW5jZVNxID0gcmF5LmRpc3RhbmNlU3FUb1BvaW50KCBwb2ludCApO1xuXG5cdFx0XHRcdGlmICggcmF5UG9pbnREaXN0YW5jZVNxIDwgbG9jYWxUaHJlc2hvbGRTcSApIHtcblxuXHRcdFx0XHRcdHJheS5jbG9zZXN0UG9pbnRUb1BvaW50KCBwb2ludCwgaW50ZXJzZWN0UG9pbnQgKTtcblx0XHRcdFx0XHRpbnRlcnNlY3RQb2ludC5hcHBseU1hdHJpeDQoIG1hdHJpeFdvcmxkICk7XG5cblx0XHRcdFx0XHR2YXIgZGlzdGFuY2UgPSByYXljYXN0ZXIucmF5Lm9yaWdpbi5kaXN0YW5jZVRvKCBpbnRlcnNlY3RQb2ludCApO1xuXG5cdFx0XHRcdFx0aWYgKCBkaXN0YW5jZSA8IHJheWNhc3Rlci5uZWFyIHx8IGRpc3RhbmNlID4gcmF5Y2FzdGVyLmZhciApIHJldHVybjtcblxuXHRcdFx0XHRcdGludGVyc2VjdHMucHVzaCgge1xuXG5cdFx0XHRcdFx0XHRkaXN0YW5jZTogZGlzdGFuY2UsXG5cdFx0XHRcdFx0XHRkaXN0YW5jZVRvUmF5OiBNYXRoLnNxcnQoIHJheVBvaW50RGlzdGFuY2VTcSApLFxuXHRcdFx0XHRcdFx0cG9pbnQ6IGludGVyc2VjdFBvaW50LmNsb25lKCksXG5cdFx0XHRcdFx0XHRpbmRleDogaW5kZXgsXG5cdFx0XHRcdFx0XHRmYWNlOiBudWxsLFxuXHRcdFx0XHRcdFx0b2JqZWN0OiBvYmplY3RcblxuXHRcdFx0XHRcdH0gKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBnZW9tZXRyeS5pc0J1ZmZlckdlb21ldHJ5ICkge1xuXG5cdFx0XHRcdHZhciBpbmRleCA9IGdlb21ldHJ5LmluZGV4O1xuXHRcdFx0XHR2YXIgYXR0cmlidXRlcyA9IGdlb21ldHJ5LmF0dHJpYnV0ZXM7XG5cdFx0XHRcdHZhciBwb3NpdGlvbnMgPSBhdHRyaWJ1dGVzLnBvc2l0aW9uLmFycmF5O1xuXG5cdFx0XHRcdGlmICggaW5kZXggIT09IG51bGwgKSB7XG5cblx0XHRcdFx0XHR2YXIgaW5kaWNlcyA9IGluZGV4LmFycmF5O1xuXG5cdFx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IGluZGljZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdHZhciBhID0gaW5kaWNlc1sgaSBdO1xuXG5cdFx0XHRcdFx0XHRwb3NpdGlvbi5mcm9tQXJyYXkoIHBvc2l0aW9ucywgYSAqIDMgKTtcblxuXHRcdFx0XHRcdFx0dGVzdFBvaW50KCBwb3NpdGlvbiwgYSApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBwb3NpdGlvbnMubGVuZ3RoIC8gMzsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdHBvc2l0aW9uLmZyb21BcnJheSggcG9zaXRpb25zLCBpICogMyApO1xuXG5cdFx0XHRcdFx0XHR0ZXN0UG9pbnQoIHBvc2l0aW9uLCBpICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHZhciB2ZXJ0aWNlcyA9IGdlb21ldHJ5LnZlcnRpY2VzO1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHZlcnRpY2VzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHR0ZXN0UG9pbnQoIHZlcnRpY2VzWyBpIF0sIGkgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH07XG5cblx0fSgpICksXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvciggdGhpcy5nZW9tZXRyeSwgdGhpcy5tYXRlcmlhbCApLmNvcHkoIHRoaXMgKTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIEdyb3VwKCkge1xuXG5cdE9iamVjdDNELmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnR3JvdXAnO1xuXG59XG5cbkdyb3VwLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IEdyb3VwLFxuXG5cdGlzR3JvdXA6IHRydWVcblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gVmlkZW9UZXh0dXJlKCB2aWRlbywgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIsIG1pbkZpbHRlciwgZm9ybWF0LCB0eXBlLCBhbmlzb3Ryb3B5ICkge1xuXG5cdFRleHR1cmUuY2FsbCggdGhpcywgdmlkZW8sIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGZvcm1hdCwgdHlwZSwgYW5pc290cm9weSApO1xuXG5cdHRoaXMuZ2VuZXJhdGVNaXBtYXBzID0gZmFsc2U7XG5cbn1cblxuVmlkZW9UZXh0dXJlLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIFRleHR1cmUucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogVmlkZW9UZXh0dXJlLFxuXG5cdGlzVmlkZW9UZXh0dXJlOiB0cnVlLFxuXG5cdHVwZGF0ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHZpZGVvID0gdGhpcy5pbWFnZTtcblxuXHRcdGlmICggdmlkZW8ucmVhZHlTdGF0ZSA+PSB2aWRlby5IQVZFX0NVUlJFTlRfREFUQSApIHtcblxuXHRcdFx0dGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHR9XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBDb21wcmVzc2VkVGV4dHVyZSggbWlwbWFwcywgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCB0eXBlLCBtYXBwaW5nLCB3cmFwUywgd3JhcFQsIG1hZ0ZpbHRlciwgbWluRmlsdGVyLCBhbmlzb3Ryb3B5LCBlbmNvZGluZyApIHtcblxuXHRUZXh0dXJlLmNhbGwoIHRoaXMsIG51bGwsIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGZvcm1hdCwgdHlwZSwgYW5pc290cm9weSwgZW5jb2RpbmcgKTtcblxuXHR0aGlzLmltYWdlID0geyB3aWR0aDogd2lkdGgsIGhlaWdodDogaGVpZ2h0IH07XG5cdHRoaXMubWlwbWFwcyA9IG1pcG1hcHM7XG5cblx0Ly8gbm8gZmxpcHBpbmcgZm9yIGN1YmUgdGV4dHVyZXNcblx0Ly8gKGFsc28gZmxpcHBpbmcgZG9lc24ndCB3b3JrIGZvciBjb21wcmVzc2VkIHRleHR1cmVzIClcblxuXHR0aGlzLmZsaXBZID0gZmFsc2U7XG5cblx0Ly8gY2FuJ3QgZ2VuZXJhdGUgbWlwbWFwcyBmb3IgY29tcHJlc3NlZCB0ZXh0dXJlc1xuXHQvLyBtaXBzIG11c3QgYmUgZW1iZWRkZWQgaW4gRERTIGZpbGVzXG5cblx0dGhpcy5nZW5lcmF0ZU1pcG1hcHMgPSBmYWxzZTtcblxufVxuXG5Db21wcmVzc2VkVGV4dHVyZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBUZXh0dXJlLnByb3RvdHlwZSApO1xuQ29tcHJlc3NlZFRleHR1cmUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ29tcHJlc3NlZFRleHR1cmU7XG5cbkNvbXByZXNzZWRUZXh0dXJlLnByb3RvdHlwZS5pc0NvbXByZXNzZWRUZXh0dXJlID0gdHJ1ZTtcblxuLyoqXG4gKiBAYXV0aG9yIE1hdHQgRGVzTGF1cmllcnMgLyBAbWF0dGRlc2xcbiAqIEBhdXRob3IgYXRpeCAvIGFydGh1cnNpbGJlci5kZVxuICovXG5cbmZ1bmN0aW9uIERlcHRoVGV4dHVyZSggd2lkdGgsIGhlaWdodCwgdHlwZSwgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIsIG1pbkZpbHRlciwgYW5pc290cm9weSwgZm9ybWF0ICkge1xuXG5cdGZvcm1hdCA9IGZvcm1hdCAhPT0gdW5kZWZpbmVkID8gZm9ybWF0IDogRGVwdGhGb3JtYXQ7XG5cblx0aWYgKCBmb3JtYXQgIT09IERlcHRoRm9ybWF0ICYmIGZvcm1hdCAhPT0gRGVwdGhTdGVuY2lsRm9ybWF0ICkge1xuXG5cdFx0dGhyb3cgbmV3IEVycm9yKCAnRGVwdGhUZXh0dXJlIGZvcm1hdCBtdXN0IGJlIGVpdGhlciBUSFJFRS5EZXB0aEZvcm1hdCBvciBUSFJFRS5EZXB0aFN0ZW5jaWxGb3JtYXQnICk7XG5cblx0fVxuXG5cdGlmICggdHlwZSA9PT0gdW5kZWZpbmVkICYmIGZvcm1hdCA9PT0gRGVwdGhGb3JtYXQgKSB0eXBlID0gVW5zaWduZWRTaG9ydFR5cGU7XG5cdGlmICggdHlwZSA9PT0gdW5kZWZpbmVkICYmIGZvcm1hdCA9PT0gRGVwdGhTdGVuY2lsRm9ybWF0ICkgdHlwZSA9IFVuc2lnbmVkSW50MjQ4VHlwZTtcblxuXHRUZXh0dXJlLmNhbGwoIHRoaXMsIG51bGwsIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGZvcm1hdCwgdHlwZSwgYW5pc290cm9weSApO1xuXG5cdHRoaXMuaW1hZ2UgPSB7IHdpZHRoOiB3aWR0aCwgaGVpZ2h0OiBoZWlnaHQgfTtcblxuXHR0aGlzLm1hZ0ZpbHRlciA9IG1hZ0ZpbHRlciAhPT0gdW5kZWZpbmVkID8gbWFnRmlsdGVyIDogTmVhcmVzdEZpbHRlcjtcblx0dGhpcy5taW5GaWx0ZXIgPSBtaW5GaWx0ZXIgIT09IHVuZGVmaW5lZCA/IG1pbkZpbHRlciA6IE5lYXJlc3RGaWx0ZXI7XG5cblx0dGhpcy5mbGlwWSA9IGZhbHNlO1xuXHR0aGlzLmdlbmVyYXRlTWlwbWFwc1x0PSBmYWxzZTtcblxufVxuXG5EZXB0aFRleHR1cmUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggVGV4dHVyZS5wcm90b3R5cGUgKTtcbkRlcHRoVGV4dHVyZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBEZXB0aFRleHR1cmU7XG5EZXB0aFRleHR1cmUucHJvdG90eXBlLmlzRGVwdGhUZXh0dXJlID0gdHJ1ZTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqL1xuXG5mdW5jdGlvbiBXaXJlZnJhbWVHZW9tZXRyeSggZ2VvbWV0cnkgKSB7XG5cblx0QnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdXaXJlZnJhbWVHZW9tZXRyeSc7XG5cblx0Ly8gYnVmZmVyXG5cblx0dmFyIHZlcnRpY2VzID0gW107XG5cblx0Ly8gaGVscGVyIHZhcmlhYmxlc1xuXG5cdHZhciBpLCBqLCBsLCBvLCBvbDtcblx0dmFyIGVkZ2UgPSBbIDAsIDAgXSwgZWRnZXMgPSB7fSwgZSwgZWRnZTEsIGVkZ2UyO1xuXHR2YXIga2V5LCBrZXlzID0gWyAnYScsICdiJywgJ2MnIF07XG5cdHZhciB2ZXJ0ZXg7XG5cblx0Ly8gZGlmZmVyZW50IGxvZ2ljIGZvciBHZW9tZXRyeSBhbmQgQnVmZmVyR2VvbWV0cnlcblxuXHRpZiAoIGdlb21ldHJ5ICYmIGdlb21ldHJ5LmlzR2VvbWV0cnkgKSB7XG5cblx0XHQvLyBjcmVhdGUgYSBkYXRhIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zIGFsbCBlZGdlcyB3aXRob3V0IGR1cGxpY2F0ZXNcblxuXHRcdHZhciBmYWNlcyA9IGdlb21ldHJ5LmZhY2VzO1xuXG5cdFx0Zm9yICggaSA9IDAsIGwgPSBmYWNlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgZmFjZSA9IGZhY2VzWyBpIF07XG5cblx0XHRcdGZvciAoIGogPSAwOyBqIDwgMzsgaiArKyApIHtcblxuXHRcdFx0XHRlZGdlMSA9IGZhY2VbIGtleXNbIGogXSBdO1xuXHRcdFx0XHRlZGdlMiA9IGZhY2VbIGtleXNbICggaiArIDEgKSAlIDMgXSBdO1xuXHRcdFx0XHRlZGdlWyAwIF0gPSBNYXRoLm1pbiggZWRnZTEsIGVkZ2UyICk7IC8vIHNvcnRpbmcgcHJldmVudHMgZHVwbGljYXRlc1xuXHRcdFx0XHRlZGdlWyAxIF0gPSBNYXRoLm1heCggZWRnZTEsIGVkZ2UyICk7XG5cblx0XHRcdFx0a2V5ID0gZWRnZVsgMCBdICsgJywnICsgZWRnZVsgMSBdO1xuXG5cdFx0XHRcdGlmICggZWRnZXNbIGtleSBdID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRlZGdlc1sga2V5IF0gPSB7IGluZGV4MTogZWRnZVsgMCBdLCBpbmRleDI6IGVkZ2VbIDEgXSB9O1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gZ2VuZXJhdGUgdmVydGljZXNcblxuXHRcdGZvciAoIGtleSBpbiBlZGdlcyApIHtcblxuXHRcdFx0ZSA9IGVkZ2VzWyBrZXkgXTtcblxuXHRcdFx0dmVydGV4ID0gZ2VvbWV0cnkudmVydGljZXNbIGUuaW5kZXgxIF07XG5cdFx0XHR2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7XG5cblx0XHRcdHZlcnRleCA9IGdlb21ldHJ5LnZlcnRpY2VzWyBlLmluZGV4MiBdO1xuXHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0fVxuXG5cdH0gZWxzZSBpZiAoIGdlb21ldHJ5ICYmIGdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgKSB7XG5cblx0XHR2YXIgcG9zaXRpb24sIGluZGljZXMsIGdyb3Vwcztcblx0XHR2YXIgZ3JvdXAsIHN0YXJ0LCBjb3VudDtcblx0XHR2YXIgaW5kZXgxLCBpbmRleDI7XG5cblx0XHR2ZXJ0ZXggPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0aWYgKCBnZW9tZXRyeS5pbmRleCAhPT0gbnVsbCApIHtcblxuXHRcdFx0Ly8gaW5kZXhlZCBCdWZmZXJHZW9tZXRyeVxuXG5cdFx0XHRwb3NpdGlvbiA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247XG5cdFx0XHRpbmRpY2VzID0gZ2VvbWV0cnkuaW5kZXg7XG5cdFx0XHRncm91cHMgPSBnZW9tZXRyeS5ncm91cHM7XG5cblx0XHRcdGlmICggZ3JvdXBzLmxlbmd0aCA9PT0gMCApIHtcblxuXHRcdFx0XHRncm91cHMgPSBbIHsgc3RhcnQ6IDAsIGNvdW50OiBpbmRpY2VzLmNvdW50LCBtYXRlcmlhbEluZGV4OiAwIH0gXTtcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBjcmVhdGUgYSBkYXRhIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zIGFsbCBlZ2VzIHdpdGhvdXQgZHVwbGljYXRlc1xuXG5cdFx0XHRmb3IgKCBvID0gMCwgb2wgPSBncm91cHMubGVuZ3RoOyBvIDwgb2w7ICsrIG8gKSB7XG5cblx0XHRcdFx0Z3JvdXAgPSBncm91cHNbIG8gXTtcblxuXHRcdFx0XHRzdGFydCA9IGdyb3VwLnN0YXJ0O1xuXHRcdFx0XHRjb3VudCA9IGdyb3VwLmNvdW50O1xuXG5cdFx0XHRcdGZvciAoIGkgPSBzdGFydCwgbCA9ICggc3RhcnQgKyBjb3VudCApOyBpIDwgbDsgaSArPSAzICkge1xuXG5cdFx0XHRcdFx0Zm9yICggaiA9IDA7IGogPCAzOyBqICsrICkge1xuXG5cdFx0XHRcdFx0XHRlZGdlMSA9IGluZGljZXMuZ2V0WCggaSArIGogKTtcblx0XHRcdFx0XHRcdGVkZ2UyID0gaW5kaWNlcy5nZXRYKCBpICsgKCBqICsgMSApICUgMyApO1xuXHRcdFx0XHRcdFx0ZWRnZVsgMCBdID0gTWF0aC5taW4oIGVkZ2UxLCBlZGdlMiApOyAvLyBzb3J0aW5nIHByZXZlbnRzIGR1cGxpY2F0ZXNcblx0XHRcdFx0XHRcdGVkZ2VbIDEgXSA9IE1hdGgubWF4KCBlZGdlMSwgZWRnZTIgKTtcblxuXHRcdFx0XHRcdFx0a2V5ID0gZWRnZVsgMCBdICsgJywnICsgZWRnZVsgMSBdO1xuXG5cdFx0XHRcdFx0XHRpZiAoIGVkZ2VzWyBrZXkgXSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0XHRcdGVkZ2VzWyBrZXkgXSA9IHsgaW5kZXgxOiBlZGdlWyAwIF0sIGluZGV4MjogZWRnZVsgMSBdIH07XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gZ2VuZXJhdGUgdmVydGljZXNcblxuXHRcdFx0Zm9yICgga2V5IGluIGVkZ2VzICkge1xuXG5cdFx0XHRcdGUgPSBlZGdlc1sga2V5IF07XG5cblx0XHRcdFx0dmVydGV4LmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uLCBlLmluZGV4MSApO1xuXHRcdFx0XHR2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7XG5cblx0XHRcdFx0dmVydGV4LmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uLCBlLmluZGV4MiApO1xuXHRcdFx0XHR2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIG5vbi1pbmRleGVkIEJ1ZmZlckdlb21ldHJ5XG5cblx0XHRcdHBvc2l0aW9uID0gZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbjtcblxuXHRcdFx0Zm9yICggaSA9IDAsIGwgPSAoIHBvc2l0aW9uLmNvdW50IC8gMyApOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRmb3IgKCBqID0gMDsgaiA8IDM7IGogKysgKSB7XG5cblx0XHRcdFx0XHQvLyB0aHJlZSBlZGdlcyBwZXIgdHJpYW5nbGUsIGFuIGVkZ2UgaXMgcmVwcmVzZW50ZWQgYXMgKGluZGV4MSwgaW5kZXgyKVxuXHRcdFx0XHRcdC8vIGUuZy4gdGhlIGZpcnN0IHRyaWFuZ2xlIGhhcyB0aGUgZm9sbG93aW5nIGVkZ2VzOiAoMCwxKSwoMSwyKSwoMiwwKVxuXG5cdFx0XHRcdFx0aW5kZXgxID0gMyAqIGkgKyBqO1xuXHRcdFx0XHRcdHZlcnRleC5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbiwgaW5kZXgxICk7XG5cdFx0XHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0XHRcdFx0aW5kZXgyID0gMyAqIGkgKyAoICggaiArIDEgKSAlIDMgKTtcblx0XHRcdFx0XHR2ZXJ0ZXguZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb24sIGluZGV4MiApO1xuXHRcdFx0XHRcdHZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gYnVpbGQgZ2VvbWV0cnlcblxuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcblxufVxuXG5XaXJlZnJhbWVHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTtcbldpcmVmcmFtZUdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFdpcmVmcmFtZUdlb21ldHJ5O1xuXG4vKipcbiAqIEBhdXRob3Igeno4NSAvIGh0dHBzOi8vZ2l0aHViLmNvbS96ejg1XG4gKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44N1xuICpcbiAqIFBhcmFtZXRyaWMgU3VyZmFjZXMgR2VvbWV0cnlcbiAqIGJhc2VkIG9uIHRoZSBicmlsbGlhbnQgYXJ0aWNsZSBieSBAcHJpZGVvdXQgaHR0cDovL3ByaWRlb3V0Lm5ldC9ibG9nLz9wPTQ0XG4gKi9cblxuLy8gUGFyYW1ldHJpY0dlb21ldHJ5XG5cbmZ1bmN0aW9uIFBhcmFtZXRyaWNHZW9tZXRyeSggZnVuYywgc2xpY2VzLCBzdGFja3MgKSB7XG5cblx0R2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdQYXJhbWV0cmljR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRmdW5jOiBmdW5jLFxuXHRcdHNsaWNlczogc2xpY2VzLFxuXHRcdHN0YWNrczogc3RhY2tzXG5cdH07XG5cblx0dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIG5ldyBQYXJhbWV0cmljQnVmZmVyR2VvbWV0cnkoIGZ1bmMsIHNsaWNlcywgc3RhY2tzICkgKTtcblx0dGhpcy5tZXJnZVZlcnRpY2VzKCk7XG5cbn1cblxuUGFyYW1ldHJpY0dlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEdlb21ldHJ5LnByb3RvdHlwZSApO1xuUGFyYW1ldHJpY0dlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFBhcmFtZXRyaWNHZW9tZXRyeTtcblxuLy8gUGFyYW1ldHJpY0J1ZmZlckdlb21ldHJ5XG5cbmZ1bmN0aW9uIFBhcmFtZXRyaWNCdWZmZXJHZW9tZXRyeSggZnVuYywgc2xpY2VzLCBzdGFja3MgKSB7XG5cblx0QnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdQYXJhbWV0cmljQnVmZmVyR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRmdW5jOiBmdW5jLFxuXHRcdHNsaWNlczogc2xpY2VzLFxuXHRcdHN0YWNrczogc3RhY2tzXG5cdH07XG5cblx0Ly8gYnVmZmVyc1xuXG5cdHZhciBpbmRpY2VzID0gW107XG5cdHZhciB2ZXJ0aWNlcyA9IFtdO1xuXHR2YXIgbm9ybWFscyA9IFtdO1xuXHR2YXIgdXZzID0gW107XG5cblx0dmFyIEVQUyA9IDAuMDAwMDE7XG5cblx0dmFyIG5vcm1hbCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0dmFyIHAwID0gbmV3IFZlY3RvcjMoKSwgcDEgPSBuZXcgVmVjdG9yMygpO1xuXHR2YXIgcHUgPSBuZXcgVmVjdG9yMygpLCBwdiA9IG5ldyBWZWN0b3IzKCk7XG5cblx0dmFyIGksIGo7XG5cblx0Ly8gZ2VuZXJhdGUgdmVydGljZXMsIG5vcm1hbHMgYW5kIHV2c1xuXG5cdHZhciBzbGljZUNvdW50ID0gc2xpY2VzICsgMTtcblxuXHRmb3IgKCBpID0gMDsgaSA8PSBzdGFja3M7IGkgKysgKSB7XG5cblx0XHR2YXIgdiA9IGkgLyBzdGFja3M7XG5cblx0XHRmb3IgKCBqID0gMDsgaiA8PSBzbGljZXM7IGogKysgKSB7XG5cblx0XHRcdHZhciB1ID0gaiAvIHNsaWNlcztcblxuXHRcdFx0Ly8gdmVydGV4XG5cblx0XHRcdGZ1bmMoIHUsIHYsIHAwICk7XG5cdFx0XHR2ZXJ0aWNlcy5wdXNoKCBwMC54LCBwMC55LCBwMC56ICk7XG5cblx0XHRcdC8vIG5vcm1hbFxuXG5cdFx0XHQvLyBhcHByb3hpbWF0ZSB0YW5nZW50IHZlY3RvcnMgdmlhIGZpbml0ZSBkaWZmZXJlbmNlc1xuXG5cdFx0XHRpZiAoIHUgLSBFUFMgPj0gMCApIHtcblxuXHRcdFx0XHRmdW5jKCB1IC0gRVBTLCB2LCBwMSApO1xuXHRcdFx0XHRwdS5zdWJWZWN0b3JzKCBwMCwgcDEgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRmdW5jKCB1ICsgRVBTLCB2LCBwMSApO1xuXHRcdFx0XHRwdS5zdWJWZWN0b3JzKCBwMSwgcDAgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHYgLSBFUFMgPj0gMCApIHtcblxuXHRcdFx0XHRmdW5jKCB1LCB2IC0gRVBTLCBwMSApO1xuXHRcdFx0XHRwdi5zdWJWZWN0b3JzKCBwMCwgcDEgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRmdW5jKCB1LCB2ICsgRVBTLCBwMSApO1xuXHRcdFx0XHRwdi5zdWJWZWN0b3JzKCBwMSwgcDAgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBjcm9zcyBwcm9kdWN0IG9mIHRhbmdlbnQgdmVjdG9ycyByZXR1cm5zIHN1cmZhY2Ugbm9ybWFsXG5cblx0XHRcdG5vcm1hbC5jcm9zc1ZlY3RvcnMoIHB1LCBwdiApLm5vcm1hbGl6ZSgpO1xuXHRcdFx0bm9ybWFscy5wdXNoKCBub3JtYWwueCwgbm9ybWFsLnksIG5vcm1hbC56ICk7XG5cblx0XHRcdC8vIHV2XG5cblx0XHRcdHV2cy5wdXNoKCB1LCB2ICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIGdlbmVyYXRlIGluZGljZXNcblxuXHRmb3IgKCBpID0gMDsgaSA8IHN0YWNrczsgaSArKyApIHtcblxuXHRcdGZvciAoIGogPSAwOyBqIDwgc2xpY2VzOyBqICsrICkge1xuXG5cdFx0XHR2YXIgYSA9IGkgKiBzbGljZUNvdW50ICsgajtcblx0XHRcdHZhciBiID0gaSAqIHNsaWNlQ291bnQgKyBqICsgMTtcblx0XHRcdHZhciBjID0gKCBpICsgMSApICogc2xpY2VDb3VudCArIGogKyAxO1xuXHRcdFx0dmFyIGQgPSAoIGkgKyAxICkgKiBzbGljZUNvdW50ICsgajtcblxuXHRcdFx0Ly8gZmFjZXMgb25lIGFuZCB0d29cblxuXHRcdFx0aW5kaWNlcy5wdXNoKCBhLCBiLCBkICk7XG5cdFx0XHRpbmRpY2VzLnB1c2goIGIsIGMsIGQgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gYnVpbGQgZ2VvbWV0cnlcblxuXHR0aGlzLnNldEluZGV4KCBpbmRpY2VzICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBub3JtYWxzLCAzICkgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICd1dicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB1dnMsIDIgKSApO1xuXG59XG5cblBhcmFtZXRyaWNCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTtcblBhcmFtZXRyaWNCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBQYXJhbWV0cmljQnVmZmVyR2VvbWV0cnk7XG5cbi8qKlxuICogQGF1dGhvciBjbG9ja3dvcmtnZWVrIC8gaHR0cHM6Ly9naXRodWIuY29tL2Nsb2Nrd29ya2dlZWtcbiAqIEBhdXRob3IgdGltb3RoeXByYXRsZXkgLyBodHRwczovL2dpdGh1Yi5jb20vdGltb3RoeXByYXRsZXlcbiAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleVxuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqL1xuXG4vLyBQb2x5aGVkcm9uR2VvbWV0cnlcblxuZnVuY3Rpb24gUG9seWhlZHJvbkdlb21ldHJ5KCB2ZXJ0aWNlcywgaW5kaWNlcywgcmFkaXVzLCBkZXRhaWwgKSB7XG5cblx0R2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdQb2x5aGVkcm9uR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHR2ZXJ0aWNlczogdmVydGljZXMsXG5cdFx0aW5kaWNlczogaW5kaWNlcyxcblx0XHRyYWRpdXM6IHJhZGl1cyxcblx0XHRkZXRhaWw6IGRldGFpbFxuXHR9O1xuXG5cdHRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5KCB2ZXJ0aWNlcywgaW5kaWNlcywgcmFkaXVzLCBkZXRhaWwgKSApO1xuXHR0aGlzLm1lcmdlVmVydGljZXMoKTtcblxufVxuXG5Qb2x5aGVkcm9uR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7XG5Qb2x5aGVkcm9uR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUG9seWhlZHJvbkdlb21ldHJ5O1xuXG4vLyBQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnlcblxuZnVuY3Rpb24gUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5KCB2ZXJ0aWNlcywgaW5kaWNlcywgcmFkaXVzLCBkZXRhaWwgKSB7XG5cblx0QnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHR2ZXJ0aWNlczogdmVydGljZXMsXG5cdFx0aW5kaWNlczogaW5kaWNlcyxcblx0XHRyYWRpdXM6IHJhZGl1cyxcblx0XHRkZXRhaWw6IGRldGFpbFxuXHR9O1xuXG5cdHJhZGl1cyA9IHJhZGl1cyB8fCAxO1xuXHRkZXRhaWwgPSBkZXRhaWwgfHwgMDtcblxuXHQvLyBkZWZhdWx0IGJ1ZmZlciBkYXRhXG5cblx0dmFyIHZlcnRleEJ1ZmZlciA9IFtdO1xuXHR2YXIgdXZCdWZmZXIgPSBbXTtcblxuXHQvLyB0aGUgc3ViZGl2aXNpb24gY3JlYXRlcyB0aGUgdmVydGV4IGJ1ZmZlciBkYXRhXG5cblx0c3ViZGl2aWRlKCBkZXRhaWwgKTtcblxuXHQvLyBhbGwgdmVydGljZXMgc2hvdWxkIGxpZSBvbiBhIGNvbmNlcHR1YWwgc3BoZXJlIHdpdGggYSBnaXZlbiByYWRpdXNcblxuXHRhcHBwbHlSYWRpdXMoIHJhZGl1cyApO1xuXG5cdC8vIGZpbmFsbHksIGNyZWF0ZSB0aGUgdXYgZGF0YVxuXG5cdGdlbmVyYXRlVVZzKCk7XG5cblx0Ly8gYnVpbGQgbm9uLWluZGV4ZWQgZ2VvbWV0cnlcblxuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRleEJ1ZmZlciwgMyApICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRleEJ1ZmZlci5zbGljZSgpLCAzICkgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICd1dicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB1dkJ1ZmZlciwgMiApICk7XG5cblx0aWYgKCBkZXRhaWwgPT09IDAgKSB7XG5cblx0XHR0aGlzLmNvbXB1dGVWZXJ0ZXhOb3JtYWxzKCk7IC8vIGZsYXQgbm9ybWFsc1xuXG5cdH0gZWxzZSB7XG5cblx0XHR0aGlzLm5vcm1hbGl6ZU5vcm1hbHMoKTsgLy8gc21vb3RoIG5vcm1hbHNcblxuXHR9XG5cblx0Ly8gaGVscGVyIGZ1bmN0aW9uc1xuXG5cdGZ1bmN0aW9uIHN1YmRpdmlkZSggZGV0YWlsICkge1xuXG5cdFx0dmFyIGEgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciBiID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgYyA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHQvLyBpdGVyYXRlIG92ZXIgYWxsIGZhY2VzIGFuZCBhcHBseSBhIHN1YmRpdmlzb24gd2l0aCB0aGUgZ2l2ZW4gZGV0YWlsIHZhbHVlXG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBpbmRpY2VzLmxlbmd0aDsgaSArPSAzICkge1xuXG5cdFx0XHQvLyBnZXQgdGhlIHZlcnRpY2VzIG9mIHRoZSBmYWNlXG5cblx0XHRcdGdldFZlcnRleEJ5SW5kZXgoIGluZGljZXNbIGkgKyAwIF0sIGEgKTtcblx0XHRcdGdldFZlcnRleEJ5SW5kZXgoIGluZGljZXNbIGkgKyAxIF0sIGIgKTtcblx0XHRcdGdldFZlcnRleEJ5SW5kZXgoIGluZGljZXNbIGkgKyAyIF0sIGMgKTtcblxuXHRcdFx0Ly8gcGVyZm9ybSBzdWJkaXZpc2lvblxuXG5cdFx0XHRzdWJkaXZpZGVGYWNlKCBhLCBiLCBjLCBkZXRhaWwgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gc3ViZGl2aWRlRmFjZSggYSwgYiwgYywgZGV0YWlsICkge1xuXG5cdFx0dmFyIGNvbHMgPSBNYXRoLnBvdyggMiwgZGV0YWlsICk7XG5cblx0XHQvLyB3ZSB1c2UgdGhpcyBtdWx0aWRpbWVuc2lvbmFsIGFycmF5IGFzIGEgZGF0YSBzdHJ1Y3R1cmUgZm9yIGNyZWF0aW5nIHRoZSBzdWJkaXZpc2lvblxuXG5cdFx0dmFyIHYgPSBbXTtcblxuXHRcdHZhciBpLCBqO1xuXG5cdFx0Ly8gY29uc3RydWN0IGFsbCBvZiB0aGUgdmVydGljZXMgZm9yIHRoaXMgc3ViZGl2aXNpb25cblxuXHRcdGZvciAoIGkgPSAwOyBpIDw9IGNvbHM7IGkgKysgKSB7XG5cblx0XHRcdHZbIGkgXSA9IFtdO1xuXG5cdFx0XHR2YXIgYWogPSBhLmNsb25lKCkubGVycCggYywgaSAvIGNvbHMgKTtcblx0XHRcdHZhciBiaiA9IGIuY2xvbmUoKS5sZXJwKCBjLCBpIC8gY29scyApO1xuXG5cdFx0XHR2YXIgcm93cyA9IGNvbHMgLSBpO1xuXG5cdFx0XHRmb3IgKCBqID0gMDsgaiA8PSByb3dzOyBqICsrICkge1xuXG5cdFx0XHRcdGlmICggaiA9PT0gMCAmJiBpID09PSBjb2xzICkge1xuXG5cdFx0XHRcdFx0dlsgaSBdWyBqIF0gPSBhajtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0dlsgaSBdWyBqIF0gPSBhai5jbG9uZSgpLmxlcnAoIGJqLCBqIC8gcm93cyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gY29uc3RydWN0IGFsbCBvZiB0aGUgZmFjZXNcblxuXHRcdGZvciAoIGkgPSAwOyBpIDwgY29sczsgaSArKyApIHtcblxuXHRcdFx0Zm9yICggaiA9IDA7IGogPCAyICogKCBjb2xzIC0gaSApIC0gMTsgaiArKyApIHtcblxuXHRcdFx0XHR2YXIgayA9IE1hdGguZmxvb3IoIGogLyAyICk7XG5cblx0XHRcdFx0aWYgKCBqICUgMiA9PT0gMCApIHtcblxuXHRcdFx0XHRcdHB1c2hWZXJ0ZXgoIHZbIGkgXVsgayArIDEgXSApO1xuXHRcdFx0XHRcdHB1c2hWZXJ0ZXgoIHZbIGkgKyAxIF1bIGsgXSApO1xuXHRcdFx0XHRcdHB1c2hWZXJ0ZXgoIHZbIGkgXVsgayBdICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHB1c2hWZXJ0ZXgoIHZbIGkgXVsgayArIDEgXSApO1xuXHRcdFx0XHRcdHB1c2hWZXJ0ZXgoIHZbIGkgKyAxIF1bIGsgKyAxIF0gKTtcblx0XHRcdFx0XHRwdXNoVmVydGV4KCB2WyBpICsgMSBdWyBrIF0gKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gYXBwcGx5UmFkaXVzKCByYWRpdXMgKSB7XG5cblx0XHR2YXIgdmVydGV4ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdC8vIGl0ZXJhdGUgb3ZlciB0aGUgZW50aXJlIGJ1ZmZlciBhbmQgYXBwbHkgdGhlIHJhZGl1cyB0byBlYWNoIHZlcnRleFxuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgdmVydGV4QnVmZmVyLmxlbmd0aDsgaSArPSAzICkge1xuXG5cdFx0XHR2ZXJ0ZXgueCA9IHZlcnRleEJ1ZmZlclsgaSArIDAgXTtcblx0XHRcdHZlcnRleC55ID0gdmVydGV4QnVmZmVyWyBpICsgMSBdO1xuXHRcdFx0dmVydGV4LnogPSB2ZXJ0ZXhCdWZmZXJbIGkgKyAyIF07XG5cblx0XHRcdHZlcnRleC5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhciggcmFkaXVzICk7XG5cblx0XHRcdHZlcnRleEJ1ZmZlclsgaSArIDAgXSA9IHZlcnRleC54O1xuXHRcdFx0dmVydGV4QnVmZmVyWyBpICsgMSBdID0gdmVydGV4Lnk7XG5cdFx0XHR2ZXJ0ZXhCdWZmZXJbIGkgKyAyIF0gPSB2ZXJ0ZXguejtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gZ2VuZXJhdGVVVnMoKSB7XG5cblx0XHR2YXIgdmVydGV4ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IHZlcnRleEJ1ZmZlci5sZW5ndGg7IGkgKz0gMyApIHtcblxuXHRcdFx0dmVydGV4LnggPSB2ZXJ0ZXhCdWZmZXJbIGkgKyAwIF07XG5cdFx0XHR2ZXJ0ZXgueSA9IHZlcnRleEJ1ZmZlclsgaSArIDEgXTtcblx0XHRcdHZlcnRleC56ID0gdmVydGV4QnVmZmVyWyBpICsgMiBdO1xuXG5cdFx0XHR2YXIgdSA9IGF6aW11dGgoIHZlcnRleCApIC8gMiAvIE1hdGguUEkgKyAwLjU7XG5cdFx0XHR2YXIgdiA9IGluY2xpbmF0aW9uKCB2ZXJ0ZXggKSAvIE1hdGguUEkgKyAwLjU7XG5cdFx0XHR1dkJ1ZmZlci5wdXNoKCB1LCAxIC0gdiApO1xuXG5cdFx0fVxuXG5cdFx0Y29ycmVjdFVWcygpO1xuXG5cdFx0Y29ycmVjdFNlYW0oKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gY29ycmVjdFNlYW0oKSB7XG5cblx0XHQvLyBoYW5kbGUgY2FzZSB3aGVuIGZhY2Ugc3RyYWRkbGVzIHRoZSBzZWFtLCBzZWUgIzMyNjlcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IHV2QnVmZmVyLmxlbmd0aDsgaSArPSA2ICkge1xuXG5cdFx0XHQvLyB1diBkYXRhIG9mIGEgc2luZ2xlIGZhY2VcblxuXHRcdFx0dmFyIHgwID0gdXZCdWZmZXJbIGkgKyAwIF07XG5cdFx0XHR2YXIgeDEgPSB1dkJ1ZmZlclsgaSArIDIgXTtcblx0XHRcdHZhciB4MiA9IHV2QnVmZmVyWyBpICsgNCBdO1xuXG5cdFx0XHR2YXIgbWF4ID0gTWF0aC5tYXgoIHgwLCB4MSwgeDIgKTtcblx0XHRcdHZhciBtaW4gPSBNYXRoLm1pbiggeDAsIHgxLCB4MiApO1xuXG5cdFx0XHQvLyAwLjkgaXMgc29tZXdoYXQgYXJiaXRyYXJ5XG5cblx0XHRcdGlmICggbWF4ID4gMC45ICYmIG1pbiA8IDAuMSApIHtcblxuXHRcdFx0XHRpZiAoIHgwIDwgMC4yICkgdXZCdWZmZXJbIGkgKyAwIF0gKz0gMTtcblx0XHRcdFx0aWYgKCB4MSA8IDAuMiApIHV2QnVmZmVyWyBpICsgMiBdICs9IDE7XG5cdFx0XHRcdGlmICggeDIgPCAwLjIgKSB1dkJ1ZmZlclsgaSArIDQgXSArPSAxO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHB1c2hWZXJ0ZXgoIHZlcnRleCApIHtcblxuXHRcdHZlcnRleEJ1ZmZlci5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGdldFZlcnRleEJ5SW5kZXgoIGluZGV4LCB2ZXJ0ZXggKSB7XG5cblx0XHR2YXIgc3RyaWRlID0gaW5kZXggKiAzO1xuXG5cdFx0dmVydGV4LnggPSB2ZXJ0aWNlc1sgc3RyaWRlICsgMCBdO1xuXHRcdHZlcnRleC55ID0gdmVydGljZXNbIHN0cmlkZSArIDEgXTtcblx0XHR2ZXJ0ZXgueiA9IHZlcnRpY2VzWyBzdHJpZGUgKyAyIF07XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGNvcnJlY3RVVnMoKSB7XG5cblx0XHR2YXIgYSA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIGIgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciBjID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHZhciBjZW50cm9pZCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR2YXIgdXZBID0gbmV3IFZlY3RvcjIoKTtcblx0XHR2YXIgdXZCID0gbmV3IFZlY3RvcjIoKTtcblx0XHR2YXIgdXZDID0gbmV3IFZlY3RvcjIoKTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgaiA9IDA7IGkgPCB2ZXJ0ZXhCdWZmZXIubGVuZ3RoOyBpICs9IDksIGogKz0gNiApIHtcblxuXHRcdFx0YS5zZXQoIHZlcnRleEJ1ZmZlclsgaSArIDAgXSwgdmVydGV4QnVmZmVyWyBpICsgMSBdLCB2ZXJ0ZXhCdWZmZXJbIGkgKyAyIF0gKTtcblx0XHRcdGIuc2V0KCB2ZXJ0ZXhCdWZmZXJbIGkgKyAzIF0sIHZlcnRleEJ1ZmZlclsgaSArIDQgXSwgdmVydGV4QnVmZmVyWyBpICsgNSBdICk7XG5cdFx0XHRjLnNldCggdmVydGV4QnVmZmVyWyBpICsgNiBdLCB2ZXJ0ZXhCdWZmZXJbIGkgKyA3IF0sIHZlcnRleEJ1ZmZlclsgaSArIDggXSApO1xuXG5cdFx0XHR1dkEuc2V0KCB1dkJ1ZmZlclsgaiArIDAgXSwgdXZCdWZmZXJbIGogKyAxIF0gKTtcblx0XHRcdHV2Qi5zZXQoIHV2QnVmZmVyWyBqICsgMiBdLCB1dkJ1ZmZlclsgaiArIDMgXSApO1xuXHRcdFx0dXZDLnNldCggdXZCdWZmZXJbIGogKyA0IF0sIHV2QnVmZmVyWyBqICsgNSBdICk7XG5cblx0XHRcdGNlbnRyb2lkLmNvcHkoIGEgKS5hZGQoIGIgKS5hZGQoIGMgKS5kaXZpZGVTY2FsYXIoIDMgKTtcblxuXHRcdFx0dmFyIGF6aSA9IGF6aW11dGgoIGNlbnRyb2lkICk7XG5cblx0XHRcdGNvcnJlY3RVViggdXZBLCBqICsgMCwgYSwgYXppICk7XG5cdFx0XHRjb3JyZWN0VVYoIHV2QiwgaiArIDIsIGIsIGF6aSApO1xuXHRcdFx0Y29ycmVjdFVWKCB1dkMsIGogKyA0LCBjLCBhemkgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gY29ycmVjdFVWKCB1diwgc3RyaWRlLCB2ZWN0b3IsIGF6aW11dGggKSB7XG5cblx0XHRpZiAoICggYXppbXV0aCA8IDAgKSAmJiAoIHV2LnggPT09IDEgKSApIHtcblxuXHRcdFx0dXZCdWZmZXJbIHN0cmlkZSBdID0gdXYueCAtIDE7XG5cblx0XHR9XG5cblx0XHRpZiAoICggdmVjdG9yLnggPT09IDAgKSAmJiAoIHZlY3Rvci56ID09PSAwICkgKSB7XG5cblx0XHRcdHV2QnVmZmVyWyBzdHJpZGUgXSA9IGF6aW11dGggLyAyIC8gTWF0aC5QSSArIDAuNTtcblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gQW5nbGUgYXJvdW5kIHRoZSBZIGF4aXMsIGNvdW50ZXItY2xvY2t3aXNlIHdoZW4gbG9va2luZyBmcm9tIGFib3ZlLlxuXG5cdGZ1bmN0aW9uIGF6aW11dGgoIHZlY3RvciApIHtcblxuXHRcdHJldHVybiBNYXRoLmF0YW4yKCB2ZWN0b3IueiwgLSB2ZWN0b3IueCApO1xuXG5cdH1cblxuXG5cdC8vIEFuZ2xlIGFib3ZlIHRoZSBYWiBwbGFuZS5cblxuXHRmdW5jdGlvbiBpbmNsaW5hdGlvbiggdmVjdG9yICkge1xuXG5cdFx0cmV0dXJuIE1hdGguYXRhbjIoIC0gdmVjdG9yLnksIE1hdGguc3FydCggKCB2ZWN0b3IueCAqIHZlY3Rvci54ICkgKyAoIHZlY3Rvci56ICogdmVjdG9yLnogKSApICk7XG5cblx0fVxuXG59XG5cblBvbHloZWRyb25CdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTtcblBvbHloZWRyb25CdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnk7XG5cbi8qKlxuICogQGF1dGhvciB0aW1vdGh5cHJhdGxleSAvIGh0dHBzOi8vZ2l0aHViLmNvbS90aW1vdGh5cHJhdGxleVxuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqL1xuXG4vLyBUZXRyYWhlZHJvbkdlb21ldHJ5XG5cbmZ1bmN0aW9uIFRldHJhaGVkcm9uR2VvbWV0cnkoIHJhZGl1cywgZGV0YWlsICkge1xuXG5cdEdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnVGV0cmFoZWRyb25HZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdGRldGFpbDogZGV0YWlsXG5cdH07XG5cblx0dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIG5ldyBUZXRyYWhlZHJvbkJ1ZmZlckdlb21ldHJ5KCByYWRpdXMsIGRldGFpbCApICk7XG5cdHRoaXMubWVyZ2VWZXJ0aWNlcygpO1xuXG59XG5cblRldHJhaGVkcm9uR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7XG5UZXRyYWhlZHJvbkdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFRldHJhaGVkcm9uR2VvbWV0cnk7XG5cbi8vIFRldHJhaGVkcm9uQnVmZmVyR2VvbWV0cnlcblxuZnVuY3Rpb24gVGV0cmFoZWRyb25CdWZmZXJHZW9tZXRyeSggcmFkaXVzLCBkZXRhaWwgKSB7XG5cblx0dmFyIHZlcnRpY2VzID0gW1xuXHRcdDEsIDEsIDEsIFx0LSAxLCAtIDEsIDEsIFx0LSAxLCAxLCAtIDEsIFx0MSwgLSAxLCAtIDFcblx0XTtcblxuXHR2YXIgaW5kaWNlcyA9IFtcblx0XHQyLCAxLCAwLCBcdDAsIDMsIDIsXHQxLCAzLCAwLFx0MiwgMywgMVxuXHRdO1xuXG5cdFBvbHloZWRyb25CdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzLCB2ZXJ0aWNlcywgaW5kaWNlcywgcmFkaXVzLCBkZXRhaWwgKTtcblxuXHR0aGlzLnR5cGUgPSAnVGV0cmFoZWRyb25CdWZmZXJHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdGRldGFpbDogZGV0YWlsXG5cdH07XG5cbn1cblxuVGV0cmFoZWRyb25CdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7XG5UZXRyYWhlZHJvbkJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFRldHJhaGVkcm9uQnVmZmVyR2VvbWV0cnk7XG5cbi8qKlxuICogQGF1dGhvciB0aW1vdGh5cHJhdGxleSAvIGh0dHBzOi8vZ2l0aHViLmNvbS90aW1vdGh5cHJhdGxleVxuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqL1xuXG4vLyBPY3RhaGVkcm9uR2VvbWV0cnlcblxuZnVuY3Rpb24gT2N0YWhlZHJvbkdlb21ldHJ5KCByYWRpdXMsIGRldGFpbCApIHtcblxuXHRHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ09jdGFoZWRyb25HZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdGRldGFpbDogZGV0YWlsXG5cdH07XG5cblx0dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIG5ldyBPY3RhaGVkcm9uQnVmZmVyR2VvbWV0cnkoIHJhZGl1cywgZGV0YWlsICkgKTtcblx0dGhpcy5tZXJnZVZlcnRpY2VzKCk7XG5cbn1cblxuT2N0YWhlZHJvbkdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEdlb21ldHJ5LnByb3RvdHlwZSApO1xuT2N0YWhlZHJvbkdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE9jdGFoZWRyb25HZW9tZXRyeTtcblxuLy8gT2N0YWhlZHJvbkJ1ZmZlckdlb21ldHJ5XG5cbmZ1bmN0aW9uIE9jdGFoZWRyb25CdWZmZXJHZW9tZXRyeSggcmFkaXVzLCBkZXRhaWwgKSB7XG5cblx0dmFyIHZlcnRpY2VzID0gW1xuXHRcdDEsIDAsIDAsIFx0LSAxLCAwLCAwLFx0MCwgMSwgMCxcblx0XHQwLCAtIDEsIDAsIFx0MCwgMCwgMSxcdDAsIDAsIC0gMVxuXHRdO1xuXG5cdHZhciBpbmRpY2VzID0gW1xuXHRcdDAsIDIsIDQsXHQwLCA0LCAzLFx0MCwgMywgNSxcblx0XHQwLCA1LCAyLFx0MSwgMiwgNSxcdDEsIDUsIDMsXG5cdFx0MSwgMywgNCxcdDEsIDQsIDJcblx0XTtcblxuXHRQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcywgdmVydGljZXMsIGluZGljZXMsIHJhZGl1cywgZGV0YWlsICk7XG5cblx0dGhpcy50eXBlID0gJ09jdGFoZWRyb25CdWZmZXJHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdGRldGFpbDogZGV0YWlsXG5cdH07XG5cbn1cblxuT2N0YWhlZHJvbkJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIFBvbHloZWRyb25CdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTtcbk9jdGFoZWRyb25CdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBPY3RhaGVkcm9uQnVmZmVyR2VvbWV0cnk7XG5cbi8qKlxuICogQGF1dGhvciB0aW1vdGh5cHJhdGxleSAvIGh0dHBzOi8vZ2l0aHViLmNvbS90aW1vdGh5cHJhdGxleVxuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqL1xuXG4vLyBJY29zYWhlZHJvbkdlb21ldHJ5XG5cbmZ1bmN0aW9uIEljb3NhaGVkcm9uR2VvbWV0cnkoIHJhZGl1cywgZGV0YWlsICkge1xuXG5cdEdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnSWNvc2FoZWRyb25HZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdGRldGFpbDogZGV0YWlsXG5cdH07XG5cblx0dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIG5ldyBJY29zYWhlZHJvbkJ1ZmZlckdlb21ldHJ5KCByYWRpdXMsIGRldGFpbCApICk7XG5cdHRoaXMubWVyZ2VWZXJ0aWNlcygpO1xuXG59XG5cbkljb3NhaGVkcm9uR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7XG5JY29zYWhlZHJvbkdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEljb3NhaGVkcm9uR2VvbWV0cnk7XG5cbi8vIEljb3NhaGVkcm9uQnVmZmVyR2VvbWV0cnlcblxuZnVuY3Rpb24gSWNvc2FoZWRyb25CdWZmZXJHZW9tZXRyeSggcmFkaXVzLCBkZXRhaWwgKSB7XG5cblx0dmFyIHQgPSAoIDEgKyBNYXRoLnNxcnQoIDUgKSApIC8gMjtcblxuXHR2YXIgdmVydGljZXMgPSBbXG5cdFx0LSAxLCB0LCAwLCBcdDEsIHQsIDAsIFx0LSAxLCAtIHQsIDAsIFx0MSwgLSB0LCAwLFxuXHRcdCAwLCAtIDEsIHQsIFx0MCwgMSwgdCxcdDAsIC0gMSwgLSB0LCBcdDAsIDEsIC0gdCxcblx0XHQgdCwgMCwgLSAxLCBcdHQsIDAsIDEsIFx0LSB0LCAwLCAtIDEsIFx0LSB0LCAwLCAxXG5cdF07XG5cblx0dmFyIGluZGljZXMgPSBbXG5cdFx0IDAsIDExLCA1LCBcdDAsIDUsIDEsIFx0MCwgMSwgNywgXHQwLCA3LCAxMCwgXHQwLCAxMCwgMTEsXG5cdFx0IDEsIDUsIDksIFx0NSwgMTEsIDQsXHQxMSwgMTAsIDIsXHQxMCwgNywgNixcdDcsIDEsIDgsXG5cdFx0IDMsIDksIDQsIFx0MywgNCwgMixcdDMsIDIsIDYsXHQzLCA2LCA4LFx0MywgOCwgOSxcblx0XHQgNCwgOSwgNSwgXHQyLCA0LCAxMSxcdDYsIDIsIDEwLFx0OCwgNiwgNyxcdDksIDgsIDFcblx0XTtcblxuXHRQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcywgdmVydGljZXMsIGluZGljZXMsIHJhZGl1cywgZGV0YWlsICk7XG5cblx0dGhpcy50eXBlID0gJ0ljb3NhaGVkcm9uQnVmZmVyR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRyYWRpdXM6IHJhZGl1cyxcblx0XHRkZXRhaWw6IGRldGFpbFxuXHR9O1xuXG59XG5cbkljb3NhaGVkcm9uQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApO1xuSWNvc2FoZWRyb25CdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBJY29zYWhlZHJvbkJ1ZmZlckdlb21ldHJ5O1xuXG4vKipcbiAqIEBhdXRob3IgQWJlIFBhem9zIC8gaHR0cHM6Ly9oYW1vaWQuY29tXG4gKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44N1xuICovXG5cbi8vIERvZGVjYWhlZHJvbkdlb21ldHJ5XG5cbmZ1bmN0aW9uIERvZGVjYWhlZHJvbkdlb21ldHJ5KCByYWRpdXMsIGRldGFpbCApIHtcblxuXHRHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0RvZGVjYWhlZHJvbkdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0cmFkaXVzOiByYWRpdXMsXG5cdFx0ZGV0YWlsOiBkZXRhaWxcblx0fTtcblxuXHR0aGlzLmZyb21CdWZmZXJHZW9tZXRyeSggbmV3IERvZGVjYWhlZHJvbkJ1ZmZlckdlb21ldHJ5KCByYWRpdXMsIGRldGFpbCApICk7XG5cdHRoaXMubWVyZ2VWZXJ0aWNlcygpO1xuXG59XG5cbkRvZGVjYWhlZHJvbkdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEdlb21ldHJ5LnByb3RvdHlwZSApO1xuRG9kZWNhaGVkcm9uR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gRG9kZWNhaGVkcm9uR2VvbWV0cnk7XG5cbi8vIERvZGVjYWhlZHJvbkJ1ZmZlckdlb21ldHJ5XG5cbmZ1bmN0aW9uIERvZGVjYWhlZHJvbkJ1ZmZlckdlb21ldHJ5KCByYWRpdXMsIGRldGFpbCApIHtcblxuXHR2YXIgdCA9ICggMSArIE1hdGguc3FydCggNSApICkgLyAyO1xuXHR2YXIgciA9IDEgLyB0O1xuXG5cdHZhciB2ZXJ0aWNlcyA9IFtcblxuXHRcdC8vICjCsTEsIMKxMSwgwrExKVxuXHRcdC0gMSwgLSAxLCAtIDEsXHQtIDEsIC0gMSwgMSxcblx0XHQtIDEsIDEsIC0gMSwgLSAxLCAxLCAxLFxuXHRcdDEsIC0gMSwgLSAxLCAxLCAtIDEsIDEsXG5cdFx0MSwgMSwgLSAxLCAxLCAxLCAxLFxuXG5cdFx0Ly8gKDAsIMKxMS/PhiwgwrHPhilcblx0XHQgMCwgLSByLCAtIHQsIDAsIC0gciwgdCxcblx0XHQgMCwgciwgLSB0LCAwLCByLCB0LFxuXG5cdFx0Ly8gKMKxMS/PhiwgwrHPhiwgMClcblx0XHQtIHIsIC0gdCwgMCwgLSByLCB0LCAwLFxuXHRcdCByLCAtIHQsIDAsIHIsIHQsIDAsXG5cblx0XHQvLyAowrHPhiwgMCwgwrExL8+GKVxuXHRcdC0gdCwgMCwgLSByLCB0LCAwLCAtIHIsXG5cdFx0LSB0LCAwLCByLCB0LCAwLCByXG5cdF07XG5cblx0dmFyIGluZGljZXMgPSBbXG5cdFx0MywgMTEsIDcsIFx0MywgNywgMTUsIFx0MywgMTUsIDEzLFxuXHRcdDcsIDE5LCAxNywgXHQ3LCAxNywgNiwgXHQ3LCA2LCAxNSxcblx0XHQxNywgNCwgOCwgXHQxNywgOCwgMTAsIFx0MTcsIDEwLCA2LFxuXHRcdDgsIDAsIDE2LCBcdDgsIDE2LCAyLCBcdDgsIDIsIDEwLFxuXHRcdDAsIDEyLCAxLCBcdDAsIDEsIDE4LCBcdDAsIDE4LCAxNixcblx0XHQ2LCAxMCwgMiwgXHQ2LCAyLCAxMywgXHQ2LCAxMywgMTUsXG5cdFx0MiwgMTYsIDE4LCBcdDIsIDE4LCAzLCBcdDIsIDMsIDEzLFxuXHRcdDE4LCAxLCA5LCBcdDE4LCA5LCAxMSwgXHQxOCwgMTEsIDMsXG5cdFx0NCwgMTQsIDEyLCBcdDQsIDEyLCAwLCBcdDQsIDAsIDgsXG5cdFx0MTEsIDksIDUsIFx0MTEsIDUsIDE5LCBcdDExLCAxOSwgNyxcblx0XHQxOSwgNSwgMTQsIFx0MTksIDE0LCA0LCBcdDE5LCA0LCAxNyxcblx0XHQxLCAxMiwgMTQsIFx0MSwgMTQsIDUsIFx0MSwgNSwgOVxuXHRdO1xuXG5cdFBvbHloZWRyb25CdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzLCB2ZXJ0aWNlcywgaW5kaWNlcywgcmFkaXVzLCBkZXRhaWwgKTtcblxuXHR0aGlzLnR5cGUgPSAnRG9kZWNhaGVkcm9uQnVmZmVyR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRyYWRpdXM6IHJhZGl1cyxcblx0XHRkZXRhaWw6IGRldGFpbFxuXHR9O1xuXG59XG5cbkRvZGVjYWhlZHJvbkJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIFBvbHloZWRyb25CdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTtcbkRvZGVjYWhlZHJvbkJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IERvZGVjYWhlZHJvbkJ1ZmZlckdlb21ldHJ5O1xuXG4vKipcbiAqIEBhdXRob3Igb29zbW94aWVjb2RlIC8gaHR0cHM6Ly9naXRodWIuY29tL29vc21veGllY29kZVxuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHBzOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleVxuICogQGF1dGhvciB6ejg1IC8gaHR0cHM6Ly9naXRodWIuY29tL3p6ODVcbiAqIEBhdXRob3IgbWluaW5nb2xkIC8gaHR0cHM6Ly9naXRodWIuY29tL21pbmluZ29sZFxuICogQGF1dGhvciBqb25vYnIxIC8gaHR0cHM6Ly9naXRodWIuY29tL2pvbm9icjFcbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKlxuICovXG5cbi8vIFR1YmVHZW9tZXRyeVxuXG5mdW5jdGlvbiBUdWJlR2VvbWV0cnkoIHBhdGgsIHR1YnVsYXJTZWdtZW50cywgcmFkaXVzLCByYWRpYWxTZWdtZW50cywgY2xvc2VkLCB0YXBlciApIHtcblxuXHRHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1R1YmVHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHBhdGg6IHBhdGgsXG5cdFx0dHVidWxhclNlZ21lbnRzOiB0dWJ1bGFyU2VnbWVudHMsXG5cdFx0cmFkaXVzOiByYWRpdXMsXG5cdFx0cmFkaWFsU2VnbWVudHM6IHJhZGlhbFNlZ21lbnRzLFxuXHRcdGNsb3NlZDogY2xvc2VkXG5cdH07XG5cblx0aWYgKCB0YXBlciAhPT0gdW5kZWZpbmVkICkgY29uc29sZS53YXJuKCAnVEhSRUUuVHViZUdlb21ldHJ5OiB0YXBlciBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR2YXIgYnVmZmVyR2VvbWV0cnkgPSBuZXcgVHViZUJ1ZmZlckdlb21ldHJ5KCBwYXRoLCB0dWJ1bGFyU2VnbWVudHMsIHJhZGl1cywgcmFkaWFsU2VnbWVudHMsIGNsb3NlZCApO1xuXG5cdC8vIGV4cG9zZSBpbnRlcm5hbHNcblxuXHR0aGlzLnRhbmdlbnRzID0gYnVmZmVyR2VvbWV0cnkudGFuZ2VudHM7XG5cdHRoaXMubm9ybWFscyA9IGJ1ZmZlckdlb21ldHJ5Lm5vcm1hbHM7XG5cdHRoaXMuYmlub3JtYWxzID0gYnVmZmVyR2VvbWV0cnkuYmlub3JtYWxzO1xuXG5cdC8vIGNyZWF0ZSBnZW9tZXRyeVxuXG5cdHRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBidWZmZXJHZW9tZXRyeSApO1xuXHR0aGlzLm1lcmdlVmVydGljZXMoKTtcblxufVxuXG5UdWJlR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7XG5UdWJlR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVHViZUdlb21ldHJ5O1xuXG4vLyBUdWJlQnVmZmVyR2VvbWV0cnlcblxuZnVuY3Rpb24gVHViZUJ1ZmZlckdlb21ldHJ5KCBwYXRoLCB0dWJ1bGFyU2VnbWVudHMsIHJhZGl1cywgcmFkaWFsU2VnbWVudHMsIGNsb3NlZCApIHtcblxuXHRCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1R1YmVCdWZmZXJHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHBhdGg6IHBhdGgsXG5cdFx0dHVidWxhclNlZ21lbnRzOiB0dWJ1bGFyU2VnbWVudHMsXG5cdFx0cmFkaXVzOiByYWRpdXMsXG5cdFx0cmFkaWFsU2VnbWVudHM6IHJhZGlhbFNlZ21lbnRzLFxuXHRcdGNsb3NlZDogY2xvc2VkXG5cdH07XG5cblx0dHVidWxhclNlZ21lbnRzID0gdHVidWxhclNlZ21lbnRzIHx8IDY0O1xuXHRyYWRpdXMgPSByYWRpdXMgfHwgMTtcblx0cmFkaWFsU2VnbWVudHMgPSByYWRpYWxTZWdtZW50cyB8fCA4O1xuXHRjbG9zZWQgPSBjbG9zZWQgfHwgZmFsc2U7XG5cblx0dmFyIGZyYW1lcyA9IHBhdGguY29tcHV0ZUZyZW5ldEZyYW1lcyggdHVidWxhclNlZ21lbnRzLCBjbG9zZWQgKTtcblxuXHQvLyBleHBvc2UgaW50ZXJuYWxzXG5cblx0dGhpcy50YW5nZW50cyA9IGZyYW1lcy50YW5nZW50cztcblx0dGhpcy5ub3JtYWxzID0gZnJhbWVzLm5vcm1hbHM7XG5cdHRoaXMuYmlub3JtYWxzID0gZnJhbWVzLmJpbm9ybWFscztcblxuXHQvLyBoZWxwZXIgdmFyaWFibGVzXG5cblx0dmFyIHZlcnRleCA9IG5ldyBWZWN0b3IzKCk7XG5cdHZhciBub3JtYWwgPSBuZXcgVmVjdG9yMygpO1xuXHR2YXIgdXYgPSBuZXcgVmVjdG9yMigpO1xuXHR2YXIgUCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0dmFyIGksIGo7XG5cblx0Ly8gYnVmZmVyXG5cblx0dmFyIHZlcnRpY2VzID0gW107XG5cdHZhciBub3JtYWxzID0gW107XG5cdHZhciB1dnMgPSBbXTtcblx0dmFyIGluZGljZXMgPSBbXTtcblxuXHQvLyBjcmVhdGUgYnVmZmVyIGRhdGFcblxuXHRnZW5lcmF0ZUJ1ZmZlckRhdGEoKTtcblxuXHQvLyBidWlsZCBnZW9tZXRyeVxuXG5cdHRoaXMuc2V0SW5kZXgoIGluZGljZXMgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIG5vcm1hbHMsIDMgKSApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2cywgMiApICk7XG5cblx0Ly8gZnVuY3Rpb25zXG5cblx0ZnVuY3Rpb24gZ2VuZXJhdGVCdWZmZXJEYXRhKCkge1xuXG5cdFx0Zm9yICggaSA9IDA7IGkgPCB0dWJ1bGFyU2VnbWVudHM7IGkgKysgKSB7XG5cblx0XHRcdGdlbmVyYXRlU2VnbWVudCggaSApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gaWYgdGhlIGdlb21ldHJ5IGlzIG5vdCBjbG9zZWQsIGdlbmVyYXRlIHRoZSBsYXN0IHJvdyBvZiB2ZXJ0aWNlcyBhbmQgbm9ybWFsc1xuXHRcdC8vIGF0IHRoZSByZWd1bGFyIHBvc2l0aW9uIG9uIHRoZSBnaXZlbiBwYXRoXG5cdFx0Ly9cblx0XHQvLyBpZiB0aGUgZ2VvbWV0cnkgaXMgY2xvc2VkLCBkdXBsaWNhdGUgdGhlIGZpcnN0IHJvdyBvZiB2ZXJ0aWNlcyBhbmQgbm9ybWFscyAodXZzIHdpbGwgZGlmZmVyKVxuXG5cdFx0Z2VuZXJhdGVTZWdtZW50KCAoIGNsb3NlZCA9PT0gZmFsc2UgKSA/IHR1YnVsYXJTZWdtZW50cyA6IDAgKTtcblxuXHRcdC8vIHV2cyBhcmUgZ2VuZXJhdGVkIGluIGEgc2VwYXJhdGUgZnVuY3Rpb24uXG5cdFx0Ly8gdGhpcyBtYWtlcyBpdCBlYXN5IGNvbXB1dGUgY29ycmVjdCB2YWx1ZXMgZm9yIGNsb3NlZCBnZW9tZXRyaWVzXG5cblx0XHRnZW5lcmF0ZVVWcygpO1xuXG5cdFx0Ly8gZmluYWxseSBjcmVhdGUgZmFjZXNcblxuXHRcdGdlbmVyYXRlSW5kaWNlcygpO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBnZW5lcmF0ZVNlZ21lbnQoIGkgKSB7XG5cblx0XHQvLyB3ZSB1c2UgZ2V0UG9pbnRBdCB0byBzYW1wbGUgZXZlbmx5IGRpc3RyaWJ1dGVkIHBvaW50cyBmcm9tIHRoZSBnaXZlbiBwYXRoXG5cblx0XHRQID0gcGF0aC5nZXRQb2ludEF0KCBpIC8gdHVidWxhclNlZ21lbnRzLCBQICk7XG5cblx0XHQvLyByZXRyaWV2ZSBjb3JyZXNwb25kaW5nIG5vcm1hbCBhbmQgYmlub3JtYWxcblxuXHRcdHZhciBOID0gZnJhbWVzLm5vcm1hbHNbIGkgXTtcblx0XHR2YXIgQiA9IGZyYW1lcy5iaW5vcm1hbHNbIGkgXTtcblxuXHRcdC8vIGdlbmVyYXRlIG5vcm1hbHMgYW5kIHZlcnRpY2VzIGZvciB0aGUgY3VycmVudCBzZWdtZW50XG5cblx0XHRmb3IgKCBqID0gMDsgaiA8PSByYWRpYWxTZWdtZW50czsgaiArKyApIHtcblxuXHRcdFx0dmFyIHYgPSBqIC8gcmFkaWFsU2VnbWVudHMgKiBNYXRoLlBJICogMjtcblxuXHRcdFx0dmFyIHNpbiA9IE1hdGguc2luKCB2ICk7XG5cdFx0XHR2YXIgY29zID0gLSBNYXRoLmNvcyggdiApO1xuXG5cdFx0XHQvLyBub3JtYWxcblxuXHRcdFx0bm9ybWFsLnggPSAoIGNvcyAqIE4ueCArIHNpbiAqIEIueCApO1xuXHRcdFx0bm9ybWFsLnkgPSAoIGNvcyAqIE4ueSArIHNpbiAqIEIueSApO1xuXHRcdFx0bm9ybWFsLnogPSAoIGNvcyAqIE4ueiArIHNpbiAqIEIueiApO1xuXHRcdFx0bm9ybWFsLm5vcm1hbGl6ZSgpO1xuXG5cdFx0XHRub3JtYWxzLnB1c2goIG5vcm1hbC54LCBub3JtYWwueSwgbm9ybWFsLnogKTtcblxuXHRcdFx0Ly8gdmVydGV4XG5cblx0XHRcdHZlcnRleC54ID0gUC54ICsgcmFkaXVzICogbm9ybWFsLng7XG5cdFx0XHR2ZXJ0ZXgueSA9IFAueSArIHJhZGl1cyAqIG5vcm1hbC55O1xuXHRcdFx0dmVydGV4LnogPSBQLnogKyByYWRpdXMgKiBub3JtYWwuejtcblxuXHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBnZW5lcmF0ZUluZGljZXMoKSB7XG5cblx0XHRmb3IgKCBqID0gMTsgaiA8PSB0dWJ1bGFyU2VnbWVudHM7IGogKysgKSB7XG5cblx0XHRcdGZvciAoIGkgPSAxOyBpIDw9IHJhZGlhbFNlZ21lbnRzOyBpICsrICkge1xuXG5cdFx0XHRcdHZhciBhID0gKCByYWRpYWxTZWdtZW50cyArIDEgKSAqICggaiAtIDEgKSArICggaSAtIDEgKTtcblx0XHRcdFx0dmFyIGIgPSAoIHJhZGlhbFNlZ21lbnRzICsgMSApICogaiArICggaSAtIDEgKTtcblx0XHRcdFx0dmFyIGMgPSAoIHJhZGlhbFNlZ21lbnRzICsgMSApICogaiArIGk7XG5cdFx0XHRcdHZhciBkID0gKCByYWRpYWxTZWdtZW50cyArIDEgKSAqICggaiAtIDEgKSArIGk7XG5cblx0XHRcdFx0Ly8gZmFjZXNcblxuXHRcdFx0XHRpbmRpY2VzLnB1c2goIGEsIGIsIGQgKTtcblx0XHRcdFx0aW5kaWNlcy5wdXNoKCBiLCBjLCBkICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gZ2VuZXJhdGVVVnMoKSB7XG5cblx0XHRmb3IgKCBpID0gMDsgaSA8PSB0dWJ1bGFyU2VnbWVudHM7IGkgKysgKSB7XG5cblx0XHRcdGZvciAoIGogPSAwOyBqIDw9IHJhZGlhbFNlZ21lbnRzOyBqICsrICkge1xuXG5cdFx0XHRcdHV2LnggPSBpIC8gdHVidWxhclNlZ21lbnRzO1xuXHRcdFx0XHR1di55ID0gaiAvIHJhZGlhbFNlZ21lbnRzO1xuXG5cdFx0XHRcdHV2cy5wdXNoKCB1di54LCB1di55ICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9XG5cbn1cblxuVHViZUJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApO1xuVHViZUJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFR1YmVCdWZmZXJHZW9tZXRyeTtcblxuLyoqXG4gKiBAYXV0aG9yIG9vc21veGllY29kZVxuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqXG4gKiBiYXNlZCBvbiBodHRwOi8vd3d3LmJsYWNrcGF3bi5jb20vdGV4dHMvcHF0b3J1cy9cbiAqL1xuXG4vLyBUb3J1c0tub3RHZW9tZXRyeVxuXG5mdW5jdGlvbiBUb3J1c0tub3RHZW9tZXRyeSggcmFkaXVzLCB0dWJlLCB0dWJ1bGFyU2VnbWVudHMsIHJhZGlhbFNlZ21lbnRzLCBwLCBxLCBoZWlnaHRTY2FsZSApIHtcblxuXHRHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1RvcnVzS25vdEdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0cmFkaXVzOiByYWRpdXMsXG5cdFx0dHViZTogdHViZSxcblx0XHR0dWJ1bGFyU2VnbWVudHM6IHR1YnVsYXJTZWdtZW50cyxcblx0XHRyYWRpYWxTZWdtZW50czogcmFkaWFsU2VnbWVudHMsXG5cdFx0cDogcCxcblx0XHRxOiBxXG5cdH07XG5cblx0aWYgKCBoZWlnaHRTY2FsZSAhPT0gdW5kZWZpbmVkICkgY29uc29sZS53YXJuKCAnVEhSRUUuVG9ydXNLbm90R2VvbWV0cnk6IGhlaWdodFNjYWxlIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAuc2NhbGUoIHgsIHksIHogKSBpbnN0ZWFkLicgKTtcblxuXHR0aGlzLmZyb21CdWZmZXJHZW9tZXRyeSggbmV3IFRvcnVzS25vdEJ1ZmZlckdlb21ldHJ5KCByYWRpdXMsIHR1YmUsIHR1YnVsYXJTZWdtZW50cywgcmFkaWFsU2VnbWVudHMsIHAsIHEgKSApO1xuXHR0aGlzLm1lcmdlVmVydGljZXMoKTtcblxufVxuXG5Ub3J1c0tub3RHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBHZW9tZXRyeS5wcm90b3R5cGUgKTtcblRvcnVzS25vdEdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFRvcnVzS25vdEdlb21ldHJ5O1xuXG4vLyBUb3J1c0tub3RCdWZmZXJHZW9tZXRyeVxuXG5mdW5jdGlvbiBUb3J1c0tub3RCdWZmZXJHZW9tZXRyeSggcmFkaXVzLCB0dWJlLCB0dWJ1bGFyU2VnbWVudHMsIHJhZGlhbFNlZ21lbnRzLCBwLCBxICkge1xuXG5cdEJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnVG9ydXNLbm90QnVmZmVyR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRyYWRpdXM6IHJhZGl1cyxcblx0XHR0dWJlOiB0dWJlLFxuXHRcdHR1YnVsYXJTZWdtZW50czogdHVidWxhclNlZ21lbnRzLFxuXHRcdHJhZGlhbFNlZ21lbnRzOiByYWRpYWxTZWdtZW50cyxcblx0XHRwOiBwLFxuXHRcdHE6IHFcblx0fTtcblxuXHRyYWRpdXMgPSByYWRpdXMgfHwgMTtcblx0dHViZSA9IHR1YmUgfHwgMC40O1xuXHR0dWJ1bGFyU2VnbWVudHMgPSBNYXRoLmZsb29yKCB0dWJ1bGFyU2VnbWVudHMgKSB8fCA2NDtcblx0cmFkaWFsU2VnbWVudHMgPSBNYXRoLmZsb29yKCByYWRpYWxTZWdtZW50cyApIHx8IDg7XG5cdHAgPSBwIHx8IDI7XG5cdHEgPSBxIHx8IDM7XG5cblx0Ly8gYnVmZmVyc1xuXG5cdHZhciBpbmRpY2VzID0gW107XG5cdHZhciB2ZXJ0aWNlcyA9IFtdO1xuXHR2YXIgbm9ybWFscyA9IFtdO1xuXHR2YXIgdXZzID0gW107XG5cblx0Ly8gaGVscGVyIHZhcmlhYmxlc1xuXG5cdHZhciBpLCBqO1xuXG5cdHZhciB2ZXJ0ZXggPSBuZXcgVmVjdG9yMygpO1xuXHR2YXIgbm9ybWFsID0gbmV3IFZlY3RvcjMoKTtcblxuXHR2YXIgUDEgPSBuZXcgVmVjdG9yMygpO1xuXHR2YXIgUDIgPSBuZXcgVmVjdG9yMygpO1xuXG5cdHZhciBCID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIFQgPSBuZXcgVmVjdG9yMygpO1xuXHR2YXIgTiA9IG5ldyBWZWN0b3IzKCk7XG5cblx0Ly8gZ2VuZXJhdGUgdmVydGljZXMsIG5vcm1hbHMgYW5kIHV2c1xuXG5cdGZvciAoIGkgPSAwOyBpIDw9IHR1YnVsYXJTZWdtZW50czsgKysgaSApIHtcblxuXHRcdC8vIHRoZSByYWRpYW4gXCJ1XCIgaXMgdXNlZCB0byBjYWxjdWxhdGUgdGhlIHBvc2l0aW9uIG9uIHRoZSB0b3J1cyBjdXJ2ZSBvZiB0aGUgY3VycmVudCB0dWJ1bGFyIHNlZ2VtZW50XG5cblx0XHR2YXIgdSA9IGkgLyB0dWJ1bGFyU2VnbWVudHMgKiBwICogTWF0aC5QSSAqIDI7XG5cblx0XHQvLyBub3cgd2UgY2FsY3VsYXRlIHR3byBwb2ludHMuIFAxIGlzIG91ciBjdXJyZW50IHBvc2l0aW9uIG9uIHRoZSBjdXJ2ZSwgUDIgaXMgYSBsaXR0bGUgZmFydGhlciBhaGVhZC5cblx0XHQvLyB0aGVzZSBwb2ludHMgYXJlIHVzZWQgdG8gY3JlYXRlIGEgc3BlY2lhbCBcImNvb3JkaW5hdGUgc3BhY2VcIiwgd2hpY2ggaXMgbmVjZXNzYXJ5IHRvIGNhbGN1bGF0ZSB0aGUgY29ycmVjdCB2ZXJ0ZXggcG9zaXRpb25zXG5cblx0XHRjYWxjdWxhdGVQb3NpdGlvbk9uQ3VydmUoIHUsIHAsIHEsIHJhZGl1cywgUDEgKTtcblx0XHRjYWxjdWxhdGVQb3NpdGlvbk9uQ3VydmUoIHUgKyAwLjAxLCBwLCBxLCByYWRpdXMsIFAyICk7XG5cblx0XHQvLyBjYWxjdWxhdGUgb3J0aG9ub3JtYWwgYmFzaXNcblxuXHRcdFQuc3ViVmVjdG9ycyggUDIsIFAxICk7XG5cdFx0Ti5hZGRWZWN0b3JzKCBQMiwgUDEgKTtcblx0XHRCLmNyb3NzVmVjdG9ycyggVCwgTiApO1xuXHRcdE4uY3Jvc3NWZWN0b3JzKCBCLCBUICk7XG5cblx0XHQvLyBub3JtYWxpemUgQiwgTi4gVCBjYW4gYmUgaWdub3JlZCwgd2UgZG9uJ3QgdXNlIGl0XG5cblx0XHRCLm5vcm1hbGl6ZSgpO1xuXHRcdE4ubm9ybWFsaXplKCk7XG5cblx0XHRmb3IgKCBqID0gMDsgaiA8PSByYWRpYWxTZWdtZW50czsgKysgaiApIHtcblxuXHRcdFx0Ly8gbm93IGNhbGN1bGF0ZSB0aGUgdmVydGljZXMuIHRoZXkgYXJlIG5vdGhpbmcgbW9yZSB0aGFuIGFuIGV4dHJ1c2lvbiBvZiB0aGUgdG9ydXMgY3VydmUuXG5cdFx0XHQvLyBiZWNhdXNlIHdlIGV4dHJ1ZGUgYSBzaGFwZSBpbiB0aGUgeHktcGxhbmUsIHRoZXJlIGlzIG5vIG5lZWQgdG8gY2FsY3VsYXRlIGEgei12YWx1ZS5cblxuXHRcdFx0dmFyIHYgPSBqIC8gcmFkaWFsU2VnbWVudHMgKiBNYXRoLlBJICogMjtcblx0XHRcdHZhciBjeCA9IC0gdHViZSAqIE1hdGguY29zKCB2ICk7XG5cdFx0XHR2YXIgY3kgPSB0dWJlICogTWF0aC5zaW4oIHYgKTtcblxuXHRcdFx0Ly8gbm93IGNhbGN1bGF0ZSB0aGUgZmluYWwgdmVydGV4IHBvc2l0aW9uLlxuXHRcdFx0Ly8gZmlyc3Qgd2Ugb3JpZW50IHRoZSBleHRydXNpb24gd2l0aCBvdXIgYmFzaXMgdmVjdG9zLCB0aGVuIHdlIGFkZCBpdCB0byB0aGUgY3VycmVudCBwb3NpdGlvbiBvbiB0aGUgY3VydmVcblxuXHRcdFx0dmVydGV4LnggPSBQMS54ICsgKCBjeCAqIE4ueCArIGN5ICogQi54ICk7XG5cdFx0XHR2ZXJ0ZXgueSA9IFAxLnkgKyAoIGN4ICogTi55ICsgY3kgKiBCLnkgKTtcblx0XHRcdHZlcnRleC56ID0gUDEueiArICggY3ggKiBOLnogKyBjeSAqIEIueiApO1xuXG5cdFx0XHR2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7XG5cblx0XHRcdC8vIG5vcm1hbCAoUDEgaXMgYWx3YXlzIHRoZSBjZW50ZXIvb3JpZ2luIG9mIHRoZSBleHRydXNpb24sIHRodXMgd2UgY2FuIHVzZSBpdCB0byBjYWxjdWxhdGUgdGhlIG5vcm1hbClcblxuXHRcdFx0bm9ybWFsLnN1YlZlY3RvcnMoIHZlcnRleCwgUDEgKS5ub3JtYWxpemUoKTtcblxuXHRcdFx0bm9ybWFscy5wdXNoKCBub3JtYWwueCwgbm9ybWFsLnksIG5vcm1hbC56ICk7XG5cblx0XHRcdC8vIHV2XG5cblx0XHRcdHV2cy5wdXNoKCBpIC8gdHVidWxhclNlZ21lbnRzICk7XG5cdFx0XHR1dnMucHVzaCggaiAvIHJhZGlhbFNlZ21lbnRzICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIGdlbmVyYXRlIGluZGljZXNcblxuXHRmb3IgKCBqID0gMTsgaiA8PSB0dWJ1bGFyU2VnbWVudHM7IGogKysgKSB7XG5cblx0XHRmb3IgKCBpID0gMTsgaSA8PSByYWRpYWxTZWdtZW50czsgaSArKyApIHtcblxuXHRcdFx0Ly8gaW5kaWNlc1xuXG5cdFx0XHR2YXIgYSA9ICggcmFkaWFsU2VnbWVudHMgKyAxICkgKiAoIGogLSAxICkgKyAoIGkgLSAxICk7XG5cdFx0XHR2YXIgYiA9ICggcmFkaWFsU2VnbWVudHMgKyAxICkgKiBqICsgKCBpIC0gMSApO1xuXHRcdFx0dmFyIGMgPSAoIHJhZGlhbFNlZ21lbnRzICsgMSApICogaiArIGk7XG5cdFx0XHR2YXIgZCA9ICggcmFkaWFsU2VnbWVudHMgKyAxICkgKiAoIGogLSAxICkgKyBpO1xuXG5cdFx0XHQvLyBmYWNlc1xuXG5cdFx0XHRpbmRpY2VzLnB1c2goIGEsIGIsIGQgKTtcblx0XHRcdGluZGljZXMucHVzaCggYiwgYywgZCApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHQvLyBidWlsZCBnZW9tZXRyeVxuXG5cdHRoaXMuc2V0SW5kZXgoIGluZGljZXMgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIG5vcm1hbHMsIDMgKSApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2cywgMiApICk7XG5cblx0Ly8gdGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBjdXJyZW50IHBvc2l0aW9uIG9uIHRoZSB0b3J1cyBjdXJ2ZVxuXG5cdGZ1bmN0aW9uIGNhbGN1bGF0ZVBvc2l0aW9uT25DdXJ2ZSggdSwgcCwgcSwgcmFkaXVzLCBwb3NpdGlvbiApIHtcblxuXHRcdHZhciBjdSA9IE1hdGguY29zKCB1ICk7XG5cdFx0dmFyIHN1ID0gTWF0aC5zaW4oIHUgKTtcblx0XHR2YXIgcXVPdmVyUCA9IHEgLyBwICogdTtcblx0XHR2YXIgY3MgPSBNYXRoLmNvcyggcXVPdmVyUCApO1xuXG5cdFx0cG9zaXRpb24ueCA9IHJhZGl1cyAqICggMiArIGNzICkgKiAwLjUgKiBjdTtcblx0XHRwb3NpdGlvbi55ID0gcmFkaXVzICogKCAyICsgY3MgKSAqIHN1ICogMC41O1xuXHRcdHBvc2l0aW9uLnogPSByYWRpdXMgKiBNYXRoLnNpbiggcXVPdmVyUCApICogMC41O1xuXG5cdH1cblxufVxuXG5Ub3J1c0tub3RCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTtcblRvcnVzS25vdEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFRvcnVzS25vdEJ1ZmZlckdlb21ldHJ5O1xuXG4vKipcbiAqIEBhdXRob3Igb29zbW94aWVjb2RlXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqL1xuXG4vLyBUb3J1c0dlb21ldHJ5XG5cbmZ1bmN0aW9uIFRvcnVzR2VvbWV0cnkoIHJhZGl1cywgdHViZSwgcmFkaWFsU2VnbWVudHMsIHR1YnVsYXJTZWdtZW50cywgYXJjICkge1xuXG5cdEdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnVG9ydXNHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdHR1YmU6IHR1YmUsXG5cdFx0cmFkaWFsU2VnbWVudHM6IHJhZGlhbFNlZ21lbnRzLFxuXHRcdHR1YnVsYXJTZWdtZW50czogdHVidWxhclNlZ21lbnRzLFxuXHRcdGFyYzogYXJjXG5cdH07XG5cblx0dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIG5ldyBUb3J1c0J1ZmZlckdlb21ldHJ5KCByYWRpdXMsIHR1YmUsIHJhZGlhbFNlZ21lbnRzLCB0dWJ1bGFyU2VnbWVudHMsIGFyYyApICk7XG5cdHRoaXMubWVyZ2VWZXJ0aWNlcygpO1xuXG59XG5cblRvcnVzR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7XG5Ub3J1c0dlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFRvcnVzR2VvbWV0cnk7XG5cbi8vIFRvcnVzQnVmZmVyR2VvbWV0cnlcblxuZnVuY3Rpb24gVG9ydXNCdWZmZXJHZW9tZXRyeSggcmFkaXVzLCB0dWJlLCByYWRpYWxTZWdtZW50cywgdHVidWxhclNlZ21lbnRzLCBhcmMgKSB7XG5cblx0QnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdUb3J1c0J1ZmZlckdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0cmFkaXVzOiByYWRpdXMsXG5cdFx0dHViZTogdHViZSxcblx0XHRyYWRpYWxTZWdtZW50czogcmFkaWFsU2VnbWVudHMsXG5cdFx0dHVidWxhclNlZ21lbnRzOiB0dWJ1bGFyU2VnbWVudHMsXG5cdFx0YXJjOiBhcmNcblx0fTtcblxuXHRyYWRpdXMgPSByYWRpdXMgfHwgMTtcblx0dHViZSA9IHR1YmUgfHwgMC40O1xuXHRyYWRpYWxTZWdtZW50cyA9IE1hdGguZmxvb3IoIHJhZGlhbFNlZ21lbnRzICkgfHwgODtcblx0dHVidWxhclNlZ21lbnRzID0gTWF0aC5mbG9vciggdHVidWxhclNlZ21lbnRzICkgfHwgNjtcblx0YXJjID0gYXJjIHx8IE1hdGguUEkgKiAyO1xuXG5cdC8vIGJ1ZmZlcnNcblxuXHR2YXIgaW5kaWNlcyA9IFtdO1xuXHR2YXIgdmVydGljZXMgPSBbXTtcblx0dmFyIG5vcm1hbHMgPSBbXTtcblx0dmFyIHV2cyA9IFtdO1xuXG5cdC8vIGhlbHBlciB2YXJpYWJsZXNcblxuXHR2YXIgY2VudGVyID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIHZlcnRleCA9IG5ldyBWZWN0b3IzKCk7XG5cdHZhciBub3JtYWwgPSBuZXcgVmVjdG9yMygpO1xuXG5cdHZhciBqLCBpO1xuXG5cdC8vIGdlbmVyYXRlIHZlcnRpY2VzLCBub3JtYWxzIGFuZCB1dnNcblxuXHRmb3IgKCBqID0gMDsgaiA8PSByYWRpYWxTZWdtZW50czsgaiArKyApIHtcblxuXHRcdGZvciAoIGkgPSAwOyBpIDw9IHR1YnVsYXJTZWdtZW50czsgaSArKyApIHtcblxuXHRcdFx0dmFyIHUgPSBpIC8gdHVidWxhclNlZ21lbnRzICogYXJjO1xuXHRcdFx0dmFyIHYgPSBqIC8gcmFkaWFsU2VnbWVudHMgKiBNYXRoLlBJICogMjtcblxuXHRcdFx0Ly8gdmVydGV4XG5cblx0XHRcdHZlcnRleC54ID0gKCByYWRpdXMgKyB0dWJlICogTWF0aC5jb3MoIHYgKSApICogTWF0aC5jb3MoIHUgKTtcblx0XHRcdHZlcnRleC55ID0gKCByYWRpdXMgKyB0dWJlICogTWF0aC5jb3MoIHYgKSApICogTWF0aC5zaW4oIHUgKTtcblx0XHRcdHZlcnRleC56ID0gdHViZSAqIE1hdGguc2luKCB2ICk7XG5cblx0XHRcdHZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTtcblxuXHRcdFx0Ly8gbm9ybWFsXG5cblx0XHRcdGNlbnRlci54ID0gcmFkaXVzICogTWF0aC5jb3MoIHUgKTtcblx0XHRcdGNlbnRlci55ID0gcmFkaXVzICogTWF0aC5zaW4oIHUgKTtcblx0XHRcdG5vcm1hbC5zdWJWZWN0b3JzKCB2ZXJ0ZXgsIGNlbnRlciApLm5vcm1hbGl6ZSgpO1xuXG5cdFx0XHRub3JtYWxzLnB1c2goIG5vcm1hbC54LCBub3JtYWwueSwgbm9ybWFsLnogKTtcblxuXHRcdFx0Ly8gdXZcblxuXHRcdFx0dXZzLnB1c2goIGkgLyB0dWJ1bGFyU2VnbWVudHMgKTtcblx0XHRcdHV2cy5wdXNoKCBqIC8gcmFkaWFsU2VnbWVudHMgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gZ2VuZXJhdGUgaW5kaWNlc1xuXG5cdGZvciAoIGogPSAxOyBqIDw9IHJhZGlhbFNlZ21lbnRzOyBqICsrICkge1xuXG5cdFx0Zm9yICggaSA9IDE7IGkgPD0gdHVidWxhclNlZ21lbnRzOyBpICsrICkge1xuXG5cdFx0XHQvLyBpbmRpY2VzXG5cblx0XHRcdHZhciBhID0gKCB0dWJ1bGFyU2VnbWVudHMgKyAxICkgKiBqICsgaSAtIDE7XG5cdFx0XHR2YXIgYiA9ICggdHVidWxhclNlZ21lbnRzICsgMSApICogKCBqIC0gMSApICsgaSAtIDE7XG5cdFx0XHR2YXIgYyA9ICggdHVidWxhclNlZ21lbnRzICsgMSApICogKCBqIC0gMSApICsgaTtcblx0XHRcdHZhciBkID0gKCB0dWJ1bGFyU2VnbWVudHMgKyAxICkgKiBqICsgaTtcblxuXHRcdFx0Ly8gZmFjZXNcblxuXHRcdFx0aW5kaWNlcy5wdXNoKCBhLCBiLCBkICk7XG5cdFx0XHRpbmRpY2VzLnB1c2goIGIsIGMsIGQgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gYnVpbGQgZ2VvbWV0cnlcblxuXHR0aGlzLnNldEluZGV4KCBpbmRpY2VzICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBub3JtYWxzLCAzICkgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICd1dicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB1dnMsIDIgKSApO1xuXG59XG5cblRvcnVzQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7XG5Ub3J1c0J1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFRvcnVzQnVmZmVyR2VvbWV0cnk7XG5cbi8qKlxuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqIFBvcnQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L2VhcmN1dCAodjIuMS4yKVxuICovXG5cbnZhciBFYXJjdXQgPSB7XG5cblx0dHJpYW5ndWxhdGU6IGZ1bmN0aW9uICggZGF0YSwgaG9sZUluZGljZXMsIGRpbSApIHtcblxuXHRcdGRpbSA9IGRpbSB8fCAyO1xuXG5cdFx0dmFyIGhhc0hvbGVzID0gaG9sZUluZGljZXMgJiYgaG9sZUluZGljZXMubGVuZ3RoLFxuXHRcdFx0b3V0ZXJMZW4gPSBoYXNIb2xlcyA/IGhvbGVJbmRpY2VzWyAwIF0gKiBkaW0gOiBkYXRhLmxlbmd0aCxcblx0XHRcdG91dGVyTm9kZSA9IGxpbmtlZExpc3QoIGRhdGEsIDAsIG91dGVyTGVuLCBkaW0sIHRydWUgKSxcblx0XHRcdHRyaWFuZ2xlcyA9IFtdO1xuXG5cdFx0aWYgKCAhIG91dGVyTm9kZSApIHJldHVybiB0cmlhbmdsZXM7XG5cblx0XHR2YXIgbWluWCwgbWluWSwgbWF4WCwgbWF4WSwgeCwgeSwgaW52U2l6ZTtcblxuXHRcdGlmICggaGFzSG9sZXMgKSBvdXRlck5vZGUgPSBlbGltaW5hdGVIb2xlcyggZGF0YSwgaG9sZUluZGljZXMsIG91dGVyTm9kZSwgZGltICk7XG5cblx0XHQvLyBpZiB0aGUgc2hhcGUgaXMgbm90IHRvbyBzaW1wbGUsIHdlJ2xsIHVzZSB6LW9yZGVyIGN1cnZlIGhhc2ggbGF0ZXI7IGNhbGN1bGF0ZSBwb2x5Z29uIGJib3hcblxuXHRcdGlmICggZGF0YS5sZW5ndGggPiA4MCAqIGRpbSApIHtcblxuXHRcdFx0bWluWCA9IG1heFggPSBkYXRhWyAwIF07XG5cdFx0XHRtaW5ZID0gbWF4WSA9IGRhdGFbIDEgXTtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSBkaW07IGkgPCBvdXRlckxlbjsgaSArPSBkaW0gKSB7XG5cblx0XHRcdFx0eCA9IGRhdGFbIGkgXTtcblx0XHRcdFx0eSA9IGRhdGFbIGkgKyAxIF07XG5cdFx0XHRcdGlmICggeCA8IG1pblggKSBtaW5YID0geDtcblx0XHRcdFx0aWYgKCB5IDwgbWluWSApIG1pblkgPSB5O1xuXHRcdFx0XHRpZiAoIHggPiBtYXhYICkgbWF4WCA9IHg7XG5cdFx0XHRcdGlmICggeSA+IG1heFkgKSBtYXhZID0geTtcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBtaW5YLCBtaW5ZIGFuZCBpbnZTaXplIGFyZSBsYXRlciB1c2VkIHRvIHRyYW5zZm9ybSBjb29yZHMgaW50byBpbnRlZ2VycyBmb3Igei1vcmRlciBjYWxjdWxhdGlvblxuXG5cdFx0XHRpbnZTaXplID0gTWF0aC5tYXgoIG1heFggLSBtaW5YLCBtYXhZIC0gbWluWSApO1xuXHRcdFx0aW52U2l6ZSA9IGludlNpemUgIT09IDAgPyAxIC8gaW52U2l6ZSA6IDA7XG5cblx0XHR9XG5cblx0XHRlYXJjdXRMaW5rZWQoIG91dGVyTm9kZSwgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIGludlNpemUgKTtcblxuXHRcdHJldHVybiB0cmlhbmdsZXM7XG5cblx0fVxuXG59O1xuXG4vLyBjcmVhdGUgYSBjaXJjdWxhciBkb3VibHkgbGlua2VkIGxpc3QgZnJvbSBwb2x5Z29uIHBvaW50cyBpbiB0aGUgc3BlY2lmaWVkIHdpbmRpbmcgb3JkZXJcblxuZnVuY3Rpb24gbGlua2VkTGlzdCggZGF0YSwgc3RhcnQsIGVuZCwgZGltLCBjbG9ja3dpc2UgKSB7XG5cblx0dmFyIGksIGxhc3Q7XG5cblx0aWYgKCBjbG9ja3dpc2UgPT09ICggc2lnbmVkQXJlYSggZGF0YSwgc3RhcnQsIGVuZCwgZGltICkgPiAwICkgKSB7XG5cblx0XHRmb3IgKCBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkgKz0gZGltICkgbGFzdCA9IGluc2VydE5vZGUoIGksIGRhdGFbIGkgXSwgZGF0YVsgaSArIDEgXSwgbGFzdCApO1xuXG5cdH0gZWxzZSB7XG5cblx0XHRmb3IgKCBpID0gZW5kIC0gZGltOyBpID49IHN0YXJ0OyBpIC09IGRpbSApIGxhc3QgPSBpbnNlcnROb2RlKCBpLCBkYXRhWyBpIF0sIGRhdGFbIGkgKyAxIF0sIGxhc3QgKTtcblxuXHR9XG5cblx0aWYgKCBsYXN0ICYmIGVxdWFscyggbGFzdCwgbGFzdC5uZXh0ICkgKSB7XG5cblx0XHRyZW1vdmVOb2RlKCBsYXN0ICk7XG5cdFx0bGFzdCA9IGxhc3QubmV4dDtcblxuXHR9XG5cblx0cmV0dXJuIGxhc3Q7XG5cbn1cblxuLy8gZWxpbWluYXRlIGNvbGluZWFyIG9yIGR1cGxpY2F0ZSBwb2ludHNcblxuZnVuY3Rpb24gZmlsdGVyUG9pbnRzKCBzdGFydCwgZW5kICkge1xuXG5cdGlmICggISBzdGFydCApIHJldHVybiBzdGFydDtcblx0aWYgKCAhIGVuZCApIGVuZCA9IHN0YXJ0O1xuXG5cdHZhciBwID0gc3RhcnQsIGFnYWluO1xuXG5cdGRvIHtcblxuXHRcdGFnYWluID0gZmFsc2U7XG5cblx0XHRpZiAoICEgcC5zdGVpbmVyICYmICggZXF1YWxzKCBwLCBwLm5leHQgKSB8fCBhcmVhKCBwLnByZXYsIHAsIHAubmV4dCApID09PSAwICkgKSB7XG5cblx0XHRcdHJlbW92ZU5vZGUoIHAgKTtcblx0XHRcdHAgPSBlbmQgPSBwLnByZXY7XG5cdFx0XHRpZiAoIHAgPT09IHAubmV4dCApIGJyZWFrO1xuXHRcdFx0YWdhaW4gPSB0cnVlO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0cCA9IHAubmV4dDtcblxuXHRcdH1cblxuXHR9IHdoaWxlICggYWdhaW4gfHwgcCAhPT0gZW5kICk7XG5cblx0cmV0dXJuIGVuZDtcblxufVxuXG4vLyBtYWluIGVhciBzbGljaW5nIGxvb3Agd2hpY2ggdHJpYW5ndWxhdGVzIGEgcG9seWdvbiAoZ2l2ZW4gYXMgYSBsaW5rZWQgbGlzdClcblxuZnVuY3Rpb24gZWFyY3V0TGlua2VkKCBlYXIsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplLCBwYXNzICkge1xuXG5cdGlmICggISBlYXIgKSByZXR1cm47XG5cblx0Ly8gaW50ZXJsaW5rIHBvbHlnb24gbm9kZXMgaW4gei1vcmRlclxuXG5cdGlmICggISBwYXNzICYmIGludlNpemUgKSBpbmRleEN1cnZlKCBlYXIsIG1pblgsIG1pblksIGludlNpemUgKTtcblxuXHR2YXIgc3RvcCA9IGVhciwgcHJldiwgbmV4dDtcblxuXHQvLyBpdGVyYXRlIHRocm91Z2ggZWFycywgc2xpY2luZyB0aGVtIG9uZSBieSBvbmVcblxuXHR3aGlsZSAoIGVhci5wcmV2ICE9PSBlYXIubmV4dCApIHtcblxuXHRcdHByZXYgPSBlYXIucHJldjtcblx0XHRuZXh0ID0gZWFyLm5leHQ7XG5cblx0XHRpZiAoIGludlNpemUgPyBpc0Vhckhhc2hlZCggZWFyLCBtaW5YLCBtaW5ZLCBpbnZTaXplICkgOiBpc0VhciggZWFyICkgKSB7XG5cblx0XHRcdC8vIGN1dCBvZmYgdGhlIHRyaWFuZ2xlXG5cdFx0XHR0cmlhbmdsZXMucHVzaCggcHJldi5pIC8gZGltICk7XG5cdFx0XHR0cmlhbmdsZXMucHVzaCggZWFyLmkgLyBkaW0gKTtcblx0XHRcdHRyaWFuZ2xlcy5wdXNoKCBuZXh0LmkgLyBkaW0gKTtcblxuXHRcdFx0cmVtb3ZlTm9kZSggZWFyICk7XG5cblx0XHRcdC8vIHNraXBwaW5nIHRoZSBuZXh0IHZlcnRpY2UgbGVhZHMgdG8gbGVzcyBzbGl2ZXIgdHJpYW5nbGVzXG5cdFx0XHRlYXIgPSBuZXh0Lm5leHQ7XG5cdFx0XHRzdG9wID0gbmV4dC5uZXh0O1xuXG5cdFx0XHRjb250aW51ZTtcblxuXHRcdH1cblxuXHRcdGVhciA9IG5leHQ7XG5cblx0XHQvLyBpZiB3ZSBsb29wZWQgdGhyb3VnaCB0aGUgd2hvbGUgcmVtYWluaW5nIHBvbHlnb24gYW5kIGNhbid0IGZpbmQgYW55IG1vcmUgZWFyc1xuXG5cdFx0aWYgKCBlYXIgPT09IHN0b3AgKSB7XG5cblx0XHRcdC8vIHRyeSBmaWx0ZXJpbmcgcG9pbnRzIGFuZCBzbGljaW5nIGFnYWluXG5cblx0XHRcdGlmICggISBwYXNzICkge1xuXG5cdFx0XHRcdGVhcmN1dExpbmtlZCggZmlsdGVyUG9pbnRzKCBlYXIgKSwgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIGludlNpemUsIDEgKTtcblxuXHRcdFx0XHQvLyBpZiB0aGlzIGRpZG4ndCB3b3JrLCB0cnkgY3VyaW5nIGFsbCBzbWFsbCBzZWxmLWludGVyc2VjdGlvbnMgbG9jYWxseVxuXG5cdFx0XHR9IGVsc2UgaWYgKCBwYXNzID09PSAxICkge1xuXG5cdFx0XHRcdGVhciA9IGN1cmVMb2NhbEludGVyc2VjdGlvbnMoIGVhciwgdHJpYW5nbGVzLCBkaW0gKTtcblx0XHRcdFx0ZWFyY3V0TGlua2VkKCBlYXIsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplLCAyICk7XG5cblx0XHRcdC8vIGFzIGEgbGFzdCByZXNvcnQsIHRyeSBzcGxpdHRpbmcgdGhlIHJlbWFpbmluZyBwb2x5Z29uIGludG8gdHdvXG5cblx0XHRcdH0gZWxzZSBpZiAoIHBhc3MgPT09IDIgKSB7XG5cblx0XHRcdFx0c3BsaXRFYXJjdXQoIGVhciwgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIGludlNpemUgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRicmVhaztcblxuXHRcdH1cblxuXHR9XG5cbn1cblxuLy8gY2hlY2sgd2hldGhlciBhIHBvbHlnb24gbm9kZSBmb3JtcyBhIHZhbGlkIGVhciB3aXRoIGFkamFjZW50IG5vZGVzXG5cbmZ1bmN0aW9uIGlzRWFyKCBlYXIgKSB7XG5cblx0dmFyIGEgPSBlYXIucHJldixcblx0XHRiID0gZWFyLFxuXHRcdGMgPSBlYXIubmV4dDtcblxuXHRpZiAoIGFyZWEoIGEsIGIsIGMgKSA+PSAwICkgcmV0dXJuIGZhbHNlOyAvLyByZWZsZXgsIGNhbid0IGJlIGFuIGVhclxuXG5cdC8vIG5vdyBtYWtlIHN1cmUgd2UgZG9uJ3QgaGF2ZSBvdGhlciBwb2ludHMgaW5zaWRlIHRoZSBwb3RlbnRpYWwgZWFyXG5cdHZhciBwID0gZWFyLm5leHQubmV4dDtcblxuXHR3aGlsZSAoIHAgIT09IGVhci5wcmV2ICkge1xuXG5cdFx0aWYgKCBwb2ludEluVHJpYW5nbGUoIGEueCwgYS55LCBiLngsIGIueSwgYy54LCBjLnksIHAueCwgcC55ICkgJiYgYXJlYSggcC5wcmV2LCBwLCBwLm5leHQgKSA+PSAwICkge1xuXG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cblx0XHR9XG5cblx0XHRwID0gcC5uZXh0O1xuXG5cdH1cblxuXHRyZXR1cm4gdHJ1ZTtcblxufVxuXG5mdW5jdGlvbiBpc0Vhckhhc2hlZCggZWFyLCBtaW5YLCBtaW5ZLCBpbnZTaXplICkge1xuXG5cdHZhciBhID0gZWFyLnByZXYsXG5cdFx0YiA9IGVhcixcblx0XHRjID0gZWFyLm5leHQ7XG5cblx0aWYgKCBhcmVhKCBhLCBiLCBjICkgPj0gMCApIHJldHVybiBmYWxzZTsgLy8gcmVmbGV4LCBjYW4ndCBiZSBhbiBlYXJcblxuXHQvLyB0cmlhbmdsZSBiYm94OyBtaW4gJiBtYXggYXJlIGNhbGN1bGF0ZWQgbGlrZSB0aGlzIGZvciBzcGVlZFxuXG5cdHZhciBtaW5UWCA9IGEueCA8IGIueCA/ICggYS54IDwgYy54ID8gYS54IDogYy54ICkgOiAoIGIueCA8IGMueCA/IGIueCA6IGMueCApLFxuXHRcdG1pblRZID0gYS55IDwgYi55ID8gKCBhLnkgPCBjLnkgPyBhLnkgOiBjLnkgKSA6ICggYi55IDwgYy55ID8gYi55IDogYy55ICksXG5cdFx0bWF4VFggPSBhLnggPiBiLnggPyAoIGEueCA+IGMueCA/IGEueCA6IGMueCApIDogKCBiLnggPiBjLnggPyBiLnggOiBjLnggKSxcblx0XHRtYXhUWSA9IGEueSA+IGIueSA/ICggYS55ID4gYy55ID8gYS55IDogYy55ICkgOiAoIGIueSA+IGMueSA/IGIueSA6IGMueSApO1xuXG5cdC8vIHotb3JkZXIgcmFuZ2UgZm9yIHRoZSBjdXJyZW50IHRyaWFuZ2xlIGJib3g7XG5cblx0dmFyIG1pblogPSB6T3JkZXIoIG1pblRYLCBtaW5UWSwgbWluWCwgbWluWSwgaW52U2l6ZSApLFxuXHRcdG1heFogPSB6T3JkZXIoIG1heFRYLCBtYXhUWSwgbWluWCwgbWluWSwgaW52U2l6ZSApO1xuXG5cdC8vIGZpcnN0IGxvb2sgZm9yIHBvaW50cyBpbnNpZGUgdGhlIHRyaWFuZ2xlIGluIGluY3JlYXNpbmcgei1vcmRlclxuXG5cdHZhciBwID0gZWFyLm5leHRaO1xuXG5cdHdoaWxlICggcCAmJiBwLnogPD0gbWF4WiApIHtcblxuXHRcdGlmICggcCAhPT0gZWFyLnByZXYgJiYgcCAhPT0gZWFyLm5leHQgJiZcblx0XHRcdFx0cG9pbnRJblRyaWFuZ2xlKCBhLngsIGEueSwgYi54LCBiLnksIGMueCwgYy55LCBwLngsIHAueSApICYmXG5cdFx0XHRcdGFyZWEoIHAucHJldiwgcCwgcC5uZXh0ICkgPj0gMCApIHJldHVybiBmYWxzZTtcblx0XHRwID0gcC5uZXh0WjtcblxuXHR9XG5cblx0Ly8gdGhlbiBsb29rIGZvciBwb2ludHMgaW4gZGVjcmVhc2luZyB6LW9yZGVyXG5cblx0cCA9IGVhci5wcmV2WjtcblxuXHR3aGlsZSAoIHAgJiYgcC56ID49IG1pblogKSB7XG5cblx0XHRpZiAoIHAgIT09IGVhci5wcmV2ICYmIHAgIT09IGVhci5uZXh0ICYmXG5cdFx0XHRcdHBvaW50SW5UcmlhbmdsZSggYS54LCBhLnksIGIueCwgYi55LCBjLngsIGMueSwgcC54LCBwLnkgKSAmJlxuXHRcdFx0XHRhcmVhKCBwLnByZXYsIHAsIHAubmV4dCApID49IDAgKSByZXR1cm4gZmFsc2U7XG5cblx0XHRwID0gcC5wcmV2WjtcblxuXHR9XG5cblx0cmV0dXJuIHRydWU7XG5cbn1cblxuLy8gZ28gdGhyb3VnaCBhbGwgcG9seWdvbiBub2RlcyBhbmQgY3VyZSBzbWFsbCBsb2NhbCBzZWxmLWludGVyc2VjdGlvbnNcblxuZnVuY3Rpb24gY3VyZUxvY2FsSW50ZXJzZWN0aW9ucyggc3RhcnQsIHRyaWFuZ2xlcywgZGltICkge1xuXG5cdHZhciBwID0gc3RhcnQ7XG5cblx0ZG8ge1xuXG5cdFx0dmFyIGEgPSBwLnByZXYsIGIgPSBwLm5leHQubmV4dDtcblxuXHRcdGlmICggISBlcXVhbHMoIGEsIGIgKSAmJiBpbnRlcnNlY3RzKCBhLCBwLCBwLm5leHQsIGIgKSAmJiBsb2NhbGx5SW5zaWRlKCBhLCBiICkgJiYgbG9jYWxseUluc2lkZSggYiwgYSApICkge1xuXG5cdFx0XHR0cmlhbmdsZXMucHVzaCggYS5pIC8gZGltICk7XG5cdFx0XHR0cmlhbmdsZXMucHVzaCggcC5pIC8gZGltICk7XG5cdFx0XHR0cmlhbmdsZXMucHVzaCggYi5pIC8gZGltICk7XG5cblx0XHRcdC8vIHJlbW92ZSB0d28gbm9kZXMgaW52b2x2ZWRcblxuXHRcdFx0cmVtb3ZlTm9kZSggcCApO1xuXHRcdFx0cmVtb3ZlTm9kZSggcC5uZXh0ICk7XG5cblx0XHRcdHAgPSBzdGFydCA9IGI7XG5cblx0XHR9XG5cblx0XHRwID0gcC5uZXh0O1xuXG5cdH0gd2hpbGUgKCBwICE9PSBzdGFydCApO1xuXG5cdHJldHVybiBwO1xuXG59XG5cbi8vIHRyeSBzcGxpdHRpbmcgcG9seWdvbiBpbnRvIHR3byBhbmQgdHJpYW5ndWxhdGUgdGhlbSBpbmRlcGVuZGVudGx5XG5cbmZ1bmN0aW9uIHNwbGl0RWFyY3V0KCBzdGFydCwgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIGludlNpemUgKSB7XG5cblx0Ly8gbG9vayBmb3IgYSB2YWxpZCBkaWFnb25hbCB0aGF0IGRpdmlkZXMgdGhlIHBvbHlnb24gaW50byB0d29cblxuXHR2YXIgYSA9IHN0YXJ0O1xuXG5cdGRvIHtcblxuXHRcdHZhciBiID0gYS5uZXh0Lm5leHQ7XG5cblx0XHR3aGlsZSAoIGIgIT09IGEucHJldiApIHtcblxuXHRcdFx0aWYgKCBhLmkgIT09IGIuaSAmJiBpc1ZhbGlkRGlhZ29uYWwoIGEsIGIgKSApIHtcblxuXHRcdFx0XHQvLyBzcGxpdCB0aGUgcG9seWdvbiBpbiB0d28gYnkgdGhlIGRpYWdvbmFsXG5cblx0XHRcdFx0dmFyIGMgPSBzcGxpdFBvbHlnb24oIGEsIGIgKTtcblxuXHRcdFx0XHQvLyBmaWx0ZXIgY29saW5lYXIgcG9pbnRzIGFyb3VuZCB0aGUgY3V0c1xuXG5cdFx0XHRcdGEgPSBmaWx0ZXJQb2ludHMoIGEsIGEubmV4dCApO1xuXHRcdFx0XHRjID0gZmlsdGVyUG9pbnRzKCBjLCBjLm5leHQgKTtcblxuXHRcdFx0XHQvLyBydW4gZWFyY3V0IG9uIGVhY2ggaGFsZlxuXG5cdFx0XHRcdGVhcmN1dExpbmtlZCggYSwgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIGludlNpemUgKTtcblx0XHRcdFx0ZWFyY3V0TGlua2VkKCBjLCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgaW52U2l6ZSApO1xuXHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdH1cblxuXHRcdFx0YiA9IGIubmV4dDtcblxuXHRcdH1cblxuXHRcdGEgPSBhLm5leHQ7XG5cblx0fSB3aGlsZSAoIGEgIT09IHN0YXJ0ICk7XG5cbn1cblxuLy8gbGluayBldmVyeSBob2xlIGludG8gdGhlIG91dGVyIGxvb3AsIHByb2R1Y2luZyBhIHNpbmdsZS1yaW5nIHBvbHlnb24gd2l0aG91dCBob2xlc1xuXG5mdW5jdGlvbiBlbGltaW5hdGVIb2xlcyggZGF0YSwgaG9sZUluZGljZXMsIG91dGVyTm9kZSwgZGltICkge1xuXG5cdHZhciBxdWV1ZSA9IFtdLCBpLCBsZW4sIHN0YXJ0LCBlbmQsIGxpc3Q7XG5cblx0Zm9yICggaSA9IDAsIGxlbiA9IGhvbGVJbmRpY2VzLmxlbmd0aDsgaSA8IGxlbjsgaSArKyApIHtcblxuXHRcdHN0YXJ0ID0gaG9sZUluZGljZXNbIGkgXSAqIGRpbTtcblx0XHRlbmQgPSBpIDwgbGVuIC0gMSA/IGhvbGVJbmRpY2VzWyBpICsgMSBdICogZGltIDogZGF0YS5sZW5ndGg7XG5cdFx0bGlzdCA9IGxpbmtlZExpc3QoIGRhdGEsIHN0YXJ0LCBlbmQsIGRpbSwgZmFsc2UgKTtcblx0XHRpZiAoIGxpc3QgPT09IGxpc3QubmV4dCApIGxpc3Quc3RlaW5lciA9IHRydWU7XG5cdFx0cXVldWUucHVzaCggZ2V0TGVmdG1vc3QoIGxpc3QgKSApO1xuXG5cdH1cblxuXHRxdWV1ZS5zb3J0KCBjb21wYXJlWCApO1xuXG5cdC8vIHByb2Nlc3MgaG9sZXMgZnJvbSBsZWZ0IHRvIHJpZ2h0XG5cblx0Zm9yICggaSA9IDA7IGkgPCBxdWV1ZS5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRlbGltaW5hdGVIb2xlKCBxdWV1ZVsgaSBdLCBvdXRlck5vZGUgKTtcblx0XHRvdXRlck5vZGUgPSBmaWx0ZXJQb2ludHMoIG91dGVyTm9kZSwgb3V0ZXJOb2RlLm5leHQgKTtcblxuXHR9XG5cblx0cmV0dXJuIG91dGVyTm9kZTtcblxufVxuXG5mdW5jdGlvbiBjb21wYXJlWCggYSwgYiApIHtcblxuXHRyZXR1cm4gYS54IC0gYi54O1xuXG59XG5cbi8vIGZpbmQgYSBicmlkZ2UgYmV0d2VlbiB2ZXJ0aWNlcyB0aGF0IGNvbm5lY3RzIGhvbGUgd2l0aCBhbiBvdXRlciByaW5nIGFuZCBhbmQgbGluayBpdFxuXG5mdW5jdGlvbiBlbGltaW5hdGVIb2xlKCBob2xlLCBvdXRlck5vZGUgKSB7XG5cblx0b3V0ZXJOb2RlID0gZmluZEhvbGVCcmlkZ2UoIGhvbGUsIG91dGVyTm9kZSApO1xuXG5cdGlmICggb3V0ZXJOb2RlICkge1xuXG5cdFx0dmFyIGIgPSBzcGxpdFBvbHlnb24oIG91dGVyTm9kZSwgaG9sZSApO1xuXG5cdFx0ZmlsdGVyUG9pbnRzKCBiLCBiLm5leHQgKTtcblxuXHR9XG5cbn1cblxuLy8gRGF2aWQgRWJlcmx5J3MgYWxnb3JpdGhtIGZvciBmaW5kaW5nIGEgYnJpZGdlIGJldHdlZW4gaG9sZSBhbmQgb3V0ZXIgcG9seWdvblxuXG5mdW5jdGlvbiBmaW5kSG9sZUJyaWRnZSggaG9sZSwgb3V0ZXJOb2RlICkge1xuXG5cdHZhciBwID0gb3V0ZXJOb2RlLFxuXHRcdGh4ID0gaG9sZS54LFxuXHRcdGh5ID0gaG9sZS55LFxuXHRcdHF4ID0gLSBJbmZpbml0eSxcblx0XHRtO1xuXG5cdC8vIGZpbmQgYSBzZWdtZW50IGludGVyc2VjdGVkIGJ5IGEgcmF5IGZyb20gdGhlIGhvbGUncyBsZWZ0bW9zdCBwb2ludCB0byB0aGUgbGVmdDtcblx0Ly8gc2VnbWVudCdzIGVuZHBvaW50IHdpdGggbGVzc2VyIHggd2lsbCBiZSBwb3RlbnRpYWwgY29ubmVjdGlvbiBwb2ludFxuXG5cdGRvIHtcblxuXHRcdGlmICggaHkgPD0gcC55ICYmIGh5ID49IHAubmV4dC55ICYmIHAubmV4dC55ICE9PSBwLnkgKSB7XG5cblx0XHRcdHZhciB4ID0gcC54ICsgKCBoeSAtIHAueSApICogKCBwLm5leHQueCAtIHAueCApIC8gKCBwLm5leHQueSAtIHAueSApO1xuXG5cdFx0XHRpZiAoIHggPD0gaHggJiYgeCA+IHF4ICkge1xuXG5cdFx0XHRcdHF4ID0geDtcblxuXHRcdFx0XHRpZiAoIHggPT09IGh4ICkge1xuXG5cdFx0XHRcdFx0aWYgKCBoeSA9PT0gcC55ICkgcmV0dXJuIHA7XG5cdFx0XHRcdFx0aWYgKCBoeSA9PT0gcC5uZXh0LnkgKSByZXR1cm4gcC5uZXh0O1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRtID0gcC54IDwgcC5uZXh0LnggPyBwIDogcC5uZXh0O1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRwID0gcC5uZXh0O1xuXG5cdH0gd2hpbGUgKCBwICE9PSBvdXRlck5vZGUgKTtcblxuXHRpZiAoICEgbSApIHJldHVybiBudWxsO1xuXG5cdGlmICggaHggPT09IHF4ICkgcmV0dXJuIG0ucHJldjsgLy8gaG9sZSB0b3VjaGVzIG91dGVyIHNlZ21lbnQ7IHBpY2sgbG93ZXIgZW5kcG9pbnRcblxuXHQvLyBsb29rIGZvciBwb2ludHMgaW5zaWRlIHRoZSB0cmlhbmdsZSBvZiBob2xlIHBvaW50LCBzZWdtZW50IGludGVyc2VjdGlvbiBhbmQgZW5kcG9pbnQ7XG5cdC8vIGlmIHRoZXJlIGFyZSBubyBwb2ludHMgZm91bmQsIHdlIGhhdmUgYSB2YWxpZCBjb25uZWN0aW9uO1xuXHQvLyBvdGhlcndpc2UgY2hvb3NlIHRoZSBwb2ludCBvZiB0aGUgbWluaW11bSBhbmdsZSB3aXRoIHRoZSByYXkgYXMgY29ubmVjdGlvbiBwb2ludFxuXG5cdHZhciBzdG9wID0gbSxcblx0XHRteCA9IG0ueCxcblx0XHRteSA9IG0ueSxcblx0XHR0YW5NaW4gPSBJbmZpbml0eSxcblx0XHR0YW47XG5cblx0cCA9IG0ubmV4dDtcblxuXHR3aGlsZSAoIHAgIT09IHN0b3AgKSB7XG5cblx0XHRpZiAoIGh4ID49IHAueCAmJiBwLnggPj0gbXggJiYgaHggIT09IHAueCAmJlxuXHRcdFx0XHRcdFx0cG9pbnRJblRyaWFuZ2xlKCBoeSA8IG15ID8gaHggOiBxeCwgaHksIG14LCBteSwgaHkgPCBteSA/IHF4IDogaHgsIGh5LCBwLngsIHAueSApICkge1xuXG5cdFx0XHR0YW4gPSBNYXRoLmFicyggaHkgLSBwLnkgKSAvICggaHggLSBwLnggKTsgLy8gdGFuZ2VudGlhbFxuXG5cdFx0XHRpZiAoICggdGFuIDwgdGFuTWluIHx8ICggdGFuID09PSB0YW5NaW4gJiYgcC54ID4gbS54ICkgKSAmJiBsb2NhbGx5SW5zaWRlKCBwLCBob2xlICkgKSB7XG5cblx0XHRcdFx0bSA9IHA7XG5cdFx0XHRcdHRhbk1pbiA9IHRhbjtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cCA9IHAubmV4dDtcblxuXHR9XG5cblx0cmV0dXJuIG07XG5cbn1cblxuLy8gaW50ZXJsaW5rIHBvbHlnb24gbm9kZXMgaW4gei1vcmRlclxuXG5mdW5jdGlvbiBpbmRleEN1cnZlKCBzdGFydCwgbWluWCwgbWluWSwgaW52U2l6ZSApIHtcblxuXHR2YXIgcCA9IHN0YXJ0O1xuXG5cdGRvIHtcblxuXHRcdGlmICggcC56ID09PSBudWxsICkgcC56ID0gek9yZGVyKCBwLngsIHAueSwgbWluWCwgbWluWSwgaW52U2l6ZSApO1xuXHRcdHAucHJldlogPSBwLnByZXY7XG5cdFx0cC5uZXh0WiA9IHAubmV4dDtcblx0XHRwID0gcC5uZXh0O1xuXG5cdH0gd2hpbGUgKCBwICE9PSBzdGFydCApO1xuXG5cdHAucHJldloubmV4dFogPSBudWxsO1xuXHRwLnByZXZaID0gbnVsbDtcblxuXHRzb3J0TGlua2VkKCBwICk7XG5cbn1cblxuLy8gU2ltb24gVGF0aGFtJ3MgbGlua2VkIGxpc3QgbWVyZ2Ugc29ydCBhbGdvcml0aG1cbi8vIGh0dHA6Ly93d3cuY2hpYXJrLmdyZWVuZW5kLm9yZy51ay9+c2d0YXRoYW0vYWxnb3JpdGhtcy9saXN0c29ydC5odG1sXG5cbmZ1bmN0aW9uIHNvcnRMaW5rZWQoIGxpc3QgKSB7XG5cblx0dmFyIGksIHAsIHEsIGUsIHRhaWwsIG51bU1lcmdlcywgcFNpemUsIHFTaXplLCBpblNpemUgPSAxO1xuXG5cdGRvIHtcblxuXHRcdHAgPSBsaXN0O1xuXHRcdGxpc3QgPSBudWxsO1xuXHRcdHRhaWwgPSBudWxsO1xuXHRcdG51bU1lcmdlcyA9IDA7XG5cblx0XHR3aGlsZSAoIHAgKSB7XG5cblx0XHRcdG51bU1lcmdlcyArKztcblx0XHRcdHEgPSBwO1xuXHRcdFx0cFNpemUgPSAwO1xuXG5cdFx0XHRmb3IgKCBpID0gMDsgaSA8IGluU2l6ZTsgaSArKyApIHtcblxuXHRcdFx0XHRwU2l6ZSArKztcblx0XHRcdFx0cSA9IHEubmV4dFo7XG5cdFx0XHRcdGlmICggISBxICkgYnJlYWs7XG5cblx0XHRcdH1cblxuXHRcdFx0cVNpemUgPSBpblNpemU7XG5cblx0XHRcdHdoaWxlICggcFNpemUgPiAwIHx8ICggcVNpemUgPiAwICYmIHEgKSApIHtcblxuXHRcdFx0XHRpZiAoIHBTaXplICE9PSAwICYmICggcVNpemUgPT09IDAgfHwgISBxIHx8IHAueiA8PSBxLnogKSApIHtcblxuXHRcdFx0XHRcdGUgPSBwO1xuXHRcdFx0XHRcdHAgPSBwLm5leHRaO1xuXHRcdFx0XHRcdHBTaXplIC0tO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRlID0gcTtcblx0XHRcdFx0XHRxID0gcS5uZXh0Wjtcblx0XHRcdFx0XHRxU2l6ZSAtLTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCB0YWlsICkgdGFpbC5uZXh0WiA9IGU7XG5cdFx0XHRcdGVsc2UgbGlzdCA9IGU7XG5cblx0XHRcdFx0ZS5wcmV2WiA9IHRhaWw7XG5cdFx0XHRcdHRhaWwgPSBlO1xuXG5cdFx0XHR9XG5cblx0XHRcdHAgPSBxO1xuXG5cdFx0fVxuXG5cdFx0dGFpbC5uZXh0WiA9IG51bGw7XG5cdFx0aW5TaXplICo9IDI7XG5cblx0fSB3aGlsZSAoIG51bU1lcmdlcyA+IDEgKTtcblxuXHRyZXR1cm4gbGlzdDtcblxufVxuXG4vLyB6LW9yZGVyIG9mIGEgcG9pbnQgZ2l2ZW4gY29vcmRzIGFuZCBpbnZlcnNlIG9mIHRoZSBsb25nZXIgc2lkZSBvZiBkYXRhIGJib3hcblxuZnVuY3Rpb24gek9yZGVyKCB4LCB5LCBtaW5YLCBtaW5ZLCBpbnZTaXplICkge1xuXG5cdC8vIGNvb3JkcyBhcmUgdHJhbnNmb3JtZWQgaW50byBub24tbmVnYXRpdmUgMTUtYml0IGludGVnZXIgcmFuZ2VcblxuXHR4ID0gMzI3NjcgKiAoIHggLSBtaW5YICkgKiBpbnZTaXplO1xuXHR5ID0gMzI3NjcgKiAoIHkgLSBtaW5ZICkgKiBpbnZTaXplO1xuXG5cdHggPSAoIHggfCAoIHggPDwgOCApICkgJiAweDAwRkYwMEZGO1xuXHR4ID0gKCB4IHwgKCB4IDw8IDQgKSApICYgMHgwRjBGMEYwRjtcblx0eCA9ICggeCB8ICggeCA8PCAyICkgKSAmIDB4MzMzMzMzMzM7XG5cdHggPSAoIHggfCAoIHggPDwgMSApICkgJiAweDU1NTU1NTU1O1xuXG5cdHkgPSAoIHkgfCAoIHkgPDwgOCApICkgJiAweDAwRkYwMEZGO1xuXHR5ID0gKCB5IHwgKCB5IDw8IDQgKSApICYgMHgwRjBGMEYwRjtcblx0eSA9ICggeSB8ICggeSA8PCAyICkgKSAmIDB4MzMzMzMzMzM7XG5cdHkgPSAoIHkgfCAoIHkgPDwgMSApICkgJiAweDU1NTU1NTU1O1xuXG5cdHJldHVybiB4IHwgKCB5IDw8IDEgKTtcblxufVxuXG4vLyBmaW5kIHRoZSBsZWZ0bW9zdCBub2RlIG9mIGEgcG9seWdvbiByaW5nXG5cbmZ1bmN0aW9uIGdldExlZnRtb3N0KCBzdGFydCApIHtcblxuXHR2YXIgcCA9IHN0YXJ0LCBsZWZ0bW9zdCA9IHN0YXJ0O1xuXG5cdGRvIHtcblxuXHRcdGlmICggcC54IDwgbGVmdG1vc3QueCApIGxlZnRtb3N0ID0gcDtcblx0XHRwID0gcC5uZXh0O1xuXG5cdH0gd2hpbGUgKCBwICE9PSBzdGFydCApO1xuXG5cdHJldHVybiBsZWZ0bW9zdDtcblxufVxuXG4vLyBjaGVjayBpZiBhIHBvaW50IGxpZXMgd2l0aGluIGEgY29udmV4IHRyaWFuZ2xlXG5cbmZ1bmN0aW9uIHBvaW50SW5UcmlhbmdsZSggYXgsIGF5LCBieCwgYnksIGN4LCBjeSwgcHgsIHB5ICkge1xuXG5cdHJldHVybiAoIGN4IC0gcHggKSAqICggYXkgLSBweSApIC0gKCBheCAtIHB4ICkgKiAoIGN5IC0gcHkgKSA+PSAwICYmXG5cdCAoIGF4IC0gcHggKSAqICggYnkgLSBweSApIC0gKCBieCAtIHB4ICkgKiAoIGF5IC0gcHkgKSA+PSAwICYmXG5cdCAoIGJ4IC0gcHggKSAqICggY3kgLSBweSApIC0gKCBjeCAtIHB4ICkgKiAoIGJ5IC0gcHkgKSA+PSAwO1xuXG59XG5cbi8vIGNoZWNrIGlmIGEgZGlhZ29uYWwgYmV0d2VlbiB0d28gcG9seWdvbiBub2RlcyBpcyB2YWxpZCAobGllcyBpbiBwb2x5Z29uIGludGVyaW9yKVxuXG5mdW5jdGlvbiBpc1ZhbGlkRGlhZ29uYWwoIGEsIGIgKSB7XG5cblx0cmV0dXJuIGEubmV4dC5pICE9PSBiLmkgJiYgYS5wcmV2LmkgIT09IGIuaSAmJiAhIGludGVyc2VjdHNQb2x5Z29uKCBhLCBiICkgJiZcblx0XHRsb2NhbGx5SW5zaWRlKCBhLCBiICkgJiYgbG9jYWxseUluc2lkZSggYiwgYSApICYmIG1pZGRsZUluc2lkZSggYSwgYiApO1xuXG59XG5cbi8vIHNpZ25lZCBhcmVhIG9mIGEgdHJpYW5nbGVcblxuZnVuY3Rpb24gYXJlYSggcCwgcSwgciApIHtcblxuXHRyZXR1cm4gKCBxLnkgLSBwLnkgKSAqICggci54IC0gcS54ICkgLSAoIHEueCAtIHAueCApICogKCByLnkgLSBxLnkgKTtcblxufVxuXG4vLyBjaGVjayBpZiB0d28gcG9pbnRzIGFyZSBlcXVhbFxuXG5mdW5jdGlvbiBlcXVhbHMoIHAxLCBwMiApIHtcblxuXHRyZXR1cm4gcDEueCA9PT0gcDIueCAmJiBwMS55ID09PSBwMi55O1xuXG59XG5cbi8vIGNoZWNrIGlmIHR3byBzZWdtZW50cyBpbnRlcnNlY3RcblxuZnVuY3Rpb24gaW50ZXJzZWN0cyggcDEsIHExLCBwMiwgcTIgKSB7XG5cblx0aWYgKCAoIGVxdWFscyggcDEsIHExICkgJiYgZXF1YWxzKCBwMiwgcTIgKSApIHx8XG5cdFx0XHQoIGVxdWFscyggcDEsIHEyICkgJiYgZXF1YWxzKCBwMiwgcTEgKSApICkgcmV0dXJuIHRydWU7XG5cblx0cmV0dXJuIGFyZWEoIHAxLCBxMSwgcDIgKSA+IDAgIT09IGFyZWEoIHAxLCBxMSwgcTIgKSA+IDAgJiZcblx0XHRcdFx0IGFyZWEoIHAyLCBxMiwgcDEgKSA+IDAgIT09IGFyZWEoIHAyLCBxMiwgcTEgKSA+IDA7XG5cbn1cblxuLy8gY2hlY2sgaWYgYSBwb2x5Z29uIGRpYWdvbmFsIGludGVyc2VjdHMgYW55IHBvbHlnb24gc2VnbWVudHNcblxuZnVuY3Rpb24gaW50ZXJzZWN0c1BvbHlnb24oIGEsIGIgKSB7XG5cblx0dmFyIHAgPSBhO1xuXG5cdGRvIHtcblxuXHRcdGlmICggcC5pICE9PSBhLmkgJiYgcC5uZXh0LmkgIT09IGEuaSAmJiBwLmkgIT09IGIuaSAmJiBwLm5leHQuaSAhPT0gYi5pICYmXG5cdFx0XHRcdFx0XHRpbnRlcnNlY3RzKCBwLCBwLm5leHQsIGEsIGIgKSApIHtcblxuXHRcdFx0cmV0dXJuIHRydWU7XG5cblx0XHR9XG5cblx0XHRwID0gcC5uZXh0O1xuXG5cdH0gd2hpbGUgKCBwICE9PSBhICk7XG5cblx0cmV0dXJuIGZhbHNlO1xuXG59XG5cbi8vIGNoZWNrIGlmIGEgcG9seWdvbiBkaWFnb25hbCBpcyBsb2NhbGx5IGluc2lkZSB0aGUgcG9seWdvblxuXG5mdW5jdGlvbiBsb2NhbGx5SW5zaWRlKCBhLCBiICkge1xuXG5cdHJldHVybiBhcmVhKCBhLnByZXYsIGEsIGEubmV4dCApIDwgMCA/XG5cdFx0YXJlYSggYSwgYiwgYS5uZXh0ICkgPj0gMCAmJiBhcmVhKCBhLCBhLnByZXYsIGIgKSA+PSAwIDpcblx0XHRhcmVhKCBhLCBiLCBhLnByZXYgKSA8IDAgfHwgYXJlYSggYSwgYS5uZXh0LCBiICkgPCAwO1xuXG59XG5cbi8vIGNoZWNrIGlmIHRoZSBtaWRkbGUgcG9pbnQgb2YgYSBwb2x5Z29uIGRpYWdvbmFsIGlzIGluc2lkZSB0aGUgcG9seWdvblxuXG5mdW5jdGlvbiBtaWRkbGVJbnNpZGUoIGEsIGIgKSB7XG5cblx0dmFyIHAgPSBhLFxuXHRcdGluc2lkZSA9IGZhbHNlLFxuXHRcdHB4ID0gKCBhLnggKyBiLnggKSAvIDIsXG5cdFx0cHkgPSAoIGEueSArIGIueSApIC8gMjtcblxuXHRkbyB7XG5cblx0XHRpZiAoICggKCBwLnkgPiBweSApICE9PSAoIHAubmV4dC55ID4gcHkgKSApICYmIHAubmV4dC55ICE9PSBwLnkgJiZcblx0XHRcdFx0XHRcdCggcHggPCAoIHAubmV4dC54IC0gcC54ICkgKiAoIHB5IC0gcC55ICkgLyAoIHAubmV4dC55IC0gcC55ICkgKyBwLnggKSApIHtcblxuXHRcdFx0aW5zaWRlID0gISBpbnNpZGU7XG5cblx0XHR9XG5cblx0XHRwID0gcC5uZXh0O1xuXG5cdH0gd2hpbGUgKCBwICE9PSBhICk7XG5cblx0cmV0dXJuIGluc2lkZTtcblxufVxuXG4vLyBsaW5rIHR3byBwb2x5Z29uIHZlcnRpY2VzIHdpdGggYSBicmlkZ2U7IGlmIHRoZSB2ZXJ0aWNlcyBiZWxvbmcgdG8gdGhlIHNhbWUgcmluZywgaXQgc3BsaXRzIHBvbHlnb24gaW50byB0d287XG4vLyBpZiBvbmUgYmVsb25ncyB0byB0aGUgb3V0ZXIgcmluZyBhbmQgYW5vdGhlciB0byBhIGhvbGUsIGl0IG1lcmdlcyBpdCBpbnRvIGEgc2luZ2xlIHJpbmdcblxuZnVuY3Rpb24gc3BsaXRQb2x5Z29uKCBhLCBiICkge1xuXG5cdHZhciBhMiA9IG5ldyBOb2RlKCBhLmksIGEueCwgYS55ICksXG5cdFx0YjIgPSBuZXcgTm9kZSggYi5pLCBiLngsIGIueSApLFxuXHRcdGFuID0gYS5uZXh0LFxuXHRcdGJwID0gYi5wcmV2O1xuXG5cdGEubmV4dCA9IGI7XG5cdGIucHJldiA9IGE7XG5cblx0YTIubmV4dCA9IGFuO1xuXHRhbi5wcmV2ID0gYTI7XG5cblx0YjIubmV4dCA9IGEyO1xuXHRhMi5wcmV2ID0gYjI7XG5cblx0YnAubmV4dCA9IGIyO1xuXHRiMi5wcmV2ID0gYnA7XG5cblx0cmV0dXJuIGIyO1xuXG59XG5cbi8vIGNyZWF0ZSBhIG5vZGUgYW5kIG9wdGlvbmFsbHkgbGluayBpdCB3aXRoIHByZXZpb3VzIG9uZSAoaW4gYSBjaXJjdWxhciBkb3VibHkgbGlua2VkIGxpc3QpXG5cbmZ1bmN0aW9uIGluc2VydE5vZGUoIGksIHgsIHksIGxhc3QgKSB7XG5cblx0dmFyIHAgPSBuZXcgTm9kZSggaSwgeCwgeSApO1xuXG5cdGlmICggISBsYXN0ICkge1xuXG5cdFx0cC5wcmV2ID0gcDtcblx0XHRwLm5leHQgPSBwO1xuXG5cdH0gZWxzZSB7XG5cblx0XHRwLm5leHQgPSBsYXN0Lm5leHQ7XG5cdFx0cC5wcmV2ID0gbGFzdDtcblx0XHRsYXN0Lm5leHQucHJldiA9IHA7XG5cdFx0bGFzdC5uZXh0ID0gcDtcblxuXHR9XG5cblx0cmV0dXJuIHA7XG5cbn1cblxuZnVuY3Rpb24gcmVtb3ZlTm9kZSggcCApIHtcblxuXHRwLm5leHQucHJldiA9IHAucHJldjtcblx0cC5wcmV2Lm5leHQgPSBwLm5leHQ7XG5cblx0aWYgKCBwLnByZXZaICkgcC5wcmV2Wi5uZXh0WiA9IHAubmV4dFo7XG5cdGlmICggcC5uZXh0WiApIHAubmV4dFoucHJldlogPSBwLnByZXZaO1xuXG59XG5cbmZ1bmN0aW9uIE5vZGUoIGksIHgsIHkgKSB7XG5cblx0Ly8gdmVydGljZSBpbmRleCBpbiBjb29yZGluYXRlcyBhcnJheVxuXHR0aGlzLmkgPSBpO1xuXG5cdC8vIHZlcnRleCBjb29yZGluYXRlc1xuXHR0aGlzLnggPSB4O1xuXHR0aGlzLnkgPSB5O1xuXG5cdC8vIHByZXZpb3VzIGFuZCBuZXh0IHZlcnRpY2Ugbm9kZXMgaW4gYSBwb2x5Z29uIHJpbmdcblx0dGhpcy5wcmV2ID0gbnVsbDtcblx0dGhpcy5uZXh0ID0gbnVsbDtcblxuXHQvLyB6LW9yZGVyIGN1cnZlIHZhbHVlXG5cdHRoaXMueiA9IG51bGw7XG5cblx0Ly8gcHJldmlvdXMgYW5kIG5leHQgbm9kZXMgaW4gei1vcmRlclxuXHR0aGlzLnByZXZaID0gbnVsbDtcblx0dGhpcy5uZXh0WiA9IG51bGw7XG5cblx0Ly8gaW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBpcyBhIHN0ZWluZXIgcG9pbnRcblx0dGhpcy5zdGVpbmVyID0gZmFsc2U7XG5cbn1cblxuZnVuY3Rpb24gc2lnbmVkQXJlYSggZGF0YSwgc3RhcnQsIGVuZCwgZGltICkge1xuXG5cdHZhciBzdW0gPSAwO1xuXG5cdGZvciAoIHZhciBpID0gc3RhcnQsIGogPSBlbmQgLSBkaW07IGkgPCBlbmQ7IGkgKz0gZGltICkge1xuXG5cdFx0c3VtICs9ICggZGF0YVsgaiBdIC0gZGF0YVsgaSBdICkgKiAoIGRhdGFbIGkgKyAxIF0gKyBkYXRhWyBqICsgMSBdICk7XG5cdFx0aiA9IGk7XG5cblx0fVxuXG5cdHJldHVybiBzdW07XG5cbn1cblxuLyoqXG4gKiBAYXV0aG9yIHp6ODUgLyBodHRwOi8vd3d3LmxhYjRnYW1lcy5uZXQveno4NS9ibG9nXG4gKi9cblxudmFyIFNoYXBlVXRpbHMgPSB7XG5cblx0Ly8gY2FsY3VsYXRlIGFyZWEgb2YgdGhlIGNvbnRvdXIgcG9seWdvblxuXG5cdGFyZWE6IGZ1bmN0aW9uICggY29udG91ciApIHtcblxuXHRcdHZhciBuID0gY29udG91ci5sZW5ndGg7XG5cdFx0dmFyIGEgPSAwLjA7XG5cblx0XHRmb3IgKCB2YXIgcCA9IG4gLSAxLCBxID0gMDsgcSA8IG47IHAgPSBxICsrICkge1xuXG5cdFx0XHRhICs9IGNvbnRvdXJbIHAgXS54ICogY29udG91clsgcSBdLnkgLSBjb250b3VyWyBxIF0ueCAqIGNvbnRvdXJbIHAgXS55O1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGEgKiAwLjU7XG5cblx0fSxcblxuXHRpc0Nsb2NrV2lzZTogZnVuY3Rpb24gKCBwdHMgKSB7XG5cblx0XHRyZXR1cm4gU2hhcGVVdGlscy5hcmVhKCBwdHMgKSA8IDA7XG5cblx0fSxcblxuXHR0cmlhbmd1bGF0ZVNoYXBlOiBmdW5jdGlvbiAoIGNvbnRvdXIsIGhvbGVzICkge1xuXG5cdFx0dmFyIHZlcnRpY2VzID0gW107IC8vIGZsYXQgYXJyYXkgb2YgdmVydGljZXMgbGlrZSBbIHgwLHkwLCB4MSx5MSwgeDIseTIsIC4uLiBdXG5cdFx0dmFyIGhvbGVJbmRpY2VzID0gW107IC8vIGFycmF5IG9mIGhvbGUgaW5kaWNlc1xuXHRcdHZhciBmYWNlcyA9IFtdOyAvLyBmaW5hbCBhcnJheSBvZiB2ZXJ0ZXggaW5kaWNlcyBsaWtlIFsgWyBhLGIsZCBdLCBbIGIsYyxkIF0gXVxuXG5cdFx0cmVtb3ZlRHVwRW5kUHRzKCBjb250b3VyICk7XG5cdFx0YWRkQ29udG91ciggdmVydGljZXMsIGNvbnRvdXIgKTtcblxuXHRcdC8vXG5cblx0XHR2YXIgaG9sZUluZGV4ID0gY29udG91ci5sZW5ndGg7XG5cblx0XHRob2xlcy5mb3JFYWNoKCByZW1vdmVEdXBFbmRQdHMgKTtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGhvbGVzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0aG9sZUluZGljZXMucHVzaCggaG9sZUluZGV4ICk7XG5cdFx0XHRob2xlSW5kZXggKz0gaG9sZXNbIGkgXS5sZW5ndGg7XG5cdFx0XHRhZGRDb250b3VyKCB2ZXJ0aWNlcywgaG9sZXNbIGkgXSApO1xuXG5cdFx0fVxuXG5cdFx0Ly9cblxuXHRcdHZhciB0cmlhbmdsZXMgPSBFYXJjdXQudHJpYW5ndWxhdGUoIHZlcnRpY2VzLCBob2xlSW5kaWNlcyApO1xuXG5cdFx0Ly9cblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IHRyaWFuZ2xlcy5sZW5ndGg7IGkgKz0gMyApIHtcblxuXHRcdFx0ZmFjZXMucHVzaCggdHJpYW5nbGVzLnNsaWNlKCBpLCBpICsgMyApICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gZmFjZXM7XG5cblx0fVxuXG59O1xuXG5mdW5jdGlvbiByZW1vdmVEdXBFbmRQdHMoIHBvaW50cyApIHtcblxuXHR2YXIgbCA9IHBvaW50cy5sZW5ndGg7XG5cblx0aWYgKCBsID4gMiAmJiBwb2ludHNbIGwgLSAxIF0uZXF1YWxzKCBwb2ludHNbIDAgXSApICkge1xuXG5cdFx0cG9pbnRzLnBvcCgpO1xuXG5cdH1cblxufVxuXG5mdW5jdGlvbiBhZGRDb250b3VyKCB2ZXJ0aWNlcywgY29udG91ciApIHtcblxuXHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBjb250b3VyLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdHZlcnRpY2VzLnB1c2goIGNvbnRvdXJbIGkgXS54ICk7XG5cdFx0dmVydGljZXMucHVzaCggY29udG91clsgaSBdLnkgKTtcblxuXHR9XG5cbn1cblxuLyoqXG4gKiBAYXV0aG9yIHp6ODUgLyBodHRwOi8vd3d3LmxhYjRnYW1lcy5uZXQveno4NS9ibG9nXG4gKlxuICogQ3JlYXRlcyBleHRydWRlZCBnZW9tZXRyeSBmcm9tIGEgcGF0aCBzaGFwZS5cbiAqXG4gKiBwYXJhbWV0ZXJzID0ge1xuICpcbiAqICBjdXJ2ZVNlZ21lbnRzOiA8aW50PiwgLy8gbnVtYmVyIG9mIHBvaW50cyBvbiB0aGUgY3VydmVzXG4gKiAgc3RlcHM6IDxpbnQ+LCAvLyBudW1iZXIgb2YgcG9pbnRzIGZvciB6LXNpZGUgZXh0cnVzaW9ucyAvIHVzZWQgZm9yIHN1YmRpdmlkaW5nIHNlZ21lbnRzIG9mIGV4dHJ1ZGUgc3BsaW5lIHRvb1xuICogIGFtb3VudDogPGludD4sIC8vIERlcHRoIHRvIGV4dHJ1ZGUgdGhlIHNoYXBlXG4gKlxuICogIGJldmVsRW5hYmxlZDogPGJvb2w+LCAvLyB0dXJuIG9uIGJldmVsXG4gKiAgYmV2ZWxUaGlja25lc3M6IDxmbG9hdD4sIC8vIGhvdyBkZWVwIGludG8gdGhlIG9yaWdpbmFsIHNoYXBlIGJldmVsIGdvZXNcbiAqICBiZXZlbFNpemU6IDxmbG9hdD4sIC8vIGhvdyBmYXIgZnJvbSBzaGFwZSBvdXRsaW5lIGlzIGJldmVsXG4gKiAgYmV2ZWxTZWdtZW50czogPGludD4sIC8vIG51bWJlciBvZiBiZXZlbCBsYXllcnNcbiAqXG4gKiAgZXh0cnVkZVBhdGg6IDxUSFJFRS5DdXJ2ZT4gLy8gY3VydmUgdG8gZXh0cnVkZSBzaGFwZSBhbG9uZ1xuICpcbiAqICBVVkdlbmVyYXRvcjogPE9iamVjdD4gLy8gb2JqZWN0IHRoYXQgcHJvdmlkZXMgVVYgZ2VuZXJhdG9yIGZ1bmN0aW9uc1xuICpcbiAqIH1cbiAqL1xuXG4vLyBFeHRydWRlR2VvbWV0cnlcblxuZnVuY3Rpb24gRXh0cnVkZUdlb21ldHJ5KCBzaGFwZXMsIG9wdGlvbnMgKSB7XG5cblx0R2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdFeHRydWRlR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRzaGFwZXM6IHNoYXBlcyxcblx0XHRvcHRpb25zOiBvcHRpb25zXG5cdH07XG5cblx0dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIG5ldyBFeHRydWRlQnVmZmVyR2VvbWV0cnkoIHNoYXBlcywgb3B0aW9ucyApICk7XG5cdHRoaXMubWVyZ2VWZXJ0aWNlcygpO1xuXG59XG5cbkV4dHJ1ZGVHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBHZW9tZXRyeS5wcm90b3R5cGUgKTtcbkV4dHJ1ZGVHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBFeHRydWRlR2VvbWV0cnk7XG5cbi8vIEV4dHJ1ZGVCdWZmZXJHZW9tZXRyeVxuXG5mdW5jdGlvbiBFeHRydWRlQnVmZmVyR2VvbWV0cnkoIHNoYXBlcywgb3B0aW9ucyApIHtcblxuXHRCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0V4dHJ1ZGVCdWZmZXJHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHNoYXBlczogc2hhcGVzLFxuXHRcdG9wdGlvbnM6IG9wdGlvbnNcblx0fTtcblxuXHRzaGFwZXMgPSBBcnJheS5pc0FycmF5KCBzaGFwZXMgKSA/IHNoYXBlcyA6IFsgc2hhcGVzIF07XG5cblx0dmFyIHNjb3BlID0gdGhpcztcblxuXHR2YXIgdmVydGljZXNBcnJheSA9IFtdO1xuXHR2YXIgdXZBcnJheSA9IFtdO1xuXG5cdGZvciAoIHZhciBpID0gMCwgbCA9IHNoYXBlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0dmFyIHNoYXBlID0gc2hhcGVzWyBpIF07XG5cdFx0YWRkU2hhcGUoIHNoYXBlLCBvcHRpb25zICk7XG5cblx0fVxuXG5cdC8vIGJ1aWxkIGdlb21ldHJ5XG5cblx0dGhpcy5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlc0FycmF5LCAzICkgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICd1dicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB1dkFycmF5LCAyICkgKTtcblxuXHR0aGlzLmNvbXB1dGVWZXJ0ZXhOb3JtYWxzKCk7XG5cblx0Ly8gZnVuY3Rpb25zXG5cblx0ZnVuY3Rpb24gYWRkU2hhcGUoIHNoYXBlICkge1xuXG5cdFx0dmFyIHBsYWNlaG9sZGVyID0gW107XG5cblx0XHQvLyBvcHRpb25zXG5cblx0XHR2YXIgY3VydmVTZWdtZW50cyA9IG9wdGlvbnMuY3VydmVTZWdtZW50cyAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5jdXJ2ZVNlZ21lbnRzIDogMTI7XG5cdFx0dmFyIHN0ZXBzID0gb3B0aW9ucy5zdGVwcyAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5zdGVwcyA6IDE7XG5cdFx0dmFyIGFtb3VudCA9IG9wdGlvbnMuYW1vdW50ICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmFtb3VudCA6IDEwMDtcblxuXHRcdHZhciBiZXZlbEVuYWJsZWQgPSBvcHRpb25zLmJldmVsRW5hYmxlZCAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5iZXZlbEVuYWJsZWQgOiB0cnVlO1xuXHRcdHZhciBiZXZlbFRoaWNrbmVzcyA9IG9wdGlvbnMuYmV2ZWxUaGlja25lc3MgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuYmV2ZWxUaGlja25lc3MgOiA2O1xuXHRcdHZhciBiZXZlbFNpemUgPSBvcHRpb25zLmJldmVsU2l6ZSAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5iZXZlbFNpemUgOiBiZXZlbFRoaWNrbmVzcyAtIDI7XG5cdFx0dmFyIGJldmVsU2VnbWVudHMgPSBvcHRpb25zLmJldmVsU2VnbWVudHMgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuYmV2ZWxTZWdtZW50cyA6IDM7XG5cblx0XHR2YXIgZXh0cnVkZVBhdGggPSBvcHRpb25zLmV4dHJ1ZGVQYXRoO1xuXG5cdFx0dmFyIHV2Z2VuID0gb3B0aW9ucy5VVkdlbmVyYXRvciAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5VVkdlbmVyYXRvciA6IFdvcmxkVVZHZW5lcmF0b3I7XG5cblx0XHQvL1xuXG5cdFx0dmFyIGV4dHJ1ZGVQdHMsIGV4dHJ1ZGVCeVBhdGggPSBmYWxzZTtcblx0XHR2YXIgc3BsaW5lVHViZSwgYmlub3JtYWwsIG5vcm1hbCwgcG9zaXRpb24yO1xuXG5cdFx0aWYgKCBleHRydWRlUGF0aCApIHtcblxuXHRcdFx0ZXh0cnVkZVB0cyA9IGV4dHJ1ZGVQYXRoLmdldFNwYWNlZFBvaW50cyggc3RlcHMgKTtcblxuXHRcdFx0ZXh0cnVkZUJ5UGF0aCA9IHRydWU7XG5cdFx0XHRiZXZlbEVuYWJsZWQgPSBmYWxzZTsgLy8gYmV2ZWxzIG5vdCBzdXBwb3J0ZWQgZm9yIHBhdGggZXh0cnVzaW9uXG5cblx0XHRcdC8vIFNFVFVQIFROQiB2YXJpYWJsZXNcblxuXHRcdFx0Ly8gVE9ETzEgLSBoYXZlIGEgLmlzQ2xvc2VkIGluIHNwbGluZT9cblxuXHRcdFx0c3BsaW5lVHViZSA9IGV4dHJ1ZGVQYXRoLmNvbXB1dGVGcmVuZXRGcmFtZXMoIHN0ZXBzLCBmYWxzZSApO1xuXG5cdFx0XHQvLyBjb25zb2xlLmxvZyhzcGxpbmVUdWJlLCAnc3BsaW5lVHViZScsIHNwbGluZVR1YmUubm9ybWFscy5sZW5ndGgsICdzdGVwcycsIHN0ZXBzLCAnZXh0cnVkZVB0cycsIGV4dHJ1ZGVQdHMubGVuZ3RoKTtcblxuXHRcdFx0Ymlub3JtYWwgPSBuZXcgVmVjdG9yMygpO1xuXHRcdFx0bm9ybWFsID0gbmV3IFZlY3RvcjMoKTtcblx0XHRcdHBvc2l0aW9uMiA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR9XG5cblx0XHQvLyBTYWZlZ3VhcmRzIGlmIGJldmVscyBhcmUgbm90IGVuYWJsZWRcblxuXHRcdGlmICggISBiZXZlbEVuYWJsZWQgKSB7XG5cblx0XHRcdGJldmVsU2VnbWVudHMgPSAwO1xuXHRcdFx0YmV2ZWxUaGlja25lc3MgPSAwO1xuXHRcdFx0YmV2ZWxTaXplID0gMDtcblxuXHRcdH1cblxuXHRcdC8vIFZhcmlhYmxlcyBpbml0aWFsaXphdGlvblxuXG5cdFx0dmFyIGFob2xlLCBoLCBobDsgLy8gbG9vcGluZyBvZiBob2xlc1xuXG5cdFx0dmFyIHNoYXBlUG9pbnRzID0gc2hhcGUuZXh0cmFjdFBvaW50cyggY3VydmVTZWdtZW50cyApO1xuXG5cdFx0dmFyIHZlcnRpY2VzID0gc2hhcGVQb2ludHMuc2hhcGU7XG5cdFx0dmFyIGhvbGVzID0gc2hhcGVQb2ludHMuaG9sZXM7XG5cblx0XHR2YXIgcmV2ZXJzZSA9ICEgU2hhcGVVdGlscy5pc0Nsb2NrV2lzZSggdmVydGljZXMgKTtcblxuXHRcdGlmICggcmV2ZXJzZSApIHtcblxuXHRcdFx0dmVydGljZXMgPSB2ZXJ0aWNlcy5yZXZlcnNlKCk7XG5cblx0XHRcdC8vIE1heWJlIHdlIHNob3VsZCBhbHNvIGNoZWNrIGlmIGhvbGVzIGFyZSBpbiB0aGUgb3Bwb3NpdGUgZGlyZWN0aW9uLCBqdXN0IHRvIGJlIHNhZmUgLi4uXG5cblx0XHRcdGZvciAoIGggPSAwLCBobCA9IGhvbGVzLmxlbmd0aDsgaCA8IGhsOyBoICsrICkge1xuXG5cdFx0XHRcdGFob2xlID0gaG9sZXNbIGggXTtcblxuXHRcdFx0XHRpZiAoIFNoYXBlVXRpbHMuaXNDbG9ja1dpc2UoIGFob2xlICkgKSB7XG5cblx0XHRcdFx0XHRob2xlc1sgaCBdID0gYWhvbGUucmV2ZXJzZSgpO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cblx0XHR2YXIgZmFjZXMgPSBTaGFwZVV0aWxzLnRyaWFuZ3VsYXRlU2hhcGUoIHZlcnRpY2VzLCBob2xlcyApO1xuXG5cdFx0LyogVmVydGljZXMgKi9cblxuXHRcdHZhciBjb250b3VyID0gdmVydGljZXM7IC8vIHZlcnRpY2VzIGhhcyBhbGwgcG9pbnRzIGJ1dCBjb250b3VyIGhhcyBvbmx5IHBvaW50cyBvZiBjaXJjdW1mZXJlbmNlXG5cblx0XHRmb3IgKCBoID0gMCwgaGwgPSBob2xlcy5sZW5ndGg7IGggPCBobDsgaCArKyApIHtcblxuXHRcdFx0YWhvbGUgPSBob2xlc1sgaCBdO1xuXG5cdFx0XHR2ZXJ0aWNlcyA9IHZlcnRpY2VzLmNvbmNhdCggYWhvbGUgKTtcblxuXHRcdH1cblxuXG5cdFx0ZnVuY3Rpb24gc2NhbGVQdDIoIHB0LCB2ZWMsIHNpemUgKSB7XG5cblx0XHRcdGlmICggISB2ZWMgKSBjb25zb2xlLmVycm9yKCBcIlRIUkVFLkV4dHJ1ZGVHZW9tZXRyeTogdmVjIGRvZXMgbm90IGV4aXN0XCIgKTtcblxuXHRcdFx0cmV0dXJuIHZlYy5jbG9uZSgpLm11bHRpcGx5U2NhbGFyKCBzaXplICkuYWRkKCBwdCApO1xuXG5cdFx0fVxuXG5cdFx0dmFyIGIsIGJzLCB0LCB6LFxuXHRcdFx0dmVydCwgdmxlbiA9IHZlcnRpY2VzLmxlbmd0aCxcblx0XHRcdGZhY2UsIGZsZW4gPSBmYWNlcy5sZW5ndGg7XG5cblxuXHRcdC8vIEZpbmQgZGlyZWN0aW9ucyBmb3IgcG9pbnQgbW92ZW1lbnRcblxuXG5cdFx0ZnVuY3Rpb24gZ2V0QmV2ZWxWZWMoIGluUHQsIGluUHJldiwgaW5OZXh0ICkge1xuXG5cdFx0XHQvLyBjb21wdXRlcyBmb3IgaW5QdCB0aGUgY29ycmVzcG9uZGluZyBwb2ludCBpblB0JyBvbiBhIG5ldyBjb250b3VyXG5cdFx0XHQvLyAgIHNoaWZ0ZWQgYnkgMSB1bml0IChsZW5ndGggb2Ygbm9ybWFsaXplZCB2ZWN0b3IpIHRvIHRoZSBsZWZ0XG5cdFx0XHQvLyBpZiB3ZSB3YWxrIGFsb25nIGNvbnRvdXIgY2xvY2t3aXNlLCB0aGlzIG5ldyBjb250b3VyIGlzIG91dHNpZGUgdGhlIG9sZCBvbmVcblx0XHRcdC8vXG5cdFx0XHQvLyBpblB0JyBpcyB0aGUgaW50ZXJzZWN0aW9uIG9mIHRoZSB0d28gbGluZXMgcGFyYWxsZWwgdG8gdGhlIHR3b1xuXHRcdFx0Ly8gIGFkamFjZW50IGVkZ2VzIG9mIGluUHQgYXQgYSBkaXN0YW5jZSBvZiAxIHVuaXQgb24gdGhlIGxlZnQgc2lkZS5cblxuXHRcdFx0dmFyIHZfdHJhbnNfeCwgdl90cmFuc195LCBzaHJpbmtfYnk7IC8vIHJlc3VsdGluZyB0cmFuc2xhdGlvbiB2ZWN0b3IgZm9yIGluUHRcblxuXHRcdFx0Ly8gZ29vZCByZWFkaW5nIGZvciBnZW9tZXRyeSBhbGdvcml0aG1zIChoZXJlOiBsaW5lLWxpbmUgaW50ZXJzZWN0aW9uKVxuXHRcdFx0Ly8gaHR0cDovL2dlb21hbGdvcml0aG1zLmNvbS9hMDUtX2ludGVyc2VjdC0xLmh0bWxcblxuXHRcdFx0dmFyIHZfcHJldl94ID0gaW5QdC54IC0gaW5QcmV2LngsXG5cdFx0XHRcdHZfcHJldl95ID0gaW5QdC55IC0gaW5QcmV2Lnk7XG5cdFx0XHR2YXIgdl9uZXh0X3ggPSBpbk5leHQueCAtIGluUHQueCxcblx0XHRcdFx0dl9uZXh0X3kgPSBpbk5leHQueSAtIGluUHQueTtcblxuXHRcdFx0dmFyIHZfcHJldl9sZW5zcSA9ICggdl9wcmV2X3ggKiB2X3ByZXZfeCArIHZfcHJldl95ICogdl9wcmV2X3kgKTtcblxuXHRcdFx0Ly8gY2hlY2sgZm9yIGNvbGxpbmVhciBlZGdlc1xuXHRcdFx0dmFyIGNvbGxpbmVhcjAgPSAoIHZfcHJldl94ICogdl9uZXh0X3kgLSB2X3ByZXZfeSAqIHZfbmV4dF94ICk7XG5cblx0XHRcdGlmICggTWF0aC5hYnMoIGNvbGxpbmVhcjAgKSA+IE51bWJlci5FUFNJTE9OICkge1xuXG5cdFx0XHRcdC8vIG5vdCBjb2xsaW5lYXJcblxuXHRcdFx0XHQvLyBsZW5ndGggb2YgdmVjdG9ycyBmb3Igbm9ybWFsaXppbmdcblxuXHRcdFx0XHR2YXIgdl9wcmV2X2xlbiA9IE1hdGguc3FydCggdl9wcmV2X2xlbnNxICk7XG5cdFx0XHRcdHZhciB2X25leHRfbGVuID0gTWF0aC5zcXJ0KCB2X25leHRfeCAqIHZfbmV4dF94ICsgdl9uZXh0X3kgKiB2X25leHRfeSApO1xuXG5cdFx0XHRcdC8vIHNoaWZ0IGFkamFjZW50IHBvaW50cyBieSB1bml0IHZlY3RvcnMgdG8gdGhlIGxlZnRcblxuXHRcdFx0XHR2YXIgcHRQcmV2U2hpZnRfeCA9ICggaW5QcmV2LnggLSB2X3ByZXZfeSAvIHZfcHJldl9sZW4gKTtcblx0XHRcdFx0dmFyIHB0UHJldlNoaWZ0X3kgPSAoIGluUHJldi55ICsgdl9wcmV2X3ggLyB2X3ByZXZfbGVuICk7XG5cblx0XHRcdFx0dmFyIHB0TmV4dFNoaWZ0X3ggPSAoIGluTmV4dC54IC0gdl9uZXh0X3kgLyB2X25leHRfbGVuICk7XG5cdFx0XHRcdHZhciBwdE5leHRTaGlmdF95ID0gKCBpbk5leHQueSArIHZfbmV4dF94IC8gdl9uZXh0X2xlbiApO1xuXG5cdFx0XHRcdC8vIHNjYWxpbmcgZmFjdG9yIGZvciB2X3ByZXYgdG8gaW50ZXJzZWN0aW9uIHBvaW50XG5cblx0XHRcdFx0dmFyIHNmID0gKCAoIHB0TmV4dFNoaWZ0X3ggLSBwdFByZXZTaGlmdF94ICkgKiB2X25leHRfeSAtXG5cdFx0XHRcdFx0XHQoIHB0TmV4dFNoaWZ0X3kgLSBwdFByZXZTaGlmdF95ICkgKiB2X25leHRfeCApIC9cblx0XHRcdFx0XHQoIHZfcHJldl94ICogdl9uZXh0X3kgLSB2X3ByZXZfeSAqIHZfbmV4dF94ICk7XG5cblx0XHRcdFx0Ly8gdmVjdG9yIGZyb20gaW5QdCB0byBpbnRlcnNlY3Rpb24gcG9pbnRcblxuXHRcdFx0XHR2X3RyYW5zX3ggPSAoIHB0UHJldlNoaWZ0X3ggKyB2X3ByZXZfeCAqIHNmIC0gaW5QdC54ICk7XG5cdFx0XHRcdHZfdHJhbnNfeSA9ICggcHRQcmV2U2hpZnRfeSArIHZfcHJldl95ICogc2YgLSBpblB0LnkgKTtcblxuXHRcdFx0XHQvLyBEb24ndCBub3JtYWxpemUhLCBvdGhlcndpc2Ugc2hhcnAgY29ybmVycyBiZWNvbWUgdWdseVxuXHRcdFx0XHQvLyAgYnV0IHByZXZlbnQgY3Jhenkgc3Bpa2VzXG5cdFx0XHRcdHZhciB2X3RyYW5zX2xlbnNxID0gKCB2X3RyYW5zX3ggKiB2X3RyYW5zX3ggKyB2X3RyYW5zX3kgKiB2X3RyYW5zX3kgKTtcblx0XHRcdFx0aWYgKCB2X3RyYW5zX2xlbnNxIDw9IDIgKSB7XG5cblx0XHRcdFx0XHRyZXR1cm4gbmV3IFZlY3RvcjIoIHZfdHJhbnNfeCwgdl90cmFuc195ICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHNocmlua19ieSA9IE1hdGguc3FydCggdl90cmFuc19sZW5zcSAvIDIgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Ly8gaGFuZGxlIHNwZWNpYWwgY2FzZSBvZiBjb2xsaW5lYXIgZWRnZXNcblxuXHRcdFx0XHR2YXIgZGlyZWN0aW9uX2VxID0gZmFsc2U7IC8vIGFzc3VtZXM6IG9wcG9zaXRlXG5cdFx0XHRcdGlmICggdl9wcmV2X3ggPiBOdW1iZXIuRVBTSUxPTiApIHtcblxuXHRcdFx0XHRcdGlmICggdl9uZXh0X3ggPiBOdW1iZXIuRVBTSUxPTiApIHtcblxuXHRcdFx0XHRcdFx0ZGlyZWN0aW9uX2VxID0gdHJ1ZTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0aWYgKCB2X3ByZXZfeCA8IC0gTnVtYmVyLkVQU0lMT04gKSB7XG5cblx0XHRcdFx0XHRcdGlmICggdl9uZXh0X3ggPCAtIE51bWJlci5FUFNJTE9OICkge1xuXG5cdFx0XHRcdFx0XHRcdGRpcmVjdGlvbl9lcSA9IHRydWU7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdGlmICggTWF0aC5zaWduKCB2X3ByZXZfeSApID09PSBNYXRoLnNpZ24oIHZfbmV4dF95ICkgKSB7XG5cblx0XHRcdFx0XHRcdFx0ZGlyZWN0aW9uX2VxID0gdHJ1ZTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIGRpcmVjdGlvbl9lcSApIHtcblxuXHRcdFx0XHRcdC8vIGNvbnNvbGUubG9nKFwiV2FybmluZzogbGluZXMgYXJlIGEgc3RyYWlnaHQgc2VxdWVuY2VcIik7XG5cdFx0XHRcdFx0dl90cmFuc194ID0gLSB2X3ByZXZfeTtcblx0XHRcdFx0XHR2X3RyYW5zX3kgPSB2X3ByZXZfeDtcblx0XHRcdFx0XHRzaHJpbmtfYnkgPSBNYXRoLnNxcnQoIHZfcHJldl9sZW5zcSApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHQvLyBjb25zb2xlLmxvZyhcIldhcm5pbmc6IGxpbmVzIGFyZSBhIHN0cmFpZ2h0IHNwaWtlXCIpO1xuXHRcdFx0XHRcdHZfdHJhbnNfeCA9IHZfcHJldl94O1xuXHRcdFx0XHRcdHZfdHJhbnNfeSA9IHZfcHJldl95O1xuXHRcdFx0XHRcdHNocmlua19ieSA9IE1hdGguc3FydCggdl9wcmV2X2xlbnNxIC8gMiApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gbmV3IFZlY3RvcjIoIHZfdHJhbnNfeCAvIHNocmlua19ieSwgdl90cmFuc195IC8gc2hyaW5rX2J5ICk7XG5cblx0XHR9XG5cblxuXHRcdHZhciBjb250b3VyTW92ZW1lbnRzID0gW107XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gY29udG91ci5sZW5ndGgsIGogPSBpbCAtIDEsIGsgPSBpICsgMTsgaSA8IGlsOyBpICsrLCBqICsrLCBrICsrICkge1xuXG5cdFx0XHRpZiAoIGogPT09IGlsICkgaiA9IDA7XG5cdFx0XHRpZiAoIGsgPT09IGlsICkgayA9IDA7XG5cblx0XHRcdC8vICAoaiktLS0oaSktLS0oaylcblx0XHRcdC8vIGNvbnNvbGUubG9nKCdpLGosaycsIGksIGogLCBrKVxuXG5cdFx0XHRjb250b3VyTW92ZW1lbnRzWyBpIF0gPSBnZXRCZXZlbFZlYyggY29udG91clsgaSBdLCBjb250b3VyWyBqIF0sIGNvbnRvdXJbIGsgXSApO1xuXG5cdFx0fVxuXG5cdFx0dmFyIGhvbGVzTW92ZW1lbnRzID0gW10sXG5cdFx0XHRvbmVIb2xlTW92ZW1lbnRzLCB2ZXJ0aWNlc01vdmVtZW50cyA9IGNvbnRvdXJNb3ZlbWVudHMuY29uY2F0KCk7XG5cblx0XHRmb3IgKCBoID0gMCwgaGwgPSBob2xlcy5sZW5ndGg7IGggPCBobDsgaCArKyApIHtcblxuXHRcdFx0YWhvbGUgPSBob2xlc1sgaCBdO1xuXG5cdFx0XHRvbmVIb2xlTW92ZW1lbnRzID0gW107XG5cblx0XHRcdGZvciAoIGkgPSAwLCBpbCA9IGFob2xlLmxlbmd0aCwgaiA9IGlsIC0gMSwgayA9IGkgKyAxOyBpIDwgaWw7IGkgKyssIGogKyssIGsgKysgKSB7XG5cblx0XHRcdFx0aWYgKCBqID09PSBpbCApIGogPSAwO1xuXHRcdFx0XHRpZiAoIGsgPT09IGlsICkgayA9IDA7XG5cblx0XHRcdFx0Ly8gIChqKS0tLShpKS0tLShrKVxuXHRcdFx0XHRvbmVIb2xlTW92ZW1lbnRzWyBpIF0gPSBnZXRCZXZlbFZlYyggYWhvbGVbIGkgXSwgYWhvbGVbIGogXSwgYWhvbGVbIGsgXSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGhvbGVzTW92ZW1lbnRzLnB1c2goIG9uZUhvbGVNb3ZlbWVudHMgKTtcblx0XHRcdHZlcnRpY2VzTW92ZW1lbnRzID0gdmVydGljZXNNb3ZlbWVudHMuY29uY2F0KCBvbmVIb2xlTW92ZW1lbnRzICk7XG5cblx0XHR9XG5cblxuXHRcdC8vIExvb3AgYmV2ZWxTZWdtZW50cywgMSBmb3IgdGhlIGZyb250LCAxIGZvciB0aGUgYmFja1xuXG5cdFx0Zm9yICggYiA9IDA7IGIgPCBiZXZlbFNlZ21lbnRzOyBiICsrICkge1xuXG5cdFx0XHQvL2ZvciAoIGIgPSBiZXZlbFNlZ21lbnRzOyBiID4gMDsgYiAtLSApIHtcblxuXHRcdFx0dCA9IGIgLyBiZXZlbFNlZ21lbnRzO1xuXHRcdFx0eiA9IGJldmVsVGhpY2tuZXNzICogTWF0aC5jb3MoIHQgKiBNYXRoLlBJIC8gMiApO1xuXHRcdFx0YnMgPSBiZXZlbFNpemUgKiBNYXRoLnNpbiggdCAqIE1hdGguUEkgLyAyICk7XG5cblx0XHRcdC8vIGNvbnRyYWN0IHNoYXBlXG5cblx0XHRcdGZvciAoIGkgPSAwLCBpbCA9IGNvbnRvdXIubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdFx0dmVydCA9IHNjYWxlUHQyKCBjb250b3VyWyBpIF0sIGNvbnRvdXJNb3ZlbWVudHNbIGkgXSwgYnMgKTtcblxuXHRcdFx0XHR2KCB2ZXJ0LngsIHZlcnQueSwgLSB6ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gZXhwYW5kIGhvbGVzXG5cblx0XHRcdGZvciAoIGggPSAwLCBobCA9IGhvbGVzLmxlbmd0aDsgaCA8IGhsOyBoICsrICkge1xuXG5cdFx0XHRcdGFob2xlID0gaG9sZXNbIGggXTtcblx0XHRcdFx0b25lSG9sZU1vdmVtZW50cyA9IGhvbGVzTW92ZW1lbnRzWyBoIF07XG5cblx0XHRcdFx0Zm9yICggaSA9IDAsIGlsID0gYWhvbGUubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHR2ZXJ0ID0gc2NhbGVQdDIoIGFob2xlWyBpIF0sIG9uZUhvbGVNb3ZlbWVudHNbIGkgXSwgYnMgKTtcblxuXHRcdFx0XHRcdHYoIHZlcnQueCwgdmVydC55LCAtIHogKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGJzID0gYmV2ZWxTaXplO1xuXG5cdFx0Ly8gQmFjayBmYWNpbmcgdmVydGljZXNcblxuXHRcdGZvciAoIGkgPSAwOyBpIDwgdmxlbjsgaSArKyApIHtcblxuXHRcdFx0dmVydCA9IGJldmVsRW5hYmxlZCA/IHNjYWxlUHQyKCB2ZXJ0aWNlc1sgaSBdLCB2ZXJ0aWNlc01vdmVtZW50c1sgaSBdLCBicyApIDogdmVydGljZXNbIGkgXTtcblxuXHRcdFx0aWYgKCAhIGV4dHJ1ZGVCeVBhdGggKSB7XG5cblx0XHRcdFx0diggdmVydC54LCB2ZXJ0LnksIDAgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyB2KCB2ZXJ0LngsIHZlcnQueSArIGV4dHJ1ZGVQdHNbIDAgXS55LCBleHRydWRlUHRzWyAwIF0ueCApO1xuXG5cdFx0XHRcdG5vcm1hbC5jb3B5KCBzcGxpbmVUdWJlLm5vcm1hbHNbIDAgXSApLm11bHRpcGx5U2NhbGFyKCB2ZXJ0LnggKTtcblx0XHRcdFx0Ymlub3JtYWwuY29weSggc3BsaW5lVHViZS5iaW5vcm1hbHNbIDAgXSApLm11bHRpcGx5U2NhbGFyKCB2ZXJ0LnkgKTtcblxuXHRcdFx0XHRwb3NpdGlvbjIuY29weSggZXh0cnVkZVB0c1sgMCBdICkuYWRkKCBub3JtYWwgKS5hZGQoIGJpbm9ybWFsICk7XG5cblx0XHRcdFx0diggcG9zaXRpb24yLngsIHBvc2l0aW9uMi55LCBwb3NpdGlvbjIueiApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvLyBBZGQgc3RlcHBlZCB2ZXJ0aWNlcy4uLlxuXHRcdC8vIEluY2x1ZGluZyBmcm9udCBmYWNpbmcgdmVydGljZXNcblxuXHRcdHZhciBzO1xuXG5cdFx0Zm9yICggcyA9IDE7IHMgPD0gc3RlcHM7IHMgKysgKSB7XG5cblx0XHRcdGZvciAoIGkgPSAwOyBpIDwgdmxlbjsgaSArKyApIHtcblxuXHRcdFx0XHR2ZXJ0ID0gYmV2ZWxFbmFibGVkID8gc2NhbGVQdDIoIHZlcnRpY2VzWyBpIF0sIHZlcnRpY2VzTW92ZW1lbnRzWyBpIF0sIGJzICkgOiB2ZXJ0aWNlc1sgaSBdO1xuXG5cdFx0XHRcdGlmICggISBleHRydWRlQnlQYXRoICkge1xuXG5cdFx0XHRcdFx0diggdmVydC54LCB2ZXJ0LnksIGFtb3VudCAvIHN0ZXBzICogcyApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHQvLyB2KCB2ZXJ0LngsIHZlcnQueSArIGV4dHJ1ZGVQdHNbIHMgLSAxIF0ueSwgZXh0cnVkZVB0c1sgcyAtIDEgXS54ICk7XG5cblx0XHRcdFx0XHRub3JtYWwuY29weSggc3BsaW5lVHViZS5ub3JtYWxzWyBzIF0gKS5tdWx0aXBseVNjYWxhciggdmVydC54ICk7XG5cdFx0XHRcdFx0Ymlub3JtYWwuY29weSggc3BsaW5lVHViZS5iaW5vcm1hbHNbIHMgXSApLm11bHRpcGx5U2NhbGFyKCB2ZXJ0LnkgKTtcblxuXHRcdFx0XHRcdHBvc2l0aW9uMi5jb3B5KCBleHRydWRlUHRzWyBzIF0gKS5hZGQoIG5vcm1hbCApLmFkZCggYmlub3JtYWwgKTtcblxuXHRcdFx0XHRcdHYoIHBvc2l0aW9uMi54LCBwb3NpdGlvbjIueSwgcG9zaXRpb24yLnogKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXG5cdFx0Ly8gQWRkIGJldmVsIHNlZ21lbnRzIHBsYW5lc1xuXG5cdFx0Ly9mb3IgKCBiID0gMTsgYiA8PSBiZXZlbFNlZ21lbnRzOyBiICsrICkge1xuXHRcdGZvciAoIGIgPSBiZXZlbFNlZ21lbnRzIC0gMTsgYiA+PSAwOyBiIC0tICkge1xuXG5cdFx0XHR0ID0gYiAvIGJldmVsU2VnbWVudHM7XG5cdFx0XHR6ID0gYmV2ZWxUaGlja25lc3MgKiBNYXRoLmNvcyggdCAqIE1hdGguUEkgLyAyICk7XG5cdFx0XHRicyA9IGJldmVsU2l6ZSAqIE1hdGguc2luKCB0ICogTWF0aC5QSSAvIDIgKTtcblxuXHRcdFx0Ly8gY29udHJhY3Qgc2hhcGVcblxuXHRcdFx0Zm9yICggaSA9IDAsIGlsID0gY29udG91ci5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHR2ZXJ0ID0gc2NhbGVQdDIoIGNvbnRvdXJbIGkgXSwgY29udG91ck1vdmVtZW50c1sgaSBdLCBicyApO1xuXHRcdFx0XHR2KCB2ZXJ0LngsIHZlcnQueSwgYW1vdW50ICsgeiApO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIGV4cGFuZCBob2xlc1xuXG5cdFx0XHRmb3IgKCBoID0gMCwgaGwgPSBob2xlcy5sZW5ndGg7IGggPCBobDsgaCArKyApIHtcblxuXHRcdFx0XHRhaG9sZSA9IGhvbGVzWyBoIF07XG5cdFx0XHRcdG9uZUhvbGVNb3ZlbWVudHMgPSBob2xlc01vdmVtZW50c1sgaCBdO1xuXG5cdFx0XHRcdGZvciAoIGkgPSAwLCBpbCA9IGFob2xlLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0dmVydCA9IHNjYWxlUHQyKCBhaG9sZVsgaSBdLCBvbmVIb2xlTW92ZW1lbnRzWyBpIF0sIGJzICk7XG5cblx0XHRcdFx0XHRpZiAoICEgZXh0cnVkZUJ5UGF0aCApIHtcblxuXHRcdFx0XHRcdFx0diggdmVydC54LCB2ZXJ0LnksIGFtb3VudCArIHogKTtcblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdHYoIHZlcnQueCwgdmVydC55ICsgZXh0cnVkZVB0c1sgc3RlcHMgLSAxIF0ueSwgZXh0cnVkZVB0c1sgc3RlcHMgLSAxIF0ueCArIHogKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8qIEZhY2VzICovXG5cblx0XHQvLyBUb3AgYW5kIGJvdHRvbSBmYWNlc1xuXG5cdFx0YnVpbGRMaWRGYWNlcygpO1xuXG5cdFx0Ly8gU2lkZXMgZmFjZXNcblxuXHRcdGJ1aWxkU2lkZUZhY2VzKCk7XG5cblxuXHRcdC8vLy8vICBJbnRlcm5hbCBmdW5jdGlvbnNcblxuXHRcdGZ1bmN0aW9uIGJ1aWxkTGlkRmFjZXMoKSB7XG5cblx0XHRcdHZhciBzdGFydCA9IHZlcnRpY2VzQXJyYXkubGVuZ3RoIC8gMztcblxuXHRcdFx0aWYgKCBiZXZlbEVuYWJsZWQgKSB7XG5cblx0XHRcdFx0dmFyIGxheWVyID0gMDsgLy8gc3RlcHMgKyAxXG5cdFx0XHRcdHZhciBvZmZzZXQgPSB2bGVuICogbGF5ZXI7XG5cblx0XHRcdFx0Ly8gQm90dG9tIGZhY2VzXG5cblx0XHRcdFx0Zm9yICggaSA9IDA7IGkgPCBmbGVuOyBpICsrICkge1xuXG5cdFx0XHRcdFx0ZmFjZSA9IGZhY2VzWyBpIF07XG5cdFx0XHRcdFx0ZjMoIGZhY2VbIDIgXSArIG9mZnNldCwgZmFjZVsgMSBdICsgb2Zmc2V0LCBmYWNlWyAwIF0gKyBvZmZzZXQgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0bGF5ZXIgPSBzdGVwcyArIGJldmVsU2VnbWVudHMgKiAyO1xuXHRcdFx0XHRvZmZzZXQgPSB2bGVuICogbGF5ZXI7XG5cblx0XHRcdFx0Ly8gVG9wIGZhY2VzXG5cblx0XHRcdFx0Zm9yICggaSA9IDA7IGkgPCBmbGVuOyBpICsrICkge1xuXG5cdFx0XHRcdFx0ZmFjZSA9IGZhY2VzWyBpIF07XG5cdFx0XHRcdFx0ZjMoIGZhY2VbIDAgXSArIG9mZnNldCwgZmFjZVsgMSBdICsgb2Zmc2V0LCBmYWNlWyAyIF0gKyBvZmZzZXQgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Ly8gQm90dG9tIGZhY2VzXG5cblx0XHRcdFx0Zm9yICggaSA9IDA7IGkgPCBmbGVuOyBpICsrICkge1xuXG5cdFx0XHRcdFx0ZmFjZSA9IGZhY2VzWyBpIF07XG5cdFx0XHRcdFx0ZjMoIGZhY2VbIDIgXSwgZmFjZVsgMSBdLCBmYWNlWyAwIF0gKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gVG9wIGZhY2VzXG5cblx0XHRcdFx0Zm9yICggaSA9IDA7IGkgPCBmbGVuOyBpICsrICkge1xuXG5cdFx0XHRcdFx0ZmFjZSA9IGZhY2VzWyBpIF07XG5cdFx0XHRcdFx0ZjMoIGZhY2VbIDAgXSArIHZsZW4gKiBzdGVwcywgZmFjZVsgMSBdICsgdmxlbiAqIHN0ZXBzLCBmYWNlWyAyIF0gKyB2bGVuICogc3RlcHMgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0c2NvcGUuYWRkR3JvdXAoIHN0YXJ0LCB2ZXJ0aWNlc0FycmF5Lmxlbmd0aCAvIDMgLSBzdGFydCwgMCApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gQ3JlYXRlIGZhY2VzIGZvciB0aGUgei1zaWRlcyBvZiB0aGUgc2hhcGVcblxuXHRcdGZ1bmN0aW9uIGJ1aWxkU2lkZUZhY2VzKCkge1xuXG5cdFx0XHR2YXIgc3RhcnQgPSB2ZXJ0aWNlc0FycmF5Lmxlbmd0aCAvIDM7XG5cdFx0XHR2YXIgbGF5ZXJvZmZzZXQgPSAwO1xuXHRcdFx0c2lkZXdhbGxzKCBjb250b3VyLCBsYXllcm9mZnNldCApO1xuXHRcdFx0bGF5ZXJvZmZzZXQgKz0gY29udG91ci5sZW5ndGg7XG5cblx0XHRcdGZvciAoIGggPSAwLCBobCA9IGhvbGVzLmxlbmd0aDsgaCA8IGhsOyBoICsrICkge1xuXG5cdFx0XHRcdGFob2xlID0gaG9sZXNbIGggXTtcblx0XHRcdFx0c2lkZXdhbGxzKCBhaG9sZSwgbGF5ZXJvZmZzZXQgKTtcblxuXHRcdFx0XHQvLywgdHJ1ZVxuXHRcdFx0XHRsYXllcm9mZnNldCArPSBhaG9sZS5sZW5ndGg7XG5cblx0XHRcdH1cblxuXG5cdFx0XHRzY29wZS5hZGRHcm91cCggc3RhcnQsIHZlcnRpY2VzQXJyYXkubGVuZ3RoIC8gMyAtIHN0YXJ0LCAxICk7XG5cblxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIHNpZGV3YWxscyggY29udG91ciwgbGF5ZXJvZmZzZXQgKSB7XG5cblx0XHRcdHZhciBqLCBrO1xuXHRcdFx0aSA9IGNvbnRvdXIubGVuZ3RoO1xuXG5cdFx0XHR3aGlsZSAoIC0tIGkgPj0gMCApIHtcblxuXHRcdFx0XHRqID0gaTtcblx0XHRcdFx0ayA9IGkgLSAxO1xuXHRcdFx0XHRpZiAoIGsgPCAwICkgayA9IGNvbnRvdXIubGVuZ3RoIC0gMTtcblxuXHRcdFx0XHQvL2NvbnNvbGUubG9nKCdiJywgaSxqLCBpLTEsIGssdmVydGljZXMubGVuZ3RoKTtcblxuXHRcdFx0XHR2YXIgcyA9IDAsXG5cdFx0XHRcdFx0c2wgPSBzdGVwcyArIGJldmVsU2VnbWVudHMgKiAyO1xuXG5cdFx0XHRcdGZvciAoIHMgPSAwOyBzIDwgc2w7IHMgKysgKSB7XG5cblx0XHRcdFx0XHR2YXIgc2xlbjEgPSB2bGVuICogcztcblx0XHRcdFx0XHR2YXIgc2xlbjIgPSB2bGVuICogKCBzICsgMSApO1xuXG5cdFx0XHRcdFx0dmFyIGEgPSBsYXllcm9mZnNldCArIGogKyBzbGVuMSxcblx0XHRcdFx0XHRcdGIgPSBsYXllcm9mZnNldCArIGsgKyBzbGVuMSxcblx0XHRcdFx0XHRcdGMgPSBsYXllcm9mZnNldCArIGsgKyBzbGVuMixcblx0XHRcdFx0XHRcdGQgPSBsYXllcm9mZnNldCArIGogKyBzbGVuMjtcblxuXHRcdFx0XHRcdGY0KCBhLCBiLCBjLCBkICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRmdW5jdGlvbiB2KCB4LCB5LCB6ICkge1xuXG5cdFx0XHRwbGFjZWhvbGRlci5wdXNoKCB4ICk7XG5cdFx0XHRwbGFjZWhvbGRlci5wdXNoKCB5ICk7XG5cdFx0XHRwbGFjZWhvbGRlci5wdXNoKCB6ICk7XG5cblx0XHR9XG5cblxuXHRcdGZ1bmN0aW9uIGYzKCBhLCBiLCBjICkge1xuXG5cdFx0XHRhZGRWZXJ0ZXgoIGEgKTtcblx0XHRcdGFkZFZlcnRleCggYiApO1xuXHRcdFx0YWRkVmVydGV4KCBjICk7XG5cblx0XHRcdHZhciBuZXh0SW5kZXggPSB2ZXJ0aWNlc0FycmF5Lmxlbmd0aCAvIDM7XG5cdFx0XHR2YXIgdXZzID0gdXZnZW4uZ2VuZXJhdGVUb3BVViggc2NvcGUsIHZlcnRpY2VzQXJyYXksIG5leHRJbmRleCAtIDMsIG5leHRJbmRleCAtIDIsIG5leHRJbmRleCAtIDEgKTtcblxuXHRcdFx0YWRkVVYoIHV2c1sgMCBdICk7XG5cdFx0XHRhZGRVViggdXZzWyAxIF0gKTtcblx0XHRcdGFkZFVWKCB1dnNbIDIgXSApO1xuXG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gZjQoIGEsIGIsIGMsIGQgKSB7XG5cblx0XHRcdGFkZFZlcnRleCggYSApO1xuXHRcdFx0YWRkVmVydGV4KCBiICk7XG5cdFx0XHRhZGRWZXJ0ZXgoIGQgKTtcblxuXHRcdFx0YWRkVmVydGV4KCBiICk7XG5cdFx0XHRhZGRWZXJ0ZXgoIGMgKTtcblx0XHRcdGFkZFZlcnRleCggZCApO1xuXG5cblx0XHRcdHZhciBuZXh0SW5kZXggPSB2ZXJ0aWNlc0FycmF5Lmxlbmd0aCAvIDM7XG5cdFx0XHR2YXIgdXZzID0gdXZnZW4uZ2VuZXJhdGVTaWRlV2FsbFVWKCBzY29wZSwgdmVydGljZXNBcnJheSwgbmV4dEluZGV4IC0gNiwgbmV4dEluZGV4IC0gMywgbmV4dEluZGV4IC0gMiwgbmV4dEluZGV4IC0gMSApO1xuXG5cdFx0XHRhZGRVViggdXZzWyAwIF0gKTtcblx0XHRcdGFkZFVWKCB1dnNbIDEgXSApO1xuXHRcdFx0YWRkVVYoIHV2c1sgMyBdICk7XG5cblx0XHRcdGFkZFVWKCB1dnNbIDEgXSApO1xuXHRcdFx0YWRkVVYoIHV2c1sgMiBdICk7XG5cdFx0XHRhZGRVViggdXZzWyAzIF0gKTtcblxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIGFkZFZlcnRleCggaW5kZXggKSB7XG5cblx0XHRcdHZlcnRpY2VzQXJyYXkucHVzaCggcGxhY2Vob2xkZXJbIGluZGV4ICogMyArIDAgXSApO1xuXHRcdFx0dmVydGljZXNBcnJheS5wdXNoKCBwbGFjZWhvbGRlclsgaW5kZXggKiAzICsgMSBdICk7XG5cdFx0XHR2ZXJ0aWNlc0FycmF5LnB1c2goIHBsYWNlaG9sZGVyWyBpbmRleCAqIDMgKyAyIF0gKTtcblxuXHRcdH1cblxuXG5cdFx0ZnVuY3Rpb24gYWRkVVYoIHZlY3RvcjIgKSB7XG5cblx0XHRcdHV2QXJyYXkucHVzaCggdmVjdG9yMi54ICk7XG5cdFx0XHR1dkFycmF5LnB1c2goIHZlY3RvcjIueSApO1xuXG5cdFx0fVxuXG5cdH1cblxufVxuXG5FeHRydWRlQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7XG5FeHRydWRlQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gRXh0cnVkZUJ1ZmZlckdlb21ldHJ5O1xuXG52YXIgV29ybGRVVkdlbmVyYXRvciA9IHtcblxuXHRnZW5lcmF0ZVRvcFVWOiBmdW5jdGlvbiAoIGdlb21ldHJ5LCB2ZXJ0aWNlcywgaW5kZXhBLCBpbmRleEIsIGluZGV4QyApIHtcblxuXHRcdHZhciBhX3ggPSB2ZXJ0aWNlc1sgaW5kZXhBICogMyBdO1xuXHRcdHZhciBhX3kgPSB2ZXJ0aWNlc1sgaW5kZXhBICogMyArIDEgXTtcblx0XHR2YXIgYl94ID0gdmVydGljZXNbIGluZGV4QiAqIDMgXTtcblx0XHR2YXIgYl95ID0gdmVydGljZXNbIGluZGV4QiAqIDMgKyAxIF07XG5cdFx0dmFyIGNfeCA9IHZlcnRpY2VzWyBpbmRleEMgKiAzIF07XG5cdFx0dmFyIGNfeSA9IHZlcnRpY2VzWyBpbmRleEMgKiAzICsgMSBdO1xuXG5cdFx0cmV0dXJuIFtcblx0XHRcdG5ldyBWZWN0b3IyKCBhX3gsIGFfeSApLFxuXHRcdFx0bmV3IFZlY3RvcjIoIGJfeCwgYl95ICksXG5cdFx0XHRuZXcgVmVjdG9yMiggY194LCBjX3kgKVxuXHRcdF07XG5cblx0fSxcblxuXHRnZW5lcmF0ZVNpZGVXYWxsVVY6IGZ1bmN0aW9uICggZ2VvbWV0cnksIHZlcnRpY2VzLCBpbmRleEEsIGluZGV4QiwgaW5kZXhDLCBpbmRleEQgKSB7XG5cblx0XHR2YXIgYV94ID0gdmVydGljZXNbIGluZGV4QSAqIDMgXTtcblx0XHR2YXIgYV95ID0gdmVydGljZXNbIGluZGV4QSAqIDMgKyAxIF07XG5cdFx0dmFyIGFfeiA9IHZlcnRpY2VzWyBpbmRleEEgKiAzICsgMiBdO1xuXHRcdHZhciBiX3ggPSB2ZXJ0aWNlc1sgaW5kZXhCICogMyBdO1xuXHRcdHZhciBiX3kgPSB2ZXJ0aWNlc1sgaW5kZXhCICogMyArIDEgXTtcblx0XHR2YXIgYl96ID0gdmVydGljZXNbIGluZGV4QiAqIDMgKyAyIF07XG5cdFx0dmFyIGNfeCA9IHZlcnRpY2VzWyBpbmRleEMgKiAzIF07XG5cdFx0dmFyIGNfeSA9IHZlcnRpY2VzWyBpbmRleEMgKiAzICsgMSBdO1xuXHRcdHZhciBjX3ogPSB2ZXJ0aWNlc1sgaW5kZXhDICogMyArIDIgXTtcblx0XHR2YXIgZF94ID0gdmVydGljZXNbIGluZGV4RCAqIDMgXTtcblx0XHR2YXIgZF95ID0gdmVydGljZXNbIGluZGV4RCAqIDMgKyAxIF07XG5cdFx0dmFyIGRfeiA9IHZlcnRpY2VzWyBpbmRleEQgKiAzICsgMiBdO1xuXG5cdFx0aWYgKCBNYXRoLmFicyggYV95IC0gYl95ICkgPCAwLjAxICkge1xuXG5cdFx0XHRyZXR1cm4gW1xuXHRcdFx0XHRuZXcgVmVjdG9yMiggYV94LCAxIC0gYV96ICksXG5cdFx0XHRcdG5ldyBWZWN0b3IyKCBiX3gsIDEgLSBiX3ogKSxcblx0XHRcdFx0bmV3IFZlY3RvcjIoIGNfeCwgMSAtIGNfeiApLFxuXHRcdFx0XHRuZXcgVmVjdG9yMiggZF94LCAxIC0gZF96IClcblx0XHRcdF07XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRyZXR1cm4gW1xuXHRcdFx0XHRuZXcgVmVjdG9yMiggYV95LCAxIC0gYV96ICksXG5cdFx0XHRcdG5ldyBWZWN0b3IyKCBiX3ksIDEgLSBiX3ogKSxcblx0XHRcdFx0bmV3IFZlY3RvcjIoIGNfeSwgMSAtIGNfeiApLFxuXHRcdFx0XHRuZXcgVmVjdG9yMiggZF95LCAxIC0gZF96IClcblx0XHRcdF07XG5cblx0XHR9XG5cblx0fVxufTtcblxuLyoqXG4gKiBAYXV0aG9yIHp6ODUgLyBodHRwOi8vd3d3LmxhYjRnYW1lcy5uZXQveno4NS9ibG9nXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICpcbiAqIFRleHQgPSAzRCBUZXh0XG4gKlxuICogcGFyYW1ldGVycyA9IHtcbiAqICBmb250OiA8VEhSRUUuRm9udD4sIC8vIGZvbnRcbiAqXG4gKiAgc2l6ZTogPGZsb2F0PiwgLy8gc2l6ZSBvZiB0aGUgdGV4dFxuICogIGhlaWdodDogPGZsb2F0PiwgLy8gdGhpY2tuZXNzIHRvIGV4dHJ1ZGUgdGV4dFxuICogIGN1cnZlU2VnbWVudHM6IDxpbnQ+LCAvLyBudW1iZXIgb2YgcG9pbnRzIG9uIHRoZSBjdXJ2ZXNcbiAqXG4gKiAgYmV2ZWxFbmFibGVkOiA8Ym9vbD4sIC8vIHR1cm4gb24gYmV2ZWxcbiAqICBiZXZlbFRoaWNrbmVzczogPGZsb2F0PiwgLy8gaG93IGRlZXAgaW50byB0ZXh0IGJldmVsIGdvZXNcbiAqICBiZXZlbFNpemU6IDxmbG9hdD4gLy8gaG93IGZhciBmcm9tIHRleHQgb3V0bGluZSBpcyBiZXZlbFxuICogfVxuICovXG5cbi8vIFRleHRHZW9tZXRyeVxuXG5mdW5jdGlvbiBUZXh0R2VvbWV0cnkoIHRleHQsIHBhcmFtZXRlcnMgKSB7XG5cblx0R2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdUZXh0R2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHR0ZXh0OiB0ZXh0LFxuXHRcdHBhcmFtZXRlcnM6IHBhcmFtZXRlcnNcblx0fTtcblxuXHR0aGlzLmZyb21CdWZmZXJHZW9tZXRyeSggbmV3IFRleHRCdWZmZXJHZW9tZXRyeSggdGV4dCwgcGFyYW1ldGVycyApICk7XG5cdHRoaXMubWVyZ2VWZXJ0aWNlcygpO1xuXG59XG5cblRleHRHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBHZW9tZXRyeS5wcm90b3R5cGUgKTtcblRleHRHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBUZXh0R2VvbWV0cnk7XG5cbi8vIFRleHRCdWZmZXJHZW9tZXRyeVxuXG5mdW5jdGlvbiBUZXh0QnVmZmVyR2VvbWV0cnkoIHRleHQsIHBhcmFtZXRlcnMgKSB7XG5cblx0cGFyYW1ldGVycyA9IHBhcmFtZXRlcnMgfHwge307XG5cblx0dmFyIGZvbnQgPSBwYXJhbWV0ZXJzLmZvbnQ7XG5cblx0aWYgKCAhICggZm9udCAmJiBmb250LmlzRm9udCApICkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlRleHRHZW9tZXRyeTogZm9udCBwYXJhbWV0ZXIgaXMgbm90IGFuIGluc3RhbmNlIG9mIFRIUkVFLkZvbnQuJyApO1xuXHRcdHJldHVybiBuZXcgR2VvbWV0cnkoKTtcblxuXHR9XG5cblx0dmFyIHNoYXBlcyA9IGZvbnQuZ2VuZXJhdGVTaGFwZXMoIHRleHQsIHBhcmFtZXRlcnMuc2l6ZSwgcGFyYW1ldGVycy5jdXJ2ZVNlZ21lbnRzICk7XG5cblx0Ly8gdHJhbnNsYXRlIHBhcmFtZXRlcnMgdG8gRXh0cnVkZUdlb21ldHJ5IEFQSVxuXG5cdHBhcmFtZXRlcnMuYW1vdW50ID0gcGFyYW1ldGVycy5oZWlnaHQgIT09IHVuZGVmaW5lZCA/IHBhcmFtZXRlcnMuaGVpZ2h0IDogNTA7XG5cblx0Ly8gZGVmYXVsdHNcblxuXHRpZiAoIHBhcmFtZXRlcnMuYmV2ZWxUaGlja25lc3MgPT09IHVuZGVmaW5lZCApIHBhcmFtZXRlcnMuYmV2ZWxUaGlja25lc3MgPSAxMDtcblx0aWYgKCBwYXJhbWV0ZXJzLmJldmVsU2l6ZSA9PT0gdW5kZWZpbmVkICkgcGFyYW1ldGVycy5iZXZlbFNpemUgPSA4O1xuXHRpZiAoIHBhcmFtZXRlcnMuYmV2ZWxFbmFibGVkID09PSB1bmRlZmluZWQgKSBwYXJhbWV0ZXJzLmJldmVsRW5hYmxlZCA9IGZhbHNlO1xuXG5cdEV4dHJ1ZGVCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzLCBzaGFwZXMsIHBhcmFtZXRlcnMgKTtcblxuXHR0aGlzLnR5cGUgPSAnVGV4dEJ1ZmZlckdlb21ldHJ5JztcblxufVxuXG5UZXh0QnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggRXh0cnVkZUJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApO1xuVGV4dEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFRleHRCdWZmZXJHZW9tZXRyeTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBiZW5hYWRhbXMgLyBodHRwczovL3R3aXR0ZXIuY29tL2Jlbl9hX2FkYW1zXG4gKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44N1xuICovXG5cbi8vIFNwaGVyZUdlb21ldHJ5XG5cbmZ1bmN0aW9uIFNwaGVyZUdlb21ldHJ5KCByYWRpdXMsIHdpZHRoU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCBwaGlTdGFydCwgcGhpTGVuZ3RoLCB0aGV0YVN0YXJ0LCB0aGV0YUxlbmd0aCApIHtcblxuXHRHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1NwaGVyZUdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0cmFkaXVzOiByYWRpdXMsXG5cdFx0d2lkdGhTZWdtZW50czogd2lkdGhTZWdtZW50cyxcblx0XHRoZWlnaHRTZWdtZW50czogaGVpZ2h0U2VnbWVudHMsXG5cdFx0cGhpU3RhcnQ6IHBoaVN0YXJ0LFxuXHRcdHBoaUxlbmd0aDogcGhpTGVuZ3RoLFxuXHRcdHRoZXRhU3RhcnQ6IHRoZXRhU3RhcnQsXG5cdFx0dGhldGFMZW5ndGg6IHRoZXRhTGVuZ3RoXG5cdH07XG5cblx0dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIG5ldyBTcGhlcmVCdWZmZXJHZW9tZXRyeSggcmFkaXVzLCB3aWR0aFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgcGhpU3RhcnQsIHBoaUxlbmd0aCwgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKSApO1xuXHR0aGlzLm1lcmdlVmVydGljZXMoKTtcblxufVxuXG5TcGhlcmVHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBHZW9tZXRyeS5wcm90b3R5cGUgKTtcblNwaGVyZUdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFNwaGVyZUdlb21ldHJ5O1xuXG4vLyBTcGhlcmVCdWZmZXJHZW9tZXRyeVxuXG5mdW5jdGlvbiBTcGhlcmVCdWZmZXJHZW9tZXRyeSggcmFkaXVzLCB3aWR0aFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgcGhpU3RhcnQsIHBoaUxlbmd0aCwgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKSB7XG5cblx0QnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdTcGhlcmVCdWZmZXJHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdHdpZHRoU2VnbWVudHM6IHdpZHRoU2VnbWVudHMsXG5cdFx0aGVpZ2h0U2VnbWVudHM6IGhlaWdodFNlZ21lbnRzLFxuXHRcdHBoaVN0YXJ0OiBwaGlTdGFydCxcblx0XHRwaGlMZW5ndGg6IHBoaUxlbmd0aCxcblx0XHR0aGV0YVN0YXJ0OiB0aGV0YVN0YXJ0LFxuXHRcdHRoZXRhTGVuZ3RoOiB0aGV0YUxlbmd0aFxuXHR9O1xuXG5cdHJhZGl1cyA9IHJhZGl1cyB8fCAxO1xuXG5cdHdpZHRoU2VnbWVudHMgPSBNYXRoLm1heCggMywgTWF0aC5mbG9vciggd2lkdGhTZWdtZW50cyApIHx8IDggKTtcblx0aGVpZ2h0U2VnbWVudHMgPSBNYXRoLm1heCggMiwgTWF0aC5mbG9vciggaGVpZ2h0U2VnbWVudHMgKSB8fCA2ICk7XG5cblx0cGhpU3RhcnQgPSBwaGlTdGFydCAhPT0gdW5kZWZpbmVkID8gcGhpU3RhcnQgOiAwO1xuXHRwaGlMZW5ndGggPSBwaGlMZW5ndGggIT09IHVuZGVmaW5lZCA/IHBoaUxlbmd0aCA6IE1hdGguUEkgKiAyO1xuXG5cdHRoZXRhU3RhcnQgPSB0aGV0YVN0YXJ0ICE9PSB1bmRlZmluZWQgPyB0aGV0YVN0YXJ0IDogMDtcblx0dGhldGFMZW5ndGggPSB0aGV0YUxlbmd0aCAhPT0gdW5kZWZpbmVkID8gdGhldGFMZW5ndGggOiBNYXRoLlBJO1xuXG5cdHZhciB0aGV0YUVuZCA9IHRoZXRhU3RhcnQgKyB0aGV0YUxlbmd0aDtcblxuXHR2YXIgaXgsIGl5O1xuXG5cdHZhciBpbmRleCA9IDA7XG5cdHZhciBncmlkID0gW107XG5cblx0dmFyIHZlcnRleCA9IG5ldyBWZWN0b3IzKCk7XG5cdHZhciBub3JtYWwgPSBuZXcgVmVjdG9yMygpO1xuXG5cdC8vIGJ1ZmZlcnNcblxuXHR2YXIgaW5kaWNlcyA9IFtdO1xuXHR2YXIgdmVydGljZXMgPSBbXTtcblx0dmFyIG5vcm1hbHMgPSBbXTtcblx0dmFyIHV2cyA9IFtdO1xuXG5cdC8vIGdlbmVyYXRlIHZlcnRpY2VzLCBub3JtYWxzIGFuZCB1dnNcblxuXHRmb3IgKCBpeSA9IDA7IGl5IDw9IGhlaWdodFNlZ21lbnRzOyBpeSArKyApIHtcblxuXHRcdHZhciB2ZXJ0aWNlc1JvdyA9IFtdO1xuXG5cdFx0dmFyIHYgPSBpeSAvIGhlaWdodFNlZ21lbnRzO1xuXG5cdFx0Zm9yICggaXggPSAwOyBpeCA8PSB3aWR0aFNlZ21lbnRzOyBpeCArKyApIHtcblxuXHRcdFx0dmFyIHUgPSBpeCAvIHdpZHRoU2VnbWVudHM7XG5cblx0XHRcdC8vIHZlcnRleFxuXG5cdFx0XHR2ZXJ0ZXgueCA9IC0gcmFkaXVzICogTWF0aC5jb3MoIHBoaVN0YXJ0ICsgdSAqIHBoaUxlbmd0aCApICogTWF0aC5zaW4oIHRoZXRhU3RhcnQgKyB2ICogdGhldGFMZW5ndGggKTtcblx0XHRcdHZlcnRleC55ID0gcmFkaXVzICogTWF0aC5jb3MoIHRoZXRhU3RhcnQgKyB2ICogdGhldGFMZW5ndGggKTtcblx0XHRcdHZlcnRleC56ID0gcmFkaXVzICogTWF0aC5zaW4oIHBoaVN0YXJ0ICsgdSAqIHBoaUxlbmd0aCApICogTWF0aC5zaW4oIHRoZXRhU3RhcnQgKyB2ICogdGhldGFMZW5ndGggKTtcblxuXHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0XHQvLyBub3JtYWxcblxuXHRcdFx0bm9ybWFsLnNldCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApLm5vcm1hbGl6ZSgpO1xuXHRcdFx0bm9ybWFscy5wdXNoKCBub3JtYWwueCwgbm9ybWFsLnksIG5vcm1hbC56ICk7XG5cblx0XHRcdC8vIHV2XG5cblx0XHRcdHV2cy5wdXNoKCB1LCAxIC0gdiApO1xuXG5cdFx0XHR2ZXJ0aWNlc1Jvdy5wdXNoKCBpbmRleCArKyApO1xuXG5cdFx0fVxuXG5cdFx0Z3JpZC5wdXNoKCB2ZXJ0aWNlc1JvdyApO1xuXG5cdH1cblxuXHQvLyBpbmRpY2VzXG5cblx0Zm9yICggaXkgPSAwOyBpeSA8IGhlaWdodFNlZ21lbnRzOyBpeSArKyApIHtcblxuXHRcdGZvciAoIGl4ID0gMDsgaXggPCB3aWR0aFNlZ21lbnRzOyBpeCArKyApIHtcblxuXHRcdFx0dmFyIGEgPSBncmlkWyBpeSBdWyBpeCArIDEgXTtcblx0XHRcdHZhciBiID0gZ3JpZFsgaXkgXVsgaXggXTtcblx0XHRcdHZhciBjID0gZ3JpZFsgaXkgKyAxIF1bIGl4IF07XG5cdFx0XHR2YXIgZCA9IGdyaWRbIGl5ICsgMSBdWyBpeCArIDEgXTtcblxuXHRcdFx0aWYgKCBpeSAhPT0gMCB8fCB0aGV0YVN0YXJ0ID4gMCApIGluZGljZXMucHVzaCggYSwgYiwgZCApO1xuXHRcdFx0aWYgKCBpeSAhPT0gaGVpZ2h0U2VnbWVudHMgLSAxIHx8IHRoZXRhRW5kIDwgTWF0aC5QSSApIGluZGljZXMucHVzaCggYiwgYywgZCApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHQvLyBidWlsZCBnZW9tZXRyeVxuXG5cdHRoaXMuc2V0SW5kZXgoIGluZGljZXMgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIG5vcm1hbHMsIDMgKSApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2cywgMiApICk7XG5cbn1cblxuU3BoZXJlQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7XG5TcGhlcmVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBTcGhlcmVCdWZmZXJHZW9tZXRyeTtcblxuLyoqXG4gKiBAYXV0aG9yIEthbGViIE11cnBoeVxuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqL1xuXG4vLyBSaW5nR2VvbWV0cnlcblxuZnVuY3Rpb24gUmluZ0dlb21ldHJ5KCBpbm5lclJhZGl1cywgb3V0ZXJSYWRpdXMsIHRoZXRhU2VnbWVudHMsIHBoaVNlZ21lbnRzLCB0aGV0YVN0YXJ0LCB0aGV0YUxlbmd0aCApIHtcblxuXHRHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1JpbmdHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdGlubmVyUmFkaXVzOiBpbm5lclJhZGl1cyxcblx0XHRvdXRlclJhZGl1czogb3V0ZXJSYWRpdXMsXG5cdFx0dGhldGFTZWdtZW50czogdGhldGFTZWdtZW50cyxcblx0XHRwaGlTZWdtZW50czogcGhpU2VnbWVudHMsXG5cdFx0dGhldGFTdGFydDogdGhldGFTdGFydCxcblx0XHR0aGV0YUxlbmd0aDogdGhldGFMZW5ndGhcblx0fTtcblxuXHR0aGlzLmZyb21CdWZmZXJHZW9tZXRyeSggbmV3IFJpbmdCdWZmZXJHZW9tZXRyeSggaW5uZXJSYWRpdXMsIG91dGVyUmFkaXVzLCB0aGV0YVNlZ21lbnRzLCBwaGlTZWdtZW50cywgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKSApO1xuXHR0aGlzLm1lcmdlVmVydGljZXMoKTtcblxufVxuXG5SaW5nR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7XG5SaW5nR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUmluZ0dlb21ldHJ5O1xuXG4vLyBSaW5nQnVmZmVyR2VvbWV0cnlcblxuZnVuY3Rpb24gUmluZ0J1ZmZlckdlb21ldHJ5KCBpbm5lclJhZGl1cywgb3V0ZXJSYWRpdXMsIHRoZXRhU2VnbWVudHMsIHBoaVNlZ21lbnRzLCB0aGV0YVN0YXJ0LCB0aGV0YUxlbmd0aCApIHtcblxuXHRCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1JpbmdCdWZmZXJHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdGlubmVyUmFkaXVzOiBpbm5lclJhZGl1cyxcblx0XHRvdXRlclJhZGl1czogb3V0ZXJSYWRpdXMsXG5cdFx0dGhldGFTZWdtZW50czogdGhldGFTZWdtZW50cyxcblx0XHRwaGlTZWdtZW50czogcGhpU2VnbWVudHMsXG5cdFx0dGhldGFTdGFydDogdGhldGFTdGFydCxcblx0XHR0aGV0YUxlbmd0aDogdGhldGFMZW5ndGhcblx0fTtcblxuXHRpbm5lclJhZGl1cyA9IGlubmVyUmFkaXVzIHx8IDAuNTtcblx0b3V0ZXJSYWRpdXMgPSBvdXRlclJhZGl1cyB8fCAxO1xuXG5cdHRoZXRhU3RhcnQgPSB0aGV0YVN0YXJ0ICE9PSB1bmRlZmluZWQgPyB0aGV0YVN0YXJ0IDogMDtcblx0dGhldGFMZW5ndGggPSB0aGV0YUxlbmd0aCAhPT0gdW5kZWZpbmVkID8gdGhldGFMZW5ndGggOiBNYXRoLlBJICogMjtcblxuXHR0aGV0YVNlZ21lbnRzID0gdGhldGFTZWdtZW50cyAhPT0gdW5kZWZpbmVkID8gTWF0aC5tYXgoIDMsIHRoZXRhU2VnbWVudHMgKSA6IDg7XG5cdHBoaVNlZ21lbnRzID0gcGhpU2VnbWVudHMgIT09IHVuZGVmaW5lZCA/IE1hdGgubWF4KCAxLCBwaGlTZWdtZW50cyApIDogMTtcblxuXHQvLyBidWZmZXJzXG5cblx0dmFyIGluZGljZXMgPSBbXTtcblx0dmFyIHZlcnRpY2VzID0gW107XG5cdHZhciBub3JtYWxzID0gW107XG5cdHZhciB1dnMgPSBbXTtcblxuXHQvLyBzb21lIGhlbHBlciB2YXJpYWJsZXNcblxuXHR2YXIgc2VnbWVudDtcblx0dmFyIHJhZGl1cyA9IGlubmVyUmFkaXVzO1xuXHR2YXIgcmFkaXVzU3RlcCA9ICggKCBvdXRlclJhZGl1cyAtIGlubmVyUmFkaXVzICkgLyBwaGlTZWdtZW50cyApO1xuXHR2YXIgdmVydGV4ID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIHV2ID0gbmV3IFZlY3RvcjIoKTtcblx0dmFyIGosIGk7XG5cblx0Ly8gZ2VuZXJhdGUgdmVydGljZXMsIG5vcm1hbHMgYW5kIHV2c1xuXG5cdGZvciAoIGogPSAwOyBqIDw9IHBoaVNlZ21lbnRzOyBqICsrICkge1xuXG5cdFx0Zm9yICggaSA9IDA7IGkgPD0gdGhldGFTZWdtZW50czsgaSArKyApIHtcblxuXHRcdFx0Ly8gdmFsdWVzIGFyZSBnZW5lcmF0ZSBmcm9tIHRoZSBpbnNpZGUgb2YgdGhlIHJpbmcgdG8gdGhlIG91dHNpZGVcblxuXHRcdFx0c2VnbWVudCA9IHRoZXRhU3RhcnQgKyBpIC8gdGhldGFTZWdtZW50cyAqIHRoZXRhTGVuZ3RoO1xuXG5cdFx0XHQvLyB2ZXJ0ZXhcblxuXHRcdFx0dmVydGV4LnggPSByYWRpdXMgKiBNYXRoLmNvcyggc2VnbWVudCApO1xuXHRcdFx0dmVydGV4LnkgPSByYWRpdXMgKiBNYXRoLnNpbiggc2VnbWVudCApO1xuXG5cdFx0XHR2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7XG5cblx0XHRcdC8vIG5vcm1hbFxuXG5cdFx0XHRub3JtYWxzLnB1c2goIDAsIDAsIDEgKTtcblxuXHRcdFx0Ly8gdXZcblxuXHRcdFx0dXYueCA9ICggdmVydGV4LnggLyBvdXRlclJhZGl1cyArIDEgKSAvIDI7XG5cdFx0XHR1di55ID0gKCB2ZXJ0ZXgueSAvIG91dGVyUmFkaXVzICsgMSApIC8gMjtcblxuXHRcdFx0dXZzLnB1c2goIHV2LngsIHV2LnkgKTtcblxuXHRcdH1cblxuXHRcdC8vIGluY3JlYXNlIHRoZSByYWRpdXMgZm9yIG5leHQgcm93IG9mIHZlcnRpY2VzXG5cblx0XHRyYWRpdXMgKz0gcmFkaXVzU3RlcDtcblxuXHR9XG5cblx0Ly8gaW5kaWNlc1xuXG5cdGZvciAoIGogPSAwOyBqIDwgcGhpU2VnbWVudHM7IGogKysgKSB7XG5cblx0XHR2YXIgdGhldGFTZWdtZW50TGV2ZWwgPSBqICogKCB0aGV0YVNlZ21lbnRzICsgMSApO1xuXG5cdFx0Zm9yICggaSA9IDA7IGkgPCB0aGV0YVNlZ21lbnRzOyBpICsrICkge1xuXG5cdFx0XHRzZWdtZW50ID0gaSArIHRoZXRhU2VnbWVudExldmVsO1xuXG5cdFx0XHR2YXIgYSA9IHNlZ21lbnQ7XG5cdFx0XHR2YXIgYiA9IHNlZ21lbnQgKyB0aGV0YVNlZ21lbnRzICsgMTtcblx0XHRcdHZhciBjID0gc2VnbWVudCArIHRoZXRhU2VnbWVudHMgKyAyO1xuXHRcdFx0dmFyIGQgPSBzZWdtZW50ICsgMTtcblxuXHRcdFx0Ly8gZmFjZXNcblxuXHRcdFx0aW5kaWNlcy5wdXNoKCBhLCBiLCBkICk7XG5cdFx0XHRpbmRpY2VzLnB1c2goIGIsIGMsIGQgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gYnVpbGQgZ2VvbWV0cnlcblxuXHR0aGlzLnNldEluZGV4KCBpbmRpY2VzICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBub3JtYWxzLCAzICkgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICd1dicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB1dnMsIDIgKSApO1xuXG59XG5cblJpbmdCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTtcblJpbmdCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBSaW5nQnVmZmVyR2VvbWV0cnk7XG5cbi8qKlxuICogQGF1dGhvciBhc3Ryb2R1ZCAvIGh0dHA6Ly9hc3Ryb2R1ZC5pc2dyZWF0Lm9yZy9cbiAqIEBhdXRob3Igeno4NSAvIGh0dHBzOi8vZ2l0aHViLmNvbS96ejg1XG4gKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvXG4gKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44N1xuICovXG5cbi8vIExhdGhlR2VvbWV0cnlcblxuZnVuY3Rpb24gTGF0aGVHZW9tZXRyeSggcG9pbnRzLCBzZWdtZW50cywgcGhpU3RhcnQsIHBoaUxlbmd0aCApIHtcblxuXHRHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0xhdGhlR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRwb2ludHM6IHBvaW50cyxcblx0XHRzZWdtZW50czogc2VnbWVudHMsXG5cdFx0cGhpU3RhcnQ6IHBoaVN0YXJ0LFxuXHRcdHBoaUxlbmd0aDogcGhpTGVuZ3RoXG5cdH07XG5cblx0dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIG5ldyBMYXRoZUJ1ZmZlckdlb21ldHJ5KCBwb2ludHMsIHNlZ21lbnRzLCBwaGlTdGFydCwgcGhpTGVuZ3RoICkgKTtcblx0dGhpcy5tZXJnZVZlcnRpY2VzKCk7XG5cbn1cblxuTGF0aGVHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBHZW9tZXRyeS5wcm90b3R5cGUgKTtcbkxhdGhlR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTGF0aGVHZW9tZXRyeTtcblxuLy8gTGF0aGVCdWZmZXJHZW9tZXRyeVxuXG5mdW5jdGlvbiBMYXRoZUJ1ZmZlckdlb21ldHJ5KCBwb2ludHMsIHNlZ21lbnRzLCBwaGlTdGFydCwgcGhpTGVuZ3RoICkge1xuXG5cdEJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnTGF0aGVCdWZmZXJHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHBvaW50czogcG9pbnRzLFxuXHRcdHNlZ21lbnRzOiBzZWdtZW50cyxcblx0XHRwaGlTdGFydDogcGhpU3RhcnQsXG5cdFx0cGhpTGVuZ3RoOiBwaGlMZW5ndGhcblx0fTtcblxuXHRzZWdtZW50cyA9IE1hdGguZmxvb3IoIHNlZ21lbnRzICkgfHwgMTI7XG5cdHBoaVN0YXJ0ID0gcGhpU3RhcnQgfHwgMDtcblx0cGhpTGVuZ3RoID0gcGhpTGVuZ3RoIHx8IE1hdGguUEkgKiAyO1xuXG5cdC8vIGNsYW1wIHBoaUxlbmd0aCBzbyBpdCdzIGluIHJhbmdlIG9mIFsgMCwgMlBJIF1cblxuXHRwaGlMZW5ndGggPSBfTWF0aC5jbGFtcCggcGhpTGVuZ3RoLCAwLCBNYXRoLlBJICogMiApO1xuXG5cblx0Ly8gYnVmZmVyc1xuXG5cdHZhciBpbmRpY2VzID0gW107XG5cdHZhciB2ZXJ0aWNlcyA9IFtdO1xuXHR2YXIgdXZzID0gW107XG5cblx0Ly8gaGVscGVyIHZhcmlhYmxlc1xuXG5cdHZhciBiYXNlO1xuXHR2YXIgaW52ZXJzZVNlZ21lbnRzID0gMS4wIC8gc2VnbWVudHM7XG5cdHZhciB2ZXJ0ZXggPSBuZXcgVmVjdG9yMygpO1xuXHR2YXIgdXYgPSBuZXcgVmVjdG9yMigpO1xuXHR2YXIgaSwgajtcblxuXHQvLyBnZW5lcmF0ZSB2ZXJ0aWNlcyBhbmQgdXZzXG5cblx0Zm9yICggaSA9IDA7IGkgPD0gc2VnbWVudHM7IGkgKysgKSB7XG5cblx0XHR2YXIgcGhpID0gcGhpU3RhcnQgKyBpICogaW52ZXJzZVNlZ21lbnRzICogcGhpTGVuZ3RoO1xuXG5cdFx0dmFyIHNpbiA9IE1hdGguc2luKCBwaGkgKTtcblx0XHR2YXIgY29zID0gTWF0aC5jb3MoIHBoaSApO1xuXG5cdFx0Zm9yICggaiA9IDA7IGogPD0gKCBwb2ludHMubGVuZ3RoIC0gMSApOyBqICsrICkge1xuXG5cdFx0XHQvLyB2ZXJ0ZXhcblxuXHRcdFx0dmVydGV4LnggPSBwb2ludHNbIGogXS54ICogc2luO1xuXHRcdFx0dmVydGV4LnkgPSBwb2ludHNbIGogXS55O1xuXHRcdFx0dmVydGV4LnogPSBwb2ludHNbIGogXS54ICogY29zO1xuXG5cdFx0XHR2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7XG5cblx0XHRcdC8vIHV2XG5cblx0XHRcdHV2LnggPSBpIC8gc2VnbWVudHM7XG5cdFx0XHR1di55ID0gaiAvICggcG9pbnRzLmxlbmd0aCAtIDEgKTtcblxuXHRcdFx0dXZzLnB1c2goIHV2LngsIHV2LnkgKTtcblxuXG5cdFx0fVxuXG5cdH1cblxuXHQvLyBpbmRpY2VzXG5cblx0Zm9yICggaSA9IDA7IGkgPCBzZWdtZW50czsgaSArKyApIHtcblxuXHRcdGZvciAoIGogPSAwOyBqIDwgKCBwb2ludHMubGVuZ3RoIC0gMSApOyBqICsrICkge1xuXG5cdFx0XHRiYXNlID0gaiArIGkgKiBwb2ludHMubGVuZ3RoO1xuXG5cdFx0XHR2YXIgYSA9IGJhc2U7XG5cdFx0XHR2YXIgYiA9IGJhc2UgKyBwb2ludHMubGVuZ3RoO1xuXHRcdFx0dmFyIGMgPSBiYXNlICsgcG9pbnRzLmxlbmd0aCArIDE7XG5cdFx0XHR2YXIgZCA9IGJhc2UgKyAxO1xuXG5cdFx0XHQvLyBmYWNlc1xuXG5cdFx0XHRpbmRpY2VzLnB1c2goIGEsIGIsIGQgKTtcblx0XHRcdGluZGljZXMucHVzaCggYiwgYywgZCApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHQvLyBidWlsZCBnZW9tZXRyeVxuXG5cdHRoaXMuc2V0SW5kZXgoIGluZGljZXMgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAyICkgKTtcblxuXHQvLyBnZW5lcmF0ZSBub3JtYWxzXG5cblx0dGhpcy5jb21wdXRlVmVydGV4Tm9ybWFscygpO1xuXG5cdC8vIGlmIHRoZSBnZW9tZXRyeSBpcyBjbG9zZWQsIHdlIG5lZWQgdG8gYXZlcmFnZSB0aGUgbm9ybWFscyBhbG9uZyB0aGUgc2VhbS5cblx0Ly8gYmVjYXVzZSB0aGUgY29ycmVzcG9uZGluZyB2ZXJ0aWNlcyBhcmUgaWRlbnRpY2FsIChidXQgc3RpbGwgaGF2ZSBkaWZmZXJlbnQgVVZzKS5cblxuXHRpZiAoIHBoaUxlbmd0aCA9PT0gTWF0aC5QSSAqIDIgKSB7XG5cblx0XHR2YXIgbm9ybWFscyA9IHRoaXMuYXR0cmlidXRlcy5ub3JtYWwuYXJyYXk7XG5cdFx0dmFyIG4xID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgbjIgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciBuID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdC8vIHRoaXMgaXMgdGhlIGJ1ZmZlciBvZmZzZXQgZm9yIHRoZSBsYXN0IGxpbmUgb2YgdmVydGljZXNcblxuXHRcdGJhc2UgPSBzZWdtZW50cyAqIHBvaW50cy5sZW5ndGggKiAzO1xuXG5cdFx0Zm9yICggaSA9IDAsIGogPSAwOyBpIDwgcG9pbnRzLmxlbmd0aDsgaSArKywgaiArPSAzICkge1xuXG5cdFx0XHQvLyBzZWxlY3QgdGhlIG5vcm1hbCBvZiB0aGUgdmVydGV4IGluIHRoZSBmaXJzdCBsaW5lXG5cblx0XHRcdG4xLnggPSBub3JtYWxzWyBqICsgMCBdO1xuXHRcdFx0bjEueSA9IG5vcm1hbHNbIGogKyAxIF07XG5cdFx0XHRuMS56ID0gbm9ybWFsc1sgaiArIDIgXTtcblxuXHRcdFx0Ly8gc2VsZWN0IHRoZSBub3JtYWwgb2YgdGhlIHZlcnRleCBpbiB0aGUgbGFzdCBsaW5lXG5cblx0XHRcdG4yLnggPSBub3JtYWxzWyBiYXNlICsgaiArIDAgXTtcblx0XHRcdG4yLnkgPSBub3JtYWxzWyBiYXNlICsgaiArIDEgXTtcblx0XHRcdG4yLnogPSBub3JtYWxzWyBiYXNlICsgaiArIDIgXTtcblxuXHRcdFx0Ly8gYXZlcmFnZSBub3JtYWxzXG5cblx0XHRcdG4uYWRkVmVjdG9ycyggbjEsIG4yICkubm9ybWFsaXplKCk7XG5cblx0XHRcdC8vIGFzc2lnbiB0aGUgbmV3IHZhbHVlcyB0byBib3RoIG5vcm1hbHNcblxuXHRcdFx0bm9ybWFsc1sgaiArIDAgXSA9IG5vcm1hbHNbIGJhc2UgKyBqICsgMCBdID0gbi54O1xuXHRcdFx0bm9ybWFsc1sgaiArIDEgXSA9IG5vcm1hbHNbIGJhc2UgKyBqICsgMSBdID0gbi55O1xuXHRcdFx0bm9ybWFsc1sgaiArIDIgXSA9IG5vcm1hbHNbIGJhc2UgKyBqICsgMiBdID0gbi56O1xuXG5cdFx0fVxuXG5cdH1cblxufVxuXG5MYXRoZUJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApO1xuTGF0aGVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBMYXRoZUJ1ZmZlckdlb21ldHJ5O1xuXG4vKipcbiAqIEBhdXRob3Igam9ub2JyMSAvIGh0dHA6Ly9qb25vYnIxLmNvbVxuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqL1xuXG4vLyBTaGFwZUdlb21ldHJ5XG5cbmZ1bmN0aW9uIFNoYXBlR2VvbWV0cnkoIHNoYXBlcywgY3VydmVTZWdtZW50cyApIHtcblxuXHRHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1NoYXBlR2VvbWV0cnknO1xuXG5cdGlmICggdHlwZW9mIGN1cnZlU2VnbWVudHMgPT09ICdvYmplY3QnICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuU2hhcGVHZW9tZXRyeTogT3B0aW9ucyBwYXJhbWV0ZXIgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0XHRjdXJ2ZVNlZ21lbnRzID0gY3VydmVTZWdtZW50cy5jdXJ2ZVNlZ21lbnRzO1xuXG5cdH1cblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0c2hhcGVzOiBzaGFwZXMsXG5cdFx0Y3VydmVTZWdtZW50czogY3VydmVTZWdtZW50c1xuXHR9O1xuXG5cdHRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgU2hhcGVCdWZmZXJHZW9tZXRyeSggc2hhcGVzLCBjdXJ2ZVNlZ21lbnRzICkgKTtcblx0dGhpcy5tZXJnZVZlcnRpY2VzKCk7XG5cbn1cblxuU2hhcGVHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBHZW9tZXRyeS5wcm90b3R5cGUgKTtcblNoYXBlR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU2hhcGVHZW9tZXRyeTtcblxuU2hhcGVHZW9tZXRyeS5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gKCkge1xuXG5cdHZhciBkYXRhID0gR2VvbWV0cnkucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzICk7XG5cblx0dmFyIHNoYXBlcyA9IHRoaXMucGFyYW1ldGVycy5zaGFwZXM7XG5cblx0cmV0dXJuIHRvSlNPTiggc2hhcGVzLCBkYXRhICk7XG5cbn07XG5cbi8vIFNoYXBlQnVmZmVyR2VvbWV0cnlcblxuZnVuY3Rpb24gU2hhcGVCdWZmZXJHZW9tZXRyeSggc2hhcGVzLCBjdXJ2ZVNlZ21lbnRzICkge1xuXG5cdEJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnU2hhcGVCdWZmZXJHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHNoYXBlczogc2hhcGVzLFxuXHRcdGN1cnZlU2VnbWVudHM6IGN1cnZlU2VnbWVudHNcblx0fTtcblxuXHRjdXJ2ZVNlZ21lbnRzID0gY3VydmVTZWdtZW50cyB8fCAxMjtcblxuXHQvLyBidWZmZXJzXG5cblx0dmFyIGluZGljZXMgPSBbXTtcblx0dmFyIHZlcnRpY2VzID0gW107XG5cdHZhciBub3JtYWxzID0gW107XG5cdHZhciB1dnMgPSBbXTtcblxuXHQvLyBoZWxwZXIgdmFyaWFibGVzXG5cblx0dmFyIGdyb3VwU3RhcnQgPSAwO1xuXHR2YXIgZ3JvdXBDb3VudCA9IDA7XG5cblx0Ly8gYWxsb3cgc2luZ2xlIGFuZCBhcnJheSB2YWx1ZXMgZm9yIFwic2hhcGVzXCIgcGFyYW1ldGVyXG5cblx0aWYgKCBBcnJheS5pc0FycmF5KCBzaGFwZXMgKSA9PT0gZmFsc2UgKSB7XG5cblx0XHRhZGRTaGFwZSggc2hhcGVzICk7XG5cblx0fSBlbHNlIHtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IHNoYXBlcy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdGFkZFNoYXBlKCBzaGFwZXNbIGkgXSApO1xuXG5cdFx0XHR0aGlzLmFkZEdyb3VwKCBncm91cFN0YXJ0LCBncm91cENvdW50LCBpICk7IC8vIGVuYWJsZXMgTXVsdGlNYXRlcmlhbCBzdXBwb3J0XG5cblx0XHRcdGdyb3VwU3RhcnQgKz0gZ3JvdXBDb3VudDtcblx0XHRcdGdyb3VwQ291bnQgPSAwO1xuXG5cdFx0fVxuXG5cdH1cblxuXHQvLyBidWlsZCBnZW9tZXRyeVxuXG5cdHRoaXMuc2V0SW5kZXgoIGluZGljZXMgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIG5vcm1hbHMsIDMgKSApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2cywgMiApICk7XG5cblxuXHQvLyBoZWxwZXIgZnVuY3Rpb25zXG5cblx0ZnVuY3Rpb24gYWRkU2hhcGUoIHNoYXBlICkge1xuXG5cdFx0dmFyIGksIGwsIHNoYXBlSG9sZTtcblxuXHRcdHZhciBpbmRleE9mZnNldCA9IHZlcnRpY2VzLmxlbmd0aCAvIDM7XG5cdFx0dmFyIHBvaW50cyA9IHNoYXBlLmV4dHJhY3RQb2ludHMoIGN1cnZlU2VnbWVudHMgKTtcblxuXHRcdHZhciBzaGFwZVZlcnRpY2VzID0gcG9pbnRzLnNoYXBlO1xuXHRcdHZhciBzaGFwZUhvbGVzID0gcG9pbnRzLmhvbGVzO1xuXG5cdFx0Ly8gY2hlY2sgZGlyZWN0aW9uIG9mIHZlcnRpY2VzXG5cblx0XHRpZiAoIFNoYXBlVXRpbHMuaXNDbG9ja1dpc2UoIHNoYXBlVmVydGljZXMgKSA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdHNoYXBlVmVydGljZXMgPSBzaGFwZVZlcnRpY2VzLnJldmVyc2UoKTtcblxuXHRcdFx0Ly8gYWxzbyBjaGVjayBpZiBob2xlcyBhcmUgaW4gdGhlIG9wcG9zaXRlIGRpcmVjdGlvblxuXG5cdFx0XHRmb3IgKCBpID0gMCwgbCA9IHNoYXBlSG9sZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRzaGFwZUhvbGUgPSBzaGFwZUhvbGVzWyBpIF07XG5cblx0XHRcdFx0aWYgKCBTaGFwZVV0aWxzLmlzQ2xvY2tXaXNlKCBzaGFwZUhvbGUgKSA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0XHRcdHNoYXBlSG9sZXNbIGkgXSA9IHNoYXBlSG9sZS5yZXZlcnNlKCk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHR2YXIgZmFjZXMgPSBTaGFwZVV0aWxzLnRyaWFuZ3VsYXRlU2hhcGUoIHNoYXBlVmVydGljZXMsIHNoYXBlSG9sZXMgKTtcblxuXHRcdC8vIGpvaW4gdmVydGljZXMgb2YgaW5uZXIgYW5kIG91dGVyIHBhdGhzIHRvIGEgc2luZ2xlIGFycmF5XG5cblx0XHRmb3IgKCBpID0gMCwgbCA9IHNoYXBlSG9sZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0c2hhcGVIb2xlID0gc2hhcGVIb2xlc1sgaSBdO1xuXHRcdFx0c2hhcGVWZXJ0aWNlcyA9IHNoYXBlVmVydGljZXMuY29uY2F0KCBzaGFwZUhvbGUgKTtcblxuXHRcdH1cblxuXHRcdC8vIHZlcnRpY2VzLCBub3JtYWxzLCB1dnNcblxuXHRcdGZvciAoIGkgPSAwLCBsID0gc2hhcGVWZXJ0aWNlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgdmVydGV4ID0gc2hhcGVWZXJ0aWNlc1sgaSBdO1xuXG5cdFx0XHR2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIDAgKTtcblx0XHRcdG5vcm1hbHMucHVzaCggMCwgMCwgMSApO1xuXHRcdFx0dXZzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSApOyAvLyB3b3JsZCB1dnNcblxuXHRcdH1cblxuXHRcdC8vIGluY2lkZXNcblxuXHRcdGZvciAoIGkgPSAwLCBsID0gZmFjZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGZhY2UgPSBmYWNlc1sgaSBdO1xuXG5cdFx0XHR2YXIgYSA9IGZhY2VbIDAgXSArIGluZGV4T2Zmc2V0O1xuXHRcdFx0dmFyIGIgPSBmYWNlWyAxIF0gKyBpbmRleE9mZnNldDtcblx0XHRcdHZhciBjID0gZmFjZVsgMiBdICsgaW5kZXhPZmZzZXQ7XG5cblx0XHRcdGluZGljZXMucHVzaCggYSwgYiwgYyApO1xuXHRcdFx0Z3JvdXBDb3VudCArPSAzO1xuXG5cdFx0fVxuXG5cdH1cblxufVxuXG5TaGFwZUJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApO1xuU2hhcGVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBTaGFwZUJ1ZmZlckdlb21ldHJ5O1xuXG5TaGFwZUJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoKSB7XG5cblx0dmFyIGRhdGEgPSBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMgKTtcblxuXHR2YXIgc2hhcGVzID0gdGhpcy5wYXJhbWV0ZXJzLnNoYXBlcztcblxuXHRyZXR1cm4gdG9KU09OKCBzaGFwZXMsIGRhdGEgKTtcblxufTtcblxuLy9cblxuZnVuY3Rpb24gdG9KU09OKCBzaGFwZXMsIGRhdGEgKSB7XG5cblx0ZGF0YS5zaGFwZXMgPSBbXTtcblxuXHRpZiAoIEFycmF5LmlzQXJyYXkoIHNoYXBlcyApICkge1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gc2hhcGVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBzaGFwZSA9IHNoYXBlc1sgaSBdO1xuXG5cdFx0XHRkYXRhLnNoYXBlcy5wdXNoKCBzaGFwZS51dWlkICk7XG5cblx0XHR9XG5cblx0fSBlbHNlIHtcblxuXHRcdGRhdGEuc2hhcGVzLnB1c2goIHNoYXBlcy51dWlkICk7XG5cblx0fVxuXG5cdHJldHVybiBkYXRhO1xuXG59XG5cbi8qKlxuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44N1xuICovXG5cbmZ1bmN0aW9uIEVkZ2VzR2VvbWV0cnkoIGdlb21ldHJ5LCB0aHJlc2hvbGRBbmdsZSApIHtcblxuXHRCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0VkZ2VzR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHR0aHJlc2hvbGRBbmdsZTogdGhyZXNob2xkQW5nbGVcblx0fTtcblxuXHR0aHJlc2hvbGRBbmdsZSA9ICggdGhyZXNob2xkQW5nbGUgIT09IHVuZGVmaW5lZCApID8gdGhyZXNob2xkQW5nbGUgOiAxO1xuXG5cdC8vIGJ1ZmZlclxuXG5cdHZhciB2ZXJ0aWNlcyA9IFtdO1xuXG5cdC8vIGhlbHBlciB2YXJpYWJsZXNcblxuXHR2YXIgdGhyZXNob2xkRG90ID0gTWF0aC5jb3MoIF9NYXRoLkRFRzJSQUQgKiB0aHJlc2hvbGRBbmdsZSApO1xuXHR2YXIgZWRnZSA9IFsgMCwgMCBdLCBlZGdlcyA9IHt9LCBlZGdlMSwgZWRnZTI7XG5cdHZhciBrZXksIGtleXMgPSBbICdhJywgJ2InLCAnYycgXTtcblxuXHQvLyBwcmVwYXJlIHNvdXJjZSBnZW9tZXRyeVxuXG5cdHZhciBnZW9tZXRyeTI7XG5cblx0aWYgKCBnZW9tZXRyeS5pc0J1ZmZlckdlb21ldHJ5ICkge1xuXG5cdFx0Z2VvbWV0cnkyID0gbmV3IEdlb21ldHJ5KCk7XG5cdFx0Z2VvbWV0cnkyLmZyb21CdWZmZXJHZW9tZXRyeSggZ2VvbWV0cnkgKTtcblxuXHR9IGVsc2Uge1xuXG5cdFx0Z2VvbWV0cnkyID0gZ2VvbWV0cnkuY2xvbmUoKTtcblxuXHR9XG5cblx0Z2VvbWV0cnkyLm1lcmdlVmVydGljZXMoKTtcblx0Z2VvbWV0cnkyLmNvbXB1dGVGYWNlTm9ybWFscygpO1xuXG5cdHZhciBzb3VyY2VWZXJ0aWNlcyA9IGdlb21ldHJ5Mi52ZXJ0aWNlcztcblx0dmFyIGZhY2VzID0gZ2VvbWV0cnkyLmZhY2VzO1xuXG5cdC8vIG5vdyBjcmVhdGUgYSBkYXRhIHN0cnVjdHVyZSB3aGVyZSBlYWNoIGVudHJ5IHJlcHJlc2VudHMgYW4gZWRnZSB3aXRoIGl0cyBhZGpvaW5pbmcgZmFjZXNcblxuXHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBmYWNlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0dmFyIGZhY2UgPSBmYWNlc1sgaSBdO1xuXG5cdFx0Zm9yICggdmFyIGogPSAwOyBqIDwgMzsgaiArKyApIHtcblxuXHRcdFx0ZWRnZTEgPSBmYWNlWyBrZXlzWyBqIF0gXTtcblx0XHRcdGVkZ2UyID0gZmFjZVsga2V5c1sgKCBqICsgMSApICUgMyBdIF07XG5cdFx0XHRlZGdlWyAwIF0gPSBNYXRoLm1pbiggZWRnZTEsIGVkZ2UyICk7XG5cdFx0XHRlZGdlWyAxIF0gPSBNYXRoLm1heCggZWRnZTEsIGVkZ2UyICk7XG5cblx0XHRcdGtleSA9IGVkZ2VbIDAgXSArICcsJyArIGVkZ2VbIDEgXTtcblxuXHRcdFx0aWYgKCBlZGdlc1sga2V5IF0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRlZGdlc1sga2V5IF0gPSB7IGluZGV4MTogZWRnZVsgMCBdLCBpbmRleDI6IGVkZ2VbIDEgXSwgZmFjZTE6IGksIGZhY2UyOiB1bmRlZmluZWQgfTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRlZGdlc1sga2V5IF0uZmFjZTIgPSBpO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIGdlbmVyYXRlIHZlcnRpY2VzXG5cblx0Zm9yICgga2V5IGluIGVkZ2VzICkge1xuXG5cdFx0dmFyIGUgPSBlZGdlc1sga2V5IF07XG5cblx0XHQvLyBhbiBlZGdlIGlzIG9ubHkgcmVuZGVyZWQgaWYgdGhlIGFuZ2xlIChpbiBkZWdyZWVzKSBiZXR3ZWVuIHRoZSBmYWNlIG5vcm1hbHMgb2YgdGhlIGFkam9pbmluZyBmYWNlcyBleGNlZWRzIHRoaXMgdmFsdWUuIGRlZmF1bHQgPSAxIGRlZ3JlZS5cblxuXHRcdGlmICggZS5mYWNlMiA9PT0gdW5kZWZpbmVkIHx8IGZhY2VzWyBlLmZhY2UxIF0ubm9ybWFsLmRvdCggZmFjZXNbIGUuZmFjZTIgXS5ub3JtYWwgKSA8PSB0aHJlc2hvbGREb3QgKSB7XG5cblx0XHRcdHZhciB2ZXJ0ZXggPSBzb3VyY2VWZXJ0aWNlc1sgZS5pbmRleDEgXTtcblx0XHRcdHZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTtcblxuXHRcdFx0dmVydGV4ID0gc291cmNlVmVydGljZXNbIGUuaW5kZXgyIF07XG5cdFx0XHR2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIGJ1aWxkIGdlb21ldHJ5XG5cblx0dGhpcy5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XG5cbn1cblxuRWRnZXNHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTtcbkVkZ2VzR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gRWRnZXNHZW9tZXRyeTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqL1xuXG4vLyBDeWxpbmRlckdlb21ldHJ5XG5cbmZ1bmN0aW9uIEN5bGluZGVyR2VvbWV0cnkoIHJhZGl1c1RvcCwgcmFkaXVzQm90dG9tLCBoZWlnaHQsIHJhZGlhbFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgb3BlbkVuZGVkLCB0aGV0YVN0YXJ0LCB0aGV0YUxlbmd0aCApIHtcblxuXHRHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0N5bGluZGVyR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRyYWRpdXNUb3A6IHJhZGl1c1RvcCxcblx0XHRyYWRpdXNCb3R0b206IHJhZGl1c0JvdHRvbSxcblx0XHRoZWlnaHQ6IGhlaWdodCxcblx0XHRyYWRpYWxTZWdtZW50czogcmFkaWFsU2VnbWVudHMsXG5cdFx0aGVpZ2h0U2VnbWVudHM6IGhlaWdodFNlZ21lbnRzLFxuXHRcdG9wZW5FbmRlZDogb3BlbkVuZGVkLFxuXHRcdHRoZXRhU3RhcnQ6IHRoZXRhU3RhcnQsXG5cdFx0dGhldGFMZW5ndGg6IHRoZXRhTGVuZ3RoXG5cdH07XG5cblx0dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIG5ldyBDeWxpbmRlckJ1ZmZlckdlb21ldHJ5KCByYWRpdXNUb3AsIHJhZGl1c0JvdHRvbSwgaGVpZ2h0LCByYWRpYWxTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIG9wZW5FbmRlZCwgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKSApO1xuXHR0aGlzLm1lcmdlVmVydGljZXMoKTtcblxufVxuXG5DeWxpbmRlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEdlb21ldHJ5LnByb3RvdHlwZSApO1xuQ3lsaW5kZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDeWxpbmRlckdlb21ldHJ5O1xuXG4vLyBDeWxpbmRlckJ1ZmZlckdlb21ldHJ5XG5cbmZ1bmN0aW9uIEN5bGluZGVyQnVmZmVyR2VvbWV0cnkoIHJhZGl1c1RvcCwgcmFkaXVzQm90dG9tLCBoZWlnaHQsIHJhZGlhbFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgb3BlbkVuZGVkLCB0aGV0YVN0YXJ0LCB0aGV0YUxlbmd0aCApIHtcblxuXHRCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0N5bGluZGVyQnVmZmVyR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRyYWRpdXNUb3A6IHJhZGl1c1RvcCxcblx0XHRyYWRpdXNCb3R0b206IHJhZGl1c0JvdHRvbSxcblx0XHRoZWlnaHQ6IGhlaWdodCxcblx0XHRyYWRpYWxTZWdtZW50czogcmFkaWFsU2VnbWVudHMsXG5cdFx0aGVpZ2h0U2VnbWVudHM6IGhlaWdodFNlZ21lbnRzLFxuXHRcdG9wZW5FbmRlZDogb3BlbkVuZGVkLFxuXHRcdHRoZXRhU3RhcnQ6IHRoZXRhU3RhcnQsXG5cdFx0dGhldGFMZW5ndGg6IHRoZXRhTGVuZ3RoXG5cdH07XG5cblx0dmFyIHNjb3BlID0gdGhpcztcblxuXHRyYWRpdXNUb3AgPSByYWRpdXNUb3AgIT09IHVuZGVmaW5lZCA/IHJhZGl1c1RvcCA6IDE7XG5cdHJhZGl1c0JvdHRvbSA9IHJhZGl1c0JvdHRvbSAhPT0gdW5kZWZpbmVkID8gcmFkaXVzQm90dG9tIDogMTtcblx0aGVpZ2h0ID0gaGVpZ2h0IHx8IDE7XG5cblx0cmFkaWFsU2VnbWVudHMgPSBNYXRoLmZsb29yKCByYWRpYWxTZWdtZW50cyApIHx8IDg7XG5cdGhlaWdodFNlZ21lbnRzID0gTWF0aC5mbG9vciggaGVpZ2h0U2VnbWVudHMgKSB8fCAxO1xuXG5cdG9wZW5FbmRlZCA9IG9wZW5FbmRlZCAhPT0gdW5kZWZpbmVkID8gb3BlbkVuZGVkIDogZmFsc2U7XG5cdHRoZXRhU3RhcnQgPSB0aGV0YVN0YXJ0ICE9PSB1bmRlZmluZWQgPyB0aGV0YVN0YXJ0IDogMC4wO1xuXHR0aGV0YUxlbmd0aCA9IHRoZXRhTGVuZ3RoICE9PSB1bmRlZmluZWQgPyB0aGV0YUxlbmd0aCA6IE1hdGguUEkgKiAyO1xuXG5cdC8vIGJ1ZmZlcnNcblxuXHR2YXIgaW5kaWNlcyA9IFtdO1xuXHR2YXIgdmVydGljZXMgPSBbXTtcblx0dmFyIG5vcm1hbHMgPSBbXTtcblx0dmFyIHV2cyA9IFtdO1xuXG5cdC8vIGhlbHBlciB2YXJpYWJsZXNcblxuXHR2YXIgaW5kZXggPSAwO1xuXHR2YXIgaW5kZXhBcnJheSA9IFtdO1xuXHR2YXIgaGFsZkhlaWdodCA9IGhlaWdodCAvIDI7XG5cdHZhciBncm91cFN0YXJ0ID0gMDtcblxuXHQvLyBnZW5lcmF0ZSBnZW9tZXRyeVxuXG5cdGdlbmVyYXRlVG9yc28oKTtcblxuXHRpZiAoIG9wZW5FbmRlZCA9PT0gZmFsc2UgKSB7XG5cblx0XHRpZiAoIHJhZGl1c1RvcCA+IDAgKSBnZW5lcmF0ZUNhcCggdHJ1ZSApO1xuXHRcdGlmICggcmFkaXVzQm90dG9tID4gMCApIGdlbmVyYXRlQ2FwKCBmYWxzZSApO1xuXG5cdH1cblxuXHQvLyBidWlsZCBnZW9tZXRyeVxuXG5cdHRoaXMuc2V0SW5kZXgoIGluZGljZXMgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIG5vcm1hbHMsIDMgKSApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2cywgMiApICk7XG5cblx0ZnVuY3Rpb24gZ2VuZXJhdGVUb3JzbygpIHtcblxuXHRcdHZhciB4LCB5O1xuXHRcdHZhciBub3JtYWwgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciB2ZXJ0ZXggPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0dmFyIGdyb3VwQ291bnQgPSAwO1xuXG5cdFx0Ly8gdGhpcyB3aWxsIGJlIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBub3JtYWxcblx0XHR2YXIgc2xvcGUgPSAoIHJhZGl1c0JvdHRvbSAtIHJhZGl1c1RvcCApIC8gaGVpZ2h0O1xuXG5cdFx0Ly8gZ2VuZXJhdGUgdmVydGljZXMsIG5vcm1hbHMgYW5kIHV2c1xuXG5cdFx0Zm9yICggeSA9IDA7IHkgPD0gaGVpZ2h0U2VnbWVudHM7IHkgKysgKSB7XG5cblx0XHRcdHZhciBpbmRleFJvdyA9IFtdO1xuXG5cdFx0XHR2YXIgdiA9IHkgLyBoZWlnaHRTZWdtZW50cztcblxuXHRcdFx0Ly8gY2FsY3VsYXRlIHRoZSByYWRpdXMgb2YgdGhlIGN1cnJlbnQgcm93XG5cblx0XHRcdHZhciByYWRpdXMgPSB2ICogKCByYWRpdXNCb3R0b20gLSByYWRpdXNUb3AgKSArIHJhZGl1c1RvcDtcblxuXHRcdFx0Zm9yICggeCA9IDA7IHggPD0gcmFkaWFsU2VnbWVudHM7IHggKysgKSB7XG5cblx0XHRcdFx0dmFyIHUgPSB4IC8gcmFkaWFsU2VnbWVudHM7XG5cblx0XHRcdFx0dmFyIHRoZXRhID0gdSAqIHRoZXRhTGVuZ3RoICsgdGhldGFTdGFydDtcblxuXHRcdFx0XHR2YXIgc2luVGhldGEgPSBNYXRoLnNpbiggdGhldGEgKTtcblx0XHRcdFx0dmFyIGNvc1RoZXRhID0gTWF0aC5jb3MoIHRoZXRhICk7XG5cblx0XHRcdFx0Ly8gdmVydGV4XG5cblx0XHRcdFx0dmVydGV4LnggPSByYWRpdXMgKiBzaW5UaGV0YTtcblx0XHRcdFx0dmVydGV4LnkgPSAtIHYgKiBoZWlnaHQgKyBoYWxmSGVpZ2h0O1xuXHRcdFx0XHR2ZXJ0ZXgueiA9IHJhZGl1cyAqIGNvc1RoZXRhO1xuXHRcdFx0XHR2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7XG5cblx0XHRcdFx0Ly8gbm9ybWFsXG5cblx0XHRcdFx0bm9ybWFsLnNldCggc2luVGhldGEsIHNsb3BlLCBjb3NUaGV0YSApLm5vcm1hbGl6ZSgpO1xuXHRcdFx0XHRub3JtYWxzLnB1c2goIG5vcm1hbC54LCBub3JtYWwueSwgbm9ybWFsLnogKTtcblxuXHRcdFx0XHQvLyB1dlxuXG5cdFx0XHRcdHV2cy5wdXNoKCB1LCAxIC0gdiApO1xuXG5cdFx0XHRcdC8vIHNhdmUgaW5kZXggb2YgdmVydGV4IGluIHJlc3BlY3RpdmUgcm93XG5cblx0XHRcdFx0aW5kZXhSb3cucHVzaCggaW5kZXggKysgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBub3cgc2F2ZSB2ZXJ0aWNlcyBvZiB0aGUgcm93IGluIG91ciBpbmRleCBhcnJheVxuXG5cdFx0XHRpbmRleEFycmF5LnB1c2goIGluZGV4Um93ICk7XG5cblx0XHR9XG5cblx0XHQvLyBnZW5lcmF0ZSBpbmRpY2VzXG5cblx0XHRmb3IgKCB4ID0gMDsgeCA8IHJhZGlhbFNlZ21lbnRzOyB4ICsrICkge1xuXG5cdFx0XHRmb3IgKCB5ID0gMDsgeSA8IGhlaWdodFNlZ21lbnRzOyB5ICsrICkge1xuXG5cdFx0XHRcdC8vIHdlIHVzZSB0aGUgaW5kZXggYXJyYXkgdG8gYWNjZXNzIHRoZSBjb3JyZWN0IGluZGljZXNcblxuXHRcdFx0XHR2YXIgYSA9IGluZGV4QXJyYXlbIHkgXVsgeCBdO1xuXHRcdFx0XHR2YXIgYiA9IGluZGV4QXJyYXlbIHkgKyAxIF1bIHggXTtcblx0XHRcdFx0dmFyIGMgPSBpbmRleEFycmF5WyB5ICsgMSBdWyB4ICsgMSBdO1xuXHRcdFx0XHR2YXIgZCA9IGluZGV4QXJyYXlbIHkgXVsgeCArIDEgXTtcblxuXHRcdFx0XHQvLyBmYWNlc1xuXG5cdFx0XHRcdGluZGljZXMucHVzaCggYSwgYiwgZCApO1xuXHRcdFx0XHRpbmRpY2VzLnB1c2goIGIsIGMsIGQgKTtcblxuXHRcdFx0XHQvLyB1cGRhdGUgZ3JvdXAgY291bnRlclxuXG5cdFx0XHRcdGdyb3VwQ291bnQgKz0gNjtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gYWRkIGEgZ3JvdXAgdG8gdGhlIGdlb21ldHJ5LiB0aGlzIHdpbGwgZW5zdXJlIG11bHRpIG1hdGVyaWFsIHN1cHBvcnRcblxuXHRcdHNjb3BlLmFkZEdyb3VwKCBncm91cFN0YXJ0LCBncm91cENvdW50LCAwICk7XG5cblx0XHQvLyBjYWxjdWxhdGUgbmV3IHN0YXJ0IHZhbHVlIGZvciBncm91cHNcblxuXHRcdGdyb3VwU3RhcnQgKz0gZ3JvdXBDb3VudDtcblxuXHR9XG5cblx0ZnVuY3Rpb24gZ2VuZXJhdGVDYXAoIHRvcCApIHtcblxuXHRcdHZhciB4LCBjZW50ZXJJbmRleFN0YXJ0LCBjZW50ZXJJbmRleEVuZDtcblxuXHRcdHZhciB1diA9IG5ldyBWZWN0b3IyKCk7XG5cdFx0dmFyIHZlcnRleCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR2YXIgZ3JvdXBDb3VudCA9IDA7XG5cblx0XHR2YXIgcmFkaXVzID0gKCB0b3AgPT09IHRydWUgKSA/IHJhZGl1c1RvcCA6IHJhZGl1c0JvdHRvbTtcblx0XHR2YXIgc2lnbiA9ICggdG9wID09PSB0cnVlICkgPyAxIDogLSAxO1xuXG5cdFx0Ly8gc2F2ZSB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGNlbnRlciB2ZXJ0ZXhcblx0XHRjZW50ZXJJbmRleFN0YXJ0ID0gaW5kZXg7XG5cblx0XHQvLyBmaXJzdCB3ZSBnZW5lcmF0ZSB0aGUgY2VudGVyIHZlcnRleCBkYXRhIG9mIHRoZSBjYXAuXG5cdFx0Ly8gYmVjYXVzZSB0aGUgZ2VvbWV0cnkgbmVlZHMgb25lIHNldCBvZiB1dnMgcGVyIGZhY2UsXG5cdFx0Ly8gd2UgbXVzdCBnZW5lcmF0ZSBhIGNlbnRlciB2ZXJ0ZXggcGVyIGZhY2Uvc2VnbWVudFxuXG5cdFx0Zm9yICggeCA9IDE7IHggPD0gcmFkaWFsU2VnbWVudHM7IHggKysgKSB7XG5cblx0XHRcdC8vIHZlcnRleFxuXG5cdFx0XHR2ZXJ0aWNlcy5wdXNoKCAwLCBoYWxmSGVpZ2h0ICogc2lnbiwgMCApO1xuXG5cdFx0XHQvLyBub3JtYWxcblxuXHRcdFx0bm9ybWFscy5wdXNoKCAwLCBzaWduLCAwICk7XG5cblx0XHRcdC8vIHV2XG5cblx0XHRcdHV2cy5wdXNoKCAwLjUsIDAuNSApO1xuXG5cdFx0XHQvLyBpbmNyZWFzZSBpbmRleFxuXG5cdFx0XHRpbmRleCArKztcblxuXHRcdH1cblxuXHRcdC8vIHNhdmUgdGhlIGluZGV4IG9mIHRoZSBsYXN0IGNlbnRlciB2ZXJ0ZXhcblxuXHRcdGNlbnRlckluZGV4RW5kID0gaW5kZXg7XG5cblx0XHQvLyBub3cgd2UgZ2VuZXJhdGUgdGhlIHN1cnJvdW5kaW5nIHZlcnRpY2VzLCBub3JtYWxzIGFuZCB1dnNcblxuXHRcdGZvciAoIHggPSAwOyB4IDw9IHJhZGlhbFNlZ21lbnRzOyB4ICsrICkge1xuXG5cdFx0XHR2YXIgdSA9IHggLyByYWRpYWxTZWdtZW50cztcblx0XHRcdHZhciB0aGV0YSA9IHUgKiB0aGV0YUxlbmd0aCArIHRoZXRhU3RhcnQ7XG5cblx0XHRcdHZhciBjb3NUaGV0YSA9IE1hdGguY29zKCB0aGV0YSApO1xuXHRcdFx0dmFyIHNpblRoZXRhID0gTWF0aC5zaW4oIHRoZXRhICk7XG5cblx0XHRcdC8vIHZlcnRleFxuXG5cdFx0XHR2ZXJ0ZXgueCA9IHJhZGl1cyAqIHNpblRoZXRhO1xuXHRcdFx0dmVydGV4LnkgPSBoYWxmSGVpZ2h0ICogc2lnbjtcblx0XHRcdHZlcnRleC56ID0gcmFkaXVzICogY29zVGhldGE7XG5cdFx0XHR2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7XG5cblx0XHRcdC8vIG5vcm1hbFxuXG5cdFx0XHRub3JtYWxzLnB1c2goIDAsIHNpZ24sIDAgKTtcblxuXHRcdFx0Ly8gdXZcblxuXHRcdFx0dXYueCA9ICggY29zVGhldGEgKiAwLjUgKSArIDAuNTtcblx0XHRcdHV2LnkgPSAoIHNpblRoZXRhICogMC41ICogc2lnbiApICsgMC41O1xuXHRcdFx0dXZzLnB1c2goIHV2LngsIHV2LnkgKTtcblxuXHRcdFx0Ly8gaW5jcmVhc2UgaW5kZXhcblxuXHRcdFx0aW5kZXggKys7XG5cblx0XHR9XG5cblx0XHQvLyBnZW5lcmF0ZSBpbmRpY2VzXG5cblx0XHRmb3IgKCB4ID0gMDsgeCA8IHJhZGlhbFNlZ21lbnRzOyB4ICsrICkge1xuXG5cdFx0XHR2YXIgYyA9IGNlbnRlckluZGV4U3RhcnQgKyB4O1xuXHRcdFx0dmFyIGkgPSBjZW50ZXJJbmRleEVuZCArIHg7XG5cblx0XHRcdGlmICggdG9wID09PSB0cnVlICkge1xuXG5cdFx0XHRcdC8vIGZhY2UgdG9wXG5cblx0XHRcdFx0aW5kaWNlcy5wdXNoKCBpLCBpICsgMSwgYyApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdC8vIGZhY2UgYm90dG9tXG5cblx0XHRcdFx0aW5kaWNlcy5wdXNoKCBpICsgMSwgaSwgYyApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGdyb3VwQ291bnQgKz0gMztcblxuXHRcdH1cblxuXHRcdC8vIGFkZCBhIGdyb3VwIHRvIHRoZSBnZW9tZXRyeS4gdGhpcyB3aWxsIGVuc3VyZSBtdWx0aSBtYXRlcmlhbCBzdXBwb3J0XG5cblx0XHRzY29wZS5hZGRHcm91cCggZ3JvdXBTdGFydCwgZ3JvdXBDb3VudCwgdG9wID09PSB0cnVlID8gMSA6IDIgKTtcblxuXHRcdC8vIGNhbGN1bGF0ZSBuZXcgc3RhcnQgdmFsdWUgZm9yIGdyb3Vwc1xuXG5cdFx0Z3JvdXBTdGFydCArPSBncm91cENvdW50O1xuXG5cdH1cblxufVxuXG5DeWxpbmRlckJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApO1xuQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDeWxpbmRlckJ1ZmZlckdlb21ldHJ5O1xuXG4vKipcbiAqIEBhdXRob3IgYWJlbG5hdGlvbiAvIGh0dHA6Ly9naXRodWIuY29tL2FiZWxuYXRpb25cbiAqL1xuXG4vLyBDb25lR2VvbWV0cnlcblxuZnVuY3Rpb24gQ29uZUdlb21ldHJ5KCByYWRpdXMsIGhlaWdodCwgcmFkaWFsU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCBvcGVuRW5kZWQsIHRoZXRhU3RhcnQsIHRoZXRhTGVuZ3RoICkge1xuXG5cdEN5bGluZGVyR2VvbWV0cnkuY2FsbCggdGhpcywgMCwgcmFkaXVzLCBoZWlnaHQsIHJhZGlhbFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgb3BlbkVuZGVkLCB0aGV0YVN0YXJ0LCB0aGV0YUxlbmd0aCApO1xuXG5cdHRoaXMudHlwZSA9ICdDb25lR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRyYWRpdXM6IHJhZGl1cyxcblx0XHRoZWlnaHQ6IGhlaWdodCxcblx0XHRyYWRpYWxTZWdtZW50czogcmFkaWFsU2VnbWVudHMsXG5cdFx0aGVpZ2h0U2VnbWVudHM6IGhlaWdodFNlZ21lbnRzLFxuXHRcdG9wZW5FbmRlZDogb3BlbkVuZGVkLFxuXHRcdHRoZXRhU3RhcnQ6IHRoZXRhU3RhcnQsXG5cdFx0dGhldGFMZW5ndGg6IHRoZXRhTGVuZ3RoXG5cdH07XG5cbn1cblxuQ29uZUdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEN5bGluZGVyR2VvbWV0cnkucHJvdG90eXBlICk7XG5Db25lR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ29uZUdlb21ldHJ5O1xuXG4vLyBDb25lQnVmZmVyR2VvbWV0cnlcblxuZnVuY3Rpb24gQ29uZUJ1ZmZlckdlb21ldHJ5KCByYWRpdXMsIGhlaWdodCwgcmFkaWFsU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCBvcGVuRW5kZWQsIHRoZXRhU3RhcnQsIHRoZXRhTGVuZ3RoICkge1xuXG5cdEN5bGluZGVyQnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcywgMCwgcmFkaXVzLCBoZWlnaHQsIHJhZGlhbFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgb3BlbkVuZGVkLCB0aGV0YVN0YXJ0LCB0aGV0YUxlbmd0aCApO1xuXG5cdHRoaXMudHlwZSA9ICdDb25lQnVmZmVyR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRyYWRpdXM6IHJhZGl1cyxcblx0XHRoZWlnaHQ6IGhlaWdodCxcblx0XHRyYWRpYWxTZWdtZW50czogcmFkaWFsU2VnbWVudHMsXG5cdFx0aGVpZ2h0U2VnbWVudHM6IGhlaWdodFNlZ21lbnRzLFxuXHRcdG9wZW5FbmRlZDogb3BlbkVuZGVkLFxuXHRcdHRoZXRhU3RhcnQ6IHRoZXRhU3RhcnQsXG5cdFx0dGhldGFMZW5ndGg6IHRoZXRhTGVuZ3RoXG5cdH07XG5cbn1cblxuQ29uZUJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEN5bGluZGVyQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7XG5Db25lQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ29uZUJ1ZmZlckdlb21ldHJ5O1xuXG4vKipcbiAqIEBhdXRob3IgYmVuYWFkYW1zIC8gaHR0cHM6Ly90d2l0dGVyLmNvbS9iZW5fYV9hZGFtc1xuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqIEBhdXRob3IgaHVnaGVzXG4gKi9cblxuLy8gQ2lyY2xlR2VvbWV0cnlcblxuZnVuY3Rpb24gQ2lyY2xlR2VvbWV0cnkoIHJhZGl1cywgc2VnbWVudHMsIHRoZXRhU3RhcnQsIHRoZXRhTGVuZ3RoICkge1xuXG5cdEdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnQ2lyY2xlR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRyYWRpdXM6IHJhZGl1cyxcblx0XHRzZWdtZW50czogc2VnbWVudHMsXG5cdFx0dGhldGFTdGFydDogdGhldGFTdGFydCxcblx0XHR0aGV0YUxlbmd0aDogdGhldGFMZW5ndGhcblx0fTtcblxuXHR0aGlzLmZyb21CdWZmZXJHZW9tZXRyeSggbmV3IENpcmNsZUJ1ZmZlckdlb21ldHJ5KCByYWRpdXMsIHNlZ21lbnRzLCB0aGV0YVN0YXJ0LCB0aGV0YUxlbmd0aCApICk7XG5cdHRoaXMubWVyZ2VWZXJ0aWNlcygpO1xuXG59XG5cbkNpcmNsZUdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEdlb21ldHJ5LnByb3RvdHlwZSApO1xuQ2lyY2xlR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ2lyY2xlR2VvbWV0cnk7XG5cbi8vIENpcmNsZUJ1ZmZlckdlb21ldHJ5XG5cbmZ1bmN0aW9uIENpcmNsZUJ1ZmZlckdlb21ldHJ5KCByYWRpdXMsIHNlZ21lbnRzLCB0aGV0YVN0YXJ0LCB0aGV0YUxlbmd0aCApIHtcblxuXHRCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0NpcmNsZUJ1ZmZlckdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0cmFkaXVzOiByYWRpdXMsXG5cdFx0c2VnbWVudHM6IHNlZ21lbnRzLFxuXHRcdHRoZXRhU3RhcnQ6IHRoZXRhU3RhcnQsXG5cdFx0dGhldGFMZW5ndGg6IHRoZXRhTGVuZ3RoXG5cdH07XG5cblx0cmFkaXVzID0gcmFkaXVzIHx8IDE7XG5cdHNlZ21lbnRzID0gc2VnbWVudHMgIT09IHVuZGVmaW5lZCA/IE1hdGgubWF4KCAzLCBzZWdtZW50cyApIDogODtcblxuXHR0aGV0YVN0YXJ0ID0gdGhldGFTdGFydCAhPT0gdW5kZWZpbmVkID8gdGhldGFTdGFydCA6IDA7XG5cdHRoZXRhTGVuZ3RoID0gdGhldGFMZW5ndGggIT09IHVuZGVmaW5lZCA/IHRoZXRhTGVuZ3RoIDogTWF0aC5QSSAqIDI7XG5cblx0Ly8gYnVmZmVyc1xuXG5cdHZhciBpbmRpY2VzID0gW107XG5cdHZhciB2ZXJ0aWNlcyA9IFtdO1xuXHR2YXIgbm9ybWFscyA9IFtdO1xuXHR2YXIgdXZzID0gW107XG5cblx0Ly8gaGVscGVyIHZhcmlhYmxlc1xuXG5cdHZhciBpLCBzO1xuXHR2YXIgdmVydGV4ID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIHV2ID0gbmV3IFZlY3RvcjIoKTtcblxuXHQvLyBjZW50ZXIgcG9pbnRcblxuXHR2ZXJ0aWNlcy5wdXNoKCAwLCAwLCAwICk7XG5cdG5vcm1hbHMucHVzaCggMCwgMCwgMSApO1xuXHR1dnMucHVzaCggMC41LCAwLjUgKTtcblxuXHRmb3IgKCBzID0gMCwgaSA9IDM7IHMgPD0gc2VnbWVudHM7IHMgKyssIGkgKz0gMyApIHtcblxuXHRcdHZhciBzZWdtZW50ID0gdGhldGFTdGFydCArIHMgLyBzZWdtZW50cyAqIHRoZXRhTGVuZ3RoO1xuXG5cdFx0Ly8gdmVydGV4XG5cblx0XHR2ZXJ0ZXgueCA9IHJhZGl1cyAqIE1hdGguY29zKCBzZWdtZW50ICk7XG5cdFx0dmVydGV4LnkgPSByYWRpdXMgKiBNYXRoLnNpbiggc2VnbWVudCApO1xuXG5cdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0Ly8gbm9ybWFsXG5cblx0XHRub3JtYWxzLnB1c2goIDAsIDAsIDEgKTtcblxuXHRcdC8vIHV2c1xuXG5cdFx0dXYueCA9ICggdmVydGljZXNbIGkgXSAvIHJhZGl1cyArIDEgKSAvIDI7XG5cdFx0dXYueSA9ICggdmVydGljZXNbIGkgKyAxIF0gLyByYWRpdXMgKyAxICkgLyAyO1xuXG5cdFx0dXZzLnB1c2goIHV2LngsIHV2LnkgKTtcblxuXHR9XG5cblx0Ly8gaW5kaWNlc1xuXG5cdGZvciAoIGkgPSAxOyBpIDw9IHNlZ21lbnRzOyBpICsrICkge1xuXG5cdFx0aW5kaWNlcy5wdXNoKCBpLCBpICsgMSwgMCApO1xuXG5cdH1cblxuXHQvLyBidWlsZCBnZW9tZXRyeVxuXG5cdHRoaXMuc2V0SW5kZXgoIGluZGljZXMgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIG5vcm1hbHMsIDMgKSApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2cywgMiApICk7XG5cbn1cblxuQ2lyY2xlQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7XG5DaXJjbGVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDaXJjbGVCdWZmZXJHZW9tZXRyeTtcblxuXG5cbnZhciBHZW9tZXRyaWVzID0gT2JqZWN0LmZyZWV6ZSh7XG5cdFdpcmVmcmFtZUdlb21ldHJ5OiBXaXJlZnJhbWVHZW9tZXRyeSxcblx0UGFyYW1ldHJpY0dlb21ldHJ5OiBQYXJhbWV0cmljR2VvbWV0cnksXG5cdFBhcmFtZXRyaWNCdWZmZXJHZW9tZXRyeTogUGFyYW1ldHJpY0J1ZmZlckdlb21ldHJ5LFxuXHRUZXRyYWhlZHJvbkdlb21ldHJ5OiBUZXRyYWhlZHJvbkdlb21ldHJ5LFxuXHRUZXRyYWhlZHJvbkJ1ZmZlckdlb21ldHJ5OiBUZXRyYWhlZHJvbkJ1ZmZlckdlb21ldHJ5LFxuXHRPY3RhaGVkcm9uR2VvbWV0cnk6IE9jdGFoZWRyb25HZW9tZXRyeSxcblx0T2N0YWhlZHJvbkJ1ZmZlckdlb21ldHJ5OiBPY3RhaGVkcm9uQnVmZmVyR2VvbWV0cnksXG5cdEljb3NhaGVkcm9uR2VvbWV0cnk6IEljb3NhaGVkcm9uR2VvbWV0cnksXG5cdEljb3NhaGVkcm9uQnVmZmVyR2VvbWV0cnk6IEljb3NhaGVkcm9uQnVmZmVyR2VvbWV0cnksXG5cdERvZGVjYWhlZHJvbkdlb21ldHJ5OiBEb2RlY2FoZWRyb25HZW9tZXRyeSxcblx0RG9kZWNhaGVkcm9uQnVmZmVyR2VvbWV0cnk6IERvZGVjYWhlZHJvbkJ1ZmZlckdlb21ldHJ5LFxuXHRQb2x5aGVkcm9uR2VvbWV0cnk6IFBvbHloZWRyb25HZW9tZXRyeSxcblx0UG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5OiBQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnksXG5cdFR1YmVHZW9tZXRyeTogVHViZUdlb21ldHJ5LFxuXHRUdWJlQnVmZmVyR2VvbWV0cnk6IFR1YmVCdWZmZXJHZW9tZXRyeSxcblx0VG9ydXNLbm90R2VvbWV0cnk6IFRvcnVzS25vdEdlb21ldHJ5LFxuXHRUb3J1c0tub3RCdWZmZXJHZW9tZXRyeTogVG9ydXNLbm90QnVmZmVyR2VvbWV0cnksXG5cdFRvcnVzR2VvbWV0cnk6IFRvcnVzR2VvbWV0cnksXG5cdFRvcnVzQnVmZmVyR2VvbWV0cnk6IFRvcnVzQnVmZmVyR2VvbWV0cnksXG5cdFRleHRHZW9tZXRyeTogVGV4dEdlb21ldHJ5LFxuXHRUZXh0QnVmZmVyR2VvbWV0cnk6IFRleHRCdWZmZXJHZW9tZXRyeSxcblx0U3BoZXJlR2VvbWV0cnk6IFNwaGVyZUdlb21ldHJ5LFxuXHRTcGhlcmVCdWZmZXJHZW9tZXRyeTogU3BoZXJlQnVmZmVyR2VvbWV0cnksXG5cdFJpbmdHZW9tZXRyeTogUmluZ0dlb21ldHJ5LFxuXHRSaW5nQnVmZmVyR2VvbWV0cnk6IFJpbmdCdWZmZXJHZW9tZXRyeSxcblx0UGxhbmVHZW9tZXRyeTogUGxhbmVHZW9tZXRyeSxcblx0UGxhbmVCdWZmZXJHZW9tZXRyeTogUGxhbmVCdWZmZXJHZW9tZXRyeSxcblx0TGF0aGVHZW9tZXRyeTogTGF0aGVHZW9tZXRyeSxcblx0TGF0aGVCdWZmZXJHZW9tZXRyeTogTGF0aGVCdWZmZXJHZW9tZXRyeSxcblx0U2hhcGVHZW9tZXRyeTogU2hhcGVHZW9tZXRyeSxcblx0U2hhcGVCdWZmZXJHZW9tZXRyeTogU2hhcGVCdWZmZXJHZW9tZXRyeSxcblx0RXh0cnVkZUdlb21ldHJ5OiBFeHRydWRlR2VvbWV0cnksXG5cdEV4dHJ1ZGVCdWZmZXJHZW9tZXRyeTogRXh0cnVkZUJ1ZmZlckdlb21ldHJ5LFxuXHRFZGdlc0dlb21ldHJ5OiBFZGdlc0dlb21ldHJ5LFxuXHRDb25lR2VvbWV0cnk6IENvbmVHZW9tZXRyeSxcblx0Q29uZUJ1ZmZlckdlb21ldHJ5OiBDb25lQnVmZmVyR2VvbWV0cnksXG5cdEN5bGluZGVyR2VvbWV0cnk6IEN5bGluZGVyR2VvbWV0cnksXG5cdEN5bGluZGVyQnVmZmVyR2VvbWV0cnk6IEN5bGluZGVyQnVmZmVyR2VvbWV0cnksXG5cdENpcmNsZUdlb21ldHJ5OiBDaXJjbGVHZW9tZXRyeSxcblx0Q2lyY2xlQnVmZmVyR2VvbWV0cnk6IENpcmNsZUJ1ZmZlckdlb21ldHJ5LFxuXHRCb3hHZW9tZXRyeTogQm94R2VvbWV0cnksXG5cdEJveEJ1ZmZlckdlb21ldHJ5OiBCb3hCdWZmZXJHZW9tZXRyeVxufSk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqXG4gKiBwYXJhbWV0ZXJzID0ge1xuICogIGNvbG9yOiA8VEhSRUUuQ29sb3I+XG4gKiB9XG4gKi9cblxuZnVuY3Rpb24gU2hhZG93TWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7XG5cblx0TWF0ZXJpYWwuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdTaGFkb3dNYXRlcmlhbCc7XG5cblx0dGhpcy5jb2xvciA9IG5ldyBDb2xvciggMHgwMDAwMDAgKTtcblx0dGhpcy50cmFuc3BhcmVudCA9IHRydWU7XG5cblx0dGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTtcblxufVxuXG5TaGFkb3dNYXRlcmlhbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBNYXRlcmlhbC5wcm90b3R5cGUgKTtcblNoYWRvd01hdGVyaWFsLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFNoYWRvd01hdGVyaWFsO1xuXG5TaGFkb3dNYXRlcmlhbC5wcm90b3R5cGUuaXNTaGFkb3dNYXRlcmlhbCA9IHRydWU7XG5cblNoYWRvd01hdGVyaWFsLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0TWF0ZXJpYWwucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0dGhpcy5jb2xvci5jb3B5KCBzb3VyY2UuY29sb3IgKTtcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIFJhd1NoYWRlck1hdGVyaWFsKCBwYXJhbWV0ZXJzICkge1xuXG5cdFNoYWRlck1hdGVyaWFsLmNhbGwoIHRoaXMsIHBhcmFtZXRlcnMgKTtcblxuXHR0aGlzLnR5cGUgPSAnUmF3U2hhZGVyTWF0ZXJpYWwnO1xuXG59XG5cblJhd1NoYWRlck1hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIFNoYWRlck1hdGVyaWFsLnByb3RvdHlwZSApO1xuUmF3U2hhZGVyTWF0ZXJpYWwucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUmF3U2hhZGVyTWF0ZXJpYWw7XG5cblJhd1NoYWRlck1hdGVyaWFsLnByb3RvdHlwZS5pc1Jhd1NoYWRlck1hdGVyaWFsID0gdHJ1ZTtcblxuLyoqXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqXG4gKiBwYXJhbWV0ZXJzID0ge1xuICogIGNvbG9yOiA8aGV4PixcbiAqICByb3VnaG5lc3M6IDxmbG9hdD4sXG4gKiAgbWV0YWxuZXNzOiA8ZmxvYXQ+LFxuICogIG9wYWNpdHk6IDxmbG9hdD4sXG4gKlxuICogIG1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgbGlnaHRNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKiAgbGlnaHRNYXBJbnRlbnNpdHk6IDxmbG9hdD5cbiAqXG4gKiAgYW9NYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKiAgYW9NYXBJbnRlbnNpdHk6IDxmbG9hdD5cbiAqXG4gKiAgZW1pc3NpdmU6IDxoZXg+LFxuICogIGVtaXNzaXZlSW50ZW5zaXR5OiA8ZmxvYXQ+XG4gKiAgZW1pc3NpdmVNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIGJ1bXBNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKiAgYnVtcFNjYWxlOiA8ZmxvYXQ+LFxuICpcbiAqICBub3JtYWxNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKiAgbm9ybWFsU2NhbGU6IDxWZWN0b3IyPixcbiAqXG4gKiAgZGlzcGxhY2VtZW50TWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGRpc3BsYWNlbWVudFNjYWxlOiA8ZmxvYXQ+LFxuICogIGRpc3BsYWNlbWVudEJpYXM6IDxmbG9hdD4sXG4gKlxuICogIHJvdWdobmVzc01hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgbWV0YWxuZXNzTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBhbHBoYU1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgZW52TWFwOiBuZXcgVEhSRUUuQ3ViZVRleHR1cmUoIFtwb3N4LCBuZWd4LCBwb3N5LCBuZWd5LCBwb3N6LCBuZWd6XSApLFxuICogIGVudk1hcEludGVuc2l0eTogPGZsb2F0PlxuICpcbiAqICByZWZyYWN0aW9uUmF0aW86IDxmbG9hdD4sXG4gKlxuICogIHdpcmVmcmFtZTogPGJvb2xlYW4+LFxuICogIHdpcmVmcmFtZUxpbmV3aWR0aDogPGZsb2F0PixcbiAqXG4gKiAgc2tpbm5pbmc6IDxib29sPixcbiAqICBtb3JwaFRhcmdldHM6IDxib29sPixcbiAqICBtb3JwaE5vcm1hbHM6IDxib29sPlxuICogfVxuICovXG5cbmZ1bmN0aW9uIE1lc2hTdGFuZGFyZE1hdGVyaWFsKCBwYXJhbWV0ZXJzICkge1xuXG5cdE1hdGVyaWFsLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLmRlZmluZXMgPSB7ICdTVEFOREFSRCc6ICcnIH07XG5cblx0dGhpcy50eXBlID0gJ01lc2hTdGFuZGFyZE1hdGVyaWFsJztcblxuXHR0aGlzLmNvbG9yID0gbmV3IENvbG9yKCAweGZmZmZmZiApOyAvLyBkaWZmdXNlXG5cdHRoaXMucm91Z2huZXNzID0gMC41O1xuXHR0aGlzLm1ldGFsbmVzcyA9IDAuNTtcblxuXHR0aGlzLm1hcCA9IG51bGw7XG5cblx0dGhpcy5saWdodE1hcCA9IG51bGw7XG5cdHRoaXMubGlnaHRNYXBJbnRlbnNpdHkgPSAxLjA7XG5cblx0dGhpcy5hb01hcCA9IG51bGw7XG5cdHRoaXMuYW9NYXBJbnRlbnNpdHkgPSAxLjA7XG5cblx0dGhpcy5lbWlzc2l2ZSA9IG5ldyBDb2xvciggMHgwMDAwMDAgKTtcblx0dGhpcy5lbWlzc2l2ZUludGVuc2l0eSA9IDEuMDtcblx0dGhpcy5lbWlzc2l2ZU1hcCA9IG51bGw7XG5cblx0dGhpcy5idW1wTWFwID0gbnVsbDtcblx0dGhpcy5idW1wU2NhbGUgPSAxO1xuXG5cdHRoaXMubm9ybWFsTWFwID0gbnVsbDtcblx0dGhpcy5ub3JtYWxTY2FsZSA9IG5ldyBWZWN0b3IyKCAxLCAxICk7XG5cblx0dGhpcy5kaXNwbGFjZW1lbnRNYXAgPSBudWxsO1xuXHR0aGlzLmRpc3BsYWNlbWVudFNjYWxlID0gMTtcblx0dGhpcy5kaXNwbGFjZW1lbnRCaWFzID0gMDtcblxuXHR0aGlzLnJvdWdobmVzc01hcCA9IG51bGw7XG5cblx0dGhpcy5tZXRhbG5lc3NNYXAgPSBudWxsO1xuXG5cdHRoaXMuYWxwaGFNYXAgPSBudWxsO1xuXG5cdHRoaXMuZW52TWFwID0gbnVsbDtcblx0dGhpcy5lbnZNYXBJbnRlbnNpdHkgPSAxLjA7XG5cblx0dGhpcy5yZWZyYWN0aW9uUmF0aW8gPSAwLjk4O1xuXG5cdHRoaXMud2lyZWZyYW1lID0gZmFsc2U7XG5cdHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gMTtcblx0dGhpcy53aXJlZnJhbWVMaW5lY2FwID0gJ3JvdW5kJztcblx0dGhpcy53aXJlZnJhbWVMaW5lam9pbiA9ICdyb3VuZCc7XG5cblx0dGhpcy5za2lubmluZyA9IGZhbHNlO1xuXHR0aGlzLm1vcnBoVGFyZ2V0cyA9IGZhbHNlO1xuXHR0aGlzLm1vcnBoTm9ybWFscyA9IGZhbHNlO1xuXG5cdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XG5cbn1cblxuTWVzaFN0YW5kYXJkTWF0ZXJpYWwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTWF0ZXJpYWwucHJvdG90eXBlICk7XG5NZXNoU3RhbmRhcmRNYXRlcmlhbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNZXNoU3RhbmRhcmRNYXRlcmlhbDtcblxuTWVzaFN0YW5kYXJkTWF0ZXJpYWwucHJvdG90eXBlLmlzTWVzaFN0YW5kYXJkTWF0ZXJpYWwgPSB0cnVlO1xuXG5NZXNoU3RhbmRhcmRNYXRlcmlhbC5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMuZGVmaW5lcyA9IHsgJ1NUQU5EQVJEJzogJycgfTtcblxuXHR0aGlzLmNvbG9yLmNvcHkoIHNvdXJjZS5jb2xvciApO1xuXHR0aGlzLnJvdWdobmVzcyA9IHNvdXJjZS5yb3VnaG5lc3M7XG5cdHRoaXMubWV0YWxuZXNzID0gc291cmNlLm1ldGFsbmVzcztcblxuXHR0aGlzLm1hcCA9IHNvdXJjZS5tYXA7XG5cblx0dGhpcy5saWdodE1hcCA9IHNvdXJjZS5saWdodE1hcDtcblx0dGhpcy5saWdodE1hcEludGVuc2l0eSA9IHNvdXJjZS5saWdodE1hcEludGVuc2l0eTtcblxuXHR0aGlzLmFvTWFwID0gc291cmNlLmFvTWFwO1xuXHR0aGlzLmFvTWFwSW50ZW5zaXR5ID0gc291cmNlLmFvTWFwSW50ZW5zaXR5O1xuXG5cdHRoaXMuZW1pc3NpdmUuY29weSggc291cmNlLmVtaXNzaXZlICk7XG5cdHRoaXMuZW1pc3NpdmVNYXAgPSBzb3VyY2UuZW1pc3NpdmVNYXA7XG5cdHRoaXMuZW1pc3NpdmVJbnRlbnNpdHkgPSBzb3VyY2UuZW1pc3NpdmVJbnRlbnNpdHk7XG5cblx0dGhpcy5idW1wTWFwID0gc291cmNlLmJ1bXBNYXA7XG5cdHRoaXMuYnVtcFNjYWxlID0gc291cmNlLmJ1bXBTY2FsZTtcblxuXHR0aGlzLm5vcm1hbE1hcCA9IHNvdXJjZS5ub3JtYWxNYXA7XG5cdHRoaXMubm9ybWFsU2NhbGUuY29weSggc291cmNlLm5vcm1hbFNjYWxlICk7XG5cblx0dGhpcy5kaXNwbGFjZW1lbnRNYXAgPSBzb3VyY2UuZGlzcGxhY2VtZW50TWFwO1xuXHR0aGlzLmRpc3BsYWNlbWVudFNjYWxlID0gc291cmNlLmRpc3BsYWNlbWVudFNjYWxlO1xuXHR0aGlzLmRpc3BsYWNlbWVudEJpYXMgPSBzb3VyY2UuZGlzcGxhY2VtZW50QmlhcztcblxuXHR0aGlzLnJvdWdobmVzc01hcCA9IHNvdXJjZS5yb3VnaG5lc3NNYXA7XG5cblx0dGhpcy5tZXRhbG5lc3NNYXAgPSBzb3VyY2UubWV0YWxuZXNzTWFwO1xuXG5cdHRoaXMuYWxwaGFNYXAgPSBzb3VyY2UuYWxwaGFNYXA7XG5cblx0dGhpcy5lbnZNYXAgPSBzb3VyY2UuZW52TWFwO1xuXHR0aGlzLmVudk1hcEludGVuc2l0eSA9IHNvdXJjZS5lbnZNYXBJbnRlbnNpdHk7XG5cblx0dGhpcy5yZWZyYWN0aW9uUmF0aW8gPSBzb3VyY2UucmVmcmFjdGlvblJhdGlvO1xuXG5cdHRoaXMud2lyZWZyYW1lID0gc291cmNlLndpcmVmcmFtZTtcblx0dGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSBzb3VyY2Uud2lyZWZyYW1lTGluZXdpZHRoO1xuXHR0aGlzLndpcmVmcmFtZUxpbmVjYXAgPSBzb3VyY2Uud2lyZWZyYW1lTGluZWNhcDtcblx0dGhpcy53aXJlZnJhbWVMaW5lam9pbiA9IHNvdXJjZS53aXJlZnJhbWVMaW5lam9pbjtcblxuXHR0aGlzLnNraW5uaW5nID0gc291cmNlLnNraW5uaW5nO1xuXHR0aGlzLm1vcnBoVGFyZ2V0cyA9IHNvdXJjZS5tb3JwaFRhcmdldHM7XG5cdHRoaXMubW9ycGhOb3JtYWxzID0gc291cmNlLm1vcnBoTm9ybWFscztcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqXG4gKiBwYXJhbWV0ZXJzID0ge1xuICogIHJlZmxlY3Rpdml0eTogPGZsb2F0PlxuICogfVxuICovXG5cbmZ1bmN0aW9uIE1lc2hQaHlzaWNhbE1hdGVyaWFsKCBwYXJhbWV0ZXJzICkge1xuXG5cdE1lc2hTdGFuZGFyZE1hdGVyaWFsLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLmRlZmluZXMgPSB7ICdQSFlTSUNBTCc6ICcnIH07XG5cblx0dGhpcy50eXBlID0gJ01lc2hQaHlzaWNhbE1hdGVyaWFsJztcblxuXHR0aGlzLnJlZmxlY3Rpdml0eSA9IDAuNTsgLy8gbWFwcyB0byBGMCA9IDAuMDRcblxuXHR0aGlzLmNsZWFyQ29hdCA9IDAuMDtcblx0dGhpcy5jbGVhckNvYXRSb3VnaG5lc3MgPSAwLjA7XG5cblx0dGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTtcblxufVxuXG5NZXNoUGh5c2ljYWxNYXRlcmlhbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBNZXNoU3RhbmRhcmRNYXRlcmlhbC5wcm90b3R5cGUgKTtcbk1lc2hQaHlzaWNhbE1hdGVyaWFsLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE1lc2hQaHlzaWNhbE1hdGVyaWFsO1xuXG5NZXNoUGh5c2ljYWxNYXRlcmlhbC5wcm90b3R5cGUuaXNNZXNoUGh5c2ljYWxNYXRlcmlhbCA9IHRydWU7XG5cbk1lc2hQaHlzaWNhbE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0TWVzaFN0YW5kYXJkTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0dGhpcy5kZWZpbmVzID0geyAnUEhZU0lDQUwnOiAnJyB9O1xuXG5cdHRoaXMucmVmbGVjdGl2aXR5ID0gc291cmNlLnJlZmxlY3Rpdml0eTtcblxuXHR0aGlzLmNsZWFyQ29hdCA9IHNvdXJjZS5jbGVhckNvYXQ7XG5cdHRoaXMuY2xlYXJDb2F0Um91Z2huZXNzID0gc291cmNlLmNsZWFyQ29hdFJvdWdobmVzcztcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqXG4gKiBwYXJhbWV0ZXJzID0ge1xuICogIGNvbG9yOiA8aGV4PixcbiAqICBzcGVjdWxhcjogPGhleD4sXG4gKiAgc2hpbmluZXNzOiA8ZmxvYXQ+LFxuICogIG9wYWNpdHk6IDxmbG9hdD4sXG4gKlxuICogIG1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgbGlnaHRNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKiAgbGlnaHRNYXBJbnRlbnNpdHk6IDxmbG9hdD5cbiAqXG4gKiAgYW9NYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKiAgYW9NYXBJbnRlbnNpdHk6IDxmbG9hdD5cbiAqXG4gKiAgZW1pc3NpdmU6IDxoZXg+LFxuICogIGVtaXNzaXZlSW50ZW5zaXR5OiA8ZmxvYXQ+XG4gKiAgZW1pc3NpdmVNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIGJ1bXBNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKiAgYnVtcFNjYWxlOiA8ZmxvYXQ+LFxuICpcbiAqICBub3JtYWxNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKiAgbm9ybWFsU2NhbGU6IDxWZWN0b3IyPixcbiAqXG4gKiAgZGlzcGxhY2VtZW50TWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGRpc3BsYWNlbWVudFNjYWxlOiA8ZmxvYXQ+LFxuICogIGRpc3BsYWNlbWVudEJpYXM6IDxmbG9hdD4sXG4gKlxuICogIHNwZWN1bGFyTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBhbHBoYU1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgZW52TWFwOiBuZXcgVEhSRUUuQ3ViZVRleHR1cmUoIFtwb3N4LCBuZWd4LCBwb3N5LCBuZWd5LCBwb3N6LCBuZWd6XSApLFxuICogIGNvbWJpbmU6IFRIUkVFLk11bHRpcGx5LFxuICogIHJlZmxlY3Rpdml0eTogPGZsb2F0PixcbiAqICByZWZyYWN0aW9uUmF0aW86IDxmbG9hdD4sXG4gKlxuICogIHdpcmVmcmFtZTogPGJvb2xlYW4+LFxuICogIHdpcmVmcmFtZUxpbmV3aWR0aDogPGZsb2F0PixcbiAqXG4gKiAgc2tpbm5pbmc6IDxib29sPixcbiAqICBtb3JwaFRhcmdldHM6IDxib29sPixcbiAqICBtb3JwaE5vcm1hbHM6IDxib29sPlxuICogfVxuICovXG5cbmZ1bmN0aW9uIE1lc2hQaG9uZ01hdGVyaWFsKCBwYXJhbWV0ZXJzICkge1xuXG5cdE1hdGVyaWFsLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnTWVzaFBob25nTWF0ZXJpYWwnO1xuXG5cdHRoaXMuY29sb3IgPSBuZXcgQ29sb3IoIDB4ZmZmZmZmICk7IC8vIGRpZmZ1c2Vcblx0dGhpcy5zcGVjdWxhciA9IG5ldyBDb2xvciggMHgxMTExMTEgKTtcblx0dGhpcy5zaGluaW5lc3MgPSAzMDtcblxuXHR0aGlzLm1hcCA9IG51bGw7XG5cblx0dGhpcy5saWdodE1hcCA9IG51bGw7XG5cdHRoaXMubGlnaHRNYXBJbnRlbnNpdHkgPSAxLjA7XG5cblx0dGhpcy5hb01hcCA9IG51bGw7XG5cdHRoaXMuYW9NYXBJbnRlbnNpdHkgPSAxLjA7XG5cblx0dGhpcy5lbWlzc2l2ZSA9IG5ldyBDb2xvciggMHgwMDAwMDAgKTtcblx0dGhpcy5lbWlzc2l2ZUludGVuc2l0eSA9IDEuMDtcblx0dGhpcy5lbWlzc2l2ZU1hcCA9IG51bGw7XG5cblx0dGhpcy5idW1wTWFwID0gbnVsbDtcblx0dGhpcy5idW1wU2NhbGUgPSAxO1xuXG5cdHRoaXMubm9ybWFsTWFwID0gbnVsbDtcblx0dGhpcy5ub3JtYWxTY2FsZSA9IG5ldyBWZWN0b3IyKCAxLCAxICk7XG5cblx0dGhpcy5kaXNwbGFjZW1lbnRNYXAgPSBudWxsO1xuXHR0aGlzLmRpc3BsYWNlbWVudFNjYWxlID0gMTtcblx0dGhpcy5kaXNwbGFjZW1lbnRCaWFzID0gMDtcblxuXHR0aGlzLnNwZWN1bGFyTWFwID0gbnVsbDtcblxuXHR0aGlzLmFscGhhTWFwID0gbnVsbDtcblxuXHR0aGlzLmVudk1hcCA9IG51bGw7XG5cdHRoaXMuY29tYmluZSA9IE11bHRpcGx5T3BlcmF0aW9uO1xuXHR0aGlzLnJlZmxlY3Rpdml0eSA9IDE7XG5cdHRoaXMucmVmcmFjdGlvblJhdGlvID0gMC45ODtcblxuXHR0aGlzLndpcmVmcmFtZSA9IGZhbHNlO1xuXHR0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IDE7XG5cdHRoaXMud2lyZWZyYW1lTGluZWNhcCA9ICdyb3VuZCc7XG5cdHRoaXMud2lyZWZyYW1lTGluZWpvaW4gPSAncm91bmQnO1xuXG5cdHRoaXMuc2tpbm5pbmcgPSBmYWxzZTtcblx0dGhpcy5tb3JwaFRhcmdldHMgPSBmYWxzZTtcblx0dGhpcy5tb3JwaE5vcm1hbHMgPSBmYWxzZTtcblxuXHR0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApO1xuXG59XG5cbk1lc2hQaG9uZ01hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE1hdGVyaWFsLnByb3RvdHlwZSApO1xuTWVzaFBob25nTWF0ZXJpYWwucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTWVzaFBob25nTWF0ZXJpYWw7XG5cbk1lc2hQaG9uZ01hdGVyaWFsLnByb3RvdHlwZS5pc01lc2hQaG9uZ01hdGVyaWFsID0gdHJ1ZTtcblxuTWVzaFBob25nTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRNYXRlcmlhbC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHR0aGlzLmNvbG9yLmNvcHkoIHNvdXJjZS5jb2xvciApO1xuXHR0aGlzLnNwZWN1bGFyLmNvcHkoIHNvdXJjZS5zcGVjdWxhciApO1xuXHR0aGlzLnNoaW5pbmVzcyA9IHNvdXJjZS5zaGluaW5lc3M7XG5cblx0dGhpcy5tYXAgPSBzb3VyY2UubWFwO1xuXG5cdHRoaXMubGlnaHRNYXAgPSBzb3VyY2UubGlnaHRNYXA7XG5cdHRoaXMubGlnaHRNYXBJbnRlbnNpdHkgPSBzb3VyY2UubGlnaHRNYXBJbnRlbnNpdHk7XG5cblx0dGhpcy5hb01hcCA9IHNvdXJjZS5hb01hcDtcblx0dGhpcy5hb01hcEludGVuc2l0eSA9IHNvdXJjZS5hb01hcEludGVuc2l0eTtcblxuXHR0aGlzLmVtaXNzaXZlLmNvcHkoIHNvdXJjZS5lbWlzc2l2ZSApO1xuXHR0aGlzLmVtaXNzaXZlTWFwID0gc291cmNlLmVtaXNzaXZlTWFwO1xuXHR0aGlzLmVtaXNzaXZlSW50ZW5zaXR5ID0gc291cmNlLmVtaXNzaXZlSW50ZW5zaXR5O1xuXG5cdHRoaXMuYnVtcE1hcCA9IHNvdXJjZS5idW1wTWFwO1xuXHR0aGlzLmJ1bXBTY2FsZSA9IHNvdXJjZS5idW1wU2NhbGU7XG5cblx0dGhpcy5ub3JtYWxNYXAgPSBzb3VyY2Uubm9ybWFsTWFwO1xuXHR0aGlzLm5vcm1hbFNjYWxlLmNvcHkoIHNvdXJjZS5ub3JtYWxTY2FsZSApO1xuXG5cdHRoaXMuZGlzcGxhY2VtZW50TWFwID0gc291cmNlLmRpc3BsYWNlbWVudE1hcDtcblx0dGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IHNvdXJjZS5kaXNwbGFjZW1lbnRTY2FsZTtcblx0dGhpcy5kaXNwbGFjZW1lbnRCaWFzID0gc291cmNlLmRpc3BsYWNlbWVudEJpYXM7XG5cblx0dGhpcy5zcGVjdWxhck1hcCA9IHNvdXJjZS5zcGVjdWxhck1hcDtcblxuXHR0aGlzLmFscGhhTWFwID0gc291cmNlLmFscGhhTWFwO1xuXG5cdHRoaXMuZW52TWFwID0gc291cmNlLmVudk1hcDtcblx0dGhpcy5jb21iaW5lID0gc291cmNlLmNvbWJpbmU7XG5cdHRoaXMucmVmbGVjdGl2aXR5ID0gc291cmNlLnJlZmxlY3Rpdml0eTtcblx0dGhpcy5yZWZyYWN0aW9uUmF0aW8gPSBzb3VyY2UucmVmcmFjdGlvblJhdGlvO1xuXG5cdHRoaXMud2lyZWZyYW1lID0gc291cmNlLndpcmVmcmFtZTtcblx0dGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSBzb3VyY2Uud2lyZWZyYW1lTGluZXdpZHRoO1xuXHR0aGlzLndpcmVmcmFtZUxpbmVjYXAgPSBzb3VyY2Uud2lyZWZyYW1lTGluZWNhcDtcblx0dGhpcy53aXJlZnJhbWVMaW5lam9pbiA9IHNvdXJjZS53aXJlZnJhbWVMaW5lam9pbjtcblxuXHR0aGlzLnNraW5uaW5nID0gc291cmNlLnNraW5uaW5nO1xuXHR0aGlzLm1vcnBoVGFyZ2V0cyA9IHNvdXJjZS5tb3JwaFRhcmdldHM7XG5cdHRoaXMubW9ycGhOb3JtYWxzID0gc291cmNlLm1vcnBoTm9ybWFscztcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIHRha2FoaXJveCAvIGh0dHA6Ly9naXRodWIuY29tL3Rha2FoaXJveFxuICpcbiAqIHBhcmFtZXRlcnMgPSB7XG4gKiAgZ3JhZGllbnRNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+IClcbiAqIH1cbiAqL1xuXG5mdW5jdGlvbiBNZXNoVG9vbk1hdGVyaWFsKCBwYXJhbWV0ZXJzICkge1xuXG5cdE1lc2hQaG9uZ01hdGVyaWFsLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLmRlZmluZXMgPSB7ICdUT09OJzogJycgfTtcblxuXHR0aGlzLnR5cGUgPSAnTWVzaFRvb25NYXRlcmlhbCc7XG5cblx0dGhpcy5ncmFkaWVudE1hcCA9IG51bGw7XG5cblx0dGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTtcblxufVxuXG5NZXNoVG9vbk1hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE1lc2hQaG9uZ01hdGVyaWFsLnByb3RvdHlwZSApO1xuTWVzaFRvb25NYXRlcmlhbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNZXNoVG9vbk1hdGVyaWFsO1xuXG5NZXNoVG9vbk1hdGVyaWFsLnByb3RvdHlwZS5pc01lc2hUb29uTWF0ZXJpYWwgPSB0cnVlO1xuXG5NZXNoVG9vbk1hdGVyaWFsLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0TWVzaFBob25nTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0dGhpcy5ncmFkaWVudE1hcCA9IHNvdXJjZS5ncmFkaWVudE1hcDtcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKlxuICogcGFyYW1ldGVycyA9IHtcbiAqICBvcGFjaXR5OiA8ZmxvYXQ+LFxuICpcbiAqICBidW1wTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGJ1bXBTY2FsZTogPGZsb2F0PixcbiAqXG4gKiAgbm9ybWFsTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIG5vcm1hbFNjYWxlOiA8VmVjdG9yMj4sXG4gKlxuICogIGRpc3BsYWNlbWVudE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBkaXNwbGFjZW1lbnRTY2FsZTogPGZsb2F0PixcbiAqICBkaXNwbGFjZW1lbnRCaWFzOiA8ZmxvYXQ+LFxuICpcbiAqICB3aXJlZnJhbWU6IDxib29sZWFuPixcbiAqICB3aXJlZnJhbWVMaW5ld2lkdGg6IDxmbG9hdD5cbiAqXG4gKiAgc2tpbm5pbmc6IDxib29sPixcbiAqICBtb3JwaFRhcmdldHM6IDxib29sPixcbiAqICBtb3JwaE5vcm1hbHM6IDxib29sPlxuICogfVxuICovXG5cbmZ1bmN0aW9uIE1lc2hOb3JtYWxNYXRlcmlhbCggcGFyYW1ldGVycyApIHtcblxuXHRNYXRlcmlhbC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ01lc2hOb3JtYWxNYXRlcmlhbCc7XG5cblx0dGhpcy5idW1wTWFwID0gbnVsbDtcblx0dGhpcy5idW1wU2NhbGUgPSAxO1xuXG5cdHRoaXMubm9ybWFsTWFwID0gbnVsbDtcblx0dGhpcy5ub3JtYWxTY2FsZSA9IG5ldyBWZWN0b3IyKCAxLCAxICk7XG5cblx0dGhpcy5kaXNwbGFjZW1lbnRNYXAgPSBudWxsO1xuXHR0aGlzLmRpc3BsYWNlbWVudFNjYWxlID0gMTtcblx0dGhpcy5kaXNwbGFjZW1lbnRCaWFzID0gMDtcblxuXHR0aGlzLndpcmVmcmFtZSA9IGZhbHNlO1xuXHR0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IDE7XG5cblx0dGhpcy5mb2cgPSBmYWxzZTtcblx0dGhpcy5saWdodHMgPSBmYWxzZTtcblxuXHR0aGlzLnNraW5uaW5nID0gZmFsc2U7XG5cdHRoaXMubW9ycGhUYXJnZXRzID0gZmFsc2U7XG5cdHRoaXMubW9ycGhOb3JtYWxzID0gZmFsc2U7XG5cblx0dGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTtcblxufVxuXG5NZXNoTm9ybWFsTWF0ZXJpYWwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTWF0ZXJpYWwucHJvdG90eXBlICk7XG5NZXNoTm9ybWFsTWF0ZXJpYWwucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTWVzaE5vcm1hbE1hdGVyaWFsO1xuXG5NZXNoTm9ybWFsTWF0ZXJpYWwucHJvdG90eXBlLmlzTWVzaE5vcm1hbE1hdGVyaWFsID0gdHJ1ZTtcblxuTWVzaE5vcm1hbE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0TWF0ZXJpYWwucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0dGhpcy5idW1wTWFwID0gc291cmNlLmJ1bXBNYXA7XG5cdHRoaXMuYnVtcFNjYWxlID0gc291cmNlLmJ1bXBTY2FsZTtcblxuXHR0aGlzLm5vcm1hbE1hcCA9IHNvdXJjZS5ub3JtYWxNYXA7XG5cdHRoaXMubm9ybWFsU2NhbGUuY29weSggc291cmNlLm5vcm1hbFNjYWxlICk7XG5cblx0dGhpcy5kaXNwbGFjZW1lbnRNYXAgPSBzb3VyY2UuZGlzcGxhY2VtZW50TWFwO1xuXHR0aGlzLmRpc3BsYWNlbWVudFNjYWxlID0gc291cmNlLmRpc3BsYWNlbWVudFNjYWxlO1xuXHR0aGlzLmRpc3BsYWNlbWVudEJpYXMgPSBzb3VyY2UuZGlzcGxhY2VtZW50QmlhcztcblxuXHR0aGlzLndpcmVmcmFtZSA9IHNvdXJjZS53aXJlZnJhbWU7XG5cdHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gc291cmNlLndpcmVmcmFtZUxpbmV3aWR0aDtcblxuXHR0aGlzLnNraW5uaW5nID0gc291cmNlLnNraW5uaW5nO1xuXHR0aGlzLm1vcnBoVGFyZ2V0cyA9IHNvdXJjZS5tb3JwaFRhcmdldHM7XG5cdHRoaXMubW9ycGhOb3JtYWxzID0gc291cmNlLm1vcnBoTm9ybWFscztcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqXG4gKiBwYXJhbWV0ZXJzID0ge1xuICogIGNvbG9yOiA8aGV4PixcbiAqICBvcGFjaXR5OiA8ZmxvYXQ+LFxuICpcbiAqICBtYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIGxpZ2h0TWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGxpZ2h0TWFwSW50ZW5zaXR5OiA8ZmxvYXQ+XG4gKlxuICogIGFvTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGFvTWFwSW50ZW5zaXR5OiA8ZmxvYXQ+XG4gKlxuICogIGVtaXNzaXZlOiA8aGV4PixcbiAqICBlbWlzc2l2ZUludGVuc2l0eTogPGZsb2F0PlxuICogIGVtaXNzaXZlTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBzcGVjdWxhck1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgYWxwaGFNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIGVudk1hcDogbmV3IFRIUkVFLkN1YmVUZXh0dXJlKCBbcG9zeCwgbmVneCwgcG9zeSwgbmVneSwgcG9zeiwgbmVnel0gKSxcbiAqICBjb21iaW5lOiBUSFJFRS5NdWx0aXBseSxcbiAqICByZWZsZWN0aXZpdHk6IDxmbG9hdD4sXG4gKiAgcmVmcmFjdGlvblJhdGlvOiA8ZmxvYXQ+LFxuICpcbiAqICB3aXJlZnJhbWU6IDxib29sZWFuPixcbiAqICB3aXJlZnJhbWVMaW5ld2lkdGg6IDxmbG9hdD4sXG4gKlxuICogIHNraW5uaW5nOiA8Ym9vbD4sXG4gKiAgbW9ycGhUYXJnZXRzOiA8Ym9vbD4sXG4gKiAgbW9ycGhOb3JtYWxzOiA8Ym9vbD5cbiAqIH1cbiAqL1xuXG5mdW5jdGlvbiBNZXNoTGFtYmVydE1hdGVyaWFsKCBwYXJhbWV0ZXJzICkge1xuXG5cdE1hdGVyaWFsLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnTWVzaExhbWJlcnRNYXRlcmlhbCc7XG5cblx0dGhpcy5jb2xvciA9IG5ldyBDb2xvciggMHhmZmZmZmYgKTsgLy8gZGlmZnVzZVxuXG5cdHRoaXMubWFwID0gbnVsbDtcblxuXHR0aGlzLmxpZ2h0TWFwID0gbnVsbDtcblx0dGhpcy5saWdodE1hcEludGVuc2l0eSA9IDEuMDtcblxuXHR0aGlzLmFvTWFwID0gbnVsbDtcblx0dGhpcy5hb01hcEludGVuc2l0eSA9IDEuMDtcblxuXHR0aGlzLmVtaXNzaXZlID0gbmV3IENvbG9yKCAweDAwMDAwMCApO1xuXHR0aGlzLmVtaXNzaXZlSW50ZW5zaXR5ID0gMS4wO1xuXHR0aGlzLmVtaXNzaXZlTWFwID0gbnVsbDtcblxuXHR0aGlzLnNwZWN1bGFyTWFwID0gbnVsbDtcblxuXHR0aGlzLmFscGhhTWFwID0gbnVsbDtcblxuXHR0aGlzLmVudk1hcCA9IG51bGw7XG5cdHRoaXMuY29tYmluZSA9IE11bHRpcGx5T3BlcmF0aW9uO1xuXHR0aGlzLnJlZmxlY3Rpdml0eSA9IDE7XG5cdHRoaXMucmVmcmFjdGlvblJhdGlvID0gMC45ODtcblxuXHR0aGlzLndpcmVmcmFtZSA9IGZhbHNlO1xuXHR0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IDE7XG5cdHRoaXMud2lyZWZyYW1lTGluZWNhcCA9ICdyb3VuZCc7XG5cdHRoaXMud2lyZWZyYW1lTGluZWpvaW4gPSAncm91bmQnO1xuXG5cdHRoaXMuc2tpbm5pbmcgPSBmYWxzZTtcblx0dGhpcy5tb3JwaFRhcmdldHMgPSBmYWxzZTtcblx0dGhpcy5tb3JwaE5vcm1hbHMgPSBmYWxzZTtcblxuXHR0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApO1xuXG59XG5cbk1lc2hMYW1iZXJ0TWF0ZXJpYWwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTWF0ZXJpYWwucHJvdG90eXBlICk7XG5NZXNoTGFtYmVydE1hdGVyaWFsLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE1lc2hMYW1iZXJ0TWF0ZXJpYWw7XG5cbk1lc2hMYW1iZXJ0TWF0ZXJpYWwucHJvdG90eXBlLmlzTWVzaExhbWJlcnRNYXRlcmlhbCA9IHRydWU7XG5cbk1lc2hMYW1iZXJ0TWF0ZXJpYWwucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRNYXRlcmlhbC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHR0aGlzLmNvbG9yLmNvcHkoIHNvdXJjZS5jb2xvciApO1xuXG5cdHRoaXMubWFwID0gc291cmNlLm1hcDtcblxuXHR0aGlzLmxpZ2h0TWFwID0gc291cmNlLmxpZ2h0TWFwO1xuXHR0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5ID0gc291cmNlLmxpZ2h0TWFwSW50ZW5zaXR5O1xuXG5cdHRoaXMuYW9NYXAgPSBzb3VyY2UuYW9NYXA7XG5cdHRoaXMuYW9NYXBJbnRlbnNpdHkgPSBzb3VyY2UuYW9NYXBJbnRlbnNpdHk7XG5cblx0dGhpcy5lbWlzc2l2ZS5jb3B5KCBzb3VyY2UuZW1pc3NpdmUgKTtcblx0dGhpcy5lbWlzc2l2ZU1hcCA9IHNvdXJjZS5lbWlzc2l2ZU1hcDtcblx0dGhpcy5lbWlzc2l2ZUludGVuc2l0eSA9IHNvdXJjZS5lbWlzc2l2ZUludGVuc2l0eTtcblxuXHR0aGlzLnNwZWN1bGFyTWFwID0gc291cmNlLnNwZWN1bGFyTWFwO1xuXG5cdHRoaXMuYWxwaGFNYXAgPSBzb3VyY2UuYWxwaGFNYXA7XG5cblx0dGhpcy5lbnZNYXAgPSBzb3VyY2UuZW52TWFwO1xuXHR0aGlzLmNvbWJpbmUgPSBzb3VyY2UuY29tYmluZTtcblx0dGhpcy5yZWZsZWN0aXZpdHkgPSBzb3VyY2UucmVmbGVjdGl2aXR5O1xuXHR0aGlzLnJlZnJhY3Rpb25SYXRpbyA9IHNvdXJjZS5yZWZyYWN0aW9uUmF0aW87XG5cblx0dGhpcy53aXJlZnJhbWUgPSBzb3VyY2Uud2lyZWZyYW1lO1xuXHR0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IHNvdXJjZS53aXJlZnJhbWVMaW5ld2lkdGg7XG5cdHRoaXMud2lyZWZyYW1lTGluZWNhcCA9IHNvdXJjZS53aXJlZnJhbWVMaW5lY2FwO1xuXHR0aGlzLndpcmVmcmFtZUxpbmVqb2luID0gc291cmNlLndpcmVmcmFtZUxpbmVqb2luO1xuXG5cdHRoaXMuc2tpbm5pbmcgPSBzb3VyY2Uuc2tpbm5pbmc7XG5cdHRoaXMubW9ycGhUYXJnZXRzID0gc291cmNlLm1vcnBoVGFyZ2V0cztcblx0dGhpcy5tb3JwaE5vcm1hbHMgPSBzb3VyY2UubW9ycGhOb3JtYWxzO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG4vKipcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKlxuICogcGFyYW1ldGVycyA9IHtcbiAqICBjb2xvcjogPGhleD4sXG4gKiAgb3BhY2l0eTogPGZsb2F0PixcbiAqXG4gKiAgbGluZXdpZHRoOiA8ZmxvYXQ+LFxuICpcbiAqICBzY2FsZTogPGZsb2F0PixcbiAqICBkYXNoU2l6ZTogPGZsb2F0PixcbiAqICBnYXBTaXplOiA8ZmxvYXQ+XG4gKiB9XG4gKi9cblxuZnVuY3Rpb24gTGluZURhc2hlZE1hdGVyaWFsKCBwYXJhbWV0ZXJzICkge1xuXG5cdExpbmVCYXNpY01hdGVyaWFsLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnTGluZURhc2hlZE1hdGVyaWFsJztcblxuXHR0aGlzLnNjYWxlID0gMTtcblx0dGhpcy5kYXNoU2l6ZSA9IDM7XG5cdHRoaXMuZ2FwU2l6ZSA9IDE7XG5cblx0dGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTtcblxufVxuXG5MaW5lRGFzaGVkTWF0ZXJpYWwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTGluZUJhc2ljTWF0ZXJpYWwucHJvdG90eXBlICk7XG5MaW5lRGFzaGVkTWF0ZXJpYWwucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTGluZURhc2hlZE1hdGVyaWFsO1xuXG5MaW5lRGFzaGVkTWF0ZXJpYWwucHJvdG90eXBlLmlzTGluZURhc2hlZE1hdGVyaWFsID0gdHJ1ZTtcblxuTGluZURhc2hlZE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0TGluZUJhc2ljTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0dGhpcy5zY2FsZSA9IHNvdXJjZS5zY2FsZTtcblx0dGhpcy5kYXNoU2l6ZSA9IHNvdXJjZS5kYXNoU2l6ZTtcblx0dGhpcy5nYXBTaXplID0gc291cmNlLmdhcFNpemU7XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cblxuXG52YXIgTWF0ZXJpYWxzID0gT2JqZWN0LmZyZWV6ZSh7XG5cdFNoYWRvd01hdGVyaWFsOiBTaGFkb3dNYXRlcmlhbCxcblx0U3ByaXRlTWF0ZXJpYWw6IFNwcml0ZU1hdGVyaWFsLFxuXHRSYXdTaGFkZXJNYXRlcmlhbDogUmF3U2hhZGVyTWF0ZXJpYWwsXG5cdFNoYWRlck1hdGVyaWFsOiBTaGFkZXJNYXRlcmlhbCxcblx0UG9pbnRzTWF0ZXJpYWw6IFBvaW50c01hdGVyaWFsLFxuXHRNZXNoUGh5c2ljYWxNYXRlcmlhbDogTWVzaFBoeXNpY2FsTWF0ZXJpYWwsXG5cdE1lc2hTdGFuZGFyZE1hdGVyaWFsOiBNZXNoU3RhbmRhcmRNYXRlcmlhbCxcblx0TWVzaFBob25nTWF0ZXJpYWw6IE1lc2hQaG9uZ01hdGVyaWFsLFxuXHRNZXNoVG9vbk1hdGVyaWFsOiBNZXNoVG9vbk1hdGVyaWFsLFxuXHRNZXNoTm9ybWFsTWF0ZXJpYWw6IE1lc2hOb3JtYWxNYXRlcmlhbCxcblx0TWVzaExhbWJlcnRNYXRlcmlhbDogTWVzaExhbWJlcnRNYXRlcmlhbCxcblx0TWVzaERlcHRoTWF0ZXJpYWw6IE1lc2hEZXB0aE1hdGVyaWFsLFxuXHRNZXNoRGlzdGFuY2VNYXRlcmlhbDogTWVzaERpc3RhbmNlTWF0ZXJpYWwsXG5cdE1lc2hCYXNpY01hdGVyaWFsOiBNZXNoQmFzaWNNYXRlcmlhbCxcblx0TGluZURhc2hlZE1hdGVyaWFsOiBMaW5lRGFzaGVkTWF0ZXJpYWwsXG5cdExpbmVCYXNpY01hdGVyaWFsOiBMaW5lQmFzaWNNYXRlcmlhbCxcblx0TWF0ZXJpYWw6IE1hdGVyaWFsXG59KTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbnZhciBDYWNoZSA9IHtcblxuXHRlbmFibGVkOiBmYWxzZSxcblxuXHRmaWxlczoge30sXG5cblx0YWRkOiBmdW5jdGlvbiAoIGtleSwgZmlsZSApIHtcblxuXHRcdGlmICggdGhpcy5lbmFibGVkID09PSBmYWxzZSApIHJldHVybjtcblxuXHRcdC8vIGNvbnNvbGUubG9nKCAnVEhSRUUuQ2FjaGUnLCAnQWRkaW5nIGtleTonLCBrZXkgKTtcblxuXHRcdHRoaXMuZmlsZXNbIGtleSBdID0gZmlsZTtcblxuXHR9LFxuXG5cdGdldDogZnVuY3Rpb24gKCBrZXkgKSB7XG5cblx0XHRpZiAoIHRoaXMuZW5hYmxlZCA9PT0gZmFsc2UgKSByZXR1cm47XG5cblx0XHQvLyBjb25zb2xlLmxvZyggJ1RIUkVFLkNhY2hlJywgJ0NoZWNraW5nIGtleTonLCBrZXkgKTtcblxuXHRcdHJldHVybiB0aGlzLmZpbGVzWyBrZXkgXTtcblxuXHR9LFxuXG5cdHJlbW92ZTogZnVuY3Rpb24gKCBrZXkgKSB7XG5cblx0XHRkZWxldGUgdGhpcy5maWxlc1sga2V5IF07XG5cblx0fSxcblxuXHRjbGVhcjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5maWxlcyA9IHt9O1xuXG5cdH1cblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIExvYWRpbmdNYW5hZ2VyKCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKSB7XG5cblx0dmFyIHNjb3BlID0gdGhpcztcblxuXHR2YXIgaXNMb2FkaW5nID0gZmFsc2U7XG5cdHZhciBpdGVtc0xvYWRlZCA9IDA7XG5cdHZhciBpdGVtc1RvdGFsID0gMDtcblx0dmFyIHVybE1vZGlmaWVyID0gdW5kZWZpbmVkO1xuXG5cdHRoaXMub25TdGFydCA9IHVuZGVmaW5lZDtcblx0dGhpcy5vbkxvYWQgPSBvbkxvYWQ7XG5cdHRoaXMub25Qcm9ncmVzcyA9IG9uUHJvZ3Jlc3M7XG5cdHRoaXMub25FcnJvciA9IG9uRXJyb3I7XG5cblx0dGhpcy5pdGVtU3RhcnQgPSBmdW5jdGlvbiAoIHVybCApIHtcblxuXHRcdGl0ZW1zVG90YWwgKys7XG5cblx0XHRpZiAoIGlzTG9hZGluZyA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdGlmICggc2NvcGUub25TdGFydCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHNjb3BlLm9uU3RhcnQoIHVybCwgaXRlbXNMb2FkZWQsIGl0ZW1zVG90YWwgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aXNMb2FkaW5nID0gdHJ1ZTtcblxuXHR9O1xuXG5cdHRoaXMuaXRlbUVuZCA9IGZ1bmN0aW9uICggdXJsICkge1xuXG5cdFx0aXRlbXNMb2FkZWQgKys7XG5cblx0XHRpZiAoIHNjb3BlLm9uUHJvZ3Jlc3MgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0c2NvcGUub25Qcm9ncmVzcyggdXJsLCBpdGVtc0xvYWRlZCwgaXRlbXNUb3RhbCApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBpdGVtc0xvYWRlZCA9PT0gaXRlbXNUb3RhbCApIHtcblxuXHRcdFx0aXNMb2FkaW5nID0gZmFsc2U7XG5cblx0XHRcdGlmICggc2NvcGUub25Mb2FkICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0c2NvcGUub25Mb2FkKCk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9O1xuXG5cdHRoaXMuaXRlbUVycm9yID0gZnVuY3Rpb24gKCB1cmwgKSB7XG5cblx0XHRpZiAoIHNjb3BlLm9uRXJyb3IgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0c2NvcGUub25FcnJvciggdXJsICk7XG5cblx0XHR9XG5cblx0fTtcblxuXHR0aGlzLnJlc29sdmVVUkwgPSBmdW5jdGlvbiAoIHVybCApIHtcblxuXHRcdGlmICggdXJsTW9kaWZpZXIgKSB7XG5cblx0XHRcdHJldHVybiB1cmxNb2RpZmllciggdXJsICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdXJsO1xuXG5cdH07XG5cblx0dGhpcy5zZXRVUkxNb2RpZmllciA9IGZ1bmN0aW9uICggdHJhbnNmb3JtICkge1xuXG5cdFx0dXJsTW9kaWZpZXIgPSB0cmFuc2Zvcm07XG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fTtcblxufVxuXG52YXIgRGVmYXVsdExvYWRpbmdNYW5hZ2VyID0gbmV3IExvYWRpbmdNYW5hZ2VyKCk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG52YXIgbG9hZGluZyA9IHt9O1xuXG5mdW5jdGlvbiBGaWxlTG9hZGVyKCBtYW5hZ2VyICkge1xuXG5cdHRoaXMubWFuYWdlciA9ICggbWFuYWdlciAhPT0gdW5kZWZpbmVkICkgPyBtYW5hZ2VyIDogRGVmYXVsdExvYWRpbmdNYW5hZ2VyO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIEZpbGVMb2FkZXIucHJvdG90eXBlLCB7XG5cblx0bG9hZDogZnVuY3Rpb24gKCB1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciApIHtcblxuXHRcdGlmICggdXJsID09PSB1bmRlZmluZWQgKSB1cmwgPSAnJztcblxuXHRcdGlmICggdGhpcy5wYXRoICE9PSB1bmRlZmluZWQgKSB1cmwgPSB0aGlzLnBhdGggKyB1cmw7XG5cblx0XHR1cmwgPSB0aGlzLm1hbmFnZXIucmVzb2x2ZVVSTCggdXJsICk7XG5cblx0XHR2YXIgc2NvcGUgPSB0aGlzO1xuXG5cdFx0dmFyIGNhY2hlZCA9IENhY2hlLmdldCggdXJsICk7XG5cblx0XHRpZiAoIGNhY2hlZCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1TdGFydCggdXJsICk7XG5cblx0XHRcdHNldFRpbWVvdXQoIGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0XHRpZiAoIG9uTG9hZCApIG9uTG9hZCggY2FjaGVkICk7XG5cblx0XHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRW5kKCB1cmwgKTtcblxuXHRcdFx0fSwgMCApO1xuXG5cdFx0XHRyZXR1cm4gY2FjaGVkO1xuXG5cdFx0fVxuXG5cdFx0Ly8gQ2hlY2sgaWYgcmVxdWVzdCBpcyBkdXBsaWNhdGVcblxuXHRcdGlmICggbG9hZGluZ1sgdXJsIF0gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0bG9hZGluZ1sgdXJsIF0ucHVzaCgge1xuXG5cdFx0XHRcdG9uTG9hZDogb25Mb2FkLFxuXHRcdFx0XHRvblByb2dyZXNzOiBvblByb2dyZXNzLFxuXHRcdFx0XHRvbkVycm9yOiBvbkVycm9yXG5cblx0XHRcdH0gKTtcblxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0fVxuXG5cdFx0Ly8gQ2hlY2sgZm9yIGRhdGE6IFVSSVxuXHRcdHZhciBkYXRhVXJpUmVnZXggPSAvXmRhdGE6KC4qPykoO2Jhc2U2NCk/LCguKikkLztcblx0XHR2YXIgZGF0YVVyaVJlZ2V4UmVzdWx0ID0gdXJsLm1hdGNoKCBkYXRhVXJpUmVnZXggKTtcblxuXHRcdC8vIFNhZmFyaSBjYW4gbm90IGhhbmRsZSBEYXRhIFVSSXMgdGhyb3VnaCBYTUxIdHRwUmVxdWVzdCBzbyBwcm9jZXNzIG1hbnVhbGx5XG5cdFx0aWYgKCBkYXRhVXJpUmVnZXhSZXN1bHQgKSB7XG5cblx0XHRcdHZhciBtaW1lVHlwZSA9IGRhdGFVcmlSZWdleFJlc3VsdFsgMSBdO1xuXHRcdFx0dmFyIGlzQmFzZTY0ID0gISEgZGF0YVVyaVJlZ2V4UmVzdWx0WyAyIF07XG5cdFx0XHR2YXIgZGF0YSA9IGRhdGFVcmlSZWdleFJlc3VsdFsgMyBdO1xuXG5cdFx0XHRkYXRhID0gd2luZG93LmRlY29kZVVSSUNvbXBvbmVudCggZGF0YSApO1xuXG5cdFx0XHRpZiAoIGlzQmFzZTY0ICkgZGF0YSA9IHdpbmRvdy5hdG9iKCBkYXRhICk7XG5cblx0XHRcdHRyeSB7XG5cblx0XHRcdFx0dmFyIHJlc3BvbnNlO1xuXHRcdFx0XHR2YXIgcmVzcG9uc2VUeXBlID0gKCB0aGlzLnJlc3BvbnNlVHlwZSB8fCAnJyApLnRvTG93ZXJDYXNlKCk7XG5cblx0XHRcdFx0c3dpdGNoICggcmVzcG9uc2VUeXBlICkge1xuXG5cdFx0XHRcdFx0Y2FzZSAnYXJyYXlidWZmZXInOlxuXHRcdFx0XHRcdGNhc2UgJ2Jsb2InOlxuXG5cdFx0XHRcdFx0XHR2YXIgdmlldyA9IG5ldyBVaW50OEFycmF5KCBkYXRhLmxlbmd0aCApO1xuXG5cdFx0XHRcdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0XHRcdFx0XHR2aWV3WyBpIF0gPSBkYXRhLmNoYXJDb2RlQXQoIGkgKTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZiAoIHJlc3BvbnNlVHlwZSA9PT0gJ2Jsb2InICkge1xuXG5cdFx0XHRcdFx0XHRcdHJlc3BvbnNlID0gbmV3IEJsb2IoIFsgdmlldy5idWZmZXIgXSwgeyB0eXBlOiBtaW1lVHlwZSB9ICk7XG5cblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdFx0cmVzcG9uc2UgPSB2aWV3LmJ1ZmZlcjtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgJ2RvY3VtZW50JzpcblxuXHRcdFx0XHRcdFx0dmFyIHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTtcblx0XHRcdFx0XHRcdHJlc3BvbnNlID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyggZGF0YSwgbWltZVR5cGUgKTtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlICdqc29uJzpcblxuXHRcdFx0XHRcdFx0cmVzcG9uc2UgPSBKU09OLnBhcnNlKCBkYXRhICk7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0ZGVmYXVsdDogLy8gJ3RleHQnIG9yIG90aGVyXG5cblx0XHRcdFx0XHRcdHJlc3BvbnNlID0gZGF0YTtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFdhaXQgZm9yIG5leHQgYnJvd3NlciB0aWNrIGxpa2Ugc3RhbmRhcmQgWE1MSHR0cFJlcXVlc3QgZXZlbnQgZGlzcGF0Y2hpbmcgZG9lc1xuXHRcdFx0XHR3aW5kb3cuc2V0VGltZW91dCggZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRcdFx0aWYgKCBvbkxvYWQgKSBvbkxvYWQoIHJlc3BvbnNlICk7XG5cblx0XHRcdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FbmQoIHVybCApO1xuXG5cdFx0XHRcdH0sIDAgKTtcblxuXHRcdFx0fSBjYXRjaCAoIGVycm9yICkge1xuXG5cdFx0XHRcdC8vIFdhaXQgZm9yIG5leHQgYnJvd3NlciB0aWNrIGxpa2Ugc3RhbmRhcmQgWE1MSHR0cFJlcXVlc3QgZXZlbnQgZGlzcGF0Y2hpbmcgZG9lc1xuXHRcdFx0XHR3aW5kb3cuc2V0VGltZW91dCggZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRcdFx0aWYgKCBvbkVycm9yICkgb25FcnJvciggZXJyb3IgKTtcblxuXHRcdFx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7XG5cdFx0XHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRXJyb3IoIHVybCApO1xuXG5cdFx0XHRcdH0sIDAgKTtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gSW5pdGlhbGlzZSBhcnJheSBmb3IgZHVwbGljYXRlIHJlcXVlc3RzXG5cblx0XHRcdGxvYWRpbmdbIHVybCBdID0gW107XG5cblx0XHRcdGxvYWRpbmdbIHVybCBdLnB1c2goIHtcblxuXHRcdFx0XHRvbkxvYWQ6IG9uTG9hZCxcblx0XHRcdFx0b25Qcm9ncmVzczogb25Qcm9ncmVzcyxcblx0XHRcdFx0b25FcnJvcjogb25FcnJvclxuXG5cdFx0XHR9ICk7XG5cblx0XHRcdHZhciByZXF1ZXN0ID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG5cblx0XHRcdHJlcXVlc3Qub3BlbiggJ0dFVCcsIHVybCwgdHJ1ZSApO1xuXG5cdFx0XHRyZXF1ZXN0LmFkZEV2ZW50TGlzdGVuZXIoICdsb2FkJywgZnVuY3Rpb24gKCBldmVudCApIHtcblxuXHRcdFx0XHR2YXIgcmVzcG9uc2UgPSB0aGlzLnJlc3BvbnNlO1xuXG5cdFx0XHRcdENhY2hlLmFkZCggdXJsLCByZXNwb25zZSApO1xuXG5cdFx0XHRcdHZhciBjYWxsYmFja3MgPSBsb2FkaW5nWyB1cmwgXTtcblxuXHRcdFx0XHRkZWxldGUgbG9hZGluZ1sgdXJsIF07XG5cblx0XHRcdFx0aWYgKCB0aGlzLnN0YXR1cyA9PT0gMjAwICkge1xuXG5cdFx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IGNhbGxiYWNrcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdFx0dmFyIGNhbGxiYWNrID0gY2FsbGJhY2tzWyBpIF07XG5cdFx0XHRcdFx0XHRpZiAoIGNhbGxiYWNrLm9uTG9hZCApIGNhbGxiYWNrLm9uTG9hZCggcmVzcG9uc2UgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7XG5cblx0XHRcdFx0fSBlbHNlIGlmICggdGhpcy5zdGF0dXMgPT09IDAgKSB7XG5cblx0XHRcdFx0XHQvLyBTb21lIGJyb3dzZXJzIHJldHVybiBIVFRQIFN0YXR1cyAwIHdoZW4gdXNpbmcgbm9uLWh0dHAgcHJvdG9jb2xcblx0XHRcdFx0XHQvLyBlLmcuICdmaWxlOi8vJyBvciAnZGF0YTovLycuIEhhbmRsZSBhcyBzdWNjZXNzLlxuXG5cdFx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuRmlsZUxvYWRlcjogSFRUUCBTdGF0dXMgMCByZWNlaXZlZC4nICk7XG5cblx0XHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gY2FsbGJhY2tzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0XHR2YXIgY2FsbGJhY2sgPSBjYWxsYmFja3NbIGkgXTtcblx0XHRcdFx0XHRcdGlmICggY2FsbGJhY2sub25Mb2FkICkgY2FsbGJhY2sub25Mb2FkKCByZXNwb25zZSApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRW5kKCB1cmwgKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IGNhbGxiYWNrcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdFx0dmFyIGNhbGxiYWNrID0gY2FsbGJhY2tzWyBpIF07XG5cdFx0XHRcdFx0XHRpZiAoIGNhbGxiYWNrLm9uRXJyb3IgKSBjYWxsYmFjay5vbkVycm9yKCBldmVudCApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRW5kKCB1cmwgKTtcblx0XHRcdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FcnJvciggdXJsICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9LCBmYWxzZSApO1xuXG5cdFx0XHRyZXF1ZXN0LmFkZEV2ZW50TGlzdGVuZXIoICdwcm9ncmVzcycsIGZ1bmN0aW9uICggZXZlbnQgKSB7XG5cblx0XHRcdFx0dmFyIGNhbGxiYWNrcyA9IGxvYWRpbmdbIHVybCBdO1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBjYWxsYmFja3MubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHR2YXIgY2FsbGJhY2sgPSBjYWxsYmFja3NbIGkgXTtcblx0XHRcdFx0XHRpZiAoIGNhbGxiYWNrLm9uUHJvZ3Jlc3MgKSBjYWxsYmFjay5vblByb2dyZXNzKCBldmVudCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSwgZmFsc2UgKTtcblxuXHRcdFx0cmVxdWVzdC5hZGRFdmVudExpc3RlbmVyKCAnZXJyb3InLCBmdW5jdGlvbiAoIGV2ZW50ICkge1xuXG5cdFx0XHRcdHZhciBjYWxsYmFja3MgPSBsb2FkaW5nWyB1cmwgXTtcblxuXHRcdFx0XHRkZWxldGUgbG9hZGluZ1sgdXJsIF07XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IGNhbGxiYWNrcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdHZhciBjYWxsYmFjayA9IGNhbGxiYWNrc1sgaSBdO1xuXHRcdFx0XHRcdGlmICggY2FsbGJhY2sub25FcnJvciApIGNhbGxiYWNrLm9uRXJyb3IoIGV2ZW50ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7XG5cdFx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVycm9yKCB1cmwgKTtcblxuXHRcdFx0fSwgZmFsc2UgKTtcblxuXHRcdFx0aWYgKCB0aGlzLnJlc3BvbnNlVHlwZSAhPT0gdW5kZWZpbmVkICkgcmVxdWVzdC5yZXNwb25zZVR5cGUgPSB0aGlzLnJlc3BvbnNlVHlwZTtcblx0XHRcdGlmICggdGhpcy53aXRoQ3JlZGVudGlhbHMgIT09IHVuZGVmaW5lZCApIHJlcXVlc3Qud2l0aENyZWRlbnRpYWxzID0gdGhpcy53aXRoQ3JlZGVudGlhbHM7XG5cblx0XHRcdGlmICggcmVxdWVzdC5vdmVycmlkZU1pbWVUeXBlICkgcmVxdWVzdC5vdmVycmlkZU1pbWVUeXBlKCB0aGlzLm1pbWVUeXBlICE9PSB1bmRlZmluZWQgPyB0aGlzLm1pbWVUeXBlIDogJ3RleHQvcGxhaW4nICk7XG5cblx0XHRcdGZvciAoIHZhciBoZWFkZXIgaW4gdGhpcy5yZXF1ZXN0SGVhZGVyICkge1xuXG5cdFx0XHRcdHJlcXVlc3Quc2V0UmVxdWVzdEhlYWRlciggaGVhZGVyLCB0aGlzLnJlcXVlc3RIZWFkZXJbIGhlYWRlciBdICk7XG5cblx0XHRcdH1cblxuXHRcdFx0cmVxdWVzdC5zZW5kKCBudWxsICk7XG5cblx0XHR9XG5cblx0XHRzY29wZS5tYW5hZ2VyLml0ZW1TdGFydCggdXJsICk7XG5cblx0XHRyZXR1cm4gcmVxdWVzdDtcblxuXHR9LFxuXG5cdHNldFBhdGg6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLnBhdGggPSB2YWx1ZTtcblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFJlc3BvbnNlVHlwZTogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMucmVzcG9uc2VUeXBlID0gdmFsdWU7XG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRXaXRoQ3JlZGVudGlhbHM6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLndpdGhDcmVkZW50aWFscyA9IHZhbHVlO1xuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0TWltZVR5cGU6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLm1pbWVUeXBlID0gdmFsdWU7XG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRSZXF1ZXN0SGVhZGVyOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5yZXF1ZXN0SGVhZGVyID0gdmFsdWU7XG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqXG4gKiBBYnN0cmFjdCBCYXNlIGNsYXNzIHRvIGJsb2NrIGJhc2VkIHRleHR1cmVzIGxvYWRlciAoZGRzLCBwdnIsIC4uLilcbiAqL1xuXG5mdW5jdGlvbiBDb21wcmVzc2VkVGV4dHVyZUxvYWRlciggbWFuYWdlciApIHtcblxuXHR0aGlzLm1hbmFnZXIgPSAoIG1hbmFnZXIgIT09IHVuZGVmaW5lZCApID8gbWFuYWdlciA6IERlZmF1bHRMb2FkaW5nTWFuYWdlcjtcblxuXHQvLyBvdmVycmlkZSBpbiBzdWIgY2xhc3Nlc1xuXHR0aGlzLl9wYXJzZXIgPSBudWxsO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIENvbXByZXNzZWRUZXh0dXJlTG9hZGVyLnByb3RvdHlwZSwge1xuXG5cdGxvYWQ6IGZ1bmN0aW9uICggdXJsLCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKSB7XG5cblx0XHR2YXIgc2NvcGUgPSB0aGlzO1xuXG5cdFx0dmFyIGltYWdlcyA9IFtdO1xuXG5cdFx0dmFyIHRleHR1cmUgPSBuZXcgQ29tcHJlc3NlZFRleHR1cmUoKTtcblx0XHR0ZXh0dXJlLmltYWdlID0gaW1hZ2VzO1xuXG5cdFx0dmFyIGxvYWRlciA9IG5ldyBGaWxlTG9hZGVyKCB0aGlzLm1hbmFnZXIgKTtcblx0XHRsb2FkZXIuc2V0UGF0aCggdGhpcy5wYXRoICk7XG5cdFx0bG9hZGVyLnNldFJlc3BvbnNlVHlwZSggJ2FycmF5YnVmZmVyJyApO1xuXG5cdFx0ZnVuY3Rpb24gbG9hZFRleHR1cmUoIGkgKSB7XG5cblx0XHRcdGxvYWRlci5sb2FkKCB1cmxbIGkgXSwgZnVuY3Rpb24gKCBidWZmZXIgKSB7XG5cblx0XHRcdFx0dmFyIHRleERhdGFzID0gc2NvcGUuX3BhcnNlciggYnVmZmVyLCB0cnVlICk7XG5cblx0XHRcdFx0aW1hZ2VzWyBpIF0gPSB7XG5cdFx0XHRcdFx0d2lkdGg6IHRleERhdGFzLndpZHRoLFxuXHRcdFx0XHRcdGhlaWdodDogdGV4RGF0YXMuaGVpZ2h0LFxuXHRcdFx0XHRcdGZvcm1hdDogdGV4RGF0YXMuZm9ybWF0LFxuXHRcdFx0XHRcdG1pcG1hcHM6IHRleERhdGFzLm1pcG1hcHNcblx0XHRcdFx0fTtcblxuXHRcdFx0XHRsb2FkZWQgKz0gMTtcblxuXHRcdFx0XHRpZiAoIGxvYWRlZCA9PT0gNiApIHtcblxuXHRcdFx0XHRcdGlmICggdGV4RGF0YXMubWlwbWFwQ291bnQgPT09IDEgKVxuXHRcdFx0XHRcdFx0dGV4dHVyZS5taW5GaWx0ZXIgPSBMaW5lYXJGaWx0ZXI7XG5cblx0XHRcdFx0XHR0ZXh0dXJlLmZvcm1hdCA9IHRleERhdGFzLmZvcm1hdDtcblx0XHRcdFx0XHR0ZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0XHRcdGlmICggb25Mb2FkICkgb25Mb2FkKCB0ZXh0dXJlICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9LCBvblByb2dyZXNzLCBvbkVycm9yICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIHVybCApICkge1xuXG5cdFx0XHR2YXIgbG9hZGVkID0gMDtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IHVybC5sZW5ndGg7IGkgPCBpbDsgKysgaSApIHtcblxuXHRcdFx0XHRsb2FkVGV4dHVyZSggaSApO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBjb21wcmVzc2VkIGN1YmVtYXAgdGV4dHVyZSBzdG9yZWQgaW4gYSBzaW5nbGUgRERTIGZpbGVcblxuXHRcdFx0bG9hZGVyLmxvYWQoIHVybCwgZnVuY3Rpb24gKCBidWZmZXIgKSB7XG5cblx0XHRcdFx0dmFyIHRleERhdGFzID0gc2NvcGUuX3BhcnNlciggYnVmZmVyLCB0cnVlICk7XG5cblx0XHRcdFx0aWYgKCB0ZXhEYXRhcy5pc0N1YmVtYXAgKSB7XG5cblx0XHRcdFx0XHR2YXIgZmFjZXMgPSB0ZXhEYXRhcy5taXBtYXBzLmxlbmd0aCAvIHRleERhdGFzLm1pcG1hcENvdW50O1xuXG5cdFx0XHRcdFx0Zm9yICggdmFyIGYgPSAwOyBmIDwgZmFjZXM7IGYgKysgKSB7XG5cblx0XHRcdFx0XHRcdGltYWdlc1sgZiBdID0geyBtaXBtYXBzOiBbXSB9O1xuXG5cdFx0XHRcdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCB0ZXhEYXRhcy5taXBtYXBDb3VudDsgaSArKyApIHtcblxuXHRcdFx0XHRcdFx0XHRpbWFnZXNbIGYgXS5taXBtYXBzLnB1c2goIHRleERhdGFzLm1pcG1hcHNbIGYgKiB0ZXhEYXRhcy5taXBtYXBDb3VudCArIGkgXSApO1xuXHRcdFx0XHRcdFx0XHRpbWFnZXNbIGYgXS5mb3JtYXQgPSB0ZXhEYXRhcy5mb3JtYXQ7XG5cdFx0XHRcdFx0XHRcdGltYWdlc1sgZiBdLndpZHRoID0gdGV4RGF0YXMud2lkdGg7XG5cdFx0XHRcdFx0XHRcdGltYWdlc1sgZiBdLmhlaWdodCA9IHRleERhdGFzLmhlaWdodDtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHR0ZXh0dXJlLmltYWdlLndpZHRoID0gdGV4RGF0YXMud2lkdGg7XG5cdFx0XHRcdFx0dGV4dHVyZS5pbWFnZS5oZWlnaHQgPSB0ZXhEYXRhcy5oZWlnaHQ7XG5cdFx0XHRcdFx0dGV4dHVyZS5taXBtYXBzID0gdGV4RGF0YXMubWlwbWFwcztcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCB0ZXhEYXRhcy5taXBtYXBDb3VudCA9PT0gMSApIHtcblxuXHRcdFx0XHRcdHRleHR1cmUubWluRmlsdGVyID0gTGluZWFyRmlsdGVyO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0ZXh0dXJlLmZvcm1hdCA9IHRleERhdGFzLmZvcm1hdDtcblx0XHRcdFx0dGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdFx0aWYgKCBvbkxvYWQgKSBvbkxvYWQoIHRleHR1cmUgKTtcblxuXHRcdFx0fSwgb25Qcm9ncmVzcywgb25FcnJvciApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRleHR1cmU7XG5cblx0fSxcblxuXHRzZXRQYXRoOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5wYXRoID0gdmFsdWU7XG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBOaWtvcyBNLiAvIGh0dHBzOi8vZ2l0aHViLmNvbS9mb28xMjMvXG4gKlxuICogQWJzdHJhY3QgQmFzZSBjbGFzcyB0byBsb2FkIGdlbmVyaWMgYmluYXJ5IHRleHR1cmVzIGZvcm1hdHMgKHJnYmUsIGhkciwgLi4uKVxuICovXG5cbmZ1bmN0aW9uIERhdGFUZXh0dXJlTG9hZGVyKCBtYW5hZ2VyICkge1xuXG5cdHRoaXMubWFuYWdlciA9ICggbWFuYWdlciAhPT0gdW5kZWZpbmVkICkgPyBtYW5hZ2VyIDogRGVmYXVsdExvYWRpbmdNYW5hZ2VyO1xuXG5cdC8vIG92ZXJyaWRlIGluIHN1YiBjbGFzc2VzXG5cdHRoaXMuX3BhcnNlciA9IG51bGw7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggRGF0YVRleHR1cmVMb2FkZXIucHJvdG90eXBlLCB7XG5cblx0bG9hZDogZnVuY3Rpb24gKCB1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciApIHtcblxuXHRcdHZhciBzY29wZSA9IHRoaXM7XG5cblx0XHR2YXIgdGV4dHVyZSA9IG5ldyBEYXRhVGV4dHVyZSgpO1xuXG5cdFx0dmFyIGxvYWRlciA9IG5ldyBGaWxlTG9hZGVyKCB0aGlzLm1hbmFnZXIgKTtcblx0XHRsb2FkZXIuc2V0UmVzcG9uc2VUeXBlKCAnYXJyYXlidWZmZXInICk7XG5cblx0XHRsb2FkZXIubG9hZCggdXJsLCBmdW5jdGlvbiAoIGJ1ZmZlciApIHtcblxuXHRcdFx0dmFyIHRleERhdGEgPSBzY29wZS5fcGFyc2VyKCBidWZmZXIgKTtcblxuXHRcdFx0aWYgKCAhIHRleERhdGEgKSByZXR1cm47XG5cblx0XHRcdGlmICggdW5kZWZpbmVkICE9PSB0ZXhEYXRhLmltYWdlICkge1xuXG5cdFx0XHRcdHRleHR1cmUuaW1hZ2UgPSB0ZXhEYXRhLmltYWdlO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCB1bmRlZmluZWQgIT09IHRleERhdGEuZGF0YSApIHtcblxuXHRcdFx0XHR0ZXh0dXJlLmltYWdlLndpZHRoID0gdGV4RGF0YS53aWR0aDtcblx0XHRcdFx0dGV4dHVyZS5pbWFnZS5oZWlnaHQgPSB0ZXhEYXRhLmhlaWdodDtcblx0XHRcdFx0dGV4dHVyZS5pbWFnZS5kYXRhID0gdGV4RGF0YS5kYXRhO1xuXG5cdFx0XHR9XG5cblx0XHRcdHRleHR1cmUud3JhcFMgPSB1bmRlZmluZWQgIT09IHRleERhdGEud3JhcFMgPyB0ZXhEYXRhLndyYXBTIDogQ2xhbXBUb0VkZ2VXcmFwcGluZztcblx0XHRcdHRleHR1cmUud3JhcFQgPSB1bmRlZmluZWQgIT09IHRleERhdGEud3JhcFQgPyB0ZXhEYXRhLndyYXBUIDogQ2xhbXBUb0VkZ2VXcmFwcGluZztcblxuXHRcdFx0dGV4dHVyZS5tYWdGaWx0ZXIgPSB1bmRlZmluZWQgIT09IHRleERhdGEubWFnRmlsdGVyID8gdGV4RGF0YS5tYWdGaWx0ZXIgOiBMaW5lYXJGaWx0ZXI7XG5cdFx0XHR0ZXh0dXJlLm1pbkZpbHRlciA9IHVuZGVmaW5lZCAhPT0gdGV4RGF0YS5taW5GaWx0ZXIgPyB0ZXhEYXRhLm1pbkZpbHRlciA6IExpbmVhck1pcE1hcExpbmVhckZpbHRlcjtcblxuXHRcdFx0dGV4dHVyZS5hbmlzb3Ryb3B5ID0gdW5kZWZpbmVkICE9PSB0ZXhEYXRhLmFuaXNvdHJvcHkgPyB0ZXhEYXRhLmFuaXNvdHJvcHkgOiAxO1xuXG5cdFx0XHRpZiAoIHVuZGVmaW5lZCAhPT0gdGV4RGF0YS5mb3JtYXQgKSB7XG5cblx0XHRcdFx0dGV4dHVyZS5mb3JtYXQgPSB0ZXhEYXRhLmZvcm1hdDtcblxuXHRcdFx0fVxuXHRcdFx0aWYgKCB1bmRlZmluZWQgIT09IHRleERhdGEudHlwZSApIHtcblxuXHRcdFx0XHR0ZXh0dXJlLnR5cGUgPSB0ZXhEYXRhLnR5cGU7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCB1bmRlZmluZWQgIT09IHRleERhdGEubWlwbWFwcyApIHtcblxuXHRcdFx0XHR0ZXh0dXJlLm1pcG1hcHMgPSB0ZXhEYXRhLm1pcG1hcHM7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCAxID09PSB0ZXhEYXRhLm1pcG1hcENvdW50ICkge1xuXG5cdFx0XHRcdHRleHR1cmUubWluRmlsdGVyID0gTGluZWFyRmlsdGVyO1xuXG5cdFx0XHR9XG5cblx0XHRcdHRleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHRpZiAoIG9uTG9hZCApIG9uTG9hZCggdGV4dHVyZSwgdGV4RGF0YSApO1xuXG5cdFx0fSwgb25Qcm9ncmVzcywgb25FcnJvciApO1xuXG5cblx0XHRyZXR1cm4gdGV4dHVyZTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIEltYWdlTG9hZGVyKCBtYW5hZ2VyICkge1xuXG5cdHRoaXMubWFuYWdlciA9ICggbWFuYWdlciAhPT0gdW5kZWZpbmVkICkgPyBtYW5hZ2VyIDogRGVmYXVsdExvYWRpbmdNYW5hZ2VyO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIEltYWdlTG9hZGVyLnByb3RvdHlwZSwge1xuXG5cdGNyb3NzT3JpZ2luOiAnQW5vbnltb3VzJyxcblxuXHRsb2FkOiBmdW5jdGlvbiAoIHVybCwgb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkge1xuXG5cdFx0aWYgKCB1cmwgPT09IHVuZGVmaW5lZCApIHVybCA9ICcnO1xuXG5cdFx0aWYgKCB0aGlzLnBhdGggIT09IHVuZGVmaW5lZCApIHVybCA9IHRoaXMucGF0aCArIHVybDtcblxuXHRcdHVybCA9IHRoaXMubWFuYWdlci5yZXNvbHZlVVJMKCB1cmwgKTtcblxuXHRcdHZhciBzY29wZSA9IHRoaXM7XG5cblx0XHR2YXIgY2FjaGVkID0gQ2FjaGUuZ2V0KCB1cmwgKTtcblxuXHRcdGlmICggY2FjaGVkICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbVN0YXJ0KCB1cmwgKTtcblxuXHRcdFx0c2V0VGltZW91dCggZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRcdGlmICggb25Mb2FkICkgb25Mb2FkKCBjYWNoZWQgKTtcblxuXHRcdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FbmQoIHVybCApO1xuXG5cdFx0XHR9LCAwICk7XG5cblx0XHRcdHJldHVybiBjYWNoZWQ7XG5cblx0XHR9XG5cblx0XHR2YXIgaW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJywgJ2ltZycgKTtcblxuXHRcdGltYWdlLmFkZEV2ZW50TGlzdGVuZXIoICdsb2FkJywgZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRDYWNoZS5hZGQoIHVybCwgdGhpcyApO1xuXG5cdFx0XHRpZiAoIG9uTG9hZCApIG9uTG9hZCggdGhpcyApO1xuXG5cdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FbmQoIHVybCApO1xuXG5cdFx0fSwgZmFsc2UgKTtcblxuXHRcdC8qXG5cdFx0aW1hZ2UuYWRkRXZlbnRMaXN0ZW5lciggJ3Byb2dyZXNzJywgZnVuY3Rpb24gKCBldmVudCApIHtcblxuXHRcdFx0aWYgKCBvblByb2dyZXNzICkgb25Qcm9ncmVzcyggZXZlbnQgKTtcblxuXHRcdH0sIGZhbHNlICk7XG5cdFx0Ki9cblxuXHRcdGltYWdlLmFkZEV2ZW50TGlzdGVuZXIoICdlcnJvcicsIGZ1bmN0aW9uICggZXZlbnQgKSB7XG5cblx0XHRcdGlmICggb25FcnJvciApIG9uRXJyb3IoIGV2ZW50ICk7XG5cblx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7XG5cdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FcnJvciggdXJsICk7XG5cblx0XHR9LCBmYWxzZSApO1xuXG5cdFx0aWYgKCB1cmwuc3Vic3RyKCAwLCA1ICkgIT09ICdkYXRhOicgKSB7XG5cblx0XHRcdGlmICggdGhpcy5jcm9zc09yaWdpbiAhPT0gdW5kZWZpbmVkICkgaW1hZ2UuY3Jvc3NPcmlnaW4gPSB0aGlzLmNyb3NzT3JpZ2luO1xuXG5cdFx0fVxuXG5cdFx0c2NvcGUubWFuYWdlci5pdGVtU3RhcnQoIHVybCApO1xuXG5cdFx0aW1hZ2Uuc3JjID0gdXJsO1xuXG5cdFx0cmV0dXJuIGltYWdlO1xuXG5cdH0sXG5cblx0c2V0Q3Jvc3NPcmlnaW46IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLmNyb3NzT3JpZ2luID0gdmFsdWU7XG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRQYXRoOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5wYXRoID0gdmFsdWU7XG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBDdWJlVGV4dHVyZUxvYWRlciggbWFuYWdlciApIHtcblxuXHR0aGlzLm1hbmFnZXIgPSAoIG1hbmFnZXIgIT09IHVuZGVmaW5lZCApID8gbWFuYWdlciA6IERlZmF1bHRMb2FkaW5nTWFuYWdlcjtcblxufVxuXG5PYmplY3QuYXNzaWduKCBDdWJlVGV4dHVyZUxvYWRlci5wcm90b3R5cGUsIHtcblxuXHRjcm9zc09yaWdpbjogJ0Fub255bW91cycsXG5cblx0bG9hZDogZnVuY3Rpb24gKCB1cmxzLCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKSB7XG5cblx0XHR2YXIgdGV4dHVyZSA9IG5ldyBDdWJlVGV4dHVyZSgpO1xuXG5cdFx0dmFyIGxvYWRlciA9IG5ldyBJbWFnZUxvYWRlciggdGhpcy5tYW5hZ2VyICk7XG5cdFx0bG9hZGVyLnNldENyb3NzT3JpZ2luKCB0aGlzLmNyb3NzT3JpZ2luICk7XG5cdFx0bG9hZGVyLnNldFBhdGgoIHRoaXMucGF0aCApO1xuXG5cdFx0dmFyIGxvYWRlZCA9IDA7XG5cblx0XHRmdW5jdGlvbiBsb2FkVGV4dHVyZSggaSApIHtcblxuXHRcdFx0bG9hZGVyLmxvYWQoIHVybHNbIGkgXSwgZnVuY3Rpb24gKCBpbWFnZSApIHtcblxuXHRcdFx0XHR0ZXh0dXJlLmltYWdlc1sgaSBdID0gaW1hZ2U7XG5cblx0XHRcdFx0bG9hZGVkICsrO1xuXG5cdFx0XHRcdGlmICggbG9hZGVkID09PSA2ICkge1xuXG5cdFx0XHRcdFx0dGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdFx0XHRpZiAoIG9uTG9hZCApIG9uTG9hZCggdGV4dHVyZSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSwgdW5kZWZpbmVkLCBvbkVycm9yICk7XG5cblx0XHR9XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCB1cmxzLmxlbmd0aDsgKysgaSApIHtcblxuXHRcdFx0bG9hZFRleHR1cmUoIGkgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0ZXh0dXJlO1xuXG5cdH0sXG5cblx0c2V0Q3Jvc3NPcmlnaW46IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLmNyb3NzT3JpZ2luID0gdmFsdWU7XG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRQYXRoOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5wYXRoID0gdmFsdWU7XG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBUZXh0dXJlTG9hZGVyKCBtYW5hZ2VyICkge1xuXG5cdHRoaXMubWFuYWdlciA9ICggbWFuYWdlciAhPT0gdW5kZWZpbmVkICkgPyBtYW5hZ2VyIDogRGVmYXVsdExvYWRpbmdNYW5hZ2VyO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIFRleHR1cmVMb2FkZXIucHJvdG90eXBlLCB7XG5cblx0Y3Jvc3NPcmlnaW46ICdBbm9ueW1vdXMnLFxuXG5cdGxvYWQ6IGZ1bmN0aW9uICggdXJsLCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKSB7XG5cblx0XHR2YXIgdGV4dHVyZSA9IG5ldyBUZXh0dXJlKCk7XG5cblx0XHR2YXIgbG9hZGVyID0gbmV3IEltYWdlTG9hZGVyKCB0aGlzLm1hbmFnZXIgKTtcblx0XHRsb2FkZXIuc2V0Q3Jvc3NPcmlnaW4oIHRoaXMuY3Jvc3NPcmlnaW4gKTtcblx0XHRsb2FkZXIuc2V0UGF0aCggdGhpcy5wYXRoICk7XG5cblx0XHRsb2FkZXIubG9hZCggdXJsLCBmdW5jdGlvbiAoIGltYWdlICkge1xuXG5cdFx0XHR0ZXh0dXJlLmltYWdlID0gaW1hZ2U7XG5cblx0XHRcdC8vIEpQRUdzIGNhbid0IGhhdmUgYW4gYWxwaGEgY2hhbm5lbCwgc28gbWVtb3J5IGNhbiBiZSBzYXZlZCBieSBzdG9yaW5nIHRoZW0gYXMgUkdCLlxuXHRcdFx0dmFyIGlzSlBFRyA9IHVybC5zZWFyY2goIC9cXC4oanBnfGpwZWcpJC8gKSA+IDAgfHwgdXJsLnNlYXJjaCggL15kYXRhXFw6aW1hZ2VcXC9qcGVnLyApID09PSAwO1xuXG5cdFx0XHR0ZXh0dXJlLmZvcm1hdCA9IGlzSlBFRyA/IFJHQkZvcm1hdCA6IFJHQkFGb3JtYXQ7XG5cdFx0XHR0ZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0aWYgKCBvbkxvYWQgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRvbkxvYWQoIHRleHR1cmUgKTtcblxuXHRcdFx0fVxuXG5cdFx0fSwgb25Qcm9ncmVzcywgb25FcnJvciApO1xuXG5cdFx0cmV0dXJuIHRleHR1cmU7XG5cblx0fSxcblxuXHRzZXRDcm9zc09yaWdpbjogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMuY3Jvc3NPcmlnaW4gPSB2YWx1ZTtcblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFBhdGg6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLnBhdGggPSB2YWx1ZTtcblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIHp6ODUgLyBodHRwOi8vd3d3LmxhYjRnYW1lcy5uZXQveno4NS9ibG9nXG4gKiBFeHRlbnNpYmxlIGN1cnZlIG9iamVjdFxuICpcbiAqIFNvbWUgY29tbW9uIG9mIGN1cnZlIG1ldGhvZHM6XG4gKiAuZ2V0UG9pbnQoIHQsIG9wdGlvbmFsVGFyZ2V0ICksIC5nZXRUYW5nZW50KCB0IClcbiAqIC5nZXRQb2ludEF0KCB1LCBvcHRpb25hbFRhcmdldCApLCAuZ2V0VGFuZ2VudEF0KCB1IClcbiAqIC5nZXRQb2ludHMoKSwgLmdldFNwYWNlZFBvaW50cygpXG4gKiAuZ2V0TGVuZ3RoKClcbiAqIC51cGRhdGVBcmNMZW5ndGhzKClcbiAqXG4gKiBUaGlzIGZvbGxvd2luZyBjdXJ2ZXMgaW5oZXJpdCBmcm9tIFRIUkVFLkN1cnZlOlxuICpcbiAqIC0tIDJEIGN1cnZlcyAtLVxuICogVEhSRUUuQXJjQ3VydmVcbiAqIFRIUkVFLkN1YmljQmV6aWVyQ3VydmVcbiAqIFRIUkVFLkVsbGlwc2VDdXJ2ZVxuICogVEhSRUUuTGluZUN1cnZlXG4gKiBUSFJFRS5RdWFkcmF0aWNCZXppZXJDdXJ2ZVxuICogVEhSRUUuU3BsaW5lQ3VydmVcbiAqXG4gKiAtLSAzRCBjdXJ2ZXMgLS1cbiAqIFRIUkVFLkNhdG11bGxSb21DdXJ2ZTNcbiAqIFRIUkVFLkN1YmljQmV6aWVyQ3VydmUzXG4gKiBUSFJFRS5MaW5lQ3VydmUzXG4gKiBUSFJFRS5RdWFkcmF0aWNCZXppZXJDdXJ2ZTNcbiAqXG4gKiBBIHNlcmllcyBvZiBjdXJ2ZXMgY2FuIGJlIHJlcHJlc2VudGVkIGFzIGEgVEhSRUUuQ3VydmVQYXRoLlxuICpcbiAqKi9cblxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gKlx0QWJzdHJhY3QgQ3VydmUgYmFzZSBjbGFzc1xuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5mdW5jdGlvbiBDdXJ2ZSgpIHtcblxuXHR0aGlzLnR5cGUgPSAnQ3VydmUnO1xuXG5cdHRoaXMuYXJjTGVuZ3RoRGl2aXNpb25zID0gMjAwO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIEN1cnZlLnByb3RvdHlwZSwge1xuXG5cdC8vIFZpcnR1YWwgYmFzZSBjbGFzcyBtZXRob2QgdG8gb3ZlcndyaXRlIGFuZCBpbXBsZW1lbnQgaW4gc3ViY2xhc3Nlc1xuXHQvL1x0LSB0IFswIC4uIDFdXG5cblx0Z2V0UG9pbnQ6IGZ1bmN0aW9uICggLyogdCwgb3B0aW9uYWxUYXJnZXQgKi8gKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5DdXJ2ZTogLmdldFBvaW50KCkgbm90IGltcGxlbWVudGVkLicgKTtcblx0XHRyZXR1cm4gbnVsbDtcblxuXHR9LFxuXG5cdC8vIEdldCBwb2ludCBhdCByZWxhdGl2ZSBwb3NpdGlvbiBpbiBjdXJ2ZSBhY2NvcmRpbmcgdG8gYXJjIGxlbmd0aFxuXHQvLyAtIHUgWzAgLi4gMV1cblxuXHRnZXRQb2ludEF0OiBmdW5jdGlvbiAoIHUsIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdFx0dmFyIHQgPSB0aGlzLmdldFV0b1RtYXBwaW5nKCB1ICk7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0UG9pbnQoIHQsIG9wdGlvbmFsVGFyZ2V0ICk7XG5cblx0fSxcblxuXHQvLyBHZXQgc2VxdWVuY2Ugb2YgcG9pbnRzIHVzaW5nIGdldFBvaW50KCB0IClcblxuXHRnZXRQb2ludHM6IGZ1bmN0aW9uICggZGl2aXNpb25zICkge1xuXG5cdFx0aWYgKCBkaXZpc2lvbnMgPT09IHVuZGVmaW5lZCApIGRpdmlzaW9ucyA9IDU7XG5cblx0XHR2YXIgcG9pbnRzID0gW107XG5cblx0XHRmb3IgKCB2YXIgZCA9IDA7IGQgPD0gZGl2aXNpb25zOyBkICsrICkge1xuXG5cdFx0XHRwb2ludHMucHVzaCggdGhpcy5nZXRQb2ludCggZCAvIGRpdmlzaW9ucyApICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gcG9pbnRzO1xuXG5cdH0sXG5cblx0Ly8gR2V0IHNlcXVlbmNlIG9mIHBvaW50cyB1c2luZyBnZXRQb2ludEF0KCB1IClcblxuXHRnZXRTcGFjZWRQb2ludHM6IGZ1bmN0aW9uICggZGl2aXNpb25zICkge1xuXG5cdFx0aWYgKCBkaXZpc2lvbnMgPT09IHVuZGVmaW5lZCApIGRpdmlzaW9ucyA9IDU7XG5cblx0XHR2YXIgcG9pbnRzID0gW107XG5cblx0XHRmb3IgKCB2YXIgZCA9IDA7IGQgPD0gZGl2aXNpb25zOyBkICsrICkge1xuXG5cdFx0XHRwb2ludHMucHVzaCggdGhpcy5nZXRQb2ludEF0KCBkIC8gZGl2aXNpb25zICkgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBwb2ludHM7XG5cblx0fSxcblxuXHQvLyBHZXQgdG90YWwgY3VydmUgYXJjIGxlbmd0aFxuXG5cdGdldExlbmd0aDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGxlbmd0aHMgPSB0aGlzLmdldExlbmd0aHMoKTtcblx0XHRyZXR1cm4gbGVuZ3Roc1sgbGVuZ3Rocy5sZW5ndGggLSAxIF07XG5cblx0fSxcblxuXHQvLyBHZXQgbGlzdCBvZiBjdW11bGF0aXZlIHNlZ21lbnQgbGVuZ3Roc1xuXG5cdGdldExlbmd0aHM6IGZ1bmN0aW9uICggZGl2aXNpb25zICkge1xuXG5cdFx0aWYgKCBkaXZpc2lvbnMgPT09IHVuZGVmaW5lZCApIGRpdmlzaW9ucyA9IHRoaXMuYXJjTGVuZ3RoRGl2aXNpb25zO1xuXG5cdFx0aWYgKCB0aGlzLmNhY2hlQXJjTGVuZ3RocyAmJlxuXHRcdFx0KCB0aGlzLmNhY2hlQXJjTGVuZ3Rocy5sZW5ndGggPT09IGRpdmlzaW9ucyArIDEgKSAmJlxuXHRcdFx0ISB0aGlzLm5lZWRzVXBkYXRlICkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5jYWNoZUFyY0xlbmd0aHM7XG5cblx0XHR9XG5cblx0XHR0aGlzLm5lZWRzVXBkYXRlID0gZmFsc2U7XG5cblx0XHR2YXIgY2FjaGUgPSBbXTtcblx0XHR2YXIgY3VycmVudCwgbGFzdCA9IHRoaXMuZ2V0UG9pbnQoIDAgKTtcblx0XHR2YXIgcCwgc3VtID0gMDtcblxuXHRcdGNhY2hlLnB1c2goIDAgKTtcblxuXHRcdGZvciAoIHAgPSAxOyBwIDw9IGRpdmlzaW9uczsgcCArKyApIHtcblxuXHRcdFx0Y3VycmVudCA9IHRoaXMuZ2V0UG9pbnQoIHAgLyBkaXZpc2lvbnMgKTtcblx0XHRcdHN1bSArPSBjdXJyZW50LmRpc3RhbmNlVG8oIGxhc3QgKTtcblx0XHRcdGNhY2hlLnB1c2goIHN1bSApO1xuXHRcdFx0bGFzdCA9IGN1cnJlbnQ7XG5cblx0XHR9XG5cblx0XHR0aGlzLmNhY2hlQXJjTGVuZ3RocyA9IGNhY2hlO1xuXG5cdFx0cmV0dXJuIGNhY2hlOyAvLyB7IHN1bXM6IGNhY2hlLCBzdW06IHN1bSB9OyBTdW0gaXMgaW4gdGhlIGxhc3QgZWxlbWVudC5cblxuXHR9LFxuXG5cdHVwZGF0ZUFyY0xlbmd0aHM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlO1xuXHRcdHRoaXMuZ2V0TGVuZ3RocygpO1xuXG5cdH0sXG5cblx0Ly8gR2l2ZW4gdSAoIDAgLi4gMSApLCBnZXQgYSB0IHRvIGZpbmQgcC4gVGhpcyBnaXZlcyB5b3UgcG9pbnRzIHdoaWNoIGFyZSBlcXVpZGlzdGFudFxuXG5cdGdldFV0b1RtYXBwaW5nOiBmdW5jdGlvbiAoIHUsIGRpc3RhbmNlICkge1xuXG5cdFx0dmFyIGFyY0xlbmd0aHMgPSB0aGlzLmdldExlbmd0aHMoKTtcblxuXHRcdHZhciBpID0gMCwgaWwgPSBhcmNMZW5ndGhzLmxlbmd0aDtcblxuXHRcdHZhciB0YXJnZXRBcmNMZW5ndGg7IC8vIFRoZSB0YXJnZXRlZCB1IGRpc3RhbmNlIHZhbHVlIHRvIGdldFxuXG5cdFx0aWYgKCBkaXN0YW5jZSApIHtcblxuXHRcdFx0dGFyZ2V0QXJjTGVuZ3RoID0gZGlzdGFuY2U7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR0YXJnZXRBcmNMZW5ndGggPSB1ICogYXJjTGVuZ3Roc1sgaWwgLSAxIF07XG5cblx0XHR9XG5cblx0XHQvLyBiaW5hcnkgc2VhcmNoIGZvciB0aGUgaW5kZXggd2l0aCBsYXJnZXN0IHZhbHVlIHNtYWxsZXIgdGhhbiB0YXJnZXQgdSBkaXN0YW5jZVxuXG5cdFx0dmFyIGxvdyA9IDAsIGhpZ2ggPSBpbCAtIDEsIGNvbXBhcmlzb247XG5cblx0XHR3aGlsZSAoIGxvdyA8PSBoaWdoICkge1xuXG5cdFx0XHRpID0gTWF0aC5mbG9vciggbG93ICsgKCBoaWdoIC0gbG93ICkgLyAyICk7IC8vIGxlc3MgbGlrZWx5IHRvIG92ZXJmbG93LCB0aG91Z2ggcHJvYmFibHkgbm90IGlzc3VlIGhlcmUsIEpTIGRvZXNuJ3QgcmVhbGx5IGhhdmUgaW50ZWdlcnMsIGFsbCBudW1iZXJzIGFyZSBmbG9hdHNcblxuXHRcdFx0Y29tcGFyaXNvbiA9IGFyY0xlbmd0aHNbIGkgXSAtIHRhcmdldEFyY0xlbmd0aDtcblxuXHRcdFx0aWYgKCBjb21wYXJpc29uIDwgMCApIHtcblxuXHRcdFx0XHRsb3cgPSBpICsgMTtcblxuXHRcdFx0fSBlbHNlIGlmICggY29tcGFyaXNvbiA+IDAgKSB7XG5cblx0XHRcdFx0aGlnaCA9IGkgLSAxO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGhpZ2ggPSBpO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHQvLyBET05FXG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGkgPSBoaWdoO1xuXG5cdFx0aWYgKCBhcmNMZW5ndGhzWyBpIF0gPT09IHRhcmdldEFyY0xlbmd0aCApIHtcblxuXHRcdFx0cmV0dXJuIGkgLyAoIGlsIC0gMSApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gd2UgY291bGQgZ2V0IGZpbmVyIGdyYWluIGF0IGxlbmd0aHMsIG9yIHVzZSBzaW1wbGUgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIHR3byBwb2ludHNcblxuXHRcdHZhciBsZW5ndGhCZWZvcmUgPSBhcmNMZW5ndGhzWyBpIF07XG5cdFx0dmFyIGxlbmd0aEFmdGVyID0gYXJjTGVuZ3Roc1sgaSArIDEgXTtcblxuXHRcdHZhciBzZWdtZW50TGVuZ3RoID0gbGVuZ3RoQWZ0ZXIgLSBsZW5ndGhCZWZvcmU7XG5cblx0XHQvLyBkZXRlcm1pbmUgd2hlcmUgd2UgYXJlIGJldHdlZW4gdGhlICdiZWZvcmUnIGFuZCAnYWZ0ZXInIHBvaW50c1xuXG5cdFx0dmFyIHNlZ21lbnRGcmFjdGlvbiA9ICggdGFyZ2V0QXJjTGVuZ3RoIC0gbGVuZ3RoQmVmb3JlICkgLyBzZWdtZW50TGVuZ3RoO1xuXG5cdFx0Ly8gYWRkIHRoYXQgZnJhY3Rpb25hbCBhbW91bnQgdG8gdFxuXG5cdFx0dmFyIHQgPSAoIGkgKyBzZWdtZW50RnJhY3Rpb24gKSAvICggaWwgLSAxICk7XG5cblx0XHRyZXR1cm4gdDtcblxuXHR9LFxuXG5cdC8vIFJldHVybnMgYSB1bml0IHZlY3RvciB0YW5nZW50IGF0IHRcblx0Ly8gSW4gY2FzZSBhbnkgc3ViIGN1cnZlIGRvZXMgbm90IGltcGxlbWVudCBpdHMgdGFuZ2VudCBkZXJpdmF0aW9uLFxuXHQvLyAyIHBvaW50cyBhIHNtYWxsIGRlbHRhIGFwYXJ0IHdpbGwgYmUgdXNlZCB0byBmaW5kIGl0cyBncmFkaWVudFxuXHQvLyB3aGljaCBzZWVtcyB0byBnaXZlIGEgcmVhc29uYWJsZSBhcHByb3hpbWF0aW9uXG5cblx0Z2V0VGFuZ2VudDogZnVuY3Rpb24gKCB0ICkge1xuXG5cdFx0dmFyIGRlbHRhID0gMC4wMDAxO1xuXHRcdHZhciB0MSA9IHQgLSBkZWx0YTtcblx0XHR2YXIgdDIgPSB0ICsgZGVsdGE7XG5cblx0XHQvLyBDYXBwaW5nIGluIGNhc2Ugb2YgZGFuZ2VyXG5cblx0XHRpZiAoIHQxIDwgMCApIHQxID0gMDtcblx0XHRpZiAoIHQyID4gMSApIHQyID0gMTtcblxuXHRcdHZhciBwdDEgPSB0aGlzLmdldFBvaW50KCB0MSApO1xuXHRcdHZhciBwdDIgPSB0aGlzLmdldFBvaW50KCB0MiApO1xuXG5cdFx0dmFyIHZlYyA9IHB0Mi5jbG9uZSgpLnN1YiggcHQxICk7XG5cdFx0cmV0dXJuIHZlYy5ub3JtYWxpemUoKTtcblxuXHR9LFxuXG5cdGdldFRhbmdlbnRBdDogZnVuY3Rpb24gKCB1ICkge1xuXG5cdFx0dmFyIHQgPSB0aGlzLmdldFV0b1RtYXBwaW5nKCB1ICk7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0VGFuZ2VudCggdCApO1xuXG5cdH0sXG5cblx0Y29tcHV0ZUZyZW5ldEZyYW1lczogZnVuY3Rpb24gKCBzZWdtZW50cywgY2xvc2VkICkge1xuXG5cdFx0Ly8gc2VlIGh0dHA6Ly93d3cuY3MuaW5kaWFuYS5lZHUvcHViL3RlY2hyZXBvcnRzL1RSNDI1LnBkZlxuXG5cdFx0dmFyIG5vcm1hbCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR2YXIgdGFuZ2VudHMgPSBbXTtcblx0XHR2YXIgbm9ybWFscyA9IFtdO1xuXHRcdHZhciBiaW5vcm1hbHMgPSBbXTtcblxuXHRcdHZhciB2ZWMgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciBtYXQgPSBuZXcgTWF0cml4NCgpO1xuXG5cdFx0dmFyIGksIHUsIHRoZXRhO1xuXG5cdFx0Ly8gY29tcHV0ZSB0aGUgdGFuZ2VudCB2ZWN0b3JzIGZvciBlYWNoIHNlZ21lbnQgb24gdGhlIGN1cnZlXG5cblx0XHRmb3IgKCBpID0gMDsgaSA8PSBzZWdtZW50czsgaSArKyApIHtcblxuXHRcdFx0dSA9IGkgLyBzZWdtZW50cztcblxuXHRcdFx0dGFuZ2VudHNbIGkgXSA9IHRoaXMuZ2V0VGFuZ2VudEF0KCB1ICk7XG5cdFx0XHR0YW5nZW50c1sgaSBdLm5vcm1hbGl6ZSgpO1xuXG5cdFx0fVxuXG5cdFx0Ly8gc2VsZWN0IGFuIGluaXRpYWwgbm9ybWFsIHZlY3RvciBwZXJwZW5kaWN1bGFyIHRvIHRoZSBmaXJzdCB0YW5nZW50IHZlY3Rvcixcblx0XHQvLyBhbmQgaW4gdGhlIGRpcmVjdGlvbiBvZiB0aGUgbWluaW11bSB0YW5nZW50IHh5eiBjb21wb25lbnRcblxuXHRcdG5vcm1hbHNbIDAgXSA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0Ymlub3JtYWxzWyAwIF0gPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciBtaW4gPSBOdW1iZXIuTUFYX1ZBTFVFO1xuXHRcdHZhciB0eCA9IE1hdGguYWJzKCB0YW5nZW50c1sgMCBdLnggKTtcblx0XHR2YXIgdHkgPSBNYXRoLmFicyggdGFuZ2VudHNbIDAgXS55ICk7XG5cdFx0dmFyIHR6ID0gTWF0aC5hYnMoIHRhbmdlbnRzWyAwIF0ueiApO1xuXG5cdFx0aWYgKCB0eCA8PSBtaW4gKSB7XG5cblx0XHRcdG1pbiA9IHR4O1xuXHRcdFx0bm9ybWFsLnNldCggMSwgMCwgMCApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB0eSA8PSBtaW4gKSB7XG5cblx0XHRcdG1pbiA9IHR5O1xuXHRcdFx0bm9ybWFsLnNldCggMCwgMSwgMCApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB0eiA8PSBtaW4gKSB7XG5cblx0XHRcdG5vcm1hbC5zZXQoIDAsIDAsIDEgKTtcblxuXHRcdH1cblxuXHRcdHZlYy5jcm9zc1ZlY3RvcnMoIHRhbmdlbnRzWyAwIF0sIG5vcm1hbCApLm5vcm1hbGl6ZSgpO1xuXG5cdFx0bm9ybWFsc1sgMCBdLmNyb3NzVmVjdG9ycyggdGFuZ2VudHNbIDAgXSwgdmVjICk7XG5cdFx0Ymlub3JtYWxzWyAwIF0uY3Jvc3NWZWN0b3JzKCB0YW5nZW50c1sgMCBdLCBub3JtYWxzWyAwIF0gKTtcblxuXG5cdFx0Ly8gY29tcHV0ZSB0aGUgc2xvd2x5LXZhcnlpbmcgbm9ybWFsIGFuZCBiaW5vcm1hbCB2ZWN0b3JzIGZvciBlYWNoIHNlZ21lbnQgb24gdGhlIGN1cnZlXG5cblx0XHRmb3IgKCBpID0gMTsgaSA8PSBzZWdtZW50czsgaSArKyApIHtcblxuXHRcdFx0bm9ybWFsc1sgaSBdID0gbm9ybWFsc1sgaSAtIDEgXS5jbG9uZSgpO1xuXG5cdFx0XHRiaW5vcm1hbHNbIGkgXSA9IGJpbm9ybWFsc1sgaSAtIDEgXS5jbG9uZSgpO1xuXG5cdFx0XHR2ZWMuY3Jvc3NWZWN0b3JzKCB0YW5nZW50c1sgaSAtIDEgXSwgdGFuZ2VudHNbIGkgXSApO1xuXG5cdFx0XHRpZiAoIHZlYy5sZW5ndGgoKSA+IE51bWJlci5FUFNJTE9OICkge1xuXG5cdFx0XHRcdHZlYy5ub3JtYWxpemUoKTtcblxuXHRcdFx0XHR0aGV0YSA9IE1hdGguYWNvcyggX01hdGguY2xhbXAoIHRhbmdlbnRzWyBpIC0gMSBdLmRvdCggdGFuZ2VudHNbIGkgXSApLCAtIDEsIDEgKSApOyAvLyBjbGFtcCBmb3IgZmxvYXRpbmcgcHQgZXJyb3JzXG5cblx0XHRcdFx0bm9ybWFsc1sgaSBdLmFwcGx5TWF0cml4NCggbWF0Lm1ha2VSb3RhdGlvbkF4aXMoIHZlYywgdGhldGEgKSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGJpbm9ybWFsc1sgaSBdLmNyb3NzVmVjdG9ycyggdGFuZ2VudHNbIGkgXSwgbm9ybWFsc1sgaSBdICk7XG5cblx0XHR9XG5cblx0XHQvLyBpZiB0aGUgY3VydmUgaXMgY2xvc2VkLCBwb3N0cHJvY2VzcyB0aGUgdmVjdG9ycyBzbyB0aGUgZmlyc3QgYW5kIGxhc3Qgbm9ybWFsIHZlY3RvcnMgYXJlIHRoZSBzYW1lXG5cblx0XHRpZiAoIGNsb3NlZCA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0dGhldGEgPSBNYXRoLmFjb3MoIF9NYXRoLmNsYW1wKCBub3JtYWxzWyAwIF0uZG90KCBub3JtYWxzWyBzZWdtZW50cyBdICksIC0gMSwgMSApICk7XG5cdFx0XHR0aGV0YSAvPSBzZWdtZW50cztcblxuXHRcdFx0aWYgKCB0YW5nZW50c1sgMCBdLmRvdCggdmVjLmNyb3NzVmVjdG9ycyggbm9ybWFsc1sgMCBdLCBub3JtYWxzWyBzZWdtZW50cyBdICkgKSA+IDAgKSB7XG5cblx0XHRcdFx0dGhldGEgPSAtIHRoZXRhO1xuXG5cdFx0XHR9XG5cblx0XHRcdGZvciAoIGkgPSAxOyBpIDw9IHNlZ21lbnRzOyBpICsrICkge1xuXG5cdFx0XHRcdC8vIHR3aXN0IGEgbGl0dGxlLi4uXG5cdFx0XHRcdG5vcm1hbHNbIGkgXS5hcHBseU1hdHJpeDQoIG1hdC5tYWtlUm90YXRpb25BeGlzKCB0YW5nZW50c1sgaSBdLCB0aGV0YSAqIGkgKSApO1xuXHRcdFx0XHRiaW5vcm1hbHNbIGkgXS5jcm9zc1ZlY3RvcnMoIHRhbmdlbnRzWyBpIF0sIG5vcm1hbHNbIGkgXSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0dGFuZ2VudHM6IHRhbmdlbnRzLFxuXHRcdFx0bm9ybWFsczogbm9ybWFscyxcblx0XHRcdGJpbm9ybWFsczogYmlub3JtYWxzXG5cdFx0fTtcblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRcdHRoaXMuYXJjTGVuZ3RoRGl2aXNpb25zID0gc291cmNlLmFyY0xlbmd0aERpdmlzaW9ucztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dG9KU09OOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgZGF0YSA9IHtcblx0XHRcdG1ldGFkYXRhOiB7XG5cdFx0XHRcdHZlcnNpb246IDQuNSxcblx0XHRcdFx0dHlwZTogJ0N1cnZlJyxcblx0XHRcdFx0Z2VuZXJhdG9yOiAnQ3VydmUudG9KU09OJ1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHRkYXRhLmFyY0xlbmd0aERpdmlzaW9ucyA9IHRoaXMuYXJjTGVuZ3RoRGl2aXNpb25zO1xuXHRcdGRhdGEudHlwZSA9IHRoaXMudHlwZTtcblxuXHRcdHJldHVybiBkYXRhO1xuXG5cdH0sXG5cblx0ZnJvbUpTT046IGZ1bmN0aW9uICgganNvbiApIHtcblxuXHRcdHRoaXMuYXJjTGVuZ3RoRGl2aXNpb25zID0ganNvbi5hcmNMZW5ndGhEaXZpc2lvbnM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuZnVuY3Rpb24gRWxsaXBzZUN1cnZlKCBhWCwgYVksIHhSYWRpdXMsIHlSYWRpdXMsIGFTdGFydEFuZ2xlLCBhRW5kQW5nbGUsIGFDbG9ja3dpc2UsIGFSb3RhdGlvbiApIHtcblxuXHRDdXJ2ZS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0VsbGlwc2VDdXJ2ZSc7XG5cblx0dGhpcy5hWCA9IGFYIHx8IDA7XG5cdHRoaXMuYVkgPSBhWSB8fCAwO1xuXG5cdHRoaXMueFJhZGl1cyA9IHhSYWRpdXMgfHwgMTtcblx0dGhpcy55UmFkaXVzID0geVJhZGl1cyB8fCAxO1xuXG5cdHRoaXMuYVN0YXJ0QW5nbGUgPSBhU3RhcnRBbmdsZSB8fCAwO1xuXHR0aGlzLmFFbmRBbmdsZSA9IGFFbmRBbmdsZSB8fCAyICogTWF0aC5QSTtcblxuXHR0aGlzLmFDbG9ja3dpc2UgPSBhQ2xvY2t3aXNlIHx8IGZhbHNlO1xuXG5cdHRoaXMuYVJvdGF0aW9uID0gYVJvdGF0aW9uIHx8IDA7XG5cbn1cblxuRWxsaXBzZUN1cnZlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEN1cnZlLnByb3RvdHlwZSApO1xuRWxsaXBzZUN1cnZlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEVsbGlwc2VDdXJ2ZTtcblxuRWxsaXBzZUN1cnZlLnByb3RvdHlwZS5pc0VsbGlwc2VDdXJ2ZSA9IHRydWU7XG5cbkVsbGlwc2VDdXJ2ZS5wcm90b3R5cGUuZ2V0UG9pbnQgPSBmdW5jdGlvbiAoIHQsIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdHZhciBwb2ludCA9IG9wdGlvbmFsVGFyZ2V0IHx8IG5ldyBWZWN0b3IyKCk7XG5cblx0dmFyIHR3b1BpID0gTWF0aC5QSSAqIDI7XG5cdHZhciBkZWx0YUFuZ2xlID0gdGhpcy5hRW5kQW5nbGUgLSB0aGlzLmFTdGFydEFuZ2xlO1xuXHR2YXIgc2FtZVBvaW50cyA9IE1hdGguYWJzKCBkZWx0YUFuZ2xlICkgPCBOdW1iZXIuRVBTSUxPTjtcblxuXHQvLyBlbnN1cmVzIHRoYXQgZGVsdGFBbmdsZSBpcyAwIC4uIDIgUElcblx0d2hpbGUgKCBkZWx0YUFuZ2xlIDwgMCApIGRlbHRhQW5nbGUgKz0gdHdvUGk7XG5cdHdoaWxlICggZGVsdGFBbmdsZSA+IHR3b1BpICkgZGVsdGFBbmdsZSAtPSB0d29QaTtcblxuXHRpZiAoIGRlbHRhQW5nbGUgPCBOdW1iZXIuRVBTSUxPTiApIHtcblxuXHRcdGlmICggc2FtZVBvaW50cyApIHtcblxuXHRcdFx0ZGVsdGFBbmdsZSA9IDA7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRkZWx0YUFuZ2xlID0gdHdvUGk7XG5cblx0XHR9XG5cblx0fVxuXG5cdGlmICggdGhpcy5hQ2xvY2t3aXNlID09PSB0cnVlICYmICEgc2FtZVBvaW50cyApIHtcblxuXHRcdGlmICggZGVsdGFBbmdsZSA9PT0gdHdvUGkgKSB7XG5cblx0XHRcdGRlbHRhQW5nbGUgPSAtIHR3b1BpO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0ZGVsdGFBbmdsZSA9IGRlbHRhQW5nbGUgLSB0d29QaTtcblxuXHRcdH1cblxuXHR9XG5cblx0dmFyIGFuZ2xlID0gdGhpcy5hU3RhcnRBbmdsZSArIHQgKiBkZWx0YUFuZ2xlO1xuXHR2YXIgeCA9IHRoaXMuYVggKyB0aGlzLnhSYWRpdXMgKiBNYXRoLmNvcyggYW5nbGUgKTtcblx0dmFyIHkgPSB0aGlzLmFZICsgdGhpcy55UmFkaXVzICogTWF0aC5zaW4oIGFuZ2xlICk7XG5cblx0aWYgKCB0aGlzLmFSb3RhdGlvbiAhPT0gMCApIHtcblxuXHRcdHZhciBjb3MgPSBNYXRoLmNvcyggdGhpcy5hUm90YXRpb24gKTtcblx0XHR2YXIgc2luID0gTWF0aC5zaW4oIHRoaXMuYVJvdGF0aW9uICk7XG5cblx0XHR2YXIgdHggPSB4IC0gdGhpcy5hWDtcblx0XHR2YXIgdHkgPSB5IC0gdGhpcy5hWTtcblxuXHRcdC8vIFJvdGF0ZSB0aGUgcG9pbnQgYWJvdXQgdGhlIGNlbnRlciBvZiB0aGUgZWxsaXBzZS5cblx0XHR4ID0gdHggKiBjb3MgLSB0eSAqIHNpbiArIHRoaXMuYVg7XG5cdFx0eSA9IHR4ICogc2luICsgdHkgKiBjb3MgKyB0aGlzLmFZO1xuXG5cdH1cblxuXHRyZXR1cm4gcG9pbnQuc2V0KCB4LCB5ICk7XG5cbn07XG5cbkVsbGlwc2VDdXJ2ZS5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdEN1cnZlLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMuYVggPSBzb3VyY2UuYVg7XG5cdHRoaXMuYVkgPSBzb3VyY2UuYVk7XG5cblx0dGhpcy54UmFkaXVzID0gc291cmNlLnhSYWRpdXM7XG5cdHRoaXMueVJhZGl1cyA9IHNvdXJjZS55UmFkaXVzO1xuXG5cdHRoaXMuYVN0YXJ0QW5nbGUgPSBzb3VyY2UuYVN0YXJ0QW5nbGU7XG5cdHRoaXMuYUVuZEFuZ2xlID0gc291cmNlLmFFbmRBbmdsZTtcblxuXHR0aGlzLmFDbG9ja3dpc2UgPSBzb3VyY2UuYUNsb2Nrd2lzZTtcblxuXHR0aGlzLmFSb3RhdGlvbiA9IHNvdXJjZS5hUm90YXRpb247XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cblxuRWxsaXBzZUN1cnZlLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoKSB7XG5cblx0dmFyIGRhdGEgPSBDdXJ2ZS5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMgKTtcblxuXHRkYXRhLmFYID0gdGhpcy5hWDtcblx0ZGF0YS5hWSA9IHRoaXMuYVk7XG5cblx0ZGF0YS54UmFkaXVzID0gdGhpcy54UmFkaXVzO1xuXHRkYXRhLnlSYWRpdXMgPSB0aGlzLnlSYWRpdXM7XG5cblx0ZGF0YS5hU3RhcnRBbmdsZSA9IHRoaXMuYVN0YXJ0QW5nbGU7XG5cdGRhdGEuYUVuZEFuZ2xlID0gdGhpcy5hRW5kQW5nbGU7XG5cblx0ZGF0YS5hQ2xvY2t3aXNlID0gdGhpcy5hQ2xvY2t3aXNlO1xuXG5cdGRhdGEuYVJvdGF0aW9uID0gdGhpcy5hUm90YXRpb247XG5cblx0cmV0dXJuIGRhdGE7XG5cbn07XG5cbkVsbGlwc2VDdXJ2ZS5wcm90b3R5cGUuZnJvbUpTT04gPSBmdW5jdGlvbiAoIGpzb24gKSB7XG5cblx0Q3VydmUucHJvdG90eXBlLmZyb21KU09OLmNhbGwoIHRoaXMsIGpzb24gKTtcblxuXHR0aGlzLmFYID0ganNvbi5hWDtcblx0dGhpcy5hWSA9IGpzb24uYVk7XG5cblx0dGhpcy54UmFkaXVzID0ganNvbi54UmFkaXVzO1xuXHR0aGlzLnlSYWRpdXMgPSBqc29uLnlSYWRpdXM7XG5cblx0dGhpcy5hU3RhcnRBbmdsZSA9IGpzb24uYVN0YXJ0QW5nbGU7XG5cdHRoaXMuYUVuZEFuZ2xlID0ganNvbi5hRW5kQW5nbGU7XG5cblx0dGhpcy5hQ2xvY2t3aXNlID0ganNvbi5hQ2xvY2t3aXNlO1xuXG5cdHRoaXMuYVJvdGF0aW9uID0ganNvbi5hUm90YXRpb247XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cbmZ1bmN0aW9uIEFyY0N1cnZlKCBhWCwgYVksIGFSYWRpdXMsIGFTdGFydEFuZ2xlLCBhRW5kQW5nbGUsIGFDbG9ja3dpc2UgKSB7XG5cblx0RWxsaXBzZUN1cnZlLmNhbGwoIHRoaXMsIGFYLCBhWSwgYVJhZGl1cywgYVJhZGl1cywgYVN0YXJ0QW5nbGUsIGFFbmRBbmdsZSwgYUNsb2Nrd2lzZSApO1xuXG5cdHRoaXMudHlwZSA9ICdBcmNDdXJ2ZSc7XG5cbn1cblxuQXJjQ3VydmUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggRWxsaXBzZUN1cnZlLnByb3RvdHlwZSApO1xuQXJjQ3VydmUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQXJjQ3VydmU7XG5cbkFyY0N1cnZlLnByb3RvdHlwZS5pc0FyY0N1cnZlID0gdHJ1ZTtcblxuLyoqXG4gKiBAYXV0aG9yIHp6ODUgaHR0cHM6Ly9naXRodWIuY29tL3p6ODVcbiAqXG4gKiBDZW50cmlwZXRhbCBDYXRtdWxsUm9tIEN1cnZlIC0gd2hpY2ggaXMgdXNlZnVsIGZvciBhdm9pZGluZ1xuICogY3VzcHMgYW5kIHNlbGYtaW50ZXJzZWN0aW9ucyBpbiBub24tdW5pZm9ybSBjYXRtdWxsIHJvbSBjdXJ2ZXMuXG4gKiBodHRwOi8vd3d3LmNlbXl1a3NlbC5jb20vcmVzZWFyY2gvY2F0bXVsbHJvbV9wYXJhbS9jYXRtdWxscm9tLnBkZlxuICpcbiAqIGN1cnZlLnR5cGUgYWNjZXB0cyBjZW50cmlwZXRhbChkZWZhdWx0KSwgY2hvcmRhbCBhbmQgY2F0bXVsbHJvbVxuICogY3VydmUudGVuc2lvbiBpcyB1c2VkIGZvciBjYXRtdWxscm9tIHdoaWNoIGRlZmF1bHRzIHRvIDAuNVxuICovXG5cblxuLypcbkJhc2VkIG9uIGFuIG9wdGltaXplZCBjKysgc29sdXRpb24gaW5cbiAtIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvOTQ4OTczNi9jYXRtdWxsLXJvbS1jdXJ2ZS13aXRoLW5vLWN1c3BzLWFuZC1uby1zZWxmLWludGVyc2VjdGlvbnMvXG4gLSBodHRwOi8vaWRlb25lLmNvbS9Ob0ViVk1cblxuVGhpcyBDdWJpY1BvbHkgY2xhc3MgY291bGQgYmUgdXNlZCBmb3IgcmV1c2luZyBzb21lIHZhcmlhYmxlcyBhbmQgY2FsY3VsYXRpb25zLFxuYnV0IGZvciB0aHJlZS5qcyBjdXJ2ZSB1c2UsIGl0IGNvdWxkIGJlIHBvc3NpYmxlIGlubGluZWQgYW5kIGZsYXR0ZW4gaW50byBhIHNpbmdsZSBmdW5jdGlvbiBjYWxsXG53aGljaCBjYW4gYmUgcGxhY2VkIGluIEN1cnZlVXRpbHMuXG4qL1xuXG5mdW5jdGlvbiBDdWJpY1BvbHkoKSB7XG5cblx0dmFyIGMwID0gMCwgYzEgPSAwLCBjMiA9IDAsIGMzID0gMDtcblxuXHQvKlxuXHQgKiBDb21wdXRlIGNvZWZmaWNpZW50cyBmb3IgYSBjdWJpYyBwb2x5bm9taWFsXG5cdCAqICAgcChzKSA9IGMwICsgYzEqcyArIGMyKnNeMiArIGMzKnNeM1xuXHQgKiBzdWNoIHRoYXRcblx0ICogICBwKDApID0geDAsIHAoMSkgPSB4MVxuXHQgKiAgYW5kXG5cdCAqICAgcCcoMCkgPSB0MCwgcCcoMSkgPSB0MS5cblx0ICovXG5cdGZ1bmN0aW9uIGluaXQoIHgwLCB4MSwgdDAsIHQxICkge1xuXG5cdFx0YzAgPSB4MDtcblx0XHRjMSA9IHQwO1xuXHRcdGMyID0gLSAzICogeDAgKyAzICogeDEgLSAyICogdDAgLSB0MTtcblx0XHRjMyA9IDIgKiB4MCAtIDIgKiB4MSArIHQwICsgdDE7XG5cblx0fVxuXG5cdHJldHVybiB7XG5cblx0XHRpbml0Q2F0bXVsbFJvbTogZnVuY3Rpb24gKCB4MCwgeDEsIHgyLCB4MywgdGVuc2lvbiApIHtcblxuXHRcdFx0aW5pdCggeDEsIHgyLCB0ZW5zaW9uICogKCB4MiAtIHgwICksIHRlbnNpb24gKiAoIHgzIC0geDEgKSApO1xuXG5cdFx0fSxcblxuXHRcdGluaXROb251bmlmb3JtQ2F0bXVsbFJvbTogZnVuY3Rpb24gKCB4MCwgeDEsIHgyLCB4MywgZHQwLCBkdDEsIGR0MiApIHtcblxuXHRcdFx0Ly8gY29tcHV0ZSB0YW5nZW50cyB3aGVuIHBhcmFtZXRlcml6ZWQgaW4gW3QxLHQyXVxuXHRcdFx0dmFyIHQxID0gKCB4MSAtIHgwICkgLyBkdDAgLSAoIHgyIC0geDAgKSAvICggZHQwICsgZHQxICkgKyAoIHgyIC0geDEgKSAvIGR0MTtcblx0XHRcdHZhciB0MiA9ICggeDIgLSB4MSApIC8gZHQxIC0gKCB4MyAtIHgxICkgLyAoIGR0MSArIGR0MiApICsgKCB4MyAtIHgyICkgLyBkdDI7XG5cblx0XHRcdC8vIHJlc2NhbGUgdGFuZ2VudHMgZm9yIHBhcmFtZXRyaXphdGlvbiBpbiBbMCwxXVxuXHRcdFx0dDEgKj0gZHQxO1xuXHRcdFx0dDIgKj0gZHQxO1xuXG5cdFx0XHRpbml0KCB4MSwgeDIsIHQxLCB0MiApO1xuXG5cdFx0fSxcblxuXHRcdGNhbGM6IGZ1bmN0aW9uICggdCApIHtcblxuXHRcdFx0dmFyIHQyID0gdCAqIHQ7XG5cdFx0XHR2YXIgdDMgPSB0MiAqIHQ7XG5cdFx0XHRyZXR1cm4gYzAgKyBjMSAqIHQgKyBjMiAqIHQyICsgYzMgKiB0MztcblxuXHRcdH1cblxuXHR9O1xuXG59XG5cbi8vXG5cbnZhciB0bXAgPSBuZXcgVmVjdG9yMygpO1xudmFyIHB4JDEgPSBuZXcgQ3ViaWNQb2x5KCk7XG52YXIgcHkgPSBuZXcgQ3ViaWNQb2x5KCk7XG52YXIgcHogPSBuZXcgQ3ViaWNQb2x5KCk7XG5cbmZ1bmN0aW9uIENhdG11bGxSb21DdXJ2ZTMoIHBvaW50cywgY2xvc2VkLCBjdXJ2ZVR5cGUsIHRlbnNpb24gKSB7XG5cblx0Q3VydmUuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdDYXRtdWxsUm9tQ3VydmUzJztcblxuXHR0aGlzLnBvaW50cyA9IHBvaW50cyB8fCBbXTtcblx0dGhpcy5jbG9zZWQgPSBjbG9zZWQgfHwgZmFsc2U7XG5cdHRoaXMuY3VydmVUeXBlID0gY3VydmVUeXBlIHx8ICdjZW50cmlwZXRhbCc7XG5cdHRoaXMudGVuc2lvbiA9IHRlbnNpb24gfHwgMC41O1xuXG59XG5cbkNhdG11bGxSb21DdXJ2ZTMucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQ3VydmUucHJvdG90eXBlICk7XG5DYXRtdWxsUm9tQ3VydmUzLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IENhdG11bGxSb21DdXJ2ZTM7XG5cbkNhdG11bGxSb21DdXJ2ZTMucHJvdG90eXBlLmlzQ2F0bXVsbFJvbUN1cnZlMyA9IHRydWU7XG5cbkNhdG11bGxSb21DdXJ2ZTMucHJvdG90eXBlLmdldFBvaW50ID0gZnVuY3Rpb24gKCB0LCBvcHRpb25hbFRhcmdldCApIHtcblxuXHR2YXIgcG9pbnQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMygpO1xuXG5cdHZhciBwb2ludHMgPSB0aGlzLnBvaW50cztcblx0dmFyIGwgPSBwb2ludHMubGVuZ3RoO1xuXG5cdHZhciBwID0gKCBsIC0gKCB0aGlzLmNsb3NlZCA/IDAgOiAxICkgKSAqIHQ7XG5cdHZhciBpbnRQb2ludCA9IE1hdGguZmxvb3IoIHAgKTtcblx0dmFyIHdlaWdodCA9IHAgLSBpbnRQb2ludDtcblxuXHRpZiAoIHRoaXMuY2xvc2VkICkge1xuXG5cdFx0aW50UG9pbnQgKz0gaW50UG9pbnQgPiAwID8gMCA6ICggTWF0aC5mbG9vciggTWF0aC5hYnMoIGludFBvaW50ICkgLyBsICkgKyAxICkgKiBsO1xuXG5cdH0gZWxzZSBpZiAoIHdlaWdodCA9PT0gMCAmJiBpbnRQb2ludCA9PT0gbCAtIDEgKSB7XG5cblx0XHRpbnRQb2ludCA9IGwgLSAyO1xuXHRcdHdlaWdodCA9IDE7XG5cblx0fVxuXG5cdHZhciBwMCwgcDEsIHAyLCBwMzsgLy8gNCBwb2ludHNcblxuXHRpZiAoIHRoaXMuY2xvc2VkIHx8IGludFBvaW50ID4gMCApIHtcblxuXHRcdHAwID0gcG9pbnRzWyAoIGludFBvaW50IC0gMSApICUgbCBdO1xuXG5cdH0gZWxzZSB7XG5cblx0XHQvLyBleHRyYXBvbGF0ZSBmaXJzdCBwb2ludFxuXHRcdHRtcC5zdWJWZWN0b3JzKCBwb2ludHNbIDAgXSwgcG9pbnRzWyAxIF0gKS5hZGQoIHBvaW50c1sgMCBdICk7XG5cdFx0cDAgPSB0bXA7XG5cblx0fVxuXG5cdHAxID0gcG9pbnRzWyBpbnRQb2ludCAlIGwgXTtcblx0cDIgPSBwb2ludHNbICggaW50UG9pbnQgKyAxICkgJSBsIF07XG5cblx0aWYgKCB0aGlzLmNsb3NlZCB8fCBpbnRQb2ludCArIDIgPCBsICkge1xuXG5cdFx0cDMgPSBwb2ludHNbICggaW50UG9pbnQgKyAyICkgJSBsIF07XG5cblx0fSBlbHNlIHtcblxuXHRcdC8vIGV4dHJhcG9sYXRlIGxhc3QgcG9pbnRcblx0XHR0bXAuc3ViVmVjdG9ycyggcG9pbnRzWyBsIC0gMSBdLCBwb2ludHNbIGwgLSAyIF0gKS5hZGQoIHBvaW50c1sgbCAtIDEgXSApO1xuXHRcdHAzID0gdG1wO1xuXG5cdH1cblxuXHRpZiAoIHRoaXMuY3VydmVUeXBlID09PSAnY2VudHJpcGV0YWwnIHx8IHRoaXMuY3VydmVUeXBlID09PSAnY2hvcmRhbCcgKSB7XG5cblx0XHQvLyBpbml0IENlbnRyaXBldGFsIC8gQ2hvcmRhbCBDYXRtdWxsLVJvbVxuXHRcdHZhciBwb3cgPSB0aGlzLmN1cnZlVHlwZSA9PT0gJ2Nob3JkYWwnID8gMC41IDogMC4yNTtcblx0XHR2YXIgZHQwID0gTWF0aC5wb3coIHAwLmRpc3RhbmNlVG9TcXVhcmVkKCBwMSApLCBwb3cgKTtcblx0XHR2YXIgZHQxID0gTWF0aC5wb3coIHAxLmRpc3RhbmNlVG9TcXVhcmVkKCBwMiApLCBwb3cgKTtcblx0XHR2YXIgZHQyID0gTWF0aC5wb3coIHAyLmRpc3RhbmNlVG9TcXVhcmVkKCBwMyApLCBwb3cgKTtcblxuXHRcdC8vIHNhZmV0eSBjaGVjayBmb3IgcmVwZWF0ZWQgcG9pbnRzXG5cdFx0aWYgKCBkdDEgPCAxZS00ICkgZHQxID0gMS4wO1xuXHRcdGlmICggZHQwIDwgMWUtNCApIGR0MCA9IGR0MTtcblx0XHRpZiAoIGR0MiA8IDFlLTQgKSBkdDIgPSBkdDE7XG5cblx0XHRweCQxLmluaXROb251bmlmb3JtQ2F0bXVsbFJvbSggcDAueCwgcDEueCwgcDIueCwgcDMueCwgZHQwLCBkdDEsIGR0MiApO1xuXHRcdHB5LmluaXROb251bmlmb3JtQ2F0bXVsbFJvbSggcDAueSwgcDEueSwgcDIueSwgcDMueSwgZHQwLCBkdDEsIGR0MiApO1xuXHRcdHB6LmluaXROb251bmlmb3JtQ2F0bXVsbFJvbSggcDAueiwgcDEueiwgcDIueiwgcDMueiwgZHQwLCBkdDEsIGR0MiApO1xuXG5cdH0gZWxzZSBpZiAoIHRoaXMuY3VydmVUeXBlID09PSAnY2F0bXVsbHJvbScgKSB7XG5cblx0XHRweCQxLmluaXRDYXRtdWxsUm9tKCBwMC54LCBwMS54LCBwMi54LCBwMy54LCB0aGlzLnRlbnNpb24gKTtcblx0XHRweS5pbml0Q2F0bXVsbFJvbSggcDAueSwgcDEueSwgcDIueSwgcDMueSwgdGhpcy50ZW5zaW9uICk7XG5cdFx0cHouaW5pdENhdG11bGxSb20oIHAwLnosIHAxLnosIHAyLnosIHAzLnosIHRoaXMudGVuc2lvbiApO1xuXG5cdH1cblxuXHRwb2ludC5zZXQoXG5cdFx0cHgkMS5jYWxjKCB3ZWlnaHQgKSxcblx0XHRweS5jYWxjKCB3ZWlnaHQgKSxcblx0XHRwei5jYWxjKCB3ZWlnaHQgKVxuXHQpO1xuXG5cdHJldHVybiBwb2ludDtcblxufTtcblxuQ2F0bXVsbFJvbUN1cnZlMy5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdEN1cnZlLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMucG9pbnRzID0gW107XG5cblx0Zm9yICggdmFyIGkgPSAwLCBsID0gc291cmNlLnBvaW50cy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0dmFyIHBvaW50ID0gc291cmNlLnBvaW50c1sgaSBdO1xuXG5cdFx0dGhpcy5wb2ludHMucHVzaCggcG9pbnQuY2xvbmUoKSApO1xuXG5cdH1cblxuXHR0aGlzLmNsb3NlZCA9IHNvdXJjZS5jbG9zZWQ7XG5cdHRoaXMuY3VydmVUeXBlID0gc291cmNlLmN1cnZlVHlwZTtcblx0dGhpcy50ZW5zaW9uID0gc291cmNlLnRlbnNpb247XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cbkNhdG11bGxSb21DdXJ2ZTMucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uICgpIHtcblxuXHR2YXIgZGF0YSA9IEN1cnZlLnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcyApO1xuXG5cdGRhdGEucG9pbnRzID0gW107XG5cblx0Zm9yICggdmFyIGkgPSAwLCBsID0gdGhpcy5wb2ludHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdHZhciBwb2ludCA9IHRoaXMucG9pbnRzWyBpIF07XG5cdFx0ZGF0YS5wb2ludHMucHVzaCggcG9pbnQudG9BcnJheSgpICk7XG5cblx0fVxuXG5cdGRhdGEuY2xvc2VkID0gdGhpcy5jbG9zZWQ7XG5cdGRhdGEuY3VydmVUeXBlID0gdGhpcy5jdXJ2ZVR5cGU7XG5cdGRhdGEudGVuc2lvbiA9IHRoaXMudGVuc2lvbjtcblxuXHRyZXR1cm4gZGF0YTtcblxufTtcblxuQ2F0bXVsbFJvbUN1cnZlMy5wcm90b3R5cGUuZnJvbUpTT04gPSBmdW5jdGlvbiAoIGpzb24gKSB7XG5cblx0Q3VydmUucHJvdG90eXBlLmZyb21KU09OLmNhbGwoIHRoaXMsIGpzb24gKTtcblxuXHR0aGlzLnBvaW50cyA9IFtdO1xuXG5cdGZvciAoIHZhciBpID0gMCwgbCA9IGpzb24ucG9pbnRzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHR2YXIgcG9pbnQgPSBqc29uLnBvaW50c1sgaSBdO1xuXHRcdHRoaXMucG9pbnRzLnB1c2goIG5ldyBWZWN0b3IzKCkuZnJvbUFycmF5KCBwb2ludCApICk7XG5cblx0fVxuXG5cdHRoaXMuY2xvc2VkID0ganNvbi5jbG9zZWQ7XG5cdHRoaXMuY3VydmVUeXBlID0ganNvbi5jdXJ2ZVR5cGU7XG5cdHRoaXMudGVuc2lvbiA9IGpzb24udGVuc2lvbjtcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIHp6ODUgLyBodHRwOi8vd3d3LmxhYjRnYW1lcy5uZXQveno4NS9ibG9nXG4gKlxuICogQmV6aWVyIEN1cnZlcyBmb3JtdWxhcyBvYnRhaW5lZCBmcm9tXG4gKiBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0LDqXppZXJfY3VydmVcbiAqL1xuXG5mdW5jdGlvbiBDYXRtdWxsUm9tKCB0LCBwMCwgcDEsIHAyLCBwMyApIHtcblxuXHR2YXIgdjAgPSAoIHAyIC0gcDAgKSAqIDAuNTtcblx0dmFyIHYxID0gKCBwMyAtIHAxICkgKiAwLjU7XG5cdHZhciB0MiA9IHQgKiB0O1xuXHR2YXIgdDMgPSB0ICogdDI7XG5cdHJldHVybiAoIDIgKiBwMSAtIDIgKiBwMiArIHYwICsgdjEgKSAqIHQzICsgKCAtIDMgKiBwMSArIDMgKiBwMiAtIDIgKiB2MCAtIHYxICkgKiB0MiArIHYwICogdCArIHAxO1xuXG59XG5cbi8vXG5cbmZ1bmN0aW9uIFF1YWRyYXRpY0JlemllclAwKCB0LCBwICkge1xuXG5cdHZhciBrID0gMSAtIHQ7XG5cdHJldHVybiBrICogayAqIHA7XG5cbn1cblxuZnVuY3Rpb24gUXVhZHJhdGljQmV6aWVyUDEoIHQsIHAgKSB7XG5cblx0cmV0dXJuIDIgKiAoIDEgLSB0ICkgKiB0ICogcDtcblxufVxuXG5mdW5jdGlvbiBRdWFkcmF0aWNCZXppZXJQMiggdCwgcCApIHtcblxuXHRyZXR1cm4gdCAqIHQgKiBwO1xuXG59XG5cbmZ1bmN0aW9uIFF1YWRyYXRpY0JlemllciggdCwgcDAsIHAxLCBwMiApIHtcblxuXHRyZXR1cm4gUXVhZHJhdGljQmV6aWVyUDAoIHQsIHAwICkgKyBRdWFkcmF0aWNCZXppZXJQMSggdCwgcDEgKSArXG5cdFx0UXVhZHJhdGljQmV6aWVyUDIoIHQsIHAyICk7XG5cbn1cblxuLy9cblxuZnVuY3Rpb24gQ3ViaWNCZXppZXJQMCggdCwgcCApIHtcblxuXHR2YXIgayA9IDEgLSB0O1xuXHRyZXR1cm4gayAqIGsgKiBrICogcDtcblxufVxuXG5mdW5jdGlvbiBDdWJpY0JlemllclAxKCB0LCBwICkge1xuXG5cdHZhciBrID0gMSAtIHQ7XG5cdHJldHVybiAzICogayAqIGsgKiB0ICogcDtcblxufVxuXG5mdW5jdGlvbiBDdWJpY0JlemllclAyKCB0LCBwICkge1xuXG5cdHJldHVybiAzICogKCAxIC0gdCApICogdCAqIHQgKiBwO1xuXG59XG5cbmZ1bmN0aW9uIEN1YmljQmV6aWVyUDMoIHQsIHAgKSB7XG5cblx0cmV0dXJuIHQgKiB0ICogdCAqIHA7XG5cbn1cblxuZnVuY3Rpb24gQ3ViaWNCZXppZXIoIHQsIHAwLCBwMSwgcDIsIHAzICkge1xuXG5cdHJldHVybiBDdWJpY0JlemllclAwKCB0LCBwMCApICsgQ3ViaWNCZXppZXJQMSggdCwgcDEgKSArIEN1YmljQmV6aWVyUDIoIHQsIHAyICkgK1xuXHRcdEN1YmljQmV6aWVyUDMoIHQsIHAzICk7XG5cbn1cblxuZnVuY3Rpb24gQ3ViaWNCZXppZXJDdXJ2ZSggdjAsIHYxLCB2MiwgdjMgKSB7XG5cblx0Q3VydmUuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdDdWJpY0JlemllckN1cnZlJztcblxuXHR0aGlzLnYwID0gdjAgfHwgbmV3IFZlY3RvcjIoKTtcblx0dGhpcy52MSA9IHYxIHx8IG5ldyBWZWN0b3IyKCk7XG5cdHRoaXMudjIgPSB2MiB8fCBuZXcgVmVjdG9yMigpO1xuXHR0aGlzLnYzID0gdjMgfHwgbmV3IFZlY3RvcjIoKTtcblxufVxuXG5DdWJpY0JlemllckN1cnZlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEN1cnZlLnByb3RvdHlwZSApO1xuQ3ViaWNCZXppZXJDdXJ2ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDdWJpY0JlemllckN1cnZlO1xuXG5DdWJpY0JlemllckN1cnZlLnByb3RvdHlwZS5pc0N1YmljQmV6aWVyQ3VydmUgPSB0cnVlO1xuXG5DdWJpY0JlemllckN1cnZlLnByb3RvdHlwZS5nZXRQb2ludCA9IGZ1bmN0aW9uICggdCwgb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0dmFyIHBvaW50ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IFZlY3RvcjIoKTtcblxuXHR2YXIgdjAgPSB0aGlzLnYwLCB2MSA9IHRoaXMudjEsIHYyID0gdGhpcy52MiwgdjMgPSB0aGlzLnYzO1xuXG5cdHBvaW50LnNldChcblx0XHRDdWJpY0JlemllciggdCwgdjAueCwgdjEueCwgdjIueCwgdjMueCApLFxuXHRcdEN1YmljQmV6aWVyKCB0LCB2MC55LCB2MS55LCB2Mi55LCB2My55IClcblx0KTtcblxuXHRyZXR1cm4gcG9pbnQ7XG5cbn07XG5cbkN1YmljQmV6aWVyQ3VydmUucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRDdXJ2ZS5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHR0aGlzLnYwLmNvcHkoIHNvdXJjZS52MCApO1xuXHR0aGlzLnYxLmNvcHkoIHNvdXJjZS52MSApO1xuXHR0aGlzLnYyLmNvcHkoIHNvdXJjZS52MiApO1xuXHR0aGlzLnYzLmNvcHkoIHNvdXJjZS52MyApO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG5DdWJpY0JlemllckN1cnZlLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoKSB7XG5cblx0dmFyIGRhdGEgPSBDdXJ2ZS5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMgKTtcblxuXHRkYXRhLnYwID0gdGhpcy52MC50b0FycmF5KCk7XG5cdGRhdGEudjEgPSB0aGlzLnYxLnRvQXJyYXkoKTtcblx0ZGF0YS52MiA9IHRoaXMudjIudG9BcnJheSgpO1xuXHRkYXRhLnYzID0gdGhpcy52My50b0FycmF5KCk7XG5cblx0cmV0dXJuIGRhdGE7XG5cbn07XG5cbkN1YmljQmV6aWVyQ3VydmUucHJvdG90eXBlLmZyb21KU09OID0gZnVuY3Rpb24gKCBqc29uICkge1xuXG5cdEN1cnZlLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKCB0aGlzLCBqc29uICk7XG5cblx0dGhpcy52MC5mcm9tQXJyYXkoIGpzb24udjAgKTtcblx0dGhpcy52MS5mcm9tQXJyYXkoIGpzb24udjEgKTtcblx0dGhpcy52Mi5mcm9tQXJyYXkoIGpzb24udjIgKTtcblx0dGhpcy52My5mcm9tQXJyYXkoIGpzb24udjMgKTtcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuZnVuY3Rpb24gQ3ViaWNCZXppZXJDdXJ2ZTMoIHYwLCB2MSwgdjIsIHYzICkge1xuXG5cdEN1cnZlLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnQ3ViaWNCZXppZXJDdXJ2ZTMnO1xuXG5cdHRoaXMudjAgPSB2MCB8fCBuZXcgVmVjdG9yMygpO1xuXHR0aGlzLnYxID0gdjEgfHwgbmV3IFZlY3RvcjMoKTtcblx0dGhpcy52MiA9IHYyIHx8IG5ldyBWZWN0b3IzKCk7XG5cdHRoaXMudjMgPSB2MyB8fCBuZXcgVmVjdG9yMygpO1xuXG59XG5cbkN1YmljQmV6aWVyQ3VydmUzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEN1cnZlLnByb3RvdHlwZSApO1xuQ3ViaWNCZXppZXJDdXJ2ZTMucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ3ViaWNCZXppZXJDdXJ2ZTM7XG5cbkN1YmljQmV6aWVyQ3VydmUzLnByb3RvdHlwZS5pc0N1YmljQmV6aWVyQ3VydmUzID0gdHJ1ZTtcblxuQ3ViaWNCZXppZXJDdXJ2ZTMucHJvdG90eXBlLmdldFBvaW50ID0gZnVuY3Rpb24gKCB0LCBvcHRpb25hbFRhcmdldCApIHtcblxuXHR2YXIgcG9pbnQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMygpO1xuXG5cdHZhciB2MCA9IHRoaXMudjAsIHYxID0gdGhpcy52MSwgdjIgPSB0aGlzLnYyLCB2MyA9IHRoaXMudjM7XG5cblx0cG9pbnQuc2V0KFxuXHRcdEN1YmljQmV6aWVyKCB0LCB2MC54LCB2MS54LCB2Mi54LCB2My54ICksXG5cdFx0Q3ViaWNCZXppZXIoIHQsIHYwLnksIHYxLnksIHYyLnksIHYzLnkgKSxcblx0XHRDdWJpY0JlemllciggdCwgdjAueiwgdjEueiwgdjIueiwgdjMueiApXG5cdCk7XG5cblx0cmV0dXJuIHBvaW50O1xuXG59O1xuXG5DdWJpY0JlemllckN1cnZlMy5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdEN1cnZlLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMudjAuY29weSggc291cmNlLnYwICk7XG5cdHRoaXMudjEuY29weSggc291cmNlLnYxICk7XG5cdHRoaXMudjIuY29weSggc291cmNlLnYyICk7XG5cdHRoaXMudjMuY29weSggc291cmNlLnYzICk7XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cbkN1YmljQmV6aWVyQ3VydmUzLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoKSB7XG5cblx0dmFyIGRhdGEgPSBDdXJ2ZS5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMgKTtcblxuXHRkYXRhLnYwID0gdGhpcy52MC50b0FycmF5KCk7XG5cdGRhdGEudjEgPSB0aGlzLnYxLnRvQXJyYXkoKTtcblx0ZGF0YS52MiA9IHRoaXMudjIudG9BcnJheSgpO1xuXHRkYXRhLnYzID0gdGhpcy52My50b0FycmF5KCk7XG5cblx0cmV0dXJuIGRhdGE7XG5cbn07XG5cbkN1YmljQmV6aWVyQ3VydmUzLnByb3RvdHlwZS5mcm9tSlNPTiA9IGZ1bmN0aW9uICgganNvbiApIHtcblxuXHRDdXJ2ZS5wcm90b3R5cGUuZnJvbUpTT04uY2FsbCggdGhpcywganNvbiApO1xuXG5cdHRoaXMudjAuZnJvbUFycmF5KCBqc29uLnYwICk7XG5cdHRoaXMudjEuZnJvbUFycmF5KCBqc29uLnYxICk7XG5cdHRoaXMudjIuZnJvbUFycmF5KCBqc29uLnYyICk7XG5cdHRoaXMudjMuZnJvbUFycmF5KCBqc29uLnYzICk7XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cbmZ1bmN0aW9uIExpbmVDdXJ2ZSggdjEsIHYyICkge1xuXG5cdEN1cnZlLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnTGluZUN1cnZlJztcblxuXHR0aGlzLnYxID0gdjEgfHwgbmV3IFZlY3RvcjIoKTtcblx0dGhpcy52MiA9IHYyIHx8IG5ldyBWZWN0b3IyKCk7XG5cbn1cblxuTGluZUN1cnZlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEN1cnZlLnByb3RvdHlwZSApO1xuTGluZUN1cnZlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IExpbmVDdXJ2ZTtcblxuTGluZUN1cnZlLnByb3RvdHlwZS5pc0xpbmVDdXJ2ZSA9IHRydWU7XG5cbkxpbmVDdXJ2ZS5wcm90b3R5cGUuZ2V0UG9pbnQgPSBmdW5jdGlvbiAoIHQsIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdHZhciBwb2ludCA9IG9wdGlvbmFsVGFyZ2V0IHx8IG5ldyBWZWN0b3IyKCk7XG5cblx0aWYgKCB0ID09PSAxICkge1xuXG5cdFx0cG9pbnQuY29weSggdGhpcy52MiApO1xuXG5cdH0gZWxzZSB7XG5cblx0XHRwb2ludC5jb3B5KCB0aGlzLnYyICkuc3ViKCB0aGlzLnYxICk7XG5cdFx0cG9pbnQubXVsdGlwbHlTY2FsYXIoIHQgKS5hZGQoIHRoaXMudjEgKTtcblxuXHR9XG5cblx0cmV0dXJuIHBvaW50O1xuXG59O1xuXG4vLyBMaW5lIGN1cnZlIGlzIGxpbmVhciwgc28gd2UgY2FuIG92ZXJ3cml0ZSBkZWZhdWx0IGdldFBvaW50QXRcblxuTGluZUN1cnZlLnByb3RvdHlwZS5nZXRQb2ludEF0ID0gZnVuY3Rpb24gKCB1LCBvcHRpb25hbFRhcmdldCApIHtcblxuXHRyZXR1cm4gdGhpcy5nZXRQb2ludCggdSwgb3B0aW9uYWxUYXJnZXQgKTtcblxufTtcblxuTGluZUN1cnZlLnByb3RvdHlwZS5nZXRUYW5nZW50ID0gZnVuY3Rpb24gKCAvKiB0ICovICkge1xuXG5cdHZhciB0YW5nZW50ID0gdGhpcy52Mi5jbG9uZSgpLnN1YiggdGhpcy52MSApO1xuXG5cdHJldHVybiB0YW5nZW50Lm5vcm1hbGl6ZSgpO1xuXG59O1xuXG5MaW5lQ3VydmUucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRDdXJ2ZS5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHR0aGlzLnYxLmNvcHkoIHNvdXJjZS52MSApO1xuXHR0aGlzLnYyLmNvcHkoIHNvdXJjZS52MiApO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG5MaW5lQ3VydmUucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uICgpIHtcblxuXHR2YXIgZGF0YSA9IEN1cnZlLnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcyApO1xuXG5cdGRhdGEudjEgPSB0aGlzLnYxLnRvQXJyYXkoKTtcblx0ZGF0YS52MiA9IHRoaXMudjIudG9BcnJheSgpO1xuXG5cdHJldHVybiBkYXRhO1xuXG59O1xuXG5MaW5lQ3VydmUucHJvdG90eXBlLmZyb21KU09OID0gZnVuY3Rpb24gKCBqc29uICkge1xuXG5cdEN1cnZlLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKCB0aGlzLCBqc29uICk7XG5cblx0dGhpcy52MS5mcm9tQXJyYXkoIGpzb24udjEgKTtcblx0dGhpcy52Mi5mcm9tQXJyYXkoIGpzb24udjIgKTtcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuZnVuY3Rpb24gTGluZUN1cnZlMyggdjEsIHYyICkge1xuXG5cdEN1cnZlLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnTGluZUN1cnZlMyc7XG5cblx0dGhpcy52MSA9IHYxIHx8IG5ldyBWZWN0b3IzKCk7XG5cdHRoaXMudjIgPSB2MiB8fCBuZXcgVmVjdG9yMygpO1xuXG59XG5cbkxpbmVDdXJ2ZTMucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQ3VydmUucHJvdG90eXBlICk7XG5MaW5lQ3VydmUzLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IExpbmVDdXJ2ZTM7XG5cbkxpbmVDdXJ2ZTMucHJvdG90eXBlLmlzTGluZUN1cnZlMyA9IHRydWU7XG5cbkxpbmVDdXJ2ZTMucHJvdG90eXBlLmdldFBvaW50ID0gZnVuY3Rpb24gKCB0LCBvcHRpb25hbFRhcmdldCApIHtcblxuXHR2YXIgcG9pbnQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMygpO1xuXG5cdGlmICggdCA9PT0gMSApIHtcblxuXHRcdHBvaW50LmNvcHkoIHRoaXMudjIgKTtcblxuXHR9IGVsc2Uge1xuXG5cdFx0cG9pbnQuY29weSggdGhpcy52MiApLnN1YiggdGhpcy52MSApO1xuXHRcdHBvaW50Lm11bHRpcGx5U2NhbGFyKCB0ICkuYWRkKCB0aGlzLnYxICk7XG5cblx0fVxuXG5cdHJldHVybiBwb2ludDtcblxufTtcblxuLy8gTGluZSBjdXJ2ZSBpcyBsaW5lYXIsIHNvIHdlIGNhbiBvdmVyd3JpdGUgZGVmYXVsdCBnZXRQb2ludEF0XG5cbkxpbmVDdXJ2ZTMucHJvdG90eXBlLmdldFBvaW50QXQgPSBmdW5jdGlvbiAoIHUsIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdHJldHVybiB0aGlzLmdldFBvaW50KCB1LCBvcHRpb25hbFRhcmdldCApO1xuXG59O1xuXG5MaW5lQ3VydmUzLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0Q3VydmUucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0dGhpcy52MS5jb3B5KCBzb3VyY2UudjEgKTtcblx0dGhpcy52Mi5jb3B5KCBzb3VyY2UudjIgKTtcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuTGluZUN1cnZlMy5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gKCkge1xuXG5cdHZhciBkYXRhID0gQ3VydmUucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzICk7XG5cblx0ZGF0YS52MSA9IHRoaXMudjEudG9BcnJheSgpO1xuXHRkYXRhLnYyID0gdGhpcy52Mi50b0FycmF5KCk7XG5cblx0cmV0dXJuIGRhdGE7XG5cbn07XG5cbkxpbmVDdXJ2ZTMucHJvdG90eXBlLmZyb21KU09OID0gZnVuY3Rpb24gKCBqc29uICkge1xuXG5cdEN1cnZlLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKCB0aGlzLCBqc29uICk7XG5cblx0dGhpcy52MS5mcm9tQXJyYXkoIGpzb24udjEgKTtcblx0dGhpcy52Mi5mcm9tQXJyYXkoIGpzb24udjIgKTtcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuZnVuY3Rpb24gUXVhZHJhdGljQmV6aWVyQ3VydmUoIHYwLCB2MSwgdjIgKSB7XG5cblx0Q3VydmUuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdRdWFkcmF0aWNCZXppZXJDdXJ2ZSc7XG5cblx0dGhpcy52MCA9IHYwIHx8IG5ldyBWZWN0b3IyKCk7XG5cdHRoaXMudjEgPSB2MSB8fCBuZXcgVmVjdG9yMigpO1xuXHR0aGlzLnYyID0gdjIgfHwgbmV3IFZlY3RvcjIoKTtcblxufVxuXG5RdWFkcmF0aWNCZXppZXJDdXJ2ZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDdXJ2ZS5wcm90b3R5cGUgKTtcblF1YWRyYXRpY0JlemllckN1cnZlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFF1YWRyYXRpY0JlemllckN1cnZlO1xuXG5RdWFkcmF0aWNCZXppZXJDdXJ2ZS5wcm90b3R5cGUuaXNRdWFkcmF0aWNCZXppZXJDdXJ2ZSA9IHRydWU7XG5cblF1YWRyYXRpY0JlemllckN1cnZlLnByb3RvdHlwZS5nZXRQb2ludCA9IGZ1bmN0aW9uICggdCwgb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0dmFyIHBvaW50ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IFZlY3RvcjIoKTtcblxuXHR2YXIgdjAgPSB0aGlzLnYwLCB2MSA9IHRoaXMudjEsIHYyID0gdGhpcy52MjtcblxuXHRwb2ludC5zZXQoXG5cdFx0UXVhZHJhdGljQmV6aWVyKCB0LCB2MC54LCB2MS54LCB2Mi54ICksXG5cdFx0UXVhZHJhdGljQmV6aWVyKCB0LCB2MC55LCB2MS55LCB2Mi55IClcblx0KTtcblxuXHRyZXR1cm4gcG9pbnQ7XG5cbn07XG5cblF1YWRyYXRpY0JlemllckN1cnZlLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0Q3VydmUucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0dGhpcy52MC5jb3B5KCBzb3VyY2UudjAgKTtcblx0dGhpcy52MS5jb3B5KCBzb3VyY2UudjEgKTtcblx0dGhpcy52Mi5jb3B5KCBzb3VyY2UudjIgKTtcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuUXVhZHJhdGljQmV6aWVyQ3VydmUucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uICgpIHtcblxuXHR2YXIgZGF0YSA9IEN1cnZlLnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcyApO1xuXG5cdGRhdGEudjAgPSB0aGlzLnYwLnRvQXJyYXkoKTtcblx0ZGF0YS52MSA9IHRoaXMudjEudG9BcnJheSgpO1xuXHRkYXRhLnYyID0gdGhpcy52Mi50b0FycmF5KCk7XG5cblx0cmV0dXJuIGRhdGE7XG5cbn07XG5cblF1YWRyYXRpY0JlemllckN1cnZlLnByb3RvdHlwZS5mcm9tSlNPTiA9IGZ1bmN0aW9uICgganNvbiApIHtcblxuXHRDdXJ2ZS5wcm90b3R5cGUuZnJvbUpTT04uY2FsbCggdGhpcywganNvbiApO1xuXG5cdHRoaXMudjAuZnJvbUFycmF5KCBqc29uLnYwICk7XG5cdHRoaXMudjEuZnJvbUFycmF5KCBqc29uLnYxICk7XG5cdHRoaXMudjIuZnJvbUFycmF5KCBqc29uLnYyICk7XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cbmZ1bmN0aW9uIFF1YWRyYXRpY0JlemllckN1cnZlMyggdjAsIHYxLCB2MiApIHtcblxuXHRDdXJ2ZS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1F1YWRyYXRpY0JlemllckN1cnZlMyc7XG5cblx0dGhpcy52MCA9IHYwIHx8IG5ldyBWZWN0b3IzKCk7XG5cdHRoaXMudjEgPSB2MSB8fCBuZXcgVmVjdG9yMygpO1xuXHR0aGlzLnYyID0gdjIgfHwgbmV3IFZlY3RvcjMoKTtcblxufVxuXG5RdWFkcmF0aWNCZXppZXJDdXJ2ZTMucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQ3VydmUucHJvdG90eXBlICk7XG5RdWFkcmF0aWNCZXppZXJDdXJ2ZTMucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUXVhZHJhdGljQmV6aWVyQ3VydmUzO1xuXG5RdWFkcmF0aWNCZXppZXJDdXJ2ZTMucHJvdG90eXBlLmlzUXVhZHJhdGljQmV6aWVyQ3VydmUzID0gdHJ1ZTtcblxuUXVhZHJhdGljQmV6aWVyQ3VydmUzLnByb3RvdHlwZS5nZXRQb2ludCA9IGZ1bmN0aW9uICggdCwgb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0dmFyIHBvaW50ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IFZlY3RvcjMoKTtcblxuXHR2YXIgdjAgPSB0aGlzLnYwLCB2MSA9IHRoaXMudjEsIHYyID0gdGhpcy52MjtcblxuXHRwb2ludC5zZXQoXG5cdFx0UXVhZHJhdGljQmV6aWVyKCB0LCB2MC54LCB2MS54LCB2Mi54ICksXG5cdFx0UXVhZHJhdGljQmV6aWVyKCB0LCB2MC55LCB2MS55LCB2Mi55ICksXG5cdFx0UXVhZHJhdGljQmV6aWVyKCB0LCB2MC56LCB2MS56LCB2Mi56IClcblx0KTtcblxuXHRyZXR1cm4gcG9pbnQ7XG5cbn07XG5cblF1YWRyYXRpY0JlemllckN1cnZlMy5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdEN1cnZlLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMudjAuY29weSggc291cmNlLnYwICk7XG5cdHRoaXMudjEuY29weSggc291cmNlLnYxICk7XG5cdHRoaXMudjIuY29weSggc291cmNlLnYyICk7XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cblF1YWRyYXRpY0JlemllckN1cnZlMy5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gKCkge1xuXG5cdHZhciBkYXRhID0gQ3VydmUucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzICk7XG5cblx0ZGF0YS52MCA9IHRoaXMudjAudG9BcnJheSgpO1xuXHRkYXRhLnYxID0gdGhpcy52MS50b0FycmF5KCk7XG5cdGRhdGEudjIgPSB0aGlzLnYyLnRvQXJyYXkoKTtcblxuXHRyZXR1cm4gZGF0YTtcblxufTtcblxuUXVhZHJhdGljQmV6aWVyQ3VydmUzLnByb3RvdHlwZS5mcm9tSlNPTiA9IGZ1bmN0aW9uICgganNvbiApIHtcblxuXHRDdXJ2ZS5wcm90b3R5cGUuZnJvbUpTT04uY2FsbCggdGhpcywganNvbiApO1xuXG5cdHRoaXMudjAuZnJvbUFycmF5KCBqc29uLnYwICk7XG5cdHRoaXMudjEuZnJvbUFycmF5KCBqc29uLnYxICk7XG5cdHRoaXMudjIuZnJvbUFycmF5KCBqc29uLnYyICk7XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cbmZ1bmN0aW9uIFNwbGluZUN1cnZlKCBwb2ludHMgLyogYXJyYXkgb2YgVmVjdG9yMiAqLyApIHtcblxuXHRDdXJ2ZS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1NwbGluZUN1cnZlJztcblxuXHR0aGlzLnBvaW50cyA9IHBvaW50cyB8fCBbXTtcblxufVxuXG5TcGxpbmVDdXJ2ZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDdXJ2ZS5wcm90b3R5cGUgKTtcblNwbGluZUN1cnZlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFNwbGluZUN1cnZlO1xuXG5TcGxpbmVDdXJ2ZS5wcm90b3R5cGUuaXNTcGxpbmVDdXJ2ZSA9IHRydWU7XG5cblNwbGluZUN1cnZlLnByb3RvdHlwZS5nZXRQb2ludCA9IGZ1bmN0aW9uICggdCwgb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0dmFyIHBvaW50ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IFZlY3RvcjIoKTtcblxuXHR2YXIgcG9pbnRzID0gdGhpcy5wb2ludHM7XG5cdHZhciBwID0gKCBwb2ludHMubGVuZ3RoIC0gMSApICogdDtcblxuXHR2YXIgaW50UG9pbnQgPSBNYXRoLmZsb29yKCBwICk7XG5cdHZhciB3ZWlnaHQgPSBwIC0gaW50UG9pbnQ7XG5cblx0dmFyIHAwID0gcG9pbnRzWyBpbnRQb2ludCA9PT0gMCA/IGludFBvaW50IDogaW50UG9pbnQgLSAxIF07XG5cdHZhciBwMSA9IHBvaW50c1sgaW50UG9pbnQgXTtcblx0dmFyIHAyID0gcG9pbnRzWyBpbnRQb2ludCA+IHBvaW50cy5sZW5ndGggLSAyID8gcG9pbnRzLmxlbmd0aCAtIDEgOiBpbnRQb2ludCArIDEgXTtcblx0dmFyIHAzID0gcG9pbnRzWyBpbnRQb2ludCA+IHBvaW50cy5sZW5ndGggLSAzID8gcG9pbnRzLmxlbmd0aCAtIDEgOiBpbnRQb2ludCArIDIgXTtcblxuXHRwb2ludC5zZXQoXG5cdFx0Q2F0bXVsbFJvbSggd2VpZ2h0LCBwMC54LCBwMS54LCBwMi54LCBwMy54ICksXG5cdFx0Q2F0bXVsbFJvbSggd2VpZ2h0LCBwMC55LCBwMS55LCBwMi55LCBwMy55IClcblx0KTtcblxuXHRyZXR1cm4gcG9pbnQ7XG5cbn07XG5cblNwbGluZUN1cnZlLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0Q3VydmUucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0dGhpcy5wb2ludHMgPSBbXTtcblxuXHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBzb3VyY2UucG9pbnRzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHR2YXIgcG9pbnQgPSBzb3VyY2UucG9pbnRzWyBpIF07XG5cblx0XHR0aGlzLnBvaW50cy5wdXNoKCBwb2ludC5jbG9uZSgpICk7XG5cblx0fVxuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG5TcGxpbmVDdXJ2ZS5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gKCkge1xuXG5cdHZhciBkYXRhID0gQ3VydmUucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzICk7XG5cblx0ZGF0YS5wb2ludHMgPSBbXTtcblxuXHRmb3IgKCB2YXIgaSA9IDAsIGwgPSB0aGlzLnBvaW50cy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0dmFyIHBvaW50ID0gdGhpcy5wb2ludHNbIGkgXTtcblx0XHRkYXRhLnBvaW50cy5wdXNoKCBwb2ludC50b0FycmF5KCkgKTtcblxuXHR9XG5cblx0cmV0dXJuIGRhdGE7XG5cbn07XG5cblNwbGluZUN1cnZlLnByb3RvdHlwZS5mcm9tSlNPTiA9IGZ1bmN0aW9uICgganNvbiApIHtcblxuXHRDdXJ2ZS5wcm90b3R5cGUuZnJvbUpTT04uY2FsbCggdGhpcywganNvbiApO1xuXG5cdHRoaXMucG9pbnRzID0gW107XG5cblx0Zm9yICggdmFyIGkgPSAwLCBsID0ganNvbi5wb2ludHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdHZhciBwb2ludCA9IGpzb24ucG9pbnRzWyBpIF07XG5cdFx0dGhpcy5wb2ludHMucHVzaCggbmV3IFZlY3RvcjIoKS5mcm9tQXJyYXkoIHBvaW50ICkgKTtcblxuXHR9XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cblxuXG52YXIgQ3VydmVzID0gT2JqZWN0LmZyZWV6ZSh7XG5cdEFyY0N1cnZlOiBBcmNDdXJ2ZSxcblx0Q2F0bXVsbFJvbUN1cnZlMzogQ2F0bXVsbFJvbUN1cnZlMyxcblx0Q3ViaWNCZXppZXJDdXJ2ZTogQ3ViaWNCZXppZXJDdXJ2ZSxcblx0Q3ViaWNCZXppZXJDdXJ2ZTM6IEN1YmljQmV6aWVyQ3VydmUzLFxuXHRFbGxpcHNlQ3VydmU6IEVsbGlwc2VDdXJ2ZSxcblx0TGluZUN1cnZlOiBMaW5lQ3VydmUsXG5cdExpbmVDdXJ2ZTM6IExpbmVDdXJ2ZTMsXG5cdFF1YWRyYXRpY0JlemllckN1cnZlOiBRdWFkcmF0aWNCZXppZXJDdXJ2ZSxcblx0UXVhZHJhdGljQmV6aWVyQ3VydmUzOiBRdWFkcmF0aWNCZXppZXJDdXJ2ZTMsXG5cdFNwbGluZUN1cnZlOiBTcGxpbmVDdXJ2ZVxufSk7XG5cbi8qKlxuICogQGF1dGhvciB6ejg1IC8gaHR0cDovL3d3dy5sYWI0Z2FtZXMubmV0L3p6ODUvYmxvZ1xuICpcbiAqKi9cblxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gKlx0Q3VydmVkIFBhdGggLSBhIGN1cnZlIHBhdGggaXMgc2ltcGx5IGEgYXJyYXkgb2YgY29ubmVjdGVkXG4gKiAgY3VydmVzLCBidXQgcmV0YWlucyB0aGUgYXBpIG9mIGEgY3VydmVcbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuZnVuY3Rpb24gQ3VydmVQYXRoKCkge1xuXG5cdEN1cnZlLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnQ3VydmVQYXRoJztcblxuXHR0aGlzLmN1cnZlcyA9IFtdO1xuXHR0aGlzLmF1dG9DbG9zZSA9IGZhbHNlOyAvLyBBdXRvbWF0aWNhbGx5IGNsb3NlcyB0aGUgcGF0aFxuXG59XG5cbkN1cnZlUGF0aC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBDdXJ2ZS5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBDdXJ2ZVBhdGgsXG5cblx0YWRkOiBmdW5jdGlvbiAoIGN1cnZlICkge1xuXG5cdFx0dGhpcy5jdXJ2ZXMucHVzaCggY3VydmUgKTtcblxuXHR9LFxuXG5cdGNsb3NlUGF0aDogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gQWRkIGEgbGluZSBjdXJ2ZSBpZiBzdGFydCBhbmQgZW5kIG9mIGxpbmVzIGFyZSBub3QgY29ubmVjdGVkXG5cdFx0dmFyIHN0YXJ0UG9pbnQgPSB0aGlzLmN1cnZlc1sgMCBdLmdldFBvaW50KCAwICk7XG5cdFx0dmFyIGVuZFBvaW50ID0gdGhpcy5jdXJ2ZXNbIHRoaXMuY3VydmVzLmxlbmd0aCAtIDEgXS5nZXRQb2ludCggMSApO1xuXG5cdFx0aWYgKCAhIHN0YXJ0UG9pbnQuZXF1YWxzKCBlbmRQb2ludCApICkge1xuXG5cdFx0XHR0aGlzLmN1cnZlcy5wdXNoKCBuZXcgTGluZUN1cnZlKCBlbmRQb2ludCwgc3RhcnRQb2ludCApICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHQvLyBUbyBnZXQgYWNjdXJhdGUgcG9pbnQgd2l0aCByZWZlcmVuY2UgdG9cblx0Ly8gZW50aXJlIHBhdGggZGlzdGFuY2UgYXQgdGltZSB0LFxuXHQvLyBmb2xsb3dpbmcgaGFzIHRvIGJlIGRvbmU6XG5cblx0Ly8gMS4gTGVuZ3RoIG9mIGVhY2ggc3ViIHBhdGggaGF2ZSB0byBiZSBrbm93blxuXHQvLyAyLiBMb2NhdGUgYW5kIGlkZW50aWZ5IHR5cGUgb2YgY3VydmVcblx0Ly8gMy4gR2V0IHQgZm9yIHRoZSBjdXJ2ZVxuXHQvLyA0LiBSZXR1cm4gY3VydmUuZ2V0UG9pbnRBdCh0JylcblxuXHRnZXRQb2ludDogZnVuY3Rpb24gKCB0ICkge1xuXG5cdFx0dmFyIGQgPSB0ICogdGhpcy5nZXRMZW5ndGgoKTtcblx0XHR2YXIgY3VydmVMZW5ndGhzID0gdGhpcy5nZXRDdXJ2ZUxlbmd0aHMoKTtcblx0XHR2YXIgaSA9IDA7XG5cblx0XHQvLyBUbyB0aGluayBhYm91dCBib3VuZGFyaWVzIHBvaW50cy5cblxuXHRcdHdoaWxlICggaSA8IGN1cnZlTGVuZ3Rocy5sZW5ndGggKSB7XG5cblx0XHRcdGlmICggY3VydmVMZW5ndGhzWyBpIF0gPj0gZCApIHtcblxuXHRcdFx0XHR2YXIgZGlmZiA9IGN1cnZlTGVuZ3Roc1sgaSBdIC0gZDtcblx0XHRcdFx0dmFyIGN1cnZlID0gdGhpcy5jdXJ2ZXNbIGkgXTtcblxuXHRcdFx0XHR2YXIgc2VnbWVudExlbmd0aCA9IGN1cnZlLmdldExlbmd0aCgpO1xuXHRcdFx0XHR2YXIgdSA9IHNlZ21lbnRMZW5ndGggPT09IDAgPyAwIDogMSAtIGRpZmYgLyBzZWdtZW50TGVuZ3RoO1xuXG5cdFx0XHRcdHJldHVybiBjdXJ2ZS5nZXRQb2ludEF0KCB1ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aSArKztcblxuXHRcdH1cblxuXHRcdHJldHVybiBudWxsO1xuXG5cdFx0Ly8gbG9vcCB3aGVyZSBzdW0gIT0gMCwgc3VtID4gZCAsIHN1bSsxIDxkXG5cblx0fSxcblxuXHQvLyBXZSBjYW5ub3QgdXNlIHRoZSBkZWZhdWx0IFRIUkVFLkN1cnZlIGdldFBvaW50KCkgd2l0aCBnZXRMZW5ndGgoKSBiZWNhdXNlIGluXG5cdC8vIFRIUkVFLkN1cnZlLCBnZXRMZW5ndGgoKSBkZXBlbmRzIG9uIGdldFBvaW50KCkgYnV0IGluIFRIUkVFLkN1cnZlUGF0aFxuXHQvLyBnZXRQb2ludCgpIGRlcGVuZHMgb24gZ2V0TGVuZ3RoXG5cblx0Z2V0TGVuZ3RoOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgbGVucyA9IHRoaXMuZ2V0Q3VydmVMZW5ndGhzKCk7XG5cdFx0cmV0dXJuIGxlbnNbIGxlbnMubGVuZ3RoIC0gMSBdO1xuXG5cdH0sXG5cblx0Ly8gY2FjaGVMZW5ndGhzIG11c3QgYmUgcmVjYWxjdWxhdGVkLlxuXHR1cGRhdGVBcmNMZW5ndGhzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblx0XHR0aGlzLmNhY2hlTGVuZ3RocyA9IG51bGw7XG5cdFx0dGhpcy5nZXRDdXJ2ZUxlbmd0aHMoKTtcblxuXHR9LFxuXG5cdC8vIENvbXB1dGUgbGVuZ3RocyBhbmQgY2FjaGUgdGhlbVxuXHQvLyBXZSBjYW5ub3Qgb3ZlcndyaXRlIGdldExlbmd0aHMoKSBiZWNhdXNlIFV0b1QgbWFwcGluZyB1c2VzIGl0LlxuXG5cdGdldEN1cnZlTGVuZ3RoczogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gV2UgdXNlIGNhY2hlIHZhbHVlcyBpZiBjdXJ2ZXMgYW5kIGNhY2hlIGFycmF5IGFyZSBzYW1lIGxlbmd0aFxuXG5cdFx0aWYgKCB0aGlzLmNhY2hlTGVuZ3RocyAmJiB0aGlzLmNhY2hlTGVuZ3Rocy5sZW5ndGggPT09IHRoaXMuY3VydmVzLmxlbmd0aCApIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMuY2FjaGVMZW5ndGhzO1xuXG5cdFx0fVxuXG5cdFx0Ly8gR2V0IGxlbmd0aCBvZiBzdWItY3VydmVcblx0XHQvLyBQdXNoIHN1bXMgaW50byBjYWNoZWQgYXJyYXlcblxuXHRcdHZhciBsZW5ndGhzID0gW10sIHN1bXMgPSAwO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gdGhpcy5jdXJ2ZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0c3VtcyArPSB0aGlzLmN1cnZlc1sgaSBdLmdldExlbmd0aCgpO1xuXHRcdFx0bGVuZ3Rocy5wdXNoKCBzdW1zICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLmNhY2hlTGVuZ3RocyA9IGxlbmd0aHM7XG5cblx0XHRyZXR1cm4gbGVuZ3RocztcblxuXHR9LFxuXG5cdGdldFNwYWNlZFBvaW50czogZnVuY3Rpb24gKCBkaXZpc2lvbnMgKSB7XG5cblx0XHRpZiAoIGRpdmlzaW9ucyA9PT0gdW5kZWZpbmVkICkgZGl2aXNpb25zID0gNDA7XG5cblx0XHR2YXIgcG9pbnRzID0gW107XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPD0gZGl2aXNpb25zOyBpICsrICkge1xuXG5cdFx0XHRwb2ludHMucHVzaCggdGhpcy5nZXRQb2ludCggaSAvIGRpdmlzaW9ucyApICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIHRoaXMuYXV0b0Nsb3NlICkge1xuXG5cdFx0XHRwb2ludHMucHVzaCggcG9pbnRzWyAwIF0gKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBwb2ludHM7XG5cblx0fSxcblxuXHRnZXRQb2ludHM6IGZ1bmN0aW9uICggZGl2aXNpb25zICkge1xuXG5cdFx0ZGl2aXNpb25zID0gZGl2aXNpb25zIHx8IDEyO1xuXG5cdFx0dmFyIHBvaW50cyA9IFtdLCBsYXN0O1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBjdXJ2ZXMgPSB0aGlzLmN1cnZlczsgaSA8IGN1cnZlcy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdHZhciBjdXJ2ZSA9IGN1cnZlc1sgaSBdO1xuXHRcdFx0dmFyIHJlc29sdXRpb24gPSAoIGN1cnZlICYmIGN1cnZlLmlzRWxsaXBzZUN1cnZlICkgPyBkaXZpc2lvbnMgKiAyXG5cdFx0XHRcdDogKCBjdXJ2ZSAmJiBjdXJ2ZS5pc0xpbmVDdXJ2ZSApID8gMVxuXHRcdFx0XHRcdDogKCBjdXJ2ZSAmJiBjdXJ2ZS5pc1NwbGluZUN1cnZlICkgPyBkaXZpc2lvbnMgKiBjdXJ2ZS5wb2ludHMubGVuZ3RoXG5cdFx0XHRcdFx0XHQ6IGRpdmlzaW9ucztcblxuXHRcdFx0dmFyIHB0cyA9IGN1cnZlLmdldFBvaW50cyggcmVzb2x1dGlvbiApO1xuXG5cdFx0XHRmb3IgKCB2YXIgaiA9IDA7IGogPCBwdHMubGVuZ3RoOyBqICsrICkge1xuXG5cdFx0XHRcdHZhciBwb2ludCA9IHB0c1sgaiBdO1xuXG5cdFx0XHRcdGlmICggbGFzdCAmJiBsYXN0LmVxdWFscyggcG9pbnQgKSApIGNvbnRpbnVlOyAvLyBlbnN1cmVzIG5vIGNvbnNlY3V0aXZlIHBvaW50cyBhcmUgZHVwbGljYXRlc1xuXG5cdFx0XHRcdHBvaW50cy5wdXNoKCBwb2ludCApO1xuXHRcdFx0XHRsYXN0ID0gcG9pbnQ7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5hdXRvQ2xvc2UgJiYgcG9pbnRzLmxlbmd0aCA+IDEgJiYgISBwb2ludHNbIHBvaW50cy5sZW5ndGggLSAxIF0uZXF1YWxzKCBwb2ludHNbIDAgXSApICkge1xuXG5cdFx0XHRwb2ludHMucHVzaCggcG9pbnRzWyAwIF0gKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBwb2ludHM7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRcdEN1cnZlLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdFx0dGhpcy5jdXJ2ZXMgPSBbXTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHNvdXJjZS5jdXJ2ZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGN1cnZlID0gc291cmNlLmN1cnZlc1sgaSBdO1xuXG5cdFx0XHR0aGlzLmN1cnZlcy5wdXNoKCBjdXJ2ZS5jbG9uZSgpICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLmF1dG9DbG9zZSA9IHNvdXJjZS5hdXRvQ2xvc2U7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGRhdGEgPSBDdXJ2ZS5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMgKTtcblxuXHRcdGRhdGEuYXV0b0Nsb3NlID0gdGhpcy5hdXRvQ2xvc2U7XG5cdFx0ZGF0YS5jdXJ2ZXMgPSBbXTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHRoaXMuY3VydmVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBjdXJ2ZSA9IHRoaXMuY3VydmVzWyBpIF07XG5cdFx0XHRkYXRhLmN1cnZlcy5wdXNoKCBjdXJ2ZS50b0pTT04oKSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGRhdGE7XG5cblx0fSxcblxuXHRmcm9tSlNPTjogZnVuY3Rpb24gKCBqc29uICkge1xuXG5cdFx0Q3VydmUucHJvdG90eXBlLmZyb21KU09OLmNhbGwoIHRoaXMsIGpzb24gKTtcblxuXHRcdHRoaXMuYXV0b0Nsb3NlID0ganNvbi5hdXRvQ2xvc2U7XG5cdFx0dGhpcy5jdXJ2ZXMgPSBbXTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGpzb24uY3VydmVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBjdXJ2ZSA9IGpzb24uY3VydmVzWyBpIF07XG5cdFx0XHR0aGlzLmN1cnZlcy5wdXNoKCBuZXcgQ3VydmVzWyBjdXJ2ZS50eXBlIF0oKS5mcm9tSlNPTiggY3VydmUgKSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciB6ejg1IC8gaHR0cDovL3d3dy5sYWI0Z2FtZXMubmV0L3p6ODUvYmxvZ1xuICogQ3JlYXRlcyBmcmVlIGZvcm0gMmQgcGF0aCB1c2luZyBzZXJpZXMgb2YgcG9pbnRzLCBsaW5lcyBvciBjdXJ2ZXMuXG4gKiovXG5cbmZ1bmN0aW9uIFBhdGgoIHBvaW50cyApIHtcblxuXHRDdXJ2ZVBhdGguY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdQYXRoJztcblxuXHR0aGlzLmN1cnJlbnRQb2ludCA9IG5ldyBWZWN0b3IyKCk7XG5cblx0aWYgKCBwb2ludHMgKSB7XG5cblx0XHR0aGlzLnNldEZyb21Qb2ludHMoIHBvaW50cyApO1xuXG5cdH1cblxufVxuXG5QYXRoLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEN1cnZlUGF0aC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBQYXRoLFxuXG5cdHNldEZyb21Qb2ludHM6IGZ1bmN0aW9uICggcG9pbnRzICkge1xuXG5cdFx0dGhpcy5tb3ZlVG8oIHBvaW50c1sgMCBdLngsIHBvaW50c1sgMCBdLnkgKTtcblxuXHRcdGZvciAoIHZhciBpID0gMSwgbCA9IHBvaW50cy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR0aGlzLmxpbmVUbyggcG9pbnRzWyBpIF0ueCwgcG9pbnRzWyBpIF0ueSApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0bW92ZVRvOiBmdW5jdGlvbiAoIHgsIHkgKSB7XG5cblx0XHR0aGlzLmN1cnJlbnRQb2ludC5zZXQoIHgsIHkgKTsgLy8gVE9ETyBjb25zaWRlciByZWZlcmVuY2luZyB2ZWN0b3JzIGluc3RlYWQgb2YgY29weWluZz9cblxuXHR9LFxuXG5cdGxpbmVUbzogZnVuY3Rpb24gKCB4LCB5ICkge1xuXG5cdFx0dmFyIGN1cnZlID0gbmV3IExpbmVDdXJ2ZSggdGhpcy5jdXJyZW50UG9pbnQuY2xvbmUoKSwgbmV3IFZlY3RvcjIoIHgsIHkgKSApO1xuXHRcdHRoaXMuY3VydmVzLnB1c2goIGN1cnZlICk7XG5cblx0XHR0aGlzLmN1cnJlbnRQb2ludC5zZXQoIHgsIHkgKTtcblxuXHR9LFxuXG5cdHF1YWRyYXRpY0N1cnZlVG86IGZ1bmN0aW9uICggYUNQeCwgYUNQeSwgYVgsIGFZICkge1xuXG5cdFx0dmFyIGN1cnZlID0gbmV3IFF1YWRyYXRpY0JlemllckN1cnZlKFxuXHRcdFx0dGhpcy5jdXJyZW50UG9pbnQuY2xvbmUoKSxcblx0XHRcdG5ldyBWZWN0b3IyKCBhQ1B4LCBhQ1B5ICksXG5cdFx0XHRuZXcgVmVjdG9yMiggYVgsIGFZIClcblx0XHQpO1xuXG5cdFx0dGhpcy5jdXJ2ZXMucHVzaCggY3VydmUgKTtcblxuXHRcdHRoaXMuY3VycmVudFBvaW50LnNldCggYVgsIGFZICk7XG5cblx0fSxcblxuXHRiZXppZXJDdXJ2ZVRvOiBmdW5jdGlvbiAoIGFDUDF4LCBhQ1AxeSwgYUNQMngsIGFDUDJ5LCBhWCwgYVkgKSB7XG5cblx0XHR2YXIgY3VydmUgPSBuZXcgQ3ViaWNCZXppZXJDdXJ2ZShcblx0XHRcdHRoaXMuY3VycmVudFBvaW50LmNsb25lKCksXG5cdFx0XHRuZXcgVmVjdG9yMiggYUNQMXgsIGFDUDF5ICksXG5cdFx0XHRuZXcgVmVjdG9yMiggYUNQMngsIGFDUDJ5ICksXG5cdFx0XHRuZXcgVmVjdG9yMiggYVgsIGFZIClcblx0XHQpO1xuXG5cdFx0dGhpcy5jdXJ2ZXMucHVzaCggY3VydmUgKTtcblxuXHRcdHRoaXMuY3VycmVudFBvaW50LnNldCggYVgsIGFZICk7XG5cblx0fSxcblxuXHRzcGxpbmVUaHJ1OiBmdW5jdGlvbiAoIHB0cyAvKkFycmF5IG9mIFZlY3RvciovICkge1xuXG5cdFx0dmFyIG5wdHMgPSBbIHRoaXMuY3VycmVudFBvaW50LmNsb25lKCkgXS5jb25jYXQoIHB0cyApO1xuXG5cdFx0dmFyIGN1cnZlID0gbmV3IFNwbGluZUN1cnZlKCBucHRzICk7XG5cdFx0dGhpcy5jdXJ2ZXMucHVzaCggY3VydmUgKTtcblxuXHRcdHRoaXMuY3VycmVudFBvaW50LmNvcHkoIHB0c1sgcHRzLmxlbmd0aCAtIDEgXSApO1xuXG5cdH0sXG5cblx0YXJjOiBmdW5jdGlvbiAoIGFYLCBhWSwgYVJhZGl1cywgYVN0YXJ0QW5nbGUsIGFFbmRBbmdsZSwgYUNsb2Nrd2lzZSApIHtcblxuXHRcdHZhciB4MCA9IHRoaXMuY3VycmVudFBvaW50Lng7XG5cdFx0dmFyIHkwID0gdGhpcy5jdXJyZW50UG9pbnQueTtcblxuXHRcdHRoaXMuYWJzYXJjKCBhWCArIHgwLCBhWSArIHkwLCBhUmFkaXVzLFxuXHRcdFx0YVN0YXJ0QW5nbGUsIGFFbmRBbmdsZSwgYUNsb2Nrd2lzZSApO1xuXG5cdH0sXG5cblx0YWJzYXJjOiBmdW5jdGlvbiAoIGFYLCBhWSwgYVJhZGl1cywgYVN0YXJ0QW5nbGUsIGFFbmRBbmdsZSwgYUNsb2Nrd2lzZSApIHtcblxuXHRcdHRoaXMuYWJzZWxsaXBzZSggYVgsIGFZLCBhUmFkaXVzLCBhUmFkaXVzLCBhU3RhcnRBbmdsZSwgYUVuZEFuZ2xlLCBhQ2xvY2t3aXNlICk7XG5cblx0fSxcblxuXHRlbGxpcHNlOiBmdW5jdGlvbiAoIGFYLCBhWSwgeFJhZGl1cywgeVJhZGl1cywgYVN0YXJ0QW5nbGUsIGFFbmRBbmdsZSwgYUNsb2Nrd2lzZSwgYVJvdGF0aW9uICkge1xuXG5cdFx0dmFyIHgwID0gdGhpcy5jdXJyZW50UG9pbnQueDtcblx0XHR2YXIgeTAgPSB0aGlzLmN1cnJlbnRQb2ludC55O1xuXG5cdFx0dGhpcy5hYnNlbGxpcHNlKCBhWCArIHgwLCBhWSArIHkwLCB4UmFkaXVzLCB5UmFkaXVzLCBhU3RhcnRBbmdsZSwgYUVuZEFuZ2xlLCBhQ2xvY2t3aXNlLCBhUm90YXRpb24gKTtcblxuXHR9LFxuXG5cdGFic2VsbGlwc2U6IGZ1bmN0aW9uICggYVgsIGFZLCB4UmFkaXVzLCB5UmFkaXVzLCBhU3RhcnRBbmdsZSwgYUVuZEFuZ2xlLCBhQ2xvY2t3aXNlLCBhUm90YXRpb24gKSB7XG5cblx0XHR2YXIgY3VydmUgPSBuZXcgRWxsaXBzZUN1cnZlKCBhWCwgYVksIHhSYWRpdXMsIHlSYWRpdXMsIGFTdGFydEFuZ2xlLCBhRW5kQW5nbGUsIGFDbG9ja3dpc2UsIGFSb3RhdGlvbiApO1xuXG5cdFx0aWYgKCB0aGlzLmN1cnZlcy5sZW5ndGggPiAwICkge1xuXG5cdFx0XHQvLyBpZiBhIHByZXZpb3VzIGN1cnZlIGlzIHByZXNlbnQsIGF0dGVtcHQgdG8gam9pblxuXHRcdFx0dmFyIGZpcnN0UG9pbnQgPSBjdXJ2ZS5nZXRQb2ludCggMCApO1xuXG5cdFx0XHRpZiAoICEgZmlyc3RQb2ludC5lcXVhbHMoIHRoaXMuY3VycmVudFBvaW50ICkgKSB7XG5cblx0XHRcdFx0dGhpcy5saW5lVG8oIGZpcnN0UG9pbnQueCwgZmlyc3RQb2ludC55ICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHRoaXMuY3VydmVzLnB1c2goIGN1cnZlICk7XG5cblx0XHR2YXIgbGFzdFBvaW50ID0gY3VydmUuZ2V0UG9pbnQoIDEgKTtcblx0XHR0aGlzLmN1cnJlbnRQb2ludC5jb3B5KCBsYXN0UG9pbnQgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0Q3VydmVQYXRoLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdFx0dGhpcy5jdXJyZW50UG9pbnQuY29weSggc291cmNlLmN1cnJlbnRQb2ludCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHR0b0pTT046IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBkYXRhID0gQ3VydmVQYXRoLnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcyApO1xuXG5cdFx0ZGF0YS5jdXJyZW50UG9pbnQgPSB0aGlzLmN1cnJlbnRQb2ludC50b0FycmF5KCk7XG5cblx0XHRyZXR1cm4gZGF0YTtcblxuXHR9LFxuXG5cdGZyb21KU09OOiBmdW5jdGlvbiAoIGpzb24gKSB7XG5cblx0XHRDdXJ2ZVBhdGgucHJvdG90eXBlLmZyb21KU09OLmNhbGwoIHRoaXMsIGpzb24gKTtcblxuXHRcdHRoaXMuY3VycmVudFBvaW50LmZyb21BcnJheSgganNvbi5jdXJyZW50UG9pbnQgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3Igeno4NSAvIGh0dHA6Ly93d3cubGFiNGdhbWVzLm5ldC96ejg1L2Jsb2dcbiAqIERlZmluZXMgYSAyZCBzaGFwZSBwbGFuZSB1c2luZyBwYXRocy5cbiAqKi9cblxuLy8gU1RFUCAxIENyZWF0ZSBhIHBhdGguXG4vLyBTVEVQIDIgVHVybiBwYXRoIGludG8gc2hhcGUuXG4vLyBTVEVQIDMgRXh0cnVkZUdlb21ldHJ5IHRha2VzIGluIFNoYXBlL1NoYXBlc1xuLy8gU1RFUCAzYSAtIEV4dHJhY3QgcG9pbnRzIGZyb20gZWFjaCBzaGFwZSwgdHVybiB0byB2ZXJ0aWNlc1xuLy8gU1RFUCAzYiAtIFRyaWFuZ3VsYXRlIGVhY2ggc2hhcGUsIGFkZCBmYWNlcy5cblxuZnVuY3Rpb24gU2hhcGUoIHBvaW50cyApIHtcblxuXHRQYXRoLmNhbGwoIHRoaXMsIHBvaW50cyApO1xuXG5cdHRoaXMudXVpZCA9IF9NYXRoLmdlbmVyYXRlVVVJRCgpO1xuXG5cdHRoaXMudHlwZSA9ICdTaGFwZSc7XG5cblx0dGhpcy5ob2xlcyA9IFtdO1xuXG59XG5cblNoYXBlLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIFBhdGgucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogU2hhcGUsXG5cblx0Z2V0UG9pbnRzSG9sZXM6IGZ1bmN0aW9uICggZGl2aXNpb25zICkge1xuXG5cdFx0dmFyIGhvbGVzUHRzID0gW107XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSB0aGlzLmhvbGVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdGhvbGVzUHRzWyBpIF0gPSB0aGlzLmhvbGVzWyBpIF0uZ2V0UG9pbnRzKCBkaXZpc2lvbnMgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBob2xlc1B0cztcblxuXHR9LFxuXG5cdC8vIGdldCBwb2ludHMgb2Ygc2hhcGUgYW5kIGhvbGVzIChrZXlwb2ludHMgYmFzZWQgb24gc2VnbWVudHMgcGFyYW1ldGVyKVxuXG5cdGV4dHJhY3RQb2ludHM6IGZ1bmN0aW9uICggZGl2aXNpb25zICkge1xuXG5cdFx0cmV0dXJuIHtcblxuXHRcdFx0c2hhcGU6IHRoaXMuZ2V0UG9pbnRzKCBkaXZpc2lvbnMgKSxcblx0XHRcdGhvbGVzOiB0aGlzLmdldFBvaW50c0hvbGVzKCBkaXZpc2lvbnMgKVxuXG5cdFx0fTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0UGF0aC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHRcdHRoaXMuaG9sZXMgPSBbXTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHNvdXJjZS5ob2xlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgaG9sZSA9IHNvdXJjZS5ob2xlc1sgaSBdO1xuXG5cdFx0XHR0aGlzLmhvbGVzLnB1c2goIGhvbGUuY2xvbmUoKSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHR0b0pTT046IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBkYXRhID0gUGF0aC5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMgKTtcblxuXHRcdGRhdGEudXVpZCA9IHRoaXMudXVpZDtcblx0XHRkYXRhLmhvbGVzID0gW107XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSB0aGlzLmhvbGVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBob2xlID0gdGhpcy5ob2xlc1sgaSBdO1xuXHRcdFx0ZGF0YS5ob2xlcy5wdXNoKCBob2xlLnRvSlNPTigpICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gZGF0YTtcblxuXHR9LFxuXG5cdGZyb21KU09OOiBmdW5jdGlvbiAoIGpzb24gKSB7XG5cblx0XHRQYXRoLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKCB0aGlzLCBqc29uICk7XG5cblx0XHR0aGlzLnV1aWQgPSBqc29uLnV1aWQ7XG5cdFx0dGhpcy5ob2xlcyA9IFtdO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0ganNvbi5ob2xlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgaG9sZSA9IGpzb24uaG9sZXNbIGkgXTtcblx0XHRcdHRoaXMuaG9sZXMucHVzaCggbmV3IFBhdGgoKS5mcm9tSlNPTiggaG9sZSApICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBMaWdodCggY29sb3IsIGludGVuc2l0eSApIHtcblxuXHRPYmplY3QzRC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0xpZ2h0JztcblxuXHR0aGlzLmNvbG9yID0gbmV3IENvbG9yKCBjb2xvciApO1xuXHR0aGlzLmludGVuc2l0eSA9IGludGVuc2l0eSAhPT0gdW5kZWZpbmVkID8gaW50ZW5zaXR5IDogMTtcblxuXHR0aGlzLnJlY2VpdmVTaGFkb3cgPSB1bmRlZmluZWQ7XG5cbn1cblxuTGlnaHQucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogTGlnaHQsXG5cblx0aXNMaWdodDogdHJ1ZSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRcdE9iamVjdDNELnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdFx0dGhpcy5jb2xvci5jb3B5KCBzb3VyY2UuY29sb3IgKTtcblx0XHR0aGlzLmludGVuc2l0eSA9IHNvdXJjZS5pbnRlbnNpdHk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCBtZXRhICkge1xuXG5cdFx0dmFyIGRhdGEgPSBPYmplY3QzRC5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMsIG1ldGEgKTtcblxuXHRcdGRhdGEub2JqZWN0LmNvbG9yID0gdGhpcy5jb2xvci5nZXRIZXgoKTtcblx0XHRkYXRhLm9iamVjdC5pbnRlbnNpdHkgPSB0aGlzLmludGVuc2l0eTtcblxuXHRcdGlmICggdGhpcy5ncm91bmRDb2xvciAhPT0gdW5kZWZpbmVkICkgZGF0YS5vYmplY3QuZ3JvdW5kQ29sb3IgPSB0aGlzLmdyb3VuZENvbG9yLmdldEhleCgpO1xuXG5cdFx0aWYgKCB0aGlzLmRpc3RhbmNlICE9PSB1bmRlZmluZWQgKSBkYXRhLm9iamVjdC5kaXN0YW5jZSA9IHRoaXMuZGlzdGFuY2U7XG5cdFx0aWYgKCB0aGlzLmFuZ2xlICE9PSB1bmRlZmluZWQgKSBkYXRhLm9iamVjdC5hbmdsZSA9IHRoaXMuYW5nbGU7XG5cdFx0aWYgKCB0aGlzLmRlY2F5ICE9PSB1bmRlZmluZWQgKSBkYXRhLm9iamVjdC5kZWNheSA9IHRoaXMuZGVjYXk7XG5cdFx0aWYgKCB0aGlzLnBlbnVtYnJhICE9PSB1bmRlZmluZWQgKSBkYXRhLm9iamVjdC5wZW51bWJyYSA9IHRoaXMucGVudW1icmE7XG5cblx0XHRpZiAoIHRoaXMuc2hhZG93ICE9PSB1bmRlZmluZWQgKSBkYXRhLm9iamVjdC5zaGFkb3cgPSB0aGlzLnNoYWRvdy50b0pTT04oKTtcblxuXHRcdHJldHVybiBkYXRhO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKi9cblxuZnVuY3Rpb24gSGVtaXNwaGVyZUxpZ2h0KCBza3lDb2xvciwgZ3JvdW5kQ29sb3IsIGludGVuc2l0eSApIHtcblxuXHRMaWdodC5jYWxsKCB0aGlzLCBza3lDb2xvciwgaW50ZW5zaXR5ICk7XG5cblx0dGhpcy50eXBlID0gJ0hlbWlzcGhlcmVMaWdodCc7XG5cblx0dGhpcy5jYXN0U2hhZG93ID0gdW5kZWZpbmVkO1xuXG5cdHRoaXMucG9zaXRpb24uY29weSggT2JqZWN0M0QuRGVmYXVsdFVwICk7XG5cdHRoaXMudXBkYXRlTWF0cml4KCk7XG5cblx0dGhpcy5ncm91bmRDb2xvciA9IG5ldyBDb2xvciggZ3JvdW5kQ29sb3IgKTtcblxufVxuXG5IZW1pc3BoZXJlTGlnaHQucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggTGlnaHQucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogSGVtaXNwaGVyZUxpZ2h0LFxuXG5cdGlzSGVtaXNwaGVyZUxpZ2h0OiB0cnVlLFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0TGlnaHQucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0XHR0aGlzLmdyb3VuZENvbG9yLmNvcHkoIHNvdXJjZS5ncm91bmRDb2xvciApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBMaWdodFNoYWRvdyggY2FtZXJhICkge1xuXG5cdHRoaXMuY2FtZXJhID0gY2FtZXJhO1xuXG5cdHRoaXMuYmlhcyA9IDA7XG5cdHRoaXMucmFkaXVzID0gMTtcblxuXHR0aGlzLm1hcFNpemUgPSBuZXcgVmVjdG9yMiggNTEyLCA1MTIgKTtcblxuXHR0aGlzLm1hcCA9IG51bGw7XG5cdHRoaXMubWF0cml4ID0gbmV3IE1hdHJpeDQoKTtcblxufVxuXG5PYmplY3QuYXNzaWduKCBMaWdodFNoYWRvdy5wcm90b3R5cGUsIHtcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRcdHRoaXMuY2FtZXJhID0gc291cmNlLmNhbWVyYS5jbG9uZSgpO1xuXG5cdFx0dGhpcy5iaWFzID0gc291cmNlLmJpYXM7XG5cdFx0dGhpcy5yYWRpdXMgPSBzb3VyY2UucmFkaXVzO1xuXG5cdFx0dGhpcy5tYXBTaXplLmNvcHkoIHNvdXJjZS5tYXBTaXplICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XG5cblx0fSxcblxuXHR0b0pTT046IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBvYmplY3QgPSB7fTtcblxuXHRcdGlmICggdGhpcy5iaWFzICE9PSAwICkgb2JqZWN0LmJpYXMgPSB0aGlzLmJpYXM7XG5cdFx0aWYgKCB0aGlzLnJhZGl1cyAhPT0gMSApIG9iamVjdC5yYWRpdXMgPSB0aGlzLnJhZGl1cztcblx0XHRpZiAoIHRoaXMubWFwU2l6ZS54ICE9PSA1MTIgfHwgdGhpcy5tYXBTaXplLnkgIT09IDUxMiApIG9iamVjdC5tYXBTaXplID0gdGhpcy5tYXBTaXplLnRvQXJyYXkoKTtcblxuXHRcdG9iamVjdC5jYW1lcmEgPSB0aGlzLmNhbWVyYS50b0pTT04oIGZhbHNlICkub2JqZWN0O1xuXHRcdGRlbGV0ZSBvYmplY3QuY2FtZXJhLm1hdHJpeDtcblxuXHRcdHJldHVybiBvYmplY3Q7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBTcG90TGlnaHRTaGFkb3coKSB7XG5cblx0TGlnaHRTaGFkb3cuY2FsbCggdGhpcywgbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCA1MCwgMSwgMC41LCA1MDAgKSApO1xuXG59XG5cblNwb3RMaWdodFNoYWRvdy5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBMaWdodFNoYWRvdy5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBTcG90TGlnaHRTaGFkb3csXG5cblx0aXNTcG90TGlnaHRTaGFkb3c6IHRydWUsXG5cblx0dXBkYXRlOiBmdW5jdGlvbiAoIGxpZ2h0ICkge1xuXG5cdFx0dmFyIGNhbWVyYSA9IHRoaXMuY2FtZXJhO1xuXG5cdFx0dmFyIGZvdiA9IF9NYXRoLlJBRDJERUcgKiAyICogbGlnaHQuYW5nbGU7XG5cdFx0dmFyIGFzcGVjdCA9IHRoaXMubWFwU2l6ZS53aWR0aCAvIHRoaXMubWFwU2l6ZS5oZWlnaHQ7XG5cdFx0dmFyIGZhciA9IGxpZ2h0LmRpc3RhbmNlIHx8IGNhbWVyYS5mYXI7XG5cblx0XHRpZiAoIGZvdiAhPT0gY2FtZXJhLmZvdiB8fCBhc3BlY3QgIT09IGNhbWVyYS5hc3BlY3QgfHwgZmFyICE9PSBjYW1lcmEuZmFyICkge1xuXG5cdFx0XHRjYW1lcmEuZm92ID0gZm92O1xuXHRcdFx0Y2FtZXJhLmFzcGVjdCA9IGFzcGVjdDtcblx0XHRcdGNhbWVyYS5mYXIgPSBmYXI7XG5cdFx0XHRjYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xuXG5cdFx0fVxuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKi9cblxuZnVuY3Rpb24gU3BvdExpZ2h0KCBjb2xvciwgaW50ZW5zaXR5LCBkaXN0YW5jZSwgYW5nbGUsIHBlbnVtYnJhLCBkZWNheSApIHtcblxuXHRMaWdodC5jYWxsKCB0aGlzLCBjb2xvciwgaW50ZW5zaXR5ICk7XG5cblx0dGhpcy50eXBlID0gJ1Nwb3RMaWdodCc7XG5cblx0dGhpcy5wb3NpdGlvbi5jb3B5KCBPYmplY3QzRC5EZWZhdWx0VXAgKTtcblx0dGhpcy51cGRhdGVNYXRyaXgoKTtcblxuXHR0aGlzLnRhcmdldCA9IG5ldyBPYmplY3QzRCgpO1xuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggdGhpcywgJ3Bvd2VyJywge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHQvLyBpbnRlbnNpdHkgPSBwb3dlciBwZXIgc29saWQgYW5nbGUuXG5cdFx0XHQvLyByZWY6IGVxdWF0aW9uICgxNykgZnJvbSBodHRwczovL3NlYmxhZ2FyZGUuZmlsZXMud29yZHByZXNzLmNvbS8yMDE1LzA3L2NvdXJzZV9ub3Rlc19tb3ZpbmdfZnJvc3RiaXRlX3RvX3Bicl92MzIucGRmXG5cdFx0XHRyZXR1cm4gdGhpcy5pbnRlbnNpdHkgKiBNYXRoLlBJO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICggcG93ZXIgKSB7XG5cblx0XHRcdC8vIGludGVuc2l0eSA9IHBvd2VyIHBlciBzb2xpZCBhbmdsZS5cblx0XHRcdC8vIHJlZjogZXF1YXRpb24gKDE3KSBmcm9tIGh0dHBzOi8vc2VibGFnYXJkZS5maWxlcy53b3JkcHJlc3MuY29tLzIwMTUvMDcvY291cnNlX25vdGVzX21vdmluZ19mcm9zdGJpdGVfdG9fcGJyX3YzMi5wZGZcblx0XHRcdHRoaXMuaW50ZW5zaXR5ID0gcG93ZXIgLyBNYXRoLlBJO1xuXG5cdFx0fVxuXHR9ICk7XG5cblx0dGhpcy5kaXN0YW5jZSA9ICggZGlzdGFuY2UgIT09IHVuZGVmaW5lZCApID8gZGlzdGFuY2UgOiAwO1xuXHR0aGlzLmFuZ2xlID0gKCBhbmdsZSAhPT0gdW5kZWZpbmVkICkgPyBhbmdsZSA6IE1hdGguUEkgLyAzO1xuXHR0aGlzLnBlbnVtYnJhID0gKCBwZW51bWJyYSAhPT0gdW5kZWZpbmVkICkgPyBwZW51bWJyYSA6IDA7XG5cdHRoaXMuZGVjYXkgPSAoIGRlY2F5ICE9PSB1bmRlZmluZWQgKSA/IGRlY2F5IDogMTtcdC8vIGZvciBwaHlzaWNhbGx5IGNvcnJlY3QgbGlnaHRzLCBzaG91bGQgYmUgMi5cblxuXHR0aGlzLnNoYWRvdyA9IG5ldyBTcG90TGlnaHRTaGFkb3coKTtcblxufVxuXG5TcG90TGlnaHQucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggTGlnaHQucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogU3BvdExpZ2h0LFxuXG5cdGlzU3BvdExpZ2h0OiB0cnVlLFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0TGlnaHQucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0XHR0aGlzLmRpc3RhbmNlID0gc291cmNlLmRpc3RhbmNlO1xuXHRcdHRoaXMuYW5nbGUgPSBzb3VyY2UuYW5nbGU7XG5cdFx0dGhpcy5wZW51bWJyYSA9IHNvdXJjZS5wZW51bWJyYTtcblx0XHR0aGlzLmRlY2F5ID0gc291cmNlLmRlY2F5O1xuXG5cdFx0dGhpcy50YXJnZXQgPSBzb3VyY2UudGFyZ2V0LmNsb25lKCk7XG5cblx0XHR0aGlzLnNoYWRvdyA9IHNvdXJjZS5zaGFkb3cuY2xvbmUoKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuXG5mdW5jdGlvbiBQb2ludExpZ2h0KCBjb2xvciwgaW50ZW5zaXR5LCBkaXN0YW5jZSwgZGVjYXkgKSB7XG5cblx0TGlnaHQuY2FsbCggdGhpcywgY29sb3IsIGludGVuc2l0eSApO1xuXG5cdHRoaXMudHlwZSA9ICdQb2ludExpZ2h0JztcblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoIHRoaXMsICdwb3dlcicsIHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Ly8gaW50ZW5zaXR5ID0gcG93ZXIgcGVyIHNvbGlkIGFuZ2xlLlxuXHRcdFx0Ly8gcmVmOiBlcXVhdGlvbiAoMTUpIGZyb20gaHR0cHM6Ly9zZWJsYWdhcmRlLmZpbGVzLndvcmRwcmVzcy5jb20vMjAxNS8wNy9jb3Vyc2Vfbm90ZXNfbW92aW5nX2Zyb3N0Yml0ZV90b19wYnJfdjMyLnBkZlxuXHRcdFx0cmV0dXJuIHRoaXMuaW50ZW5zaXR5ICogNCAqIE1hdGguUEk7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCBwb3dlciApIHtcblxuXHRcdFx0Ly8gaW50ZW5zaXR5ID0gcG93ZXIgcGVyIHNvbGlkIGFuZ2xlLlxuXHRcdFx0Ly8gcmVmOiBlcXVhdGlvbiAoMTUpIGZyb20gaHR0cHM6Ly9zZWJsYWdhcmRlLmZpbGVzLndvcmRwcmVzcy5jb20vMjAxNS8wNy9jb3Vyc2Vfbm90ZXNfbW92aW5nX2Zyb3N0Yml0ZV90b19wYnJfdjMyLnBkZlxuXHRcdFx0dGhpcy5pbnRlbnNpdHkgPSBwb3dlciAvICggNCAqIE1hdGguUEkgKTtcblxuXHRcdH1cblx0fSApO1xuXG5cdHRoaXMuZGlzdGFuY2UgPSAoIGRpc3RhbmNlICE9PSB1bmRlZmluZWQgKSA/IGRpc3RhbmNlIDogMDtcblx0dGhpcy5kZWNheSA9ICggZGVjYXkgIT09IHVuZGVmaW5lZCApID8gZGVjYXkgOiAxO1x0Ly8gZm9yIHBoeXNpY2FsbHkgY29ycmVjdCBsaWdodHMsIHNob3VsZCBiZSAyLlxuXG5cdHRoaXMuc2hhZG93ID0gbmV3IExpZ2h0U2hhZG93KCBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoIDkwLCAxLCAwLjUsIDUwMCApICk7XG5cbn1cblxuUG9pbnRMaWdodC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBMaWdodC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBQb2ludExpZ2h0LFxuXG5cdGlzUG9pbnRMaWdodDogdHJ1ZSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRcdExpZ2h0LnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdFx0dGhpcy5kaXN0YW5jZSA9IHNvdXJjZS5kaXN0YW5jZTtcblx0XHR0aGlzLmRlY2F5ID0gc291cmNlLmRlY2F5O1xuXG5cdFx0dGhpcy5zaGFkb3cgPSBzb3VyY2Uuc2hhZG93LmNsb25lKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIERpcmVjdGlvbmFsTGlnaHRTaGFkb3coICkge1xuXG5cdExpZ2h0U2hhZG93LmNhbGwoIHRoaXMsIG5ldyBPcnRob2dyYXBoaWNDYW1lcmEoIC0gNSwgNSwgNSwgLSA1LCAwLjUsIDUwMCApICk7XG5cbn1cblxuRGlyZWN0aW9uYWxMaWdodFNoYWRvdy5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBMaWdodFNoYWRvdy5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBEaXJlY3Rpb25hbExpZ2h0U2hhZG93XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBEaXJlY3Rpb25hbExpZ2h0KCBjb2xvciwgaW50ZW5zaXR5ICkge1xuXG5cdExpZ2h0LmNhbGwoIHRoaXMsIGNvbG9yLCBpbnRlbnNpdHkgKTtcblxuXHR0aGlzLnR5cGUgPSAnRGlyZWN0aW9uYWxMaWdodCc7XG5cblx0dGhpcy5wb3NpdGlvbi5jb3B5KCBPYmplY3QzRC5EZWZhdWx0VXAgKTtcblx0dGhpcy51cGRhdGVNYXRyaXgoKTtcblxuXHR0aGlzLnRhcmdldCA9IG5ldyBPYmplY3QzRCgpO1xuXG5cdHRoaXMuc2hhZG93ID0gbmV3IERpcmVjdGlvbmFsTGlnaHRTaGFkb3coKTtcblxufVxuXG5EaXJlY3Rpb25hbExpZ2h0LnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIExpZ2h0LnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IERpcmVjdGlvbmFsTGlnaHQsXG5cblx0aXNEaXJlY3Rpb25hbExpZ2h0OiB0cnVlLFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0TGlnaHQucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0XHR0aGlzLnRhcmdldCA9IHNvdXJjZS50YXJnZXQuY2xvbmUoKTtcblxuXHRcdHRoaXMuc2hhZG93ID0gc291cmNlLnNoYWRvdy5jbG9uZSgpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBBbWJpZW50TGlnaHQoIGNvbG9yLCBpbnRlbnNpdHkgKSB7XG5cblx0TGlnaHQuY2FsbCggdGhpcywgY29sb3IsIGludGVuc2l0eSApO1xuXG5cdHRoaXMudHlwZSA9ICdBbWJpZW50TGlnaHQnO1xuXG5cdHRoaXMuY2FzdFNoYWRvdyA9IHVuZGVmaW5lZDtcblxufVxuXG5BbWJpZW50TGlnaHQucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggTGlnaHQucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogQW1iaWVudExpZ2h0LFxuXG5cdGlzQW1iaWVudExpZ2h0OiB0cnVlXG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIGFiZWxuYXRpb24gLyBodHRwOi8vZ2l0aHViLmNvbS9hYmVsbmF0aW9uXG4gKi9cblxuZnVuY3Rpb24gUmVjdEFyZWFMaWdodCggY29sb3IsIGludGVuc2l0eSwgd2lkdGgsIGhlaWdodCApIHtcblxuXHRMaWdodC5jYWxsKCB0aGlzLCBjb2xvciwgaW50ZW5zaXR5ICk7XG5cblx0dGhpcy50eXBlID0gJ1JlY3RBcmVhTGlnaHQnO1xuXG5cdHRoaXMud2lkdGggPSAoIHdpZHRoICE9PSB1bmRlZmluZWQgKSA/IHdpZHRoIDogMTA7XG5cdHRoaXMuaGVpZ2h0ID0gKCBoZWlnaHQgIT09IHVuZGVmaW5lZCApID8gaGVpZ2h0IDogMTA7XG5cbn1cblxuUmVjdEFyZWFMaWdodC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBMaWdodC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBSZWN0QXJlYUxpZ2h0LFxuXG5cdGlzUmVjdEFyZWFMaWdodDogdHJ1ZSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRcdExpZ2h0LnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdFx0dGhpcy53aWR0aCA9IHNvdXJjZS53aWR0aDtcblx0XHR0aGlzLmhlaWdodCA9IHNvdXJjZS5oZWlnaHQ7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCBtZXRhICkge1xuXG5cdFx0dmFyIGRhdGEgPSBMaWdodC5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMsIG1ldGEgKTtcblxuXHRcdGRhdGEub2JqZWN0LndpZHRoID0gdGhpcy53aWR0aDtcblx0XHRkYXRhLm9iamVjdC5oZWlnaHQgPSB0aGlzLmhlaWdodDtcblxuXHRcdHJldHVybiBkYXRhO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqXG4gKiBBIFRyYWNrIHRoYXQgaW50ZXJwb2xhdGVzIFN0cmluZ3NcbiAqXG4gKlxuICogQGF1dGhvciBCZW4gSG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pby9cbiAqIEBhdXRob3IgRGF2aWQgU2Fybm8gLyBodHRwOi8vbGlnaHRoYXVzLnVzL1xuICogQGF1dGhvciB0c2Nod1xuICovXG5cbmZ1bmN0aW9uIFN0cmluZ0tleWZyYW1lVHJhY2soIG5hbWUsIHRpbWVzLCB2YWx1ZXMsIGludGVycG9sYXRpb24gKSB7XG5cblx0S2V5ZnJhbWVUcmFjay5jYWxsKCB0aGlzLCBuYW1lLCB0aW1lcywgdmFsdWVzLCBpbnRlcnBvbGF0aW9uICk7XG5cbn1cblxuU3RyaW5nS2V5ZnJhbWVUcmFjay5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBLZXlmcmFtZVRyYWNrLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IFN0cmluZ0tleWZyYW1lVHJhY2ssXG5cblx0VmFsdWVUeXBlTmFtZTogJ3N0cmluZycsXG5cdFZhbHVlQnVmZmVyVHlwZTogQXJyYXksXG5cblx0RGVmYXVsdEludGVycG9sYXRpb246IEludGVycG9sYXRlRGlzY3JldGUsXG5cblx0SW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kTGluZWFyOiB1bmRlZmluZWQsXG5cblx0SW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kU21vb3RoOiB1bmRlZmluZWRcblxufSApO1xuXG4vKipcbiAqXG4gKiBBIFRyYWNrIG9mIEJvb2xlYW4ga2V5ZnJhbWUgdmFsdWVzLlxuICpcbiAqXG4gKiBAYXV0aG9yIEJlbiBIb3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvL1xuICogQGF1dGhvciBEYXZpZCBTYXJubyAvIGh0dHA6Ly9saWdodGhhdXMudXMvXG4gKiBAYXV0aG9yIHRzY2h3XG4gKi9cblxuZnVuY3Rpb24gQm9vbGVhbktleWZyYW1lVHJhY2soIG5hbWUsIHRpbWVzLCB2YWx1ZXMgKSB7XG5cblx0S2V5ZnJhbWVUcmFjay5jYWxsKCB0aGlzLCBuYW1lLCB0aW1lcywgdmFsdWVzICk7XG5cbn1cblxuQm9vbGVhbktleWZyYW1lVHJhY2sucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggS2V5ZnJhbWVUcmFjay5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBCb29sZWFuS2V5ZnJhbWVUcmFjayxcblxuXHRWYWx1ZVR5cGVOYW1lOiAnYm9vbCcsXG5cdFZhbHVlQnVmZmVyVHlwZTogQXJyYXksXG5cblx0RGVmYXVsdEludGVycG9sYXRpb246IEludGVycG9sYXRlRGlzY3JldGUsXG5cblx0SW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kTGluZWFyOiB1bmRlZmluZWQsXG5cdEludGVycG9sYW50RmFjdG9yeU1ldGhvZFNtb290aDogdW5kZWZpbmVkXG5cblx0Ly8gTm90ZTogQWN0dWFsbHkgdGhpcyB0cmFjayBjb3VsZCBoYXZlIGEgb3B0aW1pemVkIC8gY29tcHJlc3NlZFxuXHQvLyByZXByZXNlbnRhdGlvbiBvZiBhIHNpbmdsZSB2YWx1ZSBhbmQgYSBjdXN0b20gaW50ZXJwb2xhbnQgdGhhdFxuXHQvLyBjb21wdXRlcyBcImZpcnN0VmFsdWUgXiBpc09kZCggaW5kZXggKVwiLlxuXG59ICk7XG5cbi8qKlxuICogQWJzdHJhY3QgYmFzZSBjbGFzcyBvZiBpbnRlcnBvbGFudHMgb3ZlciBwYXJhbWV0cmljIHNhbXBsZXMuXG4gKlxuICogVGhlIHBhcmFtZXRlciBkb21haW4gaXMgb25lIGRpbWVuc2lvbmFsLCB0eXBpY2FsbHkgdGhlIHRpbWUgb3IgYSBwYXRoXG4gKiBhbG9uZyBhIGN1cnZlIGRlZmluZWQgYnkgdGhlIGRhdGEuXG4gKlxuICogVGhlIHNhbXBsZSB2YWx1ZXMgY2FuIGhhdmUgYW55IGRpbWVuc2lvbmFsaXR5IGFuZCBkZXJpdmVkIGNsYXNzZXMgbWF5XG4gKiBhcHBseSBzcGVjaWFsIGludGVycHJldGF0aW9ucyB0byB0aGUgZGF0YS5cbiAqXG4gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIHRoZSBpbnRlcnZhbCBzZWVrIGluIGEgVGVtcGxhdGUgTWV0aG9kLCBkZWZlcnJpbmdcbiAqIHRoZSBhY3R1YWwgaW50ZXJwb2xhdGlvbiB0byBkZXJpdmVkIGNsYXNzZXMuXG4gKlxuICogVGltZSBjb21wbGV4aXR5IGlzIE8oMSkgZm9yIGxpbmVhciBhY2Nlc3MgY3Jvc3NpbmcgYXQgbW9zdCB0d28gcG9pbnRzXG4gKiBhbmQgTyhsb2cgTikgZm9yIHJhbmRvbSBhY2Nlc3MsIHdoZXJlIE4gaXMgdGhlIG51bWJlciBvZiBwb3NpdGlvbnMuXG4gKlxuICogUmVmZXJlbmNlczpcbiAqXG4gKiBcdFx0aHR0cDovL3d3dy5vb2Rlc2lnbi5jb20vdGVtcGxhdGUtbWV0aG9kLXBhdHRlcm4uaHRtbFxuICpcbiAqIEBhdXRob3IgdHNjaHdcbiAqL1xuXG5mdW5jdGlvbiBJbnRlcnBvbGFudCggcGFyYW1ldGVyUG9zaXRpb25zLCBzYW1wbGVWYWx1ZXMsIHNhbXBsZVNpemUsIHJlc3VsdEJ1ZmZlciApIHtcblxuXHR0aGlzLnBhcmFtZXRlclBvc2l0aW9ucyA9IHBhcmFtZXRlclBvc2l0aW9ucztcblx0dGhpcy5fY2FjaGVkSW5kZXggPSAwO1xuXG5cdHRoaXMucmVzdWx0QnVmZmVyID0gcmVzdWx0QnVmZmVyICE9PSB1bmRlZmluZWQgP1xuXHRcdHJlc3VsdEJ1ZmZlciA6IG5ldyBzYW1wbGVWYWx1ZXMuY29uc3RydWN0b3IoIHNhbXBsZVNpemUgKTtcblx0dGhpcy5zYW1wbGVWYWx1ZXMgPSBzYW1wbGVWYWx1ZXM7XG5cdHRoaXMudmFsdWVTaXplID0gc2FtcGxlU2l6ZTtcblxufVxuXG5PYmplY3QuYXNzaWduKCBJbnRlcnBvbGFudC5wcm90b3R5cGUsIHtcblxuXHRldmFsdWF0ZTogZnVuY3Rpb24gKCB0ICkge1xuXG5cdFx0dmFyIHBwID0gdGhpcy5wYXJhbWV0ZXJQb3NpdGlvbnMsXG5cdFx0XHRpMSA9IHRoaXMuX2NhY2hlZEluZGV4LFxuXG5cdFx0XHR0MSA9IHBwWyBpMSBdLFxuXHRcdFx0dDAgPSBwcFsgaTEgLSAxIF07XG5cblx0XHR2YWxpZGF0ZV9pbnRlcnZhbDoge1xuXG5cdFx0XHRzZWVrOiB7XG5cblx0XHRcdFx0dmFyIHJpZ2h0O1xuXG5cdFx0XHRcdGxpbmVhcl9zY2FuOiB7XG5cblx0XHRcdFx0XHQvLy0gU2VlIGh0dHA6Ly9qc3BlcmYuY29tL2NvbXBhcmlzb24tdG8tdW5kZWZpbmVkLzNcblx0XHRcdFx0XHQvLy0gc2xvd2VyIGNvZGU6XG5cdFx0XHRcdFx0Ly8tXG5cdFx0XHRcdFx0Ly8tIFx0XHRcdFx0aWYgKCB0ID49IHQxIHx8IHQxID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0Zm9yd2FyZF9zY2FuOiBpZiAoICEgKCB0IDwgdDEgKSApIHtcblxuXHRcdFx0XHRcdFx0Zm9yICggdmFyIGdpdmVVcEF0ID0gaTEgKyAyOyA7ICkge1xuXG5cdFx0XHRcdFx0XHRcdGlmICggdDEgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdFx0XHRcdGlmICggdCA8IHQwICkgYnJlYWsgZm9yd2FyZF9zY2FuO1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gYWZ0ZXIgZW5kXG5cblx0XHRcdFx0XHRcdFx0XHRpMSA9IHBwLmxlbmd0aDtcblx0XHRcdFx0XHRcdFx0XHR0aGlzLl9jYWNoZWRJbmRleCA9IGkxO1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiB0aGlzLmFmdGVyRW5kXyggaTEgLSAxLCB0LCB0MCApO1xuXG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRpZiAoIGkxID09PSBnaXZlVXBBdCApIGJyZWFrOyAvLyB0aGlzIGxvb3BcblxuXHRcdFx0XHRcdFx0XHR0MCA9IHQxO1xuXHRcdFx0XHRcdFx0XHR0MSA9IHBwWyArKyBpMSBdO1xuXG5cdFx0XHRcdFx0XHRcdGlmICggdCA8IHQxICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gd2UgaGF2ZSBhcnJpdmVkIGF0IHRoZSBzb3VnaHQgaW50ZXJ2YWxcblx0XHRcdFx0XHRcdFx0XHRicmVhayBzZWVrO1xuXG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHQvLyBwcmVwYXJlIGJpbmFyeSBzZWFyY2ggb24gdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIGluZGV4XG5cdFx0XHRcdFx0XHRyaWdodCA9IHBwLmxlbmd0aDtcblx0XHRcdFx0XHRcdGJyZWFrIGxpbmVhcl9zY2FuO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8tIHNsb3dlciBjb2RlOlxuXHRcdFx0XHRcdC8vLVx0XHRcdFx0XHRpZiAoIHQgPCB0MCB8fCB0MCA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdGlmICggISAoIHQgPj0gdDAgKSApIHtcblxuXHRcdFx0XHRcdFx0Ly8gbG9vcGluZz9cblxuXHRcdFx0XHRcdFx0dmFyIHQxZ2xvYmFsID0gcHBbIDEgXTtcblxuXHRcdFx0XHRcdFx0aWYgKCB0IDwgdDFnbG9iYWwgKSB7XG5cblx0XHRcdFx0XHRcdFx0aTEgPSAyOyAvLyArIDEsIHVzaW5nIHRoZSBzY2FuIGZvciB0aGUgZGV0YWlsc1xuXHRcdFx0XHRcdFx0XHR0MCA9IHQxZ2xvYmFsO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdC8vIGxpbmVhciByZXZlcnNlIHNjYW5cblxuXHRcdFx0XHRcdFx0Zm9yICggdmFyIGdpdmVVcEF0ID0gaTEgLSAyOyA7ICkge1xuXG5cdFx0XHRcdFx0XHRcdGlmICggdDAgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdFx0XHRcdC8vIGJlZm9yZSBzdGFydFxuXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5fY2FjaGVkSW5kZXggPSAwO1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiB0aGlzLmJlZm9yZVN0YXJ0XyggMCwgdCwgdDEgKTtcblxuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0aWYgKCBpMSA9PT0gZ2l2ZVVwQXQgKSBicmVhazsgLy8gdGhpcyBsb29wXG5cblx0XHRcdFx0XHRcdFx0dDEgPSB0MDtcblx0XHRcdFx0XHRcdFx0dDAgPSBwcFsgLS0gaTEgLSAxIF07XG5cblx0XHRcdFx0XHRcdFx0aWYgKCB0ID49IHQwICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gd2UgaGF2ZSBhcnJpdmVkIGF0IHRoZSBzb3VnaHQgaW50ZXJ2YWxcblx0XHRcdFx0XHRcdFx0XHRicmVhayBzZWVrO1xuXG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHQvLyBwcmVwYXJlIGJpbmFyeSBzZWFyY2ggb24gdGhlIGxlZnQgc2lkZSBvZiB0aGUgaW5kZXhcblx0XHRcdFx0XHRcdHJpZ2h0ID0gaTE7XG5cdFx0XHRcdFx0XHRpMSA9IDA7XG5cdFx0XHRcdFx0XHRicmVhayBsaW5lYXJfc2NhbjtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIHRoZSBpbnRlcnZhbCBpcyB2YWxpZFxuXG5cdFx0XHRcdFx0YnJlYWsgdmFsaWRhdGVfaW50ZXJ2YWw7XG5cblx0XHRcdFx0fSAvLyBsaW5lYXIgc2NhblxuXG5cdFx0XHRcdC8vIGJpbmFyeSBzZWFyY2hcblxuXHRcdFx0XHR3aGlsZSAoIGkxIDwgcmlnaHQgKSB7XG5cblx0XHRcdFx0XHR2YXIgbWlkID0gKCBpMSArIHJpZ2h0ICkgPj4+IDE7XG5cblx0XHRcdFx0XHRpZiAoIHQgPCBwcFsgbWlkIF0gKSB7XG5cblx0XHRcdFx0XHRcdHJpZ2h0ID0gbWlkO1xuXG5cdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0aTEgPSBtaWQgKyAxO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0MSA9IHBwWyBpMSBdO1xuXHRcdFx0XHR0MCA9IHBwWyBpMSAtIDEgXTtcblxuXHRcdFx0XHQvLyBjaGVjayBib3VuZGFyeSBjYXNlcywgYWdhaW5cblxuXHRcdFx0XHRpZiAoIHQwID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHR0aGlzLl9jYWNoZWRJbmRleCA9IDA7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuYmVmb3JlU3RhcnRfKCAwLCB0LCB0MSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIHQxID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRpMSA9IHBwLmxlbmd0aDtcblx0XHRcdFx0XHR0aGlzLl9jYWNoZWRJbmRleCA9IGkxO1xuXHRcdFx0XHRcdHJldHVybiB0aGlzLmFmdGVyRW5kXyggaTEgLSAxLCB0MCwgdCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSAvLyBzZWVrXG5cblx0XHRcdHRoaXMuX2NhY2hlZEluZGV4ID0gaTE7XG5cblx0XHRcdHRoaXMuaW50ZXJ2YWxDaGFuZ2VkXyggaTEsIHQwLCB0MSApO1xuXG5cdFx0fSAvLyB2YWxpZGF0ZV9pbnRlcnZhbFxuXG5cdFx0cmV0dXJuIHRoaXMuaW50ZXJwb2xhdGVfKCBpMSwgdDAsIHQsIHQxICk7XG5cblx0fSxcblxuXHRzZXR0aW5nczogbnVsbCwgLy8gb3B0aW9uYWwsIHN1YmNsYXNzLXNwZWNpZmljIHNldHRpbmdzIHN0cnVjdHVyZVxuXHQvLyBOb3RlOiBUaGUgaW5kaXJlY3Rpb24gYWxsb3dzIGNlbnRyYWwgY29udHJvbCBvZiBtYW55IGludGVycG9sYW50cy5cblxuXHQvLyAtLS0gUHJvdGVjdGVkIGludGVyZmFjZVxuXG5cdERlZmF1bHRTZXR0aW5nc186IHt9LFxuXG5cdGdldFNldHRpbmdzXzogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuc2V0dGluZ3MgfHwgdGhpcy5EZWZhdWx0U2V0dGluZ3NfO1xuXG5cdH0sXG5cblx0Y29weVNhbXBsZVZhbHVlXzogZnVuY3Rpb24gKCBpbmRleCApIHtcblxuXHRcdC8vIGNvcGllcyBhIHNhbXBsZSB2YWx1ZSB0byB0aGUgcmVzdWx0IGJ1ZmZlclxuXG5cdFx0dmFyIHJlc3VsdCA9IHRoaXMucmVzdWx0QnVmZmVyLFxuXHRcdFx0dmFsdWVzID0gdGhpcy5zYW1wbGVWYWx1ZXMsXG5cdFx0XHRzdHJpZGUgPSB0aGlzLnZhbHVlU2l6ZSxcblx0XHRcdG9mZnNldCA9IGluZGV4ICogc3RyaWRlO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpICE9PSBzdHJpZGU7ICsrIGkgKSB7XG5cblx0XHRcdHJlc3VsdFsgaSBdID0gdmFsdWVzWyBvZmZzZXQgKyBpIF07XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXG5cdH0sXG5cblx0Ly8gVGVtcGxhdGUgbWV0aG9kcyBmb3IgZGVyaXZlZCBjbGFzc2VzOlxuXG5cdGludGVycG9sYXRlXzogZnVuY3Rpb24gKCAvKiBpMSwgdDAsIHQsIHQxICovICkge1xuXG5cdFx0dGhyb3cgbmV3IEVycm9yKCAnY2FsbCB0byBhYnN0cmFjdCBtZXRob2QnICk7XG5cdFx0Ly8gaW1wbGVtZW50YXRpb25zIHNoYWxsIHJldHVybiB0aGlzLnJlc3VsdEJ1ZmZlclxuXG5cdH0sXG5cblx0aW50ZXJ2YWxDaGFuZ2VkXzogZnVuY3Rpb24gKCAvKiBpMSwgdDAsIHQxICovICkge1xuXG5cdFx0Ly8gZW1wdHlcblxuXHR9XG5cbn0gKTtcblxuLy8hXFwgREVDTEFSRSBBTElBUyBBRlRFUiBhc3NpZ24gcHJvdG90eXBlICFcbk9iamVjdC5hc3NpZ24oIEludGVycG9sYW50LnByb3RvdHlwZSwge1xuXG5cdC8vKCAwLCB0LCB0MCApLCByZXR1cm5zIHRoaXMucmVzdWx0QnVmZmVyXG5cdGJlZm9yZVN0YXJ0XzogSW50ZXJwb2xhbnQucHJvdG90eXBlLmNvcHlTYW1wbGVWYWx1ZV8sXG5cblx0Ly8oIE4tMSwgdE4tMSwgdCApLCByZXR1cm5zIHRoaXMucmVzdWx0QnVmZmVyXG5cdGFmdGVyRW5kXzogSW50ZXJwb2xhbnQucHJvdG90eXBlLmNvcHlTYW1wbGVWYWx1ZV8sXG5cbn0gKTtcblxuLyoqXG4gKiBTcGhlcmljYWwgbGluZWFyIHVuaXQgcXVhdGVybmlvbiBpbnRlcnBvbGFudC5cbiAqXG4gKiBAYXV0aG9yIHRzY2h3XG4gKi9cblxuZnVuY3Rpb24gUXVhdGVybmlvbkxpbmVhckludGVycG9sYW50KCBwYXJhbWV0ZXJQb3NpdGlvbnMsIHNhbXBsZVZhbHVlcywgc2FtcGxlU2l6ZSwgcmVzdWx0QnVmZmVyICkge1xuXG5cdEludGVycG9sYW50LmNhbGwoIHRoaXMsIHBhcmFtZXRlclBvc2l0aW9ucywgc2FtcGxlVmFsdWVzLCBzYW1wbGVTaXplLCByZXN1bHRCdWZmZXIgKTtcblxufVxuXG5RdWF0ZXJuaW9uTGluZWFySW50ZXJwb2xhbnQucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggSW50ZXJwb2xhbnQucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogUXVhdGVybmlvbkxpbmVhckludGVycG9sYW50LFxuXG5cdGludGVycG9sYXRlXzogZnVuY3Rpb24gKCBpMSwgdDAsIHQsIHQxICkge1xuXG5cdFx0dmFyIHJlc3VsdCA9IHRoaXMucmVzdWx0QnVmZmVyLFxuXHRcdFx0dmFsdWVzID0gdGhpcy5zYW1wbGVWYWx1ZXMsXG5cdFx0XHRzdHJpZGUgPSB0aGlzLnZhbHVlU2l6ZSxcblxuXHRcdFx0b2Zmc2V0ID0gaTEgKiBzdHJpZGUsXG5cblx0XHRcdGFscGhhID0gKCB0IC0gdDAgKSAvICggdDEgLSB0MCApO1xuXG5cdFx0Zm9yICggdmFyIGVuZCA9IG9mZnNldCArIHN0cmlkZTsgb2Zmc2V0ICE9PSBlbmQ7IG9mZnNldCArPSA0ICkge1xuXG5cdFx0XHRRdWF0ZXJuaW9uLnNsZXJwRmxhdCggcmVzdWx0LCAwLCB2YWx1ZXMsIG9mZnNldCAtIHN0cmlkZSwgdmFsdWVzLCBvZmZzZXQsIGFscGhhICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqXG4gKiBBIFRyYWNrIG9mIHF1YXRlcm5pb24ga2V5ZnJhbWUgdmFsdWVzLlxuICpcbiAqIEBhdXRob3IgQmVuIEhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8vXG4gKiBAYXV0aG9yIERhdmlkIFNhcm5vIC8gaHR0cDovL2xpZ2h0aGF1cy51cy9cbiAqIEBhdXRob3IgdHNjaHdcbiAqL1xuXG5mdW5jdGlvbiBRdWF0ZXJuaW9uS2V5ZnJhbWVUcmFjayggbmFtZSwgdGltZXMsIHZhbHVlcywgaW50ZXJwb2xhdGlvbiApIHtcblxuXHRLZXlmcmFtZVRyYWNrLmNhbGwoIHRoaXMsIG5hbWUsIHRpbWVzLCB2YWx1ZXMsIGludGVycG9sYXRpb24gKTtcblxufVxuXG5RdWF0ZXJuaW9uS2V5ZnJhbWVUcmFjay5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBLZXlmcmFtZVRyYWNrLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IFF1YXRlcm5pb25LZXlmcmFtZVRyYWNrLFxuXG5cdFZhbHVlVHlwZU5hbWU6ICdxdWF0ZXJuaW9uJyxcblxuXHQvLyBWYWx1ZUJ1ZmZlclR5cGUgaXMgaW5oZXJpdGVkXG5cblx0RGVmYXVsdEludGVycG9sYXRpb246IEludGVycG9sYXRlTGluZWFyLFxuXG5cdEludGVycG9sYW50RmFjdG9yeU1ldGhvZExpbmVhcjogZnVuY3Rpb24gKCByZXN1bHQgKSB7XG5cblx0XHRyZXR1cm4gbmV3IFF1YXRlcm5pb25MaW5lYXJJbnRlcnBvbGFudCggdGhpcy50aW1lcywgdGhpcy52YWx1ZXMsIHRoaXMuZ2V0VmFsdWVTaXplKCksIHJlc3VsdCApO1xuXG5cdH0sXG5cblx0SW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kU21vb3RoOiB1bmRlZmluZWQgLy8gbm90IHlldCBpbXBsZW1lbnRlZFxuXG59ICk7XG5cbi8qKlxuICpcbiAqIEEgVHJhY2sgb2Yga2V5ZnJhbWUgdmFsdWVzIHRoYXQgcmVwcmVzZW50IGNvbG9yLlxuICpcbiAqXG4gKiBAYXV0aG9yIEJlbiBIb3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvL1xuICogQGF1dGhvciBEYXZpZCBTYXJubyAvIGh0dHA6Ly9saWdodGhhdXMudXMvXG4gKiBAYXV0aG9yIHRzY2h3XG4gKi9cblxuZnVuY3Rpb24gQ29sb3JLZXlmcmFtZVRyYWNrKCBuYW1lLCB0aW1lcywgdmFsdWVzLCBpbnRlcnBvbGF0aW9uICkge1xuXG5cdEtleWZyYW1lVHJhY2suY2FsbCggdGhpcywgbmFtZSwgdGltZXMsIHZhbHVlcywgaW50ZXJwb2xhdGlvbiApO1xuXG59XG5cbkNvbG9yS2V5ZnJhbWVUcmFjay5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBLZXlmcmFtZVRyYWNrLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IENvbG9yS2V5ZnJhbWVUcmFjayxcblxuXHRWYWx1ZVR5cGVOYW1lOiAnY29sb3InXG5cblx0Ly8gVmFsdWVCdWZmZXJUeXBlIGlzIGluaGVyaXRlZFxuXG5cdC8vIERlZmF1bHRJbnRlcnBvbGF0aW9uIGlzIGluaGVyaXRlZFxuXG5cdC8vIE5vdGU6IFZlcnkgYmFzaWMgaW1wbGVtZW50YXRpb24gYW5kIG5vdGhpbmcgc3BlY2lhbCB5ZXQuXG5cdC8vIEhvd2V2ZXIsIHRoaXMgaXMgdGhlIHBsYWNlIGZvciBjb2xvciBzcGFjZSBwYXJhbWV0ZXJpemF0aW9uLlxuXG59ICk7XG5cbi8qKlxuICpcbiAqIEEgVHJhY2sgb2YgbnVtZXJpYyBrZXlmcmFtZSB2YWx1ZXMuXG4gKlxuICogQGF1dGhvciBCZW4gSG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pby9cbiAqIEBhdXRob3IgRGF2aWQgU2Fybm8gLyBodHRwOi8vbGlnaHRoYXVzLnVzL1xuICogQGF1dGhvciB0c2Nod1xuICovXG5cbmZ1bmN0aW9uIE51bWJlcktleWZyYW1lVHJhY2soIG5hbWUsIHRpbWVzLCB2YWx1ZXMsIGludGVycG9sYXRpb24gKSB7XG5cblx0S2V5ZnJhbWVUcmFjay5jYWxsKCB0aGlzLCBuYW1lLCB0aW1lcywgdmFsdWVzLCBpbnRlcnBvbGF0aW9uICk7XG5cbn1cblxuTnVtYmVyS2V5ZnJhbWVUcmFjay5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBLZXlmcmFtZVRyYWNrLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IE51bWJlcktleWZyYW1lVHJhY2ssXG5cblx0VmFsdWVUeXBlTmFtZTogJ251bWJlcidcblxuXHQvLyBWYWx1ZUJ1ZmZlclR5cGUgaXMgaW5oZXJpdGVkXG5cblx0Ly8gRGVmYXVsdEludGVycG9sYXRpb24gaXMgaW5oZXJpdGVkXG5cbn0gKTtcblxuLyoqXG4gKiBGYXN0IGFuZCBzaW1wbGUgY3ViaWMgc3BsaW5lIGludGVycG9sYW50LlxuICpcbiAqIEl0IHdhcyBkZXJpdmVkIGZyb20gYSBIZXJtaXRpYW4gY29uc3RydWN0aW9uIHNldHRpbmcgdGhlIGZpcnN0IGRlcml2YXRpdmVcbiAqIGF0IGVhY2ggc2FtcGxlIHBvc2l0aW9uIHRvIHRoZSBsaW5lYXIgc2xvcGUgYmV0d2VlbiBuZWlnaGJvcmluZyBwb3NpdGlvbnNcbiAqIG92ZXIgdGhlaXIgcGFyYW1ldGVyIGludGVydmFsLlxuICpcbiAqIEBhdXRob3IgdHNjaHdcbiAqL1xuXG5mdW5jdGlvbiBDdWJpY0ludGVycG9sYW50KCBwYXJhbWV0ZXJQb3NpdGlvbnMsIHNhbXBsZVZhbHVlcywgc2FtcGxlU2l6ZSwgcmVzdWx0QnVmZmVyICkge1xuXG5cdEludGVycG9sYW50LmNhbGwoIHRoaXMsIHBhcmFtZXRlclBvc2l0aW9ucywgc2FtcGxlVmFsdWVzLCBzYW1wbGVTaXplLCByZXN1bHRCdWZmZXIgKTtcblxuXHR0aGlzLl93ZWlnaHRQcmV2ID0gLSAwO1xuXHR0aGlzLl9vZmZzZXRQcmV2ID0gLSAwO1xuXHR0aGlzLl93ZWlnaHROZXh0ID0gLSAwO1xuXHR0aGlzLl9vZmZzZXROZXh0ID0gLSAwO1xuXG59XG5cbkN1YmljSW50ZXJwb2xhbnQucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggSW50ZXJwb2xhbnQucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogQ3ViaWNJbnRlcnBvbGFudCxcblxuXHREZWZhdWx0U2V0dGluZ3NfOiB7XG5cblx0XHRlbmRpbmdTdGFydDogWmVyb0N1cnZhdHVyZUVuZGluZyxcblx0XHRlbmRpbmdFbmQ6IFplcm9DdXJ2YXR1cmVFbmRpbmdcblxuXHR9LFxuXG5cdGludGVydmFsQ2hhbmdlZF86IGZ1bmN0aW9uICggaTEsIHQwLCB0MSApIHtcblxuXHRcdHZhciBwcCA9IHRoaXMucGFyYW1ldGVyUG9zaXRpb25zLFxuXHRcdFx0aVByZXYgPSBpMSAtIDIsXG5cdFx0XHRpTmV4dCA9IGkxICsgMSxcblxuXHRcdFx0dFByZXYgPSBwcFsgaVByZXYgXSxcblx0XHRcdHROZXh0ID0gcHBbIGlOZXh0IF07XG5cblx0XHRpZiAoIHRQcmV2ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHN3aXRjaCAoIHRoaXMuZ2V0U2V0dGluZ3NfKCkuZW5kaW5nU3RhcnQgKSB7XG5cblx0XHRcdFx0Y2FzZSBaZXJvU2xvcGVFbmRpbmc6XG5cblx0XHRcdFx0XHQvLyBmJyh0MCkgPSAwXG5cdFx0XHRcdFx0aVByZXYgPSBpMTtcblx0XHRcdFx0XHR0UHJldiA9IDIgKiB0MCAtIHQxO1xuXG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSBXcmFwQXJvdW5kRW5kaW5nOlxuXG5cdFx0XHRcdFx0Ly8gdXNlIHRoZSBvdGhlciBlbmQgb2YgdGhlIGN1cnZlXG5cdFx0XHRcdFx0aVByZXYgPSBwcC5sZW5ndGggLSAyO1xuXHRcdFx0XHRcdHRQcmV2ID0gdDAgKyBwcFsgaVByZXYgXSAtIHBwWyBpUHJldiArIDEgXTtcblxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGRlZmF1bHQ6IC8vIFplcm9DdXJ2YXR1cmVFbmRpbmdcblxuXHRcdFx0XHRcdC8vIGYnJyh0MCkgPSAwIGEuay5hLiBOYXR1cmFsIFNwbGluZVxuXHRcdFx0XHRcdGlQcmV2ID0gaTE7XG5cdFx0XHRcdFx0dFByZXYgPSB0MTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCB0TmV4dCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRzd2l0Y2ggKCB0aGlzLmdldFNldHRpbmdzXygpLmVuZGluZ0VuZCApIHtcblxuXHRcdFx0XHRjYXNlIFplcm9TbG9wZUVuZGluZzpcblxuXHRcdFx0XHRcdC8vIGYnKHROKSA9IDBcblx0XHRcdFx0XHRpTmV4dCA9IGkxO1xuXHRcdFx0XHRcdHROZXh0ID0gMiAqIHQxIC0gdDA7XG5cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlIFdyYXBBcm91bmRFbmRpbmc6XG5cblx0XHRcdFx0XHQvLyB1c2UgdGhlIG90aGVyIGVuZCBvZiB0aGUgY3VydmVcblx0XHRcdFx0XHRpTmV4dCA9IDE7XG5cdFx0XHRcdFx0dE5leHQgPSB0MSArIHBwWyAxIF0gLSBwcFsgMCBdO1xuXG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0ZGVmYXVsdDogLy8gWmVyb0N1cnZhdHVyZUVuZGluZ1xuXG5cdFx0XHRcdFx0Ly8gZicnKHROKSA9IDAsIGEuay5hLiBOYXR1cmFsIFNwbGluZVxuXHRcdFx0XHRcdGlOZXh0ID0gaTEgLSAxO1xuXHRcdFx0XHRcdHROZXh0ID0gdDA7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHZhciBoYWxmRHQgPSAoIHQxIC0gdDAgKSAqIDAuNSxcblx0XHRcdHN0cmlkZSA9IHRoaXMudmFsdWVTaXplO1xuXG5cdFx0dGhpcy5fd2VpZ2h0UHJldiA9IGhhbGZEdCAvICggdDAgLSB0UHJldiApO1xuXHRcdHRoaXMuX3dlaWdodE5leHQgPSBoYWxmRHQgLyAoIHROZXh0IC0gdDEgKTtcblx0XHR0aGlzLl9vZmZzZXRQcmV2ID0gaVByZXYgKiBzdHJpZGU7XG5cdFx0dGhpcy5fb2Zmc2V0TmV4dCA9IGlOZXh0ICogc3RyaWRlO1xuXG5cdH0sXG5cblx0aW50ZXJwb2xhdGVfOiBmdW5jdGlvbiAoIGkxLCB0MCwgdCwgdDEgKSB7XG5cblx0XHR2YXIgcmVzdWx0ID0gdGhpcy5yZXN1bHRCdWZmZXIsXG5cdFx0XHR2YWx1ZXMgPSB0aGlzLnNhbXBsZVZhbHVlcyxcblx0XHRcdHN0cmlkZSA9IHRoaXMudmFsdWVTaXplLFxuXG5cdFx0XHRvMSA9IGkxICogc3RyaWRlLFx0XHRvMCA9IG8xIC0gc3RyaWRlLFxuXHRcdFx0b1AgPSB0aGlzLl9vZmZzZXRQcmV2LCBcdG9OID0gdGhpcy5fb2Zmc2V0TmV4dCxcblx0XHRcdHdQID0gdGhpcy5fd2VpZ2h0UHJldixcdHdOID0gdGhpcy5fd2VpZ2h0TmV4dCxcblxuXHRcdFx0cCA9ICggdCAtIHQwICkgLyAoIHQxIC0gdDAgKSxcblx0XHRcdHBwID0gcCAqIHAsXG5cdFx0XHRwcHAgPSBwcCAqIHA7XG5cblx0XHQvLyBldmFsdWF0ZSBwb2x5bm9taWFsc1xuXG5cdFx0dmFyIHNQID0gLSB3UCAqIHBwcCArIDIgKiB3UCAqIHBwIC0gd1AgKiBwO1xuXHRcdHZhciBzMCA9ICggMSArIHdQICkgKiBwcHAgKyAoIC0gMS41IC0gMiAqIHdQICkgKiBwcCArICggLSAwLjUgKyB3UCApICogcCArIDE7XG5cdFx0dmFyIHMxID0gKCAtIDEgLSB3TiApICogcHBwICsgKCAxLjUgKyB3TiApICogcHAgKyAwLjUgKiBwO1xuXHRcdHZhciBzTiA9IHdOICogcHBwIC0gd04gKiBwcDtcblxuXHRcdC8vIGNvbWJpbmUgZGF0YSBsaW5lYXJseVxuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpICE9PSBzdHJpZGU7ICsrIGkgKSB7XG5cblx0XHRcdHJlc3VsdFsgaSBdID1cblx0XHRcdFx0XHRzUCAqIHZhbHVlc1sgb1AgKyBpIF0gK1xuXHRcdFx0XHRcdHMwICogdmFsdWVzWyBvMCArIGkgXSArXG5cdFx0XHRcdFx0czEgKiB2YWx1ZXNbIG8xICsgaSBdICtcblx0XHRcdFx0XHRzTiAqIHZhbHVlc1sgb04gKyBpIF07XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgdHNjaHdcbiAqL1xuXG5mdW5jdGlvbiBMaW5lYXJJbnRlcnBvbGFudCggcGFyYW1ldGVyUG9zaXRpb25zLCBzYW1wbGVWYWx1ZXMsIHNhbXBsZVNpemUsIHJlc3VsdEJ1ZmZlciApIHtcblxuXHRJbnRlcnBvbGFudC5jYWxsKCB0aGlzLCBwYXJhbWV0ZXJQb3NpdGlvbnMsIHNhbXBsZVZhbHVlcywgc2FtcGxlU2l6ZSwgcmVzdWx0QnVmZmVyICk7XG5cbn1cblxuTGluZWFySW50ZXJwb2xhbnQucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggSW50ZXJwb2xhbnQucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogTGluZWFySW50ZXJwb2xhbnQsXG5cblx0aW50ZXJwb2xhdGVfOiBmdW5jdGlvbiAoIGkxLCB0MCwgdCwgdDEgKSB7XG5cblx0XHR2YXIgcmVzdWx0ID0gdGhpcy5yZXN1bHRCdWZmZXIsXG5cdFx0XHR2YWx1ZXMgPSB0aGlzLnNhbXBsZVZhbHVlcyxcblx0XHRcdHN0cmlkZSA9IHRoaXMudmFsdWVTaXplLFxuXG5cdFx0XHRvZmZzZXQxID0gaTEgKiBzdHJpZGUsXG5cdFx0XHRvZmZzZXQwID0gb2Zmc2V0MSAtIHN0cmlkZSxcblxuXHRcdFx0d2VpZ2h0MSA9ICggdCAtIHQwICkgLyAoIHQxIC0gdDAgKSxcblx0XHRcdHdlaWdodDAgPSAxIC0gd2VpZ2h0MTtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSAhPT0gc3RyaWRlOyArKyBpICkge1xuXG5cdFx0XHRyZXN1bHRbIGkgXSA9XG5cdFx0XHRcdFx0dmFsdWVzWyBvZmZzZXQwICsgaSBdICogd2VpZ2h0MCArXG5cdFx0XHRcdFx0dmFsdWVzWyBvZmZzZXQxICsgaSBdICogd2VpZ2h0MTtcblxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICpcbiAqIEludGVycG9sYW50IHRoYXQgZXZhbHVhdGVzIHRvIHRoZSBzYW1wbGUgdmFsdWUgYXQgdGhlIHBvc2l0aW9uIHByZWNlZWRpbmdcbiAqIHRoZSBwYXJhbWV0ZXIuXG4gKlxuICogQGF1dGhvciB0c2Nod1xuICovXG5cbmZ1bmN0aW9uIERpc2NyZXRlSW50ZXJwb2xhbnQoIHBhcmFtZXRlclBvc2l0aW9ucywgc2FtcGxlVmFsdWVzLCBzYW1wbGVTaXplLCByZXN1bHRCdWZmZXIgKSB7XG5cblx0SW50ZXJwb2xhbnQuY2FsbCggdGhpcywgcGFyYW1ldGVyUG9zaXRpb25zLCBzYW1wbGVWYWx1ZXMsIHNhbXBsZVNpemUsIHJlc3VsdEJ1ZmZlciApO1xuXG59XG5cbkRpc2NyZXRlSW50ZXJwb2xhbnQucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggSW50ZXJwb2xhbnQucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogRGlzY3JldGVJbnRlcnBvbGFudCxcblxuXHRpbnRlcnBvbGF0ZV86IGZ1bmN0aW9uICggaTEgLyosIHQwLCB0LCB0MSAqLyApIHtcblxuXHRcdHJldHVybiB0aGlzLmNvcHlTYW1wbGVWYWx1ZV8oIGkxIC0gMSApO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgdHNjaHdcbiAqIEBhdXRob3IgQmVuIEhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8vXG4gKiBAYXV0aG9yIERhdmlkIFNhcm5vIC8gaHR0cDovL2xpZ2h0aGF1cy51cy9cbiAqL1xuXG52YXIgQW5pbWF0aW9uVXRpbHMgPSB7XG5cblx0Ly8gc2FtZSBhcyBBcnJheS5wcm90b3R5cGUuc2xpY2UsIGJ1dCBhbHNvIHdvcmtzIG9uIHR5cGVkIGFycmF5c1xuXHRhcnJheVNsaWNlOiBmdW5jdGlvbiAoIGFycmF5LCBmcm9tLCB0byApIHtcblxuXHRcdGlmICggQW5pbWF0aW9uVXRpbHMuaXNUeXBlZEFycmF5KCBhcnJheSApICkge1xuXG5cdFx0XHQvLyBpbiBpb3M5IGFycmF5LnN1YmFycmF5KGZyb20sIHVuZGVmaW5lZCkgd2lsbCByZXR1cm4gZW1wdHkgYXJyYXlcblx0XHRcdC8vIGJ1dCBhcnJheS5zdWJhcnJheShmcm9tKSBvciBhcnJheS5zdWJhcnJheShmcm9tLCBsZW4pIGlzIGNvcnJlY3Rcblx0XHRcdHJldHVybiBuZXcgYXJyYXkuY29uc3RydWN0b3IoIGFycmF5LnN1YmFycmF5KCBmcm9tLCB0byAhPT0gdW5kZWZpbmVkID8gdG8gOiBhcnJheS5sZW5ndGggKSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGFycmF5LnNsaWNlKCBmcm9tLCB0byApO1xuXG5cdH0sXG5cblx0Ly8gY29udmVydHMgYW4gYXJyYXkgdG8gYSBzcGVjaWZpYyB0eXBlXG5cdGNvbnZlcnRBcnJheTogZnVuY3Rpb24gKCBhcnJheSwgdHlwZSwgZm9yY2VDbG9uZSApIHtcblxuXHRcdGlmICggISBhcnJheSB8fCAvLyBsZXQgJ3VuZGVmaW5lZCcgYW5kICdudWxsJyBwYXNzXG5cdFx0XHRcdCEgZm9yY2VDbG9uZSAmJiBhcnJheS5jb25zdHJ1Y3RvciA9PT0gdHlwZSApIHJldHVybiBhcnJheTtcblxuXHRcdGlmICggdHlwZW9mIHR5cGUuQllURVNfUEVSX0VMRU1FTlQgPT09ICdudW1iZXInICkge1xuXG5cdFx0XHRyZXR1cm4gbmV3IHR5cGUoIGFycmF5ICk7IC8vIGNyZWF0ZSB0eXBlZCBhcnJheVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKCBhcnJheSApOyAvLyBjcmVhdGUgQXJyYXlcblxuXHR9LFxuXG5cdGlzVHlwZWRBcnJheTogZnVuY3Rpb24gKCBvYmplY3QgKSB7XG5cblx0XHRyZXR1cm4gQXJyYXlCdWZmZXIuaXNWaWV3KCBvYmplY3QgKSAmJlxuXHRcdFx0XHQhICggb2JqZWN0IGluc3RhbmNlb2YgRGF0YVZpZXcgKTtcblxuXHR9LFxuXG5cdC8vIHJldHVybnMgYW4gYXJyYXkgYnkgd2hpY2ggdGltZXMgYW5kIHZhbHVlcyBjYW4gYmUgc29ydGVkXG5cdGdldEtleWZyYW1lT3JkZXI6IGZ1bmN0aW9uICggdGltZXMgKSB7XG5cblx0XHRmdW5jdGlvbiBjb21wYXJlVGltZSggaSwgaiApIHtcblxuXHRcdFx0cmV0dXJuIHRpbWVzWyBpIF0gLSB0aW1lc1sgaiBdO1xuXG5cdFx0fVxuXG5cdFx0dmFyIG4gPSB0aW1lcy5sZW5ndGg7XG5cdFx0dmFyIHJlc3VsdCA9IG5ldyBBcnJheSggbiApO1xuXHRcdGZvciAoIHZhciBpID0gMDsgaSAhPT0gbjsgKysgaSApIHJlc3VsdFsgaSBdID0gaTtcblxuXHRcdHJlc3VsdC5zb3J0KCBjb21wYXJlVGltZSApO1xuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblxuXHR9LFxuXG5cdC8vIHVzZXMgdGhlIGFycmF5IHByZXZpb3VzbHkgcmV0dXJuZWQgYnkgJ2dldEtleWZyYW1lT3JkZXInIHRvIHNvcnQgZGF0YVxuXHRzb3J0ZWRBcnJheTogZnVuY3Rpb24gKCB2YWx1ZXMsIHN0cmlkZSwgb3JkZXIgKSB7XG5cblx0XHR2YXIgblZhbHVlcyA9IHZhbHVlcy5sZW5ndGg7XG5cdFx0dmFyIHJlc3VsdCA9IG5ldyB2YWx1ZXMuY29uc3RydWN0b3IoIG5WYWx1ZXMgKTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgZHN0T2Zmc2V0ID0gMDsgZHN0T2Zmc2V0ICE9PSBuVmFsdWVzOyArKyBpICkge1xuXG5cdFx0XHR2YXIgc3JjT2Zmc2V0ID0gb3JkZXJbIGkgXSAqIHN0cmlkZTtcblxuXHRcdFx0Zm9yICggdmFyIGogPSAwOyBqICE9PSBzdHJpZGU7ICsrIGogKSB7XG5cblx0XHRcdFx0cmVzdWx0WyBkc3RPZmZzZXQgKysgXSA9IHZhbHVlc1sgc3JjT2Zmc2V0ICsgaiBdO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXG5cdH0sXG5cblx0Ly8gZnVuY3Rpb24gZm9yIHBhcnNpbmcgQU9TIGtleWZyYW1lIGZvcm1hdHNcblx0ZmxhdHRlbkpTT046IGZ1bmN0aW9uICgganNvbktleXMsIHRpbWVzLCB2YWx1ZXMsIHZhbHVlUHJvcGVydHlOYW1lICkge1xuXG5cdFx0dmFyIGkgPSAxLCBrZXkgPSBqc29uS2V5c1sgMCBdO1xuXG5cdFx0d2hpbGUgKCBrZXkgIT09IHVuZGVmaW5lZCAmJiBrZXlbIHZhbHVlUHJvcGVydHlOYW1lIF0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0a2V5ID0ganNvbktleXNbIGkgKysgXTtcblxuXHRcdH1cblxuXHRcdGlmICgga2V5ID09PSB1bmRlZmluZWQgKSByZXR1cm47IC8vIG5vIGRhdGFcblxuXHRcdHZhciB2YWx1ZSA9IGtleVsgdmFsdWVQcm9wZXJ0eU5hbWUgXTtcblx0XHRpZiAoIHZhbHVlID09PSB1bmRlZmluZWQgKSByZXR1cm47IC8vIG5vIGRhdGFcblxuXHRcdGlmICggQXJyYXkuaXNBcnJheSggdmFsdWUgKSApIHtcblxuXHRcdFx0ZG8ge1xuXG5cdFx0XHRcdHZhbHVlID0ga2V5WyB2YWx1ZVByb3BlcnR5TmFtZSBdO1xuXG5cdFx0XHRcdGlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdHRpbWVzLnB1c2goIGtleS50aW1lICk7XG5cdFx0XHRcdFx0dmFsdWVzLnB1c2guYXBwbHkoIHZhbHVlcywgdmFsdWUgKTsgLy8gcHVzaCBhbGwgZWxlbWVudHNcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0a2V5ID0ganNvbktleXNbIGkgKysgXTtcblxuXHRcdFx0fSB3aGlsZSAoIGtleSAhPT0gdW5kZWZpbmVkICk7XG5cblx0XHR9IGVsc2UgaWYgKCB2YWx1ZS50b0FycmF5ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdC8vIC4uLmFzc3VtZSBUSFJFRS5NYXRoLWlzaFxuXG5cdFx0XHRkbyB7XG5cblx0XHRcdFx0dmFsdWUgPSBrZXlbIHZhbHVlUHJvcGVydHlOYW1lIF07XG5cblx0XHRcdFx0aWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0dGltZXMucHVzaCgga2V5LnRpbWUgKTtcblx0XHRcdFx0XHR2YWx1ZS50b0FycmF5KCB2YWx1ZXMsIHZhbHVlcy5sZW5ndGggKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0a2V5ID0ganNvbktleXNbIGkgKysgXTtcblxuXHRcdFx0fSB3aGlsZSAoIGtleSAhPT0gdW5kZWZpbmVkICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBvdGhlcndpc2UgcHVzaCBhcy1pc1xuXG5cdFx0XHRkbyB7XG5cblx0XHRcdFx0dmFsdWUgPSBrZXlbIHZhbHVlUHJvcGVydHlOYW1lIF07XG5cblx0XHRcdFx0aWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0dGltZXMucHVzaCgga2V5LnRpbWUgKTtcblx0XHRcdFx0XHR2YWx1ZXMucHVzaCggdmFsdWUgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0a2V5ID0ganNvbktleXNbIGkgKysgXTtcblxuXHRcdFx0fSB3aGlsZSAoIGtleSAhPT0gdW5kZWZpbmVkICk7XG5cblx0XHR9XG5cblx0fVxuXG59O1xuXG4vKipcbiAqXG4gKiBBIHRpbWVkIHNlcXVlbmNlIG9mIGtleWZyYW1lcyBmb3IgYSBzcGVjaWZpYyBwcm9wZXJ0eS5cbiAqXG4gKlxuICogQGF1dGhvciBCZW4gSG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pby9cbiAqIEBhdXRob3IgRGF2aWQgU2Fybm8gLyBodHRwOi8vbGlnaHRoYXVzLnVzL1xuICogQGF1dGhvciB0c2Nod1xuICovXG5cbmZ1bmN0aW9uIEtleWZyYW1lVHJhY2soIG5hbWUsIHRpbWVzLCB2YWx1ZXMsIGludGVycG9sYXRpb24gKSB7XG5cblx0aWYgKCBuYW1lID09PSB1bmRlZmluZWQgKSB0aHJvdyBuZXcgRXJyb3IoICdUSFJFRS5LZXlmcmFtZVRyYWNrOiB0cmFjayBuYW1lIGlzIHVuZGVmaW5lZCcgKTtcblx0aWYgKCB0aW1lcyA9PT0gdW5kZWZpbmVkIHx8IHRpbWVzLmxlbmd0aCA9PT0gMCApIHRocm93IG5ldyBFcnJvciggJ1RIUkVFLktleWZyYW1lVHJhY2s6IG5vIGtleWZyYW1lcyBpbiB0cmFjayBuYW1lZCAnICsgbmFtZSApO1xuXG5cdHRoaXMubmFtZSA9IG5hbWU7XG5cblx0dGhpcy50aW1lcyA9IEFuaW1hdGlvblV0aWxzLmNvbnZlcnRBcnJheSggdGltZXMsIHRoaXMuVGltZUJ1ZmZlclR5cGUgKTtcblx0dGhpcy52YWx1ZXMgPSBBbmltYXRpb25VdGlscy5jb252ZXJ0QXJyYXkoIHZhbHVlcywgdGhpcy5WYWx1ZUJ1ZmZlclR5cGUgKTtcblxuXHR0aGlzLnNldEludGVycG9sYXRpb24oIGludGVycG9sYXRpb24gfHwgdGhpcy5EZWZhdWx0SW50ZXJwb2xhdGlvbiApO1xuXG5cdHRoaXMudmFsaWRhdGUoKTtcblx0dGhpcy5vcHRpbWl6ZSgpO1xuXG59XG5cbi8vIFN0YXRpYyBtZXRob2RzOlxuXG5PYmplY3QuYXNzaWduKCBLZXlmcmFtZVRyYWNrLCB7XG5cblx0Ly8gU2VyaWFsaXphdGlvbiAoaW4gc3RhdGljIGNvbnRleHQsIGJlY2F1c2Ugb2YgY29uc3RydWN0b3IgaW52b2NhdGlvblxuXHQvLyBhbmQgYXV0b21hdGljIGludm9jYXRpb24gb2YgLnRvSlNPTik6XG5cblx0cGFyc2U6IGZ1bmN0aW9uICgganNvbiApIHtcblxuXHRcdGlmICgganNvbi50eXBlID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHRocm93IG5ldyBFcnJvciggJ1RIUkVFLktleWZyYW1lVHJhY2s6IHRyYWNrIHR5cGUgdW5kZWZpbmVkLCBjYW4gbm90IHBhcnNlJyApO1xuXG5cdFx0fVxuXG5cdFx0dmFyIHRyYWNrVHlwZSA9IEtleWZyYW1lVHJhY2suX2dldFRyYWNrVHlwZUZvclZhbHVlVHlwZU5hbWUoIGpzb24udHlwZSApO1xuXG5cdFx0aWYgKCBqc29uLnRpbWVzID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHZhciB0aW1lcyA9IFtdLCB2YWx1ZXMgPSBbXTtcblxuXHRcdFx0QW5pbWF0aW9uVXRpbHMuZmxhdHRlbkpTT04oIGpzb24ua2V5cywgdGltZXMsIHZhbHVlcywgJ3ZhbHVlJyApO1xuXG5cdFx0XHRqc29uLnRpbWVzID0gdGltZXM7XG5cdFx0XHRqc29uLnZhbHVlcyA9IHZhbHVlcztcblxuXHRcdH1cblxuXHRcdC8vIGRlcml2ZWQgY2xhc3NlcyBjYW4gZGVmaW5lIGEgc3RhdGljIHBhcnNlIG1ldGhvZFxuXHRcdGlmICggdHJhY2tUeXBlLnBhcnNlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHJldHVybiB0cmFja1R5cGUucGFyc2UoIGpzb24gKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIGJ5IGRlZmF1bHQsIHdlIGFzc3VtZSBhIGNvbnN0cnVjdG9yIGNvbXBhdGlibGUgd2l0aCB0aGUgYmFzZVxuXHRcdFx0cmV0dXJuIG5ldyB0cmFja1R5cGUoIGpzb24ubmFtZSwganNvbi50aW1lcywganNvbi52YWx1ZXMsIGpzb24uaW50ZXJwb2xhdGlvbiApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0dG9KU09OOiBmdW5jdGlvbiAoIHRyYWNrICkge1xuXG5cdFx0dmFyIHRyYWNrVHlwZSA9IHRyYWNrLmNvbnN0cnVjdG9yO1xuXG5cdFx0dmFyIGpzb247XG5cblx0XHQvLyBkZXJpdmVkIGNsYXNzZXMgY2FuIGRlZmluZSBhIHN0YXRpYyB0b0pTT04gbWV0aG9kXG5cdFx0aWYgKCB0cmFja1R5cGUudG9KU09OICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGpzb24gPSB0cmFja1R5cGUudG9KU09OKCB0cmFjayApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gYnkgZGVmYXVsdCwgd2UgYXNzdW1lIHRoZSBkYXRhIGNhbiBiZSBzZXJpYWxpemVkIGFzLWlzXG5cdFx0XHRqc29uID0ge1xuXG5cdFx0XHRcdCduYW1lJzogdHJhY2submFtZSxcblx0XHRcdFx0J3RpbWVzJzogQW5pbWF0aW9uVXRpbHMuY29udmVydEFycmF5KCB0cmFjay50aW1lcywgQXJyYXkgKSxcblx0XHRcdFx0J3ZhbHVlcyc6IEFuaW1hdGlvblV0aWxzLmNvbnZlcnRBcnJheSggdHJhY2sudmFsdWVzLCBBcnJheSApXG5cblx0XHRcdH07XG5cblx0XHRcdHZhciBpbnRlcnBvbGF0aW9uID0gdHJhY2suZ2V0SW50ZXJwb2xhdGlvbigpO1xuXG5cdFx0XHRpZiAoIGludGVycG9sYXRpb24gIT09IHRyYWNrLkRlZmF1bHRJbnRlcnBvbGF0aW9uICkge1xuXG5cdFx0XHRcdGpzb24uaW50ZXJwb2xhdGlvbiA9IGludGVycG9sYXRpb247XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGpzb24udHlwZSA9IHRyYWNrLlZhbHVlVHlwZU5hbWU7IC8vIG1hbmRhdG9yeVxuXG5cdFx0cmV0dXJuIGpzb247XG5cblx0fSxcblxuXHRfZ2V0VHJhY2tUeXBlRm9yVmFsdWVUeXBlTmFtZTogZnVuY3Rpb24gKCB0eXBlTmFtZSApIHtcblxuXHRcdHN3aXRjaCAoIHR5cGVOYW1lLnRvTG93ZXJDYXNlKCkgKSB7XG5cblx0XHRcdGNhc2UgJ3NjYWxhcic6XG5cdFx0XHRjYXNlICdkb3VibGUnOlxuXHRcdFx0Y2FzZSAnZmxvYXQnOlxuXHRcdFx0Y2FzZSAnbnVtYmVyJzpcblx0XHRcdGNhc2UgJ2ludGVnZXInOlxuXG5cdFx0XHRcdHJldHVybiBOdW1iZXJLZXlmcmFtZVRyYWNrO1xuXG5cdFx0XHRjYXNlICd2ZWN0b3InOlxuXHRcdFx0Y2FzZSAndmVjdG9yMic6XG5cdFx0XHRjYXNlICd2ZWN0b3IzJzpcblx0XHRcdGNhc2UgJ3ZlY3RvcjQnOlxuXG5cdFx0XHRcdHJldHVybiBWZWN0b3JLZXlmcmFtZVRyYWNrO1xuXG5cdFx0XHRjYXNlICdjb2xvcic6XG5cblx0XHRcdFx0cmV0dXJuIENvbG9yS2V5ZnJhbWVUcmFjaztcblxuXHRcdFx0Y2FzZSAncXVhdGVybmlvbic6XG5cblx0XHRcdFx0cmV0dXJuIFF1YXRlcm5pb25LZXlmcmFtZVRyYWNrO1xuXG5cdFx0XHRjYXNlICdib29sJzpcblx0XHRcdGNhc2UgJ2Jvb2xlYW4nOlxuXG5cdFx0XHRcdHJldHVybiBCb29sZWFuS2V5ZnJhbWVUcmFjaztcblxuXHRcdFx0Y2FzZSAnc3RyaW5nJzpcblxuXHRcdFx0XHRyZXR1cm4gU3RyaW5nS2V5ZnJhbWVUcmFjaztcblxuXHRcdH1cblxuXHRcdHRocm93IG5ldyBFcnJvciggJ1RIUkVFLktleWZyYW1lVHJhY2s6IFVuc3VwcG9ydGVkIHR5cGVOYW1lOiAnICsgdHlwZU5hbWUgKTtcblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmFzc2lnbiggS2V5ZnJhbWVUcmFjay5wcm90b3R5cGUsIHtcblxuXHRjb25zdHJ1Y3RvcjogS2V5ZnJhbWVUcmFjayxcblxuXHRUaW1lQnVmZmVyVHlwZTogRmxvYXQzMkFycmF5LFxuXG5cdFZhbHVlQnVmZmVyVHlwZTogRmxvYXQzMkFycmF5LFxuXG5cdERlZmF1bHRJbnRlcnBvbGF0aW9uOiBJbnRlcnBvbGF0ZUxpbmVhcixcblxuXHRJbnRlcnBvbGFudEZhY3RvcnlNZXRob2REaXNjcmV0ZTogZnVuY3Rpb24gKCByZXN1bHQgKSB7XG5cblx0XHRyZXR1cm4gbmV3IERpc2NyZXRlSW50ZXJwb2xhbnQoIHRoaXMudGltZXMsIHRoaXMudmFsdWVzLCB0aGlzLmdldFZhbHVlU2l6ZSgpLCByZXN1bHQgKTtcblxuXHR9LFxuXG5cdEludGVycG9sYW50RmFjdG9yeU1ldGhvZExpbmVhcjogZnVuY3Rpb24gKCByZXN1bHQgKSB7XG5cblx0XHRyZXR1cm4gbmV3IExpbmVhckludGVycG9sYW50KCB0aGlzLnRpbWVzLCB0aGlzLnZhbHVlcywgdGhpcy5nZXRWYWx1ZVNpemUoKSwgcmVzdWx0ICk7XG5cblx0fSxcblxuXHRJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGg6IGZ1bmN0aW9uICggcmVzdWx0ICkge1xuXG5cdFx0cmV0dXJuIG5ldyBDdWJpY0ludGVycG9sYW50KCB0aGlzLnRpbWVzLCB0aGlzLnZhbHVlcywgdGhpcy5nZXRWYWx1ZVNpemUoKSwgcmVzdWx0ICk7XG5cblx0fSxcblxuXHRzZXRJbnRlcnBvbGF0aW9uOiBmdW5jdGlvbiAoIGludGVycG9sYXRpb24gKSB7XG5cblx0XHR2YXIgZmFjdG9yeU1ldGhvZDtcblxuXHRcdHN3aXRjaCAoIGludGVycG9sYXRpb24gKSB7XG5cblx0XHRcdGNhc2UgSW50ZXJwb2xhdGVEaXNjcmV0ZTpcblxuXHRcdFx0XHRmYWN0b3J5TWV0aG9kID0gdGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2REaXNjcmV0ZTtcblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBJbnRlcnBvbGF0ZUxpbmVhcjpcblxuXHRcdFx0XHRmYWN0b3J5TWV0aG9kID0gdGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5lYXI7XG5cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgSW50ZXJwb2xhdGVTbW9vdGg6XG5cblx0XHRcdFx0ZmFjdG9yeU1ldGhvZCA9IHRoaXMuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kU21vb3RoO1xuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBmYWN0b3J5TWV0aG9kID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHZhciBtZXNzYWdlID0gXCJ1bnN1cHBvcnRlZCBpbnRlcnBvbGF0aW9uIGZvciBcIiArXG5cdFx0XHRcdHRoaXMuVmFsdWVUeXBlTmFtZSArIFwiIGtleWZyYW1lIHRyYWNrIG5hbWVkIFwiICsgdGhpcy5uYW1lO1xuXG5cdFx0XHRpZiAoIHRoaXMuY3JlYXRlSW50ZXJwb2xhbnQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHQvLyBmYWxsIGJhY2sgdG8gZGVmYXVsdCwgdW5sZXNzIHRoZSBkZWZhdWx0IGl0c2VsZiBpcyBtZXNzZWQgdXBcblx0XHRcdFx0aWYgKCBpbnRlcnBvbGF0aW9uICE9PSB0aGlzLkRlZmF1bHRJbnRlcnBvbGF0aW9uICkge1xuXG5cdFx0XHRcdFx0dGhpcy5zZXRJbnRlcnBvbGF0aW9uKCB0aGlzLkRlZmF1bHRJbnRlcnBvbGF0aW9uICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvciggbWVzc2FnZSApOyAvLyBmYXRhbCwgaW4gdGhpcyBjYXNlXG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLktleWZyYW1lVHJhY2s6JywgbWVzc2FnZSApO1xuXHRcdFx0cmV0dXJuO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5jcmVhdGVJbnRlcnBvbGFudCA9IGZhY3RvcnlNZXRob2Q7XG5cblx0fSxcblxuXHRnZXRJbnRlcnBvbGF0aW9uOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRzd2l0Y2ggKCB0aGlzLmNyZWF0ZUludGVycG9sYW50ICkge1xuXG5cdFx0XHRjYXNlIHRoaXMuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kRGlzY3JldGU6XG5cblx0XHRcdFx0cmV0dXJuIEludGVycG9sYXRlRGlzY3JldGU7XG5cblx0XHRcdGNhc2UgdGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5lYXI6XG5cblx0XHRcdFx0cmV0dXJuIEludGVycG9sYXRlTGluZWFyO1xuXG5cdFx0XHRjYXNlIHRoaXMuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kU21vb3RoOlxuXG5cdFx0XHRcdHJldHVybiBJbnRlcnBvbGF0ZVNtb290aDtcblxuXHRcdH1cblxuXHR9LFxuXG5cdGdldFZhbHVlU2l6ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMudmFsdWVzLmxlbmd0aCAvIHRoaXMudGltZXMubGVuZ3RoO1xuXG5cdH0sXG5cblx0Ly8gbW92ZSBhbGwga2V5ZnJhbWVzIGVpdGhlciBmb3J3YXJkcyBvciBiYWNrd2FyZHMgaW4gdGltZVxuXHRzaGlmdDogZnVuY3Rpb24gKCB0aW1lT2Zmc2V0ICkge1xuXG5cdFx0aWYgKCB0aW1lT2Zmc2V0ICE9PSAwLjAgKSB7XG5cblx0XHRcdHZhciB0aW1lcyA9IHRoaXMudGltZXM7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgbiA9IHRpbWVzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0XHR0aW1lc1sgaSBdICs9IHRpbWVPZmZzZXQ7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Ly8gc2NhbGUgYWxsIGtleWZyYW1lIHRpbWVzIGJ5IGEgZmFjdG9yICh1c2VmdWwgZm9yIGZyYW1lIDwtPiBzZWNvbmRzIGNvbnZlcnNpb25zKVxuXHRzY2FsZTogZnVuY3Rpb24gKCB0aW1lU2NhbGUgKSB7XG5cblx0XHRpZiAoIHRpbWVTY2FsZSAhPT0gMS4wICkge1xuXG5cdFx0XHR2YXIgdGltZXMgPSB0aGlzLnRpbWVzO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIG4gPSB0aW1lcy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRcdFx0dGltZXNbIGkgXSAqPSB0aW1lU2NhbGU7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Ly8gcmVtb3ZlcyBrZXlmcmFtZXMgYmVmb3JlIGFuZCBhZnRlciBhbmltYXRpb24gd2l0aG91dCBjaGFuZ2luZyBhbnkgdmFsdWVzIHdpdGhpbiB0aGUgcmFuZ2UgW3N0YXJ0VGltZSwgZW5kVGltZV0uXG5cdC8vIElNUE9SVEFOVDogV2UgZG8gbm90IHNoaWZ0IGFyb3VuZCBrZXlzIHRvIHRoZSBzdGFydCBvZiB0aGUgdHJhY2sgdGltZSwgYmVjYXVzZSBmb3IgaW50ZXJwb2xhdGVkIGtleXMgdGhpcyB3aWxsIGNoYW5nZSB0aGVpciB2YWx1ZXNcblx0dHJpbTogZnVuY3Rpb24gKCBzdGFydFRpbWUsIGVuZFRpbWUgKSB7XG5cblx0XHR2YXIgdGltZXMgPSB0aGlzLnRpbWVzLFxuXHRcdFx0bktleXMgPSB0aW1lcy5sZW5ndGgsXG5cdFx0XHRmcm9tID0gMCxcblx0XHRcdHRvID0gbktleXMgLSAxO1xuXG5cdFx0d2hpbGUgKCBmcm9tICE9PSBuS2V5cyAmJiB0aW1lc1sgZnJvbSBdIDwgc3RhcnRUaW1lICkge1xuXG5cdFx0XHQrKyBmcm9tO1xuXG5cdFx0fVxuXG5cdFx0d2hpbGUgKCB0byAhPT0gLSAxICYmIHRpbWVzWyB0byBdID4gZW5kVGltZSApIHtcblxuXHRcdFx0LS0gdG87XG5cblx0XHR9XG5cblx0XHQrKyB0bzsgLy8gaW5jbHVzaXZlIC0+IGV4Y2x1c2l2ZSBib3VuZFxuXG5cdFx0aWYgKCBmcm9tICE9PSAwIHx8IHRvICE9PSBuS2V5cyApIHtcblxuXHRcdFx0Ly8gZW1wdHkgdHJhY2tzIGFyZSBmb3JiaWRkZW4sIHNvIGtlZXAgYXQgbGVhc3Qgb25lIGtleWZyYW1lXG5cdFx0XHRpZiAoIGZyb20gPj0gdG8gKSB0byA9IE1hdGgubWF4KCB0bywgMSApLCBmcm9tID0gdG8gLSAxO1xuXG5cdFx0XHR2YXIgc3RyaWRlID0gdGhpcy5nZXRWYWx1ZVNpemUoKTtcblx0XHRcdHRoaXMudGltZXMgPSBBbmltYXRpb25VdGlscy5hcnJheVNsaWNlKCB0aW1lcywgZnJvbSwgdG8gKTtcblx0XHRcdHRoaXMudmFsdWVzID0gQW5pbWF0aW9uVXRpbHMuYXJyYXlTbGljZSggdGhpcy52YWx1ZXMsIGZyb20gKiBzdHJpZGUsIHRvICogc3RyaWRlICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdC8vIGVuc3VyZSB3ZSBkbyBub3QgZ2V0IGEgR2FyYmFnZUluR2FyYmFnZU91dCBzaXR1YXRpb24sIG1ha2Ugc3VyZSB0cmFja3MgYXJlIGF0IGxlYXN0IG1pbmltYWxseSB2aWFibGVcblx0dmFsaWRhdGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2YWxpZCA9IHRydWU7XG5cblx0XHR2YXIgdmFsdWVTaXplID0gdGhpcy5nZXRWYWx1ZVNpemUoKTtcblx0XHRpZiAoIHZhbHVlU2l6ZSAtIE1hdGguZmxvb3IoIHZhbHVlU2l6ZSApICE9PSAwICkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuS2V5ZnJhbWVUcmFjazogSW52YWxpZCB2YWx1ZSBzaXplIGluIHRyYWNrLicsIHRoaXMgKTtcblx0XHRcdHZhbGlkID0gZmFsc2U7XG5cblx0XHR9XG5cblx0XHR2YXIgdGltZXMgPSB0aGlzLnRpbWVzLFxuXHRcdFx0dmFsdWVzID0gdGhpcy52YWx1ZXMsXG5cblx0XHRcdG5LZXlzID0gdGltZXMubGVuZ3RoO1xuXG5cdFx0aWYgKCBuS2V5cyA9PT0gMCApIHtcblxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLktleWZyYW1lVHJhY2s6IFRyYWNrIGlzIGVtcHR5LicsIHRoaXMgKTtcblx0XHRcdHZhbGlkID0gZmFsc2U7XG5cblx0XHR9XG5cblx0XHR2YXIgcHJldlRpbWUgPSBudWxsO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpICE9PSBuS2V5czsgaSArKyApIHtcblxuXHRcdFx0dmFyIGN1cnJUaW1lID0gdGltZXNbIGkgXTtcblxuXHRcdFx0aWYgKCB0eXBlb2YgY3VyclRpbWUgPT09ICdudW1iZXInICYmIGlzTmFOKCBjdXJyVGltZSApICkge1xuXG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5LZXlmcmFtZVRyYWNrOiBUaW1lIGlzIG5vdCBhIHZhbGlkIG51bWJlci4nLCB0aGlzLCBpLCBjdXJyVGltZSApO1xuXHRcdFx0XHR2YWxpZCA9IGZhbHNlO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHByZXZUaW1lICE9PSBudWxsICYmIHByZXZUaW1lID4gY3VyclRpbWUgKSB7XG5cblx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLktleWZyYW1lVHJhY2s6IE91dCBvZiBvcmRlciBrZXlzLicsIHRoaXMsIGksIGN1cnJUaW1lLCBwcmV2VGltZSApO1xuXHRcdFx0XHR2YWxpZCA9IGZhbHNlO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0fVxuXG5cdFx0XHRwcmV2VGltZSA9IGN1cnJUaW1lO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB2YWx1ZXMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0aWYgKCBBbmltYXRpb25VdGlscy5pc1R5cGVkQXJyYXkoIHZhbHVlcyApICkge1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMCwgbiA9IHZhbHVlcy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRcdFx0XHR2YXIgdmFsdWUgPSB2YWx1ZXNbIGkgXTtcblxuXHRcdFx0XHRcdGlmICggaXNOYU4oIHZhbHVlICkgKSB7XG5cblx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5LZXlmcmFtZVRyYWNrOiBWYWx1ZSBpcyBub3QgYSB2YWxpZCBudW1iZXIuJywgdGhpcywgaSwgdmFsdWUgKTtcblx0XHRcdFx0XHRcdHZhbGlkID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiB2YWxpZDtcblxuXHR9LFxuXG5cdC8vIHJlbW92ZXMgZXF1aXZhbGVudCBzZXF1ZW50aWFsIGtleXMgYXMgY29tbW9uIGluIG1vcnBoIHRhcmdldCBzZXF1ZW5jZXNcblx0Ly8gKDAsMCwwLDAsMSwxLDEsMCwwLDAsMCwwLDAsMCkgLS0+ICgwLDAsMSwxLDAsMClcblx0b3B0aW1pemU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB0aW1lcyA9IHRoaXMudGltZXMsXG5cdFx0XHR2YWx1ZXMgPSB0aGlzLnZhbHVlcyxcblx0XHRcdHN0cmlkZSA9IHRoaXMuZ2V0VmFsdWVTaXplKCksXG5cblx0XHRcdHNtb290aEludGVycG9sYXRpb24gPSB0aGlzLmdldEludGVycG9sYXRpb24oKSA9PT0gSW50ZXJwb2xhdGVTbW9vdGgsXG5cblx0XHRcdHdyaXRlSW5kZXggPSAxLFxuXHRcdFx0bGFzdEluZGV4ID0gdGltZXMubGVuZ3RoIC0gMTtcblxuXHRcdGZvciAoIHZhciBpID0gMTsgaSA8IGxhc3RJbmRleDsgKysgaSApIHtcblxuXHRcdFx0dmFyIGtlZXAgPSBmYWxzZTtcblxuXHRcdFx0dmFyIHRpbWUgPSB0aW1lc1sgaSBdO1xuXHRcdFx0dmFyIHRpbWVOZXh0ID0gdGltZXNbIGkgKyAxIF07XG5cblx0XHRcdC8vIHJlbW92ZSBhZGphY2VudCBrZXlmcmFtZXMgc2NoZWR1bGVkIGF0IHRoZSBzYW1lIHRpbWVcblxuXHRcdFx0aWYgKCB0aW1lICE9PSB0aW1lTmV4dCAmJiAoIGkgIT09IDEgfHwgdGltZSAhPT0gdGltZVsgMCBdICkgKSB7XG5cblx0XHRcdFx0aWYgKCAhIHNtb290aEludGVycG9sYXRpb24gKSB7XG5cblx0XHRcdFx0XHQvLyByZW1vdmUgdW5uZWNlc3Nhcnkga2V5ZnJhbWVzIHNhbWUgYXMgdGhlaXIgbmVpZ2hib3JzXG5cblx0XHRcdFx0XHR2YXIgb2Zmc2V0ID0gaSAqIHN0cmlkZSxcblx0XHRcdFx0XHRcdG9mZnNldFAgPSBvZmZzZXQgLSBzdHJpZGUsXG5cdFx0XHRcdFx0XHRvZmZzZXROID0gb2Zmc2V0ICsgc3RyaWRlO1xuXG5cdFx0XHRcdFx0Zm9yICggdmFyIGogPSAwOyBqICE9PSBzdHJpZGU7ICsrIGogKSB7XG5cblx0XHRcdFx0XHRcdHZhciB2YWx1ZSA9IHZhbHVlc1sgb2Zmc2V0ICsgaiBdO1xuXG5cdFx0XHRcdFx0XHRpZiAoIHZhbHVlICE9PSB2YWx1ZXNbIG9mZnNldFAgKyBqIF0gfHxcblx0XHRcdFx0XHRcdFx0dmFsdWUgIT09IHZhbHVlc1sgb2Zmc2V0TiArIGogXSApIHtcblxuXHRcdFx0XHRcdFx0XHRrZWVwID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0a2VlcCA9IHRydWU7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdC8vIGluLXBsYWNlIGNvbXBhY3Rpb25cblxuXHRcdFx0aWYgKCBrZWVwICkge1xuXG5cdFx0XHRcdGlmICggaSAhPT0gd3JpdGVJbmRleCApIHtcblxuXHRcdFx0XHRcdHRpbWVzWyB3cml0ZUluZGV4IF0gPSB0aW1lc1sgaSBdO1xuXG5cdFx0XHRcdFx0dmFyIHJlYWRPZmZzZXQgPSBpICogc3RyaWRlLFxuXHRcdFx0XHRcdFx0d3JpdGVPZmZzZXQgPSB3cml0ZUluZGV4ICogc3RyaWRlO1xuXG5cdFx0XHRcdFx0Zm9yICggdmFyIGogPSAwOyBqICE9PSBzdHJpZGU7ICsrIGogKSB7XG5cblx0XHRcdFx0XHRcdHZhbHVlc1sgd3JpdGVPZmZzZXQgKyBqIF0gPSB2YWx1ZXNbIHJlYWRPZmZzZXQgKyBqIF07XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdCsrIHdyaXRlSW5kZXg7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIGZsdXNoIGxhc3Qga2V5ZnJhbWUgKGNvbXBhY3Rpb24gbG9va3MgYWhlYWQpXG5cblx0XHRpZiAoIGxhc3RJbmRleCA+IDAgKSB7XG5cblx0XHRcdHRpbWVzWyB3cml0ZUluZGV4IF0gPSB0aW1lc1sgbGFzdEluZGV4IF07XG5cblx0XHRcdGZvciAoIHZhciByZWFkT2Zmc2V0ID0gbGFzdEluZGV4ICogc3RyaWRlLCB3cml0ZU9mZnNldCA9IHdyaXRlSW5kZXggKiBzdHJpZGUsIGogPSAwOyBqICE9PSBzdHJpZGU7ICsrIGogKSB7XG5cblx0XHRcdFx0dmFsdWVzWyB3cml0ZU9mZnNldCArIGogXSA9IHZhbHVlc1sgcmVhZE9mZnNldCArIGogXTtcblxuXHRcdFx0fVxuXG5cdFx0XHQrKyB3cml0ZUluZGV4O1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB3cml0ZUluZGV4ICE9PSB0aW1lcy5sZW5ndGggKSB7XG5cblx0XHRcdHRoaXMudGltZXMgPSBBbmltYXRpb25VdGlscy5hcnJheVNsaWNlKCB0aW1lcywgMCwgd3JpdGVJbmRleCApO1xuXHRcdFx0dGhpcy52YWx1ZXMgPSBBbmltYXRpb25VdGlscy5hcnJheVNsaWNlKCB2YWx1ZXMsIDAsIHdyaXRlSW5kZXggKiBzdHJpZGUgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqXG4gKiBBIFRyYWNrIG9mIHZlY3RvcmVkIGtleWZyYW1lIHZhbHVlcy5cbiAqXG4gKlxuICogQGF1dGhvciBCZW4gSG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pby9cbiAqIEBhdXRob3IgRGF2aWQgU2Fybm8gLyBodHRwOi8vbGlnaHRoYXVzLnVzL1xuICogQGF1dGhvciB0c2Nod1xuICovXG5cbmZ1bmN0aW9uIFZlY3RvcktleWZyYW1lVHJhY2soIG5hbWUsIHRpbWVzLCB2YWx1ZXMsIGludGVycG9sYXRpb24gKSB7XG5cblx0S2V5ZnJhbWVUcmFjay5jYWxsKCB0aGlzLCBuYW1lLCB0aW1lcywgdmFsdWVzLCBpbnRlcnBvbGF0aW9uICk7XG5cbn1cblxuVmVjdG9yS2V5ZnJhbWVUcmFjay5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBLZXlmcmFtZVRyYWNrLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IFZlY3RvcktleWZyYW1lVHJhY2ssXG5cblx0VmFsdWVUeXBlTmFtZTogJ3ZlY3RvcidcblxuXHQvLyBWYWx1ZUJ1ZmZlclR5cGUgaXMgaW5oZXJpdGVkXG5cblx0Ly8gRGVmYXVsdEludGVycG9sYXRpb24gaXMgaW5oZXJpdGVkXG5cbn0gKTtcblxuLyoqXG4gKlxuICogUmV1c2FibGUgc2V0IG9mIFRyYWNrcyB0aGF0IHJlcHJlc2VudCBhbiBhbmltYXRpb24uXG4gKlxuICogQGF1dGhvciBCZW4gSG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pby9cbiAqIEBhdXRob3IgRGF2aWQgU2Fybm8gLyBodHRwOi8vbGlnaHRoYXVzLnVzL1xuICovXG5cbmZ1bmN0aW9uIEFuaW1hdGlvbkNsaXAoIG5hbWUsIGR1cmF0aW9uLCB0cmFja3MgKSB7XG5cblx0dGhpcy5uYW1lID0gbmFtZTtcblx0dGhpcy50cmFja3MgPSB0cmFja3M7XG5cdHRoaXMuZHVyYXRpb24gPSAoIGR1cmF0aW9uICE9PSB1bmRlZmluZWQgKSA/IGR1cmF0aW9uIDogLSAxO1xuXG5cdHRoaXMudXVpZCA9IF9NYXRoLmdlbmVyYXRlVVVJRCgpO1xuXG5cdC8vIHRoaXMgbWVhbnMgaXQgc2hvdWxkIGZpZ3VyZSBvdXQgaXRzIGR1cmF0aW9uIGJ5IHNjYW5uaW5nIHRoZSB0cmFja3Ncblx0aWYgKCB0aGlzLmR1cmF0aW9uIDwgMCApIHtcblxuXHRcdHRoaXMucmVzZXREdXJhdGlvbigpO1xuXG5cdH1cblxuXHR0aGlzLm9wdGltaXplKCk7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggQW5pbWF0aW9uQ2xpcCwge1xuXG5cdHBhcnNlOiBmdW5jdGlvbiAoIGpzb24gKSB7XG5cblx0XHR2YXIgdHJhY2tzID0gW10sXG5cdFx0XHRqc29uVHJhY2tzID0ganNvbi50cmFja3MsXG5cdFx0XHRmcmFtZVRpbWUgPSAxLjAgLyAoIGpzb24uZnBzIHx8IDEuMCApO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBuID0ganNvblRyYWNrcy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRcdHRyYWNrcy5wdXNoKCBLZXlmcmFtZVRyYWNrLnBhcnNlKCBqc29uVHJhY2tzWyBpIF0gKS5zY2FsZSggZnJhbWVUaW1lICkgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBuZXcgQW5pbWF0aW9uQ2xpcCgganNvbi5uYW1lLCBqc29uLmR1cmF0aW9uLCB0cmFja3MgKTtcblxuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCBjbGlwICkge1xuXG5cdFx0dmFyIHRyYWNrcyA9IFtdLFxuXHRcdFx0Y2xpcFRyYWNrcyA9IGNsaXAudHJhY2tzO1xuXG5cdFx0dmFyIGpzb24gPSB7XG5cblx0XHRcdCduYW1lJzogY2xpcC5uYW1lLFxuXHRcdFx0J2R1cmF0aW9uJzogY2xpcC5kdXJhdGlvbixcblx0XHRcdCd0cmFja3MnOiB0cmFja3NcblxuXHRcdH07XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIG4gPSBjbGlwVHJhY2tzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0dHJhY2tzLnB1c2goIEtleWZyYW1lVHJhY2sudG9KU09OKCBjbGlwVHJhY2tzWyBpIF0gKSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGpzb247XG5cblx0fSxcblxuXHRDcmVhdGVGcm9tTW9ycGhUYXJnZXRTZXF1ZW5jZTogZnVuY3Rpb24gKCBuYW1lLCBtb3JwaFRhcmdldFNlcXVlbmNlLCBmcHMsIG5vTG9vcCApIHtcblxuXHRcdHZhciBudW1Nb3JwaFRhcmdldHMgPSBtb3JwaFRhcmdldFNlcXVlbmNlLmxlbmd0aDtcblx0XHR2YXIgdHJhY2tzID0gW107XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBudW1Nb3JwaFRhcmdldHM7IGkgKysgKSB7XG5cblx0XHRcdHZhciB0aW1lcyA9IFtdO1xuXHRcdFx0dmFyIHZhbHVlcyA9IFtdO1xuXG5cdFx0XHR0aW1lcy5wdXNoKFxuXHRcdFx0XHQoIGkgKyBudW1Nb3JwaFRhcmdldHMgLSAxICkgJSBudW1Nb3JwaFRhcmdldHMsXG5cdFx0XHRcdGksXG5cdFx0XHRcdCggaSArIDEgKSAlIG51bU1vcnBoVGFyZ2V0cyApO1xuXG5cdFx0XHR2YWx1ZXMucHVzaCggMCwgMSwgMCApO1xuXG5cdFx0XHR2YXIgb3JkZXIgPSBBbmltYXRpb25VdGlscy5nZXRLZXlmcmFtZU9yZGVyKCB0aW1lcyApO1xuXHRcdFx0dGltZXMgPSBBbmltYXRpb25VdGlscy5zb3J0ZWRBcnJheSggdGltZXMsIDEsIG9yZGVyICk7XG5cdFx0XHR2YWx1ZXMgPSBBbmltYXRpb25VdGlscy5zb3J0ZWRBcnJheSggdmFsdWVzLCAxLCBvcmRlciApO1xuXG5cdFx0XHQvLyBpZiB0aGVyZSBpcyBhIGtleSBhdCB0aGUgZmlyc3QgZnJhbWUsIGR1cGxpY2F0ZSBpdCBhcyB0aGVcblx0XHRcdC8vIGxhc3QgZnJhbWUgYXMgd2VsbCBmb3IgcGVyZmVjdCBsb29wLlxuXHRcdFx0aWYgKCAhIG5vTG9vcCAmJiB0aW1lc1sgMCBdID09PSAwICkge1xuXG5cdFx0XHRcdHRpbWVzLnB1c2goIG51bU1vcnBoVGFyZ2V0cyApO1xuXHRcdFx0XHR2YWx1ZXMucHVzaCggdmFsdWVzWyAwIF0gKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0cmFja3MucHVzaChcblx0XHRcdFx0bmV3IE51bWJlcktleWZyYW1lVHJhY2soXG5cdFx0XHRcdFx0Jy5tb3JwaFRhcmdldEluZmx1ZW5jZXNbJyArIG1vcnBoVGFyZ2V0U2VxdWVuY2VbIGkgXS5uYW1lICsgJ10nLFxuXHRcdFx0XHRcdHRpbWVzLCB2YWx1ZXNcblx0XHRcdFx0KS5zY2FsZSggMS4wIC8gZnBzICkgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBuZXcgQW5pbWF0aW9uQ2xpcCggbmFtZSwgLSAxLCB0cmFja3MgKTtcblxuXHR9LFxuXG5cdGZpbmRCeU5hbWU6IGZ1bmN0aW9uICggb2JqZWN0T3JDbGlwQXJyYXksIG5hbWUgKSB7XG5cblx0XHR2YXIgY2xpcEFycmF5ID0gb2JqZWN0T3JDbGlwQXJyYXk7XG5cblx0XHRpZiAoICEgQXJyYXkuaXNBcnJheSggb2JqZWN0T3JDbGlwQXJyYXkgKSApIHtcblxuXHRcdFx0dmFyIG8gPSBvYmplY3RPckNsaXBBcnJheTtcblx0XHRcdGNsaXBBcnJheSA9IG8uZ2VvbWV0cnkgJiYgby5nZW9tZXRyeS5hbmltYXRpb25zIHx8IG8uYW5pbWF0aW9ucztcblxuXHRcdH1cblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGNsaXBBcnJheS5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdGlmICggY2xpcEFycmF5WyBpIF0ubmFtZSA9PT0gbmFtZSApIHtcblxuXHRcdFx0XHRyZXR1cm4gY2xpcEFycmF5WyBpIF07XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiBudWxsO1xuXG5cdH0sXG5cblx0Q3JlYXRlQ2xpcHNGcm9tTW9ycGhUYXJnZXRTZXF1ZW5jZXM6IGZ1bmN0aW9uICggbW9ycGhUYXJnZXRzLCBmcHMsIG5vTG9vcCApIHtcblxuXHRcdHZhciBhbmltYXRpb25Ub01vcnBoVGFyZ2V0cyA9IHt9O1xuXG5cdFx0Ly8gdGVzdGVkIHdpdGggaHR0cHM6Ly9yZWdleDEwMS5jb20vIG9uIHRyaWNrIHNlcXVlbmNlc1xuXHRcdC8vIHN1Y2ggZmxhbWluZ29fZmx5QV8wMDMsIGZsYW1pbmdvX3J1bjFfMDAzLCBjcmRlYXRoMDA1OVxuXHRcdHZhciBwYXR0ZXJuID0gL14oW1xcdy1dKj8pKFtcXGRdKykkLztcblxuXHRcdC8vIHNvcnQgbW9ycGggdGFyZ2V0IG5hbWVzIGludG8gYW5pbWF0aW9uIGdyb3VwcyBiYXNlZFxuXHRcdC8vIHBhdHRlcm5zIGxpa2UgV2Fsa18wMDEsIFdhbGtfMDAyLCBSdW5fMDAxLCBSdW5fMDAyXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IG1vcnBoVGFyZ2V0cy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIG1vcnBoVGFyZ2V0ID0gbW9ycGhUYXJnZXRzWyBpIF07XG5cdFx0XHR2YXIgcGFydHMgPSBtb3JwaFRhcmdldC5uYW1lLm1hdGNoKCBwYXR0ZXJuICk7XG5cblx0XHRcdGlmICggcGFydHMgJiYgcGFydHMubGVuZ3RoID4gMSApIHtcblxuXHRcdFx0XHR2YXIgbmFtZSA9IHBhcnRzWyAxIF07XG5cblx0XHRcdFx0dmFyIGFuaW1hdGlvbk1vcnBoVGFyZ2V0cyA9IGFuaW1hdGlvblRvTW9ycGhUYXJnZXRzWyBuYW1lIF07XG5cdFx0XHRcdGlmICggISBhbmltYXRpb25Nb3JwaFRhcmdldHMgKSB7XG5cblx0XHRcdFx0XHRhbmltYXRpb25Ub01vcnBoVGFyZ2V0c1sgbmFtZSBdID0gYW5pbWF0aW9uTW9ycGhUYXJnZXRzID0gW107XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGFuaW1hdGlvbk1vcnBoVGFyZ2V0cy5wdXNoKCBtb3JwaFRhcmdldCApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHR2YXIgY2xpcHMgPSBbXTtcblxuXHRcdGZvciAoIHZhciBuYW1lIGluIGFuaW1hdGlvblRvTW9ycGhUYXJnZXRzICkge1xuXG5cdFx0XHRjbGlwcy5wdXNoKCBBbmltYXRpb25DbGlwLkNyZWF0ZUZyb21Nb3JwaFRhcmdldFNlcXVlbmNlKCBuYW1lLCBhbmltYXRpb25Ub01vcnBoVGFyZ2V0c1sgbmFtZSBdLCBmcHMsIG5vTG9vcCApICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gY2xpcHM7XG5cblx0fSxcblxuXHQvLyBwYXJzZSB0aGUgYW5pbWF0aW9uLmhpZXJhcmNoeSBmb3JtYXRcblx0cGFyc2VBbmltYXRpb246IGZ1bmN0aW9uICggYW5pbWF0aW9uLCBib25lcyApIHtcblxuXHRcdGlmICggISBhbmltYXRpb24gKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5BbmltYXRpb25DbGlwOiBObyBhbmltYXRpb24gaW4gSlNPTkxvYWRlciBkYXRhLicgKTtcblx0XHRcdHJldHVybiBudWxsO1xuXG5cdFx0fVxuXG5cdFx0dmFyIGFkZE5vbmVtcHR5VHJhY2sgPSBmdW5jdGlvbiAoIHRyYWNrVHlwZSwgdHJhY2tOYW1lLCBhbmltYXRpb25LZXlzLCBwcm9wZXJ0eU5hbWUsIGRlc3RUcmFja3MgKSB7XG5cblx0XHRcdC8vIG9ubHkgcmV0dXJuIHRyYWNrIGlmIHRoZXJlIGFyZSBhY3R1YWxseSBrZXlzLlxuXHRcdFx0aWYgKCBhbmltYXRpb25LZXlzLmxlbmd0aCAhPT0gMCApIHtcblxuXHRcdFx0XHR2YXIgdGltZXMgPSBbXTtcblx0XHRcdFx0dmFyIHZhbHVlcyA9IFtdO1xuXG5cdFx0XHRcdEFuaW1hdGlvblV0aWxzLmZsYXR0ZW5KU09OKCBhbmltYXRpb25LZXlzLCB0aW1lcywgdmFsdWVzLCBwcm9wZXJ0eU5hbWUgKTtcblxuXHRcdFx0XHQvLyBlbXB0eSBrZXlzIGFyZSBmaWx0ZXJlZCBvdXQsIHNvIGNoZWNrIGFnYWluXG5cdFx0XHRcdGlmICggdGltZXMubGVuZ3RoICE9PSAwICkge1xuXG5cdFx0XHRcdFx0ZGVzdFRyYWNrcy5wdXNoKCBuZXcgdHJhY2tUeXBlKCB0cmFja05hbWUsIHRpbWVzLCB2YWx1ZXMgKSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fTtcblxuXHRcdHZhciB0cmFja3MgPSBbXTtcblxuXHRcdHZhciBjbGlwTmFtZSA9IGFuaW1hdGlvbi5uYW1lIHx8ICdkZWZhdWx0Jztcblx0XHQvLyBhdXRvbWF0aWMgbGVuZ3RoIGRldGVybWluYXRpb24gaW4gQW5pbWF0aW9uQ2xpcC5cblx0XHR2YXIgZHVyYXRpb24gPSBhbmltYXRpb24ubGVuZ3RoIHx8IC0gMTtcblx0XHR2YXIgZnBzID0gYW5pbWF0aW9uLmZwcyB8fCAzMDtcblxuXHRcdHZhciBoaWVyYXJjaHlUcmFja3MgPSBhbmltYXRpb24uaGllcmFyY2h5IHx8IFtdO1xuXG5cdFx0Zm9yICggdmFyIGggPSAwOyBoIDwgaGllcmFyY2h5VHJhY2tzLmxlbmd0aDsgaCArKyApIHtcblxuXHRcdFx0dmFyIGFuaW1hdGlvbktleXMgPSBoaWVyYXJjaHlUcmFja3NbIGggXS5rZXlzO1xuXG5cdFx0XHQvLyBza2lwIGVtcHR5IHRyYWNrc1xuXHRcdFx0aWYgKCAhIGFuaW1hdGlvbktleXMgfHwgYW5pbWF0aW9uS2V5cy5sZW5ndGggPT09IDAgKSBjb250aW51ZTtcblxuXHRcdFx0Ly8gcHJvY2VzcyBtb3JwaCB0YXJnZXRzXG5cdFx0XHRpZiAoIGFuaW1hdGlvbktleXNbIDAgXS5tb3JwaFRhcmdldHMgKSB7XG5cblx0XHRcdFx0Ly8gZmlndXJlIG91dCBhbGwgbW9ycGggdGFyZ2V0cyB1c2VkIGluIHRoaXMgdHJhY2tcblx0XHRcdFx0dmFyIG1vcnBoVGFyZ2V0TmFtZXMgPSB7fTtcblxuXHRcdFx0XHRmb3IgKCB2YXIgayA9IDA7IGsgPCBhbmltYXRpb25LZXlzLmxlbmd0aDsgayArKyApIHtcblxuXHRcdFx0XHRcdGlmICggYW5pbWF0aW9uS2V5c1sgayBdLm1vcnBoVGFyZ2V0cyApIHtcblxuXHRcdFx0XHRcdFx0Zm9yICggdmFyIG0gPSAwOyBtIDwgYW5pbWF0aW9uS2V5c1sgayBdLm1vcnBoVGFyZ2V0cy5sZW5ndGg7IG0gKysgKSB7XG5cblx0XHRcdFx0XHRcdFx0bW9ycGhUYXJnZXROYW1lc1sgYW5pbWF0aW9uS2V5c1sgayBdLm1vcnBoVGFyZ2V0c1sgbSBdIF0gPSAtIDE7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gY3JlYXRlIGEgdHJhY2sgZm9yIGVhY2ggbW9ycGggdGFyZ2V0IHdpdGggYWxsIHplcm9cblx0XHRcdFx0Ly8gbW9ycGhUYXJnZXRJbmZsdWVuY2VzIGV4Y2VwdCBmb3IgdGhlIGtleXMgaW4gd2hpY2hcblx0XHRcdFx0Ly8gdGhlIG1vcnBoVGFyZ2V0IGlzIG5hbWVkLlxuXHRcdFx0XHRmb3IgKCB2YXIgbW9ycGhUYXJnZXROYW1lIGluIG1vcnBoVGFyZ2V0TmFtZXMgKSB7XG5cblx0XHRcdFx0XHR2YXIgdGltZXMgPSBbXTtcblx0XHRcdFx0XHR2YXIgdmFsdWVzID0gW107XG5cblx0XHRcdFx0XHRmb3IgKCB2YXIgbSA9IDA7IG0gIT09IGFuaW1hdGlvbktleXNbIGsgXS5tb3JwaFRhcmdldHMubGVuZ3RoOyArKyBtICkge1xuXG5cdFx0XHRcdFx0XHR2YXIgYW5pbWF0aW9uS2V5ID0gYW5pbWF0aW9uS2V5c1sgayBdO1xuXG5cdFx0XHRcdFx0XHR0aW1lcy5wdXNoKCBhbmltYXRpb25LZXkudGltZSApO1xuXHRcdFx0XHRcdFx0dmFsdWVzLnB1c2goICggYW5pbWF0aW9uS2V5Lm1vcnBoVGFyZ2V0ID09PSBtb3JwaFRhcmdldE5hbWUgKSA/IDEgOiAwICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR0cmFja3MucHVzaCggbmV3IE51bWJlcktleWZyYW1lVHJhY2soICcubW9ycGhUYXJnZXRJbmZsdWVuY2VbJyArIG1vcnBoVGFyZ2V0TmFtZSArICddJywgdGltZXMsIHZhbHVlcyApICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGR1cmF0aW9uID0gbW9ycGhUYXJnZXROYW1lcy5sZW5ndGggKiAoIGZwcyB8fCAxLjAgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyAuLi5hc3N1bWUgc2tlbGV0YWwgYW5pbWF0aW9uXG5cblx0XHRcdFx0dmFyIGJvbmVOYW1lID0gJy5ib25lc1snICsgYm9uZXNbIGggXS5uYW1lICsgJ10nO1xuXG5cdFx0XHRcdGFkZE5vbmVtcHR5VHJhY2soXG5cdFx0XHRcdFx0VmVjdG9yS2V5ZnJhbWVUcmFjaywgYm9uZU5hbWUgKyAnLnBvc2l0aW9uJyxcblx0XHRcdFx0XHRhbmltYXRpb25LZXlzLCAncG9zJywgdHJhY2tzICk7XG5cblx0XHRcdFx0YWRkTm9uZW1wdHlUcmFjayhcblx0XHRcdFx0XHRRdWF0ZXJuaW9uS2V5ZnJhbWVUcmFjaywgYm9uZU5hbWUgKyAnLnF1YXRlcm5pb24nLFxuXHRcdFx0XHRcdGFuaW1hdGlvbktleXMsICdyb3QnLCB0cmFja3MgKTtcblxuXHRcdFx0XHRhZGROb25lbXB0eVRyYWNrKFxuXHRcdFx0XHRcdFZlY3RvcktleWZyYW1lVHJhY2ssIGJvbmVOYW1lICsgJy5zY2FsZScsXG5cdFx0XHRcdFx0YW5pbWF0aW9uS2V5cywgJ3NjbCcsIHRyYWNrcyApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIHRyYWNrcy5sZW5ndGggPT09IDAgKSB7XG5cblx0XHRcdHJldHVybiBudWxsO1xuXG5cdFx0fVxuXG5cdFx0dmFyIGNsaXAgPSBuZXcgQW5pbWF0aW9uQ2xpcCggY2xpcE5hbWUsIGR1cmF0aW9uLCB0cmFja3MgKTtcblxuXHRcdHJldHVybiBjbGlwO1xuXG5cdH1cblxufSApO1xuXG5PYmplY3QuYXNzaWduKCBBbmltYXRpb25DbGlwLnByb3RvdHlwZSwge1xuXG5cdHJlc2V0RHVyYXRpb246IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB0cmFja3MgPSB0aGlzLnRyYWNrcywgZHVyYXRpb24gPSAwO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBuID0gdHJhY2tzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0dmFyIHRyYWNrID0gdGhpcy50cmFja3NbIGkgXTtcblxuXHRcdFx0ZHVyYXRpb24gPSBNYXRoLm1heCggZHVyYXRpb24sIHRyYWNrLnRpbWVzWyB0cmFjay50aW1lcy5sZW5ndGggLSAxIF0gKTtcblxuXHRcdH1cblxuXHRcdHRoaXMuZHVyYXRpb24gPSBkdXJhdGlvbjtcblxuXHR9LFxuXG5cdHRyaW06IGZ1bmN0aW9uICgpIHtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IHRoaXMudHJhY2tzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0dGhpcy50cmFja3NbIGkgXS50cmltKCAwLCB0aGlzLmR1cmF0aW9uICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG9wdGltaXplOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCB0aGlzLnRyYWNrcy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdHRoaXMudHJhY2tzWyBpIF0ub3B0aW1pemUoKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gTWF0ZXJpYWxMb2FkZXIoIG1hbmFnZXIgKSB7XG5cblx0dGhpcy5tYW5hZ2VyID0gKCBtYW5hZ2VyICE9PSB1bmRlZmluZWQgKSA/IG1hbmFnZXIgOiBEZWZhdWx0TG9hZGluZ01hbmFnZXI7XG5cdHRoaXMudGV4dHVyZXMgPSB7fTtcblxufVxuXG5PYmplY3QuYXNzaWduKCBNYXRlcmlhbExvYWRlci5wcm90b3R5cGUsIHtcblxuXHRsb2FkOiBmdW5jdGlvbiAoIHVybCwgb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkge1xuXG5cdFx0dmFyIHNjb3BlID0gdGhpcztcblxuXHRcdHZhciBsb2FkZXIgPSBuZXcgRmlsZUxvYWRlciggc2NvcGUubWFuYWdlciApO1xuXHRcdGxvYWRlci5sb2FkKCB1cmwsIGZ1bmN0aW9uICggdGV4dCApIHtcblxuXHRcdFx0b25Mb2FkKCBzY29wZS5wYXJzZSggSlNPTi5wYXJzZSggdGV4dCApICkgKTtcblxuXHRcdH0sIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKTtcblxuXHR9LFxuXG5cdHNldFRleHR1cmVzOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy50ZXh0dXJlcyA9IHZhbHVlO1xuXG5cdH0sXG5cblx0cGFyc2U6IGZ1bmN0aW9uICgganNvbiApIHtcblxuXHRcdHZhciB0ZXh0dXJlcyA9IHRoaXMudGV4dHVyZXM7XG5cblx0XHRmdW5jdGlvbiBnZXRUZXh0dXJlKCBuYW1lICkge1xuXG5cdFx0XHRpZiAoIHRleHR1cmVzWyBuYW1lIF0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5NYXRlcmlhbExvYWRlcjogVW5kZWZpbmVkIHRleHR1cmUnLCBuYW1lICk7XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRleHR1cmVzWyBuYW1lIF07XG5cblx0XHR9XG5cblx0XHR2YXIgbWF0ZXJpYWwgPSBuZXcgTWF0ZXJpYWxzWyBqc29uLnR5cGUgXSgpO1xuXG5cdFx0aWYgKCBqc29uLnV1aWQgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnV1aWQgPSBqc29uLnV1aWQ7XG5cdFx0aWYgKCBqc29uLm5hbWUgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLm5hbWUgPSBqc29uLm5hbWU7XG5cdFx0aWYgKCBqc29uLmNvbG9yICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5jb2xvci5zZXRIZXgoIGpzb24uY29sb3IgKTtcblx0XHRpZiAoIGpzb24ucm91Z2huZXNzICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5yb3VnaG5lc3MgPSBqc29uLnJvdWdobmVzcztcblx0XHRpZiAoIGpzb24ubWV0YWxuZXNzICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5tZXRhbG5lc3MgPSBqc29uLm1ldGFsbmVzcztcblx0XHRpZiAoIGpzb24uZW1pc3NpdmUgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmVtaXNzaXZlLnNldEhleCgganNvbi5lbWlzc2l2ZSApO1xuXHRcdGlmICgganNvbi5zcGVjdWxhciAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuc3BlY3VsYXIuc2V0SGV4KCBqc29uLnNwZWN1bGFyICk7XG5cdFx0aWYgKCBqc29uLnNoaW5pbmVzcyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuc2hpbmluZXNzID0ganNvbi5zaGluaW5lc3M7XG5cdFx0aWYgKCBqc29uLmNsZWFyQ29hdCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuY2xlYXJDb2F0ID0ganNvbi5jbGVhckNvYXQ7XG5cdFx0aWYgKCBqc29uLmNsZWFyQ29hdFJvdWdobmVzcyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuY2xlYXJDb2F0Um91Z2huZXNzID0ganNvbi5jbGVhckNvYXRSb3VnaG5lc3M7XG5cdFx0aWYgKCBqc29uLnVuaWZvcm1zICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC51bmlmb3JtcyA9IGpzb24udW5pZm9ybXM7XG5cdFx0aWYgKCBqc29uLnZlcnRleFNoYWRlciAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwudmVydGV4U2hhZGVyID0ganNvbi52ZXJ0ZXhTaGFkZXI7XG5cdFx0aWYgKCBqc29uLmZyYWdtZW50U2hhZGVyICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5mcmFnbWVudFNoYWRlciA9IGpzb24uZnJhZ21lbnRTaGFkZXI7XG5cdFx0aWYgKCBqc29uLnZlcnRleENvbG9ycyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwudmVydGV4Q29sb3JzID0ganNvbi52ZXJ0ZXhDb2xvcnM7XG5cdFx0aWYgKCBqc29uLmZvZyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZm9nID0ganNvbi5mb2c7XG5cdFx0aWYgKCBqc29uLmZsYXRTaGFkaW5nICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5mbGF0U2hhZGluZyA9IGpzb24uZmxhdFNoYWRpbmc7XG5cdFx0aWYgKCBqc29uLmJsZW5kaW5nICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5ibGVuZGluZyA9IGpzb24uYmxlbmRpbmc7XG5cdFx0aWYgKCBqc29uLnNpZGUgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnNpZGUgPSBqc29uLnNpZGU7XG5cdFx0aWYgKCBqc29uLm9wYWNpdHkgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLm9wYWNpdHkgPSBqc29uLm9wYWNpdHk7XG5cdFx0aWYgKCBqc29uLnRyYW5zcGFyZW50ICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC50cmFuc3BhcmVudCA9IGpzb24udHJhbnNwYXJlbnQ7XG5cdFx0aWYgKCBqc29uLmFscGhhVGVzdCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuYWxwaGFUZXN0ID0ganNvbi5hbHBoYVRlc3Q7XG5cdFx0aWYgKCBqc29uLmRlcHRoVGVzdCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZGVwdGhUZXN0ID0ganNvbi5kZXB0aFRlc3Q7XG5cdFx0aWYgKCBqc29uLmRlcHRoV3JpdGUgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmRlcHRoV3JpdGUgPSBqc29uLmRlcHRoV3JpdGU7XG5cdFx0aWYgKCBqc29uLmNvbG9yV3JpdGUgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmNvbG9yV3JpdGUgPSBqc29uLmNvbG9yV3JpdGU7XG5cdFx0aWYgKCBqc29uLndpcmVmcmFtZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwud2lyZWZyYW1lID0ganNvbi53aXJlZnJhbWU7XG5cdFx0aWYgKCBqc29uLndpcmVmcmFtZUxpbmV3aWR0aCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwud2lyZWZyYW1lTGluZXdpZHRoID0ganNvbi53aXJlZnJhbWVMaW5ld2lkdGg7XG5cdFx0aWYgKCBqc29uLndpcmVmcmFtZUxpbmVjYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLndpcmVmcmFtZUxpbmVjYXAgPSBqc29uLndpcmVmcmFtZUxpbmVjYXA7XG5cdFx0aWYgKCBqc29uLndpcmVmcmFtZUxpbmVqb2luICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC53aXJlZnJhbWVMaW5lam9pbiA9IGpzb24ud2lyZWZyYW1lTGluZWpvaW47XG5cblx0XHRpZiAoIGpzb24ucm90YXRpb24gIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnJvdGF0aW9uID0ganNvbi5yb3RhdGlvbjtcblxuXHRcdGlmICgganNvbi5saW5ld2lkdGggIT09IDEgKSBtYXRlcmlhbC5saW5ld2lkdGggPSBqc29uLmxpbmV3aWR0aDtcblx0XHRpZiAoIGpzb24uZGFzaFNpemUgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmRhc2hTaXplID0ganNvbi5kYXNoU2l6ZTtcblx0XHRpZiAoIGpzb24uZ2FwU2l6ZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZ2FwU2l6ZSA9IGpzb24uZ2FwU2l6ZTtcblx0XHRpZiAoIGpzb24uc2NhbGUgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnNjYWxlID0ganNvbi5zY2FsZTtcblxuXHRcdGlmICgganNvbi5wb2x5Z29uT2Zmc2V0ICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5wb2x5Z29uT2Zmc2V0ID0ganNvbi5wb2x5Z29uT2Zmc2V0O1xuXHRcdGlmICgganNvbi5wb2x5Z29uT2Zmc2V0RmFjdG9yICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5wb2x5Z29uT2Zmc2V0RmFjdG9yID0ganNvbi5wb2x5Z29uT2Zmc2V0RmFjdG9yO1xuXHRcdGlmICgganNvbi5wb2x5Z29uT2Zmc2V0VW5pdHMgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnBvbHlnb25PZmZzZXRVbml0cyA9IGpzb24ucG9seWdvbk9mZnNldFVuaXRzO1xuXG5cdFx0aWYgKCBqc29uLnNraW5uaW5nICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5za2lubmluZyA9IGpzb24uc2tpbm5pbmc7XG5cdFx0aWYgKCBqc29uLm1vcnBoVGFyZ2V0cyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwubW9ycGhUYXJnZXRzID0ganNvbi5tb3JwaFRhcmdldHM7XG5cdFx0aWYgKCBqc29uLmRpdGhlcmluZyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZGl0aGVyaW5nID0ganNvbi5kaXRoZXJpbmc7XG5cblx0XHRpZiAoIGpzb24udmlzaWJsZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwudmlzaWJsZSA9IGpzb24udmlzaWJsZTtcblx0XHRpZiAoIGpzb24udXNlckRhdGEgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnVzZXJEYXRhID0ganNvbi51c2VyRGF0YTtcblxuXHRcdC8vIERlcHJlY2F0ZWRcblxuXHRcdGlmICgganNvbi5zaGFkaW5nICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5mbGF0U2hhZGluZyA9IGpzb24uc2hhZGluZyA9PT0gMTsgLy8gVEhSRUUuRmxhdFNoYWRpbmdcblxuXHRcdC8vIGZvciBQb2ludHNNYXRlcmlhbFxuXG5cdFx0aWYgKCBqc29uLnNpemUgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnNpemUgPSBqc29uLnNpemU7XG5cdFx0aWYgKCBqc29uLnNpemVBdHRlbnVhdGlvbiAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuc2l6ZUF0dGVudWF0aW9uID0ganNvbi5zaXplQXR0ZW51YXRpb247XG5cblx0XHQvLyBtYXBzXG5cblx0XHRpZiAoIGpzb24ubWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5tYXAgPSBnZXRUZXh0dXJlKCBqc29uLm1hcCApO1xuXG5cdFx0aWYgKCBqc29uLmFscGhhTWFwICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdG1hdGVyaWFsLmFscGhhTWFwID0gZ2V0VGV4dHVyZSgganNvbi5hbHBoYU1hcCApO1xuXHRcdFx0bWF0ZXJpYWwudHJhbnNwYXJlbnQgPSB0cnVlO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBqc29uLmJ1bXBNYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmJ1bXBNYXAgPSBnZXRUZXh0dXJlKCBqc29uLmJ1bXBNYXAgKTtcblx0XHRpZiAoIGpzb24uYnVtcFNjYWxlICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5idW1wU2NhbGUgPSBqc29uLmJ1bXBTY2FsZTtcblxuXHRcdGlmICgganNvbi5ub3JtYWxNYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLm5vcm1hbE1hcCA9IGdldFRleHR1cmUoIGpzb24ubm9ybWFsTWFwICk7XG5cdFx0aWYgKCBqc29uLm5vcm1hbFNjYWxlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHZhciBub3JtYWxTY2FsZSA9IGpzb24ubm9ybWFsU2NhbGU7XG5cblx0XHRcdGlmICggQXJyYXkuaXNBcnJheSggbm9ybWFsU2NhbGUgKSA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdFx0Ly8gQmxlbmRlciBleHBvcnRlciB1c2VkIHRvIGV4cG9ydCBhIHNjYWxhci4gU2VlICM3NDU5XG5cblx0XHRcdFx0bm9ybWFsU2NhbGUgPSBbIG5vcm1hbFNjYWxlLCBub3JtYWxTY2FsZSBdO1xuXG5cdFx0XHR9XG5cblx0XHRcdG1hdGVyaWFsLm5vcm1hbFNjYWxlID0gbmV3IFZlY3RvcjIoKS5mcm9tQXJyYXkoIG5vcm1hbFNjYWxlICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIGpzb24uZGlzcGxhY2VtZW50TWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRNYXAgPSBnZXRUZXh0dXJlKCBqc29uLmRpc3BsYWNlbWVudE1hcCApO1xuXHRcdGlmICgganNvbi5kaXNwbGFjZW1lbnRTY2FsZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZGlzcGxhY2VtZW50U2NhbGUgPSBqc29uLmRpc3BsYWNlbWVudFNjYWxlO1xuXHRcdGlmICgganNvbi5kaXNwbGFjZW1lbnRCaWFzICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRCaWFzID0ganNvbi5kaXNwbGFjZW1lbnRCaWFzO1xuXG5cdFx0aWYgKCBqc29uLnJvdWdobmVzc01hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwucm91Z2huZXNzTWFwID0gZ2V0VGV4dHVyZSgganNvbi5yb3VnaG5lc3NNYXAgKTtcblx0XHRpZiAoIGpzb24ubWV0YWxuZXNzTWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5tZXRhbG5lc3NNYXAgPSBnZXRUZXh0dXJlKCBqc29uLm1ldGFsbmVzc01hcCApO1xuXG5cdFx0aWYgKCBqc29uLmVtaXNzaXZlTWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5lbWlzc2l2ZU1hcCA9IGdldFRleHR1cmUoIGpzb24uZW1pc3NpdmVNYXAgKTtcblx0XHRpZiAoIGpzb24uZW1pc3NpdmVJbnRlbnNpdHkgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmVtaXNzaXZlSW50ZW5zaXR5ID0ganNvbi5lbWlzc2l2ZUludGVuc2l0eTtcblxuXHRcdGlmICgganNvbi5zcGVjdWxhck1hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuc3BlY3VsYXJNYXAgPSBnZXRUZXh0dXJlKCBqc29uLnNwZWN1bGFyTWFwICk7XG5cblx0XHRpZiAoIGpzb24uZW52TWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5lbnZNYXAgPSBnZXRUZXh0dXJlKCBqc29uLmVudk1hcCApO1xuXG5cdFx0aWYgKCBqc29uLnJlZmxlY3Rpdml0eSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwucmVmbGVjdGl2aXR5ID0ganNvbi5yZWZsZWN0aXZpdHk7XG5cblx0XHRpZiAoIGpzb24ubGlnaHRNYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmxpZ2h0TWFwID0gZ2V0VGV4dHVyZSgganNvbi5saWdodE1hcCApO1xuXHRcdGlmICgganNvbi5saWdodE1hcEludGVuc2l0eSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwubGlnaHRNYXBJbnRlbnNpdHkgPSBqc29uLmxpZ2h0TWFwSW50ZW5zaXR5O1xuXG5cdFx0aWYgKCBqc29uLmFvTWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5hb01hcCA9IGdldFRleHR1cmUoIGpzb24uYW9NYXAgKTtcblx0XHRpZiAoIGpzb24uYW9NYXBJbnRlbnNpdHkgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmFvTWFwSW50ZW5zaXR5ID0ganNvbi5hb01hcEludGVuc2l0eTtcblxuXHRcdGlmICgganNvbi5ncmFkaWVudE1hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZ3JhZGllbnRNYXAgPSBnZXRUZXh0dXJlKCBqc29uLmdyYWRpZW50TWFwICk7XG5cblx0XHRyZXR1cm4gbWF0ZXJpYWw7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBCdWZmZXJHZW9tZXRyeUxvYWRlciggbWFuYWdlciApIHtcblxuXHR0aGlzLm1hbmFnZXIgPSAoIG1hbmFnZXIgIT09IHVuZGVmaW5lZCApID8gbWFuYWdlciA6IERlZmF1bHRMb2FkaW5nTWFuYWdlcjtcblxufVxuXG5PYmplY3QuYXNzaWduKCBCdWZmZXJHZW9tZXRyeUxvYWRlci5wcm90b3R5cGUsIHtcblxuXHRsb2FkOiBmdW5jdGlvbiAoIHVybCwgb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkge1xuXG5cdFx0dmFyIHNjb3BlID0gdGhpcztcblxuXHRcdHZhciBsb2FkZXIgPSBuZXcgRmlsZUxvYWRlciggc2NvcGUubWFuYWdlciApO1xuXHRcdGxvYWRlci5sb2FkKCB1cmwsIGZ1bmN0aW9uICggdGV4dCApIHtcblxuXHRcdFx0b25Mb2FkKCBzY29wZS5wYXJzZSggSlNPTi5wYXJzZSggdGV4dCApICkgKTtcblxuXHRcdH0sIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKTtcblxuXHR9LFxuXG5cdHBhcnNlOiBmdW5jdGlvbiAoIGpzb24gKSB7XG5cblx0XHR2YXIgZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcblxuXHRcdHZhciBpbmRleCA9IGpzb24uZGF0YS5pbmRleDtcblxuXHRcdGlmICggaW5kZXggIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dmFyIHR5cGVkQXJyYXkgPSBuZXcgVFlQRURfQVJSQVlTWyBpbmRleC50eXBlIF0oIGluZGV4LmFycmF5ICk7XG5cdFx0XHRnZW9tZXRyeS5zZXRJbmRleCggbmV3IEJ1ZmZlckF0dHJpYnV0ZSggdHlwZWRBcnJheSwgMSApICk7XG5cblx0XHR9XG5cblx0XHR2YXIgYXR0cmlidXRlcyA9IGpzb24uZGF0YS5hdHRyaWJ1dGVzO1xuXG5cdFx0Zm9yICggdmFyIGtleSBpbiBhdHRyaWJ1dGVzICkge1xuXG5cdFx0XHR2YXIgYXR0cmlidXRlID0gYXR0cmlidXRlc1sga2V5IF07XG5cdFx0XHR2YXIgdHlwZWRBcnJheSA9IG5ldyBUWVBFRF9BUlJBWVNbIGF0dHJpYnV0ZS50eXBlIF0oIGF0dHJpYnV0ZS5hcnJheSApO1xuXG5cdFx0XHRnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoIGtleSwgbmV3IEJ1ZmZlckF0dHJpYnV0ZSggdHlwZWRBcnJheSwgYXR0cmlidXRlLml0ZW1TaXplLCBhdHRyaWJ1dGUubm9ybWFsaXplZCApICk7XG5cblx0XHR9XG5cblx0XHR2YXIgZ3JvdXBzID0ganNvbi5kYXRhLmdyb3VwcyB8fCBqc29uLmRhdGEuZHJhd2NhbGxzIHx8IGpzb24uZGF0YS5vZmZzZXRzO1xuXG5cdFx0aWYgKCBncm91cHMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBuID0gZ3JvdXBzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0XHR2YXIgZ3JvdXAgPSBncm91cHNbIGkgXTtcblxuXHRcdFx0XHRnZW9tZXRyeS5hZGRHcm91cCggZ3JvdXAuc3RhcnQsIGdyb3VwLmNvdW50LCBncm91cC5tYXRlcmlhbEluZGV4ICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHZhciBib3VuZGluZ1NwaGVyZSA9IGpzb24uZGF0YS5ib3VuZGluZ1NwaGVyZTtcblxuXHRcdGlmICggYm91bmRpbmdTcGhlcmUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dmFyIGNlbnRlciA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRcdGlmICggYm91bmRpbmdTcGhlcmUuY2VudGVyICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Y2VudGVyLmZyb21BcnJheSggYm91bmRpbmdTcGhlcmUuY2VudGVyICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Z2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgPSBuZXcgU3BoZXJlKCBjZW50ZXIsIGJvdW5kaW5nU3BoZXJlLnJhZGl1cyApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGdlb21ldHJ5O1xuXG5cdH1cblxufSApO1xuXG52YXIgVFlQRURfQVJSQVlTID0ge1xuXHRJbnQ4QXJyYXk6IEludDhBcnJheSxcblx0VWludDhBcnJheTogVWludDhBcnJheSxcblx0Ly8gV29ya2Fyb3VuZCBmb3IgSUUxMSBwcmUgS0IyOTI5NDM3LiBTZWUgIzExNDQwXG5cdFVpbnQ4Q2xhbXBlZEFycmF5OiB0eXBlb2YgVWludDhDbGFtcGVkQXJyYXkgIT09ICd1bmRlZmluZWQnID8gVWludDhDbGFtcGVkQXJyYXkgOiBVaW50OEFycmF5LFxuXHRJbnQxNkFycmF5OiBJbnQxNkFycmF5LFxuXHRVaW50MTZBcnJheTogVWludDE2QXJyYXksXG5cdEludDMyQXJyYXk6IEludDMyQXJyYXksXG5cdFVpbnQzMkFycmF5OiBVaW50MzJBcnJheSxcblx0RmxvYXQzMkFycmF5OiBGbG9hdDMyQXJyYXksXG5cdEZsb2F0NjRBcnJheTogRmxvYXQ2NEFycmF5XG59O1xuXG4vKipcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKi9cblxuZnVuY3Rpb24gTG9hZGVyKCkge31cblxuTG9hZGVyLkhhbmRsZXJzID0ge1xuXG5cdGhhbmRsZXJzOiBbXSxcblxuXHRhZGQ6IGZ1bmN0aW9uICggcmVnZXgsIGxvYWRlciApIHtcblxuXHRcdHRoaXMuaGFuZGxlcnMucHVzaCggcmVnZXgsIGxvYWRlciApO1xuXG5cdH0sXG5cblx0Z2V0OiBmdW5jdGlvbiAoIGZpbGUgKSB7XG5cblx0XHR2YXIgaGFuZGxlcnMgPSB0aGlzLmhhbmRsZXJzO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gaGFuZGxlcnMubGVuZ3RoOyBpIDwgbDsgaSArPSAyICkge1xuXG5cdFx0XHR2YXIgcmVnZXggPSBoYW5kbGVyc1sgaSBdO1xuXHRcdFx0dmFyIGxvYWRlciA9IGhhbmRsZXJzWyBpICsgMSBdO1xuXG5cdFx0XHRpZiAoIHJlZ2V4LnRlc3QoIGZpbGUgKSApIHtcblxuXHRcdFx0XHRyZXR1cm4gbG9hZGVyO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gbnVsbDtcblxuXHR9XG5cbn07XG5cbk9iamVjdC5hc3NpZ24oIExvYWRlci5wcm90b3R5cGUsIHtcblxuXHRjcm9zc09yaWdpbjogdW5kZWZpbmVkLFxuXG5cdG9uTG9hZFN0YXJ0OiBmdW5jdGlvbiAoKSB7fSxcblxuXHRvbkxvYWRQcm9ncmVzczogZnVuY3Rpb24gKCkge30sXG5cblx0b25Mb2FkQ29tcGxldGU6IGZ1bmN0aW9uICgpIHt9LFxuXG5cdGluaXRNYXRlcmlhbHM6IGZ1bmN0aW9uICggbWF0ZXJpYWxzLCB0ZXh0dXJlUGF0aCwgY3Jvc3NPcmlnaW4gKSB7XG5cblx0XHR2YXIgYXJyYXkgPSBbXTtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IG1hdGVyaWFscy5sZW5ndGg7ICsrIGkgKSB7XG5cblx0XHRcdGFycmF5WyBpIF0gPSB0aGlzLmNyZWF0ZU1hdGVyaWFsKCBtYXRlcmlhbHNbIGkgXSwgdGV4dHVyZVBhdGgsIGNyb3NzT3JpZ2luICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gYXJyYXk7XG5cblx0fSxcblxuXHRjcmVhdGVNYXRlcmlhbDogKCBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgQmxlbmRpbmdNb2RlID0ge1xuXHRcdFx0Tm9CbGVuZGluZzogTm9CbGVuZGluZyxcblx0XHRcdE5vcm1hbEJsZW5kaW5nOiBOb3JtYWxCbGVuZGluZyxcblx0XHRcdEFkZGl0aXZlQmxlbmRpbmc6IEFkZGl0aXZlQmxlbmRpbmcsXG5cdFx0XHRTdWJ0cmFjdGl2ZUJsZW5kaW5nOiBTdWJ0cmFjdGl2ZUJsZW5kaW5nLFxuXHRcdFx0TXVsdGlwbHlCbGVuZGluZzogTXVsdGlwbHlCbGVuZGluZyxcblx0XHRcdEN1c3RvbUJsZW5kaW5nOiBDdXN0b21CbGVuZGluZ1xuXHRcdH07XG5cblx0XHR2YXIgY29sb3IgPSBuZXcgQ29sb3IoKTtcblx0XHR2YXIgdGV4dHVyZUxvYWRlciA9IG5ldyBUZXh0dXJlTG9hZGVyKCk7XG5cdFx0dmFyIG1hdGVyaWFsTG9hZGVyID0gbmV3IE1hdGVyaWFsTG9hZGVyKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gY3JlYXRlTWF0ZXJpYWwoIG0sIHRleHR1cmVQYXRoLCBjcm9zc09yaWdpbiApIHtcblxuXHRcdFx0Ly8gY29udmVydCBmcm9tIG9sZCBtYXRlcmlhbCBmb3JtYXRcblxuXHRcdFx0dmFyIHRleHR1cmVzID0ge307XG5cblx0XHRcdGZ1bmN0aW9uIGxvYWRUZXh0dXJlKCBwYXRoLCByZXBlYXQsIG9mZnNldCwgd3JhcCwgYW5pc290cm9weSApIHtcblxuXHRcdFx0XHR2YXIgZnVsbFBhdGggPSB0ZXh0dXJlUGF0aCArIHBhdGg7XG5cdFx0XHRcdHZhciBsb2FkZXIgPSBMb2FkZXIuSGFuZGxlcnMuZ2V0KCBmdWxsUGF0aCApO1xuXG5cdFx0XHRcdHZhciB0ZXh0dXJlO1xuXG5cdFx0XHRcdGlmICggbG9hZGVyICE9PSBudWxsICkge1xuXG5cdFx0XHRcdFx0dGV4dHVyZSA9IGxvYWRlci5sb2FkKCBmdWxsUGF0aCApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHR0ZXh0dXJlTG9hZGVyLnNldENyb3NzT3JpZ2luKCBjcm9zc09yaWdpbiApO1xuXHRcdFx0XHRcdHRleHR1cmUgPSB0ZXh0dXJlTG9hZGVyLmxvYWQoIGZ1bGxQYXRoICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggcmVwZWF0ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHR0ZXh0dXJlLnJlcGVhdC5mcm9tQXJyYXkoIHJlcGVhdCApO1xuXG5cdFx0XHRcdFx0aWYgKCByZXBlYXRbIDAgXSAhPT0gMSApIHRleHR1cmUud3JhcFMgPSBSZXBlYXRXcmFwcGluZztcblx0XHRcdFx0XHRpZiAoIHJlcGVhdFsgMSBdICE9PSAxICkgdGV4dHVyZS53cmFwVCA9IFJlcGVhdFdyYXBwaW5nO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIG9mZnNldCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0dGV4dHVyZS5vZmZzZXQuZnJvbUFycmF5KCBvZmZzZXQgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCB3cmFwICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRpZiAoIHdyYXBbIDAgXSA9PT0gJ3JlcGVhdCcgKSB0ZXh0dXJlLndyYXBTID0gUmVwZWF0V3JhcHBpbmc7XG5cdFx0XHRcdFx0aWYgKCB3cmFwWyAwIF0gPT09ICdtaXJyb3InICkgdGV4dHVyZS53cmFwUyA9IE1pcnJvcmVkUmVwZWF0V3JhcHBpbmc7XG5cblx0XHRcdFx0XHRpZiAoIHdyYXBbIDEgXSA9PT0gJ3JlcGVhdCcgKSB0ZXh0dXJlLndyYXBUID0gUmVwZWF0V3JhcHBpbmc7XG5cdFx0XHRcdFx0aWYgKCB3cmFwWyAxIF0gPT09ICdtaXJyb3InICkgdGV4dHVyZS53cmFwVCA9IE1pcnJvcmVkUmVwZWF0V3JhcHBpbmc7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggYW5pc290cm9weSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0dGV4dHVyZS5hbmlzb3Ryb3B5ID0gYW5pc290cm9weTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dmFyIHV1aWQgPSBfTWF0aC5nZW5lcmF0ZVVVSUQoKTtcblxuXHRcdFx0XHR0ZXh0dXJlc1sgdXVpZCBdID0gdGV4dHVyZTtcblxuXHRcdFx0XHRyZXR1cm4gdXVpZDtcblxuXHRcdFx0fVxuXG5cdFx0XHQvL1xuXG5cdFx0XHR2YXIganNvbiA9IHtcblx0XHRcdFx0dXVpZDogX01hdGguZ2VuZXJhdGVVVUlEKCksXG5cdFx0XHRcdHR5cGU6ICdNZXNoTGFtYmVydE1hdGVyaWFsJ1xuXHRcdFx0fTtcblxuXHRcdFx0Zm9yICggdmFyIG5hbWUgaW4gbSApIHtcblxuXHRcdFx0XHR2YXIgdmFsdWUgPSBtWyBuYW1lIF07XG5cblx0XHRcdFx0c3dpdGNoICggbmFtZSApIHtcblxuXHRcdFx0XHRcdGNhc2UgJ0RiZ0NvbG9yJzpcblx0XHRcdFx0XHRjYXNlICdEYmdJbmRleCc6XG5cdFx0XHRcdFx0Y2FzZSAnb3B0aWNhbERlbnNpdHknOlxuXHRcdFx0XHRcdGNhc2UgJ2lsbHVtaW5hdGlvbic6XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdEYmdOYW1lJzpcblx0XHRcdFx0XHRcdGpzb24ubmFtZSA9IHZhbHVlO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnYmxlbmRpbmcnOlxuXHRcdFx0XHRcdFx0anNvbi5ibGVuZGluZyA9IEJsZW5kaW5nTW9kZVsgdmFsdWUgXTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2NvbG9yQW1iaWVudCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwQW1iaWVudCc6XG5cdFx0XHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Mb2FkZXIuY3JlYXRlTWF0ZXJpYWw6JywgbmFtZSwgJ2lzIG5vIGxvbmdlciBzdXBwb3J0ZWQuJyApO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnY29sb3JEaWZmdXNlJzpcblx0XHRcdFx0XHRcdGpzb24uY29sb3IgPSBjb2xvci5mcm9tQXJyYXkoIHZhbHVlICkuZ2V0SGV4KCk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdjb2xvclNwZWN1bGFyJzpcblx0XHRcdFx0XHRcdGpzb24uc3BlY3VsYXIgPSBjb2xvci5mcm9tQXJyYXkoIHZhbHVlICkuZ2V0SGV4KCk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdjb2xvckVtaXNzaXZlJzpcblx0XHRcdFx0XHRcdGpzb24uZW1pc3NpdmUgPSBjb2xvci5mcm9tQXJyYXkoIHZhbHVlICkuZ2V0SGV4KCk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdzcGVjdWxhckNvZWYnOlxuXHRcdFx0XHRcdFx0anNvbi5zaGluaW5lc3MgPSB2YWx1ZTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3NoYWRpbmcnOlxuXHRcdFx0XHRcdFx0aWYgKCB2YWx1ZS50b0xvd2VyQ2FzZSgpID09PSAnYmFzaWMnICkganNvbi50eXBlID0gJ01lc2hCYXNpY01hdGVyaWFsJztcblx0XHRcdFx0XHRcdGlmICggdmFsdWUudG9Mb3dlckNhc2UoKSA9PT0gJ3Bob25nJyApIGpzb24udHlwZSA9ICdNZXNoUGhvbmdNYXRlcmlhbCc7XG5cdFx0XHRcdFx0XHRpZiAoIHZhbHVlLnRvTG93ZXJDYXNlKCkgPT09ICdzdGFuZGFyZCcgKSBqc29uLnR5cGUgPSAnTWVzaFN0YW5kYXJkTWF0ZXJpYWwnO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbWFwRGlmZnVzZSc6XG5cdFx0XHRcdFx0XHRqc29uLm1hcCA9IGxvYWRUZXh0dXJlKCB2YWx1ZSwgbS5tYXBEaWZmdXNlUmVwZWF0LCBtLm1hcERpZmZ1c2VPZmZzZXQsIG0ubWFwRGlmZnVzZVdyYXAsIG0ubWFwRGlmZnVzZUFuaXNvdHJvcHkgKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ21hcERpZmZ1c2VSZXBlYXQnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcERpZmZ1c2VPZmZzZXQnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcERpZmZ1c2VXcmFwJzpcblx0XHRcdFx0XHRjYXNlICdtYXBEaWZmdXNlQW5pc290cm9weSc6XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdtYXBFbWlzc2l2ZSc6XG5cdFx0XHRcdFx0XHRqc29uLmVtaXNzaXZlTWFwID0gbG9hZFRleHR1cmUoIHZhbHVlLCBtLm1hcEVtaXNzaXZlUmVwZWF0LCBtLm1hcEVtaXNzaXZlT2Zmc2V0LCBtLm1hcEVtaXNzaXZlV3JhcCwgbS5tYXBFbWlzc2l2ZUFuaXNvdHJvcHkgKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ21hcEVtaXNzaXZlUmVwZWF0Jzpcblx0XHRcdFx0XHRjYXNlICdtYXBFbWlzc2l2ZU9mZnNldCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwRW1pc3NpdmVXcmFwJzpcblx0XHRcdFx0XHRjYXNlICdtYXBFbWlzc2l2ZUFuaXNvdHJvcHknOlxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbWFwTGlnaHQnOlxuXHRcdFx0XHRcdFx0anNvbi5saWdodE1hcCA9IGxvYWRUZXh0dXJlKCB2YWx1ZSwgbS5tYXBMaWdodFJlcGVhdCwgbS5tYXBMaWdodE9mZnNldCwgbS5tYXBMaWdodFdyYXAsIG0ubWFwTGlnaHRBbmlzb3Ryb3B5ICk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdtYXBMaWdodFJlcGVhdCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwTGlnaHRPZmZzZXQnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcExpZ2h0V3JhcCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwTGlnaHRBbmlzb3Ryb3B5Jzpcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ21hcEFPJzpcblx0XHRcdFx0XHRcdGpzb24uYW9NYXAgPSBsb2FkVGV4dHVyZSggdmFsdWUsIG0ubWFwQU9SZXBlYXQsIG0ubWFwQU9PZmZzZXQsIG0ubWFwQU9XcmFwLCBtLm1hcEFPQW5pc290cm9weSApO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbWFwQU9SZXBlYXQnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcEFPT2Zmc2V0Jzpcblx0XHRcdFx0XHRjYXNlICdtYXBBT1dyYXAnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcEFPQW5pc290cm9weSc6XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdtYXBCdW1wJzpcblx0XHRcdFx0XHRcdGpzb24uYnVtcE1hcCA9IGxvYWRUZXh0dXJlKCB2YWx1ZSwgbS5tYXBCdW1wUmVwZWF0LCBtLm1hcEJ1bXBPZmZzZXQsIG0ubWFwQnVtcFdyYXAsIG0ubWFwQnVtcEFuaXNvdHJvcHkgKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ21hcEJ1bXBTY2FsZSc6XG5cdFx0XHRcdFx0XHRqc29uLmJ1bXBTY2FsZSA9IHZhbHVlO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbWFwQnVtcFJlcGVhdCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwQnVtcE9mZnNldCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwQnVtcFdyYXAnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcEJ1bXBBbmlzb3Ryb3B5Jzpcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ21hcE5vcm1hbCc6XG5cdFx0XHRcdFx0XHRqc29uLm5vcm1hbE1hcCA9IGxvYWRUZXh0dXJlKCB2YWx1ZSwgbS5tYXBOb3JtYWxSZXBlYXQsIG0ubWFwTm9ybWFsT2Zmc2V0LCBtLm1hcE5vcm1hbFdyYXAsIG0ubWFwTm9ybWFsQW5pc290cm9weSApO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbWFwTm9ybWFsRmFjdG9yJzpcblx0XHRcdFx0XHRcdGpzb24ubm9ybWFsU2NhbGUgPSB2YWx1ZTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ21hcE5vcm1hbFJlcGVhdCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwTm9ybWFsT2Zmc2V0Jzpcblx0XHRcdFx0XHRjYXNlICdtYXBOb3JtYWxXcmFwJzpcblx0XHRcdFx0XHRjYXNlICdtYXBOb3JtYWxBbmlzb3Ryb3B5Jzpcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ21hcFNwZWN1bGFyJzpcblx0XHRcdFx0XHRcdGpzb24uc3BlY3VsYXJNYXAgPSBsb2FkVGV4dHVyZSggdmFsdWUsIG0ubWFwU3BlY3VsYXJSZXBlYXQsIG0ubWFwU3BlY3VsYXJPZmZzZXQsIG0ubWFwU3BlY3VsYXJXcmFwLCBtLm1hcFNwZWN1bGFyQW5pc290cm9weSApO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbWFwU3BlY3VsYXJSZXBlYXQnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcFNwZWN1bGFyT2Zmc2V0Jzpcblx0XHRcdFx0XHRjYXNlICdtYXBTcGVjdWxhcldyYXAnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcFNwZWN1bGFyQW5pc290cm9weSc6XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdtYXBNZXRhbG5lc3MnOlxuXHRcdFx0XHRcdFx0anNvbi5tZXRhbG5lc3NNYXAgPSBsb2FkVGV4dHVyZSggdmFsdWUsIG0ubWFwTWV0YWxuZXNzUmVwZWF0LCBtLm1hcE1ldGFsbmVzc09mZnNldCwgbS5tYXBNZXRhbG5lc3NXcmFwLCBtLm1hcE1ldGFsbmVzc0FuaXNvdHJvcHkgKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ21hcE1ldGFsbmVzc1JlcGVhdCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwTWV0YWxuZXNzT2Zmc2V0Jzpcblx0XHRcdFx0XHRjYXNlICdtYXBNZXRhbG5lc3NXcmFwJzpcblx0XHRcdFx0XHRjYXNlICdtYXBNZXRhbG5lc3NBbmlzb3Ryb3B5Jzpcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ21hcFJvdWdobmVzcyc6XG5cdFx0XHRcdFx0XHRqc29uLnJvdWdobmVzc01hcCA9IGxvYWRUZXh0dXJlKCB2YWx1ZSwgbS5tYXBSb3VnaG5lc3NSZXBlYXQsIG0ubWFwUm91Z2huZXNzT2Zmc2V0LCBtLm1hcFJvdWdobmVzc1dyYXAsIG0ubWFwUm91Z2huZXNzQW5pc290cm9weSApO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbWFwUm91Z2huZXNzUmVwZWF0Jzpcblx0XHRcdFx0XHRjYXNlICdtYXBSb3VnaG5lc3NPZmZzZXQnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcFJvdWdobmVzc1dyYXAnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcFJvdWdobmVzc0FuaXNvdHJvcHknOlxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbWFwQWxwaGEnOlxuXHRcdFx0XHRcdFx0anNvbi5hbHBoYU1hcCA9IGxvYWRUZXh0dXJlKCB2YWx1ZSwgbS5tYXBBbHBoYVJlcGVhdCwgbS5tYXBBbHBoYU9mZnNldCwgbS5tYXBBbHBoYVdyYXAsIG0ubWFwQWxwaGFBbmlzb3Ryb3B5ICk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdtYXBBbHBoYVJlcGVhdCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwQWxwaGFPZmZzZXQnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcEFscGhhV3JhcCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwQWxwaGFBbmlzb3Ryb3B5Jzpcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2ZsaXBTaWRlZCc6XG5cdFx0XHRcdFx0XHRqc29uLnNpZGUgPSBCYWNrU2lkZTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2RvdWJsZVNpZGVkJzpcblx0XHRcdFx0XHRcdGpzb24uc2lkZSA9IERvdWJsZVNpZGU7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICd0cmFuc3BhcmVuY3knOlxuXHRcdFx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTG9hZGVyLmNyZWF0ZU1hdGVyaWFsOiB0cmFuc3BhcmVuY3kgaGFzIGJlZW4gcmVuYW1lZCB0byBvcGFjaXR5JyApO1xuXHRcdFx0XHRcdFx0anNvbi5vcGFjaXR5ID0gdmFsdWU7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdkZXB0aFRlc3QnOlxuXHRcdFx0XHRcdGNhc2UgJ2RlcHRoV3JpdGUnOlxuXHRcdFx0XHRcdGNhc2UgJ2NvbG9yV3JpdGUnOlxuXHRcdFx0XHRcdGNhc2UgJ29wYWNpdHknOlxuXHRcdFx0XHRcdGNhc2UgJ3JlZmxlY3Rpdml0eSc6XG5cdFx0XHRcdFx0Y2FzZSAndHJhbnNwYXJlbnQnOlxuXHRcdFx0XHRcdGNhc2UgJ3Zpc2libGUnOlxuXHRcdFx0XHRcdGNhc2UgJ3dpcmVmcmFtZSc6XG5cdFx0XHRcdFx0XHRqc29uWyBuYW1lIF0gPSB2YWx1ZTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3ZlcnRleENvbG9ycyc6XG5cdFx0XHRcdFx0XHRpZiAoIHZhbHVlID09PSB0cnVlICkganNvbi52ZXJ0ZXhDb2xvcnMgPSBWZXJ0ZXhDb2xvcnM7XG5cdFx0XHRcdFx0XHRpZiAoIHZhbHVlID09PSAnZmFjZScgKSBqc29uLnZlcnRleENvbG9ycyA9IEZhY2VDb2xvcnM7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLkxvYWRlci5jcmVhdGVNYXRlcmlhbDogVW5zdXBwb3J0ZWQnLCBuYW1lLCB2YWx1ZSApO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdGlmICgganNvbi50eXBlID09PSAnTWVzaEJhc2ljTWF0ZXJpYWwnICkgZGVsZXRlIGpzb24uZW1pc3NpdmU7XG5cdFx0XHRpZiAoIGpzb24udHlwZSAhPT0gJ01lc2hQaG9uZ01hdGVyaWFsJyApIGRlbGV0ZSBqc29uLnNwZWN1bGFyO1xuXG5cdFx0XHRpZiAoIGpzb24ub3BhY2l0eSA8IDEgKSBqc29uLnRyYW5zcGFyZW50ID0gdHJ1ZTtcblxuXHRcdFx0bWF0ZXJpYWxMb2FkZXIuc2V0VGV4dHVyZXMoIHRleHR1cmVzICk7XG5cblx0XHRcdHJldHVybiBtYXRlcmlhbExvYWRlci5wYXJzZSgganNvbiApO1xuXG5cdFx0fTtcblxuXHR9ICkoKVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBEb24gTWNDdXJkeSAvIGh0dHBzOi8vd3d3LmRvbm1jY3VyZHkuY29tXG4gKi9cblxudmFyIExvYWRlclV0aWxzID0ge1xuXG5cdGRlY29kZVRleHQ6IGZ1bmN0aW9uICggYXJyYXkgKSB7XG5cblx0XHRpZiAoIHR5cGVvZiBUZXh0RGVjb2RlciAhPT0gJ3VuZGVmaW5lZCcgKSB7XG5cblx0XHRcdHJldHVybiBuZXcgVGV4dERlY29kZXIoKS5kZWNvZGUoIGFycmF5ICk7XG5cblx0XHR9XG5cblx0XHQvLyBBdm9pZCB0aGUgU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBhcnJheSkgc2hvcnRjdXQsIHdoaWNoXG5cdFx0Ly8gdGhyb3dzIGEgXCJtYXhpbXVtIGNhbGwgc3RhY2sgc2l6ZSBleGNlZWRlZFwiIGVycm9yIGZvciBsYXJnZSBhcnJheXMuXG5cblx0XHR2YXIgcyA9ICcnO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IGFycmF5Lmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHQvLyBJbXBsaWNpdGx5IGFzc3VtZXMgbGl0dGxlLWVuZGlhbi5cblx0XHRcdHMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSggYXJyYXlbIGkgXSApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gTWVyZ2VzIG11bHRpLWJ5dGUgdXRmLTggY2hhcmFjdGVycy5cblx0XHRyZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KCBlc2NhcGUoIHMgKSApO1xuXG5cdH0sXG5cblx0ZXh0cmFjdFVybEJhc2U6IGZ1bmN0aW9uICggdXJsICkge1xuXG5cdFx0dmFyIGluZGV4ID0gdXJsLmxhc3RJbmRleE9mKCAnLycgKTtcblxuXHRcdGlmICggaW5kZXggPT09IC0gMSApIHJldHVybiAnLi8nO1xuXG5cdFx0cmV0dXJuIHVybC5zdWJzdHIoIDAsIGluZGV4ICsgMSApO1xuXG5cdH1cblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBKU09OTG9hZGVyKCBtYW5hZ2VyICkge1xuXG5cdGlmICggdHlwZW9mIG1hbmFnZXIgPT09ICdib29sZWFuJyApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkpTT05Mb2FkZXI6IHNob3dTdGF0dXMgcGFyYW1ldGVyIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSBjb25zdHJ1Y3Rvci4nICk7XG5cdFx0bWFuYWdlciA9IHVuZGVmaW5lZDtcblxuXHR9XG5cblx0dGhpcy5tYW5hZ2VyID0gKCBtYW5hZ2VyICE9PSB1bmRlZmluZWQgKSA/IG1hbmFnZXIgOiBEZWZhdWx0TG9hZGluZ01hbmFnZXI7XG5cblx0dGhpcy53aXRoQ3JlZGVudGlhbHMgPSBmYWxzZTtcblxufVxuXG5PYmplY3QuYXNzaWduKCBKU09OTG9hZGVyLnByb3RvdHlwZSwge1xuXG5cdGxvYWQ6IGZ1bmN0aW9uICggdXJsLCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKSB7XG5cblx0XHR2YXIgc2NvcGUgPSB0aGlzO1xuXG5cdFx0dmFyIHRleHR1cmVQYXRoID0gdGhpcy50ZXh0dXJlUGF0aCAmJiAoIHR5cGVvZiB0aGlzLnRleHR1cmVQYXRoID09PSAnc3RyaW5nJyApID8gdGhpcy50ZXh0dXJlUGF0aCA6IExvYWRlclV0aWxzLmV4dHJhY3RVcmxCYXNlKCB1cmwgKTtcblxuXHRcdHZhciBsb2FkZXIgPSBuZXcgRmlsZUxvYWRlciggdGhpcy5tYW5hZ2VyICk7XG5cdFx0bG9hZGVyLnNldFdpdGhDcmVkZW50aWFscyggdGhpcy53aXRoQ3JlZGVudGlhbHMgKTtcblx0XHRsb2FkZXIubG9hZCggdXJsLCBmdW5jdGlvbiAoIHRleHQgKSB7XG5cblx0XHRcdHZhciBqc29uID0gSlNPTi5wYXJzZSggdGV4dCApO1xuXHRcdFx0dmFyIG1ldGFkYXRhID0ganNvbi5tZXRhZGF0YTtcblxuXHRcdFx0aWYgKCBtZXRhZGF0YSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHZhciB0eXBlID0gbWV0YWRhdGEudHlwZTtcblxuXHRcdFx0XHRpZiAoIHR5cGUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdGlmICggdHlwZS50b0xvd2VyQ2FzZSgpID09PSAnb2JqZWN0JyApIHtcblxuXHRcdFx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLkpTT05Mb2FkZXI6ICcgKyB1cmwgKyAnIHNob3VsZCBiZSBsb2FkZWQgd2l0aCBUSFJFRS5PYmplY3RMb2FkZXIgaW5zdGVhZC4nICk7XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdHZhciBvYmplY3QgPSBzY29wZS5wYXJzZSgganNvbiwgdGV4dHVyZVBhdGggKTtcblx0XHRcdG9uTG9hZCggb2JqZWN0Lmdlb21ldHJ5LCBvYmplY3QubWF0ZXJpYWxzICk7XG5cblx0XHR9LCBvblByb2dyZXNzLCBvbkVycm9yICk7XG5cblx0fSxcblxuXHRzZXRUZXh0dXJlUGF0aDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMudGV4dHVyZVBhdGggPSB2YWx1ZTtcblxuXHR9LFxuXG5cdHBhcnNlOiAoIGZ1bmN0aW9uICgpIHtcblxuXHRcdGZ1bmN0aW9uIHBhcnNlTW9kZWwoIGpzb24sIGdlb21ldHJ5ICkge1xuXG5cdFx0XHRmdW5jdGlvbiBpc0JpdFNldCggdmFsdWUsIHBvc2l0aW9uICkge1xuXG5cdFx0XHRcdHJldHVybiB2YWx1ZSAmICggMSA8PCBwb3NpdGlvbiApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHZhciBpLCBqLCBmaSxcblxuXHRcdFx0XHRvZmZzZXQsIHpMZW5ndGgsXG5cblx0XHRcdFx0Y29sb3JJbmRleCwgbm9ybWFsSW5kZXgsIHV2SW5kZXgsIG1hdGVyaWFsSW5kZXgsXG5cblx0XHRcdFx0dHlwZSxcblx0XHRcdFx0aXNRdWFkLFxuXHRcdFx0XHRoYXNNYXRlcmlhbCxcblx0XHRcdFx0aGFzRmFjZVZlcnRleFV2LFxuXHRcdFx0XHRoYXNGYWNlTm9ybWFsLCBoYXNGYWNlVmVydGV4Tm9ybWFsLFxuXHRcdFx0XHRoYXNGYWNlQ29sb3IsIGhhc0ZhY2VWZXJ0ZXhDb2xvcixcblxuXHRcdFx0XHR2ZXJ0ZXgsIGZhY2UsIGZhY2VBLCBmYWNlQiwgaGV4LCBub3JtYWwsXG5cblx0XHRcdFx0dXZMYXllciwgdXYsIHUsIHYsXG5cblx0XHRcdFx0ZmFjZXMgPSBqc29uLmZhY2VzLFxuXHRcdFx0XHR2ZXJ0aWNlcyA9IGpzb24udmVydGljZXMsXG5cdFx0XHRcdG5vcm1hbHMgPSBqc29uLm5vcm1hbHMsXG5cdFx0XHRcdGNvbG9ycyA9IGpzb24uY29sb3JzLFxuXG5cdFx0XHRcdHNjYWxlID0ganNvbi5zY2FsZSxcblxuXHRcdFx0XHRuVXZMYXllcnMgPSAwO1xuXG5cblx0XHRcdGlmICgganNvbi51dnMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHQvLyBkaXNyZWdhcmQgZW1wdHkgYXJyYXlzXG5cblx0XHRcdFx0Zm9yICggaSA9IDA7IGkgPCBqc29uLnV2cy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRpZiAoIGpzb24udXZzWyBpIF0ubGVuZ3RoICkgblV2TGF5ZXJzICsrO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRmb3IgKCBpID0gMDsgaSA8IG5VdkxheWVyczsgaSArKyApIHtcblxuXHRcdFx0XHRcdGdlb21ldHJ5LmZhY2VWZXJ0ZXhVdnNbIGkgXSA9IFtdO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRvZmZzZXQgPSAwO1xuXHRcdFx0ekxlbmd0aCA9IHZlcnRpY2VzLmxlbmd0aDtcblxuXHRcdFx0d2hpbGUgKCBvZmZzZXQgPCB6TGVuZ3RoICkge1xuXG5cdFx0XHRcdHZlcnRleCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRcdFx0dmVydGV4LnggPSB2ZXJ0aWNlc1sgb2Zmc2V0ICsrIF0gKiBzY2FsZTtcblx0XHRcdFx0dmVydGV4LnkgPSB2ZXJ0aWNlc1sgb2Zmc2V0ICsrIF0gKiBzY2FsZTtcblx0XHRcdFx0dmVydGV4LnogPSB2ZXJ0aWNlc1sgb2Zmc2V0ICsrIF0gKiBzY2FsZTtcblxuXHRcdFx0XHRnZW9tZXRyeS52ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXggKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRvZmZzZXQgPSAwO1xuXHRcdFx0ekxlbmd0aCA9IGZhY2VzLmxlbmd0aDtcblxuXHRcdFx0d2hpbGUgKCBvZmZzZXQgPCB6TGVuZ3RoICkge1xuXG5cdFx0XHRcdHR5cGUgPSBmYWNlc1sgb2Zmc2V0ICsrIF07XG5cblx0XHRcdFx0aXNRdWFkID0gaXNCaXRTZXQoIHR5cGUsIDAgKTtcblx0XHRcdFx0aGFzTWF0ZXJpYWwgPSBpc0JpdFNldCggdHlwZSwgMSApO1xuXHRcdFx0XHRoYXNGYWNlVmVydGV4VXYgPSBpc0JpdFNldCggdHlwZSwgMyApO1xuXHRcdFx0XHRoYXNGYWNlTm9ybWFsID0gaXNCaXRTZXQoIHR5cGUsIDQgKTtcblx0XHRcdFx0aGFzRmFjZVZlcnRleE5vcm1hbCA9IGlzQml0U2V0KCB0eXBlLCA1ICk7XG5cdFx0XHRcdGhhc0ZhY2VDb2xvciA9IGlzQml0U2V0KCB0eXBlLCA2ICk7XG5cdFx0XHRcdGhhc0ZhY2VWZXJ0ZXhDb2xvciA9IGlzQml0U2V0KCB0eXBlLCA3ICk7XG5cblx0XHRcdFx0Ly8gY29uc29sZS5sb2coXCJ0eXBlXCIsIHR5cGUsIFwiYml0c1wiLCBpc1F1YWQsIGhhc01hdGVyaWFsLCBoYXNGYWNlVmVydGV4VXYsIGhhc0ZhY2VOb3JtYWwsIGhhc0ZhY2VWZXJ0ZXhOb3JtYWwsIGhhc0ZhY2VDb2xvciwgaGFzRmFjZVZlcnRleENvbG9yKTtcblxuXHRcdFx0XHRpZiAoIGlzUXVhZCApIHtcblxuXHRcdFx0XHRcdGZhY2VBID0gbmV3IEZhY2UzKCk7XG5cdFx0XHRcdFx0ZmFjZUEuYSA9IGZhY2VzWyBvZmZzZXQgXTtcblx0XHRcdFx0XHRmYWNlQS5iID0gZmFjZXNbIG9mZnNldCArIDEgXTtcblx0XHRcdFx0XHRmYWNlQS5jID0gZmFjZXNbIG9mZnNldCArIDMgXTtcblxuXHRcdFx0XHRcdGZhY2VCID0gbmV3IEZhY2UzKCk7XG5cdFx0XHRcdFx0ZmFjZUIuYSA9IGZhY2VzWyBvZmZzZXQgKyAxIF07XG5cdFx0XHRcdFx0ZmFjZUIuYiA9IGZhY2VzWyBvZmZzZXQgKyAyIF07XG5cdFx0XHRcdFx0ZmFjZUIuYyA9IGZhY2VzWyBvZmZzZXQgKyAzIF07XG5cblx0XHRcdFx0XHRvZmZzZXQgKz0gNDtcblxuXHRcdFx0XHRcdGlmICggaGFzTWF0ZXJpYWwgKSB7XG5cblx0XHRcdFx0XHRcdG1hdGVyaWFsSW5kZXggPSBmYWNlc1sgb2Zmc2V0ICsrIF07XG5cdFx0XHRcdFx0XHRmYWNlQS5tYXRlcmlhbEluZGV4ID0gbWF0ZXJpYWxJbmRleDtcblx0XHRcdFx0XHRcdGZhY2VCLm1hdGVyaWFsSW5kZXggPSBtYXRlcmlhbEluZGV4O1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gdG8gZ2V0IGZhY2UgPD0+IHV2IGluZGV4IGNvcnJlc3BvbmRlbmNlXG5cblx0XHRcdFx0XHRmaSA9IGdlb21ldHJ5LmZhY2VzLmxlbmd0aDtcblxuXHRcdFx0XHRcdGlmICggaGFzRmFjZVZlcnRleFV2ICkge1xuXG5cdFx0XHRcdFx0XHRmb3IgKCBpID0gMDsgaSA8IG5VdkxheWVyczsgaSArKyApIHtcblxuXHRcdFx0XHRcdFx0XHR1dkxheWVyID0ganNvbi51dnNbIGkgXTtcblxuXHRcdFx0XHRcdFx0XHRnZW9tZXRyeS5mYWNlVmVydGV4VXZzWyBpIF1bIGZpIF0gPSBbXTtcblx0XHRcdFx0XHRcdFx0Z2VvbWV0cnkuZmFjZVZlcnRleFV2c1sgaSBdWyBmaSArIDEgXSA9IFtdO1xuXG5cdFx0XHRcdFx0XHRcdGZvciAoIGogPSAwOyBqIDwgNDsgaiArKyApIHtcblxuXHRcdFx0XHRcdFx0XHRcdHV2SW5kZXggPSBmYWNlc1sgb2Zmc2V0ICsrIF07XG5cblx0XHRcdFx0XHRcdFx0XHR1ID0gdXZMYXllclsgdXZJbmRleCAqIDIgXTtcblx0XHRcdFx0XHRcdFx0XHR2ID0gdXZMYXllclsgdXZJbmRleCAqIDIgKyAxIF07XG5cblx0XHRcdFx0XHRcdFx0XHR1diA9IG5ldyBWZWN0b3IyKCB1LCB2ICk7XG5cblx0XHRcdFx0XHRcdFx0XHRpZiAoIGogIT09IDIgKSBnZW9tZXRyeS5mYWNlVmVydGV4VXZzWyBpIF1bIGZpIF0ucHVzaCggdXYgKTtcblx0XHRcdFx0XHRcdFx0XHRpZiAoIGogIT09IDAgKSBnZW9tZXRyeS5mYWNlVmVydGV4VXZzWyBpIF1bIGZpICsgMSBdLnB1c2goIHV2ICk7XG5cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoIGhhc0ZhY2VOb3JtYWwgKSB7XG5cblx0XHRcdFx0XHRcdG5vcm1hbEluZGV4ID0gZmFjZXNbIG9mZnNldCArKyBdICogMztcblxuXHRcdFx0XHRcdFx0ZmFjZUEubm9ybWFsLnNldChcblx0XHRcdFx0XHRcdFx0bm9ybWFsc1sgbm9ybWFsSW5kZXggKysgXSxcblx0XHRcdFx0XHRcdFx0bm9ybWFsc1sgbm9ybWFsSW5kZXggKysgXSxcblx0XHRcdFx0XHRcdFx0bm9ybWFsc1sgbm9ybWFsSW5kZXggXVxuXHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0ZmFjZUIubm9ybWFsLmNvcHkoIGZhY2VBLm5vcm1hbCApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKCBoYXNGYWNlVmVydGV4Tm9ybWFsICkge1xuXG5cdFx0XHRcdFx0XHRmb3IgKCBpID0gMDsgaSA8IDQ7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdFx0bm9ybWFsSW5kZXggPSBmYWNlc1sgb2Zmc2V0ICsrIF0gKiAzO1xuXG5cdFx0XHRcdFx0XHRcdG5vcm1hbCA9IG5ldyBWZWN0b3IzKFxuXHRcdFx0XHRcdFx0XHRcdG5vcm1hbHNbIG5vcm1hbEluZGV4ICsrIF0sXG5cdFx0XHRcdFx0XHRcdFx0bm9ybWFsc1sgbm9ybWFsSW5kZXggKysgXSxcblx0XHRcdFx0XHRcdFx0XHRub3JtYWxzWyBub3JtYWxJbmRleCBdXG5cdFx0XHRcdFx0XHRcdCk7XG5cblxuXHRcdFx0XHRcdFx0XHRpZiAoIGkgIT09IDIgKSBmYWNlQS52ZXJ0ZXhOb3JtYWxzLnB1c2goIG5vcm1hbCApO1xuXHRcdFx0XHRcdFx0XHRpZiAoIGkgIT09IDAgKSBmYWNlQi52ZXJ0ZXhOb3JtYWxzLnB1c2goIG5vcm1hbCApO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9XG5cblxuXHRcdFx0XHRcdGlmICggaGFzRmFjZUNvbG9yICkge1xuXG5cdFx0XHRcdFx0XHRjb2xvckluZGV4ID0gZmFjZXNbIG9mZnNldCArKyBdO1xuXHRcdFx0XHRcdFx0aGV4ID0gY29sb3JzWyBjb2xvckluZGV4IF07XG5cblx0XHRcdFx0XHRcdGZhY2VBLmNvbG9yLnNldEhleCggaGV4ICk7XG5cdFx0XHRcdFx0XHRmYWNlQi5jb2xvci5zZXRIZXgoIGhleCApO1xuXG5cdFx0XHRcdFx0fVxuXG5cblx0XHRcdFx0XHRpZiAoIGhhc0ZhY2VWZXJ0ZXhDb2xvciApIHtcblxuXHRcdFx0XHRcdFx0Zm9yICggaSA9IDA7IGkgPCA0OyBpICsrICkge1xuXG5cdFx0XHRcdFx0XHRcdGNvbG9ySW5kZXggPSBmYWNlc1sgb2Zmc2V0ICsrIF07XG5cdFx0XHRcdFx0XHRcdGhleCA9IGNvbG9yc1sgY29sb3JJbmRleCBdO1xuXG5cdFx0XHRcdFx0XHRcdGlmICggaSAhPT0gMiApIGZhY2VBLnZlcnRleENvbG9ycy5wdXNoKCBuZXcgQ29sb3IoIGhleCApICk7XG5cdFx0XHRcdFx0XHRcdGlmICggaSAhPT0gMCApIGZhY2VCLnZlcnRleENvbG9ycy5wdXNoKCBuZXcgQ29sb3IoIGhleCApICk7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGdlb21ldHJ5LmZhY2VzLnB1c2goIGZhY2VBICk7XG5cdFx0XHRcdFx0Z2VvbWV0cnkuZmFjZXMucHVzaCggZmFjZUIgKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0ZmFjZSA9IG5ldyBGYWNlMygpO1xuXHRcdFx0XHRcdGZhY2UuYSA9IGZhY2VzWyBvZmZzZXQgKysgXTtcblx0XHRcdFx0XHRmYWNlLmIgPSBmYWNlc1sgb2Zmc2V0ICsrIF07XG5cdFx0XHRcdFx0ZmFjZS5jID0gZmFjZXNbIG9mZnNldCArKyBdO1xuXG5cdFx0XHRcdFx0aWYgKCBoYXNNYXRlcmlhbCApIHtcblxuXHRcdFx0XHRcdFx0bWF0ZXJpYWxJbmRleCA9IGZhY2VzWyBvZmZzZXQgKysgXTtcblx0XHRcdFx0XHRcdGZhY2UubWF0ZXJpYWxJbmRleCA9IG1hdGVyaWFsSW5kZXg7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyB0byBnZXQgZmFjZSA8PT4gdXYgaW5kZXggY29ycmVzcG9uZGVuY2VcblxuXHRcdFx0XHRcdGZpID0gZ2VvbWV0cnkuZmFjZXMubGVuZ3RoO1xuXG5cdFx0XHRcdFx0aWYgKCBoYXNGYWNlVmVydGV4VXYgKSB7XG5cblx0XHRcdFx0XHRcdGZvciAoIGkgPSAwOyBpIDwgblV2TGF5ZXJzOyBpICsrICkge1xuXG5cdFx0XHRcdFx0XHRcdHV2TGF5ZXIgPSBqc29uLnV2c1sgaSBdO1xuXG5cdFx0XHRcdFx0XHRcdGdlb21ldHJ5LmZhY2VWZXJ0ZXhVdnNbIGkgXVsgZmkgXSA9IFtdO1xuXG5cdFx0XHRcdFx0XHRcdGZvciAoIGogPSAwOyBqIDwgMzsgaiArKyApIHtcblxuXHRcdFx0XHRcdFx0XHRcdHV2SW5kZXggPSBmYWNlc1sgb2Zmc2V0ICsrIF07XG5cblx0XHRcdFx0XHRcdFx0XHR1ID0gdXZMYXllclsgdXZJbmRleCAqIDIgXTtcblx0XHRcdFx0XHRcdFx0XHR2ID0gdXZMYXllclsgdXZJbmRleCAqIDIgKyAxIF07XG5cblx0XHRcdFx0XHRcdFx0XHR1diA9IG5ldyBWZWN0b3IyKCB1LCB2ICk7XG5cblx0XHRcdFx0XHRcdFx0XHRnZW9tZXRyeS5mYWNlVmVydGV4VXZzWyBpIF1bIGZpIF0ucHVzaCggdXYgKTtcblxuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmICggaGFzRmFjZU5vcm1hbCApIHtcblxuXHRcdFx0XHRcdFx0bm9ybWFsSW5kZXggPSBmYWNlc1sgb2Zmc2V0ICsrIF0gKiAzO1xuXG5cdFx0XHRcdFx0XHRmYWNlLm5vcm1hbC5zZXQoXG5cdFx0XHRcdFx0XHRcdG5vcm1hbHNbIG5vcm1hbEluZGV4ICsrIF0sXG5cdFx0XHRcdFx0XHRcdG5vcm1hbHNbIG5vcm1hbEluZGV4ICsrIF0sXG5cdFx0XHRcdFx0XHRcdG5vcm1hbHNbIG5vcm1hbEluZGV4IF1cblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoIGhhc0ZhY2VWZXJ0ZXhOb3JtYWwgKSB7XG5cblx0XHRcdFx0XHRcdGZvciAoIGkgPSAwOyBpIDwgMzsgaSArKyApIHtcblxuXHRcdFx0XHRcdFx0XHRub3JtYWxJbmRleCA9IGZhY2VzWyBvZmZzZXQgKysgXSAqIDM7XG5cblx0XHRcdFx0XHRcdFx0bm9ybWFsID0gbmV3IFZlY3RvcjMoXG5cdFx0XHRcdFx0XHRcdFx0bm9ybWFsc1sgbm9ybWFsSW5kZXggKysgXSxcblx0XHRcdFx0XHRcdFx0XHRub3JtYWxzWyBub3JtYWxJbmRleCArKyBdLFxuXHRcdFx0XHRcdFx0XHRcdG5vcm1hbHNbIG5vcm1hbEluZGV4IF1cblx0XHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0XHRmYWNlLnZlcnRleE5vcm1hbHMucHVzaCggbm9ybWFsICk7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblxuXG5cdFx0XHRcdFx0aWYgKCBoYXNGYWNlQ29sb3IgKSB7XG5cblx0XHRcdFx0XHRcdGNvbG9ySW5kZXggPSBmYWNlc1sgb2Zmc2V0ICsrIF07XG5cdFx0XHRcdFx0XHRmYWNlLmNvbG9yLnNldEhleCggY29sb3JzWyBjb2xvckluZGV4IF0gKTtcblxuXHRcdFx0XHRcdH1cblxuXG5cdFx0XHRcdFx0aWYgKCBoYXNGYWNlVmVydGV4Q29sb3IgKSB7XG5cblx0XHRcdFx0XHRcdGZvciAoIGkgPSAwOyBpIDwgMzsgaSArKyApIHtcblxuXHRcdFx0XHRcdFx0XHRjb2xvckluZGV4ID0gZmFjZXNbIG9mZnNldCArKyBdO1xuXHRcdFx0XHRcdFx0XHRmYWNlLnZlcnRleENvbG9ycy5wdXNoKCBuZXcgQ29sb3IoIGNvbG9yc1sgY29sb3JJbmRleCBdICkgKTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Z2VvbWV0cnkuZmFjZXMucHVzaCggZmFjZSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gcGFyc2VTa2luKCBqc29uLCBnZW9tZXRyeSApIHtcblxuXHRcdFx0dmFyIGluZmx1ZW5jZXNQZXJWZXJ0ZXggPSAoIGpzb24uaW5mbHVlbmNlc1BlclZlcnRleCAhPT0gdW5kZWZpbmVkICkgPyBqc29uLmluZmx1ZW5jZXNQZXJWZXJ0ZXggOiAyO1xuXG5cdFx0XHRpZiAoIGpzb24uc2tpbldlaWdodHMgKSB7XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0ganNvbi5za2luV2VpZ2h0cy5sZW5ndGg7IGkgPCBsOyBpICs9IGluZmx1ZW5jZXNQZXJWZXJ0ZXggKSB7XG5cblx0XHRcdFx0XHR2YXIgeCA9IGpzb24uc2tpbldlaWdodHNbIGkgXTtcblx0XHRcdFx0XHR2YXIgeSA9ICggaW5mbHVlbmNlc1BlclZlcnRleCA+IDEgKSA/IGpzb24uc2tpbldlaWdodHNbIGkgKyAxIF0gOiAwO1xuXHRcdFx0XHRcdHZhciB6ID0gKCBpbmZsdWVuY2VzUGVyVmVydGV4ID4gMiApID8ganNvbi5za2luV2VpZ2h0c1sgaSArIDIgXSA6IDA7XG5cdFx0XHRcdFx0dmFyIHcgPSAoIGluZmx1ZW5jZXNQZXJWZXJ0ZXggPiAzICkgPyBqc29uLnNraW5XZWlnaHRzWyBpICsgMyBdIDogMDtcblxuXHRcdFx0XHRcdGdlb21ldHJ5LnNraW5XZWlnaHRzLnB1c2goIG5ldyBWZWN0b3I0KCB4LCB5LCB6LCB3ICkgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBqc29uLnNraW5JbmRpY2VzICkge1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGpzb24uc2tpbkluZGljZXMubGVuZ3RoOyBpIDwgbDsgaSArPSBpbmZsdWVuY2VzUGVyVmVydGV4ICkge1xuXG5cdFx0XHRcdFx0dmFyIGEgPSBqc29uLnNraW5JbmRpY2VzWyBpIF07XG5cdFx0XHRcdFx0dmFyIGIgPSAoIGluZmx1ZW5jZXNQZXJWZXJ0ZXggPiAxICkgPyBqc29uLnNraW5JbmRpY2VzWyBpICsgMSBdIDogMDtcblx0XHRcdFx0XHR2YXIgYyA9ICggaW5mbHVlbmNlc1BlclZlcnRleCA+IDIgKSA/IGpzb24uc2tpbkluZGljZXNbIGkgKyAyIF0gOiAwO1xuXHRcdFx0XHRcdHZhciBkID0gKCBpbmZsdWVuY2VzUGVyVmVydGV4ID4gMyApID8ganNvbi5za2luSW5kaWNlc1sgaSArIDMgXSA6IDA7XG5cblx0XHRcdFx0XHRnZW9tZXRyeS5za2luSW5kaWNlcy5wdXNoKCBuZXcgVmVjdG9yNCggYSwgYiwgYywgZCApICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdGdlb21ldHJ5LmJvbmVzID0ganNvbi5ib25lcztcblxuXHRcdFx0aWYgKCBnZW9tZXRyeS5ib25lcyAmJiBnZW9tZXRyeS5ib25lcy5sZW5ndGggPiAwICYmICggZ2VvbWV0cnkuc2tpbldlaWdodHMubGVuZ3RoICE9PSBnZW9tZXRyeS5za2luSW5kaWNlcy5sZW5ndGggfHwgZ2VvbWV0cnkuc2tpbkluZGljZXMubGVuZ3RoICE9PSBnZW9tZXRyeS52ZXJ0aWNlcy5sZW5ndGggKSApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdXaGVuIHNraW5uaW5nLCBudW1iZXIgb2YgdmVydGljZXMgKCcgKyBnZW9tZXRyeS52ZXJ0aWNlcy5sZW5ndGggKyAnKSwgc2tpbkluZGljZXMgKCcgK1xuXHRcdFx0XHRcdGdlb21ldHJ5LnNraW5JbmRpY2VzLmxlbmd0aCArICcpLCBhbmQgc2tpbldlaWdodHMgKCcgKyBnZW9tZXRyeS5za2luV2VpZ2h0cy5sZW5ndGggKyAnKSBzaG91bGQgbWF0Y2guJyApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBwYXJzZU1vcnBoaW5nKCBqc29uLCBnZW9tZXRyeSApIHtcblxuXHRcdFx0dmFyIHNjYWxlID0ganNvbi5zY2FsZTtcblxuXHRcdFx0aWYgKCBqc29uLm1vcnBoVGFyZ2V0cyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGpzb24ubW9ycGhUYXJnZXRzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRnZW9tZXRyeS5tb3JwaFRhcmdldHNbIGkgXSA9IHt9O1xuXHRcdFx0XHRcdGdlb21ldHJ5Lm1vcnBoVGFyZ2V0c1sgaSBdLm5hbWUgPSBqc29uLm1vcnBoVGFyZ2V0c1sgaSBdLm5hbWU7XG5cdFx0XHRcdFx0Z2VvbWV0cnkubW9ycGhUYXJnZXRzWyBpIF0udmVydGljZXMgPSBbXTtcblxuXHRcdFx0XHRcdHZhciBkc3RWZXJ0aWNlcyA9IGdlb21ldHJ5Lm1vcnBoVGFyZ2V0c1sgaSBdLnZlcnRpY2VzO1xuXHRcdFx0XHRcdHZhciBzcmNWZXJ0aWNlcyA9IGpzb24ubW9ycGhUYXJnZXRzWyBpIF0udmVydGljZXM7XG5cblx0XHRcdFx0XHRmb3IgKCB2YXIgdiA9IDAsIHZsID0gc3JjVmVydGljZXMubGVuZ3RoOyB2IDwgdmw7IHYgKz0gMyApIHtcblxuXHRcdFx0XHRcdFx0dmFyIHZlcnRleCA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0XHRcdFx0XHR2ZXJ0ZXgueCA9IHNyY1ZlcnRpY2VzWyB2IF0gKiBzY2FsZTtcblx0XHRcdFx0XHRcdHZlcnRleC55ID0gc3JjVmVydGljZXNbIHYgKyAxIF0gKiBzY2FsZTtcblx0XHRcdFx0XHRcdHZlcnRleC56ID0gc3JjVmVydGljZXNbIHYgKyAyIF0gKiBzY2FsZTtcblxuXHRcdFx0XHRcdFx0ZHN0VmVydGljZXMucHVzaCggdmVydGV4ICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdGlmICgganNvbi5tb3JwaENvbG9ycyAhPT0gdW5kZWZpbmVkICYmIGpzb24ubW9ycGhDb2xvcnMubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5KU09OTG9hZGVyOiBcIm1vcnBoQ29sb3JzXCIgbm8gbG9uZ2VyIHN1cHBvcnRlZC4gVXNpbmcgdGhlbSBhcyBmYWNlIGNvbG9ycy4nICk7XG5cblx0XHRcdFx0dmFyIGZhY2VzID0gZ2VvbWV0cnkuZmFjZXM7XG5cdFx0XHRcdHZhciBtb3JwaENvbG9ycyA9IGpzb24ubW9ycGhDb2xvcnNbIDAgXS5jb2xvcnM7XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gZmFjZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdGZhY2VzWyBpIF0uY29sb3IuZnJvbUFycmF5KCBtb3JwaENvbG9ycywgaSAqIDMgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIHBhcnNlQW5pbWF0aW9ucygganNvbiwgZ2VvbWV0cnkgKSB7XG5cblx0XHRcdHZhciBvdXRwdXRBbmltYXRpb25zID0gW107XG5cblx0XHRcdC8vIHBhcnNlIG9sZCBzdHlsZSBCb25lL0hpZXJhcmNoeSBhbmltYXRpb25zXG5cdFx0XHR2YXIgYW5pbWF0aW9ucyA9IFtdO1xuXG5cdFx0XHRpZiAoIGpzb24uYW5pbWF0aW9uICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0YW5pbWF0aW9ucy5wdXNoKCBqc29uLmFuaW1hdGlvbiApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICgganNvbi5hbmltYXRpb25zICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0aWYgKCBqc29uLmFuaW1hdGlvbnMubGVuZ3RoICkge1xuXG5cdFx0XHRcdFx0YW5pbWF0aW9ucyA9IGFuaW1hdGlvbnMuY29uY2F0KCBqc29uLmFuaW1hdGlvbnMgKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0YW5pbWF0aW9ucy5wdXNoKCBqc29uLmFuaW1hdGlvbnMgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgYW5pbWF0aW9ucy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdFx0dmFyIGNsaXAgPSBBbmltYXRpb25DbGlwLnBhcnNlQW5pbWF0aW9uKCBhbmltYXRpb25zWyBpIF0sIGdlb21ldHJ5LmJvbmVzICk7XG5cdFx0XHRcdGlmICggY2xpcCApIG91dHB1dEFuaW1hdGlvbnMucHVzaCggY2xpcCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIHBhcnNlIGltcGxpY2l0IG1vcnBoIGFuaW1hdGlvbnNcblx0XHRcdGlmICggZ2VvbWV0cnkubW9ycGhUYXJnZXRzICkge1xuXG5cdFx0XHRcdC8vIFRPRE86IEZpZ3VyZSBvdXQgd2hhdCBhbiBhcHByb3ByYWl0ZSBGUFMgaXMgZm9yIG1vcnBoIHRhcmdldCBhbmltYXRpb25zIC0tIGRlZmF1bHRpbmcgdG8gMTAsIGJ1dCByZWFsbHkgaXQgaXMgY29tcGxldGVseSBhcmJpdHJhcnkuXG5cdFx0XHRcdHZhciBtb3JwaEFuaW1hdGlvbkNsaXBzID0gQW5pbWF0aW9uQ2xpcC5DcmVhdGVDbGlwc0Zyb21Nb3JwaFRhcmdldFNlcXVlbmNlcyggZ2VvbWV0cnkubW9ycGhUYXJnZXRzLCAxMCApO1xuXHRcdFx0XHRvdXRwdXRBbmltYXRpb25zID0gb3V0cHV0QW5pbWF0aW9ucy5jb25jYXQoIG1vcnBoQW5pbWF0aW9uQ2xpcHMgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIG91dHB1dEFuaW1hdGlvbnMubGVuZ3RoID4gMCApIGdlb21ldHJ5LmFuaW1hdGlvbnMgPSBvdXRwdXRBbmltYXRpb25zO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHBhcnNlKCBqc29uLCB0ZXh0dXJlUGF0aCApIHtcblxuXHRcdFx0aWYgKCBqc29uLmRhdGEgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHQvLyBHZW9tZXRyeSA0LjAgc3BlY1xuXHRcdFx0XHRqc29uID0ganNvbi5kYXRhO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICgganNvbi5zY2FsZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGpzb24uc2NhbGUgPSAxLjAgLyBqc29uLnNjYWxlO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGpzb24uc2NhbGUgPSAxLjA7XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIGdlb21ldHJ5ID0gbmV3IEdlb21ldHJ5KCk7XG5cblx0XHRcdHBhcnNlTW9kZWwoIGpzb24sIGdlb21ldHJ5ICk7XG5cdFx0XHRwYXJzZVNraW4oIGpzb24sIGdlb21ldHJ5ICk7XG5cdFx0XHRwYXJzZU1vcnBoaW5nKCBqc29uLCBnZW9tZXRyeSApO1xuXHRcdFx0cGFyc2VBbmltYXRpb25zKCBqc29uLCBnZW9tZXRyeSApO1xuXG5cdFx0XHRnZW9tZXRyeS5jb21wdXRlRmFjZU5vcm1hbHMoKTtcblx0XHRcdGdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO1xuXG5cdFx0XHRpZiAoIGpzb24ubWF0ZXJpYWxzID09PSB1bmRlZmluZWQgfHwganNvbi5tYXRlcmlhbHMubGVuZ3RoID09PSAwICkge1xuXG5cdFx0XHRcdHJldHVybiB7IGdlb21ldHJ5OiBnZW9tZXRyeSB9O1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHZhciBtYXRlcmlhbHMgPSBMb2FkZXIucHJvdG90eXBlLmluaXRNYXRlcmlhbHMoIGpzb24ubWF0ZXJpYWxzLCB0ZXh0dXJlUGF0aCwgdGhpcy5jcm9zc09yaWdpbiApO1xuXG5cdFx0XHRcdHJldHVybiB7IGdlb21ldHJ5OiBnZW9tZXRyeSwgbWF0ZXJpYWxzOiBtYXRlcmlhbHMgfTtcblxuXHRcdFx0fVxuXG5cdFx0fTtcblxuXHR9ICkoKVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBPYmplY3RMb2FkZXIoIG1hbmFnZXIgKSB7XG5cblx0dGhpcy5tYW5hZ2VyID0gKCBtYW5hZ2VyICE9PSB1bmRlZmluZWQgKSA/IG1hbmFnZXIgOiBEZWZhdWx0TG9hZGluZ01hbmFnZXI7XG5cdHRoaXMudGV4dHVyZVBhdGggPSAnJztcblxufVxuXG5PYmplY3QuYXNzaWduKCBPYmplY3RMb2FkZXIucHJvdG90eXBlLCB7XG5cblx0bG9hZDogZnVuY3Rpb24gKCB1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciApIHtcblxuXHRcdGlmICggdGhpcy50ZXh0dXJlUGF0aCA9PT0gJycgKSB7XG5cblx0XHRcdHRoaXMudGV4dHVyZVBhdGggPSB1cmwuc3Vic3RyaW5nKCAwLCB1cmwubGFzdEluZGV4T2YoICcvJyApICsgMSApO1xuXG5cdFx0fVxuXG5cdFx0dmFyIHNjb3BlID0gdGhpcztcblxuXHRcdHZhciBsb2FkZXIgPSBuZXcgRmlsZUxvYWRlciggc2NvcGUubWFuYWdlciApO1xuXHRcdGxvYWRlci5sb2FkKCB1cmwsIGZ1bmN0aW9uICggdGV4dCApIHtcblxuXHRcdFx0dmFyIGpzb24gPSBudWxsO1xuXG5cdFx0XHR0cnkge1xuXG5cdFx0XHRcdGpzb24gPSBKU09OLnBhcnNlKCB0ZXh0ICk7XG5cblx0XHRcdH0gY2F0Y2ggKCBlcnJvciApIHtcblxuXHRcdFx0XHRpZiAoIG9uRXJyb3IgIT09IHVuZGVmaW5lZCApIG9uRXJyb3IoIGVycm9yICk7XG5cblx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFOk9iamVjdExvYWRlcjogQ2FuXFwndCBwYXJzZSAnICsgdXJsICsgJy4nLCBlcnJvci5tZXNzYWdlICk7XG5cblx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHR9XG5cblx0XHRcdHZhciBtZXRhZGF0YSA9IGpzb24ubWV0YWRhdGE7XG5cblx0XHRcdGlmICggbWV0YWRhdGEgPT09IHVuZGVmaW5lZCB8fCBtZXRhZGF0YS50eXBlID09PSB1bmRlZmluZWQgfHwgbWV0YWRhdGEudHlwZS50b0xvd2VyQ2FzZSgpID09PSAnZ2VvbWV0cnknICkge1xuXG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5PYmplY3RMb2FkZXI6IENhblxcJ3QgbG9hZCAnICsgdXJsICsgJy4gVXNlIFRIUkVFLkpTT05Mb2FkZXIgaW5zdGVhZC4nICk7XG5cdFx0XHRcdHJldHVybjtcblxuXHRcdFx0fVxuXG5cdFx0XHRzY29wZS5wYXJzZSgganNvbiwgb25Mb2FkICk7XG5cblx0XHR9LCBvblByb2dyZXNzLCBvbkVycm9yICk7XG5cblx0fSxcblxuXHRzZXRUZXh0dXJlUGF0aDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMudGV4dHVyZVBhdGggPSB2YWx1ZTtcblxuXHR9LFxuXG5cdHNldENyb3NzT3JpZ2luOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5jcm9zc09yaWdpbiA9IHZhbHVlO1xuXG5cdH0sXG5cblx0cGFyc2U6IGZ1bmN0aW9uICgganNvbiwgb25Mb2FkICkge1xuXG5cdFx0dmFyIHNoYXBlcyA9IHRoaXMucGFyc2VTaGFwZSgganNvbi5zaGFwZXMgKTtcblx0XHR2YXIgZ2VvbWV0cmllcyA9IHRoaXMucGFyc2VHZW9tZXRyaWVzKCBqc29uLmdlb21ldHJpZXMsIHNoYXBlcyApO1xuXG5cdFx0dmFyIGltYWdlcyA9IHRoaXMucGFyc2VJbWFnZXMoIGpzb24uaW1hZ2VzLCBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGlmICggb25Mb2FkICE9PSB1bmRlZmluZWQgKSBvbkxvYWQoIG9iamVjdCApO1xuXG5cdFx0fSApO1xuXG5cdFx0dmFyIHRleHR1cmVzID0gdGhpcy5wYXJzZVRleHR1cmVzKCBqc29uLnRleHR1cmVzLCBpbWFnZXMgKTtcblx0XHR2YXIgbWF0ZXJpYWxzID0gdGhpcy5wYXJzZU1hdGVyaWFscygganNvbi5tYXRlcmlhbHMsIHRleHR1cmVzICk7XG5cblx0XHR2YXIgb2JqZWN0ID0gdGhpcy5wYXJzZU9iamVjdCgganNvbi5vYmplY3QsIGdlb21ldHJpZXMsIG1hdGVyaWFscyApO1xuXG5cdFx0aWYgKCBqc29uLmFuaW1hdGlvbnMgKSB7XG5cblx0XHRcdG9iamVjdC5hbmltYXRpb25zID0gdGhpcy5wYXJzZUFuaW1hdGlvbnMoIGpzb24uYW5pbWF0aW9ucyApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBqc29uLmltYWdlcyA9PT0gdW5kZWZpbmVkIHx8IGpzb24uaW1hZ2VzLmxlbmd0aCA9PT0gMCApIHtcblxuXHRcdFx0aWYgKCBvbkxvYWQgIT09IHVuZGVmaW5lZCApIG9uTG9hZCggb2JqZWN0ICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gb2JqZWN0O1xuXG5cdH0sXG5cblx0cGFyc2VTaGFwZTogZnVuY3Rpb24gKCBqc29uICkge1xuXG5cdFx0dmFyIHNoYXBlcyA9IHt9O1xuXG5cdFx0aWYgKCBqc29uICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGpzb24ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHR2YXIgc2hhcGUgPSBuZXcgU2hhcGUoKS5mcm9tSlNPTigganNvblsgaSBdICk7XG5cblx0XHRcdFx0c2hhcGVzWyBzaGFwZS51dWlkIF0gPSBzaGFwZTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHNoYXBlcztcblxuXHR9LFxuXG5cdHBhcnNlR2VvbWV0cmllczogZnVuY3Rpb24gKCBqc29uLCBzaGFwZXMgKSB7XG5cblx0XHR2YXIgZ2VvbWV0cmllcyA9IHt9O1xuXG5cdFx0aWYgKCBqc29uICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHZhciBnZW9tZXRyeUxvYWRlciA9IG5ldyBKU09OTG9hZGVyKCk7XG5cdFx0XHR2YXIgYnVmZmVyR2VvbWV0cnlMb2FkZXIgPSBuZXcgQnVmZmVyR2VvbWV0cnlMb2FkZXIoKTtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0ganNvbi5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdHZhciBnZW9tZXRyeTtcblx0XHRcdFx0dmFyIGRhdGEgPSBqc29uWyBpIF07XG5cblx0XHRcdFx0c3dpdGNoICggZGF0YS50eXBlICkge1xuXG5cdFx0XHRcdFx0Y2FzZSAnUGxhbmVHZW9tZXRyeSc6XG5cdFx0XHRcdFx0Y2FzZSAnUGxhbmVCdWZmZXJHZW9tZXRyeSc6XG5cblx0XHRcdFx0XHRcdGdlb21ldHJ5ID0gbmV3IEdlb21ldHJpZXNbIGRhdGEudHlwZSBdKFxuXHRcdFx0XHRcdFx0XHRkYXRhLndpZHRoLFxuXHRcdFx0XHRcdFx0XHRkYXRhLmhlaWdodCxcblx0XHRcdFx0XHRcdFx0ZGF0YS53aWR0aFNlZ21lbnRzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLmhlaWdodFNlZ21lbnRzXG5cdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgJ0JveEdlb21ldHJ5Jzpcblx0XHRcdFx0XHRjYXNlICdCb3hCdWZmZXJHZW9tZXRyeSc6XG5cdFx0XHRcdFx0Y2FzZSAnQ3ViZUdlb21ldHJ5JzogLy8gYmFja3dhcmRzIGNvbXBhdGlibGVcblxuXHRcdFx0XHRcdFx0Z2VvbWV0cnkgPSBuZXcgR2VvbWV0cmllc1sgZGF0YS50eXBlIF0oXG5cdFx0XHRcdFx0XHRcdGRhdGEud2lkdGgsXG5cdFx0XHRcdFx0XHRcdGRhdGEuaGVpZ2h0LFxuXHRcdFx0XHRcdFx0XHRkYXRhLmRlcHRoLFxuXHRcdFx0XHRcdFx0XHRkYXRhLndpZHRoU2VnbWVudHMsXG5cdFx0XHRcdFx0XHRcdGRhdGEuaGVpZ2h0U2VnbWVudHMsXG5cdFx0XHRcdFx0XHRcdGRhdGEuZGVwdGhTZWdtZW50c1xuXHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlICdDaXJjbGVHZW9tZXRyeSc6XG5cdFx0XHRcdFx0Y2FzZSAnQ2lyY2xlQnVmZmVyR2VvbWV0cnknOlxuXG5cdFx0XHRcdFx0XHRnZW9tZXRyeSA9IG5ldyBHZW9tZXRyaWVzWyBkYXRhLnR5cGUgXShcblx0XHRcdFx0XHRcdFx0ZGF0YS5yYWRpdXMsXG5cdFx0XHRcdFx0XHRcdGRhdGEuc2VnbWVudHMsXG5cdFx0XHRcdFx0XHRcdGRhdGEudGhldGFTdGFydCxcblx0XHRcdFx0XHRcdFx0ZGF0YS50aGV0YUxlbmd0aFxuXHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlICdDeWxpbmRlckdlb21ldHJ5Jzpcblx0XHRcdFx0XHRjYXNlICdDeWxpbmRlckJ1ZmZlckdlb21ldHJ5JzpcblxuXHRcdFx0XHRcdFx0Z2VvbWV0cnkgPSBuZXcgR2VvbWV0cmllc1sgZGF0YS50eXBlIF0oXG5cdFx0XHRcdFx0XHRcdGRhdGEucmFkaXVzVG9wLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnJhZGl1c0JvdHRvbSxcblx0XHRcdFx0XHRcdFx0ZGF0YS5oZWlnaHQsXG5cdFx0XHRcdFx0XHRcdGRhdGEucmFkaWFsU2VnbWVudHMsXG5cdFx0XHRcdFx0XHRcdGRhdGEuaGVpZ2h0U2VnbWVudHMsXG5cdFx0XHRcdFx0XHRcdGRhdGEub3BlbkVuZGVkLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnRoZXRhU3RhcnQsXG5cdFx0XHRcdFx0XHRcdGRhdGEudGhldGFMZW5ndGhcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSAnQ29uZUdlb21ldHJ5Jzpcblx0XHRcdFx0XHRjYXNlICdDb25lQnVmZmVyR2VvbWV0cnknOlxuXG5cdFx0XHRcdFx0XHRnZW9tZXRyeSA9IG5ldyBHZW9tZXRyaWVzWyBkYXRhLnR5cGUgXShcblx0XHRcdFx0XHRcdFx0ZGF0YS5yYWRpdXMsXG5cdFx0XHRcdFx0XHRcdGRhdGEuaGVpZ2h0LFxuXHRcdFx0XHRcdFx0XHRkYXRhLnJhZGlhbFNlZ21lbnRzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLmhlaWdodFNlZ21lbnRzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLm9wZW5FbmRlZCxcblx0XHRcdFx0XHRcdFx0ZGF0YS50aGV0YVN0YXJ0LFxuXHRcdFx0XHRcdFx0XHRkYXRhLnRoZXRhTGVuZ3RoXG5cdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgJ1NwaGVyZUdlb21ldHJ5Jzpcblx0XHRcdFx0XHRjYXNlICdTcGhlcmVCdWZmZXJHZW9tZXRyeSc6XG5cblx0XHRcdFx0XHRcdGdlb21ldHJ5ID0gbmV3IEdlb21ldHJpZXNbIGRhdGEudHlwZSBdKFxuXHRcdFx0XHRcdFx0XHRkYXRhLnJhZGl1cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS53aWR0aFNlZ21lbnRzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLmhlaWdodFNlZ21lbnRzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnBoaVN0YXJ0LFxuXHRcdFx0XHRcdFx0XHRkYXRhLnBoaUxlbmd0aCxcblx0XHRcdFx0XHRcdFx0ZGF0YS50aGV0YVN0YXJ0LFxuXHRcdFx0XHRcdFx0XHRkYXRhLnRoZXRhTGVuZ3RoXG5cdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgJ0RvZGVjYWhlZHJvbkdlb21ldHJ5Jzpcblx0XHRcdFx0XHRjYXNlICdEb2RlY2FoZWRyb25CdWZmZXJHZW9tZXRyeSc6XG5cdFx0XHRcdFx0Y2FzZSAnSWNvc2FoZWRyb25HZW9tZXRyeSc6XG5cdFx0XHRcdFx0Y2FzZSAnSWNvc2FoZWRyb25CdWZmZXJHZW9tZXRyeSc6XG5cdFx0XHRcdFx0Y2FzZSAnT2N0YWhlZHJvbkdlb21ldHJ5Jzpcblx0XHRcdFx0XHRjYXNlICdPY3RhaGVkcm9uQnVmZmVyR2VvbWV0cnknOlxuXHRcdFx0XHRcdGNhc2UgJ1RldHJhaGVkcm9uR2VvbWV0cnknOlxuXHRcdFx0XHRcdGNhc2UgJ1RldHJhaGVkcm9uQnVmZmVyR2VvbWV0cnknOlxuXG5cdFx0XHRcdFx0XHRnZW9tZXRyeSA9IG5ldyBHZW9tZXRyaWVzWyBkYXRhLnR5cGUgXShcblx0XHRcdFx0XHRcdFx0ZGF0YS5yYWRpdXMsXG5cdFx0XHRcdFx0XHRcdGRhdGEuZGV0YWlsXG5cdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgJ1JpbmdHZW9tZXRyeSc6XG5cdFx0XHRcdFx0Y2FzZSAnUmluZ0J1ZmZlckdlb21ldHJ5JzpcblxuXHRcdFx0XHRcdFx0Z2VvbWV0cnkgPSBuZXcgR2VvbWV0cmllc1sgZGF0YS50eXBlIF0oXG5cdFx0XHRcdFx0XHRcdGRhdGEuaW5uZXJSYWRpdXMsXG5cdFx0XHRcdFx0XHRcdGRhdGEub3V0ZXJSYWRpdXMsXG5cdFx0XHRcdFx0XHRcdGRhdGEudGhldGFTZWdtZW50cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5waGlTZWdtZW50cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS50aGV0YVN0YXJ0LFxuXHRcdFx0XHRcdFx0XHRkYXRhLnRoZXRhTGVuZ3RoXG5cdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgJ1RvcnVzR2VvbWV0cnknOlxuXHRcdFx0XHRcdGNhc2UgJ1RvcnVzQnVmZmVyR2VvbWV0cnknOlxuXG5cdFx0XHRcdFx0XHRnZW9tZXRyeSA9IG5ldyBHZW9tZXRyaWVzWyBkYXRhLnR5cGUgXShcblx0XHRcdFx0XHRcdFx0ZGF0YS5yYWRpdXMsXG5cdFx0XHRcdFx0XHRcdGRhdGEudHViZSxcblx0XHRcdFx0XHRcdFx0ZGF0YS5yYWRpYWxTZWdtZW50cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS50dWJ1bGFyU2VnbWVudHMsXG5cdFx0XHRcdFx0XHRcdGRhdGEuYXJjXG5cdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgJ1RvcnVzS25vdEdlb21ldHJ5Jzpcblx0XHRcdFx0XHRjYXNlICdUb3J1c0tub3RCdWZmZXJHZW9tZXRyeSc6XG5cblx0XHRcdFx0XHRcdGdlb21ldHJ5ID0gbmV3IEdlb21ldHJpZXNbIGRhdGEudHlwZSBdKFxuXHRcdFx0XHRcdFx0XHRkYXRhLnJhZGl1cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS50dWJlLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnR1YnVsYXJTZWdtZW50cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5yYWRpYWxTZWdtZW50cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5wLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnFcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSAnTGF0aGVHZW9tZXRyeSc6XG5cdFx0XHRcdFx0Y2FzZSAnTGF0aGVCdWZmZXJHZW9tZXRyeSc6XG5cblx0XHRcdFx0XHRcdGdlb21ldHJ5ID0gbmV3IEdlb21ldHJpZXNbIGRhdGEudHlwZSBdKFxuXHRcdFx0XHRcdFx0XHRkYXRhLnBvaW50cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5zZWdtZW50cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5waGlTdGFydCxcblx0XHRcdFx0XHRcdFx0ZGF0YS5waGlMZW5ndGhcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSAnUG9seWhlZHJvbkdlb21ldHJ5Jzpcblx0XHRcdFx0XHRjYXNlICdQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnknOlxuXG5cdFx0XHRcdFx0XHRnZW9tZXRyeSA9IG5ldyBHZW9tZXRyaWVzWyBkYXRhLnR5cGUgXShcblx0XHRcdFx0XHRcdFx0ZGF0YS52ZXJ0aWNlcyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5pbmRpY2VzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnJhZGl1cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5kZXRhaWxzXG5cdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgJ1NoYXBlR2VvbWV0cnknOlxuXHRcdFx0XHRcdGNhc2UgJ1NoYXBlQnVmZmVyR2VvbWV0cnknOlxuXG5cdFx0XHRcdFx0XHR2YXIgZ2VvbWV0cnlTaGFwZXMgPSBbXTtcblxuXHRcdFx0XHRcdFx0Zm9yICggdmFyIGogPSAwLCBqbCA9IGRhdGEuc2hhcGVzLmxlbmd0aDsgaiA8IGpsOyBqICsrICkge1xuXG5cdFx0XHRcdFx0XHRcdHZhciBzaGFwZSA9IHNoYXBlc1sgZGF0YS5zaGFwZXNbIGogXSBdO1xuXG5cdFx0XHRcdFx0XHRcdGdlb21ldHJ5U2hhcGVzLnB1c2goIHNoYXBlICk7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Z2VvbWV0cnkgPSBuZXcgR2VvbWV0cmllc1sgZGF0YS50eXBlIF0oXG5cdFx0XHRcdFx0XHRcdGdlb21ldHJ5U2hhcGVzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLmN1cnZlU2VnbWVudHNcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSAnQnVmZmVyR2VvbWV0cnknOlxuXG5cdFx0XHRcdFx0XHRnZW9tZXRyeSA9IGJ1ZmZlckdlb21ldHJ5TG9hZGVyLnBhcnNlKCBkYXRhICk7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSAnR2VvbWV0cnknOlxuXG5cdFx0XHRcdFx0XHRnZW9tZXRyeSA9IGdlb21ldHJ5TG9hZGVyLnBhcnNlKCBkYXRhLCB0aGlzLnRleHR1cmVQYXRoICkuZ2VvbWV0cnk7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0ZGVmYXVsdDpcblxuXHRcdFx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0TG9hZGVyOiBVbnN1cHBvcnRlZCBnZW9tZXRyeSB0eXBlIFwiJyArIGRhdGEudHlwZSArICdcIicgKTtcblxuXHRcdFx0XHRcdFx0Y29udGludWU7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGdlb21ldHJ5LnV1aWQgPSBkYXRhLnV1aWQ7XG5cblx0XHRcdFx0aWYgKCBkYXRhLm5hbWUgIT09IHVuZGVmaW5lZCApIGdlb21ldHJ5Lm5hbWUgPSBkYXRhLm5hbWU7XG5cblx0XHRcdFx0Z2VvbWV0cmllc1sgZGF0YS51dWlkIF0gPSBnZW9tZXRyeTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGdlb21ldHJpZXM7XG5cblx0fSxcblxuXHRwYXJzZU1hdGVyaWFsczogZnVuY3Rpb24gKCBqc29uLCB0ZXh0dXJlcyApIHtcblxuXHRcdHZhciBtYXRlcmlhbHMgPSB7fTtcblxuXHRcdGlmICgganNvbiAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR2YXIgbG9hZGVyID0gbmV3IE1hdGVyaWFsTG9hZGVyKCk7XG5cdFx0XHRsb2FkZXIuc2V0VGV4dHVyZXMoIHRleHR1cmVzICk7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGpzb24ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHR2YXIgZGF0YSA9IGpzb25bIGkgXTtcblxuXHRcdFx0XHRpZiAoIGRhdGEudHlwZSA9PT0gJ011bHRpTWF0ZXJpYWwnICkge1xuXG5cdFx0XHRcdFx0Ly8gRGVwcmVjYXRlZFxuXG5cdFx0XHRcdFx0dmFyIGFycmF5ID0gW107XG5cblx0XHRcdFx0XHRmb3IgKCB2YXIgaiA9IDA7IGogPCBkYXRhLm1hdGVyaWFscy5sZW5ndGg7IGogKysgKSB7XG5cblx0XHRcdFx0XHRcdGFycmF5LnB1c2goIGxvYWRlci5wYXJzZSggZGF0YS5tYXRlcmlhbHNbIGogXSApICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRtYXRlcmlhbHNbIGRhdGEudXVpZCBdID0gYXJyYXk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdG1hdGVyaWFsc1sgZGF0YS51dWlkIF0gPSBsb2FkZXIucGFyc2UoIGRhdGEgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiBtYXRlcmlhbHM7XG5cblx0fSxcblxuXHRwYXJzZUFuaW1hdGlvbnM6IGZ1bmN0aW9uICgganNvbiApIHtcblxuXHRcdHZhciBhbmltYXRpb25zID0gW107XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBqc29uLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGNsaXAgPSBBbmltYXRpb25DbGlwLnBhcnNlKCBqc29uWyBpIF0gKTtcblxuXHRcdFx0YW5pbWF0aW9ucy5wdXNoKCBjbGlwICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gYW5pbWF0aW9ucztcblxuXHR9LFxuXG5cdHBhcnNlSW1hZ2VzOiBmdW5jdGlvbiAoIGpzb24sIG9uTG9hZCApIHtcblxuXHRcdHZhciBzY29wZSA9IHRoaXM7XG5cdFx0dmFyIGltYWdlcyA9IHt9O1xuXG5cdFx0ZnVuY3Rpb24gbG9hZEltYWdlKCB1cmwgKSB7XG5cblx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbVN0YXJ0KCB1cmwgKTtcblxuXHRcdFx0cmV0dXJuIGxvYWRlci5sb2FkKCB1cmwsIGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FbmQoIHVybCApO1xuXG5cdFx0XHR9LCB1bmRlZmluZWQsIGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FbmQoIHVybCApO1xuXHRcdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FcnJvciggdXJsICk7XG5cblx0XHRcdH0gKTtcblxuXHRcdH1cblxuXHRcdGlmICgganNvbiAhPT0gdW5kZWZpbmVkICYmIGpzb24ubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0dmFyIG1hbmFnZXIgPSBuZXcgTG9hZGluZ01hbmFnZXIoIG9uTG9hZCApO1xuXG5cdFx0XHR2YXIgbG9hZGVyID0gbmV3IEltYWdlTG9hZGVyKCBtYW5hZ2VyICk7XG5cdFx0XHRsb2FkZXIuc2V0Q3Jvc3NPcmlnaW4oIHRoaXMuY3Jvc3NPcmlnaW4gKTtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0ganNvbi5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdHZhciBpbWFnZSA9IGpzb25bIGkgXTtcblx0XHRcdFx0dmFyIHBhdGggPSAvXihcXC9cXC8pfChbYS16XSs6KFxcL1xcLyk/KS9pLnRlc3QoIGltYWdlLnVybCApID8gaW1hZ2UudXJsIDogc2NvcGUudGV4dHVyZVBhdGggKyBpbWFnZS51cmw7XG5cblx0XHRcdFx0aW1hZ2VzWyBpbWFnZS51dWlkIF0gPSBsb2FkSW1hZ2UoIHBhdGggKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGltYWdlcztcblxuXHR9LFxuXG5cdHBhcnNlVGV4dHVyZXM6IGZ1bmN0aW9uICgganNvbiwgaW1hZ2VzICkge1xuXG5cdFx0ZnVuY3Rpb24gcGFyc2VDb25zdGFudCggdmFsdWUsIHR5cGUgKSB7XG5cblx0XHRcdGlmICggdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyApIHJldHVybiB2YWx1ZTtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0TG9hZGVyLnBhcnNlVGV4dHVyZTogQ29uc3RhbnQgc2hvdWxkIGJlIGluIG51bWVyaWMgZm9ybS4nLCB2YWx1ZSApO1xuXG5cdFx0XHRyZXR1cm4gdHlwZVsgdmFsdWUgXTtcblxuXHRcdH1cblxuXHRcdHZhciB0ZXh0dXJlcyA9IHt9O1xuXG5cdFx0aWYgKCBqc29uICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGpzb24ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHR2YXIgZGF0YSA9IGpzb25bIGkgXTtcblxuXHRcdFx0XHRpZiAoIGRhdGEuaW1hZ2UgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdExvYWRlcjogTm8gXCJpbWFnZVwiIHNwZWNpZmllZCBmb3InLCBkYXRhLnV1aWQgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCBpbWFnZXNbIGRhdGEuaW1hZ2UgXSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0TG9hZGVyOiBVbmRlZmluZWQgaW1hZ2UnLCBkYXRhLmltYWdlICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHZhciB0ZXh0dXJlID0gbmV3IFRleHR1cmUoIGltYWdlc1sgZGF0YS5pbWFnZSBdICk7XG5cdFx0XHRcdHRleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHRcdHRleHR1cmUudXVpZCA9IGRhdGEudXVpZDtcblxuXHRcdFx0XHRpZiAoIGRhdGEubmFtZSAhPT0gdW5kZWZpbmVkICkgdGV4dHVyZS5uYW1lID0gZGF0YS5uYW1lO1xuXG5cdFx0XHRcdGlmICggZGF0YS5tYXBwaW5nICE9PSB1bmRlZmluZWQgKSB0ZXh0dXJlLm1hcHBpbmcgPSBwYXJzZUNvbnN0YW50KCBkYXRhLm1hcHBpbmcsIFRFWFRVUkVfTUFQUElORyApO1xuXG5cdFx0XHRcdGlmICggZGF0YS5vZmZzZXQgIT09IHVuZGVmaW5lZCApIHRleHR1cmUub2Zmc2V0LmZyb21BcnJheSggZGF0YS5vZmZzZXQgKTtcblx0XHRcdFx0aWYgKCBkYXRhLnJlcGVhdCAhPT0gdW5kZWZpbmVkICkgdGV4dHVyZS5yZXBlYXQuZnJvbUFycmF5KCBkYXRhLnJlcGVhdCApO1xuXHRcdFx0XHRpZiAoIGRhdGEuY2VudGVyICE9PSB1bmRlZmluZWQgKSB0ZXh0dXJlLmNlbnRlci5mcm9tQXJyYXkoIGRhdGEuY2VudGVyICk7XG5cdFx0XHRcdGlmICggZGF0YS5yb3RhdGlvbiAhPT0gdW5kZWZpbmVkICkgdGV4dHVyZS5yb3RhdGlvbiA9IGRhdGEucm90YXRpb247XG5cblx0XHRcdFx0aWYgKCBkYXRhLndyYXAgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdHRleHR1cmUud3JhcFMgPSBwYXJzZUNvbnN0YW50KCBkYXRhLndyYXBbIDAgXSwgVEVYVFVSRV9XUkFQUElORyApO1xuXHRcdFx0XHRcdHRleHR1cmUud3JhcFQgPSBwYXJzZUNvbnN0YW50KCBkYXRhLndyYXBbIDEgXSwgVEVYVFVSRV9XUkFQUElORyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIGRhdGEuZm9ybWF0ICE9PSB1bmRlZmluZWQgKSB0ZXh0dXJlLmZvcm1hdCA9IGRhdGEuZm9ybWF0O1xuXG5cdFx0XHRcdGlmICggZGF0YS5taW5GaWx0ZXIgIT09IHVuZGVmaW5lZCApIHRleHR1cmUubWluRmlsdGVyID0gcGFyc2VDb25zdGFudCggZGF0YS5taW5GaWx0ZXIsIFRFWFRVUkVfRklMVEVSICk7XG5cdFx0XHRcdGlmICggZGF0YS5tYWdGaWx0ZXIgIT09IHVuZGVmaW5lZCApIHRleHR1cmUubWFnRmlsdGVyID0gcGFyc2VDb25zdGFudCggZGF0YS5tYWdGaWx0ZXIsIFRFWFRVUkVfRklMVEVSICk7XG5cdFx0XHRcdGlmICggZGF0YS5hbmlzb3Ryb3B5ICE9PSB1bmRlZmluZWQgKSB0ZXh0dXJlLmFuaXNvdHJvcHkgPSBkYXRhLmFuaXNvdHJvcHk7XG5cblx0XHRcdFx0aWYgKCBkYXRhLmZsaXBZICE9PSB1bmRlZmluZWQgKSB0ZXh0dXJlLmZsaXBZID0gZGF0YS5mbGlwWTtcblxuXHRcdFx0XHR0ZXh0dXJlc1sgZGF0YS51dWlkIF0gPSB0ZXh0dXJlO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGV4dHVyZXM7XG5cblx0fSxcblxuXHRwYXJzZU9iamVjdDogZnVuY3Rpb24gKCBkYXRhLCBnZW9tZXRyaWVzLCBtYXRlcmlhbHMgKSB7XG5cblx0XHR2YXIgb2JqZWN0O1xuXG5cdFx0ZnVuY3Rpb24gZ2V0R2VvbWV0cnkoIG5hbWUgKSB7XG5cblx0XHRcdGlmICggZ2VvbWV0cmllc1sgbmFtZSBdID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0TG9hZGVyOiBVbmRlZmluZWQgZ2VvbWV0cnknLCBuYW1lICk7XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGdlb21ldHJpZXNbIG5hbWUgXTtcblxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIGdldE1hdGVyaWFsKCBuYW1lICkge1xuXG5cdFx0XHRpZiAoIG5hbWUgPT09IHVuZGVmaW5lZCApIHJldHVybiB1bmRlZmluZWQ7XG5cblx0XHRcdGlmICggQXJyYXkuaXNBcnJheSggbmFtZSApICkge1xuXG5cdFx0XHRcdHZhciBhcnJheSA9IFtdO1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IG5hbWUubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdHZhciB1dWlkID0gbmFtZVsgaSBdO1xuXG5cdFx0XHRcdFx0aWYgKCBtYXRlcmlhbHNbIHV1aWQgXSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3RMb2FkZXI6IFVuZGVmaW5lZCBtYXRlcmlhbCcsIHV1aWQgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGFycmF5LnB1c2goIG1hdGVyaWFsc1sgdXVpZCBdICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBhcnJheTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIG1hdGVyaWFsc1sgbmFtZSBdID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0TG9hZGVyOiBVbmRlZmluZWQgbWF0ZXJpYWwnLCBuYW1lICk7XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIG1hdGVyaWFsc1sgbmFtZSBdO1xuXG5cdFx0fVxuXG5cdFx0c3dpdGNoICggZGF0YS50eXBlICkge1xuXG5cdFx0XHRjYXNlICdTY2VuZSc6XG5cblx0XHRcdFx0b2JqZWN0ID0gbmV3IFNjZW5lKCk7XG5cblx0XHRcdFx0aWYgKCBkYXRhLmJhY2tncm91bmQgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdGlmICggTnVtYmVyLmlzSW50ZWdlciggZGF0YS5iYWNrZ3JvdW5kICkgKSB7XG5cblx0XHRcdFx0XHRcdG9iamVjdC5iYWNrZ3JvdW5kID0gbmV3IENvbG9yKCBkYXRhLmJhY2tncm91bmQgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCBkYXRhLmZvZyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0aWYgKCBkYXRhLmZvZy50eXBlID09PSAnRm9nJyApIHtcblxuXHRcdFx0XHRcdFx0b2JqZWN0LmZvZyA9IG5ldyBGb2coIGRhdGEuZm9nLmNvbG9yLCBkYXRhLmZvZy5uZWFyLCBkYXRhLmZvZy5mYXIgKTtcblxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoIGRhdGEuZm9nLnR5cGUgPT09ICdGb2dFeHAyJyApIHtcblxuXHRcdFx0XHRcdFx0b2JqZWN0LmZvZyA9IG5ldyBGb2dFeHAyKCBkYXRhLmZvZy5jb2xvciwgZGF0YS5mb2cuZGVuc2l0eSApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnUGVyc3BlY3RpdmVDYW1lcmEnOlxuXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSggZGF0YS5mb3YsIGRhdGEuYXNwZWN0LCBkYXRhLm5lYXIsIGRhdGEuZmFyICk7XG5cblx0XHRcdFx0aWYgKCBkYXRhLmZvY3VzICE9PSB1bmRlZmluZWQgKSBvYmplY3QuZm9jdXMgPSBkYXRhLmZvY3VzO1xuXHRcdFx0XHRpZiAoIGRhdGEuem9vbSAhPT0gdW5kZWZpbmVkICkgb2JqZWN0Lnpvb20gPSBkYXRhLnpvb207XG5cdFx0XHRcdGlmICggZGF0YS5maWxtR2F1Z2UgIT09IHVuZGVmaW5lZCApIG9iamVjdC5maWxtR2F1Z2UgPSBkYXRhLmZpbG1HYXVnZTtcblx0XHRcdFx0aWYgKCBkYXRhLmZpbG1PZmZzZXQgIT09IHVuZGVmaW5lZCApIG9iamVjdC5maWxtT2Zmc2V0ID0gZGF0YS5maWxtT2Zmc2V0O1xuXHRcdFx0XHRpZiAoIGRhdGEudmlldyAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnZpZXcgPSBPYmplY3QuYXNzaWduKCB7fSwgZGF0YS52aWV3ICk7XG5cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgJ09ydGhvZ3JhcGhpY0NhbWVyYSc6XG5cblx0XHRcdFx0b2JqZWN0ID0gbmV3IE9ydGhvZ3JhcGhpY0NhbWVyYSggZGF0YS5sZWZ0LCBkYXRhLnJpZ2h0LCBkYXRhLnRvcCwgZGF0YS5ib3R0b20sIGRhdGEubmVhciwgZGF0YS5mYXIgKTtcblxuXHRcdFx0XHRpZiAoIGRhdGEuem9vbSAhPT0gdW5kZWZpbmVkICkgb2JqZWN0Lnpvb20gPSBkYXRhLnpvb207XG5cdFx0XHRcdGlmICggZGF0YS52aWV3ICE9PSB1bmRlZmluZWQgKSBvYmplY3QudmlldyA9IE9iamVjdC5hc3NpZ24oIHt9LCBkYXRhLnZpZXcgKTtcblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnQW1iaWVudExpZ2h0JzpcblxuXHRcdFx0XHRvYmplY3QgPSBuZXcgQW1iaWVudExpZ2h0KCBkYXRhLmNvbG9yLCBkYXRhLmludGVuc2l0eSApO1xuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdEaXJlY3Rpb25hbExpZ2h0JzpcblxuXHRcdFx0XHRvYmplY3QgPSBuZXcgRGlyZWN0aW9uYWxMaWdodCggZGF0YS5jb2xvciwgZGF0YS5pbnRlbnNpdHkgKTtcblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnUG9pbnRMaWdodCc6XG5cblx0XHRcdFx0b2JqZWN0ID0gbmV3IFBvaW50TGlnaHQoIGRhdGEuY29sb3IsIGRhdGEuaW50ZW5zaXR5LCBkYXRhLmRpc3RhbmNlLCBkYXRhLmRlY2F5ICk7XG5cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgJ1JlY3RBcmVhTGlnaHQnOlxuXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBSZWN0QXJlYUxpZ2h0KCBkYXRhLmNvbG9yLCBkYXRhLmludGVuc2l0eSwgZGF0YS53aWR0aCwgZGF0YS5oZWlnaHQgKTtcblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnU3BvdExpZ2h0JzpcblxuXHRcdFx0XHRvYmplY3QgPSBuZXcgU3BvdExpZ2h0KCBkYXRhLmNvbG9yLCBkYXRhLmludGVuc2l0eSwgZGF0YS5kaXN0YW5jZSwgZGF0YS5hbmdsZSwgZGF0YS5wZW51bWJyYSwgZGF0YS5kZWNheSApO1xuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdIZW1pc3BoZXJlTGlnaHQnOlxuXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBIZW1pc3BoZXJlTGlnaHQoIGRhdGEuY29sb3IsIGRhdGEuZ3JvdW5kQ29sb3IsIGRhdGEuaW50ZW5zaXR5ICk7XG5cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgJ1NraW5uZWRNZXNoJzpcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3RMb2FkZXIucGFyc2VPYmplY3QoKSBkb2VzIG5vdCBzdXBwb3J0IFNraW5uZWRNZXNoIHlldC4nICk7XG5cblx0XHRcdGNhc2UgJ01lc2gnOlxuXG5cdFx0XHRcdHZhciBnZW9tZXRyeSA9IGdldEdlb21ldHJ5KCBkYXRhLmdlb21ldHJ5ICk7XG5cdFx0XHRcdHZhciBtYXRlcmlhbCA9IGdldE1hdGVyaWFsKCBkYXRhLm1hdGVyaWFsICk7XG5cblx0XHRcdFx0aWYgKCBnZW9tZXRyeS5ib25lcyAmJiBnZW9tZXRyeS5ib25lcy5sZW5ndGggPiAwICkge1xuXG5cdFx0XHRcdFx0b2JqZWN0ID0gbmV3IFNraW5uZWRNZXNoKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0b2JqZWN0ID0gbmV3IE1lc2goIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnTE9EJzpcblxuXHRcdFx0XHRvYmplY3QgPSBuZXcgTE9EKCk7XG5cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgJ0xpbmUnOlxuXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBMaW5lKCBnZXRHZW9tZXRyeSggZGF0YS5nZW9tZXRyeSApLCBnZXRNYXRlcmlhbCggZGF0YS5tYXRlcmlhbCApLCBkYXRhLm1vZGUgKTtcblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnTGluZUxvb3AnOlxuXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBMaW5lTG9vcCggZ2V0R2VvbWV0cnkoIGRhdGEuZ2VvbWV0cnkgKSwgZ2V0TWF0ZXJpYWwoIGRhdGEubWF0ZXJpYWwgKSApO1xuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdMaW5lU2VnbWVudHMnOlxuXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBMaW5lU2VnbWVudHMoIGdldEdlb21ldHJ5KCBkYXRhLmdlb21ldHJ5ICksIGdldE1hdGVyaWFsKCBkYXRhLm1hdGVyaWFsICkgKTtcblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnUG9pbnRDbG91ZCc6XG5cdFx0XHRjYXNlICdQb2ludHMnOlxuXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBQb2ludHMoIGdldEdlb21ldHJ5KCBkYXRhLmdlb21ldHJ5ICksIGdldE1hdGVyaWFsKCBkYXRhLm1hdGVyaWFsICkgKTtcblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnU3ByaXRlJzpcblxuXHRcdFx0XHRvYmplY3QgPSBuZXcgU3ByaXRlKCBnZXRNYXRlcmlhbCggZGF0YS5tYXRlcmlhbCApICk7XG5cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgJ0dyb3VwJzpcblxuXHRcdFx0XHRvYmplY3QgPSBuZXcgR3JvdXAoKTtcblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0ZGVmYXVsdDpcblxuXHRcdFx0XHRvYmplY3QgPSBuZXcgT2JqZWN0M0QoKTtcblxuXHRcdH1cblxuXHRcdG9iamVjdC51dWlkID0gZGF0YS51dWlkO1xuXG5cdFx0aWYgKCBkYXRhLm5hbWUgIT09IHVuZGVmaW5lZCApIG9iamVjdC5uYW1lID0gZGF0YS5uYW1lO1xuXG5cdFx0aWYgKCBkYXRhLm1hdHJpeCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRvYmplY3QubWF0cml4LmZyb21BcnJheSggZGF0YS5tYXRyaXggKTtcblxuXHRcdFx0aWYgKCBkYXRhLm1hdHJpeEF1dG9VcGRhdGUgIT09IHVuZGVmaW5lZCApIG9iamVjdC5tYXRyaXhBdXRvVXBkYXRlID0gZGF0YS5tYXRyaXhBdXRvVXBkYXRlO1xuXHRcdFx0aWYgKCBvYmplY3QubWF0cml4QXV0b1VwZGF0ZSApIG9iamVjdC5tYXRyaXguZGVjb21wb3NlKCBvYmplY3QucG9zaXRpb24sIG9iamVjdC5xdWF0ZXJuaW9uLCBvYmplY3Quc2NhbGUgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGlmICggZGF0YS5wb3NpdGlvbiAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnBvc2l0aW9uLmZyb21BcnJheSggZGF0YS5wb3NpdGlvbiApO1xuXHRcdFx0aWYgKCBkYXRhLnJvdGF0aW9uICE9PSB1bmRlZmluZWQgKSBvYmplY3Qucm90YXRpb24uZnJvbUFycmF5KCBkYXRhLnJvdGF0aW9uICk7XG5cdFx0XHRpZiAoIGRhdGEucXVhdGVybmlvbiAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnF1YXRlcm5pb24uZnJvbUFycmF5KCBkYXRhLnF1YXRlcm5pb24gKTtcblx0XHRcdGlmICggZGF0YS5zY2FsZSAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnNjYWxlLmZyb21BcnJheSggZGF0YS5zY2FsZSApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBkYXRhLmNhc3RTaGFkb3cgIT09IHVuZGVmaW5lZCApIG9iamVjdC5jYXN0U2hhZG93ID0gZGF0YS5jYXN0U2hhZG93O1xuXHRcdGlmICggZGF0YS5yZWNlaXZlU2hhZG93ICE9PSB1bmRlZmluZWQgKSBvYmplY3QucmVjZWl2ZVNoYWRvdyA9IGRhdGEucmVjZWl2ZVNoYWRvdztcblxuXHRcdGlmICggZGF0YS5zaGFkb3cgKSB7XG5cblx0XHRcdGlmICggZGF0YS5zaGFkb3cuYmlhcyAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnNoYWRvdy5iaWFzID0gZGF0YS5zaGFkb3cuYmlhcztcblx0XHRcdGlmICggZGF0YS5zaGFkb3cucmFkaXVzICE9PSB1bmRlZmluZWQgKSBvYmplY3Quc2hhZG93LnJhZGl1cyA9IGRhdGEuc2hhZG93LnJhZGl1cztcblx0XHRcdGlmICggZGF0YS5zaGFkb3cubWFwU2l6ZSAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnNoYWRvdy5tYXBTaXplLmZyb21BcnJheSggZGF0YS5zaGFkb3cubWFwU2l6ZSApO1xuXHRcdFx0aWYgKCBkYXRhLnNoYWRvdy5jYW1lcmEgIT09IHVuZGVmaW5lZCApIG9iamVjdC5zaGFkb3cuY2FtZXJhID0gdGhpcy5wYXJzZU9iamVjdCggZGF0YS5zaGFkb3cuY2FtZXJhICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIGRhdGEudmlzaWJsZSAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnZpc2libGUgPSBkYXRhLnZpc2libGU7XG5cdFx0aWYgKCBkYXRhLmZydXN0dW1DdWxsZWQgIT09IHVuZGVmaW5lZCApIG9iamVjdC5mcnVzdHVtQ3VsbGVkID0gZGF0YS5mcnVzdHVtQ3VsbGVkO1xuXHRcdGlmICggZGF0YS5yZW5kZXJPcmRlciAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnJlbmRlck9yZGVyID0gZGF0YS5yZW5kZXJPcmRlcjtcblx0XHRpZiAoIGRhdGEudXNlckRhdGEgIT09IHVuZGVmaW5lZCApIG9iamVjdC51c2VyRGF0YSA9IGRhdGEudXNlckRhdGE7XG5cblx0XHRpZiAoIGRhdGEuY2hpbGRyZW4gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dmFyIGNoaWxkcmVuID0gZGF0YS5jaGlsZHJlbjtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRcdG9iamVjdC5hZGQoIHRoaXMucGFyc2VPYmplY3QoIGNoaWxkcmVuWyBpIF0sIGdlb21ldHJpZXMsIG1hdGVyaWFscyApICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggZGF0YS50eXBlID09PSAnTE9EJyApIHtcblxuXHRcdFx0dmFyIGxldmVscyA9IGRhdGEubGV2ZWxzO1xuXG5cdFx0XHRmb3IgKCB2YXIgbCA9IDA7IGwgPCBsZXZlbHMubGVuZ3RoOyBsICsrICkge1xuXG5cdFx0XHRcdHZhciBsZXZlbCA9IGxldmVsc1sgbCBdO1xuXHRcdFx0XHR2YXIgY2hpbGQgPSBvYmplY3QuZ2V0T2JqZWN0QnlQcm9wZXJ0eSggJ3V1aWQnLCBsZXZlbC5vYmplY3QgKTtcblxuXHRcdFx0XHRpZiAoIGNoaWxkICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRvYmplY3QuYWRkTGV2ZWwoIGNoaWxkLCBsZXZlbC5kaXN0YW5jZSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIG9iamVjdDtcblxuXHR9XG5cbn0gKTtcblxudmFyIFRFWFRVUkVfTUFQUElORyA9IHtcblx0VVZNYXBwaW5nOiBVVk1hcHBpbmcsXG5cdEN1YmVSZWZsZWN0aW9uTWFwcGluZzogQ3ViZVJlZmxlY3Rpb25NYXBwaW5nLFxuXHRDdWJlUmVmcmFjdGlvbk1hcHBpbmc6IEN1YmVSZWZyYWN0aW9uTWFwcGluZyxcblx0RXF1aXJlY3Rhbmd1bGFyUmVmbGVjdGlvbk1hcHBpbmc6IEVxdWlyZWN0YW5ndWxhclJlZmxlY3Rpb25NYXBwaW5nLFxuXHRFcXVpcmVjdGFuZ3VsYXJSZWZyYWN0aW9uTWFwcGluZzogRXF1aXJlY3Rhbmd1bGFyUmVmcmFjdGlvbk1hcHBpbmcsXG5cdFNwaGVyaWNhbFJlZmxlY3Rpb25NYXBwaW5nOiBTcGhlcmljYWxSZWZsZWN0aW9uTWFwcGluZyxcblx0Q3ViZVVWUmVmbGVjdGlvbk1hcHBpbmc6IEN1YmVVVlJlZmxlY3Rpb25NYXBwaW5nLFxuXHRDdWJlVVZSZWZyYWN0aW9uTWFwcGluZzogQ3ViZVVWUmVmcmFjdGlvbk1hcHBpbmdcbn07XG5cbnZhciBURVhUVVJFX1dSQVBQSU5HID0ge1xuXHRSZXBlYXRXcmFwcGluZzogUmVwZWF0V3JhcHBpbmcsXG5cdENsYW1wVG9FZGdlV3JhcHBpbmc6IENsYW1wVG9FZGdlV3JhcHBpbmcsXG5cdE1pcnJvcmVkUmVwZWF0V3JhcHBpbmc6IE1pcnJvcmVkUmVwZWF0V3JhcHBpbmdcbn07XG5cbnZhciBURVhUVVJFX0ZJTFRFUiA9IHtcblx0TmVhcmVzdEZpbHRlcjogTmVhcmVzdEZpbHRlcixcblx0TmVhcmVzdE1pcE1hcE5lYXJlc3RGaWx0ZXI6IE5lYXJlc3RNaXBNYXBOZWFyZXN0RmlsdGVyLFxuXHROZWFyZXN0TWlwTWFwTGluZWFyRmlsdGVyOiBOZWFyZXN0TWlwTWFwTGluZWFyRmlsdGVyLFxuXHRMaW5lYXJGaWx0ZXI6IExpbmVhckZpbHRlcixcblx0TGluZWFyTWlwTWFwTmVhcmVzdEZpbHRlcjogTGluZWFyTWlwTWFwTmVhcmVzdEZpbHRlcixcblx0TGluZWFyTWlwTWFwTGluZWFyRmlsdGVyOiBMaW5lYXJNaXBNYXBMaW5lYXJGaWx0ZXJcbn07XG5cbi8qKlxuICogQGF1dGhvciB6ejg1IC8gaHR0cDovL3d3dy5sYWI0Z2FtZXMubmV0L3p6ODUvYmxvZ1xuICogbWluaW1hbCBjbGFzcyBmb3IgcHJveGluZyBmdW5jdGlvbnMgdG8gUGF0aC4gUmVwbGFjZXMgb2xkIFwiZXh0cmFjdFN1YnBhdGhzKClcIlxuICoqL1xuXG5mdW5jdGlvbiBTaGFwZVBhdGgoKSB7XG5cblx0dGhpcy50eXBlID0gJ1NoYXBlUGF0aCc7XG5cblx0dGhpcy5jb2xvciA9IG5ldyBDb2xvcigpO1xuXG5cdHRoaXMuc3ViUGF0aHMgPSBbXTtcblx0dGhpcy5jdXJyZW50UGF0aCA9IG51bGw7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggU2hhcGVQYXRoLnByb3RvdHlwZSwge1xuXG5cdG1vdmVUbzogZnVuY3Rpb24gKCB4LCB5ICkge1xuXG5cdFx0dGhpcy5jdXJyZW50UGF0aCA9IG5ldyBQYXRoKCk7XG5cdFx0dGhpcy5zdWJQYXRocy5wdXNoKCB0aGlzLmN1cnJlbnRQYXRoICk7XG5cdFx0dGhpcy5jdXJyZW50UGF0aC5tb3ZlVG8oIHgsIHkgKTtcblxuXHR9LFxuXG5cdGxpbmVUbzogZnVuY3Rpb24gKCB4LCB5ICkge1xuXG5cdFx0dGhpcy5jdXJyZW50UGF0aC5saW5lVG8oIHgsIHkgKTtcblxuXHR9LFxuXG5cdHF1YWRyYXRpY0N1cnZlVG86IGZ1bmN0aW9uICggYUNQeCwgYUNQeSwgYVgsIGFZICkge1xuXG5cdFx0dGhpcy5jdXJyZW50UGF0aC5xdWFkcmF0aWNDdXJ2ZVRvKCBhQ1B4LCBhQ1B5LCBhWCwgYVkgKTtcblxuXHR9LFxuXG5cdGJlemllckN1cnZlVG86IGZ1bmN0aW9uICggYUNQMXgsIGFDUDF5LCBhQ1AyeCwgYUNQMnksIGFYLCBhWSApIHtcblxuXHRcdHRoaXMuY3VycmVudFBhdGguYmV6aWVyQ3VydmVUbyggYUNQMXgsIGFDUDF5LCBhQ1AyeCwgYUNQMnksIGFYLCBhWSApO1xuXG5cdH0sXG5cblx0c3BsaW5lVGhydTogZnVuY3Rpb24gKCBwdHMgKSB7XG5cblx0XHR0aGlzLmN1cnJlbnRQYXRoLnNwbGluZVRocnUoIHB0cyApO1xuXG5cdH0sXG5cblx0dG9TaGFwZXM6IGZ1bmN0aW9uICggaXNDQ1csIG5vSG9sZXMgKSB7XG5cblx0XHRmdW5jdGlvbiB0b1NoYXBlc05vSG9sZXMoIGluU3VicGF0aHMgKSB7XG5cblx0XHRcdHZhciBzaGFwZXMgPSBbXTtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gaW5TdWJwYXRocy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdHZhciB0bXBQYXRoID0gaW5TdWJwYXRoc1sgaSBdO1xuXG5cdFx0XHRcdHZhciB0bXBTaGFwZSA9IG5ldyBTaGFwZSgpO1xuXHRcdFx0XHR0bXBTaGFwZS5jdXJ2ZXMgPSB0bXBQYXRoLmN1cnZlcztcblxuXHRcdFx0XHRzaGFwZXMucHVzaCggdG1wU2hhcGUgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gc2hhcGVzO1xuXG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gaXNQb2ludEluc2lkZVBvbHlnb24oIGluUHQsIGluUG9seWdvbiApIHtcblxuXHRcdFx0dmFyIHBvbHlMZW4gPSBpblBvbHlnb24ubGVuZ3RoO1xuXG5cdFx0XHQvLyBpblB0IG9uIHBvbHlnb24gY29udG91ciA9PiBpbW1lZGlhdGUgc3VjY2VzcyAgICBvclxuXHRcdFx0Ly8gdG9nZ2xpbmcgb2YgaW5zaWRlL291dHNpZGUgYXQgZXZlcnkgc2luZ2xlISBpbnRlcnNlY3Rpb24gcG9pbnQgb2YgYW4gZWRnZVxuXHRcdFx0Ly8gIHdpdGggdGhlIGhvcml6b250YWwgbGluZSB0aHJvdWdoIGluUHQsIGxlZnQgb2YgaW5QdFxuXHRcdFx0Ly8gIG5vdCBjb3VudGluZyBsb3dlclkgZW5kcG9pbnRzIG9mIGVkZ2VzIGFuZCB3aG9sZSBlZGdlcyBvbiB0aGF0IGxpbmVcblx0XHRcdHZhciBpbnNpZGUgPSBmYWxzZTtcblx0XHRcdGZvciAoIHZhciBwID0gcG9seUxlbiAtIDEsIHEgPSAwOyBxIDwgcG9seUxlbjsgcCA9IHEgKysgKSB7XG5cblx0XHRcdFx0dmFyIGVkZ2VMb3dQdCA9IGluUG9seWdvblsgcCBdO1xuXHRcdFx0XHR2YXIgZWRnZUhpZ2hQdCA9IGluUG9seWdvblsgcSBdO1xuXG5cdFx0XHRcdHZhciBlZGdlRHggPSBlZGdlSGlnaFB0LnggLSBlZGdlTG93UHQueDtcblx0XHRcdFx0dmFyIGVkZ2VEeSA9IGVkZ2VIaWdoUHQueSAtIGVkZ2VMb3dQdC55O1xuXG5cdFx0XHRcdGlmICggTWF0aC5hYnMoIGVkZ2VEeSApID4gTnVtYmVyLkVQU0lMT04gKSB7XG5cblx0XHRcdFx0XHQvLyBub3QgcGFyYWxsZWxcblx0XHRcdFx0XHRpZiAoIGVkZ2VEeSA8IDAgKSB7XG5cblx0XHRcdFx0XHRcdGVkZ2VMb3dQdCA9IGluUG9seWdvblsgcSBdOyBlZGdlRHggPSAtIGVkZ2VEeDtcblx0XHRcdFx0XHRcdGVkZ2VIaWdoUHQgPSBpblBvbHlnb25bIHAgXTsgZWRnZUR5ID0gLSBlZGdlRHk7XG5cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKCAoIGluUHQueSA8IGVkZ2VMb3dQdC55ICkgfHwgKCBpblB0LnkgPiBlZGdlSGlnaFB0LnkgKSApIFx0XHRjb250aW51ZTtcblxuXHRcdFx0XHRcdGlmICggaW5QdC55ID09PSBlZGdlTG93UHQueSApIHtcblxuXHRcdFx0XHRcdFx0aWYgKCBpblB0LnggPT09IGVkZ2VMb3dQdC54IClcdFx0cmV0dXJuXHR0cnVlO1x0XHQvLyBpblB0IGlzIG9uIGNvbnRvdXIgP1xuXHRcdFx0XHRcdFx0Ly8gY29udGludWU7XHRcdFx0XHQvLyBubyBpbnRlcnNlY3Rpb24gb3IgZWRnZUxvd1B0ID0+IGRvZXNuJ3QgY291bnQgISEhXG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHR2YXIgcGVycEVkZ2UgPSBlZGdlRHkgKiAoIGluUHQueCAtIGVkZ2VMb3dQdC54ICkgLSBlZGdlRHggKiAoIGluUHQueSAtIGVkZ2VMb3dQdC55ICk7XG5cdFx0XHRcdFx0XHRpZiAoIHBlcnBFZGdlID09PSAwIClcdFx0XHRcdHJldHVyblx0dHJ1ZTtcdFx0Ly8gaW5QdCBpcyBvbiBjb250b3VyID9cblx0XHRcdFx0XHRcdGlmICggcGVycEVkZ2UgPCAwICkgXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0XHRcdGluc2lkZSA9ICEgaW5zaWRlO1x0XHQvLyB0cnVlIGludGVyc2VjdGlvbiBsZWZ0IG9mIGluUHRcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Ly8gcGFyYWxsZWwgb3IgY29sbGluZWFyXG5cdFx0XHRcdFx0aWYgKCBpblB0LnkgIT09IGVkZ2VMb3dQdC55ICkgXHRcdGNvbnRpbnVlO1x0XHRcdC8vIHBhcmFsbGVsXG5cdFx0XHRcdFx0Ly8gZWRnZSBsaWVzIG9uIHRoZSBzYW1lIGhvcml6b250YWwgbGluZSBhcyBpblB0XG5cdFx0XHRcdFx0aWYgKCAoICggZWRnZUhpZ2hQdC54IDw9IGluUHQueCApICYmICggaW5QdC54IDw9IGVkZ2VMb3dQdC54ICkgKSB8fFxuXHRcdFx0XHRcdFx0ICggKCBlZGdlTG93UHQueCA8PSBpblB0LnggKSAmJiAoIGluUHQueCA8PSBlZGdlSGlnaFB0LnggKSApIClcdFx0cmV0dXJuXHR0cnVlO1x0Ly8gaW5QdDogUG9pbnQgb24gY29udG91ciAhXG5cdFx0XHRcdFx0Ly8gY29udGludWU7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVyblx0aW5zaWRlO1xuXG5cdFx0fVxuXG5cdFx0dmFyIGlzQ2xvY2tXaXNlID0gU2hhcGVVdGlscy5pc0Nsb2NrV2lzZTtcblxuXHRcdHZhciBzdWJQYXRocyA9IHRoaXMuc3ViUGF0aHM7XG5cdFx0aWYgKCBzdWJQYXRocy5sZW5ndGggPT09IDAgKSByZXR1cm4gW107XG5cblx0XHRpZiAoIG5vSG9sZXMgPT09IHRydWUgKVx0cmV0dXJuXHR0b1NoYXBlc05vSG9sZXMoIHN1YlBhdGhzICk7XG5cblxuXHRcdHZhciBzb2xpZCwgdG1wUGF0aCwgdG1wU2hhcGUsIHNoYXBlcyA9IFtdO1xuXG5cdFx0aWYgKCBzdWJQYXRocy5sZW5ndGggPT09IDEgKSB7XG5cblx0XHRcdHRtcFBhdGggPSBzdWJQYXRoc1sgMCBdO1xuXHRcdFx0dG1wU2hhcGUgPSBuZXcgU2hhcGUoKTtcblx0XHRcdHRtcFNoYXBlLmN1cnZlcyA9IHRtcFBhdGguY3VydmVzO1xuXHRcdFx0c2hhcGVzLnB1c2goIHRtcFNoYXBlICk7XG5cdFx0XHRyZXR1cm4gc2hhcGVzO1xuXG5cdFx0fVxuXG5cdFx0dmFyIGhvbGVzRmlyc3QgPSAhIGlzQ2xvY2tXaXNlKCBzdWJQYXRoc1sgMCBdLmdldFBvaW50cygpICk7XG5cdFx0aG9sZXNGaXJzdCA9IGlzQ0NXID8gISBob2xlc0ZpcnN0IDogaG9sZXNGaXJzdDtcblxuXHRcdC8vIGNvbnNvbGUubG9nKFwiSG9sZXMgZmlyc3RcIiwgaG9sZXNGaXJzdCk7XG5cblx0XHR2YXIgYmV0dGVyU2hhcGVIb2xlcyA9IFtdO1xuXHRcdHZhciBuZXdTaGFwZXMgPSBbXTtcblx0XHR2YXIgbmV3U2hhcGVIb2xlcyA9IFtdO1xuXHRcdHZhciBtYWluSWR4ID0gMDtcblx0XHR2YXIgdG1wUG9pbnRzO1xuXG5cdFx0bmV3U2hhcGVzWyBtYWluSWR4IF0gPSB1bmRlZmluZWQ7XG5cdFx0bmV3U2hhcGVIb2xlc1sgbWFpbklkeCBdID0gW107XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBzdWJQYXRocy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR0bXBQYXRoID0gc3ViUGF0aHNbIGkgXTtcblx0XHRcdHRtcFBvaW50cyA9IHRtcFBhdGguZ2V0UG9pbnRzKCk7XG5cdFx0XHRzb2xpZCA9IGlzQ2xvY2tXaXNlKCB0bXBQb2ludHMgKTtcblx0XHRcdHNvbGlkID0gaXNDQ1cgPyAhIHNvbGlkIDogc29saWQ7XG5cblx0XHRcdGlmICggc29saWQgKSB7XG5cblx0XHRcdFx0aWYgKCAoICEgaG9sZXNGaXJzdCApICYmICggbmV3U2hhcGVzWyBtYWluSWR4IF0gKSApXHRtYWluSWR4ICsrO1xuXG5cdFx0XHRcdG5ld1NoYXBlc1sgbWFpbklkeCBdID0geyBzOiBuZXcgU2hhcGUoKSwgcDogdG1wUG9pbnRzIH07XG5cdFx0XHRcdG5ld1NoYXBlc1sgbWFpbklkeCBdLnMuY3VydmVzID0gdG1wUGF0aC5jdXJ2ZXM7XG5cblx0XHRcdFx0aWYgKCBob2xlc0ZpcnN0IClcdG1haW5JZHggKys7XG5cdFx0XHRcdG5ld1NoYXBlSG9sZXNbIG1haW5JZHggXSA9IFtdO1xuXG5cdFx0XHRcdC8vY29uc29sZS5sb2coJ2N3JywgaSk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0bmV3U2hhcGVIb2xlc1sgbWFpbklkeCBdLnB1c2goIHsgaDogdG1wUGF0aCwgcDogdG1wUG9pbnRzWyAwIF0gfSApO1xuXG5cdFx0XHRcdC8vY29uc29sZS5sb2coJ2NjdycsIGkpO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvLyBvbmx5IEhvbGVzPyAtPiBwcm9iYWJseSBhbGwgU2hhcGVzIHdpdGggd3Jvbmcgb3JpZW50YXRpb25cblx0XHRpZiAoICEgbmV3U2hhcGVzWyAwIF0gKVx0cmV0dXJuXHR0b1NoYXBlc05vSG9sZXMoIHN1YlBhdGhzICk7XG5cblxuXHRcdGlmICggbmV3U2hhcGVzLmxlbmd0aCA+IDEgKSB7XG5cblx0XHRcdHZhciBhbWJpZ3VvdXMgPSBmYWxzZTtcblx0XHRcdHZhciB0b0NoYW5nZSA9IFtdO1xuXG5cdFx0XHRmb3IgKCB2YXIgc0lkeCA9IDAsIHNMZW4gPSBuZXdTaGFwZXMubGVuZ3RoOyBzSWR4IDwgc0xlbjsgc0lkeCArKyApIHtcblxuXHRcdFx0XHRiZXR0ZXJTaGFwZUhvbGVzWyBzSWR4IF0gPSBbXTtcblxuXHRcdFx0fVxuXG5cdFx0XHRmb3IgKCB2YXIgc0lkeCA9IDAsIHNMZW4gPSBuZXdTaGFwZXMubGVuZ3RoOyBzSWR4IDwgc0xlbjsgc0lkeCArKyApIHtcblxuXHRcdFx0XHR2YXIgc2hvID0gbmV3U2hhcGVIb2xlc1sgc0lkeCBdO1xuXG5cdFx0XHRcdGZvciAoIHZhciBoSWR4ID0gMDsgaElkeCA8IHNoby5sZW5ndGg7IGhJZHggKysgKSB7XG5cblx0XHRcdFx0XHR2YXIgaG8gPSBzaG9bIGhJZHggXTtcblx0XHRcdFx0XHR2YXIgaG9sZV91bmFzc2lnbmVkID0gdHJ1ZTtcblxuXHRcdFx0XHRcdGZvciAoIHZhciBzMklkeCA9IDA7IHMySWR4IDwgbmV3U2hhcGVzLmxlbmd0aDsgczJJZHggKysgKSB7XG5cblx0XHRcdFx0XHRcdGlmICggaXNQb2ludEluc2lkZVBvbHlnb24oIGhvLnAsIG5ld1NoYXBlc1sgczJJZHggXS5wICkgKSB7XG5cblx0XHRcdFx0XHRcdFx0aWYgKCBzSWR4ICE9PSBzMklkeCApXHR0b0NoYW5nZS5wdXNoKCB7IGZyb21zOiBzSWR4LCB0b3M6IHMySWR4LCBob2xlOiBoSWR4IH0gKTtcblx0XHRcdFx0XHRcdFx0aWYgKCBob2xlX3VuYXNzaWduZWQgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRob2xlX3VuYXNzaWduZWQgPSBmYWxzZTtcblx0XHRcdFx0XHRcdFx0XHRiZXR0ZXJTaGFwZUhvbGVzWyBzMklkeCBdLnB1c2goIGhvICk7XG5cblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0XHRcdGFtYmlndW91cyA9IHRydWU7XG5cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKCBob2xlX3VuYXNzaWduZWQgKSB7XG5cblx0XHRcdFx0XHRcdGJldHRlclNoYXBlSG9sZXNbIHNJZHggXS5wdXNoKCBobyApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXHRcdFx0Ly8gY29uc29sZS5sb2coXCJhbWJpZ3VvdXM6IFwiLCBhbWJpZ3VvdXMpO1xuXHRcdFx0aWYgKCB0b0NoYW5nZS5sZW5ndGggPiAwICkge1xuXG5cdFx0XHRcdC8vIGNvbnNvbGUubG9nKFwidG8gY2hhbmdlOiBcIiwgdG9DaGFuZ2UpO1xuXHRcdFx0XHRpZiAoICEgYW1iaWd1b3VzIClcdG5ld1NoYXBlSG9sZXMgPSBiZXR0ZXJTaGFwZUhvbGVzO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHR2YXIgdG1wSG9sZXM7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gbmV3U2hhcGVzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR0bXBTaGFwZSA9IG5ld1NoYXBlc1sgaSBdLnM7XG5cdFx0XHRzaGFwZXMucHVzaCggdG1wU2hhcGUgKTtcblx0XHRcdHRtcEhvbGVzID0gbmV3U2hhcGVIb2xlc1sgaSBdO1xuXG5cdFx0XHRmb3IgKCB2YXIgaiA9IDAsIGpsID0gdG1wSG9sZXMubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7XG5cblx0XHRcdFx0dG1wU2hhcGUuaG9sZXMucHVzaCggdG1wSG9sZXNbIGogXS5oICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vY29uc29sZS5sb2coXCJzaGFwZVwiLCBzaGFwZXMpO1xuXG5cdFx0cmV0dXJuIHNoYXBlcztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIHp6ODUgLyBodHRwOi8vd3d3LmxhYjRnYW1lcy5uZXQveno4NS9ibG9nXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIEZvbnQoIGRhdGEgKSB7XG5cblx0dGhpcy50eXBlID0gJ0ZvbnQnO1xuXG5cdHRoaXMuZGF0YSA9IGRhdGE7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggRm9udC5wcm90b3R5cGUsIHtcblxuXHRpc0ZvbnQ6IHRydWUsXG5cblx0Z2VuZXJhdGVTaGFwZXM6IGZ1bmN0aW9uICggdGV4dCwgc2l6ZSwgZGl2aXNpb25zICkge1xuXG5cdFx0aWYgKCBzaXplID09PSB1bmRlZmluZWQgKSBzaXplID0gMTAwO1xuXHRcdGlmICggZGl2aXNpb25zID09PSB1bmRlZmluZWQgKSBkaXZpc2lvbnMgPSA0O1xuXG5cdFx0dmFyIHNoYXBlcyA9IFtdO1xuXHRcdHZhciBwYXRocyA9IGNyZWF0ZVBhdGhzKCB0ZXh0LCBzaXplLCBkaXZpc2lvbnMsIHRoaXMuZGF0YSApO1xuXG5cdFx0Zm9yICggdmFyIHAgPSAwLCBwbCA9IHBhdGhzLmxlbmd0aDsgcCA8IHBsOyBwICsrICkge1xuXG5cdFx0XHRBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseSggc2hhcGVzLCBwYXRoc1sgcCBdLnRvU2hhcGVzKCkgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBzaGFwZXM7XG5cblx0fVxuXG59ICk7XG5cbmZ1bmN0aW9uIGNyZWF0ZVBhdGhzKCB0ZXh0LCBzaXplLCBkaXZpc2lvbnMsIGRhdGEgKSB7XG5cblx0dmFyIGNoYXJzID0gU3RyaW5nKCB0ZXh0ICkuc3BsaXQoICcnICk7XG5cdHZhciBzY2FsZSA9IHNpemUgLyBkYXRhLnJlc29sdXRpb247XG5cdHZhciBsaW5lX2hlaWdodCA9ICggZGF0YS5ib3VuZGluZ0JveC55TWF4IC0gZGF0YS5ib3VuZGluZ0JveC55TWluICsgZGF0YS51bmRlcmxpbmVUaGlja25lc3MgKSAqIHNjYWxlO1xuXG5cdHZhciBwYXRocyA9IFtdO1xuXG5cdHZhciBvZmZzZXRYID0gMCwgb2Zmc2V0WSA9IDA7XG5cblx0Zm9yICggdmFyIGkgPSAwOyBpIDwgY2hhcnMubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0dmFyIGNoYXIgPSBjaGFyc1sgaSBdO1xuXG5cdFx0aWYgKCBjaGFyID09PSAnXFxuJyApIHtcblxuXHRcdFx0b2Zmc2V0WCA9IDA7XG5cdFx0XHRvZmZzZXRZIC09IGxpbmVfaGVpZ2h0O1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dmFyIHJldCA9IGNyZWF0ZVBhdGgoIGNoYXIsIGRpdmlzaW9ucywgc2NhbGUsIG9mZnNldFgsIG9mZnNldFksIGRhdGEgKTtcblx0XHRcdG9mZnNldFggKz0gcmV0Lm9mZnNldFg7XG5cdFx0XHRwYXRocy5wdXNoKCByZXQucGF0aCApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRyZXR1cm4gcGF0aHM7XG5cbn1cblxuZnVuY3Rpb24gY3JlYXRlUGF0aCggY2hhciwgZGl2aXNpb25zLCBzY2FsZSwgb2Zmc2V0WCwgb2Zmc2V0WSwgZGF0YSApIHtcblxuXHR2YXIgZ2x5cGggPSBkYXRhLmdseXBoc1sgY2hhciBdIHx8IGRhdGEuZ2x5cGhzWyAnPycgXTtcblxuXHRpZiAoICEgZ2x5cGggKSByZXR1cm47XG5cblx0dmFyIHBhdGggPSBuZXcgU2hhcGVQYXRoKCk7XG5cblx0dmFyIHgsIHksIGNweCwgY3B5LCBjcHgxLCBjcHkxLCBjcHgyLCBjcHkyO1xuXG5cdGlmICggZ2x5cGgubyApIHtcblxuXHRcdHZhciBvdXRsaW5lID0gZ2x5cGguX2NhY2hlZE91dGxpbmUgfHwgKCBnbHlwaC5fY2FjaGVkT3V0bGluZSA9IGdseXBoLm8uc3BsaXQoICcgJyApICk7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBvdXRsaW5lLmxlbmd0aDsgaSA8IGw7ICkge1xuXG5cdFx0XHR2YXIgYWN0aW9uID0gb3V0bGluZVsgaSArKyBdO1xuXG5cdFx0XHRzd2l0Y2ggKCBhY3Rpb24gKSB7XG5cblx0XHRcdFx0Y2FzZSAnbSc6IC8vIG1vdmVUb1xuXG5cdFx0XHRcdFx0eCA9IG91dGxpbmVbIGkgKysgXSAqIHNjYWxlICsgb2Zmc2V0WDtcblx0XHRcdFx0XHR5ID0gb3V0bGluZVsgaSArKyBdICogc2NhbGUgKyBvZmZzZXRZO1xuXG5cdFx0XHRcdFx0cGF0aC5tb3ZlVG8oIHgsIHkgKTtcblxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgJ2wnOiAvLyBsaW5lVG9cblxuXHRcdFx0XHRcdHggPSBvdXRsaW5lWyBpICsrIF0gKiBzY2FsZSArIG9mZnNldFg7XG5cdFx0XHRcdFx0eSA9IG91dGxpbmVbIGkgKysgXSAqIHNjYWxlICsgb2Zmc2V0WTtcblxuXHRcdFx0XHRcdHBhdGgubGluZVRvKCB4LCB5ICk7XG5cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlICdxJzogLy8gcXVhZHJhdGljQ3VydmVUb1xuXG5cdFx0XHRcdFx0Y3B4ID0gb3V0bGluZVsgaSArKyBdICogc2NhbGUgKyBvZmZzZXRYO1xuXHRcdFx0XHRcdGNweSA9IG91dGxpbmVbIGkgKysgXSAqIHNjYWxlICsgb2Zmc2V0WTtcblx0XHRcdFx0XHRjcHgxID0gb3V0bGluZVsgaSArKyBdICogc2NhbGUgKyBvZmZzZXRYO1xuXHRcdFx0XHRcdGNweTEgPSBvdXRsaW5lWyBpICsrIF0gKiBzY2FsZSArIG9mZnNldFk7XG5cblx0XHRcdFx0XHRwYXRoLnF1YWRyYXRpY0N1cnZlVG8oIGNweDEsIGNweTEsIGNweCwgY3B5ICk7XG5cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlICdiJzogLy8gYmV6aWVyQ3VydmVUb1xuXG5cdFx0XHRcdFx0Y3B4ID0gb3V0bGluZVsgaSArKyBdICogc2NhbGUgKyBvZmZzZXRYO1xuXHRcdFx0XHRcdGNweSA9IG91dGxpbmVbIGkgKysgXSAqIHNjYWxlICsgb2Zmc2V0WTtcblx0XHRcdFx0XHRjcHgxID0gb3V0bGluZVsgaSArKyBdICogc2NhbGUgKyBvZmZzZXRYO1xuXHRcdFx0XHRcdGNweTEgPSBvdXRsaW5lWyBpICsrIF0gKiBzY2FsZSArIG9mZnNldFk7XG5cdFx0XHRcdFx0Y3B4MiA9IG91dGxpbmVbIGkgKysgXSAqIHNjYWxlICsgb2Zmc2V0WDtcblx0XHRcdFx0XHRjcHkyID0gb3V0bGluZVsgaSArKyBdICogc2NhbGUgKyBvZmZzZXRZO1xuXG5cdFx0XHRcdFx0cGF0aC5iZXppZXJDdXJ2ZVRvKCBjcHgxLCBjcHkxLCBjcHgyLCBjcHkyLCBjcHgsIGNweSApO1xuXG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9XG5cblx0cmV0dXJuIHsgb2Zmc2V0WDogZ2x5cGguaGEgKiBzY2FsZSwgcGF0aDogcGF0aCB9O1xuXG59XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBGb250TG9hZGVyKCBtYW5hZ2VyICkge1xuXG5cdHRoaXMubWFuYWdlciA9ICggbWFuYWdlciAhPT0gdW5kZWZpbmVkICkgPyBtYW5hZ2VyIDogRGVmYXVsdExvYWRpbmdNYW5hZ2VyO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIEZvbnRMb2FkZXIucHJvdG90eXBlLCB7XG5cblx0bG9hZDogZnVuY3Rpb24gKCB1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciApIHtcblxuXHRcdHZhciBzY29wZSA9IHRoaXM7XG5cblx0XHR2YXIgbG9hZGVyID0gbmV3IEZpbGVMb2FkZXIoIHRoaXMubWFuYWdlciApO1xuXHRcdGxvYWRlci5zZXRQYXRoKCB0aGlzLnBhdGggKTtcblx0XHRsb2FkZXIubG9hZCggdXJsLCBmdW5jdGlvbiAoIHRleHQgKSB7XG5cblx0XHRcdHZhciBqc29uO1xuXG5cdFx0XHR0cnkge1xuXG5cdFx0XHRcdGpzb24gPSBKU09OLnBhcnNlKCB0ZXh0ICk7XG5cblx0XHRcdH0gY2F0Y2ggKCBlICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkZvbnRMb2FkZXI6IHR5cGVmYWNlLmpzIHN1cHBvcnQgaXMgYmVpbmcgZGVwcmVjYXRlZC4gVXNlIHR5cGVmYWNlLmpzb24gaW5zdGVhZC4nICk7XG5cdFx0XHRcdGpzb24gPSBKU09OLnBhcnNlKCB0ZXh0LnN1YnN0cmluZyggNjUsIHRleHQubGVuZ3RoIC0gMiApICk7XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIGZvbnQgPSBzY29wZS5wYXJzZSgganNvbiApO1xuXG5cdFx0XHRpZiAoIG9uTG9hZCApIG9uTG9hZCggZm9udCApO1xuXG5cdFx0fSwgb25Qcm9ncmVzcywgb25FcnJvciApO1xuXG5cdH0sXG5cblx0cGFyc2U6IGZ1bmN0aW9uICgganNvbiApIHtcblxuXHRcdHJldHVybiBuZXcgRm9udCgganNvbiApO1xuXG5cdH0sXG5cblx0c2V0UGF0aDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMucGF0aCA9IHZhbHVlO1xuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxudmFyIGNvbnRleHQ7XG5cbnZhciBBdWRpb0NvbnRleHQgPSB7XG5cblx0Z2V0Q29udGV4dDogZnVuY3Rpb24gKCkge1xuXG5cdFx0aWYgKCBjb250ZXh0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnRleHQgPSBuZXcgKCB3aW5kb3cuQXVkaW9Db250ZXh0IHx8IHdpbmRvdy53ZWJraXRBdWRpb0NvbnRleHQgKSgpO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNvbnRleHQ7XG5cblx0fSxcblxuXHRzZXRDb250ZXh0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0Y29udGV4dCA9IHZhbHVlO1xuXG5cdH1cblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIFJlZWNlIEFhcm9uIExlY3JpdmFpbiAvIGh0dHA6Ly9yZWVjZW5vdGVzLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBBdWRpb0xvYWRlciggbWFuYWdlciApIHtcblxuXHR0aGlzLm1hbmFnZXIgPSAoIG1hbmFnZXIgIT09IHVuZGVmaW5lZCApID8gbWFuYWdlciA6IERlZmF1bHRMb2FkaW5nTWFuYWdlcjtcblxufVxuXG5PYmplY3QuYXNzaWduKCBBdWRpb0xvYWRlci5wcm90b3R5cGUsIHtcblxuXHRsb2FkOiBmdW5jdGlvbiAoIHVybCwgb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkge1xuXG5cdFx0dmFyIGxvYWRlciA9IG5ldyBGaWxlTG9hZGVyKCB0aGlzLm1hbmFnZXIgKTtcblx0XHRsb2FkZXIuc2V0UmVzcG9uc2VUeXBlKCAnYXJyYXlidWZmZXInICk7XG5cdFx0bG9hZGVyLmxvYWQoIHVybCwgZnVuY3Rpb24gKCBidWZmZXIgKSB7XG5cblx0XHRcdHZhciBjb250ZXh0ID0gQXVkaW9Db250ZXh0LmdldENvbnRleHQoKTtcblxuXHRcdFx0Y29udGV4dC5kZWNvZGVBdWRpb0RhdGEoIGJ1ZmZlciwgZnVuY3Rpb24gKCBhdWRpb0J1ZmZlciApIHtcblxuXHRcdFx0XHRvbkxvYWQoIGF1ZGlvQnVmZmVyICk7XG5cblx0XHRcdH0gKTtcblxuXHRcdH0sIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIFN0ZXJlb0NhbWVyYSgpIHtcblxuXHR0aGlzLnR5cGUgPSAnU3RlcmVvQ2FtZXJhJztcblxuXHR0aGlzLmFzcGVjdCA9IDE7XG5cblx0dGhpcy5leWVTZXAgPSAwLjA2NDtcblxuXHR0aGlzLmNhbWVyYUwgPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoKTtcblx0dGhpcy5jYW1lcmFMLmxheWVycy5lbmFibGUoIDEgKTtcblx0dGhpcy5jYW1lcmFMLm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTtcblxuXHR0aGlzLmNhbWVyYVIgPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoKTtcblx0dGhpcy5jYW1lcmFSLmxheWVycy5lbmFibGUoIDIgKTtcblx0dGhpcy5jYW1lcmFSLm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTtcblxufVxuXG5PYmplY3QuYXNzaWduKCBTdGVyZW9DYW1lcmEucHJvdG90eXBlLCB7XG5cblx0dXBkYXRlOiAoIGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBpbnN0YW5jZSwgZm9jdXMsIGZvdiwgYXNwZWN0LCBuZWFyLCBmYXIsIHpvb20sIGV5ZVNlcDtcblxuXHRcdHZhciBleWVSaWdodCA9IG5ldyBNYXRyaXg0KCk7XG5cdFx0dmFyIGV5ZUxlZnQgPSBuZXcgTWF0cml4NCgpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZSggY2FtZXJhICkge1xuXG5cdFx0XHR2YXIgbmVlZHNVcGRhdGUgPSBpbnN0YW5jZSAhPT0gdGhpcyB8fCBmb2N1cyAhPT0gY2FtZXJhLmZvY3VzIHx8IGZvdiAhPT0gY2FtZXJhLmZvdiB8fFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YXNwZWN0ICE9PSBjYW1lcmEuYXNwZWN0ICogdGhpcy5hc3BlY3QgfHwgbmVhciAhPT0gY2FtZXJhLm5lYXIgfHxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGZhciAhPT0gY2FtZXJhLmZhciB8fCB6b29tICE9PSBjYW1lcmEuem9vbSB8fCBleWVTZXAgIT09IHRoaXMuZXllU2VwO1xuXG5cdFx0XHRpZiAoIG5lZWRzVXBkYXRlICkge1xuXG5cdFx0XHRcdGluc3RhbmNlID0gdGhpcztcblx0XHRcdFx0Zm9jdXMgPSBjYW1lcmEuZm9jdXM7XG5cdFx0XHRcdGZvdiA9IGNhbWVyYS5mb3Y7XG5cdFx0XHRcdGFzcGVjdCA9IGNhbWVyYS5hc3BlY3QgKiB0aGlzLmFzcGVjdDtcblx0XHRcdFx0bmVhciA9IGNhbWVyYS5uZWFyO1xuXHRcdFx0XHRmYXIgPSBjYW1lcmEuZmFyO1xuXHRcdFx0XHR6b29tID0gY2FtZXJhLnpvb207XG5cblx0XHRcdFx0Ly8gT2ZmLWF4aXMgc3RlcmVvc2NvcGljIGVmZmVjdCBiYXNlZCBvblxuXHRcdFx0XHQvLyBodHRwOi8vcGF1bGJvdXJrZS5uZXQvc3RlcmVvZ3JhcGhpY3Mvc3RlcmVvcmVuZGVyL1xuXG5cdFx0XHRcdHZhciBwcm9qZWN0aW9uTWF0cml4ID0gY2FtZXJhLnByb2plY3Rpb25NYXRyaXguY2xvbmUoKTtcblx0XHRcdFx0ZXllU2VwID0gdGhpcy5leWVTZXAgLyAyO1xuXHRcdFx0XHR2YXIgZXllU2VwT25Qcm9qZWN0aW9uID0gZXllU2VwICogbmVhciAvIGZvY3VzO1xuXHRcdFx0XHR2YXIgeW1heCA9ICggbmVhciAqIE1hdGgudGFuKCBfTWF0aC5ERUcyUkFEICogZm92ICogMC41ICkgKSAvIHpvb207XG5cdFx0XHRcdHZhciB4bWluLCB4bWF4O1xuXG5cdFx0XHRcdC8vIHRyYW5zbGF0ZSB4T2Zmc2V0XG5cblx0XHRcdFx0ZXllTGVmdC5lbGVtZW50c1sgMTIgXSA9IC0gZXllU2VwO1xuXHRcdFx0XHRleWVSaWdodC5lbGVtZW50c1sgMTIgXSA9IGV5ZVNlcDtcblxuXHRcdFx0XHQvLyBmb3IgbGVmdCBleWVcblxuXHRcdFx0XHR4bWluID0gLSB5bWF4ICogYXNwZWN0ICsgZXllU2VwT25Qcm9qZWN0aW9uO1xuXHRcdFx0XHR4bWF4ID0geW1heCAqIGFzcGVjdCArIGV5ZVNlcE9uUHJvamVjdGlvbjtcblxuXHRcdFx0XHRwcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzWyAwIF0gPSAyICogbmVhciAvICggeG1heCAtIHhtaW4gKTtcblx0XHRcdFx0cHJvamVjdGlvbk1hdHJpeC5lbGVtZW50c1sgOCBdID0gKCB4bWF4ICsgeG1pbiApIC8gKCB4bWF4IC0geG1pbiApO1xuXG5cdFx0XHRcdHRoaXMuY2FtZXJhTC5wcm9qZWN0aW9uTWF0cml4LmNvcHkoIHByb2plY3Rpb25NYXRyaXggKTtcblxuXHRcdFx0XHQvLyBmb3IgcmlnaHQgZXllXG5cblx0XHRcdFx0eG1pbiA9IC0geW1heCAqIGFzcGVjdCAtIGV5ZVNlcE9uUHJvamVjdGlvbjtcblx0XHRcdFx0eG1heCA9IHltYXggKiBhc3BlY3QgLSBleWVTZXBPblByb2plY3Rpb247XG5cblx0XHRcdFx0cHJvamVjdGlvbk1hdHJpeC5lbGVtZW50c1sgMCBdID0gMiAqIG5lYXIgLyAoIHhtYXggLSB4bWluICk7XG5cdFx0XHRcdHByb2plY3Rpb25NYXRyaXguZWxlbWVudHNbIDggXSA9ICggeG1heCArIHhtaW4gKSAvICggeG1heCAtIHhtaW4gKTtcblxuXHRcdFx0XHR0aGlzLmNhbWVyYVIucHJvamVjdGlvbk1hdHJpeC5jb3B5KCBwcm9qZWN0aW9uTWF0cml4ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5jYW1lcmFMLm1hdHJpeFdvcmxkLmNvcHkoIGNhbWVyYS5tYXRyaXhXb3JsZCApLm11bHRpcGx5KCBleWVMZWZ0ICk7XG5cdFx0XHR0aGlzLmNhbWVyYVIubWF0cml4V29ybGQuY29weSggY2FtZXJhLm1hdHJpeFdvcmxkICkubXVsdGlwbHkoIGV5ZVJpZ2h0ICk7XG5cblx0XHR9O1xuXG5cdH0gKSgpXG5cbn0gKTtcblxuLyoqXG4gKiBDYW1lcmEgZm9yIHJlbmRlcmluZyBjdWJlIG1hcHNcbiAqXHQtIHJlbmRlcnMgc2NlbmUgaW50byBheGlzLWFsaWduZWQgY3ViZVxuICpcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKi9cblxuZnVuY3Rpb24gQ3ViZUNhbWVyYSggbmVhciwgZmFyLCBjdWJlUmVzb2x1dGlvbiApIHtcblxuXHRPYmplY3QzRC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0N1YmVDYW1lcmEnO1xuXG5cdHZhciBmb3YgPSA5MCwgYXNwZWN0ID0gMTtcblxuXHR2YXIgY2FtZXJhUFggPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoIGZvdiwgYXNwZWN0LCBuZWFyLCBmYXIgKTtcblx0Y2FtZXJhUFgudXAuc2V0KCAwLCAtIDEsIDAgKTtcblx0Y2FtZXJhUFgubG9va0F0KCBuZXcgVmVjdG9yMyggMSwgMCwgMCApICk7XG5cdHRoaXMuYWRkKCBjYW1lcmFQWCApO1xuXG5cdHZhciBjYW1lcmFOWCA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSggZm92LCBhc3BlY3QsIG5lYXIsIGZhciApO1xuXHRjYW1lcmFOWC51cC5zZXQoIDAsIC0gMSwgMCApO1xuXHRjYW1lcmFOWC5sb29rQXQoIG5ldyBWZWN0b3IzKCAtIDEsIDAsIDAgKSApO1xuXHR0aGlzLmFkZCggY2FtZXJhTlggKTtcblxuXHR2YXIgY2FtZXJhUFkgPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoIGZvdiwgYXNwZWN0LCBuZWFyLCBmYXIgKTtcblx0Y2FtZXJhUFkudXAuc2V0KCAwLCAwLCAxICk7XG5cdGNhbWVyYVBZLmxvb2tBdCggbmV3IFZlY3RvcjMoIDAsIDEsIDAgKSApO1xuXHR0aGlzLmFkZCggY2FtZXJhUFkgKTtcblxuXHR2YXIgY2FtZXJhTlkgPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoIGZvdiwgYXNwZWN0LCBuZWFyLCBmYXIgKTtcblx0Y2FtZXJhTlkudXAuc2V0KCAwLCAwLCAtIDEgKTtcblx0Y2FtZXJhTlkubG9va0F0KCBuZXcgVmVjdG9yMyggMCwgLSAxLCAwICkgKTtcblx0dGhpcy5hZGQoIGNhbWVyYU5ZICk7XG5cblx0dmFyIGNhbWVyYVBaID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCBmb3YsIGFzcGVjdCwgbmVhciwgZmFyICk7XG5cdGNhbWVyYVBaLnVwLnNldCggMCwgLSAxLCAwICk7XG5cdGNhbWVyYVBaLmxvb2tBdCggbmV3IFZlY3RvcjMoIDAsIDAsIDEgKSApO1xuXHR0aGlzLmFkZCggY2FtZXJhUFogKTtcblxuXHR2YXIgY2FtZXJhTlogPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoIGZvdiwgYXNwZWN0LCBuZWFyLCBmYXIgKTtcblx0Y2FtZXJhTloudXAuc2V0KCAwLCAtIDEsIDAgKTtcblx0Y2FtZXJhTloubG9va0F0KCBuZXcgVmVjdG9yMyggMCwgMCwgLSAxICkgKTtcblx0dGhpcy5hZGQoIGNhbWVyYU5aICk7XG5cblx0dmFyIG9wdGlvbnMgPSB7IGZvcm1hdDogUkdCRm9ybWF0LCBtYWdGaWx0ZXI6IExpbmVhckZpbHRlciwgbWluRmlsdGVyOiBMaW5lYXJGaWx0ZXIgfTtcblxuXHR0aGlzLnJlbmRlclRhcmdldCA9IG5ldyBXZWJHTFJlbmRlclRhcmdldEN1YmUoIGN1YmVSZXNvbHV0aW9uLCBjdWJlUmVzb2x1dGlvbiwgb3B0aW9ucyApO1xuXHR0aGlzLnJlbmRlclRhcmdldC50ZXh0dXJlLm5hbWUgPSBcIkN1YmVDYW1lcmFcIjtcblxuXHR0aGlzLnVwZGF0ZSA9IGZ1bmN0aW9uICggcmVuZGVyZXIsIHNjZW5lICkge1xuXG5cdFx0aWYgKCB0aGlzLnBhcmVudCA9PT0gbnVsbCApIHRoaXMudXBkYXRlTWF0cml4V29ybGQoKTtcblxuXHRcdHZhciByZW5kZXJUYXJnZXQgPSB0aGlzLnJlbmRlclRhcmdldDtcblx0XHR2YXIgZ2VuZXJhdGVNaXBtYXBzID0gcmVuZGVyVGFyZ2V0LnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzO1xuXG5cdFx0cmVuZGVyVGFyZ2V0LnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzID0gZmFsc2U7XG5cblx0XHRyZW5kZXJUYXJnZXQuYWN0aXZlQ3ViZUZhY2UgPSAwO1xuXHRcdHJlbmRlcmVyLnJlbmRlciggc2NlbmUsIGNhbWVyYVBYLCByZW5kZXJUYXJnZXQgKTtcblxuXHRcdHJlbmRlclRhcmdldC5hY3RpdmVDdWJlRmFjZSA9IDE7XG5cdFx0cmVuZGVyZXIucmVuZGVyKCBzY2VuZSwgY2FtZXJhTlgsIHJlbmRlclRhcmdldCApO1xuXG5cdFx0cmVuZGVyVGFyZ2V0LmFjdGl2ZUN1YmVGYWNlID0gMjtcblx0XHRyZW5kZXJlci5yZW5kZXIoIHNjZW5lLCBjYW1lcmFQWSwgcmVuZGVyVGFyZ2V0ICk7XG5cblx0XHRyZW5kZXJUYXJnZXQuYWN0aXZlQ3ViZUZhY2UgPSAzO1xuXHRcdHJlbmRlcmVyLnJlbmRlciggc2NlbmUsIGNhbWVyYU5ZLCByZW5kZXJUYXJnZXQgKTtcblxuXHRcdHJlbmRlclRhcmdldC5hY3RpdmVDdWJlRmFjZSA9IDQ7XG5cdFx0cmVuZGVyZXIucmVuZGVyKCBzY2VuZSwgY2FtZXJhUFosIHJlbmRlclRhcmdldCApO1xuXG5cdFx0cmVuZGVyVGFyZ2V0LnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzID0gZ2VuZXJhdGVNaXBtYXBzO1xuXG5cdFx0cmVuZGVyVGFyZ2V0LmFjdGl2ZUN1YmVGYWNlID0gNTtcblx0XHRyZW5kZXJlci5yZW5kZXIoIHNjZW5lLCBjYW1lcmFOWiwgcmVuZGVyVGFyZ2V0ICk7XG5cblx0XHRyZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoIG51bGwgKTtcblxuXHR9O1xuXG5cdHRoaXMuY2xlYXIgPSBmdW5jdGlvbiAoIHJlbmRlcmVyLCBjb2xvciwgZGVwdGgsIHN0ZW5jaWwgKSB7XG5cblx0XHR2YXIgcmVuZGVyVGFyZ2V0ID0gdGhpcy5yZW5kZXJUYXJnZXQ7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCA2OyBpICsrICkge1xuXG5cdFx0XHRyZW5kZXJUYXJnZXQuYWN0aXZlQ3ViZUZhY2UgPSBpO1xuXHRcdFx0cmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KCByZW5kZXJUYXJnZXQgKTtcblxuXHRcdFx0cmVuZGVyZXIuY2xlYXIoIGNvbG9yLCBkZXB0aCwgc3RlbmNpbCApO1xuXG5cdFx0fVxuXG5cdFx0cmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KCBudWxsICk7XG5cblx0fTtcblxufVxuXG5DdWJlQ2FtZXJhLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApO1xuQ3ViZUNhbWVyYS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDdWJlQ2FtZXJhO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gQXVkaW9MaXN0ZW5lcigpIHtcblxuXHRPYmplY3QzRC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0F1ZGlvTGlzdGVuZXInO1xuXG5cdHRoaXMuY29udGV4dCA9IEF1ZGlvQ29udGV4dC5nZXRDb250ZXh0KCk7XG5cblx0dGhpcy5nYWluID0gdGhpcy5jb250ZXh0LmNyZWF0ZUdhaW4oKTtcblx0dGhpcy5nYWluLmNvbm5lY3QoIHRoaXMuY29udGV4dC5kZXN0aW5hdGlvbiApO1xuXG5cdHRoaXMuZmlsdGVyID0gbnVsbDtcblxufVxuXG5BdWRpb0xpc3RlbmVyLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IEF1ZGlvTGlzdGVuZXIsXG5cblx0Z2V0SW5wdXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLmdhaW47XG5cblx0fSxcblxuXHRyZW1vdmVGaWx0ZXI6IGZ1bmN0aW9uICggKSB7XG5cblx0XHRpZiAoIHRoaXMuZmlsdGVyICE9PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLmdhaW4uZGlzY29ubmVjdCggdGhpcy5maWx0ZXIgKTtcblx0XHRcdHRoaXMuZmlsdGVyLmRpc2Nvbm5lY3QoIHRoaXMuY29udGV4dC5kZXN0aW5hdGlvbiApO1xuXHRcdFx0dGhpcy5nYWluLmNvbm5lY3QoIHRoaXMuY29udGV4dC5kZXN0aW5hdGlvbiApO1xuXHRcdFx0dGhpcy5maWx0ZXIgPSBudWxsO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0Z2V0RmlsdGVyOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5maWx0ZXI7XG5cblx0fSxcblxuXHRzZXRGaWx0ZXI6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRpZiAoIHRoaXMuZmlsdGVyICE9PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLmdhaW4uZGlzY29ubmVjdCggdGhpcy5maWx0ZXIgKTtcblx0XHRcdHRoaXMuZmlsdGVyLmRpc2Nvbm5lY3QoIHRoaXMuY29udGV4dC5kZXN0aW5hdGlvbiApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dGhpcy5nYWluLmRpc2Nvbm5lY3QoIHRoaXMuY29udGV4dC5kZXN0aW5hdGlvbiApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5maWx0ZXIgPSB2YWx1ZTtcblx0XHR0aGlzLmdhaW4uY29ubmVjdCggdGhpcy5maWx0ZXIgKTtcblx0XHR0aGlzLmZpbHRlci5jb25uZWN0KCB0aGlzLmNvbnRleHQuZGVzdGluYXRpb24gKTtcblxuXHR9LFxuXG5cdGdldE1hc3RlclZvbHVtZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZ2Fpbi5nYWluLnZhbHVlO1xuXG5cdH0sXG5cblx0c2V0TWFzdGVyVm9sdW1lOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5nYWluLmdhaW4uc2V0VGFyZ2V0QXRUaW1lKCB2YWx1ZSwgdGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lLCAwLjAxICk7XG5cblx0fSxcblxuXHR1cGRhdGVNYXRyaXhXb3JsZDogKCBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgcG9zaXRpb24gPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciBxdWF0ZXJuaW9uID0gbmV3IFF1YXRlcm5pb24oKTtcblx0XHR2YXIgc2NhbGUgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0dmFyIG9yaWVudGF0aW9uID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiB1cGRhdGVNYXRyaXhXb3JsZCggZm9yY2UgKSB7XG5cblx0XHRcdE9iamVjdDNELnByb3RvdHlwZS51cGRhdGVNYXRyaXhXb3JsZC5jYWxsKCB0aGlzLCBmb3JjZSApO1xuXG5cdFx0XHR2YXIgbGlzdGVuZXIgPSB0aGlzLmNvbnRleHQubGlzdGVuZXI7XG5cdFx0XHR2YXIgdXAgPSB0aGlzLnVwO1xuXG5cdFx0XHR0aGlzLm1hdHJpeFdvcmxkLmRlY29tcG9zZSggcG9zaXRpb24sIHF1YXRlcm5pb24sIHNjYWxlICk7XG5cblx0XHRcdG9yaWVudGF0aW9uLnNldCggMCwgMCwgLSAxICkuYXBwbHlRdWF0ZXJuaW9uKCBxdWF0ZXJuaW9uICk7XG5cblx0XHRcdGlmICggbGlzdGVuZXIucG9zaXRpb25YICkge1xuXG5cdFx0XHRcdGxpc3RlbmVyLnBvc2l0aW9uWC5zZXRWYWx1ZUF0VGltZSggcG9zaXRpb24ueCwgdGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lICk7XG5cdFx0XHRcdGxpc3RlbmVyLnBvc2l0aW9uWS5zZXRWYWx1ZUF0VGltZSggcG9zaXRpb24ueSwgdGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lICk7XG5cdFx0XHRcdGxpc3RlbmVyLnBvc2l0aW9uWi5zZXRWYWx1ZUF0VGltZSggcG9zaXRpb24ueiwgdGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lICk7XG5cdFx0XHRcdGxpc3RlbmVyLmZvcndhcmRYLnNldFZhbHVlQXRUaW1lKCBvcmllbnRhdGlvbi54LCB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUgKTtcblx0XHRcdFx0bGlzdGVuZXIuZm9yd2FyZFkuc2V0VmFsdWVBdFRpbWUoIG9yaWVudGF0aW9uLnksIHRoaXMuY29udGV4dC5jdXJyZW50VGltZSApO1xuXHRcdFx0XHRsaXN0ZW5lci5mb3J3YXJkWi5zZXRWYWx1ZUF0VGltZSggb3JpZW50YXRpb24ueiwgdGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lICk7XG5cdFx0XHRcdGxpc3RlbmVyLnVwWC5zZXRWYWx1ZUF0VGltZSggdXAueCwgdGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lICk7XG5cdFx0XHRcdGxpc3RlbmVyLnVwWS5zZXRWYWx1ZUF0VGltZSggdXAueSwgdGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lICk7XG5cdFx0XHRcdGxpc3RlbmVyLnVwWi5zZXRWYWx1ZUF0VGltZSggdXAueiwgdGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0bGlzdGVuZXIuc2V0UG9zaXRpb24oIHBvc2l0aW9uLngsIHBvc2l0aW9uLnksIHBvc2l0aW9uLnogKTtcblx0XHRcdFx0bGlzdGVuZXIuc2V0T3JpZW50YXRpb24oIG9yaWVudGF0aW9uLngsIG9yaWVudGF0aW9uLnksIG9yaWVudGF0aW9uLnosIHVwLngsIHVwLnksIHVwLnogKTtcblxuXHRcdFx0fVxuXG5cdFx0fTtcblxuXHR9ICkoKVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgUmVlY2UgQWFyb24gTGVjcml2YWluIC8gaHR0cDovL3JlZWNlbm90ZXMuY29tL1xuICovXG5cbmZ1bmN0aW9uIEF1ZGlvKCBsaXN0ZW5lciApIHtcblxuXHRPYmplY3QzRC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0F1ZGlvJztcblxuXHR0aGlzLmNvbnRleHQgPSBsaXN0ZW5lci5jb250ZXh0O1xuXG5cdHRoaXMuZ2FpbiA9IHRoaXMuY29udGV4dC5jcmVhdGVHYWluKCk7XG5cdHRoaXMuZ2Fpbi5jb25uZWN0KCBsaXN0ZW5lci5nZXRJbnB1dCgpICk7XG5cblx0dGhpcy5hdXRvcGxheSA9IGZhbHNlO1xuXG5cdHRoaXMuYnVmZmVyID0gbnVsbDtcblx0dGhpcy5sb29wID0gZmFsc2U7XG5cdHRoaXMuc3RhcnRUaW1lID0gMDtcblx0dGhpcy5vZmZzZXQgPSAwO1xuXHR0aGlzLnBsYXliYWNrUmF0ZSA9IDE7XG5cdHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XG5cdHRoaXMuaGFzUGxheWJhY2tDb250cm9sID0gdHJ1ZTtcblx0dGhpcy5zb3VyY2VUeXBlID0gJ2VtcHR5JztcblxuXHR0aGlzLmZpbHRlcnMgPSBbXTtcblxufVxuXG5BdWRpby5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBBdWRpbyxcblxuXHRnZXRPdXRwdXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLmdhaW47XG5cblx0fSxcblxuXHRzZXROb2RlU291cmNlOiBmdW5jdGlvbiAoIGF1ZGlvTm9kZSApIHtcblxuXHRcdHRoaXMuaGFzUGxheWJhY2tDb250cm9sID0gZmFsc2U7XG5cdFx0dGhpcy5zb3VyY2VUeXBlID0gJ2F1ZGlvTm9kZSc7XG5cdFx0dGhpcy5zb3VyY2UgPSBhdWRpb05vZGU7XG5cdFx0dGhpcy5jb25uZWN0KCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEJ1ZmZlcjogZnVuY3Rpb24gKCBhdWRpb0J1ZmZlciApIHtcblxuXHRcdHRoaXMuYnVmZmVyID0gYXVkaW9CdWZmZXI7XG5cdFx0dGhpcy5zb3VyY2VUeXBlID0gJ2J1ZmZlcic7XG5cblx0XHRpZiAoIHRoaXMuYXV0b3BsYXkgKSB0aGlzLnBsYXkoKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0cGxheTogZnVuY3Rpb24gKCkge1xuXG5cdFx0aWYgKCB0aGlzLmlzUGxheWluZyA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQXVkaW86IEF1ZGlvIGlzIGFscmVhZHkgcGxheWluZy4nICk7XG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHRpZiAoIHRoaXMuaGFzUGxheWJhY2tDb250cm9sID09PSBmYWxzZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQXVkaW86IHRoaXMgQXVkaW8gaGFzIG5vIHBsYXliYWNrIGNvbnRyb2wuJyApO1xuXHRcdFx0cmV0dXJuO1xuXG5cdFx0fVxuXG5cdFx0dmFyIHNvdXJjZSA9IHRoaXMuY29udGV4dC5jcmVhdGVCdWZmZXJTb3VyY2UoKTtcblxuXHRcdHNvdXJjZS5idWZmZXIgPSB0aGlzLmJ1ZmZlcjtcblx0XHRzb3VyY2UubG9vcCA9IHRoaXMubG9vcDtcblx0XHRzb3VyY2Uub25lbmRlZCA9IHRoaXMub25FbmRlZC5iaW5kKCB0aGlzICk7XG5cdFx0c291cmNlLnBsYXliYWNrUmF0ZS5zZXRWYWx1ZUF0VGltZSggdGhpcy5wbGF5YmFja1JhdGUsIHRoaXMuc3RhcnRUaW1lICk7XG5cdFx0dGhpcy5zdGFydFRpbWUgPSB0aGlzLmNvbnRleHQuY3VycmVudFRpbWU7XG5cdFx0c291cmNlLnN0YXJ0KCB0aGlzLnN0YXJ0VGltZSwgdGhpcy5vZmZzZXQgKTtcblxuXHRcdHRoaXMuaXNQbGF5aW5nID0gdHJ1ZTtcblxuXHRcdHRoaXMuc291cmNlID0gc291cmNlO1xuXG5cdFx0cmV0dXJuIHRoaXMuY29ubmVjdCgpO1xuXG5cdH0sXG5cblx0cGF1c2U6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGlmICggdGhpcy5oYXNQbGF5YmFja0NvbnRyb2wgPT09IGZhbHNlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5BdWRpbzogdGhpcyBBdWRpbyBoYXMgbm8gcGxheWJhY2sgY29udHJvbC4nICk7XG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHRpZiAoIHRoaXMuaXNQbGF5aW5nID09PSB0cnVlICkge1xuXG5cdFx0XHR0aGlzLnNvdXJjZS5zdG9wKCk7XG5cdFx0XHR0aGlzLm9mZnNldCArPSAoIHRoaXMuY29udGV4dC5jdXJyZW50VGltZSAtIHRoaXMuc3RhcnRUaW1lICkgKiB0aGlzLnBsYXliYWNrUmF0ZTtcblx0XHRcdHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHN0b3A6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGlmICggdGhpcy5oYXNQbGF5YmFja0NvbnRyb2wgPT09IGZhbHNlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5BdWRpbzogdGhpcyBBdWRpbyBoYXMgbm8gcGxheWJhY2sgY29udHJvbC4nICk7XG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHR0aGlzLnNvdXJjZS5zdG9wKCk7XG5cdFx0dGhpcy5vZmZzZXQgPSAwO1xuXHRcdHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvbm5lY3Q6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGlmICggdGhpcy5maWx0ZXJzLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdHRoaXMuc291cmNlLmNvbm5lY3QoIHRoaXMuZmlsdGVyc1sgMCBdICk7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMSwgbCA9IHRoaXMuZmlsdGVycy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdHRoaXMuZmlsdGVyc1sgaSAtIDEgXS5jb25uZWN0KCB0aGlzLmZpbHRlcnNbIGkgXSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuZmlsdGVyc1sgdGhpcy5maWx0ZXJzLmxlbmd0aCAtIDEgXS5jb25uZWN0KCB0aGlzLmdldE91dHB1dCgpICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR0aGlzLnNvdXJjZS5jb25uZWN0KCB0aGlzLmdldE91dHB1dCgpICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGRpc2Nvbm5lY3Q6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGlmICggdGhpcy5maWx0ZXJzLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdHRoaXMuc291cmNlLmRpc2Nvbm5lY3QoIHRoaXMuZmlsdGVyc1sgMCBdICk7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMSwgbCA9IHRoaXMuZmlsdGVycy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdHRoaXMuZmlsdGVyc1sgaSAtIDEgXS5kaXNjb25uZWN0KCB0aGlzLmZpbHRlcnNbIGkgXSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuZmlsdGVyc1sgdGhpcy5maWx0ZXJzLmxlbmd0aCAtIDEgXS5kaXNjb25uZWN0KCB0aGlzLmdldE91dHB1dCgpICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR0aGlzLnNvdXJjZS5kaXNjb25uZWN0KCB0aGlzLmdldE91dHB1dCgpICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGdldEZpbHRlcnM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLmZpbHRlcnM7XG5cblx0fSxcblxuXHRzZXRGaWx0ZXJzOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0aWYgKCAhIHZhbHVlICkgdmFsdWUgPSBbXTtcblxuXHRcdGlmICggdGhpcy5pc1BsYXlpbmcgPT09IHRydWUgKSB7XG5cblx0XHRcdHRoaXMuZGlzY29ubmVjdCgpO1xuXHRcdFx0dGhpcy5maWx0ZXJzID0gdmFsdWU7XG5cdFx0XHR0aGlzLmNvbm5lY3QoKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHRoaXMuZmlsdGVycyA9IHZhbHVlO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRnZXRGaWx0ZXI6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLmdldEZpbHRlcnMoKVsgMCBdO1xuXG5cdH0sXG5cblx0c2V0RmlsdGVyOiBmdW5jdGlvbiAoIGZpbHRlciApIHtcblxuXHRcdHJldHVybiB0aGlzLnNldEZpbHRlcnMoIGZpbHRlciA/IFsgZmlsdGVyIF0gOiBbXSApO1xuXG5cdH0sXG5cblx0c2V0UGxheWJhY2tSYXRlOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0aWYgKCB0aGlzLmhhc1BsYXliYWNrQ29udHJvbCA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLicgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdHRoaXMucGxheWJhY2tSYXRlID0gdmFsdWU7XG5cblx0XHRpZiAoIHRoaXMuaXNQbGF5aW5nID09PSB0cnVlICkge1xuXG5cdFx0XHR0aGlzLnNvdXJjZS5wbGF5YmFja1JhdGUuc2V0VmFsdWVBdFRpbWUoIHRoaXMucGxheWJhY2tSYXRlLCB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Z2V0UGxheWJhY2tSYXRlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5wbGF5YmFja1JhdGU7XG5cblx0fSxcblxuXHRvbkVuZGVkOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLmlzUGxheWluZyA9IGZhbHNlO1xuXG5cdH0sXG5cblx0Z2V0TG9vcDogZnVuY3Rpb24gKCkge1xuXG5cdFx0aWYgKCB0aGlzLmhhc1BsYXliYWNrQ29udHJvbCA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLicgKTtcblx0XHRcdHJldHVybiBmYWxzZTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmxvb3A7XG5cblx0fSxcblxuXHRzZXRMb29wOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0aWYgKCB0aGlzLmhhc1BsYXliYWNrQ29udHJvbCA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLicgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdHRoaXMubG9vcCA9IHZhbHVlO1xuXG5cdFx0aWYgKCB0aGlzLmlzUGxheWluZyA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0dGhpcy5zb3VyY2UubG9vcCA9IHRoaXMubG9vcDtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Z2V0Vm9sdW1lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5nYWluLmdhaW4udmFsdWU7XG5cblx0fSxcblxuXHRzZXRWb2x1bWU6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLmdhaW4uZ2Fpbi5zZXRUYXJnZXRBdFRpbWUoIHZhbHVlLCB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUsIDAuMDEgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gUG9zaXRpb25hbEF1ZGlvKCBsaXN0ZW5lciApIHtcblxuXHRBdWRpby5jYWxsKCB0aGlzLCBsaXN0ZW5lciApO1xuXG5cdHRoaXMucGFubmVyID0gdGhpcy5jb250ZXh0LmNyZWF0ZVBhbm5lcigpO1xuXHR0aGlzLnBhbm5lci5jb25uZWN0KCB0aGlzLmdhaW4gKTtcblxufVxuXG5Qb3NpdGlvbmFsQXVkaW8ucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggQXVkaW8ucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogUG9zaXRpb25hbEF1ZGlvLFxuXG5cdGdldE91dHB1dDogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMucGFubmVyO1xuXG5cdH0sXG5cblx0Z2V0UmVmRGlzdGFuY2U6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLnBhbm5lci5yZWZEaXN0YW5jZTtcblxuXHR9LFxuXG5cdHNldFJlZkRpc3RhbmNlOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5wYW5uZXIucmVmRGlzdGFuY2UgPSB2YWx1ZTtcblxuXHR9LFxuXG5cdGdldFJvbGxvZmZGYWN0b3I6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLnBhbm5lci5yb2xsb2ZmRmFjdG9yO1xuXG5cdH0sXG5cblx0c2V0Um9sbG9mZkZhY3RvcjogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMucGFubmVyLnJvbGxvZmZGYWN0b3IgPSB2YWx1ZTtcblxuXHR9LFxuXG5cdGdldERpc3RhbmNlTW9kZWw6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLnBhbm5lci5kaXN0YW5jZU1vZGVsO1xuXG5cdH0sXG5cblx0c2V0RGlzdGFuY2VNb2RlbDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMucGFubmVyLmRpc3RhbmNlTW9kZWwgPSB2YWx1ZTtcblxuXHR9LFxuXG5cdGdldE1heERpc3RhbmNlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5wYW5uZXIubWF4RGlzdGFuY2U7XG5cblx0fSxcblxuXHRzZXRNYXhEaXN0YW5jZTogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMucGFubmVyLm1heERpc3RhbmNlID0gdmFsdWU7XG5cblx0fSxcblxuXHR1cGRhdGVNYXRyaXhXb3JsZDogKCBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgcG9zaXRpb24gPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZU1hdHJpeFdvcmxkKCBmb3JjZSApIHtcblxuXHRcdFx0T2JqZWN0M0QucHJvdG90eXBlLnVwZGF0ZU1hdHJpeFdvcmxkLmNhbGwoIHRoaXMsIGZvcmNlICk7XG5cblx0XHRcdHBvc2l0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbiggdGhpcy5tYXRyaXhXb3JsZCApO1xuXG5cdFx0XHR0aGlzLnBhbm5lci5zZXRQb3NpdGlvbiggcG9zaXRpb24ueCwgcG9zaXRpb24ueSwgcG9zaXRpb24ueiApO1xuXG5cdFx0fTtcblxuXHR9ICkoKVxuXG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIEF1ZGlvQW5hbHlzZXIoIGF1ZGlvLCBmZnRTaXplICkge1xuXG5cdHRoaXMuYW5hbHlzZXIgPSBhdWRpby5jb250ZXh0LmNyZWF0ZUFuYWx5c2VyKCk7XG5cdHRoaXMuYW5hbHlzZXIuZmZ0U2l6ZSA9IGZmdFNpemUgIT09IHVuZGVmaW5lZCA/IGZmdFNpemUgOiAyMDQ4O1xuXG5cdHRoaXMuZGF0YSA9IG5ldyBVaW50OEFycmF5KCB0aGlzLmFuYWx5c2VyLmZyZXF1ZW5jeUJpbkNvdW50ICk7XG5cblx0YXVkaW8uZ2V0T3V0cHV0KCkuY29ubmVjdCggdGhpcy5hbmFseXNlciApO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIEF1ZGlvQW5hbHlzZXIucHJvdG90eXBlLCB7XG5cblx0Z2V0RnJlcXVlbmN5RGF0YTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5hbmFseXNlci5nZXRCeXRlRnJlcXVlbmN5RGF0YSggdGhpcy5kYXRhICk7XG5cblx0XHRyZXR1cm4gdGhpcy5kYXRhO1xuXG5cdH0sXG5cblx0Z2V0QXZlcmFnZUZyZXF1ZW5jeTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHZhbHVlID0gMCwgZGF0YSA9IHRoaXMuZ2V0RnJlcXVlbmN5RGF0YSgpO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdHZhbHVlICs9IGRhdGFbIGkgXTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB2YWx1ZSAvIGRhdGEubGVuZ3RoO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqXG4gKiBCdWZmZXJlZCBzY2VuZSBncmFwaCBwcm9wZXJ0eSB0aGF0IGFsbG93cyB3ZWlnaHRlZCBhY2N1bXVsYXRpb24uXG4gKlxuICpcbiAqIEBhdXRob3IgQmVuIEhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8vXG4gKiBAYXV0aG9yIERhdmlkIFNhcm5vIC8gaHR0cDovL2xpZ2h0aGF1cy51cy9cbiAqIEBhdXRob3IgdHNjaHdcbiAqL1xuXG5mdW5jdGlvbiBQcm9wZXJ0eU1peGVyKCBiaW5kaW5nLCB0eXBlTmFtZSwgdmFsdWVTaXplICkge1xuXG5cdHRoaXMuYmluZGluZyA9IGJpbmRpbmc7XG5cdHRoaXMudmFsdWVTaXplID0gdmFsdWVTaXplO1xuXG5cdHZhciBidWZmZXJUeXBlID0gRmxvYXQ2NEFycmF5LFxuXHRcdG1peEZ1bmN0aW9uO1xuXG5cdHN3aXRjaCAoIHR5cGVOYW1lICkge1xuXG5cdFx0Y2FzZSAncXVhdGVybmlvbic6XG5cdFx0XHRtaXhGdW5jdGlvbiA9IHRoaXMuX3NsZXJwO1xuXHRcdFx0YnJlYWs7XG5cblx0XHRjYXNlICdzdHJpbmcnOlxuXHRcdGNhc2UgJ2Jvb2wnOlxuXHRcdFx0YnVmZmVyVHlwZSA9IEFycmF5O1xuXHRcdFx0bWl4RnVuY3Rpb24gPSB0aGlzLl9zZWxlY3Q7XG5cdFx0XHRicmVhaztcblxuXHRcdGRlZmF1bHQ6XG5cdFx0XHRtaXhGdW5jdGlvbiA9IHRoaXMuX2xlcnA7XG5cblx0fVxuXG5cdHRoaXMuYnVmZmVyID0gbmV3IGJ1ZmZlclR5cGUoIHZhbHVlU2l6ZSAqIDQgKTtcblx0Ly8gbGF5b3V0OiBbIGluY29taW5nIHwgYWNjdTAgfCBhY2N1MSB8IG9yaWcgXVxuXHQvL1xuXHQvLyBpbnRlcnBvbGF0b3JzIGNhbiB1c2UgLmJ1ZmZlciBhcyB0aGVpciAucmVzdWx0XG5cdC8vIHRoZSBkYXRhIHRoZW4gZ29lcyB0byAnaW5jb21pbmcnXG5cdC8vXG5cdC8vICdhY2N1MCcgYW5kICdhY2N1MScgYXJlIHVzZWQgZnJhbWUtaW50ZXJsZWF2ZWQgZm9yXG5cdC8vIHRoZSBjdW11bGF0aXZlIHJlc3VsdCBhbmQgYXJlIGNvbXBhcmVkIHRvIGRldGVjdFxuXHQvLyBjaGFuZ2VzXG5cdC8vXG5cdC8vICdvcmlnJyBzdG9yZXMgdGhlIG9yaWdpbmFsIHN0YXRlIG9mIHRoZSBwcm9wZXJ0eVxuXG5cdHRoaXMuX21peEJ1ZmZlclJlZ2lvbiA9IG1peEZ1bmN0aW9uO1xuXG5cdHRoaXMuY3VtdWxhdGl2ZVdlaWdodCA9IDA7XG5cblx0dGhpcy51c2VDb3VudCA9IDA7XG5cdHRoaXMucmVmZXJlbmNlQ291bnQgPSAwO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIFByb3BlcnR5TWl4ZXIucHJvdG90eXBlLCB7XG5cblx0Ly8gYWNjdW11bGF0ZSBkYXRhIGluIHRoZSAnaW5jb21pbmcnIHJlZ2lvbiBpbnRvICdhY2N1PGk+J1xuXHRhY2N1bXVsYXRlOiBmdW5jdGlvbiAoIGFjY3VJbmRleCwgd2VpZ2h0ICkge1xuXG5cdFx0Ly8gbm90ZTogaGFwcGlseSBhY2N1bXVsYXRpbmcgbm90aGluZyB3aGVuIHdlaWdodCA9IDAsIHRoZSBjYWxsZXIga25vd3Ncblx0XHQvLyB0aGUgd2VpZ2h0IGFuZCBzaG91bGRuJ3QgaGF2ZSBtYWRlIHRoZSBjYWxsIGluIHRoZSBmaXJzdCBwbGFjZVxuXG5cdFx0dmFyIGJ1ZmZlciA9IHRoaXMuYnVmZmVyLFxuXHRcdFx0c3RyaWRlID0gdGhpcy52YWx1ZVNpemUsXG5cdFx0XHRvZmZzZXQgPSBhY2N1SW5kZXggKiBzdHJpZGUgKyBzdHJpZGUsXG5cblx0XHRcdGN1cnJlbnRXZWlnaHQgPSB0aGlzLmN1bXVsYXRpdmVXZWlnaHQ7XG5cblx0XHRpZiAoIGN1cnJlbnRXZWlnaHQgPT09IDAgKSB7XG5cblx0XHRcdC8vIGFjY3VOIDo9IGluY29taW5nICogd2VpZ2h0XG5cblx0XHRcdGZvciAoIHZhciBpID0gMDsgaSAhPT0gc3RyaWRlOyArKyBpICkge1xuXG5cdFx0XHRcdGJ1ZmZlclsgb2Zmc2V0ICsgaSBdID0gYnVmZmVyWyBpIF07XG5cblx0XHRcdH1cblxuXHRcdFx0Y3VycmVudFdlaWdodCA9IHdlaWdodDtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIGFjY3VOIDo9IGFjY3VOICsgaW5jb21pbmcgKiB3ZWlnaHRcblxuXHRcdFx0Y3VycmVudFdlaWdodCArPSB3ZWlnaHQ7XG5cdFx0XHR2YXIgbWl4ID0gd2VpZ2h0IC8gY3VycmVudFdlaWdodDtcblx0XHRcdHRoaXMuX21peEJ1ZmZlclJlZ2lvbiggYnVmZmVyLCBvZmZzZXQsIDAsIG1peCwgc3RyaWRlICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLmN1bXVsYXRpdmVXZWlnaHQgPSBjdXJyZW50V2VpZ2h0O1xuXG5cdH0sXG5cblx0Ly8gYXBwbHkgdGhlIHN0YXRlIG9mICdhY2N1PGk+JyB0byB0aGUgYmluZGluZyB3aGVuIGFjY3VzIGRpZmZlclxuXHRhcHBseTogZnVuY3Rpb24gKCBhY2N1SW5kZXggKSB7XG5cblx0XHR2YXIgc3RyaWRlID0gdGhpcy52YWx1ZVNpemUsXG5cdFx0XHRidWZmZXIgPSB0aGlzLmJ1ZmZlcixcblx0XHRcdG9mZnNldCA9IGFjY3VJbmRleCAqIHN0cmlkZSArIHN0cmlkZSxcblxuXHRcdFx0d2VpZ2h0ID0gdGhpcy5jdW11bGF0aXZlV2VpZ2h0LFxuXG5cdFx0XHRiaW5kaW5nID0gdGhpcy5iaW5kaW5nO1xuXG5cdFx0dGhpcy5jdW11bGF0aXZlV2VpZ2h0ID0gMDtcblxuXHRcdGlmICggd2VpZ2h0IDwgMSApIHtcblxuXHRcdFx0Ly8gYWNjdU4gOj0gYWNjdU4gKyBvcmlnaW5hbCAqICggMSAtIGN1bXVsYXRpdmVXZWlnaHQgKVxuXG5cdFx0XHR2YXIgb3JpZ2luYWxWYWx1ZU9mZnNldCA9IHN0cmlkZSAqIDM7XG5cblx0XHRcdHRoaXMuX21peEJ1ZmZlclJlZ2lvbihcblx0XHRcdFx0YnVmZmVyLCBvZmZzZXQsIG9yaWdpbmFsVmFsdWVPZmZzZXQsIDEgLSB3ZWlnaHQsIHN0cmlkZSApO1xuXG5cdFx0fVxuXG5cdFx0Zm9yICggdmFyIGkgPSBzdHJpZGUsIGUgPSBzdHJpZGUgKyBzdHJpZGU7IGkgIT09IGU7ICsrIGkgKSB7XG5cblx0XHRcdGlmICggYnVmZmVyWyBpIF0gIT09IGJ1ZmZlclsgaSArIHN0cmlkZSBdICkge1xuXG5cdFx0XHRcdC8vIHZhbHVlIGhhcyBjaGFuZ2VkIC0+IHVwZGF0ZSBzY2VuZSBncmFwaFxuXG5cdFx0XHRcdGJpbmRpbmcuc2V0VmFsdWUoIGJ1ZmZlciwgb2Zmc2V0ICk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fSxcblxuXHQvLyByZW1lbWJlciB0aGUgc3RhdGUgb2YgdGhlIGJvdW5kIHByb3BlcnR5IGFuZCBjb3B5IGl0IHRvIGJvdGggYWNjdXNcblx0c2F2ZU9yaWdpbmFsU3RhdGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBiaW5kaW5nID0gdGhpcy5iaW5kaW5nO1xuXG5cdFx0dmFyIGJ1ZmZlciA9IHRoaXMuYnVmZmVyLFxuXHRcdFx0c3RyaWRlID0gdGhpcy52YWx1ZVNpemUsXG5cblx0XHRcdG9yaWdpbmFsVmFsdWVPZmZzZXQgPSBzdHJpZGUgKiAzO1xuXG5cdFx0YmluZGluZy5nZXRWYWx1ZSggYnVmZmVyLCBvcmlnaW5hbFZhbHVlT2Zmc2V0ICk7XG5cblx0XHQvLyBhY2N1WzAuLjFdIDo9IG9yaWcgLS0gaW5pdGlhbGx5IGRldGVjdCBjaGFuZ2VzIGFnYWluc3QgdGhlIG9yaWdpbmFsXG5cdFx0Zm9yICggdmFyIGkgPSBzdHJpZGUsIGUgPSBvcmlnaW5hbFZhbHVlT2Zmc2V0OyBpICE9PSBlOyArKyBpICkge1xuXG5cdFx0XHRidWZmZXJbIGkgXSA9IGJ1ZmZlclsgb3JpZ2luYWxWYWx1ZU9mZnNldCArICggaSAlIHN0cmlkZSApIF07XG5cblx0XHR9XG5cblx0XHR0aGlzLmN1bXVsYXRpdmVXZWlnaHQgPSAwO1xuXG5cdH0sXG5cblx0Ly8gYXBwbHkgdGhlIHN0YXRlIHByZXZpb3VzbHkgdGFrZW4gdmlhICdzYXZlT3JpZ2luYWxTdGF0ZScgdG8gdGhlIGJpbmRpbmdcblx0cmVzdG9yZU9yaWdpbmFsU3RhdGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBvcmlnaW5hbFZhbHVlT2Zmc2V0ID0gdGhpcy52YWx1ZVNpemUgKiAzO1xuXHRcdHRoaXMuYmluZGluZy5zZXRWYWx1ZSggdGhpcy5idWZmZXIsIG9yaWdpbmFsVmFsdWVPZmZzZXQgKTtcblxuXHR9LFxuXG5cblx0Ly8gbWl4IGZ1bmN0aW9uc1xuXG5cdF9zZWxlY3Q6IGZ1bmN0aW9uICggYnVmZmVyLCBkc3RPZmZzZXQsIHNyY09mZnNldCwgdCwgc3RyaWRlICkge1xuXG5cdFx0aWYgKCB0ID49IDAuNSApIHtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpICE9PSBzdHJpZGU7ICsrIGkgKSB7XG5cblx0XHRcdFx0YnVmZmVyWyBkc3RPZmZzZXQgKyBpIF0gPSBidWZmZXJbIHNyY09mZnNldCArIGkgXTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH0sXG5cblx0X3NsZXJwOiBmdW5jdGlvbiAoIGJ1ZmZlciwgZHN0T2Zmc2V0LCBzcmNPZmZzZXQsIHQgKSB7XG5cblx0XHRRdWF0ZXJuaW9uLnNsZXJwRmxhdCggYnVmZmVyLCBkc3RPZmZzZXQsIGJ1ZmZlciwgZHN0T2Zmc2V0LCBidWZmZXIsIHNyY09mZnNldCwgdCApO1xuXG5cdH0sXG5cblx0X2xlcnA6IGZ1bmN0aW9uICggYnVmZmVyLCBkc3RPZmZzZXQsIHNyY09mZnNldCwgdCwgc3RyaWRlICkge1xuXG5cdFx0dmFyIHMgPSAxIC0gdDtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSAhPT0gc3RyaWRlOyArKyBpICkge1xuXG5cdFx0XHR2YXIgaiA9IGRzdE9mZnNldCArIGk7XG5cblx0XHRcdGJ1ZmZlclsgaiBdID0gYnVmZmVyWyBqIF0gKiBzICsgYnVmZmVyWyBzcmNPZmZzZXQgKyBpIF0gKiB0O1xuXG5cdFx0fVxuXG5cdH1cblxufSApO1xuXG4vKipcbiAqXG4gKiBBIHJlZmVyZW5jZSB0byBhIHJlYWwgcHJvcGVydHkgaW4gdGhlIHNjZW5lIGdyYXBoLlxuICpcbiAqXG4gKiBAYXV0aG9yIEJlbiBIb3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvL1xuICogQGF1dGhvciBEYXZpZCBTYXJubyAvIGh0dHA6Ly9saWdodGhhdXMudXMvXG4gKiBAYXV0aG9yIHRzY2h3XG4gKi9cblxuLy8gQ2hhcmFjdGVycyBbXS46LyBhcmUgcmVzZXJ2ZWQgZm9yIHRyYWNrIGJpbmRpbmcgc3ludGF4LlxudmFyIFJFU0VSVkVEX0NIQVJTX1JFID0gJ1xcXFxbXFxcXF1cXFxcLjpcXFxcLyc7XG5cbmZ1bmN0aW9uIENvbXBvc2l0ZSggdGFyZ2V0R3JvdXAsIHBhdGgsIG9wdGlvbmFsUGFyc2VkUGF0aCApIHtcblxuXHR2YXIgcGFyc2VkUGF0aCA9IG9wdGlvbmFsUGFyc2VkUGF0aCB8fCBQcm9wZXJ0eUJpbmRpbmcucGFyc2VUcmFja05hbWUoIHBhdGggKTtcblxuXHR0aGlzLl90YXJnZXRHcm91cCA9IHRhcmdldEdyb3VwO1xuXHR0aGlzLl9iaW5kaW5ncyA9IHRhcmdldEdyb3VwLnN1YnNjcmliZV8oIHBhdGgsIHBhcnNlZFBhdGggKTtcblxufVxuXG5PYmplY3QuYXNzaWduKCBDb21wb3NpdGUucHJvdG90eXBlLCB7XG5cblx0Z2V0VmFsdWU6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCApIHtcblxuXHRcdHRoaXMuYmluZCgpOyAvLyBiaW5kIGFsbCBiaW5kaW5nXG5cblx0XHR2YXIgZmlyc3RWYWxpZEluZGV4ID0gdGhpcy5fdGFyZ2V0R3JvdXAubkNhY2hlZE9iamVjdHNfLFxuXHRcdFx0YmluZGluZyA9IHRoaXMuX2JpbmRpbmdzWyBmaXJzdFZhbGlkSW5kZXggXTtcblxuXHRcdC8vIGFuZCBvbmx5IGNhbGwgLmdldFZhbHVlIG9uIHRoZSBmaXJzdFxuXHRcdGlmICggYmluZGluZyAhPT0gdW5kZWZpbmVkICkgYmluZGluZy5nZXRWYWx1ZSggYXJyYXksIG9mZnNldCApO1xuXG5cdH0sXG5cblx0c2V0VmFsdWU6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCApIHtcblxuXHRcdHZhciBiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzO1xuXG5cdFx0Zm9yICggdmFyIGkgPSB0aGlzLl90YXJnZXRHcm91cC5uQ2FjaGVkT2JqZWN0c18sXG5cdFx0XHRcdCAgbiA9IGJpbmRpbmdzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0YmluZGluZ3NbIGkgXS5zZXRWYWx1ZSggYXJyYXksIG9mZnNldCApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0YmluZDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGJpbmRpbmdzID0gdGhpcy5fYmluZGluZ3M7XG5cblx0XHRmb3IgKCB2YXIgaSA9IHRoaXMuX3RhcmdldEdyb3VwLm5DYWNoZWRPYmplY3RzXyxcblx0XHRcdFx0ICBuID0gYmluZGluZ3MubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHRiaW5kaW5nc1sgaSBdLmJpbmQoKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdHVuYmluZDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGJpbmRpbmdzID0gdGhpcy5fYmluZGluZ3M7XG5cblx0XHRmb3IgKCB2YXIgaSA9IHRoaXMuX3RhcmdldEdyb3VwLm5DYWNoZWRPYmplY3RzXyxcblx0XHRcdFx0ICBuID0gYmluZGluZ3MubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHRiaW5kaW5nc1sgaSBdLnVuYmluZCgpO1xuXG5cdFx0fVxuXG5cdH1cblxufSApO1xuXG5cbmZ1bmN0aW9uIFByb3BlcnR5QmluZGluZyggcm9vdE5vZGUsIHBhdGgsIHBhcnNlZFBhdGggKSB7XG5cblx0dGhpcy5wYXRoID0gcGF0aDtcblx0dGhpcy5wYXJzZWRQYXRoID0gcGFyc2VkUGF0aCB8fCBQcm9wZXJ0eUJpbmRpbmcucGFyc2VUcmFja05hbWUoIHBhdGggKTtcblxuXHR0aGlzLm5vZGUgPSBQcm9wZXJ0eUJpbmRpbmcuZmluZE5vZGUoIHJvb3ROb2RlLCB0aGlzLnBhcnNlZFBhdGgubm9kZU5hbWUgKSB8fCByb290Tm9kZTtcblxuXHR0aGlzLnJvb3ROb2RlID0gcm9vdE5vZGU7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggUHJvcGVydHlCaW5kaW5nLCB7XG5cblx0Q29tcG9zaXRlOiBDb21wb3NpdGUsXG5cblx0Y3JlYXRlOiBmdW5jdGlvbiAoIHJvb3QsIHBhdGgsIHBhcnNlZFBhdGggKSB7XG5cblx0XHRpZiAoICEgKCByb290ICYmIHJvb3QuaXNBbmltYXRpb25PYmplY3RHcm91cCApICkge1xuXG5cdFx0XHRyZXR1cm4gbmV3IFByb3BlcnR5QmluZGluZyggcm9vdCwgcGF0aCwgcGFyc2VkUGF0aCApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0cmV0dXJuIG5ldyBQcm9wZXJ0eUJpbmRpbmcuQ29tcG9zaXRlKCByb290LCBwYXRoLCBwYXJzZWRQYXRoICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHQvKipcblx0ICogUmVwbGFjZXMgc3BhY2VzIHdpdGggdW5kZXJzY29yZXMgYW5kIHJlbW92ZXMgdW5zdXBwb3J0ZWQgY2hhcmFjdGVycyBmcm9tXG5cdCAqIG5vZGUgbmFtZXMsIHRvIGVuc3VyZSBjb21wYXRpYmlsaXR5IHdpdGggcGFyc2VUcmFja05hbWUoKS5cblx0ICpcblx0ICogQHBhcmFtICB7c3RyaW5nfSBuYW1lIE5vZGUgbmFtZSB0byBiZSBzYW5pdGl6ZWQuXG5cdCAqIEByZXR1cm4ge3N0cmluZ31cblx0ICovXG5cdHNhbml0aXplTm9kZU5hbWU6ICggZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHJlc2VydmVkUmUgPSBuZXcgUmVnRXhwKCAnWycgKyBSRVNFUlZFRF9DSEFSU19SRSArICddJywgJ2cnICk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gc2FuaXRpemVOb2RlTmFtZSggbmFtZSApIHtcblxuXHRcdFx0cmV0dXJuIG5hbWUucmVwbGFjZSggL1xccy9nLCAnXycgKS5yZXBsYWNlKCByZXNlcnZlZFJlLCAnJyApO1xuXG5cdFx0fTtcblxuXHR9KCkgKSxcblxuXHRwYXJzZVRyYWNrTmFtZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gQXR0ZW1wdHMgdG8gYWxsb3cgbm9kZSBuYW1lcyBmcm9tIGFueSBsYW5ndWFnZS4gRVM1J3MgYFxcd2AgcmVnZXhwIG1hdGNoZXNcblx0XHQvLyBvbmx5IGxhdGluIGNoYXJhY3RlcnMsIGFuZCB0aGUgdW5pY29kZSBcXHB7TH0gaXMgbm90IHlldCBzdXBwb3J0ZWQuIFNvXG5cdFx0Ly8gaW5zdGVhZCwgd2UgZXhjbHVkZSByZXNlcnZlZCBjaGFyYWN0ZXJzIGFuZCBtYXRjaCBldmVyeXRoaW5nIGVsc2UuXG5cdFx0dmFyIHdvcmRDaGFyID0gJ1teJyArIFJFU0VSVkVEX0NIQVJTX1JFICsgJ10nO1xuXHRcdHZhciB3b3JkQ2hhck9yRG90ID0gJ1teJyArIFJFU0VSVkVEX0NIQVJTX1JFLnJlcGxhY2UoICdcXFxcLicsICcnICkgKyAnXSc7XG5cblx0XHQvLyBQYXJlbnQgZGlyZWN0b3JpZXMsIGRlbGltaXRlZCBieSAnLycgb3IgJzonLiBDdXJyZW50bHkgdW51c2VkLCBidXQgbXVzdFxuXHRcdC8vIGJlIG1hdGNoZWQgdG8gcGFyc2UgdGhlIHJlc3Qgb2YgdGhlIHRyYWNrIG5hbWUuXG5cdFx0dmFyIGRpcmVjdG9yeVJlID0gLygoPzpXQytbXFwvOl0pKikvLnNvdXJjZS5yZXBsYWNlKCAnV0MnLCB3b3JkQ2hhciApO1xuXG5cdFx0Ly8gVGFyZ2V0IG5vZGUuIE1heSBjb250YWluIHdvcmQgY2hhcmFjdGVycyAoYS16QS1aMC05XykgYW5kICcuJyBvciAnLScuXG5cdFx0dmFyIG5vZGVSZSA9IC8oV0NPRCspPy8uc291cmNlLnJlcGxhY2UoICdXQ09EJywgd29yZENoYXJPckRvdCApO1xuXG5cdFx0Ly8gT2JqZWN0IG9uIHRhcmdldCBub2RlLCBhbmQgYWNjZXNzb3IuIE1heSBub3QgY29udGFpbiByZXNlcnZlZFxuXHRcdC8vIGNoYXJhY3RlcnMuIEFjY2Vzc29yIG1heSBjb250YWluIGFueSBjaGFyYWN0ZXIgZXhjZXB0IGNsb3NpbmcgYnJhY2tldC5cblx0XHR2YXIgb2JqZWN0UmUgPSAvKD86XFwuKFdDKykoPzpcXFsoLispXFxdKT8pPy8uc291cmNlLnJlcGxhY2UoICdXQycsIHdvcmRDaGFyICk7XG5cblx0XHQvLyBQcm9wZXJ0eSBhbmQgYWNjZXNzb3IuIE1heSBub3QgY29udGFpbiByZXNlcnZlZCBjaGFyYWN0ZXJzLiBBY2Nlc3NvciBtYXlcblx0XHQvLyBjb250YWluIGFueSBub24tYnJhY2tldCBjaGFyYWN0ZXJzLlxuXHRcdHZhciBwcm9wZXJ0eVJlID0gL1xcLihXQyspKD86XFxbKC4rKVxcXSk/Ly5zb3VyY2UucmVwbGFjZSggJ1dDJywgd29yZENoYXIgKTtcblxuXHRcdHZhciB0cmFja1JlID0gbmV3IFJlZ0V4cCggJydcblx0XHRcdCsgJ14nXG5cdFx0XHQrIGRpcmVjdG9yeVJlXG5cdFx0XHQrIG5vZGVSZVxuXHRcdFx0KyBvYmplY3RSZVxuXHRcdFx0KyBwcm9wZXJ0eVJlXG5cdFx0XHQrICckJ1xuXHRcdCk7XG5cblx0XHR2YXIgc3VwcG9ydGVkT2JqZWN0TmFtZXMgPSBbICdtYXRlcmlhbCcsICdtYXRlcmlhbHMnLCAnYm9uZXMnIF07XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gcGFyc2VUcmFja05hbWUoIHRyYWNrTmFtZSApIHtcblxuXHRcdFx0dmFyIG1hdGNoZXMgPSB0cmFja1JlLmV4ZWMoIHRyYWNrTmFtZSApO1xuXG5cdFx0XHRpZiAoICEgbWF0Y2hlcyApIHtcblxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoICdQcm9wZXJ0eUJpbmRpbmc6IENhbm5vdCBwYXJzZSB0cmFja05hbWU6ICcgKyB0cmFja05hbWUgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgcmVzdWx0cyA9IHtcblx0XHRcdFx0Ly8gZGlyZWN0b3J5TmFtZTogbWF0Y2hlc1sgMSBdLCAvLyAodHNjaHcpIGN1cnJlbnRseSB1bnVzZWRcblx0XHRcdFx0bm9kZU5hbWU6IG1hdGNoZXNbIDIgXSxcblx0XHRcdFx0b2JqZWN0TmFtZTogbWF0Y2hlc1sgMyBdLFxuXHRcdFx0XHRvYmplY3RJbmRleDogbWF0Y2hlc1sgNCBdLFxuXHRcdFx0XHRwcm9wZXJ0eU5hbWU6IG1hdGNoZXNbIDUgXSwgLy8gcmVxdWlyZWRcblx0XHRcdFx0cHJvcGVydHlJbmRleDogbWF0Y2hlc1sgNiBdXG5cdFx0XHR9O1xuXG5cdFx0XHR2YXIgbGFzdERvdCA9IHJlc3VsdHMubm9kZU5hbWUgJiYgcmVzdWx0cy5ub2RlTmFtZS5sYXN0SW5kZXhPZiggJy4nICk7XG5cblx0XHRcdGlmICggbGFzdERvdCAhPT0gdW5kZWZpbmVkICYmIGxhc3REb3QgIT09IC0gMSApIHtcblxuXHRcdFx0XHR2YXIgb2JqZWN0TmFtZSA9IHJlc3VsdHMubm9kZU5hbWUuc3Vic3RyaW5nKCBsYXN0RG90ICsgMSApO1xuXG5cdFx0XHRcdC8vIE9iamVjdCBuYW1lcyBtdXN0IGJlIGNoZWNrZWQgYWdhaW5zdCBhIHdoaXRlbGlzdC4gT3RoZXJ3aXNlLCB0aGVyZVxuXHRcdFx0XHQvLyBpcyBubyB3YXkgdG8gcGFyc2UgJ2Zvby5iYXIuYmF6JzogJ2JheicgbXVzdCBiZSBhIHByb3BlcnR5LCBidXRcblx0XHRcdFx0Ly8gJ2JhcicgY291bGQgYmUgdGhlIG9iamVjdE5hbWUsIG9yIHBhcnQgb2YgYSBub2RlTmFtZSAod2hpY2ggY2FuXG5cdFx0XHRcdC8vIGluY2x1ZGUgJy4nIGNoYXJhY3RlcnMpLlxuXHRcdFx0XHRpZiAoIHN1cHBvcnRlZE9iamVjdE5hbWVzLmluZGV4T2YoIG9iamVjdE5hbWUgKSAhPT0gLSAxICkge1xuXG5cdFx0XHRcdFx0cmVzdWx0cy5ub2RlTmFtZSA9IHJlc3VsdHMubm9kZU5hbWUuc3Vic3RyaW5nKCAwLCBsYXN0RG90ICk7XG5cdFx0XHRcdFx0cmVzdWx0cy5vYmplY3ROYW1lID0gb2JqZWN0TmFtZTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCByZXN1bHRzLnByb3BlcnR5TmFtZSA9PT0gbnVsbCB8fCByZXN1bHRzLnByb3BlcnR5TmFtZS5sZW5ndGggPT09IDAgKSB7XG5cblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCAnUHJvcGVydHlCaW5kaW5nOiBjYW4gbm90IHBhcnNlIHByb3BlcnR5TmFtZSBmcm9tIHRyYWNrTmFtZTogJyArIHRyYWNrTmFtZSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiByZXN1bHRzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0ZmluZE5vZGU6IGZ1bmN0aW9uICggcm9vdCwgbm9kZU5hbWUgKSB7XG5cblx0XHRpZiAoICEgbm9kZU5hbWUgfHwgbm9kZU5hbWUgPT09IFwiXCIgfHwgbm9kZU5hbWUgPT09IFwicm9vdFwiIHx8IG5vZGVOYW1lID09PSBcIi5cIiB8fCBub2RlTmFtZSA9PT0gLSAxIHx8IG5vZGVOYW1lID09PSByb290Lm5hbWUgfHwgbm9kZU5hbWUgPT09IHJvb3QudXVpZCApIHtcblxuXHRcdFx0cmV0dXJuIHJvb3Q7XG5cblx0XHR9XG5cblx0XHQvLyBzZWFyY2ggaW50byBza2VsZXRvbiBib25lcy5cblx0XHRpZiAoIHJvb3Quc2tlbGV0b24gKSB7XG5cblx0XHRcdHZhciBib25lID0gcm9vdC5za2VsZXRvbi5nZXRCb25lQnlOYW1lKCBub2RlTmFtZSApO1xuXG5cdFx0XHRpZiAoIGJvbmUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRyZXR1cm4gYm9uZTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gc2VhcmNoIGludG8gbm9kZSBzdWJ0cmVlLlxuXHRcdGlmICggcm9vdC5jaGlsZHJlbiApIHtcblxuXHRcdFx0dmFyIHNlYXJjaE5vZGVTdWJ0cmVlID0gZnVuY3Rpb24gKCBjaGlsZHJlbiApIHtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdFx0XHR2YXIgY2hpbGROb2RlID0gY2hpbGRyZW5bIGkgXTtcblxuXHRcdFx0XHRcdGlmICggY2hpbGROb2RlLm5hbWUgPT09IG5vZGVOYW1lIHx8IGNoaWxkTm9kZS51dWlkID09PSBub2RlTmFtZSApIHtcblxuXHRcdFx0XHRcdFx0cmV0dXJuIGNoaWxkTm9kZTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHZhciByZXN1bHQgPSBzZWFyY2hOb2RlU3VidHJlZSggY2hpbGROb2RlLmNoaWxkcmVuICk7XG5cblx0XHRcdFx0XHRpZiAoIHJlc3VsdCApIHJldHVybiByZXN1bHQ7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBudWxsO1xuXG5cdFx0XHR9O1xuXG5cdFx0XHR2YXIgc3ViVHJlZU5vZGUgPSBzZWFyY2hOb2RlU3VidHJlZSggcm9vdC5jaGlsZHJlbiApO1xuXG5cdFx0XHRpZiAoIHN1YlRyZWVOb2RlICkge1xuXG5cdFx0XHRcdHJldHVybiBzdWJUcmVlTm9kZTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIG51bGw7XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5hc3NpZ24oIFByb3BlcnR5QmluZGluZy5wcm90b3R5cGUsIHsgLy8gcHJvdG90eXBlLCBjb250aW51ZWRcblxuXHQvLyB0aGVzZSBhcmUgdXNlZCB0byBcImJpbmRcIiBhIG5vbmV4aXN0ZW50IHByb3BlcnR5XG5cdF9nZXRWYWx1ZV91bmF2YWlsYWJsZTogZnVuY3Rpb24gKCkge30sXG5cdF9zZXRWYWx1ZV91bmF2YWlsYWJsZTogZnVuY3Rpb24gKCkge30sXG5cblx0QmluZGluZ1R5cGU6IHtcblx0XHREaXJlY3Q6IDAsXG5cdFx0RW50aXJlQXJyYXk6IDEsXG5cdFx0QXJyYXlFbGVtZW50OiAyLFxuXHRcdEhhc0Zyb21Ub0FycmF5OiAzXG5cdH0sXG5cblx0VmVyc2lvbmluZzoge1xuXHRcdE5vbmU6IDAsXG5cdFx0TmVlZHNVcGRhdGU6IDEsXG5cdFx0TWF0cml4V29ybGROZWVkc1VwZGF0ZTogMlxuXHR9LFxuXG5cdEdldHRlckJ5QmluZGluZ1R5cGU6IFtcblxuXHRcdGZ1bmN0aW9uIGdldFZhbHVlX2RpcmVjdCggYnVmZmVyLCBvZmZzZXQgKSB7XG5cblx0XHRcdGJ1ZmZlclsgb2Zmc2V0IF0gPSB0aGlzLm5vZGVbIHRoaXMucHJvcGVydHlOYW1lIF07XG5cblx0XHR9LFxuXG5cdFx0ZnVuY3Rpb24gZ2V0VmFsdWVfYXJyYXkoIGJ1ZmZlciwgb2Zmc2V0ICkge1xuXG5cdFx0XHR2YXIgc291cmNlID0gdGhpcy5yZXNvbHZlZFByb3BlcnR5O1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIG4gPSBzb3VyY2UubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHRcdGJ1ZmZlclsgb2Zmc2V0ICsrIF0gPSBzb3VyY2VbIGkgXTtcblxuXHRcdFx0fVxuXG5cdFx0fSxcblxuXHRcdGZ1bmN0aW9uIGdldFZhbHVlX2FycmF5RWxlbWVudCggYnVmZmVyLCBvZmZzZXQgKSB7XG5cblx0XHRcdGJ1ZmZlclsgb2Zmc2V0IF0gPSB0aGlzLnJlc29sdmVkUHJvcGVydHlbIHRoaXMucHJvcGVydHlJbmRleCBdO1xuXG5cdFx0fSxcblxuXHRcdGZ1bmN0aW9uIGdldFZhbHVlX3RvQXJyYXkoIGJ1ZmZlciwgb2Zmc2V0ICkge1xuXG5cdFx0XHR0aGlzLnJlc29sdmVkUHJvcGVydHkudG9BcnJheSggYnVmZmVyLCBvZmZzZXQgKTtcblxuXHRcdH1cblxuXHRdLFxuXG5cdFNldHRlckJ5QmluZGluZ1R5cGVBbmRWZXJzaW9uaW5nOiBbXG5cblx0XHRbXG5cdFx0XHQvLyBEaXJlY3RcblxuXHRcdFx0ZnVuY3Rpb24gc2V0VmFsdWVfZGlyZWN0KCBidWZmZXIsIG9mZnNldCApIHtcblxuXHRcdFx0XHR0aGlzLnRhcmdldE9iamVjdFsgdGhpcy5wcm9wZXJ0eU5hbWUgXSA9IGJ1ZmZlclsgb2Zmc2V0IF07XG5cblx0XHRcdH0sXG5cblx0XHRcdGZ1bmN0aW9uIHNldFZhbHVlX2RpcmVjdF9zZXROZWVkc1VwZGF0ZSggYnVmZmVyLCBvZmZzZXQgKSB7XG5cblx0XHRcdFx0dGhpcy50YXJnZXRPYmplY3RbIHRoaXMucHJvcGVydHlOYW1lIF0gPSBidWZmZXJbIG9mZnNldCBdO1xuXHRcdFx0XHR0aGlzLnRhcmdldE9iamVjdC5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdH0sXG5cblx0XHRcdGZ1bmN0aW9uIHNldFZhbHVlX2RpcmVjdF9zZXRNYXRyaXhXb3JsZE5lZWRzVXBkYXRlKCBidWZmZXIsIG9mZnNldCApIHtcblxuXHRcdFx0XHR0aGlzLnRhcmdldE9iamVjdFsgdGhpcy5wcm9wZXJ0eU5hbWUgXSA9IGJ1ZmZlclsgb2Zmc2V0IF07XG5cdFx0XHRcdHRoaXMudGFyZ2V0T2JqZWN0Lm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHR9XG5cblx0XHRdLCBbXG5cblx0XHRcdC8vIEVudGlyZUFycmF5XG5cblx0XHRcdGZ1bmN0aW9uIHNldFZhbHVlX2FycmF5KCBidWZmZXIsIG9mZnNldCApIHtcblxuXHRcdFx0XHR2YXIgZGVzdCA9IHRoaXMucmVzb2x2ZWRQcm9wZXJ0eTtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIG4gPSBkZXN0Lmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0XHRcdGRlc3RbIGkgXSA9IGJ1ZmZlclsgb2Zmc2V0ICsrIF07XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9LFxuXG5cdFx0XHRmdW5jdGlvbiBzZXRWYWx1ZV9hcnJheV9zZXROZWVkc1VwZGF0ZSggYnVmZmVyLCBvZmZzZXQgKSB7XG5cblx0XHRcdFx0dmFyIGRlc3QgPSB0aGlzLnJlc29sdmVkUHJvcGVydHk7XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBuID0gZGVzdC5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRcdFx0XHRkZXN0WyBpIF0gPSBidWZmZXJbIG9mZnNldCArKyBdO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0aGlzLnRhcmdldE9iamVjdC5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdH0sXG5cblx0XHRcdGZ1bmN0aW9uIHNldFZhbHVlX2FycmF5X3NldE1hdHJpeFdvcmxkTmVlZHNVcGRhdGUoIGJ1ZmZlciwgb2Zmc2V0ICkge1xuXG5cdFx0XHRcdHZhciBkZXN0ID0gdGhpcy5yZXNvbHZlZFByb3BlcnR5O1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMCwgbiA9IGRlc3QubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHRcdFx0ZGVzdFsgaSBdID0gYnVmZmVyWyBvZmZzZXQgKysgXTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGhpcy50YXJnZXRPYmplY3QubWF0cml4V29ybGROZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdH1cblxuXHRcdF0sIFtcblxuXHRcdFx0Ly8gQXJyYXlFbGVtZW50XG5cblx0XHRcdGZ1bmN0aW9uIHNldFZhbHVlX2FycmF5RWxlbWVudCggYnVmZmVyLCBvZmZzZXQgKSB7XG5cblx0XHRcdFx0dGhpcy5yZXNvbHZlZFByb3BlcnR5WyB0aGlzLnByb3BlcnR5SW5kZXggXSA9IGJ1ZmZlclsgb2Zmc2V0IF07XG5cblx0XHRcdH0sXG5cblx0XHRcdGZ1bmN0aW9uIHNldFZhbHVlX2FycmF5RWxlbWVudF9zZXROZWVkc1VwZGF0ZSggYnVmZmVyLCBvZmZzZXQgKSB7XG5cblx0XHRcdFx0dGhpcy5yZXNvbHZlZFByb3BlcnR5WyB0aGlzLnByb3BlcnR5SW5kZXggXSA9IGJ1ZmZlclsgb2Zmc2V0IF07XG5cdFx0XHRcdHRoaXMudGFyZ2V0T2JqZWN0Lm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0fSxcblxuXHRcdFx0ZnVuY3Rpb24gc2V0VmFsdWVfYXJyYXlFbGVtZW50X3NldE1hdHJpeFdvcmxkTmVlZHNVcGRhdGUoIGJ1ZmZlciwgb2Zmc2V0ICkge1xuXG5cdFx0XHRcdHRoaXMucmVzb2x2ZWRQcm9wZXJ0eVsgdGhpcy5wcm9wZXJ0eUluZGV4IF0gPSBidWZmZXJbIG9mZnNldCBdO1xuXHRcdFx0XHR0aGlzLnRhcmdldE9iamVjdC5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0fVxuXG5cdFx0XSwgW1xuXG5cdFx0XHQvLyBIYXNUb0Zyb21BcnJheVxuXG5cdFx0XHRmdW5jdGlvbiBzZXRWYWx1ZV9mcm9tQXJyYXkoIGJ1ZmZlciwgb2Zmc2V0ICkge1xuXG5cdFx0XHRcdHRoaXMucmVzb2x2ZWRQcm9wZXJ0eS5mcm9tQXJyYXkoIGJ1ZmZlciwgb2Zmc2V0ICk7XG5cblx0XHRcdH0sXG5cblx0XHRcdGZ1bmN0aW9uIHNldFZhbHVlX2Zyb21BcnJheV9zZXROZWVkc1VwZGF0ZSggYnVmZmVyLCBvZmZzZXQgKSB7XG5cblx0XHRcdFx0dGhpcy5yZXNvbHZlZFByb3BlcnR5LmZyb21BcnJheSggYnVmZmVyLCBvZmZzZXQgKTtcblx0XHRcdFx0dGhpcy50YXJnZXRPYmplY3QubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHR9LFxuXG5cdFx0XHRmdW5jdGlvbiBzZXRWYWx1ZV9mcm9tQXJyYXlfc2V0TWF0cml4V29ybGROZWVkc1VwZGF0ZSggYnVmZmVyLCBvZmZzZXQgKSB7XG5cblx0XHRcdFx0dGhpcy5yZXNvbHZlZFByb3BlcnR5LmZyb21BcnJheSggYnVmZmVyLCBvZmZzZXQgKTtcblx0XHRcdFx0dGhpcy50YXJnZXRPYmplY3QubWF0cml4V29ybGROZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdH1cblxuXHRcdF1cblxuXHRdLFxuXG5cdGdldFZhbHVlOiBmdW5jdGlvbiBnZXRWYWx1ZV91bmJvdW5kKCB0YXJnZXRBcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0dGhpcy5iaW5kKCk7XG5cdFx0dGhpcy5nZXRWYWx1ZSggdGFyZ2V0QXJyYXksIG9mZnNldCApO1xuXG5cdFx0Ly8gTm90ZTogVGhpcyBjbGFzcyB1c2VzIGEgU3RhdGUgcGF0dGVybiBvbiBhIHBlci1tZXRob2QgYmFzaXM6XG5cdFx0Ly8gJ2JpbmQnIHNldHMgJ3RoaXMuZ2V0VmFsdWUnIC8gJ3NldFZhbHVlJyBhbmQgc2hhZG93cyB0aGVcblx0XHQvLyBwcm90b3R5cGUgdmVyc2lvbiBvZiB0aGVzZSBtZXRob2RzIHdpdGggb25lIHRoYXQgcmVwcmVzZW50c1xuXHRcdC8vIHRoZSBib3VuZCBzdGF0ZS4gV2hlbiB0aGUgcHJvcGVydHkgaXMgbm90IGZvdW5kLCB0aGUgbWV0aG9kc1xuXHRcdC8vIGJlY29tZSBuby1vcHMuXG5cblx0fSxcblxuXHRzZXRWYWx1ZTogZnVuY3Rpb24gZ2V0VmFsdWVfdW5ib3VuZCggc291cmNlQXJyYXksIG9mZnNldCApIHtcblxuXHRcdHRoaXMuYmluZCgpO1xuXHRcdHRoaXMuc2V0VmFsdWUoIHNvdXJjZUFycmF5LCBvZmZzZXQgKTtcblxuXHR9LFxuXG5cdC8vIGNyZWF0ZSBnZXR0ZXIgLyBzZXR0ZXIgcGFpciBmb3IgYSBwcm9wZXJ0eSBpbiB0aGUgc2NlbmUgZ3JhcGhcblx0YmluZDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHRhcmdldE9iamVjdCA9IHRoaXMubm9kZSxcblx0XHRcdHBhcnNlZFBhdGggPSB0aGlzLnBhcnNlZFBhdGgsXG5cblx0XHRcdG9iamVjdE5hbWUgPSBwYXJzZWRQYXRoLm9iamVjdE5hbWUsXG5cdFx0XHRwcm9wZXJ0eU5hbWUgPSBwYXJzZWRQYXRoLnByb3BlcnR5TmFtZSxcblx0XHRcdHByb3BlcnR5SW5kZXggPSBwYXJzZWRQYXRoLnByb3BlcnR5SW5kZXg7XG5cblx0XHRpZiAoICEgdGFyZ2V0T2JqZWN0ICkge1xuXG5cdFx0XHR0YXJnZXRPYmplY3QgPSBQcm9wZXJ0eUJpbmRpbmcuZmluZE5vZGUoIHRoaXMucm9vdE5vZGUsIHBhcnNlZFBhdGgubm9kZU5hbWUgKSB8fCB0aGlzLnJvb3ROb2RlO1xuXG5cdFx0XHR0aGlzLm5vZGUgPSB0YXJnZXRPYmplY3Q7XG5cblx0XHR9XG5cblx0XHQvLyBzZXQgZmFpbCBzdGF0ZSBzbyB3ZSBjYW4ganVzdCAncmV0dXJuJyBvbiBlcnJvclxuXHRcdHRoaXMuZ2V0VmFsdWUgPSB0aGlzLl9nZXRWYWx1ZV91bmF2YWlsYWJsZTtcblx0XHR0aGlzLnNldFZhbHVlID0gdGhpcy5fc2V0VmFsdWVfdW5hdmFpbGFibGU7XG5cblx0XHQvLyBlbnN1cmUgdGhlcmUgaXMgYSB2YWx1ZSBub2RlXG5cdFx0aWYgKCAhIHRhcmdldE9iamVjdCApIHtcblxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlByb3BlcnR5QmluZGluZzogVHJ5aW5nIHRvIHVwZGF0ZSBub2RlIGZvciB0cmFjazogJyArIHRoaXMucGF0aCArICcgYnV0IGl0IHdhc25cXCd0IGZvdW5kLicgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdGlmICggb2JqZWN0TmFtZSApIHtcblxuXHRcdFx0dmFyIG9iamVjdEluZGV4ID0gcGFyc2VkUGF0aC5vYmplY3RJbmRleDtcblxuXHRcdFx0Ly8gc3BlY2lhbCBjYXNlcyB3ZXJlIHdlIG5lZWQgdG8gcmVhY2ggZGVlcGVyIGludG8gdGhlIGhpZXJhcmNoeSB0byBnZXQgdGhlIGZhY2UgbWF0ZXJpYWxzLi4uLlxuXHRcdFx0c3dpdGNoICggb2JqZWN0TmFtZSApIHtcblxuXHRcdFx0XHRjYXNlICdtYXRlcmlhbHMnOlxuXG5cdFx0XHRcdFx0aWYgKCAhIHRhcmdldE9iamVjdC5tYXRlcmlhbCApIHtcblxuXHRcdFx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIG1hdGVyaWFsIGFzIG5vZGUgZG9lcyBub3QgaGF2ZSBhIG1hdGVyaWFsLicsIHRoaXMgKTtcblx0XHRcdFx0XHRcdHJldHVybjtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmICggISB0YXJnZXRPYmplY3QubWF0ZXJpYWwubWF0ZXJpYWxzICkge1xuXG5cdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBDYW4gbm90IGJpbmQgdG8gbWF0ZXJpYWwubWF0ZXJpYWxzIGFzIG5vZGUubWF0ZXJpYWwgZG9lcyBub3QgaGF2ZSBhIG1hdGVyaWFscyBhcnJheS4nLCB0aGlzICk7XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR0YXJnZXRPYmplY3QgPSB0YXJnZXRPYmplY3QubWF0ZXJpYWwubWF0ZXJpYWxzO1xuXG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSAnYm9uZXMnOlxuXG5cdFx0XHRcdFx0aWYgKCAhIHRhcmdldE9iamVjdC5za2VsZXRvbiApIHtcblxuXHRcdFx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIGJvbmVzIGFzIG5vZGUgZG9lcyBub3QgaGF2ZSBhIHNrZWxldG9uLicsIHRoaXMgKTtcblx0XHRcdFx0XHRcdHJldHVybjtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIHBvdGVudGlhbCBmdXR1cmUgb3B0aW1pemF0aW9uOiBza2lwIHRoaXMgaWYgcHJvcGVydHlJbmRleCBpcyBhbHJlYWR5IGFuIGludGVnZXJcblx0XHRcdFx0XHQvLyBhbmQgY29udmVydCB0aGUgaW50ZWdlciBzdHJpbmcgdG8gYSB0cnVlIGludGVnZXIuXG5cblx0XHRcdFx0XHR0YXJnZXRPYmplY3QgPSB0YXJnZXRPYmplY3Quc2tlbGV0b24uYm9uZXM7XG5cblx0XHRcdFx0XHQvLyBzdXBwb3J0IHJlc29sdmluZyBtb3JwaFRhcmdldCBuYW1lcyBpbnRvIGluZGljZXMuXG5cdFx0XHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgdGFyZ2V0T2JqZWN0Lmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0XHRcdFx0aWYgKCB0YXJnZXRPYmplY3RbIGkgXS5uYW1lID09PSBvYmplY3RJbmRleCApIHtcblxuXHRcdFx0XHRcdFx0XHRvYmplY3RJbmRleCA9IGk7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRkZWZhdWx0OlxuXG5cdFx0XHRcdFx0aWYgKCB0YXJnZXRPYmplY3RbIG9iamVjdE5hbWUgXSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBDYW4gbm90IGJpbmQgdG8gb2JqZWN0TmFtZSBvZiBub2RlIHVuZGVmaW5lZC4nLCB0aGlzICk7XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR0YXJnZXRPYmplY3QgPSB0YXJnZXRPYmplY3RbIG9iamVjdE5hbWUgXTtcblxuXHRcdFx0fVxuXG5cblx0XHRcdGlmICggb2JqZWN0SW5kZXggIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRpZiAoIHRhcmdldE9iamVjdFsgb2JqZWN0SW5kZXggXSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlByb3BlcnR5QmluZGluZzogVHJ5aW5nIHRvIGJpbmQgdG8gb2JqZWN0SW5kZXggb2Ygb2JqZWN0TmFtZSwgYnV0IGlzIHVuZGVmaW5lZC4nLCB0aGlzLCB0YXJnZXRPYmplY3QgKTtcblx0XHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRhcmdldE9iamVjdCA9IHRhcmdldE9iamVjdFsgb2JqZWN0SW5kZXggXTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gcmVzb2x2ZSBwcm9wZXJ0eVxuXHRcdHZhciBub2RlUHJvcGVydHkgPSB0YXJnZXRPYmplY3RbIHByb3BlcnR5TmFtZSBdO1xuXG5cdFx0aWYgKCBub2RlUHJvcGVydHkgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dmFyIG5vZGVOYW1lID0gcGFyc2VkUGF0aC5ub2RlTmFtZTtcblxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlByb3BlcnR5QmluZGluZzogVHJ5aW5nIHRvIHVwZGF0ZSBwcm9wZXJ0eSBmb3IgdHJhY2s6ICcgKyBub2RlTmFtZSArXG5cdFx0XHRcdCcuJyArIHByb3BlcnR5TmFtZSArICcgYnV0IGl0IHdhc25cXCd0IGZvdW5kLicsIHRhcmdldE9iamVjdCApO1xuXHRcdFx0cmV0dXJuO1xuXG5cdFx0fVxuXG5cdFx0Ly8gZGV0ZXJtaW5lIHZlcnNpb25pbmcgc2NoZW1lXG5cdFx0dmFyIHZlcnNpb25pbmcgPSB0aGlzLlZlcnNpb25pbmcuTm9uZTtcblxuXHRcdGlmICggdGFyZ2V0T2JqZWN0Lm5lZWRzVXBkYXRlICE9PSB1bmRlZmluZWQgKSB7IC8vIG1hdGVyaWFsXG5cblx0XHRcdHZlcnNpb25pbmcgPSB0aGlzLlZlcnNpb25pbmcuTmVlZHNVcGRhdGU7XG5cdFx0XHR0aGlzLnRhcmdldE9iamVjdCA9IHRhcmdldE9iamVjdDtcblxuXHRcdH0gZWxzZSBpZiAoIHRhcmdldE9iamVjdC5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlICE9PSB1bmRlZmluZWQgKSB7IC8vIG5vZGUgdHJhbnNmb3JtXG5cblx0XHRcdHZlcnNpb25pbmcgPSB0aGlzLlZlcnNpb25pbmcuTWF0cml4V29ybGROZWVkc1VwZGF0ZTtcblx0XHRcdHRoaXMudGFyZ2V0T2JqZWN0ID0gdGFyZ2V0T2JqZWN0O1xuXG5cdFx0fVxuXG5cdFx0Ly8gZGV0ZXJtaW5lIGhvdyB0aGUgcHJvcGVydHkgZ2V0cyBib3VuZFxuXHRcdHZhciBiaW5kaW5nVHlwZSA9IHRoaXMuQmluZGluZ1R5cGUuRGlyZWN0O1xuXG5cdFx0aWYgKCBwcm9wZXJ0eUluZGV4ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdC8vIGFjY2VzcyBhIHN1YiBlbGVtZW50IG9mIHRoZSBwcm9wZXJ0eSBhcnJheSAob25seSBwcmltaXRpdmVzIGFyZSBzdXBwb3J0ZWQgcmlnaHQgbm93KVxuXG5cdFx0XHRpZiAoIHByb3BlcnR5TmFtZSA9PT0gXCJtb3JwaFRhcmdldEluZmx1ZW5jZXNcIiApIHtcblxuXHRcdFx0XHQvLyBwb3RlbnRpYWwgb3B0aW1pemF0aW9uLCBza2lwIHRoaXMgaWYgcHJvcGVydHlJbmRleCBpcyBhbHJlYWR5IGFuIGludGVnZXIsIGFuZCBjb252ZXJ0IHRoZSBpbnRlZ2VyIHN0cmluZyB0byBhIHRydWUgaW50ZWdlci5cblxuXHRcdFx0XHQvLyBzdXBwb3J0IHJlc29sdmluZyBtb3JwaFRhcmdldCBuYW1lcyBpbnRvIGluZGljZXMuXG5cdFx0XHRcdGlmICggISB0YXJnZXRPYmplY3QuZ2VvbWV0cnkgKSB7XG5cblx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBDYW4gbm90IGJpbmQgdG8gbW9ycGhUYXJnZXRJbmZsdWVuY2VzIGJlY2F1c2Ugbm9kZSBkb2VzIG5vdCBoYXZlIGEgZ2VvbWV0cnkuJywgdGhpcyApO1xuXHRcdFx0XHRcdHJldHVybjtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCB0YXJnZXRPYmplY3QuZ2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSApIHtcblxuXHRcdFx0XHRcdGlmICggISB0YXJnZXRPYmplY3QuZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzICkge1xuXG5cdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBDYW4gbm90IGJpbmQgdG8gbW9ycGhUYXJnZXRJbmZsdWVuY2VzIGJlY2F1c2Ugbm9kZSBkb2VzIG5vdCBoYXZlIGEgZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLicsIHRoaXMgKTtcblx0XHRcdFx0XHRcdHJldHVybjtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IHRoaXMubm9kZS5nZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb24ubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRcdFx0XHRpZiAoIHRhcmdldE9iamVjdC5nZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb25bIGkgXS5uYW1lID09PSBwcm9wZXJ0eUluZGV4ICkge1xuXG5cdFx0XHRcdFx0XHRcdHByb3BlcnR5SW5kZXggPSBpO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGlmICggISB0YXJnZXRPYmplY3QuZ2VvbWV0cnkubW9ycGhUYXJnZXRzICkge1xuXG5cdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBDYW4gbm90IGJpbmQgdG8gbW9ycGhUYXJnZXRJbmZsdWVuY2VzIGJlY2F1c2Ugbm9kZSBkb2VzIG5vdCBoYXZlIGEgZ2VvbWV0cnkubW9ycGhUYXJnZXRzLicsIHRoaXMgKTtcblx0XHRcdFx0XHRcdHJldHVybjtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IHRoaXMubm9kZS5nZW9tZXRyeS5tb3JwaFRhcmdldHMubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRcdFx0XHRpZiAoIHRhcmdldE9iamVjdC5nZW9tZXRyeS5tb3JwaFRhcmdldHNbIGkgXS5uYW1lID09PSBwcm9wZXJ0eUluZGV4ICkge1xuXG5cdFx0XHRcdFx0XHRcdHByb3BlcnR5SW5kZXggPSBpO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRiaW5kaW5nVHlwZSA9IHRoaXMuQmluZGluZ1R5cGUuQXJyYXlFbGVtZW50O1xuXG5cdFx0XHR0aGlzLnJlc29sdmVkUHJvcGVydHkgPSBub2RlUHJvcGVydHk7XG5cdFx0XHR0aGlzLnByb3BlcnR5SW5kZXggPSBwcm9wZXJ0eUluZGV4O1xuXG5cdFx0fSBlbHNlIGlmICggbm9kZVByb3BlcnR5LmZyb21BcnJheSAhPT0gdW5kZWZpbmVkICYmIG5vZGVQcm9wZXJ0eS50b0FycmF5ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdC8vIG11c3QgdXNlIGNvcHkgZm9yIE9iamVjdDNELkV1bGVyL1F1YXRlcm5pb25cblxuXHRcdFx0YmluZGluZ1R5cGUgPSB0aGlzLkJpbmRpbmdUeXBlLkhhc0Zyb21Ub0FycmF5O1xuXG5cdFx0XHR0aGlzLnJlc29sdmVkUHJvcGVydHkgPSBub2RlUHJvcGVydHk7XG5cblx0XHR9IGVsc2UgaWYgKCBBcnJheS5pc0FycmF5KCBub2RlUHJvcGVydHkgKSApIHtcblxuXHRcdFx0YmluZGluZ1R5cGUgPSB0aGlzLkJpbmRpbmdUeXBlLkVudGlyZUFycmF5O1xuXG5cdFx0XHR0aGlzLnJlc29sdmVkUHJvcGVydHkgPSBub2RlUHJvcGVydHk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR0aGlzLnByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZTtcblxuXHRcdH1cblxuXHRcdC8vIHNlbGVjdCBnZXR0ZXIgLyBzZXR0ZXJcblx0XHR0aGlzLmdldFZhbHVlID0gdGhpcy5HZXR0ZXJCeUJpbmRpbmdUeXBlWyBiaW5kaW5nVHlwZSBdO1xuXHRcdHRoaXMuc2V0VmFsdWUgPSB0aGlzLlNldHRlckJ5QmluZGluZ1R5cGVBbmRWZXJzaW9uaW5nWyBiaW5kaW5nVHlwZSBdWyB2ZXJzaW9uaW5nIF07XG5cblx0fSxcblxuXHR1bmJpbmQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMubm9kZSA9IG51bGw7XG5cblx0XHQvLyBiYWNrIHRvIHRoZSBwcm90b3R5cGUgdmVyc2lvbiBvZiBnZXRWYWx1ZSAvIHNldFZhbHVlXG5cdFx0Ly8gbm90ZTogYXZvaWRpbmcgdG8gbXV0YXRlIHRoZSBzaGFwZSBvZiAndGhpcycgdmlhICdkZWxldGUnXG5cdFx0dGhpcy5nZXRWYWx1ZSA9IHRoaXMuX2dldFZhbHVlX3VuYm91bmQ7XG5cdFx0dGhpcy5zZXRWYWx1ZSA9IHRoaXMuX3NldFZhbHVlX3VuYm91bmQ7XG5cblx0fVxuXG59ICk7XG5cbi8vIVxcIERFQ0xBUkUgQUxJQVMgQUZURVIgYXNzaWduIHByb3RvdHlwZSAhXG5PYmplY3QuYXNzaWduKCBQcm9wZXJ0eUJpbmRpbmcucHJvdG90eXBlLCB7XG5cblx0Ly8gaW5pdGlhbCBzdGF0ZSBvZiB0aGVzZSBtZXRob2RzIHRoYXQgY2FsbHMgJ2JpbmQnXG5cdF9nZXRWYWx1ZV91bmJvdW5kOiBQcm9wZXJ0eUJpbmRpbmcucHJvdG90eXBlLmdldFZhbHVlLFxuXHRfc2V0VmFsdWVfdW5ib3VuZDogUHJvcGVydHlCaW5kaW5nLnByb3RvdHlwZS5zZXRWYWx1ZSxcblxufSApO1xuXG4vKipcbiAqXG4gKiBBIGdyb3VwIG9mIG9iamVjdHMgdGhhdCByZWNlaXZlcyBhIHNoYXJlZCBhbmltYXRpb24gc3RhdGUuXG4gKlxuICogVXNhZ2U6XG4gKlxuICogXHQtXHRBZGQgb2JqZWN0cyB5b3Ugd291bGQgb3RoZXJ3aXNlIHBhc3MgYXMgJ3Jvb3QnIHRvIHRoZVxuICogXHRcdGNvbnN0cnVjdG9yIG9yIHRoZSAuY2xpcEFjdGlvbiBtZXRob2Qgb2YgQW5pbWF0aW9uTWl4ZXIuXG4gKlxuICogXHQtXHRJbnN0ZWFkIHBhc3MgdGhpcyBvYmplY3QgYXMgJ3Jvb3QnLlxuICpcbiAqIFx0LVx0WW91IGNhbiBhbHNvIGFkZCBhbmQgcmVtb3ZlIG9iamVjdHMgbGF0ZXIgd2hlbiB0aGUgbWl4ZXJcbiAqIFx0XHRpcyBydW5uaW5nLlxuICpcbiAqIE5vdGU6XG4gKlxuICogIFx0T2JqZWN0cyBvZiB0aGlzIGNsYXNzIGFwcGVhciBhcyBvbmUgb2JqZWN0IHRvIHRoZSBtaXhlcixcbiAqICBcdHNvIGNhY2hlIGNvbnRyb2wgb2YgdGhlIGluZGl2aWR1YWwgb2JqZWN0cyBtdXN0IGJlIGRvbmVcbiAqICBcdG9uIHRoZSBncm91cC5cbiAqXG4gKiBMaW1pdGF0aW9uOlxuICpcbiAqIFx0LSBcdFRoZSBhbmltYXRlZCBwcm9wZXJ0aWVzIG11c3QgYmUgY29tcGF0aWJsZSBhbW9uZyB0aGVcbiAqIFx0XHRhbGwgb2JqZWN0cyBpbiB0aGUgZ3JvdXAuXG4gKlxuICogIC1cdEEgc2luZ2xlIHByb3BlcnR5IGNhbiBlaXRoZXIgYmUgY29udHJvbGxlZCB0aHJvdWdoIGFcbiAqICBcdHRhcmdldCBncm91cCBvciBkaXJlY3RseSwgYnV0IG5vdCBib3RoLlxuICpcbiAqIEBhdXRob3IgdHNjaHdcbiAqL1xuXG5mdW5jdGlvbiBBbmltYXRpb25PYmplY3RHcm91cCgpIHtcblxuXHR0aGlzLnV1aWQgPSBfTWF0aC5nZW5lcmF0ZVVVSUQoKTtcblxuXHQvLyBjYWNoZWQgb2JqZWN0cyBmb2xsb3dlZCBieSB0aGUgYWN0aXZlIG9uZXNcblx0dGhpcy5fb2JqZWN0cyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKCBhcmd1bWVudHMgKTtcblxuXHR0aGlzLm5DYWNoZWRPYmplY3RzXyA9IDA7XHRcdFx0Ly8gdGhyZXNob2xkXG5cdC8vIG5vdGU6IHJlYWQgYnkgUHJvcGVydHlCaW5kaW5nLkNvbXBvc2l0ZVxuXG5cdHZhciBpbmRpY2VzID0ge307XG5cdHRoaXMuX2luZGljZXNCeVVVSUQgPSBpbmRpY2VzO1x0XHQvLyBmb3IgYm9va2tlZXBpbmdcblxuXHRmb3IgKCB2YXIgaSA9IDAsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0aW5kaWNlc1sgYXJndW1lbnRzWyBpIF0udXVpZCBdID0gaTtcblxuXHR9XG5cblx0dGhpcy5fcGF0aHMgPSBbXTtcdFx0XHRcdFx0Ly8gaW5zaWRlOiBzdHJpbmdcblx0dGhpcy5fcGFyc2VkUGF0aHMgPSBbXTtcdFx0XHRcdC8vIGluc2lkZTogeyB3ZSBkb24ndCBjYXJlLCBoZXJlIH1cblx0dGhpcy5fYmluZGluZ3MgPSBbXTsgXHRcdFx0XHQvLyBpbnNpZGU6IEFycmF5PCBQcm9wZXJ0eUJpbmRpbmcgPlxuXHR0aGlzLl9iaW5kaW5nc0luZGljZXNCeVBhdGggPSB7fTsgXHQvLyBpbnNpZGU6IGluZGljZXMgaW4gdGhlc2UgYXJyYXlzXG5cblx0dmFyIHNjb3BlID0gdGhpcztcblxuXHR0aGlzLnN0YXRzID0ge1xuXG5cdFx0b2JqZWN0czoge1xuXHRcdFx0Z2V0IHRvdGFsKCkge1xuXG5cdFx0XHRcdHJldHVybiBzY29wZS5fb2JqZWN0cy5sZW5ndGg7XG5cblx0XHRcdH0sXG5cdFx0XHRnZXQgaW5Vc2UoKSB7XG5cblx0XHRcdFx0cmV0dXJuIHRoaXMudG90YWwgLSBzY29wZS5uQ2FjaGVkT2JqZWN0c187XG5cblx0XHRcdH1cblx0XHR9LFxuXHRcdGdldCBiaW5kaW5nc1Blck9iamVjdCgpIHtcblxuXHRcdFx0cmV0dXJuIHNjb3BlLl9iaW5kaW5ncy5sZW5ndGg7XG5cblx0XHR9XG5cblx0fTtcblxufVxuXG5PYmplY3QuYXNzaWduKCBBbmltYXRpb25PYmplY3RHcm91cC5wcm90b3R5cGUsIHtcblxuXHRpc0FuaW1hdGlvbk9iamVjdEdyb3VwOiB0cnVlLFxuXG5cdGFkZDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIG9iamVjdHMgPSB0aGlzLl9vYmplY3RzLFxuXHRcdFx0bk9iamVjdHMgPSBvYmplY3RzLmxlbmd0aCxcblx0XHRcdG5DYWNoZWRPYmplY3RzID0gdGhpcy5uQ2FjaGVkT2JqZWN0c18sXG5cdFx0XHRpbmRpY2VzQnlVVUlEID0gdGhpcy5faW5kaWNlc0J5VVVJRCxcblx0XHRcdHBhdGhzID0gdGhpcy5fcGF0aHMsXG5cdFx0XHRwYXJzZWRQYXRocyA9IHRoaXMuX3BhcnNlZFBhdGhzLFxuXHRcdFx0YmluZGluZ3MgPSB0aGlzLl9iaW5kaW5ncyxcblx0XHRcdG5CaW5kaW5ncyA9IGJpbmRpbmdzLmxlbmd0aCxcblx0XHRcdGtub3duT2JqZWN0ID0gdW5kZWZpbmVkO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0dmFyIG9iamVjdCA9IGFyZ3VtZW50c1sgaSBdLFxuXHRcdFx0XHR1dWlkID0gb2JqZWN0LnV1aWQsXG5cdFx0XHRcdGluZGV4ID0gaW5kaWNlc0J5VVVJRFsgdXVpZCBdO1xuXG5cdFx0XHRpZiAoIGluZGV4ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Ly8gdW5rbm93biBvYmplY3QgLT4gYWRkIGl0IHRvIHRoZSBBQ1RJVkUgcmVnaW9uXG5cblx0XHRcdFx0aW5kZXggPSBuT2JqZWN0cyArKztcblx0XHRcdFx0aW5kaWNlc0J5VVVJRFsgdXVpZCBdID0gaW5kZXg7XG5cdFx0XHRcdG9iamVjdHMucHVzaCggb2JqZWN0ICk7XG5cblx0XHRcdFx0Ly8gYWNjb3VudGluZyBpcyBkb25lLCBub3cgZG8gdGhlIHNhbWUgZm9yIGFsbCBiaW5kaW5nc1xuXG5cdFx0XHRcdGZvciAoIHZhciBqID0gMCwgbSA9IG5CaW5kaW5nczsgaiAhPT0gbTsgKysgaiApIHtcblxuXHRcdFx0XHRcdGJpbmRpbmdzWyBqIF0ucHVzaCggbmV3IFByb3BlcnR5QmluZGluZyggb2JqZWN0LCBwYXRoc1sgaiBdLCBwYXJzZWRQYXRoc1sgaiBdICkgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSBpZiAoIGluZGV4IDwgbkNhY2hlZE9iamVjdHMgKSB7XG5cblx0XHRcdFx0a25vd25PYmplY3QgPSBvYmplY3RzWyBpbmRleCBdO1xuXG5cdFx0XHRcdC8vIG1vdmUgZXhpc3Rpbmcgb2JqZWN0IHRvIHRoZSBBQ1RJVkUgcmVnaW9uXG5cblx0XHRcdFx0dmFyIGZpcnN0QWN0aXZlSW5kZXggPSAtLSBuQ2FjaGVkT2JqZWN0cyxcblx0XHRcdFx0XHRsYXN0Q2FjaGVkT2JqZWN0ID0gb2JqZWN0c1sgZmlyc3RBY3RpdmVJbmRleCBdO1xuXG5cdFx0XHRcdGluZGljZXNCeVVVSURbIGxhc3RDYWNoZWRPYmplY3QudXVpZCBdID0gaW5kZXg7XG5cdFx0XHRcdG9iamVjdHNbIGluZGV4IF0gPSBsYXN0Q2FjaGVkT2JqZWN0O1xuXG5cdFx0XHRcdGluZGljZXNCeVVVSURbIHV1aWQgXSA9IGZpcnN0QWN0aXZlSW5kZXg7XG5cdFx0XHRcdG9iamVjdHNbIGZpcnN0QWN0aXZlSW5kZXggXSA9IG9iamVjdDtcblxuXHRcdFx0XHQvLyBhY2NvdW50aW5nIGlzIGRvbmUsIG5vdyBkbyB0aGUgc2FtZSBmb3IgYWxsIGJpbmRpbmdzXG5cblx0XHRcdFx0Zm9yICggdmFyIGogPSAwLCBtID0gbkJpbmRpbmdzOyBqICE9PSBtOyArKyBqICkge1xuXG5cdFx0XHRcdFx0dmFyIGJpbmRpbmdzRm9yUGF0aCA9IGJpbmRpbmdzWyBqIF0sXG5cdFx0XHRcdFx0XHRsYXN0Q2FjaGVkID0gYmluZGluZ3NGb3JQYXRoWyBmaXJzdEFjdGl2ZUluZGV4IF0sXG5cdFx0XHRcdFx0XHRiaW5kaW5nID0gYmluZGluZ3NGb3JQYXRoWyBpbmRleCBdO1xuXG5cdFx0XHRcdFx0YmluZGluZ3NGb3JQYXRoWyBpbmRleCBdID0gbGFzdENhY2hlZDtcblxuXHRcdFx0XHRcdGlmICggYmluZGluZyA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0XHQvLyBzaW5jZSB3ZSBkbyBub3QgYm90aGVyIHRvIGNyZWF0ZSBuZXcgYmluZGluZ3Ncblx0XHRcdFx0XHRcdC8vIGZvciBvYmplY3RzIHRoYXQgYXJlIGNhY2hlZCwgdGhlIGJpbmRpbmcgbWF5XG5cdFx0XHRcdFx0XHQvLyBvciBtYXkgbm90IGV4aXN0XG5cblx0XHRcdFx0XHRcdGJpbmRpbmcgPSBuZXcgUHJvcGVydHlCaW5kaW5nKCBvYmplY3QsIHBhdGhzWyBqIF0sIHBhcnNlZFBhdGhzWyBqIF0gKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGJpbmRpbmdzRm9yUGF0aFsgZmlyc3RBY3RpdmVJbmRleCBdID0gYmluZGluZztcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSBpZiAoIG9iamVjdHNbIGluZGV4IF0gIT09IGtub3duT2JqZWN0ICkge1xuXG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5BbmltYXRpb25PYmplY3RHcm91cDogRGlmZmVyZW50IG9iamVjdHMgd2l0aCB0aGUgc2FtZSBVVUlEICcgK1xuXHRcdFx0XHRcdFx0J2RldGVjdGVkLiBDbGVhbiB0aGUgY2FjaGVzIG9yIHJlY3JlYXRlIHlvdXIgaW5mcmFzdHJ1Y3R1cmUgd2hlbiByZWxvYWRpbmcgc2NlbmVzLicgKTtcblxuXHRcdFx0fSAvLyBlbHNlIHRoZSBvYmplY3QgaXMgYWxyZWFkeSB3aGVyZSB3ZSB3YW50IGl0IHRvIGJlXG5cblx0XHR9IC8vIGZvciBhcmd1bWVudHNcblxuXHRcdHRoaXMubkNhY2hlZE9iamVjdHNfID0gbkNhY2hlZE9iamVjdHM7XG5cblx0fSxcblxuXHRyZW1vdmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBvYmplY3RzID0gdGhpcy5fb2JqZWN0cyxcblx0XHRcdG5DYWNoZWRPYmplY3RzID0gdGhpcy5uQ2FjaGVkT2JqZWN0c18sXG5cdFx0XHRpbmRpY2VzQnlVVUlEID0gdGhpcy5faW5kaWNlc0J5VVVJRCxcblx0XHRcdGJpbmRpbmdzID0gdGhpcy5fYmluZGluZ3MsXG5cdFx0XHRuQmluZGluZ3MgPSBiaW5kaW5ncy5sZW5ndGg7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHR2YXIgb2JqZWN0ID0gYXJndW1lbnRzWyBpIF0sXG5cdFx0XHRcdHV1aWQgPSBvYmplY3QudXVpZCxcblx0XHRcdFx0aW5kZXggPSBpbmRpY2VzQnlVVUlEWyB1dWlkIF07XG5cblx0XHRcdGlmICggaW5kZXggIT09IHVuZGVmaW5lZCAmJiBpbmRleCA+PSBuQ2FjaGVkT2JqZWN0cyApIHtcblxuXHRcdFx0XHQvLyBtb3ZlIGV4aXN0aW5nIG9iamVjdCBpbnRvIHRoZSBDQUNIRUQgcmVnaW9uXG5cblx0XHRcdFx0dmFyIGxhc3RDYWNoZWRJbmRleCA9IG5DYWNoZWRPYmplY3RzICsrLFxuXHRcdFx0XHRcdGZpcnN0QWN0aXZlT2JqZWN0ID0gb2JqZWN0c1sgbGFzdENhY2hlZEluZGV4IF07XG5cblx0XHRcdFx0aW5kaWNlc0J5VVVJRFsgZmlyc3RBY3RpdmVPYmplY3QudXVpZCBdID0gaW5kZXg7XG5cdFx0XHRcdG9iamVjdHNbIGluZGV4IF0gPSBmaXJzdEFjdGl2ZU9iamVjdDtcblxuXHRcdFx0XHRpbmRpY2VzQnlVVUlEWyB1dWlkIF0gPSBsYXN0Q2FjaGVkSW5kZXg7XG5cdFx0XHRcdG9iamVjdHNbIGxhc3RDYWNoZWRJbmRleCBdID0gb2JqZWN0O1xuXG5cdFx0XHRcdC8vIGFjY291bnRpbmcgaXMgZG9uZSwgbm93IGRvIHRoZSBzYW1lIGZvciBhbGwgYmluZGluZ3NcblxuXHRcdFx0XHRmb3IgKCB2YXIgaiA9IDAsIG0gPSBuQmluZGluZ3M7IGogIT09IG07ICsrIGogKSB7XG5cblx0XHRcdFx0XHR2YXIgYmluZGluZ3NGb3JQYXRoID0gYmluZGluZ3NbIGogXSxcblx0XHRcdFx0XHRcdGZpcnN0QWN0aXZlID0gYmluZGluZ3NGb3JQYXRoWyBsYXN0Q2FjaGVkSW5kZXggXSxcblx0XHRcdFx0XHRcdGJpbmRpbmcgPSBiaW5kaW5nc0ZvclBhdGhbIGluZGV4IF07XG5cblx0XHRcdFx0XHRiaW5kaW5nc0ZvclBhdGhbIGluZGV4IF0gPSBmaXJzdEFjdGl2ZTtcblx0XHRcdFx0XHRiaW5kaW5nc0ZvclBhdGhbIGxhc3RDYWNoZWRJbmRleCBdID0gYmluZGluZztcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH0gLy8gZm9yIGFyZ3VtZW50c1xuXG5cdFx0dGhpcy5uQ2FjaGVkT2JqZWN0c18gPSBuQ2FjaGVkT2JqZWN0cztcblxuXHR9LFxuXG5cdC8vIHJlbW92ZSAmIGZvcmdldFxuXHR1bmNhY2hlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgb2JqZWN0cyA9IHRoaXMuX29iamVjdHMsXG5cdFx0XHRuT2JqZWN0cyA9IG9iamVjdHMubGVuZ3RoLFxuXHRcdFx0bkNhY2hlZE9iamVjdHMgPSB0aGlzLm5DYWNoZWRPYmplY3RzXyxcblx0XHRcdGluZGljZXNCeVVVSUQgPSB0aGlzLl9pbmRpY2VzQnlVVUlELFxuXHRcdFx0YmluZGluZ3MgPSB0aGlzLl9iaW5kaW5ncyxcblx0XHRcdG5CaW5kaW5ncyA9IGJpbmRpbmdzLmxlbmd0aDtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRcdHZhciBvYmplY3QgPSBhcmd1bWVudHNbIGkgXSxcblx0XHRcdFx0dXVpZCA9IG9iamVjdC51dWlkLFxuXHRcdFx0XHRpbmRleCA9IGluZGljZXNCeVVVSURbIHV1aWQgXTtcblxuXHRcdFx0aWYgKCBpbmRleCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGRlbGV0ZSBpbmRpY2VzQnlVVUlEWyB1dWlkIF07XG5cblx0XHRcdFx0aWYgKCBpbmRleCA8IG5DYWNoZWRPYmplY3RzICkge1xuXG5cdFx0XHRcdFx0Ly8gb2JqZWN0IGlzIGNhY2hlZCwgc2hyaW5rIHRoZSBDQUNIRUQgcmVnaW9uXG5cblx0XHRcdFx0XHR2YXIgZmlyc3RBY3RpdmVJbmRleCA9IC0tIG5DYWNoZWRPYmplY3RzLFxuXHRcdFx0XHRcdFx0bGFzdENhY2hlZE9iamVjdCA9IG9iamVjdHNbIGZpcnN0QWN0aXZlSW5kZXggXSxcblx0XHRcdFx0XHRcdGxhc3RJbmRleCA9IC0tIG5PYmplY3RzLFxuXHRcdFx0XHRcdFx0bGFzdE9iamVjdCA9IG9iamVjdHNbIGxhc3RJbmRleCBdO1xuXG5cdFx0XHRcdFx0Ly8gbGFzdCBjYWNoZWQgb2JqZWN0IHRha2VzIHRoaXMgb2JqZWN0J3MgcGxhY2Vcblx0XHRcdFx0XHRpbmRpY2VzQnlVVUlEWyBsYXN0Q2FjaGVkT2JqZWN0LnV1aWQgXSA9IGluZGV4O1xuXHRcdFx0XHRcdG9iamVjdHNbIGluZGV4IF0gPSBsYXN0Q2FjaGVkT2JqZWN0O1xuXG5cdFx0XHRcdFx0Ly8gbGFzdCBvYmplY3QgZ29lcyB0byB0aGUgYWN0aXZhdGVkIHNsb3QgYW5kIHBvcFxuXHRcdFx0XHRcdGluZGljZXNCeVVVSURbIGxhc3RPYmplY3QudXVpZCBdID0gZmlyc3RBY3RpdmVJbmRleDtcblx0XHRcdFx0XHRvYmplY3RzWyBmaXJzdEFjdGl2ZUluZGV4IF0gPSBsYXN0T2JqZWN0O1xuXHRcdFx0XHRcdG9iamVjdHMucG9wKCk7XG5cblx0XHRcdFx0XHQvLyBhY2NvdW50aW5nIGlzIGRvbmUsIG5vdyBkbyB0aGUgc2FtZSBmb3IgYWxsIGJpbmRpbmdzXG5cblx0XHRcdFx0XHRmb3IgKCB2YXIgaiA9IDAsIG0gPSBuQmluZGluZ3M7IGogIT09IG07ICsrIGogKSB7XG5cblx0XHRcdFx0XHRcdHZhciBiaW5kaW5nc0ZvclBhdGggPSBiaW5kaW5nc1sgaiBdLFxuXHRcdFx0XHRcdFx0XHRsYXN0Q2FjaGVkID0gYmluZGluZ3NGb3JQYXRoWyBmaXJzdEFjdGl2ZUluZGV4IF0sXG5cdFx0XHRcdFx0XHRcdGxhc3QgPSBiaW5kaW5nc0ZvclBhdGhbIGxhc3RJbmRleCBdO1xuXG5cdFx0XHRcdFx0XHRiaW5kaW5nc0ZvclBhdGhbIGluZGV4IF0gPSBsYXN0Q2FjaGVkO1xuXHRcdFx0XHRcdFx0YmluZGluZ3NGb3JQYXRoWyBmaXJzdEFjdGl2ZUluZGV4IF0gPSBsYXN0O1xuXHRcdFx0XHRcdFx0YmluZGluZ3NGb3JQYXRoLnBvcCgpO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHQvLyBvYmplY3QgaXMgYWN0aXZlLCBqdXN0IHN3YXAgd2l0aCB0aGUgbGFzdCBhbmQgcG9wXG5cblx0XHRcdFx0XHR2YXIgbGFzdEluZGV4ID0gLS0gbk9iamVjdHMsXG5cdFx0XHRcdFx0XHRsYXN0T2JqZWN0ID0gb2JqZWN0c1sgbGFzdEluZGV4IF07XG5cblx0XHRcdFx0XHRpbmRpY2VzQnlVVUlEWyBsYXN0T2JqZWN0LnV1aWQgXSA9IGluZGV4O1xuXHRcdFx0XHRcdG9iamVjdHNbIGluZGV4IF0gPSBsYXN0T2JqZWN0O1xuXHRcdFx0XHRcdG9iamVjdHMucG9wKCk7XG5cblx0XHRcdFx0XHQvLyBhY2NvdW50aW5nIGlzIGRvbmUsIG5vdyBkbyB0aGUgc2FtZSBmb3IgYWxsIGJpbmRpbmdzXG5cblx0XHRcdFx0XHRmb3IgKCB2YXIgaiA9IDAsIG0gPSBuQmluZGluZ3M7IGogIT09IG07ICsrIGogKSB7XG5cblx0XHRcdFx0XHRcdHZhciBiaW5kaW5nc0ZvclBhdGggPSBiaW5kaW5nc1sgaiBdO1xuXG5cdFx0XHRcdFx0XHRiaW5kaW5nc0ZvclBhdGhbIGluZGV4IF0gPSBiaW5kaW5nc0ZvclBhdGhbIGxhc3RJbmRleCBdO1xuXHRcdFx0XHRcdFx0YmluZGluZ3NGb3JQYXRoLnBvcCgpO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gLy8gY2FjaGVkIG9yIGFjdGl2ZVxuXG5cdFx0XHR9IC8vIGlmIG9iamVjdCBpcyBrbm93blxuXG5cdFx0fSAvLyBmb3IgYXJndW1lbnRzXG5cblx0XHR0aGlzLm5DYWNoZWRPYmplY3RzXyA9IG5DYWNoZWRPYmplY3RzO1xuXG5cdH0sXG5cblx0Ly8gSW50ZXJuYWwgaW50ZXJmYWNlIHVzZWQgYnkgYmVmcmllbmRlZCBQcm9wZXJ0eUJpbmRpbmcuQ29tcG9zaXRlOlxuXG5cdHN1YnNjcmliZV86IGZ1bmN0aW9uICggcGF0aCwgcGFyc2VkUGF0aCApIHtcblxuXHRcdC8vIHJldHVybnMgYW4gYXJyYXkgb2YgYmluZGluZ3MgZm9yIHRoZSBnaXZlbiBwYXRoIHRoYXQgaXMgY2hhbmdlZFxuXHRcdC8vIGFjY29yZGluZyB0byB0aGUgY29udGFpbmVkIG9iamVjdHMgaW4gdGhlIGdyb3VwXG5cblx0XHR2YXIgaW5kaWNlc0J5UGF0aCA9IHRoaXMuX2JpbmRpbmdzSW5kaWNlc0J5UGF0aCxcblx0XHRcdGluZGV4ID0gaW5kaWNlc0J5UGF0aFsgcGF0aCBdLFxuXHRcdFx0YmluZGluZ3MgPSB0aGlzLl9iaW5kaW5ncztcblxuXHRcdGlmICggaW5kZXggIT09IHVuZGVmaW5lZCApIHJldHVybiBiaW5kaW5nc1sgaW5kZXggXTtcblxuXHRcdHZhciBwYXRocyA9IHRoaXMuX3BhdGhzLFxuXHRcdFx0cGFyc2VkUGF0aHMgPSB0aGlzLl9wYXJzZWRQYXRocyxcblx0XHRcdG9iamVjdHMgPSB0aGlzLl9vYmplY3RzLFxuXHRcdFx0bk9iamVjdHMgPSBvYmplY3RzLmxlbmd0aCxcblx0XHRcdG5DYWNoZWRPYmplY3RzID0gdGhpcy5uQ2FjaGVkT2JqZWN0c18sXG5cdFx0XHRiaW5kaW5nc0ZvclBhdGggPSBuZXcgQXJyYXkoIG5PYmplY3RzICk7XG5cblx0XHRpbmRleCA9IGJpbmRpbmdzLmxlbmd0aDtcblxuXHRcdGluZGljZXNCeVBhdGhbIHBhdGggXSA9IGluZGV4O1xuXG5cdFx0cGF0aHMucHVzaCggcGF0aCApO1xuXHRcdHBhcnNlZFBhdGhzLnB1c2goIHBhcnNlZFBhdGggKTtcblx0XHRiaW5kaW5ncy5wdXNoKCBiaW5kaW5nc0ZvclBhdGggKTtcblxuXHRcdGZvciAoIHZhciBpID0gbkNhY2hlZE9iamVjdHMsIG4gPSBvYmplY3RzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0dmFyIG9iamVjdCA9IG9iamVjdHNbIGkgXTtcblx0XHRcdGJpbmRpbmdzRm9yUGF0aFsgaSBdID0gbmV3IFByb3BlcnR5QmluZGluZyggb2JqZWN0LCBwYXRoLCBwYXJzZWRQYXRoICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gYmluZGluZ3NGb3JQYXRoO1xuXG5cdH0sXG5cblx0dW5zdWJzY3JpYmVfOiBmdW5jdGlvbiAoIHBhdGggKSB7XG5cblx0XHQvLyB0ZWxscyB0aGUgZ3JvdXAgdG8gZm9yZ2V0IGFib3V0IGEgcHJvcGVydHkgcGF0aCBhbmQgbm8gbG9uZ2VyXG5cdFx0Ly8gdXBkYXRlIHRoZSBhcnJheSBwcmV2aW91c2x5IG9idGFpbmVkIHdpdGggJ3N1YnNjcmliZV8nXG5cblx0XHR2YXIgaW5kaWNlc0J5UGF0aCA9IHRoaXMuX2JpbmRpbmdzSW5kaWNlc0J5UGF0aCxcblx0XHRcdGluZGV4ID0gaW5kaWNlc0J5UGF0aFsgcGF0aCBdO1xuXG5cdFx0aWYgKCBpbmRleCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR2YXIgcGF0aHMgPSB0aGlzLl9wYXRocyxcblx0XHRcdFx0cGFyc2VkUGF0aHMgPSB0aGlzLl9wYXJzZWRQYXRocyxcblx0XHRcdFx0YmluZGluZ3MgPSB0aGlzLl9iaW5kaW5ncyxcblx0XHRcdFx0bGFzdEJpbmRpbmdzSW5kZXggPSBiaW5kaW5ncy5sZW5ndGggLSAxLFxuXHRcdFx0XHRsYXN0QmluZGluZ3MgPSBiaW5kaW5nc1sgbGFzdEJpbmRpbmdzSW5kZXggXSxcblx0XHRcdFx0bGFzdEJpbmRpbmdzUGF0aCA9IHBhdGhbIGxhc3RCaW5kaW5nc0luZGV4IF07XG5cblx0XHRcdGluZGljZXNCeVBhdGhbIGxhc3RCaW5kaW5nc1BhdGggXSA9IGluZGV4O1xuXG5cdFx0XHRiaW5kaW5nc1sgaW5kZXggXSA9IGxhc3RCaW5kaW5ncztcblx0XHRcdGJpbmRpbmdzLnBvcCgpO1xuXG5cdFx0XHRwYXJzZWRQYXRoc1sgaW5kZXggXSA9IHBhcnNlZFBhdGhzWyBsYXN0QmluZGluZ3NJbmRleCBdO1xuXHRcdFx0cGFyc2VkUGF0aHMucG9wKCk7XG5cblx0XHRcdHBhdGhzWyBpbmRleCBdID0gcGF0aHNbIGxhc3RCaW5kaW5nc0luZGV4IF07XG5cdFx0XHRwYXRocy5wb3AoKTtcblxuXHRcdH1cblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKlxuICogQWN0aW9uIHByb3ZpZGVkIGJ5IEFuaW1hdGlvbk1peGVyIGZvciBzY2hlZHVsaW5nIGNsaXAgcGxheWJhY2sgb24gc3BlY2lmaWNcbiAqIG9iamVjdHMuXG4gKlxuICogQGF1dGhvciBCZW4gSG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pby9cbiAqIEBhdXRob3IgRGF2aWQgU2Fybm8gLyBodHRwOi8vbGlnaHRoYXVzLnVzL1xuICogQGF1dGhvciB0c2Nod1xuICpcbiAqL1xuXG5mdW5jdGlvbiBBbmltYXRpb25BY3Rpb24oIG1peGVyLCBjbGlwLCBsb2NhbFJvb3QgKSB7XG5cblx0dGhpcy5fbWl4ZXIgPSBtaXhlcjtcblx0dGhpcy5fY2xpcCA9IGNsaXA7XG5cdHRoaXMuX2xvY2FsUm9vdCA9IGxvY2FsUm9vdCB8fCBudWxsO1xuXG5cdHZhciB0cmFja3MgPSBjbGlwLnRyYWNrcyxcblx0XHRuVHJhY2tzID0gdHJhY2tzLmxlbmd0aCxcblx0XHRpbnRlcnBvbGFudHMgPSBuZXcgQXJyYXkoIG5UcmFja3MgKTtcblxuXHR2YXIgaW50ZXJwb2xhbnRTZXR0aW5ncyA9IHtcblx0XHRlbmRpbmdTdGFydDogWmVyb0N1cnZhdHVyZUVuZGluZyxcblx0XHRlbmRpbmdFbmQ6IFplcm9DdXJ2YXR1cmVFbmRpbmdcblx0fTtcblxuXHRmb3IgKCB2YXIgaSA9IDA7IGkgIT09IG5UcmFja3M7ICsrIGkgKSB7XG5cblx0XHR2YXIgaW50ZXJwb2xhbnQgPSB0cmFja3NbIGkgXS5jcmVhdGVJbnRlcnBvbGFudCggbnVsbCApO1xuXHRcdGludGVycG9sYW50c1sgaSBdID0gaW50ZXJwb2xhbnQ7XG5cdFx0aW50ZXJwb2xhbnQuc2V0dGluZ3MgPSBpbnRlcnBvbGFudFNldHRpbmdzO1xuXG5cdH1cblxuXHR0aGlzLl9pbnRlcnBvbGFudFNldHRpbmdzID0gaW50ZXJwb2xhbnRTZXR0aW5ncztcblxuXHR0aGlzLl9pbnRlcnBvbGFudHMgPSBpbnRlcnBvbGFudHM7XHQvLyBib3VuZCBieSB0aGUgbWl4ZXJcblxuXHQvLyBpbnNpZGU6IFByb3BlcnR5TWl4ZXIgKG1hbmFnZWQgYnkgdGhlIG1peGVyKVxuXHR0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzID0gbmV3IEFycmF5KCBuVHJhY2tzICk7XG5cblx0dGhpcy5fY2FjaGVJbmRleCA9IG51bGw7XHRcdFx0Ly8gZm9yIHRoZSBtZW1vcnkgbWFuYWdlclxuXHR0aGlzLl9ieUNsaXBDYWNoZUluZGV4ID0gbnVsbDtcdFx0Ly8gZm9yIHRoZSBtZW1vcnkgbWFuYWdlclxuXG5cdHRoaXMuX3RpbWVTY2FsZUludGVycG9sYW50ID0gbnVsbDtcblx0dGhpcy5fd2VpZ2h0SW50ZXJwb2xhbnQgPSBudWxsO1xuXG5cdHRoaXMubG9vcCA9IExvb3BSZXBlYXQ7XG5cdHRoaXMuX2xvb3BDb3VudCA9IC0gMTtcblxuXHQvLyBnbG9iYWwgbWl4ZXIgdGltZSB3aGVuIHRoZSBhY3Rpb24gaXMgdG8gYmUgc3RhcnRlZFxuXHQvLyBpdCdzIHNldCBiYWNrIHRvICdudWxsJyB1cG9uIHN0YXJ0IG9mIHRoZSBhY3Rpb25cblx0dGhpcy5fc3RhcnRUaW1lID0gbnVsbDtcblxuXHQvLyBzY2FsZWQgbG9jYWwgdGltZSBvZiB0aGUgYWN0aW9uXG5cdC8vIGdldHMgY2xhbXBlZCBvciB3cmFwcGVkIHRvIDAuLmNsaXAuZHVyYXRpb24gYWNjb3JkaW5nIHRvIGxvb3Bcblx0dGhpcy50aW1lID0gMDtcblxuXHR0aGlzLnRpbWVTY2FsZSA9IDE7XG5cdHRoaXMuX2VmZmVjdGl2ZVRpbWVTY2FsZSA9IDE7XG5cblx0dGhpcy53ZWlnaHQgPSAxO1xuXHR0aGlzLl9lZmZlY3RpdmVXZWlnaHQgPSAxO1xuXG5cdHRoaXMucmVwZXRpdGlvbnMgPSBJbmZpbml0eTsgXHRcdC8vIG5vLiBvZiByZXBldGl0aW9ucyB3aGVuIGxvb3BpbmdcblxuXHR0aGlzLnBhdXNlZCA9IGZhbHNlO1x0XHRcdFx0Ly8gdHJ1ZSAtPiB6ZXJvIGVmZmVjdGl2ZSB0aW1lIHNjYWxlXG5cdHRoaXMuZW5hYmxlZCA9IHRydWU7XHRcdFx0XHQvLyBmYWxzZSAtPiB6ZXJvIGVmZmVjdGl2ZSB3ZWlnaHRcblxuXHR0aGlzLmNsYW1wV2hlbkZpbmlzaGVkIFx0PSBmYWxzZTtcdC8vIGtlZXAgZmVlZGluZyB0aGUgbGFzdCBmcmFtZT9cblxuXHR0aGlzLnplcm9TbG9wZUF0U3RhcnQgXHQ9IHRydWU7XHRcdC8vIGZvciBzbW9vdGggaW50ZXJwb2xhdGlvbiB3L28gc2VwYXJhdGVcblx0dGhpcy56ZXJvU2xvcGVBdEVuZFx0XHQ9IHRydWU7XHRcdC8vIGNsaXBzIGZvciBzdGFydCwgbG9vcCBhbmQgZW5kXG5cbn1cblxuT2JqZWN0LmFzc2lnbiggQW5pbWF0aW9uQWN0aW9uLnByb3RvdHlwZSwge1xuXG5cdC8vIFN0YXRlICYgU2NoZWR1bGluZ1xuXG5cdHBsYXk6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuX21peGVyLl9hY3RpdmF0ZUFjdGlvbiggdGhpcyApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzdG9wOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLl9taXhlci5fZGVhY3RpdmF0ZUFjdGlvbiggdGhpcyApO1xuXG5cdFx0cmV0dXJuIHRoaXMucmVzZXQoKTtcblxuXHR9LFxuXG5cdHJlc2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLnBhdXNlZCA9IGZhbHNlO1xuXHRcdHRoaXMuZW5hYmxlZCA9IHRydWU7XG5cblx0XHR0aGlzLnRpbWUgPSAwO1x0XHRcdC8vIHJlc3RhcnQgY2xpcFxuXHRcdHRoaXMuX2xvb3BDb3VudCA9IC0gMTtcdC8vIGZvcmdldCBwcmV2aW91cyBsb29wc1xuXHRcdHRoaXMuX3N0YXJ0VGltZSA9IG51bGw7XHQvLyBmb3JnZXQgc2NoZWR1bGluZ1xuXG5cdFx0cmV0dXJuIHRoaXMuc3RvcEZhZGluZygpLnN0b3BXYXJwaW5nKCk7XG5cblx0fSxcblxuXHRpc1J1bm5pbmc6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLmVuYWJsZWQgJiYgISB0aGlzLnBhdXNlZCAmJiB0aGlzLnRpbWVTY2FsZSAhPT0gMCAmJlxuXHRcdFx0XHR0aGlzLl9zdGFydFRpbWUgPT09IG51bGwgJiYgdGhpcy5fbWl4ZXIuX2lzQWN0aXZlQWN0aW9uKCB0aGlzICk7XG5cblx0fSxcblxuXHQvLyByZXR1cm4gdHJ1ZSB3aGVuIHBsYXkgaGFzIGJlZW4gY2FsbGVkXG5cdGlzU2NoZWR1bGVkOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5fbWl4ZXIuX2lzQWN0aXZlQWN0aW9uKCB0aGlzICk7XG5cblx0fSxcblxuXHRzdGFydEF0OiBmdW5jdGlvbiAoIHRpbWUgKSB7XG5cblx0XHR0aGlzLl9zdGFydFRpbWUgPSB0aW1lO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRMb29wOiBmdW5jdGlvbiAoIG1vZGUsIHJlcGV0aXRpb25zICkge1xuXG5cdFx0dGhpcy5sb29wID0gbW9kZTtcblx0XHR0aGlzLnJlcGV0aXRpb25zID0gcmVwZXRpdGlvbnM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdC8vIFdlaWdodFxuXG5cdC8vIHNldCB0aGUgd2VpZ2h0IHN0b3BwaW5nIGFueSBzY2hlZHVsZWQgZmFkaW5nXG5cdC8vIGFsdGhvdWdoIC5lbmFibGVkID0gZmFsc2UgeWllbGRzIGFuIGVmZmVjdGl2ZSB3ZWlnaHQgb2YgemVybywgdGhpc1xuXHQvLyBtZXRob2QgZG9lcyAqbm90KiBjaGFuZ2UgLmVuYWJsZWQsIGJlY2F1c2UgaXQgd291bGQgYmUgY29uZnVzaW5nXG5cdHNldEVmZmVjdGl2ZVdlaWdodDogZnVuY3Rpb24gKCB3ZWlnaHQgKSB7XG5cblx0XHR0aGlzLndlaWdodCA9IHdlaWdodDtcblxuXHRcdC8vIG5vdGU6IHNhbWUgbG9naWMgYXMgd2hlbiB1cGRhdGVkIGF0IHJ1bnRpbWVcblx0XHR0aGlzLl9lZmZlY3RpdmVXZWlnaHQgPSB0aGlzLmVuYWJsZWQgPyB3ZWlnaHQgOiAwO1xuXG5cdFx0cmV0dXJuIHRoaXMuc3RvcEZhZGluZygpO1xuXG5cdH0sXG5cblx0Ly8gcmV0dXJuIHRoZSB3ZWlnaHQgY29uc2lkZXJpbmcgZmFkaW5nIGFuZCAuZW5hYmxlZFxuXHRnZXRFZmZlY3RpdmVXZWlnaHQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLl9lZmZlY3RpdmVXZWlnaHQ7XG5cblx0fSxcblxuXHRmYWRlSW46IGZ1bmN0aW9uICggZHVyYXRpb24gKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5fc2NoZWR1bGVGYWRpbmcoIGR1cmF0aW9uLCAwLCAxICk7XG5cblx0fSxcblxuXHRmYWRlT3V0OiBmdW5jdGlvbiAoIGR1cmF0aW9uICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuX3NjaGVkdWxlRmFkaW5nKCBkdXJhdGlvbiwgMSwgMCApO1xuXG5cdH0sXG5cblx0Y3Jvc3NGYWRlRnJvbTogZnVuY3Rpb24gKCBmYWRlT3V0QWN0aW9uLCBkdXJhdGlvbiwgd2FycCApIHtcblxuXHRcdGZhZGVPdXRBY3Rpb24uZmFkZU91dCggZHVyYXRpb24gKTtcblx0XHR0aGlzLmZhZGVJbiggZHVyYXRpb24gKTtcblxuXHRcdGlmICggd2FycCApIHtcblxuXHRcdFx0dmFyIGZhZGVJbkR1cmF0aW9uID0gdGhpcy5fY2xpcC5kdXJhdGlvbixcblx0XHRcdFx0ZmFkZU91dER1cmF0aW9uID0gZmFkZU91dEFjdGlvbi5fY2xpcC5kdXJhdGlvbixcblxuXHRcdFx0XHRzdGFydEVuZFJhdGlvID0gZmFkZU91dER1cmF0aW9uIC8gZmFkZUluRHVyYXRpb24sXG5cdFx0XHRcdGVuZFN0YXJ0UmF0aW8gPSBmYWRlSW5EdXJhdGlvbiAvIGZhZGVPdXREdXJhdGlvbjtcblxuXHRcdFx0ZmFkZU91dEFjdGlvbi53YXJwKCAxLjAsIHN0YXJ0RW5kUmF0aW8sIGR1cmF0aW9uICk7XG5cdFx0XHR0aGlzLndhcnAoIGVuZFN0YXJ0UmF0aW8sIDEuMCwgZHVyYXRpb24gKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y3Jvc3NGYWRlVG86IGZ1bmN0aW9uICggZmFkZUluQWN0aW9uLCBkdXJhdGlvbiwgd2FycCApIHtcblxuXHRcdHJldHVybiBmYWRlSW5BY3Rpb24uY3Jvc3NGYWRlRnJvbSggdGhpcywgZHVyYXRpb24sIHdhcnAgKTtcblxuXHR9LFxuXG5cdHN0b3BGYWRpbmc6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB3ZWlnaHRJbnRlcnBvbGFudCA9IHRoaXMuX3dlaWdodEludGVycG9sYW50O1xuXG5cdFx0aWYgKCB3ZWlnaHRJbnRlcnBvbGFudCAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5fd2VpZ2h0SW50ZXJwb2xhbnQgPSBudWxsO1xuXHRcdFx0dGhpcy5fbWl4ZXIuX3Rha2VCYWNrQ29udHJvbEludGVycG9sYW50KCB3ZWlnaHRJbnRlcnBvbGFudCApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHQvLyBUaW1lIFNjYWxlIENvbnRyb2xcblxuXHQvLyBzZXQgdGhlIHRpbWUgc2NhbGUgc3RvcHBpbmcgYW55IHNjaGVkdWxlZCB3YXJwaW5nXG5cdC8vIGFsdGhvdWdoIC5wYXVzZWQgPSB0cnVlIHlpZWxkcyBhbiBlZmZlY3RpdmUgdGltZSBzY2FsZSBvZiB6ZXJvLCB0aGlzXG5cdC8vIG1ldGhvZCBkb2VzICpub3QqIGNoYW5nZSAucGF1c2VkLCBiZWNhdXNlIGl0IHdvdWxkIGJlIGNvbmZ1c2luZ1xuXHRzZXRFZmZlY3RpdmVUaW1lU2NhbGU6IGZ1bmN0aW9uICggdGltZVNjYWxlICkge1xuXG5cdFx0dGhpcy50aW1lU2NhbGUgPSB0aW1lU2NhbGU7XG5cdFx0dGhpcy5fZWZmZWN0aXZlVGltZVNjYWxlID0gdGhpcy5wYXVzZWQgPyAwIDogdGltZVNjYWxlO1xuXG5cdFx0cmV0dXJuIHRoaXMuc3RvcFdhcnBpbmcoKTtcblxuXHR9LFxuXG5cdC8vIHJldHVybiB0aGUgdGltZSBzY2FsZSBjb25zaWRlcmluZyB3YXJwaW5nIGFuZCAucGF1c2VkXG5cdGdldEVmZmVjdGl2ZVRpbWVTY2FsZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuX2VmZmVjdGl2ZVRpbWVTY2FsZTtcblxuXHR9LFxuXG5cdHNldER1cmF0aW9uOiBmdW5jdGlvbiAoIGR1cmF0aW9uICkge1xuXG5cdFx0dGhpcy50aW1lU2NhbGUgPSB0aGlzLl9jbGlwLmR1cmF0aW9uIC8gZHVyYXRpb247XG5cblx0XHRyZXR1cm4gdGhpcy5zdG9wV2FycGluZygpO1xuXG5cdH0sXG5cblx0c3luY1dpdGg6IGZ1bmN0aW9uICggYWN0aW9uICkge1xuXG5cdFx0dGhpcy50aW1lID0gYWN0aW9uLnRpbWU7XG5cdFx0dGhpcy50aW1lU2NhbGUgPSBhY3Rpb24udGltZVNjYWxlO1xuXG5cdFx0cmV0dXJuIHRoaXMuc3RvcFdhcnBpbmcoKTtcblxuXHR9LFxuXG5cdGhhbHQ6IGZ1bmN0aW9uICggZHVyYXRpb24gKSB7XG5cblx0XHRyZXR1cm4gdGhpcy53YXJwKCB0aGlzLl9lZmZlY3RpdmVUaW1lU2NhbGUsIDAsIGR1cmF0aW9uICk7XG5cblx0fSxcblxuXHR3YXJwOiBmdW5jdGlvbiAoIHN0YXJ0VGltZVNjYWxlLCBlbmRUaW1lU2NhbGUsIGR1cmF0aW9uICkge1xuXG5cdFx0dmFyIG1peGVyID0gdGhpcy5fbWl4ZXIsIG5vdyA9IG1peGVyLnRpbWUsXG5cdFx0XHRpbnRlcnBvbGFudCA9IHRoaXMuX3RpbWVTY2FsZUludGVycG9sYW50LFxuXG5cdFx0XHR0aW1lU2NhbGUgPSB0aGlzLnRpbWVTY2FsZTtcblxuXHRcdGlmICggaW50ZXJwb2xhbnQgPT09IG51bGwgKSB7XG5cblx0XHRcdGludGVycG9sYW50ID0gbWl4ZXIuX2xlbmRDb250cm9sSW50ZXJwb2xhbnQoKTtcblx0XHRcdHRoaXMuX3RpbWVTY2FsZUludGVycG9sYW50ID0gaW50ZXJwb2xhbnQ7XG5cblx0XHR9XG5cblx0XHR2YXIgdGltZXMgPSBpbnRlcnBvbGFudC5wYXJhbWV0ZXJQb3NpdGlvbnMsXG5cdFx0XHR2YWx1ZXMgPSBpbnRlcnBvbGFudC5zYW1wbGVWYWx1ZXM7XG5cblx0XHR0aW1lc1sgMCBdID0gbm93O1xuXHRcdHRpbWVzWyAxIF0gPSBub3cgKyBkdXJhdGlvbjtcblxuXHRcdHZhbHVlc1sgMCBdID0gc3RhcnRUaW1lU2NhbGUgLyB0aW1lU2NhbGU7XG5cdFx0dmFsdWVzWyAxIF0gPSBlbmRUaW1lU2NhbGUgLyB0aW1lU2NhbGU7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHN0b3BXYXJwaW5nOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdGltZVNjYWxlSW50ZXJwb2xhbnQgPSB0aGlzLl90aW1lU2NhbGVJbnRlcnBvbGFudDtcblxuXHRcdGlmICggdGltZVNjYWxlSW50ZXJwb2xhbnQgIT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuX3RpbWVTY2FsZUludGVycG9sYW50ID0gbnVsbDtcblx0XHRcdHRoaXMuX21peGVyLl90YWtlQmFja0NvbnRyb2xJbnRlcnBvbGFudCggdGltZVNjYWxlSW50ZXJwb2xhbnQgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Ly8gT2JqZWN0IEFjY2Vzc29yc1xuXG5cdGdldE1peGVyOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5fbWl4ZXI7XG5cblx0fSxcblxuXHRnZXRDbGlwOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5fY2xpcDtcblxuXHR9LFxuXG5cdGdldFJvb3Q6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLl9sb2NhbFJvb3QgfHwgdGhpcy5fbWl4ZXIuX3Jvb3Q7XG5cblx0fSxcblxuXHQvLyBJbnRlcm5hXG5cblx0X3VwZGF0ZTogZnVuY3Rpb24gKCB0aW1lLCBkZWx0YVRpbWUsIHRpbWVEaXJlY3Rpb24sIGFjY3VJbmRleCApIHtcblxuXHRcdC8vIGNhbGxlZCBieSB0aGUgbWl4ZXJcblxuXHRcdGlmICggISB0aGlzLmVuYWJsZWQgKSB7XG5cblx0XHRcdC8vIGNhbGwgLl91cGRhdGVXZWlnaHQoKSB0byB1cGRhdGUgLl9lZmZlY3RpdmVXZWlnaHRcblxuXHRcdFx0dGhpcy5fdXBkYXRlV2VpZ2h0KCB0aW1lICk7XG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHR2YXIgc3RhcnRUaW1lID0gdGhpcy5fc3RhcnRUaW1lO1xuXG5cdFx0aWYgKCBzdGFydFRpbWUgIT09IG51bGwgKSB7XG5cblx0XHRcdC8vIGNoZWNrIGZvciBzY2hlZHVsZWQgc3RhcnQgb2YgYWN0aW9uXG5cblx0XHRcdHZhciB0aW1lUnVubmluZyA9ICggdGltZSAtIHN0YXJ0VGltZSApICogdGltZURpcmVjdGlvbjtcblx0XHRcdGlmICggdGltZVJ1bm5pbmcgPCAwIHx8IHRpbWVEaXJlY3Rpb24gPT09IDAgKSB7XG5cblx0XHRcdFx0cmV0dXJuOyAvLyB5ZXQgdG8gY29tZSAvIGRvbid0IGRlY2lkZSB3aGVuIGRlbHRhID0gMFxuXG5cdFx0XHR9XG5cblx0XHRcdC8vIHN0YXJ0XG5cblx0XHRcdHRoaXMuX3N0YXJ0VGltZSA9IG51bGw7IC8vIHVuc2NoZWR1bGVcblx0XHRcdGRlbHRhVGltZSA9IHRpbWVEaXJlY3Rpb24gKiB0aW1lUnVubmluZztcblxuXHRcdH1cblxuXHRcdC8vIGFwcGx5IHRpbWUgc2NhbGUgYW5kIGFkdmFuY2UgdGltZVxuXG5cdFx0ZGVsdGFUaW1lICo9IHRoaXMuX3VwZGF0ZVRpbWVTY2FsZSggdGltZSApO1xuXHRcdHZhciBjbGlwVGltZSA9IHRoaXMuX3VwZGF0ZVRpbWUoIGRlbHRhVGltZSApO1xuXG5cdFx0Ly8gbm90ZTogX3VwZGF0ZVRpbWUgbWF5IGRpc2FibGUgdGhlIGFjdGlvbiByZXN1bHRpbmcgaW5cblx0XHQvLyBhbiBlZmZlY3RpdmUgd2VpZ2h0IG9mIDBcblxuXHRcdHZhciB3ZWlnaHQgPSB0aGlzLl91cGRhdGVXZWlnaHQoIHRpbWUgKTtcblxuXHRcdGlmICggd2VpZ2h0ID4gMCApIHtcblxuXHRcdFx0dmFyIGludGVycG9sYW50cyA9IHRoaXMuX2ludGVycG9sYW50cztcblx0XHRcdHZhciBwcm9wZXJ0eU1peGVycyA9IHRoaXMuX3Byb3BlcnR5QmluZGluZ3M7XG5cblx0XHRcdGZvciAoIHZhciBqID0gMCwgbSA9IGludGVycG9sYW50cy5sZW5ndGg7IGogIT09IG07ICsrIGogKSB7XG5cblx0XHRcdFx0aW50ZXJwb2xhbnRzWyBqIF0uZXZhbHVhdGUoIGNsaXBUaW1lICk7XG5cdFx0XHRcdHByb3BlcnR5TWl4ZXJzWyBqIF0uYWNjdW11bGF0ZSggYWNjdUluZGV4LCB3ZWlnaHQgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH0sXG5cblx0X3VwZGF0ZVdlaWdodDogZnVuY3Rpb24gKCB0aW1lICkge1xuXG5cdFx0dmFyIHdlaWdodCA9IDA7XG5cblx0XHRpZiAoIHRoaXMuZW5hYmxlZCApIHtcblxuXHRcdFx0d2VpZ2h0ID0gdGhpcy53ZWlnaHQ7XG5cdFx0XHR2YXIgaW50ZXJwb2xhbnQgPSB0aGlzLl93ZWlnaHRJbnRlcnBvbGFudDtcblxuXHRcdFx0aWYgKCBpbnRlcnBvbGFudCAhPT0gbnVsbCApIHtcblxuXHRcdFx0XHR2YXIgaW50ZXJwb2xhbnRWYWx1ZSA9IGludGVycG9sYW50LmV2YWx1YXRlKCB0aW1lIClbIDAgXTtcblxuXHRcdFx0XHR3ZWlnaHQgKj0gaW50ZXJwb2xhbnRWYWx1ZTtcblxuXHRcdFx0XHRpZiAoIHRpbWUgPiBpbnRlcnBvbGFudC5wYXJhbWV0ZXJQb3NpdGlvbnNbIDEgXSApIHtcblxuXHRcdFx0XHRcdHRoaXMuc3RvcEZhZGluZygpO1xuXG5cdFx0XHRcdFx0aWYgKCBpbnRlcnBvbGFudFZhbHVlID09PSAwICkge1xuXG5cdFx0XHRcdFx0XHQvLyBmYWRlZCBvdXQsIGRpc2FibGVcblx0XHRcdFx0XHRcdHRoaXMuZW5hYmxlZCA9IGZhbHNlO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0dGhpcy5fZWZmZWN0aXZlV2VpZ2h0ID0gd2VpZ2h0O1xuXHRcdHJldHVybiB3ZWlnaHQ7XG5cblx0fSxcblxuXHRfdXBkYXRlVGltZVNjYWxlOiBmdW5jdGlvbiAoIHRpbWUgKSB7XG5cblx0XHR2YXIgdGltZVNjYWxlID0gMDtcblxuXHRcdGlmICggISB0aGlzLnBhdXNlZCApIHtcblxuXHRcdFx0dGltZVNjYWxlID0gdGhpcy50aW1lU2NhbGU7XG5cblx0XHRcdHZhciBpbnRlcnBvbGFudCA9IHRoaXMuX3RpbWVTY2FsZUludGVycG9sYW50O1xuXG5cdFx0XHRpZiAoIGludGVycG9sYW50ICE9PSBudWxsICkge1xuXG5cdFx0XHRcdHZhciBpbnRlcnBvbGFudFZhbHVlID0gaW50ZXJwb2xhbnQuZXZhbHVhdGUoIHRpbWUgKVsgMCBdO1xuXG5cdFx0XHRcdHRpbWVTY2FsZSAqPSBpbnRlcnBvbGFudFZhbHVlO1xuXG5cdFx0XHRcdGlmICggdGltZSA+IGludGVycG9sYW50LnBhcmFtZXRlclBvc2l0aW9uc1sgMSBdICkge1xuXG5cdFx0XHRcdFx0dGhpcy5zdG9wV2FycGluZygpO1xuXG5cdFx0XHRcdFx0aWYgKCB0aW1lU2NhbGUgPT09IDAgKSB7XG5cblx0XHRcdFx0XHRcdC8vIG1vdGlvbiBoYXMgaGFsdGVkLCBwYXVzZVxuXHRcdFx0XHRcdFx0dGhpcy5wYXVzZWQgPSB0cnVlO1xuXG5cdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0Ly8gd2FycCBkb25lIC0gYXBwbHkgZmluYWwgdGltZSBzY2FsZVxuXHRcdFx0XHRcdFx0dGhpcy50aW1lU2NhbGUgPSB0aW1lU2NhbGU7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHR0aGlzLl9lZmZlY3RpdmVUaW1lU2NhbGUgPSB0aW1lU2NhbGU7XG5cdFx0cmV0dXJuIHRpbWVTY2FsZTtcblxuXHR9LFxuXG5cdF91cGRhdGVUaW1lOiBmdW5jdGlvbiAoIGRlbHRhVGltZSApIHtcblxuXHRcdHZhciB0aW1lID0gdGhpcy50aW1lICsgZGVsdGFUaW1lO1xuXG5cdFx0aWYgKCBkZWx0YVRpbWUgPT09IDAgKSByZXR1cm4gdGltZTtcblxuXHRcdHZhciBkdXJhdGlvbiA9IHRoaXMuX2NsaXAuZHVyYXRpb24sXG5cblx0XHRcdGxvb3AgPSB0aGlzLmxvb3AsXG5cdFx0XHRsb29wQ291bnQgPSB0aGlzLl9sb29wQ291bnQ7XG5cblx0XHRpZiAoIGxvb3AgPT09IExvb3BPbmNlICkge1xuXG5cdFx0XHRpZiAoIGxvb3BDb3VudCA9PT0gLSAxICkge1xuXG5cdFx0XHRcdC8vIGp1c3Qgc3RhcnRlZFxuXG5cdFx0XHRcdHRoaXMuX2xvb3BDb3VudCA9IDA7XG5cdFx0XHRcdHRoaXMuX3NldEVuZGluZ3MoIHRydWUsIHRydWUsIGZhbHNlICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aGFuZGxlX3N0b3A6IHtcblxuXHRcdFx0XHRpZiAoIHRpbWUgPj0gZHVyYXRpb24gKSB7XG5cblx0XHRcdFx0XHR0aW1lID0gZHVyYXRpb247XG5cblx0XHRcdFx0fSBlbHNlIGlmICggdGltZSA8IDAgKSB7XG5cblx0XHRcdFx0XHR0aW1lID0gMDtcblxuXHRcdFx0XHR9IGVsc2UgYnJlYWsgaGFuZGxlX3N0b3A7XG5cblx0XHRcdFx0aWYgKCB0aGlzLmNsYW1wV2hlbkZpbmlzaGVkICkgdGhpcy5wYXVzZWQgPSB0cnVlO1xuXHRcdFx0XHRlbHNlIHRoaXMuZW5hYmxlZCA9IGZhbHNlO1xuXG5cdFx0XHRcdHRoaXMuX21peGVyLmRpc3BhdGNoRXZlbnQoIHtcblx0XHRcdFx0XHR0eXBlOiAnZmluaXNoZWQnLCBhY3Rpb246IHRoaXMsXG5cdFx0XHRcdFx0ZGlyZWN0aW9uOiBkZWx0YVRpbWUgPCAwID8gLSAxIDogMVxuXHRcdFx0XHR9ICk7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7IC8vIHJlcGV0aXRpdmUgUmVwZWF0IG9yIFBpbmdQb25nXG5cblx0XHRcdHZhciBwaW5nUG9uZyA9ICggbG9vcCA9PT0gTG9vcFBpbmdQb25nICk7XG5cblx0XHRcdGlmICggbG9vcENvdW50ID09PSAtIDEgKSB7XG5cblx0XHRcdFx0Ly8ganVzdCBzdGFydGVkXG5cblx0XHRcdFx0aWYgKCBkZWx0YVRpbWUgPj0gMCApIHtcblxuXHRcdFx0XHRcdGxvb3BDb3VudCA9IDA7XG5cblx0XHRcdFx0XHR0aGlzLl9zZXRFbmRpbmdzKCB0cnVlLCB0aGlzLnJlcGV0aXRpb25zID09PSAwLCBwaW5nUG9uZyApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHQvLyB3aGVuIGxvb3BpbmcgaW4gcmV2ZXJzZSBkaXJlY3Rpb24sIHRoZSBpbml0aWFsXG5cdFx0XHRcdFx0Ly8gdHJhbnNpdGlvbiB0aHJvdWdoIHplcm8gY291bnRzIGFzIGEgcmVwZXRpdGlvbixcblx0XHRcdFx0XHQvLyBzbyBsZWF2ZSBsb29wQ291bnQgYXQgLTFcblxuXHRcdFx0XHRcdHRoaXMuX3NldEVuZGluZ3MoIHRoaXMucmVwZXRpdGlvbnMgPT09IDAsIHRydWUsIHBpbmdQb25nICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggdGltZSA+PSBkdXJhdGlvbiB8fCB0aW1lIDwgMCApIHtcblxuXHRcdFx0XHQvLyB3cmFwIGFyb3VuZFxuXG5cdFx0XHRcdHZhciBsb29wRGVsdGEgPSBNYXRoLmZsb29yKCB0aW1lIC8gZHVyYXRpb24gKTsgLy8gc2lnbmVkXG5cdFx0XHRcdHRpbWUgLT0gZHVyYXRpb24gKiBsb29wRGVsdGE7XG5cblx0XHRcdFx0bG9vcENvdW50ICs9IE1hdGguYWJzKCBsb29wRGVsdGEgKTtcblxuXHRcdFx0XHR2YXIgcGVuZGluZyA9IHRoaXMucmVwZXRpdGlvbnMgLSBsb29wQ291bnQ7XG5cblx0XHRcdFx0aWYgKCBwZW5kaW5nIDw9IDAgKSB7XG5cblx0XHRcdFx0XHQvLyBoYXZlIHRvIHN0b3AgKHN3aXRjaCBzdGF0ZSwgY2xhbXAgdGltZSwgZmlyZSBldmVudClcblxuXHRcdFx0XHRcdGlmICggdGhpcy5jbGFtcFdoZW5GaW5pc2hlZCApIHRoaXMucGF1c2VkID0gdHJ1ZTtcblx0XHRcdFx0XHRlbHNlIHRoaXMuZW5hYmxlZCA9IGZhbHNlO1xuXG5cdFx0XHRcdFx0dGltZSA9IGRlbHRhVGltZSA+IDAgPyBkdXJhdGlvbiA6IDA7XG5cblx0XHRcdFx0XHR0aGlzLl9taXhlci5kaXNwYXRjaEV2ZW50KCB7XG5cdFx0XHRcdFx0XHR0eXBlOiAnZmluaXNoZWQnLCBhY3Rpb246IHRoaXMsXG5cdFx0XHRcdFx0XHRkaXJlY3Rpb246IGRlbHRhVGltZSA+IDAgPyAxIDogLSAxXG5cdFx0XHRcdFx0fSApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHQvLyBrZWVwIHJ1bm5pbmdcblxuXHRcdFx0XHRcdGlmICggcGVuZGluZyA9PT0gMSApIHtcblxuXHRcdFx0XHRcdFx0Ly8gZW50ZXJpbmcgdGhlIGxhc3Qgcm91bmRcblxuXHRcdFx0XHRcdFx0dmFyIGF0U3RhcnQgPSBkZWx0YVRpbWUgPCAwO1xuXHRcdFx0XHRcdFx0dGhpcy5fc2V0RW5kaW5ncyggYXRTdGFydCwgISBhdFN0YXJ0LCBwaW5nUG9uZyApO1xuXG5cdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0dGhpcy5fc2V0RW5kaW5ncyggZmFsc2UsIGZhbHNlLCBwaW5nUG9uZyApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0dGhpcy5fbG9vcENvdW50ID0gbG9vcENvdW50O1xuXG5cdFx0XHRcdFx0dGhpcy5fbWl4ZXIuZGlzcGF0Y2hFdmVudCgge1xuXHRcdFx0XHRcdFx0dHlwZTogJ2xvb3AnLCBhY3Rpb246IHRoaXMsIGxvb3BEZWx0YTogbG9vcERlbHRhXG5cdFx0XHRcdFx0fSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHBpbmdQb25nICYmICggbG9vcENvdW50ICYgMSApID09PSAxICkge1xuXG5cdFx0XHRcdC8vIGludmVydCB0aW1lIGZvciB0aGUgXCJwb25nIHJvdW5kXCJcblxuXHRcdFx0XHR0aGlzLnRpbWUgPSB0aW1lO1xuXHRcdFx0XHRyZXR1cm4gZHVyYXRpb24gLSB0aW1lO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHR0aGlzLnRpbWUgPSB0aW1lO1xuXHRcdHJldHVybiB0aW1lO1xuXG5cdH0sXG5cblx0X3NldEVuZGluZ3M6IGZ1bmN0aW9uICggYXRTdGFydCwgYXRFbmQsIHBpbmdQb25nICkge1xuXG5cdFx0dmFyIHNldHRpbmdzID0gdGhpcy5faW50ZXJwb2xhbnRTZXR0aW5ncztcblxuXHRcdGlmICggcGluZ1BvbmcgKSB7XG5cblx0XHRcdHNldHRpbmdzLmVuZGluZ1N0YXJ0IFx0PSBaZXJvU2xvcGVFbmRpbmc7XG5cdFx0XHRzZXR0aW5ncy5lbmRpbmdFbmRcdFx0PSBaZXJvU2xvcGVFbmRpbmc7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBhc3N1bWluZyBmb3IgTG9vcE9uY2UgYXRTdGFydCA9PSBhdEVuZCA9PSB0cnVlXG5cblx0XHRcdGlmICggYXRTdGFydCApIHtcblxuXHRcdFx0XHRzZXR0aW5ncy5lbmRpbmdTdGFydCA9IHRoaXMuemVyb1Nsb3BlQXRTdGFydCA/IFplcm9TbG9wZUVuZGluZyA6IFplcm9DdXJ2YXR1cmVFbmRpbmc7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0c2V0dGluZ3MuZW5kaW5nU3RhcnQgPSBXcmFwQXJvdW5kRW5kaW5nO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggYXRFbmQgKSB7XG5cblx0XHRcdFx0c2V0dGluZ3MuZW5kaW5nRW5kID0gdGhpcy56ZXJvU2xvcGVBdEVuZCA/IFplcm9TbG9wZUVuZGluZyA6IFplcm9DdXJ2YXR1cmVFbmRpbmc7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0c2V0dGluZ3MuZW5kaW5nRW5kIFx0ID0gV3JhcEFyb3VuZEVuZGluZztcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH0sXG5cblx0X3NjaGVkdWxlRmFkaW5nOiBmdW5jdGlvbiAoIGR1cmF0aW9uLCB3ZWlnaHROb3csIHdlaWdodFRoZW4gKSB7XG5cblx0XHR2YXIgbWl4ZXIgPSB0aGlzLl9taXhlciwgbm93ID0gbWl4ZXIudGltZSxcblx0XHRcdGludGVycG9sYW50ID0gdGhpcy5fd2VpZ2h0SW50ZXJwb2xhbnQ7XG5cblx0XHRpZiAoIGludGVycG9sYW50ID09PSBudWxsICkge1xuXG5cdFx0XHRpbnRlcnBvbGFudCA9IG1peGVyLl9sZW5kQ29udHJvbEludGVycG9sYW50KCk7XG5cdFx0XHR0aGlzLl93ZWlnaHRJbnRlcnBvbGFudCA9IGludGVycG9sYW50O1xuXG5cdFx0fVxuXG5cdFx0dmFyIHRpbWVzID0gaW50ZXJwb2xhbnQucGFyYW1ldGVyUG9zaXRpb25zLFxuXHRcdFx0dmFsdWVzID0gaW50ZXJwb2xhbnQuc2FtcGxlVmFsdWVzO1xuXG5cdFx0dGltZXNbIDAgXSA9IG5vdzsgXHRcdFx0XHR2YWx1ZXNbIDAgXSA9IHdlaWdodE5vdztcblx0XHR0aW1lc1sgMSBdID0gbm93ICsgZHVyYXRpb247XHR2YWx1ZXNbIDEgXSA9IHdlaWdodFRoZW47XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKlxuICogUGxheWVyIGZvciBBbmltYXRpb25DbGlwcy5cbiAqXG4gKlxuICogQGF1dGhvciBCZW4gSG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pby9cbiAqIEBhdXRob3IgRGF2aWQgU2Fybm8gLyBodHRwOi8vbGlnaHRoYXVzLnVzL1xuICogQGF1dGhvciB0c2Nod1xuICovXG5cbmZ1bmN0aW9uIEFuaW1hdGlvbk1peGVyKCByb290ICkge1xuXG5cdHRoaXMuX3Jvb3QgPSByb290O1xuXHR0aGlzLl9pbml0TWVtb3J5TWFuYWdlcigpO1xuXHR0aGlzLl9hY2N1SW5kZXggPSAwO1xuXG5cdHRoaXMudGltZSA9IDA7XG5cblx0dGhpcy50aW1lU2NhbGUgPSAxLjA7XG5cbn1cblxuQW5pbWF0aW9uTWl4ZXIucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggRXZlbnREaXNwYXRjaGVyLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IEFuaW1hdGlvbk1peGVyLFxuXG5cdF9iaW5kQWN0aW9uOiBmdW5jdGlvbiAoIGFjdGlvbiwgcHJvdG90eXBlQWN0aW9uICkge1xuXG5cdFx0dmFyIHJvb3QgPSBhY3Rpb24uX2xvY2FsUm9vdCB8fCB0aGlzLl9yb290LFxuXHRcdFx0dHJhY2tzID0gYWN0aW9uLl9jbGlwLnRyYWNrcyxcblx0XHRcdG5UcmFja3MgPSB0cmFja3MubGVuZ3RoLFxuXHRcdFx0YmluZGluZ3MgPSBhY3Rpb24uX3Byb3BlcnR5QmluZGluZ3MsXG5cdFx0XHRpbnRlcnBvbGFudHMgPSBhY3Rpb24uX2ludGVycG9sYW50cyxcblx0XHRcdHJvb3RVdWlkID0gcm9vdC51dWlkLFxuXHRcdFx0YmluZGluZ3NCeVJvb3QgPSB0aGlzLl9iaW5kaW5nc0J5Um9vdEFuZE5hbWUsXG5cdFx0XHRiaW5kaW5nc0J5TmFtZSA9IGJpbmRpbmdzQnlSb290WyByb290VXVpZCBdO1xuXG5cdFx0aWYgKCBiaW5kaW5nc0J5TmFtZSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRiaW5kaW5nc0J5TmFtZSA9IHt9O1xuXHRcdFx0YmluZGluZ3NCeVJvb3RbIHJvb3RVdWlkIF0gPSBiaW5kaW5nc0J5TmFtZTtcblxuXHRcdH1cblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSAhPT0gblRyYWNrczsgKysgaSApIHtcblxuXHRcdFx0dmFyIHRyYWNrID0gdHJhY2tzWyBpIF0sXG5cdFx0XHRcdHRyYWNrTmFtZSA9IHRyYWNrLm5hbWUsXG5cdFx0XHRcdGJpbmRpbmcgPSBiaW5kaW5nc0J5TmFtZVsgdHJhY2tOYW1lIF07XG5cblx0XHRcdGlmICggYmluZGluZyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGJpbmRpbmdzWyBpIF0gPSBiaW5kaW5nO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGJpbmRpbmcgPSBiaW5kaW5nc1sgaSBdO1xuXG5cdFx0XHRcdGlmICggYmluZGluZyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0Ly8gZXhpc3RpbmcgYmluZGluZywgbWFrZSBzdXJlIHRoZSBjYWNoZSBrbm93c1xuXG5cdFx0XHRcdFx0aWYgKCBiaW5kaW5nLl9jYWNoZUluZGV4ID09PSBudWxsICkge1xuXG5cdFx0XHRcdFx0XHQrKyBiaW5kaW5nLnJlZmVyZW5jZUNvdW50O1xuXHRcdFx0XHRcdFx0dGhpcy5fYWRkSW5hY3RpdmVCaW5kaW5nKCBiaW5kaW5nLCByb290VXVpZCwgdHJhY2tOYW1lICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRjb250aW51ZTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dmFyIHBhdGggPSBwcm90b3R5cGVBY3Rpb24gJiYgcHJvdG90eXBlQWN0aW9uLlxuXHRcdFx0XHRcdF9wcm9wZXJ0eUJpbmRpbmdzWyBpIF0uYmluZGluZy5wYXJzZWRQYXRoO1xuXG5cdFx0XHRcdGJpbmRpbmcgPSBuZXcgUHJvcGVydHlNaXhlcihcblx0XHRcdFx0XHRQcm9wZXJ0eUJpbmRpbmcuY3JlYXRlKCByb290LCB0cmFja05hbWUsIHBhdGggKSxcblx0XHRcdFx0XHR0cmFjay5WYWx1ZVR5cGVOYW1lLCB0cmFjay5nZXRWYWx1ZVNpemUoKSApO1xuXG5cdFx0XHRcdCsrIGJpbmRpbmcucmVmZXJlbmNlQ291bnQ7XG5cdFx0XHRcdHRoaXMuX2FkZEluYWN0aXZlQmluZGluZyggYmluZGluZywgcm9vdFV1aWQsIHRyYWNrTmFtZSApO1xuXG5cdFx0XHRcdGJpbmRpbmdzWyBpIF0gPSBiaW5kaW5nO1xuXG5cdFx0XHR9XG5cblx0XHRcdGludGVycG9sYW50c1sgaSBdLnJlc3VsdEJ1ZmZlciA9IGJpbmRpbmcuYnVmZmVyO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0X2FjdGl2YXRlQWN0aW9uOiBmdW5jdGlvbiAoIGFjdGlvbiApIHtcblxuXHRcdGlmICggISB0aGlzLl9pc0FjdGl2ZUFjdGlvbiggYWN0aW9uICkgKSB7XG5cblx0XHRcdGlmICggYWN0aW9uLl9jYWNoZUluZGV4ID09PSBudWxsICkge1xuXG5cdFx0XHRcdC8vIHRoaXMgYWN0aW9uIGhhcyBiZWVuIGZvcmdvdHRlbiBieSB0aGUgY2FjaGUsIGJ1dCB0aGUgdXNlclxuXHRcdFx0XHQvLyBhcHBlYXJzIHRvIGJlIHN0aWxsIHVzaW5nIGl0IC0+IHJlYmluZFxuXG5cdFx0XHRcdHZhciByb290VXVpZCA9ICggYWN0aW9uLl9sb2NhbFJvb3QgfHwgdGhpcy5fcm9vdCApLnV1aWQsXG5cdFx0XHRcdFx0Y2xpcFV1aWQgPSBhY3Rpb24uX2NsaXAudXVpZCxcblx0XHRcdFx0XHRhY3Rpb25zRm9yQ2xpcCA9IHRoaXMuX2FjdGlvbnNCeUNsaXBbIGNsaXBVdWlkIF07XG5cblx0XHRcdFx0dGhpcy5fYmluZEFjdGlvbiggYWN0aW9uLFxuXHRcdFx0XHRcdGFjdGlvbnNGb3JDbGlwICYmIGFjdGlvbnNGb3JDbGlwLmtub3duQWN0aW9uc1sgMCBdICk7XG5cblx0XHRcdFx0dGhpcy5fYWRkSW5hY3RpdmVBY3Rpb24oIGFjdGlvbiwgY2xpcFV1aWQsIHJvb3RVdWlkICk7XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIGJpbmRpbmdzID0gYWN0aW9uLl9wcm9wZXJ0eUJpbmRpbmdzO1xuXG5cdFx0XHQvLyBpbmNyZW1lbnQgcmVmZXJlbmNlIGNvdW50cyAvIHNvcnQgb3V0IHN0YXRlXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIG4gPSBiaW5kaW5ncy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRcdFx0dmFyIGJpbmRpbmcgPSBiaW5kaW5nc1sgaSBdO1xuXG5cdFx0XHRcdGlmICggYmluZGluZy51c2VDb3VudCArKyA9PT0gMCApIHtcblxuXHRcdFx0XHRcdHRoaXMuX2xlbmRCaW5kaW5nKCBiaW5kaW5nICk7XG5cdFx0XHRcdFx0YmluZGluZy5zYXZlT3JpZ2luYWxTdGF0ZSgpO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLl9sZW5kQWN0aW9uKCBhY3Rpb24gKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdF9kZWFjdGl2YXRlQWN0aW9uOiBmdW5jdGlvbiAoIGFjdGlvbiApIHtcblxuXHRcdGlmICggdGhpcy5faXNBY3RpdmVBY3Rpb24oIGFjdGlvbiApICkge1xuXG5cdFx0XHR2YXIgYmluZGluZ3MgPSBhY3Rpb24uX3Byb3BlcnR5QmluZGluZ3M7XG5cblx0XHRcdC8vIGRlY3JlbWVudCByZWZlcmVuY2UgY291bnRzIC8gc29ydCBvdXQgc3RhdGVcblx0XHRcdGZvciAoIHZhciBpID0gMCwgbiA9IGJpbmRpbmdzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0XHR2YXIgYmluZGluZyA9IGJpbmRpbmdzWyBpIF07XG5cblx0XHRcdFx0aWYgKCAtLSBiaW5kaW5nLnVzZUNvdW50ID09PSAwICkge1xuXG5cdFx0XHRcdFx0YmluZGluZy5yZXN0b3JlT3JpZ2luYWxTdGF0ZSgpO1xuXHRcdFx0XHRcdHRoaXMuX3Rha2VCYWNrQmluZGluZyggYmluZGluZyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLl90YWtlQmFja0FjdGlvbiggYWN0aW9uICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHQvLyBNZW1vcnkgbWFuYWdlclxuXG5cdF9pbml0TWVtb3J5TWFuYWdlcjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5fYWN0aW9ucyA9IFtdOyAvLyAnbkFjdGl2ZUFjdGlvbnMnIGZvbGxvd2VkIGJ5IGluYWN0aXZlIG9uZXNcblx0XHR0aGlzLl9uQWN0aXZlQWN0aW9ucyA9IDA7XG5cblx0XHR0aGlzLl9hY3Rpb25zQnlDbGlwID0ge307XG5cdFx0Ly8gaW5zaWRlOlxuXHRcdC8vIHtcblx0XHQvLyBcdFx0a25vd25BY3Rpb25zOiBBcnJheTwgQW5pbWF0aW9uQWN0aW9uID5cdC0gdXNlZCBhcyBwcm90b3R5cGVzXG5cdFx0Ly8gXHRcdGFjdGlvbkJ5Um9vdDogQW5pbWF0aW9uQWN0aW9uXHRcdFx0LSBsb29rdXBcblx0XHQvLyB9XG5cblxuXHRcdHRoaXMuX2JpbmRpbmdzID0gW107IC8vICduQWN0aXZlQmluZGluZ3MnIGZvbGxvd2VkIGJ5IGluYWN0aXZlIG9uZXNcblx0XHR0aGlzLl9uQWN0aXZlQmluZGluZ3MgPSAwO1xuXG5cdFx0dGhpcy5fYmluZGluZ3NCeVJvb3RBbmROYW1lID0ge307IC8vIGluc2lkZTogTWFwPCBuYW1lLCBQcm9wZXJ0eU1peGVyID5cblxuXG5cdFx0dGhpcy5fY29udHJvbEludGVycG9sYW50cyA9IFtdOyAvLyBzYW1lIGdhbWUgYXMgYWJvdmVcblx0XHR0aGlzLl9uQWN0aXZlQ29udHJvbEludGVycG9sYW50cyA9IDA7XG5cblx0XHR2YXIgc2NvcGUgPSB0aGlzO1xuXG5cdFx0dGhpcy5zdGF0cyA9IHtcblxuXHRcdFx0YWN0aW9uczoge1xuXHRcdFx0XHRnZXQgdG90YWwoKSB7XG5cblx0XHRcdFx0XHRyZXR1cm4gc2NvcGUuX2FjdGlvbnMubGVuZ3RoO1xuXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGdldCBpblVzZSgpIHtcblxuXHRcdFx0XHRcdHJldHVybiBzY29wZS5fbkFjdGl2ZUFjdGlvbnM7XG5cblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdGJpbmRpbmdzOiB7XG5cdFx0XHRcdGdldCB0b3RhbCgpIHtcblxuXHRcdFx0XHRcdHJldHVybiBzY29wZS5fYmluZGluZ3MubGVuZ3RoO1xuXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGdldCBpblVzZSgpIHtcblxuXHRcdFx0XHRcdHJldHVybiBzY29wZS5fbkFjdGl2ZUJpbmRpbmdzO1xuXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRjb250cm9sSW50ZXJwb2xhbnRzOiB7XG5cdFx0XHRcdGdldCB0b3RhbCgpIHtcblxuXHRcdFx0XHRcdHJldHVybiBzY29wZS5fY29udHJvbEludGVycG9sYW50cy5sZW5ndGg7XG5cblx0XHRcdFx0fSxcblx0XHRcdFx0Z2V0IGluVXNlKCkge1xuXG5cdFx0XHRcdFx0cmV0dXJuIHNjb3BlLl9uQWN0aXZlQ29udHJvbEludGVycG9sYW50cztcblxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHR9O1xuXG5cdH0sXG5cblx0Ly8gTWVtb3J5IG1hbmFnZW1lbnQgZm9yIEFuaW1hdGlvbkFjdGlvbiBvYmplY3RzXG5cblx0X2lzQWN0aXZlQWN0aW9uOiBmdW5jdGlvbiAoIGFjdGlvbiApIHtcblxuXHRcdHZhciBpbmRleCA9IGFjdGlvbi5fY2FjaGVJbmRleDtcblx0XHRyZXR1cm4gaW5kZXggIT09IG51bGwgJiYgaW5kZXggPCB0aGlzLl9uQWN0aXZlQWN0aW9ucztcblxuXHR9LFxuXG5cdF9hZGRJbmFjdGl2ZUFjdGlvbjogZnVuY3Rpb24gKCBhY3Rpb24sIGNsaXBVdWlkLCByb290VXVpZCApIHtcblxuXHRcdHZhciBhY3Rpb25zID0gdGhpcy5fYWN0aW9ucyxcblx0XHRcdGFjdGlvbnNCeUNsaXAgPSB0aGlzLl9hY3Rpb25zQnlDbGlwLFxuXHRcdFx0YWN0aW9uc0ZvckNsaXAgPSBhY3Rpb25zQnlDbGlwWyBjbGlwVXVpZCBdO1xuXG5cdFx0aWYgKCBhY3Rpb25zRm9yQ2xpcCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRhY3Rpb25zRm9yQ2xpcCA9IHtcblxuXHRcdFx0XHRrbm93bkFjdGlvbnM6IFsgYWN0aW9uIF0sXG5cdFx0XHRcdGFjdGlvbkJ5Um9vdDoge31cblxuXHRcdFx0fTtcblxuXHRcdFx0YWN0aW9uLl9ieUNsaXBDYWNoZUluZGV4ID0gMDtcblxuXHRcdFx0YWN0aW9uc0J5Q2xpcFsgY2xpcFV1aWQgXSA9IGFjdGlvbnNGb3JDbGlwO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dmFyIGtub3duQWN0aW9ucyA9IGFjdGlvbnNGb3JDbGlwLmtub3duQWN0aW9ucztcblxuXHRcdFx0YWN0aW9uLl9ieUNsaXBDYWNoZUluZGV4ID0ga25vd25BY3Rpb25zLmxlbmd0aDtcblx0XHRcdGtub3duQWN0aW9ucy5wdXNoKCBhY3Rpb24gKTtcblxuXHRcdH1cblxuXHRcdGFjdGlvbi5fY2FjaGVJbmRleCA9IGFjdGlvbnMubGVuZ3RoO1xuXHRcdGFjdGlvbnMucHVzaCggYWN0aW9uICk7XG5cblx0XHRhY3Rpb25zRm9yQ2xpcC5hY3Rpb25CeVJvb3RbIHJvb3RVdWlkIF0gPSBhY3Rpb247XG5cblx0fSxcblxuXHRfcmVtb3ZlSW5hY3RpdmVBY3Rpb246IGZ1bmN0aW9uICggYWN0aW9uICkge1xuXG5cdFx0dmFyIGFjdGlvbnMgPSB0aGlzLl9hY3Rpb25zLFxuXHRcdFx0bGFzdEluYWN0aXZlQWN0aW9uID0gYWN0aW9uc1sgYWN0aW9ucy5sZW5ndGggLSAxIF0sXG5cdFx0XHRjYWNoZUluZGV4ID0gYWN0aW9uLl9jYWNoZUluZGV4O1xuXG5cdFx0bGFzdEluYWN0aXZlQWN0aW9uLl9jYWNoZUluZGV4ID0gY2FjaGVJbmRleDtcblx0XHRhY3Rpb25zWyBjYWNoZUluZGV4IF0gPSBsYXN0SW5hY3RpdmVBY3Rpb247XG5cdFx0YWN0aW9ucy5wb3AoKTtcblxuXHRcdGFjdGlvbi5fY2FjaGVJbmRleCA9IG51bGw7XG5cblxuXHRcdHZhciBjbGlwVXVpZCA9IGFjdGlvbi5fY2xpcC51dWlkLFxuXHRcdFx0YWN0aW9uc0J5Q2xpcCA9IHRoaXMuX2FjdGlvbnNCeUNsaXAsXG5cdFx0XHRhY3Rpb25zRm9yQ2xpcCA9IGFjdGlvbnNCeUNsaXBbIGNsaXBVdWlkIF0sXG5cdFx0XHRrbm93bkFjdGlvbnNGb3JDbGlwID0gYWN0aW9uc0ZvckNsaXAua25vd25BY3Rpb25zLFxuXG5cdFx0XHRsYXN0S25vd25BY3Rpb24gPVxuXHRcdFx0XHRrbm93bkFjdGlvbnNGb3JDbGlwWyBrbm93bkFjdGlvbnNGb3JDbGlwLmxlbmd0aCAtIDEgXSxcblxuXHRcdFx0YnlDbGlwQ2FjaGVJbmRleCA9IGFjdGlvbi5fYnlDbGlwQ2FjaGVJbmRleDtcblxuXHRcdGxhc3RLbm93bkFjdGlvbi5fYnlDbGlwQ2FjaGVJbmRleCA9IGJ5Q2xpcENhY2hlSW5kZXg7XG5cdFx0a25vd25BY3Rpb25zRm9yQ2xpcFsgYnlDbGlwQ2FjaGVJbmRleCBdID0gbGFzdEtub3duQWN0aW9uO1xuXHRcdGtub3duQWN0aW9uc0ZvckNsaXAucG9wKCk7XG5cblx0XHRhY3Rpb24uX2J5Q2xpcENhY2hlSW5kZXggPSBudWxsO1xuXG5cblx0XHR2YXIgYWN0aW9uQnlSb290ID0gYWN0aW9uc0ZvckNsaXAuYWN0aW9uQnlSb290LFxuXHRcdFx0cm9vdFV1aWQgPSAoIGFjdGlvbi5fbG9jYWxSb290IHx8IHRoaXMuX3Jvb3QgKS51dWlkO1xuXG5cdFx0ZGVsZXRlIGFjdGlvbkJ5Um9vdFsgcm9vdFV1aWQgXTtcblxuXHRcdGlmICgga25vd25BY3Rpb25zRm9yQ2xpcC5sZW5ndGggPT09IDAgKSB7XG5cblx0XHRcdGRlbGV0ZSBhY3Rpb25zQnlDbGlwWyBjbGlwVXVpZCBdO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5fcmVtb3ZlSW5hY3RpdmVCaW5kaW5nc0ZvckFjdGlvbiggYWN0aW9uICk7XG5cblx0fSxcblxuXHRfcmVtb3ZlSW5hY3RpdmVCaW5kaW5nc0ZvckFjdGlvbjogZnVuY3Rpb24gKCBhY3Rpb24gKSB7XG5cblx0XHR2YXIgYmluZGluZ3MgPSBhY3Rpb24uX3Byb3BlcnR5QmluZGluZ3M7XG5cdFx0Zm9yICggdmFyIGkgPSAwLCBuID0gYmluZGluZ3MubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHR2YXIgYmluZGluZyA9IGJpbmRpbmdzWyBpIF07XG5cblx0XHRcdGlmICggLS0gYmluZGluZy5yZWZlcmVuY2VDb3VudCA9PT0gMCApIHtcblxuXHRcdFx0XHR0aGlzLl9yZW1vdmVJbmFjdGl2ZUJpbmRpbmcoIGJpbmRpbmcgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH0sXG5cblx0X2xlbmRBY3Rpb246IGZ1bmN0aW9uICggYWN0aW9uICkge1xuXG5cdFx0Ly8gWyBhY3RpdmUgYWN0aW9ucyB8ICBpbmFjdGl2ZSBhY3Rpb25zICBdXG5cdFx0Ly8gWyAgYWN0aXZlIGFjdGlvbnMgPnwgaW5hY3RpdmUgYWN0aW9ucyBdXG5cdFx0Ly8gICAgICAgICAgICAgICAgIHMgICAgICAgIGFcblx0XHQvLyAgICAgICAgICAgICAgICAgIDwtc3dhcC0+XG5cdFx0Ly8gICAgICAgICAgICAgICAgIGEgICAgICAgIHNcblxuXHRcdHZhciBhY3Rpb25zID0gdGhpcy5fYWN0aW9ucyxcblx0XHRcdHByZXZJbmRleCA9IGFjdGlvbi5fY2FjaGVJbmRleCxcblxuXHRcdFx0bGFzdEFjdGl2ZUluZGV4ID0gdGhpcy5fbkFjdGl2ZUFjdGlvbnMgKyssXG5cblx0XHRcdGZpcnN0SW5hY3RpdmVBY3Rpb24gPSBhY3Rpb25zWyBsYXN0QWN0aXZlSW5kZXggXTtcblxuXHRcdGFjdGlvbi5fY2FjaGVJbmRleCA9IGxhc3RBY3RpdmVJbmRleDtcblx0XHRhY3Rpb25zWyBsYXN0QWN0aXZlSW5kZXggXSA9IGFjdGlvbjtcblxuXHRcdGZpcnN0SW5hY3RpdmVBY3Rpb24uX2NhY2hlSW5kZXggPSBwcmV2SW5kZXg7XG5cdFx0YWN0aW9uc1sgcHJldkluZGV4IF0gPSBmaXJzdEluYWN0aXZlQWN0aW9uO1xuXG5cdH0sXG5cblx0X3Rha2VCYWNrQWN0aW9uOiBmdW5jdGlvbiAoIGFjdGlvbiApIHtcblxuXHRcdC8vIFsgIGFjdGl2ZSBhY3Rpb25zICB8IGluYWN0aXZlIGFjdGlvbnMgXVxuXHRcdC8vIFsgYWN0aXZlIGFjdGlvbnMgfDwgaW5hY3RpdmUgYWN0aW9ucyAgXVxuXHRcdC8vICAgICAgICBhICAgICAgICBzXG5cdFx0Ly8gICAgICAgICA8LXN3YXAtPlxuXHRcdC8vICAgICAgICBzICAgICAgICBhXG5cblx0XHR2YXIgYWN0aW9ucyA9IHRoaXMuX2FjdGlvbnMsXG5cdFx0XHRwcmV2SW5kZXggPSBhY3Rpb24uX2NhY2hlSW5kZXgsXG5cblx0XHRcdGZpcnN0SW5hY3RpdmVJbmRleCA9IC0tIHRoaXMuX25BY3RpdmVBY3Rpb25zLFxuXG5cdFx0XHRsYXN0QWN0aXZlQWN0aW9uID0gYWN0aW9uc1sgZmlyc3RJbmFjdGl2ZUluZGV4IF07XG5cblx0XHRhY3Rpb24uX2NhY2hlSW5kZXggPSBmaXJzdEluYWN0aXZlSW5kZXg7XG5cdFx0YWN0aW9uc1sgZmlyc3RJbmFjdGl2ZUluZGV4IF0gPSBhY3Rpb247XG5cblx0XHRsYXN0QWN0aXZlQWN0aW9uLl9jYWNoZUluZGV4ID0gcHJldkluZGV4O1xuXHRcdGFjdGlvbnNbIHByZXZJbmRleCBdID0gbGFzdEFjdGl2ZUFjdGlvbjtcblxuXHR9LFxuXG5cdC8vIE1lbW9yeSBtYW5hZ2VtZW50IGZvciBQcm9wZXJ0eU1peGVyIG9iamVjdHNcblxuXHRfYWRkSW5hY3RpdmVCaW5kaW5nOiBmdW5jdGlvbiAoIGJpbmRpbmcsIHJvb3RVdWlkLCB0cmFja05hbWUgKSB7XG5cblx0XHR2YXIgYmluZGluZ3NCeVJvb3QgPSB0aGlzLl9iaW5kaW5nc0J5Um9vdEFuZE5hbWUsXG5cdFx0XHRiaW5kaW5nQnlOYW1lID0gYmluZGluZ3NCeVJvb3RbIHJvb3RVdWlkIF0sXG5cblx0XHRcdGJpbmRpbmdzID0gdGhpcy5fYmluZGluZ3M7XG5cblx0XHRpZiAoIGJpbmRpbmdCeU5hbWUgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0YmluZGluZ0J5TmFtZSA9IHt9O1xuXHRcdFx0YmluZGluZ3NCeVJvb3RbIHJvb3RVdWlkIF0gPSBiaW5kaW5nQnlOYW1lO1xuXG5cdFx0fVxuXG5cdFx0YmluZGluZ0J5TmFtZVsgdHJhY2tOYW1lIF0gPSBiaW5kaW5nO1xuXG5cdFx0YmluZGluZy5fY2FjaGVJbmRleCA9IGJpbmRpbmdzLmxlbmd0aDtcblx0XHRiaW5kaW5ncy5wdXNoKCBiaW5kaW5nICk7XG5cblx0fSxcblxuXHRfcmVtb3ZlSW5hY3RpdmVCaW5kaW5nOiBmdW5jdGlvbiAoIGJpbmRpbmcgKSB7XG5cblx0XHR2YXIgYmluZGluZ3MgPSB0aGlzLl9iaW5kaW5ncyxcblx0XHRcdHByb3BCaW5kaW5nID0gYmluZGluZy5iaW5kaW5nLFxuXHRcdFx0cm9vdFV1aWQgPSBwcm9wQmluZGluZy5yb290Tm9kZS51dWlkLFxuXHRcdFx0dHJhY2tOYW1lID0gcHJvcEJpbmRpbmcucGF0aCxcblx0XHRcdGJpbmRpbmdzQnlSb290ID0gdGhpcy5fYmluZGluZ3NCeVJvb3RBbmROYW1lLFxuXHRcdFx0YmluZGluZ0J5TmFtZSA9IGJpbmRpbmdzQnlSb290WyByb290VXVpZCBdLFxuXG5cdFx0XHRsYXN0SW5hY3RpdmVCaW5kaW5nID0gYmluZGluZ3NbIGJpbmRpbmdzLmxlbmd0aCAtIDEgXSxcblx0XHRcdGNhY2hlSW5kZXggPSBiaW5kaW5nLl9jYWNoZUluZGV4O1xuXG5cdFx0bGFzdEluYWN0aXZlQmluZGluZy5fY2FjaGVJbmRleCA9IGNhY2hlSW5kZXg7XG5cdFx0YmluZGluZ3NbIGNhY2hlSW5kZXggXSA9IGxhc3RJbmFjdGl2ZUJpbmRpbmc7XG5cdFx0YmluZGluZ3MucG9wKCk7XG5cblx0XHRkZWxldGUgYmluZGluZ0J5TmFtZVsgdHJhY2tOYW1lIF07XG5cblx0XHRyZW1vdmVfZW1wdHlfbWFwOiB7XG5cblx0XHRcdGZvciAoIHZhciBfIGluIGJpbmRpbmdCeU5hbWUgKSBicmVhayByZW1vdmVfZW1wdHlfbWFwOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG5cblx0XHRcdGRlbGV0ZSBiaW5kaW5nc0J5Um9vdFsgcm9vdFV1aWQgXTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdF9sZW5kQmluZGluZzogZnVuY3Rpb24gKCBiaW5kaW5nICkge1xuXG5cdFx0dmFyIGJpbmRpbmdzID0gdGhpcy5fYmluZGluZ3MsXG5cdFx0XHRwcmV2SW5kZXggPSBiaW5kaW5nLl9jYWNoZUluZGV4LFxuXG5cdFx0XHRsYXN0QWN0aXZlSW5kZXggPSB0aGlzLl9uQWN0aXZlQmluZGluZ3MgKyssXG5cblx0XHRcdGZpcnN0SW5hY3RpdmVCaW5kaW5nID0gYmluZGluZ3NbIGxhc3RBY3RpdmVJbmRleCBdO1xuXG5cdFx0YmluZGluZy5fY2FjaGVJbmRleCA9IGxhc3RBY3RpdmVJbmRleDtcblx0XHRiaW5kaW5nc1sgbGFzdEFjdGl2ZUluZGV4IF0gPSBiaW5kaW5nO1xuXG5cdFx0Zmlyc3RJbmFjdGl2ZUJpbmRpbmcuX2NhY2hlSW5kZXggPSBwcmV2SW5kZXg7XG5cdFx0YmluZGluZ3NbIHByZXZJbmRleCBdID0gZmlyc3RJbmFjdGl2ZUJpbmRpbmc7XG5cblx0fSxcblxuXHRfdGFrZUJhY2tCaW5kaW5nOiBmdW5jdGlvbiAoIGJpbmRpbmcgKSB7XG5cblx0XHR2YXIgYmluZGluZ3MgPSB0aGlzLl9iaW5kaW5ncyxcblx0XHRcdHByZXZJbmRleCA9IGJpbmRpbmcuX2NhY2hlSW5kZXgsXG5cblx0XHRcdGZpcnN0SW5hY3RpdmVJbmRleCA9IC0tIHRoaXMuX25BY3RpdmVCaW5kaW5ncyxcblxuXHRcdFx0bGFzdEFjdGl2ZUJpbmRpbmcgPSBiaW5kaW5nc1sgZmlyc3RJbmFjdGl2ZUluZGV4IF07XG5cblx0XHRiaW5kaW5nLl9jYWNoZUluZGV4ID0gZmlyc3RJbmFjdGl2ZUluZGV4O1xuXHRcdGJpbmRpbmdzWyBmaXJzdEluYWN0aXZlSW5kZXggXSA9IGJpbmRpbmc7XG5cblx0XHRsYXN0QWN0aXZlQmluZGluZy5fY2FjaGVJbmRleCA9IHByZXZJbmRleDtcblx0XHRiaW5kaW5nc1sgcHJldkluZGV4IF0gPSBsYXN0QWN0aXZlQmluZGluZztcblxuXHR9LFxuXG5cblx0Ly8gTWVtb3J5IG1hbmFnZW1lbnQgb2YgSW50ZXJwb2xhbnRzIGZvciB3ZWlnaHQgYW5kIHRpbWUgc2NhbGVcblxuXHRfbGVuZENvbnRyb2xJbnRlcnBvbGFudDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGludGVycG9sYW50cyA9IHRoaXMuX2NvbnRyb2xJbnRlcnBvbGFudHMsXG5cdFx0XHRsYXN0QWN0aXZlSW5kZXggPSB0aGlzLl9uQWN0aXZlQ29udHJvbEludGVycG9sYW50cyArKyxcblx0XHRcdGludGVycG9sYW50ID0gaW50ZXJwb2xhbnRzWyBsYXN0QWN0aXZlSW5kZXggXTtcblxuXHRcdGlmICggaW50ZXJwb2xhbnQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0aW50ZXJwb2xhbnQgPSBuZXcgTGluZWFySW50ZXJwb2xhbnQoXG5cdFx0XHRcdG5ldyBGbG9hdDMyQXJyYXkoIDIgKSwgbmV3IEZsb2F0MzJBcnJheSggMiApLFxuXHRcdFx0XHQxLCB0aGlzLl9jb250cm9sSW50ZXJwb2xhbnRzUmVzdWx0QnVmZmVyICk7XG5cblx0XHRcdGludGVycG9sYW50Ll9fY2FjaGVJbmRleCA9IGxhc3RBY3RpdmVJbmRleDtcblx0XHRcdGludGVycG9sYW50c1sgbGFzdEFjdGl2ZUluZGV4IF0gPSBpbnRlcnBvbGFudDtcblxuXHRcdH1cblxuXHRcdHJldHVybiBpbnRlcnBvbGFudDtcblxuXHR9LFxuXG5cdF90YWtlQmFja0NvbnRyb2xJbnRlcnBvbGFudDogZnVuY3Rpb24gKCBpbnRlcnBvbGFudCApIHtcblxuXHRcdHZhciBpbnRlcnBvbGFudHMgPSB0aGlzLl9jb250cm9sSW50ZXJwb2xhbnRzLFxuXHRcdFx0cHJldkluZGV4ID0gaW50ZXJwb2xhbnQuX19jYWNoZUluZGV4LFxuXG5cdFx0XHRmaXJzdEluYWN0aXZlSW5kZXggPSAtLSB0aGlzLl9uQWN0aXZlQ29udHJvbEludGVycG9sYW50cyxcblxuXHRcdFx0bGFzdEFjdGl2ZUludGVycG9sYW50ID0gaW50ZXJwb2xhbnRzWyBmaXJzdEluYWN0aXZlSW5kZXggXTtcblxuXHRcdGludGVycG9sYW50Ll9fY2FjaGVJbmRleCA9IGZpcnN0SW5hY3RpdmVJbmRleDtcblx0XHRpbnRlcnBvbGFudHNbIGZpcnN0SW5hY3RpdmVJbmRleCBdID0gaW50ZXJwb2xhbnQ7XG5cblx0XHRsYXN0QWN0aXZlSW50ZXJwb2xhbnQuX19jYWNoZUluZGV4ID0gcHJldkluZGV4O1xuXHRcdGludGVycG9sYW50c1sgcHJldkluZGV4IF0gPSBsYXN0QWN0aXZlSW50ZXJwb2xhbnQ7XG5cblx0fSxcblxuXHRfY29udHJvbEludGVycG9sYW50c1Jlc3VsdEJ1ZmZlcjogbmV3IEZsb2F0MzJBcnJheSggMSApLFxuXG5cdC8vIHJldHVybiBhbiBhY3Rpb24gZm9yIGEgY2xpcCBvcHRpb25hbGx5IHVzaW5nIGEgY3VzdG9tIHJvb3QgdGFyZ2V0XG5cdC8vIG9iamVjdCAodGhpcyBtZXRob2QgYWxsb2NhdGVzIGEgbG90IG9mIGR5bmFtaWMgbWVtb3J5IGluIGNhc2UgYVxuXHQvLyBwcmV2aW91c2x5IHVua25vd24gY2xpcC9yb290IGNvbWJpbmF0aW9uIGlzIHNwZWNpZmllZClcblx0Y2xpcEFjdGlvbjogZnVuY3Rpb24gKCBjbGlwLCBvcHRpb25hbFJvb3QgKSB7XG5cblx0XHR2YXIgcm9vdCA9IG9wdGlvbmFsUm9vdCB8fCB0aGlzLl9yb290LFxuXHRcdFx0cm9vdFV1aWQgPSByb290LnV1aWQsXG5cblx0XHRcdGNsaXBPYmplY3QgPSB0eXBlb2YgY2xpcCA9PT0gJ3N0cmluZycgP1xuXHRcdFx0XHRBbmltYXRpb25DbGlwLmZpbmRCeU5hbWUoIHJvb3QsIGNsaXAgKSA6IGNsaXAsXG5cblx0XHRcdGNsaXBVdWlkID0gY2xpcE9iamVjdCAhPT0gbnVsbCA/IGNsaXBPYmplY3QudXVpZCA6IGNsaXAsXG5cblx0XHRcdGFjdGlvbnNGb3JDbGlwID0gdGhpcy5fYWN0aW9uc0J5Q2xpcFsgY2xpcFV1aWQgXSxcblx0XHRcdHByb3RvdHlwZUFjdGlvbiA9IG51bGw7XG5cblx0XHRpZiAoIGFjdGlvbnNGb3JDbGlwICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHZhciBleGlzdGluZ0FjdGlvbiA9XG5cdFx0XHRcdFx0YWN0aW9uc0ZvckNsaXAuYWN0aW9uQnlSb290WyByb290VXVpZCBdO1xuXG5cdFx0XHRpZiAoIGV4aXN0aW5nQWN0aW9uICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0cmV0dXJuIGV4aXN0aW5nQWN0aW9uO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIHdlIGtub3cgdGhlIGNsaXAsIHNvIHdlIGRvbid0IGhhdmUgdG8gcGFyc2UgYWxsXG5cdFx0XHQvLyB0aGUgYmluZGluZ3MgYWdhaW4gYnV0IGNhbiBqdXN0IGNvcHlcblx0XHRcdHByb3RvdHlwZUFjdGlvbiA9IGFjdGlvbnNGb3JDbGlwLmtub3duQWN0aW9uc1sgMCBdO1xuXG5cdFx0XHQvLyBhbHNvLCB0YWtlIHRoZSBjbGlwIGZyb20gdGhlIHByb3RvdHlwZSBhY3Rpb25cblx0XHRcdGlmICggY2xpcE9iamVjdCA9PT0gbnVsbCApXG5cdFx0XHRcdGNsaXBPYmplY3QgPSBwcm90b3R5cGVBY3Rpb24uX2NsaXA7XG5cblx0XHR9XG5cblx0XHQvLyBjbGlwIG11c3QgYmUga25vd24gd2hlbiBzcGVjaWZpZWQgdmlhIHN0cmluZ1xuXHRcdGlmICggY2xpcE9iamVjdCA9PT0gbnVsbCApIHJldHVybiBudWxsO1xuXG5cdFx0Ly8gYWxsb2NhdGUgYWxsIHJlc291cmNlcyByZXF1aXJlZCB0byBydW4gaXRcblx0XHR2YXIgbmV3QWN0aW9uID0gbmV3IEFuaW1hdGlvbkFjdGlvbiggdGhpcywgY2xpcE9iamVjdCwgb3B0aW9uYWxSb290ICk7XG5cblx0XHR0aGlzLl9iaW5kQWN0aW9uKCBuZXdBY3Rpb24sIHByb3RvdHlwZUFjdGlvbiApO1xuXG5cdFx0Ly8gYW5kIG1ha2UgdGhlIGFjdGlvbiBrbm93biB0byB0aGUgbWVtb3J5IG1hbmFnZXJcblx0XHR0aGlzLl9hZGRJbmFjdGl2ZUFjdGlvbiggbmV3QWN0aW9uLCBjbGlwVXVpZCwgcm9vdFV1aWQgKTtcblxuXHRcdHJldHVybiBuZXdBY3Rpb247XG5cblx0fSxcblxuXHQvLyBnZXQgYW4gZXhpc3RpbmcgYWN0aW9uXG5cdGV4aXN0aW5nQWN0aW9uOiBmdW5jdGlvbiAoIGNsaXAsIG9wdGlvbmFsUm9vdCApIHtcblxuXHRcdHZhciByb290ID0gb3B0aW9uYWxSb290IHx8IHRoaXMuX3Jvb3QsXG5cdFx0XHRyb290VXVpZCA9IHJvb3QudXVpZCxcblxuXHRcdFx0Y2xpcE9iamVjdCA9IHR5cGVvZiBjbGlwID09PSAnc3RyaW5nJyA/XG5cdFx0XHRcdEFuaW1hdGlvbkNsaXAuZmluZEJ5TmFtZSggcm9vdCwgY2xpcCApIDogY2xpcCxcblxuXHRcdFx0Y2xpcFV1aWQgPSBjbGlwT2JqZWN0ID8gY2xpcE9iamVjdC51dWlkIDogY2xpcCxcblxuXHRcdFx0YWN0aW9uc0ZvckNsaXAgPSB0aGlzLl9hY3Rpb25zQnlDbGlwWyBjbGlwVXVpZCBdO1xuXG5cdFx0aWYgKCBhY3Rpb25zRm9yQ2xpcCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRyZXR1cm4gYWN0aW9uc0ZvckNsaXAuYWN0aW9uQnlSb290WyByb290VXVpZCBdIHx8IG51bGw7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gbnVsbDtcblxuXHR9LFxuXG5cdC8vIGRlYWN0aXZhdGVzIGFsbCBwcmV2aW91c2x5IHNjaGVkdWxlZCBhY3Rpb25zXG5cdHN0b3BBbGxBY3Rpb246IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBhY3Rpb25zID0gdGhpcy5fYWN0aW9ucyxcblx0XHRcdG5BY3Rpb25zID0gdGhpcy5fbkFjdGl2ZUFjdGlvbnMsXG5cdFx0XHRiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzLFxuXHRcdFx0bkJpbmRpbmdzID0gdGhpcy5fbkFjdGl2ZUJpbmRpbmdzO1xuXG5cdFx0dGhpcy5fbkFjdGl2ZUFjdGlvbnMgPSAwO1xuXHRcdHRoaXMuX25BY3RpdmVCaW5kaW5ncyA9IDA7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgIT09IG5BY3Rpb25zOyArKyBpICkge1xuXG5cdFx0XHRhY3Rpb25zWyBpIF0ucmVzZXQoKTtcblxuXHRcdH1cblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSAhPT0gbkJpbmRpbmdzOyArKyBpICkge1xuXG5cdFx0XHRiaW5kaW5nc1sgaSBdLnVzZUNvdW50ID0gMDtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Ly8gYWR2YW5jZSB0aGUgdGltZSBhbmQgdXBkYXRlIGFwcGx5IHRoZSBhbmltYXRpb25cblx0dXBkYXRlOiBmdW5jdGlvbiAoIGRlbHRhVGltZSApIHtcblxuXHRcdGRlbHRhVGltZSAqPSB0aGlzLnRpbWVTY2FsZTtcblxuXHRcdHZhciBhY3Rpb25zID0gdGhpcy5fYWN0aW9ucyxcblx0XHRcdG5BY3Rpb25zID0gdGhpcy5fbkFjdGl2ZUFjdGlvbnMsXG5cblx0XHRcdHRpbWUgPSB0aGlzLnRpbWUgKz0gZGVsdGFUaW1lLFxuXHRcdFx0dGltZURpcmVjdGlvbiA9IE1hdGguc2lnbiggZGVsdGFUaW1lICksXG5cblx0XHRcdGFjY3VJbmRleCA9IHRoaXMuX2FjY3VJbmRleCBePSAxO1xuXG5cdFx0Ly8gcnVuIGFjdGl2ZSBhY3Rpb25zXG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgIT09IG5BY3Rpb25zOyArKyBpICkge1xuXG5cdFx0XHR2YXIgYWN0aW9uID0gYWN0aW9uc1sgaSBdO1xuXG5cdFx0XHRhY3Rpb24uX3VwZGF0ZSggdGltZSwgZGVsdGFUaW1lLCB0aW1lRGlyZWN0aW9uLCBhY2N1SW5kZXggKTtcblxuXHRcdH1cblxuXHRcdC8vIHVwZGF0ZSBzY2VuZSBncmFwaFxuXG5cdFx0dmFyIGJpbmRpbmdzID0gdGhpcy5fYmluZGluZ3MsXG5cdFx0XHRuQmluZGluZ3MgPSB0aGlzLl9uQWN0aXZlQmluZGluZ3M7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgIT09IG5CaW5kaW5nczsgKysgaSApIHtcblxuXHRcdFx0YmluZGluZ3NbIGkgXS5hcHBseSggYWNjdUluZGV4ICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdC8vIHJldHVybiB0aGlzIG1peGVyJ3Mgcm9vdCB0YXJnZXQgb2JqZWN0XG5cdGdldFJvb3Q6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLl9yb290O1xuXG5cdH0sXG5cblx0Ly8gZnJlZSBhbGwgcmVzb3VyY2VzIHNwZWNpZmljIHRvIGEgcGFydGljdWxhciBjbGlwXG5cdHVuY2FjaGVDbGlwOiBmdW5jdGlvbiAoIGNsaXAgKSB7XG5cblx0XHR2YXIgYWN0aW9ucyA9IHRoaXMuX2FjdGlvbnMsXG5cdFx0XHRjbGlwVXVpZCA9IGNsaXAudXVpZCxcblx0XHRcdGFjdGlvbnNCeUNsaXAgPSB0aGlzLl9hY3Rpb25zQnlDbGlwLFxuXHRcdFx0YWN0aW9uc0ZvckNsaXAgPSBhY3Rpb25zQnlDbGlwWyBjbGlwVXVpZCBdO1xuXG5cdFx0aWYgKCBhY3Rpb25zRm9yQ2xpcCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHQvLyBub3RlOiBqdXN0IGNhbGxpbmcgX3JlbW92ZUluYWN0aXZlQWN0aW9uIHdvdWxkIG1lc3MgdXAgdGhlXG5cdFx0XHQvLyBpdGVyYXRpb24gc3RhdGUgYW5kIGFsc28gcmVxdWlyZSB1cGRhdGluZyB0aGUgc3RhdGUgd2UgY2FuXG5cdFx0XHQvLyBqdXN0IHRocm93IGF3YXlcblxuXHRcdFx0dmFyIGFjdGlvbnNUb1JlbW92ZSA9IGFjdGlvbnNGb3JDbGlwLmtub3duQWN0aW9ucztcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBuID0gYWN0aW9uc1RvUmVtb3ZlLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0XHR2YXIgYWN0aW9uID0gYWN0aW9uc1RvUmVtb3ZlWyBpIF07XG5cblx0XHRcdFx0dGhpcy5fZGVhY3RpdmF0ZUFjdGlvbiggYWN0aW9uICk7XG5cblx0XHRcdFx0dmFyIGNhY2hlSW5kZXggPSBhY3Rpb24uX2NhY2hlSW5kZXgsXG5cdFx0XHRcdFx0bGFzdEluYWN0aXZlQWN0aW9uID0gYWN0aW9uc1sgYWN0aW9ucy5sZW5ndGggLSAxIF07XG5cblx0XHRcdFx0YWN0aW9uLl9jYWNoZUluZGV4ID0gbnVsbDtcblx0XHRcdFx0YWN0aW9uLl9ieUNsaXBDYWNoZUluZGV4ID0gbnVsbDtcblxuXHRcdFx0XHRsYXN0SW5hY3RpdmVBY3Rpb24uX2NhY2hlSW5kZXggPSBjYWNoZUluZGV4O1xuXHRcdFx0XHRhY3Rpb25zWyBjYWNoZUluZGV4IF0gPSBsYXN0SW5hY3RpdmVBY3Rpb247XG5cdFx0XHRcdGFjdGlvbnMucG9wKCk7XG5cblx0XHRcdFx0dGhpcy5fcmVtb3ZlSW5hY3RpdmVCaW5kaW5nc0ZvckFjdGlvbiggYWN0aW9uICk7XG5cblx0XHRcdH1cblxuXHRcdFx0ZGVsZXRlIGFjdGlvbnNCeUNsaXBbIGNsaXBVdWlkIF07XG5cblx0XHR9XG5cblx0fSxcblxuXHQvLyBmcmVlIGFsbCByZXNvdXJjZXMgc3BlY2lmaWMgdG8gYSBwYXJ0aWN1bGFyIHJvb3QgdGFyZ2V0IG9iamVjdFxuXHR1bmNhY2hlUm9vdDogZnVuY3Rpb24gKCByb290ICkge1xuXG5cdFx0dmFyIHJvb3RVdWlkID0gcm9vdC51dWlkLFxuXHRcdFx0YWN0aW9uc0J5Q2xpcCA9IHRoaXMuX2FjdGlvbnNCeUNsaXA7XG5cblx0XHRmb3IgKCB2YXIgY2xpcFV1aWQgaW4gYWN0aW9uc0J5Q2xpcCApIHtcblxuXHRcdFx0dmFyIGFjdGlvbkJ5Um9vdCA9IGFjdGlvbnNCeUNsaXBbIGNsaXBVdWlkIF0uYWN0aW9uQnlSb290LFxuXHRcdFx0XHRhY3Rpb24gPSBhY3Rpb25CeVJvb3RbIHJvb3RVdWlkIF07XG5cblx0XHRcdGlmICggYWN0aW9uICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0dGhpcy5fZGVhY3RpdmF0ZUFjdGlvbiggYWN0aW9uICk7XG5cdFx0XHRcdHRoaXMuX3JlbW92ZUluYWN0aXZlQWN0aW9uKCBhY3Rpb24gKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0dmFyIGJpbmRpbmdzQnlSb290ID0gdGhpcy5fYmluZGluZ3NCeVJvb3RBbmROYW1lLFxuXHRcdFx0YmluZGluZ0J5TmFtZSA9IGJpbmRpbmdzQnlSb290WyByb290VXVpZCBdO1xuXG5cdFx0aWYgKCBiaW5kaW5nQnlOYW1lICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGZvciAoIHZhciB0cmFja05hbWUgaW4gYmluZGluZ0J5TmFtZSApIHtcblxuXHRcdFx0XHR2YXIgYmluZGluZyA9IGJpbmRpbmdCeU5hbWVbIHRyYWNrTmFtZSBdO1xuXHRcdFx0XHRiaW5kaW5nLnJlc3RvcmVPcmlnaW5hbFN0YXRlKCk7XG5cdFx0XHRcdHRoaXMuX3JlbW92ZUluYWN0aXZlQmluZGluZyggYmluZGluZyApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fSxcblxuXHQvLyByZW1vdmUgYSB0YXJnZXRlZCBjbGlwIGZyb20gdGhlIGNhY2hlXG5cdHVuY2FjaGVBY3Rpb246IGZ1bmN0aW9uICggY2xpcCwgb3B0aW9uYWxSb290ICkge1xuXG5cdFx0dmFyIGFjdGlvbiA9IHRoaXMuZXhpc3RpbmdBY3Rpb24oIGNsaXAsIG9wdGlvbmFsUm9vdCApO1xuXG5cdFx0aWYgKCBhY3Rpb24gIT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuX2RlYWN0aXZhdGVBY3Rpb24oIGFjdGlvbiApO1xuXHRcdFx0dGhpcy5fcmVtb3ZlSW5hY3RpdmVBY3Rpb24oIGFjdGlvbiApO1xuXG5cdFx0fVxuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gVW5pZm9ybSggdmFsdWUgKSB7XG5cblx0aWYgKCB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVW5pZm9ybTogVHlwZSBwYXJhbWV0ZXIgaXMgbm8gbG9uZ2VyIG5lZWRlZC4nICk7XG5cdFx0dmFsdWUgPSBhcmd1bWVudHNbIDEgXTtcblxuXHR9XG5cblx0dGhpcy52YWx1ZSA9IHZhbHVlO1xuXG59XG5cblVuaWZvcm0ucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKCkge1xuXG5cdHJldHVybiBuZXcgVW5pZm9ybSggdGhpcy52YWx1ZS5jbG9uZSA9PT0gdW5kZWZpbmVkID8gdGhpcy52YWx1ZSA6IHRoaXMudmFsdWUuY2xvbmUoKSApO1xuXG59O1xuXG4vKipcbiAqIEBhdXRob3IgYmVuYWFkYW1zIC8gaHR0cHM6Ly90d2l0dGVyLmNvbS9iZW5fYV9hZGFtc1xuICovXG5cbmZ1bmN0aW9uIEluc3RhbmNlZEJ1ZmZlckdlb21ldHJ5KCkge1xuXG5cdEJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnknO1xuXHR0aGlzLm1heEluc3RhbmNlZENvdW50ID0gdW5kZWZpbmVkO1xuXG59XG5cbkluc3RhbmNlZEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IEluc3RhbmNlZEJ1ZmZlckdlb21ldHJ5LFxuXG5cdGlzSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnk6IHRydWUsXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHRCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHRcdHRoaXMubWF4SW5zdGFuY2VkQ291bnQgPSBzb3VyY2UubWF4SW5zdGFuY2VkQ291bnQ7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBiZW5hYWRhbXMgLyBodHRwczovL3R3aXR0ZXIuY29tL2Jlbl9hX2FkYW1zXG4gKi9cblxuZnVuY3Rpb24gSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUoIGludGVybGVhdmVkQnVmZmVyLCBpdGVtU2l6ZSwgb2Zmc2V0LCBub3JtYWxpemVkICkge1xuXG5cdHRoaXMuZGF0YSA9IGludGVybGVhdmVkQnVmZmVyO1xuXHR0aGlzLml0ZW1TaXplID0gaXRlbVNpemU7XG5cdHRoaXMub2Zmc2V0ID0gb2Zmc2V0O1xuXG5cdHRoaXMubm9ybWFsaXplZCA9IG5vcm1hbGl6ZWQgPT09IHRydWU7XG5cbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIEludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSwge1xuXG5cdGNvdW50OiB7XG5cblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMuZGF0YS5jb3VudDtcblxuXHRcdH1cblxuXHR9LFxuXG5cdGFycmF5OiB7XG5cblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMuZGF0YS5hcnJheTtcblxuXHRcdH1cblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmFzc2lnbiggSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLCB7XG5cblx0aXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZTogdHJ1ZSxcblxuXHRzZXRYOiBmdW5jdGlvbiAoIGluZGV4LCB4ICkge1xuXG5cdFx0dGhpcy5kYXRhLmFycmF5WyBpbmRleCAqIHRoaXMuZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNldCBdID0geDtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0WTogZnVuY3Rpb24gKCBpbmRleCwgeSApIHtcblxuXHRcdHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKiB0aGlzLmRhdGEuc3RyaWRlICsgdGhpcy5vZmZzZXQgKyAxIF0gPSB5O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRaOiBmdW5jdGlvbiAoIGluZGV4LCB6ICkge1xuXG5cdFx0dGhpcy5kYXRhLmFycmF5WyBpbmRleCAqIHRoaXMuZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNldCArIDIgXSA9IHo7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFc6IGZ1bmN0aW9uICggaW5kZXgsIHcgKSB7XG5cblx0XHR0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0ICsgMyBdID0gdztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Z2V0WDogZnVuY3Rpb24gKCBpbmRleCApIHtcblxuXHRcdHJldHVybiB0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0IF07XG5cblx0fSxcblxuXHRnZXRZOiBmdW5jdGlvbiAoIGluZGV4ICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKiB0aGlzLmRhdGEuc3RyaWRlICsgdGhpcy5vZmZzZXQgKyAxIF07XG5cblx0fSxcblxuXHRnZXRaOiBmdW5jdGlvbiAoIGluZGV4ICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKiB0aGlzLmRhdGEuc3RyaWRlICsgdGhpcy5vZmZzZXQgKyAyIF07XG5cblx0fSxcblxuXHRnZXRXOiBmdW5jdGlvbiAoIGluZGV4ICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKiB0aGlzLmRhdGEuc3RyaWRlICsgdGhpcy5vZmZzZXQgKyAzIF07XG5cblx0fSxcblxuXHRzZXRYWTogZnVuY3Rpb24gKCBpbmRleCwgeCwgeSApIHtcblxuXHRcdGluZGV4ID0gaW5kZXggKiB0aGlzLmRhdGEuc3RyaWRlICsgdGhpcy5vZmZzZXQ7XG5cblx0XHR0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICsgMCBdID0geDtcblx0XHR0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICsgMSBdID0geTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0WFlaOiBmdW5jdGlvbiAoIGluZGV4LCB4LCB5LCB6ICkge1xuXG5cdFx0aW5kZXggPSBpbmRleCAqIHRoaXMuZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNldDtcblxuXHRcdHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKyAwIF0gPSB4O1xuXHRcdHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKyAxIF0gPSB5O1xuXHRcdHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKyAyIF0gPSB6O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRYWVpXOiBmdW5jdGlvbiAoIGluZGV4LCB4LCB5LCB6LCB3ICkge1xuXG5cdFx0aW5kZXggPSBpbmRleCAqIHRoaXMuZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNldDtcblxuXHRcdHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKyAwIF0gPSB4O1xuXHRcdHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKyAxIF0gPSB5O1xuXHRcdHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKyAyIF0gPSB6O1xuXHRcdHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKyAzIF0gPSB3O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBiZW5hYWRhbXMgLyBodHRwczovL3R3aXR0ZXIuY29tL2Jlbl9hX2FkYW1zXG4gKi9cblxuZnVuY3Rpb24gSW50ZXJsZWF2ZWRCdWZmZXIoIGFycmF5LCBzdHJpZGUgKSB7XG5cblx0dGhpcy5hcnJheSA9IGFycmF5O1xuXHR0aGlzLnN0cmlkZSA9IHN0cmlkZTtcblx0dGhpcy5jb3VudCA9IGFycmF5ICE9PSB1bmRlZmluZWQgPyBhcnJheS5sZW5ndGggLyBzdHJpZGUgOiAwO1xuXG5cdHRoaXMuZHluYW1pYyA9IGZhbHNlO1xuXHR0aGlzLnVwZGF0ZVJhbmdlID0geyBvZmZzZXQ6IDAsIGNvdW50OiAtIDEgfTtcblxuXHR0aGlzLnZlcnNpb24gPSAwO1xuXG59XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eSggSW50ZXJsZWF2ZWRCdWZmZXIucHJvdG90eXBlLCAnbmVlZHNVcGRhdGUnLCB7XG5cblx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0aWYgKCB2YWx1ZSA9PT0gdHJ1ZSApIHRoaXMudmVyc2lvbiArKztcblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmFzc2lnbiggSW50ZXJsZWF2ZWRCdWZmZXIucHJvdG90eXBlLCB7XG5cblx0aXNJbnRlcmxlYXZlZEJ1ZmZlcjogdHJ1ZSxcblxuXHRvblVwbG9hZENhbGxiYWNrOiBmdW5jdGlvbiAoKSB7fSxcblxuXHRzZXRBcnJheTogZnVuY3Rpb24gKCBhcnJheSApIHtcblxuXHRcdGlmICggQXJyYXkuaXNBcnJheSggYXJyYXkgKSApIHtcblxuXHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvciggJ1RIUkVFLkJ1ZmZlckF0dHJpYnV0ZTogYXJyYXkgc2hvdWxkIGJlIGEgVHlwZWQgQXJyYXkuJyApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5jb3VudCA9IGFycmF5ICE9PSB1bmRlZmluZWQgPyBhcnJheS5sZW5ndGggLyB0aGlzLnN0cmlkZSA6IDA7XG5cdFx0dGhpcy5hcnJheSA9IGFycmF5O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXREeW5hbWljOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5keW5hbWljID0gdmFsdWU7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0dGhpcy5hcnJheSA9IG5ldyBzb3VyY2UuYXJyYXkuY29uc3RydWN0b3IoIHNvdXJjZS5hcnJheSApO1xuXHRcdHRoaXMuY291bnQgPSBzb3VyY2UuY291bnQ7XG5cdFx0dGhpcy5zdHJpZGUgPSBzb3VyY2Uuc3RyaWRlO1xuXHRcdHRoaXMuZHluYW1pYyA9IHNvdXJjZS5keW5hbWljO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjb3B5QXQ6IGZ1bmN0aW9uICggaW5kZXgxLCBhdHRyaWJ1dGUsIGluZGV4MiApIHtcblxuXHRcdGluZGV4MSAqPSB0aGlzLnN0cmlkZTtcblx0XHRpbmRleDIgKj0gYXR0cmlidXRlLnN0cmlkZTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHRoaXMuc3RyaWRlOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dGhpcy5hcnJheVsgaW5kZXgxICsgaSBdID0gYXR0cmlidXRlLmFycmF5WyBpbmRleDIgKyBpIF07XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldDogZnVuY3Rpb24gKCB2YWx1ZSwgb2Zmc2V0ICkge1xuXG5cdFx0aWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7XG5cblx0XHR0aGlzLmFycmF5LnNldCggdmFsdWUsIG9mZnNldCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xuXG5cdH0sXG5cblx0b25VcGxvYWQ6IGZ1bmN0aW9uICggY2FsbGJhY2sgKSB7XG5cblx0XHR0aGlzLm9uVXBsb2FkQ2FsbGJhY2sgPSBjYWxsYmFjaztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgYmVuYWFkYW1zIC8gaHR0cHM6Ly90d2l0dGVyLmNvbS9iZW5fYV9hZGFtc1xuICovXG5cbmZ1bmN0aW9uIEluc3RhbmNlZEludGVybGVhdmVkQnVmZmVyKCBhcnJheSwgc3RyaWRlLCBtZXNoUGVyQXR0cmlidXRlICkge1xuXG5cdEludGVybGVhdmVkQnVmZmVyLmNhbGwoIHRoaXMsIGFycmF5LCBzdHJpZGUgKTtcblxuXHR0aGlzLm1lc2hQZXJBdHRyaWJ1dGUgPSBtZXNoUGVyQXR0cmlidXRlIHx8IDE7XG5cbn1cblxuSW5zdGFuY2VkSW50ZXJsZWF2ZWRCdWZmZXIucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggSW50ZXJsZWF2ZWRCdWZmZXIucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogSW5zdGFuY2VkSW50ZXJsZWF2ZWRCdWZmZXIsXG5cblx0aXNJbnN0YW5jZWRJbnRlcmxlYXZlZEJ1ZmZlcjogdHJ1ZSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRcdEludGVybGVhdmVkQnVmZmVyLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdFx0dGhpcy5tZXNoUGVyQXR0cmlidXRlID0gc291cmNlLm1lc2hQZXJBdHRyaWJ1dGU7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIGJlbmFhZGFtcyAvIGh0dHBzOi8vdHdpdHRlci5jb20vYmVuX2FfYWRhbXNcbiAqL1xuXG5mdW5jdGlvbiBJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSwgbWVzaFBlckF0dHJpYnV0ZSApIHtcblxuXHRCdWZmZXJBdHRyaWJ1dGUuY2FsbCggdGhpcywgYXJyYXksIGl0ZW1TaXplICk7XG5cblx0dGhpcy5tZXNoUGVyQXR0cmlidXRlID0gbWVzaFBlckF0dHJpYnV0ZSB8fCAxO1xuXG59XG5cbkluc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlLFxuXG5cdGlzSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlOiB0cnVlLFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0QnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdFx0dGhpcy5tZXNoUGVyQXR0cmlidXRlID0gc291cmNlLm1lc2hQZXJBdHRyaWJ1dGU7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pby9cbiAqIEBhdXRob3Igc3RlcGhvbWkgLyBodHRwOi8vc3RlcGhhbmVnaW5pZXIuY29tL1xuICovXG5cbmZ1bmN0aW9uIFJheWNhc3Rlciggb3JpZ2luLCBkaXJlY3Rpb24sIG5lYXIsIGZhciApIHtcblxuXHR0aGlzLnJheSA9IG5ldyBSYXkoIG9yaWdpbiwgZGlyZWN0aW9uICk7XG5cdC8vIGRpcmVjdGlvbiBpcyBhc3N1bWVkIHRvIGJlIG5vcm1hbGl6ZWQgKGZvciBhY2N1cmF0ZSBkaXN0YW5jZSBjYWxjdWxhdGlvbnMpXG5cblx0dGhpcy5uZWFyID0gbmVhciB8fCAwO1xuXHR0aGlzLmZhciA9IGZhciB8fCBJbmZpbml0eTtcblxuXHR0aGlzLnBhcmFtcyA9IHtcblx0XHRNZXNoOiB7fSxcblx0XHRMaW5lOiB7fSxcblx0XHRMT0Q6IHt9LFxuXHRcdFBvaW50czogeyB0aHJlc2hvbGQ6IDEgfSxcblx0XHRTcHJpdGU6IHt9XG5cdH07XG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIHRoaXMucGFyYW1zLCB7XG5cdFx0UG9pbnRDbG91ZDoge1xuXHRcdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuUmF5Y2FzdGVyOiBwYXJhbXMuUG9pbnRDbG91ZCBoYXMgYmVlbiByZW5hbWVkIHRvIHBhcmFtcy5Qb2ludHMuJyApO1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5Qb2ludHM7XG5cblx0XHRcdH1cblx0XHR9XG5cdH0gKTtcblxufVxuXG5mdW5jdGlvbiBhc2NTb3J0KCBhLCBiICkge1xuXG5cdHJldHVybiBhLmRpc3RhbmNlIC0gYi5kaXN0YW5jZTtcblxufVxuXG5mdW5jdGlvbiBpbnRlcnNlY3RPYmplY3QoIG9iamVjdCwgcmF5Y2FzdGVyLCBpbnRlcnNlY3RzLCByZWN1cnNpdmUgKSB7XG5cblx0aWYgKCBvYmplY3QudmlzaWJsZSA9PT0gZmFsc2UgKSByZXR1cm47XG5cblx0b2JqZWN0LnJheWNhc3QoIHJheWNhc3RlciwgaW50ZXJzZWN0cyApO1xuXG5cdGlmICggcmVjdXJzaXZlID09PSB0cnVlICkge1xuXG5cdFx0dmFyIGNoaWxkcmVuID0gb2JqZWN0LmNoaWxkcmVuO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0aW50ZXJzZWN0T2JqZWN0KCBjaGlsZHJlblsgaSBdLCByYXljYXN0ZXIsIGludGVyc2VjdHMsIHRydWUgKTtcblxuXHRcdH1cblxuXHR9XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggUmF5Y2FzdGVyLnByb3RvdHlwZSwge1xuXG5cdGxpbmVQcmVjaXNpb246IDEsXG5cblx0c2V0OiBmdW5jdGlvbiAoIG9yaWdpbiwgZGlyZWN0aW9uICkge1xuXG5cdFx0Ly8gZGlyZWN0aW9uIGlzIGFzc3VtZWQgdG8gYmUgbm9ybWFsaXplZCAoZm9yIGFjY3VyYXRlIGRpc3RhbmNlIGNhbGN1bGF0aW9ucylcblxuXHRcdHRoaXMucmF5LnNldCggb3JpZ2luLCBkaXJlY3Rpb24gKTtcblxuXHR9LFxuXG5cdHNldEZyb21DYW1lcmE6IGZ1bmN0aW9uICggY29vcmRzLCBjYW1lcmEgKSB7XG5cblx0XHRpZiAoICggY2FtZXJhICYmIGNhbWVyYS5pc1BlcnNwZWN0aXZlQ2FtZXJhICkgKSB7XG5cblx0XHRcdHRoaXMucmF5Lm9yaWdpbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGNhbWVyYS5tYXRyaXhXb3JsZCApO1xuXHRcdFx0dGhpcy5yYXkuZGlyZWN0aW9uLnNldCggY29vcmRzLngsIGNvb3Jkcy55LCAwLjUgKS51bnByb2plY3QoIGNhbWVyYSApLnN1YiggdGhpcy5yYXkub3JpZ2luICkubm9ybWFsaXplKCk7XG5cblx0XHR9IGVsc2UgaWYgKCAoIGNhbWVyYSAmJiBjYW1lcmEuaXNPcnRob2dyYXBoaWNDYW1lcmEgKSApIHtcblxuXHRcdFx0dGhpcy5yYXkub3JpZ2luLnNldCggY29vcmRzLngsIGNvb3Jkcy55LCAoIGNhbWVyYS5uZWFyICsgY2FtZXJhLmZhciApIC8gKCBjYW1lcmEubmVhciAtIGNhbWVyYS5mYXIgKSApLnVucHJvamVjdCggY2FtZXJhICk7IC8vIHNldCBvcmlnaW4gaW4gcGxhbmUgb2YgY2FtZXJhXG5cdFx0XHR0aGlzLnJheS5kaXJlY3Rpb24uc2V0KCAwLCAwLCAtIDEgKS50cmFuc2Zvcm1EaXJlY3Rpb24oIGNhbWVyYS5tYXRyaXhXb3JsZCApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlJheWNhc3RlcjogVW5zdXBwb3J0ZWQgY2FtZXJhIHR5cGUuJyApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0aW50ZXJzZWN0T2JqZWN0OiBmdW5jdGlvbiAoIG9iamVjdCwgcmVjdXJzaXZlLCBvcHRpb25hbFRhcmdldCApIHtcblxuXHRcdHZhciBpbnRlcnNlY3RzID0gb3B0aW9uYWxUYXJnZXQgfHwgW107XG5cblx0XHRpbnRlcnNlY3RPYmplY3QoIG9iamVjdCwgdGhpcywgaW50ZXJzZWN0cywgcmVjdXJzaXZlICk7XG5cblx0XHRpbnRlcnNlY3RzLnNvcnQoIGFzY1NvcnQgKTtcblxuXHRcdHJldHVybiBpbnRlcnNlY3RzO1xuXG5cdH0sXG5cblx0aW50ZXJzZWN0T2JqZWN0czogZnVuY3Rpb24gKCBvYmplY3RzLCByZWN1cnNpdmUsIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdFx0dmFyIGludGVyc2VjdHMgPSBvcHRpb25hbFRhcmdldCB8fCBbXTtcblxuXHRcdGlmICggQXJyYXkuaXNBcnJheSggb2JqZWN0cyApID09PSBmYWxzZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuUmF5Y2FzdGVyLmludGVyc2VjdE9iamVjdHM6IG9iamVjdHMgaXMgbm90IGFuIEFycmF5LicgKTtcblx0XHRcdHJldHVybiBpbnRlcnNlY3RzO1xuXG5cdFx0fVxuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gb2JqZWN0cy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRpbnRlcnNlY3RPYmplY3QoIG9iamVjdHNbIGkgXSwgdGhpcywgaW50ZXJzZWN0cywgcmVjdXJzaXZlICk7XG5cblx0XHR9XG5cblx0XHRpbnRlcnNlY3RzLnNvcnQoIGFzY1NvcnQgKTtcblxuXHRcdHJldHVybiBpbnRlcnNlY3RzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKi9cblxuZnVuY3Rpb24gQ2xvY2soIGF1dG9TdGFydCApIHtcblxuXHR0aGlzLmF1dG9TdGFydCA9ICggYXV0b1N0YXJ0ICE9PSB1bmRlZmluZWQgKSA/IGF1dG9TdGFydCA6IHRydWU7XG5cblx0dGhpcy5zdGFydFRpbWUgPSAwO1xuXHR0aGlzLm9sZFRpbWUgPSAwO1xuXHR0aGlzLmVsYXBzZWRUaW1lID0gMDtcblxuXHR0aGlzLnJ1bm5pbmcgPSBmYWxzZTtcblxufVxuXG5PYmplY3QuYXNzaWduKCBDbG9jay5wcm90b3R5cGUsIHtcblxuXHRzdGFydDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5zdGFydFRpbWUgPSAoIHR5cGVvZiBwZXJmb3JtYW5jZSA9PT0gJ3VuZGVmaW5lZCcgPyBEYXRlIDogcGVyZm9ybWFuY2UgKS5ub3coKTsgLy8gc2VlICMxMDczMlxuXG5cdFx0dGhpcy5vbGRUaW1lID0gdGhpcy5zdGFydFRpbWU7XG5cdFx0dGhpcy5lbGFwc2VkVGltZSA9IDA7XG5cdFx0dGhpcy5ydW5uaW5nID0gdHJ1ZTtcblxuXHR9LFxuXG5cdHN0b3A6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuZ2V0RWxhcHNlZFRpbWUoKTtcblx0XHR0aGlzLnJ1bm5pbmcgPSBmYWxzZTtcblx0XHR0aGlzLmF1dG9TdGFydCA9IGZhbHNlO1xuXG5cdH0sXG5cblx0Z2V0RWxhcHNlZFRpbWU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuZ2V0RGVsdGEoKTtcblx0XHRyZXR1cm4gdGhpcy5lbGFwc2VkVGltZTtcblxuXHR9LFxuXG5cdGdldERlbHRhOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgZGlmZiA9IDA7XG5cblx0XHRpZiAoIHRoaXMuYXV0b1N0YXJ0ICYmICEgdGhpcy5ydW5uaW5nICkge1xuXG5cdFx0XHR0aGlzLnN0YXJ0KCk7XG5cdFx0XHRyZXR1cm4gMDtcblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5ydW5uaW5nICkge1xuXG5cdFx0XHR2YXIgbmV3VGltZSA9ICggdHlwZW9mIHBlcmZvcm1hbmNlID09PSAndW5kZWZpbmVkJyA/IERhdGUgOiBwZXJmb3JtYW5jZSApLm5vdygpO1xuXG5cdFx0XHRkaWZmID0gKCBuZXdUaW1lIC0gdGhpcy5vbGRUaW1lICkgLyAxMDAwO1xuXHRcdFx0dGhpcy5vbGRUaW1lID0gbmV3VGltZTtcblxuXHRcdFx0dGhpcy5lbGFwc2VkVGltZSArPSBkaWZmO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGRpZmY7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pb1xuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKlxuICogUmVmOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TcGhlcmljYWxfY29vcmRpbmF0ZV9zeXN0ZW1cbiAqXG4gKiBUaGUgcG9sZXMgKHBoaSkgYXJlIGF0IHRoZSBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgeSBheGlzLlxuICogVGhlIGVxdWF0b3Igc3RhcnRzIGF0IHBvc2l0aXZlIHouXG4gKi9cblxuZnVuY3Rpb24gU3BoZXJpY2FsKCByYWRpdXMsIHBoaSwgdGhldGEgKSB7XG5cblx0dGhpcy5yYWRpdXMgPSAoIHJhZGl1cyAhPT0gdW5kZWZpbmVkICkgPyByYWRpdXMgOiAxLjA7XG5cdHRoaXMucGhpID0gKCBwaGkgIT09IHVuZGVmaW5lZCApID8gcGhpIDogMDsgLy8gdXAgLyBkb3duIHRvd2FyZHMgdG9wIGFuZCBib3R0b20gcG9sZVxuXHR0aGlzLnRoZXRhID0gKCB0aGV0YSAhPT0gdW5kZWZpbmVkICkgPyB0aGV0YSA6IDA7IC8vIGFyb3VuZCB0aGUgZXF1YXRvciBvZiB0aGUgc3BoZXJlXG5cblx0cmV0dXJuIHRoaXM7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggU3BoZXJpY2FsLnByb3RvdHlwZSwge1xuXG5cdHNldDogZnVuY3Rpb24gKCByYWRpdXMsIHBoaSwgdGhldGEgKSB7XG5cblx0XHR0aGlzLnJhZGl1cyA9IHJhZGl1cztcblx0XHR0aGlzLnBoaSA9IHBoaTtcblx0XHR0aGlzLnRoZXRhID0gdGhldGE7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIG90aGVyICkge1xuXG5cdFx0dGhpcy5yYWRpdXMgPSBvdGhlci5yYWRpdXM7XG5cdFx0dGhpcy5waGkgPSBvdGhlci5waGk7XG5cdFx0dGhpcy50aGV0YSA9IG90aGVyLnRoZXRhO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHQvLyByZXN0cmljdCBwaGkgdG8gYmUgYmV0d2VlIEVQUyBhbmQgUEktRVBTXG5cdG1ha2VTYWZlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgRVBTID0gMC4wMDAwMDE7XG5cdFx0dGhpcy5waGkgPSBNYXRoLm1heCggRVBTLCBNYXRoLm1pbiggTWF0aC5QSSAtIEVQUywgdGhpcy5waGkgKSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRGcm9tVmVjdG9yMzogZnVuY3Rpb24gKCB2ZWMzICkge1xuXG5cdFx0dGhpcy5yYWRpdXMgPSB2ZWMzLmxlbmd0aCgpO1xuXG5cdFx0aWYgKCB0aGlzLnJhZGl1cyA9PT0gMCApIHtcblxuXHRcdFx0dGhpcy50aGV0YSA9IDA7XG5cdFx0XHR0aGlzLnBoaSA9IDA7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR0aGlzLnRoZXRhID0gTWF0aC5hdGFuMiggdmVjMy54LCB2ZWMzLnogKTsgLy8gZXF1YXRvciBhbmdsZSBhcm91bmQgeS11cCBheGlzXG5cdFx0XHR0aGlzLnBoaSA9IE1hdGguYWNvcyggX01hdGguY2xhbXAoIHZlYzMueSAvIHRoaXMucmFkaXVzLCAtIDEsIDEgKSApOyAvLyBwb2xhciBhbmdsZVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqXG4gKiBSZWY6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0N5bGluZHJpY2FsX2Nvb3JkaW5hdGVfc3lzdGVtXG4gKlxuICovXG5cbmZ1bmN0aW9uIEN5bGluZHJpY2FsKCByYWRpdXMsIHRoZXRhLCB5ICkge1xuXG5cdHRoaXMucmFkaXVzID0gKCByYWRpdXMgIT09IHVuZGVmaW5lZCApID8gcmFkaXVzIDogMS4wOyAvLyBkaXN0YW5jZSBmcm9tIHRoZSBvcmlnaW4gdG8gYSBwb2ludCBpbiB0aGUgeC16IHBsYW5lXG5cdHRoaXMudGhldGEgPSAoIHRoZXRhICE9PSB1bmRlZmluZWQgKSA/IHRoZXRhIDogMDsgLy8gY291bnRlcmNsb2Nrd2lzZSBhbmdsZSBpbiB0aGUgeC16IHBsYW5lIG1lYXN1cmVkIGluIHJhZGlhbnMgZnJvbSB0aGUgcG9zaXRpdmUgei1heGlzXG5cdHRoaXMueSA9ICggeSAhPT0gdW5kZWZpbmVkICkgPyB5IDogMDsgLy8gaGVpZ2h0IGFib3ZlIHRoZSB4LXogcGxhbmVcblxuXHRyZXR1cm4gdGhpcztcblxufVxuXG5PYmplY3QuYXNzaWduKCBDeWxpbmRyaWNhbC5wcm90b3R5cGUsIHtcblxuXHRzZXQ6IGZ1bmN0aW9uICggcmFkaXVzLCB0aGV0YSwgeSApIHtcblxuXHRcdHRoaXMucmFkaXVzID0gcmFkaXVzO1xuXHRcdHRoaXMudGhldGEgPSB0aGV0YTtcblx0XHR0aGlzLnkgPSB5O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBvdGhlciApIHtcblxuXHRcdHRoaXMucmFkaXVzID0gb3RoZXIucmFkaXVzO1xuXHRcdHRoaXMudGhldGEgPSBvdGhlci50aGV0YTtcblx0XHR0aGlzLnkgPSBvdGhlci55O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRGcm9tVmVjdG9yMzogZnVuY3Rpb24gKCB2ZWMzICkge1xuXG5cdFx0dGhpcy5yYWRpdXMgPSBNYXRoLnNxcnQoIHZlYzMueCAqIHZlYzMueCArIHZlYzMueiAqIHZlYzMueiApO1xuXHRcdHRoaXMudGhldGEgPSBNYXRoLmF0YW4yKCB2ZWMzLngsIHZlYzMueiApO1xuXHRcdHRoaXMueSA9IHZlYzMueTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgYmhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW9cbiAqL1xuXG5mdW5jdGlvbiBCb3gyKCBtaW4sIG1heCApIHtcblxuXHR0aGlzLm1pbiA9ICggbWluICE9PSB1bmRlZmluZWQgKSA/IG1pbiA6IG5ldyBWZWN0b3IyKCArIEluZmluaXR5LCArIEluZmluaXR5ICk7XG5cdHRoaXMubWF4ID0gKCBtYXggIT09IHVuZGVmaW5lZCApID8gbWF4IDogbmV3IFZlY3RvcjIoIC0gSW5maW5pdHksIC0gSW5maW5pdHkgKTtcblxufVxuXG5PYmplY3QuYXNzaWduKCBCb3gyLnByb3RvdHlwZSwge1xuXG5cdHNldDogZnVuY3Rpb24gKCBtaW4sIG1heCApIHtcblxuXHRcdHRoaXMubWluLmNvcHkoIG1pbiApO1xuXHRcdHRoaXMubWF4LmNvcHkoIG1heCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRGcm9tUG9pbnRzOiBmdW5jdGlvbiAoIHBvaW50cyApIHtcblxuXHRcdHRoaXMubWFrZUVtcHR5KCk7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gcG9pbnRzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR0aGlzLmV4cGFuZEJ5UG9pbnQoIHBvaW50c1sgaSBdICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21DZW50ZXJBbmRTaXplOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMigpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHNldEZyb21DZW50ZXJBbmRTaXplKCBjZW50ZXIsIHNpemUgKSB7XG5cblx0XHRcdHZhciBoYWxmU2l6ZSA9IHYxLmNvcHkoIHNpemUgKS5tdWx0aXBseVNjYWxhciggMC41ICk7XG5cdFx0XHR0aGlzLm1pbi5jb3B5KCBjZW50ZXIgKS5zdWIoIGhhbGZTaXplICk7XG5cdFx0XHR0aGlzLm1heC5jb3B5KCBjZW50ZXIgKS5hZGQoIGhhbGZTaXplICk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggYm94ICkge1xuXG5cdFx0dGhpcy5taW4uY29weSggYm94Lm1pbiApO1xuXHRcdHRoaXMubWF4LmNvcHkoIGJveC5tYXggKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bWFrZUVtcHR5OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLm1pbi54ID0gdGhpcy5taW4ueSA9ICsgSW5maW5pdHk7XG5cdFx0dGhpcy5tYXgueCA9IHRoaXMubWF4LnkgPSAtIEluZmluaXR5O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRpc0VtcHR5OiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyB0aGlzIGlzIGEgbW9yZSByb2J1c3QgY2hlY2sgZm9yIGVtcHR5IHRoYW4gKCB2b2x1bWUgPD0gMCApIGJlY2F1c2Ugdm9sdW1lIGNhbiBnZXQgcG9zaXRpdmUgd2l0aCB0d28gbmVnYXRpdmUgYXhlc1xuXG5cdFx0cmV0dXJuICggdGhpcy5tYXgueCA8IHRoaXMubWluLnggKSB8fCAoIHRoaXMubWF4LnkgPCB0aGlzLm1pbi55ICk7XG5cblx0fSxcblxuXHRnZXRDZW50ZXI6IGZ1bmN0aW9uICggdGFyZ2V0ICkge1xuXG5cdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQm94MjogLmdldENlbnRlcigpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHR0YXJnZXQgPSBuZXcgVmVjdG9yMigpO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuaXNFbXB0eSgpID8gdGFyZ2V0LnNldCggMCwgMCApIDogdGFyZ2V0LmFkZFZlY3RvcnMoIHRoaXMubWluLCB0aGlzLm1heCApLm11bHRpcGx5U2NhbGFyKCAwLjUgKTtcblxuXHR9LFxuXG5cdGdldFNpemU6IGZ1bmN0aW9uICggdGFyZ2V0ICkge1xuXG5cdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQm94MjogLmdldFNpemUoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApO1xuXHRcdFx0dGFyZ2V0ID0gbmV3IFZlY3RvcjIoKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmlzRW1wdHkoKSA/IHRhcmdldC5zZXQoIDAsIDAgKSA6IHRhcmdldC5zdWJWZWN0b3JzKCB0aGlzLm1heCwgdGhpcy5taW4gKTtcblxuXHR9LFxuXG5cdGV4cGFuZEJ5UG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQgKSB7XG5cblx0XHR0aGlzLm1pbi5taW4oIHBvaW50ICk7XG5cdFx0dGhpcy5tYXgubWF4KCBwb2ludCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRleHBhbmRCeVZlY3RvcjogZnVuY3Rpb24gKCB2ZWN0b3IgKSB7XG5cblx0XHR0aGlzLm1pbi5zdWIoIHZlY3RvciApO1xuXHRcdHRoaXMubWF4LmFkZCggdmVjdG9yICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGV4cGFuZEJ5U2NhbGFyOiBmdW5jdGlvbiAoIHNjYWxhciApIHtcblxuXHRcdHRoaXMubWluLmFkZFNjYWxhciggLSBzY2FsYXIgKTtcblx0XHR0aGlzLm1heC5hZGRTY2FsYXIoIHNjYWxhciApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjb250YWluc1BvaW50OiBmdW5jdGlvbiAoIHBvaW50ICkge1xuXG5cdFx0cmV0dXJuIHBvaW50LnggPCB0aGlzLm1pbi54IHx8IHBvaW50LnggPiB0aGlzLm1heC54IHx8XG5cdFx0XHRwb2ludC55IDwgdGhpcy5taW4ueSB8fCBwb2ludC55ID4gdGhpcy5tYXgueSA/IGZhbHNlIDogdHJ1ZTtcblxuXHR9LFxuXG5cdGNvbnRhaW5zQm94OiBmdW5jdGlvbiAoIGJveCApIHtcblxuXHRcdHJldHVybiB0aGlzLm1pbi54IDw9IGJveC5taW4ueCAmJiBib3gubWF4LnggPD0gdGhpcy5tYXgueCAmJlxuXHRcdFx0dGhpcy5taW4ueSA8PSBib3gubWluLnkgJiYgYm94Lm1heC55IDw9IHRoaXMubWF4Lnk7XG5cblx0fSxcblxuXHRnZXRQYXJhbWV0ZXI6IGZ1bmN0aW9uICggcG9pbnQsIHRhcmdldCApIHtcblxuXHRcdC8vIFRoaXMgY2FuIHBvdGVudGlhbGx5IGhhdmUgYSBkaXZpZGUgYnkgemVybyBpZiB0aGUgYm94XG5cdFx0Ly8gaGFzIGEgc2l6ZSBkaW1lbnNpb24gb2YgMC5cblxuXHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJveDI6IC5nZXRQYXJhbWV0ZXIoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApO1xuXHRcdFx0dGFyZ2V0ID0gbmV3IFZlY3RvcjIoKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0YXJnZXQuc2V0KFxuXHRcdFx0KCBwb2ludC54IC0gdGhpcy5taW4ueCApIC8gKCB0aGlzLm1heC54IC0gdGhpcy5taW4ueCApLFxuXHRcdFx0KCBwb2ludC55IC0gdGhpcy5taW4ueSApIC8gKCB0aGlzLm1heC55IC0gdGhpcy5taW4ueSApXG5cdFx0KTtcblxuXHR9LFxuXG5cdGludGVyc2VjdHNCb3g6IGZ1bmN0aW9uICggYm94ICkge1xuXG5cdFx0Ly8gdXNpbmcgNCBzcGxpdHRpbmcgcGxhbmVzIHRvIHJ1bGUgb3V0IGludGVyc2VjdGlvbnNcblxuXHRcdHJldHVybiBib3gubWF4LnggPCB0aGlzLm1pbi54IHx8IGJveC5taW4ueCA+IHRoaXMubWF4LnggfHxcblx0XHRcdGJveC5tYXgueSA8IHRoaXMubWluLnkgfHwgYm94Lm1pbi55ID4gdGhpcy5tYXgueSA/IGZhbHNlIDogdHJ1ZTtcblxuXHR9LFxuXG5cdGNsYW1wUG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQsIHRhcmdldCApIHtcblxuXHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJveDI6IC5jbGFtcFBvaW50KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IyKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGFyZ2V0LmNvcHkoIHBvaW50ICkuY2xhbXAoIHRoaXMubWluLCB0aGlzLm1heCApO1xuXG5cdH0sXG5cblx0ZGlzdGFuY2VUb1BvaW50OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMigpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGRpc3RhbmNlVG9Qb2ludCggcG9pbnQgKSB7XG5cblx0XHRcdHZhciBjbGFtcGVkUG9pbnQgPSB2MS5jb3B5KCBwb2ludCApLmNsYW1wKCB0aGlzLm1pbiwgdGhpcy5tYXggKTtcblx0XHRcdHJldHVybiBjbGFtcGVkUG9pbnQuc3ViKCBwb2ludCApLmxlbmd0aCgpO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0aW50ZXJzZWN0OiBmdW5jdGlvbiAoIGJveCApIHtcblxuXHRcdHRoaXMubWluLm1heCggYm94Lm1pbiApO1xuXHRcdHRoaXMubWF4Lm1pbiggYm94Lm1heCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHR1bmlvbjogZnVuY3Rpb24gKCBib3ggKSB7XG5cblx0XHR0aGlzLm1pbi5taW4oIGJveC5taW4gKTtcblx0XHR0aGlzLm1heC5tYXgoIGJveC5tYXggKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dHJhbnNsYXRlOiBmdW5jdGlvbiAoIG9mZnNldCApIHtcblxuXHRcdHRoaXMubWluLmFkZCggb2Zmc2V0ICk7XG5cdFx0dGhpcy5tYXguYWRkKCBvZmZzZXQgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZXF1YWxzOiBmdW5jdGlvbiAoIGJveCApIHtcblxuXHRcdHJldHVybiBib3gubWluLmVxdWFscyggdGhpcy5taW4gKSAmJiBib3gubWF4LmVxdWFscyggdGhpcy5tYXggKTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICovXG5cbmZ1bmN0aW9uIEltbWVkaWF0ZVJlbmRlck9iamVjdCggbWF0ZXJpYWwgKSB7XG5cblx0T2JqZWN0M0QuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMubWF0ZXJpYWwgPSBtYXRlcmlhbDtcblx0dGhpcy5yZW5kZXIgPSBmdW5jdGlvbiAoIC8qIHJlbmRlckNhbGxiYWNrICovICkge307XG5cbn1cblxuSW1tZWRpYXRlUmVuZGVyT2JqZWN0LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApO1xuSW1tZWRpYXRlUmVuZGVyT2JqZWN0LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEltbWVkaWF0ZVJlbmRlck9iamVjdDtcblxuSW1tZWRpYXRlUmVuZGVyT2JqZWN0LnByb3RvdHlwZS5pc0ltbWVkaWF0ZVJlbmRlck9iamVjdCA9IHRydWU7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleVxuICovXG5cbmZ1bmN0aW9uIFZlcnRleE5vcm1hbHNIZWxwZXIoIG9iamVjdCwgc2l6ZSwgaGV4LCBsaW5ld2lkdGggKSB7XG5cblx0dGhpcy5vYmplY3QgPSBvYmplY3Q7XG5cblx0dGhpcy5zaXplID0gKCBzaXplICE9PSB1bmRlZmluZWQgKSA/IHNpemUgOiAxO1xuXG5cdHZhciBjb2xvciA9ICggaGV4ICE9PSB1bmRlZmluZWQgKSA/IGhleCA6IDB4ZmYwMDAwO1xuXG5cdHZhciB3aWR0aCA9ICggbGluZXdpZHRoICE9PSB1bmRlZmluZWQgKSA/IGxpbmV3aWR0aCA6IDE7XG5cblx0Ly9cblxuXHR2YXIgbk5vcm1hbHMgPSAwO1xuXG5cdHZhciBvYmpHZW9tZXRyeSA9IHRoaXMub2JqZWN0Lmdlb21ldHJ5O1xuXG5cdGlmICggb2JqR2VvbWV0cnkgJiYgb2JqR2VvbWV0cnkuaXNHZW9tZXRyeSApIHtcblxuXHRcdG5Ob3JtYWxzID0gb2JqR2VvbWV0cnkuZmFjZXMubGVuZ3RoICogMztcblxuXHR9IGVsc2UgaWYgKCBvYmpHZW9tZXRyeSAmJiBvYmpHZW9tZXRyeS5pc0J1ZmZlckdlb21ldHJ5ICkge1xuXG5cdFx0bk5vcm1hbHMgPSBvYmpHZW9tZXRyeS5hdHRyaWJ1dGVzLm5vcm1hbC5jb3VudDtcblxuXHR9XG5cblx0Ly9cblxuXHR2YXIgZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcblxuXHR2YXIgcG9zaXRpb25zID0gbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIG5Ob3JtYWxzICogMiAqIDMsIDMgKTtcblxuXHRnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIHBvc2l0aW9ucyApO1xuXG5cdExpbmVTZWdtZW50cy5jYWxsKCB0aGlzLCBnZW9tZXRyeSwgbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiBjb2xvciwgbGluZXdpZHRoOiB3aWR0aCB9ICkgKTtcblxuXHQvL1xuXG5cdHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xuXG5cdHRoaXMudXBkYXRlKCk7XG5cbn1cblxuVmVydGV4Tm9ybWFsc0hlbHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBMaW5lU2VnbWVudHMucHJvdG90eXBlICk7XG5WZXJ0ZXhOb3JtYWxzSGVscGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFZlcnRleE5vcm1hbHNIZWxwZXI7XG5cblZlcnRleE5vcm1hbHNIZWxwZXIucHJvdG90eXBlLnVwZGF0ZSA9ICggZnVuY3Rpb24gKCkge1xuXG5cdHZhciB2MSA9IG5ldyBWZWN0b3IzKCk7XG5cdHZhciB2MiA9IG5ldyBWZWN0b3IzKCk7XG5cdHZhciBub3JtYWxNYXRyaXggPSBuZXcgTWF0cml4MygpO1xuXG5cdHJldHVybiBmdW5jdGlvbiB1cGRhdGUoKSB7XG5cblx0XHR2YXIga2V5cyA9IFsgJ2EnLCAnYicsICdjJyBdO1xuXG5cdFx0dGhpcy5vYmplY3QudXBkYXRlTWF0cml4V29ybGQoIHRydWUgKTtcblxuXHRcdG5vcm1hbE1hdHJpeC5nZXROb3JtYWxNYXRyaXgoIHRoaXMub2JqZWN0Lm1hdHJpeFdvcmxkICk7XG5cblx0XHR2YXIgbWF0cml4V29ybGQgPSB0aGlzLm9iamVjdC5tYXRyaXhXb3JsZDtcblxuXHRcdHZhciBwb3NpdGlvbiA9IHRoaXMuZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbjtcblxuXHRcdC8vXG5cblx0XHR2YXIgb2JqR2VvbWV0cnkgPSB0aGlzLm9iamVjdC5nZW9tZXRyeTtcblxuXHRcdGlmICggb2JqR2VvbWV0cnkgJiYgb2JqR2VvbWV0cnkuaXNHZW9tZXRyeSApIHtcblxuXHRcdFx0dmFyIHZlcnRpY2VzID0gb2JqR2VvbWV0cnkudmVydGljZXM7XG5cblx0XHRcdHZhciBmYWNlcyA9IG9iakdlb21ldHJ5LmZhY2VzO1xuXG5cdFx0XHR2YXIgaWR4ID0gMDtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gZmFjZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHR2YXIgZmFjZSA9IGZhY2VzWyBpIF07XG5cblx0XHRcdFx0Zm9yICggdmFyIGogPSAwLCBqbCA9IGZhY2UudmVydGV4Tm9ybWFscy5sZW5ndGg7IGogPCBqbDsgaiArKyApIHtcblxuXHRcdFx0XHRcdHZhciB2ZXJ0ZXggPSB2ZXJ0aWNlc1sgZmFjZVsga2V5c1sgaiBdIF0gXTtcblxuXHRcdFx0XHRcdHZhciBub3JtYWwgPSBmYWNlLnZlcnRleE5vcm1hbHNbIGogXTtcblxuXHRcdFx0XHRcdHYxLmNvcHkoIHZlcnRleCApLmFwcGx5TWF0cml4NCggbWF0cml4V29ybGQgKTtcblxuXHRcdFx0XHRcdHYyLmNvcHkoIG5vcm1hbCApLmFwcGx5TWF0cml4Myggbm9ybWFsTWF0cml4ICkubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIoIHRoaXMuc2l6ZSApLmFkZCggdjEgKTtcblxuXHRcdFx0XHRcdHBvc2l0aW9uLnNldFhZWiggaWR4LCB2MS54LCB2MS55LCB2MS56ICk7XG5cblx0XHRcdFx0XHRpZHggPSBpZHggKyAxO1xuXG5cdFx0XHRcdFx0cG9zaXRpb24uc2V0WFlaKCBpZHgsIHYyLngsIHYyLnksIHYyLnogKTtcblxuXHRcdFx0XHRcdGlkeCA9IGlkeCArIDE7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2UgaWYgKCBvYmpHZW9tZXRyeSAmJiBvYmpHZW9tZXRyeS5pc0J1ZmZlckdlb21ldHJ5ICkge1xuXG5cdFx0XHR2YXIgb2JqUG9zID0gb2JqR2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbjtcblxuXHRcdFx0dmFyIG9iak5vcm0gPSBvYmpHZW9tZXRyeS5hdHRyaWJ1dGVzLm5vcm1hbDtcblxuXHRcdFx0dmFyIGlkeCA9IDA7XG5cblx0XHRcdC8vIGZvciBzaW1wbGljaXR5LCBpZ25vcmUgaW5kZXggYW5kIGRyYXdjYWxscywgYW5kIHJlbmRlciBldmVyeSBub3JtYWxcblxuXHRcdFx0Zm9yICggdmFyIGogPSAwLCBqbCA9IG9ialBvcy5jb3VudDsgaiA8IGpsOyBqICsrICkge1xuXG5cdFx0XHRcdHYxLnNldCggb2JqUG9zLmdldFgoIGogKSwgb2JqUG9zLmdldFkoIGogKSwgb2JqUG9zLmdldFooIGogKSApLmFwcGx5TWF0cml4NCggbWF0cml4V29ybGQgKTtcblxuXHRcdFx0XHR2Mi5zZXQoIG9iak5vcm0uZ2V0WCggaiApLCBvYmpOb3JtLmdldFkoIGogKSwgb2JqTm9ybS5nZXRaKCBqICkgKTtcblxuXHRcdFx0XHR2Mi5hcHBseU1hdHJpeDMoIG5vcm1hbE1hdHJpeCApLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKCB0aGlzLnNpemUgKS5hZGQoIHYxICk7XG5cblx0XHRcdFx0cG9zaXRpb24uc2V0WFlaKCBpZHgsIHYxLngsIHYxLnksIHYxLnogKTtcblxuXHRcdFx0XHRpZHggPSBpZHggKyAxO1xuXG5cdFx0XHRcdHBvc2l0aW9uLnNldFhZWiggaWR4LCB2Mi54LCB2Mi55LCB2Mi56ICk7XG5cblx0XHRcdFx0aWR4ID0gaWR4ICsgMTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cG9zaXRpb24ubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdH07XG5cbn0oKSApO1xuXG4vKipcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKi9cblxuZnVuY3Rpb24gU3BvdExpZ2h0SGVscGVyKCBsaWdodCwgY29sb3IgKSB7XG5cblx0T2JqZWN0M0QuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMubGlnaHQgPSBsaWdodDtcblx0dGhpcy5saWdodC51cGRhdGVNYXRyaXhXb3JsZCgpO1xuXG5cdHRoaXMubWF0cml4ID0gbGlnaHQubWF0cml4V29ybGQ7XG5cdHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xuXG5cdHRoaXMuY29sb3IgPSBjb2xvcjtcblxuXHR2YXIgZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcblxuXHR2YXIgcG9zaXRpb25zID0gW1xuXHRcdDAsIDAsIDAsIFx0MCwgMCwgMSxcblx0XHQwLCAwLCAwLCBcdDEsIDAsIDEsXG5cdFx0MCwgMCwgMCxcdC0gMSwgMCwgMSxcblx0XHQwLCAwLCAwLCBcdDAsIDEsIDEsXG5cdFx0MCwgMCwgMCwgXHQwLCAtIDEsIDFcblx0XTtcblxuXHRmb3IgKCB2YXIgaSA9IDAsIGogPSAxLCBsID0gMzI7IGkgPCBsOyBpICsrLCBqICsrICkge1xuXG5cdFx0dmFyIHAxID0gKCBpIC8gbCApICogTWF0aC5QSSAqIDI7XG5cdFx0dmFyIHAyID0gKCBqIC8gbCApICogTWF0aC5QSSAqIDI7XG5cblx0XHRwb3NpdGlvbnMucHVzaChcblx0XHRcdE1hdGguY29zKCBwMSApLCBNYXRoLnNpbiggcDEgKSwgMSxcblx0XHRcdE1hdGguY29zKCBwMiApLCBNYXRoLnNpbiggcDIgKSwgMVxuXHRcdCk7XG5cblx0fVxuXG5cdGdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9ucywgMyApICk7XG5cblx0dmFyIG1hdGVyaWFsID0gbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IGZvZzogZmFsc2UgfSApO1xuXG5cdHRoaXMuY29uZSA9IG5ldyBMaW5lU2VnbWVudHMoIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xuXHR0aGlzLmFkZCggdGhpcy5jb25lICk7XG5cblx0dGhpcy51cGRhdGUoKTtcblxufVxuXG5TcG90TGlnaHRIZWxwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICk7XG5TcG90TGlnaHRIZWxwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU3BvdExpZ2h0SGVscGVyO1xuXG5TcG90TGlnaHRIZWxwZXIucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG5cblx0dGhpcy5jb25lLmdlb21ldHJ5LmRpc3Bvc2UoKTtcblx0dGhpcy5jb25lLm1hdGVyaWFsLmRpc3Bvc2UoKTtcblxufTtcblxuU3BvdExpZ2h0SGVscGVyLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAoKSB7XG5cblx0dmFyIHZlY3RvciA9IG5ldyBWZWN0b3IzKCk7XG5cdHZhciB2ZWN0b3IyID0gbmV3IFZlY3RvcjMoKTtcblxuXHRyZXR1cm4gZnVuY3Rpb24gdXBkYXRlKCkge1xuXG5cdFx0dGhpcy5saWdodC51cGRhdGVNYXRyaXhXb3JsZCgpO1xuXG5cdFx0dmFyIGNvbmVMZW5ndGggPSB0aGlzLmxpZ2h0LmRpc3RhbmNlID8gdGhpcy5saWdodC5kaXN0YW5jZSA6IDEwMDA7XG5cdFx0dmFyIGNvbmVXaWR0aCA9IGNvbmVMZW5ndGggKiBNYXRoLnRhbiggdGhpcy5saWdodC5hbmdsZSApO1xuXG5cdFx0dGhpcy5jb25lLnNjYWxlLnNldCggY29uZVdpZHRoLCBjb25lV2lkdGgsIGNvbmVMZW5ndGggKTtcblxuXHRcdHZlY3Rvci5zZXRGcm9tTWF0cml4UG9zaXRpb24oIHRoaXMubGlnaHQubWF0cml4V29ybGQgKTtcblx0XHR2ZWN0b3IyLnNldEZyb21NYXRyaXhQb3NpdGlvbiggdGhpcy5saWdodC50YXJnZXQubWF0cml4V29ybGQgKTtcblxuXHRcdHRoaXMuY29uZS5sb29rQXQoIHZlY3RvcjIuc3ViKCB2ZWN0b3IgKSApO1xuXG5cdFx0aWYgKCB0aGlzLmNvbG9yICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHRoaXMuY29uZS5tYXRlcmlhbC5jb2xvci5zZXQoIHRoaXMuY29sb3IgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHRoaXMuY29uZS5tYXRlcmlhbC5jb2xvci5jb3B5KCB0aGlzLmxpZ2h0LmNvbG9yICk7XG5cblx0XHR9XG5cblx0fTtcblxufSgpO1xuXG4vKipcbiAqIEBhdXRob3IgU2VhbiBHcmlmZmluIC8gaHR0cDovL3R3aXR0ZXIuY29tL3NncmlmXG4gKiBAYXV0aG9yIE1pY2hhZWwgR3VlcnJlcm8gLyBodHRwOi8vcmVhbGl0eW1lbHRkb3duLmNvbVxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgaWtlcnIgLyBodHRwOi8vdmVyb2xkLmNvbVxuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqL1xuXG5mdW5jdGlvbiBnZXRCb25lTGlzdCggb2JqZWN0ICkge1xuXG5cdHZhciBib25lTGlzdCA9IFtdO1xuXG5cdGlmICggb2JqZWN0ICYmIG9iamVjdC5pc0JvbmUgKSB7XG5cblx0XHRib25lTGlzdC5wdXNoKCBvYmplY3QgKTtcblxuXHR9XG5cblx0Zm9yICggdmFyIGkgPSAwOyBpIDwgb2JqZWN0LmNoaWxkcmVuLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdGJvbmVMaXN0LnB1c2guYXBwbHkoIGJvbmVMaXN0LCBnZXRCb25lTGlzdCggb2JqZWN0LmNoaWxkcmVuWyBpIF0gKSApO1xuXG5cdH1cblxuXHRyZXR1cm4gYm9uZUxpc3Q7XG5cbn1cblxuZnVuY3Rpb24gU2tlbGV0b25IZWxwZXIoIG9iamVjdCApIHtcblxuXHR2YXIgYm9uZXMgPSBnZXRCb25lTGlzdCggb2JqZWN0ICk7XG5cblx0dmFyIGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cblx0dmFyIHZlcnRpY2VzID0gW107XG5cdHZhciBjb2xvcnMgPSBbXTtcblxuXHR2YXIgY29sb3IxID0gbmV3IENvbG9yKCAwLCAwLCAxICk7XG5cdHZhciBjb2xvcjIgPSBuZXcgQ29sb3IoIDAsIDEsIDAgKTtcblxuXHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBib25lcy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHR2YXIgYm9uZSA9IGJvbmVzWyBpIF07XG5cblx0XHRpZiAoIGJvbmUucGFyZW50ICYmIGJvbmUucGFyZW50LmlzQm9uZSApIHtcblxuXHRcdFx0dmVydGljZXMucHVzaCggMCwgMCwgMCApO1xuXHRcdFx0dmVydGljZXMucHVzaCggMCwgMCwgMCApO1xuXHRcdFx0Y29sb3JzLnB1c2goIGNvbG9yMS5yLCBjb2xvcjEuZywgY29sb3IxLmIgKTtcblx0XHRcdGNvbG9ycy5wdXNoKCBjb2xvcjIuciwgY29sb3IyLmcsIGNvbG9yMi5iICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdGdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcblx0Z2VvbWV0cnkuYWRkQXR0cmlidXRlKCAnY29sb3InLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggY29sb3JzLCAzICkgKTtcblxuXHR2YXIgbWF0ZXJpYWwgPSBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgdmVydGV4Q29sb3JzOiBWZXJ0ZXhDb2xvcnMsIGRlcHRoVGVzdDogZmFsc2UsIGRlcHRoV3JpdGU6IGZhbHNlLCB0cmFuc3BhcmVudDogdHJ1ZSB9ICk7XG5cblx0TGluZVNlZ21lbnRzLmNhbGwoIHRoaXMsIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xuXG5cdHRoaXMucm9vdCA9IG9iamVjdDtcblx0dGhpcy5ib25lcyA9IGJvbmVzO1xuXG5cdHRoaXMubWF0cml4ID0gb2JqZWN0Lm1hdHJpeFdvcmxkO1xuXHR0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTtcblxufVxuXG5Ta2VsZXRvbkhlbHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBMaW5lU2VnbWVudHMucHJvdG90eXBlICk7XG5Ta2VsZXRvbkhlbHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBTa2VsZXRvbkhlbHBlcjtcblxuU2tlbGV0b25IZWxwZXIucHJvdG90eXBlLnVwZGF0ZU1hdHJpeFdvcmxkID0gZnVuY3Rpb24gKCkge1xuXG5cdHZhciB2ZWN0b3IgPSBuZXcgVmVjdG9yMygpO1xuXG5cdHZhciBib25lTWF0cml4ID0gbmV3IE1hdHJpeDQoKTtcblx0dmFyIG1hdHJpeFdvcmxkSW52ID0gbmV3IE1hdHJpeDQoKTtcblxuXHRyZXR1cm4gZnVuY3Rpb24gdXBkYXRlTWF0cml4V29ybGQoIGZvcmNlICkge1xuXG5cdFx0dmFyIGJvbmVzID0gdGhpcy5ib25lcztcblxuXHRcdHZhciBnZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7XG5cdFx0dmFyIHBvc2l0aW9uID0gZ2VvbWV0cnkuZ2V0QXR0cmlidXRlKCAncG9zaXRpb24nICk7XG5cblx0XHRtYXRyaXhXb3JsZEludi5nZXRJbnZlcnNlKCB0aGlzLnJvb3QubWF0cml4V29ybGQgKTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgaiA9IDA7IGkgPCBib25lcy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdHZhciBib25lID0gYm9uZXNbIGkgXTtcblxuXHRcdFx0aWYgKCBib25lLnBhcmVudCAmJiBib25lLnBhcmVudC5pc0JvbmUgKSB7XG5cblx0XHRcdFx0Ym9uZU1hdHJpeC5tdWx0aXBseU1hdHJpY2VzKCBtYXRyaXhXb3JsZEludiwgYm9uZS5tYXRyaXhXb3JsZCApO1xuXHRcdFx0XHR2ZWN0b3Iuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBib25lTWF0cml4ICk7XG5cdFx0XHRcdHBvc2l0aW9uLnNldFhZWiggaiwgdmVjdG9yLngsIHZlY3Rvci55LCB2ZWN0b3IueiApO1xuXG5cdFx0XHRcdGJvbmVNYXRyaXgubXVsdGlwbHlNYXRyaWNlcyggbWF0cml4V29ybGRJbnYsIGJvbmUucGFyZW50Lm1hdHJpeFdvcmxkICk7XG5cdFx0XHRcdHZlY3Rvci5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGJvbmVNYXRyaXggKTtcblx0XHRcdFx0cG9zaXRpb24uc2V0WFlaKCBqICsgMSwgdmVjdG9yLngsIHZlY3Rvci55LCB2ZWN0b3IueiApO1xuXG5cdFx0XHRcdGogKz0gMjtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Z2VvbWV0cnkuZ2V0QXR0cmlidXRlKCAncG9zaXRpb24nICkubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0T2JqZWN0M0QucHJvdG90eXBlLnVwZGF0ZU1hdHJpeFdvcmxkLmNhbGwoIHRoaXMsIGZvcmNlICk7XG5cblx0fTtcblxufSgpO1xuXG4vKipcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIFBvaW50TGlnaHRIZWxwZXIoIGxpZ2h0LCBzcGhlcmVTaXplLCBjb2xvciApIHtcblxuXHR0aGlzLmxpZ2h0ID0gbGlnaHQ7XG5cdHRoaXMubGlnaHQudXBkYXRlTWF0cml4V29ybGQoKTtcblxuXHR0aGlzLmNvbG9yID0gY29sb3I7XG5cblx0dmFyIGdlb21ldHJ5ID0gbmV3IFNwaGVyZUJ1ZmZlckdlb21ldHJ5KCBzcGhlcmVTaXplLCA0LCAyICk7XG5cdHZhciBtYXRlcmlhbCA9IG5ldyBNZXNoQmFzaWNNYXRlcmlhbCggeyB3aXJlZnJhbWU6IHRydWUsIGZvZzogZmFsc2UgfSApO1xuXG5cdE1lc2guY2FsbCggdGhpcywgZ2VvbWV0cnksIG1hdGVyaWFsICk7XG5cblx0dGhpcy5tYXRyaXggPSB0aGlzLmxpZ2h0Lm1hdHJpeFdvcmxkO1xuXHR0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTtcblxuXHR0aGlzLnVwZGF0ZSgpO1xuXG5cblx0Lypcblx0dmFyIGRpc3RhbmNlR2VvbWV0cnkgPSBuZXcgVEhSRUUuSWNvc2FoZWRyb25HZW9tZXRyeSggMSwgMiApO1xuXHR2YXIgZGlzdGFuY2VNYXRlcmlhbCA9IG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogaGV4Q29sb3IsIGZvZzogZmFsc2UsIHdpcmVmcmFtZTogdHJ1ZSwgb3BhY2l0eTogMC4xLCB0cmFuc3BhcmVudDogdHJ1ZSB9ICk7XG5cblx0dGhpcy5saWdodFNwaGVyZSA9IG5ldyBUSFJFRS5NZXNoKCBidWxiR2VvbWV0cnksIGJ1bGJNYXRlcmlhbCApO1xuXHR0aGlzLmxpZ2h0RGlzdGFuY2UgPSBuZXcgVEhSRUUuTWVzaCggZGlzdGFuY2VHZW9tZXRyeSwgZGlzdGFuY2VNYXRlcmlhbCApO1xuXG5cdHZhciBkID0gbGlnaHQuZGlzdGFuY2U7XG5cblx0aWYgKCBkID09PSAwLjAgKSB7XG5cblx0XHR0aGlzLmxpZ2h0RGlzdGFuY2UudmlzaWJsZSA9IGZhbHNlO1xuXG5cdH0gZWxzZSB7XG5cblx0XHR0aGlzLmxpZ2h0RGlzdGFuY2Uuc2NhbGUuc2V0KCBkLCBkLCBkICk7XG5cblx0fVxuXG5cdHRoaXMuYWRkKCB0aGlzLmxpZ2h0RGlzdGFuY2UgKTtcblx0Ki9cblxufVxuXG5Qb2ludExpZ2h0SGVscGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE1lc2gucHJvdG90eXBlICk7XG5Qb2ludExpZ2h0SGVscGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFBvaW50TGlnaHRIZWxwZXI7XG5cblBvaW50TGlnaHRIZWxwZXIucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG5cblx0dGhpcy5nZW9tZXRyeS5kaXNwb3NlKCk7XG5cdHRoaXMubWF0ZXJpYWwuZGlzcG9zZSgpO1xuXG59O1xuXG5Qb2ludExpZ2h0SGVscGVyLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAoKSB7XG5cblx0aWYgKCB0aGlzLmNvbG9yICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHR0aGlzLm1hdGVyaWFsLmNvbG9yLnNldCggdGhpcy5jb2xvciApO1xuXG5cdH0gZWxzZSB7XG5cblx0XHR0aGlzLm1hdGVyaWFsLmNvbG9yLmNvcHkoIHRoaXMubGlnaHQuY29sb3IgKTtcblxuXHR9XG5cblx0Lypcblx0dmFyIGQgPSB0aGlzLmxpZ2h0LmRpc3RhbmNlO1xuXG5cdGlmICggZCA9PT0gMC4wICkge1xuXG5cdFx0dGhpcy5saWdodERpc3RhbmNlLnZpc2libGUgPSBmYWxzZTtcblxuXHR9IGVsc2Uge1xuXG5cdFx0dGhpcy5saWdodERpc3RhbmNlLnZpc2libGUgPSB0cnVlO1xuXHRcdHRoaXMubGlnaHREaXN0YW5jZS5zY2FsZS5zZXQoIGQsIGQsIGQgKTtcblxuXHR9XG5cdCovXG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBhYmVsbmF0aW9uIC8gaHR0cDovL2dpdGh1Yi5jb20vYWJlbG5hdGlvblxuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cDovL2dpdGh1Yi5jb20vTXVnZW44N1xuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKi9cblxuZnVuY3Rpb24gUmVjdEFyZWFMaWdodEhlbHBlciggbGlnaHQsIGNvbG9yICkge1xuXG5cdE9iamVjdDNELmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLmxpZ2h0ID0gbGlnaHQ7XG5cdHRoaXMubGlnaHQudXBkYXRlTWF0cml4V29ybGQoKTtcblxuXHR0aGlzLm1hdHJpeCA9IGxpZ2h0Lm1hdHJpeFdvcmxkO1xuXHR0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTtcblxuXHR0aGlzLmNvbG9yID0gY29sb3I7XG5cblx0dmFyIG1hdGVyaWFsID0gbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IGZvZzogZmFsc2UgfSApO1xuXG5cdHZhciBnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXG5cdGdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEJ1ZmZlckF0dHJpYnV0ZSggbmV3IEZsb2F0MzJBcnJheSggNSAqIDMgKSwgMyApICk7XG5cblx0dGhpcy5saW5lID0gbmV3IExpbmUoIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xuXHR0aGlzLmFkZCggdGhpcy5saW5lICk7XG5cblxuXHR0aGlzLnVwZGF0ZSgpO1xuXG59XG5cblJlY3RBcmVhTGlnaHRIZWxwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICk7XG5SZWN0QXJlYUxpZ2h0SGVscGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFJlY3RBcmVhTGlnaHRIZWxwZXI7XG5cblJlY3RBcmVhTGlnaHRIZWxwZXIucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG5cblx0dGhpcy5jaGlsZHJlblsgMCBdLmdlb21ldHJ5LmRpc3Bvc2UoKTtcblx0dGhpcy5jaGlsZHJlblsgMCBdLm1hdGVyaWFsLmRpc3Bvc2UoKTtcblxufTtcblxuUmVjdEFyZWFMaWdodEhlbHBlci5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gKCkge1xuXG5cdC8vIGNhbGN1bGF0ZSBuZXcgZGltZW5zaW9ucyBvZiB0aGUgaGVscGVyXG5cblx0dmFyIGh4ID0gdGhpcy5saWdodC53aWR0aCAqIDAuNTtcblx0dmFyIGh5ID0gdGhpcy5saWdodC5oZWlnaHQgKiAwLjU7XG5cblx0dmFyIHBvc2l0aW9uID0gdGhpcy5saW5lLmdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247XG5cdHZhciBhcnJheSA9IHBvc2l0aW9uLmFycmF5O1xuXG5cdC8vIHVwZGF0ZSB2ZXJ0aWNlc1xuXG5cdGFycmF5WyAwIF0gPSBoeDsgYXJyYXlbIDEgXSA9IC0gaHk7IGFycmF5WyAyIF0gPSAwO1xuXHRhcnJheVsgMyBdID0gaHg7IGFycmF5WyA0IF0gPSBoeTsgYXJyYXlbIDUgXSA9IDA7XG5cdGFycmF5WyA2IF0gPSAtIGh4OyBhcnJheVsgNyBdID0gaHk7IGFycmF5WyA4IF0gPSAwO1xuXHRhcnJheVsgOSBdID0gLSBoeDsgYXJyYXlbIDEwIF0gPSAtIGh5OyBhcnJheVsgMTEgXSA9IDA7XG5cdGFycmF5WyAxMiBdID0gaHg7IGFycmF5WyAxMyBdID0gLSBoeTsgYXJyYXlbIDE0IF0gPSAwO1xuXG5cdHBvc2l0aW9uLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRpZiAoIHRoaXMuY29sb3IgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdHRoaXMubGluZS5tYXRlcmlhbC5jb2xvci5zZXQoIHRoaXMuY29sb3IgKTtcblxuXHR9IGVsc2Uge1xuXG5cdFx0dGhpcy5saW5lLm1hdGVyaWFsLmNvbG9yLmNvcHkoIHRoaXMubGlnaHQuY29sb3IgKTtcblxuXHR9XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44N1xuICovXG5cbmZ1bmN0aW9uIEhlbWlzcGhlcmVMaWdodEhlbHBlciggbGlnaHQsIHNpemUsIGNvbG9yICkge1xuXG5cdE9iamVjdDNELmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLmxpZ2h0ID0gbGlnaHQ7XG5cdHRoaXMubGlnaHQudXBkYXRlTWF0cml4V29ybGQoKTtcblxuXHR0aGlzLm1hdHJpeCA9IGxpZ2h0Lm1hdHJpeFdvcmxkO1xuXHR0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTtcblxuXHR0aGlzLmNvbG9yID0gY29sb3I7XG5cblx0dmFyIGdlb21ldHJ5ID0gbmV3IE9jdGFoZWRyb25CdWZmZXJHZW9tZXRyeSggc2l6ZSApO1xuXHRnZW9tZXRyeS5yb3RhdGVZKCBNYXRoLlBJICogMC41ICk7XG5cblx0dGhpcy5tYXRlcmlhbCA9IG5ldyBNZXNoQmFzaWNNYXRlcmlhbCggeyB3aXJlZnJhbWU6IHRydWUsIGZvZzogZmFsc2UgfSApO1xuXHRpZiAoIHRoaXMuY29sb3IgPT09IHVuZGVmaW5lZCApIHRoaXMubWF0ZXJpYWwudmVydGV4Q29sb3JzID0gVmVydGV4Q29sb3JzO1xuXG5cdHZhciBwb3NpdGlvbiA9IGdlb21ldHJ5LmdldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJyApO1xuXHR2YXIgY29sb3JzID0gbmV3IEZsb2F0MzJBcnJheSggcG9zaXRpb24uY291bnQgKiAzICk7XG5cblx0Z2VvbWV0cnkuYWRkQXR0cmlidXRlKCAnY29sb3InLCBuZXcgQnVmZmVyQXR0cmlidXRlKCBjb2xvcnMsIDMgKSApO1xuXG5cdHRoaXMuYWRkKCBuZXcgTWVzaCggZ2VvbWV0cnksIHRoaXMubWF0ZXJpYWwgKSApO1xuXG5cdHRoaXMudXBkYXRlKCk7XG5cbn1cblxuSGVtaXNwaGVyZUxpZ2h0SGVscGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApO1xuSGVtaXNwaGVyZUxpZ2h0SGVscGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEhlbWlzcGhlcmVMaWdodEhlbHBlcjtcblxuSGVtaXNwaGVyZUxpZ2h0SGVscGVyLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuXG5cdHRoaXMuY2hpbGRyZW5bIDAgXS5nZW9tZXRyeS5kaXNwb3NlKCk7XG5cdHRoaXMuY2hpbGRyZW5bIDAgXS5tYXRlcmlhbC5kaXNwb3NlKCk7XG5cbn07XG5cbkhlbWlzcGhlcmVMaWdodEhlbHBlci5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gKCkge1xuXG5cdHZhciB2ZWN0b3IgPSBuZXcgVmVjdG9yMygpO1xuXG5cdHZhciBjb2xvcjEgPSBuZXcgQ29sb3IoKTtcblx0dmFyIGNvbG9yMiA9IG5ldyBDb2xvcigpO1xuXG5cdHJldHVybiBmdW5jdGlvbiB1cGRhdGUoKSB7XG5cblx0XHR2YXIgbWVzaCA9IHRoaXMuY2hpbGRyZW5bIDAgXTtcblxuXHRcdGlmICggdGhpcy5jb2xvciAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR0aGlzLm1hdGVyaWFsLmNvbG9yLnNldCggdGhpcy5jb2xvciApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dmFyIGNvbG9ycyA9IG1lc2guZ2VvbWV0cnkuZ2V0QXR0cmlidXRlKCAnY29sb3InICk7XG5cblx0XHRcdGNvbG9yMS5jb3B5KCB0aGlzLmxpZ2h0LmNvbG9yICk7XG5cdFx0XHRjb2xvcjIuY29weSggdGhpcy5saWdodC5ncm91bmRDb2xvciApO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBjb2xvcnMuY291bnQ7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdHZhciBjb2xvciA9ICggaSA8ICggbCAvIDIgKSApID8gY29sb3IxIDogY29sb3IyO1xuXG5cdFx0XHRcdGNvbG9ycy5zZXRYWVooIGksIGNvbG9yLnIsIGNvbG9yLmcsIGNvbG9yLmIgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRjb2xvcnMubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0fVxuXG5cdFx0bWVzaC5sb29rQXQoIHZlY3Rvci5zZXRGcm9tTWF0cml4UG9zaXRpb24oIHRoaXMubGlnaHQubWF0cml4V29ybGQgKS5uZWdhdGUoKSApO1xuXG5cdH07XG5cbn0oKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIEdyaWRIZWxwZXIoIHNpemUsIGRpdmlzaW9ucywgY29sb3IxLCBjb2xvcjIgKSB7XG5cblx0c2l6ZSA9IHNpemUgfHwgMTA7XG5cdGRpdmlzaW9ucyA9IGRpdmlzaW9ucyB8fCAxMDtcblx0Y29sb3IxID0gbmV3IENvbG9yKCBjb2xvcjEgIT09IHVuZGVmaW5lZCA/IGNvbG9yMSA6IDB4NDQ0NDQ0ICk7XG5cdGNvbG9yMiA9IG5ldyBDb2xvciggY29sb3IyICE9PSB1bmRlZmluZWQgPyBjb2xvcjIgOiAweDg4ODg4OCApO1xuXG5cdHZhciBjZW50ZXIgPSBkaXZpc2lvbnMgLyAyO1xuXHR2YXIgc3RlcCA9IHNpemUgLyBkaXZpc2lvbnM7XG5cdHZhciBoYWxmU2l6ZSA9IHNpemUgLyAyO1xuXG5cdHZhciB2ZXJ0aWNlcyA9IFtdLCBjb2xvcnMgPSBbXTtcblxuXHRmb3IgKCB2YXIgaSA9IDAsIGogPSAwLCBrID0gLSBoYWxmU2l6ZTsgaSA8PSBkaXZpc2lvbnM7IGkgKyssIGsgKz0gc3RlcCApIHtcblxuXHRcdHZlcnRpY2VzLnB1c2goIC0gaGFsZlNpemUsIDAsIGssIGhhbGZTaXplLCAwLCBrICk7XG5cdFx0dmVydGljZXMucHVzaCggaywgMCwgLSBoYWxmU2l6ZSwgaywgMCwgaGFsZlNpemUgKTtcblxuXHRcdHZhciBjb2xvciA9IGkgPT09IGNlbnRlciA/IGNvbG9yMSA6IGNvbG9yMjtcblxuXHRcdGNvbG9yLnRvQXJyYXkoIGNvbG9ycywgaiApOyBqICs9IDM7XG5cdFx0Y29sb3IudG9BcnJheSggY29sb3JzLCBqICk7IGogKz0gMztcblx0XHRjb2xvci50b0FycmF5KCBjb2xvcnMsIGogKTsgaiArPSAzO1xuXHRcdGNvbG9yLnRvQXJyYXkoIGNvbG9ycywgaiApOyBqICs9IDM7XG5cblx0fVxuXG5cdHZhciBnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXHRnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XG5cdGdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ2NvbG9yJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIGNvbG9ycywgMyApICk7XG5cblx0dmFyIG1hdGVyaWFsID0gbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IHZlcnRleENvbG9yczogVmVydGV4Q29sb3JzIH0gKTtcblxuXHRMaW5lU2VnbWVudHMuY2FsbCggdGhpcywgZ2VvbWV0cnksIG1hdGVyaWFsICk7XG5cbn1cblxuR3JpZEhlbHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBMaW5lU2VnbWVudHMucHJvdG90eXBlICk7XG5HcmlkSGVscGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEdyaWRIZWxwZXI7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHA6Ly9naXRodWIuY29tL011Z2VuODdcbiAqIEBhdXRob3IgSGVjdGF0ZSAvIGh0dHA6Ly93d3cuZ2l0aHViLmNvbS9IZWN0YXRlXG4gKi9cblxuZnVuY3Rpb24gUG9sYXJHcmlkSGVscGVyKCByYWRpdXMsIHJhZGlhbHMsIGNpcmNsZXMsIGRpdmlzaW9ucywgY29sb3IxLCBjb2xvcjIgKSB7XG5cblx0cmFkaXVzID0gcmFkaXVzIHx8IDEwO1xuXHRyYWRpYWxzID0gcmFkaWFscyB8fCAxNjtcblx0Y2lyY2xlcyA9IGNpcmNsZXMgfHwgODtcblx0ZGl2aXNpb25zID0gZGl2aXNpb25zIHx8IDY0O1xuXHRjb2xvcjEgPSBuZXcgQ29sb3IoIGNvbG9yMSAhPT0gdW5kZWZpbmVkID8gY29sb3IxIDogMHg0NDQ0NDQgKTtcblx0Y29sb3IyID0gbmV3IENvbG9yKCBjb2xvcjIgIT09IHVuZGVmaW5lZCA/IGNvbG9yMiA6IDB4ODg4ODg4ICk7XG5cblx0dmFyIHZlcnRpY2VzID0gW107XG5cdHZhciBjb2xvcnMgPSBbXTtcblxuXHR2YXIgeCwgejtcblx0dmFyIHYsIGksIGosIHIsIGNvbG9yO1xuXG5cdC8vIGNyZWF0ZSB0aGUgcmFkaWFsc1xuXG5cdGZvciAoIGkgPSAwOyBpIDw9IHJhZGlhbHM7IGkgKysgKSB7XG5cblx0XHR2ID0gKCBpIC8gcmFkaWFscyApICogKCBNYXRoLlBJICogMiApO1xuXG5cdFx0eCA9IE1hdGguc2luKCB2ICkgKiByYWRpdXM7XG5cdFx0eiA9IE1hdGguY29zKCB2ICkgKiByYWRpdXM7XG5cblx0XHR2ZXJ0aWNlcy5wdXNoKCAwLCAwLCAwICk7XG5cdFx0dmVydGljZXMucHVzaCggeCwgMCwgeiApO1xuXG5cdFx0Y29sb3IgPSAoIGkgJiAxICkgPyBjb2xvcjEgOiBjb2xvcjI7XG5cblx0XHRjb2xvcnMucHVzaCggY29sb3IuciwgY29sb3IuZywgY29sb3IuYiApO1xuXHRcdGNvbG9ycy5wdXNoKCBjb2xvci5yLCBjb2xvci5nLCBjb2xvci5iICk7XG5cblx0fVxuXG5cdC8vIGNyZWF0ZSB0aGUgY2lyY2xlc1xuXG5cdGZvciAoIGkgPSAwOyBpIDw9IGNpcmNsZXM7IGkgKysgKSB7XG5cblx0XHRjb2xvciA9ICggaSAmIDEgKSA/IGNvbG9yMSA6IGNvbG9yMjtcblxuXHRcdHIgPSByYWRpdXMgLSAoIHJhZGl1cyAvIGNpcmNsZXMgKiBpICk7XG5cblx0XHRmb3IgKCBqID0gMDsgaiA8IGRpdmlzaW9uczsgaiArKyApIHtcblxuXHRcdFx0Ly8gZmlyc3QgdmVydGV4XG5cblx0XHRcdHYgPSAoIGogLyBkaXZpc2lvbnMgKSAqICggTWF0aC5QSSAqIDIgKTtcblxuXHRcdFx0eCA9IE1hdGguc2luKCB2ICkgKiByO1xuXHRcdFx0eiA9IE1hdGguY29zKCB2ICkgKiByO1xuXG5cdFx0XHR2ZXJ0aWNlcy5wdXNoKCB4LCAwLCB6ICk7XG5cdFx0XHRjb2xvcnMucHVzaCggY29sb3IuciwgY29sb3IuZywgY29sb3IuYiApO1xuXG5cdFx0XHQvLyBzZWNvbmQgdmVydGV4XG5cblx0XHRcdHYgPSAoICggaiArIDEgKSAvIGRpdmlzaW9ucyApICogKCBNYXRoLlBJICogMiApO1xuXG5cdFx0XHR4ID0gTWF0aC5zaW4oIHYgKSAqIHI7XG5cdFx0XHR6ID0gTWF0aC5jb3MoIHYgKSAqIHI7XG5cblx0XHRcdHZlcnRpY2VzLnB1c2goIHgsIDAsIHogKTtcblx0XHRcdGNvbG9ycy5wdXNoKCBjb2xvci5yLCBjb2xvci5nLCBjb2xvci5iICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdHZhciBnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXHRnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XG5cdGdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ2NvbG9yJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIGNvbG9ycywgMyApICk7XG5cblx0dmFyIG1hdGVyaWFsID0gbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IHZlcnRleENvbG9yczogVmVydGV4Q29sb3JzIH0gKTtcblxuXHRMaW5lU2VnbWVudHMuY2FsbCggdGhpcywgZ2VvbWV0cnksIG1hdGVyaWFsICk7XG5cbn1cblxuUG9sYXJHcmlkSGVscGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIExpbmVTZWdtZW50cy5wcm90b3R5cGUgKTtcblBvbGFyR3JpZEhlbHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBQb2xhckdyaWRIZWxwZXI7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleVxuICovXG5cbmZ1bmN0aW9uIEZhY2VOb3JtYWxzSGVscGVyKCBvYmplY3QsIHNpemUsIGhleCwgbGluZXdpZHRoICkge1xuXG5cdC8vIEZhY2VOb3JtYWxzSGVscGVyIG9ubHkgc3VwcG9ydHMgVEhSRUUuR2VvbWV0cnlcblxuXHR0aGlzLm9iamVjdCA9IG9iamVjdDtcblxuXHR0aGlzLnNpemUgPSAoIHNpemUgIT09IHVuZGVmaW5lZCApID8gc2l6ZSA6IDE7XG5cblx0dmFyIGNvbG9yID0gKCBoZXggIT09IHVuZGVmaW5lZCApID8gaGV4IDogMHhmZmZmMDA7XG5cblx0dmFyIHdpZHRoID0gKCBsaW5ld2lkdGggIT09IHVuZGVmaW5lZCApID8gbGluZXdpZHRoIDogMTtcblxuXHQvL1xuXG5cdHZhciBuTm9ybWFscyA9IDA7XG5cblx0dmFyIG9iakdlb21ldHJ5ID0gdGhpcy5vYmplY3QuZ2VvbWV0cnk7XG5cblx0aWYgKCBvYmpHZW9tZXRyeSAmJiBvYmpHZW9tZXRyeS5pc0dlb21ldHJ5ICkge1xuXG5cdFx0bk5vcm1hbHMgPSBvYmpHZW9tZXRyeS5mYWNlcy5sZW5ndGg7XG5cblx0fSBlbHNlIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkZhY2VOb3JtYWxzSGVscGVyOiBvbmx5IFRIUkVFLkdlb21ldHJ5IGlzIHN1cHBvcnRlZC4gVXNlIFRIUkVFLlZlcnRleE5vcm1hbHNIZWxwZXIsIGluc3RlYWQuJyApO1xuXG5cdH1cblxuXHQvL1xuXG5cdHZhciBnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXG5cdHZhciBwb3NpdGlvbnMgPSBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbk5vcm1hbHMgKiAyICogMywgMyApO1xuXG5cdGdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgcG9zaXRpb25zICk7XG5cblx0TGluZVNlZ21lbnRzLmNhbGwoIHRoaXMsIGdlb21ldHJ5LCBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IGNvbG9yLCBsaW5ld2lkdGg6IHdpZHRoIH0gKSApO1xuXG5cdC8vXG5cblx0dGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7XG5cdHRoaXMudXBkYXRlKCk7XG5cbn1cblxuRmFjZU5vcm1hbHNIZWxwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTGluZVNlZ21lbnRzLnByb3RvdHlwZSApO1xuRmFjZU5vcm1hbHNIZWxwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gRmFjZU5vcm1hbHNIZWxwZXI7XG5cbkZhY2VOb3JtYWxzSGVscGVyLnByb3RvdHlwZS51cGRhdGUgPSAoIGZ1bmN0aW9uICgpIHtcblxuXHR2YXIgdjEgPSBuZXcgVmVjdG9yMygpO1xuXHR2YXIgdjIgPSBuZXcgVmVjdG9yMygpO1xuXHR2YXIgbm9ybWFsTWF0cml4ID0gbmV3IE1hdHJpeDMoKTtcblxuXHRyZXR1cm4gZnVuY3Rpb24gdXBkYXRlKCkge1xuXG5cdFx0dGhpcy5vYmplY3QudXBkYXRlTWF0cml4V29ybGQoIHRydWUgKTtcblxuXHRcdG5vcm1hbE1hdHJpeC5nZXROb3JtYWxNYXRyaXgoIHRoaXMub2JqZWN0Lm1hdHJpeFdvcmxkICk7XG5cblx0XHR2YXIgbWF0cml4V29ybGQgPSB0aGlzLm9iamVjdC5tYXRyaXhXb3JsZDtcblxuXHRcdHZhciBwb3NpdGlvbiA9IHRoaXMuZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbjtcblxuXHRcdC8vXG5cblx0XHR2YXIgb2JqR2VvbWV0cnkgPSB0aGlzLm9iamVjdC5nZW9tZXRyeTtcblxuXHRcdHZhciB2ZXJ0aWNlcyA9IG9iakdlb21ldHJ5LnZlcnRpY2VzO1xuXG5cdFx0dmFyIGZhY2VzID0gb2JqR2VvbWV0cnkuZmFjZXM7XG5cblx0XHR2YXIgaWR4ID0gMDtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGZhY2VzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBmYWNlID0gZmFjZXNbIGkgXTtcblxuXHRcdFx0dmFyIG5vcm1hbCA9IGZhY2Uubm9ybWFsO1xuXG5cdFx0XHR2MS5jb3B5KCB2ZXJ0aWNlc1sgZmFjZS5hIF0gKVxuXHRcdFx0XHQuYWRkKCB2ZXJ0aWNlc1sgZmFjZS5iIF0gKVxuXHRcdFx0XHQuYWRkKCB2ZXJ0aWNlc1sgZmFjZS5jIF0gKVxuXHRcdFx0XHQuZGl2aWRlU2NhbGFyKCAzIClcblx0XHRcdFx0LmFwcGx5TWF0cml4NCggbWF0cml4V29ybGQgKTtcblxuXHRcdFx0djIuY29weSggbm9ybWFsICkuYXBwbHlNYXRyaXgzKCBub3JtYWxNYXRyaXggKS5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhciggdGhpcy5zaXplICkuYWRkKCB2MSApO1xuXG5cdFx0XHRwb3NpdGlvbi5zZXRYWVooIGlkeCwgdjEueCwgdjEueSwgdjEueiApO1xuXG5cdFx0XHRpZHggPSBpZHggKyAxO1xuXG5cdFx0XHRwb3NpdGlvbi5zZXRYWVooIGlkeCwgdjIueCwgdjIueSwgdjIueiApO1xuXG5cdFx0XHRpZHggPSBpZHggKyAxO1xuXG5cdFx0fVxuXG5cdFx0cG9zaXRpb24ubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdH07XG5cbn0oKSApO1xuXG4vKipcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKi9cblxuZnVuY3Rpb24gRGlyZWN0aW9uYWxMaWdodEhlbHBlciggbGlnaHQsIHNpemUsIGNvbG9yICkge1xuXG5cdE9iamVjdDNELmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLmxpZ2h0ID0gbGlnaHQ7XG5cdHRoaXMubGlnaHQudXBkYXRlTWF0cml4V29ybGQoKTtcblxuXHR0aGlzLm1hdHJpeCA9IGxpZ2h0Lm1hdHJpeFdvcmxkO1xuXHR0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTtcblxuXHR0aGlzLmNvbG9yID0gY29sb3I7XG5cblx0aWYgKCBzaXplID09PSB1bmRlZmluZWQgKSBzaXplID0gMTtcblxuXHR2YXIgZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcblx0Z2VvbWV0cnkuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggW1xuXHRcdC0gc2l6ZSwgc2l6ZSwgMCxcblx0XHRzaXplLCBzaXplLCAwLFxuXHRcdHNpemUsIC0gc2l6ZSwgMCxcblx0XHQtIHNpemUsIC0gc2l6ZSwgMCxcblx0XHQtIHNpemUsIHNpemUsIDBcblx0XSwgMyApICk7XG5cblx0dmFyIG1hdGVyaWFsID0gbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IGZvZzogZmFsc2UgfSApO1xuXG5cdHRoaXMubGlnaHRQbGFuZSA9IG5ldyBMaW5lKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcblx0dGhpcy5hZGQoIHRoaXMubGlnaHRQbGFuZSApO1xuXG5cdGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cdGdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIFsgMCwgMCwgMCwgMCwgMCwgMSBdLCAzICkgKTtcblxuXHR0aGlzLnRhcmdldExpbmUgPSBuZXcgTGluZSggZ2VvbWV0cnksIG1hdGVyaWFsICk7XG5cdHRoaXMuYWRkKCB0aGlzLnRhcmdldExpbmUgKTtcblxuXHR0aGlzLnVwZGF0ZSgpO1xuXG59XG5cbkRpcmVjdGlvbmFsTGlnaHRIZWxwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICk7XG5EaXJlY3Rpb25hbExpZ2h0SGVscGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IERpcmVjdGlvbmFsTGlnaHRIZWxwZXI7XG5cbkRpcmVjdGlvbmFsTGlnaHRIZWxwZXIucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG5cblx0dGhpcy5saWdodFBsYW5lLmdlb21ldHJ5LmRpc3Bvc2UoKTtcblx0dGhpcy5saWdodFBsYW5lLm1hdGVyaWFsLmRpc3Bvc2UoKTtcblx0dGhpcy50YXJnZXRMaW5lLmdlb21ldHJ5LmRpc3Bvc2UoKTtcblx0dGhpcy50YXJnZXRMaW5lLm1hdGVyaWFsLmRpc3Bvc2UoKTtcblxufTtcblxuRGlyZWN0aW9uYWxMaWdodEhlbHBlci5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gKCkge1xuXG5cdHZhciB2MSA9IG5ldyBWZWN0b3IzKCk7XG5cdHZhciB2MiA9IG5ldyBWZWN0b3IzKCk7XG5cdHZhciB2MyA9IG5ldyBWZWN0b3IzKCk7XG5cblx0cmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZSgpIHtcblxuXHRcdHYxLnNldEZyb21NYXRyaXhQb3NpdGlvbiggdGhpcy5saWdodC5tYXRyaXhXb3JsZCApO1xuXHRcdHYyLnNldEZyb21NYXRyaXhQb3NpdGlvbiggdGhpcy5saWdodC50YXJnZXQubWF0cml4V29ybGQgKTtcblx0XHR2My5zdWJWZWN0b3JzKCB2MiwgdjEgKTtcblxuXHRcdHRoaXMubGlnaHRQbGFuZS5sb29rQXQoIHYzICk7XG5cblx0XHRpZiAoIHRoaXMuY29sb3IgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dGhpcy5saWdodFBsYW5lLm1hdGVyaWFsLmNvbG9yLnNldCggdGhpcy5jb2xvciApO1xuXHRcdFx0dGhpcy50YXJnZXRMaW5lLm1hdGVyaWFsLmNvbG9yLnNldCggdGhpcy5jb2xvciApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dGhpcy5saWdodFBsYW5lLm1hdGVyaWFsLmNvbG9yLmNvcHkoIHRoaXMubGlnaHQuY29sb3IgKTtcblx0XHRcdHRoaXMudGFyZ2V0TGluZS5tYXRlcmlhbC5jb2xvci5jb3B5KCB0aGlzLmxpZ2h0LmNvbG9yICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLnRhcmdldExpbmUubG9va0F0KCB2MyApO1xuXHRcdHRoaXMudGFyZ2V0TGluZS5zY2FsZS56ID0gdjMubGVuZ3RoKCk7XG5cblx0fTtcblxufSgpO1xuXG4vKipcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44N1xuICpcbiAqXHQtIHNob3dzIGZydXN0dW0sIGxpbmUgb2Ygc2lnaHQgYW5kIHVwIG9mIHRoZSBjYW1lcmFcbiAqXHQtIHN1aXRhYmxlIGZvciBmYXN0IHVwZGF0ZXNcbiAqIFx0LSBiYXNlZCBvbiBmcnVzdHVtIHZpc3VhbGl6YXRpb24gaW4gbGlnaHRnbC5qcyBzaGFkb3dtYXAgZXhhbXBsZVxuICpcdFx0aHR0cDovL2V2YW53LmdpdGh1Yi5jb20vbGlnaHRnbC5qcy90ZXN0cy9zaGFkb3dtYXAuaHRtbFxuICovXG5cbmZ1bmN0aW9uIENhbWVyYUhlbHBlciggY2FtZXJhICkge1xuXG5cdHZhciBnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXHR2YXIgbWF0ZXJpYWwgPSBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IDB4ZmZmZmZmLCB2ZXJ0ZXhDb2xvcnM6IEZhY2VDb2xvcnMgfSApO1xuXG5cdHZhciB2ZXJ0aWNlcyA9IFtdO1xuXHR2YXIgY29sb3JzID0gW107XG5cblx0dmFyIHBvaW50TWFwID0ge307XG5cblx0Ly8gY29sb3JzXG5cblx0dmFyIGNvbG9yRnJ1c3R1bSA9IG5ldyBDb2xvciggMHhmZmFhMDAgKTtcblx0dmFyIGNvbG9yQ29uZSA9IG5ldyBDb2xvciggMHhmZjAwMDAgKTtcblx0dmFyIGNvbG9yVXAgPSBuZXcgQ29sb3IoIDB4MDBhYWZmICk7XG5cdHZhciBjb2xvclRhcmdldCA9IG5ldyBDb2xvciggMHhmZmZmZmYgKTtcblx0dmFyIGNvbG9yQ3Jvc3MgPSBuZXcgQ29sb3IoIDB4MzMzMzMzICk7XG5cblx0Ly8gbmVhclxuXG5cdGFkZExpbmUoICduMScsICduMicsIGNvbG9yRnJ1c3R1bSApO1xuXHRhZGRMaW5lKCAnbjInLCAnbjQnLCBjb2xvckZydXN0dW0gKTtcblx0YWRkTGluZSggJ240JywgJ24zJywgY29sb3JGcnVzdHVtICk7XG5cdGFkZExpbmUoICduMycsICduMScsIGNvbG9yRnJ1c3R1bSApO1xuXG5cdC8vIGZhclxuXG5cdGFkZExpbmUoICdmMScsICdmMicsIGNvbG9yRnJ1c3R1bSApO1xuXHRhZGRMaW5lKCAnZjInLCAnZjQnLCBjb2xvckZydXN0dW0gKTtcblx0YWRkTGluZSggJ2Y0JywgJ2YzJywgY29sb3JGcnVzdHVtICk7XG5cdGFkZExpbmUoICdmMycsICdmMScsIGNvbG9yRnJ1c3R1bSApO1xuXG5cdC8vIHNpZGVzXG5cblx0YWRkTGluZSggJ24xJywgJ2YxJywgY29sb3JGcnVzdHVtICk7XG5cdGFkZExpbmUoICduMicsICdmMicsIGNvbG9yRnJ1c3R1bSApO1xuXHRhZGRMaW5lKCAnbjMnLCAnZjMnLCBjb2xvckZydXN0dW0gKTtcblx0YWRkTGluZSggJ240JywgJ2Y0JywgY29sb3JGcnVzdHVtICk7XG5cblx0Ly8gY29uZVxuXG5cdGFkZExpbmUoICdwJywgJ24xJywgY29sb3JDb25lICk7XG5cdGFkZExpbmUoICdwJywgJ24yJywgY29sb3JDb25lICk7XG5cdGFkZExpbmUoICdwJywgJ24zJywgY29sb3JDb25lICk7XG5cdGFkZExpbmUoICdwJywgJ240JywgY29sb3JDb25lICk7XG5cblx0Ly8gdXBcblxuXHRhZGRMaW5lKCAndTEnLCAndTInLCBjb2xvclVwICk7XG5cdGFkZExpbmUoICd1MicsICd1MycsIGNvbG9yVXAgKTtcblx0YWRkTGluZSggJ3UzJywgJ3UxJywgY29sb3JVcCApO1xuXG5cdC8vIHRhcmdldFxuXG5cdGFkZExpbmUoICdjJywgJ3QnLCBjb2xvclRhcmdldCApO1xuXHRhZGRMaW5lKCAncCcsICdjJywgY29sb3JDcm9zcyApO1xuXG5cdC8vIGNyb3NzXG5cblx0YWRkTGluZSggJ2NuMScsICdjbjInLCBjb2xvckNyb3NzICk7XG5cdGFkZExpbmUoICdjbjMnLCAnY240JywgY29sb3JDcm9zcyApO1xuXG5cdGFkZExpbmUoICdjZjEnLCAnY2YyJywgY29sb3JDcm9zcyApO1xuXHRhZGRMaW5lKCAnY2YzJywgJ2NmNCcsIGNvbG9yQ3Jvc3MgKTtcblxuXHRmdW5jdGlvbiBhZGRMaW5lKCBhLCBiLCBjb2xvciApIHtcblxuXHRcdGFkZFBvaW50KCBhLCBjb2xvciApO1xuXHRcdGFkZFBvaW50KCBiLCBjb2xvciApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBhZGRQb2ludCggaWQsIGNvbG9yICkge1xuXG5cdFx0dmVydGljZXMucHVzaCggMCwgMCwgMCApO1xuXHRcdGNvbG9ycy5wdXNoKCBjb2xvci5yLCBjb2xvci5nLCBjb2xvci5iICk7XG5cblx0XHRpZiAoIHBvaW50TWFwWyBpZCBdID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHBvaW50TWFwWyBpZCBdID0gW107XG5cblx0XHR9XG5cblx0XHRwb2ludE1hcFsgaWQgXS5wdXNoKCAoIHZlcnRpY2VzLmxlbmd0aCAvIDMgKSAtIDEgKTtcblxuXHR9XG5cblx0Z2VvbWV0cnkuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXHRnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdjb2xvcicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBjb2xvcnMsIDMgKSApO1xuXG5cdExpbmVTZWdtZW50cy5jYWxsKCB0aGlzLCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcblxuXHR0aGlzLmNhbWVyYSA9IGNhbWVyYTtcblx0aWYgKCB0aGlzLmNhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4ICkgdGhpcy5jYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xuXG5cdHRoaXMubWF0cml4ID0gY2FtZXJhLm1hdHJpeFdvcmxkO1xuXHR0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTtcblxuXHR0aGlzLnBvaW50TWFwID0gcG9pbnRNYXA7XG5cblx0dGhpcy51cGRhdGUoKTtcblxufVxuXG5DYW1lcmFIZWxwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTGluZVNlZ21lbnRzLnByb3RvdHlwZSApO1xuQ2FtZXJhSGVscGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IENhbWVyYUhlbHBlcjtcblxuQ2FtZXJhSGVscGVyLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAoKSB7XG5cblx0dmFyIGdlb21ldHJ5LCBwb2ludE1hcDtcblxuXHR2YXIgdmVjdG9yID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIGNhbWVyYSA9IG5ldyBDYW1lcmEoKTtcblxuXHRmdW5jdGlvbiBzZXRQb2ludCggcG9pbnQsIHgsIHksIHogKSB7XG5cblx0XHR2ZWN0b3Iuc2V0KCB4LCB5LCB6ICkudW5wcm9qZWN0KCBjYW1lcmEgKTtcblxuXHRcdHZhciBwb2ludHMgPSBwb2ludE1hcFsgcG9pbnQgXTtcblxuXHRcdGlmICggcG9pbnRzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHZhciBwb3NpdGlvbiA9IGdlb21ldHJ5LmdldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJyApO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBwb2ludHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRwb3NpdGlvbi5zZXRYWVooIHBvaW50c1sgaSBdLCB2ZWN0b3IueCwgdmVjdG9yLnksIHZlY3Rvci56ICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9XG5cblx0cmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZSgpIHtcblxuXHRcdGdlb21ldHJ5ID0gdGhpcy5nZW9tZXRyeTtcblx0XHRwb2ludE1hcCA9IHRoaXMucG9pbnRNYXA7XG5cblx0XHR2YXIgdyA9IDEsIGggPSAxO1xuXG5cdFx0Ly8gd2UgbmVlZCBqdXN0IGNhbWVyYSBwcm9qZWN0aW9uIG1hdHJpeFxuXHRcdC8vIHdvcmxkIG1hdHJpeCBtdXN0IGJlIGlkZW50aXR5XG5cblx0XHRjYW1lcmEucHJvamVjdGlvbk1hdHJpeC5jb3B5KCB0aGlzLmNhbWVyYS5wcm9qZWN0aW9uTWF0cml4ICk7XG5cblx0XHQvLyBjZW50ZXIgLyB0YXJnZXRcblxuXHRcdHNldFBvaW50KCAnYycsIDAsIDAsIC0gMSApO1xuXHRcdHNldFBvaW50KCAndCcsIDAsIDAsIDEgKTtcblxuXHRcdC8vIG5lYXJcblxuXHRcdHNldFBvaW50KCAnbjEnLCAtIHcsIC0gaCwgLSAxICk7XG5cdFx0c2V0UG9pbnQoICduMicsIHcsIC0gaCwgLSAxICk7XG5cdFx0c2V0UG9pbnQoICduMycsIC0gdywgaCwgLSAxICk7XG5cdFx0c2V0UG9pbnQoICduNCcsIHcsIGgsIC0gMSApO1xuXG5cdFx0Ly8gZmFyXG5cblx0XHRzZXRQb2ludCggJ2YxJywgLSB3LCAtIGgsIDEgKTtcblx0XHRzZXRQb2ludCggJ2YyJywgdywgLSBoLCAxICk7XG5cdFx0c2V0UG9pbnQoICdmMycsIC0gdywgaCwgMSApO1xuXHRcdHNldFBvaW50KCAnZjQnLCB3LCBoLCAxICk7XG5cblx0XHQvLyB1cFxuXG5cdFx0c2V0UG9pbnQoICd1MScsIHcgKiAwLjcsIGggKiAxLjEsIC0gMSApO1xuXHRcdHNldFBvaW50KCAndTInLCAtIHcgKiAwLjcsIGggKiAxLjEsIC0gMSApO1xuXHRcdHNldFBvaW50KCAndTMnLCAwLCBoICogMiwgLSAxICk7XG5cblx0XHQvLyBjcm9zc1xuXG5cdFx0c2V0UG9pbnQoICdjZjEnLCAtIHcsIDAsIDEgKTtcblx0XHRzZXRQb2ludCggJ2NmMicsIHcsIDAsIDEgKTtcblx0XHRzZXRQb2ludCggJ2NmMycsIDAsIC0gaCwgMSApO1xuXHRcdHNldFBvaW50KCAnY2Y0JywgMCwgaCwgMSApO1xuXG5cdFx0c2V0UG9pbnQoICdjbjEnLCAtIHcsIDAsIC0gMSApO1xuXHRcdHNldFBvaW50KCAnY24yJywgdywgMCwgLSAxICk7XG5cdFx0c2V0UG9pbnQoICdjbjMnLCAwLCAtIGgsIC0gMSApO1xuXHRcdHNldFBvaW50KCAnY240JywgMCwgaCwgLSAxICk7XG5cblx0XHRnZW9tZXRyeS5nZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicgKS5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0fTtcblxufSgpO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKi9cblxuZnVuY3Rpb24gQm94SGVscGVyKCBvYmplY3QsIGNvbG9yICkge1xuXG5cdHRoaXMub2JqZWN0ID0gb2JqZWN0O1xuXG5cdGlmICggY29sb3IgPT09IHVuZGVmaW5lZCApIGNvbG9yID0gMHhmZmZmMDA7XG5cblx0dmFyIGluZGljZXMgPSBuZXcgVWludDE2QXJyYXkoIFsgMCwgMSwgMSwgMiwgMiwgMywgMywgMCwgNCwgNSwgNSwgNiwgNiwgNywgNywgNCwgMCwgNCwgMSwgNSwgMiwgNiwgMywgNyBdICk7XG5cdHZhciBwb3NpdGlvbnMgPSBuZXcgRmxvYXQzMkFycmF5KCA4ICogMyApO1xuXG5cdHZhciBnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXHRnZW9tZXRyeS5zZXRJbmRleCggbmV3IEJ1ZmZlckF0dHJpYnV0ZSggaW5kaWNlcywgMSApICk7XG5cdGdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25zLCAzICkgKTtcblxuXHRMaW5lU2VnbWVudHMuY2FsbCggdGhpcywgZ2VvbWV0cnksIG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogY29sb3IgfSApICk7XG5cblx0dGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7XG5cblx0dGhpcy51cGRhdGUoKTtcblxufVxuXG5Cb3hIZWxwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTGluZVNlZ21lbnRzLnByb3RvdHlwZSApO1xuQm94SGVscGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEJveEhlbHBlcjtcblxuQm94SGVscGVyLnByb3RvdHlwZS51cGRhdGUgPSAoIGZ1bmN0aW9uICgpIHtcblxuXHR2YXIgYm94ID0gbmV3IEJveDMoKTtcblxuXHRyZXR1cm4gZnVuY3Rpb24gdXBkYXRlKCBvYmplY3QgKSB7XG5cblx0XHRpZiAoIG9iamVjdCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Cb3hIZWxwZXI6IC51cGRhdGUoKSBoYXMgbm8gbG9uZ2VyIGFyZ3VtZW50cy4nICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIHRoaXMub2JqZWN0ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGJveC5zZXRGcm9tT2JqZWN0KCB0aGlzLm9iamVjdCApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBib3guaXNFbXB0eSgpICkgcmV0dXJuO1xuXG5cdFx0dmFyIG1pbiA9IGJveC5taW47XG5cdFx0dmFyIG1heCA9IGJveC5tYXg7XG5cblx0XHQvKlxuXHRcdCAgNV9fX180XG5cdFx0MS9fX18wL3xcblx0XHR8IDZfX3xfN1xuXHRcdDIvX19fMy9cblxuXHRcdDA6IG1heC54LCBtYXgueSwgbWF4Lnpcblx0XHQxOiBtaW4ueCwgbWF4LnksIG1heC56XG5cdFx0MjogbWluLngsIG1pbi55LCBtYXguelxuXHRcdDM6IG1heC54LCBtaW4ueSwgbWF4Lnpcblx0XHQ0OiBtYXgueCwgbWF4LnksIG1pbi56XG5cdFx0NTogbWluLngsIG1heC55LCBtaW4uelxuXHRcdDY6IG1pbi54LCBtaW4ueSwgbWluLnpcblx0XHQ3OiBtYXgueCwgbWluLnksIG1pbi56XG5cdFx0Ki9cblxuXHRcdHZhciBwb3NpdGlvbiA9IHRoaXMuZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbjtcblx0XHR2YXIgYXJyYXkgPSBwb3NpdGlvbi5hcnJheTtcblxuXHRcdGFycmF5WyAwIF0gPSBtYXgueDsgYXJyYXlbIDEgXSA9IG1heC55OyBhcnJheVsgMiBdID0gbWF4Lno7XG5cdFx0YXJyYXlbIDMgXSA9IG1pbi54OyBhcnJheVsgNCBdID0gbWF4Lnk7IGFycmF5WyA1IF0gPSBtYXguejtcblx0XHRhcnJheVsgNiBdID0gbWluLng7IGFycmF5WyA3IF0gPSBtaW4ueTsgYXJyYXlbIDggXSA9IG1heC56O1xuXHRcdGFycmF5WyA5IF0gPSBtYXgueDsgYXJyYXlbIDEwIF0gPSBtaW4ueTsgYXJyYXlbIDExIF0gPSBtYXguejtcblx0XHRhcnJheVsgMTIgXSA9IG1heC54OyBhcnJheVsgMTMgXSA9IG1heC55OyBhcnJheVsgMTQgXSA9IG1pbi56O1xuXHRcdGFycmF5WyAxNSBdID0gbWluLng7IGFycmF5WyAxNiBdID0gbWF4Lnk7IGFycmF5WyAxNyBdID0gbWluLno7XG5cdFx0YXJyYXlbIDE4IF0gPSBtaW4ueDsgYXJyYXlbIDE5IF0gPSBtaW4ueTsgYXJyYXlbIDIwIF0gPSBtaW4uejtcblx0XHRhcnJheVsgMjEgXSA9IG1heC54OyBhcnJheVsgMjIgXSA9IG1pbi55OyBhcnJheVsgMjMgXSA9IG1pbi56O1xuXG5cdFx0cG9zaXRpb24ubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0dGhpcy5nZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtcblxuXHR9O1xuXG59ICkoKTtcblxuQm94SGVscGVyLnByb3RvdHlwZS5zZXRGcm9tT2JqZWN0ID0gZnVuY3Rpb24gKCBvYmplY3QgKSB7XG5cblx0dGhpcy5vYmplY3QgPSBvYmplY3Q7XG5cdHRoaXMudXBkYXRlKCk7XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKi9cblxuZnVuY3Rpb24gQm94M0hlbHBlciggYm94LCBoZXggKSB7XG5cblx0dGhpcy50eXBlID0gJ0JveDNIZWxwZXInO1xuXG5cdHRoaXMuYm94ID0gYm94O1xuXG5cdHZhciBjb2xvciA9ICggaGV4ICE9PSB1bmRlZmluZWQgKSA/IGhleCA6IDB4ZmZmZjAwO1xuXG5cdHZhciBpbmRpY2VzID0gbmV3IFVpbnQxNkFycmF5KCBbIDAsIDEsIDEsIDIsIDIsIDMsIDMsIDAsIDQsIDUsIDUsIDYsIDYsIDcsIDcsIDQsIDAsIDQsIDEsIDUsIDIsIDYsIDMsIDcgXSApO1xuXG5cdHZhciBwb3NpdGlvbnMgPSBbIDEsIDEsIDEsIC0gMSwgMSwgMSwgLSAxLCAtIDEsIDEsIDEsIC0gMSwgMSwgMSwgMSwgLSAxLCAtIDEsIDEsIC0gMSwgLSAxLCAtIDEsIC0gMSwgMSwgLSAxLCAtIDEgXTtcblxuXHR2YXIgZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcblxuXHRnZW9tZXRyeS5zZXRJbmRleCggbmV3IEJ1ZmZlckF0dHJpYnV0ZSggaW5kaWNlcywgMSApICk7XG5cblx0Z2VvbWV0cnkuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25zLCAzICkgKTtcblxuXHRMaW5lU2VnbWVudHMuY2FsbCggdGhpcywgZ2VvbWV0cnksIG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogY29sb3IgfSApICk7XG5cblx0dGhpcy5nZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtcblxufVxuXG5Cb3gzSGVscGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIExpbmVTZWdtZW50cy5wcm90b3R5cGUgKTtcbkJveDNIZWxwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQm94M0hlbHBlcjtcblxuQm94M0hlbHBlci5wcm90b3R5cGUudXBkYXRlTWF0cml4V29ybGQgPSBmdW5jdGlvbiAoIGZvcmNlICkge1xuXG5cdHZhciBib3ggPSB0aGlzLmJveDtcblxuXHRpZiAoIGJveC5pc0VtcHR5KCkgKSByZXR1cm47XG5cblx0Ym94LmdldENlbnRlciggdGhpcy5wb3NpdGlvbiApO1xuXG5cdGJveC5nZXRTaXplKCB0aGlzLnNjYWxlICk7XG5cblx0dGhpcy5zY2FsZS5tdWx0aXBseVNjYWxhciggMC41ICk7XG5cblx0T2JqZWN0M0QucHJvdG90eXBlLnVwZGF0ZU1hdHJpeFdvcmxkLmNhbGwoIHRoaXMsIGZvcmNlICk7XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKi9cblxuZnVuY3Rpb24gUGxhbmVIZWxwZXIoIHBsYW5lLCBzaXplLCBoZXggKSB7XG5cblx0dGhpcy50eXBlID0gJ1BsYW5lSGVscGVyJztcblxuXHR0aGlzLnBsYW5lID0gcGxhbmU7XG5cblx0dGhpcy5zaXplID0gKCBzaXplID09PSB1bmRlZmluZWQgKSA/IDEgOiBzaXplO1xuXG5cdHZhciBjb2xvciA9ICggaGV4ICE9PSB1bmRlZmluZWQgKSA/IGhleCA6IDB4ZmZmZjAwO1xuXG5cdHZhciBwb3NpdGlvbnMgPSBbIDEsIC0gMSwgMSwgLSAxLCAxLCAxLCAtIDEsIC0gMSwgMSwgMSwgMSwgMSwgLSAxLCAxLCAxLCAtIDEsIC0gMSwgMSwgMSwgLSAxLCAxLCAxLCAxLCAxLCAwLCAwLCAxLCAwLCAwLCAwIF07XG5cblx0dmFyIGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cdGdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9ucywgMyApICk7XG5cdGdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO1xuXG5cdExpbmUuY2FsbCggdGhpcywgZ2VvbWV0cnksIG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogY29sb3IgfSApICk7XG5cblx0Ly9cblxuXHR2YXIgcG9zaXRpb25zMiA9IFsgMSwgMSwgMSwgLSAxLCAxLCAxLCAtIDEsIC0gMSwgMSwgMSwgMSwgMSwgLSAxLCAtIDEsIDEsIDEsIC0gMSwgMSBdO1xuXG5cdHZhciBnZW9tZXRyeTIgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcblx0Z2VvbWV0cnkyLmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uczIsIDMgKSApO1xuXHRnZW9tZXRyeTIuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7XG5cblx0dGhpcy5hZGQoIG5ldyBNZXNoKCBnZW9tZXRyeTIsIG5ldyBNZXNoQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogY29sb3IsIG9wYWNpdHk6IDAuMiwgdHJhbnNwYXJlbnQ6IHRydWUsIGRlcHRoV3JpdGU6IGZhbHNlIH0gKSApICk7XG5cbn1cblxuUGxhbmVIZWxwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTGluZS5wcm90b3R5cGUgKTtcblBsYW5lSGVscGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFBsYW5lSGVscGVyO1xuXG5QbGFuZUhlbHBlci5wcm90b3R5cGUudXBkYXRlTWF0cml4V29ybGQgPSBmdW5jdGlvbiAoIGZvcmNlICkge1xuXG5cdHZhciBzY2FsZSA9IC0gdGhpcy5wbGFuZS5jb25zdGFudDtcblxuXHRpZiAoIE1hdGguYWJzKCBzY2FsZSApIDwgMWUtOCApIHNjYWxlID0gMWUtODsgLy8gc2lnbiBkb2VzIG5vdCBtYXR0ZXJcblxuXHR0aGlzLnNjYWxlLnNldCggMC41ICogdGhpcy5zaXplLCAwLjUgKiB0aGlzLnNpemUsIHNjYWxlICk7XG5cblx0dGhpcy5sb29rQXQoIHRoaXMucGxhbmUubm9ybWFsICk7XG5cblx0T2JqZWN0M0QucHJvdG90eXBlLnVwZGF0ZU1hdHJpeFdvcmxkLmNhbGwoIHRoaXMsIGZvcmNlICk7XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKiBAYXV0aG9yIHp6ODUgLyBodHRwOi8vZ2l0aHViLmNvbS96ejg1XG4gKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvXG4gKlxuICogQ3JlYXRlcyBhbiBhcnJvdyBmb3IgdmlzdWFsaXppbmcgZGlyZWN0aW9uc1xuICpcbiAqIFBhcmFtZXRlcnM6XG4gKiAgZGlyIC0gVmVjdG9yM1xuICogIG9yaWdpbiAtIFZlY3RvcjNcbiAqICBsZW5ndGggLSBOdW1iZXJcbiAqICBjb2xvciAtIGNvbG9yIGluIGhleCB2YWx1ZVxuICogIGhlYWRMZW5ndGggLSBOdW1iZXJcbiAqICBoZWFkV2lkdGggLSBOdW1iZXJcbiAqL1xuXG52YXIgbGluZUdlb21ldHJ5O1xudmFyIGNvbmVHZW9tZXRyeTtcblxuZnVuY3Rpb24gQXJyb3dIZWxwZXIoIGRpciwgb3JpZ2luLCBsZW5ndGgsIGNvbG9yLCBoZWFkTGVuZ3RoLCBoZWFkV2lkdGggKSB7XG5cblx0Ly8gZGlyIGlzIGFzc3VtZWQgdG8gYmUgbm9ybWFsaXplZFxuXG5cdE9iamVjdDNELmNhbGwoIHRoaXMgKTtcblxuXHRpZiAoIGNvbG9yID09PSB1bmRlZmluZWQgKSBjb2xvciA9IDB4ZmZmZjAwO1xuXHRpZiAoIGxlbmd0aCA9PT0gdW5kZWZpbmVkICkgbGVuZ3RoID0gMTtcblx0aWYgKCBoZWFkTGVuZ3RoID09PSB1bmRlZmluZWQgKSBoZWFkTGVuZ3RoID0gMC4yICogbGVuZ3RoO1xuXHRpZiAoIGhlYWRXaWR0aCA9PT0gdW5kZWZpbmVkICkgaGVhZFdpZHRoID0gMC4yICogaGVhZExlbmd0aDtcblxuXHRpZiAoIGxpbmVHZW9tZXRyeSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0bGluZUdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cdFx0bGluZUdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIFsgMCwgMCwgMCwgMCwgMSwgMCBdLCAzICkgKTtcblxuXHRcdGNvbmVHZW9tZXRyeSA9IG5ldyBDeWxpbmRlckJ1ZmZlckdlb21ldHJ5KCAwLCAwLjUsIDEsIDUsIDEgKTtcblx0XHRjb25lR2VvbWV0cnkudHJhbnNsYXRlKCAwLCAtIDAuNSwgMCApO1xuXG5cdH1cblxuXHR0aGlzLnBvc2l0aW9uLmNvcHkoIG9yaWdpbiApO1xuXG5cdHRoaXMubGluZSA9IG5ldyBMaW5lKCBsaW5lR2VvbWV0cnksIG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogY29sb3IgfSApICk7XG5cdHRoaXMubGluZS5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7XG5cdHRoaXMuYWRkKCB0aGlzLmxpbmUgKTtcblxuXHR0aGlzLmNvbmUgPSBuZXcgTWVzaCggY29uZUdlb21ldHJ5LCBuZXcgTWVzaEJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IGNvbG9yIH0gKSApO1xuXHR0aGlzLmNvbmUubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xuXHR0aGlzLmFkZCggdGhpcy5jb25lICk7XG5cblx0dGhpcy5zZXREaXJlY3Rpb24oIGRpciApO1xuXHR0aGlzLnNldExlbmd0aCggbGVuZ3RoLCBoZWFkTGVuZ3RoLCBoZWFkV2lkdGggKTtcblxufVxuXG5BcnJvd0hlbHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKTtcbkFycm93SGVscGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEFycm93SGVscGVyO1xuXG5BcnJvd0hlbHBlci5wcm90b3R5cGUuc2V0RGlyZWN0aW9uID0gKCBmdW5jdGlvbiAoKSB7XG5cblx0dmFyIGF4aXMgPSBuZXcgVmVjdG9yMygpO1xuXHR2YXIgcmFkaWFucztcblxuXHRyZXR1cm4gZnVuY3Rpb24gc2V0RGlyZWN0aW9uKCBkaXIgKSB7XG5cblx0XHQvLyBkaXIgaXMgYXNzdW1lZCB0byBiZSBub3JtYWxpemVkXG5cblx0XHRpZiAoIGRpci55ID4gMC45OTk5OSApIHtcblxuXHRcdFx0dGhpcy5xdWF0ZXJuaW9uLnNldCggMCwgMCwgMCwgMSApO1xuXG5cdFx0fSBlbHNlIGlmICggZGlyLnkgPCAtIDAuOTk5OTkgKSB7XG5cblx0XHRcdHRoaXMucXVhdGVybmlvbi5zZXQoIDEsIDAsIDAsIDAgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGF4aXMuc2V0KCBkaXIueiwgMCwgLSBkaXIueCApLm5vcm1hbGl6ZSgpO1xuXG5cdFx0XHRyYWRpYW5zID0gTWF0aC5hY29zKCBkaXIueSApO1xuXG5cdFx0XHR0aGlzLnF1YXRlcm5pb24uc2V0RnJvbUF4aXNBbmdsZSggYXhpcywgcmFkaWFucyApO1xuXG5cdFx0fVxuXG5cdH07XG5cbn0oKSApO1xuXG5BcnJvd0hlbHBlci5wcm90b3R5cGUuc2V0TGVuZ3RoID0gZnVuY3Rpb24gKCBsZW5ndGgsIGhlYWRMZW5ndGgsIGhlYWRXaWR0aCApIHtcblxuXHRpZiAoIGhlYWRMZW5ndGggPT09IHVuZGVmaW5lZCApIGhlYWRMZW5ndGggPSAwLjIgKiBsZW5ndGg7XG5cdGlmICggaGVhZFdpZHRoID09PSB1bmRlZmluZWQgKSBoZWFkV2lkdGggPSAwLjIgKiBoZWFkTGVuZ3RoO1xuXG5cdHRoaXMubGluZS5zY2FsZS5zZXQoIDEsIE1hdGgubWF4KCAwLCBsZW5ndGggLSBoZWFkTGVuZ3RoICksIDEgKTtcblx0dGhpcy5saW5lLnVwZGF0ZU1hdHJpeCgpO1xuXG5cdHRoaXMuY29uZS5zY2FsZS5zZXQoIGhlYWRXaWR0aCwgaGVhZExlbmd0aCwgaGVhZFdpZHRoICk7XG5cdHRoaXMuY29uZS5wb3NpdGlvbi55ID0gbGVuZ3RoO1xuXHR0aGlzLmNvbmUudXBkYXRlTWF0cml4KCk7XG5cbn07XG5cbkFycm93SGVscGVyLnByb3RvdHlwZS5zZXRDb2xvciA9IGZ1bmN0aW9uICggY29sb3IgKSB7XG5cblx0dGhpcy5saW5lLm1hdGVyaWFsLmNvbG9yLmNvcHkoIGNvbG9yICk7XG5cdHRoaXMuY29uZS5tYXRlcmlhbC5jb2xvci5jb3B5KCBjb2xvciApO1xuXG59O1xuXG4vKipcbiAqIEBhdXRob3Igc3JvdWNoZXJheSAvIGh0dHA6Ly9zcm91Y2hlcmF5Lm9yZy9cbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gQXhlc0hlbHBlciggc2l6ZSApIHtcblxuXHRzaXplID0gc2l6ZSB8fCAxO1xuXG5cdHZhciB2ZXJ0aWNlcyA9IFtcblx0XHQwLCAwLCAwLFx0c2l6ZSwgMCwgMCxcblx0XHQwLCAwLCAwLFx0MCwgc2l6ZSwgMCxcblx0XHQwLCAwLCAwLFx0MCwgMCwgc2l6ZVxuXHRdO1xuXG5cdHZhciBjb2xvcnMgPSBbXG5cdFx0MSwgMCwgMCxcdDEsIDAuNiwgMCxcblx0XHQwLCAxLCAwLFx0MC42LCAxLCAwLFxuXHRcdDAsIDAsIDEsXHQwLCAwLjYsIDFcblx0XTtcblxuXHR2YXIgZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcblx0Z2VvbWV0cnkuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXHRnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdjb2xvcicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBjb2xvcnMsIDMgKSApO1xuXG5cdHZhciBtYXRlcmlhbCA9IG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyB2ZXJ0ZXhDb2xvcnM6IFZlcnRleENvbG9ycyB9ICk7XG5cblx0TGluZVNlZ21lbnRzLmNhbGwoIHRoaXMsIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xuXG59XG5cbkF4ZXNIZWxwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTGluZVNlZ21lbnRzLnByb3RvdHlwZSApO1xuQXhlc0hlbHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBBeGVzSGVscGVyO1xuXG4vL1xuXG5DdXJ2ZS5jcmVhdGUgPSBmdW5jdGlvbiAoIGNvbnN0cnVjdCwgZ2V0UG9pbnQgKSB7XG5cblx0Y29uc29sZS5sb2coICdUSFJFRS5DdXJ2ZS5jcmVhdGUoKSBoYXMgYmVlbiBkZXByZWNhdGVkJyApO1xuXG5cdGNvbnN0cnVjdC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDdXJ2ZS5wcm90b3R5cGUgKTtcblx0Y29uc3RydWN0LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGNvbnN0cnVjdDtcblx0Y29uc3RydWN0LnByb3RvdHlwZS5nZXRQb2ludCA9IGdldFBvaW50O1xuXG5cdHJldHVybiBjb25zdHJ1Y3Q7XG5cbn07XG5cbi8vXG5cbk9iamVjdC5hc3NpZ24oIEN1cnZlUGF0aC5wcm90b3R5cGUsIHtcblxuXHRjcmVhdGVQb2ludHNHZW9tZXRyeTogZnVuY3Rpb24gKCBkaXZpc2lvbnMgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5DdXJ2ZVBhdGg6IC5jcmVhdGVQb2ludHNHZW9tZXRyeSgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuR2VvbWV0cnkoKS5zZXRGcm9tUG9pbnRzKCBwb2ludHMgKSBpbnN0ZWFkLicgKTtcblxuXHRcdC8vIGdlbmVyYXRlIGdlb21ldHJ5IGZyb20gcGF0aCBwb2ludHMgKGZvciBMaW5lIG9yIFBvaW50cyBvYmplY3RzKVxuXG5cdFx0dmFyIHB0cyA9IHRoaXMuZ2V0UG9pbnRzKCBkaXZpc2lvbnMgKTtcblx0XHRyZXR1cm4gdGhpcy5jcmVhdGVHZW9tZXRyeSggcHRzICk7XG5cblx0fSxcblxuXHRjcmVhdGVTcGFjZWRQb2ludHNHZW9tZXRyeTogZnVuY3Rpb24gKCBkaXZpc2lvbnMgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5DdXJ2ZVBhdGg6IC5jcmVhdGVTcGFjZWRQb2ludHNHZW9tZXRyeSgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuR2VvbWV0cnkoKS5zZXRGcm9tUG9pbnRzKCBwb2ludHMgKSBpbnN0ZWFkLicgKTtcblxuXHRcdC8vIGdlbmVyYXRlIGdlb21ldHJ5IGZyb20gZXF1aWRpc3RhbnQgc2FtcGxpbmcgYWxvbmcgdGhlIHBhdGhcblxuXHRcdHZhciBwdHMgPSB0aGlzLmdldFNwYWNlZFBvaW50cyggZGl2aXNpb25zICk7XG5cdFx0cmV0dXJuIHRoaXMuY3JlYXRlR2VvbWV0cnkoIHB0cyApO1xuXG5cdH0sXG5cblx0Y3JlYXRlR2VvbWV0cnk6IGZ1bmN0aW9uICggcG9pbnRzICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQ3VydmVQYXRoOiAuY3JlYXRlR2VvbWV0cnkoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLkdlb21ldHJ5KCkuc2V0RnJvbVBvaW50cyggcG9pbnRzICkgaW5zdGVhZC4nICk7XG5cblx0XHR2YXIgZ2VvbWV0cnkgPSBuZXcgR2VvbWV0cnkoKTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHBvaW50cy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgcG9pbnQgPSBwb2ludHNbIGkgXTtcblx0XHRcdGdlb21ldHJ5LnZlcnRpY2VzLnB1c2goIG5ldyBWZWN0b3IzKCBwb2ludC54LCBwb2ludC55LCBwb2ludC56IHx8IDAgKSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGdlb21ldHJ5O1xuXG5cdH1cblxufSApO1xuXG4vL1xuXG5PYmplY3QuYXNzaWduKCBQYXRoLnByb3RvdHlwZSwge1xuXG5cdGZyb21Qb2ludHM6IGZ1bmN0aW9uICggcG9pbnRzICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuUGF0aDogLmZyb21Qb2ludHMoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5zZXRGcm9tUG9pbnRzKCkuJyApO1xuXHRcdHRoaXMuc2V0RnJvbVBvaW50cyggcG9pbnRzICk7XG5cblx0fVxuXG59ICk7XG5cbi8vXG5cbmZ1bmN0aW9uIFNwbGluZSggcG9pbnRzICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLlNwbGluZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuQ2F0bXVsbFJvbUN1cnZlMyBpbnN0ZWFkLicgKTtcblxuXHRDYXRtdWxsUm9tQ3VydmUzLmNhbGwoIHRoaXMsIHBvaW50cyApO1xuXHR0aGlzLnR5cGUgPSAnY2F0bXVsbHJvbSc7XG5cbn1cblxuU3BsaW5lLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIENhdG11bGxSb21DdXJ2ZTMucHJvdG90eXBlICk7XG5cbk9iamVjdC5hc3NpZ24oIFNwbGluZS5wcm90b3R5cGUsIHtcblxuXHRpbml0RnJvbUFycmF5OiBmdW5jdGlvbiAoIC8qIGEgKi8gKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuU3BsaW5lOiAuaW5pdEZyb21BcnJheSgpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdH0sXG5cdGdldENvbnRyb2xQb2ludHNBcnJheTogZnVuY3Rpb24gKCAvKiBvcHRpb25hbFRhcmdldCAqLyApIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5TcGxpbmU6IC5nZXRDb250cm9sUG9pbnRzQXJyYXkoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9LFxuXHRyZXBhcmFtZXRyaXplQnlBcmNMZW5ndGg6IGZ1bmN0aW9uICggLyogc2FtcGxpbmdDb2VmICovICkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlNwbGluZTogLnJlcGFyYW1ldHJpemVCeUFyY0xlbmd0aCgpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdH1cblxufSApO1xuXG5HcmlkSGVscGVyLnByb3RvdHlwZS5zZXRDb2xvcnMgPSBmdW5jdGlvbiAoKSB7XG5cblx0Y29uc29sZS5lcnJvciggJ1RIUkVFLkdyaWRIZWxwZXI6IHNldENvbG9ycygpIGhhcyBiZWVuIGRlcHJlY2F0ZWQsIHBhc3MgdGhlbSBpbiB0aGUgY29uc3RydWN0b3IgaW5zdGVhZC4nICk7XG5cbn07XG5cblNrZWxldG9uSGVscGVyLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAoKSB7XG5cblx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlNrZWxldG9uSGVscGVyOiB1cGRhdGUoKSBubyBsb25nZXIgbmVlZHMgdG8gYmUgY2FsbGVkLicgKTtcblxufTtcblxuLy9cblxuT2JqZWN0LmFzc2lnbiggTG9hZGVyLnByb3RvdHlwZSwge1xuXG5cdGV4dHJhY3RVcmxCYXNlOiBmdW5jdGlvbiAoIHVybCApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxvYWRlcjogLmV4dHJhY3RVcmxCYXNlKCkgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIFRIUkVFLkxvYWRlclV0aWxzLmV4dHJhY3RVcmxCYXNlKCkgaW5zdGVhZC4nICk7XG5cdFx0cmV0dXJuIExvYWRlclV0aWxzLmV4dHJhY3RVcmxCYXNlKCB1cmwgKTtcblxuXHR9XG5cbn0gKTtcblxuLy9cblxuT2JqZWN0LmFzc2lnbiggQm94Mi5wcm90b3R5cGUsIHtcblxuXHRjZW50ZXI6IGZ1bmN0aW9uICggb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Cb3gyOiAuY2VudGVyKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0Q2VudGVyKCkuJyApO1xuXHRcdHJldHVybiB0aGlzLmdldENlbnRlciggb3B0aW9uYWxUYXJnZXQgKTtcblxuXHR9LFxuXHRlbXB0eTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQm94MjogLmVtcHR5KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaXNFbXB0eSgpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5pc0VtcHR5KCk7XG5cblx0fSxcblx0aXNJbnRlcnNlY3Rpb25Cb3g6IGZ1bmN0aW9uICggYm94ICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQm94MjogLmlzSW50ZXJzZWN0aW9uQm94KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaW50ZXJzZWN0c0JveCgpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5pbnRlcnNlY3RzQm94KCBib3ggKTtcblxuXHR9LFxuXHRzaXplOiBmdW5jdGlvbiAoIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQm94MjogLnNpemUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRTaXplKCkuJyApO1xuXHRcdHJldHVybiB0aGlzLmdldFNpemUoIG9wdGlvbmFsVGFyZ2V0ICk7XG5cblx0fVxufSApO1xuXG5PYmplY3QuYXNzaWduKCBCb3gzLnByb3RvdHlwZSwge1xuXG5cdGNlbnRlcjogZnVuY3Rpb24gKCBvcHRpb25hbFRhcmdldCApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJveDM6IC5jZW50ZXIoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRDZW50ZXIoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0Q2VudGVyKCBvcHRpb25hbFRhcmdldCApO1xuXG5cdH0sXG5cdGVtcHR5OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Cb3gzOiAuZW1wdHkoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pc0VtcHR5KCkuJyApO1xuXHRcdHJldHVybiB0aGlzLmlzRW1wdHkoKTtcblxuXHR9LFxuXHRpc0ludGVyc2VjdGlvbkJveDogZnVuY3Rpb24gKCBib3ggKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Cb3gzOiAuaXNJbnRlcnNlY3Rpb25Cb3goKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pbnRlcnNlY3RzQm94KCkuJyApO1xuXHRcdHJldHVybiB0aGlzLmludGVyc2VjdHNCb3goIGJveCApO1xuXG5cdH0sXG5cdGlzSW50ZXJzZWN0aW9uU3BoZXJlOiBmdW5jdGlvbiAoIHNwaGVyZSApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJveDM6IC5pc0ludGVyc2VjdGlvblNwaGVyZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmludGVyc2VjdHNTcGhlcmUoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuaW50ZXJzZWN0c1NwaGVyZSggc3BoZXJlICk7XG5cblx0fSxcblx0c2l6ZTogZnVuY3Rpb24gKCBvcHRpb25hbFRhcmdldCApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJveDM6IC5zaXplKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0U2l6ZSgpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5nZXRTaXplKCBvcHRpb25hbFRhcmdldCApO1xuXG5cdH1cbn0gKTtcblxuTGluZTMucHJvdG90eXBlLmNlbnRlciA9IGZ1bmN0aW9uICggb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGluZTM6IC5jZW50ZXIoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRDZW50ZXIoKS4nICk7XG5cdHJldHVybiB0aGlzLmdldENlbnRlciggb3B0aW9uYWxUYXJnZXQgKTtcblxufTtcblxuT2JqZWN0LmFzc2lnbiggX01hdGgsIHtcblxuXHRyYW5kb20xNjogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0aDogLnJhbmRvbTE2KCkgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIE1hdGgucmFuZG9tKCkgaW5zdGVhZC4nICk7XG5cdFx0cmV0dXJuIE1hdGgucmFuZG9tKCk7XG5cblx0fSxcblxuXHRuZWFyZXN0UG93ZXJPZlR3bzogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdGg6IC5uZWFyZXN0UG93ZXJPZlR3bygpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmZsb29yUG93ZXJPZlR3bygpLicgKTtcblx0XHRyZXR1cm4gX01hdGguZmxvb3JQb3dlck9mVHdvKCB2YWx1ZSApO1xuXG5cdH0sXG5cblx0bmV4dFBvd2VyT2ZUd286IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5NYXRoOiAubmV4dFBvd2VyT2ZUd28oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5jZWlsUG93ZXJPZlR3bygpLicgKTtcblx0XHRyZXR1cm4gX01hdGguY2VpbFBvd2VyT2ZUd28oIHZhbHVlICk7XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5hc3NpZ24oIE1hdHJpeDMucHJvdG90eXBlLCB7XG5cblx0ZmxhdHRlblRvQXJyYXlPZmZzZXQ6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCApIHtcblxuXHRcdGNvbnNvbGUud2FybiggXCJUSFJFRS5NYXRyaXgzOiAuZmxhdHRlblRvQXJyYXlPZmZzZXQoKSBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgLnRvQXJyYXkoKSBpbnN0ZWFkLlwiICk7XG5cdFx0cmV0dXJuIHRoaXMudG9BcnJheSggYXJyYXksIG9mZnNldCApO1xuXG5cdH0sXG5cdG11bHRpcGx5VmVjdG9yMzogZnVuY3Rpb24gKCB2ZWN0b3IgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5NYXRyaXgzOiAubXVsdGlwbHlWZWN0b3IzKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIHZlY3Rvci5hcHBseU1hdHJpeDMoIG1hdHJpeCApIGluc3RlYWQuJyApO1xuXHRcdHJldHVybiB2ZWN0b3IuYXBwbHlNYXRyaXgzKCB0aGlzICk7XG5cblx0fSxcblx0bXVsdGlwbHlWZWN0b3IzQXJyYXk6IGZ1bmN0aW9uICggLyogYSAqLyApIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5NYXRyaXgzOiAubXVsdGlwbHlWZWN0b3IzQXJyYXkoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9LFxuXHRhcHBseVRvQnVmZmVyOiBmdW5jdGlvbiAoIGJ1ZmZlciAvKiwgb2Zmc2V0LCBsZW5ndGggKi8gKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5NYXRyaXgzOiAuYXBwbHlUb0J1ZmZlcigpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBtYXRyaXguYXBwbHlUb0J1ZmZlckF0dHJpYnV0ZSggYXR0cmlidXRlICkgaW5zdGVhZC4nICk7XG5cdFx0cmV0dXJuIHRoaXMuYXBwbHlUb0J1ZmZlckF0dHJpYnV0ZSggYnVmZmVyICk7XG5cblx0fSxcblx0YXBwbHlUb1ZlY3RvcjNBcnJheTogZnVuY3Rpb24gKCAvKiBhcnJheSwgb2Zmc2V0LCBsZW5ndGggKi8gKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuTWF0cml4MzogLmFwcGx5VG9WZWN0b3IzQXJyYXkoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmFzc2lnbiggTWF0cml4NC5wcm90b3R5cGUsIHtcblxuXHRleHRyYWN0UG9zaXRpb246IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDQ6IC5leHRyYWN0UG9zaXRpb24oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5jb3B5UG9zaXRpb24oKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuY29weVBvc2l0aW9uKCBtICk7XG5cblx0fSxcblx0ZmxhdHRlblRvQXJyYXlPZmZzZXQ6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCApIHtcblxuXHRcdGNvbnNvbGUud2FybiggXCJUSFJFRS5NYXRyaXg0OiAuZmxhdHRlblRvQXJyYXlPZmZzZXQoKSBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgLnRvQXJyYXkoKSBpbnN0ZWFkLlwiICk7XG5cdFx0cmV0dXJuIHRoaXMudG9BcnJheSggYXJyYXksIG9mZnNldCApO1xuXG5cdH0sXG5cdGdldFBvc2l0aW9uOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjE7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gZ2V0UG9zaXRpb24oKSB7XG5cblx0XHRcdGlmICggdjEgPT09IHVuZGVmaW5lZCApIHYxID0gbmV3IFZlY3RvcjMoKTtcblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDQ6IC5nZXRQb3NpdGlvbigpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBWZWN0b3IzLnNldEZyb21NYXRyaXhQb3NpdGlvbiggbWF0cml4ICkgaW5zdGVhZC4nICk7XG5cdFx0XHRyZXR1cm4gdjEuc2V0RnJvbU1hdHJpeENvbHVtbiggdGhpcywgMyApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cdHNldFJvdGF0aW9uRnJvbVF1YXRlcm5pb246IGZ1bmN0aW9uICggcSApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDQ6IC5zZXRSb3RhdGlvbkZyb21RdWF0ZXJuaW9uKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAubWFrZVJvdGF0aW9uRnJvbVF1YXRlcm5pb24oKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMubWFrZVJvdGF0aW9uRnJvbVF1YXRlcm5pb24oIHEgKTtcblxuXHR9LFxuXHRtdWx0aXBseVRvQXJyYXk6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDQ6IC5tdWx0aXBseVRvQXJyYXkoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9LFxuXHRtdWx0aXBseVZlY3RvcjM6IGZ1bmN0aW9uICggdmVjdG9yICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0cml4NDogLm11bHRpcGx5VmVjdG9yMygpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSB2ZWN0b3IuYXBwbHlNYXRyaXg0KCBtYXRyaXggKSBpbnN0ZWFkLicgKTtcblx0XHRyZXR1cm4gdmVjdG9yLmFwcGx5TWF0cml4NCggdGhpcyApO1xuXG5cdH0sXG5cdG11bHRpcGx5VmVjdG9yNDogZnVuY3Rpb24gKCB2ZWN0b3IgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5NYXRyaXg0OiAubXVsdGlwbHlWZWN0b3I0KCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIHZlY3Rvci5hcHBseU1hdHJpeDQoIG1hdHJpeCApIGluc3RlYWQuJyApO1xuXHRcdHJldHVybiB2ZWN0b3IuYXBwbHlNYXRyaXg0KCB0aGlzICk7XG5cblx0fSxcblx0bXVsdGlwbHlWZWN0b3IzQXJyYXk6IGZ1bmN0aW9uICggLyogYSAqLyApIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5NYXRyaXg0OiAubXVsdGlwbHlWZWN0b3IzQXJyYXkoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9LFxuXHRyb3RhdGVBeGlzOiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5NYXRyaXg0OiAucm90YXRlQXhpcygpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBWZWN0b3IzLnRyYW5zZm9ybURpcmVjdGlvbiggbWF0cml4ICkgaW5zdGVhZC4nICk7XG5cdFx0di50cmFuc2Zvcm1EaXJlY3Rpb24oIHRoaXMgKTtcblxuXHR9LFxuXHRjcm9zc1ZlY3RvcjogZnVuY3Rpb24gKCB2ZWN0b3IgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5NYXRyaXg0OiAuY3Jvc3NWZWN0b3IoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgdmVjdG9yLmFwcGx5TWF0cml4NCggbWF0cml4ICkgaW5zdGVhZC4nICk7XG5cdFx0cmV0dXJuIHZlY3Rvci5hcHBseU1hdHJpeDQoIHRoaXMgKTtcblxuXHR9LFxuXHR0cmFuc2xhdGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5NYXRyaXg0OiAudHJhbnNsYXRlKCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fSxcblx0cm90YXRlWDogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLk1hdHJpeDQ6IC5yb3RhdGVYKCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fSxcblx0cm90YXRlWTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLk1hdHJpeDQ6IC5yb3RhdGVZKCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fSxcblx0cm90YXRlWjogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLk1hdHJpeDQ6IC5yb3RhdGVaKCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fSxcblx0cm90YXRlQnlBeGlzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuTWF0cml4NDogLnJvdGF0ZUJ5QXhpcygpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdH0sXG5cdGFwcGx5VG9CdWZmZXI6IGZ1bmN0aW9uICggYnVmZmVyIC8qLCBvZmZzZXQsIGxlbmd0aCAqLyApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDQ6IC5hcHBseVRvQnVmZmVyKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG1hdHJpeC5hcHBseVRvQnVmZmVyQXR0cmlidXRlKCBhdHRyaWJ1dGUgKSBpbnN0ZWFkLicgKTtcblx0XHRyZXR1cm4gdGhpcy5hcHBseVRvQnVmZmVyQXR0cmlidXRlKCBidWZmZXIgKTtcblxuXHR9LFxuXHRhcHBseVRvVmVjdG9yM0FycmF5OiBmdW5jdGlvbiAoIC8qIGFycmF5LCBvZmZzZXQsIGxlbmd0aCAqLyApIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5NYXRyaXg0OiAuYXBwbHlUb1ZlY3RvcjNBcnJheSgpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdH0sXG5cdG1ha2VGcnVzdHVtOiBmdW5jdGlvbiAoIGxlZnQsIHJpZ2h0LCBib3R0b20sIHRvcCwgbmVhciwgZmFyICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0cml4NDogLm1ha2VGcnVzdHVtKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIC5tYWtlUGVyc3BlY3RpdmUoIGxlZnQsIHJpZ2h0LCB0b3AsIGJvdHRvbSwgbmVhciwgZmFyICkgaW5zdGVhZC4nICk7XG5cdFx0cmV0dXJuIHRoaXMubWFrZVBlcnNwZWN0aXZlKCBsZWZ0LCByaWdodCwgdG9wLCBib3R0b20sIG5lYXIsIGZhciApO1xuXG5cdH1cblxufSApO1xuXG5QbGFuZS5wcm90b3R5cGUuaXNJbnRlcnNlY3Rpb25MaW5lID0gZnVuY3Rpb24gKCBsaW5lICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLlBsYW5lOiAuaXNJbnRlcnNlY3Rpb25MaW5lKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaW50ZXJzZWN0c0xpbmUoKS4nICk7XG5cdHJldHVybiB0aGlzLmludGVyc2VjdHNMaW5lKCBsaW5lICk7XG5cbn07XG5cblF1YXRlcm5pb24ucHJvdG90eXBlLm11bHRpcGx5VmVjdG9yMyA9IGZ1bmN0aW9uICggdmVjdG9yICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLlF1YXRlcm5pb246IC5tdWx0aXBseVZlY3RvcjMoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgaXMgbm93IHZlY3Rvci5hcHBseVF1YXRlcm5pb24oIHF1YXRlcm5pb24gKSBpbnN0ZWFkLicgKTtcblx0cmV0dXJuIHZlY3Rvci5hcHBseVF1YXRlcm5pb24oIHRoaXMgKTtcblxufTtcblxuT2JqZWN0LmFzc2lnbiggUmF5LnByb3RvdHlwZSwge1xuXG5cdGlzSW50ZXJzZWN0aW9uQm94OiBmdW5jdGlvbiAoIGJveCApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlJheTogLmlzSW50ZXJzZWN0aW9uQm94KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaW50ZXJzZWN0c0JveCgpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5pbnRlcnNlY3RzQm94KCBib3ggKTtcblxuXHR9LFxuXHRpc0ludGVyc2VjdGlvblBsYW5lOiBmdW5jdGlvbiAoIHBsYW5lICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuUmF5OiAuaXNJbnRlcnNlY3Rpb25QbGFuZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmludGVyc2VjdHNQbGFuZSgpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5pbnRlcnNlY3RzUGxhbmUoIHBsYW5lICk7XG5cblx0fSxcblx0aXNJbnRlcnNlY3Rpb25TcGhlcmU6IGZ1bmN0aW9uICggc3BoZXJlICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuUmF5OiAuaXNJbnRlcnNlY3Rpb25TcGhlcmUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pbnRlcnNlY3RzU3BoZXJlKCkuJyApO1xuXHRcdHJldHVybiB0aGlzLmludGVyc2VjdHNTcGhlcmUoIHNwaGVyZSApO1xuXG5cdH1cblxufSApO1xuXG5PYmplY3QuYXNzaWduKCBUcmlhbmdsZS5wcm90b3R5cGUsIHtcblxuXHRhcmVhOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5UcmlhbmdsZTogLmFyZWEoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRBcmVhKCkuJyApO1xuXHRcdHJldHVybiB0aGlzLmdldEFyZWEoKTtcblxuXHR9LFxuXHRiYXJ5Y29vcmRGcm9tUG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQsIHRhcmdldCApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlRyaWFuZ2xlOiAuYmFyeWNvb3JkRnJvbVBvaW50KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0QmFyeWNvb3JkKCkuJyApO1xuXHRcdHJldHVybiB0aGlzLmdldEJhcnljb29yZCggcG9pbnQsIHRhcmdldCApO1xuXG5cdH0sXG5cdG1pZHBvaW50OiBmdW5jdGlvbiAoIHRhcmdldCApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlRyaWFuZ2xlOiAubWlkcG9pbnQoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRNaWRwb2ludCgpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5nZXRNaWRwb2ludCggdGFyZ2V0ICk7XG5cblx0fSxcblx0bm9ybWFsOiBmdW5jdGlvbiAoIHRhcmdldCApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlRyaWFuZ2xlOiAubm9ybWFsKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0Tm9ybWFsKCkuJyApO1xuXHRcdHJldHVybiB0aGlzLmdldE5vcm1hbCggdGFyZ2V0ICk7XG5cblx0fSxcblx0cGxhbmU6IGZ1bmN0aW9uICggdGFyZ2V0ICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVHJpYW5nbGU6IC5wbGFuZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldFBsYW5lKCkuJyApO1xuXHRcdHJldHVybiB0aGlzLmdldFBsYW5lKCB0YXJnZXQgKTtcblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmFzc2lnbiggVHJpYW5nbGUsIHtcblxuXHRiYXJ5Y29vcmRGcm9tUG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQsIGEsIGIsIGMsIHRhcmdldCApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlRyaWFuZ2xlOiAuYmFyeWNvb3JkRnJvbVBvaW50KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0QmFyeWNvb3JkKCkuJyApO1xuXHRcdHJldHVybiBUcmlhbmdsZS5nZXRCYXJ5Y29vcmQoIHBvaW50LCBhLCBiLCBjLCB0YXJnZXQgKTtcblxuXHR9LFxuXHRub3JtYWw6IGZ1bmN0aW9uICggYSwgYiwgYywgdGFyZ2V0ICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVHJpYW5nbGU6IC5ub3JtYWwoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXROb3JtYWwoKS4nICk7XG5cdFx0cmV0dXJuIFRyaWFuZ2xlLmdldE5vcm1hbCggYSwgYiwgYywgdGFyZ2V0ICk7XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5hc3NpZ24oIFNoYXBlLnByb3RvdHlwZSwge1xuXG5cdGV4dHJhY3RBbGxQb2ludHM6IGZ1bmN0aW9uICggZGl2aXNpb25zICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuU2hhcGU6IC5leHRyYWN0QWxsUG9pbnRzKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIC5leHRyYWN0UG9pbnRzKCkgaW5zdGVhZC4nICk7XG5cdFx0cmV0dXJuIHRoaXMuZXh0cmFjdFBvaW50cyggZGl2aXNpb25zICk7XG5cblx0fSxcblx0ZXh0cnVkZTogZnVuY3Rpb24gKCBvcHRpb25zICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuU2hhcGU6IC5leHRydWRlKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIEV4dHJ1ZGVHZW9tZXRyeSgpIGluc3RlYWQuJyApO1xuXHRcdHJldHVybiBuZXcgRXh0cnVkZUdlb21ldHJ5KCB0aGlzLCBvcHRpb25zICk7XG5cblx0fSxcblx0bWFrZUdlb21ldHJ5OiBmdW5jdGlvbiAoIG9wdGlvbnMgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5TaGFwZTogLm1ha2VHZW9tZXRyeSgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBTaGFwZUdlb21ldHJ5KCkgaW5zdGVhZC4nICk7XG5cdFx0cmV0dXJuIG5ldyBTaGFwZUdlb21ldHJ5KCB0aGlzLCBvcHRpb25zICk7XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5hc3NpZ24oIFZlY3RvcjIucHJvdG90eXBlLCB7XG5cblx0ZnJvbUF0dHJpYnV0ZTogZnVuY3Rpb24gKCBhdHRyaWJ1dGUsIGluZGV4LCBvZmZzZXQgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IyOiAuZnJvbUF0dHJpYnV0ZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmZyb21CdWZmZXJBdHRyaWJ1dGUoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggYXR0cmlidXRlLCBpbmRleCwgb2Zmc2V0ICk7XG5cblx0fSxcblx0ZGlzdGFuY2VUb01hbmhhdHRhbjogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yMjogLmRpc3RhbmNlVG9NYW5oYXR0YW4oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5tYW5oYXR0YW5EaXN0YW5jZVRvKCkuJyApO1xuXHRcdHJldHVybiB0aGlzLm1hbmhhdHRhbkRpc3RhbmNlVG8oIHYgKTtcblxuXHR9LFxuXHRsZW5ndGhNYW5oYXR0YW46IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjI6IC5sZW5ndGhNYW5oYXR0YW4oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5tYW5oYXR0YW5MZW5ndGgoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMubWFuaGF0dGFuTGVuZ3RoKCk7XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5hc3NpZ24oIFZlY3RvcjMucHJvdG90eXBlLCB7XG5cblx0c2V0RXVsZXJGcm9tUm90YXRpb25NYXRyaXg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5WZWN0b3IzOiAuc2V0RXVsZXJGcm9tUm90YXRpb25NYXRyaXgoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgRXVsZXIuc2V0RnJvbVJvdGF0aW9uTWF0cml4KCkgaW5zdGVhZC4nICk7XG5cblx0fSxcblx0c2V0RXVsZXJGcm9tUXVhdGVybmlvbjogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlZlY3RvcjM6IC5zZXRFdWxlckZyb21RdWF0ZXJuaW9uKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIEV1bGVyLnNldEZyb21RdWF0ZXJuaW9uKCkgaW5zdGVhZC4nICk7XG5cblx0fSxcblx0Z2V0UG9zaXRpb25Gcm9tTWF0cml4OiBmdW5jdGlvbiAoIG0gKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IzOiAuZ2V0UG9zaXRpb25Gcm9tTWF0cml4KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCkuJyApO1xuXHRcdHJldHVybiB0aGlzLnNldEZyb21NYXRyaXhQb3NpdGlvbiggbSApO1xuXG5cdH0sXG5cdGdldFNjYWxlRnJvbU1hdHJpeDogZnVuY3Rpb24gKCBtICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yMzogLmdldFNjYWxlRnJvbU1hdHJpeCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLnNldEZyb21NYXRyaXhTY2FsZSgpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5zZXRGcm9tTWF0cml4U2NhbGUoIG0gKTtcblxuXHR9LFxuXHRnZXRDb2x1bW5Gcm9tTWF0cml4OiBmdW5jdGlvbiAoIGluZGV4LCBtYXRyaXggKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IzOiAuZ2V0Q29sdW1uRnJvbU1hdHJpeCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLnNldEZyb21NYXRyaXhDb2x1bW4oKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuc2V0RnJvbU1hdHJpeENvbHVtbiggbWF0cml4LCBpbmRleCApO1xuXG5cdH0sXG5cdGFwcGx5UHJvamVjdGlvbjogZnVuY3Rpb24gKCBtICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yMzogLmFwcGx5UHJvamVjdGlvbigpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSAuYXBwbHlNYXRyaXg0KCBtICkgaW5zdGVhZC4nICk7XG5cdFx0cmV0dXJuIHRoaXMuYXBwbHlNYXRyaXg0KCBtICk7XG5cblx0fSxcblx0ZnJvbUF0dHJpYnV0ZTogZnVuY3Rpb24gKCBhdHRyaWJ1dGUsIGluZGV4LCBvZmZzZXQgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IzOiAuZnJvbUF0dHJpYnV0ZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmZyb21CdWZmZXJBdHRyaWJ1dGUoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggYXR0cmlidXRlLCBpbmRleCwgb2Zmc2V0ICk7XG5cblx0fSxcblx0ZGlzdGFuY2VUb01hbmhhdHRhbjogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yMzogLmRpc3RhbmNlVG9NYW5oYXR0YW4oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5tYW5oYXR0YW5EaXN0YW5jZVRvKCkuJyApO1xuXHRcdHJldHVybiB0aGlzLm1hbmhhdHRhbkRpc3RhbmNlVG8oIHYgKTtcblxuXHR9LFxuXHRsZW5ndGhNYW5oYXR0YW46IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjM6IC5sZW5ndGhNYW5oYXR0YW4oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5tYW5oYXR0YW5MZW5ndGgoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMubWFuaGF0dGFuTGVuZ3RoKCk7XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5hc3NpZ24oIFZlY3RvcjQucHJvdG90eXBlLCB7XG5cblx0ZnJvbUF0dHJpYnV0ZTogZnVuY3Rpb24gKCBhdHRyaWJ1dGUsIGluZGV4LCBvZmZzZXQgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3I0OiAuZnJvbUF0dHJpYnV0ZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmZyb21CdWZmZXJBdHRyaWJ1dGUoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggYXR0cmlidXRlLCBpbmRleCwgb2Zmc2V0ICk7XG5cblx0fSxcblx0bGVuZ3RoTWFuaGF0dGFuOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3I0OiAubGVuZ3RoTWFuaGF0dGFuKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAubWFuaGF0dGFuTGVuZ3RoKCkuJyApO1xuXHRcdHJldHVybiB0aGlzLm1hbmhhdHRhbkxlbmd0aCgpO1xuXG5cdH1cblxufSApO1xuXG4vL1xuXG5PYmplY3QuYXNzaWduKCBHZW9tZXRyeS5wcm90b3R5cGUsIHtcblxuXHRjb21wdXRlVGFuZ2VudHM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5HZW9tZXRyeTogLmNvbXB1dGVUYW5nZW50cygpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdH0sXG5cdGNvbXB1dGVMaW5lRGlzdGFuY2VzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuR2VvbWV0cnk6IC5jb21wdXRlTGluZURpc3RhbmNlcygpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBUSFJFRS5MaW5lLmNvbXB1dGVMaW5lRGlzdGFuY2VzKCkgaW5zdGVhZC4nICk7XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5hc3NpZ24oIE9iamVjdDNELnByb3RvdHlwZSwge1xuXG5cdGdldENoaWxkQnlOYW1lOiBmdW5jdGlvbiAoIG5hbWUgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3QzRDogLmdldENoaWxkQnlOYW1lKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0T2JqZWN0QnlOYW1lKCkuJyApO1xuXHRcdHJldHVybiB0aGlzLmdldE9iamVjdEJ5TmFtZSggbmFtZSApO1xuXG5cdH0sXG5cdHJlbmRlckRlcHRoOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3QzRDogLnJlbmRlckRlcHRoIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSAucmVuZGVyT3JkZXIsIGluc3RlYWQuJyApO1xuXG5cdH0sXG5cdHRyYW5zbGF0ZTogZnVuY3Rpb24gKCBkaXN0YW5jZSwgYXhpcyApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdDNEOiAudHJhbnNsYXRlKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIC50cmFuc2xhdGVPbkF4aXMoIGF4aXMsIGRpc3RhbmNlICkgaW5zdGVhZC4nICk7XG5cdFx0cmV0dXJuIHRoaXMudHJhbnNsYXRlT25BeGlzKCBheGlzLCBkaXN0YW5jZSApO1xuXG5cdH0sXG5cdGdldFdvcmxkUm90YXRpb246IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5PYmplY3QzRDogLmdldFdvcmxkUm90YXRpb24oKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuT2JqZWN0M0QuZ2V0V29ybGRRdWF0ZXJuaW9uKCB0YXJnZXQgKSBpbnN0ZWFkLicgKTtcblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIE9iamVjdDNELnByb3RvdHlwZSwge1xuXG5cdGV1bGVyT3JkZXI6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0M0Q6IC5ldWxlck9yZGVyIGlzIG5vdyAucm90YXRpb24ub3JkZXIuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMucm90YXRpb24ub3JkZXI7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0M0Q6IC5ldWxlck9yZGVyIGlzIG5vdyAucm90YXRpb24ub3JkZXIuJyApO1xuXHRcdFx0dGhpcy5yb3RhdGlvbi5vcmRlciA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9LFxuXHR1c2VRdWF0ZXJuaW9uOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdDNEOiAudXNlUXVhdGVybmlvbiBoYXMgYmVlbiByZW1vdmVkLiBUaGUgbGlicmFyeSBub3cgdXNlcyBxdWF0ZXJuaW9ucyBieSBkZWZhdWx0LicgKTtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdDNEOiAudXNlUXVhdGVybmlvbiBoYXMgYmVlbiByZW1vdmVkLiBUaGUgbGlicmFyeSBub3cgdXNlcyBxdWF0ZXJuaW9ucyBieSBkZWZhdWx0LicgKTtcblxuXHRcdH1cblx0fVxuXG59ICk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBMT0QucHJvdG90eXBlLCB7XG5cblx0b2JqZWN0czoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5MT0Q6IC5vYmplY3RzIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmxldmVscy4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5sZXZlbHM7XG5cblx0XHR9XG5cdH1cblxufSApO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoIFNrZWxldG9uLnByb3RvdHlwZSwgJ3VzZVZlcnRleFRleHR1cmUnLCB7XG5cblx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Ta2VsZXRvbjogdXNlVmVydGV4VGV4dHVyZSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9LFxuXHRzZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlNrZWxldG9uOiB1c2VWZXJ0ZXhUZXh0dXJlIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdH1cblxufSApO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoIEN1cnZlLnByb3RvdHlwZSwgJ19fYXJjTGVuZ3RoRGl2aXNpb25zJywge1xuXG5cdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQ3VydmU6IC5fX2FyY0xlbmd0aERpdmlzaW9ucyBpcyBub3cgLmFyY0xlbmd0aERpdmlzaW9ucy4nICk7XG5cdFx0cmV0dXJuIHRoaXMuYXJjTGVuZ3RoRGl2aXNpb25zO1xuXG5cdH0sXG5cdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkN1cnZlOiAuX19hcmNMZW5ndGhEaXZpc2lvbnMgaXMgbm93IC5hcmNMZW5ndGhEaXZpc2lvbnMuJyApO1xuXHRcdHRoaXMuYXJjTGVuZ3RoRGl2aXNpb25zID0gdmFsdWU7XG5cblx0fVxuXG59ICk7XG5cbi8vXG5cblBlcnNwZWN0aXZlQ2FtZXJhLnByb3RvdHlwZS5zZXRMZW5zID0gZnVuY3Rpb24gKCBmb2NhbExlbmd0aCwgZmlsbUdhdWdlICkge1xuXG5cdGNvbnNvbGUud2FybiggXCJUSFJFRS5QZXJzcGVjdGl2ZUNhbWVyYS5zZXRMZW5zIGlzIGRlcHJlY2F0ZWQuIFwiICtcblx0XHRcdFwiVXNlIC5zZXRGb2NhbExlbmd0aCBhbmQgLmZpbG1HYXVnZSBmb3IgYSBwaG90b2dyYXBoaWMgc2V0dXAuXCIgKTtcblxuXHRpZiAoIGZpbG1HYXVnZSAhPT0gdW5kZWZpbmVkICkgdGhpcy5maWxtR2F1Z2UgPSBmaWxtR2F1Z2U7XG5cdHRoaXMuc2V0Rm9jYWxMZW5ndGgoIGZvY2FsTGVuZ3RoICk7XG5cbn07XG5cbi8vXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBMaWdodC5wcm90b3R5cGUsIHtcblx0b25seVNoYWRvdzoge1xuXHRcdHNldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5MaWdodDogLm9ubHlTaGFkb3cgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0XHR9XG5cdH0sXG5cdHNoYWRvd0NhbWVyYUZvdjoge1xuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFGb3YgaXMgbm93IC5zaGFkb3cuY2FtZXJhLmZvdi4nICk7XG5cdFx0XHR0aGlzLnNoYWRvdy5jYW1lcmEuZm92ID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdHNoYWRvd0NhbWVyYUxlZnQ6IHtcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxpZ2h0OiAuc2hhZG93Q2FtZXJhTGVmdCBpcyBub3cgLnNoYWRvdy5jYW1lcmEubGVmdC4nICk7XG5cdFx0XHR0aGlzLnNoYWRvdy5jYW1lcmEubGVmdCA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9LFxuXHRzaGFkb3dDYW1lcmFSaWdodDoge1xuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFSaWdodCBpcyBub3cgLnNoYWRvdy5jYW1lcmEucmlnaHQuJyApO1xuXHRcdFx0dGhpcy5zaGFkb3cuY2FtZXJhLnJpZ2h0ID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdHNoYWRvd0NhbWVyYVRvcDoge1xuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFUb3AgaXMgbm93IC5zaGFkb3cuY2FtZXJhLnRvcC4nICk7XG5cdFx0XHR0aGlzLnNoYWRvdy5jYW1lcmEudG9wID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdHNoYWRvd0NhbWVyYUJvdHRvbToge1xuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFCb3R0b20gaXMgbm93IC5zaGFkb3cuY2FtZXJhLmJvdHRvbS4nICk7XG5cdFx0XHR0aGlzLnNoYWRvdy5jYW1lcmEuYm90dG9tID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdHNoYWRvd0NhbWVyYU5lYXI6IHtcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxpZ2h0OiAuc2hhZG93Q2FtZXJhTmVhciBpcyBub3cgLnNoYWRvdy5jYW1lcmEubmVhci4nICk7XG5cdFx0XHR0aGlzLnNoYWRvdy5jYW1lcmEubmVhciA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9LFxuXHRzaGFkb3dDYW1lcmFGYXI6IHtcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxpZ2h0OiAuc2hhZG93Q2FtZXJhRmFyIGlzIG5vdyAuc2hhZG93LmNhbWVyYS5mYXIuJyApO1xuXHRcdFx0dGhpcy5zaGFkb3cuY2FtZXJhLmZhciA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9LFxuXHRzaGFkb3dDYW1lcmFWaXNpYmxlOiB7XG5cdFx0c2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxpZ2h0OiAuc2hhZG93Q2FtZXJhVmlzaWJsZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLkNhbWVyYUhlbHBlciggbGlnaHQuc2hhZG93LmNhbWVyYSApIGluc3RlYWQuJyApO1xuXG5cdFx0fVxuXHR9LFxuXHRzaGFkb3dCaWFzOiB7XG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5MaWdodDogLnNoYWRvd0JpYXMgaXMgbm93IC5zaGFkb3cuYmlhcy4nICk7XG5cdFx0XHR0aGlzLnNoYWRvdy5iaWFzID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdHNoYWRvd0RhcmtuZXNzOiB7XG5cdFx0c2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxpZ2h0OiAuc2hhZG93RGFya25lc3MgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0XHR9XG5cdH0sXG5cdHNoYWRvd01hcFdpZHRoOiB7XG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5MaWdodDogLnNoYWRvd01hcFdpZHRoIGlzIG5vdyAuc2hhZG93Lm1hcFNpemUud2lkdGguJyApO1xuXHRcdFx0dGhpcy5zaGFkb3cubWFwU2l6ZS53aWR0aCA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9LFxuXHRzaGFkb3dNYXBIZWlnaHQ6IHtcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxpZ2h0OiAuc2hhZG93TWFwSGVpZ2h0IGlzIG5vdyAuc2hhZG93Lm1hcFNpemUuaGVpZ2h0LicgKTtcblx0XHRcdHRoaXMuc2hhZG93Lm1hcFNpemUuaGVpZ2h0ID0gdmFsdWU7XG5cblx0XHR9XG5cdH1cbn0gKTtcblxuLy9cblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUsIHtcblxuXHRsZW5ndGg6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQnVmZmVyQXR0cmlidXRlOiAubGVuZ3RoIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAuY291bnQgaW5zdGVhZC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5hcnJheS5sZW5ndGg7XG5cblx0XHR9XG5cdH0sXG5cdGNvcHlJbmRpY2VzQXJyYXk6IGZ1bmN0aW9uICggLyogaW5kaWNlcyAqLyApIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5CdWZmZXJBdHRyaWJ1dGU6IC5jb3B5SW5kaWNlc0FycmF5KCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5hc3NpZ24oIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSwge1xuXG5cdGFkZEluZGV4OiBmdW5jdGlvbiAoIGluZGV4ICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5hZGRJbmRleCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLnNldEluZGV4KCkuJyApO1xuXHRcdHRoaXMuc2V0SW5kZXgoIGluZGV4ICk7XG5cblx0fSxcblx0YWRkRHJhd0NhbGw6IGZ1bmN0aW9uICggc3RhcnQsIGNvdW50LCBpbmRleE9mZnNldCApIHtcblxuXHRcdGlmICggaW5kZXhPZmZzZXQgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5hZGREcmF3Q2FsbCgpIG5vIGxvbmdlciBzdXBwb3J0cyBpbmRleE9mZnNldC4nICk7XG5cblx0XHR9XG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5hZGREcmF3Q2FsbCgpIGlzIG5vdyAuYWRkR3JvdXAoKS4nICk7XG5cdFx0dGhpcy5hZGRHcm91cCggc3RhcnQsIGNvdW50ICk7XG5cblx0fSxcblx0Y2xlYXJEcmF3Q2FsbHM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5OiAuY2xlYXJEcmF3Q2FsbHMoKSBpcyBub3cgLmNsZWFyR3JvdXBzKCkuJyApO1xuXHRcdHRoaXMuY2xlYXJHcm91cHMoKTtcblxuXHR9LFxuXHRjb21wdXRlVGFuZ2VudHM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5OiAuY29tcHV0ZVRhbmdlbnRzKCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fSxcblx0Y29tcHV0ZU9mZnNldHM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5OiAuY29tcHV0ZU9mZnNldHMoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSwge1xuXG5cdGRyYXdjYWxsczoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5kcmF3Y2FsbHMgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ3JvdXBzLicgKTtcblx0XHRcdHJldHVybiB0aGlzLmdyb3VwcztcblxuXHRcdH1cblx0fSxcblx0b2Zmc2V0czoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJHZW9tZXRyeTogLm9mZnNldHMgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ3JvdXBzLicgKTtcblx0XHRcdHJldHVybiB0aGlzLmdyb3VwcztcblxuXHRcdH1cblx0fVxuXG59ICk7XG5cbi8vXG5cbk9iamVjdC5hc3NpZ24oIEV4dHJ1ZGVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUsIHtcblxuXHRnZXRBcnJheXM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5FeHRydWRlQnVmZmVyR2VvbWV0cnk6IC5nZXRBcnJheXMoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9LFxuXG5cdGFkZFNoYXBlTGlzdDogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLkV4dHJ1ZGVCdWZmZXJHZW9tZXRyeTogLmFkZFNoYXBlTGlzdCgpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdH0sXG5cblx0YWRkU2hhcGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5FeHRydWRlQnVmZmVyR2VvbWV0cnk6IC5hZGRTaGFwZSgpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdH1cblxufSApO1xuXG4vL1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyggVW5pZm9ybS5wcm90b3R5cGUsIHtcblxuXHRkeW5hbWljOiB7XG5cdFx0c2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlVuaWZvcm06IC5keW5hbWljIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBvYmplY3Qub25CZWZvcmVSZW5kZXIoKSBpbnN0ZWFkLicgKTtcblxuXHRcdH1cblx0fSxcblx0b25VcGRhdGU6IHtcblx0XHR2YWx1ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Vbmlmb3JtOiAub25VcGRhdGUoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2Ugb2JqZWN0Lm9uQmVmb3JlUmVuZGVyKCkgaW5zdGVhZC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH1cblx0fVxuXG59ICk7XG5cbi8vXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBNYXRlcmlhbC5wcm90b3R5cGUsIHtcblxuXHR3cmFwQXJvdW5kOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdGVyaWFsOiAud3JhcEFyb3VuZCBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdGVyaWFsOiAud3JhcEFyb3VuZCBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHRcdH1cblx0fSxcblx0d3JhcFJHQjoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5NYXRlcmlhbDogLndyYXBSR0IgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cdFx0XHRyZXR1cm4gbmV3IENvbG9yKCk7XG5cblx0XHR9XG5cdH0sXG5cblx0c2hhZGluZzoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuJyArIHRoaXMudHlwZSArICc6IC5zaGFkaW5nIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSB0aGUgYm9vbGVhbiAuZmxhdFNoYWRpbmcgaW5zdGVhZC4nICk7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuJyArIHRoaXMudHlwZSArICc6IC5zaGFkaW5nIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSB0aGUgYm9vbGVhbiAuZmxhdFNoYWRpbmcgaW5zdGVhZC4nICk7XG5cdFx0XHR0aGlzLmZsYXRTaGFkaW5nID0gKCB2YWx1ZSA9PT0gRmxhdFNoYWRpbmcgKTtcblxuXHRcdH1cblx0fVxuXG59ICk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBNZXNoUGhvbmdNYXRlcmlhbC5wcm90b3R5cGUsIHtcblxuXHRtZXRhbDoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5NZXNoUGhvbmdNYXRlcmlhbDogLm1ldGFsIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBUSFJFRS5NZXNoU3RhbmRhcmRNYXRlcmlhbCBpbnN0ZWFkLicgKTtcblx0XHRcdHJldHVybiBmYWxzZTtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1lc2hQaG9uZ01hdGVyaWFsOiAubWV0YWwgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFRIUkVFLk1lc2hTdGFuZGFyZE1hdGVyaWFsIGluc3RlYWQnICk7XG5cblx0XHR9XG5cdH1cblxufSApO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyggU2hhZGVyTWF0ZXJpYWwucHJvdG90eXBlLCB7XG5cblx0ZGVyaXZhdGl2ZXM6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuU2hhZGVyTWF0ZXJpYWw6IC5kZXJpdmF0aXZlcyBoYXMgYmVlbiBtb3ZlZCB0byAuZXh0ZW5zaW9ucy5kZXJpdmF0aXZlcy4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5leHRlbnNpb25zLmRlcml2YXRpdmVzO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLiBTaGFkZXJNYXRlcmlhbDogLmRlcml2YXRpdmVzIGhhcyBiZWVuIG1vdmVkIHRvIC5leHRlbnNpb25zLmRlcml2YXRpdmVzLicgKTtcblx0XHRcdHRoaXMuZXh0ZW5zaW9ucy5kZXJpdmF0aXZlcyA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9XG5cbn0gKTtcblxuLy9cblxuT2JqZWN0LmFzc2lnbiggV2ViR0xSZW5kZXJlci5wcm90b3R5cGUsIHtcblxuXHRnZXRDdXJyZW50UmVuZGVyVGFyZ2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuZ2V0Q3VycmVudFJlbmRlclRhcmdldCgpIGlzIG5vdyAuZ2V0UmVuZGVyVGFyZ2V0KCkuJyApO1xuXHRcdHJldHVybiB0aGlzLmdldFJlbmRlclRhcmdldCgpO1xuXG5cdH0sXG5cblx0Z2V0TWF4QW5pc290cm9weTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLmdldE1heEFuaXNvdHJvcHkoKSBpcyBub3cgLmNhcGFiaWxpdGllcy5nZXRNYXhBbmlzb3Ryb3B5KCkuJyApO1xuXHRcdHJldHVybiB0aGlzLmNhcGFiaWxpdGllcy5nZXRNYXhBbmlzb3Ryb3B5KCk7XG5cblx0fSxcblxuXHRnZXRQcmVjaXNpb246IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5nZXRQcmVjaXNpb24oKSBpcyBub3cgLmNhcGFiaWxpdGllcy5wcmVjaXNpb24uJyApO1xuXHRcdHJldHVybiB0aGlzLmNhcGFiaWxpdGllcy5wcmVjaXNpb247XG5cblx0fSxcblxuXHRyZXNldEdMU3RhdGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5yZXNldEdMU3RhdGUoKSBpcyBub3cgLnN0YXRlLnJlc2V0KCkuJyApO1xuXHRcdHJldHVybiB0aGlzLnN0YXRlLnJlc2V0KCk7XG5cblx0fSxcblxuXHRzdXBwb3J0c0Zsb2F0VGV4dHVyZXM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5zdXBwb3J0c0Zsb2F0VGV4dHVyZXMoKSBpcyBub3cgLmV4dGVuc2lvbnMuZ2V0KCBcXCdPRVNfdGV4dHVyZV9mbG9hdFxcJyApLicgKTtcblx0XHRyZXR1cm4gdGhpcy5leHRlbnNpb25zLmdldCggJ09FU190ZXh0dXJlX2Zsb2F0JyApO1xuXG5cdH0sXG5cdHN1cHBvcnRzSGFsZkZsb2F0VGV4dHVyZXM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5zdXBwb3J0c0hhbGZGbG9hdFRleHR1cmVzKCkgaXMgbm93IC5leHRlbnNpb25zLmdldCggXFwnT0VTX3RleHR1cmVfaGFsZl9mbG9hdFxcJyApLicgKTtcblx0XHRyZXR1cm4gdGhpcy5leHRlbnNpb25zLmdldCggJ09FU190ZXh0dXJlX2hhbGZfZmxvYXQnICk7XG5cblx0fSxcblx0c3VwcG9ydHNTdGFuZGFyZERlcml2YXRpdmVzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc3VwcG9ydHNTdGFuZGFyZERlcml2YXRpdmVzKCkgaXMgbm93IC5leHRlbnNpb25zLmdldCggXFwnT0VTX3N0YW5kYXJkX2Rlcml2YXRpdmVzXFwnICkuJyApO1xuXHRcdHJldHVybiB0aGlzLmV4dGVuc2lvbnMuZ2V0KCAnT0VTX3N0YW5kYXJkX2Rlcml2YXRpdmVzJyApO1xuXG5cdH0sXG5cdHN1cHBvcnRzQ29tcHJlc3NlZFRleHR1cmVTM1RDOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc3VwcG9ydHNDb21wcmVzc2VkVGV4dHVyZVMzVEMoKSBpcyBub3cgLmV4dGVuc2lvbnMuZ2V0KCBcXCdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0Y1xcJyApLicgKTtcblx0XHRyZXR1cm4gdGhpcy5leHRlbnNpb25zLmdldCggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjJyApO1xuXG5cdH0sXG5cdHN1cHBvcnRzQ29tcHJlc3NlZFRleHR1cmVQVlJUQzogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzQ29tcHJlc3NlZFRleHR1cmVQVlJUQygpIGlzIG5vdyAuZXh0ZW5zaW9ucy5nZXQoIFxcJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0Y1xcJyApLicgKTtcblx0XHRyZXR1cm4gdGhpcy5leHRlbnNpb25zLmdldCggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0YycgKTtcblxuXHR9LFxuXHRzdXBwb3J0c0JsZW5kTWluTWF4OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc3VwcG9ydHNCbGVuZE1pbk1heCgpIGlzIG5vdyAuZXh0ZW5zaW9ucy5nZXQoIFxcJ0VYVF9ibGVuZF9taW5tYXhcXCcgKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuZXh0ZW5zaW9ucy5nZXQoICdFWFRfYmxlbmRfbWlubWF4JyApO1xuXG5cdH0sXG5cdHN1cHBvcnRzVmVydGV4VGV4dHVyZXM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5zdXBwb3J0c1ZlcnRleFRleHR1cmVzKCkgaXMgbm93IC5jYXBhYmlsaXRpZXMudmVydGV4VGV4dHVyZXMuJyApO1xuXHRcdHJldHVybiB0aGlzLmNhcGFiaWxpdGllcy52ZXJ0ZXhUZXh0dXJlcztcblxuXHR9LFxuXHRzdXBwb3J0c0luc3RhbmNlZEFycmF5czogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzSW5zdGFuY2VkQXJyYXlzKCkgaXMgbm93IC5leHRlbnNpb25zLmdldCggXFwnQU5HTEVfaW5zdGFuY2VkX2FycmF5c1xcJyApLicgKTtcblx0XHRyZXR1cm4gdGhpcy5leHRlbnNpb25zLmdldCggJ0FOR0xFX2luc3RhbmNlZF9hcnJheXMnICk7XG5cblx0fSxcblx0ZW5hYmxlU2Npc3NvclRlc3Q6IGZ1bmN0aW9uICggYm9vbGVhbiApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5lbmFibGVTY2lzc29yVGVzdCgpIGlzIG5vdyAuc2V0U2Npc3NvclRlc3QoKS4nICk7XG5cdFx0dGhpcy5zZXRTY2lzc29yVGVzdCggYm9vbGVhbiApO1xuXG5cdH0sXG5cdGluaXRNYXRlcmlhbDogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLmluaXRNYXRlcmlhbCgpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdH0sXG5cdGFkZFByZVBsdWdpbjogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLmFkZFByZVBsdWdpbigpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdH0sXG5cdGFkZFBvc3RQbHVnaW46IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5hZGRQb3N0UGx1Z2luKCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fSxcblx0dXBkYXRlU2hhZG93TWFwOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAudXBkYXRlU2hhZG93TWFwKCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fSxcblx0c2V0RmFjZUN1bGxpbmc6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5zZXRGYWNlQ3VsbGluZygpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdH1cblxufSApO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyggV2ViR0xSZW5kZXJlci5wcm90b3R5cGUsIHtcblxuXHRzaGFkb3dNYXBFbmFibGVkOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLnNoYWRvd01hcC5lbmFibGVkO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5zaGFkb3dNYXBFbmFibGVkIGlzIG5vdyAuc2hhZG93TWFwLmVuYWJsZWQuJyApO1xuXHRcdFx0dGhpcy5zaGFkb3dNYXAuZW5hYmxlZCA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9LFxuXHRzaGFkb3dNYXBUeXBlOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLnNoYWRvd01hcC50eXBlO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5zaGFkb3dNYXBUeXBlIGlzIG5vdyAuc2hhZG93TWFwLnR5cGUuJyApO1xuXHRcdFx0dGhpcy5zaGFkb3dNYXAudHlwZSA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9LFxuXHRzaGFkb3dNYXBDdWxsRmFjZToge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwQ3VsbEZhY2UgaGFzIGJlZW4gcmVtb3ZlZC4gU2V0IE1hdGVyaWFsLnNoYWRvd1NpZGUgaW5zdGVhZC4nICk7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICggLyogdmFsdWUgKi8gKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5zaGFkb3dNYXBDdWxsRmFjZSBoYXMgYmVlbiByZW1vdmVkLiBTZXQgTWF0ZXJpYWwuc2hhZG93U2lkZSBpbnN0ZWFkLicgKTtcblxuXHRcdH1cblx0fVxufSApO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyggV2ViR0xTaGFkb3dNYXAucHJvdG90eXBlLCB7XG5cblx0Y3VsbEZhY2U6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcC5jdWxsRmFjZSBoYXMgYmVlbiByZW1vdmVkLiBTZXQgTWF0ZXJpYWwuc2hhZG93U2lkZSBpbnN0ZWFkLicgKTtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCAvKiBjdWxsRmFjZSAqLyApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcC5jdWxsRmFjZSBoYXMgYmVlbiByZW1vdmVkLiBTZXQgTWF0ZXJpYWwuc2hhZG93U2lkZSBpbnN0ZWFkLicgKTtcblxuXHRcdH1cblx0fSxcblx0cmVuZGVyUmV2ZXJzZVNpZGVkOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5zaGFkb3dNYXAucmVuZGVyUmV2ZXJzZVNpZGVkIGhhcyBiZWVuIHJlbW92ZWQuIFNldCBNYXRlcmlhbC5zaGFkb3dTaWRlIGluc3RlYWQuJyApO1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5zaGFkb3dNYXAucmVuZGVyUmV2ZXJzZVNpZGVkIGhhcyBiZWVuIHJlbW92ZWQuIFNldCBNYXRlcmlhbC5zaGFkb3dTaWRlIGluc3RlYWQuJyApO1xuXG5cdFx0fVxuXHR9LFxuXHRyZW5kZXJTaW5nbGVTaWRlZDoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwLnJlbmRlclNpbmdsZVNpZGVkIGhhcyBiZWVuIHJlbW92ZWQuIFNldCBNYXRlcmlhbC5zaGFkb3dTaWRlIGluc3RlYWQuJyApO1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5zaGFkb3dNYXAucmVuZGVyU2luZ2xlU2lkZWQgaGFzIGJlZW4gcmVtb3ZlZC4gU2V0IE1hdGVyaWFsLnNoYWRvd1NpZGUgaW5zdGVhZC4nICk7XG5cblx0XHR9XG5cdH1cblxufSApO1xuXG4vL1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyggV2ViR0xSZW5kZXJUYXJnZXQucHJvdG90eXBlLCB7XG5cblx0d3JhcFM6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC53cmFwUyBpcyBub3cgLnRleHR1cmUud3JhcFMuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMudGV4dHVyZS53cmFwUztcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLndyYXBTIGlzIG5vdyAudGV4dHVyZS53cmFwUy4nICk7XG5cdFx0XHR0aGlzLnRleHR1cmUud3JhcFMgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0d3JhcFQ6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC53cmFwVCBpcyBub3cgLnRleHR1cmUud3JhcFQuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMudGV4dHVyZS53cmFwVDtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLndyYXBUIGlzIG5vdyAudGV4dHVyZS53cmFwVC4nICk7XG5cdFx0XHR0aGlzLnRleHR1cmUud3JhcFQgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0bWFnRmlsdGVyOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAubWFnRmlsdGVyIGlzIG5vdyAudGV4dHVyZS5tYWdGaWx0ZXIuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMudGV4dHVyZS5tYWdGaWx0ZXI7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5tYWdGaWx0ZXIgaXMgbm93IC50ZXh0dXJlLm1hZ0ZpbHRlci4nICk7XG5cdFx0XHR0aGlzLnRleHR1cmUubWFnRmlsdGVyID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdG1pbkZpbHRlcjoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLm1pbkZpbHRlciBpcyBub3cgLnRleHR1cmUubWluRmlsdGVyLicgKTtcblx0XHRcdHJldHVybiB0aGlzLnRleHR1cmUubWluRmlsdGVyO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAubWluRmlsdGVyIGlzIG5vdyAudGV4dHVyZS5taW5GaWx0ZXIuJyApO1xuXHRcdFx0dGhpcy50ZXh0dXJlLm1pbkZpbHRlciA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9LFxuXHRhbmlzb3Ryb3B5OiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAuYW5pc290cm9weSBpcyBub3cgLnRleHR1cmUuYW5pc290cm9weS4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy50ZXh0dXJlLmFuaXNvdHJvcHk7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5hbmlzb3Ryb3B5IGlzIG5vdyAudGV4dHVyZS5hbmlzb3Ryb3B5LicgKTtcblx0XHRcdHRoaXMudGV4dHVyZS5hbmlzb3Ryb3B5ID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdG9mZnNldDoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLm9mZnNldCBpcyBub3cgLnRleHR1cmUub2Zmc2V0LicgKTtcblx0XHRcdHJldHVybiB0aGlzLnRleHR1cmUub2Zmc2V0O1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAub2Zmc2V0IGlzIG5vdyAudGV4dHVyZS5vZmZzZXQuJyApO1xuXHRcdFx0dGhpcy50ZXh0dXJlLm9mZnNldCA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9LFxuXHRyZXBlYXQ6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5yZXBlYXQgaXMgbm93IC50ZXh0dXJlLnJlcGVhdC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy50ZXh0dXJlLnJlcGVhdDtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLnJlcGVhdCBpcyBub3cgLnRleHR1cmUucmVwZWF0LicgKTtcblx0XHRcdHRoaXMudGV4dHVyZS5yZXBlYXQgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0Zm9ybWF0OiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAuZm9ybWF0IGlzIG5vdyAudGV4dHVyZS5mb3JtYXQuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMudGV4dHVyZS5mb3JtYXQ7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5mb3JtYXQgaXMgbm93IC50ZXh0dXJlLmZvcm1hdC4nICk7XG5cdFx0XHR0aGlzLnRleHR1cmUuZm9ybWF0ID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdHR5cGU6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC50eXBlIGlzIG5vdyAudGV4dHVyZS50eXBlLicgKTtcblx0XHRcdHJldHVybiB0aGlzLnRleHR1cmUudHlwZTtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLnR5cGUgaXMgbm93IC50ZXh0dXJlLnR5cGUuJyApO1xuXHRcdFx0dGhpcy50ZXh0dXJlLnR5cGUgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0Z2VuZXJhdGVNaXBtYXBzOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAuZ2VuZXJhdGVNaXBtYXBzIGlzIG5vdyAudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHM7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5nZW5lcmF0ZU1pcG1hcHMgaXMgbm93IC50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcy4nICk7XG5cdFx0XHR0aGlzLnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzID0gdmFsdWU7XG5cblx0XHR9XG5cdH1cblxufSApO1xuXG4vL1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyggV2ViVlJNYW5hZ2VyLnByb3RvdHlwZSwge1xuXG5cdHN0YW5kaW5nOiB7XG5cdFx0c2V0OiBmdW5jdGlvbiAoIC8qIHZhbHVlICovICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJWUk1hbmFnZXI6IC5zdGFuZGluZyBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHRcdH1cblx0fVxuXG59ICk7XG5cbi8vXG5cbkF1ZGlvLnByb3RvdHlwZS5sb2FkID0gZnVuY3Rpb24gKCBmaWxlICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLkF1ZGlvOiAubG9hZCBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgVEhSRUUuQXVkaW9Mb2FkZXIgaW5zdGVhZC4nICk7XG5cdHZhciBzY29wZSA9IHRoaXM7XG5cdHZhciBhdWRpb0xvYWRlciA9IG5ldyBBdWRpb0xvYWRlcigpO1xuXHRhdWRpb0xvYWRlci5sb2FkKCBmaWxlLCBmdW5jdGlvbiAoIGJ1ZmZlciApIHtcblxuXHRcdHNjb3BlLnNldEJ1ZmZlciggYnVmZmVyICk7XG5cblx0fSApO1xuXHRyZXR1cm4gdGhpcztcblxufTtcblxuQXVkaW9BbmFseXNlci5wcm90b3R5cGUuZ2V0RGF0YSA9IGZ1bmN0aW9uICgpIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5BdWRpb0FuYWx5c2VyOiAuZ2V0RGF0YSgpIGlzIG5vdyAuZ2V0RnJlcXVlbmN5RGF0YSgpLicgKTtcblx0cmV0dXJuIHRoaXMuZ2V0RnJlcXVlbmN5RGF0YSgpO1xuXG59O1xuXG4vL1xuXG5DdWJlQ2FtZXJhLnByb3RvdHlwZS51cGRhdGVDdWJlTWFwID0gZnVuY3Rpb24gKCByZW5kZXJlciwgc2NlbmUgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuQ3ViZUNhbWVyYTogLnVwZGF0ZUN1YmVNYXAoKSBpcyBub3cgLnVwZGF0ZSgpLicgKTtcblx0cmV0dXJuIHRoaXMudXBkYXRlKCByZW5kZXJlciwgc2NlbmUgKTtcblxufTtcblxudmFyIG1pbml2ZW50c19jb21tb25qcyA9IGZ1bmN0aW9uIEV2ZW50cyh0YXJnZXQpe1xuICB2YXIgZXZlbnRzID0ge30sIGVtcHR5ID0gW107XG4gIHRhcmdldCA9IHRhcmdldCB8fCB0aGlzO1xuICAvKipcbiAgICogIE9uOiBsaXN0ZW4gdG8gZXZlbnRzXG4gICAqL1xuICB0YXJnZXQub24gPSBmdW5jdGlvbih0eXBlLCBmdW5jLCBjdHgpe1xuICAgIChldmVudHNbdHlwZV0gPSBldmVudHNbdHlwZV0gfHwgW10pLnB1c2goW2Z1bmMsIGN0eF0pO1xuICAgIHJldHVybiB0YXJnZXRcbiAgfTtcbiAgLyoqXG4gICAqICBPZmY6IHN0b3AgbGlzdGVuaW5nIHRvIGV2ZW50IC8gc3BlY2lmaWMgY2FsbGJhY2tcbiAgICovXG4gIHRhcmdldC5vZmYgPSBmdW5jdGlvbih0eXBlLCBmdW5jKXtcbiAgICB0eXBlIHx8IChldmVudHMgPSB7fSk7XG4gICAgdmFyIGxpc3QgPSBldmVudHNbdHlwZV0gfHwgZW1wdHksXG4gICAgICAgIGkgPSBsaXN0Lmxlbmd0aCA9IGZ1bmMgPyBsaXN0Lmxlbmd0aCA6IDA7XG4gICAgd2hpbGUoaS0tKSBmdW5jID09IGxpc3RbaV1bMF0gJiYgbGlzdC5zcGxpY2UoaSwxKTtcbiAgICByZXR1cm4gdGFyZ2V0XG4gIH07XG4gIC8qKiBcbiAgICogRW1pdDogc2VuZCBldmVudCwgY2FsbGJhY2tzIHdpbGwgYmUgdHJpZ2dlcmVkXG4gICAqL1xuICB0YXJnZXQuZW1pdCA9IGZ1bmN0aW9uKHR5cGUpe1xuICAgIHZhciBlID0gZXZlbnRzW3R5cGVdIHx8IGVtcHR5LCBsaXN0ID0gZS5sZW5ndGggPiAwID8gZS5zbGljZSgwLCBlLmxlbmd0aCkgOiBlLCBpPTAsIGo7XG4gICAgd2hpbGUoaj1saXN0W2krK10pIGpbMF0uYXBwbHkoalsxXSwgZW1wdHkuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpKTtcbiAgICByZXR1cm4gdGFyZ2V0XG4gIH07XG59O1xuXG4vLyAxOS4xLjIuMiAvIDE1LjIuMy41IE9iamVjdC5jcmVhdGUoTyBbLCBQcm9wZXJ0aWVzXSlcbl9leHBvcnQoX2V4cG9ydC5TLCAnT2JqZWN0JywgeyBjcmVhdGU6IF9vYmplY3RDcmVhdGUgfSk7XG5cbnZhciAkT2JqZWN0JDIgPSBfY29yZS5PYmplY3Q7XG52YXIgY3JlYXRlID0gZnVuY3Rpb24gY3JlYXRlKFAsIEQpIHtcbiAgcmV0dXJuICRPYmplY3QkMi5jcmVhdGUoUCwgRCk7XG59O1xuXG52YXIgY3JlYXRlJDEgPSBjcmVhdGU7XG5cbnZhciBfdmFsaWRhdGVDb2xsZWN0aW9uID0gZnVuY3Rpb24gKGl0LCBUWVBFKSB7XG4gIGlmICghX2lzT2JqZWN0KGl0KSB8fCBpdC5fdCAhPT0gVFlQRSkgdGhyb3cgVHlwZUVycm9yKCdJbmNvbXBhdGlibGUgcmVjZWl2ZXIsICcgKyBUWVBFICsgJyByZXF1aXJlZCEnKTtcbiAgcmV0dXJuIGl0O1xufTtcblxudmFyIGRQJDIgPSBfb2JqZWN0RHAuZjtcblxuXG5cblxuXG5cblxuXG5cbnZhciBmYXN0S2V5ID0gX21ldGEuZmFzdEtleTtcblxudmFyIFNJWkUgPSBfZGVzY3JpcHRvcnMgPyAnX3MnIDogJ3NpemUnO1xuXG52YXIgZ2V0RW50cnkgPSBmdW5jdGlvbiAodGhhdCwga2V5KSB7XG4gIC8vIGZhc3QgY2FzZVxuICB2YXIgaW5kZXggPSBmYXN0S2V5KGtleSk7XG4gIHZhciBlbnRyeTtcbiAgaWYgKGluZGV4ICE9PSAnRicpIHJldHVybiB0aGF0Ll9pW2luZGV4XTtcbiAgLy8gZnJvemVuIG9iamVjdCBjYXNlXG4gIGZvciAoZW50cnkgPSB0aGF0Ll9mOyBlbnRyeTsgZW50cnkgPSBlbnRyeS5uKSB7XG4gICAgaWYgKGVudHJ5LmsgPT0ga2V5KSByZXR1cm4gZW50cnk7XG4gIH1cbn07XG5cbnZhciBfY29sbGVjdGlvblN0cm9uZyA9IHtcbiAgZ2V0Q29uc3RydWN0b3I6IGZ1bmN0aW9uICh3cmFwcGVyLCBOQU1FLCBJU19NQVAsIEFEREVSKSB7XG4gICAgdmFyIEMgPSB3cmFwcGVyKGZ1bmN0aW9uICh0aGF0LCBpdGVyYWJsZSkge1xuICAgICAgX2FuSW5zdGFuY2UodGhhdCwgQywgTkFNRSwgJ19pJyk7XG4gICAgICB0aGF0Ll90ID0gTkFNRTsgICAgICAgICAvLyBjb2xsZWN0aW9uIHR5cGVcbiAgICAgIHRoYXQuX2kgPSBfb2JqZWN0Q3JlYXRlKG51bGwpOyAvLyBpbmRleFxuICAgICAgdGhhdC5fZiA9IHVuZGVmaW5lZDsgICAgLy8gZmlyc3QgZW50cnlcbiAgICAgIHRoYXQuX2wgPSB1bmRlZmluZWQ7ICAgIC8vIGxhc3QgZW50cnlcbiAgICAgIHRoYXRbU0laRV0gPSAwOyAgICAgICAgIC8vIHNpemVcbiAgICAgIGlmIChpdGVyYWJsZSAhPSB1bmRlZmluZWQpIF9mb3JPZihpdGVyYWJsZSwgSVNfTUFQLCB0aGF0W0FEREVSXSwgdGhhdCk7XG4gICAgfSk7XG4gICAgX3JlZGVmaW5lQWxsKEMucHJvdG90eXBlLCB7XG4gICAgICAvLyAyMy4xLjMuMSBNYXAucHJvdG90eXBlLmNsZWFyKClcbiAgICAgIC8vIDIzLjIuMy4yIFNldC5wcm90b3R5cGUuY2xlYXIoKVxuICAgICAgY2xlYXI6IGZ1bmN0aW9uIGNsZWFyKCkge1xuICAgICAgICBmb3IgKHZhciB0aGF0ID0gX3ZhbGlkYXRlQ29sbGVjdGlvbih0aGlzLCBOQU1FKSwgZGF0YSA9IHRoYXQuX2ksIGVudHJ5ID0gdGhhdC5fZjsgZW50cnk7IGVudHJ5ID0gZW50cnkubikge1xuICAgICAgICAgIGVudHJ5LnIgPSB0cnVlO1xuICAgICAgICAgIGlmIChlbnRyeS5wKSBlbnRyeS5wID0gZW50cnkucC5uID0gdW5kZWZpbmVkO1xuICAgICAgICAgIGRlbGV0ZSBkYXRhW2VudHJ5LmldO1xuICAgICAgICB9XG4gICAgICAgIHRoYXQuX2YgPSB0aGF0Ll9sID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGF0W1NJWkVdID0gMDtcbiAgICAgIH0sXG4gICAgICAvLyAyMy4xLjMuMyBNYXAucHJvdG90eXBlLmRlbGV0ZShrZXkpXG4gICAgICAvLyAyMy4yLjMuNCBTZXQucHJvdG90eXBlLmRlbGV0ZSh2YWx1ZSlcbiAgICAgICdkZWxldGUnOiBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHZhciB0aGF0ID0gX3ZhbGlkYXRlQ29sbGVjdGlvbih0aGlzLCBOQU1FKTtcbiAgICAgICAgdmFyIGVudHJ5ID0gZ2V0RW50cnkodGhhdCwga2V5KTtcbiAgICAgICAgaWYgKGVudHJ5KSB7XG4gICAgICAgICAgdmFyIG5leHQgPSBlbnRyeS5uO1xuICAgICAgICAgIHZhciBwcmV2ID0gZW50cnkucDtcbiAgICAgICAgICBkZWxldGUgdGhhdC5faVtlbnRyeS5pXTtcbiAgICAgICAgICBlbnRyeS5yID0gdHJ1ZTtcbiAgICAgICAgICBpZiAocHJldikgcHJldi5uID0gbmV4dDtcbiAgICAgICAgICBpZiAobmV4dCkgbmV4dC5wID0gcHJldjtcbiAgICAgICAgICBpZiAodGhhdC5fZiA9PSBlbnRyeSkgdGhhdC5fZiA9IG5leHQ7XG4gICAgICAgICAgaWYgKHRoYXQuX2wgPT0gZW50cnkpIHRoYXQuX2wgPSBwcmV2O1xuICAgICAgICAgIHRoYXRbU0laRV0tLTtcbiAgICAgICAgfSByZXR1cm4gISFlbnRyeTtcbiAgICAgIH0sXG4gICAgICAvLyAyMy4yLjMuNiBTZXQucHJvdG90eXBlLmZvckVhY2goY2FsbGJhY2tmbiwgdGhpc0FyZyA9IHVuZGVmaW5lZClcbiAgICAgIC8vIDIzLjEuMy41IE1hcC5wcm90b3R5cGUuZm9yRWFjaChjYWxsYmFja2ZuLCB0aGlzQXJnID0gdW5kZWZpbmVkKVxuICAgICAgZm9yRWFjaDogZnVuY3Rpb24gZm9yRWFjaChjYWxsYmFja2ZuIC8qICwgdGhhdCA9IHVuZGVmaW5lZCAqLykge1xuICAgICAgICBfdmFsaWRhdGVDb2xsZWN0aW9uKHRoaXMsIE5BTUUpO1xuICAgICAgICB2YXIgZiA9IF9jdHgoY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQsIDMpO1xuICAgICAgICB2YXIgZW50cnk7XG4gICAgICAgIHdoaWxlIChlbnRyeSA9IGVudHJ5ID8gZW50cnkubiA6IHRoaXMuX2YpIHtcbiAgICAgICAgICBmKGVudHJ5LnYsIGVudHJ5LmssIHRoaXMpO1xuICAgICAgICAgIC8vIHJldmVydCB0byB0aGUgbGFzdCBleGlzdGluZyBlbnRyeVxuICAgICAgICAgIHdoaWxlIChlbnRyeSAmJiBlbnRyeS5yKSBlbnRyeSA9IGVudHJ5LnA7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAvLyAyMy4xLjMuNyBNYXAucHJvdG90eXBlLmhhcyhrZXkpXG4gICAgICAvLyAyMy4yLjMuNyBTZXQucHJvdG90eXBlLmhhcyh2YWx1ZSlcbiAgICAgIGhhczogZnVuY3Rpb24gaGFzKGtleSkge1xuICAgICAgICByZXR1cm4gISFnZXRFbnRyeShfdmFsaWRhdGVDb2xsZWN0aW9uKHRoaXMsIE5BTUUpLCBrZXkpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChfZGVzY3JpcHRvcnMpIGRQJDIoQy5wcm90b3R5cGUsICdzaXplJywge1xuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfdmFsaWRhdGVDb2xsZWN0aW9uKHRoaXMsIE5BTUUpW1NJWkVdO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBDO1xuICB9LFxuICBkZWY6IGZ1bmN0aW9uICh0aGF0LCBrZXksIHZhbHVlKSB7XG4gICAgdmFyIGVudHJ5ID0gZ2V0RW50cnkodGhhdCwga2V5KTtcbiAgICB2YXIgcHJldiwgaW5kZXg7XG4gICAgLy8gY2hhbmdlIGV4aXN0aW5nIGVudHJ5XG4gICAgaWYgKGVudHJ5KSB7XG4gICAgICBlbnRyeS52ID0gdmFsdWU7XG4gICAgLy8gY3JlYXRlIG5ldyBlbnRyeVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGF0Ll9sID0gZW50cnkgPSB7XG4gICAgICAgIGk6IGluZGV4ID0gZmFzdEtleShrZXksIHRydWUpLCAvLyA8LSBpbmRleFxuICAgICAgICBrOiBrZXksICAgICAgICAgICAgICAgICAgICAgICAgLy8gPC0ga2V5XG4gICAgICAgIHY6IHZhbHVlLCAgICAgICAgICAgICAgICAgICAgICAvLyA8LSB2YWx1ZVxuICAgICAgICBwOiBwcmV2ID0gdGhhdC5fbCwgICAgICAgICAgICAgLy8gPC0gcHJldmlvdXMgZW50cnlcbiAgICAgICAgbjogdW5kZWZpbmVkLCAgICAgICAgICAgICAgICAgIC8vIDwtIG5leHQgZW50cnlcbiAgICAgICAgcjogZmFsc2UgICAgICAgICAgICAgICAgICAgICAgIC8vIDwtIHJlbW92ZWRcbiAgICAgIH07XG4gICAgICBpZiAoIXRoYXQuX2YpIHRoYXQuX2YgPSBlbnRyeTtcbiAgICAgIGlmIChwcmV2KSBwcmV2Lm4gPSBlbnRyeTtcbiAgICAgIHRoYXRbU0laRV0rKztcbiAgICAgIC8vIGFkZCB0byBpbmRleFxuICAgICAgaWYgKGluZGV4ICE9PSAnRicpIHRoYXQuX2lbaW5kZXhdID0gZW50cnk7XG4gICAgfSByZXR1cm4gdGhhdDtcbiAgfSxcbiAgZ2V0RW50cnk6IGdldEVudHJ5LFxuICBzZXRTdHJvbmc6IGZ1bmN0aW9uIChDLCBOQU1FLCBJU19NQVApIHtcbiAgICAvLyBhZGQgLmtleXMsIC52YWx1ZXMsIC5lbnRyaWVzLCBbQEBpdGVyYXRvcl1cbiAgICAvLyAyMy4xLjMuNCwgMjMuMS4zLjgsIDIzLjEuMy4xMSwgMjMuMS4zLjEyLCAyMy4yLjMuNSwgMjMuMi4zLjgsIDIzLjIuMy4xMCwgMjMuMi4zLjExXG4gICAgX2l0ZXJEZWZpbmUoQywgTkFNRSwgZnVuY3Rpb24gKGl0ZXJhdGVkLCBraW5kKSB7XG4gICAgICB0aGlzLl90ID0gX3ZhbGlkYXRlQ29sbGVjdGlvbihpdGVyYXRlZCwgTkFNRSk7IC8vIHRhcmdldFxuICAgICAgdGhpcy5fayA9IGtpbmQ7ICAgICAgICAgICAgICAgICAgICAgLy8ga2luZFxuICAgICAgdGhpcy5fbCA9IHVuZGVmaW5lZDsgICAgICAgICAgICAgICAgLy8gcHJldmlvdXNcbiAgICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICB2YXIga2luZCA9IHRoYXQuX2s7XG4gICAgICB2YXIgZW50cnkgPSB0aGF0Ll9sO1xuICAgICAgLy8gcmV2ZXJ0IHRvIHRoZSBsYXN0IGV4aXN0aW5nIGVudHJ5XG4gICAgICB3aGlsZSAoZW50cnkgJiYgZW50cnkucikgZW50cnkgPSBlbnRyeS5wO1xuICAgICAgLy8gZ2V0IG5leHQgZW50cnlcbiAgICAgIGlmICghdGhhdC5fdCB8fCAhKHRoYXQuX2wgPSBlbnRyeSA9IGVudHJ5ID8gZW50cnkubiA6IHRoYXQuX3QuX2YpKSB7XG4gICAgICAgIC8vIG9yIGZpbmlzaCB0aGUgaXRlcmF0aW9uXG4gICAgICAgIHRoYXQuX3QgPSB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiBfaXRlclN0ZXAoMSk7XG4gICAgICB9XG4gICAgICAvLyByZXR1cm4gc3RlcCBieSBraW5kXG4gICAgICBpZiAoa2luZCA9PSAna2V5cycpIHJldHVybiBfaXRlclN0ZXAoMCwgZW50cnkuayk7XG4gICAgICBpZiAoa2luZCA9PSAndmFsdWVzJykgcmV0dXJuIF9pdGVyU3RlcCgwLCBlbnRyeS52KTtcbiAgICAgIHJldHVybiBfaXRlclN0ZXAoMCwgW2VudHJ5LmssIGVudHJ5LnZdKTtcbiAgICB9LCBJU19NQVAgPyAnZW50cmllcycgOiAndmFsdWVzJywgIUlTX01BUCwgdHJ1ZSk7XG5cbiAgICAvLyBhZGQgW0BAc3BlY2llc10sIDIzLjEuMi4yLCAyMy4yLjIuMlxuICAgIF9zZXRTcGVjaWVzKE5BTUUpO1xuICB9XG59O1xuXG52YXIgU1BFQ0lFUyQyID0gX3drcygnc3BlY2llcycpO1xuXG52YXIgX2FycmF5U3BlY2llc0NvbnN0cnVjdG9yID0gZnVuY3Rpb24gKG9yaWdpbmFsKSB7XG4gIHZhciBDO1xuICBpZiAoX2lzQXJyYXkob3JpZ2luYWwpKSB7XG4gICAgQyA9IG9yaWdpbmFsLmNvbnN0cnVjdG9yO1xuICAgIC8vIGNyb3NzLXJlYWxtIGZhbGxiYWNrXG4gICAgaWYgKHR5cGVvZiBDID09ICdmdW5jdGlvbicgJiYgKEMgPT09IEFycmF5IHx8IF9pc0FycmF5KEMucHJvdG90eXBlKSkpIEMgPSB1bmRlZmluZWQ7XG4gICAgaWYgKF9pc09iamVjdChDKSkge1xuICAgICAgQyA9IENbU1BFQ0lFUyQyXTtcbiAgICAgIGlmIChDID09PSBudWxsKSBDID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfSByZXR1cm4gQyA9PT0gdW5kZWZpbmVkID8gQXJyYXkgOiBDO1xufTtcblxuLy8gOS40LjIuMyBBcnJheVNwZWNpZXNDcmVhdGUob3JpZ2luYWxBcnJheSwgbGVuZ3RoKVxuXG5cbnZhciBfYXJyYXlTcGVjaWVzQ3JlYXRlID0gZnVuY3Rpb24gKG9yaWdpbmFsLCBsZW5ndGgpIHtcbiAgcmV0dXJuIG5ldyAoX2FycmF5U3BlY2llc0NvbnN0cnVjdG9yKG9yaWdpbmFsKSkobGVuZ3RoKTtcbn07XG5cbi8vIDAgLT4gQXJyYXkjZm9yRWFjaFxuLy8gMSAtPiBBcnJheSNtYXBcbi8vIDIgLT4gQXJyYXkjZmlsdGVyXG4vLyAzIC0+IEFycmF5I3NvbWVcbi8vIDQgLT4gQXJyYXkjZXZlcnlcbi8vIDUgLT4gQXJyYXkjZmluZFxuLy8gNiAtPiBBcnJheSNmaW5kSW5kZXhcblxuXG5cblxuXG52YXIgX2FycmF5TWV0aG9kcyA9IGZ1bmN0aW9uIChUWVBFLCAkY3JlYXRlKSB7XG4gIHZhciBJU19NQVAgPSBUWVBFID09IDE7XG4gIHZhciBJU19GSUxURVIgPSBUWVBFID09IDI7XG4gIHZhciBJU19TT01FID0gVFlQRSA9PSAzO1xuICB2YXIgSVNfRVZFUlkgPSBUWVBFID09IDQ7XG4gIHZhciBJU19GSU5EX0lOREVYID0gVFlQRSA9PSA2O1xuICB2YXIgTk9fSE9MRVMgPSBUWVBFID09IDUgfHwgSVNfRklORF9JTkRFWDtcbiAgdmFyIGNyZWF0ZSA9ICRjcmVhdGUgfHwgX2FycmF5U3BlY2llc0NyZWF0ZTtcbiAgcmV0dXJuIGZ1bmN0aW9uICgkdGhpcywgY2FsbGJhY2tmbiwgdGhhdCkge1xuICAgIHZhciBPID0gX3RvT2JqZWN0KCR0aGlzKTtcbiAgICB2YXIgc2VsZiA9IF9pb2JqZWN0KE8pO1xuICAgIHZhciBmID0gX2N0eChjYWxsYmFja2ZuLCB0aGF0LCAzKTtcbiAgICB2YXIgbGVuZ3RoID0gX3RvTGVuZ3RoKHNlbGYubGVuZ3RoKTtcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIHZhciByZXN1bHQgPSBJU19NQVAgPyBjcmVhdGUoJHRoaXMsIGxlbmd0aCkgOiBJU19GSUxURVIgPyBjcmVhdGUoJHRoaXMsIDApIDogdW5kZWZpbmVkO1xuICAgIHZhciB2YWwsIHJlcztcbiAgICBmb3IgKDtsZW5ndGggPiBpbmRleDsgaW5kZXgrKykgaWYgKE5PX0hPTEVTIHx8IGluZGV4IGluIHNlbGYpIHtcbiAgICAgIHZhbCA9IHNlbGZbaW5kZXhdO1xuICAgICAgcmVzID0gZih2YWwsIGluZGV4LCBPKTtcbiAgICAgIGlmIChUWVBFKSB7XG4gICAgICAgIGlmIChJU19NQVApIHJlc3VsdFtpbmRleF0gPSByZXM7ICAgLy8gbWFwXG4gICAgICAgIGVsc2UgaWYgKHJlcykgc3dpdGNoIChUWVBFKSB7XG4gICAgICAgICAgY2FzZSAzOiByZXR1cm4gdHJ1ZTsgICAgICAgICAgICAgLy8gc29tZVxuICAgICAgICAgIGNhc2UgNTogcmV0dXJuIHZhbDsgICAgICAgICAgICAgIC8vIGZpbmRcbiAgICAgICAgICBjYXNlIDY6IHJldHVybiBpbmRleDsgICAgICAgICAgICAvLyBmaW5kSW5kZXhcbiAgICAgICAgICBjYXNlIDI6IHJlc3VsdC5wdXNoKHZhbCk7ICAgICAgICAvLyBmaWx0ZXJcbiAgICAgICAgfSBlbHNlIGlmIChJU19FVkVSWSkgcmV0dXJuIGZhbHNlOyAvLyBldmVyeVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gSVNfRklORF9JTkRFWCA/IC0xIDogSVNfU09NRSB8fCBJU19FVkVSWSA/IElTX0VWRVJZIDogcmVzdWx0O1xuICB9O1xufTtcblxudmFyIGRQJDMgPSBfb2JqZWN0RHAuZjtcbnZhciBlYWNoID0gX2FycmF5TWV0aG9kcygwKTtcblxuXG52YXIgX2NvbGxlY3Rpb24gPSBmdW5jdGlvbiAoTkFNRSwgd3JhcHBlciwgbWV0aG9kcywgY29tbW9uLCBJU19NQVAsIElTX1dFQUspIHtcbiAgdmFyIEJhc2UgPSBfZ2xvYmFsW05BTUVdO1xuICB2YXIgQyA9IEJhc2U7XG4gIHZhciBBRERFUiA9IElTX01BUCA/ICdzZXQnIDogJ2FkZCc7XG4gIHZhciBwcm90byA9IEMgJiYgQy5wcm90b3R5cGU7XG4gIHZhciBPID0ge307XG4gIGlmICghX2Rlc2NyaXB0b3JzIHx8IHR5cGVvZiBDICE9ICdmdW5jdGlvbicgfHwgIShJU19XRUFLIHx8IHByb3RvLmZvckVhY2ggJiYgIV9mYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgbmV3IEMoKS5lbnRyaWVzKCkubmV4dCgpO1xuICB9KSkpIHtcbiAgICAvLyBjcmVhdGUgY29sbGVjdGlvbiBjb25zdHJ1Y3RvclxuICAgIEMgPSBjb21tb24uZ2V0Q29uc3RydWN0b3Iod3JhcHBlciwgTkFNRSwgSVNfTUFQLCBBRERFUik7XG4gICAgX3JlZGVmaW5lQWxsKEMucHJvdG90eXBlLCBtZXRob2RzKTtcbiAgICBfbWV0YS5ORUVEID0gdHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICBDID0gd3JhcHBlcihmdW5jdGlvbiAodGFyZ2V0LCBpdGVyYWJsZSkge1xuICAgICAgX2FuSW5zdGFuY2UodGFyZ2V0LCBDLCBOQU1FLCAnX2MnKTtcbiAgICAgIHRhcmdldC5fYyA9IG5ldyBCYXNlKCk7XG4gICAgICBpZiAoaXRlcmFibGUgIT0gdW5kZWZpbmVkKSBfZm9yT2YoaXRlcmFibGUsIElTX01BUCwgdGFyZ2V0W0FEREVSXSwgdGFyZ2V0KTtcbiAgICB9KTtcbiAgICBlYWNoKCdhZGQsY2xlYXIsZGVsZXRlLGZvckVhY2gsZ2V0LGhhcyxzZXQsa2V5cyx2YWx1ZXMsZW50cmllcyx0b0pTT04nLnNwbGl0KCcsJyksIGZ1bmN0aW9uIChLRVkpIHtcbiAgICAgIHZhciBJU19BRERFUiA9IEtFWSA9PSAnYWRkJyB8fCBLRVkgPT0gJ3NldCc7XG4gICAgICBpZiAoS0VZIGluIHByb3RvICYmICEoSVNfV0VBSyAmJiBLRVkgPT0gJ2NsZWFyJykpIF9oaWRlKEMucHJvdG90eXBlLCBLRVksIGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICAgIF9hbkluc3RhbmNlKHRoaXMsIEMsIEtFWSk7XG4gICAgICAgIGlmICghSVNfQURERVIgJiYgSVNfV0VBSyAmJiAhX2lzT2JqZWN0KGEpKSByZXR1cm4gS0VZID09ICdnZXQnID8gdW5kZWZpbmVkIDogZmFsc2U7XG4gICAgICAgIHZhciByZXN1bHQgPSB0aGlzLl9jW0tFWV0oYSA9PT0gMCA/IDAgOiBhLCBiKTtcbiAgICAgICAgcmV0dXJuIElTX0FEREVSID8gdGhpcyA6IHJlc3VsdDtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIElTX1dFQUsgfHwgZFAkMyhDLnByb3RvdHlwZSwgJ3NpemUnLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Muc2l6ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIF9zZXRUb1N0cmluZ1RhZyhDLCBOQU1FKTtcblxuICBPW05BTUVdID0gQztcbiAgX2V4cG9ydChfZXhwb3J0LkcgKyBfZXhwb3J0LlcgKyBfZXhwb3J0LkYsIE8pO1xuXG4gIGlmICghSVNfV0VBSykgY29tbW9uLnNldFN0cm9uZyhDLCBOQU1FLCBJU19NQVApO1xuXG4gIHJldHVybiBDO1xufTtcblxudmFyIE1BUCA9ICdNYXAnO1xuXG4vLyAyMy4xIE1hcCBPYmplY3RzXG52YXIgZXM2X21hcCA9IF9jb2xsZWN0aW9uKE1BUCwgZnVuY3Rpb24gKGdldCkge1xuICByZXR1cm4gZnVuY3Rpb24gTWFwKCkgeyByZXR1cm4gZ2V0KHRoaXMsIGFyZ3VtZW50cy5sZW5ndGggPiAwID8gYXJndW1lbnRzWzBdIDogdW5kZWZpbmVkKTsgfTtcbn0sIHtcbiAgLy8gMjMuMS4zLjYgTWFwLnByb3RvdHlwZS5nZXQoa2V5KVxuICBnZXQ6IGZ1bmN0aW9uIGdldChrZXkpIHtcbiAgICB2YXIgZW50cnkgPSBfY29sbGVjdGlvblN0cm9uZy5nZXRFbnRyeShfdmFsaWRhdGVDb2xsZWN0aW9uKHRoaXMsIE1BUCksIGtleSk7XG4gICAgcmV0dXJuIGVudHJ5ICYmIGVudHJ5LnY7XG4gIH0sXG4gIC8vIDIzLjEuMy45IE1hcC5wcm90b3R5cGUuc2V0KGtleSwgdmFsdWUpXG4gIHNldDogZnVuY3Rpb24gc2V0KGtleSwgdmFsdWUpIHtcbiAgICByZXR1cm4gX2NvbGxlY3Rpb25TdHJvbmcuZGVmKF92YWxpZGF0ZUNvbGxlY3Rpb24odGhpcywgTUFQKSwga2V5ID09PSAwID8gMCA6IGtleSwgdmFsdWUpO1xuICB9XG59LCBfY29sbGVjdGlvblN0cm9uZywgdHJ1ZSk7XG5cbnZhciBfYXJyYXlGcm9tSXRlcmFibGUgPSBmdW5jdGlvbiAoaXRlciwgSVRFUkFUT1IpIHtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICBfZm9yT2YoaXRlciwgZmFsc2UsIHJlc3VsdC5wdXNoLCByZXN1bHQsIElURVJBVE9SKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9EYXZpZEJydWFudC9NYXAtU2V0LnByb3RvdHlwZS50b0pTT05cblxuXG52YXIgX2NvbGxlY3Rpb25Ub0pzb24gPSBmdW5jdGlvbiAoTkFNRSkge1xuICByZXR1cm4gZnVuY3Rpb24gdG9KU09OKCkge1xuICAgIGlmIChfY2xhc3NvZih0aGlzKSAhPSBOQU1FKSB0aHJvdyBUeXBlRXJyb3IoTkFNRSArIFwiI3RvSlNPTiBpc24ndCBnZW5lcmljXCIpO1xuICAgIHJldHVybiBfYXJyYXlGcm9tSXRlcmFibGUodGhpcyk7XG4gIH07XG59O1xuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vRGF2aWRCcnVhbnQvTWFwLVNldC5wcm90b3R5cGUudG9KU09OXG5cblxuX2V4cG9ydChfZXhwb3J0LlAgKyBfZXhwb3J0LlIsICdNYXAnLCB7IHRvSlNPTjogX2NvbGxlY3Rpb25Ub0pzb24oJ01hcCcpIH0pO1xuXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL3Byb3Bvc2FsLXNldG1hcC1vZmZyb20vXG5cblxudmFyIF9zZXRDb2xsZWN0aW9uT2YgPSBmdW5jdGlvbiAoQ09MTEVDVElPTikge1xuICBfZXhwb3J0KF9leHBvcnQuUywgQ09MTEVDVElPTiwgeyBvZjogZnVuY3Rpb24gb2YoKSB7XG4gICAgdmFyIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgdmFyIEEgPSBuZXcgQXJyYXkobGVuZ3RoKTtcbiAgICB3aGlsZSAobGVuZ3RoLS0pIEFbbGVuZ3RoXSA9IGFyZ3VtZW50c1tsZW5ndGhdO1xuICAgIHJldHVybiBuZXcgdGhpcyhBKTtcbiAgfSB9KTtcbn07XG5cbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vcHJvcG9zYWwtc2V0bWFwLW9mZnJvbS8jc2VjLW1hcC5vZlxuX3NldENvbGxlY3Rpb25PZignTWFwJyk7XG5cbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vcHJvcG9zYWwtc2V0bWFwLW9mZnJvbS9cblxuXG5cblxuXG52YXIgX3NldENvbGxlY3Rpb25Gcm9tID0gZnVuY3Rpb24gKENPTExFQ1RJT04pIHtcbiAgX2V4cG9ydChfZXhwb3J0LlMsIENPTExFQ1RJT04sIHsgZnJvbTogZnVuY3Rpb24gZnJvbShzb3VyY2UgLyogLCBtYXBGbiwgdGhpc0FyZyAqLykge1xuICAgIHZhciBtYXBGbiA9IGFyZ3VtZW50c1sxXTtcbiAgICB2YXIgbWFwcGluZywgQSwgbiwgY2I7XG4gICAgX2FGdW5jdGlvbih0aGlzKTtcbiAgICBtYXBwaW5nID0gbWFwRm4gIT09IHVuZGVmaW5lZDtcbiAgICBpZiAobWFwcGluZykgX2FGdW5jdGlvbihtYXBGbik7XG4gICAgaWYgKHNvdXJjZSA9PSB1bmRlZmluZWQpIHJldHVybiBuZXcgdGhpcygpO1xuICAgIEEgPSBbXTtcbiAgICBpZiAobWFwcGluZykge1xuICAgICAgbiA9IDA7XG4gICAgICBjYiA9IF9jdHgobWFwRm4sIGFyZ3VtZW50c1syXSwgMik7XG4gICAgICBfZm9yT2Yoc291cmNlLCBmYWxzZSwgZnVuY3Rpb24gKG5leHRJdGVtKSB7XG4gICAgICAgIEEucHVzaChjYihuZXh0SXRlbSwgbisrKSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgX2Zvck9mKHNvdXJjZSwgZmFsc2UsIEEucHVzaCwgQSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgdGhpcyhBKTtcbiAgfSB9KTtcbn07XG5cbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vcHJvcG9zYWwtc2V0bWFwLW9mZnJvbS8jc2VjLW1hcC5mcm9tXG5fc2V0Q29sbGVjdGlvbkZyb20oJ01hcCcpO1xuXG52YXIgbWFwID0gX2NvcmUuTWFwO1xuXG52YXIgbWFwJDEgPSBtYXA7XG5cbnZhciBhcnJheVNsaWNlID0gW10uc2xpY2U7XG52YXIgZmFjdG9yaWVzID0ge307XG5cbnZhciBjb25zdHJ1Y3QgPSBmdW5jdGlvbiAoRiwgbGVuLCBhcmdzKSB7XG4gIGlmICghKGxlbiBpbiBmYWN0b3JpZXMpKSB7XG4gICAgZm9yICh2YXIgbiA9IFtdLCBpID0gMDsgaSA8IGxlbjsgaSsrKSBuW2ldID0gJ2FbJyArIGkgKyAnXSc7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ldy1mdW5jXG4gICAgZmFjdG9yaWVzW2xlbl0gPSBGdW5jdGlvbignRixhJywgJ3JldHVybiBuZXcgRignICsgbi5qb2luKCcsJykgKyAnKScpO1xuICB9IHJldHVybiBmYWN0b3JpZXNbbGVuXShGLCBhcmdzKTtcbn07XG5cbnZhciBfYmluZCA9IEZ1bmN0aW9uLmJpbmQgfHwgZnVuY3Rpb24gYmluZCh0aGF0IC8qICwgLi4uYXJncyAqLykge1xuICB2YXIgZm4gPSBfYUZ1bmN0aW9uKHRoaXMpO1xuICB2YXIgcGFydEFyZ3MgPSBhcnJheVNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgdmFyIGJvdW5kID0gZnVuY3Rpb24gKC8qIGFyZ3MuLi4gKi8pIHtcbiAgICB2YXIgYXJncyA9IHBhcnRBcmdzLmNvbmNhdChhcnJheVNsaWNlLmNhbGwoYXJndW1lbnRzKSk7XG4gICAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBib3VuZCA/IGNvbnN0cnVjdChmbiwgYXJncy5sZW5ndGgsIGFyZ3MpIDogX2ludm9rZShmbiwgYXJncywgdGhhdCk7XG4gIH07XG4gIGlmIChfaXNPYmplY3QoZm4ucHJvdG90eXBlKSkgYm91bmQucHJvdG90eXBlID0gZm4ucHJvdG90eXBlO1xuICByZXR1cm4gYm91bmQ7XG59O1xuXG4vLyAyNi4xLjIgUmVmbGVjdC5jb25zdHJ1Y3QodGFyZ2V0LCBhcmd1bWVudHNMaXN0IFssIG5ld1RhcmdldF0pXG5cblxuXG5cblxuXG5cbnZhciByQ29uc3RydWN0ID0gKF9nbG9iYWwuUmVmbGVjdCB8fCB7fSkuY29uc3RydWN0O1xuXG4vLyBNUyBFZGdlIHN1cHBvcnRzIG9ubHkgMiBhcmd1bWVudHMgYW5kIGFyZ3VtZW50c0xpc3QgYXJndW1lbnQgaXMgb3B0aW9uYWxcbi8vIEZGIE5pZ2h0bHkgc2V0cyB0aGlyZCBhcmd1bWVudCBhcyBgbmV3LnRhcmdldGAsIGJ1dCBkb2VzIG5vdCBjcmVhdGUgYHRoaXNgIGZyb20gaXRcbnZhciBORVdfVEFSR0VUX0JVRyA9IF9mYWlscyhmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEYoKSB7IC8qIGVtcHR5ICovIH1cbiAgcmV0dXJuICEockNvbnN0cnVjdChmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0sIFtdLCBGKSBpbnN0YW5jZW9mIEYpO1xufSk7XG52YXIgQVJHU19CVUcgPSAhX2ZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgckNvbnN0cnVjdChmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0pO1xufSk7XG5cbl9leHBvcnQoX2V4cG9ydC5TICsgX2V4cG9ydC5GICogKE5FV19UQVJHRVRfQlVHIHx8IEFSR1NfQlVHKSwgJ1JlZmxlY3QnLCB7XG4gIGNvbnN0cnVjdDogZnVuY3Rpb24gY29uc3RydWN0KFRhcmdldCwgYXJncyAvKiAsIG5ld1RhcmdldCAqLykge1xuICAgIF9hRnVuY3Rpb24oVGFyZ2V0KTtcbiAgICBfYW5PYmplY3QoYXJncyk7XG4gICAgdmFyIG5ld1RhcmdldCA9IGFyZ3VtZW50cy5sZW5ndGggPCAzID8gVGFyZ2V0IDogX2FGdW5jdGlvbihhcmd1bWVudHNbMl0pO1xuICAgIGlmIChBUkdTX0JVRyAmJiAhTkVXX1RBUkdFVF9CVUcpIHJldHVybiByQ29uc3RydWN0KFRhcmdldCwgYXJncywgbmV3VGFyZ2V0KTtcbiAgICBpZiAoVGFyZ2V0ID09IG5ld1RhcmdldCkge1xuICAgICAgLy8gdy9vIGFsdGVyZWQgbmV3VGFyZ2V0LCBvcHRpbWl6YXRpb24gZm9yIDAtNCBhcmd1bWVudHNcbiAgICAgIHN3aXRjaCAoYXJncy5sZW5ndGgpIHtcbiAgICAgICAgY2FzZSAwOiByZXR1cm4gbmV3IFRhcmdldCgpO1xuICAgICAgICBjYXNlIDE6IHJldHVybiBuZXcgVGFyZ2V0KGFyZ3NbMF0pO1xuICAgICAgICBjYXNlIDI6IHJldHVybiBuZXcgVGFyZ2V0KGFyZ3NbMF0sIGFyZ3NbMV0pO1xuICAgICAgICBjYXNlIDM6IHJldHVybiBuZXcgVGFyZ2V0KGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pO1xuICAgICAgICBjYXNlIDQ6IHJldHVybiBuZXcgVGFyZ2V0KGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10pO1xuICAgICAgfVxuICAgICAgLy8gdy9vIGFsdGVyZWQgbmV3VGFyZ2V0LCBsb3Qgb2YgYXJndW1lbnRzIGNhc2VcbiAgICAgIHZhciAkYXJncyA9IFtudWxsXTtcbiAgICAgICRhcmdzLnB1c2guYXBwbHkoJGFyZ3MsIGFyZ3MpO1xuICAgICAgcmV0dXJuIG5ldyAoX2JpbmQuYXBwbHkoVGFyZ2V0LCAkYXJncykpKCk7XG4gICAgfVxuICAgIC8vIHdpdGggYWx0ZXJlZCBuZXdUYXJnZXQsIG5vdCBzdXBwb3J0IGJ1aWx0LWluIGNvbnN0cnVjdG9yc1xuICAgIHZhciBwcm90byA9IG5ld1RhcmdldC5wcm90b3R5cGU7XG4gICAgdmFyIGluc3RhbmNlID0gX29iamVjdENyZWF0ZShfaXNPYmplY3QocHJvdG8pID8gcHJvdG8gOiBPYmplY3QucHJvdG90eXBlKTtcbiAgICB2YXIgcmVzdWx0ID0gRnVuY3Rpb24uYXBwbHkuY2FsbChUYXJnZXQsIGluc3RhbmNlLCBhcmdzKTtcbiAgICByZXR1cm4gX2lzT2JqZWN0KHJlc3VsdCkgPyByZXN1bHQgOiBpbnN0YW5jZTtcbiAgfVxufSk7XG5cbnZhciBjb25zdHJ1Y3QkMSA9IF9jb3JlLlJlZmxlY3QuY29uc3RydWN0O1xuXG52YXIgY29uc3RydWN0JDIgPSBjb25zdHJ1Y3QkMTtcblxudmFyIGNvbnN0cnVjdCQzID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSkge1xuZnVuY3Rpb24gX2NvbnN0cnVjdChQYXJlbnQsIGFyZ3MsIENsYXNzKSB7XG4gIGlmICh0eXBlb2YgUmVmbGVjdCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBjb25zdHJ1Y3QkMikge1xuICAgIG1vZHVsZS5leHBvcnRzID0gX2NvbnN0cnVjdCA9IGNvbnN0cnVjdCQyO1xuICB9IGVsc2Uge1xuICAgIG1vZHVsZS5leHBvcnRzID0gX2NvbnN0cnVjdCA9IGZ1bmN0aW9uIF9jb25zdHJ1Y3QoUGFyZW50LCBhcmdzLCBDbGFzcykge1xuICAgICAgdmFyIGEgPSBbbnVsbF07XG4gICAgICBhLnB1c2guYXBwbHkoYSwgYXJncyk7XG4gICAgICB2YXIgQ29uc3RydWN0b3IgPSBQYXJlbnQuYmluZC5hcHBseShQYXJlbnQsIGEpO1xuICAgICAgdmFyIGluc3RhbmNlID0gbmV3IENvbnN0cnVjdG9yKCk7XG4gICAgICBpZiAoQ2xhc3MpIHNldFByb3RvdHlwZU9mJDIoaW5zdGFuY2UsIENsYXNzLnByb3RvdHlwZSk7XG4gICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBfY29uc3RydWN0LmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2NvbnN0cnVjdDtcbn0pO1xuXG52YXIgd3JhcE5hdGl2ZVN1cGVyID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSkge1xuZnVuY3Rpb24gX3dyYXBOYXRpdmVTdXBlcihDbGFzcykge1xuICB2YXIgX2NhY2hlID0gdHlwZW9mIG1hcCQxID09PSBcImZ1bmN0aW9uXCIgPyBuZXcgbWFwJDEoKSA6IHVuZGVmaW5lZDtcblxuICBtb2R1bGUuZXhwb3J0cyA9IF93cmFwTmF0aXZlU3VwZXIgPSBmdW5jdGlvbiBfd3JhcE5hdGl2ZVN1cGVyKENsYXNzKSB7XG4gICAgaWYgKHR5cGVvZiBDbGFzcyAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb25cIik7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBfY2FjaGUgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIGlmIChfY2FjaGUuaGFzKENsYXNzKSkgcmV0dXJuIF9jYWNoZS5nZXQoQ2xhc3MpO1xuXG4gICAgICBfY2FjaGUuc2V0KENsYXNzLCBXcmFwcGVyKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBXcmFwcGVyKCkge31cblxuICAgIFdyYXBwZXIucHJvdG90eXBlID0gY3JlYXRlJDEoQ2xhc3MucHJvdG90eXBlLCB7XG4gICAgICBjb25zdHJ1Y3Rvcjoge1xuICAgICAgICB2YWx1ZTogV3JhcHBlcixcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gc2V0UHJvdG90eXBlT2YkMihXcmFwcGVyLCBzZXRQcm90b3R5cGVPZiQyKGZ1bmN0aW9uIFN1cGVyKCkge1xuICAgICAgcmV0dXJuIGNvbnN0cnVjdCQzKENsYXNzLCBhcmd1bWVudHMsIGdldFByb3RvdHlwZU9mJDIodGhpcykuY29uc3RydWN0b3IpO1xuICAgIH0sIENsYXNzKSk7XG4gIH07XG5cbiAgcmV0dXJuIF93cmFwTmF0aXZlU3VwZXIoQ2xhc3MpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IF93cmFwTmF0aXZlU3VwZXI7XG59KTtcblxudmFyIENvbXBvc2l0aW9uRXJyb3IkMSA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX0Vycm9yKSB7XG4gIGZ1bmN0aW9uIENvbXBvc2l0aW9uRXJyb3IoY2xhc3NJbnN0YW5jZSwgbWVzc2FnZSwgY29tcG9uZW50KSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgQ29tcG9zaXRpb25FcnJvcik7XG5cbiAgICBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgZ2V0UHJvdG90eXBlT2YkMihDb21wb3NpdGlvbkVycm9yKS5jYWxsKHRoaXMsIFwiQFwiLmNvbmNhdChjbGFzc0luc3RhbmNlLCBcIjogXCIpLmNvbmNhdChtZXNzYWdlKSkpO1xuXG4gICAgdmFyIHN0YWNrQXJyYXkgPSBfdGhpcy5zdGFjay5zcGxpdCgnXFxuJyk7XG5cbiAgICBzdGFja0FycmF5LnNwbGljZSgxLCAyKTtcbiAgICBfdGhpcy5zdGFjayA9IHN0YWNrQXJyYXkuam9pbignXFxuJyk7XG4gICAgaWYgKGNvbnNvbGUpIGNvbnNvbGUuZXJyb3IoJ0NvbXBvbmVudDonLCBjb21wb25lbnQpO1xuICAgIF90aGlzLm5hbWUgPSAnQ29tcG9zaXRpb25FcnJvcic7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgaW5oZXJpdHMoQ29tcG9zaXRpb25FcnJvciwgX0Vycm9yKTtcblxuICByZXR1cm4gQ29tcG9zaXRpb25FcnJvcjtcbn0od3JhcE5hdGl2ZVN1cGVyKEVycm9yKSk7XG52YXIgRGVwZW5kZW5jeUVycm9yID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfRXJyb3IyKSB7XG4gIGZ1bmN0aW9uIERlcGVuZGVuY3lFcnJvcihjbGFzc0luc3RhbmNlLCBtZXNzYWdlLCBhY3RpdmVNb2R1bGUpIHtcbiAgICB2YXIgX3RoaXMyO1xuXG4gICAgdmFyIGRlcGVuZGVuY3lNb2R1bGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IGZhbHNlO1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgRGVwZW5kZW5jeUVycm9yKTtcblxuICAgIF90aGlzMiA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgZ2V0UHJvdG90eXBlT2YkMihEZXBlbmRlbmN5RXJyb3IpLmNhbGwodGhpcywgXCJAXCIuY29uY2F0KGNsYXNzSW5zdGFuY2UsIFwiOiBcIikuY29uY2F0KG1lc3NhZ2UpKSk7XG5cbiAgICB2YXIgc3RhY2tBcnJheSA9IF90aGlzMi5zdGFjay5zcGxpdCgnXFxuJyk7XG5cbiAgICBzdGFja0FycmF5LnNwbGljZSgxLCAyKTtcbiAgICBfdGhpczIuc3RhY2sgPSBzdGFja0FycmF5LmpvaW4oJ1xcbicpO1xuICAgIGlmIChjb25zb2xlKSBjb25zb2xlLmVycm9yKCdBY3RpdmUgbW9kdWxlOicsIGFjdGl2ZU1vZHVsZSk7XG4gICAgaWYgKGNvbnNvbGUgJiYgZGVwZW5kZW5jeU1vZHVsZSkgY29uc29sZS5lcnJvcignRGVwZW5kZW5jeSBwdWJsaXNoZWQgYnkgbW9kdWxlOicsIGRlcGVuZGVuY3lNb2R1bGUpO1xuICAgIF90aGlzMi5uYW1lID0gJ0RlcGVuZGVuY3lFcnJvcic7XG4gICAgcmV0dXJuIF90aGlzMjtcbiAgfVxuXG4gIGluaGVyaXRzKERlcGVuZGVuY3lFcnJvciwgX0Vycm9yMik7XG5cbiAgcmV0dXJuIERlcGVuZGVuY3lFcnJvcjtcbn0od3JhcE5hdGl2ZVN1cGVyKEVycm9yKSk7XG52YXIgTWFuYWdlckVycm9yID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfRXJyb3IzKSB7XG4gIGZ1bmN0aW9uIE1hbmFnZXJFcnJvcihjbGFzc0luc3RhbmNlLCBtZXNzYWdlLCBjb21wb25lbnQpIHtcbiAgICB2YXIgX3RoaXMzO1xuXG4gICAgdmFyIGFjdGl2ZU1vZHVsZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDogZmFsc2U7XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBNYW5hZ2VyRXJyb3IpO1xuXG4gICAgX3RoaXMzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBnZXRQcm90b3R5cGVPZiQyKE1hbmFnZXJFcnJvcikuY2FsbCh0aGlzLCBcIkBcIi5jb25jYXQoY2xhc3NJbnN0YW5jZSwgXCI6IFwiKS5jb25jYXQobWVzc2FnZSkpKTtcblxuICAgIHZhciBzdGFja0FycmF5ID0gX3RoaXMzLnN0YWNrLnNwbGl0KCdcXG4nKTtcblxuICAgIHN0YWNrQXJyYXkuc3BsaWNlKDEsIDIpO1xuICAgIF90aGlzMy5zdGFjayA9IHN0YWNrQXJyYXkuam9pbignXFxuJyk7XG4gICAgaWYgKGNvbnNvbGUpIGNvbnNvbGUuZXJyb3IoJ0NvbXBvbmVudDonLCBjb21wb25lbnQpO1xuICAgIGlmIChjb25zb2xlICYmIGFjdGl2ZU1vZHVsZSkgY29uc29sZS5lcnJvcignQWN0aXZlIG1vZHVsZTonLCBhY3RpdmVNb2R1bGUpO1xuICAgIF90aGlzMy5uYW1lID0gJ01hbmFnZXJFcnJvcic7XG4gICAgcmV0dXJuIF90aGlzMztcbiAgfVxuXG4gIGluaGVyaXRzKE1hbmFnZXJFcnJvciwgX0Vycm9yMyk7XG5cbiAgcmV0dXJuIE1hbmFnZXJFcnJvcjtcbn0od3JhcE5hdGl2ZVN1cGVyKEVycm9yKSk7XG5cbnZhciB3YXJuRGVwcyA9IGZ1bmN0aW9uIHdhcm5EZXBzKCkge1xuICB0aHJvdyBuZXcgRXJyb3IoJ1doaXRlc3Rvcm1KUyBGcmFtZXdvcmsgcmVxdSBpcmVzIFRocmVlLmpzIHI5Mi4gaHR0cHM6Ly90aHJlZWpzLm9yZy8nKTtcbn07XG5cbnRyeSB7XG4gIGlmICghUkVWSVNJT04pIHdhcm5EZXBzKCk7XG59IGNhdGNoIChlcnIpIHtcbiAgd2FybkRlcHMoKTtcbn1cbi8qKlxuICogQGNsYXNzIE1vZHVsZVN5c3RlbVxuICogQGNhdGVnb3J5IGNvcmVcbiAqIEBkZXNjcmlwdGlvbiAgUHJvdmlkZXMgQVBJIGZvciBjbGFzc2VzIHRoYXQgd2lsbCB1c2UgTW9kdWxlcy48YnIvPlxuICogVGhpcyBjbGFzcyBpbmNsdWRlcyBiYXNpYyBldmVudCBzeXN0ZW0gd2l0aCB0aG9zZSBzdXBwb3J0ZWQgbWV0aG9kczpcbiAqIDxwcmU+Lm9uKCk8L3ByZT48cHJlPi5vZmYoKTwvcHJlPjxwcmU+LmVtaXQoKTwvcHJlPlxuICogQGV4dGVuZHMgRXZlbnRzXG4gKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmVcbiAqL1xuXG5cbnZhciBNb2R1bGVTeXN0ZW0gPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9FdmVudHMpIHtcbiAgZnVuY3Rpb24gTW9kdWxlU3lzdGVtKCkge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIE1vZHVsZVN5c3RlbSk7XG5cbiAgICByZXR1cm4gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBnZXRQcm90b3R5cGVPZiQyKE1vZHVsZVN5c3RlbSkuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gIH1cblxuICBjcmVhdGVDbGFzcyhNb2R1bGVTeXN0ZW0sIFt7XG4gICAga2V5OiBcImludGVncmF0ZU1vZHVsZXNcIixcbiAgICAvLyBJTlRFR1JBVElOR1xuXG4gICAgLyoqXG4gICAgICogQG1ldGhvZCBpbnRlZ3JhdGVNb2R1bGVzXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQGRlc2NyaXB0aW9uIFRoaXMgbWV0aG9kIGFwcGxpZXMgYWxsIG1vZHVsZXMgZnJvbSAubW9kdWxlcyBjb2xsZWN0aW9uLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbc291cmNlXSBJZiBzb3VyY2UgKHNob3VsZCBiZSBhIGNvbXBvbmVudCkgaXMgcHJvdmlkZWQsIHdpbGwgcmVwbGFjZSAubW9kdWxlcyB3aXRoIHNvdXJjZSdzIG9uZSBiZWZvcmUgZXhlY3V0aW5nIG1vZHVsZXMuXG4gICAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLk1vZHVsZVN5c3RlbVxuICAgICAqL1xuICAgIHZhbHVlOiBmdW5jdGlvbiBpbnRlZ3JhdGVNb2R1bGVzKHNvdXJjZSkge1xuICAgICAgaWYgKCF0aGlzLm1vZHVsZXMgJiYgIXNvdXJjZSkgcmV0dXJuO1xuICAgICAgaWYgKHNvdXJjZSAmJiBzb3VyY2UubW9kdWxlcykgdGhpcy5tb2R1bGVzID0gc291cmNlLm1vZHVsZXMuc2xpY2UoMCk7XG5cbiAgICAgIGlmICh0aGlzLm1vZHVsZXMpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIG1heCA9IHRoaXMubW9kdWxlcy5sZW5ndGg7IGkgPCBtYXg7IGkrKykge1xuICAgICAgICAgIHRoaXMuYXBwbHlNb2R1bGUodGhpcy5tb2R1bGVzW2ldLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHNvdXJjZSkgdGhpcy5hcHBseUJyaWRnZSh7XG4gICAgICAgIG9uQ29weTogc291cmNlXG4gICAgICB9KTtcbiAgICB9IC8vIEFQUExZSU5HIE1PRFVMRSAoLi4uYW5kIGEgXCJicmlkZ2VcIiBmb3IgbW9kdWxlKVxuXG4gICAgLyoqXG4gICAgICogQG1ldGhvZCBhcHBseUJyaWRnZVxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBkZXNjcmlwdGlvbiBNYWtlcyBjb21wb25lbnQtc3BlY2lmaWMgQVBJIHRvIHdvcmsgd2l0aCBtb2R1bGVzLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBicmlkZ2VNYXBcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IFJldHVybnMgb2JqZWN0IHdpdGggbW9kaWZpZWQgdmFsdWVzLlxuICAgICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZS5Nb2R1bGVTeXN0ZW1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImFwcGx5QnJpZGdlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFwcGx5QnJpZGdlKCkge1xuICAgICAgdmFyIGJyaWRnZU1hcCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgICB2YXIgbW9kdWxlcyA9IHRoaXMubW9kdWxlcztcbiAgICAgIGlmICghbW9kdWxlcykgcmV0dXJuIGJyaWRnZU1hcDtcblxuICAgICAgZm9yICh2YXIgaSA9IDAsIG1heCA9IG1vZHVsZXMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHtcbiAgICAgICAgZm9yICh2YXIga2V5IGluIGJyaWRnZU1hcCkge1xuICAgICAgICAgIGlmIChicmlkZ2VNYXBba2V5XSkge1xuICAgICAgICAgICAgdmFyIG1vZHVsZSA9IG1vZHVsZXNbaV07XG4gICAgICAgICAgICBpZiAobW9kdWxlICYmIG1vZHVsZS5icmlkZ2UgJiYgbW9kdWxlLmJyaWRnZVtrZXldKSBicmlkZ2VNYXBba2V5XSA9IG1vZHVsZS5icmlkZ2Vba2V5XS5hcHBseSh0aGlzLCBbYnJpZGdlTWFwW2tleV0sIG1vZHVsZV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gYnJpZGdlTWFwO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAbWV0aG9kIGFwcGx5Q29tbWFuZFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBkZXNjcmlwdGlvbiAuYXBwbHlDb21tYW5kIHJ1bnMgYSBtZXRob2QgY2FsbGVkIGBuYW1lYCBvbiBhbGwgbW9kdWxlcy5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZSB0aGUgbWV0aG9kIG5hbWUuXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NiPShmdW5jLCBtb2R1bGVTY29wZSkgPT4gZnVuYy5hcHBseSh0aGlzLCBbbW9kdWxlU2NvcGVdKV0gSG93IHRoZSBmdW5jdGlvbiBpcyB3cmFwcGVkL1xuICAgICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZS5Nb2R1bGVTeXN0ZW1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImFwcGx5Q29tbWFuZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhcHBseUNvbW1hbmQobmFtZSkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgdmFyIGNiID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBmdW5jdGlvbiAoZnVuYywgbW9kdWxlU2NvcGUpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkoX3RoaXMsIFttb2R1bGVTY29wZV0pO1xuICAgICAgfTtcbiAgICAgIHZhciBtb2R1bGVzID0gdGhpcy5tb2R1bGVzO1xuICAgICAgaWYgKCFtb2R1bGVzKSByZXR1cm47XG5cbiAgICAgIGZvciAodmFyIGkgPSAwLCBtYXggPSBtb2R1bGVzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7XG4gICAgICAgIHZhciBtb2R1bGUgPSBtb2R1bGVzW2ldO1xuICAgICAgICBpZiAobmFtZSBpbiBtb2R1bGUpIGNiKG1vZHVsZVtuYW1lXSwgbW9kdWxlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQG1ldGhvZCBhcHBseU1vZHVsZVxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBkZXNjcmlwdGlvbiAuYXBwbHlNb2R1bGUgaXMgYWxzbyB1c2VkIGluIC5pbnRlZ3JhdGVNb2R1bGVzKCkgZnVuY3Rpb24uXG4gICAgICogSXQgZG9lcyBleGFjdGx5IHdoYXQgaXRzIG5hbWUgc2F5cyAoYXBwbGllcyBtb2R1bGUgdG8gY29tcG9uZW50IG9yIGFwcCkuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG1vZHVsZSB0aGUgbW9kdWxlIHRvIGFwcGx5XG4gICAgICogQHBhcmFtIHtCb29sZWFufSBbcHVzaD10cnVlXVxuICAgICAqIEByZXR1cm4ge09iamVjdH0gUmV0dXJucyBtb2R1bGUgdGhhdCB3YXMgYXBwbGllZC5cbiAgICAgKiBAdGhyb3dzIHtNYW5hZ2VyRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLk1vZHVsZVN5c3RlbVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiYXBwbHlNb2R1bGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYXBwbHlNb2R1bGUobW9kdWxlKSB7XG4gICAgICB2YXIgcHVzaCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogdHJ1ZTtcbiAgICAgIGlmICghbW9kdWxlKSByZXR1cm47XG4gICAgICBpZiAocHVzaCAmJiB0aGlzLm1vZHVsZXMpIHRoaXMubW9kdWxlcy5wdXNoKG1vZHVsZSk7ZWxzZSBpZiAocHVzaCkgdGhpcy5tb2R1bGVzID0gW21vZHVsZV07XG4gICAgICBpZiAodGhpcy5tYW5hZ2VyKSB0aGlzLm1hbmFnZXIuYWN0aXZlKG1vZHVsZSk7XG4gICAgICBpZiAobW9kdWxlLm1hbmFnZXIgJiYgdGhpcy5tYW5hZ2VyKSBtb2R1bGUubWFuYWdlcih0aGlzLm1hbmFnZXIpO2Vsc2UgaWYgKG1vZHVsZS5tYW5hZ2VyKSB7XG4gICAgICAgIHRocm93IG5ldyBNYW5hZ2VyRXJyb3IoJ0NvbXBvbmVudCcsIFwiTW9kdWxlIHJlcXVpcmVzIE1vZHVsZU1hbmFnZXIgdGhhdCBpcyB0dXJuZWQgb2ZmIGZvciB0aGlzIGNvbXBvbmVudFwiLCB0aGlzLCBtb2R1bGUpO1xuICAgICAgfVxuICAgICAgaWYgKG1vZHVsZS5pbnRlZ3JhdGUpIG1vZHVsZS5pbnRlZ3JhdGUuYmluZCh0aGlzKShtb2R1bGUpO1xuICAgICAgcmV0dXJuIG1vZHVsZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQG1ldGhvZCBkaXNwb3NlTW9kdWxlc1xuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBkZXNjcmlwdGlvbiBEaXNwb3NlcyBvZiBhbGwgbW9kdWxlc1xuICAgICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZS5Nb2R1bGVTeXN0ZW1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImRpc3Bvc2VNb2R1bGVzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRpc3Bvc2VNb2R1bGVzKCkge1xuICAgICAgd2hpbGUgKHRoaXMubW9kdWxlcy5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5kaXNwb3NlTW9kdWxlKHRoaXMubW9kdWxlc1swXSk7XG4gICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBtZXRob2QgZGlzcG9zZU1vZHVsZVxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBkZXNjcmlwdGlvbiBEaXNwb3NlcyBvZiB0aGUgZ2l2ZW4gbW9kdWxlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG1vZHVsZSB0aGUgbW9kdWxlIHRvIGRpc3Bvc2VcbiAgICAgKiBAcmV0dXJuIHtNb2R1bGV9IFJldHVybnMgbW9kdWxlIHRoYXQgd2FzIHJlbW92ZWQuXG4gICAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLk1vZHVsZVN5c3RlbVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiZGlzcG9zZU1vZHVsZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkaXNwb3NlTW9kdWxlKG1vZHVsZSkge1xuICAgICAgaWYgKCFtb2R1bGUpIHJldHVybjtcbiAgICAgIHRoaXMubW9kdWxlcy5zcGxpY2UodGhpcy5tb2R1bGVzLmluZGV4T2YobW9kdWxlKSwgMSk7XG4gICAgICBpZiAobW9kdWxlLmRpc3Bvc2UpIG1vZHVsZS5kaXNwb3NlLmJpbmQodGhpcykobW9kdWxlKTtcbiAgICAgIHJldHVybiBtb2R1bGU7XG4gICAgfSAvLyBQSVBFRCBNRVRIT0RcblxuICAgIC8qKlxuICAgICAqIEBtZXRob2QgbW9kdWxlXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQGRlc2NyaXB0aW9uIHBpcGVkIHZlcnNpb24gb2YgLmFwcGx5TW9kdWxlKCkuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG1vZHVsZSB0aGUgbW9kdWxlIHRvIGFwcGx5XG4gICAgICogQHJldHVybiB7dGhpc30gcmV0dXJucyB0aGlzIC0gYXBwL2NvbXBvbmVudFxuICAgICAqIEB0aHJvd3Mge01hbmFnZXJFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmUuTW9kdWxlU3lzdGVtXG4gICAgICogQGV4YW1wbGUgPGNhcHRpb24+UGlwZWQgbW9kdWxlczwvY2FwdGlvbj5cbiAgICAgKiBjb21wb25lbnRcbiAgICAgKiAgIC5tb2R1bGUobmV3IE1vZHVsZTEoKSlcbiAgICAgKiAgIC5tb2R1bGUobmV3IE1vZHVsZTIoKSlcbiAgICAgKiAgIC5tb2R1bGUobmV3IE1vZHVsZTMoKSlcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIm1vZHVsZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBtb2R1bGUoX21vZHVsZSkge1xuICAgICAgdGhpcy5hcHBseU1vZHVsZShfbW9kdWxlKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgfV0pO1xuXG4gIGluaGVyaXRzKE1vZHVsZVN5c3RlbSwgX0V2ZW50cyk7XG5cbiAgcmV0dXJuIE1vZHVsZVN5c3RlbTtcbn0obWluaXZlbnRzX2NvbW1vbmpzKTtcblxuZnVuY3Rpb24gX2FycmF5V2l0aEhvbGVzKGFycikge1xuICBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gYXJyO1xufVxuXG52YXIgYXJyYXlXaXRoSG9sZXMgPSBfYXJyYXlXaXRoSG9sZXM7XG5cbnZhciBjb3JlX2dldEl0ZXJhdG9yID0gX2NvcmUuZ2V0SXRlcmF0b3IgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIGl0ZXJGbiA9IGNvcmVfZ2V0SXRlcmF0b3JNZXRob2QoaXQpO1xuICBpZiAodHlwZW9mIGl0ZXJGbiAhPSAnZnVuY3Rpb24nKSB0aHJvdyBUeXBlRXJyb3IoaXQgKyAnIGlzIG5vdCBpdGVyYWJsZSEnKTtcbiAgcmV0dXJuIF9hbk9iamVjdChpdGVyRm4uY2FsbChpdCkpO1xufTtcblxudmFyIGdldEl0ZXJhdG9yID0gY29yZV9nZXRJdGVyYXRvcjtcblxudmFyIGdldEl0ZXJhdG9yJDEgPSBnZXRJdGVyYXRvcjtcblxuZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheUxpbWl0KGFyciwgaSkge1xuICB2YXIgX2FyciA9IFtdO1xuICB2YXIgX24gPSB0cnVlO1xuICB2YXIgX2QgPSBmYWxzZTtcbiAgdmFyIF9lID0gdW5kZWZpbmVkO1xuXG4gIHRyeSB7XG4gICAgZm9yICh2YXIgX2kgPSBnZXRJdGVyYXRvciQxKGFyciksIF9zOyAhKF9uID0gKF9zID0gX2kubmV4dCgpKS5kb25lKTsgX24gPSB0cnVlKSB7XG4gICAgICBfYXJyLnB1c2goX3MudmFsdWUpO1xuXG4gICAgICBpZiAoaSAmJiBfYXJyLmxlbmd0aCA9PT0gaSkgYnJlYWs7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBfZCA9IHRydWU7XG4gICAgX2UgPSBlcnI7XG4gIH0gZmluYWxseSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICghX24gJiYgX2lbXCJyZXR1cm5cIl0gIT0gbnVsbCkgX2lbXCJyZXR1cm5cIl0oKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKF9kKSB0aHJvdyBfZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gX2Fycjtcbn1cblxudmFyIGl0ZXJhYmxlVG9BcnJheUxpbWl0ID0gX2l0ZXJhYmxlVG9BcnJheUxpbWl0O1xuXG5mdW5jdGlvbiBfbm9uSXRlcmFibGVSZXN0KCkge1xuICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIGRlc3RydWN0dXJlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZVwiKTtcbn1cblxudmFyIG5vbkl0ZXJhYmxlUmVzdCA9IF9ub25JdGVyYWJsZVJlc3Q7XG5cbmZ1bmN0aW9uIF9zbGljZWRUb0FycmF5KGFyciwgaSkge1xuICByZXR1cm4gYXJyYXlXaXRoSG9sZXMoYXJyKSB8fCBpdGVyYWJsZVRvQXJyYXlMaW1pdChhcnIsIGkpIHx8IG5vbkl0ZXJhYmxlUmVzdCgpO1xufVxuXG52YXIgc2xpY2VkVG9BcnJheSA9IF9zbGljZWRUb0FycmF5O1xuXG5mdW5jdGlvbiBzeW1ib2xPYnNlcnZhYmxlUG9ueWZpbGwocm9vdCkge1xuXHR2YXIgcmVzdWx0O1xuXHR2YXIgU3ltYm9sID0gcm9vdC5TeW1ib2w7XG5cblx0aWYgKHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicpIHtcblx0XHRpZiAoU3ltYm9sLm9ic2VydmFibGUpIHtcblx0XHRcdHJlc3VsdCA9IFN5bWJvbC5vYnNlcnZhYmxlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXN1bHQgPSBTeW1ib2woJ29ic2VydmFibGUnKTtcblx0XHRcdFN5bWJvbC5vYnNlcnZhYmxlID0gcmVzdWx0O1xuXHRcdH1cblx0fSBlbHNlIHtcblx0XHRyZXN1bHQgPSAnQEBvYnNlcnZhYmxlJztcblx0fVxuXG5cdHJldHVybiByZXN1bHQ7XG59XG5cbi8qIGdsb2JhbCB3aW5kb3cgKi9cblxudmFyIHJvb3Q7XG5cbmlmICh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgcm9vdCA9IHNlbGY7XG59IGVsc2UgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gIHJvb3QgPSB3aW5kb3c7XG59IGVsc2UgaWYgKHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnKSB7XG4gIHJvb3QgPSBnbG9iYWw7XG59IGVsc2UgaWYgKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnKSB7XG4gIHJvb3QgPSBtb2R1bGU7XG59IGVsc2Uge1xuICByb290ID0gRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcbn1cblxudmFyIHJlc3VsdCA9IHN5bWJvbE9ic2VydmFibGVQb255ZmlsbChyb290KTtcblxuLyoqXG4gKiBUaGVzZSBhcmUgcHJpdmF0ZSBhY3Rpb24gdHlwZXMgcmVzZXJ2ZWQgYnkgUmVkdXguXG4gKiBGb3IgYW55IHVua25vd24gYWN0aW9ucywgeW91IG11c3QgcmV0dXJuIHRoZSBjdXJyZW50IHN0YXRlLlxuICogSWYgdGhlIGN1cnJlbnQgc3RhdGUgaXMgdW5kZWZpbmVkLCB5b3UgbXVzdCByZXR1cm4gdGhlIGluaXRpYWwgc3RhdGUuXG4gKiBEbyBub3QgcmVmZXJlbmNlIHRoZXNlIGFjdGlvbiB0eXBlcyBkaXJlY3RseSBpbiB5b3VyIGNvZGUuXG4gKi9cbnZhciBBY3Rpb25UeXBlcyA9IHtcbiAgSU5JVDogJ0BAcmVkdXgvSU5JVCcgKyBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoNykuc3BsaXQoJycpLmpvaW4oJy4nKSxcbiAgUkVQTEFDRTogJ0BAcmVkdXgvUkVQTEFDRScgKyBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoNykuc3BsaXQoJycpLmpvaW4oJy4nKVxufTtcblxudmFyIF90eXBlb2YgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIiA/IGZ1bmN0aW9uIChvYmopIHtcbiAgcmV0dXJuIHR5cGVvZiBvYmo7XG59IDogZnVuY3Rpb24gKG9iaikge1xuICByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajtcbn07XG5cbi8qKlxuICogQHBhcmFtIHthbnl9IG9iaiBUaGUgb2JqZWN0IHRvIGluc3BlY3QuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgYXJndW1lbnQgYXBwZWFycyB0byBiZSBhIHBsYWluIG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gaXNQbGFpbk9iamVjdChvYmopIHtcbiAgaWYgKCh0eXBlb2Ygb2JqID09PSAndW5kZWZpbmVkJyA/ICd1bmRlZmluZWQnIDogX3R5cGVvZihvYmopKSAhPT0gJ29iamVjdCcgfHwgb2JqID09PSBudWxsKSByZXR1cm4gZmFsc2U7XG5cbiAgdmFyIHByb3RvID0gb2JqO1xuICB3aGlsZSAoT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvKSAhPT0gbnVsbCkge1xuICAgIHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvKTtcbiAgfVxuXG4gIHJldHVybiBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqKSA9PT0gcHJvdG87XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIFJlZHV4IHN0b3JlIHRoYXQgaG9sZHMgdGhlIHN0YXRlIHRyZWUuXG4gKiBUaGUgb25seSB3YXkgdG8gY2hhbmdlIHRoZSBkYXRhIGluIHRoZSBzdG9yZSBpcyB0byBjYWxsIGBkaXNwYXRjaCgpYCBvbiBpdC5cbiAqXG4gKiBUaGVyZSBzaG91bGQgb25seSBiZSBhIHNpbmdsZSBzdG9yZSBpbiB5b3VyIGFwcC4gVG8gc3BlY2lmeSBob3cgZGlmZmVyZW50XG4gKiBwYXJ0cyBvZiB0aGUgc3RhdGUgdHJlZSByZXNwb25kIHRvIGFjdGlvbnMsIHlvdSBtYXkgY29tYmluZSBzZXZlcmFsIHJlZHVjZXJzXG4gKiBpbnRvIGEgc2luZ2xlIHJlZHVjZXIgZnVuY3Rpb24gYnkgdXNpbmcgYGNvbWJpbmVSZWR1Y2Vyc2AuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcmVkdWNlciBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgbmV4dCBzdGF0ZSB0cmVlLCBnaXZlblxuICogdGhlIGN1cnJlbnQgc3RhdGUgdHJlZSBhbmQgdGhlIGFjdGlvbiB0byBoYW5kbGUuXG4gKlxuICogQHBhcmFtIHthbnl9IFtwcmVsb2FkZWRTdGF0ZV0gVGhlIGluaXRpYWwgc3RhdGUuIFlvdSBtYXkgb3B0aW9uYWxseSBzcGVjaWZ5IGl0XG4gKiB0byBoeWRyYXRlIHRoZSBzdGF0ZSBmcm9tIHRoZSBzZXJ2ZXIgaW4gdW5pdmVyc2FsIGFwcHMsIG9yIHRvIHJlc3RvcmUgYVxuICogcHJldmlvdXNseSBzZXJpYWxpemVkIHVzZXIgc2Vzc2lvbi5cbiAqIElmIHlvdSB1c2UgYGNvbWJpbmVSZWR1Y2Vyc2AgdG8gcHJvZHVjZSB0aGUgcm9vdCByZWR1Y2VyIGZ1bmN0aW9uLCB0aGlzIG11c3QgYmVcbiAqIGFuIG9iamVjdCB3aXRoIHRoZSBzYW1lIHNoYXBlIGFzIGBjb21iaW5lUmVkdWNlcnNgIGtleXMuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW2VuaGFuY2VyXSBUaGUgc3RvcmUgZW5oYW5jZXIuIFlvdSBtYXkgb3B0aW9uYWxseSBzcGVjaWZ5IGl0XG4gKiB0byBlbmhhbmNlIHRoZSBzdG9yZSB3aXRoIHRoaXJkLXBhcnR5IGNhcGFiaWxpdGllcyBzdWNoIGFzIG1pZGRsZXdhcmUsXG4gKiB0aW1lIHRyYXZlbCwgcGVyc2lzdGVuY2UsIGV0Yy4gVGhlIG9ubHkgc3RvcmUgZW5oYW5jZXIgdGhhdCBzaGlwcyB3aXRoIFJlZHV4XG4gKiBpcyBgYXBwbHlNaWRkbGV3YXJlKClgLlxuICpcbiAqIEByZXR1cm5zIHtTdG9yZX0gQSBSZWR1eCBzdG9yZSB0aGF0IGxldHMgeW91IHJlYWQgdGhlIHN0YXRlLCBkaXNwYXRjaCBhY3Rpb25zXG4gKiBhbmQgc3Vic2NyaWJlIHRvIGNoYW5nZXMuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVN0b3JlKHJlZHVjZXIsIHByZWxvYWRlZFN0YXRlLCBlbmhhbmNlcikge1xuICB2YXIgX3JlZjI7XG5cbiAgaWYgKHR5cGVvZiBwcmVsb2FkZWRTdGF0ZSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgZW5oYW5jZXIgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgZW5oYW5jZXIgPSBwcmVsb2FkZWRTdGF0ZTtcbiAgICBwcmVsb2FkZWRTdGF0ZSA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGlmICh0eXBlb2YgZW5oYW5jZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgaWYgKHR5cGVvZiBlbmhhbmNlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCB0aGUgZW5oYW5jZXIgdG8gYmUgYSBmdW5jdGlvbi4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZW5oYW5jZXIoY3JlYXRlU3RvcmUpKHJlZHVjZXIsIHByZWxvYWRlZFN0YXRlKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgcmVkdWNlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgdGhlIHJlZHVjZXIgdG8gYmUgYSBmdW5jdGlvbi4nKTtcbiAgfVxuXG4gIHZhciBjdXJyZW50UmVkdWNlciA9IHJlZHVjZXI7XG4gIHZhciBjdXJyZW50U3RhdGUgPSBwcmVsb2FkZWRTdGF0ZTtcbiAgdmFyIGN1cnJlbnRMaXN0ZW5lcnMgPSBbXTtcbiAgdmFyIG5leHRMaXN0ZW5lcnMgPSBjdXJyZW50TGlzdGVuZXJzO1xuICB2YXIgaXNEaXNwYXRjaGluZyA9IGZhbHNlO1xuXG4gIGZ1bmN0aW9uIGVuc3VyZUNhbk11dGF0ZU5leHRMaXN0ZW5lcnMoKSB7XG4gICAgaWYgKG5leHRMaXN0ZW5lcnMgPT09IGN1cnJlbnRMaXN0ZW5lcnMpIHtcbiAgICAgIG5leHRMaXN0ZW5lcnMgPSBjdXJyZW50TGlzdGVuZXJzLnNsaWNlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlYWRzIHRoZSBzdGF0ZSB0cmVlIG1hbmFnZWQgYnkgdGhlIHN0b3JlLlxuICAgKlxuICAgKiBAcmV0dXJucyB7YW55fSBUaGUgY3VycmVudCBzdGF0ZSB0cmVlIG9mIHlvdXIgYXBwbGljYXRpb24uXG4gICAqL1xuICBmdW5jdGlvbiBnZXRTdGF0ZSgpIHtcbiAgICBpZiAoaXNEaXNwYXRjaGluZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgbWF5IG5vdCBjYWxsIHN0b3JlLmdldFN0YXRlKCkgd2hpbGUgdGhlIHJlZHVjZXIgaXMgZXhlY3V0aW5nLiAnICsgJ1RoZSByZWR1Y2VyIGhhcyBhbHJlYWR5IHJlY2VpdmVkIHRoZSBzdGF0ZSBhcyBhbiBhcmd1bWVudC4gJyArICdQYXNzIGl0IGRvd24gZnJvbSB0aGUgdG9wIHJlZHVjZXIgaW5zdGVhZCBvZiByZWFkaW5nIGl0IGZyb20gdGhlIHN0b3JlLicpO1xuICAgIH1cblxuICAgIHJldHVybiBjdXJyZW50U3RhdGU7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGNoYW5nZSBsaXN0ZW5lci4gSXQgd2lsbCBiZSBjYWxsZWQgYW55IHRpbWUgYW4gYWN0aW9uIGlzIGRpc3BhdGNoZWQsXG4gICAqIGFuZCBzb21lIHBhcnQgb2YgdGhlIHN0YXRlIHRyZWUgbWF5IHBvdGVudGlhbGx5IGhhdmUgY2hhbmdlZC4gWW91IG1heSB0aGVuXG4gICAqIGNhbGwgYGdldFN0YXRlKClgIHRvIHJlYWQgdGhlIGN1cnJlbnQgc3RhdGUgdHJlZSBpbnNpZGUgdGhlIGNhbGxiYWNrLlxuICAgKlxuICAgKiBZb3UgbWF5IGNhbGwgYGRpc3BhdGNoKClgIGZyb20gYSBjaGFuZ2UgbGlzdGVuZXIsIHdpdGggdGhlIGZvbGxvd2luZ1xuICAgKiBjYXZlYXRzOlxuICAgKlxuICAgKiAxLiBUaGUgc3Vic2NyaXB0aW9ucyBhcmUgc25hcHNob3R0ZWQganVzdCBiZWZvcmUgZXZlcnkgYGRpc3BhdGNoKClgIGNhbGwuXG4gICAqIElmIHlvdSBzdWJzY3JpYmUgb3IgdW5zdWJzY3JpYmUgd2hpbGUgdGhlIGxpc3RlbmVycyBhcmUgYmVpbmcgaW52b2tlZCwgdGhpc1xuICAgKiB3aWxsIG5vdCBoYXZlIGFueSBlZmZlY3Qgb24gdGhlIGBkaXNwYXRjaCgpYCB0aGF0IGlzIGN1cnJlbnRseSBpbiBwcm9ncmVzcy5cbiAgICogSG93ZXZlciwgdGhlIG5leHQgYGRpc3BhdGNoKClgIGNhbGwsIHdoZXRoZXIgbmVzdGVkIG9yIG5vdCwgd2lsbCB1c2UgYSBtb3JlXG4gICAqIHJlY2VudCBzbmFwc2hvdCBvZiB0aGUgc3Vic2NyaXB0aW9uIGxpc3QuXG4gICAqXG4gICAqIDIuIFRoZSBsaXN0ZW5lciBzaG91bGQgbm90IGV4cGVjdCB0byBzZWUgYWxsIHN0YXRlIGNoYW5nZXMsIGFzIHRoZSBzdGF0ZVxuICAgKiBtaWdodCBoYXZlIGJlZW4gdXBkYXRlZCBtdWx0aXBsZSB0aW1lcyBkdXJpbmcgYSBuZXN0ZWQgYGRpc3BhdGNoKClgIGJlZm9yZVxuICAgKiB0aGUgbGlzdGVuZXIgaXMgY2FsbGVkLiBJdCBpcywgaG93ZXZlciwgZ3VhcmFudGVlZCB0aGF0IGFsbCBzdWJzY3JpYmVyc1xuICAgKiByZWdpc3RlcmVkIGJlZm9yZSB0aGUgYGRpc3BhdGNoKClgIHN0YXJ0ZWQgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUgbGF0ZXN0XG4gICAqIHN0YXRlIGJ5IHRoZSB0aW1lIGl0IGV4aXRzLlxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lciBBIGNhbGxiYWNrIHRvIGJlIGludm9rZWQgb24gZXZlcnkgZGlzcGF0Y2guXG4gICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gQSBmdW5jdGlvbiB0byByZW1vdmUgdGhpcyBjaGFuZ2UgbGlzdGVuZXIuXG4gICAqL1xuICBmdW5jdGlvbiBzdWJzY3JpYmUobGlzdGVuZXIpIHtcbiAgICBpZiAodHlwZW9mIGxpc3RlbmVyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0V4cGVjdGVkIHRoZSBsaXN0ZW5lciB0byBiZSBhIGZ1bmN0aW9uLicpO1xuICAgIH1cblxuICAgIGlmIChpc0Rpc3BhdGNoaW5nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1lvdSBtYXkgbm90IGNhbGwgc3RvcmUuc3Vic2NyaWJlKCkgd2hpbGUgdGhlIHJlZHVjZXIgaXMgZXhlY3V0aW5nLiAnICsgJ0lmIHlvdSB3b3VsZCBsaWtlIHRvIGJlIG5vdGlmaWVkIGFmdGVyIHRoZSBzdG9yZSBoYXMgYmVlbiB1cGRhdGVkLCBzdWJzY3JpYmUgZnJvbSBhICcgKyAnY29tcG9uZW50IGFuZCBpbnZva2Ugc3RvcmUuZ2V0U3RhdGUoKSBpbiB0aGUgY2FsbGJhY2sgdG8gYWNjZXNzIHRoZSBsYXRlc3Qgc3RhdGUuICcgKyAnU2VlIGh0dHBzOi8vcmVkdXguanMub3JnL2FwaS1yZWZlcmVuY2Uvc3RvcmUjc3Vic2NyaWJlKGxpc3RlbmVyKSBmb3IgbW9yZSBkZXRhaWxzLicpO1xuICAgIH1cblxuICAgIHZhciBpc1N1YnNjcmliZWQgPSB0cnVlO1xuXG4gICAgZW5zdXJlQ2FuTXV0YXRlTmV4dExpc3RlbmVycygpO1xuICAgIG5leHRMaXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gdW5zdWJzY3JpYmUoKSB7XG4gICAgICBpZiAoIWlzU3Vic2NyaWJlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0Rpc3BhdGNoaW5nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignWW91IG1heSBub3QgdW5zdWJzY3JpYmUgZnJvbSBhIHN0b3JlIGxpc3RlbmVyIHdoaWxlIHRoZSByZWR1Y2VyIGlzIGV4ZWN1dGluZy4gJyArICdTZWUgaHR0cHM6Ly9yZWR1eC5qcy5vcmcvYXBpLXJlZmVyZW5jZS9zdG9yZSNzdWJzY3JpYmUobGlzdGVuZXIpIGZvciBtb3JlIGRldGFpbHMuJyk7XG4gICAgICB9XG5cbiAgICAgIGlzU3Vic2NyaWJlZCA9IGZhbHNlO1xuXG4gICAgICBlbnN1cmVDYW5NdXRhdGVOZXh0TGlzdGVuZXJzKCk7XG4gICAgICB2YXIgaW5kZXggPSBuZXh0TGlzdGVuZXJzLmluZGV4T2YobGlzdGVuZXIpO1xuICAgICAgbmV4dExpc3RlbmVycy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRGlzcGF0Y2hlcyBhbiBhY3Rpb24uIEl0IGlzIHRoZSBvbmx5IHdheSB0byB0cmlnZ2VyIGEgc3RhdGUgY2hhbmdlLlxuICAgKlxuICAgKiBUaGUgYHJlZHVjZXJgIGZ1bmN0aW9uLCB1c2VkIHRvIGNyZWF0ZSB0aGUgc3RvcmUsIHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlXG4gICAqIGN1cnJlbnQgc3RhdGUgdHJlZSBhbmQgdGhlIGdpdmVuIGBhY3Rpb25gLiBJdHMgcmV0dXJuIHZhbHVlIHdpbGxcbiAgICogYmUgY29uc2lkZXJlZCB0aGUgKipuZXh0Kiogc3RhdGUgb2YgdGhlIHRyZWUsIGFuZCB0aGUgY2hhbmdlIGxpc3RlbmVyc1xuICAgKiB3aWxsIGJlIG5vdGlmaWVkLlxuICAgKlxuICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvbmx5IHN1cHBvcnRzIHBsYWluIG9iamVjdCBhY3Rpb25zLiBJZiB5b3Ugd2FudCB0b1xuICAgKiBkaXNwYXRjaCBhIFByb21pc2UsIGFuIE9ic2VydmFibGUsIGEgdGh1bmssIG9yIHNvbWV0aGluZyBlbHNlLCB5b3UgbmVlZCB0b1xuICAgKiB3cmFwIHlvdXIgc3RvcmUgY3JlYXRpbmcgZnVuY3Rpb24gaW50byB0aGUgY29ycmVzcG9uZGluZyBtaWRkbGV3YXJlLiBGb3JcbiAgICogZXhhbXBsZSwgc2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGUgYHJlZHV4LXRodW5rYCBwYWNrYWdlLiBFdmVuIHRoZVxuICAgKiBtaWRkbGV3YXJlIHdpbGwgZXZlbnR1YWxseSBkaXNwYXRjaCBwbGFpbiBvYmplY3QgYWN0aW9ucyB1c2luZyB0aGlzIG1ldGhvZC5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IGFjdGlvbiBBIHBsYWluIG9iamVjdCByZXByZXNlbnRpbmcg4oCcd2hhdCBjaGFuZ2Vk4oCdLiBJdCBpc1xuICAgKiBhIGdvb2QgaWRlYSB0byBrZWVwIGFjdGlvbnMgc2VyaWFsaXphYmxlIHNvIHlvdSBjYW4gcmVjb3JkIGFuZCByZXBsYXkgdXNlclxuICAgKiBzZXNzaW9ucywgb3IgdXNlIHRoZSB0aW1lIHRyYXZlbGxpbmcgYHJlZHV4LWRldnRvb2xzYC4gQW4gYWN0aW9uIG11c3QgaGF2ZVxuICAgKiBhIGB0eXBlYCBwcm9wZXJ0eSB3aGljaCBtYXkgbm90IGJlIGB1bmRlZmluZWRgLiBJdCBpcyBhIGdvb2QgaWRlYSB0byB1c2VcbiAgICogc3RyaW5nIGNvbnN0YW50cyBmb3IgYWN0aW9uIHR5cGVzLlxuICAgKlxuICAgKiBAcmV0dXJucyB7T2JqZWN0fSBGb3IgY29udmVuaWVuY2UsIHRoZSBzYW1lIGFjdGlvbiBvYmplY3QgeW91IGRpc3BhdGNoZWQuXG4gICAqXG4gICAqIE5vdGUgdGhhdCwgaWYgeW91IHVzZSBhIGN1c3RvbSBtaWRkbGV3YXJlLCBpdCBtYXkgd3JhcCBgZGlzcGF0Y2goKWAgdG9cbiAgICogcmV0dXJuIHNvbWV0aGluZyBlbHNlIChmb3IgZXhhbXBsZSwgYSBQcm9taXNlIHlvdSBjYW4gYXdhaXQpLlxuICAgKi9cbiAgZnVuY3Rpb24gZGlzcGF0Y2goYWN0aW9uKSB7XG4gICAgaWYgKCFpc1BsYWluT2JqZWN0KGFjdGlvbikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQWN0aW9ucyBtdXN0IGJlIHBsYWluIG9iamVjdHMuICcgKyAnVXNlIGN1c3RvbSBtaWRkbGV3YXJlIGZvciBhc3luYyBhY3Rpb25zLicpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgYWN0aW9uLnR5cGUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FjdGlvbnMgbWF5IG5vdCBoYXZlIGFuIHVuZGVmaW5lZCBcInR5cGVcIiBwcm9wZXJ0eS4gJyArICdIYXZlIHlvdSBtaXNzcGVsbGVkIGEgY29uc3RhbnQ/Jyk7XG4gICAgfVxuXG4gICAgaWYgKGlzRGlzcGF0Y2hpbmcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUmVkdWNlcnMgbWF5IG5vdCBkaXNwYXRjaCBhY3Rpb25zLicpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBpc0Rpc3BhdGNoaW5nID0gdHJ1ZTtcbiAgICAgIGN1cnJlbnRTdGF0ZSA9IGN1cnJlbnRSZWR1Y2VyKGN1cnJlbnRTdGF0ZSwgYWN0aW9uKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaXNEaXNwYXRjaGluZyA9IGZhbHNlO1xuICAgIH1cblxuICAgIHZhciBsaXN0ZW5lcnMgPSBjdXJyZW50TGlzdGVuZXJzID0gbmV4dExpc3RlbmVycztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGxpc3RlbmVyID0gbGlzdGVuZXJzW2ldO1xuICAgICAgbGlzdGVuZXIoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWN0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcGxhY2VzIHRoZSByZWR1Y2VyIGN1cnJlbnRseSB1c2VkIGJ5IHRoZSBzdG9yZSB0byBjYWxjdWxhdGUgdGhlIHN0YXRlLlxuICAgKlxuICAgKiBZb3UgbWlnaHQgbmVlZCB0aGlzIGlmIHlvdXIgYXBwIGltcGxlbWVudHMgY29kZSBzcGxpdHRpbmcgYW5kIHlvdSB3YW50IHRvXG4gICAqIGxvYWQgc29tZSBvZiB0aGUgcmVkdWNlcnMgZHluYW1pY2FsbHkuIFlvdSBtaWdodCBhbHNvIG5lZWQgdGhpcyBpZiB5b3VcbiAgICogaW1wbGVtZW50IGEgaG90IHJlbG9hZGluZyBtZWNoYW5pc20gZm9yIFJlZHV4LlxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBuZXh0UmVkdWNlciBUaGUgcmVkdWNlciBmb3IgdGhlIHN0b3JlIHRvIHVzZSBpbnN0ZWFkLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGZ1bmN0aW9uIHJlcGxhY2VSZWR1Y2VyKG5leHRSZWR1Y2VyKSB7XG4gICAgaWYgKHR5cGVvZiBuZXh0UmVkdWNlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCB0aGUgbmV4dFJlZHVjZXIgdG8gYmUgYSBmdW5jdGlvbi4nKTtcbiAgICB9XG5cbiAgICBjdXJyZW50UmVkdWNlciA9IG5leHRSZWR1Y2VyO1xuICAgIGRpc3BhdGNoKHsgdHlwZTogQWN0aW9uVHlwZXMuUkVQTEFDRSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnRlcm9wZXJhYmlsaXR5IHBvaW50IGZvciBvYnNlcnZhYmxlL3JlYWN0aXZlIGxpYnJhcmllcy5cbiAgICogQHJldHVybnMge29ic2VydmFibGV9IEEgbWluaW1hbCBvYnNlcnZhYmxlIG9mIHN0YXRlIGNoYW5nZXMuXG4gICAqIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgdGhlIG9ic2VydmFibGUgcHJvcG9zYWw6XG4gICAqIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLW9ic2VydmFibGVcbiAgICovXG4gIGZ1bmN0aW9uIG9ic2VydmFibGUoKSB7XG4gICAgdmFyIF9yZWY7XG5cbiAgICB2YXIgb3V0ZXJTdWJzY3JpYmUgPSBzdWJzY3JpYmU7XG4gICAgcmV0dXJuIF9yZWYgPSB7XG4gICAgICAvKipcbiAgICAgICAqIFRoZSBtaW5pbWFsIG9ic2VydmFibGUgc3Vic2NyaXB0aW9uIG1ldGhvZC5cbiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYnNlcnZlciBBbnkgb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgYXMgYW4gb2JzZXJ2ZXIuXG4gICAgICAgKiBUaGUgb2JzZXJ2ZXIgb2JqZWN0IHNob3VsZCBoYXZlIGEgYG5leHRgIG1ldGhvZC5cbiAgICAgICAqIEByZXR1cm5zIHtzdWJzY3JpcHRpb259IEFuIG9iamVjdCB3aXRoIGFuIGB1bnN1YnNjcmliZWAgbWV0aG9kIHRoYXQgY2FuXG4gICAgICAgKiBiZSB1c2VkIHRvIHVuc3Vic2NyaWJlIHRoZSBvYnNlcnZhYmxlIGZyb20gdGhlIHN0b3JlLCBhbmQgcHJldmVudCBmdXJ0aGVyXG4gICAgICAgKiBlbWlzc2lvbiBvZiB2YWx1ZXMgZnJvbSB0aGUgb2JzZXJ2YWJsZS5cbiAgICAgICAqL1xuICAgICAgc3Vic2NyaWJlOiBmdW5jdGlvbiBzdWJzY3JpYmUob2JzZXJ2ZXIpIHtcbiAgICAgICAgaWYgKCh0eXBlb2Ygb2JzZXJ2ZXIgPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKG9ic2VydmVyKSkgIT09ICdvYmplY3QnIHx8IG9ic2VydmVyID09PSBudWxsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgdGhlIG9ic2VydmVyIHRvIGJlIGFuIG9iamVjdC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIG9ic2VydmVTdGF0ZSgpIHtcbiAgICAgICAgICBpZiAob2JzZXJ2ZXIubmV4dCkge1xuICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChnZXRTdGF0ZSgpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBvYnNlcnZlU3RhdGUoKTtcbiAgICAgICAgdmFyIHVuc3Vic2NyaWJlID0gb3V0ZXJTdWJzY3JpYmUob2JzZXJ2ZVN0YXRlKTtcbiAgICAgICAgcmV0dXJuIHsgdW5zdWJzY3JpYmU6IHVuc3Vic2NyaWJlIH07XG4gICAgICB9XG4gICAgfSwgX3JlZltyZXN1bHRdID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSwgX3JlZjtcbiAgfVxuXG4gIC8vIFdoZW4gYSBzdG9yZSBpcyBjcmVhdGVkLCBhbiBcIklOSVRcIiBhY3Rpb24gaXMgZGlzcGF0Y2hlZCBzbyB0aGF0IGV2ZXJ5XG4gIC8vIHJlZHVjZXIgcmV0dXJucyB0aGVpciBpbml0aWFsIHN0YXRlLiBUaGlzIGVmZmVjdGl2ZWx5IHBvcHVsYXRlc1xuICAvLyB0aGUgaW5pdGlhbCBzdGF0ZSB0cmVlLlxuICBkaXNwYXRjaCh7IHR5cGU6IEFjdGlvblR5cGVzLklOSVQgfSk7XG5cbiAgcmV0dXJuIF9yZWYyID0ge1xuICAgIGRpc3BhdGNoOiBkaXNwYXRjaCxcbiAgICBzdWJzY3JpYmU6IHN1YnNjcmliZSxcbiAgICBnZXRTdGF0ZTogZ2V0U3RhdGUsXG4gICAgcmVwbGFjZVJlZHVjZXI6IHJlcGxhY2VSZWR1Y2VyXG4gIH0sIF9yZWYyW3Jlc3VsdF0gPSBvYnNlcnZhYmxlLCBfcmVmMjtcbn1cblxuLyoqXG4gKiBAY2xhc3MgTW9kdWxlTWFuYWdlclxuICogQGNhdGVnb3J5IGNvcmVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgaGFuZGxlclxuICogQGRlc2NyaXB0aW9uICBTb2x2ZXMgbW9kdWxlcyBkZXBlbmRlbmNpZXNcbiAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZVxuICovXG5cbnZhciBNb2R1bGVNYW5hZ2VyID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gTW9kdWxlTWFuYWdlcihvYmplY3QpIHtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBNb2R1bGVNYW5hZ2VyKTtcblxuICAgIHRoaXMuaGFuZGxlciA9IG9iamVjdDtcbiAgICB0aGlzLmN1cnJlbnRNb2R1bGUgPSBudWxsO1xuICAgIHRoaXMuc3RvcmUgPSBjcmVhdGVTdG9yZShmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgc3RhdGUgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IFt7fSwgJyddO1xuICAgICAgdmFyIGFjdGlvbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkO1xuICAgICAgc3RhdGVbMF1bYWN0aW9uLmtleV0gPSBhY3Rpb24uZGF0YTtcbiAgICAgIHN0YXRlWzFdID0gYWN0aW9uLmtleTtcbiAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9KTtcbiAgICB0aGlzLm1vZHVsZXMgPSB7fTtcbiAgfVxuICAvKipcbiAgICogQG1ldGhvZCBhY3RpdmVcbiAgICogQGluc3RhbmNlXG4gICAqIEBkZXNjcmlwdGlvbiBTZXRzIC5jdXJyZW50TW9kdWxlIHRvIHByb3ZpZGVkIG1vZHVsZS5cbiAgICogQHBhcmFtIHtPYmplY3R9IG1vZHVsZSB0aGUgbW9kdWxlIHRvIG1ha2UgY3VycmVudFxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmUuTW9kdWxlTWFuYWdlclxuICAgKi9cblxuXG4gIGNyZWF0ZUNsYXNzKE1vZHVsZU1hbmFnZXIsIFt7XG4gICAga2V5OiBcImFjdGl2ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhY3RpdmUobW9kdWxlKSB7XG4gICAgICB0aGlzLmN1cnJlbnRNb2R1bGUgPSBtb2R1bGU7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBtZXRob2QgcmVzZXRcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAZGVzY3JpcHRpb24gU2V0J3MgLmN1cnJlbnRNb2R1bGUgdG8gbnVsbC5cbiAgICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmUuTW9kdWxlTWFuYWdlclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwicmVzZXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVzZXQoKSB7XG4gICAgICB0aGlzLmN1cnJlbnRNb2R1bGUgPSBudWxsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAbWV0aG9kIGRlZmluZVxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBkZXNjcmlwdGlvbiBEZWZpbmUgdGhlIG1vZHVsZSBpbiBtYW5hZ2VyXG4gICAgICogQHBhcmFtIG5hbWUgVGhlIG1vZHVsZSBuYW1lXG4gICAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLk1vZHVsZU1hbmFnZXJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImRlZmluZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkZWZpbmUobmFtZSkge1xuICAgICAgdGhpcy5tb2R1bGVzW25hbWVdID0gdGhpcy5jdXJyZW50TW9kdWxlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAbWV0aG9kIHVzZVxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBkZXNjcmlwdGlvbiBHZXQgdGhlIGRlZmluZWQgbW9kdWxlIGZyb20gbWFuYWdlclxuICAgICAqIEBwYXJhbSBuYW1lIFRoZSBtb2R1bGUgbmFtZVxuICAgICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZS5Nb2R1bGVNYW5hZ2VyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJ1c2VcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdXNlKG5hbWUpIHtcbiAgICAgIHJldHVybiB0aGlzLm1vZHVsZXNbbmFtZV07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBtZXRob2Qgc2V0XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQGRlc2NyaXB0aW9uIEFuIGFsaWFzIGZvciAuYWRkKCkgPGJyLz48YnIvPlxuICAgICAqIFVzZSB0aGlzIG1ldGhvZCBpZiB5b3Uga25vdyB0aGF0IHlvdSB3aWxsIG92ZXJ3cml0ZSBleGlzdGluZyBkZXBlbmRlbmN5Ljxici8+XG4gICAgICogVXNlIGl0IGluIHlvdXIgYXBwLCBidXQgbm90IGluIG1vZHVsZSB0aGF0IHlvdSBwcm92aWRlIHRvIG90aGVyIHBlb3BsZS5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30ga2V5IHRoZSBrZXkgb2YgdGhlIGRlcGVuZGVuY3lcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZGF0YSB0aGUgdmFsdWUgb2YgdGhlIGRlcGVuZGVuY3lcbiAgICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmUuTW9kdWxlTWFuYWdlclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwic2V0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldChrZXksIGRhdGEpIHtcbiAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goe1xuICAgICAgICB0eXBlOiAnQUREJyxcbiAgICAgICAga2V5OiBrZXksXG4gICAgICAgIGRhdGE6IGRhdGFcbiAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAbWV0aG9kIGdldFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIGRlcGVuZGVuY3kgaW4gc3RvcmUgb2JqZWN0LCBieSBrZXkuXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGtleSB0aGUga2V5IG9mIHRoZSBkZXBlbmRlbmN5XG4gICAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLk1vZHVsZU1hbmFnZXJcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R8TW9kdWxlfVxuICAgICAqIEB0aHJvd3Mge0RlcGVuZGVuY3lFcnJvcn0gaWYgZGVwZW5kZW5jeSBpcyBub3QgaW4gdGhlIHN0b3JlXG4gICAgICogQGV4YW1wbGUgPGNhcHRpb24+R2V0IHRoZSAnaGVsbG8nIGRlcGVuZGVuY3k8L2NhcHRpb24+XG4gICAgICogbWFuYWdlci5nZXQoJ2hlbGxvJyk7IC8vIC0+IHt3b3JsZDogdHJ1ZX1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImdldFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXQoa2V5KSB7XG4gICAgICBpZiAoIXRoaXMuc3RvcmUuZ2V0U3RhdGUoKVswXVtrZXldKSB7XG4gICAgICAgIHRocm93IG5ldyBEZXBlbmRlbmN5RXJyb3IoJ01vZHVsZU1hbmFnZXInLCBcIk1vZHVsZSByZXF1aXJlcyAnXCIuY29uY2F0KGtleSwgXCInIGRlcGVuZGVuY3lcIiksIHRoaXMuY3VycmVudE1vZHVsZSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLnN0b3JlLmdldFN0YXRlKClbMF1ba2V5XTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQG1ldGhvZCBoYXNcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAZGVzY3JpcHRpb24gUmV0dXJucyB3aGV0aGVyIG1hbmFnZXIgaGFzIGEgZGVwZW5kZW5jeSB3aXRoIHRoZSBnaXZlbiBrZXlcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30ga2V5IHRoZSBrZXkgb2YgdGhlIGRlcGVuZGVuY3lcbiAgICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmUuTW9kdWxlTWFuYWdlclxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59IFByb21pc2UgdGhhdCBpcyByZXNvbHZlZCB3aGVuIGFsbCBwcm9taXNlcyBjb21wbGV0ZWQuXG4gICAgICogQGV4YW1wbGUgPGNhcHRpb24+Q2hlY2sgd2hldGhlciB0aGUgc3RvcmUgaGFzIHRoZSAnaGVsbG8nIGRlcGVuZGVuY3k8L2NhcHRpb24+XG4gICAgICogbWFuYWdlci5oYXMoJ2hlbGxvJyk7IC8vIC0+IHRydWVcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImhhc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBoYXMoa2V5KSB7XG4gICAgICByZXR1cm4gQm9vbGVhbih0aGlzLnN0b3JlLmdldFN0YXRlKClbMF1ba2V5XSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBtZXRob2QgdXBkYXRlXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQGRlc2NyaXB0aW9uIFVwZGF0ZXMgZGVwc1xuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbZGVwc01hcD17fV1cbiAgICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmUuTW9kdWxlTWFuYWdlclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwidXBkYXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHVwZGF0ZSgpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIHZhciBkZXBzTWFwID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgICAgIHRoaXMuc3RvcmUuc3Vic2NyaWJlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF90aGlzJHN0b3JlJGdldFN0YXRlID0gX3RoaXMuc3RvcmUuZ2V0U3RhdGUoKSxcbiAgICAgICAgICAgIF90aGlzJHN0b3JlJGdldFN0YXRlMiA9IHNsaWNlZFRvQXJyYXkoX3RoaXMkc3RvcmUkZ2V0U3RhdGUsIDIpLFxuICAgICAgICAgICAgZGF0YSA9IF90aGlzJHN0b3JlJGdldFN0YXRlMlswXSxcbiAgICAgICAgICAgIGNoYW5nZWRLZXkgPSBfdGhpcyRzdG9yZSRnZXRTdGF0ZTJbMV07XG5cbiAgICAgICAgdmFyIGNhbGxiYWNrID0gZGVwc01hcFtjaGFuZ2VkS2V5XTtcbiAgICAgICAgaWYgKGNhbGxiYWNrKSBjYWxsYmFjayhkYXRhW2NoYW5nZWRLZXldKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAbWV0aG9kIGFkZFxuICAgICAqIEBhbGlhcyBtb2R1bGU6Y29yZS5Nb2R1bGVNYW5hZ2VyI3NldFxuICAgICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZS5Nb2R1bGVNYW5hZ2VyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJhZGRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWRkKCkge1xuICAgICAgY29uc29sZS53YXJuKCcuYWRkKCkgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuIFVzZSAuc2V0KCkgaW5zdGVhZCcpO1xuICAgICAgcmV0dXJuIHRoaXMuc2V0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBtZXRob2QgcmVxdWlyZVxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBkZXNjcmlwdGlvbiBSZXF1aXJlIG1vZHVsZVxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIERlZmluZWQgbmFtZVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG1vZHVsZUV4ZWN1dG9yIEZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhcHBsaWVkIG1vZHVsZVxuICAgICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZS5Nb2R1bGVNYW5hZ2VyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJyZXF1aXJlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlcXVpcmUobmFtZSwgbW9kdWxlRXhlY3V0b3IpIHtcbiAgICAgIGlmICh0aGlzLnVzZShuYW1lKSA9PT0gdW5kZWZpbmVkKSB0aGlzLmhhbmRsZXIuYXBwbHlNb2R1bGUobW9kdWxlRXhlY3V0b3IoKSk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIE1vZHVsZU1hbmFnZXI7XG59KCk7XG5cbi8qKlxuICogQGNsYXNzIENvbXBvbmVudFxuICogQGNhdGVnb3J5IGNvcmVcbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zXSAtIFRoZSBwYXJhbWV0ZXJzIG9iamVjdC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbaW5zdHJ1Y3Rpb25zXSAtIFRoZSBpbnN0cnVjdGlvbnMgb2JqZWN0LlxuICogQGV4dGVuZHMgTW9kdWxlU3lzdGVtXG4gKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmVcbiAqL1xuXG52YXIgQ29tcG9uZW50ID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfTW9kdWxlU3lzdGVtKSB7XG4gIC8qKlxuICAgKiBEZWZhdWx0IHZhbHVlcyBmb3IgcGFyYW1ldGVyc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb3JlLkNvbXBvbmVudCNkZWZhdWx0c1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IHtcbiAgICogICBtb2R1bGVzOiBbXSxcbiAgICogICBtYW5hZ2VyOiB0cnVlXG4gICAqIH1cbiAgICovXG5cbiAgLyoqXG4gICAqIFN0YXRpYyBpbnN0cnVjdGlvbnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29yZS5Db21wb25lbnQjaW5zdHJ1Y3Rpb25zXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHQge31cbiAgICovXG5cbiAgLyoqXG4gICAqIEFycmF5IG9mIHByb21pc2VzIHRoYXQgc2hvdWxkIGJlIHJlc29sdmVkIGJlZm9yZSBDb21wb25lbnQgaXMgcmVhZHkuXG4gICAqIEBtZW1iZXIge0FycmF5fSBtb2R1bGU6Y29yZS5Db21wb25lbnQjX3dhaXRcbiAgICogQHByaXZhdGVcbiAgICovXG4gIC8vIENvbGxlY3Rpb24gb2YgcHJvbWlzZXM7XG5cbiAgLyoqXG4gICAqIENvbGxlY3Rpb24gb2YgYG1vZHVsZXNgLlxuICAgKiBAbWVtYmVyIHtBcnJheX0gbW9kdWxlOmNvcmUuQ29tcG9uZW50I21vZHVsZXNcbiAgICogQHB1YmxpY1xuICAgKi9cbiAgLy8gQ29sbGVjdGlvbiBvZiBtb2R1bGVzO1xuXG4gIC8qKlxuICAgKiBDb2xsZWN0aW9uIG9mIGBjaGlsZGAgQ29tcG9uZW50cy5cbiAgICogQG1lbWJlciB7QXJyYXl9IG1vZHVsZTpjb3JlLkNvbXBvbmVudCNjaGlsZHJlblxuICAgKiBAcHVibGljXG4gICAqL1xuICAvLyBGb3Iga2VlcGluZyBjaGlsZHJlbiBjb21wb25lbnRzO1xuICBmdW5jdGlvbiBDb21wb25lbnQoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgdmFyIGRlZmF1bHRzID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBDb21wb25lbnQuZGVmYXVsdHM7XG4gICAgdmFyIGluc3RydWN0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogQ29tcG9uZW50Lmluc3RydWN0aW9ucztcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIENvbXBvbmVudCk7XG5cbiAgICBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgZ2V0UHJvdG90eXBlT2YkMihDb21wb25lbnQpLmNhbGwodGhpcykpOyAvLyBBcHBseSBwb2x5ZmlsbGVkIHBhcmFtZXRlcnMgdG8gLnBhcmFtcztcblxuICAgIGRlZmluZVByb3BlcnR5JDMoZGVmaW5lUHJvcGVydHkkMyhkZWZpbmVQcm9wZXJ0eSQzKGFzc2VydFRoaXNJbml0aWFsaXplZChhc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpKSwgXCJfd2FpdFwiLCBbXSksIFwibW9kdWxlc1wiLCBbXSksIFwiY2hpbGRyZW5cIiwgW10pO1xuXG4gICAgX3RoaXMucGFyYW1zID0gZXh0ZW5kKHRyYW5zZm9ybURhdGEocGFyYW1zLCBpbnN0cnVjdGlvbnMpLCBkZWZhdWx0cyk7XG4gICAgaWYgKF90aGlzLnBhcmFtcy5tYW5hZ2VyKSBfdGhpcy5tYW5hZ2VyID0gbmV3IE1vZHVsZU1hbmFnZXIoYXNzZXJ0VGhpc0luaXRpYWxpemVkKGFzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcykpKTtcbiAgICBfdGhpcy5tb2R1bGVzID0gX3RoaXMucGFyYW1zLm1vZHVsZXM7XG5cbiAgICBfdGhpcy5pbnRlZ3JhdGVNb2R1bGVzKCk7XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgLyoqXG4gICAqIEBtZXRob2Qgd2FpdFxuICAgKiBAaW5zdGFuY2VcbiAgICogQGRlc2NyaXB0aW9uIFdhaXQgZm9yIGEgcHJvbWlzZS5cbiAgICogQHBhcmFtIHtQcm9taXNlfSBbcHJvbWlzZV0gLSBUaGUgcHJvbWlzZSB0aGF0IHNob3VsZCBiZSBhZGRlZCB0byBhIHF1ZXVlLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlfSBQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2hlbiBhbGwgcHJvbWlzZXMgY29tcGxldGVkLlxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmUuQ29tcG9uZW50XG4gICAqL1xuXG5cbiAgY3JlYXRlQ2xhc3MoQ29tcG9uZW50LCBbe1xuICAgIGtleTogXCJ3YWl0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHdhaXQocHJvbWlzZSkge1xuICAgICAgaWYgKHByb21pc2UpIHRoaXMuX3dhaXQucHVzaChwcm9taXNlKTtcbiAgICAgIHJldHVybiBQcm9taXNlLmFsbCh0aGlzLl93YWl0KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQG1ldGhvZCBkZWZlclxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBkZXNjcmlwdGlvbiBFeGVjdXRlIGBmdW5jYCAoQ2FsbGJhY2spIHdoZW4gQ29tcG9uZW50IGlzIHJlYWR5LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgLSBDYWxsYmFjay5cbiAgICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmUuQ29tcG9uZW50XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJkZWZlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBkZWZlcihmdW5jKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgaWYgKHRoaXMuaXNEZWZmZXJlZCkgdGhpcy53YWl0KCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBmdW5jKF90aGlzMik7XG4gICAgICB9KTtlbHNlIGZ1bmModGhpcyk7XG4gICAgfSAvLyBQQVJBTUVURVJTXG5cbiAgICAvKipcbiAgICAgKiBAbWV0aG9kIHVwZGF0ZVBhcmFtc1xuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBkZXNjcmlwdGlvbiBVcGRhdGVzIHBhcmFtZXRlcnMgb2YgdGhlIENvbXBvbmVudC5cbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IFBhcmFtcyBvZiB0aGlzIENvbXBvbmVudFxuICAgICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZS5Db21wb25lbnRcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInVwZGF0ZVBhcmFtc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB1cGRhdGVQYXJhbXMoKSB7XG4gICAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgICAgIHRoaXMucGFyYW1zID0gZXh0ZW5kKHBhcmFtcywgdGhpcy5wYXJhbXMpO1xuICAgICAgcmV0dXJuIHRoaXMucGFyYW1zO1xuICAgIH0gLy8gQ09QWUlORyAmIENMT05JTkdcblxuICAgIC8qKlxuICAgICAqIEBtZXRob2QgY2xvbmVcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAZGVzY3JpcHRpb24gQ2xvbmUgdGhpcyBjb21wb25lbnRcbiAgICAgKiBAcmV0dXJuIHtvYmplY3R9IGEgY2xvbmVkIGNvbXBvbmVudCB3aXRoIGFsbCBpdHMgc291cmNlIGNvbXBvbmVudCcgcGFyYW1zIGNvcGllZC5cbiAgICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmUuQ29tcG9uZW50XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJjbG9uZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjbG9uZSgpIHtcbiAgICAgIHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLnBhcmFtcykuY29weSh0aGlzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQG1ldGhvZCBjb3B5XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQGRlc2NyaXB0aW9uIENvcHkgc291cmNlIG5hdGl2ZSBhbmQgaW50ZWdyYXRlIGBtb2R1bGVzYCB0byBpdC5cbiAgICAgKiBAcGFyYW0ge0NvbXBvbmVudH0gc291cmNlIC0gU291cmNlIGNvbXBvbmVudCB0aGF0IGlzIHVzZWQgZm9yIGBjb3B5KClgIGFjdGlvbi5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplXSAtIENhbGxiYWNrIGV4ZWN1dGVkIGJlZm9yZSBtb2R1bGVzIGludGVncmF0aW9uIHByb2Nlc3MuXG4gICAgICogQHJldHVybiB7dGhpc30gQ29tcG9uZW50XG4gICAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLkNvbXBvbmVudFxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiY29weVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjb3B5KHNvdXJjZSwgY3VzdG9taXplKSB7XG4gICAgICB0aGlzLnBhcmFtcyA9IG9iamVjdFNwcmVhZCh7fSwgc291cmNlLnBhcmFtcyk7XG4gICAgICBpZiAoc291cmNlLm5hdGl2ZSkgdGhpcy5uYXRpdmUgPSBzb3VyY2UubmF0aXZlLmNsb25lKHNvdXJjZS5wYXJhbXMpO1xuICAgICAgaWYgKGN1c3RvbWl6ZSkgY3VzdG9taXplKCk7XG4gICAgICB0aGlzLmludGVncmF0ZU1vZHVsZXMoc291cmNlKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAbWV0aG9kIGFkZFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBkZXNjcmlwdGlvbiBBZGQgYSBjaGlsZCBgQ29tcG9uZW50YC5cbiAgICAgKiBAcGFyYW0ge0NvbXBvbmVudH0gb2JqZWN0IC0gQ29tcG9uZW50IHRoYXQgc2hvdWxkIGJlIGFkZGVkIGFzIGEgYGNoaWxkYC5cbiAgICAgKiBAcmV0dXJuIHtQcm9taXNlfSBSZXNvbHZlZCB3aGVuIGFjdGlvbiBpcyBkb25lLlxuICAgICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZS5Db21wb25lbnRcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImFkZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgX2FkZCA9IGFzeW5jVG9HZW5lcmF0b3IoXG4gICAgICAvKiNfX1BVUkVfXyovXG4gICAgICByZWdlbmVyYXRvci5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUob2JqZWN0KSB7XG4gICAgICAgIHJldHVybiByZWdlbmVyYXRvci53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7XG4gICAgICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHtcbiAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgIGlmICghb2JqZWN0LnBhcmVudCkge1xuICAgICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDM7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMztcbiAgICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0LnBhcmVudC5yZW1vdmUob2JqZWN0KTtcblxuICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMud2FpdCgpO1xuXG4gICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gNztcbiAgICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0LndhaXQoKTtcblxuICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgaWYgKG9iamVjdC5uYXRpdmUpIHtcbiAgICAgICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSA5O1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbXBvc2l0aW9uRXJyb3IkMSgnQ29tcG9uZW50JywgJ3RoZXJlIGlzIG5vIG9iamVjdC5uYXRpdmUnLCB0aGlzKTtcblxuICAgICAgICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgICAgICAgb2JqZWN0LnBhcmVudCA9IHRoaXM7XG4gICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDEyO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgICAgICAgICAgICAgIG9uQWRkOiBvYmplY3RcbiAgICAgICAgICAgICAgICB9KS5vbkFkZDtcblxuICAgICAgICAgICAgICBjYXNlIDEyOlxuICAgICAgICAgICAgICAgIHRoaXMubmF0aXZlLmFkZChvYmplY3QubmF0aXZlKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNoaWxkcmVuLnB1c2gob2JqZWN0KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KFwicmV0dXJuXCIsIG9iamVjdCk7XG5cbiAgICAgICAgICAgICAgY2FzZSAxNTpcbiAgICAgICAgICAgICAgY2FzZSBcImVuZFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LCBfY2FsbGVlLCB0aGlzKTtcbiAgICAgIH0pKTtcblxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIGFkZChfeCkge1xuICAgICAgICByZXR1cm4gX2FkZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgfTtcbiAgICB9KClcbiAgICAvKipcbiAgICAgKiBAbWV0aG9kIHJlbW92ZVxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBkZXNjcmlwdGlvbiBSZW1vdmUgYSBjaGlsZCBgQ29tcG9uZW50YC5cbiAgICAgKiBAcGFyYW0ge0NvbXBvbmVudH0gb2JqZWN0IC0gQ29tcG9uZW50IHRoYXQgc2hvdWxkIGJlIGEgKipjaGlsZCoqIG9mIHRoaXMgQ29tcG9uZW50LlxuICAgICAqIEByZXR1cm4ge1Byb21pc2V9IFJlc29sdmVkIHdoZW4gYWN0aW9uIGlzIGRvbmUuXG4gICAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLkNvbXBvbmVudFxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwicmVtb3ZlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBfcmVtb3ZlID0gYXN5bmNUb0dlbmVyYXRvcihcbiAgICAgIC8qI19fUFVSRV9fKi9cbiAgICAgIHJlZ2VuZXJhdG9yLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTIob2JqZWN0KSB7XG4gICAgICAgIHJldHVybiByZWdlbmVyYXRvci53cmFwKGZ1bmN0aW9uIF9jYWxsZWUyJChfY29udGV4dDIpIHtcbiAgICAgICAgICB3aGlsZSAoMSkge1xuICAgICAgICAgICAgc3dpdGNoIChfY29udGV4dDIucHJldiA9IF9jb250ZXh0Mi5uZXh0KSB7XG4gICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICBpZiAoIShvYmplY3QucGFyZW50ICE9PSB0aGlzKSkge1xuICAgICAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAyO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5hYnJ1cHQoXCJyZXR1cm5cIik7XG5cbiAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gNDtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy53YWl0KCk7XG5cbiAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gNjtcbiAgICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0LndhaXQoKTtcblxuICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgb2JqZWN0LnBhcmVudCA9IG51bGw7XG4gICAgICAgICAgICAgICAgdGhpcy5uYXRpdmUucmVtb3ZlKG9iamVjdC5uYXRpdmUpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2hpbGRyZW4uc3BsaWNlKHRoaXMuY2hpbGRyZW4uaW5kZXhPZihvYmplY3QpLCAxKTtcblxuICAgICAgICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLnN0b3AoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sIF9jYWxsZWUyLCB0aGlzKTtcbiAgICAgIH0pKTtcblxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIHJlbW92ZShfeDIpIHtcbiAgICAgICAgcmV0dXJuIF9yZW1vdmUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH07XG4gICAgfSgpXG4gICAgLyoqXG4gICAgICogQG1ldGhvZCBhZGRUb1xuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBkZXNjcmlwdGlvbiBBZGRzIGB0aGlzYCBDb21wb25lbnQgdG8gc3BlY2lmaWVkIGBBcHBgL2BDb21wb25lbnRgLlxuICAgICAqIEBwYXJhbSB7Q29tcG9uZW50fSBvYmplY3QgLSBDb21wb25lbnQgdGhhdCB3aWxsIGJlIGEgcGFyZW50IG9mIGB0aGlzYC5cbiAgICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmUuQ29tcG9uZW50XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJhZGRUb1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhZGRUbyhvYmplY3QpIHtcbiAgICAgIHJldHVybiBvYmplY3QuYWRkKHRoaXMpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJnZXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0KGtleSkge1xuICAgICAgcmV0dXJuIHRoaXMubWFuYWdlci5nZXQoa2V5KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidXNlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHVzZShrZXkpIHtcbiAgICAgIHJldHVybiB0aGlzLm1hbmFnZXIudXNlKGtleSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgb2JqZWN0IGlzIGBhc3luY2AgKGB3YWl0YCBwcm9taXNlcyBhcmUgbW9yZSB0aGFuIGAwYCkuXG4gICAgICogQG1lbWJlciB7Qm9vbGVhbn0gbW9kdWxlOmNvcmUuQ29tcG9uZW50I2lzRGVmZmVyZWRcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImlzRGVmZmVyZWRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl93YWl0Lmxlbmd0aCA+IDA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGBNb2R1bGVNYW5hZ2VyYCB1c2VkIGZvciB0aGlzIGNvbXBvbmVudC5cbiAgICAgKiBAbWVtYmVyIHtNb2R1bGVNYW5hZ2VyfSBtb2R1bGU6Y29yZS5Db21wb25lbnQjbWFuYWdlclxuICAgICAqIEB0aHJvd3Mge01hbmFnZXJFcnJvcn1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIm1hbmFnZXJcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIGlmICh0aGlzLl9tYW5hZ2VyKSByZXR1cm4gdGhpcy5fbWFuYWdlcjtcbiAgICAgIHRocm93IG5ldyBNYW5hZ2VyRXJyb3IoJ0NvbXBvbmVudCcsIFwiTW9kdWxlTWFuYWdlciBpcyBub3QgdXNlZCBpbiB0aGlzIGNvbXBvbmVudC4gJ21hbmFnZXInIHBhcmFtZXRlciBzaG91bGQgYmUgc2V0IGFzICd0cnVlJ1wiLCB0aGlzKTtcbiAgICB9LFxuICAgIHNldDogZnVuY3Rpb24gc2V0KG1hbmFnZXIpIHtcbiAgICAgIHRoaXMuX21hbmFnZXIgPSBtYW5hZ2VyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBgbmF0aXZlYCBvYmplY3QgdXNlZCBmb3IgdGhpcyBjb21wb25lbnQuXG4gICAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29yZS5Db21wb25lbnQjbmF0aXZlXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJuYXRpdmVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9uYXRpdmU7XG4gICAgfSxcbiAgICBzZXQ6IGZ1bmN0aW9uIHNldChtZXNoKSB7XG4gICAgICB0aGlzLl9uYXRpdmUgPSBtZXNoO1xuICAgICAgdGhpcy5fbmF0aXZlLmNvbXBvbmVudCA9IHRoaXM7XG4gICAgICByZXR1cm4gdGhpcy5fbmF0aXZlO1xuICAgIH1cbiAgfV0pO1xuXG4gIGluaGVyaXRzKENvbXBvbmVudCwgX01vZHVsZVN5c3RlbSk7XG5cbiAgcmV0dXJuIENvbXBvbmVudDtcbn0oTW9kdWxlU3lzdGVtKTtcblxuZGVmaW5lUHJvcGVydHkkMyhkZWZpbmVQcm9wZXJ0eSQzKENvbXBvbmVudCwgXCJkZWZhdWx0c1wiLCB7XG4gIG1vZHVsZXM6IG51bGwsXG4gIG1hbmFnZXI6IHRydWVcbn0pLCBcImluc3RydWN0aW9uc1wiLCB7fSk7XG5cbi8vIDI2LjEuNiBSZWZsZWN0LmdldCh0YXJnZXQsIHByb3BlcnR5S2V5IFssIHJlY2VpdmVyXSlcblxuXG5cblxuXG5cblxuZnVuY3Rpb24gZ2V0KHRhcmdldCwgcHJvcGVydHlLZXkgLyogLCByZWNlaXZlciAqLykge1xuICB2YXIgcmVjZWl2ZXIgPSBhcmd1bWVudHMubGVuZ3RoIDwgMyA/IHRhcmdldCA6IGFyZ3VtZW50c1syXTtcbiAgdmFyIGRlc2MsIHByb3RvO1xuICBpZiAoX2FuT2JqZWN0KHRhcmdldCkgPT09IHJlY2VpdmVyKSByZXR1cm4gdGFyZ2V0W3Byb3BlcnR5S2V5XTtcbiAgaWYgKGRlc2MgPSBfb2JqZWN0R29wZC5mKHRhcmdldCwgcHJvcGVydHlLZXkpKSByZXR1cm4gX2hhcyhkZXNjLCAndmFsdWUnKVxuICAgID8gZGVzYy52YWx1ZVxuICAgIDogZGVzYy5nZXQgIT09IHVuZGVmaW5lZFxuICAgICAgPyBkZXNjLmdldC5jYWxsKHJlY2VpdmVyKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIGlmIChfaXNPYmplY3QocHJvdG8gPSBfb2JqZWN0R3BvKHRhcmdldCkpKSByZXR1cm4gZ2V0KHByb3RvLCBwcm9wZXJ0eUtleSwgcmVjZWl2ZXIpO1xufVxuXG5fZXhwb3J0KF9leHBvcnQuUywgJ1JlZmxlY3QnLCB7IGdldDogZ2V0IH0pO1xuXG52YXIgZ2V0JDEgPSBfY29yZS5SZWZsZWN0LmdldDtcblxudmFyIGdldCQyID0gZ2V0JDE7XG5cbmZ1bmN0aW9uIF9zdXBlclByb3BCYXNlKG9iamVjdCwgcHJvcGVydHkpIHtcbiAgd2hpbGUgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSkpIHtcbiAgICBvYmplY3QgPSBnZXRQcm90b3R5cGVPZiQyKG9iamVjdCk7XG4gICAgaWYgKG9iamVjdCA9PT0gbnVsbCkgYnJlYWs7XG4gIH1cblxuICByZXR1cm4gb2JqZWN0O1xufVxuXG52YXIgc3VwZXJQcm9wQmFzZSA9IF9zdXBlclByb3BCYXNlO1xuXG52YXIgZ2V0JDMgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlKSB7XG5mdW5jdGlvbiBfZ2V0KHRhcmdldCwgcHJvcGVydHksIHJlY2VpdmVyKSB7XG4gIGlmICh0eXBlb2YgUmVmbGVjdCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBnZXQkMikge1xuICAgIG1vZHVsZS5leHBvcnRzID0gX2dldCA9IGdldCQyO1xuICB9IGVsc2Uge1xuICAgIG1vZHVsZS5leHBvcnRzID0gX2dldCA9IGZ1bmN0aW9uIF9nZXQodGFyZ2V0LCBwcm9wZXJ0eSwgcmVjZWl2ZXIpIHtcbiAgICAgIHZhciBiYXNlID0gc3VwZXJQcm9wQmFzZSh0YXJnZXQsIHByb3BlcnR5KTtcbiAgICAgIGlmICghYmFzZSkgcmV0dXJuO1xuXG4gICAgICB2YXIgZGVzYyA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvciQxKGJhc2UsIHByb3BlcnR5KTtcblxuICAgICAgaWYgKGRlc2MuZ2V0KSB7XG4gICAgICAgIHJldHVybiBkZXNjLmdldC5jYWxsKHJlY2VpdmVyKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGRlc2MudmFsdWU7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBfZ2V0KHRhcmdldCwgcHJvcGVydHksIHJlY2VpdmVyIHx8IHRhcmdldCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gX2dldDtcbn0pO1xuXG5mdW5jdGlvbiBhdHRyaWJ1dGVzKCkge1xuICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgbWFwcGVycyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICBtYXBwZXJzW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1hcHBlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBtYXBwZXIgPSBtYXBwZXJzW2ldO1xuXG4gICAgICBmb3IgKHZhciBrID0gMDsgayA8IG1hcHBlci5tYXAubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgdmFyIGF0dHJpYnV0ZSA9IG1hcHBlci5tYXBba107XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQucHJvdG90eXBlLCBhdHRyaWJ1dGUsIHtcbiAgICAgICAgICBnZXQ6IG1hcHBlci5nZXR0ZXIoYXR0cmlidXRlKSxcbiAgICAgICAgICBzZXQ6IG1hcHBlci5zZXR0ZXIoYXR0cmlidXRlKSxcbiAgICAgICAgICBjb25maWd1cmFibGU6IG1hcHBlci5jb25maWd1cmFibGUsXG4gICAgICAgICAgZW51bWVyYWJsZTogbWFwcGVyLmVudW1lcmFibGVcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xufVxuZnVuY3Rpb24gY29weSgpIHtcbiAgZm9yICh2YXIgX2xlbjIgPSBhcmd1bWVudHMubGVuZ3RoLCBtYXAgPSBuZXcgQXJyYXkoX2xlbjIpLCBfa2V5MiA9IDA7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcbiAgICBtYXBbX2tleTJdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbWFwOiBtYXAsXG4gICAgZ2V0dGVyOiBmdW5jdGlvbiBnZXR0ZXIobmFtZSkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmF0aXZlW25hbWVdO1xuICAgICAgfTtcbiAgICB9LFxuICAgIHNldHRlcjogZnVuY3Rpb24gc2V0dGVyKG5hbWUpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdGhpcy5uYXRpdmVbbmFtZV0uY29weSh2YWx1ZSk7XG4gICAgICB9O1xuICAgIH0sXG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGVudW1lcmFibGU6IHRydWVcbiAgfTtcbn1cbmZ1bmN0aW9uIG1pcnJvcigpIHtcbiAgZm9yICh2YXIgX2xlbjMgPSBhcmd1bWVudHMubGVuZ3RoLCBtYXAgPSBuZXcgQXJyYXkoX2xlbjMpLCBfa2V5MyA9IDA7IF9rZXkzIDwgX2xlbjM7IF9rZXkzKyspIHtcbiAgICBtYXBbX2tleTNdID0gYXJndW1lbnRzW19rZXkzXTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbWFwOiBtYXAsXG4gICAgZ2V0dGVyOiBmdW5jdGlvbiBnZXR0ZXIobmFtZSkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmF0aXZlW25hbWVdO1xuICAgICAgfTtcbiAgICB9LFxuICAgIHNldHRlcjogZnVuY3Rpb24gc2V0dGVyKG5hbWUpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdGhpcy5uYXRpdmVbbmFtZV0gPSB2YWx1ZTtcbiAgICAgIH07XG4gICAgfSxcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgZW51bWVyYWJsZTogdHJ1ZVxuICB9O1xufVxuXG52YXIgX2RlYywgX2NsYXNzO1xudmFyIFxuLyoqXG4gKiBAY2xhc3MgTWVzaENvbXBvbmVudFxuICogQGNhdGVnb3J5IGNvcmVcbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zXSAtIFRoZSBwYXJhbWV0ZXJzIG9iamVjdC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbaW5zdHJ1Y3Rpb25zXSAtIFRoZSBpbnN0cnVjdGlvbnMgb2JqZWN0LlxuICogQGV4dGVuZHMgbW9kdWxlOmNvcmUuQ29tcG9uZW50XG4gKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmVcbiAqL1xuTWVzaENvbXBvbmVudCA9IChfZGVjID0gYXR0cmlidXRlcyhjb3B5KCdwb3NpdGlvbicsICdyb3RhdGlvbicsICdxdWF0ZXJuaW9uJywgJ3NjYWxlJyksIG1pcnJvcignbWF0ZXJpYWwnLCAnZ2VvbWV0cnknKSksIF9kZWMoX2NsYXNzID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfQ29tcG9uZW50KSB7XG4gIGNyZWF0ZUNsYXNzKE1lc2hDb21wb25lbnQsIG51bGwsIFt7XG4gICAga2V5OiBcImN1c3RvbVwiLFxuXG4gICAgLyoqXG4gICAgICogRGVmYXVsdCB2YWx1ZXMgZm9yIHBhcmFtZXRlcnNcbiAgICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb3JlLk1lc2hDb21wb25lbnQjZGVmYXVsdHNcbiAgICAgKiBAc3RhdGljXG4gICAgICogQGRlZmF1bHRcbiAgICAgKiB7XG4gICAgICogICBidWlsZDogdHJ1ZSxcbiAgICAgKiAgIGdlb21ldHJ5OiB7fSxcbiAgICAgKiAgIG1hdGVyaWFsOiBmYWxzZSxcbiAgICAgKlxuICAgICAqICAgc2hhZG93OiB7XG4gICAgICogICAgIGNhc3Q6IHRydWUsXG4gICAgICogICAgIHJlY2VpdmU6IHRydWVcbiAgICAgKiAgIH0sXG4gICAgICpcbiAgICAgKiAgIHBvc2l0aW9uOiB7eDogMCwgeTogMCwgejogMH0sXG4gICAgICogICByb3RhdGlvbjoge3g6IDAsIHk6IDAsIHo6IDB9LFxuICAgICAqICAgc2NhbGU6IHt4OiAxLCB5OiAxLCB6OiAxfVxuICAgICAqIH1cbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIFN0YXRpYyBpbnN0cnVjdGlvbnNcbiAgICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb3JlLk1lc2hDb21wb25lbnQjaW5zdHJ1Y3Rpb25zXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBkZWZhdWx0XG4gICAgICoge1xuICAgICAqICAgcG9zaXRpb246IFsneCcsICd5JywgJ3onXSxcbiAgICAgKiAgIHJvdGF0aW9uOiBbJ3gnLCAneScsICd6J10sXG4gICAgICogICBzY2FsZTogWyd4JywgJ3knLCAneiddXG4gICAgICogfVxuICAgICAqL1xuICAgIC8vIENVU1RPTSBHRU9NRVRSWSBIQU5ETElOR1xuICAgIHZhbHVlOiBmdW5jdGlvbiBjdXN0b20oZ2VvbSkge1xuICAgICAgdmFyIGNvbnN0cnVjdG9yID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBNZXNoO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgLyojX19QVVJFX18qL1xuICAgICAgICBmdW5jdGlvbiAoX01lc2hDb21wb25lbnQpIHtcbiAgICAgICAgICBmdW5jdGlvbiBfY2xhc3MyKCkge1xuICAgICAgICAgICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgX2NsYXNzMik7XG5cbiAgICAgICAgICAgIHJldHVybiBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIGdldFByb3RvdHlwZU9mJDIoX2NsYXNzMikuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY3JlYXRlQ2xhc3MoX2NsYXNzMiwgW3tcbiAgICAgICAgICAgIGtleTogXCJidWlsZFwiLFxuICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIGJ1aWxkKCkge1xuICAgICAgICAgICAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB0aGlzLnBhcmFtcztcblxuICAgICAgICAgICAgICB2YXIgX3RoaXMkYXBwbHlCcmlkZ2UgPSB0aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgICAgICAgICAgICBnZW9tZXRyeTogZ2VvbSxcbiAgICAgICAgICAgICAgICBtYXRlcmlhbDogcGFyYW1zLm1hdGVyaWFsXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgZ2VvbWV0cnkgPSBfdGhpcyRhcHBseUJyaWRnZS5nZW9tZXRyeSxcbiAgICAgICAgICAgICAgICAgIG1hdGVyaWFsID0gX3RoaXMkYXBwbHlCcmlkZ2UubWF0ZXJpYWw7XG5cbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXBwbHlCcmlkZ2Uoe1xuICAgICAgICAgICAgICAgIG1lc2g6IG5ldyBjb25zdHJ1Y3RvcihnZW9tZXRyeSwgbWF0ZXJpYWwpXG4gICAgICAgICAgICAgIH0pLm1lc2g7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfV0pO1xuXG4gICAgICAgICAgaW5oZXJpdHMoX2NsYXNzMiwgX01lc2hDb21wb25lbnQpO1xuXG4gICAgICAgICAgcmV0dXJuIF9jbGFzczI7XG4gICAgICAgIH0oTWVzaENvbXBvbmVudClcbiAgICAgICk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImNyZWF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjcmVhdGUoZ2VvbSwgcGFyYW1zLCBjb25zdHJ1Y3Rvcikge1xuICAgICAgcmV0dXJuIG5ldyAoTWVzaENvbXBvbmVudC5jdXN0b20oZ2VvbSwgY29uc3RydWN0b3IpKShwYXJhbXMpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJmcm9tXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGZyb20obWVzaCkge1xuICAgICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG4gICAgICBwYXJhbXMuYnVpbGQgPSBmYWxzZTtcbiAgICAgIHZhciBjb21wb25lbnQgPSBuZXcgTWVzaENvbXBvbmVudChwYXJhbXMpO1xuICAgICAgY29tcG9uZW50Lm5hdGl2ZSA9IG1lc2g7XG4gICAgICBjb21wb25lbnQud3JhcCgpO1xuICAgICAgcmV0dXJuIGNvbXBvbmVudDtcbiAgICB9XG4gIH1dKTtcblxuICBmdW5jdGlvbiBNZXNoQ29tcG9uZW50KHBhcmFtcykge1xuICAgIHZhciBfdGhpcztcblxuICAgIHZhciBkZWZhdWx0cyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogTWVzaENvbXBvbmVudC5kZWZhdWx0cztcbiAgICB2YXIgaW5zdHJ1Y3Rpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBNZXNoQ29tcG9uZW50Lmluc3RydWN0aW9ucztcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIE1lc2hDb21wb25lbnQpO1xuXG4gICAgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIGdldFByb3RvdHlwZU9mJDIoTWVzaENvbXBvbmVudCkuY2FsbCh0aGlzLCBwYXJhbXMsIGRlZmF1bHRzLCBpbnN0cnVjdGlvbnMpKTtcblxuICAgIGlmIChfdGhpcy5wYXJhbXMuYnVpbGQpIHtcbiAgICAgIHZhciBidWlsZCA9IF90aGlzLmJ1aWxkKF90aGlzLnBhcmFtcyk7XG5cbiAgICAgIGlmICghYnVpbGQpIHtcbiAgICAgICAgdGhyb3cgbmV3IENvbXBvc2l0aW9uRXJyb3IkMSgnTWVzaENvbXBvbmVudCcsICcuYnVpbGQoKSBtZXRob2Qgc2hvdWxkIHJldHVybiBhIFRIUkVFLk9iamVjdDNEIG9yIGEgUHJvbWlzZSByZXNvbHZlZCB3aXRoIFRIUkVFLk9iamVjdDNELicsIGFzc2VydFRoaXNJbml0aWFsaXplZChhc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpKSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChidWlsZCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgX3RoaXMud2FpdChidWlsZCk7XG5cbiAgICAgICAgX3RoaXMud2FpdChuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgICAgIGJ1aWxkLnRoZW4oZnVuY3Rpb24gKG5hdGl2ZSkge1xuICAgICAgICAgICAgX3RoaXMubmF0aXZlID0gbmF0aXZlO1xuXG4gICAgICAgICAgICBfdGhpcy53cmFwKCkudGhlbihyZXNvbHZlKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgX3RoaXMubmF0aXZlID0gYnVpbGQ7XG5cbiAgICAgICAgX3RoaXMud2FpdChfdGhpcy53cmFwKCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIF90aGlzLmFwcGx5Q29tbWFuZCgncG9zdEludGVncmF0ZScpO1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9IC8vIEJVSUxESU5HICYgV1JBUFBJTkdcblxuICAvKipcbiAgICogQG1ldGhvZCBidWlsZFxuICAgKiBAZGVzY3JpcHRpb24gQnVpbGQgbGl2ZWN5Y2xlIHNob3VsZCByZXR1cm4gYSBuYXRpdmUgb2JqZWN0LlxuICAgKiBAdGhyb3dzIHtDb21wb3NpdGlvbkVycm9yfVxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmUuTWVzaENvbXBvbmVudFxuICAgKi9cblxuXG4gIGNyZWF0ZUNsYXNzKE1lc2hDb21wb25lbnQsIFt7XG4gICAga2V5OiBcImJ1aWxkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGJ1aWxkKCkge1xuICAgICAgdGhyb3cgbmV3IENvbXBvc2l0aW9uRXJyb3IkMSgnTWVzaENvbXBvbmVudCcsICdJbnN0YW5jZSBzaG91bGQgaGF2ZSBpdFxcJ3Mgb3duIC5idWlsZCgpLicsIHRoaXMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAbWV0aG9kIHdyYXBcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAZGVzY3JpcHRpb24gV3JhcHMgdHJhbnNmb3JtcyAoYHBvc2l0aW9uYCAmIGByb3RhdGlvbmApXG4gICAgICogQHJldHVybiB7UHJvbWlzZX0gUmVzb2x2ZWQgd2hlbiBhY3Rpb24gaXMgY29tcGxldGVkXG4gICAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLk1lc2hDb21wb25lbnRcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIndyYXBcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gd3JhcCgpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgLy8gVE9ETzogRml4IGRlZmVyIHdpdGggcGh5c2ljc1xuICAgICAgICAvLyB0aGlzLmRlZmVyKCgpID0+IHtcbiAgICAgICAgdmFyIF90aGlzMiRwYXJhbXMgPSBfdGhpczIucGFyYW1zLFxuICAgICAgICAgICAgcG9zaXRpb24gPSBfdGhpczIkcGFyYW1zLnBvc2l0aW9uLFxuICAgICAgICAgICAgcm90YXRpb24gPSBfdGhpczIkcGFyYW1zLnJvdGF0aW9uLFxuICAgICAgICAgICAgc2NhbGUgPSBfdGhpczIkcGFyYW1zLnNjYWxlLFxuICAgICAgICAgICAgc2hhZG93ID0gX3RoaXMyJHBhcmFtcy5zaGFkb3c7XG5cbiAgICAgICAgX3RoaXMyLnBvc2l0aW9uLnNldChwb3NpdGlvbi54LCBwb3NpdGlvbi55LCBwb3NpdGlvbi56KTtcblxuICAgICAgICBfdGhpczIucm90YXRpb24uc2V0KHJvdGF0aW9uLngsIHJvdGF0aW9uLnksIHJvdGF0aW9uLnopO1xuXG4gICAgICAgIF90aGlzMi5zY2FsZS5zZXQoc2NhbGUueCwgc2NhbGUueSwgc2NhbGUueik7XG5cbiAgICAgICAgX3RoaXMyLm5hdGl2ZS5jYXN0U2hhZG93ID0gc2hhZG93LmNhc3Q7XG4gICAgICAgIF90aGlzMi5uYXRpdmUucmVjZWl2ZVNoYWRvdyA9IHNoYWRvdy5yZWNlaXZlO1xuXG4gICAgICAgIF90aGlzMi5hcHBseUJyaWRnZSh7XG4gICAgICAgICAgb25XcmFwOiAxXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJlc29sdmUoX3RoaXMyKTsgLy8gfSk7XG4gICAgICB9KTtcbiAgICB9IC8vIENPUFlJTkcgJiBDTE9OSU5HXG5cbiAgICAvKipcbiAgICAgKiBAbWV0aG9kIGNvcHlcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAZGVzY3JpcHRpb24gQ29weSBzb3VyY2UgdHJhbnNmb3JtcyAmIGV4ZWN1dGUgYENvbXBvbmVudC5jb3B5KClgXG4gICAgICogQHJldHVybiB7dGhpc30gTWVzaENvbXBvbmVudFxuICAgICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZS5NZXNoQ29tcG9uZW50XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJjb3B5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvcHkkJDEoc291cmNlKSB7XG4gICAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgICAgcmV0dXJuIGdldCQzKGdldFByb3RvdHlwZU9mJDIoTWVzaENvbXBvbmVudC5wcm90b3R5cGUpLCBcImNvcHlcIiwgdGhpcykuY2FsbCh0aGlzLCBzb3VyY2UsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgX3RoaXMzLnBvc2l0aW9uLmNvcHkoc291cmNlLnBvc2l0aW9uKTtcblxuICAgICAgICBfdGhpczMucm90YXRpb24uY29weShzb3VyY2Uucm90YXRpb24pO1xuXG4gICAgICAgIF90aGlzMy5xdWF0ZXJuaW9uLmNvcHkoc291cmNlLnF1YXRlcm5pb24pO1xuICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBtZXRob2QgY2xvbmVcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAZGVzY3JpcHRpb24gTWFrZSBhIGNsb25lIG9mIHRoaXMgTWVzaENvbXBvbmVudCB1c2luZyBgLmNvcHkoKWBcbiAgICAgKiBAcmV0dXJuIHtNZXNoQ29tcG9uZW50fSBjbG9uZSBvZiB0aGlzIG9iamVjdFxuICAgICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZS5NZXNoQ29tcG9uZW50XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJjbG9uZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjbG9uZShnZW9tZXRyeSwgbWF0ZXJpYWwpIHtcbiAgICAgIHZhciBkZXN0ID0gbmV3IHRoaXMuY29uc3RydWN0b3Ioe1xuICAgICAgICBidWlsZDogZmFsc2VcbiAgICAgIH0pLmNvcHkodGhpcyk7XG4gICAgICBpZiAoZ2VvbWV0cnkpIGRlc3QuZ2VvbWV0cnkgPSBkZXN0Lmdlb21ldHJ5LmNsb25lKCk7XG4gICAgICBpZiAobWF0ZXJpYWwpIGRlc3QubWF0ZXJpYWwgPSBkZXN0Lm1hdGVyaWFsLmNsb25lKCk7XG4gICAgICByZXR1cm4gZGVzdDtcbiAgICB9XG4gIH1dKTtcblxuICBpbmhlcml0cyhNZXNoQ29tcG9uZW50LCBfQ29tcG9uZW50KTtcblxuICByZXR1cm4gTWVzaENvbXBvbmVudDtcbn0oQ29tcG9uZW50KSkgfHwgX2NsYXNzKTtcblxuZGVmaW5lUHJvcGVydHkkMyhkZWZpbmVQcm9wZXJ0eSQzKE1lc2hDb21wb25lbnQsIFwiZGVmYXVsdHNcIiwgb2JqZWN0U3ByZWFkKHt9LCBDb21wb25lbnQuZGVmYXVsdHMsIHtcbiAgYnVpbGQ6IHRydWUsXG4gIGdlb21ldHJ5OiB7fSxcbiAgbWF0ZXJpYWw6IGZhbHNlLFxuICBzaGFkb3c6IHtcbiAgICBjYXN0OiB0cnVlLFxuICAgIHJlY2VpdmU6IHRydWVcbiAgfSxcbiAgcG9zaXRpb246IHtcbiAgICB4OiAwLFxuICAgIHk6IDAsXG4gICAgejogMFxuICB9LFxuICByb3RhdGlvbjoge1xuICAgIHg6IDAsXG4gICAgeTogMCxcbiAgICB6OiAwXG4gIH0sXG4gIHNjYWxlOiB7XG4gICAgeDogMSxcbiAgICB5OiAxLFxuICAgIHo6IDFcbiAgfVxufSkpLCBcImluc3RydWN0aW9uc1wiLCB7XG4gIHBvc2l0aW9uOiBbJ3gnLCAneScsICd6J10sXG4gIHJvdGF0aW9uOiBbJ3gnLCAneScsICd6J10sXG4gIHNjYWxlOiBbJ3gnLCAneScsICd6J11cbn0pO1xuXG52YXIgX2RlYyQxLCBfY2xhc3MkMTtcbnZhciBcbi8qKlxuICogQGNsYXNzIExpZ2h0Q29tcG9uZW50XG4gKiBAY2F0ZWdvcnkgY29yZVxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXNdIC0gVGhlIHBhcmFtZXRlcnMgb2JqZWN0LlxuICogQHBhcmFtIHtPYmplY3R9IFtpbnN0cnVjdGlvbnNdIC0gVGhlIGluc3RydWN0aW9ucyBvYmplY3QuXG4gKiBAZXh0ZW5kcyBtb2R1bGU6Y29yZS5Db21wb25lbnRcbiAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZVxuICovXG5MaWdodENvbXBvbmVudCA9IChfZGVjJDEgPSBhdHRyaWJ1dGVzKGNvcHkoJ3Bvc2l0aW9uJywgJ3JvdGF0aW9uJywgJ3F1YXRlcm5pb24nLCAndGFyZ2V0JykpLCBfZGVjJDEoX2NsYXNzJDEgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9Db21wb25lbnQpIHtcbiAgY3JlYXRlQ2xhc3MoTGlnaHRDb21wb25lbnQsIG51bGwsIFt7XG4gICAga2V5OiBcImZyb21cIixcblxuICAgIC8qKlxuICAgICAqIERlZmF1bHQgdmFsdWVzIGZvciBwYXJhbWV0ZXJzXG4gICAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29yZS5MaWdodENvbXBvbmVudCNkZWZhdWx0c1xuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAZGVmYXVsdFxuICAgICAqIHtcbiAgICAgKiAgIGJ1aWxkOiB0cnVlLFxuICAgICAqXG4gICAgICogICBzaGFkb3c6IHtcbiAgICAgKiAgICAgY2FzdDogdHJ1ZSxcbiAgICAgKlxuICAgICAqICAgICBiaWFzOiAwLFxuICAgICAqICAgICByYWRpdXM6IDEsXG4gICAgICpcbiAgICAgKiAgICAgbWFwU2l6ZToge1xuICAgICAqICAgICAgIHdpZHRoOiAxMDI0LFxuICAgICAqICAgICAgIGhlaWdodDogMTAyNFxuICAgICAqICAgICB9LFxuICAgICAqXG4gICAgICogICAgIGNhbWVyYToge1xuICAgICAqICAgICAgIG5lYXI6IHRydWUsXG4gICAgICogICAgICAgZmFyOiA0MDAsXG4gICAgICogICAgICAgZm92OiA5MCxcbiAgICAgKlxuICAgICAqICAgICAgIHRvcDogMjAwLFxuICAgICAqICAgICAgIGJvdHRvbTogLTIwMCxcbiAgICAgKiAgICAgICBsZWZ0OiAtMjAwLFxuICAgICAqICAgICAgIHJpZ2h0OiAyMDBcbiAgICAgKiAgICAgfVxuICAgICAqICAgfSxcbiAgICAgKlxuICAgICAqICAgcG9zaXRpb246IHt4OiAwLCB5OiAwLCB6OiAwfSxcbiAgICAgKiAgIHJvdGF0aW9uOiB7eDogMCwgeTogMCwgejogMH1cbiAgICAgKiB9XG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBTdGF0aWMgaW5zdHJ1Y3Rpb25zXG4gICAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29yZS5MaWdodENvbXBvbmVudCNpbnN0cnVjdGlvbnNcbiAgICAgKiBAc3RhdGljXG4gICAgICogQGRlZmF1bHRcbiAgICAgKiB7XG4gICAgICogICBwb3NpdGlvbjogWyd4JywgJ3knLCAneiddLFxuICAgICAqICAgcm90YXRpb246IFsneCcsICd5JywgJ3onXVxuICAgICAqIH1cbiAgICAgKi9cbiAgICB2YWx1ZTogZnVuY3Rpb24gZnJvbShsaWdodCkge1xuICAgICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG4gICAgICB2YXIgd3JhcFNoYWRvdyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogdHJ1ZTtcbiAgICAgIHBhcmFtcy5idWlsZCA9IGZhbHNlO1xuICAgICAgdmFyIGNvbXBvbmVudCA9IG5ldyBMaWdodENvbXBvbmVudChwYXJhbXMpO1xuICAgICAgY29tcG9uZW50Lm5hdGl2ZSA9IGxpZ2h0O1xuICAgICAgY29tcG9uZW50LndyYXAoKTtcbiAgICAgIGlmICh3cmFwU2hhZG93KSBjb21wb25lbnQud3JhcFNoYWRvdygpO1xuICAgICAgcmV0dXJuIGNvbXBvbmVudDtcbiAgICB9XG4gIH1dKTtcblxuICBmdW5jdGlvbiBMaWdodENvbXBvbmVudChwYXJhbXMpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICB2YXIgZGVmYXVsdHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IExpZ2h0Q29tcG9uZW50LmRlZmF1bHRzO1xuICAgIHZhciBpbnN0cnVjdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IExpZ2h0Q29tcG9uZW50Lmluc3RydWN0aW9ucztcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIExpZ2h0Q29tcG9uZW50KTtcblxuICAgIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBnZXRQcm90b3R5cGVPZiQyKExpZ2h0Q29tcG9uZW50KS5jYWxsKHRoaXMsIHBhcmFtcywgZGVmYXVsdHMsIGluc3RydWN0aW9ucykpO1xuXG4gICAgaWYgKF90aGlzLnBhcmFtcy5idWlsZCkge1xuICAgICAgdmFyIGJ1aWxkID0gX3RoaXMuYnVpbGQoX3RoaXMucGFyYW1zKTtcblxuICAgICAgaWYgKCFidWlsZCkge1xuICAgICAgICB0aHJvdyBuZXcgQ29tcG9zaXRpb25FcnJvciQxKCdMaWdodENvbXBvbmVudCcsICcuYnVpbGQoKSBtZXRob2Qgc2hvdWxkIHJldHVybiBhIFRIUkVFLk9iamVjdDNEIG9yIGEgUHJvbWlzZSByZXNvbHZlZCB3aXRoIFRIUkVFLk9iamVjdDNELicsIGFzc2VydFRoaXNJbml0aWFsaXplZChhc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpKSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChidWlsZCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgYnVpbGQudGhlbihmdW5jdGlvbiAobmF0aXZlKSB7XG4gICAgICAgICAgX3RoaXMubmF0aXZlID0gbmF0aXZlO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBfdGhpcy5uYXRpdmUgPSBidWlsZDtcblxuICAgICAgX3RoaXMud2FpdChfdGhpcy53cmFwKCkpO1xuICAgIH1cblxuICAgIF90aGlzLmFwcGx5Q29tbWFuZCgncG9zdEludGVncmF0ZScpO1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9IC8vIEJVSUxESU5HICYgV1JBUFBJTkdcblxuICAvKipcbiAgICogQG1ldGhvZCBidWlsZFxuICAgKiBAaW5zdGFuY2VcbiAgICogQGRlc2NyaXB0aW9uIEJ1aWxkIGxpdmVjeWNsZSBzaG91bGQgcmV0dXJuIGEgbmF0aXZlIG9iamVjdC5cbiAgICogQHRocm93cyB7Q29tcG9zaXRpb25FcnJvcn1cbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLkxpZ2h0Q29tcG9uZW50XG4gICAqL1xuXG5cbiAgY3JlYXRlQ2xhc3MoTGlnaHRDb21wb25lbnQsIFt7XG4gICAga2V5OiBcImJ1aWxkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGJ1aWxkKCkge1xuICAgICAgdGhyb3cgbmV3IENvbXBvc2l0aW9uRXJyb3IkMSgnTWVzaENvbXBvbmVudCcsICdJbnN0YW5jZSBzaG91bGQgaGF2ZSBpdFxcJ3Mgb3duIC5idWlsZCgpLicsIHRoaXMpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAbWV0aG9kIHdyYXBcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAZGVzY3JpcHRpb24gV3JhcHMgdHJhbnNmb3JtcyAoYHBvc2l0aW9uYCAmIGByb3RhdGlvbmApXG4gICAgICogQHJldHVybiB7UHJvbWlzZX0gUmVzb2x2ZWQgd2hlbiBhY3Rpb24gaXMgY29tcGxldGVkXG4gICAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLkxpZ2h0Q29tcG9uZW50XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJ3cmFwXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHdyYXAoKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgIF90aGlzMi5kZWZlcihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdmFyIF90aGlzMiRwYXJhbXMgPSBfdGhpczIucGFyYW1zLFxuICAgICAgICAgICAgICBwb3NpdGlvbiA9IF90aGlzMiRwYXJhbXMucG9zaXRpb24sXG4gICAgICAgICAgICAgIHJvdGF0aW9uID0gX3RoaXMyJHBhcmFtcy5yb3RhdGlvbjtcblxuICAgICAgICAgIF90aGlzMi5wb3NpdGlvbi5zZXQocG9zaXRpb24ueCwgcG9zaXRpb24ueSwgcG9zaXRpb24ueik7XG5cbiAgICAgICAgICBfdGhpczIucm90YXRpb24uc2V0KHJvdGF0aW9uLngsIHJvdGF0aW9uLnksIHJvdGF0aW9uLnopO1xuXG4gICAgICAgICAgX3RoaXMyLmFwcGx5QnJpZGdlKHtcbiAgICAgICAgICAgIG9uV3JhcDogMVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgcmVzb2x2ZShfdGhpczIpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAbWV0aG9kIHdyYXBTaGFkb3dcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAZGVzY3JpcHRpb24gV3JhcHMgc2hhZG93IHByb3BlcnRpZXNcbiAgICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmUuTGlnaHRDb21wb25lbnRcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIndyYXBTaGFkb3dcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gd3JhcFNoYWRvdygpIHtcbiAgICAgIHZhciBuYXRpdmUgPSB0aGlzLm5hdGl2ZSxcbiAgICAgICAgICBzaGFkb3cgPSB0aGlzLnBhcmFtcy5zaGFkb3c7XG4gICAgICBuYXRpdmUuY2FzdFNoYWRvdyA9IHNoYWRvdy5jYXN0O1xuICAgICAgbmF0aXZlLnNoYWRvdy5tYXBTaXplLndpZHRoID0gc2hhZG93Lm1hcFNpemUud2lkdGg7XG4gICAgICBuYXRpdmUuc2hhZG93Lm1hcFNpemUuaGVpZ2h0ID0gc2hhZG93Lm1hcFNpemUuaGVpZ2h0O1xuICAgICAgbmF0aXZlLnNoYWRvdy5iaWFzID0gc2hhZG93LmJpYXM7XG4gICAgICBuYXRpdmUuc2hhZG93LnJhZGl1cyA9IHNoYWRvdy5yYWRpdXM7XG4gICAgICB2YXIgc2hhZG93Q2FtZXJhID0gbmF0aXZlLnNoYWRvdy5jYW1lcmE7XG4gICAgICB2YXIgY2FtZXJhID0gc2hhZG93LmNhbWVyYTtcbiAgICAgIHNoYWRvd0NhbWVyYS5uZWFyID0gY2FtZXJhLm5lYXI7XG4gICAgICBzaGFkb3dDYW1lcmEuZmFyID0gY2FtZXJhLmZhcjtcbiAgICAgIHNoYWRvd0NhbWVyYS5mb3YgPSBjYW1lcmEuZm92O1xuICAgICAgc2hhZG93Q2FtZXJhLmxlZnQgPSBjYW1lcmEubGVmdDtcbiAgICAgIHNoYWRvd0NhbWVyYS5yaWdodCA9IGNhbWVyYS5yaWdodDtcbiAgICAgIHNoYWRvd0NhbWVyYS50b3AgPSBjYW1lcmEudG9wO1xuICAgICAgc2hhZG93Q2FtZXJhLmJvdHRvbSA9IGNhbWVyYS5ib3R0b207XG4gICAgfSAvLyBDT1BZSU5HICYgQ0xPTklOR1xuXG4gICAgLyoqXG4gICAgICogQG1ldGhvZCBjb3B5XG4gICAgICogQGluc3RhbmNlXG4gICAgICogQGRlc2NyaXB0aW9uIENvcHkgc291cmNlIHRyYW5zZm9ybXMgJiBleGVjdXRlIGBDb21wb25lbnQuY29weSgpYFxuICAgICAqIEByZXR1cm4ge3RoaXN9IExpZ2h0Q29tcG9uZW50XG4gICAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLkxpZ2h0Q29tcG9uZW50XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJjb3B5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvcHkkJDEoc291cmNlKSB7XG4gICAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgICAgcmV0dXJuIGdldCQzKGdldFByb3RvdHlwZU9mJDIoTGlnaHRDb21wb25lbnQucHJvdG90eXBlKSwgXCJjb3B5XCIsIHRoaXMpLmNhbGwodGhpcywgc291cmNlLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChfdGhpczMudGFyZ2V0KSBfdGhpczMudGFyZ2V0LmNvcHkoc291cmNlLnRhcmdldCgpKTtcblxuICAgICAgICBfdGhpczMucG9zaXRpb24uY29weShzb3VyY2UucG9zaXRpb24pO1xuXG4gICAgICAgIF90aGlzMy5yb3RhdGlvbi5jb3B5KHNvdXJjZS5yb3RhdGlvbik7XG5cbiAgICAgICAgX3RoaXMzLnF1YXRlcm5pb24uY29weShzb3VyY2UucXVhdGVybmlvbik7XG4gICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQG1ldGhvZCBjbG9uZVxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBkZXNjcmlwdGlvbiBNYWtlIGEgY2xvbmUgb2YgdGhpcyBMaWdodENvbXBvbmVudCB1c2luZyBgLmNvcHkoKWBcbiAgICAgKiBAcmV0dXJuIHtMaWdodENvbXBvbmVudH0gY2xvbmUgb2YgdGhpcyBvYmplY3RcbiAgICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmUuTGlnaHRDb21wb25lbnRcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImNsb25lXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNsb25lKCkge1xuICAgICAgcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHtcbiAgICAgICAgYnVpbGQ6IGZhbHNlXG4gICAgICB9KS5jb3B5KHRoaXMpO1xuICAgIH1cbiAgfV0pO1xuXG4gIGluaGVyaXRzKExpZ2h0Q29tcG9uZW50LCBfQ29tcG9uZW50KTtcblxuICByZXR1cm4gTGlnaHRDb21wb25lbnQ7XG59KENvbXBvbmVudCkpIHx8IF9jbGFzcyQxKTtcblxuZGVmaW5lUHJvcGVydHkkMyhkZWZpbmVQcm9wZXJ0eSQzKExpZ2h0Q29tcG9uZW50LCBcImRlZmF1bHRzXCIsIG9iamVjdFNwcmVhZCh7fSwgQ29tcG9uZW50LmRlZmF1bHRzLCB7XG4gIGJ1aWxkOiB0cnVlLFxuICBzaGFkb3c6IHtcbiAgICBjYXN0OiB0cnVlLFxuICAgIGJpYXM6IDAsXG4gICAgcmFkaXVzOiAxLFxuICAgIG1hcFNpemU6IHtcbiAgICAgIHdpZHRoOiAxMDI0LFxuICAgICAgaGVpZ2h0OiAxMDI0XG4gICAgfSxcbiAgICBjYW1lcmE6IHtcbiAgICAgIG5lYXI6IHRydWUsXG4gICAgICBmYXI6IDQwMCxcbiAgICAgIGZvdjogOTAsXG4gICAgICB0b3A6IDIwMCxcbiAgICAgIGJvdHRvbTogLTIwMCxcbiAgICAgIGxlZnQ6IC0yMDAsXG4gICAgICByaWdodDogMjAwXG4gICAgfVxuICB9LFxuICBwb3NpdGlvbjoge1xuICAgIHg6IDAsXG4gICAgeTogMCxcbiAgICB6OiAwXG4gIH0sXG4gIHJvdGF0aW9uOiB7XG4gICAgeDogMCxcbiAgICB5OiAwLFxuICAgIHo6IDBcbiAgfVxufSkpLCBcImluc3RydWN0aW9uc1wiLCB7XG4gIHBvc2l0aW9uOiBbJ3gnLCAneScsICd6J10sXG4gIHJvdGF0aW9uOiBbJ3gnLCAneScsICd6J11cbn0pO1xuXG52YXIgX2RlYyQyLCBfY2xhc3MkMjtcbnZhciBcbi8qKlxuICogQGNsYXNzIENhbWVyYUNvbXBvbmVudFxuICogQGNhdGVnb3J5IGNvcmVcbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zXSAtIFRoZSBwYXJhbWV0ZXJzIG9iamVjdC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbaW5zdHJ1Y3Rpb25zXSAtIFRoZSBpbnN0cnVjdGlvbnMgb2JqZWN0LlxuICogQGV4dGVuZHMgbW9kdWxlOmNvcmUuQ29tcG9uZW50XG4gKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmVcbiAqL1xuQ2FtZXJhQ29tcG9uZW50ID0gKF9kZWMkMiA9IGF0dHJpYnV0ZXMoY29weSgncG9zaXRpb24nLCAncm90YXRpb24nLCAncXVhdGVybmlvbicsICd0YXJnZXQnKSksIF9kZWMkMihfY2xhc3MkMiA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX0NvbXBvbmVudCkge1xuICBjcmVhdGVDbGFzcyhDYW1lcmFDb21wb25lbnQsIG51bGwsIFt7XG4gICAga2V5OiBcImZyb21cIixcblxuICAgIC8qKlxuICAgICAqIERlZmF1bHQgdmFsdWVzIGZvciBwYXJhbWV0ZXJzXG4gICAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29yZS5DYW1lcmFDb21wb25lbnQjZGVmYXVsdHNcbiAgICAgKiBAc3RhdGljXG4gICAgICogQGRlZmF1bHRcbiAgICAgKiB7XG4gICAgICogICBidWlsZDogdHJ1ZSxcbiAgICAgKlxuICAgICAqICAgcG9zaXRpb246IHt4OiAwLCB5OiAwLCB6OiAwfSxcbiAgICAgKiAgIHJvdGF0aW9uOiB7eDogMCwgeTogMCwgejogMH1cbiAgICAgKiB9XG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBTdGF0aWMgaW5zdHJ1Y3Rpb25zXG4gICAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29yZS5DYW1lcmFDb21wb25lbnQjaW5zdHJ1Y3Rpb25zXG4gICAgICogQHN0YXRpY1xuICAgICAqIEBkZWZhdWx0XG4gICAgICoge1xuICAgICAqICAgcG9zaXRpb246IFsneCcsICd5JywgJ3onXSxcbiAgICAgKiAgIHJvdGF0aW9uOiBbJ3gnLCAneScsICd6J10sXG4gICAgICogICBzY2FsZTogWyd4JywgJ3knLCAneiddXG4gICAgICogfVxuICAgICAqL1xuICAgIHZhbHVlOiBmdW5jdGlvbiBmcm9tKGNhbWVyYSkge1xuICAgICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG4gICAgICBwYXJhbXMuYnVpbGQgPSBmYWxzZTtcbiAgICAgIHZhciBjb21wb25lbnQgPSBuZXcgQ2FtZXJhQ29tcG9uZW50KHBhcmFtcyk7XG4gICAgICBjb21wb25lbnQubmF0aXZlID0gY2FtZXJhO1xuICAgICAgY29tcG9uZW50LndyYXAoKTtcbiAgICAgIHJldHVybiBjb21wb25lbnQ7XG4gICAgfVxuICB9XSk7XG5cbiAgZnVuY3Rpb24gQ2FtZXJhQ29tcG9uZW50KHBhcmFtcykge1xuICAgIHZhciBfdGhpcztcblxuICAgIHZhciBkZWZhdWx0cyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogQ2FtZXJhQ29tcG9uZW50LmRlZmF1bHRzO1xuICAgIHZhciBpbnN0cnVjdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IENhbWVyYUNvbXBvbmVudC5pbnN0cnVjdGlvbnM7XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBDYW1lcmFDb21wb25lbnQpO1xuXG4gICAgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIGdldFByb3RvdHlwZU9mJDIoQ2FtZXJhQ29tcG9uZW50KS5jYWxsKHRoaXMsIHBhcmFtcywgZGVmYXVsdHMsIGluc3RydWN0aW9ucykpO1xuXG4gICAgaWYgKF90aGlzLnBhcmFtcy5idWlsZCkge1xuICAgICAgdmFyIGJ1aWxkID0gX3RoaXMuYnVpbGQoX3RoaXMucGFyYW1zKTtcblxuICAgICAgaWYgKCFidWlsZCkge1xuICAgICAgICB0aHJvdyBuZXcgQ29tcG9zaXRpb25FcnJvciQxKCdDYW1lcmFDb21wb25lbnQnLCAnLmJ1aWxkKCkgbWV0aG9kIHNob3VsZCByZXR1cm4gYSBUSFJFRS5PYmplY3QzRCBvciBhIFByb21pc2UgcmVzb2x2ZWQgd2l0aCBUSFJFRS5PYmplY3QzRC4nLCBhc3NlcnRUaGlzSW5pdGlhbGl6ZWQoYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSkpO1xuICAgICAgfVxuXG4gICAgICBpZiAoYnVpbGQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgIGJ1aWxkLnRoZW4oZnVuY3Rpb24gKG5hdGl2ZSkge1xuICAgICAgICAgIF90aGlzLm5hdGl2ZSA9IG5hdGl2ZTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgX3RoaXMubmF0aXZlID0gYnVpbGQ7XG5cbiAgICAgIF90aGlzLndhaXQoX3RoaXMud3JhcCgpKTtcbiAgICB9XG5cbiAgICBfdGhpcy5hcHBseUNvbW1hbmQoJ3Bvc3RJbnRlZ3JhdGUnKTtcblxuICAgIHJldHVybiBfdGhpcztcbiAgfSAvLyBCVUlMRElORyAmIFdSQVBQSU5HXG5cbiAgLyoqXG4gICAqIEBtZXRob2QgYnVpbGRcbiAgICogQGluc3RhbmNlXG4gICAqIEBkZXNjcmlwdGlvbiBCdWlsZCBsaXZlY3ljbGUgc2hvdWxkIHJldHVybiBhIG5hdGl2ZSBvYmplY3QuXG4gICAqIEB0aHJvd3Mge0NvbXBvc2l0aW9uRXJyb3J9XG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZS5DYW1lcmFDb21wb25lbnRcbiAgICovXG5cblxuICBjcmVhdGVDbGFzcyhDYW1lcmFDb21wb25lbnQsIFt7XG4gICAga2V5OiBcImJ1aWxkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGJ1aWxkKCkge1xuICAgICAgdGhyb3cgbmV3IENvbXBvc2l0aW9uRXJyb3IkMSgnQ2FtZXJhQ29tcG9uZW50JywgJ0luc3RhbmNlIHNob3VsZCBoYXZlIGl0XFwncyBvd24gLmJ1aWxkKCkuJywgdGhpcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBtZXRob2Qgd3JhcFxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBkZXNjcmlwdGlvbiBXcmFwcyB0cmFuc2Zvcm1zIChgcG9zaXRpb25gICYgYHJvdGF0aW9uYClcbiAgICAgKiBAcmV0dXJuIHtQcm9taXNlfSBSZXNvbHZlZCB3aGVuIGFjdGlvbiBpcyBjb21wbGV0ZWRcbiAgICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmUuQ2FtZXJhQ29tcG9uZW50XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJ3cmFwXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHdyYXAoKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgIF90aGlzMi5kZWZlcihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgX3RoaXMyLnBvc2l0aW9uLnNldChfdGhpczIucGFyYW1zLnBvc2l0aW9uLngsIF90aGlzMi5wYXJhbXMucG9zaXRpb24ueSwgX3RoaXMyLnBhcmFtcy5wb3NpdGlvbi56KTtcblxuICAgICAgICAgIF90aGlzMi5yb3RhdGlvbi5zZXQoX3RoaXMyLnBhcmFtcy5yb3RhdGlvbi54LCBfdGhpczIucGFyYW1zLnJvdGF0aW9uLnksIF90aGlzMi5wYXJhbXMucm90YXRpb24ueik7XG5cbiAgICAgICAgICBfdGhpczIuYXBwbHlCcmlkZ2Uoe1xuICAgICAgICAgICAgb25XcmFwOiAxXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICByZXNvbHZlKF90aGlzMik7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBtZXRob2QgY29weVxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBkZXNjcmlwdGlvbiBDb3B5IHNvdXJjZSB0cmFuc2Zvcm1zICYgZXhlY3V0ZSBgQ29tcG9uZW50LmNvcHkoKWBcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSBDYW1lcmFDb21wb25lbnRcbiAgICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmUuQ2FtZXJhQ29tcG9uZW50XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJjb3B5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGNvcHkkJDEoc291cmNlKSB7XG4gICAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgICAgcmV0dXJuIGdldCQzKGdldFByb3RvdHlwZU9mJDIoQ2FtZXJhQ29tcG9uZW50LnByb3RvdHlwZSksIFwiY29weVwiLCB0aGlzKS5jYWxsKHRoaXMsIHNvdXJjZSwgZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoX3RoaXMzLnRhcmdldCkgX3RoaXMzLnRhcmdldC5jb3B5KHNvdXJjZS50YXJnZXQoKSk7XG5cbiAgICAgICAgX3RoaXMzLnBvc2l0aW9uLmNvcHkoc291cmNlLnBvc2l0aW9uKTtcblxuICAgICAgICBfdGhpczMucm90YXRpb24uY29weShzb3VyY2Uucm90YXRpb24pO1xuXG4gICAgICAgIF90aGlzMy5xdWF0ZXJuaW9uLmNvcHkoc291cmNlLnF1YXRlcm5pb24pO1xuICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBtZXRob2QgY2xvbmVcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAZGVzY3JpcHRpb24gTWFrZSBhIGNsb25lIG9mIHRoaXMgQ2FtZXJhQ29tcG9uZW50IHVzaW5nIGAuY29weSgpYFxuICAgICAqIEByZXR1cm4ge0NhbWVyYUNvbXBvbmVudH0gY2xvbmUgb2YgdGhpcyBvYmplY3RcbiAgICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmUuQ2FtZXJhQ29tcG9uZW50XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJjbG9uZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjbG9uZSgpIHtcbiAgICAgIHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih7XG4gICAgICAgIGJ1aWxkOiBmYWxzZVxuICAgICAgfSkuY29weSh0aGlzKTtcbiAgICB9XG4gIH1dKTtcblxuICBpbmhlcml0cyhDYW1lcmFDb21wb25lbnQsIF9Db21wb25lbnQpO1xuXG4gIHJldHVybiBDYW1lcmFDb21wb25lbnQ7XG59KENvbXBvbmVudCkpIHx8IF9jbGFzcyQyKTtcblxuZGVmaW5lUHJvcGVydHkkMyhkZWZpbmVQcm9wZXJ0eSQzKENhbWVyYUNvbXBvbmVudCwgXCJkZWZhdWx0c1wiLCBvYmplY3RTcHJlYWQoe30sIENvbXBvbmVudC5kZWZhdWx0cywge1xuICBidWlsZDogdHJ1ZSxcbiAgcG9zaXRpb246IHtcbiAgICB4OiAwLFxuICAgIHk6IDAsXG4gICAgejogMFxuICB9LFxuICByb3RhdGlvbjoge1xuICAgIHg6IDAsXG4gICAgeTogMCxcbiAgICB6OiAwXG4gIH1cbn0pKSwgXCJpbnN0cnVjdGlvbnNcIiwge1xuICBwb3NpdGlvbjogWyd4JywgJ3knLCAneiddLFxuICByb3RhdGlvbjogWyd4JywgJ3knLCAneiddLFxuICBzY2FsZTogWyd4JywgJ3knLCAneiddXG59KTtcblxuY29uc3QgdmVyc2lvbiA9IFwiMi4yLjAtYWxwaGEuMFwiO1xuXG52YXIgc3lzdGVtID0ge1xuICB3aW5kb3c6IHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnID8gZ2xvYmFsIDogd2luZG93XG59O1xuXG4vKipcbiAqIEBjbGFzcyBBcHBcbiAqIEBjYXRlZ29yeSBjb3JlXG4gKiBAZGVzY3JpcHRpb24gVGhpcyBjb21wb25lbnQgaXMgdXNlZCB0byBwcmVwYXJlIGEgd29ybGQgc2NlbmUsIHNldHVwIHBoeXNpY3MsIGNhbWVyYSwgcmVuZGVyZXIgYW5kIGFsbCBvdGhlciB0aGluZ3MgdGhhdCB5b3UgdXN1YWxseSBkbyBiZWZvcmUgbWFraW5nIG1lc2hlcy5cbiAqIEBwYXJhbSB7QXJyYXl9IFttb2R1bGVzPVtdXSAtIEFycmF5IG9mIE1vZHVsZXNcbiAqIEBleHRlbmRzIE1vZHVsZVN5c3RlbVxuICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlXG4gKi9cblxudmFyIEFwcCA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX01vZHVsZVN5c3RlbSkge1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERlZmluZXMgd2hldGhlciB0aGUgc2NlbmUgc2hvdWxkIHJlbmRlciBvciBub3RcbiAgICogQG1lbWJlciB7Qm9vbGVhbn0gbW9kdWxlOmNvcmUuQXBwI2VuYWJsZWRcbiAgICogQHB1YmxpY1xuICAgKi9cblxuICAvKipcbiAgICogTG9vcHMgaW4gdGhpcyBhcHBcbiAgICogQGRlc2NyaXB0aW9uIEFycmF5IG9mIGxvb3BzIHRoYXQgYXJlIGV4ZWN1dGVkIGJ5IHRoaXMgYXBwLlxuICAgKiBAbWVtYmVyIHtBcnJheX0gbW9kdWxlOmNvcmUuQXBwI2xvb3BzXG4gICAqIEBwdWJsaWNcbiAgICovXG4gIGZ1bmN0aW9uIEFwcCgpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICB2YXIgbW9kdWxlcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogW107XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBBcHApO1xuXG4gICAgY29uc29sZS5sb2coXCJXSFMuQXBwIFwiLmNvbmNhdCh2ZXJzaW9uKSk7XG4gICAgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIGdldFByb3RvdHlwZU9mJDIoQXBwKS5jYWxsKHRoaXMpKTtcblxuICAgIGRlZmluZVByb3BlcnR5JDMoZGVmaW5lUHJvcGVydHkkMyhhc3NlcnRUaGlzSW5pdGlhbGl6ZWQoYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSksIFwiZW5hYmxlZFwiLCB0cnVlKSwgXCJsb29wc1wiLCBbXSk7XG5cbiAgICBfdGhpcy5tYW5hZ2VyID0gbmV3IE1vZHVsZU1hbmFnZXIoYXNzZXJ0VGhpc0luaXRpYWxpemVkKGFzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcykpKTtcbiAgICBfdGhpcy5tb2R1bGVzID0gbW9kdWxlcztcblxuICAgIF90aGlzLmludGVncmF0ZU1vZHVsZXMoKTtcblxuICAgIHJldHVybiBfdGhpcztcbiAgfSAvLyBDT05UUk9MUyAmIFVQREFUSU5HXG5cbiAgLyoqXG4gICAqIEBtZXRob2Qgc3RhcnRcbiAgICogQGRlc2NyaXB0aW9uIFN0YXJ0IHJlbmRlcmluZyBsb29wIGFuZCBwaHlzaWNzIHNpbXVsYXRpb24gKGlmIHlvdSB1c2UgdmVyc2lvbiB3aXRoIHBoeXNpY3MpLlxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmUuQXBwXG4gICAqL1xuXG5cbiAgY3JlYXRlQ2xhc3MoQXBwLCBbe1xuICAgIGtleTogXCJzdGFydFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzdGFydCgpIHtcbiAgICAgIHZhciByZXF1ZXN0QW5pbUZyYW1lID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gc3lzdGVtLndpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHwgc3lzdGVtLndpbmRvdy53ZWJraXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHwgc3lzdGVtLndpbmRvdy5tb3pSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHwgZnVuY3Rpb24gKGNhbGxiYWNrKSB7XG4gICAgICAgICAgc3lzdGVtLndpbmRvdy5zZXRUaW1lb3V0KGNhbGxiYWNrLCAxMDAwIC8gNjApO1xuICAgICAgICB9O1xuICAgICAgfSgpO1xuXG4gICAgICB2YXIgbG9vcHMgPSB0aGlzLmxvb3BzLFxuICAgICAgICAgIGVuYWJsZWQgPSB0aGlzLmVuYWJsZWQ7XG5cbiAgICAgIGZ1bmN0aW9uIHByb2Nlc3MoKSB7XG4gICAgICAgIHJlcXVlc3RBbmltRnJhbWUocHJvY2Vzcyk7XG4gICAgICAgIGlmICghZW5hYmxlZCkgcmV0dXJuO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSAwLCBsbCA9IGxvb3BzLmxlbmd0aDsgaSA8IGxsOyBpKyspIHtcbiAgICAgICAgICB2YXIgZSA9IGxvb3BzW2ldO1xuICAgICAgICAgIGlmIChlLmVuYWJsZWQpIGUuZXhlY3V0ZShlLmNsb2NrKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLmVuYWJsZWQgPSB0cnVlO1xuICAgICAgcHJvY2VzcygpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAbWV0aG9kIHN0b3BcbiAgICAgKiBAZGVzY3JpcHRpb24gU3RvcHMgcmVuZGVyaW5nIGxvb3BzXG4gICAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLkFwcFxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwic3RvcFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzdG9wKCkge1xuICAgICAgdGhpcy5lbmFibGVkID0gZmFsc2U7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBtZXRob2QgYWRkTG9vcFxuICAgICAqIEBkZXNjcmlwdGlvbiBBZGRzIGxvb3AgdG8gdGhpcyBhcHAuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGxvb3AgLSB0aGUgbG9vcCB0byBhZGRcbiAgICAgKiBAcmV0dXJuIHtQcm9taXNlfSBQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2hlbiBwcm9taXNlcyBjb21wbGV0ZWQuXG4gICAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLkFwcFxuICAgICAqIEBleGFtcGxlIDxjYXB0aW9uPkFkZGluZyBhIGxvb3AgdG8gYW4gYXBwPC9jYXB0aW9uPlxuICAgICAqIGNvbnN0IGxvb3AgPSBuZXcgTG9vcCgoKSA9PiB7XG4gICAgICogIC8vIC4uLlxuICAgICAqIH0pO1xuICAgICAqXG4gICAgICogY29uc3QgYXBwID0gbmV3IEFwcCgpO1xuICAgICAqXG4gICAgICogYXBwLmFkZExvb3AobG9vcCk7XG4gICAgICogbG9vcC5zdGFydCgpO1xuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiYWRkTG9vcFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhZGRMb29wKGxvb3ApIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgX3RoaXMyLmxvb3BzLnB1c2gobG9vcCk7XG5cbiAgICAgICAgcmVzb2x2ZShsb29wKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAbWV0aG9kIHJlbW92ZUxvb3BcbiAgICAgKiBAZGVzY3JpcHRpb24gUmVtb3ZlcyBsb29wIGZyb20gdGhpcyBhcHAuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGxvb3AgLSB0aGUgbG9vcCB0byByZW1vdmVcbiAgICAgKiBAcmV0dXJuIHtQcm9taXNlfSBQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgd2hlbiBwcm9taXNlcyBjb21wbGV0ZWQuXG4gICAgICogQG1lbWJlcm9mIG1vZHVsZTpjb3JlLkFwcFxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwicmVtb3ZlTG9vcFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW1vdmVMb29wKGxvb3ApIHtcbiAgICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gX3RoaXMzLmxvb3BzLmluZGV4T2YobG9vcCk7XG5cbiAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkgX3RoaXMzLmxvb3BzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIHJlc29sdmUobG9vcCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldChrZXkpIHtcbiAgICAgIHJldHVybiB0aGlzLm1hbmFnZXIuZ2V0KGtleSk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcInVzZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB1c2Uoa2V5KSB7XG4gICAgICByZXR1cm4gdGhpcy5tYW5hZ2VyLnVzZShrZXkpO1xuICAgIH1cbiAgfV0pO1xuXG4gIGluaGVyaXRzKEFwcCwgX01vZHVsZVN5c3RlbSk7XG5cbiAgcmV0dXJuIEFwcDtcbn0oTW9kdWxlU3lzdGVtKTtcblxuLyoqXG4gKiBAY2xhc3MgTG9vcFxuICogQGNhdGVnb3J5IGNvcmVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgZnVuY3Rpb24gdG8gZXhlY3V0ZSBvbiBlYWNoIGFuaW1hdGlvbiBmcmFtZVxuICogQHBhcmFtIHtCb29sZWFufSBbdXNlQ2xvY2s9dHJ1ZV0gcGFzc2VzIGEgQ2xvY2sgdG8gdGhlIGZ1bmN0aW9uIHdoZW4gY2FsbGVkLCBpZiB0cnVlXG4gKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmVcbiAqL1xuXG52YXIgTG9vcCA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIExvb3AoZnVuYykge1xuICAgIHZhciB1c2VDbG9jayA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogdHJ1ZTtcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIExvb3ApO1xuXG4gICAgdGhpcy5mdW5jID0gZnVuYztcbiAgICB0aGlzLmNsb2NrID0gdXNlQ2xvY2sgPyBuZXcgQ2xvY2soKSA6IG51bGw7XG4gICAgdGhpcy5lbmFibGVkID0gZmFsc2U7XG4gIH0gLy8gQ09OVFJPTFNcblxuICAvKipcbiAgICogQG1ldGhvZCBzdGFydFxuICAgKiBAaW5zdGFuY2VcbiAgICogQGRlc2NyaXB0aW9uIFN0YXJ0cyB0aGlzIGxvb3AsIGNsb2NrIGlmIGl0IGhhcyBvbmUuIFdvbid0IGRvIGFueXRoaW5nIGlmIGxvb3AgZW5hYmxlZCBhbHJlYWR5LlxuICAgKiBAcGFyYW0ge0NvbXBvbmVudH0gW3dvcmxkXSBhcHAgdG8gYWRkIHRoaXMgbG9vcCB0bywgaWYgcHJvdmlkZWQuXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZS5Mb29wXG4gICAqL1xuXG5cbiAgY3JlYXRlQ2xhc3MoTG9vcCwgW3tcbiAgICBrZXk6IFwic3RhcnRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc3RhcnQod29ybGQpIHtcbiAgICAgIGlmICh0aGlzLmVuYWJsZWQpIHJldHVybjtcbiAgICAgIGlmICh3b3JsZCkgd29ybGQuYWRkTG9vcCh0aGlzKTtcbiAgICAgIGlmICh0aGlzLmNsb2NrKSB0aGlzLmNsb2NrLnN0YXJ0KCk7XG4gICAgICB0aGlzLmVuYWJsZWQgPSB0cnVlO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAbWV0aG9kIHN0b3BcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAZGVzY3JpcHRpb24gU3RvcHMgdGhpcyBsb29wIGFuZCBpdHMgY2xvY2sgaWYgaXQgaGFzIG9uZSwgd29uJ3QgZG8gYW55dGhpbmcgaWYgdGhpcyBsb29wIGlzIG5vdCBlbmFibGVkKVxuICAgICAqIEBwYXJhbSB7Q29tcG9uZW50fSBbd29ybGRdIGFwcCB0byByZW1vdmUgdGhpcyBsb29wIGZyb20sIGlmIHByb3ZpZGVkLlxuICAgICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29yZS5Mb29wXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJzdG9wXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHN0b3Aod29ybGQpIHtcbiAgICAgIGlmICghdGhpcy5lbmFibGVkKSByZXR1cm47XG4gICAgICBpZiAodGhpcy5jbG9jaykgdGhpcy5jbG9jay5zdG9wKCk7XG4gICAgICB0aGlzLmVuYWJsZWQgPSBmYWxzZTtcbiAgICAgIGlmICh3b3JsZCkgd29ybGQucmVtb3ZlTG9vcCh0aGlzKTtcbiAgICB9IC8vIEVYRUNVVElPTlxuXG4gICAgLyoqXG4gICAgICogQG1ldGhvZCBleGVjdXRlXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQGRlc2NyaXB0aW9uIEV4ZWN1dGVzIHRoZSBmdW5jdGlvbiBvZiB0aGlzIGxvb3BcbiAgICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvcmUuTG9vcFxuICAgICAqIEByZXR1cm5zIHsqfSB3aGF0ZXZlciB0aGUgZnVuY3Rpb24gb2YgdGhpcyBsb29wIHJldHVybnNcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImV4ZWN1dGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZXhlY3V0ZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmZ1bmModGhpcy5jbG9jayk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIExvb3A7XG59KCk7XG5cbi8qKiBAbW9kdWxlIGNvcmUgKi9cblxuLyoqXG4gKiBAY2xhc3MgQW1iaWVudExpZ2h0XG4gKiBAY2F0ZWdvcnkgY29tcG9uZW50cy9saWdodHNcbiAqIEBkZXNjcmlwdGlvbiBBbWJpZW50TGlnaHQgaXMgYSBzaW1wbGUgY2xhc3MsIGl0IGV4dGVuZHMgTGlnaHQgYW5kIGluaGVyaXRzIGFsbCBpdHMgbWV0aG9kcy5cbiAqIEFtYmllbnRMaWdodCBjcmVhdGVzIGJhc2ljIGxpZ2h0IGFyb3VuZCBhbGwgc2NlbmUsIHNvIGl0IGRvZXNuJ3QgbmVlZCBwcm9wZXJ0aWVzIGxpa2UgcG9zIG9yIHRhcmdldC5cbiAqIEl0IHN1cHBvcnRzIG9ubHkgY29sb3IgYW5kIGludGVuc2l0eSBhcyBwYXJhbWV0ZXJzLCB3aGljaCBkZWZpbmVzIHRoZSBjb2xvciBvZiB0aGUgc3Vycm91bmRlZCBsaWdodCBhbmQgaW50ZW5zaXR5IG9mIGxpZ2h0LlxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXM9e2xpZ2h0OiB7Y29sb3I6IDB4ZmZmZmZmLCBpbnRlbnNpdHk6IDF9fV0gLSBUaGUgcGFyYW1zLlxuICogQGV4dGVuZHMgbW9kdWxlOmNvcmUuTGlnaHRDb21wb25lbnRcbiAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9saWdodHNcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkNyZWF0aW5nIGFuIEFtYmllbnRMaWdodCA8L2NhcHRpb24+XG4gKiBuZXcgQW1iaWVudExpZ2h0KHtcbiAqICAgY29sb3I6IDB4ZmZmZmZmLFxuICogICBpbnRlbnNpdHk6IDAuMlxuICogfSkuYWRkVG8od29ybGQpO1xuICovXG5cbnZhciBBbWJpZW50TGlnaHQkMSA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX0xpZ2h0Q29tcG9uZW50KSB7XG4gIGZ1bmN0aW9uIEFtYmllbnRMaWdodCQkMSgpIHtcbiAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIEFtYmllbnRMaWdodCQkMSk7XG5cbiAgICByZXR1cm4gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBnZXRQcm90b3R5cGVPZiQyKEFtYmllbnRMaWdodCQkMSkuY2FsbCh0aGlzLCBwYXJhbXMsIEFtYmllbnRMaWdodCQkMS5kZWZhdWx0cykpO1xuICB9XG5cbiAgY3JlYXRlQ2xhc3MoQW1iaWVudExpZ2h0JCQxLCBbe1xuICAgIGtleTogXCJidWlsZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBidWlsZCgpIHtcbiAgICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgICAgcmV0dXJuIHRoaXMuYXBwbHlCcmlkZ2Uoe1xuICAgICAgICBsaWdodDogbmV3IEFtYmllbnRMaWdodChwYXJhbXMuY29sb3IsIHBhcmFtcy5pbnRlbnNpdHkpXG4gICAgICB9KS5saWdodDtcbiAgICB9XG4gIH1dKTtcblxuICBpbmhlcml0cyhBbWJpZW50TGlnaHQkJDEsIF9MaWdodENvbXBvbmVudCk7XG5cbiAgcmV0dXJuIEFtYmllbnRMaWdodCQkMTtcbn0oTGlnaHRDb21wb25lbnQpO1xuXG5kZWZpbmVQcm9wZXJ0eSQzKEFtYmllbnRMaWdodCQxLCBcImRlZmF1bHRzXCIsIG9iamVjdFNwcmVhZCh7fSwgTGlnaHRDb21wb25lbnQuZGVmYXVsdHMsIHtcbiAgY29sb3I6IDB4ZmZmZmZmLFxuICBpbnRlbnNpdHk6IDFcbn0pKTtcblxuLyoqXG4gKiBAY2xhc3MgRGlyZWN0aW9uYWxMaWdodFxuICogQGNhdGVnb3J5IGNvbXBvbmVudHMvbGlnaHRzXG4gKiBAZGVzY3JpcHRpb24gRGlyZWN0aW5hbExpZ2h0IGNyZWF0ZXMgYSBsaWdodCB0aGF0IHNoaW5lcyBmcm9tIGEgc3BlY2lmaWMgZGlyZWN0aW9uIG5vdCBmcm9tIGEgc3BlY2lmaWMgcG9zaXRpb24uPGJyLz48YnIvPlxuICogVGhpcyBsaWdodCB3aWxsIGJlaGF2ZSBhcyB0aG91Z2ggaXQgaXMgaW5maW5pdGVseSBmYXIgYXdheSBhbmQgdGhlIHJheXMgcHJvZHVjZWQgZnJvbSBpdCBhcmUgYWxsIHBhcmFsbGVsLiA8YnIvPjxici8+XG4gKiBUaGUgYmVzdCBhbmFsb2d5IHdvdWxkIGJlIGEgbGlnaHQgc291cmNlIHRoYXQgYWN0cyBsaWtlIHRoZSBzdW46IHRoZSBzdW4gaXMgc28gZmFyIGF3YXkgdGhhdCBhbGwgc3VubGlnaHQgaGl0dGluZyBvYmplY3RzIGNvbWVzIGZyb20gdGhlIHNhbWUgYW5nbGUuPGJyLz48YnIvPlxuICogSXQgaGFzIHRoZSBzYW1lIG9wdGlvbnMgYXMgQW1iaWVudExpZ2h0IGluIGxpZ2h0IHBhcmFtYXRlciwgYnV0IGl0IGFsc28gc3VwcG9ydHMgcG9zIGFuZCB0YXJnZXQgcGFyYW1hdGVycy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zPXtsaWdodDoge2NvbG9yOiAweGZmZmZmZiwgaW50ZW5zaXR5OiAxfX1dIC0gVGhlIHBhcmFtcy5cbiAqIEBleHRlbmRzIG1vZHVsZTpjb3JlLkxpZ2h0Q29tcG9uZW50XG4gKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbGlnaHRzXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5DcmVhdGluZyBhIERpcmVjdGlvbmFsTGlnaHQgdG8gZmFsbCBkb3duIGZyb20gdmVjMygxMCwgMjAsIDEwKSB0byB2ZWMzKDAsIDAsIDApPC9jYXB0aW9uPlxuICogbmV3IERpcmVjdGlvbmFsTGlnaHQoe1xuICogICBjb2xvcjogMHhmZmZmZmYsXG4gKiAgIGludGVuc2l0eTogMC4yLFxuICpcbiAqICAgcG9zaXRpb246IFsxMCwgMjAsIDEwXVxuICogfSkuYWRkVG8oYXBwKTtcbiAqL1xuXG52YXIgRGlyZWN0aW9uYWxMaWdodCQxID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfTGlnaHRDb21wb25lbnQpIHtcbiAgZnVuY3Rpb24gRGlyZWN0aW9uYWxMaWdodCQkMSgpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIERpcmVjdGlvbmFsTGlnaHQkJDEpO1xuXG4gICAgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIGdldFByb3RvdHlwZU9mJDIoRGlyZWN0aW9uYWxMaWdodCQkMSkuY2FsbCh0aGlzLCBwYXJhbXMsIERpcmVjdGlvbmFsTGlnaHQkJDEuZGVmYXVsdHMpKTtcblxuICAgIF90aGlzLndyYXBTaGFkb3coKTtcblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIGNyZWF0ZUNsYXNzKERpcmVjdGlvbmFsTGlnaHQkJDEsIFt7XG4gICAga2V5OiBcImJ1aWxkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGJ1aWxkKCkge1xuICAgICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgICByZXR1cm4gdGhpcy5hcHBseUJyaWRnZSh7XG4gICAgICAgIGxpZ2h0OiBuZXcgRGlyZWN0aW9uYWxMaWdodChwYXJhbXMuY29sb3IsIHBhcmFtcy5pbnRlbnNpdHkpXG4gICAgICB9KS5saWdodDtcbiAgICB9XG4gIH1dKTtcblxuICBpbmhlcml0cyhEaXJlY3Rpb25hbExpZ2h0JCQxLCBfTGlnaHRDb21wb25lbnQpO1xuXG4gIHJldHVybiBEaXJlY3Rpb25hbExpZ2h0JCQxO1xufShMaWdodENvbXBvbmVudCk7XG5cbmRlZmluZVByb3BlcnR5JDMoRGlyZWN0aW9uYWxMaWdodCQxLCBcImRlZmF1bHRzXCIsIG9iamVjdFNwcmVhZCh7fSwgTGlnaHRDb21wb25lbnQuZGVmYXVsdHMsIHtcbiAgY29sb3I6IDB4ZmZmZmZmLFxuICBpbnRlbnNpdHk6IDFcbn0pKTtcblxuLyoqXG4gKiBAY2xhc3MgSGVtaXNwaGVyZUxpZ2h0XG4gKiBAY2F0ZWdvcnkgY29tcG9uZW50cy9saWdodHNcbiAqIEBkZXNjcmlwdGlvbiBIZW1pc3BoZXJlTGlnaHQgaXMgYSBsaWdodCBzb3VyY2UgcG9zaXRpb25lZCBkaXJlY3RseSBhYm92ZSB0aGUgc2NlbmUuPGJyLz5cbiAqIEl0IGFsc28gZG9lc24ndCBuZWVkIHBvc2l0aW9uIGFuZCB0YXJnZXQgcHJvcGVydGllcy5cbiAqIEBjbGFzc0Rlc2NcbiAqIDxpZnJhbWUgc3JjPVwiaHR0cHM6Ly90aHJlZWpzLm9yZy9leGFtcGxlcy93ZWJnbF9saWdodHNfaGVtaXNwaGVyZS5odG1sXCI+PC9pZnJhbWU+XG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtcz17bGlnaHQ6IHtza3lDb2xvcjogMHhmZmZmZmYsIGdyb3VuZENvbG9yOiAweGZmZmZmZiwgaW50ZW5zaXR5OiAxfX1dIC0gVGhlIHBhcmFtcy5cbiAqIEBleHRlbmRzIG1vZHVsZTpjb3JlLkxpZ2h0Q29tcG9uZW50XG4gKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbGlnaHRzXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5DcmVhdGluZyBhIEhlbWlzcGhlcmVMaWdodDwvY2FwdGlvbj5cbiAqIG5ldyBIZW1pc3BoZXJlTGlnaHQoe1xuICogICBza3lDb2xvcjogMHhmZjAwMDAsXG4gKiAgIGdyb3VuZENvbG9yOiAweDAwMDBmZixcbiAqICAgaW50ZW5zaXR5OiAwLjJcbiAqIH0pLmFkZFRvKGFwcCk7XG4gKi9cblxudmFyIEhlbWlzcGhlcmVMaWdodCQxID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfTGlnaHRDb21wb25lbnQpIHtcbiAgZnVuY3Rpb24gSGVtaXNwaGVyZUxpZ2h0JCQxKCkge1xuICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgSGVtaXNwaGVyZUxpZ2h0JCQxKTtcblxuICAgIHJldHVybiBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIGdldFByb3RvdHlwZU9mJDIoSGVtaXNwaGVyZUxpZ2h0JCQxKS5jYWxsKHRoaXMsIHBhcmFtcywgSGVtaXNwaGVyZUxpZ2h0JCQxLmRlZmF1bHRzKSk7XG4gIH1cblxuICBjcmVhdGVDbGFzcyhIZW1pc3BoZXJlTGlnaHQkJDEsIFt7XG4gICAga2V5OiBcImJ1aWxkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGJ1aWxkKCkge1xuICAgICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgICByZXR1cm4gdGhpcy5hcHBseUJyaWRnZSh7XG4gICAgICAgIGxpZ2h0OiBuZXcgSGVtaXNwaGVyZUxpZ2h0KHBhcmFtcy5za3lDb2xvciwgcGFyYW1zLmdyb3VuZENvbG9yLCBwYXJhbXMuaW50ZW5zaXR5KVxuICAgICAgfSkubGlnaHQ7XG4gICAgfVxuICB9XSk7XG5cbiAgaW5oZXJpdHMoSGVtaXNwaGVyZUxpZ2h0JCQxLCBfTGlnaHRDb21wb25lbnQpO1xuXG4gIHJldHVybiBIZW1pc3BoZXJlTGlnaHQkJDE7XG59KExpZ2h0Q29tcG9uZW50KTtcblxuZGVmaW5lUHJvcGVydHkkMyhIZW1pc3BoZXJlTGlnaHQkMSwgXCJkZWZhdWx0c1wiLCBvYmplY3RTcHJlYWQoe30sIExpZ2h0Q29tcG9uZW50LmRlZmF1bHRzLCB7XG4gIHNreUNvbG9yOiAweGZmZmZmZixcbiAgZ3JvdW5kQ29sb3I6IDB4ZmZmZmZmLFxuICBpbnRlbnNpdHk6IDFcbn0pKTtcblxuLyoqXG4gKiBAY2xhc3MgUG9pbnRMaWdodFxuICogQGNhdGVnb3J5IGNvbXBvbmVudHMvbGlnaHRzXG4gKiBAZGVzY3JpcHRpb24gUG9pbnRMaWdodCBjcmVhdGVzIGEgbGlnaHQgYXQgYSBzcGVjaWZpYyBwb3NpdGlvbiBpbiB0aGUgc2NlbmUuIFRoZSBsaWdodCBzaGluZXMgaW4gYWxsIGRpcmVjdGlvbnMgKHJvdWdobHkgc2ltaWxhciB0byBhIGxpZ2h0IGJ1bGIuKTxici8+PGJyLz5cbiAqIEl0IGhhcyB0aGUgc2FtZSBvcHRpb25zIGFzIEFtYmllbnRMaWdodCBpbiBsaWdodCBwYXJhbWF0ZXIsIGJ1dCBpdCBhbHNvIHN1cHBvcnRzIHBvc2l0aW9uLCBkaXN0YW5jZSBhbmQgZGVjYXkuPGJyLz5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zPXtsaWdodDoge2NvbG9yOiAweGZmZmZmZiwgaW50ZW5zaXR5OiAxLCBkaXN0YW5jZTogMTAwLCBkZWNheTogMX19XSAtIFRoZSBwYXJhbXMuXG4gKiBAZXh0ZW5kcyBMaWdodENvbXBvbmVudFxuICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL2xpZ2h0c1xuICogQGV4YW1wbGUgPGNhcHRpb24+Q3JlYXRpbmcgYSBQb2ludExpZ2h0PC9jYXB0aW9uPlxuICogbmV3IFBvaW50TGlnaHQoIHtcbiAqICAgY29sb3I6IDB4ZmYwMDAwLFxuICogICBpbnRlbnNpdHk6IDIsXG4gKiAgIGRpc3RhbmNlOiAzMDBcbiAqXG4gKiAgIHBvc2l0aW9uOiBbMTAsIDIwLCAxMF1cbiAqIH0pLmFkZFRvKGFwcCk7XG4gKi9cblxudmFyIFBvaW50TGlnaHQkMSA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX0xpZ2h0Q29tcG9uZW50KSB7XG4gIGZ1bmN0aW9uIFBvaW50TGlnaHQkJDEoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBQb2ludExpZ2h0JCQxKTtcblxuICAgIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBnZXRQcm90b3R5cGVPZiQyKFBvaW50TGlnaHQkJDEpLmNhbGwodGhpcywgcGFyYW1zLCBQb2ludExpZ2h0JCQxLmRlZmF1bHRzKSk7XG5cbiAgICBfdGhpcy53cmFwU2hhZG93KCk7XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBjcmVhdGVDbGFzcyhQb2ludExpZ2h0JCQxLCBbe1xuICAgIGtleTogXCJidWlsZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBidWlsZCgpIHtcbiAgICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgICAgcmV0dXJuIHRoaXMuYXBwbHlCcmlkZ2Uoe1xuICAgICAgICBsaWdodDogbmV3IFBvaW50TGlnaHQocGFyYW1zLmNvbG9yLCBwYXJhbXMuaW50ZW5zaXR5LCBwYXJhbXMuZGlzdGFuY2UsIHBhcmFtcy5kZWNheSlcbiAgICAgIH0pLmxpZ2h0O1xuICAgIH1cbiAgfV0pO1xuXG4gIGluaGVyaXRzKFBvaW50TGlnaHQkJDEsIF9MaWdodENvbXBvbmVudCk7XG5cbiAgcmV0dXJuIFBvaW50TGlnaHQkJDE7XG59KExpZ2h0Q29tcG9uZW50KTtcblxuZGVmaW5lUHJvcGVydHkkMyhQb2ludExpZ2h0JDEsIFwiZGVmYXVsdHNcIiwgb2JqZWN0U3ByZWFkKHt9LCBMaWdodENvbXBvbmVudC5kZWZhdWx0cywge1xuICBjb2xvcjogMHhmZmZmZmYsXG4gIGludGVuc2l0eTogMSxcbiAgZGlzdGFuY2U6IDEwMCxcbiAgZGVjYXk6IDFcbn0pKTtcblxuLyoqXG4gKiBAY2xhc3MgU3BvdExpZ2h0XG4gKiBAY2F0ZWdvcnkgY29tcG9uZW50cy9saWdodHNcbiAqIEBkZXNjcmlwdGlvbiBTcG90TGlnaHQgY3JlYXRlcyBzcG90IGxpZ2h0IHRoYXQgY2FuIGNhc3Qgc2hhZG93IGluIG9uZSBkaXJlY3Rpb24uIDxici8+PGJyLz5cbiAqIEl0IGhhcyB0aGUgc2FtZSBwYXJhbWV0ZXJzIGFzIEFtYmllbnRMaWdodCBpbiBsaWdodCwgYnV0IGl0IGFsc28gc3VwcG9ydHMgcG9zIGFuZCB0YXJnZXQuIDxici8+PGJyLz5cbiAqIFNwb3RMaWdodCBhZmZlY3RzIG1lc2hlcyB3aXRoIGxhbWJlcnQgYW5kIHBob25nIG1hdGVyaWFsLlxuICogQGNsYXNzRGVzY1xuICogPGlmcmFtZSBzcmM9XCJodHRwczovL3RocmVlanMub3JnL2V4YW1wbGVzL3dlYmdsX2xpZ2h0c19zcG90bGlnaHQuaHRtbFwiPjwvaWZyYW1lPlxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXM9e2xpZ2h0OiB7Y29sb3I6IDB4ZmZmZmZmLCBpbnRlbnNpdHk6IDEsIGRpc3RhbmNlOiAxMDAsIGFuZ2xlOiBNYXRoLlBJIC8gMywgZXhwb25lbnQ6IDAsIGRlY2F5OiAxfX1dIC0gVGhlIHBhcmFtcy5cbiAqIEBleHRlbmRzIG1vZHVsZTpjb3JlLkxpZ2h0Q29tcG9uZW50XG4gKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbGlnaHRzXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5DcmVhdGluZyBhIFNwb3RMaWdodCB0aGF0IGZhbGxzIGRvd24gZnJvbSB2ZWMzKDEwLCAyMCwgMTApIHRvIHZlYzMoMCwgMCwgMCk8L2NhcHRpb24+XG4gKiBuZXcgU3BvdExpZ2h0KHtcbiAqICAgY29sb3I6IDB4MDBmZjAwLFxuICogICBpbnRlbnNpdHk6IDMsXG4gKiAgIGRpc3RhbmNlOiAxMDAwXG4gKlxuICogICBwb3NpdGlvbjogWzEwLCAyMCwgMTBdXG4gKiB9KS5hZGRUbyhhcHApO1xuICovXG5cbnZhciBTcG90TGlnaHQkMSA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX0xpZ2h0Q29tcG9uZW50KSB7XG4gIGZ1bmN0aW9uIFNwb3RMaWdodCQkMSgpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIFNwb3RMaWdodCQkMSk7XG5cbiAgICBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgZ2V0UHJvdG90eXBlT2YkMihTcG90TGlnaHQkJDEpLmNhbGwodGhpcywgcGFyYW1zLCBTcG90TGlnaHQkJDEuZGVmYXVsdHMpKTtcblxuICAgIF90aGlzLndyYXBTaGFkb3coKTtcblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIGNyZWF0ZUNsYXNzKFNwb3RMaWdodCQkMSwgW3tcbiAgICBrZXk6IFwiYnVpbGRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYnVpbGQoKSB7XG4gICAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgICAgIHJldHVybiB0aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgICAgbGlnaHQ6IG5ldyBTcG90TGlnaHQocGFyYW1zLmNvbG9yLCBwYXJhbXMuaW50ZW5zaXR5LCBwYXJhbXMuZGlzdGFuY2UsIHBhcmFtcy5hbmdsZSwgcGFyYW1zLmV4cG9uZW50LCBwYXJhbXMuZGVjYXkpXG4gICAgICB9KS5saWdodDtcbiAgICB9XG4gIH1dKTtcblxuICBpbmhlcml0cyhTcG90TGlnaHQkJDEsIF9MaWdodENvbXBvbmVudCk7XG5cbiAgcmV0dXJuIFNwb3RMaWdodCQkMTtcbn0oTGlnaHRDb21wb25lbnQpO1xuXG5kZWZpbmVQcm9wZXJ0eSQzKFNwb3RMaWdodCQxLCBcImRlZmF1bHRzXCIsIG9iamVjdFNwcmVhZCh7fSwgTGlnaHRDb21wb25lbnQuZGVmYXVsdHMsIHtcbiAgY29sb3I6IDB4ZmZmZmZmLFxuICBpbnRlbnNpdHk6IDEsXG4gIGRpc3RhbmNlOiAxMDAsXG4gIGFuZ2xlOiBNYXRoLlBJIC8gMyxcbiAgZXhwb25lbnQ6IDAsXG4gIGRlY2F5OiAxXG59KSk7XG5cbnZhciBBcmVhTGlnaHQgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9MaWdodENvbXBvbmVudCkge1xuICBmdW5jdGlvbiBBcmVhTGlnaHQoKSB7XG4gICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBBcmVhTGlnaHQpO1xuXG4gICAgcmV0dXJuIHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgZ2V0UHJvdG90eXBlT2YkMihBcmVhTGlnaHQpLmNhbGwodGhpcywgcGFyYW1zLCBBcmVhTGlnaHQuZGVmYXVsdHMpKTtcbiAgfVxuXG4gIGNyZWF0ZUNsYXNzKEFyZWFMaWdodCwgW3tcbiAgICBrZXk6IFwiYnVpbGRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYnVpbGQoKSB7XG4gICAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgICAgIHJldHVybiB0aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgICAgbGlnaHQ6IG5ldyBSZWN0QXJlYUxpZ2h0KHBhcmFtcy5jb2xvciwgcGFyYW1zLmludGVuc2l0eSwgcGFyYW1zLndpZHRoLCBwYXJhbXMuaGVpZ2h0KVxuICAgICAgfSkubGlnaHQ7XG4gICAgfVxuICB9XSk7XG5cbiAgaW5oZXJpdHMoQXJlYUxpZ2h0LCBfTGlnaHRDb21wb25lbnQpO1xuXG4gIHJldHVybiBBcmVhTGlnaHQ7XG59KExpZ2h0Q29tcG9uZW50KTtcblxuZGVmaW5lUHJvcGVydHkkMyhBcmVhTGlnaHQsIFwiZGVmYXVsdHNcIiwgb2JqZWN0U3ByZWFkKHt9LCBMaWdodENvbXBvbmVudC5kZWZhdWx0cywge1xuICBjb2xvcjogMHhmZmZmZmYsXG4gIGludGVuc2l0eTogMSxcbiAgd2lkdGg6IDEwLFxuICBoZWlnaHQ6IDEwXG59KSk7XG5cbi8qKiBAbW9kdWxlIGNvbXBvbmVudHMvbGlnaHRzICovXG5cbi8qKlxuICogQGNsYXNzIEN1YmVDYW1lcmFcbiAqIEBjYXRlZ29yeSBjb21wb25lbnRzL2NhbWVyYXNcbiAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIDYgY2FtZXJhcyB0aGF0IHJlbmRlciB0byBhIFdlYkdMUmVuZGVyVGFyZ2V0Q3ViZVxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXNdIC0gVGhlIHBhcmFtZXRlcnMgb2JqZWN0LlxuICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL2NhbWVyYXNcbiAqIEBleHRlbmRzIG1vZHVsZTpjb3JlLkNhbWVyYUNvbXBvbmVudFxuICogQGV4YW1wbGUgPGNhcHRpb24+Q3JlYXRlcyBhIEN1YmVDYW1lcmEgYW5kIHNldCBpdCBhcyBhcHAncyBjYW1lcmE8L2NhcHRpb24+XG4gKiBjb25zdCBjYW1lcmEgPSBuZXcgQ3ViZUNhbWVyYSh7XG4gKiAgIGNhbWVyYToge1xuICogICAgIGN1YmVSZXNvbHV0aW9uOiAyNTZcbiAqICAgfSxcbiAqXG4gKiAgIHBvc2l0aW9uOiB7XG4gKiAgICAgeDogMCxcbiAqICAgICB5OiAxMDAsXG4gKiAgICAgejogMFxuICogICB9XG4gKiB9KTtcbiAqXG4gKiBhcHAuY2FtZXJhID0gY2FtZXJhO1xuICovXG5cbnZhciBDdWJlQ2FtZXJhJDEgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9DYW1lcmFDb21wb25lbnQpIHtcbiAgLyoqXG4gICAqIERlZmF1bHQgdmFsdWVzIGZvciBwYXJhbWV0ZXJzXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvbXBvbmVudHMvY2FtZXJhcy5DdWJlQ2FtZXJhI2RlZmF1bHRzXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHQgPHByZT5cbiAgICoge1xuICAgKiAgIGNhbWVyYToge1xuICAgKiAgICAgbmVhcjogMSxcbiAgICogICAgIGZhcjogMTAwMCxcbiAgICogICAgIGN1YmVSZXNvbHV0aW9uOiAxMjhcbiAgICogICB9XG4gICAqIH08L3ByZT5cbiAgICovXG4gIGZ1bmN0aW9uIEN1YmVDYW1lcmEkJDEoKSB7XG4gICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBDdWJlQ2FtZXJhJCQxKTtcblxuICAgIHJldHVybiBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIGdldFByb3RvdHlwZU9mJDIoQ3ViZUNhbWVyYSQkMSkuY2FsbCh0aGlzLCBwYXJhbXMsIEN1YmVDYW1lcmEkJDEuZGVmYXVsdHMpKTtcbiAgfVxuXG4gIGNyZWF0ZUNsYXNzKEN1YmVDYW1lcmEkJDEsIFt7XG4gICAga2V5OiBcImJ1aWxkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGJ1aWxkKCkge1xuICAgICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgICByZXR1cm4gdGhpcy5hcHBseUJyaWRnZSh7XG4gICAgICAgIGNhbWVyYTogbmV3IEN1YmVDYW1lcmEocGFyYW1zLm5lYXIsIHBhcmFtcy5mYXIsIHBhcmFtcy5jdWJlUmVzb2x1dGlvbilcbiAgICAgIH0pLmNhbWVyYTtcbiAgICB9XG4gIH1dKTtcblxuICBpbmhlcml0cyhDdWJlQ2FtZXJhJCQxLCBfQ2FtZXJhQ29tcG9uZW50KTtcblxuICByZXR1cm4gQ3ViZUNhbWVyYSQkMTtcbn0oQ2FtZXJhQ29tcG9uZW50KTtcblxuZGVmaW5lUHJvcGVydHkkMyhDdWJlQ2FtZXJhJDEsIFwiZGVmYXVsdHNcIiwgb2JqZWN0U3ByZWFkKHt9LCBDYW1lcmFDb21wb25lbnQuZGVmYXVsdHMsIHtcbiAgbmVhcjogMSxcbiAgZmFyOiAxMDAwLFxuICBjdWJlUmVzb2x1dGlvbjogMTI4XG59KSk7XG5cbi8qKlxuICogQGNsYXNzIE9ydGhvZ3JhcGhpY0NhbWVyYVxuICogQGNhdGVnb3J5IGNvbXBvbmVudHMvY2FtZXJhc1xuICogQGRlc2NyaXB0aW9uIENhbWVyYSB3aXRoIG9ydGhvZ3JhcGhpYyBwcm9qZWN0aW9uLlxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXNdIC0gVGhlIHBhcmFtZXRlcnMgb2JqZWN0LlxuICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL2NhbWVyYXNcbiAqIEBleHRlbmRzIG1vZHVsZTpjb3JlLkNhbWVyYUNvbXBvbmVudFxuICogQGV4YW1wbGUgPGNhcHRpb24+Q3JlYXRlIGFuIE9ydGhvZ3JhcGhpY0NhbWVyYSBhbmQgc2V0IGl0IGFzIGFwcCdzIGNhbWVyYTwvY2FwdGlvbj5cbiAqIGNvbnN0IGNhbWVyYSA9IG5ldyBPcnRob2dyYXBoaWNDYW1lcmEoe1xuICogICBjYW1lcmE6IHtcbiAqICAgICBmYXI6IDEwMDAwXG4gKiAgIH0sXG4gKlxuICogICBwb3NpdGlvbjoge1xuICogICAgIHk6IDUwXG4gKiAgIH1cbiAqIH0pO1xuICpcbiAqIGFwcC5jYW1lcmEgPSBjYW1lcmE7XG4gKi9cblxudmFyIE9ydGhvZ3JhcGhpY0NhbWVyYSQxID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfQ2FtZXJhQ29tcG9uZW50KSB7XG4gIC8qKlxuICAgKiBEZWZhdWx0IHZhbHVlcyBmb3IgcGFyYW1ldGVyc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb21wb25lbnRzL2NhbWVyYXMuT3J0aG9ncmFwaGljQ2FtZXJhI2RlZmF1bHRzXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHQgPHByZT5cbiAgICoge1xuICAgKiAgIG5lYXI6IDEsXG4gICAqICAgZmFyOiAxMDAwLFxuICAgKiAgIGxlZnQ6IHN5c3RlbS53aW5kb3cuaW5uZXJXaWR0aCAvIC0yLFxuICAgKiAgIHJpZ2h0OiBzeXN0ZW0ud2luZG93LmlubmVyV2lkdGggLyAyLFxuICAgKiAgIHRvcDogc3lzdGVtLndpbmRvdy5pbm5lckhlaWdodCAvIDIsXG4gICAqICAgYm90dG9tOiBzeXN0ZW0ud2luZG93LmlubmVySGVpZ2h0IC8gLTJcbiAgICogfTwvcHJlPlxuICAgKi9cbiAgZnVuY3Rpb24gT3J0aG9ncmFwaGljQ2FtZXJhJCQxKCkge1xuICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgT3J0aG9ncmFwaGljQ2FtZXJhJCQxKTtcblxuICAgIHJldHVybiBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIGdldFByb3RvdHlwZU9mJDIoT3J0aG9ncmFwaGljQ2FtZXJhJCQxKS5jYWxsKHRoaXMsIHBhcmFtcywgT3J0aG9ncmFwaGljQ2FtZXJhJCQxLmRlZmF1bHRzKSk7XG4gIH1cblxuICBjcmVhdGVDbGFzcyhPcnRob2dyYXBoaWNDYW1lcmEkJDEsIFt7XG4gICAga2V5OiBcImJ1aWxkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGJ1aWxkKCkge1xuICAgICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgICByZXR1cm4gdGhpcy5hcHBseUJyaWRnZSh7XG4gICAgICAgIGNhbWVyYTogbmV3IE9ydGhvZ3JhcGhpY0NhbWVyYShwYXJhbXMubGVmdCwgcGFyYW1zLnJpZ2h0LCBwYXJhbXMudG9wLCBwYXJhbXMuYm90dG9tLCBwYXJhbXMubmVhciwgcGFyYW1zLmZhcilcbiAgICAgIH0pLmNhbWVyYTtcbiAgICB9XG4gIH1dKTtcblxuICBpbmhlcml0cyhPcnRob2dyYXBoaWNDYW1lcmEkJDEsIF9DYW1lcmFDb21wb25lbnQpO1xuXG4gIHJldHVybiBPcnRob2dyYXBoaWNDYW1lcmEkJDE7XG59KENhbWVyYUNvbXBvbmVudCk7XG5cbmRlZmluZVByb3BlcnR5JDMoT3J0aG9ncmFwaGljQ2FtZXJhJDEsIFwiZGVmYXVsdHNcIiwgb2JqZWN0U3ByZWFkKHt9LCBDYW1lcmFDb21wb25lbnQuZGVmYXVsdHMsIHtcbiAgbmVhcjogMSxcbiAgZmFyOiAxMDAwLFxuICBsZWZ0OiBzeXN0ZW0ud2luZG93LmlubmVyV2lkdGggLyAtMixcbiAgcmlnaHQ6IHN5c3RlbS53aW5kb3cuaW5uZXJXaWR0aCAvIDIsXG4gIHRvcDogc3lzdGVtLndpbmRvdy5pbm5lckhlaWdodCAvIDIsXG4gIGJvdHRvbTogc3lzdGVtLndpbmRvdy5pbm5lckhlaWdodCAvIC0yXG59KSk7XG5cbi8qKlxuICogQGNsYXNzIFBlcnNwZWN0aXZlQ2FtZXJhXG4gKiBAZGVzY3JpcHRpb24gQ2FtZXJhIHdpdGggcGVyc3BlY3RpdmUgcHJvamVjdGlvbi5cbiAqIEBjYXRlZ29yeSBjb21wb25lbnRzL2NhbWVyYXNcbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zXSAtIFRoZSBwYXJhbWV0ZXJzIG9iamVjdC5cbiAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9jYW1lcmFzXG4gKiBAZXh0ZW5kcyBtb2R1bGU6Y29yZS5DYW1lcmFDb21wb25lbnRcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkNyZWF0ZSBhbiBQZXJzcGVjdGl2ZUNhbWVyYSBhbmQgc2V0IGl0IGFzIGFwcCdzIGNhbWVyYTwvY2FwdGlvbj5cbiAqIGNvbnN0IGNhbWVyYSA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSh7XG4gKiAgIGZvdjogNzUsXG4gKiAgIGFzcGVjdDogd2luZG93LmlubmVyV2lkdGggLyB3aW5kb3cuaW5uZXJIZWlnaHQsXG4gKlxuICogICBwb3NpdGlvbjoge1xuICogICAgIHg6IDAsXG4gKiAgICAgeTogMTAwLFxuICogICAgIHo6IDBcbiAqICAgfVxuICogfSk7XG4gKlxuICogYXBwLmNhbWVyYSA9IGNhbWVyYTtcbiAqL1xuXG52YXIgUGVyc3BlY3RpdmVDYW1lcmEkMSA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX0NhbWVyYUNvbXBvbmVudCkge1xuICAvKipcbiAgICogRGVmYXVsdCB2YWx1ZXMgZm9yIHBhcmFtZXRlcnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29tcG9uZW50cy9jYW1lcmFzLlBlcnNwZWN0aXZlQ2FtZXJhI2RlZmF1bHRzXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHQgPHByZT5cbiAgICoge1xuICAgKiAgIG5lYXI6IDEsXG4gICAqICAgZmFyOiAxMDAwLFxuICAgKiAgIGZvdjogNzUsXG4gICAqICAgYXNwZWN0OiBzeXN0ZW0ud2luZG93LmlubmVyV2lkdGggLyBzeXN0ZW0ud2luZG93LmlubmVySGVpZ2h0XG4gICAqIH08L3ByZT5cbiAgICovXG4gIGZ1bmN0aW9uIFBlcnNwZWN0aXZlQ2FtZXJhJCQxKCkge1xuICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgUGVyc3BlY3RpdmVDYW1lcmEkJDEpO1xuXG4gICAgcmV0dXJuIHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgZ2V0UHJvdG90eXBlT2YkMihQZXJzcGVjdGl2ZUNhbWVyYSQkMSkuY2FsbCh0aGlzLCBwYXJhbXMsIFBlcnNwZWN0aXZlQ2FtZXJhJCQxLmRlZmF1bHRzKSk7XG4gIH1cblxuICBjcmVhdGVDbGFzcyhQZXJzcGVjdGl2ZUNhbWVyYSQkMSwgW3tcbiAgICBrZXk6IFwiYnVpbGRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYnVpbGQoKSB7XG4gICAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgICAgIHJldHVybiB0aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgICAgY2FtZXJhOiBuZXcgUGVyc3BlY3RpdmVDYW1lcmEocGFyYW1zLmZvdiwgcGFyYW1zLmFzcGVjdCwgcGFyYW1zLm5lYXIsIHBhcmFtcy5mYXIpXG4gICAgICB9KS5jYW1lcmE7XG4gICAgfVxuICB9XSk7XG5cbiAgaW5oZXJpdHMoUGVyc3BlY3RpdmVDYW1lcmEkJDEsIF9DYW1lcmFDb21wb25lbnQpO1xuXG4gIHJldHVybiBQZXJzcGVjdGl2ZUNhbWVyYSQkMTtcbn0oQ2FtZXJhQ29tcG9uZW50KTtcblxuZGVmaW5lUHJvcGVydHkkMyhQZXJzcGVjdGl2ZUNhbWVyYSQxLCBcImRlZmF1bHRzXCIsIG9iamVjdFNwcmVhZCh7fSwgQ2FtZXJhQ29tcG9uZW50LmRlZmF1bHRzLCB7XG4gIG5lYXI6IDEsXG4gIGZhcjogMTAwMCxcbiAgZm92OiA3NSxcbiAgYXNwZWN0OiBzeXN0ZW0ud2luZG93LmlubmVyV2lkdGggLyBzeXN0ZW0ud2luZG93LmlubmVySGVpZ2h0XG59KSk7XG5cbi8qKiBAbW9kdWxlIGNvbXBvbmVudHMvY2FtZXJhcyAqL1xuXG4vKipcbiAqIEBjbGFzcyBCb3hcbiAqIEBjYXRlZ29yeSBjb21wb25lbnRzL21lc2hlc1xuICogQGRlc2NyaXB0aW9uIEFzIHRvbGQgb24gQ29tcG9uZW50IGRlZmluaXRpb24sIHdoaWxlIHlvdSBjYW4gcGFzcyBhbnkgb2YgdGhlIGluaGVyaXRlZCBwYXJhbXMgZm9yIHRoaXMgY29tcG9uZW50IGNvbnN0cnVjdGlvbiwgeW91IHdpbGwgbmVlZCB0b1xuICogcGFzcyBzcGVjaWZpYyBwYXJhbWV0ZXJzIHRvIGJ1aWxkIHRoaXMgbWVzaCBhcyBhIGdlb21ldHJ5IG9iamVjdC5cbiAqIEBjbGFzc0Rlc2NcbiAqIDxpZnJhbWUgc3JjPVwiaHR0cHM6Ly90aHJlZWpzLm9yZy9kb2NzL3NjZW5lcy9nZW9tZXRyeS1icm93c2VyLmh0bWwjQm94R2VvbWV0cnlcIj48L2lmcmFtZT5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zXSAtIFRoZSBwYXJhbXMuXG4gKiBAZXh0ZW5kcyBtb2R1bGU6Y29yZS5NZXNoQ29tcG9uZW50XG4gKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5DcmVhdGluZyBhIEJveCwgYW5kIGFkZGluZyB0byBhcHA8L2NhcHRpb24+XG4gKiAgbmV3IEJveCh7XG4gKiAgICBnZW9tZXRyeToge1xuICogICAgICB3aWR0aDogMixcbiAqICAgICAgaGVpZ2h0OiAyLFxuICogICAgICBkZXB0aDogMlxuICogICAgfSxcbiAqXG4gKiAgICBtYXRlcmlhbDogbmV3IFRIUkVFLk1lc2hCYXNpY01hdGVyaWFsKHtcbiAqICAgICAgY29sb3I6IDB4ZmZmZmZmXG4gKiAgICB9KSxcbiAqXG4gKiAgICBwb3NpdGlvbjogWzUwLCA2MCwgNzBdXG4gKiB9KS5hZGRUbyhhcHApO1xuICovXG5cbnZhciBCb3ggPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9NZXNoQ29tcG9uZW50KSB7XG4gIC8qKlxuICAgKiBEZWZhdWx0IHZhbHVlcyBmb3IgcGFyYW1ldGVyc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5Cb3gjZGVmYXVsdHNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdCA8cHJlPlxuICAgKiB7XG4gICAqICAgZ2VvbWV0cnk6IHtcbiAgICogICAgIHdpZHRoOiAxLFxuICAgKiAgICAgaGVpZ2h0OiAxLFxuICAgKiAgICAgZGVwdGg6IDEsXG4gICAqICAgICB3aWR0aFNlZ21lbnRzOiAxLFxuICAgKiAgICAgaGVpZ2h0U2VnbWVudHM6IDEsXG4gICAqICAgICBkZXB0aFNlZ21lbnRzOiAxXG4gICAqICAgfVxuICAgKiB9PC9wcmU+XG4gICAqL1xuXG4gIC8qKlxuICAgKiBJbnN0cnVjdGlvbnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuQm94I2luc3RydWN0aW9uc1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IGdlb21ldHJ5OiBbJ3dpZHRoJywgJ2hlaWdodCcsICdkZXB0aCcsICd3aWR0aFNlZ21lbnRzJywgJ2hlaWdodFNlZ21lbnRzJywgJ2RlcHRoU2VnZW1lbnRzJ11cbiAgICovXG4gIGZ1bmN0aW9uIEJveCgpIHtcbiAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIEJveCk7XG5cbiAgICByZXR1cm4gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBnZXRQcm90b3R5cGVPZiQyKEJveCkuY2FsbCh0aGlzLCBwYXJhbXMsIEJveC5kZWZhdWx0cywgQm94Lmluc3RydWN0aW9ucykpO1xuICB9XG4gIC8qKlxuICAgKiBAbWV0aG9kIGJ1aWxkXG4gICAqIEBkZXNjcmlwdGlvbiBCdWlsZCBsaWZlY3ljbGUgY3JlYXRlcyBhIG1lc2ggdXNpbmcgaW5wdXQgcGFyYW1zLlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIENvbXBvbmVudCBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJuIHtUSFJFRS5NZXNofSBCdWlsdCBtZXNoXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuQm94XG4gICAqL1xuXG5cbiAgY3JlYXRlQ2xhc3MoQm94LCBbe1xuICAgIGtleTogXCJidWlsZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBidWlsZCgpIHtcbiAgICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHRoaXMucGFyYW1zO1xuXG4gICAgICB2YXIgX3RoaXMkYXBwbHlCcmlkZ2UgPSB0aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgICAgZ2VvbWV0cnk6IHRoaXMuYnVpbGRHZW9tZXRyeShwYXJhbXMpLFxuICAgICAgICBtYXRlcmlhbDogcGFyYW1zLm1hdGVyaWFsXG4gICAgICB9KSxcbiAgICAgICAgICBnZW9tZXRyeSA9IF90aGlzJGFwcGx5QnJpZGdlLmdlb21ldHJ5LFxuICAgICAgICAgIG1hdGVyaWFsID0gX3RoaXMkYXBwbHlCcmlkZ2UubWF0ZXJpYWw7XG5cbiAgICAgIHJldHVybiB0aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgICAgbWVzaDogbmV3IE1lc2goZ2VvbWV0cnksIG1hdGVyaWFsKVxuICAgICAgfSkubWVzaDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYnVpbGRHZW9tZXRyeVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBidWlsZEdlb21ldHJ5KCkge1xuICAgICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgICB2YXIgZ2VvbWV0cnkgPSBuZXcgKHBhcmFtcy5idWZmZXIgPyBCb3hCdWZmZXJHZW9tZXRyeSA6IEJveEdlb21ldHJ5KShwYXJhbXMuZ2VvbWV0cnkud2lkdGgsIHBhcmFtcy5nZW9tZXRyeS5oZWlnaHQsIHBhcmFtcy5nZW9tZXRyeS5kZXB0aCwgcGFyYW1zLmdlb21ldHJ5LndpZHRoU2VnbWVudHMsIHBhcmFtcy5nZW9tZXRyeS5oZWlnaHRTZWdtZW50cywgcGFyYW1zLmdlb21ldHJ5LmRlcHRoU2VnbWVudHMpO1xuICAgICAgcmV0dXJuIGdlb21ldHJ5O1xuICAgIH1cbiAgfV0pO1xuXG4gIGluaGVyaXRzKEJveCwgX01lc2hDb21wb25lbnQpO1xuXG4gIHJldHVybiBCb3g7XG59KE1lc2hDb21wb25lbnQpO1xuXG5kZWZpbmVQcm9wZXJ0eSQzKGRlZmluZVByb3BlcnR5JDMoQm94LCBcImRlZmF1bHRzXCIsIG9iamVjdFNwcmVhZCh7fSwgTWVzaENvbXBvbmVudC5kZWZhdWx0cywge1xuICBnZW9tZXRyeToge1xuICAgIHdpZHRoOiAxLFxuICAgIGhlaWdodDogMSxcbiAgICBkZXB0aDogMSxcbiAgICB3aWR0aFNlZ21lbnRzOiAxLFxuICAgIGhlaWdodFNlZ21lbnRzOiAxLFxuICAgIGRlcHRoU2VnbWVudHM6IDFcbiAgfVxufSkpLCBcImluc3RydWN0aW9uc1wiLCBvYmplY3RTcHJlYWQoe30sIE1lc2hDb21wb25lbnQuaW5zdHJ1Y3Rpb25zLCB7XG4gIGdlb21ldHJ5OiBbJ3dpZHRoJywgJ2hlaWdodCcsICdkZXB0aCcsICd3aWR0aFNlZ21lbnRzJywgJ2hlaWdodFNlZ21lbnRzJywgJ2RlcHRoU2VnZW1lbnRzJ11cbn0pKTtcblxuLyoqXG4gKiBAY2xhc3MgQ2lyY2xlXG4gKiBAY2F0ZWdvcnkgY29tcG9uZW50cy9tZXNoZXNcbiAqIEBkZXNjcmlwdGlvbiBBcyB0b2xkIG9uIENvbXBvbmVudCBkZWZpbml0aW9uLCB3aGlsZSB5b3UgY2FuIHBhc3MgYW55IG9mIHRoZSBpbmhlcml0ZWQgcGFyYW1zIGZvciB0aGlzIGNvbXBvbmVudCBjb25zdHJ1Y3Rpb24sIHlvdSB3aWxsIG5lZWQgdG9cbiAqIHBhc3Mgc3BlY2lmaWMgcGFyYW1ldGVycyB0byBidWlsZCB0aGlzIG1lc2ggYXMgYSBnZW9tZXRyeSBvYmplY3QuXG4gKiBAY2xhc3NEZXNjXG4gKiA8aWZyYW1lIHNyYz1cImh0dHBzOi8vdGhyZWVqcy5vcmcvZG9jcy9zY2VuZXMvZ2VvbWV0cnktYnJvd3Nlci5odG1sI0NpcmNsZUdlb21ldHJ5XCI+PC9pZnJhbWU+XG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtc10gLSBUaGUgcGFyYW1zLlxuICogQGV4dGVuZHMgbW9kdWxlOmNvcmUuTWVzaENvbXBvbmVudFxuICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL21lc2hlc1xuICogQGV4YW1wbGUgPGNhcHRpb24+Q3JlYXRpbmcgYSBDaXJjbGUsIGFuZCBhZGRpbmcgdG8gYXBwPC9jYXB0aW9uPlxuICogIG5ldyBDaXJjbGUoe1xuICogICAgZ2VvbWV0cnk6IHtcbiAqICAgICAgcmFkaXVzOiA0LFxuICogICAgICBzZWdtZW50czogMTZcbiAqICAgIH0sXG4gKlxuICogICAgbWF0ZXJpYWw6IG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCh7XG4gKiAgICAgIGNvbG9yOiAweGZmZmZmZlxuICogICAgfSksXG4gKlxuICogICAgcG9zaXRpb246IFs1MCwgNjAsIDcwXVxuICogfSkuYWRkVG8oYXBwKTtcbiAqL1xuXG52YXIgQ2lyY2xlID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfTWVzaENvbXBvbmVudCkge1xuICAvKipcbiAgICogRGVmYXVsdCB2YWx1ZXMgZm9yIHBhcmFtZXRlcnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuQ2lyY2xlI2RlZmF1bHRzXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHQgPHByZT5cbiAgICoge1xuICAgKiAgIGdlb21ldHJ5OiB7XG4gICAqICAgICByYWRpdXM6IDUwLFxuICAgKiAgICAgc2VnbWVudHM6IDgsXG4gICAqICAgICB0aGV0YVN0YXJ0OiAwLFxuICAgKiAgICAgdGhldGFMZW5ndGg6IE1hdGguUEkgKiAyXG4gICAqICAgfVxuICAgKiB9PC9wcmU+XG4gICAqL1xuXG4gIC8qKlxuICAgKiBJbnN0cnVjdGlvbnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuQ2lyY2xlI2luc3RydWN0aW9uc1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IGdlb21ldHJ5OiBbJ3JhZGl1cycsICdzZWdtZW50cycsICd0aGV0YVN0YXJ0JywgJ3RoZXRhTGVuZ3RoJ11cbiAgICovXG4gIGZ1bmN0aW9uIENpcmNsZSgpIHtcbiAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIENpcmNsZSk7XG5cbiAgICByZXR1cm4gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBnZXRQcm90b3R5cGVPZiQyKENpcmNsZSkuY2FsbCh0aGlzLCBwYXJhbXMsIENpcmNsZS5kZWZhdWx0cywgQ2lyY2xlLmluc3RydWN0aW9ucykpO1xuICB9XG4gIC8qKlxuICAgKiBAbWV0aG9kIGJ1aWxkXG4gICAqIEBkZXNjcmlwdGlvbiBCdWlsZCBsaWZlY3ljbGUgY3JlYXRlcyBhIG1lc2ggdXNpbmcgaW5wdXQgcGFyYW1zLlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIENvbXBvbmVudCBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJuIHtUSFJFRS5NZXNofSBCdWlsdCBtZXNoXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuQ2lyY2xlXG4gICAqL1xuXG5cbiAgY3JlYXRlQ2xhc3MoQ2lyY2xlLCBbe1xuICAgIGtleTogXCJidWlsZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBidWlsZCgpIHtcbiAgICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHRoaXMucGFyYW1zO1xuXG4gICAgICB2YXIgX3RoaXMkYXBwbHlCcmlkZ2UgPSB0aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgICAgZ2VvbWV0cnk6IHRoaXMuYnVpbGRHZW9tZXRyeShwYXJhbXMpLFxuICAgICAgICBtYXRlcmlhbDogcGFyYW1zLm1hdGVyaWFsXG4gICAgICB9KSxcbiAgICAgICAgICBnZW9tZXRyeSA9IF90aGlzJGFwcGx5QnJpZGdlLmdlb21ldHJ5LFxuICAgICAgICAgIG1hdGVyaWFsID0gX3RoaXMkYXBwbHlCcmlkZ2UubWF0ZXJpYWw7XG5cbiAgICAgIHJldHVybiB0aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgICAgbWVzaDogbmV3IE1lc2goZ2VvbWV0cnksIG1hdGVyaWFsKVxuICAgICAgfSkubWVzaDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYnVpbGRHZW9tZXRyeVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBidWlsZEdlb21ldHJ5KCkge1xuICAgICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgICB2YXIgZ2VvbWV0cnkgPSBuZXcgKHBhcmFtcy5idWZmZXIgPyBDaXJjbGVCdWZmZXJHZW9tZXRyeSA6IENpcmNsZUdlb21ldHJ5KShwYXJhbXMuZ2VvbWV0cnkucmFkaXVzLCBwYXJhbXMuZ2VvbWV0cnkuc2VnbWVudHMsIHBhcmFtcy5nZW9tZXRyeS50aGV0YVN0YXJ0LCBwYXJhbXMuZ2VvbWV0cnkudGhldGFMZW5ndGgpO1xuICAgICAgcmV0dXJuIGdlb21ldHJ5O1xuICAgIH1cbiAgfV0pO1xuXG4gIGluaGVyaXRzKENpcmNsZSwgX01lc2hDb21wb25lbnQpO1xuXG4gIHJldHVybiBDaXJjbGU7XG59KE1lc2hDb21wb25lbnQpO1xuXG5kZWZpbmVQcm9wZXJ0eSQzKGRlZmluZVByb3BlcnR5JDMoQ2lyY2xlLCBcImRlZmF1bHRzXCIsIG9iamVjdFNwcmVhZCh7fSwgTWVzaENvbXBvbmVudC5kZWZhdWx0cywge1xuICBnZW9tZXRyeToge1xuICAgIHJhZGl1czogNTAsXG4gICAgc2VnbWVudHM6IDgsXG4gICAgdGhldGFTdGFydDogMCxcbiAgICB0aGV0YUxlbmd0aDogTWF0aC5QSSAqIDJcbiAgfVxufSkpLCBcImluc3RydWN0aW9uc1wiLCBvYmplY3RTcHJlYWQoe30sIE1lc2hDb21wb25lbnQuaW5zdHJ1Y3Rpb25zLCB7XG4gIGdlb21ldHJ5OiBbJ3JhZGl1cycsICdzZWdtZW50cycsICd0aGV0YVN0YXJ0JywgJ3RoZXRhTGVuZ3RoJ11cbn0pKTtcblxuLyoqXG4gKiBAY2xhc3MgQ29uZVxuICogQGNhdGVnb3J5IGNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZGVzY3JpcHRpb24gQSBjeWxpbmRlciBpcyBvbmUgb2YgdGhlIG1vc3QgYmFzaWMgY3VydmlsaW5lYXIgZ2VvbWV0cmljIHNoYXBlcywgdGhlIHN1cmZhY2UgZm9ybWVkIGJ5IHRoZSBwb2ludHMgYXQgYSBmaXhlZCBkaXN0YW5jZSBmcm9tIGEgZ2l2ZW4gc3RyYWlnaHQgbGluZSwgdGhlIGF4aXMgb2YgdGhlIGN5bGluZGVyLiA8YnIvPjxici8+XG4gKiBUaGUgc29saWQgZW5jbG9zZWQgYnkgdGhpcyBzdXJmYWNlIGFuZCBieSB0d28gcGxhbmVzIHBlcnBlbmRpY3VsYXIgdG8gdGhlIGF4aXMgaXMgYWxzbyBjYWxsZWQgYSBjeWxpbmRlci48YnIvPlxuICogVGhlIHN1cmZhY2UgYXJlYSBhbmQgdGhlIHZvbHVtZSBvZiBhIGN5bGluZGVyIGhhdmUgYmVlbiBrbm93biBzaW5jZSBkZWVwIGFudGlxdWl0eS5cbiAqIEBjbGFzc0Rlc2NcbiAqIDxpZnJhbWUgc3JjPVwiaHR0cHM6Ly90aHJlZWpzLm9yZy9kb2NzL3NjZW5lcy9nZW9tZXRyeS1icm93c2VyLmh0bWwjQ29uZUdlb21ldHJ5XCI+PC9pZnJhbWU+XG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtc10gLSBUaGUgcGFyYW1zLlxuICogQGV4dGVuZHMgbW9kdWxlOmNvcmUuTWVzaENvbXBvbmVudFxuICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL21lc2hlc1xuICogQGV4YW1wbGUgPGNhcHRpb24+Q3JlYXRpbmcgYSBDb25lLCBhbmQgYWRkaW5nIHRvIGFwcDwvY2FwdGlvbj5cbiAqIG5ldyBDb25lKHtcbiAqICAgZ2VvbWV0cnk6IHtcbiAqICAgICByYWRpdXNUb3A6IDIsXG4gKiAgICAgcmFkaXVzQm90dG9tOiA0LFxuICogICAgIGhlaWdodDogNVxuICogICB9LFxuICpcbiAqICAgbWF0ZXJpYWw6IG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCh7XG4gKiAgICAgY29sb3I6IDB4ZmZmZmZmXG4gKiAgIH0pLFxuICpcbiAqICAgcG9zOiBbMCwgMTAwLCAwXVxuICogfSkuYWRkVG8oYXBwKTtcbiAqL1xuXG52YXIgQ29uZSA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX01lc2hDb21wb25lbnQpIHtcbiAgLyoqXG4gICAqIERlZmF1bHQgdmFsdWVzIGZvciBwYXJhbWV0ZXJzXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLkNvbmUjZGVmYXVsdHNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdCA8cHJlPlxuICAgKiB7XG4gICAqICAgZ2VvbWV0cnk6IHtcbiAgICogICAgIHJhZGl1czogMjAsXG4gICAqICAgICBoZWlnaHQ6IDEwMCxcbiAgICogICAgIHJhZGl1c1NlZ21lbnRzOiAzMixcbiAgICogICAgIGhlaWdodFNlZ21lbnRzOiAxLFxuICAgKiAgICAgb3BlbkVuZGVkOiBmYWxzZSxcbiAgICogICAgIHRoZXRhU3RhcnQ6IDAsXG4gICAqICAgICB0aGV0YUxlbmd0aDogTWF0aC5QSSAqIDJcbiAgICogICB9XG4gICAqIH08L3ByZT5cbiAgICovXG5cbiAgLyoqXG4gICAqIEluc3RydWN0aW9uc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5Db25lI2luc3RydWN0aW9uc1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IDxwcmU+XG4gICAqIGdlb21ldHJ5OiBbXG4gICAqICAgJ3JhZGl1cycsXG4gICAqICAgJ2hlaWdodCcsXG4gICAqICAgJ3JhZGl1c1NlZ21lbnRzJyxcbiAgICogICAnaGVpZ2h0U2VnbWVudHMnLFxuICAgKiAgICdvcGVuRW5kZWQnLFxuICAgKiAgICd0aGV0YVN0YXJ0JyxcbiAgICogICAndGhldGFMZW5ndGgnXG4gICAqIF1cbiAgICogPC9wcmU+XG4gICAqL1xuICBmdW5jdGlvbiBDb25lKCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgQ29uZSk7XG5cbiAgICBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgZ2V0UHJvdG90eXBlT2YkMihDb25lKS5jYWxsKHRoaXMsIHBhcmFtcywgQ29uZS5kZWZhdWx0cywgQ29uZS5pbnN0cnVjdGlvbnMpKTtcblxuICAgIGlmIChwYXJhbXMuYnVpbGQpIHtcbiAgICAgIF90aGlzLmJ1aWxkKHBhcmFtcyk7XG5cbiAgICAgIGdldCQzKGdldFByb3RvdHlwZU9mJDIoQ29uZS5wcm90b3R5cGUpLCBcIndyYXBcIiwgYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSkuY2FsbChhc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgLyoqXG4gICAqIEBtZXRob2QgYnVpbGRcbiAgICogQGRlc2NyaXB0aW9uIEJ1aWxkIGxpZmVjeWNsZSBjcmVhdGVzIGEgbWVzaCB1c2luZyBpbnB1dCBwYXJhbXMuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgQ29tcG9uZW50IHBhcmFtZXRlcnMuXG4gICAqIEByZXR1cm4ge1RIUkVFLk1lc2h9IEJ1aWx0IG1lc2hcbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5Db25lXG4gICAqL1xuXG5cbiAgY3JlYXRlQ2xhc3MoQ29uZSwgW3tcbiAgICBrZXk6IFwiYnVpbGRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYnVpbGQoKSB7XG4gICAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB0aGlzLnBhcmFtcztcblxuICAgICAgdmFyIF90aGlzJGFwcGx5QnJpZGdlID0gdGhpcy5hcHBseUJyaWRnZSh7XG4gICAgICAgIGdlb21ldHJ5OiB0aGlzLmJ1aWxkR2VvbWV0cnkocGFyYW1zKSxcbiAgICAgICAgbWF0ZXJpYWw6IHBhcmFtcy5tYXRlcmlhbFxuICAgICAgfSksXG4gICAgICAgICAgZ2VvbWV0cnkgPSBfdGhpcyRhcHBseUJyaWRnZS5nZW9tZXRyeSxcbiAgICAgICAgICBtYXRlcmlhbCA9IF90aGlzJGFwcGx5QnJpZGdlLm1hdGVyaWFsO1xuXG4gICAgICByZXR1cm4gdGhpcy5hcHBseUJyaWRnZSh7XG4gICAgICAgIG1lc2g6IG5ldyBNZXNoKGdlb21ldHJ5LCBtYXRlcmlhbClcbiAgICAgIH0pLm1lc2g7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImJ1aWxkR2VvbWV0cnlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYnVpbGRHZW9tZXRyeSgpIHtcbiAgICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgICAgdmFyIGdlb21ldHJ5ID0gbmV3IChwYXJhbXMuYnVmZmVyID8gQ29uZUJ1ZmZlckdlb21ldHJ5IDogQ29uZUdlb21ldHJ5KShwYXJhbXMuZ2VvbWV0cnkucmFkaXVzLCBwYXJhbXMuZ2VvbWV0cnkuaGVpZ2h0LCBwYXJhbXMuZ2VvbWV0cnkucmFkaXVzU2VnbWVudHMsIHBhcmFtcy5nZW9tZXRyeS5oZWlnaHRTZWdtZW50cywgcGFyYW1zLmdlb21ldHJ5Lm9wZW5FbmRlZCwgcGFyYW1zLmdlb21ldHJ5LnRoZXRhU3RhcnQsIHBhcmFtcy5nZW9tZXRyeS50aGV0YUxlbmd0aCk7XG4gICAgICByZXR1cm4gZ2VvbWV0cnk7XG4gICAgfVxuICB9XSk7XG5cbiAgaW5oZXJpdHMoQ29uZSwgX01lc2hDb21wb25lbnQpO1xuXG4gIHJldHVybiBDb25lO1xufShNZXNoQ29tcG9uZW50KTtcblxuZGVmaW5lUHJvcGVydHkkMyhkZWZpbmVQcm9wZXJ0eSQzKENvbmUsIFwiZGVmYXVsdHNcIiwgb2JqZWN0U3ByZWFkKHt9LCBNZXNoQ29tcG9uZW50LmRlZmF1bHRzLCB7XG4gIGdlb21ldHJ5OiB7XG4gICAgcmFkaXVzOiAyMCxcbiAgICBoZWlnaHQ6IDEwMCxcbiAgICByYWRpdXNTZWdtZW50czogMzIsXG4gICAgaGVpZ2h0U2VnbWVudHM6IDEsXG4gICAgb3BlbkVuZGVkOiBmYWxzZSxcbiAgICB0aGV0YVN0YXJ0OiAwLFxuICAgIHRoZXRhTGVuZ3RoOiBNYXRoLlBJICogMlxuICB9XG59KSksIFwiaW5zdHJ1Y3Rpb25zXCIsIG9iamVjdFNwcmVhZCh7fSwgTWVzaENvbXBvbmVudC5pbnN0cnVjdGlvbnMsIHtcbiAgZ2VvbWV0cnk6IFsncmFkaXVzJywgJ2hlaWdodCcsICdyYWRpdXNTZWdtZW50cycsICdoZWlnaHRTZWdtZW50cycsICdvcGVuRW5kZWQnLCAndGhldGFTdGFydCcsICd0aGV0YUxlbmd0aCddXG59KSk7XG5cbi8qKlxuICogQGNsYXNzIEN5bGluZGVyXG4gKiBAY2F0ZWdvcnkgY29tcG9uZW50cy9tZXNoZXNcbiAqIEBkZXNjcmlwdGlvbiBBIGN5bGluZGVyIGlzIG9uZSBvZiB0aGUgbW9zdCBiYXNpYyBjdXJ2aWxpbmVhciBnZW9tZXRyaWMgc2hhcGVzLCB0aGUgc3VyZmFjZSBmb3JtZWQgYnkgdGhlIHBvaW50cyBhdCBhIGZpeGVkIGRpc3RhbmNlIGZyb20gYSBnaXZlbiBzdHJhaWdodCBsaW5lLCB0aGUgYXhpcyBvZiB0aGUgY3lsaW5kZXIuIDxici8+PGJyLz5cbiAqIFRoZSBzb2xpZCBlbmNsb3NlZCBieSB0aGlzIHN1cmZhY2UgYW5kIGJ5IHR3byBwbGFuZXMgcGVycGVuZGljdWxhciB0byB0aGUgYXhpcyBpcyBhbHNvIGNhbGxlZCBhIGN5bGluZGVyLjxici8+XG4gKiBUaGUgc3VyZmFjZSBhcmVhIGFuZCB0aGUgdm9sdW1lIG9mIGEgY3lsaW5kZXIgaGF2ZSBiZWVuIGtub3duIHNpbmNlIGRlZXAgYW50aXF1aXR5LlxuICogQGNsYXNzRGVzY1xuICogPGlmcmFtZSBzcmM9XCJodHRwczovL3RocmVlanMub3JnL2RvY3Mvc2NlbmVzL2dlb21ldHJ5LWJyb3dzZXIuaHRtbCNDeWxpbmRlckdlb21ldHJ5XCI+PC9pZnJhbWU+XG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtc10gLSBUaGUgcGFyYW1zLlxuICogQGV4dGVuZHMgbW9kdWxlOmNvcmUuTWVzaENvbXBvbmVudFxuICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL21lc2hlc1xuICogQGV4YW1wbGUgPGNhcHRpb24+Q3JlYXRpbmcgYSBDeWxpbmRlciwgYW5kIGFkZGluZyB0byBhcHA8L2NhcHRpb24+XG4gKiBuZXcgQ3lsaW5kZXIoe1xuICogICBnZW9tZXRyeToge1xuICogICAgIHJhZGl1c1RvcDogMixcbiAqICAgICByYWRpdXNCb3R0b206IDQsXG4gKiAgICAgaGVpZ2h0OiA1XG4gKiAgIH0sXG4gKlxuICogICBtYXRlcmlhbDogbmV3IFRIUkVFLk1lc2hCYXNpY01hdGVyaWFsKHtcbiAqICAgICBjb2xvcjogMHhmZmZmZmZcbiAqICAgfSksXG4gKlxuICogICBwb3M6IFswLCAxMDAsIDBdXG4gKiB9KS5hZGRUbyhhcHApO1xuICovXG5cbnZhciBDeWxpbmRlciA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX01lc2hDb21wb25lbnQpIHtcbiAgLyoqXG4gICAqIERlZmF1bHQgdmFsdWVzIGZvciBwYXJhbWV0ZXJzXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLkN5bGluZGVyI2RlZmF1bHRzXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHQgPHByZT5cbiAgICoge1xuICAgKiAgIGdlb21ldHJ5OiB7XG4gICAqICAgICByYWRpdXNUb3A6IDIwLFxuICAgKiAgICAgcmFkaXVzQm90dG9tOiAyMCxcbiAgICogICAgIGhlaWdodDogMTAwLFxuICAgKiAgICAgcmFkaXVzU2VnbWVudHM6IDMyLFxuICAgKiAgICAgaGVpZ2h0U2VnbWVudHM6IDEsXG4gICAqICAgICBvcGVuRW5kZWQ6IGZhbHNlLFxuICAgKiAgICAgdGhldGFTdGFydDogMCxcbiAgICogICAgIHRoZXRhTGVuZ3RoOiBNYXRoLlBJICogMlxuICAgKiAgIH1cbiAgICogfTwvcHJlPlxuICAgKi9cblxuICAvKipcbiAgICogSW5zdHJ1Y3Rpb25zXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLkN5bGluZGVyI2luc3RydWN0aW9uc1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IDxwcmU+XG4gICAqIGdlb21ldHJ5OiBbXG4gICAqICAgJ3JhZGl1c1RvcCcsXG4gICAqICAgJ3JhZGl1c0JvdHRvbScsXG4gICAqICAgJ2hlaWdodCcsXG4gICAqICAgJ3JhZGl1c1NlZ21lbnRzJyxcbiAgICogICAnaGVpZ2h0U2VnbWVudHMnLFxuICAgKiAgICdvcGVuRW5kZWQnLFxuICAgKiAgICd0aGV0YVN0YXJ0JyxcbiAgICogICAndGhldGFMZW5ndGgnXG4gICAqIF1cbiAgICogPC9wcmU+XG4gICAqL1xuICBmdW5jdGlvbiBDeWxpbmRlcigpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIEN5bGluZGVyKTtcblxuICAgIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBnZXRQcm90b3R5cGVPZiQyKEN5bGluZGVyKS5jYWxsKHRoaXMsIHBhcmFtcywgQ3lsaW5kZXIuZGVmYXVsdHMsIEN5bGluZGVyLmluc3RydWN0aW9ucykpO1xuXG4gICAgaWYgKHBhcmFtcy5idWlsZCkge1xuICAgICAgX3RoaXMuYnVpbGQocGFyYW1zKTtcblxuICAgICAgZ2V0JDMoZ2V0UHJvdG90eXBlT2YkMihDeWxpbmRlci5wcm90b3R5cGUpLCBcIndyYXBcIiwgYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSkuY2FsbChhc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgLyoqXG4gICAqIEBtZXRob2QgYnVpbGRcbiAgICogQGRlc2NyaXB0aW9uIEJ1aWxkIGxpZmVjeWNsZSBjcmVhdGVzIGEgbWVzaCB1c2luZyBpbnB1dCBwYXJhbXMuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgQ29tcG9uZW50IHBhcmFtZXRlcnMuXG4gICAqIEByZXR1cm4ge1RIUkVFLk1lc2h9IEJ1aWx0IG1lc2hcbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5DeWxpbmRlclxuICAgKi9cblxuXG4gIGNyZWF0ZUNsYXNzKEN5bGluZGVyLCBbe1xuICAgIGtleTogXCJidWlsZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBidWlsZCgpIHtcbiAgICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHRoaXMucGFyYW1zO1xuXG4gICAgICB2YXIgX3RoaXMkYXBwbHlCcmlkZ2UgPSB0aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgICAgZ2VvbWV0cnk6IHRoaXMuYnVpbGRHZW9tZXRyeShwYXJhbXMpLFxuICAgICAgICBtYXRlcmlhbDogcGFyYW1zLm1hdGVyaWFsXG4gICAgICB9KSxcbiAgICAgICAgICBnZW9tZXRyeSA9IF90aGlzJGFwcGx5QnJpZGdlLmdlb21ldHJ5LFxuICAgICAgICAgIG1hdGVyaWFsID0gX3RoaXMkYXBwbHlCcmlkZ2UubWF0ZXJpYWw7XG5cbiAgICAgIHJldHVybiB0aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgICAgbWVzaDogbmV3IE1lc2goZ2VvbWV0cnksIG1hdGVyaWFsKVxuICAgICAgfSkubWVzaDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYnVpbGRHZW9tZXRyeVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBidWlsZEdlb21ldHJ5KCkge1xuICAgICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgICB2YXIgZ2VvbWV0cnkgPSBuZXcgKHBhcmFtcy5idWZmZXIgPyBDeWxpbmRlckJ1ZmZlckdlb21ldHJ5IDogQ3lsaW5kZXJHZW9tZXRyeSkocGFyYW1zLmdlb21ldHJ5LnJhZGl1c1RvcCwgcGFyYW1zLmdlb21ldHJ5LnJhZGl1c0JvdHRvbSwgcGFyYW1zLmdlb21ldHJ5LmhlaWdodCwgcGFyYW1zLmdlb21ldHJ5LnJhZGl1c1NlZ21lbnRzLCBwYXJhbXMuZ2VvbWV0cnkuaGVpZ2h0U2VnbWVudHMsIHBhcmFtcy5nZW9tZXRyeS5vcGVuRW5kZWQsIHBhcmFtcy5nZW9tZXRyeS50aGV0YVN0YXJ0LCBwYXJhbXMuZ2VvbWV0cnkudGhldGFMZW5ndGgpO1xuICAgICAgcmV0dXJuIGdlb21ldHJ5O1xuICAgIH1cbiAgfV0pO1xuXG4gIGluaGVyaXRzKEN5bGluZGVyLCBfTWVzaENvbXBvbmVudCk7XG5cbiAgcmV0dXJuIEN5bGluZGVyO1xufShNZXNoQ29tcG9uZW50KTtcblxuZGVmaW5lUHJvcGVydHkkMyhkZWZpbmVQcm9wZXJ0eSQzKEN5bGluZGVyLCBcImRlZmF1bHRzXCIsIG9iamVjdFNwcmVhZCh7fSwgTWVzaENvbXBvbmVudC5kZWZhdWx0cywge1xuICBnZW9tZXRyeToge1xuICAgIHJhZGl1c1RvcDogMCxcbiAgICByYWRpdXNCb3R0b206IDEsXG4gICAgaGVpZ2h0OiAxLFxuICAgIHJhZGl1c1NlZ21lbnRzOiAzMixcbiAgICBoZWlnaHRTZWdtZW50czogMSxcbiAgICBvcGVuRW5kZWQ6IGZhbHNlLFxuICAgIHRoZXRhU3RhcnQ6IDAsXG4gICAgdGhldGFMZW5ndGg6IE1hdGguUEkgKiAyXG4gIH1cbn0pKSwgXCJpbnN0cnVjdGlvbnNcIiwgb2JqZWN0U3ByZWFkKHt9LCBNZXNoQ29tcG9uZW50Lmluc3RydWN0aW9ucywge1xuICBnZW9tZXRyeTogWydyYWRpdXNUb3AnLCAncmFkaXVzQm90dG9tJywgJ2hlaWdodCcsICdyYWRpdXNTZWdtZW50cycsICdoZWlnaHRTZWdtZW50cycsICdvcGVuRW5kZWQnLCAndGhldGFTdGFydCcsICd0aGV0YUxlbmd0aCddXG59KSk7XG5cbi8qKlxuICogQGNsYXNzIERvZGVjYWhlZHJvblxuICogQGNhdGVnb3J5IGNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZGVzY3JpcHRpb24gSW4gZ2VvbWV0cnksIGEgZG9kZWNhaGVkcm9uIGlzIGFueSBwb2x5aGVkcm9uIHdpdGggdHdlbHZlIGZsYXQgZmFjZXMuIDxici8+PGJyLz5cbiAqIFRoZSBtb3N0IGZhbWlsaWFyIGRvZGVjYWhlZHJvbiBpcyB0aGUgcmVndWxhciBkb2RlY2FoZWRyb24sIHdoaWNoIGlzIGEgUGxhdG9uaWMgc29saWQuIDxici8+XG4gKiBUaGVyZSBhcmUgYWxzbyB0aHJlZSByZWd1bGFyIHN0YXIgZG9kZWNhaGVkcmEsIHdoaWNoIGFyZSBjb25zdHJ1Y3RlZCBhcyBzdGVsbGF0aW9ucyBvZiB0aGUgY29udmV4IGZvcm0uIDxici8+XG4gKiBBbGwgb2YgdGhlc2UgaGF2ZSBpY29zYWhlZHJhbCBzeW1tZXRyeSwgb3JkZXIgMTIwLlxuICogRG9kZWNhaGVkcm9uIGNyZWF0ZXMgRG9kZWNhaGVkcm9uIG9iamVjdCBieSBpdCdzIHJhZGl1cyBhbmQgZGV0YWlsLlxuICogQGNsYXNzRGVzY1xuICogPGlmcmFtZSBzcmM9XCJodHRwczovL3RocmVlanMub3JnL2RvY3Mvc2NlbmVzL2dlb21ldHJ5LWJyb3dzZXIuaHRtbCNEb2RlY2FoZWRyb25HZW9tZXRyeVwiPjwvaWZyYW1lPlxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXNdIC0gVGhlIHBhcmFtcy5cbiAqIEBleHRlbmRzIG1vZHVsZTpjb3JlLk1lc2hDb21wb25lbnRcbiAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXNcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkNyZWF0aW5nIGEgRG9kZWNhaGVkcm9uLCBhbmQgYWRkaW5nIHRvIGFwcDwvY2FwdGlvbj5cbiAqIG5ldyBEb2RlY2FoZWRyb24oe1xuICogICBnZW9tZXRyeToge1xuICogICAgIHJhZGl1czogMlxuICogICB9LFxuICpcbiAqICAgbWF0ZXJpYWw6IG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCh7XG4gKiAgICAgY29sb3I6IDB4ZmZmZmZmXG4gKiAgIH0pLFxuICpcbiAqICAgcG9zaXRpb246IHtcbiAqICAgICB5OiAxMFxuICogICB9XG4gICogfSkuYWRkVG8oYXBwKTtcbiAqL1xuXG52YXIgRG9kZWNhaGVkcm9uID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfTWVzaENvbXBvbmVudCkge1xuICAvKipcbiAgICogRGVmYXVsdCB2YWx1ZXMgZm9yIHBhcmFtZXRlcnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuRG9kZWNhaGVkcm9uI2RlZmF1bHRzXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHQgPHByZT5cbiAgICogZ2VvbWV0cnk6IHtcbiAgICogICByYWRpdXM6IDEsXG4gICAqICAgZGV0YWlsOiAwXG4gICAqIH1cbiAgICogPC9wcmU+XG4gICAqL1xuXG4gIC8qKlxuICAgKiBJbnN0cnVjdGlvbnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuRG9kZWNhaGVkcm9uI2luc3RydWN0aW9uc1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IDxwcmU+XG4gICAqIGdlb21ldHJ5OiBbJ3JhZGl1cycsICdkZXRhaWwnXVxuICAgKiA8L3ByZT5cbiAgICovXG4gIGZ1bmN0aW9uIERvZGVjYWhlZHJvbigpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIERvZGVjYWhlZHJvbik7XG5cbiAgICBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgZ2V0UHJvdG90eXBlT2YkMihEb2RlY2FoZWRyb24pLmNhbGwodGhpcywgcGFyYW1zLCBEb2RlY2FoZWRyb24uZGVmYXVsdHMsIERvZGVjYWhlZHJvbi5pbnN0cnVjdGlvbnMpKTtcblxuICAgIGlmIChwYXJhbXMuYnVpbGQpIHtcbiAgICAgIF90aGlzLmJ1aWxkKHBhcmFtcyk7XG5cbiAgICAgIGdldCQzKGdldFByb3RvdHlwZU9mJDIoRG9kZWNhaGVkcm9uLnByb3RvdHlwZSksIFwid3JhcFwiLCBhc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpKS5jYWxsKGFzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcykpO1xuICAgIH1cblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuICAvKipcbiAgICogQG1ldGhvZCBidWlsZFxuICAgKiBAZGVzY3JpcHRpb24gQnVpbGQgbGlmZWN5Y2xlIGNyZWF0ZXMgYSBtZXNoIHVzaW5nIGlucHV0IHBhcmFtcy5cbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBDb21wb25lbnQgcGFyYW1ldGVycy5cbiAgICogQHJldHVybiB7VEhSRUUuTWVzaH0gQnVpbHQgbWVzaFxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLkRvZGVjYWhlZHJvblxuICAgKi9cblxuXG4gIGNyZWF0ZUNsYXNzKERvZGVjYWhlZHJvbiwgW3tcbiAgICBrZXk6IFwiYnVpbGRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYnVpbGQoKSB7XG4gICAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB0aGlzLnBhcmFtcztcblxuICAgICAgdmFyIF90aGlzJGFwcGx5QnJpZGdlID0gdGhpcy5hcHBseUJyaWRnZSh7XG4gICAgICAgIGdlb21ldHJ5OiB0aGlzLmJ1aWxkR2VvbWV0cnkocGFyYW1zKSxcbiAgICAgICAgbWF0ZXJpYWw6IHBhcmFtcy5tYXRlcmlhbFxuICAgICAgfSksXG4gICAgICAgICAgZ2VvbWV0cnkgPSBfdGhpcyRhcHBseUJyaWRnZS5nZW9tZXRyeSxcbiAgICAgICAgICBtYXRlcmlhbCA9IF90aGlzJGFwcGx5QnJpZGdlLm1hdGVyaWFsO1xuXG4gICAgICByZXR1cm4gdGhpcy5hcHBseUJyaWRnZSh7XG4gICAgICAgIG1lc2g6IG5ldyBNZXNoKGdlb21ldHJ5LCBtYXRlcmlhbClcbiAgICAgIH0pLm1lc2g7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImJ1aWxkR2VvbWV0cnlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYnVpbGRHZW9tZXRyeSgpIHtcbiAgICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgICAgcmV0dXJuIG5ldyAocGFyYW1zLmJ1ZmZlciA/IERvZGVjYWhlZHJvbkJ1ZmZlckdlb21ldHJ5IDogRG9kZWNhaGVkcm9uR2VvbWV0cnkpKHBhcmFtcy5nZW9tZXRyeS5yYWRpdXMsIHBhcmFtcy5nZW9tZXRyeS5kZXRhaWwpO1xuICAgIH1cbiAgfV0pO1xuXG4gIGluaGVyaXRzKERvZGVjYWhlZHJvbiwgX01lc2hDb21wb25lbnQpO1xuXG4gIHJldHVybiBEb2RlY2FoZWRyb247XG59KE1lc2hDb21wb25lbnQpO1xuXG5kZWZpbmVQcm9wZXJ0eSQzKGRlZmluZVByb3BlcnR5JDMoRG9kZWNhaGVkcm9uLCBcImRlZmF1bHRzXCIsIG9iamVjdFNwcmVhZCh7fSwgTWVzaENvbXBvbmVudC5kZWZhdWx0cywge1xuICBnZW9tZXRyeToge1xuICAgIHJhZGl1czogMSxcbiAgICBkZXRhaWw6IDBcbiAgfVxufSkpLCBcImluc3RydWN0aW9uc1wiLCBvYmplY3RTcHJlYWQoe30sIE1lc2hDb21wb25lbnQuaW5zdHJ1Y3Rpb25zLCB7XG4gIGdlb21ldHJ5OiBbJ3JhZGl1cycsICdkZXRhaWwnXVxufSkpO1xuXG4vKipcbiAqIEBjbGFzcyBFeHRydWRlXG4gKiBAY2F0ZWdvcnkgY29tcG9uZW50cy9tZXNoZXNcbiAqIEBkZXNjcmlwdGlvbiBFeHRydWRlIGdlb21ldHJ5IG1lYW5zIHRoYXQgeW91IGNhbiBjcmVhdGUgYSAzRCBtZXNoIGZyb20gYW55IDJEIHNoYXBlIHVzaW5nIHRocmVlLmpzIGdlb21ldHJ5IGJhc2VkIG9uIDxhIGhyZWY9J2h0dHBzOi8vdGhyZWVqcy5vcmcvZG9jcy8jYXBpL21hdGgvVmVjdG9yMic+VEhSRUUuVmVjdG9yMi48L2E+IDxici8+XG4gKiBTdWNoIGltcGxlbWVudGF0aW9uIHdpbGwgaGVscCB5b3UgdG8gbWFrZSB2b2x1bWVkIHNoYXBlcyB0aGF0IGhhdmUgdGhlaXIgb3duIGRlcHRoIGFuZCBjYW4gYmUgc2VlbiBmcm9tIGFsbCBhbmdlbHMuPGJyLz48YnIvPlxuICogWW91IGNhbiBhbHNvIGZpbmQgc29tZSBpbnRlcmVzdGluZyBleGFtcGxlcyBtYWRlIHVzaW5nIDxhIGhyZWY9J3RocmVlanMub3JnJz50aHJlZS5qczwvYT4gd2hpY2ggaXMgYSBjb3JlIG9mIHdocy5qcywgc3VjaCBhczpcbiAqIC0gPGEgaHJlZj0naHR0cDovL3RocmVlanMub3JnL2V4YW1wbGVzL3dlYmdsX2dlb21ldHJ5X2V4dHJ1ZGVfc2hhcGVzLmh0bWwnPldlYmdsIGdlb21ldHJ5IGV4dHJ1ZGU8L2E+XG4gKiAtIDxhIGhyZWY9J2h0dHA6Ly90aHJlZWpzLm9yZy9leGFtcGxlcy93ZWJnbF9nZW9tZXRyeV9leHRydWRlX3NoYXBlczIuaHRtbCc+RXh0cnVkZSBzaGFwZXMgZnJvbSBnZW9kYXRhPC9hPlxuICogLSA8YSBocmVmPSdodHRwOi8vdGhyZWVqcy5vcmcvZXhhbXBsZXMvd2ViZ2xfZ2VvbWV0cnlfZXh0cnVkZV9zcGxpbmVzLmh0bWwnPkV4dHJ1ZGUgc3BsaW5lczwvYT5cbiAqXG4gKiBTdWNoIGV4YW1wbGVzIGNhbiBiZSBlYXNpbHkgaW1wbGVtZW50ZWQgdXNpbmcgd2hpdGVzdG9ybS5qcyBvciBpdCdzIHBsdWdpbnMuIFVzZSBgRXh0cnVkZWAgY2xhc3Mgd2l0aCA8YSBocmVmPSdodHRwczovL3RocmVlanMub3JnL2RvY3MvI2FwaS9leHRyYXMvY29yZS9TaGFwZSc+VEhSRUUuU2hhcGU8L2E+IHRvIGdldCBleHRydWRlIGVmZmVjdCBvZiBzaGFwZSBkZWZpbmVkIGJ5IDJEIHZlY3RvcnMuXG4gKiBUaGlzIGNsYXNzIGlzIHNpbWlsYXIgdG8gPGEgaHJlZj0naHR0cHM6Ly90aHJlZWpzLm9yZy9kb2NzLyNhcGkvZ2VvbWV0cmllcy9FeHRydWRlR2VvbWV0cnknPlRIUkVFLkV4dHJ1ZGVHZW9tZXRyeTwvYT4sXG4gKiBidXQgaXQgYWxzbyBjb250YWlucyBhbGwgcHJvcGVydGllcywgYXBwbGllZCBieSBgU2hhcGVgLCBzdWNoIGFzIG1hdGVyaWFsLCBtYXNzIGFuZCB2ZWN0b3JzIGxpa2UgcG9zaXRpb24gKHBvcykgYW5kIHJvdGF0aW9uIChyb3QpLlxuICogQGNsYXNzRGVzY1xuICogPGlmcmFtZSBzcmM9XCJodHRwczovL3RocmVlanMub3JnL2RvY3Mvc2NlbmVzL2dlb21ldHJ5LWJyb3dzZXIuaHRtbCNFeHRydWRlR2VvbWV0cnlcIj48L2lmcmFtZT5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zXSAtIFRoZSBwYXJhbXMuXG4gKiBAZXh0ZW5kcyBtb2R1bGU6Y29yZS5NZXNoQ29tcG9uZW50XG4gKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5DcmVhdGluZyBhIHNoYXBlLCB0aGVuIGFuIEV4dHJ1ZGUgZnJvbSBpdDwvY2FwdGlvbj5cbiAqIGNvbnN0IHNoYXBlID0gbmV3IFRIUkVFLlNoYXBlKFtcbiAqICAgbmV3IFRIUkVFLlZlY3RvcjIoLTQsLTQpLFxuICogICBuZXcgVEhSRUUuVmVjdG9yMigtMiwwKSxcbiAqICAgbmV3IFRIUkVFLlZlY3RvcjIoLTQsNCksXG4gKiAgIG5ldyBUSFJFRS5WZWN0b3IyKDAsMiksXG4gKiAgIG5ldyBUSFJFRS5WZWN0b3IyKDQsNCksXG4gKiAgIG5ldyBUSFJFRS5WZWN0b3IyKDIsMCksXG4gKiAgIG5ldyBUSFJFRS5WZWN0b3IyKDQsLTQpLFxuICogICBuZXcgVEhSRUUuVmVjdG9yMigwLC0yKVxuICogXSk7XG4gKlxuICogY29uc3QgZXh0cnVkZSA9IG5ldyBFeHRydWRlKHtcbiAqICAgZ2VvbWV0cnk6IHtcbiAqICAgICBzaGFwZXM6IHNoYXBlLFxuICogICAgIG9wdGlvbnM6IHtcbiAqICAgICAgIGJldmVsRW5hYmxlZDogZmFsc2UsXG4gKiAgICAgICBiZXZlbFNpemU6IDAsXG4gKiAgICAgICBhbW91bnQ6IDJcbiAqICAgICB9XG4gKiAgIH0sXG4gKlxuICogICBtYXRlcmlhbDogbmV3IFRIUkVFLk1lc2hCYXNpY01hdGVyaWFsKHtcbiAqICAgICBjb2xvcjogMHhmZmZmZmZcbiAqICAgfSksXG4gKlxuICogICBwb3NpdGlvbjogWzAsIDEwMCwgMF1cbiAqIH0pO1xuICpcbiAqIGV4dHJ1ZGUuYWRkVG8oYXBwKTtcbiAqL1xuXG52YXIgRXh0cnVkZSA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX01lc2hDb21wb25lbnQpIHtcbiAgLyoqXG4gICAqIERlZmF1bHQgdmFsdWVzIGZvciBwYXJhbWV0ZXJzXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLkV4dHJ1ZGUjZGVmYXVsdHNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdCA8cHJlPlxuICAgKiB7XG4gICAqICAgZ2VvbWV0cnk6IHtcbiAgICogICAgIHNoYXBlczogW10sXG4gICAqICAgICBvcHRpb25zOiB7fVxuICAgKiAgIH1cbiAgICogfVxuICAgKiA8L3ByZT5cbiAgICovXG5cbiAgLyoqXG4gICAqIEluc3RydWN0aW9uc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5FeHRydWRlI2luc3RydWN0aW9uc1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IDxwcmU+XG4gICAqIHtcbiAgICogICBnZW9tZXRyeTogWydzaGFwZXMnLCAnb3B0aW9ucyddXG4gICAqIH1cbiAgICogPC9wcmU+XG4gICAqL1xuICBmdW5jdGlvbiBFeHRydWRlKCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgRXh0cnVkZSk7XG5cbiAgICBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgZ2V0UHJvdG90eXBlT2YkMihFeHRydWRlKS5jYWxsKHRoaXMsIHBhcmFtcywgRXh0cnVkZS5kZWZhdWx0cywgRXh0cnVkZS5pbnN0cnVjdGlvbnMpKTtcblxuICAgIGlmIChwYXJhbXMuYnVpbGQpIHtcbiAgICAgIF90aGlzLmJ1aWxkKHBhcmFtcyk7XG5cbiAgICAgIGdldCQzKGdldFByb3RvdHlwZU9mJDIoRXh0cnVkZS5wcm90b3R5cGUpLCBcIndyYXBcIiwgYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSkuY2FsbChhc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgLyoqXG4gICAqIEBtZXRob2QgYnVpbGRcbiAgICogQGRlc2NyaXB0aW9uIEJ1aWxkIGxpZmVjeWNsZSBjcmVhdGVzIGEgbWVzaCB1c2luZyBpbnB1dCBwYXJhbXMuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgQ29tcG9uZW50IHBhcmFtZXRlcnMuXG4gICAqIEByZXR1cm4ge1RIUkVFLk1lc2h9IEJ1aWx0IG1lc2hcbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5FeHRydWRlXG4gICAqL1xuXG5cbiAgY3JlYXRlQ2xhc3MoRXh0cnVkZSwgW3tcbiAgICBrZXk6IFwiYnVpbGRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYnVpbGQoKSB7XG4gICAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB0aGlzLnBhcmFtcztcblxuICAgICAgdmFyIF90aGlzJGFwcGx5QnJpZGdlID0gdGhpcy5hcHBseUJyaWRnZSh7XG4gICAgICAgIGdlb21ldHJ5OiB0aGlzLmJ1aWxkR2VvbWV0cnkocGFyYW1zKSxcbiAgICAgICAgbWF0ZXJpYWw6IHBhcmFtcy5tYXRlcmlhbFxuICAgICAgfSksXG4gICAgICAgICAgZ2VvbWV0cnkgPSBfdGhpcyRhcHBseUJyaWRnZS5nZW9tZXRyeSxcbiAgICAgICAgICBtYXRlcmlhbCA9IF90aGlzJGFwcGx5QnJpZGdlLm1hdGVyaWFsO1xuXG4gICAgICByZXR1cm4gdGhpcy5hcHBseUJyaWRnZSh7XG4gICAgICAgIG1lc2g6IG5ldyBNZXNoKGdlb21ldHJ5LCBtYXRlcmlhbClcbiAgICAgIH0pLm1lc2g7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImJ1aWxkR2VvbWV0cnlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYnVpbGRHZW9tZXRyeSgpIHtcbiAgICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgICAgdmFyIGdlb21ldHJ5ID0gbmV3IEV4dHJ1ZGVHZW9tZXRyeShwYXJhbXMuZ2VvbWV0cnkuc2hhcGVzLCBwYXJhbXMuZ2VvbWV0cnkub3B0aW9ucyk7XG4gICAgICByZXR1cm4gcGFyYW1zLmJ1ZmZlciA/IG5ldyBCdWZmZXJHZW9tZXRyeSgpLmZyb21HZW9tZXRyeShnZW9tZXRyeSkgOiBnZW9tZXRyeTtcbiAgICB9XG4gIH1dKTtcblxuICBpbmhlcml0cyhFeHRydWRlLCBfTWVzaENvbXBvbmVudCk7XG5cbiAgcmV0dXJuIEV4dHJ1ZGU7XG59KE1lc2hDb21wb25lbnQpO1xuXG5kZWZpbmVQcm9wZXJ0eSQzKGRlZmluZVByb3BlcnR5JDMoRXh0cnVkZSwgXCJkZWZhdWx0c1wiLCBvYmplY3RTcHJlYWQoe30sIE1lc2hDb21wb25lbnQuZGVmYXVsdHMsIHtcbiAgZ2VvbWV0cnk6IHtcbiAgICBzaGFwZXM6IFtdLFxuICAgIG9wdGlvbnM6IHt9XG4gIH1cbn0pKSwgXCJpbnN0cnVjdGlvbnNcIiwgb2JqZWN0U3ByZWFkKHt9LCBNZXNoQ29tcG9uZW50Lmluc3RydWN0aW9ucywge1xuICBnZW9tZXRyeTogWydzaGFwZXMnLCAnb3B0aW9ucyddXG59KSk7XG5cbi8qKlxuICogQGNsYXNzIEljb3NhaGVkcm9uXG4gKiBAY2F0ZWdvcnkgY29tcG9uZW50cy9tZXNoZXNcbiAqIEBkZXNjcmlwdGlvbiBJbiBnZW9tZXRyeSwgYW4gaWNvc2FoZWRyb24gaXMgYSBwb2x5aGVkcm9uIHdpdGggMjAgZmFjZXMuPGJyLz5cbiAqIFRoZXJlIGFyZSBtYW55IGtpbmRzIG9mIGljb3NhaGVkcmEsIHdpdGggc29tZSBiZWluZyBtb3JlIHN5bW1ldHJpY2FsIHRoYW4gb3RoZXJzLiBUaGUgbW9zdCB3ZWxsIGtub3duIGlzIHRoZSBQbGF0b25pYywgY29udmV4IHJlZ3VsYXIgaWNvc2FoZWRyb24uPGJyLz5cbiAqIGBJY29zYWhlZHJvbmAgY3JlYXRlcyBhbiBJY29zYWhlZHJvbiBvYmplY3QgYnkgaXRzIHJhZGl1cyBhbmQgZGV0YWlsLlxuICogQGNsYXNzRGVzY1xuICogPGlmcmFtZSBzcmM9XCJodHRwczovL3RocmVlanMub3JnL2RvY3Mvc2NlbmVzL2dlb21ldHJ5LWJyb3dzZXIuaHRtbCNJY29zYWhlZHJvbkdlb21ldHJ5XCI+PC9pZnJhbWU+XG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtc10gLSBUaGUgcGFyYW1zLlxuICogQGV4dGVuZHMgbW9kdWxlOmNvcmUuTWVzaENvbXBvbmVudFxuICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL21lc2hlc1xuICogQGV4YW1wbGUgPGNhcHRpb24+Q3JlYXRpbmcgYSBJY29zYWhlZHJvbiwgYW5kIGFkZGluZyB0byBhcHA8L2NhcHRpb24+XG4gKiBuZXcgSWNvc2FoZWRyb24oe1xuICogICBnZW9tZXRyeToge1xuICogICAgIHJhZGl1czogMixcbiAqICAgICBkZXRhaWw6IDFcbiAqICAgfSxcbiAqXG4gKiAgIG1hdGVyaWFsOiBuZXcgVEhSRUUuTWVzaEJhc2ljTWF0ZXJpYWwoe1xuICogICAgIGNvbG9yOiAweGZmZmZmZlxuICogICB9KSxcbiAqXG4gKiAgIHBvc2l0aW9uOiBbMCwgMTAwLCAwXVxuICogfSkuYWRkVG8oYXBwKTtcbiAqL1xuXG52YXIgSWNvc2FoZWRyb24gPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9NZXNoQ29tcG9uZW50KSB7XG4gIC8qKlxuICAgKiBEZWZhdWx0IHZhbHVlcyBmb3IgcGFyYW1ldGVyc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5JY29zYWhlZHJvbiNkZWZhdWx0c1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IDxwcmU+XG4gICAqIHtcbiAgICogICBnZW9tZXRyeToge1xuICAgKiAgICAgcmFkaXVzOiAxLFxuICAgKiAgICAgZGV0YWlsOiAwXG4gICAqICAgfVxuICAgKiB9PC9wcmU+XG4gICAqL1xuXG4gIC8qKlxuICAgKiBJbnN0cnVjdGlvbnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuSWNvc2FoZWRyb24jaW5zdHJ1Y3Rpb25zXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHQge2dlb21ldHJ5OiBbJ3JhZGl1cycsICdkZXRhaWwnXX1cbiAgICovXG4gIGZ1bmN0aW9uIEljb3NhaGVkcm9uKCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgSWNvc2FoZWRyb24pO1xuXG4gICAgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIGdldFByb3RvdHlwZU9mJDIoSWNvc2FoZWRyb24pLmNhbGwodGhpcywgcGFyYW1zLCBJY29zYWhlZHJvbi5kZWZhdWx0cywgSWNvc2FoZWRyb24uaW5zdHJ1Y3Rpb25zKSk7XG5cbiAgICBpZiAocGFyYW1zLmJ1aWxkKSB7XG4gICAgICBfdGhpcy5idWlsZChwYXJhbXMpO1xuXG4gICAgICBnZXQkMyhnZXRQcm90b3R5cGVPZiQyKEljb3NhaGVkcm9uLnByb3RvdHlwZSksIFwid3JhcFwiLCBhc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpKS5jYWxsKGFzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcykpO1xuICAgIH1cblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuICAvKipcbiAgICogQG1ldGhvZCBidWlsZFxuICAgKiBAZGVzY3JpcHRpb24gQnVpbGQgbGlmZWN5Y2xlIGNyZWF0ZXMgYSBtZXNoIHVzaW5nIGlucHV0IHBhcmFtcy5cbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBDb21wb25lbnQgcGFyYW1ldGVycy5cbiAgICogQHJldHVybiB7VEhSRUUuTWVzaH0gQnVpbHQgbWVzaFxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLkljb3NhaGVkcm9uXG4gICAqL1xuXG5cbiAgY3JlYXRlQ2xhc3MoSWNvc2FoZWRyb24sIFt7XG4gICAga2V5OiBcImJ1aWxkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGJ1aWxkKCkge1xuICAgICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogdGhpcy5wYXJhbXM7XG5cbiAgICAgIHZhciBfdGhpcyRhcHBseUJyaWRnZSA9IHRoaXMuYXBwbHlCcmlkZ2Uoe1xuICAgICAgICBnZW9tZXRyeTogdGhpcy5idWlsZEdlb21ldHJ5KHBhcmFtcyksXG4gICAgICAgIG1hdGVyaWFsOiBwYXJhbXMubWF0ZXJpYWxcbiAgICAgIH0pLFxuICAgICAgICAgIGdlb21ldHJ5ID0gX3RoaXMkYXBwbHlCcmlkZ2UuZ2VvbWV0cnksXG4gICAgICAgICAgbWF0ZXJpYWwgPSBfdGhpcyRhcHBseUJyaWRnZS5tYXRlcmlhbDtcblxuICAgICAgcmV0dXJuIHRoaXMuYXBwbHlCcmlkZ2Uoe1xuICAgICAgICBtZXNoOiBuZXcgTWVzaChnZW9tZXRyeSwgbWF0ZXJpYWwpXG4gICAgICB9KS5tZXNoO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJidWlsZEdlb21ldHJ5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGJ1aWxkR2VvbWV0cnkoKSB7XG4gICAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgICAgIHJldHVybiBuZXcgKHBhcmFtcy5idWZmZXIgPyBJY29zYWhlZHJvbkJ1ZmZlckdlb21ldHJ5IDogSWNvc2FoZWRyb25HZW9tZXRyeSkocGFyYW1zLmdlb21ldHJ5LnJhZGl1cywgcGFyYW1zLmdlb21ldHJ5LmRldGFpbCk7XG4gICAgfVxuICB9XSk7XG5cbiAgaW5oZXJpdHMoSWNvc2FoZWRyb24sIF9NZXNoQ29tcG9uZW50KTtcblxuICByZXR1cm4gSWNvc2FoZWRyb247XG59KE1lc2hDb21wb25lbnQpO1xuXG5kZWZpbmVQcm9wZXJ0eSQzKGRlZmluZVByb3BlcnR5JDMoSWNvc2FoZWRyb24sIFwiZGVmYXVsdHNcIiwgb2JqZWN0U3ByZWFkKHt9LCBNZXNoQ29tcG9uZW50LmRlZmF1bHRzLCB7XG4gIGdlb21ldHJ5OiB7XG4gICAgcmFkaXVzOiAxLFxuICAgIGRldGFpbDogMFxuICB9XG59KSksIFwiaW5zdHJ1Y3Rpb25zXCIsIG9iamVjdFNwcmVhZCh7fSwgTWVzaENvbXBvbmVudC5pbnN0cnVjdGlvbnMsIHtcbiAgZ2VvbWV0cnk6IFsncmFkaXVzJywgJ2RldGFpbCddXG59KSk7XG5cbi8qKlxuICogQGNsYXNzIExhdGhlXG4gKiBAY2F0ZWdvcnkgY29tcG9uZW50cy9tZXNoZXNcbiAqIEBkZXNjcmlwdGlvbiBBIGBMYXRoZUdlb21ldHJ5YCBhbGxvd3MgeW91IHRvIGNyZWF0ZSBzaGFwZXMgZnJvbSBhIHNtb290aCBjdXJ2ZS5cbiAqIFRoaXMgY3VydmUgaXMgZGVmaW5lZCBieSBhIG51bWJlciBvZiBwb2ludHMgKGFsc28gY2FsbGVkIGtub3RzKSBhbmQgaXMgbW9zdCBvZnRlbiBjYWxsZWQgYSBzcGxpbmUuIFRoaXMgc3BsaW5lIGlzIHJvdGF0ZWQgYXJvdW5kIGEgZml4ZWQgcG9pbnQgYW5kIHJlc3VsdHMgaW4gdmFzZS0gYW5kIGJlbGwtbGlrZSBzaGFwZXMuPGJyLz48YnIvPlxuICogSW4gM0QgY29tcHV0ZXIgZ3JhcGhpY3MsIGEgbGF0aGVkIG9iamVjdCBpcyBhIDNEIG1vZGVsIHdob3NlIHZlcnRleCBnZW9tZXRyeSBpcyBwcm9kdWNlZCBieSByb3RhdGluZyB0aGUgcG9pbnRzIG9mIGEgc3BsaW5lIG9yIG90aGVyIHBvaW50IHNldCBhcm91bmQgYSBmaXhlZCBheGlzLlxuICogVGhlIGxhdGhpbmcgbWF5IGJlIHBhcnRpYWw7IHRoZSBhbW91bnQgb2Ygcm90YXRpb24gaXMgbm90IG5lY2Vzc2FyaWx5IGEgZnVsbCAzNjAgZGVncmVlcy5cbiAqIFRoZSBwb2ludCBzZXQgcHJvdmlkaW5nIHRoZSBpbml0aWFsIHNvdXJjZSBkYXRhIGNhbiBiZSB0aG91Z2h0IG9mIGFzIGEgY3Jvc3Mgc2VjdGlvbiB0aHJvdWdoIHRoZSBvYmplY3QgYWxvbmcgYSBwbGFuZSBjb250YWluaW5nIGl0cyBheGlzIG9mIHJhZGlhbCBzeW1tZXRyeS4gPGJyLz48YnIvPlxuICogVGhlIDxhIGhyZWY9J2h0dHA6Ly90aHJlZWpzLm9yZy9kb2NzL3NjZW5lcy9nZW9tZXRyeS1icm93c2VyLmh0bWwjTGF0aGVHZW9tZXRyeSc+Zm9sbG93aW5nIGV4YW1wbGU8L2E+IHNob3dzIGEgZ2VvbWV0cnkgd2hpY2ggY2FuIGJlIGdlbmVyYXRlZCB1c2luZyBgTGF0aGVgIGNsYXNzLlxuICogQGNsYXNzRGVzY1xuICogPGlmcmFtZSBzcmM9XCJodHRwczovL3RocmVlanMub3JnL2RvY3Mvc2NlbmVzL2dlb21ldHJ5LWJyb3dzZXIuaHRtbCNMYXRoZUdlb21ldHJ5XCI+PC9pZnJhbWU+XG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtc10gLSBUaGUgcGFyYW1zLlxuICogQGV4dGVuZHMgbW9kdWxlOmNvcmUuTWVzaENvbXBvbmVudFxuICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL21lc2hlc1xuICogQGV4YW1wbGUgPGNhcHRpb24+Q3JlYXRpbmcgYSBMYXRoLCBhbmQgYWRkaW5nIHRvIGFwcDwvY2FwdGlvbj5cbiAqIGNvbnN0IHBvaW50cyA9IFtdO1xuICpcbiAqIGZvciAobGV0IGkgPSAwOyBpIDwgMTA7IGkrKykge1xuICogICBwb2ludHMucHVzaChcbiAqICAgICBuZXcgVEhSRUUuVmVjdG9yMihcbiAqICAgICAgIChNYXRoLnNpbihpICogMC43KSAqIDE1ICsgNTApIC8gMTAsXG4gKiAgICAgICAoaSAtIDUpICogMC4yXG4gKiAgICAgKVxuICogICApO1xuICogfVxuICpcbiAqIGNvbnN0IGxhdGhlID0gbmV3IExhdGhlKHtcbiAqICAgZ2VvbWV0cnk6IHtcbiAqICAgICBwb2ludHM6IHBvaW50c1xuICogICB9LFxuICpcbiAqICAgbWF0ZXJpYWw6IG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCh7XG4gKiAgICAgY29sb3I6IDB4ZmZmZmZmXG4gKiAgIH0pLFxuICpcbiAqICAgcG9zaXRpb246IFswLCA1MCwgMTBdXG4gKiB9KS5hZGRUbyhhcHApO1xuICovXG5cbnZhciBMYXRoZSA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX01lc2hDb21wb25lbnQpIHtcbiAgLyoqXG4gICAqIERlZmF1bHQgdmFsdWVzIGZvciBwYXJhbWV0ZXJzXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLkxhdGhlI2RlZmF1bHRzXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHQgPHByZT5cbiAgICoge1xuICAgKiAgIGdlb21ldHJ5OiB7XG4gICAqICAgICBwb2ludHM6IFtdXG4gICAqICAgfVxuICAgKiB9XG4gICAqIDwvcHJlPlxuICAgKi9cblxuICAvKipcbiAgICogSW5zdHJ1Y3Rpb25zXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLkxhdGhlI2luc3RydWN0aW9uc1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IDxwcmU+e1xuICAgKiAgIGdlb21ldHJ5OiBbJ3BvaW50cyddXG4gICAqIH1cbiAgICogPC9wcmU+XG4gICAqL1xuICBmdW5jdGlvbiBMYXRoZSgpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIExhdGhlKTtcblxuICAgIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBnZXRQcm90b3R5cGVPZiQyKExhdGhlKS5jYWxsKHRoaXMsIHBhcmFtcywgTGF0aGUuZGVmYXVsdHMsIExhdGhlLmluc3RydWN0aW9ucykpO1xuXG4gICAgaWYgKHBhcmFtcy5idWlsZCkge1xuICAgICAgX3RoaXMuYnVpbGQocGFyYW1zKTtcblxuICAgICAgZ2V0JDMoZ2V0UHJvdG90eXBlT2YkMihMYXRoZS5wcm90b3R5cGUpLCBcIndyYXBcIiwgYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSkuY2FsbChhc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgLyoqXG4gICAqIEBtZXRob2QgYnVpbGRcbiAgICogQGRlc2NyaXB0aW9uIEJ1aWxkIGxpZmVjeWNsZSBjcmVhdGVzIGEgbWVzaCB1c2luZyBpbnB1dCBwYXJhbXMuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgQ29tcG9uZW50IHBhcmFtZXRlcnMuXG4gICAqIEByZXR1cm4ge1RIUkVFLk1lc2h9IEJ1aWx0IG1lc2hcbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5MYXRoZVxuICAgKi9cblxuXG4gIGNyZWF0ZUNsYXNzKExhdGhlLCBbe1xuICAgIGtleTogXCJidWlsZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBidWlsZCgpIHtcbiAgICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHRoaXMucGFyYW1zO1xuXG4gICAgICB2YXIgX3RoaXMkYXBwbHlCcmlkZ2UgPSB0aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgICAgZ2VvbWV0cnk6IHRoaXMuYnVpbGRHZW9tZXRyeShwYXJhbXMpLFxuICAgICAgICBtYXRlcmlhbDogcGFyYW1zLm1hdGVyaWFsXG4gICAgICB9KSxcbiAgICAgICAgICBnZW9tZXRyeSA9IF90aGlzJGFwcGx5QnJpZGdlLmdlb21ldHJ5LFxuICAgICAgICAgIG1hdGVyaWFsID0gX3RoaXMkYXBwbHlCcmlkZ2UubWF0ZXJpYWw7XG5cbiAgICAgIHJldHVybiB0aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgICAgbWVzaDogbmV3IE1lc2goZ2VvbWV0cnksIG1hdGVyaWFsKVxuICAgICAgfSkubWVzaDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYnVpbGRHZW9tZXRyeVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBidWlsZEdlb21ldHJ5KCkge1xuICAgICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgICByZXR1cm4gbmV3IChwYXJhbXMuYnVmZmVyID8gTGF0aGVCdWZmZXJHZW9tZXRyeSA6IExhdGhlR2VvbWV0cnkpKHBhcmFtcy5nZW9tZXRyeS5wb2ludHMpO1xuICAgIH1cbiAgfV0pO1xuXG4gIGluaGVyaXRzKExhdGhlLCBfTWVzaENvbXBvbmVudCk7XG5cbiAgcmV0dXJuIExhdGhlO1xufShNZXNoQ29tcG9uZW50KTtcblxuZGVmaW5lUHJvcGVydHkkMyhkZWZpbmVQcm9wZXJ0eSQzKExhdGhlLCBcImRlZmF1bHRzXCIsIG9iamVjdFNwcmVhZCh7fSwgTWVzaENvbXBvbmVudC5kZWZhdWx0cywge1xuICBnZW9tZXRyeToge1xuICAgIHBvaW50czogW11cbiAgfVxufSkpLCBcImluc3RydWN0aW9uc1wiLCBvYmplY3RTcHJlYWQoe30sIE1lc2hDb21wb25lbnQuaW5zdHJ1Y3Rpb25zLCB7XG4gIGdlb21ldHJ5OiBbJ3BvaW50cyddXG59KSk7XG5cbi8qKlxuICogQGNsYXNzIExpbmVcbiAqIEBjYXRlZ29yeSBjb21wb25lbnRzL21lc2hlc1xuICogQGRlc2NyaXB0aW9uIExpbmUgY29tcG9uZW50IGlzIGdlbmVyYXRlZCBmcm9tIGEgY3VydmUvbGluZSBhbmQgYW1vdW50IG9mIHZlY3RvcnMgdGhhdCBzaG91bGQgYmUgdXNlZCAocG9pbnRzKS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zXSAtIFRoZSBwYXJhbXMuXG4gKiBAZXh0ZW5kcyBtb2R1bGU6Y29yZS5NZXNoQ29tcG9uZW50XG4gKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5DcmVhdGluZyBhIExpbmUsIGFuZCBhZGRpbmcgdG8gYXBwPC9jYXB0aW9uPlxuICogbmV3IExpbmUoe1xuICogICBnZW9tZXRyeToge1xuICogICAgIGN1cnZlOiBuZXcgVEhSRUUuTGluZUN1cnZlMyhuZXcgVEhSRUUuVmVjdG9yMygxMCwgMTAsIDApLCBuZXcgVEhSRUUuVmVjdG9yMygxMCwgMzAsIDApKVxuICogICB9LFxuICpcbiAqICAgbWF0ZXJpYWw6IG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCh7XG4gKiAgICAgY29sb3I6IDB4ZmZmZmZmXG4gKiAgIH0pXG4gKiB9KS5hZGRUbyhhcHApO1xuICovXG5cbnZhciBMaW5lJDEgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9NZXNoQ29tcG9uZW50KSB7XG4gIC8qKlxuICAgKiBEZWZhdWx0IHZhbHVlcyBmb3IgcGFyYW1ldGVyc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5MaW5lI2RlZmF1bHRzXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHQgPHByZT5cbiAgICoge1xuICAgKiAgIGN1cnZlOiBuZXcgTGluZUN1cnZlMyhuZXcgVmVjdG9yMygwLCAwLCAwKSwgbmV3IFZlY3RvcjMoMTAsIDAsIDApKSxcbiAgICogICBwb2ludHM6IDUwXG4gICAqIH1cbiAgICogPC9wcmU+XG4gICAqL1xuXG4gIC8qKlxuICAgKiBJbnN0cnVjdGlvbnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuTGluZSNpbnN0cnVjdGlvbnNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdCA8cHJlPntcbiAgICogICBnZW9tZXRyeTogWydjdXJ2ZScsICdwb2ludHMnXVxuICAgKiB9XG4gICAqIDwvcHJlPlxuICAgKi9cbiAgZnVuY3Rpb24gTGluZSQkMShwYXJhbXMpIHtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBMaW5lJCQxKTtcblxuICAgIHJldHVybiBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIGdldFByb3RvdHlwZU9mJDIoTGluZSQkMSkuY2FsbCh0aGlzLCBwYXJhbXMsIExpbmUkJDEuZGVmYXVsdHMsIExpbmUkJDEuaW5zdHJ1Y3Rpb25zKSk7XG4gIH1cbiAgLyoqXG4gICAqIEBtZXRob2QgYnVpbGRcbiAgICogQGRlc2NyaXB0aW9uIEJ1aWxkIGxpZmVjeWNsZSBjcmVhdGVzIGEgbWVzaCB1c2luZyBpbnB1dCBwYXJhbXMuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgQ29tcG9uZW50IHBhcmFtZXRlcnMuXG4gICAqIEByZXR1cm4ge1RIUkVFLk1lc2h9IEJ1aWx0IG1lc2hcbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5MaW5lXG4gICAqL1xuXG5cbiAgY3JlYXRlQ2xhc3MoTGluZSQkMSwgW3tcbiAgICBrZXk6IFwiYnVpbGRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYnVpbGQoKSB7XG4gICAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB0aGlzLnBhcmFtcztcblxuICAgICAgdmFyIF90aGlzJGFwcGx5QnJpZGdlID0gdGhpcy5hcHBseUJyaWRnZSh7XG4gICAgICAgIGdlb21ldHJ5OiB0aGlzLmJ1aWxkR2VvbWV0cnkocGFyYW1zKSxcbiAgICAgICAgbWF0ZXJpYWw6IHBhcmFtcy5tYXRlcmlhbFxuICAgICAgfSksXG4gICAgICAgICAgZ2VvbWV0cnkgPSBfdGhpcyRhcHBseUJyaWRnZS5nZW9tZXRyeSxcbiAgICAgICAgICBtYXRlcmlhbCA9IF90aGlzJGFwcGx5QnJpZGdlLm1hdGVyaWFsO1xuXG4gICAgICByZXR1cm4gdGhpcy5hcHBseUJyaWRnZSh7XG4gICAgICAgIG1lc2g6IG5ldyBMaW5lKGdlb21ldHJ5LCBtYXRlcmlhbClcbiAgICAgIH0pLm1lc2g7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImJ1aWxkR2VvbWV0cnlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYnVpbGRHZW9tZXRyeSgpIHtcbiAgICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgICAgdmFyIGdlb21ldHJ5ID0gcGFyYW1zLmJ1ZmZlciA/IG5ldyBCdWZmZXJHZW9tZXRyeSgpIDogbmV3IEdlb21ldHJ5KCk7XG5cbiAgICAgIGlmIChwYXJhbXMuYnVmZmVyKSB7XG4gICAgICAgIHZhciBwcCA9IHBhcmFtcy5jdXJ2ZS5nZXRQb2ludHMocGFyYW1zLnBvaW50cyk7XG4gICAgICAgIHZhciB2ZXJ0cyA9IG5ldyBGbG9hdDMyQXJyYXkocHAubGVuZ3RoICogMyk7XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIG1heCA9IHBwLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7XG4gICAgICAgICAgdmFyIGkzID0gaSAqIDM7XG4gICAgICAgICAgdmVydHNbaTNdID0gcHBbaV0ueDtcbiAgICAgICAgICB2ZXJ0c1tpMyArIDFdID0gcHBbaV0ueTtcbiAgICAgICAgICB2ZXJ0c1tpMyArIDJdID0gcHBbaV0uejtcbiAgICAgICAgfVxuXG4gICAgICAgIGdlb21ldHJ5LmFkZEF0dHJpYnV0ZSgncG9zaXRpb24nLCBuZXcgQnVmZmVyQXR0cmlidXRlKHZlcnRzLCAzKSk7XG4gICAgICB9IGVsc2UgZ2VvbWV0cnkudmVydGljZXMgPSBwYXJhbXMuY3VydmUuZ2V0UG9pbnRzKHBhcmFtcy5wb2ludHMpO1xuXG4gICAgICByZXR1cm4gZ2VvbWV0cnk7XG4gICAgfVxuICB9XSk7XG5cbiAgaW5oZXJpdHMoTGluZSQkMSwgX01lc2hDb21wb25lbnQpO1xuXG4gIHJldHVybiBMaW5lJCQxO1xufShNZXNoQ29tcG9uZW50KTtcblxuZGVmaW5lUHJvcGVydHkkMyhkZWZpbmVQcm9wZXJ0eSQzKExpbmUkMSwgXCJkZWZhdWx0c1wiLCBvYmplY3RTcHJlYWQoe30sIE1lc2hDb21wb25lbnQuZGVmYXVsdHMsIHtcbiAgY3VydmU6IG51bGwsXG4gIHBvaW50czogNTBcbn0pKSwgXCJpbnN0cnVjdGlvbnNcIiwgb2JqZWN0U3ByZWFkKHt9LCBNZXNoQ29tcG9uZW50Lmluc3RydWN0aW9ucywge1xuICBnZW9tZXRyeTogWydjdXJ2ZScsICdwb2ludHMnXVxufSkpO1xuXG4vKipcbiAqIEBjbGFzcyBJbXBvcnRlclxuICogQGNhdGVnb3J5IGNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZGVzY3JpcHRpb24gSW1wb3J0ZXIgaXMgYSBsb2FkZXIgZm9yIG1lc2hlcyBhbmQgYW55IG90aGVyIGRhdGEgdG8geW91ciBzY2VuZVxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXNdIC0gVGhlIHBhcmFtcy5cbiAqIEBleHRlbmRzIG1vZHVsZTpjb3JlLk1lc2hDb21wb25lbnRcbiAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXNcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkNyZWF0aW5nIGEgSW1wb3J0ZXIsIGFuZCBhZGRpbmcgdG8gYXBwPC9jYXB0aW9uPlxuICogbmV3IEltcG9ydGVyKHtcbiAqICAgbG9hZGVyOiBuZXcgVEhSRUUuT0JKTG9hZGVyKCksXG4gKlxuICogICBwYXJzZXIoZ2VvbWV0cnksIG1hdGVyaWFsKSB7IC8vIGRhdGEgZnJvbSBsb2FkZXJcbiAqICAgICByZXR1cm4gbmV3IFRIUkVFLk1lc2goZ2VvbWV0cnksIG1hdGVyaWFsKTsgLy8gc2hvdWxkIHJldHVybiB5b3VyIC5uYXRpdmUgKG1lc2ggaW4gdGhpcyBjYXNlKVxuICogICB9LFxuICpcbiAqICAgcG9zaXRpb246IFswLCAxMDAsIDBdXG4gKiB9KS5hZGRUbyhhcHApO1xuICovXG5cbnZhciBJbXBvcnRlciA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX01lc2hDb21wb25lbnQpIHtcbiAgY3JlYXRlQ2xhc3MoSW1wb3J0ZXIsIG51bGwsIFt7XG4gICAga2V5OiBcImZpbHRlclwiLFxuXG4gICAgLyoqXG4gICAgICogRGVmYXVsdCB2YWx1ZXMgZm9yIHBhcmFtZXRlcnNcbiAgICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5JbXBvcnRlciNkZWZhdWx0c1xuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAZGVmYXVsdCA8cHJlPlxuICAgICAqIHtcbiAgICAgKiAgIHVybDogJycsXG4gICAgICogICBsb2FkZXI6IG5ldyBKU09OTG9hZGVyKCksXG4gICAgICpcbiAgICAgKiAgIG9uTG9hZCgpIHt9LFxuICAgICAqICAgb25Qcm9ncmVzcygpIHt9LFxuICAgICAqICAgb25FcnJvcigpIHt9LFxuICAgICAqXG4gICAgICogICB0ZXh0dXJlUGF0aDogbnVsbCxcbiAgICAgKiAgIHVzZUN1c3RvbU1hdGVyaWFsOiBmYWxzZSxcbiAgICAgKlxuICAgICAqICAgcGFyc2VyKGdlb21ldHJ5LCBtYXRlcmlhbHMpIHtcbiAgICAgKiAgICAgcmV0dXJuIG5ldyBNZXNoKGdlb21ldHJ5LCBtYXRlcmlhbHMpO1xuICAgICAqICAgfVxuICAgICAqIH08L3ByZT5cbiAgICAgKi9cblxuICAgIC8qKlxuICAgICAqIEBtZXRob2QgZmlsdGVyXG4gICAgICogQGRlc2NyaXB0aW9uIERlZmF1bHQgdmFsdWVzIGZvciBmaWx0ZXJcbiAgICAgKiBAc3RhdGljXG4gICAgICogQHBhcmFtIHtUSFJFRS5NZXNofSBvYmplY3QgSW5zdGFuY2UgZm9yIGl0ZXJhdGluZyB0aHJvdWdoIGl0J3MgY2hpbGRyZW4uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZmlsdGVyIEZ1bmN0aW9uIHdpdGggY2hpbGQgYXMgYXJndW1lbnQsIHNob3VsZCByZXR1cm4gYSBib29sZWFuIHdoZXRoZXIgaW5jbHVkZSB0aGUgY2hpbGQgb3Igbm90LlxuICAgICAqIEByZXR1cm4ge1RIUkVFLk1lc2h9IG9iamVjdCB3aXRoIGNoaWxkcmVuXG4gICAgICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5JbXBvcnRlclxuICAgICAqIEBleGFtcGxlIDxjYXB0aW9uPlJlbW92aW5nIHVubmVjZXNzYXJ5IGxpZ2h0cyBmcm9tIGNoaWxkcmVuPC9jYXB0aW9uPlxuICAgICAqIG5ldyBJbXBvcnRlcih7XG4gICAgICogICBsb2FkZXI6IG5ldyBUSFJFRS5PQkpMb2FkZXIoKSxcbiAgICAgKlxuICAgICAqICAgcGFyc2UoZ3JvdXApIHsgLy8gZGF0YSBmcm9tIGxvYWRlclxuICAgICAqICAgICByZXR1cm4gSW1wb3J0ZXIuZmlsdGVyKGdyb3VwLCBjaGlsZCA9PiAhY2hpbGQuaXNMaWdodCk7IC8vIHJlbW92ZSBsaWdodHNcbiAgICAgKiAgIH0sXG4gICAgICpcbiAgICAgKiAgIHBvc2l0aW9uOiBbMCwgMTAwLCAwXVxuICAgICAqIH0pLmFkZFRvKGFwcCk7XG4gICAgICovXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGZpbHRlcihvYmplY3QsIF9maWx0ZXIpIHtcbiAgICAgIHZhciBwcm9jZXNzRmlsdGVyID0gZnVuY3Rpb24gcHJvY2Vzc0ZpbHRlcihvYmplY3QpIHtcbiAgICAgICAgb2JqZWN0LmNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24gKGVsLCBpbmRleCkge1xuICAgICAgICAgIGlmIChlbC5jaGlsZHJlbikgcHJvY2Vzc0ZpbHRlcihlbCk7XG4gICAgICAgICAgaWYgKCFfZmlsdGVyKGVsKSkgb2JqZWN0LmNoaWxkcmVuLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gb2JqZWN0O1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuIHByb2Nlc3NGaWx0ZXIob2JqZWN0KTtcbiAgICB9XG4gIH1dKTtcblxuICBmdW5jdGlvbiBJbXBvcnRlcigpIHtcbiAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIEltcG9ydGVyKTtcblxuICAgIHJldHVybiBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIGdldFByb3RvdHlwZU9mJDIoSW1wb3J0ZXIpLmNhbGwodGhpcywgcGFyYW1zLCBJbXBvcnRlci5kZWZhdWx0cywgSW1wb3J0ZXIuaW5zdHJ1Y3Rpb25zLCBmYWxzZSkpO1xuICB9XG4gIC8qKlxuICAgKiBAbWV0aG9kIGJ1aWxkXG4gICAqIEBkZXNjcmlwdGlvbiBCdWlsZCBsaWZlY3ljbGUgY3JlYXRlcyBhIG1lc2ggdXNpbmcgaW5wdXQgcGFyYW1zLlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIENvbXBvbmVudCBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJuIHtUSFJFRS5NZXNofSBCdWlsdCBtZXNoXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuSW1wb3J0ZXJcbiAgICovXG5cblxuICBjcmVhdGVDbGFzcyhJbXBvcnRlciwgW3tcbiAgICBrZXk6IFwiYnVpbGRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYnVpbGQoKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgICBpZiAocGFyYW1zLnRleHR1cmVQYXRoKSBwYXJhbXMubG9hZGVyLnNldFRleHR1cmVQYXRoKHBhcmFtcy50ZXh0dXJlUGF0aCk7XG4gICAgICAgIHBhcmFtcy5sb2FkZXIubG9hZChwYXJhbXMudXJsLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGRhdGEgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICAgICAgICBkYXRhW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIGdlb21ldHJ5LCBtYXRlcmlhbHNcbiAgICAgICAgICBwYXJhbXMub25Mb2FkLmFwcGx5KHBhcmFtcywgZGF0YSk7XG4gICAgICAgICAgdmFyIG9iamVjdCA9IHBhcmFtcy5wYXJzZXIuYXBwbHkoX3RoaXMsIGRhdGEpO1xuICAgICAgICAgIGlmIChwYXJhbXMubWF0ZXJpYWwpIG9iamVjdC5tYXRlcmlhbCA9IF90aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgICAgICAgIG1hdGVyaWFsOiBwYXJhbXMubWF0ZXJpYWxcbiAgICAgICAgICB9KS5tYXRlcmlhbDtcbiAgICAgICAgICByZXNvbHZlKG9iamVjdCk7XG4gICAgICAgIH0sIHBhcmFtcy5vblByb2dyZXNzLCBwYXJhbXMub25FcnJvcik7XG4gICAgICB9KTtcbiAgICB9XG4gIH1dKTtcblxuICBpbmhlcml0cyhJbXBvcnRlciwgX01lc2hDb21wb25lbnQpO1xuXG4gIHJldHVybiBJbXBvcnRlcjtcbn0oTWVzaENvbXBvbmVudCk7XG5cbmRlZmluZVByb3BlcnR5JDMoZGVmaW5lUHJvcGVydHkkMyhJbXBvcnRlciwgXCJkZWZhdWx0c1wiLCBvYmplY3RTcHJlYWQoe30sIE1lc2hDb21wb25lbnQuZGVmYXVsdHMsIHtcbiAgdXJsOiAnJyxcbiAgbG9hZGVyOiBuZXcgSlNPTkxvYWRlcigpLFxuICBvbkxvYWQ6IGZ1bmN0aW9uIG9uTG9hZCgpIHt9LFxuICBvblByb2dyZXNzOiBmdW5jdGlvbiBvblByb2dyZXNzKCkge30sXG4gIC8vIFRPRE8gYWRkIG9uQ29tcGxldGU/XG4gIG9uRXJyb3I6IGZ1bmN0aW9uIG9uRXJyb3IoKSB7fSxcbiAgdGV4dHVyZVBhdGg6IG51bGwsXG4gIHVzZUN1c3RvbU1hdGVyaWFsOiBmYWxzZSxcbiAgcGFyc2VyOiBmdW5jdGlvbiBwYXJzZXIoZ2VvbWV0cnksIG1hdGVyaWFsKSB7XG4gICAgdmFyIF90aGlzJGFwcGx5QnJpZGdlID0gdGhpcy5hcHBseUJyaWRnZSh7XG4gICAgICBnZW9tZXRyeTogZ2VvbWV0cnksXG4gICAgICBtYXRlcmlhbDogbWF0ZXJpYWxcbiAgICB9KSxcbiAgICAgICAgZ2VvbSA9IF90aGlzJGFwcGx5QnJpZGdlLmdlb21ldHJ5LFxuICAgICAgICBtYXQgPSBfdGhpcyRhcHBseUJyaWRnZS5tYXRlcmlhbDtcblxuICAgIHJldHVybiB0aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgIG1lc2g6IGdlb20uYm9uZXMgPyBuZXcgU2tpbm5lZE1lc2goZ2VvbSwgbWF0KSA6IG5ldyBNZXNoKGdlb20sIG1hdClcbiAgICB9KS5tZXNoO1xuICB9XG59KSksIFwiaW5zdHJ1Y3Rpb25zXCIsIG9iamVjdFNwcmVhZCh7fSwgTWVzaENvbXBvbmVudC5pbnN0cnVjdGlvbnMpKTtcblxuLyoqXG4gKiBAY2xhc3MgT2N0YWhlZHJvblxuICogQGNhdGVnb3J5IGNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZGVzY3JpcHRpb24gSW4gZ2VvbWV0cnksIGFuIG9jdGFoZWRyb24gaXMgYSBwb2x5aGVkcm9uIHdpdGggZWlnaHQgZmFjZXMuXG4gKiBBIHJlZ3VsYXIgb2N0YWhlZHJvbiBpcyBhIFBsYXRvbmljIHNvbGlkIGNvbXBvc2VkIG9mIGVpZ2h0IGVxdWlsYXRlcmFsIHRyaWFuZ2xlcywgZm91ciBvZiB3aGljaCBtZWV0IGF0IGVhY2ggdmVydGV4LlxuICogPGJyLz48YnIvPlxuICogYE9jdGFoZWRyb25gIGNyZWF0ZXMgYW4gT2N0YWhlZHJvbiBvYmplY3QgYnkgaXRzIGByYWRpdXNgIGFuZCBgZGV0YWlsYC5cbiAqIEBjbGFzc0Rlc2NcbiAqIDxpZnJhbWUgc3JjPVwiaHR0cHM6Ly90aHJlZWpzLm9yZy9kb2NzL3NjZW5lcy9nZW9tZXRyeS1icm93c2VyLmh0bWwjT2N0YWhlZHJvbkdlb21ldHJ5XCI+PC9pZnJhbWU+XG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtc10gLSBUaGUgcGFyYW1zLlxuICogQGV4dGVuZHMgbW9kdWxlOmNvcmUuTWVzaENvbXBvbmVudFxuICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL21lc2hlc1xuICogQGV4YW1wbGUgPGNhcHRpb24+Q3JlYXRpbmcgYW4gT2N0YWhlZHJvbiwgYW5kIGFkZGluZyB0byBhcHA8L2NhcHRpb24+XG4gKiBuZXcgT2N0YWhlZHJvbih7XG4gKiAgIGdlb21ldHJ5OiB7XG4gKiAgICAgcmFkaXVzOiAyLFxuICogICAgIGRldGFpbDogMVxuICogICB9LFxuICpcbiAqICAgbWF0ZXJpYWw6IG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCh7XG4gKiAgICAgY29sb3I6IDB4ZmZmZmZmXG4gKiAgIH0pLFxuICpcbiAqICAgcG9zaXRpb246IFswLCAxMDAsIDBdXG4gKiB9KS5hZGRUbyhhcHApO1xuICovXG5cbnZhciBPY3RhaGVkcm9uID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfTWVzaENvbXBvbmVudCkge1xuICAvKipcbiAgICogRGVmYXVsdCB2YWx1ZXMgZm9yIHBhcmFtZXRlcnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuT2N0YWhlZHJvbiNkZWZhdWx0c1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IDxwcmU+XG4gICAqIHtcbiAgICogICBnZW9tZXRyeToge1xuICAgKiAgICAgcmFkaXVzOiAxLFxuICAgKiAgICAgZGV0YWlsOiAwXG4gICAqICAgfVxuICAgKiB9XG4gICAqIDwvcHJlPlxuICAgKi9cbiAgZnVuY3Rpb24gT2N0YWhlZHJvbigpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIE9jdGFoZWRyb24pO1xuXG4gICAgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIGdldFByb3RvdHlwZU9mJDIoT2N0YWhlZHJvbikuY2FsbCh0aGlzLCBwYXJhbXMsIE9jdGFoZWRyb24uZGVmYXVsdHMsIE9jdGFoZWRyb24uaW5zdHJ1Y3Rpb25zKSk7XG5cbiAgICBpZiAocGFyYW1zLmJ1aWxkKSB7XG4gICAgICBfdGhpcy5idWlsZChwYXJhbXMpO1xuXG4gICAgICBnZXQkMyhnZXRQcm90b3R5cGVPZiQyKE9jdGFoZWRyb24ucHJvdG90eXBlKSwgXCJ3cmFwXCIsIGFzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcykpLmNhbGwoYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG4gIC8qKlxuICAgKiBAbWV0aG9kIGJ1aWxkXG4gICAqIEBkZXNjcmlwdGlvbiBCdWlsZCBsaWZlY3ljbGUgY3JlYXRlcyBhIG1lc2ggdXNpbmcgaW5wdXQgcGFyYW1zLlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIENvbXBvbmVudCBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJuIHtUSFJFRS5NZXNofSBCdWlsdCBtZXNoXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuT2N0YWhlZHJvblxuICAgKi9cblxuXG4gIGNyZWF0ZUNsYXNzKE9jdGFoZWRyb24sIFt7XG4gICAga2V5OiBcImJ1aWxkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGJ1aWxkKCkge1xuICAgICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogdGhpcy5wYXJhbXM7XG5cbiAgICAgIHZhciBfdGhpcyRhcHBseUJyaWRnZSA9IHRoaXMuYXBwbHlCcmlkZ2Uoe1xuICAgICAgICBnZW9tZXRyeTogdGhpcy5idWlsZEdlb21ldHJ5KHBhcmFtcyksXG4gICAgICAgIG1hdGVyaWFsOiBwYXJhbXMubWF0ZXJpYWxcbiAgICAgIH0pLFxuICAgICAgICAgIGdlb21ldHJ5ID0gX3RoaXMkYXBwbHlCcmlkZ2UuZ2VvbWV0cnksXG4gICAgICAgICAgbWF0ZXJpYWwgPSBfdGhpcyRhcHBseUJyaWRnZS5tYXRlcmlhbDtcblxuICAgICAgcmV0dXJuIHRoaXMuYXBwbHlCcmlkZ2Uoe1xuICAgICAgICBtZXNoOiBuZXcgTWVzaChnZW9tZXRyeSwgbWF0ZXJpYWwpXG4gICAgICB9KS5tZXNoO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJidWlsZEdlb21ldHJ5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGJ1aWxkR2VvbWV0cnkoKSB7XG4gICAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgICAgIHJldHVybiBuZXcgKHBhcmFtcy5idWZmZXIgPyBPY3RhaGVkcm9uQnVmZmVyR2VvbWV0cnkgOiBPY3RhaGVkcm9uR2VvbWV0cnkpKHBhcmFtcy5nZW9tZXRyeS5yYWRpdXMsIHBhcmFtcy5nZW9tZXRyeS5kZXRhaWwpO1xuICAgIH1cbiAgfV0pO1xuXG4gIGluaGVyaXRzKE9jdGFoZWRyb24sIF9NZXNoQ29tcG9uZW50KTtcblxuICByZXR1cm4gT2N0YWhlZHJvbjtcbn0oTWVzaENvbXBvbmVudCk7XG5cbmRlZmluZVByb3BlcnR5JDMoT2N0YWhlZHJvbiwgXCJkZWZhdWx0c1wiLCBvYmplY3RTcHJlYWQoe30sIE1lc2hDb21wb25lbnQuZGVmYXVsdHMsIHtcbiAgZ2VvbWV0cnk6IHtcbiAgICByYWRpdXM6IDEsXG4gICAgZGV0YWlsOiAwXG4gIH1cbn0pKTtcblxuLyoqXG4gKiBAY2xhc3MgUGFyYW1ldHJpY1xuICogQGNhdGVnb3J5IGNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZGVzY3JpcHRpb24gYFBhcmFtZXRyaWNgIGdlbmVyYXRlcyBhIGdlb21ldHJ5IHJlcHJlc2VudGluZyBhIDxhIGhyZWY9J2h0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1BhcmFtZXRyaWNfc3VyZmFjZSc+UGFyYW1ldHJpYyBzdXJmYWNlPC9hPlxuICogPGJyLz48YnIvPlxuICogSXQgaXMgdXN1YWxseSB1c2VkIHRvIGRldmVsb3AgZGlmZmVyZW50IGtpbmRzIG9mIGhpZ2hmaWVsZHMgb3IgdmlzdWFsaXplIGEgPGEgaHJlZj0naHR0cHM6Ly9zdGVta29za2kuZ2l0aHViLmlvL1RocmVlLmpzL0dyYXBodWx1cy1GdW5jdGlvbi5odG1sJz5tYXRoIGZ1bmN0aW9uPC9hPi5cbiAqIDxici8+XG4gKiAtIDxhIGhyZWY9J2h0dHA6Ly9tYXRoLmh3cy5lZHUvZ3JhcGhpY3Nib29rL3NvdXJjZS90aHJlZWpzL2N1cnZlcy1hbmQtc3VyZmFjZXMuaHRtbCc+UGFyYW1ldHJpYyBzdXJmYWNlPC9hPlxuICogLSA8YSBocmVmPSdodHRwczovL3N0ZW1rb3NraS5naXRodWIuaW8vVGhyZWUuanMvR3JhcGh1bHVzLVN1cmZhY2UuaHRtbCc+XCJHcmFwaHVsdXNcIjwvYT5cbiAqIDxici8+PGJyLz5cbiAqIEBjbGFzc0Rlc2NcbiAqIDxpZnJhbWUgc3JjPVwiaHR0cHM6Ly90aHJlZWpzLm9yZy9kb2NzL3NjZW5lcy9nZW9tZXRyeS1icm93c2VyLmh0bWwjUGFyYW1ldHJpY0dlb21ldHJ5XCI+PC9pZnJhbWU+XG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtc10gLSBUaGUgcGFyYW1zLlxuICogQGV4dGVuZHMgbW9kdWxlOmNvcmUuTWVzaENvbXBvbmVudFxuICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL21lc2hlc1xuICogQGV4YW1wbGUgPGNhcHRpb24+RXhhbXBsZSBjcmVhdGluZyBhbiBoZWlnaHRmaWVsZC1saWtlIGdlb21ldHJ5LiBgdWAgYW5kIGB2YCBhcmUgbGlrZSBgeGAgYW5kIGB5YCBpbiBzaGFwZSwgYnV0IHRoZWlyIHZhbHVlcyBhcmUgYWx3YXlzIGZyb20gYDBgIHRvIGAxYC5cbiAqIFdlIHVzZSB0aGVtIGluIGBUSFJFRS5WZWN0b3IzYCBsaWtlIGB4YCBhbmQgYHpgIGFuZCBgTWF0aC5yYW5kb20oKSAqIDVgIGZvciBgeWAuPC9jYXB0aW9uPlxuICogY29uc3QgY3JlYXRlUGFyYW1ldHJpYyA9ICh1LCB2KSA9PiB7XG4gKiAgIHJldHVybiBuZXcgVEhSRUUuVmVjdG9yMyh1ICogMzAsIE1hdGgucmFuZG9tKCkgKiA1LCB2ICogMzApO1xuICogfVxuICpcbiAqIG5ldyBQYXJhbWV0cmljKHtcbiAqICAgZ2VvbWV0cnk6IHtcbiAqICAgICBmdW5jOiBjcmVhdGVQYXJhbWV0cmljXG4gKiAgIH0sXG4gKlxuICogICBtYXRlcmlhbDogbmV3IFRIUkVFLk1lc2hMYW1iZXJ0TWF0ZXJpYWwoe1xuICogICAgIGNvbG9yOiAweGZmZmZmZixcbiAqICAgICBzaWRlOiBUSFJFRS5Eb3VibGVTaWRlXG4gKiAgIH0pLFxuICpcbiAqICAgcG9zaXRpb246IFswLCAxMDAsIC0xMDBdXG4gKiB9KS5hZGRUbyhhcHApO1xuICovXG5cbnZhciBQYXJhbWV0cmljID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfTWVzaENvbXBvbmVudCkge1xuICAvKipcbiAgICogRGVmYXVsdCB2YWx1ZXMgZm9yIHBhcmFtZXRlcnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuUGFyYW1ldHJpYyNkZWZhdWx0c1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IDxwcmU+XG4gICAqIHtcbiAgICogICBnZW9tZXRyeToge1xuICAgKiAgICAgZnVuYzogKHUsIHYpID0+IG5ldyBWZWN0b3IzKHUsIHYsIDApLFxuICAgKiAgICAgc2xpY2VzOiAxMCxcbiAgICogICAgIHRhY2tzOiAxMFxuICAgKiAgIH1cbiAgICogfVxuICAgKiA8L3ByZT5cbiAgICovXG4gIGZ1bmN0aW9uIFBhcmFtZXRyaWMoKSB7XG4gICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBQYXJhbWV0cmljKTtcblxuICAgIHJldHVybiBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIGdldFByb3RvdHlwZU9mJDIoUGFyYW1ldHJpYykuY2FsbCh0aGlzLCBwYXJhbXMsIFBhcmFtZXRyaWMuZGVmYXVsdHMsIFBhcmFtZXRyaWMuaW5zdHJ1Y3Rpb25zKSk7XG4gIH1cbiAgLyoqXG4gICAqIEBtZXRob2QgYnVpbGRcbiAgICogQGRlc2NyaXB0aW9uIEJ1aWxkIGxpZmVjeWNsZSBjcmVhdGVzIGEgbWVzaCB1c2luZyBpbnB1dCBwYXJhbXMuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgQ29tcG9uZW50IHBhcmFtZXRlcnMuXG4gICAqIEByZXR1cm4ge1RIUkVFLk1lc2h9IEJ1aWx0IG1lc2hcbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5QYXJhbWV0cmljXG4gICAqL1xuXG5cbiAgY3JlYXRlQ2xhc3MoUGFyYW1ldHJpYywgW3tcbiAgICBrZXk6IFwiYnVpbGRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYnVpbGQoKSB7XG4gICAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB0aGlzLnBhcmFtcztcblxuICAgICAgdmFyIF90aGlzJGFwcGx5QnJpZGdlID0gdGhpcy5hcHBseUJyaWRnZSh7XG4gICAgICAgIGdlb21ldHJ5OiB0aGlzLmJ1aWxkR2VvbWV0cnkocGFyYW1zKSxcbiAgICAgICAgbWF0ZXJpYWw6IHBhcmFtcy5tYXRlcmlhbFxuICAgICAgfSksXG4gICAgICAgICAgZ2VvbWV0cnkgPSBfdGhpcyRhcHBseUJyaWRnZS5nZW9tZXRyeSxcbiAgICAgICAgICBtYXRlcmlhbCA9IF90aGlzJGFwcGx5QnJpZGdlLm1hdGVyaWFsO1xuXG4gICAgICByZXR1cm4gdGhpcy5hcHBseUJyaWRnZSh7XG4gICAgICAgIG1lc2g6IG5ldyBNZXNoKGdlb21ldHJ5LCBtYXRlcmlhbClcbiAgICAgIH0pLm1lc2g7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImJ1aWxkR2VvbWV0cnlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYnVpbGRHZW9tZXRyeSgpIHtcbiAgICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgICAgcmV0dXJuIG5ldyAocGFyYW1zLmJ1ZmZlciA/IFBhcmFtZXRyaWNCdWZmZXJHZW9tZXRyeSA6IFBhcmFtZXRyaWNHZW9tZXRyeSkocGFyYW1zLmdlb21ldHJ5LmZ1bmMsIHBhcmFtcy5nZW9tZXRyeS5zbGljZXMsIHBhcmFtcy5nZW9tZXRyeS5zdGFja3MpO1xuICAgIH1cbiAgfV0pO1xuXG4gIGluaGVyaXRzKFBhcmFtZXRyaWMsIF9NZXNoQ29tcG9uZW50KTtcblxuICByZXR1cm4gUGFyYW1ldHJpYztcbn0oTWVzaENvbXBvbmVudCk7XG5cbmRlZmluZVByb3BlcnR5JDMoUGFyYW1ldHJpYywgXCJkZWZhdWx0c1wiLCBvYmplY3RTcHJlYWQoe30sIE1lc2hDb21wb25lbnQuZGVmYXVsdHMsIHtcbiAgZ2VvbWV0cnk6IHtcbiAgICBmdW5jOiBmdW5jdGlvbiBmdW5jKHUsIHYpIHtcbiAgICAgIHJldHVybiBuZXcgVmVjdG9yMyh1LCB2LCAwKTtcbiAgICB9LFxuICAgIHNsaWNlczogMTAsXG4gICAgc3RhY2tzOiAxMFxuICB9XG59KSk7XG5cbi8qKlxuICogQGNsYXNzIFBsYW5lXG4gKiBAY2F0ZWdvcnkgY29tcG9uZW50cy9tZXNoZXNcbiAqIEBkZXNjcmlwdGlvbiBgUGxhbmVgIGlzIHVzZWQgZm9yIGNyZWF0aW5nIHBsYW5lcyBnaXZlbiBzb21lIGB3aWR0aGAgYW5kIGBoZWlnaHRgLlxuICogQGNsYXNzRGVzY1xuICogPGlmcmFtZSBzcmM9XCJodHRwczovL3RocmVlanMub3JnL2RvY3Mvc2NlbmVzL2dlb21ldHJ5LWJyb3dzZXIuaHRtbCNQbGFuZUdlb21ldHJ5XCI+PC9pZnJhbWU+XG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtc10gLSBUaGUgcGFyYW1zLlxuICogQGV4dGVuZHMgbW9kdWxlOmNvcmUuTWVzaENvbXBvbmVudFxuICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL21lc2hlc1xuICogQGV4YW1wbGUgPGNhcHRpb24+Q3JlYXRpbmcgYSBQbGFuZSwgYW5kIGFkZGluZyB0byBhcHA8L2NhcHRpb24+XG4gKiBuZXcgUGxhbmUoe1xuICogICBnZW9tZXRyeToge1xuICogICAgIHdpZHRoOiAyMCxcbiAqICAgICBoZWlnaHQ6IDMwXG4gKiAgIH0sXG4gKlxuICogICBtYXRlcmlhbDogbmV3IFRIUkVFLk1lc2hCYXNpY01hdGVyaWFsKHtcbiAqICAgICBjb2xvcjogMHhmZmZmZmZcbiAqICAgfSlcbiAqIH0pLmFkZFRvKGFwcCk7XG4gKi9cblxudmFyIFBsYW5lJDEgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9NZXNoQ29tcG9uZW50KSB7XG4gIC8qKlxuICAgKiBEZWZhdWx0IHZhbHVlcyBmb3IgcGFyYW1ldGVyc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5QbGFuZSNkZWZhdWx0c1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IDxwcmU+XG4gICAqIHtcbiAgICogICBnZW9tZXRyeToge1xuICAgKiAgICAgd2lkdGg6IDEwLFxuICAgKiAgICAgaGVpZ2h0OiAxMCxcbiAgICogICAgIHdTZWdtZW50czogMSxcbiAgICogICAgIGhTZWdtZW50czogMVxuICAgKiAgIH1cbiAgICogfVxuICAgKiA8L3ByZT5cbiAgICovXG5cbiAgLyoqXG4gICAqIEluc3RydWN0aW9uc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5QbGFuZSNpbnN0cnVjdGlvbnNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdCA8cHJlPlxuICAgKiB7XG4gICAqICAgZ2VvbWV0cnk6IFsnd2lkdGgnLCAnaGVpZ2h0JywgJ3dTZWdtZW50cycsICdoU2VnbWVudHMnXVxuICAgKiB9XG4gICAqIDwvcHJlPlxuICAgKi9cbiAgZnVuY3Rpb24gUGxhbmUkJDEoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBQbGFuZSQkMSk7XG5cbiAgICBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgZ2V0UHJvdG90eXBlT2YkMihQbGFuZSQkMSkuY2FsbCh0aGlzLCBwYXJhbXMsIFBsYW5lJCQxLmRlZmF1bHRzLCBQbGFuZSQkMS5pbnN0cnVjdGlvbnMpKTtcblxuICAgIGlmIChwYXJhbXMuYnVpbGQpIHtcbiAgICAgIF90aGlzLmJ1aWxkKHBhcmFtcyk7XG5cbiAgICAgIGdldCQzKGdldFByb3RvdHlwZU9mJDIoUGxhbmUkJDEucHJvdG90eXBlKSwgXCJ3cmFwXCIsIGFzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcykpLmNhbGwoYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG4gIC8qKlxuICAgKiBAbWV0aG9kIGJ1aWxkXG4gICAqIEBkZXNjcmlwdGlvbiBCdWlsZCBsaWZlY3ljbGUgY3JlYXRlcyBhIG1lc2ggdXNpbmcgaW5wdXQgcGFyYW1zLlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIENvbXBvbmVudCBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJuIHtUSFJFRS5NZXNofSBCdWlsdCBtZXNoXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuUGxhbmVcbiAgICovXG5cblxuICBjcmVhdGVDbGFzcyhQbGFuZSQkMSwgW3tcbiAgICBrZXk6IFwiYnVpbGRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYnVpbGQoKSB7XG4gICAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB0aGlzLnBhcmFtcztcblxuICAgICAgdmFyIF90aGlzJGFwcGx5QnJpZGdlID0gdGhpcy5hcHBseUJyaWRnZSh7XG4gICAgICAgIGdlb21ldHJ5OiB0aGlzLmJ1aWxkR2VvbWV0cnkocGFyYW1zKSxcbiAgICAgICAgbWF0ZXJpYWw6IHBhcmFtcy5tYXRlcmlhbFxuICAgICAgfSksXG4gICAgICAgICAgZ2VvbWV0cnkgPSBfdGhpcyRhcHBseUJyaWRnZS5nZW9tZXRyeSxcbiAgICAgICAgICBtYXRlcmlhbCA9IF90aGlzJGFwcGx5QnJpZGdlLm1hdGVyaWFsO1xuXG4gICAgICByZXR1cm4gdGhpcy5hcHBseUJyaWRnZSh7XG4gICAgICAgIG1lc2g6IG5ldyBNZXNoKGdlb21ldHJ5LCBtYXRlcmlhbClcbiAgICAgIH0pLm1lc2g7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImJ1aWxkR2VvbWV0cnlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYnVpbGRHZW9tZXRyeSgpIHtcbiAgICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgICAgdmFyIGdlb21ldHJ5ID0gbmV3IChwYXJhbXMuYnVmZmVyID8gUGxhbmVCdWZmZXJHZW9tZXRyeSA6IFBsYW5lR2VvbWV0cnkpKHBhcmFtcy5nZW9tZXRyeS53aWR0aCwgcGFyYW1zLmdlb21ldHJ5LmhlaWdodCwgcGFyYW1zLmdlb21ldHJ5LndTZWdtZW50cywgcGFyYW1zLmdlb21ldHJ5LmhTZWdtZW50cyk7XG4gICAgICByZXR1cm4gZ2VvbWV0cnk7XG4gICAgfVxuICB9XSk7XG5cbiAgaW5oZXJpdHMoUGxhbmUkJDEsIF9NZXNoQ29tcG9uZW50KTtcblxuICByZXR1cm4gUGxhbmUkJDE7XG59KE1lc2hDb21wb25lbnQpO1xuXG5kZWZpbmVQcm9wZXJ0eSQzKGRlZmluZVByb3BlcnR5JDMoUGxhbmUkMSwgXCJkZWZhdWx0c1wiLCBvYmplY3RTcHJlYWQoe30sIE1lc2hDb21wb25lbnQuZGVmYXVsdHMsIHtcbiAgZ2VvbWV0cnk6IHtcbiAgICB3aWR0aDogMTAsXG4gICAgaGVpZ2h0OiAxMCxcbiAgICB3U2VnbWVudHM6IDEsXG4gICAgaFNlZ21lbnRzOiAxXG4gIH1cbn0pKSwgXCJpbnN0cnVjdGlvbnNcIiwgb2JqZWN0U3ByZWFkKHt9LCBNZXNoQ29tcG9uZW50Lmluc3RydWN0aW9ucywge1xuICBnZW9tZXRyeTogWyd3aWR0aCcsICdoZWlnaHQnLCAnd1NlZ21lbnRzJywgJ2hTZWdtZW50cyddXG59KSk7XG5cbnZhciB2ZXJ0aWNlc09mQ3ViZSA9IFstMSwgLTEsIC0xLCAxLCAtMSwgLTEsIDEsIDEsIC0xLCAtMSwgMSwgLTEsIC0xLCAtMSwgMSwgMSwgLTEsIDEsIDEsIDEsIDEsIC0xLCAxLCAxXSxcbiAgICBpbmRpY2VzT2ZGYWNlcyA9IFsyLCAxLCAwLCAwLCAzLCAyLCAwLCA0LCA3LCA3LCAzLCAwLCAwLCAxLCA1LCA1LCA0LCAwLCAxLCAyLCA2LCA2LCA1LCAxLCAyLCAzLCA3LCA3LCA2LCAyLCA0LCA1LCA2LCA2LCA3LCA0XTtcbi8qKlxuICogQGNsYXNzIFBvbHloZWRyb25cbiAqIEBjYXRlZ29yeSBjb21wb25lbnRzL21lc2hlc1xuICogQGRlc2NyaXB0aW9uIEluIGVsZW1lbnRhcnkgZ2VvbWV0cnksIGEgcG9seWhlZHJvbiBpcyBhIHNvbGlkIGluIHRocmVlIGRpbWVuc2lvbnMgd2l0aCBmbGF0IHBvbHlnb25hbCBmYWNlcywgc3RyYWlnaHQgZWRnZXMgYW5kIHNoYXJwIGNvcm5lcnMgb3IgdmVydGljZXMuXG4gKiA8YnIvPjxici8+XG4gKiBgUG9seWhlZHJvbmAgY3JlYXRlcyBhIFBvbHloZWRyb24gYnkgaXRzIGByYWRpdXNgIGFuZCBgZGV0YWlsYC5cbiAqIDxici8+PGJyLz5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zXSAtIFRoZSBwYXJhbXMuXG4gKiBAZXh0ZW5kcyBtb2R1bGU6Y29yZS5NZXNoQ29tcG9uZW50XG4gKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5DcmVhdGluZyBhbiBQb2x5aGVkcm9uLCBhbmQgYWRkaW5nIHRvIGFwcDwvY2FwdGlvbj5cbiAqIG5ldyBQb2x5aGVkcm9uKHtcbiAqICAgZ2VvbWV0cnk6IHtcbiAqICAgICByYWRpdXM6IDIsXG4gKiAgICAgZGV0YWlsOiAxXG4gKiAgIH0sXG4gKlxuICogICBtYXRlcmlhbDogbmV3IFRIUkVFLk1lc2hCYXNpY01hdGVyaWFsKHtcbiAqICAgICBjb2xvcjogMHhmZmZmZmZcbiAqICAgfSksXG4gKlxuICogICBwb3NpdGlvbjogWzAsIDEwMCwgMF1cbiAqIH0pLmFkZFRvKGFwcCk7XG4gKi9cblxudmFyIFBvbHloZWRyb24gPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9NZXNoQ29tcG9uZW50KSB7XG4gIC8qKlxuICAgKiBEZWZhdWx0IHZhbHVlcyBmb3IgcGFyYW1ldGVyc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5Qb2x5aGVkcm9uI2RlZmF1bHRzXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHQgPHByZT5cbiAgICoge1xuICAgKiAgIGdlb21ldHJ5OiB7XG4gICAqICAgICB2ZXJ0aWNlc09mQ3ViZTogW1xuICAgKiAgICAgICAtMSwgLTEsIC0xLCAxLCAtMSwgLTEsIDEsIDEsIC0xLCAtMSwgMSwgLTEsXG4gICAqICAgICAgIC0xLCAtMSwgMSwgMSwgLTEsIDEsIDEsIDEsIDEsIC0xLCAxLCAxXG4gICAqICAgICBdLFxuICAgKlxuICAgKiAgICAgaW5kaWNlc09mRmFjZXM6IFtcbiAgICogICAgICAgMiwgMSwgMCwgMCwgMywgMixcbiAgICogICAgICAgMCwgNCwgNywgNywgMywgMCxcbiAgICogICAgICAgMCwgMSwgNSwgNSwgNCwgMCxcbiAgICogICAgICAgMSwgMiwgNiwgNiwgNSwgMSxcbiAgICogICAgICAgMiwgMywgNywgNywgNiwgMixcbiAgICogICAgICAgNCwgNSwgNiwgNiwgNywgNFxuICAgKiAgICAgXSxcbiAgICpcbiAgICogICAgIHJhZGl1czogNixcbiAgICogICAgIGRldGFpbDogMlxuICAgKiAgIH1cbiAgICogfVxuICAgKiA8L3ByZT5cbiAgICovXG5cbiAgLyoqXG4gICAqIEluc3RydWN0aW9uc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5Qb2x5aGVkcm9uI2luc3RydWN0aW9uc1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IDxwcmU+XG4gICAqIHtcbiAgICogICBnZW9tZXRyeTogWyd2ZXJ0aWNlc09mQ3ViZScsICdpbmRpY2VzT2ZGYWNlcycsICdyYWRpdXMnLCAnZGV0YWlsJ11cbiAgICogfVxuICAgKiA8L3ByZT5cbiAgICovXG4gIGZ1bmN0aW9uIFBvbHloZWRyb24oKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBQb2x5aGVkcm9uKTtcblxuICAgIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBnZXRQcm90b3R5cGVPZiQyKFBvbHloZWRyb24pLmNhbGwodGhpcywgcGFyYW1zLCBQb2x5aGVkcm9uLmRlZmF1bHRzLCBQb2x5aGVkcm9uLmluc3RydWN0aW9ucykpO1xuXG4gICAgaWYgKHBhcmFtcy5idWlsZCkge1xuICAgICAgX3RoaXMuYnVpbGQocGFyYW1zKTtcblxuICAgICAgZ2V0JDMoZ2V0UHJvdG90eXBlT2YkMihQb2x5aGVkcm9uLnByb3RvdHlwZSksIFwid3JhcFwiLCBhc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpKS5jYWxsKGFzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcykpO1xuICAgIH1cblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuICAvKipcbiAgICogQG1ldGhvZCBidWlsZFxuICAgKiBAZGVzY3JpcHRpb24gQnVpbGQgbGlmZWN5Y2xlIGNyZWF0ZXMgYSBtZXNoIHVzaW5nIGlucHV0IHBhcmFtcy5cbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBDb21wb25lbnQgcGFyYW1ldGVycy5cbiAgICogQHJldHVybiB7VEhSRUUuTWVzaH0gQnVpbHQgbWVzaFxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLlBvbHloZWRyb25cbiAgICovXG5cblxuICBjcmVhdGVDbGFzcyhQb2x5aGVkcm9uLCBbe1xuICAgIGtleTogXCJidWlsZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBidWlsZCgpIHtcbiAgICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHRoaXMucGFyYW1zO1xuXG4gICAgICB2YXIgX3RoaXMkYXBwbHlCcmlkZ2UgPSB0aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgICAgZ2VvbWV0cnk6IHRoaXMuYnVpbGRHZW9tZXRyeShwYXJhbXMpLFxuICAgICAgICBtYXRlcmlhbDogcGFyYW1zLm1hdGVyaWFsXG4gICAgICB9KSxcbiAgICAgICAgICBnZW9tZXRyeSA9IF90aGlzJGFwcGx5QnJpZGdlLmdlb21ldHJ5LFxuICAgICAgICAgIG1hdGVyaWFsID0gX3RoaXMkYXBwbHlCcmlkZ2UubWF0ZXJpYWw7XG5cbiAgICAgIHJldHVybiB0aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgICAgbWVzaDogbmV3IE1lc2goZ2VvbWV0cnksIG1hdGVyaWFsKVxuICAgICAgfSkubWVzaDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYnVpbGRHZW9tZXRyeVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBidWlsZEdlb21ldHJ5KCkge1xuICAgICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgICByZXR1cm4gbmV3IChwYXJhbXMuYnVmZmVyID8gUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5IDogUG9seWhlZHJvbkdlb21ldHJ5KShwYXJhbXMuZ2VvbWV0cnkudmVydGljZXNPZkN1YmUsIHBhcmFtcy5nZW9tZXRyeS5pbmRpY2VzT2ZGYWNlcywgcGFyYW1zLmdlb21ldHJ5LnJhZGl1cywgcGFyYW1zLmdlb21ldHJ5LmRldGFpbCk7XG4gICAgfVxuICB9XSk7XG5cbiAgaW5oZXJpdHMoUG9seWhlZHJvbiwgX01lc2hDb21wb25lbnQpO1xuXG4gIHJldHVybiBQb2x5aGVkcm9uO1xufShNZXNoQ29tcG9uZW50KTtcblxuZGVmaW5lUHJvcGVydHkkMyhkZWZpbmVQcm9wZXJ0eSQzKGRlZmluZVByb3BlcnR5JDMoZGVmaW5lUHJvcGVydHkkMyhQb2x5aGVkcm9uLCBcInZlcnRpY2VzT2ZDdWJlXCIsIHZlcnRpY2VzT2ZDdWJlKSwgXCJpbmRpY2VzT2ZGYWNlc1wiLCBpbmRpY2VzT2ZGYWNlcyksIFwiZGVmYXVsdHNcIiwgb2JqZWN0U3ByZWFkKHt9LCBNZXNoQ29tcG9uZW50LmRlZmF1bHRzLCB7XG4gIGdlb21ldHJ5OiB7XG4gICAgdmVydGljZXNPZkN1YmU6IHZlcnRpY2VzT2ZDdWJlLFxuICAgIGluZGljZXNPZkZhY2VzOiBpbmRpY2VzT2ZGYWNlcyxcbiAgICByYWRpdXM6IDYsXG4gICAgZGV0YWlsOiAyXG4gIH1cbn0pKSwgXCJpbnN0cnVjdGlvbnNcIiwgb2JqZWN0U3ByZWFkKHt9LCBNZXNoQ29tcG9uZW50Lmluc3RydWN0aW9ucywge1xuICBnZW9tZXRyeTogWyd2ZXJ0aWNlc09mQ3ViZScsICdpbmRpY2VzT2ZGYWNlcycsICdyYWRpdXMnLCAnZGV0YWlsJ11cbn0pKTtcblxuLyoqXG4gKiBAY2xhc3MgUmluZ1xuICogQGNhdGVnb3J5IGNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZGVzY3JpcHRpb24gUmluZyBjbGFzcyBjcmVhdGVzIGEgY2lyY2xlIG9yIGp1c3QgMkQgVG9ydXMuIERvZXMgbm90IHN1cHBvcnQgcGh5c2ljcy5cbiAqIEBjbGFzc0Rlc2NcbiAqIDxpZnJhbWUgc3JjPVwiaHR0cHM6Ly90aHJlZWpzLm9yZy9kb2NzL3NjZW5lcy9nZW9tZXRyeS1icm93c2VyLmh0bWwjUmluZ0dlb21ldHJ5XCI+PC9pZnJhbWU+XG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtc10gLSBUaGUgcGFyYW1zLlxuICogQGV4dGVuZHMgbW9kdWxlOmNvcmUuTWVzaENvbXBvbmVudFxuICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL21lc2hlc1xuICogQGV4YW1wbGUgPGNhcHRpb24+Q3JlYXRpbmcgYSBSaW5nLCBhbmQgYWRkaW5nIHRvIGFwcDwvY2FwdGlvbj5cbiAqIG5ldyBSaW5nKHtcbiAqICAgZ2VvbWV0cnk6IHtcbiAqICAgICBpbm5lclJhZGl1czogNSxcbiAqICAgICBvdXRlclJhZGl1czogMlxuICogICB9LFxuICpcbiAqICAgbWF0ZXJpYWw6IG5ldyBUSFJFRS5NZXNoTGFtYmVydE1hdGVyaWFsKHtcbiAqICAgICBjb2xvcjogMHhmZmZmZmYsXG4gKiAgICAgc2lkZSBUSFJFRS5Eb3VibGVTaWRlXG4gKiAgIH0pLFxuICpcbiAqICAgcG9zaXRpb246IFswLCA4LCAwXSxcbiAqXG4gKiAgIHJvdGF0aW9uOiB7XG4gKiAgICAgeDogTWF0aC5QSS80XG4gKiAgIH1cbiAqIH0pLmFkZFRvKGFwcCk7XG4gKi9cblxudmFyIFJpbmcgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9NZXNoQ29tcG9uZW50KSB7XG4gIC8qKlxuICAgKiBEZWZhdWx0IHZhbHVlcyBmb3IgcGFyYW1ldGVyc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5SaW5nI2RlZmF1bHRzXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHQgPHByZT5cbiAgICoge1xuICAgKiAgIGdlb21ldHJ5OiB7XG4gICAqICAgICBpbm5lclJhZGl1czogMCxcbiAgICogICAgIG91dGVyUmFkaXVzOiA1MCxcbiAgICogICAgIHRoZXRhU2VnbWVudHM6IDgsXG4gICAqICAgICBwaGlTZWdtZW50czogOCxcbiAgICogICAgIHRoZXRhU3RhcnQ6IDAsXG4gICAqICAgICB0aGV0YUxlbmd0aDogTWF0aC5QSSAqIDJcbiAgICogICB9XG4gICAqIH1cbiAgICogPC9wcmU+XG4gICAqL1xuXG4gIC8qKlxuICAgKiBJbnN0cnVjdGlvbnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuUmluZyNpbnN0cnVjdGlvbnNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdCA8cHJlPlxuICAgKiB7XG4gICAqICAgZ2VvbWV0cnk6IFtcbiAgICogICAgICdpbm5lclJhZGl1cycsXG4gICAqICAgICAnb3V0ZXJSYWRpdXMnLFxuICAgKiAgICAgJ3RoZXRhU2VnbWVudHMnLFxuICAgKiAgICAgJ3BoaVNlZ21lbnRzJyxcbiAgICogICAgICd0aGV0YVN0YXJ0JyxcbiAgICogICAgICd0aGV0YUxlbmd0aCdcbiAgICogICBdXG4gICAqIH1cbiAgICogPC9wcmU+XG4gICAqL1xuICBmdW5jdGlvbiBSaW5nKCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgUmluZyk7XG5cbiAgICBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgZ2V0UHJvdG90eXBlT2YkMihSaW5nKS5jYWxsKHRoaXMsIHBhcmFtcywgUmluZy5kZWZhdWx0cywgUmluZy5pbnN0cnVjdGlvbnMpKTtcblxuICAgIGlmIChwYXJhbXMuYnVpbGQpIHtcbiAgICAgIF90aGlzLmJ1aWxkKHBhcmFtcyk7XG5cbiAgICAgIGdldCQzKGdldFByb3RvdHlwZU9mJDIoUmluZy5wcm90b3R5cGUpLCBcIndyYXBcIiwgYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSkuY2FsbChhc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgLyoqXG4gICAqIEBtZXRob2QgYnVpbGRcbiAgICogQGRlc2NyaXB0aW9uIEJ1aWxkIGxpZmVjeWNsZSBjcmVhdGVzIGEgbWVzaCB1c2luZyBpbnB1dCBwYXJhbXMuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgQ29tcG9uZW50IHBhcmFtZXRlcnMuXG4gICAqIEByZXR1cm4ge1RIUkVFLk1lc2h9IEJ1aWx0IG1lc2hcbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5SaW5nXG4gICAqL1xuXG5cbiAgY3JlYXRlQ2xhc3MoUmluZywgW3tcbiAgICBrZXk6IFwiYnVpbGRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYnVpbGQoKSB7XG4gICAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB0aGlzLnBhcmFtcztcblxuICAgICAgdmFyIF90aGlzJGFwcGx5QnJpZGdlID0gdGhpcy5hcHBseUJyaWRnZSh7XG4gICAgICAgIGdlb21ldHJ5OiB0aGlzLmJ1aWxkR2VvbWV0cnkocGFyYW1zKSxcbiAgICAgICAgbWF0ZXJpYWw6IHBhcmFtcy5tYXRlcmlhbFxuICAgICAgfSksXG4gICAgICAgICAgZ2VvbWV0cnkgPSBfdGhpcyRhcHBseUJyaWRnZS5nZW9tZXRyeSxcbiAgICAgICAgICBtYXRlcmlhbCA9IF90aGlzJGFwcGx5QnJpZGdlLm1hdGVyaWFsO1xuXG4gICAgICByZXR1cm4gdGhpcy5hcHBseUJyaWRnZSh7XG4gICAgICAgIG1lc2g6IG5ldyBNZXNoKGdlb21ldHJ5LCBtYXRlcmlhbClcbiAgICAgIH0pLm1lc2g7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImJ1aWxkR2VvbWV0cnlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYnVpbGRHZW9tZXRyeSgpIHtcbiAgICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgICAgcmV0dXJuIG5ldyAocGFyYW1zLmJ1ZmZlciA/IFJpbmdCdWZmZXJHZW9tZXRyeSA6IFJpbmdHZW9tZXRyeSkocGFyYW1zLmdlb21ldHJ5LmlubmVyUmFkaXVzLCBwYXJhbXMuZ2VvbWV0cnkub3V0ZXJSYWRpdXMsIHBhcmFtcy5nZW9tZXRyeS50aGV0YVNlZ21lbnRzLCBwYXJhbXMuZ2VvbWV0cnkucGhpU2VnbWVudHMsIHBhcmFtcy5nZW9tZXRyeS50aGV0YVN0YXJ0LCBwYXJhbXMuZ2VvbWV0cnkudGhldGFMZW5ndGgpO1xuICAgIH1cbiAgfV0pO1xuXG4gIGluaGVyaXRzKFJpbmcsIF9NZXNoQ29tcG9uZW50KTtcblxuICByZXR1cm4gUmluZztcbn0oTWVzaENvbXBvbmVudCk7XG5cbmRlZmluZVByb3BlcnR5JDMoZGVmaW5lUHJvcGVydHkkMyhSaW5nLCBcImRlZmF1bHRzXCIsIG9iamVjdFNwcmVhZCh7fSwgTWVzaENvbXBvbmVudC5kZWZhdWx0cywge1xuICBnZW9tZXRyeToge1xuICAgIGlubmVyUmFkaXVzOiAwLFxuICAgIG91dGVyUmFkaXVzOiA1MCxcbiAgICB0aGV0YVNlZ21lbnRzOiA4LFxuICAgIHBoaVNlZ21lbnRzOiA4LFxuICAgIHRoZXRhU3RhcnQ6IDAsXG4gICAgdGhldGFMZW5ndGg6IE1hdGguUEkgKiAyXG4gIH1cbn0pKSwgXCJpbnN0cnVjdGlvbnNcIiwgb2JqZWN0U3ByZWFkKHt9LCBNZXNoQ29tcG9uZW50LmRlZmF1bHRzLCB7XG4gIGdlb21ldHJ5OiBbJ2lubmVyUmFkaXVzJywgJ291dGVyUmFkaXVzJywgJ3RoZXRhU2VnbWVudHMnLCAncGhpU2VnbWVudHMnLCAndGhldGFTdGFydCcsICd0aGV0YUxlbmd0aCddXG59KSk7XG5cbi8qKlxuICogQGNsYXNzIFNoYXBlXG4gKiBAY2F0ZWdvcnkgY29tcG9uZW50cy9tZXNoZXNcbiAqIEBkZXNjcmlwdGlvbiBTaGFwZSBpcyBhIHVuaXZlcnNhbCBjbGFzcy4gSXQgYWxsb3dzIHlvdSB0byBjcmVhdGUgZGlmZmVyZW50IDJEIHNoYXBlcyBpbiAzRCBzY2VuZS48YnIvPlxuICogVW5mb3J0dW5hdGVseSwgbm90IGFsbCBvZiB0aGVtIHN1cHBvcnQgcGh5c2ljcywgYW4gYWx0ZXJuYXRpdmUgaXMgdG8gbWFrZSBhIHNpbWlsYXIgM0Qgb2JqZWN0IGFuZCBzY2FsZSBpdHMgd2lkdGggZG93biB0byBuZWFyIHplcm8uXG4gKiA8YnIvPjxici8+XG4gKiBgU2hhcGVgIGNvbnNpc3RzIG9mIHNoYXBlcyB0aGF0IGFyZSBpbiBpdHMgc2hhcGVzIHBhcmFtZXRlci5cbiAqIEBjbGFzc0Rlc2NcbiAqIDxpZnJhbWUgc3JjPVwiaHR0cHM6Ly90aHJlZWpzLm9yZy9kb2NzL3NjZW5lcy9nZW9tZXRyeS1icm93c2VyLmh0bWwjU2hhcGVHZW9tZXRyeVwiPjwvaWZyYW1lPlxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXNdIC0gVGhlIHBhcmFtcy5cbiAqIEBleHRlbmRzIG1vZHVsZTpjb3JlLk1lc2hDb21wb25lbnRcbiAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXNcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkNyZWF0aW5nIGEgcGxhbmUgbG9va2luZyBTaGFwZSBmcm9tIGEgVEhSRUUuU2hhcGUsIGFuZCBhZGRpbmcgaXQgdG8gYXBwPC9jYXB0aW9uPlxuICogY29uc3QgcmVjdFdpZHRoID0gMTAsXG4gKiByZWN0TGVuZ3RoID0gNTtcbiAqXG4gKiBjb25zdCByZWN0U2hhcGUgPSBuZXcgVEhSRUUuU2hhcGUoKTtcbiAqIHJlY3RTaGFwZS5tb3ZlVG8oMCwwKTtcbiAqIHJlY3RTaGFwZS5saW5lVG8oMCwgcmVjdFdpZHRoKTtcbiAqIHJlY3RTaGFwZS5saW5lVG8ocmVjdExlbmd0aCwgcmVjdFdpZHRoKTtcbiAqIHJlY3RTaGFwZS5saW5lVG8ocmVjdExlbmd0aCwgMCk7XG4gKiByZWN0U2hhcGUubGluZVRvKDAsIDApO1xuICpcbiAqIGNvbnN0IHBsYW5lID0gbmV3IFNoYXBlKHtcbiAqICAgZ2VvbWV0cnk6IHtcbiAqICAgICBzaGFwZTogcmVjdFNoYXBlXG4gKiAgIH0sXG4gKlxuICogICBtYXRlcmlhbDogbmV3IFRIUkVFLk1lc2hCYXNpY01hdGVyaWFsKHtcbiAqICAgICBjb2xvcjogMHhmZmZmZmZcbiAqICAgfSlcbiAqIH0pLmFkZFRvKGFwcCk7XG4gKi9cblxudmFyIFNoYXBlJDEgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9NZXNoQ29tcG9uZW50KSB7XG4gIC8qKlxuICAgKiBEZWZhdWx0IHZhbHVlcyBmb3IgcGFyYW1ldGVyc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5TaGFwZSNkZWZhdWx0c1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IDxwcmU+XG4gICAqIHtcbiAgICogICBnZW9tZXRyeToge1xuICAgKiAgICAgc2hhcGVzOiBbXVxuICAgKiB9XG4gICAqIDwvcHJlPlxuICAgKi9cblxuICAvKipcbiAgICogSW5zdHJ1Y3Rpb25zXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLlNoYXBlI2luc3RydWN0aW9uc1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IDxwcmU+XG4gICAqIHtcbiAgICogICBnZW9tZXRyeTogWydzaGFwZXMnXVxuICAgKiB9XG4gICAqIDwvcHJlPlxuICAgKi9cbiAgZnVuY3Rpb24gU2hhcGUkJDEoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBTaGFwZSQkMSk7XG5cbiAgICBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgZ2V0UHJvdG90eXBlT2YkMihTaGFwZSQkMSkuY2FsbCh0aGlzLCBwYXJhbXMsIFNoYXBlJCQxLmRlZmF1bHRzLCBTaGFwZSQkMS5pbnN0cnVjdGlvbnMpKTtcblxuICAgIGlmIChwYXJhbXMuYnVpbGQpIHtcbiAgICAgIF90aGlzLmJ1aWxkKHBhcmFtcyk7XG5cbiAgICAgIGdldCQzKGdldFByb3RvdHlwZU9mJDIoU2hhcGUkJDEucHJvdG90eXBlKSwgXCJ3cmFwXCIsIGFzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcykpLmNhbGwoYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG4gIC8qKlxuICAgKiBAbWV0aG9kIGJ1aWxkXG4gICAqIEBkZXNjcmlwdGlvbiBCdWlsZCBsaWZlY3ljbGUgY3JlYXRlcyBhIG1lc2ggdXNpbmcgaW5wdXQgcGFyYW1zLlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIENvbXBvbmVudCBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJuIHtUSFJFRS5NZXNofSBCdWlsdCBtZXNoXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuU2hhcGVcbiAgICovXG5cblxuICBjcmVhdGVDbGFzcyhTaGFwZSQkMSwgW3tcbiAgICBrZXk6IFwiYnVpbGRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYnVpbGQoKSB7XG4gICAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB0aGlzLnBhcmFtcztcblxuICAgICAgdmFyIF90aGlzJGFwcGx5QnJpZGdlID0gdGhpcy5hcHBseUJyaWRnZSh7XG4gICAgICAgIGdlb21ldHJ5OiB0aGlzLmJ1aWxkR2VvbWV0cnkocGFyYW1zKSxcbiAgICAgICAgbWF0ZXJpYWw6IHBhcmFtcy5tYXRlcmlhbFxuICAgICAgfSksXG4gICAgICAgICAgZ2VvbWV0cnkgPSBfdGhpcyRhcHBseUJyaWRnZS5nZW9tZXRyeSxcbiAgICAgICAgICBtYXRlcmlhbCA9IF90aGlzJGFwcGx5QnJpZGdlLm1hdGVyaWFsO1xuXG4gICAgICByZXR1cm4gdGhpcy5hcHBseUJyaWRnZSh7XG4gICAgICAgIG1lc2g6IG5ldyBNZXNoKGdlb21ldHJ5LCBtYXRlcmlhbClcbiAgICAgIH0pLm1lc2g7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImJ1aWxkR2VvbWV0cnlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYnVpbGRHZW9tZXRyeSgpIHtcbiAgICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgICAgcmV0dXJuIG5ldyAocGFyYW1zLmJ1ZmZlciA/IFNoYXBlQnVmZmVyR2VvbWV0cnkgOiBTaGFwZUdlb21ldHJ5KShwYXJhbXMuZ2VvbWV0cnkuc2hhcGVzKTtcbiAgICB9XG4gIH1dKTtcblxuICBpbmhlcml0cyhTaGFwZSQkMSwgX01lc2hDb21wb25lbnQpO1xuXG4gIHJldHVybiBTaGFwZSQkMTtcbn0oTWVzaENvbXBvbmVudCk7XG5cbmRlZmluZVByb3BlcnR5JDMoZGVmaW5lUHJvcGVydHkkMyhTaGFwZSQxLCBcImRlZmF1bHRzXCIsIG9iamVjdFNwcmVhZCh7fSwgTWVzaENvbXBvbmVudC5kZWZhdWx0cywge1xuICBnZW9tZXRyeToge1xuICAgIHNoYXBlczogW11cbiAgfVxufSkpLCBcImluc3RydWN0aW9uc1wiLCBvYmplY3RTcHJlYWQoe30sIE1lc2hDb21wb25lbnQuaW5zdHJ1Y3Rpb25zLCB7XG4gIGdlb21ldHJ5OiBbJ3NoYXBlcyddXG59KSk7XG5cbi8qKlxuICogQGNsYXNzIFNwaGVyZVxuICogQGNhdGVnb3J5IGNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZGVzY3JpcHRpb24gU3BoZXJlIGNsYXNzIGlzIHVzZWQgdG8gY3JlYXRlIHNwaGVyZSBvYmplY3RzIGJ5IGl0cyByYWRpdXMgcHJvcGVydHkgYW5kIG90aGVyIHZhbHVlcyB0aGF0IGRldGVybWluZXMgaXRzIGRldGFsaXR5LlxuICogPGJyLz48YnIvPlxuICogSXQgaXMgc2ltaWxhciB0byBUSFJFRS5TcGhlcmVHZW9tZXRyeSwgYnV0IGl0IGFsc28gY29udGFpbnMgYWxsIGBTaGFwZWAgcHJvcGVydGllcywgc3VjaCBhcyBtYXRlcmlhbCwgbWFzcyBhbmQgdmVjdG9ycyBsaWtlIHBvc2l0aW9uIChwb3MpIGFuZCByb3RhdGlvbiAocm90KS5cbiAqIDxici8+PGJyLz5cbiAqIFRoZW4gaXQgY3JlYXRlcyBhbiBgVGhyZWUuanMgbWVzaGAgb3IgYSBgUGh5c2lqcyBtZXNoYCwgdGhhdCBpcyBzaW1pbGFyIHRvIGBUaHJlZS5qcyBtZXNoYCwgYnV0IGl0IGFsc28gdGFrZSBpbnRvIGNvbnNpZGVyYXRpb24gY29sbGlzaW9uIGNhbGN1bGF0aW9ucy5cbiAqIFRoaXMgbWVzaCBpcyBhIGNvbWJpbmF0aW9uIG9mIGBUaHJlZS5qcyBnZW9tZXRyeWAgYW5kIGBQaHlzaWpzIG1hdGVyaWFsYCAoVGhlIHNhbWUgYXMgaW4gdGhyZWUuanMsIGJ1dCB3aXRoIGZyaWN0aW9uIGFuZCByZXN0aXR1dGlvbikuXG4gKiBAY2xhc3NEZXNjXG4gKiA8aWZyYW1lIHNyYz1cImh0dHBzOi8vdGhyZWVqcy5vcmcvZG9jcy9zY2VuZXMvZ2VvbWV0cnktYnJvd3Nlci5odG1sI1NwaGVyZUdlb21ldHJ5XCI+PC9pZnJhbWU+XG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtc10gLSBUaGUgcGFyYW1zLlxuICogQGV4dGVuZHMgbW9kdWxlOmNvcmUuTWVzaENvbXBvbmVudFxuICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL21lc2hlc1xuICogQGV4YW1wbGUgPGNhcHRpb24+Q3JlYXRpbmcgYSBTcGhlcmUsIGFuZCBhZGRpbmcgaXQgdG8gYXBwPC9jYXB0aW9uPlxuICogbmV3IFNwaGVyZSh7XG4gKiAgIGdlb21ldHJ5OiB7XG4gKiAgICAgcmFkaXVzOiAyXG4gKiAgIH0sXG4gKlxuICogICBtYXRlcmlhbDogbmV3IFRIUkVFLk1lc2hCYXNpY01hdGVyaWFsKHtcbiAqICAgICBjb2xvcjogMHhmZmZmZmZcbiAqICAgfSksXG4gKlxuICogICBwb3NpdGlvbjoge1xuICogICAgIHk6IDEwMFxuICogICB9XG4gKiB9KS5hZGRUbyhhcHApO1xuICovXG5cbnZhciBTcGhlcmUkMSA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX01lc2hDb21wb25lbnQpIHtcbiAgLyoqXG4gICAqIERlZmF1bHQgdmFsdWVzIGZvciBwYXJhbWV0ZXJzXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLlNwaGVyZSNkZWZhdWx0c1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IDxwcmU+XG4gICAqIHtcbiAgICogICBnZW9tZXRyeToge1xuICAgKiAgICAgcmFkaXVzOiAxLFxuICAgKiAgICAgd2lkdGhTZWdtZW50czogOCxcbiAgICogICAgIGhlaWdodFNlZ21lbnRzOiA2XG4gICAqIH1cbiAgICogPC9wcmU+XG4gICAqL1xuXG4gIC8qKlxuICAgKiBJbnN0cnVjdGlvbnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuU3BoZXJlI2luc3RydWN0aW9uc1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IDxwcmU+XG4gICAqIHtcbiAgICogICBnZW9tZXRyeTogWydyYWRpdXMnLCAnd2lkdGhTZWdtZW50cycsICdoZWlnaHRTZWdtZW50cyddXG4gICAqIH1cbiAgICogPC9wcmU+XG4gICAqL1xuICBmdW5jdGlvbiBTcGhlcmUkJDEoKSB7XG4gICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBTcGhlcmUkJDEpO1xuXG4gICAgcmV0dXJuIHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgZ2V0UHJvdG90eXBlT2YkMihTcGhlcmUkJDEpLmNhbGwodGhpcywgcGFyYW1zLCBTcGhlcmUkJDEuZGVmYXVsdHMsIFNwaGVyZSQkMS5pbnN0cnVjdGlvbnMpKTtcbiAgfVxuICAvKipcbiAgICogQG1ldGhvZCBidWlsZFxuICAgKiBAZGVzY3JpcHRpb24gQnVpbGQgbGlmZWN5Y2xlIGNyZWF0ZXMgYSBtZXNoIHVzaW5nIGlucHV0IHBhcmFtcy5cbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBDb21wb25lbnQgcGFyYW1ldGVycy5cbiAgICogQHJldHVybiB7VEhSRUUuTWVzaH0gQnVpbHQgbWVzaFxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLlNwaGVyZVxuICAgKi9cblxuXG4gIGNyZWF0ZUNsYXNzKFNwaGVyZSQkMSwgW3tcbiAgICBrZXk6IFwiYnVpbGRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYnVpbGQoKSB7XG4gICAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB0aGlzLnBhcmFtcztcblxuICAgICAgdmFyIF90aGlzJGFwcGx5QnJpZGdlID0gdGhpcy5hcHBseUJyaWRnZSh7XG4gICAgICAgIGdlb21ldHJ5OiB0aGlzLmJ1aWxkR2VvbWV0cnkocGFyYW1zKSxcbiAgICAgICAgbWF0ZXJpYWw6IHBhcmFtcy5tYXRlcmlhbFxuICAgICAgfSksXG4gICAgICAgICAgZ2VvbWV0cnkgPSBfdGhpcyRhcHBseUJyaWRnZS5nZW9tZXRyeSxcbiAgICAgICAgICBtYXRlcmlhbCA9IF90aGlzJGFwcGx5QnJpZGdlLm1hdGVyaWFsO1xuXG4gICAgICByZXR1cm4gdGhpcy5hcHBseUJyaWRnZSh7XG4gICAgICAgIG1lc2g6IG5ldyBNZXNoKGdlb21ldHJ5LCBtYXRlcmlhbClcbiAgICAgIH0pLm1lc2g7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImJ1aWxkR2VvbWV0cnlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYnVpbGRHZW9tZXRyeSgpIHtcbiAgICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgICAgdmFyIGdlb21ldHJ5ID0gbmV3IChwYXJhbXMuYnVmZmVyID8gU3BoZXJlQnVmZmVyR2VvbWV0cnkgOiBTcGhlcmVHZW9tZXRyeSkocGFyYW1zLmdlb21ldHJ5LnJhZGl1cywgcGFyYW1zLmdlb21ldHJ5LndpZHRoU2VnbWVudHMsIHBhcmFtcy5nZW9tZXRyeS5oZWlnaHRTZWdtZW50cyk7XG4gICAgICByZXR1cm4gZ2VvbWV0cnk7XG4gICAgfVxuICB9XSk7XG5cbiAgaW5oZXJpdHMoU3BoZXJlJCQxLCBfTWVzaENvbXBvbmVudCk7XG5cbiAgcmV0dXJuIFNwaGVyZSQkMTtcbn0oTWVzaENvbXBvbmVudCk7XG5cbmRlZmluZVByb3BlcnR5JDMoZGVmaW5lUHJvcGVydHkkMyhTcGhlcmUkMSwgXCJkZWZhdWx0c1wiLCBvYmplY3RTcHJlYWQoe30sIE1lc2hDb21wb25lbnQuZGVmYXVsdHMsIHtcbiAgZ2VvbWV0cnk6IHtcbiAgICByYWRpdXM6IDEsXG4gICAgd2lkdGhTZWdtZW50czogOCxcbiAgICBoZWlnaHRTZWdtZW50czogNlxuICB9XG59KSksIFwiaW5zdHJ1Y3Rpb25zXCIsIG9iamVjdFNwcmVhZCh7fSwgTWVzaENvbXBvbmVudC5pbnN0cnVjdGlvbnMsIHtcbiAgZ2VvbWV0cnk6IFsncmFkaXVzJywgJ3dpZHRoU2VnbWVudHMnLCAnaGVpZ2h0U2VnbWVudHMnXVxufSkpO1xuXG4vKipcbiAqIEBjbGFzcyBUZXRyYWhlZHJvblxuICogQGNhdGVnb3J5IGNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZGVzY3JpcHRpb24gSW4gZ2VvbWV0cnksIGEgdGV0cmFoZWRyb24gaXMgYSBwb2x5aGVkcm9uIGNvbXBvc2VkIG9mIGZvdXIgdHJpYW5ndWxhciBmYWNlcywgc2l4IHN0cmFpZ2h0IGVkZ2VzLCBhbmQgZm91ciB2ZXJ0ZXggY29ybmVycy5cbiAqIFRoZSB0ZXRyYWhlZHJvbiBpcyB0aGUgc2ltcGxlc3Qgb2YgYWxsIHRoZSBvcmRpbmFyeSBjb252ZXggcG9seWhlZHJhIGFuZCB0aGUgb25seSBvbmUgdGhhdCBoYXMgZmV3ZXIgdGhhbiA1IGZhY2VzLlxuICogPGJyLz48YnIvPlxuICogYFRldHJhaGVkcm9uYCBjcmVhdGVzIGEgVGV0cmFoZWRyb24gb2JqZWN0IGJ5IGl0cyBgcmFkaXVzYCBhbmQgYGRldGFpbGBcbiAqIEBjbGFzc0Rlc2NcbiAqIDxpZnJhbWUgc3JjPVwiaHR0cHM6Ly90aHJlZWpzLm9yZy9kb2NzL3NjZW5lcy9nZW9tZXRyeS1icm93c2VyLmh0bWwjVGV0cmFoZWRyb25HZW9tZXRyeVwiPjwvaWZyYW1lPlxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXNdIC0gVGhlIHBhcmFtcy5cbiAqIEBleHRlbmRzIG1vZHVsZTpjb3JlLk1lc2hDb21wb25lbnRcbiAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXNcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkNyZWF0aW5nIGEgVGV0cmFoZWRyb24sIGFuZCBhZGRpbmcgaXQgdG8gYXBwPC9jYXB0aW9uPlxuICogbmV3IFRldHJhaGVkcm9uKHtcbiAqICAgZ2VvbWV0cnk6IHtcbiAqICAgICByYWRpdXM6IDIsXG4gKiAgICAgZGV0YWlsOiAxXG4gKiAgIH0sXG4gKlxuICogICBtYXRlcmlhbDogbmV3IFRIUkVFLk1lc2hCYXNpY01hdGVyaWFsKHtcbiAqICAgICBjb2xvcjogMHhmZmZmZmZcbiAqICAgfSksXG4gKlxuICogICBwb3NpdGlvbjoge1xuICogICAgIHg6IDAsXG4gKiAgICAgeTogMTAwLFxuICogICAgIHo6IDBcbiAqICAgfVxuICogfSkuYWRkVG8oYXBwKTtcbiAqL1xuXG52YXIgVGV0cmFoZWRyb24gPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9NZXNoQ29tcG9uZW50KSB7XG4gIC8qKlxuICAgKiBEZWZhdWx0IHZhbHVlcyBmb3IgcGFyYW1ldGVyc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5UZXRyYWhlZHJvbiNkZWZhdWx0c1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IDxwcmU+XG4gICAqIHtcbiAgICogICBnZW9tZXRyeToge1xuICAgKiAgICAgcmFkaXVzOiAxLFxuICAgKiAgICAgZGV0YWlsOiAwXG4gICAqIH1cbiAgICogPC9wcmU+XG4gICAqL1xuXG4gIC8qKlxuICAgKiBJbnN0cnVjdGlvbnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuVGV0cmFoZWRyb24jaW5zdHJ1Y3Rpb25zXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHQgPHByZT5cbiAgICoge1xuICAgKiAgIGdlb21ldHJ5OiBbJ3JhZGl1cycsICdkZXRhaWwnXVxuICAgKiB9XG4gICAqIDwvcHJlPlxuICAgKi9cbiAgZnVuY3Rpb24gVGV0cmFoZWRyb24oKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBUZXRyYWhlZHJvbik7XG5cbiAgICBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgZ2V0UHJvdG90eXBlT2YkMihUZXRyYWhlZHJvbikuY2FsbCh0aGlzLCBwYXJhbXMsIFRldHJhaGVkcm9uLmRlZmF1bHRzLCBUZXRyYWhlZHJvbi5pbnN0cnVjdGlvbnMpKTtcblxuICAgIGlmIChwYXJhbXMuYnVpbGQpIHtcbiAgICAgIF90aGlzLmJ1aWxkKHBhcmFtcyk7XG5cbiAgICAgIGdldCQzKGdldFByb3RvdHlwZU9mJDIoVGV0cmFoZWRyb24ucHJvdG90eXBlKSwgXCJ3cmFwXCIsIGFzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcykpLmNhbGwoYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG4gIC8qKlxuICAgKiBAbWV0aG9kIGJ1aWxkXG4gICAqIEBkZXNjcmlwdGlvbiBCdWlsZCBsaWZlY3ljbGUgY3JlYXRlcyBhIG1lc2ggdXNpbmcgaW5wdXQgcGFyYW1zLlxuICAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIENvbXBvbmVudCBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJuIHtUSFJFRS5NZXNofSBCdWlsdCBtZXNoXG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuVGV0cmFoZWRyb25cbiAgICovXG5cblxuICBjcmVhdGVDbGFzcyhUZXRyYWhlZHJvbiwgW3tcbiAgICBrZXk6IFwiYnVpbGRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYnVpbGQoKSB7XG4gICAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB0aGlzLnBhcmFtcztcblxuICAgICAgdmFyIF90aGlzJGFwcGx5QnJpZGdlID0gdGhpcy5hcHBseUJyaWRnZSh7XG4gICAgICAgIGdlb21ldHJ5OiB0aGlzLmJ1aWxkR2VvbWV0cnkocGFyYW1zKSxcbiAgICAgICAgbWF0ZXJpYWw6IHBhcmFtcy5tYXRlcmlhbFxuICAgICAgfSksXG4gICAgICAgICAgZ2VvbWV0cnkgPSBfdGhpcyRhcHBseUJyaWRnZS5nZW9tZXRyeSxcbiAgICAgICAgICBtYXRlcmlhbCA9IF90aGlzJGFwcGx5QnJpZGdlLm1hdGVyaWFsO1xuXG4gICAgICByZXR1cm4gdGhpcy5hcHBseUJyaWRnZSh7XG4gICAgICAgIG1lc2g6IG5ldyBNZXNoKGdlb21ldHJ5LCBtYXRlcmlhbClcbiAgICAgIH0pLm1lc2g7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImJ1aWxkR2VvbWV0cnlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYnVpbGRHZW9tZXRyeSgpIHtcbiAgICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgICAgcmV0dXJuIG5ldyAocGFyYW1zLmJ1ZmZlciA/IFRldHJhaGVkcm9uQnVmZmVyR2VvbWV0cnkgOiBUZXRyYWhlZHJvbkdlb21ldHJ5KShwYXJhbXMuZ2VvbWV0cnkucmFkaXVzLCBwYXJhbXMuZ2VvbWV0cnkuZGV0YWlsKTtcbiAgICB9XG4gIH1dKTtcblxuICBpbmhlcml0cyhUZXRyYWhlZHJvbiwgX01lc2hDb21wb25lbnQpO1xuXG4gIHJldHVybiBUZXRyYWhlZHJvbjtcbn0oTWVzaENvbXBvbmVudCk7XG5cbmRlZmluZVByb3BlcnR5JDMoZGVmaW5lUHJvcGVydHkkMyhUZXRyYWhlZHJvbiwgXCJkZWZhdWx0c1wiLCBvYmplY3RTcHJlYWQoe30sIE1lc2hDb21wb25lbnQuZGVmYXVsdHMsIHtcbiAgZ2VvbWV0cnk6IHtcbiAgICByYWRpdXM6IDEsXG4gICAgZGV0YWlsOiAwXG4gIH1cbn0pKSwgXCJpbnN0cnVjdGlvbnNcIiwgb2JqZWN0U3ByZWFkKHt9LCBNZXNoQ29tcG9uZW50Lmluc3RydWN0aW9ucywge1xuICBnZW9tZXRyeTogWydyYWRpdXMnLCAnZGV0YWlsJ11cbn0pKTtcblxuLyoqXG4gKiBAY2xhc3MgVGV4dFxuICogQGNhdGVnb3J5IGNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZGVzY3JpcHRpb24gVGV4dCBjbGFzcyBpcyBtYWRlIGZvciBjcmVhdGluZyAzRCB0ZXh0IG9iamVjdHMuXG4gKiBAY2xhc3NEZXNjXG4gKiA8aWZyYW1lIHNyYz1cImh0dHBzOi8vdGhyZWVqcy5vcmcvZG9jcy9zY2VuZXMvZ2VvbWV0cnktYnJvd3Nlci5odG1sI1RleHRHZW9tZXRyeVwiPjwvaWZyYW1lPlxuICogPGJyLz48YnIvPlxuICogUGh5c2ljcyB0ZXh0IG9iamVjdCBjYW4gYmUgY29udmV4IG9yIGNvbmNhdmUuIEJ5IGRlZmF1bHQgaXQncyBjb252ZXggYnV0IHlvdSBjYW4gYWxzbyBzd2l0Y2ggdG8gY29uY2F2ZS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zXSAtIFRoZSBwYXJhbXMuXG4gKiBAZXh0ZW5kcyBtb2R1bGU6Y29yZS5NZXNoQ29tcG9uZW50XG4gKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5DcmVhdGluZyBhIFRleHQsIGFuZCBhZGRpbmcgaXQgdG8gYXBwPC9jYXB0aW9uPlxuICogbmV3IFRleHQoe1xuICogICAgIHRleHQ6ICdTb21lIHRleHQnLFxuICogICAgIHBhcmFtZXRlcnM6IHtcbiAqICAgICAgIGZvbnQ6ICdwYXRoL3RvL2ZvbnQudHlwZWZhY2UuanMnLFxuICogICAgICAgc2l6ZTogMjAsXG4gKiAgICAgICBoZWlnaHQ6IDUsXG4gKiAgICAgICBjdXJ2ZVNlZ21lbnRzOiA2XG4gKiAgICAgfVxuICogICB9LFxuICpcbiAqICAgbWF0ZXJpYWw6IG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCh7XG4gKiAgICAgY29sb3I6IDB4ZmZmZmZmXG4gKiAgIH0pLFxuICpcbiAqICAgcG9zaXRpb246IHtcbiAqICAgICB4OiAtNDAsXG4gKiAgICAgeTogMjAsXG4gKiAgICAgejogMFxuICogICB9XG4gKiB9KS5hZGRUbyhhcHApO1xuICovXG5cbnZhciBUZXh0ID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfTWVzaENvbXBvbmVudCkge1xuICBjcmVhdGVDbGFzcyhUZXh0LCBudWxsLCBbe1xuICAgIGtleTogXCJsb2FkXCIsXG5cbiAgICAvKipcbiAgICAgKiBEZWZhdWx0IHZhbHVlcyBmb3IgcGFyYW1ldGVyc1xuICAgICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLlRleHQjZGVmYXVsdHNcbiAgICAgKiBAc3RhdGljXG4gICAgICogQGRlZmF1bHQgPHByZT5cbiAgICAgKiB7XG4gICAgICogICB0ZXh0OiAnSGVsbG8gV29ybGQhJyxcbiAgICAgKiAgIGZvbnQ6IG51bGwsXG4gICAgICpcbiAgICAgKiAgIGdlb21ldHJ5OiB7XG4gICAgICogICAgIHNpemU6IDEyLFxuICAgICAqICAgICBoZWlnaHQ6IDUwLFxuICAgICAqICAgICBjdXJ2ZVNlZ21lbnRzOiAxMixcbiAgICAgKiAgICAgZm9udDogbmV3IEZvbnQoKSxcbiAgICAgKiAgICAgYmV2ZWxFbmFibGVkOiBmYWxzZSxcbiAgICAgKiAgICAgYmV2ZWxUaGlja25lc3M6IDEwLFxuICAgICAqICAgICBiZXZlbFNpemU6IDhcbiAgICAgKiAgIH1cbiAgICAgKiB9XG4gICAgICogPC9wcmU+XG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBEZWZhdWx0IEZvbnRMb2FkZXJcbiAgICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5UZXh0I2xvYWRlclxuICAgICAqIEBzdGF0aWNcbiAgICAgKiBAZGVmYXVsdCBuZXcgRm9udExvYWRlcigpXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBAbWV0aG9kIGxvYWRcbiAgICAgKiBAc3RhdGljXG4gICAgICogQGRlc2NyaXB0aW9uIGxvYWQoKSBwcmVsb2FkcyBhIEZvbnQgb2JqZWN0IGFuZCByZXR1cm5zIGEgUHJvbWlzZSB3aXRoIGl0LlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBwYXRoIFBhdGggdG8gdGhlIGZvbnRcbiAgICAgKiBAcmV0dXJuIHtQcm9taXNlfSBBIHByb21pc2UgcmVzb2x2ZWQgd2l0aCBhIGZvbnRcbiAgICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLlRleHRcbiAgICAgKi9cbiAgICB2YWx1ZTogZnVuY3Rpb24gbG9hZChwYXRoKSB7XG4gICAgICB2YXIgbG9hZGVyID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBUZXh0LmxvYWRlcjtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgICBsb2FkZXIubG9hZChwYXRoLCByZXNvbHZlKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfV0pO1xuXG4gIGZ1bmN0aW9uIFRleHQoKSB7XG4gICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBUZXh0KTtcblxuICAgIHJldHVybiBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIGdldFByb3RvdHlwZU9mJDIoVGV4dCkuY2FsbCh0aGlzLCBwYXJhbXMsIFRleHQuZGVmYXVsdHMsIFRleHQuaW5zdHJ1Y3Rpb25zKSk7XG4gIH1cbiAgLyoqXG4gICAqIEBtZXRob2QgYnVpbGRcbiAgICogQGRlc2NyaXB0aW9uIEJ1aWxkIGlzIGNhbGxlZCBhcyBwYXJ0IG9mIHRoZSBsaWZlY3ljbGUgdG8gY3JlYXRlIGEgbWVzaCB1c2luZyBpbnB1dCBwYXJhbXMuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgQ29tcG9uZW50IHBhcmFtZXRlcnMuXG4gICAqIEByZXR1cm4ge1RIUkVFLk1lc2h9IEJ1aWx0IG1lc2hcbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5UZXh0XG4gICAqL1xuXG5cbiAgY3JlYXRlQ2xhc3MoVGV4dCwgW3tcbiAgICBrZXk6IFwiYnVpbGRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYnVpbGQoKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB0aGlzLnBhcmFtcztcbiAgICAgIHZhciBwcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgKHBhcmFtcy5mb250IGluc3RhbmNlb2YgUHJvbWlzZSA/IHBhcmFtcy5mb250IDogUHJvbWlzZS5yZXNvbHZlKHBhcmFtcy5mb250KSkudGhlbihmdW5jdGlvbiAoZm9udCkge1xuICAgICAgICAgIHZhciBfdGhpcyRhcHBseUJyaWRnZSA9IF90aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgICAgICAgIGdlb21ldHJ5OiBuZXcgVGV4dEdlb21ldHJ5KHBhcmFtcy50ZXh0LCBPYmplY3QuYXNzaWduKHBhcmFtcy5nZW9tZXRyeSwge1xuICAgICAgICAgICAgICBmb250OiBmb250XG4gICAgICAgICAgICB9KSksXG4gICAgICAgICAgICBtYXRlcmlhbDogcGFyYW1zLm1hdGVyaWFsXG4gICAgICAgICAgfSksXG4gICAgICAgICAgICAgIGdlb21ldHJ5ID0gX3RoaXMkYXBwbHlCcmlkZ2UuZ2VvbWV0cnksXG4gICAgICAgICAgICAgIG1hdGVyaWFsID0gX3RoaXMkYXBwbHlCcmlkZ2UubWF0ZXJpYWw7XG5cbiAgICAgICAgICByZXNvbHZlKF90aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgICAgICAgIG1lc2g6IG5ldyBNZXNoKGdlb21ldHJ5LCBtYXRlcmlhbClcbiAgICAgICAgICB9KS5tZXNoKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgZ2V0JDMoZ2V0UHJvdG90eXBlT2YkMihUZXh0LnByb3RvdHlwZSksIFwid2FpdFwiLCB0aGlzKS5jYWxsKHRoaXMsIHByb21pc2UpO1xuXG4gICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9XG4gIH1dKTtcblxuICBpbmhlcml0cyhUZXh0LCBfTWVzaENvbXBvbmVudCk7XG5cbiAgcmV0dXJuIFRleHQ7XG59KE1lc2hDb21wb25lbnQpO1xuXG5kZWZpbmVQcm9wZXJ0eSQzKGRlZmluZVByb3BlcnR5JDMoZGVmaW5lUHJvcGVydHkkMyhUZXh0LCBcImRlZmF1bHRzXCIsIG9iamVjdFNwcmVhZCh7fSwgTWVzaENvbXBvbmVudC5kZWZhdWx0cywge1xuICB0ZXh0OiAnSGVsbG8gV29ybGQhJyxcbiAgZm9udDogbnVsbCxcbiAgZ2VvbWV0cnk6IHtcbiAgICBzaXplOiAxMixcbiAgICBoZWlnaHQ6IDUwLFxuICAgIGN1cnZlU2VnbWVudHM6IDEyLFxuICAgIGZvbnQ6IG5ldyBGb250KCksXG4gICAgYmV2ZWxFbmFibGVkOiBmYWxzZSxcbiAgICBiZXZlbFRoaWNrbmVzczogMTAsXG4gICAgYmV2ZWxTaXplOiA4XG4gIH1cbn0pKSwgXCJpbnN0cnVjdGlvbnNcIiwgb2JqZWN0U3ByZWFkKHt9LCBNZXNoQ29tcG9uZW50Lmluc3RydWN0aW9ucykpLCBcImxvYWRlclwiLCBuZXcgRm9udExvYWRlcigpKTtcblxuLyoqXG4gKiBAY2xhc3MgVG9ydXNcbiAqIEBjYXRlZ29yeSBjb21wb25lbnRzL21lc2hlc1xuICogQGRlc2NyaXB0aW9uIFRvcnVzIGNsYXNzIG1ha2VzIGEgdG9ydXMgZmlndXJlLiBBIGRvbnV0IGlzIGEgdG9ydXMuXG4gKiBAY2xhc3NEZXNjXG4gKiA8aWZyYW1lIHNyYz1cImh0dHBzOi8vdGhyZWVqcy5vcmcvZG9jcy9pbmRleC5odG1sI2FwaS9nZW9tZXRyaWVzL1RvcnVzR2VvbWV0cnlcIj48L2lmcmFtZT5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zXSAtIFRoZSBwYXJhbXMuXG4gKiBAZXh0ZW5kcyBtb2R1bGU6Y29yZS5NZXNoQ29tcG9uZW50XG4gKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5DcmVhdGluZyBhIFRvcnVzLCBhbmQgYWRkaW5nIGl0IHRvIGFwcDwvY2FwdGlvbj5cbiAqIG5ldyBUb3J1cyh7XG4gKiAgIGdlb21ldHJ5OiB7XG4gKiAgICAgcmFkaXVzOiA1LFxuICogICAgIHR1YmU6IDJcbiAqICAgfSxcbiAqXG4gKiAgIG1hdGVyaWFsOiBuZXcgVEhSRUUuTWVzaEJhc2ljTWF0ZXJpYWwoe1xuICogICAgIGNvbG9yOiAweGZmZmZmZlxuICogICB9KSxcbiAqXG4gKiAgIHBvc2l0aW9uOiB7XG4gKiAgICAgeTogMzVcbiAqICAgfVxuICogfSkuYWRkVG8oYXBwKTtcbiAqL1xuXG52YXIgVG9ydXMgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9NZXNoQ29tcG9uZW50KSB7XG4gIC8qKlxuICAgKiBEZWZhdWx0IHZhbHVlcyBmb3IgcGFyYW1ldGVyc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5Ub3J1cyNkZWZhdWx0c1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IDxwcmU+XG4gICAqIHtcbiAgICogICBnZW9tZXRyeToge1xuICAgKiAgICAgcmFkaXVzOiAxMDAsXG4gICAqICAgICB0dWJlOiA0MCxcbiAgICogICAgIHJhZGlhbFNlZ21lbnRzOiA4LFxuICAgKiAgICAgdHVidWxhclNlZ21lbnRzOiA2LFxuICAgKiAgICAgYXJjOiBNYXRoLlBJICogMlxuICAgKiAgIH1cbiAgICogfVxuICAgKiA8L3ByZT5cbiAgICovXG5cbiAgLyoqXG4gICAqIEluc3RydWN0aW9uc1xuICAgKiBAbWVtYmVyIHtPYmplY3R9IG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5Ub3J1cyNpbnN0cnVjdGlvbnNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdCA8cHJlPlxuICAgKiB7XG4gICAqICAgZ2VvbWV0cnk6IFtcbiAgICogICAgICdyYWRpdXMnLFxuICAgKiAgICAgJ3R1YmUnLFxuICAgKiAgICAgJ3JhZGlhbFNlZ21lbnRzJyxcbiAgICogICAgICd0dWJ1bGFyU2VnbWVudHMnLFxuICAgKiAgICAgJ2FyYydcbiAgICogICBdXG4gICAqIH1cbiAgICogPC9wcmU+XG4gICAqL1xuICBmdW5jdGlvbiBUb3J1cygpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIFRvcnVzKTtcblxuICAgIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBnZXRQcm90b3R5cGVPZiQyKFRvcnVzKS5jYWxsKHRoaXMsIHBhcmFtcywgVG9ydXMuZGVmYXVsdHMsIFRvcnVzLmluc3RydWN0aW9ucykpO1xuXG4gICAgaWYgKHBhcmFtcy5idWlsZCkge1xuICAgICAgX3RoaXMuYnVpbGQocGFyYW1zKTtcblxuICAgICAgZ2V0JDMoZ2V0UHJvdG90eXBlT2YkMihUb3J1cy5wcm90b3R5cGUpLCBcIndyYXBcIiwgYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSkuY2FsbChhc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgLyoqXG4gICAqIEBtZXRob2QgYnVpbGRcbiAgICogQGRlc2NyaXB0aW9uIEJ1aWxkIGxpZmVjeWNsZSBjcmVhdGVzIGEgbWVzaCB1c2luZyBpbnB1dCBwYXJhbXMuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgQ29tcG9uZW50IHBhcmFtZXRlcnMuXG4gICAqIEByZXR1cm4ge1RIUkVFLk1lc2h9IEJ1aWx0IG1lc2hcbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5Ub3J1c1xuICAgKi9cblxuXG4gIGNyZWF0ZUNsYXNzKFRvcnVzLCBbe1xuICAgIGtleTogXCJidWlsZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBidWlsZCgpIHtcbiAgICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHRoaXMucGFyYW1zO1xuXG4gICAgICB2YXIgX3RoaXMkYXBwbHlCcmlkZ2UgPSB0aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgICAgZ2VvbWV0cnk6IHRoaXMuYnVpbGRHZW9tZXRyeShwYXJhbXMpLFxuICAgICAgICBtYXRlcmlhbDogcGFyYW1zLm1hdGVyaWFsXG4gICAgICB9KSxcbiAgICAgICAgICBnZW9tZXRyeSA9IF90aGlzJGFwcGx5QnJpZGdlLmdlb21ldHJ5LFxuICAgICAgICAgIG1hdGVyaWFsID0gX3RoaXMkYXBwbHlCcmlkZ2UubWF0ZXJpYWw7XG5cbiAgICAgIHJldHVybiB0aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgICAgbWVzaDogbmV3IE1lc2goZ2VvbWV0cnksIG1hdGVyaWFsKVxuICAgICAgfSkubWVzaDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYnVpbGRHZW9tZXRyeVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBidWlsZEdlb21ldHJ5KCkge1xuICAgICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgICByZXR1cm4gbmV3IFRvcnVzR2VvbWV0cnkocGFyYW1zLmdlb21ldHJ5LnJhZGl1cywgcGFyYW1zLmdlb21ldHJ5LnR1YmUsIHBhcmFtcy5nZW9tZXRyeS5yYWRpYWxTZWdtZW50cywgcGFyYW1zLmdlb21ldHJ5LnR1YnVsYXJTZWdtZW50cywgcGFyYW1zLmdlb21ldHJ5LmFyYyk7XG4gICAgfVxuICB9XSk7XG5cbiAgaW5oZXJpdHMoVG9ydXMsIF9NZXNoQ29tcG9uZW50KTtcblxuICByZXR1cm4gVG9ydXM7XG59KE1lc2hDb21wb25lbnQpO1xuXG5kZWZpbmVQcm9wZXJ0eSQzKGRlZmluZVByb3BlcnR5JDMoVG9ydXMsIFwiZGVmYXVsdHNcIiwgb2JqZWN0U3ByZWFkKHt9LCBNZXNoQ29tcG9uZW50LmRlZmF1bHRzLCB7XG4gIGdlb21ldHJ5OiB7XG4gICAgcmFkaXVzOiAxMDAsXG4gICAgdHViZTogNDAsXG4gICAgcmFkaWFsU2VnbWVudHM6IDgsXG4gICAgdHVidWxhclNlZ21lbnRzOiA2LFxuICAgIGFyYzogTWF0aC5QSSAqIDJcbiAgfVxufSkpLCBcImluc3RydWN0aW9uc1wiLCBvYmplY3RTcHJlYWQoe30sIE1lc2hDb21wb25lbnQuaW5zdHJ1Y3Rpb25zLCB7XG4gIGdlb21ldHJ5OiBbJ3JhZGl1cycsICd0dWJlJywgJ3JhZGlhbFNlZ21lbnRzJywgJ3R1YnVsYXJTZWdtZW50cycsICdhcmMnXVxufSkpO1xuXG4vKipcbiAqIEBjbGFzcyBUb3J1c2tub3RcbiAqIEBjYXRlZ29yeSBjb21wb25lbnRzL21lc2hlc1xuICogQGRlc2NyaXB0aW9uIFRvcnVza25vdCBjbGFzcyBtYWtlcyBhIHRvcnVza25vdCBmaWd1cmUuIEl0J3MgbGlrZSBhIGNyb29rZWQgZG9udXQsIHZlcnkgY3Jvb2tlZC5cbiAqIEBjbGFzc0Rlc2NcbiAqIDxpZnJhbWUgc3JjPVwiaHR0cHM6Ly90aHJlZWpzLm9yZy9kb2NzL3NjZW5lcy9nZW9tZXRyeS1icm93c2VyLmh0bWwjVG9ydXNLbm90R2VvbWV0cnlcIj48L2lmcmFtZT5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zXSAtIFRoZSBwYXJhbXMuXG4gKiBAZXh0ZW5kcyBtb2R1bGU6Y29yZS5NZXNoQ29tcG9uZW50XG4gKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5DcmVhdGluZyBhIFRvcnVza25vdCwgYW5kIGFkZGluZyBpdCB0byBhcHA8L2NhcHRpb24+XG4gKiBuZXcgVG9ydXNrbm90KHtcbiAqICAgZ2VvbWV0cnk6IHtcbiAqICAgICByYWRpdXM6NSxcbiAqICAgICB0dWJlOiAyXG4gKiAgIH0sXG4gKlxuICogICBtYXRlcmlhbDogbmV3IFRIUkVFLk1lc2hCYXNpY01hdGVyaWFsKHtcbiAqICAgICBjb2xvcjogMHhmZmZmZmZcbiAqICAgfSksXG4gKlxuICogICBwb3M6IHtcbiAqICAgICB5OiAxMDBcbiAqICAgfVxuICogfSkuYWRkVG8oYXBwKTtcbiAqL1xuXG52YXIgVG9ydXNrbm90ID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfTWVzaENvbXBvbmVudCkge1xuICAvKipcbiAgICogRGVmYXVsdCB2YWx1ZXMgZm9yIHBhcmFtZXRlcnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuVG9ydXNrbm90I2RlZmF1bHRzXG4gICAqIEBzdGF0aWNcbiAgICogQGRlZmF1bHQgPHByZT5cbiAgICoge1xuICAgKiAgIGdlb21ldHJ5OiB7XG4gICAqICAgICByYWRpdXM6IDEwMCxcbiAgICogICAgIHR1YmU6IDQwLFxuICAgKiAgICAgcmFkaWFsU2VnbWVudHM6IDY0LFxuICAgKiAgICAgdHVidWxhclNlZ21lbnRzOiA4LFxuICAgKiAgICAgcDogMixcbiAgICogICAgIHE6IDNcbiAgICogICB9XG4gICAqIH1cbiAgICogPC9wcmU+XG4gICAqL1xuXG4gIC8qKlxuICAgKiBJbnN0cnVjdGlvbnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuVG9ydXNrbm90I2luc3RydWN0aW9uc1xuICAgKiBAc3RhdGljXG4gICAqIEBkZWZhdWx0IDxwcmU+XG4gICAqIHtcbiAgICogICBnZW9tZXRyeTogW1xuICAgKiAgICAgJ3JhZGl1cycsXG4gICAqICAgICAndHViZScsXG4gICAqICAgICAncmFkaWFsU2VnbWVudHMnLFxuICAgKiAgICAgJ3R1YnVsYXJTZWdtZW50cycsXG4gICAqICAgICAncCcsXG4gICAqICAgICAncSdcbiAgICogICBdXG4gICAqIH1cbiAgICogPC9wcmU+XG4gICAqL1xuICBmdW5jdGlvbiBUb3J1c2tub3QoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBUb3J1c2tub3QpO1xuXG4gICAgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIGdldFByb3RvdHlwZU9mJDIoVG9ydXNrbm90KS5jYWxsKHRoaXMsIHBhcmFtcywgVG9ydXNrbm90LmRlZmF1bHRzLCBUb3J1c2tub3QuaW5zdHJ1Y3Rpb25zKSk7XG5cbiAgICBpZiAocGFyYW1zLmJ1aWxkKSB7XG4gICAgICBfdGhpcy5idWlsZChwYXJhbXMpO1xuXG4gICAgICBnZXQkMyhnZXRQcm90b3R5cGVPZiQyKFRvcnVza25vdC5wcm90b3R5cGUpLCBcIndyYXBcIiwgYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSkuY2FsbChhc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgLyoqXG4gICAqIEBtZXRob2QgYnVpbGRcbiAgICogQGRlc2NyaXB0aW9uIEJ1aWxkIGxpZmVjeWNsZSBjcmVhdGVzIGEgbWVzaCB1c2luZyBpbnB1dCBwYXJhbXMuXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgQ29tcG9uZW50IHBhcmFtZXRlcnMuXG4gICAqIEByZXR1cm4ge1RIUkVFLk1lc2h9IEJ1aWx0IG1lc2hcbiAgICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL21lc2hlcy5Ub3J1c2tub3RcbiAgICovXG5cblxuICBjcmVhdGVDbGFzcyhUb3J1c2tub3QsIFt7XG4gICAga2V5OiBcImJ1aWxkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGJ1aWxkKCkge1xuICAgICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogdGhpcy5wYXJhbXM7XG5cbiAgICAgIHZhciBfdGhpcyRhcHBseUJyaWRnZSA9IHRoaXMuYXBwbHlCcmlkZ2Uoe1xuICAgICAgICBnZW9tZXRyeTogdGhpcy5idWlsZEdlb21ldHJ5KHBhcmFtcyksXG4gICAgICAgIG1hdGVyaWFsOiBwYXJhbXMubWF0ZXJpYWxcbiAgICAgIH0pLFxuICAgICAgICAgIGdlb21ldHJ5ID0gX3RoaXMkYXBwbHlCcmlkZ2UuZ2VvbWV0cnksXG4gICAgICAgICAgbWF0ZXJpYWwgPSBfdGhpcyRhcHBseUJyaWRnZS5tYXRlcmlhbDtcblxuICAgICAgcmV0dXJuIHRoaXMuYXBwbHlCcmlkZ2Uoe1xuICAgICAgICBtZXNoOiBuZXcgTWVzaChnZW9tZXRyeSwgbWF0ZXJpYWwpXG4gICAgICB9KS5tZXNoO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJidWlsZEdlb21ldHJ5XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGJ1aWxkR2VvbWV0cnkoKSB7XG4gICAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcbiAgICAgIHZhciBHQ29uc3RydWN0ID0gcGFyYW1zLmJ1ZmZlciA/IFRvcnVzS25vdEJ1ZmZlckdlb21ldHJ5IDogVG9ydXNLbm90R2VvbWV0cnk7XG4gICAgICByZXR1cm4gbmV3IEdDb25zdHJ1Y3QocGFyYW1zLmdlb21ldHJ5LnJhZGl1cywgcGFyYW1zLmdlb21ldHJ5LnR1YmUsIHBhcmFtcy5nZW9tZXRyeS5yYWRpYWxTZWdtZW50cywgcGFyYW1zLmdlb21ldHJ5LnR1YnVsYXJTZWdtZW50cywgcGFyYW1zLmdlb21ldHJ5LnAsIHBhcmFtcy5nZW9tZXRyeS5xKTtcbiAgICB9XG4gIH1dKTtcblxuICBpbmhlcml0cyhUb3J1c2tub3QsIF9NZXNoQ29tcG9uZW50KTtcblxuICByZXR1cm4gVG9ydXNrbm90O1xufShNZXNoQ29tcG9uZW50KTtcblxuZGVmaW5lUHJvcGVydHkkMyhkZWZpbmVQcm9wZXJ0eSQzKFRvcnVza25vdCwgXCJkZWZhdWx0c1wiLCBvYmplY3RTcHJlYWQoe30sIE1lc2hDb21wb25lbnQuZGVmYXVsdHMsIHtcbiAgZ2VvbWV0cnk6IHtcbiAgICByYWRpdXM6IDEwMCxcbiAgICB0dWJlOiA0MCxcbiAgICByYWRpYWxTZWdtZW50czogNjQsXG4gICAgdHVidWxhclNlZ21lbnRzOiA4LFxuICAgIHA6IDIsXG4gICAgcTogM1xuICB9XG59KSksIFwiaW5zdHJ1Y3Rpb25zXCIsIG9iamVjdFNwcmVhZCh7fSwgTWVzaENvbXBvbmVudC5pbnN0cnVjdGlvbnMsIHtcbiAgZ2VvbWV0cnk6IFsncmFkaXVzJywgJ3R1YmUnLCAncmFkaWFsU2VnbWVudHMnLCAndHVidWxhclNlZ21lbnRzJywgJ3AnLCAncSddXG59KSk7XG5cbi8qKlxuICogQGNsYXNzIFR1YmVcbiAqIEBjYXRlZ29yeSBjb21wb25lbnRzL21lc2hlc1xuICogQGRlc2NyaXB0aW9uIFR1YmUgY2xhc3MgbWFrZXMgYSB0dWJlIHRoYXQgZXh0cnVkZXMgYWxvbmcgYSAzZCBjdXJ2ZS5cbiAqIEBjbGFzc0Rlc2NcbiAqIDxpZnJhbWUgc3JjPVwiaHR0cHM6Ly90aHJlZWpzLm9yZy9kb2NzL2luZGV4Lmh0bWwjYXBpL2dlb21ldHJpZXMvVHViZUdlb21ldHJ5XCI+PC9pZnJhbWU+XG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtc10gLSBUaGUgcGFyYW1zLlxuICogQGV4dGVuZHMgbW9kdWxlOmNvcmUuTWVzaENvbXBvbmVudFxuICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL21lc2hlc1xuICogQGV4YW1wbGUgPGNhcHRpb24+Q3JlYXRpbmcgYSBUdWJlIGZyb20gYSB0aHJlZS5qcyBDdXJ2ZSwgYW5kIGFkZGluZyBpdCB0byBhcHA8L2NhcHRpb24+XG4gKiBjb25zdCBDdXN0b21TaW5DdXJ2ZSA9IFRIUkVFLkN1cnZlLmNyZWF0ZShcbiAqICAgZnVuY3Rpb24gKHNjYWxlKSB7IC8vIGN1c3RvbSBjdXJ2ZSBjb25zdHJ1Y3RvclxuICogICAgIHRoaXMuc2NhbGUgPSAoc2NhbGUgPT09IHVuZGVmaW5lZCkgPyAxIDogc2NhbGU7XG4gKiAgIH0sXG4gKlxuICogICBmdW5jdGlvbiAodCkgeyAvLyBnZXRQb2ludDogdCBpcyBiZXR3ZWVuIDAtMVxuICogICAgIGNvbnN0IHR4ID0gdCAqIDMgLSAxLjUsXG4gKiAgICAgdHkgPSBNYXRoLnNpbiggMiAqIE1hdGguUEkgKiB0ICksXG4gKiAgICAgdHogPSAwO1xuICpcbiAqICAgICByZXR1cm4gbmV3IFRIUkVFLlZlY3RvcjModHgsIHR5LCB0eikubXVsdGlwbHlTY2FsYXIodGhpcy5zY2FsZSk7XG4gKiAgIH1cbiAqICk7XG4gKlxuICogY29uc3QgcGF0aCA9IG5ldyBDdXN0b21TaW5DdXJ2ZSgxMCk7XG4gKlxuICogbmV3IFR1YmUoe1xuICogICBnZW9tZXRyeToge1xuICogICAgIHBhdGg6IHBhdGhcbiAqICAgfSxcbiAqXG4gKiAgIG1hdGVyaWFsOiBuZXcgVEhSRUUuTWVzaEJhc2ljTWF0ZXJpYWwoe1xuICogICAgIGNvbG9yOiAweGZmZmZmZlxuICogICB9KVxuICogfSkuYWRkVG8oYXBwKTtcbiAqL1xuXG52YXIgVHViZSA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX01lc2hDb21wb25lbnQpIHtcbiAgLyoqXG4gICAqIERlZmF1bHQgdmFsdWVzIGZvciBwYXJhbWV0ZXJzXG4gICAqIEBtZW1iZXIge09iamVjdH0gbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLlR1YmUjZGVmYXVsdHNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdCA8cHJlPlxuICAgKiB7XG4gICAqICAgZ2VvbWV0cnk6IHtcbiAgICogICAgIHBhdGg6IG5ldyBUSFJFRS5MaW5lQ3VydmUzKG5ldyBWZWN0b3IzKDAsIDAsIDApLCBuZXcgVmVjdG9yMygwLCAwLCAxKSksXG4gICAqICAgICBzZWdtZW50czogMjAsXG4gICAqICAgICByYWRpdXM6IDIsXG4gICAqICAgICByYWRpdXNTZWdtZW50czogOCxcbiAgICogICAgIGNsb3NlZDogZmFsc2VcbiAgICogICB9XG4gICAqIH1cbiAgICogPC9wcmU+XG4gICAqL1xuXG4gIC8qKlxuICAgKiBJbnN0cnVjdGlvbnNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29tcG9uZW50cy9tZXNoZXMuVHViZSNpbnN0cnVjdGlvbnNcbiAgICogQHN0YXRpY1xuICAgKiBAZGVmYXVsdCA8cHJlPlxuICAgKiB7XG4gICAqICAgZ2VvbWV0cnk6IFtcbiAgICogICAgICdwYXRoJyxcbiAgICogICAgICdzZWdtZW50cycsXG4gICAqICAgICAncmFkaXVzJyxcbiAgICogICAgICdyYWRpdXNTZWdtZW50cycsXG4gICAqICAgICAnY2xvc2VkJ1xuICAgKiAgIF1cbiAgICogfVxuICAgKiA8L3ByZT5cbiAgICovXG4gIGZ1bmN0aW9uIFR1YmUoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBUdWJlKTtcblxuICAgIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBnZXRQcm90b3R5cGVPZiQyKFR1YmUpLmNhbGwodGhpcywgcGFyYW1zLCBUdWJlLmRlZmF1bHRzLCBUdWJlLmluc3RydWN0aW9ucykpO1xuXG4gICAgaWYgKHBhcmFtcy5idWlsZCkge1xuICAgICAgX3RoaXMuYnVpbGQocGFyYW1zKTtcblxuICAgICAgZ2V0JDMoZ2V0UHJvdG90eXBlT2YkMihUdWJlLnByb3RvdHlwZSksIFwid3JhcFwiLCBhc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpKS5jYWxsKGFzc2VydFRoaXNJbml0aWFsaXplZChfdGhpcykpO1xuICAgIH1cblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuICAvKipcbiAgICogQG1ldGhvZCBidWlsZFxuICAgKiBAZGVzY3JpcHRpb24gQnVpbGQgbGlmZWN5Y2xlIGNyZWF0ZXMgYSBtZXNoIHVzaW5nIGlucHV0IHBhcmFtcy5cbiAgICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBDb21wb25lbnQgcGFyYW1ldGVycy5cbiAgICogQHJldHVybiB7VEhSRUUuTWVzaH0gQnVpbHQgbWVzaFxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOmNvbXBvbmVudHMvbWVzaGVzLlR1YmVcbiAgICovXG5cblxuICBjcmVhdGVDbGFzcyhUdWJlLCBbe1xuICAgIGtleTogXCJidWlsZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBidWlsZCgpIHtcbiAgICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHRoaXMucGFyYW1zO1xuXG4gICAgICB2YXIgX3RoaXMkYXBwbHlCcmlkZ2UgPSB0aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgICAgZ2VvbWV0cnk6IHRoaXMuYnVpbGRHZW9tZXRyeShwYXJhbXMpLFxuICAgICAgICBtYXRlcmlhbDogcGFyYW1zLm1hdGVyaWFsXG4gICAgICB9KSxcbiAgICAgICAgICBnZW9tZXRyeSA9IF90aGlzJGFwcGx5QnJpZGdlLmdlb21ldHJ5LFxuICAgICAgICAgIG1hdGVyaWFsID0gX3RoaXMkYXBwbHlCcmlkZ2UubWF0ZXJpYWw7XG5cbiAgICAgIHJldHVybiB0aGlzLmFwcGx5QnJpZGdlKHtcbiAgICAgICAgbWVzaDogbmV3IE1lc2goZ2VvbWV0cnksIG1hdGVyaWFsKVxuICAgICAgfSkubWVzaDtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiYnVpbGRHZW9tZXRyeVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBidWlsZEdlb21ldHJ5KCkge1xuICAgICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgICB2YXIgZ2VvbWV0cnkgPSBuZXcgKHBhcmFtcy5idWZmZXIgPyBUdWJlQnVmZmVyR2VvbWV0cnkgOiBUdWJlR2VvbWV0cnkpKHBhcmFtcy5nZW9tZXRyeS5wYXRoLCBwYXJhbXMuZ2VvbWV0cnkuc2VnbWVudHMsIHBhcmFtcy5nZW9tZXRyeS5yYWRpdXMsIHBhcmFtcy5nZW9tZXRyeS5yYWRpdXNTZWdtZW50cywgcGFyYW1zLmdlb21ldHJ5LmNsb3NlZCk7XG4gICAgICByZXR1cm4gZ2VvbWV0cnk7XG4gICAgfVxuICB9XSk7XG5cbiAgaW5oZXJpdHMoVHViZSwgX01lc2hDb21wb25lbnQpO1xuXG4gIHJldHVybiBUdWJlO1xufShNZXNoQ29tcG9uZW50KTtcblxuZGVmaW5lUHJvcGVydHkkMyhkZWZpbmVQcm9wZXJ0eSQzKFR1YmUsIFwiZGVmYXVsdHNcIiwgb2JqZWN0U3ByZWFkKHt9LCBNZXNoQ29tcG9uZW50LmRlZmF1bHRzLCB7XG4gIGdlb21ldHJ5OiB7XG4gICAgcGF0aDogbmV3IExpbmVDdXJ2ZTMobmV3IFZlY3RvcjMoMCwgMCwgMCksIG5ldyBWZWN0b3IzKDAsIDAsIDEpKSxcbiAgICBzZWdtZW50czogMjAsXG4gICAgcmFkaXVzOiAyLFxuICAgIHJhZGl1c1NlZ21lbnRzOiA4LFxuICAgIGNsb3NlZDogZmFsc2VcbiAgfVxufSkpLCBcImluc3RydWN0aW9uc1wiLCBvYmplY3RTcHJlYWQoe30sIE1lc2hDb21wb25lbnQuaW5zdHJ1Y3Rpb25zLCB7XG4gIGdlb21ldHJ5OiBbJ3BhdGgnLCAnc2VnbWVudHMnLCAncmFkaXVzJywgJ3JhZGl1c1NlZ21lbnRzJywgJ2Nsb3NlZCddXG59KSk7XG5cbi8qKlxuICogQGNsYXNzIEdyb3VwXG4gKiBAY2F0ZWdvcnkgY29tcG9uZW50cy9tZXNoZXNcbiAqIEBkZXNjcmlwdGlvbiBTb21ldGltZXMgeW91IG5lZWQgdG8gbWFrZSBncm91cHMgb2Ygb2JqZWN0cyAoaXQncyBub3QgY29udmVuaWVudGx5IHRvIGFwcGx5IHRyYW5zZm9ybXMgdG8gZWFjaCBvYmplY3Qgd2hlbiBjYW4gbWFrZSBqdXN0IG9uZSB0byBhIGdyb3VwKS48YnIvPlxuICogSW4gVGhyZWUuanMgeW91IG1ha2UgaXQgdXNpbmcgYFRIUkVFLk9iamVjdDNEYCBhbmQgaXQncyBjaGlsZHJlbi4gPGJyLz48YnIvPlxuICogSW4gd2hzLmpzIHdlIGhhdmUgYEdyb3VwYFxuICogQGV4dGVuZHMgbW9kdWxlOmNvcmUuTWVzaENvbXBvbmVudFxuICogQG1lbWJlcm9mIG1vZHVsZTpjb21wb25lbnRzL21lc2hlc1xuICogQGV4YW1wbGUgPGNhcHRpb24+QXBwcm9hY2ggMiAtIEFkZGluZyBvYmplY3RzIHRvIGFuIGVtcHR5IGdyb3VwPC9jYXB0aW9uPlxuICogY29uc3Qgc3BoZXJlID0gbmV3IFNwaGVyZSgpO1xuICogY29uc3QgYm94ID0gbmV3IEJveCgpO1xuICogY29uc3QgZ3JvdXAgPSBuZXcgR3JvdXAoKTtcbiAqXG4gKiBzcGhlcmUuYWRkVG8oZ3JvdXApO1xuICogYm94LmFkZFRvKGdyb3VwKTtcbiogQGV4YW1wbGUgPGNhcHRpb24+QXBwcm9hY2ggMiAtIE1ha2luZyBhIGdyb3VwIGZyb20gb2JqZWN0czwvY2FwdGlvbj5cbiAqIGNvbnN0IHNwaGVyZSA9IG5ldyBTcGhlcmUoKTtcbiAqIGNvbnN0IGJveCA9IG5ldyBCb3goKTtcbiAqIGNvbnN0IGdyb3VwID0gbmV3IEdyb3VwKGJveCwgc3BoZXJlKTtcbiAqIC8vIE9SOiBjb25zdCBncm91cCA9IG5ldyBHcm91cChbYm94LCBzcGhlcmVdKTtcbiAqL1xuXG52YXIgR3JvdXAkMSA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX01lc2hDb21wb25lbnQpIHtcbiAgZnVuY3Rpb24gR3JvdXAkJDEoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgR3JvdXAkJDEpO1xuXG4gICAgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIGdldFByb3RvdHlwZU9mJDIoR3JvdXAkJDEpLmNhbGwodGhpcywge30pKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgb2JqID0gaSA8IDAgfHwgYXJndW1lbnRzLmxlbmd0aCA8PSBpID8gdW5kZWZpbmVkIDogYXJndW1lbnRzW2ldO1xuICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIENvbXBvbmVudCkgb2JqLmFkZFRvKGFzc2VydFRoaXNJbml0aWFsaXplZChhc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpKSk7ZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgT2JqZWN0M0QpIF90aGlzLm5hdGl2ZS5hZGQob2JqKTtcbiAgICB9XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBjcmVhdGVDbGFzcyhHcm91cCQkMSwgW3tcbiAgICBrZXk6IFwiYnVpbGRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYnVpbGQoKSB7XG4gICAgICByZXR1cm4gbmV3IE9iamVjdDNEKCk7XG4gICAgfVxuICB9XSk7XG5cbiAgaW5oZXJpdHMoR3JvdXAkJDEsIF9NZXNoQ29tcG9uZW50KTtcblxuICByZXR1cm4gR3JvdXAkJDE7XG59KE1lc2hDb21wb25lbnQpO1xuXG4vKiogQG1vZHVsZSBjb21wb25lbnRzL21lc2hlcyAqL1xuXG4vKipcbiAqIEBjbGFzcyBFbGVtZW50TW9kdWxlXG4gKiBAY2F0ZWdvcnkgbW9kdWxlcy9hcHBcbiAqIEBwYXJhbSB7T2JqZWN0fSBbY29udGFpbmVyPWRvY3VtZW50LmJvZHldIGNvbnRhaW5lciBpcyB0aGUgRE9NIG9iamVjdCB0byB3aGljaCBhcHBsaWNhdGlvbidzIGNhbnZhcyB3aWxsIGJlIGFkZGVkIHRvLlxuICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzL2FwcFxuICogQGV4YW1wbGUgPGNhcHRpb24+Q3JlYXRpbmcgYW4gZWxlbWVudCBtb2R1bGUsIHBhc3NpbmcgaXQgdG8gdGhlIEFwcDwvY2FwdGlvbj5cbiAqIG5ldyBBcHAoW1xuICogICBuZXcgRWxlbWVudE1vZHVsZShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXBwJykpXG4gKiBdKTtcbiAqL1xudmFyIEVsZW1lbnRNb2R1bGUgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBFbGVtZW50TW9kdWxlKCkge1xuICAgIHZhciBjb250YWluZXIgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IGRvY3VtZW50LmJvZHk7XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBFbGVtZW50TW9kdWxlKTtcblxuICAgIGlmIChjb250YWluZXIuY29udGFpbmVyKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ0VsZW1lbnRNb2R1bGUgbm93IGFjY2VwdHMgb25seSBhcmd1bWVudCB3aGljaCBpcyBhIERPTSBvYmplY3QsIG5vdCBhIHBhcmFtcyBvYmplY3QuJyk7XG4gICAgICB0aGlzLmNvbnRhaW5lciA9IGNvbnRhaW5lci5jb250YWluZXI7XG4gICAgfSBlbHNlIHRoaXMuY29udGFpbmVyID0gY29udGFpbmVyO1xuXG4gICAgdGhpcy5jcmVhdGVFbGVtZW50KCk7XG4gIH1cbiAgLyoqXG4gICAqIEBtZXRob2QgY3JlYXRlRWxlbWVudFxuICAgKiBAaW5zdGFuY2VcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBjYW52YXMgZWxlbWVudC5cbiAgICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzL2FwcC5FbGVtZW50TW9kdWxlXG4gICAqL1xuXG5cbiAgY3JlYXRlQ2xhc3MoRWxlbWVudE1vZHVsZSwgW3tcbiAgICBrZXk6IFwiY3JlYXRlRWxlbWVudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjcmVhdGVFbGVtZW50KCkge1xuICAgICAgdGhpcy5lbGVtZW50ID0gd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgdGhpcy5lbGVtZW50LmNsYXNzTmFtZSA9ICd3aHMtYXBwJztcbiAgICAgIHRoaXMuZWxlbWVudC5zdHlsZS53aWR0aCA9ICdpbmhlcml0JztcbiAgICAgIHRoaXMuZWxlbWVudC5zdHlsZS5oZWlnaHQgPSAnaW5oZXJpdCc7XG4gICAgICB0aGlzLmVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJtYW5hZ2VyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG1hbmFnZXIoX21hbmFnZXIpIHtcbiAgICAgIF9tYW5hZ2VyLnNldCgnZWxlbWVudCcsIHRoaXMuZWxlbWVudCk7XG5cbiAgICAgIF9tYW5hZ2VyLnNldCgnY29udGFpbmVyJywgdGhpcy5jb250YWluZXIpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpbnRlZ3JhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaW50ZWdyYXRlKHNlbGYpIHtcbiAgICAgIHNlbGYuY29udGFpbmVyLmFwcGVuZENoaWxkKHNlbGYuZWxlbWVudCk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEVsZW1lbnRNb2R1bGU7XG59KCk7XG5cbi8qKlxuICogQGNsYXNzIFJlbmRlcmluZ01vZHVsZVxuICogQGNhdGVnb3J5IG1vZHVsZXMvYXBwXG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtc11cbiAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9hcHBcbiAqIEBleGFtcGxlIDxjYXB0aW9uPiBDcmVhdGluZyBhIHJlbmRlcmluZyBtb2R1bGUgYW5kIHBhc3NpbmcgaXQgdG8gQXBwJ3MgbW9kdWxlczwvY2FwdGlvbj5cbiAqIG5ldyBBcHAoW1xuICogICBuZXcgRWxlbWVudE1vZHVsZSgpLFxuICogICBuZXcgU2NlbmVNb2R1bGUoKSxcbiAqICAgbmV3IERlZmluZU1vZHVsZSgnY2FtZXJhJywgbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKHtcbiAqICAgICBwb3NpdGlvbjogbmV3IFRIUkVFLlZlY3RvcjMoMCwgNiwgMTgpLFxuICogICAgIGZhcjogMTAwMDBcbiAqICAgfSkpLFxuICogICBuZXcgUmVuZGVyaW5nTW9kdWxlKHtcbiAqICAgICBiZ0NvbG9yOiAweDE2MjEyOSxcbiAqXG4gKiAgICAgcmVuZGVyZXI6IHtcbiAqICAgICAgIGFudGlhbGlhczogdHJ1ZVxuICogICAgIH1cbiAqICAgfSwge3NoYWRvdzogdHJ1ZX0pXG4gKiBdKTtcbiAqL1xuXG52YXIgUmVuZGVyaW5nTW9kdWxlID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uICgpIHtcbiAgLyoqXG4gICAqIGFkZGl0aW9uYWxcbiAgICogQGRlc2NyaXB0aW9uIGNvbGxlY3Rpb24gb2YgYWRkaXRpb25hbCBzY3JpcHRzXG4gICAqIEBzdGF0aWNcbiAgICogQG1lbWJlciB7T2JqZWN0fSBtb2R1bGU6Y29yZS5BcHAjYWRkaXRpb25hbFxuICAgKiBAcHVibGljXG4gICAqL1xuXG4gIC8qKlxuICAgKiBlbmFibGVkXG4gICAqIEBzdGF0aWNcbiAgICogQG1lbWJlciB7Qm9vbGVhbn0gbW9kdWxlOmNvcmUuQXBwI2VuYWJsZWRcbiAgICogQHB1YmxpY1xuICAgKi9cbiAgZnVuY3Rpb24gUmVuZGVyaW5nTW9kdWxlKCkge1xuICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgIHZhciBhZGRpdGlvbmFsID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQ7XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBSZW5kZXJpbmdNb2R1bGUpO1xuXG4gICAgZGVmaW5lUHJvcGVydHkkMyh0aGlzLCBcImVuYWJsZWRcIiwgdHJ1ZSk7XG5cbiAgICB0aGlzLnBhcmFtcyA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgd2lkdGg6IHdpbmRvdy5pbm5lcldpZHRoLFxuICAgICAgaGVpZ2h0OiB3aW5kb3cuaW5uZXJIZWlnaHQsXG4gICAgICByZXNvbHV0aW9uOiBuZXcgVmVjdG9yMigxLCAxKSxcbiAgICAgIHBpeGVsUmF0aW86IHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvLFxuICAgICAgYmdDb2xvcjogMHgwMDAwMDAsXG4gICAgICBiZ09wYWNpdHk6IDEsXG4gICAgICByZW5kZXJlcjoge30sXG4gICAgICBmaXg6IGZ1bmN0aW9uIGZpeCgpIHt9XG4gICAgfSwgcGFyYW1zKTtcbiAgICB2YXIgX3RoaXMkcGFyYW1zID0gdGhpcy5wYXJhbXMsXG4gICAgICAgIGJnQ29sb3IgPSBfdGhpcyRwYXJhbXMuYmdDb2xvcixcbiAgICAgICAgYmdPcGFjaXR5ID0gX3RoaXMkcGFyYW1zLmJnT3BhY2l0eSxcbiAgICAgICAgX3JlbmRlcmVyID0gX3RoaXMkcGFyYW1zLnJlbmRlcmVyLFxuICAgICAgICBwaXhlbFJhdGlvID0gX3RoaXMkcGFyYW1zLnBpeGVsUmF0aW8sXG4gICAgICAgIHdpZHRoID0gX3RoaXMkcGFyYW1zLndpZHRoLFxuICAgICAgICBoZWlnaHQgPSBfdGhpcyRwYXJhbXMuaGVpZ2h0LFxuICAgICAgICByZXNvbHV0aW9uID0gX3RoaXMkcGFyYW1zLnJlc29sdXRpb24sXG4gICAgICAgIGZpeCA9IF90aGlzJHBhcmFtcy5maXg7XG4gICAgdGhpcy5yZW5kZXJlciA9IG5ldyBXZWJHTFJlbmRlcmVyKF9yZW5kZXJlcik7XG4gICAgdGhpcy5lZmZlY3RzID0gW107XG4gICAgdGhpcy5yZW5kZXJlci5zZXRDbGVhckNvbG9yKGJnQ29sb3IsIGJnT3BhY2l0eSk7XG4gICAgaWYgKHBpeGVsUmF0aW8pIHRoaXMucmVuZGVyZXIuc2V0UGl4ZWxSYXRpbyhwaXhlbFJhdGlvKTtcbiAgICB0aGlzLnNldFNpemUoTnVtYmVyKHdpZHRoICogcmVzb2x1dGlvbi54KS50b0ZpeGVkKCksIE51bWJlcihoZWlnaHQgKiByZXNvbHV0aW9uLnkpLnRvRml4ZWQoKSk7XG5cbiAgICBmb3IgKHZhciBrZXkgaW4gYWRkaXRpb25hbCkge1xuICAgICAgaWYgKGFkZGl0aW9uYWxba2V5XSkgdGhpcy5hcHBseUFkZGl0aW9uYWwoa2V5KTtcbiAgICB9XG5cbiAgICBmaXgodGhpcy5yZW5kZXJlcik7XG4gIH1cbiAgLyoqXG4gICAqIEBtZXRob2QgYXBwbHlBZGRpdGlvbmFsXG4gICAqIEBkZXNjcmlwdGlvbiBBcHBseSBhZGRpdGlvbmFsIHNjcmlwdCBmcm9tIFJlbmRlcmluZ01vZHVsZS5hZGRpdGlvbmFsXG4gICAqIEBwYXJhbSB7U3Rpcm5nfSBuYW1lIFNjcmlwdCBuYW1lXG4gICAqIEByZXR1cm4ge3RoaXN9XG4gICAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9hcHAuUmVuZGVyaW5nTW9kdWxlXG4gICAqL1xuXG5cbiAgY3JlYXRlQ2xhc3MoUmVuZGVyaW5nTW9kdWxlLCBbe1xuICAgIGtleTogXCJhcHBseUFkZGl0aW9uYWxcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYXBwbHlBZGRpdGlvbmFsKG5hbWUpIHtcbiAgICAgIFJlbmRlcmluZ01vZHVsZS5hZGRpdGlvbmFsW25hbWVdLmFwcGx5KHRoaXMsIFt0aGlzLnJlbmRlcmVyXSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBtZXRob2QgaW50ZWdyYXRlUmVuZGVyZXJcbiAgICAgKiBAZGVzY3JpcHRpb24gSW50ZWdyYXRlIHJlbmRlcmVyXG4gICAgICogQHBhcmFtIHtOb2RlRWxlbWVudH0gZWxlbWVudCBET00gb2JqZWN0XG4gICAgICogQHBhcmFtIHtUSFJFRS5TY2VuZX0gc2NlbmUgdXNlZCBzY2VuZVxuICAgICAqIEBwYXJhbSB7VEhSRUUuQ2FtZXJhfSBjYW1lcmEgdXNlZCBjYW1lcmFcbiAgICAgKiBAcmV0dXJuIHtMb29wfSByZW5kZXJMb29wXG4gICAgICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzL2FwcC5SZW5kZXJpbmdNb2R1bGVcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImludGVncmF0ZVJlbmRlcmVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGludGVncmF0ZVJlbmRlcmVyKGVsZW1lbnQsIHNjZW5lLCBjYW1lcmEpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIHRoaXMuc2NlbmUgPSBzY2VuZTtcbiAgICAgIHRoaXMuY2FtZXJhID0gY2FtZXJhO1xuICAgICAgdGhpcy5hdHRhY2hUb0NhbnZhcyhlbGVtZW50KTtcbiAgICAgIHJldHVybiBuZXcgTG9vcChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfdGhpcy5yZW5kZXJlci5yZW5kZXIoX3RoaXMuc2NlbmUsIF90aGlzLmNhbWVyYSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQG1ldGhvZCBlZmZlY3RcbiAgICAgKiBAZGVzY3JpcHRpb24gQWRkIHRocmVlLmpzIGVmZmVjdFxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBlZmZlY3QgdGhyZWUuanMgZWZmZWN0XG4gICAgICogQHBhcmFtIHtmdW5jdGlvbn0gZWZmZWN0TG9vcCB1cGRhdGUgZnVuY3Rpb24gZm9yIGVmZmVjdFxuICAgICAqIEByZXR1cm4ge3RoaXN9XG4gICAgICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzL2FwcC5SZW5kZXJpbmdNb2R1bGVcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImVmZmVjdFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBlZmZlY3QoX2VmZmVjdCkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIHZhciBlZmZlY3RMb29wID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIF9lZmZlY3QucmVuZGVyKF90aGlzMi5zY2VuZSwgX3RoaXMyLmNhbWVyYSk7XG4gICAgICB9O1xuICAgICAgdGhpcy5yZW5kZXJMb29wLnN0b3AoKTtcbiAgICAgIHZhciBzaXplID0gdGhpcy5yZW5kZXJlci5nZXRTaXplKCk7XG5cbiAgICAgIF9lZmZlY3Quc2V0U2l6ZShzaXplLndpZHRoLCBzaXplLmhlaWdodCk7XG5cbiAgICAgIHZhciBsb29wID0gbmV3IExvb3AoZWZmZWN0TG9vcCk7XG4gICAgICB0aGlzLmVmZmVjdHMucHVzaChsb29wKTtcbiAgICAgIGlmICh0aGlzLmVuYWJsZWQpIGxvb3Auc3RhcnQodGhpcy5hcHApO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBtZXRob2Qgc2V0U2l6ZVxuICAgICAqIEBkZXNjcmlwdGlvbiBVcGRhdGUgcmVuZGVyIHRhcmdldCB3aWR0aCBhbmQgaGVpZ2h0LlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSB3aWR0aFxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBoZWlnaHRcbiAgICAgKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwLlJlbmRlcmluZ01vZHVsZVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwic2V0U2l6ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRTaXplKHdpZHRoLCBoZWlnaHQpIHtcbiAgICAgIGlmICh0aGlzLnJlbmRlcmVyKSB0aGlzLnJlbmRlcmVyLnNldFNpemUod2lkdGgsIGhlaWdodCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBtZXRob2QgYXR0YWNoVG9DYW52YXNcbiAgICAgKiBAZGVzY3JpcHRpb24gQXR0YWNoIHJlbmRlcmVyLmRvbUVsZW1lbnQgdG8gZWxlbWVudFxuICAgICAqIEBwYXJhbSB7Tm9kZUVsZW1lbnR9IGVsZW1lbnQgRE9NIG9iamVjdFxuICAgICAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9hcHAuUmVuZGVyaW5nTW9kdWxlXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJhdHRhY2hUb0NhbnZhc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhdHRhY2hUb0NhbnZhcyhlbGVtZW50KSB7XG4gICAgICB2YXIgY2FudmFzID0gdGhpcy5yZW5kZXJlci5kb21FbGVtZW50OyAvLyBhdHRhY2ggdG8gbmV3IHBhcmVudCB3b3JsZCBkb21cblxuICAgICAgZWxlbWVudC5hcHBlbmRDaGlsZChjYW52YXMpO1xuICAgICAgY2FudmFzLnN0eWxlLndpZHRoID0gJzEwMCUnO1xuICAgICAgY2FudmFzLnN0eWxlLmhlaWdodCA9ICcxMDAlJztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQG1ldGhvZCBzdG9wXG4gICAgICogQGRlc2NyaXB0aW9uIFN0b3BzIHJlbmRlckxvb3AgYW5kIGVmZmVjdCBsb29wc1xuICAgICAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9hcHAuUmVuZGVyaW5nTW9kdWxlXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJzdG9wXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHN0b3AoKSB7XG4gICAgICB0aGlzLmVuYWJsZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMucmVuZGVyTG9vcC5zdG9wKCk7XG4gICAgICB0aGlzLmVmZmVjdHMuZm9yRWFjaChmdW5jdGlvbiAobG9vcCkge1xuICAgICAgICByZXR1cm4gbG9vcC5zdG9wKCk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQG1ldGhvZCBwbGF5XG4gICAgICogQGRlc2NyaXB0aW9uIFJlc3VtZXMgcmVuZGVyTG9vcCBhbmQgZWZmZWN0IGxvb3BzXG4gICAgICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzL2FwcC5SZW5kZXJpbmdNb2R1bGVcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInBsYXlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcGxheSgpIHtcbiAgICAgIHRoaXMuZW5hYmxlZCA9IHRydWU7XG4gICAgICB0aGlzLnJlbmRlckxvb3Auc3RhcnQoKTtcbiAgICAgIHRoaXMuZWZmZWN0cy5mb3JFYWNoKGZ1bmN0aW9uIChsb29wKSB7XG4gICAgICAgIHJldHVybiBsb29wLnN0YXJ0KCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwibWFuYWdlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBtYW5hZ2VyKF9tYW5hZ2VyKSB7XG4gICAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgICAgX21hbmFnZXIuZGVmaW5lKCdyZW5kZXJpbmcnKTtcblxuICAgICAgX21hbmFnZXIuc2V0KCdyZW5kZXJlcicsIHRoaXMucmVuZGVyZXIpO1xuXG4gICAgICB0aGlzLmFwcCA9IF9tYW5hZ2VyLmhhbmRsZXI7XG4gICAgICB0aGlzLnJlbmRlckxvb3AgPSB0aGlzLmludGVncmF0ZVJlbmRlcmVyKF9tYW5hZ2VyLmdldCgnZWxlbWVudCcpLCBfbWFuYWdlci5nZXQoJ3NjZW5lJyksIF9tYW5hZ2VyLmdldCgnY2FtZXJhJykubmF0aXZlKTtcblxuICAgICAgX21hbmFnZXIudXBkYXRlKHtcbiAgICAgICAgZWxlbWVudDogZnVuY3Rpb24gZWxlbWVudChfZWxlbWVudCkge1xuICAgICAgICAgIF90aGlzMy5hdHRhY2hUb0NhbnZhcyhfZWxlbWVudCk7XG4gICAgICAgIH0sXG4gICAgICAgIHNjZW5lOiBmdW5jdGlvbiBzY2VuZShfc2NlbmUpIHtcbiAgICAgICAgICBfdGhpczMuc2NlbmUgPSBfc2NlbmU7XG4gICAgICAgIH0sXG4gICAgICAgIGNhbWVyYTogZnVuY3Rpb24gY2FtZXJhKF9jYW1lcmEpIHtcbiAgICAgICAgICBfdGhpczMuY2FtZXJhID0gX2NhbWVyYS5uYXRpdmU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpbnRlZ3JhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaW50ZWdyYXRlKHNlbGYpIHtcbiAgICAgIHZhciBfdGhpczQgPSB0aGlzO1xuXG4gICAgICBzZWxmLnJlbmRlckxvb3Auc3RhcnQodGhpcyk7XG4gICAgICBzZWxmLmVmZmVjdHMuZm9yRWFjaChmdW5jdGlvbiAobG9vcCkge1xuICAgICAgICByZXR1cm4gbG9vcC5zdGFydChfdGhpczQpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBtZXRob2QgZGlzcG9zZVxuICAgICAqIEBkZXNjcmlwdGlvbiBEaXNwb3NlIHJlbmRlcmluZyBjb250ZXh0XG4gICAgICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzL2FwcC5SZW5kZXJpbmdNb2R1bGVcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImRpc3Bvc2VcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZGlzcG9zZSgpIHtcbiAgICAgIHRoaXMuc3RvcCgpO1xuICAgICAgdGhpcy5yZW5kZXJlci5mb3JjZUNvbnRleHRMb3NzKCk7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFJlbmRlcmluZ01vZHVsZTtcbn0oKTtcblxuZGVmaW5lUHJvcGVydHkkMyhSZW5kZXJpbmdNb2R1bGUsIFwiYWRkaXRpb25hbFwiLCB7XG4gIHNoYWRvdzogZnVuY3Rpb24gc2hhZG93KHJlbmRlcmVyKSB7XG4gICAgcmVuZGVyZXIuc2hhZG93TWFwLmVuYWJsZWQgPSB0cnVlO1xuICB9XG59KTtcblxudmFyIFNZTUJPTF9DSElMRFJFTl9GT1JfU0NFTkUgPSBTeW1ib2woJ1NZTUJPTF9DSElMRFJFTl9GT1JfU0NFTkUnKTtcbi8qKlxuICogQGNsYXNzIFNjZW5lTW9kdWxlXG4gKiBAY2F0ZWdvcnkgbW9kdWxlcy9hcHBcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW3dpbGxTY2VuZUJlUmVwbGFjZWQ9ZmFsc2VdIHdpbGxTY2VuZUJlUmVwbGFjZWQgc2hvdWxkIGJlIHRydWUgb25seSBpZiB5b3UgYXJlIGdvaW5nIHRvIG92ZXJ3cml0ZSBzY2VuZSBkZXBlbmRlbmN5IGV2ZW4gd2l0aG91dCB0aGUgdXNlIG9mIGRlZmF1bHQgb25lLlxuICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzL2FwcFxuICovXG5cbnZhciBTY2VuZU1vZHVsZSA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFNjZW5lTW9kdWxlKCkge1xuICAgIHZhciB3aWxsU2NlbmVCZVJlcGxhY2VkID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBmYWxzZTtcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIFNjZW5lTW9kdWxlKTtcblxuICAgIHRoaXMuc2NlbmUgPSB3aWxsU2NlbmVCZVJlcGxhY2VkID8gbnVsbCA6IG5ldyBTY2VuZSgpO1xuICB9XG5cbiAgY3JlYXRlQ2xhc3MoU2NlbmVNb2R1bGUsIFt7XG4gICAga2V5OiBcIm1hbmFnZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbWFuYWdlcihfbWFuYWdlcikge1xuICAgICAgX21hbmFnZXIuc2V0KCdzY2VuZScsIHRoaXMuc2NlbmUpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpbnRlZ3JhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaW50ZWdyYXRlKHNlbGYpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24odGhpcywge1xuICAgICAgICBhZGQ6IGZ1bmN0aW9uIGFkZChvYmplY3QpIHtcbiAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICAgICAgcmV0dXJuIGFzeW5jVG9HZW5lcmF0b3IoXG4gICAgICAgICAgLyojX19QVVJFX18qL1xuICAgICAgICAgIHJlZ2VuZXJhdG9yLm1hcmsoZnVuY3Rpb24gX2NhbGxlZSgpIHtcbiAgICAgICAgICAgIHJldHVybiByZWdlbmVyYXRvci53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7XG4gICAgICAgICAgICAgIHdoaWxlICgxKSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkge1xuICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICBpZiAoIW9iamVjdC5wYXJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gMztcbiAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAzO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0LnBhcmVudC5yZW1vdmUob2JqZWN0KTtcblxuICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gNTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9iamVjdC53YWl0KCk7XG5cbiAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9iamVjdC5uYXRpdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gNztcbiAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb21wb3NpdGlvbkVycm9yKCdTY2VuZU1vZHVsZScsICd0aGVyZSBpcyBubyBvYmplY3QubmF0aXZlJywgX3RoaXMpO1xuXG4gICAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICAgIG9iamVjdC5wYXJlbnQgPSBfdGhpcztcbiAgICAgICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDEwO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMuYXBwbHlCcmlkZ2Uoe1xuICAgICAgICAgICAgICAgICAgICAgIG9uQWRkOiBvYmplY3RcbiAgICAgICAgICAgICAgICAgICAgfSkub25BZGQ7XG5cbiAgICAgICAgICAgICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgICAgICAgICAgIHNlbGYuc2NlbmUuYWRkKG9iamVjdC5uYXRpdmUpO1xuXG4gICAgICAgICAgICAgICAgICAgIF90aGlzLmNoaWxkcmVuLnB1c2gob2JqZWN0KTtcblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuYWJydXB0KFwicmV0dXJuXCIsIG9iamVjdCk7XG5cbiAgICAgICAgICAgICAgICAgIGNhc2UgMTM6XG4gICAgICAgICAgICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCBfY2FsbGVlLCB0aGlzKTtcbiAgICAgICAgICB9KSkoKTtcbiAgICAgICAgfSxcbiAgICAgICAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUob2JqZWN0KSB7XG4gICAgICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgICAgICByZXR1cm4gYXN5bmNUb0dlbmVyYXRvcihcbiAgICAgICAgICAvKiNfX1BVUkVfXyovXG4gICAgICAgICAgcmVnZW5lcmF0b3IubWFyayhmdW5jdGlvbiBfY2FsbGVlMigpIHtcbiAgICAgICAgICAgIHJldHVybiByZWdlbmVyYXRvci53cmFwKGZ1bmN0aW9uIF9jYWxsZWUyJChfY29udGV4dDIpIHtcbiAgICAgICAgICAgICAgd2hpbGUgKDEpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9jb250ZXh0Mi5wcmV2ID0gX2NvbnRleHQyLm5leHQpIHtcbiAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEob2JqZWN0LnBhcmVudCAhPT0gX3RoaXMyKSkge1xuICAgICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMjtcbiAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIuYWJydXB0KFwicmV0dXJuXCIpO1xuXG4gICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gNDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9iamVjdC53YWl0KCk7XG5cbiAgICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnBhcmVudCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYuc2NlbmUucmVtb3ZlKG9iamVjdC5uYXRpdmUpO1xuXG4gICAgICAgICAgICAgICAgICAgIF90aGlzMi5jaGlsZHJlbi5zcGxpY2UoX3RoaXMyLmNoaWxkcmVuLmluZGV4T2Yob2JqZWN0KSwgMSk7XG5cbiAgICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgIGNhc2UgXCJlbmRcIjpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0Mi5zdG9wKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCBfY2FsbGVlMiwgdGhpcyk7XG4gICAgICAgICAgfSkpKCk7XG4gICAgICAgIH0sXG4gICAgICAgIF9zZXRTY2VuZTogZnVuY3Rpb24gX3NldFNjZW5lKHNjZW5lKSB7XG4gICAgICAgICAgdGhpcy5jaGlsZHJlbiA9IHNjZW5lW1NZTUJPTF9DSElMRFJFTl9GT1JfU0NFTkVdID0gc2NlbmVbU1lNQk9MX0NISUxEUkVOX0ZPUl9TQ0VORV0gfHwgW107XG4gICAgICAgICAgc2VsZi5zY2VuZSA9IHNjZW5lO1xuICAgICAgICB9LFxuICAgICAgICBzZXRTY2VuZTogZnVuY3Rpb24gc2V0U2NlbmUoc2NlbmUpIHtcbiAgICAgICAgICB0aGlzLl9zZXRTY2VuZShzY2VuZSk7XG5cbiAgICAgICAgICB0aGlzLm1hbmFnZXIuc2V0KCdzY2VuZScsIHNjZW5lKTtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0U2NlbmU6IGZ1bmN0aW9uIGdldFNjZW5lKCkge1xuICAgICAgICAgIHJldHVybiBzZWxmLnNjZW5lO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGlmIChzZWxmLnNjZW5lKSB0aGlzLl9zZXRTY2VuZShzZWxmLnNjZW5lKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gU2NlbmVNb2R1bGU7XG59KCk7XG5cbi8vIGltcG9ydCB7YWRkUmVzaXplTGlzdGVuZXJ9IGZyb20gJ2RldGVjdC1lbGVtZW50LXJlc2l6ZSc7XG5cbi8qKlxuICogQGNsYXNzIFJlc2l6ZU1vZHVsZVxuICogQGNhdGVnb3J5IG1vZHVsZXMvYXBwXG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtcz17YXV0bzogdHJ1ZX1dIC0gSWYgYXV0byBpcyBzZXQgdG8gdHJ1ZSAtIHJlc2l6ZSB3aWxsIGJlIHRyaWdnZXJlZCB3aGVuIGNvbnRhaW5lciByZXNpemVzXG4gKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwXG4gKi9cbnZhciBSZXNpemVNb2R1bGUgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBSZXNpemVNb2R1bGUoKSB7XG4gICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBSZXNpemVNb2R1bGUpO1xuXG4gICAgdGhpcy5wYXJhbXMgPSBPYmplY3QuYXNzaWduKHtcbiAgICAgIGF1dG86IHRydWVcbiAgICB9LCBwYXJhbXMpO1xuICAgIHRoaXMuY2FsbGJhY2tzID0gW3RoaXMuc2V0U2l6ZS5iaW5kKHRoaXMpXTtcbiAgfVxuICAvKipcbiAgICogQGZ1bmN0aW9uIHNldFNpemVcbiAgICogQGluc3RhbmNlXG4gICAqIEBkZXNjcmlwdGlvbiBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIHByb3ZpZGVkIHdpZHRoICYgaGVpZ2h0IHRvIHRoZSByZW5kZXJlciBvYmplY3QuXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbd2lkdGg9MV0gLSBUaGUgcHJvbWlzZSB0aGF0IHNob3VsZCBiZSBhZGRlZCB0byBhIHF1ZXVlLlxuICAgKiBAcGFyYW0ge051bWJlcn0gW2hlaWdodD0xXSAtIHRoYXQgaXMgcmVzb2x2ZWQgd2hlbiBhbGwgcHJvbWlzZXMgY29tcGxldGVkLlxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwLlJlc2l6ZU1vZHVsZVxuICAgKi9cblxuXG4gIGNyZWF0ZUNsYXNzKFJlc2l6ZU1vZHVsZSwgW3tcbiAgICBrZXk6IFwic2V0U2l6ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRTaXplKCkge1xuICAgICAgdmFyIHdpZHRoID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiAxO1xuICAgICAgdmFyIGhlaWdodCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogMTtcbiAgICAgIHRoaXMuY2FtZXJhLm5hdGl2ZS5hc3BlY3QgPSB3aWR0aCAvIGhlaWdodDtcbiAgICAgIHRoaXMuY2FtZXJhLm5hdGl2ZS51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XG4gICAgICBpZiAodGhpcy5yZW5kZXJpbmcpIHRoaXMucmVuZGVyaW5nLnNldFNpemUod2lkdGgsIGhlaWdodCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBtZXRob2QgdHJpZ2dlclxuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBkZXNjcmlwdGlvbiBUcmlnZ2VycyByZXNpemUgd2hlbiBjYWxsZWQuIHdpZHRoICYgaGVpZ2h0IGFyZSBkZXRlcm1pbmVkIGF1dG9tYXRpY2FsbHlcbiAgICAgKiBUaGlzIGludm9rZXMgZWFjaCBjYWxsYmFja3Mgd2l0aCB0aGUgbmV3IHdpZHRoIGFuZCBoZWlnaHQgYXMgcGFyYW1zXG4gICAgICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzL2FwcC5SZXNpemVNb2R1bGVcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInRyaWdnZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gdHJpZ2dlcigpIHtcbiAgICAgIHZhciBfdGhpcyRjb250YWluZXIgPSB0aGlzLmNvbnRhaW5lcixcbiAgICAgICAgICBvZmZzZXRXaWR0aCA9IF90aGlzJGNvbnRhaW5lci5vZmZzZXRXaWR0aCxcbiAgICAgICAgICBvZmZzZXRIZWlnaHQgPSBfdGhpcyRjb250YWluZXIub2Zmc2V0SGVpZ2h0LFxuICAgICAgICAgIHJlc29sdXRpb24gPSB0aGlzLnJlc29sdXRpb247XG4gICAgICB2YXIgd2lkdGggPSBOdW1iZXIob2Zmc2V0V2lkdGggKiByZXNvbHV0aW9uLngpLnRvRml4ZWQoKTtcbiAgICAgIHZhciBoZWlnaHQgPSBOdW1iZXIob2Zmc2V0SGVpZ2h0ICogcmVzb2x1dGlvbi55KS50b0ZpeGVkKCk7XG4gICAgICB0aGlzLmNhbGxiYWNrcy5mb3JFYWNoKGZ1bmN0aW9uIChjYikge1xuICAgICAgICBjYih3aWR0aCwgaGVpZ2h0KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAbWV0aG9kIGFkZEF1dG9yZXNpemVcbiAgICAgKiBAaW5zdGFuY2VcbiAgICAgKiBAZGVzY3JpcHRpb24gU2V0cyBtb2R1bGUgdG8gYXV0b3Jlc2l6ZSwgdGhpcyBhZGRzIGFuIGV2ZW50IGxpc3RlbmUgb24gd2luZG93IHJlc2l6ZSB0byB0cmlnZ2VyIHRoZSByZXNpemVcbiAgICAgKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwLlJlc2l6ZU1vZHVsZVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiYWRkQXV0b3Jlc2l6ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhZGRBdXRvcmVzaXplKCkge1xuICAgICAgdGhpcy5jb250YWluZXIgPSB0aGlzLmdldENvbnRhaW5lcigpO1xuICAgICAgdGhpcy5yZXNvbHV0aW9uID0gdGhpcy5nZXRSZXNvbHV0aW9uKCk7XG4gICAgICBpZiAodGhpcy5wYXJhbXMuYXV0bykgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMudHJpZ2dlci5iaW5kKHRoaXMpKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQG1ldGhvZCBhZGRDYWxsYmFja1xuICAgICAqIEBpbnN0YW5jZVxuICAgICAqIEBkZXNjcmlwdGlvbiBBZGRzIGEgY2FsbCBiYWNrIGZ1bmN0aW9uIHRvIHRoZSBleGlzdGluZyBjYWxsYmFja3MgbGlzdC5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIC0gVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGFkZFxuICAgICAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9hcHAuUmVzaXplTW9kdWxlXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJhZGRDYWxsYmFja1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhZGRDYWxsYmFjayhmdW5jKSB7XG4gICAgICB0aGlzLmNhbGxiYWNrcy5wdXNoKGZ1bmMpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJtYW5hZ2VyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG1hbmFnZXIoX21hbmFnZXIpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIF9tYW5hZ2VyLmRlZmluZSgncmVzaXplJyk7XG5cbiAgICAgIHRoaXMucmVuZGVyaW5nID0gX21hbmFnZXIuZ2V0KCdyZW5kZXJlcicpO1xuICAgICAgdGhpcy5jYW1lcmEgPSBfbWFuYWdlci5nZXQoJ2NhbWVyYScpO1xuXG4gICAgICB0aGlzLmdldFJlc29sdXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfbWFuYWdlci51c2UoJ3JlbmRlcmluZycpLnBhcmFtcy5yZXNvbHV0aW9uO1xuICAgICAgfTtcblxuICAgICAgdGhpcy5nZXRDb250YWluZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBfbWFuYWdlci5nZXQoJ2NvbnRhaW5lcicpO1xuICAgICAgfTtcblxuICAgICAgX21hbmFnZXIudXBkYXRlKHtcbiAgICAgICAgY29udGFpbmVyOiBmdW5jdGlvbiBjb250YWluZXIoX2NvbnRhaW5lcikge1xuICAgICAgICAgIF90aGlzLmNvbnRhaW5lciA9IF9jb250YWluZXI7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLmFkZEF1dG9yZXNpemUoKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gUmVzaXplTW9kdWxlO1xufSgpO1xuXG52YXIgZnJhZ21lbnQgPSBcInVuaWZvcm0gc2FtcGxlcjJEIHRQcmV2aW91c0x1bTtcXHJcXG51bmlmb3JtIHNhbXBsZXIyRCB0Q3VycmVudEx1bTtcXHJcXG51bmlmb3JtIGZsb2F0IG1pbkx1bWluYW5jZTtcXHJcXG51bmlmb3JtIGZsb2F0IGRlbHRhO1xcclxcbnVuaWZvcm0gZmxvYXQgdGF1O1xcclxcblxcclxcbnZhcnlpbmcgdmVjMiB2VXY7XFxyXFxuXFxyXFxudm9pZCBtYWluKCkge1xcclxcblxcclxcblxcdGZsb2F0IHByZXZpb3VzTHVtID0gdGV4dHVyZTJEKHRQcmV2aW91c0x1bSwgdlV2LCBNSVBfTEVWRUxfMVgxKS5yO1xcclxcblxcdGZsb2F0IGN1cnJlbnRMdW0gPSB0ZXh0dXJlMkQodEN1cnJlbnRMdW0sIHZVdiwgTUlQX0xFVkVMXzFYMSkucjtcXHJcXG5cXHJcXG5cXHRwcmV2aW91c0x1bSA9IG1heChtaW5MdW1pbmFuY2UsIHByZXZpb3VzTHVtKTtcXHJcXG5cXHRjdXJyZW50THVtID0gbWF4KG1pbkx1bWluYW5jZSwgY3VycmVudEx1bSk7XFxyXFxuXFxyXFxuXFx0Ly8gQWRhcHQgdGhlIGx1bWluYW5jZSB1c2luZyBQYXR0YW5haWsncyB0ZWNobmlxdWUuXFxyXFxuXFx0ZmxvYXQgYWRhcHRlZEx1bSA9IHByZXZpb3VzTHVtICsgKGN1cnJlbnRMdW0gLSBwcmV2aW91c0x1bSkgKiAoMS4wIC0gZXhwKC1kZWx0YSAqIHRhdSkpO1xcclxcblxcclxcblxcdGdsX0ZyYWdDb2xvci5yID0gYWRhcHRlZEx1bTtcXHJcXG5cXHJcXG59XFxyXFxuXCI7XG52YXIgdmVydGV4ID0gXCJ2YXJ5aW5nIHZlYzIgdlV2O1xcclxcblxcclxcbnZvaWQgbWFpbigpIHtcXHJcXG5cXHJcXG5cXHR2VXYgPSB1djtcXHJcXG5cXHRnbF9Qb3NpdGlvbiA9IHByb2plY3Rpb25NYXRyaXggKiBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KHBvc2l0aW9uLCAxLjApO1xcclxcblxcclxcbn1cXHJcXG5cIjtcbi8qKlxyXG4gKiBBbiBhZGFwdGl2ZSBsdW1pbm9zaXR5IHNoYWRlciBtYXRlcmlhbC5cclxuICovXG5cbnZhciBBZGFwdGl2ZUx1bWlub3NpdHlNYXRlcmlhbCA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX1NoYWRlck1hdGVyaWFsKSB7XG4gIC8qKlxyXG4gICAqIENvbnN0cnVjdHMgYSBuZXcgYWRhcHRpdmUgbHVtaW5vc2l0eSBtYXRlcmlhbC5cclxuICAgKi9cbiAgZnVuY3Rpb24gQWRhcHRpdmVMdW1pbm9zaXR5TWF0ZXJpYWwoKSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgQWRhcHRpdmVMdW1pbm9zaXR5TWF0ZXJpYWwpO1xuXG4gICAgcmV0dXJuIHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgZ2V0UHJvdG90eXBlT2YkMihBZGFwdGl2ZUx1bWlub3NpdHlNYXRlcmlhbCkuY2FsbCh0aGlzLCB7XG4gICAgICB0eXBlOiBcIkFkYXB0aXZlTHVtaW5vc2l0eU1hdGVyaWFsXCIsXG4gICAgICBkZWZpbmVzOiB7XG4gICAgICAgIE1JUF9MRVZFTF8xWDE6IFwiMC4wXCJcbiAgICAgIH0sXG4gICAgICB1bmlmb3Jtczoge1xuICAgICAgICB0UHJldmlvdXNMdW06IG5ldyBVbmlmb3JtKG51bGwpLFxuICAgICAgICB0Q3VycmVudEx1bTogbmV3IFVuaWZvcm0obnVsbCksXG4gICAgICAgIG1pbkx1bWluYW5jZTogbmV3IFVuaWZvcm0oMC4wMSksXG4gICAgICAgIGRlbHRhOiBuZXcgVW5pZm9ybSgwLjApLFxuICAgICAgICB0YXU6IG5ldyBVbmlmb3JtKDEuMClcbiAgICAgIH0sXG4gICAgICBmcmFnbWVudFNoYWRlcjogZnJhZ21lbnQsXG4gICAgICB2ZXJ0ZXhTaGFkZXI6IHZlcnRleCxcbiAgICAgIGRlcHRoV3JpdGU6IGZhbHNlLFxuICAgICAgZGVwdGhUZXN0OiBmYWxzZVxuICAgIH0pKTtcbiAgfVxuXG4gIGluaGVyaXRzKEFkYXB0aXZlTHVtaW5vc2l0eU1hdGVyaWFsLCBfU2hhZGVyTWF0ZXJpYWwpO1xuXG4gIHJldHVybiBBZGFwdGl2ZUx1bWlub3NpdHlNYXRlcmlhbDtcbn0oU2hhZGVyTWF0ZXJpYWwpO1xuXG52YXIgZnJhZ21lbnQkMSA9IFwidW5pZm9ybSBzYW1wbGVyMkQgdERpZmZ1c2U7XFxyXFxudW5pZm9ybSBzYW1wbGVyMkQgdERlcHRoO1xcclxcblxcclxcbnVuaWZvcm0gZmxvYXQgZm9jdXM7XFxyXFxudW5pZm9ybSBmbG9hdCBkb2Y7XFxyXFxudW5pZm9ybSBmbG9hdCBhc3BlY3Q7XFxyXFxudW5pZm9ybSBmbG9hdCBhcGVydHVyZTtcXHJcXG51bmlmb3JtIGZsb2F0IG1heEJsdXI7XFxyXFxuXFxyXFxudmFyeWluZyB2ZWMyIHZVdjtcXHJcXG5cXHJcXG4jaWZuZGVmIFVTRV9MT0dERVBUSEJVRlxcclxcblxcclxcblxcdCNpbmNsdWRlIDxwYWNraW5nPlxcclxcblxcclxcblxcdHVuaWZvcm0gZmxvYXQgY2FtZXJhTmVhcjtcXHJcXG5cXHR1bmlmb3JtIGZsb2F0IGNhbWVyYUZhcjtcXHJcXG5cXHJcXG5cXHRmbG9hdCByZWFkRGVwdGgoc2FtcGxlcjJEIGRlcHRoU2FtcGxlciwgdmVjMiBjb29yZCkge1xcclxcblxcclxcblxcdFxcdGZsb2F0IGZyYWdDb29yZFogPSB0ZXh0dXJlMkQoZGVwdGhTYW1wbGVyLCBjb29yZCkueDtcXHJcXG5cXHRcXHRmbG9hdCB2aWV3WiA9IHBlcnNwZWN0aXZlRGVwdGhUb1ZpZXdaKGZyYWdDb29yZFosIGNhbWVyYU5lYXIsIGNhbWVyYUZhcik7XFxyXFxuXFxyXFxuXFx0XFx0cmV0dXJuIHZpZXdaVG9PcnRob2dyYXBoaWNEZXB0aCh2aWV3WiwgY2FtZXJhTmVhciwgY2FtZXJhRmFyKTtcXHJcXG5cXHJcXG5cXHR9XFxyXFxuXFxyXFxuI2VuZGlmXFxyXFxuXFxyXFxudm9pZCBtYWluKCkge1xcclxcblxcclxcblxcdHZlYzIgYXNwZWN0Q29ycmVjdGlvbiA9IHZlYzIoMS4wLCBhc3BlY3QpO1xcclxcblxcclxcblxcdCNpZmRlZiBVU0VfTE9HREVQVEhCVUZcXHJcXG5cXHJcXG5cXHRcXHRmbG9hdCBkZXB0aCA9IHRleHR1cmUyRCh0RGVwdGgsIHZVdikueDtcXHJcXG5cXHJcXG5cXHQjZWxzZVxcclxcblxcclxcblxcdFxcdGZsb2F0IGRlcHRoID0gcmVhZERlcHRoKHREZXB0aCwgdlV2KTtcXHJcXG5cXHJcXG5cXHQjZW5kaWZcXHJcXG5cXHJcXG5cXHRmbG9hdCBmb2N1c05lYXIgPSBjbGFtcChmb2N1cyAtIGRvZiwgMC4wLCAxLjApO1xcclxcblxcdGZsb2F0IGZvY3VzRmFyID0gY2xhbXAoZm9jdXMgKyBkb2YsIDAuMCwgMS4wKTtcXHJcXG5cXHJcXG5cXHQvLyBDYWxjdWxhdGUgYSBEb0YgbWFzay5cXHJcXG5cXHRmbG9hdCBsb3cgPSBzdGVwKGRlcHRoLCBmb2N1c05lYXIpO1xcclxcblxcdGZsb2F0IGhpZ2ggPSBzdGVwKGZvY3VzRmFyLCBkZXB0aCk7XFxyXFxuXFxyXFxuXFx0ZmxvYXQgZmFjdG9yID0gKGRlcHRoIC0gZm9jdXNOZWFyKSAqIGxvdyArIChkZXB0aCAtIGZvY3VzRmFyKSAqIGhpZ2g7XFxyXFxuXFxyXFxuXFx0dmVjMiBkb2ZCbHVyID0gdmVjMihjbGFtcChmYWN0b3IgKiBhcGVydHVyZSwgLW1heEJsdXIsIG1heEJsdXIpKTtcXHJcXG5cXHJcXG5cXHR2ZWMyIGRvZmJsdXI5ID0gZG9mQmx1ciAqIDAuOTtcXHJcXG5cXHR2ZWMyIGRvZmJsdXI3ID0gZG9mQmx1ciAqIDAuNztcXHJcXG5cXHR2ZWMyIGRvZmJsdXI0ID0gZG9mQmx1ciAqIDAuNDtcXHJcXG5cXHJcXG5cXHR2ZWM0IGNvbG9yID0gdmVjNCgwLjApO1xcclxcblxcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2KTtcXHJcXG5cXHRjb2xvciArPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdiArICh2ZWMyKCAwLjAsICAgMC40ICkgKiBhc3BlY3RDb3JyZWN0aW9uKSAqIGRvZkJsdXIpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoIDAuMTUsICAwLjM3KSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mQmx1cik7XFxyXFxuXFx0Y29sb3IgKz0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYgKyAodmVjMiggMC4yOSwgIDAuMjkpICogYXNwZWN0Q29ycmVjdGlvbikgKiBkb2ZCbHVyKTtcXHJcXG5cXHRjb2xvciArPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdiArICh2ZWMyKC0wLjM3LCAgMC4xNSkgKiBhc3BlY3RDb3JyZWN0aW9uKSAqIGRvZkJsdXIpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoIDAuNDAsICAwLjAgKSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mQmx1cik7XFxyXFxuXFx0Y29sb3IgKz0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYgKyAodmVjMiggMC4zNywgLTAuMTUpICogYXNwZWN0Q29ycmVjdGlvbikgKiBkb2ZCbHVyKTtcXHJcXG5cXHRjb2xvciArPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdiArICh2ZWMyKCAwLjI5LCAtMC4yOSkgKiBhc3BlY3RDb3JyZWN0aW9uKSAqIGRvZkJsdXIpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoLTAuMTUsIC0wLjM3KSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mQmx1cik7XFxyXFxuXFx0Y29sb3IgKz0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYgKyAodmVjMiggMC4wLCAgLTAuNCApICogYXNwZWN0Q29ycmVjdGlvbikgKiBkb2ZCbHVyKTtcXHJcXG5cXHRjb2xvciArPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdiArICh2ZWMyKC0wLjE1LCAgMC4zNykgKiBhc3BlY3RDb3JyZWN0aW9uKSAqIGRvZkJsdXIpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoLTAuMjksICAwLjI5KSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mQmx1cik7XFxyXFxuXFx0Y29sb3IgKz0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYgKyAodmVjMiggMC4zNywgIDAuMTUpICogYXNwZWN0Q29ycmVjdGlvbikgKiBkb2ZCbHVyKTtcXHJcXG5cXHRjb2xvciArPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdiArICh2ZWMyKC0wLjQsICAgMC4wICkgKiBhc3BlY3RDb3JyZWN0aW9uKSAqIGRvZkJsdXIpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoLTAuMzcsIC0wLjE1KSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mQmx1cik7XFxyXFxuXFx0Y29sb3IgKz0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYgKyAodmVjMigtMC4yOSwgLTAuMjkpICogYXNwZWN0Q29ycmVjdGlvbikgKiBkb2ZCbHVyKTtcXHJcXG5cXHRjb2xvciArPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdiArICh2ZWMyKCAwLjE1LCAtMC4zNykgKiBhc3BlY3RDb3JyZWN0aW9uKSAqIGRvZkJsdXIpO1xcclxcblxcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoIDAuMTUsICAwLjM3KSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjkpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoLTAuMzcsICAwLjE1KSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjkpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoIDAuMzcsIC0wLjE1KSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjkpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoLTAuMTUsIC0wLjM3KSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjkpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoLTAuMTUsICAwLjM3KSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjkpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoIDAuMzcsICAwLjE1KSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjkpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoLTAuMzcsIC0wLjE1KSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjkpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoIDAuMTUsIC0wLjM3KSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjkpO1xcclxcblxcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoIDAuMjksICAwLjI5KSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjcpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoIDAuNDAsICAwLjAgKSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjcpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoIDAuMjksIC0wLjI5KSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjcpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoIDAuMCwgIC0wLjQgKSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjcpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoLTAuMjksICAwLjI5KSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjcpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoLTAuNCwgICAwLjAgKSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjcpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoLTAuMjksIC0wLjI5KSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjcpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoIDAuMCwgICAwLjQgKSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjcpO1xcclxcblxcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoIDAuMjksICAwLjI5KSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjQpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoIDAuNCwgICAwLjAgKSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjQpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoIDAuMjksIC0wLjI5KSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjQpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoIDAuMCwgIC0wLjQgKSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjQpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoLTAuMjksICAwLjI5KSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjQpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoLTAuNCwgICAwLjAgKSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjQpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoLTAuMjksIC0wLjI5KSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjQpO1xcclxcblxcdGNvbG9yICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2ICsgKHZlYzIoIDAuMCwgICAwLjQgKSAqIGFzcGVjdENvcnJlY3Rpb24pICogZG9mYmx1cjQpO1xcclxcblxcclxcblxcdGdsX0ZyYWdDb2xvciA9IGNvbG9yIC8gNDEuMDtcXHJcXG5cXHJcXG59XFxyXFxuXCI7XG52YXIgdmVydGV4JDEgPSBcInZhcnlpbmcgdmVjMiB2VXY7XFxyXFxuXFxyXFxudm9pZCBtYWluKCkge1xcclxcblxcclxcblxcdHZVdiA9IHV2O1xcclxcblxcdGdsX1Bvc2l0aW9uID0gcHJvamVjdGlvbk1hdHJpeCAqIG1vZGVsVmlld01hdHJpeCAqIHZlYzQocG9zaXRpb24sIDEuMCk7XFxyXFxuXFxyXFxufVxcclxcblwiO1xuLyoqXHJcbiAqIERlcHRoIG9mIEZpZWxkIHNoYWRlciAoQm9rZWgpLlxyXG4gKlxyXG4gKiBPcmlnaW5hbCBzaGFkZXIgY29kZSBieSBNYXJ0aW5zIFVwaXRpczpcclxuICogIGh0dHA6Ly9hcnRtYXJ0aW5zaC5ibG9nc3BvdC5jb20vMjAxMC8wMi9nbHNsLWxlbnMtYmx1ci1maWx0ZXItd2l0aC1ib2tlaC5odG1sXHJcbiAqL1xuXG52YXIgQm9rZWhNYXRlcmlhbCA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX1NoYWRlck1hdGVyaWFsKSB7XG4gIC8qKlxyXG4gICAqIENvbnN0cnVjdHMgYSBuZXcgYm9rZWggbWF0ZXJpYWwuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge1BlcnNwZWN0aXZlQ2FtZXJhfSBbY2FtZXJhXSAtIEEgY2FtZXJhLlxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gLSBUaGUgb3B0aW9ucy5cclxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuZm9jdXM9MS4wXSAtIFRoZSBmb2N1cyBkaXN0YW5jZSwgY29ycmVzcG9uZHMgZGlyZWN0bHkgd2l0aCB0aGUgc2NlbmUgZGVwdGguXHJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmRvZj0wLjAyXSAtIERlcHRoIG9mIGZpZWxkLiBBbiBhcmVhIGluIGZyb250IG9mIGFuZCBiZWhpbmQgdGhlIGZvY3VzIHBvaW50IHRoYXQgc3RpbGwgYXBwZWFycyBzaGFycC5cclxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuYXBlcnR1cmU9MC4wMjVdIC0gQ2FtZXJhIGFwZXJ0dXJlIHNjYWxlLiBCaWdnZXIgdmFsdWVzIGZvciBzdHJvbmdlciBibHVyIGFuZCBzaGFsbG93ZXIgZGVwdGggb2YgZmllbGQuXHJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLm1heEJsdXI9MS4wXSAtIE1heGltdW0gYmx1ciBzdHJlbmd0aC5cclxuICAgKi9cbiAgZnVuY3Rpb24gQm9rZWhNYXRlcmlhbChjYW1lcmEpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBCb2tlaE1hdGVyaWFsKTtcblxuICAgIHZhciBzZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgZm9jdXM6IDEuMCxcbiAgICAgIGRvZjogMC4wMixcbiAgICAgIGFwZXJ0dXJlOiAwLjAyNSxcbiAgICAgIG1heEJsdXI6IDEuMFxuICAgIH0sIG9wdGlvbnMpO1xuICAgIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBnZXRQcm90b3R5cGVPZiQyKEJva2VoTWF0ZXJpYWwpLmNhbGwodGhpcywge1xuICAgICAgdHlwZTogXCJCb2tlaE1hdGVyaWFsXCIsXG4gICAgICB1bmlmb3Jtczoge1xuICAgICAgICBjYW1lcmFOZWFyOiBuZXcgVW5pZm9ybSgwLjEpLFxuICAgICAgICBjYW1lcmFGYXI6IG5ldyBVbmlmb3JtKDIwMDApLFxuICAgICAgICBhc3BlY3Q6IG5ldyBVbmlmb3JtKDEuMCksXG4gICAgICAgIHREaWZmdXNlOiBuZXcgVW5pZm9ybShudWxsKSxcbiAgICAgICAgdERlcHRoOiBuZXcgVW5pZm9ybShudWxsKSxcbiAgICAgICAgZm9jdXM6IG5ldyBVbmlmb3JtKHNldHRpbmdzLmZvY3VzKSxcbiAgICAgICAgZG9mOiBuZXcgVW5pZm9ybShzZXR0aW5ncy5kb2YpLFxuICAgICAgICBhcGVydHVyZTogbmV3IFVuaWZvcm0oc2V0dGluZ3MuYXBlcnR1cmUpLFxuICAgICAgICBtYXhCbHVyOiBuZXcgVW5pZm9ybShzZXR0aW5ncy5tYXhCbHVyKVxuICAgICAgfSxcbiAgICAgIGZyYWdtZW50U2hhZGVyOiBmcmFnbWVudCQxLFxuICAgICAgdmVydGV4U2hhZGVyOiB2ZXJ0ZXgkMSxcbiAgICAgIGRlcHRoV3JpdGU6IGZhbHNlLFxuICAgICAgZGVwdGhUZXN0OiBmYWxzZVxuICAgIH0pKTtcblxuICAgIF90aGlzLmFkb3B0Q2FtZXJhU2V0dGluZ3MoY2FtZXJhKTtcblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuICAvKipcclxuICAgKiBBZG9wdHMgdGhlIHNldHRpbmdzIG9mIHRoZSBnaXZlbiBjYW1lcmEuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge1BlcnNwZWN0aXZlQ2FtZXJhfSBbY2FtZXJhPW51bGxdIC0gQSBjYW1lcmEuXHJcbiAgICovXG5cblxuICBjcmVhdGVDbGFzcyhCb2tlaE1hdGVyaWFsLCBbe1xuICAgIGtleTogXCJhZG9wdENhbWVyYVNldHRpbmdzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFkb3B0Q2FtZXJhU2V0dGluZ3MoKSB7XG4gICAgICB2YXIgY2FtZXJhID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBudWxsO1xuXG4gICAgICBpZiAoY2FtZXJhICE9PSBudWxsKSB7XG4gICAgICAgIHRoaXMudW5pZm9ybXMuY2FtZXJhTmVhci52YWx1ZSA9IGNhbWVyYS5uZWFyO1xuICAgICAgICB0aGlzLnVuaWZvcm1zLmNhbWVyYUZhci52YWx1ZSA9IGNhbWVyYS5mYXI7XG4gICAgICAgIHRoaXMudW5pZm9ybXMuYXNwZWN0LnZhbHVlID0gY2FtZXJhLmFzcGVjdDtcbiAgICAgIH1cbiAgICB9XG4gIH1dKTtcblxuICBpbmhlcml0cyhCb2tlaE1hdGVyaWFsLCBfU2hhZGVyTWF0ZXJpYWwpO1xuXG4gIHJldHVybiBCb2tlaE1hdGVyaWFsO1xufShTaGFkZXJNYXRlcmlhbCk7XG5cbnZhciBmcmFnbWVudCQyID0gXCJ1bmlmb3JtIHNhbXBsZXIyRCB0RGlmZnVzZTtcXHJcXG5cXHJcXG52YXJ5aW5nIHZlYzIgdlV2O1xcclxcbnZhcnlpbmcgdmVjNCB2T2Zmc2V0WzNdO1xcclxcblxcclxcbnZvaWQgbWFpbigpIHtcXHJcXG5cXHJcXG5cXHRjb25zdCB2ZWMyIHRocmVzaG9sZCA9IHZlYzIoRURHRV9USFJFU0hPTEQpO1xcclxcblxcclxcblxcdC8vIENhbGN1bGF0ZSBjb2xvciBkZWx0YXMuXFxyXFxuXFx0dmVjNCBkZWx0YTtcXHJcXG5cXHR2ZWMzIGMgPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdikucmdiO1xcclxcblxcclxcblxcdHZlYzMgY0xlZnQgPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZPZmZzZXRbMF0ueHkpLnJnYjtcXHJcXG5cXHR2ZWMzIHQgPSBhYnMoYyAtIGNMZWZ0KTtcXHJcXG5cXHRkZWx0YS54ID0gbWF4KG1heCh0LnIsIHQuZyksIHQuYik7XFxyXFxuXFxyXFxuXFx0dmVjMyBjVG9wID0gdGV4dHVyZTJEKHREaWZmdXNlLCB2T2Zmc2V0WzBdLnp3KS5yZ2I7XFxyXFxuXFx0dCA9IGFicyhjIC0gY1RvcCk7XFxyXFxuXFx0ZGVsdGEueSA9IG1heChtYXgodC5yLCB0LmcpLCB0LmIpO1xcclxcblxcclxcblxcdC8vIFdlIGRvIHRoZSB1c3VhbCB0aHJlc2hvbGQuXFxyXFxuXFx0dmVjMiBlZGdlcyA9IHN0ZXAodGhyZXNob2xkLCBkZWx0YS54eSk7XFxyXFxuXFxyXFxuXFx0Ly8gVGhlbiBkaXNjYXJkIGlmIHRoZXJlIGlzIG5vIGVkZ2UuXFxyXFxuXFx0aWYoZG90KGVkZ2VzLCB2ZWMyKDEuMCkpID09IDAuMCkge1xcclxcblxcclxcblxcdFxcdGRpc2NhcmQ7XFxyXFxuXFxyXFxuXFx0fVxcclxcblxcclxcblxcdC8vIENhbGN1bGF0ZSByaWdodCBhbmQgYm90dG9tIGRlbHRhcy5cXHJcXG5cXHR2ZWMzIGNSaWdodCA9IHRleHR1cmUyRCh0RGlmZnVzZSwgdk9mZnNldFsxXS54eSkucmdiO1xcclxcblxcdHQgPSBhYnMoYyAtIGNSaWdodCk7XFxyXFxuXFx0ZGVsdGEueiA9IG1heChtYXgodC5yLCB0LmcpLCB0LmIpO1xcclxcblxcclxcblxcdHZlYzMgY0JvdHRvbSA9IHRleHR1cmUyRCh0RGlmZnVzZSwgdk9mZnNldFsxXS56dykucmdiO1xcclxcblxcdHQgPSBhYnMoYyAtIGNCb3R0b20pO1xcclxcblxcdGRlbHRhLncgPSBtYXgobWF4KHQuciwgdC5nKSwgdC5iKTtcXHJcXG5cXHJcXG5cXHQvLyBDYWxjdWxhdGUgdGhlIG1heGltdW0gZGVsdGEgaW4gdGhlIGRpcmVjdCBuZWlnaGJvcmhvb2QuXFxyXFxuXFx0ZmxvYXQgbWF4RGVsdGEgPSBtYXgobWF4KG1heChkZWx0YS54LCBkZWx0YS55KSwgZGVsdGEueiksIGRlbHRhLncpO1xcclxcblxcclxcblxcdC8vIENhbGN1bGF0ZSBsZWZ0LWxlZnQgYW5kIHRvcC10b3AgZGVsdGFzLlxcclxcblxcdHZlYzMgY0xlZnRMZWZ0ID0gdGV4dHVyZTJEKHREaWZmdXNlLCB2T2Zmc2V0WzJdLnh5KS5yZ2I7XFxyXFxuXFx0dCA9IGFicyhjIC0gY0xlZnRMZWZ0KTtcXHJcXG5cXHRkZWx0YS56ID0gbWF4KG1heCh0LnIsIHQuZyksIHQuYik7XFxyXFxuXFxyXFxuXFx0dmVjMyBjVG9wVG9wID0gdGV4dHVyZTJEKHREaWZmdXNlLCB2T2Zmc2V0WzJdLnp3KS5yZ2I7XFxyXFxuXFx0dCA9IGFicyhjIC0gY1RvcFRvcCk7XFxyXFxuXFx0ZGVsdGEudyA9IG1heChtYXgodC5yLCB0LmcpLCB0LmIpO1xcclxcblxcclxcblxcdC8vIENhbGN1bGF0ZSB0aGUgZmluYWwgbWF4aW11bSBkZWx0YS5cXHJcXG5cXHRtYXhEZWx0YSA9IG1heChtYXgobWF4RGVsdGEsIGRlbHRhLnopLCBkZWx0YS53KTtcXHJcXG5cXHJcXG5cXHQvLyBMb2NhbCBjb250cmFzdCBhZGFwdGF0aW9uIGluIGFjdGlvbi5cXHJcXG5cXHRlZGdlcy54eSAqPSBzdGVwKDAuNSAqIG1heERlbHRhLCBkZWx0YS54eSk7XFxyXFxuXFxyXFxuXFx0Z2xfRnJhZ0NvbG9yID0gdmVjNChlZGdlcywgMC4wLCAwLjApO1xcclxcblxcclxcbn1cXHJcXG5cIjtcbnZhciB2ZXJ0ZXgkMiA9IFwidW5pZm9ybSB2ZWMyIHRleGVsU2l6ZTtcXHJcXG5cXHJcXG52YXJ5aW5nIHZlYzIgdlV2O1xcclxcbnZhcnlpbmcgdmVjNCB2T2Zmc2V0WzNdO1xcclxcblxcclxcbnZvaWQgbWFpbigpIHtcXHJcXG5cXHJcXG5cXHR2VXYgPSB1djtcXHJcXG5cXHJcXG5cXHR2T2Zmc2V0WzBdID0gdXYueHl4eSArIHRleGVsU2l6ZS54eXh5ICogdmVjNCgtMS4wLCAwLjAsIDAuMCwgMS4wKTsgLy8gQ2hhbmdlZCBzaWduIGluIFcgY29tcG9uZW50LlxcclxcblxcdHZPZmZzZXRbMV0gPSB1di54eXh5ICsgdGV4ZWxTaXplLnh5eHkgKiB2ZWM0KDEuMCwgMC4wLCAwLjAsIC0xLjApOyAvLyBDaGFuZ2VkIHNpZ24gaW4gVyBjb21wb25lbnQuXFxyXFxuXFx0dk9mZnNldFsyXSA9IHV2Lnh5eHkgKyB0ZXhlbFNpemUueHl4eSAqIHZlYzQoLTIuMCwgMC4wLCAwLjAsIDIuMCk7IC8vIENoYW5nZWQgc2lnbiBpbiBXIGNvbXBvbmVudC5cXHJcXG5cXHJcXG5cXHRnbF9Qb3NpdGlvbiA9IHByb2plY3Rpb25NYXRyaXggKiBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KHBvc2l0aW9uLCAxLjApO1xcclxcblxcclxcbn1cXHJcXG5cIjtcbi8qKlxyXG4gKiBBIG1hdGVyaWFsIHRoYXQgZGV0ZWN0cyBlZGdlcyBpbiBhIGNvbG9yIHRleHR1cmUuXHJcbiAqXHJcbiAqIE1haW5seSB1c2VkIGZvciBTdWJwaXhlbCBNb3JwaG9sb2dpY2FsIEFudGlhbGlhc2luZy5cclxuICovXG5cbnZhciBDb2xvckVkZ2VzTWF0ZXJpYWwgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9TaGFkZXJNYXRlcmlhbCkge1xuICAvKipcclxuICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGNvbG9yIGVkZ2VzIG1hdGVyaWFsLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtWZWN0b3IyfSBbdGV4ZWxTaXplXSAtIFRoZSBhYnNvbHV0ZSBzY3JlZW4gdGV4ZWwgc2l6ZS5cclxuICAgKi9cbiAgZnVuY3Rpb24gQ29sb3JFZGdlc01hdGVyaWFsKCkge1xuICAgIHZhciB0ZXhlbFNpemUgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IG5ldyBWZWN0b3IyKCk7XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBDb2xvckVkZ2VzTWF0ZXJpYWwpO1xuXG4gICAgcmV0dXJuIHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgZ2V0UHJvdG90eXBlT2YkMihDb2xvckVkZ2VzTWF0ZXJpYWwpLmNhbGwodGhpcywge1xuICAgICAgdHlwZTogXCJDb2xvckVkZ2VzTWF0ZXJpYWxcIixcbiAgICAgIGRlZmluZXM6IHtcbiAgICAgICAgRURHRV9USFJFU0hPTEQ6IFwiMC4xXCJcbiAgICAgIH0sXG4gICAgICB1bmlmb3Jtczoge1xuICAgICAgICB0RGlmZnVzZTogbmV3IFVuaWZvcm0obnVsbCksXG4gICAgICAgIHRleGVsU2l6ZTogbmV3IFVuaWZvcm0odGV4ZWxTaXplKVxuICAgICAgfSxcbiAgICAgIGZyYWdtZW50U2hhZGVyOiBmcmFnbWVudCQyLFxuICAgICAgdmVydGV4U2hhZGVyOiB2ZXJ0ZXgkMixcbiAgICAgIGRlcHRoV3JpdGU6IGZhbHNlLFxuICAgICAgZGVwdGhUZXN0OiBmYWxzZVxuICAgIH0pKTtcbiAgfVxuICAvKipcclxuICAgKiBTZXRzIHRoZSBlZGdlIGRldGVjdGlvbiBzZW5zaXRpdml0eS5cclxuICAgKlxyXG4gICAqIEEgbG93ZXIgdmFsdWUgcmVzdWx0cyBpbiBtb3JlIGVkZ2VzIGJlaW5nIGRldGVjdGVkIGF0IHRoZSBleHBlbnNlIG9mXHJcbiAgICogcGVyZm9ybWFuY2UuXHJcbiAgICpcclxuICAgKiAwLjEgaXMgYSByZWFzb25hYmxlIHZhbHVlLCBhbmQgYWxsb3dzIHRvIGNhdGNoIG1vc3QgdmlzaWJsZSBlZGdlcy5cclxuICAgKiAwLjA1IGlzIGEgcmF0aGVyIG92ZXJraWxsIHZhbHVlLCB0aGF0IGFsbG93cyB0byBjYXRjaCAnZW0gYWxsLlxyXG4gICAqXHJcbiAgICogSWYgdGVtcG9yYWwgc3VwZXJzYW1wbGluZyBpcyB1c2VkLCAwLjIgY291bGQgYmUgYSByZWFzb25hYmxlIHZhbHVlLFxyXG4gICAqIGFzIGxvdyBjb250cmFzdCBlZGdlcyBhcmUgcHJvcGVybHkgZmlsdGVyZWQgYnkganVzdCAyeC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSB0aHJlc2hvbGQgLSBUaGUgZWRnZSBkZXRlY3Rpb24gc2Vuc2l0aXZpdHkuIFJhbmdlOiBbMCwgMC41XS5cclxuICAgKi9cblxuXG4gIGNyZWF0ZUNsYXNzKENvbG9yRWRnZXNNYXRlcmlhbCwgW3tcbiAgICBrZXk6IFwic2V0RWRnZURldGVjdGlvblRocmVzaG9sZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRFZGdlRGV0ZWN0aW9uVGhyZXNob2xkKHRocmVzaG9sZCkge1xuICAgICAgdGhpcy5kZWZpbmVzLkVER0VfVEhSRVNIT0xEID0gdGhyZXNob2xkLnRvRml4ZWQoXCIyXCIpO1xuICAgICAgdGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7XG4gICAgfVxuICB9XSk7XG5cbiAgaW5oZXJpdHMoQ29sb3JFZGdlc01hdGVyaWFsLCBfU2hhZGVyTWF0ZXJpYWwpO1xuXG4gIHJldHVybiBDb2xvckVkZ2VzTWF0ZXJpYWw7XG59KFNoYWRlck1hdGVyaWFsKTtcblxudmFyIGZyYWdtZW50JDMgPSBcInVuaWZvcm0gc2FtcGxlcjJEIHRleHR1cmUxO1xcclxcbnVuaWZvcm0gc2FtcGxlcjJEIHRleHR1cmUyO1xcclxcblxcclxcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTE7XFxyXFxudW5pZm9ybSBmbG9hdCBvcGFjaXR5MjtcXHJcXG5cXHJcXG52YXJ5aW5nIHZlYzIgdlV2O1xcclxcblxcclxcbnZvaWQgbWFpbigpIHtcXHJcXG5cXHJcXG5cXHR2ZWM0IHRleGVsMSA9IG9wYWNpdHkxICogdGV4dHVyZTJEKHRleHR1cmUxLCB2VXYpO1xcclxcblxcdHZlYzQgdGV4ZWwyID0gb3BhY2l0eTIgKiB0ZXh0dXJlMkQodGV4dHVyZTIsIHZVdik7XFxyXFxuXFxyXFxuXFx0I2lmZGVmIFNDUkVFTl9NT0RFXFxyXFxuXFxyXFxuXFx0XFx0dmVjMyBpbnZUZXhlbDEgPSB2ZWMzKDEuMCkgLSB0ZXhlbDEucmdiO1xcclxcblxcdFxcdHZlYzMgaW52VGV4ZWwyID0gdmVjMygxLjApIC0gdGV4ZWwyLnJnYjtcXHJcXG5cXHJcXG5cXHRcXHR2ZWM0IGNvbG9yID0gdmVjNChcXHJcXG5cXHRcXHRcXHR2ZWMzKDEuMCkgLSBpbnZUZXhlbDEgKiBpbnZUZXhlbDIsXFxyXFxuXFx0XFx0XFx0dGV4ZWwxLmEgKyB0ZXhlbDIuYVxcclxcblxcdFxcdCk7XFxyXFxuXFxyXFxuXFx0I2Vsc2VcXHJcXG5cXHJcXG5cXHRcXHR2ZWM0IGNvbG9yID0gdGV4ZWwxICsgdGV4ZWwyO1xcclxcblxcclxcblxcdCNlbmRpZlxcclxcblxcclxcblxcdGdsX0ZyYWdDb2xvciA9IGNvbG9yO1xcclxcblxcclxcbn1cXHJcXG5cIjtcbnZhciB2ZXJ0ZXgkMyA9IFwidmFyeWluZyB2ZWMyIHZVdjtcXHJcXG5cXHJcXG52b2lkIG1haW4oKSB7XFxyXFxuXFxyXFxuXFx0dlV2ID0gdXY7XFxyXFxuXFx0Z2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbW9kZWxWaWV3TWF0cml4ICogdmVjNChwb3NpdGlvbiwgMS4wKTtcXHJcXG5cXHJcXG59XFxyXFxuXCI7XG4vKipcclxuICogQSBtYXRlcmlhbCBmb3IgY29tYmluaW5nIHR3byB0ZXh0dXJlcy5cclxuICpcclxuICogVGhpcyBtYXRlcmlhbCBzdXBwb3J0cyB0aGUgdHdvIGJsZW5kIG1vZGVzIEFkZCBhbmQgU2NyZWVuLlxyXG4gKlxyXG4gKiBJbiBTY3JlZW4gbW9kZSwgdGhlIHR3byB0ZXh0dXJlcyBhcmUgZWZmZWN0aXZlbHkgcHJvamVjdGVkIG9uIGEgd2hpdGUgc2NyZWVuXHJcbiAqIHNpbXVsdGFuZW91c2x5LiBJbiBBZGQgbW9kZSwgdGhlIHRleHR1cmVzIGFyZSBzaW1wbHkgYWRkZWQgdG9nZXRoZXIgd2hpY2hcclxuICogb2Z0ZW4gcHJvZHVjZXMgdW5kZXNpcmVkLCB3YXNoZWQgb3V0IHJlc3VsdHMuXHJcbiAqL1xuXG52YXIgQ29tYmluZU1hdGVyaWFsID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfU2hhZGVyTWF0ZXJpYWwpIHtcbiAgLyoqXHJcbiAgICogQ29uc3RydWN0cyBhIG5ldyBjb21iaW5lIG1hdGVyaWFsLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtCb29sZWFufSBbc2NyZWVuTW9kZT1mYWxzZV0gLSBXaGV0aGVyIHRoZSBzY3JlZW4gYmxlbmQgbW9kZSBzaG91bGQgYmUgdXNlZC5cclxuICAgKi9cbiAgZnVuY3Rpb24gQ29tYmluZU1hdGVyaWFsKCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIHZhciBzY3JlZW5Nb2RlID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBmYWxzZTtcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIENvbWJpbmVNYXRlcmlhbCk7XG5cbiAgICBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgZ2V0UHJvdG90eXBlT2YkMihDb21iaW5lTWF0ZXJpYWwpLmNhbGwodGhpcywge1xuICAgICAgdHlwZTogXCJDb21iaW5lTWF0ZXJpYWxcIixcbiAgICAgIHVuaWZvcm1zOiB7XG4gICAgICAgIHRleHR1cmUxOiBuZXcgVW5pZm9ybShudWxsKSxcbiAgICAgICAgdGV4dHVyZTI6IG5ldyBVbmlmb3JtKG51bGwpLFxuICAgICAgICBvcGFjaXR5MTogbmV3IFVuaWZvcm0oMS4wKSxcbiAgICAgICAgb3BhY2l0eTI6IG5ldyBVbmlmb3JtKDEuMClcbiAgICAgIH0sXG4gICAgICBmcmFnbWVudFNoYWRlcjogZnJhZ21lbnQkMyxcbiAgICAgIHZlcnRleFNoYWRlcjogdmVydGV4JDMsXG4gICAgICBkZXB0aFdyaXRlOiBmYWxzZSxcbiAgICAgIGRlcHRoVGVzdDogZmFsc2VcbiAgICB9KSk7XG5cbiAgICBfdGhpcy5zZXRTY3JlZW5Nb2RlRW5hYmxlZChzY3JlZW5Nb2RlKTtcblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuICAvKipcclxuICAgKiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBTY3JlZW4gYmxlbmQgbW9kZS5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gZW5hYmxlZCAtIFdoZXRoZXIgdGhlIFNjcmVlbiBibGVuZCBtb2RlIHNob3VsZCBiZSBlbmFibGVkLlxyXG4gICAqL1xuXG5cbiAgY3JlYXRlQ2xhc3MoQ29tYmluZU1hdGVyaWFsLCBbe1xuICAgIGtleTogXCJzZXRTY3JlZW5Nb2RlRW5hYmxlZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRTY3JlZW5Nb2RlRW5hYmxlZChlbmFibGVkKSB7XG4gICAgICBpZiAoZW5hYmxlZCkge1xuICAgICAgICB0aGlzLmRlZmluZXMuU0NSRUVOX01PREUgPSBcIjFcIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLmRlZmluZXMuU0NSRUVOX01PREU7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlO1xuICAgIH1cbiAgfV0pO1xuXG4gIGluaGVyaXRzKENvbWJpbmVNYXRlcmlhbCwgX1NoYWRlck1hdGVyaWFsKTtcblxuICByZXR1cm4gQ29tYmluZU1hdGVyaWFsO1xufShTaGFkZXJNYXRlcmlhbCk7XG5cbnZhciBmcmFnbWVudCQ0ID0gXCIjaW5jbHVkZSA8Y29tbW9uPlxcclxcbiNpbmNsdWRlIDxkaXRoZXJpbmdfcGFyc19mcmFnbWVudD5cXHJcXG5cXHJcXG51bmlmb3JtIHNhbXBsZXIyRCB0RGlmZnVzZTtcXHJcXG5cXHJcXG52YXJ5aW5nIHZlYzIgdlV2MDtcXHJcXG52YXJ5aW5nIHZlYzIgdlV2MTtcXHJcXG52YXJ5aW5nIHZlYzIgdlV2MjtcXHJcXG52YXJ5aW5nIHZlYzIgdlV2MztcXHJcXG5cXHJcXG52b2lkIG1haW4oKSB7XFxyXFxuXFxyXFxuXFx0Ly8gU2FtcGxlIHRvcCBsZWZ0IHRleGVsLlxcclxcblxcdHZlYzQgc3VtID0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYwKTtcXHJcXG5cXHJcXG5cXHQvLyBTYW1wbGUgdG9wIHJpZ2h0IHRleGVsLlxcclxcblxcdHN1bSArPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdjEpO1xcclxcblxcclxcblxcdC8vIFNhbXBsZSBib3R0b20gcmlnaHQgdGV4ZWwuXFxyXFxuXFx0c3VtICs9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2Mik7XFxyXFxuXFxyXFxuXFx0Ly8gU2FtcGxlIGJvdHRvbSBsZWZ0IHRleGVsLlxcclxcblxcdHN1bSArPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdjMpO1xcclxcblxcclxcblxcdC8vIENvbXB1dGUgdGhlIGF2ZXJhZ2UuXFxyXFxuXFx0Z2xfRnJhZ0NvbG9yID0gc3VtICogMC4yNTtcXHJcXG5cXHJcXG5cXHQjaW5jbHVkZSA8ZGl0aGVyaW5nX2ZyYWdtZW50Plxcclxcblxcclxcbn1cXHJcXG5cIjtcbnZhciB2ZXJ0ZXgkNCA9IFwidW5pZm9ybSB2ZWMyIHRleGVsU2l6ZTtcXHJcXG51bmlmb3JtIHZlYzIgaGFsZlRleGVsU2l6ZTtcXHJcXG51bmlmb3JtIGZsb2F0IGtlcm5lbDtcXHJcXG5cXHJcXG52YXJ5aW5nIHZlYzIgdlV2MDtcXHJcXG52YXJ5aW5nIHZlYzIgdlV2MTtcXHJcXG52YXJ5aW5nIHZlYzIgdlV2MjtcXHJcXG52YXJ5aW5nIHZlYzIgdlV2MztcXHJcXG5cXHJcXG52b2lkIG1haW4oKSB7XFxyXFxuXFxyXFxuXFx0dmVjMiBkVXYgPSAodGV4ZWxTaXplICogdmVjMihrZXJuZWwpKSArIGhhbGZUZXhlbFNpemU7XFxyXFxuXFxyXFxuXFx0dlV2MCA9IHZlYzIodXYueCAtIGRVdi54LCB1di55ICsgZFV2LnkpO1xcclxcblxcdHZVdjEgPSB2ZWMyKHV2LnggKyBkVXYueCwgdXYueSArIGRVdi55KTtcXHJcXG5cXHR2VXYyID0gdmVjMih1di54ICsgZFV2LngsIHV2LnkgLSBkVXYueSk7XFxyXFxuXFx0dlV2MyA9IHZlYzIodXYueCAtIGRVdi54LCB1di55IC0gZFV2LnkpO1xcclxcblxcclxcblxcdGdsX1Bvc2l0aW9uID0gcHJvamVjdGlvbk1hdHJpeCAqIG1vZGVsVmlld01hdHJpeCAqIHZlYzQocG9zaXRpb24sIDEuMCk7XFxyXFxuXFxyXFxufVxcclxcblwiO1xuLyoqXHJcbiAqIEFuIG9wdGltaXNlZCBjb252b2x1dGlvbiBzaGFkZXIgbWF0ZXJpYWwuXHJcbiAqXHJcbiAqIFRoaXMgbWF0ZXJpYWwgc3VwcG9ydHMgZGl0aGVyaW5nLlxyXG4gKlxyXG4gKiBCYXNlZCBvbiB0aGUgR0RDMjAwMyBQcmVzZW50YXRpb24gYnkgTWFzYWtpIEthd2FzZSwgQnVua2FzaGEgR2FtZXM6XHJcbiAqICBGcmFtZSBCdWZmZXIgUG9zdHByb2Nlc3NpbmcgRWZmZWN0cyBpbiBET1VCTEUtUy5ULkUuQS5MIChXcmVja2xlc3MpXHJcbiAqIGFuZCBhbiBhcnRpY2xlIGJ5IEZpbGlwIFN0cnVnYXIsIEludGVsOlxyXG4gKiAgQW4gaW52ZXN0aWdhdGlvbiBvZiBmYXN0IHJlYWwtdGltZSBHUFUtYmFzZWQgaW1hZ2UgYmx1ciBhbGdvcml0aG1zXHJcbiAqXHJcbiAqIEZ1cnRoZXIgbW9kaWZpZWQgYWNjb3JkaW5nIHRvIEFwcGxlJ3NcclxuICogW0Jlc3QgUHJhY3RpY2VzIGZvciBTaGFkZXJzXShodHRwczovL2dvby5nbC9sbVJvTTUpLlxyXG4gKi9cblxudmFyIENvbnZvbHV0aW9uTWF0ZXJpYWwgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9TaGFkZXJNYXRlcmlhbCkge1xuICAvKipcclxuICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGNvbnZvbHV0aW9uIG1hdGVyaWFsLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtWZWN0b3IyfSBbdGV4ZWxTaXplXSAtIFRoZSBhYnNvbHV0ZSBzY3JlZW4gdGV4ZWwgc2l6ZS5cclxuICAgKi9cbiAgZnVuY3Rpb24gQ29udm9sdXRpb25NYXRlcmlhbCgpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICB2YXIgdGV4ZWxTaXplID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBuZXcgVmVjdG9yMigpO1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgQ29udm9sdXRpb25NYXRlcmlhbCk7XG5cbiAgICBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgZ2V0UHJvdG90eXBlT2YkMihDb252b2x1dGlvbk1hdGVyaWFsKS5jYWxsKHRoaXMsIHtcbiAgICAgIHR5cGU6IFwiQ29udm9sdXRpb25NYXRlcmlhbFwiLFxuICAgICAgdW5pZm9ybXM6IHtcbiAgICAgICAgdERpZmZ1c2U6IG5ldyBVbmlmb3JtKG51bGwpLFxuICAgICAgICB0ZXhlbFNpemU6IG5ldyBVbmlmb3JtKG5ldyBWZWN0b3IyKCkpLFxuICAgICAgICBoYWxmVGV4ZWxTaXplOiBuZXcgVW5pZm9ybShuZXcgVmVjdG9yMigpKSxcbiAgICAgICAga2VybmVsOiBuZXcgVW5pZm9ybSgwLjApXG4gICAgICB9LFxuICAgICAgZnJhZ21lbnRTaGFkZXI6IGZyYWdtZW50JDQsXG4gICAgICB2ZXJ0ZXhTaGFkZXI6IHZlcnRleCQ0LFxuICAgICAgZGVwdGhXcml0ZTogZmFsc2UsXG4gICAgICBkZXB0aFRlc3Q6IGZhbHNlXG4gICAgfSkpO1xuXG4gICAgX3RoaXMuc2V0VGV4ZWxTaXplKHRleGVsU2l6ZS54LCB0ZXhlbFNpemUueSk7XG4gICAgLyoqXHJcbiAgICAgKiBUaGUgY3VycmVudCBrZXJuZWwgc2l6ZS5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7S2VybmVsU2l6ZX1cclxuICAgICAqIEBkZWZhdWx0IEtlcm5lbFNpemUuTEFSR0VcclxuICAgICAqL1xuXG5cbiAgICBfdGhpcy5rZXJuZWxTaXplID0gS2VybmVsU2l6ZS5MQVJHRTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgLyoqXHJcbiAgICogUmV0dXJucyB0aGUga2VybmVsLlxyXG4gICAqXHJcbiAgICogQHJldHVybiB7RmxvYXQzMkFycmF5fSBUaGUga2VybmVsLlxyXG4gICAqL1xuXG5cbiAgY3JlYXRlQ2xhc3MoQ29udm9sdXRpb25NYXRlcmlhbCwgW3tcbiAgICBrZXk6IFwiZ2V0S2VybmVsXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldEtlcm5lbCgpIHtcbiAgICAgIHJldHVybiBrZXJuZWxQcmVzZXRzW3RoaXMua2VybmVsU2l6ZV07XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgdGV4ZWwgc2l6ZS5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcn0geCAtIFRoZSB0ZXhlbCB3aWR0aC5cclxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSB5IC0gVGhlIHRleGVsIGhlaWdodC5cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwic2V0VGV4ZWxTaXplXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldFRleGVsU2l6ZSh4LCB5KSB7XG4gICAgICB0aGlzLnVuaWZvcm1zLnRleGVsU2l6ZS52YWx1ZS5zZXQoeCwgeSk7XG4gICAgICB0aGlzLnVuaWZvcm1zLmhhbGZUZXhlbFNpemUudmFsdWUuc2V0KHgsIHkpLm11bHRpcGx5U2NhbGFyKDAuNSk7XG4gICAgfVxuICB9XSk7XG5cbiAgaW5oZXJpdHMoQ29udm9sdXRpb25NYXRlcmlhbCwgX1NoYWRlck1hdGVyaWFsKTtcblxuICByZXR1cm4gQ29udm9sdXRpb25NYXRlcmlhbDtcbn0oU2hhZGVyTWF0ZXJpYWwpO1xuLyoqXHJcbiAqIFRoZSBLYXdhc2UgYmx1ciBrZXJuZWwgcHJlc2V0cy5cclxuICpcclxuICogQHR5cGUge0Zsb2F0MzJBcnJheVtdfVxyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cblxudmFyIGtlcm5lbFByZXNldHMgPSBbbmV3IEZsb2F0MzJBcnJheShbMC4wLCAwLjBdKSwgbmV3IEZsb2F0MzJBcnJheShbMC4wLCAxLjAsIDEuMF0pLCBuZXcgRmxvYXQzMkFycmF5KFswLjAsIDEuMCwgMS4wLCAyLjBdKSwgbmV3IEZsb2F0MzJBcnJheShbMC4wLCAxLjAsIDIuMCwgMi4wLCAzLjBdKSwgbmV3IEZsb2F0MzJBcnJheShbMC4wLCAxLjAsIDIuMCwgMy4wLCA0LjAsIDQuMCwgNS4wXSksIG5ldyBGbG9hdDMyQXJyYXkoWzAuMCwgMS4wLCAyLjAsIDMuMCwgNC4wLCA1LjAsIDcuMCwgOC4wLCA5LjAsIDEwLjBdKV07XG4vKipcclxuICogQSBrZXJuZWwgc2l6ZSBlbnVtZXJhdGlvbi5cclxuICpcclxuICogQHR5cGUge09iamVjdH1cclxuICogQHByb3BlcnR5IHtOdW1iZXJ9IFZFUllfU01BTEwgLSBBIHZlcnkgc21hbGwga2VybmVsIHRoYXQgbWF0Y2hlcyBhIDd4NyBHYXVzcyBibHVyIGtlcm5lbC5cclxuICogQHByb3BlcnR5IHtOdW1iZXJ9IFNNQUxMIC0gQSBzbWFsbCBrZXJuZWwgdGhhdCBtYXRjaGVzIGEgMTV4MTUgR2F1c3MgYmx1ciBrZXJuZWwuXHJcbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBNRURJVU0gLSBBIG1lZGl1bSBzaXplZCBrZXJuZWwgdGhhdCBtYXRjaGVzIGEgMjN4MjMgR2F1c3MgYmx1ciBrZXJuZWwuXHJcbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBMQVJHRSAtIEEgbGFyZ2Uga2VybmVsIHRoYXQgbWF0Y2hlcyBhIDM1eDM1IEdhdXNzIGJsdXIga2VybmVsLlxyXG4gKiBAcHJvcGVydHkge051bWJlcn0gVkVSWV9MQVJHRSAtIEEgdmVyeSBsYXJnZSBrZXJuZWwgdGhhdCBtYXRjaGVzIGEgNjN4NjMgR2F1c3MgYmx1ciBrZXJuZWwuXHJcbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBIVUdFIC0gQSBodWdlIGtlcm5lbCB0aGF0IG1hdGNoZXMgYSAxMjd4MTI3IEdhdXNzIGJsdXIga2VybmVsLlxyXG4gKi9cblxudmFyIEtlcm5lbFNpemUgPSB7XG4gIFZFUllfU01BTEw6IDAsXG4gIFNNQUxMOiAxLFxuICBNRURJVU06IDIsXG4gIExBUkdFOiAzLFxuICBWRVJZX0xBUkdFOiA0LFxuICBIVUdFOiA1XG59O1xuXG52YXIgZnJhZ21lbnQkNSA9IFwidW5pZm9ybSBzYW1wbGVyMkQgdERpZmZ1c2U7XFxyXFxudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xcclxcblxcclxcbnZhcnlpbmcgdmVjMiB2VXY7XFxyXFxuXFxyXFxudm9pZCBtYWluKCkge1xcclxcblxcclxcblxcdHZlYzQgdGV4ZWwgPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdik7XFxyXFxuXFx0Z2xfRnJhZ0NvbG9yID0gb3BhY2l0eSAqIHRleGVsO1xcclxcblxcclxcbn1cXHJcXG5cIjtcbnZhciB2ZXJ0ZXgkNSA9IFwidmFyeWluZyB2ZWMyIHZVdjtcXHJcXG5cXHJcXG52b2lkIG1haW4oKSB7XFxyXFxuXFxyXFxuXFx0dlV2ID0gdXY7XFxyXFxuXFx0Z2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbW9kZWxWaWV3TWF0cml4ICogdmVjNChwb3NpdGlvbiwgMS4wKTtcXHJcXG5cXHJcXG59XFxyXFxuXCI7XG4vKipcclxuICogQSBzaW1wbGUgY29weSBzaGFkZXIgbWF0ZXJpYWwuXHJcbiAqL1xuXG52YXIgQ29weU1hdGVyaWFsID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfU2hhZGVyTWF0ZXJpYWwpIHtcbiAgLyoqXHJcbiAgICogQ29uc3RydWN0cyBhIG5ldyBjb3B5IG1hdGVyaWFsLlxyXG4gICAqL1xuICBmdW5jdGlvbiBDb3B5TWF0ZXJpYWwoKSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgQ29weU1hdGVyaWFsKTtcblxuICAgIHJldHVybiBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIGdldFByb3RvdHlwZU9mJDIoQ29weU1hdGVyaWFsKS5jYWxsKHRoaXMsIHtcbiAgICAgIHR5cGU6IFwiQ29weU1hdGVyaWFsXCIsXG4gICAgICB1bmlmb3Jtczoge1xuICAgICAgICB0RGlmZnVzZTogbmV3IFVuaWZvcm0obnVsbCksXG4gICAgICAgIG9wYWNpdHk6IG5ldyBVbmlmb3JtKDEuMClcbiAgICAgIH0sXG4gICAgICBmcmFnbWVudFNoYWRlcjogZnJhZ21lbnQkNSxcbiAgICAgIHZlcnRleFNoYWRlcjogdmVydGV4JDUsXG4gICAgICBkZXB0aFdyaXRlOiBmYWxzZSxcbiAgICAgIGRlcHRoVGVzdDogZmFsc2VcbiAgICB9KSk7XG4gIH1cblxuICBpbmhlcml0cyhDb3B5TWF0ZXJpYWwsIF9TaGFkZXJNYXRlcmlhbCk7XG5cbiAgcmV0dXJuIENvcHlNYXRlcmlhbDtcbn0oU2hhZGVyTWF0ZXJpYWwpO1xuXG52YXIgZnJhZ21lbnQkNiA9IFwiI2luY2x1ZGUgPHBhY2tpbmc+XFxyXFxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50PlxcclxcblxcclxcbnVuaWZvcm0gc2FtcGxlcjJEIHREZXB0aDtcXHJcXG51bmlmb3JtIGZsb2F0IGNhbWVyYU5lYXI7XFxyXFxudW5pZm9ybSBmbG9hdCBjYW1lcmFGYXI7XFxyXFxuXFxyXFxudmFyeWluZyBmbG9hdCB2Vmlld1o7XFxyXFxudmFyeWluZyB2ZWM0IHZQcm9qVGV4Q29vcmQ7XFxyXFxuXFxyXFxudm9pZCBtYWluKCkge1xcclxcblxcclxcblxcdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+XFxyXFxuXFxyXFxuXFx0Ly8gVHJhbnNmb3JtIGludG8gQ2FydGVzaWFuIGNvb3JkaW5hdGUgKG5vdCBtaXJyb3JlZCkuXFxyXFxuXFx0dmVjMiBwcm9qVGV4Q29vcmQgPSAodlByb2pUZXhDb29yZC54eSAvIHZQcm9qVGV4Q29vcmQudykgKiAwLjUgKyAwLjU7XFxyXFxuXFx0cHJvalRleENvb3JkID0gY2xhbXAocHJvalRleENvb3JkLCAwLjAwMiwgMC45OTgpO1xcclxcblxcclxcblxcdGZsb2F0IGZyYWdDb29yZFogPSB1bnBhY2tSR0JBVG9EZXB0aCh0ZXh0dXJlMkQodERlcHRoLCBwcm9qVGV4Q29vcmQpKTtcXHJcXG5cXHJcXG5cXHQjaWZkZWYgUEVSU1BFQ1RJVkVfQ0FNRVJBXFxyXFxuXFxyXFxuXFx0XFx0ZmxvYXQgdmlld1ogPSBwZXJzcGVjdGl2ZURlcHRoVG9WaWV3WihmcmFnQ29vcmRaLCBjYW1lcmFOZWFyLCBjYW1lcmFGYXIpO1xcclxcblxcclxcblxcdCNlbHNlXFxyXFxuXFxyXFxuXFx0XFx0ZmxvYXQgdmlld1ogPSBvcnRob2dyYXBoaWNEZXB0aFRvVmlld1ooZnJhZ0Nvb3JkWiwgY2FtZXJhTmVhciwgY2FtZXJhRmFyKTtcXHJcXG5cXHJcXG5cXHQjZW5kaWZcXHJcXG5cXHJcXG5cXHRmbG9hdCBkZXB0aFRlc3QgPSAoLXZWaWV3WiA+IC12aWV3WikgPyAxLjAgOiAwLjA7XFxyXFxuXFxyXFxuXFx0Z2xfRnJhZ0NvbG9yLnJnYiA9IHZlYzMoMC4wLCBkZXB0aFRlc3QsIDEuMCk7XFxyXFxuXFxyXFxufVxcclxcblwiO1xudmFyIHZlcnRleCQ2ID0gXCIjaW5jbHVkZSA8Y29tbW9uPlxcclxcbiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD5cXHJcXG4jaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+XFxyXFxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD5cXHJcXG5cXHJcXG52YXJ5aW5nIGZsb2F0IHZWaWV3WjtcXHJcXG52YXJ5aW5nIHZlYzQgdlByb2pUZXhDb29yZDtcXHJcXG5cXHJcXG52b2lkIG1haW4oKSB7XFxyXFxuXFxyXFxuXFx0I2luY2x1ZGUgPHNraW5iYXNlX3ZlcnRleD5cXHJcXG5cXHJcXG5cXHQjaW5jbHVkZSA8YmVnaW5fdmVydGV4PlxcclxcblxcdCNpbmNsdWRlIDxtb3JwaHRhcmdldF92ZXJ0ZXg+XFxyXFxuXFx0I2luY2x1ZGUgPHNraW5uaW5nX3ZlcnRleD5cXHJcXG5cXHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XFxyXFxuXFxyXFxuXFx0dlZpZXdaID0gbXZQb3NpdGlvbi56O1xcclxcblxcdHZQcm9qVGV4Q29vcmQgPSBnbF9Qb3NpdGlvbjtcXHJcXG5cXHJcXG5cXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD5cXHJcXG5cXHJcXG59XFxyXFxuXCI7XG4vKipcclxuICogQSBkZXB0aCBjb21wYXJpc29uIHNoYWRlciBtYXRlcmlhbC5cclxuICovXG5cbnZhciBEZXB0aENvbXBhcmlzb25NYXRlcmlhbCA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX1NoYWRlck1hdGVyaWFsKSB7XG4gIC8qKlxyXG4gICAqIENvbnN0cnVjdHMgYSBuZXcgZGVwdGggY29tcGFyaXNvbiBtYXRlcmlhbC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7VGV4dHVyZX0gW2RlcHRoVGV4dHVyZT1udWxsXSAtIEEgZGVwdGggdGV4dHVyZS5cclxuICAgKiBAcGFyYW0ge1BlcnNwZWN0aXZlQ2FtZXJhfSBbY2FtZXJhXSAtIEEgY2FtZXJhLlxyXG4gICAqL1xuICBmdW5jdGlvbiBEZXB0aENvbXBhcmlzb25NYXRlcmlhbCgpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICB2YXIgZGVwdGhUZXh0dXJlID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBudWxsO1xuICAgIHZhciBjYW1lcmEgPSBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZDtcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIERlcHRoQ29tcGFyaXNvbk1hdGVyaWFsKTtcblxuICAgIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBnZXRQcm90b3R5cGVPZiQyKERlcHRoQ29tcGFyaXNvbk1hdGVyaWFsKS5jYWxsKHRoaXMsIHtcbiAgICAgIHR5cGU6IFwiRGVwdGhDb21wYXJpc29uTWF0ZXJpYWxcIixcbiAgICAgIHVuaWZvcm1zOiB7XG4gICAgICAgIHREZXB0aDogbmV3IFVuaWZvcm0oZGVwdGhUZXh0dXJlKSxcbiAgICAgICAgY2FtZXJhTmVhcjogbmV3IFVuaWZvcm0oMC4xKSxcbiAgICAgICAgY2FtZXJhRmFyOiBuZXcgVW5pZm9ybSgyMDAwKVxuICAgICAgfSxcbiAgICAgIGZyYWdtZW50U2hhZGVyOiBmcmFnbWVudCQ2LFxuICAgICAgdmVydGV4U2hhZGVyOiB2ZXJ0ZXgkNixcbiAgICAgIGRlcHRoV3JpdGU6IGZhbHNlLFxuICAgICAgZGVwdGhUZXN0OiBmYWxzZSxcbiAgICAgIG1vcnBoVGFyZ2V0czogdHJ1ZSxcbiAgICAgIHNraW5uaW5nOiB0cnVlXG4gICAgfSkpO1xuXG4gICAgX3RoaXMuYWRvcHRDYW1lcmFTZXR0aW5ncyhjYW1lcmEpO1xuXG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG4gIC8qKlxyXG4gICAqIEFkb3B0cyB0aGUgc2V0dGluZ3Mgb2YgdGhlIGdpdmVuIGNhbWVyYS5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7Q2FtZXJhfSBbY2FtZXJhPW51bGxdIC0gQSBjYW1lcmEuXHJcbiAgICovXG5cblxuICBjcmVhdGVDbGFzcyhEZXB0aENvbXBhcmlzb25NYXRlcmlhbCwgW3tcbiAgICBrZXk6IFwiYWRvcHRDYW1lcmFTZXR0aW5nc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBhZG9wdENhbWVyYVNldHRpbmdzKCkge1xuICAgICAgdmFyIGNhbWVyYSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogbnVsbDtcblxuICAgICAgaWYgKGNhbWVyYSAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLnVuaWZvcm1zLmNhbWVyYU5lYXIudmFsdWUgPSBjYW1lcmEubmVhcjtcbiAgICAgICAgdGhpcy51bmlmb3Jtcy5jYW1lcmFGYXIudmFsdWUgPSBjYW1lcmEuZmFyO1xuXG4gICAgICAgIGlmIChjYW1lcmEgaW5zdGFuY2VvZiBQZXJzcGVjdGl2ZUNhbWVyYSkge1xuICAgICAgICAgIHRoaXMuZGVmaW5lcy5QRVJTUEVDVElWRV9DQU1FUkEgPSBcIjFcIjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkZWxldGUgdGhpcy5kZWZpbmVzLlBFUlNQRUNUSVZFX0NBTUVSQTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfV0pO1xuXG4gIGluaGVyaXRzKERlcHRoQ29tcGFyaXNvbk1hdGVyaWFsLCBfU2hhZGVyTWF0ZXJpYWwpO1xuXG4gIHJldHVybiBEZXB0aENvbXBhcmlzb25NYXRlcmlhbDtcbn0oU2hhZGVyTWF0ZXJpYWwpO1xuXG52YXIgZnJhZ21lbnQkNyA9IFwidW5pZm9ybSBzYW1wbGVyMkQgdERpZmZ1c2U7XFxyXFxuXFxyXFxudW5pZm9ybSBmbG9hdCBhbmdsZTtcXHJcXG51bmlmb3JtIGZsb2F0IHNjYWxlO1xcclxcbnVuaWZvcm0gZmxvYXQgaW50ZW5zaXR5O1xcclxcblxcclxcbnZhcnlpbmcgdmVjMiB2VXY7XFxyXFxudmFyeWluZyB2ZWMyIHZVdlBhdHRlcm47XFxyXFxuXFxyXFxuZmxvYXQgcGF0dGVybigpIHtcXHJcXG5cXHJcXG5cXHRmbG9hdCBzID0gc2luKGFuZ2xlKTtcXHJcXG5cXHRmbG9hdCBjID0gY29zKGFuZ2xlKTtcXHJcXG5cXHJcXG5cXHR2ZWMyIHBvaW50ID0gdmVjMihjICogdlV2UGF0dGVybi54IC0gcyAqIHZVdlBhdHRlcm4ueSwgcyAqIHZVdlBhdHRlcm4ueCArIGMgKiB2VXZQYXR0ZXJuLnkpICogc2NhbGU7XFxyXFxuXFxyXFxuXFx0cmV0dXJuIChzaW4ocG9pbnQueCkgKiBzaW4ocG9pbnQueSkpICogNC4wO1xcclxcblxcclxcbn1cXHJcXG5cXHJcXG52b2lkIG1haW4oKSB7XFxyXFxuXFxyXFxuXFx0dmVjNCB0ZXhlbCA9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2KTtcXHJcXG5cXHR2ZWMzIGNvbG9yID0gdGV4ZWwucmdiO1xcclxcblxcclxcblxcdCNpZmRlZiBBVkVSQUdFXFxyXFxuXFxyXFxuXFx0XFx0Y29sb3IgPSB2ZWMzKChjb2xvci5yICsgY29sb3IuZyArIGNvbG9yLmIpIC8gMy4wKTtcXHJcXG5cXHJcXG5cXHQjZW5kaWZcXHJcXG5cXHJcXG5cXHRjb2xvciA9IHZlYzMoY29sb3IgKiAxMC4wIC0gNS4wICsgcGF0dGVybigpKTtcXHJcXG5cXHRjb2xvciA9IHRleGVsLnJnYiArIChjb2xvciAtIHRleGVsLnJnYikgKiBpbnRlbnNpdHk7XFxyXFxuXFxyXFxuXFx0Z2xfRnJhZ0NvbG9yID0gdmVjNChjb2xvciwgdGV4ZWwuYSk7XFxyXFxuXFxyXFxufVxcclxcblwiO1xudmFyIHZlcnRleCQ3ID0gXCJ1bmlmb3JtIHZlYzQgb2Zmc2V0UmVwZWF0O1xcclxcblxcclxcbnZhcnlpbmcgdmVjMiB2VXY7XFxyXFxudmFyeWluZyB2ZWMyIHZVdlBhdHRlcm47XFxyXFxuXFxyXFxudm9pZCBtYWluKCkge1xcclxcblxcclxcblxcdHZVdiA9IHV2O1xcclxcblxcdHZVdlBhdHRlcm4gPSB1diAqIG9mZnNldFJlcGVhdC56dyArIG9mZnNldFJlcGVhdC54eTtcXHJcXG5cXHRnbF9Qb3NpdGlvbiA9IHByb2plY3Rpb25NYXRyaXggKiBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KHBvc2l0aW9uLCAxLjApO1xcclxcblxcclxcbn1cXHJcXG5cIjtcbi8qKlxyXG4gKiBBIGRvdCBzY3JlZW4gc2hhZGVyIG1hdGVyaWFsLlxyXG4gKi9cblxudmFyIERvdFNjcmVlbk1hdGVyaWFsID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfU2hhZGVyTWF0ZXJpYWwpIHtcbiAgLyoqXHJcbiAgICogQ29uc3RydWN0cyBhIG5ldyBkb3Qgc2NyZWVuIG1hdGVyaWFsLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9uc10gLSBUaGUgb3B0aW9ucy5cclxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmF2ZXJhZ2U9ZmFsc2VdIC0gV2hldGhlciB0aGUgc2hhZGVyIHNob3VsZCBvdXRwdXQgdGhlIGNvbG91ciBhdmVyYWdlIChibGFjayBhbmQgd2hpdGUpLlxyXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuYW5nbGU9MS41N10gLSBUaGUgYW5nbGUgb2YgdGhlIGRvdCBwYXR0ZXJuLlxyXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuc2NhbGU9MS4wXSAtIFRoZSBzY2FsZSBvZiB0aGUgZG90IHBhdHRlcm4uXHJcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5pbnRlbnNpdHk9MS4wXSAtIFRoZSBpbnRlbnNpdHkgb2YgdGhlIGVmZmVjdC5cclxuICAgKi9cbiAgZnVuY3Rpb24gRG90U2NyZWVuTWF0ZXJpYWwoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgRG90U2NyZWVuTWF0ZXJpYWwpO1xuXG4gICAgdmFyIHNldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICBhdmVyYWdlOiBmYWxzZSxcbiAgICAgIGFuZ2xlOiAxLjU3LFxuICAgICAgc2NhbGU6IDEuMCxcbiAgICAgIGludGVuc2l0eTogMS4wXG4gICAgfSwgb3B0aW9ucyk7XG4gICAgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIGdldFByb3RvdHlwZU9mJDIoRG90U2NyZWVuTWF0ZXJpYWwpLmNhbGwodGhpcywge1xuICAgICAgdHlwZTogXCJEb3RTY3JlZW5NYXRlcmlhbFwiLFxuICAgICAgdW5pZm9ybXM6IHtcbiAgICAgICAgdERpZmZ1c2U6IG5ldyBVbmlmb3JtKG51bGwpLFxuICAgICAgICBhbmdsZTogbmV3IFVuaWZvcm0oc2V0dGluZ3MuYW5nbGUpLFxuICAgICAgICBzY2FsZTogbmV3IFVuaWZvcm0oc2V0dGluZ3Muc2NhbGUpLFxuICAgICAgICBpbnRlbnNpdHk6IG5ldyBVbmlmb3JtKHNldHRpbmdzLmludGVuc2l0eSksXG4gICAgICAgIG9mZnNldFJlcGVhdDogbmV3IFVuaWZvcm0obmV3IFZlY3RvcjQoMC41LCAwLjUsIDEuMCwgMS4wKSlcbiAgICAgIH0sXG4gICAgICBmcmFnbWVudFNoYWRlcjogZnJhZ21lbnQkNyxcbiAgICAgIHZlcnRleFNoYWRlcjogdmVydGV4JDcsXG4gICAgICBkZXB0aFdyaXRlOiBmYWxzZSxcbiAgICAgIGRlcHRoVGVzdDogZmFsc2VcbiAgICB9KSk7XG5cbiAgICBfdGhpcy5zZXRBdmVyYWdlRW5hYmxlZChzZXR0aW5ncy5hdmVyYWdlKTtcblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuICAvKipcclxuICAgKiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBTY3JlZW4gYmxlbmQgbW9kZS5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gZW5hYmxlZCAtIFdoZXRoZXIgdGhlIFNjcmVlbiBibGVuZCBtb2RlIHNob3VsZCBiZSBlbmFibGVkLlxyXG4gICAqL1xuXG5cbiAgY3JlYXRlQ2xhc3MoRG90U2NyZWVuTWF0ZXJpYWwsIFt7XG4gICAga2V5OiBcInNldEF2ZXJhZ2VFbmFibGVkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldEF2ZXJhZ2VFbmFibGVkKGVuYWJsZWQpIHtcbiAgICAgIGlmIChlbmFibGVkKSB7XG4gICAgICAgIHRoaXMuZGVmaW5lcy5BVkVSQUdFID0gXCIxXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUgdGhpcy5kZWZpbmVzLkFWRVJBR0U7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlO1xuICAgIH1cbiAgfV0pO1xuXG4gIGluaGVyaXRzKERvdFNjcmVlbk1hdGVyaWFsLCBfU2hhZGVyTWF0ZXJpYWwpO1xuXG4gIHJldHVybiBEb3RTY3JlZW5NYXRlcmlhbDtcbn0oU2hhZGVyTWF0ZXJpYWwpO1xuXG52YXIgZnJhZ21lbnQkOCA9IFwidW5pZm9ybSBzYW1wbGVyMkQgdERpZmZ1c2U7XFxyXFxudW5pZm9ybSBmbG9hdCB0aW1lO1xcclxcblxcclxcbnZhcnlpbmcgdmVjMiB2VXY7XFxyXFxuXFxyXFxuI2lmZGVmIE5PSVNFXFxyXFxuXFxyXFxuXFx0dW5pZm9ybSBmbG9hdCBub2lzZUludGVuc2l0eTtcXHJcXG5cXHJcXG4jZW5kaWZcXHJcXG5cXHJcXG4jaWZkZWYgU0NBTkxJTkVTXFxyXFxuXFxyXFxuXFx0dW5pZm9ybSBmbG9hdCBzY2FubGluZUludGVuc2l0eTtcXHJcXG5cXHR1bmlmb3JtIGZsb2F0IHNjYW5saW5lQ291bnQ7XFxyXFxuXFxyXFxuI2VuZGlmXFxyXFxuXFxyXFxuI2lmZGVmIEdSSURcXHJcXG5cXHJcXG5cXHR1bmlmb3JtIGZsb2F0IGdyaWRJbnRlbnNpdHk7XFxyXFxuXFx0dW5pZm9ybSB2ZWMyIGdyaWRTY2FsZTtcXHJcXG5cXHR1bmlmb3JtIGZsb2F0IGdyaWRMaW5lV2lkdGg7XFxyXFxuXFxyXFxuI2VuZGlmXFxyXFxuXFxyXFxuI2lmZGVmIEdSRVlTQ0FMRVxcclxcblxcclxcblxcdCNpbmNsdWRlIDxjb21tb24+XFxyXFxuXFxyXFxuXFx0dW5pZm9ybSBmbG9hdCBncmV5c2NhbGVJbnRlbnNpdHk7XFxyXFxuXFxyXFxuI2VsaWYgZGVmaW5lZChTRVBJQSlcXHJcXG5cXHJcXG5cXHR1bmlmb3JtIGZsb2F0IHNlcGlhSW50ZW5zaXR5O1xcclxcblxcclxcbiNlbmRpZlxcclxcblxcclxcbiNpZmRlZiBWSUdORVRURVxcclxcblxcclxcblxcdHVuaWZvcm0gZmxvYXQgdmlnbmV0dGVPZmZzZXQ7XFxyXFxuXFx0dW5pZm9ybSBmbG9hdCB2aWduZXR0ZURhcmtuZXNzO1xcclxcblxcclxcbiNlbmRpZlxcclxcblxcclxcbnZvaWQgbWFpbigpIHtcXHJcXG5cXHJcXG5cXHR2ZWM0IHRleGVsID0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYpO1xcclxcblxcdHZlYzMgY29sb3IgPSB0ZXhlbC5yZ2I7XFxyXFxuXFxyXFxuXFx0I2lmZGVmIFNDUkVFTl9NT0RFXFxyXFxuXFxyXFxuXFx0XFx0dmVjMyBpbnZDb2xvcjtcXHJcXG5cXHJcXG5cXHQjZW5kaWZcXHJcXG5cXHJcXG5cXHQjaWZkZWYgTk9JU0VcXHJcXG5cXHJcXG5cXHRcXHRmbG9hdCB4ID0gdlV2LnggKiB2VXYueSAqIHRpbWUgKiAxMDAwLjA7XFxyXFxuXFx0XFx0eCA9IG1vZCh4LCAxMy4wKSAqIG1vZCh4LCAxMjMuMCk7XFxyXFxuXFx0XFx0eCA9IG1vZCh4LCAwLjAxKTtcXHJcXG5cXHJcXG5cXHRcXHR2ZWMzIG5vaXNlID0gdGV4ZWwucmdiICogY2xhbXAoMC4xICsgeCAqIDEwMC4wLCAwLjAsIDEuMCkgKiBub2lzZUludGVuc2l0eTtcXHJcXG5cXHJcXG5cXHRcXHQjaWZkZWYgU0NSRUVOX01PREVcXHJcXG5cXHJcXG5cXHRcXHRcXHRpbnZDb2xvciA9IHZlYzMoMS4wKSAtIGNvbG9yO1xcclxcblxcdFxcdFxcdHZlYzMgaW52Tm9pc2UgPSB2ZWMzKDEuMCkgLSBub2lzZTtcXHJcXG5cXHJcXG5cXHRcXHRcXHRjb2xvciA9IHZlYzMoMS4wKSAtIGludkNvbG9yICogaW52Tm9pc2U7XFxyXFxuXFxyXFxuXFx0XFx0I2Vsc2VcXHJcXG5cXHJcXG5cXHRcXHRcXHRjb2xvciArPSBub2lzZTtcXHJcXG5cXHJcXG5cXHRcXHQjZW5kaWZcXHJcXG5cXHJcXG5cXHQjZW5kaWZcXHJcXG5cXHJcXG5cXHQjaWZkZWYgU0NBTkxJTkVTXFxyXFxuXFxyXFxuXFx0XFx0dmVjMiBzbCA9IHZlYzIoc2luKHZVdi55ICogc2NhbmxpbmVDb3VudCksIGNvcyh2VXYueSAqIHNjYW5saW5lQ291bnQpKTtcXHJcXG5cXHRcXHR2ZWMzIHNjYW5saW5lcyA9IHRleGVsLnJnYiAqIHZlYzMoc2wueCwgc2wueSwgc2wueCkgKiBzY2FubGluZUludGVuc2l0eTtcXHJcXG5cXHJcXG5cXHRcXHQjaWZkZWYgU0NSRUVOX01PREVcXHJcXG5cXHJcXG5cXHRcXHRcXHRpbnZDb2xvciA9IHZlYzMoMS4wKSAtIGNvbG9yO1xcclxcblxcdFxcdFxcdHZlYzMgaW52U2NhbmxpbmVzID0gdmVjMygxLjApIC0gc2NhbmxpbmVzO1xcclxcblxcclxcblxcdFxcdFxcdGNvbG9yID0gdmVjMygxLjApIC0gaW52Q29sb3IgKiBpbnZTY2FubGluZXM7XFxyXFxuXFxyXFxuXFx0XFx0I2Vsc2VcXHJcXG5cXHJcXG5cXHRcXHRcXHRjb2xvciArPSBzY2FubGluZXM7XFxyXFxuXFxyXFxuXFx0XFx0I2VuZGlmXFxyXFxuXFxyXFxuXFx0I2VuZGlmXFxyXFxuXFxyXFxuXFx0I2lmZGVmIEdSSURcXHJcXG5cXHJcXG5cXHRcXHRmbG9hdCBncmlkID0gMC41IC0gbWF4KGFicyhtb2QodlV2LnggKiBncmlkU2NhbGUueCwgMS4wKSAtIDAuNSksIGFicyhtb2QodlV2LnkgKiBncmlkU2NhbGUueSwgMS4wKSAtIDAuNSkpO1xcclxcblxcdFxcdGNvbG9yICo9ICgxLjAgLSBncmlkSW50ZW5zaXR5KSArIHZlYzMoc21vb3Roc3RlcCgwLjAsIGdyaWRMaW5lV2lkdGgsIGdyaWQpKSAqIGdyaWRJbnRlbnNpdHk7XFxyXFxuXFxyXFxuXFx0I2VuZGlmXFxyXFxuXFxyXFxuXFx0I2lmZGVmIEdSRVlTQ0FMRVxcclxcblxcclxcblxcdFxcdGNvbG9yID0gbWl4KGNvbG9yLCB2ZWMzKGxpbmVhclRvUmVsYXRpdmVMdW1pbmFuY2UoY29sb3IpKSwgZ3JleXNjYWxlSW50ZW5zaXR5KTtcXHJcXG5cXHJcXG5cXHQjZWxpZiBkZWZpbmVkKFNFUElBKVxcclxcblxcclxcblxcdFxcdHZlYzMgYyA9IGNvbG9yLnJnYjtcXHJcXG5cXHJcXG5cXHRcXHRjb2xvci5yID0gZG90KGMsIHZlYzMoMS4wIC0gMC42MDcgKiBzZXBpYUludGVuc2l0eSwgMC43NjkgKiBzZXBpYUludGVuc2l0eSwgMC4xODkgKiBzZXBpYUludGVuc2l0eSkpO1xcclxcblxcdFxcdGNvbG9yLmcgPSBkb3QoYywgdmVjMygwLjM0OSAqIHNlcGlhSW50ZW5zaXR5LCAxLjAgLSAwLjMxNCAqIHNlcGlhSW50ZW5zaXR5LCAwLjE2OCAqIHNlcGlhSW50ZW5zaXR5KSk7XFxyXFxuXFx0XFx0Y29sb3IuYiA9IGRvdChjLCB2ZWMzKDAuMjcyICogc2VwaWFJbnRlbnNpdHksIDAuNTM0ICogc2VwaWFJbnRlbnNpdHksIDEuMCAtIDAuODY5ICogc2VwaWFJbnRlbnNpdHkpKTtcXHJcXG5cXHJcXG5cXHQjZW5kaWZcXHJcXG5cXHJcXG5cXHQjaWZkZWYgVklHTkVUVEVcXHJcXG5cXHJcXG5cXHRcXHRjb25zdCB2ZWMyIGNlbnRlciA9IHZlYzIoMC41KTtcXHJcXG5cXHJcXG5cXHRcXHQjaWZkZWYgRVNLSUxcXHJcXG5cXHJcXG5cXHRcXHRcXHR2ZWMyIHV2ID0gKHZVdiAtIGNlbnRlcikgKiB2ZWMyKHZpZ25ldHRlT2Zmc2V0KTtcXHJcXG5cXHRcXHRcXHRjb2xvciA9IG1peChjb2xvci5yZ2IsIHZlYzMoMS4wIC0gdmlnbmV0dGVEYXJrbmVzcyksIGRvdCh1diwgdXYpKTtcXHJcXG5cXHJcXG5cXHRcXHQjZWxzZVxcclxcblxcclxcblxcdFxcdFxcdGZsb2F0IGRpc3QgPSBkaXN0YW5jZSh2VXYsIGNlbnRlcik7XFxyXFxuXFx0XFx0XFx0Y29sb3IgKj0gc21vb3Roc3RlcCgwLjgsIHZpZ25ldHRlT2Zmc2V0ICogMC43OTksIGRpc3QgKiAodmlnbmV0dGVEYXJrbmVzcyArIHZpZ25ldHRlT2Zmc2V0KSk7XFxyXFxuXFxyXFxuXFx0XFx0I2VuZGlmXFx0XFx0XFxyXFxuXFxyXFxuXFx0I2VuZGlmXFxyXFxuXFxyXFxuXFx0Z2xfRnJhZ0NvbG9yID0gdmVjNChjbGFtcChjb2xvciwgMC4wLCAxLjApLCB0ZXhlbC5hKTtcXHJcXG5cXHJcXG59XFxyXFxuXCI7XG52YXIgdmVydGV4JDggPSBcInZhcnlpbmcgdmVjMiB2VXY7XFxyXFxuXFxyXFxudm9pZCBtYWluKCkge1xcclxcblxcclxcblxcdHZVdiA9IHV2O1xcclxcblxcdGdsX1Bvc2l0aW9uID0gcHJvamVjdGlvbk1hdHJpeCAqIG1vZGVsVmlld01hdHJpeCAqIHZlYzQocG9zaXRpb24sIDEuMCk7XFxyXFxuXFxyXFxufVxcclxcblwiO1xuLyoqXHJcbiAqIEEgY2luZW1hdGljIHNoYWRlciB0aGF0IHByb3ZpZGVzIHRoZSBmb2xsb3dpbmcgZWZmZWN0czpcclxuICogIC0gRmlsbSBHcmFpblxyXG4gKiAgLSBTY2FubGluZXNcclxuICogIC0gVmlnbmV0dGVcclxuICogIC0gR3JleXNjYWxlXHJcbiAqICAtIFNlcGlhXHJcbiAqXHJcbiAqIE9yaWdpbmFsIHNjYW5saW5lcyBhbGdvcml0aG0gYnkgUGF0IFwiSGF3dGhvcm5lXCIgU2hlYXJvbi5cclxuICogIGh0dHA6Ly93d3cudHJ1ZXZpc2lvbjNkLmNvbS9mb3J1bXMvc2hvd2Nhc2Uvc3RhdGljbm9pc2VfY29sb3JibGFja3doaXRlX3NjYW5saW5lX3NoYWRlcnMtdDE4Njk4LjAuaHRtbFxyXG4gKlxyXG4gKiBPcHRpbWlzZWQgc2NhbmxpbmVzIGFuZCBub2lzZSB3aXRoIGludGVuc2l0eSBzY2FsaW5nIGJ5IEdlb3JnIFwiTGV2aWF0aGFuXCJcclxuICogU3RlaW5yb2hkZXIuIFRoaXMgdmVyc2lvbiB3YXMgcHJvdmlkZWQgdW5kZXIgYSBDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uXHJcbiAqIDMuMCBMaWNlbnNlOiBodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS8zLjAuXHJcbiAqXHJcbiAqIFRoZSBzZXBpYSBlZmZlY3QgaXMgYmFzZWQgb246XHJcbiAqICBodHRwczovL2dpdGh1Yi5jb20vZXZhbncvZ2xmeC5qc1xyXG4gKlxyXG4gKiBUaGUgdmlnbmV0dGUgY29kZSBpcyBiYXNlZCBvbiBQYWludEVmZmVjdCBwb3N0cHJvY2VzcyBmcm9tIHJvLm1lOlxyXG4gKiAgaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wLzMtZHJlYW1zLW9mLWJsYWNrL3NvdXJjZS9icm93c2UvZGVwbG95L2pzL2VmZmVjdHMvUGFpbnRFZmZlY3QuanNcclxuICovXG5cbnZhciBGaWxtTWF0ZXJpYWwgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9TaGFkZXJNYXRlcmlhbCkge1xuICAvKipcclxuICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGZpbG0gbWF0ZXJpYWwuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gVGhlIG9wdGlvbnMuIERpc2FibGVkIGVmZmVjdHMgd2lsbCBub3QgYmUgaW5jbHVkZWQgaW4gdGhlIGZpbmFsIHNoYWRlciBhbmQgaGF2ZSBubyBuZWdhdGl2ZSBpbXBhY3Qgb24gcGVyZm9ybWFuY2UuXHJcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5ncmV5c2NhbGU9ZmFsc2VdIC0gRW5hYmxlIGdyZXlzY2FsZSBlZmZlY3QuIEdyZXlzY2FsZSBhbmQgc2VwaWEgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZS5cclxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnNlcGlhPWZhbHNlXSAtIEVuYWJsZSBzZXBpYSBlZmZlY3QuIEdyZXlzY2FsZSBhbmQgc2VwaWEgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZS5cclxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnZpZ25ldHRlPWZhbHNlXSAtIEFwcGx5IHZpZ25ldHRlIGVmZmVjdC5cclxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmVza2lsPWZhbHNlXSAtIFVzZSBFc2tpbCdzIHZpZ25ldHRlIGFwcHJvYWNoLiBUaGUgZGVmYXVsdCBsb29rcyBkdXN0eSB3aGlsZSBFc2tpbCBsb29rcyBidXJuZWQgb3V0LlxyXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuc2NyZWVuTW9kZT10cnVlXSAtIFdoZXRoZXIgdGhlIHNjcmVlbiBibGVuZCBtb2RlIHNob3VsZCBiZSB1c2VkIGZvciBub2lzZSBhbmQgc2NhbmxpbmVzLiBCb3RoIG9mIHRoZXNlIGVmZmVjdHMgYXJlIGNvbXB1dGVkIGluZGVwZW5kZW50bHkuXHJcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5ub2lzZT10cnVlXSAtIFNob3cgbm9pc2UtYmFzZWQgZmlsbSBncmFpbi5cclxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnNjYW5saW5lcz10cnVlXSAtIFNob3cgc2NhbmxpbmVzLlxyXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuZ3JpZD10cnVlXSAtIFNob3cgYSBncmlkLlxyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5ub2lzZUludGVuc2l0eT0wLjVdIC0gVGhlIG5vaXNlIGludGVuc2l0eS5cclxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuc2NhbmxpbmVJbnRlbnNpdHk9MC4wNV0gLSBUaGUgc2NhbmxpbmUgaW50ZW5zaXR5LlxyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5ncmlkSW50ZW5zaXR5PTEuMF0gLSBUaGUgZ3JpZCBzdHJlbmd0aC4gMC4wIHRvIDEuMC5cclxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuZ3JleXNjYWxlSW50ZW5zaXR5PTEuMF0gLSBUaGUgaW50ZW5zaXR5IG9mIHRoZSBncmV5c2NhbGUgZWZmZWN0LiAwLjAgdG8gMS4wLlxyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5zZXBpYUludGVuc2l0eT0xLjBdIC0gVGhlIGludGVuc2l0eSBvZiB0aGUgc2VwaWEgZWZmZWN0LiAwLjAgdG8gMS4wLlxyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy52aWduZXR0ZU9mZnNldD0xLjBdIC0gVGhlIG9mZnNldCBvZiB0aGUgdmlnbmV0dGUgZWZmZWN0LiAwLjAgdG8gMS4wLlxyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy52aWduZXR0ZURhcmtuZXNzPTEuMF0gLSBUaGUgZGFya25lc3Mgb2YgdGhlIHZpZ25ldHRlIGVmZmVjdC4gMC4wIHRvIDEuMC5cclxuICAgKi9cbiAgZnVuY3Rpb24gRmlsbU1hdGVyaWFsKCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIEZpbG1NYXRlcmlhbCk7XG5cbiAgICB2YXIgc2V0dGluZ3MgPSBPYmplY3QuYXNzaWduKHtcbiAgICAgIHNjcmVlbk1vZGU6IHRydWUsXG4gICAgICBub2lzZTogdHJ1ZSxcbiAgICAgIHNjYW5saW5lczogdHJ1ZSxcbiAgICAgIGdyaWQ6IGZhbHNlLFxuICAgICAgZ3JleXNjYWxlOiBmYWxzZSxcbiAgICAgIHNlcGlhOiBmYWxzZSxcbiAgICAgIHZpZ25ldHRlOiBmYWxzZSxcbiAgICAgIGVza2lsOiBmYWxzZSxcbiAgICAgIG5vaXNlSW50ZW5zaXR5OiAwLjUsXG4gICAgICBzY2FubGluZUludGVuc2l0eTogMC4wNSxcbiAgICAgIGdyaWRJbnRlbnNpdHk6IDEuMCxcbiAgICAgIGdyZXlzY2FsZUludGVuc2l0eTogMS4wLFxuICAgICAgc2VwaWFJbnRlbnNpdHk6IDEuMCxcbiAgICAgIHZpZ25ldHRlT2Zmc2V0OiAxLjAsXG4gICAgICB2aWduZXR0ZURhcmtuZXNzOiAxLjBcbiAgICB9LCBvcHRpb25zKTtcbiAgICBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgZ2V0UHJvdG90eXBlT2YkMihGaWxtTWF0ZXJpYWwpLmNhbGwodGhpcywge1xuICAgICAgdHlwZTogXCJGaWxtTWF0ZXJpYWxcIixcbiAgICAgIHVuaWZvcm1zOiB7XG4gICAgICAgIHREaWZmdXNlOiBuZXcgVW5pZm9ybShudWxsKSxcbiAgICAgICAgdGltZTogbmV3IFVuaWZvcm0oMC4wKSxcbiAgICAgICAgbm9pc2VJbnRlbnNpdHk6IG5ldyBVbmlmb3JtKHNldHRpbmdzLm5vaXNlSW50ZW5zaXR5KSxcbiAgICAgICAgc2NhbmxpbmVJbnRlbnNpdHk6IG5ldyBVbmlmb3JtKHNldHRpbmdzLnNjYW5saW5lSW50ZW5zaXR5KSxcbiAgICAgICAgZ3JpZEludGVuc2l0eTogbmV3IFVuaWZvcm0oc2V0dGluZ3MuZ3JpZEludGVuc2l0eSksXG4gICAgICAgIHNjYW5saW5lQ291bnQ6IG5ldyBVbmlmb3JtKDAuMCksXG4gICAgICAgIGdyaWRTY2FsZTogbmV3IFVuaWZvcm0obmV3IFZlY3RvcjIoKSksXG4gICAgICAgIGdyaWRMaW5lV2lkdGg6IG5ldyBVbmlmb3JtKDAuMCksXG4gICAgICAgIGdyZXlzY2FsZUludGVuc2l0eTogbmV3IFVuaWZvcm0oc2V0dGluZ3MuZ3JleXNjYWxlSW50ZW5zaXR5KSxcbiAgICAgICAgc2VwaWFJbnRlbnNpdHk6IG5ldyBVbmlmb3JtKHNldHRpbmdzLnNlcGlhSW50ZW5zaXR5KSxcbiAgICAgICAgdmlnbmV0dGVPZmZzZXQ6IG5ldyBVbmlmb3JtKHNldHRpbmdzLnZpZ25ldHRlT2Zmc2V0KSxcbiAgICAgICAgdmlnbmV0dGVEYXJrbmVzczogbmV3IFVuaWZvcm0oc2V0dGluZ3MudmlnbmV0dGVEYXJrbmVzcylcbiAgICAgIH0sXG4gICAgICBmcmFnbWVudFNoYWRlcjogZnJhZ21lbnQkOCxcbiAgICAgIHZlcnRleFNoYWRlcjogdmVydGV4JDgsXG4gICAgICBkZXB0aFdyaXRlOiBmYWxzZSxcbiAgICAgIGRlcHRoVGVzdDogZmFsc2VcbiAgICB9KSk7XG5cbiAgICBfdGhpcy5zZXRTY3JlZW5Nb2RlRW5hYmxlZChzZXR0aW5ncy5zY3JlZW5Nb2RlKTtcblxuICAgIF90aGlzLnNldE5vaXNlRW5hYmxlZChzZXR0aW5ncy5ub2lzZSk7XG5cbiAgICBfdGhpcy5zZXRTY2FubGluZXNFbmFibGVkKHNldHRpbmdzLnNjYW5saW5lcyk7XG5cbiAgICBfdGhpcy5zZXRHcmlkRW5hYmxlZChzZXR0aW5ncy5ncmlkKTtcblxuICAgIF90aGlzLnNldEdyZXlzY2FsZUVuYWJsZWQoc2V0dGluZ3MuZ3JleXNjYWxlKTtcblxuICAgIF90aGlzLnNldFNlcGlhRW5hYmxlZChzZXR0aW5ncy5zZXBpYSk7XG5cbiAgICBfdGhpcy5zZXRWaWduZXR0ZUVuYWJsZWQoc2V0dGluZ3MudmlnbmV0dGUpO1xuXG4gICAgX3RoaXMuc2V0RXNraWxFbmFibGVkKHNldHRpbmdzLmVza2lsKTtcblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuICAvKipcclxuICAgKiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBTY3JlZW4gYmxlbmQgbW9kZS5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gZW5hYmxlZCAtIFdoZXRoZXIgdGhlIFNjcmVlbiBibGVuZCBtb2RlIHNob3VsZCBiZSBlbmFibGVkLlxyXG4gICAqL1xuXG5cbiAgY3JlYXRlQ2xhc3MoRmlsbU1hdGVyaWFsLCBbe1xuICAgIGtleTogXCJzZXRTY3JlZW5Nb2RlRW5hYmxlZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRTY3JlZW5Nb2RlRW5hYmxlZChlbmFibGVkKSB7XG4gICAgICBpZiAoZW5hYmxlZCkge1xuICAgICAgICB0aGlzLmRlZmluZXMuU0NSRUVOX01PREUgPSBcIjFcIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLmRlZmluZXMuU0NSRUVOX01PREU7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIG5vaXNlIGVmZmVjdC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGVuYWJsZWQgLSBXaGV0aGVyIHRoZSBub2lzZSBlZmZlY3Qgc2hvdWxkIGJlIGVuYWJsZWQuXHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInNldE5vaXNlRW5hYmxlZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXROb2lzZUVuYWJsZWQoZW5hYmxlZCkge1xuICAgICAgaWYgKGVuYWJsZWQpIHtcbiAgICAgICAgdGhpcy5kZWZpbmVzLk5PSVNFID0gXCIxXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUgdGhpcy5kZWZpbmVzLk5PSVNFO1xuICAgICAgfVxuXG4gICAgICB0aGlzLm5lZWRzVXBkYXRlID0gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBzY2FubGluZXMgZWZmZWN0LlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gZW5hYmxlZCAtIFdoZXRoZXIgdGhlIHNjYW5saW5lcyBlZmZlY3Qgc2hvdWxkIGJlIGVuYWJsZWQuXHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInNldFNjYW5saW5lc0VuYWJsZWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0U2NhbmxpbmVzRW5hYmxlZChlbmFibGVkKSB7XG4gICAgICBpZiAoZW5hYmxlZCkge1xuICAgICAgICB0aGlzLmRlZmluZXMuU0NBTkxJTkVTID0gXCIxXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUgdGhpcy5kZWZpbmVzLlNDQU5MSU5FUztcbiAgICAgIH1cblxuICAgICAgdGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgZ3JpZCBlZmZlY3QuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBlbmFibGVkIC0gV2hldGhlciB0aGUgZ3JpZCBlZmZlY3Qgc2hvdWxkIGJlIGVuYWJsZWQuXHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInNldEdyaWRFbmFibGVkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldEdyaWRFbmFibGVkKGVuYWJsZWQpIHtcbiAgICAgIGlmIChlbmFibGVkKSB7XG4gICAgICAgIHRoaXMuZGVmaW5lcy5HUklEID0gXCIxXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUgdGhpcy5kZWZpbmVzLkdSSUQ7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIGdyZXlzY2FsZSBlZmZlY3QuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBlbmFibGVkIC0gV2hldGhlciB0aGUgZ3JleXNjYWxlIGVmZmVjdCBzaG91bGQgYmUgZW5hYmxlZC5cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwic2V0R3JleXNjYWxlRW5hYmxlZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRHcmV5c2NhbGVFbmFibGVkKGVuYWJsZWQpIHtcbiAgICAgIGlmIChlbmFibGVkKSB7XG4gICAgICAgIHRoaXMuZGVmaW5lcy5HUkVZU0NBTEUgPSBcIjFcIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLmRlZmluZXMuR1JFWVNDQUxFO1xuICAgICAgfVxuXG4gICAgICB0aGlzLm5lZWRzVXBkYXRlID0gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBzZXBpYSBlZmZlY3QuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBlbmFibGVkIC0gV2hldGhlciB0aGUgc2VwaWEgZWZmZWN0IHNob3VsZCBiZSBlbmFibGVkLlxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJzZXRTZXBpYUVuYWJsZWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0U2VwaWFFbmFibGVkKGVuYWJsZWQpIHtcbiAgICAgIGlmIChlbmFibGVkKSB7XG4gICAgICAgIHRoaXMuZGVmaW5lcy5TRVBJQSA9IFwiMVwiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuZGVmaW5lcy5TRVBJQTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgVmlnbmV0dGUgZWZmZWN0LlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gZW5hYmxlZCAtIFdoZXRoZXIgdGhlIFZpZ25ldHRlIGVmZmVjdCBzaG91bGQgYmUgZW5hYmxlZC5cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwic2V0VmlnbmV0dGVFbmFibGVkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldFZpZ25ldHRlRW5hYmxlZChlbmFibGVkKSB7XG4gICAgICBpZiAoZW5hYmxlZCkge1xuICAgICAgICB0aGlzLmRlZmluZXMuVklHTkVUVEUgPSBcIjFcIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLmRlZmluZXMuVklHTkVUVEU7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIEVza2lsIFZpZ25ldHRlIGVmZmVjdC5cclxuICAgICAqXHJcbiAgICAgKiBIYXMgbm8gZWZmZWN0IGlmIFZpZ25ldHRlIGlzIGRpc2FibGVkLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gZW5hYmxlZCAtIFdoZXRoZXIgdGhlIEVza2lsIFZpZ25ldHRlIGVmZmVjdCBzaG91bGQgYmUgZW5hYmxlZC5cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwic2V0RXNraWxFbmFibGVkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldEVza2lsRW5hYmxlZChlbmFibGVkKSB7XG4gICAgICBpZiAoZW5hYmxlZCkge1xuICAgICAgICB0aGlzLmRlZmluZXMuRVNLSUwgPSBcIjFcIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLmRlZmluZXMuRVNLSUw7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlO1xuICAgIH1cbiAgfV0pO1xuXG4gIGluaGVyaXRzKEZpbG1NYXRlcmlhbCwgX1NoYWRlck1hdGVyaWFsKTtcblxuICByZXR1cm4gRmlsbU1hdGVyaWFsO1xufShTaGFkZXJNYXRlcmlhbCk7XG5cbnZhciBmcmFnbWVudCQ5ID0gXCJ1bmlmb3JtIHNhbXBsZXIyRCB0RGlmZnVzZTtcXHJcXG51bmlmb3JtIHNhbXBsZXIyRCB0UGVydHVyYjtcXHJcXG5cXHJcXG51bmlmb3JtIGJvb2wgYWN0aXZlO1xcclxcblxcclxcbnVuaWZvcm0gZmxvYXQgYW1vdW50O1xcclxcbnVuaWZvcm0gZmxvYXQgYW5nbGU7XFxyXFxudW5pZm9ybSBmbG9hdCBzZWVkO1xcclxcbnVuaWZvcm0gZmxvYXQgc2VlZFg7XFxyXFxudW5pZm9ybSBmbG9hdCBzZWVkWTtcXHJcXG51bmlmb3JtIGZsb2F0IGRpc3RvcnRpb25YO1xcclxcbnVuaWZvcm0gZmxvYXQgZGlzdG9ydGlvblk7XFxyXFxudW5pZm9ybSBmbG9hdCBjb2xTO1xcclxcblxcclxcbnZhcnlpbmcgdmVjMiB2VXY7XFxyXFxuXFxyXFxuZmxvYXQgcmFuZCh2ZWMyIHRjKSB7XFxyXFxuXFxyXFxuXFx0Y29uc3QgZmxvYXQgYSA9IDEyLjk4OTg7XFxyXFxuXFx0Y29uc3QgZmxvYXQgYiA9IDc4LjIzMztcXHJcXG5cXHRjb25zdCBmbG9hdCBjID0gNDM3NTguNTQ1MztcXHJcXG5cXHJcXG5cXHRmbG9hdCBkdCA9IGRvdCh0YywgdmVjMihhLCBiKSk7XFxyXFxuXFx0ZmxvYXQgc24gPSBtb2QoZHQsIDMuMTQpO1xcclxcblxcclxcblxcdHJldHVybiBmcmFjdChzaW4oc24pICogYyk7XFxyXFxuXFxyXFxufVxcclxcblxcclxcbnZvaWQgbWFpbigpIHtcXHJcXG5cXHJcXG5cXHR2ZWMyIGNvb3JkID0gdlV2O1xcclxcblxcclxcblxcdGZsb2F0IHhzLCB5cztcXHJcXG5cXHR2ZWM0IG5vcm1hbDtcXHJcXG5cXHJcXG5cXHR2ZWMyIG9mZnNldDtcXHJcXG5cXHR2ZWM0IGNyLCBjZ2EsIGNiO1xcclxcblxcdHZlYzQgc25vdywgY29sb3I7XFxyXFxuXFxyXFxuXFx0ZmxvYXQgc3gsIHN5O1xcclxcblxcclxcblxcdGlmKGFjdGl2ZSkge1xcclxcblxcclxcblxcdFxcdHhzID0gZmxvb3IoZ2xfRnJhZ0Nvb3JkLnggLyAwLjUpO1xcclxcblxcdFxcdHlzID0gZmxvb3IoZ2xfRnJhZ0Nvb3JkLnkgLyAwLjUpO1xcclxcblxcclxcblxcdFxcdG5vcm1hbCA9IHRleHR1cmUyRCh0UGVydHVyYiwgY29vcmQgKiBzZWVkICogc2VlZCk7XFxyXFxuXFxyXFxuXFx0XFx0aWYoY29vcmQueSA8IGRpc3RvcnRpb25YICsgY29sUyAmJiBjb29yZC55ID4gZGlzdG9ydGlvblggLSBjb2xTICogc2VlZCkge1xcclxcblxcclxcblxcdFxcdFxcdHN4ID0gY2xhbXAoY2VpbChzZWVkWCksIDAuMCwgMS4wKTtcXHJcXG5cXHRcXHRcXHRjb29yZC55ID0gc3ggKiAoMS4wIC0gKGNvb3JkLnkgKyBkaXN0b3J0aW9uWSkpICsgKDEuMCAtIHN4KSAqIGRpc3RvcnRpb25ZO1xcclxcblxcclxcblxcdFxcdH1cXHJcXG5cXHJcXG5cXHRcXHRpZihjb29yZC54IDwgZGlzdG9ydGlvblkgKyBjb2xTICYmIGNvb3JkLnggPiBkaXN0b3J0aW9uWSAtIGNvbFMgKiBzZWVkKSB7XFxyXFxuXFxyXFxuXFx0XFx0XFx0c3kgPSBjbGFtcChjZWlsKHNlZWRZKSwgMC4wLCAxLjApO1xcclxcblxcdFxcdFxcdGNvb3JkLnggPSBzeSAqIGRpc3RvcnRpb25YICsgKDEuMCAtIHN5KSAqICgxLjAgLSAoY29vcmQueCArIGRpc3RvcnRpb25YKSk7XFxyXFxuXFxyXFxuXFx0XFx0fVxcclxcblxcclxcblxcdFxcdGNvb3JkLnggKz0gbm9ybWFsLnggKiBzZWVkWCAqIChzZWVkIC8gNS4wKTtcXHJcXG5cXHRcXHRjb29yZC55ICs9IG5vcm1hbC55ICogc2VlZFkgKiAoc2VlZCAvIDUuMCk7XFxyXFxuXFxyXFxuXFx0XFx0b2Zmc2V0ID0gYW1vdW50ICogdmVjMihjb3MoYW5nbGUpLCBzaW4oYW5nbGUpKTtcXHJcXG5cXHJcXG5cXHRcXHRjciA9IHRleHR1cmUyRCh0RGlmZnVzZSwgY29vcmQgKyBvZmZzZXQpO1xcclxcblxcdFxcdGNnYSA9IHRleHR1cmUyRCh0RGlmZnVzZSwgY29vcmQpO1xcclxcblxcdFxcdGNiID0gdGV4dHVyZTJEKHREaWZmdXNlLCBjb29yZCAtIG9mZnNldCk7XFxyXFxuXFxyXFxuXFx0XFx0Y29sb3IgPSB2ZWM0KGNyLnIsIGNnYS5nLCBjYi5iLCBjZ2EuYSk7XFxyXFxuXFx0XFx0c25vdyA9IDIwMC4wICogYW1vdW50ICogdmVjNChyYW5kKHZlYzIoeHMgKiBzZWVkLCB5cyAqIHNlZWQgKiA1MC4wKSkgKiAwLjIpO1xcclxcblxcdFxcdGNvbG9yICs9IHNub3c7XFxyXFxuXFxyXFxuXFx0fSBlbHNlIHtcXHJcXG5cXHJcXG5cXHRcXHRjb2xvciA9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2KTtcXHJcXG5cXHJcXG5cXHR9XFxyXFxuXFxyXFxuXFx0Z2xfRnJhZ0NvbG9yID0gY29sb3I7XFxyXFxuXFxyXFxufVxcclxcblwiO1xudmFyIHZlcnRleCQ5ID0gXCJ2YXJ5aW5nIHZlYzIgdlV2O1xcclxcblxcclxcbnZvaWQgbWFpbigpIHtcXHJcXG5cXHJcXG5cXHR2VXYgPSB1djtcXHJcXG5cXHRnbF9Qb3NpdGlvbiA9IHByb2plY3Rpb25NYXRyaXggKiBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KHBvc2l0aW9uLCAxLjApO1xcclxcblxcclxcbn1cXHJcXG5cIjtcbi8qKlxyXG4gKiBBIGdsaXRjaCBzaGFkZXIgbWF0ZXJpYWwuXHJcbiAqXHJcbiAqIFJlZmVyZW5jZTpcclxuICogIGh0dHBzOi8vZ2l0aHViLmNvbS9zdGFmZmFudGFuL3VuaXR5Z2xpdGNoXHJcbiAqL1xuXG52YXIgR2xpdGNoTWF0ZXJpYWwgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9TaGFkZXJNYXRlcmlhbCkge1xuICAvKipcclxuICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGdsaXRjaCBtYXRlcmlhbC5cclxuICAgKi9cbiAgZnVuY3Rpb24gR2xpdGNoTWF0ZXJpYWwoKSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgR2xpdGNoTWF0ZXJpYWwpO1xuXG4gICAgcmV0dXJuIHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgZ2V0UHJvdG90eXBlT2YkMihHbGl0Y2hNYXRlcmlhbCkuY2FsbCh0aGlzLCB7XG4gICAgICB0eXBlOiBcIkdsaXRjaE1hdGVyaWFsXCIsXG4gICAgICB1bmlmb3Jtczoge1xuICAgICAgICB0RGlmZnVzZTogbmV3IFVuaWZvcm0obnVsbCksXG4gICAgICAgIHRQZXJ0dXJiOiBuZXcgVW5pZm9ybShudWxsKSxcbiAgICAgICAgYWN0aXZlOiBuZXcgVW5pZm9ybSgxKSxcbiAgICAgICAgYW1vdW50OiBuZXcgVW5pZm9ybSgwLjgpLFxuICAgICAgICBhbmdsZTogbmV3IFVuaWZvcm0oMC4wMiksXG4gICAgICAgIHNlZWQ6IG5ldyBVbmlmb3JtKDAuMDIpLFxuICAgICAgICBzZWVkWDogbmV3IFVuaWZvcm0oMC4wMiksXG4gICAgICAgIHNlZWRZOiBuZXcgVW5pZm9ybSgwLjAyKSxcbiAgICAgICAgZGlzdG9ydGlvblg6IG5ldyBVbmlmb3JtKDAuNSksXG4gICAgICAgIGRpc3RvcnRpb25ZOiBuZXcgVW5pZm9ybSgwLjYpLFxuICAgICAgICBjb2xTOiBuZXcgVW5pZm9ybSgwLjA1KVxuICAgICAgfSxcbiAgICAgIGZyYWdtZW50U2hhZGVyOiBmcmFnbWVudCQ5LFxuICAgICAgdmVydGV4U2hhZGVyOiB2ZXJ0ZXgkOSxcbiAgICAgIGRlcHRoV3JpdGU6IGZhbHNlLFxuICAgICAgZGVwdGhUZXN0OiBmYWxzZVxuICAgIH0pKTtcbiAgfVxuXG4gIGluaGVyaXRzKEdsaXRjaE1hdGVyaWFsLCBfU2hhZGVyTWF0ZXJpYWwpO1xuXG4gIHJldHVybiBHbGl0Y2hNYXRlcmlhbDtcbn0oU2hhZGVyTWF0ZXJpYWwpO1xuXG52YXIgZnJhZ21lbnQkMTAgPSBcIiNpbmNsdWRlIDxjb21tb24+XFxyXFxuI2luY2x1ZGUgPGRpdGhlcmluZ19wYXJzX2ZyYWdtZW50PlxcclxcblxcclxcbnVuaWZvcm0gc2FtcGxlcjJEIHREaWZmdXNlO1xcclxcbnVuaWZvcm0gdmVjMyBsaWdodFBvc2l0aW9uO1xcclxcblxcclxcbnVuaWZvcm0gZmxvYXQgZXhwb3N1cmU7XFxyXFxudW5pZm9ybSBmbG9hdCBkZWNheTtcXHJcXG51bmlmb3JtIGZsb2F0IGRlbnNpdHk7XFxyXFxudW5pZm9ybSBmbG9hdCB3ZWlnaHQ7XFxyXFxudW5pZm9ybSBmbG9hdCBjbGFtcE1heDtcXHJcXG5cXHJcXG52YXJ5aW5nIHZlYzIgdlV2O1xcclxcblxcclxcbnZvaWQgbWFpbigpIHtcXHJcXG5cXHJcXG5cXHR2ZWMyIHRleENvb3JkID0gdlV2O1xcclxcblxcclxcblxcdC8vIENhbGN1bGF0ZSB2ZWN0b3IgZnJvbSBwaXhlbCB0byBsaWdodCBzb3VyY2UgaW4gc2NyZWVuIHNwYWNlLlxcclxcblxcdHZlYzIgZGVsdGFUZXhDb29yZCA9IHRleENvb3JkIC0gbGlnaHRQb3NpdGlvbi5zdDtcXHJcXG5cXHRkZWx0YVRleENvb3JkICo9IDEuMCAvIE5VTV9TQU1QTEVTX0ZMT0FUICogZGVuc2l0eTtcXHJcXG5cXHJcXG5cXHQvLyBBIGRlY3JlYXNpbmcgaWxsdW1pbmF0aW9uIGZhY3Rvci5cXHJcXG5cXHRmbG9hdCBpbGx1bWluYXRpb25EZWNheSA9IDEuMDtcXHJcXG5cXHJcXG5cXHR2ZWM0IHNhbXBsZTtcXHJcXG5cXHR2ZWM0IGNvbG9yID0gdmVjNCgwLjApO1xcclxcblxcclxcblxcdC8vIEVzdGltYXRlIHRoZSBwcm9iYWJpbGl0eSBvZiBvY2NsdXNpb24gYXQgZWFjaCBwaXhlbCBieSBzdW1taW5nIHNhbXBsZXMgYWxvbmcgYSByYXkgdG8gdGhlIGxpZ2h0IHNvdXJjZS5cXHJcXG5cXHRmb3IoaW50IGkgPSAwOyBpIDwgTlVNX1NBTVBMRVNfSU5UOyArK2kpIHtcXHJcXG5cXHJcXG5cXHRcXHR0ZXhDb29yZCAtPSBkZWx0YVRleENvb3JkO1xcclxcblxcdFxcdHNhbXBsZSA9IHRleHR1cmUyRCh0RGlmZnVzZSwgdGV4Q29vcmQpO1xcclxcblxcclxcblxcdFxcdC8vIEFwcGx5IHNhbXBsZSBhdHRlbnVhdGlvbiBzY2FsZS9kZWNheSBmYWN0b3JzLlxcclxcblxcdFxcdHNhbXBsZSAqPSBpbGx1bWluYXRpb25EZWNheSAqIHdlaWdodDtcXHJcXG5cXHJcXG5cXHRcXHRjb2xvciArPSBzYW1wbGU7XFxyXFxuXFxyXFxuXFx0XFx0Ly8gVXBkYXRlIGV4cG9uZW50aWFsIGRlY2F5IGZhY3Rvci5cXHJcXG5cXHRcXHRpbGx1bWluYXRpb25EZWNheSAqPSBkZWNheTtcXHJcXG5cXHJcXG5cXHR9XFxyXFxuXFxyXFxuXFx0Z2xfRnJhZ0NvbG9yID0gY2xhbXAoY29sb3IgKiBleHBvc3VyZSwgMC4wLCBjbGFtcE1heCk7XFxyXFxuXFxyXFxuXFx0I2luY2x1ZGUgPGRpdGhlcmluZ19mcmFnbWVudD5cXHJcXG5cXHJcXG59XFxyXFxuXCI7XG52YXIgdmVydGV4JDEwID0gXCJ2YXJ5aW5nIHZlYzIgdlV2O1xcclxcblxcclxcbnZvaWQgbWFpbigpIHtcXHJcXG5cXHJcXG5cXHR2VXYgPSB1djtcXHJcXG5cXHRnbF9Qb3NpdGlvbiA9IHByb2plY3Rpb25NYXRyaXggKiBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KHBvc2l0aW9uLCAxLjApO1xcclxcblxcclxcbn1cXHJcXG5cIjtcbi8qKlxyXG4gKiBBIGNyZXB1c2N1bGFyIHJheXMgc2hhZGVyIG1hdGVyaWFsLlxyXG4gKlxyXG4gKiBUaGlzIG1hdGVyaWFsIHN1cHBvcnRzIGRpdGhlcmluZy5cclxuICpcclxuICogUmVmZXJlbmNlczpcclxuICpcclxuICogVGhpYmF1dCBEZXNwb3VsYWluLCAyMDEyOlxyXG4gKiAgWyhXZWJHTCkgVm9sdW1ldHJpYyBMaWdodCBBcHByb3hpbWF0aW9uIGluIFRocmVlLmpzXShcclxuICogIGh0dHA6Ly9ia2NvcmUuY29tL2Jsb2cvM2Qvd2ViZ2wtdGhyZWUtanMtdm9sdW1ldHJpYy1saWdodC1nb2RyYXlzLmh0bWwpXHJcbiAqXHJcbiAqIE52aWRpYSwgR1BVIEdlbXMgMywgMjAwODpcclxuICogIFtDaGFwdGVyIDEzLiBWb2x1bWV0cmljIExpZ2h0IFNjYXR0ZXJpbmcgYXMgYSBQb3N0LVByb2Nlc3NdKFxyXG4gKiAgaHR0cHM6Ly9kZXZlbG9wZXIubnZpZGlhLmNvbS9ncHVnZW1zL0dQVUdlbXMzL2dwdWdlbXMzX2NoMTMuaHRtbClcclxuICovXG5cbnZhciBHb2RSYXlzTWF0ZXJpYWwgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9TaGFkZXJNYXRlcmlhbCkge1xuICAvKipcclxuICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGdvZCByYXlzIG1hdGVyaWFsLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIFRoZSBvcHRpb25zLlxyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5kZW5zaXR5PTAuOTZdIC0gVGhlIGRlbnNpdHkgb2YgdGhlIGxpZ2h0IHJheXMuXHJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmRlY2F5PTAuOTNdIC0gQW4gaWxsdW1pbmF0aW9uIGRlY2F5IGZhY3Rvci5cclxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMud2VpZ2h0PTAuNF0gLSBBIGxpZ2h0IHJheSB3ZWlnaHQgZmFjdG9yLlxyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5leHBvc3VyZT0wLjZdIC0gQSBjb25zdGFudCBhdHRlbnVhdGlvbiBjb2VmZmljaWVudC5cclxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuY2xhbXBNYXg9MS4wXSAtIEFuIHVwcGVyIGJvdW5kIGZvciB0aGUgc2F0dXJhdGlvbiBvZiB0aGUgb3ZlcmFsbCBlZmZlY3QuXHJcbiAgICovXG4gIGZ1bmN0aW9uIEdvZFJheXNNYXRlcmlhbCgpIHtcbiAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBHb2RSYXlzTWF0ZXJpYWwpO1xuXG4gICAgdmFyIHNldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICBleHBvc3VyZTogMC42LFxuICAgICAgZGVuc2l0eTogMC45MyxcbiAgICAgIGRlY2F5OiAwLjk2LFxuICAgICAgd2VpZ2h0OiAwLjQsXG4gICAgICBjbGFtcE1heDogMS4wXG4gICAgfSwgb3B0aW9ucyk7XG4gICAgcmV0dXJuIHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgZ2V0UHJvdG90eXBlT2YkMihHb2RSYXlzTWF0ZXJpYWwpLmNhbGwodGhpcywge1xuICAgICAgdHlwZTogXCJHb2RSYXlzTWF0ZXJpYWxcIixcbiAgICAgIGRlZmluZXM6IHtcbiAgICAgICAgTlVNX1NBTVBMRVNfRkxPQVQ6IFwiNjAuMFwiLFxuICAgICAgICBOVU1fU0FNUExFU19JTlQ6IFwiNjBcIlxuICAgICAgfSxcbiAgICAgIHVuaWZvcm1zOiB7XG4gICAgICAgIHREaWZmdXNlOiBuZXcgVW5pZm9ybShudWxsKSxcbiAgICAgICAgbGlnaHRQb3NpdGlvbjogbmV3IFVuaWZvcm0obnVsbCksXG4gICAgICAgIGV4cG9zdXJlOiBuZXcgVW5pZm9ybShzZXR0aW5ncy5leHBvc3VyZSksXG4gICAgICAgIGRlY2F5OiBuZXcgVW5pZm9ybShzZXR0aW5ncy5kZWNheSksXG4gICAgICAgIGRlbnNpdHk6IG5ldyBVbmlmb3JtKHNldHRpbmdzLmRlbnNpdHkpLFxuICAgICAgICB3ZWlnaHQ6IG5ldyBVbmlmb3JtKHNldHRpbmdzLndlaWdodCksXG4gICAgICAgIGNsYW1wTWF4OiBuZXcgVW5pZm9ybShzZXR0aW5ncy5jbGFtcE1heClcbiAgICAgIH0sXG4gICAgICBmcmFnbWVudFNoYWRlcjogZnJhZ21lbnQkMTAsXG4gICAgICB2ZXJ0ZXhTaGFkZXI6IHZlcnRleCQxMCxcbiAgICAgIGRlcHRoV3JpdGU6IGZhbHNlLFxuICAgICAgZGVwdGhUZXN0OiBmYWxzZVxuICAgIH0pKTtcbiAgfVxuXG4gIGluaGVyaXRzKEdvZFJheXNNYXRlcmlhbCwgX1NoYWRlck1hdGVyaWFsKTtcblxuICByZXR1cm4gR29kUmF5c01hdGVyaWFsO1xufShTaGFkZXJNYXRlcmlhbCk7XG5cbnZhciBmcmFnbWVudCQxMSA9IFwiI2luY2x1ZGUgPGNvbW1vbj5cXHJcXG5cXHJcXG51bmlmb3JtIHNhbXBsZXIyRCB0RGlmZnVzZTtcXHJcXG51bmlmb3JtIGZsb2F0IGRpc3RpbmN0aW9uO1xcclxcbnVuaWZvcm0gdmVjMiByYW5nZTtcXHJcXG5cXHJcXG52YXJ5aW5nIHZlYzIgdlV2O1xcclxcblxcclxcbnZvaWQgbWFpbigpIHtcXHJcXG5cXHJcXG5cXHR2ZWM0IHRleGVsID0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYpO1xcclxcblxcdGZsb2F0IGwgPSBsaW5lYXJUb1JlbGF0aXZlTHVtaW5hbmNlKHRleGVsLnJnYik7XFxyXFxuXFxyXFxuXFx0I2lmZGVmIFJBTkdFXFxyXFxuXFxyXFxuXFx0XFx0ZmxvYXQgbG93ID0gc3RlcChyYW5nZS54LCBsKTtcXHJcXG5cXHRcXHRmbG9hdCBoaWdoID0gc3RlcChsLCByYW5nZS55KTtcXHJcXG5cXHJcXG5cXHRcXHQvLyBBcHBseSB0aGUgbWFzay5cXHJcXG5cXHRcXHRsICo9IGxvdyAqIGhpZ2g7XFxyXFxuXFxyXFxuXFx0I2VuZGlmXFxyXFxuXFxyXFxuXFx0bCA9IHBvdyhhYnMobCksIGRpc3RpbmN0aW9uKTtcXHJcXG5cXHJcXG5cXHQjaWZkZWYgQ09MT1JcXHJcXG5cXHJcXG5cXHRcXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KHRleGVsLnJnYiAqIGwsIHRleGVsLmEpO1xcclxcblxcclxcblxcdCNlbHNlXFxyXFxuXFxyXFxuXFx0XFx0Z2xfRnJhZ0NvbG9yID0gdmVjNChsLCBsLCBsLCB0ZXhlbC5hKTtcXHJcXG5cXHJcXG5cXHQjZW5kaWZcXHJcXG5cXHJcXG59XFxyXFxuXCI7XG52YXIgdmVydGV4JDExID0gXCJ2YXJ5aW5nIHZlYzIgdlV2O1xcclxcblxcclxcbnZvaWQgbWFpbigpIHtcXHJcXG5cXHJcXG5cXHR2VXYgPSB1djtcXHJcXG5cXHRnbF9Qb3NpdGlvbiA9IHByb2plY3Rpb25NYXRyaXggKiBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KHBvc2l0aW9uLCAxLjApO1xcclxcblxcclxcbn1cXHJcXG5cIjtcbi8qKlxyXG4gKiBBIGx1bWlub3NpdHkgc2hhZGVyIG1hdGVyaWFsLlxyXG4gKlxyXG4gKiBUaGlzIHNoYWRlciBwcm9kdWNlcyBhIGdyZXlzY2FsZSBsdW1pbmFuY2UgbWFwIHRoYXQgZGVzY3JpYmVzIHRoZSBhYnNvbHV0ZVxyXG4gKiBhbW91bnQgb2YgbGlnaHQgZW1pdHRlZCBieSBhIHNjZW5lLiBJdCBjYW4gYWxzbyBiZSBjb25maWd1cmVkIHRvIG91dHB1dFxyXG4gKiBjb2xvdXJzIHRoYXQgYXJlIHNjYWxlZCB3aXRoIHRoZWlyIHJlc3BlY3RpdmUgbHVtaW5hbmNlIHZhbHVlLiBBZGRpdGlvbmFsbHksXHJcbiAqIGEgcmFuZ2UgbWF5IGJlIHByb3ZpZGVkIHRvIG1hc2sgb3V0IHVuZGVzaXJlZCB0ZXhlbHMuXHJcbiAqXHJcbiAqIFRoZSBhbHBoYSBjaGFubmVsIHdpbGwgcmVtYWluIHVuYWZmZWN0ZWQgaW4gYWxsIGNhc2VzLlxyXG4gKlxyXG4gKiBPbiBsdW1pbmFuY2UgY29lZmZpY2llbnRzOlxyXG4gKiAgaHR0cDovL3d3dy5wb3ludG9uLmNvbS9ub3Rlcy9jb2xvdXJfYW5kX2dhbW1hL0NvbG9yRkFRLmh0bWwjUlRGVG9DOVxyXG4gKlxyXG4gKiBDb2VmZmljaWVudHMgZm9yIGRpZmZlcmVudCBjb2xvdXIgc3BhY2VzOlxyXG4gKiAgaHR0cHM6Ly9oc3RvLm9yZy9nZXRwcm8vaGFici9wb3N0X2ltYWdlcy8yYWIvNjlkLzA4NC8yYWI2OWQwODRmOWE1OTdlMDMyNjI0YmNkNzRkNTdhNy5wbmdcclxuICpcclxuICogTHVtaW5hbmNlIHJhbmdlIHJlZmVyZW5jZTpcclxuICogIGh0dHBzOi8vY3ljbGluZzc0LmNvbS8yMDA3LzA1LzIzL3lvdXItZmlyc3Qtc2hhZGVyLyMuVnR5OUZma3JMNFpcclxuICovXG5cbnZhciBMdW1pbm9zaXR5TWF0ZXJpYWwgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9TaGFkZXJNYXRlcmlhbCkge1xuICAvKipcclxuICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGx1bWlub3NpdHkgbWF0ZXJpYWwuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtjb2xvck91dHB1dD1mYWxzZV0gLSBEZWZpbmVzIHdoZXRoZXIgdGhlIHNoYWRlciBzaG91bGQgb3V0cHV0IGNvbG91cnMgc2NhbGVkIHdpdGggdGhlaXIgbHVtaW5hbmNlIHZhbHVlLlxyXG4gICAqIEBwYXJhbSB7VmVjdG9yMn0gW2x1bWluYW5jZVJhbmdlXSAtIElmIHByb3ZpZGVkLCB0aGUgc2hhZGVyIHdpbGwgbWFzayBvdXQgdGV4ZWxzIHRoYXQgYXJlbid0IGluIHRoZSBzcGVjaWZpZWQgbHVtaW5hbmNlIHJhbmdlLlxyXG4gICAqL1xuICBmdW5jdGlvbiBMdW1pbm9zaXR5TWF0ZXJpYWwoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgdmFyIGNvbG9yT3V0cHV0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBmYWxzZTtcbiAgICB2YXIgbHVtaW5hbmNlUmFuZ2UgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IG51bGw7XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBMdW1pbm9zaXR5TWF0ZXJpYWwpO1xuXG4gICAgdmFyIG1hc2tMdW1pbmFuY2UgPSBsdW1pbmFuY2VSYW5nZSAhPT0gbnVsbDtcbiAgICBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgZ2V0UHJvdG90eXBlT2YkMihMdW1pbm9zaXR5TWF0ZXJpYWwpLmNhbGwodGhpcywge1xuICAgICAgdHlwZTogXCJMdW1pbm9zaXR5TWF0ZXJpYWxcIixcbiAgICAgIHVuaWZvcm1zOiB7XG4gICAgICAgIHREaWZmdXNlOiBuZXcgVW5pZm9ybShudWxsKSxcbiAgICAgICAgZGlzdGluY3Rpb246IG5ldyBVbmlmb3JtKDEuMCksXG4gICAgICAgIHJhbmdlOiBuZXcgVW5pZm9ybShtYXNrTHVtaW5hbmNlID8gbHVtaW5hbmNlUmFuZ2UgOiBuZXcgVmVjdG9yMigpKVxuICAgICAgfSxcbiAgICAgIGZyYWdtZW50U2hhZGVyOiBmcmFnbWVudCQxMSxcbiAgICAgIHZlcnRleFNoYWRlcjogdmVydGV4JDExXG4gICAgfSkpO1xuXG4gICAgX3RoaXMuc2V0Q29sb3JPdXRwdXRFbmFibGVkKGNvbG9yT3V0cHV0KTtcblxuICAgIF90aGlzLnNldEx1bWluYW5jZVJhbmdlRW5hYmxlZChtYXNrTHVtaW5hbmNlKTtcblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuICAvKipcclxuICAgKiBFbmFibGVzIG9yIGRpc2FibGVzIGNvbG9yIG91dHB1dC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gZW5hYmxlZCAtIFdoZXRoZXIgY29sb3Igb3V0cHV0IHNob3VsZCBiZSBlbmFibGVkLlxyXG4gICAqL1xuXG5cbiAgY3JlYXRlQ2xhc3MoTHVtaW5vc2l0eU1hdGVyaWFsLCBbe1xuICAgIGtleTogXCJzZXRDb2xvck91dHB1dEVuYWJsZWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0Q29sb3JPdXRwdXRFbmFibGVkKGVuYWJsZWQpIHtcbiAgICAgIGlmIChlbmFibGVkKSB7XG4gICAgICAgIHRoaXMuZGVmaW5lcy5DT0xPUiA9IFwiMVwiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuZGVmaW5lcy5DT0xPUjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgbHVtaW5hbmNlIG1hc2suXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBlbmFibGVkIC0gV2hldGhlciB0aGUgbHVtaW5hbmNlIG1hc2sgc2hvdWxkIGJlIGVuYWJsZWQuXHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInNldEx1bWluYW5jZVJhbmdlRW5hYmxlZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRMdW1pbmFuY2VSYW5nZUVuYWJsZWQoZW5hYmxlZCkge1xuICAgICAgaWYgKGVuYWJsZWQpIHtcbiAgICAgICAgdGhpcy5kZWZpbmVzLlJBTkdFID0gXCIxXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUgdGhpcy5kZWZpbmVzLlJBTkdFO1xuICAgICAgfVxuXG4gICAgICB0aGlzLm5lZWRzVXBkYXRlID0gdHJ1ZTtcbiAgICB9XG4gIH1dKTtcblxuICBpbmhlcml0cyhMdW1pbm9zaXR5TWF0ZXJpYWwsIF9TaGFkZXJNYXRlcmlhbCk7XG5cbiAgcmV0dXJuIEx1bWlub3NpdHlNYXRlcmlhbDtcbn0oU2hhZGVyTWF0ZXJpYWwpO1xuXG52YXIgZnJhZ21lbnQkMTIgPSBcInVuaWZvcm0gc2FtcGxlcjJEIHREaWZmdXNlO1xcclxcbnVuaWZvcm0gc2FtcGxlcjJEIHRNYXNrO1xcclxcbnVuaWZvcm0gc2FtcGxlcjJEIHRFZGdlcztcXHJcXG5cXHJcXG51bmlmb3JtIHZlYzMgdmlzaWJsZUVkZ2VDb2xvcjtcXHJcXG51bmlmb3JtIHZlYzMgaGlkZGVuRWRnZUNvbG9yO1xcclxcbnVuaWZvcm0gZmxvYXQgcHVsc2U7XFxyXFxudW5pZm9ybSBmbG9hdCBlZGdlU3RyZW5ndGg7XFxyXFxuXFxyXFxuI2lmZGVmIFVTRV9QQVRURVJOXFxyXFxuXFxyXFxuXFx0dW5pZm9ybSBzYW1wbGVyMkQgdFBhdHRlcm47XFxyXFxuXFx0dmFyeWluZyB2ZWMyIHZQYXR0ZXJuQ29vcmQ7XFxyXFxuXFxyXFxuI2VuZGlmXFxyXFxuXFxyXFxudmFyeWluZyB2ZWMyIHZVdjtcXHJcXG5cXHJcXG52b2lkIG1haW4oKSB7XFxyXFxuXFxyXFxuXFx0dmVjNCBjb2xvciA9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2KTtcXHJcXG5cXHR2ZWMyIGVkZ2UgPSB0ZXh0dXJlMkQodEVkZ2VzLCB2VXYpLnJnO1xcclxcblxcdHZlYzIgbWFzayA9IHRleHR1cmUyRCh0TWFzaywgdlV2KS5yZztcXHJcXG5cXHJcXG5cXHQjaWZuZGVmIFhfUkFZXFxyXFxuXFxyXFxuXFx0XFx0ZWRnZS55ID0gMC4wO1xcclxcblxcclxcblxcdCNlbmRpZlxcclxcblxcclxcblxcdGVkZ2UgKj0gKGVkZ2VTdHJlbmd0aCAqIG1hc2sueCAqIHB1bHNlKTtcXHJcXG5cXHR2ZWMzIG91dGxpbmVDb2xvciA9IGVkZ2UueCAqIHZpc2libGVFZGdlQ29sb3IgKyBlZGdlLnkgKiBoaWRkZW5FZGdlQ29sb3I7XFxyXFxuXFxyXFxuXFx0I2lmZGVmIEFMUEhBX0JMRU5ESU5HXFxyXFxuXFxyXFxuXFx0XFx0Y29sb3IucmdiID0gbWl4KGNvbG9yLnJnYiwgb3V0bGluZUNvbG9yLCBtYXgoZWRnZS54LCBlZGdlLnkpKTtcXHJcXG5cXHJcXG5cXHQjZWxzZVxcclxcblxcclxcblxcdFxcdGNvbG9yLnJnYiArPSBvdXRsaW5lQ29sb3I7XFxyXFxuXFxyXFxuXFx0I2VuZGlmXFxyXFxuXFxyXFxuXFx0I2lmZGVmIFVTRV9QQVRURVJOXFxyXFxuXFxyXFxuXFx0XFx0dmVjMyBwYXR0ZXJuQ29sb3IgPSB0ZXh0dXJlMkQodFBhdHRlcm4sIHZQYXR0ZXJuQ29vcmQpLnJnYjtcXHJcXG5cXHJcXG5cXHRcXHQjaWZkZWYgWF9SQVlcXHJcXG5cXHJcXG5cXHRcXHRcXHRmbG9hdCBoaWRkZW5GYWN0b3IgPSAwLjU7XFxyXFxuXFxyXFxuXFx0XFx0I2Vsc2VcXHJcXG5cXHJcXG5cXHRcXHRcXHRmbG9hdCBoaWRkZW5GYWN0b3IgPSAwLjA7XFxyXFxuXFxyXFxuXFx0XFx0I2VuZGlmXFxyXFxuXFxyXFxuXFx0XFx0ZmxvYXQgdmlzaWJpbGl0eUZhY3RvciA9ICgxLjAgLSBtYXNrLnkgPiAwLjApID8gMS4wIDogaGlkZGVuRmFjdG9yO1xcclxcblxcclxcblxcdFxcdGNvbG9yLnJnYiArPSB2aXNpYmlsaXR5RmFjdG9yICogKDEuMCAtIG1hc2sueCkgKiAoMS4wIC0gcGF0dGVybkNvbG9yKTtcXHJcXG5cXHJcXG5cXHQjZW5kaWZcXHJcXG5cXHJcXG5cXHRnbF9GcmFnQ29sb3IgPSBjb2xvcjtcXHJcXG5cXHJcXG59XFxyXFxuXCI7XG52YXIgdmVydGV4JDEyID0gXCIjaWZkZWYgVVNFX1BBVFRFUk5cXHJcXG5cXHJcXG5cXHR1bmlmb3JtIGZsb2F0IGFzcGVjdDtcXHJcXG5cXHR1bmlmb3JtIGZsb2F0IHBhdHRlcm5TY2FsZTtcXHJcXG5cXHR2YXJ5aW5nIHZlYzIgdlBhdHRlcm5Db29yZDtcXHJcXG5cXHJcXG4jZW5kaWZcXHJcXG5cXHJcXG52YXJ5aW5nIHZlYzIgdlV2O1xcclxcblxcclxcbnZvaWQgbWFpbigpIHtcXHJcXG5cXHJcXG5cXHQjaWZkZWYgVVNFX1BBVFRFUk5cXHJcXG5cXHJcXG5cXHRcXHR2ZWMyIGFzcGVjdENvcnJlY3Rpb24gPSB2ZWMyKGFzcGVjdCwgMS4wKTtcXHJcXG5cXHRcXHR2UGF0dGVybkNvb3JkID0gdXYgKiBhc3BlY3RDb3JyZWN0aW9uICogcGF0dGVyblNjYWxlO1xcclxcblxcclxcblxcdCNlbmRpZlxcclxcblxcclxcblxcdHZVdiA9IHV2O1xcclxcblxcclxcblxcdGdsX1Bvc2l0aW9uID0gcHJvamVjdGlvbk1hdHJpeCAqIG1vZGVsVmlld01hdHJpeCAqIHZlYzQocG9zaXRpb24sIDEuMCk7XFxyXFxuXFxyXFxufVxcclxcblwiO1xuLyoqXHJcbiAqIEFuIG91dGxpbmUgYmxlbmQgc2hhZGVyIG1hdGVyaWFsLlxyXG4gKi9cblxudmFyIE91dGxpbmVCbGVuZE1hdGVyaWFsID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfU2hhZGVyTWF0ZXJpYWwpIHtcbiAgLyoqXHJcbiAgICogQ29uc3RydWN0cyBhIG5ldyBvdXRsaW5lIGJsZW5kIG1hdGVyaWFsLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIFRoZSBvcHRpb25zLlxyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5lZGdlU3RyZW5ndGg9MS4wXSAtIFRoZSBlZGdlIHN0cmVuZ3RoLlxyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5wYXR0ZXJuU2NhbGU9MS4wXSAtIFRoZSBzY2FsZSBvZiB0aGUgcGF0dGVybiB0ZXh0dXJlLlxyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy52aXNpYmxlRWRnZUNvbG9yPTB4ZmZmZmZmXSAtIFRoZSBjb2xvciBvZiB2aXNpYmxlIGVkZ2VzLlxyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5oaWRkZW5FZGdlQ29sb3I9MHgyMjA5MEFdIC0gVGhlIGNvbG9yIG9mIGhpZGRlbiBlZGdlcy5cclxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFthbHBoYUJsZW5kaW5nPWZhbHNlXSAtIFdoZXRoZXIgdGhlIG91dGxpbmUgc2hvdWxkIGJlIGJsZW5kZWQgdXNpbmcgYWxwaGEuXHJcbiAgICogQHBhcmFtIHtCb29sZWFufSBbeFJheT10cnVlXSAtIFdoZXRoZXIgaGlkZGVuIHBhcnRzIG9mIHNlbGVjdGVkIG9iamVjdHMgc2hvdWxkIGJlIHZpc2libGUuXHJcbiAgICovXG4gIGZ1bmN0aW9uIE91dGxpbmVCbGVuZE1hdGVyaWFsKCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIE91dGxpbmVCbGVuZE1hdGVyaWFsKTtcblxuICAgIHZhciBzZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgZWRnZVN0cmVuZ3RoOiAxLjAsXG4gICAgICBwYXR0ZXJuU2NhbGU6IDEuMCxcbiAgICAgIHZpc2libGVFZGdlQ29sb3I6IDB4ZmZmZmZmLFxuICAgICAgaGlkZGVuRWRnZUNvbG9yOiAweDIyMDkwQSxcbiAgICAgIGFscGhhQmxlbmRpbmc6IGZhbHNlLFxuICAgICAgeFJheTogdHJ1ZVxuICAgIH0sIG9wdGlvbnMpO1xuICAgIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBnZXRQcm90b3R5cGVPZiQyKE91dGxpbmVCbGVuZE1hdGVyaWFsKS5jYWxsKHRoaXMsIHtcbiAgICAgIHR5cGU6IFwiT3V0bGluZUJsZW5kTWF0ZXJpYWxcIixcbiAgICAgIHVuaWZvcm1zOiB7XG4gICAgICAgIHB1bHNlOiBuZXcgVW5pZm9ybSgxLjApLFxuICAgICAgICBhc3BlY3Q6IG5ldyBVbmlmb3JtKDEuMCksXG4gICAgICAgIHREaWZmdXNlOiBuZXcgVW5pZm9ybShudWxsKSxcbiAgICAgICAgdE1hc2s6IG5ldyBVbmlmb3JtKG51bGwpLFxuICAgICAgICB0RWRnZXM6IG5ldyBVbmlmb3JtKG51bGwpLFxuICAgICAgICB0UGF0dGVybjogbmV3IFVuaWZvcm0obnVsbCksXG4gICAgICAgIGVkZ2VTdHJlbmd0aDogbmV3IFVuaWZvcm0oc2V0dGluZ3MuZWRnZVN0cmVuZ3RoKSxcbiAgICAgICAgcGF0dGVyblNjYWxlOiBuZXcgVW5pZm9ybShzZXR0aW5ncy5wYXR0ZXJuU2NhbGUpLFxuICAgICAgICB2aXNpYmxlRWRnZUNvbG9yOiBuZXcgVW5pZm9ybShuZXcgQ29sb3Ioc2V0dGluZ3MudmlzaWJsZUVkZ2VDb2xvcikpLFxuICAgICAgICBoaWRkZW5FZGdlQ29sb3I6IG5ldyBVbmlmb3JtKG5ldyBDb2xvcihzZXR0aW5ncy5oaWRkZW5FZGdlQ29sb3IpKVxuICAgICAgfSxcbiAgICAgIGZyYWdtZW50U2hhZGVyOiBmcmFnbWVudCQxMixcbiAgICAgIHZlcnRleFNoYWRlcjogdmVydGV4JDEyLFxuICAgICAgZGVwdGhXcml0ZTogZmFsc2UsXG4gICAgICBkZXB0aFRlc3Q6IGZhbHNlXG4gICAgfSkpO1xuXG4gICAgX3RoaXMuc2V0QWxwaGFCbGVuZGluZ0VuYWJsZWQoc2V0dGluZ3MuYWxwaGFCbGVuZGluZyk7XG5cbiAgICBfdGhpcy5zZXRYUmF5RW5hYmxlZChzZXR0aW5ncy54UmF5KTtcblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuICAvKipcclxuICAgKiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBhbHBoYSBibGVuZGluZy5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gZW5hYmxlZCAtIFdoZXRoZXIgdGhlIGFscGhhIGJsZW5kaW5nIHNob3VsZCBiZSBlbmFibGVkLlxyXG4gICAqL1xuXG5cbiAgY3JlYXRlQ2xhc3MoT3V0bGluZUJsZW5kTWF0ZXJpYWwsIFt7XG4gICAga2V5OiBcInNldEFscGhhQmxlbmRpbmdFbmFibGVkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldEFscGhhQmxlbmRpbmdFbmFibGVkKGVuYWJsZWQpIHtcbiAgICAgIGlmIChlbmFibGVkKSB7XG4gICAgICAgIHRoaXMuZGVmaW5lcy5BTFBIQV9CTEVORElORyA9IFwiMVwiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuZGVmaW5lcy5BTFBIQV9CTEVORElORztcbiAgICAgIH1cblxuICAgICAgdGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogRGVmaW5lcyB3aGV0aGVyIGhpZGRlbiBwYXJ0cyBvZiBzZWxlY3RlZCBvYmplY3RzIHNob3VsZCBiZSB2aXNpYmxlLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gZW5hYmxlZCAtIFdoZXRoZXIgaGlkZGVuIHBhcnRzIG9mIHNlbGVjdGVkIG9iamVjdHMgc2hvdWxkIGJlIHZpc2libGUuXHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInNldFhSYXlFbmFibGVkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldFhSYXlFbmFibGVkKGVuYWJsZWQpIHtcbiAgICAgIGlmIChlbmFibGVkKSB7XG4gICAgICAgIHRoaXMuZGVmaW5lcy5YX1JBWSA9IFwiMVwiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuZGVmaW5lcy5YX1JBWTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogU2V0cyBhIHBhdHRlcm4gdGV4dHVyZSB0byB1c2UgYXMgb3ZlcmxheS5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1RleHR1cmV9IFt0ZXh0dXJlPW51bGxdIC0gQSBwYXR0ZXJuIHRleHR1cmUuIFNldCB0byBudWxsIHRvIGRpc2FibGUgdGhlIHBhdHRlcm4uXHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInNldFBhdHRlcm5UZXh0dXJlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldFBhdHRlcm5UZXh0dXJlKCkge1xuICAgICAgdmFyIHRleHR1cmUgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IG51bGw7XG5cbiAgICAgIGlmICh0ZXh0dXJlICE9PSBudWxsKSB7XG4gICAgICAgIHRoaXMuZGVmaW5lcy5VU0VfUEFUVEVSTiA9IFwiMVwiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuZGVmaW5lcy5VU0VfUEFUVEVSTjtcbiAgICAgIH1cblxuICAgICAgdGhpcy51bmlmb3Jtcy50UGF0dGVybi52YWx1ZSA9IHRleHR1cmU7XG4gICAgICB0aGlzLm5lZWRzVXBkYXRlID0gdHJ1ZTtcbiAgICB9XG4gIH1dKTtcblxuICBpbmhlcml0cyhPdXRsaW5lQmxlbmRNYXRlcmlhbCwgX1NoYWRlck1hdGVyaWFsKTtcblxuICByZXR1cm4gT3V0bGluZUJsZW5kTWF0ZXJpYWw7XG59KFNoYWRlck1hdGVyaWFsKTtcblxudmFyIGZyYWdtZW50JDEzID0gXCJ1bmlmb3JtIHNhbXBsZXIyRCB0TWFzaztcXHJcXG5cXHJcXG52YXJ5aW5nIHZlYzIgdlV2MDtcXHJcXG52YXJ5aW5nIHZlYzIgdlV2MTtcXHJcXG52YXJ5aW5nIHZlYzIgdlV2MjtcXHJcXG52YXJ5aW5nIHZlYzIgdlV2MztcXHJcXG5cXHJcXG52b2lkIG1haW4oKSB7XFxyXFxuXFxyXFxuXFx0dmVjMiBjMCA9IHRleHR1cmUyRCh0TWFzaywgdlV2MCkucmc7XFxyXFxuXFx0dmVjMiBjMSA9IHRleHR1cmUyRCh0TWFzaywgdlV2MSkucmc7XFxyXFxuXFx0dmVjMiBjMiA9IHRleHR1cmUyRCh0TWFzaywgdlV2Mikucmc7XFxyXFxuXFx0dmVjMiBjMyA9IHRleHR1cmUyRCh0TWFzaywgdlV2Mykucmc7XFxyXFxuXFxyXFxuXFx0ZmxvYXQgZDAgPSAoYzAueCAtIGMxLngpICogMC41O1xcclxcblxcdGZsb2F0IGQxID0gKGMyLnggLSBjMy54KSAqIDAuNTtcXHJcXG5cXHRmbG9hdCBkID0gbGVuZ3RoKHZlYzIoZDAsIGQxKSk7XFxyXFxuXFxyXFxuXFx0ZmxvYXQgYTAgPSBtaW4oYzAueSwgYzEueSk7XFxyXFxuXFx0ZmxvYXQgYTEgPSBtaW4oYzIueSwgYzMueSk7XFxyXFxuXFx0ZmxvYXQgdmlzaWJpbGl0eUZhY3RvciA9IG1pbihhMCwgYTEpO1xcclxcblxcclxcblxcdGdsX0ZyYWdDb2xvci5yZyA9ICgxLjAgLSB2aXNpYmlsaXR5RmFjdG9yID4gMC4wMDEpID8gdmVjMihkLCAwLjApIDogdmVjMigwLjAsIGQpO1xcclxcblxcclxcbn1cXHJcXG5cIjtcbnZhciB2ZXJ0ZXgkMTMgPSBcInVuaWZvcm0gdmVjMiB0ZXhlbFNpemU7XFxyXFxuXFxyXFxudmFyeWluZyB2ZWMyIHZVdjA7XFxyXFxudmFyeWluZyB2ZWMyIHZVdjE7XFxyXFxudmFyeWluZyB2ZWMyIHZVdjI7XFxyXFxudmFyeWluZyB2ZWMyIHZVdjM7XFxyXFxuXFxyXFxudm9pZCBtYWluKCkge1xcclxcblxcclxcblxcdHZVdjAgPSB2ZWMyKHV2LnggKyB0ZXhlbFNpemUueCwgdXYueSk7XFxyXFxuXFx0dlV2MSA9IHZlYzIodXYueCAtIHRleGVsU2l6ZS54LCB1di55KTtcXHJcXG5cXHR2VXYyID0gdmVjMih1di54LCB1di55ICsgdGV4ZWxTaXplLnkpO1xcclxcblxcdHZVdjMgPSB2ZWMyKHV2LngsIHV2LnkgLSB0ZXhlbFNpemUueSk7XFxyXFxuXFxyXFxuXFx0Z2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbW9kZWxWaWV3TWF0cml4ICogdmVjNChwb3NpdGlvbiwgMS4wKTtcXHJcXG5cXHJcXG59XFxyXFxuXCI7XG4vKipcclxuICogQW4gb3V0bGluZSBlZGdlIGRldGVjdGlvbiBzaGFkZXIgbWF0ZXJpYWwuXHJcbiAqL1xuXG52YXIgT3V0bGluZUVkZ2VzTWF0ZXJpYWwgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9TaGFkZXJNYXRlcmlhbCkge1xuICAvKipcclxuICAgKiBDb25zdHJ1Y3RzIGEgbmV3IG91dGxpbmUgZWRnZSBkZXRlY3Rpb24gbWF0ZXJpYWwuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge1ZlY3RvcjJ9IFt0ZXhlbFNpemVdIC0gVGhlIGFic29sdXRlIHNjcmVlbiB0ZXhlbCBzaXplLlxyXG4gICAqL1xuICBmdW5jdGlvbiBPdXRsaW5lRWRnZXNNYXRlcmlhbCgpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICB2YXIgdGV4ZWxTaXplID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBuZXcgVmVjdG9yMigpO1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgT3V0bGluZUVkZ2VzTWF0ZXJpYWwpO1xuXG4gICAgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIGdldFByb3RvdHlwZU9mJDIoT3V0bGluZUVkZ2VzTWF0ZXJpYWwpLmNhbGwodGhpcywge1xuICAgICAgdHlwZTogXCJPdXRsaW5lRWRnZXNNYXRlcmlhbFwiLFxuICAgICAgdW5pZm9ybXM6IHtcbiAgICAgICAgdE1hc2s6IG5ldyBVbmlmb3JtKG51bGwpLFxuICAgICAgICB0ZXhlbFNpemU6IG5ldyBVbmlmb3JtKG5ldyBWZWN0b3IyKCkpXG4gICAgICB9LFxuICAgICAgZnJhZ21lbnRTaGFkZXI6IGZyYWdtZW50JDEzLFxuICAgICAgdmVydGV4U2hhZGVyOiB2ZXJ0ZXgkMTMsXG4gICAgICBkZXB0aFdyaXRlOiBmYWxzZSxcbiAgICAgIGRlcHRoVGVzdDogZmFsc2VcbiAgICB9KSk7XG5cbiAgICBfdGhpcy5zZXRUZXhlbFNpemUodGV4ZWxTaXplLngsIHRleGVsU2l6ZS55KTtcblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuICAvKipcclxuICAgKiBTZXRzIHRoZSB0ZXhlbCBzaXplLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHggLSBUaGUgdGV4ZWwgd2lkdGguXHJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHkgLSBUaGUgdGV4ZWwgaGVpZ2h0LlxyXG4gICAqL1xuXG5cbiAgY3JlYXRlQ2xhc3MoT3V0bGluZUVkZ2VzTWF0ZXJpYWwsIFt7XG4gICAga2V5OiBcInNldFRleGVsU2l6ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRUZXhlbFNpemUoeCwgeSkge1xuICAgICAgdGhpcy51bmlmb3Jtcy50ZXhlbFNpemUudmFsdWUuc2V0KHgsIHkpO1xuICAgIH1cbiAgfV0pO1xuXG4gIGluaGVyaXRzKE91dGxpbmVFZGdlc01hdGVyaWFsLCBfU2hhZGVyTWF0ZXJpYWwpO1xuXG4gIHJldHVybiBPdXRsaW5lRWRnZXNNYXRlcmlhbDtcbn0oU2hhZGVyTWF0ZXJpYWwpO1xuXG52YXIgZnJhZ21lbnQkMTQgPSBcInVuaWZvcm0gc2FtcGxlcjJEIHREaWZmdXNlO1xcclxcbnVuaWZvcm0gZmxvYXQgZ3JhbnVsYXJpdHk7XFxyXFxudW5pZm9ybSBmbG9hdCBkeDtcXHJcXG51bmlmb3JtIGZsb2F0IGR5O1xcclxcblxcclxcbnZhcnlpbmcgdmVjMiB2VXY7XFxyXFxuXFxyXFxudm9pZCBtYWluKCkge1xcclxcblxcclxcblxcdHZlYzQgdGV4ZWw7XFxyXFxuXFxyXFxuXFx0aWYoZ3JhbnVsYXJpdHkgPiAwLjApIHtcXHJcXG5cXHJcXG5cXHRcXHR2ZWMyIGNvb3JkID0gdmVjMihcXHJcXG5cXHRcXHRcXHRkeCAqIChmbG9vcih2VXYueCAvIGR4KSArIDAuNSksXFxyXFxuXFx0XFx0XFx0ZHkgKiAoZmxvb3IodlV2LnkgLyBkeSkgKyAwLjUpXFxyXFxuXFx0XFx0KTtcXHJcXG5cXHJcXG5cXHRcXHR0ZXhlbCA9IHRleHR1cmUyRCh0RGlmZnVzZSwgY29vcmQpO1xcclxcblxcclxcblxcdH0gZWxzZSB7XFxyXFxuXFxyXFxuXFx0XFx0dGV4ZWwgPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdik7XFxyXFxuXFxyXFxuXFx0fVxcclxcblxcclxcblxcdGdsX0ZyYWdDb2xvciA9IHRleGVsO1xcclxcblxcclxcbn1cXHJcXG5cIjtcbnZhciB2ZXJ0ZXgkMTQgPSBcInZhcnlpbmcgdmVjMiB2VXY7XFxyXFxuXFxyXFxudm9pZCBtYWluKCkge1xcclxcblxcclxcblxcdHZVdiA9IHV2O1xcclxcblxcdGdsX1Bvc2l0aW9uID0gcHJvamVjdGlvbk1hdHJpeCAqIG1vZGVsVmlld01hdHJpeCAqIHZlYzQocG9zaXRpb24sIDEuMCk7XFxyXFxuXFxyXFxufVxcclxcblwiO1xuLyoqXHJcbiAqIEEgcGl4ZWxhdGlvbiBzaGFkZXIgbWF0ZXJpYWwuXHJcbiAqXHJcbiAqIE9yaWdpbmFsIHNoYWRlciBjb2RlIGJ5IFJvYmVydCBDYXNhbm92YTpcclxuICogIGh0dHBzOi8vZ2l0aHViLmNvbS9yb2JlcnRjYXNhbm92YS9waXhlbGF0ZS1zaGFkZXJcclxuICovXG5cbnZhciBQaXhlbGF0aW9uTWF0ZXJpYWwgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9TaGFkZXJNYXRlcmlhbCkge1xuICAvKipcclxuICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHBpeGVsYXRpb24gbWF0ZXJpYWwuXHJcbiAgICovXG4gIGZ1bmN0aW9uIFBpeGVsYXRpb25NYXRlcmlhbCgpIHtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBQaXhlbGF0aW9uTWF0ZXJpYWwpO1xuXG4gICAgcmV0dXJuIHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgZ2V0UHJvdG90eXBlT2YkMihQaXhlbGF0aW9uTWF0ZXJpYWwpLmNhbGwodGhpcywge1xuICAgICAgdHlwZTogXCJQaXhlbGF0aW9uTWF0ZXJpYWxcIixcbiAgICAgIHVuaWZvcm1zOiB7XG4gICAgICAgIHREaWZmdXNlOiBuZXcgVW5pZm9ybShudWxsKSxcbiAgICAgICAgZ3JhbnVsYXJpdHk6IG5ldyBVbmlmb3JtKDEuMCksXG4gICAgICAgIHJlc29sdXRpb246IG5ldyBVbmlmb3JtKG5ldyBWZWN0b3IyKDEuMCwgMS4wKSksXG4gICAgICAgIGR4OiBuZXcgVW5pZm9ybSgxLjApLFxuICAgICAgICBkeTogbmV3IFVuaWZvcm0oMS4wKVxuICAgICAgfSxcbiAgICAgIGZyYWdtZW50U2hhZGVyOiBmcmFnbWVudCQxNCxcbiAgICAgIHZlcnRleFNoYWRlcjogdmVydGV4JDE0LFxuICAgICAgZGVwdGhXcml0ZTogZmFsc2UsXG4gICAgICBkZXB0aFRlc3Q6IGZhbHNlXG4gICAgfSkpO1xuICB9XG4gIC8qKlxyXG4gICAqIFRoZSBwaXhlbCBncmFudWxhcml0eS5cclxuICAgKlxyXG4gICAqIEB0eXBlIHtOdW1iZXJ9XHJcbiAgICovXG5cblxuICBjcmVhdGVDbGFzcyhQaXhlbGF0aW9uTWF0ZXJpYWwsIFt7XG4gICAga2V5OiBcInNldFJlc29sdXRpb25cIixcblxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgcmVzb2x1dGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gd2lkdGggLSBUaGUgd2lkdGguXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gaGVpZ2h0IC0gVGhlIGhlaWdodC5cclxuICAgICAqL1xuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRSZXNvbHV0aW9uKHdpZHRoLCBoZWlnaHQpIHtcbiAgICAgIHRoaXMudW5pZm9ybXMucmVzb2x1dGlvbi52YWx1ZS5zZXQod2lkdGgsIGhlaWdodCk7XG4gICAgICB0aGlzLmdyYW51bGFyaXR5ID0gdGhpcy5ncmFudWxhcml0eTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ3JhbnVsYXJpdHlcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnVuaWZvcm1zLmdyYW51bGFyaXR5LnZhbHVlO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEEgaGlnaGVyIHZhbHVlIHlpZWxkcyBjb2Fyc2VyIHZpc3VhbHMuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge051bWJlcn1cclxuICAgICAqL1xuICAgICxcbiAgICBzZXQ6IGZ1bmN0aW9uIHNldCh4KSB7XG4gICAgICB2YXIgdW5pZm9ybXMgPSB0aGlzLnVuaWZvcm1zO1xuICAgICAgdmFyIHJlc29sdXRpb24gPSB1bmlmb3Jtcy5yZXNvbHV0aW9uLnZhbHVlO1xuICAgICAgdW5pZm9ybXMuZ3JhbnVsYXJpdHkudmFsdWUgPSB4O1xuICAgICAgdW5pZm9ybXMuZHgudmFsdWUgPSB4IC8gcmVzb2x1dGlvbi54O1xuICAgICAgdW5pZm9ybXMuZHkudmFsdWUgPSB4IC8gcmVzb2x1dGlvbi55O1xuICAgIH1cbiAgfV0pO1xuXG4gIGluaGVyaXRzKFBpeGVsYXRpb25NYXRlcmlhbCwgX1NoYWRlck1hdGVyaWFsKTtcblxuICByZXR1cm4gUGl4ZWxhdGlvbk1hdGVyaWFsO1xufShTaGFkZXJNYXRlcmlhbCk7XG5cbnZhciBmcmFnbWVudCQxNSA9IFwiI2luY2x1ZGUgPGNvbW1vbj5cXHJcXG5cXHJcXG51bmlmb3JtIHNhbXBsZXIyRCB0RGlmZnVzZTtcXHJcXG51bmlmb3JtIHNhbXBsZXIyRCB0RGVwdGg7XFxyXFxuXFxyXFxudW5pZm9ybSB2ZWMyIHRleGVsU2l6ZTtcXHJcXG51bmlmb3JtIHZlYzIgaGFsZlRleGVsU2l6ZTtcXHJcXG5cXHJcXG51bmlmb3JtIGZsb2F0IGNhbWVyYU5lYXI7XFxyXFxudW5pZm9ybSBmbG9hdCBjYW1lcmFGYXI7XFxyXFxuXFxyXFxudW5pZm9ybSBmbG9hdCBmb2NhbExlbmd0aDtcXHJcXG51bmlmb3JtIGZsb2F0IGZvY2FsU3RvcDtcXHJcXG5cXHJcXG51bmlmb3JtIGZsb2F0IG1heEJsdXI7XFxyXFxudW5pZm9ybSBmbG9hdCBsdW1pbmFuY2VUaHJlc2hvbGQ7XFxyXFxudW5pZm9ybSBmbG9hdCBsdW1pbmFuY2VHYWluO1xcclxcbnVuaWZvcm0gZmxvYXQgYmlhcztcXHJcXG51bmlmb3JtIGZsb2F0IGZyaW5nZTtcXHJcXG51bmlmb3JtIGZsb2F0IGRpdGhlclN0cmVuZ3RoO1xcclxcblxcclxcbiNpZmRlZiBTSEFERVJfRk9DVVNcXHJcXG5cXHJcXG5cXHR1bmlmb3JtIHZlYzIgZm9jdXNDb29yZHM7XFxyXFxuXFxyXFxuI2Vsc2VcXHJcXG5cXHJcXG5cXHR1bmlmb3JtIGZsb2F0IGZvY2FsRGVwdGg7XFxyXFxuXFxyXFxuI2VuZGlmXFxyXFxuXFxyXFxudmFyeWluZyB2ZWMyIHZVdjtcXHJcXG5cXHJcXG4jaWZuZGVmIFVTRV9MT0dERVBUSEJVRlxcclxcblxcclxcblxcdCNpbmNsdWRlIDxwYWNraW5nPlxcclxcblxcclxcblxcdGZsb2F0IHJlYWREZXB0aChzYW1wbGVyMkQgZGVwdGhTYW1wbGVyLCB2ZWMyIGNvb3JkKSB7XFxyXFxuXFxyXFxuXFx0XFx0ZmxvYXQgZnJhZ0Nvb3JkWiA9IHRleHR1cmUyRChkZXB0aFNhbXBsZXIsIGNvb3JkKS54O1xcclxcblxcdFxcdGZsb2F0IHZpZXdaID0gcGVyc3BlY3RpdmVEZXB0aFRvVmlld1ooZnJhZ0Nvb3JkWiwgY2FtZXJhTmVhciwgY2FtZXJhRmFyKTtcXHJcXG5cXHJcXG5cXHRcXHRyZXR1cm4gdmlld1pUb09ydGhvZ3JhcGhpY0RlcHRoKHZpZXdaLCBjYW1lcmFOZWFyLCBjYW1lcmFGYXIpO1xcclxcblxcclxcblxcdH1cXHJcXG5cXHJcXG4jZW5kaWZcXHJcXG5cXHJcXG4jaWZkZWYgUEVOVEFHT05cXHJcXG5cXHJcXG5cXHRmbG9hdCBwZW50YSh2ZWMyIGNvb3Jkcykge1xcclxcblxcclxcblxcdFxcdGNvbnN0IHZlYzQgSFMwID0gdmVjNCggMS4wLCAgICAgICAgICAwLjAsICAgICAgICAgMC4wLCAxLjApO1xcclxcblxcdFxcdGNvbnN0IHZlYzQgSFMxID0gdmVjNCggMC4zMDkwMTY5OTQsICAwLjk1MTA1NjUxNiwgMC4wLCAxLjApO1xcclxcblxcdFxcdGNvbnN0IHZlYzQgSFMyID0gdmVjNCgtMC44MDkwMTY5OTQsICAwLjU4Nzc4NTI1MiwgMC4wLCAxLjApO1xcclxcblxcdFxcdGNvbnN0IHZlYzQgSFMzID0gdmVjNCgtMC44MDkwMTY5OTQsIC0wLjU4Nzc4NTI1MiwgMC4wLCAxLjApO1xcclxcblxcdFxcdGNvbnN0IHZlYzQgSFM0ID0gdmVjNCggMC4zMDkwMTY5OTQsIC0wLjk1MTA1NjUxNiwgMC4wLCAxLjApO1xcclxcblxcdFxcdGNvbnN0IHZlYzQgSFM1ID0gdmVjNCggMC4wLCAgICAgICAgICAwLjAsICAgICAgICAgMS4wLCAxLjApO1xcclxcblxcclxcblxcdFxcdGNvbnN0IHZlYzQgT05FID0gdmVjNCgxLjApO1xcclxcblxcclxcblxcdFxcdGNvbnN0IGZsb2F0IFBfRkVBVEhFUiA9IDAuNDtcXHJcXG5cXHRcXHRjb25zdCBmbG9hdCBOX0ZFQVRIRVIgPSAtUF9GRUFUSEVSO1xcclxcblxcclxcblxcdFxcdGZsb2F0IGluT3JPdXQgPSAtNC4wO1xcclxcblxcclxcblxcdFxcdHZlYzQgUCA9IHZlYzQoY29vcmRzLCB2ZWMyKFJJTkdTX0ZMT0FUIC0gMS4zKSk7XFxyXFxuXFxyXFxuXFx0XFx0dmVjNCBkaXN0ID0gdmVjNChcXHJcXG5cXHRcXHRcXHRkb3QoUCwgSFMwKSxcXHJcXG5cXHRcXHRcXHRkb3QoUCwgSFMxKSxcXHJcXG5cXHRcXHRcXHRkb3QoUCwgSFMyKSxcXHJcXG5cXHRcXHRcXHRkb3QoUCwgSFMzKVxcclxcblxcdFxcdCk7XFxyXFxuXFxyXFxuXFx0XFx0ZGlzdCA9IHNtb290aHN0ZXAoTl9GRUFUSEVSLCBQX0ZFQVRIRVIsIGRpc3QpO1xcclxcblxcclxcblxcdFxcdGluT3JPdXQgKz0gZG90KGRpc3QsIE9ORSk7XFxyXFxuXFxyXFxuXFx0XFx0ZGlzdC54ID0gZG90KFAsIEhTNCk7XFxyXFxuXFx0XFx0ZGlzdC55ID0gSFM1LncgLSBhYnMoUC56KTtcXHJcXG5cXHJcXG5cXHRcXHRkaXN0ID0gc21vb3Roc3RlcChOX0ZFQVRIRVIsIFBfRkVBVEhFUiwgZGlzdCk7XFxyXFxuXFx0XFx0aW5Pck91dCArPSBkaXN0Lng7XFxyXFxuXFxyXFxuXFx0XFx0cmV0dXJuIGNsYW1wKGluT3JPdXQsIDAuMCwgMS4wKTtcXHJcXG5cXHJcXG5cXHR9XFxyXFxuXFxyXFxuI2VuZGlmXFxyXFxuXFxyXFxuI2lmZGVmIFNIT1dfRk9DVVNcXHJcXG5cXHJcXG5cXHR2ZWMzIGRlYnVnRm9jdXModmVjMyBjLCBmbG9hdCBibHVyLCBmbG9hdCBkZXB0aCkge1xcclxcblxcclxcblxcdFxcdGZsb2F0IGVkZ2UgPSAwLjAwMiAqIGRlcHRoO1xcclxcblxcdFxcdGZsb2F0IG0gPSBjbGFtcChzbW9vdGhzdGVwKDAuMCwgZWRnZSwgYmx1ciksIDAuMCwgMS4wKTtcXHJcXG5cXHRcXHRmbG9hdCBlID0gY2xhbXAoc21vb3Roc3RlcCgxLjAgLSBlZGdlLCAxLjAsIGJsdXIpLCAwLjAsIDEuMCk7XFxyXFxuXFxyXFxuXFx0XFx0YyA9IG1peChjLCB2ZWMzKDEuMCwgMC41LCAwLjApLCAoMS4wIC0gbSkgKiAwLjYpO1xcclxcblxcdFxcdGMgPSBtaXgoYywgdmVjMygwLjAsIDAuNSwgMS4wKSwgKCgxLjAgLSBlKSAtICgxLjAgLSBtKSkgKiAwLjIpO1xcclxcblxcclxcblxcdFxcdHJldHVybiBjO1xcclxcblxcclxcblxcdH1cXHJcXG5cXHJcXG4jZW5kaWZcXHJcXG5cXHJcXG4jaWZkZWYgVklHTkVUVEVcXHJcXG5cXHJcXG5cXHRmbG9hdCB2aWduZXR0ZSgpIHtcXHJcXG5cXHJcXG5cXHRcXHRjb25zdCB2ZWMyIENFTlRFUiA9IHZlYzIoMC41KTtcXHJcXG5cXHJcXG5cXHRcXHRjb25zdCBmbG9hdCBWSUdORVRURV9PVVQgPSAxLjM7XFxyXFxuXFx0XFx0Y29uc3QgZmxvYXQgVklHTkVUVEVfSU4gPSAwLjA7XFxyXFxuXFx0XFx0Y29uc3QgZmxvYXQgVklHTkVUVEVfRkFERSA9IDIyLjA7IFxcclxcblxcclxcblxcdFxcdGZsb2F0IGQgPSBkaXN0YW5jZSh2VXYsIENFTlRFUik7XFxyXFxuXFx0XFx0ZCA9IHNtb290aHN0ZXAoVklHTkVUVEVfT1VUICsgKGZvY2FsU3RvcCAvIFZJR05FVFRFX0ZBREUpLCBWSUdORVRURV9JTiArIChmb2NhbFN0b3AgLyBWSUdORVRURV9GQURFKSwgZCk7XFxyXFxuXFxyXFxuXFx0XFx0cmV0dXJuIGNsYW1wKGQsIDAuMCwgMS4wKTtcXHJcXG5cXHJcXG5cXHR9XFxyXFxuXFxyXFxuI2VuZGlmXFxyXFxuXFxyXFxudmVjMiByYW5kMih2ZWMyIGNvb3JkKSB7XFxyXFxuXFxyXFxuXFx0dmVjMiBub2lzZTtcXHJcXG5cXHJcXG5cXHQjaWZkZWYgTk9JU0VcXHJcXG5cXHJcXG5cXHRcXHRjb25zdCBmbG9hdCBhID0gMTIuOTg5ODtcXHJcXG5cXHRcXHRjb25zdCBmbG9hdCBiID0gNzguMjMzO1xcclxcblxcdFxcdGNvbnN0IGZsb2F0IGMgPSA0Mzc1OC41NDUzO1xcclxcblxcclxcblxcdFxcdG5vaXNlLnggPSBjbGFtcChmcmFjdChzaW4obW9kKGRvdChjb29yZCwgdmVjMihhLCBiKSksIDMuMTQpKSAqIGMpLCAwLjAsIDEuMCkgKiAyLjAgLSAxLjA7XFxyXFxuXFx0XFx0bm9pc2UueSA9IGNsYW1wKGZyYWN0KHNpbihtb2QoZG90KGNvb3JkLCB2ZWMyKGEsIGIpICogMi4wKSwgMy4xNCkpICogYyksIDAuMCwgMS4wKSAqIDIuMCAtIDEuMDtcXHJcXG5cXHJcXG5cXHQjZWxzZVxcclxcblxcclxcblxcdFxcdG5vaXNlLnggPSAoKGZyYWN0KDEuMCAtIGNvb3JkLnMgKiBoYWxmVGV4ZWxTaXplLngpICogMC4yNSkgKyAoZnJhY3QoY29vcmQudCAqIGhhbGZUZXhlbFNpemUueSkgKiAwLjc1KSkgKiAyLjAgLSAxLjA7XFxyXFxuXFx0XFx0bm9pc2UueSA9ICgoZnJhY3QoMS4wIC0gY29vcmQucyAqIGhhbGZUZXhlbFNpemUueCkgKiAwLjc1KSArIChmcmFjdChjb29yZC50ICogaGFsZlRleGVsU2l6ZS55KSAqIDAuMjUpKSAqIDIuMCAtIDEuMDtcXHJcXG5cXHJcXG5cXHQjZW5kaWZcXHJcXG5cXHJcXG5cXHRyZXR1cm4gbm9pc2U7XFxyXFxuXFxyXFxufVxcclxcblxcclxcbnZlYzMgcHJvY2Vzc1RleGVsKHZlYzIgY29vcmRzLCBmbG9hdCBibHVyKSB7XFxyXFxuXFxyXFxuXFx0dmVjMyBjO1xcclxcblxcdGMuciA9IHRleHR1cmUyRCh0RGlmZnVzZSwgY29vcmRzICsgdmVjMigwLjAsIDEuMCkgKiB0ZXhlbFNpemUgKiBmcmluZ2UgKiBibHVyKS5yO1xcclxcblxcdGMuZyA9IHRleHR1cmUyRCh0RGlmZnVzZSwgY29vcmRzICsgdmVjMigtMC44NjYsIC0wLjUpICogdGV4ZWxTaXplICogZnJpbmdlICogYmx1cikuZztcXHJcXG5cXHRjLmIgPSB0ZXh0dXJlMkQodERpZmZ1c2UsIGNvb3JkcyArIHZlYzIoMC44NjYsIC0wLjUpICogdGV4ZWxTaXplICogZnJpbmdlICogYmx1cikuYjtcXHJcXG5cXHJcXG5cXHQvLyBDYWxjdWxhdGUgdGhlIGx1bWluYW5jZSBvZiB0aGUgY29uc3RydWN0ZWQgY29sb3VyLlxcclxcblxcdGZsb2F0IGx1bWluYW5jZSA9IGxpbmVhclRvUmVsYXRpdmVMdW1pbmFuY2UoYyk7XFxyXFxuXFx0ZmxvYXQgdGhyZXNob2xkID0gbWF4KChsdW1pbmFuY2UgLSBsdW1pbmFuY2VUaHJlc2hvbGQpICogbHVtaW5hbmNlR2FpbiwgMC4wKTtcXHJcXG5cXHJcXG5cXHRyZXR1cm4gYyArIG1peCh2ZWMzKDAuMCksIGMsIHRocmVzaG9sZCAqIGJsdXIpO1xcclxcblxcclxcbn1cXHJcXG5cXHJcXG5mbG9hdCBsaW5lYXJpemUoZmxvYXQgZGVwdGgpIHtcXHJcXG5cXHJcXG5cXHRyZXR1cm4gLWNhbWVyYUZhciAqIGNhbWVyYU5lYXIgLyAoZGVwdGggKiAoY2FtZXJhRmFyIC0gY2FtZXJhTmVhcikgLSBjYW1lcmFGYXIpO1xcclxcblxcclxcbn1cXHJcXG5cXHJcXG5mbG9hdCBnYXRoZXIoZmxvYXQgaSwgZmxvYXQgaiwgZmxvYXQgcmluZ1NhbXBsZXMsIGlub3V0IHZlYzMgY29sb3IsIGZsb2F0IHcsIGZsb2F0IGgsIGZsb2F0IGJsdXIpIHtcXHJcXG5cXHJcXG5cXHRjb25zdCBmbG9hdCBUV09fUEkgPSA2LjI4MzE4NTMxO1xcclxcblxcclxcblxcdGZsb2F0IHN0ZXAgPSBUV09fUEkgLyByaW5nU2FtcGxlcztcXHJcXG5cXHRmbG9hdCBwdyA9IGNvcyhqICogc3RlcCkgKiBpO1xcclxcblxcdGZsb2F0IHBoID0gc2luKGogKiBzdGVwKSAqIGk7XFxyXFxuXFxyXFxuXFx0I2lmZGVmIFBFTlRBR09OXFxyXFxuXFxyXFxuXFx0XFx0ZmxvYXQgcCA9IHBlbnRhKHZlYzIocHcsIHBoKSk7XFxyXFxuXFxyXFxuXFx0I2Vsc2VcXHJcXG5cXHJcXG5cXHRcXHRmbG9hdCBwID0gMS4wO1xcclxcblxcclxcblxcdCNlbmRpZlxcclxcblxcclxcblxcdGNvbG9yICs9IHByb2Nlc3NUZXhlbCh2VXYgKyB2ZWMyKHB3ICogdywgcGggKiBoKSwgYmx1cikgKiBtaXgoMS4wLCBpIC8gUklOR1NfRkxPQVQsIGJpYXMpICogcDtcXHJcXG5cXHJcXG5cXHRyZXR1cm4gbWl4KDEuMCwgaSAvIFJJTkdTX0ZMT0FULCBiaWFzKSAqIHA7XFxyXFxuXFxyXFxufVxcclxcblxcclxcbnZvaWQgbWFpbigpIHtcXHJcXG5cXHJcXG5cXHQjaWZkZWYgVVNFX0xPR0RFUFRIQlVGXFxyXFxuXFxyXFxuXFx0XFx0ZmxvYXQgZGVwdGggPSBsaW5lYXJpemUodGV4dHVyZTJEKHREZXB0aCwgdlV2KS54KTtcXHJcXG5cXHJcXG5cXHQjZWxzZVxcclxcblxcclxcblxcdFxcdGZsb2F0IGRlcHRoID0gbGluZWFyaXplKHJlYWREZXB0aCh0RGVwdGgsIHZVdikpO1xcclxcblxcclxcblxcdCNlbmRpZlxcclxcblxcclxcblxcdCNpZmRlZiBTSEFERVJfRk9DVVNcXHJcXG5cXHJcXG5cXHRcXHQjaWZkZWYgVVNFX0xPR0RFUFRIQlVGXFxyXFxuXFxyXFxuXFx0XFx0XFx0ZmxvYXQgZkRlcHRoID0gbGluZWFyaXplKHRleHR1cmUyRCh0RGVwdGgsIGZvY3VzQ29vcmRzKS54KTtcXHJcXG5cXHJcXG5cXHRcXHQjZWxzZVxcclxcblxcclxcblxcdFxcdFxcdGZsb2F0IGZEZXB0aCA9IGxpbmVhcml6ZShyZWFkRGVwdGgodERlcHRoLCBmb2N1c0Nvb3JkcykpO1xcclxcblxcclxcblxcdFxcdCNlbmRpZlxcclxcblxcclxcblxcdCNlbHNlXFxyXFxuXFxyXFxuXFx0XFx0ZmxvYXQgZkRlcHRoID0gZm9jYWxEZXB0aDtcXHJcXG5cXHJcXG5cXHQjZW5kaWZcXHJcXG5cXHJcXG5cXHQjaWZkZWYgTUFOVUFMX0RPRlxcclxcblxcclxcblxcdFxcdGNvbnN0IGZsb2F0IG5Eb0ZTdGFydCA9IDEuMDsgXFxyXFxuXFx0XFx0Y29uc3QgZmxvYXQgbkRvRkRpc3QgPSAyLjA7XFxyXFxuXFx0XFx0Y29uc3QgZmxvYXQgZkRvRlN0YXJ0ID0gMS4wO1xcclxcblxcdFxcdGNvbnN0IGZsb2F0IGZEb0ZEaXN0ID0gMy4wO1xcclxcblxcclxcblxcdFxcdGZsb2F0IGZvY2FsUGxhbmUgPSBkZXB0aCAtIGZEZXB0aDtcXHJcXG5cXHRcXHRmbG9hdCBmYXJEb0YgPSAoZm9jYWxQbGFuZSAtIGZEb0ZTdGFydCkgLyBmRG9GRGlzdDtcXHJcXG5cXHRcXHRmbG9hdCBuZWFyRG9GID0gKC1mb2NhbFBsYW5lIC0gbkRvRlN0YXJ0KSAvIG5Eb0ZEaXN0O1xcclxcblxcclxcblxcdFxcdGZsb2F0IGJsdXIgPSAoZm9jYWxQbGFuZSA+IDAuMCkgPyBmYXJEb0YgOiBuZWFyRG9GO1xcclxcblxcclxcblxcdCNlbHNlXFxyXFxuXFxyXFxuXFx0XFx0Y29uc3QgZmxvYXQgQ0lSQ0xFX09GX0NPTkZVU0lPTiA9IDAuMDM7IC8vIDM1bW0gZmlsbSA9IDAuMDNtbSBDb0MuXFxyXFxuXFxyXFxuXFx0XFx0ZmxvYXQgZm9jYWxQbGFuZU1NID0gZkRlcHRoICogMTAwMC4wO1xcclxcblxcdFxcdGZsb2F0IGRlcHRoTU0gPSBkZXB0aCAqIDEwMDAuMDtcXHJcXG5cXHJcXG5cXHRcXHRmbG9hdCBmb2NhbFBsYW5lID0gKGRlcHRoTU0gKiBmb2NhbExlbmd0aCkgLyAoZGVwdGhNTSAtIGZvY2FsTGVuZ3RoKTtcXHJcXG5cXHRcXHRmbG9hdCBmYXJEb0YgPSAoZm9jYWxQbGFuZU1NICogZm9jYWxMZW5ndGgpIC8gKGZvY2FsUGxhbmVNTSAtIGZvY2FsTGVuZ3RoKTtcXHJcXG5cXHRcXHRmbG9hdCBuZWFyRG9GID0gKGZvY2FsUGxhbmVNTSAtIGZvY2FsTGVuZ3RoKSAvIChmb2NhbFBsYW5lTU0gKiBmb2NhbFN0b3AgKiBDSVJDTEVfT0ZfQ09ORlVTSU9OKTtcXHJcXG5cXHJcXG5cXHRcXHRmbG9hdCBibHVyID0gYWJzKGZvY2FsUGxhbmUgLSBmYXJEb0YpICogbmVhckRvRjtcXHJcXG5cXHJcXG5cXHQjZW5kaWZcXHJcXG5cXHJcXG5cXHRibHVyID0gY2xhbXAoYmx1ciwgMC4wLCAxLjApO1xcclxcblxcclxcblxcdC8vIERpdGhlcmluZy5cXHJcXG5cXHR2ZWMyIG5vaXNlID0gcmFuZDIodlV2KSAqIGRpdGhlclN0cmVuZ3RoICogYmx1cjtcXHJcXG5cXHJcXG5cXHRmbG9hdCBibHVyRmFjdG9yWCA9IHRleGVsU2l6ZS54ICogYmx1ciAqIG1heEJsdXIgKyBub2lzZS54O1xcclxcblxcdGZsb2F0IGJsdXJGYWN0b3JZID0gdGV4ZWxTaXplLnkgKiBibHVyICogbWF4Qmx1ciArIG5vaXNlLnk7XFxyXFxuXFxyXFxuXFx0Y29uc3QgaW50IE1BWF9SSU5HX1NBTVBMRVMgPSBSSU5HU19JTlQgKiBTQU1QTEVTX0lOVDtcXHJcXG5cXHJcXG5cXHQvLyBDYWxjdWxhdGlvbiBvZiBmaW5hbCBjb2xvci5cXHJcXG5cXHR2ZWM0IGNvbG9yO1xcclxcblxcclxcblxcdGlmKGJsdXIgPCAwLjA1KSB7XFxyXFxuXFxyXFxuXFx0XFx0Y29sb3IgPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdik7XFxyXFxuXFxyXFxuXFx0fSBlbHNlIHtcXHJcXG5cXHJcXG5cXHRcXHRjb2xvciA9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2KTtcXHJcXG5cXHJcXG5cXHRcXHRmbG9hdCBzID0gMS4wO1xcclxcblxcdFxcdGludCByaW5nU2FtcGxlcztcXHJcXG5cXHJcXG5cXHRcXHRmb3IoaW50IGkgPSAxOyBpIDw9IFJJTkdTX0lOVDsgKytpKSB7XFxyXFxuXFxyXFxuXFx0XFx0XFx0cmluZ1NhbXBsZXMgPSBpICogU0FNUExFU19JTlQ7XFxyXFxuXFxyXFxuXFx0XFx0XFx0Ly8gQ29uc3RhbnQgbG9vcC5cXHJcXG5cXHRcXHRcXHRmb3IoaW50IGogPSAwOyBqIDwgTUFYX1JJTkdfU0FNUExFUzsgKytqKSB7XFxyXFxuXFxyXFxuXFx0XFx0XFx0XFx0Ly8gQnJlYWsgZWFybGllci5cXHJcXG5cXHRcXHRcXHRcXHRpZihqID49IHJpbmdTYW1wbGVzKSB7IGJyZWFrOyB9XFxyXFxuXFxyXFxuXFx0XFx0XFx0XFx0cyArPSBnYXRoZXIoZmxvYXQoaSksIGZsb2F0KGopLCBmbG9hdChyaW5nU2FtcGxlcyksIGNvbG9yLnJnYiwgYmx1ckZhY3RvclgsIGJsdXJGYWN0b3JZLCBibHVyKTtcXHJcXG5cXHJcXG5cXHRcXHRcXHR9XFxyXFxuXFxyXFxuXFx0XFx0fVxcclxcblxcclxcblxcdFxcdGNvbG9yLnJnYiAvPSBzOyAvLyBEaXZpZGUgYnkgc2FtcGxlIGNvdW50LlxcclxcblxcclxcblxcdH1cXHJcXG5cXHJcXG5cXHQjaWZkZWYgU0hPV19GT0NVU1xcclxcblxcclxcblxcdFxcdGNvbG9yLnJnYiA9IGRlYnVnRm9jdXMoY29sb3IucmdiLCBibHVyLCBkZXB0aCk7XFxyXFxuXFxyXFxuXFx0I2VuZGlmXFxyXFxuXFxyXFxuXFx0I2lmZGVmIFZJR05FVFRFXFxyXFxuXFxyXFxuXFx0XFx0Y29sb3IucmdiICo9IHZpZ25ldHRlKCk7XFxyXFxuXFxyXFxuXFx0I2VuZGlmXFxyXFxuXFxyXFxuXFx0Z2xfRnJhZ0NvbG9yID0gY29sb3I7XFxyXFxuXFxyXFxufVxcclxcblwiO1xudmFyIHZlcnRleCQxNSA9IFwidmFyeWluZyB2ZWMyIHZVdjtcXHJcXG5cXHJcXG52b2lkIG1haW4oKSB7XFxyXFxuXFxyXFxuXFx0dlV2ID0gdXY7XFxyXFxuXFx0Z2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbW9kZWxWaWV3TWF0cml4ICogdmVjNChwb3NpdGlvbiwgMS4wKTtcXHJcXG5cXHJcXG59XFxyXFxuXCI7XG4vKipcclxuICogRGVwdGggb2YgRmllbGQgc2hhZGVyIHYyLjQuXHJcbiAqXHJcbiAqIE9yaWdpbmFsIHNoYWRlciBjb2RlIGJ5IE1hcnRpbnMgVXBpdGlzOlxyXG4gKiAgaHR0cDovL2JsZW5kZXJhcnRpc3RzLm9yZy9mb3J1bS9zaG93dGhyZWFkLnBocD8yMzc0ODgtR0xTTC1kZXB0aC1vZi1maWVsZC13aXRoLWJva2VoLXYyLTQtKHVwZGF0ZSlcclxuICovXG5cbnZhciBSZWFsaXN0aWNCb2tlaE1hdGVyaWFsID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfU2hhZGVyTWF0ZXJpYWwpIHtcbiAgLyoqXHJcbiAgICogQ29uc3RydWN0cyBhIG5ldyBib2tlaDIgbWF0ZXJpYWwuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge1BlcnNwZWN0aXZlQ2FtZXJhfSBbY2FtZXJhXSAtIFRoZSBtYWluIGNhbWVyYS5cclxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gQWRkaXRpb25hbCBvcHRpb25zLlxyXG4gICAqIEBwYXJhbSB7VmVjdG9yMn0gW29wdGlvbnMudGV4ZWxTaXplXSAtIFRoZSBhYnNvbHV0ZSBzY3JlZW4gdGV4ZWwgc2l6ZS5cclxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnJpbmdzPTNdIC0gVGhlIG51bWJlciBvZiBibHVycmluZyBpdGVyYXRpb25zLlxyXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuc2FtcGxlcz0yXSAtIFRoZSBhbW91bnQgb2Ygc2FtcGxlcyB0YWtlbiBwZXIgcmluZy5cclxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnNob3dGb2N1cz1mYWxzZV0gLSBXaGV0aGVyIHRoZSBmb2N1cyBwb2ludCBzaG91bGQgYmUgaGlnaGxpZ2h0ZWQuXHJcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5tYW51YWxEb0Y9ZmFsc2VdIC0gRW5hYmxlcyBtYW51YWwgZGVwdGggb2YgZmllbGQgYmx1ci5cclxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLnZpZ25ldHRlPWZhbHNlXSAtIEVuYWJsZXMgYSB2aWduZXR0ZSBlZmZlY3QuXHJcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5wZW50YWdvbj1mYWxzZV0gLSBFbmFibGUgdG8gdXNlIGEgcGVudGFnb25hbCBzaGFwZSB0byBzY2FsZSBnYXRoZXJlZCB0ZXhlbHMuXHJcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5zaGFkZXJGb2N1cz10cnVlXSAtIERpc2FibGUgaWYgeW91IGNvbXB1dGUgeW91ciBvd24gZm9jYWxEZXB0aCAoaW4gbWV0cmVzISkuXHJcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5ub2lzZT10cnVlXSAtIERpc2FibGUgaWYgeW91IGRvbid0IHdhbnQgbm9pc2UgcGF0dGVybnMgZm9yIGRpdGhlcmluZy5cclxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMubWF4Qmx1cj0xLjBdIC0gVGhlIG1heGltdW0gYmx1ciBzdHJlbmd0aC5cclxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMubHVtaW5hbmNlVGhyZXNob2xkPTAuNV0gLSBBIGx1bWluYW5jZSB0aHJlc2hvbGQuXHJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmx1bWluYW5jZUdhaW49Mi4wXSAtIEEgbHVtaW5hbmNlIGdhaW4gZmFjdG9yLlxyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5iaWFzPTAuNV0gLSBBIGJsdXIgYmlhcy5cclxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuZnJpbmdlPTAuN10gLSBBIGJsdXIgb2Zmc2V0LlxyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5kaXRoZXJTdHJlbmd0aD0wLjAwMDFdIC0gVGhlIGRpdGhlciBzdHJlbmd0aC5cclxuICAgKi9cbiAgZnVuY3Rpb24gUmVhbGlzdGljQm9rZWhNYXRlcmlhbCgpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICB2YXIgY2FtZXJhID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBudWxsO1xuICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIFJlYWxpc3RpY0Jva2VoTWF0ZXJpYWwpO1xuXG4gICAgdmFyIHNldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICB0ZXhlbFNpemU6IG51bGwsXG4gICAgICByaW5nczogMyxcbiAgICAgIHNhbXBsZXM6IDIsXG4gICAgICBzaG93Rm9jdXM6IGZhbHNlLFxuICAgICAgbWFudWFsRG9GOiBmYWxzZSxcbiAgICAgIHZpZ25ldHRlOiBmYWxzZSxcbiAgICAgIHBlbnRhZ29uOiBmYWxzZSxcbiAgICAgIHNoYWRlckZvY3VzOiB0cnVlLFxuICAgICAgbm9pc2U6IHRydWUsXG4gICAgICBtYXhCbHVyOiAxLjAsXG4gICAgICBsdW1pbmFuY2VUaHJlc2hvbGQ6IDAuNSxcbiAgICAgIGx1bWluYW5jZUdhaW46IDIuMCxcbiAgICAgIGJpYXM6IDAuNSxcbiAgICAgIGZyaW5nZTogMC43LFxuICAgICAgZGl0aGVyU3RyZW5ndGg6IDAuMDAwMVxuICAgIH0sIG9wdGlvbnMpO1xuICAgIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBnZXRQcm90b3R5cGVPZiQyKFJlYWxpc3RpY0Jva2VoTWF0ZXJpYWwpLmNhbGwodGhpcywge1xuICAgICAgdHlwZTogXCJSZWFsaXN0aWNCb2tlaE1hdGVyaWFsXCIsXG4gICAgICBkZWZpbmVzOiB7XG4gICAgICAgIFJJTkdTX0lOVDogc2V0dGluZ3MucmluZ3MudG9GaXhlZCgwKSxcbiAgICAgICAgUklOR1NfRkxPQVQ6IHNldHRpbmdzLnJpbmdzLnRvRml4ZWQoMSksXG4gICAgICAgIFNBTVBMRVNfSU5UOiBzZXR0aW5ncy5zYW1wbGVzLnRvRml4ZWQoMCksXG4gICAgICAgIFNBTVBMRVNfRkxPQVQ6IHNldHRpbmdzLnNhbXBsZXMudG9GaXhlZCgxKVxuICAgICAgfSxcbiAgICAgIHVuaWZvcm1zOiB7XG4gICAgICAgIHREaWZmdXNlOiBuZXcgVW5pZm9ybShudWxsKSxcbiAgICAgICAgdERlcHRoOiBuZXcgVW5pZm9ybShudWxsKSxcbiAgICAgICAgdGV4ZWxTaXplOiBuZXcgVW5pZm9ybShuZXcgVmVjdG9yMigpKSxcbiAgICAgICAgaGFsZlRleGVsU2l6ZTogbmV3IFVuaWZvcm0obmV3IFZlY3RvcjIoKSksXG4gICAgICAgIGNhbWVyYU5lYXI6IG5ldyBVbmlmb3JtKDAuMSksXG4gICAgICAgIGNhbWVyYUZhcjogbmV3IFVuaWZvcm0oMjAwMCksXG4gICAgICAgIGZvY2FsTGVuZ3RoOiBuZXcgVW5pZm9ybSgyNC4wKSxcbiAgICAgICAgZm9jYWxTdG9wOiBuZXcgVW5pZm9ybSgwLjkpLFxuICAgICAgICBtYXhCbHVyOiBuZXcgVW5pZm9ybShzZXR0aW5ncy5tYXhCbHVyKSxcbiAgICAgICAgbHVtaW5hbmNlVGhyZXNob2xkOiBuZXcgVW5pZm9ybShzZXR0aW5ncy5sdW1pbmFuY2VUaHJlc2hvbGQpLFxuICAgICAgICBsdW1pbmFuY2VHYWluOiBuZXcgVW5pZm9ybShzZXR0aW5ncy5sdW1pbmFuY2VHYWluKSxcbiAgICAgICAgYmlhczogbmV3IFVuaWZvcm0oc2V0dGluZ3MuYmlhcyksXG4gICAgICAgIGZyaW5nZTogbmV3IFVuaWZvcm0oc2V0dGluZ3MuZnJpbmdlKSxcbiAgICAgICAgZGl0aGVyU3RyZW5ndGg6IG5ldyBVbmlmb3JtKHNldHRpbmdzLmRpdGhlclN0cmVuZ3RoKSxcbiAgICAgICAgZm9jdXNDb29yZHM6IG5ldyBVbmlmb3JtKG5ldyBWZWN0b3IyKDAuNSwgMC41KSksXG4gICAgICAgIGZvY2FsRGVwdGg6IG5ldyBVbmlmb3JtKDEuMClcbiAgICAgIH0sXG4gICAgICBmcmFnbWVudFNoYWRlcjogZnJhZ21lbnQkMTUsXG4gICAgICB2ZXJ0ZXhTaGFkZXI6IHZlcnRleCQxNSxcbiAgICAgIGRlcHRoV3JpdGU6IGZhbHNlLFxuICAgICAgZGVwdGhUZXN0OiBmYWxzZVxuICAgIH0pKTtcblxuICAgIF90aGlzLnNldFNob3dGb2N1c0VuYWJsZWQoc2V0dGluZ3Muc2hvd0ZvY3VzKTtcblxuICAgIF90aGlzLnNldE1hbnVhbERlcHRoT2ZGaWVsZEVuYWJsZWQoc2V0dGluZ3MubWFudWFsRG9GKTtcblxuICAgIF90aGlzLnNldFZpZ25ldHRlRW5hYmxlZChzZXR0aW5ncy52aWduZXR0ZSk7XG5cbiAgICBfdGhpcy5zZXRQZW50YWdvbkVuYWJsZWQoc2V0dGluZ3MucGVudGFnb24pO1xuXG4gICAgX3RoaXMuc2V0U2hhZGVyRm9jdXNFbmFibGVkKHNldHRpbmdzLnNoYWRlckZvY3VzKTtcblxuICAgIF90aGlzLnNldE5vaXNlRW5hYmxlZChzZXR0aW5ncy5ub2lzZSk7XG5cbiAgICBpZiAoc2V0dGluZ3MudGV4ZWxTaXplICE9PSBudWxsKSB7XG4gICAgICBfdGhpcy5zZXRUZXhlbFNpemUoc2V0dGluZ3MudGV4ZWxTaXplLngsIHNldHRpbmdzLnRleGVsU2l6ZS55KTtcbiAgICB9XG5cbiAgICBfdGhpcy5hZG9wdENhbWVyYVNldHRpbmdzKGNhbWVyYSk7XG5cbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgLyoqXHJcbiAgICogRGVmaW5lcyB3aGV0aGVyIHRoZSBmb2N1cyBzaG91bGQgYmUgc2hvd24uXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IGVuYWJsZWQgLSBUcnVlIGlmIHRoZSBmb2N1cyBzaG91bGQgYmUgc2hvd24sIGZhbHNlIG90aGVyd2lzZS5cclxuICAgKi9cblxuXG4gIGNyZWF0ZUNsYXNzKFJlYWxpc3RpY0Jva2VoTWF0ZXJpYWwsIFt7XG4gICAga2V5OiBcInNldFNob3dGb2N1c0VuYWJsZWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0U2hvd0ZvY3VzRW5hYmxlZChlbmFibGVkKSB7XG4gICAgICBpZiAoZW5hYmxlZCkge1xuICAgICAgICB0aGlzLmRlZmluZXMuU0hPV19GT0NVUyA9IFwiMVwiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuZGVmaW5lcy5TSE9XX0ZPQ1VTO1xuICAgICAgfVxuXG4gICAgICB0aGlzLm5lZWRzVXBkYXRlID0gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBEZWZpbmVzIHdoZXRoZXIgbWFudWFsIERlcHRoIG9mIEZpZWxkIHNob3VsZCBiZSBlbmFibGVkLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gZW5hYmxlZCAtIFdoZXRoZXIgbWFudWFsIERvRiBzaG91bGQgYmUgZW5hYmxlZC5cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwic2V0TWFudWFsRGVwdGhPZkZpZWxkRW5hYmxlZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRNYW51YWxEZXB0aE9mRmllbGRFbmFibGVkKGVuYWJsZWQpIHtcbiAgICAgIGlmIChlbmFibGVkKSB7XG4gICAgICAgIHRoaXMuZGVmaW5lcy5NQU5VQUxfRE9GID0gXCIxXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUgdGhpcy5kZWZpbmVzLk1BTlVBTF9ET0Y7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIERlZmluZXMgd2hldGhlciB0aGUgVmlnbmV0dGUgZWZmZWN0IHNob3VsZCBiZSBlbmFibGVkLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gZW5hYmxlZCAtIFdoZXRoZXIgdGhlIFZpZ25ldHRlIGVmZmVjdCBzaG91bGQgYmUgZW5hYmxlZC5cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwic2V0VmlnbmV0dGVFbmFibGVkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldFZpZ25ldHRlRW5hYmxlZChlbmFibGVkKSB7XG4gICAgICBpZiAoZW5hYmxlZCkge1xuICAgICAgICB0aGlzLmRlZmluZXMuVklHTkVUVEUgPSBcIjFcIjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLmRlZmluZXMuVklHTkVUVEU7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIERlZmluZXMgd2hldGhlciB0aGUgcGVudGFnb25hbCBibHVyIGVmZmVjdCBzaG91bGQgYmUgZW5hYmxlZC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGVuYWJsZWQgLSBXaGV0aGVyIHRoZSBwZW50YWdvbmFsIGJsdXIgZWZmZWN0IHNob3VsZCBiZSBlbmFibGVkLlxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJzZXRQZW50YWdvbkVuYWJsZWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0UGVudGFnb25FbmFibGVkKGVuYWJsZWQpIHtcbiAgICAgIGlmIChlbmFibGVkKSB7XG4gICAgICAgIHRoaXMuZGVmaW5lcy5QRU5UQUdPTiA9IFwiMVwiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuZGVmaW5lcy5QRU5UQUdPTjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgYXV0b21hdGljIHNoYWRlciBmb2N1cy5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGVuYWJsZWQgLSBXaGV0aGVyIHRoZSBzaGFkZXIgZm9jdXMgc2hvdWxkIGJlIGVuYWJsZWQuXHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInNldFNoYWRlckZvY3VzRW5hYmxlZFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRTaGFkZXJGb2N1c0VuYWJsZWQoZW5hYmxlZCkge1xuICAgICAgaWYgKGVuYWJsZWQpIHtcbiAgICAgICAgdGhpcy5kZWZpbmVzLlNIQURFUl9GT0NVUyA9IFwiMVwiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuZGVmaW5lcy5TSEFERVJfRk9DVVM7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIERlZmluZXMgd2hldGhlciB0aGUgZGl0aGVyaW5nIHNob3VsZCBjb21wdXRlIG5vaXNlLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gZW5hYmxlZCAtIFdoZXRoZXIgbm9pc2UtYmFzZWQgZGl0aGVyaW5nIHNob3VsZCBiZSBlbmFibGVkLlxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJzZXROb2lzZUVuYWJsZWRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0Tm9pc2VFbmFibGVkKGVuYWJsZWQpIHtcbiAgICAgIGlmIChlbmFibGVkKSB7XG4gICAgICAgIHRoaXMuZGVmaW5lcy5OT0lTRSA9IFwiMVwiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuZGVmaW5lcy5OT0lTRTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgdGV4ZWwgc2l6ZS5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcn0geCAtIFRoZSB0ZXhlbCB3aWR0aC5cclxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSB5IC0gVGhlIHRleGVsIGhlaWdodC5cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwic2V0VGV4ZWxTaXplXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldFRleGVsU2l6ZSh4LCB5KSB7XG4gICAgICB0aGlzLnVuaWZvcm1zLnRleGVsU2l6ZS52YWx1ZS5zZXQoeCwgeSk7XG4gICAgICB0aGlzLnVuaWZvcm1zLmhhbGZUZXhlbFNpemUudmFsdWUuc2V0KHgsIHkpLm11bHRpcGx5U2NhbGFyKDAuNSk7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogQWRvcHRzIHRoZSBuZWFyIGFuZCBmYXIgcGxhbmUgYW5kIHRoZSBmb2NhbCBsZW5ndGggb2YgdGhlIGdpdmVuIGNhbWVyYS5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1BlcnNwZWN0aXZlQ2FtZXJhfSBjYW1lcmEgLSBUaGUgbWFpbiBjYW1lcmEuXHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImFkb3B0Q2FtZXJhU2V0dGluZ3NcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWRvcHRDYW1lcmFTZXR0aW5ncyhjYW1lcmEpIHtcbiAgICAgIGlmIChjYW1lcmEgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy51bmlmb3Jtcy5jYW1lcmFOZWFyLnZhbHVlID0gY2FtZXJhLm5lYXI7XG4gICAgICAgIHRoaXMudW5pZm9ybXMuY2FtZXJhRmFyLnZhbHVlID0gY2FtZXJhLmZhcjtcbiAgICAgICAgdGhpcy51bmlmb3Jtcy5mb2NhbExlbmd0aC52YWx1ZSA9IGNhbWVyYS5nZXRGb2NhbExlbmd0aCgpOyAvLyB1bml0OiBtbS5cbiAgICAgIH1cbiAgICB9XG4gIH1dKTtcblxuICBpbmhlcml0cyhSZWFsaXN0aWNCb2tlaE1hdGVyaWFsLCBfU2hhZGVyTWF0ZXJpYWwpO1xuXG4gIHJldHVybiBSZWFsaXN0aWNCb2tlaE1hdGVyaWFsO1xufShTaGFkZXJNYXRlcmlhbCk7XG5cbnZhciBmcmFnbWVudCQxNiA9IFwiI2luY2x1ZGUgPGNvbW1vbj5cXHJcXG5cXHJcXG51bmlmb3JtIHNhbXBsZXIyRCB0RGlmZnVzZTtcXHJcXG51bmlmb3JtIHZlYzIgY2VudGVyO1xcclxcbnVuaWZvcm0gZmxvYXQgYXNwZWN0O1xcclxcbnVuaWZvcm0gZmxvYXQgd2F2ZVNpemU7XFxyXFxudW5pZm9ybSBmbG9hdCByYWRpdXM7XFxyXFxudW5pZm9ybSBmbG9hdCBtYXhSYWRpdXM7XFxyXFxudW5pZm9ybSBmbG9hdCBhbXBsaXR1ZGU7XFxyXFxuXFxyXFxudmFyeWluZyB2ZWMyIHZVdjtcXHJcXG52YXJ5aW5nIGZsb2F0IHZTaXplO1xcclxcblxcclxcbnZvaWQgbWFpbigpIHtcXHJcXG5cXHJcXG5cXHR2ZWMyIGFzcGVjdENvcnJlY3Rpb24gPSB2ZWMyKGFzcGVjdCwgMS4wKTtcXHJcXG5cXHJcXG5cXHR2ZWMyIGRpZmZlcmVuY2UgPSB2VXYgKiBhc3BlY3RDb3JyZWN0aW9uIC0gY2VudGVyICogYXNwZWN0Q29ycmVjdGlvbjtcXHJcXG5cXHRmbG9hdCBkaXN0YW5jZSA9IHNxcnQoZG90KGRpZmZlcmVuY2UsIGRpZmZlcmVuY2UpKSAqIHZTaXplO1xcclxcblxcclxcblxcdHZlYzIgZGlzcGxhY2VtZW50ID0gdmVjMigwLjApO1xcclxcblxcclxcblxcdGlmKGRpc3RhbmNlID4gcmFkaXVzKSB7XFxyXFxuXFxyXFxuXFx0XFx0aWYoZGlzdGFuY2UgPCByYWRpdXMgKyB3YXZlU2l6ZSkge1xcclxcblxcclxcblxcdFxcdFxcdGZsb2F0IGFuZ2xlID0gKGRpc3RhbmNlIC0gcmFkaXVzKSAqIFBJMiAvIHdhdmVTaXplO1xcclxcblxcdFxcdFxcdGZsb2F0IGNvc1NpbiA9ICgxLjAgLSBjb3MoYW5nbGUpKSAqIDAuNTtcXHJcXG5cXHJcXG5cXHRcXHRcXHRmbG9hdCBleHRlbnQgPSBtYXhSYWRpdXMgKyB3YXZlU2l6ZTtcXHJcXG5cXHRcXHRcXHRmbG9hdCBkZWNheSA9IG1heChleHRlbnQgLSBkaXN0YW5jZSAqIGRpc3RhbmNlLCAwLjApIC8gZXh0ZW50O1xcclxcblxcclxcblxcdFxcdFxcdGRpc3BsYWNlbWVudCA9ICgoY29zU2luICogYW1wbGl0dWRlICogZGlmZmVyZW5jZSkgLyBkaXN0YW5jZSkgKiBkZWNheTtcXHJcXG5cXHJcXG5cXHRcXHR9XFxyXFxuXFxyXFxuXFx0fVxcclxcblxcclxcblxcdGdsX0ZyYWdDb2xvciA9IHRleHR1cmUyRCh0RGlmZnVzZSwgdlV2IC0gZGlzcGxhY2VtZW50KTtcXHJcXG5cXHJcXG59XFxyXFxuXCI7XG52YXIgdmVydGV4JDE2ID0gXCJ1bmlmb3JtIGZsb2F0IHNpemU7XFxyXFxudW5pZm9ybSBmbG9hdCBzY2FsZTtcXHJcXG51bmlmb3JtIGZsb2F0IGNhbWVyYURpc3RhbmNlO1xcclxcblxcclxcbnZhcnlpbmcgdmVjMiB2VXY7XFxyXFxudmFyeWluZyBmbG9hdCB2U2l6ZTtcXHJcXG5cXHJcXG52b2lkIG1haW4oKSB7XFxyXFxuXFxyXFxuXFx0dlV2ID0gdXY7XFxyXFxuXFx0dlNpemUgPSAoMC4xICogY2FtZXJhRGlzdGFuY2UpIC8gc2l6ZTtcXHJcXG5cXHRnbF9Qb3NpdGlvbiA9IHByb2plY3Rpb25NYXRyaXggKiBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KHBvc2l0aW9uLCAxLjApO1xcclxcblxcclxcbn1cXHJcXG5cIjtcbi8qKlxyXG4gKiBBIHNob2NrIHdhdmUgc2hhZGVyIG1hdGVyaWFsLlxyXG4gKlxyXG4gKiBCYXNlZCBvbiBhIEdpc3QgYnkgSmVhbi1QaGlsaXBwZSBTYXJkYTpcclxuICogIGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL2pwc2FyZGEvMzNjZWE2N2E5ZjJlY2IwYTBlZGFcclxuICovXG5cbnZhciBTaG9ja1dhdmVNYXRlcmlhbCA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX1NoYWRlck1hdGVyaWFsKSB7XG4gIC8qKlxyXG4gICAqIENvbnN0cnVjdHMgYSBuZXcgc2hvY2sgd2F2ZSBtYXRlcmlhbC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gLSBUaGUgb3B0aW9ucy5cclxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMud2F2ZVNpemU9MC4yXSAtIFRoZSB3YXZlIHNpemUuXHJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmFtcGxpdHVkZT0wLjA1XSAtIFRoZSBkaXN0b3J0aW9uIGFtcGxpdHVkZS5cclxuICAgKi9cbiAgZnVuY3Rpb24gU2hvY2tXYXZlTWF0ZXJpYWwoKSB7XG4gICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgU2hvY2tXYXZlTWF0ZXJpYWwpO1xuXG4gICAgdmFyIHNldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICBtYXhSYWRpdXM6IDEuMCxcbiAgICAgIHdhdmVTaXplOiAwLjIsXG4gICAgICBhbXBsaXR1ZGU6IDAuMDVcbiAgICB9LCBvcHRpb25zKTtcbiAgICByZXR1cm4gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBnZXRQcm90b3R5cGVPZiQyKFNob2NrV2F2ZU1hdGVyaWFsKS5jYWxsKHRoaXMsIHtcbiAgICAgIHR5cGU6IFwiU2hvY2tXYXZlTWF0ZXJpYWxcIixcbiAgICAgIHVuaWZvcm1zOiB7XG4gICAgICAgIHREaWZmdXNlOiBuZXcgVW5pZm9ybShudWxsKSxcbiAgICAgICAgY2VudGVyOiBuZXcgVW5pZm9ybShuZXcgVmVjdG9yMigwLjUsIDAuNSkpLFxuICAgICAgICBhc3BlY3Q6IG5ldyBVbmlmb3JtKDEuMCksXG4gICAgICAgIGNhbWVyYURpc3RhbmNlOiBuZXcgVW5pZm9ybSgxLjApLFxuICAgICAgICBzaXplOiBuZXcgVW5pZm9ybSgxLjApLFxuICAgICAgICByYWRpdXM6IG5ldyBVbmlmb3JtKC1zZXR0aW5ncy53YXZlU2l6ZSksXG4gICAgICAgIG1heFJhZGl1czogbmV3IFVuaWZvcm0oc2V0dGluZ3MubWF4UmFkaXVzKSxcbiAgICAgICAgd2F2ZVNpemU6IG5ldyBVbmlmb3JtKHNldHRpbmdzLndhdmVTaXplKSxcbiAgICAgICAgYW1wbGl0dWRlOiBuZXcgVW5pZm9ybShzZXR0aW5ncy5hbXBsaXR1ZGUpXG4gICAgICB9LFxuICAgICAgZnJhZ21lbnRTaGFkZXI6IGZyYWdtZW50JDE2LFxuICAgICAgdmVydGV4U2hhZGVyOiB2ZXJ0ZXgkMTYsXG4gICAgICBkZXB0aFdyaXRlOiBmYWxzZSxcbiAgICAgIGRlcHRoVGVzdDogZmFsc2VcbiAgICB9KSk7XG4gIH1cblxuICBpbmhlcml0cyhTaG9ja1dhdmVNYXRlcmlhbCwgX1NoYWRlck1hdGVyaWFsKTtcblxuICByZXR1cm4gU2hvY2tXYXZlTWF0ZXJpYWw7XG59KFNoYWRlck1hdGVyaWFsKTtcblxudmFyIGZyYWdtZW50JDE3ID0gXCJ1bmlmb3JtIHNhbXBsZXIyRCB0RGlmZnVzZTtcXHJcXG51bmlmb3JtIHNhbXBsZXIyRCB0V2VpZ2h0cztcXHJcXG5cXHJcXG51bmlmb3JtIHZlYzIgdGV4ZWxTaXplO1xcclxcblxcclxcbnZhcnlpbmcgdmVjMiB2VXY7XFxyXFxudmFyeWluZyB2ZWM0IHZPZmZzZXQ7XFxyXFxuXFxyXFxudm9pZCBtYWluKCkge1xcclxcblxcclxcblxcdC8vIEZldGNoIHRoZSBibGVuZGluZyB3ZWlnaHRzIGZvciBjdXJyZW50IHBpeGVsLlxcclxcblxcdHZlYzQgYTtcXHJcXG5cXHRhLnh6ID0gdGV4dHVyZTJEKHRXZWlnaHRzLCB2VXYpLnh6O1xcclxcblxcdGEueSA9IHRleHR1cmUyRCh0V2VpZ2h0cywgdk9mZnNldC56dykuZztcXHJcXG5cXHRhLncgPSB0ZXh0dXJlMkQodFdlaWdodHMsIHZPZmZzZXQueHkpLmE7XFxyXFxuXFxyXFxuXFx0dmVjNCBjb2xvcjtcXHJcXG5cXHJcXG5cXHQvLyBDaGVjayBpZiB0aGVyZSBpcyBhbnkgYmxlbmRpbmcgd2VpZ2h0IHdpdGggYSB2YWx1ZSBncmVhdGVyIHRoYW4gMC4wLlxcclxcblxcdGlmKGRvdChhLCB2ZWM0KDEuMCkpIDwgMWUtNSkge1xcclxcblxcclxcblxcdFxcdGNvbG9yID0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYsIDAuMCk7XFxyXFxuXFxyXFxuXFx0fSBlbHNlIHtcXHJcXG5cXHJcXG5cXHRcXHQvKiBVcCB0byBmb3VyIGxpbmVzIGNhbiBiZSBjcm9zc2luZyBhIHBpeGVsIChvbmUgdGhyb3VnaCBlYWNoIGVkZ2UpLlxcclxcblxcdFxcdCAqIFRoZSBsaW5lIHdpdGggdGhlIG1heGltdW0gd2VpZ2h0IGZvciBlYWNoIGRpcmVjdGlvbiBpcyBmYXZvdXJlZC5cXHJcXG5cXHRcXHQgKi9cXHJcXG5cXHJcXG5cXHRcXHR2ZWMyIG9mZnNldDtcXHJcXG5cXHRcXHRvZmZzZXQueCA9IGEuYSA+IGEuYiA/IGEuYSA6IC1hLmI7IC8vIExlZnQgdnMuIHJpZ2h0LlxcclxcblxcdFxcdG9mZnNldC55ID0gYS5nID4gYS5yID8gLWEuZyA6IGEucjsgLy8gVG9wIHZzLiBib3R0b20gKGNoYW5nZWQgc2lnbnMpLlxcclxcblxcclxcblxcdFxcdC8vIEdvIGluIHRoZSBkaXJlY3Rpb24gd2l0aCB0aGUgbWF4aW11bSB3ZWlnaHQgKGhvcml6b250YWwgdnMuIHZlcnRpY2FsKS5cXHJcXG5cXHRcXHRpZihhYnMob2Zmc2V0LngpID4gYWJzKG9mZnNldC55KSkge1xcclxcblxcclxcblxcdFxcdFxcdG9mZnNldC55ID0gMC4wO1xcclxcblxcclxcblxcdFxcdH0gZWxzZSB7XFxyXFxuXFxyXFxuXFx0XFx0XFx0b2Zmc2V0LnggPSAwLjA7XFxyXFxuXFxyXFxuXFx0XFx0fVxcclxcblxcclxcblxcdFxcdC8vIEZldGNoIHRoZSBvcHBvc2l0ZSBjb2xvciBhbmQgbGVycCBieSBoYW5kLlxcclxcblxcdFxcdGNvbG9yID0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYsIDAuMCk7XFxyXFxuXFx0XFx0dmVjMiBjb29yZCA9IHZVdiArIHNpZ24ob2Zmc2V0KSAqIHRleGVsU2l6ZTtcXHJcXG5cXHRcXHR2ZWM0IG9wcG9zaXRlQ29sb3IgPSB0ZXh0dXJlMkQodERpZmZ1c2UsIGNvb3JkLCAwLjApO1xcclxcblxcdFxcdGZsb2F0IHMgPSBhYnMob2Zmc2V0LngpID4gYWJzKG9mZnNldC55KSA/IGFicyhvZmZzZXQueCkgOiBhYnMob2Zmc2V0LnkpO1xcclxcblxcclxcblxcdFxcdC8vIEdhbW1hIGNvcnJlY3Rpb24uXFxyXFxuXFx0XFx0Y29sb3IucmdiID0gcG93KGFicyhjb2xvci5yZ2IpLCB2ZWMzKDIuMikpO1xcclxcblxcdFxcdG9wcG9zaXRlQ29sb3IucmdiID0gcG93KGFicyhvcHBvc2l0ZUNvbG9yLnJnYiksIHZlYzMoMi4yKSk7XFxyXFxuXFx0XFx0Y29sb3IgPSBtaXgoY29sb3IsIG9wcG9zaXRlQ29sb3IsIHMpO1xcclxcblxcdFxcdGNvbG9yLnJnYiA9IHBvdyhhYnMoY29sb3IucmdiKSwgdmVjMygxLjAgLyAyLjIpKTtcXHJcXG5cXHJcXG5cXHR9XFxyXFxuXFxyXFxuXFx0Z2xfRnJhZ0NvbG9yID0gY29sb3I7XFxyXFxuXFxyXFxufVxcclxcblwiO1xudmFyIHZlcnRleCQxNyA9IFwidW5pZm9ybSB2ZWMyIHRleGVsU2l6ZTtcXHJcXG5cXHJcXG52YXJ5aW5nIHZlYzIgdlV2O1xcclxcbnZhcnlpbmcgdmVjNCB2T2Zmc2V0O1xcclxcblxcclxcbnZvaWQgbWFpbigpIHtcXHJcXG5cXHJcXG5cXHR2VXYgPSB1djtcXHJcXG5cXHJcXG5cXHR2T2Zmc2V0ID0gdXYueHl4eSArIHRleGVsU2l6ZS54eXh5ICogdmVjNCgxLjAsIDAuMCwgMC4wLCAtMS4wKTsgLy8gQ2hhbmdlZCBzaWduIGluIFcgY29tcG9uZW50LlxcclxcblxcclxcblxcdGdsX1Bvc2l0aW9uID0gcHJvamVjdGlvbk1hdHJpeCAqIG1vZGVsVmlld01hdHJpeCAqIHZlYzQocG9zaXRpb24sIDEuMCk7XFxyXFxuXFxyXFxufVxcclxcblwiO1xuLyoqXHJcbiAqIFN1YnBpeGVsIE1vcnBob2xvZ2ljYWwgQW50aWFsaWFzaW5nLlxyXG4gKlxyXG4gKiBUaGlzIG1hdGVyaWFsIGlzIHVzZWQgdG8gcmVuZGVyIHRoZSBmaW5hbCBhbnRpYWxpYXNpbmcuXHJcbiAqL1xuXG52YXIgU01BQUJsZW5kTWF0ZXJpYWwgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9TaGFkZXJNYXRlcmlhbCkge1xuICAvKipcclxuICAgKiBDb25zdHJ1Y3RzIGEgbmV3IFNNQUEgYmxlbmQgbWF0ZXJpYWwuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge1ZlY3RvcjJ9IFt0ZXhlbFNpemVdIC0gVGhlIGFic29sdXRlIHNjcmVlbiB0ZXhlbCBzaXplLlxyXG4gICAqL1xuICBmdW5jdGlvbiBTTUFBQmxlbmRNYXRlcmlhbCgpIHtcbiAgICB2YXIgdGV4ZWxTaXplID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBuZXcgVmVjdG9yMigpO1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgU01BQUJsZW5kTWF0ZXJpYWwpO1xuXG4gICAgcmV0dXJuIHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgZ2V0UHJvdG90eXBlT2YkMihTTUFBQmxlbmRNYXRlcmlhbCkuY2FsbCh0aGlzLCB7XG4gICAgICB0eXBlOiBcIlNNQUFCbGVuZE1hdGVyaWFsXCIsXG4gICAgICB1bmlmb3Jtczoge1xuICAgICAgICB0RGlmZnVzZTogbmV3IFVuaWZvcm0obnVsbCksXG4gICAgICAgIHRXZWlnaHRzOiBuZXcgVW5pZm9ybShudWxsKSxcbiAgICAgICAgdGV4ZWxTaXplOiBuZXcgVW5pZm9ybSh0ZXhlbFNpemUpXG4gICAgICB9LFxuICAgICAgZnJhZ21lbnRTaGFkZXI6IGZyYWdtZW50JDE3LFxuICAgICAgdmVydGV4U2hhZGVyOiB2ZXJ0ZXgkMTcsXG4gICAgICBkZXB0aFdyaXRlOiBmYWxzZSxcbiAgICAgIGRlcHRoVGVzdDogZmFsc2VcbiAgICB9KSk7XG4gIH1cblxuICBpbmhlcml0cyhTTUFBQmxlbmRNYXRlcmlhbCwgX1NoYWRlck1hdGVyaWFsKTtcblxuICByZXR1cm4gU01BQUJsZW5kTWF0ZXJpYWw7XG59KFNoYWRlck1hdGVyaWFsKTtcblxudmFyIGZyYWdtZW50JDE4ID0gXCIjZGVmaW5lIHNhbXBsZUxldmVsWmVyb09mZnNldCh0LCBjb29yZCwgb2Zmc2V0KSB0ZXh0dXJlMkQodCwgY29vcmQgKyBmbG9hdChvZmZzZXQpICogdGV4ZWxTaXplLCAwLjApXFxyXFxuXFxyXFxudW5pZm9ybSBzYW1wbGVyMkQgdERpZmZ1c2U7XFxyXFxudW5pZm9ybSBzYW1wbGVyMkQgdEFyZWE7XFxyXFxudW5pZm9ybSBzYW1wbGVyMkQgdFNlYXJjaDtcXHJcXG5cXHJcXG51bmlmb3JtIHZlYzIgdGV4ZWxTaXplO1xcclxcblxcclxcbnZhcnlpbmcgdmVjMiB2VXY7XFxyXFxudmFyeWluZyB2ZWM0IHZPZmZzZXRbM107XFxyXFxudmFyeWluZyB2ZWMyIHZQaXhDb29yZDtcXHJcXG5cXHJcXG52ZWMyIHJvdW5kKHZlYzIgeCkge1xcclxcblxcclxcblxcdHJldHVybiBzaWduKHgpICogZmxvb3IoYWJzKHgpICsgMC41KTtcXHJcXG5cXHJcXG59XFxyXFxuXFxyXFxuZmxvYXQgc2VhcmNoTGVuZ3RoKHZlYzIgZSwgZmxvYXQgYmlhcywgZmxvYXQgc2NhbGUpIHtcXHJcXG5cXHJcXG5cXHQvLyBOb3QgcmVxdWlyZWQgaWYgdFNlYXJjaCBhY2Nlc3NlcyBhcmUgc2V0IHRvIHBvaW50LlxcclxcblxcdC8vIGNvbnN0IHZlYzIgU0VBUkNIX1RFWF9QSVhFTF9TSVpFID0gMS4wIC8gdmVjMig2Ni4wLCAzMy4wKTtcXHJcXG5cXHQvLyBlID0gdmVjMihiaWFzLCAwLjApICsgMC41ICogU0VBUkNIX1RFWF9QSVhFTF9TSVpFICsgZSAqIHZlYzIoc2NhbGUsIDEuMCkgKiB2ZWMyKDY0LjAsIDMyLjApICogU0VBUkNIX1RFWF9QSVhFTF9TSVpFO1xcclxcblxcclxcblxcdGUuciA9IGJpYXMgKyBlLnIgKiBzY2FsZTtcXHJcXG5cXHJcXG5cXHRyZXR1cm4gMjU1LjAgKiB0ZXh0dXJlMkQodFNlYXJjaCwgZSwgMC4wKS5yO1xcclxcblxcclxcbn1cXHJcXG5cXHJcXG5mbG9hdCBzZWFyY2hYTGVmdCh2ZWMyIHRleENvb3JkLCBmbG9hdCBlbmQpIHtcXHJcXG5cXHJcXG5cXHQvKiBAUFNFVURPX0dBVEhFUjRcXHJcXG5cXHQgKiBUaGlzIHRleENvb3JkIGhhcyBiZWVuIG9mZnNldCBieSAoLTAuMjUsIC0wLjEyNSkgaW4gdGhlIHZlcnRleCBzaGFkZXIgdG9cXHJcXG5cXHQgKiBzYW1wbGUgYmV0d2VlbiBlZGdlLCB0aHVzIGZldGNoaW5nIGZvdXIgZWRnZXMgaW4gYSByb3cuXFxyXFxuXFx0ICogU2FtcGxpbmcgd2l0aCBkaWZmZXJlbnQgb2Zmc2V0cyBpbiBlYWNoIGRpcmVjdGlvbiBhbGxvd3MgdG8gZGlzYW1iaWd1YXRlXFxyXFxuXFx0ICogd2hpY2ggZWRnZXMgYXJlIGFjdGl2ZSBmcm9tIHRoZSBmb3VyIGZldGNoZWQgb25lcy5cXHJcXG5cXHQgKi9cXHJcXG5cXHJcXG5cXHR2ZWMyIGUgPSB2ZWMyKDAuMCwgMS4wKTtcXHJcXG5cXHJcXG5cXHRmb3IoaW50IGkgPSAwOyBpIDwgTUFYX1NFQVJDSF9TVEVQU19JTlQ7ICsraSkge1xcclxcblxcclxcblxcdFxcdGUgPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHRleENvb3JkLCAwLjApLnJnO1xcclxcblxcdFxcdHRleENvb3JkIC09IHZlYzIoMi4wLCAwLjApICogdGV4ZWxTaXplO1xcclxcblxcclxcblxcdFxcdGlmKCEodGV4Q29vcmQueCA+IGVuZCAmJiBlLmcgPiAwLjgyODEgJiYgZS5yID09IDAuMCkpIHsgYnJlYWs7IH1cXHJcXG5cXHJcXG5cXHR9XFxyXFxuXFxyXFxuXFx0Ly8gQ29ycmVjdCB0aGUgcHJldmlvdXNseSBhcHBsaWVkIG9mZnNldCAoLTAuMjUsIC0wLjEyNSkuXFxyXFxuXFx0dGV4Q29vcmQueCArPSAwLjI1ICogdGV4ZWxTaXplLng7XFxyXFxuXFxyXFxuXFx0Ly8gVGhlIHNlYXJjaGVzIGFyZSBiaWFzZWQgYnkgMSwgc28gYWRqdXN0IHRoZSBjb29yZHMgYWNjb3JkaW5nbHkuXFxyXFxuXFx0dGV4Q29vcmQueCArPSB0ZXhlbFNpemUueDtcXHJcXG5cXHJcXG5cXHQvLyBEaXNhbWJpZ3VhdGUgdGhlIGxlbmd0aCBhZGRlZCBieSB0aGUgbGFzdCBzdGVwLlxcclxcblxcdHRleENvb3JkLnggKz0gMi4wICogdGV4ZWxTaXplLng7IC8vIFVuZG8gbGFzdCBzdGVwLlxcclxcblxcdHRleENvb3JkLnggLT0gdGV4ZWxTaXplLnggKiBzZWFyY2hMZW5ndGgoZSwgMC4wLCAwLjUpO1xcclxcblxcclxcblxcdHJldHVybiB0ZXhDb29yZC54O1xcclxcblxcclxcbn1cXHJcXG5cXHJcXG5mbG9hdCBzZWFyY2hYUmlnaHQodmVjMiB0ZXhDb29yZCwgZmxvYXQgZW5kKSB7XFxyXFxuXFxyXFxuXFx0dmVjMiBlID0gdmVjMigwLjAsIDEuMCk7XFxyXFxuXFxyXFxuXFx0Zm9yKGludCBpID0gMDsgaSA8IE1BWF9TRUFSQ0hfU1RFUFNfSU5UOyArK2kpIHtcXHJcXG5cXHJcXG5cXHRcXHRlID0gdGV4dHVyZTJEKHREaWZmdXNlLCB0ZXhDb29yZCwgMC4wKS5yZztcXHJcXG5cXHRcXHR0ZXhDb29yZCArPSB2ZWMyKDIuMCwgMC4wKSAqIHRleGVsU2l6ZTtcXHJcXG5cXHJcXG5cXHRcXHRpZighKHRleENvb3JkLnggPCBlbmQgJiYgZS5nID4gMC44MjgxICYmIGUuciA9PSAwLjApKSB7IGJyZWFrOyB9XFxyXFxuXFxyXFxuXFx0fVxcclxcblxcclxcblxcdHRleENvb3JkLnggLT0gMC4yNSAqIHRleGVsU2l6ZS54O1xcclxcblxcdHRleENvb3JkLnggLT0gdGV4ZWxTaXplLng7XFxyXFxuXFx0dGV4Q29vcmQueCAtPSAyLjAgKiB0ZXhlbFNpemUueDtcXHJcXG5cXHR0ZXhDb29yZC54ICs9IHRleGVsU2l6ZS54ICogc2VhcmNoTGVuZ3RoKGUsIDAuNSwgMC41KTtcXHJcXG5cXHJcXG5cXHRyZXR1cm4gdGV4Q29vcmQueDtcXHJcXG5cXHJcXG59XFxyXFxuXFxyXFxuZmxvYXQgc2VhcmNoWVVwKHZlYzIgdGV4Q29vcmQsIGZsb2F0IGVuZCkge1xcclxcblxcclxcblxcdHZlYzIgZSA9IHZlYzIoMS4wLCAwLjApO1xcclxcblxcclxcblxcdGZvcihpbnQgaSA9IDA7IGkgPCBNQVhfU0VBUkNIX1NURVBTX0lOVDsgKytpKSB7XFxyXFxuXFxyXFxuXFx0XFx0ZSA9IHRleHR1cmUyRCh0RGlmZnVzZSwgdGV4Q29vcmQsIDAuMCkucmc7XFxyXFxuXFx0XFx0dGV4Q29vcmQgKz0gdmVjMigwLjAsIDIuMCkgKiB0ZXhlbFNpemU7IC8vIENoYW5nZWQgc2lnbi5cXHJcXG5cXHJcXG5cXHRcXHRpZighKHRleENvb3JkLnkgPiBlbmQgJiYgZS5yID4gMC44MjgxICYmIGUuZyA9PSAwLjApKSB7IGJyZWFrOyB9XFxyXFxuXFxyXFxuXFx0fVxcclxcblxcclxcblxcdHRleENvb3JkLnkgLT0gMC4yNSAqIHRleGVsU2l6ZS55OyAvLyBDaGFuZ2VkIHNpZ24uXFxyXFxuXFx0dGV4Q29vcmQueSAtPSB0ZXhlbFNpemUueTsgLy8gQ2hhbmdlZCBzaWduLlxcclxcblxcdHRleENvb3JkLnkgLT0gMi4wICogdGV4ZWxTaXplLnk7IC8vIENoYW5nZWQgc2lnbi5cXHJcXG5cXHR0ZXhDb29yZC55ICs9IHRleGVsU2l6ZS55ICogc2VhcmNoTGVuZ3RoKGUuZ3IsIDAuMCwgMC41KTsgLy8gQ2hhbmdlZCBzaWduLlxcclxcblxcclxcblxcdHJldHVybiB0ZXhDb29yZC55O1xcclxcblxcclxcbn1cXHJcXG5cXHJcXG5mbG9hdCBzZWFyY2hZRG93bih2ZWMyIHRleENvb3JkLCBmbG9hdCBlbmQpIHtcXHJcXG5cXHJcXG5cXHR2ZWMyIGUgPSB2ZWMyKDEuMCwgMC4wKTtcXHJcXG5cXHJcXG5cXHRmb3IoaW50IGkgPSAwOyBpIDwgTUFYX1NFQVJDSF9TVEVQU19JTlQ7ICsraSApIHtcXHJcXG5cXHJcXG5cXHRcXHRlID0gdGV4dHVyZTJEKHREaWZmdXNlLCB0ZXhDb29yZCwgMC4wKS5yZztcXHJcXG5cXHRcXHR0ZXhDb29yZCAtPSB2ZWMyKDAuMCwgMi4wKSAqIHRleGVsU2l6ZTsgLy8gQ2hhbmdlZCBzaWduLlxcclxcblxcclxcblxcdFxcdGlmKCEodGV4Q29vcmQueSA8IGVuZCAmJiBlLnIgPiAwLjgyODEgJiYgZS5nID09IDAuMCkpIHsgYnJlYWs7IH1cXHJcXG5cXHJcXG5cXHR9XFxyXFxuXFxyXFxuXFx0dGV4Q29vcmQueSArPSAwLjI1ICogdGV4ZWxTaXplLnk7IC8vIENoYW5nZWQgc2lnbi5cXHJcXG5cXHR0ZXhDb29yZC55ICs9IHRleGVsU2l6ZS55OyAvLyBDaGFuZ2VkIHNpZ24uXFxyXFxuXFx0dGV4Q29vcmQueSArPSAyLjAgKiB0ZXhlbFNpemUueTsgLy8gQ2hhbmdlZCBzaWduLlxcclxcblxcdHRleENvb3JkLnkgLT0gdGV4ZWxTaXplLnkgKiBzZWFyY2hMZW5ndGgoZS5nciwgMC41LCAwLjUpOyAvLyBDaGFuZ2VkIHNpZ24uXFxyXFxuXFxyXFxuXFx0cmV0dXJuIHRleENvb3JkLnk7XFxyXFxuXFxyXFxufVxcclxcblxcclxcbnZlYzIgYXJlYSh2ZWMyIGRpc3QsIGZsb2F0IGUxLCBmbG9hdCBlMiwgZmxvYXQgb2Zmc2V0KSB7XFxyXFxuXFxyXFxuXFx0Ly8gUm91bmRpbmcgcHJldmVudHMgcHJlY2lzaW9uIGVycm9ycyBvZiBiaWxpbmVhciBmaWx0ZXJpbmcuXFxyXFxuXFx0dmVjMiB0ZXhDb29yZCA9IEFSRUFURVhfTUFYX0RJU1RBTkNFICogcm91bmQoNC4wICogdmVjMihlMSwgZTIpKSArIGRpc3Q7XFxyXFxuXFxyXFxuXFx0Ly8gU2NhbGUgYW5kIGJpYXMgZm9yIHRleGVsIHNwYWNlIHRyYW5zbGF0aW9uLlxcclxcblxcdHRleENvb3JkID0gQVJFQVRFWF9QSVhFTF9TSVpFICogdGV4Q29vcmQgKyAoMC41ICogQVJFQVRFWF9QSVhFTF9TSVpFKTtcXHJcXG5cXHJcXG5cXHQvLyBNb3ZlIHRvIHByb3BlciBwbGFjZSwgYWNjb3JkaW5nIHRvIHRoZSBzdWJwaXhlbCBvZmZzZXQuXFxyXFxuXFx0dGV4Q29vcmQueSArPSBBUkVBVEVYX1NVQlRFWF9TSVpFICogb2Zmc2V0O1xcclxcblxcclxcblxcdHJldHVybiB0ZXh0dXJlMkQodEFyZWEsIHRleENvb3JkLCAwLjApLnJnO1xcclxcblxcclxcbn1cXHJcXG5cXHJcXG52b2lkIG1haW4oKSB7XFxyXFxuXFxyXFxuXFx0dmVjNCB3ZWlnaHRzID0gdmVjNCgwLjApO1xcclxcblxcdHZlYzQgc3Vic2FtcGxlSW5kaWNlcyA9IHZlYzQoMC4wKTtcXHJcXG5cXHR2ZWMyIGUgPSB0ZXh0dXJlMkQodERpZmZ1c2UsIHZVdikucmc7XFxyXFxuXFxyXFxuXFx0aWYoZS5nID4gMC4wKSB7XFxyXFxuXFxyXFxuXFx0XFx0Ly8gRWRnZSBhdCBub3J0aC5cXHJcXG5cXHRcXHR2ZWMyIGQ7XFxyXFxuXFxyXFxuXFx0XFx0Ly8gRmluZCB0aGUgZGlzdGFuY2UgdG8gdGhlIGxlZnQuXFxyXFxuXFx0XFx0dmVjMiBjb29yZHM7XFxyXFxuXFx0XFx0Y29vcmRzLnggPSBzZWFyY2hYTGVmdCh2T2Zmc2V0WzBdLnh5LCB2T2Zmc2V0WzJdLngpO1xcclxcblxcdFxcdGNvb3Jkcy55ID0gdk9mZnNldFsxXS55OyAvLyB2T2Zmc2V0WzFdLnkgPSB2VXYueSAtIDAuMjUgKiB0ZXhlbFNpemUueSAoQENST1NTSU5HX09GRlNFVClcXHJcXG5cXHRcXHRkLnggPSBjb29yZHMueDtcXHJcXG5cXHJcXG5cXHRcXHQvKiBOb3cgZmV0Y2ggdGhlIGxlZnQgY3Jvc3NpbmcgZWRnZXMsIHR3byBhdCBhIHRpbWUgdXNpbmcgYmlsaW5lYXJcXHJcXG5cXHRcXHRmaWx0ZXJpbmcuIFNhbXBsaW5nIGF0IC0wLjI1IChzZWUgQENST1NTSU5HX09GRlNFVCkgZW5hYmxlcyB0byBkaXNjZXJuIHdoYXRcXHJcXG5cXHRcXHR2YWx1ZSBlYWNoIGVkZ2UgaGFzLiAqL1xcclxcblxcdFxcdGZsb2F0IGUxID0gdGV4dHVyZTJEKHREaWZmdXNlLCBjb29yZHMsIDAuMCkucjtcXHJcXG5cXHJcXG5cXHRcXHQvLyBGaW5kIHRoZSBkaXN0YW5jZSB0byB0aGUgcmlnaHQuXFxyXFxuXFx0XFx0Y29vcmRzLnggPSBzZWFyY2hYUmlnaHQodk9mZnNldFswXS56dywgdk9mZnNldFsyXS55KTtcXHJcXG5cXHRcXHRkLnkgPSBjb29yZHMueDtcXHJcXG5cXHJcXG5cXHRcXHQvKiBUcmFuc2xhdGUgZGlzdGFuY2VzIHRvIHBpeGVsIHVuaXRzIGZvciBiZXR0ZXIgaW50ZXJsZWF2ZSBhcml0aG1ldGljIGFuZFxcclxcblxcdFxcdG1lbW9yeSBhY2Nlc3Nlcy4gKi9cXHJcXG5cXHRcXHRkID0gZCAvIHRleGVsU2l6ZS54IC0gdlBpeENvb3JkLng7XFxyXFxuXFxyXFxuXFx0XFx0Ly8gVGhlIGFyZWEgdGV4dHVyZSBpcyBjb21wcmVzc2VkIHF1YWRyYXRpY2FsbHkuXFxyXFxuXFx0XFx0dmVjMiBzcXJ0RCA9IHNxcnQoYWJzKGQpKTtcXHJcXG5cXHJcXG5cXHRcXHQvLyBGZXRjaCB0aGUgcmlnaHQgY3Jvc3NpbmcgZWRnZXMuXFxyXFxuXFx0XFx0Y29vcmRzLnkgLT0gdGV4ZWxTaXplLnk7IC8vIFdlYkdMIHBvcnQgbm90ZTogQWRkZWQuXFxyXFxuXFx0XFx0ZmxvYXQgZTIgPSBzYW1wbGVMZXZlbFplcm9PZmZzZXQodERpZmZ1c2UsIGNvb3JkcywgaXZlYzIoMSwgMCkpLnI7XFxyXFxuXFxyXFxuXFx0XFx0Ly8gUGF0dGVybiByZWNvZ25pc2VkLCBub3cgZ2V0IHRoZSBhY3R1YWwgYXJlYS5cXHJcXG5cXHRcXHR3ZWlnaHRzLnJnID0gYXJlYShzcXJ0RCwgZTEsIGUyLCBzdWJzYW1wbGVJbmRpY2VzLnkpO1xcclxcblxcclxcblxcdH1cXHJcXG5cXHJcXG5cXHRpZihlLnIgPiAwLjApIHtcXHJcXG5cXHJcXG5cXHRcXHQvLyBFZGdlIGF0IHdlc3QuXFxyXFxuXFx0XFx0dmVjMiBkO1xcclxcblxcclxcblxcdFxcdC8vIEZpbmQgdGhlIGRpc3RhbmNlIHRvIHRoZSB0b3AuXFxyXFxuXFx0XFx0dmVjMiBjb29yZHM7XFxyXFxuXFx0XFx0Y29vcmRzLnkgPSBzZWFyY2hZVXAodk9mZnNldFsxXS54eSwgdk9mZnNldFsyXS56KTtcXHJcXG5cXHRcXHRjb29yZHMueCA9IHZPZmZzZXRbMF0ueDsgLy8gdk9mZnNldFsxXS54ID0gdlV2LnggLSAwLjI1ICogdGV4ZWxTaXplLng7XFxyXFxuXFx0XFx0ZC54ID0gY29vcmRzLnk7XFxyXFxuXFxyXFxuXFx0XFx0Ly8gRmV0Y2ggdGhlIHRvcCBjcm9zc2luZyBlZGdlcy5cXHJcXG5cXHRcXHRmbG9hdCBlMSA9IHRleHR1cmUyRCh0RGlmZnVzZSwgY29vcmRzLCAwLjApLmc7XFxyXFxuXFxyXFxuXFx0XFx0Ly8gRmluZCB0aGUgZGlzdGFuY2UgdG8gdGhlIGJvdHRvbS5cXHJcXG5cXHRcXHRjb29yZHMueSA9IHNlYXJjaFlEb3duKHZPZmZzZXRbMV0uencsIHZPZmZzZXRbMl0udyk7XFxyXFxuXFx0XFx0ZC55ID0gY29vcmRzLnk7XFxyXFxuXFxyXFxuXFx0XFx0Ly8gRGlzdGFuY2VzIGluIHBpeGVsIHVuaXRzLlxcclxcblxcdFxcdGQgPSBkIC8gdGV4ZWxTaXplLnkgLSB2UGl4Q29vcmQueTtcXHJcXG5cXHJcXG5cXHRcXHQvLyBUaGUgYXJlYSB0ZXh0dXJlIGlzIGNvbXByZXNzZWQgcXVhZHJhdGljYWxseS5cXHJcXG5cXHRcXHR2ZWMyIHNxcnREID0gc3FydChhYnMoZCkpO1xcclxcblxcclxcblxcdFxcdC8vIEZldGNoIHRoZSBib3R0b20gY3Jvc3NpbmcgZWRnZXMuXFxyXFxuXFx0XFx0Y29vcmRzLnkgLT0gdGV4ZWxTaXplLnk7IC8vIFdlYkdMIHBvcnQgbm90ZTogQWRkZWQuXFxyXFxuXFx0XFx0ZmxvYXQgZTIgPSBzYW1wbGVMZXZlbFplcm9PZmZzZXQodERpZmZ1c2UsIGNvb3JkcywgaXZlYzIoMCwgMSkpLmc7XFxyXFxuXFxyXFxuXFx0XFx0Ly8gR2V0IHRoZSBhcmVhIGZvciB0aGlzIGRpcmVjdGlvbi5cXHJcXG5cXHRcXHR3ZWlnaHRzLmJhID0gYXJlYShzcXJ0RCwgZTEsIGUyLCBzdWJzYW1wbGVJbmRpY2VzLngpO1xcclxcblxcclxcblxcdH1cXHJcXG5cXHJcXG5cXHRnbF9GcmFnQ29sb3IgPSB3ZWlnaHRzO1xcclxcblxcclxcbn1cXHJcXG5cIjtcbnZhciB2ZXJ0ZXgkMTggPSBcInVuaWZvcm0gdmVjMiB0ZXhlbFNpemU7XFxyXFxuXFxyXFxudmFyeWluZyB2ZWMyIHZVdjtcXHJcXG52YXJ5aW5nIHZlYzQgdk9mZnNldFszXTtcXHJcXG52YXJ5aW5nIHZlYzIgdlBpeENvb3JkO1xcclxcblxcclxcbnZvaWQgbWFpbigpIHtcXHJcXG5cXHJcXG5cXHR2VXYgPSB1djtcXHJcXG5cXHJcXG5cXHR2UGl4Q29vcmQgPSB1diAvIHRleGVsU2l6ZTtcXHJcXG5cXHJcXG5cXHQvLyBPZmZzZXRzIGZvciB0aGUgc2VhcmNoZXMgKHNlZSBAUFNFVURPX0dBVEhFUjQpLlxcclxcblxcdHZPZmZzZXRbMF0gPSB1di54eXh5ICsgdGV4ZWxTaXplLnh5eHkgKiB2ZWM0KC0wLjI1LCAwLjEyNSwgMS4yNSwgMC4xMjUpOyAvLyBDaGFuZ2VkIHNpZ24gaW4gWSBhbmQgVyBjb21wb25lbnRzLlxcclxcblxcdHZPZmZzZXRbMV0gPSB1di54eXh5ICsgdGV4ZWxTaXplLnh5eHkgKiB2ZWM0KC0wLjEyNSwgMC4yNSwgLTAuMTI1LCAtMS4yNSk7IC8vQ2hhbmdlZCBzaWduIGluIFkgYW5kIFcgY29tcG9uZW50cy5cXHJcXG5cXHJcXG5cXHQvLyBUaGlzIGluZGljYXRlcyB0aGUgZW5kcyBvZiB0aGUgbG9vcHMuXFxyXFxuXFx0dk9mZnNldFsyXSA9IHZlYzQodk9mZnNldFswXS54eiwgdk9mZnNldFsxXS55dykgKyB2ZWM0KC0yLjAsIDIuMCwgLTIuMCwgMi4wKSAqIHRleGVsU2l6ZS54eHl5ICogTUFYX1NFQVJDSF9TVEVQU19GTE9BVDtcXHJcXG5cXHJcXG5cXHRnbF9Qb3NpdGlvbiA9IHByb2plY3Rpb25NYXRyaXggKiBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KHBvc2l0aW9uLCAxLjApO1xcclxcblxcclxcbn1cXHJcXG5cIjtcbi8qKlxyXG4gKiBTdWJwaXhlbCBNb3JwaG9sb2dpY2FsIEFudGlhbGlhc2luZy5cclxuICpcclxuICogVGhpcyBtYXRlcmlhbCBjb21wdXRlcyB3ZWlnaHRzIGZvciBkZXRlY3RlZCBlZGdlcy5cclxuICovXG5cbnZhciBTTUFBV2VpZ2h0c01hdGVyaWFsID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfU2hhZGVyTWF0ZXJpYWwpIHtcbiAgLyoqXHJcbiAgICogQ29uc3RydWN0cyBhIG5ldyBTTUFBIHdlaWdodHMgbWF0ZXJpYWwuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge1ZlY3RvcjJ9IFt0ZXhlbFNpemVdIC0gVGhlIGFic29sdXRlIHNjcmVlbiB0ZXhlbCBzaXplLlxyXG4gICAqL1xuICBmdW5jdGlvbiBTTUFBV2VpZ2h0c01hdGVyaWFsKCkge1xuICAgIHZhciB0ZXhlbFNpemUgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IG5ldyBWZWN0b3IyKCk7XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBTTUFBV2VpZ2h0c01hdGVyaWFsKTtcblxuICAgIHJldHVybiBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIGdldFByb3RvdHlwZU9mJDIoU01BQVdlaWdodHNNYXRlcmlhbCkuY2FsbCh0aGlzLCB7XG4gICAgICB0eXBlOiBcIlNNQUFXZWlnaHRzTWF0ZXJpYWxcIixcbiAgICAgIGRlZmluZXM6IHtcbiAgICAgICAgLy8gQ29uZmlndXJhYmxlIHNldHRpbmdzOlxuICAgICAgICBNQVhfU0VBUkNIX1NURVBTX0lOVDogXCI4XCIsXG4gICAgICAgIE1BWF9TRUFSQ0hfU1RFUFNfRkxPQVQ6IFwiOC4wXCIsXG4gICAgICAgIC8vIE5vbi1jb25maWd1cmFibGUgc2V0dGluZ3M6XG4gICAgICAgIEFSRUFURVhfTUFYX0RJU1RBTkNFOiBcIjE2LjBcIixcbiAgICAgICAgQVJFQVRFWF9QSVhFTF9TSVpFOiBcIigxLjAgLyB2ZWMyKDE2MC4wLCA1NjAuMCkpXCIsXG4gICAgICAgIEFSRUFURVhfU1VCVEVYX1NJWkU6IFwiKDEuMCAvIDcuMClcIixcbiAgICAgICAgU0VBUkNIVEVYX1NJWkU6IFwidmVjMig2Ni4wLCAzMy4wKVwiLFxuICAgICAgICBTRUFSQ0hURVhfUEFDS0VEX1NJWkU6IFwidmVjMig2NC4wLCAxNi4wKVwiXG4gICAgICB9LFxuICAgICAgdW5pZm9ybXM6IHtcbiAgICAgICAgdERpZmZ1c2U6IG5ldyBVbmlmb3JtKG51bGwpLFxuICAgICAgICB0QXJlYTogbmV3IFVuaWZvcm0obnVsbCksXG4gICAgICAgIHRTZWFyY2g6IG5ldyBVbmlmb3JtKG51bGwpLFxuICAgICAgICB0ZXhlbFNpemU6IG5ldyBVbmlmb3JtKHRleGVsU2l6ZSlcbiAgICAgIH0sXG4gICAgICBmcmFnbWVudFNoYWRlcjogZnJhZ21lbnQkMTgsXG4gICAgICB2ZXJ0ZXhTaGFkZXI6IHZlcnRleCQxOCxcbiAgICAgIGRlcHRoV3JpdGU6IGZhbHNlLFxuICAgICAgZGVwdGhUZXN0OiBmYWxzZVxuICAgIH0pKTtcbiAgfVxuICAvKipcclxuICAgKiBTZXRzIHRoZSBtYXhpbXVtIGFtb3VudCBvZiBzdGVwcyBwZXJmb3JtZWQgaW4gdGhlIGhvcml6b250YWwvdmVydGljYWxcclxuICAgKiBwYXR0ZXJuIHNlYXJjaGVzLCBhdCBlYWNoIHNpZGUgb2YgdGhlIHBpeGVsLlxyXG4gICAqXHJcbiAgICogSW4gbnVtYmVyIG9mIHBpeGVscywgaXQncyBhY3R1YWxseSB0aGUgZG91YmxlLiBTbyB0aGUgbWF4aW11bSBsaW5lIGxlbmd0aFxyXG4gICAqIHBlcmZlY3RseSBoYW5kbGVkIGJ5LCBmb3IgZXhhbXBsZSAxNiwgaXMgNjQgKHBlcmZlY3RseSBtZWFucyB0aGF0IGxvbmdlclxyXG4gICAqIGxpbmVzIHdvbid0IGxvb2sgYXMgZ29vZCwgYnV0IGFyZSBzdGlsbCBhbnRpYWxpYXNlZCkuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge051bWJlcn0gc3RlcHMgLSBUaGUgc2VhcmNoIHN0ZXBzLiBSYW5nZTogWzAsIDExMl0uXHJcbiAgICovXG5cblxuICBjcmVhdGVDbGFzcyhTTUFBV2VpZ2h0c01hdGVyaWFsLCBbe1xuICAgIGtleTogXCJzZXRPcnRob2dvbmFsU2VhcmNoU3RlcHNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0T3J0aG9nb25hbFNlYXJjaFN0ZXBzKHN0ZXBzKSB7XG4gICAgICB0aGlzLmRlZmluZXMuTUFYX1NFQVJDSF9TVEVQU19JTlQgPSBzdGVwcy50b0ZpeGVkKFwiMFwiKTtcbiAgICAgIHRoaXMuZGVmaW5lcy5NQVhfU0VBUkNIX1NURVBTX0ZMT0FUID0gc3RlcHMudG9GaXhlZChcIjFcIik7XG4gICAgICB0aGlzLm5lZWRzVXBkYXRlID0gdHJ1ZTtcbiAgICB9XG4gIH1dKTtcblxuICBpbmhlcml0cyhTTUFBV2VpZ2h0c01hdGVyaWFsLCBfU2hhZGVyTWF0ZXJpYWwpO1xuXG4gIHJldHVybiBTTUFBV2VpZ2h0c01hdGVyaWFsO1xufShTaGFkZXJNYXRlcmlhbCk7XG5cbnZhciBmcmFnbWVudCQxOSA9IFwiI2luY2x1ZGUgPGNvbW1vbj5cXHJcXG4jaW5jbHVkZSA8ZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnQ+XFxyXFxuXFxyXFxudW5pZm9ybSBzYW1wbGVyMkQgdERpZmZ1c2U7XFxyXFxudW5pZm9ybSBmbG9hdCBtaWRkbGVHcmV5O1xcclxcbnVuaWZvcm0gZmxvYXQgbWF4THVtaW5hbmNlO1xcclxcblxcclxcbiNpZmRlZiBBREFQVEVEX0xVTUlOQU5DRVxcclxcblxcclxcblxcdHVuaWZvcm0gc2FtcGxlcjJEIGx1bWluYW5jZU1hcDtcXHJcXG5cXHJcXG4jZWxzZVxcclxcblxcclxcblxcdHVuaWZvcm0gZmxvYXQgYXZlcmFnZUx1bWluYW5jZTtcXHJcXG5cXHJcXG4jZW5kaWZcXHJcXG5cXHJcXG52YXJ5aW5nIHZlYzIgdlV2O1xcclxcblxcclxcbnZlYzMgdG9uZU1hcCh2ZWMzIGMpIHtcXHJcXG5cXHJcXG5cXHQjaWZkZWYgQURBUFRFRF9MVU1JTkFOQ0VcXHJcXG5cXHJcXG5cXHRcXHQvLyBHZXQgdGhlIGNhbGN1bGF0ZWQgYXZlcmFnZSBsdW1pbmFuY2UgYnkgc2FtcGxpbmcgdGhlIGNlbnRlci5cXHJcXG5cXHRcXHRmbG9hdCBsdW1BdmcgPSB0ZXh0dXJlMkQobHVtaW5hbmNlTWFwLCB2ZWMyKDAuNSkpLnI7XFxyXFxuXFxyXFxuXFx0I2Vsc2VcXHJcXG5cXHJcXG5cXHRcXHRmbG9hdCBsdW1BdmcgPSBhdmVyYWdlTHVtaW5hbmNlO1xcclxcblxcclxcblxcdCNlbmRpZlxcclxcblxcclxcblxcdC8vIENhbGN1bGF0ZSB0aGUgbHVtaW5hbmNlIG9mIHRoZSBjdXJyZW50IHBpeGVsLlxcclxcblxcdGZsb2F0IGx1bVBpeGVsID0gbGluZWFyVG9SZWxhdGl2ZUx1bWluYW5jZShjKTtcXHJcXG5cXHJcXG5cXHQvLyBBcHBseSB0aGUgbW9kaWZpZWQgb3BlcmF0b3IgKFJlaW5oYXJkIEVxLiA0KS5cXHJcXG5cXHRmbG9hdCBsdW1TY2FsZWQgPSAobHVtUGl4ZWwgKiBtaWRkbGVHcmV5KSAvIGx1bUF2ZztcXHJcXG5cXHJcXG5cXHRmbG9hdCBsdW1Db21wcmVzc2VkID0gKGx1bVNjYWxlZCAqICgxLjAgKyAobHVtU2NhbGVkIC8gKG1heEx1bWluYW5jZSAqIG1heEx1bWluYW5jZSkpKSkgLyAoMS4wICsgbHVtU2NhbGVkKTtcXHJcXG5cXHJcXG5cXHRyZXR1cm4gbHVtQ29tcHJlc3NlZCAqIGM7XFxyXFxuXFxyXFxufVxcclxcblxcclxcbnZvaWQgbWFpbigpIHtcXHJcXG5cXHJcXG5cXHR2ZWM0IHRleGVsID0gdGV4dHVyZTJEKHREaWZmdXNlLCB2VXYpO1xcclxcblxcdGdsX0ZyYWdDb2xvciA9IHZlYzQodG9uZU1hcCh0ZXhlbC5yZ2IpLCB0ZXhlbC5hKTtcXHJcXG5cXHJcXG5cXHQjaW5jbHVkZSA8ZGl0aGVyaW5nX2ZyYWdtZW50Plxcclxcblxcclxcbn1cXHJcXG5cIjtcbnZhciB2ZXJ0ZXgkMTkgPSBcInZhcnlpbmcgdmVjMiB2VXY7XFxyXFxuXFxyXFxudm9pZCBtYWluKCkge1xcclxcblxcclxcblxcdHZVdiA9IHV2O1xcclxcblxcdGdsX1Bvc2l0aW9uID0gcHJvamVjdGlvbk1hdHJpeCAqIG1vZGVsVmlld01hdHJpeCAqIHZlYzQocG9zaXRpb24sIDEuMCk7XFxyXFxuXFxyXFxufVxcclxcblwiO1xuLyoqXHJcbiAqIEZ1bGwtc2NyZWVuIHRvbmUtbWFwcGluZyBzaGFkZXIgbWF0ZXJpYWwuXHJcbiAqXHJcbiAqIFRoaXMgbWF0ZXJpYWwgc3VwcG9ydHMgZGl0aGVyaW5nLlxyXG4gKlxyXG4gKiBSZWZlcmVuY2U6XHJcbiAqICBodHRwOi8vd3d3LmNpcy5yaXQuZWR1L3Blb3BsZS9mYWN1bHR5L2ZlcndlcmRhL3B1YmxpY2F0aW9ucy9zaWcwMl9wYXBlci5wZGZcclxuICovXG5cbnZhciBUb25lTWFwcGluZ01hdGVyaWFsID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfU2hhZGVyTWF0ZXJpYWwpIHtcbiAgLyoqXHJcbiAgICogQ29uc3RydWN0cyBhIG5ldyB0b25lIG1hcHBpbmcgbWF0ZXJpYWwuXHJcbiAgICovXG4gIGZ1bmN0aW9uIFRvbmVNYXBwaW5nTWF0ZXJpYWwoKSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgVG9uZU1hcHBpbmdNYXRlcmlhbCk7XG5cbiAgICByZXR1cm4gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBnZXRQcm90b3R5cGVPZiQyKFRvbmVNYXBwaW5nTWF0ZXJpYWwpLmNhbGwodGhpcywge1xuICAgICAgdHlwZTogXCJUb25lTWFwcGluZ01hdGVyaWFsXCIsXG4gICAgICB1bmlmb3Jtczoge1xuICAgICAgICB0RGlmZnVzZTogbmV3IFVuaWZvcm0obnVsbCksXG4gICAgICAgIGx1bWluYW5jZU1hcDogbmV3IFVuaWZvcm0obnVsbCksXG4gICAgICAgIGF2ZXJhZ2VMdW1pbmFuY2U6IG5ldyBVbmlmb3JtKDEuMCksXG4gICAgICAgIG1heEx1bWluYW5jZTogbmV3IFVuaWZvcm0oMTYuMCksXG4gICAgICAgIG1pZGRsZUdyZXk6IG5ldyBVbmlmb3JtKDAuNilcbiAgICAgIH0sXG4gICAgICBmcmFnbWVudFNoYWRlcjogZnJhZ21lbnQkMTksXG4gICAgICB2ZXJ0ZXhTaGFkZXI6IHZlcnRleCQxOSxcbiAgICAgIGRlcHRoV3JpdGU6IGZhbHNlLFxuICAgICAgZGVwdGhUZXN0OiBmYWxzZVxuICAgIH0pKTtcbiAgfVxuXG4gIGluaGVyaXRzKFRvbmVNYXBwaW5nTWF0ZXJpYWwsIF9TaGFkZXJNYXRlcmlhbCk7XG5cbiAgcmV0dXJuIFRvbmVNYXBwaW5nTWF0ZXJpYWw7XG59KFNoYWRlck1hdGVyaWFsKTtcblxuLyoqXHJcbiAqIEEgY29sbGVjdGlvbiBvZiBzaGFkZXIgbWF0ZXJpYWxzIHRoYXQgYXJlIHVzZWQgaW4gdGhlIHBvc3QgcHJvY2Vzc2luZyBwYXNzZXMuXHJcbiAqXHJcbiAqIEBtb2R1bGUgcG9zdHByb2Nlc3NpbmcvbWF0ZXJpYWxzXHJcbiAqL1xuXG4vKipcclxuICogQW4gYWJzdHJhY3QgcGFzcy5cclxuICpcclxuICogUGFzc2VzIHRoYXQgZG8gbm90IHJlbHkgb24gdGhlIGRlcHRoIGJ1ZmZlciBzaG91bGQgZXhwbGljaXRseSBkaXNhYmxlIHRoZVxyXG4gKiBkZXB0aCB0ZXN0IGFuZCBkZXB0aCB3cml0ZSBpbiB0aGVpciByZXNwZWN0aXZlIHNoYWRlciBtYXRlcmlhbHMuXHJcbiAqXHJcbiAqIEBpbXBsZW1lbnRzIHtSZXNpemFibGV9XHJcbiAqIEBpbXBsZW1lbnRzIHtEaXNwb3NhYmxlfVxyXG4gKi9cblxudmFyIFBhc3MgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKCkge1xuICAvKipcclxuICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHBhc3MuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge1N0cmluZ30gW25hbWVdIC0gVGhlIG5hbWUgb2YgdGhpcyBwYXNzLlxyXG4gICAqIEBwYXJhbSB7U2NlbmV9IFtzY2VuZV0gLSBUaGUgc2NlbmUgdG8gcmVuZGVyLlxyXG4gICAqIEBwYXJhbSB7Q2FtZXJhfSBbY2FtZXJhXSAtIFRoZSBjYW1lcmEuXHJcbiAgICogQHBhcmFtIHtNZXNofSBbcXVhZF0gLSBBIHF1YWQgdGhhdCBmaWxscyB0aGUgc2NyZWVuIHRvIHJlbmRlciAyRCBmaWx0ZXIgZWZmZWN0cy4gU2V0IHRoaXMgdG8gbnVsbCwgaWYgeW91IGRvbid0IG5lZWQgaXQgKHNlZSB7QGxpbmsgUmVuZGVyUGFzc30pLlxyXG4gICAqL1xuICBmdW5jdGlvbiBQYXNzKCkge1xuICAgIHZhciBuYW1lID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBcIlBhc3NcIjtcbiAgICB2YXIgc2NlbmUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IG5ldyBTY2VuZSgpO1xuICAgIHZhciBjYW1lcmEgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IG5ldyBPcnRob2dyYXBoaWNDYW1lcmEoLTEsIDEsIDEsIC0xLCAwLCAxKTtcbiAgICB2YXIgcXVhZCA9IGFyZ3VtZW50cy5sZW5ndGggPiAzICYmIGFyZ3VtZW50c1szXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzNdIDogbmV3IE1lc2gobmV3IFBsYW5lQnVmZmVyR2VvbWV0cnkoMiwgMiksIG51bGwpO1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgUGFzcyk7XG5cbiAgICAvKipcclxuICAgICAqIFRoZSBuYW1lIG9mIHRoaXMgcGFzcy5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7U3RyaW5nfVxyXG4gICAgICovXG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAvKipcclxuICAgICAqIFRoZSBzY2VuZSB0byByZW5kZXIuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge1NjZW5lfVxyXG4gICAgICogQHByb3RlY3RlZFxyXG4gICAgICovXG5cbiAgICB0aGlzLnNjZW5lID0gc2NlbmU7XG4gICAgLyoqXHJcbiAgICAgKiBUaGUgY2FtZXJhLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtDYW1lcmF9XHJcbiAgICAgKiBAcHJvdGVjdGVkXHJcbiAgICAgKi9cblxuICAgIHRoaXMuY2FtZXJhID0gY2FtZXJhO1xuICAgIC8qKlxyXG4gICAgICogQSBxdWFkIG1lc2ggdGhhdCBmaWxscyB0aGUgc2NyZWVuLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtNZXNofVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xuXG4gICAgdGhpcy5xdWFkID0gcXVhZDtcblxuICAgIGlmICh0aGlzLnF1YWQgIT09IG51bGwpIHtcbiAgICAgIHRoaXMucXVhZC5mcnVzdHVtQ3VsbGVkID0gZmFsc2U7XG5cbiAgICAgIGlmICh0aGlzLnNjZW5lICE9PSBudWxsKSB7XG4gICAgICAgIHRoaXMuc2NlbmUuYWRkKHRoaXMucXVhZCk7XG4gICAgICB9XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBwYXNzIHNob3VsZCByZW5kZXIgdG8gc2NyZWVuLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtCb29sZWFufVxyXG4gICAgICovXG5cblxuICAgIHRoaXMucmVuZGVyVG9TY3JlZW4gPSBmYWxzZTtcbiAgICAvKipcclxuICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoaXMgcGFzcyBzaG91bGQgYmUgZXhlY3V0ZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge0Jvb2xlYW59XHJcbiAgICAgKi9cblxuICAgIHRoaXMuZW5hYmxlZCA9IHRydWU7XG4gICAgLyoqXHJcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUge0BsaW5rIEVmZmVjdENvbXBvc2VyfSBzaG91bGQgc3dhcCB0aGUgZnJhbWVcclxuICAgICAqIGJ1ZmZlcnMgYWZ0ZXIgdGhpcyBwYXNzIGhhcyBmaW5pc2hlZCByZW5kZXJpbmcuXHJcbiAgICAgKlxyXG4gICAgICogU2V0IHRoaXMgdG8gYGZhbHNlYCBpZiB0aGlzIHBhc3MgZG9lc24ndCByZW5kZXIgdG8gdGhlIG91dHB1dCBidWZmZXIgb3JcclxuICAgICAqIHRoZSBzY3JlZW4uIE90aGVyd2lzZSwgdGhlIGNvbnRlbnRzIG9mIHRoZSBpbnB1dCBidWZmZXIgd2lsbCBiZSBsb3N0LlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtCb29sZWFufVxyXG4gICAgICovXG5cbiAgICB0aGlzLm5lZWRzU3dhcCA9IHRydWU7XG4gIH1cbiAgLyoqXHJcbiAgICogVGhlIGZ1bGxzY3JlZW4gbWF0ZXJpYWwuXHJcbiAgICpcclxuICAgKiBAdHlwZSB7TWF0ZXJpYWx9XHJcbiAgICovXG5cblxuICBjcmVhdGVDbGFzcyhQYXNzLCBbe1xuICAgIGtleTogXCJyZW5kZXJcIixcblxuICAgIC8qKlxyXG4gICAgICogUmVuZGVycyB0aGUgZWZmZWN0LlxyXG4gICAgICpcclxuICAgICAqIFRoaXMgaXMgYW4gYWJzdHJhY3QgbWV0aG9kIHRoYXQgbXVzdCBiZSBvdmVycmlkZGVuLlxyXG4gICAgICpcclxuICAgICAqIEBhYnN0cmFjdFxyXG4gICAgICogQHRocm93cyB7RXJyb3J9IEFuIGVycm9yIGlzIHRocm93biBpZiB0aGUgbWV0aG9kIGlzIG5vdCBvdmVycmlkZGVuLlxyXG4gICAgICogQHBhcmFtIHtXZWJHTFJlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlci5cclxuICAgICAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IGlucHV0QnVmZmVyIC0gQSBmcmFtZSBidWZmZXIgdGhhdCBjb250YWlucyB0aGUgcmVzdWx0IG9mIHRoZSBwcmV2aW91cyBwYXNzLlxyXG4gICAgICogQHBhcmFtIHtXZWJHTFJlbmRlclRhcmdldH0gb3V0cHV0QnVmZmVyIC0gQSBmcmFtZSBidWZmZXIgdGhhdCBzZXJ2ZXMgYXMgdGhlIG91dHB1dCByZW5kZXIgdGFyZ2V0IHVubGVzcyB0aGlzIHBhc3MgcmVuZGVycyB0byBzY3JlZW4uXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gW2RlbHRhXSAtIFRoZSB0aW1lIGJldHdlZW4gdGhlIGxhc3QgZnJhbWUgYW5kIHRoZSBjdXJyZW50IG9uZSBpbiBzZWNvbmRzLlxyXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBbc3RlbmNpbFRlc3RdIC0gSW5kaWNhdGVzIHdoZXRoZXIgYSBzdGVuY2lsIG1hc2sgaXMgYWN0aXZlLlxyXG4gICAgICovXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcihyZW5kZXJlciwgaW5wdXRCdWZmZXIsIG91dHB1dEJ1ZmZlciwgZGVsdGEsIHN0ZW5jaWxUZXN0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSZW5kZXIgbWV0aG9kIG5vdCBpbXBsZW1lbnRlZCFcIik7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogVXBkYXRlcyB0aGlzIHBhc3Mgd2l0aCB0aGUgcmVuZGVyZXIncyBzaXplLlxyXG4gICAgICpcclxuICAgICAqIFlvdSBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgaW4gY2FzZSB5b3Ugd2FudCB0byBiZSBpbmZvcm1lZCBhYm91dCB0aGUgbWFpblxyXG4gICAgICogcmVuZGVyIHNpemUuXHJcbiAgICAgKlxyXG4gICAgICogVGhlIHtAbGluayBFZmZlY3RDb21wb3Nlcn0gY2FsbHMgdGhpcyBtZXRob2QgYmVmb3JlIHRoaXMgcGFzcyBpc1xyXG4gICAgICogaW5pdGlhbGl6ZWQgYW5kIGV2ZXJ5IHRpbWUgaXRzIG93biBzaXplIGlzIHVwZGF0ZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHdpZHRoIC0gVGhlIHJlbmRlcmVyJ3Mgd2lkdGguXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gaGVpZ2h0IC0gVGhlIHJlbmRlcmVyJ3MgaGVpZ2h0LlxyXG4gICAgICogQGV4YW1wbGUgdGhpcy5teVJlbmRlclRhcmdldC5zZXRTaXplKHdpZHRoLCBoZWlnaHQpO1xyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJzZXRTaXplXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldFNpemUod2lkdGgsIGhlaWdodCkge31cbiAgICAvKipcclxuICAgICAqIFBlcmZvcm1zIGluaXRpYWxpemF0aW9uIHRhc2tzLlxyXG4gICAgICpcclxuICAgICAqIEJ5IG92ZXJyaWRpbmcgdGhpcyBtZXRob2QgeW91IGdhaW4gYWNjZXNzIHRvIHRoZSByZW5kZXJlci4gWW91J2xsIGFsc28gYmVcclxuICAgICAqIGFibGUgdG8gY29uZmlndXJlIHlvdXIgY3VzdG9tIHJlbmRlciB0YXJnZXRzIHRvIHVzZSB0aGUgYXBwcm9wcmlhdGUgZm9ybWF0XHJcbiAgICAgKiAoUkdCIG9yIFJHQkEpLlxyXG4gICAgICpcclxuICAgICAqIFRoZSBwcm92aWRlZCByZW5kZXJlciBjYW4gYmUgdXNlZCB0byB3YXJtIHVwIHNwZWNpYWwgb2ZmLXNjcmVlbiByZW5kZXJcclxuICAgICAqIHRhcmdldHMgYnkgcGVyZm9ybWluZyBhIHByZWxpbWluYXJ5IHJlbmRlciBvcGVyYXRpb24uXHJcbiAgICAgKlxyXG4gICAgICogVGhlIHtAbGluayBFZmZlY3RDb21wb3Nlcn0gY2FsbHMgdGhpcyBtZXRob2Qgd2hlbiB0aGlzIHBhc3MgaXMgYWRkZWQgdG8gaXRzXHJcbiAgICAgKiBxdWV1ZSwgYnV0IG5vdCBiZWZvcmUgaXRzIHNpemUgaGFzIGJlZW4gc2V0LlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7V2ViR0xSZW5kZXJlcn0gcmVuZGVyZXIgLSBUaGUgcmVuZGVyZXIuXHJcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGFscGhhIC0gV2hldGhlciB0aGUgcmVuZGVyZXIgdXNlcyB0aGUgYWxwaGEgY2hhbm5lbCBvciBub3QuXHJcbiAgICAgKiBAZXhhbXBsZSBpZighYWxwaGEpIHsgdGhpcy5teVJlbmRlclRhcmdldC50ZXh0dXJlLmZvcm1hdCA9IFJHQkZvcm1hdDsgfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJpbml0aWFsaXplXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGluaXRpYWxpemUocmVuZGVyZXIsIGFscGhhKSB7fVxuICAgIC8qKlxyXG4gICAgICogUGVyZm9ybXMgYSBzaGFsbG93IHNlYXJjaCBmb3IgcHJvcGVydGllcyB0aGF0IGRlZmluZSBhIGRpc3Bvc2UgbWV0aG9kIGFuZFxyXG4gICAgICogZGVsZXRlcyB0aGVtLiBUaGUgcGFzcyB3aWxsIGJlIGlub3BlcmF0aXZlIGFmdGVyIHRoaXMgbWV0aG9kIHdhcyBjYWxsZWQhXHJcbiAgICAgKlxyXG4gICAgICogRGlzcG9zYWJsZSBvYmplY3RzOlxyXG4gICAgICogIC0gcmVuZGVyIHRhcmdldHNcclxuICAgICAqICAtIG1hdGVyaWFsc1xyXG4gICAgICogIC0gdGV4dHVyZXNcclxuICAgICAqXHJcbiAgICAgKiBUaGUge0BsaW5rIEVmZmVjdENvbXBvc2VyfSBjYWxscyB0aGlzIG1ldGhvZCB3aGVuIGl0IGlzIGJlaW5nIGRlc3Ryb3llZC5cclxuICAgICAqIFlvdSBtYXksIGhvd2V2ZXIsIHVzZSBpdCBpbmRlcGVuZGVudGx5IHRvIGZyZWUgbWVtb3J5IHdoZW4geW91IGFyZSBjZXJ0YWluXHJcbiAgICAgKiB0aGF0IHlvdSBkb24ndCBuZWVkIHRoaXMgcGFzcyBhbnltb3JlLlxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJkaXNwb3NlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRpc3Bvc2UoKSB7XG4gICAgICB2YXIga2V5O1xuXG4gICAgICB2YXIgX2FyciA9IE9iamVjdC5rZXlzKHRoaXMpO1xuXG4gICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgX2Fyci5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAga2V5ID0gX2FycltfaV07XG5cbiAgICAgICAgaWYgKHRoaXNba2V5XSAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpc1trZXldLmRpc3Bvc2UgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIHRoaXNba2V5XS5kaXNwb3NlKCk7XG4gICAgICAgICAgdGhpc1trZXldID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5tYXRlcmlhbCAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLm1hdGVyaWFsLmRpc3Bvc2UoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwibWF0ZXJpYWxcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnF1YWQgIT09IG51bGwgPyB0aGlzLnF1YWQubWF0ZXJpYWwgOiBudWxsO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGZ1bGxzY3JlZW4gbWF0ZXJpYWwuXHJcbiAgICAgKlxyXG4gICAgICogVGhlIG1hdGVyaWFsIHdpbGwgYmUgYXNzaWduZWQgdG8gdGhlIHF1YWQgbWVzaCB0aGF0IGZpbGxzIHRoZSBzY3JlZW4uXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge01hdGVyaWFsfVxyXG4gICAgICovXG4gICAgLFxuICAgIHNldDogZnVuY3Rpb24gc2V0KHZhbHVlKSB7XG4gICAgICBpZiAodGhpcy5xdWFkICE9PSBudWxsKSB7XG4gICAgICAgIHRoaXMucXVhZC5tYXRlcmlhbCA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBQYXNzO1xufSgpO1xuXG4vKipcclxuICogQW4gZWZmaWNpZW50LCBpbmNyZW1lbnRhbCBibHVyIHBhc3MuXHJcbiAqXHJcbiAqIE5vdGU6IFRoaXMgcGFzcyBhbGxvd3MgdGhlIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVyIHRvIGJlIHRoZSBzYW1lLlxyXG4gKi9cblxudmFyIEJsdXJQYXNzID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfUGFzcykge1xuICAvKipcclxuICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGJsdXIgcGFzcy5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gLSBUaGUgb3B0aW9ucy5cclxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMucmVzb2x1dGlvblNjYWxlPTAuNV0gLSBUaGUgcmVuZGVyIHRleHR1cmUgcmVzb2x1dGlvbiBzY2FsZSwgcmVsYXRpdmUgdG8gdGhlIHNjcmVlbiByZW5kZXIgc2l6ZS5cclxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMua2VybmVsU2l6ZT1LZXJuZWxTaXplLkxBUkdFXSAtIFRoZSBibHVyIGtlcm5lbCBzaXplLlxyXG4gICAqL1xuICBmdW5jdGlvbiBCbHVyUGFzcygpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBCbHVyUGFzcyk7XG5cbiAgICBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgZ2V0UHJvdG90eXBlT2YkMihCbHVyUGFzcykuY2FsbCh0aGlzLCBcIkJsdXJQYXNzXCIpKTtcbiAgICAvKipcclxuICAgICAqIEEgcmVuZGVyIHRhcmdldC5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7V2ViR0xSZW5kZXJUYXJnZXR9XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXG5cbiAgICBfdGhpcy5yZW5kZXJUYXJnZXRYID0gbmV3IFdlYkdMUmVuZGVyVGFyZ2V0KDEsIDEsIHtcbiAgICAgIG1pbkZpbHRlcjogTGluZWFyRmlsdGVyLFxuICAgICAgbWFnRmlsdGVyOiBMaW5lYXJGaWx0ZXIsXG4gICAgICBzdGVuY2lsQnVmZmVyOiBmYWxzZSxcbiAgICAgIGRlcHRoQnVmZmVyOiBmYWxzZVxuICAgIH0pO1xuICAgIF90aGlzLnJlbmRlclRhcmdldFgudGV4dHVyZS5uYW1lID0gXCJCbHVyLlRhcmdldFhcIjtcbiAgICBfdGhpcy5yZW5kZXJUYXJnZXRYLnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzID0gZmFsc2U7XG4gICAgLyoqXHJcbiAgICAgKiBBIHNlY29uZCByZW5kZXIgdGFyZ2V0LlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtXZWJHTFJlbmRlclRhcmdldH1cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cblxuICAgIF90aGlzLnJlbmRlclRhcmdldFkgPSBfdGhpcy5yZW5kZXJUYXJnZXRYLmNsb25lKCk7XG4gICAgX3RoaXMucmVuZGVyVGFyZ2V0WS50ZXh0dXJlLm5hbWUgPSBcIkJsdXIuVGFyZ2V0WVwiO1xuICAgIC8qKlxyXG4gICAgICogVGhlIHJlc29sdXRpb24gc2NhbGUuXHJcbiAgICAgKlxyXG4gICAgICogWW91IG5lZWQgdG8gY2FsbCB7QGxpbmsgRWZmZWN0Q29tcG9zZXIjc2V0U2l6ZX0gYWZ0ZXIgY2hhbmdpbmcgdGhpc1xyXG4gICAgICogdmFsdWUuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge051bWJlcn1cclxuICAgICAqL1xuXG4gICAgX3RoaXMucmVzb2x1dGlvblNjYWxlID0gb3B0aW9ucy5yZXNvbHV0aW9uU2NhbGUgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMucmVzb2x1dGlvblNjYWxlIDogMC41O1xuICAgIC8qKlxyXG4gICAgICogQSBjb252b2x1dGlvbiBzaGFkZXIgbWF0ZXJpYWwuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge0NvbnZvbHV0aW9uTWF0ZXJpYWx9XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXG5cbiAgICBfdGhpcy5jb252b2x1dGlvbk1hdGVyaWFsID0gbmV3IENvbnZvbHV0aW9uTWF0ZXJpYWwoKTtcbiAgICAvKipcclxuICAgICAqIEEgY29udm9sdXRpb24gc2hhZGVyIG1hdGVyaWFsIHRoYXQgdXNlcyBkaXRoZXJpbmcuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge0NvbnZvbHV0aW9uTWF0ZXJpYWx9XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXG5cbiAgICBfdGhpcy5kaXRoZXJlZENvbnZvbHV0aW9uTWF0ZXJpYWwgPSBuZXcgQ29udm9sdXRpb25NYXRlcmlhbCgpO1xuICAgIF90aGlzLmRpdGhlcmVkQ29udm9sdXRpb25NYXRlcmlhbC5kaXRoZXJpbmcgPSB0cnVlO1xuICAgIC8qKlxyXG4gICAgICogV2hldGhlciB0aGUgYmx1cnJlZCByZXN1bHQgc2hvdWxkIGFsc28gYmUgZGl0aGVyZWQgdXNpbmcgbm9pc2UuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge0Jvb2xlYW59XHJcbiAgICAgKi9cblxuICAgIF90aGlzLmRpdGhlcmluZyA9IGZhbHNlO1xuICAgIF90aGlzLmtlcm5lbFNpemUgPSBvcHRpb25zLmtlcm5lbFNpemU7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG4gIC8qKlxyXG4gICAqIFRoZSBhYnNvbHV0ZSB3aWR0aCBvZiB0aGUgaW50ZXJuYWwgcmVuZGVyIHRhcmdldHMuXHJcbiAgICpcclxuICAgKiBAdHlwZSB7TnVtYmVyfVxyXG4gICAqL1xuXG5cbiAgY3JlYXRlQ2xhc3MoQmx1clBhc3MsIFt7XG4gICAga2V5OiBcInJlbmRlclwiLFxuXG4gICAgLyoqXHJcbiAgICAgKiBCbHVycyB0aGUgaW5wdXQgYnVmZmVyIGFuZCB3cml0ZXMgdGhlIHJlc3VsdCB0byB0aGUgb3V0cHV0IGJ1ZmZlci4gVGhlXHJcbiAgICAgKiBpbnB1dCBidWZmZXIgcmVtYWlucyBpbnRhY3QsIHVubGVzcyBpdHMgYWxzbyB0aGUgb3V0cHV0IGJ1ZmZlci5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1dlYkdMUmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG4gICAgICogQHBhcmFtIHtXZWJHTFJlbmRlclRhcmdldH0gaW5wdXRCdWZmZXIgLSBBIGZyYW1lIGJ1ZmZlciB0aGF0IGNvbnRhaW5zIHRoZSByZXN1bHQgb2YgdGhlIHByZXZpb3VzIHBhc3MuXHJcbiAgICAgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSBvdXRwdXRCdWZmZXIgLSBBIGZyYW1lIGJ1ZmZlciB0aGF0IHNlcnZlcyBhcyB0aGUgb3V0cHV0IHJlbmRlciB0YXJnZXQgdW5sZXNzIHRoaXMgcGFzcyByZW5kZXJzIHRvIHNjcmVlbi5cclxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBbZGVsdGFdIC0gVGhlIHRpbWUgYmV0d2VlbiB0aGUgbGFzdCBmcmFtZSBhbmQgdGhlIGN1cnJlbnQgb25lIGluIHNlY29uZHMuXHJcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtzdGVuY2lsVGVzdF0gLSBJbmRpY2F0ZXMgd2hldGhlciBhIHN0ZW5jaWwgbWFzayBpcyBhY3RpdmUuXHJcbiAgICAgKi9cbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKHJlbmRlcmVyLCBpbnB1dEJ1ZmZlciwgb3V0cHV0QnVmZmVyLCBkZWx0YSwgc3RlbmNpbFRlc3QpIHtcbiAgICAgIHZhciBzY2VuZSA9IHRoaXMuc2NlbmU7XG4gICAgICB2YXIgY2FtZXJhID0gdGhpcy5jYW1lcmE7XG4gICAgICB2YXIgcmVuZGVyVGFyZ2V0WCA9IHRoaXMucmVuZGVyVGFyZ2V0WDtcbiAgICAgIHZhciByZW5kZXJUYXJnZXRZID0gdGhpcy5yZW5kZXJUYXJnZXRZO1xuICAgICAgdmFyIG1hdGVyaWFsID0gdGhpcy5jb252b2x1dGlvbk1hdGVyaWFsO1xuICAgICAgdmFyIHVuaWZvcm1zID0gbWF0ZXJpYWwudW5pZm9ybXM7XG4gICAgICB2YXIga2VybmVsID0gbWF0ZXJpYWwuZ2V0S2VybmVsKCk7XG4gICAgICB2YXIgbGFzdFJUID0gaW5wdXRCdWZmZXI7XG4gICAgICB2YXIgZGVzdFJUO1xuICAgICAgdmFyIGksIGw7XG4gICAgICB0aGlzLm1hdGVyaWFsID0gbWF0ZXJpYWw7IC8vIEFwcGx5IHRoZSBtdWx0aS1wYXNzIGJsdXIuXG5cbiAgICAgIGZvciAoaSA9IDAsIGwgPSBrZXJuZWwubGVuZ3RoIC0gMTsgaSA8IGw7ICsraSkge1xuICAgICAgICAvLyBBbHRlcm5hdGUgYmV0d2VlbiB0YXJnZXRzLlxuICAgICAgICBkZXN0UlQgPSBpICUgMiA9PT0gMCA/IHJlbmRlclRhcmdldFggOiByZW5kZXJUYXJnZXRZO1xuICAgICAgICB1bmlmb3Jtcy5rZXJuZWwudmFsdWUgPSBrZXJuZWxbaV07XG4gICAgICAgIHVuaWZvcm1zLnREaWZmdXNlLnZhbHVlID0gbGFzdFJULnRleHR1cmU7XG4gICAgICAgIHJlbmRlcmVyLnJlbmRlcihzY2VuZSwgY2FtZXJhLCBkZXN0UlQpO1xuICAgICAgICBsYXN0UlQgPSBkZXN0UlQ7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmRpdGhlcmluZykge1xuICAgICAgICBtYXRlcmlhbCA9IHRoaXMuZGl0aGVyZWRDb252b2x1dGlvbk1hdGVyaWFsO1xuICAgICAgICB1bmlmb3JtcyA9IG1hdGVyaWFsLnVuaWZvcm1zO1xuICAgICAgICB0aGlzLm1hdGVyaWFsID0gbWF0ZXJpYWw7XG4gICAgICB9XG5cbiAgICAgIHVuaWZvcm1zLmtlcm5lbC52YWx1ZSA9IGtlcm5lbFtpXTtcbiAgICAgIHVuaWZvcm1zLnREaWZmdXNlLnZhbHVlID0gbGFzdFJULnRleHR1cmU7XG4gICAgICByZW5kZXJlci5yZW5kZXIoc2NlbmUsIGNhbWVyYSwgdGhpcy5yZW5kZXJUb1NjcmVlbiA/IG51bGwgOiBvdXRwdXRCdWZmZXIpO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIFVwZGF0ZXMgdGhlIHNpemUgb2YgdGhpcyBwYXNzLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSB3aWR0aCAtIFRoZSB3aWR0aC5cclxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0LlxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJzZXRTaXplXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldFNpemUod2lkdGgsIGhlaWdodCkge1xuICAgICAgd2lkdGggPSBNYXRoLm1heCgxLCBNYXRoLmZsb29yKHdpZHRoICogdGhpcy5yZXNvbHV0aW9uU2NhbGUpKTtcbiAgICAgIGhlaWdodCA9IE1hdGgubWF4KDEsIE1hdGguZmxvb3IoaGVpZ2h0ICogdGhpcy5yZXNvbHV0aW9uU2NhbGUpKTtcbiAgICAgIHRoaXMucmVuZGVyVGFyZ2V0WC5zZXRTaXplKHdpZHRoLCBoZWlnaHQpO1xuICAgICAgdGhpcy5yZW5kZXJUYXJnZXRZLnNldFNpemUod2lkdGgsIGhlaWdodCk7XG4gICAgICB0aGlzLmNvbnZvbHV0aW9uTWF0ZXJpYWwuc2V0VGV4ZWxTaXplKDEuMCAvIHdpZHRoLCAxLjAgLyBoZWlnaHQpO1xuICAgICAgdGhpcy5kaXRoZXJlZENvbnZvbHV0aW9uTWF0ZXJpYWwuc2V0VGV4ZWxTaXplKDEuMCAvIHdpZHRoLCAxLjAgLyBoZWlnaHQpO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIFBlcmZvcm1zIGluaXRpYWxpemF0aW9uIHRhc2tzLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7V2ViR0xSZW5kZXJlcn0gcmVuZGVyZXIgLSBUaGUgcmVuZGVyZXIuXHJcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGFscGhhIC0gV2hldGhlciB0aGUgcmVuZGVyZXIgdXNlcyB0aGUgYWxwaGEgY2hhbm5lbCBvciBub3QuXHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImluaXRpYWxpemVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaW5pdGlhbGl6ZShyZW5kZXJlciwgYWxwaGEpIHtcbiAgICAgIGlmICghYWxwaGEpIHtcbiAgICAgICAgdGhpcy5yZW5kZXJUYXJnZXRYLnRleHR1cmUuZm9ybWF0ID0gUkdCRm9ybWF0O1xuICAgICAgICB0aGlzLnJlbmRlclRhcmdldFkudGV4dHVyZS5mb3JtYXQgPSBSR0JGb3JtYXQ7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIndpZHRoXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZW5kZXJUYXJnZXRYLndpZHRoO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIFRoZSBhYnNvbHV0ZSBoZWlnaHQgb2YgdGhlIGludGVybmFsIHJlbmRlciB0YXJnZXRzLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtOdW1iZXJ9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImhlaWdodFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMucmVuZGVyVGFyZ2V0WC5oZWlnaHQ7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogVGhlIGtlcm5lbCBzaXplLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtLZXJuZWxTaXplfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJrZXJuZWxTaXplXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb252b2x1dGlvbk1hdGVyaWFsLmtlcm5lbFNpemU7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogQHR5cGUge0tlcm5lbFNpemV9XHJcbiAgICAgKi9cbiAgICAsXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQoKSB7XG4gICAgICB2YXIgdmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IEtlcm5lbFNpemUuTEFSR0U7XG4gICAgICB0aGlzLmNvbnZvbHV0aW9uTWF0ZXJpYWwua2VybmVsU2l6ZSA9IHZhbHVlO1xuICAgICAgdGhpcy5kaXRoZXJlZENvbnZvbHV0aW9uTWF0ZXJpYWwua2VybmVsU2l6ZSA9IHZhbHVlO1xuICAgIH1cbiAgfV0pO1xuXG4gIGluaGVyaXRzKEJsdXJQYXNzLCBfUGFzcyk7XG5cbiAgcmV0dXJuIEJsdXJQYXNzO1xufShQYXNzKTtcblxuLyoqXHJcbiAqIEEgYmxvb20gcGFzcy5cclxuICpcclxuICogVGhpcyBwYXNzIHJlbmRlcnMgYSBzY2VuZSB3aXRoIHN1cGVyaW1wb3NlZCBibHVyIGJ5IHV0aWxpemluZyB0aGUgZmFzdCBLYXdhc2VcclxuICogY29udm9sdXRpb24gYXBwcm9hY2guXHJcbiAqL1xuXG52YXIgQmxvb21QYXNzID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfUGFzcykge1xuICAvKipcclxuICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGJsb29tIHBhc3MuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gVGhlIG9wdGlvbnMuXHJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLnJlc29sdXRpb25TY2FsZT0wLjVdIC0gVGhlIHJlbmRlciB0ZXh0dXJlIHJlc29sdXRpb24gc2NhbGUsIHJlbGF0aXZlIHRvIHRoZSBzY3JlZW4gcmVuZGVyIHNpemUuXHJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmtlcm5lbFNpemU9S2VybmVsU2l6ZS5MQVJHRV0gLSBUaGUgYmx1ciBrZXJuZWwgc2l6ZS5cclxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuaW50ZW5zaXR5PTEuMF0gLSBUaGUgc3RyZW5ndGggb2YgdGhlIGJsb29tIGVmZmVjdC5cclxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuZGlzdGluY3Rpb249MS4wXSAtIFRoZSBsdW1pbmFuY2UgZGlzdGluY3Rpb24gZmFjdG9yLiBSYWlzZSB0aGlzIHZhbHVlIHRvIGJyaW5nIG91dCB0aGUgYnJpZ2h0ZXIgZWxlbWVudHMgaW4gdGhlIHNjZW5lLlxyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5zY3JlZW5Nb2RlPXRydWVdIC0gV2hldGhlciB0aGUgc2NyZWVuIGJsZW5kIG1vZGUgc2hvdWxkIGJlIHVzZWQgZm9yIGNvbWJpbmluZyB0aGUgYmxvb20gdGV4dHVyZSB3aXRoIHRoZSBzY2VuZSBjb2xvcnMuXHJcbiAgICovXG4gIGZ1bmN0aW9uIEJsb29tUGFzcygpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBCbG9vbVBhc3MpO1xuXG4gICAgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIGdldFByb3RvdHlwZU9mJDIoQmxvb21QYXNzKS5jYWxsKHRoaXMsIFwiQmxvb21QYXNzXCIpKTtcbiAgICAvKipcclxuICAgICAqIEEgcmVuZGVyIHRhcmdldC5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7V2ViR0xSZW5kZXJUYXJnZXR9XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXG5cbiAgICBfdGhpcy5yZW5kZXJUYXJnZXQgPSBuZXcgV2ViR0xSZW5kZXJUYXJnZXQoMSwgMSwge1xuICAgICAgbWluRmlsdGVyOiBMaW5lYXJGaWx0ZXIsXG4gICAgICBtYWdGaWx0ZXI6IExpbmVhckZpbHRlcixcbiAgICAgIHN0ZW5jaWxCdWZmZXI6IGZhbHNlLFxuICAgICAgZGVwdGhCdWZmZXI6IGZhbHNlXG4gICAgfSk7XG4gICAgX3RoaXMucmVuZGVyVGFyZ2V0LnRleHR1cmUubmFtZSA9IFwiQmxvb20uVGFyZ2V0XCI7XG4gICAgX3RoaXMucmVuZGVyVGFyZ2V0LnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzID0gZmFsc2U7XG4gICAgLyoqXHJcbiAgICAgKiBBIGJsdXIgcGFzcy5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7Qmx1clBhc3N9XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXG5cbiAgICBfdGhpcy5ibHVyUGFzcyA9IG5ldyBCbHVyUGFzcyhvcHRpb25zKTtcbiAgICAvKipcclxuICAgICAqIEEgY29tYmluZSBzaGFkZXIgbWF0ZXJpYWwuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge0NvbWJpbmVNYXRlcmlhbH1cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cblxuICAgIF90aGlzLmNvbWJpbmVNYXRlcmlhbCA9IG5ldyBDb21iaW5lTWF0ZXJpYWwob3B0aW9ucy5zY3JlZW5Nb2RlICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLnNjcmVlbk1vZGUgOiB0cnVlKTtcbiAgICBfdGhpcy5pbnRlbnNpdHkgPSBvcHRpb25zLmludGVuc2l0eTtcbiAgICAvKipcclxuICAgICAqIEEgbHVtaW5vc2l0eSBzaGFkZXIgbWF0ZXJpYWwuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge0x1bWlub3NpdHlNYXRlcmlhbH1cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cblxuICAgIF90aGlzLmx1bWlub3NpdHlNYXRlcmlhbCA9IG5ldyBMdW1pbm9zaXR5TWF0ZXJpYWwodHJ1ZSk7XG4gICAgX3RoaXMuZGlzdGluY3Rpb24gPSBvcHRpb25zLmRpc3RpbmN0aW9uO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuICAvKipcclxuICAgKiBUaGUgcmVzb2x1dGlvbiBzY2FsZS5cclxuICAgKlxyXG4gICAqIEB0eXBlIHtOdW1iZXJ9XHJcbiAgICovXG5cblxuICBjcmVhdGVDbGFzcyhCbG9vbVBhc3MsIFt7XG4gICAga2V5OiBcInJlbmRlclwiLFxuXG4gICAgLyoqXHJcbiAgICAgKiBSZW5kZXJzIHRoZSBlZmZlY3QuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtXZWJHTFJlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlci5cclxuICAgICAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IGlucHV0QnVmZmVyIC0gQSBmcmFtZSBidWZmZXIgdGhhdCBjb250YWlucyB0aGUgcmVzdWx0IG9mIHRoZSBwcmV2aW91cyBwYXNzLlxyXG4gICAgICogQHBhcmFtIHtXZWJHTFJlbmRlclRhcmdldH0gb3V0cHV0QnVmZmVyIC0gQSBmcmFtZSBidWZmZXIgdGhhdCBzZXJ2ZXMgYXMgdGhlIG91dHB1dCByZW5kZXIgdGFyZ2V0IHVubGVzcyB0aGlzIHBhc3MgcmVuZGVycyB0byBzY3JlZW4uXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gW2RlbHRhXSAtIFRoZSB0aW1lIGJldHdlZW4gdGhlIGxhc3QgZnJhbWUgYW5kIHRoZSBjdXJyZW50IG9uZSBpbiBzZWNvbmRzLlxyXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBbc3RlbmNpbFRlc3RdIC0gSW5kaWNhdGVzIHdoZXRoZXIgYSBzdGVuY2lsIG1hc2sgaXMgYWN0aXZlLlxyXG4gICAgICovXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcihyZW5kZXJlciwgaW5wdXRCdWZmZXIsIG91dHB1dEJ1ZmZlciwgZGVsdGEsIHN0ZW5jaWxUZXN0KSB7XG4gICAgICB2YXIgc2NlbmUgPSB0aGlzLnNjZW5lO1xuICAgICAgdmFyIGNhbWVyYSA9IHRoaXMuY2FtZXJhO1xuICAgICAgdmFyIGJsdXJQYXNzID0gdGhpcy5ibHVyUGFzcztcbiAgICAgIHZhciBsdW1pbm9zaXR5TWF0ZXJpYWwgPSB0aGlzLmx1bWlub3NpdHlNYXRlcmlhbDtcbiAgICAgIHZhciBjb21iaW5lTWF0ZXJpYWwgPSB0aGlzLmNvbWJpbmVNYXRlcmlhbDtcbiAgICAgIHZhciByZW5kZXJUYXJnZXQgPSB0aGlzLnJlbmRlclRhcmdldDsgLy8gTHVtaW5hbmNlIGZpbHRlci5cblxuICAgICAgdGhpcy5tYXRlcmlhbCA9IGx1bWlub3NpdHlNYXRlcmlhbDtcbiAgICAgIGx1bWlub3NpdHlNYXRlcmlhbC51bmlmb3Jtcy50RGlmZnVzZS52YWx1ZSA9IGlucHV0QnVmZmVyLnRleHR1cmU7XG4gICAgICByZW5kZXJlci5yZW5kZXIoc2NlbmUsIGNhbWVyYSwgcmVuZGVyVGFyZ2V0KTsgLy8gQ29udm9sdXRpb24gcGhhc2UuXG5cbiAgICAgIGJsdXJQYXNzLnJlbmRlcihyZW5kZXJlciwgcmVuZGVyVGFyZ2V0LCByZW5kZXJUYXJnZXQpO1xuXG4gICAgICBpZiAodGhpcy5ibGVuZCkge1xuICAgICAgICAvLyBSZW5kZXIgdGhlIG9yaWdpbmFsIHNjZW5lIHdpdGggc3VwZXJpbXBvc2VkIGJsdXIuXG4gICAgICAgIHRoaXMubWF0ZXJpYWwgPSBjb21iaW5lTWF0ZXJpYWw7XG4gICAgICAgIGNvbWJpbmVNYXRlcmlhbC51bmlmb3Jtcy50ZXh0dXJlMS52YWx1ZSA9IGlucHV0QnVmZmVyLnRleHR1cmU7XG4gICAgICAgIGNvbWJpbmVNYXRlcmlhbC51bmlmb3Jtcy50ZXh0dXJlMi52YWx1ZSA9IHJlbmRlclRhcmdldC50ZXh0dXJlO1xuICAgICAgICByZW5kZXJlci5yZW5kZXIoc2NlbmUsIGNhbWVyYSwgdGhpcy5yZW5kZXJUb1NjcmVlbiA/IG51bGwgOiBvdXRwdXRCdWZmZXIpO1xuICAgICAgfVxuICAgIH1cbiAgICAvKipcclxuICAgICAqIFVwZGF0ZXMgdGhlIHNpemUgb2YgdGhpcyBwYXNzLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSB3aWR0aCAtIFRoZSB3aWR0aC5cclxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0LlxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJzZXRTaXplXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldFNpemUod2lkdGgsIGhlaWdodCkge1xuICAgICAgdGhpcy5ibHVyUGFzcy5zZXRTaXplKHdpZHRoLCBoZWlnaHQpO1xuICAgICAgd2lkdGggPSB0aGlzLmJsdXJQYXNzLndpZHRoO1xuICAgICAgaGVpZ2h0ID0gdGhpcy5ibHVyUGFzcy5oZWlnaHQ7XG4gICAgICB0aGlzLnJlbmRlclRhcmdldC5zZXRTaXplKHdpZHRoLCBoZWlnaHQpO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIFBlcmZvcm1zIGluaXRpYWxpemF0aW9uIHRhc2tzLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7V2ViR0xSZW5kZXJlcn0gcmVuZGVyZXIgLSBUaGUgcmVuZGVyZXIuXHJcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGFscGhhIC0gV2hldGhlciB0aGUgcmVuZGVyZXIgdXNlcyB0aGUgYWxwaGEgY2hhbm5lbCBvciBub3QuXHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImluaXRpYWxpemVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaW5pdGlhbGl6ZShyZW5kZXJlciwgYWxwaGEpIHtcbiAgICAgIHRoaXMuYmx1clBhc3MuaW5pdGlhbGl6ZShyZW5kZXJlciwgYWxwaGEpO1xuXG4gICAgICBpZiAoIWFscGhhKSB7XG4gICAgICAgIHRoaXMucmVuZGVyVGFyZ2V0LnRleHR1cmUuZm9ybWF0ID0gUkdCRm9ybWF0O1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZXNvbHV0aW9uU2NhbGVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmJsdXJQYXNzLnJlc29sdXRpb25TY2FsZTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBZb3UgbmVlZCB0byBjYWxsIHtAbGluayBFZmZlY3RDb21wb3NlciNzZXRTaXplfSBhZnRlciBjaGFuZ2luZyB0aGlzIHZhbHVlLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtOdW1iZXJ9XHJcbiAgICAgKi9cbiAgICAsXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQoKSB7XG4gICAgICB2YXIgdmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IDAuNTtcbiAgICAgIHRoaXMuYmx1clBhc3MucmVzb2x1dGlvblNjYWxlID0gdmFsdWU7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogVGhlIGJsdXIga2VybmVsIHNpemUuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge0tlcm5lbFNpemV9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImtlcm5lbFNpemVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmJsdXJQYXNzLmtlcm5lbFNpemU7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogQHR5cGUge0tlcm5lbFNpemV9XHJcbiAgICAgKi9cbiAgICAsXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQoKSB7XG4gICAgICB2YXIgdmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IEtlcm5lbFNpemUuTEFSR0U7XG4gICAgICB0aGlzLmJsdXJQYXNzLmtlcm5lbFNpemUgPSB2YWx1ZTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBUaGUgb3ZlcmFsbCBpbnRlbnNpdHkgb2YgdGhlIGVmZmVjdC5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7TnVtYmVyfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJpbnRlbnNpdHlcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbWJpbmVNYXRlcmlhbC51bmlmb3Jtcy5vcGFjaXR5Mi52YWx1ZTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBAdHlwZSB7TnVtYmVyfVxyXG4gICAgICovXG4gICAgLFxuICAgIHNldDogZnVuY3Rpb24gc2V0KCkge1xuICAgICAgdmFyIHZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiAxLjA7XG4gICAgICB0aGlzLmNvbWJpbmVNYXRlcmlhbC51bmlmb3Jtcy5vcGFjaXR5Mi52YWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIFRoZSBsdW1pbmFuY2UgZGlzdGluY3Rpb24gZmFjdG9yLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtOdW1iZXJ9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImRpc3RpbmN0aW9uXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5sdW1pbm9zaXR5TWF0ZXJpYWwudW5pZm9ybXMuZGlzdGluY3Rpb24udmFsdWU7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogQHR5cGUge051bWJlcn1cclxuICAgICAqL1xuICAgICxcbiAgICBzZXQ6IGZ1bmN0aW9uIHNldCgpIHtcbiAgICAgIHZhciB2YWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogMS4wO1xuICAgICAgdGhpcy5sdW1pbm9zaXR5TWF0ZXJpYWwudW5pZm9ybXMuZGlzdGluY3Rpb24udmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciBkaXRoZXJpbmcgaXMgZW5hYmxlZC5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7Qm9vbGVhbn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiZGl0aGVyaW5nXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5ibHVyUGFzcy5kaXRoZXJpbmc7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogSWYgZW5hYmxlZCwgdGhlIHJlc3VsdCB3aWxsIGJlIGRpdGhlcmVkIHRvIHJlbW92ZSBiYW5kaW5nIGFydGlmYWN0cy5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7Qm9vbGVhbn1cclxuICAgICAqL1xuICAgICxcbiAgICBzZXQ6IGZ1bmN0aW9uIHNldCh2YWx1ZSkge1xuICAgICAgdGhpcy5ibHVyUGFzcy5kaXRoZXJpbmcgPSB2YWx1ZTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZWZmZWN0IHNob3VsZCBiZSBhcHBsaWVkIHRvIHRoZSBpbnB1dCBidWZmZXIuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge0Jvb2xlYW59XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImJsZW5kXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5uZWVkc1N3YXA7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogSWYgZGlzYWJsZWQsIHRoZSBpbnB1dCBidWZmZXIgd2lsbCByZW1haW4gdW5hZmZlY3RlZC5cclxuICAgICAqXHJcbiAgICAgKiBZb3UgbWF5IHVzZSB0aGUge0BsaW5rIEJsb29tUGFzcyNvdmVybGF5fSB0ZXh0dXJlIHRvIGFwcGx5IHRoZSBlZmZlY3QgdG9cclxuICAgICAqIHlvdXIgc2NlbmUuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge0Jvb2xlYW59XHJcbiAgICAgKi9cbiAgICAsXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQodmFsdWUpIHtcbiAgICAgIHRoaXMubmVlZHNTd2FwID0gdmFsdWU7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogVGhlIGVmZmVjdCBvdmVybGF5IHRleHR1cmUuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge1RleHR1cmV9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIm92ZXJsYXlcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnJlbmRlclRhcmdldC50ZXh0dXJlO1xuICAgIH1cbiAgfV0pO1xuXG4gIGluaGVyaXRzKEJsb29tUGFzcywgX1Bhc3MpO1xuXG4gIHJldHVybiBCbG9vbVBhc3M7XG59KFBhc3MpO1xuXG4vKipcclxuICogQSBEZXB0aCBvZiBGaWVsZCAoRG9GKSBwYXNzIHVzaW5nIGEgYm9rZWggc2hhZGVyLlxyXG4gKlxyXG4gKiBUaGlzIHBhc3MgcmVxdWlyZXMgYSB7QGxpbmsgRWZmZWN0Q29tcG9zZXIjZGVwdGhUZXh0dXJlfS5cclxuICovXG5cbnZhciBCb2tlaFBhc3MgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9QYXNzKSB7XG4gIC8qKlxyXG4gICAqIENvbnN0cnVjdHMgYSBuZXcgYm9rZWggcGFzcy5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7UGVyc3BlY3RpdmVDYW1lcmF9IGNhbWVyYSAtIFRoZSBtYWluIGNhbWVyYS4gVXNlZCB0byBvYnRhaW4gdGhlIGFzcGVjdCByYXRpbyBhbmQgdGhlIG5lYXIgYW5kIGZhciBwbGFuZSBzZXR0aW5ncy5cclxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gQWRkaXRpb25hbCBwYXJhbWV0ZXJzLiBTZWUge0BsaW5rIEJva2VoTWF0ZXJpYWx9IGZvciBkZXRhaWxzLlxyXG4gICAqL1xuICBmdW5jdGlvbiBCb2tlaFBhc3MoY2FtZXJhKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgQm9rZWhQYXNzKTtcblxuICAgIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBnZXRQcm90b3R5cGVPZiQyKEJva2VoUGFzcykuY2FsbCh0aGlzLCBcIkJva2VoUGFzc1wiKSk7XG4gICAgX3RoaXMubWF0ZXJpYWwgPSBuZXcgQm9rZWhNYXRlcmlhbChjYW1lcmEsIG9wdGlvbnMpO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuICAvKipcclxuICAgKiBSZW5kZXJzIHRoZSBlZmZlY3QuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge1dlYkdMUmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG4gICAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IGlucHV0QnVmZmVyIC0gQSBmcmFtZSBidWZmZXIgdGhhdCBjb250YWlucyB0aGUgcmVzdWx0IG9mIHRoZSBwcmV2aW91cyBwYXNzLlxyXG4gICAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IG91dHB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgc2VydmVzIGFzIHRoZSBvdXRwdXQgcmVuZGVyIHRhcmdldCB1bmxlc3MgdGhpcyBwYXNzIHJlbmRlcnMgdG8gc2NyZWVuLlxyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbZGVsdGFdIC0gVGhlIHRpbWUgYmV0d2VlbiB0aGUgbGFzdCBmcmFtZSBhbmQgdGhlIGN1cnJlbnQgb25lIGluIHNlY29uZHMuXHJcbiAgICogQHBhcmFtIHtCb29sZWFufSBbc3RlbmNpbFRlc3RdIC0gSW5kaWNhdGVzIHdoZXRoZXIgYSBzdGVuY2lsIG1hc2sgaXMgYWN0aXZlLlxyXG4gICAqL1xuXG5cbiAgY3JlYXRlQ2xhc3MoQm9rZWhQYXNzLCBbe1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKHJlbmRlcmVyLCBpbnB1dEJ1ZmZlciwgb3V0cHV0QnVmZmVyLCBkZWx0YSwgc3RlbmNpbFRlc3QpIHtcbiAgICAgIHRoaXMubWF0ZXJpYWwudW5pZm9ybXMudERpZmZ1c2UudmFsdWUgPSBpbnB1dEJ1ZmZlci50ZXh0dXJlO1xuICAgICAgdGhpcy5tYXRlcmlhbC51bmlmb3Jtcy50RGVwdGgudmFsdWUgPSBpbnB1dEJ1ZmZlci5kZXB0aFRleHR1cmU7XG4gICAgICByZW5kZXJlci5yZW5kZXIodGhpcy5zY2VuZSwgdGhpcy5jYW1lcmEsIHRoaXMucmVuZGVyVG9TY3JlZW4gPyBudWxsIDogb3V0cHV0QnVmZmVyKTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBVcGRhdGVzIHRoZSBzaXplIG9mIHRoaXMgcGFzcy5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gd2lkdGggLSBUaGUgd2lkdGguXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gaGVpZ2h0IC0gVGhlIGhlaWdodC5cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwic2V0U2l6ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRTaXplKHdpZHRoLCBoZWlnaHQpIHtcbiAgICAgIHRoaXMubWF0ZXJpYWwudW5pZm9ybXMuYXNwZWN0LnZhbHVlID0gd2lkdGggLyBoZWlnaHQ7XG4gICAgfVxuICB9XSk7XG5cbiAgaW5oZXJpdHMoQm9rZWhQYXNzLCBfUGFzcyk7XG5cbiAgcmV0dXJuIEJva2VoUGFzcztcbn0oUGFzcyk7XG5cbi8qKlxyXG4gKiBBIHBhc3MgdGhhdCBkaXNhYmxlcyB0aGUgc3RlbmNpbCB0ZXN0LlxyXG4gKi9cblxudmFyIENsZWFyTWFza1Bhc3MgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9QYXNzKSB7XG4gIC8qKlxyXG4gICAqIENvbnN0cnVjdHMgYSBuZXcgY2xlYXIgbWFzayBwYXNzLlxyXG4gICAqL1xuICBmdW5jdGlvbiBDbGVhck1hc2tQYXNzKCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIENsZWFyTWFza1Bhc3MpO1xuXG4gICAgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIGdldFByb3RvdHlwZU9mJDIoQ2xlYXJNYXNrUGFzcykuY2FsbCh0aGlzLCBcIkNsZWFyTWFza1Bhc3NcIiwgbnVsbCwgbnVsbCwgbnVsbCkpO1xuICAgIF90aGlzLm5lZWRzU3dhcCA9IGZhbHNlO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuICAvKipcclxuICAgKiBEaXNhYmxlcyB0aGUgZ2xvYmFsIHN0ZW5jaWwgdGVzdC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7V2ViR0xSZW5kZXJlcn0gcmVuZGVyZXIgLSBUaGUgcmVuZGVyZXIuXHJcbiAgICogQHBhcmFtIHtXZWJHTFJlbmRlclRhcmdldH0gaW5wdXRCdWZmZXIgLSBBIGZyYW1lIGJ1ZmZlciB0aGF0IGNvbnRhaW5zIHRoZSByZXN1bHQgb2YgdGhlIHByZXZpb3VzIHBhc3MuXHJcbiAgICogQHBhcmFtIHtXZWJHTFJlbmRlclRhcmdldH0gb3V0cHV0QnVmZmVyIC0gQSBmcmFtZSBidWZmZXIgdGhhdCBzZXJ2ZXMgYXMgdGhlIG91dHB1dCByZW5kZXIgdGFyZ2V0IHVubGVzcyB0aGlzIHBhc3MgcmVuZGVycyB0byBzY3JlZW4uXHJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtkZWx0YV0gLSBUaGUgdGltZSBiZXR3ZWVuIHRoZSBsYXN0IGZyYW1lIGFuZCB0aGUgY3VycmVudCBvbmUgaW4gc2Vjb25kcy5cclxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtzdGVuY2lsVGVzdF0gLSBJbmRpY2F0ZXMgd2hldGhlciBhIHN0ZW5jaWwgbWFzayBpcyBhY3RpdmUuXHJcbiAgICovXG5cblxuICBjcmVhdGVDbGFzcyhDbGVhck1hc2tQYXNzLCBbe1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKHJlbmRlcmVyLCBpbnB1dEJ1ZmZlciwgb3V0cHV0QnVmZmVyLCBkZWx0YSwgc3RlbmNpbFRlc3QpIHtcbiAgICAgIHJlbmRlcmVyLnN0YXRlLmJ1ZmZlcnMuc3RlbmNpbC5zZXRUZXN0KGZhbHNlKTtcbiAgICB9XG4gIH1dKTtcblxuICBpbmhlcml0cyhDbGVhck1hc2tQYXNzLCBfUGFzcyk7XG5cbiAgcmV0dXJuIENsZWFyTWFza1Bhc3M7XG59KFBhc3MpO1xuXG4vKipcclxuICogVXNlZCBmb3Igc2F2aW5nIHRoZSBvcmlnaW5hbCBjbGVhciBjb2xvciBvZiB0aGUgcmVuZGVyZXIuXHJcbiAqXHJcbiAqIEB0eXBlIHtDb2xvcn1cclxuICogQHByaXZhdGVcclxuICovXG5cbnZhciBjb2xvciA9IG5ldyBDb2xvcigpO1xuLyoqXHJcbiAqIEEgcGFzcyB0aGF0IGNsZWFycyB0aGUgaW5wdXQgYnVmZmVyIG9yIHRoZSBzY3JlZW4uXHJcbiAqXHJcbiAqIFlvdSBjYW4gcHJldmVudCBzcGVjaWZpYyBiaXRzIGZyb20gYmVpbmcgY2xlYXJlZCBieSBzZXR0aW5nIGVpdGhlciB0aGVcclxuICogYXV0b0NsZWFyQ29sb3IsIGF1dG9DbGVhclN0ZW5jaWwgb3IgYXV0b0NsZWFyRGVwdGggcHJvcGVydGllcyBvZiB0aGUgcmVuZGVyZXJcclxuICogdG8gZmFsc2UuXHJcbiAqL1xuXG52YXIgQ2xlYXJQYXNzID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfUGFzcykge1xuICAvKipcclxuICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGNsZWFyIHBhc3MuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gQWRkaXRpb25hbCBvcHRpb25zLlxyXG4gICAqIEBwYXJhbSB7Q29sb3J9IFtvcHRpb25zLmNsZWFyQ29sb3I9bnVsbF0gLSBBbiBvdmVycmlkZSBjbGVhciBjb2xvci5cclxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuY2xlYXJBbHBoYT0wLjBdIC0gQW4gb3ZlcnJpZGUgY2xlYXIgYWxwaGEuXHJcbiAgICovXG4gIGZ1bmN0aW9uIENsZWFyUGFzcygpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBDbGVhclBhc3MpO1xuXG4gICAgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIGdldFByb3RvdHlwZU9mJDIoQ2xlYXJQYXNzKS5jYWxsKHRoaXMsIFwiQ2xlYXJQYXNzXCIsIG51bGwsIG51bGwsIG51bGwpKTtcbiAgICBfdGhpcy5uZWVkc1N3YXAgPSBmYWxzZTtcbiAgICAvKipcclxuICAgICAqIFRoZSBjbGVhciBjb2xvci5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7Q29sb3J9XHJcbiAgICAgKi9cblxuICAgIF90aGlzLmNsZWFyQ29sb3IgPSBvcHRpb25zLmNsZWFyQ29sb3IgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuY2xlYXJDb2xvciA6IG51bGw7XG4gICAgLyoqXHJcbiAgICAgKiBUaGUgY2xlYXIgYWxwaGEuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge051bWJlcn1cclxuICAgICAqL1xuXG4gICAgX3RoaXMuY2xlYXJBbHBoYSA9IG9wdGlvbnMuY2xlYXJBbHBoYSAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5jbGVhckFscGhhIDogMC4wO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuICAvKipcclxuICAgKiBDbGVhcnMgdGhlIGlucHV0IGJ1ZmZlciBvciB0aGUgc2NyZWVuLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtXZWJHTFJlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlci5cclxuICAgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSBpbnB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgY29udGFpbnMgdGhlIHJlc3VsdCBvZiB0aGUgcHJldmlvdXMgcGFzcy5cclxuICAgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSBvdXRwdXRCdWZmZXIgLSBBIGZyYW1lIGJ1ZmZlciB0aGF0IHNlcnZlcyBhcyB0aGUgb3V0cHV0IHJlbmRlciB0YXJnZXQgdW5sZXNzIHRoaXMgcGFzcyByZW5kZXJzIHRvIHNjcmVlbi5cclxuICAgKiBAcGFyYW0ge051bWJlcn0gW2RlbHRhXSAtIFRoZSB0aW1lIGJldHdlZW4gdGhlIGxhc3QgZnJhbWUgYW5kIHRoZSBjdXJyZW50IG9uZSBpbiBzZWNvbmRzLlxyXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW3N0ZW5jaWxUZXN0XSAtIEluZGljYXRlcyB3aGV0aGVyIGEgc3RlbmNpbCBtYXNrIGlzIGFjdGl2ZS5cclxuICAgKi9cblxuXG4gIGNyZWF0ZUNsYXNzKENsZWFyUGFzcywgW3tcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcihyZW5kZXJlciwgaW5wdXRCdWZmZXIsIG91dHB1dEJ1ZmZlciwgZGVsdGEsIHN0ZW5jaWxUZXN0KSB7XG4gICAgICB2YXIgY2xlYXJDb2xvciA9IHRoaXMuY2xlYXJDb2xvcjtcbiAgICAgIHZhciBjbGVhckFscGhhO1xuXG4gICAgICBpZiAoY2xlYXJDb2xvciAhPT0gbnVsbCkge1xuICAgICAgICBjb2xvci5jb3B5KHJlbmRlcmVyLmdldENsZWFyQ29sb3IoKSk7XG4gICAgICAgIGNsZWFyQWxwaGEgPSByZW5kZXJlci5nZXRDbGVhckFscGhhKCk7XG4gICAgICAgIHJlbmRlcmVyLnNldENsZWFyQ29sb3IoY2xlYXJDb2xvciwgdGhpcy5jbGVhckFscGhhKTtcbiAgICAgIH1cblxuICAgICAgcmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KHRoaXMucmVuZGVyVG9TY3JlZW4gPyBudWxsIDogaW5wdXRCdWZmZXIpO1xuICAgICAgcmVuZGVyZXIuY2xlYXIoKTtcblxuICAgICAgaWYgKGNsZWFyQ29sb3IgIT09IG51bGwpIHtcbiAgICAgICAgcmVuZGVyZXIuc2V0Q2xlYXJDb2xvcihjb2xvciwgY2xlYXJBbHBoYSk7XG4gICAgICB9XG4gICAgfVxuICB9XSk7XG5cbiAgaW5oZXJpdHMoQ2xlYXJQYXNzLCBfUGFzcyk7XG5cbiAgcmV0dXJuIENsZWFyUGFzcztcbn0oUGFzcyk7XG5cbi8qKlxyXG4gKiBBIGRvdCBzY3JlZW4gcGFzcy5cclxuICovXG5cbnZhciBEb3RTY3JlZW5QYXNzID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfUGFzcykge1xuICAvKipcclxuICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGRvdCBzY3JlZW4gcGFzcy5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gLSBUaGUgb3B0aW9ucy5cclxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmF2ZXJhZ2U9ZmFsc2VdIC0gV2hldGhlciB0aGUgc2hhZGVyIHNob3VsZCBvdXRwdXQgYSBjb2xvdXIgYXZlcmFnZSAoYmxhY2sgYW5kIHdoaXRlKS5cclxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuYW5nbGU9MS41N10gLSBUaGUgYW5nbGUgb2YgdGhlIHBhdHRlcm4uXHJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLnNjYWxlPTEuMF0gLSBUaGUgc2NhbGUgb2YgdGhlIG92ZXJhbGwgZWZmZWN0LlxyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5pbnRlbnNpdHk9MS4wXSAtIFRoZSBpbnRlbnNpdHkgb2YgdGhlIGVmZmVjdC5cclxuICAgKi9cbiAgZnVuY3Rpb24gRG90U2NyZWVuUGFzcygpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBEb3RTY3JlZW5QYXNzKTtcblxuICAgIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBnZXRQcm90b3R5cGVPZiQyKERvdFNjcmVlblBhc3MpLmNhbGwodGhpcywgXCJEb3RTY3JlZW5QYXNzXCIpKTtcbiAgICBfdGhpcy5tYXRlcmlhbCA9IG5ldyBEb3RTY3JlZW5NYXRlcmlhbChvcHRpb25zKTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgLyoqXHJcbiAgICogUmVuZGVycyB0aGUgZWZmZWN0LlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtXZWJHTFJlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlci5cclxuICAgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSBpbnB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgY29udGFpbnMgdGhlIHJlc3VsdCBvZiB0aGUgcHJldmlvdXMgcGFzcy5cclxuICAgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSBvdXRwdXRCdWZmZXIgLSBBIGZyYW1lIGJ1ZmZlciB0aGF0IHNlcnZlcyBhcyB0aGUgb3V0cHV0IHJlbmRlciB0YXJnZXQgdW5sZXNzIHRoaXMgcGFzcyByZW5kZXJzIHRvIHNjcmVlbi5cclxuICAgKiBAcGFyYW0ge051bWJlcn0gW2RlbHRhXSAtIFRoZSB0aW1lIGJldHdlZW4gdGhlIGxhc3QgZnJhbWUgYW5kIHRoZSBjdXJyZW50IG9uZSBpbiBzZWNvbmRzLlxyXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW3N0ZW5jaWxUZXN0XSAtIEluZGljYXRlcyB3aGV0aGVyIGEgc3RlbmNpbCBtYXNrIGlzIGFjdGl2ZS5cclxuICAgKi9cblxuXG4gIGNyZWF0ZUNsYXNzKERvdFNjcmVlblBhc3MsIFt7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIocmVuZGVyZXIsIGlucHV0QnVmZmVyLCBvdXRwdXRCdWZmZXIsIGRlbHRhLCBzdGVuY2lsVGVzdCkge1xuICAgICAgdGhpcy5tYXRlcmlhbC51bmlmb3Jtcy50RGlmZnVzZS52YWx1ZSA9IGlucHV0QnVmZmVyLnRleHR1cmU7XG4gICAgICByZW5kZXJlci5yZW5kZXIodGhpcy5zY2VuZSwgdGhpcy5jYW1lcmEsIHRoaXMucmVuZGVyVG9TY3JlZW4gPyBudWxsIDogb3V0cHV0QnVmZmVyKTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBVcGRhdGVzIHRoZSBzaXplIG9mIHRoaXMgcGFzcy5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gd2lkdGggLSBUaGUgd2lkdGguXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gaGVpZ2h0IC0gVGhlIGhlaWdodC5cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwic2V0U2l6ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRTaXplKHdpZHRoLCBoZWlnaHQpIHtcbiAgICAgIHdpZHRoID0gTWF0aC5tYXgoMSwgd2lkdGgpO1xuICAgICAgaGVpZ2h0ID0gTWF0aC5tYXgoMSwgaGVpZ2h0KTtcbiAgICAgIHRoaXMubWF0ZXJpYWwudW5pZm9ybXMub2Zmc2V0UmVwZWF0LnZhbHVlLnogPSB3aWR0aDtcbiAgICAgIHRoaXMubWF0ZXJpYWwudW5pZm9ybXMub2Zmc2V0UmVwZWF0LnZhbHVlLncgPSBoZWlnaHQ7XG4gICAgfVxuICB9XSk7XG5cbiAgaW5oZXJpdHMoRG90U2NyZWVuUGFzcywgX1Bhc3MpO1xuXG4gIHJldHVybiBEb3RTY3JlZW5QYXNzO1xufShQYXNzKTtcblxuLyoqXHJcbiAqIEEgZmlsbSBwYXNzLlxyXG4gKlxyXG4gKiBQcm92aWRlcyB2YXJpb3VzIGNpbmVtYXRpYyBlZmZlY3RzLlxyXG4gKi9cblxudmFyIEZpbG1QYXNzID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfUGFzcykge1xuICAvKipcclxuICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGZpbG0gcGFzcy5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gLSBUaGUgb3B0aW9ucy4gU2VlIHtAbGluayBGaWxtTWF0ZXJpYWx9IGZvciBtb3JlIG9wdGlvbnMuXHJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLnNjYW5saW5lRGVuc2l0eT0xLjI1XSAtIFRoZSBzY2FubGluZSBkZW5zaXR5LCByZWxhdGl2ZSB0byB0aGUgc2NyZWVuIGhlaWdodC5cclxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuZ3JpZFNjYWxlPTEuMF0gLSBUaGUgZ3JpZCBzY2FsZSwgcmVsYXRpdmUgdG8gdGhlIHNjcmVlbiBoZWlnaHQuXHJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmdyaWRMaW5lV2lkdGg9MC4wXSAtIFRoZSBncmlkIGxpbmUgd2lkdGguIFRoaXMgdmFsdWUgd2lsbCBiZSBhZGRlZCB0byB0aGUgYmFzZSBsaW5lIHdpZHRoLlxyXG4gICAqL1xuICBmdW5jdGlvbiBGaWxtUGFzcygpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBGaWxtUGFzcyk7XG5cbiAgICBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgZ2V0UHJvdG90eXBlT2YkMihGaWxtUGFzcykuY2FsbCh0aGlzLCBcIkZpbG1QYXNzXCIpKTtcbiAgICBfdGhpcy5tYXRlcmlhbCA9IG5ldyBGaWxtTWF0ZXJpYWwob3B0aW9ucyk7XG4gICAgLyoqXHJcbiAgICAgKiBUaGUgYW1vdW50IG9mIHNjYW5saW5lcywgcmVsYXRpdmUgdG8gdGhlIHNjcmVlbiBoZWlnaHQuXHJcbiAgICAgKlxyXG4gICAgICogWW91IG5lZWQgdG8gY2FsbCB7QGxpbmsgRWZmZWN0Q29tcG9zZXIjc2V0U2l6ZX0gYWZ0ZXIgY2hhbmdpbmcgdGhpc1xyXG4gICAgICogdmFsdWUuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge051bWJlcn1cclxuICAgICAqL1xuXG4gICAgX3RoaXMuc2NhbmxpbmVEZW5zaXR5ID0gb3B0aW9ucy5zY2FubGluZURlbnNpdHkgPT09IHVuZGVmaW5lZCA/IDEuMjUgOiBvcHRpb25zLnNjYW5saW5lRGVuc2l0eTtcbiAgICAvKipcclxuICAgICAqIFRoZSBncmlkIHNjYWxlLCByZWxhdGl2ZSB0byB0aGUgc2NyZWVuIGhlaWdodC5cclxuICAgICAqXHJcbiAgICAgKiBZb3UgbmVlZCB0byBjYWxsIHtAbGluayBFZmZlY3RDb21wb3NlciNzZXRTaXplfSBhZnRlciBjaGFuZ2luZyB0aGlzXHJcbiAgICAgKiB2YWx1ZS5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7TnVtYmVyfVxyXG4gICAgICovXG5cbiAgICBfdGhpcy5ncmlkU2NhbGUgPSBvcHRpb25zLmdyaWRTY2FsZSA9PT0gdW5kZWZpbmVkID8gMS4wIDogTWF0aC5tYXgob3B0aW9ucy5ncmlkU2NhbGUsIDFlLTYpO1xuICAgIC8qKlxyXG4gICAgICogVGhlIGdyaWQgbGluZSB3aWR0aC5cclxuICAgICAqXHJcbiAgICAgKiBZb3UgbmVlZCB0byBjYWxsIHtAbGluayBFZmZlY3RDb21wb3NlciNzZXRTaXplfSBhZnRlciBjaGFuZ2luZyB0aGlzXHJcbiAgICAgKiB2YWx1ZS5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7TnVtYmVyfVxyXG4gICAgICovXG5cbiAgICBfdGhpcy5ncmlkTGluZVdpZHRoID0gb3B0aW9ucy5ncmlkTGluZVdpZHRoID09PSB1bmRlZmluZWQgPyAwLjAgOiBNYXRoLm1heChvcHRpb25zLmdyaWRMaW5lV2lkdGgsIDAuMCk7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG4gIC8qKlxyXG4gICAqIFJlbmRlcnMgdGhlIGVmZmVjdC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7V2ViR0xSZW5kZXJlcn0gcmVuZGVyZXIgLSBUaGUgcmVuZGVyZXIuXHJcbiAgICogQHBhcmFtIHtXZWJHTFJlbmRlclRhcmdldH0gaW5wdXRCdWZmZXIgLSBBIGZyYW1lIGJ1ZmZlciB0aGF0IGNvbnRhaW5zIHRoZSByZXN1bHQgb2YgdGhlIHByZXZpb3VzIHBhc3MuXHJcbiAgICogQHBhcmFtIHtXZWJHTFJlbmRlclRhcmdldH0gb3V0cHV0QnVmZmVyIC0gQSBmcmFtZSBidWZmZXIgdGhhdCBzZXJ2ZXMgYXMgdGhlIG91dHB1dCByZW5kZXIgdGFyZ2V0IHVubGVzcyB0aGlzIHBhc3MgcmVuZGVycyB0byBzY3JlZW4uXHJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtkZWx0YV0gLSBUaGUgdGltZSBiZXR3ZWVuIHRoZSBsYXN0IGZyYW1lIGFuZCB0aGUgY3VycmVudCBvbmUgaW4gc2Vjb25kcy5cclxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtzdGVuY2lsVGVzdF0gLSBJbmRpY2F0ZXMgd2hldGhlciBhIHN0ZW5jaWwgbWFzayBpcyBhY3RpdmUuXHJcbiAgICovXG5cblxuICBjcmVhdGVDbGFzcyhGaWxtUGFzcywgW3tcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcihyZW5kZXJlciwgaW5wdXRCdWZmZXIsIG91dHB1dEJ1ZmZlciwgZGVsdGEsIHN0ZW5jaWxUZXN0KSB7XG4gICAgICB0aGlzLm1hdGVyaWFsLnVuaWZvcm1zLnREaWZmdXNlLnZhbHVlID0gaW5wdXRCdWZmZXIudGV4dHVyZTtcbiAgICAgIHRoaXMubWF0ZXJpYWwudW5pZm9ybXMudGltZS52YWx1ZSArPSBkZWx0YTtcbiAgICAgIHJlbmRlcmVyLnJlbmRlcih0aGlzLnNjZW5lLCB0aGlzLmNhbWVyYSwgdGhpcy5yZW5kZXJUb1NjcmVlbiA/IG51bGwgOiBvdXRwdXRCdWZmZXIpO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIFVwZGF0ZXMgdGhlIHNpemUgb2YgdGhpcyBwYXNzLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSB3aWR0aCAtIFRoZSB3aWR0aC5cclxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0LlxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJzZXRTaXplXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldFNpemUod2lkdGgsIGhlaWdodCkge1xuICAgICAgdmFyIGFzcGVjdCA9IHdpZHRoIC8gaGVpZ2h0O1xuICAgICAgdmFyIGdyaWRTY2FsZSA9IHRoaXMuZ3JpZFNjYWxlICogKGhlaWdodCAqIDAuMTI1KTtcbiAgICAgIHRoaXMubWF0ZXJpYWwudW5pZm9ybXMuc2NhbmxpbmVDb3VudC52YWx1ZSA9IE1hdGgucm91bmQoaGVpZ2h0ICogdGhpcy5zY2FubGluZURlbnNpdHkpO1xuICAgICAgdGhpcy5tYXRlcmlhbC51bmlmb3Jtcy5ncmlkU2NhbGUudmFsdWUuc2V0KGFzcGVjdCAqIGdyaWRTY2FsZSwgZ3JpZFNjYWxlKTtcbiAgICAgIHRoaXMubWF0ZXJpYWwudW5pZm9ybXMuZ3JpZExpbmVXaWR0aC52YWx1ZSA9IGdyaWRTY2FsZSAvIGhlaWdodCArIHRoaXMuZ3JpZExpbmVXaWR0aDtcbiAgICB9XG4gIH1dKTtcblxuICBpbmhlcml0cyhGaWxtUGFzcywgX1Bhc3MpO1xuXG4gIHJldHVybiBGaWxtUGFzcztcbn0oUGFzcyk7XG5cbi8qKlxyXG4gKiBSZXR1cm5zIGEgcmFuZG9tIGludGVnZXIgaW4gdGhlIHNwZWNpZmllZCByYW5nZS5cclxuICpcclxuICogQHByaXZhdGVcclxuICogQHBhcmFtIHtOdW1iZXJ9IGxvdyAtIFRoZSBsb3dlc3QgcG9zc2libGUgdmFsdWUuXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBoaWdoIC0gVGhlIGhpZ2hlc3QgcG9zc2libGUgdmFsdWUuXHJcbiAqIEByZXR1cm4ge051bWJlcn0gVGhlIHJhbmRvbSB2YWx1ZS5cclxuICovXG5cbmZ1bmN0aW9uIHJhbmRvbUludChsb3csIGhpZ2gpIHtcbiAgcmV0dXJuIGxvdyArIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChoaWdoIC0gbG93ICsgMSkpO1xufVxuLyoqXHJcbiAqIFJldHVybnMgYSByYW5kb20gZmxvYXQgaW4gdGhlIHNwZWNpZmllZCByYW5nZS5cclxuICpcclxuICogQHByaXZhdGVcclxuICogQHBhcmFtIHtOdW1iZXJ9IGxvdyAtIFRoZSBsb3dlc3QgcG9zc2libGUgdmFsdWUuXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBoaWdoIC0gVGhlIGhpZ2hlc3QgcG9zc2libGUgdmFsdWUuXHJcbiAqIEByZXR1cm4ge051bWJlcn0gVGhlIHJhbmRvbSB2YWx1ZS5cclxuICovXG5cblxuZnVuY3Rpb24gcmFuZG9tRmxvYXQobG93LCBoaWdoKSB7XG4gIHJldHVybiBsb3cgKyBNYXRoLnJhbmRvbSgpICogKGhpZ2ggLSBsb3cpO1xufVxuLyoqXHJcbiAqIEEgZ2xpdGNoIHBhc3MuXHJcbiAqL1xuXG5cbnZhciBHbGl0Y2hQYXNzID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfUGFzcykge1xuICAvKipcclxuICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGdsaXRjaCBwYXNzLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIFRoZSBvcHRpb25zLlxyXG4gICAqIEBwYXJhbSB7VGV4dHVyZX0gW29wdGlvbnMucGVydHVyYk1hcF0gLSBBIHBlcnR1cmJhdGlvbiBtYXAuIElmIG5vbmUgaXMgcHJvdmlkZWQsIGEgbm9pc2UgdGV4dHVyZSB3aWxsIGJlIGNyZWF0ZWQuXHJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmR0U2l6ZT02NF0gLSBUaGUgc2l6ZSBvZiB0aGUgZ2VuZXJhdGVkIG5vaXNlIG1hcC4gV2lsbCBiZSBpZ25vcmVkIGlmIGEgcGVydHVyYmF0aW9uIG1hcCBpcyBwcm92aWRlZC5cclxuICAgKi9cbiAgZnVuY3Rpb24gR2xpdGNoUGFzcygpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBHbGl0Y2hQYXNzKTtcblxuICAgIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBnZXRQcm90b3R5cGVPZiQyKEdsaXRjaFBhc3MpLmNhbGwodGhpcywgXCJHbGl0Y2hQYXNzXCIpKTtcbiAgICBfdGhpcy5tYXRlcmlhbCA9IG5ldyBHbGl0Y2hNYXRlcmlhbCgpO1xuICAgIC8qKlxyXG4gICAgICogQSBwZXJ0dXJiYXRpb24gbWFwLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtUZXh0dXJlfVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xuXG4gICAgX3RoaXMudGV4dHVyZSA9IG51bGw7XG4gICAgX3RoaXMucGVydHVyYk1hcCA9IG9wdGlvbnMucGVydHVyYk1hcCAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5wZXJ0dXJiTWFwIDogX3RoaXMuZ2VuZXJhdGVQZXJ0dXJiTWFwKG9wdGlvbnMuZHRTaXplKTtcbiAgICBfdGhpcy5wZXJ0dXJiTWFwLm5hbWUgPSBcIkdsaXRjaC5QZXJ0dXJiYXRpb25cIjtcbiAgICBfdGhpcy5wZXJ0dXJiTWFwLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlO1xuICAgIC8qKlxyXG4gICAgICogVGhlIGVmZmVjdCBtb2RlLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtHbGl0Y2hNb2RlfVxyXG4gICAgICovXG5cbiAgICBfdGhpcy5tb2RlID0gR2xpdGNoTW9kZS5TUE9SQURJQztcbiAgICAvKipcclxuICAgICAqIEEgY291bnRlciBmb3IgdGhlIGdsaXRjaCBhY3RpdmF0aW9uIGFuZCBkZWFjdGl2YXRpb24uXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge051bWJlcn1cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cblxuICAgIF90aGlzLmNvdW50ZXIgPSAwO1xuICAgIC8qKlxyXG4gICAgICogQSByYW5kb20gYnJlYWsgcG9pbnQgZm9yIHRoZSBzcG9yYWRpYyBnbGl0Y2ggYWN0aXZhdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7TnVtYmVyfVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xuXG4gICAgX3RoaXMuYnJlYWtQb2ludCA9IHJhbmRvbUludCgxMjAsIDI0MCk7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG4gIC8qKlxyXG4gICAqIFRoZSBjdXJyZW50IHBlcnR1cmJhdGlvbiBtYXAuXHJcbiAgICpcclxuICAgKiBAdHlwZSB7VGV4dHVyZX1cclxuICAgKi9cblxuXG4gIGNyZWF0ZUNsYXNzKEdsaXRjaFBhc3MsIFt7XG4gICAga2V5OiBcImdlbmVyYXRlUGVydHVyYk1hcFwiLFxuXG4gICAgLyoqXHJcbiAgICAgKiBEZXN0cm95cyB0aGUgY3VycmVudCBwZXJ0dXJiYXRpb24gbWFwIGFuZCByZXBsYWNlcyBpdCB3aXRoIGEgbmV3IG9uZS5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gW3NpemU9NjRdIC0gVGhlIHRleHR1cmUgc2l6ZS5cclxuICAgICAqIEByZXR1cm4ge0RhdGFUZXh0dXJlfSBUaGUgcGVydHVyYmF0aW9uIHRleHR1cmUuXHJcbiAgICAgKi9cbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2VuZXJhdGVQZXJ0dXJiTWFwKCkge1xuICAgICAgdmFyIHNpemUgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IDY0O1xuICAgICAgdmFyIHBpeGVscyA9IHNpemUgKiBzaXplO1xuICAgICAgdmFyIGRhdGEgPSBuZXcgRmxvYXQzMkFycmF5KHBpeGVscyAqIDMpO1xuICAgICAgdmFyIGR0ID0gdGhpcy5wZXJ0dXJiTWFwO1xuICAgICAgdmFyIGksIHg7XG5cbiAgICAgIGZvciAoaSA9IDA7IGkgPCBwaXhlbHM7ICsraSkge1xuICAgICAgICB4ID0gTWF0aC5yYW5kb20oKTtcbiAgICAgICAgZGF0YVtpICogM10gPSB4O1xuICAgICAgICBkYXRhW2kgKiAzICsgMV0gPSB4O1xuICAgICAgICBkYXRhW2kgKiAzICsgMl0gPSB4O1xuICAgICAgfVxuXG4gICAgICBpZiAoZHQgIT09IG51bGwpIHtcbiAgICAgICAgZHQuZGlzcG9zZSgpO1xuICAgICAgfVxuXG4gICAgICBkdCA9IG5ldyBEYXRhVGV4dHVyZShkYXRhLCBzaXplLCBzaXplLCBSR0JGb3JtYXQsIEZsb2F0VHlwZSk7XG4gICAgICBkdC5uZWVkc1VwZGF0ZSA9IHRydWU7XG4gICAgICB0aGlzLnBlcnR1cmJNYXAgPSBkdDtcbiAgICAgIHJldHVybiBkdDtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBSZW5kZXJzIHRoZSBlZmZlY3QuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtXZWJHTFJlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlci5cclxuICAgICAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IGlucHV0QnVmZmVyIC0gQSBmcmFtZSBidWZmZXIgdGhhdCBjb250YWlucyB0aGUgcmVzdWx0IG9mIHRoZSBwcmV2aW91cyBwYXNzLlxyXG4gICAgICogQHBhcmFtIHtXZWJHTFJlbmRlclRhcmdldH0gb3V0cHV0QnVmZmVyIC0gQSBmcmFtZSBidWZmZXIgdGhhdCBzZXJ2ZXMgYXMgdGhlIG91dHB1dCByZW5kZXIgdGFyZ2V0IHVubGVzcyB0aGlzIHBhc3MgcmVuZGVycyB0byBzY3JlZW4uXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gW2RlbHRhXSAtIFRoZSB0aW1lIGJldHdlZW4gdGhlIGxhc3QgZnJhbWUgYW5kIHRoZSBjdXJyZW50IG9uZSBpbiBzZWNvbmRzLlxyXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBbc3RlbmNpbFRlc3RdIC0gSW5kaWNhdGVzIHdoZXRoZXIgYSBzdGVuY2lsIG1hc2sgaXMgYWN0aXZlLlxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKHJlbmRlcmVyLCBpbnB1dEJ1ZmZlciwgb3V0cHV0QnVmZmVyLCBkZWx0YSwgc3RlbmNpbFRlc3QpIHtcbiAgICAgIHZhciBtb2RlID0gdGhpcy5tb2RlO1xuICAgICAgdmFyIGNvdW50ZXIgPSB0aGlzLmNvdW50ZXI7XG4gICAgICB2YXIgYnJlYWtQb2ludCA9IHRoaXMuYnJlYWtQb2ludDtcbiAgICAgIHZhciB1bmlmb3JtcyA9IHRoaXMubWF0ZXJpYWwudW5pZm9ybXM7XG4gICAgICB1bmlmb3Jtcy50RGlmZnVzZS52YWx1ZSA9IGlucHV0QnVmZmVyLnRleHR1cmU7XG4gICAgICB1bmlmb3Jtcy5zZWVkLnZhbHVlID0gTWF0aC5yYW5kb20oKTtcbiAgICAgIHVuaWZvcm1zLmFjdGl2ZS52YWx1ZSA9IHRydWU7XG5cbiAgICAgIGlmIChjb3VudGVyICUgYnJlYWtQb2ludCA9PT0gMCB8fCBtb2RlID09PSBHbGl0Y2hNb2RlLkNPTlNUQU5UX1dJTEQpIHtcbiAgICAgICAgdW5pZm9ybXMuYW1vdW50LnZhbHVlID0gTWF0aC5yYW5kb20oKSAvIDMwLjA7XG4gICAgICAgIHVuaWZvcm1zLmFuZ2xlLnZhbHVlID0gcmFuZG9tRmxvYXQoLU1hdGguUEksIE1hdGguUEkpO1xuICAgICAgICB1bmlmb3Jtcy5zZWVkWC52YWx1ZSA9IHJhbmRvbUZsb2F0KC0xLjAsIDEuMCk7XG4gICAgICAgIHVuaWZvcm1zLnNlZWRZLnZhbHVlID0gcmFuZG9tRmxvYXQoLTEuMCwgMS4wKTtcbiAgICAgICAgdW5pZm9ybXMuZGlzdG9ydGlvblgudmFsdWUgPSByYW5kb21GbG9hdCgwLjAsIDEuMCk7XG4gICAgICAgIHVuaWZvcm1zLmRpc3RvcnRpb25ZLnZhbHVlID0gcmFuZG9tRmxvYXQoMC4wLCAxLjApO1xuICAgICAgICB0aGlzLmJyZWFrUG9pbnQgPSByYW5kb21JbnQoMTIwLCAyNDApO1xuICAgICAgICB0aGlzLmNvdW50ZXIgPSAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGNvdW50ZXIgJSBicmVha1BvaW50IDwgYnJlYWtQb2ludCAvIDUgfHwgbW9kZSA9PT0gR2xpdGNoTW9kZS5DT05TVEFOVF9NSUxEKSB7XG4gICAgICAgICAgdW5pZm9ybXMuYW1vdW50LnZhbHVlID0gTWF0aC5yYW5kb20oKSAvIDkwLjA7XG4gICAgICAgICAgdW5pZm9ybXMuYW5nbGUudmFsdWUgPSByYW5kb21GbG9hdCgtTWF0aC5QSSwgTWF0aC5QSSk7XG4gICAgICAgICAgdW5pZm9ybXMuZGlzdG9ydGlvblgudmFsdWUgPSByYW5kb21GbG9hdCgwLjAsIDEuMCk7XG4gICAgICAgICAgdW5pZm9ybXMuZGlzdG9ydGlvblkudmFsdWUgPSByYW5kb21GbG9hdCgwLjAsIDEuMCk7XG4gICAgICAgICAgdW5pZm9ybXMuc2VlZFgudmFsdWUgPSByYW5kb21GbG9hdCgtMC4zLCAwLjMpO1xuICAgICAgICAgIHVuaWZvcm1zLnNlZWRZLnZhbHVlID0gcmFuZG9tRmxvYXQoLTAuMywgMC4zKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBTcG9yYWRpYy5cbiAgICAgICAgICB1bmlmb3Jtcy5hY3RpdmUudmFsdWUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICArK3RoaXMuY291bnRlcjtcbiAgICAgIHJlbmRlcmVyLnJlbmRlcih0aGlzLnNjZW5lLCB0aGlzLmNhbWVyYSwgdGhpcy5yZW5kZXJUb1NjcmVlbiA/IG51bGwgOiBvdXRwdXRCdWZmZXIpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJwZXJ0dXJiTWFwXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy50ZXh0dXJlO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEFzc2lnbmluZyBhIG5ldyBwZXJ0dXJiYXRpb24gbWFwIGRvZXMgbm90IGRlc3Ryb3kgdGhlIGN1cnJlbnQgb25lIVxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtUZXh0dXJlfVxyXG4gICAgICovXG4gICAgLFxuICAgIHNldDogZnVuY3Rpb24gc2V0KHZhbHVlKSB7XG4gICAgICB0aGlzLnRleHR1cmUgPSB2YWx1ZTtcbiAgICAgIHRoaXMubWF0ZXJpYWwudW5pZm9ybXMudFBlcnR1cmIudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gIH1dKTtcblxuICBpbmhlcml0cyhHbGl0Y2hQYXNzLCBfUGFzcyk7XG5cbiAgcmV0dXJuIEdsaXRjaFBhc3M7XG59KFBhc3MpO1xuLyoqXHJcbiAqIEEgZ2xpdGNoIG1vZGUgZW51bWVyYXRpb24uXHJcbiAqXHJcbiAqIEB0eXBlIHtPYmplY3R9XHJcbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBTUE9SQURJQyAtIFNwb3JhZGljIGdsaXRjaGVzLlxyXG4gKiBAcHJvcGVydHkge051bWJlcn0gQ09OU1RBTlRfTUlMRCAtIENvbnN0YW50IG1pbGQgZ2xpdGNoZXMuXHJcbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBDT05TVEFOVF9XSUxEIC0gQ29uc3RhbnQgd2lsZCBnbGl0Y2hlcy5cclxuICovXG5cbnZhciBHbGl0Y2hNb2RlID0ge1xuICBTUE9SQURJQzogMCxcbiAgQ09OU1RBTlRfTUlMRDogMSxcbiAgQ09OU1RBTlRfV0lMRDogMlxufTtcblxuLyoqXHJcbiAqIEEgcGFzcyB0aGF0IHJlbmRlcnMgYSBnaXZlbiBzY2VuZSBkaXJlY3RseSBvbiBzY3JlZW4gb3IgaW50byB0aGUgcmVhZCBidWZmZXJcclxuICogZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZy5cclxuICovXG5cbnZhciBSZW5kZXJQYXNzID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfUGFzcykge1xuICAvKipcclxuICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHJlbmRlciBwYXNzLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtTY2VuZX0gc2NlbmUgLSBUaGUgc2NlbmUgdG8gcmVuZGVyLlxyXG4gICAqIEBwYXJhbSB7Q2FtZXJhfSBjYW1lcmEgLSBUaGUgY2FtZXJhIHRvIHVzZSB0byByZW5kZXIgdGhlIHNjZW5lLlxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gLSBBZGRpdGlvbmFsIG9wdGlvbnMuXHJcbiAgICogQHBhcmFtIHtNYXRlcmlhbH0gW29wdGlvbnMub3ZlcnJpZGVNYXRlcmlhbD1udWxsXSAtIEFuIG92ZXJyaWRlIG1hdGVyaWFsIGZvciB0aGUgc2NlbmUuXHJcbiAgICogQHBhcmFtIHtDb2xvcn0gW29wdGlvbnMuY2xlYXJDb2xvcj1udWxsXSAtIEFuIG92ZXJyaWRlIGNsZWFyIGNvbG9yLlxyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5jbGVhckFscGhhPTEuMF0gLSBBbiBvdmVycmlkZSBjbGVhciBhbHBoYS5cclxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmNsZWFyRGVwdGg9ZmFsc2VdIC0gV2hldGhlciBkZXB0aCBzaG91bGQgYmUgY2xlYXJlZCBleHBsaWNpdGx5LlxyXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuY2xlYXI9dHJ1ZV0gLSBXaGV0aGVyIGFsbCBidWZmZXJzIHNob3VsZCBiZSBjbGVhcmVkLlxyXG4gICAqL1xuICBmdW5jdGlvbiBSZW5kZXJQYXNzKHNjZW5lLCBjYW1lcmEpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDoge307XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBSZW5kZXJQYXNzKTtcblxuICAgIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBnZXRQcm90b3R5cGVPZiQyKFJlbmRlclBhc3MpLmNhbGwodGhpcywgXCJSZW5kZXJQYXNzXCIsIHNjZW5lLCBjYW1lcmEsIG51bGwpKTtcbiAgICBfdGhpcy5uZWVkc1N3YXAgPSBmYWxzZTtcbiAgICAvKipcclxuICAgICAqIEEgY2xlYXIgcGFzcy5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7Q2xlYXJQYXNzfVxyXG4gICAgICovXG5cbiAgICBfdGhpcy5jbGVhclBhc3MgPSBuZXcgQ2xlYXJQYXNzKG9wdGlvbnMpO1xuICAgIC8qKlxyXG4gICAgICogQW4gb3ZlcnJpZGUgbWF0ZXJpYWwuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge01hdGVyaWFsfVxyXG4gICAgICovXG5cbiAgICBfdGhpcy5vdmVycmlkZU1hdGVyaWFsID0gb3B0aW9ucy5vdmVycmlkZU1hdGVyaWFsICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLm92ZXJyaWRlTWF0ZXJpYWwgOiBudWxsO1xuICAgIC8qKlxyXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGRlcHRoIGJ1ZmZlciBzaG91bGQgYmUgY2xlYXJlZCBleHBsaWNpdGx5LlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtCb29sZWFufVxyXG4gICAgICovXG5cbiAgICBfdGhpcy5jbGVhckRlcHRoID0gb3B0aW9ucy5jbGVhckRlcHRoICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmNsZWFyRGVwdGggOiBmYWxzZTtcbiAgICAvKipcclxuICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBjb2xvciwgZGVwdGggYW5kIHN0ZW5jaWwgYnVmZmVycyBzaG91bGQgYmUgY2xlYXJlZC5cclxuICAgICAqXHJcbiAgICAgKiBFdmVuIHdpdGggY2xlYXIgc2V0IHRvIHRydWUgeW91IGNhbiBwcmV2ZW50IHNwZWNpZmljIGJ1ZmZlcnMgZnJvbSBiZWluZ1xyXG4gICAgICogY2xlYXJlZCBieSBzZXR0aW5nIGVpdGhlciB0aGUgYXV0b0NsZWFyQ29sb3IsIGF1dG9DbGVhclN0ZW5jaWwgb3JcclxuICAgICAqIGF1dG9DbGVhckRlcHRoIHByb3BlcnRpZXMgb2YgdGhlIHJlbmRlcmVyIHRvIGZhbHNlLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtCb29sZWFufVxyXG4gICAgICovXG5cbiAgICBfdGhpcy5jbGVhciA9IG9wdGlvbnMuY2xlYXIgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuY2xlYXIgOiB0cnVlO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuICAvKipcclxuICAgKiBSZW5kZXJzIHRoZSBzY2VuZS5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7V2ViR0xSZW5kZXJlcn0gcmVuZGVyZXIgLSBUaGUgcmVuZGVyZXIuXHJcbiAgICogQHBhcmFtIHtXZWJHTFJlbmRlclRhcmdldH0gaW5wdXRCdWZmZXIgLSBBIGZyYW1lIGJ1ZmZlciB0aGF0IGNvbnRhaW5zIHRoZSByZXN1bHQgb2YgdGhlIHByZXZpb3VzIHBhc3MuXHJcbiAgICogQHBhcmFtIHtXZWJHTFJlbmRlclRhcmdldH0gb3V0cHV0QnVmZmVyIC0gQSBmcmFtZSBidWZmZXIgdGhhdCBzZXJ2ZXMgYXMgdGhlIG91dHB1dCByZW5kZXIgdGFyZ2V0IHVubGVzcyB0aGlzIHBhc3MgcmVuZGVycyB0byBzY3JlZW4uXHJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtkZWx0YV0gLSBUaGUgdGltZSBiZXR3ZWVuIHRoZSBsYXN0IGZyYW1lIGFuZCB0aGUgY3VycmVudCBvbmUgaW4gc2Vjb25kcy5cclxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtzdGVuY2lsVGVzdF0gLSBJbmRpY2F0ZXMgd2hldGhlciBhIHN0ZW5jaWwgbWFzayBpcyBhY3RpdmUuXHJcbiAgICovXG5cblxuICBjcmVhdGVDbGFzcyhSZW5kZXJQYXNzLCBbe1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKHJlbmRlcmVyLCBpbnB1dEJ1ZmZlciwgb3V0cHV0QnVmZmVyLCBkZWx0YSwgc3RlbmNpbFRlc3QpIHtcbiAgICAgIHZhciBzY2VuZSA9IHRoaXMuc2NlbmU7XG4gICAgICB2YXIgcmVuZGVyVGFyZ2V0ID0gdGhpcy5yZW5kZXJUb1NjcmVlbiA/IG51bGwgOiBpbnB1dEJ1ZmZlcjtcbiAgICAgIHZhciBvdmVycmlkZU1hdGVyaWFsID0gc2NlbmUub3ZlcnJpZGVNYXRlcmlhbDtcblxuICAgICAgaWYgKHRoaXMuY2xlYXIpIHtcbiAgICAgICAgdGhpcy5jbGVhclBhc3MucmVuZGVyVG9TY3JlZW4gPSB0aGlzLnJlbmRlclRvU2NyZWVuO1xuICAgICAgICB0aGlzLmNsZWFyUGFzcy5yZW5kZXIocmVuZGVyZXIsIGlucHV0QnVmZmVyKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5jbGVhckRlcHRoKSB7XG4gICAgICAgIHJlbmRlcmVyLnNldFJlbmRlclRhcmdldChyZW5kZXJUYXJnZXQpO1xuICAgICAgICByZW5kZXJlci5jbGVhckRlcHRoKCk7XG4gICAgICB9XG5cbiAgICAgIHNjZW5lLm92ZXJyaWRlTWF0ZXJpYWwgPSB0aGlzLm92ZXJyaWRlTWF0ZXJpYWw7XG4gICAgICByZW5kZXJlci5yZW5kZXIoc2NlbmUsIHRoaXMuY2FtZXJhLCByZW5kZXJUYXJnZXQpO1xuICAgICAgc2NlbmUub3ZlcnJpZGVNYXRlcmlhbCA9IG92ZXJyaWRlTWF0ZXJpYWw7XG4gICAgfVxuICB9XSk7XG5cbiAgaW5oZXJpdHMoUmVuZGVyUGFzcywgX1Bhc3MpO1xuXG4gIHJldHVybiBSZW5kZXJQYXNzO1xufShQYXNzKTtcblxuLyoqXHJcbiAqIENsYW1wcyBhIGdpdmVuIHZhbHVlLlxyXG4gKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKiBAcGFyYW0ge051bWJlcn0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gY2xhbXAuXHJcbiAqIEBwYXJhbSB7TnVtYmVyfSBtaW4gLSBUaGUgbG93ZXN0IHBvc3NpYmxlIHZhbHVlLlxyXG4gKiBAcGFyYW0ge051bWJlcn0gbWF4IC0gVGhlIGhpZ2hlc3QgcG9zc2libGUgdmFsdWUuXHJcbiAqIEByZXR1cm4ge051bWJlcn0gVGhlIGNsYW1wZWQgdmFsdWUuXHJcbiAqL1xuXG5mdW5jdGlvbiBjbGFtcCh2YWx1ZSwgbWluLCBtYXgpIHtcbiAgcmV0dXJuIE1hdGgubWF4KG1pbiwgTWF0aC5taW4obWF4LCB2YWx1ZSkpO1xufVxuLyoqXHJcbiAqIEEgY3JlcHVzY3VsYXIgcmF5cyBwYXNzLlxyXG4gKi9cblxuXG52YXIgR29kUmF5c1Bhc3MgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9QYXNzKSB7XG4gIC8qKlxyXG4gICAqIENvbnN0cnVjdHMgYSBuZXcgZ29kIHJheXMgcGFzcy5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7U2NlbmV9IHNjZW5lIC0gVGhlIG1haW4gc2NlbmUuXHJcbiAgICogQHBhcmFtIHtDYW1lcmF9IGNhbWVyYSAtIFRoZSBtYWluIGNhbWVyYS5cclxuICAgKiBAcGFyYW0ge09iamVjdDNEfSBsaWdodFNvdXJjZSAtIFRoZSBtYWluIGxpZ2h0IHNvdXJjZS5cclxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gVGhlIG9wdGlvbnMuXHJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmRlbnNpdHk9MC45Nl0gLSBUaGUgZGVuc2l0eSBvZiB0aGUgbGlnaHQgcmF5cy5cclxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuZGVjYXk9MC45M10gLSBBbiBpbGx1bWluYXRpb24gZGVjYXkgZmFjdG9yLlxyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy53ZWlnaHQ9MC40XSAtIEEgbGlnaHQgcmF5IHdlaWdodCBmYWN0b3IuXHJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmV4cG9zdXJlPTAuNl0gLSBBIGNvbnN0YW50IGF0dGVudWF0aW9uIGNvZWZmaWNpZW50LlxyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5jbGFtcE1heD0xLjBdIC0gQW4gdXBwZXIgYm91bmQgZm9yIHRoZSBzYXR1cmF0aW9uIG9mIHRoZSBvdmVyYWxsIGVmZmVjdC5cclxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuaW50ZW5zaXR5PTEuMF0gLSBBIGNvbnN0YW50IGZhY3RvciBmb3IgYWRkaXRpdmUgYmxlbmRpbmcuXHJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLnJlc29sdXRpb25TY2FsZT0wLjVdIC0gVGhlIHJlbmRlciB0ZXh0dXJlIHJlc29sdXRpb24gc2NhbGUsIHJlbGF0aXZlIHRvIHRoZSBzY3JlZW4gcmVuZGVyIHNpemUuXHJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmtlcm5lbFNpemU9S2VybmVsU2l6ZS5MQVJHRV0gLSBUaGUgYmx1ciBrZXJuZWwgc2l6ZS5cclxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMuc2FtcGxlcz02MF0gLSBUaGUgbnVtYmVyIG9mIHNhbXBsZXMgcGVyIHBpeGVsLlxyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5zY3JlZW5Nb2RlPXRydWVdIC0gV2hldGhlciB0aGUgc2NyZWVuIGJsZW5kIG1vZGUgc2hvdWxkIGJlIHVzZWQgZm9yIGNvbWJpbmluZyB0aGUgZ29kIHJheXMgdGV4dHVyZSB3aXRoIHRoZSBzY2VuZSBjb2xvcnMuXHJcbiAgICovXG4gIGZ1bmN0aW9uIEdvZFJheXNQYXNzKHNjZW5lLCBjYW1lcmEsIGxpZ2h0U291cmNlKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6IHt9O1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgR29kUmF5c1Bhc3MpO1xuXG4gICAgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIGdldFByb3RvdHlwZU9mJDIoR29kUmF5c1Bhc3MpLmNhbGwodGhpcywgXCJHb2RSYXlzUGFzc1wiKSk7XG4gICAgLyoqXHJcbiAgICAgKiBBIHNjZW5lIHRoYXQgb25seSBjb250YWlucyB0aGUgbGlnaHQgc291cmNlLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtTY2VuZX1cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cblxuICAgIF90aGlzLmxpZ2h0U2NlbmUgPSBuZXcgU2NlbmUoKTtcbiAgICAvKipcclxuICAgICAqIFRoZSBtYWluIHNjZW5lLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtTY2VuZX1cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cblxuICAgIF90aGlzLm1haW5TY2VuZSA9IHNjZW5lO1xuICAgIC8qKlxyXG4gICAgICogVGhlIG1haW4gY2FtZXJhLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtDYW1lcmF9XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXG5cbiAgICBfdGhpcy5tYWluQ2FtZXJhID0gY2FtZXJhO1xuICAgIC8qKlxyXG4gICAgICogQSByZW5kZXIgdGFyZ2V0LlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtXZWJHTFJlbmRlclRhcmdldH1cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cblxuICAgIF90aGlzLnJlbmRlclRhcmdldFggPSBuZXcgV2ViR0xSZW5kZXJUYXJnZXQoMSwgMSwge1xuICAgICAgbWluRmlsdGVyOiBMaW5lYXJGaWx0ZXIsXG4gICAgICBtYWdGaWx0ZXI6IExpbmVhckZpbHRlcixcbiAgICAgIHN0ZW5jaWxCdWZmZXI6IGZhbHNlLFxuICAgICAgZGVwdGhCdWZmZXI6IGZhbHNlXG4gICAgfSk7XG4gICAgX3RoaXMucmVuZGVyVGFyZ2V0WC50ZXh0dXJlLm5hbWUgPSBcIkdvZFJheXMuVGFyZ2V0WFwiO1xuICAgIF90aGlzLnJlbmRlclRhcmdldFgudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgPSBmYWxzZTtcbiAgICAvKipcclxuICAgICAqIEEgc2Vjb25kIHJlbmRlciB0YXJnZXQuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge1dlYkdMUmVuZGVyVGFyZ2V0fVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xuXG4gICAgX3RoaXMucmVuZGVyVGFyZ2V0WSA9IF90aGlzLnJlbmRlclRhcmdldFguY2xvbmUoKTtcbiAgICBfdGhpcy5yZW5kZXJUYXJnZXRZLnRleHR1cmUubmFtZSA9IFwiR29kUmF5cy5UYXJnZXRZXCI7XG4gICAgLyoqXHJcbiAgICAgKiBBIHJlbmRlciB0YXJnZXQgZm9yIHRoZSBtYXNrZWQgbGlnaHQgc2NlbmUuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge1dlYkdMUmVuZGVyVGFyZ2V0fVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xuXG4gICAgX3RoaXMucmVuZGVyVGFyZ2V0TWFzayA9IG5ldyBXZWJHTFJlbmRlclRhcmdldCgxLCAxLCB7XG4gICAgICBtaW5GaWx0ZXI6IExpbmVhckZpbHRlcixcbiAgICAgIG1hZ0ZpbHRlcjogTGluZWFyRmlsdGVyXG4gICAgfSk7XG4gICAgX3RoaXMucmVuZGVyVGFyZ2V0TWFzay50ZXh0dXJlLm5hbWUgPSBcIkdvZFJheXMuTWFza1wiO1xuICAgIF90aGlzLnJlbmRlclRhcmdldE1hc2sudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgPSBmYWxzZTtcbiAgICAvKipcclxuICAgICAqIEEgcGFzcyB0aGF0IG9ubHkgcmVuZGVycyB0aGUgbGlnaHQgc291cmNlLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtSZW5kZXJQYXNzfVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xuXG4gICAgX3RoaXMucmVuZGVyUGFzc0xpZ2h0ID0gbmV3IFJlbmRlclBhc3MoX3RoaXMubGlnaHRTY2VuZSwgX3RoaXMubWFpbkNhbWVyYSwge1xuICAgICAgY2xlYXJDb2xvcjogbmV3IENvbG9yKDB4MDAwMDAwKVxuICAgIH0pO1xuICAgIC8qKlxyXG4gICAgICogQSBwYXNzIHRoYXQgcmVuZGVycyB0aGUgbWFza2VkIHNjZW5lIG92ZXIgdGhlIGxpZ2h0LlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtSZW5kZXJQYXNzfVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xuXG4gICAgX3RoaXMucmVuZGVyUGFzc01hc2sgPSBuZXcgUmVuZGVyUGFzcyhfdGhpcy5tYWluU2NlbmUsIF90aGlzLm1haW5DYW1lcmEsIHtcbiAgICAgIG92ZXJyaWRlTWF0ZXJpYWw6IG5ldyBNZXNoQmFzaWNNYXRlcmlhbCh7XG4gICAgICAgIGNvbG9yOiAweDAwMDAwMFxuICAgICAgfSlcbiAgICB9KTtcbiAgICBfdGhpcy5yZW5kZXJQYXNzTWFzay5jbGVhciA9IGZhbHNlO1xuICAgIC8qKlxyXG4gICAgICogQSBibHVyIHBhc3MuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge0JsdXJQYXNzfVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xuXG4gICAgX3RoaXMuYmx1clBhc3MgPSBuZXcgQmx1clBhc3Mob3B0aW9ucyk7XG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbGlnaHQgc291cmNlLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtPYmplY3QzRH1cclxuICAgICAqL1xuXG4gICAgX3RoaXMubGlnaHRTb3VyY2UgPSBsaWdodFNvdXJjZTtcbiAgICAvKipcclxuICAgICAqIFRoZSBsaWdodCBwb3NpdGlvbiBpbiBzY3JlZW4gc3BhY2UuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge1ZlY3RvcjN9XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXG5cbiAgICBfdGhpcy5zY3JlZW5Qb3NpdGlvbiA9IG5ldyBWZWN0b3IzKCk7XG4gICAgLyoqXHJcbiAgICAgKiBBIGdvZCByYXlzIHNoYWRlciBtYXRlcmlhbC5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7R29kUmF5c01hdGVyaWFsfVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xuXG4gICAgX3RoaXMuZ29kUmF5c01hdGVyaWFsID0gbmV3IEdvZFJheXNNYXRlcmlhbChvcHRpb25zKTtcbiAgICBfdGhpcy5nb2RSYXlzTWF0ZXJpYWwudW5pZm9ybXMubGlnaHRQb3NpdGlvbi52YWx1ZSA9IF90aGlzLnNjcmVlblBvc2l0aW9uO1xuICAgIF90aGlzLnNhbXBsZXMgPSBvcHRpb25zLnNhbXBsZXM7XG4gICAgLyoqXHJcbiAgICAgKiBBIGNvbWJpbmUgc2hhZGVyIG1hdGVyaWFsLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtDb21iaW5lTWF0ZXJpYWx9XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXG5cbiAgICBfdGhpcy5jb21iaW5lTWF0ZXJpYWwgPSBuZXcgQ29tYmluZU1hdGVyaWFsKG9wdGlvbnMuc2NyZWVuTW9kZSAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5zY3JlZW5Nb2RlIDogdHJ1ZSk7XG4gICAgX3RoaXMuaW50ZW5zaXR5ID0gb3B0aW9ucy5pbnRlbnNpdHk7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG4gIC8qKlxyXG4gICAqIFRoZSByZXNvbHV0aW9uIHNjYWxlLlxyXG4gICAqXHJcbiAgICogQHR5cGUge051bWJlcn1cclxuICAgKi9cblxuXG4gIGNyZWF0ZUNsYXNzKEdvZFJheXNQYXNzLCBbe1xuICAgIGtleTogXCJyZW5kZXJcIixcblxuICAgIC8qKlxyXG4gICAgICogUmVuZGVycyB0aGUgZWZmZWN0LlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7V2ViR0xSZW5kZXJlcn0gcmVuZGVyZXIgLSBUaGUgcmVuZGVyZXIuXHJcbiAgICAgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSBpbnB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgY29udGFpbnMgdGhlIHJlc3VsdCBvZiB0aGUgcHJldmlvdXMgcGFzcy5cclxuICAgICAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IG91dHB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgc2VydmVzIGFzIHRoZSBvdXRwdXQgcmVuZGVyIHRhcmdldCB1bmxlc3MgdGhpcyBwYXNzIHJlbmRlcnMgdG8gc2NyZWVuLlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IFtkZWx0YV0gLSBUaGUgdGltZSBiZXR3ZWVuIHRoZSBsYXN0IGZyYW1lIGFuZCB0aGUgY3VycmVudCBvbmUgaW4gc2Vjb25kcy5cclxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gW3N0ZW5jaWxUZXN0XSAtIEluZGljYXRlcyB3aGV0aGVyIGEgc3RlbmNpbCBtYXNrIGlzIGFjdGl2ZS5cclxuICAgICAqL1xuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIocmVuZGVyZXIsIGlucHV0QnVmZmVyLCBvdXRwdXRCdWZmZXIsIGRlbHRhLCBzdGVuY2lsVGVzdCkge1xuICAgICAgdmFyIHNjZW5lID0gdGhpcy5zY2VuZTtcbiAgICAgIHZhciBjYW1lcmEgPSB0aGlzLmNhbWVyYTtcbiAgICAgIHZhciBtYWluU2NlbmUgPSB0aGlzLm1haW5TY2VuZTtcbiAgICAgIHZhciBsaWdodFNvdXJjZSA9IHRoaXMubGlnaHRTb3VyY2U7XG4gICAgICB2YXIgc2NyZWVuUG9zaXRpb24gPSB0aGlzLnNjcmVlblBvc2l0aW9uO1xuICAgICAgdmFyIGdvZFJheXNNYXRlcmlhbCA9IHRoaXMuZ29kUmF5c01hdGVyaWFsO1xuICAgICAgdmFyIGNvbWJpbmVNYXRlcmlhbCA9IHRoaXMuY29tYmluZU1hdGVyaWFsO1xuICAgICAgdmFyIHJlbmRlclRhcmdldE1hc2sgPSB0aGlzLnJlbmRlclRhcmdldE1hc2s7XG4gICAgICB2YXIgcmVuZGVyVGFyZ2V0WCA9IHRoaXMucmVuZGVyVGFyZ2V0WDtcbiAgICAgIHZhciByZW5kZXJUYXJnZXRZID0gdGhpcy5yZW5kZXJUYXJnZXRZO1xuICAgICAgdmFyIGJhY2tncm91bmQsIHBhcmVudDsgLy8gQ29tcHV0ZSB0aGUgc2NyZWVuIGxpZ2h0IHBvc2l0aW9uIGFuZCB0cmFuc2xhdGUgaXQgdG8gWzAuMCwgMS4wXS5cblxuICAgICAgc2NyZWVuUG9zaXRpb24uY29weShsaWdodFNvdXJjZS5wb3NpdGlvbikucHJvamVjdCh0aGlzLm1haW5DYW1lcmEpO1xuICAgICAgc2NyZWVuUG9zaXRpb24ueCA9IGNsYW1wKChzY3JlZW5Qb3NpdGlvbi54ICsgMS4wKSAqIDAuNSwgMC4wLCAxLjApO1xuICAgICAgc2NyZWVuUG9zaXRpb24ueSA9IGNsYW1wKChzY3JlZW5Qb3NpdGlvbi55ICsgMS4wKSAqIDAuNSwgMC4wLCAxLjApO1xuICAgICAgcGFyZW50ID0gbGlnaHRTb3VyY2UucGFyZW50O1xuICAgICAgYmFja2dyb3VuZCA9IG1haW5TY2VuZS5iYWNrZ3JvdW5kO1xuICAgICAgbWFpblNjZW5lLmJhY2tncm91bmQgPSBudWxsO1xuICAgICAgdGhpcy5saWdodFNjZW5lLmFkZChsaWdodFNvdXJjZSk7XG4gICAgICAvKiBGaXJzdCwgcmVuZGVyIHRoZSBsaWdodCBzb3VyY2UuIFRoZW4gcmVuZGVyIHRoZSBzY2VuZSBpbnRvIHRoZSBzYW1lXHJcbiAgICAgIGJ1ZmZlciB1c2luZyBhIG1hc2sgb3ZlcnJpZGUgbWF0ZXJpYWwgd2l0aCBkZXB0aCB0ZXN0IGVuYWJsZWQuICovXG5cbiAgICAgIHRoaXMucmVuZGVyUGFzc0xpZ2h0LnJlbmRlcihyZW5kZXJlciwgcmVuZGVyVGFyZ2V0TWFzayk7XG4gICAgICB0aGlzLnJlbmRlclBhc3NNYXNrLnJlbmRlcihyZW5kZXJlciwgcmVuZGVyVGFyZ2V0TWFzayk7XG5cbiAgICAgIGlmIChwYXJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgcGFyZW50LmFkZChsaWdodFNvdXJjZSk7XG4gICAgICB9XG5cbiAgICAgIG1haW5TY2VuZS5iYWNrZ3JvdW5kID0gYmFja2dyb3VuZDsgLy8gQmx1ciB0aGUgbWFza2VkIHNjZW5lIHRvIHJlZHVjZSBhcnRpZmFjdHMuXG5cbiAgICAgIHRoaXMuYmx1clBhc3MucmVuZGVyKHJlbmRlcmVyLCB0aGlzLnJlbmRlclRhcmdldE1hc2ssIHJlbmRlclRhcmdldFgpOyAvLyBCbHVyIHRoZSBtYXNrZWQgc2NlbmUgYWxvbmcgcmFkaWFsIGxpbmVzIHRvd2FyZHMgdGhlIGxpZ2h0IHNvdXJjZS5cblxuICAgICAgdGhpcy5tYXRlcmlhbCA9IGdvZFJheXNNYXRlcmlhbDtcbiAgICAgIGdvZFJheXNNYXRlcmlhbC51bmlmb3Jtcy50RGlmZnVzZS52YWx1ZSA9IHJlbmRlclRhcmdldFgudGV4dHVyZTtcbiAgICAgIHJlbmRlcmVyLnJlbmRlcihzY2VuZSwgY2FtZXJhLCByZW5kZXJUYXJnZXRZKTtcblxuICAgICAgaWYgKHRoaXMuYmxlbmQpIHtcbiAgICAgICAgLy8gQ29tYmluZSB0aGUgZ29kIHJheXMgd2l0aCB0aGUgc2NlbmUgY29sb3JzLlxuICAgICAgICB0aGlzLm1hdGVyaWFsID0gY29tYmluZU1hdGVyaWFsO1xuICAgICAgICBjb21iaW5lTWF0ZXJpYWwudW5pZm9ybXMudGV4dHVyZTEudmFsdWUgPSBpbnB1dEJ1ZmZlci50ZXh0dXJlO1xuICAgICAgICBjb21iaW5lTWF0ZXJpYWwudW5pZm9ybXMudGV4dHVyZTIudmFsdWUgPSByZW5kZXJUYXJnZXRZLnRleHR1cmU7XG4gICAgICAgIHJlbmRlcmVyLnJlbmRlcihzY2VuZSwgY2FtZXJhLCB0aGlzLnJlbmRlclRvU2NyZWVuID8gbnVsbCA6IG91dHB1dEJ1ZmZlcik7XG4gICAgICB9XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogVXBkYXRlcyB0aGUgc2l6ZSBvZiB0aGlzIHBhc3MuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoLlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQuXHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInNldFNpemVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KSB7XG4gICAgICB0aGlzLnJlbmRlclBhc3NMaWdodC5zZXRTaXplKHdpZHRoLCBoZWlnaHQpO1xuICAgICAgdGhpcy5yZW5kZXJQYXNzTWFzay5zZXRTaXplKHdpZHRoLCBoZWlnaHQpO1xuICAgICAgdGhpcy5ibHVyUGFzcy5zZXRTaXplKHdpZHRoLCBoZWlnaHQpO1xuICAgICAgd2lkdGggPSB0aGlzLmJsdXJQYXNzLndpZHRoO1xuICAgICAgaGVpZ2h0ID0gdGhpcy5ibHVyUGFzcy5oZWlnaHQ7XG4gICAgICB0aGlzLnJlbmRlclRhcmdldE1hc2suc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KTtcbiAgICAgIHRoaXMucmVuZGVyVGFyZ2V0WC5zZXRTaXplKHdpZHRoLCBoZWlnaHQpO1xuICAgICAgdGhpcy5yZW5kZXJUYXJnZXRZLnNldFNpemUod2lkdGgsIGhlaWdodCk7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogUGVyZm9ybXMgaW5pdGlhbGl6YXRpb24gdGFza3MuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtXZWJHTFJlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlci5cclxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gYWxwaGEgLSBXaGV0aGVyIHRoZSByZW5kZXJlciB1c2VzIHRoZSBhbHBoYSBjaGFubmVsIG9yIG5vdC5cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiaW5pdGlhbGl6ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpbml0aWFsaXplKHJlbmRlcmVyLCBhbHBoYSkge1xuICAgICAgdGhpcy5yZW5kZXJQYXNzTGlnaHQuaW5pdGlhbGl6ZShyZW5kZXJlciwgYWxwaGEpO1xuICAgICAgdGhpcy5yZW5kZXJQYXNzTWFzay5pbml0aWFsaXplKHJlbmRlcmVyLCBhbHBoYSk7XG4gICAgICB0aGlzLmJsdXJQYXNzLmluaXRpYWxpemUocmVuZGVyZXIsIGFscGhhKTtcblxuICAgICAgaWYgKCFhbHBoYSkge1xuICAgICAgICB0aGlzLnJlbmRlclRhcmdldE1hc2sudGV4dHVyZS5mb3JtYXQgPSBSR0JGb3JtYXQ7XG4gICAgICAgIHRoaXMucmVuZGVyVGFyZ2V0WC50ZXh0dXJlLmZvcm1hdCA9IFJHQkZvcm1hdDtcbiAgICAgICAgdGhpcy5yZW5kZXJUYXJnZXRZLnRleHR1cmUuZm9ybWF0ID0gUkdCRm9ybWF0O1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZXNvbHV0aW9uU2NhbGVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmJsdXJQYXNzLnJlc29sdXRpb25TY2FsZTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBZb3UgbmVlZCB0byBjYWxsIHtAbGluayBFZmZlY3RDb21wb3NlciNzZXRTaXplfSBhZnRlciBjaGFuZ2luZyB0aGlzIHZhbHVlLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtOdW1iZXJ9XHJcbiAgICAgKi9cbiAgICAsXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQoKSB7XG4gICAgICB2YXIgdmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IDAuNTtcbiAgICAgIHRoaXMuYmx1clBhc3MucmVzb2x1dGlvblNjYWxlID0gdmFsdWU7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogVGhlIGJsdXIga2VybmVsIHNpemUuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge0tlcm5lbFNpemV9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImtlcm5lbFNpemVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmJsdXJQYXNzLmtlcm5lbFNpemU7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogQHR5cGUge0tlcm5lbFNpemV9XHJcbiAgICAgKi9cbiAgICAsXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQoKSB7XG4gICAgICB2YXIgdmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IEtlcm5lbFNpemUuTEFSR0U7XG4gICAgICB0aGlzLmJsdXJQYXNzLmtlcm5lbFNpemUgPSB2YWx1ZTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBUaGUgb3ZlcmFsbCBpbnRlbnNpdHkgb2YgdGhlIGVmZmVjdC5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7TnVtYmVyfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJpbnRlbnNpdHlcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbWJpbmVNYXRlcmlhbC51bmlmb3Jtcy5vcGFjaXR5Mi52YWx1ZTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBAdHlwZSB7TnVtYmVyfVxyXG4gICAgICovXG4gICAgLFxuICAgIHNldDogZnVuY3Rpb24gc2V0KCkge1xuICAgICAgdmFyIHZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiAxLjA7XG4gICAgICB0aGlzLmNvbWJpbmVNYXRlcmlhbC51bmlmb3Jtcy5vcGFjaXR5Mi52YWx1ZSA9IHZhbHVlO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIFRoZSBudW1iZXIgb2Ygc2FtcGxlcyBwZXIgcGl4ZWwuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge051bWJlcn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwic2FtcGxlc1wiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIE51bWJlci5wYXJzZUludCh0aGlzLmdvZFJheXNNYXRlcmlhbC5kZWZpbmVzLk5VTV9TQU1QTEVTX0lOVCk7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogVGhpcyB2YWx1ZSBtdXN0IGJlIGNhcmVmdWxseSBjaG9zZW4uIEEgaGlnaGVyIHZhbHVlIGRpcmVjdGx5IGluY3JlYXNlcyB0aGVcclxuICAgICAqIEdQVSBsb2FkLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtOdW1iZXJ9XHJcbiAgICAgKi9cbiAgICAsXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQoKSB7XG4gICAgICB2YXIgdmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IDYwO1xuICAgICAgdmFsdWUgPSBNYXRoLmZsb29yKHZhbHVlKTtcbiAgICAgIHRoaXMuZ29kUmF5c01hdGVyaWFsLmRlZmluZXMuTlVNX1NBTVBMRVNfRkxPQVQgPSB2YWx1ZS50b0ZpeGVkKDEpO1xuICAgICAgdGhpcy5nb2RSYXlzTWF0ZXJpYWwuZGVmaW5lcy5OVU1fU0FNUExFU19JTlQgPSB2YWx1ZS50b0ZpeGVkKDApO1xuICAgICAgdGhpcy5nb2RSYXlzTWF0ZXJpYWwubmVlZHNVcGRhdGUgPSB0cnVlO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEluZGljYXRlcyB3aGV0aGVyIGRpdGhlcmluZyBpcyBlbmFibGVkLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtCb29sZWFufVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJkaXRoZXJpbmdcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmdvZFJheXNNYXRlcmlhbC5kaXRoZXJpbmc7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogSWYgZW5hYmxlZCwgdGhlIHJlc3VsdCB3aWxsIGJlIGRpdGhlcmVkIHRvIHJlbW92ZSBiYW5kaW5nIGFydGlmYWN0cy5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7Qm9vbGVhbn1cclxuICAgICAqL1xuICAgICxcbiAgICBzZXQ6IGZ1bmN0aW9uIHNldCh2YWx1ZSkge1xuICAgICAgaWYgKHRoaXMuZGl0aGVyaW5nICE9PSB2YWx1ZSkge1xuICAgICAgICB0aGlzLmdvZFJheXNNYXRlcmlhbC5kaXRoZXJpbmcgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5nb2RSYXlzTWF0ZXJpYWwubmVlZHNVcGRhdGUgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICAvKipcclxuICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBlZmZlY3Qgc2hvdWxkIGJlIGFwcGxpZWQgdG8gdGhlIGlucHV0IGJ1ZmZlci5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7Qm9vbGVhbn1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiYmxlbmRcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLm5lZWRzU3dhcDtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBJZiBkaXNhYmxlZCwgdGhlIGlucHV0IGJ1ZmZlciB3aWxsIHJlbWFpbiB1bmFmZmVjdGVkLlxyXG4gICAgICpcclxuICAgICAqIFlvdSBtYXkgdXNlIHRoZSB7QGxpbmsgQmxvb21QYXNzI292ZXJsYXl9IHRleHR1cmUgdG8gYXBwbHkgdGhlIGVmZmVjdCB0b1xyXG4gICAgICogeW91ciBzY2VuZS5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7Qm9vbGVhbn1cclxuICAgICAqL1xuICAgICxcbiAgICBzZXQ6IGZ1bmN0aW9uIHNldCh2YWx1ZSkge1xuICAgICAgdGhpcy5uZWVkc1N3YXAgPSB2YWx1ZTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZWZmZWN0IG92ZXJsYXkgdGV4dHVyZS5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7VGV4dHVyZX1cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwib3ZlcmxheVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMucmVuZGVyVGFyZ2V0WS50ZXh0dXJlO1xuICAgIH1cbiAgfV0pO1xuXG4gIGluaGVyaXRzKEdvZFJheXNQYXNzLCBfUGFzcyk7XG5cbiAgcmV0dXJuIEdvZFJheXNQYXNzO1xufShQYXNzKTtcblxuLyoqXHJcbiAqIEEgbWFzayBwYXNzLlxyXG4gKi9cblxudmFyIE1hc2tQYXNzID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfUGFzcykge1xuICAvKipcclxuICAgKiBDb25zdHJ1Y3RzIGEgbmV3IG1hc2sgcGFzcy5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7U2NlbmV9IHNjZW5lIC0gVGhlIHNjZW5lIHRvIHJlbmRlci5cclxuICAgKiBAcGFyYW0ge0NhbWVyYX0gY2FtZXJhIC0gVGhlIGNhbWVyYSB0byB1c2UuXHJcbiAgICovXG4gIGZ1bmN0aW9uIE1hc2tQYXNzKHNjZW5lLCBjYW1lcmEpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBNYXNrUGFzcyk7XG5cbiAgICBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgZ2V0UHJvdG90eXBlT2YkMihNYXNrUGFzcykuY2FsbCh0aGlzLCBcIk1hc2tQYXNzXCIsIHNjZW5lLCBjYW1lcmEsIG51bGwpKTtcbiAgICBfdGhpcy5uZWVkc1N3YXAgPSBmYWxzZTtcbiAgICAvKipcclxuICAgICAqIEludmVyc2UgZmxhZy5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7Qm9vbGVhbn1cclxuICAgICAqL1xuXG4gICAgX3RoaXMuaW52ZXJzZSA9IGZhbHNlO1xuICAgIC8qKlxyXG4gICAgICogU3RlbmNpbCBidWZmZXIgY2xlYXIgZmxhZy5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7Qm9vbGVhbn1cclxuICAgICAqL1xuXG4gICAgX3RoaXMuY2xlYXJTdGVuY2lsID0gdHJ1ZTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgLyoqXHJcbiAgICogUmVuZGVycyB0aGUgZWZmZWN0LlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtXZWJHTFJlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlci5cclxuICAgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSBpbnB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgY29udGFpbnMgdGhlIHJlc3VsdCBvZiB0aGUgcHJldmlvdXMgcGFzcy5cclxuICAgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSBvdXRwdXRCdWZmZXIgLSBBIGZyYW1lIGJ1ZmZlciB0aGF0IHNlcnZlcyBhcyB0aGUgb3V0cHV0IHJlbmRlciB0YXJnZXQgdW5sZXNzIHRoaXMgcGFzcyByZW5kZXJzIHRvIHNjcmVlbi5cclxuICAgKiBAcGFyYW0ge051bWJlcn0gW2RlbHRhXSAtIFRoZSB0aW1lIGJldHdlZW4gdGhlIGxhc3QgZnJhbWUgYW5kIHRoZSBjdXJyZW50IG9uZSBpbiBzZWNvbmRzLlxyXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW3N0ZW5jaWxUZXN0XSAtIEluZGljYXRlcyB3aGV0aGVyIGEgc3RlbmNpbCBtYXNrIGlzIGFjdGl2ZS5cclxuICAgKi9cblxuXG4gIGNyZWF0ZUNsYXNzKE1hc2tQYXNzLCBbe1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKHJlbmRlcmVyLCBpbnB1dEJ1ZmZlciwgb3V0cHV0QnVmZmVyLCBkZWx0YSwgc3RlbmNpbFRlc3QpIHtcbiAgICAgIHZhciBjb250ZXh0ID0gcmVuZGVyZXIuY29udGV4dDtcbiAgICAgIHZhciBzdGF0ZSA9IHJlbmRlcmVyLnN0YXRlO1xuICAgICAgdmFyIHNjZW5lID0gdGhpcy5zY2VuZTtcbiAgICAgIHZhciBjYW1lcmEgPSB0aGlzLmNhbWVyYTtcbiAgICAgIHZhciB3cml0ZVZhbHVlID0gdGhpcy5pbnZlcnNlID8gMCA6IDE7XG4gICAgICB2YXIgY2xlYXJWYWx1ZSA9IDEgLSB3cml0ZVZhbHVlOyAvLyBEb24ndCB1cGRhdGUgY29sb3Igb3IgZGVwdGguXG5cbiAgICAgIHN0YXRlLmJ1ZmZlcnMuY29sb3Iuc2V0TWFzayhmYWxzZSk7XG4gICAgICBzdGF0ZS5idWZmZXJzLmRlcHRoLnNldE1hc2soZmFsc2UpOyAvLyBMb2NrIHRoZSBidWZmZXJzLlxuXG4gICAgICBzdGF0ZS5idWZmZXJzLmNvbG9yLnNldExvY2tlZCh0cnVlKTtcbiAgICAgIHN0YXRlLmJ1ZmZlcnMuZGVwdGguc2V0TG9ja2VkKHRydWUpOyAvLyBDb25maWd1cmUgdGhlIHN0ZW5jaWwuXG5cbiAgICAgIHN0YXRlLmJ1ZmZlcnMuc3RlbmNpbC5zZXRUZXN0KHRydWUpO1xuICAgICAgc3RhdGUuYnVmZmVycy5zdGVuY2lsLnNldE9wKGNvbnRleHQuUkVQTEFDRSwgY29udGV4dC5SRVBMQUNFLCBjb250ZXh0LlJFUExBQ0UpO1xuICAgICAgc3RhdGUuYnVmZmVycy5zdGVuY2lsLnNldEZ1bmMoY29udGV4dC5BTFdBWVMsIHdyaXRlVmFsdWUsIDB4ZmZmZmZmZmYpO1xuICAgICAgc3RhdGUuYnVmZmVycy5zdGVuY2lsLnNldENsZWFyKGNsZWFyVmFsdWUpOyAvLyBDbGVhciB0aGUgc3RlbmNpbC5cblxuICAgICAgaWYgKHRoaXMuY2xlYXJTdGVuY2lsKSB7XG4gICAgICAgIGlmICh0aGlzLnJlbmRlclRvU2NyZWVuKSB7XG4gICAgICAgICAgcmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KG51bGwpO1xuICAgICAgICAgIHJlbmRlcmVyLmNsZWFyU3RlbmNpbCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlbmRlcmVyLnNldFJlbmRlclRhcmdldChpbnB1dEJ1ZmZlcik7XG4gICAgICAgICAgcmVuZGVyZXIuY2xlYXJTdGVuY2lsKCk7XG4gICAgICAgICAgcmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KG91dHB1dEJ1ZmZlcik7XG4gICAgICAgICAgcmVuZGVyZXIuY2xlYXJTdGVuY2lsKCk7XG4gICAgICAgIH1cbiAgICAgIH0gLy8gRHJhdyB0aGUgbWFzay5cblxuXG4gICAgICBpZiAodGhpcy5yZW5kZXJUb1NjcmVlbikge1xuICAgICAgICByZW5kZXJlci5yZW5kZXIoc2NlbmUsIGNhbWVyYSwgbnVsbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZW5kZXJlci5yZW5kZXIoc2NlbmUsIGNhbWVyYSwgaW5wdXRCdWZmZXIpO1xuICAgICAgICByZW5kZXJlci5yZW5kZXIoc2NlbmUsIGNhbWVyYSwgb3V0cHV0QnVmZmVyKTtcbiAgICAgIH0gLy8gVW5sb2NrIHRoZSBidWZmZXJzLlxuXG5cbiAgICAgIHN0YXRlLmJ1ZmZlcnMuY29sb3Iuc2V0TG9ja2VkKGZhbHNlKTtcbiAgICAgIHN0YXRlLmJ1ZmZlcnMuZGVwdGguc2V0TG9ja2VkKGZhbHNlKTsgLy8gT25seSByZW5kZXIgd2hlcmUgdGhlIHN0ZW5jaWwgaXMgc2V0IHRvIDEuXG5cbiAgICAgIHN0YXRlLmJ1ZmZlcnMuc3RlbmNpbC5zZXRGdW5jKGNvbnRleHQuRVFVQUwsIDEsIDB4ZmZmZmZmZmYpO1xuICAgICAgc3RhdGUuYnVmZmVycy5zdGVuY2lsLnNldE9wKGNvbnRleHQuS0VFUCwgY29udGV4dC5LRUVQLCBjb250ZXh0LktFRVApO1xuICAgIH1cbiAgfV0pO1xuXG4gIGluaGVyaXRzKE1hc2tQYXNzLCBfUGFzcyk7XG5cbiAgcmV0dXJuIE1hc2tQYXNzO1xufShQYXNzKTtcblxuLyoqXHJcbiAqIEEgc2hhZGVyIHBhc3MuXHJcbiAqXHJcbiAqIFVzZWQgdG8gcmVuZGVyIGFueSBzaGFkZXIgbWF0ZXJpYWwgYXMgYSAyRCBmaWx0ZXIuXHJcbiAqL1xuXG52YXIgU2hhZGVyUGFzcyA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX1Bhc3MpIHtcbiAgLyoqXHJcbiAgICogQ29uc3RydWN0cyBhIG5ldyBzaGFkZXIgcGFzcy5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7U2hhZGVyTWF0ZXJpYWx9IG1hdGVyaWFsIC0gVGhlIHNoYWRlciBtYXRlcmlhbCB0byB1c2UuXHJcbiAgICogQHBhcmFtIHtTdHJpbmd9IFt0ZXh0dXJlSUQ9XCJ0RGlmZnVzZVwiXSAtIFRoZSB0ZXh0dXJlIHVuaWZvcm0gaWRlbnRpZmllci5cclxuICAgKi9cbiAgZnVuY3Rpb24gU2hhZGVyUGFzcyhtYXRlcmlhbCkge1xuICAgIHZhciBfdGhpcztcblxuICAgIHZhciB0ZXh0dXJlSUQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IFwidERpZmZ1c2VcIjtcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIFNoYWRlclBhc3MpO1xuXG4gICAgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIGdldFByb3RvdHlwZU9mJDIoU2hhZGVyUGFzcykuY2FsbCh0aGlzLCBcIlNoYWRlclBhc3NcIikpO1xuICAgIF90aGlzLm1hdGVyaWFsID0gbWF0ZXJpYWw7XG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgY29sb3Igc2FtcGxlciB1bmlmb3JtIG9mIHRoZSBnaXZlbiBtYXRlcmlhbC5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7U3RyaW5nfVxyXG4gICAgICovXG5cbiAgICBfdGhpcy50ZXh0dXJlSUQgPSB0ZXh0dXJlSUQ7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG4gIC8qKlxyXG4gICAqIFJlbmRlcnMgdGhlIGVmZmVjdC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7V2ViR0xSZW5kZXJlcn0gcmVuZGVyZXIgLSBUaGUgcmVuZGVyZXIuXHJcbiAgICogQHBhcmFtIHtXZWJHTFJlbmRlclRhcmdldH0gaW5wdXRCdWZmZXIgLSBBIGZyYW1lIGJ1ZmZlciB0aGF0IGNvbnRhaW5zIHRoZSByZXN1bHQgb2YgdGhlIHByZXZpb3VzIHBhc3MuXHJcbiAgICogQHBhcmFtIHtXZWJHTFJlbmRlclRhcmdldH0gb3V0cHV0QnVmZmVyIC0gQSBmcmFtZSBidWZmZXIgdGhhdCBzZXJ2ZXMgYXMgdGhlIG91dHB1dCByZW5kZXIgdGFyZ2V0IHVubGVzcyB0aGlzIHBhc3MgcmVuZGVycyB0byBzY3JlZW4uXHJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtkZWx0YV0gLSBUaGUgdGltZSBiZXR3ZWVuIHRoZSBsYXN0IGZyYW1lIGFuZCB0aGUgY3VycmVudCBvbmUgaW4gc2Vjb25kcy5cclxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtzdGVuY2lsVGVzdF0gLSBJbmRpY2F0ZXMgd2hldGhlciBhIHN0ZW5jaWwgbWFzayBpcyBhY3RpdmUuXHJcbiAgICovXG5cblxuICBjcmVhdGVDbGFzcyhTaGFkZXJQYXNzLCBbe1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKHJlbmRlcmVyLCBpbnB1dEJ1ZmZlciwgb3V0cHV0QnVmZmVyLCBkZWx0YSwgc3RlbmNpbFRlc3QpIHtcbiAgICAgIGlmICh0aGlzLm1hdGVyaWFsLnVuaWZvcm1zW3RoaXMudGV4dHVyZUlEXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMubWF0ZXJpYWwudW5pZm9ybXNbdGhpcy50ZXh0dXJlSURdLnZhbHVlID0gaW5wdXRCdWZmZXIudGV4dHVyZTtcbiAgICAgIH1cblxuICAgICAgcmVuZGVyZXIucmVuZGVyKHRoaXMuc2NlbmUsIHRoaXMuY2FtZXJhLCB0aGlzLnJlbmRlclRvU2NyZWVuID8gbnVsbCA6IG91dHB1dEJ1ZmZlcik7XG4gICAgfVxuICB9XSk7XG5cbiAgaW5oZXJpdHMoU2hhZGVyUGFzcywgX1Bhc3MpO1xuXG4gIHJldHVybiBTaGFkZXJQYXNzO1xufShQYXNzKTtcblxuLyoqXHJcbiAqIEFuIG91dGxpbmUgcGFzcy5cclxuICovXG5cbnZhciBPdXRsaW5lUGFzcyA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX1Bhc3MpIHtcbiAgLyoqXHJcbiAgICogQ29uc3RydWN0cyBhIG5ldyBvdXRsaW5lIHBhc3MuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge1NjZW5lfSBzY2VuZSAtIFRoZSBtYWluIHNjZW5lLlxyXG4gICAqIEBwYXJhbSB7Q2FtZXJhfSBjYW1lcmEgLSBUaGUgbWFpbiBjYW1lcmEuXHJcbiAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXSAtIEFkZGl0aW9uYWwgcGFyYW1ldGVycy4gU2VlIHtAbGluayBCbHVyUGFzc30sIHtAbGluayBPdXRsaW5lQmxlbmRNYXRlcmlhbH0gYW5kIHtAbGluayBPdXRsaW5lRWRnZXNNYXRlcmlhbH0gZm9yIGRldGFpbHMuXHJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLnB1bHNlU3BlZWQ9MC4wXSAtIFRoZSBwdWxzZSBzcGVlZC4gQSB2YWx1ZSBvZiB6ZXJvIGRpc2FibGVzIHRoZSBwdWxzZSBlZmZlY3QuXHJcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5ibHVyPXRydWVdIC0gV2hldGhlciB0aGUgb3V0bGluZSBzaG91bGQgYmUgYmx1cnJlZC5cclxuICAgKi9cbiAgZnVuY3Rpb24gT3V0bGluZVBhc3Moc2NlbmUsIGNhbWVyYSkge1xuICAgIHZhciBfdGhpcztcblxuICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB7fTtcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIE91dGxpbmVQYXNzKTtcblxuICAgIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBnZXRQcm90b3R5cGVPZiQyKE91dGxpbmVQYXNzKS5jYWxsKHRoaXMsIFwiT3V0bGluZVBhc3NcIikpO1xuICAgIC8qKlxyXG4gICAgICogVGhlIG1haW4gc2NlbmUuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge1NjZW5lfVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xuXG4gICAgX3RoaXMubWFpblNjZW5lID0gc2NlbmU7XG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbWFpbiBjYW1lcmEuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge0NhbWVyYX1cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cblxuICAgIF90aGlzLm1haW5DYW1lcmEgPSBjYW1lcmE7XG4gICAgLyoqXHJcbiAgICAgKiBBIHJlbmRlciB0YXJnZXQgZm9yIGRlcHRoIGluZm9ybWF0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtXZWJHTFJlbmRlclRhcmdldH1cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cblxuICAgIF90aGlzLnJlbmRlclRhcmdldERlcHRoID0gbmV3IFdlYkdMUmVuZGVyVGFyZ2V0KDEsIDEsIHtcbiAgICAgIG1pbkZpbHRlcjogTGluZWFyRmlsdGVyLFxuICAgICAgbWFnRmlsdGVyOiBMaW5lYXJGaWx0ZXJcbiAgICB9KTtcbiAgICBfdGhpcy5yZW5kZXJUYXJnZXREZXB0aC50ZXh0dXJlLm5hbWUgPSBcIk91dGxpbmUuRGVwdGhcIjtcbiAgICBfdGhpcy5yZW5kZXJUYXJnZXREZXB0aC50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlO1xuICAgIC8qKlxyXG4gICAgICogQSByZW5kZXIgdGFyZ2V0IGZvciB0aGUgb3V0bGluZSBtYXNrLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtXZWJHTFJlbmRlclRhcmdldH1cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cblxuICAgIF90aGlzLnJlbmRlclRhcmdldE1hc2sgPSBfdGhpcy5yZW5kZXJUYXJnZXREZXB0aC5jbG9uZSgpO1xuICAgIF90aGlzLnJlbmRlclRhcmdldE1hc2sudGV4dHVyZS5mb3JtYXQgPSBSR0JGb3JtYXQ7XG4gICAgX3RoaXMucmVuZGVyVGFyZ2V0TWFzay50ZXh0dXJlLm5hbWUgPSBcIk91dGxpbmUuTWFza1wiO1xuICAgIC8qKlxyXG4gICAgICogQSByZW5kZXIgdGFyZ2V0IGZvciB0aGUgZWRnZSBkZXRlY3Rpb24uXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge1dlYkdMUmVuZGVyVGFyZ2V0fVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xuXG4gICAgX3RoaXMucmVuZGVyVGFyZ2V0RWRnZXMgPSBuZXcgV2ViR0xSZW5kZXJUYXJnZXQoMSwgMSwge1xuICAgICAgbWluRmlsdGVyOiBMaW5lYXJGaWx0ZXIsXG4gICAgICBtYWdGaWx0ZXI6IExpbmVhckZpbHRlcixcbiAgICAgIHN0ZW5jaWxCdWZmZXI6IGZhbHNlLFxuICAgICAgZGVwdGhCdWZmZXI6IGZhbHNlLFxuICAgICAgZm9ybWF0OiBSR0JGb3JtYXRcbiAgICB9KTtcbiAgICBfdGhpcy5yZW5kZXJUYXJnZXRFZGdlcy50ZXh0dXJlLm5hbWUgPSBcIk91dGxpbmUuRWRnZXNcIjtcbiAgICBfdGhpcy5yZW5kZXJUYXJnZXRFZGdlcy50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlO1xuICAgIC8qKlxyXG4gICAgICogQSByZW5kZXIgdGFyZ2V0IGZvciB0aGUgYmx1cnJlZCBvdXRsaW5lIG92ZXJsYXkuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge1dlYkdMUmVuZGVyVGFyZ2V0fVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xuXG4gICAgX3RoaXMucmVuZGVyVGFyZ2V0Qmx1cnJlZEVkZ2VzID0gX3RoaXMucmVuZGVyVGFyZ2V0RWRnZXMuY2xvbmUoKTtcbiAgICBfdGhpcy5yZW5kZXJUYXJnZXRCbHVycmVkRWRnZXMudGV4dHVyZS5uYW1lID0gXCJPdXRsaW5lLkJsdXJyZWRFZGdlc1wiO1xuICAgIC8qKlxyXG4gICAgICogQSBkZXB0aCBwYXNzLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtSZW5kZXJQYXNzfVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xuXG4gICAgX3RoaXMucmVuZGVyUGFzc0RlcHRoID0gbmV3IFJlbmRlclBhc3MoX3RoaXMubWFpblNjZW5lLCBfdGhpcy5tYWluQ2FtZXJhLCB7XG4gICAgICBvdmVycmlkZU1hdGVyaWFsOiBuZXcgTWVzaERlcHRoTWF0ZXJpYWwoe1xuICAgICAgICBkZXB0aFBhY2tpbmc6IFJHQkFEZXB0aFBhY2tpbmcsXG4gICAgICAgIG1vcnBoVGFyZ2V0czogdHJ1ZSxcbiAgICAgICAgc2tpbm5pbmc6IHRydWVcbiAgICAgIH0pLFxuICAgICAgY2xlYXJDb2xvcjogbmV3IENvbG9yKDB4ZmZmZmZmKSxcbiAgICAgIGNsZWFyQWxwaGE6IDEuMFxuICAgIH0pO1xuICAgIC8qKlxyXG4gICAgICogQSBkZXB0aCBjb21wYXJpc29uIG1hc2sgcGFzcy5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7UmVuZGVyUGFzc31cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cblxuICAgIF90aGlzLnJlbmRlclBhc3NNYXNrID0gbmV3IFJlbmRlclBhc3MoX3RoaXMubWFpblNjZW5lLCBfdGhpcy5tYWluQ2FtZXJhLCB7XG4gICAgICBvdmVycmlkZU1hdGVyaWFsOiBuZXcgRGVwdGhDb21wYXJpc29uTWF0ZXJpYWwoX3RoaXMucmVuZGVyVGFyZ2V0RGVwdGgudGV4dHVyZSwgX3RoaXMubWFpbkNhbWVyYSksXG4gICAgICBjbGVhckNvbG9yOiBuZXcgQ29sb3IoMHhmZmZmZmYpLFxuICAgICAgY2xlYXJBbHBoYTogMS4wXG4gICAgfSk7XG4gICAgLyoqXHJcbiAgICAgKiBBIGJsdXIgcGFzcy5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7Qmx1clBhc3N9XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXG5cbiAgICBfdGhpcy5ibHVyUGFzcyA9IG5ldyBCbHVyUGFzcyhvcHRpb25zKTtcbiAgICBfdGhpcy5rZXJuZWxTaXplID0gb3B0aW9ucy5rZXJuZWxTaXplO1xuICAgIC8qKlxyXG4gICAgICogQSBjb3B5IHBhc3MgdGhhdCByZW5kZXJzIHRoZSByZWFkIGJ1ZmZlciB0byBzY3JlZW4gaWYgbmVlZGVkLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtTaGFkZXJQYXNzfVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xuXG4gICAgX3RoaXMuY29weVBhc3MgPSBuZXcgU2hhZGVyUGFzcyhuZXcgQ29weU1hdGVyaWFsKCkpO1xuICAgIF90aGlzLmNvcHlQYXNzLnJlbmRlclRvU2NyZWVuID0gdHJ1ZTtcbiAgICAvKipcclxuICAgICAqIEFuIG91dGxpbmUgZWRnZSBkZXRlY3Rpb24gbWF0ZXJpYWwuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge091dGxpbmVFZGdlc01hdGVyaWFsfVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xuXG4gICAgX3RoaXMub3V0bGluZUVkZ2VzTWF0ZXJpYWwgPSBuZXcgT3V0bGluZUVkZ2VzTWF0ZXJpYWwob3B0aW9ucyk7XG4gICAgX3RoaXMub3V0bGluZUVkZ2VzTWF0ZXJpYWwudW5pZm9ybXMudE1hc2sudmFsdWUgPSBfdGhpcy5yZW5kZXJUYXJnZXRNYXNrLnRleHR1cmU7XG4gICAgLyoqXHJcbiAgICAgKiBBbiBvdXRsaW5lIGJsZW5kIG1hdGVyaWFsLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtPdXRsaW5lQmxlbmRNYXRlcmlhbH1cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cblxuICAgIF90aGlzLm91dGxpbmVCbGVuZE1hdGVyaWFsID0gbmV3IE91dGxpbmVCbGVuZE1hdGVyaWFsKG9wdGlvbnMpO1xuICAgIF90aGlzLm91dGxpbmVCbGVuZE1hdGVyaWFsLnVuaWZvcm1zLnRNYXNrLnZhbHVlID0gX3RoaXMucmVuZGVyVGFyZ2V0TWFzay50ZXh0dXJlO1xuICAgIF90aGlzLmJsdXIgPSBvcHRpb25zLmJsdXIgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuYmx1ciA6IHRydWU7XG4gICAgLyoqXHJcbiAgICAgKiBBIGxpc3Qgb2Ygb2JqZWN0cyB0byBvdXRsaW5lLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtPYmplY3QzRFtdfVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xuXG4gICAgX3RoaXMuc2VsZWN0aW9uID0gW107XG4gICAgLyoqXHJcbiAgICAgKiBUaGUgY3VycmVudCBhbmltYXRpb24gdGltZS5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7TnVtYmVyfVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xuXG4gICAgX3RoaXMudGltZSA9IDAuMDtcbiAgICAvKipcclxuICAgICAqIFRoZSBwdWxzZSBzcGVlZC4gQSB2YWx1ZSBvZiB6ZXJvIGRpc2FibGVzIHRoZSBwdWxzZSBlZmZlY3QuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge051bWJlcn1cclxuICAgICAqL1xuXG4gICAgX3RoaXMucHVsc2VTcGVlZCA9IG9wdGlvbnMucHVsc2VTcGVlZCAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5wdWxzZVNwZWVkIDogMC4wO1xuICAgIC8qKlxyXG4gICAgICogQSBkZWRpY2F0ZWQgcmVuZGVyIGxheWVyIGZvciBzZWxlY3RlZCBvYmplY3RzLlxyXG4gICAgICpcclxuICAgICAqIFRoaXMgbGF5ZXIgaXMgc2V0IHRvIDEwIGJ5IGRlZmF1bHQuIElmIHRoaXMgY29sbGlkZXMgd2l0aCB5b3VyIG93biBjdXN0b21cclxuICAgICAqIGxheWVycywgcGxlYXNlIGNoYW5nZSBpdCB0byBhIGZyZWUgbGF5ZXIgYmVmb3JlIHJlbmRlcmluZyFcclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7TnVtYmVyfVxyXG4gICAgICovXG5cbiAgICBfdGhpcy5zZWxlY3Rpb25MYXllciA9IDEwO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuICAvKipcclxuICAgKiBUaGUgcmVzb2x1dGlvbiBzY2FsZS5cclxuICAgKlxyXG4gICAqIEB0eXBlIHtOdW1iZXJ9XHJcbiAgICovXG5cblxuICBjcmVhdGVDbGFzcyhPdXRsaW5lUGFzcywgW3tcbiAgICBrZXk6IFwic2V0UGF0dGVyblRleHR1cmVcIixcblxuICAgIC8qKlxyXG4gICAgICogU2V0cyBhIHBhdHRlcm4gdGV4dHVyZSB0byB1c2UgYXMgYW4gb3ZlcmxheSBmb3Igc2VsZWN0ZWQgb2JqZWN0cy5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1RleHR1cmV9IFt0ZXh0dXJlPW51bGxdIC0gQSBwYXR0ZXJuIHRleHR1cmUuIFNldCB0byBudWxsIHRvIGRpc2FibGUgdGhlIHBhdHRlcm4uXHJcbiAgICAgKi9cbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0UGF0dGVyblRleHR1cmUoKSB7XG4gICAgICB2YXIgdGV4dHVyZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogbnVsbDtcbiAgICAgIHRoaXMub3V0bGluZUJsZW5kTWF0ZXJpYWwuc2V0UGF0dGVyblRleHR1cmUodGV4dHVyZSk7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogQ2xlYXJzIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBhbmQgc2VsZWN0cyBhIGxpc3Qgb2Ygb2JqZWN0cy5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdDNEW119IG9iamVjdHMgLSBUaGUgb2JqZWN0cyB0aGF0IHNob3VsZCBiZSBvdXRsaW5lZC4gVGhpcyBhcnJheSB3aWxsIGJlIGNvcGllZC5cclxuICAgICAqIEByZXR1cm4ge091dGxpbmVQYXNzfSBUaGlzIHBhc3MuXHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInNldFNlbGVjdGlvblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRTZWxlY3Rpb24ob2JqZWN0cykge1xuICAgICAgdmFyIHNlbGVjdGlvbiA9IG9iamVjdHMuc2xpY2UoMCk7XG4gICAgICB2YXIgc2VsZWN0aW9uTGF5ZXIgPSB0aGlzLnNlbGVjdGlvbkxheWVyO1xuICAgICAgdmFyIGksIGw7XG4gICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uKCk7XG5cbiAgICAgIGZvciAoaSA9IDAsIGwgPSBzZWxlY3Rpb24ubGVuZ3RoOyBpIDwgbDsgKytpKSB7XG4gICAgICAgIHNlbGVjdGlvbltpXS5sYXllcnMuZW5hYmxlKHNlbGVjdGlvbkxheWVyKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBDbGVhcnMgdGhlIGxpc3Qgb2Ygc2VsZWN0ZWQgb2JqZWN0cy5cclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJuIHtPdXRsaW5lUGFzc30gVGhpcyBwYXNzLlxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJjbGVhclNlbGVjdGlvblwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjbGVhclNlbGVjdGlvbigpIHtcbiAgICAgIHZhciBzZWxlY3Rpb24gPSB0aGlzLnNlbGVjdGlvbjtcbiAgICAgIHZhciBzZWxlY3Rpb25MYXllciA9IHRoaXMuc2VsZWN0aW9uTGF5ZXI7XG4gICAgICB2YXIgaSwgbDtcblxuICAgICAgZm9yIChpID0gMCwgbCA9IHNlbGVjdGlvbi5sZW5ndGg7IGkgPCBsOyArK2kpIHtcbiAgICAgICAgc2VsZWN0aW9uW2ldLmxheWVycy5kaXNhYmxlKHNlbGVjdGlvbkxheWVyKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zZWxlY3Rpb24gPSBbXTtcbiAgICAgIHRoaXMudGltZSA9IDAuMDtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIFNlbGVjdHMgYW4gb2JqZWN0LlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7T2JqZWN0M0R9IG9iamVjdCAtIFRoZSBvYmplY3QgdGhhdCBzaG91bGQgYmUgb3V0bGluZWQuXHJcbiAgICAgKiBAcmV0dXJuIHtPdXRsaW5lUGFzc30gVGhpcyBwYXNzLlxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJzZWxlY3RPYmplY3RcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2VsZWN0T2JqZWN0KG9iamVjdCkge1xuICAgICAgb2JqZWN0LmxheWVycy5lbmFibGUodGhpcy5zZWxlY3Rpb25MYXllcik7XG4gICAgICB0aGlzLnNlbGVjdGlvbi5wdXNoKG9iamVjdCk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBEZXNlbGVjdHMgYW4gb2JqZWN0LlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7T2JqZWN0M0R9IG9iamVjdCAtIFRoZSBvYmplY3QgdGhhdCBzaG91bGQgbm8gbG9uZ2VyIGJlIG91dGxpbmVkLlxyXG4gICAgICogQHJldHVybiB7T3V0bGluZVBhc3N9IFRoaXMgcGFzcy5cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiZGVzZWxlY3RPYmplY3RcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZGVzZWxlY3RPYmplY3Qob2JqZWN0KSB7XG4gICAgICB2YXIgc2VsZWN0aW9uID0gdGhpcy5zZWxlY3Rpb247XG4gICAgICB2YXIgaW5kZXggPSBzZWxlY3Rpb24uaW5kZXhPZihvYmplY3QpO1xuXG4gICAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgICBzZWxlY3Rpb25baW5kZXhdLmxheWVycy5kaXNhYmxlKHRoaXMuc2VsZWN0aW9uTGF5ZXIpO1xuICAgICAgICBzZWxlY3Rpb24uc3BsaWNlKGluZGV4LCAxKTtcblxuICAgICAgICBpZiAoc2VsZWN0aW9uLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRoaXMudGltZSA9IDAuMDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSB2aXNpYmlsaXR5IG9mIGFsbCBzZWxlY3RlZCBvYmplY3RzLlxyXG4gICAgICpcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IHZpc2libGUgLSBXaGV0aGVyIHRoZSBzZWxlY3RlZCBvYmplY3RzIHNob3VsZCBiZSB2aXNpYmxlLlxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJzZXRTZWxlY3Rpb25WaXNpYmxlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldFNlbGVjdGlvblZpc2libGUodmlzaWJsZSkge1xuICAgICAgdmFyIHNlbGVjdGlvbiA9IHRoaXMuc2VsZWN0aW9uO1xuICAgICAgdmFyIGksIGw7XG5cbiAgICAgIGZvciAoaSA9IDAsIGwgPSBzZWxlY3Rpb24ubGVuZ3RoOyBpIDwgbDsgKytpKSB7XG4gICAgICAgIGlmICh2aXNpYmxlKSB7XG4gICAgICAgICAgc2VsZWN0aW9uW2ldLmxheWVycy5lbmFibGUoMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2VsZWN0aW9uW2ldLmxheWVycy5kaXNhYmxlKDApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogUmVuZGVycyB0aGUgZWZmZWN0LlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7V2ViR0xSZW5kZXJlcn0gcmVuZGVyZXIgLSBUaGUgcmVuZGVyZXIuXHJcbiAgICAgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSBpbnB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgY29udGFpbnMgdGhlIHJlc3VsdCBvZiB0aGUgcHJldmlvdXMgcGFzcy5cclxuICAgICAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IG91dHB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgc2VydmVzIGFzIHRoZSBvdXRwdXQgcmVuZGVyIHRhcmdldCB1bmxlc3MgdGhpcyBwYXNzIHJlbmRlcnMgdG8gc2NyZWVuLlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IFtkZWx0YV0gLSBUaGUgdGltZSBiZXR3ZWVuIHRoZSBsYXN0IGZyYW1lIGFuZCB0aGUgY3VycmVudCBvbmUgaW4gc2Vjb25kcy5cclxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gW3N0ZW5jaWxUZXN0XSAtIEluZGljYXRlcyB3aGV0aGVyIGEgc3RlbmNpbCBtYXNrIGlzIGFjdGl2ZS5cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcihyZW5kZXJlciwgaW5wdXRCdWZmZXIsIG91dHB1dEJ1ZmZlciwgZGVsdGEsIHN0ZW5jaWxUZXN0KSB7XG4gICAgICB2YXIgbWFpblNjZW5lID0gdGhpcy5tYWluU2NlbmU7XG4gICAgICB2YXIgbWFpbkNhbWVyYSA9IHRoaXMubWFpbkNhbWVyYTtcbiAgICAgIHZhciBwdWxzZSA9IHRoaXMub3V0bGluZUJsZW5kTWF0ZXJpYWwudW5pZm9ybXMucHVsc2U7XG4gICAgICB2YXIgYmFja2dyb3VuZCwgbWFzaztcblxuICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uLmxlbmd0aCA+IDApIHtcbiAgICAgICAgYmFja2dyb3VuZCA9IG1haW5TY2VuZS5iYWNrZ3JvdW5kO1xuICAgICAgICBtYXNrID0gbWFpbkNhbWVyYS5sYXllcnMubWFzaztcbiAgICAgICAgbWFpblNjZW5lLmJhY2tncm91bmQgPSBudWxsO1xuICAgICAgICBwdWxzZS52YWx1ZSA9IDEuMDtcblxuICAgICAgICBpZiAodGhpcy5wdWxzZVNwZWVkID4gMC4wKSB7XG4gICAgICAgICAgcHVsc2UudmFsdWUgPSAwLjYyNSArIE1hdGguY29zKHRoaXMudGltZSAqIHRoaXMucHVsc2VTcGVlZCAqIDEwLjApICogMC4zNzU7XG4gICAgICAgICAgdGhpcy50aW1lICs9IGRlbHRhO1xuICAgICAgICB9IC8vIFJlbmRlciBhIGN1c3RvbSBkZXB0aCB0ZXh0dXJlIGFuZCBpZ25vcmUgc2VsZWN0ZWQgb2JqZWN0cy5cblxuXG4gICAgICAgIHRoaXMuc2V0U2VsZWN0aW9uVmlzaWJsZShmYWxzZSk7XG4gICAgICAgIHRoaXMucmVuZGVyUGFzc0RlcHRoLnJlbmRlcihyZW5kZXJlciwgdGhpcy5yZW5kZXJUYXJnZXREZXB0aCk7XG4gICAgICAgIHRoaXMuc2V0U2VsZWN0aW9uVmlzaWJsZSh0cnVlKTsgLy8gQ3JlYXRlIGEgbWFzayBmb3IgdGhlIHNlbGVjdGVkIG9iamVjdHMgdXNpbmcgdGhlIGRlcHRoIGluZm9ybWF0aW9uLlxuXG4gICAgICAgIG1haW5DYW1lcmEubGF5ZXJzLm1hc2sgPSAxIDw8IHRoaXMuc2VsZWN0aW9uTGF5ZXI7XG4gICAgICAgIHRoaXMucmVuZGVyUGFzc01hc2sucmVuZGVyKHJlbmRlcmVyLCB0aGlzLnJlbmRlclRhcmdldE1hc2spOyAvLyBSZXN0b3JlIHRoZSBjYW1lcmEgbGF5ZXIgbWFzayBhbmQgdGhlIHNjZW5lIGJhY2tncm91bmQuXG5cbiAgICAgICAgbWFpbkNhbWVyYS5sYXllcnMubWFzayA9IG1hc2s7XG4gICAgICAgIG1haW5TY2VuZS5iYWNrZ3JvdW5kID0gYmFja2dyb3VuZDsgLy8gRGV0ZWN0IHRoZSBvdXRsaW5lLlxuXG4gICAgICAgIHRoaXMubWF0ZXJpYWwgPSB0aGlzLm91dGxpbmVFZGdlc01hdGVyaWFsO1xuICAgICAgICByZW5kZXJlci5yZW5kZXIodGhpcy5zY2VuZSwgdGhpcy5jYW1lcmEsIHRoaXMucmVuZGVyVGFyZ2V0RWRnZXMpO1xuXG4gICAgICAgIGlmICh0aGlzLmJsdXJQYXNzLmVuYWJsZWQpIHtcbiAgICAgICAgICAvLyBCbHVyIHRoZSBlZGdlcy5cbiAgICAgICAgICB0aGlzLmJsdXJQYXNzLnJlbmRlcihyZW5kZXJlciwgdGhpcy5yZW5kZXJUYXJnZXRFZGdlcywgdGhpcy5yZW5kZXJUYXJnZXRCbHVycmVkRWRnZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuYmxlbmQpIHtcbiAgICAgICAgICAvLyBEcmF3IHRoZSBmaW5hbCBvdmVybGF5IG9udG8gdGhlIHNjZW5lIGNvbG91cnMuXG4gICAgICAgICAgdGhpcy5tYXRlcmlhbCA9IHRoaXMub3V0bGluZUJsZW5kTWF0ZXJpYWw7XG4gICAgICAgICAgdGhpcy5vdXRsaW5lQmxlbmRNYXRlcmlhbC51bmlmb3Jtcy50RGlmZnVzZS52YWx1ZSA9IGlucHV0QnVmZmVyLnRleHR1cmU7XG4gICAgICAgICAgcmVuZGVyZXIucmVuZGVyKHRoaXMuc2NlbmUsIHRoaXMuY2FtZXJhLCB0aGlzLnJlbmRlclRvU2NyZWVuID8gbnVsbCA6IHRoaXMub3V0cHV0QnVmZmVyKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0aGlzLnJlbmRlclRvU2NyZWVuKSB7XG4gICAgICAgIC8vIERyYXcgdGhlIHJlYWQgYnVmZmVyIHRvIHNjcmVlbi5cbiAgICAgICAgdGhpcy5jb3B5UGFzcy5yZW5kZXIocmVuZGVyZXIsIGlucHV0QnVmZmVyKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBVcGRhdGVzIHRoZSBzaXplIG9mIHRoaXMgcGFzcy5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gd2lkdGggLSBUaGUgd2lkdGguXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gaGVpZ2h0IC0gVGhlIGhlaWdodC5cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwic2V0U2l6ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRTaXplKHdpZHRoLCBoZWlnaHQpIHtcbiAgICAgIHRoaXMucmVuZGVyVGFyZ2V0RGVwdGguc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KTtcbiAgICAgIHRoaXMucmVuZGVyVGFyZ2V0TWFzay5zZXRTaXplKHdpZHRoLCBoZWlnaHQpO1xuICAgICAgdGhpcy5yZW5kZXJQYXNzRGVwdGguc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KTtcbiAgICAgIHRoaXMucmVuZGVyUGFzc01hc2suc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KTtcbiAgICAgIHRoaXMuYmx1clBhc3Muc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KTtcbiAgICAgIHdpZHRoID0gdGhpcy5ibHVyUGFzcy53aWR0aDtcbiAgICAgIGhlaWdodCA9IHRoaXMuYmx1clBhc3MuaGVpZ2h0O1xuICAgICAgdGhpcy5yZW5kZXJUYXJnZXRFZGdlcy5zZXRTaXplKHdpZHRoLCBoZWlnaHQpO1xuICAgICAgdGhpcy5yZW5kZXJUYXJnZXRCbHVycmVkRWRnZXMuc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KTtcbiAgICAgIHRoaXMub3V0bGluZUJsZW5kTWF0ZXJpYWwudW5pZm9ybXMuYXNwZWN0LnZhbHVlID0gd2lkdGggLyBoZWlnaHQ7XG4gICAgICB0aGlzLm91dGxpbmVFZGdlc01hdGVyaWFsLnNldFRleGVsU2l6ZSgxLjAgLyB3aWR0aCwgMS4wIC8gaGVpZ2h0KTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBQZXJmb3JtcyBpbml0aWFsaXphdGlvbiB0YXNrcy5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1dlYkdMUmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBhbHBoYSAtIFdoZXRoZXIgdGhlIHJlbmRlcmVyIHVzZXMgdGhlIGFscGhhIGNoYW5uZWwgb3Igbm90LlxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJpbml0aWFsaXplXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGluaXRpYWxpemUocmVuZGVyZXIsIGFscGhhKSB7XG4gICAgICB0aGlzLnJlbmRlclBhc3NEZXB0aC5pbml0aWFsaXplKHJlbmRlcmVyLCBhbHBoYSk7XG4gICAgICB0aGlzLnJlbmRlclBhc3NNYXNrLmluaXRpYWxpemUocmVuZGVyZXIsIGFscGhhKTtcbiAgICAgIHRoaXMuYmx1clBhc3MuaW5pdGlhbGl6ZShyZW5kZXJlciwgYWxwaGEpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJyZXNvbHV0aW9uU2NhbGVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmJsdXJQYXNzLnJlc29sdXRpb25TY2FsZTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBZb3UgbmVlZCB0byBjYWxsIHtAbGluayBFZmZlY3RDb21wb3NlciNzZXRTaXplfSBhZnRlciBjaGFuZ2luZyB0aGlzIHZhbHVlLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtOdW1iZXJ9XHJcbiAgICAgKi9cbiAgICAsXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQoKSB7XG4gICAgICB2YXIgdmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IDAuNTtcbiAgICAgIHRoaXMuYmx1clBhc3MucmVzb2x1dGlvblNjYWxlID0gdmFsdWU7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogVGhlIGJsdXIga2VybmVsIHNpemUuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge0tlcm5lbFNpemV9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImtlcm5lbFNpemVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmJsdXJQYXNzLmtlcm5lbFNpemU7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogQHR5cGUge0tlcm5lbFNpemV9XHJcbiAgICAgKi9cbiAgICAsXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQoKSB7XG4gICAgICB2YXIgdmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IEtlcm5lbFNpemUuVkVSWV9TTUFMTDtcbiAgICAgIHRoaXMuYmx1clBhc3Mua2VybmVsU2l6ZSA9IHZhbHVlO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBvdXRsaW5lIG92ZXJsYXkgc2hvdWxkIGJlIGJsdXJyZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge0Jvb2xlYW59XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImJsdXJcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmJsdXJQYXNzLmVuYWJsZWQ7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogQHR5cGUge0Jvb2xlYW59XHJcbiAgICAgKi9cbiAgICAsXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQodmFsdWUpIHtcbiAgICAgIHRoaXMuYmx1clBhc3MuZW5hYmxlZCA9IHZhbHVlO1xuICAgICAgdGhpcy5vdXRsaW5lQmxlbmRNYXRlcmlhbC51bmlmb3Jtcy50RWRnZXMudmFsdWUgPSB2YWx1ZSA/IHRoaXMucmVuZGVyVGFyZ2V0Qmx1cnJlZEVkZ2VzLnRleHR1cmUgOiB0aGlzLnJlbmRlclRhcmdldEVkZ2VzLnRleHR1cmU7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgZGl0aGVyaW5nIGlzIGVuYWJsZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge0Jvb2xlYW59XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImRpdGhlcmluZ1wiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuYmx1clBhc3MuZGl0aGVyaW5nO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIElmIGVuYWJsZWQsIHRoZSByZXN1bHQgd2lsbCBiZSBkaXRoZXJlZCB0byByZW1vdmUgYmFuZGluZyBhcnRpZmFjdHMuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge0Jvb2xlYW59XHJcbiAgICAgKi9cbiAgICAsXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQodmFsdWUpIHtcbiAgICAgIHRoaXMuYmx1clBhc3MuZGl0aGVyaW5nID0gdmFsdWU7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVmZmVjdCBzaG91bGQgYmUgYXBwbGllZCB0byB0aGUgaW5wdXQgYnVmZmVyLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtCb29sZWFufVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJibGVuZFwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMubmVlZHNTd2FwO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIElmIGRpc2FibGVkLCB0aGUgaW5wdXQgYnVmZmVyIHdpbGwgcmVtYWluIHVuYWZmZWN0ZWQuXHJcbiAgICAgKlxyXG4gICAgICogWW91IG1heSB1c2UgdGhlIHtAbGluayBCbG9vbVBhc3Mjb3ZlcmxheX0gdGV4dHVyZSB0byBhcHBseSB0aGUgZWZmZWN0IHRvXHJcbiAgICAgKiB5b3VyIHNjZW5lLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtCb29sZWFufVxyXG4gICAgICovXG4gICAgLFxuICAgIHNldDogZnVuY3Rpb24gc2V0KHZhbHVlKSB7XG4gICAgICB0aGlzLm5lZWRzU3dhcCA9IHZhbHVlO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIFRoZSBlZmZlY3Qgb3ZlcmxheSB0ZXh0dXJlLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtUZXh0dXJlfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJvdmVybGF5XCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5vdXRsaW5lQmxlbmRNYXRlcmlhbC51bmlmb3Jtcy50RWRnZXMudmFsdWU7XG4gICAgfVxuICB9XSk7XG5cbiAgaW5oZXJpdHMoT3V0bGluZVBhc3MsIF9QYXNzKTtcblxuICByZXR1cm4gT3V0bGluZVBhc3M7XG59KFBhc3MpO1xuXG4vKipcclxuICogQSBwaXhlbGF0aW9uIHBhc3MuXHJcbiAqL1xuXG52YXIgUGl4ZWxhdGlvblBhc3MgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9QYXNzKSB7XG4gIC8qKlxyXG4gICAqIENvbnN0cnVjdHMgYSBuZXcgcGl4ZWxhdGlvbiBwYXNzLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtncmFudWxhcml0eT0zMC4wXSAtIFRoZSBpbnRlbnNpdHkgb2YgdGhlIGVmZmVjdC5cclxuICAgKi9cbiAgZnVuY3Rpb24gUGl4ZWxhdGlvblBhc3MoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgdmFyIGdyYW51bGFyaXR5ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiAzMC4wO1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgUGl4ZWxhdGlvblBhc3MpO1xuXG4gICAgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIGdldFByb3RvdHlwZU9mJDIoUGl4ZWxhdGlvblBhc3MpLmNhbGwodGhpcywgXCJQaXhlbGF0aW9uUGFzc1wiKSk7XG4gICAgX3RoaXMubWF0ZXJpYWwgPSBuZXcgUGl4ZWxhdGlvbk1hdGVyaWFsKCk7XG4gICAgX3RoaXMuZ3JhbnVsYXJpdHkgPSBncmFudWxhcml0eTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgLyoqXHJcbiAgICogVGhlIHBpeGVsIGdyYW51bGFyaXR5LlxyXG4gICAqXHJcbiAgICogQHR5cGUge051bWJlcn1cclxuICAgKi9cblxuXG4gIGNyZWF0ZUNsYXNzKFBpeGVsYXRpb25QYXNzLCBbe1xuICAgIGtleTogXCJyZW5kZXJcIixcblxuICAgIC8qKlxyXG4gICAgICogUmVuZGVycyB0aGUgZWZmZWN0LlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7V2ViR0xSZW5kZXJlcn0gcmVuZGVyZXIgLSBUaGUgcmVuZGVyZXIuXHJcbiAgICAgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSBpbnB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgY29udGFpbnMgdGhlIHJlc3VsdCBvZiB0aGUgcHJldmlvdXMgcGFzcy5cclxuICAgICAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IG91dHB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgc2VydmVzIGFzIHRoZSBvdXRwdXQgcmVuZGVyIHRhcmdldCB1bmxlc3MgdGhpcyBwYXNzIHJlbmRlcnMgdG8gc2NyZWVuLlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IFtkZWx0YV0gLSBUaGUgdGltZSBiZXR3ZWVuIHRoZSBsYXN0IGZyYW1lIGFuZCB0aGUgY3VycmVudCBvbmUgaW4gc2Vjb25kcy5cclxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gW3N0ZW5jaWxUZXN0XSAtIEluZGljYXRlcyB3aGV0aGVyIGEgc3RlbmNpbCBtYXNrIGlzIGFjdGl2ZS5cclxuICAgICAqL1xuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIocmVuZGVyZXIsIGlucHV0QnVmZmVyLCBvdXRwdXRCdWZmZXIsIGRlbHRhLCBzdGVuY2lsVGVzdCkge1xuICAgICAgdGhpcy5tYXRlcmlhbC51bmlmb3Jtcy50RGlmZnVzZS52YWx1ZSA9IGlucHV0QnVmZmVyLnRleHR1cmU7XG4gICAgICByZW5kZXJlci5yZW5kZXIodGhpcy5zY2VuZSwgdGhpcy5jYW1lcmEsIHRoaXMucmVuZGVyVG9TY3JlZW4gPyBudWxsIDogb3V0cHV0QnVmZmVyKTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBVcGRhdGVzIHRoZSBzaXplIG9mIHRoaXMgcGFzcy5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gd2lkdGggLSBUaGUgd2lkdGguXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gaGVpZ2h0IC0gVGhlIGhlaWdodC5cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwic2V0U2l6ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRTaXplKHdpZHRoLCBoZWlnaHQpIHtcbiAgICAgIHRoaXMubWF0ZXJpYWwuc2V0UmVzb2x1dGlvbih3aWR0aCwgaGVpZ2h0KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiZ3JhbnVsYXJpdHlcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLm1hdGVyaWFsLmdyYW51bGFyaXR5O1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEEgaGlnaGVyIHZhbHVlIHlpZWxkcyBjb2Fyc2VyIHZpc3VhbHMuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge051bWJlcn1cclxuICAgICAqL1xuICAgICxcbiAgICBzZXQ6IGZ1bmN0aW9uIHNldCgpIHtcbiAgICAgIHZhciB2YWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogMzA7XG4gICAgICB2YWx1ZSA9IE1hdGguZmxvb3IodmFsdWUpO1xuXG4gICAgICBpZiAodmFsdWUgJSAyID4gMCkge1xuICAgICAgICB2YWx1ZSArPSAxO1xuICAgICAgfVxuXG4gICAgICB0aGlzLm1hdGVyaWFsLmdyYW51bGFyaXR5ID0gdmFsdWU7XG4gICAgfVxuICB9XSk7XG5cbiAgaW5oZXJpdHMoUGl4ZWxhdGlvblBhc3MsIF9QYXNzKTtcblxuICByZXR1cm4gUGl4ZWxhdGlvblBhc3M7XG59KFBhc3MpO1xuXG4vKipcclxuICogQW4gYWR2YW5jZWQgRGVwdGggb2YgRmllbGQgKERvRikgcGFzcy5cclxuICpcclxuICogWWllbGRzIG1vcmUgcmVhbGlzdGljIHJlc3VsdHMgYnV0IGlzIGFsc28gbW9yZSBkZW1hbmRpbmcuXHJcbiAqXHJcbiAqIFRoaXMgcGFzcyByZXF1aXJlcyBhIHtAbGluayBFZmZlY3RDb21wb3NlciNkZXB0aFRleHR1cmV9LlxyXG4gKi9cblxudmFyIFJlYWxpc3RpY0Jva2VoUGFzcyA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX1Bhc3MpIHtcbiAgLyoqXHJcbiAgICogQ29uc3RydWN0cyBhIG5ldyBib2tlaCBwYXNzLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtQZXJzcGVjdGl2ZUNhbWVyYX0gY2FtZXJhIC0gVGhlIG1haW4gY2FtZXJhLiBVc2VkIHRvIG9idGFpbiB0aGUgZm9jYWwgbGVuZ3RoIGFuZCB0aGUgbmVhciBhbmQgZmFyIHBsYW5lIHNldHRpbmdzLlxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gLSBBZGRpdGlvbmFsIHBhcmFtZXRlcnMuIFNlZSB7QGxpbmsgUmVhbGlzdGljQm9rZWhNYXRlcmlhbH0gZm9yIGRldGFpbHMuXHJcbiAgICovXG4gIGZ1bmN0aW9uIFJlYWxpc3RpY0Jva2VoUGFzcyhjYW1lcmEpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBSZWFsaXN0aWNCb2tlaFBhc3MpO1xuXG4gICAgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIGdldFByb3RvdHlwZU9mJDIoUmVhbGlzdGljQm9rZWhQYXNzKS5jYWxsKHRoaXMsIFwiUmVhbGlzdGljQm9rZWhQYXNzXCIpKTtcbiAgICBfdGhpcy5tYXRlcmlhbCA9IG5ldyBSZWFsaXN0aWNCb2tlaE1hdGVyaWFsKGNhbWVyYSwgb3B0aW9ucyk7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG4gIC8qKlxyXG4gICAqIFJlbmRlcnMgdGhlIGVmZmVjdC5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7V2ViR0xSZW5kZXJlcn0gcmVuZGVyZXIgLSBUaGUgcmVuZGVyZXIuXHJcbiAgICogQHBhcmFtIHtXZWJHTFJlbmRlclRhcmdldH0gaW5wdXRCdWZmZXIgLSBBIGZyYW1lIGJ1ZmZlciB0aGF0IGNvbnRhaW5zIHRoZSByZXN1bHQgb2YgdGhlIHByZXZpb3VzIHBhc3MuXHJcbiAgICogQHBhcmFtIHtXZWJHTFJlbmRlclRhcmdldH0gb3V0cHV0QnVmZmVyIC0gQSBmcmFtZSBidWZmZXIgdGhhdCBzZXJ2ZXMgYXMgdGhlIG91dHB1dCByZW5kZXIgdGFyZ2V0IHVubGVzcyB0aGlzIHBhc3MgcmVuZGVycyB0byBzY3JlZW4uXHJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtkZWx0YV0gLSBUaGUgdGltZSBiZXR3ZWVuIHRoZSBsYXN0IGZyYW1lIGFuZCB0aGUgY3VycmVudCBvbmUgaW4gc2Vjb25kcy5cclxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtzdGVuY2lsVGVzdF0gLSBJbmRpY2F0ZXMgd2hldGhlciBhIHN0ZW5jaWwgbWFzayBpcyBhY3RpdmUuXHJcbiAgICovXG5cblxuICBjcmVhdGVDbGFzcyhSZWFsaXN0aWNCb2tlaFBhc3MsIFt7XG4gICAga2V5OiBcInJlbmRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIocmVuZGVyZXIsIGlucHV0QnVmZmVyLCBvdXRwdXRCdWZmZXIsIGRlbHRhLCBzdGVuY2lsVGVzdCkge1xuICAgICAgdGhpcy5tYXRlcmlhbC51bmlmb3Jtcy50RGlmZnVzZS52YWx1ZSA9IGlucHV0QnVmZmVyLnRleHR1cmU7XG4gICAgICB0aGlzLm1hdGVyaWFsLnVuaWZvcm1zLnREZXB0aC52YWx1ZSA9IGlucHV0QnVmZmVyLmRlcHRoVGV4dHVyZTtcbiAgICAgIHJlbmRlcmVyLnJlbmRlcih0aGlzLnNjZW5lLCB0aGlzLmNhbWVyYSwgdGhpcy5yZW5kZXJUb1NjcmVlbiA/IG51bGwgOiBvdXRwdXRCdWZmZXIpO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIFVwZGF0ZXMgdGhlIHNpemUgb2YgdGhpcyBwYXNzLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSB3aWR0aCAtIFRoZSB3aWR0aC5cclxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBoZWlnaHQgLSBUaGUgaGVpZ2h0LlxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJzZXRTaXplXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldFNpemUod2lkdGgsIGhlaWdodCkge1xuICAgICAgdGhpcy5tYXRlcmlhbC5zZXRUZXhlbFNpemUoMS4wIC8gd2lkdGgsIDEuMCAvIGhlaWdodCk7XG4gICAgfVxuICB9XSk7XG5cbiAgaW5oZXJpdHMoUmVhbGlzdGljQm9rZWhQYXNzLCBfUGFzcyk7XG5cbiAgcmV0dXJuIFJlYWxpc3RpY0Jva2VoUGFzcztcbn0oUGFzcyk7XG5cbi8qKlxyXG4gKiBBIHBhc3MgdGhhdCByZW5kZXJzIHRoZSByZXN1bHQgZnJvbSBhIHByZXZpb3VzIHBhc3MgdG8gYW5vdGhlciByZW5kZXIgdGFyZ2V0LlxyXG4gKi9cblxudmFyIFNhdmVQYXNzID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfUGFzcykge1xuICAvKipcclxuICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHNhdmUgcGFzcy5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IFtyZW5kZXJUYXJnZXRdIC0gVGhlIHJlbmRlciB0YXJnZXQgdG8gdXNlIGZvciBzYXZpbmcgdGhlIGlucHV0IGJ1ZmZlci5cclxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtyZXNpemU9dHJ1ZV0gLSBXaGV0aGVyIHRoZSByZW5kZXIgdGFyZ2V0IHNob3VsZCBhZGp1c3QgdG8gdGhlIHNpemUgb2YgdGhlIGlucHV0IGJ1ZmZlci5cclxuICAgKi9cbiAgZnVuY3Rpb24gU2F2ZVBhc3MocmVuZGVyVGFyZ2V0KSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgdmFyIHJlc2l6ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogdHJ1ZTtcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIFNhdmVQYXNzKTtcblxuICAgIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBnZXRQcm90b3R5cGVPZiQyKFNhdmVQYXNzKS5jYWxsKHRoaXMsIFwiU2F2ZVBhc3NcIikpO1xuICAgIF90aGlzLm1hdGVyaWFsID0gbmV3IENvcHlNYXRlcmlhbCgpO1xuICAgIF90aGlzLm5lZWRzU3dhcCA9IGZhbHNlO1xuICAgIC8qKlxyXG4gICAgICogVGhlIHJlbmRlciB0YXJnZXQuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge1dlYkdMUmVuZGVyVGFyZ2V0fVxyXG4gICAgICovXG5cbiAgICBfdGhpcy5yZW5kZXJUYXJnZXQgPSByZW5kZXJUYXJnZXQgIT09IHVuZGVmaW5lZCA/IHJlbmRlclRhcmdldCA6IG5ldyBXZWJHTFJlbmRlclRhcmdldCgxLCAxLCB7XG4gICAgICBtaW5GaWx0ZXI6IExpbmVhckZpbHRlcixcbiAgICAgIG1hZ0ZpbHRlcjogTGluZWFyRmlsdGVyLFxuICAgICAgc3RlbmNpbEJ1ZmZlcjogZmFsc2UsXG4gICAgICBkZXB0aEJ1ZmZlcjogZmFsc2VcbiAgICB9KTtcbiAgICBfdGhpcy5yZW5kZXJUYXJnZXQudGV4dHVyZS5uYW1lID0gXCJTYXZlLlRhcmdldFwiO1xuICAgIF90aGlzLnJlbmRlclRhcmdldC50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlO1xuICAgIC8qKlxyXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHJlbmRlciB0YXJnZXQgc2hvdWxkIGJlIHJlc2l6ZWQgd2hlbiB0aGUgc2l6ZSBvZlxyXG4gICAgICogdGhlIGNvbXBvc2VyJ3MgZnJhbWUgYnVmZmVyIGNoYW5nZXMuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge0Jvb2xlYW59XHJcbiAgICAgKi9cblxuICAgIF90aGlzLnJlc2l6ZSA9IHJlc2l6ZTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgLyoqXHJcbiAgICogUmVuZGVycyB0aGUgZWZmZWN0LlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtXZWJHTFJlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlci5cclxuICAgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSBpbnB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgY29udGFpbnMgdGhlIHJlc3VsdCBvZiB0aGUgcHJldmlvdXMgcGFzcy5cclxuICAgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSBvdXRwdXRCdWZmZXIgLSBBIGZyYW1lIGJ1ZmZlciB0aGF0IHNlcnZlcyBhcyB0aGUgb3V0cHV0IHJlbmRlciB0YXJnZXQgdW5sZXNzIHRoaXMgcGFzcyByZW5kZXJzIHRvIHNjcmVlbi5cclxuICAgKiBAcGFyYW0ge051bWJlcn0gW2RlbHRhXSAtIFRoZSB0aW1lIGJldHdlZW4gdGhlIGxhc3QgZnJhbWUgYW5kIHRoZSBjdXJyZW50IG9uZSBpbiBzZWNvbmRzLlxyXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW3N0ZW5jaWxUZXN0XSAtIEluZGljYXRlcyB3aGV0aGVyIGEgc3RlbmNpbCBtYXNrIGlzIGFjdGl2ZS5cclxuICAgKi9cblxuXG4gIGNyZWF0ZUNsYXNzKFNhdmVQYXNzLCBbe1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKHJlbmRlcmVyLCBpbnB1dEJ1ZmZlciwgb3V0cHV0QnVmZmVyLCBkZWx0YSwgc3RlbmNpbFRlc3QpIHtcbiAgICAgIHRoaXMubWF0ZXJpYWwudW5pZm9ybXMudERpZmZ1c2UudmFsdWUgPSBpbnB1dEJ1ZmZlci50ZXh0dXJlO1xuICAgICAgcmVuZGVyZXIucmVuZGVyKHRoaXMuc2NlbmUsIHRoaXMuY2FtZXJhLCB0aGlzLnJlbmRlclRhcmdldCk7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogVXBkYXRlcyB0aGUgc2l6ZSBvZiB0aGlzIHBhc3MuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHdpZHRoIC0gVGhlIHdpZHRoLlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGhlaWdodCAtIFRoZSBoZWlnaHQuXHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInNldFNpemVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KSB7XG4gICAgICBpZiAodGhpcy5yZXNpemUpIHtcbiAgICAgICAgd2lkdGggPSBNYXRoLm1heCgxLCB3aWR0aCk7XG4gICAgICAgIGhlaWdodCA9IE1hdGgubWF4KDEsIGhlaWdodCk7XG4gICAgICAgIHRoaXMucmVuZGVyVGFyZ2V0LnNldFNpemUod2lkdGgsIGhlaWdodCk7XG4gICAgICB9XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogUGVyZm9ybXMgaW5pdGlhbGl6YXRpb24gdGFza3MuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtXZWJHTFJlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlci5cclxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gYWxwaGEgLSBXaGV0aGVyIHRoZSByZW5kZXJlciB1c2VzIHRoZSBhbHBoYSBjaGFubmVsIG9yIG5vdC5cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiaW5pdGlhbGl6ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpbml0aWFsaXplKHJlbmRlcmVyLCBhbHBoYSkge1xuICAgICAgaWYgKCFhbHBoYSkge1xuICAgICAgICB0aGlzLnJlbmRlclRhcmdldC50ZXh0dXJlLmZvcm1hdCA9IFJHQkZvcm1hdDtcbiAgICAgIH1cbiAgICB9XG4gIH1dKTtcblxuICBpbmhlcml0cyhTYXZlUGFzcywgX1Bhc3MpO1xuXG4gIHJldHVybiBTYXZlUGFzcztcbn0oUGFzcyk7XG5cbi8qKlxyXG4gKiBIYWxmIFBJLlxyXG4gKlxyXG4gKiBAdHlwZSB7TnVtYmVyfVxyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cblxudmFyIEhBTEZfUEkgPSBNYXRoLlBJICogMC41O1xuLyoqXHJcbiAqIEEgdmVjdG9yLlxyXG4gKlxyXG4gKiBAdHlwZSB7VmVjdG9yM31cclxuICogQHByaXZhdGVcclxuICovXG5cbnZhciB2ID0gbmV3IFZlY3RvcjMoKTtcbi8qKlxyXG4gKiBBIHZlY3Rvci5cclxuICpcclxuICogQHR5cGUge1ZlY3RvcjN9XHJcbiAqIEBwcml2YXRlXHJcbiAqL1xuXG52YXIgYWIgPSBuZXcgVmVjdG9yMygpO1xuLyoqXHJcbiAqIEEgc2hvY2sgd2F2ZSBwYXNzLlxyXG4gKi9cblxudmFyIFNob2NrV2F2ZVBhc3MgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKF9QYXNzKSB7XG4gIC8qKlxyXG4gICAqIENvbnN0cnVjdHMgYSBuZXcgc2hvY2sgd2F2ZSBwYXNzLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtDYW1lcmF9IGNhbWVyYSAtIFRoZSBtYWluIGNhbWVyYS5cclxuICAgKiBAcGFyYW0ge1ZlY3RvcjN9IFtlcGljZW50ZXJdIC0gVGhlIHdvcmxkIHBvc2l0aW9uIG9mIHRoZSBzaG9jayB3YXZlIGVwaWNlbnRlci5cclxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gVGhlIG9wdGlvbnMuXHJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLnNwZWVkPTEuMF0gLSBUaGUgYW5pbWF0aW9uIHNwZWVkLlxyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5tYXhSYWRpdXM9MS4wXSAtIFRoZSBleHRlbnQgb2YgdGhlIHNob2NrIHdhdmUuXHJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLndhdmVTaXplPTAuMl0gLSBUaGUgd2F2ZSBzaXplLlxyXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5hbXBsaXR1ZGU9MC4wNV0gLSBUaGUgZGlzdG9ydGlvbiBhbXBsaXR1ZGUuXHJcbiAgICovXG4gIGZ1bmN0aW9uIFNob2NrV2F2ZVBhc3MoY2FtZXJhKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgdmFyIGVwaWNlbnRlciA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogbmV3IFZlY3RvcjMoKTtcbiAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDoge307XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBTaG9ja1dhdmVQYXNzKTtcblxuICAgIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBnZXRQcm90b3R5cGVPZiQyKFNob2NrV2F2ZVBhc3MpLmNhbGwodGhpcywgXCJTaG9ja1dhdmVQYXNzXCIpKTtcbiAgICAvKipcclxuICAgICAqIFRoZSBtYWluIGNhbWVyYS5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7T2JqZWN0M0R9XHJcbiAgICAgKi9cblxuICAgIF90aGlzLm1haW5DYW1lcmEgPSBjYW1lcmE7XG4gICAgLyoqXHJcbiAgICAgKiBUaGUgZXBpY2VudGVyLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtWZWN0b3IzfVxyXG4gICAgICogQGV4YW1wbGUgc2hvY2tXYXZlUGFzcy5lcGljZW50ZXIgPSBteU1lc2gucG9zaXRpb247XHJcbiAgICAgKi9cblxuICAgIF90aGlzLmVwaWNlbnRlciA9IGVwaWNlbnRlcjtcbiAgICAvKipcclxuICAgICAqIFRoZSBvYmplY3QgcG9zaXRpb24gaW4gc2NyZWVuIHNwYWNlLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtWZWN0b3IzfVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xuXG4gICAgX3RoaXMuc2NyZWVuUG9zaXRpb24gPSBuZXcgVmVjdG9yMygpO1xuICAgIC8qKlxyXG4gICAgICogVGhlIHNwZWVkIG9mIHRoZSBzaG9jayB3YXZlIGFuaW1hdGlvbi5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7TnVtYmVyfVxyXG4gICAgICovXG5cbiAgICBfdGhpcy5zcGVlZCA9IG9wdGlvbnMuc3BlZWQgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuc3BlZWQgOiAyLjA7XG4gICAgLyoqXHJcbiAgICAgKiBBIHRpbWUgYWNjdW11bGF0b3IuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge051bWJlcn1cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cblxuICAgIF90aGlzLnRpbWUgPSAwLjA7XG4gICAgLyoqXHJcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgc2hvY2sgd2F2ZSBhbmltYXRpb24gaXMgYWN0aXZlLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtCb29sZWFufVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xuXG4gICAgX3RoaXMuYWN0aXZlID0gZmFsc2U7XG4gICAgLyoqXHJcbiAgICAgKiBBIHNob2NrIHdhdmUgc2hhZGVyIG1hdGVyaWFsLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtTaG9ja1dhdmVNYXRlcmlhbH1cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cblxuICAgIF90aGlzLnNob2NrV2F2ZU1hdGVyaWFsID0gbmV3IFNob2NrV2F2ZU1hdGVyaWFsKG9wdGlvbnMpO1xuICAgIF90aGlzLnNob2NrV2F2ZU1hdGVyaWFsLnVuaWZvcm1zLmNlbnRlci52YWx1ZSA9IF90aGlzLnNjcmVlblBvc2l0aW9uO1xuICAgIC8qKlxyXG4gICAgICogQSBjb3B5IHNoYWRlciBtYXRlcmlhbC5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7Q29weU1hdGVyaWFsfVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xuXG4gICAgX3RoaXMuY29weU1hdGVyaWFsID0gbmV3IENvcHlNYXRlcmlhbCgpO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuICAvKipcclxuICAgKiBFbWl0cyB0aGUgc2hvY2sgd2F2ZS5cclxuICAgKi9cblxuXG4gIGNyZWF0ZUNsYXNzKFNob2NrV2F2ZVBhc3MsIFt7XG4gICAga2V5OiBcImV4cGxvZGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZXhwbG9kZSgpIHtcbiAgICAgIHRoaXMudGltZSA9IDAuMDtcbiAgICAgIHRoaXMuYWN0aXZlID0gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBSZW5kZXJzIHRoZSBlZmZlY3QuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtXZWJHTFJlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlci5cclxuICAgICAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IGlucHV0QnVmZmVyIC0gQSBmcmFtZSBidWZmZXIgdGhhdCBjb250YWlucyB0aGUgcmVzdWx0IG9mIHRoZSBwcmV2aW91cyBwYXNzLlxyXG4gICAgICogQHBhcmFtIHtXZWJHTFJlbmRlclRhcmdldH0gb3V0cHV0QnVmZmVyIC0gQSBmcmFtZSBidWZmZXIgdGhhdCBzZXJ2ZXMgYXMgdGhlIG91dHB1dCByZW5kZXIgdGFyZ2V0IHVubGVzcyB0aGlzIHBhc3MgcmVuZGVycyB0byBzY3JlZW4uXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gW2RlbHRhXSAtIFRoZSB0aW1lIGJldHdlZW4gdGhlIGxhc3QgZnJhbWUgYW5kIHRoZSBjdXJyZW50IG9uZSBpbiBzZWNvbmRzLlxyXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBbc3RlbmNpbFRlc3RdIC0gSW5kaWNhdGVzIHdoZXRoZXIgYSBzdGVuY2lsIG1hc2sgaXMgYWN0aXZlLlxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKHJlbmRlcmVyLCBpbnB1dEJ1ZmZlciwgb3V0cHV0QnVmZmVyLCBkZWx0YSwgc3RlbmNpbFRlc3QpIHtcbiAgICAgIHZhciBlcGljZW50ZXIgPSB0aGlzLmVwaWNlbnRlcjtcbiAgICAgIHZhciBtYWluQ2FtZXJhID0gdGhpcy5tYWluQ2FtZXJhO1xuICAgICAgdmFyIHNjcmVlblBvc2l0aW9uID0gdGhpcy5zY3JlZW5Qb3NpdGlvbjtcbiAgICAgIHZhciBzaG9ja1dhdmVNYXRlcmlhbCA9IHRoaXMuc2hvY2tXYXZlTWF0ZXJpYWw7XG4gICAgICB2YXIgdW5pZm9ybXMgPSBzaG9ja1dhdmVNYXRlcmlhbC51bmlmb3JtcztcbiAgICAgIHZhciBjZW50ZXIgPSB1bmlmb3Jtcy5jZW50ZXI7XG4gICAgICB2YXIgcmFkaXVzID0gdW5pZm9ybXMucmFkaXVzO1xuICAgICAgdmFyIG1heFJhZGl1cyA9IHVuaWZvcm1zLm1heFJhZGl1cztcbiAgICAgIHZhciB3YXZlU2l6ZSA9IHVuaWZvcm1zLndhdmVTaXplO1xuICAgICAgdGhpcy5jb3B5TWF0ZXJpYWwudW5pZm9ybXMudERpZmZ1c2UudmFsdWUgPSBpbnB1dEJ1ZmZlci50ZXh0dXJlO1xuICAgICAgdGhpcy5tYXRlcmlhbCA9IHRoaXMuY29weU1hdGVyaWFsO1xuXG4gICAgICBpZiAodGhpcy5hY3RpdmUpIHtcbiAgICAgICAgLy8gQ2FsY3VsYXRlIGRpcmVjdGlvbiB2ZWN0b3JzLlxuICAgICAgICBtYWluQ2FtZXJhLmdldFdvcmxkRGlyZWN0aW9uKHYpO1xuICAgICAgICBhYi5jb3B5KG1haW5DYW1lcmEucG9zaXRpb24pLnN1YihlcGljZW50ZXIpOyAvLyBEb24ndCByZW5kZXIgdGhlIGVmZmVjdCBpZiB0aGUgb2JqZWN0IGlzIGJlaGluZCB0aGUgY2FtZXJhLlxuXG4gICAgICAgIGlmICh2LmFuZ2xlVG8oYWIpID4gSEFMRl9QSSkge1xuICAgICAgICAgIC8vIFNjYWxlIHRoZSBlZmZlY3QgYmFzZWQgb24gZGlzdGFuY2UgdG8gdGhlIG9iamVjdC5cbiAgICAgICAgICB1bmlmb3Jtcy5jYW1lcmFEaXN0YW5jZS52YWx1ZSA9IG1haW5DYW1lcmEucG9zaXRpb24uZGlzdGFuY2VUbyhlcGljZW50ZXIpOyAvLyBDYWxjdWxhdGUgdGhlIHNjcmVlbiBwb3NpdGlvbiBvZiB0aGUgZXBpY2VudGVyLlxuXG4gICAgICAgICAgc2NyZWVuUG9zaXRpb24uY29weShlcGljZW50ZXIpLnByb2plY3QobWFpbkNhbWVyYSk7XG4gICAgICAgICAgY2VudGVyLnZhbHVlLnggPSAoc2NyZWVuUG9zaXRpb24ueCArIDEuMCkgKiAwLjU7XG4gICAgICAgICAgY2VudGVyLnZhbHVlLnkgPSAoc2NyZWVuUG9zaXRpb24ueSArIDEuMCkgKiAwLjU7XG4gICAgICAgICAgdW5pZm9ybXMudERpZmZ1c2UudmFsdWUgPSBpbnB1dEJ1ZmZlci50ZXh0dXJlO1xuICAgICAgICAgIHRoaXMubWF0ZXJpYWwgPSBzaG9ja1dhdmVNYXRlcmlhbDtcbiAgICAgICAgfSAvLyBVcGRhdGUgdGhlIHNob2NrIHdhdmUgcmFkaXVzIGJhc2VkIG9uIHRpbWUuXG5cblxuICAgICAgICB0aGlzLnRpbWUgKz0gZGVsdGEgKiB0aGlzLnNwZWVkO1xuICAgICAgICByYWRpdXMudmFsdWUgPSB0aGlzLnRpbWUgLSB3YXZlU2l6ZS52YWx1ZTtcblxuICAgICAgICBpZiAocmFkaXVzLnZhbHVlID49IChtYXhSYWRpdXMudmFsdWUgKyB3YXZlU2l6ZS52YWx1ZSkgKiAyKSB7XG4gICAgICAgICAgdGhpcy5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZW5kZXJlci5yZW5kZXIodGhpcy5zY2VuZSwgdGhpcy5jYW1lcmEsIHRoaXMucmVuZGVyVG9TY3JlZW4gPyBudWxsIDogb3V0cHV0QnVmZmVyKTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBVcGRhdGVzIHRoZSBzaXplIG9mIHRoaXMgcGFzcy5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gd2lkdGggLSBUaGUgd2lkdGguXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gaGVpZ2h0IC0gVGhlIGhlaWdodC5cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwic2V0U2l6ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRTaXplKHdpZHRoLCBoZWlnaHQpIHtcbiAgICAgIHRoaXMuc2hvY2tXYXZlTWF0ZXJpYWwudW5pZm9ybXMuYXNwZWN0LnZhbHVlID0gd2lkdGggLyBoZWlnaHQ7XG4gICAgfVxuICB9XSk7XG5cbiAgaW5oZXJpdHMoU2hvY2tXYXZlUGFzcywgX1Bhc3MpO1xuXG4gIHJldHVybiBTaG9ja1dhdmVQYXNzO1xufShQYXNzKTtcblxuLy8gR2VuZXJhdGVkIHdpdGggU01BQVNlYXJjaEltYWdlRGF0YS5nZW5lcmF0ZSgpLnRvQ2FudmFzKCkudG9EYXRhVVJMKCksIG5vdCBjcm9wcGVkLCBsb3cgZHluYW1pYyByYW5nZS5cbnZhciBzZWFyY2hJbWFnZURhdGFVUkwgPSBcImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRUlBQUFBaENBQUFBQUJJWHlMQUFBQUFPRWxFUVZSSXgyTmdHQVdqWUJTTWdsRXdFSUNSRVlSZ0ZCWkJxRENTTEEyTUdQVUlWUUVURTlpTlVBcUxSNWdJZW9RS1Jnd1hqd0FBR240QXRhRmVZTEVBQUFBQVNVVk9SSzVDWUlJXCI7XG5cbi8vIEdlbmVyYXRlZCB3aXRoIFNNQUFBcmVhSW1hZ2VEYXRhLmdlbmVyYXRlKCkudG9DYW52YXMoKS50b0RhdGFVUkwoKS5cbnZhciBhcmVhSW1hZ2VEYXRhVVJMID0gXCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUtBQUFBSXdDQVlBQUFBQk5tQkhBQUFnQUVsRVFWUjRYdXk5Q2JobFYxa3RPdmJwcTA5RGtpSWtVQkk2a3hBU0lIMERsQVFpSUsxd1JmU0pUeCtpNEpYN3ZLSWlnczhIWHBYdnFWY3ZyY0M5YWdRN0lEVFNTV2dxQ1FRbGlEUkJKS2traERTa3FWUE5xVk9uUCs4Yi8vckgzUCtlWisxOTl0bHpuVlRsdlZyZnQ3KzFUN09hdWVaWTQyL20zN1FBTEtOazJ3SGcxcElUbEIxN21DK1BwMTFXM1gvTEh5VDMydmhnNDgvNVNPditQbndwc0hBNzBKb0dsdWVCMWlLQXBlcXp2T3puNDRHYXRUQjc2WHpoZDdzdUJSNytXV0FEZ0RFQXd3Q0cvTDU0Yi9wb0RMckh1dnZtNzBaMkF2aHNjK1BWY3hzY0JVOEY4QzhBRGc1K2lwSWpEL1BsR3dmZ2p1OEI5MjRFNXNlQVJVZkxzaU5tcVFXMElqTDgrN0wyTllELzdDT0J6ZmNDbSthQjhTVmdkQWtZSVJDWEt5RGF4NEVkQWFuTDVQdU5QbGxOdlhEbEFId0ZnUDhBY0MyQWhSSW9EWGJzWWI0OGRsNVdrVkZURTNMR0RjQzltNENaQ1dCdUZGZ2VBWmFHQVlKUVFDUnFESFQrTWNKclZiOHp3QVRVWEgwMk1IWWZNSEVJR0ZzQXhnakFwUXFBQ1lRT1JqdGQvQjdBeHQvejc5c0MwK2NNUGdqamx3UHdWd0hjQStEZkFIelR4Y1ZnV0Jyb3FNTjgrY1lCZU03MXdIMFR3S0V4WUhZVVdDSUFIWVJMVGxrQ1lnY0lCY0FnVS9uM3F5OEdSdTRIUmduQU9XQmtFUmhkZFBBSmhHSkRCeGt2dzdjcWltcit6Rk0vWkxuWkY2NGNnTDhCWUQrQVd3Qjh4L2RsV3VXYWdIaVlMOTg0QUovMFJXQnkxQUU0QWl6eU0xeXhZQWNUaWdXNTV4TWJBa3hFaXdFZGtKL1pDUXhQQWlPSGdCRUNjS0VDNFRCWmNLa1N2K21UaWVOY05QTkMyNm1MTnNqNDVRRDhMUURUQU80R2NKdC83aXcyYmZvRzRXRyt2QUd3bTlFeGlFZzY5enBnL3dnd1BRTE1qZ0FMem40RTRhSXpvSmpROWc0MDI0dXlna2orcHl1QW9YMFZBSWZuZ09INU5nQ0hNaEFtOFN2MnkzWERaZUJoTklwOE96SkU4T3NCekFLWUJIQVhnRHQ4LzRPK01WVDBqNGY1OG8wRDhQeHJnZjNEd013SU1FUFFFWVJrTndmZ3N1dURaTHNraXAwTm8wZ1dNRC85SEdEb0FEQWtBQzRBdy93c0FnWkFnczJaMEFCSTBHVTZJVm1LditmMjhLRG5IeGtBL0cwQTh5Nkc3M045a09DalhuaC9FYmI2T3Znd1g3NXhBRjV3TFRBMVZJSFBBRGdNTERqNHlJQTVBQW02YUNVbnY0b3o0NmVlRHd4TkFVTXp3SkF6NEJBQlNOREZUd1NmZzdEREtIRTIzTUc1UHFJWThBMXUvZElOczlkQmR5OEFnbkdQTTJOZlVCcnNudzd6NVJzSDRJWFhBQWNKdmlGZ2x1QWJ5Z0JJTm5TTFdPQWpHeEo0cGdPS0RWMHYvT1NMS3A4aUdYQm92aExCQk9DUU0yQUNvVE9obllyQWRJdFliQ2lqNUpGelJ5SUFxUmNjQW5EQVFVamc2VU5RN2hzTVhQMGNSUUFleHNzM0RzQ0xDRUNDTHdDUXpNY1B3VWkyTXdBU2NBS2JmblkvWVJMRlE4REhYK0lBSkFNU2ZEa0FGMTNrTHZsZUlqaGpRUUh4VVZTM2pqZ0dwS2VlTnpZVlFFamdVUzhrK1BnaE9OZGhJd0FQNCtYWEJZQ0hLSUpid0p5RFRnYUlBZENCSngzUTJNOHRZQUhQOW00ZGYveWxRT3NRMEpxdFJMQ3gzMEsxd3RMQmdnU2NRT2dzS0JHY1dIQUplT3dSQzBCU00xbVFJS1JiaGgrQmo5OEpRUDZ0NFUwQVBFeVhYeGNBRW54a1FBRndvVlV4SUQ5a3ZRZytjMUM3dmlkUmJJRGtjMjRCLy9oVFFHdW1EY0NXQTVEZ014QVNkTklGQlVJNXBDTUw4djhBUEk1emZFUXg0QnVkZ3FpY3p2aVNuSmhRd0NQNEJNQ0dsK3dPOCtVN0FKaS9XNE80WVM2K3BtSy8yY2lBRHNBT0JoVElJaUFKblBCN0F2TmpQKzBBbkFOYVlrQUhYMkpCQWMrdFlhSlhPcUJadjI0VmMzODZYVzVkdGtIR1crNEhGQUpvbnBPZStZWVFaQVNoZ0tqdjNQTnZQUWF4Vm9JOHpKZGZGd0FTZlB6TVV3UzNLdDF2MFVGSWxvczZvREZkQUdGY2xpTUFQL3J5QUVBR053UVJuRE9nTGJkbElFd3JJczZBWi9RZ2tNTUhRRjZaQUtRY0pBc1NZUHdJZUFJazl3SmdvUEsxZ2k3K1B3RjRHQy9mT0FBdklRUFNzMFVSVFBCSi9QcDNHU0VHUkhmQkNJUTB4b3dCdFViY0FqN3lzNVg0SmZ1MUhJQUdRcklnUVJYRXNBRlFJT1JERmhpRFkvck1IbXJVNFFVZ1IwOEFrZ1VqQ0FXNkNENkNrd0JzQUlRQzRHRzZmUE1BM09YaU56Q2cySTlnTkNNa3NtQUFvZW1Eem9pbUZ3TDQ4TTg1QUtraXVRVk1BQXA4Q1lSUkRBdDhHUWlKNjdONkdKT0RBWEFIbHNHZ3VzY0EyQUpnMUlQR1lteE9wQnhGV2tSTjlMc0FUZ0l3WG5Ocy92LzV6LzlYQ2Y4Qk8zWUF0eGJjLzQ2L0tEdCs1K2VhMVlrdTJWVXhIei96MHYyNEZ3TUdLMWdXc0syT1VVeEhIZENCZVJVQjZPeEhBQnI0WklDSUJkMFFXU0YrWFJkTVRBamdDZFRyRzljQk53RTRGOENwRGtJQ3lZTEdzdWhGdDZ6cytnSVN3VWVuOHpFQWpnTXc0Y2Z4Mkg2Ty85MHlBRm84NENiZzRJRDMvOVRmTFR0KzUrZWJuUkFCa09EangwU3dQaTVlYy9GcllwbXFTQXhNOERuNjBDc3FBRkk2R2ZocUFNaURFL2dva212RXIwQzRQZ0RrQlFtNDB3RTh6TUZFVURLRVZveElNTGwvS1M3M21FN0g5ZCt2Y0tIUVFjandXMFl1OW5QOG04c0FtT0lCdVdZNndQMi80czBlempqZzhUdXZhUjZBQko3MHZ4VUFwR3JtN0ViR0UraTQ3MkJBQitXSGZxSFMvZW9BYUV3WTJFOSt3TFNYVHFoSTdDWGduQjZMQ29PSjRCaVNUK2hUbkcwSGNDd0FnbEN4M0FSb1pFVkZYbkJQcC9PL0EvaFhBQ2M3Q1BzOS9pMWxBT3lJQitSRFgrUDkvK3BiUWpqakFNZnYvUEw2QUZEczF3RkFncy85ZmdLZmdkRS9aRXB1aVFsYndBZGU2UUFNQmdpUm1zU3dBOUJZMEpmam92R1JEQk1INFRsY1hHaGNCT2M2SGtGMGdqUGhaZ2NoeFRMWk1BY2kvMDRXL0I2QWIzdDA5RVBYY1B5ZmxnRndSVHdnSjJNTjkvOGJmNXFGTTY3eCtCL2FXNFhRejQyRmVMMFlyUnlpa3p0VUZ3MDcwNG1mOWtYZ3hoT0FxYzNBQXNQeVJ4eFFDcy9QZFhPRlkwVzFLSHkzUUlVR3R4KzZ2ZG54MXZzQitkc1RuY20yQW9nZ2xGZ1ZFQWxVV3JPTUIyUnlFbU1DR1EvWTcvSHZLbnM2dGZHQW5KUStyLzliNzZvSloxekQ4V2R5UWpZQmg4YUJoVkVIakVMb3VROHVrUTdWUlNDSkFBTHdrcitzQUxobkd6REQzSkFKWUpIZzl1aG9pNGJ4OHl0a1dVdHZIVC83K1pjNGR3MXVaMzYxMmZIMmRrUWY3eXhJRUVvY2t3a0pRbjRJUW9xOHVuaEFobVBSS0tGeDB1djRLOHVlVHM5NHdEN3UvL1ZYOWdobjdPUDRjKzRHN2g4SHBzZUIrZEYyQUtsRkx3dUFJWjhqRDZOUHJPaEFmZm1mQTkvWkJ1elpDa3lSV1NlcUJDV3lvWUdRNXlRckJwRGJ1bS9NRTFIb1BvMFhFa1NEMnpsZmJuYThxNitFVUpjVEN4S0V0SEw1RVFqUDZCRVB5SWdZQVpCdll0M3hIeXg3T3F2R0E2NXkvNy85d1ZYQ0dWYzUvc2w3cXhENjZkRXFpWWdSekFxaE4xQTRDQk5BQWxEeUFGSStpWjkvTjNETEp1QytqY0RVQm1DV3lVbk9ybVRZQ01JT2tOY2xMZzBCOC9Sc05MZzkrVXZOam5kMUFQTG1tUXBGSHlFQlJPdVdBQ1FUOG5OK0gvR0F2WTcvVk5uVDZTc2VzTWYxMy9DcGFoR25aemhqaitQUG13WDJNWWRESWZRZXhXeUJBd0VVT1FEclJETi85OHAzQTdkdkFPNmZBQTVzcUhKREJFQXlvVVZHa3dFZDZIUjEyWFU0a3d6Zmw2ZkNYVFp6ank1N3Z2blI1MTNYN0hqN0F5RHZnZ0FVaTlFeUZnaVpxTnhQUUY2MzQ1bk9XYkQxSFEvWTVmcHZ1TGEvMis4Mi92TkhnQVBERlFEbmhvRjVqMkMycUJXQ0k4YncxZVJ3NUNMNWw5NEwzREVPVEk0REI4WTlPV21zRXUvekJKM3Jnc2F5YnFCb2IvN0E0QzdqdFdjb29ScmN6cit1MmZIMkQwQU9RZ0FVQ3hLRVA3YUdnTHk2NCttNktkaldGQTlZYy8wMy9Pc2E0Z2xyanIrQXVwcUh6MXNFczBjeEcwQkM5SEllUExvaXQ5ZU5rVmY5TCtEdVVXQnlESmdhcTR5YkdZTFBBV2dpWG1MZWRVRTdkd0M3c2FMN0NxZlBLWGk0TllkYXlrQ0Q0MTBiQUhsREVzTml3Wjl3QVBZYmtKY2Z6NlQyZ20zTjhZRFo5ZC93SHhVQSs3MzlmUHdYUHJTS1lHYitCdVAzakFGREVsRkg5SElXd2J6Q0lHa0JyL29yNEo0UllPOG9NT1c2WlZjQXV2aTFDZ29oYTA0QkN3VDVnZk1LSG03Tm9SZGUyK3g0MXc1QTNoUVprQURrNStjR2lBZU14MysvN0FFTkZBOFlydi9HNzFjQVhGTTRZemorb3RPQWFRTFFBMGdaeGFJSVp0TURGVGlnS0pWOEg5SXE2YVo1OVpYQXZTUEF2cEVLZ0JUdEJPRGNTQ1dDWmVSWXRwenJtTHllR05DQXlGbDF2K0hlaThxZWIzNzBSZGMyTzk3QkFNaTdFZ0IvMlFHNDFuaEFIVTlMdVdBYk9CN1FyLy9HUFJVQTEzcjdHdjlGWndJTW9WY0Vzd0V3ZkRvaW1FUDBzaEtLdElwaGFaUUFYdjErWU0rd0EzREVkY3ZSS2tHSkFEUVFFc1F1aGkxVGp0OTV2QnNoNW54MklPNTlTc0hEclRtVU9TdE5qbmR3QUFxRXJ5MEl5Q01JQ2tPeWl1SUJOd0J2UEZRUVQ3Z0J1UGpjOW9SWUFJSHlPRUw0dklGRVlWTmFPb3U1dkNHRS90Vi9BMHdPVmNucHpJNDdOT3JpM1FGSUJwU2VhU0RVZFlMT1NXdllJbVNHZ2Z0cEpEYTRNV0piQUd4aXZHVUE1TUFPYzBCZTZlVkxqNy80TWsraHpDT1lQWXBaREJpTmtMaCtHL00zeUZ5di9sdGdMM1czWVFmZ2NGVWhnUlkyUHdZK1o3L0VoQVIxU0Z5WENPYjU3cjI4UWZRQnNKUUJNbjVENHkwSFlMUGplOUNkN1JJQzBQTTNFaU1vZkY0Z1ZDQnAxUDg0MGl4L2d5ejU2cit2QU1qazlHbDM3NWlCNCtDenZldVpkTGtrRVBKOFpFZlgvNlI3M3ZPanpUNVNpOWh1Y0x4SEFWZzRQd0pnUndoOUNLT1hLOFlBNFpFcUtaWFNRV2g1UCs1QWZ0WGZBL3VHS3ZZakNLbjcyY2N0YkZyWk5FQ2thNUw1Q1B3SVB0TUgzVFZ6MTdNTEI1Z2RMZ0EyTmQ2akFDeWNId0xReEZFVVNSNUFTdkFSREIwaDlBUWI5YlhJZ0NHazZsVWZBUFlUZ0VQQUlUS2dnMUJPYms1OHNyVEpnRzU4V01rV01hQWJRUVQxbmM4ckhHQU5BSnNjNzFFQUZzNFBBYWdRZXN0Z0MxbHNCSjRCTUNTT0s2ZERVY3dxcWFGaVFyLzBRZUFBQWRqeStqQmlRUWVlTVNCWlQzbkNQVURJYTl6Ky9NSUIxZ0N3eWZFZUJXRGgvQkNBZVFTemdrakZmR0xCQkQ1bnhRNER4TjB3djNoVnhYNVRCR0R3TDVvYnh2VkE1WXFZTDVCZU1MZDY2WVl4SnBSQjBnSys5NkxDQWRZQXNNbnhIZ1ZnNGZ3SWdNcmhVUEtRMkMrQnowUG1CVHFCTVFlaEFiRGxJamo0RjgwS0pndVNWWjBGdVhwam9DT2dYYXdMakFMaGJUOWVPTUF1QUd4cXZFY0JXRGcvbDFJRTA1RWQweWdabnlIZHowVndDcUVQSWZOeXgwUVF2dkxERlFDcCs4bmZaazV1bmQ4dFh3SWdXY0hTTlgwTjJDSm1uQWwzdjZSd2dObmhsMTdUN0hpUEFyQndmZ2hBUzdtVi9oZXkySlM5RnZNM0JMcFVVaTFZd0RSTVh2a1JZSm9BbEFoMmwwZGNaMDRzNkpVVERJanlCY3JsNHlEYy9kTENBZFlBc01ueEhnVmc0Znh3S1Z3SmdHRUpObVd0eHBRTXBYOW9uMmVSaFZBK081NkFqTWZuUCtlM1h2ZjNOd0c0eElQVGxlaVk1NWJwR2g2VWJhZk5VMGwwejBwKzVKaDVIcVlKNmI1MW5QNlhQOGN4MTJYTkhRVmdJUUIvYkZQVmcyT0M3UStXZ1ZGV25nL0Z2dFdMSTA2dVdoNW9ndUtFY1hWUy85c0VBRi8vVkdEN3Q0RVREZ0piRjRDTmk4Q0daV0JzMmZQTC9INlZ3cDJLRXRWazRmSit2L0VJWVBOOXdLYTVxdStJbmNmUHdYSFZaZS9hT0wzRWJ3Uzd4djhBMXJRdm5PMGo4UEFyVGdUR1o0QnhGdjltSXhoT0NHc3YrME9QWURSZ2hjTGZrV2tFdXEwK0cwMHg0T3RmREd6K2QyRGJIbURMakw4c2k4QVlQLzdDR0lBaUVFTVRHOTJ6WHFTYkgrZDlSMmFBMFhudk8rSmp0aGlJck9WREhIUE9rQnJ6VVFBV0FQc1pwM29QRHBhL1hhZzZFVmtMQksrNXJBbkpDMy9uWWsvQVBENzA0V2lFQVY4T1RId1gyTFFIMkRnRmJKZ0ZOckJoamQ4cjc5ZGVHb0V3c2xsZ05CT3p5OENkandlRzl3QmowOEFJQWNpMkQ2SGFmbXlBazQvWjdTSjcyaEdZUndGWUFNRExUd09HcDRGUkZnRDNIaHpxUkdRaXlldXJxT2RHNnIwUm04SUVaanpSbGtpcUNXb0VnSzhBeG00Qkp1NEhKaHlBYkZoRHhtYkRHblpPNGowU2dMR0RrcGliZ0VxNjZUSncvMW5BMEY1Z2RMcHErekRxRmZkNUxNZVdxdTVITlNUMHVKT0lsbGcrcWdNV2dJK0hQdjB4d0xBM2dXSHBXMnNDNDQxZ0NFQ2JtS3ppYUdyblVkTU80YUhlaDZNeEFQNFNNSEk3TUw0SEdEOEFqSHZISkdOQWdwRGdZL2NrM3N0aXBSZW12VmhjK3VBU01QVUVZR2gvOWRJUmdHeDhZK01OYlIvMDB1VnRIMHdFeDk0ai92MG9BeGFBOEVkK0dCaWVBWVpaZzVrQURDMFFXR09GekdKbGNHUHpsMUJ4TkxYRDhzazR4ZnR3TkFiQS93d00zd0dNVW14T09RQm5IWHpldElZdmlib25tU2l1WVROanJpVmc3Z2xBaXdCazBmTlpINitQbVg5UDZrZk5tQ1hHcGZ0SjdUZ0t3QklBbmxuMTRCQUFZeE1ZbTVDNlJqQ3lDb095cjBxa0QvYytISTBCOERYQThOM0F5Q1F3ZXNEMVZRS0g3RWNBU20xUSt5NENrTjlwVUtpVkY1bkx2eStmQmJUVWQ4UUJhSDFIdk5CUk9pWnZmc05uckY0a2N2UHdwZHNCTEJlVTE4TmY3QUIyM0RwNGVjSEM4b0JnVWxKSmVjTFMrNytXT3BFM2diRStIS3creW9ldkNZa01HS3FQSnJkRUtBUnV0YUZZUnMxZmlFWjB3UDhDRE44TERPOEZScVlxM1cxMHBnS2dmWUxhWUN6b290Z0E2S1hhVEE5MHkzNzRUS0Ixc0Jvenk3N3hIRlo1MzZ1dFJnQW1FYXc2ZzVrVVNGWndTWG5BMzMwcXNPbGZnSE1QRGxaZXNMQThJT2pvTHlwUFdIai8xMUVuQ2lWd2t6N2tBRXh0c0dyYVlVV2RTRFg1VG1zYWdMOEtEQkdBN0JkMzBKc1cwb1dpdm5FT1FOUDd5R1RTQlIxMDFBbFpTVXRHeWZnWkRrQ1dZMUhuSmRjQlZlNjMyNWhUdmVsZzJDUWpaTkR5Z0cvMkFuMGoxd0tuTDZ5OXZHQmhlVUM4cHJROFllSDlYMzlPVlFTYzdNYzZmQ2FLdkFlSGRDSVZmNHlNWUN5blRwWCtuYjk3TkptbFNRYjhyOERRSG05WU9GVVpUS096b1hHaHM2QXhGMEhJZXhjTEJ2V0J1aUhOOHMybmU5OFIzcWM2TDRWeWIyb0JWamZtOU1JRkhiakRDaDZrUE9CYlFvRytvVzhDTzViV1ZsNndzRHdnZnIyMFBHSGgvWC8xaWFFSXVEY0NUSVcvMVE0ckZ2OE9uWWlXM2MrVzJpS3dVaktieWpRTndMMXV1UjZzQUVnRGdxMWJyWE9tVjgxUHhoTkI2RFVEQlNZelFKd0Z0ejYyM1hja3RYMVExVldLYVRGL3paaFZhekJWWUExdFg1TWF6c0d2b2J3ZS9qUXIwTmU2QlRoNXVmL3lnb1hsQWZHNjB2S0VoZmYvclNlMWk0RG5UV0RVQUNZMWd1RlREcUxZZENCdmY2REpZU01ZQVRCZk94MWtMZmoxdjFheEgxMG5RM1NkMEdVa0JuVGZwZW10Qkpnc2VJS1FBSExRY1Z4YTJUbnVNVzBBcXVpNWVzOHhCSWVnVmRWVkU4Vmh6SG5MaDY1V01COUFuK1gxOEs2YUFuMnRPNEVUbDZ2cWJLdVZGeXdzRHdoZXZxZzhZZUg5My9SazcwSkU5MG5vd3haYklKanZTM1dZTlNHVXdHSEpUcFB4d3djYkJ1QnJnUllCZUtBQ243VnRwZFV1L2MwTkp4TzlCSXhjS3U0VFRPRHpia29uUExvYUwwdnlVUVJiMnk4SHNMMWNrZld6TWV1Rmk0MFFlenFpK3lpUGh5dDdGT2pyNi9nQ0Z3Z1A3WGI1dnNzVEZ0Ny9uUVJnNk1HUldtRFJvZXlUbHBndzY4R1JUd2daZ28xZ0dtWEFYNi84ZHRheWxTS1kva295SUQ5Qmh6TUwzcTFnQW9zMkFjT3JaWVNvcS9wSnAxVnRPRFJtOVozTFMvN1dqVmt2WE96RXRPcEt5R3JsQVQrNFNvRytWWTh2QkdDdnkvZFZuckR3L3ZlZTY1TkJKaUFqQklWY0FKUWpPbStEa0NaRWVpR0FNdzZzQXdEWnNKckFkaEZNOXJQR2hkNDkwNENvNW9WdUNaUFY2a0Q0MEVjNis5VzhkQlRCc2ZkYzNua3B2bkI4MmZwMlJQY3M3OWRIZ2I1MUxBOW9mc0RWNnZ1dDUvM1BueGNBbUxWQmlEcWdldkRhSkxrWXJwdVF4emNOd044QVdnSWdSYkI4bG9FQnpYRHdsNGNHaURHZnQ1OFNDT1dHZWRnanZPSitiUHZnUmtpdUErWmp6aG5RUU9pRk5WYmxvYTdsL2ZvczBMZE81UUVOZ0VYbENmczhRYmY3SHlNQTNRVmpZaWhZaExFTmdqWDl5L3F3eFFtUlUvYXNmZDBaY0xVMkNIVkd5dXNKUUxLZlZpOThDUzEyVDVmN2lFQ2tIcHNNa0FoQ0Y4K25zaFdIMkkvalhzT1lPMTQ0R1YvOUFwQUlyUzN2dDRZQ2ZldFFIdEFBMkcrLzRQVzQvMlBQYnpNZ21VTWkyTm9lU0NSeEl0Mi9GdnV4V1VSSVdDWGczNTdnZlRqRUROSUhuVFJYUkNwSDV1Z0t3R2wzSHBNQlhRYzB2NldMWVZtLzVsaW1qMDRyRzc2MksydVlZOWpCa3I5K3JJMDNOTDVaYmN6Uy9kSitMUXlvZ2E0bzc3ZkdBbjBObHdkTUFPeTN2bC9UOTM4S0FjajEyMXo4Qm4rWTllV1FKUno4WTZrTmFnRGgyZXk1RXZ4anhRRDhUV2RBdW5lQ0NPNEFuMXZ3NXZkelFNbWRrdHdxN3BMWlFSK2RNMzQrWnVtQXh2WTFZMDR1cU9BSjZGc0V4emV0bzd6ZkFBWDZHaXdQYUxXUjFscmZyOG43Zi9SbDNRR3ptc2lzKy91TzcxVjlPRmdQMmdwUGhncjdUR1JxUlVUNmR5dnI0YUlzL3BtLzJ6VlVOYkJTdjZHOGU1cEV2MEN2ZWM3UG83K2JUdGpsQlJsa3ZBTUJrRGVReXZzTldLQ3ZvZktBQ1lCcnJlL1gxUDAvb1dFQW5uRkQxWWRqaHRYeFI3M21YMTBGZkNISEU5cFZXY0dBSS9TMGdLc2ZBMnkrdHdyRlp3Nkh4Zi9GMFBrOFJpL2twR1NuTXVEeDVUMGlBQ2dRSGlvbzBOZEFlY0JVSFc2UWRzVjIvY0w3di9DeXFyNWduYzQyQ0NPY2ZYMVZJWi9WOFdlOUlEbVR6Vlh3UERKaVh1S1hQeHREQm1hOCtselA0V0FnS2tQeENVQVBFNHY1R3pFdU1YMFBZSlBMaEI2RkpzYzdNQU1ta1Z4YVlDL0s5Z0crRjErKzhBUTdHd2Jnazc4STdHRnBYZ0l3RmlSWE93YUpaUFViaVIweUNVRFJrK2NIZitZcHdNajlIZ2ZJOENsR1B5dnNTaUgwV1NLUnVZbGl0TGIvekhNL0pPU3M1Qy9ZSUM5Y01RRFpyL2R3eGdPVzlndEdZVUJpMHdBOGwzMDR2RFF2QWNoaWxGYnBJQlFoWjdFanE2WlEwL1loaWw4eTRqODlBeGllOURBc0Q2Rlg5SE9LM1F0Uk9URmt2aU44M2tHNGZlbElZOERDZUxyU2VNRFNmc0VvdkFFQ1VGc1RqSEQrdGNCK3RrRmdjWEt2QlJpcjdxdEZsOW93bU80WHkvMUczYkFGZlByWkhvckZOV0JGd0hqUUFGY3RJZ2hqMmtCYXJ3MDZJZi8rTU05WnFUTjZEZ3NEb2pDZXJqUWVzTFJmTUFwdm9Ha0FXaDhPYi90Z0FQU0tXQ3A4bmdOUXRhZGptVGRsdHZOdm4zcGVGWWhnUVFnaCtpVW1FYVVBVW9YTTF5UkxtV3VGTGFFOVorWElBV0JoUEYxcFBHQnB2MkFVM2tEVEFMendtcW82cXRWaDlrSkVyQXVkQUJpYTM4VEM1d0pnUzJ4SWhBd0JuM3loQnlMNEVoelhmUlh4WXNEVEo0SXZyTk4ySkZNeFpjQnpWbzRjQUJiRzA1WEdBNWIyQzBiaERUUU5RTFpCWUgxQVZzUVNBQVUraW1JMW9iSHlibG5qRy9rSmszVThCSHo4eFZVUUFoblFJbDVDeU5nS0FHcDVMS1NTQ29BeVNoNUpqNzl2VGFnY3hVYUlCZVJOZTc5ZzlncStEWGlnNHdHenkrUE9OZlQ3UldGQTRub0FrR1haVkFoY0Jja0pRZ05nckxpYU5iM3BhSURvMXZISFgrb0E5TFFCaTREeEpjT1VQSlVuVGdVMk5KVXlST3M4aXJHQVJ4UUFDK1BwQ3RzRmQ0MEgvQUVmMGdNUWtMZ2VBQ1Q0MVBpR29MT0txeXJKcTNLL1lhOW1OeXI1RnVzTi91UExQSWVEYThCYyt3M3J0eWw0VkZIYU1aYzNpOVJXQk05amp6Z0FGc2JURmJZTFJtbS9ZQlRlUU5NQXRENGNCS0RYQlRRR2RBQjJNR0JvOFNDTG1FdVMxQUZWQUozQS9OaFB0MFBvQ2NBOGJTREc3NlhJN2F5U2c2Sll1R2ZLd0pIRmdIMEU1QjN1ZU1DZS9ZNEwreFZIQU9aKzlFSGNFZ1Fnd2JlaUVZeDZqd1RkejRxZnU3RWhFSnF4R3FydWYvUm5ISUFFbnhnd0JNMGFDOGFVQVlXTkJSQ21vSWxsNEhUcU8xMjJRY1picmdNV3h0TVZ0Z3Z1T3g2d2E3L2p3aHRvR29EV2g0TUJKMTZXTjRsZnI4QXFJMFRWVjFPMWZhOUJiUXpvdmtBeTRFZCtOZ0NRVVN4WkNGV3ZDT2FPRlJFWHlVd1pPUElBMkdkQTN1R09CNndQYU96K1FQdjVTK01BM09YaU45YWNsZ2hXK2QzSWd1cEJGMnBQcXhjeEdlbkRQeGZTUmgyQVNpS0tpVlAyUGFaU2N2QUtvQTBWRGM2Y09sSUIyR2RBM3VHT0IxelI3N2l3WC9GNkFGQjlPTlNPUVcwZnJBNTBzSUxWY2NrV0p5SURTZ3dQQVZjSmdGYll1WjNGSnZBbEVIYkozSXNnSkxHZWRlQklBK0FBQVhtSE94NndvOTl4WWIvaTlRS2cyaUFJZkRKRUpIcWo0U0V4YkV0eTBna2RoQi82UDlvWmJCWklHaUtZVmI5R0thTjUwbFJIQkxPdmhEeGgvNUVLd0RVRzVCM3VlTUIyUUdNL2dyYjcvNndIQVBOR01BWStHU0dVakM1MlZYMmYyQ0Q0K0hPMGdxa1pmZWdYS2dCYUhrY1d0UzBBV2lpOXhHMUltckxsTjVYUjhMOGZtUUQwNUJWcm1FRU5tcFlTUDlRWCtLSGlxajIvODIrSHFxRFd3bmJCUmZHQVRkekFlZ0d3cnUyRHBScTdNenEyZnBBZjBOcTBSbDJ3Qlh6Z2xaNHlVQVBBbURTVldEQlBIUWpMY2dUcU9aNnpVdmRLSGg0cnVEQ2Vyb3gvRG51N1lxd1hBQzFOSS9RY0VRdUs2V0sva2RnQ1RHQzBQWUFQL0tJRE1CZ2dscStoSWtyT2ZzYUN2aUxTb2ZjSmdKNUFkTTdra1NhQ2ovSHFRS1ZJR3ZENHN3RjhiY0JqbXpqc2FRMkg1RC82YWNCZDl3QUxCNERGV1dCNUFWaGVyTXA0R0tJWUVPcDcrMjZVRjBhU2ZUL3hZdURHN3dEanJJcEFFUnl0WGYydmFqajd1ZXJ5UVhTRmwxMEsvT04zZ0lXRHdDTHZqZkdCOFo1NE8rRWU0dmU2NTEzdUIyUjF5enNxQyt0d2JDOEhjTlZoZkFlYUJ1RFAvVHZ3dFMzQS9lUEFJZllGVmxQcTJISFR1eXVsWkNUbGhiamhFVEY1eXhUUUdnUEdob0hoSVdDNFZTWEdEM24wdExrTUhYSHh1K1l5QitNbFB3RHVaczVLNkZsc2JDemRWTzlEdUtma0hNOEFFa1A3QjhmT2t3RGNEK0I3bnA0MitKa0dPdktkQUw0RTRLOFAwenZRZEVUMGIxNEQzRGdCM0QwQjdCOEhaa2E5V3pyRDg4TjZzRm0rWWNVanJuN0UxWkR2TXRGOURCZ2VBWWFIZ1NHQjBQTkhDRDRCTHdMUnNCeUF5WC9pajAvZERVeHVxbElHNWhpeDdlRmh2TGNPVlVBdHlQU3lkQUZtT1FOZTZFWUdWLzlaRVNpS2dJRWd0YmFEL2dIQUxRQzRvdlk1cjVLd3RqT1UvWGZUQUh6ekx1Q21JZUR1TVdEdktIQndwTW9OMFdRek50QWFZU3MwSzRabE9TQWpHRzlrUGpDQlJ3WjBBQktFQkpleFlBWkVBVTNBN09pMUJlRHltNEVEbmpRMVR3Q0dXTVc4TVhjS2tzMFlPeVpObFFPUWpjZ1lJVUhsbEV6WVEwa3RtK3I2b3o4RzRGNEFYd1h3UmQ4L2tPOUEwd0I4eTY1S21QeGdHSmdjcVlKVEtZcFR2MkNDenlkZFFKUkRPaktpdm4rRGVoOEJGOEJud0J0YUNVQStZWUV5QVU4aCtjNkF6OWdOSEhSbXJnT2dtREEzakhRK2lXdXBDZVVBdk5TckE5SE53cXgrbXVrOW5KVk5nL0NUZnJtYkFQd2JnSzhEK1BjSGtJaWJqb2I1bzEzQTNYeXBXc0FrRzFjUEE5UERGUURaTTFpZDBpMUt4c1dmT3JLbkFGWGxpZkNGRk1NUmNBU2lnT2NzMk1HQUlmRTlpV1hwbFM2T243VWJtUGFVVVRYUXJnc1ZNemNSajVGb2xnMlY1YXlVQTVCV1lLd094S1VhZm5vc1dqY0p3ays3VzVGMkVLdmxFM3hjWGFOWWZpQ1lzR2tBL3NtdXF1ZzZoY2xlQW5BSW1QYk82WXdScE1nakNBVkFtL3lRbUtUdjVoTnNBZi9pN1N5TkJTbDJhOFF2LzQvTTF5RitCWlNZbE5RQ25uVnJwYkMrbVRvQUFDQUFTVVJCVkpjYUk3c09TRVkyTnBhRFhMcXBSK3ZFL09Wa3NEZ0ltZ0dnZ2hIb1lKYlRXYzdvSnRGV2M2NS9jZzJBWXZoMkFMc0IzQXpnVnY5NW5TL2Y0UWRzSWtUOVQzY0JyR3RJVFdaZkM1aHF0UUhJbnNFR1FuM1VERHZFREVZL0lDZjdTeE1PckFnOFQrYzAwSkdrdkhHZDJEQUJVWVpJQU9OekNVRHBwQ0ZoU3VrQ0JzTFFyRnRaZS9JaXhZUXBTeUVvSm9xbnVQV3JWUkF1YlFoODNITmxaQjIzejdqMXl3bWo2Q0lJcVVQeHcyWGV1OWJ4Mmp4MTB3ejRaN3NxVFlaYUREOEVJRHVvRTNoTVZFcGhXZzY2SklwOTBrMHNCeEJjeStpUElJYVQxUnRFc0hTL3lJQXF3K1ZTTlBXUWZlNXRsVkVrOGF1WGdWYTVCVXNFSnVUNXVvbGlBYkU1QUdvdG1JQWpDUG5SOXhERzNUUWVybllBVXVwVGRCR0VGTWY4M09rQXBIRytYbHZUQVB3ZnV5cmdTWk9oYXMzdTZjd1RzVUJWbjJnVHd5Rk1pOHdqSFpBQTFNOWZZR0hEVUxKRDFtOENwYThmUnhEYWQrbCtZa2YvM1hOdmQxMVUrcWlMMzlTeFhldlNzc2hkREZ2Z2JJMU8yQXdBdFJaTVp6VEJSdURGanhlMVhnOFFFSUI4eXlqNXlZSVV4ZlFJa2ZrSVJubUhDTTcxMkpvRzRGc2RnSEhwM0FDb01IMkc2ak00bFd6b1FhclN2d1E2TVNCL3Zwb3JWYUZraCttQ0xscFZSOForZHFEWkxvRE9wSFNpUWVBRkRrQmpQcmxnQ0hnQ1VhRmlmZzY3SC85dVlqbjRBaTF2cFRFUlRBQVNCYW9RSkJBS2VOcUhsTDZtd1BEWllBT1JPYWcvRVlSa1BYMzRNd0hJdnpXOXJRY0ErVExwSTIyRzdFY1FLbEpHc1lJSmhDNkNsVU1pWGZCVGJGVVFBZWo2blBTL091QWw5cE9PcUljMkJMemcrKzNWbVdnSUVVejgyY1J1Q0F0TElIUVFtMGdPNTJ1T0FiMjJzQzNKRVdnUmZQcFpmMnNRQlFJZ0x5ZFBFSUZHd1BFajhNbEYyYlNic3VsZ2hMZnRxc0NYcTlIR2dIeXN6bnJHZ2k1cXpUVVRGSDhGTGhBVW4zaElKd0NOMEhMbmN3MzdxYUYyem9ZdnVLTml2bVFJdVVOYzdHdld0NnNITnMyNnR3QTZ2aHlxOE5FTUFIbHludEZyRENjUWVoeWFQVGwrRndBYlhEY21BS01SVGhha0VrOFE4a1BnOFNQTDBxekxCbCtBOVFDZ1I2dVpHczN2Zkh6OFR0Qlp2a2dHUXJFUEJWQVVnMlNpajUwUUFPamlWS0kzc2FBREpSbTdkU0xZV2ZTRkRrQ2VtL2RoWmVNeTlwUFk1UXZTRFlReVVKb0RJSzhxTWV6aDN3WTZmU0w0OVBjR2dDQUE4cFNjSkxJZ0FVWVFFbXo4UlBBMTdTdHZHb0J2MzlXMjRlUkVpQm9OUVNnV05JMUhCa2RneEpTdzFBSStkRkliZ09ZbWtqaW1RMXI2WFhDM3JBYkNIeWNBZ3l0b2hmOHZzQi9yMktSYVJxN3pwWitEMzdITVgwczNERGNDVUdMWWF3NTNNSjRZVU9EenVzcWxHQ1FBT1FDZWp1eEE4VVVMVWt4SXdBbU1BcDhXYTNxa04vUjlXK3NCd09oSUVQams1U0xyOEhlS0ZiVFFmYjc3Y3NQSU1IR2wvNE1QYlJlc2xQaE5lNCtNaVRwaTlBRkdWNG5JN01mdmFnTlFMaC9wZnJZbkRBUzhhSlE0MkEydzRlbTJjQXlXUVV1SlZRVEdXTHMxdUw3REc5SjFSamhBK2p2WWs0dDNLWGVNcWlqcHpydWQ0QXQ5ejNYdFAxNnlHZmpLWm1DR29vWWgxdFp6dnY4eFhQRmw0UG9KWUM5N2s5Rmx3WldEK0F6aS9kZU1aV2VQMTNlUUNHRXlvRVJ1ZENoSWpiYjNtSll3SDdWMFFJS3VDd2ovZ2ZNajBhc24ySTBGWFJTSFhmTC9pUmtOZ0x5ZVZqOGNjTVkvL0oxZnl4elRBWFQyK3hvUVZpS1lELzFoRHFMeFBpWXhUZ1N2UXJwaHBoRzk3dHo0U2xxYWZuajd1azFrSVFEWnJ2V1R3OEIzandFVytSTHhQZ1NpQ0VSZFB3UFI3K3dDUGcvZ3VsRmdmcnVEa09NUWtGYzV4ODRlNzA4SkFNbUN1Uk5CWGk0VElnNUNHUnpHaUJHRS9ENEUvQzJyMnZjQVlKb2lmeTYyaTBhSlNNaEIrMklIb053dTBma2NqUTg1cHUzYWNrNW5JQlJFcW5lWUZ5V0xrQVhJSkhFU2UwMEN5eDVReWVMNkYvdHlFY0Rjck9XMm43Zlg4ZGYwbU1FKy92US9QUWpob3kzZ3pvM0FJU1lmODBNUWFReDFwZUg5d2I3djJtcnRtQ0JrSU1NZWpwM2pJSkQxTXNheGFNWjh2NU4vNjdJTkFzQjNCQVlVNEpMNERTbzFKMTVBRlBBRXd1UUhaSnprS2ZVQXRPSExKU09RUlduZEJZUXZDUUEwMWNmbk5vcGZzYUNKYUQyYmFCbjc5UWpTVGlPRVAxRWNhd0lwa3Eya2VnQlROZ0hXRXBPS0Y4VXdxMk5SRlBNNEFxQ2Y0Ni9yQTJVOS91VkR2dXJCMDF6dkFKcGlpd09sM2ZFZWNpQ0dGK0lqMTFmK1FrYlNmTVBmSXpxdzU3bUVGWjlEbDNQczVIWFdBWUJ5SEpBSktWN04rczBjQ1FRaHdTbGZtNGxHWjBLQjhDL3JBQmdaVVM2WkhJVEJTRWhDb3dVWUFBa3NGN2NTdFdSRXl4Und0dVBwT2xndys1czlzcTZPYUlKSUlsVWdFaEExZWRvVGdIeGE5SFZ3NWppYlpORitqLzl5R1FBLzdwYnVqWjRid3YyK2NXQjZ0Rm8wTnpZbmt4RkErY3ZFQW80M1ZCb0VvMmUrNDhFTVhFT21EOUY2eGhDRThSd1pFSjgwVmJsS3ZEbG16d2ljZnF5OTMvbys4SzhUd0IyalZTZ1cxMzhGckpRVFhCTmxuSmdtcmpad2Fub3c5Q0JQL3JMOXdGMGp3QUdXRHRGeW9OOVBIdXRuSUhUMDVtUFh6OTNkTUdRQVBuaUpzamlCWGlUYnhEWkZNRjlOTFVQUXhLUjVxZXp6MVk2L1laREgwRDZHa2RBa1lKSXZSYWxBZEhBTW1QWm9ZaGI2TmhEV3ZFeWYvbWE3MzdDWE43UjFaQzdoVWJQZ2NGZ3F0L1paakFEbk0xeHFFVmhZQnBiNENVazVVc0w3alF2ai8vLzVidURyTGVDT0VlRCtZUWNoWXdHOVZJZnlnMU5hWnN6RmlDSDZEa1JHTHplNS9kZ2s4SU1XY01DamRDaUN6UjhvZDFCOE9Ud3ZKTThKRVNoRnV0MWZ6TWhpK2VSSnI2TEk3aFlQMk0veFZMd0tOb1pqVVR3Uk1BUVFtWXloV0dReHNTQURPZmxaNGt1a2o3UGhaNzViRVRqQnBrQUdhaE1rY3JHZ3doc1hlQ3lCSEJqMXdtT0JRd3ZBd3FLem9GZVJWOFphZXJqS1lBdWlybVBZL285WDdxNUN5cjdmQXZZTUFmdENQR0FFb1lsQmlWdEZ3TGp0cDJVNGlyajd5T0FOYmkrY3JIeXJmQ2JUcXVKVjQ0TzBGMUZyd1FHSU1aRnFkUUR5UC9nR1NaOFRDMFpSUnNPbFZ6emdhc2QvdSt6cE1CeUxlaEFmQ2dNUUNEeUdaSkhGQ0NnTFoyZjhtZ0k1cWF1RWNWeDllNXZBQ1RnQ1R3RU1XcjVUZElwV0tKYjVNdnJub29jRHN3dkFQQUc0VkxHZzZVS2VxbWk0aXVEejRlcjMwb1gwRlA3dTVtb012SWY3VzhCK2p3bFVOQXpGbmxaQ0lodkdGUkNlV3pyZ1hTU0lCcmVYVEZaU2dWTEhBcDRVSE9GdW9jaUVFc24yUEp3bC9YRWswZHpmU29qZWVyRmcxSU9vNUJLQXZlSUJleDFQNjdsZ1V6Z1dRYUp3TEFLUkgwNGkxNEl0Z0RLRXRHc1JuV3g0OWIyVmtrOXdVZWZUR3JLQ0Y3UjBKeFpNcXhOOGNtUEF4V2NBY3hHQUJLRUFLUEE1dTlsRWFBYkNtS01JK3NETjFYM3orcm8yNHdFWkZjMFZFRTY0QUJnVDE4MFBGOVpkQmNEYjZKcHFjUHRQaysxQUNibUtqSm5sbHd5dUlMdW5FQVdqWkhrQnNyc1JVbmZEMHFFaUM1SUpmeWlzZ01oeldoY1AyTzE0Um80V2JBU2dBTVFKNDhTSndjaG1CQ0RGYThxcHlCYlNQN092VTRQUTBwMlc3K0xTblNKVUZPckk0Vjd3NUlvQlRRUVRmSjZvVFNZazJtUWNwR1J5SDJzeUdqSUY2RU0zVi9mTSsrQzFDZndVRXhoQ3NtekNhUVQ0M2xaQzNlMWhCcEVIaDM2WEVxckI3U2NtcTVkVjBYWnhtVjhXdURGekFGOWl3aG93OXNlQUdvQmNHdEtqcUFjKzFsOXJMYi8xaWdlc081NXlzbUNyQzhlaTZJeFJNQUtUV05CaTZYdzk4eE5URlVpMGpFY21wWWdSQVBoZGRwVmk5T0lFUFA1Y1lENENjTGtDb29IUHdhVzlrVitpd1dyUUhUOHVBMWZkM0Y3REZ2Z1VIVVAyazhqVGlvZ0FxTG94RnBEZ2JNajlqWFN1TjdpOWRMSWRheHpCcDVYVkJNSU1nRkVuRkFQS1Q5cVBkNkE5QklHSTdNZlBtZjRVKzQwSHpJOG5XZ3EyUEJ4TDRGRWtqS0ppeEdSUkZ5UVFQenpkMWlBVXpDQVFhczFZT21BRW9GandrZWNEQy9QQXdoS3c2Q3hJa0NYd09kVkpMeFRvYk1qQmR5SWdmdmltTnZOSjdFdmY0ald0ZG5SWUQxWU5HVnVHOTNWV3VXczRKZittbFpDQ1p4d1AvY25KNm1YVktrMit0SzhsUVFWSFJUR2M2NFNEQVpCM0V5M0pjeHlBQ2tUb0p4NHdIbCtZd3Fsb0dESUNtWW1URmdNUUZCRVQ4eXlZenlBRy9BZldYOG1DR1FnMEJUUm9Id3Q5S1ZhUEUvSFE4OTBBSWZnV0srQ1JBYU1SWW5WZHhIYmhkWThXc2x3MVY5M1VEc21QSWo5R3hnaUFpb1JSTUlKTnZvdGkrU1cvSWtkMGd3QVU4K1h4SmNiR0lUSlBEdkk2WGRDRlJFRlNrblRCODN4a2E0MEgxUEdGOWRueWNDeEZ3eWdrSzBiQVNKUVNWQWJBWWVEOTh4VUFlNVUzaktJd0Jvc1NnTnN1QUJZb2dsMy9Jd2dGUHJPSWcxWGM0WnJwQXNTcnZydXlrbDJ1Y3lrYXBrTU1oNENFeEQ1RHdKZldBWUF4d2s0TUtQQUpnT0lqR1NFR3d1Q2FrUmhlbXc2WXYwVVV3UmY3TDAwTDlwbnNOeDZReDRmZVk0TzhwREVjaXhPanNvVEtLcE1ZalNGWVlqT0M4RXEzV25ucjBZWVMrMFRtaTJIeXNyUEdMcXdBU05ZekJuVDJNejJRRDkxbGF4TEIwZ3MxMkdBaDgxY2Yvby9PY0h5SitxajBTL3p4bmhVWmJTeVlXYUw4K1JxMlMyOXdvd2lXa0pQYW40TXZnckRER0FsUmU3S0l5d0RJZ1IzbWVFRFdnOUhiSmdBcE5Ua1hvOG8waTdvVmd4bkVnRnI4RjdqRWRuVTVHdnFmSlFLUUt5RU9QbHNOSVF2eXZ1cEFHSFMvT2t2NHF2OW9oK1BIeE1MazhnZ0JDUnh2QW1FTitBaUV6ejJpUWZRQmVObWtoNEs1MmhKQktPYU5lL0ZTTG9iTFJYQ3o0M3JRbnUyeWk5b01TTUR4czJqbzgzMDNFUnoxd3NDR1pFQ0Y0a2QzRHdFWVl3Smpob05sUXJnSWpsWW9kYkJQcndNQVpmRW15emNJdjI3Z3M2WER6Qy9JUjFET2dBOWE2RFJ6NHdaQXNaK0xZWHZRWXNIb0Q0emlPRmtsbmE2WUQzK25uVTZkWjdiR0RBY0JVSW1JQW1FVXcvemJKMWkvc2NHTkRKaUxYbWxlM1JoUStsL2FxNTdnVVFDV3p3d0JLUGVMc1ovTEZyR2cvU2hSWEFlNjRBamt2MzBrQUxBakY4UjExRHkzSzdLUndKY3NVVGFxV1NjQVJvdTN3L0lOVm5DSCtBMzZuOFJ2TTNuQjVYUDRvRDZEQVRCWXdHYjVhamxPTE9oNlg4SmFCS1JHNzcrN3lnR1lwMWJuK1YyNS8wMUF6Qm53UTF5cGFuRDdLV2ZBMVFEWUMzekpJajdLZ09VemM5bkZiZXRYL3IrTzViaXdOaHlYNXVTRURyNW8weHNKd0xwOC9tNEE3R2FKVXYvajMvNStIUUZZSjNvRlBQa2hvL2hOZXFCY01rY0IyQkFBNlhyeG1NQmtmRkFjaS9tMEpwd3pYdzBUWHZYdHpyeitQS2MvTWwvdWd6TTlNRHFDQWJ6L2tlVmpqR2NRQS9ZTHZqb2d1bzFtUnNsUkk2Undmc2lBNW5xaEw1RDZuc2NGOGdmVGRmeHBTKy9oTHp2V2Z6TVFDb0IxRnEvOGIzVldhUElEWnFzUlY2NERBTHNaSFZIczFnRXZzcUZBZUJTQXBRQzhwSEs5ME9xbDRVRUF5dkN3TmVHY0JYTkxPUE1MZnRnWnNJNzVvdVVyOW91c3AyVEV5SUovc1U0QXpDMWUrV0lGc2h5QUhQWlJFVndJdHJyRDN3R0FoaWJUWUJoeFZwZS94ZVB5ck5CdVdhb05wM0RnRndDODFPK1JBZXBLL2E1TGZlNTFqeHI3SndBODNuUFhZZ3ExYXNsMHlYNU40OCtmNFZFR0xBVGxLMXZBbzVZQjFnQlNSbXNNK05GRTU3bGNmUEQ1cFBGV0NKSW10eXZHZ0dmT0FhY0JZTzU5ekZnbGdIZ1BlZlpzWFY2L2dQWEJZZUMwUlZneUpOT0dZdUpqUGthOWVIV2dqTDliV3poV2swL24vd1BuK2s4YmdGTm1nWWNzVmZsWm5CUm1JU2h0Sk0vbTdKR2liR0JvT0lJZXo5d0tQUDRBY05weWxmYk5sR2ZkSSs5TmpCano4SlZ6cHBja1p1SitkQnc0YVE0NGRyazZqMUxJWTlKa1BEN1A0czJsd1ZFR0xId0pubmNzY05JaDROaDVZTXNTc0htNW5kT3UxQkdGVGhKOC9LNkpyWnRvc2xTVDIrWEhBNmZ0QjA1WkFFNWNyZ0F1cHM1VGZhTDZFRitVeUlpZjNnQWNPd3RzWGVwODJlSVlZOUprWHBNZ01wL0FlWlFCQzJiOE9kdUJZdzhDMithQUxRdkFSZ0p3R1poWTdzd0V6Yk5hODhJUnZBVk8xcWtGOTFKMzZETk9CRTdlRDJ5ZkI0NWZxcGhMbmV2emRHZUJLQmZMOFVYNS9DWmd5eXl3ZVJIWXNGd3hZSHpSTks2b2V0U0JNRExqVVFBV1RQcVBuZ3BzblFLMnpnS2JDTUFsWU1NU01FNEFMcmNuUjZKWVFJd3NvVW5qcERSc3RPTHk3Y0JKQjRDSFVHd3VBdHVXMm5VRFZIMUVGVWh5Y1N3V2pHRDY0bVpnMHh5d2NhRUNvSTB6NVAzWDVQNm5XbEhkZ0hnVWdBVUFmT1lPWU10QllOTXNzSEVlMkxnSVRCQ0FEa0l6U0paWHBDT25JZzI1dVByaGdudXBPL1R5aHdMSEh3U09td1cyTFZTaWsycENyRHNRc2t6TklCR0lwQmRHSStWZk5nTWI1b0VOQ3hYNHlQUmpQajR4YUowK1dHZUVIUlhCRFV6Mk14NEZiRG9JYkp5cEFEaXhVQUZ3ekFGSThLVUpDaE1WMlNVYUFHYzFjRS94RkplZjNGWVJ0aTY0bmtxV0RycXFFaGJyc201enZaQ2RQQ2Q4bkh6Sk9MWnVBQlJ6OWhUSFp3UEw3TG5Mbm9OTUlZMlZ5YUtjanRaTEhPQWJOZ05QbmdLZTRCYWNmR0YxcG55ZEQraHBoUS84WFY1VWlFdWVMR25ETjF0V1hqLzMvNGNUd0FVendHUGNSY0ZKaURwUHQzRkxtZjV2andFMkhBUTJ6UHJFekR2N09RZzVPU00rU2NZUXk1WGJvODQ2NXUvWmZMVEo3ZktIQWR1bUt4Vmg4d0t3ZWFsU0U2aW5Fb1N5Mk1XQ2RiVUhJZ2h2M0FxTXp3SGppOVZMWnVEekQ4Y1h4eFdaczVjN2FwbVcwZk1CbklIS241WDdkNkk1bnB2Uno5NE83TGdYdUdJUmVKU2IrWGwxdHpxZmx5YndSd3FmOWk5N0JRUldvbVdKUTdvWlZGdEpvcURYL2Ivb0dPRHN2Y0JUQVRCOWdzZkdxbXpkanRWeitHK1BBeWFtZ1ltWkNvRGpGRTJhbkNWZzFDZUp3T01uVFJCL0RtVUlOVmtrZ2lhM3kwOEJ0a3dEVytZcUFGSkZNRDFWQUF3NlhHNjFSMzFPOS9mZHJjRFlQRERtWTB6amMxVWppdkJ1QU14MVFkTUIrV0FZWFU4ZGhFVTE2ZE9Ta3BwYmNIRlNybmc4TUh3bnNHTVBjTjV5cFVSSHAyeE1JYTd6RHoyejhHbi9rVmUwWW9tTzB3RXdCWUt1akw3di96SEE2QzNBeGZPVmg1OGc1QXNaeHg0ZlpNN3NmM2g2QmNEeFdXZUdCWitjTUVGaXdHRUhIUm5EenVuN09OSHMvZGprUmdCdW5xbDBWRE9TSElEVTNjeFNENGFFYWpoRlhTNEg0UzFiZ1ZHTjBWOHdlN0UwRmg5alZERzZPYnIxTEpNUnduK2tPQ2FURVlUMGRzZnFaSFhsL3A3UHJMaTl3SVk3Z08wSDJ5QWdDQVdDV0Nvd0tyWUU4bk1Mbi9hN1BRbjlYN3pJSlBQa0NjSys3NTh5N3g3Z3VOc0I2bDk4Z1pqTExZZXQzQXk1bjBzdjRSK2ZDWXhQQTJNT3dMRUFRTElEUHlQOHVCZzJjUlltekZ3ZUFZaWxLa24rT0M4L0ZkaDBDTmhFQTRuR0E0MGtkNkZFUzEzV0xPOHYxcUhLQWZoOUIrRG9ZalUyQWsvanMvOE5BSXdnN09VYjdMQ0MrV0FmQjRDcEJKb0lpVFJOUm1TMWwxM2txV2gzQWR2MkE4Y2RxcXAxTUIrYUlPU3hXdjZwcTVEMmtrSUF2dDhyRjdCTEprc04vak1xZmE3dis3L0FrNEIzQTZjZXFwYXNLTXE1YWtBbWxMV1kzN3Q4Wlc5N1BEQjJxQUxnMkJ4Z0FGd0FORUdjbkk1SmNyRFpSUGxrYVhMNHUxS0pVQWZBamJUUTU5eDZkU3ZkTFBYQWdHWXNoWldSNkpJUmFYQi9Od0ZJOEMxV3dMTVh6TWVTd0xmY1h1S3JBMkcrd3JMQ0RjTi9JSWc0RVJSbjBxdnl5U0FRWDZtRzFYdUE0ZnVBYlRPVndrdFJScjJNTENvUXl2RVovVVkvV3dqQWozanRGSlprVTc5ZzFnaGtnRUJmOTgrMFVtYi8zQTJNM2xrQmwvZk9jZE1vazJFamtaeXY4NzczTEFmZ0hEREtqd053eEVVdzl5YWlscHdkeEJBRVloQmJBdUd6RzNhS2tRRUp3QWtDa09DamxiN1k2U1l5ZjJVd2xBUyt2S1luQVhqZk5tREVYN0RFZkE1Q2pVY3NuenZidTFuRHRVTW1DRGtSWkVFeUdkbEFrNkc2bFFUU2E2bTBNUDZIdVk3M0F4TlRsY0pMWjZXT0pZQzUvQ054THBITWdkS0lLTmw2OVF2dTYvNzVBakhPaVRVODdnS09PVmlKYjc0OEJLQ1dybksvbWFUQSs1OEFqTTBBbzdQQTZMeC94QkF1cG9ZREM5b2tCUkFtUGRCWjQ3bE5BL0Rod01Sc3hYN21QZ2wrU3JtSzVFYVJOUnNsWEZROUNLQjlEa0FEbjc5Y1p0a0hGa3lzSjEwM2VCYnFsaDk3RHBtVFFUWWdrOVZOeHUreFliWEtVM2xoRm9KUE9nZEZHWStsUGtnUXhva2tnRjlYZ2o0QXZmb0ZzODRlWDRLZTl4OWZJQyt0UmZEeHZ2bmlpZjM1OHNTaXIyTENqNXdOakJLQWM4Q0lpMkF4eExDeklBR1k5TDdBaEdJS2dwQVR3NGw4d1RvQjBKalByZlRrcCtTTFFiSHJPcW01ak55YWpTNlZDTUlwQXBEQVd3UTRMckdnWHF6SWZucTVjdjB2TjBaWEhUSW5NRTVHQk5MYjFER2RPWVFzSTdBZkdLRmpsZ3F2ZTh3SndHNFQrZnVGQUZ5dFh6Q0xiK1ZnV25IL2ZJR1lmYzQ2SHM3aUhDOFprUGNkWHg0VmZWWEp3OCtjQTR3SWdNNkFIU0xLV1pDVEVTZkxmZzdXc0l5UkYzY2tpUlErSEFDWGt3SHB0eVA0S0hycEp2S1ZHbk9oUkY5ZUJGOXdFMG1VRW9nejJ3QytXR0kvdlZ4aVFRSXhBczkrcm1IQTZFMVlGWUI4REp3UU1abDBPckxaKytpN3NmVDh6cm9ZSExTOWRmNFJBQ1dLeFNadkxYekcvZlFMWnFrMmdxbjIvdlVDVVE5VVphTTl3RGFQZVNQckM0QTVDMUtWK05JVEt3Q1MvU2lDUi9qUkJEbExtUDduSHluc3hubzFJUHdKU3lScGJpTUFEWHp1UERZZlpmQlRFb0FtY3VWUWRpYVcwendYd1FzQ1lEWW1NYURBMXdHOFRCU3Zhb1IwRzc3RWNHU0VUNmhqT3ZWQXBmUlBBVU4wempyNDVKelZjU3FpVHhEK1ZlR3pYa3UvNE5yN0p3REpPa3hGSXd0Nmo2K1JxVXJsa080Ylh6cDFnQ0FBdjA0QXpnTEREc0JoS3VnTEZVdlFVaFR3Q0VLYm5LQ3cxNEh3SjljRGdHUTlXZWdSZ0RJOFhFY1ZFRHZBbDdsVmxnbEFnaStJNENSK1pmMW1MR2dNbURGaEJHRmZEQ2ljUkpGRVJ2aVNBQmpMUzdGQzBNRktNVSswN3dPUEUwa0d2YW9RZ0d2dEY5ejEvaU9Ea3duM1ZXb0VYeHJlczVpYjl4eDF3WnVmQkF3TGdBUWV4YkFEMEppUXdKT3VKQkE2OC9IM1poazYrM0NpZnFxd1dOTUtOOHdqS2diazZnV0pnQytGTWFCYjV2SlZtc1ViVjJ2Q3FvM2NSV1pjQ0lBQ29heDUzK3Vsa3FOZDdpcU9jVTFXY0M5Y3hFbTVrUUJVZForc1RuU0wvakV0VFduZ2kyMWpoSk5KQml2WkJ1a1h2T0wreVlCa2NPcXhLako0QUdneHpNckJWd2RBTW1IclpPQVlGMmw2eS9td1Y2eEQxN3ptV282TWJSeWVXdE9Id3hKOTFJSWhyNnJxWlM3MERQUExYRFZVcmZCd3pIS3IxRVVwNi9oMFQvNkwvR2NDcXNsdDRJaG9UY3dkQXFEU3M3STYwV1FINlIzMjlwSHVGeXVYREptRWp1T1NiZEIrd1N2dVA1YkdVam1zQTVYb1V2Y3ZCWEtLQVFuQXBVZFh3YWgwYjhqWFIyWXpKVHNDMFpIQjMzRkwrMnlpWDNoLzFZZUQxZkZaR1Q4MWcvSDZ5cWtWYTlZRXBxTWhUQURsZThlckhBNnQ3TWg2ajRaQlhkQkdqRnlPNENTSW05d0dCaUJ2Z3F4d0lBSlFsWEl5RUpMeUkvaTBTa0FHL0ZiaGFFcjZCWGZjdis1ZExLaENnNHoxQzFIRUJKOCtCT0RRR1pYZmsvcXVBWkM2a2V0QVpFUUNUV0FVOFBJSnQwZmd3SHpadlZXTmFLcWk3SkxPbXREV0Z5NDJnMUZ4SC9YZnFHa0lJMEMrYTB0bkRrZnNHeFFqbjNWUHNrN3RYbXV5K1hwMEpodG9Kb3NBYUZjVUFKVVlLaVlKeGNxSHFLQUg5clBsRzJjTXJtQ1ViTVg5Z3VNTHBHVGNDTUtEbFpHaE1LOElQblBJbjFYNVBBMkF3ZWd3RUVZbURHQk1qT0k1d2hHUVAzTlBCVDdWSmxSTmFLdkY0dDJJV0hiREVydERsU2sxcDRsSjcvemQyNDZ0Z2xHWnJ5SWZyRmhRN3BVOFdDQVgwWkVORys1N1UxNFo0WXJDZUxyU3hYZGV2NlRmTHdyYnhUN3puTXJmS1FYZkhMUUNueXZtUkl2MFEzNDMwZXpNbUw5OFAzOTNHM3dxejZhbTFOWXp6b0duK3N2cVJtVEFVMmNpdGN0cUFYLzJFSThGOUFDRW1MSFhMWkdvRnh0U2wyeHlLMmJBWXdyajZYcjEyKzFub0wvalVUQ0Q5dnZGcm42dTB2MS9udkdrYW9WQkFRaTBldW1tTUF1WFFITVdKQUE3Z0NpeEc4VTBnRmZjWGRsQktrNFo2ekVMZ0FKZlpFS3J4cEMxeE9JbC8rU2s3amtjZFlsU2NvOTB5OStnSzZ2SnJSaUFERDBwaWFkN1J1Rm8zdWROQ2dmdDk0dkNkckdYbit0dWpnVjNRQWNITGNGbnJvZWxpdkhrY2hFTDh1ZTB1UTc0UzNldWJBSVRTM0lRaEtrTVJqQk1va2dXRzNMLy8yejNWU25QNFZEZ1FXeFVFRVV4QVpGSEwwZVIzSERmbTNJUmJESGtCZkYwenk0RUlLTmhTdnI5Z29HRUJkdlR6L01JWVFMUWRWc1R3UlRGRGo1alFtZEFyUkRZSlFORFNzOTYxUjN0UGh4NU5Yb1Znb3hsZUhuYXJqb2hnTGVjM0QySEk0OTJ5UU52SXd2cU85ZkptOXpLR2JBd251NkZoYVA1cEZ1TWcvYjd0VGJwQmR2VHo2OGN6L3pJOGF6Vmo4aUFIVHFnbUZIWERVQjg5UjJkdGFDN3RVR3c0a0RPZ0ZiMFIyd1lSREdaOGc5TzhhVTRYd1BPY3poaXdHbE1qcXFMV2lGWUd1NTcwd0FERnNiVHZheGc4bmtvdzdFOG5NL2F0Zkt6bG42LzFtUzRZSHY2QlE0K1owQmJxSGNkME53d1liVkQzKzF5V2hYSnhQQnJicThBcUUvWEFwU3FBeGlCVjJNWi81NERNT1p3S0UwMHJuRFVXY1I1S2lWL2JyanRTQU1BTEl5bisvbUN5ZWVoaklZcDZmZHJ2VkVMdGg4UkFDbHlIWHhtaFBpNnIxbThGTTB1Y2drOCt5NFJIQzFrQUsvNVhnVysyaFpZb2ZhZldjUHExQjVBcURxRVlzUTNuZXBSMmdxaFYyeWlvbDFDT2tEMEMrYU9hb0d4NGFMN0RRQ3dNSjd1VndvbW40Zm03VnJYMnUvWEFsRUx0aCs1c0hQdE4rbC9BcDZzWDJkQ3NaL3BoWmtJSmd2OWwrKzF3YmNxKzJXRnYyTlhJak5LQVB6dXc3TVVBVjhEVHV5bkZJRXNReTgzUmdUQWhpditOZ0JBQmFRT0dFLzNtd1dUTHdBcUhuYVFmcjlHbndVYkFSZ0ROQlVsa3B6UWJveVlDeVlEWWRJTGRmMGw0TmR1VzlrR29hNGdlTmRhekxFbEtvQTNQcng3RG9maUVUdEM2WHZFN2hHRXpKbHBjaXMzUWdyajZkNVVPSm9ZRGNNZ2xyWDIreTBOUHRsNVVaVWprZngvSHFiZWNvZTBPWnpkRjFnSFFybG45QmhlZTRzM2YzWnhtNE12QWs5VlNGZFVJdzBpK1EyUGFCdElTaUJTU0ZnQ1lNak1XMDBNUDdwd3Z2TERtd0ZnUVR6ZEh4Y09TR3ZCZy9iN1pSWkJ5V1lBbE9FUmx1S00zUmE5Q0tXYzBxNzNkVEJoTUZUNFp3SXc5bDVMcnBlcytIamVCaUdDVU9LWGV1QnZQY0tUaUVJT1IwZitSaERCTVlpMExoZWE0R1RhYTVOYk9RQVZEemhnUEIxTGE1UnNzVjNySVAxKzd5eTVPQUFEb0FjaEVIQmtGYktmR1JwaXdlQVB0TXM1SUZOb2t5T0drLzdyQVlDOU9oQkZ3TlhWWTFhdDV0ZnRDQkhhV1ZTMkFKZEVjRWluckROQytMdW1peWMxQjhBQjQrbXVMQVJBWFREQ1d2cjkzbFI0L1owWHQ2T0RGUWtqOFd0dW1Fd0hUS0RMUWVqQWZOM3Vkcy9kZmpvUWRhdEdMeGI4alFCQVl6Ni9ib3hpRmdBVnVkek5JYzIvczN4TGsxc3pBT1JvQjR5bisyRGhhQVRBR0pDdGJwa0NZcTkrdjRWK2FCZ0FRNGk2Nlh0YUM4NVlrRG9nL3pkWnZ6VWdmTjFON2E2MzNYcXY2ZmU5bXNESUhmTmFCNkF5MkpSRTFBSEFFRElmSTVuelpDTGVONE5ibTl5YUErQ0E4WFNzdWw2eXFWMHJKMldRZnIrc3BsQ3lDWUJSL0hKeUtYNHBoczBQS0JaMGxxT1lUcHZuaUFpVUFtQWQrSEtqbzFjdkRqSGdyKzN3UEpRc1ZDeW1VWnJQTXVSc1JCREc0QVFDc3VueUp0RkdId0FBSUFCSlJFRlVjYzBCVUpseFFvSDYycThTVDhjZ2dwS05BRlJHd0NEOWZrdXZid0FreUdnSkUzQytOejFQMXE5L1QzRjFFWkJ4dlpoNTBzNkFFWUM1eXlVSFh0NS9ROHpJNS9LckFtQUlra2lwa3lHUFl3WHoxYVJUOHY1Wk82akpyUnlBdktPdk5YbExhenNYczliby96dGMyOVBvaGdvdHA1SjQ5UmNqL3B6Zkl3R1MvLzNPTTRDTmQxZHBudFFwRlVtakVINExZSWdueW4vT0xqTDhGZURHaHdKYk5nRmpJOERJRURBOEJBeTFQRks3RlNLZjQzY05LcnZIeCs4Qy92bXh3TWdtWUhnRWFBMzVKMFN0cHZ2ekwvblA4UmJMQWZoeVQyMDdUQ2hnRFJpdS9aTDlEc2ZXTkFCdll6YmhDREJLb0JBay9wRW9iR1dUcXA4MTloelExLzBrMFBvYU1ERUpiSmp4VlpGZ0RhZDBTYVVPNUxrc1dWaitYU2NEbXc1VUVVREo2VTRkMG5WYkM5MVMzb3ZmVkhwNWFsNjRjZ0MrazdtWkFQNzY4S0NBMFdEM0EvaWVMejA5MENEY2VWbWxBdWhCbGpMZ3JmY0F3NlBBeURBd1BGd0JrQ0FiSXRNNGEvRmlOdEVSakJsNzZXOWZmRDJBYndKRGR3RmorNnN5SW1SWHJkNVkyRmpJWWNueldQTEVxbnNmQzB6c3I2cUJNUW1mSURSL3B5SjZ4TWhLeU1yU0RpS0QyeGphNlRBRFR0MC9BR0FzMUtjQVVDRnJPTEY2dGJ0aVJWRmF2VC93dU1DYTdNZlZUbEgwOThZQmVCY3dOQUlNRVlBVWxTNHVCVUxPbUszTENud09QQU5sRUlPU29GOStDNER2Vm9XWGh2ZFdaVk9ZcVdnaTN2T1hEVVFoZ2llQjBFRWxWaU1ZSjA4SHhxZXFuRzhENElJRGtBem81MURLUVFKdkJLVW1LQUN6Yk00KzVoVWl2d3JnaXdDNEx6dmptZ0NoNm5CY2dpTVRjdjlBYm8wRDhFNmc1ZUNqZnBVQTZBeG9RSXpnaThBTG1Xd0M0ei8vRHhjUFB3QmFrOERRRkRCOHlKUHBQWkhlR0N5QzBLTjVERkNCeWZoOS8rT0FzZWtLZ0V6Q1R3RDA0N1gwU0NQTTFJWVFqQ3YyRS9NSm9HVndVVVFvUGJvcTBNZHFrV1ZuN1J0RERNYWhCNGcrUDZxaFhGcGpWdGtEdFJHQTJuS2pvczdJeU95SEZVYklyWGUwRlhzVHV6SVlmTmI0TzJNM0FUR0lZUU9tUG42aEc2Z2kzZVVrUVFBZUFJWU9BVU96QUxNVmgycEFsRVNxR0ZCQVhBWU9NUVZqeGxsMDNpTy95WUtSQVQwRlFYa3daa2pwMXB6NTFMTzJYQVQzS3REM0FJQXdqNFdnMDVrZml1VUhZbHNYQUpMVm5QMElOTE0wT1lGeDc4QXpjUnlTZVRzdzJBSnVlSStEajJGbmU0RVdLejVNQTBNekRrQ0NrQUJ5VVdxc0p6YXJFYW56ajJ6WHdqRUdGSHVHWStwWXNNb2p6WkwxRzlFQmV4WG91MzM5SVJCckMzbEpHbU5EdVNIWCt3N1dDNENtNndXeG04RG5nTFRJbWdDOHBCY0dCdVRYZi8xZlhueVR1Z25Gd3hUUU9naTBDRUN5SUZsc3Z2SmZFbmgwbWhzWUkvczV1eEZZaTF4Wm9mN29PcVNBYXd3WWpSR0J6WUdYYnRXWGFDSXJsdkhVYWdYNlNQL3J1TVZZQ0ViRXFFQ1hBTWpmcmVlMkhnQTBFU3VyMS8wdnRuTndHU3NHMFJzWk1FMjAvKy9YV0g2TXVnay95bmdQQUd5NUdEWUFMamlJSElnUlVJcnNaak03QXgrQlN4MVM0cGZmZlFWSWVwOGRMN2RNRHNUR2pKQitDdlF4VEhtZHRydzRsMENvdkZydUMyTk9lOTc1ZWdEUXNDWFJLL2VLNjM0SmhCSzkwcTJDN0kxaStHdDBqeEY0MGsxY1BKQUI3VVAybTNNR0pBQUZRckdlaTlpVVRIOXlCVURUSGZVM0I1K0JPSUtRNDNCV3ROdFBjV0lPekVaRThGb0s5SzBEQ0dOeExpM0ZxYUtBOWdUZ2VvRndQUUFvSTBPdWxXVDExb0V3aUZ6N2N3YkVyek54V3RFWUJCK1ZZNzZWaDREV3JIOElPb0dRN09jZzFDcU1STFBsdG14dnMxL1NIYVA0ZGNBSmVQWXl5VUNSSXpyVEI4dEU4Rm9MOURVTXdsNjFrUVE4N1JteTJQUzJyZ0IwYTFjaTE4UnVkRUpINTdPc1kwMnkvKzgzL3NaZEJLcjRGWFFUQXBCdnByR2dRQ2c5VUVBTStoOUY2dWdKRGtDM2dKUEJFdlJHcllvWUNCWDlJeEVjUzVLNGk2Y1pBSEl3OG9YUTRtTEJiMzVZSDVkN09la2FkdFRWMVVaU2phRUlQSDRuUXpZTndnakFITndEdVdHWXBaYzdselBmWDFjUXVyNW9Cb3JmekRmK3ppMHlWVHVTa3V4QkkyUStQaFFESVVFbk1MbzFUQkNaTHVmR3cvaXhiUWEwS0I4Q1RPRGpQb2hkWTc4SVFtZkRqbVc3WW8vZG9BWDZHcUlpQXRESGFZc3dTbWVNdWJWODFrcDExTDZoeTJQZEFjZ2JsZnNsT0tDMUlpS1JteVJ4WmdWLzgrK0RTOEJGcnhYaTVIZC9VNk1lU0tkcUVzRUtocEJSc2dSTWJBdHVHNEtVLys5cnk1YnJ6UC9sUFZNdjFFUE9RZWdoYXJyVmNnWlVoVkhGeE5QY3A5VkZ0bE9Xa0w0MzdDMFdBQld5cEZSR3NWMHNiNUhuMnpZQnd2VUdvS2wxMHYxa25EZ28weTdYQThQZnYwVUFDbmphSzMzQ285Z0pRQU9lNjRGa052dFpBSFFkano5djJOejJHU2EzalllajJXM0tHdVo5aXhHZElWU29LVDEzQjJzNUFIa0doZVNUNnFuMGVySHY1QUlnQUFVK0xWZncvd3EzQ0VBVjdjbEJLRERHWkc5LzVvVlh4L295WUFSY3pjcUg1R3lIOGVGcGxUYXdGdkF0cnRYTEdwTnJRREdiZWp1cEIzb21sSUhRR2MvRXJ6T2NHU1JzOHpyaEFiYnVMMVRjby9KZmJMbE53SE9taTJrSWNzM293YmR3TnBZdHluRFFoc0ZjZ3Z1RzkvWWFwR0Z2WVgyMnpaY0FVMC9Hd0EyTEovNEFtR0Y5bXdFYkJ1OThZM2NNRit1QUdRQ2oySFZwM0JiUHVvM0lscXhBeTV3SEFxNE9mQVJtRUJYR2ZOSUJhMEJJc0cwZWN3QzY3bWVySGdScFpMd29jcldhb3Z1VHhldy9WMHR4SlEyRFdlYWUzV0FHYmRoYjJEQjQrd1J3N3c1ZzhRcHY4OGxpeUd0b1dIek1pNEM5ZkFFSGJCaThrd1VLdTJ4TkFkQnhhR0JMYkpkWnV4MUx3QUdFQ1lBRW02d3lmcGVsSnJFZ0ZuUkR4RVN3Z3lVeElVc1ZNd2pWeTVBWU8wYkc4OUF1dTEvNUJGMzhLcWpCSGxVQVlYc3RlTkNHd1RlV051d3RrNEpNa3JsekdOaXpBMWhtNjlnMU5peCt6RE9CVzBhQmVSWlpHcUJoOE00ZW1mV05BRERUK3pxTWpReUVTZFFGSGZEYlpFQ0NMUmdkSGVDVGU4Q0JhS0pZMXJEbkJSQ0lBdUdXNFRZQVplRkc4WnVNa0dpUTFJRXdHQ0p0SFpCbXkxb2JCc3ZWTW5ERDNqSUFlcnRpM0xFQk9NakdjT3BhM1dmRDRpYzl0Nm92ZUR0TGZ3N1FNSGpuSDZ3UEF5Ylc2eWFHNCs4RDRISVFmdnRESVZ0TGVqcEJGc1Z2VUk3TklCSHczRFVqUnpMM3JEVnRzWVBPa0FTY3VYM2NvTkR5blQyVllKQ2tuK1BqcXZVRDhoVmJTOE5nanBoR3hjQU5lOHNBR05vVlkvODI0QkNCdElhR3hSZThwTEtaZHBNa1R2WGlKMnRvR0h6U05IRFBTY0F5cTNlcjRxUHlHYU5jN0pDUlhXTFQyVGp3R21DT2VRYXNocTYrcVNwWm1wOHZvalFwaGVGNThuY2RaVmpMbmpXUEhyNFZXS1RLeHJIR1VxcTk3cVh1M2pwMHdQeStlRUMvRFlOWnNaQU82SUViOXBZOWxOQ3VHUGNOVjgzMFpta005ZG13K09LZmJkY1h2Sk1QZFkwTmcwLzdHbkRYS2NETWNjQlM3TXdkS3o4S0NBS1FJZ1kwTVdHQ3RyNFRPSEFhc013T2tUcWY2dW55dUx5a2ZkMjU0bmtiN3Fzdy9pVmc3amhnbVNYMzFWcGQ5eVJIZUx4K3pSaGpFR1JiQjZ3RFlUOE5keW15dWJ6RHpDQ0dmcE1KV2ZTUllmcjlIUC9hTWdCbTdZb3hOUUhNYlFIbStJRDZhRmg4eVM5M3RBdkdRYjdkYTJnWWZQb1hnYnRQQXFhUEErYTNBRXViZ0dVMVJNNkIwNjBmZ2tSb0N6aitUY0QrMDRDRkU0QmxkWmRSYzQvWXhseGdqSk1ld1Npd04xeldmc09uZ2RsanEzRW1ZMDh2bTVpLzdqNXlJTXFwdnVwS3lHb05nOWxuZ1lvc2w5d1kvMGRaZHJNellsOE5lOHNBV05PdTJNQTN6dy9GMkNvTml5OTlYYnZmdHJjTHJpejZQaHNHbjNVOWNNOXhNT0RPYlFZV0NNQU53UEo0OVVsaXVXNlNhcXFCbi9nR1lQOHB3UHlKd05JeHdESzc2YWhEZU42dVhZQ3VZeUFCa0V6YTRMYnBZNVdFV2RTTHhqRjI2L2RRQjBTSjZyNEJ5QU42TlF4bWtXY3FyblEwMHgxREVESkZqUjhDY05XR3ZXVlBwNlpkTVE2T1ZPQ2Izd0FzY1BKNk5DeSs3UGVya1A1UTN0QlkxUHJUOXRFdytKd2JnUHUyQWxOYmdWa0NjQ093dEFGWWNnQXVpd1dsTS9YcURqTUViUDl0NE1CMllPNTRZSkZNby81Z0hJY0FMVjFUUloxN0ZYT2hQdHZndHZrcWY5SDRrdkhEbHlLSzRsNlZ6dlZTQkYyMnV3ak9iN3BidytDZmN3QlNreWVGRUhBVXgveXc5SlR5RWJvMjdDMTdPbDNhRldOdUFsZ0luOVF4TzJ0WWZObGJLNk12YXhlTVJZcXV2TDlyVGNQZ0ozMFR1SDhMY0hBek1PdWdYM1FBTG8yMVdYQlpMRUh3UkYxT2dIUzJlT2diZ0lQSEE3UEhBZXpOdTdRRldGWjdKblhKNXJucXhIRXVsdmx6d3lWTk4zK3dlcm41WW92bDdTWExHd3ZuNHJpTFdPNGZnTVJKWGNQZC8rcG1PeW1FTEVoUnpCeEpBbzlnVkw0a3dWbmJzTGNjZ0hFcFdpM2Vwb2NDQU1lQlJVNWVUY1BpeS82cXRsMHdwdmhBKzJnWWZPN053T1FtNE9CR1lHYURzKzVFeFlER2dxUCtjY0FrSU5hVnBCOEdUdjRkNE9CeHdOdzJZR0ZyeFlDbVYwWXhMTlloZUNYYXU3RWhWM2dhM0xiOGc0K1I0NXVvR0xBRGdIV3Foc0JYQThLMUFaQUR5UnZ1dnRrQlNBcmgraTlEc1FoQ090ZjBVVWdXLzdhaVlXL1owK25Scmhpem94WHdGaHlBaTV5NHJHSHhVNjZxQUZoVDNyRFNJVmRwR0h6ZW5jRGVqY0RCRGNEc0JEQlAxdVgxQ01KUndGaVFJQnp4aWVMM0tJWTFZVzVNUE94TndMUmI4Z3MwYWdoQXNzMUdaMU8rU0ZIc2RSUHQwaS9QTEh1KytkRmIveDRtWGZoY2JXeGhmQ3RZTUZyL3VXdkt4ZkRhQWNnN2lwUEN2Rk9WcHVvM0hyQ2pZVy9aQStyUnJ0aTZUUzZNVlErTDROUEgybng2OThHblhGMEJzS2E4SWFiNGRGWnBHSHorSkxCdkFwaWVxQUE0SjhDUE9RdU9CQkFPVjBDVVliSXNrUmtBZWNydkFkTmJYYy9hREN4U3B5VDRDRUl5VGdSZ25laUxJcDNuUDZmcythNEE0TjhCOC80OENVQytaR0pBMjlmcHVMbXhKVys1aDVrTkZnMmppV0hTaTByMFV2NHBDb1pzeHc4RFVmbmhkNFZrMFhHZEd2YVdQYUJWMmhWamRqZ0EwQmxwa1EvSzlibW4vSE9WcXRDbHZLRUJxbGZENEF0bWdQM2pEc0J4QjZEQTd0ZGJjdll6SnZRSmtpaTJuNE5PZU1wYmdKa3RiWVBHQUNpRjN3Rm9FeDFaTU5lLzRqblBMWHUrS3dENHQvNVNPL2lNQmNYdWVzSHlseUFDTUJQRGd6R2c3b3BNOG1FSElHZHdyZkdBMXJDMzdBSDEwYTY0WXI0QVB2dk9TZHdFUE9WYkt4dStLMnBkS1JUbWRJM2Rxa1BQVmdiU1RCR0FZOEFzQVRqV25pQmR4MFF4SnlsT0ZDY3I2SEJpdzFQL0NEZ1UzRWdFSU1XNTJNOFlrTG9sUVJkZElOMUF5S1dpQnJldGY5TUpRTjZIc2FDUHhlNHJ2Z0RkSE9jT3hESUFjbURGRFh2TG5rNGY3WXF0NjNnRUlCL1lvais0cDl4YUFiQkhlVVBNOHFGMmFSaDg0UVF3TlFZY0dnZG14NEM1MFdxQ0ZuZ05zZ1N2UStEeHU0TXVpYXdod0lBWFZrMU8rZS9BN0NaZ1RoWTFkY25vMW5ITDJvREl5WlVMcEJzQUZUQlo5cGpUMFFRZ24yVjZ1ZlJpY1M4UVJnYnM1WllwRXNFTkRlakJmcG9McndBT2pnSXpaTUJSWjBBSG9VQytTT0E1NnhKd05sRXlURnc1RnhCUGVXdmx6cG5iQU5DZFExZVNHVFJ5Yk11eWRnTWdnVkJzS210WW9DNk10OHpuWnhzWk1MekF4b0FPdnNoK3lkRHF0WHg0RklEbDhML29tUTdBMFFxQTgyUy9FUmRUSTIybU5mYVR1QklJeFI0QmhLZSt5NjFwdW5RQytNeXRJL1p6L2M5RXV2eUJlZXRMQWZHWjVXT01aOWoyL2dxQUJCMWZNTHNIQVZCcWhmVGN5SDVkOU1CeUVkenMrQjUwWjd2b0daWCtOek5Tc2Q4Y3dVY0c1QVNSS1liZEhSTll3aGhESUhSZ0dtTzBnRlArSEpoMTVqT1hqbnlLYmxWVDVDYmZvcSt5Sk9zekY4UDgrVm5OUGxJQ2tNQXpkcy9ZTHhsWXpuckp3SXBPNmVnVFBNcUE1Wk5EQUI2aUNDWUF5WUJjQnFUUlEwZTQ2MzBTeFp5UUpRSXZNSjhtU2VMclllK3AvR3pHZm5UcEVJQnk2VVMvb3V0K0sxd2crYnJzODhySG1ET2dBVkNNbnJFZnh4TXRlMU10Nmo3dTl6ektnSVh6Y3pFQk9KSUIwQm5DSm9xZ0lmREVoTTU4U1d6SkVQR0plOWhmVkg0MnVuL01meGw5YmdTaUJ5U0lCV25BSkJER0VEQUI4UVdGQTh3TzMvYSt3SDQrcmc0UkxQWUx1bDh0Q0k4Q3NKbUpNUUFPdXdGQzlxTUk5ZzlaMEN4aFp6NjVLMHdmRkJQcXU3UEV5VmRXQU9USFZsVGNweGhYSFpMejF3MFpBNkVETGhrQ3NrUmYwc3c0ZFJZQzBQUS92VlNSQVlQbzdRQ2RqN0dxVk9TTWVCU0F6VXpNeFpjRE13TGdjS1gvemJ2NDVTUWxIWERJZ2FnSmMrYmpaQnFBV2hVb0gvWStCMkQwSjdyRmE2TFlEUm16b21zQWFPZUtxeEV2YldhY0hRQjA4SmtSSXRlU1hpU0JMWUpPTEIrWDR4cnpBelk3dmdmZDJTNFJBS2tERGdQek5FQUl4TUFTU1dGMzhXc2drdVhMeVhUUlNSQ2UvRGR1U1pNQk13ZTZPYlRkOEpCajI0QW90MDd1RE9iUFA5WHNJelVHRlBzNStKSi9NNm9UNGJ1eEh2OVg3QmVZOEtnT1dEZy9aNThHVEM5WHE1RnhUWE93OWMzQ202azVmUGNqZ2JIYmdBbHZWRzJ0SDFUM09hdm9xNkJsbmlaKzEybjV1LzJzRGJPdmFzcW9GZzh4MkxuYmNkMUdkaFNBaFhOKzdxTXJBQzRzQThzT1JKNnlId0QyOHorRnQ0ZmR2OFV5cVVEckRtQ0VCY3BaMzlrTFM2YXE5bDREMnJMYi9LWXNGVFBXZGZidmg4NnZRdTJzMUsvSyt6SWpUc1hJVlE5YTU5RWdzNFk2c1pmSUEvRWNTcC9qRVh2OEJXY0FoeGFBK1NWZ1NRQWtHQU1JQ2N3VmxOTGxxVGM5R2J2L0hBQTdNckw0K2YxVmxYd3JVcTdTdkNveUdjcnJXcEdodXVyMmZOR1l3TThZVDY3aFQzczFMYVp2cW41TUxNMGJ6bUhNbUlGU2dkRk5qL21JQmN0NjNOaEZad0V6RHNCRmdwRFBlYW5OZ0FUZkN0R3NYOVRJS3dOcmc5dHVWa2hsbmc3VEkvWUFyWDFWa1hLckVlMWwyU3luTjFSQ3NGSnNxblF2M1VJTXhod0lSalU1QUdOOVFVdGVWejNCVUF2YWh1TmdqQzNIeExBTkQ3bkJwL2NnT05YRjV3Q3o4eFVER2dDaktQYnZldmx6Y0tVSEgyYWc2Y25ZemVwWUJCOVppMkZ4REpkam9YSnYxV0RGaUxKNk1LcUtaVXpvUUZUZmoySG13VEtjVHBWV3ZjeEhLbTZrS2dvT1JBRXZWY2xQRDZOZHpMWHBNVDhJWU5QY0xWN3lKR0IyQVZoWXJBQzRTTkE1QXhLTTlyeURQRTVmczZlZVZLV0daMk0zUzNNUWZFeUpVS1Y4TDFacEpYcFZKOXBMaWxtbEF4V2tWSkhLd0loampEOVR0VlhWbTFIZE95L3BKaWFNRlJXTStibzByV2w0eU0xTjdvUGhUSmVjQzh3UmdBdHRCalFXZEJCR0VTd2dTaVYwUGI5RFJndTBUWTE5TitNMW1SS2g4bmlxRngzclJEc0xxamdsOXlhR1hUODB2Y0wxd25FMjUyUEFaQ3pBSFFDb2lxb1czeVlXRkl0NjY0ZlVwS2FSRXIxTlBha0g2WGt1T1ErWUR3eTRGTVN3Z1U4R1NSU3owVUp4M1Z4LzV2Rk5icnMvRWlMUlkrdjRBQ0lUd3c2aUpFb2RRS3dCSXlCUnY5dndoS3pVVzZ6NjZUVUdFd2hEUzNlenF1c0F5TnhuSm44eGExS1JQU0Z0czlZZkZCL1FEWmNBbTc4Q25EQlQ1VThyQ3FqZmMzeWg4R24vaEdkL01zS2YxK1F6WUo0ODkxSnllMTNpeTFjQUU5Y0RKKzZGcFlyRWtpZHhETjNPdFhSK0Z3QkdNZXpvTW14SkxPdW1BdUQ0SjRyeEpyZmRIL1hDb0xHRlZLaVVidytMQVBRcVdXYU1NTHJkNi8rSnljU0ltODV3OWxPcHQxajFNd0F3RlRpcUFXRVV4ZVlINUVObi9qSW5VVkhlTVhRL2YvalJlUHZDYTREaFR3TEhmQmM0ZnJHcXFhTkp6TFB3NmlaeFYrSFRwbEZHdlpyWFpUNDVOMzkrSFczVHVqbFp2OEQ2ZnA4SFJxOER0czlYSU9SNVl0YWtnQmdkcnJydDVRc3E4U3NkMEJoUTRITXdtVml0QVdIQVkvTGJMRFFOUURhVFZKOFE2VzRxVkI1MU9PcURaRFBWQjNUTE9CZXBXNWptcWFMYmVjM2pHZ0JHTVN4dnZlbURZa1E5R29LRjFTaFVDU0tDcUJlUXJ2bWZWWlBDMWtlQmpYY0NtdzkxMXRUSjhxNVhnT0xhUWdBK3gvT2RXQTJFR1o5OGdiamxlVEhkUUhRTisyaXdsczNuSzMvWmhqM1ZlUWhvdll6ZHhtQXJTd1FnRFJBM1FpU0NKVXJUbmpmbDRLb3pSQ1NDQ2VZbXQ5MEVvSkpiVkNrLzErRmlDd0ZaeExrNGRSZkxGaWE2eDhMYllrRDl2OWNYdExHNitPNEFZUVJmcmdQeWdWSWNxeWhUWGNXRk9KSDhmaDNyejdFS3duVUFycThtY0d3SzJNQ0MxaTdXWTdaZW5oNTZmZUhUL2pFM3lsaUU0VFpuY2Q2MzZnUEZDS1dhdkdoY1J4MkorY3ZzOU1sU3cwVHkzY0NtK2M3bjBHME1FeGRXNEJNSWJUWEU5VUN5bnZ5Q0NYK092bTRnYkJ5QS94aXNWZ0pQcFhyekxqNEVvUkpqSklacldIQXJTOWlwcksrS2NlZmdpeUIwWFZLR2pPbUNtVzl4aFJWTVVTeVJGbk5lRkdFZEkycSsvSEZYY2xrcDlXc0FiZ1RHOXdHajA4Q0k2NFd4UmsvT1REY1VBdkJIWFNMUXhjVkNETVFTV2J6disxZTdXVmJ6K2s1dzJ0SnRzYmNDWVY2V0pZN2htQXNEQTdyMVN6M09nT2dvTStLVE9KYmNqU0k1eUdJYU5FMXV1d2xBQVUvTUYrdEY1LzBzSWdoVkxkVmRNMlMwYlN6SHgyTWkrRlR4WGY4WDkyNU5DNEJ5Y0s4UXdmbWdWWDFMbGNGaXlrRU1jTDJCbmRKSjdhUWZpaktmeExHRHdBaEJ5TTdhQzVVNHF3UHpOd3VmTm5OdU9INFZaYUNQbFBvMkFhaHFGcW9QVkZjMTRnYTJtK1dFRUwwY0F6OWtkUHJPbU11OHIxby9yVHNYejdmOW9zd0ZzK2pPNkxBcWt2QzNHZ2c1Rmc2bXdXMDNDVUk2WDEyaDhseWZjejNRSHFyM0RJbDY0RGJxYVFLYzltSTg3UVhBQ0Q2dnBKcVkwRVZ4ejJDRXlDSTVlTVNHWDJlN1Z0STVKNHlUUnlaaHNjcnZ0MW5RdWl2T0FhTkxsWUVTd2N5U2dpVmJyMzdCZmQwL3UzMXlFZ2cyRlZhaVBDZVZPZ3VxQWZHb3YwaVIwUjlKQUJKMGJud2s5bk14dytmT2g1NUViZ1Joem96ckJVQTFwb2xOOUNMd29rNUhFRVVRQmpGTVFCN0QrajY1NlBXK0lySjhPL2JCQ280c0dGZEdlanFpeVlDeDNtS2U5L0p0VGlCdm1JNU9GaVRpc2c5THRKRkY3Z1pHRHJVYkhLczc5K2h5dTVoU2FVdmgxZm9GcjNyLzZ2WkpDaVhnQ0R3VlZGSjdNVm1STHNyR2x0dUZDYzY4eUZkQUNNREFmbHdSNFFNM0hQb0tnSUV4dDRnejQyU3VhUWI4aEJPRTJvWm1sdStLRmxLUjNRU3NzTUp4RFBXYmJqcGZMb0pyeEc4Q1lUOE1LR1pTVlRDeFlGVEliODRua0N4Q0lQTERpYnkzMGdYRmdoYUY0YzJSZVI0NjZVdTJmdm9GcjNyL2ZLQUVGeHZwcU1jZDl5b25Jcmt1SzVMTFY3TVZDTSsvdURKQ3lJQzJKOGEwejFpd3F5RVNnTWwxNVNhMzNRS2dtdFBFQm5wMTFtd3VYZ083MFVkNERIV3pmZ0RZQzN6QkVPazdIbEE2WEt5SFF6YjhIZ0dvQ1NRTHFzeG9ySXkxQnhpZTdXeDByRmFmK3dyOVh2MzJDKzU2LzdIYko1Vkh0UllUK0dKcnNlaEhjeWE1N1B5S0FRazYrdkJrQlpQcGpQRUV4bHdVNTlhd2czQzI0VzZLQnNDNnRxSFIrTWlkeVZHM2kzcmRBbkFzSDJUMDkzWFQrekxyMTk3TVRBODBoM1Nmc1pQMlVxcENyUFE0Nm9GMzE3VnJwZWlLWFRKOU1oTUxrZ0dkQ2FjS0cvbXVwVjl3MS92bnd5R2dDRENLV3pKZTNscXN5ekxXWldlNi9rYy9vS3pnS0g0akM3b29saGRDNGppdXpNMFdQbytjUFEyQXNYMW9iRkNUTzVKem41NjZQd2JSZWl3bmZUV2pJNEt2RG9oMWp1aCthVCtXS1NZRDNpOEFxbDJySmsrVnNWUWx5NWtrZGR2MkZ2SFQ2MWljcU83RnI3MS9Ja0xOWE9pMEZRalYwMDQ2b0J5NndaOTIyUTk1SUNxREVhTDRYV3czQ09jZjlNdzczREZCOUFxRTZ3WkFBUzhYdXpHUUlES2Yrb1ZrcXh0MDB0dEFjK1lUMFBKOXFSRlNCOHhveWU1WHUxWlZlQ1NnQ0xiWUxWTnN3b25jSHhvZUx3Q3pCR2pCTmtpLzRCWDN6OWxYZ1VDeUlJR21ob3ZhODNjUmdPNVRlOXlMZ1AzTWZtc0JTOHhzOC9VNjdlUFFPcXk5dW1CVXJ1RGNocW84c0hTZDNQTWZUNWlmbythY2s4ZUZISTZRRWNuVDVHdmRPblZkWG9mK3B0SitCVlBXY2VpYVJIQThVcy9ua0FDbzhtenFscW1XcmJGRHBwVDVBNVVJWm03Q1BBMlZnbTNRZnNFZDkwOWtLSXFCMXFKQUtDQkc4WnN0WnozeEhPQUFpd21wRElkbmcxbWFaUUFrWnpzSFo1MzdZZlFyd055eG9RK0hha3JuUzBoMW1VQTFDOTZUZEpUbU9SeWhDM29lcWR3Uk9pK0dEaGtGSTZiWU5yY05ERURlQWtYd1FpelBScG1uSXMzT2RxWlBTYVJGVWNiY2hIbGdpZTZhZ3Eya1g3RGQvK2Q4bFVKVlh1VXprOEVSbVMrMnZmZDR1dk4yVk9WNXJTd2IweTNKaGdJaDl3SmVOM1lNUUNJZ1I3OFErbkRFVllCWVpVclVwYlhGbk03Q09TZGY3TjRJUHZ0RG5UMkJZL2g4Q2hoMTBNWFFlWUdTKzdHR2phUWlBQnB1TklGaUVDbnpkV0pNSVVIY2F6THB0QzdZaXZzRjgvN0ZnTEZNcXBpUUw1VHVOYktmQS9EQzQ2cnFxQWJBd0lLV0srdGltUlVCRWlOR3NPUXN5UW0rR3BqZDRuMDQ2aGJUODRLUHVZak9tSEh5cDkyZ2NnRFMyT29JdVZJZWgveHlVa2FWd3lFV2RMcmV3SEUzdUJVRGNLSXducTQwSHBEWEwrbjNDemJhS2RndWVsNVZuRkpsMmF3YWdoTFFCVHp0ZVowY2pMcTJBMm4wTTZFUGgycEM1N1dnNDFwb0x6WnNBWk5zbzBIdzZlVlIvSjhiRjlZaldHbVZDcEdLd1FMQlJDY3JiaVN4TkxnVkF4Q0Y4WFNsOFlESEhGUFc3eGVGQlJ3di9yR3FPS1VCa09EenFnZFdQWUFNNTN2VEFTTVF1NEJ4OUorNjlPSElGK043MUYxTzFnVUIrQXNCZkZxS0MrNFdpNEJXWCtDWWdPVEFVMzZ3ZE1WTlZLa2EzTW9CV0JoUHh5aXVrbzN4a1NYOWZ2R01rcXNEbHp6SEMxTjZTUTREb0lOT2U3S2VsV1dUaGV6aU9iZUtDZEFSQXBEMUFkVm5SSDA0OGdLVUFtQUVZaTZPaDRESlY0Vm9HRFdxanE0WExiTzVvMWpCb2ltRVBoUEptd3U5RnZuVExnZGdZVHdkMnd5WGJNeVJLZW4zaTJlWFhCMjQ1RmxWWVVwVnhVcEdpTHRtR0JsclRFaFZVd1Y4ZEVrVktBcTNNSEoxdXpSYlJ4K09PZ0RXRlg2TXNYSlUvMzZsSm9Fb0EyQUt2dzgrdXdURURJQmJTdGRPczhkZERzRENlRG9tN1pkc3pCSXM2ZmNMOXJvcjJDNzVVUzlJeEpKc0VzSGRHRkJpbDR5WXVVd2tub2ZKZ0Y0WGNFVWZqcnorWDdmS280RUpKLy9Qa01PUk82RnJWalFNZUw1a0poWk1NWHpMd05aQ3QxbnpERmdZVDhjUXdwTHQ0aERPTjBpL1g3eXM1T3JBSlZlMFMvSVNnRlk3ajladm5RN0kzK2x5cXBZYUw5OENXcC9OK25Ea1pkaGk2Ylc4QW4xa1AzZlJUTEtWV2x3RjZSWkNIMkw0ekREUjBrMUlxZVROYjJPUVNZTmJPUU1XeHRNeGVxdGtZNkkrbnk5VkV6NmJ0ZmI3eGMrWFhCMjQ5QW9Ydjg1K3RJQlZnSko2bjRsZjZvVittZmpkREpOTUgwd0FWRlg5MEdNazFmNVR4bFMzRmdnaDkyRHlOMElPUnk1NjY1S0lmQ2t0c2wrSzNWc0d0cFZPV09NaXVEQ2VybFNualEyckIrbjNDK3BJQmR1bHo4d3FvbnJOUExLZ3dLYUM1QjNzNTNxaFhWcTZvRE5nNnNPaHF2cWhFcjNWMlZOTEJqbW5TU05kck9MSjF6a0F1NlZQUmpGY0Z6NGZYREo4aTQ1aEc5NEd0M0lHak9GWUE4VFRsUVovcUdIMW9QMSs4WnRsVDFNQXRISzhtUWcyNXpPWlVTQ0xJbGlXY2J3OHdmVzVMbjA0c3NxbkhYMDRldWlDazYvM2RlNjZNUHB1QVFWWkFFRmt3Mk1LRnc2YTF3RUw0K2xTQnZtQU9NaEQ4dmtPa0ZYNzdmZUxOdzE0WVQvc3NtYzRBNm9PZEhCRWt3WGxnakgyazROYWw2d0I0Zkl1WDlMelpqQW1vck5lSE1vNVRjME9ld0h3RFRVaDlIWHhmR0pzWWtBYkFBQWdBRWxFUVZTL3V2Q3BvQWNldzZ6QkJyZHlCbFF3d29EeGRMWldYTERGa0h5Rjh4R0UvZmI3eFI4WFhCeUFBVkMxb0IxOEhRWUlUKzh1R2ZQNzVTQ1VzMW82NGhlOHY0ajZjSVErSXFrUGh4ckJDSGpkakJINkFibFFrQWVZMW9uZHVrU2lFTG1zVVBwamJ5cDdYdXZEZ0FYeGROWlZ2V0NMSWZtS2c2QmJocmp1cDk4djNsVndjUUx3OGdxQTV2OXpDOWpFcnV0bHRnOGdNeERXV01CYU1Wa21BTldGeUVWNlIwdUgySTFJelc3eXBia1FPVFA1ZjJjaDlLc0Zrd3Awa1FsREFPbXh6SHBzY0d1R0FRdmk2VkQ0UmdtQWcvYjd4WlZsVDVNQVROWHdxUWM2S0d3ZjJVMnVHVjJ1emczRDR1YTdmRG5Qd1pjS2dJZHE5R2FJQlBaYjBZZEQ3aGd5SUZXTVhpSDBlUTV2WFM1SGNNa2MrKzlsejJ0OUdMQWduczdLeHhac0NrZ2R0Tjh2V0QrdllETUFVcGNqYTdsT1I5ZUxWY0lQNHRjdW9iLzNBT0hDZFcwMlZUWDYyQXBCNE12MXYyNGduUHk5SGlIMDNmSjM2NktZSFlUSHNnQkJnMXM1QXhiRzArSExaYU9wNjVpK2xuNi9ZTTVFd2RZQndHajFjbVVrRTcrOFRITE5kQUhod3JVT1h0Y3JPL3B3aEY0Y2N0Mm9ONjhCTURDZm1zSk0vbjZQRVBvWVBwOGJIM2tDa2J0amppMnRKSkE5NjJZQVdCQlBaMFdCQ3JiWXNGb09mOXBEQWlFTmsxNzlma3V2ZjluVFhld0tjQlNqc243bGRvbldiZ1FweCsyNm90YUxJd0FsZmkyUVFTSlkzWWp5NWk5ZG1zRk0vb0VETU0vWjdVZjBSaVlVQTdKK1RvTmJPUUMzZTBXQkJtOXFMYWQ2SElDRzFaSzFYQjVQb3hudU9PSWN4U1hlL09mOHhIVi9QK0Zwd040N2dLVXBZSG11U3ZlMHBLWmdDS1NxNXdxbmlXRTFXWnoveG91Qm03NEtUTXdCSTE3bFZCWHd0V1NzKzgvdkw0NUZmM3ZocGNBbnZ3b3M4ZDQ4RFpYM00yaHg5WElBbnUwSUlPMGNodTM1QU9nTEwweXVHL2pPbXdiZzAyOEcvbU56MVlXZEVUYm00STVCckZsb3YrRXREMndJbzdsK0F0ZzhEMnhZN2l3M1Y1ZGlFcU81NG1uajZYZE1BWWNVKzZnb243QTNOU08ycUZqbHlaWURrQVg2dUQ1SWFtNDRZYVVmVk5ETnhhSmNMSVBYY0dHcGZpNlBuWmRWRDF3UHNwUUJYL3dsNE9hTndONkpxZyt4d3J4c2xjVkZ1WUpibGVoa2NZWVpHUFMzTDIwQnh1ZUJjUzhud2c1SDVrWmt4NlRRU2JYRlpjQ1FLYWR4NUN6NW1QdXJBRnhyUmFhMTdwQVIyUEZDK0VsU0hLUS8wUWpRY2dDeUd5TTl2M1Nuc0RCUkpnTDZtc1dDZjZJZldlVUphYzhVRmxwWTg1MDBEY0NmdmdiNDNoaXdad3lZVmhkMkQvVlNyS0dBbUlEbkJraWFmRWNOOWNwckhnS016Z05qUzFWN3JSalJsY2V5cnFpZjZLQWtNZ1hJTSs2dEFuRGwrelNMMzZPOStVOHA5akdIUW8yODUvMlhBL0FuWGVObktBb3JEWEgvQUlMd2JTdkxFejZRbDIrY0FmLzNYY0NkdzhEa0tIQndwT3BGYkUyd2FkeklkeWgzampOUWlyWVdFd1lxKy96SndNaDhwZit4S05Td002RFpNbXpOUlJiTTJLKzJJaTZUbEZyQVdmZDVWM2kvRjdJZ1QyTEJGNUxiSWRrcXhMUFd2dHpsQUdRM1JwVTNZN0FpaXhNeExPVUIydDdwS1E4TTBxQ1RucDhIa29qSmdOcWFNRUplc1F2NEFSM0l3OERCNFFxQXMrNlNXUmlxZ0pnWTBIVkRBZEJBNEJhNHhON25kbFNGQUFqQVlYNElQTzVkQkRNQWRTMmkrSng3WFRmMWVFZFREZmdBUW5SMzRwL3dRa1Jtak5Bb0J5RFQvdWdGcGhYQW1qQUVuOHFhUFFBZ1pDczBsU2NrQ05tVmlnRWJGTXNQQkJFM0RjQlg3Z0x1YXdIN2hvQUQ3RU04RE13NDhBaEFUcmp0UXdpWG9xa1RFd1dkN0xPbmVYTkNiejZUaXEvVEluYjJNOFp6SUZyVFFiR2l5OTJvR3o3cFhsLzdqdmRBSm5iMjQ3MEliQjNUNzdTYWkraHlBUDV2b1RxVzZzS3dGQWMvVEFkYzUrM2R2Y3NUcnZQVllTSzRTUWI4eFYzKzZJYUFxU0hnMEZEVmgzaU9JRlRJRnh0aXQ5b3JMNVovTEQxUTRzK0I4T25IVnVYd2hoZGQ1RG9MR3NnQ0NKMDRxNjZYL0p1L3ZTYWVBeERQdmJkdG1kdEtEVjkwZ1ZFUElsL3h5U2t2aU9obUFFanJselNrd2o0MFNsUVpZWjM5SSs4SkJNeDhtWnJ5aE9zS3dxWUIrS3BkVlNERnZoWXdQVlI5QkQ3dXlYNFN3UlM1OW5OSStiUmNrL0R6SjA1djEyTTBuWThmQWs4aVdMNUJCNXFBU1BHUkNpOEVWanp2M21xcGtDOUFDcnJ3aEt1a0I2N0docHFSUm93UU1xQ2lZYmo4b09vSGVVV3BkWUlCQVVqOGM4V2pyanloTklKMXVuempEUGpxWGRVakpBQVA4VE1FekxZcTl1T0hJQ1FBTGUvRXdXZStRZ2RkQXFDenpEOCt2Z0lnZzBxcCs1bllqYUR6Q2dqbW5DWW9uZTBrbHFQNEpTZ3Z2Sys2TG9GUG9GTWxrUEdoKzByUFd0YTRSSFROSkpRejRNOEVBR29OVFBWVThvcFM2NENDOXpvQVdURkNoY3E3bENkY2g2czNMNEovMlFGSUVCS0ExUDltSElCbWhQaDNBaTM1NFJ5QUFtV3NSL1BSczZ2T1I4WjhGTVBTOTd5eHRJbFlnVkIvSTdqQzBySUtTZkxYRjFFRUIrQkZGalEzakNMQTQ5T1dzUlRURVB6dnpRRXdyeTdWclo1S3d6QVFBUHNzVDlqdzFkY0hnQ3JPUlFDUy9iZ24rMUhzQ1lRU3ZlYUhrenZHdjFzY2dVLzZSNTVZMVlJeGh2T20xRVpla1FXbDh3VkR4Smd3Yzg4UWlKYzZBS1gvbWVIRGF3WDl6MTZNL0VtN2JPOFEwOEdCUC9qRWtBRVZqTUJvQUZXWFVqUkEzS3ROd09CWFczRWtBWmhyQUxrdHBDNmxLdFRWNE9VN1JIQisza0hXZ3YvenJuWVpsMmtDa0Y0dUY4TUdRR2MrTXFFWVVDQTBuMXRrd3hidzRTY0hBSHI3MVE3VzQrK2M4Y3p3Y0JBbUhWQi9jN0JjZWs5YjNGdXdiZEQva2pHV2d6SmpRM3RoR21WQTNqaGZPeVUrUnhCNkZhbU9GcDhOcmhzVGdMeThDcHptNVFsVnB0QVUrNkNpTmdYQ2FJUTBCY0RZVjhiMFA0cGkzMHZmSXhENSt3NzJDOWFsaWVnVzhNSHpxcm1oL21ldUZoWWkwcEticzZEOWZzaC9uMVhGTXJZTWJQZ1VCeUNaejZKK3VFa25EQTlBb3JuV0ZSYjAxV1pFc0FDb0hoT3F5Qzd3ZGV0VDBRQUsyS3FPYjVNQ1V2UHloTEUwb1F4enFhWU5YTDV4QnZ5VlhlMTJ2QnlMQURqWEF2Z3hCdlNQR0ZHTUlqQ21KYkVXOEhmbnR4dFFteFQwY214cDlVUEFkS0FaMXVwQTZFQjdxZ0RvNm9DVXhYUnRQVlNwQXdKcG5VaHV4QXFXQ0NZSzFNQkV4WmxqWTVTOFNZcitweEFGQXVCYXloTkcyNmp3OHVzQ1FMWDBTQUFrd3djQUVuZ3lRaXphWG96aUlsaStPZTcvOWtKdk5rMUxtQk1lOUVDTzNYUkI3YVBlRjBFWUhOVlBkVDhnajAxNllCY1d0QmZCVllKdXo3bUY3VmdHWS9wTzhmNVdkUTEvN1U2N25JS05TN2owd0liRFBGWnN5TkhIWTdvZC94ZGxFSGo4Q2NDM1RnQ1dIZ0dBUFN4aVNkdDQzMTJ1LzhTUEFsOC9EbGg0cERlWlcyUEQ0SjFjOSt1eURhSURrZ0VKUUtuVGZHL044blVBbXU1SFVuTVc1QVJiUGZFdUlIeS9BQ2pSSzdGTDVwT1I0UmF4Z1RIb2ZLbDhyL1MxWldCbkFHREtlZmJuM0FGSVBSUFhCN3NGaVZRaW1LVmdHZGw1b29Od0xRMS8xVStEUUdTWFE5cjVFdnkxcTlyWmJQMWxHUURac1Bwekk4QVBIZ1hnb2Q3cVV4MTFZdEJiRnpDKy9DK0JMN1NBV3doZ2RvTGtPTlNMcXk1b0xvZ1lmdDNaSTFGN0VBQytwaHNBbmVrb2toUDRISXptbC9QdnRoUVdtUEI5TEo3anhrY1NyMTRqV2o0LzB3RmxnSkQ1ZW9EdzZmZTREekFZUEhva1doSEpaM1RGU2tuNGg3WU9TT0J3RXRpTVR2MWFZMHVrdEZZVG1JMi80M0VNUW1DdUFKbVVFMGdtVkQ4RUZkUHBkbnhoVmhxekRyOEY0Tk10WU05SmZnOThFVlRlTnU5UTJPRlpCWDd2cjl2dGdtL2xjZXpjelo2MVpOTjhEQ3ZpbFlDZFBYcU5EUXBBbGZHVEttME02QUEwUFRBeW9NU3g2NGNSZlBRSFhzbmlPVEkrZkVXREZHcCtRYjlCZXlTUkJWMmtwbDBReHhHQWxIRG1rSTU2WDZ6K0VQN1VEWVNkUmdoL0lvdXdJWjM2bEhhYkJFMEdKMHIxMFJnYi94QS90dC9qLzZhTUFmKzdSNEN4enVCWFdSR1VMd0JmSXJZNlVOZnB2TGFlN24wSStMTy9yZW9MTXFpVk1iVzM4b1Voa05rUUl6Wk83dEl3ZUdlUGNtV2xBRlRqQVlIUFZHd1h4V29MWWJsRURrTHVUVDhNRFBoWExKNGpBTHBhSkIrZ2dVNnhmZ0prblQ3SUtYSVFYaDRZMEZaQ29nK3d4aVVUd1NrWFViU01WMXJCL0EzMU9YV3VGcFBVZGEvbVJIS2kxZTZVK2hBN1pxN2wrQStVQWZEdEhnL0xycHRrUXBaNzI3Y1JXT0w5NTQyUGEzck92dU9xYWdVbHRndG1KTTA4ajQvUElMYklES3o2dzVQQUhzYnJhVG5NR2RaV0l3SXp4SWZlSzBybjU3OEozTEFWdUg4Q09EUmFoVi9GRlEvMUl1bUl2WFAxUXVkTmZ5TlQ4b1ZxY0h2aVBjQmQ0OEEwZzJSRHVvRHFIZGIyU2FsWkFkRzlkbmZEa0FFMGdYbkg1aWpXQ0RiS0NxNS9NUmlWMFFEOEhnSFE2M2pHMGhkc0xHeEEzeDlCdzFBc2xpN2hPM0J3QXBnbmcvR2p2cTAxSUhyWEo3cTNDejdFKytZemlGMnJzMVpMWis4SDlqSnNTb0VDV1hqNmlnbVI4N2FMZ2ZiR3E0R3ZiZ0x1Mmdqc0h3ZG1DRUlQU0kxaCtTa0NSanBmVUMzaU5XY3BvUnJjbnJZYnVHc1VPTUJvN1FCQ3hTVEcvaWd4VmNCSVZHUFdNMWgxSllRUG55S05FeEdaTURJSjliNjZlRUJHeFBEWTFZNW52K0dDamZHQXhEK0REcGlhd3BoQUJXWlBqd056TkxBRUlINFhDSDBNNy81YzkzYkJmSThZazJjZ1ZBZHZkVDEwaWZEa0JXQy9yOWxHSDUxTmhJc25zV0hPZlBtRVVLVDk0V2VBRzhlQU84YUFmV1BBd1ZFSElTTlFsS1FVZ2xKakpFeHFDK0g2TnE5M2tPcFVnOXN6YndMdUhhNjZRekZXa2FGaWVYeGk2aGdWSE9NQ1lHUnVKKzVWNGpZSklES0k5S2xzQXZGRHE4UURybmI4TldWUGg5RXdkRmtRNzlUbFNNSXNOME1pNXM5TW9PR25vNFU2ZjNZQXZlZkw3WTdydmRvRkx4T0FOU0E4Zjd4U2dXbWQwa0NRYm1aNm1UTEVuSjBVcVdMaFVreGxyQm42bjN3V3VHa1l1R3VrQ3N1ZkdxMmlvam5SRnBhZnNVN01EeEVySnVaaFlDc0pvc0h0V1RjQmUxb2VxK2h4aWdKZ1hCck1tVEJQbkpLTHJyK1ZFRDU0aWJIWXZab3M4c08rRE5jckhyRFg4WVZWeWdsQUt1ZDBMdE1qRlB0Tk16NlFMRFk3Vm9tTEpkNjcxQUVINFh1KzNnN25XcTI4SVN2WDU4L2hndU9CZzh2dEZRdlYvaEV6eGZxT2V2dVRmcGpyaTh2QVd6OEwzTllDZmpCYzZaWUhtQmNpdG5GZDA2cHh5YjhXNGdQbGdvbkJxZmZUdGRUZzlweWJxaVZOQnNzeVVzZFVEN2VHTzlhbW5mM3NYdHhRaXBsN1dnL3NENEE4QXdISXlaTVlreTUwVHAveGdOMk9MOHkwNTFxdzJoWHp3UkNFZFQybm1jazFSeEhHK3c1amVPOU5GUUJwUjZsZE1JTVhsRldnVm5kcUYyZFZGc0p6dU9nUndNRWxCNkRjSTZyem5lbUQwUm5id1FpU1JTM2c3Wit0VklsN1BDOWthaGlZWm02SWl6dUxpZ2xpVC9Wb1VvZytwOFA5bDN3SjdxR0VhbkI3N2szVmN6cm9VVG9XTENzQUJ1ZDR5cGFMQ1VveGY5aS85dzlBRGlJQ1VMclFSV3VJQjZ3N251WnJ3YVp3TEJHd0NsU3FTeXozQWhIYmFSR0VGR09tQzQ0RDcyVVZnalcyQzJaNGxJRjRBcmpvZE9EUWNxVUdxQXhmY3BHNG1KVnVWcWNMNXRiczJ6L3ZlVjB0WUsvbmhUQXFlc1lOSGRPNVBDSlpvcytXdXp4SEpJVml1WEZ5Snh1cE5MZzk3NlpLMmxpelVLb2RpbEdVZ3p5R2hva0Y4eXc1TWYrcVJramRqZnVEdHdra203RFRrTmFCYVEyb3gxcTNlTUQ4K0I2TzNINmVtOEt4MUNjeDlwdFdsOWlZSVVBQVdySTNJM25IZ1BkT3RzTzVlT3V4WFhCZGowVjF2T0wvc28zQ3hlZjYwdGxTcFl3dmVLZjBwQXU2b2hmZEo4azRDVXFndnI1alY2VkdUQktBTGVDQWgrVmJaTFRuaDVndTZENDRBNkg4Y1Zsa05LOTVPMVdrQnJmbjMxUjVIU3krSkN3UHBsQXhSZWdFLzJUK0Fsb0duY05tYlF5b2dVUXgvS3dCNGdIajhZV05Ud1JBT1cwRklJSW5kb3FOa1RBeHovYmQwOVhER0xCZE1NNi9wTEtpNXdoQVg2MGdDSzJ1anh6RUFxR0wycFExSmlzNUFKRUFGSHZUdWpZQUtqUmYrU0V1Z20xZDJDT1FMVS9EQXdRNDRjYUV3OEF0WnpTSVBnQXZ1S2tkcldNTTZNN3hDTUJvaUJuNFlwQ0UyTkNmeFdBQTVNRXV3dkNDRUlDd2xuaEFIVitZT1JmRHNXSkdnUHBNS3dnMWI5UXBGbnpIYkQyQksySkd1bDlzOEtrWVcxN3ZMQUxRUlRDQnB6WFpwUzRndENYWE1Ba2R1dUF5OEU3UGlqUFdwclhKNUNSMzh5Z3cxZkpEb2hoMkJsUkFncTJPZU43dVRXYzFEMEFGTnRtTDU0RVNCc0NhSmNMa0RhanhqNVpYUmlDSUdBMHdhRHdnank4c2s1K0hZK1g5cHBVYkpTQ3A2VG5GQ01Yd255MVdBRlE4clVBYzJ3VXJSTDZtWFRBZWZXbkZmbnozRnBiYWdRS0xBcUF6b1pqQUtra3BYa05PNUdDRXZPTUxGWE9ubkM0eElLT2puUUdOZFdTTStHcUhRR2Q3SlNzeFVmK0p6UUx3aFRkVjRqZTFuUXZyMU1rUEd0bGY5eVAyRHkrZ0FxWjZyUXl0ZnZkSFNEeGdMd0JGOEFtQVlqSFdsdUVEaUtHTWlxT1Z2dGVqWFRCT3VSU1lKd0RKQUFSZ1pBR1dMOU5rK0lNM1N6Z1R5ZEU0ZWVjMW5aSGJ0RGFOQWYxRHBkL1NNeDJFTkQ2a0Qwb1h0RmhCWG1jWStPWTZBRkNobktuemw3TmZkTVIzcUNBYWUyQitWVk1ZWEFTdkRzMy9YL3pISlpjQjg0dnVpcUFCRW8wUVBuaG53cVFMeVJVUm1aQlB5dG53SGRlME0xdk4ybFI2cGljb0tVTGF4SERJRWRIa1cyaVdnNC83YjV6YjdEU1FBVmQwL2dyaVYySllvamZwd1JHRVlzR0JyT0JteC9PZ1A1c0FLQU5rY2JGek5XVFJuWC9HU0dJbU1ZSC9MWWxrK2dHdmRUK2JXK1NXSCtJZzFHcUw1UWVUdFIyRVlqNUxWSGZqdy9aRHdMOHlKNlRCN1VVM1ZWb1RqVFl4WURLK0l2djdkek5BWkl4cFpTaVU4ampLZ0lXVGN5a1prQmF3REJCblFkTXI1UWVUS0k1aVdDQjA5QW1FYjcrdWNuT1EvYVRQV242d3V6eVM0dStSME9iNkNVR3FKcElEQTk3QWRxSU5iZ1JnQko2OUNHNEpwNnEvY2tqWHFCL1JLbGE0V3BrTzJPRGdIb3luaWdBMEppTHdhTmlFdDk1WVFLSjRGUkMrN2JyS3pSSDlqWmJONmlKWXVTSG05STVpT0FPaEhOSmZaa2grZ3hzQktQYkx1MytKZ2FXRGRvamhNTzVra0RXU2xOVGc0QjZNcHlJQWpmM0lnZ0pnTUQ0TUNBUmpGTVU5UUNnQXlraFNLblVDWUhCOUpCMHd5NWFUUlV4bXVwNGgrUTF1QW1EcytocFhnRkxuQjZVTE9OT241eEFDTkpxeGdoc2MzSVB4VkJHQWlRRzlhTGVpbFdVSlcxRnZWWEVOMFRLcDFDNkF0MTlUTVNDQnB6MWRIdFQvSkg3Tjl5YXhwNlFrRjczS0J4WUlyMTBuQU1wcm9CNDRxUUdUajZzalVydE9GUHRMZUZRSExFUzlBZERGcnExRTZNMTNNYXhWQ1ROQVhORlRoSXlsTGNvcjQwenh0Z0RBUEt1VndETXJPS3crU0JUYnRSMk1ORDdzWndDN1F2bTR3cUhhNFQvdUlyaGIrN24wRWdiUWRUaWpveWcrYWdXWFQ4bGxEc0FGV3IvQjhxUDFLN2JUMHB2dFZ3SGhXNit0MkMvbThzdnZabGF3aTJDS2UzN25oRnRhcGtEbklMUnFCUUErdjA0QWpNeW43OUVJa1hPL0RuenlDQndWd2VYNHd4czlCNHJSWmd5UFZGcXlrZ0RkKzVKU3BCVTVyMHZIeUh6K2pzYzN1YjBLQUJzWk1DeVFnZUV4S3lGUFZJejNsbWNNNk9mUEFHQ0FEWVBFNjdKZnM2aDdHMG8reHZpN295SzRjTFpmT2dwc1h3QzJMcTlNd3V1VkVSb25LbjRuU0pyY1huUUtjTTdkd01NWGdZY3NWeGtTZWJKZ3pPV1BxZEIxYWQyZjNncHNud0syTFhXZVI5bTNkYW5VSVYxbEJTQ1BBckJ3dHArN0RUaHVCdGk2VURXRG1XQS9EdlhrOExScHRmUHROVWxpaFlaVE9QQ2kwNEdIM3dGc253R09XNmlBczVuM0dlSkorS0xvRSs5VkRDbFE4UjZ2T1FIWWVnRFl3dVkzUzZIL2lKOGpiMTFjazBxOVFob2M5UU1XZ1BCWkp3RmJwb0ZOODhER1JXQmlxUUlnV3lKWTNsUG96YUdKMUtURVBoMzZ6cFRrSnJjWFBSRTQ0UzdnK0NuZzJEbGd5eUt3YWNsZkZvSXd2Q3d4OVpuM1ExRG1JUHgvMi9zU2FNdXVzc3p2amZYcTFaUlVFbEprS3NCRUdReVloSkNCU2tVcUFXMXRzQmRwdXhFVmFCem93WFpxZTFnOTBHMkxvdGpRZG1NaktxdEJ4UUVSZEFXVUFrVWxaTkJHa1FSTnlJQUVNQWt4cEZLcHFqZlVHM3Q5Ly9tL2MvKzczN25qUHE5dVZlcWN0ZTY2Yjdqbm5uMzIvczYvLy8zdi8vKytUejBkbUQwS3pDNERNNnZBRnBkLzBMM0doNnlURGdudkx3S3pBV0RHaUgvVGhjQzJPV0RyRXJCMXBSZ1Fpc0lRaEFhK0FFRCtIRUVZNnVOTHlyUm5aTFNsNnRTYnJnTE9lQlE0NHlpdzh6aXdmYVY0VUdiZGVnbUE1UU1UTEZscXNmbjdYZWNEVytlQW1lUEFsdFhpWG5rdVpTQmtSY200VUdYdFUydW8zeHNBWmd6Nnk1NEp6TXdEV3prZ0JPQXFNTVZCQ1NBVU9iaDhRdU4vQ2lUZ2NXQXV5V2hMMWFtdnZCYlkrVmd4Ylc0NzdwYWE3Z0lCcUNuVXJiVUJpUXVoQUtEVW90MTNJYkJsRHRpeUJFeXZ0TzVWRHh2dlZmeFcvSmtXTkZyQ2VLOE5BR3NZN0JzdktRQzRoUUNrSk5hS3kyTFJJc2c2U0ozSVFTZTFvbktLQzJDc09ZTWVOKzBEdGowT2JEc0diRnNFWm1XcDVTNzRnMklyMnVBMjJCU2NBSkdBK2RKRndQUThNTDBFVEFVQWtnRFRQcTl6ZEsvK3NNV3BQRjE5TnhZd0E0ZzNQdHNIeEFFNFNRQzZGZFNnbUdXUlJJSkxaSmxsOEVHS2pIaVgxandhTjEwSHpENEJiRDBHekM0V3JzS01XMnBOb2Jab0N1NkNMQ0RmQ1RxemdnNnNyK3dGcGhhQUtRZmdaSEt2cFJTWWc3SE41WENMMkFiQVp3UHJaR2FqNmlwcFhoZ24wa3FtVTF3b3huSGVkZzVBQVR1V0hpZzJGRTF1VlJ3b3hvWCtXY2JnODlTM0FxQ0tQT05jQ2k4b1B0VlArOSsrRzNqK29TSzJ4UkJGREVsVXhiVFMrM252YzRGcERzanhsbFhRb0pnOEZnZENRb0dKSlRUaWNMY1E2dlBMNndiZzljRE00Y0p2MjdvQXpGQTVreTkvVU9Tdm1nOG9QODZuMGRJQ0JuMjVKd2pBUldEU0FVZ0JITjZ2ZmRidjEwQWJBUmg4WDkxdkRNMnNzK052QUVDS1BWTENzSG95VWdScXJsYm5Sd0I5MzNPQmMrNERYcklDMElFbWlMbkU3NWRpOEhzeUFjanpXVVZHVWk2dUlDTXBWd3dKVk1YZGVPazNYQXhjK0huZyt2VjJlc0FZdytzV29QMzFyM2VMY0x3UUJlUVVyRUhoNEpvMmg0dkRtSlB1QXlNTEdBZUVuN3VxYmdCK0k3RGxTV0JHQ3dlMzFHYjlhTDIwa0dEYi9FR1J4WTZXVHo4ZjJ3dE04bDRwZ0wxU2dNOGVzSEN2c3V5bE1FNG5uOWNmUUx0bGRnNlRaMGtVS29yQWZpajIzdkFQQ21xcDNmY0NsNjBYRklOaWQxUGxacmY0MS9kbkFwQjZ3U1FqdXRVZklESlI4Q0dJUU93V0VIN0R5d3BLcldjOENGenFSTEhrVllyQjJqUzJGUUg1dmt1QnljWENBbElVVUFBa0NNMmlSQkE2K0FSQ2U3RGpZbVFkdUxZVGxlaVEvWFRUUzREcEkrNm5MaFpXMm56VkNFQmFNTGQrc29JR3FqRDFhbXBkdWdpWVdDcGVCS0E5YkJKQzlBY3RBazhMRVMyNlNxc2Z0SW5MWjQ0ZFFpZjRJZ2RoeW01V0xyUER5dVlILzdIVENOd0RuUGtvOExYckJjY2pRYWlvZTZCaUthZDMrUVkvTUdUSDZyUzNPQnZDblFEdUFJeXFoaURrUTlSWCsyOXlFM29uOEl3anhRUEk4emtUaUFwR1Uzb1ZrRC80ZkdEaWVBdUFkTXc1TUZRakVnZzFEWXNVa3UrYTN1STBUR0JmVjdQb3R3SHdhT0VtYkhFQVR2dURJdXRuaTZVQVFvRlJJRlJZaGZlL2RoRXc3dGJlOU9mMFNpMWc4SGtyd1JjZXZEYWp6MDdnSUo3bjA1cll5V0lwYjR5YS83dnY4UFJkRnBqL0xYRG1rUUxBbkE0akNDT2xUQlJOL3JGTUFKS2dra1ZIcEdVanlTU0JTRmVnNy9henFrOEVnYlNFcThVRFJBQ0xLRFhTeWFRN0JyLy9EY0E0TFNDdHduS2hURWtRY21BSVFodE0rVWFhamwwdVM5TmF0SVRYV3pwemZjZE5CNERwWSs2bkJnRGFDdGFuWUxONmZDajR1MWF5MFFJcXRNTC9FWUM2MXdTQTl0QUplUDZlV3NBb0R5c0ZwZzFlQjBISVFSQ0lJa1ZlQ3FRZi8wNVAzV0NCK1VQQStDUEF6dm1DYUZXREtFdVljbDF5TU4rWTJkY2txR1RlSFBFdnZXRFNOaE9BZmJlZlgwQTZyUzhDVXc4WDkwNjZiRklmZHFNSEpJRCsrREpnTEFDUXVteWMzZ3lBRVlSUktGQ0xEMWV1NU9ETEY2UXZYZWR4MHczQTFCd3d4ZEFKTFRYamQ4c2VRbkdyWjliUEZ4THlBN1dJS09ONjN0WXRDUUJOL3N2OVFQbTZCa0xwMHZsOXQvbTZpZXRSNmZieUJBNGduWHRPUndSUnBOblR0UHBXNmdXTEg4M2xLcWNPRlRFbkRpS3RvSHd5OFJORmhyZWZ5ZXp0Ym5yQmZiV2ZndHRzUCtrSXlPMzJFTEQxY0hIdklucmx2V3M2VHNuQjdxQVVsZy9zdUZ0QVdrRTU1ellRMFFwcWNBTG9OQ1hURXQ3QTNLb2FEd0dRZnFvQU9FVUJhN2ZVYktjdGx0d0NhalZieHZTaXl2b2FzTTBCYUJLd3dkS2I5Zk43TmZjcUJXR2lTV3lrV1hFUjB1bWVhY1VFb25RZ0NLUmZJZ0RGanlhNXlxOFdmc2ZzOGRZZ2l1TXhncEFnL3ZuTXp1Nm1GMHo2Wmo1QVBkdlBRZWMwVEVvc252UW9zR09oYUx1SVl2bndFWVNpdGhFNTJGMVhGQUEwcDV5aWdENG90Q3F5Z0ZLbnBIVXBMWVAwT2NLVVJZdjZNajRNTlI0MzNRaE0wZ0w2UW9uZ2F3T2crNnJsOUNzd0tvU2tFSXhQeVRzdUFQaWdDWUJtQVhWZlljVmYrbjBTUll3NmRQMVl3TmdIc2dTYWppSlA0MjlScnBXT002Y3hEaUpCNk5JTk00dzdMYlVHTVFVd0IvTTltWjNkU3krWVZHMEVvQmlEQlNUNWRkWitQa0NzQWlJbFFaRGEzTFZhdEowV1hHMlBiTDk4QUIrNG9tQjNvUC9IZ1RVaG1HZ0JmUnFXZjJUVHJVU2pFeERTUC9xV3pRRGdmQUZBV3l6Ujhya0Z0REFLWDc1am82blVndVp4WjhOQnlIYnZ2cUJRMzZUMXN3Y3NCYUJBR0dSZzQwSXIrcnQ5V1VEaFE1WkFVN0VzMmU5TEx6Z2xxSFJ4TmtiZXVXK29RUlJsczVqYU1qbkswYTllY05mMlI0TEF3TzgyOWtRQjNMVHRFWVFQVXd6UUFXZ1cwQUdvOEFRSDBsanAvVjE3cG0wS1JjRWlmR3VOT25vY08xckFDUWJLUFhoczhUdE53VnI1dWgrbjZaZjN3RGd1MjlnMkZkTXRPYzhCNlBkcEZqMDhaRnJwbHcrWkE1RlR2QVFRMC9CVDM2RlBEa1JxQlQ5SmFnN3hZbFFJdFkwZjg4ajc4c1p6Q2NLUFpsckFRZlNDSzl1dkI0aDU3N1NDb3RVaUVKOG9wcThJUUZsL1BVQlBFb0JMeGJSRTYyTFNxRzRkRkI4cjViSGNPdGlPUVNxVDVUN1JLellEZ0p4K0JVQ0NUeFpRQ3doYVFjOW9LY0VuRUJLa25qNUZzSjFMQVBvOXhvV1dQV0R5KzZJSW9xYmVhTzBWQSt6SEIwenhJUURLa24xR2d0WGlSeE1JQXgwVm4wRGIrbGt1RmpMUkN0NVdFd0Q3MVF2dTJINU9mZWtENUZhY2lRYXkvR0liRmdCWHJpd0F5R21KQURSMWNrM0R3VEUzVFE0QjBMZXR6QkpFclRZQXIyQkJTSTNIVFM4dExLQlpQby9mV1FEWnAxOTdaM3NjakdiNUJEcC9MMytuak13ZUI2QjgzR2o5d2ozYXRPc1BXaW45V2dYQ0ZsVk8vM2N0ZjRpRDhYa0JrSDVVU2xBWmxOUFpBUXFBUnI1dnh1MXlqbUgwZ2l2YlgwVVFLSTYzbzBXdW4veEh1UjhFNFZuUEs1SlFMZDRWTnR0VEJ2SzJ1b2lLT1VmL2YrR2p3TU5CaDBOTVY2SjBjME5wY1J2N21yWXYza2g4L3VIeFlwK2JWcHdMcDNSN3N0czJZem91U3EzS0dhK3E3K3g3Q280bmF6QWVyUktzVmxWMVFpdEY1OWR5eUZaYVlZMEhNdTltV0wzZ3R2WlhNYnltQklGTVoxb3YyaDBCK0xUTGlzeGdXK0VxNXVVOTJpWjcydWQ5dnZSKzRKRnA0TmprUmgyT05pME9CMS9VQkNrdkVZUmhmdU5zNE9taGhpUEtuRlFseDZhQWpNblNYSlVBQUNBQVNVUkJWUGptejF3NDFubndPNGNDSUJ2QndaZ1RBT1VIUnEzZ3lERXhENHpSR1ZZRW5wbTVMcW1RYzBNNWVzRnQ3YWNGbDBTbEhpQnh1VGtZeHhkYWloVUM0UVZYRnU1RkNVRDVRdEpsODVzakdBMHppUXhxZXUvZmVtK2h3MEYyZkxMUUd4RmxZTVJ2bzd2MVdtSVZ0cHQxREZrWHZPUjdMd0oySFNreW9abUV5cG9WVmU4cDdiNnFFTW5pZEdHL1ZsL0wyYVBPSXd1QTFwQUlRRTNEQW1GYTRqOWY3Q1BhRnBDSEt1anI1eHpaZXNHZEhxQXFLejVYK0ZMUkFsNThsZStqdWkra1RCQUxNY2daNzNDREJrcE4yLzcrYmZjV09od1V5Q0VBalFUY0FWaEtkamtQYzJSYWpld0t5dS9uMS8vcUpjQTJ1aEJNUkdYUU9jbjlVNkpJT2pYSFFxU1lPc1ZvUXAxSE5nQXZ6OHlueTgwSDVQVno5SDZScVZkODQ5V3RYUS96QTBPdzJheUdMSjQ3NEwwRzc5dnZidWx3a0ppOEJHQ2c0UzAxU0txb2ZvTnZTSUMrNXpraEZVdXBWOHJVVHBKTjA2S3BhQmtGUW01TTFIbGtBM0F5TTUvdTlabDM4enJrNmYwaVU2LzRobXNjZ0s1SVNVdENUb3d5RHFiN1V4d3NxRkpXM2ZvL3ZidUlCSkVaMVlSZ3lId1FLTmkwS0VsMU9LVENaSmR4dFBEbi8vdjhvb2FEYVZncUZ5aVREMklLZmNqWlM0Rm8rN2crSFhPUHY4NGpHNERJektmTHpRZjhLVmZJL0ZOS3JRNmg5NHRmeit2T0E5Y0dBQWJycHlsWTJTRGxWVFR0K3VDblYzL1YzYTdEUVFBeXNKQXdvYlpKZ1VYaTc4UWF5aGQ4MTJXZWlPQVp6RXlVaUFrSE1ldTVCRjVGd1pRQVdMUHdrbmtMUXk5Q3JQTXk4K2xJSFpGenZOM1QrWWJWKzhYN2M2NE9ISGl4NzRWNnpJeEIrUkowd1ErVVU5OTJ0WW9GeTNmY1hjVER4UWtvUHNDVWhGSWN6S1ZDZWdTZzVCOEEvUElMTjlad3hCU3h0aUtpVUFPaTdKVzBkTFR1c3RGOEFHYm0wLzFvM3Zqam5TR2RqK2xZbEd3ZFJPOFhOK2Mxd0FCSW9IazZrNjF5dVNDSklUcTNqRFk5VngwQnFLKyt1d0FmWDZKa0kvaE1FMFNDMUVHZ3VpUStpc3FjUVJMckY2LzBqTzJ3KzZGTW5aaHlaWXNRMVc1MHFPSGdQWDFOWG5kdE9Ec2ZnTXdIek1pbiswK1pOMFM5WU9sbE16V2ZMd0tRU1MzOTZQM2lZM2tOT0xEUE0xeTA2NUg0Z09XM3A0dVREa0I4eldkYjdGZ2JkRGhFZ0prQ1VEUnZvZ1RtZC92UHYzQlZBVUJ1dnlsTnpBQVlpNGhpc1ZRbkVIb0lxV2JscnhxbTRNeDh1amZsalQrWWpzV0JZZ0lPYzBvSlBzcTFzbENwSDcxZkt5YkpPRW9BdXVWVFJTQ25ZbG1VNlAvWjRpU0pFY2JMditZdTkvMUVBaDdKS0VYREt4cTRDaFVpS3ltUmJ3amdIZGNVV1RBUmdMWVhIU3IyTE9VK0JWN01Wd3p4d09ma09XeWJZQUdaRDVpUlQwZWRqcHhENlZoY09RNmo5NHRQNTF3ZE9IQmRNZVhhOU9xV1JjbVdYQTFYTFVJVUg2enlDd2xBczN6K1lCa2ZzMXUrVkllakpFRjNja3JqSTlUMHkvYU1BMisvdGdBZzA4VlVSS1Q4dmJLTVVnQU1JR3p6QWNPaTVIa25IUUF6OCtsK01XLzgyOUt4aHRIN3RUeitqSU1BSlBDWU1VTEFXZDZmdmkrRVk5b3VvWkJNL0t4LzRMVUJnRkxnTkM1bzE2RnJFOEpKVkpna2lGaGFRUUJ2MytkVmJNcldWc0M4VXhGUmtqamFWc1cyRHRSZE9KL3ZBeW9oVllLN0ErYlR2VGRqOEhscVRNY2FSdS9YeEhrempnTmtJT1d1RHI4am5ZWURLRHV0Z3BVaHJhMHVBbEF5Q0NVQUs4QlhjakJYZ0xDay9oMEQvaGNCeUR4RkFkQXpvRlVxVUJZUkpUVWNNV2RQUDdPTkw2aTViTFFlQUxKUlErYlQvVzdHNEF1QU9YcS9sc0dkY1JnQVkrZ2xMa1ljbEpWVHNhNnB0Q1gzdVFqQUtJTlFzdEZyQVpLSXdXeFFJaElKdW92Qi9OeCtyMkx6RkN3bGo4WTBldmwvTVlrMGtpZVZ0Y3Zyd0dVbkhRQ1ZqalZrUGwzbUl0UXNJUHVFbHg5Rzc5ZE96RGdNZ0drQVdsTnlCSm44eEtwckJSQyt6Z0VvNExXUmdjZFZjT0NqamxOdm14ODREcnpOQWFoYUZaV0x5Z0tXeFVOaWJJaFRjUEQ5Qk1MTGE2NWJ6cmVBTVNHVm9YdkovQ2doMVdVZk8rWFRaUzVDRFlEczlHSDFmbk9ySURjQWtBQlRURENDTFlLMEN3aS81ODZXY0tKVWlFcEM4Q0NCWURzaWlTcGxxVUlVbU9qZitvMnRJaUtWVUpiZ1U1dVNXbDREV3dYNCtQY1huclFBVEJOUys4eW55MXlFb3BkY2F5KzkzMHk1WWhnQWcrOW4yT29VZUk1VGRRZXIrMzJmZGhtR29PQlphbkJvK2cxeUVLVTRkWWdGU3ZxQi8vdlpCSUJ0OVJzaGtUYlc4WlpaMmhVZ3ZETDNpVTN1dXg0TFNCTTBaRDdkUFJuVEgwOFZBSWZWKzJYQU91Y1FBTXVWY0tmRlNELytJQUFCc0VvR3dZQW9IWklLRUVZeFJJSHdMUzhwVXVoakZWczYvWlpoSVZXeXhWS0JCSVJYbmJRQVRCTlMrOHluSTR0QnprRUFDditjaGxVVklLRS81Y1JHc1dtbEtmSXp1ZGMzQVBMUVNsZzNFMk9DeVZSYzFrcFUzRGdCbUtvUXNXdGxCY3N3alB1K25mVFl0QkwrR1FkZ09mMTZHQ1pXNnBYbEJDcVdTZ3FKeXBvT0FGZlhYRGlmYndGSkx2aTVIQWpsblVzaUllNkFqT3A0aVFOUUhSbFQyUGxnSkNVYmJjMnMrdi9oRndGYi9xN2dtNkhsWXBCYm1UVjJzc2NReXkvcUZCajJ2MC9jQWR6L0hHRDdOREExQVV5T09VKzFDd1dPZXdOaktqNi9PMDNGMS9XdXVnVzQvWEpnZkJvWW13REdkSDdJeEI1a0xQSUIrSThBZk53WmdnYTVjazJmSmJFbThWOXpOV1BmcmFzYmdNdVBBY3VzZUo4RXhzYjlGZEJoQSs3Z2FRTktCNlRmY2dDWXVnK1lKVCtnODlhb0JETW1JTVNjUDEydVRLajEzdUR2OHpzS2lnL3VKMXVRT3Nub2ptM3FCNVA1QUNSQkgzT2hQdXp6Uk45RFY4OEhxUUxFV1BKbnZUeTVubS90LzFzNEJjdVNwUlp0R0F1NGZpK3d0QlZZRXljY3JZd242aEY4L0ZrSnA5Ykt4QUtWRnNuL2Q4dXJnYkhQQTlOUE9FT1dsNCsyY2ZvRkhoZlZySlRaUEtIU2o1ZGFPdHVwNkp5Q3BQeDhySFdSVlE3V09scllDTXg4QUhJemx4a0FMUEQ5YzBWQit4L0EzRS8rRTJmVVlIWGRGN0tUR3dkdlRkMEFIUDlyNFBnV1lHMEtXQmRmc0Jkc01QZlByS0tzb0w5WEFWTEF2TzJmRnlsQ0U0Y0tsaXlyRFZaTmNHUzFDcUVZaFdGaUFaVitYbnRhVVJkVExtcENFYnBjaFRZTHFpNk5ya01Dekx6dDVYYzRId3lKbW1rSitaNzNqUU9oNE5XZURVWmlLMUswOGYwRVh0N0NNSFZhd0lrN2dhVnBZSlVBOUxJMUFvOGJ6S1gxY3l0b0Z0RmZwZENJV3o3cmd6SGd0aDh1MG9QR0R3RVRjOENFTXlTVXpGYWlrZ3RscFcxVGE4SnFOYmE3bFZsalNSZ1crUTZaUC81N1dRdmo2ZnlkQmpYZkFqS2JnRXZNTHdXQ3ZoTm9pcGdOcG5Rc2hsUzRJR0ZXeklrNnlsV3dBejkzRVRMeEdXQjVDbGlkTEFCb0lPUzdwbUdmRyszM1lBRzVtTkQwRzhGNDY3OHZraVBKY3pOT0FDNFV5UW0yTjh3OTRraXJGbGZJQWw3aTQwMmQ2ZGJQV1dBdHJzak9GaXVDdkFKWk9RRTBwSFRGc2NrSFlEZUN2aE5naXBRTnhvQXo4LzhJUHI1bmJ2SDJqZCs2QVRoSkFFNEFxd1RkWktFQkxEb0RnVTQrWVZrUEhJQm9Qd2FyZU90L0JrRGV4c01GQUZuYnpOSlltMElEblZ3YnQ0dXl1cjFrd0w3VHAraVpNLzA4V1Q5UmM3REhVbXVZVHIveCs2bzRvdnZ1OWZqQmJnUjlKeUErb213d3h2Wkk1VUxnNlpXN3k5RlBmOVFOd0ttL0NnQ2NLQUJvdmg4QnlWeS9VQ3RKcTJmK1gxeVlKUEdVMjdsSVpMYnVFV0RzV0JIZXNaZUR6NGlVUkxVV2ExVEU0N0xxSzEyZlptZDNPWGlkRmN0cW05MkthdFZzMWpBRXNOdjZzZHltYWEyZzgreFVMNEkrUG4yYmVDZ2JMR1dISS9oOEczb1RyNDVpSzg2UE9sYkJVOXlLSS9BY2ZMUitvdVF3SDlCZm1tYkxsVEhib09uWi9UOSs1dmFmOEZVYUFUaFhzRk9RNDVtVWNnWkNXVEF4ZTBVUSt1cllNTzEvMzdHdHhRbW9MQ0J0UlNwMzBMckRwMlNGZHpZTWdrL1IrVk53dndSOW13UURzYXNwR1NmSmdZRFlOVGJwOHBzQ1FGSnhFSUJrUWpEcnh0OGRYQ1VJWStDT0g1TVZGUGk4U09uMm4vUVlMWjlHcDBjeEFOSVA1SXZBa3pWenhpdlJ5ZG5LTnpCYThmZGRNODRiNkFGeUFyaU1GMnBhams5a1lJZW9DbFhtQTNBUWdyNU5RRUhNQnFNVkZNTmFJT2F5TlJML3ZobEgzUlp3bWhiUVFVY0Fhc3JWVkd6NEV0akN1LzNkZmIvSUQzUGJUN3VLQVovTWhjSUMwdnFSVG80VzBJQklFQW1FdEZ3Q1lxalcwM2JjbWR3Qlllb1dnZXRVYnJSOHNucmxvaVIyZHJwQUNmK3JENEQ5RXZUVmpJSnU3SEJWKzc4MVg3NTJDemo5bHdVWmtURWdjUG9OUHA1TnY0b0JSaENHNmRkKzFEa016MUpJaFIxQkFISjd6d3FPM2ZJUlJNNXRtREs1Q29RS3NTZ09lQllCS0ZaVUxUcWNCOXI2Tmk1S1ltZDNXS0RVQTBCbGhOTE04RWJUMVFCWEJVNzJhSTVaalVjVk94ejdXTGtROGQzN3ZzYXJ0L3VBNlJjUHN4TlNBdEFYSERZTkMxQUVwZjlzMDFrS3d1QndHVTdIZ1Z0LzFqdEQxZTYwZmdRaWdTZS9qNWJRcCtLWXBHQitINjJqVDdQOC9aeXBCSUM4RGhjeDhlWTl3RjAxNWFiaG1ub0F5SjVXU3JLZU5nS085U0h4blQvTFNhc0pCaW01bFJqV0JFSVZlUk9JbktMMXF1bnliUmF3TGdBU2RFeTc0cWphTk56SkNncUVFWXpCR3ZLMDI5N21BRlNIRUlCNmViS0RnYzhKMWtzbVY4dDI5ZjFlbjZMNXY2Y3hJSzVpSzZYbmUvNWpDVGlGY1RxVm4vci90V0RQV3dYbkVQVFZnSUtVSFU3bGpBU2F3S2VmSXdEcE1kUnhSQit3RmdEK1JSRURKQUJwd1N6ejJjMExmeGN6VmprVkt3YVlndEJCZXp1M1N2WDA4ZDM5UDV1TzNRS2FoWE1RY2lvdXJaUkFHS1pXYXIvWVoxeFhSUGU4d1FyMkFVSzdUdmJPVlRaQlh4NE1CRUNSbkNvblVCU0ZFWFQ2bWYvVEsrL3FtekFGLzBVQk9QcUJaWUY1MkhyVEZDdzJMSDVHOFVDekpFa281blpxbVJuUGgvdUNYbXBuVnBEVHNJUFB3S0FwT2FTQTJRTERMU0hmOTdpUHgwdHBJU0xmejdibDRpRmZzVXNuaitIWldFZU9ZRENEbkRtQ3Zaa0VnZWRjQ2p4R3NlSWhCWXQzdngwNDlId01MUmg4Z0E5Z2gyTW9IOUFCcUtKenhmME1jTzdYbFNBVTRIemhZWUZxKzVEN2h3QnUvOThPUUxsSUJDS25XMzlTbFhOWStucWVpcTJka1FnK2duR1BiOS9acFQwbHE2TVY1RDk2Z0xDd2dEbUN3YmRuQ3ZabUNnWS9keHk0N3h4ZzVTV3VVamlnWVBIRmJ3QStmeUd3ZnIyclhyTXZQQit2cDNMM0dIQ2dpOUpPSFFDa1JWUHBwZVVCaWdYTEZ5bXllallUQjRZc2dmQTIwb2ZSQWxZQjBGZkFsdlFxUDAvVHNYNVBMT0I1RE51NDcxY21Jd2lCYVJ3dy9GMDFKK216MnBxQ2h4VU1adnBKbG1CdjNpVG9jc1c0ZHpld2Zoa0dGaXgrMmZlYlhEQWVKTy9ZRUlMQkI3cFUxZzhMUUZvOThRQVNWR1lOUTZEWmZFRzNmbkVxcmdMaGJmL0hWMTVhbmJrRk5Ddm9oV1NsOVhQUTJYVE0vMnMzSTREd1BJWndCRURmZ2l0SDBFazZONngrdS9pRDdUNGcvWWRCQllQcFdIRWFIbHF3TncrQVFhNFlqNTRKckpPK2FRREI0cHQrb0NBeVl2T1BFSVFEQ2dZZmVGLzlVM0FiQU1YN0l0QWxWdEFzcEtaZHo1U09sdkEycHN0eGpFUzN3Sis5Mk5nQUdLMmd3aTc4UW9WZkVoQmVRQUNxTk5QMVJkb0ExOGtLZGdEaHhrVUkvektJWURDbnF5ekIzandBSm5MRk9FSVc3UUVFaTEvMVkyMXl3VmdsQ0FjUURENS9FZmo3TTRDVnJaNUFLbGtoeGVRVWF4Qkk0bnZGenhmOElmQ1ZDNEhWN2NDNlpFWDVuZW4zVlgxdkFHTFpxOHlzcnZIWStRQndiR2ZJMkU2SnBMdmRYK2tzdGhwVXZRcm1YL3NWREdaVlVKWmdiMTd2SkhMRmVHUWNtQ2RWYjUrQ3hkLzV4alo2UXp6TUxPUUJCSU9mVFYyUHM0SEZIUTdDTFFVUW1VclYwcmdLSk1zQ2pzeEdBcVRuL2h6dzBFWEE0dG5BeWc1Z2JUWUJvcktrVXlMbmtCOVlWaFR4dStrVDEzaWNjd3R3ZEJld1BBdXMrYjJhcjl4SkFhZnFmZ01RTzRkaCtKOStCSGU1Z3FaWlp6WW9rMUpKVWNwYVI2YnA5M1ArVy9ONnAwS3VHSWVtZ0VXS2dQUWhXUHhkUDdOQkxoaUhLWUhVcDJEd3BaOHJMT0Q4dG1KUVZwbE9MeEFxbWJSS0M2RURZQzcvQ2VDUlBjQ3gzY0RTcnNJU3JzMDRDUG05QXJaazU1VXZLQXNwWUxxUGFQZFI0L0gwZzhEUkhjRHlWci9YNlZhYkxIazJQaGpwUFZaWTdkNXh3RjZDd1M5eS80TGJiVnlRc0VLSXVmR2lLZTBwMkp2WE94M2tpbkYwR2poT1FZK29OUnRsamppOVRRUGYvZk9WOUlaWTRHcTREOEhneS80VytPbzJZRzViVVV5MDR2VWNMQ3FTSlZSV3N6SmJOZ3hTbU1hdStxL0FvMmNCUjg4RWp0T3FiZ05XV2FUa0lGejNZaVdyRjRuQWp0TjBuQlpySm5VKy84UEEzQ3h3Zk1ZQjZMVXJhM29nbEwwdHBzNndsVmhhNXJMaXFkOUFkRGZCNEplNlUwcy8wQlhURFloODBTcjJGT3pOQTJBWHVXSXN6QUJMMUphS1dxMVIrbndHZU0xN09zb0ZZNVhUVncvQjRDditEamcwQzh4dkxZcUpDRUN6Z3N4bVpscTlUOGUwWEdVeWFVaXphdlB0eG9Gci96dncyQm5BMFozQThlMkZWVjN4NmM0c3F3T2Jja2V5aGlYQW93VVNBRGhEMVhoY2VETXd4MzdsdlU0WHhWTjJuM3JKSW9jeWdrci9WYnM3ZmUrRWRCTGNmYVhYUTNJUFdJcnBCQjZYbG53cFI3NmpZRzllNy9TUUt6YXJ4TTdxSkZqOG1nOFVhck1WOUlaNGd2TkREOEhnS3g4SERzOEE4ek1GQUZuUFlRUERsMENvMmc0ZnBEWkxxS0N4VDAvN2ZoSjRmQ2R3YkZ2aFJpd1JnSnJ1Q093VWdDcGVDdlVqWm1FRnhoZms5Vzk2OWtXL0I4eHZLUXFuVmdnK0I2Q0IwTXNJN1A3MEFIZ21kMm4xTlEwcnY3RnZBTElsVllLNzNNblFDRExUaFNHWm9EcHVQN3VDZXVYNW44enJvQjV5eFRoR25RMENneUJNeFk2M0FxLzVhQkhHNkVCdmlEbE9MVjBFZzErMEFCeVpMZ2JsK0hSeG5aWEpvcXF0dEE0T0RvdmxKWlZ1U2pUUUZ0cStOd05QYkhNQXpyYW1kVnBWczZ3RW9QdGROZzM3d0pmdnNZaUpQOU5GcXZIWSs3dkF3alN3eEFlTnhWTzhUNmFOVlJSUmxUNmhIckowT3ZhdzBXREpDS25nN2c4NkFQdk5COXdnMkp2WE8zM0lGV09CZ244RUlmMm5STEQ0dGJlMStBVTd5QVdiWmVza0dId1ZkZDJtZ0FVQ2NOS25KZ0xRclovVjkvSm5uNUpVWW1uQUUzaENtdjMrdDhBV1FmU3p5UEsvUE9PZ0pnRGRzZ3FBNW5mSkF2TGRMVitiejBrSzRScVBaM3dRV0p4eUFQcURWaFpReVFyN2d5YVhJOWF4V0NGVkFHTHZSVWhWNDZQZ0xuVVdCczBIYkJQc3pldWRQdVdLc1RSWkFKRFRvOGw4dWkvNDJqdUw1dmVRQzdacHNFb3crT3JaUWxxVlZ1SDRGTEE4V1Z5REFPVEFtSFVRQ0FXUWtPbHNRQXdEdC85L0FFOFNnUFFwTmEwNytBaEFBNkhMWGJiNVhyNElhQU1mdi9lR3ZQNU56eVlBN1VHakJXVFdqaDQwdjlmU3lzY0hMdGF4aEpXeEZWc05OQVhIMWtodzk4MytEWVBtQTVhQ3ZYa2ROSUJjY2VtZmNlb29BZmhBQWNBKzZBMnhMdUFHdWN4cnpnS09NZXhEZlY5T3diUzJCQi9CRW9xTFNyQm9ZR2dKM0U4cUxjSUVzUC9uZ0NQdVV5N1MxM0wzd2I2UFU1Ni9tL1hqNFBzMFRLQ1hRQTZBWHVOZVpZM0hNejVRQU5BZU5EMWt3Y0tYbGo2d09aUStiN1IrUGkwUEQwRGVGQWZrNTkwQ0tnOHFuY2ZvRnpJUlZXVnFmRmZCaGduMjV2WE9BSExGV0NEYnZQc3RCc0paNExVUHQramRlc2dGZytxVnB0V3ExMWJnMmd0Z2Z1TGlSQUFnUWVnK29FbXNPdWpzWGI1U3NBb0NJTi8zdngwNE9sTk02WXYwdGR4MU1Ldks3L1RGalZtZUNENEhRUVFoZjE1OWVWNy9wbWMva3dDY0tBQm9lWXZSMG9lcHQ3U0VvWlEwVHIxbFB1UFFGbEF0TzBueUFjV2hwencvRlNqRnpHakx4K1JHdnh6b1NlQzFod3NBOWtsdmFGTjVGQXkrOW1KZ25oYVEwcXFhZ2dsQURvNGM5QWhDRHBKUGw1Wm9tbVE4NzM4SGNHdzZBSkJXMVZlY1p2MGNlUHdPWTAvd2wxbEFEL1dVQ3gwbU1sRExyOGJqbWIrRHdwM3g0bmtEWWJEMHRoSU81YU50Zm1EaS94R0VlUmF3eGhzN1ZiL3EyaHVBQlFKd0FsaHl5MmNDMHhvZ2dqQUFVQ1dXQWtrc09pSVk5NzhUbU9PcWVxcXdxQXgzV0doSEswNm43VER3T2NBVi9paXBQQUtqd2dyWm0ybzhua1VBMGdLbUFIVHJwK285TVRyRVl2cTQ0bzlwWklPdGdtdThtYWZDVjcyWUFLVC9Sd0F5NU9QT3VWbEFBazlPdWxlNnhRUlRXVUtsV3RrVS9JdkFIQUh0aTVvSXdESzg0MVpQRnRDbWRyMFU4UGFDOWhWdWx0ZDRDSUM4UDJadHQvbTUvcUMxMVRKWGxKREdHcGZHQW1ZT0RnRm9DeEFDa0xwdVdoM0tDZ3FFOGdOVlpLNEt0eGdqSkFCLzJYMUtyYW8xcmZON0NXWmYzTFNCVDR1QUVJeVdCVnBpcEw3R2d3QTBBVzI1R2JHRU5CVFJ4M3JtMU0ydzM5bW1yRlZ3alRkMUtuK1ZBWkFMRUU1THRJRHlNV1VCdmJMTkxHSGdkNUgvVjA3QkRwN3IzdVUrSmFkZ24zcHR4ZWtBNU1CcmkwL1dwNHd6QmpEYkNua01XTXFWcEU4R0p3TFFxdmZjMHBxYmtWajVhTms3Z2JDeGdKbm8zMGNBam50b3d0WE5hWjFzdXZTS05oc1lUY1ZLbXc5RjV4R0UrOTRkZkVvUCtKWWhELzhPQzhlSVBVc1VIb2tWVktCNzhYc3piekFGNFB2ZC8vUENLVkdJcE9Bcjc4bW40RFpPbThZQzFqY28rdzZFRlRERFBKcWVDRUJaQmE1R2ZmVmJobVE4RHRaVzVUWU92UGhYaXAwR1R1dTIybFRNTFN3K2FBVmw5UWhFV2p1ckkvYVFpTEprVE1Mc1g5UjNyL3ltWjczZnAxKzM3T1U5aHVuWFNrZGw3VDNRcmhLQ3RsQ001OWsyaTVDTU1TSUFHZHF4RUl3cm1wdHpUc0NFdXQ1eWlsS29KTEFjeENxM2ZlOHRMQ0RCRndPK3RLanl1eFNDTWRZRVhvZURySGNIdnUwdFR3THptd0hBNE4vR2g2ek5DcXFlT1N4QzJsYjh0UVNpTXdidXFYSXFBY2pGaDJKakJLR0p5U2hRRzZ5Z1ZiZkplZ1VMV0JZY01SM3J2YjZvQ1JhUXdGUGdsMU01clI3L0p0QlpPSVpXeC8wK3M0UWVZNXovMS9YMnRGbkF4UHBGRUxhVmtkTE44TVdHVnI0cENCc2ZNSE44Ym1US2ZDalowTmNwNDU2L3g1OHpMemZ3NlFmM0FCZDhwVWdFWW1xazViR3llazA2SVFsMWJrWFNjbmxOL3U4TDI0R2R4MXFWcTkxS1F2cnBnd2FBQXc5cCt3blhQdzFZanlXTUd0RG8yQVNPRkdNVTdTSUVVemRZRDM0dk1QbVh3TGJIZ2RrRllBdGxHaWltNkRweEp0dnE5THRsVnIvYVdLRUI4cFVYQU9PUEFGUHp3QlRaOXIwNHZkUTlUczRwQVozY2QreUh4Z2ZNQU9IK3ZjQTY5LzlVeGlqbXovQWVyWXBkYXIxbE5TTVl6Vit2V1kvMzRJOERZNThHcGg4QnBvOEEwNHZBRkVGSWtuSUhvaEdWUjYyUWhGUlNZalFFNnFGcmkyejNpYVBBaEhOTmx4S3dBckkwUTFJQXh3ZlJlYWNiQzVnQlBwNjYvNUlDZ0xLQ3RxbnNyS0tsckZaVUZQS09yN29zTVR0ZHN4enFRUlo5M1ExTVBBUk1QbGxvaFV4UnFrRUs2Z1NoT1AwUytkWTJobFJ2OTl5K292Umk3SWlUblR2THFtZzZ4RFBZcHFBVWdSZ3NvUjdNeGdKbWdIRC9jNEUxRlh1N0ZSUmJ2RWdkN2V2WFdsYlBwcDlFZ1VqaUpwd2U2endPTWx2cEFXQ01WdXNKWVBJWU1PbFNEWlJwb0dpTnhLemJkSVFsWE9OTVdKYkd0dzRzdmRnejNFbDQ3bnpUUnZQcnJLcHRBSlQ2WnJ6ZmludHZBSmd4NHZzdmRRdklYSzVWWUYzc1VaeG1KVXZnQTFGT3Z3RjhzcEt5QnRNMXk2RWVwSTRMcVZNZWRiRWFUcDBFSUtkUEtoNUZxWVlxU3hnbzJqZ0ZyMTNqNlhYSG5PaVNaT2VCVlN2eUM4cUMycjA1RlZ2Vnc5Y0FNQU9BMTc4QVdQTXAyTEphYWVraUNQWEV4d0h3NjYwbjFvQi9uaUdRYXp3T2trU2VwYkovNzJJMXg0Q0orY0o2bFlJMXJpY2NyVmljVXVWU21JVzgycGt3bkhIVk9LYkZzT296UUdrRmt3ZXduQkVTMzdBQllNYUFYMzlaQVVDQ2I4Mm5JbG8rNDBwMmdObnZzb0t1bnhIMXhHd0EvTE96ZFFPUUpQSXVIelYyR0JnN0NvdzdBSTBsMzNYZmpPc3Y2b1ZvZGVzNklTYkJzQVpNWCtrSnhVNTZLWTdwa21GVmhPY2l1dlR6U3QwNXYwK3J5dVQvOWdEclpOZTR3UE1zSTdWSlAzR2NQN2dVT09kdmdMMXJSWUowWkk1SVYzaFY0L3dyR1lQUFUzL0FpUmhZdXN5Mks3bVU5OTlQK3o5ME9iRDdMdUJaSzBYZGtlcTlOU1gyK280SEx3Zldsb3BGQ0MwZmdjaUJNdEFGQzhDR3JZWFZvVmpuVTJHN3JUWHJ6aDRrZlJ6TFkxa3lHd0JvZWlHY1BpWGI1ZUF6ZFhXbmF6UENTU2NiNGozeGZtYXY4Q3gycDUwbEFNVzBWWElOaXRDb2dsMnI5SDJkY2N0V3dReFFzbjZaVEJiTU50Y2dkS0liaVpqNTFWY0JrMzhDWFB4b1FjZkNVZzhwamNZZ1pTY3cvbW9tQUNuWHlyNGxlQmhzNVFhQlRIcGY3WDhkTVBZSllPOFhnQXY5ZThRSmxBWlpxOEQ0eFN1QU5ZS1BKUW4wQVIyQUhLeTFNQUNLZTluZkZJNklFcWR1RVdvSElKOXdsc1ZLTGVrb01DYTlFQWVnU1RZUWVNNFRYY28yU0VNa0FIRWJCWm9qNGJiWXRkeUNWckZxR1hnVFN4Z1hZVFplSExpOUFNakVRUkNWVVhQL240S1VhYVQ4dlZUaStSdGc3R1BBdVljQVdsTUNnVVZrUWZKMlExMnlCdlBYTXdISW1oRFd3ZjgxaW1zVGlMU0V2SFprcitqWS9wOUNRUkQ0cDhET0J3dGVJdGFpMDVxbjMxRkZkZkxsRnhZV2dDRFVJa1Jrai9UeGJDRWkvODlqZlBaM1gyVnFZU0pRYm1VTlFZM0hRVDdoYnYyc0xvZXJWd0tRSE5FRW9Dc204UjRNaFBSalhVR3pWRUlLSW9ZN3lhRVl1WTRkZ0diNVJYcnVvU2d0U0NMTGFya0lDUTlmNlFOeWtHakZkanNJQmFJNGtHbHQ4VytSZzVnMEhKOHFBcDQ3bmloQXpGcHVXdFBJTUJaSmxBU0lMdlI2ZlEwRENWYkpDa0pPSkNxbms0cEdwYjk5dFo4TW9weWlLRFg3V1dEaXdZS1hpRVFPZWhDcmdLaCtlSlErRVFIbzFMYnkvelJseWY4VEliZjlYUzVmdEliOEk5Mll1Z0g0YXkycEx1c29ybDdkQW9vbld0TXdRU1RkT0Z1UVNMVEdIeUlDOGt4U0lRdUE0aHdVMldVQW9PNC9nckJjRGJzZldFbFN6ZytKQ29ZRG9FR00xaXhTa0h6Z0Yvd0c3eThzSWEzSjdKUEFHV3VGSlNRSWFVMDFpSkhVaVlQNGUzM0JyUE9IbUcvSk1hT2ZUWlZZUmh3R2F2ODd2V0tQSjkvclNINElPR081c0lUcWcvZ2d4WHM0VE9hQkFFQ2Jlb09zZ2ZsK0RyUVNoRnFjRUloeXl0ME1iTXVzRWt4NzZpQVpYS004QnZYaVpBR2xGK0thSWJhYWRZcGVtNGFEZ3BKWlF6NllKQUJWNVZjSEFKWjB2NEZ4WDZLRzVVcFlzMEtucWpoUnVhZ0VWZ1BnbFlBbDljaUhmOG1kVXJKaDBReDl2a0RCekJ5d2Zia1lRSUd3YWhBL2tnbEFUc0hzRHpLQTBCQVRpUHlaNE5FRHdJZW9hL3VGWUtLWEwyZjI0blFvSWdkOVIzeVFDTVRGcXdJQWZkQldJNyt5QjVaTEVDWUxFVGQ4NVlKbCsyWUFVTm9zTEllbC94WWx1NEpzbDZiaE5oRDZpdDRXSkN2QTJaYzRHeG83M1JjZ0plT3FGbUdSNnJjQ2hMWUFDeUdvam1FWWRqNTlLblordElRUmhIOUl2V0EyaGlSRWpEZVJJOUNseTdmTUYzRXRXUkZhd2hRSWY1SUp3RTU2d2RUSVlkdDd0cDl5czFLOEpub0p2b2Q5V242ODJQTmtQNGhVeTFuZFdnc3RBdEJETUxZTjUvNlBBYzVER05vRjRTclpmTis0K0loVDhqcXdnMkNwOFRoSUo1dmZTV0JYQVZDcldOOVNNeERLK3NrYU92aG9BYzhtZTY1NHBtVUIzZjB3eXQrRThGeVJBR21QbE9Fb2lTRDJxZ3ZtQUtvT201MmZBdWlUREhTeUlSeHgrbEkwUXh4QUR1YmZGNXZmZk1tU2FqcldsUDdubVozZFN5KzRyL1p6QVVFSG5ROFI3MEhzWGxLK1BnSnNXNjhHNFhZR1pqMEVZMkVZQVRDQVQ2dEFobUUwRFhjQzRmYWFwY3dNZ0FJZkxiMGt1elQ5UW13NXV3QUFJQUJKUkVGVVNpK0VmZUFMa1NycEJvdmJyUURua204d0FvOC9FM2krQ0NzWjk4TkNwQXA4Y1Vla1p5QmF2STRFVC9UbmFBay9SUUN5QVh5NnVOU1BBMGkrd01lQjZlUEE1SEZnWnEyd3BOR0szRlVEQUhtdjNmU0NlN2FmWDhDQjRVTkVFT29sVmkvM29iYXN0TndKOWNPNUJPQktFUU1zQWNpZkhXelJBaWdXV0FsQ241SzJiUVlBT2UxS01qVElSMmtSVWhLVlM3SXJMaWEwdiszeHdITVpNQ2JZTlAwS2ZHNzl6QXFLNUR4T3Z5RXVXdTZWRDVLU0h5MllBRVFBZnBhUmRsNVVrdVVjdElwQm5DSUlsNHBzRDAzRnRJSVAxQURBbEJ1Sk00N0VxcVVYM0xYOWtTQlFjdXV5ZnRLNzh4VWtIeVErUkxxSFozRnYxS2NnTGo1a0FRMXMwUW82SUExbkhoTkxRekE4Wnh2Qlh1Tng4RGNTNVVZcE5ub1l4c0NuVUlxdlpvMEYzd1BUTWE3SHY1M0hPSlZiUy9sKzVidW1YN2QrNVdMRTQ0aHhJUkpCMk5NQ3FqOWl4d3VFOTBzdldDYUlBNmJBcDk1OUVLZVdDaEF5QTBQVE9WMnVuR01RdmVDTzdiZnFIYmNTNHJKUjdFd3FudzVBV2hMdUltZzJ1RlFBWEFWczhSR21udFc0K2cyaEIzUDc5TC9FSjl6R3ZxcnhPUGliaVZpaEFPZ3JXUU9mL0VCZkJjc1BOQkJxVzlIdjZ6ekdxRnptb1h6M0I5QWVQZ1hpcTZiZ2l2NFlPQjlRSFM4QWZwa0FGTU1qcldBY1FBMGlPOVhKaVF5QW5vczJ2VjdFU0hPT1FmV0NPN1pmN0Y0MG1aRlFTY1JLQVlCYVNVNnZBVmNUZ043eFhIaVVGcERUTUsyZEZoNTY5MTJCVGlEY3Zwa0FUSVh6Q0w0ZzNXWFRaNGpwR2Zqb0Yvb2loTCtmeCsweVdVQUJMd0l3dFlLS0lhYmdDekhRdmkyZ2dCS24wTWNFUURhS1Q1Y0drSU9vNlN1eVl6RWZqUUIwRU01blpnQVBveGU4b2Yzc2dTcUNRTTNqa2RGTHZwUnZSMTMrN1VWUnVoVUZTYXZOTzZvdHdwODhaWjMrdDRNNkhMdGNoNk9UOUFHL3E5Y210Zi8vZ1YxSkRZY25RMnpZNi9ZYWtmU3JVK1BnMU00NU5xUHQzSUV0b003V0ZIb2t5cldLa29vZ2xDTVdMWWppVVhNdEszZzhVemQxV0wzZ0RlM3ZSUkNvVUVZQ3dHdFlGeHhxZ0EyRS9qSTIwRjVoaG1Rb2Q5OEJITm5seE9UaWcxYUdpRGFuTzIxeVY0RHlnV3VCOFllQjZmbkM5V0V0aUtWVktlRTBaR2lYV2N6ZUpvV01JaWc1YTlWNURBMUFOb0tEZUR5bFo5TlNYeHlBc2lLYXdyUXFtQ3YySFZmNWU4YVJveGZjMW43eHMra2hJdEFVdm9qdnlXcnl4VmNXSlprc1ZTeVpvUVJBM2RjQW9IemF4NEdqMnd0dTZGVktNN2dNZ3RpMDJqYlY0NzZvVUpKczFqL0FiQTFtUTNQbThlVFJzb1pEdFIreFpLQ2lFS21NWFRJZVhIUEdkaFlBclg4RndHNERHTUVuQUhJSzR5dlQ1OG5XQzJiNzNjZXhhWmdXV2FFS2dVMWdqTmJQUDdQdk9ZR3NVU0JrdjNoQnRtUldOenhqVGs5UldrdHZ4cDZQT2owdkFSalk5c1drRmVsOFJXeGVnaklGNFJqd0FPblpXTVBCVEdqcXZIbXN6eEpPQlVEM3h5em5MMmJxUk92b1AzTjNxODRqRzRDN00vUHBjdk1CZWYwY3ZWOWs2aFh2KzJZbm81UWZHQXJSYmFDQzBtV3YyWXRGM2VjZXJORGhrTlpJSXNYUVJ2NWRsVHRHQURKU3oyZ0VFMUVKUU0vLzAyNkhkSUVaTEM4QjZBMHRrMGcxSmE4RHV6SmRwaFM4MlFCRVpqNWRiajdneFpONWVyL0laSSs2N3BzY2dFN1FhRE9VTXlDMFdiOCtnWGp1UjRGNUo2WXNhWG5GaEJvQUdFVnZVaGI2MGpJU2dDUW5vaC9PTEJndklyTDh2N0RkRmtFWU01ZHROZzk3dHZ6NXpKcXpkZklCbUpsUGw1c1ArREpQNXh0Vzd4ZmZuemVoN0grWiszK1Jwa3lXVDFZeHVVUkpZVnR4NlQwZkNUb2NvdVFWODVWa0hSSUdlZ0V1RXYvWUtwa0EvSmNlVm1MOGt2NnQ1LzlwdTYydGZpUFdjRlFWRWEwRFo5V2NMSkVQd014OHV2Zm5qVDlJZ1p5ajk0dC9sZGVBL1M5dE1hR2E5U05kbXNJeGJ2VnNjVkoxR1Njb010NFVQd2hBc21NWjBhWHpRQnN2ZEdSQmpRejBGVXBFSlJBSlFPcTRLQW5CZHorc2ZpUEozYk9Zbjhmc3lreVZXTWZpTjNCT3pja1MrUURNektlN09XLzg4YXFRenNmRTVrSDFmdkdqZVEwd0FEb2RtVkd3T2VpTXNVcUhyR09uUzRVRnk5UC93QUVvamtFbkkrSXFPSUpRTkxncENYaGNtTEF0RC9EK2tnUUUyMzVMOTN0aitZQnFnVFg5QmlDZVcvTmVkVDRBbVErWWtVLzNzYnp4QnltUXVaaG04ZzFUK1FiVit3V0ZkaktPL1RlMm1FRk5sQ2I2Z1BGNzA4VkoxVFhIZ0tkOTFHblpwRGZpMWsvZ00ydnFVM0RVbkN1Qm1OUWUzUDl2dzZwZTIyOUtPdkIwSzFrK1pTK3JucmZNMkFsQTNKTVp0YWgvRVpLWlQzZHJ4dUR6MU8veXhBd3U5SmdKeHIzbFFmUis4YWE4QnV5L3dkV1FaQVZsK1p6Q3JHM3E5Yy9ZcmttSHkzSVJZcnlBQXFBa0VCSWxvcEp4Tk5VYkVSK2ZBL0grLytBQWRQOVBtUzlkYXppY0p5Ym03bWxCOG5SMmRJMUh2Z1ZrT2xaR1B0Mm5NMjlHQ2FtY0daakF3bFErdnZyVis4WC96R3NBQVVpTFZQcC93ZCt6YVRNRld3Ky9rQUEwR1FRbnBDdzVtRHNBTUlyY1JCNW1DLytNQWZmVHdnZndLWTJLZm1DWjZaSWtVU2hyeFh4Qlg0eVlhVjhIem1jbjEzalVBOENNZkRxV1llUWNTa2hWT2w4VTZ1eEg3eGVrcnNnNDloOG9pQ0VOZ0M1VFVHNXZLeHhUOGYyYVJ0T3RjQUtRMXM4c29QdU9WVUl3cGNoTmxFRUlPeU5TSXJydnYzaHduY2tXSVpQWnNuYmNEeXpUcHZnM2xVOG1wWlFxb3p5Zks3NGFqM3dBS2gxTGdyc0Q1dE14aXovbmtHRDFzSHEvWU5GT3hrRUFjdVc3b3FtWGxpc3VRT1Q3VlYyandpL2tUZ2oxUmtvWmhCamU4WjgzU0NBRUVKWlcwQzNnZmY4dEFEQ3Q0VkFTYVdJQkswSEk5cThCRjV5VUFNeklwOHROeDVKZzliQjZ2L2pkRFBTUm5zMEJXSVplVWl0SW85SWhIbWhYVHZ6Q1BRZGRjY25aNzZVMVYvSXZDNFNCQ0Z5ZzI2REZOZzdjKytNaGhiNnFpQ2lrVDdXVlVtcjZsWW4yblJLeXJkWjUxR01CbFpJYzA3R1VCZE1qbnk2WENpVW1wQTZqOTR2TVpiZ0JNRm81NTJwdTI3UFhBcVhUeUFVUWNpdE9RakFtOXhYME45cEl3SVBtU0NtSDVRdVBxRVIwTDRrRFlncDl6T1VMNmZZeGtiWmNGY2V5QXJlQUYzR2xWK05SRHdBejh1a3NuVDNqaUlMVlNtcFdObGhNemUrazk0dk1aZmdHQVBKZUhEanBDcmdNMDFUZHJ5OU96dm1ZQXpBcUxWV0l3RVNod3piUnd3U0VuK01xUDZiUUs1dFpsV3loakNDQ3NDMTlYdjdnT25CUmJncDdjdS81QU95VmpxVk1tQTc1ZEpaOW5IRjB5b2hXTmxoTXhLblMrMFhtTXR3QW1GcTRpbW5ZYnJFcU5KUGMrOWtmZDYyUktoME9uOHFWOWhYWjlhc2tFUGdBZkk1Nnppb2NVZ1ZiekdUMjhsRXRSTW9LdGc3bEJIdHpuZlpOQStDUStYUVdNOGs0dWdsV0svTkxZS3pTKzhVOUdSZVhEMGcvVHl2aDROZTE3WWI0WmJyNmc2eTcvYU5XY29QcGpLUlRzSklhZ3M1SUp3a0VBdjZlbjA1UzZHVUJmUldzVUV4WnlWWlZRQ1F3cmdON1dmZGQ0MUdQQmN6SXA4T0RlWGZUU2JCYTZZWXhsWTgvcDNxL3VkYzNDK2pUYnR2cXQyb2FkbkIybTRvTmdNbjBXMHAraFlXSFdid2c5eVUvMEtiOUVJeSs1eTJoaUNpdDRVZ0t5VGVBa044VmFsazRMZS9sZGxPTlJ6NEFXV0JSTTZmZElQZkhzdHcvRytTRTVyTW5WUS9rQTVBa0xIUzBhazdWN3JlWGZoZ0FDYUJxRHREM2Uvbm1jNWs5a0EvQTgwSlJlcStVMzh6R1ZwM09iSm8vQnZBT0QzZHR3aVdhcjl6RUhzZ0hJR2xGdWJxU3g3K0pqYTM2YW5MTGNEdnZnd0ErTkRwRGZJTHYrcWx6dVh3QVh1U2pya0tlbWxPMmUzVTF1V1VZbkw4ZHdCLzVlMmFwY2E5TE52K3ZzUWZ5QVVoZVg0Vmd1QitteklzYUc5bnRxeGhGNFhiZTNRRCtuNy91SExBVzl3UTF0YmxNUlEvVUEwQ2FIQzdwbFhFaCtxNFQwT1djZmhsZVlUU0hCSzBFSC9taStmY1J1S1FuNEk2ZldwZW9CNEFldkN6M0hPT205eWIzRjVtQmxaQk5jbFlDajFhUmZ5ZnJiZ1BDVFI2QXpLK3ZENEN5Z2xYN2pwbU43SFk2NmQxRTBjdGRJckVFRTR3RUlNbGFtK1BrN1lGNkFNajdFd0FWYlU4MnZUZXJDd2hBWG9wSk45elZJK0FZck9lVUxMWmdFclkyeDhuWkEva0FKR1dyMG5hVVdkRnB5MmNUK29DV2pwZGpMRnhFNVV6WUlCQnBFVVg1bkxubHZBa3RiNzZTUFZBZkFPVUhwaUFNbTk2YnNWdENBTWFLQUxJQ015eERxNmNYZnljQStiL21PTGw2b0Y0QWlxQlJJRXpCcDcvWDJBZjArZmkxWElpb01JbEFJK0FJUElHUG1lUk9XVjNqMVp1dnl1MkIrZ0hvRmZaaURTMmxDMExpWTUyV1VBRGtRb1RUTUgxQkZTWVJkSG9SZktTdTV2OXFyaXpNSFlQVCt2eDZBUmhTdURjQXp6bURvNVpHSFQxUEFLWU13UXhNRTJqaVNvL2dFd0JycnErdTQxWk95KytvRDRCYUNjc1hUUGlTSTNleThzNEtHb0c4UXdDTUZNKzBnZ1FoTFIwQkYxOVNYdUQvYXlha3o3dVIwL1RzTWN4ZzNTamZxV05BMGhzcmdhL29qYXEvOFdQY0MrWUlrNEtlNENNU3VCMlhWaHQxT2o4eklmWGxVOEJ0VThEaG1ZUlhXZGZyZEYxZmdyMytTOEF0NDhDRDA0RFZqWFFTRE83MFBUVW5hSjV1T0N3c0lJRkhTU0Z5MXBLUFdDRHNaeENwdzhVVmdLU1B4TFhNOTM3T3p4eEFsanpjUEFiY3N3VTRRaDRWM1VOOG1Lb2VLbS9idTc4SWZLSlFhOFZENDhDeWxIUWlMM08zL3FnNVJmMzBCS0FDTXRKWGpYS1FjZkJTSzhEZnFjM0tWQ3d1TjJWRkdSbm0veUtadHE0UmU1aWZ5UVFnTTJBK0JlQjNHSGFaQm81TUFJdWUwbDdLdDNjQzR4aHcrNWVMN1R1Q2tKazFqQnR5ZXJiVWZZRzVFeGpaL3BxcnhFNWZBT3JPcTVTbW93VklyUnAxSXlUMlI2K2ZnMGJnVllHNENzeVplMlVzYWlPR0tYcjRTZnA5azhDeENZQUZTS3l2WGVZMW8xQnhRdXg5MXlNdGZzSFB1dGdubnlVdVV2aGMwWnNnVVhpYituVmtxNitaS2FBQklIc2dWWm51d0Q5c1ZvNjZyclI0SW1kaExHU1E4elBML0pnQlF4ZVUxb3VXa085UFRnRHpiZ21YeHJ6TWthdGwza2VpdmZHNXg0cjRJUmN6NUJma081dkVaMGtncElmQlo4eUtqbEwxN3N5eTB0TU5jT245ZGw0Rnk2ZExGYWJqMU1wdm93OUlmeStJNE5sbzlYdCtacVU5VmRKcHFaaDRRRER5eFV5WU9ZSndIRGcrRGhnSS9XVVZabDdhU0V0OTMrR085SWEyaXVaS09mQTdsaHA5SnB2QVZ5NjF3Mm1Pd081aG1DZ01IQzFIOU8yNGd1NlVEOWpQK1ptYnRMUmFTc2VpOVNMNFhEUGJBRWgva0dRL3BTVWNjMGxiQXBGV2I2N2xRVWhwVm5MQnNvS3FxWmNsRk1tVXRyeFBjd3hsM1g3dk9DQXRZTFNDY3VnRlFtcWhkc3NIN0hVK1J6bmppT2xZWEE4d3FrT2ZrSXRUQW9tK29LeWdjYTRFUzhqWStOM3o3ZlNHNGhmVXRwM2loVUhydVZTc0Z5MWlSdk5QKzFON0E1QmRKQUNtVnBBZ1pQaEdPeUNpZ0VqbFBMdWRuN2t2RnRPeHVCNGc2T2pEOFVXTFJrQ1pGUndyTENFWEpRUWhwMksrMzdsUWVCQ1JYMUE3S1BRdG8xcHJGRW1TWW4ybUI5RUFzTytrWWZrOEtRaFpGOHlqVno1Z3AvTXp0eU9VamlXOWJDVWhFQmhLUkNDZ1NpczQ1dVEvUGhYL3hmRldNZ09uV3UyZ3hCMFRGL28wa0VaL2tDRE0xVHMrM1JIWW53VlVMNlhoREZyQXN3ZklCNnc2UDFNclR1bFkwc3VtMVZJQ2dsS3dDRUFDcXZRRkNVSzNnSGNzRlFDTS9JTGF5cVAxazlKc2hWcXJuY01hbE9ZWXZnY0dBeUN2SXd1b2Q4WUJKUW1acG1HSmV5UndrR3c0bjhqSk9KUU53M2lkTEZoTVJOQjBTZ0FTVEp5S295LzRpZVhDZUZmSkJVZVYyU29BY2xGeVIwYmJtMU9IVFVpTjAvRFRBd0Q3elFlTTUyZHFqOFZzR0VrVkUyaktldEc3QUVoUTBmckpBdjZSQzB0ckMxc2tsK0lXbE5pbkdMYlNhWmc3TWMweGZBOE1iZ0YxTFFWMXowOEEyRzgrb003UFZGOU1zMkdVRTBnUXlwK0x3dTJ5YWdMZ1I5WmFZcGtTeXBRNmE2UTJEQ3F6cGt2aWV0WElGZG9aZnVpZUdtY09EMERlUDBIRWJCaE53WVBtQS9MOHpKUXNBVEFLbmd1RXFTK1hUcWtFNFlmV1d3Q1VGWlRrc1lBWXdaZklCZU45VHcwY2pPd3U4Z0RJWnFzb1NTdmhFZVFEaWlHWUZveVdpU0RSeXBXZ2k2OVVQNXNjNWZJY3F1U0NOZVhxZTJYOVpBSGZNN0toZTJwY09CK0FUNDErYU81aVJEM1FBSEJFSGQ5Y3R1aUJCb0FORWtiYUF3MEFSOXI5emNVYkFEWVlHR2tQTkFBY2FmYzNGMjhBMkdCZ3BEM1FBSENrM2Q5Y3ZBRmdnNEdSOWtBRHdKRjJmM1B4Qm9BTkJrYmFBdzBBUjlyOXpjVWJBRFlZR0drUE5BQWNhZmMzRjI4QTJHQmdwRDNRQUhDazNkOWNmT3hxWUoyYXU5UmRQdGRwL2tob0VPbGdsRFlUMzlWMVB6UUZYTHNNWEFsZ3Q5UEN4SktQYnVmeWY4L0tISVBmQlBBWkFCZjc5WGM1WFEwWlExUTczNjBOYnhvSHJsc0R2czVaUnNnbzB1bmUwNmJ5NlgxbVp2dFA5OVBOQXA0RjRMc0JYQTVnanc4RUdUZXFhR0Y0UWh6UUY4MENYN2NBdkdJZGVEWUFmaGRaMnNUS1VjVnJwRTduZDMxTjVnajhlMmRJbzJvc2s3TlpwTWRLMFoxOXR2K2JKNEY5SzhEMUFDajh5Zk5TaWtIZWcrNVo5NjltNTdZLzgvWlArZFBMS1poUC9yY0ErQVlBRjdnMW9SVWhFTVV6Rk10NmVTSmZYNzhiMkRrUGZNMGk4R0lBWCt1V2xBTXBwcmVVVUVybjhwMmd6VGwrMmZsZy9zRGJUa3ZJT2lrK0NQMjAvL216d0FYendEY0N1TlRQSmVGWHBFcE02UUVqSUhtL3pURjhEN1Q1Z0FUWU5RQ2U2OWFBbG9SVEd1bGZCRVNCU1lOeXhSNWcvQmh3N2hLd1p3bDR2azlMbk01Sm1zQnpVeURHQVgzQjhHMjNNei9nOUJ1VWEvMElpdXRmTWtqN3p3S21uZ0F1WFN2T3BVdkFXWUJ0RjRCVG5zcElqL084elBhZjdxZHZXSVR3NmVaQTBKTFFFaEtFR2d4WmhVai9kejNOelNLd2JSNDRleG5ZdlZLY3krbU01S20wSmh4SW5VdHJHa216Q1BpY2czVzVMTUdrUWlaWlRtOXhTOVozKzRtMm84QzVjNFgxNXBUS1cyTGIrZkN4N1dMdGpZeHpxaXFsMjlJY3cvZEE1U3FZZjZSVFRpbGcrbFlDSVhtSUNLUTRJSzl3eGZTSlk4QVpLOEN1RldEbmFuRXVhOVpUQU1zYUNvZzNEdDkyTy9Ndm5SR0J0R3drcUtSbU1Fa3FDYWErMmsrMExRRFRoNHJQODhVSGo3NGtGMVdhQVRvOVFIUTdtbVA0SHVnWWh0RUtqNFBCNlpRK0ZTMGhRYWhwbGRQeWExa1hUT3FOWThEc2NnRytIYXZBdHRVQ3ZCeEluaXRya2dMNGxjTzMzYzdzcEJkTTNrQXVTbnEybng5Z1FmQWg0SnlWd3ZyeHdlbDJ6M3A0YU1sekg2RE0yei9sVCs4YUIrUS9PVDRFRXFja1dRU0JrR0Q2RVFLUW5EQ0x3QlNuWWdjZjMyZlhpb0dVRmF3QzRlc3l1N0NYWG5EUDl0T0NzeUQ0S0xCMXJtZ3ZYN3pmYnUyV0cvSnRtZTAvM1Uvdkt4Qk5BTW9pMEtjamtBVENOM0hPRXIzVUFqRHJ3T1A3MXJYaXhZRWtlS01GbFNYOG9jd1I2S1VYVEo3QWFORTJ0RjhXZkE0WWU3S3cxbXd2WC95Wm4rZUtudmNyZnpDNklLL09iUC9wZm5wZkFHUW55U29JU0JxVVh5QUFTUzFBSzBKZmFnV1ljUkRPckFGNjZUeFpRVTdqQk9FYk0wZWdINzFnY2dYU0ZaQVY1NE5RdGo5WWNOSXBiT05DeWg4WWdpOENWb3NwQXBEdUI2M2c5MlcyLzNRL3ZXOEFzcU00Z0xJS0JCSUg4YmNKd01DTk1YNjhCVHFCYjhzNnNHV3RzSUE2andEazY2MlpJOUN2WGpBNUE2TlZhMnQvSUFpY25DL2FHVis4VDc0SVFQbS9BbUd1QmMrOC9WUCs5SUVBeUxzbEFLTVYvTGdBeUlVSW5mbmp3UFFxTU9PZ0kvRHN0UTVNcjdVQXFNRjhWMllYRHFvWFhObCtFUVE2Tjl2MjlhS2Rlc1VwV0paYkFQeVBtZTAvM1U4ZkdJRHNzRGlkL3BVQVNDdkNhWGdKbUZndUFFZmdFWFQyN2dEa3V3YVVnL25ibVNNd2pGN3dodmJMaFNETDVUd3d2ZFJxbzlvcUh6QUNrQ0I4VTJiN1QvZlRod0lnTzAxVDFJTUNvQVp4R1JoYktvQVhRVWNRVGprSSthNEI1ZTVGempHc1h2Q0c5Z2RxckxHRllycFZHL1V1SHpCT3cyL0xhWHh6Ymg0M0RLZW9Kd2xBSHFMbmRTczR1ZG9Db0lCSFFFNDVFUGszRHVpdG1ZT1FveGRjdHA4K3JGd0lXc0dGWWlGRm9MR05jaGNFUUM2ZStPSkM1SjJaN1QvZFR4L2FBcFlkSjM3QXlKSy9ESXd2RnhZdldyMEl3RW4vSDFPcGNvNXN2ZURVaFNBQUY0SEpwUUprV2l4cDZrMm40SVlmTUdmMGFtREhldjJJOCtsNC9VYnZOdzhFb3p3NzJ3SmVQT0o4dW5kN0VrS2o5enRLR0ExLzdXd0FUbzQ0bjQ1cFdJM2U3L0FBR1BXWjJRQmtZSENVK1hUTWZHR1FtWUl4amQ3dnFPRTArUFh6QVRqaWZEckt0VFo2djRNUC9NbHlSajRBUjV4UEYrVmFxWkxKRjFVektkUFY2UDJlTEREcjNJNThBSTQ0bjA3Wk1BUmJvL2Q3OGdNdWJXRStBRWVjVDhlOVlPbjJVaGV1MGZzOXRVQ1lEOEFSNTlNcEc2YlIrejIxZ0tmVzFnTkF6NGdlUlQ1ZFRFWm85SDVQUFJEbUF6Qm1STThCSnpxZkxpWWpTS0tyMGZzOWRZQllEd0JIbUU5WHRSZk1zSXowNGFRWjErajlucHlnckErQWtxczh3ZmwwQkNDVFdScTkzNU1UWUwxYVZROEFvMXpsQW5BaTgra0VRR1pUTlhxL3ZZYjc1UHQvZlFBY1VUNWRCR0NqOTN2eUFheFhpK29Eb0ZMeVQzQSszUmNhdmQ5ZVkzeFMvejhmZ0NRWC9MUFIzU096a29uNTVqZzFleUFmZ0Q4TTROY0FQRDZhRG1CdEIxZTROTUROY2VyMVFENEFid2J3eHdEZTRVdlJFOXdIWkcxZ05TWERMbHdMTmNlcDFRUDVBUHh6endqOUlJQVBuWGhUNU9SYzVFWUNBOUhOY1dyMVFENEFtUkg2RlFCTVRTWlpIOThabUQ1Qmg1ZzFGb3BpTm5zMXg2blRBL2tBdkFmQUV3RHVkbkkrRXZReFBma0V6WWZhQ1hSU0JsdVFNQjdZSEtkR0QrUURzQk5CSC85K0FrQW9icVRBREdLN0ludzF4OG5mQS9rQTdFWFF0OGtnckdBR01mQnhaNUN2NWppNWV5QWZnTDBJK3I2OHVSMFFtVUZvQlFVOHZmTnZ6WEh5OWtBOUFPUm9NdzdDZEdRQ2pvVVpEd0w0a3YvKzhPWjFnSmhCSWpHRGdNaDN2VGF2QmMwMzUvUkFQZ0Q3SmVnak9EZmhpTXdnb3FlSndOUFBUYUI2RXpxL2hxK3NCNEFjWGVYRVArWmhHVm85dlJpbUlRRDV2NW9QQVpDdXBnREk5d2c4L3F6LzFYejU1dXN5ZXlBZmdNTVE5R1UyT3A0ZUFjaHBPSUpRUUV6L1Z1UGxtNi9LN0lINkFNamdHemRsNlF0eVg1aldqcFFGZXZGM2xxM3hmNnlock9sSUFVZ1FDb2pSOGdtRStsOU5sMisrSnJNSDZnRWdSNVVBNUtZc2MrQVptQ2JRQ0RpK0l2Z0VRTW9iMVhCRUFISWFqZ0JNTFYrMGtDZHdzNmFHdTN6cWZrVjlBR1R3amZ0ZzNKUlZWUkF0SFFFWFgvd2JBY29YUDVkNUNJRDhHb0pLdnFEQWxvS09vSXoveTd4OGMzcG1ENHpoYXF3alJ6Q1l5UWc1Z3IyWmdzRlRMd2VXcjhYUWdzWGpid0xXcm5OdE1sS2dOb0xCbVpBYTdQVENBdVlJQmxNdmxXUXN3d3IyVWxVdzQ1amREU3g4SGJEK0N0ZCtIVkN3ZVBLYmdKVjlhQVNETThZZzU5VFdGRHlzWVBCdG1ZSzkxSWJOT0hhUEEvTTdnVVhLWEE0aFdEejc5Y0E4K1cwYXdlQ01VUmorMUhZZmNCakJZTzU0TU1ZM3RHRHY4STNubVdTSE96WU9MSjBMTFBHWEFRV0x6M29COE1RVXNFYTE2a1l3T0c4d2hqaDc0eUprVU1GZ2JzTmxDZllPMGVwd2lzc1ZZMzRic0h3MnNFSVJrQUVFaS9kY1UwU1A1cWhGMWdnRzV3M0dFR2RYcjRMNTEzNEZnNGtBanVEUWdyMUR0RHFjVW1aRVR3QXJad0FydTRCVnFzdjBLVmg4L28zRjR2MFFYWkJHTURodk1JWTR1M01ZaHY5NVpoK0N1MXhCY3h1T1UvSGZlRElxNWN2N0Z1d2RvdFhobENCWGpPWFpBbnlyTzRCVjZpbjBJVmg4d1N0THVXQ3NVQXl2RVF6T0c1QUJ6KzRlQitSL2V3bnUva09QLzNHL2w0a0pURVJsbGpRdElvdDJlNTMvSXdPMk9QbDRGTHRjbkNxQXA5Y2FoVDU2Q0JaZitMcFNMaGh6MU41cUJJUHpCbVRBcy9zTFJIY1RES2JpTkhkQkdHeW1PQy8zaGdsRXZnakFub0s5QTdZNCtYZ2lWNHpWV1lEQXMvZXR4YXViWVBGRlAxUWtMdENJUDhuZWFBU0Q4d1prd0xQN0F5Qy90Sk5nOEwveExOQnUrWUJkQlhzSGJIRUZBSU5jTVZhbWdkV1pBb1JyZlBkWG04S2l0TGRtZ1l2ZVdBcSsyeTdpTXFmdVJqQTRiMUFHT0x0L0FQSkxxd1NEMyt5NVQxeUkwQW9TYkF4TU16R1YxbzgvTXkycm8yRHZBSzJ0K0dnaVY0emo0KzNBSXdEWHR3QnJWSmV1RUN6ZSs5YVc0RHV0NFB4a0loWXNkZXRHTURodm9EcWNQUmdBK1NXcDRPNHZlUTVVdi9tQUd3Ujc4KzZyUXE0WXE5UEFPaTJmQTQvdkJrS3VkS1ZVN1Zadzc3dUt2V0Z1WmJ0Y01OYjV2MFl3T0c5ZytqeDdjQUR5aTZQZzdnY2NnSXhsY0E1VEtoYUQwMXlZS0JtVkZwQlpNZngvbTJCdm55M3Q4TEdxb3FUbGlaYlZJK2dNZ0h3bk1BbkNJRmk4OTdjTEFBWjZReXpGenpTQ3dYa0QxT1BzNFFESUw1WGdMbWs1SkhrL1NENWdLZGliZDM4VmNzVllHbXVCVGFBekVITEhneUNjYW9rQjcvMUlrVUVUNUlLeHdGNXBCSVB6QnFiUHM0Y0hJQy9BYWVxdlBMOXBtSHhBRSt6dHM2VmRMQ0QvbGNnVlkzVXlXRDBCajFad3FnQ2dnWEE3c1BmV0FvQUp2YUV0WkJyQjRMeXg2ZWZzUEFEeUN0bUN2ZjAwcy9Obk9zZ1ZZM204QlRSWlBadUdCVUFDZEFyWSs1bFdEcUdtWWJJckxIRXgwZ2dHNXcxT0gyZm5BN0NQaXpRZmFYcWdVdzgwQUd5d01kSWVhQUE0MHU1dkx0NEFzTUhBU0h1Z0FlQkl1Nys1ZUFQQUJnTWo3WUVHZ0NQdC91YmlEUUFiREl5MEJ4b0FqclQ3bTRzM0FHd3dNTkllYUFBNDB1NXZMdDRBc01IQVNIdWdBZUJJdTcrNWVBUEFCZ01qN1lFR2dDUHQvdWJpRFFBYkRJeTBCOFpZTk1ia1grWmVrcHVJaU9RclBhcit4czg4OUhKZzZqWmc1akF3dlZaOEIrbGw5UGxPNS9GYy9vK0VDam5IZmk4ellma3ZNNXVsbXA0cUpYVnF4NWRlRDR6ZkFrdy9DR3hkQVpnb0hmdWgxMzFRa2FJNWh1OEJzNERzOEIwQVdMbklSR0NCc0Zmbjg3SmZmRE13ZGpPdzVSNWc4Z2l3WmEzNGpuUVFVd0RvOTl3QmZKNFRNN0NPaU5kbGFqMnJBL2plVi92ZkRlQVRBUDRVR0g4STJMcmM2Z2MrU0hxWTRvTVo3NFZTS00weGZBK1VVekIvb0JVVUNLTWw2elNRL1BzWHFaRDVLUUMvQTB3L0RFd2NBY1lYZ1luVndwcHdBRHVCa2VmbkNpbTkwRm1CV1h3bks4N1VlbjUzQkk4c2J1d3FhejlwNVVnblFoQlMrWk4xekU4QWswdXR2aUN3cThESTgvbng1aGkrQnpiNGdKektaRTFTRUZaWmdTOS8ycFdSL2dUQUo0SEpROERFTVdCOEFSaGZCc2FXQ3dEcXV3UUt2dk5nSFh2T2NZVmJQRkpQa3crZER4Qy9XMVk0dFdEcHcvUmxnbzRsbzFUNC9LeFRpaEROcEp3ajMvVWlNTFhlbXByamZmQzdlV3B6RE44RGxZc1FEaUt0Vnh6RXFvSGt5WDlIUml6VytuSWdhUW52QWlhZUJDYm1DMHM0dGdTTXUyck1lUEFSOVgyNTJqWGtsYVRGVTEwOEswTUhhdi9udko2WnhWVms5T0k3R1IySVpvR1FOYy9IZ2JIZ0l3cUlMSVZ1anVGN29PTXFXRmF3Q29SeGtmRUlCNUNXZ2tSRUJDTmY5d01UYzhBNFFjaUJXeW9HejE2cndOZ2FNTDVlV0twY3RZWkwzTitUV0xYMGd2dHVQMEhIazJuMTZKRHl4WG1WaGZVMHF5d2JKYnI1R1N1WEt4QS9zVjVZOVVZV2Ruand5UzNxS0tnYXJXQTY5V2c2ZmpRT0lLMEhhZG5JalBWRkIrQWlNRTRBdWlVa0NGbkVTeUNTa21BdVU3Q2ptMTV3WCsyWDJpZkJSbjlBOG1LY1cyVUZqVUxWUWNnVkRsODB1NDBTWWg3NjNGZnZxdWhMQ3hpdG9CWVVzb0pmalhLdHRCeU1xOUNLY0huNHNQdUNiZ1hOSnd5V2tFQ2N6NVEzNzZVWDNMTm5jWnlRQUFBREVrbEVRVlQ5ZkZnSUpzNmxCQnd0bjNUdDZGcEl6NFJXbnVReFBoMlhJR3ptNEN3UTloV0lGZ0JUSzBnUUhpSUFKZGRLcTBFTFFoK0tMMXFVUjRNdlNFc29FTklLcmdBTEhOaU1veCs5NEs3dGw5cW5uTWlvOE1TZjZTTndHcFlWakNEay9KdTdpc3E0OTZmQ3FYMEJrRGVxbFd3S3dpYzFnQVFTcHpHUkVuRmdSRXowMWVBTEx2dnEyS2ZpNDVtNmNmM3FCWGRzZnhSYkpNaG84ZGltcU9oRUs4Y1hRUnI5UVZwdlBvRE5NWFFQOUEzQUNFTEZ4UGgrakFDa1AwZkxJS0ZDQ1JScUt1UFVkcWpsQzlvMDdKWndLVk5IZUJDOTREUWNaTzBYQUFrbWdvdEFrOVFZclI5Zi9CdkJ5WWZNU0FURFZNendUWE1NM1FNREFWQWdWSENaNy9NYVFLNFFaVUhpTkNiQlFscVV3NzRZQ2I3Z2NtWWtlbEM5WUZsd3ZWdjdSUkFvclR1QmtFQ1U5YXNDSUQ5L3g5QjkzNXpZenlLa3FwZmlOSHhjQTBnTFFndkJBYVBWa0NxbTNoMkF0QzVtL1J5RXF6dy80eGhHTDNoRCsrTW1zbGdxQ2JnVWZMS0FjUnJtVGxCekROMERBMXRBWFVsV2NEbTFJT0lJSkFqbFQvRmQwNWxiRlFGd2pkdGdHY2V3ZXNGdDdSYy9HeDhpV2pVQ2pHQ1QxWXZXVDFNd2dVcXJmM05HNDV0VGJjdTBheGltV3g5eEVOY0VRSEdiY1lBRXd0U1hTcVkwZ25DZGdldU1JMGN2dUd4L0ZVR2dGaHdFWXJSODBRY2tXTitYMGZqbTFEd0FXdjhSZ0pGaWxKWkJ6bnowcFFnK0FaQUFsVldoMUd2R2thMFh6QjBjQ1FpMzBhU0dWYTlBRjYyZkxPQjdNaHJmbkpvUHdQRVI1OVB4K28zZTc2bUw1S3dwMkc1N3hQbDBreGMzZXIrbkx2eUt0TG1oZlVDNzhSSG4wODFPTm5xL3B6Y0FSNXhQUjltUlJ1LzMxSVZndmdVY2NUNGROYW9idmQvVEdZQWp6cWVqdW1xajkzczZBM0RFK1hSVWcyVlNDamRhR3IzZlV3K0krVlB3aVBQcHFKak84SjFOdzQzZTd5bUh3SG9BS01GZDdRRXJBZUVFNU5OSk1iM1IrejNsc0djTnpnZmdpUFBwb21KNm8vZDc2b0d3UGdDT0tKOHVLcVkzZXIrbkt3QkhtRStub3FSRzcvZlVBMTk5VS9BSTgra0V3RWJ2OTNRSG9FaFpUbkErbllxU0dyM2ZCb0F0YWlxQlVJbWRtNWhQSndBMmVyK25Ld0JIbkUrWDFnVXpTYm5SK3oxMXdQai9BZUNwUEREM3Q3cnZBQUFBQUVsRlRrU3VRbUNDXCI7XG5cbi8qKlxyXG4gKiBTdWJwaXhlbCBNb3JwaG9sb2dpY2FsIEFudGlhbGlhc2luZyAoU01BQSkgdjIuOC5cclxuICpcclxuICogUHJlc2V0OiBTTUFBIDF4IE1lZGl1bSAod2l0aCBjb2xvciBlZGdlIGRldGVjdGlvbikuXHJcbiAqICBodHRwczovL2dpdGh1Yi5jb20vaXJ5b2t1L3NtYWEvcmVsZWFzZXMvdGFnL3YyLjhcclxuICovXG5cbnZhciBTTUFBUGFzcyA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX1Bhc3MpIHtcbiAgLyoqXHJcbiAgICogQ29uc3RydWN0cyBhIG5ldyBTTUFBIHBhc3MuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge0ltYWdlfSBzZWFyY2hJbWFnZSAtIFRoZSBTTUFBIHNlYXJjaCBpbWFnZS4gUHJlbG9hZCB0aGlzIGltYWdlIHVzaW5nIHRoZSB7QGxpbmsgc2VhcmNoSW1hZ2VEYXRhVVJMfS5cclxuICAgKiBAcGFyYW0ge0ltYWdlfSBhcmVhSW1hZ2UgLSBUaGUgU01BQSBhcmVhIGltYWdlLiBQcmVsb2FkIHRoaXMgaW1hZ2UgdXNpbmcgdGhlIHtAbGluayBhcmVhSW1hZ2VEYXRhVVJMfS5cclxuICAgKi9cbiAgZnVuY3Rpb24gU01BQVBhc3Moc2VhcmNoSW1hZ2UsIGFyZWFJbWFnZSkge1xuICAgIHZhciBfdGhpcztcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIFNNQUFQYXNzKTtcblxuICAgIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBnZXRQcm90b3R5cGVPZiQyKFNNQUFQYXNzKS5jYWxsKHRoaXMsIFwiU01BQVBhc3NcIikpO1xuICAgIC8qKlxyXG4gICAgICogQSBjbGVhciBwYXNzIGZvciB0aGUgY29sb3IgZWRnZXMgYnVmZmVyLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtDbGVhclBhc3N9XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXG5cbiAgICBfdGhpcy5jbGVhclBhc3MgPSBuZXcgQ2xlYXJQYXNzKHtcbiAgICAgIGNsZWFyQ29sb3I6IG5ldyBDb2xvcigweDAwMDAwMCksXG4gICAgICBjbGVhckFscGhhOiAxLjBcbiAgICB9KTtcbiAgICAvKipcclxuICAgICAqIEEgcmVuZGVyIHRhcmdldCBmb3IgdGhlIGNvbG9yIGVkZ2UgZGV0ZWN0aW9uLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtXZWJHTFJlbmRlclRhcmdldH1cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cblxuICAgIF90aGlzLnJlbmRlclRhcmdldENvbG9yRWRnZXMgPSBuZXcgV2ViR0xSZW5kZXJUYXJnZXQoMSwgMSwge1xuICAgICAgbWluRmlsdGVyOiBMaW5lYXJGaWx0ZXIsXG4gICAgICBmb3JtYXQ6IFJHQkZvcm1hdCxcbiAgICAgIHN0ZW5jaWxCdWZmZXI6IGZhbHNlLFxuICAgICAgZGVwdGhCdWZmZXI6IGZhbHNlXG4gICAgfSk7XG4gICAgX3RoaXMucmVuZGVyVGFyZ2V0Q29sb3JFZGdlcy50ZXh0dXJlLm5hbWUgPSBcIlNNQUEuQ29sb3JFZGdlc1wiO1xuICAgIF90aGlzLnJlbmRlclRhcmdldENvbG9yRWRnZXMudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgPSBmYWxzZTtcbiAgICAvKipcclxuICAgICAqIEEgcmVuZGVyIHRhcmdldCBmb3IgdGhlIFNNQUEgd2VpZ2h0cy5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7V2ViR0xSZW5kZXJUYXJnZXR9XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXG5cbiAgICBfdGhpcy5yZW5kZXJUYXJnZXRXZWlnaHRzID0gX3RoaXMucmVuZGVyVGFyZ2V0Q29sb3JFZGdlcy5jbG9uZSgpO1xuICAgIF90aGlzLnJlbmRlclRhcmdldFdlaWdodHMudGV4dHVyZS5uYW1lID0gXCJTTUFBLldlaWdodHNcIjtcbiAgICBfdGhpcy5yZW5kZXJUYXJnZXRXZWlnaHRzLnRleHR1cmUuZm9ybWF0ID0gUkdCQUZvcm1hdDtcbiAgICAvKipcclxuICAgICAqIENvbG9yIGVkZ2UgZGV0ZWN0aW9uIHNoYWRlciBtYXRlcmlhbC5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7Q29sb3JFZGdlc01hdGVyaWFsfVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xuXG4gICAgX3RoaXMuY29sb3JFZGdlc01hdGVyaWFsID0gbmV3IENvbG9yRWRnZXNNYXRlcmlhbCgpO1xuICAgIC8qKlxyXG4gICAgICogU01BQSB3ZWlnaHRzIHNoYWRlciBtYXRlcmlhbC5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7U01BQVdlaWdodHNNYXRlcmlhbH1cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cblxuICAgIF90aGlzLndlaWdodHNNYXRlcmlhbCA9IG5ldyBTTUFBV2VpZ2h0c01hdGVyaWFsKCk7XG4gICAgX3RoaXMud2VpZ2h0c01hdGVyaWFsLnVuaWZvcm1zLnREaWZmdXNlLnZhbHVlID0gX3RoaXMucmVuZGVyVGFyZ2V0Q29sb3JFZGdlcy50ZXh0dXJlO1xuICAgIC8qKlxyXG4gICAgICogVGhlIFNNQUEgc2VhcmNoIHRleHR1cmUuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge1RleHR1cmV9XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXG5cbiAgICBfdGhpcy5zZWFyY2hUZXh0dXJlID0gbmV3IFRleHR1cmUoc2VhcmNoSW1hZ2UpO1xuICAgIF90aGlzLnNlYXJjaFRleHR1cmUubmFtZSA9IFwiU01BQS5TZWFyY2hcIjtcbiAgICBfdGhpcy5zZWFyY2hUZXh0dXJlLm1hZ0ZpbHRlciA9IE5lYXJlc3RGaWx0ZXI7XG4gICAgX3RoaXMuc2VhcmNoVGV4dHVyZS5taW5GaWx0ZXIgPSBOZWFyZXN0RmlsdGVyO1xuICAgIF90aGlzLnNlYXJjaFRleHR1cmUuZm9ybWF0ID0gUkdCQUZvcm1hdDtcbiAgICBfdGhpcy5zZWFyY2hUZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlO1xuICAgIF90aGlzLnNlYXJjaFRleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlO1xuICAgIF90aGlzLnNlYXJjaFRleHR1cmUuZmxpcFkgPSBmYWxzZTtcbiAgICBfdGhpcy53ZWlnaHRzTWF0ZXJpYWwudW5pZm9ybXMudFNlYXJjaC52YWx1ZSA9IF90aGlzLnNlYXJjaFRleHR1cmU7XG4gICAgLyoqXHJcbiAgICAgKiBUaGUgU01BQSBhcmVhIHRleHR1cmUuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge1RleHR1cmV9XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXG5cbiAgICBfdGhpcy5hcmVhVGV4dHVyZSA9IG5ldyBUZXh0dXJlKGFyZWFJbWFnZSk7XG4gICAgX3RoaXMuYXJlYVRleHR1cmUubmFtZSA9IFwiU01BQS5BcmVhXCI7XG4gICAgX3RoaXMuYXJlYVRleHR1cmUubWluRmlsdGVyID0gTGluZWFyRmlsdGVyO1xuICAgIF90aGlzLmFyZWFUZXh0dXJlLmZvcm1hdCA9IFJHQkFGb3JtYXQ7XG4gICAgX3RoaXMuYXJlYVRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzID0gZmFsc2U7XG4gICAgX3RoaXMuYXJlYVRleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlO1xuICAgIF90aGlzLmFyZWFUZXh0dXJlLmZsaXBZID0gZmFsc2U7XG4gICAgX3RoaXMud2VpZ2h0c01hdGVyaWFsLnVuaWZvcm1zLnRBcmVhLnZhbHVlID0gX3RoaXMuYXJlYVRleHR1cmU7XG4gICAgLyoqXHJcbiAgICAgKiBTTUFBIGJsZW5kIHNoYWRlciBtYXRlcmlhbC5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7U01BQUJsZW5kTWF0ZXJpYWx9XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXG5cbiAgICBfdGhpcy5ibGVuZE1hdGVyaWFsID0gbmV3IFNNQUFCbGVuZE1hdGVyaWFsKCk7XG4gICAgX3RoaXMuYmxlbmRNYXRlcmlhbC51bmlmb3Jtcy50V2VpZ2h0cy52YWx1ZSA9IF90aGlzLnJlbmRlclRhcmdldFdlaWdodHMudGV4dHVyZTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgLyoqXHJcbiAgICogUmVuZGVycyB0aGUgZWZmZWN0LlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHtXZWJHTFJlbmRlcmVyfSByZW5kZXJlciAtIFRoZSByZW5kZXJlci5cclxuICAgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSBpbnB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgY29udGFpbnMgdGhlIHJlc3VsdCBvZiB0aGUgcHJldmlvdXMgcGFzcy5cclxuICAgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSBvdXRwdXRCdWZmZXIgLSBBIGZyYW1lIGJ1ZmZlciB0aGF0IHNlcnZlcyBhcyB0aGUgb3V0cHV0IHJlbmRlciB0YXJnZXQgdW5sZXNzIHRoaXMgcGFzcyByZW5kZXJzIHRvIHNjcmVlbi5cclxuICAgKiBAcGFyYW0ge051bWJlcn0gW2RlbHRhXSAtIFRoZSB0aW1lIGJldHdlZW4gdGhlIGxhc3QgZnJhbWUgYW5kIHRoZSBjdXJyZW50IG9uZSBpbiBzZWNvbmRzLlxyXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gW3N0ZW5jaWxUZXN0XSAtIEluZGljYXRlcyB3aGV0aGVyIGEgc3RlbmNpbCBtYXNrIGlzIGFjdGl2ZS5cclxuICAgKi9cblxuXG4gIGNyZWF0ZUNsYXNzKFNNQUFQYXNzLCBbe1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKHJlbmRlcmVyLCBpbnB1dEJ1ZmZlciwgb3V0cHV0QnVmZmVyLCBkZWx0YSwgc3RlbmNpbFRlc3QpIHtcbiAgICAgIC8vIERldGVjdCBjb2xvciBlZGdlcy5cbiAgICAgIHRoaXMubWF0ZXJpYWwgPSB0aGlzLmNvbG9yRWRnZXNNYXRlcmlhbDtcbiAgICAgIHRoaXMuY29sb3JFZGdlc01hdGVyaWFsLnVuaWZvcm1zLnREaWZmdXNlLnZhbHVlID0gaW5wdXRCdWZmZXIudGV4dHVyZTtcbiAgICAgIHRoaXMuY2xlYXJQYXNzLnJlbmRlcihyZW5kZXJlciwgdGhpcy5yZW5kZXJUYXJnZXRDb2xvckVkZ2VzKTtcbiAgICAgIHJlbmRlcmVyLnJlbmRlcih0aGlzLnNjZW5lLCB0aGlzLmNhbWVyYSwgdGhpcy5yZW5kZXJUYXJnZXRDb2xvckVkZ2VzKTsgLy8gQ29tcHV0ZSBlZGdlIHdlaWdodHMuXG5cbiAgICAgIHRoaXMubWF0ZXJpYWwgPSB0aGlzLndlaWdodHNNYXRlcmlhbDtcbiAgICAgIHJlbmRlcmVyLnJlbmRlcih0aGlzLnNjZW5lLCB0aGlzLmNhbWVyYSwgdGhpcy5yZW5kZXJUYXJnZXRXZWlnaHRzKTsgLy8gQXBwbHkgdGhlIGFudGlhbGlhc2luZyBmaWx0ZXIgdG8gdGhlIGNvbG9ycy5cblxuICAgICAgdGhpcy5tYXRlcmlhbCA9IHRoaXMuYmxlbmRNYXRlcmlhbDtcbiAgICAgIHRoaXMuYmxlbmRNYXRlcmlhbC51bmlmb3Jtcy50RGlmZnVzZS52YWx1ZSA9IGlucHV0QnVmZmVyLnRleHR1cmU7XG4gICAgICByZW5kZXJlci5yZW5kZXIodGhpcy5zY2VuZSwgdGhpcy5jYW1lcmEsIHRoaXMucmVuZGVyVG9TY3JlZW4gPyBudWxsIDogb3V0cHV0QnVmZmVyKTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBVcGRhdGVzIHRoZSBzaXplIG9mIHRoaXMgcGFzcy5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gd2lkdGggLSBUaGUgd2lkdGguXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gaGVpZ2h0IC0gVGhlIGhlaWdodC5cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwic2V0U2l6ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRTaXplKHdpZHRoLCBoZWlnaHQpIHtcbiAgICAgIHRoaXMucmVuZGVyVGFyZ2V0Q29sb3JFZGdlcy5zZXRTaXplKHdpZHRoLCBoZWlnaHQpO1xuICAgICAgdGhpcy5yZW5kZXJUYXJnZXRXZWlnaHRzLnNldFNpemUod2lkdGgsIGhlaWdodCk7XG4gICAgICB0aGlzLmNvbG9yRWRnZXNNYXRlcmlhbC51bmlmb3Jtcy50ZXhlbFNpemUudmFsdWUuY29weSh0aGlzLndlaWdodHNNYXRlcmlhbC51bmlmb3Jtcy50ZXhlbFNpemUudmFsdWUuY29weSh0aGlzLmJsZW5kTWF0ZXJpYWwudW5pZm9ybXMudGV4ZWxTaXplLnZhbHVlLnNldCgxLjAgLyB3aWR0aCwgMS4wIC8gaGVpZ2h0KSkpO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIFRoZSBTTUFBIHNlYXJjaCBpbWFnZSwgZW5jb2RlZCBhcyBhIGJhc2U2NCBkYXRhIFVSTC5cclxuICAgICAqXHJcbiAgICAgKiBVc2UgdGhpcyBpbWFnZSBkYXRhIHRvIGNyZWF0ZSBhbiBJbWFnZSBpbnN0YW5jZSBhbmQgdXNlIGl0IHRvZ2V0aGVyIHdpdGhcclxuICAgICAqIHRoZSBhcmVhIGltYWdlIHRvIGNyZWF0ZSBhbiBTTUFBUGFzcy5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7U3RyaW5nfVxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIGNvbnN0IHNlYXJjaEltYWdlID0gbmV3IEltYWdlKCk7XHJcbiAgICAgKiBzZWFyY2hJbWFnZS5hZGRFdmVudExpc3RlbmVyKFwibG9hZFwiLCBwcm9ncmVzcyk7XHJcbiAgICAgKiBzZWFyY2hJbWFnZS5zcmMgPSBTTUFBUGFzcy5zZWFyY2hJbWFnZURhdGFVUkw7XHJcbiAgICAgKi9cblxuICB9XSwgW3tcbiAgICBrZXk6IFwic2VhcmNoSW1hZ2VEYXRhVVJMXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gc2VhcmNoSW1hZ2VEYXRhVVJMO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIFRoZSBTTUFBIGFyZWEgaW1hZ2UsIGVuY29kZWQgYXMgYSBiYXNlNjQgZGF0YSBVUkwuXHJcbiAgICAgKlxyXG4gICAgICogVXNlIHRoaXMgaW1hZ2UgZGF0YSB0byBjcmVhdGUgYW4gSW1hZ2UgaW5zdGFuY2UgYW5kIHVzZSBpdCB0b2dldGhlciB3aXRoXHJcbiAgICAgKiB0aGUgc2VhcmNoIGltYWdlIHRvIGNyZWF0ZSBhbiBTTUFBUGFzcy5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7U3RyaW5nfVxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIGNvbnN0IGFyZWFJbWFnZSA9IG5ldyBJbWFnZSgpO1xyXG4gICAgICogYXJlYUltYWdlLmFkZEV2ZW50TGlzdGVuZXIoXCJsb2FkXCIsIHByb2dyZXNzKTtcclxuICAgICAqIGFyZWFJbWFnZS5zcmMgPSBTTUFBUGFzcy5hcmVhSW1hZ2VEYXRhVVJMO1xyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJhcmVhSW1hZ2VEYXRhVVJMXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gYXJlYUltYWdlRGF0YVVSTDtcbiAgICB9XG4gIH1dKTtcblxuICBpbmhlcml0cyhTTUFBUGFzcywgX1Bhc3MpO1xuXG4gIHJldHVybiBTTUFBUGFzcztcbn0oUGFzcyk7XG5cbi8qKlxyXG4gKiBBIHBhc3MgdGhhdCByZW5kZXJzIGEgZ2l2ZW4gdGV4dHVyZS5cclxuICovXG5cbnZhciBUZXh0dXJlUGFzcyA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX1Bhc3MpIHtcbiAgLyoqXHJcbiAgICogQ29uc3RydWN0cyBhIG5ldyB0ZXh0dXJlIHBhc3MuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge1RleHR1cmV9IHRleHR1cmUgLSBUaGUgdGV4dHVyZS5cclxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wYWNpdHk9MS4wXSAtIFRoZSB0ZXh0dXJlIG9wYWNpdHkuXHJcbiAgICogQHBhcmFtIHtCb29sZWFufSBbc2NyZWVuTW9kZT10cnVlXSAtIFdoZXRoZXIgdGhlIHNjcmVlbiBibGVuZCBtb2RlIHNob3VsZCBiZSB1c2VkIGZvciBjb21iaW5pbmcgdGhlIHRleHR1cmUgd2l0aCB0aGUgc2NlbmUgY29sb3JzLlxyXG4gICAqL1xuICBmdW5jdGlvbiBUZXh0dXJlUGFzcyh0ZXh0dXJlKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgdmFyIG9wYWNpdHkgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IDEuMDtcbiAgICB2YXIgc2NyZWVuTW9kZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogdHJ1ZTtcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIFRleHR1cmVQYXNzKTtcblxuICAgIF90aGlzID0gcG9zc2libGVDb25zdHJ1Y3RvclJldHVybih0aGlzLCBnZXRQcm90b3R5cGVPZiQyKFRleHR1cmVQYXNzKS5jYWxsKHRoaXMsIFwiVGV4dHVyZVBhc3NcIikpO1xuICAgIF90aGlzLm1hdGVyaWFsID0gbmV3IENvbWJpbmVNYXRlcmlhbChzY3JlZW5Nb2RlKTtcbiAgICBfdGhpcy50ZXh0dXJlID0gdGV4dHVyZTtcbiAgICBfdGhpcy5vcGFjaXR5U291cmNlID0gb3BhY2l0eTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgLyoqXHJcbiAgICogVGhlIHRleHR1cmUuXHJcbiAgICpcclxuICAgKiBAdHlwZSB7VGV4dHVyZX1cclxuICAgKi9cblxuXG4gIGNyZWF0ZUNsYXNzKFRleHR1cmVQYXNzLCBbe1xuICAgIGtleTogXCJyZW5kZXJcIixcblxuICAgIC8qKlxyXG4gICAgICogUmVuZGVycyB0aGUgZWZmZWN0LlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7V2ViR0xSZW5kZXJlcn0gcmVuZGVyZXIgLSBUaGUgcmVuZGVyZXIuXHJcbiAgICAgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSBpbnB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgY29udGFpbnMgdGhlIHJlc3VsdCBvZiB0aGUgcHJldmlvdXMgcGFzcy5cclxuICAgICAqIEBwYXJhbSB7V2ViR0xSZW5kZXJUYXJnZXR9IG91dHB1dEJ1ZmZlciAtIEEgZnJhbWUgYnVmZmVyIHRoYXQgc2VydmVzIGFzIHRoZSBvdXRwdXQgcmVuZGVyIHRhcmdldCB1bmxlc3MgdGhpcyBwYXNzIHJlbmRlcnMgdG8gc2NyZWVuLlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IFtkZWx0YV0gLSBUaGUgdGltZSBiZXR3ZWVuIHRoZSBsYXN0IGZyYW1lIGFuZCB0aGUgY3VycmVudCBvbmUgaW4gc2Vjb25kcy5cclxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gW3N0ZW5jaWxUZXN0XSAtIEluZGljYXRlcyB3aGV0aGVyIGEgc3RlbmNpbCBtYXNrIGlzIGFjdGl2ZS5cclxuICAgICAqL1xuICAgIHZhbHVlOiBmdW5jdGlvbiByZW5kZXIocmVuZGVyZXIsIGlucHV0QnVmZmVyLCBvdXRwdXRCdWZmZXIsIGRlbHRhLCBzdGVuY2lsVGVzdCkge1xuICAgICAgdGhpcy5tYXRlcmlhbC51bmlmb3Jtcy50ZXh0dXJlMS52YWx1ZSA9IGlucHV0QnVmZmVyLnRleHR1cmU7XG4gICAgICByZW5kZXJlci5yZW5kZXIodGhpcy5zY2VuZSwgdGhpcy5jYW1lcmEsIHRoaXMucmVuZGVyVG9TY3JlZW4gPyBudWxsIDogb3V0cHV0QnVmZmVyKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwidGV4dHVyZVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMubWF0ZXJpYWwudW5pZm9ybXMudGV4dHVyZTIudmFsdWU7XG4gICAgfVxuICAgIC8qKlxyXG4gICAgICogQHR5cGUge1RleHR1cmV9XHJcbiAgICAgKi9cbiAgICAsXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQodmFsdWUpIHtcbiAgICAgIHRoaXMubWF0ZXJpYWwudW5pZm9ybXMudGV4dHVyZTIudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBUaGUgb3BhY2l0eSBvZiB0aGUgaW5wdXQgYnVmZmVyLlxyXG4gICAgICpcclxuICAgICAqIFRoZSBkZXN0aW5hdGlvbiBjb2xvciBpcyB0aGUgY29sb3IgZnJvbSB0aGUgaW1hZ2UgaW4gdGhlIGlucHV0IGJ1ZmZlci5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7TnVtYmVyfVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJvcGFjaXR5RGVzdGluYXRpb25cIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLm1hdGVyaWFsLnVuaWZvcm1zLm9wYWNpdHkxLnZhbHVlO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEB0eXBlIHtOdW1iZXJ9XHJcbiAgICAgKi9cbiAgICAsXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQoKSB7XG4gICAgICB2YXIgdmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IDEuMDtcbiAgICAgIHRoaXMubWF0ZXJpYWwudW5pZm9ybXMub3BhY2l0eTEudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBUaGUgb3BhY2l0eSBvZiB0aGUgdGV4dHVyZS5cclxuICAgICAqXHJcbiAgICAgKiBUaGUgc291cmNlIGNvbG9yIGlzIHRoZSBjb2xvciBmcm9tIHRoZSB0ZXh0dXJlLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtOdW1iZXJ9XHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcIm9wYWNpdHlTb3VyY2VcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLm1hdGVyaWFsLnVuaWZvcm1zLm9wYWNpdHkyLnZhbHVlO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEB0eXBlIHtOdW1iZXJ9XHJcbiAgICAgKi9cbiAgICAsXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQoKSB7XG4gICAgICB2YXIgdmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IDEuMDtcbiAgICAgIHRoaXMubWF0ZXJpYWwudW5pZm9ybXMub3BhY2l0eTIudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG4gIH1dKTtcblxuICBpbmhlcml0cyhUZXh0dXJlUGFzcywgX1Bhc3MpO1xuXG4gIHJldHVybiBUZXh0dXJlUGFzcztcbn0oUGFzcyk7XG5cbi8qKlxyXG4gKiBBIHRvbmUgbWFwcGluZyBwYXNzIHRoYXQgc3VwcG9ydHMgYWRhcHRpdmUgbHVtaW5vc2l0eS5cclxuICpcclxuICogSWYgYWRhcHRpdml0eSBpcyBlbmFibGVkLCB0aGlzIHBhc3MgZ2VuZXJhdGVzIGEgdGV4dHVyZSB0aGF0IHJlcHJlc2VudHMgdGhlXHJcbiAqIGx1bWlub3NpdHkgb2YgdGhlIGN1cnJlbnQgc2NlbmUgYW5kIGFkanVzdHMgaXQgb3ZlciB0aW1lIHRvIHNpbXVsYXRlIHRoZVxyXG4gKiBvcHRpYyBuZXJ2ZSByZXNwb25kaW5nIHRvIHRoZSBhbW91bnQgb2YgbGlnaHQgaXQgaXMgcmVjZWl2aW5nLlxyXG4gKlxyXG4gKiBSZWZlcmVuY2U6XHJcbiAqICBHREMyMDA3IC0gV29sZmdhbmcgRW5nZWwsIFBvc3QtUHJvY2Vzc2luZyBQaXBlbGluZVxyXG4gKiAgaHR0cDovL3BlcnNvLnVuaXYtbHlvbjEuZnIvamVhbi1jbGF1ZGUuaWVobC9QdWJsaWMvZWR1Yy9HQU1BLzIwMDcvZ2RjMDcvUG9zdC1Qcm9jZXNzaW5nX1BpcGVsaW5lLnBkZlxyXG4gKi9cblxudmFyIFRvbmVNYXBwaW5nUGFzcyA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX1Bhc3MpIHtcbiAgLyoqXHJcbiAgICogQ29uc3RydWN0cyBhIG5ldyB0b25lIG1hcHBpbmcgcGFzcy5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gLSBUaGUgb3B0aW9ucy5cclxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmFkYXB0aXZlPXRydWVdIC0gV2hldGhlciB0aGUgdG9uZSBtYXBwaW5nIHNob3VsZCB1c2UgYW4gYWRhcHRpdmUgbHVtaW5hbmNlIG1hcC5cclxuICAgKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMucmVzb2x1dGlvbj0yNTZdIC0gVGhlIHJlbmRlciB0ZXh0dXJlIHJlc29sdXRpb24uXHJcbiAgICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLmRpc3RpbmN0aW9uPTEuMF0gLSBBIGx1bWluYW5jZSBkaXN0aW5jdGlvbiBmYWN0b3IuXHJcbiAgICovXG4gIGZ1bmN0aW9uIFRvbmVNYXBwaW5nUGFzcygpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBUb25lTWFwcGluZ1Bhc3MpO1xuXG4gICAgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIGdldFByb3RvdHlwZU9mJDIoVG9uZU1hcHBpbmdQYXNzKS5jYWxsKHRoaXMsIFwiVG9uZU1hcHBpbmdQYXNzXCIpKTtcbiAgICAvKipcclxuICAgICAqIFRoZSByZW5kZXIgdGFyZ2V0IGZvciB0aGUgY3VycmVudCBsdW1pbm9zaXR5LlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtXZWJHTFJlbmRlclRhcmdldH1cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBAdG9kbyBVc2UgUkVEIGZvcm1hdCBpbiBXZWJHTCAyLjAuXHJcbiAgICAgKi9cblxuICAgIF90aGlzLnJlbmRlclRhcmdldEx1bWlub3NpdHkgPSBuZXcgV2ViR0xSZW5kZXJUYXJnZXQoMSwgMSwge1xuICAgICAgbWluRmlsdGVyOiBMaW5lYXJNaXBNYXBMaW5lYXJGaWx0ZXIsXG4gICAgICBtYWdGaWx0ZXI6IExpbmVhckZpbHRlcixcbiAgICAgIGZvcm1hdDogUkdCRm9ybWF0LFxuICAgICAgc3RlbmNpbEJ1ZmZlcjogZmFsc2UsXG4gICAgICBkZXB0aEJ1ZmZlcjogZmFsc2VcbiAgICB9KTtcbiAgICBfdGhpcy5yZW5kZXJUYXJnZXRMdW1pbm9zaXR5LnRleHR1cmUubmFtZSA9IFwiVG9uZU1hcHBpbmcuTHVtaW5vc2l0eVwiO1xuICAgIC8qKlxyXG4gICAgICogVGhlIHJlbmRlciB0YXJnZXQgZm9yIGFkYXB0ZWQgbHVtaW5vc2l0eS5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7V2ViR0xSZW5kZXJUYXJnZXR9XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXG5cbiAgICBfdGhpcy5yZW5kZXJUYXJnZXRBZGFwdGVkID0gX3RoaXMucmVuZGVyVGFyZ2V0THVtaW5vc2l0eS5jbG9uZSgpO1xuICAgIF90aGlzLnJlbmRlclRhcmdldEFkYXB0ZWQudGV4dHVyZS5uYW1lID0gXCJUb25lTWFwcGluZy5BZGFwdGVkTHVtaW5vc2l0eVwiO1xuICAgIF90aGlzLnJlbmRlclRhcmdldEFkYXB0ZWQudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgPSBmYWxzZTtcbiAgICBfdGhpcy5yZW5kZXJUYXJnZXRBZGFwdGVkLnRleHR1cmUubWluRmlsdGVyID0gTGluZWFyRmlsdGVyO1xuICAgIC8qKlxyXG4gICAgICogQSByZW5kZXIgdGFyZ2V0IHRoYXQgaG9sZHMgYSBjb3B5IG9mIHRoZSBhZGFwdGVkIGxpbW9ub3NpdHkuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge1dlYkdMUmVuZGVyVGFyZ2V0fVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xuXG4gICAgX3RoaXMucmVuZGVyVGFyZ2V0UHJldmlvdXMgPSBfdGhpcy5yZW5kZXJUYXJnZXRBZGFwdGVkLmNsb25lKCk7XG4gICAgX3RoaXMucmVuZGVyVGFyZ2V0UHJldmlvdXMudGV4dHVyZS5uYW1lID0gXCJUb25lTWFwcGluZy5QcmV2aW91c0x1bWlub3NpdHlcIjtcbiAgICAvKipcclxuICAgICAqIENvcHkgc2hhZGVyIG1hdGVyaWFsIHVzZWQgZm9yIHNhdmluZyB0aGUgbHVtaW5hbmNlIG1hcC5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7Q29weU1hdGVyaWFsfVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xuXG4gICAgX3RoaXMuY29weU1hdGVyaWFsID0gbmV3IENvcHlNYXRlcmlhbCgpO1xuICAgIC8qKlxyXG4gICAgICogQSBsdW1pbm9zaXR5IHNoYWRlciBtYXRlcmlhbC5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7THVtaW5vc2l0eU1hdGVyaWFsfVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xuXG4gICAgX3RoaXMubHVtaW5vc2l0eU1hdGVyaWFsID0gbmV3IEx1bWlub3NpdHlNYXRlcmlhbCgpO1xuICAgIF90aGlzLmx1bWlub3NpdHlNYXRlcmlhbC51bmlmb3Jtcy5kaXN0aW5jdGlvbi52YWx1ZSA9IG9wdGlvbnMuZGlzdGluY3Rpb24gIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuZGlzdGluY3Rpb24gOiAxLjA7XG4gICAgLyoqXHJcbiAgICAgKiBBbiBhZGFwdGl2ZSBsdW1pbmFuY2Ugc2hhZGVyIG1hdGVyaWFsLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtBZGFwdGl2ZUx1bWlub3NpdHlNYXRlcmlhbH1cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cblxuICAgIF90aGlzLmFkYXB0aXZlTHVtaW5vc2l0eU1hdGVyaWFsID0gbmV3IEFkYXB0aXZlTHVtaW5vc2l0eU1hdGVyaWFsKCk7XG4gICAgX3RoaXMucmVzb2x1dGlvbiA9IG9wdGlvbnMucmVzb2x1dGlvbjtcbiAgICAvKipcclxuICAgICAqIEEgdG9uZSBtYXBwaW5nIHNoYWRlciBtYXRlcmlhbC5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7VG9uZU1hcHBpbmdNYXRlcmlhbH1cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cblxuICAgIF90aGlzLnRvbmVNYXBwaW5nTWF0ZXJpYWwgPSBuZXcgVG9uZU1hcHBpbmdNYXRlcmlhbCgpO1xuICAgIF90aGlzLmFkYXB0aXZlID0gb3B0aW9ucy5hZGFwdGl2ZTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cbiAgLyoqXHJcbiAgICogVGhlIHJlc29sdXRpb24gb2YgdGhlIHJlbmRlciB0YXJnZXRzLlxyXG4gICAqXHJcbiAgICogQHR5cGUge051bWJlcn1cclxuICAgKi9cblxuXG4gIGNyZWF0ZUNsYXNzKFRvbmVNYXBwaW5nUGFzcywgW3tcbiAgICBrZXk6IFwicmVuZGVyXCIsXG5cbiAgICAvKipcclxuICAgICAqIFJlbmRlcnMgdGhlIGVmZmVjdC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1dlYkdMUmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG4gICAgICogQHBhcmFtIHtXZWJHTFJlbmRlclRhcmdldH0gaW5wdXRCdWZmZXIgLSBBIGZyYW1lIGJ1ZmZlciB0aGF0IGNvbnRhaW5zIHRoZSByZXN1bHQgb2YgdGhlIHByZXZpb3VzIHBhc3MuXHJcbiAgICAgKiBAcGFyYW0ge1dlYkdMUmVuZGVyVGFyZ2V0fSBvdXRwdXRCdWZmZXIgLSBBIGZyYW1lIGJ1ZmZlciB0aGF0IHNlcnZlcyBhcyB0aGUgb3V0cHV0IHJlbmRlciB0YXJnZXQgdW5sZXNzIHRoaXMgcGFzcyByZW5kZXJzIHRvIHNjcmVlbi5cclxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBbZGVsdGFdIC0gVGhlIHRpbWUgYmV0d2VlbiB0aGUgbGFzdCBmcmFtZSBhbmQgdGhlIGN1cnJlbnQgb25lIGluIHNlY29uZHMuXHJcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtzdGVuY2lsVGVzdF0gLSBJbmRpY2F0ZXMgd2hldGhlciBhIHN0ZW5jaWwgbWFzayBpcyBhY3RpdmUuXHJcbiAgICAgKi9cbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKHJlbmRlcmVyLCBpbnB1dEJ1ZmZlciwgb3V0cHV0QnVmZmVyLCBkZWx0YSwgc3RlbmNpbFRlc3QpIHtcbiAgICAgIHZhciBzY2VuZSA9IHRoaXMuc2NlbmU7XG4gICAgICB2YXIgY2FtZXJhID0gdGhpcy5jYW1lcmE7XG4gICAgICB2YXIgYWRhcHRpdmVMdW1pbm9zaXR5TWF0ZXJpYWwgPSB0aGlzLmFkYXB0aXZlTHVtaW5vc2l0eU1hdGVyaWFsO1xuICAgICAgdmFyIGx1bWlub3NpdHlNYXRlcmlhbCA9IHRoaXMubHVtaW5vc2l0eU1hdGVyaWFsO1xuICAgICAgdmFyIHRvbmVNYXBwaW5nTWF0ZXJpYWwgPSB0aGlzLnRvbmVNYXBwaW5nTWF0ZXJpYWw7XG4gICAgICB2YXIgY29weU1hdGVyaWFsID0gdGhpcy5jb3B5TWF0ZXJpYWw7XG4gICAgICB2YXIgcmVuZGVyVGFyZ2V0UHJldmlvdXMgPSB0aGlzLnJlbmRlclRhcmdldFByZXZpb3VzO1xuICAgICAgdmFyIHJlbmRlclRhcmdldEx1bWlub3NpdHkgPSB0aGlzLnJlbmRlclRhcmdldEx1bWlub3NpdHk7XG4gICAgICB2YXIgcmVuZGVyVGFyZ2V0QWRhcHRlZCA9IHRoaXMucmVuZGVyVGFyZ2V0QWRhcHRlZDtcblxuICAgICAgaWYgKHRoaXMuYWRhcHRpdmUpIHtcbiAgICAgICAgLy8gUmVuZGVyIHRoZSBsdW1pbmFuY2Ugb2YgdGhlIGN1cnJlbnQgc2NlbmUgaW50byBhIHJlbmRlciB0YXJnZXQgd2l0aCBtaXBtYXBwaW5nIGVuYWJsZWQuXG4gICAgICAgIHRoaXMubWF0ZXJpYWwgPSBsdW1pbm9zaXR5TWF0ZXJpYWw7XG4gICAgICAgIGx1bWlub3NpdHlNYXRlcmlhbC51bmlmb3Jtcy50RGlmZnVzZS52YWx1ZSA9IGlucHV0QnVmZmVyLnRleHR1cmU7XG4gICAgICAgIHJlbmRlcmVyLnJlbmRlcihzY2VuZSwgY2FtZXJhLCByZW5kZXJUYXJnZXRMdW1pbm9zaXR5KTsgLy8gVXNlIHRoZSBuZXcgbHVtaW5hbmNlIHZhbHVlcywgdGhlIHByZXZpb3VzIGx1bWluYW5jZSBhbmQgdGhlIGZyYW1lIGRlbHRhIHRvIGFkYXB0IHRoZSBsdW1pbmFuY2Ugb3ZlciB0aW1lLlxuXG4gICAgICAgIHRoaXMubWF0ZXJpYWwgPSBhZGFwdGl2ZUx1bWlub3NpdHlNYXRlcmlhbDtcbiAgICAgICAgYWRhcHRpdmVMdW1pbm9zaXR5TWF0ZXJpYWwudW5pZm9ybXMuZGVsdGEudmFsdWUgPSBkZWx0YTtcbiAgICAgICAgYWRhcHRpdmVMdW1pbm9zaXR5TWF0ZXJpYWwudW5pZm9ybXMudFByZXZpb3VzTHVtLnZhbHVlID0gcmVuZGVyVGFyZ2V0UHJldmlvdXMudGV4dHVyZTtcbiAgICAgICAgYWRhcHRpdmVMdW1pbm9zaXR5TWF0ZXJpYWwudW5pZm9ybXMudEN1cnJlbnRMdW0udmFsdWUgPSByZW5kZXJUYXJnZXRMdW1pbm9zaXR5LnRleHR1cmU7XG4gICAgICAgIHJlbmRlcmVyLnJlbmRlcihzY2VuZSwgY2FtZXJhLCByZW5kZXJUYXJnZXRBZGFwdGVkKTsgLy8gQ29weSB0aGUgbmV3IGFkYXB0ZWQgbHVtaW5hbmNlIHZhbHVlIHNvIHRoYXQgaXQgY2FuIGJlIHVzZWQgYnkgdGhlIG5leHQgZnJhbWUuXG5cbiAgICAgICAgdGhpcy5tYXRlcmlhbCA9IGNvcHlNYXRlcmlhbDtcbiAgICAgICAgY29weU1hdGVyaWFsLnVuaWZvcm1zLnREaWZmdXNlLnZhbHVlID0gcmVuZGVyVGFyZ2V0QWRhcHRlZC50ZXh0dXJlO1xuICAgICAgICByZW5kZXJlci5yZW5kZXIoc2NlbmUsIGNhbWVyYSwgcmVuZGVyVGFyZ2V0UHJldmlvdXMpO1xuICAgICAgfSAvLyBBcHBseSB0aGUgdG9uZSBtYXBwaW5nIHRvIHRoZSBjb2xvdXJzLlxuXG5cbiAgICAgIHRoaXMubWF0ZXJpYWwgPSB0b25lTWFwcGluZ01hdGVyaWFsO1xuICAgICAgdG9uZU1hcHBpbmdNYXRlcmlhbC51bmlmb3Jtcy50RGlmZnVzZS52YWx1ZSA9IGlucHV0QnVmZmVyLnRleHR1cmU7XG4gICAgICByZW5kZXJlci5yZW5kZXIodGhpcy5zY2VuZSwgdGhpcy5jYW1lcmEsIHRoaXMucmVuZGVyVG9TY3JlZW4gPyBudWxsIDogb3V0cHV0QnVmZmVyKTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBQZXJmb3JtcyBpbml0aWFsaXphdGlvbiB0YXNrcy5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1dlYkdMUmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIHJlbmRlcmVyLlxyXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBhbHBoYSAtIFdoZXRoZXIgdGhlIHJlbmRlcmVyIHVzZXMgdGhlIGFscGhhIGNoYW5uZWwgb3Igbm90LlxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJpbml0aWFsaXplXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGluaXRpYWxpemUocmVuZGVyZXIsIGFscGhhKSB7XG4gICAgICB0aGlzLm1hdGVyaWFsID0gbmV3IE1lc2hCYXNpY01hdGVyaWFsKHtcbiAgICAgICAgY29sb3I6IDB4N2ZmZmZmXG4gICAgICB9KTtcbiAgICAgIHJlbmRlcmVyLnJlbmRlcih0aGlzLnNjZW5lLCB0aGlzLmNhbWVyYSwgdGhpcy5yZW5kZXJUYXJnZXRQcmV2aW91cyk7XG4gICAgICB0aGlzLm1hdGVyaWFsLmRpc3Bvc2UoKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwicmVzb2x1dGlvblwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMucmVuZGVyVGFyZ2V0THVtaW5vc2l0eS53aWR0aDtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBUaGUgcmVzb2x1dGlvbiBvZiB0aGUgcmVuZGVyIHRhcmdldHMuIE11c3QgYmUgYSBwb3dlciBvZiB0d28gZm9yIG1pcG1hcHMuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge051bWJlcn1cclxuICAgICAqL1xuICAgICxcbiAgICBzZXQ6IGZ1bmN0aW9uIHNldCgpIHtcbiAgICAgIHZhciB2YWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogMjU2O1xuICAgICAgLy8gUm91bmQgdGhlIGdpdmVuIHZhbHVlIHRvIHRoZSBuZXh0IHBvd2VyIG9mIHR3by5cbiAgICAgIHZhciBleHBvbmVudCA9IE1hdGgubWF4KDAsIE1hdGguY2VpbChNYXRoLmxvZzIodmFsdWUpKSk7XG4gICAgICB2YWx1ZSA9IE1hdGgucG93KDIsIGV4cG9uZW50KTtcbiAgICAgIHRoaXMucmVuZGVyVGFyZ2V0THVtaW5vc2l0eS5zZXRTaXplKHZhbHVlLCB2YWx1ZSk7XG4gICAgICB0aGlzLnJlbmRlclRhcmdldFByZXZpb3VzLnNldFNpemUodmFsdWUsIHZhbHVlKTtcbiAgICAgIHRoaXMucmVuZGVyVGFyZ2V0QWRhcHRlZC5zZXRTaXplKHZhbHVlLCB2YWx1ZSk7XG4gICAgICB0aGlzLmFkYXB0aXZlTHVtaW5vc2l0eU1hdGVyaWFsLmRlZmluZXMuTUlQX0xFVkVMXzFYMSA9IGV4cG9uZW50LnRvRml4ZWQoMSk7XG4gICAgICB0aGlzLmFkYXB0aXZlTHVtaW5vc2l0eU1hdGVyaWFsLm5lZWRzVXBkYXRlID0gdHJ1ZTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBXaGV0aGVyIHRoaXMgcGFzcyB1c2VzIGFkYXB0aXZlIGx1bWlub3NpdHkuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge0Jvb2xlYW59XHJcbiAgICAgKiBAZGVmYXVsdCB0cnVlXHJcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImFkYXB0aXZlXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy50b25lTWFwcGluZ01hdGVyaWFsLmRlZmluZXMuQURBUFRFRF9MVU1JTkFOQ0UgIT09IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBXaGV0aGVyIHRoaXMgcGFzcyBzaG91bGQgdXNlIGFkYXB0aXZlIGx1bWlub3NpdHkuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge0Jvb2xlYW59XHJcbiAgICAgKi9cbiAgICAsXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQoKSB7XG4gICAgICB2YXIgdmFsdWUgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHRydWU7XG5cbiAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICB0aGlzLnRvbmVNYXBwaW5nTWF0ZXJpYWwuZGVmaW5lcy5BREFQVEVEX0xVTUlOQU5DRSA9IFwiMVwiO1xuICAgICAgICB0aGlzLnRvbmVNYXBwaW5nTWF0ZXJpYWwudW5pZm9ybXMubHVtaW5hbmNlTWFwLnZhbHVlID0gdGhpcy5yZW5kZXJUYXJnZXRBZGFwdGVkLnRleHR1cmU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUgdGhpcy50b25lTWFwcGluZ01hdGVyaWFsLmRlZmluZXMuQURBUFRFRF9MVU1JTkFOQ0U7XG4gICAgICAgIHRoaXMudG9uZU1hcHBpbmdNYXRlcmlhbC51bmlmb3Jtcy5sdW1pbmFuY2VNYXAudmFsdWUgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnRvbmVNYXBwaW5nTWF0ZXJpYWwubmVlZHNVcGRhdGUgPSB0cnVlO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEluZGljYXRlcyB3aGV0aGVyIGRpdGhlcmluZyBpcyBlbmFibGVkLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtCb29sZWFufVxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJkaXRoZXJpbmdcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnRvbmVNYXBwaW5nTWF0ZXJpYWwuZGl0aGVyaW5nO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIElmIGVuYWJsZWQsIHRoZSByZXN1bHQgd2lsbCBiZSBkaXRoZXJlZCB0byByZW1vdmUgYmFuZGluZyBhcnRpZmFjdHMuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge0Jvb2xlYW59XHJcbiAgICAgKi9cbiAgICAsXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQodmFsdWUpIHtcbiAgICAgIGlmICh0aGlzLmRpdGhlcmluZyAhPT0gdmFsdWUpIHtcbiAgICAgICAgdGhpcy50b25lTWFwcGluZ01hdGVyaWFsLmRpdGhlcmluZyA9IHZhbHVlO1xuICAgICAgICB0aGlzLnRvbmVNYXBwaW5nTWF0ZXJpYWwubmVlZHNVcGRhdGUgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfV0pO1xuXG4gIGluaGVyaXRzKFRvbmVNYXBwaW5nUGFzcywgX1Bhc3MpO1xuXG4gIHJldHVybiBUb25lTWFwcGluZ1Bhc3M7XG59KFBhc3MpO1xuXG4vKipcclxuICogQSBjb21waWxhdGlvbiBvZiB0aGUgcG9zdCBwcm9jZXNzaW5nIHBhc3Nlcy5cclxuICpcclxuICogQG1vZHVsZSBwb3N0cHJvY2Vzc2luZy9wYXNzZXNcclxuICovXG5cbi8qKlxyXG4gKiBUaGUgRWZmZWN0Q29tcG9zZXIgbWF5IGJlIHVzZWQgaW4gcGxhY2Ugb2YgYSBub3JtYWwgV2ViR0xSZW5kZXJlci5cclxuICpcclxuICogVGhlIGF1dG8gY2xlYXIgYmVoYXZpb3VyIG9mIHRoZSBwcm92aWRlZCByZW5kZXJlciB3aWxsIGJlIGRpc2FibGVkIHRvIHByZXZlbnRcclxuICogdW5uZWNlc3NhcnkgY2xlYXIgb3BlcmF0aW9ucy5cclxuICpcclxuICogSXQgaXMgY29tbW9uIHByYWN0aWNlIHRvIHVzZSBhIHtAbGluayBSZW5kZXJQYXNzfSBhcyB0aGUgZmlyc3QgcGFzcyB0b1xyXG4gKiBhdXRvbWF0aWNhbGx5IGNsZWFyIHRoZSBzY3JlZW4gYW5kIHJlbmRlciB0aGUgc2NlbmUgdG8gYSB0ZXh0dXJlIGZvciBmdXJ0aGVyXHJcbiAqIHByb2Nlc3NpbmcuXHJcbiAqXHJcbiAqIEBpbXBsZW1lbnRzIHtSZXNpemFibGV9XHJcbiAqIEBpbXBsZW1lbnRzIHtEaXNwb3NhYmxlfVxyXG4gKi9cblxudmFyIEVmZmVjdENvbXBvc2VyID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uICgpIHtcbiAgLyoqXHJcbiAgICogQ29uc3RydWN0cyBhIG5ldyBlZmZlY3QgY29tcG9zZXIuXHJcbiAgICpcclxuICAgKiBAcGFyYW0ge1dlYkdMUmVuZGVyZXJ9IFtyZW5kZXJlcl0gLSBUaGUgcmVuZGVyZXIgdGhhdCBzaG91bGQgYmUgdXNlZC5cclxuICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIC0gVGhlIG9wdGlvbnMuXHJcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5kZXB0aEJ1ZmZlcj10cnVlXSAtIFdoZXRoZXIgdGhlIG1haW4gcmVuZGVyIHRhcmdldHMgc2hvdWxkIGhhdmUgYSBkZXB0aCBidWZmZXIuXHJcbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5zdGVuY2lsQnVmZmVyPWZhbHNlXSAtIFdoZXRoZXIgdGhlIG1haW4gcmVuZGVyIHRhcmdldHMgc2hvdWxkIGhhdmUgYSBzdGVuY2lsIGJ1ZmZlci5cclxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLmRlcHRoVGV4dHVyZT1mYWxzZV0gLSBTZXQgdG8gdHJ1ZSBpZiBvbmUgb2YgeW91ciBwYXNzZXMgcmVsaWVzIG9uIGEgZGVwdGggdGV4dHVyZS5cclxuICAgKi9cbiAgZnVuY3Rpb24gRWZmZWN0Q29tcG9zZXIoKSB7XG4gICAgdmFyIHJlbmRlcmVyID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBudWxsO1xuICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIEVmZmVjdENvbXBvc2VyKTtcblxuICAgIC8qKlxyXG4gICAgICogVGhlIHJlbmRlcmVyLlxyXG4gICAgICpcclxuICAgICAqIFlvdSBtYXkgcmVwbGFjZSB0aGUgcmVuZGVyZXIgYXQgYW55IHRpbWUgYnkgdXNpbmdcclxuICAgICAqIHtAbGluayBFZmZlY3RDb21wb3NlciNyZXBsYWNlUmVuZGVyZXJ9LlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtXZWJHTFJlbmRlcmVyfVxyXG4gICAgICovXG4gICAgdGhpcy5yZW5kZXJlciA9IHJlbmRlcmVyO1xuICAgIC8qKlxyXG4gICAgICogVGhlIGlucHV0IGJ1ZmZlci5cclxuICAgICAqXHJcbiAgICAgKiBSZWFkaW5nIGZyb20gYW5kIHdyaXRpbmcgdG8gdGhlIHNhbWUgcmVuZGVyIHRhcmdldCBzaG91bGQgYmUgYXZvaWRlZC5cclxuICAgICAqIFRoZXJlZm9yZSwgdHdvIHNlcGVyYXRlIHlldCBpZGVudGljYWwgYnVmZmVycyBhcmUgdXNlZC5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7V2ViR0xSZW5kZXJUYXJnZXR9XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXG5cbiAgICB0aGlzLmlucHV0QnVmZmVyID0gbnVsbDtcbiAgICAvKipcclxuICAgICAqIFRoZSBvdXRwdXQgYnVmZmVyLlxyXG4gICAgICpcclxuICAgICAqIEB0eXBlIHtXZWJHTFJlbmRlclRhcmdldH1cclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKi9cblxuICAgIHRoaXMub3V0cHV0QnVmZmVyID0gbnVsbDtcblxuICAgIGlmICh0aGlzLnJlbmRlcmVyICE9PSBudWxsKSB7XG4gICAgICB0aGlzLnJlbmRlcmVyLmF1dG9DbGVhciA9IGZhbHNlO1xuICAgICAgdGhpcy5pbnB1dEJ1ZmZlciA9IHRoaXMuY3JlYXRlQnVmZmVyKG9wdGlvbnMuZGVwdGhCdWZmZXIgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuZGVwdGhCdWZmZXIgOiB0cnVlLCBvcHRpb25zLnN0ZW5jaWxCdWZmZXIgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuc3RlbmNpbEJ1ZmZlciA6IGZhbHNlLCBvcHRpb25zLmRlcHRoVGV4dHVyZSAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5kZXB0aFRleHR1cmUgOiBmYWxzZSk7XG4gICAgICB0aGlzLm91dHB1dEJ1ZmZlciA9IHRoaXMuaW5wdXRCdWZmZXIuY2xvbmUoKTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBBIGNvcHkgcGFzcyB1c2VkIGZvciBjb3B5aW5nIG1hc2tlZCBzY2VuZXMuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge1NoYWRlclBhc3N9XHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXG5cblxuICAgIHRoaXMuY29weVBhc3MgPSBuZXcgU2hhZGVyUGFzcyhuZXcgQ29weU1hdGVyaWFsKCkpO1xuICAgIC8qKlxyXG4gICAgICogVGhlIHBhc3Nlcy5cclxuICAgICAqXHJcbiAgICAgKiBAdHlwZSB7UGFzc1tdfVxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xuXG4gICAgdGhpcy5wYXNzZXMgPSBbXTtcbiAgfVxuICAvKipcclxuICAgKiBUaGUgZGVwdGggdGV4dHVyZSBvZiB0aGUgaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzLlxyXG4gICAqXHJcbiAgICogQHR5cGUge0RlcHRoVGV4dHVyZX1cclxuICAgKi9cblxuXG4gIGNyZWF0ZUNsYXNzKEVmZmVjdENvbXBvc2VyLCBbe1xuICAgIGtleTogXCJyZXBsYWNlUmVuZGVyZXJcIixcblxuICAgIC8qKlxyXG4gICAgICogUmVwbGFjZXMgdGhlIGN1cnJlbnQgcmVuZGVyZXIgd2l0aCB0aGUgZ2l2ZW4gb25lLiBUaGUgRE9NIGVsZW1lbnQgb2YgdGhlXHJcbiAgICAgKiBjdXJyZW50IHJlbmRlcmVyIHdpbGwgYXV0b21hdGljYWxseSBiZSByZW1vdmVkIGZyb20gaXRzIHBhcmVudCBub2RlIGFuZCB0aGVcclxuICAgICAqIERPTSBlbGVtZW50IG9mIHRoZSBuZXcgcmVuZGVyZXIgd2lsbCB0YWtlIGl0cyBwbGFjZS5cclxuICAgICAqXHJcbiAgICAgKiBUaGUgYXV0byBjbGVhciBtZWNoYW5pc20gb2YgdGhlIHByb3ZpZGVkIHJlbmRlcmVyIHdpbGwgYmUgZGlzYWJsZWQuXHJcbiAgICAgKlxyXG4gICAgICogU3dpdGNoaW5nIGJldHdlZW4gcmVuZGVyZXJzIGFsbG93cyB5b3UgdG8gZHluYW1pY2FsbHkgZW5hYmxlIG9yIGRpc2FibGVcclxuICAgICAqIGFudGlhbGlhc2luZy5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1dlYkdMUmVuZGVyZXJ9IHJlbmRlcmVyIC0gVGhlIG5ldyByZW5kZXJlci5cclxuICAgICAqIEByZXR1cm4ge1dlYkdMUmVuZGVyZXJ9IFRoZSBvbGQgcmVuZGVyZXIuXHJcbiAgICAgKi9cbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVwbGFjZVJlbmRlcmVyKHJlbmRlcmVyKSB7XG4gICAgICB2YXIgb2xkUmVuZGVyZXIgPSB0aGlzLnJlbmRlcmVyO1xuICAgICAgdmFyIHBhcmVudCwgb2xkU2l6ZSwgbmV3U2l6ZTtcblxuICAgICAgaWYgKG9sZFJlbmRlcmVyICE9PSBudWxsICYmIG9sZFJlbmRlcmVyICE9PSByZW5kZXJlcikge1xuICAgICAgICB0aGlzLnJlbmRlcmVyID0gcmVuZGVyZXI7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuYXV0b0NsZWFyID0gZmFsc2U7XG4gICAgICAgIHBhcmVudCA9IG9sZFJlbmRlcmVyLmRvbUVsZW1lbnQucGFyZW50Tm9kZTtcbiAgICAgICAgb2xkU2l6ZSA9IG9sZFJlbmRlcmVyLmdldFNpemUoKTtcbiAgICAgICAgbmV3U2l6ZSA9IHJlbmRlcmVyLmdldFNpemUoKTtcblxuICAgICAgICBpZiAocGFyZW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgcGFyZW50LnJlbW92ZUNoaWxkKG9sZFJlbmRlcmVyLmRvbUVsZW1lbnQpO1xuICAgICAgICAgIHBhcmVudC5hcHBlbmRDaGlsZChyZW5kZXJlci5kb21FbGVtZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvbGRTaXplLndpZHRoICE9PSBuZXdTaXplLndpZHRoIHx8IG9sZFNpemUuaGVpZ2h0ICE9PSBuZXdTaXplLmhlaWdodCkge1xuICAgICAgICAgIHRoaXMuc2V0U2l6ZSgpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvbGRSZW5kZXJlcjtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHJlbmRlciB0YXJnZXQgYnkgcmVwbGljYXRpbmcgdGhlIHJlbmRlcmVyJ3MgY2FudmFzLlxyXG4gICAgICpcclxuICAgICAqIFRoZSBjcmVhdGVkIHJlbmRlciB0YXJnZXQgdXNlcyBhIGxpbmVhciBmaWx0ZXIgZm9yIHRleGVsIG1pbmlmaWNhdGlvbiBhbmRcclxuICAgICAqIG1hZ25pZmljYXRpb24uIEl0cyByZW5kZXIgdGV4dHVyZSBmb3JtYXQgZGVwZW5kcyBvbiB3aGV0aGVyIHRoZSByZW5kZXJlclxyXG4gICAgICogdXNlcyB0aGUgYWxwaGEgY2hhbm5lbC4gTWlwbWFwcyBhcmUgZGlzYWJsZWQuXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBkZXB0aEJ1ZmZlciAtIFdoZXRoZXIgdGhlIHJlbmRlciB0YXJnZXQgc2hvdWxkIGhhdmUgYSBkZXB0aCBidWZmZXIuXHJcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IHN0ZW5jaWxCdWZmZXIgLSBXaGV0aGVyIHRoZSByZW5kZXIgdGFyZ2V0IHNob3VsZCBoYXZlIGEgc3RlbmNpbCBidWZmZXIuXHJcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGRlcHRoVGV4dHVyZSAtIFdoZXRoZXIgdGhlIHJlbmRlciB0YXJnZXQgc2hvdWxkIGhhdmUgYSBkZXB0aCB0ZXh0dXJlLlxyXG4gICAgICogQHJldHVybiB7V2ViR0xSZW5kZXJUYXJnZXR9IEEgbmV3IHJlbmRlciB0YXJnZXQgdGhhdCBlcXVhbHMgdGhlIHJlbmRlcmVyJ3MgY2FudmFzLlxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJjcmVhdGVCdWZmZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY3JlYXRlQnVmZmVyKGRlcHRoQnVmZmVyLCBzdGVuY2lsQnVmZmVyLCBkZXB0aFRleHR1cmUpIHtcbiAgICAgIHZhciBkcmF3aW5nQnVmZmVyU2l6ZSA9IHRoaXMucmVuZGVyZXIuZ2V0RHJhd2luZ0J1ZmZlclNpemUoKTtcbiAgICAgIHZhciBhbHBoYSA9IHRoaXMucmVuZGVyZXIuY29udGV4dC5nZXRDb250ZXh0QXR0cmlidXRlcygpLmFscGhhO1xuICAgICAgdmFyIHJlbmRlclRhcmdldCA9IG5ldyBXZWJHTFJlbmRlclRhcmdldChkcmF3aW5nQnVmZmVyU2l6ZS53aWR0aCwgZHJhd2luZ0J1ZmZlclNpemUuaGVpZ2h0LCB7XG4gICAgICAgIG1pbkZpbHRlcjogTGluZWFyRmlsdGVyLFxuICAgICAgICBtYWdGaWx0ZXI6IExpbmVhckZpbHRlcixcbiAgICAgICAgZm9ybWF0OiBhbHBoYSA/IFJHQkFGb3JtYXQgOiBSR0JGb3JtYXQsXG4gICAgICAgIGRlcHRoQnVmZmVyOiBkZXB0aEJ1ZmZlcixcbiAgICAgICAgc3RlbmNpbEJ1ZmZlcjogc3RlbmNpbEJ1ZmZlcixcbiAgICAgICAgZGVwdGhUZXh0dXJlOiBkZXB0aFRleHR1cmUgPyBuZXcgRGVwdGhUZXh0dXJlKCkgOiBudWxsXG4gICAgICB9KTtcblxuICAgICAgaWYgKGRlcHRoVGV4dHVyZSAmJiBzdGVuY2lsQnVmZmVyKSB7XG4gICAgICAgIHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUuZm9ybWF0ID0gRGVwdGhTdGVuY2lsRm9ybWF0O1xuICAgICAgICByZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlLnR5cGUgPSBVbnNpZ25lZEludDI0OFR5cGU7XG4gICAgICB9XG5cbiAgICAgIHJlbmRlclRhcmdldC50ZXh0dXJlLm5hbWUgPSBcIkVmZmVjdENvbXBvc2VyLkJ1ZmZlclwiO1xuICAgICAgcmVuZGVyVGFyZ2V0LnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzID0gZmFsc2U7XG4gICAgICByZXR1cm4gcmVuZGVyVGFyZ2V0O1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIEFkZHMgYSBwYXNzLCBvcHRpb25hbGx5IGF0IGEgc3BlY2lmaWMgaW5kZXguXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtQYXNzfSBwYXNzIC0gQSBuZXcgcGFzcy5cclxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBbaW5kZXhdIC0gQW4gaW5kZXggYXQgd2hpY2ggdGhlIHBhc3Mgc2hvdWxkIGJlIGluc2VydGVkLlxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJhZGRQYXNzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGFkZFBhc3MocGFzcywgaW5kZXgpIHtcbiAgICAgIHZhciByZW5kZXJlciA9IHRoaXMucmVuZGVyZXI7XG4gICAgICB2YXIgZHJhd2luZ0J1ZmZlclNpemUgPSByZW5kZXJlci5nZXREcmF3aW5nQnVmZmVyU2l6ZSgpO1xuICAgICAgcGFzcy5zZXRTaXplKGRyYXdpbmdCdWZmZXJTaXplLndpZHRoLCBkcmF3aW5nQnVmZmVyU2l6ZS5oZWlnaHQpO1xuICAgICAgcGFzcy5pbml0aWFsaXplKHJlbmRlcmVyLCByZW5kZXJlci5jb250ZXh0LmdldENvbnRleHRBdHRyaWJ1dGVzKCkuYWxwaGEpO1xuXG4gICAgICBpZiAoaW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLnBhc3Nlcy5zcGxpY2UoaW5kZXgsIDAsIHBhc3MpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5wYXNzZXMucHVzaChwYXNzKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIGEgcGFzcy5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge1Bhc3N9IHBhc3MgLSBUaGUgcGFzcy5cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwicmVtb3ZlUGFzc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiByZW1vdmVQYXNzKHBhc3MpIHtcbiAgICAgIHRoaXMucGFzc2VzLnNwbGljZSh0aGlzLnBhc3Nlcy5pbmRleE9mKHBhc3MpLCAxKTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBSZW5kZXJzIGFsbCBlbmFibGVkIHBhc3NlcyBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSB3ZXJlIGFkZGVkLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBkZWx0YSAtIFRoZSB0aW1lIGJldHdlZW4gdGhlIGxhc3QgZnJhbWUgYW5kIHRoZSBjdXJyZW50IG9uZSBpbiBzZWNvbmRzLlxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJyZW5kZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyKGRlbHRhKSB7XG4gICAgICB2YXIgcGFzc2VzID0gdGhpcy5wYXNzZXM7XG4gICAgICB2YXIgY29weVBhc3MgPSB0aGlzLmNvcHlQYXNzO1xuICAgICAgdmFyIHJlbmRlcmVyID0gdGhpcy5yZW5kZXJlcjtcbiAgICAgIHZhciBpbnB1dEJ1ZmZlciA9IHRoaXMuaW5wdXRCdWZmZXI7XG4gICAgICB2YXIgb3V0cHV0QnVmZmVyID0gdGhpcy5vdXRwdXRCdWZmZXI7XG4gICAgICB2YXIgc3RlbmNpbFRlc3QgPSBmYWxzZTtcbiAgICAgIHZhciBwYXNzLCBjb250ZXh0LCBzdGF0ZSwgYnVmZmVyO1xuICAgICAgdmFyIGksIGw7XG5cbiAgICAgIGZvciAoaSA9IDAsIGwgPSBwYXNzZXMubGVuZ3RoOyBpIDwgbDsgKytpKSB7XG4gICAgICAgIHBhc3MgPSBwYXNzZXNbaV07XG5cbiAgICAgICAgaWYgKHBhc3MuZW5hYmxlZCkge1xuICAgICAgICAgIHBhc3MucmVuZGVyKHJlbmRlcmVyLCBpbnB1dEJ1ZmZlciwgb3V0cHV0QnVmZmVyLCBkZWx0YSwgc3RlbmNpbFRlc3QpO1xuXG4gICAgICAgICAgaWYgKHBhc3MubmVlZHNTd2FwKSB7XG4gICAgICAgICAgICBpZiAoc3RlbmNpbFRlc3QpIHtcbiAgICAgICAgICAgICAgY29weVBhc3MucmVuZGVyVG9TY3JlZW4gPSBwYXNzLnJlbmRlclRvU2NyZWVuO1xuICAgICAgICAgICAgICBjb250ZXh0ID0gcmVuZGVyZXIuY29udGV4dDtcbiAgICAgICAgICAgICAgc3RhdGUgPSByZW5kZXJlci5zdGF0ZTsgLy8gUHJlc2VydmUgdGhlIHVuYWZmZWN0ZWQgcGl4ZWxzLlxuXG4gICAgICAgICAgICAgIHN0YXRlLmJ1ZmZlcnMuc3RlbmNpbC5zZXRGdW5jKGNvbnRleHQuTk9URVFVQUwsIDEsIDB4ZmZmZmZmZmYpO1xuICAgICAgICAgICAgICBjb3B5UGFzcy5yZW5kZXIocmVuZGVyZXIsIGlucHV0QnVmZmVyLCBvdXRwdXRCdWZmZXIsIGRlbHRhLCBzdGVuY2lsVGVzdCk7XG4gICAgICAgICAgICAgIHN0YXRlLmJ1ZmZlcnMuc3RlbmNpbC5zZXRGdW5jKGNvbnRleHQuRVFVQUwsIDEsIDB4ZmZmZmZmZmYpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBidWZmZXIgPSBpbnB1dEJ1ZmZlcjtcbiAgICAgICAgICAgIGlucHV0QnVmZmVyID0gb3V0cHV0QnVmZmVyO1xuICAgICAgICAgICAgb3V0cHV0QnVmZmVyID0gYnVmZmVyO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChwYXNzIGluc3RhbmNlb2YgTWFza1Bhc3MpIHtcbiAgICAgICAgICAgIHN0ZW5jaWxUZXN0ID0gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHBhc3MgaW5zdGFuY2VvZiBDbGVhck1hc2tQYXNzKSB7XG4gICAgICAgICAgICBzdGVuY2lsVGVzdCA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIHNpemUgb2YgdGhlIGJ1ZmZlcnMgYW5kIHRoZSByZW5kZXJlcidzIG91dHB1dCBjYW52YXMuXHJcbiAgICAgKlxyXG4gICAgICogRXZlcnkgcGFzcyB3aWxsIGJlIGluZm9ybWVkIG9mIHRoZSBuZXcgc2l6ZS4gSXQncyB1cCB0byBlYWNoIHBhc3MgaG93IHRoYXRcclxuICAgICAqIGluZm9ybWF0aW9uIGlzIHVzZWQuXHJcbiAgICAgKlxyXG4gICAgICogSWYgbm8gd2lkdGggb3IgaGVpZ2h0IGlzIHNwZWNpZmllZCwgdGhlIHJlbmRlciB0YXJnZXRzIGFuZCBwYXNzZXMgd2lsbCBiZVxyXG4gICAgICogdXBkYXRlZCB3aXRoIHRoZSBjdXJyZW50IHNpemUgb2YgdGhlIHJlbmRlcmVyLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBbd2lkdGhdIC0gVGhlIHdpZHRoLlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IFtoZWlnaHRdIC0gVGhlIGhlaWdodC5cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwic2V0U2l6ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRTaXplKHdpZHRoLCBoZWlnaHQpIHtcbiAgICAgIHZhciBwYXNzZXMgPSB0aGlzLnBhc3NlcztcbiAgICAgIHZhciByZW5kZXJlciA9IHRoaXMucmVuZGVyZXI7XG4gICAgICB2YXIgc2l6ZSwgZHJhd2luZ0J1ZmZlclNpemU7XG4gICAgICB2YXIgaSwgbDtcblxuICAgICAgaWYgKHdpZHRoID09PSB1bmRlZmluZWQgfHwgaGVpZ2h0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgc2l6ZSA9IHJlbmRlcmVyLmdldFNpemUoKTtcbiAgICAgICAgd2lkdGggPSBzaXplLndpZHRoO1xuICAgICAgICBoZWlnaHQgPSBzaXplLmhlaWdodDtcbiAgICAgIH0gLy8gVXBkYXRlIHRoZSBsb2dpY2FsIHJlbmRlciBzaXplLlxuXG5cbiAgICAgIHJlbmRlcmVyLnNldFNpemUod2lkdGgsIGhlaWdodCk7IC8vIFRoZSBkcmF3aW5nIGJ1ZmZlciBzaXplIHRha2VzIHRoZSBkZXZpY2UgcGl4ZWwgcmF0aW8gaW50byBhY2NvdW50LlxuXG4gICAgICBkcmF3aW5nQnVmZmVyU2l6ZSA9IHJlbmRlcmVyLmdldERyYXdpbmdCdWZmZXJTaXplKCk7XG4gICAgICB0aGlzLmlucHV0QnVmZmVyLnNldFNpemUoZHJhd2luZ0J1ZmZlclNpemUud2lkdGgsIGRyYXdpbmdCdWZmZXJTaXplLmhlaWdodCk7XG4gICAgICB0aGlzLm91dHB1dEJ1ZmZlci5zZXRTaXplKGRyYXdpbmdCdWZmZXJTaXplLndpZHRoLCBkcmF3aW5nQnVmZmVyU2l6ZS5oZWlnaHQpO1xuXG4gICAgICBmb3IgKGkgPSAwLCBsID0gcGFzc2VzLmxlbmd0aDsgaSA8IGw7ICsraSkge1xuICAgICAgICBwYXNzZXNbaV0uc2V0U2l6ZShkcmF3aW5nQnVmZmVyU2l6ZS53aWR0aCwgZHJhd2luZ0J1ZmZlclNpemUuaGVpZ2h0KTtcbiAgICAgIH1cbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBSZXNldHMgdGhpcyBjb21wb3NlciBieSBkZWxldGluZyBhbGwgcGFzc2VzIGFuZCBjcmVhdGluZyBuZXcgYnVmZmVycy5cclxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwicmVzZXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVzZXQoKSB7XG4gICAgICB2YXIgcmVuZGVyVGFyZ2V0ID0gdGhpcy5jcmVhdGVCdWZmZXIodGhpcy5pbnB1dEJ1ZmZlci5kZXB0aEJ1ZmZlciwgdGhpcy5pbnB1dEJ1ZmZlci5zdGVuY2lsQnVmZmVyLCB0aGlzLmlucHV0QnVmZmVyLmRlcHRoVGV4dHVyZSAhPT0gbnVsbCk7XG4gICAgICB0aGlzLmRpc3Bvc2UoKTsgLy8gUmVhbmltYXRlLlxuXG4gICAgICB0aGlzLmlucHV0QnVmZmVyID0gcmVuZGVyVGFyZ2V0O1xuICAgICAgdGhpcy5vdXRwdXRCdWZmZXIgPSByZW5kZXJUYXJnZXQuY2xvbmUoKTtcbiAgICAgIHRoaXMuY29weVBhc3MgPSBuZXcgU2hhZGVyUGFzcyhuZXcgQ29weU1hdGVyaWFsKCkpO1xuICAgIH1cbiAgICAvKipcclxuICAgICAqIERlc3Ryb3lzIHRoaXMgY29tcG9zZXIgYW5kIGFsbCBwYXNzZXMuXHJcbiAgICAgKlxyXG4gICAgICogVGhpcyBtZXRob2QgZGVhbGxvY2F0ZXMgYWxsIGRpc3Bvc2FibGUgb2JqZWN0cyBjcmVhdGVkIGJ5IHRoZSBwYXNzZXMuIEl0XHJcbiAgICAgKiBhbHNvIGRlbGV0ZXMgdGhlIG1haW4gZnJhbWUgYnVmZmVycyBvZiB0aGlzIGNvbXBvc2VyLlxyXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJkaXNwb3NlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRpc3Bvc2UoKSB7XG4gICAgICB2YXIgcGFzc2VzID0gdGhpcy5wYXNzZXM7XG4gICAgICB2YXIgaSwgbDtcblxuICAgICAgZm9yIChpID0gMCwgbCA9IHBhc3Nlcy5sZW5ndGg7IGkgPCBsOyArK2kpIHtcbiAgICAgICAgcGFzc2VzW2ldLmRpc3Bvc2UoKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5wYXNzZXMgPSBbXTtcblxuICAgICAgaWYgKHRoaXMuaW5wdXRCdWZmZXIgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5pbnB1dEJ1ZmZlci5kaXNwb3NlKCk7XG4gICAgICAgIHRoaXMuaW5wdXRCdWZmZXIgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5vdXRwdXRCdWZmZXIgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5vdXRwdXRCdWZmZXIuZGlzcG9zZSgpO1xuICAgICAgICB0aGlzLm91dHB1dEJ1ZmZlciA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuY29weVBhc3MuZGlzcG9zZSgpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJkZXB0aFRleHR1cmVcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmlucHV0QnVmZmVyLmRlcHRoVGV4dHVyZTtcbiAgICB9XG4gICAgLyoqXHJcbiAgICAgKiBUaGUgaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzIHNoYXJlIGEgc2luZ2xlIGRlcHRoIHRleHR1cmUuIERlcHRoIHdpbGwgYmVcclxuICAgICAqIHdyaXR0ZW4gdG8gdGhpcyB0ZXh0dXJlIHdoZW4gc29tZXRoaW5nIGlzIHJlbmRlcmVkIGludG8gb25lIG9mIHRoZSBidWZmZXJzXHJcbiAgICAgKiBhbmQgdGhlIGludm9sdmVkIG1hdGVyaWFscyBoYXZlIGRlcHRoIHdyaXRlIGVuYWJsZWQuXHJcbiAgICAgKlxyXG4gICAgICogWW91IG1heSBlbmFibGUgdGhpcyBtZWNoYW5pc20gZHVyaW5nIHRoZSBpbnN0YW50aWF0aW9uIG9mIHRoZSBjb21wb3NlciBvclxyXG4gICAgICogYnkgYXNzaWduaW5nIGEgRGVwdGhUZXh0dXJlIGluc3RhbmNlIGxhdGVyIG9uLiBZb3UgbWF5IGFsc28gZGlzYWJsZSBpdCBieVxyXG4gICAgICogYXNzaWduaW5nIG51bGwuXHJcbiAgICAgKlxyXG4gICAgICogQHR5cGUge0RlcHRoVGV4dHVyZX1cclxuICAgICAqL1xuICAgICxcbiAgICBzZXQ6IGZ1bmN0aW9uIHNldCh4KSB7XG4gICAgICB0aGlzLmlucHV0QnVmZmVyLmRlcHRoVGV4dHVyZSA9IHg7XG4gICAgICB0aGlzLm91dHB1dEJ1ZmZlci5kZXB0aFRleHR1cmUgPSB4O1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBFZmZlY3RDb21wb3Nlcjtcbn0oKTtcblxudmFyIHBvbHlmaWxsID0gZnVuY3Rpb24gcG9seWZpbGwob2JqZWN0LCBtZXRob2QpIHtcbiAgdmFyIHNob3dXYXJuID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiB0cnVlO1xuICBpZiAob2JqZWN0W21ldGhvZF0pIHJldHVybjtcbiAgaWYgKHNob3dXYXJuKSBjb25zb2xlLndhcm4oXCJAUG9zdFByb2Nlc3Nvck1vZHVsZTogcGFzcy5cIi5jb25jYXQobWV0aG9kLCBcIigpIHdhcyBub3QgZm91bmQuXCIpLCBvYmplY3QpO1xuXG4gIG9iamVjdFttZXRob2RdID0gZnVuY3Rpb24gKCkge307XG59O1xuLyoqXG4gKiBAY2xhc3MgUG9zdFByb2Nlc3Nvck1vZHVsZVxuICogQGNhdGVnb3J5IG1vZHVsZXMvYXBwXG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtc11cbiAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9hcHBcbiAqIEBleGFtcGxlIDxjYXB0aW9uPiBDcmVhdGluZyBhIHJlbmRlcmluZyBtb2R1bGUgYW5kIHBhc3NpbmcgaXQgdG8gQXBwJ3MgbW9kdWxlczwvY2FwdGlvbj5cbiAqIG5ldyBBcHAoW1xuICogICBuZXcgRWxlbWVudE1vZHVsZSgpLFxuICogICBuZXcgU2NlbmVNb2R1bGUoKSxcbiAqICAgbmV3IERlZmluZU1vZHVsZSgnY2FtZXJhJywgbmV3IFdIUy5QZXJzcGVjdGl2ZUNhbWVyYSh7XG4gKiAgICAgcG9zaXRpb246IG5ldyBUSFJFRS5WZWN0b3IzKDAsIDYsIDE4KSxcbiAqICAgICBmYXI6IDEwMDAwXG4gKiAgIH0pKSxcbiAqICAgbmV3IFJlbmRlcmluZ01vZHVsZSgpLFxuICogICBuZXcgUG9zdFByb2Nlc3Nvck1vZHVsZSgpXG4gKiBdKTtcbiAqXG4gKiBjb25zdCBwcm9jZXNzb3IgPSBhcHAudXNlKCdwb3N0cHJvY2Vzc29yJyk7XG4gKlxuICogcHJvY2Vzc29yXG4gKiAgIC5yZW5kZXIoKVxuICogICAucGFzcyhuZXcgR2xpdGNoUGFzcygpKVxuICogICAucmVuZGVyVG9TY3JlZW4oKVxuICovXG5cblxudmFyIFBvc3RQcm9jZXNzb3JNb2R1bGUgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBQb3N0UHJvY2Vzc29yTW9kdWxlKCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBQb3N0UHJvY2Vzc29yTW9kdWxlLmRlZmF1bHRzO1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgUG9zdFByb2Nlc3Nvck1vZHVsZSk7XG5cbiAgICBkZWZpbmVQcm9wZXJ0eSQzKGRlZmluZVByb3BlcnR5JDModGhpcywgXCJjdXJyZW50UGFzc1wiLCBudWxsKSwgXCJkZWZlclwiLCBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgX3RoaXMucmVzb2x2ZSA9IHJlc29sdmU7XG4gICAgfSkpO1xuXG4gICAgdGhpcy5kZWJ1ZyA9IHBhcmFtcy5kZWJ1ZztcbiAgICB0aGlzLnBhcmFtcyA9IHBhcmFtcztcbiAgfVxuXG4gIGNyZWF0ZUNsYXNzKFBvc3RQcm9jZXNzb3JNb2R1bGUsIFt7XG4gICAga2V5OiBcIm1hbmFnZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbWFuYWdlcihfbWFuYWdlcikge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIF9tYW5hZ2VyLmRlZmluZSgncG9zdHByb2Nlc3NvcicpO1xuXG4gICAgICB0aGlzLmVmZmVjdHMgPSBfbWFuYWdlci51c2UoJ3JlbmRlcmluZycpLmVmZmVjdHM7XG4gICAgICB0aGlzLnJlbmRlcmVyID0gX21hbmFnZXIuZ2V0KCdyZW5kZXJlcicpO1xuICAgICAgdGhpcy5zY2VuZSA9IF9tYW5hZ2VyLmdldCgnc2NlbmUnKTtcbiAgICAgIHRoaXMuY2FtZXJhID0gX21hbmFnZXIuZ2V0KCdjYW1lcmEnKTtcbiAgICAgIHRoaXMuY29tcG9zZXIgPSBuZXcgRWZmZWN0Q29tcG9zZXIodGhpcy5yZW5kZXJlciwgdGhpcy5wYXJhbXMpO1xuXG4gICAgICBfbWFuYWdlci51c2UoJ3JlbmRlcmluZycpLnN0b3AoKTtcblxuICAgICAgdmFyIGNvbXBvc2VyID0gdGhpcy5jb21wb3NlcjtcbiAgICAgIHRoaXMucmVuZGVyTG9vcCA9IG5ldyBMb29wKGZ1bmN0aW9uIChjbG9jaykge1xuICAgICAgICByZXR1cm4gY29tcG9zZXIucmVuZGVyKGNsb2NrLmdldERlbHRhKCkpO1xuICAgICAgfSkuc3RhcnQoX21hbmFnZXIuaGFuZGxlcik7XG5cbiAgICAgIF9tYW5hZ2VyLnVwZGF0ZSh7XG4gICAgICAgIHJlbmRlcmVyOiBmdW5jdGlvbiByZW5kZXJlcihfcmVuZGVyZXIpIHtcbiAgICAgICAgICBfdGhpczIuY29tcG9zZXIucmVwbGFjZVJlbmRlcmVyKF9yZW5kZXJlcik7XG4gICAgICAgIH0sXG4gICAgICAgIHNjZW5lOiBmdW5jdGlvbiBzY2VuZShfc2NlbmUpIHtcbiAgICAgICAgICBfdGhpczIuc2NlbmUgPSBfc2NlbmU7XG4gICAgICAgIH0sXG4gICAgICAgIGNhbWVyYTogZnVuY3Rpb24gY2FtZXJhKF9jYW1lcmEpIHtcbiAgICAgICAgICBfdGhpczIuY2FtZXJhID0gX2NhbWVyYTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMucmVzb2x2ZSgpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAbWV0aG9kIHJlbmRlclxuICAgICAqIEBkZXNjcmlwdGlvbiBBZGRzIFJlbmRlclBhc3NcbiAgICAgKiBAcmV0dXJuIHt0aGlzfVxuICAgICAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9hcHAuUG9zdFByb2Nlc3Nvck1vZHVsZVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlbmRlcigpIHtcbiAgICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgICB0aGlzLmRlZmVyLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgcGFzcyA9IG5ldyBSZW5kZXJQYXNzKF90aGlzMy5zY2VuZSwgX3RoaXMzLmNhbWVyYS5uYXRpdmUpOyAvLyBUT0RPOiBTdXBwb3J0IGZvciBlZmZlY3RzLlxuXG4gICAgICAgIF90aGlzMy5jb21wb3Nlci5hZGRQYXNzKHBhc3MpO1xuXG4gICAgICAgIF90aGlzMy5jdXJyZW50UGFzcyA9IHBhc3M7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAbWV0aG9kIHBhc3NcbiAgICAgKiBAZGVzY3JpcHRpb24gQWRkcyB5b3VyIGN1c3RvbSBwYXNzXG4gICAgICogQHBhcmFtIHtQYXNzfSBwYXNzIEEgY3VzdG9tIHBhc3NcbiAgICAgKiBAcmV0dXJuIHt0aGlzfVxuICAgICAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9hcHAuUG9zdFByb2Nlc3Nvck1vZHVsZVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwicGFzc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwYXNzKF9wYXNzKSB7XG4gICAgICB2YXIgX3RoaXM0ID0gdGhpcztcblxuICAgICAgdGhpcy5kZWZlci50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcG9seWZpbGwoX3Bhc3MsICdzZXRTaXplJywgX3RoaXM0LmRlYnVnKTtcbiAgICAgICAgcG9seWZpbGwoX3Bhc3MsICdpbml0aWFsaXNlJywgX3RoaXM0LmRlYnVnKTtcblxuICAgICAgICBfdGhpczQuY29tcG9zZXIuYWRkUGFzcyhfcGFzcyk7XG5cbiAgICAgICAgX3RoaXM0LmN1cnJlbnRQYXNzID0gX3Bhc3M7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAbWV0aG9kIHNoYWRlclxuICAgICAqIEBkZXNjcmlwdGlvbiBBZGRzIGEgcGFzcyBtYWRlIGZyb20gc2hhZGVyIG1hdGVyaWFsXG4gICAgICogQHBhcmFtIHtNYXRlcmlhbH0gbWF0ZXJpYWwgQSBTaGFkZXJNYXRlcmlhbFxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0ZXh0dXJlSUQgTmFtZSBvZiB0aGUgcmVhZEJ1ZmZlciB1bmlmb3JtXG4gICAgICogQHJldHVybiB7dGhpc31cbiAgICAgKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwLlBvc3RQcm9jZXNzb3JNb2R1bGVcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInNoYWRlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzaGFkZXIobWF0ZXJpYWwpIHtcbiAgICAgIHZhciBfdGhpczUgPSB0aGlzO1xuXG4gICAgICB2YXIgdGV4dHVyZUlEID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiAncmVhZEJ1ZmZlcic7XG4gICAgICB0aGlzLmRlZmVyLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIW1hdGVyaWFsLnVuaWZvcm1zW3RleHR1cmVJRF0pIG1hdGVyaWFsLnVuaWZvcm1zW3RleHR1cmVJRF0gPSB7XG4gICAgICAgICAgdmFsdWU6IG51bGxcbiAgICAgICAgfTtcbiAgICAgICAgdmFyIHBhc3MgPSBuZXcgU2hhZGVyUGFzcyhtYXRlcmlhbCwgdGV4dHVyZUlEKTtcblxuICAgICAgICBfdGhpczUuY29tcG9zZXIuYWRkUGFzcyhwYXNzKTtcblxuICAgICAgICBfdGhpczUuY3VycmVudFBhc3MgPSBwYXNzO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQG1ldGhvZCBnZXRcbiAgICAgKiBAZGVzY3JpcHRpb24gUmV0dXJucyBhIHBhc3MgYnkgdGhlIGdpdmVuIG5hbWVcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBUaGUgbmFtZSBvZiB0aGUgcGFzc1xuICAgICAqIEByZXR1cm4ge3RoaXN9XG4gICAgICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzL2FwcC5Qb3N0UHJvY2Vzc29yTW9kdWxlXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJnZXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0KG5hbWUpIHtcbiAgICAgIHJldHVybiBuYW1lID8gdGhpcy5jb21wb3Nlci5wYXNzZXMuZmlsdGVyKGZ1bmN0aW9uIChwYXNzKSB7XG4gICAgICAgIHJldHVybiBwYXNzLm5hbWUgPT09IG5hbWU7XG4gICAgICB9KVswXSA6IHRoaXMuY3VycmVudFBhc3M7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBtZXRob2QgcmVuZGVyVG9TY3JlZW5cbiAgICAgKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgcmVuZGVyVG9TY3JlZW4gcHJvcGVydHkgb2YgY3VycmVudFBhc3NcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gW25hbWU9dHJ1ZV0gVGhlIG5hbWUgb2YgdGhlIHBhc3NcbiAgICAgKiBAcmV0dXJuIHt0aGlzfVxuICAgICAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9hcHAuUG9zdFByb2Nlc3Nvck1vZHVsZVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwicmVuZGVyVG9TY3JlZW5cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcmVuZGVyVG9TY3JlZW4oKSB7XG4gICAgICB2YXIgX3RoaXM2ID0gdGhpcztcblxuICAgICAgdmFyIGJvb2wgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHRydWU7XG4gICAgICB0aGlzLmRlZmVyLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICBfdGhpczYuY3VycmVudFBhc3MucmVuZGVyVG9TY3JlZW4gPSBib29sO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gUG9zdFByb2Nlc3Nvck1vZHVsZTtcbn0oKTtcblxuZGVmaW5lUHJvcGVydHkkMyhQb3N0UHJvY2Vzc29yTW9kdWxlLCBcImRlZmF1bHRzXCIsIHtcbiAgZGVidWc6IHRydWVcbn0pO1xuXG4vKipcbiAqIEBjbGFzcyBFdmVudHNQYXRjaE1vZHVsZVxuICogQGRlc2NyaXB0aW9uIFRoaXMgb25lIGlzIHVzZWQgaW4gdGhlIGNvcmUgdG8gaGFuZGxlIGV2ZW50cyB1c2VkIGJ5IG1vZHVsZXMuIElmIHlvdSB3YW50IHRvIG1ha2UgY3VzdG9tIGV2ZW50cyAtIHBsZWFzZSBtYWtlIGEgc2ltaWxhciBvbmUuXG4gKiBAY2F0ZWdvcnkgbW9kdWxlcy9hcHBcbiAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9hcHBcbiAqL1xudmFyIEV2ZW50c1BhdGNoTW9kdWxlID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gRXZlbnRzUGF0Y2hNb2R1bGUoKSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgRXZlbnRzUGF0Y2hNb2R1bGUpO1xuICB9XG5cbiAgY3JlYXRlQ2xhc3MoRXZlbnRzUGF0Y2hNb2R1bGUsIFt7XG4gICAga2V5OiBcIm1hbmFnZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbWFuYWdlcihfbWFuYWdlcikge1xuICAgICAgX21hbmFnZXIuZGVmaW5lKCdldmVudHMnKTtcblxuICAgICAgdGhpcy5lbGVtZW50ID0gX21hbmFnZXIuZ2V0KCdyZW5kZXJlcicpLmRvbUVsZW1lbnQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBmdW5jdGlvbiBwYXRjaEV2ZW50c1xuICAgICAqIEBkZXNjcmlwdGlvbiBUaGlzIG1ldGhvZHMgcGF0Y2hlcyB0aGUgbGlzdCBvZiBldmVudHMgb24gc3BlY2lmaWMgb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBvcmlnaW5PYmplY3QgLSBUaGUgb2JqZWN0IHRoYXQgZ2l2ZXMgZXZlbnRzLlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBbZGVzdE9iamVjdD10aGlzXSAtIFRoZSBvYmplY3QgdGhhdCB0YWtlcyBldmVudHMuXG4gICAgICogQHBhcmFtIHtBcnJheVtTdHJpbmdzXX0gW2V2ZW50cz1bXV0gLSBUaGUgbGlzdCBvZiBldmVudHMgYnkgbmFtZXMuXG4gICAgICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzL2FwcC5FdmVudHNQYXRjaE1vZHVsZVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwicGF0Y2hFdmVudHNcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcGF0Y2hFdmVudHMob3JpZ2luT2JqZWN0KSB7XG4gICAgICB2YXIgZGVzdE9iamVjdCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogdGhpcztcbiAgICAgIHZhciBldmVudHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IFtdO1xuICAgICAgZXZlbnRzLmZvckVhY2goZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIHJldHVybiBvcmlnaW5PYmplY3QuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICByZXR1cm4gZGVzdE9iamVjdC5lbWl0KGV2ZW50LCBlKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwiaW50ZWdyYXRlXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGludGVncmF0ZShzZWxmKSB7XG4gICAgICB2YXIgZWxlbWVudCA9IHNlbGYuZWxlbWVudCxcbiAgICAgICAgICBwYXRjaEV2ZW50cyA9IHNlbGYucGF0Y2hFdmVudHM7XG4gICAgICBwYXRjaEV2ZW50cyhlbGVtZW50LCB0aGlzLCBbJ21vdXNlbW92ZScsICdtb3VzZXVwJywgJ2NvbnRleHRtZW51JywgJ21vdXNlZG93bicsICdjbGljaycsICd3aGVlbCcsICd0b3VjaHN0YXJ0JywgJ3RvdWNoZW5kJywgJ3RvdWNobW92ZScsICdrZXlkb3duJywgJ2tleXVwJywgJ2tleXByZXNzJ10pO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBFdmVudHNQYXRjaE1vZHVsZTtcbn0oKTtcblxuLyoqXG4gKiBAY2xhc3MgVmlydHVhbE1vdXNlTW9kdWxlXG4gKiBAY2F0ZWdvcnkgbW9kdWxlcy9hcHBcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW2dsb2JhbE1vdmVtZW50PWZhbHNlXVxuICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzL2FwcFxuICogQGV4dGVuZHMgRXZlbnRzXG4gKi9cblxudmFyIFZpcnR1YWxNb3VzZU1vZHVsZSA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoX0V2ZW50cykge1xuICBmdW5jdGlvbiBWaXJ0dWFsTW91c2VNb2R1bGUoKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgdmFyIGdsb2JhbE1vdmVtZW50ID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBmYWxzZTtcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIFZpcnR1YWxNb3VzZU1vZHVsZSk7XG5cbiAgICBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgZ2V0UHJvdG90eXBlT2YkMihWaXJ0dWFsTW91c2VNb2R1bGUpLmNhbGwodGhpcykpO1xuXG4gICAgZGVmaW5lUHJvcGVydHkkMyhkZWZpbmVQcm9wZXJ0eSQzKGRlZmluZVByb3BlcnR5JDMoZGVmaW5lUHJvcGVydHkkMyhkZWZpbmVQcm9wZXJ0eSQzKGFzc2VydFRoaXNJbml0aWFsaXplZChhc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpKSwgXCJtb3VzZVwiLCBuZXcgVmVjdG9yMigpKSwgXCJyYXljYXN0ZXJcIiwgbmV3IFJheWNhc3RlcigpKSwgXCJ3b3JsZFwiLCBudWxsKSwgXCJjYW52YXNcIiwgbnVsbCksIFwicHJvamVjdGlvblBsYW5lXCIsIG5ldyBQbGFuZShuZXcgVmVjdG9yMygwLCAwLCAxKSwgMCkpO1xuXG4gICAgX3RoaXMuZ2xvYmFsTW92ZW1lbnQgPSBnbG9iYWxNb3ZlbWVudDtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICBjcmVhdGVDbGFzcyhWaXJ0dWFsTW91c2VNb2R1bGUsIFt7XG4gICAga2V5OiBcInVwZGF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB1cGRhdGUoZSwgY3VzdG9tWCwgY3VzdG9tWSkge1xuICAgICAgdmFyIHJlY3QgPSB0aGlzLmNhbnZhcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIHZhciB4ID0gY3VzdG9tWCB8fCBlLmNsaWVudFg7XG4gICAgICB2YXIgeSA9IGN1c3RvbVkgfHwgZS5jbGllbnRZO1xuICAgICAgdGhpcy5tb3VzZS54ID0gKHggLSByZWN0LmxlZnQpIC8gKHJlY3QucmlnaHQgLSByZWN0LmxlZnQpICogMiAtIDE7XG4gICAgICB0aGlzLm1vdXNlLnkgPSAtKCh5IC0gcmVjdC50b3ApIC8gKHJlY3QuYm90dG9tIC0gcmVjdC50b3ApKSAqIDIgKyAxO1xuICAgICAgdGhpcy5wcm9qZWN0aW9uUGxhbmUubm9ybWFsLmNvcHkodGhpcy5jYW1lcmEuZ2V0V29ybGREaXJlY3Rpb24oKSk7XG4gICAgICB0aGlzLnJheWNhc3Rlci5zZXRGcm9tQ2FtZXJhKHRoaXMubW91c2UsIHRoaXMuY2FtZXJhKTtcbiAgICAgIHRoaXMuZW1pdCgnbW92ZScpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJtYW5hZ2VyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG1hbmFnZXIoX21hbmFnZXIpIHtcbiAgICAgIF9tYW5hZ2VyLmRlZmluZSgnbW91c2UnKTtcblxuICAgICAgX21hbmFnZXIucmVxdWlyZSgnZXZlbnRzJywgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gbmV3IEV2ZW50c1BhdGNoTW9kdWxlKCk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5jYW52YXMgPSBfbWFuYWdlci5nZXQoJ3JlbmRlcmVyJykuZG9tRWxlbWVudDtcbiAgICAgIHRoaXMuY2FtZXJhID0gX21hbmFnZXIuZ2V0KCdjYW1lcmEnKS5uYXRpdmU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImludGVncmF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpbnRlZ3JhdGUoc2VsZikge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIFsnY2xpY2snLCAnbW91c2Vkb3duJywgJ21vdXNldXAnLCAnbW91c2Vtb3ZlJ10uZm9yRWFjaChmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgcmV0dXJuIF90aGlzMi5vbihldiwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICByZXR1cm4gc2VsZi5lbWl0KGV2LCBlKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIHNlbGYuZ2xvYmFsWCA9IDA7XG4gICAgICBzZWxmLmdsb2JhbFkgPSAwO1xuICAgICAgdGhpcy5vbignbW91c2Vtb3ZlJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgaWYgKGRvY3VtZW50LnBvaW50ZXJMb2NrRWxlbWVudCAhPT0gbnVsbCkge1xuICAgICAgICAgIHNlbGYuZ2xvYmFsWCArPSBlLm1vdmVtZW50WDtcbiAgICAgICAgICBzZWxmLmdsb2JhbFkgKz0gZS5tb3ZlbWVudFk7XG4gICAgICAgICAgc2VsZi51cGRhdGUoZSwgc2VsZi5nbG9iYWxYLCBzZWxmLmdsb2JhbFkpO1xuICAgICAgICB9IGVsc2Ugc2VsZi51cGRhdGUoZSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQG1ldGhvZCB0cmFja1xuICAgICAqIEBkZXNjcmlwdGlvbiBTdGFydHMgdHJhY2tpbmcgZXZlbnRzIG9uIGEgY29tcG9uZW50XG4gICAgICogQHBhcmFtIHtDb21wb25lbnR9IGNvbXBvbmVudCBBIGNvbXBvbmVudCwgdGhhdCBzaG91bGQgYmUgdHJhY2tlZCBieSB0aGUgbW91c2VcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IG5lc3RlZCBXaGV0aGVyIGNvbXBvbmVudCdzIGNoaWxkcmVuIHNob3VsZCBiZSB0cmFja2VkIG9yIG5vdFxuICAgICAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9hcHAuVmlydHVhbE1vdXNlTW9kdWxlXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJ0cmFja1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB0cmFjayhjb21wb25lbnQpIHtcbiAgICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgICB2YXIgbmVzdGVkID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB0cnVlO1xuICAgICAgdmFyIGlzSG92ZXJlZCA9IGZhbHNlO1xuICAgICAgdGhpcy5vbignbW92ZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKF90aGlzMy5ob3ZlcnMoY29tcG9uZW50LCBuZXN0ZWQpKSB7XG4gICAgICAgICAgaWYgKGlzSG92ZXJlZCkgY29tcG9uZW50LmVtaXQoJ21vdXNlbW92ZScpO2Vsc2Uge1xuICAgICAgICAgICAgY29tcG9uZW50LmVtaXQoJ21vdXNlb3ZlcicpO1xuICAgICAgICAgICAgaXNIb3ZlcmVkID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoaXNIb3ZlcmVkKSB7XG4gICAgICAgICAgY29tcG9uZW50LmVtaXQoJ21vdXNlb3V0Jyk7XG4gICAgICAgICAgaXNIb3ZlcmVkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgdGhpcy5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChpc0hvdmVyZWQpIGNvbXBvbmVudC5lbWl0KCdjbGljaycpO2Vsc2UgY29tcG9uZW50LmVtaXQoJ29mZkNsaWNrJyk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMub24oJ21vdXNlZG93bicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKGlzSG92ZXJlZCkgY29tcG9uZW50LmVtaXQoJ21vdXNlZG93bicpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLm9uKCdtb3VzZXVwJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoaXNIb3ZlcmVkKSBjb21wb25lbnQuZW1pdCgnbW91c2V1cCcpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBtZXRob2QgaW50ZXJzZWN0aW9uXG4gICAgICogQGRlc2NyaXB0aW9uIFJldHVybnMgYW4gaW50ZXJzZWN0aW9uIGRhdGFcbiAgICAgKiBAcGFyYW0ge0NvbXBvbmVudH0gY29tcG9uZW50IEEgY29tcG9uZW50IHRoYXQgaW50ZXJzZWN0cyB3aXRoIG1vdXNlIHJheSAob3IgZG9lc24ndClcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IG5lc3RlZCBXaGV0aGVyIGNvbXBvbmVudCdzIGNoaWxkcmVuIHNob3VsZCBiZSB0cmFja2VkIG9yIG5vdFxuICAgICAqIEByZXR1cm4ge0FycmF5fSBpbnRlcnNlY3Rpb24gZGF0YS5cbiAgICAgKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwLlZpcnR1YWxNb3VzZU1vZHVsZVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiaW50ZXJzZWN0aW9uXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGludGVyc2VjdGlvbihfcmVmKSB7XG4gICAgICB2YXIgbmF0aXZlID0gX3JlZi5uYXRpdmU7XG4gICAgICB2YXIgbmVzdGVkID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB0cnVlO1xuXG4gICAgICBpZiAobmF0aXZlLmNoaWxkcmVuLmxlbmd0aCA+IDAgJiYgbmVzdGVkKSB7XG4gICAgICAgIHZhciBvYmplY3RzID0gW107XG4gICAgICAgIG5hdGl2ZS50cmF2ZXJzZShmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgICByZXR1cm4gb2JqZWN0cy5wdXNoKGNoaWxkKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLnJheWNhc3Rlci5pbnRlcnNlY3RPYmplY3RzKG9iamVjdHMpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5yYXljYXN0ZXIuaW50ZXJzZWN0T2JqZWN0KG5hdGl2ZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBtZXRob2QgcHJvamVjdFxuICAgICAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIGEgdmVjdG9yIGJhc2VkIG9uIG1vdXNlIHJheSBpbnRlcnNlY3Rpb24gd2l0aCBwbGFuZVxuICAgICAqIEBwYXJhbSB7VEhSRUUuUGxhbmV9IFtwbGFuZT10aGlzLnByb2plY3Rpb25QbGFuZV0gTWF0aCBwbGFuZSB0aGF0IGlzIHVzZWRcbiAgICAgKiBAcGFyYW0ge1ZlY3RvcjN9IFt0YXJnZXRdIE9wdGlvbmFsIHRhcmdldFxuICAgICAqIEByZXR1cm4ge1ZlY3RvcjN9IEFuIGludGVyc2VjdGlvbiBwb2ludC5cbiAgICAgKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwLlZpcnR1YWxNb3VzZU1vZHVsZVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwicHJvamVjdFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBwcm9qZWN0KCkge1xuICAgICAgdmFyIHBsYW5lID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB0aGlzLnByb2plY3Rpb25QbGFuZTtcbiAgICAgIHZhciB0YXJnZXQgPSBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiB0aGlzLnJheWNhc3Rlci5yYXkuaW50ZXJzZWN0UGxhbmUocGxhbmUsIHRhcmdldCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBtZXRob2QgaG92ZXJzXG4gICAgICogQGRlc2NyaXB0aW9uIFJldHVybnMgYSBib29sZWFuIGJhc2VkIG9uIGludGVyc2VjdGlvbiBkYXRhIChXaGV0aGVyIG1vdXNlIGhvdmVycyB0aGUgY29tcG9uZW50KVxuICAgICAqIEBwYXJhbSB7Q29tcG9uZW50fSBjb21wb25lbnQgQSBjb21wb25lbnQgdGhhdCBpbnRlcnNlY3RzIHdpdGggbW91c2UgcmF5IChvciBkb2Vzbid0KVxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gbmVzdGVkIFdoZXRoZXIgY29tcG9uZW50J3MgY2hpbGRyZW4gc2hvdWxkIGJlIHRyYWNrZWQgb3Igbm90XG4gICAgICogQHJldHVybiB7Qm9vbGVhbn0gV2hldGhlciB0aGUgY29tcG9uZW50IGlzIGhvdmVyZWQuXG4gICAgICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzL2FwcC5WaXJ0dWFsTW91c2VNb2R1bGVcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcImhvdmVyc1wiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBob3ZlcnMoY29tcG9uZW50KSB7XG4gICAgICB2YXIgbmVzdGVkID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB0cnVlO1xuICAgICAgcmV0dXJuIHRoaXMuaW50ZXJzZWN0aW9uKGNvbXBvbmVudCwgbmVzdGVkKS5sZW5ndGggPiAwO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBNb3VzZSByYXlcbiAgICAgKiBAbWVtYmVyIHtUSFJFRS5SYXl9IG1vZHVsZTptb2R1bGVzL2FwcC5WaXJ0dWFsTW91c2VNb2R1bGUjcmF5XG4gICAgICogQHB1YmxpY1xuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwicmF5XCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5yYXljYXN0ZXIucmF5O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBNb3VzZSB4IFstMTsgMV1cbiAgICAgKiBAbWVtYmVyIHtOdW1iZXJ9IG1vZHVsZTptb2R1bGVzL2FwcC5WaXJ0dWFsTW91c2VNb2R1bGUjeFxuICAgICAqIEBwdWJsaWNcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInhcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLm1vdXNlLng7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE1vdXNlIHkgWy0xOyAxXVxuICAgICAqIEBtZW1iZXIge051bWJlcn0gbW9kdWxlOm1vZHVsZXMvYXBwLlZpcnR1YWxNb3VzZU1vZHVsZSN5XG4gICAgICogQHB1YmxpY1xuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwieVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMubW91c2UueTtcbiAgICB9XG4gIH1dKTtcblxuICBpbmhlcml0cyhWaXJ0dWFsTW91c2VNb2R1bGUsIF9FdmVudHMpO1xuXG4gIHJldHVybiBWaXJ0dWFsTW91c2VNb2R1bGU7XG59KG1pbml2ZW50c19jb21tb25qcyk7XG5cbi8qKlxuICogQGNsYXNzIENvbnRyb2xzTW9kdWxlXG4gKiBAY2F0ZWdvcnkgbW9kdWxlcy9hcHBcbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zXVxuICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzL2FwcFxuICogQGV4YW1wbGUgPGNhcHRpb24+IENyZWF0aW5nIGEgcmVuZGVyaW5nIG1vZHVsZSBhbmQgcGFzc2luZyBpdCB0byBBcHAncyBtb2R1bGVzPC9jYXB0aW9uPlxuICogbmV3IEFwcChbXG4gKiAgIG5ldyBFbGVtZW50TW9kdWxlKCksXG4gKiAgIG5ldyBTY2VuZU1vZHVsZSgpLFxuICogICBuZXcgRGVmaW5lTW9kdWxlKCdjYW1lcmEnLCBuZXcgV0hTLlBlcnNwZWN0aXZlQ2FtZXJhKHtcbiAqICAgICBwb3NpdGlvbjogbmV3IFRIUkVFLlZlY3RvcjMoMCwgNiwgMTgpLFxuICogICAgIGZhcjogMTAwMDBcbiAqICAgfSkpLFxuICogICBuZXcgUmVuZGVyaW5nTW9kdWxlKCksXG4gKiAgIG5ldyBDb250cm9sc01vZHVsZS5mcm9tKG5ldyBUSFJFRS5UcmFja2JhbGxDb250cm9scygpKVxuICogXSk7XG4gKi9cblxudmFyIENvbnRyb2xzTW9kdWxlID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uICgpIHtcbiAgY3JlYXRlQ2xhc3MoQ29udHJvbHNNb2R1bGUsIG51bGwsIFt7XG4gICAga2V5OiBcImZyb21cIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gZnJvbShjb250cm9scykge1xuICAgICAgcmV0dXJuIG5ldyBDb250cm9sc01vZHVsZSh7XG4gICAgICAgIGNvbnRyb2xzOiBjb250cm9sc1xuICAgICAgfSk7XG4gICAgfVxuICB9XSk7XG5cbiAgZnVuY3Rpb24gQ29udHJvbHNNb2R1bGUoKSB7XG4gICAgdmFyIHBhcmFtcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBDb250cm9sc01vZHVsZSk7XG5cbiAgICB0aGlzLnBhcmFtcyA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgY29udHJvbHM6IGZhbHNlLFxuICAgICAgZml4OiBmdW5jdGlvbiBmaXgoY29udHJvbHMpIHtcbiAgICAgICAgcmV0dXJuIGNvbnRyb2xzO1xuICAgICAgfSxcbiAgICAgIHVwZGF0ZTogZnVuY3Rpb24gdXBkYXRlKGMpIHtcbiAgICAgICAgdGhpcy5jb250cm9scy51cGRhdGUoYy5nZXREZWx0YSgpKTtcbiAgICAgIH1cbiAgICB9LCBwYXJhbXMpO1xuICAgIHRoaXMuY29udHJvbHMgPSB0aGlzLnBhcmFtcy5jb250cm9scztcbiAgICB0aGlzLnVwZGF0ZSA9IHRoaXMucGFyYW1zLnVwZGF0ZTtcbiAgfVxuXG4gIGNyZWF0ZUNsYXNzKENvbnRyb2xzTW9kdWxlLCBbe1xuICAgIGtleTogXCJtYW5hZ2VyXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG1hbmFnZXIoX21hbmFnZXIpIHtcbiAgICAgIF9tYW5hZ2VyLmRlZmluZSgnY29udHJvbHMnKTtcblxuICAgICAgX21hbmFnZXIucmVxdWlyZSgnZXZlbnRzJywgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gbmV3IEV2ZW50c1BhdGNoTW9kdWxlKCk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQG1ldGhvZCBzZXRDb250cm9sc1xuICAgICAqIEBkZXNjcmlwdGlvbiBTZXQgd29ya2luZyBjb250cm9sc1xuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb250cm9scyBXb3JraW5nIHRocmVlLmpzIGNvbnRyb2xzIG9iamVjdC5cbiAgICAgKiBAcmV0dXJuIHt0aGlzfVxuICAgICAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9hcHAuQ29udHJvbHNNb2R1bGVcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInNldENvbnRyb2xzXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHNldENvbnRyb2xzKGNvbnRyb2xzKSB7XG4gICAgICB0aGlzLmNvbnRyb2xzID0gY29udHJvbHM7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLyoqXG4gICAgICogQG1ldGhvZCBzZXRVcGRhdGVcbiAgICAgKiBAZGVzY3JpcHRpb24gU2V0IGNvbnRyb2xzIHVwZGF0ZSBmdW5jdGlvblxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHVwZGF0ZSBVcGRhdGUgZnVuY3Rpb25cbiAgICAgKiBAcmV0dXJuIHt0aGlzfVxuICAgICAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9hcHAuQ29udHJvbHNNb2R1bGVcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInNldFVwZGF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRVcGRhdGUodXBkYXRlKSB7XG4gICAgICB0aGlzLnVwZGF0ZSA9IHVwZGF0ZTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpbnRlZ3JhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaW50ZWdyYXRlKHNlbGYpIHtcbiAgICAgIHNlbGYudXBkYXRlTG9vcCA9IG5ldyBMb29wKHNlbGYudXBkYXRlLmJpbmQoc2VsZikpO1xuICAgICAgc2VsZi51cGRhdGVMb29wLnN0YXJ0KHRoaXMpO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBDb250cm9sc01vZHVsZTtcbn0oKTtcblxuLyoqXG4gKiBAY2xhc3MgRm9nTW9kdWxlXG4gKiBAY2F0ZWdvcnkgbW9kdWxlcy9hcHBcbiAqIEBwYXJhbSB7T2JqZWN0fSBbcGFyYW1zPXtjb2xvcjogMHhlZmQxYjUsIGRlbnNpdHk6IDAuMDIwLCBuZWFyOiAxMCwgZmFyOiAxMDAwfV0gLSBUaGUgcGFyYW1ldGVycyBvYmplY3QuXG4gKiBAcGFyYW0ge1N0cmluZ30gW3R5cGU9ZXhwMl0gLSBUaGUgdHlwZSBvZiBmb2cgLSBleHAyIG9yIGxpbmVhclxuICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzL2FwcFxuICogQGV4YW1wbGUgPGNhcHRpb24+SG93IHRvIGNyZWF0ZSBhbmQgYXBwbHkgYSBGb2dNb2R1bGU8L2NhcHRpb24+XG4gKiBjb25zdCBmb2dNb2R1bGUgPSBuZXcgRm9nTW9kdWxlKHtcbiAqICAgIGNvbG9yOiAweGZmZmZmZixcbiAqICAgIGRlbnNpdHk6IDAuMDMsXG4gKiAgICBuZWFyOiAyMCxcbiAqICAgIGZhcjogMjAwXG4gKiAgfSwgJ2V4cDInKTtcbiAqXG4gKiBuZXcgQXBwKFtcbiAqICAuLi4sXG4gKiAgZm9nTW9kdWxlXG4gKiBdKTtcbiAqL1xuXG52YXIgRm9nTW9kdWxlID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gRm9nTW9kdWxlKCkge1xuICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgIHZhciB0eXBlID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQ7XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBGb2dNb2R1bGUpO1xuXG4gICAgdGhpcy5wYXJhbXMgPSBPYmplY3QuYXNzaWduKHtcbiAgICAgIGNvbG9yOiAweGVmZDFiNSxcbiAgICAgIGRlbnNpdHk6IDAuMDIwLFxuICAgICAgbmVhcjogMTAsXG4gICAgICBmYXI6IDEwMDBcbiAgICB9LCBwYXJhbXMpO1xuICAgIGlmICghdHlwZSB8fCB0eXBlID09PSAnZXhwMicpIHRoaXMuZm9nID0gbmV3IEZvZ0V4cDIodGhpcy5wYXJhbXMuY29sb3IsIHRoaXMucGFyYW1zLmRlbnNpdHkpO2Vsc2UgaWYgKHR5cGUgPT09ICdsaW5lYXInKSB0aGlzLmZvZyA9IG5ldyBGb2codGhpcy5wYXJhbXMuY29sb3IsIHRoaXMucGFyYW1zLm5lYXIsIHRoaXMucGFyYW1zLmZhcik7XG4gIH1cblxuICBjcmVhdGVDbGFzcyhGb2dNb2R1bGUsIFt7XG4gICAga2V5OiBcIm1hbmFnZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbWFuYWdlcihfbWFuYWdlcikge1xuICAgICAgX21hbmFnZXIuc2V0KCdmb2cnLCB0aGlzLmZvZyk7XG5cbiAgICAgIF9tYW5hZ2VyLmdldCgnc2NlbmUnKS5mb2cgPSB0aGlzLmZvZztcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gRm9nTW9kdWxlO1xufSgpO1xuXG52YXIgaXNFcXVhbERlZmF1bHQgPSBmdW5jdGlvbiBpc0VxdWFsRGVmYXVsdChhLCBiKSB7XG4gIGlmIChhID09PSBiKSByZXR1cm4gdHJ1ZTtlbHNlIGlmIChhICYmIGEuZXF1YWxzICYmIGEuZXF1YWxzKGIpKSByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuIGZhbHNlO1xufTtcbi8qKlxuICogQGNsYXNzIFN0YXRlTW9kdWxlXG4gKiBAZGVzY3JpcHRpb24gYFN0YXRlTW9kdWxlYCBpcyB1c2VmdWwgZm9yIGFwcHMsIHdoZXJlIHlvdSBuZWVkIHN0YXRlIG1hbmlwdWxhdGlvbi5cbiAqIFRoaXMgY2FuIGJlOiBfdHJhbnNpdGlvbnMgYmV0d2VlbiBzY3JlZW5zLCBnYW1lcywgZGV2ZWxvcG1lbnQgbW9tZW50c18uXG4gKiBZb3UgY2FuIGNoZWNrIFtiYXNpYy9zdGF0ZV0oaHR0cHM6Ly93aHMtZGV2LnN1cmdlLnNoL2V4YW1wbGVzLz9iYXNpYy9zdGF0ZSkgZXhhbXBsZS5cbiAqIEBjYXRlZ29yeSBtb2R1bGVzL2FwcFxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXNdXG4gKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj4gQ3JlYXRpbmcgYSBzdGF0ZSBtb2R1bGU8L2NhcHRpb24+XG4gKiBuZXcgQXBwKFtcbiAqICAgLy8gLi4uXG4gKiAgIG5ldyBTdGF0ZU1vZHVsZSgpLmRlZmF1bHQoe1xuICogICAgIHNwaGVyZUNvbG9yOiAweGZmMDAwMFxuICogICB9KVxuICogXSk7XG4gKi9cblxuXG52YXIgU3RhdGVNb2R1bGUgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKCkge1xuICBjcmVhdGVDbGFzcyhTdGF0ZU1vZHVsZSwgbnVsbCwgW3tcbiAgICBrZXk6IFwiYWN0aW9uR2VuZXJhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gYWN0aW9uR2VuZXJhdGUoaXNFcXVhbCkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHN0YXRlID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiBbe30sICcnXTtcblxuICAgICAgICB2YXIgX3JlZiA9IGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAga2V5ID0gX3JlZi5rZXksXG4gICAgICAgICAgICBkYXRhID0gX3JlZi5kYXRhO1xuXG4gICAgICAgIGlmIChpc0VxdWFsKHN0YXRlWzBdW2tleV0sIGRhdGEpKSByZXR1cm4gc3RhdGU7XG4gICAgICAgIHN0YXRlWzBdW2tleV0gPSBkYXRhO1xuICAgICAgICBzdGF0ZVsxXSA9IGtleTtcbiAgICAgICAgcmV0dXJuIHN0YXRlO1xuICAgICAgfTtcbiAgICB9XG4gIH1dKTtcblxuICBmdW5jdGlvbiBTdGF0ZU1vZHVsZSgpIHtcbiAgICB2YXIgZXF1YWxDaGVjayA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogaXNFcXVhbERlZmF1bHQ7XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBTdGF0ZU1vZHVsZSk7XG5cbiAgICB0aGlzLnN0b3JlID0gY3JlYXRlU3RvcmUoU3RhdGVNb2R1bGUuYWN0aW9uR2VuZXJhdGUoZXF1YWxDaGVjaykpO1xuICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IHt9O1xuICAgIHRoaXMuY3VycmVudENvbmZpZyA9ICdkZWZhdWx0JztcbiAgICB0aGlzLnByZXZDb25maWcgPSAnZGVmYXVsdCc7XG4gIH1cbiAgLyoqXG4gICAqIEBtZXRob2QgZGVmYXVsdFxuICAgKiBAZGVzY3JpcHRpb24gQWRkIGRlZmF1bHQgY29uZmlndXJhdGlvbi5cbiAgICogQHBhcmFtIHtPYmplY3R9IGRhdGEgQ29uZmlndXJhdGlvbiBzZXR1cFxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwLlN0YXRlTW9kdWxlXG4gICAqIEBleGFtcGxlXG4gICAqIG5ldyBXSFMuU3RhdGVNb2R1bGUoKS5kZWZhdWx0KHtcbiAgICogICBzcGhlcmVDb2xvcjogVVRJTFMuJGNvbG9ycy5tZXNoLFxuICAgKiAgIHBsYW5lQ29sb3I6IDB4NDQ3RjhCXG4gICAqIH0pXG4gICAqL1xuXG5cbiAgY3JlYXRlQ2xhc3MoU3RhdGVNb2R1bGUsIFt7XG4gICAga2V5OiBcImRlZmF1bHRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gX2RlZmF1bHQoZGF0YSkge1xuICAgICAgdGhpcy5jb25maWcoe1xuICAgICAgICBkZWZhdWx0OiBkYXRhXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAbWV0aG9kIHNldEVxdWFsQ2hlY2tcbiAgICAgKiBAZGVzY3JpcHRpb24gU2V0cyBhbiBlcXVhbENoZWNrIGZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBmdW5jdGlvbiB0byBnZW5lcmF0ZSBlcXVhbCBjaGVja1xuICAgICAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9hcHAuU3RhdGVNb2R1bGVcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInNldEVxdWFsQ2hlY2tcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0RXF1YWxDaGVjayhmdW5jKSB7XG4gICAgICB0aGlzLnN0b3JlLnJlcGxhY2VSZWR1Y2VyKFN0YXRlTW9kdWxlLmFjdGlvbkdlbmVyYXRlKGZ1bmMpKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwibWFuYWdlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBtYW5hZ2VyKF9tYW5hZ2VyKSB7XG4gICAgICBfbWFuYWdlci5kZWZpbmUoJ3N0YXRlJyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBtZXRob2QgY29uZmlnXG4gICAgICogQGRlc2NyaXB0aW9uIExvYWQgY29uZmlndXJhdGlvbnMgZnJvbSBvYmplY3QuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZ3MgQ29uZmlndXJhdGlvbiBkYXRhXG4gICAgICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzL2FwcC5TdGF0ZU1vZHVsZVxuICAgICAqIEBleGFtcGxlIDxjYXB0aW9uPiBBZGRpbmcgYGdyZWVuYCBjb25maWd1cmF0aW9uPC9jYXB0aW9uPlxuICAgICAqIHN0YXRlLmNvbmZpZyh7XG4gICAgICogICBncmVlbjoge1xuICAgICAqICAgICBzcGhlcmVDb2xvcjogMHgwMGZmMDAsXG4gICAgICogICAgIHBsYW5lQ29sb3I6IDB4MDBmZjAwXG4gICAgICogICB9XG4gICAgICogfSk7XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJjb25maWdcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gY29uZmlnKGNvbmZpZ3MpIHtcbiAgICAgIGZvciAodmFyIGtleSBpbiBjb25maWdzKSB7XG4gICAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb25ba2V5XSA9IGtleSA9PT0gJ2RlZmF1bHQnID8gY29uZmlnc1trZXldIDogT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHQsIGNvbmZpZ3Nba2V5XSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQG1ldGhvZCB1cGRhdGVcbiAgICAgKiBAZGVzY3JpcHRpb24gTG9hZCB1cGRhdGVzIGZyb20gb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSB1cGRhdGVzIFVwZGF0ZXMgZGF0YVxuICAgICAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9hcHAuU3RhdGVNb2R1bGVcbiAgICAgKiBAZXhhbXBsZSA8Y2FwdGlvbj4gVXBkYXRlIGNhbGxiYWNrIGZvciBgc3BoZXJlQ29sb3JgPC9jYXB0aW9uPlxuICAgICAqIHN0YXRlLnVwZGF0ZSh7XG4gICAgICogICBzcGhlcmVDb2xvcjogY29sb3IgPT4gc3BoZXJlLm1hdGVyaWFsLmNvbG9yLnNldEhleChjb2xvcilcbiAgICAgKiB9KTtcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInVwZGF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB1cGRhdGUoKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICB2YXIgdXBkYXRlcyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge307XG4gICAgICB0aGlzLnN0b3JlLnN1YnNjcmliZShmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyRzdG9yZSRnZXRTdGF0ZSA9IF90aGlzLnN0b3JlLmdldFN0YXRlKCksXG4gICAgICAgICAgICBfdGhpcyRzdG9yZSRnZXRTdGF0ZTIgPSBzbGljZWRUb0FycmF5KF90aGlzJHN0b3JlJGdldFN0YXRlLCAyKSxcbiAgICAgICAgICAgIGRhdGEgPSBfdGhpcyRzdG9yZSRnZXRTdGF0ZTJbMF0sXG4gICAgICAgICAgICBjaGFuZ2VkS2V5ID0gX3RoaXMkc3RvcmUkZ2V0U3RhdGUyWzFdO1xuXG4gICAgICAgIHZhciBjYWxsYmFjayA9IHVwZGF0ZXNbY2hhbmdlZEtleV07XG4gICAgICAgIGlmIChjYWxsYmFjaykgY2FsbGJhY2soZGF0YVtjaGFuZ2VkS2V5XSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQG1ldGhvZCB0b1xuICAgICAqIEBkZXNjcmlwdGlvbiBTd2l0Y2ggdG8gY29uZmlndXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gY29uZmlnTmFtZSBDb25maWd1cmF0aW9uIG5hbWUuXG4gICAgICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzL2FwcC5TdGF0ZU1vZHVsZVxuICAgICAqIEBleGFtcGxlIDxjYXB0aW9uPiBDaGFuZ2VzIGNvbmZpZ3VyYXRpb24gdG8gYGdyZWVuYDwvY2FwdGlvbj5cbiAgICAgKiBzdGF0ZS50bygnZ3JlZW4nKTtcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInRvXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHRvKGNvbmZpZ05hbWUpIHtcbiAgICAgIHRoaXMucHJldkNvbmZpZyA9IHRoaXMuY3VycmVudENvbmZpZztcbiAgICAgIHRoaXMuY3VycmVudENvbmZpZyA9IGNvbmZpZ05hbWU7XG4gICAgICB2YXIgY29uZmlnID0gdGhpcy5jb25maWd1cmF0aW9uW2NvbmZpZ05hbWVdID8gdGhpcy5jb25maWd1cmF0aW9uW2NvbmZpZ05hbWVdIDogdGhpcy5jb25maWd1cmF0aW9uLmRlZmF1bHQ7XG4gICAgICB0aGlzLnNldChjb25maWcpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAbWV0aG9kIHNldFxuICAgICAqIEBkZXNjcmlwdGlvbiBTZXQgY3VycmVudCBwYXJhbWV0ZXJzLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhIENvbmZpZ3VyYXRpb24gcGFyYW1ldGVycy5cbiAgICAgKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwLlN0YXRlTW9kdWxlXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBzdGF0ZS5zZXQoe1xuICAgICAqICAgc3BoZXJlQ29sb3I6IDB4MDBmZjAwXG4gICAgICogfSk7XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJzZXRcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0KGRhdGEpIHtcbiAgICAgIGZvciAodmFyIGtleSBpbiBkYXRhKSB7XG4gICAgICAgIGlmIChrZXkpIHRoaXMuc3RvcmUuZGlzcGF0Y2goe1xuICAgICAgICAgIHR5cGU6ICdBREQnLFxuICAgICAgICAgIGtleToga2V5LFxuICAgICAgICAgIGRhdGE6IGRhdGFba2V5XVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQG1ldGhvZCBnZXRcbiAgICAgKiBAZGVzY3JpcHRpb24gUmV0dXJuIGRhdGEgb2YgcGFyYW1ldGVyLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBrZXkgUGFyYW1ldGVyIG5hbWUuXG4gICAgICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzL2FwcC5TdGF0ZU1vZHVsZVxuICAgICAqIEBleGFtcGxlXG4gICAgICogc3RhdGUuZ2V0KCdzcGhlcmVDb2xvcicpOyAvLyAweDAwZmYwMFxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiZ2V0XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdldChrZXkpIHtcbiAgICAgIHJldHVybiB0aGlzLnN0b3JlLmdldFN0YXRlKClbMF1ba2V5XTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQG1ldGhvZCBwcmV2XG4gICAgICogQGRlc2NyaXB0aW9uIFJldHVybiBgdHJ1ZVZhbGAgaWYgYGNvbmZpZ2AgbWF0Y2ggcHJldmlvdXMgY29uZmlndXJhdGlvbiwgaW4gb3RoZXIgY2FzZSAtIHJldHVybiBgZmFsc2VWYWxgLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBjb25maWcgQ29uZmlndXJhdGlvbiBuYW1lLlxuICAgICAqIEBwYXJhbSB7QW55fSB0cnVlVmFsIFZhbHVlIHJldHVybmVkIGlmIGNvbmRpdGlvbiBpcyB0cnV0aHkuXG4gICAgICogQHBhcmFtIHtBbnl9IGZhbHNlVmFsIFZhbHVlIHJldHVybmVkIGlmIGNvbmRpdGlvbiBpcyBmYWxzeS5cbiAgICAgKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvYXBwLlN0YXRlTW9kdWxlXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogXCJwcmV2XCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHByZXYoY29uZmlnLCB0cnVlVmFsLCBmYWxzZVZhbCkge1xuICAgICAgcmV0dXJuIHRoaXMucHJldkNvbmZpZyA9PT0gY29uZmlnID8gdHJ1ZVZhbCA6IGZhbHNlVmFsO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAbWV0aG9kIGN1cnJlbnRcbiAgICAgKiBAZGVzY3JpcHRpb24gUmV0dXJuIGB0cnVlVmFsYCBpZiBgY29uZmlnYCBtYXRjaCBjdXJyZW50IGNvbmZpZ3VyYXRpb24sIGluIG90aGVyIGNhc2UgLSByZXR1cm4gYGZhbHNlVmFsYC5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gY29uZmlnIENvbmZpZ3VyYXRpb24gbmFtZS5cbiAgICAgKiBAcGFyYW0ge0FueX0gdHJ1ZVZhbCBWYWx1ZSByZXR1cm5lZCBpZiBjb25kaXRpb24gaXMgdHJ1dGh5LlxuICAgICAqIEBwYXJhbSB7QW55fSBmYWxzZVZhbCBWYWx1ZSByZXR1cm5lZCBpZiBjb25kaXRpb24gaXMgZmFsc3kuXG4gICAgICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzL2FwcC5TdGF0ZU1vZHVsZVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6IFwiY3VycmVudFwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBjdXJyZW50KGNvbmZpZywgdHJ1ZVZhbCwgZmFsc2VWYWwpIHtcbiAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRDb25maWcgPT09IGNvbmZpZyA/IHRydWVWYWwgOiBmYWxzZVZhbDtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gU3RhdGVNb2R1bGU7XG59KCk7XG5cbi8vIFVubGlrZSBUcmFja2JhbGxDb250cm9scywgaXQgbWFpbnRhaW5zIHRoZSBcInVwXCIgZGlyZWN0aW9uIG9iamVjdC51cCAoK1kgYnkgZGVmYXVsdCkuXG4vL1xuLy8gICAgT3JiaXQgLSBsZWZ0IG1vdXNlIC8gdG91Y2g6IG9uZSBmaW5nZXIgbW92ZVxuLy8gICAgWm9vbSAtIG1pZGRsZSBtb3VzZSwgb3IgbW91c2V3aGVlbCAvIHRvdWNoOiB0d28gZmluZ2VyIHNwcmVhZCBvciBzcXVpc2hcbi8vICAgIFBhbiAtIHJpZ2h0IG1vdXNlLCBvciBhcnJvdyBrZXlzIC8gdG91Y2g6IHRocmVlIGZpbnRlciBzd2lwZVxuXG52YXIgVGhyZWVPcmJpdENvbnRyb2xzID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfRXZlbnREaXNwYXRjaGVyKSB7XG4gIGZ1bmN0aW9uIFRocmVlT3JiaXRDb250cm9scyhvYmplY3QsIGRvbUVsZW1lbnQsIGV2ZW50SGFuZGxlcikge1xuICAgIHZhciBfdGhpcztcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIFRocmVlT3JiaXRDb250cm9scyk7XG5cbiAgICBfdGhpcyA9IHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgZ2V0UHJvdG90eXBlT2YkMihUaHJlZU9yYml0Q29udHJvbHMpLmNhbGwodGhpcykpO1xuICAgIF90aGlzLm9iamVjdCA9IG9iamVjdDtcbiAgICBfdGhpcy5kb21FbGVtZW50ID0gZG9tRWxlbWVudCA9PT0gdW5kZWZpbmVkID8gZG9jdW1lbnQgOiBkb21FbGVtZW50O1xuICAgIF90aGlzLmV2ZW50SGFuZGxlciA9IGV2ZW50SGFuZGxlcjsgLy8gU2V0IHRvIGZhbHNlIHRvIGRpc2FibGUgdGhpcyBjb250cm9sXG5cbiAgICBfdGhpcy5lbmFibGVkID0gdHJ1ZTsgLy8gXCJ0YXJnZXRcIiBzZXRzIHRoZSBsb2NhdGlvbiBvZiBmb2N1cywgd2hlcmUgdGhlIG9iamVjdCBvcmJpdHMgYXJvdW5kXG5cbiAgICBfdGhpcy50YXJnZXQgPSBuZXcgVmVjdG9yMygpOyAvLyBIb3cgZmFyIHlvdSBjYW4gZG9sbHkgaW4gYW5kIG91dCAoIFBlcnNwZWN0aXZlQ2FtZXJhIG9ubHkgKVxuXG4gICAgX3RoaXMubWluRGlzdGFuY2UgPSAwO1xuICAgIF90aGlzLm1heERpc3RhbmNlID0gSW5maW5pdHk7IC8vIEhvdyBmYXIgeW91IGNhbiB6b29tIGluIGFuZCBvdXQgKCBPcnRob2dyYXBoaWNDYW1lcmEgb25seSApXG5cbiAgICBfdGhpcy5taW5ab29tID0gMDtcbiAgICBfdGhpcy5tYXhab29tID0gSW5maW5pdHk7IC8vIEhvdyBmYXIgeW91IGNhbiBvcmJpdCB2ZXJ0aWNhbGx5LCB1cHBlciBhbmQgbG93ZXIgbGltaXRzLlxuICAgIC8vIFJhbmdlIGlzIDAgdG8gTWF0aC5QSSByYWRpYW5zLlxuXG4gICAgX3RoaXMubWluUG9sYXJBbmdsZSA9IDA7IC8vIHJhZGlhbnNcblxuICAgIF90aGlzLm1heFBvbGFyQW5nbGUgPSBNYXRoLlBJOyAvLyByYWRpYW5zXG4gICAgLy8gSG93IGZhciB5b3UgY2FuIG9yYml0IGhvcml6b250YWxseSwgdXBwZXIgYW5kIGxvd2VyIGxpbWl0cy5cbiAgICAvLyBJZiBzZXQsIG11c3QgYmUgYSBzdWItaW50ZXJ2YWwgb2YgdGhlIGludGVydmFsIFsgLSBNYXRoLlBJLCBNYXRoLlBJIF0uXG5cbiAgICBfdGhpcy5taW5BemltdXRoQW5nbGUgPSAtSW5maW5pdHk7IC8vIHJhZGlhbnNcblxuICAgIF90aGlzLm1heEF6aW11dGhBbmdsZSA9IEluZmluaXR5OyAvLyByYWRpYW5zXG4gICAgLy8gU2V0IHRvIHRydWUgdG8gZW5hYmxlIGRhbXBpbmcgKGluZXJ0aWEpXG4gICAgLy8gSWYgZGFtcGluZyBpcyBlbmFibGVkLCB5b3UgbXVzdCBjYWxsIGNvbnRyb2xzLnVwZGF0ZSgpIGluIHlvdXIgYW5pbWF0aW9uIGxvb3BcblxuICAgIF90aGlzLmVuYWJsZURhbXBpbmcgPSBmYWxzZTtcbiAgICBfdGhpcy5kYW1waW5nRmFjdG9yID0gMC4yNTsgLy8gVGhpcyBvcHRpb24gYWN0dWFsbHkgZW5hYmxlcyBkb2xseWluZyBpbiBhbmQgb3V0OyBsZWZ0IGFzIFwiem9vbVwiIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS5cbiAgICAvLyBTZXQgdG8gZmFsc2UgdG8gZGlzYWJsZSB6b29taW5nXG5cbiAgICBfdGhpcy5lbmFibGVab29tID0gdHJ1ZTtcbiAgICBfdGhpcy56b29tU3BlZWQgPSAxLjA7IC8vIFNldCB0byBmYWxzZSB0byBkaXNhYmxlIHJvdGF0aW5nXG5cbiAgICBfdGhpcy5lbmFibGVSb3RhdGUgPSB0cnVlO1xuICAgIF90aGlzLnJvdGF0ZVNwZWVkID0gMS4wOyAvLyBTZXQgdG8gZmFsc2UgdG8gZGlzYWJsZSBwYW5uaW5nXG5cbiAgICBfdGhpcy5lbmFibGVQYW4gPSB0cnVlO1xuICAgIF90aGlzLmtleVBhblNwZWVkID0gNy4wOyAvLyBwaXhlbHMgbW92ZWQgcGVyIGFycm93IGtleSBwdXNoXG4gICAgLy8gU2V0IHRvIHRydWUgdG8gYXV0b21hdGljYWxseSByb3RhdGUgYXJvdW5kIHRoZSB0YXJnZXRcbiAgICAvLyBJZiBhdXRvLXJvdGF0ZSBpcyBlbmFibGVkLCB5b3UgbXVzdCBjYWxsIGNvbnRyb2xzLnVwZGF0ZSgpIGluIHlvdXIgYW5pbWF0aW9uIGxvb3BcblxuICAgIF90aGlzLmF1dG9Sb3RhdGUgPSBmYWxzZTtcbiAgICBfdGhpcy5hdXRvUm90YXRlU3BlZWQgPSAyLjA7IC8vIDMwIHNlY29uZHMgcGVyIHJvdW5kIHdoZW4gZnBzIGlzIDYwXG4gICAgLy8gU2V0IHRvIGZhbHNlIHRvIGRpc2FibGUgdXNlIG9mIHRoZSBrZXlzXG5cbiAgICBfdGhpcy5lbmFibGVLZXlzID0gdHJ1ZTsgLy8gVGhlIGZvdXIgYXJyb3cga2V5c1xuXG4gICAgX3RoaXMua2V5cyA9IHtcbiAgICAgIExFRlQ6IDM3LFxuICAgICAgVVA6IDM4LFxuICAgICAgUklHSFQ6IDM5LFxuICAgICAgQk9UVE9NOiA0MFxuICAgIH07IC8vIE1vdXNlIGJ1dHRvbnNcblxuICAgIF90aGlzLm1vdXNlQnV0dG9ucyA9IHtcbiAgICAgIE9SQklUOiBNT1VTRS5MRUZULFxuICAgICAgWk9PTTogTU9VU0UuTUlERExFLFxuICAgICAgUEFOOiBNT1VTRS5SSUdIVFxuICAgIH07IC8vIGZvciByZXNldFxuXG4gICAgX3RoaXMudGFyZ2V0MCA9IF90aGlzLnRhcmdldC5jbG9uZSgpO1xuICAgIF90aGlzLnBvc2l0aW9uMCA9IF90aGlzLm9iamVjdC5wb3NpdGlvbi5jbG9uZSgpO1xuICAgIF90aGlzLnpvb20wID0gX3RoaXMub2JqZWN0Lnpvb207IC8vXG4gICAgLy8gcHVibGljIG1ldGhvZHNcbiAgICAvL1xuXG4gICAgX3RoaXMuZ2V0UG9sYXJBbmdsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBzcGhlcmljYWwucGhpO1xuICAgIH07XG5cbiAgICBfdGhpcy5nZXRBemltdXRoYWxBbmdsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBzcGhlcmljYWwudGhldGE7XG4gICAgfTtcblxuICAgIF90aGlzLnJlc2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgX3RoaXMudGFyZ2V0LmNvcHkoX3RoaXMudGFyZ2V0MCk7XG5cbiAgICAgIF90aGlzLm9iamVjdC5wb3NpdGlvbi5jb3B5KF90aGlzLnBvc2l0aW9uMCk7XG5cbiAgICAgIF90aGlzLm9iamVjdC56b29tID0gX3RoaXMuem9vbTA7XG5cbiAgICAgIF90aGlzLm9iamVjdC51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XG5cbiAgICAgIF90aGlzLmRpc3BhdGNoRXZlbnQoY2hhbmdlRXZlbnQpO1xuXG4gICAgICBfdGhpcy51cGRhdGUoKTtcblxuICAgICAgc3RhdGUgPSBTVEFURS5OT05FO1xuICAgIH07IC8vIHRoaXMgbWV0aG9kIGlzIGV4cG9zZWQsIGJ1dCBwZXJoYXBzIGl0IHdvdWxkIGJlIGJldHRlciBpZiB3ZSBjYW4gbWFrZSBpdCBwcml2YXRlLi4uXG5cblxuICAgIF90aGlzLnVwZGF0ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBvZmZzZXQgPSBuZXcgVmVjdG9yMygpOyAvLyBzbyBjYW1lcmEudXAgaXMgdGhlIG9yYml0IGF4aXNcblxuICAgICAgdmFyIHF1YXQgPSBuZXcgUXVhdGVybmlvbigpLnNldEZyb21Vbml0VmVjdG9ycyhvYmplY3QudXAsIG5ldyBWZWN0b3IzKDAsIDEsIDApKTtcbiAgICAgIHZhciBxdWF0SW52ZXJzZSA9IHF1YXQuY2xvbmUoKS5pbnZlcnNlKCk7XG4gICAgICB2YXIgbGFzdFBvc2l0aW9uID0gbmV3IFZlY3RvcjMoKTtcbiAgICAgIHZhciBsYXN0UXVhdGVybmlvbiA9IG5ldyBRdWF0ZXJuaW9uKCk7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgcG9zaXRpb24gPSBfdGhpcy5vYmplY3QucG9zaXRpb247XG4gICAgICAgIG9mZnNldC5jb3B5KHBvc2l0aW9uKS5zdWIoX3RoaXMudGFyZ2V0KTsgLy8gcm90YXRlIG9mZnNldCB0byBcInktYXhpcy1pcy11cFwiIHNwYWNlXG5cbiAgICAgICAgb2Zmc2V0LmFwcGx5UXVhdGVybmlvbihxdWF0KTsgLy8gYW5nbGUgZnJvbSB6LWF4aXMgYXJvdW5kIHktYXhpc1xuXG4gICAgICAgIHNwaGVyaWNhbC5zZXRGcm9tVmVjdG9yMyhvZmZzZXQpO1xuICAgICAgICBpZiAoX3RoaXMuYXV0b1JvdGF0ZSAmJiBzdGF0ZSA9PT0gU1RBVEUuTk9ORSkgcm90YXRlTGVmdChnZXRBdXRvUm90YXRpb25BbmdsZSgpKTtcbiAgICAgICAgc3BoZXJpY2FsLnRoZXRhICs9IHNwaGVyaWNhbERlbHRhLnRoZXRhO1xuICAgICAgICBzcGhlcmljYWwucGhpICs9IHNwaGVyaWNhbERlbHRhLnBoaTsgLy8gcmVzdHJpY3QgdGhldGEgdG8gYmUgYmV0d2VlbiBkZXNpcmVkIGxpbWl0c1xuXG4gICAgICAgIHNwaGVyaWNhbC50aGV0YSA9IE1hdGgubWF4KF90aGlzLm1pbkF6aW11dGhBbmdsZSwgTWF0aC5taW4oX3RoaXMubWF4QXppbXV0aEFuZ2xlLCBzcGhlcmljYWwudGhldGEpKTsgLy8gcmVzdHJpY3QgcGhpIHRvIGJlIGJldHdlZW4gZGVzaXJlZCBsaW1pdHNcblxuICAgICAgICBzcGhlcmljYWwucGhpID0gTWF0aC5tYXgoX3RoaXMubWluUG9sYXJBbmdsZSwgTWF0aC5taW4oX3RoaXMubWF4UG9sYXJBbmdsZSwgc3BoZXJpY2FsLnBoaSkpO1xuICAgICAgICBzcGhlcmljYWwubWFrZVNhZmUoKTtcbiAgICAgICAgc3BoZXJpY2FsLnJhZGl1cyAqPSBzY2FsZTsgLy8gcmVzdHJpY3QgcmFkaXVzIHRvIGJlIGJldHdlZW4gZGVzaXJlZCBsaW1pdHNcblxuICAgICAgICBzcGhlcmljYWwucmFkaXVzID0gTWF0aC5tYXgoX3RoaXMubWluRGlzdGFuY2UsIE1hdGgubWluKF90aGlzLm1heERpc3RhbmNlLCBzcGhlcmljYWwucmFkaXVzKSk7IC8vIG1vdmUgdGFyZ2V0IHRvIHBhbm5lZCBsb2NhdGlvblxuXG4gICAgICAgIF90aGlzLnRhcmdldC5hZGQocGFuT2Zmc2V0KTtcblxuICAgICAgICBvZmZzZXQuc2V0RnJvbVNwaGVyaWNhbChzcGhlcmljYWwpOyAvLyByb3RhdGUgb2Zmc2V0IGJhY2sgdG8gXCJjYW1lcmEtdXAtdmVjdG9yLWlzLXVwXCIgc3BhY2VcblxuICAgICAgICBvZmZzZXQuYXBwbHlRdWF0ZXJuaW9uKHF1YXRJbnZlcnNlKTtcbiAgICAgICAgcG9zaXRpb24uY29weShfdGhpcy50YXJnZXQpLmFkZChvZmZzZXQpO1xuXG4gICAgICAgIF90aGlzLm9iamVjdC5sb29rQXQoX3RoaXMudGFyZ2V0KTtcblxuICAgICAgICBpZiAoX3RoaXMuZW5hYmxlRGFtcGluZyA9PT0gdHJ1ZSkge1xuICAgICAgICAgIHNwaGVyaWNhbERlbHRhLnRoZXRhICo9IDEgLSBfdGhpcy5kYW1waW5nRmFjdG9yO1xuICAgICAgICAgIHNwaGVyaWNhbERlbHRhLnBoaSAqPSAxIC0gX3RoaXMuZGFtcGluZ0ZhY3RvcjtcbiAgICAgICAgfSBlbHNlIHNwaGVyaWNhbERlbHRhLnNldCgwLCAwLCAwKTtcblxuICAgICAgICBzY2FsZSA9IDE7XG4gICAgICAgIHBhbk9mZnNldC5zZXQoMCwgMCwgMCk7IC8vIHVwZGF0ZSBjb25kaXRpb24gaXM6XG4gICAgICAgIC8vIG1pbihjYW1lcmEgZGlzcGxhY2VtZW50LCBjYW1lcmEgcm90YXRpb24gaW4gcmFkaWFucyleMiA+IEVQU1xuICAgICAgICAvLyB1c2luZyBzbWFsbC1hbmdsZSBhcHByb3hpbWF0aW9uIGNvcyh4LzIpID0gMSAtIHheMiAvIDhcblxuICAgICAgICBpZiAoem9vbUNoYW5nZWQgfHwgbGFzdFBvc2l0aW9uLmRpc3RhbmNlVG9TcXVhcmVkKF90aGlzLm9iamVjdC5wb3NpdGlvbikgPiBFUFMgfHwgOCAqICgxIC0gbGFzdFF1YXRlcm5pb24uZG90KF90aGlzLm9iamVjdC5xdWF0ZXJuaW9uKSkgPiBFUFMpIHtcbiAgICAgICAgICBfdGhpcy5kaXNwYXRjaEV2ZW50KGNoYW5nZUV2ZW50KTtcblxuICAgICAgICAgIGxhc3RQb3NpdGlvbi5jb3B5KF90aGlzLm9iamVjdC5wb3NpdGlvbik7XG4gICAgICAgICAgbGFzdFF1YXRlcm5pb24uY29weShfdGhpcy5vYmplY3QucXVhdGVybmlvbik7XG4gICAgICAgICAgem9vbUNoYW5nZWQgPSBmYWxzZTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0oKTtcbiAgICB9O1xuXG4gICAgX3RoaXMuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIF90aGlzLmRvbUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY29udGV4dG1lbnUnLCBvbkNvbnRleHRNZW51LCBmYWxzZSk7XG5cbiAgICAgIF90aGlzLmRvbUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgb25Nb3VzZURvd24sIGZhbHNlKTtcblxuICAgICAgX3RoaXMuZG9tRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd3aGVlbCcsIG9uTW91c2VXaGVlbCwgZmFsc2UpO1xuXG4gICAgICBfdGhpcy5kb21FbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCBvblRvdWNoU3RhcnQsIGZhbHNlKTtcblxuICAgICAgX3RoaXMuZG9tRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIG9uVG91Y2hFbmQsIGZhbHNlKTtcblxuICAgICAgX3RoaXMuZG9tRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCBvblRvdWNoTW92ZSwgZmFsc2UpO1xuXG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBvbk1vdXNlTW92ZSwgZmFsc2UpO1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIG9uTW91c2VVcCwgZmFsc2UpO1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBvbktleURvd24sIGZhbHNlKTsgLy8gdGhpcy5kaXNwYXRjaEV2ZW50KCB7IHR5cGU6ICdkaXNwb3NlJyB9ICk7IC8vIHNob3VsZCB0aGlzIGJlIGFkZGVkIGhlcmU/XG4gICAgfTsgLy9cbiAgICAvLyBpbnRlcm5hbHNcbiAgICAvL1xuXG5cbiAgICB2YXIgY2hhbmdlRXZlbnQgPSB7XG4gICAgICB0eXBlOiAnY2hhbmdlJ1xuICAgIH07XG4gICAgdmFyIHN0YXJ0RXZlbnQgPSB7XG4gICAgICB0eXBlOiAnc3RhcnQnXG4gICAgfTtcbiAgICB2YXIgZW5kRXZlbnQgPSB7XG4gICAgICB0eXBlOiAnZW5kJ1xuICAgIH07XG4gICAgdmFyIFNUQVRFID0ge1xuICAgICAgTk9ORTogLTEsXG4gICAgICBST1RBVEU6IDAsXG4gICAgICBET0xMWTogMSxcbiAgICAgIFBBTjogMixcbiAgICAgIFRPVUNIX1JPVEFURTogMyxcbiAgICAgIFRPVUNIX0RPTExZOiA0LFxuICAgICAgVE9VQ0hfUEFOOiA1XG4gICAgfTtcbiAgICB2YXIgc3RhdGUgPSBTVEFURS5OT05FO1xuICAgIHZhciBFUFMgPSAwLjAwMDAwMTsgLy8gY3VycmVudCBwb3NpdGlvbiBpbiBzcGhlcmljYWwgY29vcmRpbmF0ZXNcblxuICAgIHZhciBzcGhlcmljYWwgPSBuZXcgU3BoZXJpY2FsKCk7XG4gICAgdmFyIHNwaGVyaWNhbERlbHRhID0gbmV3IFNwaGVyaWNhbCgpO1xuICAgIHZhciBzY2FsZSA9IDE7XG4gICAgdmFyIHBhbk9mZnNldCA9IG5ldyBWZWN0b3IzKCk7XG4gICAgdmFyIHpvb21DaGFuZ2VkID0gZmFsc2U7XG4gICAgdmFyIHJvdGF0ZVN0YXJ0ID0gbmV3IFZlY3RvcjIoKTtcbiAgICB2YXIgcm90YXRlRW5kID0gbmV3IFZlY3RvcjIoKTtcbiAgICB2YXIgcm90YXRlRGVsdGEgPSBuZXcgVmVjdG9yMigpO1xuICAgIHZhciBwYW5TdGFydCA9IG5ldyBWZWN0b3IyKCk7XG4gICAgdmFyIHBhbkVuZCA9IG5ldyBWZWN0b3IyKCk7XG4gICAgdmFyIHBhbkRlbHRhID0gbmV3IFZlY3RvcjIoKTtcbiAgICB2YXIgZG9sbHlTdGFydCA9IG5ldyBWZWN0b3IyKCk7XG4gICAgdmFyIGRvbGx5RW5kID0gbmV3IFZlY3RvcjIoKTtcbiAgICB2YXIgZG9sbHlEZWx0YSA9IG5ldyBWZWN0b3IyKCk7XG5cbiAgICB2YXIgZ2V0QXV0b1JvdGF0aW9uQW5nbGUgPSBmdW5jdGlvbiBnZXRBdXRvUm90YXRpb25BbmdsZSgpIHtcbiAgICAgIHJldHVybiAyICogTWF0aC5QSSAvIDYwIC8gNjAgKiBfdGhpcy5hdXRvUm90YXRlU3BlZWQ7XG4gICAgfTtcblxuICAgIHZhciBnZXRab29tU2NhbGUgPSBmdW5jdGlvbiBnZXRab29tU2NhbGUoKSB7XG4gICAgICByZXR1cm4gTWF0aC5wb3coMC45NSwgX3RoaXMuem9vbVNwZWVkKTtcbiAgICB9O1xuXG4gICAgdmFyIHJvdGF0ZUxlZnQgPSBmdW5jdGlvbiByb3RhdGVMZWZ0KGFuZ2xlKSB7XG4gICAgICBzcGhlcmljYWxEZWx0YS50aGV0YSAtPSBhbmdsZTtcbiAgICB9O1xuXG4gICAgdmFyIHJvdGF0ZVVwID0gZnVuY3Rpb24gcm90YXRlVXAoYW5nbGUpIHtcbiAgICAgIHNwaGVyaWNhbERlbHRhLnBoaSAtPSBhbmdsZTtcbiAgICB9O1xuXG4gICAgdmFyIHBhbkxlZnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgdiA9IG5ldyBWZWN0b3IzKCk7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKGRpc3RhbmNlLCBvYmplY3RNYXRyaXgpIHtcbiAgICAgICAgdi5zZXRGcm9tTWF0cml4Q29sdW1uKG9iamVjdE1hdHJpeCwgMCk7IC8vIGdldCBYIGNvbHVtbiBvZiBvYmplY3RNYXRyaXhcblxuICAgICAgICB2Lm11bHRpcGx5U2NhbGFyKC1kaXN0YW5jZSk7XG4gICAgICAgIHBhbk9mZnNldC5hZGQodik7XG4gICAgICB9O1xuICAgIH0oKTtcblxuICAgIHZhciBwYW5VcCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciB2ID0gbmV3IFZlY3RvcjMoKTtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoZGlzdGFuY2UsIG9iamVjdE1hdHJpeCkge1xuICAgICAgICB2LnNldEZyb21NYXRyaXhDb2x1bW4ob2JqZWN0TWF0cml4LCAxKTsgLy8gZ2V0IFkgY29sdW1uIG9mIG9iamVjdE1hdHJpeFxuXG4gICAgICAgIHYubXVsdGlwbHlTY2FsYXIoZGlzdGFuY2UpO1xuICAgICAgICBwYW5PZmZzZXQuYWRkKHYpO1xuICAgICAgfTtcbiAgICB9KCk7IC8vIGRlbHRhWCBhbmQgZGVsdGFZIGFyZSBpbiBwaXhlbHM7IHJpZ2h0IGFuZCBkb3duIGFyZSBwb3NpdGl2ZVxuXG5cbiAgICB2YXIgcGFuID0gZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIG9mZnNldCA9IG5ldyBWZWN0b3IzKCk7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKGRlbHRhWCwgZGVsdGFZKSB7XG4gICAgICAgIHZhciBlbGVtZW50ID0gX3RoaXMuZG9tRWxlbWVudCA9PT0gZG9jdW1lbnQgPyBfdGhpcy5kb21FbGVtZW50LmJvZHkgOiBfdGhpcy5kb21FbGVtZW50O1xuXG4gICAgICAgIGlmIChfdGhpcy5vYmplY3QgaW5zdGFuY2VvZiBQZXJzcGVjdGl2ZUNhbWVyYSkge1xuICAgICAgICAgIC8vIHBlcnNwZWN0aXZlXG4gICAgICAgICAgdmFyIHBvc2l0aW9uID0gX3RoaXMub2JqZWN0LnBvc2l0aW9uO1xuICAgICAgICAgIG9mZnNldC5jb3B5KHBvc2l0aW9uKS5zdWIoX3RoaXMudGFyZ2V0KTtcbiAgICAgICAgICB2YXIgdGFyZ2V0RGlzdGFuY2UgPSBvZmZzZXQubGVuZ3RoKCk7IC8vIGhhbGYgb2YgdGhlIGZvdiBpcyBjZW50ZXIgdG8gdG9wIG9mIHNjcmVlblxuXG4gICAgICAgICAgdGFyZ2V0RGlzdGFuY2UgKj0gTWF0aC50YW4oX3RoaXMub2JqZWN0LmZvdiAvIDIgKiBNYXRoLlBJIC8gMTgwLjApOyAvLyB3ZSBhY3R1YWxseSBkb24ndCB1c2Ugc2NyZWVuV2lkdGgsIHNpbmNlIHBlcnNwZWN0aXZlIGNhbWVyYSBpcyBmaXhlZCB0byBzY3JlZW4gaGVpZ2h0XG5cbiAgICAgICAgICBwYW5MZWZ0KDIgKiBkZWx0YVggKiB0YXJnZXREaXN0YW5jZSAvIGVsZW1lbnQuY2xpZW50SGVpZ2h0LCBfdGhpcy5vYmplY3QubWF0cml4KTtcbiAgICAgICAgICBwYW5VcCgyICogZGVsdGFZICogdGFyZ2V0RGlzdGFuY2UgLyBlbGVtZW50LmNsaWVudEhlaWdodCwgX3RoaXMub2JqZWN0Lm1hdHJpeCk7XG4gICAgICAgIH0gZWxzZSBpZiAoX3RoaXMub2JqZWN0IGluc3RhbmNlb2YgT3J0aG9ncmFwaGljQ2FtZXJhKSB7XG4gICAgICAgICAgLy8gb3J0aG9ncmFwaGljXG4gICAgICAgICAgcGFuTGVmdChkZWx0YVggKiAoX3RoaXMub2JqZWN0LnJpZ2h0IC0gX3RoaXMub2JqZWN0LmxlZnQpIC8gX3RoaXMub2JqZWN0Lnpvb20gLyBlbGVtZW50LmNsaWVudFdpZHRoLCBfdGhpcy5vYmplY3QubWF0cml4KTtcbiAgICAgICAgICBwYW5VcChkZWx0YVkgKiAoX3RoaXMub2JqZWN0LnRvcCAtIF90aGlzLm9iamVjdC5ib3R0b20pIC8gX3RoaXMub2JqZWN0Lnpvb20gLyBlbGVtZW50LmNsaWVudEhlaWdodCwgX3RoaXMub2JqZWN0Lm1hdHJpeCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gY2FtZXJhIG5laXRoZXIgb3J0aG9ncmFwaGljIG5vciBwZXJzcGVjdGl2ZVxuICAgICAgICAgIGNvbnNvbGUud2FybignV0FSTklORzogT3JiaXRDb250cm9sc01vZHVsZS5qcyBlbmNvdW50ZXJlZCBhbiB1bmtub3duIGNhbWVyYSB0eXBlIC0gcGFuIGRpc2FibGVkLicpO1xuICAgICAgICAgIF90aGlzLmVuYWJsZVBhbiA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0oKTtcblxuICAgIHZhciBkb2xseUluID0gZnVuY3Rpb24gZG9sbHlJbihkb2xseVNjYWxlKSB7XG4gICAgICBpZiAoX3RoaXMub2JqZWN0IGluc3RhbmNlb2YgUGVyc3BlY3RpdmVDYW1lcmEpIHNjYWxlIC89IGRvbGx5U2NhbGU7ZWxzZSBpZiAoX3RoaXMub2JqZWN0IGluc3RhbmNlb2YgT3J0aG9ncmFwaGljQ2FtZXJhKSB7XG4gICAgICAgIF90aGlzLm9iamVjdC56b29tID0gTWF0aC5tYXgoX3RoaXMubWluWm9vbSwgTWF0aC5taW4oX3RoaXMubWF4Wm9vbSwgX3RoaXMub2JqZWN0Lnpvb20gKiBkb2xseVNjYWxlKSk7XG5cbiAgICAgICAgX3RoaXMub2JqZWN0LnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtcblxuICAgICAgICB6b29tQ2hhbmdlZCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1dBUk5JTkc6IE9yYml0Q29udHJvbHNNb2R1bGUuanMgZW5jb3VudGVyZWQgYW4gdW5rbm93biBjYW1lcmEgdHlwZSAtIGRvbGx5L3pvb20gZGlzYWJsZWQuJyk7XG4gICAgICAgIF90aGlzLmVuYWJsZVpvb20gPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdmFyIGRvbGx5T3V0ID0gZnVuY3Rpb24gZG9sbHlPdXQoZG9sbHlTY2FsZSkge1xuICAgICAgaWYgKF90aGlzLm9iamVjdCBpbnN0YW5jZW9mIFBlcnNwZWN0aXZlQ2FtZXJhKSBzY2FsZSAqPSBkb2xseVNjYWxlO2Vsc2UgaWYgKF90aGlzLm9iamVjdCBpbnN0YW5jZW9mIE9ydGhvZ3JhcGhpY0NhbWVyYSkge1xuICAgICAgICBfdGhpcy5vYmplY3Quem9vbSA9IE1hdGgubWF4KF90aGlzLm1pblpvb20sIE1hdGgubWluKF90aGlzLm1heFpvb20sIF90aGlzLm9iamVjdC56b29tIC8gZG9sbHlTY2FsZSkpO1xuXG4gICAgICAgIF90aGlzLm9iamVjdC51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XG5cbiAgICAgICAgem9vbUNoYW5nZWQgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdXQVJOSU5HOiBPcmJpdENvbnRyb2xzTW9kdWxlLmpzIGVuY291bnRlcmVkIGFuIHVua25vd24gY2FtZXJhIHR5cGUgLSBkb2xseS96b29tIGRpc2FibGVkLicpO1xuICAgICAgICBfdGhpcy5lbmFibGVab29tID0gZmFsc2U7XG4gICAgICB9XG4gICAgfTsgLy9cbiAgICAvLyBldmVudCBjYWxsYmFja3MgLSB1cGRhdGUgdGhlIG9iamVjdCBzdGF0ZVxuICAgIC8vXG5cblxuICAgIHZhciBoYW5kbGVNb3VzZURvd25Sb3RhdGUgPSBmdW5jdGlvbiBoYW5kbGVNb3VzZURvd25Sb3RhdGUoZXZlbnQpIHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKCAnaGFuZGxlTW91c2VEb3duUm90YXRlJyApO1xuICAgICAgcm90YXRlU3RhcnQuc2V0KGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFkpO1xuICAgIH07XG5cbiAgICB2YXIgaGFuZGxlTW91c2VEb3duRG9sbHkgPSBmdW5jdGlvbiBoYW5kbGVNb3VzZURvd25Eb2xseShldmVudCkge1xuICAgICAgLy8gY29uc29sZS5sb2coICdoYW5kbGVNb3VzZURvd25Eb2xseScgKTtcbiAgICAgIGRvbGx5U3RhcnQuc2V0KGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFkpO1xuICAgIH07XG5cbiAgICB2YXIgaGFuZGxlTW91c2VEb3duUGFuID0gZnVuY3Rpb24gaGFuZGxlTW91c2VEb3duUGFuKGV2ZW50KSB7XG4gICAgICAvLyBjb25zb2xlLmxvZyggJ2hhbmRsZU1vdXNlRG93blBhbicgKTtcbiAgICAgIHBhblN0YXJ0LnNldChldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZKTtcbiAgICB9O1xuXG4gICAgdmFyIGhhbmRsZU1vdXNlTW92ZVJvdGF0ZSA9IGZ1bmN0aW9uIGhhbmRsZU1vdXNlTW92ZVJvdGF0ZShldmVudCkge1xuICAgICAgLy8gY29uc29sZS5sb2coICdoYW5kbGVNb3VzZU1vdmVSb3RhdGUnICk7XG4gICAgICByb3RhdGVFbmQuc2V0KGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFkpO1xuICAgICAgcm90YXRlRGVsdGEuc3ViVmVjdG9ycyhyb3RhdGVFbmQsIHJvdGF0ZVN0YXJ0KTtcbiAgICAgIHZhciBlbGVtZW50ID0gX3RoaXMuZG9tRWxlbWVudCA9PT0gZG9jdW1lbnQgPyBfdGhpcy5kb21FbGVtZW50LmJvZHkgOiBfdGhpcy5kb21FbGVtZW50OyAvLyByb3RhdGluZyBhY3Jvc3Mgd2hvbGUgc2NyZWVuIGdvZXMgMzYwIGRlZ3JlZXMgYXJvdW5kXG5cbiAgICAgIHJvdGF0ZUxlZnQoMiAqIE1hdGguUEkgKiByb3RhdGVEZWx0YS54IC8gZWxlbWVudC5jbGllbnRXaWR0aCAqIF90aGlzLnJvdGF0ZVNwZWVkKTsgLy8gcm90YXRpbmcgdXAgYW5kIGRvd24gYWxvbmcgd2hvbGUgc2NyZWVuIGF0dGVtcHRzIHRvIGdvIDM2MCwgYnV0IGxpbWl0ZWQgdG8gMTgwXG5cbiAgICAgIHJvdGF0ZVVwKDIgKiBNYXRoLlBJICogcm90YXRlRGVsdGEueSAvIGVsZW1lbnQuY2xpZW50SGVpZ2h0ICogX3RoaXMucm90YXRlU3BlZWQpO1xuICAgICAgcm90YXRlU3RhcnQuY29weShyb3RhdGVFbmQpO1xuXG4gICAgICBfdGhpcy51cGRhdGUoKTtcbiAgICB9O1xuXG4gICAgdmFyIGhhbmRsZU1vdXNlTW92ZURvbGx5ID0gZnVuY3Rpb24gaGFuZGxlTW91c2VNb3ZlRG9sbHkoZXZlbnQpIHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKCAnaGFuZGxlTW91c2VNb3ZlRG9sbHknICk7XG4gICAgICBkb2xseUVuZC5zZXQoZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSk7XG4gICAgICBkb2xseURlbHRhLnN1YlZlY3RvcnMoZG9sbHlFbmQsIGRvbGx5U3RhcnQpO1xuICAgICAgaWYgKGRvbGx5RGVsdGEueSA+IDApIGRvbGx5SW4oZ2V0Wm9vbVNjYWxlKCkpO2Vsc2UgaWYgKGRvbGx5RGVsdGEueSA8IDApIGRvbGx5T3V0KGdldFpvb21TY2FsZSgpKTtcbiAgICAgIGRvbGx5U3RhcnQuY29weShkb2xseUVuZCk7XG5cbiAgICAgIF90aGlzLnVwZGF0ZSgpO1xuICAgIH07XG5cbiAgICB2YXIgaGFuZGxlTW91c2VNb3ZlUGFuID0gZnVuY3Rpb24gaGFuZGxlTW91c2VNb3ZlUGFuKGV2ZW50KSB7XG4gICAgICAvLyBjb25zb2xlLmxvZyggJ2hhbmRsZU1vdXNlTW92ZVBhbicgKTtcbiAgICAgIHBhbkVuZC5zZXQoZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSk7XG4gICAgICBwYW5EZWx0YS5zdWJWZWN0b3JzKHBhbkVuZCwgcGFuU3RhcnQpO1xuICAgICAgcGFuKHBhbkRlbHRhLngsIHBhbkRlbHRhLnkpO1xuICAgICAgcGFuU3RhcnQuY29weShwYW5FbmQpO1xuXG4gICAgICBfdGhpcy51cGRhdGUoKTtcbiAgICB9O1xuXG4gICAgdmFyIGhhbmRsZU1vdXNlV2hlZWwgPSBmdW5jdGlvbiBoYW5kbGVNb3VzZVdoZWVsKGV2ZW50KSB7XG4gICAgICAvLyBjb25zb2xlLmxvZyggJ2hhbmRsZU1vdXNlV2hlZWwnICk7XG4gICAgICBpZiAoZXZlbnQuZGVsdGFZIDwgMCkgZG9sbHlPdXQoZ2V0Wm9vbVNjYWxlKCkpO2Vsc2UgaWYgKGV2ZW50LmRlbHRhWSA+IDApIGRvbGx5SW4oZ2V0Wm9vbVNjYWxlKCkpO1xuXG4gICAgICBfdGhpcy51cGRhdGUoKTtcbiAgICB9O1xuXG4gICAgdmFyIGhhbmRsZUtleURvd24gPSBmdW5jdGlvbiBoYW5kbGVLZXlEb3duKGV2ZW50KSB7XG4gICAgICAvLyBjb25zb2xlLmxvZyggJ2hhbmRsZUtleURvd24nICk7XG4gICAgICBzd2l0Y2ggKGV2ZW50LmtleUNvZGUpIHtcbiAgICAgICAgY2FzZSBfdGhpcy5rZXlzLlVQOlxuICAgICAgICAgIHBhbigwLCBfdGhpcy5rZXlQYW5TcGVlZCk7XG5cbiAgICAgICAgICBfdGhpcy51cGRhdGUoKTtcblxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgX3RoaXMua2V5cy5CT1RUT006XG4gICAgICAgICAgcGFuKDAsIC1fdGhpcy5rZXlQYW5TcGVlZCk7XG5cbiAgICAgICAgICBfdGhpcy51cGRhdGUoKTtcblxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgX3RoaXMua2V5cy5MRUZUOlxuICAgICAgICAgIHBhbihfdGhpcy5rZXlQYW5TcGVlZCwgMCk7XG5cbiAgICAgICAgICBfdGhpcy51cGRhdGUoKTtcblxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgX3RoaXMua2V5cy5SSUdIVDpcbiAgICAgICAgICBwYW4oLV90aGlzLmtleVBhblNwZWVkLCAwKTtcblxuICAgICAgICAgIF90aGlzLnVwZGF0ZSgpO1xuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHZhciBoYW5kbGVUb3VjaFN0YXJ0Um90YXRlID0gZnVuY3Rpb24gaGFuZGxlVG91Y2hTdGFydFJvdGF0ZShldmVudCkge1xuICAgICAgLy8gY29uc29sZS5sb2coICdoYW5kbGVUb3VjaFN0YXJ0Um90YXRlJyApO1xuICAgICAgcm90YXRlU3RhcnQuc2V0KGV2ZW50LnRvdWNoZXNbMF0ucGFnZVgsIGV2ZW50LnRvdWNoZXNbMF0ucGFnZVkpO1xuICAgIH07XG5cbiAgICB2YXIgaGFuZGxlVG91Y2hTdGFydERvbGx5ID0gZnVuY3Rpb24gaGFuZGxlVG91Y2hTdGFydERvbGx5KGV2ZW50KSB7XG4gICAgICAvLyBjb25zb2xlLmxvZyggJ2hhbmRsZVRvdWNoU3RhcnREb2xseScgKTtcbiAgICAgIHZhciBkeCA9IGV2ZW50LnRvdWNoZXNbMF0ucGFnZVggLSBldmVudC50b3VjaGVzWzFdLnBhZ2VYO1xuICAgICAgdmFyIGR5ID0gZXZlbnQudG91Y2hlc1swXS5wYWdlWSAtIGV2ZW50LnRvdWNoZXNbMV0ucGFnZVk7XG4gICAgICB2YXIgZGlzdGFuY2UgPSBNYXRoLnNxcnQoZHggKiBkeCArIGR5ICogZHkpO1xuICAgICAgZG9sbHlTdGFydC5zZXQoMCwgZGlzdGFuY2UpO1xuICAgIH07XG5cbiAgICB2YXIgaGFuZGxlVG91Y2hTdGFydFBhbiA9IGZ1bmN0aW9uIGhhbmRsZVRvdWNoU3RhcnRQYW4oZXZlbnQpIHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKCAnaGFuZGxlVG91Y2hTdGFydFBhbicgKTtcbiAgICAgIHBhblN0YXJ0LnNldChldmVudC50b3VjaGVzWzBdLnBhZ2VYLCBldmVudC50b3VjaGVzWzBdLnBhZ2VZKTtcbiAgICB9O1xuXG4gICAgdmFyIGhhbmRsZVRvdWNoTW92ZVJvdGF0ZSA9IGZ1bmN0aW9uIGhhbmRsZVRvdWNoTW92ZVJvdGF0ZShldmVudCkge1xuICAgICAgLy8gY29uc29sZS5sb2coICdoYW5kbGVUb3VjaE1vdmVSb3RhdGUnICk7XG4gICAgICByb3RhdGVFbmQuc2V0KGV2ZW50LnRvdWNoZXNbMF0ucGFnZVgsIGV2ZW50LnRvdWNoZXNbMF0ucGFnZVkpO1xuICAgICAgcm90YXRlRGVsdGEuc3ViVmVjdG9ycyhyb3RhdGVFbmQsIHJvdGF0ZVN0YXJ0KTtcbiAgICAgIHZhciBlbGVtZW50ID0gX3RoaXMuZG9tRWxlbWVudCA9PT0gZG9jdW1lbnQgPyBfdGhpcy5kb21FbGVtZW50LmJvZHkgOiBfdGhpcy5kb21FbGVtZW50OyAvLyByb3RhdGluZyBhY3Jvc3Mgd2hvbGUgc2NyZWVuIGdvZXMgMzYwIGRlZ3JlZXMgYXJvdW5kXG5cbiAgICAgIHJvdGF0ZUxlZnQoMiAqIE1hdGguUEkgKiByb3RhdGVEZWx0YS54IC8gZWxlbWVudC5jbGllbnRXaWR0aCAqIF90aGlzLnJvdGF0ZVNwZWVkKTsgLy8gcm90YXRpbmcgdXAgYW5kIGRvd24gYWxvbmcgd2hvbGUgc2NyZWVuIGF0dGVtcHRzIHRvIGdvIDM2MCwgYnV0IGxpbWl0ZWQgdG8gMTgwXG5cbiAgICAgIHJvdGF0ZVVwKDIgKiBNYXRoLlBJICogcm90YXRlRGVsdGEueSAvIGVsZW1lbnQuY2xpZW50SGVpZ2h0ICogX3RoaXMucm90YXRlU3BlZWQpO1xuICAgICAgcm90YXRlU3RhcnQuY29weShyb3RhdGVFbmQpO1xuXG4gICAgICBfdGhpcy51cGRhdGUoKTtcbiAgICB9O1xuXG4gICAgdmFyIGhhbmRsZVRvdWNoTW92ZURvbGx5ID0gZnVuY3Rpb24gaGFuZGxlVG91Y2hNb3ZlRG9sbHkoZXZlbnQpIHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKCAnaGFuZGxlVG91Y2hNb3ZlRG9sbHknICk7XG4gICAgICB2YXIgZHggPSBldmVudC50b3VjaGVzWzBdLnBhZ2VYIC0gZXZlbnQudG91Y2hlc1sxXS5wYWdlWDtcbiAgICAgIHZhciBkeSA9IGV2ZW50LnRvdWNoZXNbMF0ucGFnZVkgLSBldmVudC50b3VjaGVzWzFdLnBhZ2VZO1xuICAgICAgdmFyIGRpc3RhbmNlID0gTWF0aC5zcXJ0KGR4ICogZHggKyBkeSAqIGR5KTtcbiAgICAgIGRvbGx5RW5kLnNldCgwLCBkaXN0YW5jZSk7XG4gICAgICBkb2xseURlbHRhLnN1YlZlY3RvcnMoZG9sbHlFbmQsIGRvbGx5U3RhcnQpO1xuICAgICAgaWYgKGRvbGx5RGVsdGEueSA+IDApIGRvbGx5T3V0KGdldFpvb21TY2FsZSgpKTtlbHNlIGlmIChkb2xseURlbHRhLnkgPCAwKSBkb2xseUluKGdldFpvb21TY2FsZSgpKTtcbiAgICAgIGRvbGx5U3RhcnQuY29weShkb2xseUVuZCk7XG5cbiAgICAgIF90aGlzLnVwZGF0ZSgpO1xuICAgIH07XG5cbiAgICB2YXIgaGFuZGxlVG91Y2hNb3ZlUGFuID0gZnVuY3Rpb24gaGFuZGxlVG91Y2hNb3ZlUGFuKGV2ZW50KSB7XG4gICAgICAvLyBjb25zb2xlLmxvZyggJ2hhbmRsZVRvdWNoTW92ZVBhbicgKTtcbiAgICAgIHBhbkVuZC5zZXQoZXZlbnQudG91Y2hlc1swXS5wYWdlWCwgZXZlbnQudG91Y2hlc1swXS5wYWdlWSk7XG4gICAgICBwYW5EZWx0YS5zdWJWZWN0b3JzKHBhbkVuZCwgcGFuU3RhcnQpO1xuICAgICAgcGFuKHBhbkRlbHRhLngsIHBhbkRlbHRhLnkpO1xuICAgICAgcGFuU3RhcnQuY29weShwYW5FbmQpO1xuXG4gICAgICBfdGhpcy51cGRhdGUoKTtcbiAgICB9O1xuICAgIC8vIGV2ZW50IGhhbmRsZXJzIC0gRlNNOiBsaXN0ZW4gZm9yIGV2ZW50cyBhbmQgcmVzZXQgc3RhdGVcbiAgICAvL1xuXG5cbiAgICB2YXIgb25Nb3VzZURvd24gPSBmdW5jdGlvbiBvbk1vdXNlRG93bihldmVudCkge1xuICAgICAgaWYgKF90aGlzLmVuYWJsZWQgPT09IGZhbHNlKSByZXR1cm47XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICBpZiAoZXZlbnQuYnV0dG9uID09PSBfdGhpcy5tb3VzZUJ1dHRvbnMuT1JCSVQpIHtcbiAgICAgICAgaWYgKF90aGlzLmVuYWJsZVJvdGF0ZSA9PT0gZmFsc2UpIHJldHVybjtcbiAgICAgICAgaGFuZGxlTW91c2VEb3duUm90YXRlKGV2ZW50KTtcbiAgICAgICAgc3RhdGUgPSBTVEFURS5ST1RBVEU7XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50LmJ1dHRvbiA9PT0gX3RoaXMubW91c2VCdXR0b25zLlpPT00pIHtcbiAgICAgICAgaWYgKF90aGlzLmVuYWJsZVpvb20gPT09IGZhbHNlKSByZXR1cm47XG4gICAgICAgIGhhbmRsZU1vdXNlRG93bkRvbGx5KGV2ZW50KTtcbiAgICAgICAgc3RhdGUgPSBTVEFURS5ET0xMWTtcbiAgICAgIH0gZWxzZSBpZiAoZXZlbnQuYnV0dG9uID09PSBfdGhpcy5tb3VzZUJ1dHRvbnMuUEFOKSB7XG4gICAgICAgIGlmIChfdGhpcy5lbmFibGVQYW4gPT09IGZhbHNlKSByZXR1cm47XG4gICAgICAgIGhhbmRsZU1vdXNlRG93blBhbihldmVudCk7XG4gICAgICAgIHN0YXRlID0gU1RBVEUuUEFOO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3RhdGUgIT09IFNUQVRFLk5PTkUpIHtcbiAgICAgICAgX3RoaXMuZXZlbnRIYW5kbGVyLm9uKCdtb3VzZW1vdmUnLCBvbk1vdXNlTW92ZSwgZmFsc2UpO1xuXG4gICAgICAgIF90aGlzLmV2ZW50SGFuZGxlci5vbignbW91c2V1cCcsIG9uTW91c2VVcCwgZmFsc2UpO1xuXG4gICAgICAgIF90aGlzLmRpc3BhdGNoRXZlbnQoc3RhcnRFdmVudCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHZhciBvbk1vdXNlTW92ZSA9IGZ1bmN0aW9uIG9uTW91c2VNb3ZlKGV2ZW50KSB7XG4gICAgICBpZiAoX3RoaXMuZW5hYmxlZCA9PT0gZmFsc2UpIHJldHVybjtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgIGlmIChzdGF0ZSA9PT0gU1RBVEUuUk9UQVRFKSB7XG4gICAgICAgIGlmIChfdGhpcy5lbmFibGVSb3RhdGUgPT09IGZhbHNlKSByZXR1cm47XG4gICAgICAgIGhhbmRsZU1vdXNlTW92ZVJvdGF0ZShldmVudCk7XG4gICAgICB9IGVsc2UgaWYgKHN0YXRlID09PSBTVEFURS5ET0xMWSkge1xuICAgICAgICBpZiAoX3RoaXMuZW5hYmxlWm9vbSA9PT0gZmFsc2UpIHJldHVybjtcbiAgICAgICAgaGFuZGxlTW91c2VNb3ZlRG9sbHkoZXZlbnQpO1xuICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PT0gU1RBVEUuUEFOKSB7XG4gICAgICAgIGlmIChfdGhpcy5lbmFibGVQYW4gPT09IGZhbHNlKSByZXR1cm47XG4gICAgICAgIGhhbmRsZU1vdXNlTW92ZVBhbihldmVudCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHZhciBvbk1vdXNlVXAgPSBmdW5jdGlvbiBvbk1vdXNlVXAoZXZlbnQpIHtcbiAgICAgIGlmIChfdGhpcy5lbmFibGVkID09PSBmYWxzZSkgcmV0dXJuO1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgb25Nb3VzZU1vdmUsIGZhbHNlKTtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBvbk1vdXNlVXAsIGZhbHNlKTtcblxuICAgICAgX3RoaXMuZGlzcGF0Y2hFdmVudChlbmRFdmVudCk7XG5cbiAgICAgIHN0YXRlID0gU1RBVEUuTk9ORTtcbiAgICB9O1xuXG4gICAgdmFyIG9uTW91c2VXaGVlbCA9IGZ1bmN0aW9uIG9uTW91c2VXaGVlbChldmVudCkge1xuICAgICAgaWYgKF90aGlzLmVuYWJsZWQgPT09IGZhbHNlIHx8IF90aGlzLmVuYWJsZVpvb20gPT09IGZhbHNlIHx8IHN0YXRlICE9PSBTVEFURS5OT05FICYmIHN0YXRlICE9PSBTVEFURS5ST1RBVEUpIHJldHVybjtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGhhbmRsZU1vdXNlV2hlZWwoZXZlbnQpO1xuXG4gICAgICBfdGhpcy5kaXNwYXRjaEV2ZW50KHN0YXJ0RXZlbnQpOyAvLyBub3Qgc3VyZSB3aHkgdGhlc2UgYXJlIGhlcmUuLi5cblxuXG4gICAgICBfdGhpcy5kaXNwYXRjaEV2ZW50KGVuZEV2ZW50KTtcbiAgICB9O1xuXG4gICAgdmFyIG9uS2V5RG93biA9IGZ1bmN0aW9uIG9uS2V5RG93bihldmVudCkge1xuICAgICAgaWYgKF90aGlzLmVuYWJsZWQgPT09IGZhbHNlIHx8IF90aGlzLmVuYWJsZUtleXMgPT09IGZhbHNlIHx8IF90aGlzLmVuYWJsZVBhbiA9PT0gZmFsc2UpIHJldHVybjtcbiAgICAgIGhhbmRsZUtleURvd24oZXZlbnQpO1xuICAgIH07XG5cbiAgICB2YXIgb25Ub3VjaFN0YXJ0ID0gZnVuY3Rpb24gb25Ub3VjaFN0YXJ0KGV2ZW50KSB7XG4gICAgICBpZiAoX3RoaXMuZW5hYmxlZCA9PT0gZmFsc2UpIHJldHVybjtcblxuICAgICAgc3dpdGNoIChldmVudC50b3VjaGVzLmxlbmd0aCkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgLy8gb25lLWZpbmdlcmVkIHRvdWNoOiByb3RhdGVcbiAgICAgICAgICBpZiAoX3RoaXMuZW5hYmxlUm90YXRlID09PSBmYWxzZSkgcmV0dXJuO1xuICAgICAgICAgIGhhbmRsZVRvdWNoU3RhcnRSb3RhdGUoZXZlbnQpO1xuICAgICAgICAgIHN0YXRlID0gU1RBVEUuVE9VQ0hfUk9UQVRFO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAvLyB0d28tZmluZ2VyZWQgdG91Y2g6IGRvbGx5XG4gICAgICAgICAgaWYgKF90aGlzLmVuYWJsZVpvb20gPT09IGZhbHNlKSByZXR1cm47XG4gICAgICAgICAgaGFuZGxlVG91Y2hTdGFydERvbGx5KGV2ZW50KTtcbiAgICAgICAgICBzdGF0ZSA9IFNUQVRFLlRPVUNIX0RPTExZO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAvLyB0aHJlZS1maW5nZXJlZCB0b3VjaDogcGFuXG4gICAgICAgICAgaWYgKF90aGlzLmVuYWJsZVBhbiA9PT0gZmFsc2UpIHJldHVybjtcbiAgICAgICAgICBoYW5kbGVUb3VjaFN0YXJ0UGFuKGV2ZW50KTtcbiAgICAgICAgICBzdGF0ZSA9IFNUQVRFLlRPVUNIX1BBTjtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHN0YXRlID0gU1RBVEUuTk9ORTtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0YXRlICE9PSBTVEFURS5OT05FKSBfdGhpcy5kaXNwYXRjaEV2ZW50KHN0YXJ0RXZlbnQpO1xuICAgIH07XG5cbiAgICB2YXIgb25Ub3VjaE1vdmUgPSBmdW5jdGlvbiBvblRvdWNoTW92ZShldmVudCkge1xuICAgICAgaWYgKF90aGlzLmVuYWJsZWQgPT09IGZhbHNlKSByZXR1cm47XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgIHN3aXRjaCAoZXZlbnQudG91Y2hlcy5sZW5ndGgpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIC8vIG9uZS1maW5nZXJlZCB0b3VjaDogcm90YXRlXG4gICAgICAgICAgaWYgKF90aGlzLmVuYWJsZVJvdGF0ZSA9PT0gZmFsc2UpIHJldHVybjtcbiAgICAgICAgICBpZiAoc3RhdGUgIT09IFNUQVRFLlRPVUNIX1JPVEFURSkgcmV0dXJuOyAvLyBpcyB0aGlzIG5lZWRlZD8uLi5cblxuICAgICAgICAgIGhhbmRsZVRvdWNoTW92ZVJvdGF0ZShldmVudCk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIC8vIHR3by1maW5nZXJlZCB0b3VjaDogZG9sbHlcbiAgICAgICAgICBpZiAoX3RoaXMuZW5hYmxlWm9vbSA9PT0gZmFsc2UpIHJldHVybjtcbiAgICAgICAgICBpZiAoc3RhdGUgIT09IFNUQVRFLlRPVUNIX0RPTExZKSByZXR1cm47IC8vIGlzIHRoaXMgbmVlZGVkPy4uLlxuXG4gICAgICAgICAgaGFuZGxlVG91Y2hNb3ZlRG9sbHkoZXZlbnQpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAvLyB0aHJlZS1maW5nZXJlZCB0b3VjaDogcGFuXG4gICAgICAgICAgaWYgKF90aGlzLmVuYWJsZVBhbiA9PT0gZmFsc2UpIHJldHVybjtcbiAgICAgICAgICBpZiAoc3RhdGUgIT09IFNUQVRFLlRPVUNIX1BBTikgcmV0dXJuOyAvLyBpcyB0aGlzIG5lZWRlZD8uLi5cblxuICAgICAgICAgIGhhbmRsZVRvdWNoTW92ZVBhbihldmVudCk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBzdGF0ZSA9IFNUQVRFLk5PTkU7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHZhciBvblRvdWNoRW5kID0gZnVuY3Rpb24gb25Ub3VjaEVuZChldmVudCkge1xuICAgICAgaWYgKF90aGlzLmVuYWJsZWQgPT09IGZhbHNlKSByZXR1cm47XG5cbiAgICAgIF90aGlzLmRpc3BhdGNoRXZlbnQoZW5kRXZlbnQpO1xuXG4gICAgICBzdGF0ZSA9IFNUQVRFLk5PTkU7XG4gICAgfTtcblxuICAgIHZhciBvbkNvbnRleHRNZW51ID0gZnVuY3Rpb24gb25Db250ZXh0TWVudShldmVudCkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9OyAvL1xuXG5cbiAgICBfdGhpcy5ldmVudEhhbmRsZXIub24oJ2NvbnRleHRtZW51Jywgb25Db250ZXh0TWVudSwgZmFsc2UpO1xuXG4gICAgX3RoaXMuZXZlbnRIYW5kbGVyLm9uKCdtb3VzZWRvd24nLCBvbk1vdXNlRG93biwgZmFsc2UpO1xuXG4gICAgX3RoaXMuZXZlbnRIYW5kbGVyLm9uKCd3aGVlbCcsIG9uTW91c2VXaGVlbCwgZmFsc2UpO1xuXG4gICAgX3RoaXMuZXZlbnRIYW5kbGVyLm9uKCd0b3VjaHN0YXJ0Jywgb25Ub3VjaFN0YXJ0LCBmYWxzZSk7XG5cbiAgICBfdGhpcy5ldmVudEhhbmRsZXIub24oJ3RvdWNoZW5kJywgb25Ub3VjaEVuZCwgZmFsc2UpO1xuXG4gICAgX3RoaXMuZXZlbnRIYW5kbGVyLm9uKCd0b3VjaG1vdmUnLCBvblRvdWNoTW92ZSwgZmFsc2UpO1xuXG4gICAgX3RoaXMuZXZlbnRIYW5kbGVyLm9uKCdrZXlkb3duJywgb25LZXlEb3duLCBmYWxzZSk7IC8vIGZvcmNlIGFuIHVwZGF0ZSBhdCBzdGFydFxuXG5cbiAgICBfdGhpcy51cGRhdGUoKTtcblxuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIGNyZWF0ZUNsYXNzKFRocmVlT3JiaXRDb250cm9scywgW3tcbiAgICBrZXk6IFwiY2VudGVyXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ09yYml0Q29udHJvbHM6IC5jZW50ZXIgaGFzIGJlZW4gcmVuYW1lZCB0byAudGFyZ2V0Jyk7XG4gICAgICByZXR1cm4gdGhpcy50YXJnZXQ7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIm5vWm9vbVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgY29uc29sZS53YXJuKCdPcmJpdENvbnRyb2xzOiAubm9ab29tIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAuZW5hYmxlWm9vbSBpbnN0ZWFkLicpO1xuICAgICAgcmV0dXJuICF0aGlzLmVuYWJsZVpvb207XG4gICAgfSxcbiAgICBzZXQ6IGZ1bmN0aW9uIHNldCh2YWx1ZSkge1xuICAgICAgY29uc29sZS53YXJuKCdPcmJpdENvbnRyb2xzOiAubm9ab29tIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAuZW5hYmxlWm9vbSBpbnN0ZWFkLicpO1xuICAgICAgdGhpcy5lbmFibGVab29tID0gIXZhbHVlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJub1JvdGF0ZVwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgY29uc29sZS53YXJuKCdPcmJpdENvbnRyb2xzOiAubm9Sb3RhdGUgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIC5lbmFibGVSb3RhdGUgaW5zdGVhZC4nKTtcbiAgICAgIHJldHVybiAhdGhpcy5lbmFibGVSb3RhdGU7XG4gICAgfSxcbiAgICBzZXQ6IGZ1bmN0aW9uIHNldCh2YWx1ZSkge1xuICAgICAgY29uc29sZS53YXJuKCdPcmJpdENvbnRyb2xzOiAubm9Sb3RhdGUgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIC5lbmFibGVSb3RhdGUgaW5zdGVhZC4nKTtcbiAgICAgIHRoaXMuZW5hYmxlUm90YXRlID0gIXZhbHVlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJub1BhblwiLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgY29uc29sZS53YXJuKCdPcmJpdENvbnRyb2xzOiAubm9QYW4gaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIC5lbmFibGVQYW4gaW5zdGVhZC4nKTtcbiAgICAgIHJldHVybiAhdGhpcy5lbmFibGVQYW47XG4gICAgfSxcbiAgICBzZXQ6IGZ1bmN0aW9uIHNldCh2YWx1ZSkge1xuICAgICAgY29uc29sZS53YXJuKCdPcmJpdENvbnRyb2xzOiAubm9QYW4gaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIC5lbmFibGVQYW4gaW5zdGVhZC4nKTtcbiAgICAgIHRoaXMuZW5hYmxlUGFuID0gIXZhbHVlO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJub0tleXNcIixcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIGNvbnNvbGUud2FybignT3JiaXRDb250cm9sczogLm5vS2V5cyBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgLmVuYWJsZUtleXMgaW5zdGVhZC4nKTtcbiAgICAgIHJldHVybiAhdGhpcy5lbmFibGVLZXlzO1xuICAgIH0sXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQodmFsdWUpIHtcbiAgICAgIGNvbnNvbGUud2FybignT3JiaXRDb250cm9sczogLm5vS2V5cyBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgLmVuYWJsZUtleXMgaW5zdGVhZC4nKTtcbiAgICAgIHRoaXMuZW5hYmxlS2V5cyA9ICF2YWx1ZTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwic3RhdGljTW92aW5nXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ09yYml0Q29udHJvbHM6IC5zdGF0aWNNb3ZpbmcgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIC5lbmFibGVEYW1waW5nIGluc3RlYWQuJyk7XG4gICAgICByZXR1cm4gIXRoaXMuZW5hYmxlRGFtcGluZztcbiAgICB9LFxuICAgIHNldDogZnVuY3Rpb24gc2V0KHZhbHVlKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ09yYml0Q29udHJvbHM6IC5zdGF0aWNNb3ZpbmcgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIC5lbmFibGVEYW1waW5nIGluc3RlYWQuJyk7XG4gICAgICB0aGlzLmVuYWJsZURhbXBpbmcgPSAhdmFsdWU7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcImR5bmFtaWNEYW1waW5nRmFjdG9yXCIsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ09yYml0Q29udHJvbHM6IC5keW5hbWljRGFtcGluZ0ZhY3RvciBoYXMgYmVlbiByZW5hbWVkLiBVc2UgLmRhbXBpbmdGYWN0b3IgaW5zdGVhZC4nKTtcbiAgICAgIHJldHVybiB0aGlzLmRhbXBpbmdGYWN0b3I7XG4gICAgfSxcbiAgICBzZXQ6IGZ1bmN0aW9uIHNldCh2YWx1ZSkge1xuICAgICAgY29uc29sZS53YXJuKCdPcmJpdENvbnRyb2xzOiAuZHluYW1pY0RhbXBpbmdGYWN0b3IgaGFzIGJlZW4gcmVuYW1lZC4gVXNlIC5kYW1waW5nRmFjdG9yIGluc3RlYWQuJyk7XG4gICAgICB0aGlzLmRhbXBpbmdGYWN0b3IgPSB2YWx1ZTtcbiAgICB9XG4gIH1dKTtcblxuICBpbmhlcml0cyhUaHJlZU9yYml0Q29udHJvbHMsIF9FdmVudERpc3BhdGNoZXIpO1xuXG4gIHJldHVybiBUaHJlZU9yYml0Q29udHJvbHM7XG59KEV2ZW50RGlzcGF0Y2hlcik7XG5cbi8qKlxuICogQGNsYXNzIE9yYml0Q29udHJvbHNNb2R1bGVcbiAqIEBjYXRlZ29yeSBtb2R1bGVzL2FwcFxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXNdXG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtcy5vYmplY3Q9Y2FtZXJhXSBPYmplY3QgdG8gd2hpY2ggY29udHJvbHMgYXJlIGFwcGxpZWQuXG4gKiBAcGFyYW0ge1RIUkVFLlZlY3RvcjN9IFtwYXJhbXMudGFyZ2V0PW5ldyBWZWN0b3IzKCldIENvbnRyb2xzIGNlbnRlciB2ZWN0b3IuXG4gKiBAcGFyYW0ge0Jvb2xlYW59IFtwYXJhbXMuZm9sbG93PWZhbHNlXSBGb2xsb3cgdGhlIHRhcmdldFxuICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzL2FwcFxuICogQGV4YW1wbGUgPGNhcHRpb24+IENyZWF0aW5nIGEgcmVuZGVyaW5nIG1vZHVsZSBhbmQgcGFzc2luZyBpdCB0byBBcHAncyBtb2R1bGVzPC9jYXB0aW9uPlxuICogbmV3IEFwcChbXG4gKiAgIG5ldyBFbGVtZW50TW9kdWxlKCksXG4gKiAgIG5ldyBTY2VuZU1vZHVsZSgpLFxuICogICBuZXcgRGVmaW5lTW9kdWxlKCdjYW1lcmEnLCBuZXcgV0hTLlBlcnNwZWN0aXZlQ2FtZXJhKHtcbiAqICAgICBwb3NpdGlvbjogbmV3IFRIUkVFLlZlY3RvcjMoMCwgNiwgMTgpLFxuICogICAgIGZhcjogMTAwMDBcbiAqICAgfSkpLFxuICogICBuZXcgUmVuZGVyaW5nTW9kdWxlKCksXG4gKiAgIG5ldyBPcmJpdENvbnRyb2xzTW9kdWxlKClcbiAqIF0pO1xuICovXG5cbnZhciBPcmJpdENvbnRyb2xzTW9kdWxlID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfQ29udHJvbHNNb2R1bGUpIHtcbiAgZnVuY3Rpb24gT3JiaXRDb250cm9sc01vZHVsZSgpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIE9yYml0Q29udHJvbHNNb2R1bGUpO1xuXG4gICAgX3RoaXMgPSBwb3NzaWJsZUNvbnN0cnVjdG9yUmV0dXJuKHRoaXMsIGdldFByb3RvdHlwZU9mJDIoT3JiaXRDb250cm9sc01vZHVsZSkuY2FsbCh0aGlzLCBwYXJhbXMpKTtcbiAgICBfdGhpcy5wYXJhbXMgPSBPYmplY3QuYXNzaWduKHtcbiAgICAgIGZvbGxvdzogZmFsc2UsXG4gICAgICBvYmplY3Q6IG51bGwsXG4gICAgICB0YXJnZXQ6IG5ldyBWZWN0b3IzKClcbiAgICB9LCBwYXJhbXMpO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIGNyZWF0ZUNsYXNzKE9yYml0Q29udHJvbHNNb2R1bGUsIFt7XG4gICAga2V5OiBcIm1hbmFnZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbWFuYWdlcihfbWFuYWdlcikge1xuICAgICAgZ2V0JDMoZ2V0UHJvdG90eXBlT2YkMihPcmJpdENvbnRyb2xzTW9kdWxlLnByb3RvdHlwZSksIFwibWFuYWdlclwiLCB0aGlzKS5jYWxsKHRoaXMsIF9tYW5hZ2VyKTtcblxuICAgICAgdmFyIF90aGlzJHBhcmFtcyA9IHRoaXMucGFyYW1zLFxuICAgICAgICAgIG9iaiA9IF90aGlzJHBhcmFtcy5vYmplY3QsXG4gICAgICAgICAgZm9sbG93ID0gX3RoaXMkcGFyYW1zLmZvbGxvdyxcbiAgICAgICAgICB0YXJnZXQgPSBfdGhpcyRwYXJhbXMudGFyZ2V0O1xuICAgICAgdmFyIG9iamVjdCA9IG9iaiA/IG9iai5uYXRpdmUgOiBfbWFuYWdlci5nZXQoJ2NhbWVyYScpLm5hdGl2ZTtcbiAgICAgIHZhciBjb250cm9scyA9IG5ldyBUaHJlZU9yYml0Q29udHJvbHMob2JqZWN0LCBfbWFuYWdlci5nZXQoJ2VsZW1lbnQnKSwgX21hbmFnZXIuaGFuZGxlcik7XG4gICAgICB2YXIgdXBkYXRlUHJvY2Vzc29yID0gZm9sbG93ID8gZnVuY3Rpb24gKGMpIHtcbiAgICAgICAgY29udHJvbHMudXBkYXRlKGMuZ2V0RGVsdGEoKSk7XG4gICAgICAgIGNvbnRyb2xzLnRhcmdldC5jb3B5KHRhcmdldCk7XG4gICAgICB9IDogZnVuY3Rpb24gKGMpIHtcbiAgICAgICAgY29udHJvbHMudXBkYXRlKGMuZ2V0RGVsdGEoKSk7XG4gICAgICB9O1xuICAgICAgdGhpcy5zZXRDb250cm9scyhjb250cm9scyk7XG4gICAgICB0aGlzLnNldFVwZGF0ZSh1cGRhdGVQcm9jZXNzb3IpO1xuXG4gICAgICBfbWFuYWdlci51cGRhdGUoe1xuICAgICAgICBjYW1lcmE6IGZ1bmN0aW9uIGNhbWVyYShfY2FtZXJhKSB7XG4gICAgICAgICAgaWYgKG9iaikgcmV0dXJuO1xuICAgICAgICAgIGNvbnRyb2xzLm9iamVjdCA9IF9jYW1lcmEubmF0aXZlO1xuICAgICAgICB9LFxuICAgICAgICBlbGVtZW50OiBmdW5jdGlvbiBlbGVtZW50KF9lbGVtZW50KSB7XG4gICAgICAgICAgY29udHJvbHMuZG9tRWxlbWVudCA9IF9lbGVtZW50O1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgY29udHJvbHMudGFyZ2V0LmNvcHkodGFyZ2V0KTtcbiAgICB9XG4gIH1dKTtcblxuICBpbmhlcml0cyhPcmJpdENvbnRyb2xzTW9kdWxlLCBfQ29udHJvbHNNb2R1bGUpO1xuXG4gIHJldHVybiBPcmJpdENvbnRyb2xzTW9kdWxlO1xufShDb250cm9sc01vZHVsZSk7XG5cbi8qKiBAbW9kdWxlIG1vZHVsZXMvYXBwL2NvbnRyb2xzICovXG5cbi8qKiBAbW9kdWxlIG1vZHVsZXMvYXBwICovXG5cbi8qKlxuICogQGNsYXNzIER5bmFtaWNHZW9tZXRyeU1vZHVsZVxuICogQGNhdGVnb3J5IG1vZHVsZXMvbWVzaFxuICogQHBhcmFtIHtPYmplY3R9IFtwYXJhbXM9e2F0dHJpYnV0ZXM6IGZhbHNlfV0gLSBwYXJhbXNcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gW3BhdGNoRXZlbnRzPXRydWVdXG4gKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvbWVzaFxuICovXG52YXIgRHluYW1pY0dlb21ldHJ5TW9kdWxlID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gRHluYW1pY0dlb21ldHJ5TW9kdWxlKCkge1xuICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgRHluYW1pY0dlb21ldHJ5TW9kdWxlKTtcblxuICAgIHRoaXMucGFyYW1zID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICBhdHRyaWJ1dGVzOiBmYWxzZVxuICAgIH0sIHBhcmFtcyk7XG4gIH1cblxuICBjcmVhdGVDbGFzcyhEeW5hbWljR2VvbWV0cnlNb2R1bGUsIFt7XG4gICAga2V5OiBcImludGVncmF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBpbnRlZ3JhdGUoc2VsZikge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgdmFyIHBhcmFtcyA9IHNlbGYucGFyYW1zO1xuXG4gICAgICB0aGlzLmdfID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcblxuICAgICAgICBpZiAodGhpcy5idWlsZEdlb21ldHJ5KSB7XG4gICAgICAgICAgdGhpcy5uYXRpdmUuZ2VvbWV0cnkgPSB0aGlzLmJ1aWxkR2VvbWV0cnkodGhpcy51cGRhdGVQYXJhbXMoe1xuICAgICAgICAgICAgZ2VvbWV0cnk6IHBhcmFtc1xuICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgaWYgKHBhcmFtcy5hdHRyaWJ1dGVzKSB7XG4gICAgICAgIHZhciBfbG9vcCA9IGZ1bmN0aW9uIF9sb29wKGtleSkge1xuICAgICAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShfdGhpcywgXCJnX1wiLmNvbmNhdChrZXkpLCB7XG4gICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm5hdGl2ZS5nZW9tZXRyeS5wYXJhbWV0ZXJzW2tleV07XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHNldDogZnVuY3Rpb24gc2V0KHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5uYXRpdmUuZ2VvbWV0cnkgPSB0aGlzLmJ1aWxkR2VvbWV0cnkodGhpcy51cGRhdGVQYXJhbXMoe1xuICAgICAgICAgICAgICAgICAgZ2VvbWV0cnk6IGRlZmluZVByb3BlcnR5JDMoe30sIGtleSwgdmFsdWUpXG4gICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBmb3IgKHZhciBrZXkgaW4gdGhpcy5wYXJhbXMuZ2VvbWV0cnkpIHtcbiAgICAgICAgICBfbG9vcChrZXkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIER5bmFtaWNHZW9tZXRyeU1vZHVsZTtcbn0oKTtcblxudmFyIGxvYWRlciA9IG5ldyBUZXh0dXJlTG9hZGVyKCk7XG4vKipcbiAqIEBjbGFzcyBUZXh0dXJlTW9kdWxlXG4gKiBAY2F0ZWdvcnkgbW9kdWxlcy9tZXNoXG4gKiBAZGVzY3JpcHRpb24gQSBUZXh0dXJlTW9kdWxlIGNhbiBiZSBhcHBsaWVkIHRvIGFueSBNZXNoIG9yIE1vZGVsLlxuICogQHBhcmFtIHtBcnJheX0gW3RleHR1cmVzXSAtIGFycmF5IG9mIHRleHR1cmUgb2JqZWN0c1xuICogQG1lbWJlcm9mIG1vZHVsZTptb2R1bGVzL21lc2hcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkNyZWF0aW5nIGFuIGluc3RhbmNlLiB1cmwgdGFrZXMgYSBwYXRoLCBvciBhIGRhdGEgb2JqZWN0LjwvY2FwdGlvbj5cbiAqIHZhciB3b29kVGV4dHVyZSA9IG5ldyBUZXh0dXJlTW9kdWxlKHtcbiAqICAgdXJsOiBgJHtwcm9jZXNzLmFzc2V0c1BhdGh9L3RleHR1cmVzL3dvb2QuanBnYFxuICogfSk7XG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5Nb3JlIGNvbXByZWhlbnNpdmUgZXhhbXBsZSwgd29vZCB0ZXh0dXJlIGFwcGxpZWQgdG8gYSBCb3guPC9jYXB0aW9uPlxuICogbmV3IEJveCh7XG4gKiAgIGdlb21ldHJ5OiB7XG4gKiAgICAgd2lkdGg6IDIsXG4gKiAgICAgaGVpZ2h0OiAyLFxuICogICAgIGRlcHRoOiAyXG4gKiAgIH0sXG4gKiAgIG1vZHVsZXM6IFtcbiAqICAgICBuZXcgVGV4dHVyZU1vZHVsZSh7XG4gKiAgICAgICB1cmw6IGBwYXRoL3RvL3RleHR1cmUuanBnYCxcbiAqICAgICAgIHJlcGVhdDogbmV3IFRIUkVFLlZlY3RvcjIoMSwgMSkgLy8gb3B0aW9uYWxcbiAqICAgICB9KVxuICogICBdLFxuICogICBtYXRlcmlhbDogbmV3IFRIUkVFLk1lc2hCYXNpY01hdGVyaWFsKHtcbiAqICAgICBjb2xvcjogMHhmZmZmZmZcbiAqICAgfSksXG4gKiAgIHBvc2l0aW9uOiBbNTAsIDYwLCA3MF1cbiAqIH0pLmFkZFRvKGFwcCk7XG4gKi9cblxudmFyIFRleHR1cmVNb2R1bGUgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKCkge1xuICBjcmVhdGVDbGFzcyhUZXh0dXJlTW9kdWxlLCBudWxsLCBbe1xuICAgIGtleTogXCJsb2FkXCIsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGxvYWQodXJsKSB7XG4gICAgICByZXR1cm4gbmV3IFRleHR1cmVNb2R1bGUoe1xuICAgICAgICB1cmw6IHVybFxuICAgICAgfSkudGV4dHVyZXNbMF1bMV07XG4gICAgfVxuICB9XSk7XG5cbiAgZnVuY3Rpb24gVGV4dHVyZU1vZHVsZSgpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgVGV4dHVyZU1vZHVsZSk7XG5cbiAgICBkZWZpbmVQcm9wZXJ0eSQzKGRlZmluZVByb3BlcnR5JDModGhpcywgXCJ0ZXh0dXJlc1wiLCBbXSksIFwiYnJpZGdlXCIsIHtcbiAgICAgIG1hdGVyaWFsOiBmdW5jdGlvbiBtYXRlcmlhbChfbWF0ZXJpYWwsIHNlbGYpIHtcbiAgICAgICAgc2VsZi50ZXh0dXJlcy5mb3JFYWNoKGZ1bmN0aW9uICh0ZXh0dXJlKSB7XG4gICAgICAgICAgX21hdGVyaWFsW3RleHR1cmVbMF1dID0gdGV4dHVyZVsxXTtcbiAgICAgICAgfSk7XG4gICAgICAgIF9tYXRlcmlhbC5uZWVkc1VwZGF0ZSA9IHRydWU7XG4gICAgICAgIHJldHVybiBfbWF0ZXJpYWw7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgdGV4dHVyZXMgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICB0ZXh0dXJlc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICB0ZXh0dXJlcy5mb3JFYWNoKGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgICB2YXIgdXJsID0gX3JlZi51cmwsXG4gICAgICAgICAgX3JlZiR0eXBlID0gX3JlZi50eXBlLFxuICAgICAgICAgIHR5cGUgPSBfcmVmJHR5cGUgPT09IHZvaWQgMCA/ICdtYXAnIDogX3JlZiR0eXBlLFxuICAgICAgICAgIF9yZWYkb2Zmc2V0ID0gX3JlZi5vZmZzZXQsXG4gICAgICAgICAgb2Zmc2V0ID0gX3JlZiRvZmZzZXQgPT09IHZvaWQgMCA/IG5ldyBWZWN0b3IyKDAsIDApIDogX3JlZiRvZmZzZXQsXG4gICAgICAgICAgX3JlZiRyZXBlYXQgPSBfcmVmLnJlcGVhdCxcbiAgICAgICAgICByZXBlYXQgPSBfcmVmJHJlcGVhdCA9PT0gdm9pZCAwID8gbmV3IFZlY3RvcjIoMSwgMSkgOiBfcmVmJHJlcGVhdCxcbiAgICAgICAgICBfcmVmJHdyYXAgPSBfcmVmLndyYXAsXG4gICAgICAgICAgd3JhcCA9IF9yZWYkd3JhcCA9PT0gdm9pZCAwID8gUmVwZWF0V3JhcHBpbmcgOiBfcmVmJHdyYXAsXG4gICAgICAgICAgX3JlZiRtYXBwaW5nID0gX3JlZi5tYXBwaW5nLFxuICAgICAgICAgIG1hcHBpbmcgPSBfcmVmJG1hcHBpbmcgPT09IHZvaWQgMCA/IFVWTWFwcGluZyA6IF9yZWYkbWFwcGluZyxcbiAgICAgICAgICBfcmVmJGZpeCA9IF9yZWYuZml4LFxuICAgICAgICAgIGZpeCA9IF9yZWYkZml4ID09PSB2b2lkIDAgPyBmdW5jdGlvbiAodGV4KSB7XG4gICAgICAgIHJldHVybiB0ZXg7XG4gICAgICB9IDogX3JlZiRmaXg7XG4gICAgICB2YXIgdGV4dHVyZSA9IGxvYWRlci5sb2FkKHVybCk7XG5cbiAgICAgIGlmICh3cmFwLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGV4dHVyZS53cmFwUyA9IHdyYXBbMF07XG4gICAgICAgIHRleHR1cmUud3JhcFQgPSB3cmFwWzFdO1xuICAgICAgfSBlbHNlIHRleHR1cmUud3JhcFMgPSB0ZXh0dXJlLndyYXBUID0gd3JhcDtcblxuICAgICAgdGV4dHVyZS5tYXBwaW5nID0gbWFwcGluZztcbiAgICAgIHRleHR1cmUub2Zmc2V0LmNvcHkob2Zmc2V0KTtcbiAgICAgIHRleHR1cmUucmVwZWF0LmNvcHkocmVwZWF0KTtcbiAgICAgIHRleHR1cmUubWFnRmlsdGVyID0gTmVhcmVzdEZpbHRlcjtcbiAgICAgIHRleHR1cmUubWluRmlsdGVyID0gTGluZWFyTWlwTWFwTGluZWFyRmlsdGVyO1xuXG4gICAgICBfdGhpcy50ZXh0dXJlcy5wdXNoKFt0eXBlLCBmaXgodGV4dHVyZSldKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBUZXh0dXJlTW9kdWxlO1xufSgpO1xuXG4vKipcbiAqIEBjbGFzcyBBbmltYXRpb25Nb2R1bGVcbiAqIEBjYXRlZ29yeSBtb2R1bGVzL21lc2hcbiAqIEBkZXNjcmlwdGlvbiBDb252ZW5pZW5jZSBtb2R1bGUgdGhhdCB3cmFwcyB0aGUgPGEgaHJlZj0naHR0cHM6Ly90aHJlZWpzLm9yZy9kb2NzLyNtYW51YWwvaW50cm9kdWN0aW9uL0FuaW1hdGlvbi1zeXN0ZW0nPnRocmVlLmpzIGFuaW1hdGlvbiBzeXN0ZW08L2E+XG4gKiBAcGFyYW0ge0FwcH0gYXBwIC0gdGhlIGFwcFxuICogQHBhcmFtIHtCb29sZWFufSBbaXNEZWZlcnJlZD1mYWxzZV0gLSBzZXQgdG8gdHJ1ZSBpZiBhbmltYXRpb24gc2hvdWxkIG5vdCBzdGFydCBhdXRvbWF0aWNhbGx5XG4gKiBAcGFyYW0ge09iamVjdH0gW3BhcmFtcz17c3BlZWQ6IDF9XSAtIHRoZSBwYXJhbXNcbiAqIEBtZW1iZXJvZiBtb2R1bGU6bW9kdWxlcy9tZXNoXG4gKiBAZXhhbXBsZSA8Y2FwdGlvbj5DcmVhdGUgYW5pbWF0aW9uIG1vZHVsZSBhbmQgcGxheSBhIGdpdmVuIGNsaXAgb2YgYW4gaW1wb3J0ZWQgbW9kZWw8L2NhcHRpb24+XG4gKiBjb25zdCBhbmltYXRpb25Nb2R1bGUgPSBuZXcgQW5pbWF0aW9uTW9kdWxlKGFwcCwgZmFsc2UsIHtcbiAqICAgc3BlZWQ6IDEuMiAvLyBzcGVlZCB1cCBhbmltYXRpb24gYnkgMjAlXG4gKiB9KTtcbiAqXG4gKiBuZXcgSW1wb3J0ZXIoe1xuICogICBwYXJzZXIoZ2VvbWV0cnksIG1hdGVyaWFscykge1xuICogICAgIC8vIE92ZXJyaWRlIHBhcnNlIHRvIGdlbmVyYXRlIGEgc2tpbm5lZE1lc2gsIG5lZWRlZCBmb3Igc2tpbm5lZCBtb2RlbHNcbiAqICAgICByZXR1cm4gbmV3IFRIUkVFLlNraW5uZWRNZXNoKGdlb21ldHJ5LCBtYXRlcmlhbHMpO1xuICogICB9LFxuICpcbiAqICAgdXJsOiBgcGF0aC90by9tb2RlbC5qc29uYCxcbiAqICAgdXNlQ3VzdG9tTWF0ZXJpYWw6IHRydWUsXG4gKlxuICogICBtYXRlcmlhbDogbmV3IFRIUkVFLk1lc2hTdGFuZGFyZE1hdGVyaWFsKHtcbiAqICAgICBza2lubmluZzogdHJ1ZVxuICogICB9KSxcbiAqXG4gKiAgIG1vZHVsZXM6IFthbmltYXRpb25Nb2R1bGVdXG4gKiB9KS5hZGRUbyhhcHApLnRoZW4oKCkgPT4ge1xuICogICAvLyBhZGRpbmcgbW9kZWwgdG8gYXBwIHJldHVybnMgYSBwcm9taXNlLCBzbyBwaXBlIHRoZSBmdW5jdGlvbiB0byBraWNrIG9mZiB0aGUgYW5pbWF0aW9uIGNsaXBcbiAqICAgYW5pbWF0aW9uTW9kdWxlLnBsYXkoJ2NsaXBOYW1lJyk7XG4gKiB9KTtcbiAqL1xuXG52YXIgQW5pbWF0aW9uTW9kdWxlID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gQW5pbWF0aW9uTW9kdWxlKGFwcCwgaXNEZWZlcnJlZCkge1xuICAgIHZhciBwYXJhbXMgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHt9O1xuXG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgQW5pbWF0aW9uTW9kdWxlKTtcblxuICAgIGRlZmluZVByb3BlcnR5JDModGhpcywgXCJicmlkZ2VcIiwge1xuICAgICAgbWVzaDogZnVuY3Rpb24gbWVzaChfbWVzaCwgc2VsZikge1xuICAgICAgICBfbWVzaC5nZW9tZXRyeS5za2VsZXRvbiA9IF9tZXNoLnNrZWxldG9uO1xuICAgICAgICBzZWxmLm1peGVyID0gbmV3IEFuaW1hdGlvbk1peGVyKF9tZXNoLmdlb21ldHJ5KTtcbiAgICAgICAgc2VsZi5jbGlwcyA9IF9tZXNoLmdlb21ldHJ5LmFuaW1hdGlvbnM7XG4gICAgICAgIHJldHVybiBfbWVzaDtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMucGFyYW1zID0gT2JqZWN0LmFzc2lnbih7XG4gICAgICBzcGVlZDogMVxuICAgIH0sIHBhcmFtcyk7XG4gICAgdGhpcy5jbG9jayA9IG5ldyBDbG9jaygpO1xuICAgIHRoaXMuYXBwID0gYXBwO1xuICAgIHRoaXMuaXNEZWZlcnJlZCA9IGlzRGVmZXJyZWQ7XG4gIH1cbiAgLyoqXG4gICAqIEBtZXRob2QgcGxheVxuICAgKiBAaW5zdGFuY2VcbiAgICogQGRlc2NyaXB0aW9uIFBsYXlzIHRoZSBnaXZlbiBjbGlwIG5hbWVcbiAgICogQHBhcmFtIHtTdHJpbmd9IGNsaXBOYW1lIC0gdGhlIGNsaXAgdG8gcGxheVxuICAgKiBAcmV0dXJuIHtUSFJFRS5BbmltYXRpb25BY3Rpb259IFBsYXlpbmcgYWN0aW9uIFxuICAgKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvbWVzaC5BbmltYXRpb25Nb2R1bGVcbiAgICovXG5cblxuICBjcmVhdGVDbGFzcyhBbmltYXRpb25Nb2R1bGUsIFt7XG4gICAga2V5OiBcInBsYXlcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gcGxheShjbGlwTmFtZSkge1xuICAgICAgdmFyIGNsaXAgPSBBbmltYXRpb25DbGlwLmZpbmRCeU5hbWUodGhpcy5jbGlwcywgY2xpcE5hbWUpO1xuICAgICAgcmV0dXJuIHRoaXMubWl4ZXIuY2xpcEFjdGlvbihjbGlwKS5wbGF5KCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBtZXRob2QgdXBkYXRlXG4gICAgICogQGluc3RhbmNlXG4gICAgICogQGRlc2NyaXB0aW9uIFVwZGF0ZSB0aGUgbWl4ZXIgKGJlaW5nIGNhbGxlZCBvbiBmcmFtZSBhbmltYXRpb24gbG9vcClcbiAgICAgKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXMvbWVzaC5BbmltYXRpb25Nb2R1bGVcbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiBcInVwZGF0ZVwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiB1cGRhdGUoKSB7XG4gICAgICBpZiAodGhpcy5taXhlcikgdGhpcy5taXhlci51cGRhdGUodGhpcy5jbG9jay5nZXREZWx0YSgpICogdGhpcy5wYXJhbXMuc3BlZWQpO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogXCJpbnRlZ3JhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaW50ZWdyYXRlKHNlbGYpIHtcbiAgICAgIHNlbGYubG9vcCA9IG5ldyBMb29wKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2VsZi51cGRhdGUoKTtcbiAgICAgIH0pO1xuICAgICAgaWYgKCFzZWxmLmlzRGVmZXJyZWQpIHNlbGYubG9vcC5zdGFydChzZWxmLmFwcCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiBcIm1hbmFnZXJcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gbWFuYWdlcihfbWFuYWdlcikge1xuICAgICAgX21hbmFnZXIuZGVmaW5lKCdhbmltYXRpb24nKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gQW5pbWF0aW9uTW9kdWxlO1xufSgpO1xuXG4vKiogQG1vZHVsZSBtb2R1bGVzL21lc2ggKi9cblxuLyoqXG4gKiBAY2xhc3MgRGVmaW5lTW9kdWxlXG4gKiBAY2F0ZWdvcnkgbW9kdWxlc1xuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhXG4gKiBAbWVtYmVyb2YgbW9kdWxlOm1vZHVsZXNcbiAqIEBleGFtcGxlIDxjYXB0aW9uPiBDcmVhdGluZyBhIERlZmluZU1vZHVsZSB3aXRoIFBlcnNwZWN0aXZlQ2FtZXJhIGFzIGNhbWVyYSBtb2R1bGUgYW5kIHBhc3NpbmcgaXQgdG8gQXBwJ3MgbW9kdWxlczwvY2FwdGlvbj5cbiAqIG5ldyBBcHAoW1xuICogICAvLyAuLi5cbiAqICAgbmV3IERlZmluZU1vZHVsZSgnY2FtZXJhJywgbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCkpXG4gKiBdKTtcbiAqL1xudmFyIERlZmluZU1vZHVsZSA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIERlZmluZU1vZHVsZShuYW1lLCBkYXRhKSB7XG4gICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgRGVmaW5lTW9kdWxlKTtcblxuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgfVxuXG4gIGNyZWF0ZUNsYXNzKERlZmluZU1vZHVsZSwgW3tcbiAgICBrZXk6IFwibWFuYWdlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBtYW5hZ2VyKF9tYW5hZ2VyKSB7XG4gICAgICBfbWFuYWdlci5zZXQodGhpcy5uYW1lLCB0aGlzLmRhdGEpO1xuICAgIH1cbiAgfV0pO1xuXG4gIHJldHVybiBEZWZpbmVNb2R1bGU7XG59KCk7XG5cbi8qKiBAbW9kdWxlIG1vZHVsZXMgKi9cblxudmFyIE1vZGVsID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uIChfSW1wb3J0ZXIpIHtcbiAgZnVuY3Rpb24gTW9kZWwocGFyYW1zKSB7XG4gICAgdmFyIF9nZXRQcm90b3R5cGVPZjI7XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBNb2RlbCk7XG5cbiAgICBjb25zb2xlLndhcm4oJ01vZGVsIGlzIGRlcHJlY2F0ZWQuIFVzZSBJbXBvcnRlciBpbnN0ZWFkLicpO1xuXG4gICAgaWYgKHBhcmFtcy5nZW9tZXRyeSkge1xuICAgICAgcGFyYW1zLnVybCA9IHBhcmFtcy5nZW9tZXRyeS5wYXRoO1xuICAgICAgcGFyYW1zLmxvYWRlciA9IHBhcmFtcy5nZW9tZXRyeS5sb2FkZXI7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFkZGl0aW9uYWwgPSBuZXcgQXJyYXkoX2xlbiA+IDEgPyBfbGVuIC0gMSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYWRkaXRpb25hbFtfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgcmV0dXJuIHBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4odGhpcywgKF9nZXRQcm90b3R5cGVPZjIgPSBnZXRQcm90b3R5cGVPZiQyKE1vZGVsKSkuY2FsbC5hcHBseShfZ2V0UHJvdG90eXBlT2YyLCBbdGhpcywgcGFyYW1zXS5jb25jYXQoYWRkaXRpb25hbCkpKTtcbiAgfVxuXG4gIGluaGVyaXRzKE1vZGVsLCBfSW1wb3J0ZXIpO1xuXG4gIHJldHVybiBNb2RlbDtcbn0oSW1wb3J0ZXIpO1xudmFyIENhbWVyYU1vZHVsZSA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIENhbWVyYU1vZHVsZSgpIHtcbiAgICB2YXIgcGFyYW1zID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiB7fTtcblxuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIENhbWVyYU1vZHVsZSk7XG5cbiAgICBjb25zb2xlLndhcm4oJ0NhbWVyYU1vZHVsZSBpcyBkZXByZWNhdGVkLiBVc2UgRGVmaW5lTW9kdWxlIGluc3RlYWQuJyk7XG4gICAgdGhpcy5jYW1lcmEgPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmEkMShwYXJhbXMpO1xuICB9XG5cbiAgY3JlYXRlQ2xhc3MoQ2FtZXJhTW9kdWxlLCBbe1xuICAgIGtleTogXCJpbnRlZ3JhdGVcIixcbiAgICB2YWx1ZTogZnVuY3Rpb24gaW50ZWdyYXRlKHNlbGYpIHtcbiAgICAgIHRoaXMuYWRkKHNlbGYuY2FtZXJhKTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6IFwibWFuYWdlclwiLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBtYW5hZ2VyKF9tYW5hZ2VyKSB7XG4gICAgICBfbWFuYWdlci5zZXQoJ2NhbWVyYScsIHRoaXMuY2FtZXJhKTtcbiAgICB9XG4gIH1dKTtcblxuICByZXR1cm4gQ2FtZXJhTW9kdWxlO1xufSgpO1xuXG4vKipcbiAqIE5hbWVzcGFjZSBjb250YWluaW5nIGFsbCBjbGFzc2VzIGZyb20gYWxsIG1vZHVsZXMuIFVzZWQgYXMgZ2xvYmFsIGluIFVNRCBwYXR0ZXJuLlxuICogQG5hbWVzcGFjZSBXSFNcbiAqIEBleGFtcGxlIDxjYXB0aW9uPlRoZSB1c2Ugb2YgV0hTIG5hbWVzcGFjZS48L2NhcHRpb24+XG4gKiBuZXcgV0hTLkFwcCgpIC8vIGNvcmVcbiAqIG5ldyBXSFMuUGVyc3BlY3RpdmVDYW1lcmEoKSAvLyBjb21wb25lbnRzXG4gKiBuZXcgV0hTLlJlc2l6ZU1vZHVsZSgpIC8vIG1vZHVsZXNcbiAqIFdIUy5leHRlbmQoKSAvLyB1dGlsc1xuICovXG5cbmV4cG9ydCB7IENvbXBvbmVudCwgTWVzaENvbXBvbmVudCwgTGlnaHRDb21wb25lbnQsIENhbWVyYUNvbXBvbmVudCwgQXBwLCBMb29wLCBNb2R1bGVNYW5hZ2VyLCBBbWJpZW50TGlnaHQkMSBhcyBBbWJpZW50TGlnaHQsIERpcmVjdGlvbmFsTGlnaHQkMSBhcyBEaXJlY3Rpb25hbExpZ2h0LCBIZW1pc3BoZXJlTGlnaHQkMSBhcyBIZW1pc3BoZXJlTGlnaHQsIFBvaW50TGlnaHQkMSBhcyBQb2ludExpZ2h0LCBTcG90TGlnaHQkMSBhcyBTcG90TGlnaHQsIEFyZWFMaWdodCwgQ3ViZUNhbWVyYSQxIGFzIEN1YmVDYW1lcmEsIE9ydGhvZ3JhcGhpY0NhbWVyYSQxIGFzIE9ydGhvZ3JhcGhpY0NhbWVyYSwgUGVyc3BlY3RpdmVDYW1lcmEkMSBhcyBQZXJzcGVjdGl2ZUNhbWVyYSwgQm94LCBDaXJjbGUsIENvbmUsIEN5bGluZGVyLCBEb2RlY2FoZWRyb24sIEV4dHJ1ZGUsIEljb3NhaGVkcm9uLCBMYXRoZSwgTGluZSQxIGFzIExpbmUsIEltcG9ydGVyLCBPY3RhaGVkcm9uLCBQYXJhbWV0cmljLCBQbGFuZSQxIGFzIFBsYW5lLCBQb2x5aGVkcm9uLCBSaW5nLCBTaGFwZSQxIGFzIFNoYXBlLCBTcGhlcmUkMSBhcyBTcGhlcmUsIFRldHJhaGVkcm9uLCBUZXh0LCBUb3J1cywgVG9ydXNrbm90LCBUdWJlLCBHcm91cCQxIGFzIEdyb3VwLCBleHRlbmQsIGluc3RydWN0LCB0cmFuc2Zvcm1EYXRhLCB0b0FycmF5LCBFbGVtZW50TW9kdWxlLCBSZW5kZXJpbmdNb2R1bGUsIFNjZW5lTW9kdWxlLCBSZXNpemVNb2R1bGUsIFBvc3RQcm9jZXNzb3JNb2R1bGUsIFZpcnR1YWxNb3VzZU1vZHVsZSwgRXZlbnRzUGF0Y2hNb2R1bGUsIENvbnRyb2xzTW9kdWxlLCBGb2dNb2R1bGUsIFN0YXRlTW9kdWxlLCBPcmJpdENvbnRyb2xzTW9kdWxlLCBEeW5hbWljR2VvbWV0cnlNb2R1bGUsIFRleHR1cmVNb2R1bGUsIEFuaW1hdGlvbk1vZHVsZSwgRGVmaW5lTW9kdWxlLCBNb2RlbCwgQ2FtZXJhTW9kdWxlIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD13aHMubW9kdWxlLmpzLm1hcFxuIiwiLy8gUG9seWZpbGxzXG5cbmlmICggTnVtYmVyLkVQU0lMT04gPT09IHVuZGVmaW5lZCApIHtcblxuXHROdW1iZXIuRVBTSUxPTiA9IE1hdGgucG93KCAyLCAtIDUyICk7XG5cbn1cblxuaWYgKCBOdW1iZXIuaXNJbnRlZ2VyID09PSB1bmRlZmluZWQgKSB7XG5cblx0Ly8gTWlzc2luZyBpbiBJRVxuXHQvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9OdW1iZXIvaXNJbnRlZ2VyXG5cblx0TnVtYmVyLmlzSW50ZWdlciA9IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRyZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiBpc0Zpbml0ZSggdmFsdWUgKSAmJiBNYXRoLmZsb29yKCB2YWx1ZSApID09PSB2YWx1ZTtcblxuXHR9O1xuXG59XG5cbi8vXG5cbmlmICggTWF0aC5zaWduID09PSB1bmRlZmluZWQgKSB7XG5cblx0Ly8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvTWF0aC9zaWduXG5cblx0TWF0aC5zaWduID0gZnVuY3Rpb24gKCB4ICkge1xuXG5cdFx0cmV0dXJuICggeCA8IDAgKSA/IC0gMSA6ICggeCA+IDAgKSA/IDEgOiArIHg7XG5cblx0fTtcblxufVxuXG5pZiAoIEZ1bmN0aW9uLnByb3RvdHlwZS5uYW1lID09PSB1bmRlZmluZWQgKSB7XG5cblx0Ly8gTWlzc2luZyBpbiBJRVxuXHQvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9GdW5jdGlvbi9uYW1lXG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KCBGdW5jdGlvbi5wcm90b3R5cGUsICduYW1lJywge1xuXG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLnRvU3RyaW5nKCkubWF0Y2goIC9eXFxzKmZ1bmN0aW9uXFxzKihbXlxcKFxcc10qKS8gKVsgMSBdO1xuXG5cdFx0fVxuXG5cdH0gKTtcblxufVxuXG5pZiAoIE9iamVjdC5hc3NpZ24gPT09IHVuZGVmaW5lZCApIHtcblxuXHQvLyBNaXNzaW5nIGluIElFXG5cdC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL09iamVjdC9hc3NpZ25cblxuXHQoIGZ1bmN0aW9uICgpIHtcblxuXHRcdE9iamVjdC5hc3NpZ24gPSBmdW5jdGlvbiAoIHRhcmdldCApIHtcblxuXHRcdFx0J3VzZSBzdHJpY3QnO1xuXG5cdFx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkIHx8IHRhcmdldCA9PT0gbnVsbCApIHtcblxuXHRcdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCAnQ2Fubm90IGNvbnZlcnQgdW5kZWZpbmVkIG9yIG51bGwgdG8gb2JqZWN0JyApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHZhciBvdXRwdXQgPSBPYmplY3QoIHRhcmdldCApO1xuXG5cdFx0XHRmb3IgKCB2YXIgaW5kZXggPSAxOyBpbmRleCA8IGFyZ3VtZW50cy5sZW5ndGg7IGluZGV4ICsrICkge1xuXG5cdFx0XHRcdHZhciBzb3VyY2UgPSBhcmd1bWVudHNbIGluZGV4IF07XG5cblx0XHRcdFx0aWYgKCBzb3VyY2UgIT09IHVuZGVmaW5lZCAmJiBzb3VyY2UgIT09IG51bGwgKSB7XG5cblx0XHRcdFx0XHRmb3IgKCB2YXIgbmV4dEtleSBpbiBzb3VyY2UgKSB7XG5cblx0XHRcdFx0XHRcdGlmICggT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKCBzb3VyY2UsIG5leHRLZXkgKSApIHtcblxuXHRcdFx0XHRcdFx0XHRvdXRwdXRbIG5leHRLZXkgXSA9IHNvdXJjZVsgbmV4dEtleSBdO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBvdXRwdXQ7XG5cblx0XHR9O1xuXG5cdH0gKSgpO1xuXG59XG5cbi8qKlxuICogaHR0cHM6Ly9naXRodWIuY29tL21yZG9vYi9ldmVudGRpc3BhdGNoZXIuanMvXG4gKi9cblxuZnVuY3Rpb24gRXZlbnREaXNwYXRjaGVyKCkge31cblxuT2JqZWN0LmFzc2lnbiggRXZlbnREaXNwYXRjaGVyLnByb3RvdHlwZSwge1xuXG5cdGFkZEV2ZW50TGlzdGVuZXI6IGZ1bmN0aW9uICggdHlwZSwgbGlzdGVuZXIgKSB7XG5cblx0XHRpZiAoIHRoaXMuX2xpc3RlbmVycyA9PT0gdW5kZWZpbmVkICkgdGhpcy5fbGlzdGVuZXJzID0ge307XG5cblx0XHR2YXIgbGlzdGVuZXJzID0gdGhpcy5fbGlzdGVuZXJzO1xuXG5cdFx0aWYgKCBsaXN0ZW5lcnNbIHR5cGUgXSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRsaXN0ZW5lcnNbIHR5cGUgXSA9IFtdO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBsaXN0ZW5lcnNbIHR5cGUgXS5pbmRleE9mKCBsaXN0ZW5lciApID09PSAtIDEgKSB7XG5cblx0XHRcdGxpc3RlbmVyc1sgdHlwZSBdLnB1c2goIGxpc3RlbmVyICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHRoYXNFdmVudExpc3RlbmVyOiBmdW5jdGlvbiAoIHR5cGUsIGxpc3RlbmVyICkge1xuXG5cdFx0aWYgKCB0aGlzLl9saXN0ZW5lcnMgPT09IHVuZGVmaW5lZCApIHJldHVybiBmYWxzZTtcblxuXHRcdHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9saXN0ZW5lcnM7XG5cblx0XHRyZXR1cm4gbGlzdGVuZXJzWyB0eXBlIF0gIT09IHVuZGVmaW5lZCAmJiBsaXN0ZW5lcnNbIHR5cGUgXS5pbmRleE9mKCBsaXN0ZW5lciApICE9PSAtIDE7XG5cblx0fSxcblxuXHRyZW1vdmVFdmVudExpc3RlbmVyOiBmdW5jdGlvbiAoIHR5cGUsIGxpc3RlbmVyICkge1xuXG5cdFx0aWYgKCB0aGlzLl9saXN0ZW5lcnMgPT09IHVuZGVmaW5lZCApIHJldHVybjtcblxuXHRcdHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9saXN0ZW5lcnM7XG5cdFx0dmFyIGxpc3RlbmVyQXJyYXkgPSBsaXN0ZW5lcnNbIHR5cGUgXTtcblxuXHRcdGlmICggbGlzdGVuZXJBcnJheSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR2YXIgaW5kZXggPSBsaXN0ZW5lckFycmF5LmluZGV4T2YoIGxpc3RlbmVyICk7XG5cblx0XHRcdGlmICggaW5kZXggIT09IC0gMSApIHtcblxuXHRcdFx0XHRsaXN0ZW5lckFycmF5LnNwbGljZSggaW5kZXgsIDEgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH0sXG5cblx0ZGlzcGF0Y2hFdmVudDogZnVuY3Rpb24gKCBldmVudCApIHtcblxuXHRcdGlmICggdGhpcy5fbGlzdGVuZXJzID09PSB1bmRlZmluZWQgKSByZXR1cm47XG5cblx0XHR2YXIgbGlzdGVuZXJzID0gdGhpcy5fbGlzdGVuZXJzO1xuXHRcdHZhciBsaXN0ZW5lckFycmF5ID0gbGlzdGVuZXJzWyBldmVudC50eXBlIF07XG5cblx0XHRpZiAoIGxpc3RlbmVyQXJyYXkgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0ZXZlbnQudGFyZ2V0ID0gdGhpcztcblxuXHRcdFx0dmFyIGFycmF5ID0gW10sIGkgPSAwO1xuXHRcdFx0dmFyIGxlbmd0aCA9IGxpc3RlbmVyQXJyYXkubGVuZ3RoO1xuXG5cdFx0XHRmb3IgKCBpID0gMDsgaSA8IGxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0XHRhcnJheVsgaSBdID0gbGlzdGVuZXJBcnJheVsgaSBdO1xuXG5cdFx0XHR9XG5cblx0XHRcdGZvciAoIGkgPSAwOyBpIDwgbGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRcdGFycmF5WyBpIF0uY2FsbCggdGhpcywgZXZlbnQgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH1cblxufSApO1xuXG52YXIgUkVWSVNJT04gPSAnODUnO1xudmFyIE1PVVNFID0geyBMRUZUOiAwLCBNSURETEU6IDEsIFJJR0hUOiAyIH07XG52YXIgQ3VsbEZhY2VOb25lID0gMDtcbnZhciBDdWxsRmFjZUJhY2sgPSAxO1xudmFyIEN1bGxGYWNlRnJvbnQgPSAyO1xudmFyIEN1bGxGYWNlRnJvbnRCYWNrID0gMztcbnZhciBGcm9udEZhY2VEaXJlY3Rpb25DVyA9IDA7XG52YXIgRnJvbnRGYWNlRGlyZWN0aW9uQ0NXID0gMTtcbnZhciBCYXNpY1NoYWRvd01hcCA9IDA7XG52YXIgUENGU2hhZG93TWFwID0gMTtcbnZhciBQQ0ZTb2Z0U2hhZG93TWFwID0gMjtcbnZhciBGcm9udFNpZGUgPSAwO1xudmFyIEJhY2tTaWRlID0gMTtcbnZhciBEb3VibGVTaWRlID0gMjtcbnZhciBGbGF0U2hhZGluZyA9IDE7XG52YXIgU21vb3RoU2hhZGluZyA9IDI7XG52YXIgTm9Db2xvcnMgPSAwO1xudmFyIEZhY2VDb2xvcnMgPSAxO1xudmFyIFZlcnRleENvbG9ycyA9IDI7XG52YXIgTm9CbGVuZGluZyA9IDA7XG52YXIgTm9ybWFsQmxlbmRpbmcgPSAxO1xudmFyIEFkZGl0aXZlQmxlbmRpbmcgPSAyO1xudmFyIFN1YnRyYWN0aXZlQmxlbmRpbmcgPSAzO1xudmFyIE11bHRpcGx5QmxlbmRpbmcgPSA0O1xudmFyIEN1c3RvbUJsZW5kaW5nID0gNTtcbnZhciBBZGRFcXVhdGlvbiA9IDEwMDtcbnZhciBTdWJ0cmFjdEVxdWF0aW9uID0gMTAxO1xudmFyIFJldmVyc2VTdWJ0cmFjdEVxdWF0aW9uID0gMTAyO1xudmFyIE1pbkVxdWF0aW9uID0gMTAzO1xudmFyIE1heEVxdWF0aW9uID0gMTA0O1xudmFyIFplcm9GYWN0b3IgPSAyMDA7XG52YXIgT25lRmFjdG9yID0gMjAxO1xudmFyIFNyY0NvbG9yRmFjdG9yID0gMjAyO1xudmFyIE9uZU1pbnVzU3JjQ29sb3JGYWN0b3IgPSAyMDM7XG52YXIgU3JjQWxwaGFGYWN0b3IgPSAyMDQ7XG52YXIgT25lTWludXNTcmNBbHBoYUZhY3RvciA9IDIwNTtcbnZhciBEc3RBbHBoYUZhY3RvciA9IDIwNjtcbnZhciBPbmVNaW51c0RzdEFscGhhRmFjdG9yID0gMjA3O1xudmFyIERzdENvbG9yRmFjdG9yID0gMjA4O1xudmFyIE9uZU1pbnVzRHN0Q29sb3JGYWN0b3IgPSAyMDk7XG52YXIgU3JjQWxwaGFTYXR1cmF0ZUZhY3RvciA9IDIxMDtcbnZhciBOZXZlckRlcHRoID0gMDtcbnZhciBBbHdheXNEZXB0aCA9IDE7XG52YXIgTGVzc0RlcHRoID0gMjtcbnZhciBMZXNzRXF1YWxEZXB0aCA9IDM7XG52YXIgRXF1YWxEZXB0aCA9IDQ7XG52YXIgR3JlYXRlckVxdWFsRGVwdGggPSA1O1xudmFyIEdyZWF0ZXJEZXB0aCA9IDY7XG52YXIgTm90RXF1YWxEZXB0aCA9IDc7XG52YXIgTXVsdGlwbHlPcGVyYXRpb24gPSAwO1xudmFyIE1peE9wZXJhdGlvbiA9IDE7XG52YXIgQWRkT3BlcmF0aW9uID0gMjtcbnZhciBOb1RvbmVNYXBwaW5nID0gMDtcbnZhciBMaW5lYXJUb25lTWFwcGluZyA9IDE7XG52YXIgUmVpbmhhcmRUb25lTWFwcGluZyA9IDI7XG52YXIgVW5jaGFydGVkMlRvbmVNYXBwaW5nID0gMztcbnZhciBDaW5lb25Ub25lTWFwcGluZyA9IDQ7XG52YXIgVVZNYXBwaW5nID0gMzAwO1xudmFyIEN1YmVSZWZsZWN0aW9uTWFwcGluZyA9IDMwMTtcbnZhciBDdWJlUmVmcmFjdGlvbk1hcHBpbmcgPSAzMDI7XG52YXIgRXF1aXJlY3Rhbmd1bGFyUmVmbGVjdGlvbk1hcHBpbmcgPSAzMDM7XG52YXIgRXF1aXJlY3Rhbmd1bGFyUmVmcmFjdGlvbk1hcHBpbmcgPSAzMDQ7XG52YXIgU3BoZXJpY2FsUmVmbGVjdGlvbk1hcHBpbmcgPSAzMDU7XG52YXIgQ3ViZVVWUmVmbGVjdGlvbk1hcHBpbmcgPSAzMDY7XG52YXIgQ3ViZVVWUmVmcmFjdGlvbk1hcHBpbmcgPSAzMDc7XG52YXIgUmVwZWF0V3JhcHBpbmcgPSAxMDAwO1xudmFyIENsYW1wVG9FZGdlV3JhcHBpbmcgPSAxMDAxO1xudmFyIE1pcnJvcmVkUmVwZWF0V3JhcHBpbmcgPSAxMDAyO1xudmFyIE5lYXJlc3RGaWx0ZXIgPSAxMDAzO1xudmFyIE5lYXJlc3RNaXBNYXBOZWFyZXN0RmlsdGVyID0gMTAwNDtcbnZhciBOZWFyZXN0TWlwTWFwTGluZWFyRmlsdGVyID0gMTAwNTtcbnZhciBMaW5lYXJGaWx0ZXIgPSAxMDA2O1xudmFyIExpbmVhck1pcE1hcE5lYXJlc3RGaWx0ZXIgPSAxMDA3O1xudmFyIExpbmVhck1pcE1hcExpbmVhckZpbHRlciA9IDEwMDg7XG52YXIgVW5zaWduZWRCeXRlVHlwZSA9IDEwMDk7XG52YXIgQnl0ZVR5cGUgPSAxMDEwO1xudmFyIFNob3J0VHlwZSA9IDEwMTE7XG52YXIgVW5zaWduZWRTaG9ydFR5cGUgPSAxMDEyO1xudmFyIEludFR5cGUgPSAxMDEzO1xudmFyIFVuc2lnbmVkSW50VHlwZSA9IDEwMTQ7XG52YXIgRmxvYXRUeXBlID0gMTAxNTtcbnZhciBIYWxmRmxvYXRUeXBlID0gMTAxNjtcbnZhciBVbnNpZ25lZFNob3J0NDQ0NFR5cGUgPSAxMDE3O1xudmFyIFVuc2lnbmVkU2hvcnQ1NTUxVHlwZSA9IDEwMTg7XG52YXIgVW5zaWduZWRTaG9ydDU2NVR5cGUgPSAxMDE5O1xudmFyIFVuc2lnbmVkSW50MjQ4VHlwZSA9IDEwMjA7XG52YXIgQWxwaGFGb3JtYXQgPSAxMDIxO1xudmFyIFJHQkZvcm1hdCA9IDEwMjI7XG52YXIgUkdCQUZvcm1hdCA9IDEwMjM7XG52YXIgTHVtaW5hbmNlRm9ybWF0ID0gMTAyNDtcbnZhciBMdW1pbmFuY2VBbHBoYUZvcm1hdCA9IDEwMjU7XG52YXIgUkdCRUZvcm1hdCA9IFJHQkFGb3JtYXQ7XG52YXIgRGVwdGhGb3JtYXQgPSAxMDI2O1xudmFyIERlcHRoU3RlbmNpbEZvcm1hdCA9IDEwMjc7XG52YXIgUkdCX1MzVENfRFhUMV9Gb3JtYXQgPSAyMDAxO1xudmFyIFJHQkFfUzNUQ19EWFQxX0Zvcm1hdCA9IDIwMDI7XG52YXIgUkdCQV9TM1RDX0RYVDNfRm9ybWF0ID0gMjAwMztcbnZhciBSR0JBX1MzVENfRFhUNV9Gb3JtYXQgPSAyMDA0O1xudmFyIFJHQl9QVlJUQ180QlBQVjFfRm9ybWF0ID0gMjEwMDtcbnZhciBSR0JfUFZSVENfMkJQUFYxX0Zvcm1hdCA9IDIxMDE7XG52YXIgUkdCQV9QVlJUQ180QlBQVjFfRm9ybWF0ID0gMjEwMjtcbnZhciBSR0JBX1BWUlRDXzJCUFBWMV9Gb3JtYXQgPSAyMTAzO1xudmFyIFJHQl9FVEMxX0Zvcm1hdCA9IDIxNTE7XG52YXIgTG9vcE9uY2UgPSAyMjAwO1xudmFyIExvb3BSZXBlYXQgPSAyMjAxO1xudmFyIExvb3BQaW5nUG9uZyA9IDIyMDI7XG52YXIgSW50ZXJwb2xhdGVEaXNjcmV0ZSA9IDIzMDA7XG52YXIgSW50ZXJwb2xhdGVMaW5lYXIgPSAyMzAxO1xudmFyIEludGVycG9sYXRlU21vb3RoID0gMjMwMjtcbnZhciBaZXJvQ3VydmF0dXJlRW5kaW5nID0gMjQwMDtcbnZhciBaZXJvU2xvcGVFbmRpbmcgPSAyNDAxO1xudmFyIFdyYXBBcm91bmRFbmRpbmcgPSAyNDAyO1xudmFyIFRyaWFuZ2xlc0RyYXdNb2RlID0gMDtcbnZhciBUcmlhbmdsZVN0cmlwRHJhd01vZGUgPSAxO1xudmFyIFRyaWFuZ2xlRmFuRHJhd01vZGUgPSAyO1xudmFyIExpbmVhckVuY29kaW5nID0gMzAwMDtcbnZhciBzUkdCRW5jb2RpbmcgPSAzMDAxO1xudmFyIEdhbW1hRW5jb2RpbmcgPSAzMDA3O1xudmFyIFJHQkVFbmNvZGluZyA9IDMwMDI7XG52YXIgTG9nTHV2RW5jb2RpbmcgPSAzMDAzO1xudmFyIFJHQk03RW5jb2RpbmcgPSAzMDA0O1xudmFyIFJHQk0xNkVuY29kaW5nID0gMzAwNTtcbnZhciBSR0JERW5jb2RpbmcgPSAzMDA2O1xudmFyIEJhc2ljRGVwdGhQYWNraW5nID0gMzIwMDtcbnZhciBSR0JBRGVwdGhQYWNraW5nID0gMzIwMTtcblxuLyoqXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG52YXIgX01hdGggPSB7XG5cblx0REVHMlJBRDogTWF0aC5QSSAvIDE4MCxcblx0UkFEMkRFRzogMTgwIC8gTWF0aC5QSSxcblxuXHRnZW5lcmF0ZVVVSUQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIGh0dHA6Ly93d3cuYnJvb2ZhLmNvbS9Ub29scy9NYXRoLnV1aWQuaHRtXG5cblx0XHR2YXIgY2hhcnMgPSAnMDEyMzQ1Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonLnNwbGl0KCAnJyApO1xuXHRcdHZhciB1dWlkID0gbmV3IEFycmF5KCAzNiApO1xuXHRcdHZhciBybmQgPSAwLCByO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGdlbmVyYXRlVVVJRCgpIHtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgMzY7IGkgKysgKSB7XG5cblx0XHRcdFx0aWYgKCBpID09PSA4IHx8IGkgPT09IDEzIHx8IGkgPT09IDE4IHx8IGkgPT09IDIzICkge1xuXG5cdFx0XHRcdFx0dXVpZFsgaSBdID0gJy0nO1xuXG5cdFx0XHRcdH0gZWxzZSBpZiAoIGkgPT09IDE0ICkge1xuXG5cdFx0XHRcdFx0dXVpZFsgaSBdID0gJzQnO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRpZiAoIHJuZCA8PSAweDAyICkgcm5kID0gMHgyMDAwMDAwICsgKCBNYXRoLnJhbmRvbSgpICogMHgxMDAwMDAwICkgfCAwO1xuXHRcdFx0XHRcdHIgPSBybmQgJiAweGY7XG5cdFx0XHRcdFx0cm5kID0gcm5kID4+IDQ7XG5cdFx0XHRcdFx0dXVpZFsgaSBdID0gY2hhcnNbICggaSA9PT0gMTkgKSA/ICggciAmIDB4MyApIHwgMHg4IDogciBdO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdXVpZC5qb2luKCAnJyApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0Y2xhbXA6IGZ1bmN0aW9uICggdmFsdWUsIG1pbiwgbWF4ICkge1xuXG5cdFx0cmV0dXJuIE1hdGgubWF4KCBtaW4sIE1hdGgubWluKCBtYXgsIHZhbHVlICkgKTtcblxuXHR9LFxuXG5cdC8vIGNvbXB1dGUgZXVjbGlkaWFuIG1vZHVsbyBvZiBtICUgblxuXHQvLyBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Nb2R1bG9fb3BlcmF0aW9uXG5cblx0ZXVjbGlkZWFuTW9kdWxvOiBmdW5jdGlvbiAoIG4sIG0gKSB7XG5cblx0XHRyZXR1cm4gKCAoIG4gJSBtICkgKyBtICkgJSBtO1xuXG5cdH0sXG5cblx0Ly8gTGluZWFyIG1hcHBpbmcgZnJvbSByYW5nZSA8YTEsIGEyPiB0byByYW5nZSA8YjEsIGIyPlxuXG5cdG1hcExpbmVhcjogZnVuY3Rpb24gKCB4LCBhMSwgYTIsIGIxLCBiMiApIHtcblxuXHRcdHJldHVybiBiMSArICggeCAtIGExICkgKiAoIGIyIC0gYjEgKSAvICggYTIgLSBhMSApO1xuXG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTGluZWFyX2ludGVycG9sYXRpb25cblxuXHRsZXJwOiBmdW5jdGlvbiAoIHgsIHksIHQgKSB7XG5cblx0XHRyZXR1cm4gKCAxIC0gdCApICogeCArIHQgKiB5O1xuXG5cdH0sXG5cblx0Ly8gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TbW9vdGhzdGVwXG5cblx0c21vb3Roc3RlcDogZnVuY3Rpb24gKCB4LCBtaW4sIG1heCApIHtcblxuXHRcdGlmICggeCA8PSBtaW4gKSByZXR1cm4gMDtcblx0XHRpZiAoIHggPj0gbWF4ICkgcmV0dXJuIDE7XG5cblx0XHR4ID0gKCB4IC0gbWluICkgLyAoIG1heCAtIG1pbiApO1xuXG5cdFx0cmV0dXJuIHggKiB4ICogKCAzIC0gMiAqIHggKTtcblxuXHR9LFxuXG5cdHNtb290aGVyc3RlcDogZnVuY3Rpb24gKCB4LCBtaW4sIG1heCApIHtcblxuXHRcdGlmICggeCA8PSBtaW4gKSByZXR1cm4gMDtcblx0XHRpZiAoIHggPj0gbWF4ICkgcmV0dXJuIDE7XG5cblx0XHR4ID0gKCB4IC0gbWluICkgLyAoIG1heCAtIG1pbiApO1xuXG5cdFx0cmV0dXJuIHggKiB4ICogeCAqICggeCAqICggeCAqIDYgLSAxNSApICsgMTAgKTtcblxuXHR9LFxuXG5cdC8vIFJhbmRvbSBpbnRlZ2VyIGZyb20gPGxvdywgaGlnaD4gaW50ZXJ2YWxcblxuXHRyYW5kSW50OiBmdW5jdGlvbiAoIGxvdywgaGlnaCApIHtcblxuXHRcdHJldHVybiBsb3cgKyBNYXRoLmZsb29yKCBNYXRoLnJhbmRvbSgpICogKCBoaWdoIC0gbG93ICsgMSApICk7XG5cblx0fSxcblxuXHQvLyBSYW5kb20gZmxvYXQgZnJvbSA8bG93LCBoaWdoPiBpbnRlcnZhbFxuXG5cdHJhbmRGbG9hdDogZnVuY3Rpb24gKCBsb3csIGhpZ2ggKSB7XG5cblx0XHRyZXR1cm4gbG93ICsgTWF0aC5yYW5kb20oKSAqICggaGlnaCAtIGxvdyApO1xuXG5cdH0sXG5cblx0Ly8gUmFuZG9tIGZsb2F0IGZyb20gPC1yYW5nZS8yLCByYW5nZS8yPiBpbnRlcnZhbFxuXG5cdHJhbmRGbG9hdFNwcmVhZDogZnVuY3Rpb24gKCByYW5nZSApIHtcblxuXHRcdHJldHVybiByYW5nZSAqICggMC41IC0gTWF0aC5yYW5kb20oKSApO1xuXG5cdH0sXG5cblx0ZGVnVG9SYWQ6IGZ1bmN0aW9uICggZGVncmVlcyApIHtcblxuXHRcdHJldHVybiBkZWdyZWVzICogX01hdGguREVHMlJBRDtcblxuXHR9LFxuXG5cdHJhZFRvRGVnOiBmdW5jdGlvbiAoIHJhZGlhbnMgKSB7XG5cblx0XHRyZXR1cm4gcmFkaWFucyAqIF9NYXRoLlJBRDJERUc7XG5cblx0fSxcblxuXHRpc1Bvd2VyT2ZUd286IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRyZXR1cm4gKCB2YWx1ZSAmICggdmFsdWUgLSAxICkgKSA9PT0gMCAmJiB2YWx1ZSAhPT0gMDtcblxuXHR9LFxuXG5cdG5lYXJlc3RQb3dlck9mVHdvOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0cmV0dXJuIE1hdGgucG93KCAyLCBNYXRoLnJvdW5kKCBNYXRoLmxvZyggdmFsdWUgKSAvIE1hdGguTE4yICkgKTtcblxuXHR9LFxuXG5cdG5leHRQb3dlck9mVHdvOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dmFsdWUgLS07XG5cdFx0dmFsdWUgfD0gdmFsdWUgPj4gMTtcblx0XHR2YWx1ZSB8PSB2YWx1ZSA+PiAyO1xuXHRcdHZhbHVlIHw9IHZhbHVlID4+IDQ7XG5cdFx0dmFsdWUgfD0gdmFsdWUgPj4gODtcblx0XHR2YWx1ZSB8PSB2YWx1ZSA+PiAxNjtcblx0XHR2YWx1ZSArKztcblxuXHRcdHJldHVybiB2YWx1ZTtcblxuXHR9XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgcGhpbG9nYiAvIGh0dHA6Ly9ibG9nLnRoZWppdC5vcmcvXG4gKiBAYXV0aG9yIGVncmFldGhlciAvIGh0dHA6Ly9lZ3JhZXRoZXIuY29tL1xuICogQGF1dGhvciB6ejg1IC8gaHR0cDovL3d3dy5sYWI0Z2FtZXMubmV0L3p6ODUvYmxvZ1xuICovXG5cbmZ1bmN0aW9uIFZlY3RvcjIoIHgsIHkgKSB7XG5cblx0dGhpcy54ID0geCB8fCAwO1xuXHR0aGlzLnkgPSB5IHx8IDA7XG5cbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIFZlY3RvcjIucHJvdG90eXBlLCB7XG5cblx0XCJ3aWR0aFwiIDoge1xuXG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLng7XG5cblx0XHR9LFxuXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHR0aGlzLnggPSB2YWx1ZTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdFwiaGVpZ2h0XCIgOiB7XG5cblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMueTtcblxuXHRcdH0sXG5cblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdHRoaXMueSA9IHZhbHVlO1xuXG5cdFx0fVxuXG5cdH1cblxufSApO1xuXG5PYmplY3QuYXNzaWduKCBWZWN0b3IyLnByb3RvdHlwZSwge1xuXG5cdGlzVmVjdG9yMjogdHJ1ZSxcblxuXHRzZXQ6IGZ1bmN0aW9uICggeCwgeSApIHtcblxuXHRcdHRoaXMueCA9IHg7XG5cdFx0dGhpcy55ID0geTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0U2NhbGFyOiBmdW5jdGlvbiAoIHNjYWxhciApIHtcblxuXHRcdHRoaXMueCA9IHNjYWxhcjtcblx0XHR0aGlzLnkgPSBzY2FsYXI7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFg6IGZ1bmN0aW9uICggeCApIHtcblxuXHRcdHRoaXMueCA9IHg7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFk6IGZ1bmN0aW9uICggeSApIHtcblxuXHRcdHRoaXMueSA9IHk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldENvbXBvbmVudDogZnVuY3Rpb24gKCBpbmRleCwgdmFsdWUgKSB7XG5cblx0XHRzd2l0Y2ggKCBpbmRleCApIHtcblxuXHRcdFx0Y2FzZSAwOiB0aGlzLnggPSB2YWx1ZTsgYnJlYWs7XG5cdFx0XHRjYXNlIDE6IHRoaXMueSA9IHZhbHVlOyBicmVhaztcblx0XHRcdGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvciggJ2luZGV4IGlzIG91dCBvZiByYW5nZTogJyArIGluZGV4ICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGdldENvbXBvbmVudDogZnVuY3Rpb24gKCBpbmRleCApIHtcblxuXHRcdHN3aXRjaCAoIGluZGV4ICkge1xuXG5cdFx0XHRjYXNlIDA6IHJldHVybiB0aGlzLng7XG5cdFx0XHRjYXNlIDE6IHJldHVybiB0aGlzLnk7XG5cdFx0XHRkZWZhdWx0OiB0aHJvdyBuZXcgRXJyb3IoICdpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICcgKyBpbmRleCApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvciggdGhpcy54LCB0aGlzLnkgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHRoaXMueCA9IHYueDtcblx0XHR0aGlzLnkgPSB2Lnk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFkZDogZnVuY3Rpb24gKCB2LCB3ICkge1xuXG5cdFx0aWYgKCB3ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjI6IC5hZGQoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5hZGRWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5hZGRWZWN0b3JzKCB2LCB3ICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLnggKz0gdi54O1xuXHRcdHRoaXMueSArPSB2Lnk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFkZFNjYWxhcjogZnVuY3Rpb24gKCBzICkge1xuXG5cdFx0dGhpcy54ICs9IHM7XG5cdFx0dGhpcy55ICs9IHM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFkZFZlY3RvcnM6IGZ1bmN0aW9uICggYSwgYiApIHtcblxuXHRcdHRoaXMueCA9IGEueCArIGIueDtcblx0XHR0aGlzLnkgPSBhLnkgKyBiLnk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFkZFNjYWxlZFZlY3RvcjogZnVuY3Rpb24gKCB2LCBzICkge1xuXG5cdFx0dGhpcy54ICs9IHYueCAqIHM7XG5cdFx0dGhpcy55ICs9IHYueSAqIHM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHN1YjogZnVuY3Rpb24gKCB2LCB3ICkge1xuXG5cdFx0aWYgKCB3ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjI6IC5zdWIoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5zdWJWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5zdWJWZWN0b3JzKCB2LCB3ICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLnggLT0gdi54O1xuXHRcdHRoaXMueSAtPSB2Lnk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHN1YlNjYWxhcjogZnVuY3Rpb24gKCBzICkge1xuXG5cdFx0dGhpcy54IC09IHM7XG5cdFx0dGhpcy55IC09IHM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHN1YlZlY3RvcnM6IGZ1bmN0aW9uICggYSwgYiApIHtcblxuXHRcdHRoaXMueCA9IGEueCAtIGIueDtcblx0XHR0aGlzLnkgPSBhLnkgLSBiLnk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG11bHRpcGx5OiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHR0aGlzLnggKj0gdi54O1xuXHRcdHRoaXMueSAqPSB2Lnk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG11bHRpcGx5U2NhbGFyOiBmdW5jdGlvbiAoIHNjYWxhciApIHtcblxuXHRcdHRoaXMueCAqPSBzY2FsYXI7XG5cdFx0dGhpcy55ICo9IHNjYWxhcjtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZGl2aWRlOiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHR0aGlzLnggLz0gdi54O1xuXHRcdHRoaXMueSAvPSB2Lnk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGRpdmlkZVNjYWxhcjogZnVuY3Rpb24gKCBzY2FsYXIgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5tdWx0aXBseVNjYWxhciggMSAvIHNjYWxhciApO1xuXG5cdH0sXG5cblx0bWluOiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHR0aGlzLnggPSBNYXRoLm1pbiggdGhpcy54LCB2LnggKTtcblx0XHR0aGlzLnkgPSBNYXRoLm1pbiggdGhpcy55LCB2LnkgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bWF4OiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHR0aGlzLnggPSBNYXRoLm1heCggdGhpcy54LCB2LnggKTtcblx0XHR0aGlzLnkgPSBNYXRoLm1heCggdGhpcy55LCB2LnkgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xhbXA6IGZ1bmN0aW9uICggbWluLCBtYXggKSB7XG5cblx0XHQvLyBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgbWluIDwgbWF4LCBpZiB0aGlzIGFzc3VtcHRpb24gaXNuJ3QgdHJ1ZSBpdCB3aWxsIG5vdCBvcGVyYXRlIGNvcnJlY3RseVxuXG5cdFx0dGhpcy54ID0gTWF0aC5tYXgoIG1pbi54LCBNYXRoLm1pbiggbWF4LngsIHRoaXMueCApICk7XG5cdFx0dGhpcy55ID0gTWF0aC5tYXgoIG1pbi55LCBNYXRoLm1pbiggbWF4LnksIHRoaXMueSApICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNsYW1wU2NhbGFyOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgbWluID0gbmV3IFZlY3RvcjIoKTtcblx0XHR2YXIgbWF4ID0gbmV3IFZlY3RvcjIoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBjbGFtcFNjYWxhciggbWluVmFsLCBtYXhWYWwgKSB7XG5cblx0XHRcdG1pbi5zZXQoIG1pblZhbCwgbWluVmFsICk7XG5cdFx0XHRtYXguc2V0KCBtYXhWYWwsIG1heFZhbCApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5jbGFtcCggbWluLCBtYXggKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGNsYW1wTGVuZ3RoOiBmdW5jdGlvbiAoIG1pbiwgbWF4ICkge1xuXG5cdFx0dmFyIGxlbmd0aCA9IHRoaXMubGVuZ3RoKCk7XG5cblx0XHRyZXR1cm4gdGhpcy5tdWx0aXBseVNjYWxhciggTWF0aC5tYXgoIG1pbiwgTWF0aC5taW4oIG1heCwgbGVuZ3RoICkgKSAvIGxlbmd0aCApO1xuXG5cdH0sXG5cblx0Zmxvb3I6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMueCA9IE1hdGguZmxvb3IoIHRoaXMueCApO1xuXHRcdHRoaXMueSA9IE1hdGguZmxvb3IoIHRoaXMueSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjZWlsOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLnggPSBNYXRoLmNlaWwoIHRoaXMueCApO1xuXHRcdHRoaXMueSA9IE1hdGguY2VpbCggdGhpcy55ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHJvdW5kOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLnggPSBNYXRoLnJvdW5kKCB0aGlzLnggKTtcblx0XHR0aGlzLnkgPSBNYXRoLnJvdW5kKCB0aGlzLnkgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0cm91bmRUb1plcm86IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMueCA9ICggdGhpcy54IDwgMCApID8gTWF0aC5jZWlsKCB0aGlzLnggKSA6IE1hdGguZmxvb3IoIHRoaXMueCApO1xuXHRcdHRoaXMueSA9ICggdGhpcy55IDwgMCApID8gTWF0aC5jZWlsKCB0aGlzLnkgKSA6IE1hdGguZmxvb3IoIHRoaXMueSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRuZWdhdGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMueCA9IC0gdGhpcy54O1xuXHRcdHRoaXMueSA9IC0gdGhpcy55O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRkb3Q6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHJldHVybiB0aGlzLnggKiB2LnggKyB0aGlzLnkgKiB2Lnk7XG5cblx0fSxcblxuXHRsZW5ndGhTcTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMueCAqIHRoaXMueCArIHRoaXMueSAqIHRoaXMueTtcblxuXHR9LFxuXG5cdGxlbmd0aDogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIE1hdGguc3FydCggdGhpcy54ICogdGhpcy54ICsgdGhpcy55ICogdGhpcy55ICk7XG5cblx0fSxcblxuXHRsZW5ndGhNYW5oYXR0YW46IGZ1bmN0aW9uKCkge1xuXG5cdFx0cmV0dXJuIE1hdGguYWJzKCB0aGlzLnggKSArIE1hdGguYWJzKCB0aGlzLnkgKTtcblxuXHR9LFxuXG5cdG5vcm1hbGl6ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKCB0aGlzLmxlbmd0aCgpICk7XG5cblx0fSxcblxuXHRhbmdsZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gY29tcHV0ZXMgdGhlIGFuZ2xlIGluIHJhZGlhbnMgd2l0aCByZXNwZWN0IHRvIHRoZSBwb3NpdGl2ZSB4LWF4aXNcblxuXHRcdHZhciBhbmdsZSA9IE1hdGguYXRhbjIoIHRoaXMueSwgdGhpcy54ICk7XG5cblx0XHRpZiAoIGFuZ2xlIDwgMCApIGFuZ2xlICs9IDIgKiBNYXRoLlBJO1xuXG5cdFx0cmV0dXJuIGFuZ2xlO1xuXG5cdH0sXG5cblx0ZGlzdGFuY2VUbzogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0cmV0dXJuIE1hdGguc3FydCggdGhpcy5kaXN0YW5jZVRvU3F1YXJlZCggdiApICk7XG5cblx0fSxcblxuXHRkaXN0YW5jZVRvU3F1YXJlZDogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0dmFyIGR4ID0gdGhpcy54IC0gdi54LCBkeSA9IHRoaXMueSAtIHYueTtcblx0XHRyZXR1cm4gZHggKiBkeCArIGR5ICogZHk7XG5cblx0fSxcblxuXHRkaXN0YW5jZVRvTWFuaGF0dGFuOiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHRyZXR1cm4gTWF0aC5hYnMoIHRoaXMueCAtIHYueCApICsgTWF0aC5hYnMoIHRoaXMueSAtIHYueSApO1xuXG5cdH0sXG5cblx0c2V0TGVuZ3RoOiBmdW5jdGlvbiAoIGxlbmd0aCApIHtcblxuXHRcdHJldHVybiB0aGlzLm11bHRpcGx5U2NhbGFyKCBsZW5ndGggLyB0aGlzLmxlbmd0aCgpICk7XG5cblx0fSxcblxuXHRsZXJwOiBmdW5jdGlvbiAoIHYsIGFscGhhICkge1xuXG5cdFx0dGhpcy54ICs9ICggdi54IC0gdGhpcy54ICkgKiBhbHBoYTtcblx0XHR0aGlzLnkgKz0gKCB2LnkgLSB0aGlzLnkgKSAqIGFscGhhO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRsZXJwVmVjdG9yczogZnVuY3Rpb24gKCB2MSwgdjIsIGFscGhhICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuc3ViVmVjdG9ycyggdjIsIHYxICkubXVsdGlwbHlTY2FsYXIoIGFscGhhICkuYWRkKCB2MSApO1xuXG5cdH0sXG5cblx0ZXF1YWxzOiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHRyZXR1cm4gKCAoIHYueCA9PT0gdGhpcy54ICkgJiYgKCB2LnkgPT09IHRoaXMueSApICk7XG5cblx0fSxcblxuXHRmcm9tQXJyYXk6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCApIHtcblxuXHRcdGlmICggb2Zmc2V0ID09PSB1bmRlZmluZWQgKSBvZmZzZXQgPSAwO1xuXG5cdFx0dGhpcy54ID0gYXJyYXlbIG9mZnNldCBdO1xuXHRcdHRoaXMueSA9IGFycmF5WyBvZmZzZXQgKyAxIF07XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHRvQXJyYXk6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCApIHtcblxuXHRcdGlmICggYXJyYXkgPT09IHVuZGVmaW5lZCApIGFycmF5ID0gW107XG5cdFx0aWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7XG5cblx0XHRhcnJheVsgb2Zmc2V0IF0gPSB0aGlzLng7XG5cdFx0YXJyYXlbIG9mZnNldCArIDEgXSA9IHRoaXMueTtcblxuXHRcdHJldHVybiBhcnJheTtcblxuXHR9LFxuXG5cdGZyb21CdWZmZXJBdHRyaWJ1dGU6IGZ1bmN0aW9uICggYXR0cmlidXRlLCBpbmRleCwgb2Zmc2V0ICkge1xuXG5cdFx0aWYgKCBvZmZzZXQgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yMjogb2Zmc2V0IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSAuZnJvbUJ1ZmZlckF0dHJpYnV0ZSgpLicgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMueCA9IGF0dHJpYnV0ZS5nZXRYKCBpbmRleCApO1xuXHRcdHRoaXMueSA9IGF0dHJpYnV0ZS5nZXRZKCBpbmRleCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRyb3RhdGVBcm91bmQ6IGZ1bmN0aW9uICggY2VudGVyLCBhbmdsZSApIHtcblxuXHRcdHZhciBjID0gTWF0aC5jb3MoIGFuZ2xlICksIHMgPSBNYXRoLnNpbiggYW5nbGUgKTtcblxuXHRcdHZhciB4ID0gdGhpcy54IC0gY2VudGVyLng7XG5cdFx0dmFyIHkgPSB0aGlzLnkgLSBjZW50ZXIueTtcblxuXHRcdHRoaXMueCA9IHggKiBjIC0geSAqIHMgKyBjZW50ZXIueDtcblx0XHR0aGlzLnkgPSB4ICogcyArIHkgKiBjICsgY2VudGVyLnk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3Igc3ppbWVrIC8gaHR0cHM6Ly9naXRodWIuY29tL3N6aW1lay9cbiAqL1xuXG52YXIgdGV4dHVyZUlkID0gMDtcblxuZnVuY3Rpb24gVGV4dHVyZSggaW1hZ2UsIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGZvcm1hdCwgdHlwZSwgYW5pc290cm9weSwgZW5jb2RpbmcgKSB7XG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KCB0aGlzLCAnaWQnLCB7IHZhbHVlOiB0ZXh0dXJlSWQgKysgfSApO1xuXG5cdHRoaXMudXVpZCA9IF9NYXRoLmdlbmVyYXRlVVVJRCgpO1xuXG5cdHRoaXMubmFtZSA9ICcnO1xuXG5cdHRoaXMuaW1hZ2UgPSBpbWFnZSAhPT0gdW5kZWZpbmVkID8gaW1hZ2UgOiBUZXh0dXJlLkRFRkFVTFRfSU1BR0U7XG5cdHRoaXMubWlwbWFwcyA9IFtdO1xuXG5cdHRoaXMubWFwcGluZyA9IG1hcHBpbmcgIT09IHVuZGVmaW5lZCA/IG1hcHBpbmcgOiBUZXh0dXJlLkRFRkFVTFRfTUFQUElORztcblxuXHR0aGlzLndyYXBTID0gd3JhcFMgIT09IHVuZGVmaW5lZCA/IHdyYXBTIDogQ2xhbXBUb0VkZ2VXcmFwcGluZztcblx0dGhpcy53cmFwVCA9IHdyYXBUICE9PSB1bmRlZmluZWQgPyB3cmFwVCA6IENsYW1wVG9FZGdlV3JhcHBpbmc7XG5cblx0dGhpcy5tYWdGaWx0ZXIgPSBtYWdGaWx0ZXIgIT09IHVuZGVmaW5lZCA/IG1hZ0ZpbHRlciA6IExpbmVhckZpbHRlcjtcblx0dGhpcy5taW5GaWx0ZXIgPSBtaW5GaWx0ZXIgIT09IHVuZGVmaW5lZCA/IG1pbkZpbHRlciA6IExpbmVhck1pcE1hcExpbmVhckZpbHRlcjtcblxuXHR0aGlzLmFuaXNvdHJvcHkgPSBhbmlzb3Ryb3B5ICE9PSB1bmRlZmluZWQgPyBhbmlzb3Ryb3B5IDogMTtcblxuXHR0aGlzLmZvcm1hdCA9IGZvcm1hdCAhPT0gdW5kZWZpbmVkID8gZm9ybWF0IDogUkdCQUZvcm1hdDtcblx0dGhpcy50eXBlID0gdHlwZSAhPT0gdW5kZWZpbmVkID8gdHlwZSA6IFVuc2lnbmVkQnl0ZVR5cGU7XG5cblx0dGhpcy5vZmZzZXQgPSBuZXcgVmVjdG9yMiggMCwgMCApO1xuXHR0aGlzLnJlcGVhdCA9IG5ldyBWZWN0b3IyKCAxLCAxICk7XG5cblx0dGhpcy5nZW5lcmF0ZU1pcG1hcHMgPSB0cnVlO1xuXHR0aGlzLnByZW11bHRpcGx5QWxwaGEgPSBmYWxzZTtcblx0dGhpcy5mbGlwWSA9IHRydWU7XG5cdHRoaXMudW5wYWNrQWxpZ25tZW50ID0gNDtcdC8vIHZhbGlkIHZhbHVlczogMSwgMiwgNCwgOCAoc2VlIGh0dHA6Ly93d3cua2hyb25vcy5vcmcvb3BlbmdsZXMvc2RrL2RvY3MvbWFuL3hodG1sL2dsUGl4ZWxTdG9yZWkueG1sKVxuXG5cdC8vIFZhbHVlcyBvZiBlbmNvZGluZyAhPT0gVEhSRUUuTGluZWFyRW5jb2Rpbmcgb25seSBzdXBwb3J0ZWQgb24gbWFwLCBlbnZNYXAgYW5kIGVtaXNzaXZlTWFwLlxuXHQvL1xuXHQvLyBBbHNvIGNoYW5naW5nIHRoZSBlbmNvZGluZyBhZnRlciBhbHJlYWR5IHVzZWQgYnkgYSBNYXRlcmlhbCB3aWxsIG5vdCBhdXRvbWF0aWNhbGx5IG1ha2UgdGhlIE1hdGVyaWFsXG5cdC8vIHVwZGF0ZS4gIFlvdSBuZWVkIHRvIGV4cGxpY2l0bHkgY2FsbCBNYXRlcmlhbC5uZWVkc1VwZGF0ZSB0byB0cmlnZ2VyIGl0IHRvIHJlY29tcGlsZS5cblx0dGhpcy5lbmNvZGluZyA9IGVuY29kaW5nICE9PSB1bmRlZmluZWQgPyBlbmNvZGluZyA6IExpbmVhckVuY29kaW5nO1xuXG5cdHRoaXMudmVyc2lvbiA9IDA7XG5cdHRoaXMub25VcGRhdGUgPSBudWxsO1xuXG59XG5cblRleHR1cmUuREVGQVVMVF9JTUFHRSA9IHVuZGVmaW5lZDtcblRleHR1cmUuREVGQVVMVF9NQVBQSU5HID0gVVZNYXBwaW5nO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoIFRleHR1cmUucHJvdG90eXBlLCBcIm5lZWRzVXBkYXRlXCIsIHtcblxuXHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRpZiAoIHZhbHVlID09PSB0cnVlICkgdGhpcy52ZXJzaW9uICsrO1xuXG5cdH1cblxufSApO1xuXG5PYmplY3QuYXNzaWduKCBUZXh0dXJlLnByb3RvdHlwZSwgRXZlbnREaXNwYXRjaGVyLnByb3RvdHlwZSwge1xuXG5cdGNvbnN0cnVjdG9yOiBUZXh0dXJlLFxuXG5cdGlzVGV4dHVyZTogdHJ1ZSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHR0aGlzLm5hbWUgPSBzb3VyY2UubmFtZTtcblxuXHRcdHRoaXMuaW1hZ2UgPSBzb3VyY2UuaW1hZ2U7XG5cdFx0dGhpcy5taXBtYXBzID0gc291cmNlLm1pcG1hcHMuc2xpY2UoIDAgKTtcblxuXHRcdHRoaXMubWFwcGluZyA9IHNvdXJjZS5tYXBwaW5nO1xuXG5cdFx0dGhpcy53cmFwUyA9IHNvdXJjZS53cmFwUztcblx0XHR0aGlzLndyYXBUID0gc291cmNlLndyYXBUO1xuXG5cdFx0dGhpcy5tYWdGaWx0ZXIgPSBzb3VyY2UubWFnRmlsdGVyO1xuXHRcdHRoaXMubWluRmlsdGVyID0gc291cmNlLm1pbkZpbHRlcjtcblxuXHRcdHRoaXMuYW5pc290cm9weSA9IHNvdXJjZS5hbmlzb3Ryb3B5O1xuXG5cdFx0dGhpcy5mb3JtYXQgPSBzb3VyY2UuZm9ybWF0O1xuXHRcdHRoaXMudHlwZSA9IHNvdXJjZS50eXBlO1xuXG5cdFx0dGhpcy5vZmZzZXQuY29weSggc291cmNlLm9mZnNldCApO1xuXHRcdHRoaXMucmVwZWF0LmNvcHkoIHNvdXJjZS5yZXBlYXQgKTtcblxuXHRcdHRoaXMuZ2VuZXJhdGVNaXBtYXBzID0gc291cmNlLmdlbmVyYXRlTWlwbWFwcztcblx0XHR0aGlzLnByZW11bHRpcGx5QWxwaGEgPSBzb3VyY2UucHJlbXVsdGlwbHlBbHBoYTtcblx0XHR0aGlzLmZsaXBZID0gc291cmNlLmZsaXBZO1xuXHRcdHRoaXMudW5wYWNrQWxpZ25tZW50ID0gc291cmNlLnVucGFja0FsaWdubWVudDtcblx0XHR0aGlzLmVuY29kaW5nID0gc291cmNlLmVuY29kaW5nO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHR0b0pTT046IGZ1bmN0aW9uICggbWV0YSApIHtcblxuXHRcdGlmICggbWV0YS50ZXh0dXJlc1sgdGhpcy51dWlkIF0gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0cmV0dXJuIG1ldGEudGV4dHVyZXNbIHRoaXMudXVpZCBdO1xuXG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gZ2V0RGF0YVVSTCggaW1hZ2UgKSB7XG5cblx0XHRcdHZhciBjYW52YXM7XG5cblx0XHRcdGlmICggaW1hZ2UudG9EYXRhVVJMICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Y2FudmFzID0gaW1hZ2U7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Y2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCcsICdjYW52YXMnICk7XG5cdFx0XHRcdGNhbnZhcy53aWR0aCA9IGltYWdlLndpZHRoO1xuXHRcdFx0XHRjYW52YXMuaGVpZ2h0ID0gaW1hZ2UuaGVpZ2h0O1xuXG5cdFx0XHRcdGNhbnZhcy5nZXRDb250ZXh0KCAnMmQnICkuZHJhd0ltYWdlKCBpbWFnZSwgMCwgMCwgaW1hZ2Uud2lkdGgsIGltYWdlLmhlaWdodCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggY2FudmFzLndpZHRoID4gMjA0OCB8fCBjYW52YXMuaGVpZ2h0ID4gMjA0OCApIHtcblxuXHRcdFx0XHRyZXR1cm4gY2FudmFzLnRvRGF0YVVSTCggJ2ltYWdlL2pwZWcnLCAwLjYgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRyZXR1cm4gY2FudmFzLnRvRGF0YVVSTCggJ2ltYWdlL3BuZycgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0dmFyIG91dHB1dCA9IHtcblx0XHRcdG1ldGFkYXRhOiB7XG5cdFx0XHRcdHZlcnNpb246IDQuNSxcblx0XHRcdFx0dHlwZTogJ1RleHR1cmUnLFxuXHRcdFx0XHRnZW5lcmF0b3I6ICdUZXh0dXJlLnRvSlNPTidcblx0XHRcdH0sXG5cblx0XHRcdHV1aWQ6IHRoaXMudXVpZCxcblx0XHRcdG5hbWU6IHRoaXMubmFtZSxcblxuXHRcdFx0bWFwcGluZzogdGhpcy5tYXBwaW5nLFxuXG5cdFx0XHRyZXBlYXQ6IFsgdGhpcy5yZXBlYXQueCwgdGhpcy5yZXBlYXQueSBdLFxuXHRcdFx0b2Zmc2V0OiBbIHRoaXMub2Zmc2V0LngsIHRoaXMub2Zmc2V0LnkgXSxcblx0XHRcdHdyYXA6IFsgdGhpcy53cmFwUywgdGhpcy53cmFwVCBdLFxuXG5cdFx0XHRtaW5GaWx0ZXI6IHRoaXMubWluRmlsdGVyLFxuXHRcdFx0bWFnRmlsdGVyOiB0aGlzLm1hZ0ZpbHRlcixcblx0XHRcdGFuaXNvdHJvcHk6IHRoaXMuYW5pc290cm9weSxcblxuXHRcdFx0ZmxpcFk6IHRoaXMuZmxpcFlcblx0XHR9O1xuXG5cdFx0aWYgKCB0aGlzLmltYWdlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdC8vIFRPRE86IE1vdmUgdG8gVEhSRUUuSW1hZ2VcblxuXHRcdFx0dmFyIGltYWdlID0gdGhpcy5pbWFnZTtcblxuXHRcdFx0aWYgKCBpbWFnZS51dWlkID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0aW1hZ2UudXVpZCA9IF9NYXRoLmdlbmVyYXRlVVVJRCgpOyAvLyBVR0hcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIG1ldGEuaW1hZ2VzWyBpbWFnZS51dWlkIF0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRtZXRhLmltYWdlc1sgaW1hZ2UudXVpZCBdID0ge1xuXHRcdFx0XHRcdHV1aWQ6IGltYWdlLnV1aWQsXG5cdFx0XHRcdFx0dXJsOiBnZXREYXRhVVJMKCBpbWFnZSApXG5cdFx0XHRcdH07XG5cblx0XHRcdH1cblxuXHRcdFx0b3V0cHV0LmltYWdlID0gaW1hZ2UudXVpZDtcblxuXHRcdH1cblxuXHRcdG1ldGEudGV4dHVyZXNbIHRoaXMudXVpZCBdID0gb3V0cHV0O1xuXG5cdFx0cmV0dXJuIG91dHB1dDtcblxuXHR9LFxuXG5cdGRpc3Bvc2U6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuZGlzcGF0Y2hFdmVudCggeyB0eXBlOiAnZGlzcG9zZScgfSApO1xuXG5cdH0sXG5cblx0dHJhbnNmb3JtVXY6IGZ1bmN0aW9uICggdXYgKSB7XG5cblx0XHRpZiAoIHRoaXMubWFwcGluZyAhPT0gVVZNYXBwaW5nICkgcmV0dXJuO1xuXG5cdFx0dXYubXVsdGlwbHkoIHRoaXMucmVwZWF0ICk7XG5cdFx0dXYuYWRkKCB0aGlzLm9mZnNldCApO1xuXG5cdFx0aWYgKCB1di54IDwgMCB8fCB1di54ID4gMSApIHtcblxuXHRcdFx0c3dpdGNoICggdGhpcy53cmFwUyApIHtcblxuXHRcdFx0XHRjYXNlIFJlcGVhdFdyYXBwaW5nOlxuXG5cdFx0XHRcdFx0dXYueCA9IHV2LnggLSBNYXRoLmZsb29yKCB1di54ICk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSBDbGFtcFRvRWRnZVdyYXBwaW5nOlxuXG5cdFx0XHRcdFx0dXYueCA9IHV2LnggPCAwID8gMCA6IDE7XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSBNaXJyb3JlZFJlcGVhdFdyYXBwaW5nOlxuXG5cdFx0XHRcdFx0aWYgKCBNYXRoLmFicyggTWF0aC5mbG9vciggdXYueCApICUgMiApID09PSAxICkge1xuXG5cdFx0XHRcdFx0XHR1di54ID0gTWF0aC5jZWlsKCB1di54ICkgLSB1di54O1xuXG5cdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0dXYueCA9IHV2LnggLSBNYXRoLmZsb29yKCB1di54ICk7XG5cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggdXYueSA8IDAgfHwgdXYueSA+IDEgKSB7XG5cblx0XHRcdHN3aXRjaCAoIHRoaXMud3JhcFQgKSB7XG5cblx0XHRcdFx0Y2FzZSBSZXBlYXRXcmFwcGluZzpcblxuXHRcdFx0XHRcdHV2LnkgPSB1di55IC0gTWF0aC5mbG9vciggdXYueSApO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgQ2xhbXBUb0VkZ2VXcmFwcGluZzpcblxuXHRcdFx0XHRcdHV2LnkgPSB1di55IDwgMCA/IDAgOiAxO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgTWlycm9yZWRSZXBlYXRXcmFwcGluZzpcblxuXHRcdFx0XHRcdGlmICggTWF0aC5hYnMoIE1hdGguZmxvb3IoIHV2LnkgKSAlIDIgKSA9PT0gMSApIHtcblxuXHRcdFx0XHRcdFx0dXYueSA9IE1hdGguY2VpbCggdXYueSApIC0gdXYueTtcblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdHV2LnkgPSB1di55IC0gTWF0aC5mbG9vciggdXYueSApO1xuXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIHRoaXMuZmxpcFkgKSB7XG5cblx0XHRcdHV2LnkgPSAxIC0gdXYueTtcblxuXHRcdH1cblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIHN1cGVyZWdnYmVydCAvIGh0dHA6Ly93d3cucGF1bGJydW50LmNvLnVrL1xuICogQGF1dGhvciBwaGlsb2diIC8gaHR0cDovL2Jsb2cudGhlaml0Lm9yZy9cbiAqIEBhdXRob3IgbWlrYWVsIGVtdGluZ2VyIC8gaHR0cDovL2dvbW8uc2UvXG4gKiBAYXV0aG9yIGVncmFldGhlciAvIGh0dHA6Ly9lZ3JhZXRoZXIuY29tL1xuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKi9cblxuZnVuY3Rpb24gVmVjdG9yNCggeCwgeSwgeiwgdyApIHtcblxuXHR0aGlzLnggPSB4IHx8IDA7XG5cdHRoaXMueSA9IHkgfHwgMDtcblx0dGhpcy56ID0geiB8fCAwO1xuXHR0aGlzLncgPSAoIHcgIT09IHVuZGVmaW5lZCApID8gdyA6IDE7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggVmVjdG9yNC5wcm90b3R5cGUsIHtcblxuXHRpc1ZlY3RvcjQ6IHRydWUsXG5cblx0c2V0OiBmdW5jdGlvbiAoIHgsIHksIHosIHcgKSB7XG5cblx0XHR0aGlzLnggPSB4O1xuXHRcdHRoaXMueSA9IHk7XG5cdFx0dGhpcy56ID0gejtcblx0XHR0aGlzLncgPSB3O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRTY2FsYXI6IGZ1bmN0aW9uICggc2NhbGFyICkge1xuXG5cdFx0dGhpcy54ID0gc2NhbGFyO1xuXHRcdHRoaXMueSA9IHNjYWxhcjtcblx0XHR0aGlzLnogPSBzY2FsYXI7XG5cdFx0dGhpcy53ID0gc2NhbGFyO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRYOiBmdW5jdGlvbiAoIHggKSB7XG5cblx0XHR0aGlzLnggPSB4O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRZOiBmdW5jdGlvbiAoIHkgKSB7XG5cblx0XHR0aGlzLnkgPSB5O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRaOiBmdW5jdGlvbiAoIHogKSB7XG5cblx0XHR0aGlzLnogPSB6O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRXOiBmdW5jdGlvbiAoIHcgKSB7XG5cblx0XHR0aGlzLncgPSB3O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRDb21wb25lbnQ6IGZ1bmN0aW9uICggaW5kZXgsIHZhbHVlICkge1xuXG5cdFx0c3dpdGNoICggaW5kZXggKSB7XG5cblx0XHRcdGNhc2UgMDogdGhpcy54ID0gdmFsdWU7IGJyZWFrO1xuXHRcdFx0Y2FzZSAxOiB0aGlzLnkgPSB2YWx1ZTsgYnJlYWs7XG5cdFx0XHRjYXNlIDI6IHRoaXMueiA9IHZhbHVlOyBicmVhaztcblx0XHRcdGNhc2UgMzogdGhpcy53ID0gdmFsdWU7IGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDogdGhyb3cgbmV3IEVycm9yKCAnaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAnICsgaW5kZXggKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Z2V0Q29tcG9uZW50OiBmdW5jdGlvbiAoIGluZGV4ICkge1xuXG5cdFx0c3dpdGNoICggaW5kZXggKSB7XG5cblx0XHRcdGNhc2UgMDogcmV0dXJuIHRoaXMueDtcblx0XHRcdGNhc2UgMTogcmV0dXJuIHRoaXMueTtcblx0XHRcdGNhc2UgMjogcmV0dXJuIHRoaXMuejtcblx0XHRcdGNhc2UgMzogcmV0dXJuIHRoaXMudztcblx0XHRcdGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvciggJ2luZGV4IGlzIG91dCBvZiByYW5nZTogJyArIGluZGV4ICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCB0aGlzLngsIHRoaXMueSwgdGhpcy56LCB0aGlzLncgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHRoaXMueCA9IHYueDtcblx0XHR0aGlzLnkgPSB2Lnk7XG5cdFx0dGhpcy56ID0gdi56O1xuXHRcdHRoaXMudyA9ICggdi53ICE9PSB1bmRlZmluZWQgKSA/IHYudyA6IDE7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFkZDogZnVuY3Rpb24gKCB2LCB3ICkge1xuXG5cdFx0aWYgKCB3ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjQ6IC5hZGQoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5hZGRWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5hZGRWZWN0b3JzKCB2LCB3ICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLnggKz0gdi54O1xuXHRcdHRoaXMueSArPSB2Lnk7XG5cdFx0dGhpcy56ICs9IHYuejtcblx0XHR0aGlzLncgKz0gdi53O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRhZGRTY2FsYXI6IGZ1bmN0aW9uICggcyApIHtcblxuXHRcdHRoaXMueCArPSBzO1xuXHRcdHRoaXMueSArPSBzO1xuXHRcdHRoaXMueiArPSBzO1xuXHRcdHRoaXMudyArPSBzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRhZGRWZWN0b3JzOiBmdW5jdGlvbiAoIGEsIGIgKSB7XG5cblx0XHR0aGlzLnggPSBhLnggKyBiLng7XG5cdFx0dGhpcy55ID0gYS55ICsgYi55O1xuXHRcdHRoaXMueiA9IGEueiArIGIuejtcblx0XHR0aGlzLncgPSBhLncgKyBiLnc7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFkZFNjYWxlZFZlY3RvcjogZnVuY3Rpb24gKCB2LCBzICkge1xuXG5cdFx0dGhpcy54ICs9IHYueCAqIHM7XG5cdFx0dGhpcy55ICs9IHYueSAqIHM7XG5cdFx0dGhpcy56ICs9IHYueiAqIHM7XG5cdFx0dGhpcy53ICs9IHYudyAqIHM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHN1YjogZnVuY3Rpb24gKCB2LCB3ICkge1xuXG5cdFx0aWYgKCB3ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjQ6IC5zdWIoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5zdWJWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5zdWJWZWN0b3JzKCB2LCB3ICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLnggLT0gdi54O1xuXHRcdHRoaXMueSAtPSB2Lnk7XG5cdFx0dGhpcy56IC09IHYuejtcblx0XHR0aGlzLncgLT0gdi53O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzdWJTY2FsYXI6IGZ1bmN0aW9uICggcyApIHtcblxuXHRcdHRoaXMueCAtPSBzO1xuXHRcdHRoaXMueSAtPSBzO1xuXHRcdHRoaXMueiAtPSBzO1xuXHRcdHRoaXMudyAtPSBzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzdWJWZWN0b3JzOiBmdW5jdGlvbiAoIGEsIGIgKSB7XG5cblx0XHR0aGlzLnggPSBhLnggLSBiLng7XG5cdFx0dGhpcy55ID0gYS55IC0gYi55O1xuXHRcdHRoaXMueiA9IGEueiAtIGIuejtcblx0XHR0aGlzLncgPSBhLncgLSBiLnc7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG11bHRpcGx5U2NhbGFyOiBmdW5jdGlvbiAoIHNjYWxhciApIHtcblxuXHRcdHRoaXMueCAqPSBzY2FsYXI7XG5cdFx0dGhpcy55ICo9IHNjYWxhcjtcblx0XHR0aGlzLnogKj0gc2NhbGFyO1xuXHRcdHRoaXMudyAqPSBzY2FsYXI7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFwcGx5TWF0cml4NDogZnVuY3Rpb24gKCBtICkge1xuXG5cdFx0dmFyIHggPSB0aGlzLngsIHkgPSB0aGlzLnksIHogPSB0aGlzLnosIHcgPSB0aGlzLnc7XG5cdFx0dmFyIGUgPSBtLmVsZW1lbnRzO1xuXG5cdFx0dGhpcy54ID0gZVsgMCBdICogeCArIGVbIDQgXSAqIHkgKyBlWyA4IF0gKiB6ICsgZVsgMTIgXSAqIHc7XG5cdFx0dGhpcy55ID0gZVsgMSBdICogeCArIGVbIDUgXSAqIHkgKyBlWyA5IF0gKiB6ICsgZVsgMTMgXSAqIHc7XG5cdFx0dGhpcy56ID0gZVsgMiBdICogeCArIGVbIDYgXSAqIHkgKyBlWyAxMCBdICogeiArIGVbIDE0IF0gKiB3O1xuXHRcdHRoaXMudyA9IGVbIDMgXSAqIHggKyBlWyA3IF0gKiB5ICsgZVsgMTEgXSAqIHogKyBlWyAxNSBdICogdztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZGl2aWRlU2NhbGFyOiBmdW5jdGlvbiAoIHNjYWxhciApIHtcblxuXHRcdHJldHVybiB0aGlzLm11bHRpcGx5U2NhbGFyKCAxIC8gc2NhbGFyICk7XG5cblx0fSxcblxuXHRzZXRBeGlzQW5nbGVGcm9tUXVhdGVybmlvbjogZnVuY3Rpb24gKCBxICkge1xuXG5cdFx0Ly8gaHR0cDovL3d3dy5ldWNsaWRlYW5zcGFjZS5jb20vbWF0aHMvZ2VvbWV0cnkvcm90YXRpb25zL2NvbnZlcnNpb25zL3F1YXRlcm5pb25Ub0FuZ2xlL2luZGV4Lmh0bVxuXG5cdFx0Ly8gcSBpcyBhc3N1bWVkIHRvIGJlIG5vcm1hbGl6ZWRcblxuXHRcdHRoaXMudyA9IDIgKiBNYXRoLmFjb3MoIHEudyApO1xuXG5cdFx0dmFyIHMgPSBNYXRoLnNxcnQoIDEgLSBxLncgKiBxLncgKTtcblxuXHRcdGlmICggcyA8IDAuMDAwMSApIHtcblxuXHRcdFx0IHRoaXMueCA9IDE7XG5cdFx0XHQgdGhpcy55ID0gMDtcblx0XHRcdCB0aGlzLnogPSAwO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0IHRoaXMueCA9IHEueCAvIHM7XG5cdFx0XHQgdGhpcy55ID0gcS55IC8gcztcblx0XHRcdCB0aGlzLnogPSBxLnogLyBzO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRBeGlzQW5nbGVGcm9tUm90YXRpb25NYXRyaXg6IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdC8vIGh0dHA6Ly93d3cuZXVjbGlkZWFuc3BhY2UuY29tL21hdGhzL2dlb21ldHJ5L3JvdGF0aW9ucy9jb252ZXJzaW9ucy9tYXRyaXhUb0FuZ2xlL2luZGV4Lmh0bVxuXG5cdFx0Ly8gYXNzdW1lcyB0aGUgdXBwZXIgM3gzIG9mIG0gaXMgYSBwdXJlIHJvdGF0aW9uIG1hdHJpeCAoaS5lLCB1bnNjYWxlZClcblxuXHRcdHZhciBhbmdsZSwgeCwgeSwgeixcdFx0Ly8gdmFyaWFibGVzIGZvciByZXN1bHRcblx0XHRcdGVwc2lsb24gPSAwLjAxLFx0XHQvLyBtYXJnaW4gdG8gYWxsb3cgZm9yIHJvdW5kaW5nIGVycm9yc1xuXHRcdFx0ZXBzaWxvbjIgPSAwLjEsXHRcdC8vIG1hcmdpbiB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIDAgYW5kIDE4MCBkZWdyZWVzXG5cblx0XHRcdHRlID0gbS5lbGVtZW50cyxcblxuXHRcdFx0bTExID0gdGVbIDAgXSwgbTEyID0gdGVbIDQgXSwgbTEzID0gdGVbIDggXSxcblx0XHRcdG0yMSA9IHRlWyAxIF0sIG0yMiA9IHRlWyA1IF0sIG0yMyA9IHRlWyA5IF0sXG5cdFx0XHRtMzEgPSB0ZVsgMiBdLCBtMzIgPSB0ZVsgNiBdLCBtMzMgPSB0ZVsgMTAgXTtcblxuXHRcdGlmICggKCBNYXRoLmFicyggbTEyIC0gbTIxICkgPCBlcHNpbG9uICkgJiZcblx0XHQgICAgICggTWF0aC5hYnMoIG0xMyAtIG0zMSApIDwgZXBzaWxvbiApICYmXG5cdFx0ICAgICAoIE1hdGguYWJzKCBtMjMgLSBtMzIgKSA8IGVwc2lsb24gKSApIHtcblxuXHRcdFx0Ly8gc2luZ3VsYXJpdHkgZm91bmRcblx0XHRcdC8vIGZpcnN0IGNoZWNrIGZvciBpZGVudGl0eSBtYXRyaXggd2hpY2ggbXVzdCBoYXZlICsxIGZvciBhbGwgdGVybXNcblx0XHRcdC8vIGluIGxlYWRpbmcgZGlhZ29uYWwgYW5kIHplcm8gaW4gb3RoZXIgdGVybXNcblxuXHRcdFx0aWYgKCAoIE1hdGguYWJzKCBtMTIgKyBtMjEgKSA8IGVwc2lsb24yICkgJiZcblx0XHRcdCAgICAgKCBNYXRoLmFicyggbTEzICsgbTMxICkgPCBlcHNpbG9uMiApICYmXG5cdFx0XHQgICAgICggTWF0aC5hYnMoIG0yMyArIG0zMiApIDwgZXBzaWxvbjIgKSAmJlxuXHRcdFx0ICAgICAoIE1hdGguYWJzKCBtMTEgKyBtMjIgKyBtMzMgLSAzICkgPCBlcHNpbG9uMiApICkge1xuXG5cdFx0XHRcdC8vIHRoaXMgc2luZ3VsYXJpdHkgaXMgaWRlbnRpdHkgbWF0cml4IHNvIGFuZ2xlID0gMFxuXG5cdFx0XHRcdHRoaXMuc2V0KCAxLCAwLCAwLCAwICk7XG5cblx0XHRcdFx0cmV0dXJuIHRoaXM7IC8vIHplcm8gYW5nbGUsIGFyYml0cmFyeSBheGlzXG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gb3RoZXJ3aXNlIHRoaXMgc2luZ3VsYXJpdHkgaXMgYW5nbGUgPSAxODBcblxuXHRcdFx0YW5nbGUgPSBNYXRoLlBJO1xuXG5cdFx0XHR2YXIgeHggPSAoIG0xMSArIDEgKSAvIDI7XG5cdFx0XHR2YXIgeXkgPSAoIG0yMiArIDEgKSAvIDI7XG5cdFx0XHR2YXIgenogPSAoIG0zMyArIDEgKSAvIDI7XG5cdFx0XHR2YXIgeHkgPSAoIG0xMiArIG0yMSApIC8gNDtcblx0XHRcdHZhciB4eiA9ICggbTEzICsgbTMxICkgLyA0O1xuXHRcdFx0dmFyIHl6ID0gKCBtMjMgKyBtMzIgKSAvIDQ7XG5cblx0XHRcdGlmICggKCB4eCA+IHl5ICkgJiYgKCB4eCA+IHp6ICkgKSB7XG5cblx0XHRcdFx0Ly8gbTExIGlzIHRoZSBsYXJnZXN0IGRpYWdvbmFsIHRlcm1cblxuXHRcdFx0XHRpZiAoIHh4IDwgZXBzaWxvbiApIHtcblxuXHRcdFx0XHRcdHggPSAwO1xuXHRcdFx0XHRcdHkgPSAwLjcwNzEwNjc4MTtcblx0XHRcdFx0XHR6ID0gMC43MDcxMDY3ODE7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHggPSBNYXRoLnNxcnQoIHh4ICk7XG5cdFx0XHRcdFx0eSA9IHh5IC8geDtcblx0XHRcdFx0XHR6ID0geHogLyB4O1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIGlmICggeXkgPiB6eiApIHtcblxuXHRcdFx0XHQvLyBtMjIgaXMgdGhlIGxhcmdlc3QgZGlhZ29uYWwgdGVybVxuXG5cdFx0XHRcdGlmICggeXkgPCBlcHNpbG9uICkge1xuXG5cdFx0XHRcdFx0eCA9IDAuNzA3MTA2NzgxO1xuXHRcdFx0XHRcdHkgPSAwO1xuXHRcdFx0XHRcdHogPSAwLjcwNzEwNjc4MTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0eSA9IE1hdGguc3FydCggeXkgKTtcblx0XHRcdFx0XHR4ID0geHkgLyB5O1xuXHRcdFx0XHRcdHogPSB5eiAvIHk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdC8vIG0zMyBpcyB0aGUgbGFyZ2VzdCBkaWFnb25hbCB0ZXJtIHNvIGJhc2UgcmVzdWx0IG9uIHRoaXNcblxuXHRcdFx0XHRpZiAoIHp6IDwgZXBzaWxvbiApIHtcblxuXHRcdFx0XHRcdHggPSAwLjcwNzEwNjc4MTtcblx0XHRcdFx0XHR5ID0gMC43MDcxMDY3ODE7XG5cdFx0XHRcdFx0eiA9IDA7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHogPSBNYXRoLnNxcnQoIHp6ICk7XG5cdFx0XHRcdFx0eCA9IHh6IC8gejtcblx0XHRcdFx0XHR5ID0geXogLyB6O1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLnNldCggeCwgeSwgeiwgYW5nbGUgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7IC8vIHJldHVybiAxODAgZGVnIHJvdGF0aW9uXG5cblx0XHR9XG5cblx0XHQvLyBhcyB3ZSBoYXZlIHJlYWNoZWQgaGVyZSB0aGVyZSBhcmUgbm8gc2luZ3VsYXJpdGllcyBzbyB3ZSBjYW4gaGFuZGxlIG5vcm1hbGx5XG5cblx0XHR2YXIgcyA9IE1hdGguc3FydCggKCBtMzIgLSBtMjMgKSAqICggbTMyIC0gbTIzICkgK1xuXHRcdCAgICAgICAgICAgICAgICAgICAoIG0xMyAtIG0zMSApICogKCBtMTMgLSBtMzEgKSArXG5cdFx0ICAgICAgICAgICAgICAgICAgICggbTIxIC0gbTEyICkgKiAoIG0yMSAtIG0xMiApICk7IC8vIHVzZWQgdG8gbm9ybWFsaXplXG5cblx0XHRpZiAoIE1hdGguYWJzKCBzICkgPCAwLjAwMSApIHMgPSAxO1xuXG5cdFx0Ly8gcHJldmVudCBkaXZpZGUgYnkgemVybywgc2hvdWxkIG5vdCBoYXBwZW4gaWYgbWF0cml4IGlzIG9ydGhvZ29uYWwgYW5kIHNob3VsZCBiZVxuXHRcdC8vIGNhdWdodCBieSBzaW5ndWxhcml0eSB0ZXN0IGFib3ZlLCBidXQgSSd2ZSBsZWZ0IGl0IGluIGp1c3QgaW4gY2FzZVxuXG5cdFx0dGhpcy54ID0gKCBtMzIgLSBtMjMgKSAvIHM7XG5cdFx0dGhpcy55ID0gKCBtMTMgLSBtMzEgKSAvIHM7XG5cdFx0dGhpcy56ID0gKCBtMjEgLSBtMTIgKSAvIHM7XG5cdFx0dGhpcy53ID0gTWF0aC5hY29zKCAoIG0xMSArIG0yMiArIG0zMyAtIDEgKSAvIDIgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bWluOiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHR0aGlzLnggPSBNYXRoLm1pbiggdGhpcy54LCB2LnggKTtcblx0XHR0aGlzLnkgPSBNYXRoLm1pbiggdGhpcy55LCB2LnkgKTtcblx0XHR0aGlzLnogPSBNYXRoLm1pbiggdGhpcy56LCB2LnogKTtcblx0XHR0aGlzLncgPSBNYXRoLm1pbiggdGhpcy53LCB2LncgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bWF4OiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHR0aGlzLnggPSBNYXRoLm1heCggdGhpcy54LCB2LnggKTtcblx0XHR0aGlzLnkgPSBNYXRoLm1heCggdGhpcy55LCB2LnkgKTtcblx0XHR0aGlzLnogPSBNYXRoLm1heCggdGhpcy56LCB2LnogKTtcblx0XHR0aGlzLncgPSBNYXRoLm1heCggdGhpcy53LCB2LncgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xhbXA6IGZ1bmN0aW9uICggbWluLCBtYXggKSB7XG5cblx0XHQvLyBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgbWluIDwgbWF4LCBpZiB0aGlzIGFzc3VtcHRpb24gaXNuJ3QgdHJ1ZSBpdCB3aWxsIG5vdCBvcGVyYXRlIGNvcnJlY3RseVxuXG5cdFx0dGhpcy54ID0gTWF0aC5tYXgoIG1pbi54LCBNYXRoLm1pbiggbWF4LngsIHRoaXMueCApICk7XG5cdFx0dGhpcy55ID0gTWF0aC5tYXgoIG1pbi55LCBNYXRoLm1pbiggbWF4LnksIHRoaXMueSApICk7XG5cdFx0dGhpcy56ID0gTWF0aC5tYXgoIG1pbi56LCBNYXRoLm1pbiggbWF4LnosIHRoaXMueiApICk7XG5cdFx0dGhpcy53ID0gTWF0aC5tYXgoIG1pbi53LCBNYXRoLm1pbiggbWF4LncsIHRoaXMudyApICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNsYW1wU2NhbGFyOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgbWluID0gbmV3IFZlY3RvcjQoKTtcblx0XHR2YXIgbWF4ID0gbmV3IFZlY3RvcjQoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBjbGFtcFNjYWxhciggbWluVmFsLCBtYXhWYWwgKSB7XG5cblx0XHRcdG1pbi5zZXQoIG1pblZhbCwgbWluVmFsLCBtaW5WYWwsIG1pblZhbCApO1xuXHRcdFx0bWF4LnNldCggbWF4VmFsLCBtYXhWYWwsIG1heFZhbCwgbWF4VmFsICk7XG5cblx0XHRcdHJldHVybiB0aGlzLmNsYW1wKCBtaW4sIG1heCApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0Zmxvb3I6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMueCA9IE1hdGguZmxvb3IoIHRoaXMueCApO1xuXHRcdHRoaXMueSA9IE1hdGguZmxvb3IoIHRoaXMueSApO1xuXHRcdHRoaXMueiA9IE1hdGguZmxvb3IoIHRoaXMueiApO1xuXHRcdHRoaXMudyA9IE1hdGguZmxvb3IoIHRoaXMudyApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjZWlsOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLnggPSBNYXRoLmNlaWwoIHRoaXMueCApO1xuXHRcdHRoaXMueSA9IE1hdGguY2VpbCggdGhpcy55ICk7XG5cdFx0dGhpcy56ID0gTWF0aC5jZWlsKCB0aGlzLnogKTtcblx0XHR0aGlzLncgPSBNYXRoLmNlaWwoIHRoaXMudyApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRyb3VuZDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy54ID0gTWF0aC5yb3VuZCggdGhpcy54ICk7XG5cdFx0dGhpcy55ID0gTWF0aC5yb3VuZCggdGhpcy55ICk7XG5cdFx0dGhpcy56ID0gTWF0aC5yb3VuZCggdGhpcy56ICk7XG5cdFx0dGhpcy53ID0gTWF0aC5yb3VuZCggdGhpcy53ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHJvdW5kVG9aZXJvOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLnggPSAoIHRoaXMueCA8IDAgKSA/IE1hdGguY2VpbCggdGhpcy54ICkgOiBNYXRoLmZsb29yKCB0aGlzLnggKTtcblx0XHR0aGlzLnkgPSAoIHRoaXMueSA8IDAgKSA/IE1hdGguY2VpbCggdGhpcy55ICkgOiBNYXRoLmZsb29yKCB0aGlzLnkgKTtcblx0XHR0aGlzLnogPSAoIHRoaXMueiA8IDAgKSA/IE1hdGguY2VpbCggdGhpcy56ICkgOiBNYXRoLmZsb29yKCB0aGlzLnogKTtcblx0XHR0aGlzLncgPSAoIHRoaXMudyA8IDAgKSA/IE1hdGguY2VpbCggdGhpcy53ICkgOiBNYXRoLmZsb29yKCB0aGlzLncgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bmVnYXRlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLnggPSAtIHRoaXMueDtcblx0XHR0aGlzLnkgPSAtIHRoaXMueTtcblx0XHR0aGlzLnogPSAtIHRoaXMuejtcblx0XHR0aGlzLncgPSAtIHRoaXMudztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZG90OiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy54ICogdi54ICsgdGhpcy55ICogdi55ICsgdGhpcy56ICogdi56ICsgdGhpcy53ICogdi53O1xuXG5cdH0sXG5cblx0bGVuZ3RoU3E6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLnggKiB0aGlzLnggKyB0aGlzLnkgKiB0aGlzLnkgKyB0aGlzLnogKiB0aGlzLnogKyB0aGlzLncgKiB0aGlzLnc7XG5cblx0fSxcblxuXHRsZW5ndGg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBNYXRoLnNxcnQoIHRoaXMueCAqIHRoaXMueCArIHRoaXMueSAqIHRoaXMueSArIHRoaXMueiAqIHRoaXMueiArIHRoaXMudyAqIHRoaXMudyApO1xuXG5cdH0sXG5cblx0bGVuZ3RoTWFuaGF0dGFuOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gTWF0aC5hYnMoIHRoaXMueCApICsgTWF0aC5hYnMoIHRoaXMueSApICsgTWF0aC5hYnMoIHRoaXMueiApICsgTWF0aC5hYnMoIHRoaXMudyApO1xuXG5cdH0sXG5cblx0bm9ybWFsaXplOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIoIHRoaXMubGVuZ3RoKCkgKTtcblxuXHR9LFxuXG5cdHNldExlbmd0aDogZnVuY3Rpb24gKCBsZW5ndGggKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5tdWx0aXBseVNjYWxhciggbGVuZ3RoIC8gdGhpcy5sZW5ndGgoKSApO1xuXG5cdH0sXG5cblx0bGVycDogZnVuY3Rpb24gKCB2LCBhbHBoYSApIHtcblxuXHRcdHRoaXMueCArPSAoIHYueCAtIHRoaXMueCApICogYWxwaGE7XG5cdFx0dGhpcy55ICs9ICggdi55IC0gdGhpcy55ICkgKiBhbHBoYTtcblx0XHR0aGlzLnogKz0gKCB2LnogLSB0aGlzLnogKSAqIGFscGhhO1xuXHRcdHRoaXMudyArPSAoIHYudyAtIHRoaXMudyApICogYWxwaGE7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGxlcnBWZWN0b3JzOiBmdW5jdGlvbiAoIHYxLCB2MiwgYWxwaGEgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5zdWJWZWN0b3JzKCB2MiwgdjEgKS5tdWx0aXBseVNjYWxhciggYWxwaGEgKS5hZGQoIHYxICk7XG5cblx0fSxcblxuXHRlcXVhbHM6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHJldHVybiAoICggdi54ID09PSB0aGlzLnggKSAmJiAoIHYueSA9PT0gdGhpcy55ICkgJiYgKCB2LnogPT09IHRoaXMueiApICYmICggdi53ID09PSB0aGlzLncgKSApO1xuXG5cdH0sXG5cblx0ZnJvbUFycmF5OiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0gMDtcblxuXHRcdHRoaXMueCA9IGFycmF5WyBvZmZzZXQgXTtcblx0XHR0aGlzLnkgPSBhcnJheVsgb2Zmc2V0ICsgMSBdO1xuXHRcdHRoaXMueiA9IGFycmF5WyBvZmZzZXQgKyAyIF07XG5cdFx0dGhpcy53ID0gYXJyYXlbIG9mZnNldCArIDMgXTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dG9BcnJheTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0aWYgKCBhcnJheSA9PT0gdW5kZWZpbmVkICkgYXJyYXkgPSBbXTtcblx0XHRpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0gMDtcblxuXHRcdGFycmF5WyBvZmZzZXQgXSA9IHRoaXMueDtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMSBdID0gdGhpcy55O1xuXHRcdGFycmF5WyBvZmZzZXQgKyAyIF0gPSB0aGlzLno7XG5cdFx0YXJyYXlbIG9mZnNldCArIDMgXSA9IHRoaXMudztcblxuXHRcdHJldHVybiBhcnJheTtcblxuXHR9LFxuXG5cdGZyb21CdWZmZXJBdHRyaWJ1dGU6IGZ1bmN0aW9uICggYXR0cmlidXRlLCBpbmRleCwgb2Zmc2V0ICkge1xuXG5cdFx0aWYgKCBvZmZzZXQgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yNDogb2Zmc2V0IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSAuZnJvbUJ1ZmZlckF0dHJpYnV0ZSgpLicgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMueCA9IGF0dHJpYnV0ZS5nZXRYKCBpbmRleCApO1xuXHRcdHRoaXMueSA9IGF0dHJpYnV0ZS5nZXRZKCBpbmRleCApO1xuXHRcdHRoaXMueiA9IGF0dHJpYnV0ZS5nZXRaKCBpbmRleCApO1xuXHRcdHRoaXMudyA9IGF0dHJpYnV0ZS5nZXRXKCBpbmRleCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBzemltZWsgLyBodHRwczovL2dpdGh1Yi5jb20vc3ppbWVrL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3IgTWFyaXVzIEtpbnRlbCAvIGh0dHBzOi8vZ2l0aHViLmNvbS9raW50ZWxcbiAqL1xuXG4vKlxuIEluIG9wdGlvbnMsIHdlIGNhbiBzcGVjaWZ5OlxuICogVGV4dHVyZSBwYXJhbWV0ZXJzIGZvciBhbiBhdXRvLWdlbmVyYXRlZCB0YXJnZXQgdGV4dHVyZVxuICogZGVwdGhCdWZmZXIvc3RlbmNpbEJ1ZmZlcjogQm9vbGVhbnMgdG8gaW5kaWNhdGUgaWYgd2Ugc2hvdWxkIGdlbmVyYXRlIHRoZXNlIGJ1ZmZlcnNcbiovXG5mdW5jdGlvbiBXZWJHTFJlbmRlclRhcmdldCggd2lkdGgsIGhlaWdodCwgb3B0aW9ucyApIHtcblxuXHR0aGlzLnV1aWQgPSBfTWF0aC5nZW5lcmF0ZVVVSUQoKTtcblxuXHR0aGlzLndpZHRoID0gd2lkdGg7XG5cdHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuXG5cdHRoaXMuc2Npc3NvciA9IG5ldyBWZWN0b3I0KCAwLCAwLCB3aWR0aCwgaGVpZ2h0ICk7XG5cdHRoaXMuc2Npc3NvclRlc3QgPSBmYWxzZTtcblxuXHR0aGlzLnZpZXdwb3J0ID0gbmV3IFZlY3RvcjQoIDAsIDAsIHdpZHRoLCBoZWlnaHQgKTtcblxuXHRvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuXHRpZiAoIG9wdGlvbnMubWluRmlsdGVyID09PSB1bmRlZmluZWQgKSBvcHRpb25zLm1pbkZpbHRlciA9IExpbmVhckZpbHRlcjtcblxuXHR0aGlzLnRleHR1cmUgPSBuZXcgVGV4dHVyZSggdW5kZWZpbmVkLCB1bmRlZmluZWQsIG9wdGlvbnMud3JhcFMsIG9wdGlvbnMud3JhcFQsIG9wdGlvbnMubWFnRmlsdGVyLCBvcHRpb25zLm1pbkZpbHRlciwgb3B0aW9ucy5mb3JtYXQsIG9wdGlvbnMudHlwZSwgb3B0aW9ucy5hbmlzb3Ryb3B5LCBvcHRpb25zLmVuY29kaW5nICk7XG5cblx0dGhpcy5kZXB0aEJ1ZmZlciA9IG9wdGlvbnMuZGVwdGhCdWZmZXIgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuZGVwdGhCdWZmZXIgOiB0cnVlO1xuXHR0aGlzLnN0ZW5jaWxCdWZmZXIgPSBvcHRpb25zLnN0ZW5jaWxCdWZmZXIgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuc3RlbmNpbEJ1ZmZlciA6IHRydWU7XG5cdHRoaXMuZGVwdGhUZXh0dXJlID0gb3B0aW9ucy5kZXB0aFRleHR1cmUgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuZGVwdGhUZXh0dXJlIDogbnVsbDtcblxufVxuXG5PYmplY3QuYXNzaWduKCBXZWJHTFJlbmRlclRhcmdldC5wcm90b3R5cGUsIEV2ZW50RGlzcGF0Y2hlci5wcm90b3R5cGUsIHtcblxuXHRpc1dlYkdMUmVuZGVyVGFyZ2V0OiB0cnVlLFxuXG5cdHNldFNpemU6IGZ1bmN0aW9uICggd2lkdGgsIGhlaWdodCApIHtcblxuXHRcdGlmICggdGhpcy53aWR0aCAhPT0gd2lkdGggfHwgdGhpcy5oZWlnaHQgIT09IGhlaWdodCApIHtcblxuXHRcdFx0dGhpcy53aWR0aCA9IHdpZHRoO1xuXHRcdFx0dGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG5cblx0XHRcdHRoaXMuZGlzcG9zZSgpO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy52aWV3cG9ydC5zZXQoIDAsIDAsIHdpZHRoLCBoZWlnaHQgKTtcblx0XHR0aGlzLnNjaXNzb3Iuc2V0KCAwLCAwLCB3aWR0aCwgaGVpZ2h0ICk7XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHR0aGlzLndpZHRoID0gc291cmNlLndpZHRoO1xuXHRcdHRoaXMuaGVpZ2h0ID0gc291cmNlLmhlaWdodDtcblxuXHRcdHRoaXMudmlld3BvcnQuY29weSggc291cmNlLnZpZXdwb3J0ICk7XG5cblx0XHR0aGlzLnRleHR1cmUgPSBzb3VyY2UudGV4dHVyZS5jbG9uZSgpO1xuXG5cdFx0dGhpcy5kZXB0aEJ1ZmZlciA9IHNvdXJjZS5kZXB0aEJ1ZmZlcjtcblx0XHR0aGlzLnN0ZW5jaWxCdWZmZXIgPSBzb3VyY2Uuc3RlbmNpbEJ1ZmZlcjtcblx0XHR0aGlzLmRlcHRoVGV4dHVyZSA9IHNvdXJjZS5kZXB0aFRleHR1cmU7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGRpc3Bvc2U6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuZGlzcGF0Y2hFdmVudCggeyB0eXBlOiAnZGlzcG9zZScgfSApO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb21cbiAqL1xuXG5mdW5jdGlvbiBXZWJHTFJlbmRlclRhcmdldEN1YmUoIHdpZHRoLCBoZWlnaHQsIG9wdGlvbnMgKSB7XG5cblx0V2ViR0xSZW5kZXJUYXJnZXQuY2FsbCggdGhpcywgd2lkdGgsIGhlaWdodCwgb3B0aW9ucyApO1xuXG5cdHRoaXMuYWN0aXZlQ3ViZUZhY2UgPSAwOyAvLyBQWCAwLCBOWCAxLCBQWSAyLCBOWSAzLCBQWiA0LCBOWiA1XG5cdHRoaXMuYWN0aXZlTWlwTWFwTGV2ZWwgPSAwO1xuXG59XG5cbldlYkdMUmVuZGVyVGFyZ2V0Q3ViZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBXZWJHTFJlbmRlclRhcmdldC5wcm90b3R5cGUgKTtcbldlYkdMUmVuZGVyVGFyZ2V0Q3ViZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBXZWJHTFJlbmRlclRhcmdldEN1YmU7XG5cbldlYkdMUmVuZGVyVGFyZ2V0Q3ViZS5wcm90b3R5cGUuaXNXZWJHTFJlbmRlclRhcmdldEN1YmUgPSB0cnVlO1xuXG4vKipcbiAqIEBhdXRob3IgbWlrYWVsIGVtdGluZ2VyIC8gaHR0cDovL2dvbW8uc2UvXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvXG4gKi9cblxuZnVuY3Rpb24gUXVhdGVybmlvbiggeCwgeSwgeiwgdyApIHtcblxuXHR0aGlzLl94ID0geCB8fCAwO1xuXHR0aGlzLl95ID0geSB8fCAwO1xuXHR0aGlzLl96ID0geiB8fCAwO1xuXHR0aGlzLl93ID0gKCB3ICE9PSB1bmRlZmluZWQgKSA/IHcgOiAxO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIFF1YXRlcm5pb24sIHtcblxuXHRzbGVycDogZnVuY3Rpb24gKCBxYSwgcWIsIHFtLCB0ICkge1xuXG5cdFx0cmV0dXJuIHFtLmNvcHkoIHFhICkuc2xlcnAoIHFiLCB0ICk7XG5cblx0fSxcblxuXHRzbGVycEZsYXQ6IGZ1bmN0aW9uICggZHN0LCBkc3RPZmZzZXQsIHNyYzAsIHNyY09mZnNldDAsIHNyYzEsIHNyY09mZnNldDEsIHQgKSB7XG5cblx0XHQvLyBmdXp6LWZyZWUsIGFycmF5LWJhc2VkIFF1YXRlcm5pb24gU0xFUlAgb3BlcmF0aW9uXG5cblx0XHR2YXIgeDAgPSBzcmMwWyBzcmNPZmZzZXQwICsgMCBdLFxuXHRcdFx0eTAgPSBzcmMwWyBzcmNPZmZzZXQwICsgMSBdLFxuXHRcdFx0ejAgPSBzcmMwWyBzcmNPZmZzZXQwICsgMiBdLFxuXHRcdFx0dzAgPSBzcmMwWyBzcmNPZmZzZXQwICsgMyBdLFxuXG5cdFx0XHR4MSA9IHNyYzFbIHNyY09mZnNldDEgKyAwIF0sXG5cdFx0XHR5MSA9IHNyYzFbIHNyY09mZnNldDEgKyAxIF0sXG5cdFx0XHR6MSA9IHNyYzFbIHNyY09mZnNldDEgKyAyIF0sXG5cdFx0XHR3MSA9IHNyYzFbIHNyY09mZnNldDEgKyAzIF07XG5cblx0XHRpZiAoIHcwICE9PSB3MSB8fCB4MCAhPT0geDEgfHwgeTAgIT09IHkxIHx8IHowICE9PSB6MSApIHtcblxuXHRcdFx0dmFyIHMgPSAxIC0gdCxcblxuXHRcdFx0XHRjb3MgPSB4MCAqIHgxICsgeTAgKiB5MSArIHowICogejEgKyB3MCAqIHcxLFxuXG5cdFx0XHRcdGRpciA9ICggY29zID49IDAgPyAxIDogLSAxICksXG5cdFx0XHRcdHNxclNpbiA9IDEgLSBjb3MgKiBjb3M7XG5cblx0XHRcdC8vIFNraXAgdGhlIFNsZXJwIGZvciB0aW55IHN0ZXBzIHRvIGF2b2lkIG51bWVyaWMgcHJvYmxlbXM6XG5cdFx0XHRpZiAoIHNxclNpbiA+IE51bWJlci5FUFNJTE9OICkge1xuXG5cdFx0XHRcdHZhciBzaW4gPSBNYXRoLnNxcnQoIHNxclNpbiApLFxuXHRcdFx0XHRcdGxlbiA9IE1hdGguYXRhbjIoIHNpbiwgY29zICogZGlyICk7XG5cblx0XHRcdFx0cyA9IE1hdGguc2luKCBzICogbGVuICkgLyBzaW47XG5cdFx0XHRcdHQgPSBNYXRoLnNpbiggdCAqIGxlbiApIC8gc2luO1xuXG5cdFx0XHR9XG5cblx0XHRcdHZhciB0RGlyID0gdCAqIGRpcjtcblxuXHRcdFx0eDAgPSB4MCAqIHMgKyB4MSAqIHREaXI7XG5cdFx0XHR5MCA9IHkwICogcyArIHkxICogdERpcjtcblx0XHRcdHowID0gejAgKiBzICsgejEgKiB0RGlyO1xuXHRcdFx0dzAgPSB3MCAqIHMgKyB3MSAqIHREaXI7XG5cblx0XHRcdC8vIE5vcm1hbGl6ZSBpbiBjYXNlIHdlIGp1c3QgZGlkIGEgbGVycDpcblx0XHRcdGlmICggcyA9PT0gMSAtIHQgKSB7XG5cblx0XHRcdFx0dmFyIGYgPSAxIC8gTWF0aC5zcXJ0KCB4MCAqIHgwICsgeTAgKiB5MCArIHowICogejAgKyB3MCAqIHcwICk7XG5cblx0XHRcdFx0eDAgKj0gZjtcblx0XHRcdFx0eTAgKj0gZjtcblx0XHRcdFx0ejAgKj0gZjtcblx0XHRcdFx0dzAgKj0gZjtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0ZHN0WyBkc3RPZmZzZXQgXSA9IHgwO1xuXHRcdGRzdFsgZHN0T2Zmc2V0ICsgMSBdID0geTA7XG5cdFx0ZHN0WyBkc3RPZmZzZXQgKyAyIF0gPSB6MDtcblx0XHRkc3RbIGRzdE9mZnNldCArIDMgXSA9IHcwO1xuXG5cdH1cblxufSApO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyggUXVhdGVybmlvbi5wcm90b3R5cGUsIHtcblxuXHR4OiB7XG5cblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMuX3g7XG5cblx0XHR9LFxuXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHR0aGlzLl94ID0gdmFsdWU7XG5cdFx0XHR0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdHk6IHtcblxuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5feTtcblxuXHRcdH0sXG5cblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdHRoaXMuX3kgPSB2YWx1ZTtcblx0XHRcdHRoaXMub25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0ejoge1xuXG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLl96O1xuXG5cdFx0fSxcblxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0dGhpcy5feiA9IHZhbHVlO1xuXHRcdFx0dGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHR9XG5cblx0fSxcblxuXHR3OiB7XG5cblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMuX3c7XG5cblx0XHR9LFxuXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHR0aGlzLl93ID0gdmFsdWU7XG5cdFx0XHR0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdH1cblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmFzc2lnbiggUXVhdGVybmlvbi5wcm90b3R5cGUsIHtcblxuXHRzZXQ6IGZ1bmN0aW9uICggeCwgeSwgeiwgdyApIHtcblxuXHRcdHRoaXMuX3ggPSB4O1xuXHRcdHRoaXMuX3kgPSB5O1xuXHRcdHRoaXMuX3ogPSB6O1xuXHRcdHRoaXMuX3cgPSB3O1xuXG5cdFx0dGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoIHRoaXMuX3gsIHRoaXMuX3ksIHRoaXMuX3osIHRoaXMuX3cgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggcXVhdGVybmlvbiApIHtcblxuXHRcdHRoaXMuX3ggPSBxdWF0ZXJuaW9uLng7XG5cdFx0dGhpcy5feSA9IHF1YXRlcm5pb24ueTtcblx0XHR0aGlzLl96ID0gcXVhdGVybmlvbi56O1xuXHRcdHRoaXMuX3cgPSBxdWF0ZXJuaW9uLnc7XG5cblx0XHR0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbUV1bGVyOiBmdW5jdGlvbiAoIGV1bGVyLCB1cGRhdGUgKSB7XG5cblx0XHRpZiAoICggZXVsZXIgJiYgZXVsZXIuaXNFdWxlciApID09PSBmYWxzZSApIHtcblxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCAnVEhSRUUuUXVhdGVybmlvbjogLnNldEZyb21FdWxlcigpIG5vdyBleHBlY3RzIGFuIEV1bGVyIHJvdGF0aW9uIHJhdGhlciB0aGFuIGEgVmVjdG9yMyBhbmQgb3JkZXIuJyApO1xuXG5cdFx0fVxuXG5cdFx0dmFyIHggPSBldWxlci5feCwgeSA9IGV1bGVyLl95LCB6ID0gZXVsZXIuX3osIG9yZGVyID0gZXVsZXIub3JkZXI7XG5cblx0XHQvLyBodHRwOi8vd3d3Lm1hdGh3b3Jrcy5jb20vbWF0bGFiY2VudHJhbC9maWxlZXhjaGFuZ2UvXG5cdFx0Ly8gXHQyMDY5Ni1mdW5jdGlvbi10by1jb252ZXJ0LWJldHdlZW4tZGNtLWV1bGVyLWFuZ2xlcy1xdWF0ZXJuaW9ucy1hbmQtZXVsZXItdmVjdG9ycy9cblx0XHQvL1x0Y29udGVudC9TcGluQ2FsYy5tXG5cblx0XHR2YXIgY29zID0gTWF0aC5jb3M7XG5cdFx0dmFyIHNpbiA9IE1hdGguc2luO1xuXG5cdFx0dmFyIGMxID0gY29zKCB4IC8gMiApO1xuXHRcdHZhciBjMiA9IGNvcyggeSAvIDIgKTtcblx0XHR2YXIgYzMgPSBjb3MoIHogLyAyICk7XG5cblx0XHR2YXIgczEgPSBzaW4oIHggLyAyICk7XG5cdFx0dmFyIHMyID0gc2luKCB5IC8gMiApO1xuXHRcdHZhciBzMyA9IHNpbiggeiAvIDIgKTtcblxuXHRcdGlmICggb3JkZXIgPT09ICdYWVonICkge1xuXG5cdFx0XHR0aGlzLl94ID0gczEgKiBjMiAqIGMzICsgYzEgKiBzMiAqIHMzO1xuXHRcdFx0dGhpcy5feSA9IGMxICogczIgKiBjMyAtIHMxICogYzIgKiBzMztcblx0XHRcdHRoaXMuX3ogPSBjMSAqIGMyICogczMgKyBzMSAqIHMyICogYzM7XG5cdFx0XHR0aGlzLl93ID0gYzEgKiBjMiAqIGMzIC0gczEgKiBzMiAqIHMzO1xuXG5cdFx0fSBlbHNlIGlmICggb3JkZXIgPT09ICdZWFonICkge1xuXG5cdFx0XHR0aGlzLl94ID0gczEgKiBjMiAqIGMzICsgYzEgKiBzMiAqIHMzO1xuXHRcdFx0dGhpcy5feSA9IGMxICogczIgKiBjMyAtIHMxICogYzIgKiBzMztcblx0XHRcdHRoaXMuX3ogPSBjMSAqIGMyICogczMgLSBzMSAqIHMyICogYzM7XG5cdFx0XHR0aGlzLl93ID0gYzEgKiBjMiAqIGMzICsgczEgKiBzMiAqIHMzO1xuXG5cdFx0fSBlbHNlIGlmICggb3JkZXIgPT09ICdaWFknICkge1xuXG5cdFx0XHR0aGlzLl94ID0gczEgKiBjMiAqIGMzIC0gYzEgKiBzMiAqIHMzO1xuXHRcdFx0dGhpcy5feSA9IGMxICogczIgKiBjMyArIHMxICogYzIgKiBzMztcblx0XHRcdHRoaXMuX3ogPSBjMSAqIGMyICogczMgKyBzMSAqIHMyICogYzM7XG5cdFx0XHR0aGlzLl93ID0gYzEgKiBjMiAqIGMzIC0gczEgKiBzMiAqIHMzO1xuXG5cdFx0fSBlbHNlIGlmICggb3JkZXIgPT09ICdaWVgnICkge1xuXG5cdFx0XHR0aGlzLl94ID0gczEgKiBjMiAqIGMzIC0gYzEgKiBzMiAqIHMzO1xuXHRcdFx0dGhpcy5feSA9IGMxICogczIgKiBjMyArIHMxICogYzIgKiBzMztcblx0XHRcdHRoaXMuX3ogPSBjMSAqIGMyICogczMgLSBzMSAqIHMyICogYzM7XG5cdFx0XHR0aGlzLl93ID0gYzEgKiBjMiAqIGMzICsgczEgKiBzMiAqIHMzO1xuXG5cdFx0fSBlbHNlIGlmICggb3JkZXIgPT09ICdZWlgnICkge1xuXG5cdFx0XHR0aGlzLl94ID0gczEgKiBjMiAqIGMzICsgYzEgKiBzMiAqIHMzO1xuXHRcdFx0dGhpcy5feSA9IGMxICogczIgKiBjMyArIHMxICogYzIgKiBzMztcblx0XHRcdHRoaXMuX3ogPSBjMSAqIGMyICogczMgLSBzMSAqIHMyICogYzM7XG5cdFx0XHR0aGlzLl93ID0gYzEgKiBjMiAqIGMzIC0gczEgKiBzMiAqIHMzO1xuXG5cdFx0fSBlbHNlIGlmICggb3JkZXIgPT09ICdYWlknICkge1xuXG5cdFx0XHR0aGlzLl94ID0gczEgKiBjMiAqIGMzIC0gYzEgKiBzMiAqIHMzO1xuXHRcdFx0dGhpcy5feSA9IGMxICogczIgKiBjMyAtIHMxICogYzIgKiBzMztcblx0XHRcdHRoaXMuX3ogPSBjMSAqIGMyICogczMgKyBzMSAqIHMyICogYzM7XG5cdFx0XHR0aGlzLl93ID0gYzEgKiBjMiAqIGMzICsgczEgKiBzMiAqIHMzO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB1cGRhdGUgIT09IGZhbHNlICkgdGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21BeGlzQW5nbGU6IGZ1bmN0aW9uICggYXhpcywgYW5nbGUgKSB7XG5cblx0XHQvLyBodHRwOi8vd3d3LmV1Y2xpZGVhbnNwYWNlLmNvbS9tYXRocy9nZW9tZXRyeS9yb3RhdGlvbnMvY29udmVyc2lvbnMvYW5nbGVUb1F1YXRlcm5pb24vaW5kZXguaHRtXG5cblx0XHQvLyBhc3N1bWVzIGF4aXMgaXMgbm9ybWFsaXplZFxuXG5cdFx0dmFyIGhhbGZBbmdsZSA9IGFuZ2xlIC8gMiwgcyA9IE1hdGguc2luKCBoYWxmQW5nbGUgKTtcblxuXHRcdHRoaXMuX3ggPSBheGlzLnggKiBzO1xuXHRcdHRoaXMuX3kgPSBheGlzLnkgKiBzO1xuXHRcdHRoaXMuX3ogPSBheGlzLnogKiBzO1xuXHRcdHRoaXMuX3cgPSBNYXRoLmNvcyggaGFsZkFuZ2xlICk7XG5cblx0XHR0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbVJvdGF0aW9uTWF0cml4OiBmdW5jdGlvbiAoIG0gKSB7XG5cblx0XHQvLyBodHRwOi8vd3d3LmV1Y2xpZGVhbnNwYWNlLmNvbS9tYXRocy9nZW9tZXRyeS9yb3RhdGlvbnMvY29udmVyc2lvbnMvbWF0cml4VG9RdWF0ZXJuaW9uL2luZGV4Lmh0bVxuXG5cdFx0Ly8gYXNzdW1lcyB0aGUgdXBwZXIgM3gzIG9mIG0gaXMgYSBwdXJlIHJvdGF0aW9uIG1hdHJpeCAoaS5lLCB1bnNjYWxlZClcblxuXHRcdHZhciB0ZSA9IG0uZWxlbWVudHMsXG5cblx0XHRcdG0xMSA9IHRlWyAwIF0sIG0xMiA9IHRlWyA0IF0sIG0xMyA9IHRlWyA4IF0sXG5cdFx0XHRtMjEgPSB0ZVsgMSBdLCBtMjIgPSB0ZVsgNSBdLCBtMjMgPSB0ZVsgOSBdLFxuXHRcdFx0bTMxID0gdGVbIDIgXSwgbTMyID0gdGVbIDYgXSwgbTMzID0gdGVbIDEwIF0sXG5cblx0XHRcdHRyYWNlID0gbTExICsgbTIyICsgbTMzLFxuXHRcdFx0cztcblxuXHRcdGlmICggdHJhY2UgPiAwICkge1xuXG5cdFx0XHRzID0gMC41IC8gTWF0aC5zcXJ0KCB0cmFjZSArIDEuMCApO1xuXG5cdFx0XHR0aGlzLl93ID0gMC4yNSAvIHM7XG5cdFx0XHR0aGlzLl94ID0gKCBtMzIgLSBtMjMgKSAqIHM7XG5cdFx0XHR0aGlzLl95ID0gKCBtMTMgLSBtMzEgKSAqIHM7XG5cdFx0XHR0aGlzLl96ID0gKCBtMjEgLSBtMTIgKSAqIHM7XG5cblx0XHR9IGVsc2UgaWYgKCBtMTEgPiBtMjIgJiYgbTExID4gbTMzICkge1xuXG5cdFx0XHRzID0gMi4wICogTWF0aC5zcXJ0KCAxLjAgKyBtMTEgLSBtMjIgLSBtMzMgKTtcblxuXHRcdFx0dGhpcy5fdyA9ICggbTMyIC0gbTIzICkgLyBzO1xuXHRcdFx0dGhpcy5feCA9IDAuMjUgKiBzO1xuXHRcdFx0dGhpcy5feSA9ICggbTEyICsgbTIxICkgLyBzO1xuXHRcdFx0dGhpcy5feiA9ICggbTEzICsgbTMxICkgLyBzO1xuXG5cdFx0fSBlbHNlIGlmICggbTIyID4gbTMzICkge1xuXG5cdFx0XHRzID0gMi4wICogTWF0aC5zcXJ0KCAxLjAgKyBtMjIgLSBtMTEgLSBtMzMgKTtcblxuXHRcdFx0dGhpcy5fdyA9ICggbTEzIC0gbTMxICkgLyBzO1xuXHRcdFx0dGhpcy5feCA9ICggbTEyICsgbTIxICkgLyBzO1xuXHRcdFx0dGhpcy5feSA9IDAuMjUgKiBzO1xuXHRcdFx0dGhpcy5feiA9ICggbTIzICsgbTMyICkgLyBzO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0cyA9IDIuMCAqIE1hdGguc3FydCggMS4wICsgbTMzIC0gbTExIC0gbTIyICk7XG5cblx0XHRcdHRoaXMuX3cgPSAoIG0yMSAtIG0xMiApIC8gcztcblx0XHRcdHRoaXMuX3ggPSAoIG0xMyArIG0zMSApIC8gcztcblx0XHRcdHRoaXMuX3kgPSAoIG0yMyArIG0zMiApIC8gcztcblx0XHRcdHRoaXMuX3ogPSAwLjI1ICogcztcblxuXHRcdH1cblxuXHRcdHRoaXMub25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRGcm9tVW5pdFZlY3RvcnM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIGFzc3VtZXMgZGlyZWN0aW9uIHZlY3RvcnMgdkZyb20gYW5kIHZUbyBhcmUgbm9ybWFsaXplZFxuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgcjtcblxuXHRcdHZhciBFUFMgPSAwLjAwMDAwMTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBzZXRGcm9tVW5pdFZlY3RvcnMoIHZGcm9tLCB2VG8gKSB7XG5cblx0XHRcdGlmICggdjEgPT09IHVuZGVmaW5lZCApIHYxID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdFx0ciA9IHZGcm9tLmRvdCggdlRvICkgKyAxO1xuXG5cdFx0XHRpZiAoIHIgPCBFUFMgKSB7XG5cblx0XHRcdFx0ciA9IDA7XG5cblx0XHRcdFx0aWYgKCBNYXRoLmFicyggdkZyb20ueCApID4gTWF0aC5hYnMoIHZGcm9tLnogKSApIHtcblxuXHRcdFx0XHRcdHYxLnNldCggLSB2RnJvbS55LCB2RnJvbS54LCAwICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHYxLnNldCggMCwgLSB2RnJvbS56LCB2RnJvbS55ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHYxLmNyb3NzVmVjdG9ycyggdkZyb20sIHZUbyApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuX3ggPSB2MS54O1xuXHRcdFx0dGhpcy5feSA9IHYxLnk7XG5cdFx0XHR0aGlzLl96ID0gdjEuejtcblx0XHRcdHRoaXMuX3cgPSByO1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5ub3JtYWxpemUoKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGludmVyc2U6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLmNvbmp1Z2F0ZSgpLm5vcm1hbGl6ZSgpO1xuXG5cdH0sXG5cblx0Y29uanVnYXRlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLl94ICo9IC0gMTtcblx0XHR0aGlzLl95ICo9IC0gMTtcblx0XHR0aGlzLl96ICo9IC0gMTtcblxuXHRcdHRoaXMub25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRkb3Q6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHJldHVybiB0aGlzLl94ICogdi5feCArIHRoaXMuX3kgKiB2Ll95ICsgdGhpcy5feiAqIHYuX3ogKyB0aGlzLl93ICogdi5fdztcblxuXHR9LFxuXG5cdGxlbmd0aFNxOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5feCAqIHRoaXMuX3ggKyB0aGlzLl95ICogdGhpcy5feSArIHRoaXMuX3ogKiB0aGlzLl96ICsgdGhpcy5fdyAqIHRoaXMuX3c7XG5cblx0fSxcblxuXHRsZW5ndGg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBNYXRoLnNxcnQoIHRoaXMuX3ggKiB0aGlzLl94ICsgdGhpcy5feSAqIHRoaXMuX3kgKyB0aGlzLl96ICogdGhpcy5feiArIHRoaXMuX3cgKiB0aGlzLl93ICk7XG5cblx0fSxcblxuXHRub3JtYWxpemU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBsID0gdGhpcy5sZW5ndGgoKTtcblxuXHRcdGlmICggbCA9PT0gMCApIHtcblxuXHRcdFx0dGhpcy5feCA9IDA7XG5cdFx0XHR0aGlzLl95ID0gMDtcblx0XHRcdHRoaXMuX3ogPSAwO1xuXHRcdFx0dGhpcy5fdyA9IDE7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRsID0gMSAvIGw7XG5cblx0XHRcdHRoaXMuX3ggPSB0aGlzLl94ICogbDtcblx0XHRcdHRoaXMuX3kgPSB0aGlzLl95ICogbDtcblx0XHRcdHRoaXMuX3ogPSB0aGlzLl96ICogbDtcblx0XHRcdHRoaXMuX3cgPSB0aGlzLl93ICogbDtcblxuXHRcdH1cblxuXHRcdHRoaXMub25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtdWx0aXBseTogZnVuY3Rpb24gKCBxLCBwICkge1xuXG5cdFx0aWYgKCBwICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlF1YXRlcm5pb246IC5tdWx0aXBseSgpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLm11bHRpcGx5UXVhdGVybmlvbnMoIGEsIGIgKSBpbnN0ZWFkLicgKTtcblx0XHRcdHJldHVybiB0aGlzLm11bHRpcGx5UXVhdGVybmlvbnMoIHEsIHAgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLm11bHRpcGx5UXVhdGVybmlvbnMoIHRoaXMsIHEgKTtcblxuXHR9LFxuXG5cdHByZW11bHRpcGx5OiBmdW5jdGlvbiAoIHEgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5tdWx0aXBseVF1YXRlcm5pb25zKCBxLCB0aGlzICk7XG5cblx0fSxcblxuXHRtdWx0aXBseVF1YXRlcm5pb25zOiBmdW5jdGlvbiAoIGEsIGIgKSB7XG5cblx0XHQvLyBmcm9tIGh0dHA6Ly93d3cuZXVjbGlkZWFuc3BhY2UuY29tL21hdGhzL2FsZ2VicmEvcmVhbE5vcm1lZEFsZ2VicmEvcXVhdGVybmlvbnMvY29kZS9pbmRleC5odG1cblxuXHRcdHZhciBxYXggPSBhLl94LCBxYXkgPSBhLl95LCBxYXogPSBhLl96LCBxYXcgPSBhLl93O1xuXHRcdHZhciBxYnggPSBiLl94LCBxYnkgPSBiLl95LCBxYnogPSBiLl96LCBxYncgPSBiLl93O1xuXG5cdFx0dGhpcy5feCA9IHFheCAqIHFidyArIHFhdyAqIHFieCArIHFheSAqIHFieiAtIHFheiAqIHFieTtcblx0XHR0aGlzLl95ID0gcWF5ICogcWJ3ICsgcWF3ICogcWJ5ICsgcWF6ICogcWJ4IC0gcWF4ICogcWJ6O1xuXHRcdHRoaXMuX3ogPSBxYXogKiBxYncgKyBxYXcgKiBxYnogKyBxYXggKiBxYnkgLSBxYXkgKiBxYng7XG5cdFx0dGhpcy5fdyA9IHFhdyAqIHFidyAtIHFheCAqIHFieCAtIHFheSAqIHFieSAtIHFheiAqIHFiejtcblxuXHRcdHRoaXMub25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzbGVycDogZnVuY3Rpb24gKCBxYiwgdCApIHtcblxuXHRcdGlmICggdCA9PT0gMCApIHJldHVybiB0aGlzO1xuXHRcdGlmICggdCA9PT0gMSApIHJldHVybiB0aGlzLmNvcHkoIHFiICk7XG5cblx0XHR2YXIgeCA9IHRoaXMuX3gsIHkgPSB0aGlzLl95LCB6ID0gdGhpcy5feiwgdyA9IHRoaXMuX3c7XG5cblx0XHQvLyBodHRwOi8vd3d3LmV1Y2xpZGVhbnNwYWNlLmNvbS9tYXRocy9hbGdlYnJhL3JlYWxOb3JtZWRBbGdlYnJhL3F1YXRlcm5pb25zL3NsZXJwL1xuXG5cdFx0dmFyIGNvc0hhbGZUaGV0YSA9IHcgKiBxYi5fdyArIHggKiBxYi5feCArIHkgKiBxYi5feSArIHogKiBxYi5fejtcblxuXHRcdGlmICggY29zSGFsZlRoZXRhIDwgMCApIHtcblxuXHRcdFx0dGhpcy5fdyA9IC0gcWIuX3c7XG5cdFx0XHR0aGlzLl94ID0gLSBxYi5feDtcblx0XHRcdHRoaXMuX3kgPSAtIHFiLl95O1xuXHRcdFx0dGhpcy5feiA9IC0gcWIuX3o7XG5cblx0XHRcdGNvc0hhbGZUaGV0YSA9IC0gY29zSGFsZlRoZXRhO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dGhpcy5jb3B5KCBxYiApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBjb3NIYWxmVGhldGEgPj0gMS4wICkge1xuXG5cdFx0XHR0aGlzLl93ID0gdztcblx0XHRcdHRoaXMuX3ggPSB4O1xuXHRcdFx0dGhpcy5feSA9IHk7XG5cdFx0XHR0aGlzLl96ID0gejtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9XG5cblx0XHR2YXIgc2luSGFsZlRoZXRhID0gTWF0aC5zcXJ0KCAxLjAgLSBjb3NIYWxmVGhldGEgKiBjb3NIYWxmVGhldGEgKTtcblxuXHRcdGlmICggTWF0aC5hYnMoIHNpbkhhbGZUaGV0YSApIDwgMC4wMDEgKSB7XG5cblx0XHRcdHRoaXMuX3cgPSAwLjUgKiAoIHcgKyB0aGlzLl93ICk7XG5cdFx0XHR0aGlzLl94ID0gMC41ICogKCB4ICsgdGhpcy5feCApO1xuXHRcdFx0dGhpcy5feSA9IDAuNSAqICggeSArIHRoaXMuX3kgKTtcblx0XHRcdHRoaXMuX3ogPSAwLjUgKiAoIHogKyB0aGlzLl96ICk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fVxuXG5cdFx0dmFyIGhhbGZUaGV0YSA9IE1hdGguYXRhbjIoIHNpbkhhbGZUaGV0YSwgY29zSGFsZlRoZXRhICk7XG5cdFx0dmFyIHJhdGlvQSA9IE1hdGguc2luKCAoIDEgLSB0ICkgKiBoYWxmVGhldGEgKSAvIHNpbkhhbGZUaGV0YSxcblx0XHRcdHJhdGlvQiA9IE1hdGguc2luKCB0ICogaGFsZlRoZXRhICkgLyBzaW5IYWxmVGhldGE7XG5cblx0XHR0aGlzLl93ID0gKCB3ICogcmF0aW9BICsgdGhpcy5fdyAqIHJhdGlvQiApO1xuXHRcdHRoaXMuX3ggPSAoIHggKiByYXRpb0EgKyB0aGlzLl94ICogcmF0aW9CICk7XG5cdFx0dGhpcy5feSA9ICggeSAqIHJhdGlvQSArIHRoaXMuX3kgKiByYXRpb0IgKTtcblx0XHR0aGlzLl96ID0gKCB6ICogcmF0aW9BICsgdGhpcy5feiAqIHJhdGlvQiApO1xuXG5cdFx0dGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGVxdWFsczogZnVuY3Rpb24gKCBxdWF0ZXJuaW9uICkge1xuXG5cdFx0cmV0dXJuICggcXVhdGVybmlvbi5feCA9PT0gdGhpcy5feCApICYmICggcXVhdGVybmlvbi5feSA9PT0gdGhpcy5feSApICYmICggcXVhdGVybmlvbi5feiA9PT0gdGhpcy5feiApICYmICggcXVhdGVybmlvbi5fdyA9PT0gdGhpcy5fdyApO1xuXG5cdH0sXG5cblx0ZnJvbUFycmF5OiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0gMDtcblxuXHRcdHRoaXMuX3ggPSBhcnJheVsgb2Zmc2V0IF07XG5cdFx0dGhpcy5feSA9IGFycmF5WyBvZmZzZXQgKyAxIF07XG5cdFx0dGhpcy5feiA9IGFycmF5WyBvZmZzZXQgKyAyIF07XG5cdFx0dGhpcy5fdyA9IGFycmF5WyBvZmZzZXQgKyAzIF07XG5cblx0XHR0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dG9BcnJheTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0aWYgKCBhcnJheSA9PT0gdW5kZWZpbmVkICkgYXJyYXkgPSBbXTtcblx0XHRpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0gMDtcblxuXHRcdGFycmF5WyBvZmZzZXQgXSA9IHRoaXMuX3g7XG5cdFx0YXJyYXlbIG9mZnNldCArIDEgXSA9IHRoaXMuX3k7XG5cdFx0YXJyYXlbIG9mZnNldCArIDIgXSA9IHRoaXMuX3o7XG5cdFx0YXJyYXlbIG9mZnNldCArIDMgXSA9IHRoaXMuX3c7XG5cblx0XHRyZXR1cm4gYXJyYXk7XG5cblx0fSxcblxuXHRvbkNoYW5nZTogZnVuY3Rpb24gKCBjYWxsYmFjayApIHtcblxuXHRcdHRoaXMub25DaGFuZ2VDYWxsYmFjayA9IGNhbGxiYWNrO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRvbkNoYW5nZUNhbGxiYWNrOiBmdW5jdGlvbiAoKSB7fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgKmtpbGUgLyBodHRwOi8va2lsZS5zdHJhdmFnYW56YS5vcmcvXG4gKiBAYXV0aG9yIHBoaWxvZ2IgLyBodHRwOi8vYmxvZy50aGVqaXQub3JnL1xuICogQGF1dGhvciBtaWthZWwgZW10aW5nZXIgLyBodHRwOi8vZ29tby5zZS9cbiAqIEBhdXRob3IgZWdyYWV0aGVyIC8gaHR0cDovL2VncmFldGhlci5jb20vXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqL1xuXG5mdW5jdGlvbiBWZWN0b3IzKCB4LCB5LCB6ICkge1xuXG5cdHRoaXMueCA9IHggfHwgMDtcblx0dGhpcy55ID0geSB8fCAwO1xuXHR0aGlzLnogPSB6IHx8IDA7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggVmVjdG9yMy5wcm90b3R5cGUsIHtcblxuXHRpc1ZlY3RvcjM6IHRydWUsXG5cblx0c2V0OiBmdW5jdGlvbiAoIHgsIHksIHogKSB7XG5cblx0XHR0aGlzLnggPSB4O1xuXHRcdHRoaXMueSA9IHk7XG5cdFx0dGhpcy56ID0gejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0U2NhbGFyOiBmdW5jdGlvbiAoIHNjYWxhciApIHtcblxuXHRcdHRoaXMueCA9IHNjYWxhcjtcblx0XHR0aGlzLnkgPSBzY2FsYXI7XG5cdFx0dGhpcy56ID0gc2NhbGFyO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRYOiBmdW5jdGlvbiAoIHggKSB7XG5cblx0XHR0aGlzLnggPSB4O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRZOiBmdW5jdGlvbiAoIHkgKSB7XG5cblx0XHR0aGlzLnkgPSB5O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRaOiBmdW5jdGlvbiAoIHogKSB7XG5cblx0XHR0aGlzLnogPSB6O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRDb21wb25lbnQ6IGZ1bmN0aW9uICggaW5kZXgsIHZhbHVlICkge1xuXG5cdFx0c3dpdGNoICggaW5kZXggKSB7XG5cblx0XHRcdGNhc2UgMDogdGhpcy54ID0gdmFsdWU7IGJyZWFrO1xuXHRcdFx0Y2FzZSAxOiB0aGlzLnkgPSB2YWx1ZTsgYnJlYWs7XG5cdFx0XHRjYXNlIDI6IHRoaXMueiA9IHZhbHVlOyBicmVhaztcblx0XHRcdGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvciggJ2luZGV4IGlzIG91dCBvZiByYW5nZTogJyArIGluZGV4ICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGdldENvbXBvbmVudDogZnVuY3Rpb24gKCBpbmRleCApIHtcblxuXHRcdHN3aXRjaCAoIGluZGV4ICkge1xuXG5cdFx0XHRjYXNlIDA6IHJldHVybiB0aGlzLng7XG5cdFx0XHRjYXNlIDE6IHJldHVybiB0aGlzLnk7XG5cdFx0XHRjYXNlIDI6IHJldHVybiB0aGlzLno7XG5cdFx0XHRkZWZhdWx0OiB0aHJvdyBuZXcgRXJyb3IoICdpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICcgKyBpbmRleCApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvciggdGhpcy54LCB0aGlzLnksIHRoaXMueiApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0dGhpcy54ID0gdi54O1xuXHRcdHRoaXMueSA9IHYueTtcblx0XHR0aGlzLnogPSB2Lno7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFkZDogZnVuY3Rpb24gKCB2LCB3ICkge1xuXG5cdFx0aWYgKCB3ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjM6IC5hZGQoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5hZGRWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5hZGRWZWN0b3JzKCB2LCB3ICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLnggKz0gdi54O1xuXHRcdHRoaXMueSArPSB2Lnk7XG5cdFx0dGhpcy56ICs9IHYuejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YWRkU2NhbGFyOiBmdW5jdGlvbiAoIHMgKSB7XG5cblx0XHR0aGlzLnggKz0gcztcblx0XHR0aGlzLnkgKz0gcztcblx0XHR0aGlzLnogKz0gcztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YWRkVmVjdG9yczogZnVuY3Rpb24gKCBhLCBiICkge1xuXG5cdFx0dGhpcy54ID0gYS54ICsgYi54O1xuXHRcdHRoaXMueSA9IGEueSArIGIueTtcblx0XHR0aGlzLnogPSBhLnogKyBiLno7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFkZFNjYWxlZFZlY3RvcjogZnVuY3Rpb24gKCB2LCBzICkge1xuXG5cdFx0dGhpcy54ICs9IHYueCAqIHM7XG5cdFx0dGhpcy55ICs9IHYueSAqIHM7XG5cdFx0dGhpcy56ICs9IHYueiAqIHM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHN1YjogZnVuY3Rpb24gKCB2LCB3ICkge1xuXG5cdFx0aWYgKCB3ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjM6IC5zdWIoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5zdWJWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5zdWJWZWN0b3JzKCB2LCB3ICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLnggLT0gdi54O1xuXHRcdHRoaXMueSAtPSB2Lnk7XG5cdFx0dGhpcy56IC09IHYuejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c3ViU2NhbGFyOiBmdW5jdGlvbiAoIHMgKSB7XG5cblx0XHR0aGlzLnggLT0gcztcblx0XHR0aGlzLnkgLT0gcztcblx0XHR0aGlzLnogLT0gcztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c3ViVmVjdG9yczogZnVuY3Rpb24gKCBhLCBiICkge1xuXG5cdFx0dGhpcy54ID0gYS54IC0gYi54O1xuXHRcdHRoaXMueSA9IGEueSAtIGIueTtcblx0XHR0aGlzLnogPSBhLnogLSBiLno7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG11bHRpcGx5OiBmdW5jdGlvbiAoIHYsIHcgKSB7XG5cblx0XHRpZiAoIHcgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yMzogLm11bHRpcGx5KCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAubXVsdGlwbHlWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5tdWx0aXBseVZlY3RvcnMoIHYsIHcgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMueCAqPSB2Lng7XG5cdFx0dGhpcy55ICo9IHYueTtcblx0XHR0aGlzLnogKj0gdi56O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtdWx0aXBseVNjYWxhcjogZnVuY3Rpb24gKCBzY2FsYXIgKSB7XG5cblx0XHR0aGlzLnggKj0gc2NhbGFyO1xuXHRcdHRoaXMueSAqPSBzY2FsYXI7XG5cdFx0dGhpcy56ICo9IHNjYWxhcjtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bXVsdGlwbHlWZWN0b3JzOiBmdW5jdGlvbiAoIGEsIGIgKSB7XG5cblx0XHR0aGlzLnggPSBhLnggKiBiLng7XG5cdFx0dGhpcy55ID0gYS55ICogYi55O1xuXHRcdHRoaXMueiA9IGEueiAqIGIuejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YXBwbHlFdWxlcjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHF1YXRlcm5pb24gPSBuZXcgUXVhdGVybmlvbigpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGFwcGx5RXVsZXIoIGV1bGVyICkge1xuXG5cdFx0XHRpZiAoICggZXVsZXIgJiYgZXVsZXIuaXNFdWxlciApID09PSBmYWxzZSApIHtcblxuXHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuVmVjdG9yMzogLmFwcGx5RXVsZXIoKSBub3cgZXhwZWN0cyBhbiBFdWxlciByb3RhdGlvbiByYXRoZXIgdGhhbiBhIFZlY3RvcjMgYW5kIG9yZGVyLicgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdGhpcy5hcHBseVF1YXRlcm5pb24oIHF1YXRlcm5pb24uc2V0RnJvbUV1bGVyKCBldWxlciApICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRhcHBseUF4aXNBbmdsZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHF1YXRlcm5pb24gPSBuZXcgUXVhdGVybmlvbigpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGFwcGx5QXhpc0FuZ2xlKCBheGlzLCBhbmdsZSApIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMuYXBwbHlRdWF0ZXJuaW9uKCBxdWF0ZXJuaW9uLnNldEZyb21BeGlzQW5nbGUoIGF4aXMsIGFuZ2xlICkgKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGFwcGx5TWF0cml4MzogZnVuY3Rpb24gKCBtICkge1xuXG5cdFx0dmFyIHggPSB0aGlzLngsIHkgPSB0aGlzLnksIHogPSB0aGlzLno7XG5cdFx0dmFyIGUgPSBtLmVsZW1lbnRzO1xuXG5cdFx0dGhpcy54ID0gZVsgMCBdICogeCArIGVbIDMgXSAqIHkgKyBlWyA2IF0gKiB6O1xuXHRcdHRoaXMueSA9IGVbIDEgXSAqIHggKyBlWyA0IF0gKiB5ICsgZVsgNyBdICogejtcblx0XHR0aGlzLnogPSBlWyAyIF0gKiB4ICsgZVsgNSBdICogeSArIGVbIDggXSAqIHo7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFwcGx5TWF0cml4NDogZnVuY3Rpb24gKCBtICkge1xuXG5cdFx0dmFyIHggPSB0aGlzLngsIHkgPSB0aGlzLnksIHogPSB0aGlzLno7XG5cdFx0dmFyIGUgPSBtLmVsZW1lbnRzO1xuXG5cdFx0dGhpcy54ID0gZVsgMCBdICogeCArIGVbIDQgXSAqIHkgKyBlWyA4IF0gICogeiArIGVbIDEyIF07XG5cdFx0dGhpcy55ID0gZVsgMSBdICogeCArIGVbIDUgXSAqIHkgKyBlWyA5IF0gICogeiArIGVbIDEzIF07XG5cdFx0dGhpcy56ID0gZVsgMiBdICogeCArIGVbIDYgXSAqIHkgKyBlWyAxMCBdICogeiArIGVbIDE0IF07XG5cdFx0dmFyIHcgPSAgZVsgMyBdICogeCArIGVbIDcgXSAqIHkgKyBlWyAxMSBdICogeiArIGVbIDE1IF07XG5cblx0XHRyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIoIHcgKTtcblxuXHR9LFxuXG5cdGFwcGx5UXVhdGVybmlvbjogZnVuY3Rpb24gKCBxICkge1xuXG5cdFx0dmFyIHggPSB0aGlzLngsIHkgPSB0aGlzLnksIHogPSB0aGlzLno7XG5cdFx0dmFyIHF4ID0gcS54LCBxeSA9IHEueSwgcXogPSBxLnosIHF3ID0gcS53O1xuXG5cdFx0Ly8gY2FsY3VsYXRlIHF1YXQgKiB2ZWN0b3JcblxuXHRcdHZhciBpeCA9ICBxdyAqIHggKyBxeSAqIHogLSBxeiAqIHk7XG5cdFx0dmFyIGl5ID0gIHF3ICogeSArIHF6ICogeCAtIHF4ICogejtcblx0XHR2YXIgaXogPSAgcXcgKiB6ICsgcXggKiB5IC0gcXkgKiB4O1xuXHRcdHZhciBpdyA9IC0gcXggKiB4IC0gcXkgKiB5IC0gcXogKiB6O1xuXG5cdFx0Ly8gY2FsY3VsYXRlIHJlc3VsdCAqIGludmVyc2UgcXVhdFxuXG5cdFx0dGhpcy54ID0gaXggKiBxdyArIGl3ICogLSBxeCArIGl5ICogLSBxeiAtIGl6ICogLSBxeTtcblx0XHR0aGlzLnkgPSBpeSAqIHF3ICsgaXcgKiAtIHF5ICsgaXogKiAtIHF4IC0gaXggKiAtIHF6O1xuXHRcdHRoaXMueiA9IGl6ICogcXcgKyBpdyAqIC0gcXogKyBpeCAqIC0gcXkgLSBpeSAqIC0gcXg7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHByb2plY3Q6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBtYXRyaXggPSBuZXcgTWF0cml4NCgpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHByb2plY3QoIGNhbWVyYSApIHtcblxuXHRcdFx0bWF0cml4Lm11bHRpcGx5TWF0cmljZXMoIGNhbWVyYS5wcm9qZWN0aW9uTWF0cml4LCBtYXRyaXguZ2V0SW52ZXJzZSggY2FtZXJhLm1hdHJpeFdvcmxkICkgKTtcblx0XHRcdHJldHVybiB0aGlzLmFwcGx5TWF0cml4NCggbWF0cml4ICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHR1bnByb2plY3Q6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBtYXRyaXggPSBuZXcgTWF0cml4NCgpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHVucHJvamVjdCggY2FtZXJhICkge1xuXG5cdFx0XHRtYXRyaXgubXVsdGlwbHlNYXRyaWNlcyggY2FtZXJhLm1hdHJpeFdvcmxkLCBtYXRyaXguZ2V0SW52ZXJzZSggY2FtZXJhLnByb2plY3Rpb25NYXRyaXggKSApO1xuXHRcdFx0cmV0dXJuIHRoaXMuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHRyYW5zZm9ybURpcmVjdGlvbjogZnVuY3Rpb24gKCBtICkge1xuXG5cdFx0Ly8gaW5wdXQ6IFRIUkVFLk1hdHJpeDQgYWZmaW5lIG1hdHJpeFxuXHRcdC8vIHZlY3RvciBpbnRlcnByZXRlZCBhcyBhIGRpcmVjdGlvblxuXG5cdFx0dmFyIHggPSB0aGlzLngsIHkgPSB0aGlzLnksIHogPSB0aGlzLno7XG5cdFx0dmFyIGUgPSBtLmVsZW1lbnRzO1xuXG5cdFx0dGhpcy54ID0gZVsgMCBdICogeCArIGVbIDQgXSAqIHkgKyBlWyA4IF0gICogejtcblx0XHR0aGlzLnkgPSBlWyAxIF0gKiB4ICsgZVsgNSBdICogeSArIGVbIDkgXSAgKiB6O1xuXHRcdHRoaXMueiA9IGVbIDIgXSAqIHggKyBlWyA2IF0gKiB5ICsgZVsgMTAgXSAqIHo7XG5cblx0XHRyZXR1cm4gdGhpcy5ub3JtYWxpemUoKTtcblxuXHR9LFxuXG5cdGRpdmlkZTogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0dGhpcy54IC89IHYueDtcblx0XHR0aGlzLnkgLz0gdi55O1xuXHRcdHRoaXMueiAvPSB2Lno7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGRpdmlkZVNjYWxhcjogZnVuY3Rpb24gKCBzY2FsYXIgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5tdWx0aXBseVNjYWxhciggMSAvIHNjYWxhciApO1xuXG5cdH0sXG5cblx0bWluOiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHR0aGlzLnggPSBNYXRoLm1pbiggdGhpcy54LCB2LnggKTtcblx0XHR0aGlzLnkgPSBNYXRoLm1pbiggdGhpcy55LCB2LnkgKTtcblx0XHR0aGlzLnogPSBNYXRoLm1pbiggdGhpcy56LCB2LnogKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bWF4OiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHR0aGlzLnggPSBNYXRoLm1heCggdGhpcy54LCB2LnggKTtcblx0XHR0aGlzLnkgPSBNYXRoLm1heCggdGhpcy55LCB2LnkgKTtcblx0XHR0aGlzLnogPSBNYXRoLm1heCggdGhpcy56LCB2LnogKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xhbXA6IGZ1bmN0aW9uICggbWluLCBtYXggKSB7XG5cblx0XHQvLyBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgbWluIDwgbWF4LCBpZiB0aGlzIGFzc3VtcHRpb24gaXNuJ3QgdHJ1ZSBpdCB3aWxsIG5vdCBvcGVyYXRlIGNvcnJlY3RseVxuXG5cdFx0dGhpcy54ID0gTWF0aC5tYXgoIG1pbi54LCBNYXRoLm1pbiggbWF4LngsIHRoaXMueCApICk7XG5cdFx0dGhpcy55ID0gTWF0aC5tYXgoIG1pbi55LCBNYXRoLm1pbiggbWF4LnksIHRoaXMueSApICk7XG5cdFx0dGhpcy56ID0gTWF0aC5tYXgoIG1pbi56LCBNYXRoLm1pbiggbWF4LnosIHRoaXMueiApICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNsYW1wU2NhbGFyOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgbWluID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgbWF4ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBjbGFtcFNjYWxhciggbWluVmFsLCBtYXhWYWwgKSB7XG5cblx0XHRcdG1pbi5zZXQoIG1pblZhbCwgbWluVmFsLCBtaW5WYWwgKTtcblx0XHRcdG1heC5zZXQoIG1heFZhbCwgbWF4VmFsLCBtYXhWYWwgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXMuY2xhbXAoIG1pbiwgbWF4ICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRjbGFtcExlbmd0aDogZnVuY3Rpb24gKCBtaW4sIG1heCApIHtcblxuXHRcdHZhciBsZW5ndGggPSB0aGlzLmxlbmd0aCgpO1xuXG5cdFx0cmV0dXJuIHRoaXMubXVsdGlwbHlTY2FsYXIoIE1hdGgubWF4KCBtaW4sIE1hdGgubWluKCBtYXgsIGxlbmd0aCApICkgLyBsZW5ndGggKTtcblxuXHR9LFxuXG5cdGZsb29yOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLnggPSBNYXRoLmZsb29yKCB0aGlzLnggKTtcblx0XHR0aGlzLnkgPSBNYXRoLmZsb29yKCB0aGlzLnkgKTtcblx0XHR0aGlzLnogPSBNYXRoLmZsb29yKCB0aGlzLnogKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2VpbDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy54ID0gTWF0aC5jZWlsKCB0aGlzLnggKTtcblx0XHR0aGlzLnkgPSBNYXRoLmNlaWwoIHRoaXMueSApO1xuXHRcdHRoaXMueiA9IE1hdGguY2VpbCggdGhpcy56ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHJvdW5kOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLnggPSBNYXRoLnJvdW5kKCB0aGlzLnggKTtcblx0XHR0aGlzLnkgPSBNYXRoLnJvdW5kKCB0aGlzLnkgKTtcblx0XHR0aGlzLnogPSBNYXRoLnJvdW5kKCB0aGlzLnogKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0cm91bmRUb1plcm86IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMueCA9ICggdGhpcy54IDwgMCApID8gTWF0aC5jZWlsKCB0aGlzLnggKSA6IE1hdGguZmxvb3IoIHRoaXMueCApO1xuXHRcdHRoaXMueSA9ICggdGhpcy55IDwgMCApID8gTWF0aC5jZWlsKCB0aGlzLnkgKSA6IE1hdGguZmxvb3IoIHRoaXMueSApO1xuXHRcdHRoaXMueiA9ICggdGhpcy56IDwgMCApID8gTWF0aC5jZWlsKCB0aGlzLnogKSA6IE1hdGguZmxvb3IoIHRoaXMueiApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRuZWdhdGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMueCA9IC0gdGhpcy54O1xuXHRcdHRoaXMueSA9IC0gdGhpcy55O1xuXHRcdHRoaXMueiA9IC0gdGhpcy56O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRkb3Q6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHJldHVybiB0aGlzLnggKiB2LnggKyB0aGlzLnkgKiB2LnkgKyB0aGlzLnogKiB2Lno7XG5cblx0fSxcblxuXHQvLyBUT0RPIGxlbmd0aFNxdWFyZWQ/XG5cblx0bGVuZ3RoU3E6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLnggKiB0aGlzLnggKyB0aGlzLnkgKiB0aGlzLnkgKyB0aGlzLnogKiB0aGlzLno7XG5cblx0fSxcblxuXHRsZW5ndGg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBNYXRoLnNxcnQoIHRoaXMueCAqIHRoaXMueCArIHRoaXMueSAqIHRoaXMueSArIHRoaXMueiAqIHRoaXMueiApO1xuXG5cdH0sXG5cblx0bGVuZ3RoTWFuaGF0dGFuOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gTWF0aC5hYnMoIHRoaXMueCApICsgTWF0aC5hYnMoIHRoaXMueSApICsgTWF0aC5hYnMoIHRoaXMueiApO1xuXG5cdH0sXG5cblx0bm9ybWFsaXplOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIoIHRoaXMubGVuZ3RoKCkgKTtcblxuXHR9LFxuXG5cdHNldExlbmd0aDogZnVuY3Rpb24gKCBsZW5ndGggKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5tdWx0aXBseVNjYWxhciggbGVuZ3RoIC8gdGhpcy5sZW5ndGgoKSApO1xuXG5cdH0sXG5cblx0bGVycDogZnVuY3Rpb24gKCB2LCBhbHBoYSApIHtcblxuXHRcdHRoaXMueCArPSAoIHYueCAtIHRoaXMueCApICogYWxwaGE7XG5cdFx0dGhpcy55ICs9ICggdi55IC0gdGhpcy55ICkgKiBhbHBoYTtcblx0XHR0aGlzLnogKz0gKCB2LnogLSB0aGlzLnogKSAqIGFscGhhO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRsZXJwVmVjdG9yczogZnVuY3Rpb24gKCB2MSwgdjIsIGFscGhhICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuc3ViVmVjdG9ycyggdjIsIHYxICkubXVsdGlwbHlTY2FsYXIoIGFscGhhICkuYWRkKCB2MSApO1xuXG5cdH0sXG5cblx0Y3Jvc3M6IGZ1bmN0aW9uICggdiwgdyApIHtcblxuXHRcdGlmICggdyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IzOiAuY3Jvc3MoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5jcm9zc1ZlY3RvcnMoIGEsIGIgKSBpbnN0ZWFkLicgKTtcblx0XHRcdHJldHVybiB0aGlzLmNyb3NzVmVjdG9ycyggdiwgdyApO1xuXG5cdFx0fVxuXG5cdFx0dmFyIHggPSB0aGlzLngsIHkgPSB0aGlzLnksIHogPSB0aGlzLno7XG5cblx0XHR0aGlzLnggPSB5ICogdi56IC0geiAqIHYueTtcblx0XHR0aGlzLnkgPSB6ICogdi54IC0geCAqIHYuejtcblx0XHR0aGlzLnogPSB4ICogdi55IC0geSAqIHYueDtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y3Jvc3NWZWN0b3JzOiBmdW5jdGlvbiAoIGEsIGIgKSB7XG5cblx0XHR2YXIgYXggPSBhLngsIGF5ID0gYS55LCBheiA9IGEuejtcblx0XHR2YXIgYnggPSBiLngsIGJ5ID0gYi55LCBieiA9IGIuejtcblxuXHRcdHRoaXMueCA9IGF5ICogYnogLSBheiAqIGJ5O1xuXHRcdHRoaXMueSA9IGF6ICogYnggLSBheCAqIGJ6O1xuXHRcdHRoaXMueiA9IGF4ICogYnkgLSBheSAqIGJ4O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRwcm9qZWN0T25WZWN0b3I6IGZ1bmN0aW9uICggdmVjdG9yICkge1xuXG5cdFx0dmFyIHNjYWxhciA9IHZlY3Rvci5kb3QoIHRoaXMgKSAvIHZlY3Rvci5sZW5ndGhTcSgpO1xuXG5cdFx0cmV0dXJuIHRoaXMuY29weSggdmVjdG9yICkubXVsdGlwbHlTY2FsYXIoIHNjYWxhciApO1xuXG5cdH0sXG5cblx0cHJvamVjdE9uUGxhbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gcHJvamVjdE9uUGxhbmUoIHBsYW5lTm9ybWFsICkge1xuXG5cdFx0XHR2MS5jb3B5KCB0aGlzICkucHJvamVjdE9uVmVjdG9yKCBwbGFuZU5vcm1hbCApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5zdWIoIHYxICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRyZWZsZWN0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyByZWZsZWN0IGluY2lkZW50IHZlY3RvciBvZmYgcGxhbmUgb3J0aG9nb25hbCB0byBub3JtYWxcblx0XHQvLyBub3JtYWwgaXMgYXNzdW1lZCB0byBoYXZlIHVuaXQgbGVuZ3RoXG5cblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHJlZmxlY3QoIG5vcm1hbCApIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMuc3ViKCB2MS5jb3B5KCBub3JtYWwgKS5tdWx0aXBseVNjYWxhciggMiAqIHRoaXMuZG90KCBub3JtYWwgKSApICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRhbmdsZVRvOiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHR2YXIgdGhldGEgPSB0aGlzLmRvdCggdiApIC8gKCBNYXRoLnNxcnQoIHRoaXMubGVuZ3RoU3EoKSAqIHYubGVuZ3RoU3EoKSApICk7XG5cblx0XHQvLyBjbGFtcCwgdG8gaGFuZGxlIG51bWVyaWNhbCBwcm9ibGVtc1xuXG5cdFx0cmV0dXJuIE1hdGguYWNvcyggX01hdGguY2xhbXAoIHRoZXRhLCAtIDEsIDEgKSApO1xuXG5cdH0sXG5cblx0ZGlzdGFuY2VUbzogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0cmV0dXJuIE1hdGguc3FydCggdGhpcy5kaXN0YW5jZVRvU3F1YXJlZCggdiApICk7XG5cblx0fSxcblxuXHRkaXN0YW5jZVRvU3F1YXJlZDogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0dmFyIGR4ID0gdGhpcy54IC0gdi54LCBkeSA9IHRoaXMueSAtIHYueSwgZHogPSB0aGlzLnogLSB2Lno7XG5cblx0XHRyZXR1cm4gZHggKiBkeCArIGR5ICogZHkgKyBkeiAqIGR6O1xuXG5cdH0sXG5cblx0ZGlzdGFuY2VUb01hbmhhdHRhbjogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0cmV0dXJuIE1hdGguYWJzKCB0aGlzLnggLSB2LnggKSArIE1hdGguYWJzKCB0aGlzLnkgLSB2LnkgKSArIE1hdGguYWJzKCB0aGlzLnogLSB2LnogKTtcblxuXHR9LFxuXG5cdHNldEZyb21TcGhlcmljYWw6IGZ1bmN0aW9uICggcyApIHtcblxuXHRcdHZhciBzaW5QaGlSYWRpdXMgPSBNYXRoLnNpbiggcy5waGkgKSAqIHMucmFkaXVzO1xuXG5cdFx0dGhpcy54ID0gc2luUGhpUmFkaXVzICogTWF0aC5zaW4oIHMudGhldGEgKTtcblx0XHR0aGlzLnkgPSBNYXRoLmNvcyggcy5waGkgKSAqIHMucmFkaXVzO1xuXHRcdHRoaXMueiA9IHNpblBoaVJhZGl1cyAqIE1hdGguY29zKCBzLnRoZXRhICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21DeWxpbmRyaWNhbDogZnVuY3Rpb24gKCBjICkge1xuXG5cdFx0dGhpcy54ID0gYy5yYWRpdXMgKiBNYXRoLnNpbiggYy50aGV0YSApO1xuXHRcdHRoaXMueSA9IGMueTtcblx0XHR0aGlzLnogPSBjLnJhZGl1cyAqIE1hdGguY29zKCBjLnRoZXRhICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21NYXRyaXhQb3NpdGlvbjogZnVuY3Rpb24gKCBtICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuc2V0RnJvbU1hdHJpeENvbHVtbiggbSwgMyApO1xuXG5cdH0sXG5cblx0c2V0RnJvbU1hdHJpeFNjYWxlOiBmdW5jdGlvbiAoIG0gKSB7XG5cblx0XHR2YXIgc3ggPSB0aGlzLnNldEZyb21NYXRyaXhDb2x1bW4oIG0sIDAgKS5sZW5ndGgoKTtcblx0XHR2YXIgc3kgPSB0aGlzLnNldEZyb21NYXRyaXhDb2x1bW4oIG0sIDEgKS5sZW5ndGgoKTtcblx0XHR2YXIgc3ogPSB0aGlzLnNldEZyb21NYXRyaXhDb2x1bW4oIG0sIDIgKS5sZW5ndGgoKTtcblxuXHRcdHRoaXMueCA9IHN4O1xuXHRcdHRoaXMueSA9IHN5O1xuXHRcdHRoaXMueiA9IHN6O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRGcm9tTWF0cml4Q29sdW1uOiBmdW5jdGlvbiAoIG0sIGluZGV4ICkge1xuXG5cblx0XHRyZXR1cm4gdGhpcy5mcm9tQXJyYXkoIG0uZWxlbWVudHMsIGluZGV4ICogNCApO1xuXG5cdH0sXG5cblx0ZXF1YWxzOiBmdW5jdGlvbiAoIHYgKSB7XG5cblx0XHRyZXR1cm4gKCAoIHYueCA9PT0gdGhpcy54ICkgJiYgKCB2LnkgPT09IHRoaXMueSApICYmICggdi56ID09PSB0aGlzLnogKSApO1xuXG5cdH0sXG5cblx0ZnJvbUFycmF5OiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0gMDtcblxuXHRcdHRoaXMueCA9IGFycmF5WyBvZmZzZXQgXTtcblx0XHR0aGlzLnkgPSBhcnJheVsgb2Zmc2V0ICsgMSBdO1xuXHRcdHRoaXMueiA9IGFycmF5WyBvZmZzZXQgKyAyIF07XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHRvQXJyYXk6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCApIHtcblxuXHRcdGlmICggYXJyYXkgPT09IHVuZGVmaW5lZCApIGFycmF5ID0gW107XG5cdFx0aWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7XG5cblx0XHRhcnJheVsgb2Zmc2V0IF0gPSB0aGlzLng7XG5cdFx0YXJyYXlbIG9mZnNldCArIDEgXSA9IHRoaXMueTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMiBdID0gdGhpcy56O1xuXG5cdFx0cmV0dXJuIGFycmF5O1xuXG5cdH0sXG5cblx0ZnJvbUJ1ZmZlckF0dHJpYnV0ZTogZnVuY3Rpb24gKCBhdHRyaWJ1dGUsIGluZGV4LCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoIG9mZnNldCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IzOiBvZmZzZXQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIC5mcm9tQnVmZmVyQXR0cmlidXRlKCkuJyApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy54ID0gYXR0cmlidXRlLmdldFgoIGluZGV4ICk7XG5cdFx0dGhpcy55ID0gYXR0cmlidXRlLmdldFkoIGluZGV4ICk7XG5cdFx0dGhpcy56ID0gYXR0cmlidXRlLmdldFooIGluZGV4ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBzdXBlcmVnZ2JlcnQgLyBodHRwOi8vd3d3LnBhdWxicnVudC5jby51ay9cbiAqIEBhdXRob3IgcGhpbG9nYiAvIGh0dHA6Ly9ibG9nLnRoZWppdC5vcmcvXG4gKiBAYXV0aG9yIGpvcmRpX3JvcyAvIGh0dHA6Ly9wbGF0dHNvZnQuY29tXG4gKiBAYXV0aG9yIEQxcGxvMWQgLyBodHRwOi8vZ2l0aHViLmNvbS9EMXBsbzFkXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBtaWthZWwgZW10aW5nZXIgLyBodHRwOi8vZ29tby5zZS9cbiAqIEBhdXRob3IgdGlta25pcCAvIGh0dHA6Ly93d3cuZmxvb3JwbGFubmVyLmNvbS9cbiAqIEBhdXRob3IgYmhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW9cbiAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleVxuICovXG5cbmZ1bmN0aW9uIE1hdHJpeDQoKSB7XG5cblx0dGhpcy5lbGVtZW50cyA9IFtcblxuXHRcdDEsIDAsIDAsIDAsXG5cdFx0MCwgMSwgMCwgMCxcblx0XHQwLCAwLCAxLCAwLFxuXHRcdDAsIDAsIDAsIDFcblxuXHRdO1xuXG5cdGlmICggYXJndW1lbnRzLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuTWF0cml4NDogdGhlIGNvbnN0cnVjdG9yIG5vIGxvbmdlciByZWFkcyBhcmd1bWVudHMuIHVzZSAuc2V0KCkgaW5zdGVhZC4nICk7XG5cblx0fVxuXG59XG5cbk9iamVjdC5hc3NpZ24oIE1hdHJpeDQucHJvdG90eXBlLCB7XG5cblx0aXNNYXRyaXg0OiB0cnVlLFxuXG5cdHNldDogZnVuY3Rpb24gKCBuMTEsIG4xMiwgbjEzLCBuMTQsIG4yMSwgbjIyLCBuMjMsIG4yNCwgbjMxLCBuMzIsIG4zMywgbjM0LCBuNDEsIG40MiwgbjQzLCBuNDQgKSB7XG5cblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXG5cdFx0dGVbIDAgXSA9IG4xMTsgdGVbIDQgXSA9IG4xMjsgdGVbIDggXSA9IG4xMzsgdGVbIDEyIF0gPSBuMTQ7XG5cdFx0dGVbIDEgXSA9IG4yMTsgdGVbIDUgXSA9IG4yMjsgdGVbIDkgXSA9IG4yMzsgdGVbIDEzIF0gPSBuMjQ7XG5cdFx0dGVbIDIgXSA9IG4zMTsgdGVbIDYgXSA9IG4zMjsgdGVbIDEwIF0gPSBuMzM7IHRlWyAxNCBdID0gbjM0O1xuXHRcdHRlWyAzIF0gPSBuNDE7IHRlWyA3IF0gPSBuNDI7IHRlWyAxMSBdID0gbjQzOyB0ZVsgMTUgXSA9IG40NDtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0aWRlbnRpdHk6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuc2V0KFxuXG5cdFx0XHQxLCAwLCAwLCAwLFxuXHRcdFx0MCwgMSwgMCwgMCxcblx0XHRcdDAsIDAsIDEsIDAsXG5cdFx0XHQwLCAwLCAwLCAxXG5cblx0XHQpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyBNYXRyaXg0KCkuZnJvbUFycmF5KCB0aGlzLmVsZW1lbnRzICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIG0gKSB7XG5cblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXHRcdHZhciBtZSA9IG0uZWxlbWVudHM7XG5cblx0XHR0ZVsgMCBdID0gbWVbIDAgXTsgdGVbIDEgXSA9IG1lWyAxIF07IHRlWyAyIF0gPSBtZVsgMiBdOyB0ZVsgMyBdID0gbWVbIDMgXTtcblx0XHR0ZVsgNCBdID0gbWVbIDQgXTsgdGVbIDUgXSA9IG1lWyA1IF07IHRlWyA2IF0gPSBtZVsgNiBdOyB0ZVsgNyBdID0gbWVbIDcgXTtcblx0XHR0ZVsgOCBdID0gbWVbIDggXTsgdGVbIDkgXSA9IG1lWyA5IF07IHRlWyAxMCBdID0gbWVbIDEwIF07IHRlWyAxMSBdID0gbWVbIDExIF07XG5cdFx0dGVbIDEyIF0gPSBtZVsgMTIgXTsgdGVbIDEzIF0gPSBtZVsgMTMgXTsgdGVbIDE0IF0gPSBtZVsgMTQgXTsgdGVbIDE1IF0gPSBtZVsgMTUgXTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y29weVBvc2l0aW9uOiBmdW5jdGlvbiAoIG0gKSB7XG5cblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzLCBtZSA9IG0uZWxlbWVudHM7XG5cblx0XHR0ZVsgMTIgXSA9IG1lWyAxMiBdO1xuXHRcdHRlWyAxMyBdID0gbWVbIDEzIF07XG5cdFx0dGVbIDE0IF0gPSBtZVsgMTQgXTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZXh0cmFjdEJhc2lzOiBmdW5jdGlvbiAoIHhBeGlzLCB5QXhpcywgekF4aXMgKSB7XG5cblx0XHR4QXhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKCB0aGlzLCAwICk7XG5cdFx0eUF4aXMuc2V0RnJvbU1hdHJpeENvbHVtbiggdGhpcywgMSApO1xuXHRcdHpBeGlzLnNldEZyb21NYXRyaXhDb2x1bW4oIHRoaXMsIDIgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bWFrZUJhc2lzOiBmdW5jdGlvbiAoIHhBeGlzLCB5QXhpcywgekF4aXMgKSB7XG5cblx0XHR0aGlzLnNldChcblx0XHRcdHhBeGlzLngsIHlBeGlzLngsIHpBeGlzLngsIDAsXG5cdFx0XHR4QXhpcy55LCB5QXhpcy55LCB6QXhpcy55LCAwLFxuXHRcdFx0eEF4aXMueiwgeUF4aXMueiwgekF4aXMueiwgMCxcblx0XHRcdDAsICAgICAgIDAsICAgICAgIDAsICAgICAgIDFcblx0XHQpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRleHRyYWN0Um90YXRpb246IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gZXh0cmFjdFJvdGF0aW9uKCBtICkge1xuXG5cdFx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXHRcdFx0dmFyIG1lID0gbS5lbGVtZW50cztcblxuXHRcdFx0dmFyIHNjYWxlWCA9IDEgLyB2MS5zZXRGcm9tTWF0cml4Q29sdW1uKCBtLCAwICkubGVuZ3RoKCk7XG5cdFx0XHR2YXIgc2NhbGVZID0gMSAvIHYxLnNldEZyb21NYXRyaXhDb2x1bW4oIG0sIDEgKS5sZW5ndGgoKTtcblx0XHRcdHZhciBzY2FsZVogPSAxIC8gdjEuc2V0RnJvbU1hdHJpeENvbHVtbiggbSwgMiApLmxlbmd0aCgpO1xuXG5cdFx0XHR0ZVsgMCBdID0gbWVbIDAgXSAqIHNjYWxlWDtcblx0XHRcdHRlWyAxIF0gPSBtZVsgMSBdICogc2NhbGVYO1xuXHRcdFx0dGVbIDIgXSA9IG1lWyAyIF0gKiBzY2FsZVg7XG5cblx0XHRcdHRlWyA0IF0gPSBtZVsgNCBdICogc2NhbGVZO1xuXHRcdFx0dGVbIDUgXSA9IG1lWyA1IF0gKiBzY2FsZVk7XG5cdFx0XHR0ZVsgNiBdID0gbWVbIDYgXSAqIHNjYWxlWTtcblxuXHRcdFx0dGVbIDggXSA9IG1lWyA4IF0gKiBzY2FsZVo7XG5cdFx0XHR0ZVsgOSBdID0gbWVbIDkgXSAqIHNjYWxlWjtcblx0XHRcdHRlWyAxMCBdID0gbWVbIDEwIF0gKiBzY2FsZVo7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0bWFrZVJvdGF0aW9uRnJvbUV1bGVyOiBmdW5jdGlvbiAoIGV1bGVyICkge1xuXG5cdFx0aWYgKCAoIGV1bGVyICYmIGV1bGVyLmlzRXVsZXIgKSA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5NYXRyaXg6IC5tYWtlUm90YXRpb25Gcm9tRXVsZXIoKSBub3cgZXhwZWN0cyBhIEV1bGVyIHJvdGF0aW9uIHJhdGhlciB0aGFuIGEgVmVjdG9yMyBhbmQgb3JkZXIuJyApO1xuXG5cdFx0fVxuXG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblxuXHRcdHZhciB4ID0gZXVsZXIueCwgeSA9IGV1bGVyLnksIHogPSBldWxlci56O1xuXHRcdHZhciBhID0gTWF0aC5jb3MoIHggKSwgYiA9IE1hdGguc2luKCB4ICk7XG5cdFx0dmFyIGMgPSBNYXRoLmNvcyggeSApLCBkID0gTWF0aC5zaW4oIHkgKTtcblx0XHR2YXIgZSA9IE1hdGguY29zKCB6ICksIGYgPSBNYXRoLnNpbiggeiApO1xuXG5cdFx0aWYgKCBldWxlci5vcmRlciA9PT0gJ1hZWicgKSB7XG5cblx0XHRcdHZhciBhZSA9IGEgKiBlLCBhZiA9IGEgKiBmLCBiZSA9IGIgKiBlLCBiZiA9IGIgKiBmO1xuXG5cdFx0XHR0ZVsgMCBdID0gYyAqIGU7XG5cdFx0XHR0ZVsgNCBdID0gLSBjICogZjtcblx0XHRcdHRlWyA4IF0gPSBkO1xuXG5cdFx0XHR0ZVsgMSBdID0gYWYgKyBiZSAqIGQ7XG5cdFx0XHR0ZVsgNSBdID0gYWUgLSBiZiAqIGQ7XG5cdFx0XHR0ZVsgOSBdID0gLSBiICogYztcblxuXHRcdFx0dGVbIDIgXSA9IGJmIC0gYWUgKiBkO1xuXHRcdFx0dGVbIDYgXSA9IGJlICsgYWYgKiBkO1xuXHRcdFx0dGVbIDEwIF0gPSBhICogYztcblxuXHRcdH0gZWxzZSBpZiAoIGV1bGVyLm9yZGVyID09PSAnWVhaJyApIHtcblxuXHRcdFx0dmFyIGNlID0gYyAqIGUsIGNmID0gYyAqIGYsIGRlID0gZCAqIGUsIGRmID0gZCAqIGY7XG5cblx0XHRcdHRlWyAwIF0gPSBjZSArIGRmICogYjtcblx0XHRcdHRlWyA0IF0gPSBkZSAqIGIgLSBjZjtcblx0XHRcdHRlWyA4IF0gPSBhICogZDtcblxuXHRcdFx0dGVbIDEgXSA9IGEgKiBmO1xuXHRcdFx0dGVbIDUgXSA9IGEgKiBlO1xuXHRcdFx0dGVbIDkgXSA9IC0gYjtcblxuXHRcdFx0dGVbIDIgXSA9IGNmICogYiAtIGRlO1xuXHRcdFx0dGVbIDYgXSA9IGRmICsgY2UgKiBiO1xuXHRcdFx0dGVbIDEwIF0gPSBhICogYztcblxuXHRcdH0gZWxzZSBpZiAoIGV1bGVyLm9yZGVyID09PSAnWlhZJyApIHtcblxuXHRcdFx0dmFyIGNlID0gYyAqIGUsIGNmID0gYyAqIGYsIGRlID0gZCAqIGUsIGRmID0gZCAqIGY7XG5cblx0XHRcdHRlWyAwIF0gPSBjZSAtIGRmICogYjtcblx0XHRcdHRlWyA0IF0gPSAtIGEgKiBmO1xuXHRcdFx0dGVbIDggXSA9IGRlICsgY2YgKiBiO1xuXG5cdFx0XHR0ZVsgMSBdID0gY2YgKyBkZSAqIGI7XG5cdFx0XHR0ZVsgNSBdID0gYSAqIGU7XG5cdFx0XHR0ZVsgOSBdID0gZGYgLSBjZSAqIGI7XG5cblx0XHRcdHRlWyAyIF0gPSAtIGEgKiBkO1xuXHRcdFx0dGVbIDYgXSA9IGI7XG5cdFx0XHR0ZVsgMTAgXSA9IGEgKiBjO1xuXG5cdFx0fSBlbHNlIGlmICggZXVsZXIub3JkZXIgPT09ICdaWVgnICkge1xuXG5cdFx0XHR2YXIgYWUgPSBhICogZSwgYWYgPSBhICogZiwgYmUgPSBiICogZSwgYmYgPSBiICogZjtcblxuXHRcdFx0dGVbIDAgXSA9IGMgKiBlO1xuXHRcdFx0dGVbIDQgXSA9IGJlICogZCAtIGFmO1xuXHRcdFx0dGVbIDggXSA9IGFlICogZCArIGJmO1xuXG5cdFx0XHR0ZVsgMSBdID0gYyAqIGY7XG5cdFx0XHR0ZVsgNSBdID0gYmYgKiBkICsgYWU7XG5cdFx0XHR0ZVsgOSBdID0gYWYgKiBkIC0gYmU7XG5cblx0XHRcdHRlWyAyIF0gPSAtIGQ7XG5cdFx0XHR0ZVsgNiBdID0gYiAqIGM7XG5cdFx0XHR0ZVsgMTAgXSA9IGEgKiBjO1xuXG5cdFx0fSBlbHNlIGlmICggZXVsZXIub3JkZXIgPT09ICdZWlgnICkge1xuXG5cdFx0XHR2YXIgYWMgPSBhICogYywgYWQgPSBhICogZCwgYmMgPSBiICogYywgYmQgPSBiICogZDtcblxuXHRcdFx0dGVbIDAgXSA9IGMgKiBlO1xuXHRcdFx0dGVbIDQgXSA9IGJkIC0gYWMgKiBmO1xuXHRcdFx0dGVbIDggXSA9IGJjICogZiArIGFkO1xuXG5cdFx0XHR0ZVsgMSBdID0gZjtcblx0XHRcdHRlWyA1IF0gPSBhICogZTtcblx0XHRcdHRlWyA5IF0gPSAtIGIgKiBlO1xuXG5cdFx0XHR0ZVsgMiBdID0gLSBkICogZTtcblx0XHRcdHRlWyA2IF0gPSBhZCAqIGYgKyBiYztcblx0XHRcdHRlWyAxMCBdID0gYWMgLSBiZCAqIGY7XG5cblx0XHR9IGVsc2UgaWYgKCBldWxlci5vcmRlciA9PT0gJ1haWScgKSB7XG5cblx0XHRcdHZhciBhYyA9IGEgKiBjLCBhZCA9IGEgKiBkLCBiYyA9IGIgKiBjLCBiZCA9IGIgKiBkO1xuXG5cdFx0XHR0ZVsgMCBdID0gYyAqIGU7XG5cdFx0XHR0ZVsgNCBdID0gLSBmO1xuXHRcdFx0dGVbIDggXSA9IGQgKiBlO1xuXG5cdFx0XHR0ZVsgMSBdID0gYWMgKiBmICsgYmQ7XG5cdFx0XHR0ZVsgNSBdID0gYSAqIGU7XG5cdFx0XHR0ZVsgOSBdID0gYWQgKiBmIC0gYmM7XG5cblx0XHRcdHRlWyAyIF0gPSBiYyAqIGYgLSBhZDtcblx0XHRcdHRlWyA2IF0gPSBiICogZTtcblx0XHRcdHRlWyAxMCBdID0gYmQgKiBmICsgYWM7XG5cblx0XHR9XG5cblx0XHQvLyBsYXN0IGNvbHVtblxuXHRcdHRlWyAzIF0gPSAwO1xuXHRcdHRlWyA3IF0gPSAwO1xuXHRcdHRlWyAxMSBdID0gMDtcblxuXHRcdC8vIGJvdHRvbSByb3dcblx0XHR0ZVsgMTIgXSA9IDA7XG5cdFx0dGVbIDEzIF0gPSAwO1xuXHRcdHRlWyAxNCBdID0gMDtcblx0XHR0ZVsgMTUgXSA9IDE7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG1ha2VSb3RhdGlvbkZyb21RdWF0ZXJuaW9uOiBmdW5jdGlvbiAoIHEgKSB7XG5cblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXG5cdFx0dmFyIHggPSBxLl94LCB5ID0gcS5feSwgeiA9IHEuX3osIHcgPSBxLl93O1xuXHRcdHZhciB4MiA9IHggKyB4LCB5MiA9IHkgKyB5LCB6MiA9IHogKyB6O1xuXHRcdHZhciB4eCA9IHggKiB4MiwgeHkgPSB4ICogeTIsIHh6ID0geCAqIHoyO1xuXHRcdHZhciB5eSA9IHkgKiB5MiwgeXogPSB5ICogejIsIHp6ID0geiAqIHoyO1xuXHRcdHZhciB3eCA9IHcgKiB4Miwgd3kgPSB3ICogeTIsIHd6ID0gdyAqIHoyO1xuXG5cdFx0dGVbIDAgXSA9IDEgLSAoIHl5ICsgenogKTtcblx0XHR0ZVsgNCBdID0geHkgLSB3ejtcblx0XHR0ZVsgOCBdID0geHogKyB3eTtcblxuXHRcdHRlWyAxIF0gPSB4eSArIHd6O1xuXHRcdHRlWyA1IF0gPSAxIC0gKCB4eCArIHp6ICk7XG5cdFx0dGVbIDkgXSA9IHl6IC0gd3g7XG5cblx0XHR0ZVsgMiBdID0geHogLSB3eTtcblx0XHR0ZVsgNiBdID0geXogKyB3eDtcblx0XHR0ZVsgMTAgXSA9IDEgLSAoIHh4ICsgeXkgKTtcblxuXHRcdC8vIGxhc3QgY29sdW1uXG5cdFx0dGVbIDMgXSA9IDA7XG5cdFx0dGVbIDcgXSA9IDA7XG5cdFx0dGVbIDExIF0gPSAwO1xuXG5cdFx0Ly8gYm90dG9tIHJvd1xuXHRcdHRlWyAxMiBdID0gMDtcblx0XHR0ZVsgMTMgXSA9IDA7XG5cdFx0dGVbIDE0IF0gPSAwO1xuXHRcdHRlWyAxNSBdID0gMTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bG9va0F0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgeCA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIHkgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciB6ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBsb29rQXQoIGV5ZSwgdGFyZ2V0LCB1cCApIHtcblxuXHRcdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblxuXHRcdFx0ei5zdWJWZWN0b3JzKCBleWUsIHRhcmdldCApO1xuXG5cdFx0XHRpZiAoIHoubGVuZ3RoU3EoKSA9PT0gMCApIHtcblxuXHRcdFx0XHQvLyBleWUgYW5kIHRhcmdldCBhcmUgaW4gdGhlIHNhbWUgcG9zaXRpb25cblxuXHRcdFx0XHR6LnogPSAxO1xuXG5cdFx0XHR9XG5cblx0XHRcdHoubm9ybWFsaXplKCk7XG5cdFx0XHR4LmNyb3NzVmVjdG9ycyggdXAsIHogKTtcblxuXHRcdFx0aWYgKCB4Lmxlbmd0aFNxKCkgPT09IDAgKSB7XG5cblx0XHRcdFx0Ly8gZXllIGFuZCB0YXJnZXQgYXJlIGluIHRoZSBzYW1lIHZlcnRpY2FsXG5cblx0XHRcdFx0ei56ICs9IDAuMDAwMTtcblx0XHRcdFx0eC5jcm9zc1ZlY3RvcnMoIHVwLCB6ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0eC5ub3JtYWxpemUoKTtcblx0XHRcdHkuY3Jvc3NWZWN0b3JzKCB6LCB4ICk7XG5cblx0XHRcdHRlWyAwIF0gPSB4Lng7IHRlWyA0IF0gPSB5Lng7IHRlWyA4IF0gPSB6Lng7XG5cdFx0XHR0ZVsgMSBdID0geC55OyB0ZVsgNSBdID0geS55OyB0ZVsgOSBdID0gei55O1xuXHRcdFx0dGVbIDIgXSA9IHguejsgdGVbIDYgXSA9IHkuejsgdGVbIDEwIF0gPSB6Lno7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0bXVsdGlwbHk6IGZ1bmN0aW9uICggbSwgbiApIHtcblxuXHRcdGlmICggbiAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5NYXRyaXg0OiAubXVsdGlwbHkoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5tdWx0aXBseU1hdHJpY2VzKCBhLCBiICkgaW5zdGVhZC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5tdWx0aXBseU1hdHJpY2VzKCBtLCBuICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5tdWx0aXBseU1hdHJpY2VzKCB0aGlzLCBtICk7XG5cblx0fSxcblxuXHRwcmVtdWx0aXBseTogZnVuY3Rpb24gKCBtICkge1xuXG5cdFx0cmV0dXJuIHRoaXMubXVsdGlwbHlNYXRyaWNlcyggbSwgdGhpcyApO1xuXG5cdH0sXG5cblx0bXVsdGlwbHlNYXRyaWNlczogZnVuY3Rpb24gKCBhLCBiICkge1xuXG5cdFx0dmFyIGFlID0gYS5lbGVtZW50cztcblx0XHR2YXIgYmUgPSBiLmVsZW1lbnRzO1xuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHR2YXIgYTExID0gYWVbIDAgXSwgYTEyID0gYWVbIDQgXSwgYTEzID0gYWVbIDggXSwgYTE0ID0gYWVbIDEyIF07XG5cdFx0dmFyIGEyMSA9IGFlWyAxIF0sIGEyMiA9IGFlWyA1IF0sIGEyMyA9IGFlWyA5IF0sIGEyNCA9IGFlWyAxMyBdO1xuXHRcdHZhciBhMzEgPSBhZVsgMiBdLCBhMzIgPSBhZVsgNiBdLCBhMzMgPSBhZVsgMTAgXSwgYTM0ID0gYWVbIDE0IF07XG5cdFx0dmFyIGE0MSA9IGFlWyAzIF0sIGE0MiA9IGFlWyA3IF0sIGE0MyA9IGFlWyAxMSBdLCBhNDQgPSBhZVsgMTUgXTtcblxuXHRcdHZhciBiMTEgPSBiZVsgMCBdLCBiMTIgPSBiZVsgNCBdLCBiMTMgPSBiZVsgOCBdLCBiMTQgPSBiZVsgMTIgXTtcblx0XHR2YXIgYjIxID0gYmVbIDEgXSwgYjIyID0gYmVbIDUgXSwgYjIzID0gYmVbIDkgXSwgYjI0ID0gYmVbIDEzIF07XG5cdFx0dmFyIGIzMSA9IGJlWyAyIF0sIGIzMiA9IGJlWyA2IF0sIGIzMyA9IGJlWyAxMCBdLCBiMzQgPSBiZVsgMTQgXTtcblx0XHR2YXIgYjQxID0gYmVbIDMgXSwgYjQyID0gYmVbIDcgXSwgYjQzID0gYmVbIDExIF0sIGI0NCA9IGJlWyAxNSBdO1xuXG5cdFx0dGVbIDAgXSA9IGExMSAqIGIxMSArIGExMiAqIGIyMSArIGExMyAqIGIzMSArIGExNCAqIGI0MTtcblx0XHR0ZVsgNCBdID0gYTExICogYjEyICsgYTEyICogYjIyICsgYTEzICogYjMyICsgYTE0ICogYjQyO1xuXHRcdHRlWyA4IF0gPSBhMTEgKiBiMTMgKyBhMTIgKiBiMjMgKyBhMTMgKiBiMzMgKyBhMTQgKiBiNDM7XG5cdFx0dGVbIDEyIF0gPSBhMTEgKiBiMTQgKyBhMTIgKiBiMjQgKyBhMTMgKiBiMzQgKyBhMTQgKiBiNDQ7XG5cblx0XHR0ZVsgMSBdID0gYTIxICogYjExICsgYTIyICogYjIxICsgYTIzICogYjMxICsgYTI0ICogYjQxO1xuXHRcdHRlWyA1IF0gPSBhMjEgKiBiMTIgKyBhMjIgKiBiMjIgKyBhMjMgKiBiMzIgKyBhMjQgKiBiNDI7XG5cdFx0dGVbIDkgXSA9IGEyMSAqIGIxMyArIGEyMiAqIGIyMyArIGEyMyAqIGIzMyArIGEyNCAqIGI0Mztcblx0XHR0ZVsgMTMgXSA9IGEyMSAqIGIxNCArIGEyMiAqIGIyNCArIGEyMyAqIGIzNCArIGEyNCAqIGI0NDtcblxuXHRcdHRlWyAyIF0gPSBhMzEgKiBiMTEgKyBhMzIgKiBiMjEgKyBhMzMgKiBiMzEgKyBhMzQgKiBiNDE7XG5cdFx0dGVbIDYgXSA9IGEzMSAqIGIxMiArIGEzMiAqIGIyMiArIGEzMyAqIGIzMiArIGEzNCAqIGI0Mjtcblx0XHR0ZVsgMTAgXSA9IGEzMSAqIGIxMyArIGEzMiAqIGIyMyArIGEzMyAqIGIzMyArIGEzNCAqIGI0Mztcblx0XHR0ZVsgMTQgXSA9IGEzMSAqIGIxNCArIGEzMiAqIGIyNCArIGEzMyAqIGIzNCArIGEzNCAqIGI0NDtcblxuXHRcdHRlWyAzIF0gPSBhNDEgKiBiMTEgKyBhNDIgKiBiMjEgKyBhNDMgKiBiMzEgKyBhNDQgKiBiNDE7XG5cdFx0dGVbIDcgXSA9IGE0MSAqIGIxMiArIGE0MiAqIGIyMiArIGE0MyAqIGIzMiArIGE0NCAqIGI0Mjtcblx0XHR0ZVsgMTEgXSA9IGE0MSAqIGIxMyArIGE0MiAqIGIyMyArIGE0MyAqIGIzMyArIGE0NCAqIGI0Mztcblx0XHR0ZVsgMTUgXSA9IGE0MSAqIGIxNCArIGE0MiAqIGIyNCArIGE0MyAqIGIzNCArIGE0NCAqIGI0NDtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bXVsdGlwbHlTY2FsYXI6IGZ1bmN0aW9uICggcyApIHtcblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHR0ZVsgMCBdICo9IHM7IHRlWyA0IF0gKj0gczsgdGVbIDggXSAqPSBzOyB0ZVsgMTIgXSAqPSBzO1xuXHRcdHRlWyAxIF0gKj0gczsgdGVbIDUgXSAqPSBzOyB0ZVsgOSBdICo9IHM7IHRlWyAxMyBdICo9IHM7XG5cdFx0dGVbIDIgXSAqPSBzOyB0ZVsgNiBdICo9IHM7IHRlWyAxMCBdICo9IHM7IHRlWyAxNCBdICo9IHM7XG5cdFx0dGVbIDMgXSAqPSBzOyB0ZVsgNyBdICo9IHM7IHRlWyAxMSBdICo9IHM7IHRlWyAxNSBdICo9IHM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFwcGx5VG9CdWZmZXJBdHRyaWJ1dGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gYXBwbHlUb0J1ZmZlckF0dHJpYnV0ZSggYXR0cmlidXRlICkge1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBhdHRyaWJ1dGUuY291bnQ7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdHYxLnggPSBhdHRyaWJ1dGUuZ2V0WCggaSApO1xuXHRcdFx0XHR2MS55ID0gYXR0cmlidXRlLmdldFkoIGkgKTtcblx0XHRcdFx0djEueiA9IGF0dHJpYnV0ZS5nZXRaKCBpICk7XG5cblx0XHRcdFx0djEuYXBwbHlNYXRyaXg0KCB0aGlzICk7XG5cblx0XHRcdFx0YXR0cmlidXRlLnNldFhZWiggaSwgdjEueCwgdjEueSwgdjEueiApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBhdHRyaWJ1dGU7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRkZXRlcm1pbmFudDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblxuXHRcdHZhciBuMTEgPSB0ZVsgMCBdLCBuMTIgPSB0ZVsgNCBdLCBuMTMgPSB0ZVsgOCBdLCBuMTQgPSB0ZVsgMTIgXTtcblx0XHR2YXIgbjIxID0gdGVbIDEgXSwgbjIyID0gdGVbIDUgXSwgbjIzID0gdGVbIDkgXSwgbjI0ID0gdGVbIDEzIF07XG5cdFx0dmFyIG4zMSA9IHRlWyAyIF0sIG4zMiA9IHRlWyA2IF0sIG4zMyA9IHRlWyAxMCBdLCBuMzQgPSB0ZVsgMTQgXTtcblx0XHR2YXIgbjQxID0gdGVbIDMgXSwgbjQyID0gdGVbIDcgXSwgbjQzID0gdGVbIDExIF0sIG40NCA9IHRlWyAxNSBdO1xuXG5cdFx0Ly9UT0RPOiBtYWtlIHRoaXMgbW9yZSBlZmZpY2llbnRcblx0XHQvLyggYmFzZWQgb24gaHR0cDovL3d3dy5ldWNsaWRlYW5zcGFjZS5jb20vbWF0aHMvYWxnZWJyYS9tYXRyaXgvZnVuY3Rpb25zL2ludmVyc2UvZm91ckQvaW5kZXguaHRtIClcblxuXHRcdHJldHVybiAoXG5cdFx0XHRuNDEgKiAoXG5cdFx0XHRcdCsgbjE0ICogbjIzICogbjMyXG5cdFx0XHRcdCAtIG4xMyAqIG4yNCAqIG4zMlxuXHRcdFx0XHQgLSBuMTQgKiBuMjIgKiBuMzNcblx0XHRcdFx0ICsgbjEyICogbjI0ICogbjMzXG5cdFx0XHRcdCArIG4xMyAqIG4yMiAqIG4zNFxuXHRcdFx0XHQgLSBuMTIgKiBuMjMgKiBuMzRcblx0XHRcdCkgK1xuXHRcdFx0bjQyICogKFxuXHRcdFx0XHQrIG4xMSAqIG4yMyAqIG4zNFxuXHRcdFx0XHQgLSBuMTEgKiBuMjQgKiBuMzNcblx0XHRcdFx0ICsgbjE0ICogbjIxICogbjMzXG5cdFx0XHRcdCAtIG4xMyAqIG4yMSAqIG4zNFxuXHRcdFx0XHQgKyBuMTMgKiBuMjQgKiBuMzFcblx0XHRcdFx0IC0gbjE0ICogbjIzICogbjMxXG5cdFx0XHQpICtcblx0XHRcdG40MyAqIChcblx0XHRcdFx0KyBuMTEgKiBuMjQgKiBuMzJcblx0XHRcdFx0IC0gbjExICogbjIyICogbjM0XG5cdFx0XHRcdCAtIG4xNCAqIG4yMSAqIG4zMlxuXHRcdFx0XHQgKyBuMTIgKiBuMjEgKiBuMzRcblx0XHRcdFx0ICsgbjE0ICogbjIyICogbjMxXG5cdFx0XHRcdCAtIG4xMiAqIG4yNCAqIG4zMVxuXHRcdFx0KSArXG5cdFx0XHRuNDQgKiAoXG5cdFx0XHRcdC0gbjEzICogbjIyICogbjMxXG5cdFx0XHRcdCAtIG4xMSAqIG4yMyAqIG4zMlxuXHRcdFx0XHQgKyBuMTEgKiBuMjIgKiBuMzNcblx0XHRcdFx0ICsgbjEzICogbjIxICogbjMyXG5cdFx0XHRcdCAtIG4xMiAqIG4yMSAqIG4zM1xuXHRcdFx0XHQgKyBuMTIgKiBuMjMgKiBuMzFcblx0XHRcdClcblxuXHRcdCk7XG5cblx0fSxcblxuXHR0cmFuc3Bvc2U6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cdFx0dmFyIHRtcDtcblxuXHRcdHRtcCA9IHRlWyAxIF07IHRlWyAxIF0gPSB0ZVsgNCBdOyB0ZVsgNCBdID0gdG1wO1xuXHRcdHRtcCA9IHRlWyAyIF07IHRlWyAyIF0gPSB0ZVsgOCBdOyB0ZVsgOCBdID0gdG1wO1xuXHRcdHRtcCA9IHRlWyA2IF07IHRlWyA2IF0gPSB0ZVsgOSBdOyB0ZVsgOSBdID0gdG1wO1xuXG5cdFx0dG1wID0gdGVbIDMgXTsgdGVbIDMgXSA9IHRlWyAxMiBdOyB0ZVsgMTIgXSA9IHRtcDtcblx0XHR0bXAgPSB0ZVsgNyBdOyB0ZVsgNyBdID0gdGVbIDEzIF07IHRlWyAxMyBdID0gdG1wO1xuXHRcdHRtcCA9IHRlWyAxMSBdOyB0ZVsgMTEgXSA9IHRlWyAxNCBdOyB0ZVsgMTQgXSA9IHRtcDtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0UG9zaXRpb246IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHR0ZVsgMTIgXSA9IHYueDtcblx0XHR0ZVsgMTMgXSA9IHYueTtcblx0XHR0ZVsgMTQgXSA9IHYuejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Z2V0SW52ZXJzZTogZnVuY3Rpb24gKCBtLCB0aHJvd09uRGVnZW5lcmF0ZSApIHtcblxuXHRcdC8vIGJhc2VkIG9uIGh0dHA6Ly93d3cuZXVjbGlkZWFuc3BhY2UuY29tL21hdGhzL2FsZ2VicmEvbWF0cml4L2Z1bmN0aW9ucy9pbnZlcnNlL2ZvdXJEL2luZGV4Lmh0bVxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHMsXG5cdFx0XHRtZSA9IG0uZWxlbWVudHMsXG5cblx0XHRcdG4xMSA9IG1lWyAwIF0sIG4yMSA9IG1lWyAxIF0sIG4zMSA9IG1lWyAyIF0sIG40MSA9IG1lWyAzIF0sXG5cdFx0XHRuMTIgPSBtZVsgNCBdLCBuMjIgPSBtZVsgNSBdLCBuMzIgPSBtZVsgNiBdLCBuNDIgPSBtZVsgNyBdLFxuXHRcdFx0bjEzID0gbWVbIDggXSwgbjIzID0gbWVbIDkgXSwgbjMzID0gbWVbIDEwIF0sIG40MyA9IG1lWyAxMSBdLFxuXHRcdFx0bjE0ID0gbWVbIDEyIF0sIG4yNCA9IG1lWyAxMyBdLCBuMzQgPSBtZVsgMTQgXSwgbjQ0ID0gbWVbIDE1IF0sXG5cblx0XHRcdHQxMSA9IG4yMyAqIG4zNCAqIG40MiAtIG4yNCAqIG4zMyAqIG40MiArIG4yNCAqIG4zMiAqIG40MyAtIG4yMiAqIG4zNCAqIG40MyAtIG4yMyAqIG4zMiAqIG40NCArIG4yMiAqIG4zMyAqIG40NCxcblx0XHRcdHQxMiA9IG4xNCAqIG4zMyAqIG40MiAtIG4xMyAqIG4zNCAqIG40MiAtIG4xNCAqIG4zMiAqIG40MyArIG4xMiAqIG4zNCAqIG40MyArIG4xMyAqIG4zMiAqIG40NCAtIG4xMiAqIG4zMyAqIG40NCxcblx0XHRcdHQxMyA9IG4xMyAqIG4yNCAqIG40MiAtIG4xNCAqIG4yMyAqIG40MiArIG4xNCAqIG4yMiAqIG40MyAtIG4xMiAqIG4yNCAqIG40MyAtIG4xMyAqIG4yMiAqIG40NCArIG4xMiAqIG4yMyAqIG40NCxcblx0XHRcdHQxNCA9IG4xNCAqIG4yMyAqIG4zMiAtIG4xMyAqIG4yNCAqIG4zMiAtIG4xNCAqIG4yMiAqIG4zMyArIG4xMiAqIG4yNCAqIG4zMyArIG4xMyAqIG4yMiAqIG4zNCAtIG4xMiAqIG4yMyAqIG4zNDtcblxuXHRcdHZhciBkZXQgPSBuMTEgKiB0MTEgKyBuMjEgKiB0MTIgKyBuMzEgKiB0MTMgKyBuNDEgKiB0MTQ7XG5cblx0XHRpZiAoIGRldCA9PT0gMCApIHtcblxuXHRcdFx0dmFyIG1zZyA9IFwiVEhSRUUuTWF0cml4NC5nZXRJbnZlcnNlKCk6IGNhbid0IGludmVydCBtYXRyaXgsIGRldGVybWluYW50IGlzIDBcIjtcblxuXHRcdFx0aWYgKCB0aHJvd09uRGVnZW5lcmF0ZSA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoIG1zZyApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggbXNnICk7XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRoaXMuaWRlbnRpdHkoKTtcblxuXHRcdH1cblxuXHRcdHZhciBkZXRJbnYgPSAxIC8gZGV0O1xuXG5cdFx0dGVbIDAgXSA9IHQxMSAqIGRldEludjtcblx0XHR0ZVsgMSBdID0gKCBuMjQgKiBuMzMgKiBuNDEgLSBuMjMgKiBuMzQgKiBuNDEgLSBuMjQgKiBuMzEgKiBuNDMgKyBuMjEgKiBuMzQgKiBuNDMgKyBuMjMgKiBuMzEgKiBuNDQgLSBuMjEgKiBuMzMgKiBuNDQgKSAqIGRldEludjtcblx0XHR0ZVsgMiBdID0gKCBuMjIgKiBuMzQgKiBuNDEgLSBuMjQgKiBuMzIgKiBuNDEgKyBuMjQgKiBuMzEgKiBuNDIgLSBuMjEgKiBuMzQgKiBuNDIgLSBuMjIgKiBuMzEgKiBuNDQgKyBuMjEgKiBuMzIgKiBuNDQgKSAqIGRldEludjtcblx0XHR0ZVsgMyBdID0gKCBuMjMgKiBuMzIgKiBuNDEgLSBuMjIgKiBuMzMgKiBuNDEgLSBuMjMgKiBuMzEgKiBuNDIgKyBuMjEgKiBuMzMgKiBuNDIgKyBuMjIgKiBuMzEgKiBuNDMgLSBuMjEgKiBuMzIgKiBuNDMgKSAqIGRldEludjtcblxuXHRcdHRlWyA0IF0gPSB0MTIgKiBkZXRJbnY7XG5cdFx0dGVbIDUgXSA9ICggbjEzICogbjM0ICogbjQxIC0gbjE0ICogbjMzICogbjQxICsgbjE0ICogbjMxICogbjQzIC0gbjExICogbjM0ICogbjQzIC0gbjEzICogbjMxICogbjQ0ICsgbjExICogbjMzICogbjQ0ICkgKiBkZXRJbnY7XG5cdFx0dGVbIDYgXSA9ICggbjE0ICogbjMyICogbjQxIC0gbjEyICogbjM0ICogbjQxIC0gbjE0ICogbjMxICogbjQyICsgbjExICogbjM0ICogbjQyICsgbjEyICogbjMxICogbjQ0IC0gbjExICogbjMyICogbjQ0ICkgKiBkZXRJbnY7XG5cdFx0dGVbIDcgXSA9ICggbjEyICogbjMzICogbjQxIC0gbjEzICogbjMyICogbjQxICsgbjEzICogbjMxICogbjQyIC0gbjExICogbjMzICogbjQyIC0gbjEyICogbjMxICogbjQzICsgbjExICogbjMyICogbjQzICkgKiBkZXRJbnY7XG5cblx0XHR0ZVsgOCBdID0gdDEzICogZGV0SW52O1xuXHRcdHRlWyA5IF0gPSAoIG4xNCAqIG4yMyAqIG40MSAtIG4xMyAqIG4yNCAqIG40MSAtIG4xNCAqIG4yMSAqIG40MyArIG4xMSAqIG4yNCAqIG40MyArIG4xMyAqIG4yMSAqIG40NCAtIG4xMSAqIG4yMyAqIG40NCApICogZGV0SW52O1xuXHRcdHRlWyAxMCBdID0gKCBuMTIgKiBuMjQgKiBuNDEgLSBuMTQgKiBuMjIgKiBuNDEgKyBuMTQgKiBuMjEgKiBuNDIgLSBuMTEgKiBuMjQgKiBuNDIgLSBuMTIgKiBuMjEgKiBuNDQgKyBuMTEgKiBuMjIgKiBuNDQgKSAqIGRldEludjtcblx0XHR0ZVsgMTEgXSA9ICggbjEzICogbjIyICogbjQxIC0gbjEyICogbjIzICogbjQxIC0gbjEzICogbjIxICogbjQyICsgbjExICogbjIzICogbjQyICsgbjEyICogbjIxICogbjQzIC0gbjExICogbjIyICogbjQzICkgKiBkZXRJbnY7XG5cblx0XHR0ZVsgMTIgXSA9IHQxNCAqIGRldEludjtcblx0XHR0ZVsgMTMgXSA9ICggbjEzICogbjI0ICogbjMxIC0gbjE0ICogbjIzICogbjMxICsgbjE0ICogbjIxICogbjMzIC0gbjExICogbjI0ICogbjMzIC0gbjEzICogbjIxICogbjM0ICsgbjExICogbjIzICogbjM0ICkgKiBkZXRJbnY7XG5cdFx0dGVbIDE0IF0gPSAoIG4xNCAqIG4yMiAqIG4zMSAtIG4xMiAqIG4yNCAqIG4zMSAtIG4xNCAqIG4yMSAqIG4zMiArIG4xMSAqIG4yNCAqIG4zMiArIG4xMiAqIG4yMSAqIG4zNCAtIG4xMSAqIG4yMiAqIG4zNCApICogZGV0SW52O1xuXHRcdHRlWyAxNSBdID0gKCBuMTIgKiBuMjMgKiBuMzEgLSBuMTMgKiBuMjIgKiBuMzEgKyBuMTMgKiBuMjEgKiBuMzIgLSBuMTEgKiBuMjMgKiBuMzIgLSBuMTIgKiBuMjEgKiBuMzMgKyBuMTEgKiBuMjIgKiBuMzMgKSAqIGRldEludjtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2NhbGU6IGZ1bmN0aW9uICggdiApIHtcblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cdFx0dmFyIHggPSB2LngsIHkgPSB2LnksIHogPSB2Lno7XG5cblx0XHR0ZVsgMCBdICo9IHg7IHRlWyA0IF0gKj0geTsgdGVbIDggXSAqPSB6O1xuXHRcdHRlWyAxIF0gKj0geDsgdGVbIDUgXSAqPSB5OyB0ZVsgOSBdICo9IHo7XG5cdFx0dGVbIDIgXSAqPSB4OyB0ZVsgNiBdICo9IHk7IHRlWyAxMCBdICo9IHo7XG5cdFx0dGVbIDMgXSAqPSB4OyB0ZVsgNyBdICo9IHk7IHRlWyAxMSBdICo9IHo7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGdldE1heFNjYWxlT25BeGlzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXG5cdFx0dmFyIHNjYWxlWFNxID0gdGVbIDAgXSAqIHRlWyAwIF0gKyB0ZVsgMSBdICogdGVbIDEgXSArIHRlWyAyIF0gKiB0ZVsgMiBdO1xuXHRcdHZhciBzY2FsZVlTcSA9IHRlWyA0IF0gKiB0ZVsgNCBdICsgdGVbIDUgXSAqIHRlWyA1IF0gKyB0ZVsgNiBdICogdGVbIDYgXTtcblx0XHR2YXIgc2NhbGVaU3EgPSB0ZVsgOCBdICogdGVbIDggXSArIHRlWyA5IF0gKiB0ZVsgOSBdICsgdGVbIDEwIF0gKiB0ZVsgMTAgXTtcblxuXHRcdHJldHVybiBNYXRoLnNxcnQoIE1hdGgubWF4KCBzY2FsZVhTcSwgc2NhbGVZU3EsIHNjYWxlWlNxICkgKTtcblxuXHR9LFxuXG5cdG1ha2VUcmFuc2xhdGlvbjogZnVuY3Rpb24gKCB4LCB5LCB6ICkge1xuXG5cdFx0dGhpcy5zZXQoXG5cblx0XHRcdDEsIDAsIDAsIHgsXG5cdFx0XHQwLCAxLCAwLCB5LFxuXHRcdFx0MCwgMCwgMSwgeixcblx0XHRcdDAsIDAsIDAsIDFcblxuXHRcdCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG1ha2VSb3RhdGlvblg6IGZ1bmN0aW9uICggdGhldGEgKSB7XG5cblx0XHR2YXIgYyA9IE1hdGguY29zKCB0aGV0YSApLCBzID0gTWF0aC5zaW4oIHRoZXRhICk7XG5cblx0XHR0aGlzLnNldChcblxuXHRcdFx0MSwgMCwgIDAsIDAsXG5cdFx0XHQwLCBjLCAtIHMsIDAsXG5cdFx0XHQwLCBzLCAgYywgMCxcblx0XHRcdDAsIDAsICAwLCAxXG5cblx0XHQpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtYWtlUm90YXRpb25ZOiBmdW5jdGlvbiAoIHRoZXRhICkge1xuXG5cdFx0dmFyIGMgPSBNYXRoLmNvcyggdGhldGEgKSwgcyA9IE1hdGguc2luKCB0aGV0YSApO1xuXG5cdFx0dGhpcy5zZXQoXG5cblx0XHRcdCBjLCAwLCBzLCAwLFxuXHRcdFx0IDAsIDEsIDAsIDAsXG5cdFx0XHQtIHMsIDAsIGMsIDAsXG5cdFx0XHQgMCwgMCwgMCwgMVxuXG5cdFx0KTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bWFrZVJvdGF0aW9uWjogZnVuY3Rpb24gKCB0aGV0YSApIHtcblxuXHRcdHZhciBjID0gTWF0aC5jb3MoIHRoZXRhICksIHMgPSBNYXRoLnNpbiggdGhldGEgKTtcblxuXHRcdHRoaXMuc2V0KFxuXG5cdFx0XHRjLCAtIHMsIDAsIDAsXG5cdFx0XHRzLCAgYywgMCwgMCxcblx0XHRcdDAsICAwLCAxLCAwLFxuXHRcdFx0MCwgIDAsIDAsIDFcblxuXHRcdCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG1ha2VSb3RhdGlvbkF4aXM6IGZ1bmN0aW9uICggYXhpcywgYW5nbGUgKSB7XG5cblx0XHQvLyBCYXNlZCBvbiBodHRwOi8vd3d3LmdhbWVkZXYubmV0L3JlZmVyZW5jZS9hcnRpY2xlcy9hcnRpY2xlMTE5OS5hc3BcblxuXHRcdHZhciBjID0gTWF0aC5jb3MoIGFuZ2xlICk7XG5cdFx0dmFyIHMgPSBNYXRoLnNpbiggYW5nbGUgKTtcblx0XHR2YXIgdCA9IDEgLSBjO1xuXHRcdHZhciB4ID0gYXhpcy54LCB5ID0gYXhpcy55LCB6ID0gYXhpcy56O1xuXHRcdHZhciB0eCA9IHQgKiB4LCB0eSA9IHQgKiB5O1xuXG5cdFx0dGhpcy5zZXQoXG5cblx0XHRcdHR4ICogeCArIGMsIHR4ICogeSAtIHMgKiB6LCB0eCAqIHogKyBzICogeSwgMCxcblx0XHRcdHR4ICogeSArIHMgKiB6LCB0eSAqIHkgKyBjLCB0eSAqIHogLSBzICogeCwgMCxcblx0XHRcdHR4ICogeiAtIHMgKiB5LCB0eSAqIHogKyBzICogeCwgdCAqIHogKiB6ICsgYywgMCxcblx0XHRcdDAsIDAsIDAsIDFcblxuXHRcdCk7XG5cblx0XHQgcmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtYWtlU2NhbGU6IGZ1bmN0aW9uICggeCwgeSwgeiApIHtcblxuXHRcdHRoaXMuc2V0KFxuXG5cdFx0XHR4LCAwLCAwLCAwLFxuXHRcdFx0MCwgeSwgMCwgMCxcblx0XHRcdDAsIDAsIHosIDAsXG5cdFx0XHQwLCAwLCAwLCAxXG5cblx0XHQpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtYWtlU2hlYXI6IGZ1bmN0aW9uICggeCwgeSwgeiApIHtcblxuXHRcdHRoaXMuc2V0KFxuXG5cdFx0XHQxLCB5LCB6LCAwLFxuXHRcdFx0eCwgMSwgeiwgMCxcblx0XHRcdHgsIHksIDEsIDAsXG5cdFx0XHQwLCAwLCAwLCAxXG5cblx0XHQpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjb21wb3NlOiBmdW5jdGlvbiAoIHBvc2l0aW9uLCBxdWF0ZXJuaW9uLCBzY2FsZSApIHtcblxuXHRcdHRoaXMubWFrZVJvdGF0aW9uRnJvbVF1YXRlcm5pb24oIHF1YXRlcm5pb24gKTtcblx0XHR0aGlzLnNjYWxlKCBzY2FsZSApO1xuXHRcdHRoaXMuc2V0UG9zaXRpb24oIHBvc2l0aW9uICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGRlY29tcG9zZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHZlY3RvciA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIG1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gZGVjb21wb3NlKCBwb3NpdGlvbiwgcXVhdGVybmlvbiwgc2NhbGUgKSB7XG5cblx0XHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHRcdHZhciBzeCA9IHZlY3Rvci5zZXQoIHRlWyAwIF0sIHRlWyAxIF0sIHRlWyAyIF0gKS5sZW5ndGgoKTtcblx0XHRcdHZhciBzeSA9IHZlY3Rvci5zZXQoIHRlWyA0IF0sIHRlWyA1IF0sIHRlWyA2IF0gKS5sZW5ndGgoKTtcblx0XHRcdHZhciBzeiA9IHZlY3Rvci5zZXQoIHRlWyA4IF0sIHRlWyA5IF0sIHRlWyAxMCBdICkubGVuZ3RoKCk7XG5cblx0XHRcdC8vIGlmIGRldGVybWluZSBpcyBuZWdhdGl2ZSwgd2UgbmVlZCB0byBpbnZlcnQgb25lIHNjYWxlXG5cdFx0XHR2YXIgZGV0ID0gdGhpcy5kZXRlcm1pbmFudCgpO1xuXHRcdFx0aWYgKCBkZXQgPCAwICkgc3ggPSAtIHN4O1xuXG5cdFx0XHRwb3NpdGlvbi54ID0gdGVbIDEyIF07XG5cdFx0XHRwb3NpdGlvbi55ID0gdGVbIDEzIF07XG5cdFx0XHRwb3NpdGlvbi56ID0gdGVbIDE0IF07XG5cblx0XHRcdC8vIHNjYWxlIHRoZSByb3RhdGlvbiBwYXJ0XG5cdFx0XHRtYXRyaXguY29weSggdGhpcyApO1xuXG5cdFx0XHR2YXIgaW52U1ggPSAxIC8gc3g7XG5cdFx0XHR2YXIgaW52U1kgPSAxIC8gc3k7XG5cdFx0XHR2YXIgaW52U1ogPSAxIC8gc3o7XG5cblx0XHRcdG1hdHJpeC5lbGVtZW50c1sgMCBdICo9IGludlNYO1xuXHRcdFx0bWF0cml4LmVsZW1lbnRzWyAxIF0gKj0gaW52U1g7XG5cdFx0XHRtYXRyaXguZWxlbWVudHNbIDIgXSAqPSBpbnZTWDtcblxuXHRcdFx0bWF0cml4LmVsZW1lbnRzWyA0IF0gKj0gaW52U1k7XG5cdFx0XHRtYXRyaXguZWxlbWVudHNbIDUgXSAqPSBpbnZTWTtcblx0XHRcdG1hdHJpeC5lbGVtZW50c1sgNiBdICo9IGludlNZO1xuXG5cdFx0XHRtYXRyaXguZWxlbWVudHNbIDggXSAqPSBpbnZTWjtcblx0XHRcdG1hdHJpeC5lbGVtZW50c1sgOSBdICo9IGludlNaO1xuXHRcdFx0bWF0cml4LmVsZW1lbnRzWyAxMCBdICo9IGludlNaO1xuXG5cdFx0XHRxdWF0ZXJuaW9uLnNldEZyb21Sb3RhdGlvbk1hdHJpeCggbWF0cml4ICk7XG5cblx0XHRcdHNjYWxlLnggPSBzeDtcblx0XHRcdHNjYWxlLnkgPSBzeTtcblx0XHRcdHNjYWxlLnogPSBzejtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRtYWtlUGVyc3BlY3RpdmU6IGZ1bmN0aW9uICggbGVmdCwgcmlnaHQsIHRvcCwgYm90dG9tLCBuZWFyLCBmYXIgKSB7XG5cblx0XHRpZiAoIGZhciA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5NYXRyaXg0OiAubWFrZVBlcnNwZWN0aXZlKCkgaGFzIGJlZW4gcmVkZWZpbmVkIGFuZCBoYXMgYSBuZXcgc2lnbmF0dXJlLiBQbGVhc2UgY2hlY2sgdGhlIGRvY3MuJyApO1xuXG5cdFx0fVxuXG5cdFx0dmFyIHRlID0gdGhpcy5lbGVtZW50cztcblx0XHR2YXIgeCA9IDIgKiBuZWFyIC8gKCByaWdodCAtIGxlZnQgKTtcblx0XHR2YXIgeSA9IDIgKiBuZWFyIC8gKCB0b3AgLSBib3R0b20gKTtcblxuXHRcdHZhciBhID0gKCByaWdodCArIGxlZnQgKSAvICggcmlnaHQgLSBsZWZ0ICk7XG5cdFx0dmFyIGIgPSAoIHRvcCArIGJvdHRvbSApIC8gKCB0b3AgLSBib3R0b20gKTtcblx0XHR2YXIgYyA9IC0gKCBmYXIgKyBuZWFyICkgLyAoIGZhciAtIG5lYXIgKTtcblx0XHR2YXIgZCA9IC0gMiAqIGZhciAqIG5lYXIgLyAoIGZhciAtIG5lYXIgKTtcblxuXHRcdHRlWyAwIF0gPSB4O1x0dGVbIDQgXSA9IDA7XHR0ZVsgOCBdID0gYTtcdHRlWyAxMiBdID0gMDtcblx0XHR0ZVsgMSBdID0gMDtcdHRlWyA1IF0gPSB5O1x0dGVbIDkgXSA9IGI7XHR0ZVsgMTMgXSA9IDA7XG5cdFx0dGVbIDIgXSA9IDA7XHR0ZVsgNiBdID0gMDtcdHRlWyAxMCBdID0gYztcdHRlWyAxNCBdID0gZDtcblx0XHR0ZVsgMyBdID0gMDtcdHRlWyA3IF0gPSAwO1x0dGVbIDExIF0gPSAtIDE7XHR0ZVsgMTUgXSA9IDA7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG1ha2VPcnRob2dyYXBoaWM6IGZ1bmN0aW9uICggbGVmdCwgcmlnaHQsIHRvcCwgYm90dG9tLCBuZWFyLCBmYXIgKSB7XG5cblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXHRcdHZhciB3ID0gMS4wIC8gKCByaWdodCAtIGxlZnQgKTtcblx0XHR2YXIgaCA9IDEuMCAvICggdG9wIC0gYm90dG9tICk7XG5cdFx0dmFyIHAgPSAxLjAgLyAoIGZhciAtIG5lYXIgKTtcblxuXHRcdHZhciB4ID0gKCByaWdodCArIGxlZnQgKSAqIHc7XG5cdFx0dmFyIHkgPSAoIHRvcCArIGJvdHRvbSApICogaDtcblx0XHR2YXIgeiA9ICggZmFyICsgbmVhciApICogcDtcblxuXHRcdHRlWyAwIF0gPSAyICogdztcdHRlWyA0IF0gPSAwO1x0dGVbIDggXSA9IDA7XHR0ZVsgMTIgXSA9IC0geDtcblx0XHR0ZVsgMSBdID0gMDtcdHRlWyA1IF0gPSAyICogaDtcdHRlWyA5IF0gPSAwO1x0dGVbIDEzIF0gPSAtIHk7XG5cdFx0dGVbIDIgXSA9IDA7XHR0ZVsgNiBdID0gMDtcdHRlWyAxMCBdID0gLSAyICogcDtcdHRlWyAxNCBdID0gLSB6O1xuXHRcdHRlWyAzIF0gPSAwO1x0dGVbIDcgXSA9IDA7XHR0ZVsgMTEgXSA9IDA7XHR0ZVsgMTUgXSA9IDE7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGVxdWFsczogZnVuY3Rpb24gKCBtYXRyaXggKSB7XG5cblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXHRcdHZhciBtZSA9IG1hdHJpeC5lbGVtZW50cztcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IDE2OyBpICsrICkge1xuXG5cdFx0XHRpZiAoIHRlWyBpIF0gIT09IG1lWyBpIF0gKSByZXR1cm4gZmFsc2U7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblxuXHR9LFxuXG5cdGZyb21BcnJheTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0aWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCAxNjsgaSArKyApIHtcblxuXHRcdFx0dGhpcy5lbGVtZW50c1sgaSBdID0gYXJyYXlbIGkgKyBvZmZzZXQgXTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dG9BcnJheTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0aWYgKCBhcnJheSA9PT0gdW5kZWZpbmVkICkgYXJyYXkgPSBbXTtcblx0XHRpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0gMDtcblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHRhcnJheVsgb2Zmc2V0IF0gPSB0ZVsgMCBdO1xuXHRcdGFycmF5WyBvZmZzZXQgKyAxIF0gPSB0ZVsgMSBdO1xuXHRcdGFycmF5WyBvZmZzZXQgKyAyIF0gPSB0ZVsgMiBdO1xuXHRcdGFycmF5WyBvZmZzZXQgKyAzIF0gPSB0ZVsgMyBdO1xuXG5cdFx0YXJyYXlbIG9mZnNldCArIDQgXSA9IHRlWyA0IF07XG5cdFx0YXJyYXlbIG9mZnNldCArIDUgXSA9IHRlWyA1IF07XG5cdFx0YXJyYXlbIG9mZnNldCArIDYgXSA9IHRlWyA2IF07XG5cdFx0YXJyYXlbIG9mZnNldCArIDcgXSA9IHRlWyA3IF07XG5cblx0XHRhcnJheVsgb2Zmc2V0ICsgOCBdID0gdGVbIDggXTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgOSBdID0gdGVbIDkgXTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMTAgXSA9IHRlWyAxMCBdO1xuXHRcdGFycmF5WyBvZmZzZXQgKyAxMSBdID0gdGVbIDExIF07XG5cblx0XHRhcnJheVsgb2Zmc2V0ICsgMTIgXSA9IHRlWyAxMiBdO1xuXHRcdGFycmF5WyBvZmZzZXQgKyAxMyBdID0gdGVbIDEzIF07XG5cdFx0YXJyYXlbIG9mZnNldCArIDE0IF0gPSB0ZVsgMTQgXTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMTUgXSA9IHRlWyAxNSBdO1xuXG5cdFx0cmV0dXJuIGFycmF5O1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKi9cblxuZnVuY3Rpb24gRGF0YVRleHR1cmUoIGRhdGEsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdHlwZSwgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIsIG1pbkZpbHRlciwgYW5pc290cm9weSwgZW5jb2RpbmcgKSB7XG5cblx0VGV4dHVyZS5jYWxsKCB0aGlzLCBudWxsLCBtYXBwaW5nLCB3cmFwUywgd3JhcFQsIG1hZ0ZpbHRlciwgbWluRmlsdGVyLCBmb3JtYXQsIHR5cGUsIGFuaXNvdHJvcHksIGVuY29kaW5nICk7XG5cblx0dGhpcy5pbWFnZSA9IHsgZGF0YTogZGF0YSwgd2lkdGg6IHdpZHRoLCBoZWlnaHQ6IGhlaWdodCB9O1xuXG5cdHRoaXMubWFnRmlsdGVyID0gbWFnRmlsdGVyICE9PSB1bmRlZmluZWQgPyBtYWdGaWx0ZXIgOiBOZWFyZXN0RmlsdGVyO1xuXHR0aGlzLm1pbkZpbHRlciA9IG1pbkZpbHRlciAhPT0gdW5kZWZpbmVkID8gbWluRmlsdGVyIDogTmVhcmVzdEZpbHRlcjtcblxuXHR0aGlzLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlO1xuXHR0aGlzLmZsaXBZID0gZmFsc2U7XG5cdHRoaXMudW5wYWNrQWxpZ25tZW50ID0gMTtcblxufVxuXG5EYXRhVGV4dHVyZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBUZXh0dXJlLnByb3RvdHlwZSApO1xuRGF0YVRleHR1cmUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gRGF0YVRleHR1cmU7XG5cbkRhdGFUZXh0dXJlLnByb3RvdHlwZS5pc0RhdGFUZXh0dXJlID0gdHJ1ZTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIEN1YmVUZXh0dXJlKCBpbWFnZXMsIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGZvcm1hdCwgdHlwZSwgYW5pc290cm9weSwgZW5jb2RpbmcgKSB7XG5cblx0aW1hZ2VzID0gaW1hZ2VzICE9PSB1bmRlZmluZWQgPyBpbWFnZXMgOiBbXTtcblx0bWFwcGluZyA9IG1hcHBpbmcgIT09IHVuZGVmaW5lZCA/IG1hcHBpbmcgOiBDdWJlUmVmbGVjdGlvbk1hcHBpbmc7XG5cblx0VGV4dHVyZS5jYWxsKCB0aGlzLCBpbWFnZXMsIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGZvcm1hdCwgdHlwZSwgYW5pc290cm9weSwgZW5jb2RpbmcgKTtcblxuXHR0aGlzLmZsaXBZID0gZmFsc2U7XG5cbn1cblxuQ3ViZVRleHR1cmUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggVGV4dHVyZS5wcm90b3R5cGUgKTtcbkN1YmVUZXh0dXJlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEN1YmVUZXh0dXJlO1xuXG5DdWJlVGV4dHVyZS5wcm90b3R5cGUuaXNDdWJlVGV4dHVyZSA9IHRydWU7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eSggQ3ViZVRleHR1cmUucHJvdG90eXBlLCAnaW1hZ2VzJywge1xuXG5cdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuaW1hZ2U7XG5cblx0fSxcblxuXHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLmltYWdlID0gdmFsdWU7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciB0c2Nod1xuICpcbiAqIFVuaWZvcm1zIG9mIGEgcHJvZ3JhbS5cbiAqIFRob3NlIGZvcm0gYSB0cmVlIHN0cnVjdHVyZSB3aXRoIGEgc3BlY2lhbCB0b3AtbGV2ZWwgY29udGFpbmVyIGZvciB0aGUgcm9vdCxcbiAqIHdoaWNoIHlvdSBnZXQgYnkgY2FsbGluZyAnbmV3IFdlYkdMVW5pZm9ybXMoIGdsLCBwcm9ncmFtLCByZW5kZXJlciApJy5cbiAqXG4gKlxuICogUHJvcGVydGllcyBvZiBpbm5lciBub2RlcyBpbmNsdWRpbmcgdGhlIHRvcC1sZXZlbCBjb250YWluZXI6XG4gKlxuICogLnNlcSAtIGFycmF5IG9mIG5lc3RlZCB1bmlmb3Jtc1xuICogLm1hcCAtIG5lc3RlZCB1bmlmb3JtcyBieSBuYW1lXG4gKlxuICpcbiAqIE1ldGhvZHMgb2YgYWxsIG5vZGVzIGV4Y2VwdCB0aGUgdG9wLWxldmVsIGNvbnRhaW5lcjpcbiAqXG4gKiAuc2V0VmFsdWUoIGdsLCB2YWx1ZSwgW3JlbmRlcmVyXSApXG4gKlxuICogXHRcdHVwbG9hZHMgYSB1bmlmb3JtIHZhbHVlKHMpXG4gKiAgXHR0aGUgJ3JlbmRlcmVyJyBwYXJhbWV0ZXIgaXMgbmVlZGVkIGZvciBzYW1wbGVyIHVuaWZvcm1zXG4gKlxuICpcbiAqIFN0YXRpYyBtZXRob2RzIG9mIHRoZSB0b3AtbGV2ZWwgY29udGFpbmVyIChyZW5kZXJlciBmYWN0b3JpemF0aW9ucyk6XG4gKlxuICogLnVwbG9hZCggZ2wsIHNlcSwgdmFsdWVzLCByZW5kZXJlciApXG4gKlxuICogXHRcdHNldHMgdW5pZm9ybXMgaW4gJ3NlcScgdG8gJ3ZhbHVlc1tpZF0udmFsdWUnXG4gKlxuICogLnNlcVdpdGhWYWx1ZSggc2VxLCB2YWx1ZXMgKSA6IGZpbHRlcmVkU2VxXG4gKlxuICogXHRcdGZpbHRlcnMgJ3NlcScgZW50cmllcyB3aXRoIGNvcnJlc3BvbmRpbmcgZW50cnkgaW4gdmFsdWVzXG4gKlxuICpcbiAqIE1ldGhvZHMgb2YgdGhlIHRvcC1sZXZlbCBjb250YWluZXIgKHJlbmRlcmVyIGZhY3Rvcml6YXRpb25zKTpcbiAqXG4gKiAuc2V0VmFsdWUoIGdsLCBuYW1lLCB2YWx1ZSApXG4gKlxuICogXHRcdHNldHMgdW5pZm9ybSB3aXRoICBuYW1lICduYW1lJyB0byAndmFsdWUnXG4gKlxuICogLnNldCggZ2wsIG9iaiwgcHJvcCApXG4gKlxuICogXHRcdHNldHMgdW5pZm9ybSBmcm9tIG9iamVjdCBhbmQgcHJvcGVydHkgd2l0aCBzYW1lIG5hbWUgdGhhbiB1bmlmb3JtXG4gKlxuICogLnNldE9wdGlvbmFsKCBnbCwgb2JqLCBwcm9wIClcbiAqXG4gKiBcdFx0bGlrZSAuc2V0IGZvciBhbiBvcHRpb25hbCBwcm9wZXJ0eSBvZiB0aGUgb2JqZWN0XG4gKlxuICovXG5cbnZhciBlbXB0eVRleHR1cmUgPSBuZXcgVGV4dHVyZSgpO1xudmFyIGVtcHR5Q3ViZVRleHR1cmUgPSBuZXcgQ3ViZVRleHR1cmUoKTtcblxuLy8gLS0tIEJhc2UgZm9yIGlubmVyIG5vZGVzIChpbmNsdWRpbmcgdGhlIHJvb3QpIC0tLVxuXG5mdW5jdGlvbiBVbmlmb3JtQ29udGFpbmVyKCkge1xuXG5cdHRoaXMuc2VxID0gW107XG5cdHRoaXMubWFwID0ge307XG5cbn1cblxuLy8gLS0tIFV0aWxpdGllcyAtLS1cblxuLy8gQXJyYXkgQ2FjaGVzIChwcm92aWRlIHR5cGVkIGFycmF5cyBmb3IgdGVtcG9yYXJ5IGJ5IHNpemUpXG5cbnZhciBhcnJheUNhY2hlRjMyID0gW107XG52YXIgYXJyYXlDYWNoZUkzMiA9IFtdO1xuXG4vLyBGbG9hdDMyQXJyYXkgY2FjaGVzIHVzZWQgZm9yIHVwbG9hZGluZyBNYXRyaXggdW5pZm9ybXNcblxudmFyIG1hdDRhcnJheSA9IG5ldyBGbG9hdDMyQXJyYXkoIDE2ICk7XG52YXIgbWF0M2FycmF5ID0gbmV3IEZsb2F0MzJBcnJheSggOSApO1xuXG4vLyBGbGF0dGVuaW5nIGZvciBhcnJheXMgb2YgdmVjdG9ycyBhbmQgbWF0cmljZXNcblxuZnVuY3Rpb24gZmxhdHRlbiggYXJyYXksIG5CbG9ja3MsIGJsb2NrU2l6ZSApIHtcblxuXHR2YXIgZmlyc3RFbGVtID0gYXJyYXlbIDAgXTtcblxuXHRpZiAoIGZpcnN0RWxlbSA8PSAwIHx8IGZpcnN0RWxlbSA+IDAgKSByZXR1cm4gYXJyYXk7XG5cdC8vIHVub3B0aW1pemVkOiAhIGlzTmFOKCBmaXJzdEVsZW0gKVxuXHQvLyBzZWUgaHR0cDovL2phY2tzb25kdW5zdGFuLmNvbS9hcnRpY2xlcy85ODNcblxuXHR2YXIgbiA9IG5CbG9ja3MgKiBibG9ja1NpemUsXG5cdFx0ciA9IGFycmF5Q2FjaGVGMzJbIG4gXTtcblxuXHRpZiAoIHIgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdHIgPSBuZXcgRmxvYXQzMkFycmF5KCBuICk7XG5cdFx0YXJyYXlDYWNoZUYzMlsgbiBdID0gcjtcblxuXHR9XG5cblx0aWYgKCBuQmxvY2tzICE9PSAwICkge1xuXG5cdFx0Zmlyc3RFbGVtLnRvQXJyYXkoIHIsIDAgKTtcblxuXHRcdGZvciAoIHZhciBpID0gMSwgb2Zmc2V0ID0gMDsgaSAhPT0gbkJsb2NrczsgKysgaSApIHtcblxuXHRcdFx0b2Zmc2V0ICs9IGJsb2NrU2l6ZTtcblx0XHRcdGFycmF5WyBpIF0udG9BcnJheSggciwgb2Zmc2V0ICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdHJldHVybiByO1xuXG59XG5cbi8vIFRleHR1cmUgdW5pdCBhbGxvY2F0aW9uXG5cbmZ1bmN0aW9uIGFsbG9jVGV4VW5pdHMoIHJlbmRlcmVyLCBuICkge1xuXG5cdHZhciByID0gYXJyYXlDYWNoZUkzMlsgbiBdO1xuXG5cdGlmICggciA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0ciA9IG5ldyBJbnQzMkFycmF5KCBuICk7XG5cdFx0YXJyYXlDYWNoZUkzMlsgbiBdID0gcjtcblxuXHR9XG5cblx0Zm9yICggdmFyIGkgPSAwOyBpICE9PSBuOyArKyBpIClcblx0XHRyWyBpIF0gPSByZW5kZXJlci5hbGxvY1RleHR1cmVVbml0KCk7XG5cblx0cmV0dXJuIHI7XG5cbn1cblxuLy8gLS0tIFNldHRlcnMgLS0tXG5cbi8vIE5vdGU6IERlZmluaW5nIHRoZXNlIG1ldGhvZHMgZXh0ZXJuYWxseSwgYmVjYXVzZSB0aGV5IGNvbWUgaW4gYSBidW5jaFxuLy8gYW5kIHRoaXMgd2F5IHRoZWlyIG5hbWVzIG1pbmlmeS5cblxuLy8gU2luZ2xlIHNjYWxhclxuXG5mdW5jdGlvbiBzZXRWYWx1ZTFmKCBnbCwgdiApIHsgZ2wudW5pZm9ybTFmKCB0aGlzLmFkZHIsIHYgKTsgfVxuZnVuY3Rpb24gc2V0VmFsdWUxaSggZ2wsIHYgKSB7IGdsLnVuaWZvcm0xaSggdGhpcy5hZGRyLCB2ICk7IH1cblxuLy8gU2luZ2xlIGZsb2F0IHZlY3RvciAoZnJvbSBmbGF0IGFycmF5IG9yIFRIUkVFLlZlY3Rvck4pXG5cbmZ1bmN0aW9uIHNldFZhbHVlMmZ2KCBnbCwgdiApIHtcblxuXHRpZiAoIHYueCA9PT0gdW5kZWZpbmVkICkgZ2wudW5pZm9ybTJmdiggdGhpcy5hZGRyLCB2ICk7XG5cdGVsc2UgZ2wudW5pZm9ybTJmKCB0aGlzLmFkZHIsIHYueCwgdi55ICk7XG5cbn1cblxuZnVuY3Rpb24gc2V0VmFsdWUzZnYoIGdsLCB2ICkge1xuXG5cdGlmICggdi54ICE9PSB1bmRlZmluZWQgKVxuXHRcdGdsLnVuaWZvcm0zZiggdGhpcy5hZGRyLCB2LngsIHYueSwgdi56ICk7XG5cdGVsc2UgaWYgKCB2LnIgIT09IHVuZGVmaW5lZCApXG5cdFx0Z2wudW5pZm9ybTNmKCB0aGlzLmFkZHIsIHYuciwgdi5nLCB2LmIgKTtcblx0ZWxzZVxuXHRcdGdsLnVuaWZvcm0zZnYoIHRoaXMuYWRkciwgdiApO1xuXG59XG5cbmZ1bmN0aW9uIHNldFZhbHVlNGZ2KCBnbCwgdiApIHtcblxuXHRpZiAoIHYueCA9PT0gdW5kZWZpbmVkICkgZ2wudW5pZm9ybTRmdiggdGhpcy5hZGRyLCB2ICk7XG5cdGVsc2UgZ2wudW5pZm9ybTRmKCB0aGlzLmFkZHIsIHYueCwgdi55LCB2LnosIHYudyApO1xuXG59XG5cbi8vIFNpbmdsZSBtYXRyaXggKGZyb20gZmxhdCBhcnJheSBvciBNYXRyaXhOKVxuXG5mdW5jdGlvbiBzZXRWYWx1ZTJmbSggZ2wsIHYgKSB7XG5cblx0Z2wudW5pZm9ybU1hdHJpeDJmdiggdGhpcy5hZGRyLCBmYWxzZSwgdi5lbGVtZW50cyB8fCB2ICk7XG5cbn1cblxuZnVuY3Rpb24gc2V0VmFsdWUzZm0oIGdsLCB2ICkge1xuXG5cdGlmICggdi5lbGVtZW50cyA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0Z2wudW5pZm9ybU1hdHJpeDNmdiggdGhpcy5hZGRyLCBmYWxzZSwgdiApO1xuXG5cdH0gZWxzZSB7XG5cblx0XHRtYXQzYXJyYXkuc2V0KCB2LmVsZW1lbnRzICk7XG5cdFx0Z2wudW5pZm9ybU1hdHJpeDNmdiggdGhpcy5hZGRyLCBmYWxzZSwgbWF0M2FycmF5ICk7XG5cblx0fVxuXG59XG5cbmZ1bmN0aW9uIHNldFZhbHVlNGZtKCBnbCwgdiApIHtcblxuXHRpZiAoIHYuZWxlbWVudHMgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdGdsLnVuaWZvcm1NYXRyaXg0ZnYoIHRoaXMuYWRkciwgZmFsc2UsIHYgKTtcblxuXHR9IGVsc2Uge1xuXG5cdFx0bWF0NGFycmF5LnNldCggdi5lbGVtZW50cyApO1xuXHRcdGdsLnVuaWZvcm1NYXRyaXg0ZnYoIHRoaXMuYWRkciwgZmFsc2UsIG1hdDRhcnJheSApO1xuXG5cdH1cblxufVxuXG4vLyBTaW5nbGUgdGV4dHVyZSAoMkQgLyBDdWJlKVxuXG5mdW5jdGlvbiBzZXRWYWx1ZVQxKCBnbCwgdiwgcmVuZGVyZXIgKSB7XG5cblx0dmFyIHVuaXQgPSByZW5kZXJlci5hbGxvY1RleHR1cmVVbml0KCk7XG5cdGdsLnVuaWZvcm0xaSggdGhpcy5hZGRyLCB1bml0ICk7XG5cdHJlbmRlcmVyLnNldFRleHR1cmUyRCggdiB8fCBlbXB0eVRleHR1cmUsIHVuaXQgKTtcblxufVxuXG5mdW5jdGlvbiBzZXRWYWx1ZVQ2KCBnbCwgdiwgcmVuZGVyZXIgKSB7XG5cblx0dmFyIHVuaXQgPSByZW5kZXJlci5hbGxvY1RleHR1cmVVbml0KCk7XG5cdGdsLnVuaWZvcm0xaSggdGhpcy5hZGRyLCB1bml0ICk7XG5cdHJlbmRlcmVyLnNldFRleHR1cmVDdWJlKCB2IHx8IGVtcHR5Q3ViZVRleHR1cmUsIHVuaXQgKTtcblxufVxuXG4vLyBJbnRlZ2VyIC8gQm9vbGVhbiB2ZWN0b3JzIG9yIGFycmF5cyB0aGVyZW9mIChhbHdheXMgZmxhdCBhcnJheXMpXG5cbmZ1bmN0aW9uIHNldFZhbHVlMml2KCBnbCwgdiApIHsgZ2wudW5pZm9ybTJpdiggdGhpcy5hZGRyLCB2ICk7IH1cbmZ1bmN0aW9uIHNldFZhbHVlM2l2KCBnbCwgdiApIHsgZ2wudW5pZm9ybTNpdiggdGhpcy5hZGRyLCB2ICk7IH1cbmZ1bmN0aW9uIHNldFZhbHVlNGl2KCBnbCwgdiApIHsgZ2wudW5pZm9ybTRpdiggdGhpcy5hZGRyLCB2ICk7IH1cblxuLy8gSGVscGVyIHRvIHBpY2sgdGhlIHJpZ2h0IHNldHRlciBmb3IgdGhlIHNpbmd1bGFyIGNhc2VcblxuZnVuY3Rpb24gZ2V0U2luZ3VsYXJTZXR0ZXIoIHR5cGUgKSB7XG5cblx0c3dpdGNoICggdHlwZSApIHtcblxuXHRcdGNhc2UgMHgxNDA2OiByZXR1cm4gc2V0VmFsdWUxZjsgLy8gRkxPQVRcblx0XHRjYXNlIDB4OGI1MDogcmV0dXJuIHNldFZhbHVlMmZ2OyAvLyBfVkVDMlxuXHRcdGNhc2UgMHg4YjUxOiByZXR1cm4gc2V0VmFsdWUzZnY7IC8vIF9WRUMzXG5cdFx0Y2FzZSAweDhiNTI6IHJldHVybiBzZXRWYWx1ZTRmdjsgLy8gX1ZFQzRcblxuXHRcdGNhc2UgMHg4YjVhOiByZXR1cm4gc2V0VmFsdWUyZm07IC8vIF9NQVQyXG5cdFx0Y2FzZSAweDhiNWI6IHJldHVybiBzZXRWYWx1ZTNmbTsgLy8gX01BVDNcblx0XHRjYXNlIDB4OGI1YzogcmV0dXJuIHNldFZhbHVlNGZtOyAvLyBfTUFUNFxuXG5cdFx0Y2FzZSAweDhiNWU6IHJldHVybiBzZXRWYWx1ZVQxOyAvLyBTQU1QTEVSXzJEXG5cdFx0Y2FzZSAweDhiNjA6IHJldHVybiBzZXRWYWx1ZVQ2OyAvLyBTQU1QTEVSX0NVQkVcblxuXHRcdGNhc2UgMHgxNDA0OiBjYXNlIDB4OGI1NjogcmV0dXJuIHNldFZhbHVlMWk7IC8vIElOVCwgQk9PTFxuXHRcdGNhc2UgMHg4YjUzOiBjYXNlIDB4OGI1NzogcmV0dXJuIHNldFZhbHVlMml2OyAvLyBfVkVDMlxuXHRcdGNhc2UgMHg4YjU0OiBjYXNlIDB4OGI1ODogcmV0dXJuIHNldFZhbHVlM2l2OyAvLyBfVkVDM1xuXHRcdGNhc2UgMHg4YjU1OiBjYXNlIDB4OGI1OTogcmV0dXJuIHNldFZhbHVlNGl2OyAvLyBfVkVDNFxuXG5cdH1cblxufVxuXG4vLyBBcnJheSBvZiBzY2FsYXJzXG5cbmZ1bmN0aW9uIHNldFZhbHVlMWZ2KCBnbCwgdiApIHsgZ2wudW5pZm9ybTFmdiggdGhpcy5hZGRyLCB2ICk7IH1cbmZ1bmN0aW9uIHNldFZhbHVlMWl2KCBnbCwgdiApIHsgZ2wudW5pZm9ybTFpdiggdGhpcy5hZGRyLCB2ICk7IH1cblxuLy8gQXJyYXkgb2YgdmVjdG9ycyAoZmxhdCBvciBmcm9tIFRIUkVFIGNsYXNzZXMpXG5cbmZ1bmN0aW9uIHNldFZhbHVlVjJhKCBnbCwgdiApIHtcblxuXHRnbC51bmlmb3JtMmZ2KCB0aGlzLmFkZHIsIGZsYXR0ZW4oIHYsIHRoaXMuc2l6ZSwgMiApICk7XG5cbn1cblxuZnVuY3Rpb24gc2V0VmFsdWVWM2EoIGdsLCB2ICkge1xuXG5cdGdsLnVuaWZvcm0zZnYoIHRoaXMuYWRkciwgZmxhdHRlbiggdiwgdGhpcy5zaXplLCAzICkgKTtcblxufVxuXG5mdW5jdGlvbiBzZXRWYWx1ZVY0YSggZ2wsIHYgKSB7XG5cblx0Z2wudW5pZm9ybTRmdiggdGhpcy5hZGRyLCBmbGF0dGVuKCB2LCB0aGlzLnNpemUsIDQgKSApO1xuXG59XG5cbi8vIEFycmF5IG9mIG1hdHJpY2VzIChmbGF0IG9yIGZyb20gVEhSRUUgY2xhc2VzKVxuXG5mdW5jdGlvbiBzZXRWYWx1ZU0yYSggZ2wsIHYgKSB7XG5cblx0Z2wudW5pZm9ybU1hdHJpeDJmdiggdGhpcy5hZGRyLCBmYWxzZSwgZmxhdHRlbiggdiwgdGhpcy5zaXplLCA0ICkgKTtcblxufVxuXG5mdW5jdGlvbiBzZXRWYWx1ZU0zYSggZ2wsIHYgKSB7XG5cblx0Z2wudW5pZm9ybU1hdHJpeDNmdiggdGhpcy5hZGRyLCBmYWxzZSwgZmxhdHRlbiggdiwgdGhpcy5zaXplLCA5ICkgKTtcblxufVxuXG5mdW5jdGlvbiBzZXRWYWx1ZU00YSggZ2wsIHYgKSB7XG5cblx0Z2wudW5pZm9ybU1hdHJpeDRmdiggdGhpcy5hZGRyLCBmYWxzZSwgZmxhdHRlbiggdiwgdGhpcy5zaXplLCAxNiApICk7XG5cbn1cblxuLy8gQXJyYXkgb2YgdGV4dHVyZXMgKDJEIC8gQ3ViZSlcblxuZnVuY3Rpb24gc2V0VmFsdWVUMWEoIGdsLCB2LCByZW5kZXJlciApIHtcblxuXHR2YXIgbiA9IHYubGVuZ3RoLFxuXHRcdHVuaXRzID0gYWxsb2NUZXhVbml0cyggcmVuZGVyZXIsIG4gKTtcblxuXHRnbC51bmlmb3JtMWl2KCB0aGlzLmFkZHIsIHVuaXRzICk7XG5cblx0Zm9yICggdmFyIGkgPSAwOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0cmVuZGVyZXIuc2V0VGV4dHVyZTJEKCB2WyBpIF0gfHwgZW1wdHlUZXh0dXJlLCB1bml0c1sgaSBdICk7XG5cblx0fVxuXG59XG5cbmZ1bmN0aW9uIHNldFZhbHVlVDZhKCBnbCwgdiwgcmVuZGVyZXIgKSB7XG5cblx0dmFyIG4gPSB2Lmxlbmd0aCxcblx0XHR1bml0cyA9IGFsbG9jVGV4VW5pdHMoIHJlbmRlcmVyLCBuICk7XG5cblx0Z2wudW5pZm9ybTFpdiggdGhpcy5hZGRyLCB1bml0cyApO1xuXG5cdGZvciAoIHZhciBpID0gMDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdHJlbmRlcmVyLnNldFRleHR1cmVDdWJlKCB2WyBpIF0gfHwgZW1wdHlDdWJlVGV4dHVyZSwgdW5pdHNbIGkgXSApO1xuXG5cdH1cblxufVxuXG4vLyBIZWxwZXIgdG8gcGljayB0aGUgcmlnaHQgc2V0dGVyIGZvciBhIHB1cmUgKGJvdHRvbS1sZXZlbCkgYXJyYXlcblxuZnVuY3Rpb24gZ2V0UHVyZUFycmF5U2V0dGVyKCB0eXBlICkge1xuXG5cdHN3aXRjaCAoIHR5cGUgKSB7XG5cblx0XHRjYXNlIDB4MTQwNjogcmV0dXJuIHNldFZhbHVlMWZ2OyAvLyBGTE9BVFxuXHRcdGNhc2UgMHg4YjUwOiByZXR1cm4gc2V0VmFsdWVWMmE7IC8vIF9WRUMyXG5cdFx0Y2FzZSAweDhiNTE6IHJldHVybiBzZXRWYWx1ZVYzYTsgLy8gX1ZFQzNcblx0XHRjYXNlIDB4OGI1MjogcmV0dXJuIHNldFZhbHVlVjRhOyAvLyBfVkVDNFxuXG5cdFx0Y2FzZSAweDhiNWE6IHJldHVybiBzZXRWYWx1ZU0yYTsgLy8gX01BVDJcblx0XHRjYXNlIDB4OGI1YjogcmV0dXJuIHNldFZhbHVlTTNhOyAvLyBfTUFUM1xuXHRcdGNhc2UgMHg4YjVjOiByZXR1cm4gc2V0VmFsdWVNNGE7IC8vIF9NQVQ0XG5cblx0XHRjYXNlIDB4OGI1ZTogcmV0dXJuIHNldFZhbHVlVDFhOyAvLyBTQU1QTEVSXzJEXG5cdFx0Y2FzZSAweDhiNjA6IHJldHVybiBzZXRWYWx1ZVQ2YTsgLy8gU0FNUExFUl9DVUJFXG5cblx0XHRjYXNlIDB4MTQwNDogY2FzZSAweDhiNTY6IHJldHVybiBzZXRWYWx1ZTFpdjsgLy8gSU5ULCBCT09MXG5cdFx0Y2FzZSAweDhiNTM6IGNhc2UgMHg4YjU3OiByZXR1cm4gc2V0VmFsdWUyaXY7IC8vIF9WRUMyXG5cdFx0Y2FzZSAweDhiNTQ6IGNhc2UgMHg4YjU4OiByZXR1cm4gc2V0VmFsdWUzaXY7IC8vIF9WRUMzXG5cdFx0Y2FzZSAweDhiNTU6IGNhc2UgMHg4YjU5OiByZXR1cm4gc2V0VmFsdWU0aXY7IC8vIF9WRUM0XG5cblx0fVxuXG59XG5cbi8vIC0tLSBVbmlmb3JtIENsYXNzZXMgLS0tXG5cbmZ1bmN0aW9uIFNpbmdsZVVuaWZvcm0oIGlkLCBhY3RpdmVJbmZvLCBhZGRyICkge1xuXG5cdHRoaXMuaWQgPSBpZDtcblx0dGhpcy5hZGRyID0gYWRkcjtcblx0dGhpcy5zZXRWYWx1ZSA9IGdldFNpbmd1bGFyU2V0dGVyKCBhY3RpdmVJbmZvLnR5cGUgKTtcblxuXHQvLyB0aGlzLnBhdGggPSBhY3RpdmVJbmZvLm5hbWU7IC8vIERFQlVHXG5cbn1cblxuZnVuY3Rpb24gUHVyZUFycmF5VW5pZm9ybSggaWQsIGFjdGl2ZUluZm8sIGFkZHIgKSB7XG5cblx0dGhpcy5pZCA9IGlkO1xuXHR0aGlzLmFkZHIgPSBhZGRyO1xuXHR0aGlzLnNpemUgPSBhY3RpdmVJbmZvLnNpemU7XG5cdHRoaXMuc2V0VmFsdWUgPSBnZXRQdXJlQXJyYXlTZXR0ZXIoIGFjdGl2ZUluZm8udHlwZSApO1xuXG5cdC8vIHRoaXMucGF0aCA9IGFjdGl2ZUluZm8ubmFtZTsgLy8gREVCVUdcblxufVxuXG5mdW5jdGlvbiBTdHJ1Y3R1cmVkVW5pZm9ybSggaWQgKSB7XG5cblx0dGhpcy5pZCA9IGlkO1xuXG5cdFVuaWZvcm1Db250YWluZXIuY2FsbCggdGhpcyApOyAvLyBtaXgtaW5cblxufVxuXG5TdHJ1Y3R1cmVkVW5pZm9ybS5wcm90b3R5cGUuc2V0VmFsdWUgPSBmdW5jdGlvbiAoIGdsLCB2YWx1ZSApIHtcblxuXHQvLyBOb3RlOiBEb24ndCBuZWVkIGFuIGV4dHJhICdyZW5kZXJlcicgcGFyYW1ldGVyLCBzaW5jZSBzYW1wbGVyc1xuXHQvLyBhcmUgbm90IGFsbG93ZWQgaW4gc3RydWN0dXJlZCB1bmlmb3Jtcy5cblxuXHR2YXIgc2VxID0gdGhpcy5zZXE7XG5cblx0Zm9yICggdmFyIGkgPSAwLCBuID0gc2VxLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdHZhciB1ID0gc2VxWyBpIF07XG5cdFx0dS5zZXRWYWx1ZSggZ2wsIHZhbHVlWyB1LmlkIF0gKTtcblxuXHR9XG5cbn07XG5cbi8vIC0tLSBUb3AtbGV2ZWwgLS0tXG5cbi8vIFBhcnNlciAtIGJ1aWxkcyB1cCB0aGUgcHJvcGVydHkgdHJlZSBmcm9tIHRoZSBwYXRoIHN0cmluZ3NcblxudmFyIFJlUGF0aFBhcnQgPSAvKFtcXHdcXGRfXSspKFxcXSk/KFxcW3xcXC4pPy9nO1xuXG4vLyBleHRyYWN0c1xuLy8gXHQtIHRoZSBpZGVudGlmaWVyIChtZW1iZXIgbmFtZSBvciBhcnJheSBpbmRleClcbi8vICAtIGZvbGxvd2VkIGJ5IGFuIG9wdGlvbmFsIHJpZ2h0IGJyYWNrZXQgKGZvdW5kIHdoZW4gYXJyYXkgaW5kZXgpXG4vLyAgLSBmb2xsb3dlZCBieSBhbiBvcHRpb25hbCBsZWZ0IGJyYWNrZXQgb3IgZG90ICh0eXBlIG9mIHN1YnNjcmlwdClcbi8vXG4vLyBOb3RlOiBUaGVzZSBwb3J0aW9ucyBjYW4gYmUgcmVhZCBpbiBhIG5vbi1vdmVybGFwcGluZyBmYXNoaW9uIGFuZFxuLy8gYWxsb3cgc3RyYWlnaHRmb3J3YXJkIHBhcnNpbmcgb2YgdGhlIGhpZXJhcmNoeSB0aGF0IFdlYkdMIGVuY29kZXNcbi8vIGluIHRoZSB1bmlmb3JtIG5hbWVzLlxuXG5mdW5jdGlvbiBhZGRVbmlmb3JtKCBjb250YWluZXIsIHVuaWZvcm1PYmplY3QgKSB7XG5cblx0Y29udGFpbmVyLnNlcS5wdXNoKCB1bmlmb3JtT2JqZWN0ICk7XG5cdGNvbnRhaW5lci5tYXBbIHVuaWZvcm1PYmplY3QuaWQgXSA9IHVuaWZvcm1PYmplY3Q7XG5cbn1cblxuZnVuY3Rpb24gcGFyc2VVbmlmb3JtKCBhY3RpdmVJbmZvLCBhZGRyLCBjb250YWluZXIgKSB7XG5cblx0dmFyIHBhdGggPSBhY3RpdmVJbmZvLm5hbWUsXG5cdFx0cGF0aExlbmd0aCA9IHBhdGgubGVuZ3RoO1xuXG5cdC8vIHJlc2V0IFJlZ0V4cCBvYmplY3QsIGJlY2F1c2Ugb2YgdGhlIGVhcmx5IGV4aXQgb2YgYSBwcmV2aW91cyBydW5cblx0UmVQYXRoUGFydC5sYXN0SW5kZXggPSAwO1xuXG5cdGZvciAoIDsgOyApIHtcblxuXHRcdHZhciBtYXRjaCA9IFJlUGF0aFBhcnQuZXhlYyggcGF0aCApLFxuXHRcdFx0bWF0Y2hFbmQgPSBSZVBhdGhQYXJ0Lmxhc3RJbmRleCxcblxuXHRcdFx0aWQgPSBtYXRjaFsgMSBdLFxuXHRcdFx0aWRJc0luZGV4ID0gbWF0Y2hbIDIgXSA9PT0gJ10nLFxuXHRcdFx0c3Vic2NyaXB0ID0gbWF0Y2hbIDMgXTtcblxuXHRcdGlmICggaWRJc0luZGV4ICkgaWQgPSBpZCB8IDA7IC8vIGNvbnZlcnQgdG8gaW50ZWdlclxuXG5cdFx0aWYgKCBzdWJzY3JpcHQgPT09IHVuZGVmaW5lZCB8fCBzdWJzY3JpcHQgPT09ICdbJyAmJiBtYXRjaEVuZCArIDIgPT09IHBhdGhMZW5ndGggKSB7XG5cblx0XHRcdC8vIGJhcmUgbmFtZSBvciBcInB1cmVcIiBib3R0b20tbGV2ZWwgYXJyYXkgXCJbMF1cIiBzdWZmaXhcblxuXHRcdFx0YWRkVW5pZm9ybSggY29udGFpbmVyLCBzdWJzY3JpcHQgPT09IHVuZGVmaW5lZCA/XG5cdFx0XHRcdFx0bmV3IFNpbmdsZVVuaWZvcm0oIGlkLCBhY3RpdmVJbmZvLCBhZGRyICkgOlxuXHRcdFx0XHRcdG5ldyBQdXJlQXJyYXlVbmlmb3JtKCBpZCwgYWN0aXZlSW5mbywgYWRkciApICk7XG5cblx0XHRcdGJyZWFrO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gc3RlcCBpbnRvIGlubmVyIG5vZGUgLyBjcmVhdGUgaXQgaW4gY2FzZSBpdCBkb2Vzbid0IGV4aXN0XG5cblx0XHRcdHZhciBtYXAgPSBjb250YWluZXIubWFwLCBuZXh0ID0gbWFwWyBpZCBdO1xuXG5cdFx0XHRpZiAoIG5leHQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRuZXh0ID0gbmV3IFN0cnVjdHVyZWRVbmlmb3JtKCBpZCApO1xuXHRcdFx0XHRhZGRVbmlmb3JtKCBjb250YWluZXIsIG5leHQgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRjb250YWluZXIgPSBuZXh0O1xuXG5cdFx0fVxuXG5cdH1cblxufVxuXG4vLyBSb290IENvbnRhaW5lclxuXG5mdW5jdGlvbiBXZWJHTFVuaWZvcm1zKCBnbCwgcHJvZ3JhbSwgcmVuZGVyZXIgKSB7XG5cblx0VW5pZm9ybUNvbnRhaW5lci5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy5yZW5kZXJlciA9IHJlbmRlcmVyO1xuXG5cdHZhciBuID0gZ2wuZ2V0UHJvZ3JhbVBhcmFtZXRlciggcHJvZ3JhbSwgZ2wuQUNUSVZFX1VOSUZPUk1TICk7XG5cblx0Zm9yICggdmFyIGkgPSAwOyBpIDwgbjsgKysgaSApIHtcblxuXHRcdHZhciBpbmZvID0gZ2wuZ2V0QWN0aXZlVW5pZm9ybSggcHJvZ3JhbSwgaSApLFxuXHRcdFx0cGF0aCA9IGluZm8ubmFtZSxcblx0XHRcdGFkZHIgPSBnbC5nZXRVbmlmb3JtTG9jYXRpb24oIHByb2dyYW0sIHBhdGggKTtcblxuXHRcdHBhcnNlVW5pZm9ybSggaW5mbywgYWRkciwgdGhpcyApO1xuXG5cdH1cblxufVxuXG5XZWJHTFVuaWZvcm1zLnByb3RvdHlwZS5zZXRWYWx1ZSA9IGZ1bmN0aW9uICggZ2wsIG5hbWUsIHZhbHVlICkge1xuXG5cdHZhciB1ID0gdGhpcy5tYXBbIG5hbWUgXTtcblxuXHRpZiAoIHUgIT09IHVuZGVmaW5lZCApIHUuc2V0VmFsdWUoIGdsLCB2YWx1ZSwgdGhpcy5yZW5kZXJlciApO1xuXG59O1xuXG5XZWJHTFVuaWZvcm1zLnByb3RvdHlwZS5zZXRPcHRpb25hbCA9IGZ1bmN0aW9uICggZ2wsIG9iamVjdCwgbmFtZSApIHtcblxuXHR2YXIgdiA9IG9iamVjdFsgbmFtZSBdO1xuXG5cdGlmICggdiAhPT0gdW5kZWZpbmVkICkgdGhpcy5zZXRWYWx1ZSggZ2wsIG5hbWUsIHYgKTtcblxufTtcblxuXG4vLyBTdGF0aWMgaW50ZXJmYWNlXG5cbldlYkdMVW5pZm9ybXMudXBsb2FkID0gZnVuY3Rpb24gKCBnbCwgc2VxLCB2YWx1ZXMsIHJlbmRlcmVyICkge1xuXG5cdGZvciAoIHZhciBpID0gMCwgbiA9IHNlcS5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHR2YXIgdSA9IHNlcVsgaSBdLFxuXHRcdFx0diA9IHZhbHVlc1sgdS5pZCBdO1xuXG5cdFx0aWYgKCB2Lm5lZWRzVXBkYXRlICE9PSBmYWxzZSApIHtcblxuXHRcdFx0Ly8gbm90ZTogYWx3YXlzIHVwZGF0aW5nIHdoZW4gLm5lZWRzVXBkYXRlIGlzIHVuZGVmaW5lZFxuXHRcdFx0dS5zZXRWYWx1ZSggZ2wsIHYudmFsdWUsIHJlbmRlcmVyICk7XG5cblx0XHR9XG5cblx0fVxuXG59O1xuXG5XZWJHTFVuaWZvcm1zLnNlcVdpdGhWYWx1ZSA9IGZ1bmN0aW9uICggc2VxLCB2YWx1ZXMgKSB7XG5cblx0dmFyIHIgPSBbXTtcblxuXHRmb3IgKCB2YXIgaSA9IDAsIG4gPSBzZXEubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0dmFyIHUgPSBzZXFbIGkgXTtcblx0XHRpZiAoIHUuaWQgaW4gdmFsdWVzICkgci5wdXNoKCB1ICk7XG5cblx0fVxuXG5cdHJldHVybiByO1xuXG59O1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxudmFyIENvbG9yS2V5d29yZHMgPSB7ICdhbGljZWJsdWUnOiAweEYwRjhGRiwgJ2FudGlxdWV3aGl0ZSc6IDB4RkFFQkQ3LCAnYXF1YSc6IDB4MDBGRkZGLCAnYXF1YW1hcmluZSc6IDB4N0ZGRkQ0LCAnYXp1cmUnOiAweEYwRkZGRixcblx0J2JlaWdlJzogMHhGNUY1REMsICdiaXNxdWUnOiAweEZGRTRDNCwgJ2JsYWNrJzogMHgwMDAwMDAsICdibGFuY2hlZGFsbW9uZCc6IDB4RkZFQkNELCAnYmx1ZSc6IDB4MDAwMEZGLCAnYmx1ZXZpb2xldCc6IDB4OEEyQkUyLFxuXHQnYnJvd24nOiAweEE1MkEyQSwgJ2J1cmx5d29vZCc6IDB4REVCODg3LCAnY2FkZXRibHVlJzogMHg1RjlFQTAsICdjaGFydHJldXNlJzogMHg3RkZGMDAsICdjaG9jb2xhdGUnOiAweEQyNjkxRSwgJ2NvcmFsJzogMHhGRjdGNTAsXG5cdCdjb3JuZmxvd2VyYmx1ZSc6IDB4NjQ5NUVELCAnY29ybnNpbGsnOiAweEZGRjhEQywgJ2NyaW1zb24nOiAweERDMTQzQywgJ2N5YW4nOiAweDAwRkZGRiwgJ2RhcmtibHVlJzogMHgwMDAwOEIsICdkYXJrY3lhbic6IDB4MDA4QjhCLFxuXHQnZGFya2dvbGRlbnJvZCc6IDB4Qjg4NjBCLCAnZGFya2dyYXknOiAweEE5QTlBOSwgJ2RhcmtncmVlbic6IDB4MDA2NDAwLCAnZGFya2dyZXknOiAweEE5QTlBOSwgJ2RhcmtraGFraSc6IDB4QkRCNzZCLCAnZGFya21hZ2VudGEnOiAweDhCMDA4Qixcblx0J2RhcmtvbGl2ZWdyZWVuJzogMHg1NTZCMkYsICdkYXJrb3JhbmdlJzogMHhGRjhDMDAsICdkYXJrb3JjaGlkJzogMHg5OTMyQ0MsICdkYXJrcmVkJzogMHg4QjAwMDAsICdkYXJrc2FsbW9uJzogMHhFOTk2N0EsICdkYXJrc2VhZ3JlZW4nOiAweDhGQkM4Rixcblx0J2RhcmtzbGF0ZWJsdWUnOiAweDQ4M0Q4QiwgJ2RhcmtzbGF0ZWdyYXknOiAweDJGNEY0RiwgJ2RhcmtzbGF0ZWdyZXknOiAweDJGNEY0RiwgJ2Rhcmt0dXJxdW9pc2UnOiAweDAwQ0VEMSwgJ2Rhcmt2aW9sZXQnOiAweDk0MDBEMyxcblx0J2RlZXBwaW5rJzogMHhGRjE0OTMsICdkZWVwc2t5Ymx1ZSc6IDB4MDBCRkZGLCAnZGltZ3JheSc6IDB4Njk2OTY5LCAnZGltZ3JleSc6IDB4Njk2OTY5LCAnZG9kZ2VyYmx1ZSc6IDB4MUU5MEZGLCAnZmlyZWJyaWNrJzogMHhCMjIyMjIsXG5cdCdmbG9yYWx3aGl0ZSc6IDB4RkZGQUYwLCAnZm9yZXN0Z3JlZW4nOiAweDIyOEIyMiwgJ2Z1Y2hzaWEnOiAweEZGMDBGRiwgJ2dhaW5zYm9ybyc6IDB4RENEQ0RDLCAnZ2hvc3R3aGl0ZSc6IDB4RjhGOEZGLCAnZ29sZCc6IDB4RkZENzAwLFxuXHQnZ29sZGVucm9kJzogMHhEQUE1MjAsICdncmF5JzogMHg4MDgwODAsICdncmVlbic6IDB4MDA4MDAwLCAnZ3JlZW55ZWxsb3cnOiAweEFERkYyRiwgJ2dyZXknOiAweDgwODA4MCwgJ2hvbmV5ZGV3JzogMHhGMEZGRjAsICdob3RwaW5rJzogMHhGRjY5QjQsXG5cdCdpbmRpYW5yZWQnOiAweENENUM1QywgJ2luZGlnbyc6IDB4NEIwMDgyLCAnaXZvcnknOiAweEZGRkZGMCwgJ2toYWtpJzogMHhGMEU2OEMsICdsYXZlbmRlcic6IDB4RTZFNkZBLCAnbGF2ZW5kZXJibHVzaCc6IDB4RkZGMEY1LCAnbGF3bmdyZWVuJzogMHg3Q0ZDMDAsXG5cdCdsZW1vbmNoaWZmb24nOiAweEZGRkFDRCwgJ2xpZ2h0Ymx1ZSc6IDB4QUREOEU2LCAnbGlnaHRjb3JhbCc6IDB4RjA4MDgwLCAnbGlnaHRjeWFuJzogMHhFMEZGRkYsICdsaWdodGdvbGRlbnJvZHllbGxvdyc6IDB4RkFGQUQyLCAnbGlnaHRncmF5JzogMHhEM0QzRDMsXG5cdCdsaWdodGdyZWVuJzogMHg5MEVFOTAsICdsaWdodGdyZXknOiAweEQzRDNEMywgJ2xpZ2h0cGluayc6IDB4RkZCNkMxLCAnbGlnaHRzYWxtb24nOiAweEZGQTA3QSwgJ2xpZ2h0c2VhZ3JlZW4nOiAweDIwQjJBQSwgJ2xpZ2h0c2t5Ymx1ZSc6IDB4ODdDRUZBLFxuXHQnbGlnaHRzbGF0ZWdyYXknOiAweDc3ODg5OSwgJ2xpZ2h0c2xhdGVncmV5JzogMHg3Nzg4OTksICdsaWdodHN0ZWVsYmx1ZSc6IDB4QjBDNERFLCAnbGlnaHR5ZWxsb3cnOiAweEZGRkZFMCwgJ2xpbWUnOiAweDAwRkYwMCwgJ2xpbWVncmVlbic6IDB4MzJDRDMyLFxuXHQnbGluZW4nOiAweEZBRjBFNiwgJ21hZ2VudGEnOiAweEZGMDBGRiwgJ21hcm9vbic6IDB4ODAwMDAwLCAnbWVkaXVtYXF1YW1hcmluZSc6IDB4NjZDREFBLCAnbWVkaXVtYmx1ZSc6IDB4MDAwMENELCAnbWVkaXVtb3JjaGlkJzogMHhCQTU1RDMsXG5cdCdtZWRpdW1wdXJwbGUnOiAweDkzNzBEQiwgJ21lZGl1bXNlYWdyZWVuJzogMHgzQ0IzNzEsICdtZWRpdW1zbGF0ZWJsdWUnOiAweDdCNjhFRSwgJ21lZGl1bXNwcmluZ2dyZWVuJzogMHgwMEZBOUEsICdtZWRpdW10dXJxdW9pc2UnOiAweDQ4RDFDQyxcblx0J21lZGl1bXZpb2xldHJlZCc6IDB4QzcxNTg1LCAnbWlkbmlnaHRibHVlJzogMHgxOTE5NzAsICdtaW50Y3JlYW0nOiAweEY1RkZGQSwgJ21pc3R5cm9zZSc6IDB4RkZFNEUxLCAnbW9jY2FzaW4nOiAweEZGRTRCNSwgJ25hdmFqb3doaXRlJzogMHhGRkRFQUQsXG5cdCduYXZ5JzogMHgwMDAwODAsICdvbGRsYWNlJzogMHhGREY1RTYsICdvbGl2ZSc6IDB4ODA4MDAwLCAnb2xpdmVkcmFiJzogMHg2QjhFMjMsICdvcmFuZ2UnOiAweEZGQTUwMCwgJ29yYW5nZXJlZCc6IDB4RkY0NTAwLCAnb3JjaGlkJzogMHhEQTcwRDYsXG5cdCdwYWxlZ29sZGVucm9kJzogMHhFRUU4QUEsICdwYWxlZ3JlZW4nOiAweDk4RkI5OCwgJ3BhbGV0dXJxdW9pc2UnOiAweEFGRUVFRSwgJ3BhbGV2aW9sZXRyZWQnOiAweERCNzA5MywgJ3BhcGF5YXdoaXAnOiAweEZGRUZENSwgJ3BlYWNocHVmZic6IDB4RkZEQUI5LFxuXHQncGVydSc6IDB4Q0Q4NTNGLCAncGluayc6IDB4RkZDMENCLCAncGx1bSc6IDB4RERBMERELCAncG93ZGVyYmx1ZSc6IDB4QjBFMEU2LCAncHVycGxlJzogMHg4MDAwODAsICdyZWQnOiAweEZGMDAwMCwgJ3Jvc3licm93bic6IDB4QkM4RjhGLFxuXHQncm95YWxibHVlJzogMHg0MTY5RTEsICdzYWRkbGVicm93bic6IDB4OEI0NTEzLCAnc2FsbW9uJzogMHhGQTgwNzIsICdzYW5keWJyb3duJzogMHhGNEE0NjAsICdzZWFncmVlbic6IDB4MkU4QjU3LCAnc2Vhc2hlbGwnOiAweEZGRjVFRSxcblx0J3NpZW5uYSc6IDB4QTA1MjJELCAnc2lsdmVyJzogMHhDMEMwQzAsICdza3libHVlJzogMHg4N0NFRUIsICdzbGF0ZWJsdWUnOiAweDZBNUFDRCwgJ3NsYXRlZ3JheSc6IDB4NzA4MDkwLCAnc2xhdGVncmV5JzogMHg3MDgwOTAsICdzbm93JzogMHhGRkZBRkEsXG5cdCdzcHJpbmdncmVlbic6IDB4MDBGRjdGLCAnc3RlZWxibHVlJzogMHg0NjgyQjQsICd0YW4nOiAweEQyQjQ4QywgJ3RlYWwnOiAweDAwODA4MCwgJ3RoaXN0bGUnOiAweEQ4QkZEOCwgJ3RvbWF0byc6IDB4RkY2MzQ3LCAndHVycXVvaXNlJzogMHg0MEUwRDAsXG5cdCd2aW9sZXQnOiAweEVFODJFRSwgJ3doZWF0JzogMHhGNURFQjMsICd3aGl0ZSc6IDB4RkZGRkZGLCAnd2hpdGVzbW9rZSc6IDB4RjVGNUY1LCAneWVsbG93JzogMHhGRkZGMDAsICd5ZWxsb3dncmVlbic6IDB4OUFDRDMyIH07XG5cbmZ1bmN0aW9uIENvbG9yKCByLCBnLCBiICkge1xuXG5cdGlmICggZyA9PT0gdW5kZWZpbmVkICYmIGIgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdC8vIHIgaXMgVEhSRUUuQ29sb3IsIGhleCBvciBzdHJpbmdcblx0XHRyZXR1cm4gdGhpcy5zZXQoIHIgKTtcblxuXHR9XG5cblx0cmV0dXJuIHRoaXMuc2V0UkdCKCByLCBnLCBiICk7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggQ29sb3IucHJvdG90eXBlLCB7XG5cblx0aXNDb2xvcjogdHJ1ZSxcblxuXHRyOiAxLCBnOiAxLCBiOiAxLFxuXG5cdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdGlmICggdmFsdWUgJiYgdmFsdWUuaXNDb2xvciApIHtcblxuXHRcdFx0dGhpcy5jb3B5KCB2YWx1ZSApO1xuXG5cdFx0fSBlbHNlIGlmICggdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyApIHtcblxuXHRcdFx0dGhpcy5zZXRIZXgoIHZhbHVlICk7XG5cblx0XHR9IGVsc2UgaWYgKCB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICkge1xuXG5cdFx0XHR0aGlzLnNldFN0eWxlKCB2YWx1ZSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRTY2FsYXI6IGZ1bmN0aW9uICggc2NhbGFyICkge1xuXG5cdFx0dGhpcy5yID0gc2NhbGFyO1xuXHRcdHRoaXMuZyA9IHNjYWxhcjtcblx0XHR0aGlzLmIgPSBzY2FsYXI7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEhleDogZnVuY3Rpb24gKCBoZXggKSB7XG5cblx0XHRoZXggPSBNYXRoLmZsb29yKCBoZXggKTtcblxuXHRcdHRoaXMuciA9ICggaGV4ID4+IDE2ICYgMjU1ICkgLyAyNTU7XG5cdFx0dGhpcy5nID0gKCBoZXggPj4gOCAmIDI1NSApIC8gMjU1O1xuXHRcdHRoaXMuYiA9ICggaGV4ICYgMjU1ICkgLyAyNTU7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFJHQjogZnVuY3Rpb24gKCByLCBnLCBiICkge1xuXG5cdFx0dGhpcy5yID0gcjtcblx0XHR0aGlzLmcgPSBnO1xuXHRcdHRoaXMuYiA9IGI7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEhTTDogZnVuY3Rpb24gKCkge1xuXG5cdFx0ZnVuY3Rpb24gaHVlMnJnYiggcCwgcSwgdCApIHtcblxuXHRcdFx0aWYgKCB0IDwgMCApIHQgKz0gMTtcblx0XHRcdGlmICggdCA+IDEgKSB0IC09IDE7XG5cdFx0XHRpZiAoIHQgPCAxIC8gNiApIHJldHVybiBwICsgKCBxIC0gcCApICogNiAqIHQ7XG5cdFx0XHRpZiAoIHQgPCAxIC8gMiApIHJldHVybiBxO1xuXHRcdFx0aWYgKCB0IDwgMiAvIDMgKSByZXR1cm4gcCArICggcSAtIHAgKSAqIDYgKiAoIDIgLyAzIC0gdCApO1xuXHRcdFx0cmV0dXJuIHA7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gc2V0SFNMKCBoLCBzLCBsICkge1xuXG5cdFx0XHQvLyBoLHMsbCByYW5nZXMgYXJlIGluIDAuMCAtIDEuMFxuXHRcdFx0aCA9IF9NYXRoLmV1Y2xpZGVhbk1vZHVsbyggaCwgMSApO1xuXHRcdFx0cyA9IF9NYXRoLmNsYW1wKCBzLCAwLCAxICk7XG5cdFx0XHRsID0gX01hdGguY2xhbXAoIGwsIDAsIDEgKTtcblxuXHRcdFx0aWYgKCBzID09PSAwICkge1xuXG5cdFx0XHRcdHRoaXMuciA9IHRoaXMuZyA9IHRoaXMuYiA9IGw7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0dmFyIHAgPSBsIDw9IDAuNSA/IGwgKiAoIDEgKyBzICkgOiBsICsgcyAtICggbCAqIHMgKTtcblx0XHRcdFx0dmFyIHEgPSAoIDIgKiBsICkgLSBwO1xuXG5cdFx0XHRcdHRoaXMuciA9IGh1ZTJyZ2IoIHEsIHAsIGggKyAxIC8gMyApO1xuXHRcdFx0XHR0aGlzLmcgPSBodWUycmdiKCBxLCBwLCBoICk7XG5cdFx0XHRcdHRoaXMuYiA9IGh1ZTJyZ2IoIHEsIHAsIGggLSAxIC8gMyApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0c2V0U3R5bGU6IGZ1bmN0aW9uICggc3R5bGUgKSB7XG5cblx0XHRmdW5jdGlvbiBoYW5kbGVBbHBoYSggc3RyaW5nICkge1xuXG5cdFx0XHRpZiAoIHN0cmluZyA9PT0gdW5kZWZpbmVkICkgcmV0dXJuO1xuXG5cdFx0XHRpZiAoIHBhcnNlRmxvYXQoIHN0cmluZyApIDwgMSApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Db2xvcjogQWxwaGEgY29tcG9uZW50IG9mICcgKyBzdHlsZSArICcgd2lsbCBiZSBpZ25vcmVkLicgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cblx0XHR2YXIgbTtcblxuXHRcdGlmICggbSA9IC9eKCg/OnJnYnxoc2wpYT8pXFwoXFxzKihbXlxcKV0qKVxcKS8uZXhlYyggc3R5bGUgKSApIHtcblxuXHRcdFx0Ly8gcmdiIC8gaHNsXG5cblx0XHRcdHZhciBjb2xvcjtcblx0XHRcdHZhciBuYW1lID0gbVsgMSBdO1xuXHRcdFx0dmFyIGNvbXBvbmVudHMgPSBtWyAyIF07XG5cblx0XHRcdHN3aXRjaCAoIG5hbWUgKSB7XG5cblx0XHRcdFx0Y2FzZSAncmdiJzpcblx0XHRcdFx0Y2FzZSAncmdiYSc6XG5cblx0XHRcdFx0XHRpZiAoIGNvbG9yID0gL14oXFxkKylcXHMqLFxccyooXFxkKylcXHMqLFxccyooXFxkKylcXHMqKCxcXHMqKFswLTldKlxcLj9bMC05XSspXFxzKik/JC8uZXhlYyggY29tcG9uZW50cyApICkge1xuXG5cdFx0XHRcdFx0XHQvLyByZ2IoMjU1LDAsMCkgcmdiYSgyNTUsMCwwLDAuNSlcblx0XHRcdFx0XHRcdHRoaXMuciA9IE1hdGgubWluKCAyNTUsIHBhcnNlSW50KCBjb2xvclsgMSBdLCAxMCApICkgLyAyNTU7XG5cdFx0XHRcdFx0XHR0aGlzLmcgPSBNYXRoLm1pbiggMjU1LCBwYXJzZUludCggY29sb3JbIDIgXSwgMTAgKSApIC8gMjU1O1xuXHRcdFx0XHRcdFx0dGhpcy5iID0gTWF0aC5taW4oIDI1NSwgcGFyc2VJbnQoIGNvbG9yWyAzIF0sIDEwICkgKSAvIDI1NTtcblxuXHRcdFx0XHRcdFx0aGFuZGxlQWxwaGEoIGNvbG9yWyA1IF0gKTtcblxuXHRcdFx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoIGNvbG9yID0gL14oXFxkKylcXCVcXHMqLFxccyooXFxkKylcXCVcXHMqLFxccyooXFxkKylcXCVcXHMqKCxcXHMqKFswLTldKlxcLj9bMC05XSspXFxzKik/JC8uZXhlYyggY29tcG9uZW50cyApICkge1xuXG5cdFx0XHRcdFx0XHQvLyByZ2IoMTAwJSwwJSwwJSkgcmdiYSgxMDAlLDAlLDAlLDAuNSlcblx0XHRcdFx0XHRcdHRoaXMuciA9IE1hdGgubWluKCAxMDAsIHBhcnNlSW50KCBjb2xvclsgMSBdLCAxMCApICkgLyAxMDA7XG5cdFx0XHRcdFx0XHR0aGlzLmcgPSBNYXRoLm1pbiggMTAwLCBwYXJzZUludCggY29sb3JbIDIgXSwgMTAgKSApIC8gMTAwO1xuXHRcdFx0XHRcdFx0dGhpcy5iID0gTWF0aC5taW4oIDEwMCwgcGFyc2VJbnQoIGNvbG9yWyAzIF0sIDEwICkgKSAvIDEwMDtcblxuXHRcdFx0XHRcdFx0aGFuZGxlQWxwaGEoIGNvbG9yWyA1IF0gKTtcblxuXHRcdFx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlICdoc2wnOlxuXHRcdFx0XHRjYXNlICdoc2xhJzpcblxuXHRcdFx0XHRcdGlmICggY29sb3IgPSAvXihbMC05XSpcXC4/WzAtOV0rKVxccyosXFxzKihcXGQrKVxcJVxccyosXFxzKihcXGQrKVxcJVxccyooLFxccyooWzAtOV0qXFwuP1swLTldKylcXHMqKT8kLy5leGVjKCBjb21wb25lbnRzICkgKSB7XG5cblx0XHRcdFx0XHRcdC8vIGhzbCgxMjAsNTAlLDUwJSkgaHNsYSgxMjAsNTAlLDUwJSwwLjUpXG5cdFx0XHRcdFx0XHR2YXIgaCA9IHBhcnNlRmxvYXQoIGNvbG9yWyAxIF0gKSAvIDM2MDtcblx0XHRcdFx0XHRcdHZhciBzID0gcGFyc2VJbnQoIGNvbG9yWyAyIF0sIDEwICkgLyAxMDA7XG5cdFx0XHRcdFx0XHR2YXIgbCA9IHBhcnNlSW50KCBjb2xvclsgMyBdLCAxMCApIC8gMTAwO1xuXG5cdFx0XHRcdFx0XHRoYW5kbGVBbHBoYSggY29sb3JbIDUgXSApO1xuXG5cdFx0XHRcdFx0XHRyZXR1cm4gdGhpcy5zZXRIU0woIGgsIHMsIGwgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2UgaWYgKCBtID0gL15cXCMoW0EtRmEtZjAtOV0rKSQvLmV4ZWMoIHN0eWxlICkgKSB7XG5cblx0XHRcdC8vIGhleCBjb2xvclxuXG5cdFx0XHR2YXIgaGV4ID0gbVsgMSBdO1xuXHRcdFx0dmFyIHNpemUgPSBoZXgubGVuZ3RoO1xuXG5cdFx0XHRpZiAoIHNpemUgPT09IDMgKSB7XG5cblx0XHRcdFx0Ly8gI2ZmMFxuXHRcdFx0XHR0aGlzLnIgPSBwYXJzZUludCggaGV4LmNoYXJBdCggMCApICsgaGV4LmNoYXJBdCggMCApLCAxNiApIC8gMjU1O1xuXHRcdFx0XHR0aGlzLmcgPSBwYXJzZUludCggaGV4LmNoYXJBdCggMSApICsgaGV4LmNoYXJBdCggMSApLCAxNiApIC8gMjU1O1xuXHRcdFx0XHR0aGlzLmIgPSBwYXJzZUludCggaGV4LmNoYXJBdCggMiApICsgaGV4LmNoYXJBdCggMiApLCAxNiApIC8gMjU1O1xuXG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBzaXplID09PSA2ICkge1xuXG5cdFx0XHRcdC8vICNmZjAwMDBcblx0XHRcdFx0dGhpcy5yID0gcGFyc2VJbnQoIGhleC5jaGFyQXQoIDAgKSArIGhleC5jaGFyQXQoIDEgKSwgMTYgKSAvIDI1NTtcblx0XHRcdFx0dGhpcy5nID0gcGFyc2VJbnQoIGhleC5jaGFyQXQoIDIgKSArIGhleC5jaGFyQXQoIDMgKSwgMTYgKSAvIDI1NTtcblx0XHRcdFx0dGhpcy5iID0gcGFyc2VJbnQoIGhleC5jaGFyQXQoIDQgKSArIGhleC5jaGFyQXQoIDUgKSwgMTYgKSAvIDI1NTtcblxuXHRcdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCBzdHlsZSAmJiBzdHlsZS5sZW5ndGggPiAwICkge1xuXG5cdFx0XHQvLyBjb2xvciBrZXl3b3Jkc1xuXHRcdFx0dmFyIGhleCA9IENvbG9yS2V5d29yZHNbIHN0eWxlIF07XG5cblx0XHRcdGlmICggaGV4ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Ly8gcmVkXG5cdFx0XHRcdHRoaXMuc2V0SGV4KCBoZXggKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyB1bmtub3duIGNvbG9yXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkNvbG9yOiBVbmtub3duIGNvbG9yICcgKyBzdHlsZSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoIHRoaXMuciwgdGhpcy5nLCB0aGlzLmIgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggY29sb3IgKSB7XG5cblx0XHR0aGlzLnIgPSBjb2xvci5yO1xuXHRcdHRoaXMuZyA9IGNvbG9yLmc7XG5cdFx0dGhpcy5iID0gY29sb3IuYjtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y29weUdhbW1hVG9MaW5lYXI6IGZ1bmN0aW9uICggY29sb3IsIGdhbW1hRmFjdG9yICkge1xuXG5cdFx0aWYgKCBnYW1tYUZhY3RvciA9PT0gdW5kZWZpbmVkICkgZ2FtbWFGYWN0b3IgPSAyLjA7XG5cblx0XHR0aGlzLnIgPSBNYXRoLnBvdyggY29sb3IuciwgZ2FtbWFGYWN0b3IgKTtcblx0XHR0aGlzLmcgPSBNYXRoLnBvdyggY29sb3IuZywgZ2FtbWFGYWN0b3IgKTtcblx0XHR0aGlzLmIgPSBNYXRoLnBvdyggY29sb3IuYiwgZ2FtbWFGYWN0b3IgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y29weUxpbmVhclRvR2FtbWE6IGZ1bmN0aW9uICggY29sb3IsIGdhbW1hRmFjdG9yICkge1xuXG5cdFx0aWYgKCBnYW1tYUZhY3RvciA9PT0gdW5kZWZpbmVkICkgZ2FtbWFGYWN0b3IgPSAyLjA7XG5cblx0XHR2YXIgc2FmZUludmVyc2UgPSAoIGdhbW1hRmFjdG9yID4gMCApID8gKCAxLjAgLyBnYW1tYUZhY3RvciApIDogMS4wO1xuXG5cdFx0dGhpcy5yID0gTWF0aC5wb3coIGNvbG9yLnIsIHNhZmVJbnZlcnNlICk7XG5cdFx0dGhpcy5nID0gTWF0aC5wb3coIGNvbG9yLmcsIHNhZmVJbnZlcnNlICk7XG5cdFx0dGhpcy5iID0gTWF0aC5wb3coIGNvbG9yLmIsIHNhZmVJbnZlcnNlICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvbnZlcnRHYW1tYVRvTGluZWFyOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgciA9IHRoaXMuciwgZyA9IHRoaXMuZywgYiA9IHRoaXMuYjtcblxuXHRcdHRoaXMuciA9IHIgKiByO1xuXHRcdHRoaXMuZyA9IGcgKiBnO1xuXHRcdHRoaXMuYiA9IGIgKiBiO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjb252ZXJ0TGluZWFyVG9HYW1tYTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5yID0gTWF0aC5zcXJ0KCB0aGlzLnIgKTtcblx0XHR0aGlzLmcgPSBNYXRoLnNxcnQoIHRoaXMuZyApO1xuXHRcdHRoaXMuYiA9IE1hdGguc3FydCggdGhpcy5iICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGdldEhleDogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuICggdGhpcy5yICogMjU1ICkgPDwgMTYgXiAoIHRoaXMuZyAqIDI1NSApIDw8IDggXiAoIHRoaXMuYiAqIDI1NSApIDw8IDA7XG5cblx0fSxcblxuXHRnZXRIZXhTdHJpbmc6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiAoICcwMDAwMDAnICsgdGhpcy5nZXRIZXgoKS50b1N0cmluZyggMTYgKSApLnNsaWNlKCAtIDYgKTtcblxuXHR9LFxuXG5cdGdldEhTTDogZnVuY3Rpb24gKCBvcHRpb25hbFRhcmdldCApIHtcblxuXHRcdC8vIGgscyxsIHJhbmdlcyBhcmUgaW4gMC4wIC0gMS4wXG5cblx0XHR2YXIgaHNsID0gb3B0aW9uYWxUYXJnZXQgfHwgeyBoOiAwLCBzOiAwLCBsOiAwIH07XG5cblx0XHR2YXIgciA9IHRoaXMuciwgZyA9IHRoaXMuZywgYiA9IHRoaXMuYjtcblxuXHRcdHZhciBtYXggPSBNYXRoLm1heCggciwgZywgYiApO1xuXHRcdHZhciBtaW4gPSBNYXRoLm1pbiggciwgZywgYiApO1xuXG5cdFx0dmFyIGh1ZSwgc2F0dXJhdGlvbjtcblx0XHR2YXIgbGlnaHRuZXNzID0gKCBtaW4gKyBtYXggKSAvIDIuMDtcblxuXHRcdGlmICggbWluID09PSBtYXggKSB7XG5cblx0XHRcdGh1ZSA9IDA7XG5cdFx0XHRzYXR1cmF0aW9uID0gMDtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHZhciBkZWx0YSA9IG1heCAtIG1pbjtcblxuXHRcdFx0c2F0dXJhdGlvbiA9IGxpZ2h0bmVzcyA8PSAwLjUgPyBkZWx0YSAvICggbWF4ICsgbWluICkgOiBkZWx0YSAvICggMiAtIG1heCAtIG1pbiApO1xuXG5cdFx0XHRzd2l0Y2ggKCBtYXggKSB7XG5cblx0XHRcdFx0Y2FzZSByOiBodWUgPSAoIGcgLSBiICkgLyBkZWx0YSArICggZyA8IGIgPyA2IDogMCApOyBicmVhaztcblx0XHRcdFx0Y2FzZSBnOiBodWUgPSAoIGIgLSByICkgLyBkZWx0YSArIDI7IGJyZWFrO1xuXHRcdFx0XHRjYXNlIGI6IGh1ZSA9ICggciAtIGcgKSAvIGRlbHRhICsgNDsgYnJlYWs7XG5cblx0XHRcdH1cblxuXHRcdFx0aHVlIC89IDY7XG5cblx0XHR9XG5cblx0XHRoc2wuaCA9IGh1ZTtcblx0XHRoc2wucyA9IHNhdHVyYXRpb247XG5cdFx0aHNsLmwgPSBsaWdodG5lc3M7XG5cblx0XHRyZXR1cm4gaHNsO1xuXG5cdH0sXG5cblx0Z2V0U3R5bGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiAncmdiKCcgKyAoICggdGhpcy5yICogMjU1ICkgfCAwICkgKyAnLCcgKyAoICggdGhpcy5nICogMjU1ICkgfCAwICkgKyAnLCcgKyAoICggdGhpcy5iICogMjU1ICkgfCAwICkgKyAnKSc7XG5cblx0fSxcblxuXHRvZmZzZXRIU0w6IGZ1bmN0aW9uICggaCwgcywgbCApIHtcblxuXHRcdHZhciBoc2wgPSB0aGlzLmdldEhTTCgpO1xuXG5cdFx0aHNsLmggKz0gaDsgaHNsLnMgKz0gczsgaHNsLmwgKz0gbDtcblxuXHRcdHRoaXMuc2V0SFNMKCBoc2wuaCwgaHNsLnMsIGhzbC5sICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFkZDogZnVuY3Rpb24gKCBjb2xvciApIHtcblxuXHRcdHRoaXMuciArPSBjb2xvci5yO1xuXHRcdHRoaXMuZyArPSBjb2xvci5nO1xuXHRcdHRoaXMuYiArPSBjb2xvci5iO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRhZGRDb2xvcnM6IGZ1bmN0aW9uICggY29sb3IxLCBjb2xvcjIgKSB7XG5cblx0XHR0aGlzLnIgPSBjb2xvcjEuciArIGNvbG9yMi5yO1xuXHRcdHRoaXMuZyA9IGNvbG9yMS5nICsgY29sb3IyLmc7XG5cdFx0dGhpcy5iID0gY29sb3IxLmIgKyBjb2xvcjIuYjtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YWRkU2NhbGFyOiBmdW5jdGlvbiAoIHMgKSB7XG5cblx0XHR0aGlzLnIgKz0gcztcblx0XHR0aGlzLmcgKz0gcztcblx0XHR0aGlzLmIgKz0gcztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c3ViOiBmdW5jdGlvbiggY29sb3IgKSB7XG5cblx0XHR0aGlzLnIgPSBNYXRoLm1heCggMCwgdGhpcy5yIC0gY29sb3IuciApO1xuXHRcdHRoaXMuZyA9IE1hdGgubWF4KCAwLCB0aGlzLmcgLSBjb2xvci5nICk7XG5cdFx0dGhpcy5iID0gTWF0aC5tYXgoIDAsIHRoaXMuYiAtIGNvbG9yLmIgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bXVsdGlwbHk6IGZ1bmN0aW9uICggY29sb3IgKSB7XG5cblx0XHR0aGlzLnIgKj0gY29sb3Iucjtcblx0XHR0aGlzLmcgKj0gY29sb3IuZztcblx0XHR0aGlzLmIgKj0gY29sb3IuYjtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bXVsdGlwbHlTY2FsYXI6IGZ1bmN0aW9uICggcyApIHtcblxuXHRcdHRoaXMuciAqPSBzO1xuXHRcdHRoaXMuZyAqPSBzO1xuXHRcdHRoaXMuYiAqPSBzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRsZXJwOiBmdW5jdGlvbiAoIGNvbG9yLCBhbHBoYSApIHtcblxuXHRcdHRoaXMuciArPSAoIGNvbG9yLnIgLSB0aGlzLnIgKSAqIGFscGhhO1xuXHRcdHRoaXMuZyArPSAoIGNvbG9yLmcgLSB0aGlzLmcgKSAqIGFscGhhO1xuXHRcdHRoaXMuYiArPSAoIGNvbG9yLmIgLSB0aGlzLmIgKSAqIGFscGhhO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRlcXVhbHM6IGZ1bmN0aW9uICggYyApIHtcblxuXHRcdHJldHVybiAoIGMuciA9PT0gdGhpcy5yICkgJiYgKCBjLmcgPT09IHRoaXMuZyApICYmICggYy5iID09PSB0aGlzLmIgKTtcblxuXHR9LFxuXG5cdGZyb21BcnJheTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0aWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7XG5cblx0XHR0aGlzLnIgPSBhcnJheVsgb2Zmc2V0IF07XG5cdFx0dGhpcy5nID0gYXJyYXlbIG9mZnNldCArIDEgXTtcblx0XHR0aGlzLmIgPSBhcnJheVsgb2Zmc2V0ICsgMiBdO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHR0b0FycmF5OiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoIGFycmF5ID09PSB1bmRlZmluZWQgKSBhcnJheSA9IFtdO1xuXHRcdGlmICggb2Zmc2V0ID09PSB1bmRlZmluZWQgKSBvZmZzZXQgPSAwO1xuXG5cdFx0YXJyYXlbIG9mZnNldCBdID0gdGhpcy5yO1xuXHRcdGFycmF5WyBvZmZzZXQgKyAxIF0gPSB0aGlzLmc7XG5cdFx0YXJyYXlbIG9mZnNldCArIDIgXSA9IHRoaXMuYjtcblxuXHRcdHJldHVybiBhcnJheTtcblxuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZ2V0SGV4KCk7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogVW5pZm9ybXMgbGlicmFyeSBmb3Igc2hhcmVkIHdlYmdsIHNoYWRlcnNcbiAqL1xuXG52YXIgVW5pZm9ybXNMaWIgPSB7XG5cblx0Y29tbW9uOiB7XG5cblx0XHRkaWZmdXNlOiB7IHZhbHVlOiBuZXcgQ29sb3IoIDB4ZWVlZWVlICkgfSxcblx0XHRvcGFjaXR5OiB7IHZhbHVlOiAxLjAgfSxcblxuXHRcdG1hcDogeyB2YWx1ZTogbnVsbCB9LFxuXHRcdG9mZnNldFJlcGVhdDogeyB2YWx1ZTogbmV3IFZlY3RvcjQoIDAsIDAsIDEsIDEgKSB9LFxuXG5cdFx0c3BlY3VsYXJNYXA6IHsgdmFsdWU6IG51bGwgfSxcblx0XHRhbHBoYU1hcDogeyB2YWx1ZTogbnVsbCB9LFxuXG5cdFx0ZW52TWFwOiB7IHZhbHVlOiBudWxsIH0sXG5cdFx0ZmxpcEVudk1hcDogeyB2YWx1ZTogLSAxIH0sXG5cdFx0cmVmbGVjdGl2aXR5OiB7IHZhbHVlOiAxLjAgfSxcblx0XHRyZWZyYWN0aW9uUmF0aW86IHsgdmFsdWU6IDAuOTggfVxuXG5cdH0sXG5cblx0YW9tYXA6IHtcblxuXHRcdGFvTWFwOiB7IHZhbHVlOiBudWxsIH0sXG5cdFx0YW9NYXBJbnRlbnNpdHk6IHsgdmFsdWU6IDEgfVxuXG5cdH0sXG5cblx0bGlnaHRtYXA6IHtcblxuXHRcdGxpZ2h0TWFwOiB7IHZhbHVlOiBudWxsIH0sXG5cdFx0bGlnaHRNYXBJbnRlbnNpdHk6IHsgdmFsdWU6IDEgfVxuXG5cdH0sXG5cblx0ZW1pc3NpdmVtYXA6IHtcblxuXHRcdGVtaXNzaXZlTWFwOiB7IHZhbHVlOiBudWxsIH1cblxuXHR9LFxuXG5cdGJ1bXBtYXA6IHtcblxuXHRcdGJ1bXBNYXA6IHsgdmFsdWU6IG51bGwgfSxcblx0XHRidW1wU2NhbGU6IHsgdmFsdWU6IDEgfVxuXG5cdH0sXG5cblx0bm9ybWFsbWFwOiB7XG5cblx0XHRub3JtYWxNYXA6IHsgdmFsdWU6IG51bGwgfSxcblx0XHRub3JtYWxTY2FsZTogeyB2YWx1ZTogbmV3IFZlY3RvcjIoIDEsIDEgKSB9XG5cblx0fSxcblxuXHRkaXNwbGFjZW1lbnRtYXA6IHtcblxuXHRcdGRpc3BsYWNlbWVudE1hcDogeyB2YWx1ZTogbnVsbCB9LFxuXHRcdGRpc3BsYWNlbWVudFNjYWxlOiB7IHZhbHVlOiAxIH0sXG5cdFx0ZGlzcGxhY2VtZW50QmlhczogeyB2YWx1ZTogMCB9XG5cblx0fSxcblxuXHRyb3VnaG5lc3NtYXA6IHtcblxuXHRcdHJvdWdobmVzc01hcDogeyB2YWx1ZTogbnVsbCB9XG5cblx0fSxcblxuXHRtZXRhbG5lc3NtYXA6IHtcblxuXHRcdG1ldGFsbmVzc01hcDogeyB2YWx1ZTogbnVsbCB9XG5cblx0fSxcblxuXHRncmFkaWVudG1hcDoge1xuXG5cdFx0Z3JhZGllbnRNYXA6IHsgdmFsdWU6IG51bGwgfVxuXG5cdH0sXG5cblx0Zm9nOiB7XG5cblx0XHRmb2dEZW5zaXR5OiB7IHZhbHVlOiAwLjAwMDI1IH0sXG5cdFx0Zm9nTmVhcjogeyB2YWx1ZTogMSB9LFxuXHRcdGZvZ0ZhcjogeyB2YWx1ZTogMjAwMCB9LFxuXHRcdGZvZ0NvbG9yOiB7IHZhbHVlOiBuZXcgQ29sb3IoIDB4ZmZmZmZmICkgfVxuXG5cdH0sXG5cblx0bGlnaHRzOiB7XG5cblx0XHRhbWJpZW50TGlnaHRDb2xvcjogeyB2YWx1ZTogW10gfSxcblxuXHRcdGRpcmVjdGlvbmFsTGlnaHRzOiB7IHZhbHVlOiBbXSwgcHJvcGVydGllczoge1xuXHRcdFx0ZGlyZWN0aW9uOiB7fSxcblx0XHRcdGNvbG9yOiB7fSxcblxuXHRcdFx0c2hhZG93OiB7fSxcblx0XHRcdHNoYWRvd0JpYXM6IHt9LFxuXHRcdFx0c2hhZG93UmFkaXVzOiB7fSxcblx0XHRcdHNoYWRvd01hcFNpemU6IHt9XG5cdFx0fSB9LFxuXG5cdFx0ZGlyZWN0aW9uYWxTaGFkb3dNYXA6IHsgdmFsdWU6IFtdIH0sXG5cdFx0ZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXg6IHsgdmFsdWU6IFtdIH0sXG5cblx0XHRzcG90TGlnaHRzOiB7IHZhbHVlOiBbXSwgcHJvcGVydGllczoge1xuXHRcdFx0Y29sb3I6IHt9LFxuXHRcdFx0cG9zaXRpb246IHt9LFxuXHRcdFx0ZGlyZWN0aW9uOiB7fSxcblx0XHRcdGRpc3RhbmNlOiB7fSxcblx0XHRcdGNvbmVDb3M6IHt9LFxuXHRcdFx0cGVudW1icmFDb3M6IHt9LFxuXHRcdFx0ZGVjYXk6IHt9LFxuXG5cdFx0XHRzaGFkb3c6IHt9LFxuXHRcdFx0c2hhZG93Qmlhczoge30sXG5cdFx0XHRzaGFkb3dSYWRpdXM6IHt9LFxuXHRcdFx0c2hhZG93TWFwU2l6ZToge31cblx0XHR9IH0sXG5cblx0XHRzcG90U2hhZG93TWFwOiB7IHZhbHVlOiBbXSB9LFxuXHRcdHNwb3RTaGFkb3dNYXRyaXg6IHsgdmFsdWU6IFtdIH0sXG5cblx0XHRwb2ludExpZ2h0czogeyB2YWx1ZTogW10sIHByb3BlcnRpZXM6IHtcblx0XHRcdGNvbG9yOiB7fSxcblx0XHRcdHBvc2l0aW9uOiB7fSxcblx0XHRcdGRlY2F5OiB7fSxcblx0XHRcdGRpc3RhbmNlOiB7fSxcblxuXHRcdFx0c2hhZG93OiB7fSxcblx0XHRcdHNoYWRvd0JpYXM6IHt9LFxuXHRcdFx0c2hhZG93UmFkaXVzOiB7fSxcblx0XHRcdHNoYWRvd01hcFNpemU6IHt9XG5cdFx0fSB9LFxuXG5cdFx0cG9pbnRTaGFkb3dNYXA6IHsgdmFsdWU6IFtdIH0sXG5cdFx0cG9pbnRTaGFkb3dNYXRyaXg6IHsgdmFsdWU6IFtdIH0sXG5cblx0XHRoZW1pc3BoZXJlTGlnaHRzOiB7IHZhbHVlOiBbXSwgcHJvcGVydGllczoge1xuXHRcdFx0ZGlyZWN0aW9uOiB7fSxcblx0XHRcdHNreUNvbG9yOiB7fSxcblx0XHRcdGdyb3VuZENvbG9yOiB7fVxuXHRcdH0gfSxcblxuXHRcdC8vIFRPRE8gKGFiZWxuYXRpb24pOiBSZWN0QXJlYUxpZ2h0IEJSREYgZGF0YSBuZWVkcyB0byBiZSBtb3ZlZCBmcm9tIGV4YW1wbGUgdG8gbWFpbiBzcmNcblx0XHRyZWN0QXJlYUxpZ2h0czogeyB2YWx1ZTogW10sIHByb3BlcnRpZXM6IHtcblx0XHRcdGNvbG9yOiB7fSxcblx0XHRcdHBvc2l0aW9uOiB7fSxcblx0XHRcdHdpZHRoOiB7fSxcblx0XHRcdGhlaWdodDoge31cblx0XHR9IH1cblxuXHR9LFxuXG5cdHBvaW50czoge1xuXG5cdFx0ZGlmZnVzZTogeyB2YWx1ZTogbmV3IENvbG9yKCAweGVlZWVlZSApIH0sXG5cdFx0b3BhY2l0eTogeyB2YWx1ZTogMS4wIH0sXG5cdFx0c2l6ZTogeyB2YWx1ZTogMS4wIH0sXG5cdFx0c2NhbGU6IHsgdmFsdWU6IDEuMCB9LFxuXHRcdG1hcDogeyB2YWx1ZTogbnVsbCB9LFxuXHRcdG9mZnNldFJlcGVhdDogeyB2YWx1ZTogbmV3IFZlY3RvcjQoIDAsIDAsIDEsIDEgKSB9XG5cblx0fVxuXG59O1xuXG4vKipcbiAqIFVuaWZvcm0gVXRpbGl0aWVzXG4gKi9cblxudmFyIFVuaWZvcm1zVXRpbHMgPSB7XG5cblx0bWVyZ2U6IGZ1bmN0aW9uICggdW5pZm9ybXMgKSB7XG5cblx0XHR2YXIgbWVyZ2VkID0ge307XG5cblx0XHRmb3IgKCB2YXIgdSA9IDA7IHUgPCB1bmlmb3Jtcy5sZW5ndGg7IHUgKysgKSB7XG5cblx0XHRcdHZhciB0bXAgPSB0aGlzLmNsb25lKCB1bmlmb3Jtc1sgdSBdICk7XG5cblx0XHRcdGZvciAoIHZhciBwIGluIHRtcCApIHtcblxuXHRcdFx0XHRtZXJnZWRbIHAgXSA9IHRtcFsgcCBdO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gbWVyZ2VkO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICggdW5pZm9ybXNfc3JjICkge1xuXG5cdFx0dmFyIHVuaWZvcm1zX2RzdCA9IHt9O1xuXG5cdFx0Zm9yICggdmFyIHUgaW4gdW5pZm9ybXNfc3JjICkge1xuXG5cdFx0XHR1bmlmb3Jtc19kc3RbIHUgXSA9IHt9O1xuXG5cdFx0XHRmb3IgKCB2YXIgcCBpbiB1bmlmb3Jtc19zcmNbIHUgXSApIHtcblxuXHRcdFx0XHR2YXIgcGFyYW1ldGVyX3NyYyA9IHVuaWZvcm1zX3NyY1sgdSBdWyBwIF07XG5cblx0XHRcdFx0aWYgKCBwYXJhbWV0ZXJfc3JjICYmICggcGFyYW1ldGVyX3NyYy5pc0NvbG9yIHx8XG5cdFx0XHRcdFx0cGFyYW1ldGVyX3NyYy5pc01hdHJpeDMgfHwgcGFyYW1ldGVyX3NyYy5pc01hdHJpeDQgfHxcblx0XHRcdFx0XHRwYXJhbWV0ZXJfc3JjLmlzVmVjdG9yMiB8fCBwYXJhbWV0ZXJfc3JjLmlzVmVjdG9yMyB8fCBwYXJhbWV0ZXJfc3JjLmlzVmVjdG9yNCB8fFxuXHRcdFx0XHRcdHBhcmFtZXRlcl9zcmMuaXNUZXh0dXJlICkgKSB7XG5cblx0XHRcdFx0XHR1bmlmb3Jtc19kc3RbIHUgXVsgcCBdID0gcGFyYW1ldGVyX3NyYy5jbG9uZSgpO1xuXG5cdFx0XHRcdH0gZWxzZSBpZiAoIEFycmF5LmlzQXJyYXkoIHBhcmFtZXRlcl9zcmMgKSApIHtcblxuXHRcdFx0XHRcdHVuaWZvcm1zX2RzdFsgdSBdWyBwIF0gPSBwYXJhbWV0ZXJfc3JjLnNsaWNlKCk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHVuaWZvcm1zX2RzdFsgdSBdWyBwIF0gPSBwYXJhbWV0ZXJfc3JjO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHVuaWZvcm1zX2RzdDtcblxuXHR9XG5cbn07XG5cbnZhciBhbHBoYW1hcF9mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9BTFBIQU1BUFxcblxcdGRpZmZ1c2VDb2xvci5hICo9IHRleHR1cmUyRCggYWxwaGFNYXAsIHZVdiApLmc7XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBhbHBoYW1hcF9wYXJzX2ZyYWdtZW50ID0gXCIjaWZkZWYgVVNFX0FMUEhBTUFQXFxuXFx0dW5pZm9ybSBzYW1wbGVyMkQgYWxwaGFNYXA7XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBhbHBoYXRlc3RfZnJhZ21lbnQgPSBcIiNpZmRlZiBBTFBIQVRFU1RcXG5cXHRpZiAoIGRpZmZ1c2VDb2xvci5hIDwgQUxQSEFURVNUICkgZGlzY2FyZDtcXG4jZW5kaWZcXG5cIjtcblxudmFyIGFvbWFwX2ZyYWdtZW50ID0gXCIjaWZkZWYgVVNFX0FPTUFQXFxuXFx0ZmxvYXQgYW1iaWVudE9jY2x1c2lvbiA9ICggdGV4dHVyZTJEKCBhb01hcCwgdlV2MiApLnIgLSAxLjAgKSAqIGFvTWFwSW50ZW5zaXR5ICsgMS4wO1xcblxcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSAqPSBhbWJpZW50T2NjbHVzaW9uO1xcblxcdCNpZiBkZWZpbmVkKCBVU0VfRU5WTUFQICkgJiYgZGVmaW5lZCggUEhZU0lDQUwgKVxcblxcdFxcdGZsb2F0IGRvdE5WID0gc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBnZW9tZXRyeS52aWV3RGlyICkgKTtcXG5cXHRcXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICo9IGNvbXB1dGVTcGVjdWxhck9jY2x1c2lvbiggZG90TlYsIGFtYmllbnRPY2NsdXNpb24sIG1hdGVyaWFsLnNwZWN1bGFyUm91Z2huZXNzICk7XFxuXFx0I2VuZGlmXFxuI2VuZGlmXFxuXCI7XG5cbnZhciBhb21hcF9wYXJzX2ZyYWdtZW50ID0gXCIjaWZkZWYgVVNFX0FPTUFQXFxuXFx0dW5pZm9ybSBzYW1wbGVyMkQgYW9NYXA7XFxuXFx0dW5pZm9ybSBmbG9hdCBhb01hcEludGVuc2l0eTtcXG4jZW5kaWZcIjtcblxudmFyIGJlZ2luX3ZlcnRleCA9IFwiXFxudmVjMyB0cmFuc2Zvcm1lZCA9IHZlYzMoIHBvc2l0aW9uICk7XFxuXCI7XG5cbnZhciBiZWdpbm5vcm1hbF92ZXJ0ZXggPSBcIlxcbnZlYzMgb2JqZWN0Tm9ybWFsID0gdmVjMyggbm9ybWFsICk7XFxuXCI7XG5cbnZhciBic2RmcyA9IFwiZmxvYXQgcHVuY3R1YWxMaWdodEludGVuc2l0eVRvSXJyYWRpYW5jZUZhY3RvciggY29uc3QgaW4gZmxvYXQgbGlnaHREaXN0YW5jZSwgY29uc3QgaW4gZmxvYXQgY3V0b2ZmRGlzdGFuY2UsIGNvbnN0IGluIGZsb2F0IGRlY2F5RXhwb25lbnQgKSB7XFxuXFx0aWYoIGRlY2F5RXhwb25lbnQgPiAwLjAgKSB7XFxuI2lmIGRlZmluZWQgKCBQSFlTSUNBTExZX0NPUlJFQ1RfTElHSFRTIClcXG5cXHRcXHRmbG9hdCBkaXN0YW5jZUZhbGxvZmYgPSAxLjAgLyBtYXgoIHBvdyggbGlnaHREaXN0YW5jZSwgZGVjYXlFeHBvbmVudCApLCAwLjAxICk7XFxuXFx0XFx0ZmxvYXQgbWF4RGlzdGFuY2VDdXRvZmZGYWN0b3IgPSBwb3cyKCBzYXR1cmF0ZSggMS4wIC0gcG93NCggbGlnaHREaXN0YW5jZSAvIGN1dG9mZkRpc3RhbmNlICkgKSApO1xcblxcdFxcdHJldHVybiBkaXN0YW5jZUZhbGxvZmYgKiBtYXhEaXN0YW5jZUN1dG9mZkZhY3RvcjtcXG4jZWxzZVxcblxcdFxcdHJldHVybiBwb3coIHNhdHVyYXRlKCAtbGlnaHREaXN0YW5jZSAvIGN1dG9mZkRpc3RhbmNlICsgMS4wICksIGRlY2F5RXhwb25lbnQgKTtcXG4jZW5kaWZcXG5cXHR9XFxuXFx0cmV0dXJuIDEuMDtcXG59XFxudmVjMyBCUkRGX0RpZmZ1c2VfTGFtYmVydCggY29uc3QgaW4gdmVjMyBkaWZmdXNlQ29sb3IgKSB7XFxuXFx0cmV0dXJuIFJFQ0lQUk9DQUxfUEkgKiBkaWZmdXNlQ29sb3I7XFxufVxcbnZlYzMgRl9TY2hsaWNrKCBjb25zdCBpbiB2ZWMzIHNwZWN1bGFyQ29sb3IsIGNvbnN0IGluIGZsb2F0IGRvdExIICkge1xcblxcdGZsb2F0IGZyZXNuZWwgPSBleHAyKCAoIC01LjU1NDczICogZG90TEggLSA2Ljk4MzE2ICkgKiBkb3RMSCApO1xcblxcdHJldHVybiAoIDEuMCAtIHNwZWN1bGFyQ29sb3IgKSAqIGZyZXNuZWwgKyBzcGVjdWxhckNvbG9yO1xcbn1cXG5mbG9hdCBHX0dHWF9TbWl0aCggY29uc3QgaW4gZmxvYXQgYWxwaGEsIGNvbnN0IGluIGZsb2F0IGRvdE5MLCBjb25zdCBpbiBmbG9hdCBkb3ROViApIHtcXG5cXHRmbG9hdCBhMiA9IHBvdzIoIGFscGhhICk7XFxuXFx0ZmxvYXQgZ2wgPSBkb3ROTCArIHNxcnQoIGEyICsgKCAxLjAgLSBhMiApICogcG93MiggZG90TkwgKSApO1xcblxcdGZsb2F0IGd2ID0gZG90TlYgKyBzcXJ0KCBhMiArICggMS4wIC0gYTIgKSAqIHBvdzIoIGRvdE5WICkgKTtcXG5cXHRyZXR1cm4gMS4wIC8gKCBnbCAqIGd2ICk7XFxufVxcbmZsb2F0IEdfR0dYX1NtaXRoQ29ycmVsYXRlZCggY29uc3QgaW4gZmxvYXQgYWxwaGEsIGNvbnN0IGluIGZsb2F0IGRvdE5MLCBjb25zdCBpbiBmbG9hdCBkb3ROViApIHtcXG5cXHRmbG9hdCBhMiA9IHBvdzIoIGFscGhhICk7XFxuXFx0ZmxvYXQgZ3YgPSBkb3ROTCAqIHNxcnQoIGEyICsgKCAxLjAgLSBhMiApICogcG93MiggZG90TlYgKSApO1xcblxcdGZsb2F0IGdsID0gZG90TlYgKiBzcXJ0KCBhMiArICggMS4wIC0gYTIgKSAqIHBvdzIoIGRvdE5MICkgKTtcXG5cXHRyZXR1cm4gMC41IC8gbWF4KCBndiArIGdsLCBFUFNJTE9OICk7XFxufVxcbmZsb2F0IERfR0dYKCBjb25zdCBpbiBmbG9hdCBhbHBoYSwgY29uc3QgaW4gZmxvYXQgZG90TkggKSB7XFxuXFx0ZmxvYXQgYTIgPSBwb3cyKCBhbHBoYSApO1xcblxcdGZsb2F0IGRlbm9tID0gcG93MiggZG90TkggKSAqICggYTIgLSAxLjAgKSArIDEuMDtcXG5cXHRyZXR1cm4gUkVDSVBST0NBTF9QSSAqIGEyIC8gcG93MiggZGVub20gKTtcXG59XFxudmVjMyBCUkRGX1NwZWN1bGFyX0dHWCggY29uc3QgaW4gSW5jaWRlbnRMaWdodCBpbmNpZGVudExpZ2h0LCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiB2ZWMzIHNwZWN1bGFyQ29sb3IsIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcyApIHtcXG5cXHRmbG9hdCBhbHBoYSA9IHBvdzIoIHJvdWdobmVzcyApO1xcblxcdHZlYzMgaGFsZkRpciA9IG5vcm1hbGl6ZSggaW5jaWRlbnRMaWdodC5kaXJlY3Rpb24gKyBnZW9tZXRyeS52aWV3RGlyICk7XFxuXFx0ZmxvYXQgZG90TkwgPSBzYXR1cmF0ZSggZG90KCBnZW9tZXRyeS5ub3JtYWwsIGluY2lkZW50TGlnaHQuZGlyZWN0aW9uICkgKTtcXG5cXHRmbG9hdCBkb3ROViA9IHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZ2VvbWV0cnkudmlld0RpciApICk7XFxuXFx0ZmxvYXQgZG90TkggPSBzYXR1cmF0ZSggZG90KCBnZW9tZXRyeS5ub3JtYWwsIGhhbGZEaXIgKSApO1xcblxcdGZsb2F0IGRvdExIID0gc2F0dXJhdGUoIGRvdCggaW5jaWRlbnRMaWdodC5kaXJlY3Rpb24sIGhhbGZEaXIgKSApO1xcblxcdHZlYzMgRiA9IEZfU2NobGljayggc3BlY3VsYXJDb2xvciwgZG90TEggKTtcXG5cXHRmbG9hdCBHID0gR19HR1hfU21pdGhDb3JyZWxhdGVkKCBhbHBoYSwgZG90TkwsIGRvdE5WICk7XFxuXFx0ZmxvYXQgRCA9IERfR0dYKCBhbHBoYSwgZG90TkggKTtcXG5cXHRyZXR1cm4gRiAqICggRyAqIEQgKTtcXG59XFxudmVjMiBMVENfVXYoIGNvbnN0IGluIHZlYzMgTiwgY29uc3QgaW4gdmVjMyBWLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7XFxuXFx0Y29uc3QgZmxvYXQgTFVUX1NJWkUgID0gNjQuMDtcXG5cXHRjb25zdCBmbG9hdCBMVVRfU0NBTEUgPSAoIExVVF9TSVpFIC0gMS4wICkgLyBMVVRfU0laRTtcXG5cXHRjb25zdCBmbG9hdCBMVVRfQklBUyAgPSAwLjUgLyBMVVRfU0laRTtcXG5cXHRmbG9hdCB0aGV0YSA9IGFjb3MoIGRvdCggTiwgViApICk7XFxuXFx0dmVjMiB1diA9IHZlYzIoXFxuXFx0XFx0c3FydCggc2F0dXJhdGUoIHJvdWdobmVzcyApICksXFxuXFx0XFx0c2F0dXJhdGUoIHRoZXRhIC8gKCAwLjUgKiBQSSApICkgKTtcXG5cXHR1diA9IHV2ICogTFVUX1NDQUxFICsgTFVUX0JJQVM7XFxuXFx0cmV0dXJuIHV2O1xcbn1cXG5mbG9hdCBMVENfQ2xpcHBlZFNwaGVyZUZvcm1GYWN0b3IoIGNvbnN0IGluIHZlYzMgZiApIHtcXG5cXHRmbG9hdCBsID0gbGVuZ3RoKCBmICk7XFxuXFx0cmV0dXJuIG1heCggKCBsICogbCArIGYueiApIC8gKCBsICsgMS4wICksIDAuMCApO1xcbn1cXG52ZWMzIExUQ19FZGdlVmVjdG9yRm9ybUZhY3RvciggY29uc3QgaW4gdmVjMyB2MSwgY29uc3QgaW4gdmVjMyB2MiApIHtcXG5cXHRmbG9hdCB4ID0gZG90KCB2MSwgdjIgKTtcXG5cXHRmbG9hdCB5ID0gYWJzKCB4ICk7XFxuXFx0ZmxvYXQgYSA9IDAuODYyNjcgKyAoMC40OTc4OCArIDAuMDE0MzYgKiB5ICkgKiB5O1xcblxcdGZsb2F0IGIgPSAzLjQ1MDY4ICsgKDQuMTg4MTQgKyB5KSAqIHk7XFxuXFx0ZmxvYXQgdiA9IGEgLyBiO1xcblxcdGZsb2F0IHRoZXRhX3NpbnRoZXRhID0gKHggPiAwLjApID8gdiA6IDAuNSAqIGludmVyc2VzcXJ0KCAxLjAgLSB4ICogeCApIC0gdjtcXG5cXHRyZXR1cm4gY3Jvc3MoIHYxLCB2MiApICogdGhldGFfc2ludGhldGE7XFxufVxcbnZlYzMgTFRDX0V2YWx1YXRlKCBjb25zdCBpbiB2ZWMzIE4sIGNvbnN0IGluIHZlYzMgViwgY29uc3QgaW4gdmVjMyBQLCBjb25zdCBpbiBtYXQzIG1JbnYsIGNvbnN0IGluIHZlYzMgcmVjdENvb3Jkc1sgNCBdICkge1xcblxcdHZlYzMgdjEgPSByZWN0Q29vcmRzWyAxIF0gLSByZWN0Q29vcmRzWyAwIF07XFxuXFx0dmVjMyB2MiA9IHJlY3RDb29yZHNbIDMgXSAtIHJlY3RDb29yZHNbIDAgXTtcXG5cXHR2ZWMzIGxpZ2h0Tm9ybWFsID0gY3Jvc3MoIHYxLCB2MiApO1xcblxcdGlmKCBkb3QoIGxpZ2h0Tm9ybWFsLCBQIC0gcmVjdENvb3Jkc1sgMCBdICkgPCAwLjAgKSByZXR1cm4gdmVjMyggMC4wICk7XFxuXFx0dmVjMyBUMSwgVDI7XFxuXFx0VDEgPSBub3JtYWxpemUoIFYgLSBOICogZG90KCBWLCBOICkgKTtcXG5cXHRUMiA9IC0gY3Jvc3MoIE4sIFQxICk7XFxuXFx0bWF0MyBtYXQgPSBtSW52ICogdHJhbnNwb3NlKCBtYXQzKCBUMSwgVDIsIE4gKSApO1xcblxcdHZlYzMgY29vcmRzWyA0IF07XFxuXFx0Y29vcmRzWyAwIF0gPSBtYXQgKiAoIHJlY3RDb29yZHNbIDAgXSAtIFAgKTtcXG5cXHRjb29yZHNbIDEgXSA9IG1hdCAqICggcmVjdENvb3Jkc1sgMSBdIC0gUCApO1xcblxcdGNvb3Jkc1sgMiBdID0gbWF0ICogKCByZWN0Q29vcmRzWyAyIF0gLSBQICk7XFxuXFx0Y29vcmRzWyAzIF0gPSBtYXQgKiAoIHJlY3RDb29yZHNbIDMgXSAtIFAgKTtcXG5cXHRjb29yZHNbIDAgXSA9IG5vcm1hbGl6ZSggY29vcmRzWyAwIF0gKTtcXG5cXHRjb29yZHNbIDEgXSA9IG5vcm1hbGl6ZSggY29vcmRzWyAxIF0gKTtcXG5cXHRjb29yZHNbIDIgXSA9IG5vcm1hbGl6ZSggY29vcmRzWyAyIF0gKTtcXG5cXHRjb29yZHNbIDMgXSA9IG5vcm1hbGl6ZSggY29vcmRzWyAzIF0gKTtcXG5cXHR2ZWMzIHZlY3RvckZvcm1GYWN0b3IgPSB2ZWMzKCAwLjAgKTtcXG5cXHR2ZWN0b3JGb3JtRmFjdG9yICs9IExUQ19FZGdlVmVjdG9yRm9ybUZhY3RvciggY29vcmRzWyAwIF0sIGNvb3Jkc1sgMSBdICk7XFxuXFx0dmVjdG9yRm9ybUZhY3RvciArPSBMVENfRWRnZVZlY3RvckZvcm1GYWN0b3IoIGNvb3Jkc1sgMSBdLCBjb29yZHNbIDIgXSApO1xcblxcdHZlY3RvckZvcm1GYWN0b3IgKz0gTFRDX0VkZ2VWZWN0b3JGb3JtRmFjdG9yKCBjb29yZHNbIDIgXSwgY29vcmRzWyAzIF0gKTtcXG5cXHR2ZWN0b3JGb3JtRmFjdG9yICs9IExUQ19FZGdlVmVjdG9yRm9ybUZhY3RvciggY29vcmRzWyAzIF0sIGNvb3Jkc1sgMCBdICk7XFxuXFx0dmVjMyByZXN1bHQgPSB2ZWMzKCBMVENfQ2xpcHBlZFNwaGVyZUZvcm1GYWN0b3IoIHZlY3RvckZvcm1GYWN0b3IgKSApO1xcblxcdHJldHVybiByZXN1bHQ7XFxufVxcbnZlYzMgQlJERl9TcGVjdWxhcl9HR1hfRW52aXJvbm1lbnQoIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIHZlYzMgc3BlY3VsYXJDb2xvciwgY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzICkge1xcblxcdGZsb2F0IGRvdE5WID0gc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBnZW9tZXRyeS52aWV3RGlyICkgKTtcXG5cXHRjb25zdCB2ZWM0IGMwID0gdmVjNCggLSAxLCAtIDAuMDI3NSwgLSAwLjU3MiwgMC4wMjIgKTtcXG5cXHRjb25zdCB2ZWM0IGMxID0gdmVjNCggMSwgMC4wNDI1LCAxLjA0LCAtIDAuMDQgKTtcXG5cXHR2ZWM0IHIgPSByb3VnaG5lc3MgKiBjMCArIGMxO1xcblxcdGZsb2F0IGEwMDQgPSBtaW4oIHIueCAqIHIueCwgZXhwMiggLSA5LjI4ICogZG90TlYgKSApICogci54ICsgci55O1xcblxcdHZlYzIgQUIgPSB2ZWMyKCAtMS4wNCwgMS4wNCApICogYTAwNCArIHIuenc7XFxuXFx0cmV0dXJuIHNwZWN1bGFyQ29sb3IgKiBBQi54ICsgQUIueTtcXG59XFxuZmxvYXQgR19CbGlublBob25nX0ltcGxpY2l0KCApIHtcXG5cXHRyZXR1cm4gMC4yNTtcXG59XFxuZmxvYXQgRF9CbGlublBob25nKCBjb25zdCBpbiBmbG9hdCBzaGluaW5lc3MsIGNvbnN0IGluIGZsb2F0IGRvdE5IICkge1xcblxcdHJldHVybiBSRUNJUFJPQ0FMX1BJICogKCBzaGluaW5lc3MgKiAwLjUgKyAxLjAgKSAqIHBvdyggZG90TkgsIHNoaW5pbmVzcyApO1xcbn1cXG52ZWMzIEJSREZfU3BlY3VsYXJfQmxpbm5QaG9uZyggY29uc3QgaW4gSW5jaWRlbnRMaWdodCBpbmNpZGVudExpZ2h0LCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiB2ZWMzIHNwZWN1bGFyQ29sb3IsIGNvbnN0IGluIGZsb2F0IHNoaW5pbmVzcyApIHtcXG5cXHR2ZWMzIGhhbGZEaXIgPSBub3JtYWxpemUoIGluY2lkZW50TGlnaHQuZGlyZWN0aW9uICsgZ2VvbWV0cnkudmlld0RpciApO1xcblxcdGZsb2F0IGRvdE5IID0gc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBoYWxmRGlyICkgKTtcXG5cXHRmbG9hdCBkb3RMSCA9IHNhdHVyYXRlKCBkb3QoIGluY2lkZW50TGlnaHQuZGlyZWN0aW9uLCBoYWxmRGlyICkgKTtcXG5cXHR2ZWMzIEYgPSBGX1NjaGxpY2soIHNwZWN1bGFyQ29sb3IsIGRvdExIICk7XFxuXFx0ZmxvYXQgRyA9IEdfQmxpbm5QaG9uZ19JbXBsaWNpdCggKTtcXG5cXHRmbG9hdCBEID0gRF9CbGlublBob25nKCBzaGluaW5lc3MsIGRvdE5IICk7XFxuXFx0cmV0dXJuIEYgKiAoIEcgKiBEICk7XFxufVxcbmZsb2F0IEdHWFJvdWdobmVzc1RvQmxpbm5FeHBvbmVudCggY29uc3QgaW4gZmxvYXQgZ2d4Um91Z2huZXNzICkge1xcblxcdHJldHVybiAoIDIuMCAvIHBvdzIoIGdneFJvdWdobmVzcyArIDAuMDAwMSApIC0gMi4wICk7XFxufVxcbmZsb2F0IEJsaW5uRXhwb25lbnRUb0dHWFJvdWdobmVzcyggY29uc3QgaW4gZmxvYXQgYmxpbm5FeHBvbmVudCApIHtcXG5cXHRyZXR1cm4gc3FydCggMi4wIC8gKCBibGlubkV4cG9uZW50ICsgMi4wICkgKTtcXG59XFxuXCI7XG5cbnZhciBidW1wbWFwX3BhcnNfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfQlVNUE1BUFxcblxcdHVuaWZvcm0gc2FtcGxlcjJEIGJ1bXBNYXA7XFxuXFx0dW5pZm9ybSBmbG9hdCBidW1wU2NhbGU7XFxuXFx0dmVjMiBkSGR4eV9md2QoKSB7XFxuXFx0XFx0dmVjMiBkU1RkeCA9IGRGZHgoIHZVdiApO1xcblxcdFxcdHZlYzIgZFNUZHkgPSBkRmR5KCB2VXYgKTtcXG5cXHRcXHRmbG9hdCBIbGwgPSBidW1wU2NhbGUgKiB0ZXh0dXJlMkQoIGJ1bXBNYXAsIHZVdiApLng7XFxuXFx0XFx0ZmxvYXQgZEJ4ID0gYnVtcFNjYWxlICogdGV4dHVyZTJEKCBidW1wTWFwLCB2VXYgKyBkU1RkeCApLnggLSBIbGw7XFxuXFx0XFx0ZmxvYXQgZEJ5ID0gYnVtcFNjYWxlICogdGV4dHVyZTJEKCBidW1wTWFwLCB2VXYgKyBkU1RkeSApLnggLSBIbGw7XFxuXFx0XFx0cmV0dXJuIHZlYzIoIGRCeCwgZEJ5ICk7XFxuXFx0fVxcblxcdHZlYzMgcGVydHVyYk5vcm1hbEFyYiggdmVjMyBzdXJmX3BvcywgdmVjMyBzdXJmX25vcm0sIHZlYzIgZEhkeHkgKSB7XFxuXFx0XFx0dmVjMyB2U2lnbWFYID0gZEZkeCggc3VyZl9wb3MgKTtcXG5cXHRcXHR2ZWMzIHZTaWdtYVkgPSBkRmR5KCBzdXJmX3BvcyApO1xcblxcdFxcdHZlYzMgdk4gPSBzdXJmX25vcm07XFxuXFx0XFx0dmVjMyBSMSA9IGNyb3NzKCB2U2lnbWFZLCB2TiApO1xcblxcdFxcdHZlYzMgUjIgPSBjcm9zcyggdk4sIHZTaWdtYVggKTtcXG5cXHRcXHRmbG9hdCBmRGV0ID0gZG90KCB2U2lnbWFYLCBSMSApO1xcblxcdFxcdHZlYzMgdkdyYWQgPSBzaWduKCBmRGV0ICkgKiAoIGRIZHh5LnggKiBSMSArIGRIZHh5LnkgKiBSMiApO1xcblxcdFxcdHJldHVybiBub3JtYWxpemUoIGFicyggZkRldCApICogc3VyZl9ub3JtIC0gdkdyYWQgKTtcXG5cXHR9XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQgPSBcIiNpZiBOVU1fQ0xJUFBJTkdfUExBTkVTID4gMFxcblxcdGZvciAoIGludCBpID0gMDsgaSA8IFVOSU9OX0NMSVBQSU5HX1BMQU5FUzsgKysgaSApIHtcXG5cXHRcXHR2ZWM0IHBsYW5lID0gY2xpcHBpbmdQbGFuZXNbIGkgXTtcXG5cXHRcXHRpZiAoIGRvdCggdlZpZXdQb3NpdGlvbiwgcGxhbmUueHl6ICkgPiBwbGFuZS53ICkgZGlzY2FyZDtcXG5cXHR9XFxuXFx0XFx0XFxuXFx0I2lmIFVOSU9OX0NMSVBQSU5HX1BMQU5FUyA8IE5VTV9DTElQUElOR19QTEFORVNcXG5cXHRcXHRib29sIGNsaXBwZWQgPSB0cnVlO1xcblxcdFxcdGZvciAoIGludCBpID0gVU5JT05fQ0xJUFBJTkdfUExBTkVTOyBpIDwgTlVNX0NMSVBQSU5HX1BMQU5FUzsgKysgaSApIHtcXG5cXHRcXHRcXHR2ZWM0IHBsYW5lID0gY2xpcHBpbmdQbGFuZXNbIGkgXTtcXG5cXHRcXHRcXHRjbGlwcGVkID0gKCBkb3QoIHZWaWV3UG9zaXRpb24sIHBsYW5lLnh5eiApID4gcGxhbmUudyApICYmIGNsaXBwZWQ7XFxuXFx0XFx0fVxcblxcdFxcdGlmICggY2xpcHBlZCApIGRpc2NhcmQ7XFxuXFx0XFxuXFx0I2VuZGlmXFxuI2VuZGlmXFxuXCI7XG5cbnZhciBjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudCA9IFwiI2lmIE5VTV9DTElQUElOR19QTEFORVMgPiAwXFxuXFx0I2lmICEgZGVmaW5lZCggUEhZU0lDQUwgKSAmJiAhIGRlZmluZWQoIFBIT05HIClcXG5cXHRcXHR2YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcXG5cXHQjZW5kaWZcXG5cXHR1bmlmb3JtIHZlYzQgY2xpcHBpbmdQbGFuZXNbIE5VTV9DTElQUElOR19QTEFORVMgXTtcXG4jZW5kaWZcXG5cIjtcblxudmFyIGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleCA9IFwiI2lmIE5VTV9DTElQUElOR19QTEFORVMgPiAwICYmICEgZGVmaW5lZCggUEhZU0lDQUwgKSAmJiAhIGRlZmluZWQoIFBIT05HIClcXG5cXHR2YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcXG4jZW5kaWZcXG5cIjtcblxudmFyIGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXggPSBcIiNpZiBOVU1fQ0xJUFBJTkdfUExBTkVTID4gMCAmJiAhIGRlZmluZWQoIFBIWVNJQ0FMICkgJiYgISBkZWZpbmVkKCBQSE9ORyApXFxuXFx0dlZpZXdQb3NpdGlvbiA9IC0gbXZQb3NpdGlvbi54eXo7XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBjb2xvcl9mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9DT0xPUlxcblxcdGRpZmZ1c2VDb2xvci5yZ2IgKj0gdkNvbG9yO1xcbiNlbmRpZlwiO1xuXG52YXIgY29sb3JfcGFyc19mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9DT0xPUlxcblxcdHZhcnlpbmcgdmVjMyB2Q29sb3I7XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBjb2xvcl9wYXJzX3ZlcnRleCA9IFwiI2lmZGVmIFVTRV9DT0xPUlxcblxcdHZhcnlpbmcgdmVjMyB2Q29sb3I7XFxuI2VuZGlmXCI7XG5cbnZhciBjb2xvcl92ZXJ0ZXggPSBcIiNpZmRlZiBVU0VfQ09MT1JcXG5cXHR2Q29sb3IueHl6ID0gY29sb3IueHl6O1xcbiNlbmRpZlwiO1xuXG52YXIgY29tbW9uID0gXCIjZGVmaW5lIFBJIDMuMTQxNTkyNjUzNTlcXG4jZGVmaW5lIFBJMiA2LjI4MzE4NTMwNzE4XFxuI2RlZmluZSBQSV9IQUxGIDEuNTcwNzk2MzI2Nzk0OVxcbiNkZWZpbmUgUkVDSVBST0NBTF9QSSAwLjMxODMwOTg4NjE4XFxuI2RlZmluZSBSRUNJUFJPQ0FMX1BJMiAwLjE1OTE1NDk0XFxuI2RlZmluZSBMT0cyIDEuNDQyNjk1XFxuI2RlZmluZSBFUFNJTE9OIDFlLTZcXG4jZGVmaW5lIHNhdHVyYXRlKGEpIGNsYW1wKCBhLCAwLjAsIDEuMCApXFxuI2RlZmluZSB3aGl0ZUNvbXBsaW1lbnQoYSkgKCAxLjAgLSBzYXR1cmF0ZSggYSApIClcXG5mbG9hdCBwb3cyKCBjb25zdCBpbiBmbG9hdCB4ICkgeyByZXR1cm4geCp4OyB9XFxuZmxvYXQgcG93MyggY29uc3QgaW4gZmxvYXQgeCApIHsgcmV0dXJuIHgqeCp4OyB9XFxuZmxvYXQgcG93NCggY29uc3QgaW4gZmxvYXQgeCApIHsgZmxvYXQgeDIgPSB4Kng7IHJldHVybiB4Mip4MjsgfVxcbmZsb2F0IGF2ZXJhZ2UoIGNvbnN0IGluIHZlYzMgY29sb3IgKSB7IHJldHVybiBkb3QoIGNvbG9yLCB2ZWMzKCAwLjMzMzMgKSApOyB9XFxuaGlnaHAgZmxvYXQgcmFuZCggY29uc3QgaW4gdmVjMiB1diApIHtcXG5cXHRjb25zdCBoaWdocCBmbG9hdCBhID0gMTIuOTg5OCwgYiA9IDc4LjIzMywgYyA9IDQzNzU4LjU0NTM7XFxuXFx0aGlnaHAgZmxvYXQgZHQgPSBkb3QoIHV2Lnh5LCB2ZWMyKCBhLGIgKSApLCBzbiA9IG1vZCggZHQsIFBJICk7XFxuXFx0cmV0dXJuIGZyYWN0KHNpbihzbikgKiBjKTtcXG59XFxuc3RydWN0IEluY2lkZW50TGlnaHQge1xcblxcdHZlYzMgY29sb3I7XFxuXFx0dmVjMyBkaXJlY3Rpb247XFxuXFx0Ym9vbCB2aXNpYmxlO1xcbn07XFxuc3RydWN0IFJlZmxlY3RlZExpZ2h0IHtcXG5cXHR2ZWMzIGRpcmVjdERpZmZ1c2U7XFxuXFx0dmVjMyBkaXJlY3RTcGVjdWxhcjtcXG5cXHR2ZWMzIGluZGlyZWN0RGlmZnVzZTtcXG5cXHR2ZWMzIGluZGlyZWN0U3BlY3VsYXI7XFxufTtcXG5zdHJ1Y3QgR2VvbWV0cmljQ29udGV4dCB7XFxuXFx0dmVjMyBwb3NpdGlvbjtcXG5cXHR2ZWMzIG5vcm1hbDtcXG5cXHR2ZWMzIHZpZXdEaXI7XFxufTtcXG52ZWMzIHRyYW5zZm9ybURpcmVjdGlvbiggaW4gdmVjMyBkaXIsIGluIG1hdDQgbWF0cml4ICkge1xcblxcdHJldHVybiBub3JtYWxpemUoICggbWF0cml4ICogdmVjNCggZGlyLCAwLjAgKSApLnh5eiApO1xcbn1cXG52ZWMzIGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIGluIHZlYzMgZGlyLCBpbiBtYXQ0IG1hdHJpeCApIHtcXG5cXHRyZXR1cm4gbm9ybWFsaXplKCAoIHZlYzQoIGRpciwgMC4wICkgKiBtYXRyaXggKS54eXogKTtcXG59XFxudmVjMyBwcm9qZWN0T25QbGFuZShpbiB2ZWMzIHBvaW50LCBpbiB2ZWMzIHBvaW50T25QbGFuZSwgaW4gdmVjMyBwbGFuZU5vcm1hbCApIHtcXG5cXHRmbG9hdCBkaXN0YW5jZSA9IGRvdCggcGxhbmVOb3JtYWwsIHBvaW50IC0gcG9pbnRPblBsYW5lICk7XFxuXFx0cmV0dXJuIC0gZGlzdGFuY2UgKiBwbGFuZU5vcm1hbCArIHBvaW50O1xcbn1cXG5mbG9hdCBzaWRlT2ZQbGFuZSggaW4gdmVjMyBwb2ludCwgaW4gdmVjMyBwb2ludE9uUGxhbmUsIGluIHZlYzMgcGxhbmVOb3JtYWwgKSB7XFxuXFx0cmV0dXJuIHNpZ24oIGRvdCggcG9pbnQgLSBwb2ludE9uUGxhbmUsIHBsYW5lTm9ybWFsICkgKTtcXG59XFxudmVjMyBsaW5lUGxhbmVJbnRlcnNlY3QoIGluIHZlYzMgcG9pbnRPbkxpbmUsIGluIHZlYzMgbGluZURpcmVjdGlvbiwgaW4gdmVjMyBwb2ludE9uUGxhbmUsIGluIHZlYzMgcGxhbmVOb3JtYWwgKSB7XFxuXFx0cmV0dXJuIGxpbmVEaXJlY3Rpb24gKiAoIGRvdCggcGxhbmVOb3JtYWwsIHBvaW50T25QbGFuZSAtIHBvaW50T25MaW5lICkgLyBkb3QoIHBsYW5lTm9ybWFsLCBsaW5lRGlyZWN0aW9uICkgKSArIHBvaW50T25MaW5lO1xcbn1cXG5tYXQzIHRyYW5zcG9zZSggY29uc3QgaW4gbWF0MyB2ICkge1xcblxcdG1hdDMgdG1wO1xcblxcdHRtcFswXSA9IHZlYzModlswXS54LCB2WzFdLngsIHZbMl0ueCk7XFxuXFx0dG1wWzFdID0gdmVjMyh2WzBdLnksIHZbMV0ueSwgdlsyXS55KTtcXG5cXHR0bXBbMl0gPSB2ZWMzKHZbMF0ueiwgdlsxXS56LCB2WzJdLnopO1xcblxcdHJldHVybiB0bXA7XFxufVxcblwiO1xuXG52YXIgY3ViZV91dl9yZWZsZWN0aW9uX2ZyYWdtZW50ID0gXCIjaWZkZWYgRU5WTUFQX1RZUEVfQ1VCRV9VVlxcbiNkZWZpbmUgY3ViZVVWX3RleHR1cmVTaXplICgxMDI0LjApXFxuaW50IGdldEZhY2VGcm9tRGlyZWN0aW9uKHZlYzMgZGlyZWN0aW9uKSB7XFxuXFx0dmVjMyBhYnNEaXJlY3Rpb24gPSBhYnMoZGlyZWN0aW9uKTtcXG5cXHRpbnQgZmFjZSA9IC0xO1xcblxcdGlmKCBhYnNEaXJlY3Rpb24ueCA+IGFic0RpcmVjdGlvbi56ICkge1xcblxcdFxcdGlmKGFic0RpcmVjdGlvbi54ID4gYWJzRGlyZWN0aW9uLnkgKVxcblxcdFxcdFxcdGZhY2UgPSBkaXJlY3Rpb24ueCA+IDAuMCA/IDAgOiAzO1xcblxcdFxcdGVsc2VcXG5cXHRcXHRcXHRmYWNlID0gZGlyZWN0aW9uLnkgPiAwLjAgPyAxIDogNDtcXG5cXHR9XFxuXFx0ZWxzZSB7XFxuXFx0XFx0aWYoYWJzRGlyZWN0aW9uLnogPiBhYnNEaXJlY3Rpb24ueSApXFxuXFx0XFx0XFx0ZmFjZSA9IGRpcmVjdGlvbi56ID4gMC4wID8gMiA6IDU7XFxuXFx0XFx0ZWxzZVxcblxcdFxcdFxcdGZhY2UgPSBkaXJlY3Rpb24ueSA+IDAuMCA/IDEgOiA0O1xcblxcdH1cXG5cXHRyZXR1cm4gZmFjZTtcXG59XFxuI2RlZmluZSBjdWJlVVZfbWF4TG9kczEgIChsb2cyKGN1YmVVVl90ZXh0dXJlU2l6ZSowLjI1KSAtIDEuMClcXG4jZGVmaW5lIGN1YmVVVl9yYW5nZUNsYW1wIChleHAyKCg2LjAgLSAxLjApICogMi4wKSlcXG52ZWMyIE1pcExldmVsSW5mbyggdmVjMyB2ZWMsIGZsb2F0IHJvdWdobmVzc0xldmVsLCBmbG9hdCByb3VnaG5lc3MgKSB7XFxuXFx0ZmxvYXQgc2NhbGUgPSBleHAyKGN1YmVVVl9tYXhMb2RzMSAtIHJvdWdobmVzc0xldmVsKTtcXG5cXHRmbG9hdCBkeFJvdWdobmVzcyA9IGRGZHgocm91Z2huZXNzKTtcXG5cXHRmbG9hdCBkeVJvdWdobmVzcyA9IGRGZHkocm91Z2huZXNzKTtcXG5cXHR2ZWMzIGR4ID0gZEZkeCggdmVjICogc2NhbGUgKiBkeFJvdWdobmVzcyApO1xcblxcdHZlYzMgZHkgPSBkRmR5KCB2ZWMgKiBzY2FsZSAqIGR5Um91Z2huZXNzICk7XFxuXFx0ZmxvYXQgZCA9IG1heCggZG90KCBkeCwgZHggKSwgZG90KCBkeSwgZHkgKSApO1xcblxcdGQgPSBjbGFtcChkLCAxLjAsIGN1YmVVVl9yYW5nZUNsYW1wKTtcXG5cXHRmbG9hdCBtaXBMZXZlbCA9IDAuNSAqIGxvZzIoZCk7XFxuXFx0cmV0dXJuIHZlYzIoZmxvb3IobWlwTGV2ZWwpLCBmcmFjdChtaXBMZXZlbCkpO1xcbn1cXG4jZGVmaW5lIGN1YmVVVl9tYXhMb2RzMiAobG9nMihjdWJlVVZfdGV4dHVyZVNpemUqMC4yNSkgLSAyLjApXFxuI2RlZmluZSBjdWJlVVZfcmNwVGV4dHVyZVNpemUgKDEuMCAvIGN1YmVVVl90ZXh0dXJlU2l6ZSlcXG52ZWMyIGdldEN1YmVVVih2ZWMzIGRpcmVjdGlvbiwgZmxvYXQgcm91Z2huZXNzTGV2ZWwsIGZsb2F0IG1pcExldmVsKSB7XFxuXFx0bWlwTGV2ZWwgPSByb3VnaG5lc3NMZXZlbCA+IGN1YmVVVl9tYXhMb2RzMiAtIDMuMCA/IDAuMCA6IG1pcExldmVsO1xcblxcdGZsb2F0IGEgPSAxNi4wICogY3ViZVVWX3JjcFRleHR1cmVTaXplO1xcblxcdHZlYzIgZXhwMl9wYWNrZWQgPSBleHAyKCB2ZWMyKCByb3VnaG5lc3NMZXZlbCwgbWlwTGV2ZWwgKSApO1xcblxcdHZlYzIgcmNwX2V4cDJfcGFja2VkID0gdmVjMiggMS4wICkgLyBleHAyX3BhY2tlZDtcXG5cXHRmbG9hdCBwb3dTY2FsZSA9IGV4cDJfcGFja2VkLnggKiBleHAyX3BhY2tlZC55O1xcblxcdGZsb2F0IHNjYWxlID0gcmNwX2V4cDJfcGFja2VkLnggKiByY3BfZXhwMl9wYWNrZWQueSAqIDAuMjU7XFxuXFx0ZmxvYXQgbWlwT2Zmc2V0ID0gMC43NSooMS4wIC0gcmNwX2V4cDJfcGFja2VkLnkpICogcmNwX2V4cDJfcGFja2VkLng7XFxuXFx0Ym9vbCBiUmVzID0gbWlwTGV2ZWwgPT0gMC4wO1xcblxcdHNjYWxlID0gIGJSZXMgJiYgKHNjYWxlIDwgYSkgPyBhIDogc2NhbGU7XFxuXFx0dmVjMyByO1xcblxcdHZlYzIgb2Zmc2V0O1xcblxcdGludCBmYWNlID0gZ2V0RmFjZUZyb21EaXJlY3Rpb24oZGlyZWN0aW9uKTtcXG5cXHRmbG9hdCByY3BQb3dTY2FsZSA9IDEuMCAvIHBvd1NjYWxlO1xcblxcdGlmKCBmYWNlID09IDApIHtcXG5cXHRcXHRyID0gdmVjMyhkaXJlY3Rpb24ueCwgLWRpcmVjdGlvbi56LCBkaXJlY3Rpb24ueSk7XFxuXFx0XFx0b2Zmc2V0ID0gdmVjMigwLjArbWlwT2Zmc2V0LDAuNzUgKiByY3BQb3dTY2FsZSk7XFxuXFx0XFx0b2Zmc2V0LnkgPSBiUmVzICYmIChvZmZzZXQueSA8IDIuMCphKSA/IGEgOiBvZmZzZXQueTtcXG5cXHR9XFxuXFx0ZWxzZSBpZiggZmFjZSA9PSAxKSB7XFxuXFx0XFx0ciA9IHZlYzMoZGlyZWN0aW9uLnksIGRpcmVjdGlvbi54LCBkaXJlY3Rpb24ueik7XFxuXFx0XFx0b2Zmc2V0ID0gdmVjMihzY2FsZSttaXBPZmZzZXQsIDAuNzUgKiByY3BQb3dTY2FsZSk7XFxuXFx0XFx0b2Zmc2V0LnkgPSBiUmVzICYmIChvZmZzZXQueSA8IDIuMCphKSA/IGEgOiBvZmZzZXQueTtcXG5cXHR9XFxuXFx0ZWxzZSBpZiggZmFjZSA9PSAyKSB7XFxuXFx0XFx0ciA9IHZlYzMoZGlyZWN0aW9uLnosIGRpcmVjdGlvbi54LCBkaXJlY3Rpb24ueSk7XFxuXFx0XFx0b2Zmc2V0ID0gdmVjMigyLjAqc2NhbGUrbWlwT2Zmc2V0LCAwLjc1ICogcmNwUG93U2NhbGUpO1xcblxcdFxcdG9mZnNldC55ID0gYlJlcyAmJiAob2Zmc2V0LnkgPCAyLjAqYSkgPyBhIDogb2Zmc2V0Lnk7XFxuXFx0fVxcblxcdGVsc2UgaWYoIGZhY2UgPT0gMykge1xcblxcdFxcdHIgPSB2ZWMzKGRpcmVjdGlvbi54LCBkaXJlY3Rpb24ueiwgZGlyZWN0aW9uLnkpO1xcblxcdFxcdG9mZnNldCA9IHZlYzIoMC4wK21pcE9mZnNldCwwLjUgKiByY3BQb3dTY2FsZSk7XFxuXFx0XFx0b2Zmc2V0LnkgPSBiUmVzICYmIChvZmZzZXQueSA8IDIuMCphKSA/IDAuMCA6IG9mZnNldC55O1xcblxcdH1cXG5cXHRlbHNlIGlmKCBmYWNlID09IDQpIHtcXG5cXHRcXHRyID0gdmVjMyhkaXJlY3Rpb24ueSwgZGlyZWN0aW9uLngsIC1kaXJlY3Rpb24ueik7XFxuXFx0XFx0b2Zmc2V0ID0gdmVjMihzY2FsZSttaXBPZmZzZXQsIDAuNSAqIHJjcFBvd1NjYWxlKTtcXG5cXHRcXHRvZmZzZXQueSA9IGJSZXMgJiYgKG9mZnNldC55IDwgMi4wKmEpID8gMC4wIDogb2Zmc2V0Lnk7XFxuXFx0fVxcblxcdGVsc2Uge1xcblxcdFxcdHIgPSB2ZWMzKGRpcmVjdGlvbi56LCAtZGlyZWN0aW9uLngsIGRpcmVjdGlvbi55KTtcXG5cXHRcXHRvZmZzZXQgPSB2ZWMyKDIuMCpzY2FsZSttaXBPZmZzZXQsIDAuNSAqIHJjcFBvd1NjYWxlKTtcXG5cXHRcXHRvZmZzZXQueSA9IGJSZXMgJiYgKG9mZnNldC55IDwgMi4wKmEpID8gMC4wIDogb2Zmc2V0Lnk7XFxuXFx0fVxcblxcdHIgPSBub3JtYWxpemUocik7XFxuXFx0ZmxvYXQgdGV4ZWxPZmZzZXQgPSAwLjUgKiBjdWJlVVZfcmNwVGV4dHVyZVNpemU7XFxuXFx0dmVjMiBzID0gKCByLnl6IC8gYWJzKCByLnggKSArIHZlYzIoIDEuMCApICkgKiAwLjU7XFxuXFx0dmVjMiBiYXNlID0gb2Zmc2V0ICsgdmVjMiggdGV4ZWxPZmZzZXQgKTtcXG5cXHRyZXR1cm4gYmFzZSArIHMgKiAoIHNjYWxlIC0gMi4wICogdGV4ZWxPZmZzZXQgKTtcXG59XFxuI2RlZmluZSBjdWJlVVZfbWF4TG9kczMgKGxvZzIoY3ViZVVWX3RleHR1cmVTaXplKjAuMjUpIC0gMy4wKVxcbnZlYzQgdGV4dHVyZUN1YmVVVih2ZWMzIHJlZmxlY3RlZERpcmVjdGlvbiwgZmxvYXQgcm91Z2huZXNzICkge1xcblxcdGZsb2F0IHJvdWdobmVzc1ZhbCA9IHJvdWdobmVzcyogY3ViZVVWX21heExvZHMzO1xcblxcdGZsb2F0IHIxID0gZmxvb3Iocm91Z2huZXNzVmFsKTtcXG5cXHRmbG9hdCByMiA9IHIxICsgMS4wO1xcblxcdGZsb2F0IHQgPSBmcmFjdChyb3VnaG5lc3NWYWwpO1xcblxcdHZlYzIgbWlwSW5mbyA9IE1pcExldmVsSW5mbyhyZWZsZWN0ZWREaXJlY3Rpb24sIHIxLCByb3VnaG5lc3MpO1xcblxcdGZsb2F0IHMgPSBtaXBJbmZvLnk7XFxuXFx0ZmxvYXQgbGV2ZWwwID0gbWlwSW5mby54O1xcblxcdGZsb2F0IGxldmVsMSA9IGxldmVsMCArIDEuMDtcXG5cXHRsZXZlbDEgPSBsZXZlbDEgPiA1LjAgPyA1LjAgOiBsZXZlbDE7XFxuXFx0bGV2ZWwwICs9IG1pbiggZmxvb3IoIHMgKyAwLjUgKSwgNS4wICk7XFxuXFx0dmVjMiB1dl8xMCA9IGdldEN1YmVVVihyZWZsZWN0ZWREaXJlY3Rpb24sIHIxLCBsZXZlbDApO1xcblxcdHZlYzQgY29sb3IxMCA9IGVudk1hcFRleGVsVG9MaW5lYXIodGV4dHVyZTJEKGVudk1hcCwgdXZfMTApKTtcXG5cXHR2ZWMyIHV2XzIwID0gZ2V0Q3ViZVVWKHJlZmxlY3RlZERpcmVjdGlvbiwgcjIsIGxldmVsMCk7XFxuXFx0dmVjNCBjb2xvcjIwID0gZW52TWFwVGV4ZWxUb0xpbmVhcih0ZXh0dXJlMkQoZW52TWFwLCB1dl8yMCkpO1xcblxcdHZlYzQgcmVzdWx0ID0gbWl4KGNvbG9yMTAsIGNvbG9yMjAsIHQpO1xcblxcdHJldHVybiB2ZWM0KHJlc3VsdC5yZ2IsIDEuMCk7XFxufVxcbiNlbmRpZlxcblwiO1xuXG52YXIgZGVmYXVsdG5vcm1hbF92ZXJ0ZXggPSBcIiNpZmRlZiBGTElQX1NJREVEXFxuXFx0b2JqZWN0Tm9ybWFsID0gLW9iamVjdE5vcm1hbDtcXG4jZW5kaWZcXG52ZWMzIHRyYW5zZm9ybWVkTm9ybWFsID0gbm9ybWFsTWF0cml4ICogb2JqZWN0Tm9ybWFsO1xcblwiO1xuXG52YXIgZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4ID0gXCIjaWZkZWYgVVNFX0RJU1BMQUNFTUVOVE1BUFxcblxcdHVuaWZvcm0gc2FtcGxlcjJEIGRpc3BsYWNlbWVudE1hcDtcXG5cXHR1bmlmb3JtIGZsb2F0IGRpc3BsYWNlbWVudFNjYWxlO1xcblxcdHVuaWZvcm0gZmxvYXQgZGlzcGxhY2VtZW50QmlhcztcXG4jZW5kaWZcXG5cIjtcblxudmFyIGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXggPSBcIiNpZmRlZiBVU0VfRElTUExBQ0VNRU5UTUFQXFxuXFx0dHJhbnNmb3JtZWQgKz0gbm9ybWFsICogKCB0ZXh0dXJlMkQoIGRpc3BsYWNlbWVudE1hcCwgdXYgKS54ICogZGlzcGxhY2VtZW50U2NhbGUgKyBkaXNwbGFjZW1lbnRCaWFzICk7XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBlbWlzc2l2ZW1hcF9mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9FTUlTU0lWRU1BUFxcblxcdHZlYzQgZW1pc3NpdmVDb2xvciA9IHRleHR1cmUyRCggZW1pc3NpdmVNYXAsIHZVdiApO1xcblxcdGVtaXNzaXZlQ29sb3IucmdiID0gZW1pc3NpdmVNYXBUZXhlbFRvTGluZWFyKCBlbWlzc2l2ZUNvbG9yICkucmdiO1xcblxcdHRvdGFsRW1pc3NpdmVSYWRpYW5jZSAqPSBlbWlzc2l2ZUNvbG9yLnJnYjtcXG4jZW5kaWZcXG5cIjtcblxudmFyIGVtaXNzaXZlbWFwX3BhcnNfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfRU1JU1NJVkVNQVBcXG5cXHR1bmlmb3JtIHNhbXBsZXIyRCBlbWlzc2l2ZU1hcDtcXG4jZW5kaWZcXG5cIjtcblxudmFyIGVuY29kaW5nc19mcmFnbWVudCA9IFwiICBnbF9GcmFnQ29sb3IgPSBsaW5lYXJUb091dHB1dFRleGVsKCBnbF9GcmFnQ29sb3IgKTtcXG5cIjtcblxudmFyIGVuY29kaW5nc19wYXJzX2ZyYWdtZW50ID0gXCJcXG52ZWM0IExpbmVhclRvTGluZWFyKCBpbiB2ZWM0IHZhbHVlICkge1xcblxcdHJldHVybiB2YWx1ZTtcXG59XFxudmVjNCBHYW1tYVRvTGluZWFyKCBpbiB2ZWM0IHZhbHVlLCBpbiBmbG9hdCBnYW1tYUZhY3RvciApIHtcXG5cXHRyZXR1cm4gdmVjNCggcG93KCB2YWx1ZS54eXosIHZlYzMoIGdhbW1hRmFjdG9yICkgKSwgdmFsdWUudyApO1xcbn1cXG52ZWM0IExpbmVhclRvR2FtbWEoIGluIHZlYzQgdmFsdWUsIGluIGZsb2F0IGdhbW1hRmFjdG9yICkge1xcblxcdHJldHVybiB2ZWM0KCBwb3coIHZhbHVlLnh5eiwgdmVjMyggMS4wIC8gZ2FtbWFGYWN0b3IgKSApLCB2YWx1ZS53ICk7XFxufVxcbnZlYzQgc1JHQlRvTGluZWFyKCBpbiB2ZWM0IHZhbHVlICkge1xcblxcdHJldHVybiB2ZWM0KCBtaXgoIHBvdyggdmFsdWUucmdiICogMC45NDc4NjcyOTg2ICsgdmVjMyggMC4wNTIxMzI3MDE0ICksIHZlYzMoIDIuNCApICksIHZhbHVlLnJnYiAqIDAuMDc3Mzk5MzgwOCwgdmVjMyggbGVzc1RoYW5FcXVhbCggdmFsdWUucmdiLCB2ZWMzKCAwLjA0MDQ1ICkgKSApICksIHZhbHVlLncgKTtcXG59XFxudmVjNCBMaW5lYXJUb3NSR0IoIGluIHZlYzQgdmFsdWUgKSB7XFxuXFx0cmV0dXJuIHZlYzQoIG1peCggcG93KCB2YWx1ZS5yZ2IsIHZlYzMoIDAuNDE2NjYgKSApICogMS4wNTUgLSB2ZWMzKCAwLjA1NSApLCB2YWx1ZS5yZ2IgKiAxMi45MiwgdmVjMyggbGVzc1RoYW5FcXVhbCggdmFsdWUucmdiLCB2ZWMzKCAwLjAwMzEzMDggKSApICkgKSwgdmFsdWUudyApO1xcbn1cXG52ZWM0IFJHQkVUb0xpbmVhciggaW4gdmVjNCB2YWx1ZSApIHtcXG5cXHRyZXR1cm4gdmVjNCggdmFsdWUucmdiICogZXhwMiggdmFsdWUuYSAqIDI1NS4wIC0gMTI4LjAgKSwgMS4wICk7XFxufVxcbnZlYzQgTGluZWFyVG9SR0JFKCBpbiB2ZWM0IHZhbHVlICkge1xcblxcdGZsb2F0IG1heENvbXBvbmVudCA9IG1heCggbWF4KCB2YWx1ZS5yLCB2YWx1ZS5nICksIHZhbHVlLmIgKTtcXG5cXHRmbG9hdCBmRXhwID0gY2xhbXAoIGNlaWwoIGxvZzIoIG1heENvbXBvbmVudCApICksIC0xMjguMCwgMTI3LjAgKTtcXG5cXHRyZXR1cm4gdmVjNCggdmFsdWUucmdiIC8gZXhwMiggZkV4cCApLCAoIGZFeHAgKyAxMjguMCApIC8gMjU1LjAgKTtcXG59XFxudmVjNCBSR0JNVG9MaW5lYXIoIGluIHZlYzQgdmFsdWUsIGluIGZsb2F0IG1heFJhbmdlICkge1xcblxcdHJldHVybiB2ZWM0KCB2YWx1ZS54eXogKiB2YWx1ZS53ICogbWF4UmFuZ2UsIDEuMCApO1xcbn1cXG52ZWM0IExpbmVhclRvUkdCTSggaW4gdmVjNCB2YWx1ZSwgaW4gZmxvYXQgbWF4UmFuZ2UgKSB7XFxuXFx0ZmxvYXQgbWF4UkdCID0gbWF4KCB2YWx1ZS54LCBtYXgoIHZhbHVlLmcsIHZhbHVlLmIgKSApO1xcblxcdGZsb2F0IE0gICAgICA9IGNsYW1wKCBtYXhSR0IgLyBtYXhSYW5nZSwgMC4wLCAxLjAgKTtcXG5cXHRNICAgICAgICAgICAgPSBjZWlsKCBNICogMjU1LjAgKSAvIDI1NS4wO1xcblxcdHJldHVybiB2ZWM0KCB2YWx1ZS5yZ2IgLyAoIE0gKiBtYXhSYW5nZSApLCBNICk7XFxufVxcbnZlYzQgUkdCRFRvTGluZWFyKCBpbiB2ZWM0IHZhbHVlLCBpbiBmbG9hdCBtYXhSYW5nZSApIHtcXG5cXHRyZXR1cm4gdmVjNCggdmFsdWUucmdiICogKCAoIG1heFJhbmdlIC8gMjU1LjAgKSAvIHZhbHVlLmEgKSwgMS4wICk7XFxufVxcbnZlYzQgTGluZWFyVG9SR0JEKCBpbiB2ZWM0IHZhbHVlLCBpbiBmbG9hdCBtYXhSYW5nZSApIHtcXG5cXHRmbG9hdCBtYXhSR0IgPSBtYXgoIHZhbHVlLngsIG1heCggdmFsdWUuZywgdmFsdWUuYiApICk7XFxuXFx0ZmxvYXQgRCAgICAgID0gbWF4KCBtYXhSYW5nZSAvIG1heFJHQiwgMS4wICk7XFxuXFx0RCAgICAgICAgICAgID0gbWluKCBmbG9vciggRCApIC8gMjU1LjAsIDEuMCApO1xcblxcdHJldHVybiB2ZWM0KCB2YWx1ZS5yZ2IgKiAoIEQgKiAoIDI1NS4wIC8gbWF4UmFuZ2UgKSApLCBEICk7XFxufVxcbmNvbnN0IG1hdDMgY0xvZ0x1dk0gPSBtYXQzKCAwLjIyMDksIDAuMzM5MCwgMC40MTg0LCAwLjExMzgsIDAuNjc4MCwgMC43MzE5LCAwLjAxMDIsIDAuMTEzMCwgMC4yOTY5ICk7XFxudmVjNCBMaW5lYXJUb0xvZ0x1diggaW4gdmVjNCB2YWx1ZSApICB7XFxuXFx0dmVjMyBYcF9ZX1hZWnAgPSB2YWx1ZS5yZ2IgKiBjTG9nTHV2TTtcXG5cXHRYcF9ZX1hZWnAgPSBtYXgoWHBfWV9YWVpwLCB2ZWMzKDFlLTYsIDFlLTYsIDFlLTYpKTtcXG5cXHR2ZWM0IHZSZXN1bHQ7XFxuXFx0dlJlc3VsdC54eSA9IFhwX1lfWFlacC54eSAvIFhwX1lfWFlacC56O1xcblxcdGZsb2F0IExlID0gMi4wICogbG9nMihYcF9ZX1hZWnAueSkgKyAxMjcuMDtcXG5cXHR2UmVzdWx0LncgPSBmcmFjdChMZSk7XFxuXFx0dlJlc3VsdC56ID0gKExlIC0gKGZsb29yKHZSZXN1bHQudyoyNTUuMCkpLzI1NS4wKS8yNTUuMDtcXG5cXHRyZXR1cm4gdlJlc3VsdDtcXG59XFxuY29uc3QgbWF0MyBjTG9nTHV2SW52ZXJzZU0gPSBtYXQzKCA2LjAwMTQsIC0yLjcwMDgsIC0xLjc5OTYsIC0xLjMzMjAsIDMuMTAyOSwgLTUuNzcyMSwgMC4zMDA4LCAtMS4wODgyLCA1LjYyNjggKTtcXG52ZWM0IExvZ0x1dlRvTGluZWFyKCBpbiB2ZWM0IHZhbHVlICkge1xcblxcdGZsb2F0IExlID0gdmFsdWUueiAqIDI1NS4wICsgdmFsdWUudztcXG5cXHR2ZWMzIFhwX1lfWFlacDtcXG5cXHRYcF9ZX1hZWnAueSA9IGV4cDIoKExlIC0gMTI3LjApIC8gMi4wKTtcXG5cXHRYcF9ZX1hZWnAueiA9IFhwX1lfWFlacC55IC8gdmFsdWUueTtcXG5cXHRYcF9ZX1hZWnAueCA9IHZhbHVlLnggKiBYcF9ZX1hZWnAuejtcXG5cXHR2ZWMzIHZSR0IgPSBYcF9ZX1hZWnAucmdiICogY0xvZ0x1dkludmVyc2VNO1xcblxcdHJldHVybiB2ZWM0KCBtYXgodlJHQiwgMC4wKSwgMS4wICk7XFxufVxcblwiO1xuXG52YXIgZW52bWFwX2ZyYWdtZW50ID0gXCIjaWZkZWYgVVNFX0VOVk1BUFxcblxcdCNpZiBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFVTRV9OT1JNQUxNQVAgKSB8fCBkZWZpbmVkKCBQSE9ORyApXFxuXFx0XFx0dmVjMyBjYW1lcmFUb1ZlcnRleCA9IG5vcm1hbGl6ZSggdldvcmxkUG9zaXRpb24gLSBjYW1lcmFQb3NpdGlvbiApO1xcblxcdFxcdHZlYzMgd29ybGROb3JtYWwgPSBpbnZlcnNlVHJhbnNmb3JtRGlyZWN0aW9uKCBub3JtYWwsIHZpZXdNYXRyaXggKTtcXG5cXHRcXHQjaWZkZWYgRU5WTUFQX01PREVfUkVGTEVDVElPTlxcblxcdFxcdFxcdHZlYzMgcmVmbGVjdFZlYyA9IHJlZmxlY3QoIGNhbWVyYVRvVmVydGV4LCB3b3JsZE5vcm1hbCApO1xcblxcdFxcdCNlbHNlXFxuXFx0XFx0XFx0dmVjMyByZWZsZWN0VmVjID0gcmVmcmFjdCggY2FtZXJhVG9WZXJ0ZXgsIHdvcmxkTm9ybWFsLCByZWZyYWN0aW9uUmF0aW8gKTtcXG5cXHRcXHQjZW5kaWZcXG5cXHQjZWxzZVxcblxcdFxcdHZlYzMgcmVmbGVjdFZlYyA9IHZSZWZsZWN0O1xcblxcdCNlbmRpZlxcblxcdCNpZmRlZiBFTlZNQVBfVFlQRV9DVUJFXFxuXFx0XFx0dmVjNCBlbnZDb2xvciA9IHRleHR1cmVDdWJlKCBlbnZNYXAsIGZsaXBOb3JtYWwgKiB2ZWMzKCBmbGlwRW52TWFwICogcmVmbGVjdFZlYy54LCByZWZsZWN0VmVjLnl6ICkgKTtcXG5cXHQjZWxpZiBkZWZpbmVkKCBFTlZNQVBfVFlQRV9FUVVJUkVDIClcXG5cXHRcXHR2ZWMyIHNhbXBsZVVWO1xcblxcdFxcdHNhbXBsZVVWLnkgPSBzYXR1cmF0ZSggZmxpcE5vcm1hbCAqIHJlZmxlY3RWZWMueSAqIDAuNSArIDAuNSApO1xcblxcdFxcdHNhbXBsZVVWLnggPSBhdGFuKCBmbGlwTm9ybWFsICogcmVmbGVjdFZlYy56LCBmbGlwTm9ybWFsICogcmVmbGVjdFZlYy54ICkgKiBSRUNJUFJPQ0FMX1BJMiArIDAuNTtcXG5cXHRcXHR2ZWM0IGVudkNvbG9yID0gdGV4dHVyZTJEKCBlbnZNYXAsIHNhbXBsZVVWICk7XFxuXFx0I2VsaWYgZGVmaW5lZCggRU5WTUFQX1RZUEVfU1BIRVJFIClcXG5cXHRcXHR2ZWMzIHJlZmxlY3RWaWV3ID0gZmxpcE5vcm1hbCAqIG5vcm1hbGl6ZSggKCB2aWV3TWF0cml4ICogdmVjNCggcmVmbGVjdFZlYywgMC4wICkgKS54eXogKyB2ZWMzKCAwLjAsIDAuMCwgMS4wICkgKTtcXG5cXHRcXHR2ZWM0IGVudkNvbG9yID0gdGV4dHVyZTJEKCBlbnZNYXAsIHJlZmxlY3RWaWV3Lnh5ICogMC41ICsgMC41ICk7XFxuXFx0I2Vsc2VcXG5cXHRcXHR2ZWM0IGVudkNvbG9yID0gdmVjNCggMC4wICk7XFxuXFx0I2VuZGlmXFxuXFx0ZW52Q29sb3IgPSBlbnZNYXBUZXhlbFRvTGluZWFyKCBlbnZDb2xvciApO1xcblxcdCNpZmRlZiBFTlZNQVBfQkxFTkRJTkdfTVVMVElQTFlcXG5cXHRcXHRvdXRnb2luZ0xpZ2h0ID0gbWl4KCBvdXRnb2luZ0xpZ2h0LCBvdXRnb2luZ0xpZ2h0ICogZW52Q29sb3IueHl6LCBzcGVjdWxhclN0cmVuZ3RoICogcmVmbGVjdGl2aXR5ICk7XFxuXFx0I2VsaWYgZGVmaW5lZCggRU5WTUFQX0JMRU5ESU5HX01JWCApXFxuXFx0XFx0b3V0Z29pbmdMaWdodCA9IG1peCggb3V0Z29pbmdMaWdodCwgZW52Q29sb3IueHl6LCBzcGVjdWxhclN0cmVuZ3RoICogcmVmbGVjdGl2aXR5ICk7XFxuXFx0I2VsaWYgZGVmaW5lZCggRU5WTUFQX0JMRU5ESU5HX0FERCApXFxuXFx0XFx0b3V0Z29pbmdMaWdodCArPSBlbnZDb2xvci54eXogKiBzcGVjdWxhclN0cmVuZ3RoICogcmVmbGVjdGl2aXR5O1xcblxcdCNlbmRpZlxcbiNlbmRpZlxcblwiO1xuXG52YXIgZW52bWFwX3BhcnNfZnJhZ21lbnQgPSBcIiNpZiBkZWZpbmVkKCBVU0VfRU5WTUFQICkgfHwgZGVmaW5lZCggUEhZU0lDQUwgKVxcblxcdHVuaWZvcm0gZmxvYXQgcmVmbGVjdGl2aXR5O1xcblxcdHVuaWZvcm0gZmxvYXQgZW52TWFwSW50ZW5zaXR5O1xcbiNlbmRpZlxcbiNpZmRlZiBVU0VfRU5WTUFQXFxuXFx0I2lmICEgZGVmaW5lZCggUEhZU0lDQUwgKSAmJiAoIGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVVNFX05PUk1BTE1BUCApIHx8IGRlZmluZWQoIFBIT05HICkgKVxcblxcdFxcdHZhcnlpbmcgdmVjMyB2V29ybGRQb3NpdGlvbjtcXG5cXHQjZW5kaWZcXG5cXHQjaWZkZWYgRU5WTUFQX1RZUEVfQ1VCRVxcblxcdFxcdHVuaWZvcm0gc2FtcGxlckN1YmUgZW52TWFwO1xcblxcdCNlbHNlXFxuXFx0XFx0dW5pZm9ybSBzYW1wbGVyMkQgZW52TWFwO1xcblxcdCNlbmRpZlxcblxcdHVuaWZvcm0gZmxvYXQgZmxpcEVudk1hcDtcXG5cXHQjaWYgZGVmaW5lZCggVVNFX0JVTVBNQVAgKSB8fCBkZWZpbmVkKCBVU0VfTk9STUFMTUFQICkgfHwgZGVmaW5lZCggUEhPTkcgKSB8fCBkZWZpbmVkKCBQSFlTSUNBTCApXFxuXFx0XFx0dW5pZm9ybSBmbG9hdCByZWZyYWN0aW9uUmF0aW87XFxuXFx0I2Vsc2VcXG5cXHRcXHR2YXJ5aW5nIHZlYzMgdlJlZmxlY3Q7XFxuXFx0I2VuZGlmXFxuI2VuZGlmXFxuXCI7XG5cbnZhciBlbnZtYXBfcGFyc192ZXJ0ZXggPSBcIiNpZmRlZiBVU0VfRU5WTUFQXFxuXFx0I2lmIGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVVNFX05PUk1BTE1BUCApIHx8IGRlZmluZWQoIFBIT05HIClcXG5cXHRcXHR2YXJ5aW5nIHZlYzMgdldvcmxkUG9zaXRpb247XFxuXFx0I2Vsc2VcXG5cXHRcXHR2YXJ5aW5nIHZlYzMgdlJlZmxlY3Q7XFxuXFx0XFx0dW5pZm9ybSBmbG9hdCByZWZyYWN0aW9uUmF0aW87XFxuXFx0I2VuZGlmXFxuI2VuZGlmXFxuXCI7XG5cbnZhciBlbnZtYXBfdmVydGV4ID0gXCIjaWZkZWYgVVNFX0VOVk1BUFxcblxcdCNpZiBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFVTRV9OT1JNQUxNQVAgKSB8fCBkZWZpbmVkKCBQSE9ORyApXFxuXFx0XFx0dldvcmxkUG9zaXRpb24gPSB3b3JsZFBvc2l0aW9uLnh5ejtcXG5cXHQjZWxzZVxcblxcdFxcdHZlYzMgY2FtZXJhVG9WZXJ0ZXggPSBub3JtYWxpemUoIHdvcmxkUG9zaXRpb24ueHl6IC0gY2FtZXJhUG9zaXRpb24gKTtcXG5cXHRcXHR2ZWMzIHdvcmxkTm9ybWFsID0gaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggdHJhbnNmb3JtZWROb3JtYWwsIHZpZXdNYXRyaXggKTtcXG5cXHRcXHQjaWZkZWYgRU5WTUFQX01PREVfUkVGTEVDVElPTlxcblxcdFxcdFxcdHZSZWZsZWN0ID0gcmVmbGVjdCggY2FtZXJhVG9WZXJ0ZXgsIHdvcmxkTm9ybWFsICk7XFxuXFx0XFx0I2Vsc2VcXG5cXHRcXHRcXHR2UmVmbGVjdCA9IHJlZnJhY3QoIGNhbWVyYVRvVmVydGV4LCB3b3JsZE5vcm1hbCwgcmVmcmFjdGlvblJhdGlvICk7XFxuXFx0XFx0I2VuZGlmXFxuXFx0I2VuZGlmXFxuI2VuZGlmXFxuXCI7XG5cbnZhciBmb2dfdmVydGV4ID0gXCJcXG4jaWZkZWYgVVNFX0ZPR1xcbmZvZ0RlcHRoID0gLW12UG9zaXRpb24uejtcXG4jZW5kaWZcIjtcblxudmFyIGZvZ19wYXJzX3ZlcnRleCA9IFwiI2lmZGVmIFVTRV9GT0dcXG4gIHZhcnlpbmcgZmxvYXQgZm9nRGVwdGg7XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBmb2dfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfRk9HXFxuXFx0I2lmZGVmIEZPR19FWFAyXFxuXFx0XFx0ZmxvYXQgZm9nRmFjdG9yID0gd2hpdGVDb21wbGltZW50KCBleHAyKCAtIGZvZ0RlbnNpdHkgKiBmb2dEZW5zaXR5ICogZm9nRGVwdGggKiBmb2dEZXB0aCAqIExPRzIgKSApO1xcblxcdCNlbHNlXFxuXFx0XFx0ZmxvYXQgZm9nRmFjdG9yID0gc21vb3Roc3RlcCggZm9nTmVhciwgZm9nRmFyLCBmb2dEZXB0aCApO1xcblxcdCNlbmRpZlxcblxcdGdsX0ZyYWdDb2xvci5yZ2IgPSBtaXgoIGdsX0ZyYWdDb2xvci5yZ2IsIGZvZ0NvbG9yLCBmb2dGYWN0b3IgKTtcXG4jZW5kaWZcXG5cIjtcblxudmFyIGZvZ19wYXJzX2ZyYWdtZW50ID0gXCIjaWZkZWYgVVNFX0ZPR1xcblxcdHVuaWZvcm0gdmVjMyBmb2dDb2xvcjtcXG5cXHR2YXJ5aW5nIGZsb2F0IGZvZ0RlcHRoO1xcblxcdCNpZmRlZiBGT0dfRVhQMlxcblxcdFxcdHVuaWZvcm0gZmxvYXQgZm9nRGVuc2l0eTtcXG5cXHQjZWxzZVxcblxcdFxcdHVuaWZvcm0gZmxvYXQgZm9nTmVhcjtcXG5cXHRcXHR1bmlmb3JtIGZsb2F0IGZvZ0ZhcjtcXG5cXHQjZW5kaWZcXG4jZW5kaWZcXG5cIjtcblxudmFyIGdyYWRpZW50bWFwX3BhcnNfZnJhZ21lbnQgPSBcIiNpZmRlZiBUT09OXFxuXFx0dW5pZm9ybSBzYW1wbGVyMkQgZ3JhZGllbnRNYXA7XFxuXFx0dmVjMyBnZXRHcmFkaWVudElycmFkaWFuY2UoIHZlYzMgbm9ybWFsLCB2ZWMzIGxpZ2h0RGlyZWN0aW9uICkge1xcblxcdFxcdGZsb2F0IGRvdE5MID0gZG90KCBub3JtYWwsIGxpZ2h0RGlyZWN0aW9uICk7XFxuXFx0XFx0dmVjMiBjb29yZCA9IHZlYzIoIGRvdE5MICogMC41ICsgMC41LCAwLjAgKTtcXG5cXHRcXHQjaWZkZWYgVVNFX0dSQURJRU5UTUFQXFxuXFx0XFx0XFx0cmV0dXJuIHRleHR1cmUyRCggZ3JhZGllbnRNYXAsIGNvb3JkICkucmdiO1xcblxcdFxcdCNlbHNlXFxuXFx0XFx0XFx0cmV0dXJuICggY29vcmQueCA8IDAuNyApID8gdmVjMyggMC43ICkgOiB2ZWMzKCAxLjAgKTtcXG5cXHRcXHQjZW5kaWZcXG5cXHR9XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBsaWdodG1hcF9mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9MSUdIVE1BUFxcblxcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArPSBQSSAqIHRleHR1cmUyRCggbGlnaHRNYXAsIHZVdjIgKS54eXogKiBsaWdodE1hcEludGVuc2l0eTtcXG4jZW5kaWZcXG5cIjtcblxudmFyIGxpZ2h0bWFwX3BhcnNfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfTElHSFRNQVBcXG5cXHR1bmlmb3JtIHNhbXBsZXIyRCBsaWdodE1hcDtcXG5cXHR1bmlmb3JtIGZsb2F0IGxpZ2h0TWFwSW50ZW5zaXR5O1xcbiNlbmRpZlwiO1xuXG52YXIgbGlnaHRzX2xhbWJlcnRfdmVydGV4ID0gXCJ2ZWMzIGRpZmZ1c2UgPSB2ZWMzKCAxLjAgKTtcXG5HZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5O1xcbmdlb21ldHJ5LnBvc2l0aW9uID0gbXZQb3NpdGlvbi54eXo7XFxuZ2VvbWV0cnkubm9ybWFsID0gbm9ybWFsaXplKCB0cmFuc2Zvcm1lZE5vcm1hbCApO1xcbmdlb21ldHJ5LnZpZXdEaXIgPSBub3JtYWxpemUoIC1tdlBvc2l0aW9uLnh5eiApO1xcbkdlb21ldHJpY0NvbnRleHQgYmFja0dlb21ldHJ5O1xcbmJhY2tHZW9tZXRyeS5wb3NpdGlvbiA9IGdlb21ldHJ5LnBvc2l0aW9uO1xcbmJhY2tHZW9tZXRyeS5ub3JtYWwgPSAtZ2VvbWV0cnkubm9ybWFsO1xcbmJhY2tHZW9tZXRyeS52aWV3RGlyID0gZ2VvbWV0cnkudmlld0RpcjtcXG52TGlnaHRGcm9udCA9IHZlYzMoIDAuMCApO1xcbiNpZmRlZiBET1VCTEVfU0lERURcXG5cXHR2TGlnaHRCYWNrID0gdmVjMyggMC4wICk7XFxuI2VuZGlmXFxuSW5jaWRlbnRMaWdodCBkaXJlY3RMaWdodDtcXG5mbG9hdCBkb3ROTDtcXG52ZWMzIGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZTtcXG4jaWYgTlVNX1BPSU5UX0xJR0hUUyA+IDBcXG5cXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fUE9JTlRfTElHSFRTOyBpICsrICkge1xcblxcdFxcdGdldFBvaW50RGlyZWN0TGlnaHRJcnJhZGlhbmNlKCBwb2ludExpZ2h0c1sgaSBdLCBnZW9tZXRyeSwgZGlyZWN0TGlnaHQgKTtcXG5cXHRcXHRkb3ROTCA9IGRvdCggZ2VvbWV0cnkubm9ybWFsLCBkaXJlY3RMaWdodC5kaXJlY3Rpb24gKTtcXG5cXHRcXHRkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2UgPSBQSSAqIGRpcmVjdExpZ2h0LmNvbG9yO1xcblxcdFxcdHZMaWdodEZyb250ICs9IHNhdHVyYXRlKCBkb3ROTCApICogZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlO1xcblxcdFxcdCNpZmRlZiBET1VCTEVfU0lERURcXG5cXHRcXHRcXHR2TGlnaHRCYWNrICs9IHNhdHVyYXRlKCAtZG90TkwgKSAqIGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZTtcXG5cXHRcXHQjZW5kaWZcXG5cXHR9XFxuI2VuZGlmXFxuI2lmIE5VTV9TUE9UX0xJR0hUUyA+IDBcXG5cXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fU1BPVF9MSUdIVFM7IGkgKysgKSB7XFxuXFx0XFx0Z2V0U3BvdERpcmVjdExpZ2h0SXJyYWRpYW5jZSggc3BvdExpZ2h0c1sgaSBdLCBnZW9tZXRyeSwgZGlyZWN0TGlnaHQgKTtcXG5cXHRcXHRkb3ROTCA9IGRvdCggZ2VvbWV0cnkubm9ybWFsLCBkaXJlY3RMaWdodC5kaXJlY3Rpb24gKTtcXG5cXHRcXHRkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2UgPSBQSSAqIGRpcmVjdExpZ2h0LmNvbG9yO1xcblxcdFxcdHZMaWdodEZyb250ICs9IHNhdHVyYXRlKCBkb3ROTCApICogZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlO1xcblxcdFxcdCNpZmRlZiBET1VCTEVfU0lERURcXG5cXHRcXHRcXHR2TGlnaHRCYWNrICs9IHNhdHVyYXRlKCAtZG90TkwgKSAqIGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZTtcXG5cXHRcXHQjZW5kaWZcXG5cXHR9XFxuI2VuZGlmXFxuI2lmIE5VTV9ESVJfTElHSFRTID4gMFxcblxcdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9ESVJfTElHSFRTOyBpICsrICkge1xcblxcdFxcdGdldERpcmVjdGlvbmFsRGlyZWN0TGlnaHRJcnJhZGlhbmNlKCBkaXJlY3Rpb25hbExpZ2h0c1sgaSBdLCBnZW9tZXRyeSwgZGlyZWN0TGlnaHQgKTtcXG5cXHRcXHRkb3ROTCA9IGRvdCggZ2VvbWV0cnkubm9ybWFsLCBkaXJlY3RMaWdodC5kaXJlY3Rpb24gKTtcXG5cXHRcXHRkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2UgPSBQSSAqIGRpcmVjdExpZ2h0LmNvbG9yO1xcblxcdFxcdHZMaWdodEZyb250ICs9IHNhdHVyYXRlKCBkb3ROTCApICogZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlO1xcblxcdFxcdCNpZmRlZiBET1VCTEVfU0lERURcXG5cXHRcXHRcXHR2TGlnaHRCYWNrICs9IHNhdHVyYXRlKCAtZG90TkwgKSAqIGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZTtcXG5cXHRcXHQjZW5kaWZcXG5cXHR9XFxuI2VuZGlmXFxuI2lmIE5VTV9IRU1JX0xJR0hUUyA+IDBcXG5cXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fSEVNSV9MSUdIVFM7IGkgKysgKSB7XFxuXFx0XFx0dkxpZ2h0RnJvbnQgKz0gZ2V0SGVtaXNwaGVyZUxpZ2h0SXJyYWRpYW5jZSggaGVtaXNwaGVyZUxpZ2h0c1sgaSBdLCBnZW9tZXRyeSApO1xcblxcdFxcdCNpZmRlZiBET1VCTEVfU0lERURcXG5cXHRcXHRcXHR2TGlnaHRCYWNrICs9IGdldEhlbWlzcGhlcmVMaWdodElycmFkaWFuY2UoIGhlbWlzcGhlcmVMaWdodHNbIGkgXSwgYmFja0dlb21ldHJ5ICk7XFxuXFx0XFx0I2VuZGlmXFxuXFx0fVxcbiNlbmRpZlxcblwiO1xuXG52YXIgbGlnaHRzX3BhcnMgPSBcInVuaWZvcm0gdmVjMyBhbWJpZW50TGlnaHRDb2xvcjtcXG52ZWMzIGdldEFtYmllbnRMaWdodElycmFkaWFuY2UoIGNvbnN0IGluIHZlYzMgYW1iaWVudExpZ2h0Q29sb3IgKSB7XFxuXFx0dmVjMyBpcnJhZGlhbmNlID0gYW1iaWVudExpZ2h0Q29sb3I7XFxuXFx0I2lmbmRlZiBQSFlTSUNBTExZX0NPUlJFQ1RfTElHSFRTXFxuXFx0XFx0aXJyYWRpYW5jZSAqPSBQSTtcXG5cXHQjZW5kaWZcXG5cXHRyZXR1cm4gaXJyYWRpYW5jZTtcXG59XFxuI2lmIE5VTV9ESVJfTElHSFRTID4gMFxcblxcdHN0cnVjdCBEaXJlY3Rpb25hbExpZ2h0IHtcXG5cXHRcXHR2ZWMzIGRpcmVjdGlvbjtcXG5cXHRcXHR2ZWMzIGNvbG9yO1xcblxcdFxcdGludCBzaGFkb3c7XFxuXFx0XFx0ZmxvYXQgc2hhZG93QmlhcztcXG5cXHRcXHRmbG9hdCBzaGFkb3dSYWRpdXM7XFxuXFx0XFx0dmVjMiBzaGFkb3dNYXBTaXplO1xcblxcdH07XFxuXFx0dW5pZm9ybSBEaXJlY3Rpb25hbExpZ2h0IGRpcmVjdGlvbmFsTGlnaHRzWyBOVU1fRElSX0xJR0hUUyBdO1xcblxcdHZvaWQgZ2V0RGlyZWN0aW9uYWxEaXJlY3RMaWdodElycmFkaWFuY2UoIGNvbnN0IGluIERpcmVjdGlvbmFsTGlnaHQgZGlyZWN0aW9uYWxMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgb3V0IEluY2lkZW50TGlnaHQgZGlyZWN0TGlnaHQgKSB7XFxuXFx0XFx0ZGlyZWN0TGlnaHQuY29sb3IgPSBkaXJlY3Rpb25hbExpZ2h0LmNvbG9yO1xcblxcdFxcdGRpcmVjdExpZ2h0LmRpcmVjdGlvbiA9IGRpcmVjdGlvbmFsTGlnaHQuZGlyZWN0aW9uO1xcblxcdFxcdGRpcmVjdExpZ2h0LnZpc2libGUgPSB0cnVlO1xcblxcdH1cXG4jZW5kaWZcXG4jaWYgTlVNX1BPSU5UX0xJR0hUUyA+IDBcXG5cXHRzdHJ1Y3QgUG9pbnRMaWdodCB7XFxuXFx0XFx0dmVjMyBwb3NpdGlvbjtcXG5cXHRcXHR2ZWMzIGNvbG9yO1xcblxcdFxcdGZsb2F0IGRpc3RhbmNlO1xcblxcdFxcdGZsb2F0IGRlY2F5O1xcblxcdFxcdGludCBzaGFkb3c7XFxuXFx0XFx0ZmxvYXQgc2hhZG93QmlhcztcXG5cXHRcXHRmbG9hdCBzaGFkb3dSYWRpdXM7XFxuXFx0XFx0dmVjMiBzaGFkb3dNYXBTaXplO1xcblxcdH07XFxuXFx0dW5pZm9ybSBQb2ludExpZ2h0IHBvaW50TGlnaHRzWyBOVU1fUE9JTlRfTElHSFRTIF07XFxuXFx0dm9pZCBnZXRQb2ludERpcmVjdExpZ2h0SXJyYWRpYW5jZSggY29uc3QgaW4gUG9pbnRMaWdodCBwb2ludExpZ2h0LCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBvdXQgSW5jaWRlbnRMaWdodCBkaXJlY3RMaWdodCApIHtcXG5cXHRcXHR2ZWMzIGxWZWN0b3IgPSBwb2ludExpZ2h0LnBvc2l0aW9uIC0gZ2VvbWV0cnkucG9zaXRpb247XFxuXFx0XFx0ZGlyZWN0TGlnaHQuZGlyZWN0aW9uID0gbm9ybWFsaXplKCBsVmVjdG9yICk7XFxuXFx0XFx0ZmxvYXQgbGlnaHREaXN0YW5jZSA9IGxlbmd0aCggbFZlY3RvciApO1xcblxcdFxcdGRpcmVjdExpZ2h0LmNvbG9yID0gcG9pbnRMaWdodC5jb2xvcjtcXG5cXHRcXHRkaXJlY3RMaWdodC5jb2xvciAqPSBwdW5jdHVhbExpZ2h0SW50ZW5zaXR5VG9JcnJhZGlhbmNlRmFjdG9yKCBsaWdodERpc3RhbmNlLCBwb2ludExpZ2h0LmRpc3RhbmNlLCBwb2ludExpZ2h0LmRlY2F5ICk7XFxuXFx0XFx0ZGlyZWN0TGlnaHQudmlzaWJsZSA9ICggZGlyZWN0TGlnaHQuY29sb3IgIT0gdmVjMyggMC4wICkgKTtcXG5cXHR9XFxuI2VuZGlmXFxuI2lmIE5VTV9TUE9UX0xJR0hUUyA+IDBcXG5cXHRzdHJ1Y3QgU3BvdExpZ2h0IHtcXG5cXHRcXHR2ZWMzIHBvc2l0aW9uO1xcblxcdFxcdHZlYzMgZGlyZWN0aW9uO1xcblxcdFxcdHZlYzMgY29sb3I7XFxuXFx0XFx0ZmxvYXQgZGlzdGFuY2U7XFxuXFx0XFx0ZmxvYXQgZGVjYXk7XFxuXFx0XFx0ZmxvYXQgY29uZUNvcztcXG5cXHRcXHRmbG9hdCBwZW51bWJyYUNvcztcXG5cXHRcXHRpbnQgc2hhZG93O1xcblxcdFxcdGZsb2F0IHNoYWRvd0JpYXM7XFxuXFx0XFx0ZmxvYXQgc2hhZG93UmFkaXVzO1xcblxcdFxcdHZlYzIgc2hhZG93TWFwU2l6ZTtcXG5cXHR9O1xcblxcdHVuaWZvcm0gU3BvdExpZ2h0IHNwb3RMaWdodHNbIE5VTV9TUE9UX0xJR0hUUyBdO1xcblxcdHZvaWQgZ2V0U3BvdERpcmVjdExpZ2h0SXJyYWRpYW5jZSggY29uc3QgaW4gU3BvdExpZ2h0IHNwb3RMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgb3V0IEluY2lkZW50TGlnaHQgZGlyZWN0TGlnaHQgICkge1xcblxcdFxcdHZlYzMgbFZlY3RvciA9IHNwb3RMaWdodC5wb3NpdGlvbiAtIGdlb21ldHJ5LnBvc2l0aW9uO1xcblxcdFxcdGRpcmVjdExpZ2h0LmRpcmVjdGlvbiA9IG5vcm1hbGl6ZSggbFZlY3RvciApO1xcblxcdFxcdGZsb2F0IGxpZ2h0RGlzdGFuY2UgPSBsZW5ndGgoIGxWZWN0b3IgKTtcXG5cXHRcXHRmbG9hdCBhbmdsZUNvcyA9IGRvdCggZGlyZWN0TGlnaHQuZGlyZWN0aW9uLCBzcG90TGlnaHQuZGlyZWN0aW9uICk7XFxuXFx0XFx0aWYgKCBhbmdsZUNvcyA+IHNwb3RMaWdodC5jb25lQ29zICkge1xcblxcdFxcdFxcdGZsb2F0IHNwb3RFZmZlY3QgPSBzbW9vdGhzdGVwKCBzcG90TGlnaHQuY29uZUNvcywgc3BvdExpZ2h0LnBlbnVtYnJhQ29zLCBhbmdsZUNvcyApO1xcblxcdFxcdFxcdGRpcmVjdExpZ2h0LmNvbG9yID0gc3BvdExpZ2h0LmNvbG9yO1xcblxcdFxcdFxcdGRpcmVjdExpZ2h0LmNvbG9yICo9IHNwb3RFZmZlY3QgKiBwdW5jdHVhbExpZ2h0SW50ZW5zaXR5VG9JcnJhZGlhbmNlRmFjdG9yKCBsaWdodERpc3RhbmNlLCBzcG90TGlnaHQuZGlzdGFuY2UsIHNwb3RMaWdodC5kZWNheSApO1xcblxcdFxcdFxcdGRpcmVjdExpZ2h0LnZpc2libGUgPSB0cnVlO1xcblxcdFxcdH0gZWxzZSB7XFxuXFx0XFx0XFx0ZGlyZWN0TGlnaHQuY29sb3IgPSB2ZWMzKCAwLjAgKTtcXG5cXHRcXHRcXHRkaXJlY3RMaWdodC52aXNpYmxlID0gZmFsc2U7XFxuXFx0XFx0fVxcblxcdH1cXG4jZW5kaWZcXG4jaWYgTlVNX1JFQ1RfQVJFQV9MSUdIVFMgPiAwXFxuXFx0c3RydWN0IFJlY3RBcmVhTGlnaHQge1xcblxcdFxcdHZlYzMgY29sb3I7XFxuXFx0XFx0dmVjMyBwb3NpdGlvbjtcXG5cXHRcXHR2ZWMzIGhhbGZXaWR0aDtcXG5cXHRcXHR2ZWMzIGhhbGZIZWlnaHQ7XFxuXFx0fTtcXG5cXHR1bmlmb3JtIHNhbXBsZXIyRCBsdGNNYXQ7XFx0dW5pZm9ybSBzYW1wbGVyMkQgbHRjTWFnO1xcblxcdHVuaWZvcm0gUmVjdEFyZWFMaWdodCByZWN0QXJlYUxpZ2h0c1sgTlVNX1JFQ1RfQVJFQV9MSUdIVFMgXTtcXG4jZW5kaWZcXG4jaWYgTlVNX0hFTUlfTElHSFRTID4gMFxcblxcdHN0cnVjdCBIZW1pc3BoZXJlTGlnaHQge1xcblxcdFxcdHZlYzMgZGlyZWN0aW9uO1xcblxcdFxcdHZlYzMgc2t5Q29sb3I7XFxuXFx0XFx0dmVjMyBncm91bmRDb2xvcjtcXG5cXHR9O1xcblxcdHVuaWZvcm0gSGVtaXNwaGVyZUxpZ2h0IGhlbWlzcGhlcmVMaWdodHNbIE5VTV9IRU1JX0xJR0hUUyBdO1xcblxcdHZlYzMgZ2V0SGVtaXNwaGVyZUxpZ2h0SXJyYWRpYW5jZSggY29uc3QgaW4gSGVtaXNwaGVyZUxpZ2h0IGhlbWlMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSApIHtcXG5cXHRcXHRmbG9hdCBkb3ROTCA9IGRvdCggZ2VvbWV0cnkubm9ybWFsLCBoZW1pTGlnaHQuZGlyZWN0aW9uICk7XFxuXFx0XFx0ZmxvYXQgaGVtaURpZmZ1c2VXZWlnaHQgPSAwLjUgKiBkb3ROTCArIDAuNTtcXG5cXHRcXHR2ZWMzIGlycmFkaWFuY2UgPSBtaXgoIGhlbWlMaWdodC5ncm91bmRDb2xvciwgaGVtaUxpZ2h0LnNreUNvbG9yLCBoZW1pRGlmZnVzZVdlaWdodCApO1xcblxcdFxcdCNpZm5kZWYgUEhZU0lDQUxMWV9DT1JSRUNUX0xJR0hUU1xcblxcdFxcdFxcdGlycmFkaWFuY2UgKj0gUEk7XFxuXFx0XFx0I2VuZGlmXFxuXFx0XFx0cmV0dXJuIGlycmFkaWFuY2U7XFxuXFx0fVxcbiNlbmRpZlxcbiNpZiBkZWZpbmVkKCBVU0VfRU5WTUFQICkgJiYgZGVmaW5lZCggUEhZU0lDQUwgKVxcblxcdHZlYzMgZ2V0TGlnaHRQcm9iZUluZGlyZWN0SXJyYWRpYW5jZSggY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gaW50IG1heE1JUExldmVsICkge1xcblxcdFxcdHZlYzMgd29ybGROb3JtYWwgPSBpbnZlcnNlVHJhbnNmb3JtRGlyZWN0aW9uKCBnZW9tZXRyeS5ub3JtYWwsIHZpZXdNYXRyaXggKTtcXG5cXHRcXHQjaWZkZWYgRU5WTUFQX1RZUEVfQ1VCRVxcblxcdFxcdFxcdHZlYzMgcXVlcnlWZWMgPSB2ZWMzKCBmbGlwRW52TWFwICogd29ybGROb3JtYWwueCwgd29ybGROb3JtYWwueXogKTtcXG5cXHRcXHRcXHQjaWZkZWYgVEVYVFVSRV9MT0RfRVhUXFxuXFx0XFx0XFx0XFx0dmVjNCBlbnZNYXBDb2xvciA9IHRleHR1cmVDdWJlTG9kRVhUKCBlbnZNYXAsIHF1ZXJ5VmVjLCBmbG9hdCggbWF4TUlQTGV2ZWwgKSApO1xcblxcdFxcdFxcdCNlbHNlXFxuXFx0XFx0XFx0XFx0dmVjNCBlbnZNYXBDb2xvciA9IHRleHR1cmVDdWJlKCBlbnZNYXAsIHF1ZXJ5VmVjLCBmbG9hdCggbWF4TUlQTGV2ZWwgKSApO1xcblxcdFxcdFxcdCNlbmRpZlxcblxcdFxcdFxcdGVudk1hcENvbG9yLnJnYiA9IGVudk1hcFRleGVsVG9MaW5lYXIoIGVudk1hcENvbG9yICkucmdiO1xcblxcdFxcdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9UWVBFX0NVQkVfVVYgKVxcblxcdFxcdFxcdHZlYzMgcXVlcnlWZWMgPSB2ZWMzKCBmbGlwRW52TWFwICogd29ybGROb3JtYWwueCwgd29ybGROb3JtYWwueXogKTtcXG5cXHRcXHRcXHR2ZWM0IGVudk1hcENvbG9yID0gdGV4dHVyZUN1YmVVViggcXVlcnlWZWMsIDEuMCApO1xcblxcdFxcdCNlbHNlXFxuXFx0XFx0XFx0dmVjNCBlbnZNYXBDb2xvciA9IHZlYzQoIDAuMCApO1xcblxcdFxcdCNlbmRpZlxcblxcdFxcdHJldHVybiBQSSAqIGVudk1hcENvbG9yLnJnYiAqIGVudk1hcEludGVuc2l0eTtcXG5cXHR9XFxuXFx0ZmxvYXQgZ2V0U3BlY3VsYXJNSVBMZXZlbCggY29uc3QgaW4gZmxvYXQgYmxpbm5TaGluaW5lc3NFeHBvbmVudCwgY29uc3QgaW4gaW50IG1heE1JUExldmVsICkge1xcblxcdFxcdGZsb2F0IG1heE1JUExldmVsU2NhbGFyID0gZmxvYXQoIG1heE1JUExldmVsICk7XFxuXFx0XFx0ZmxvYXQgZGVzaXJlZE1JUExldmVsID0gbWF4TUlQTGV2ZWxTY2FsYXIgLSAwLjc5MjQ4IC0gMC41ICogbG9nMiggcG93MiggYmxpbm5TaGluaW5lc3NFeHBvbmVudCApICsgMS4wICk7XFxuXFx0XFx0cmV0dXJuIGNsYW1wKCBkZXNpcmVkTUlQTGV2ZWwsIDAuMCwgbWF4TUlQTGV2ZWxTY2FsYXIgKTtcXG5cXHR9XFxuXFx0dmVjMyBnZXRMaWdodFByb2JlSW5kaXJlY3RSYWRpYW5jZSggY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gZmxvYXQgYmxpbm5TaGluaW5lc3NFeHBvbmVudCwgY29uc3QgaW4gaW50IG1heE1JUExldmVsICkge1xcblxcdFxcdCNpZmRlZiBFTlZNQVBfTU9ERV9SRUZMRUNUSU9OXFxuXFx0XFx0XFx0dmVjMyByZWZsZWN0VmVjID0gcmVmbGVjdCggLWdlb21ldHJ5LnZpZXdEaXIsIGdlb21ldHJ5Lm5vcm1hbCApO1xcblxcdFxcdCNlbHNlXFxuXFx0XFx0XFx0dmVjMyByZWZsZWN0VmVjID0gcmVmcmFjdCggLWdlb21ldHJ5LnZpZXdEaXIsIGdlb21ldHJ5Lm5vcm1hbCwgcmVmcmFjdGlvblJhdGlvICk7XFxuXFx0XFx0I2VuZGlmXFxuXFx0XFx0cmVmbGVjdFZlYyA9IGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIHJlZmxlY3RWZWMsIHZpZXdNYXRyaXggKTtcXG5cXHRcXHRmbG9hdCBzcGVjdWxhck1JUExldmVsID0gZ2V0U3BlY3VsYXJNSVBMZXZlbCggYmxpbm5TaGluaW5lc3NFeHBvbmVudCwgbWF4TUlQTGV2ZWwgKTtcXG5cXHRcXHQjaWZkZWYgRU5WTUFQX1RZUEVfQ1VCRVxcblxcdFxcdFxcdHZlYzMgcXVlcnlSZWZsZWN0VmVjID0gdmVjMyggZmxpcEVudk1hcCAqIHJlZmxlY3RWZWMueCwgcmVmbGVjdFZlYy55eiApO1xcblxcdFxcdFxcdCNpZmRlZiBURVhUVVJFX0xPRF9FWFRcXG5cXHRcXHRcXHRcXHR2ZWM0IGVudk1hcENvbG9yID0gdGV4dHVyZUN1YmVMb2RFWFQoIGVudk1hcCwgcXVlcnlSZWZsZWN0VmVjLCBzcGVjdWxhck1JUExldmVsICk7XFxuXFx0XFx0XFx0I2Vsc2VcXG5cXHRcXHRcXHRcXHR2ZWM0IGVudk1hcENvbG9yID0gdGV4dHVyZUN1YmUoIGVudk1hcCwgcXVlcnlSZWZsZWN0VmVjLCBzcGVjdWxhck1JUExldmVsICk7XFxuXFx0XFx0XFx0I2VuZGlmXFxuXFx0XFx0XFx0ZW52TWFwQ29sb3IucmdiID0gZW52TWFwVGV4ZWxUb0xpbmVhciggZW52TWFwQ29sb3IgKS5yZ2I7XFxuXFx0XFx0I2VsaWYgZGVmaW5lZCggRU5WTUFQX1RZUEVfQ1VCRV9VViApXFxuXFx0XFx0XFx0dmVjMyBxdWVyeVJlZmxlY3RWZWMgPSB2ZWMzKCBmbGlwRW52TWFwICogcmVmbGVjdFZlYy54LCByZWZsZWN0VmVjLnl6ICk7XFxuXFx0XFx0XFx0dmVjNCBlbnZNYXBDb2xvciA9IHRleHR1cmVDdWJlVVYocXVlcnlSZWZsZWN0VmVjLCBCbGlubkV4cG9uZW50VG9HR1hSb3VnaG5lc3MoYmxpbm5TaGluaW5lc3NFeHBvbmVudCkpO1xcblxcdFxcdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9UWVBFX0VRVUlSRUMgKVxcblxcdFxcdFxcdHZlYzIgc2FtcGxlVVY7XFxuXFx0XFx0XFx0c2FtcGxlVVYueSA9IHNhdHVyYXRlKCByZWZsZWN0VmVjLnkgKiAwLjUgKyAwLjUgKTtcXG5cXHRcXHRcXHRzYW1wbGVVVi54ID0gYXRhbiggcmVmbGVjdFZlYy56LCByZWZsZWN0VmVjLnggKSAqIFJFQ0lQUk9DQUxfUEkyICsgMC41O1xcblxcdFxcdFxcdCNpZmRlZiBURVhUVVJFX0xPRF9FWFRcXG5cXHRcXHRcXHRcXHR2ZWM0IGVudk1hcENvbG9yID0gdGV4dHVyZTJETG9kRVhUKCBlbnZNYXAsIHNhbXBsZVVWLCBzcGVjdWxhck1JUExldmVsICk7XFxuXFx0XFx0XFx0I2Vsc2VcXG5cXHRcXHRcXHRcXHR2ZWM0IGVudk1hcENvbG9yID0gdGV4dHVyZTJEKCBlbnZNYXAsIHNhbXBsZVVWLCBzcGVjdWxhck1JUExldmVsICk7XFxuXFx0XFx0XFx0I2VuZGlmXFxuXFx0XFx0XFx0ZW52TWFwQ29sb3IucmdiID0gZW52TWFwVGV4ZWxUb0xpbmVhciggZW52TWFwQ29sb3IgKS5yZ2I7XFxuXFx0XFx0I2VsaWYgZGVmaW5lZCggRU5WTUFQX1RZUEVfU1BIRVJFIClcXG5cXHRcXHRcXHR2ZWMzIHJlZmxlY3RWaWV3ID0gbm9ybWFsaXplKCAoIHZpZXdNYXRyaXggKiB2ZWM0KCByZWZsZWN0VmVjLCAwLjAgKSApLnh5eiArIHZlYzMoIDAuMCwwLjAsMS4wICkgKTtcXG5cXHRcXHRcXHQjaWZkZWYgVEVYVFVSRV9MT0RfRVhUXFxuXFx0XFx0XFx0XFx0dmVjNCBlbnZNYXBDb2xvciA9IHRleHR1cmUyRExvZEVYVCggZW52TWFwLCByZWZsZWN0Vmlldy54eSAqIDAuNSArIDAuNSwgc3BlY3VsYXJNSVBMZXZlbCApO1xcblxcdFxcdFxcdCNlbHNlXFxuXFx0XFx0XFx0XFx0dmVjNCBlbnZNYXBDb2xvciA9IHRleHR1cmUyRCggZW52TWFwLCByZWZsZWN0Vmlldy54eSAqIDAuNSArIDAuNSwgc3BlY3VsYXJNSVBMZXZlbCApO1xcblxcdFxcdFxcdCNlbmRpZlxcblxcdFxcdFxcdGVudk1hcENvbG9yLnJnYiA9IGVudk1hcFRleGVsVG9MaW5lYXIoIGVudk1hcENvbG9yICkucmdiO1xcblxcdFxcdCNlbmRpZlxcblxcdFxcdHJldHVybiBlbnZNYXBDb2xvci5yZ2IgKiBlbnZNYXBJbnRlbnNpdHk7XFxuXFx0fVxcbiNlbmRpZlxcblwiO1xuXG52YXIgbGlnaHRzX3Bob25nX2ZyYWdtZW50ID0gXCJCbGlublBob25nTWF0ZXJpYWwgbWF0ZXJpYWw7XFxubWF0ZXJpYWwuZGlmZnVzZUNvbG9yID0gZGlmZnVzZUNvbG9yLnJnYjtcXG5tYXRlcmlhbC5zcGVjdWxhckNvbG9yID0gc3BlY3VsYXI7XFxubWF0ZXJpYWwuc3BlY3VsYXJTaGluaW5lc3MgPSBzaGluaW5lc3M7XFxubWF0ZXJpYWwuc3BlY3VsYXJTdHJlbmd0aCA9IHNwZWN1bGFyU3RyZW5ndGg7XFxuXCI7XG5cbnZhciBsaWdodHNfcGhvbmdfcGFyc19mcmFnbWVudCA9IFwidmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XFxuI2lmbmRlZiBGTEFUX1NIQURFRFxcblxcdHZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xcbiNlbmRpZlxcbnN0cnVjdCBCbGlublBob25nTWF0ZXJpYWwge1xcblxcdHZlYzNcXHRkaWZmdXNlQ29sb3I7XFxuXFx0dmVjM1xcdHNwZWN1bGFyQ29sb3I7XFxuXFx0ZmxvYXRcXHRzcGVjdWxhclNoaW5pbmVzcztcXG5cXHRmbG9hdFxcdHNwZWN1bGFyU3RyZW5ndGg7XFxufTtcXG4jaWYgTlVNX1JFQ1RfQVJFQV9MSUdIVFMgPiAwXFxuXFx0dm9pZCBSRV9EaXJlY3RfUmVjdEFyZWFfQmxpbm5QaG9uZyggY29uc3QgaW4gUmVjdEFyZWFMaWdodCByZWN0QXJlYUxpZ2h0LCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiBCbGlublBob25nTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ICkge1xcblxcdFxcdHZlYzMgbm9ybWFsID0gZ2VvbWV0cnkubm9ybWFsO1xcblxcdFxcdHZlYzMgdmlld0RpciA9IGdlb21ldHJ5LnZpZXdEaXI7XFxuXFx0XFx0dmVjMyBwb3NpdGlvbiA9IGdlb21ldHJ5LnBvc2l0aW9uO1xcblxcdFxcdHZlYzMgbGlnaHRQb3MgPSByZWN0QXJlYUxpZ2h0LnBvc2l0aW9uO1xcblxcdFxcdHZlYzMgaGFsZldpZHRoID0gcmVjdEFyZWFMaWdodC5oYWxmV2lkdGg7XFxuXFx0XFx0dmVjMyBoYWxmSGVpZ2h0ID0gcmVjdEFyZWFMaWdodC5oYWxmSGVpZ2h0O1xcblxcdFxcdHZlYzMgbGlnaHRDb2xvciA9IHJlY3RBcmVhTGlnaHQuY29sb3I7XFxuXFx0XFx0ZmxvYXQgcm91Z2huZXNzID0gQmxpbm5FeHBvbmVudFRvR0dYUm91Z2huZXNzKCBtYXRlcmlhbC5zcGVjdWxhclNoaW5pbmVzcyApO1xcblxcdFxcdHZlYzMgcmVjdENvb3Jkc1sgNCBdO1xcblxcdFxcdHJlY3RDb29yZHNbIDAgXSA9IGxpZ2h0UG9zIC0gaGFsZldpZHRoIC0gaGFsZkhlaWdodDtcXHRcXHRyZWN0Q29vcmRzWyAxIF0gPSBsaWdodFBvcyArIGhhbGZXaWR0aCAtIGhhbGZIZWlnaHQ7XFxuXFx0XFx0cmVjdENvb3Jkc1sgMiBdID0gbGlnaHRQb3MgKyBoYWxmV2lkdGggKyBoYWxmSGVpZ2h0O1xcblxcdFxcdHJlY3RDb29yZHNbIDMgXSA9IGxpZ2h0UG9zIC0gaGFsZldpZHRoICsgaGFsZkhlaWdodDtcXG5cXHRcXHR2ZWMyIHV2ID0gTFRDX1V2KCBub3JtYWwsIHZpZXdEaXIsIHJvdWdobmVzcyApO1xcblxcdFxcdGZsb2F0IG5vcm0gPSB0ZXh0dXJlMkQoIGx0Y01hZywgdXYgKS5hO1xcblxcdFxcdHZlYzQgdCA9IHRleHR1cmUyRCggbHRjTWF0LCB1diApO1xcblxcdFxcdG1hdDMgbUludiA9IG1hdDMoXFxuXFx0XFx0XFx0dmVjMyggICAxLCAgIDAsIHQueSApLFxcblxcdFxcdFxcdHZlYzMoICAgMCwgdC56LCAgIDAgKSxcXG5cXHRcXHRcXHR2ZWMzKCB0LncsICAgMCwgdC54IClcXG5cXHRcXHQpO1xcblxcdFxcdHJlZmxlY3RlZExpZ2h0LmRpcmVjdFNwZWN1bGFyICs9IGxpZ2h0Q29sb3IgKiBtYXRlcmlhbC5zcGVjdWxhckNvbG9yICogbm9ybSAqIExUQ19FdmFsdWF0ZSggbm9ybWFsLCB2aWV3RGlyLCBwb3NpdGlvbiwgbUludiwgcmVjdENvb3JkcyApO1xcblxcdFxcdHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKz0gbGlnaHRDb2xvciAqIG1hdGVyaWFsLmRpZmZ1c2VDb2xvciAqIExUQ19FdmFsdWF0ZSggbm9ybWFsLCB2aWV3RGlyLCBwb3NpdGlvbiwgbWF0MyggMSApLCByZWN0Q29vcmRzICk7XFxuXFx0fVxcbiNlbmRpZlxcbnZvaWQgUkVfRGlyZWN0X0JsaW5uUGhvbmcoIGNvbnN0IGluIEluY2lkZW50TGlnaHQgZGlyZWN0TGlnaHQsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIEJsaW5uUGhvbmdNYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7XFxuXFx0I2lmZGVmIFRPT05cXG5cXHRcXHR2ZWMzIGlycmFkaWFuY2UgPSBnZXRHcmFkaWVudElycmFkaWFuY2UoIGdlb21ldHJ5Lm5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICkgKiBkaXJlY3RMaWdodC5jb2xvcjtcXG5cXHQjZWxzZVxcblxcdFxcdGZsb2F0IGRvdE5MID0gc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBkaXJlY3RMaWdodC5kaXJlY3Rpb24gKSApO1xcblxcdFxcdHZlYzMgaXJyYWRpYW5jZSA9IGRvdE5MICogZGlyZWN0TGlnaHQuY29sb3I7XFxuXFx0I2VuZGlmXFxuXFx0I2lmbmRlZiBQSFlTSUNBTExZX0NPUlJFQ1RfTElHSFRTXFxuXFx0XFx0aXJyYWRpYW5jZSAqPSBQSTtcXG5cXHQjZW5kaWZcXG5cXHRyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICs9IGlycmFkaWFuY2UgKiBCUkRGX0RpZmZ1c2VfTGFtYmVydCggbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICk7XFxuXFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgKz0gaXJyYWRpYW5jZSAqIEJSREZfU3BlY3VsYXJfQmxpbm5QaG9uZyggZGlyZWN0TGlnaHQsIGdlb21ldHJ5LCBtYXRlcmlhbC5zcGVjdWxhckNvbG9yLCBtYXRlcmlhbC5zcGVjdWxhclNoaW5pbmVzcyApICogbWF0ZXJpYWwuc3BlY3VsYXJTdHJlbmd0aDtcXG59XFxudm9pZCBSRV9JbmRpcmVjdERpZmZ1c2VfQmxpbm5QaG9uZyggY29uc3QgaW4gdmVjMyBpcnJhZGlhbmNlLCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiBCbGlublBob25nTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ICkge1xcblxcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArPSBpcnJhZGlhbmNlICogQlJERl9EaWZmdXNlX0xhbWJlcnQoIG1hdGVyaWFsLmRpZmZ1c2VDb2xvciApO1xcbn1cXG4jZGVmaW5lIFJFX0RpcmVjdFxcdFxcdFxcdFxcdFJFX0RpcmVjdF9CbGlublBob25nXFxuI2RlZmluZSBSRV9EaXJlY3RfUmVjdEFyZWFcXHRcXHRSRV9EaXJlY3RfUmVjdEFyZWFfQmxpbm5QaG9uZ1xcbiNkZWZpbmUgUkVfSW5kaXJlY3REaWZmdXNlXFx0XFx0UkVfSW5kaXJlY3REaWZmdXNlX0JsaW5uUGhvbmdcXG4jZGVmaW5lIE1hdGVyaWFsX0xpZ2h0UHJvYmVMT0QoIG1hdGVyaWFsIClcXHQoMClcXG5cIjtcblxudmFyIGxpZ2h0c19waHlzaWNhbF9mcmFnbWVudCA9IFwiUGh5c2ljYWxNYXRlcmlhbCBtYXRlcmlhbDtcXG5tYXRlcmlhbC5kaWZmdXNlQ29sb3IgPSBkaWZmdXNlQ29sb3IucmdiICogKCAxLjAgLSBtZXRhbG5lc3NGYWN0b3IgKTtcXG5tYXRlcmlhbC5zcGVjdWxhclJvdWdobmVzcyA9IGNsYW1wKCByb3VnaG5lc3NGYWN0b3IsIDAuMDQsIDEuMCApO1xcbiNpZmRlZiBTVEFOREFSRFxcblxcdG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IgPSBtaXgoIHZlYzMoIERFRkFVTFRfU1BFQ1VMQVJfQ09FRkZJQ0lFTlQgKSwgZGlmZnVzZUNvbG9yLnJnYiwgbWV0YWxuZXNzRmFjdG9yICk7XFxuI2Vsc2VcXG5cXHRtYXRlcmlhbC5zcGVjdWxhckNvbG9yID0gbWl4KCB2ZWMzKCBNQVhJTVVNX1NQRUNVTEFSX0NPRUZGSUNJRU5UICogcG93MiggcmVmbGVjdGl2aXR5ICkgKSwgZGlmZnVzZUNvbG9yLnJnYiwgbWV0YWxuZXNzRmFjdG9yICk7XFxuXFx0bWF0ZXJpYWwuY2xlYXJDb2F0ID0gc2F0dXJhdGUoIGNsZWFyQ29hdCApO1xcdG1hdGVyaWFsLmNsZWFyQ29hdFJvdWdobmVzcyA9IGNsYW1wKCBjbGVhckNvYXRSb3VnaG5lc3MsIDAuMDQsIDEuMCApO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgbGlnaHRzX3BoeXNpY2FsX3BhcnNfZnJhZ21lbnQgPSBcInN0cnVjdCBQaHlzaWNhbE1hdGVyaWFsIHtcXG5cXHR2ZWMzXFx0ZGlmZnVzZUNvbG9yO1xcblxcdGZsb2F0XFx0c3BlY3VsYXJSb3VnaG5lc3M7XFxuXFx0dmVjM1xcdHNwZWN1bGFyQ29sb3I7XFxuXFx0I2lmbmRlZiBTVEFOREFSRFxcblxcdFxcdGZsb2F0IGNsZWFyQ29hdDtcXG5cXHRcXHRmbG9hdCBjbGVhckNvYXRSb3VnaG5lc3M7XFxuXFx0I2VuZGlmXFxufTtcXG4jZGVmaW5lIE1BWElNVU1fU1BFQ1VMQVJfQ09FRkZJQ0lFTlQgMC4xNlxcbiNkZWZpbmUgREVGQVVMVF9TUEVDVUxBUl9DT0VGRklDSUVOVCAwLjA0XFxuZmxvYXQgY2xlYXJDb2F0REhSQXBwcm94KCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MsIGNvbnN0IGluIGZsb2F0IGRvdE5MICkge1xcblxcdHJldHVybiBERUZBVUxUX1NQRUNVTEFSX0NPRUZGSUNJRU5UICsgKCAxLjAgLSBERUZBVUxUX1NQRUNVTEFSX0NPRUZGSUNJRU5UICkgKiAoIHBvdyggMS4wIC0gZG90TkwsIDUuMCApICogcG93KCAxLjAgLSByb3VnaG5lc3MsIDIuMCApICk7XFxufVxcbiNpZiBOVU1fUkVDVF9BUkVBX0xJR0hUUyA+IDBcXG5cXHR2b2lkIFJFX0RpcmVjdF9SZWN0QXJlYV9QaHlzaWNhbCggY29uc3QgaW4gUmVjdEFyZWFMaWdodCByZWN0QXJlYUxpZ2h0LCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiBQaHlzaWNhbE1hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHtcXG5cXHRcXHR2ZWMzIG5vcm1hbCA9IGdlb21ldHJ5Lm5vcm1hbDtcXG5cXHRcXHR2ZWMzIHZpZXdEaXIgPSBnZW9tZXRyeS52aWV3RGlyO1xcblxcdFxcdHZlYzMgcG9zaXRpb24gPSBnZW9tZXRyeS5wb3NpdGlvbjtcXG5cXHRcXHR2ZWMzIGxpZ2h0UG9zID0gcmVjdEFyZWFMaWdodC5wb3NpdGlvbjtcXG5cXHRcXHR2ZWMzIGhhbGZXaWR0aCA9IHJlY3RBcmVhTGlnaHQuaGFsZldpZHRoO1xcblxcdFxcdHZlYzMgaGFsZkhlaWdodCA9IHJlY3RBcmVhTGlnaHQuaGFsZkhlaWdodDtcXG5cXHRcXHR2ZWMzIGxpZ2h0Q29sb3IgPSByZWN0QXJlYUxpZ2h0LmNvbG9yO1xcblxcdFxcdGZsb2F0IHJvdWdobmVzcyA9IG1hdGVyaWFsLnNwZWN1bGFyUm91Z2huZXNzO1xcblxcdFxcdHZlYzMgcmVjdENvb3Jkc1sgNCBdO1xcblxcdFxcdHJlY3RDb29yZHNbIDAgXSA9IGxpZ2h0UG9zIC0gaGFsZldpZHRoIC0gaGFsZkhlaWdodDtcXHRcXHRyZWN0Q29vcmRzWyAxIF0gPSBsaWdodFBvcyArIGhhbGZXaWR0aCAtIGhhbGZIZWlnaHQ7XFxuXFx0XFx0cmVjdENvb3Jkc1sgMiBdID0gbGlnaHRQb3MgKyBoYWxmV2lkdGggKyBoYWxmSGVpZ2h0O1xcblxcdFxcdHJlY3RDb29yZHNbIDMgXSA9IGxpZ2h0UG9zIC0gaGFsZldpZHRoICsgaGFsZkhlaWdodDtcXG5cXHRcXHR2ZWMyIHV2ID0gTFRDX1V2KCBub3JtYWwsIHZpZXdEaXIsIHJvdWdobmVzcyApO1xcblxcdFxcdGZsb2F0IG5vcm0gPSB0ZXh0dXJlMkQoIGx0Y01hZywgdXYgKS5hO1xcblxcdFxcdHZlYzQgdCA9IHRleHR1cmUyRCggbHRjTWF0LCB1diApO1xcblxcdFxcdG1hdDMgbUludiA9IG1hdDMoXFxuXFx0XFx0XFx0dmVjMyggICAxLCAgIDAsIHQueSApLFxcblxcdFxcdFxcdHZlYzMoICAgMCwgdC56LCAgIDAgKSxcXG5cXHRcXHRcXHR2ZWMzKCB0LncsICAgMCwgdC54IClcXG5cXHRcXHQpO1xcblxcdFxcdHJlZmxlY3RlZExpZ2h0LmRpcmVjdFNwZWN1bGFyICs9IGxpZ2h0Q29sb3IgKiBtYXRlcmlhbC5zcGVjdWxhckNvbG9yICogbm9ybSAqIExUQ19FdmFsdWF0ZSggbm9ybWFsLCB2aWV3RGlyLCBwb3NpdGlvbiwgbUludiwgcmVjdENvb3JkcyApO1xcblxcdFxcdHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKz0gbGlnaHRDb2xvciAqIG1hdGVyaWFsLmRpZmZ1c2VDb2xvciAqIExUQ19FdmFsdWF0ZSggbm9ybWFsLCB2aWV3RGlyLCBwb3NpdGlvbiwgbWF0MyggMSApLCByZWN0Q29vcmRzICk7XFxuXFx0fVxcbiNlbmRpZlxcbnZvaWQgUkVfRGlyZWN0X1BoeXNpY2FsKCBjb25zdCBpbiBJbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0LCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiBQaHlzaWNhbE1hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHtcXG5cXHRmbG9hdCBkb3ROTCA9IHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICkgKTtcXG5cXHR2ZWMzIGlycmFkaWFuY2UgPSBkb3ROTCAqIGRpcmVjdExpZ2h0LmNvbG9yO1xcblxcdCNpZm5kZWYgUEhZU0lDQUxMWV9DT1JSRUNUX0xJR0hUU1xcblxcdFxcdGlycmFkaWFuY2UgKj0gUEk7XFxuXFx0I2VuZGlmXFxuXFx0I2lmbmRlZiBTVEFOREFSRFxcblxcdFxcdGZsb2F0IGNsZWFyQ29hdERIUiA9IG1hdGVyaWFsLmNsZWFyQ29hdCAqIGNsZWFyQ29hdERIUkFwcHJveCggbWF0ZXJpYWwuY2xlYXJDb2F0Um91Z2huZXNzLCBkb3ROTCApO1xcblxcdCNlbHNlXFxuXFx0XFx0ZmxvYXQgY2xlYXJDb2F0REhSID0gMC4wO1xcblxcdCNlbmRpZlxcblxcdHJlZmxlY3RlZExpZ2h0LmRpcmVjdFNwZWN1bGFyICs9ICggMS4wIC0gY2xlYXJDb2F0REhSICkgKiBpcnJhZGlhbmNlICogQlJERl9TcGVjdWxhcl9HR1goIGRpcmVjdExpZ2h0LCBnZW9tZXRyeSwgbWF0ZXJpYWwuc3BlY3VsYXJDb2xvciwgbWF0ZXJpYWwuc3BlY3VsYXJSb3VnaG5lc3MgKTtcXG5cXHRyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICs9ICggMS4wIC0gY2xlYXJDb2F0REhSICkgKiBpcnJhZGlhbmNlICogQlJERl9EaWZmdXNlX0xhbWJlcnQoIG1hdGVyaWFsLmRpZmZ1c2VDb2xvciApO1xcblxcdCNpZm5kZWYgU1RBTkRBUkRcXG5cXHRcXHRyZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArPSBpcnJhZGlhbmNlICogbWF0ZXJpYWwuY2xlYXJDb2F0ICogQlJERl9TcGVjdWxhcl9HR1goIGRpcmVjdExpZ2h0LCBnZW9tZXRyeSwgdmVjMyggREVGQVVMVF9TUEVDVUxBUl9DT0VGRklDSUVOVCApLCBtYXRlcmlhbC5jbGVhckNvYXRSb3VnaG5lc3MgKTtcXG5cXHQjZW5kaWZcXG59XFxudm9pZCBSRV9JbmRpcmVjdERpZmZ1c2VfUGh5c2ljYWwoIGNvbnN0IGluIHZlYzMgaXJyYWRpYW5jZSwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gUGh5c2ljYWxNYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7XFxuXFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICs9IGlycmFkaWFuY2UgKiBCUkRGX0RpZmZ1c2VfTGFtYmVydCggbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICk7XFxufVxcbnZvaWQgUkVfSW5kaXJlY3RTcGVjdWxhcl9QaHlzaWNhbCggY29uc3QgaW4gdmVjMyByYWRpYW5jZSwgY29uc3QgaW4gdmVjMyBjbGVhckNvYXRSYWRpYW5jZSwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gUGh5c2ljYWxNYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7XFxuXFx0I2lmbmRlZiBTVEFOREFSRFxcblxcdFxcdGZsb2F0IGRvdE5WID0gc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBnZW9tZXRyeS52aWV3RGlyICkgKTtcXG5cXHRcXHRmbG9hdCBkb3ROTCA9IGRvdE5WO1xcblxcdFxcdGZsb2F0IGNsZWFyQ29hdERIUiA9IG1hdGVyaWFsLmNsZWFyQ29hdCAqIGNsZWFyQ29hdERIUkFwcHJveCggbWF0ZXJpYWwuY2xlYXJDb2F0Um91Z2huZXNzLCBkb3ROTCApO1xcblxcdCNlbHNlXFxuXFx0XFx0ZmxvYXQgY2xlYXJDb2F0REhSID0gMC4wO1xcblxcdCNlbmRpZlxcblxcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0U3BlY3VsYXIgKz0gKCAxLjAgLSBjbGVhckNvYXRESFIgKSAqIHJhZGlhbmNlICogQlJERl9TcGVjdWxhcl9HR1hfRW52aXJvbm1lbnQoIGdlb21ldHJ5LCBtYXRlcmlhbC5zcGVjdWxhckNvbG9yLCBtYXRlcmlhbC5zcGVjdWxhclJvdWdobmVzcyApO1xcblxcdCNpZm5kZWYgU1RBTkRBUkRcXG5cXHRcXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICs9IGNsZWFyQ29hdFJhZGlhbmNlICogbWF0ZXJpYWwuY2xlYXJDb2F0ICogQlJERl9TcGVjdWxhcl9HR1hfRW52aXJvbm1lbnQoIGdlb21ldHJ5LCB2ZWMzKCBERUZBVUxUX1NQRUNVTEFSX0NPRUZGSUNJRU5UICksIG1hdGVyaWFsLmNsZWFyQ29hdFJvdWdobmVzcyApO1xcblxcdCNlbmRpZlxcbn1cXG4jZGVmaW5lIFJFX0RpcmVjdFxcdFxcdFxcdFxcdFJFX0RpcmVjdF9QaHlzaWNhbFxcbiNkZWZpbmUgUkVfRGlyZWN0X1JlY3RBcmVhXFx0XFx0UkVfRGlyZWN0X1JlY3RBcmVhX1BoeXNpY2FsXFxuI2RlZmluZSBSRV9JbmRpcmVjdERpZmZ1c2VcXHRcXHRSRV9JbmRpcmVjdERpZmZ1c2VfUGh5c2ljYWxcXG4jZGVmaW5lIFJFX0luZGlyZWN0U3BlY3VsYXJcXHRcXHRSRV9JbmRpcmVjdFNwZWN1bGFyX1BoeXNpY2FsXFxuI2RlZmluZSBNYXRlcmlhbF9CbGlublNoaW5pbmVzc0V4cG9uZW50KCBtYXRlcmlhbCApICAgR0dYUm91Z2huZXNzVG9CbGlubkV4cG9uZW50KCBtYXRlcmlhbC5zcGVjdWxhclJvdWdobmVzcyApXFxuI2RlZmluZSBNYXRlcmlhbF9DbGVhckNvYXRfQmxpbm5TaGluaW5lc3NFeHBvbmVudCggbWF0ZXJpYWwgKSAgIEdHWFJvdWdobmVzc1RvQmxpbm5FeHBvbmVudCggbWF0ZXJpYWwuY2xlYXJDb2F0Um91Z2huZXNzIClcXG5mbG9hdCBjb21wdXRlU3BlY3VsYXJPY2NsdXNpb24oIGNvbnN0IGluIGZsb2F0IGRvdE5WLCBjb25zdCBpbiBmbG9hdCBhbWJpZW50T2NjbHVzaW9uLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7XFxuXFx0cmV0dXJuIHNhdHVyYXRlKCBwb3coIGRvdE5WICsgYW1iaWVudE9jY2x1c2lvbiwgZXhwMiggLSAxNi4wICogcm91Z2huZXNzIC0gMS4wICkgKSAtIDEuMCArIGFtYmllbnRPY2NsdXNpb24gKTtcXG59XFxuXCI7XG5cbnZhciBsaWdodHNfdGVtcGxhdGUgPSBcIlxcbkdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnk7XFxuZ2VvbWV0cnkucG9zaXRpb24gPSAtIHZWaWV3UG9zaXRpb247XFxuZ2VvbWV0cnkubm9ybWFsID0gbm9ybWFsO1xcbmdlb21ldHJ5LnZpZXdEaXIgPSBub3JtYWxpemUoIHZWaWV3UG9zaXRpb24gKTtcXG5JbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0O1xcbiNpZiAoIE5VTV9QT0lOVF9MSUdIVFMgPiAwICkgJiYgZGVmaW5lZCggUkVfRGlyZWN0IClcXG5cXHRQb2ludExpZ2h0IHBvaW50TGlnaHQ7XFxuXFx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX1BPSU5UX0xJR0hUUzsgaSArKyApIHtcXG5cXHRcXHRwb2ludExpZ2h0ID0gcG9pbnRMaWdodHNbIGkgXTtcXG5cXHRcXHRnZXRQb2ludERpcmVjdExpZ2h0SXJyYWRpYW5jZSggcG9pbnRMaWdodCwgZ2VvbWV0cnksIGRpcmVjdExpZ2h0ICk7XFxuXFx0XFx0I2lmZGVmIFVTRV9TSEFET1dNQVBcXG5cXHRcXHRkaXJlY3RMaWdodC5jb2xvciAqPSBhbGwoIGJ2ZWMyKCBwb2ludExpZ2h0LnNoYWRvdywgZGlyZWN0TGlnaHQudmlzaWJsZSApICkgPyBnZXRQb2ludFNoYWRvdyggcG9pbnRTaGFkb3dNYXBbIGkgXSwgcG9pbnRMaWdodC5zaGFkb3dNYXBTaXplLCBwb2ludExpZ2h0LnNoYWRvd0JpYXMsIHBvaW50TGlnaHQuc2hhZG93UmFkaXVzLCB2UG9pbnRTaGFkb3dDb29yZFsgaSBdICkgOiAxLjA7XFxuXFx0XFx0I2VuZGlmXFxuXFx0XFx0UkVfRGlyZWN0KCBkaXJlY3RMaWdodCwgZ2VvbWV0cnksIG1hdGVyaWFsLCByZWZsZWN0ZWRMaWdodCApO1xcblxcdH1cXG4jZW5kaWZcXG4jaWYgKCBOVU1fU1BPVF9MSUdIVFMgPiAwICkgJiYgZGVmaW5lZCggUkVfRGlyZWN0IClcXG5cXHRTcG90TGlnaHQgc3BvdExpZ2h0O1xcblxcdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9TUE9UX0xJR0hUUzsgaSArKyApIHtcXG5cXHRcXHRzcG90TGlnaHQgPSBzcG90TGlnaHRzWyBpIF07XFxuXFx0XFx0Z2V0U3BvdERpcmVjdExpZ2h0SXJyYWRpYW5jZSggc3BvdExpZ2h0LCBnZW9tZXRyeSwgZGlyZWN0TGlnaHQgKTtcXG5cXHRcXHQjaWZkZWYgVVNFX1NIQURPV01BUFxcblxcdFxcdGRpcmVjdExpZ2h0LmNvbG9yICo9IGFsbCggYnZlYzIoIHNwb3RMaWdodC5zaGFkb3csIGRpcmVjdExpZ2h0LnZpc2libGUgKSApID8gZ2V0U2hhZG93KCBzcG90U2hhZG93TWFwWyBpIF0sIHNwb3RMaWdodC5zaGFkb3dNYXBTaXplLCBzcG90TGlnaHQuc2hhZG93Qmlhcywgc3BvdExpZ2h0LnNoYWRvd1JhZGl1cywgdlNwb3RTaGFkb3dDb29yZFsgaSBdICkgOiAxLjA7XFxuXFx0XFx0I2VuZGlmXFxuXFx0XFx0UkVfRGlyZWN0KCBkaXJlY3RMaWdodCwgZ2VvbWV0cnksIG1hdGVyaWFsLCByZWZsZWN0ZWRMaWdodCApO1xcblxcdH1cXG4jZW5kaWZcXG4jaWYgKCBOVU1fRElSX0xJR0hUUyA+IDAgKSAmJiBkZWZpbmVkKCBSRV9EaXJlY3QgKVxcblxcdERpcmVjdGlvbmFsTGlnaHQgZGlyZWN0aW9uYWxMaWdodDtcXG5cXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fRElSX0xJR0hUUzsgaSArKyApIHtcXG5cXHRcXHRkaXJlY3Rpb25hbExpZ2h0ID0gZGlyZWN0aW9uYWxMaWdodHNbIGkgXTtcXG5cXHRcXHRnZXREaXJlY3Rpb25hbERpcmVjdExpZ2h0SXJyYWRpYW5jZSggZGlyZWN0aW9uYWxMaWdodCwgZ2VvbWV0cnksIGRpcmVjdExpZ2h0ICk7XFxuXFx0XFx0I2lmZGVmIFVTRV9TSEFET1dNQVBcXG5cXHRcXHRkaXJlY3RMaWdodC5jb2xvciAqPSBhbGwoIGJ2ZWMyKCBkaXJlY3Rpb25hbExpZ2h0LnNoYWRvdywgZGlyZWN0TGlnaHQudmlzaWJsZSApICkgPyBnZXRTaGFkb3coIGRpcmVjdGlvbmFsU2hhZG93TWFwWyBpIF0sIGRpcmVjdGlvbmFsTGlnaHQuc2hhZG93TWFwU2l6ZSwgZGlyZWN0aW9uYWxMaWdodC5zaGFkb3dCaWFzLCBkaXJlY3Rpb25hbExpZ2h0LnNoYWRvd1JhZGl1cywgdkRpcmVjdGlvbmFsU2hhZG93Q29vcmRbIGkgXSApIDogMS4wO1xcblxcdFxcdCNlbmRpZlxcblxcdFxcdFJFX0RpcmVjdCggZGlyZWN0TGlnaHQsIGdlb21ldHJ5LCBtYXRlcmlhbCwgcmVmbGVjdGVkTGlnaHQgKTtcXG5cXHR9XFxuI2VuZGlmXFxuI2lmICggTlVNX1JFQ1RfQVJFQV9MSUdIVFMgPiAwICkgJiYgZGVmaW5lZCggUkVfRGlyZWN0X1JlY3RBcmVhIClcXG5cXHRSZWN0QXJlYUxpZ2h0IHJlY3RBcmVhTGlnaHQ7XFxuXFx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX1JFQ1RfQVJFQV9MSUdIVFM7IGkgKysgKSB7XFxuXFx0XFx0cmVjdEFyZWFMaWdodCA9IHJlY3RBcmVhTGlnaHRzWyBpIF07XFxuXFx0XFx0UkVfRGlyZWN0X1JlY3RBcmVhKCByZWN0QXJlYUxpZ2h0LCBnZW9tZXRyeSwgbWF0ZXJpYWwsIHJlZmxlY3RlZExpZ2h0ICk7XFxuXFx0fVxcbiNlbmRpZlxcbiNpZiBkZWZpbmVkKCBSRV9JbmRpcmVjdERpZmZ1c2UgKVxcblxcdHZlYzMgaXJyYWRpYW5jZSA9IGdldEFtYmllbnRMaWdodElycmFkaWFuY2UoIGFtYmllbnRMaWdodENvbG9yICk7XFxuXFx0I2lmZGVmIFVTRV9MSUdIVE1BUFxcblxcdFxcdHZlYzMgbGlnaHRNYXBJcnJhZGlhbmNlID0gdGV4dHVyZTJEKCBsaWdodE1hcCwgdlV2MiApLnh5eiAqIGxpZ2h0TWFwSW50ZW5zaXR5O1xcblxcdFxcdCNpZm5kZWYgUEhZU0lDQUxMWV9DT1JSRUNUX0xJR0hUU1xcblxcdFxcdFxcdGxpZ2h0TWFwSXJyYWRpYW5jZSAqPSBQSTtcXG5cXHRcXHQjZW5kaWZcXG5cXHRcXHRpcnJhZGlhbmNlICs9IGxpZ2h0TWFwSXJyYWRpYW5jZTtcXG5cXHQjZW5kaWZcXG5cXHQjaWYgKCBOVU1fSEVNSV9MSUdIVFMgPiAwIClcXG5cXHRcXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fSEVNSV9MSUdIVFM7IGkgKysgKSB7XFxuXFx0XFx0XFx0aXJyYWRpYW5jZSArPSBnZXRIZW1pc3BoZXJlTGlnaHRJcnJhZGlhbmNlKCBoZW1pc3BoZXJlTGlnaHRzWyBpIF0sIGdlb21ldHJ5ICk7XFxuXFx0XFx0fVxcblxcdCNlbmRpZlxcblxcdCNpZiBkZWZpbmVkKCBVU0VfRU5WTUFQICkgJiYgZGVmaW5lZCggUEhZU0lDQUwgKSAmJiBkZWZpbmVkKCBFTlZNQVBfVFlQRV9DVUJFX1VWIClcXG5cXHRcXHRpcnJhZGlhbmNlICs9IGdldExpZ2h0UHJvYmVJbmRpcmVjdElycmFkaWFuY2UoIGdlb21ldHJ5LCA4ICk7XFxuXFx0I2VuZGlmXFxuXFx0UkVfSW5kaXJlY3REaWZmdXNlKCBpcnJhZGlhbmNlLCBnZW9tZXRyeSwgbWF0ZXJpYWwsIHJlZmxlY3RlZExpZ2h0ICk7XFxuI2VuZGlmXFxuI2lmIGRlZmluZWQoIFVTRV9FTlZNQVAgKSAmJiBkZWZpbmVkKCBSRV9JbmRpcmVjdFNwZWN1bGFyIClcXG5cXHR2ZWMzIHJhZGlhbmNlID0gZ2V0TGlnaHRQcm9iZUluZGlyZWN0UmFkaWFuY2UoIGdlb21ldHJ5LCBNYXRlcmlhbF9CbGlublNoaW5pbmVzc0V4cG9uZW50KCBtYXRlcmlhbCApLCA4ICk7XFxuXFx0I2lmbmRlZiBTVEFOREFSRFxcblxcdFxcdHZlYzMgY2xlYXJDb2F0UmFkaWFuY2UgPSBnZXRMaWdodFByb2JlSW5kaXJlY3RSYWRpYW5jZSggZ2VvbWV0cnksIE1hdGVyaWFsX0NsZWFyQ29hdF9CbGlublNoaW5pbmVzc0V4cG9uZW50KCBtYXRlcmlhbCApLCA4ICk7XFxuXFx0I2Vsc2VcXG5cXHRcXHR2ZWMzIGNsZWFyQ29hdFJhZGlhbmNlID0gdmVjMyggMC4wICk7XFxuXFx0I2VuZGlmXFxuXFx0UkVfSW5kaXJlY3RTcGVjdWxhciggcmFkaWFuY2UsIGNsZWFyQ29hdFJhZGlhbmNlLCBnZW9tZXRyeSwgbWF0ZXJpYWwsIHJlZmxlY3RlZExpZ2h0ICk7XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBsb2dkZXB0aGJ1Zl9mcmFnbWVudCA9IFwiI2lmIGRlZmluZWQoVVNFX0xPR0RFUFRIQlVGKSAmJiBkZWZpbmVkKFVTRV9MT0dERVBUSEJVRl9FWFQpXFxuXFx0Z2xfRnJhZ0RlcHRoRVhUID0gbG9nMih2RnJhZ0RlcHRoKSAqIGxvZ0RlcHRoQnVmRkMgKiAwLjU7XFxuI2VuZGlmXCI7XG5cbnZhciBsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50ID0gXCIjaWZkZWYgVVNFX0xPR0RFUFRIQlVGXFxuXFx0dW5pZm9ybSBmbG9hdCBsb2dEZXB0aEJ1ZkZDO1xcblxcdCNpZmRlZiBVU0VfTE9HREVQVEhCVUZfRVhUXFxuXFx0XFx0dmFyeWluZyBmbG9hdCB2RnJhZ0RlcHRoO1xcblxcdCNlbmRpZlxcbiNlbmRpZlxcblwiO1xuXG52YXIgbG9nZGVwdGhidWZfcGFyc192ZXJ0ZXggPSBcIiNpZmRlZiBVU0VfTE9HREVQVEhCVUZcXG5cXHQjaWZkZWYgVVNFX0xPR0RFUFRIQlVGX0VYVFxcblxcdFxcdHZhcnlpbmcgZmxvYXQgdkZyYWdEZXB0aDtcXG5cXHQjZW5kaWZcXG5cXHR1bmlmb3JtIGZsb2F0IGxvZ0RlcHRoQnVmRkM7XFxuI2VuZGlmXCI7XG5cbnZhciBsb2dkZXB0aGJ1Zl92ZXJ0ZXggPSBcIiNpZmRlZiBVU0VfTE9HREVQVEhCVUZcXG5cXHRnbF9Qb3NpdGlvbi56ID0gbG9nMihtYXgoIEVQU0lMT04sIGdsX1Bvc2l0aW9uLncgKyAxLjAgKSkgKiBsb2dEZXB0aEJ1ZkZDO1xcblxcdCNpZmRlZiBVU0VfTE9HREVQVEhCVUZfRVhUXFxuXFx0XFx0dkZyYWdEZXB0aCA9IDEuMCArIGdsX1Bvc2l0aW9uLnc7XFxuXFx0I2Vsc2VcXG5cXHRcXHRnbF9Qb3NpdGlvbi56ID0gKGdsX1Bvc2l0aW9uLnogLSAxLjApICogZ2xfUG9zaXRpb24udztcXG5cXHQjZW5kaWZcXG4jZW5kaWZcXG5cIjtcblxudmFyIG1hcF9mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9NQVBcXG5cXHR2ZWM0IHRleGVsQ29sb3IgPSB0ZXh0dXJlMkQoIG1hcCwgdlV2ICk7XFxuXFx0dGV4ZWxDb2xvciA9IG1hcFRleGVsVG9MaW5lYXIoIHRleGVsQ29sb3IgKTtcXG5cXHRkaWZmdXNlQ29sb3IgKj0gdGV4ZWxDb2xvcjtcXG4jZW5kaWZcXG5cIjtcblxudmFyIG1hcF9wYXJzX2ZyYWdtZW50ID0gXCIjaWZkZWYgVVNFX01BUFxcblxcdHVuaWZvcm0gc2FtcGxlcjJEIG1hcDtcXG4jZW5kaWZcXG5cIjtcblxudmFyIG1hcF9wYXJ0aWNsZV9mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9NQVBcXG5cXHR2ZWM0IG1hcFRleGVsID0gdGV4dHVyZTJEKCBtYXAsIHZlYzIoIGdsX1BvaW50Q29vcmQueCwgMS4wIC0gZ2xfUG9pbnRDb29yZC55ICkgKiBvZmZzZXRSZXBlYXQuencgKyBvZmZzZXRSZXBlYXQueHkgKTtcXG5cXHRkaWZmdXNlQ29sb3IgKj0gbWFwVGV4ZWxUb0xpbmVhciggbWFwVGV4ZWwgKTtcXG4jZW5kaWZcXG5cIjtcblxudmFyIG1hcF9wYXJ0aWNsZV9wYXJzX2ZyYWdtZW50ID0gXCIjaWZkZWYgVVNFX01BUFxcblxcdHVuaWZvcm0gdmVjNCBvZmZzZXRSZXBlYXQ7XFxuXFx0dW5pZm9ybSBzYW1wbGVyMkQgbWFwO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgbWV0YWxuZXNzbWFwX2ZyYWdtZW50ID0gXCJmbG9hdCBtZXRhbG5lc3NGYWN0b3IgPSBtZXRhbG5lc3M7XFxuI2lmZGVmIFVTRV9NRVRBTE5FU1NNQVBcXG5cXHR2ZWM0IHRleGVsTWV0YWxuZXNzID0gdGV4dHVyZTJEKCBtZXRhbG5lc3NNYXAsIHZVdiApO1xcblxcdG1ldGFsbmVzc0ZhY3RvciAqPSB0ZXhlbE1ldGFsbmVzcy5iO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgbWV0YWxuZXNzbWFwX3BhcnNfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfTUVUQUxORVNTTUFQXFxuXFx0dW5pZm9ybSBzYW1wbGVyMkQgbWV0YWxuZXNzTWFwO1xcbiNlbmRpZlwiO1xuXG52YXIgbW9ycGhub3JtYWxfdmVydGV4ID0gXCIjaWZkZWYgVVNFX01PUlBITk9STUFMU1xcblxcdG9iamVjdE5vcm1hbCArPSAoIG1vcnBoTm9ybWFsMCAtIG5vcm1hbCApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAwIF07XFxuXFx0b2JqZWN0Tm9ybWFsICs9ICggbW9ycGhOb3JtYWwxIC0gbm9ybWFsICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDEgXTtcXG5cXHRvYmplY3ROb3JtYWwgKz0gKCBtb3JwaE5vcm1hbDIgLSBub3JtYWwgKSAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgMiBdO1xcblxcdG9iamVjdE5vcm1hbCArPSAoIG1vcnBoTm9ybWFsMyAtIG5vcm1hbCApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAzIF07XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBtb3JwaHRhcmdldF9wYXJzX3ZlcnRleCA9IFwiI2lmZGVmIFVTRV9NT1JQSFRBUkdFVFNcXG5cXHQjaWZuZGVmIFVTRV9NT1JQSE5PUk1BTFNcXG5cXHR1bmlmb3JtIGZsb2F0IG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgOCBdO1xcblxcdCNlbHNlXFxuXFx0dW5pZm9ybSBmbG9hdCBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDQgXTtcXG5cXHQjZW5kaWZcXG4jZW5kaWZcIjtcblxudmFyIG1vcnBodGFyZ2V0X3ZlcnRleCA9IFwiI2lmZGVmIFVTRV9NT1JQSFRBUkdFVFNcXG5cXHR0cmFuc2Zvcm1lZCArPSAoIG1vcnBoVGFyZ2V0MCAtIHBvc2l0aW9uICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDAgXTtcXG5cXHR0cmFuc2Zvcm1lZCArPSAoIG1vcnBoVGFyZ2V0MSAtIHBvc2l0aW9uICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDEgXTtcXG5cXHR0cmFuc2Zvcm1lZCArPSAoIG1vcnBoVGFyZ2V0MiAtIHBvc2l0aW9uICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDIgXTtcXG5cXHR0cmFuc2Zvcm1lZCArPSAoIG1vcnBoVGFyZ2V0MyAtIHBvc2l0aW9uICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDMgXTtcXG5cXHQjaWZuZGVmIFVTRV9NT1JQSE5PUk1BTFNcXG5cXHR0cmFuc2Zvcm1lZCArPSAoIG1vcnBoVGFyZ2V0NCAtIHBvc2l0aW9uICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDQgXTtcXG5cXHR0cmFuc2Zvcm1lZCArPSAoIG1vcnBoVGFyZ2V0NSAtIHBvc2l0aW9uICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDUgXTtcXG5cXHR0cmFuc2Zvcm1lZCArPSAoIG1vcnBoVGFyZ2V0NiAtIHBvc2l0aW9uICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDYgXTtcXG5cXHR0cmFuc2Zvcm1lZCArPSAoIG1vcnBoVGFyZ2V0NyAtIHBvc2l0aW9uICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDcgXTtcXG5cXHQjZW5kaWZcXG4jZW5kaWZcXG5cIjtcblxudmFyIG5vcm1hbF9mbGlwID0gXCIjaWZkZWYgRE9VQkxFX1NJREVEXFxuXFx0ZmxvYXQgZmxpcE5vcm1hbCA9ICggZmxvYXQoIGdsX0Zyb250RmFjaW5nICkgKiAyLjAgLSAxLjAgKTtcXG4jZWxzZVxcblxcdGZsb2F0IGZsaXBOb3JtYWwgPSAxLjA7XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBub3JtYWxfZnJhZ21lbnQgPSBcIiNpZmRlZiBGTEFUX1NIQURFRFxcblxcdHZlYzMgZmR4ID0gdmVjMyggZEZkeCggdlZpZXdQb3NpdGlvbi54ICksIGRGZHgoIHZWaWV3UG9zaXRpb24ueSApLCBkRmR4KCB2Vmlld1Bvc2l0aW9uLnogKSApO1xcblxcdHZlYzMgZmR5ID0gdmVjMyggZEZkeSggdlZpZXdQb3NpdGlvbi54ICksIGRGZHkoIHZWaWV3UG9zaXRpb24ueSApLCBkRmR5KCB2Vmlld1Bvc2l0aW9uLnogKSApO1xcblxcdHZlYzMgbm9ybWFsID0gbm9ybWFsaXplKCBjcm9zcyggZmR4LCBmZHkgKSApO1xcbiNlbHNlXFxuXFx0dmVjMyBub3JtYWwgPSBub3JtYWxpemUoIHZOb3JtYWwgKSAqIGZsaXBOb3JtYWw7XFxuI2VuZGlmXFxuI2lmZGVmIFVTRV9OT1JNQUxNQVBcXG5cXHRub3JtYWwgPSBwZXJ0dXJiTm9ybWFsMkFyYiggLXZWaWV3UG9zaXRpb24sIG5vcm1hbCApO1xcbiNlbGlmIGRlZmluZWQoIFVTRV9CVU1QTUFQIClcXG5cXHRub3JtYWwgPSBwZXJ0dXJiTm9ybWFsQXJiKCAtdlZpZXdQb3NpdGlvbiwgbm9ybWFsLCBkSGR4eV9md2QoKSApO1xcbiNlbmRpZlxcblwiO1xuXG52YXIgbm9ybWFsbWFwX3BhcnNfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfTk9STUFMTUFQXFxuXFx0dW5pZm9ybSBzYW1wbGVyMkQgbm9ybWFsTWFwO1xcblxcdHVuaWZvcm0gdmVjMiBub3JtYWxTY2FsZTtcXG5cXHR2ZWMzIHBlcnR1cmJOb3JtYWwyQXJiKCB2ZWMzIGV5ZV9wb3MsIHZlYzMgc3VyZl9ub3JtICkge1xcblxcdFxcdHZlYzMgcTAgPSBkRmR4KCBleWVfcG9zLnh5eiApO1xcblxcdFxcdHZlYzMgcTEgPSBkRmR5KCBleWVfcG9zLnh5eiApO1xcblxcdFxcdHZlYzIgc3QwID0gZEZkeCggdlV2LnN0ICk7XFxuXFx0XFx0dmVjMiBzdDEgPSBkRmR5KCB2VXYuc3QgKTtcXG5cXHRcXHR2ZWMzIFMgPSBub3JtYWxpemUoIHEwICogc3QxLnQgLSBxMSAqIHN0MC50ICk7XFxuXFx0XFx0dmVjMyBUID0gbm9ybWFsaXplKCAtcTAgKiBzdDEucyArIHExICogc3QwLnMgKTtcXG5cXHRcXHR2ZWMzIE4gPSBub3JtYWxpemUoIHN1cmZfbm9ybSApO1xcblxcdFxcdHZlYzMgbWFwTiA9IHRleHR1cmUyRCggbm9ybWFsTWFwLCB2VXYgKS54eXogKiAyLjAgLSAxLjA7XFxuXFx0XFx0bWFwTi54eSA9IG5vcm1hbFNjYWxlICogbWFwTi54eTtcXG5cXHRcXHRtYXQzIHRzbiA9IG1hdDMoIFMsIFQsIE4gKTtcXG5cXHRcXHRyZXR1cm4gbm9ybWFsaXplKCB0c24gKiBtYXBOICk7XFxuXFx0fVxcbiNlbmRpZlxcblwiO1xuXG52YXIgcGFja2luZyA9IFwidmVjMyBwYWNrTm9ybWFsVG9SR0IoIGNvbnN0IGluIHZlYzMgbm9ybWFsICkge1xcblxcdHJldHVybiBub3JtYWxpemUoIG5vcm1hbCApICogMC41ICsgMC41O1xcbn1cXG52ZWMzIHVucGFja1JHQlRvTm9ybWFsKCBjb25zdCBpbiB2ZWMzIHJnYiApIHtcXG5cXHRyZXR1cm4gMS4wIC0gMi4wICogcmdiLnh5ejtcXG59XFxuY29uc3QgZmxvYXQgUGFja1Vwc2NhbGUgPSAyNTYuIC8gMjU1Ljtjb25zdCBmbG9hdCBVbnBhY2tEb3duc2NhbGUgPSAyNTUuIC8gMjU2LjtcXG5jb25zdCB2ZWMzIFBhY2tGYWN0b3JzID0gdmVjMyggMjU2LiAqIDI1Ni4gKiAyNTYuLCAyNTYuICogMjU2LiwgIDI1Ni4gKTtcXG5jb25zdCB2ZWM0IFVucGFja0ZhY3RvcnMgPSBVbnBhY2tEb3duc2NhbGUgLyB2ZWM0KCBQYWNrRmFjdG9ycywgMS4gKTtcXG5jb25zdCBmbG9hdCBTaGlmdFJpZ2h0OCA9IDEuIC8gMjU2LjtcXG52ZWM0IHBhY2tEZXB0aFRvUkdCQSggY29uc3QgaW4gZmxvYXQgdiApIHtcXG5cXHR2ZWM0IHIgPSB2ZWM0KCBmcmFjdCggdiAqIFBhY2tGYWN0b3JzICksIHYgKTtcXG5cXHRyLnl6dyAtPSByLnh5eiAqIFNoaWZ0UmlnaHQ4O1xcdHJldHVybiByICogUGFja1Vwc2NhbGU7XFxufVxcbmZsb2F0IHVucGFja1JHQkFUb0RlcHRoKCBjb25zdCBpbiB2ZWM0IHYgKSB7XFxuXFx0cmV0dXJuIGRvdCggdiwgVW5wYWNrRmFjdG9ycyApO1xcbn1cXG5mbG9hdCB2aWV3WlRvT3J0aG9ncmFwaGljRGVwdGgoIGNvbnN0IGluIGZsb2F0IHZpZXdaLCBjb25zdCBpbiBmbG9hdCBuZWFyLCBjb25zdCBpbiBmbG9hdCBmYXIgKSB7XFxuXFx0cmV0dXJuICggdmlld1ogKyBuZWFyICkgLyAoIG5lYXIgLSBmYXIgKTtcXG59XFxuZmxvYXQgb3J0aG9ncmFwaGljRGVwdGhUb1ZpZXdaKCBjb25zdCBpbiBmbG9hdCBsaW5lYXJDbGlwWiwgY29uc3QgaW4gZmxvYXQgbmVhciwgY29uc3QgaW4gZmxvYXQgZmFyICkge1xcblxcdHJldHVybiBsaW5lYXJDbGlwWiAqICggbmVhciAtIGZhciApIC0gbmVhcjtcXG59XFxuZmxvYXQgdmlld1pUb1BlcnNwZWN0aXZlRGVwdGgoIGNvbnN0IGluIGZsb2F0IHZpZXdaLCBjb25zdCBpbiBmbG9hdCBuZWFyLCBjb25zdCBpbiBmbG9hdCBmYXIgKSB7XFxuXFx0cmV0dXJuICgoIG5lYXIgKyB2aWV3WiApICogZmFyICkgLyAoKCBmYXIgLSBuZWFyICkgKiB2aWV3WiApO1xcbn1cXG5mbG9hdCBwZXJzcGVjdGl2ZURlcHRoVG9WaWV3WiggY29uc3QgaW4gZmxvYXQgaW52Q2xpcFosIGNvbnN0IGluIGZsb2F0IG5lYXIsIGNvbnN0IGluIGZsb2F0IGZhciApIHtcXG5cXHRyZXR1cm4gKCBuZWFyICogZmFyICkgLyAoICggZmFyIC0gbmVhciApICogaW52Q2xpcFogLSBmYXIgKTtcXG59XFxuXCI7XG5cbnZhciBwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50ID0gXCIjaWZkZWYgUFJFTVVMVElQTElFRF9BTFBIQVxcblxcdGdsX0ZyYWdDb2xvci5yZ2IgKj0gZ2xfRnJhZ0NvbG9yLmE7XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBwcm9qZWN0X3ZlcnRleCA9IFwiI2lmZGVmIFVTRV9TS0lOTklOR1xcblxcdHZlYzQgbXZQb3NpdGlvbiA9IG1vZGVsVmlld01hdHJpeCAqIHNraW5uZWQ7XFxuI2Vsc2VcXG5cXHR2ZWM0IG12UG9zaXRpb24gPSBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KCB0cmFuc2Zvcm1lZCwgMS4wICk7XFxuI2VuZGlmXFxuZ2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbXZQb3NpdGlvbjtcXG5cIjtcblxudmFyIGRpdGhlcmluZ19mcmFnbWVudCA9IFwiI2lmIGRlZmluZWQoIERJVEhFUklORyApXFxuICBnbF9GcmFnQ29sb3IucmdiID0gZGl0aGVyaW5nKCBnbF9GcmFnQ29sb3IucmdiICk7XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBkaXRoZXJpbmdfcGFyc19mcmFnbWVudCA9IFwiI2lmIGRlZmluZWQoIERJVEhFUklORyApXFxuXFx0dmVjMyBkaXRoZXJpbmcoIHZlYzMgY29sb3IgKSB7XFxuXFx0XFx0ZmxvYXQgZ3JpZF9wb3NpdGlvbiA9IHJhbmQoIGdsX0ZyYWdDb29yZC54eSApO1xcblxcdFxcdHZlYzMgZGl0aGVyX3NoaWZ0X1JHQiA9IHZlYzMoIDAuMjUgLyAyNTUuMCwgLTAuMjUgLyAyNTUuMCwgMC4yNSAvIDI1NS4wICk7XFxuXFx0XFx0ZGl0aGVyX3NoaWZ0X1JHQiA9IG1peCggMi4wICogZGl0aGVyX3NoaWZ0X1JHQiwgLTIuMCAqIGRpdGhlcl9zaGlmdF9SR0IsIGdyaWRfcG9zaXRpb24gKTtcXG5cXHRcXHRyZXR1cm4gY29sb3IgKyBkaXRoZXJfc2hpZnRfUkdCO1xcblxcdH1cXG4jZW5kaWZcXG5cIjtcblxudmFyIHJvdWdobmVzc21hcF9mcmFnbWVudCA9IFwiZmxvYXQgcm91Z2huZXNzRmFjdG9yID0gcm91Z2huZXNzO1xcbiNpZmRlZiBVU0VfUk9VR0hORVNTTUFQXFxuXFx0dmVjNCB0ZXhlbFJvdWdobmVzcyA9IHRleHR1cmUyRCggcm91Z2huZXNzTWFwLCB2VXYgKTtcXG5cXHRyb3VnaG5lc3NGYWN0b3IgKj0gdGV4ZWxSb3VnaG5lc3MuZztcXG4jZW5kaWZcXG5cIjtcblxudmFyIHJvdWdobmVzc21hcF9wYXJzX2ZyYWdtZW50ID0gXCIjaWZkZWYgVVNFX1JPVUdITkVTU01BUFxcblxcdHVuaWZvcm0gc2FtcGxlcjJEIHJvdWdobmVzc01hcDtcXG4jZW5kaWZcIjtcblxudmFyIHNoYWRvd21hcF9wYXJzX2ZyYWdtZW50ID0gXCIjaWZkZWYgVVNFX1NIQURPV01BUFxcblxcdCNpZiBOVU1fRElSX0xJR0hUUyA+IDBcXG5cXHRcXHR1bmlmb3JtIHNhbXBsZXIyRCBkaXJlY3Rpb25hbFNoYWRvd01hcFsgTlVNX0RJUl9MSUdIVFMgXTtcXG5cXHRcXHR2YXJ5aW5nIHZlYzQgdkRpcmVjdGlvbmFsU2hhZG93Q29vcmRbIE5VTV9ESVJfTElHSFRTIF07XFxuXFx0I2VuZGlmXFxuXFx0I2lmIE5VTV9TUE9UX0xJR0hUUyA+IDBcXG5cXHRcXHR1bmlmb3JtIHNhbXBsZXIyRCBzcG90U2hhZG93TWFwWyBOVU1fU1BPVF9MSUdIVFMgXTtcXG5cXHRcXHR2YXJ5aW5nIHZlYzQgdlNwb3RTaGFkb3dDb29yZFsgTlVNX1NQT1RfTElHSFRTIF07XFxuXFx0I2VuZGlmXFxuXFx0I2lmIE5VTV9QT0lOVF9MSUdIVFMgPiAwXFxuXFx0XFx0dW5pZm9ybSBzYW1wbGVyMkQgcG9pbnRTaGFkb3dNYXBbIE5VTV9QT0lOVF9MSUdIVFMgXTtcXG5cXHRcXHR2YXJ5aW5nIHZlYzQgdlBvaW50U2hhZG93Q29vcmRbIE5VTV9QT0lOVF9MSUdIVFMgXTtcXG5cXHQjZW5kaWZcXG5cXHRmbG9hdCB0ZXh0dXJlMkRDb21wYXJlKCBzYW1wbGVyMkQgZGVwdGhzLCB2ZWMyIHV2LCBmbG9hdCBjb21wYXJlICkge1xcblxcdFxcdHJldHVybiBzdGVwKCBjb21wYXJlLCB1bnBhY2tSR0JBVG9EZXB0aCggdGV4dHVyZTJEKCBkZXB0aHMsIHV2ICkgKSApO1xcblxcdH1cXG5cXHRmbG9hdCB0ZXh0dXJlMkRTaGFkb3dMZXJwKCBzYW1wbGVyMkQgZGVwdGhzLCB2ZWMyIHNpemUsIHZlYzIgdXYsIGZsb2F0IGNvbXBhcmUgKSB7XFxuXFx0XFx0Y29uc3QgdmVjMiBvZmZzZXQgPSB2ZWMyKCAwLjAsIDEuMCApO1xcblxcdFxcdHZlYzIgdGV4ZWxTaXplID0gdmVjMiggMS4wICkgLyBzaXplO1xcblxcdFxcdHZlYzIgY2VudHJvaWRVViA9IGZsb29yKCB1diAqIHNpemUgKyAwLjUgKSAvIHNpemU7XFxuXFx0XFx0ZmxvYXQgbGIgPSB0ZXh0dXJlMkRDb21wYXJlKCBkZXB0aHMsIGNlbnRyb2lkVVYgKyB0ZXhlbFNpemUgKiBvZmZzZXQueHgsIGNvbXBhcmUgKTtcXG5cXHRcXHRmbG9hdCBsdCA9IHRleHR1cmUyRENvbXBhcmUoIGRlcHRocywgY2VudHJvaWRVViArIHRleGVsU2l6ZSAqIG9mZnNldC54eSwgY29tcGFyZSApO1xcblxcdFxcdGZsb2F0IHJiID0gdGV4dHVyZTJEQ29tcGFyZSggZGVwdGhzLCBjZW50cm9pZFVWICsgdGV4ZWxTaXplICogb2Zmc2V0Lnl4LCBjb21wYXJlICk7XFxuXFx0XFx0ZmxvYXQgcnQgPSB0ZXh0dXJlMkRDb21wYXJlKCBkZXB0aHMsIGNlbnRyb2lkVVYgKyB0ZXhlbFNpemUgKiBvZmZzZXQueXksIGNvbXBhcmUgKTtcXG5cXHRcXHR2ZWMyIGYgPSBmcmFjdCggdXYgKiBzaXplICsgMC41ICk7XFxuXFx0XFx0ZmxvYXQgYSA9IG1peCggbGIsIGx0LCBmLnkgKTtcXG5cXHRcXHRmbG9hdCBiID0gbWl4KCByYiwgcnQsIGYueSApO1xcblxcdFxcdGZsb2F0IGMgPSBtaXgoIGEsIGIsIGYueCApO1xcblxcdFxcdHJldHVybiBjO1xcblxcdH1cXG5cXHRmbG9hdCBnZXRTaGFkb3coIHNhbXBsZXIyRCBzaGFkb3dNYXAsIHZlYzIgc2hhZG93TWFwU2l6ZSwgZmxvYXQgc2hhZG93QmlhcywgZmxvYXQgc2hhZG93UmFkaXVzLCB2ZWM0IHNoYWRvd0Nvb3JkICkge1xcblxcdFxcdHNoYWRvd0Nvb3JkLnh5eiAvPSBzaGFkb3dDb29yZC53O1xcblxcdFxcdHNoYWRvd0Nvb3JkLnogKz0gc2hhZG93QmlhcztcXG5cXHRcXHRidmVjNCBpbkZydXN0dW1WZWMgPSBidmVjNCAoIHNoYWRvd0Nvb3JkLnggPj0gMC4wLCBzaGFkb3dDb29yZC54IDw9IDEuMCwgc2hhZG93Q29vcmQueSA+PSAwLjAsIHNoYWRvd0Nvb3JkLnkgPD0gMS4wICk7XFxuXFx0XFx0Ym9vbCBpbkZydXN0dW0gPSBhbGwoIGluRnJ1c3R1bVZlYyApO1xcblxcdFxcdGJ2ZWMyIGZydXN0dW1UZXN0VmVjID0gYnZlYzIoIGluRnJ1c3R1bSwgc2hhZG93Q29vcmQueiA8PSAxLjAgKTtcXG5cXHRcXHRib29sIGZydXN0dW1UZXN0ID0gYWxsKCBmcnVzdHVtVGVzdFZlYyApO1xcblxcdFxcdGlmICggZnJ1c3R1bVRlc3QgKSB7XFxuXFx0XFx0I2lmIGRlZmluZWQoIFNIQURPV01BUF9UWVBFX1BDRiApXFxuXFx0XFx0XFx0dmVjMiB0ZXhlbFNpemUgPSB2ZWMyKCAxLjAgKSAvIHNoYWRvd01hcFNpemU7XFxuXFx0XFx0XFx0ZmxvYXQgZHgwID0gLSB0ZXhlbFNpemUueCAqIHNoYWRvd1JhZGl1cztcXG5cXHRcXHRcXHRmbG9hdCBkeTAgPSAtIHRleGVsU2l6ZS55ICogc2hhZG93UmFkaXVzO1xcblxcdFxcdFxcdGZsb2F0IGR4MSA9ICsgdGV4ZWxTaXplLnggKiBzaGFkb3dSYWRpdXM7XFxuXFx0XFx0XFx0ZmxvYXQgZHkxID0gKyB0ZXhlbFNpemUueSAqIHNoYWRvd1JhZGl1cztcXG5cXHRcXHRcXHRyZXR1cm4gKFxcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDAsIGR5MCApLCBzaGFkb3dDb29yZC56ICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCAwLjAsIGR5MCApLCBzaGFkb3dDb29yZC56ICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDEsIGR5MCApLCBzaGFkb3dDb29yZC56ICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDAsIDAuMCApLCBzaGFkb3dDb29yZC56ICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHksIHNoYWRvd0Nvb3JkLnogKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MSwgMC4wICksIHNoYWRvd0Nvb3JkLnogKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MCwgZHkxICksIHNoYWRvd0Nvb3JkLnogKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIDAuMCwgZHkxICksIHNoYWRvd0Nvb3JkLnogKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MSwgZHkxICksIHNoYWRvd0Nvb3JkLnogKVxcblxcdFxcdFxcdCkgKiAoIDEuMCAvIDkuMCApO1xcblxcdFxcdCNlbGlmIGRlZmluZWQoIFNIQURPV01BUF9UWVBFX1BDRl9TT0ZUIClcXG5cXHRcXHRcXHR2ZWMyIHRleGVsU2l6ZSA9IHZlYzIoIDEuMCApIC8gc2hhZG93TWFwU2l6ZTtcXG5cXHRcXHRcXHRmbG9hdCBkeDAgPSAtIHRleGVsU2l6ZS54ICogc2hhZG93UmFkaXVzO1xcblxcdFxcdFxcdGZsb2F0IGR5MCA9IC0gdGV4ZWxTaXplLnkgKiBzaGFkb3dSYWRpdXM7XFxuXFx0XFx0XFx0ZmxvYXQgZHgxID0gKyB0ZXhlbFNpemUueCAqIHNoYWRvd1JhZGl1cztcXG5cXHRcXHRcXHRmbG9hdCBkeTEgPSArIHRleGVsU2l6ZS55ICogc2hhZG93UmFkaXVzO1xcblxcdFxcdFxcdHJldHVybiAoXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEU2hhZG93TGVycCggc2hhZG93TWFwLCBzaGFkb3dNYXBTaXplLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MCwgZHkwICksIHNoYWRvd0Nvb3JkLnogKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEU2hhZG93TGVycCggc2hhZG93TWFwLCBzaGFkb3dNYXBTaXplLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIDAuMCwgZHkwICksIHNoYWRvd0Nvb3JkLnogKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEU2hhZG93TGVycCggc2hhZG93TWFwLCBzaGFkb3dNYXBTaXplLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MSwgZHkwICksIHNoYWRvd0Nvb3JkLnogKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEU2hhZG93TGVycCggc2hhZG93TWFwLCBzaGFkb3dNYXBTaXplLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MCwgMC4wICksIHNoYWRvd0Nvb3JkLnogKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEU2hhZG93TGVycCggc2hhZG93TWFwLCBzaGFkb3dNYXBTaXplLCBzaGFkb3dDb29yZC54eSwgc2hhZG93Q29vcmQueiApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRTaGFkb3dMZXJwKCBzaGFkb3dNYXAsIHNoYWRvd01hcFNpemUsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgxLCAwLjAgKSwgc2hhZG93Q29vcmQueiApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRTaGFkb3dMZXJwKCBzaGFkb3dNYXAsIHNoYWRvd01hcFNpemUsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgwLCBkeTEgKSwgc2hhZG93Q29vcmQueiApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRTaGFkb3dMZXJwKCBzaGFkb3dNYXAsIHNoYWRvd01hcFNpemUsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggMC4wLCBkeTEgKSwgc2hhZG93Q29vcmQueiApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRTaGFkb3dMZXJwKCBzaGFkb3dNYXAsIHNoYWRvd01hcFNpemUsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgxLCBkeTEgKSwgc2hhZG93Q29vcmQueiApXFxuXFx0XFx0XFx0KSAqICggMS4wIC8gOS4wICk7XFxuXFx0XFx0I2Vsc2VcXG5cXHRcXHRcXHRyZXR1cm4gdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSwgc2hhZG93Q29vcmQueiApO1xcblxcdFxcdCNlbmRpZlxcblxcdFxcdH1cXG5cXHRcXHRyZXR1cm4gMS4wO1xcblxcdH1cXG5cXHR2ZWMyIGN1YmVUb1VWKCB2ZWMzIHYsIGZsb2F0IHRleGVsU2l6ZVkgKSB7XFxuXFx0XFx0dmVjMyBhYnNWID0gYWJzKCB2ICk7XFxuXFx0XFx0ZmxvYXQgc2NhbGVUb0N1YmUgPSAxLjAgLyBtYXgoIGFic1YueCwgbWF4KCBhYnNWLnksIGFic1YueiApICk7XFxuXFx0XFx0YWJzViAqPSBzY2FsZVRvQ3ViZTtcXG5cXHRcXHR2ICo9IHNjYWxlVG9DdWJlICogKCAxLjAgLSAyLjAgKiB0ZXhlbFNpemVZICk7XFxuXFx0XFx0dmVjMiBwbGFuYXIgPSB2Lnh5O1xcblxcdFxcdGZsb2F0IGFsbW9zdEFUZXhlbCA9IDEuNSAqIHRleGVsU2l6ZVk7XFxuXFx0XFx0ZmxvYXQgYWxtb3N0T25lID0gMS4wIC0gYWxtb3N0QVRleGVsO1xcblxcdFxcdGlmICggYWJzVi56ID49IGFsbW9zdE9uZSApIHtcXG5cXHRcXHRcXHRpZiAoIHYueiA+IDAuMCApXFxuXFx0XFx0XFx0XFx0cGxhbmFyLnggPSA0LjAgLSB2Lng7XFxuXFx0XFx0fSBlbHNlIGlmICggYWJzVi54ID49IGFsbW9zdE9uZSApIHtcXG5cXHRcXHRcXHRmbG9hdCBzaWduWCA9IHNpZ24oIHYueCApO1xcblxcdFxcdFxcdHBsYW5hci54ID0gdi56ICogc2lnblggKyAyLjAgKiBzaWduWDtcXG5cXHRcXHR9IGVsc2UgaWYgKCBhYnNWLnkgPj0gYWxtb3N0T25lICkge1xcblxcdFxcdFxcdGZsb2F0IHNpZ25ZID0gc2lnbiggdi55ICk7XFxuXFx0XFx0XFx0cGxhbmFyLnggPSB2LnggKyAyLjAgKiBzaWduWSArIDIuMDtcXG5cXHRcXHRcXHRwbGFuYXIueSA9IHYueiAqIHNpZ25ZIC0gMi4wO1xcblxcdFxcdH1cXG5cXHRcXHRyZXR1cm4gdmVjMiggMC4xMjUsIDAuMjUgKSAqIHBsYW5hciArIHZlYzIoIDAuMzc1LCAwLjc1ICk7XFxuXFx0fVxcblxcdGZsb2F0IGdldFBvaW50U2hhZG93KCBzYW1wbGVyMkQgc2hhZG93TWFwLCB2ZWMyIHNoYWRvd01hcFNpemUsIGZsb2F0IHNoYWRvd0JpYXMsIGZsb2F0IHNoYWRvd1JhZGl1cywgdmVjNCBzaGFkb3dDb29yZCApIHtcXG5cXHRcXHR2ZWMyIHRleGVsU2l6ZSA9IHZlYzIoIDEuMCApIC8gKCBzaGFkb3dNYXBTaXplICogdmVjMiggNC4wLCAyLjAgKSApO1xcblxcdFxcdHZlYzMgbGlnaHRUb1Bvc2l0aW9uID0gc2hhZG93Q29vcmQueHl6O1xcblxcdFxcdHZlYzMgYmQzRCA9IG5vcm1hbGl6ZSggbGlnaHRUb1Bvc2l0aW9uICk7XFxuXFx0XFx0ZmxvYXQgZHAgPSAoIGxlbmd0aCggbGlnaHRUb1Bvc2l0aW9uICkgLSBzaGFkb3dCaWFzICkgLyAxMDAwLjA7XFxuXFx0XFx0I2lmIGRlZmluZWQoIFNIQURPV01BUF9UWVBFX1BDRiApIHx8IGRlZmluZWQoIFNIQURPV01BUF9UWVBFX1BDRl9TT0ZUIClcXG5cXHRcXHRcXHR2ZWMyIG9mZnNldCA9IHZlYzIoIC0gMSwgMSApICogc2hhZG93UmFkaXVzICogdGV4ZWxTaXplLnk7XFxuXFx0XFx0XFx0cmV0dXJuIChcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnh5eSwgdGV4ZWxTaXplLnkgKSwgZHAgKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC55eXksIHRleGVsU2l6ZS55ICksIGRwICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueHl4LCB0ZXhlbFNpemUueSApLCBkcCApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnl5eCwgdGV4ZWxTaXplLnkgKSwgZHAgKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCwgdGV4ZWxTaXplLnkgKSwgZHAgKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC54eHksIHRleGVsU2l6ZS55ICksIGRwICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueXh5LCB0ZXhlbFNpemUueSApLCBkcCApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnh4eCwgdGV4ZWxTaXplLnkgKSwgZHAgKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC55eHgsIHRleGVsU2l6ZS55ICksIGRwIClcXG5cXHRcXHRcXHQpICogKCAxLjAgLyA5LjAgKTtcXG5cXHRcXHQjZWxzZVxcblxcdFxcdFxcdHJldHVybiB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNELCB0ZXhlbFNpemUueSApLCBkcCApO1xcblxcdFxcdCNlbmRpZlxcblxcdH1cXG4jZW5kaWZcXG5cIjtcblxudmFyIHNoYWRvd21hcF9wYXJzX3ZlcnRleCA9IFwiI2lmZGVmIFVTRV9TSEFET1dNQVBcXG5cXHQjaWYgTlVNX0RJUl9MSUdIVFMgPiAwXFxuXFx0XFx0dW5pZm9ybSBtYXQ0IGRpcmVjdGlvbmFsU2hhZG93TWF0cml4WyBOVU1fRElSX0xJR0hUUyBdO1xcblxcdFxcdHZhcnlpbmcgdmVjNCB2RGlyZWN0aW9uYWxTaGFkb3dDb29yZFsgTlVNX0RJUl9MSUdIVFMgXTtcXG5cXHQjZW5kaWZcXG5cXHQjaWYgTlVNX1NQT1RfTElHSFRTID4gMFxcblxcdFxcdHVuaWZvcm0gbWF0NCBzcG90U2hhZG93TWF0cml4WyBOVU1fU1BPVF9MSUdIVFMgXTtcXG5cXHRcXHR2YXJ5aW5nIHZlYzQgdlNwb3RTaGFkb3dDb29yZFsgTlVNX1NQT1RfTElHSFRTIF07XFxuXFx0I2VuZGlmXFxuXFx0I2lmIE5VTV9QT0lOVF9MSUdIVFMgPiAwXFxuXFx0XFx0dW5pZm9ybSBtYXQ0IHBvaW50U2hhZG93TWF0cml4WyBOVU1fUE9JTlRfTElHSFRTIF07XFxuXFx0XFx0dmFyeWluZyB2ZWM0IHZQb2ludFNoYWRvd0Nvb3JkWyBOVU1fUE9JTlRfTElHSFRTIF07XFxuXFx0I2VuZGlmXFxuI2VuZGlmXFxuXCI7XG5cbnZhciBzaGFkb3dtYXBfdmVydGV4ID0gXCIjaWZkZWYgVVNFX1NIQURPV01BUFxcblxcdCNpZiBOVU1fRElSX0xJR0hUUyA+IDBcXG5cXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fRElSX0xJR0hUUzsgaSArKyApIHtcXG5cXHRcXHR2RGlyZWN0aW9uYWxTaGFkb3dDb29yZFsgaSBdID0gZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXhbIGkgXSAqIHdvcmxkUG9zaXRpb247XFxuXFx0fVxcblxcdCNlbmRpZlxcblxcdCNpZiBOVU1fU1BPVF9MSUdIVFMgPiAwXFxuXFx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX1NQT1RfTElHSFRTOyBpICsrICkge1xcblxcdFxcdHZTcG90U2hhZG93Q29vcmRbIGkgXSA9IHNwb3RTaGFkb3dNYXRyaXhbIGkgXSAqIHdvcmxkUG9zaXRpb247XFxuXFx0fVxcblxcdCNlbmRpZlxcblxcdCNpZiBOVU1fUE9JTlRfTElHSFRTID4gMFxcblxcdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9QT0lOVF9MSUdIVFM7IGkgKysgKSB7XFxuXFx0XFx0dlBvaW50U2hhZG93Q29vcmRbIGkgXSA9IHBvaW50U2hhZG93TWF0cml4WyBpIF0gKiB3b3JsZFBvc2l0aW9uO1xcblxcdH1cXG5cXHQjZW5kaWZcXG4jZW5kaWZcXG5cIjtcblxudmFyIHNoYWRvd21hc2tfcGFyc19mcmFnbWVudCA9IFwiZmxvYXQgZ2V0U2hhZG93TWFzaygpIHtcXG5cXHRmbG9hdCBzaGFkb3cgPSAxLjA7XFxuXFx0I2lmZGVmIFVTRV9TSEFET1dNQVBcXG5cXHQjaWYgTlVNX0RJUl9MSUdIVFMgPiAwXFxuXFx0RGlyZWN0aW9uYWxMaWdodCBkaXJlY3Rpb25hbExpZ2h0O1xcblxcdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9ESVJfTElHSFRTOyBpICsrICkge1xcblxcdFxcdGRpcmVjdGlvbmFsTGlnaHQgPSBkaXJlY3Rpb25hbExpZ2h0c1sgaSBdO1xcblxcdFxcdHNoYWRvdyAqPSBib29sKCBkaXJlY3Rpb25hbExpZ2h0LnNoYWRvdyApID8gZ2V0U2hhZG93KCBkaXJlY3Rpb25hbFNoYWRvd01hcFsgaSBdLCBkaXJlY3Rpb25hbExpZ2h0LnNoYWRvd01hcFNpemUsIGRpcmVjdGlvbmFsTGlnaHQuc2hhZG93QmlhcywgZGlyZWN0aW9uYWxMaWdodC5zaGFkb3dSYWRpdXMsIHZEaXJlY3Rpb25hbFNoYWRvd0Nvb3JkWyBpIF0gKSA6IDEuMDtcXG5cXHR9XFxuXFx0I2VuZGlmXFxuXFx0I2lmIE5VTV9TUE9UX0xJR0hUUyA+IDBcXG5cXHRTcG90TGlnaHQgc3BvdExpZ2h0O1xcblxcdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9TUE9UX0xJR0hUUzsgaSArKyApIHtcXG5cXHRcXHRzcG90TGlnaHQgPSBzcG90TGlnaHRzWyBpIF07XFxuXFx0XFx0c2hhZG93ICo9IGJvb2woIHNwb3RMaWdodC5zaGFkb3cgKSA/IGdldFNoYWRvdyggc3BvdFNoYWRvd01hcFsgaSBdLCBzcG90TGlnaHQuc2hhZG93TWFwU2l6ZSwgc3BvdExpZ2h0LnNoYWRvd0JpYXMsIHNwb3RMaWdodC5zaGFkb3dSYWRpdXMsIHZTcG90U2hhZG93Q29vcmRbIGkgXSApIDogMS4wO1xcblxcdH1cXG5cXHQjZW5kaWZcXG5cXHQjaWYgTlVNX1BPSU5UX0xJR0hUUyA+IDBcXG5cXHRQb2ludExpZ2h0IHBvaW50TGlnaHQ7XFxuXFx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX1BPSU5UX0xJR0hUUzsgaSArKyApIHtcXG5cXHRcXHRwb2ludExpZ2h0ID0gcG9pbnRMaWdodHNbIGkgXTtcXG5cXHRcXHRzaGFkb3cgKj0gYm9vbCggcG9pbnRMaWdodC5zaGFkb3cgKSA/IGdldFBvaW50U2hhZG93KCBwb2ludFNoYWRvd01hcFsgaSBdLCBwb2ludExpZ2h0LnNoYWRvd01hcFNpemUsIHBvaW50TGlnaHQuc2hhZG93QmlhcywgcG9pbnRMaWdodC5zaGFkb3dSYWRpdXMsIHZQb2ludFNoYWRvd0Nvb3JkWyBpIF0gKSA6IDEuMDtcXG5cXHR9XFxuXFx0I2VuZGlmXFxuXFx0I2VuZGlmXFxuXFx0cmV0dXJuIHNoYWRvdztcXG59XFxuXCI7XG5cbnZhciBza2luYmFzZV92ZXJ0ZXggPSBcIiNpZmRlZiBVU0VfU0tJTk5JTkdcXG5cXHRtYXQ0IGJvbmVNYXRYID0gZ2V0Qm9uZU1hdHJpeCggc2tpbkluZGV4LnggKTtcXG5cXHRtYXQ0IGJvbmVNYXRZID0gZ2V0Qm9uZU1hdHJpeCggc2tpbkluZGV4LnkgKTtcXG5cXHRtYXQ0IGJvbmVNYXRaID0gZ2V0Qm9uZU1hdHJpeCggc2tpbkluZGV4LnogKTtcXG5cXHRtYXQ0IGJvbmVNYXRXID0gZ2V0Qm9uZU1hdHJpeCggc2tpbkluZGV4LncgKTtcXG4jZW5kaWZcIjtcblxudmFyIHNraW5uaW5nX3BhcnNfdmVydGV4ID0gXCIjaWZkZWYgVVNFX1NLSU5OSU5HXFxuXFx0dW5pZm9ybSBtYXQ0IGJpbmRNYXRyaXg7XFxuXFx0dW5pZm9ybSBtYXQ0IGJpbmRNYXRyaXhJbnZlcnNlO1xcblxcdCNpZmRlZiBCT05FX1RFWFRVUkVcXG5cXHRcXHR1bmlmb3JtIHNhbXBsZXIyRCBib25lVGV4dHVyZTtcXG5cXHRcXHR1bmlmb3JtIGludCBib25lVGV4dHVyZVNpemU7XFxuXFx0XFx0bWF0NCBnZXRCb25lTWF0cml4KCBjb25zdCBpbiBmbG9hdCBpICkge1xcblxcdFxcdFxcdGZsb2F0IGogPSBpICogNC4wO1xcblxcdFxcdFxcdGZsb2F0IHggPSBtb2QoIGosIGZsb2F0KCBib25lVGV4dHVyZVNpemUgKSApO1xcblxcdFxcdFxcdGZsb2F0IHkgPSBmbG9vciggaiAvIGZsb2F0KCBib25lVGV4dHVyZVNpemUgKSApO1xcblxcdFxcdFxcdGZsb2F0IGR4ID0gMS4wIC8gZmxvYXQoIGJvbmVUZXh0dXJlU2l6ZSApO1xcblxcdFxcdFxcdGZsb2F0IGR5ID0gMS4wIC8gZmxvYXQoIGJvbmVUZXh0dXJlU2l6ZSApO1xcblxcdFxcdFxcdHkgPSBkeSAqICggeSArIDAuNSApO1xcblxcdFxcdFxcdHZlYzQgdjEgPSB0ZXh0dXJlMkQoIGJvbmVUZXh0dXJlLCB2ZWMyKCBkeCAqICggeCArIDAuNSApLCB5ICkgKTtcXG5cXHRcXHRcXHR2ZWM0IHYyID0gdGV4dHVyZTJEKCBib25lVGV4dHVyZSwgdmVjMiggZHggKiAoIHggKyAxLjUgKSwgeSApICk7XFxuXFx0XFx0XFx0dmVjNCB2MyA9IHRleHR1cmUyRCggYm9uZVRleHR1cmUsIHZlYzIoIGR4ICogKCB4ICsgMi41ICksIHkgKSApO1xcblxcdFxcdFxcdHZlYzQgdjQgPSB0ZXh0dXJlMkQoIGJvbmVUZXh0dXJlLCB2ZWMyKCBkeCAqICggeCArIDMuNSApLCB5ICkgKTtcXG5cXHRcXHRcXHRtYXQ0IGJvbmUgPSBtYXQ0KCB2MSwgdjIsIHYzLCB2NCApO1xcblxcdFxcdFxcdHJldHVybiBib25lO1xcblxcdFxcdH1cXG5cXHQjZWxzZVxcblxcdFxcdHVuaWZvcm0gbWF0NCBib25lTWF0cmljZXNbIE1BWF9CT05FUyBdO1xcblxcdFxcdG1hdDQgZ2V0Qm9uZU1hdHJpeCggY29uc3QgaW4gZmxvYXQgaSApIHtcXG5cXHRcXHRcXHRtYXQ0IGJvbmUgPSBib25lTWF0cmljZXNbIGludChpKSBdO1xcblxcdFxcdFxcdHJldHVybiBib25lO1xcblxcdFxcdH1cXG5cXHQjZW5kaWZcXG4jZW5kaWZcXG5cIjtcblxudmFyIHNraW5uaW5nX3ZlcnRleCA9IFwiI2lmZGVmIFVTRV9TS0lOTklOR1xcblxcdHZlYzQgc2tpblZlcnRleCA9IGJpbmRNYXRyaXggKiB2ZWM0KCB0cmFuc2Zvcm1lZCwgMS4wICk7XFxuXFx0dmVjNCBza2lubmVkID0gdmVjNCggMC4wICk7XFxuXFx0c2tpbm5lZCArPSBib25lTWF0WCAqIHNraW5WZXJ0ZXggKiBza2luV2VpZ2h0Lng7XFxuXFx0c2tpbm5lZCArPSBib25lTWF0WSAqIHNraW5WZXJ0ZXggKiBza2luV2VpZ2h0Lnk7XFxuXFx0c2tpbm5lZCArPSBib25lTWF0WiAqIHNraW5WZXJ0ZXggKiBza2luV2VpZ2h0Lno7XFxuXFx0c2tpbm5lZCArPSBib25lTWF0VyAqIHNraW5WZXJ0ZXggKiBza2luV2VpZ2h0Lnc7XFxuXFx0c2tpbm5lZCAgPSBiaW5kTWF0cml4SW52ZXJzZSAqIHNraW5uZWQ7XFxuI2VuZGlmXFxuXCI7XG5cbnZhciBza2lubm9ybWFsX3ZlcnRleCA9IFwiI2lmZGVmIFVTRV9TS0lOTklOR1xcblxcdG1hdDQgc2tpbk1hdHJpeCA9IG1hdDQoIDAuMCApO1xcblxcdHNraW5NYXRyaXggKz0gc2tpbldlaWdodC54ICogYm9uZU1hdFg7XFxuXFx0c2tpbk1hdHJpeCArPSBza2luV2VpZ2h0LnkgKiBib25lTWF0WTtcXG5cXHRza2luTWF0cml4ICs9IHNraW5XZWlnaHQueiAqIGJvbmVNYXRaO1xcblxcdHNraW5NYXRyaXggKz0gc2tpbldlaWdodC53ICogYm9uZU1hdFc7XFxuXFx0c2tpbk1hdHJpeCAgPSBiaW5kTWF0cml4SW52ZXJzZSAqIHNraW5NYXRyaXggKiBiaW5kTWF0cml4O1xcblxcdG9iamVjdE5vcm1hbCA9IHZlYzQoIHNraW5NYXRyaXggKiB2ZWM0KCBvYmplY3ROb3JtYWwsIDAuMCApICkueHl6O1xcbiNlbmRpZlxcblwiO1xuXG52YXIgc3BlY3VsYXJtYXBfZnJhZ21lbnQgPSBcImZsb2F0IHNwZWN1bGFyU3RyZW5ndGg7XFxuI2lmZGVmIFVTRV9TUEVDVUxBUk1BUFxcblxcdHZlYzQgdGV4ZWxTcGVjdWxhciA9IHRleHR1cmUyRCggc3BlY3VsYXJNYXAsIHZVdiApO1xcblxcdHNwZWN1bGFyU3RyZW5ndGggPSB0ZXhlbFNwZWN1bGFyLnI7XFxuI2Vsc2VcXG5cXHRzcGVjdWxhclN0cmVuZ3RoID0gMS4wO1xcbiNlbmRpZlwiO1xuXG52YXIgc3BlY3VsYXJtYXBfcGFyc19mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9TUEVDVUxBUk1BUFxcblxcdHVuaWZvcm0gc2FtcGxlcjJEIHNwZWN1bGFyTWFwO1xcbiNlbmRpZlwiO1xuXG52YXIgdG9uZW1hcHBpbmdfZnJhZ21lbnQgPSBcIiNpZiBkZWZpbmVkKCBUT05FX01BUFBJTkcgKVxcbiAgZ2xfRnJhZ0NvbG9yLnJnYiA9IHRvbmVNYXBwaW5nKCBnbF9GcmFnQ29sb3IucmdiICk7XFxuI2VuZGlmXFxuXCI7XG5cbnZhciB0b25lbWFwcGluZ19wYXJzX2ZyYWdtZW50ID0gXCIjZGVmaW5lIHNhdHVyYXRlKGEpIGNsYW1wKCBhLCAwLjAsIDEuMCApXFxudW5pZm9ybSBmbG9hdCB0b25lTWFwcGluZ0V4cG9zdXJlO1xcbnVuaWZvcm0gZmxvYXQgdG9uZU1hcHBpbmdXaGl0ZVBvaW50O1xcbnZlYzMgTGluZWFyVG9uZU1hcHBpbmcoIHZlYzMgY29sb3IgKSB7XFxuXFx0cmV0dXJuIHRvbmVNYXBwaW5nRXhwb3N1cmUgKiBjb2xvcjtcXG59XFxudmVjMyBSZWluaGFyZFRvbmVNYXBwaW5nKCB2ZWMzIGNvbG9yICkge1xcblxcdGNvbG9yICo9IHRvbmVNYXBwaW5nRXhwb3N1cmU7XFxuXFx0cmV0dXJuIHNhdHVyYXRlKCBjb2xvciAvICggdmVjMyggMS4wICkgKyBjb2xvciApICk7XFxufVxcbiNkZWZpbmUgVW5jaGFydGVkMkhlbHBlciggeCApIG1heCggKCAoIHggKiAoIDAuMTUgKiB4ICsgMC4xMCAqIDAuNTAgKSArIDAuMjAgKiAwLjAyICkgLyAoIHggKiAoIDAuMTUgKiB4ICsgMC41MCApICsgMC4yMCAqIDAuMzAgKSApIC0gMC4wMiAvIDAuMzAsIHZlYzMoIDAuMCApIClcXG52ZWMzIFVuY2hhcnRlZDJUb25lTWFwcGluZyggdmVjMyBjb2xvciApIHtcXG5cXHRjb2xvciAqPSB0b25lTWFwcGluZ0V4cG9zdXJlO1xcblxcdHJldHVybiBzYXR1cmF0ZSggVW5jaGFydGVkMkhlbHBlciggY29sb3IgKSAvIFVuY2hhcnRlZDJIZWxwZXIoIHZlYzMoIHRvbmVNYXBwaW5nV2hpdGVQb2ludCApICkgKTtcXG59XFxudmVjMyBPcHRpbWl6ZWRDaW5lb25Ub25lTWFwcGluZyggdmVjMyBjb2xvciApIHtcXG5cXHRjb2xvciAqPSB0b25lTWFwcGluZ0V4cG9zdXJlO1xcblxcdGNvbG9yID0gbWF4KCB2ZWMzKCAwLjAgKSwgY29sb3IgLSAwLjAwNCApO1xcblxcdHJldHVybiBwb3coICggY29sb3IgKiAoIDYuMiAqIGNvbG9yICsgMC41ICkgKSAvICggY29sb3IgKiAoIDYuMiAqIGNvbG9yICsgMS43ICkgKyAwLjA2ICksIHZlYzMoIDIuMiApICk7XFxufVxcblwiO1xuXG52YXIgdXZfcGFyc19mcmFnbWVudCA9IFwiI2lmIGRlZmluZWQoIFVTRV9NQVAgKSB8fCBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFVTRV9OT1JNQUxNQVAgKSB8fCBkZWZpbmVkKCBVU0VfU1BFQ1VMQVJNQVAgKSB8fCBkZWZpbmVkKCBVU0VfQUxQSEFNQVAgKSB8fCBkZWZpbmVkKCBVU0VfRU1JU1NJVkVNQVAgKSB8fCBkZWZpbmVkKCBVU0VfUk9VR0hORVNTTUFQICkgfHwgZGVmaW5lZCggVVNFX01FVEFMTkVTU01BUCApXFxuXFx0dmFyeWluZyB2ZWMyIHZVdjtcXG4jZW5kaWZcIjtcblxudmFyIHV2X3BhcnNfdmVydGV4ID0gXCIjaWYgZGVmaW5lZCggVVNFX01BUCApIHx8IGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVVNFX05PUk1BTE1BUCApIHx8IGRlZmluZWQoIFVTRV9TUEVDVUxBUk1BUCApIHx8IGRlZmluZWQoIFVTRV9BTFBIQU1BUCApIHx8IGRlZmluZWQoIFVTRV9FTUlTU0lWRU1BUCApIHx8IGRlZmluZWQoIFVTRV9ST1VHSE5FU1NNQVAgKSB8fCBkZWZpbmVkKCBVU0VfTUVUQUxORVNTTUFQIClcXG5cXHR2YXJ5aW5nIHZlYzIgdlV2O1xcblxcdHVuaWZvcm0gdmVjNCBvZmZzZXRSZXBlYXQ7XFxuI2VuZGlmXFxuXCI7XG5cbnZhciB1dl92ZXJ0ZXggPSBcIiNpZiBkZWZpbmVkKCBVU0VfTUFQICkgfHwgZGVmaW5lZCggVVNFX0JVTVBNQVAgKSB8fCBkZWZpbmVkKCBVU0VfTk9STUFMTUFQICkgfHwgZGVmaW5lZCggVVNFX1NQRUNVTEFSTUFQICkgfHwgZGVmaW5lZCggVVNFX0FMUEhBTUFQICkgfHwgZGVmaW5lZCggVVNFX0VNSVNTSVZFTUFQICkgfHwgZGVmaW5lZCggVVNFX1JPVUdITkVTU01BUCApIHx8IGRlZmluZWQoIFVTRV9NRVRBTE5FU1NNQVAgKVxcblxcdHZVdiA9IHV2ICogb2Zmc2V0UmVwZWF0Lnp3ICsgb2Zmc2V0UmVwZWF0Lnh5O1xcbiNlbmRpZlwiO1xuXG52YXIgdXYyX3BhcnNfZnJhZ21lbnQgPSBcIiNpZiBkZWZpbmVkKCBVU0VfTElHSFRNQVAgKSB8fCBkZWZpbmVkKCBVU0VfQU9NQVAgKVxcblxcdHZhcnlpbmcgdmVjMiB2VXYyO1xcbiNlbmRpZlwiO1xuXG52YXIgdXYyX3BhcnNfdmVydGV4ID0gXCIjaWYgZGVmaW5lZCggVVNFX0xJR0hUTUFQICkgfHwgZGVmaW5lZCggVVNFX0FPTUFQIClcXG5cXHRhdHRyaWJ1dGUgdmVjMiB1djI7XFxuXFx0dmFyeWluZyB2ZWMyIHZVdjI7XFxuI2VuZGlmXCI7XG5cbnZhciB1djJfdmVydGV4ID0gXCIjaWYgZGVmaW5lZCggVVNFX0xJR0hUTUFQICkgfHwgZGVmaW5lZCggVVNFX0FPTUFQIClcXG5cXHR2VXYyID0gdXYyO1xcbiNlbmRpZlwiO1xuXG52YXIgd29ybGRwb3NfdmVydGV4ID0gXCIjaWYgZGVmaW5lZCggVVNFX0VOVk1BUCApIHx8IGRlZmluZWQoIFBIT05HICkgfHwgZGVmaW5lZCggUEhZU0lDQUwgKSB8fCBkZWZpbmVkKCBMQU1CRVJUICkgfHwgZGVmaW5lZCAoIFVTRV9TSEFET1dNQVAgKVxcblxcdCNpZmRlZiBVU0VfU0tJTk5JTkdcXG5cXHRcXHR2ZWM0IHdvcmxkUG9zaXRpb24gPSBtb2RlbE1hdHJpeCAqIHNraW5uZWQ7XFxuXFx0I2Vsc2VcXG5cXHRcXHR2ZWM0IHdvcmxkUG9zaXRpb24gPSBtb2RlbE1hdHJpeCAqIHZlYzQoIHRyYW5zZm9ybWVkLCAxLjAgKTtcXG5cXHQjZW5kaWZcXG4jZW5kaWZcXG5cIjtcblxudmFyIGN1YmVfZnJhZyA9IFwidW5pZm9ybSBzYW1wbGVyQ3ViZSB0Q3ViZTtcXG51bmlmb3JtIGZsb2F0IHRGbGlwO1xcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcXG52YXJ5aW5nIHZlYzMgdldvcmxkUG9zaXRpb247XFxuI2luY2x1ZGUgPGNvbW1vbj5cXG52b2lkIG1haW4oKSB7XFxuXFx0Z2xfRnJhZ0NvbG9yID0gdGV4dHVyZUN1YmUoIHRDdWJlLCB2ZWMzKCB0RmxpcCAqIHZXb3JsZFBvc2l0aW9uLngsIHZXb3JsZFBvc2l0aW9uLnl6ICkgKTtcXG5cXHRnbF9GcmFnQ29sb3IuYSAqPSBvcGFjaXR5O1xcbn1cXG5cIjtcblxudmFyIGN1YmVfdmVydCA9IFwidmFyeWluZyB2ZWMzIHZXb3JsZFBvc2l0aW9uO1xcbiNpbmNsdWRlIDxjb21tb24+XFxudm9pZCBtYWluKCkge1xcblxcdHZXb3JsZFBvc2l0aW9uID0gdHJhbnNmb3JtRGlyZWN0aW9uKCBwb3NpdGlvbiwgbW9kZWxNYXRyaXggKTtcXG5cXHQjaW5jbHVkZSA8YmVnaW5fdmVydGV4PlxcblxcdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cXG59XFxuXCI7XG5cbnZhciBkZXB0aF9mcmFnID0gXCIjaWYgREVQVEhfUEFDS0lORyA9PSAzMjAwXFxuXFx0dW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xcbiNlbmRpZlxcbiNpbmNsdWRlIDxjb21tb24+XFxuI2luY2x1ZGUgPHBhY2tpbmc+XFxuI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPG1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxhbHBoYW1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD5cXG52b2lkIG1haW4oKSB7XFxuXFx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD5cXG5cXHR2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIDEuMCApO1xcblxcdCNpZiBERVBUSF9QQUNLSU5HID09IDMyMDBcXG5cXHRcXHRkaWZmdXNlQ29sb3IuYSA9IG9wYWNpdHk7XFxuXFx0I2VuZGlmXFxuXFx0I2luY2x1ZGUgPG1hcF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8YWxwaGFtYXBfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGFscGhhdGVzdF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+XFxuXFx0I2lmIERFUFRIX1BBQ0tJTkcgPT0gMzIwMFxcblxcdFxcdGdsX0ZyYWdDb2xvciA9IHZlYzQoIHZlYzMoIGdsX0ZyYWdDb29yZC56ICksIG9wYWNpdHkgKTtcXG5cXHQjZWxpZiBERVBUSF9QQUNLSU5HID09IDMyMDFcXG5cXHRcXHRnbF9GcmFnQ29sb3IgPSBwYWNrRGVwdGhUb1JHQkEoIGdsX0ZyYWdDb29yZC56ICk7XFxuXFx0I2VuZGlmXFxufVxcblwiO1xuXG52YXIgZGVwdGhfdmVydCA9IFwiI2luY2x1ZGUgPGNvbW1vbj5cXG4jaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPHNraW5uaW5nX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4PlxcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8dXZfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2luYmFzZV92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+XFxufVxcblwiO1xuXG52YXIgZGlzdGFuY2VSR0JBX2ZyYWcgPSBcInVuaWZvcm0gdmVjMyBsaWdodFBvcztcXG52YXJ5aW5nIHZlYzQgdldvcmxkUG9zaXRpb247XFxuI2luY2x1ZGUgPGNvbW1vbj5cXG4jaW5jbHVkZSA8cGFja2luZz5cXG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+XFxudm9pZCBtYWluICgpIHtcXG5cXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxcblxcdGdsX0ZyYWdDb2xvciA9IHBhY2tEZXB0aFRvUkdCQSggbGVuZ3RoKCB2V29ybGRQb3NpdGlvbi54eXogLSBsaWdodFBvcy54eXogKSAvIDEwMDAuMCApO1xcbn1cXG5cIjtcblxudmFyIGRpc3RhbmNlUkdCQV92ZXJ0ID0gXCJ2YXJ5aW5nIHZlYzQgdldvcmxkUG9zaXRpb247XFxuI2luY2x1ZGUgPGNvbW1vbj5cXG4jaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPHNraW5uaW5nX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+XFxudm9pZCBtYWluKCkge1xcblxcdCNpbmNsdWRlIDxza2luYmFzZV92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxcblxcdCNpbmNsdWRlIDx3b3JsZHBvc192ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+XFxuXFx0dldvcmxkUG9zaXRpb24gPSB3b3JsZFBvc2l0aW9uO1xcbn1cXG5cIjtcblxudmFyIGVxdWlyZWN0X2ZyYWcgPSBcInVuaWZvcm0gc2FtcGxlcjJEIHRFcXVpcmVjdDtcXG51bmlmb3JtIGZsb2F0IHRGbGlwO1xcbnZhcnlpbmcgdmVjMyB2V29ybGRQb3NpdGlvbjtcXG4jaW5jbHVkZSA8Y29tbW9uPlxcbnZvaWQgbWFpbigpIHtcXG5cXHR2ZWMzIGRpcmVjdGlvbiA9IG5vcm1hbGl6ZSggdldvcmxkUG9zaXRpb24gKTtcXG5cXHR2ZWMyIHNhbXBsZVVWO1xcblxcdHNhbXBsZVVWLnkgPSBzYXR1cmF0ZSggdEZsaXAgKiBkaXJlY3Rpb24ueSAqIC0wLjUgKyAwLjUgKTtcXG5cXHRzYW1wbGVVVi54ID0gYXRhbiggZGlyZWN0aW9uLnosIGRpcmVjdGlvbi54ICkgKiBSRUNJUFJPQ0FMX1BJMiArIDAuNTtcXG5cXHRnbF9GcmFnQ29sb3IgPSB0ZXh0dXJlMkQoIHRFcXVpcmVjdCwgc2FtcGxlVVYgKTtcXG59XFxuXCI7XG5cbnZhciBlcXVpcmVjdF92ZXJ0ID0gXCJ2YXJ5aW5nIHZlYzMgdldvcmxkUG9zaXRpb247XFxuI2luY2x1ZGUgPGNvbW1vbj5cXG52b2lkIG1haW4oKSB7XFxuXFx0dldvcmxkUG9zaXRpb24gPSB0cmFuc2Zvcm1EaXJlY3Rpb24oIHBvc2l0aW9uLCBtb2RlbE1hdHJpeCApO1xcblxcdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4Plxcbn1cXG5cIjtcblxudmFyIGxpbmVkYXNoZWRfZnJhZyA9IFwidW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XFxudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xcbnVuaWZvcm0gZmxvYXQgZGFzaFNpemU7XFxudW5pZm9ybSBmbG9hdCB0b3RhbFNpemU7XFxudmFyeWluZyBmbG9hdCB2TGluZURpc3RhbmNlO1xcbiNpbmNsdWRlIDxjb21tb24+XFxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGZvZ19wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD5cXG52b2lkIG1haW4oKSB7XFxuXFx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD5cXG5cXHRpZiAoIG1vZCggdkxpbmVEaXN0YW5jZSwgdG90YWxTaXplICkgPiBkYXNoU2l6ZSApIHtcXG5cXHRcXHRkaXNjYXJkO1xcblxcdH1cXG5cXHR2ZWMzIG91dGdvaW5nTGlnaHQgPSB2ZWMzKCAwLjAgKTtcXG5cXHR2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTtcXG5cXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGNvbG9yX2ZyYWdtZW50PlxcblxcdG91dGdvaW5nTGlnaHQgPSBkaWZmdXNlQ29sb3IucmdiO1xcblxcdGdsX0ZyYWdDb2xvciA9IHZlYzQoIG91dGdvaW5nTGlnaHQsIGRpZmZ1c2VDb2xvci5hICk7XFxuXFx0I2luY2x1ZGUgPHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxlbmNvZGluZ3NfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGZvZ19mcmFnbWVudD5cXG59XFxuXCI7XG5cbnZhciBsaW5lZGFzaGVkX3ZlcnQgPSBcInVuaWZvcm0gZmxvYXQgc2NhbGU7XFxuYXR0cmlidXRlIGZsb2F0IGxpbmVEaXN0YW5jZTtcXG52YXJ5aW5nIGZsb2F0IHZMaW5lRGlzdGFuY2U7XFxuI2luY2x1ZGUgPGNvbW1vbj5cXG4jaW5jbHVkZSA8Y29sb3JfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD5cXG52b2lkIG1haW4oKSB7XFxuXFx0I2luY2x1ZGUgPGNvbG9yX3ZlcnRleD5cXG5cXHR2TGluZURpc3RhbmNlID0gc2NhbGUgKiBsaW5lRGlzdGFuY2U7XFxuXFx0dmVjNCBtdlBvc2l0aW9uID0gbW9kZWxWaWV3TWF0cml4ICogdmVjNCggcG9zaXRpb24sIDEuMCApO1xcblxcdGdsX1Bvc2l0aW9uID0gcHJvamVjdGlvbk1hdHJpeCAqIG12UG9zaXRpb247XFxuXFx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8Zm9nX3ZlcnRleD5cXG59XFxuXCI7XG5cbnZhciBtZXNoYmFzaWNfZnJhZyA9IFwidW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XFxudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xcbiNpZm5kZWYgRkxBVF9TSEFERURcXG5cXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcXG4jZW5kaWZcXG4jaW5jbHVkZSA8Y29tbW9uPlxcbiNpbmNsdWRlIDxjb2xvcl9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDx1djJfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGFscGhhbWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGFvbWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGxpZ2h0bWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGVudm1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxmb2dfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8c3BlY3VsYXJtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+XFxudm9pZCBtYWluKCkge1xcblxcdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+XFxuXFx0dmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7XFxuXFx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxtYXBfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGNvbG9yX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxhbHBoYW1hcF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8YWxwaGF0ZXN0X2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxzcGVjdWxhcm1hcF9mcmFnbWVudD5cXG5cXHRSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCA9IFJlZmxlY3RlZExpZ2h0KCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSApO1xcblxcdCNpZmRlZiBVU0VfTElHSFRNQVBcXG5cXHRcXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKz0gdGV4dHVyZTJEKCBsaWdodE1hcCwgdlV2MiApLnh5eiAqIGxpZ2h0TWFwSW50ZW5zaXR5O1xcblxcdCNlbHNlXFxuXFx0XFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICs9IHZlYzMoIDEuMCApO1xcblxcdCNlbmRpZlxcblxcdCNpbmNsdWRlIDxhb21hcF9mcmFnbWVudD5cXG5cXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKj0gZGlmZnVzZUNvbG9yLnJnYjtcXG5cXHR2ZWMzIG91dGdvaW5nTGlnaHQgPSByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2U7XFxuXFx0I2luY2x1ZGUgPG5vcm1hbF9mbGlwPlxcblxcdCNpbmNsdWRlIDxlbnZtYXBfZnJhZ21lbnQ+XFxuXFx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggb3V0Z29pbmdMaWdodCwgZGlmZnVzZUNvbG9yLmEgKTtcXG5cXHQjaW5jbHVkZSA8cHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGVuY29kaW5nc19mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8Zm9nX2ZyYWdtZW50Plxcbn1cXG5cIjtcblxudmFyIG1lc2hiYXNpY192ZXJ0ID0gXCIjaW5jbHVkZSA8Y29tbW9uPlxcbiNpbmNsdWRlIDx1dl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8dXYyX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxlbnZtYXBfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxza2lubmluZ19wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD5cXG52b2lkIG1haW4oKSB7XFxuXFx0I2luY2x1ZGUgPHV2X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8dXYyX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8Y29sb3JfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2luYmFzZV92ZXJ0ZXg+XFxuXFx0I2lmZGVmIFVTRV9FTlZNQVBcXG5cXHQjaW5jbHVkZSA8YmVnaW5ub3JtYWxfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNraW5ub3JtYWxfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxkZWZhdWx0bm9ybWFsX3ZlcnRleD5cXG5cXHQjZW5kaWZcXG5cXHQjaW5jbHVkZSA8YmVnaW5fdmVydGV4PlxcblxcdCNpbmNsdWRlIDxtb3JwaHRhcmdldF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNraW5uaW5nX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8d29ybGRwb3NfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxlbnZtYXBfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxmb2dfdmVydGV4Plxcbn1cXG5cIjtcblxudmFyIG1lc2hsYW1iZXJ0X2ZyYWcgPSBcInVuaWZvcm0gdmVjMyBkaWZmdXNlO1xcbnVuaWZvcm0gdmVjMyBlbWlzc2l2ZTtcXG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XFxudmFyeWluZyB2ZWMzIHZMaWdodEZyb250O1xcbiNpZmRlZiBET1VCTEVfU0lERURcXG5cXHR2YXJ5aW5nIHZlYzMgdkxpZ2h0QmFjaztcXG4jZW5kaWZcXG4jaW5jbHVkZSA8Y29tbW9uPlxcbiNpbmNsdWRlIDxwYWNraW5nPlxcbiNpbmNsdWRlIDxkaXRoZXJpbmdfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8Y29sb3JfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8dXZfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8dXYyX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPG1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxhbHBoYW1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxhb21hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxsaWdodG1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxlbWlzc2l2ZW1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxlbnZtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8YnNkZnM+XFxuI2luY2x1ZGUgPGxpZ2h0c19wYXJzPlxcbiNpbmNsdWRlIDxmb2dfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHNoYWRvd21hc2tfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8c3BlY3VsYXJtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+XFxudm9pZCBtYWluKCkge1xcblxcdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+XFxuXFx0dmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7XFxuXFx0UmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgPSBSZWZsZWN0ZWRMaWdodCggdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICkgKTtcXG5cXHR2ZWMzIHRvdGFsRW1pc3NpdmVSYWRpYW5jZSA9IGVtaXNzaXZlO1xcblxcdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8bWFwX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxjb2xvcl9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8YWxwaGFtYXBfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGFscGhhdGVzdF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8c3BlY3VsYXJtYXBfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGVtaXNzaXZlbWFwX2ZyYWdtZW50PlxcblxcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSA9IGdldEFtYmllbnRMaWdodElycmFkaWFuY2UoIGFtYmllbnRMaWdodENvbG9yICk7XFxuXFx0I2luY2x1ZGUgPGxpZ2h0bWFwX2ZyYWdtZW50PlxcblxcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSAqPSBCUkRGX0RpZmZ1c2VfTGFtYmVydCggZGlmZnVzZUNvbG9yLnJnYiApO1xcblxcdCNpZmRlZiBET1VCTEVfU0lERURcXG5cXHRcXHRyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlID0gKCBnbF9Gcm9udEZhY2luZyApID8gdkxpZ2h0RnJvbnQgOiB2TGlnaHRCYWNrO1xcblxcdCNlbHNlXFxuXFx0XFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSA9IHZMaWdodEZyb250O1xcblxcdCNlbmRpZlxcblxcdHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKj0gQlJERl9EaWZmdXNlX0xhbWJlcnQoIGRpZmZ1c2VDb2xvci5yZ2IgKSAqIGdldFNoYWRvd01hc2soKTtcXG5cXHQjaW5jbHVkZSA8YW9tYXBfZnJhZ21lbnQ+XFxuXFx0dmVjMyBvdXRnb2luZ0xpZ2h0ID0gcmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSArIHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArIHRvdGFsRW1pc3NpdmVSYWRpYW5jZTtcXG5cXHQjaW5jbHVkZSA8bm9ybWFsX2ZsaXA+XFxuXFx0I2luY2x1ZGUgPGVudm1hcF9mcmFnbWVudD5cXG5cXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KCBvdXRnb2luZ0xpZ2h0LCBkaWZmdXNlQ29sb3IuYSApO1xcblxcdCNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8ZW5jb2RpbmdzX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGRpdGhlcmluZ19mcmFnbWVudD5cXG59XFxuXCI7XG5cbnZhciBtZXNobGFtYmVydF92ZXJ0ID0gXCIjZGVmaW5lIExBTUJFUlRcXG52YXJ5aW5nIHZlYzMgdkxpZ2h0RnJvbnQ7XFxuI2lmZGVmIERPVUJMRV9TSURFRFxcblxcdHZhcnlpbmcgdmVjMyB2TGlnaHRCYWNrO1xcbiNlbmRpZlxcbiNpbmNsdWRlIDxjb21tb24+XFxuI2luY2x1ZGUgPHV2X3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDx1djJfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGVudm1hcF9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8YnNkZnM+XFxuI2luY2x1ZGUgPGxpZ2h0c19wYXJzPlxcbiNpbmNsdWRlIDxjb2xvcl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8Zm9nX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD5cXG52b2lkIG1haW4oKSB7XFxuXFx0I2luY2x1ZGUgPHV2X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8dXYyX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8Y29sb3JfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxiZWdpbm5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPG1vcnBobm9ybWFsX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8ZGVmYXVsdG5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHdvcmxkcG9zX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8ZW52bWFwX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bGlnaHRzX2xhbWJlcnRfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxzaGFkb3dtYXBfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxmb2dfdmVydGV4Plxcbn1cXG5cIjtcblxudmFyIG1lc2hwaG9uZ19mcmFnID0gXCIjZGVmaW5lIFBIT05HXFxudW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XFxudW5pZm9ybSB2ZWMzIGVtaXNzaXZlO1xcbnVuaWZvcm0gdmVjMyBzcGVjdWxhcjtcXG51bmlmb3JtIGZsb2F0IHNoaW5pbmVzcztcXG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XFxuI2luY2x1ZGUgPGNvbW1vbj5cXG4jaW5jbHVkZSA8cGFja2luZz5cXG4jaW5jbHVkZSA8ZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHV2Ml9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8YWxwaGFtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8YW9tYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bGlnaHRtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8ZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8ZW52bWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGdyYWRpZW50bWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGZvZ19wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxic2Rmcz5cXG4jaW5jbHVkZSA8bGlnaHRzX3BhcnM+XFxuI2luY2x1ZGUgPGxpZ2h0c19waG9uZ19wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8YnVtcG1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxub3JtYWxtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8c3BlY3VsYXJtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+XFxudm9pZCBtYWluKCkge1xcblxcdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+XFxuXFx0dmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7XFxuXFx0UmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgPSBSZWZsZWN0ZWRMaWdodCggdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICkgKTtcXG5cXHR2ZWMzIHRvdGFsRW1pc3NpdmVSYWRpYW5jZSA9IGVtaXNzaXZlO1xcblxcdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8bWFwX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxjb2xvcl9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8YWxwaGFtYXBfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGFscGhhdGVzdF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8c3BlY3VsYXJtYXBfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPG5vcm1hbF9mbGlwPlxcblxcdCNpbmNsdWRlIDxub3JtYWxfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGVtaXNzaXZlbWFwX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxsaWdodHNfcGhvbmdfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGxpZ2h0c190ZW1wbGF0ZT5cXG5cXHQjaW5jbHVkZSA8YW9tYXBfZnJhZ21lbnQ+XFxuXFx0dmVjMyBvdXRnb2luZ0xpZ2h0ID0gcmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSArIHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArIHJlZmxlY3RlZExpZ2h0LmRpcmVjdFNwZWN1bGFyICsgcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3RTcGVjdWxhciArIHRvdGFsRW1pc3NpdmVSYWRpYW5jZTtcXG5cXHQjaW5jbHVkZSA8ZW52bWFwX2ZyYWdtZW50PlxcblxcdGdsX0ZyYWdDb2xvciA9IHZlYzQoIG91dGdvaW5nTGlnaHQsIGRpZmZ1c2VDb2xvci5hICk7XFxuXFx0I2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxlbmNvZGluZ3NfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGZvZ19mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8cHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8ZGl0aGVyaW5nX2ZyYWdtZW50Plxcbn1cXG5cIjtcblxudmFyIG1lc2hwaG9uZ192ZXJ0ID0gXCIjZGVmaW5lIFBIT05HXFxudmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XFxuI2lmbmRlZiBGTEFUX1NIQURFRFxcblxcdHZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xcbiNlbmRpZlxcbiNpbmNsdWRlIDxjb21tb24+XFxuI2luY2x1ZGUgPHV2X3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDx1djJfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8ZW52bWFwX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxjb2xvcl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8Zm9nX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD5cXG52b2lkIG1haW4oKSB7XFxuXFx0I2luY2x1ZGUgPHV2X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8dXYyX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8Y29sb3JfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxiZWdpbm5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPG1vcnBobm9ybWFsX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8ZGVmYXVsdG5vcm1hbF92ZXJ0ZXg+XFxuI2lmbmRlZiBGTEFUX1NIQURFRFxcblxcdHZOb3JtYWwgPSBub3JtYWxpemUoIHRyYW5zZm9ybWVkTm9ybWFsICk7XFxuI2VuZGlmXFxuXFx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+XFxuXFx0dlZpZXdQb3NpdGlvbiA9IC0gbXZQb3NpdGlvbi54eXo7XFxuXFx0I2luY2x1ZGUgPHdvcmxkcG9zX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8ZW52bWFwX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2hhZG93bWFwX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8Zm9nX3ZlcnRleD5cXG59XFxuXCI7XG5cbnZhciBtZXNocGh5c2ljYWxfZnJhZyA9IFwiI2RlZmluZSBQSFlTSUNBTFxcbnVuaWZvcm0gdmVjMyBkaWZmdXNlO1xcbnVuaWZvcm0gdmVjMyBlbWlzc2l2ZTtcXG51bmlmb3JtIGZsb2F0IHJvdWdobmVzcztcXG51bmlmb3JtIGZsb2F0IG1ldGFsbmVzcztcXG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XFxuI2lmbmRlZiBTVEFOREFSRFxcblxcdHVuaWZvcm0gZmxvYXQgY2xlYXJDb2F0O1xcblxcdHVuaWZvcm0gZmxvYXQgY2xlYXJDb2F0Um91Z2huZXNzO1xcbiNlbmRpZlxcbnZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xcbiNpZm5kZWYgRkxBVF9TSEFERURcXG5cXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcXG4jZW5kaWZcXG4jaW5jbHVkZSA8Y29tbW9uPlxcbiNpbmNsdWRlIDxwYWNraW5nPlxcbiNpbmNsdWRlIDxkaXRoZXJpbmdfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8Y29sb3JfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8dXZfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8dXYyX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPG1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxhbHBoYW1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxhb21hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxsaWdodG1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxlbWlzc2l2ZW1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxlbnZtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGJzZGZzPlxcbiNpbmNsdWRlIDxjdWJlX3V2X3JlZmxlY3Rpb25fZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGxpZ2h0c19wYXJzPlxcbiNpbmNsdWRlIDxsaWdodHNfcGh5c2ljYWxfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGJ1bXBtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bm9ybWFsbWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHJvdWdobmVzc21hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxtZXRhbG5lc3NtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+XFxudm9pZCBtYWluKCkge1xcblxcdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+XFxuXFx0dmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7XFxuXFx0UmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgPSBSZWZsZWN0ZWRMaWdodCggdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICkgKTtcXG5cXHR2ZWMzIHRvdGFsRW1pc3NpdmVSYWRpYW5jZSA9IGVtaXNzaXZlO1xcblxcdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8bWFwX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxjb2xvcl9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8YWxwaGFtYXBfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGFscGhhdGVzdF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8c3BlY3VsYXJtYXBfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPHJvdWdobmVzc21hcF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8bWV0YWxuZXNzbWFwX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxub3JtYWxfZmxpcD5cXG5cXHQjaW5jbHVkZSA8bm9ybWFsX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxlbWlzc2l2ZW1hcF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8bGlnaHRzX3BoeXNpY2FsX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxsaWdodHNfdGVtcGxhdGU+XFxuXFx0I2luY2x1ZGUgPGFvbWFwX2ZyYWdtZW50PlxcblxcdHZlYzMgb3V0Z29pbmdMaWdodCA9IHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKyByZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArIHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0U3BlY3VsYXIgKyB0b3RhbEVtaXNzaXZlUmFkaWFuY2U7XFxuXFx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggb3V0Z29pbmdMaWdodCwgZGlmZnVzZUNvbG9yLmEgKTtcXG5cXHQjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGVuY29kaW5nc19mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8Zm9nX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxkaXRoZXJpbmdfZnJhZ21lbnQ+XFxufVxcblwiO1xuXG52YXIgbWVzaHBoeXNpY2FsX3ZlcnQgPSBcIiNkZWZpbmUgUEhZU0lDQUxcXG52YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcXG4jaWZuZGVmIEZMQVRfU0hBREVEXFxuXFx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XFxuI2VuZGlmXFxuI2luY2x1ZGUgPGNvbW1vbj5cXG4jaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPHV2Ml9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxjb2xvcl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8Zm9nX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8c3BlY3VsYXJtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD5cXG52b2lkIG1haW4oKSB7XFxuXFx0I2luY2x1ZGUgPHV2X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8dXYyX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8Y29sb3JfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxiZWdpbm5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPG1vcnBobm9ybWFsX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8ZGVmYXVsdG5vcm1hbF92ZXJ0ZXg+XFxuI2lmbmRlZiBGTEFUX1NIQURFRFxcblxcdHZOb3JtYWwgPSBub3JtYWxpemUoIHRyYW5zZm9ybWVkTm9ybWFsICk7XFxuI2VuZGlmXFxuXFx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+XFxuXFx0dlZpZXdQb3NpdGlvbiA9IC0gbXZQb3NpdGlvbi54eXo7XFxuXFx0I2luY2x1ZGUgPHdvcmxkcG9zX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2hhZG93bWFwX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8Zm9nX3ZlcnRleD5cXG59XFxuXCI7XG5cbnZhciBub3JtYWxfZnJhZyA9IFwiI2RlZmluZSBOT1JNQUxcXG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XFxuI2lmIGRlZmluZWQoIEZMQVRfU0hBREVEICkgfHwgZGVmaW5lZCggVVNFX0JVTVBNQVAgKSB8fCBkZWZpbmVkKCBVU0VfTk9STUFMTUFQIClcXG5cXHR2YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcXG4jZW5kaWZcXG4jaWZuZGVmIEZMQVRfU0hBREVEXFxuXFx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XFxuI2VuZGlmXFxuI2luY2x1ZGUgPHBhY2tpbmc+XFxuI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGJ1bXBtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bm9ybWFsbWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+XFxudm9pZCBtYWluKCkge1xcblxcdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8bm9ybWFsX2ZsaXA+XFxuXFx0I2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudD5cXG5cXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KCBwYWNrTm9ybWFsVG9SR0IoIG5vcm1hbCApLCBvcGFjaXR5ICk7XFxufVxcblwiO1xuXG52YXIgbm9ybWFsX3ZlcnQgPSBcIiNkZWZpbmUgTk9STUFMXFxuI2lmIGRlZmluZWQoIEZMQVRfU0hBREVEICkgfHwgZGVmaW5lZCggVVNFX0JVTVBNQVAgKSB8fCBkZWZpbmVkKCBVU0VfTk9STUFMTUFQIClcXG5cXHR2YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcXG4jZW5kaWZcXG4jaWZuZGVmIEZMQVRfU0hBREVEXFxuXFx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XFxuI2VuZGlmXFxuI2luY2x1ZGUgPHV2X3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxza2lubmluZ19wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg+XFxudm9pZCBtYWluKCkge1xcblxcdCNpbmNsdWRlIDx1dl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGJlZ2lubm9ybWFsX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bW9ycGhub3JtYWxfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2luYmFzZV92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNraW5ub3JtYWxfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxkZWZhdWx0bm9ybWFsX3ZlcnRleD5cXG4jaWZuZGVmIEZMQVRfU0hBREVEXFxuXFx0dk5vcm1hbCA9IG5vcm1hbGl6ZSggdHJhbnNmb3JtZWROb3JtYWwgKTtcXG4jZW5kaWZcXG5cXHQjaW5jbHVkZSA8YmVnaW5fdmVydGV4PlxcblxcdCNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxtb3JwaHRhcmdldF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNraW5uaW5nX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD5cXG4jaWYgZGVmaW5lZCggRkxBVF9TSEFERUQgKSB8fCBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFVTRV9OT1JNQUxNQVAgKVxcblxcdHZWaWV3UG9zaXRpb24gPSAtIG12UG9zaXRpb24ueHl6O1xcbiNlbmRpZlxcbn1cXG5cIjtcblxudmFyIHBvaW50c19mcmFnID0gXCJ1bmlmb3JtIHZlYzMgZGlmZnVzZTtcXG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XFxuI2luY2x1ZGUgPGNvbW1vbj5cXG4jaW5jbHVkZSA8cGFja2luZz5cXG4jaW5jbHVkZSA8Y29sb3JfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bWFwX3BhcnRpY2xlX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGZvZ19wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+XFxudm9pZCBtYWluKCkge1xcblxcdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+XFxuXFx0dmVjMyBvdXRnb2luZ0xpZ2h0ID0gdmVjMyggMC4wICk7XFxuXFx0dmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7XFxuXFx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxtYXBfcGFydGljbGVfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGNvbG9yX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+XFxuXFx0b3V0Z29pbmdMaWdodCA9IGRpZmZ1c2VDb2xvci5yZ2I7XFxuXFx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggb3V0Z29pbmdMaWdodCwgZGlmZnVzZUNvbG9yLmEgKTtcXG5cXHQjaW5jbHVkZSA8cHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGVuY29kaW5nc19mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8Zm9nX2ZyYWdtZW50Plxcbn1cXG5cIjtcblxudmFyIHBvaW50c192ZXJ0ID0gXCJ1bmlmb3JtIGZsb2F0IHNpemU7XFxudW5pZm9ybSBmbG9hdCBzY2FsZTtcXG4jaW5jbHVkZSA8Y29tbW9uPlxcbiNpbmNsdWRlIDxjb2xvcl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8Zm9nX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+XFxudm9pZCBtYWluKCkge1xcblxcdCNpbmNsdWRlIDxjb2xvcl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XFxuXFx0I2lmZGVmIFVTRV9TSVpFQVRURU5VQVRJT05cXG5cXHRcXHRnbF9Qb2ludFNpemUgPSBzaXplICogKCBzY2FsZSAvIC0gbXZQb3NpdGlvbi56ICk7XFxuXFx0I2Vsc2VcXG5cXHRcXHRnbF9Qb2ludFNpemUgPSBzaXplO1xcblxcdCNlbmRpZlxcblxcdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHdvcmxkcG9zX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2hhZG93bWFwX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8Zm9nX3ZlcnRleD5cXG59XFxuXCI7XG5cbnZhciBzaGFkb3dfZnJhZyA9IFwidW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xcbiNpbmNsdWRlIDxjb21tb24+XFxuI2luY2x1ZGUgPHBhY2tpbmc+XFxuI2luY2x1ZGUgPGJzZGZzPlxcbiNpbmNsdWRlIDxsaWdodHNfcGFycz5cXG4jaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHNoYWRvd21hc2tfcGFyc19mcmFnbWVudD5cXG52b2lkIG1haW4oKSB7XFxuXFx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggMC4wLCAwLjAsIDAuMCwgb3BhY2l0eSAqICggMS4wIC0gZ2V0U2hhZG93TWFzaygpICkgKTtcXG59XFxuXCI7XG5cbnZhciBzaGFkb3dfdmVydCA9IFwiI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX3ZlcnRleD5cXG52b2lkIG1haW4oKSB7XFxuXFx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHdvcmxkcG9zX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2hhZG93bWFwX3ZlcnRleD5cXG59XFxuXCI7XG5cbnZhciBTaGFkZXJDaHVuayA9IHtcblx0YWxwaGFtYXBfZnJhZ21lbnQ6IGFscGhhbWFwX2ZyYWdtZW50LFxuXHRhbHBoYW1hcF9wYXJzX2ZyYWdtZW50OiBhbHBoYW1hcF9wYXJzX2ZyYWdtZW50LFxuXHRhbHBoYXRlc3RfZnJhZ21lbnQ6IGFscGhhdGVzdF9mcmFnbWVudCxcblx0YW9tYXBfZnJhZ21lbnQ6IGFvbWFwX2ZyYWdtZW50LFxuXHRhb21hcF9wYXJzX2ZyYWdtZW50OiBhb21hcF9wYXJzX2ZyYWdtZW50LFxuXHRiZWdpbl92ZXJ0ZXg6IGJlZ2luX3ZlcnRleCxcblx0YmVnaW5ub3JtYWxfdmVydGV4OiBiZWdpbm5vcm1hbF92ZXJ0ZXgsXG5cdGJzZGZzOiBic2Rmcyxcblx0YnVtcG1hcF9wYXJzX2ZyYWdtZW50OiBidW1wbWFwX3BhcnNfZnJhZ21lbnQsXG5cdGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudDogY2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50LFxuXHRjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudDogY2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQsXG5cdGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleDogY2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4LFxuXHRjbGlwcGluZ19wbGFuZXNfdmVydGV4OiBjbGlwcGluZ19wbGFuZXNfdmVydGV4LFxuXHRjb2xvcl9mcmFnbWVudDogY29sb3JfZnJhZ21lbnQsXG5cdGNvbG9yX3BhcnNfZnJhZ21lbnQ6IGNvbG9yX3BhcnNfZnJhZ21lbnQsXG5cdGNvbG9yX3BhcnNfdmVydGV4OiBjb2xvcl9wYXJzX3ZlcnRleCxcblx0Y29sb3JfdmVydGV4OiBjb2xvcl92ZXJ0ZXgsXG5cdGNvbW1vbjogY29tbW9uLFxuXHRjdWJlX3V2X3JlZmxlY3Rpb25fZnJhZ21lbnQ6IGN1YmVfdXZfcmVmbGVjdGlvbl9mcmFnbWVudCxcblx0ZGVmYXVsdG5vcm1hbF92ZXJ0ZXg6IGRlZmF1bHRub3JtYWxfdmVydGV4LFxuXHRkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXg6IGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleCxcblx0ZGlzcGxhY2VtZW50bWFwX3ZlcnRleDogZGlzcGxhY2VtZW50bWFwX3ZlcnRleCxcblx0ZW1pc3NpdmVtYXBfZnJhZ21lbnQ6IGVtaXNzaXZlbWFwX2ZyYWdtZW50LFxuXHRlbWlzc2l2ZW1hcF9wYXJzX2ZyYWdtZW50OiBlbWlzc2l2ZW1hcF9wYXJzX2ZyYWdtZW50LFxuXHRlbmNvZGluZ3NfZnJhZ21lbnQ6IGVuY29kaW5nc19mcmFnbWVudCxcblx0ZW5jb2RpbmdzX3BhcnNfZnJhZ21lbnQ6IGVuY29kaW5nc19wYXJzX2ZyYWdtZW50LFxuXHRlbnZtYXBfZnJhZ21lbnQ6IGVudm1hcF9mcmFnbWVudCxcblx0ZW52bWFwX3BhcnNfZnJhZ21lbnQ6IGVudm1hcF9wYXJzX2ZyYWdtZW50LFxuXHRlbnZtYXBfcGFyc192ZXJ0ZXg6IGVudm1hcF9wYXJzX3ZlcnRleCxcblx0ZW52bWFwX3ZlcnRleDogZW52bWFwX3ZlcnRleCxcblx0Zm9nX3ZlcnRleDogZm9nX3ZlcnRleCxcblx0Zm9nX3BhcnNfdmVydGV4OiBmb2dfcGFyc192ZXJ0ZXgsXG5cdGZvZ19mcmFnbWVudDogZm9nX2ZyYWdtZW50LFxuXHRmb2dfcGFyc19mcmFnbWVudDogZm9nX3BhcnNfZnJhZ21lbnQsXG5cdGdyYWRpZW50bWFwX3BhcnNfZnJhZ21lbnQ6IGdyYWRpZW50bWFwX3BhcnNfZnJhZ21lbnQsXG5cdGxpZ2h0bWFwX2ZyYWdtZW50OiBsaWdodG1hcF9mcmFnbWVudCxcblx0bGlnaHRtYXBfcGFyc19mcmFnbWVudDogbGlnaHRtYXBfcGFyc19mcmFnbWVudCxcblx0bGlnaHRzX2xhbWJlcnRfdmVydGV4OiBsaWdodHNfbGFtYmVydF92ZXJ0ZXgsXG5cdGxpZ2h0c19wYXJzOiBsaWdodHNfcGFycyxcblx0bGlnaHRzX3Bob25nX2ZyYWdtZW50OiBsaWdodHNfcGhvbmdfZnJhZ21lbnQsXG5cdGxpZ2h0c19waG9uZ19wYXJzX2ZyYWdtZW50OiBsaWdodHNfcGhvbmdfcGFyc19mcmFnbWVudCxcblx0bGlnaHRzX3BoeXNpY2FsX2ZyYWdtZW50OiBsaWdodHNfcGh5c2ljYWxfZnJhZ21lbnQsXG5cdGxpZ2h0c19waHlzaWNhbF9wYXJzX2ZyYWdtZW50OiBsaWdodHNfcGh5c2ljYWxfcGFyc19mcmFnbWVudCxcblx0bGlnaHRzX3RlbXBsYXRlOiBsaWdodHNfdGVtcGxhdGUsXG5cdGxvZ2RlcHRoYnVmX2ZyYWdtZW50OiBsb2dkZXB0aGJ1Zl9mcmFnbWVudCxcblx0bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudDogbG9nZGVwdGhidWZfcGFyc19mcmFnbWVudCxcblx0bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg6IGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4LFxuXHRsb2dkZXB0aGJ1Zl92ZXJ0ZXg6IGxvZ2RlcHRoYnVmX3ZlcnRleCxcblx0bWFwX2ZyYWdtZW50OiBtYXBfZnJhZ21lbnQsXG5cdG1hcF9wYXJzX2ZyYWdtZW50OiBtYXBfcGFyc19mcmFnbWVudCxcblx0bWFwX3BhcnRpY2xlX2ZyYWdtZW50OiBtYXBfcGFydGljbGVfZnJhZ21lbnQsXG5cdG1hcF9wYXJ0aWNsZV9wYXJzX2ZyYWdtZW50OiBtYXBfcGFydGljbGVfcGFyc19mcmFnbWVudCxcblx0bWV0YWxuZXNzbWFwX2ZyYWdtZW50OiBtZXRhbG5lc3NtYXBfZnJhZ21lbnQsXG5cdG1ldGFsbmVzc21hcF9wYXJzX2ZyYWdtZW50OiBtZXRhbG5lc3NtYXBfcGFyc19mcmFnbWVudCxcblx0bW9ycGhub3JtYWxfdmVydGV4OiBtb3JwaG5vcm1hbF92ZXJ0ZXgsXG5cdG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4OiBtb3JwaHRhcmdldF9wYXJzX3ZlcnRleCxcblx0bW9ycGh0YXJnZXRfdmVydGV4OiBtb3JwaHRhcmdldF92ZXJ0ZXgsXG5cdG5vcm1hbF9mbGlwOiBub3JtYWxfZmxpcCxcblx0bm9ybWFsX2ZyYWdtZW50OiBub3JtYWxfZnJhZ21lbnQsXG5cdG5vcm1hbG1hcF9wYXJzX2ZyYWdtZW50OiBub3JtYWxtYXBfcGFyc19mcmFnbWVudCxcblx0cGFja2luZzogcGFja2luZyxcblx0cHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudDogcHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudCxcblx0cHJvamVjdF92ZXJ0ZXg6IHByb2plY3RfdmVydGV4LFxuXHRkaXRoZXJpbmdfZnJhZ21lbnQ6IGRpdGhlcmluZ19mcmFnbWVudCxcblx0ZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnQ6IGRpdGhlcmluZ19wYXJzX2ZyYWdtZW50LFxuXHRyb3VnaG5lc3NtYXBfZnJhZ21lbnQ6IHJvdWdobmVzc21hcF9mcmFnbWVudCxcblx0cm91Z2huZXNzbWFwX3BhcnNfZnJhZ21lbnQ6IHJvdWdobmVzc21hcF9wYXJzX2ZyYWdtZW50LFxuXHRzaGFkb3dtYXBfcGFyc19mcmFnbWVudDogc2hhZG93bWFwX3BhcnNfZnJhZ21lbnQsXG5cdHNoYWRvd21hcF9wYXJzX3ZlcnRleDogc2hhZG93bWFwX3BhcnNfdmVydGV4LFxuXHRzaGFkb3dtYXBfdmVydGV4OiBzaGFkb3dtYXBfdmVydGV4LFxuXHRzaGFkb3dtYXNrX3BhcnNfZnJhZ21lbnQ6IHNoYWRvd21hc2tfcGFyc19mcmFnbWVudCxcblx0c2tpbmJhc2VfdmVydGV4OiBza2luYmFzZV92ZXJ0ZXgsXG5cdHNraW5uaW5nX3BhcnNfdmVydGV4OiBza2lubmluZ19wYXJzX3ZlcnRleCxcblx0c2tpbm5pbmdfdmVydGV4OiBza2lubmluZ192ZXJ0ZXgsXG5cdHNraW5ub3JtYWxfdmVydGV4OiBza2lubm9ybWFsX3ZlcnRleCxcblx0c3BlY3VsYXJtYXBfZnJhZ21lbnQ6IHNwZWN1bGFybWFwX2ZyYWdtZW50LFxuXHRzcGVjdWxhcm1hcF9wYXJzX2ZyYWdtZW50OiBzcGVjdWxhcm1hcF9wYXJzX2ZyYWdtZW50LFxuXHR0b25lbWFwcGluZ19mcmFnbWVudDogdG9uZW1hcHBpbmdfZnJhZ21lbnQsXG5cdHRvbmVtYXBwaW5nX3BhcnNfZnJhZ21lbnQ6IHRvbmVtYXBwaW5nX3BhcnNfZnJhZ21lbnQsXG5cdHV2X3BhcnNfZnJhZ21lbnQ6IHV2X3BhcnNfZnJhZ21lbnQsXG5cdHV2X3BhcnNfdmVydGV4OiB1dl9wYXJzX3ZlcnRleCxcblx0dXZfdmVydGV4OiB1dl92ZXJ0ZXgsXG5cdHV2Ml9wYXJzX2ZyYWdtZW50OiB1djJfcGFyc19mcmFnbWVudCxcblx0dXYyX3BhcnNfdmVydGV4OiB1djJfcGFyc192ZXJ0ZXgsXG5cdHV2Ml92ZXJ0ZXg6IHV2Ml92ZXJ0ZXgsXG5cdHdvcmxkcG9zX3ZlcnRleDogd29ybGRwb3NfdmVydGV4LFxuXG5cdGN1YmVfZnJhZzogY3ViZV9mcmFnLFxuXHRjdWJlX3ZlcnQ6IGN1YmVfdmVydCxcblx0ZGVwdGhfZnJhZzogZGVwdGhfZnJhZyxcblx0ZGVwdGhfdmVydDogZGVwdGhfdmVydCxcblx0ZGlzdGFuY2VSR0JBX2ZyYWc6IGRpc3RhbmNlUkdCQV9mcmFnLFxuXHRkaXN0YW5jZVJHQkFfdmVydDogZGlzdGFuY2VSR0JBX3ZlcnQsXG5cdGVxdWlyZWN0X2ZyYWc6IGVxdWlyZWN0X2ZyYWcsXG5cdGVxdWlyZWN0X3ZlcnQ6IGVxdWlyZWN0X3ZlcnQsXG5cdGxpbmVkYXNoZWRfZnJhZzogbGluZWRhc2hlZF9mcmFnLFxuXHRsaW5lZGFzaGVkX3ZlcnQ6IGxpbmVkYXNoZWRfdmVydCxcblx0bWVzaGJhc2ljX2ZyYWc6IG1lc2hiYXNpY19mcmFnLFxuXHRtZXNoYmFzaWNfdmVydDogbWVzaGJhc2ljX3ZlcnQsXG5cdG1lc2hsYW1iZXJ0X2ZyYWc6IG1lc2hsYW1iZXJ0X2ZyYWcsXG5cdG1lc2hsYW1iZXJ0X3ZlcnQ6IG1lc2hsYW1iZXJ0X3ZlcnQsXG5cdG1lc2hwaG9uZ19mcmFnOiBtZXNocGhvbmdfZnJhZyxcblx0bWVzaHBob25nX3ZlcnQ6IG1lc2hwaG9uZ192ZXJ0LFxuXHRtZXNocGh5c2ljYWxfZnJhZzogbWVzaHBoeXNpY2FsX2ZyYWcsXG5cdG1lc2hwaHlzaWNhbF92ZXJ0OiBtZXNocGh5c2ljYWxfdmVydCxcblx0bm9ybWFsX2ZyYWc6IG5vcm1hbF9mcmFnLFxuXHRub3JtYWxfdmVydDogbm9ybWFsX3ZlcnQsXG5cdHBvaW50c19mcmFnOiBwb2ludHNfZnJhZyxcblx0cG9pbnRzX3ZlcnQ6IHBvaW50c192ZXJ0LFxuXHRzaGFkb3dfZnJhZzogc2hhZG93X2ZyYWcsXG5cdHNoYWRvd192ZXJ0OiBzaGFkb3dfdmVydFxufTtcblxuLyoqXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgbWlrYWVsIGVtdGluZ2VyIC8gaHR0cDovL2dvbW8uc2UvXG4gKi9cblxudmFyIFNoYWRlckxpYiA9IHtcblxuXHRiYXNpYzoge1xuXG5cdFx0dW5pZm9ybXM6IFVuaWZvcm1zVXRpbHMubWVyZ2UoIFtcblx0XHRcdFVuaWZvcm1zTGliLmNvbW1vbixcblx0XHRcdFVuaWZvcm1zTGliLmFvbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIubGlnaHRtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5mb2dcblx0XHRdICksXG5cblx0XHR2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLm1lc2hiYXNpY192ZXJ0LFxuXHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5tZXNoYmFzaWNfZnJhZ1xuXG5cdH0sXG5cblx0bGFtYmVydDoge1xuXG5cdFx0dW5pZm9ybXM6IFVuaWZvcm1zVXRpbHMubWVyZ2UoIFtcblx0XHRcdFVuaWZvcm1zTGliLmNvbW1vbixcblx0XHRcdFVuaWZvcm1zTGliLmFvbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIubGlnaHRtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5lbWlzc2l2ZW1hcCxcblx0XHRcdFVuaWZvcm1zTGliLmZvZyxcblx0XHRcdFVuaWZvcm1zTGliLmxpZ2h0cyxcblx0XHRcdHtcblx0XHRcdFx0ZW1pc3NpdmU6IHsgdmFsdWU6IG5ldyBDb2xvciggMHgwMDAwMDAgKSB9XG5cdFx0XHR9XG5cdFx0XSApLFxuXG5cdFx0dmVydGV4U2hhZGVyOiBTaGFkZXJDaHVuay5tZXNobGFtYmVydF92ZXJ0LFxuXHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5tZXNobGFtYmVydF9mcmFnXG5cblx0fSxcblxuXHRwaG9uZzoge1xuXG5cdFx0dW5pZm9ybXM6IFVuaWZvcm1zVXRpbHMubWVyZ2UoIFtcblx0XHRcdFVuaWZvcm1zTGliLmNvbW1vbixcblx0XHRcdFVuaWZvcm1zTGliLmFvbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIubGlnaHRtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5lbWlzc2l2ZW1hcCxcblx0XHRcdFVuaWZvcm1zTGliLmJ1bXBtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5ub3JtYWxtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5kaXNwbGFjZW1lbnRtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5ncmFkaWVudG1hcCxcblx0XHRcdFVuaWZvcm1zTGliLmZvZyxcblx0XHRcdFVuaWZvcm1zTGliLmxpZ2h0cyxcblx0XHRcdHtcblx0XHRcdFx0ZW1pc3NpdmU6IHsgdmFsdWU6IG5ldyBDb2xvciggMHgwMDAwMDAgKSB9LFxuXHRcdFx0XHRzcGVjdWxhcjogeyB2YWx1ZTogbmV3IENvbG9yKCAweDExMTExMSApIH0sXG5cdFx0XHRcdHNoaW5pbmVzczogeyB2YWx1ZTogMzAgfVxuXHRcdFx0fVxuXHRcdF0gKSxcblxuXHRcdHZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsubWVzaHBob25nX3ZlcnQsXG5cdFx0ZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLm1lc2hwaG9uZ19mcmFnXG5cblx0fSxcblxuXHRzdGFuZGFyZDoge1xuXG5cdFx0dW5pZm9ybXM6IFVuaWZvcm1zVXRpbHMubWVyZ2UoIFtcblx0XHRcdFVuaWZvcm1zTGliLmNvbW1vbixcblx0XHRcdFVuaWZvcm1zTGliLmFvbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIubGlnaHRtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5lbWlzc2l2ZW1hcCxcblx0XHRcdFVuaWZvcm1zTGliLmJ1bXBtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5ub3JtYWxtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5kaXNwbGFjZW1lbnRtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5yb3VnaG5lc3NtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5tZXRhbG5lc3NtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5mb2csXG5cdFx0XHRVbmlmb3Jtc0xpYi5saWdodHMsXG5cdFx0XHR7XG5cdFx0XHRcdGVtaXNzaXZlOiB7IHZhbHVlOiBuZXcgQ29sb3IoIDB4MDAwMDAwICkgfSxcblx0XHRcdFx0cm91Z2huZXNzOiB7IHZhbHVlOiAwLjUgfSxcblx0XHRcdFx0bWV0YWxuZXNzOiB7IHZhbHVlOiAwLjUgfSxcblx0XHRcdFx0ZW52TWFwSW50ZW5zaXR5OiB7IHZhbHVlOiAxIH0gLy8gdGVtcG9yYXJ5XG5cdFx0XHR9XG5cdFx0XSApLFxuXG5cdFx0dmVydGV4U2hhZGVyOiBTaGFkZXJDaHVuay5tZXNocGh5c2ljYWxfdmVydCxcblx0XHRmcmFnbWVudFNoYWRlcjogU2hhZGVyQ2h1bmsubWVzaHBoeXNpY2FsX2ZyYWdcblxuXHR9LFxuXG5cdHBvaW50czoge1xuXG5cdFx0dW5pZm9ybXM6IFVuaWZvcm1zVXRpbHMubWVyZ2UoIFtcblx0XHRcdFVuaWZvcm1zTGliLnBvaW50cyxcblx0XHRcdFVuaWZvcm1zTGliLmZvZ1xuXHRcdF0gKSxcblxuXHRcdHZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsucG9pbnRzX3ZlcnQsXG5cdFx0ZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLnBvaW50c19mcmFnXG5cblx0fSxcblxuXHRkYXNoZWQ6IHtcblxuXHRcdHVuaWZvcm1zOiBVbmlmb3Jtc1V0aWxzLm1lcmdlKCBbXG5cdFx0XHRVbmlmb3Jtc0xpYi5jb21tb24sXG5cdFx0XHRVbmlmb3Jtc0xpYi5mb2csXG5cdFx0XHR7XG5cdFx0XHRcdHNjYWxlOiB7IHZhbHVlOiAxIH0sXG5cdFx0XHRcdGRhc2hTaXplOiB7IHZhbHVlOiAxIH0sXG5cdFx0XHRcdHRvdGFsU2l6ZTogeyB2YWx1ZTogMiB9XG5cdFx0XHR9XG5cdFx0XSApLFxuXG5cdFx0dmVydGV4U2hhZGVyOiBTaGFkZXJDaHVuay5saW5lZGFzaGVkX3ZlcnQsXG5cdFx0ZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLmxpbmVkYXNoZWRfZnJhZ1xuXG5cdH0sXG5cblx0ZGVwdGg6IHtcblxuXHRcdHVuaWZvcm1zOiBVbmlmb3Jtc1V0aWxzLm1lcmdlKCBbXG5cdFx0XHRVbmlmb3Jtc0xpYi5jb21tb24sXG5cdFx0XHRVbmlmb3Jtc0xpYi5kaXNwbGFjZW1lbnRtYXBcblx0XHRdICksXG5cblx0XHR2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLmRlcHRoX3ZlcnQsXG5cdFx0ZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLmRlcHRoX2ZyYWdcblxuXHR9LFxuXG5cdG5vcm1hbDoge1xuXG5cdFx0dW5pZm9ybXM6IFVuaWZvcm1zVXRpbHMubWVyZ2UoIFtcblx0XHRcdFVuaWZvcm1zTGliLmNvbW1vbixcblx0XHRcdFVuaWZvcm1zTGliLmJ1bXBtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5ub3JtYWxtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5kaXNwbGFjZW1lbnRtYXAsXG5cdFx0XHR7XG5cdFx0XHRcdG9wYWNpdHk6IHsgdmFsdWU6IDEuMCB9XG5cdFx0XHR9XG5cdFx0XSApLFxuXG5cdFx0dmVydGV4U2hhZGVyOiBTaGFkZXJDaHVuay5ub3JtYWxfdmVydCxcblx0XHRmcmFnbWVudFNoYWRlcjogU2hhZGVyQ2h1bmsubm9ybWFsX2ZyYWdcblxuXHR9LFxuXG5cdC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0Ly9cdEN1YmUgbWFwIHNoYWRlclxuXHQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5cdGN1YmU6IHtcblxuXHRcdHVuaWZvcm1zOiB7XG5cdFx0XHR0Q3ViZTogeyB2YWx1ZTogbnVsbCB9LFxuXHRcdFx0dEZsaXA6IHsgdmFsdWU6IC0gMSB9LFxuXHRcdFx0b3BhY2l0eTogeyB2YWx1ZTogMS4wIH1cblx0XHR9LFxuXG5cdFx0dmVydGV4U2hhZGVyOiBTaGFkZXJDaHVuay5jdWJlX3ZlcnQsXG5cdFx0ZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLmN1YmVfZnJhZ1xuXG5cdH0sXG5cblx0LyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXHQvL1x0Q3ViZSBtYXAgc2hhZGVyXG5cdCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cblx0ZXF1aXJlY3Q6IHtcblxuXHRcdHVuaWZvcm1zOiB7XG5cdFx0XHR0RXF1aXJlY3Q6IHsgdmFsdWU6IG51bGwgfSxcblx0XHRcdHRGbGlwOiB7IHZhbHVlOiAtIDEgfVxuXHRcdH0sXG5cblx0XHR2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLmVxdWlyZWN0X3ZlcnQsXG5cdFx0ZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLmVxdWlyZWN0X2ZyYWdcblxuXHR9LFxuXG5cdGRpc3RhbmNlUkdCQToge1xuXG5cdFx0dW5pZm9ybXM6IHtcblx0XHRcdGxpZ2h0UG9zOiB7IHZhbHVlOiBuZXcgVmVjdG9yMygpIH1cblx0XHR9LFxuXG5cdFx0dmVydGV4U2hhZGVyOiBTaGFkZXJDaHVuay5kaXN0YW5jZVJHQkFfdmVydCxcblx0XHRmcmFnbWVudFNoYWRlcjogU2hhZGVyQ2h1bmsuZGlzdGFuY2VSR0JBX2ZyYWdcblxuXHR9XG5cbn07XG5cblNoYWRlckxpYi5waHlzaWNhbCA9IHtcblxuXHR1bmlmb3JtczogVW5pZm9ybXNVdGlscy5tZXJnZSggW1xuXHRcdFNoYWRlckxpYi5zdGFuZGFyZC51bmlmb3Jtcyxcblx0XHR7XG5cdFx0XHRjbGVhckNvYXQ6IHsgdmFsdWU6IDAgfSxcblx0XHRcdGNsZWFyQ29hdFJvdWdobmVzczogeyB2YWx1ZTogMCB9XG5cdFx0fVxuXHRdICksXG5cblx0dmVydGV4U2hhZGVyOiBTaGFkZXJDaHVuay5tZXNocGh5c2ljYWxfdmVydCxcblx0ZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLm1lc2hwaHlzaWNhbF9mcmFnXG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pb1xuICovXG5cbmZ1bmN0aW9uIEJveDIoIG1pbiwgbWF4ICkge1xuXG5cdHRoaXMubWluID0gKCBtaW4gIT09IHVuZGVmaW5lZCApID8gbWluIDogbmV3IFZlY3RvcjIoICsgSW5maW5pdHksICsgSW5maW5pdHkgKTtcblx0dGhpcy5tYXggPSAoIG1heCAhPT0gdW5kZWZpbmVkICkgPyBtYXggOiBuZXcgVmVjdG9yMiggLSBJbmZpbml0eSwgLSBJbmZpbml0eSApO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIEJveDIucHJvdG90eXBlLCB7XG5cblx0c2V0OiBmdW5jdGlvbiAoIG1pbiwgbWF4ICkge1xuXG5cdFx0dGhpcy5taW4uY29weSggbWluICk7XG5cdFx0dGhpcy5tYXguY29weSggbWF4ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21Qb2ludHM6IGZ1bmN0aW9uICggcG9pbnRzICkge1xuXG5cdFx0dGhpcy5tYWtlRW1wdHkoKTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBwb2ludHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHRoaXMuZXhwYW5kQnlQb2ludCggcG9pbnRzWyBpIF0gKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbUNlbnRlckFuZFNpemU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IyKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gc2V0RnJvbUNlbnRlckFuZFNpemUoIGNlbnRlciwgc2l6ZSApIHtcblxuXHRcdFx0dmFyIGhhbGZTaXplID0gdjEuY29weSggc2l6ZSApLm11bHRpcGx5U2NhbGFyKCAwLjUgKTtcblx0XHRcdHRoaXMubWluLmNvcHkoIGNlbnRlciApLnN1YiggaGFsZlNpemUgKTtcblx0XHRcdHRoaXMubWF4LmNvcHkoIGNlbnRlciApLmFkZCggaGFsZlNpemUgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBib3ggKSB7XG5cblx0XHR0aGlzLm1pbi5jb3B5KCBib3gubWluICk7XG5cdFx0dGhpcy5tYXguY29weSggYm94Lm1heCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRtYWtlRW1wdHk6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMubWluLnggPSB0aGlzLm1pbi55ID0gKyBJbmZpbml0eTtcblx0XHR0aGlzLm1heC54ID0gdGhpcy5tYXgueSA9IC0gSW5maW5pdHk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGlzRW1wdHk6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIHRoaXMgaXMgYSBtb3JlIHJvYnVzdCBjaGVjayBmb3IgZW1wdHkgdGhhbiAoIHZvbHVtZSA8PSAwICkgYmVjYXVzZSB2b2x1bWUgY2FuIGdldCBwb3NpdGl2ZSB3aXRoIHR3byBuZWdhdGl2ZSBheGVzXG5cblx0XHRyZXR1cm4gKCB0aGlzLm1heC54IDwgdGhpcy5taW4ueCApIHx8ICggdGhpcy5tYXgueSA8IHRoaXMubWluLnkgKTtcblxuXHR9LFxuXG5cdGdldENlbnRlcjogZnVuY3Rpb24gKCBvcHRpb25hbFRhcmdldCApIHtcblxuXHRcdHZhciByZXN1bHQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMigpO1xuXHRcdHJldHVybiB0aGlzLmlzRW1wdHkoKSA/IHJlc3VsdC5zZXQoIDAsIDAgKSA6IHJlc3VsdC5hZGRWZWN0b3JzKCB0aGlzLm1pbiwgdGhpcy5tYXggKS5tdWx0aXBseVNjYWxhciggMC41ICk7XG5cblx0fSxcblxuXHRnZXRTaXplOiBmdW5jdGlvbiAoIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdFx0dmFyIHJlc3VsdCA9IG9wdGlvbmFsVGFyZ2V0IHx8IG5ldyBWZWN0b3IyKCk7XG5cdFx0cmV0dXJuIHRoaXMuaXNFbXB0eSgpID8gcmVzdWx0LnNldCggMCwgMCApIDogcmVzdWx0LnN1YlZlY3RvcnMoIHRoaXMubWF4LCB0aGlzLm1pbiApO1xuXG5cdH0sXG5cblx0ZXhwYW5kQnlQb2ludDogZnVuY3Rpb24gKCBwb2ludCApIHtcblxuXHRcdHRoaXMubWluLm1pbiggcG9pbnQgKTtcblx0XHR0aGlzLm1heC5tYXgoIHBvaW50ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGV4cGFuZEJ5VmVjdG9yOiBmdW5jdGlvbiAoIHZlY3RvciApIHtcblxuXHRcdHRoaXMubWluLnN1YiggdmVjdG9yICk7XG5cdFx0dGhpcy5tYXguYWRkKCB2ZWN0b3IgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZXhwYW5kQnlTY2FsYXI6IGZ1bmN0aW9uICggc2NhbGFyICkge1xuXG5cdFx0dGhpcy5taW4uYWRkU2NhbGFyKCAtIHNjYWxhciApO1xuXHRcdHRoaXMubWF4LmFkZFNjYWxhciggc2NhbGFyICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvbnRhaW5zUG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQgKSB7XG5cblx0XHRyZXR1cm4gcG9pbnQueCA8IHRoaXMubWluLnggfHwgcG9pbnQueCA+IHRoaXMubWF4LnggfHxcblx0XHRcdHBvaW50LnkgPCB0aGlzLm1pbi55IHx8IHBvaW50LnkgPiB0aGlzLm1heC55ID8gZmFsc2UgOiB0cnVlO1xuXG5cdH0sXG5cblx0Y29udGFpbnNCb3g6IGZ1bmN0aW9uICggYm94ICkge1xuXG5cdFx0cmV0dXJuIHRoaXMubWluLnggPD0gYm94Lm1pbi54ICYmIGJveC5tYXgueCA8PSB0aGlzLm1heC54ICYmXG5cdFx0XHR0aGlzLm1pbi55IDw9IGJveC5taW4ueSAmJiBib3gubWF4LnkgPD0gdGhpcy5tYXgueTtcblxuXHR9LFxuXG5cdGdldFBhcmFtZXRlcjogZnVuY3Rpb24gKCBwb2ludCwgb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0XHQvLyBUaGlzIGNhbiBwb3RlbnRpYWxseSBoYXZlIGEgZGl2aWRlIGJ5IHplcm8gaWYgdGhlIGJveFxuXHRcdC8vIGhhcyBhIHNpemUgZGltZW5zaW9uIG9mIDAuXG5cblx0XHR2YXIgcmVzdWx0ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IFZlY3RvcjIoKTtcblxuXHRcdHJldHVybiByZXN1bHQuc2V0KFxuXHRcdFx0KCBwb2ludC54IC0gdGhpcy5taW4ueCApIC8gKCB0aGlzLm1heC54IC0gdGhpcy5taW4ueCApLFxuXHRcdFx0KCBwb2ludC55IC0gdGhpcy5taW4ueSApIC8gKCB0aGlzLm1heC55IC0gdGhpcy5taW4ueSApXG5cdFx0KTtcblxuXHR9LFxuXG5cdGludGVyc2VjdHNCb3g6IGZ1bmN0aW9uICggYm94ICkge1xuXG5cdFx0Ly8gdXNpbmcgNCBzcGxpdHRpbmcgcGxhbmVzIHRvIHJ1bGUgb3V0IGludGVyc2VjdGlvbnNcblxuXHRcdHJldHVybiBib3gubWF4LnggPCB0aGlzLm1pbi54IHx8IGJveC5taW4ueCA+IHRoaXMubWF4LnggfHxcblx0XHRcdGJveC5tYXgueSA8IHRoaXMubWluLnkgfHwgYm94Lm1pbi55ID4gdGhpcy5tYXgueSA/IGZhbHNlIDogdHJ1ZTtcblxuXHR9LFxuXG5cdGNsYW1wUG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQsIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdFx0dmFyIHJlc3VsdCA9IG9wdGlvbmFsVGFyZ2V0IHx8IG5ldyBWZWN0b3IyKCk7XG5cdFx0cmV0dXJuIHJlc3VsdC5jb3B5KCBwb2ludCApLmNsYW1wKCB0aGlzLm1pbiwgdGhpcy5tYXggKTtcblxuXHR9LFxuXG5cdGRpc3RhbmNlVG9Qb2ludDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjIoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBkaXN0YW5jZVRvUG9pbnQoIHBvaW50ICkge1xuXG5cdFx0XHR2YXIgY2xhbXBlZFBvaW50ID0gdjEuY29weSggcG9pbnQgKS5jbGFtcCggdGhpcy5taW4sIHRoaXMubWF4ICk7XG5cdFx0XHRyZXR1cm4gY2xhbXBlZFBvaW50LnN1YiggcG9pbnQgKS5sZW5ndGgoKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGludGVyc2VjdDogZnVuY3Rpb24gKCBib3ggKSB7XG5cblx0XHR0aGlzLm1pbi5tYXgoIGJveC5taW4gKTtcblx0XHR0aGlzLm1heC5taW4oIGJveC5tYXggKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dW5pb246IGZ1bmN0aW9uICggYm94ICkge1xuXG5cdFx0dGhpcy5taW4ubWluKCBib3gubWluICk7XG5cdFx0dGhpcy5tYXgubWF4KCBib3gubWF4ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHRyYW5zbGF0ZTogZnVuY3Rpb24gKCBvZmZzZXQgKSB7XG5cblx0XHR0aGlzLm1pbi5hZGQoIG9mZnNldCApO1xuXHRcdHRoaXMubWF4LmFkZCggb2Zmc2V0ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGVxdWFsczogZnVuY3Rpb24gKCBib3ggKSB7XG5cblx0XHRyZXR1cm4gYm94Lm1pbi5lcXVhbHMoIHRoaXMubWluICkgJiYgYm94Lm1heC5lcXVhbHMoIHRoaXMubWF4ICk7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtaWthZWwgZW10aW5nZXIgLyBodHRwOi8vZ29tby5zZS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKi9cblxuZnVuY3Rpb24gTGVuc0ZsYXJlUGx1Z2luKCByZW5kZXJlciwgZmxhcmVzICkge1xuXG5cdHZhciBnbCA9IHJlbmRlcmVyLmNvbnRleHQ7XG5cdHZhciBzdGF0ZSA9IHJlbmRlcmVyLnN0YXRlO1xuXG5cdHZhciB2ZXJ0ZXhCdWZmZXIsIGVsZW1lbnRCdWZmZXI7XG5cdHZhciBzaGFkZXIsIHByb2dyYW0sIGF0dHJpYnV0ZXMsIHVuaWZvcm1zO1xuXG5cdHZhciB0ZW1wVGV4dHVyZSwgb2NjbHVzaW9uVGV4dHVyZTtcblxuXHRmdW5jdGlvbiBpbml0KCkge1xuXG5cdFx0dmFyIHZlcnRpY2VzID0gbmV3IEZsb2F0MzJBcnJheSggW1xuXHRcdFx0LSAxLCAtIDEsICAwLCAwLFxuXHRcdFx0IDEsIC0gMSwgIDEsIDAsXG5cdFx0XHQgMSwgIDEsICAxLCAxLFxuXHRcdFx0LSAxLCAgMSwgIDAsIDFcblx0XHRdICk7XG5cblx0XHR2YXIgZmFjZXMgPSBuZXcgVWludDE2QXJyYXkoIFtcblx0XHRcdDAsIDEsIDIsXG5cdFx0XHQwLCAyLCAzXG5cdFx0XSApO1xuXG5cdFx0Ly8gYnVmZmVyc1xuXG5cdFx0dmVydGV4QnVmZmVyICAgICA9IGdsLmNyZWF0ZUJ1ZmZlcigpO1xuXHRcdGVsZW1lbnRCdWZmZXIgICAgPSBnbC5jcmVhdGVCdWZmZXIoKTtcblxuXHRcdGdsLmJpbmRCdWZmZXIoIGdsLkFSUkFZX0JVRkZFUiwgdmVydGV4QnVmZmVyICk7XG5cdFx0Z2wuYnVmZmVyRGF0YSggZ2wuQVJSQVlfQlVGRkVSLCB2ZXJ0aWNlcywgZ2wuU1RBVElDX0RSQVcgKTtcblxuXHRcdGdsLmJpbmRCdWZmZXIoIGdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCBlbGVtZW50QnVmZmVyICk7XG5cdFx0Z2wuYnVmZmVyRGF0YSggZ2wuRUxFTUVOVF9BUlJBWV9CVUZGRVIsIGZhY2VzLCBnbC5TVEFUSUNfRFJBVyApO1xuXG5cdFx0Ly8gdGV4dHVyZXNcblxuXHRcdHRlbXBUZXh0dXJlICAgICAgPSBnbC5jcmVhdGVUZXh0dXJlKCk7XG5cdFx0b2NjbHVzaW9uVGV4dHVyZSA9IGdsLmNyZWF0ZVRleHR1cmUoKTtcblxuXHRcdHN0YXRlLmJpbmRUZXh0dXJlKCBnbC5URVhUVVJFXzJELCB0ZW1wVGV4dHVyZSApO1xuXHRcdGdsLnRleEltYWdlMkQoIGdsLlRFWFRVUkVfMkQsIDAsIGdsLlJHQiwgMTYsIDE2LCAwLCBnbC5SR0IsIGdsLlVOU0lHTkVEX0JZVEUsIG51bGwgKTtcblx0XHRnbC50ZXhQYXJhbWV0ZXJpKCBnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX1dSQVBfUywgZ2wuQ0xBTVBfVE9fRURHRSApO1xuXHRcdGdsLnRleFBhcmFtZXRlcmkoIGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9ULCBnbC5DTEFNUF9UT19FREdFICk7XG5cdFx0Z2wudGV4UGFyYW1ldGVyaSggZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9NQUdfRklMVEVSLCBnbC5ORUFSRVNUICk7XG5cdFx0Z2wudGV4UGFyYW1ldGVyaSggZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9NSU5fRklMVEVSLCBnbC5ORUFSRVNUICk7XG5cblx0XHRzdGF0ZS5iaW5kVGV4dHVyZSggZ2wuVEVYVFVSRV8yRCwgb2NjbHVzaW9uVGV4dHVyZSApO1xuXHRcdGdsLnRleEltYWdlMkQoIGdsLlRFWFRVUkVfMkQsIDAsIGdsLlJHQkEsIDE2LCAxNiwgMCwgZ2wuUkdCQSwgZ2wuVU5TSUdORURfQllURSwgbnVsbCApO1xuXHRcdGdsLnRleFBhcmFtZXRlcmkoIGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9TLCBnbC5DTEFNUF9UT19FREdFICk7XG5cdFx0Z2wudGV4UGFyYW1ldGVyaSggZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9XUkFQX1QsIGdsLkNMQU1QX1RPX0VER0UgKTtcblx0XHRnbC50ZXhQYXJhbWV0ZXJpKCBnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01BR19GSUxURVIsIGdsLk5FQVJFU1QgKTtcblx0XHRnbC50ZXhQYXJhbWV0ZXJpKCBnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01JTl9GSUxURVIsIGdsLk5FQVJFU1QgKTtcblxuXHRcdHNoYWRlciA9IHtcblxuXHRcdFx0dmVydGV4U2hhZGVyOiBbXG5cblx0XHRcdFx0XCJ1bmlmb3JtIGxvd3AgaW50IHJlbmRlclR5cGU7XCIsXG5cblx0XHRcdFx0XCJ1bmlmb3JtIHZlYzMgc2NyZWVuUG9zaXRpb247XCIsXG5cdFx0XHRcdFwidW5pZm9ybSB2ZWMyIHNjYWxlO1wiLFxuXHRcdFx0XHRcInVuaWZvcm0gZmxvYXQgcm90YXRpb247XCIsXG5cblx0XHRcdFx0XCJ1bmlmb3JtIHNhbXBsZXIyRCBvY2NsdXNpb25NYXA7XCIsXG5cblx0XHRcdFx0XCJhdHRyaWJ1dGUgdmVjMiBwb3NpdGlvbjtcIixcblx0XHRcdFx0XCJhdHRyaWJ1dGUgdmVjMiB1djtcIixcblxuXHRcdFx0XHRcInZhcnlpbmcgdmVjMiB2VVY7XCIsXG5cdFx0XHRcdFwidmFyeWluZyBmbG9hdCB2VmlzaWJpbGl0eTtcIixcblxuXHRcdFx0XHRcInZvaWQgbWFpbigpIHtcIixcblxuXHRcdFx0XHRcdFwidlVWID0gdXY7XCIsXG5cblx0XHRcdFx0XHRcInZlYzIgcG9zID0gcG9zaXRpb247XCIsXG5cblx0XHRcdFx0XHRcImlmICggcmVuZGVyVHlwZSA9PSAyICkge1wiLFxuXG5cdFx0XHRcdFx0XHRcInZlYzQgdmlzaWJpbGl0eSA9IHRleHR1cmUyRCggb2NjbHVzaW9uTWFwLCB2ZWMyKCAwLjEsIDAuMSApICk7XCIsXG5cdFx0XHRcdFx0XHRcInZpc2liaWxpdHkgKz0gdGV4dHVyZTJEKCBvY2NsdXNpb25NYXAsIHZlYzIoIDAuNSwgMC4xICkgKTtcIixcblx0XHRcdFx0XHRcdFwidmlzaWJpbGl0eSArPSB0ZXh0dXJlMkQoIG9jY2x1c2lvbk1hcCwgdmVjMiggMC45LCAwLjEgKSApO1wiLFxuXHRcdFx0XHRcdFx0XCJ2aXNpYmlsaXR5ICs9IHRleHR1cmUyRCggb2NjbHVzaW9uTWFwLCB2ZWMyKCAwLjksIDAuNSApICk7XCIsXG5cdFx0XHRcdFx0XHRcInZpc2liaWxpdHkgKz0gdGV4dHVyZTJEKCBvY2NsdXNpb25NYXAsIHZlYzIoIDAuOSwgMC45ICkgKTtcIixcblx0XHRcdFx0XHRcdFwidmlzaWJpbGl0eSArPSB0ZXh0dXJlMkQoIG9jY2x1c2lvbk1hcCwgdmVjMiggMC41LCAwLjkgKSApO1wiLFxuXHRcdFx0XHRcdFx0XCJ2aXNpYmlsaXR5ICs9IHRleHR1cmUyRCggb2NjbHVzaW9uTWFwLCB2ZWMyKCAwLjEsIDAuOSApICk7XCIsXG5cdFx0XHRcdFx0XHRcInZpc2liaWxpdHkgKz0gdGV4dHVyZTJEKCBvY2NsdXNpb25NYXAsIHZlYzIoIDAuMSwgMC41ICkgKTtcIixcblx0XHRcdFx0XHRcdFwidmlzaWJpbGl0eSArPSB0ZXh0dXJlMkQoIG9jY2x1c2lvbk1hcCwgdmVjMiggMC41LCAwLjUgKSApO1wiLFxuXG5cdFx0XHRcdFx0XHRcInZWaXNpYmlsaXR5ID0gICAgICAgIHZpc2liaWxpdHkuciAvIDkuMDtcIixcblx0XHRcdFx0XHRcdFwidlZpc2liaWxpdHkgKj0gMS4wIC0gdmlzaWJpbGl0eS5nIC8gOS4wO1wiLFxuXHRcdFx0XHRcdFx0XCJ2VmlzaWJpbGl0eSAqPSAgICAgICB2aXNpYmlsaXR5LmIgLyA5LjA7XCIsXG5cdFx0XHRcdFx0XHRcInZWaXNpYmlsaXR5ICo9IDEuMCAtIHZpc2liaWxpdHkuYSAvIDkuMDtcIixcblxuXHRcdFx0XHRcdFx0XCJwb3MueCA9IGNvcyggcm90YXRpb24gKSAqIHBvc2l0aW9uLnggLSBzaW4oIHJvdGF0aW9uICkgKiBwb3NpdGlvbi55O1wiLFxuXHRcdFx0XHRcdFx0XCJwb3MueSA9IHNpbiggcm90YXRpb24gKSAqIHBvc2l0aW9uLnggKyBjb3MoIHJvdGF0aW9uICkgKiBwb3NpdGlvbi55O1wiLFxuXG5cdFx0XHRcdFx0XCJ9XCIsXG5cblx0XHRcdFx0XHRcImdsX1Bvc2l0aW9uID0gdmVjNCggKCBwb3MgKiBzY2FsZSArIHNjcmVlblBvc2l0aW9uLnh5ICkueHksIHNjcmVlblBvc2l0aW9uLnosIDEuMCApO1wiLFxuXG5cdFx0XHRcdFwifVwiXG5cblx0XHRcdF0uam9pbiggXCJcXG5cIiApLFxuXG5cdFx0XHRmcmFnbWVudFNoYWRlcjogW1xuXG5cdFx0XHRcdFwidW5pZm9ybSBsb3dwIGludCByZW5kZXJUeXBlO1wiLFxuXG5cdFx0XHRcdFwidW5pZm9ybSBzYW1wbGVyMkQgbWFwO1wiLFxuXHRcdFx0XHRcInVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcIixcblx0XHRcdFx0XCJ1bmlmb3JtIHZlYzMgY29sb3I7XCIsXG5cblx0XHRcdFx0XCJ2YXJ5aW5nIHZlYzIgdlVWO1wiLFxuXHRcdFx0XHRcInZhcnlpbmcgZmxvYXQgdlZpc2liaWxpdHk7XCIsXG5cblx0XHRcdFx0XCJ2b2lkIG1haW4oKSB7XCIsXG5cblx0XHRcdFx0XHQvLyBwaW5rIHNxdWFyZVxuXG5cdFx0XHRcdFx0XCJpZiAoIHJlbmRlclR5cGUgPT0gMCApIHtcIixcblxuXHRcdFx0XHRcdFx0XCJnbF9GcmFnQ29sb3IgPSB2ZWM0KCAxLjAsIDAuMCwgMS4wLCAwLjAgKTtcIixcblxuXHRcdFx0XHRcdC8vIHJlc3RvcmVcblxuXHRcdFx0XHRcdFwifSBlbHNlIGlmICggcmVuZGVyVHlwZSA9PSAxICkge1wiLFxuXG5cdFx0XHRcdFx0XHRcImdsX0ZyYWdDb2xvciA9IHRleHR1cmUyRCggbWFwLCB2VVYgKTtcIixcblxuXHRcdFx0XHRcdC8vIGZsYXJlXG5cblx0XHRcdFx0XHRcIn0gZWxzZSB7XCIsXG5cblx0XHRcdFx0XHRcdFwidmVjNCB0ZXh0dXJlID0gdGV4dHVyZTJEKCBtYXAsIHZVViApO1wiLFxuXHRcdFx0XHRcdFx0XCJ0ZXh0dXJlLmEgKj0gb3BhY2l0eSAqIHZWaXNpYmlsaXR5O1wiLFxuXHRcdFx0XHRcdFx0XCJnbF9GcmFnQ29sb3IgPSB0ZXh0dXJlO1wiLFxuXHRcdFx0XHRcdFx0XCJnbF9GcmFnQ29sb3IucmdiICo9IGNvbG9yO1wiLFxuXG5cdFx0XHRcdFx0XCJ9XCIsXG5cblx0XHRcdFx0XCJ9XCJcblxuXHRcdFx0XS5qb2luKCBcIlxcblwiIClcblxuXHRcdH07XG5cblx0XHRwcm9ncmFtID0gY3JlYXRlUHJvZ3JhbSggc2hhZGVyICk7XG5cblx0XHRhdHRyaWJ1dGVzID0ge1xuXHRcdFx0dmVydGV4OiBnbC5nZXRBdHRyaWJMb2NhdGlvbiAoIHByb2dyYW0sIFwicG9zaXRpb25cIiApLFxuXHRcdFx0dXY6ICAgICBnbC5nZXRBdHRyaWJMb2NhdGlvbiAoIHByb2dyYW0sIFwidXZcIiApXG5cdFx0fTtcblxuXHRcdHVuaWZvcm1zID0ge1xuXHRcdFx0cmVuZGVyVHlwZTogICAgIGdsLmdldFVuaWZvcm1Mb2NhdGlvbiggcHJvZ3JhbSwgXCJyZW5kZXJUeXBlXCIgKSxcblx0XHRcdG1hcDogICAgICAgICAgICBnbC5nZXRVbmlmb3JtTG9jYXRpb24oIHByb2dyYW0sIFwibWFwXCIgKSxcblx0XHRcdG9jY2x1c2lvbk1hcDogICBnbC5nZXRVbmlmb3JtTG9jYXRpb24oIHByb2dyYW0sIFwib2NjbHVzaW9uTWFwXCIgKSxcblx0XHRcdG9wYWNpdHk6ICAgICAgICBnbC5nZXRVbmlmb3JtTG9jYXRpb24oIHByb2dyYW0sIFwib3BhY2l0eVwiICksXG5cdFx0XHRjb2xvcjogICAgICAgICAgZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCBcImNvbG9yXCIgKSxcblx0XHRcdHNjYWxlOiAgICAgICAgICBnbC5nZXRVbmlmb3JtTG9jYXRpb24oIHByb2dyYW0sIFwic2NhbGVcIiApLFxuXHRcdFx0cm90YXRpb246ICAgICAgIGdsLmdldFVuaWZvcm1Mb2NhdGlvbiggcHJvZ3JhbSwgXCJyb3RhdGlvblwiICksXG5cdFx0XHRzY3JlZW5Qb3NpdGlvbjogZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCBcInNjcmVlblBvc2l0aW9uXCIgKVxuXHRcdH07XG5cblx0fVxuXG5cdC8qXG5cdCAqIFJlbmRlciBsZW5zIGZsYXJlc1xuXHQgKiBNZXRob2Q6IHJlbmRlcnMgMTZ4MTYgMHhmZjAwZmYtY29sb3JlZCBwb2ludHMgc2NhdHRlcmVkIG92ZXIgdGhlIGxpZ2h0IHNvdXJjZSBhcmVhLFxuXHQgKiAgICAgICAgIHJlYWRzIHRoZXNlIGJhY2sgYW5kIGNhbGN1bGF0ZXMgb2NjbHVzaW9uLlxuXHQgKi9cblxuXHR0aGlzLnJlbmRlciA9IGZ1bmN0aW9uICggc2NlbmUsIGNhbWVyYSwgdmlld3BvcnQgKSB7XG5cblx0XHRpZiAoIGZsYXJlcy5sZW5ndGggPT09IDAgKSByZXR1cm47XG5cblx0XHR2YXIgdGVtcFBvc2l0aW9uID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHZhciBpbnZBc3BlY3QgPSB2aWV3cG9ydC53IC8gdmlld3BvcnQueixcblx0XHRcdGhhbGZWaWV3cG9ydFdpZHRoID0gdmlld3BvcnQueiAqIDAuNSxcblx0XHRcdGhhbGZWaWV3cG9ydEhlaWdodCA9IHZpZXdwb3J0LncgKiAwLjU7XG5cblx0XHR2YXIgc2l6ZSA9IDE2IC8gdmlld3BvcnQudyxcblx0XHRcdHNjYWxlID0gbmV3IFZlY3RvcjIoIHNpemUgKiBpbnZBc3BlY3QsIHNpemUgKTtcblxuXHRcdHZhciBzY3JlZW5Qb3NpdGlvbiA9IG5ldyBWZWN0b3IzKCAxLCAxLCAwICksXG5cdFx0XHRzY3JlZW5Qb3NpdGlvblBpeGVscyA9IG5ldyBWZWN0b3IyKCAxLCAxICk7XG5cblx0XHR2YXIgdmFsaWRBcmVhID0gbmV3IEJveDIoKTtcblxuXHRcdHZhbGlkQXJlYS5taW4uc2V0KCB2aWV3cG9ydC54LCB2aWV3cG9ydC55ICk7XG5cdFx0dmFsaWRBcmVhLm1heC5zZXQoIHZpZXdwb3J0LnggKyAoIHZpZXdwb3J0LnogLSAxNiApLCB2aWV3cG9ydC55ICsgKCB2aWV3cG9ydC53IC0gMTYgKSApO1xuXG5cdFx0aWYgKCBwcm9ncmFtID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGluaXQoKTtcblxuXHRcdH1cblxuXHRcdGdsLnVzZVByb2dyYW0oIHByb2dyYW0gKTtcblxuXHRcdHN0YXRlLmluaXRBdHRyaWJ1dGVzKCk7XG5cdFx0c3RhdGUuZW5hYmxlQXR0cmlidXRlKCBhdHRyaWJ1dGVzLnZlcnRleCApO1xuXHRcdHN0YXRlLmVuYWJsZUF0dHJpYnV0ZSggYXR0cmlidXRlcy51diApO1xuXHRcdHN0YXRlLmRpc2FibGVVbnVzZWRBdHRyaWJ1dGVzKCk7XG5cblx0XHQvLyBsb29wIHRocm91Z2ggYWxsIGxlbnMgZmxhcmVzIHRvIHVwZGF0ZSB0aGVpciBvY2NsdXNpb24gYW5kIHBvc2l0aW9uc1xuXHRcdC8vIHNldHVwIGdsIGFuZCBjb21tb24gdXNlZCBhdHRyaWJzL3VuaWZvcm1zXG5cblx0XHRnbC51bmlmb3JtMWkoIHVuaWZvcm1zLm9jY2x1c2lvbk1hcCwgMCApO1xuXHRcdGdsLnVuaWZvcm0xaSggdW5pZm9ybXMubWFwLCAxICk7XG5cblx0XHRnbC5iaW5kQnVmZmVyKCBnbC5BUlJBWV9CVUZGRVIsIHZlcnRleEJ1ZmZlciApO1xuXHRcdGdsLnZlcnRleEF0dHJpYlBvaW50ZXIoIGF0dHJpYnV0ZXMudmVydGV4LCAyLCBnbC5GTE9BVCwgZmFsc2UsIDIgKiA4LCAwICk7XG5cdFx0Z2wudmVydGV4QXR0cmliUG9pbnRlciggYXR0cmlidXRlcy51diwgMiwgZ2wuRkxPQVQsIGZhbHNlLCAyICogOCwgOCApO1xuXG5cdFx0Z2wuYmluZEJ1ZmZlciggZ2wuRUxFTUVOVF9BUlJBWV9CVUZGRVIsIGVsZW1lbnRCdWZmZXIgKTtcblxuXHRcdHN0YXRlLmRpc2FibGUoIGdsLkNVTExfRkFDRSApO1xuXHRcdHN0YXRlLmJ1ZmZlcnMuZGVwdGguc2V0TWFzayggZmFsc2UgKTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGZsYXJlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRzaXplID0gMTYgLyB2aWV3cG9ydC53O1xuXHRcdFx0c2NhbGUuc2V0KCBzaXplICogaW52QXNwZWN0LCBzaXplICk7XG5cblx0XHRcdC8vIGNhbGMgb2JqZWN0IHNjcmVlbiBwb3NpdGlvblxuXG5cdFx0XHR2YXIgZmxhcmUgPSBmbGFyZXNbIGkgXTtcblxuXHRcdFx0dGVtcFBvc2l0aW9uLnNldCggZmxhcmUubWF0cml4V29ybGQuZWxlbWVudHNbIDEyIF0sIGZsYXJlLm1hdHJpeFdvcmxkLmVsZW1lbnRzWyAxMyBdLCBmbGFyZS5tYXRyaXhXb3JsZC5lbGVtZW50c1sgMTQgXSApO1xuXG5cdFx0XHR0ZW1wUG9zaXRpb24uYXBwbHlNYXRyaXg0KCBjYW1lcmEubWF0cml4V29ybGRJbnZlcnNlICk7XG5cdFx0XHR0ZW1wUG9zaXRpb24uYXBwbHlNYXRyaXg0KCBjYW1lcmEucHJvamVjdGlvbk1hdHJpeCApO1xuXG5cdFx0XHQvLyBzZXR1cCBhcnJheXMgZm9yIGdsIHByb2dyYW1zXG5cblx0XHRcdHNjcmVlblBvc2l0aW9uLmNvcHkoIHRlbXBQb3NpdGlvbiApO1xuXG5cdFx0XHQvLyBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBjb29yZGluYXRlIG9mIHRoZSBsb3dlciBsZWZ0IGNvcm5lciBvZiB0aGUgcGl4ZWxzIHRvIGNvcHlcblxuXHRcdFx0c2NyZWVuUG9zaXRpb25QaXhlbHMueCA9IHZpZXdwb3J0LnggKyAoIHNjcmVlblBvc2l0aW9uLnggKiBoYWxmVmlld3BvcnRXaWR0aCApICsgaGFsZlZpZXdwb3J0V2lkdGggLSA4O1xuXHRcdFx0c2NyZWVuUG9zaXRpb25QaXhlbHMueSA9IHZpZXdwb3J0LnkgKyAoIHNjcmVlblBvc2l0aW9uLnkgKiBoYWxmVmlld3BvcnRIZWlnaHQgKSArIGhhbGZWaWV3cG9ydEhlaWdodCAtIDg7XG5cblx0XHRcdC8vIHNjcmVlbiBjdWxsXG5cblx0XHRcdGlmICggdmFsaWRBcmVhLmNvbnRhaW5zUG9pbnQoIHNjcmVlblBvc2l0aW9uUGl4ZWxzICkgPT09IHRydWUgKSB7XG5cblx0XHRcdFx0Ly8gc2F2ZSBjdXJyZW50IFJHQiB0byB0ZW1wIHRleHR1cmVcblxuXHRcdFx0XHRzdGF0ZS5hY3RpdmVUZXh0dXJlKCBnbC5URVhUVVJFMCApO1xuXHRcdFx0XHRzdGF0ZS5iaW5kVGV4dHVyZSggZ2wuVEVYVFVSRV8yRCwgbnVsbCApO1xuXHRcdFx0XHRzdGF0ZS5hY3RpdmVUZXh0dXJlKCBnbC5URVhUVVJFMSApO1xuXHRcdFx0XHRzdGF0ZS5iaW5kVGV4dHVyZSggZ2wuVEVYVFVSRV8yRCwgdGVtcFRleHR1cmUgKTtcblx0XHRcdFx0Z2wuY29weVRleEltYWdlMkQoIGdsLlRFWFRVUkVfMkQsIDAsIGdsLlJHQiwgc2NyZWVuUG9zaXRpb25QaXhlbHMueCwgc2NyZWVuUG9zaXRpb25QaXhlbHMueSwgMTYsIDE2LCAwICk7XG5cblxuXHRcdFx0XHQvLyByZW5kZXIgcGluayBxdWFkXG5cblx0XHRcdFx0Z2wudW5pZm9ybTFpKCB1bmlmb3Jtcy5yZW5kZXJUeXBlLCAwICk7XG5cdFx0XHRcdGdsLnVuaWZvcm0yZiggdW5pZm9ybXMuc2NhbGUsIHNjYWxlLngsIHNjYWxlLnkgKTtcblx0XHRcdFx0Z2wudW5pZm9ybTNmKCB1bmlmb3Jtcy5zY3JlZW5Qb3NpdGlvbiwgc2NyZWVuUG9zaXRpb24ueCwgc2NyZWVuUG9zaXRpb24ueSwgc2NyZWVuUG9zaXRpb24ueiApO1xuXG5cdFx0XHRcdHN0YXRlLmRpc2FibGUoIGdsLkJMRU5EICk7XG5cdFx0XHRcdHN0YXRlLmVuYWJsZSggZ2wuREVQVEhfVEVTVCApO1xuXG5cdFx0XHRcdGdsLmRyYXdFbGVtZW50cyggZ2wuVFJJQU5HTEVTLCA2LCBnbC5VTlNJR05FRF9TSE9SVCwgMCApO1xuXG5cblx0XHRcdFx0Ly8gY29weSByZXN1bHQgdG8gb2NjbHVzaW9uTWFwXG5cblx0XHRcdFx0c3RhdGUuYWN0aXZlVGV4dHVyZSggZ2wuVEVYVFVSRTAgKTtcblx0XHRcdFx0c3RhdGUuYmluZFRleHR1cmUoIGdsLlRFWFRVUkVfMkQsIG9jY2x1c2lvblRleHR1cmUgKTtcblx0XHRcdFx0Z2wuY29weVRleEltYWdlMkQoIGdsLlRFWFRVUkVfMkQsIDAsIGdsLlJHQkEsIHNjcmVlblBvc2l0aW9uUGl4ZWxzLngsIHNjcmVlblBvc2l0aW9uUGl4ZWxzLnksIDE2LCAxNiwgMCApO1xuXG5cblx0XHRcdFx0Ly8gcmVzdG9yZSBncmFwaGljc1xuXG5cdFx0XHRcdGdsLnVuaWZvcm0xaSggdW5pZm9ybXMucmVuZGVyVHlwZSwgMSApO1xuXHRcdFx0XHRzdGF0ZS5kaXNhYmxlKCBnbC5ERVBUSF9URVNUICk7XG5cblx0XHRcdFx0c3RhdGUuYWN0aXZlVGV4dHVyZSggZ2wuVEVYVFVSRTEgKTtcblx0XHRcdFx0c3RhdGUuYmluZFRleHR1cmUoIGdsLlRFWFRVUkVfMkQsIHRlbXBUZXh0dXJlICk7XG5cdFx0XHRcdGdsLmRyYXdFbGVtZW50cyggZ2wuVFJJQU5HTEVTLCA2LCBnbC5VTlNJR05FRF9TSE9SVCwgMCApO1xuXG5cblx0XHRcdFx0Ly8gdXBkYXRlIG9iamVjdCBwb3NpdGlvbnNcblxuXHRcdFx0XHRmbGFyZS5wb3NpdGlvblNjcmVlbi5jb3B5KCBzY3JlZW5Qb3NpdGlvbiApO1xuXG5cdFx0XHRcdGlmICggZmxhcmUuY3VzdG9tVXBkYXRlQ2FsbGJhY2sgKSB7XG5cblx0XHRcdFx0XHRmbGFyZS5jdXN0b21VcGRhdGVDYWxsYmFjayggZmxhcmUgKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0ZmxhcmUudXBkYXRlTGVuc0ZsYXJlcygpO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyByZW5kZXIgZmxhcmVzXG5cblx0XHRcdFx0Z2wudW5pZm9ybTFpKCB1bmlmb3Jtcy5yZW5kZXJUeXBlLCAyICk7XG5cdFx0XHRcdHN0YXRlLmVuYWJsZSggZ2wuQkxFTkQgKTtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaiA9IDAsIGpsID0gZmxhcmUubGVuc0ZsYXJlcy5sZW5ndGg7IGogPCBqbDsgaiArKyApIHtcblxuXHRcdFx0XHRcdHZhciBzcHJpdGUgPSBmbGFyZS5sZW5zRmxhcmVzWyBqIF07XG5cblx0XHRcdFx0XHRpZiAoIHNwcml0ZS5vcGFjaXR5ID4gMC4wMDEgJiYgc3ByaXRlLnNjYWxlID4gMC4wMDEgKSB7XG5cblx0XHRcdFx0XHRcdHNjcmVlblBvc2l0aW9uLnggPSBzcHJpdGUueDtcblx0XHRcdFx0XHRcdHNjcmVlblBvc2l0aW9uLnkgPSBzcHJpdGUueTtcblx0XHRcdFx0XHRcdHNjcmVlblBvc2l0aW9uLnogPSBzcHJpdGUuejtcblxuXHRcdFx0XHRcdFx0c2l6ZSA9IHNwcml0ZS5zaXplICogc3ByaXRlLnNjYWxlIC8gdmlld3BvcnQudztcblxuXHRcdFx0XHRcdFx0c2NhbGUueCA9IHNpemUgKiBpbnZBc3BlY3Q7XG5cdFx0XHRcdFx0XHRzY2FsZS55ID0gc2l6ZTtcblxuXHRcdFx0XHRcdFx0Z2wudW5pZm9ybTNmKCB1bmlmb3Jtcy5zY3JlZW5Qb3NpdGlvbiwgc2NyZWVuUG9zaXRpb24ueCwgc2NyZWVuUG9zaXRpb24ueSwgc2NyZWVuUG9zaXRpb24ueiApO1xuXHRcdFx0XHRcdFx0Z2wudW5pZm9ybTJmKCB1bmlmb3Jtcy5zY2FsZSwgc2NhbGUueCwgc2NhbGUueSApO1xuXHRcdFx0XHRcdFx0Z2wudW5pZm9ybTFmKCB1bmlmb3Jtcy5yb3RhdGlvbiwgc3ByaXRlLnJvdGF0aW9uICk7XG5cblx0XHRcdFx0XHRcdGdsLnVuaWZvcm0xZiggdW5pZm9ybXMub3BhY2l0eSwgc3ByaXRlLm9wYWNpdHkgKTtcblx0XHRcdFx0XHRcdGdsLnVuaWZvcm0zZiggdW5pZm9ybXMuY29sb3IsIHNwcml0ZS5jb2xvci5yLCBzcHJpdGUuY29sb3IuZywgc3ByaXRlLmNvbG9yLmIgKTtcblxuXHRcdFx0XHRcdFx0c3RhdGUuc2V0QmxlbmRpbmcoIHNwcml0ZS5ibGVuZGluZywgc3ByaXRlLmJsZW5kRXF1YXRpb24sIHNwcml0ZS5ibGVuZFNyYywgc3ByaXRlLmJsZW5kRHN0ICk7XG5cdFx0XHRcdFx0XHRyZW5kZXJlci5zZXRUZXh0dXJlMkQoIHNwcml0ZS50ZXh0dXJlLCAxICk7XG5cblx0XHRcdFx0XHRcdGdsLmRyYXdFbGVtZW50cyggZ2wuVFJJQU5HTEVTLCA2LCBnbC5VTlNJR05FRF9TSE9SVCwgMCApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gcmVzdG9yZSBnbFxuXG5cdFx0c3RhdGUuZW5hYmxlKCBnbC5DVUxMX0ZBQ0UgKTtcblx0XHRzdGF0ZS5lbmFibGUoIGdsLkRFUFRIX1RFU1QgKTtcblx0XHRzdGF0ZS5idWZmZXJzLmRlcHRoLnNldE1hc2soIHRydWUgKTtcblxuXHRcdHJlbmRlcmVyLnJlc2V0R0xTdGF0ZSgpO1xuXG5cdH07XG5cblx0ZnVuY3Rpb24gY3JlYXRlUHJvZ3JhbSggc2hhZGVyICkge1xuXG5cdFx0dmFyIHByb2dyYW0gPSBnbC5jcmVhdGVQcm9ncmFtKCk7XG5cblx0XHR2YXIgZnJhZ21lbnRTaGFkZXIgPSBnbC5jcmVhdGVTaGFkZXIoIGdsLkZSQUdNRU5UX1NIQURFUiApO1xuXHRcdHZhciB2ZXJ0ZXhTaGFkZXIgPSBnbC5jcmVhdGVTaGFkZXIoIGdsLlZFUlRFWF9TSEFERVIgKTtcblxuXHRcdHZhciBwcmVmaXggPSBcInByZWNpc2lvbiBcIiArIHJlbmRlcmVyLmdldFByZWNpc2lvbigpICsgXCIgZmxvYXQ7XFxuXCI7XG5cblx0XHRnbC5zaGFkZXJTb3VyY2UoIGZyYWdtZW50U2hhZGVyLCBwcmVmaXggKyBzaGFkZXIuZnJhZ21lbnRTaGFkZXIgKTtcblx0XHRnbC5zaGFkZXJTb3VyY2UoIHZlcnRleFNoYWRlciwgcHJlZml4ICsgc2hhZGVyLnZlcnRleFNoYWRlciApO1xuXG5cdFx0Z2wuY29tcGlsZVNoYWRlciggZnJhZ21lbnRTaGFkZXIgKTtcblx0XHRnbC5jb21waWxlU2hhZGVyKCB2ZXJ0ZXhTaGFkZXIgKTtcblxuXHRcdGdsLmF0dGFjaFNoYWRlciggcHJvZ3JhbSwgZnJhZ21lbnRTaGFkZXIgKTtcblx0XHRnbC5hdHRhY2hTaGFkZXIoIHByb2dyYW0sIHZlcnRleFNoYWRlciApO1xuXG5cdFx0Z2wubGlua1Byb2dyYW0oIHByb2dyYW0gKTtcblxuXHRcdHJldHVybiBwcm9ncmFtO1xuXG5cdH1cblxufVxuXG4vKipcbiAqIEBhdXRob3IgbWlrYWVsIGVtdGluZ2VyIC8gaHR0cDovL2dvbW8uc2UvXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICovXG5cbmZ1bmN0aW9uIFNwcml0ZVBsdWdpbiggcmVuZGVyZXIsIHNwcml0ZXMgKSB7XG5cblx0dmFyIGdsID0gcmVuZGVyZXIuY29udGV4dDtcblx0dmFyIHN0YXRlID0gcmVuZGVyZXIuc3RhdGU7XG5cblx0dmFyIHZlcnRleEJ1ZmZlciwgZWxlbWVudEJ1ZmZlcjtcblx0dmFyIHByb2dyYW0sIGF0dHJpYnV0ZXMsIHVuaWZvcm1zO1xuXG5cdHZhciB0ZXh0dXJlO1xuXG5cdC8vIGRlY29tcG9zZSBtYXRyaXhXb3JsZFxuXG5cdHZhciBzcHJpdGVQb3NpdGlvbiA9IG5ldyBWZWN0b3IzKCk7XG5cdHZhciBzcHJpdGVSb3RhdGlvbiA9IG5ldyBRdWF0ZXJuaW9uKCk7XG5cdHZhciBzcHJpdGVTY2FsZSA9IG5ldyBWZWN0b3IzKCk7XG5cblx0ZnVuY3Rpb24gaW5pdCgpIHtcblxuXHRcdHZhciB2ZXJ0aWNlcyA9IG5ldyBGbG9hdDMyQXJyYXkoIFtcblx0XHRcdC0gMC41LCAtIDAuNSwgIDAsIDAsXG5cdFx0XHQgIDAuNSwgLSAwLjUsICAxLCAwLFxuXHRcdFx0ICAwLjUsICAgMC41LCAgMSwgMSxcblx0XHRcdC0gMC41LCAgIDAuNSwgIDAsIDFcblx0XHRdICk7XG5cblx0XHR2YXIgZmFjZXMgPSBuZXcgVWludDE2QXJyYXkoIFtcblx0XHRcdDAsIDEsIDIsXG5cdFx0XHQwLCAyLCAzXG5cdFx0XSApO1xuXG5cdFx0dmVydGV4QnVmZmVyICA9IGdsLmNyZWF0ZUJ1ZmZlcigpO1xuXHRcdGVsZW1lbnRCdWZmZXIgPSBnbC5jcmVhdGVCdWZmZXIoKTtcblxuXHRcdGdsLmJpbmRCdWZmZXIoIGdsLkFSUkFZX0JVRkZFUiwgdmVydGV4QnVmZmVyICk7XG5cdFx0Z2wuYnVmZmVyRGF0YSggZ2wuQVJSQVlfQlVGRkVSLCB2ZXJ0aWNlcywgZ2wuU1RBVElDX0RSQVcgKTtcblxuXHRcdGdsLmJpbmRCdWZmZXIoIGdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCBlbGVtZW50QnVmZmVyICk7XG5cdFx0Z2wuYnVmZmVyRGF0YSggZ2wuRUxFTUVOVF9BUlJBWV9CVUZGRVIsIGZhY2VzLCBnbC5TVEFUSUNfRFJBVyApO1xuXG5cdFx0cHJvZ3JhbSA9IGNyZWF0ZVByb2dyYW0oKTtcblxuXHRcdGF0dHJpYnV0ZXMgPSB7XG5cdFx0XHRwb3NpdGlvbjpcdFx0XHRnbC5nZXRBdHRyaWJMb2NhdGlvbiAoIHByb2dyYW0sICdwb3NpdGlvbicgKSxcblx0XHRcdHV2Olx0XHRcdFx0XHRnbC5nZXRBdHRyaWJMb2NhdGlvbiAoIHByb2dyYW0sICd1dicgKVxuXHRcdH07XG5cblx0XHR1bmlmb3JtcyA9IHtcblx0XHRcdHV2T2Zmc2V0Olx0XHRcdGdsLmdldFVuaWZvcm1Mb2NhdGlvbiggcHJvZ3JhbSwgJ3V2T2Zmc2V0JyApLFxuXHRcdFx0dXZTY2FsZTpcdFx0XHRnbC5nZXRVbmlmb3JtTG9jYXRpb24oIHByb2dyYW0sICd1dlNjYWxlJyApLFxuXG5cdFx0XHRyb3RhdGlvbjpcdFx0XHRnbC5nZXRVbmlmb3JtTG9jYXRpb24oIHByb2dyYW0sICdyb3RhdGlvbicgKSxcblx0XHRcdHNjYWxlOlx0XHRcdFx0Z2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCAnc2NhbGUnICksXG5cblx0XHRcdGNvbG9yOlx0XHRcdFx0Z2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCAnY29sb3InICksXG5cdFx0XHRtYXA6XHRcdFx0XHRnbC5nZXRVbmlmb3JtTG9jYXRpb24oIHByb2dyYW0sICdtYXAnICksXG5cdFx0XHRvcGFjaXR5Olx0XHRcdGdsLmdldFVuaWZvcm1Mb2NhdGlvbiggcHJvZ3JhbSwgJ29wYWNpdHknICksXG5cblx0XHRcdG1vZGVsVmlld01hdHJpeDogXHRnbC5nZXRVbmlmb3JtTG9jYXRpb24oIHByb2dyYW0sICdtb2RlbFZpZXdNYXRyaXgnICksXG5cdFx0XHRwcm9qZWN0aW9uTWF0cml4Olx0Z2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCAncHJvamVjdGlvbk1hdHJpeCcgKSxcblxuXHRcdFx0Zm9nVHlwZTpcdFx0XHRnbC5nZXRVbmlmb3JtTG9jYXRpb24oIHByb2dyYW0sICdmb2dUeXBlJyApLFxuXHRcdFx0Zm9nRGVuc2l0eTpcdFx0XHRnbC5nZXRVbmlmb3JtTG9jYXRpb24oIHByb2dyYW0sICdmb2dEZW5zaXR5JyApLFxuXHRcdFx0Zm9nTmVhcjpcdFx0XHRnbC5nZXRVbmlmb3JtTG9jYXRpb24oIHByb2dyYW0sICdmb2dOZWFyJyApLFxuXHRcdFx0Zm9nRmFyOlx0XHRcdFx0Z2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCAnZm9nRmFyJyApLFxuXHRcdFx0Zm9nQ29sb3I6XHRcdFx0Z2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCAnZm9nQ29sb3InICksXG5cblx0XHRcdGFscGhhVGVzdDpcdFx0XHRnbC5nZXRVbmlmb3JtTG9jYXRpb24oIHByb2dyYW0sICdhbHBoYVRlc3QnIClcblx0XHR9O1xuXG5cdFx0dmFyIGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyggJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnLCAnY2FudmFzJyApO1xuXHRcdGNhbnZhcy53aWR0aCA9IDg7XG5cdFx0Y2FudmFzLmhlaWdodCA9IDg7XG5cblx0XHR2YXIgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KCAnMmQnICk7XG5cdFx0Y29udGV4dC5maWxsU3R5bGUgPSAnd2hpdGUnO1xuXHRcdGNvbnRleHQuZmlsbFJlY3QoIDAsIDAsIDgsIDggKTtcblxuXHRcdHRleHR1cmUgPSBuZXcgVGV4dHVyZSggY2FudmFzICk7XG5cdFx0dGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0fVxuXG5cdHRoaXMucmVuZGVyID0gZnVuY3Rpb24gKCBzY2VuZSwgY2FtZXJhICkge1xuXG5cdFx0aWYgKCBzcHJpdGVzLmxlbmd0aCA9PT0gMCApIHJldHVybjtcblxuXHRcdC8vIHNldHVwIGdsXG5cblx0XHRpZiAoIHByb2dyYW0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0aW5pdCgpO1xuXG5cdFx0fVxuXG5cdFx0Z2wudXNlUHJvZ3JhbSggcHJvZ3JhbSApO1xuXG5cdFx0c3RhdGUuaW5pdEF0dHJpYnV0ZXMoKTtcblx0XHRzdGF0ZS5lbmFibGVBdHRyaWJ1dGUoIGF0dHJpYnV0ZXMucG9zaXRpb24gKTtcblx0XHRzdGF0ZS5lbmFibGVBdHRyaWJ1dGUoIGF0dHJpYnV0ZXMudXYgKTtcblx0XHRzdGF0ZS5kaXNhYmxlVW51c2VkQXR0cmlidXRlcygpO1xuXG5cdFx0c3RhdGUuZGlzYWJsZSggZ2wuQ1VMTF9GQUNFICk7XG5cdFx0c3RhdGUuZW5hYmxlKCBnbC5CTEVORCApO1xuXG5cdFx0Z2wuYmluZEJ1ZmZlciggZ2wuQVJSQVlfQlVGRkVSLCB2ZXJ0ZXhCdWZmZXIgKTtcblx0XHRnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKCBhdHRyaWJ1dGVzLnBvc2l0aW9uLCAyLCBnbC5GTE9BVCwgZmFsc2UsIDIgKiA4LCAwICk7XG5cdFx0Z2wudmVydGV4QXR0cmliUG9pbnRlciggYXR0cmlidXRlcy51diwgMiwgZ2wuRkxPQVQsIGZhbHNlLCAyICogOCwgOCApO1xuXG5cdFx0Z2wuYmluZEJ1ZmZlciggZ2wuRUxFTUVOVF9BUlJBWV9CVUZGRVIsIGVsZW1lbnRCdWZmZXIgKTtcblxuXHRcdGdsLnVuaWZvcm1NYXRyaXg0ZnYoIHVuaWZvcm1zLnByb2plY3Rpb25NYXRyaXgsIGZhbHNlLCBjYW1lcmEucHJvamVjdGlvbk1hdHJpeC5lbGVtZW50cyApO1xuXG5cdFx0c3RhdGUuYWN0aXZlVGV4dHVyZSggZ2wuVEVYVFVSRTAgKTtcblx0XHRnbC51bmlmb3JtMWkoIHVuaWZvcm1zLm1hcCwgMCApO1xuXG5cdFx0dmFyIG9sZEZvZ1R5cGUgPSAwO1xuXHRcdHZhciBzY2VuZUZvZ1R5cGUgPSAwO1xuXHRcdHZhciBmb2cgPSBzY2VuZS5mb2c7XG5cblx0XHRpZiAoIGZvZyApIHtcblxuXHRcdFx0Z2wudW5pZm9ybTNmKCB1bmlmb3Jtcy5mb2dDb2xvciwgZm9nLmNvbG9yLnIsIGZvZy5jb2xvci5nLCBmb2cuY29sb3IuYiApO1xuXG5cdFx0XHRpZiAoIGZvZy5pc0ZvZyApIHtcblxuXHRcdFx0XHRnbC51bmlmb3JtMWYoIHVuaWZvcm1zLmZvZ05lYXIsIGZvZy5uZWFyICk7XG5cdFx0XHRcdGdsLnVuaWZvcm0xZiggdW5pZm9ybXMuZm9nRmFyLCBmb2cuZmFyICk7XG5cblx0XHRcdFx0Z2wudW5pZm9ybTFpKCB1bmlmb3Jtcy5mb2dUeXBlLCAxICk7XG5cdFx0XHRcdG9sZEZvZ1R5cGUgPSAxO1xuXHRcdFx0XHRzY2VuZUZvZ1R5cGUgPSAxO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBmb2cuaXNGb2dFeHAyICkge1xuXG5cdFx0XHRcdGdsLnVuaWZvcm0xZiggdW5pZm9ybXMuZm9nRGVuc2l0eSwgZm9nLmRlbnNpdHkgKTtcblxuXHRcdFx0XHRnbC51bmlmb3JtMWkoIHVuaWZvcm1zLmZvZ1R5cGUsIDIgKTtcblx0XHRcdFx0b2xkRm9nVHlwZSA9IDI7XG5cdFx0XHRcdHNjZW5lRm9nVHlwZSA9IDI7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGdsLnVuaWZvcm0xaSggdW5pZm9ybXMuZm9nVHlwZSwgMCApO1xuXHRcdFx0b2xkRm9nVHlwZSA9IDA7XG5cdFx0XHRzY2VuZUZvZ1R5cGUgPSAwO1xuXG5cdFx0fVxuXG5cblx0XHQvLyB1cGRhdGUgcG9zaXRpb25zIGFuZCBzb3J0XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBzcHJpdGVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBzcHJpdGUgPSBzcHJpdGVzWyBpIF07XG5cblx0XHRcdHNwcml0ZS5tb2RlbFZpZXdNYXRyaXgubXVsdGlwbHlNYXRyaWNlcyggY2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZSwgc3ByaXRlLm1hdHJpeFdvcmxkICk7XG5cdFx0XHRzcHJpdGUueiA9IC0gc3ByaXRlLm1vZGVsVmlld01hdHJpeC5lbGVtZW50c1sgMTQgXTtcblxuXHRcdH1cblxuXHRcdHNwcml0ZXMuc29ydCggcGFpbnRlclNvcnRTdGFibGUgKTtcblxuXHRcdC8vIHJlbmRlciBhbGwgc3ByaXRlc1xuXG5cdFx0dmFyIHNjYWxlID0gW107XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBzcHJpdGVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBzcHJpdGUgPSBzcHJpdGVzWyBpIF07XG5cdFx0XHR2YXIgbWF0ZXJpYWwgPSBzcHJpdGUubWF0ZXJpYWw7XG5cblx0XHRcdGlmICggbWF0ZXJpYWwudmlzaWJsZSA9PT0gZmFsc2UgKSBjb250aW51ZTtcblxuXHRcdFx0Z2wudW5pZm9ybTFmKCB1bmlmb3Jtcy5hbHBoYVRlc3QsIG1hdGVyaWFsLmFscGhhVGVzdCApO1xuXHRcdFx0Z2wudW5pZm9ybU1hdHJpeDRmdiggdW5pZm9ybXMubW9kZWxWaWV3TWF0cml4LCBmYWxzZSwgc3ByaXRlLm1vZGVsVmlld01hdHJpeC5lbGVtZW50cyApO1xuXG5cdFx0XHRzcHJpdGUubWF0cml4V29ybGQuZGVjb21wb3NlKCBzcHJpdGVQb3NpdGlvbiwgc3ByaXRlUm90YXRpb24sIHNwcml0ZVNjYWxlICk7XG5cblx0XHRcdHNjYWxlWyAwIF0gPSBzcHJpdGVTY2FsZS54O1xuXHRcdFx0c2NhbGVbIDEgXSA9IHNwcml0ZVNjYWxlLnk7XG5cblx0XHRcdHZhciBmb2dUeXBlID0gMDtcblxuXHRcdFx0aWYgKCBzY2VuZS5mb2cgJiYgbWF0ZXJpYWwuZm9nICkge1xuXG5cdFx0XHRcdGZvZ1R5cGUgPSBzY2VuZUZvZ1R5cGU7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBvbGRGb2dUeXBlICE9PSBmb2dUeXBlICkge1xuXG5cdFx0XHRcdGdsLnVuaWZvcm0xaSggdW5pZm9ybXMuZm9nVHlwZSwgZm9nVHlwZSApO1xuXHRcdFx0XHRvbGRGb2dUeXBlID0gZm9nVHlwZTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIG1hdGVyaWFsLm1hcCAhPT0gbnVsbCApIHtcblxuXHRcdFx0XHRnbC51bmlmb3JtMmYoIHVuaWZvcm1zLnV2T2Zmc2V0LCBtYXRlcmlhbC5tYXAub2Zmc2V0LngsIG1hdGVyaWFsLm1hcC5vZmZzZXQueSApO1xuXHRcdFx0XHRnbC51bmlmb3JtMmYoIHVuaWZvcm1zLnV2U2NhbGUsIG1hdGVyaWFsLm1hcC5yZXBlYXQueCwgbWF0ZXJpYWwubWFwLnJlcGVhdC55ICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Z2wudW5pZm9ybTJmKCB1bmlmb3Jtcy51dk9mZnNldCwgMCwgMCApO1xuXHRcdFx0XHRnbC51bmlmb3JtMmYoIHVuaWZvcm1zLnV2U2NhbGUsIDEsIDEgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRnbC51bmlmb3JtMWYoIHVuaWZvcm1zLm9wYWNpdHksIG1hdGVyaWFsLm9wYWNpdHkgKTtcblx0XHRcdGdsLnVuaWZvcm0zZiggdW5pZm9ybXMuY29sb3IsIG1hdGVyaWFsLmNvbG9yLnIsIG1hdGVyaWFsLmNvbG9yLmcsIG1hdGVyaWFsLmNvbG9yLmIgKTtcblxuXHRcdFx0Z2wudW5pZm9ybTFmKCB1bmlmb3Jtcy5yb3RhdGlvbiwgbWF0ZXJpYWwucm90YXRpb24gKTtcblx0XHRcdGdsLnVuaWZvcm0yZnYoIHVuaWZvcm1zLnNjYWxlLCBzY2FsZSApO1xuXG5cdFx0XHRzdGF0ZS5zZXRCbGVuZGluZyggbWF0ZXJpYWwuYmxlbmRpbmcsIG1hdGVyaWFsLmJsZW5kRXF1YXRpb24sIG1hdGVyaWFsLmJsZW5kU3JjLCBtYXRlcmlhbC5ibGVuZERzdCApO1xuXHRcdFx0c3RhdGUuYnVmZmVycy5kZXB0aC5zZXRUZXN0KCBtYXRlcmlhbC5kZXB0aFRlc3QgKTtcblx0XHRcdHN0YXRlLmJ1ZmZlcnMuZGVwdGguc2V0TWFzayggbWF0ZXJpYWwuZGVwdGhXcml0ZSApO1xuXG5cdFx0XHRpZiAoIG1hdGVyaWFsLm1hcCApIHtcblxuXHRcdFx0XHRyZW5kZXJlci5zZXRUZXh0dXJlMkQoIG1hdGVyaWFsLm1hcCwgMCApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHJlbmRlcmVyLnNldFRleHR1cmUyRCggdGV4dHVyZSwgMCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGdsLmRyYXdFbGVtZW50cyggZ2wuVFJJQU5HTEVTLCA2LCBnbC5VTlNJR05FRF9TSE9SVCwgMCApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gcmVzdG9yZSBnbFxuXG5cdFx0c3RhdGUuZW5hYmxlKCBnbC5DVUxMX0ZBQ0UgKTtcblxuXHRcdHJlbmRlcmVyLnJlc2V0R0xTdGF0ZSgpO1xuXG5cdH07XG5cblx0ZnVuY3Rpb24gY3JlYXRlUHJvZ3JhbSgpIHtcblxuXHRcdHZhciBwcm9ncmFtID0gZ2wuY3JlYXRlUHJvZ3JhbSgpO1xuXG5cdFx0dmFyIHZlcnRleFNoYWRlciA9IGdsLmNyZWF0ZVNoYWRlciggZ2wuVkVSVEVYX1NIQURFUiApO1xuXHRcdHZhciBmcmFnbWVudFNoYWRlciA9IGdsLmNyZWF0ZVNoYWRlciggZ2wuRlJBR01FTlRfU0hBREVSICk7XG5cblx0XHRnbC5zaGFkZXJTb3VyY2UoIHZlcnRleFNoYWRlciwgW1xuXG5cdFx0XHQncHJlY2lzaW9uICcgKyByZW5kZXJlci5nZXRQcmVjaXNpb24oKSArICcgZmxvYXQ7JyxcblxuXHRcdFx0J3VuaWZvcm0gbWF0NCBtb2RlbFZpZXdNYXRyaXg7Jyxcblx0XHRcdCd1bmlmb3JtIG1hdDQgcHJvamVjdGlvbk1hdHJpeDsnLFxuXHRcdFx0J3VuaWZvcm0gZmxvYXQgcm90YXRpb247Jyxcblx0XHRcdCd1bmlmb3JtIHZlYzIgc2NhbGU7Jyxcblx0XHRcdCd1bmlmb3JtIHZlYzIgdXZPZmZzZXQ7Jyxcblx0XHRcdCd1bmlmb3JtIHZlYzIgdXZTY2FsZTsnLFxuXG5cdFx0XHQnYXR0cmlidXRlIHZlYzIgcG9zaXRpb247Jyxcblx0XHRcdCdhdHRyaWJ1dGUgdmVjMiB1djsnLFxuXG5cdFx0XHQndmFyeWluZyB2ZWMyIHZVVjsnLFxuXG5cdFx0XHQndm9pZCBtYWluKCkgeycsXG5cblx0XHRcdFx0J3ZVViA9IHV2T2Zmc2V0ICsgdXYgKiB1dlNjYWxlOycsXG5cblx0XHRcdFx0J3ZlYzIgYWxpZ25lZFBvc2l0aW9uID0gcG9zaXRpb24gKiBzY2FsZTsnLFxuXG5cdFx0XHRcdCd2ZWMyIHJvdGF0ZWRQb3NpdGlvbjsnLFxuXHRcdFx0XHQncm90YXRlZFBvc2l0aW9uLnggPSBjb3MoIHJvdGF0aW9uICkgKiBhbGlnbmVkUG9zaXRpb24ueCAtIHNpbiggcm90YXRpb24gKSAqIGFsaWduZWRQb3NpdGlvbi55OycsXG5cdFx0XHRcdCdyb3RhdGVkUG9zaXRpb24ueSA9IHNpbiggcm90YXRpb24gKSAqIGFsaWduZWRQb3NpdGlvbi54ICsgY29zKCByb3RhdGlvbiApICogYWxpZ25lZFBvc2l0aW9uLnk7JyxcblxuXHRcdFx0XHQndmVjNCBmaW5hbFBvc2l0aW9uOycsXG5cblx0XHRcdFx0J2ZpbmFsUG9zaXRpb24gPSBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KCAwLjAsIDAuMCwgMC4wLCAxLjAgKTsnLFxuXHRcdFx0XHQnZmluYWxQb3NpdGlvbi54eSArPSByb3RhdGVkUG9zaXRpb247Jyxcblx0XHRcdFx0J2ZpbmFsUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogZmluYWxQb3NpdGlvbjsnLFxuXG5cdFx0XHRcdCdnbF9Qb3NpdGlvbiA9IGZpbmFsUG9zaXRpb247JyxcblxuXHRcdFx0J30nXG5cblx0XHRdLmpvaW4oICdcXG4nICkgKTtcblxuXHRcdGdsLnNoYWRlclNvdXJjZSggZnJhZ21lbnRTaGFkZXIsIFtcblxuXHRcdFx0J3ByZWNpc2lvbiAnICsgcmVuZGVyZXIuZ2V0UHJlY2lzaW9uKCkgKyAnIGZsb2F0OycsXG5cblx0XHRcdCd1bmlmb3JtIHZlYzMgY29sb3I7Jyxcblx0XHRcdCd1bmlmb3JtIHNhbXBsZXIyRCBtYXA7Jyxcblx0XHRcdCd1bmlmb3JtIGZsb2F0IG9wYWNpdHk7JyxcblxuXHRcdFx0J3VuaWZvcm0gaW50IGZvZ1R5cGU7Jyxcblx0XHRcdCd1bmlmb3JtIHZlYzMgZm9nQ29sb3I7Jyxcblx0XHRcdCd1bmlmb3JtIGZsb2F0IGZvZ0RlbnNpdHk7Jyxcblx0XHRcdCd1bmlmb3JtIGZsb2F0IGZvZ05lYXI7Jyxcblx0XHRcdCd1bmlmb3JtIGZsb2F0IGZvZ0ZhcjsnLFxuXHRcdFx0J3VuaWZvcm0gZmxvYXQgYWxwaGFUZXN0OycsXG5cblx0XHRcdCd2YXJ5aW5nIHZlYzIgdlVWOycsXG5cblx0XHRcdCd2b2lkIG1haW4oKSB7JyxcblxuXHRcdFx0XHQndmVjNCB0ZXh0dXJlID0gdGV4dHVyZTJEKCBtYXAsIHZVViApOycsXG5cblx0XHRcdFx0J2lmICggdGV4dHVyZS5hIDwgYWxwaGFUZXN0ICkgZGlzY2FyZDsnLFxuXG5cdFx0XHRcdCdnbF9GcmFnQ29sb3IgPSB2ZWM0KCBjb2xvciAqIHRleHR1cmUueHl6LCB0ZXh0dXJlLmEgKiBvcGFjaXR5ICk7JyxcblxuXHRcdFx0XHQnaWYgKCBmb2dUeXBlID4gMCApIHsnLFxuXG5cdFx0XHRcdFx0J2Zsb2F0IGRlcHRoID0gZ2xfRnJhZ0Nvb3JkLnogLyBnbF9GcmFnQ29vcmQudzsnLFxuXHRcdFx0XHRcdCdmbG9hdCBmb2dGYWN0b3IgPSAwLjA7JyxcblxuXHRcdFx0XHRcdCdpZiAoIGZvZ1R5cGUgPT0gMSApIHsnLFxuXG5cdFx0XHRcdFx0XHQnZm9nRmFjdG9yID0gc21vb3Roc3RlcCggZm9nTmVhciwgZm9nRmFyLCBkZXB0aCApOycsXG5cblx0XHRcdFx0XHQnfSBlbHNlIHsnLFxuXG5cdFx0XHRcdFx0XHQnY29uc3QgZmxvYXQgTE9HMiA9IDEuNDQyNjk1OycsXG5cdFx0XHRcdFx0XHQnZm9nRmFjdG9yID0gZXhwMiggLSBmb2dEZW5zaXR5ICogZm9nRGVuc2l0eSAqIGRlcHRoICogZGVwdGggKiBMT0cyICk7Jyxcblx0XHRcdFx0XHRcdCdmb2dGYWN0b3IgPSAxLjAgLSBjbGFtcCggZm9nRmFjdG9yLCAwLjAsIDEuMCApOycsXG5cblx0XHRcdFx0XHQnfScsXG5cblx0XHRcdFx0XHQnZ2xfRnJhZ0NvbG9yID0gbWl4KCBnbF9GcmFnQ29sb3IsIHZlYzQoIGZvZ0NvbG9yLCBnbF9GcmFnQ29sb3IudyApLCBmb2dGYWN0b3IgKTsnLFxuXG5cdFx0XHRcdCd9JyxcblxuXHRcdFx0J30nXG5cblx0XHRdLmpvaW4oICdcXG4nICkgKTtcblxuXHRcdGdsLmNvbXBpbGVTaGFkZXIoIHZlcnRleFNoYWRlciApO1xuXHRcdGdsLmNvbXBpbGVTaGFkZXIoIGZyYWdtZW50U2hhZGVyICk7XG5cblx0XHRnbC5hdHRhY2hTaGFkZXIoIHByb2dyYW0sIHZlcnRleFNoYWRlciApO1xuXHRcdGdsLmF0dGFjaFNoYWRlciggcHJvZ3JhbSwgZnJhZ21lbnRTaGFkZXIgKTtcblxuXHRcdGdsLmxpbmtQcm9ncmFtKCBwcm9ncmFtICk7XG5cblx0XHRyZXR1cm4gcHJvZ3JhbTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gcGFpbnRlclNvcnRTdGFibGUoIGEsIGIgKSB7XG5cblx0XHRpZiAoIGEucmVuZGVyT3JkZXIgIT09IGIucmVuZGVyT3JkZXIgKSB7XG5cblx0XHRcdHJldHVybiBhLnJlbmRlck9yZGVyIC0gYi5yZW5kZXJPcmRlcjtcblxuXHRcdH0gZWxzZSBpZiAoIGEueiAhPT0gYi56ICkge1xuXG5cdFx0XHRyZXR1cm4gYi56IC0gYS56O1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0cmV0dXJuIGIuaWQgLSBhLmlkO1xuXG5cdFx0fVxuXG5cdH1cblxufVxuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICovXG5cbnZhciBtYXRlcmlhbElkID0gMDtcblxuZnVuY3Rpb24gTWF0ZXJpYWwoKSB7XG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KCB0aGlzLCAnaWQnLCB7IHZhbHVlOiBtYXRlcmlhbElkICsrIH0gKTtcblxuXHR0aGlzLnV1aWQgPSBfTWF0aC5nZW5lcmF0ZVVVSUQoKTtcblxuXHR0aGlzLm5hbWUgPSAnJztcblx0dGhpcy50eXBlID0gJ01hdGVyaWFsJztcblxuXHR0aGlzLmZvZyA9IHRydWU7XG5cdHRoaXMubGlnaHRzID0gdHJ1ZTtcblxuXHR0aGlzLmJsZW5kaW5nID0gTm9ybWFsQmxlbmRpbmc7XG5cdHRoaXMuc2lkZSA9IEZyb250U2lkZTtcblx0dGhpcy5zaGFkaW5nID0gU21vb3RoU2hhZGluZzsgLy8gVEhSRUUuRmxhdFNoYWRpbmcsIFRIUkVFLlNtb290aFNoYWRpbmdcblx0dGhpcy52ZXJ0ZXhDb2xvcnMgPSBOb0NvbG9yczsgLy8gVEhSRUUuTm9Db2xvcnMsIFRIUkVFLlZlcnRleENvbG9ycywgVEhSRUUuRmFjZUNvbG9yc1xuXG5cdHRoaXMub3BhY2l0eSA9IDE7XG5cdHRoaXMudHJhbnNwYXJlbnQgPSBmYWxzZTtcblxuXHR0aGlzLmJsZW5kU3JjID0gU3JjQWxwaGFGYWN0b3I7XG5cdHRoaXMuYmxlbmREc3QgPSBPbmVNaW51c1NyY0FscGhhRmFjdG9yO1xuXHR0aGlzLmJsZW5kRXF1YXRpb24gPSBBZGRFcXVhdGlvbjtcblx0dGhpcy5ibGVuZFNyY0FscGhhID0gbnVsbDtcblx0dGhpcy5ibGVuZERzdEFscGhhID0gbnVsbDtcblx0dGhpcy5ibGVuZEVxdWF0aW9uQWxwaGEgPSBudWxsO1xuXG5cdHRoaXMuZGVwdGhGdW5jID0gTGVzc0VxdWFsRGVwdGg7XG5cdHRoaXMuZGVwdGhUZXN0ID0gdHJ1ZTtcblx0dGhpcy5kZXB0aFdyaXRlID0gdHJ1ZTtcblxuXHR0aGlzLmNsaXBwaW5nUGxhbmVzID0gbnVsbDtcblx0dGhpcy5jbGlwSW50ZXJzZWN0aW9uID0gZmFsc2U7XG5cdHRoaXMuY2xpcFNoYWRvd3MgPSBmYWxzZTtcblxuXHR0aGlzLmNvbG9yV3JpdGUgPSB0cnVlO1xuXG5cdHRoaXMucHJlY2lzaW9uID0gbnVsbDsgLy8gb3ZlcnJpZGUgdGhlIHJlbmRlcmVyJ3MgZGVmYXVsdCBwcmVjaXNpb24gZm9yIHRoaXMgbWF0ZXJpYWxcblxuXHR0aGlzLnBvbHlnb25PZmZzZXQgPSBmYWxzZTtcblx0dGhpcy5wb2x5Z29uT2Zmc2V0RmFjdG9yID0gMDtcblx0dGhpcy5wb2x5Z29uT2Zmc2V0VW5pdHMgPSAwO1xuXG5cdHRoaXMuZGl0aGVyaW5nID0gZmFsc2U7XG5cblx0dGhpcy5hbHBoYVRlc3QgPSAwO1xuXHR0aGlzLnByZW11bHRpcGxpZWRBbHBoYSA9IGZhbHNlO1xuXG5cdHRoaXMub3ZlcmRyYXcgPSAwOyAvLyBPdmVyZHJhd24gcGl4ZWxzICh0eXBpY2FsbHkgYmV0d2VlbiAwIGFuZCAxKSBmb3IgZml4aW5nIGFudGlhbGlhc2luZyBnYXBzIGluIENhbnZhc1JlbmRlcmVyXG5cblx0dGhpcy52aXNpYmxlID0gdHJ1ZTtcblxuXHR0aGlzLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxufVxuXG5PYmplY3QuYXNzaWduKCBNYXRlcmlhbC5wcm90b3R5cGUsIEV2ZW50RGlzcGF0Y2hlci5wcm90b3R5cGUsIHtcblxuXHRpc01hdGVyaWFsOiB0cnVlLFxuXG5cdHNldFZhbHVlczogZnVuY3Rpb24gKCB2YWx1ZXMgKSB7XG5cblx0XHRpZiAoIHZhbHVlcyA9PT0gdW5kZWZpbmVkICkgcmV0dXJuO1xuXG5cdFx0Zm9yICggdmFyIGtleSBpbiB2YWx1ZXMgKSB7XG5cblx0XHRcdHZhciBuZXdWYWx1ZSA9IHZhbHVlc1sga2V5IF07XG5cblx0XHRcdGlmICggbmV3VmFsdWUgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oIFwiVEhSRUUuTWF0ZXJpYWw6ICdcIiArIGtleSArIFwiJyBwYXJhbWV0ZXIgaXMgdW5kZWZpbmVkLlwiICk7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXG5cdFx0XHR9XG5cblx0XHRcdHZhciBjdXJyZW50VmFsdWUgPSB0aGlzWyBrZXkgXTtcblxuXHRcdFx0aWYgKCBjdXJyZW50VmFsdWUgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oIFwiVEhSRUUuXCIgKyB0aGlzLnR5cGUgKyBcIjogJ1wiICsga2V5ICsgXCInIGlzIG5vdCBhIHByb3BlcnR5IG9mIHRoaXMgbWF0ZXJpYWwuXCIgKTtcblx0XHRcdFx0Y29udGludWU7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBjdXJyZW50VmFsdWUgJiYgY3VycmVudFZhbHVlLmlzQ29sb3IgKSB7XG5cblx0XHRcdFx0Y3VycmVudFZhbHVlLnNldCggbmV3VmFsdWUgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggKCBjdXJyZW50VmFsdWUgJiYgY3VycmVudFZhbHVlLmlzVmVjdG9yMyApICYmICggbmV3VmFsdWUgJiYgbmV3VmFsdWUuaXNWZWN0b3IzICkgKSB7XG5cblx0XHRcdFx0Y3VycmVudFZhbHVlLmNvcHkoIG5ld1ZhbHVlICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIGtleSA9PT0gJ292ZXJkcmF3JyApIHtcblxuXHRcdFx0XHQvLyBlbnN1cmUgb3ZlcmRyYXcgaXMgYmFja3dhcmRzLWNvbXBhdGlibGUgd2l0aCBsZWdhY3kgYm9vbGVhbiB0eXBlXG5cdFx0XHRcdHRoaXNbIGtleSBdID0gTnVtYmVyKCBuZXdWYWx1ZSApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHRoaXNbIGtleSBdID0gbmV3VmFsdWU7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCBtZXRhICkge1xuXG5cdFx0dmFyIGlzUm9vdCA9IG1ldGEgPT09IHVuZGVmaW5lZDtcblxuXHRcdGlmICggaXNSb290ICkge1xuXG5cdFx0XHRtZXRhID0ge1xuXHRcdFx0XHR0ZXh0dXJlczoge30sXG5cdFx0XHRcdGltYWdlczoge31cblx0XHRcdH07XG5cblx0XHR9XG5cblx0XHR2YXIgZGF0YSA9IHtcblx0XHRcdG1ldGFkYXRhOiB7XG5cdFx0XHRcdHZlcnNpb246IDQuNSxcblx0XHRcdFx0dHlwZTogJ01hdGVyaWFsJyxcblx0XHRcdFx0Z2VuZXJhdG9yOiAnTWF0ZXJpYWwudG9KU09OJ1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHQvLyBzdGFuZGFyZCBNYXRlcmlhbCBzZXJpYWxpemF0aW9uXG5cdFx0ZGF0YS51dWlkID0gdGhpcy51dWlkO1xuXHRcdGRhdGEudHlwZSA9IHRoaXMudHlwZTtcblxuXHRcdGlmICggdGhpcy5uYW1lICE9PSAnJyApIGRhdGEubmFtZSA9IHRoaXMubmFtZTtcblxuXHRcdGlmICggdGhpcy5jb2xvciAmJiB0aGlzLmNvbG9yLmlzQ29sb3IgKSBkYXRhLmNvbG9yID0gdGhpcy5jb2xvci5nZXRIZXgoKTtcblxuXHRcdGlmICggdGhpcy5yb3VnaG5lc3MgIT09IHVuZGVmaW5lZCApIGRhdGEucm91Z2huZXNzID0gdGhpcy5yb3VnaG5lc3M7XG5cdFx0aWYgKCB0aGlzLm1ldGFsbmVzcyAhPT0gdW5kZWZpbmVkICkgZGF0YS5tZXRhbG5lc3MgPSB0aGlzLm1ldGFsbmVzcztcblxuXHRcdGlmICggdGhpcy5lbWlzc2l2ZSAmJiB0aGlzLmVtaXNzaXZlLmlzQ29sb3IgKSBkYXRhLmVtaXNzaXZlID0gdGhpcy5lbWlzc2l2ZS5nZXRIZXgoKTtcblx0XHRpZiAoIHRoaXMuc3BlY3VsYXIgJiYgdGhpcy5zcGVjdWxhci5pc0NvbG9yICkgZGF0YS5zcGVjdWxhciA9IHRoaXMuc3BlY3VsYXIuZ2V0SGV4KCk7XG5cdFx0aWYgKCB0aGlzLnNoaW5pbmVzcyAhPT0gdW5kZWZpbmVkICkgZGF0YS5zaGluaW5lc3MgPSB0aGlzLnNoaW5pbmVzcztcblx0XHRpZiAoIHRoaXMuY2xlYXJDb2F0ICE9PSB1bmRlZmluZWQgKSBkYXRhLmNsZWFyQ29hdCA9IHRoaXMuY2xlYXJDb2F0O1xuXHRcdGlmICggdGhpcy5jbGVhckNvYXRSb3VnaG5lc3MgIT09IHVuZGVmaW5lZCApIGRhdGEuY2xlYXJDb2F0Um91Z2huZXNzID0gdGhpcy5jbGVhckNvYXRSb3VnaG5lc3M7XG5cblx0XHRpZiAoIHRoaXMubWFwICYmIHRoaXMubWFwLmlzVGV4dHVyZSApIGRhdGEubWFwID0gdGhpcy5tYXAudG9KU09OKCBtZXRhICkudXVpZDtcblx0XHRpZiAoIHRoaXMuYWxwaGFNYXAgJiYgdGhpcy5hbHBoYU1hcC5pc1RleHR1cmUgKSBkYXRhLmFscGhhTWFwID0gdGhpcy5hbHBoYU1hcC50b0pTT04oIG1ldGEgKS51dWlkO1xuXHRcdGlmICggdGhpcy5saWdodE1hcCAmJiB0aGlzLmxpZ2h0TWFwLmlzVGV4dHVyZSApIGRhdGEubGlnaHRNYXAgPSB0aGlzLmxpZ2h0TWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7XG5cdFx0aWYgKCB0aGlzLmJ1bXBNYXAgJiYgdGhpcy5idW1wTWFwLmlzVGV4dHVyZSApIHtcblxuXHRcdFx0ZGF0YS5idW1wTWFwID0gdGhpcy5idW1wTWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7XG5cdFx0XHRkYXRhLmJ1bXBTY2FsZSA9IHRoaXMuYnVtcFNjYWxlO1xuXG5cdFx0fVxuXHRcdGlmICggdGhpcy5ub3JtYWxNYXAgJiYgdGhpcy5ub3JtYWxNYXAuaXNUZXh0dXJlICkge1xuXG5cdFx0XHRkYXRhLm5vcm1hbE1hcCA9IHRoaXMubm9ybWFsTWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7XG5cdFx0XHRkYXRhLm5vcm1hbFNjYWxlID0gdGhpcy5ub3JtYWxTY2FsZS50b0FycmF5KCk7XG5cblx0XHR9XG5cdFx0aWYgKCB0aGlzLmRpc3BsYWNlbWVudE1hcCAmJiB0aGlzLmRpc3BsYWNlbWVudE1hcC5pc1RleHR1cmUgKSB7XG5cblx0XHRcdGRhdGEuZGlzcGxhY2VtZW50TWFwID0gdGhpcy5kaXNwbGFjZW1lbnRNYXAudG9KU09OKCBtZXRhICkudXVpZDtcblx0XHRcdGRhdGEuZGlzcGxhY2VtZW50U2NhbGUgPSB0aGlzLmRpc3BsYWNlbWVudFNjYWxlO1xuXHRcdFx0ZGF0YS5kaXNwbGFjZW1lbnRCaWFzID0gdGhpcy5kaXNwbGFjZW1lbnRCaWFzO1xuXG5cdFx0fVxuXHRcdGlmICggdGhpcy5yb3VnaG5lc3NNYXAgJiYgdGhpcy5yb3VnaG5lc3NNYXAuaXNUZXh0dXJlICkgZGF0YS5yb3VnaG5lc3NNYXAgPSB0aGlzLnJvdWdobmVzc01hcC50b0pTT04oIG1ldGEgKS51dWlkO1xuXHRcdGlmICggdGhpcy5tZXRhbG5lc3NNYXAgJiYgdGhpcy5tZXRhbG5lc3NNYXAuaXNUZXh0dXJlICkgZGF0YS5tZXRhbG5lc3NNYXAgPSB0aGlzLm1ldGFsbmVzc01hcC50b0pTT04oIG1ldGEgKS51dWlkO1xuXG5cdFx0aWYgKCB0aGlzLmVtaXNzaXZlTWFwICYmIHRoaXMuZW1pc3NpdmVNYXAuaXNUZXh0dXJlICkgZGF0YS5lbWlzc2l2ZU1hcCA9IHRoaXMuZW1pc3NpdmVNYXAudG9KU09OKCBtZXRhICkudXVpZDtcblx0XHRpZiAoIHRoaXMuc3BlY3VsYXJNYXAgJiYgdGhpcy5zcGVjdWxhck1hcC5pc1RleHR1cmUgKSBkYXRhLnNwZWN1bGFyTWFwID0gdGhpcy5zcGVjdWxhck1hcC50b0pTT04oIG1ldGEgKS51dWlkO1xuXG5cdFx0aWYgKCB0aGlzLmVudk1hcCAmJiB0aGlzLmVudk1hcC5pc1RleHR1cmUgKSB7XG5cblx0XHRcdGRhdGEuZW52TWFwID0gdGhpcy5lbnZNYXAudG9KU09OKCBtZXRhICkudXVpZDtcblx0XHRcdGRhdGEucmVmbGVjdGl2aXR5ID0gdGhpcy5yZWZsZWN0aXZpdHk7IC8vIFNjYWxlIGJlaGluZCBlbnZNYXBcblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5ncmFkaWVudE1hcCAmJiB0aGlzLmdyYWRpZW50TWFwLmlzVGV4dHVyZSApIHtcblxuXHRcdFx0ZGF0YS5ncmFkaWVudE1hcCA9IHRoaXMuZ3JhZGllbnRNYXAudG9KU09OKCBtZXRhICkudXVpZDtcblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5zaXplICE9PSB1bmRlZmluZWQgKSBkYXRhLnNpemUgPSB0aGlzLnNpemU7XG5cdFx0aWYgKCB0aGlzLnNpemVBdHRlbnVhdGlvbiAhPT0gdW5kZWZpbmVkICkgZGF0YS5zaXplQXR0ZW51YXRpb24gPSB0aGlzLnNpemVBdHRlbnVhdGlvbjtcblxuXHRcdGlmICggdGhpcy5ibGVuZGluZyAhPT0gTm9ybWFsQmxlbmRpbmcgKSBkYXRhLmJsZW5kaW5nID0gdGhpcy5ibGVuZGluZztcblx0XHRpZiAoIHRoaXMuc2hhZGluZyAhPT0gU21vb3RoU2hhZGluZyApIGRhdGEuc2hhZGluZyA9IHRoaXMuc2hhZGluZztcblx0XHRpZiAoIHRoaXMuc2lkZSAhPT0gRnJvbnRTaWRlICkgZGF0YS5zaWRlID0gdGhpcy5zaWRlO1xuXHRcdGlmICggdGhpcy52ZXJ0ZXhDb2xvcnMgIT09IE5vQ29sb3JzICkgZGF0YS52ZXJ0ZXhDb2xvcnMgPSB0aGlzLnZlcnRleENvbG9ycztcblxuXHRcdGlmICggdGhpcy5vcGFjaXR5IDwgMSApIGRhdGEub3BhY2l0eSA9IHRoaXMub3BhY2l0eTtcblx0XHRpZiAoIHRoaXMudHJhbnNwYXJlbnQgPT09IHRydWUgKSBkYXRhLnRyYW5zcGFyZW50ID0gdGhpcy50cmFuc3BhcmVudDtcblxuXHRcdGRhdGEuZGVwdGhGdW5jID0gdGhpcy5kZXB0aEZ1bmM7XG5cdFx0ZGF0YS5kZXB0aFRlc3QgPSB0aGlzLmRlcHRoVGVzdDtcblx0XHRkYXRhLmRlcHRoV3JpdGUgPSB0aGlzLmRlcHRoV3JpdGU7XG5cblx0XHRpZiAoIHRoaXMuYWxwaGFUZXN0ID4gMCApIGRhdGEuYWxwaGFUZXN0ID0gdGhpcy5hbHBoYVRlc3Q7XG5cdFx0aWYgKCB0aGlzLnByZW11bHRpcGxpZWRBbHBoYSA9PT0gdHJ1ZSApIGRhdGEucHJlbXVsdGlwbGllZEFscGhhID0gdGhpcy5wcmVtdWx0aXBsaWVkQWxwaGE7XG5cdFx0aWYgKCB0aGlzLndpcmVmcmFtZSA9PT0gdHJ1ZSApIGRhdGEud2lyZWZyYW1lID0gdGhpcy53aXJlZnJhbWU7XG5cdFx0aWYgKCB0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA+IDEgKSBkYXRhLndpcmVmcmFtZUxpbmV3aWR0aCA9IHRoaXMud2lyZWZyYW1lTGluZXdpZHRoO1xuXHRcdGlmICggdGhpcy53aXJlZnJhbWVMaW5lY2FwICE9PSAncm91bmQnICkgZGF0YS53aXJlZnJhbWVMaW5lY2FwID0gdGhpcy53aXJlZnJhbWVMaW5lY2FwO1xuXHRcdGlmICggdGhpcy53aXJlZnJhbWVMaW5lam9pbiAhPT0gJ3JvdW5kJyApIGRhdGEud2lyZWZyYW1lTGluZWpvaW4gPSB0aGlzLndpcmVmcmFtZUxpbmVqb2luO1xuXG5cdFx0ZGF0YS5za2lubmluZyA9IHRoaXMuc2tpbm5pbmc7XG5cdFx0ZGF0YS5tb3JwaFRhcmdldHMgPSB0aGlzLm1vcnBoVGFyZ2V0cztcblxuXHRcdGRhdGEuZGl0aGVyaW5nID0gdGhpcy5kaXRoZXJpbmc7XG5cblx0XHQvLyBUT0RPOiBDb3BpZWQgZnJvbSBPYmplY3QzRC50b0pTT05cblxuXHRcdGZ1bmN0aW9uIGV4dHJhY3RGcm9tQ2FjaGUoIGNhY2hlICkge1xuXG5cdFx0XHR2YXIgdmFsdWVzID0gW107XG5cblx0XHRcdGZvciAoIHZhciBrZXkgaW4gY2FjaGUgKSB7XG5cblx0XHRcdFx0dmFyIGRhdGEgPSBjYWNoZVsga2V5IF07XG5cdFx0XHRcdGRlbGV0ZSBkYXRhLm1ldGFkYXRhO1xuXHRcdFx0XHR2YWx1ZXMucHVzaCggZGF0YSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB2YWx1ZXM7XG5cblx0XHR9XG5cblx0XHRpZiAoIGlzUm9vdCApIHtcblxuXHRcdFx0dmFyIHRleHR1cmVzID0gZXh0cmFjdEZyb21DYWNoZSggbWV0YS50ZXh0dXJlcyApO1xuXHRcdFx0dmFyIGltYWdlcyA9IGV4dHJhY3RGcm9tQ2FjaGUoIG1ldGEuaW1hZ2VzICk7XG5cblx0XHRcdGlmICggdGV4dHVyZXMubGVuZ3RoID4gMCApIGRhdGEudGV4dHVyZXMgPSB0ZXh0dXJlcztcblx0XHRcdGlmICggaW1hZ2VzLmxlbmd0aCA+IDAgKSBkYXRhLmltYWdlcyA9IGltYWdlcztcblxuXHRcdH1cblxuXHRcdHJldHVybiBkYXRhO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0dGhpcy5uYW1lID0gc291cmNlLm5hbWU7XG5cblx0XHR0aGlzLmZvZyA9IHNvdXJjZS5mb2c7XG5cdFx0dGhpcy5saWdodHMgPSBzb3VyY2UubGlnaHRzO1xuXG5cdFx0dGhpcy5ibGVuZGluZyA9IHNvdXJjZS5ibGVuZGluZztcblx0XHR0aGlzLnNpZGUgPSBzb3VyY2Uuc2lkZTtcblx0XHR0aGlzLnNoYWRpbmcgPSBzb3VyY2Uuc2hhZGluZztcblx0XHR0aGlzLnZlcnRleENvbG9ycyA9IHNvdXJjZS52ZXJ0ZXhDb2xvcnM7XG5cblx0XHR0aGlzLm9wYWNpdHkgPSBzb3VyY2Uub3BhY2l0eTtcblx0XHR0aGlzLnRyYW5zcGFyZW50ID0gc291cmNlLnRyYW5zcGFyZW50O1xuXG5cdFx0dGhpcy5ibGVuZFNyYyA9IHNvdXJjZS5ibGVuZFNyYztcblx0XHR0aGlzLmJsZW5kRHN0ID0gc291cmNlLmJsZW5kRHN0O1xuXHRcdHRoaXMuYmxlbmRFcXVhdGlvbiA9IHNvdXJjZS5ibGVuZEVxdWF0aW9uO1xuXHRcdHRoaXMuYmxlbmRTcmNBbHBoYSA9IHNvdXJjZS5ibGVuZFNyY0FscGhhO1xuXHRcdHRoaXMuYmxlbmREc3RBbHBoYSA9IHNvdXJjZS5ibGVuZERzdEFscGhhO1xuXHRcdHRoaXMuYmxlbmRFcXVhdGlvbkFscGhhID0gc291cmNlLmJsZW5kRXF1YXRpb25BbHBoYTtcblxuXHRcdHRoaXMuZGVwdGhGdW5jID0gc291cmNlLmRlcHRoRnVuYztcblx0XHR0aGlzLmRlcHRoVGVzdCA9IHNvdXJjZS5kZXB0aFRlc3Q7XG5cdFx0dGhpcy5kZXB0aFdyaXRlID0gc291cmNlLmRlcHRoV3JpdGU7XG5cblx0XHR0aGlzLmNvbG9yV3JpdGUgPSBzb3VyY2UuY29sb3JXcml0ZTtcblxuXHRcdHRoaXMucHJlY2lzaW9uID0gc291cmNlLnByZWNpc2lvbjtcblxuXHRcdHRoaXMucG9seWdvbk9mZnNldCA9IHNvdXJjZS5wb2x5Z29uT2Zmc2V0O1xuXHRcdHRoaXMucG9seWdvbk9mZnNldEZhY3RvciA9IHNvdXJjZS5wb2x5Z29uT2Zmc2V0RmFjdG9yO1xuXHRcdHRoaXMucG9seWdvbk9mZnNldFVuaXRzID0gc291cmNlLnBvbHlnb25PZmZzZXRVbml0cztcblxuXHRcdHRoaXMuZGl0aGVyaW5nID0gc291cmNlLmRpdGhlcmluZztcblxuXHRcdHRoaXMuYWxwaGFUZXN0ID0gc291cmNlLmFscGhhVGVzdDtcblxuXHRcdHRoaXMucHJlbXVsdGlwbGllZEFscGhhID0gc291cmNlLnByZW11bHRpcGxpZWRBbHBoYTtcblxuXHRcdHRoaXMub3ZlcmRyYXcgPSBzb3VyY2Uub3ZlcmRyYXc7XG5cblx0XHR0aGlzLnZpc2libGUgPSBzb3VyY2UudmlzaWJsZTtcblx0XHR0aGlzLmNsaXBTaGFkb3dzID0gc291cmNlLmNsaXBTaGFkb3dzO1xuXHRcdHRoaXMuY2xpcEludGVyc2VjdGlvbiA9IHNvdXJjZS5jbGlwSW50ZXJzZWN0aW9uO1xuXG5cdFx0dmFyIHNyY1BsYW5lcyA9IHNvdXJjZS5jbGlwcGluZ1BsYW5lcyxcblx0XHRcdGRzdFBsYW5lcyA9IG51bGw7XG5cblx0XHRpZiAoIHNyY1BsYW5lcyAhPT0gbnVsbCApIHtcblxuXHRcdFx0dmFyIG4gPSBzcmNQbGFuZXMubGVuZ3RoO1xuXHRcdFx0ZHN0UGxhbmVzID0gbmV3IEFycmF5KCBuICk7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMDsgaSAhPT0gbjsgKysgaSApXG5cdFx0XHRcdGRzdFBsYW5lc1sgaSBdID0gc3JjUGxhbmVzWyBpIF0uY2xvbmUoKTtcblxuXHRcdH1cblxuXHRcdHRoaXMuY2xpcHBpbmdQbGFuZXMgPSBkc3RQbGFuZXM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGRpc3Bvc2U6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuZGlzcGF0Y2hFdmVudCggeyB0eXBlOiAnZGlzcG9zZScgfSApO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKlxuICogcGFyYW1ldGVycyA9IHtcbiAqICBkZWZpbmVzOiB7IFwibGFiZWxcIiA6IFwidmFsdWVcIiB9LFxuICogIHVuaWZvcm1zOiB7IFwicGFyYW1ldGVyMVwiOiB7IHZhbHVlOiAxLjAgfSwgXCJwYXJhbWV0ZXIyXCI6IHsgdmFsdWUyOiAyIH0gfSxcbiAqXG4gKiAgZnJhZ21lbnRTaGFkZXI6IDxzdHJpbmc+LFxuICogIHZlcnRleFNoYWRlcjogPHN0cmluZz4sXG4gKlxuICogIHdpcmVmcmFtZTogPGJvb2xlYW4+LFxuICogIHdpcmVmcmFtZUxpbmV3aWR0aDogPGZsb2F0PixcbiAqXG4gKiAgbGlnaHRzOiA8Ym9vbD4sXG4gKlxuICogIHNraW5uaW5nOiA8Ym9vbD4sXG4gKiAgbW9ycGhUYXJnZXRzOiA8Ym9vbD4sXG4gKiAgbW9ycGhOb3JtYWxzOiA8Ym9vbD5cbiAqIH1cbiAqL1xuXG5mdW5jdGlvbiBTaGFkZXJNYXRlcmlhbCggcGFyYW1ldGVycyApIHtcblxuXHRNYXRlcmlhbC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1NoYWRlck1hdGVyaWFsJztcblxuXHR0aGlzLmRlZmluZXMgPSB7fTtcblx0dGhpcy51bmlmb3JtcyA9IHt9O1xuXG5cdHRoaXMudmVydGV4U2hhZGVyID0gJ3ZvaWQgbWFpbigpIHtcXG5cXHRnbF9Qb3NpdGlvbiA9IHByb2plY3Rpb25NYXRyaXggKiBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KCBwb3NpdGlvbiwgMS4wICk7XFxufSc7XG5cdHRoaXMuZnJhZ21lbnRTaGFkZXIgPSAndm9pZCBtYWluKCkge1xcblxcdGdsX0ZyYWdDb2xvciA9IHZlYzQoIDEuMCwgMC4wLCAwLjAsIDEuMCApO1xcbn0nO1xuXG5cdHRoaXMubGluZXdpZHRoID0gMTtcblxuXHR0aGlzLndpcmVmcmFtZSA9IGZhbHNlO1xuXHR0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IDE7XG5cblx0dGhpcy5mb2cgPSBmYWxzZTsgLy8gc2V0IHRvIHVzZSBzY2VuZSBmb2dcblx0dGhpcy5saWdodHMgPSBmYWxzZTsgLy8gc2V0IHRvIHVzZSBzY2VuZSBsaWdodHNcblx0dGhpcy5jbGlwcGluZyA9IGZhbHNlOyAvLyBzZXQgdG8gdXNlIHVzZXItZGVmaW5lZCBjbGlwcGluZyBwbGFuZXNcblxuXHR0aGlzLnNraW5uaW5nID0gZmFsc2U7IC8vIHNldCB0byB1c2Ugc2tpbm5pbmcgYXR0cmlidXRlIHN0cmVhbXNcblx0dGhpcy5tb3JwaFRhcmdldHMgPSBmYWxzZTsgLy8gc2V0IHRvIHVzZSBtb3JwaCB0YXJnZXRzXG5cdHRoaXMubW9ycGhOb3JtYWxzID0gZmFsc2U7IC8vIHNldCB0byB1c2UgbW9ycGggbm9ybWFsc1xuXG5cdHRoaXMuZXh0ZW5zaW9ucyA9IHtcblx0XHRkZXJpdmF0aXZlczogZmFsc2UsIC8vIHNldCB0byB1c2UgZGVyaXZhdGl2ZXNcblx0XHRmcmFnRGVwdGg6IGZhbHNlLCAvLyBzZXQgdG8gdXNlIGZyYWdtZW50IGRlcHRoIHZhbHVlc1xuXHRcdGRyYXdCdWZmZXJzOiBmYWxzZSwgLy8gc2V0IHRvIHVzZSBkcmF3IGJ1ZmZlcnNcblx0XHRzaGFkZXJUZXh0dXJlTE9EOiBmYWxzZSAvLyBzZXQgdG8gdXNlIHNoYWRlciB0ZXh0dXJlIExPRFxuXHR9O1xuXG5cdC8vIFdoZW4gcmVuZGVyZWQgZ2VvbWV0cnkgZG9lc24ndCBpbmNsdWRlIHRoZXNlIGF0dHJpYnV0ZXMgYnV0IHRoZSBtYXRlcmlhbCBkb2VzLFxuXHQvLyB1c2UgdGhlc2UgZGVmYXVsdCB2YWx1ZXMgaW4gV2ViR0wuIFRoaXMgYXZvaWRzIGVycm9ycyB3aGVuIGJ1ZmZlciBkYXRhIGlzIG1pc3NpbmcuXG5cdHRoaXMuZGVmYXVsdEF0dHJpYnV0ZVZhbHVlcyA9IHtcblx0XHQnY29sb3InOiBbIDEsIDEsIDEgXSxcblx0XHQndXYnOiBbIDAsIDAgXSxcblx0XHQndXYyJzogWyAwLCAwIF1cblx0fTtcblxuXHR0aGlzLmluZGV4MEF0dHJpYnV0ZU5hbWUgPSB1bmRlZmluZWQ7XG5cblx0aWYgKCBwYXJhbWV0ZXJzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRpZiAoIHBhcmFtZXRlcnMuYXR0cmlidXRlcyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuU2hhZGVyTWF0ZXJpYWw6IGF0dHJpYnV0ZXMgc2hvdWxkIG5vdyBiZSBkZWZpbmVkIGluIFRIUkVFLkJ1ZmZlckdlb21ldHJ5IGluc3RlYWQuJyApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTtcblxuXHR9XG5cbn1cblxuU2hhZGVyTWF0ZXJpYWwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTWF0ZXJpYWwucHJvdG90eXBlICk7XG5TaGFkZXJNYXRlcmlhbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBTaGFkZXJNYXRlcmlhbDtcblxuU2hhZGVyTWF0ZXJpYWwucHJvdG90eXBlLmlzU2hhZGVyTWF0ZXJpYWwgPSB0cnVlO1xuXG5TaGFkZXJNYXRlcmlhbC5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMuZnJhZ21lbnRTaGFkZXIgPSBzb3VyY2UuZnJhZ21lbnRTaGFkZXI7XG5cdHRoaXMudmVydGV4U2hhZGVyID0gc291cmNlLnZlcnRleFNoYWRlcjtcblxuXHR0aGlzLnVuaWZvcm1zID0gVW5pZm9ybXNVdGlscy5jbG9uZSggc291cmNlLnVuaWZvcm1zICk7XG5cblx0dGhpcy5kZWZpbmVzID0gc291cmNlLmRlZmluZXM7XG5cblx0dGhpcy53aXJlZnJhbWUgPSBzb3VyY2Uud2lyZWZyYW1lO1xuXHR0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IHNvdXJjZS53aXJlZnJhbWVMaW5ld2lkdGg7XG5cblx0dGhpcy5saWdodHMgPSBzb3VyY2UubGlnaHRzO1xuXHR0aGlzLmNsaXBwaW5nID0gc291cmNlLmNsaXBwaW5nO1xuXG5cdHRoaXMuc2tpbm5pbmcgPSBzb3VyY2Uuc2tpbm5pbmc7XG5cblx0dGhpcy5tb3JwaFRhcmdldHMgPSBzb3VyY2UubW9ycGhUYXJnZXRzO1xuXHR0aGlzLm1vcnBoTm9ybWFscyA9IHNvdXJjZS5tb3JwaE5vcm1hbHM7XG5cblx0dGhpcy5leHRlbnNpb25zID0gc291cmNlLmV4dGVuc2lvbnM7XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cblNoYWRlck1hdGVyaWFsLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoIG1ldGEgKSB7XG5cblx0dmFyIGRhdGEgPSBNYXRlcmlhbC5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMsIG1ldGEgKTtcblxuXHRkYXRhLnVuaWZvcm1zID0gdGhpcy51bmlmb3Jtcztcblx0ZGF0YS52ZXJ0ZXhTaGFkZXIgPSB0aGlzLnZlcnRleFNoYWRlcjtcblx0ZGF0YS5mcmFnbWVudFNoYWRlciA9IHRoaXMuZnJhZ21lbnRTaGFkZXI7XG5cblx0cmV0dXJuIGRhdGE7XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cHM6Ly9jbGFyYS5pb1xuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKlxuICogcGFyYW1ldGVycyA9IHtcbiAqXG4gKiAgb3BhY2l0eTogPGZsb2F0PixcbiAqXG4gKiAgbWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBhbHBoYU1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgZGlzcGxhY2VtZW50TWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGRpc3BsYWNlbWVudFNjYWxlOiA8ZmxvYXQ+LFxuICogIGRpc3BsYWNlbWVudEJpYXM6IDxmbG9hdD4sXG4gKlxuICogIHdpcmVmcmFtZTogPGJvb2xlYW4+LFxuICogIHdpcmVmcmFtZUxpbmV3aWR0aDogPGZsb2F0PlxuICogfVxuICovXG5cbmZ1bmN0aW9uIE1lc2hEZXB0aE1hdGVyaWFsKCBwYXJhbWV0ZXJzICkge1xuXG5cdE1hdGVyaWFsLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnTWVzaERlcHRoTWF0ZXJpYWwnO1xuXG5cdHRoaXMuZGVwdGhQYWNraW5nID0gQmFzaWNEZXB0aFBhY2tpbmc7XG5cblx0dGhpcy5za2lubmluZyA9IGZhbHNlO1xuXHR0aGlzLm1vcnBoVGFyZ2V0cyA9IGZhbHNlO1xuXG5cdHRoaXMubWFwID0gbnVsbDtcblxuXHR0aGlzLmFscGhhTWFwID0gbnVsbDtcblxuXHR0aGlzLmRpc3BsYWNlbWVudE1hcCA9IG51bGw7XG5cdHRoaXMuZGlzcGxhY2VtZW50U2NhbGUgPSAxO1xuXHR0aGlzLmRpc3BsYWNlbWVudEJpYXMgPSAwO1xuXG5cdHRoaXMud2lyZWZyYW1lID0gZmFsc2U7XG5cdHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gMTtcblxuXHR0aGlzLmZvZyA9IGZhbHNlO1xuXHR0aGlzLmxpZ2h0cyA9IGZhbHNlO1xuXG5cdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XG5cbn1cblxuTWVzaERlcHRoTWF0ZXJpYWwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTWF0ZXJpYWwucHJvdG90eXBlICk7XG5NZXNoRGVwdGhNYXRlcmlhbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNZXNoRGVwdGhNYXRlcmlhbDtcblxuTWVzaERlcHRoTWF0ZXJpYWwucHJvdG90eXBlLmlzTWVzaERlcHRoTWF0ZXJpYWwgPSB0cnVlO1xuXG5NZXNoRGVwdGhNYXRlcmlhbC5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMuZGVwdGhQYWNraW5nID0gc291cmNlLmRlcHRoUGFja2luZztcblxuXHR0aGlzLnNraW5uaW5nID0gc291cmNlLnNraW5uaW5nO1xuXHR0aGlzLm1vcnBoVGFyZ2V0cyA9IHNvdXJjZS5tb3JwaFRhcmdldHM7XG5cblx0dGhpcy5tYXAgPSBzb3VyY2UubWFwO1xuXG5cdHRoaXMuYWxwaGFNYXAgPSBzb3VyY2UuYWxwaGFNYXA7XG5cblx0dGhpcy5kaXNwbGFjZW1lbnRNYXAgPSBzb3VyY2UuZGlzcGxhY2VtZW50TWFwO1xuXHR0aGlzLmRpc3BsYWNlbWVudFNjYWxlID0gc291cmNlLmRpc3BsYWNlbWVudFNjYWxlO1xuXHR0aGlzLmRpc3BsYWNlbWVudEJpYXMgPSBzb3VyY2UuZGlzcGxhY2VtZW50QmlhcztcblxuXHR0aGlzLndpcmVmcmFtZSA9IHNvdXJjZS53aXJlZnJhbWU7XG5cdHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gc291cmNlLndpcmVmcmFtZUxpbmV3aWR0aDtcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqL1xuXG5mdW5jdGlvbiBCb3gzKCBtaW4sIG1heCApIHtcblxuXHR0aGlzLm1pbiA9ICggbWluICE9PSB1bmRlZmluZWQgKSA/IG1pbiA6IG5ldyBWZWN0b3IzKCArIEluZmluaXR5LCArIEluZmluaXR5LCArIEluZmluaXR5ICk7XG5cdHRoaXMubWF4ID0gKCBtYXggIT09IHVuZGVmaW5lZCApID8gbWF4IDogbmV3IFZlY3RvcjMoIC0gSW5maW5pdHksIC0gSW5maW5pdHksIC0gSW5maW5pdHkgKTtcblxufVxuXG5PYmplY3QuYXNzaWduKCBCb3gzLnByb3RvdHlwZSwge1xuXG5cdGlzQm94MzogdHJ1ZSxcblxuXHRzZXQ6IGZ1bmN0aW9uICggbWluLCBtYXggKSB7XG5cblx0XHR0aGlzLm1pbi5jb3B5KCBtaW4gKTtcblx0XHR0aGlzLm1heC5jb3B5KCBtYXggKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbUFycmF5OiBmdW5jdGlvbiAoIGFycmF5ICkge1xuXG5cdFx0dmFyIG1pblggPSArIEluZmluaXR5O1xuXHRcdHZhciBtaW5ZID0gKyBJbmZpbml0eTtcblx0XHR2YXIgbWluWiA9ICsgSW5maW5pdHk7XG5cblx0XHR2YXIgbWF4WCA9IC0gSW5maW5pdHk7XG5cdFx0dmFyIG1heFkgPSAtIEluZmluaXR5O1xuXHRcdHZhciBtYXhaID0gLSBJbmZpbml0eTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGFycmF5Lmxlbmd0aDsgaSA8IGw7IGkgKz0gMyApIHtcblxuXHRcdFx0dmFyIHggPSBhcnJheVsgaSBdO1xuXHRcdFx0dmFyIHkgPSBhcnJheVsgaSArIDEgXTtcblx0XHRcdHZhciB6ID0gYXJyYXlbIGkgKyAyIF07XG5cblx0XHRcdGlmICggeCA8IG1pblggKSBtaW5YID0geDtcblx0XHRcdGlmICggeSA8IG1pblkgKSBtaW5ZID0geTtcblx0XHRcdGlmICggeiA8IG1pblogKSBtaW5aID0gejtcblxuXHRcdFx0aWYgKCB4ID4gbWF4WCApIG1heFggPSB4O1xuXHRcdFx0aWYgKCB5ID4gbWF4WSApIG1heFkgPSB5O1xuXHRcdFx0aWYgKCB6ID4gbWF4WiApIG1heFogPSB6O1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5taW4uc2V0KCBtaW5YLCBtaW5ZLCBtaW5aICk7XG5cdFx0dGhpcy5tYXguc2V0KCBtYXhYLCBtYXhZLCBtYXhaICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21CdWZmZXJBdHRyaWJ1dGU6IGZ1bmN0aW9uICggYXR0cmlidXRlICkge1xuXG5cdFx0dmFyIG1pblggPSArIEluZmluaXR5O1xuXHRcdHZhciBtaW5ZID0gKyBJbmZpbml0eTtcblx0XHR2YXIgbWluWiA9ICsgSW5maW5pdHk7XG5cblx0XHR2YXIgbWF4WCA9IC0gSW5maW5pdHk7XG5cdFx0dmFyIG1heFkgPSAtIEluZmluaXR5O1xuXHRcdHZhciBtYXhaID0gLSBJbmZpbml0eTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGF0dHJpYnV0ZS5jb3VudDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciB4ID0gYXR0cmlidXRlLmdldFgoIGkgKTtcblx0XHRcdHZhciB5ID0gYXR0cmlidXRlLmdldFkoIGkgKTtcblx0XHRcdHZhciB6ID0gYXR0cmlidXRlLmdldFooIGkgKTtcblxuXHRcdFx0aWYgKCB4IDwgbWluWCApIG1pblggPSB4O1xuXHRcdFx0aWYgKCB5IDwgbWluWSApIG1pblkgPSB5O1xuXHRcdFx0aWYgKCB6IDwgbWluWiApIG1pblogPSB6O1xuXG5cdFx0XHRpZiAoIHggPiBtYXhYICkgbWF4WCA9IHg7XG5cdFx0XHRpZiAoIHkgPiBtYXhZICkgbWF4WSA9IHk7XG5cdFx0XHRpZiAoIHogPiBtYXhaICkgbWF4WiA9IHo7XG5cblx0XHR9XG5cblx0XHR0aGlzLm1pbi5zZXQoIG1pblgsIG1pblksIG1pblogKTtcblx0XHR0aGlzLm1heC5zZXQoIG1heFgsIG1heFksIG1heFogKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbVBvaW50czogZnVuY3Rpb24gKCBwb2ludHMgKSB7XG5cblx0XHR0aGlzLm1ha2VFbXB0eSgpO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IHBvaW50cy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0dGhpcy5leHBhbmRCeVBvaW50KCBwb2ludHNbIGkgXSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRGcm9tQ2VudGVyQW5kU2l6ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBzZXRGcm9tQ2VudGVyQW5kU2l6ZSggY2VudGVyLCBzaXplICkge1xuXG5cdFx0XHR2YXIgaGFsZlNpemUgPSB2MS5jb3B5KCBzaXplICkubXVsdGlwbHlTY2FsYXIoIDAuNSApO1xuXG5cdFx0XHR0aGlzLm1pbi5jb3B5KCBjZW50ZXIgKS5zdWIoIGhhbGZTaXplICk7XG5cdFx0XHR0aGlzLm1heC5jb3B5KCBjZW50ZXIgKS5hZGQoIGhhbGZTaXplICk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0c2V0RnJvbU9iamVjdDogZnVuY3Rpb24gKCBvYmplY3QgKSB7XG5cblx0XHR0aGlzLm1ha2VFbXB0eSgpO1xuXG5cdFx0cmV0dXJuIHRoaXMuZXhwYW5kQnlPYmplY3QoIG9iamVjdCApO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggYm94ICkge1xuXG5cdFx0dGhpcy5taW4uY29weSggYm94Lm1pbiApO1xuXHRcdHRoaXMubWF4LmNvcHkoIGJveC5tYXggKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bWFrZUVtcHR5OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLm1pbi54ID0gdGhpcy5taW4ueSA9IHRoaXMubWluLnogPSArIEluZmluaXR5O1xuXHRcdHRoaXMubWF4LnggPSB0aGlzLm1heC55ID0gdGhpcy5tYXgueiA9IC0gSW5maW5pdHk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGlzRW1wdHk6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIHRoaXMgaXMgYSBtb3JlIHJvYnVzdCBjaGVjayBmb3IgZW1wdHkgdGhhbiAoIHZvbHVtZSA8PSAwICkgYmVjYXVzZSB2b2x1bWUgY2FuIGdldCBwb3NpdGl2ZSB3aXRoIHR3byBuZWdhdGl2ZSBheGVzXG5cblx0XHRyZXR1cm4gKCB0aGlzLm1heC54IDwgdGhpcy5taW4ueCApIHx8ICggdGhpcy5tYXgueSA8IHRoaXMubWluLnkgKSB8fCAoIHRoaXMubWF4LnogPCB0aGlzLm1pbi56ICk7XG5cblx0fSxcblxuXHRnZXRDZW50ZXI6IGZ1bmN0aW9uICggb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0XHR2YXIgcmVzdWx0ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IFZlY3RvcjMoKTtcblx0XHRyZXR1cm4gdGhpcy5pc0VtcHR5KCkgPyByZXN1bHQuc2V0KCAwLCAwLCAwICkgOiByZXN1bHQuYWRkVmVjdG9ycyggdGhpcy5taW4sIHRoaXMubWF4ICkubXVsdGlwbHlTY2FsYXIoIDAuNSApO1xuXG5cdH0sXG5cblx0Z2V0U2l6ZTogZnVuY3Rpb24gKCBvcHRpb25hbFRhcmdldCApIHtcblxuXHRcdHZhciByZXN1bHQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMygpO1xuXHRcdHJldHVybiB0aGlzLmlzRW1wdHkoKSA/IHJlc3VsdC5zZXQoIDAsIDAsIDAgKSA6IHJlc3VsdC5zdWJWZWN0b3JzKCB0aGlzLm1heCwgdGhpcy5taW4gKTtcblxuXHR9LFxuXG5cdGV4cGFuZEJ5UG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQgKSB7XG5cblx0XHR0aGlzLm1pbi5taW4oIHBvaW50ICk7XG5cdFx0dGhpcy5tYXgubWF4KCBwb2ludCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRleHBhbmRCeVZlY3RvcjogZnVuY3Rpb24gKCB2ZWN0b3IgKSB7XG5cblx0XHR0aGlzLm1pbi5zdWIoIHZlY3RvciApO1xuXHRcdHRoaXMubWF4LmFkZCggdmVjdG9yICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGV4cGFuZEJ5U2NhbGFyOiBmdW5jdGlvbiAoIHNjYWxhciApIHtcblxuXHRcdHRoaXMubWluLmFkZFNjYWxhciggLSBzY2FsYXIgKTtcblx0XHR0aGlzLm1heC5hZGRTY2FsYXIoIHNjYWxhciApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRleHBhbmRCeU9iamVjdDogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gQ29tcHV0ZXMgdGhlIHdvcmxkLWF4aXMtYWxpZ25lZCBib3VuZGluZyBib3ggb2YgYW4gb2JqZWN0IChpbmNsdWRpbmcgaXRzIGNoaWxkcmVuKSxcblx0XHQvLyBhY2NvdW50aW5nIGZvciBib3RoIHRoZSBvYmplY3QncywgYW5kIGNoaWxkcmVuJ3MsIHdvcmxkIHRyYW5zZm9ybXNcblxuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gZXhwYW5kQnlPYmplY3QoIG9iamVjdCApIHtcblxuXHRcdFx0dmFyIHNjb3BlID0gdGhpcztcblxuXHRcdFx0b2JqZWN0LnVwZGF0ZU1hdHJpeFdvcmxkKCB0cnVlICk7XG5cblx0XHRcdG9iamVjdC50cmF2ZXJzZSggZnVuY3Rpb24gKCBub2RlICkge1xuXG5cdFx0XHRcdHZhciBpLCBsO1xuXG5cdFx0XHRcdHZhciBnZW9tZXRyeSA9IG5vZGUuZ2VvbWV0cnk7XG5cblx0XHRcdFx0aWYgKCBnZW9tZXRyeSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0aWYgKCBnZW9tZXRyeS5pc0dlb21ldHJ5ICkge1xuXG5cdFx0XHRcdFx0XHR2YXIgdmVydGljZXMgPSBnZW9tZXRyeS52ZXJ0aWNlcztcblxuXHRcdFx0XHRcdFx0Zm9yICggaSA9IDAsIGwgPSB2ZXJ0aWNlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0XHRcdHYxLmNvcHkoIHZlcnRpY2VzWyBpIF0gKTtcblx0XHRcdFx0XHRcdFx0djEuYXBwbHlNYXRyaXg0KCBub2RlLm1hdHJpeFdvcmxkICk7XG5cblx0XHRcdFx0XHRcdFx0c2NvcGUuZXhwYW5kQnlQb2ludCggdjEgKTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fSBlbHNlIGlmICggZ2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSApIHtcblxuXHRcdFx0XHRcdFx0dmFyIGF0dHJpYnV0ZSA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247XG5cblx0XHRcdFx0XHRcdGlmICggYXR0cmlidXRlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRcdFx0Zm9yICggaSA9IDAsIGwgPSBhdHRyaWJ1dGUuY291bnQ7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0djEuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggYXR0cmlidXRlLCBpICkuYXBwbHlNYXRyaXg0KCBub2RlLm1hdHJpeFdvcmxkICk7XG5cblx0XHRcdFx0XHRcdFx0XHRzY29wZS5leHBhbmRCeVBvaW50KCB2MSApO1xuXG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGNvbnRhaW5zUG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQgKSB7XG5cblx0XHRyZXR1cm4gcG9pbnQueCA8IHRoaXMubWluLnggfHwgcG9pbnQueCA+IHRoaXMubWF4LnggfHxcblx0XHRcdHBvaW50LnkgPCB0aGlzLm1pbi55IHx8IHBvaW50LnkgPiB0aGlzLm1heC55IHx8XG5cdFx0XHRwb2ludC56IDwgdGhpcy5taW4ueiB8fCBwb2ludC56ID4gdGhpcy5tYXgueiA/IGZhbHNlIDogdHJ1ZTtcblxuXHR9LFxuXG5cdGNvbnRhaW5zQm94OiBmdW5jdGlvbiAoIGJveCApIHtcblxuXHRcdHJldHVybiB0aGlzLm1pbi54IDw9IGJveC5taW4ueCAmJiBib3gubWF4LnggPD0gdGhpcy5tYXgueCAmJlxuXHRcdFx0dGhpcy5taW4ueSA8PSBib3gubWluLnkgJiYgYm94Lm1heC55IDw9IHRoaXMubWF4LnkgJiZcblx0XHRcdHRoaXMubWluLnogPD0gYm94Lm1pbi56ICYmIGJveC5tYXgueiA8PSB0aGlzLm1heC56O1xuXG5cdH0sXG5cblx0Z2V0UGFyYW1ldGVyOiBmdW5jdGlvbiAoIHBvaW50LCBvcHRpb25hbFRhcmdldCApIHtcblxuXHRcdC8vIFRoaXMgY2FuIHBvdGVudGlhbGx5IGhhdmUgYSBkaXZpZGUgYnkgemVybyBpZiB0aGUgYm94XG5cdFx0Ly8gaGFzIGEgc2l6ZSBkaW1lbnNpb24gb2YgMC5cblxuXHRcdHZhciByZXN1bHQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIHJlc3VsdC5zZXQoXG5cdFx0XHQoIHBvaW50LnggLSB0aGlzLm1pbi54ICkgLyAoIHRoaXMubWF4LnggLSB0aGlzLm1pbi54ICksXG5cdFx0XHQoIHBvaW50LnkgLSB0aGlzLm1pbi55ICkgLyAoIHRoaXMubWF4LnkgLSB0aGlzLm1pbi55ICksXG5cdFx0XHQoIHBvaW50LnogLSB0aGlzLm1pbi56ICkgLyAoIHRoaXMubWF4LnogLSB0aGlzLm1pbi56IClcblx0XHQpO1xuXG5cdH0sXG5cblx0aW50ZXJzZWN0c0JveDogZnVuY3Rpb24gKCBib3ggKSB7XG5cblx0XHQvLyB1c2luZyA2IHNwbGl0dGluZyBwbGFuZXMgdG8gcnVsZSBvdXQgaW50ZXJzZWN0aW9ucy5cblx0XHRyZXR1cm4gYm94Lm1heC54IDwgdGhpcy5taW4ueCB8fCBib3gubWluLnggPiB0aGlzLm1heC54IHx8XG5cdFx0XHRib3gubWF4LnkgPCB0aGlzLm1pbi55IHx8IGJveC5taW4ueSA+IHRoaXMubWF4LnkgfHxcblx0XHRcdGJveC5tYXgueiA8IHRoaXMubWluLnogfHwgYm94Lm1pbi56ID4gdGhpcy5tYXgueiA/IGZhbHNlIDogdHJ1ZTtcblxuXHR9LFxuXG5cdGludGVyc2VjdHNTcGhlcmU6ICggZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGNsb3Nlc3RQb2ludCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gaW50ZXJzZWN0c1NwaGVyZSggc3BoZXJlICkge1xuXG5cdFx0XHQvLyBGaW5kIHRoZSBwb2ludCBvbiB0aGUgQUFCQiBjbG9zZXN0IHRvIHRoZSBzcGhlcmUgY2VudGVyLlxuXHRcdFx0dGhpcy5jbGFtcFBvaW50KCBzcGhlcmUuY2VudGVyLCBjbG9zZXN0UG9pbnQgKTtcblxuXHRcdFx0Ly8gSWYgdGhhdCBwb2ludCBpcyBpbnNpZGUgdGhlIHNwaGVyZSwgdGhlIEFBQkIgYW5kIHNwaGVyZSBpbnRlcnNlY3QuXG5cdFx0XHRyZXR1cm4gY2xvc2VzdFBvaW50LmRpc3RhbmNlVG9TcXVhcmVkKCBzcGhlcmUuY2VudGVyICkgPD0gKCBzcGhlcmUucmFkaXVzICogc3BoZXJlLnJhZGl1cyApO1xuXG5cdFx0fTtcblxuXHR9ICkoKSxcblxuXHRpbnRlcnNlY3RzUGxhbmU6IGZ1bmN0aW9uICggcGxhbmUgKSB7XG5cblx0XHQvLyBXZSBjb21wdXRlIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIGRvdCBwcm9kdWN0IHZhbHVlcy4gSWYgdGhvc2UgdmFsdWVzXG5cdFx0Ly8gYXJlIG9uIHRoZSBzYW1lIHNpZGUgKGJhY2sgb3IgZnJvbnQpIG9mIHRoZSBwbGFuZSwgdGhlbiB0aGVyZSBpcyBubyBpbnRlcnNlY3Rpb24uXG5cblx0XHR2YXIgbWluLCBtYXg7XG5cblx0XHRpZiAoIHBsYW5lLm5vcm1hbC54ID4gMCApIHtcblxuXHRcdFx0bWluID0gcGxhbmUubm9ybWFsLnggKiB0aGlzLm1pbi54O1xuXHRcdFx0bWF4ID0gcGxhbmUubm9ybWFsLnggKiB0aGlzLm1heC54O1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0bWluID0gcGxhbmUubm9ybWFsLnggKiB0aGlzLm1heC54O1xuXHRcdFx0bWF4ID0gcGxhbmUubm9ybWFsLnggKiB0aGlzLm1pbi54O1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBwbGFuZS5ub3JtYWwueSA+IDAgKSB7XG5cblx0XHRcdG1pbiArPSBwbGFuZS5ub3JtYWwueSAqIHRoaXMubWluLnk7XG5cdFx0XHRtYXggKz0gcGxhbmUubm9ybWFsLnkgKiB0aGlzLm1heC55O1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0bWluICs9IHBsYW5lLm5vcm1hbC55ICogdGhpcy5tYXgueTtcblx0XHRcdG1heCArPSBwbGFuZS5ub3JtYWwueSAqIHRoaXMubWluLnk7XG5cblx0XHR9XG5cblx0XHRpZiAoIHBsYW5lLm5vcm1hbC56ID4gMCApIHtcblxuXHRcdFx0bWluICs9IHBsYW5lLm5vcm1hbC56ICogdGhpcy5taW4uejtcblx0XHRcdG1heCArPSBwbGFuZS5ub3JtYWwueiAqIHRoaXMubWF4Lno7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRtaW4gKz0gcGxhbmUubm9ybWFsLnogKiB0aGlzLm1heC56O1xuXHRcdFx0bWF4ICs9IHBsYW5lLm5vcm1hbC56ICogdGhpcy5taW4uejtcblxuXHRcdH1cblxuXHRcdHJldHVybiAoIG1pbiA8PSBwbGFuZS5jb25zdGFudCAmJiBtYXggPj0gcGxhbmUuY29uc3RhbnQgKTtcblxuXHR9LFxuXG5cdGNsYW1wUG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQsIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdFx0dmFyIHJlc3VsdCA9IG9wdGlvbmFsVGFyZ2V0IHx8IG5ldyBWZWN0b3IzKCk7XG5cdFx0cmV0dXJuIHJlc3VsdC5jb3B5KCBwb2ludCApLmNsYW1wKCB0aGlzLm1pbiwgdGhpcy5tYXggKTtcblxuXHR9LFxuXG5cdGRpc3RhbmNlVG9Qb2ludDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBkaXN0YW5jZVRvUG9pbnQoIHBvaW50ICkge1xuXG5cdFx0XHR2YXIgY2xhbXBlZFBvaW50ID0gdjEuY29weSggcG9pbnQgKS5jbGFtcCggdGhpcy5taW4sIHRoaXMubWF4ICk7XG5cdFx0XHRyZXR1cm4gY2xhbXBlZFBvaW50LnN1YiggcG9pbnQgKS5sZW5ndGgoKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGdldEJvdW5kaW5nU3BoZXJlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGdldEJvdW5kaW5nU3BoZXJlKCBvcHRpb25hbFRhcmdldCApIHtcblxuXHRcdFx0dmFyIHJlc3VsdCA9IG9wdGlvbmFsVGFyZ2V0IHx8IG5ldyBTcGhlcmUoKTtcblxuXHRcdFx0dGhpcy5nZXRDZW50ZXIoIHJlc3VsdC5jZW50ZXIgKTtcblxuXHRcdFx0cmVzdWx0LnJhZGl1cyA9IHRoaXMuZ2V0U2l6ZSggdjEgKS5sZW5ndGgoKSAqIDAuNTtcblxuXHRcdFx0cmV0dXJuIHJlc3VsdDtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGludGVyc2VjdDogZnVuY3Rpb24gKCBib3ggKSB7XG5cblx0XHR0aGlzLm1pbi5tYXgoIGJveC5taW4gKTtcblx0XHR0aGlzLm1heC5taW4oIGJveC5tYXggKTtcblxuXHRcdC8vIGVuc3VyZSB0aGF0IGlmIHRoZXJlIGlzIG5vIG92ZXJsYXAsIHRoZSByZXN1bHQgaXMgZnVsbHkgZW1wdHksIG5vdCBzbGlnaHRseSBlbXB0eSB3aXRoIG5vbi1pbmYvK2luZiB2YWx1ZXMgdGhhdCB3aWxsIGNhdXNlIHN1YnNlcXVlbmNlIGludGVyc2VjdHMgdG8gZXJyb25lb3VzbHkgcmV0dXJuIHZhbGlkIHZhbHVlcy5cblx0XHRpZiggdGhpcy5pc0VtcHR5KCkgKSB0aGlzLm1ha2VFbXB0eSgpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHR1bmlvbjogZnVuY3Rpb24gKCBib3ggKSB7XG5cblx0XHR0aGlzLm1pbi5taW4oIGJveC5taW4gKTtcblx0XHR0aGlzLm1heC5tYXgoIGJveC5tYXggKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YXBwbHlNYXRyaXg0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgcG9pbnRzID0gW1xuXHRcdFx0bmV3IFZlY3RvcjMoKSxcblx0XHRcdG5ldyBWZWN0b3IzKCksXG5cdFx0XHRuZXcgVmVjdG9yMygpLFxuXHRcdFx0bmV3IFZlY3RvcjMoKSxcblx0XHRcdG5ldyBWZWN0b3IzKCksXG5cdFx0XHRuZXcgVmVjdG9yMygpLFxuXHRcdFx0bmV3IFZlY3RvcjMoKSxcblx0XHRcdG5ldyBWZWN0b3IzKClcblx0XHRdO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGFwcGx5TWF0cml4NCggbWF0cml4ICkge1xuXG5cdFx0XHQvLyB0cmFuc2Zvcm0gb2YgZW1wdHkgYm94IGlzIGFuIGVtcHR5IGJveC5cblx0XHRcdGlmKCB0aGlzLmlzRW1wdHkoKSApIHJldHVybiB0aGlzO1xuXG5cdFx0XHQvLyBOT1RFOiBJIGFtIHVzaW5nIGEgYmluYXJ5IHBhdHRlcm4gdG8gc3BlY2lmeSBhbGwgMl4zIGNvbWJpbmF0aW9ucyBiZWxvd1xuXHRcdFx0cG9pbnRzWyAwIF0uc2V0KCB0aGlzLm1pbi54LCB0aGlzLm1pbi55LCB0aGlzLm1pbi56ICkuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTsgLy8gMDAwXG5cdFx0XHRwb2ludHNbIDEgXS5zZXQoIHRoaXMubWluLngsIHRoaXMubWluLnksIHRoaXMubWF4LnogKS5hcHBseU1hdHJpeDQoIG1hdHJpeCApOyAvLyAwMDFcblx0XHRcdHBvaW50c1sgMiBdLnNldCggdGhpcy5taW4ueCwgdGhpcy5tYXgueSwgdGhpcy5taW4ueiApLmFwcGx5TWF0cml4NCggbWF0cml4ICk7IC8vIDAxMFxuXHRcdFx0cG9pbnRzWyAzIF0uc2V0KCB0aGlzLm1pbi54LCB0aGlzLm1heC55LCB0aGlzLm1heC56ICkuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTsgLy8gMDExXG5cdFx0XHRwb2ludHNbIDQgXS5zZXQoIHRoaXMubWF4LngsIHRoaXMubWluLnksIHRoaXMubWluLnogKS5hcHBseU1hdHJpeDQoIG1hdHJpeCApOyAvLyAxMDBcblx0XHRcdHBvaW50c1sgNSBdLnNldCggdGhpcy5tYXgueCwgdGhpcy5taW4ueSwgdGhpcy5tYXgueiApLmFwcGx5TWF0cml4NCggbWF0cml4ICk7IC8vIDEwMVxuXHRcdFx0cG9pbnRzWyA2IF0uc2V0KCB0aGlzLm1heC54LCB0aGlzLm1heC55LCB0aGlzLm1pbi56ICkuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTsgLy8gMTEwXG5cdFx0XHRwb2ludHNbIDcgXS5zZXQoIHRoaXMubWF4LngsIHRoaXMubWF4LnksIHRoaXMubWF4LnogKS5hcHBseU1hdHJpeDQoIG1hdHJpeCApO1x0Ly8gMTExXG5cblx0XHRcdHRoaXMuc2V0RnJvbVBvaW50cyggcG9pbnRzICk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0dHJhbnNsYXRlOiBmdW5jdGlvbiAoIG9mZnNldCApIHtcblxuXHRcdHRoaXMubWluLmFkZCggb2Zmc2V0ICk7XG5cdFx0dGhpcy5tYXguYWRkKCBvZmZzZXQgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZXF1YWxzOiBmdW5jdGlvbiAoIGJveCApIHtcblxuXHRcdHJldHVybiBib3gubWluLmVxdWFscyggdGhpcy5taW4gKSAmJiBib3gubWF4LmVxdWFscyggdGhpcy5tYXggKTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIFNwaGVyZSggY2VudGVyLCByYWRpdXMgKSB7XG5cblx0dGhpcy5jZW50ZXIgPSAoIGNlbnRlciAhPT0gdW5kZWZpbmVkICkgPyBjZW50ZXIgOiBuZXcgVmVjdG9yMygpO1xuXHR0aGlzLnJhZGl1cyA9ICggcmFkaXVzICE9PSB1bmRlZmluZWQgKSA/IHJhZGl1cyA6IDA7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggU3BoZXJlLnByb3RvdHlwZSwge1xuXG5cdHNldDogZnVuY3Rpb24gKCBjZW50ZXIsIHJhZGl1cyApIHtcblxuXHRcdHRoaXMuY2VudGVyLmNvcHkoIGNlbnRlciApO1xuXHRcdHRoaXMucmFkaXVzID0gcmFkaXVzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRGcm9tUG9pbnRzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgYm94ID0gbmV3IEJveDMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBzZXRGcm9tUG9pbnRzKCBwb2ludHMsIG9wdGlvbmFsQ2VudGVyICkge1xuXG5cdFx0XHR2YXIgY2VudGVyID0gdGhpcy5jZW50ZXI7XG5cblx0XHRcdGlmICggb3B0aW9uYWxDZW50ZXIgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRjZW50ZXIuY29weSggb3B0aW9uYWxDZW50ZXIgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRib3guc2V0RnJvbVBvaW50cyggcG9pbnRzICkuZ2V0Q2VudGVyKCBjZW50ZXIgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgbWF4UmFkaXVzU3EgPSAwO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gcG9pbnRzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdG1heFJhZGl1c1NxID0gTWF0aC5tYXgoIG1heFJhZGl1c1NxLCBjZW50ZXIuZGlzdGFuY2VUb1NxdWFyZWQoIHBvaW50c1sgaSBdICkgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLnJhZGl1cyA9IE1hdGguc3FydCggbWF4UmFkaXVzU3EgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBzcGhlcmUgKSB7XG5cblx0XHR0aGlzLmNlbnRlci5jb3B5KCBzcGhlcmUuY2VudGVyICk7XG5cdFx0dGhpcy5yYWRpdXMgPSBzcGhlcmUucmFkaXVzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRlbXB0eTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuICggdGhpcy5yYWRpdXMgPD0gMCApO1xuXG5cdH0sXG5cblx0Y29udGFpbnNQb2ludDogZnVuY3Rpb24gKCBwb2ludCApIHtcblxuXHRcdHJldHVybiAoIHBvaW50LmRpc3RhbmNlVG9TcXVhcmVkKCB0aGlzLmNlbnRlciApIDw9ICggdGhpcy5yYWRpdXMgKiB0aGlzLnJhZGl1cyApICk7XG5cblx0fSxcblxuXHRkaXN0YW5jZVRvUG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQgKSB7XG5cblx0XHRyZXR1cm4gKCBwb2ludC5kaXN0YW5jZVRvKCB0aGlzLmNlbnRlciApIC0gdGhpcy5yYWRpdXMgKTtcblxuXHR9LFxuXG5cdGludGVyc2VjdHNTcGhlcmU6IGZ1bmN0aW9uICggc3BoZXJlICkge1xuXG5cdFx0dmFyIHJhZGl1c1N1bSA9IHRoaXMucmFkaXVzICsgc3BoZXJlLnJhZGl1cztcblxuXHRcdHJldHVybiBzcGhlcmUuY2VudGVyLmRpc3RhbmNlVG9TcXVhcmVkKCB0aGlzLmNlbnRlciApIDw9ICggcmFkaXVzU3VtICogcmFkaXVzU3VtICk7XG5cblx0fSxcblxuXHRpbnRlcnNlY3RzQm94OiBmdW5jdGlvbiAoIGJveCApIHtcblxuXHRcdHJldHVybiBib3guaW50ZXJzZWN0c1NwaGVyZSggdGhpcyApO1xuXG5cdH0sXG5cblx0aW50ZXJzZWN0c1BsYW5lOiBmdW5jdGlvbiAoIHBsYW5lICkge1xuXG5cdFx0Ly8gV2UgdXNlIHRoZSBmb2xsb3dpbmcgZXF1YXRpb24gdG8gY29tcHV0ZSB0aGUgc2lnbmVkIGRpc3RhbmNlIGZyb21cblx0XHQvLyB0aGUgY2VudGVyIG9mIHRoZSBzcGhlcmUgdG8gdGhlIHBsYW5lLlxuXHRcdC8vXG5cdFx0Ly8gZGlzdGFuY2UgPSBxICogbiAtIGRcblx0XHQvL1xuXHRcdC8vIElmIHRoaXMgZGlzdGFuY2UgaXMgZ3JlYXRlciB0aGFuIHRoZSByYWRpdXMgb2YgdGhlIHNwaGVyZSxcblx0XHQvLyB0aGVuIHRoZXJlIGlzIG5vIGludGVyc2VjdGlvbi5cblxuXHRcdHJldHVybiBNYXRoLmFicyggdGhpcy5jZW50ZXIuZG90KCBwbGFuZS5ub3JtYWwgKSAtIHBsYW5lLmNvbnN0YW50ICkgPD0gdGhpcy5yYWRpdXM7XG5cblx0fSxcblxuXHRjbGFtcFBvaW50OiBmdW5jdGlvbiAoIHBvaW50LCBvcHRpb25hbFRhcmdldCApIHtcblxuXHRcdHZhciBkZWx0YUxlbmd0aFNxID0gdGhpcy5jZW50ZXIuZGlzdGFuY2VUb1NxdWFyZWQoIHBvaW50ICk7XG5cblx0XHR2YXIgcmVzdWx0ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJlc3VsdC5jb3B5KCBwb2ludCApO1xuXG5cdFx0aWYgKCBkZWx0YUxlbmd0aFNxID4gKCB0aGlzLnJhZGl1cyAqIHRoaXMucmFkaXVzICkgKSB7XG5cblx0XHRcdHJlc3VsdC5zdWIoIHRoaXMuY2VudGVyICkubm9ybWFsaXplKCk7XG5cdFx0XHRyZXN1bHQubXVsdGlwbHlTY2FsYXIoIHRoaXMucmFkaXVzICkuYWRkKCB0aGlzLmNlbnRlciApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblxuXHR9LFxuXG5cdGdldEJvdW5kaW5nQm94OiBmdW5jdGlvbiAoIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdFx0dmFyIGJveCA9IG9wdGlvbmFsVGFyZ2V0IHx8IG5ldyBCb3gzKCk7XG5cblx0XHRib3guc2V0KCB0aGlzLmNlbnRlciwgdGhpcy5jZW50ZXIgKTtcblx0XHRib3guZXhwYW5kQnlTY2FsYXIoIHRoaXMucmFkaXVzICk7XG5cblx0XHRyZXR1cm4gYm94O1xuXG5cdH0sXG5cblx0YXBwbHlNYXRyaXg0OiBmdW5jdGlvbiAoIG1hdHJpeCApIHtcblxuXHRcdHRoaXMuY2VudGVyLmFwcGx5TWF0cml4NCggbWF0cml4ICk7XG5cdFx0dGhpcy5yYWRpdXMgPSB0aGlzLnJhZGl1cyAqIG1hdHJpeC5nZXRNYXhTY2FsZU9uQXhpcygpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHR0cmFuc2xhdGU6IGZ1bmN0aW9uICggb2Zmc2V0ICkge1xuXG5cdFx0dGhpcy5jZW50ZXIuYWRkKCBvZmZzZXQgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZXF1YWxzOiBmdW5jdGlvbiAoIHNwaGVyZSApIHtcblxuXHRcdHJldHVybiBzcGhlcmUuY2VudGVyLmVxdWFscyggdGhpcy5jZW50ZXIgKSAmJiAoIHNwaGVyZS5yYWRpdXMgPT09IHRoaXMucmFkaXVzICk7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleVxuICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pb1xuICogQGF1dGhvciB0c2Nod1xuICovXG5cbmZ1bmN0aW9uIE1hdHJpeDMoKSB7XG5cblx0dGhpcy5lbGVtZW50cyA9IFtcblxuXHRcdDEsIDAsIDAsXG5cdFx0MCwgMSwgMCxcblx0XHQwLCAwLCAxXG5cblx0XTtcblxuXHRpZiAoIGFyZ3VtZW50cy5sZW5ndGggPiAwICkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLk1hdHJpeDM6IHRoZSBjb25zdHJ1Y3RvciBubyBsb25nZXIgcmVhZHMgYXJndW1lbnRzLiB1c2UgLnNldCgpIGluc3RlYWQuJyApO1xuXG5cdH1cblxufVxuXG5PYmplY3QuYXNzaWduKCBNYXRyaXgzLnByb3RvdHlwZSwge1xuXG5cdGlzTWF0cml4MzogdHJ1ZSxcblxuXHRzZXQ6IGZ1bmN0aW9uICggbjExLCBuMTIsIG4xMywgbjIxLCBuMjIsIG4yMywgbjMxLCBuMzIsIG4zMyApIHtcblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHR0ZVsgMCBdID0gbjExOyB0ZVsgMSBdID0gbjIxOyB0ZVsgMiBdID0gbjMxO1xuXHRcdHRlWyAzIF0gPSBuMTI7IHRlWyA0IF0gPSBuMjI7IHRlWyA1IF0gPSBuMzI7XG5cdFx0dGVbIDYgXSA9IG4xMzsgdGVbIDcgXSA9IG4yMzsgdGVbIDggXSA9IG4zMztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0aWRlbnRpdHk6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuc2V0KFxuXG5cdFx0XHQxLCAwLCAwLFxuXHRcdFx0MCwgMSwgMCxcblx0XHRcdDAsIDAsIDFcblxuXHRcdCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5mcm9tQXJyYXkoIHRoaXMuZWxlbWVudHMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cdFx0dmFyIG1lID0gbS5lbGVtZW50cztcblxuXHRcdHRlWyAwIF0gPSBtZVsgMCBdOyB0ZVsgMSBdID0gbWVbIDEgXTsgdGVbIDIgXSA9IG1lWyAyIF07XG5cdFx0dGVbIDMgXSA9IG1lWyAzIF07IHRlWyA0IF0gPSBtZVsgNCBdOyB0ZVsgNSBdID0gbWVbIDUgXTtcblx0XHR0ZVsgNiBdID0gbWVbIDYgXTsgdGVbIDcgXSA9IG1lWyA3IF07IHRlWyA4IF0gPSBtZVsgOCBdO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRGcm9tTWF0cml4NDogZnVuY3Rpb24gKCBtICkge1xuXG5cdFx0dmFyIG1lID0gbS5lbGVtZW50cztcblxuXHRcdHRoaXMuc2V0KFxuXG5cdFx0XHRtZVsgMCBdLCBtZVsgNCBdLCBtZVsgIDggXSxcblx0XHRcdG1lWyAxIF0sIG1lWyA1IF0sIG1lWyAgOSBdLFxuXHRcdFx0bWVbIDIgXSwgbWVbIDYgXSwgbWVbIDEwIF1cblxuXHRcdCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFwcGx5VG9CdWZmZXJBdHRyaWJ1dGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gYXBwbHlUb0J1ZmZlckF0dHJpYnV0ZSggYXR0cmlidXRlICkge1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBhdHRyaWJ1dGUuY291bnQ7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdHYxLnggPSBhdHRyaWJ1dGUuZ2V0WCggaSApO1xuXHRcdFx0XHR2MS55ID0gYXR0cmlidXRlLmdldFkoIGkgKTtcblx0XHRcdFx0djEueiA9IGF0dHJpYnV0ZS5nZXRaKCBpICk7XG5cblx0XHRcdFx0djEuYXBwbHlNYXRyaXgzKCB0aGlzICk7XG5cblx0XHRcdFx0YXR0cmlidXRlLnNldFhZWiggaSwgdjEueCwgdjEueSwgdjEueiApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBhdHRyaWJ1dGU7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRtdWx0aXBseTogZnVuY3Rpb24gKCBtICkge1xuXG5cdFx0cmV0dXJuIHRoaXMubXVsdGlwbHlNYXRyaWNlcyggdGhpcywgbSApO1xuXG5cdH0sXG5cblx0cHJlbXVsdGlwbHk6IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdHJldHVybiB0aGlzLm11bHRpcGx5TWF0cmljZXMoIG0sIHRoaXMgKTtcblxuXHR9LFxuXG5cdG11bHRpcGx5TWF0cmljZXM6IGZ1bmN0aW9uICggYSwgYiApIHtcblxuXHRcdHZhciBhZSA9IGEuZWxlbWVudHM7XG5cdFx0dmFyIGJlID0gYi5lbGVtZW50cztcblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXG5cdFx0dmFyIGExMSA9IGFlWyAwIF0sIGExMiA9IGFlWyAzIF0sIGExMyA9IGFlWyA2IF07XG5cdFx0dmFyIGEyMSA9IGFlWyAxIF0sIGEyMiA9IGFlWyA0IF0sIGEyMyA9IGFlWyA3IF07XG5cdFx0dmFyIGEzMSA9IGFlWyAyIF0sIGEzMiA9IGFlWyA1IF0sIGEzMyA9IGFlWyA4IF07XG5cblx0XHR2YXIgYjExID0gYmVbIDAgXSwgYjEyID0gYmVbIDMgXSwgYjEzID0gYmVbIDYgXTtcblx0XHR2YXIgYjIxID0gYmVbIDEgXSwgYjIyID0gYmVbIDQgXSwgYjIzID0gYmVbIDcgXTtcblx0XHR2YXIgYjMxID0gYmVbIDIgXSwgYjMyID0gYmVbIDUgXSwgYjMzID0gYmVbIDggXTtcblxuXHRcdHRlWyAwIF0gPSBhMTEgKiBiMTEgKyBhMTIgKiBiMjEgKyBhMTMgKiBiMzE7XG5cdFx0dGVbIDMgXSA9IGExMSAqIGIxMiArIGExMiAqIGIyMiArIGExMyAqIGIzMjtcblx0XHR0ZVsgNiBdID0gYTExICogYjEzICsgYTEyICogYjIzICsgYTEzICogYjMzO1xuXG5cdFx0dGVbIDEgXSA9IGEyMSAqIGIxMSArIGEyMiAqIGIyMSArIGEyMyAqIGIzMTtcblx0XHR0ZVsgNCBdID0gYTIxICogYjEyICsgYTIyICogYjIyICsgYTIzICogYjMyO1xuXHRcdHRlWyA3IF0gPSBhMjEgKiBiMTMgKyBhMjIgKiBiMjMgKyBhMjMgKiBiMzM7XG5cblx0XHR0ZVsgMiBdID0gYTMxICogYjExICsgYTMyICogYjIxICsgYTMzICogYjMxO1xuXHRcdHRlWyA1IF0gPSBhMzEgKiBiMTIgKyBhMzIgKiBiMjIgKyBhMzMgKiBiMzI7XG5cdFx0dGVbIDggXSA9IGEzMSAqIGIxMyArIGEzMiAqIGIyMyArIGEzMyAqIGIzMztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bXVsdGlwbHlTY2FsYXI6IGZ1bmN0aW9uICggcyApIHtcblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHR0ZVsgMCBdICo9IHM7IHRlWyAzIF0gKj0gczsgdGVbIDYgXSAqPSBzO1xuXHRcdHRlWyAxIF0gKj0gczsgdGVbIDQgXSAqPSBzOyB0ZVsgNyBdICo9IHM7XG5cdFx0dGVbIDIgXSAqPSBzOyB0ZVsgNSBdICo9IHM7IHRlWyA4IF0gKj0gcztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZGV0ZXJtaW5hbnQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHR2YXIgYSA9IHRlWyAwIF0sIGIgPSB0ZVsgMSBdLCBjID0gdGVbIDIgXSxcblx0XHRcdGQgPSB0ZVsgMyBdLCBlID0gdGVbIDQgXSwgZiA9IHRlWyA1IF0sXG5cdFx0XHRnID0gdGVbIDYgXSwgaCA9IHRlWyA3IF0sIGkgPSB0ZVsgOCBdO1xuXG5cdFx0cmV0dXJuIGEgKiBlICogaSAtIGEgKiBmICogaCAtIGIgKiBkICogaSArIGIgKiBmICogZyArIGMgKiBkICogaCAtIGMgKiBlICogZztcblxuXHR9LFxuXG5cdGdldEludmVyc2U6IGZ1bmN0aW9uICggbWF0cml4LCB0aHJvd09uRGVnZW5lcmF0ZSApIHtcblxuXHRcdGlmICggbWF0cml4ICYmIG1hdHJpeC5pc01hdHJpeDQgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoIFwiVEhSRUUuTWF0cml4My5nZXRJbnZlcnNlIG5vIGxvbmdlciB0YWtlcyBhIE1hdHJpeDQgYXJndW1lbnQuXCIgKTtcblxuXHRcdH1cblxuXHRcdHZhciBtZSA9IG1hdHJpeC5lbGVtZW50cyxcblx0XHRcdHRlID0gdGhpcy5lbGVtZW50cyxcblxuXHRcdFx0bjExID0gbWVbIDAgXSwgbjIxID0gbWVbIDEgXSwgbjMxID0gbWVbIDIgXSxcblx0XHRcdG4xMiA9IG1lWyAzIF0sIG4yMiA9IG1lWyA0IF0sIG4zMiA9IG1lWyA1IF0sXG5cdFx0XHRuMTMgPSBtZVsgNiBdLCBuMjMgPSBtZVsgNyBdLCBuMzMgPSBtZVsgOCBdLFxuXG5cdFx0XHR0MTEgPSBuMzMgKiBuMjIgLSBuMzIgKiBuMjMsXG5cdFx0XHR0MTIgPSBuMzIgKiBuMTMgLSBuMzMgKiBuMTIsXG5cdFx0XHR0MTMgPSBuMjMgKiBuMTIgLSBuMjIgKiBuMTMsXG5cblx0XHRcdGRldCA9IG4xMSAqIHQxMSArIG4yMSAqIHQxMiArIG4zMSAqIHQxMztcblxuXHRcdGlmICggZGV0ID09PSAwICkge1xuXG5cdFx0XHR2YXIgbXNnID0gXCJUSFJFRS5NYXRyaXgzLmdldEludmVyc2UoKTogY2FuJ3QgaW52ZXJ0IG1hdHJpeCwgZGV0ZXJtaW5hbnQgaXMgMFwiO1xuXG5cdFx0XHRpZiAoIHRocm93T25EZWdlbmVyYXRlID09PSB0cnVlICkge1xuXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvciggbXNnICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCBtc2cgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdGhpcy5pZGVudGl0eSgpO1xuXG5cdFx0fVxuXG5cdFx0dmFyIGRldEludiA9IDEgLyBkZXQ7XG5cblx0XHR0ZVsgMCBdID0gdDExICogZGV0SW52O1xuXHRcdHRlWyAxIF0gPSAoIG4zMSAqIG4yMyAtIG4zMyAqIG4yMSApICogZGV0SW52O1xuXHRcdHRlWyAyIF0gPSAoIG4zMiAqIG4yMSAtIG4zMSAqIG4yMiApICogZGV0SW52O1xuXG5cdFx0dGVbIDMgXSA9IHQxMiAqIGRldEludjtcblx0XHR0ZVsgNCBdID0gKCBuMzMgKiBuMTEgLSBuMzEgKiBuMTMgKSAqIGRldEludjtcblx0XHR0ZVsgNSBdID0gKCBuMzEgKiBuMTIgLSBuMzIgKiBuMTEgKSAqIGRldEludjtcblxuXHRcdHRlWyA2IF0gPSB0MTMgKiBkZXRJbnY7XG5cdFx0dGVbIDcgXSA9ICggbjIxICogbjEzIC0gbjIzICogbjExICkgKiBkZXRJbnY7XG5cdFx0dGVbIDggXSA9ICggbjIyICogbjExIC0gbjIxICogbjEyICkgKiBkZXRJbnY7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHRyYW5zcG9zZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHRtcCwgbSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHR0bXAgPSBtWyAxIF07IG1bIDEgXSA9IG1bIDMgXTsgbVsgMyBdID0gdG1wO1xuXHRcdHRtcCA9IG1bIDIgXTsgbVsgMiBdID0gbVsgNiBdOyBtWyA2IF0gPSB0bXA7XG5cdFx0dG1wID0gbVsgNSBdOyBtWyA1IF0gPSBtWyA3IF07IG1bIDcgXSA9IHRtcDtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Z2V0Tm9ybWFsTWF0cml4OiBmdW5jdGlvbiAoIG1hdHJpeDQgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5zZXRGcm9tTWF0cml4NCggbWF0cml4NCApLmdldEludmVyc2UoIHRoaXMgKS50cmFuc3Bvc2UoKTtcblxuXHR9LFxuXG5cdHRyYW5zcG9zZUludG9BcnJheTogZnVuY3Rpb24gKCByICkge1xuXG5cdFx0dmFyIG0gPSB0aGlzLmVsZW1lbnRzO1xuXG5cdFx0clsgMCBdID0gbVsgMCBdO1xuXHRcdHJbIDEgXSA9IG1bIDMgXTtcblx0XHRyWyAyIF0gPSBtWyA2IF07XG5cdFx0clsgMyBdID0gbVsgMSBdO1xuXHRcdHJbIDQgXSA9IG1bIDQgXTtcblx0XHRyWyA1IF0gPSBtWyA3IF07XG5cdFx0clsgNiBdID0gbVsgMiBdO1xuXHRcdHJbIDcgXSA9IG1bIDUgXTtcblx0XHRyWyA4IF0gPSBtWyA4IF07XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGVxdWFsczogZnVuY3Rpb24gKCBtYXRyaXggKSB7XG5cblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXHRcdHZhciBtZSA9IG1hdHJpeC5lbGVtZW50cztcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IDk7IGkgKysgKSB7XG5cblx0XHRcdGlmICggdGVbIGkgXSAhPT0gbWVbIGkgXSApIHJldHVybiBmYWxzZTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXG5cdH0sXG5cblx0ZnJvbUFycmF5OiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0gMDtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IDk7IGkgKysgKSB7XG5cblx0XHRcdHRoaXMuZWxlbWVudHNbIGkgXSA9IGFycmF5WyBpICsgb2Zmc2V0IF07XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHRvQXJyYXk6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCApIHtcblxuXHRcdGlmICggYXJyYXkgPT09IHVuZGVmaW5lZCApIGFycmF5ID0gW107XG5cdFx0aWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7XG5cblx0XHR2YXIgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXG5cdFx0YXJyYXlbIG9mZnNldCBdID0gdGVbIDAgXTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMSBdID0gdGVbIDEgXTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMiBdID0gdGVbIDIgXTtcblxuXHRcdGFycmF5WyBvZmZzZXQgKyAzIF0gPSB0ZVsgMyBdO1xuXHRcdGFycmF5WyBvZmZzZXQgKyA0IF0gPSB0ZVsgNCBdO1xuXHRcdGFycmF5WyBvZmZzZXQgKyA1IF0gPSB0ZVsgNSBdO1xuXG5cdFx0YXJyYXlbIG9mZnNldCArIDYgXSA9IHRlWyA2IF07XG5cdFx0YXJyYXlbIG9mZnNldCArIDcgXSA9IHRlWyA3IF07XG5cdFx0YXJyYXlbIG9mZnNldCArIDggXSA9IHRlWyA4IF07XG5cblx0XHRyZXR1cm4gYXJyYXk7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pb1xuICovXG5cbmZ1bmN0aW9uIFBsYW5lKCBub3JtYWwsIGNvbnN0YW50ICkge1xuXG5cdHRoaXMubm9ybWFsID0gKCBub3JtYWwgIT09IHVuZGVmaW5lZCApID8gbm9ybWFsIDogbmV3IFZlY3RvcjMoIDEsIDAsIDAgKTtcblx0dGhpcy5jb25zdGFudCA9ICggY29uc3RhbnQgIT09IHVuZGVmaW5lZCApID8gY29uc3RhbnQgOiAwO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIFBsYW5lLnByb3RvdHlwZSwge1xuXG5cdHNldDogZnVuY3Rpb24gKCBub3JtYWwsIGNvbnN0YW50ICkge1xuXG5cdFx0dGhpcy5ub3JtYWwuY29weSggbm9ybWFsICk7XG5cdFx0dGhpcy5jb25zdGFudCA9IGNvbnN0YW50O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRDb21wb25lbnRzOiBmdW5jdGlvbiAoIHgsIHksIHosIHcgKSB7XG5cblx0XHR0aGlzLm5vcm1hbC5zZXQoIHgsIHksIHogKTtcblx0XHR0aGlzLmNvbnN0YW50ID0gdztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbU5vcm1hbEFuZENvcGxhbmFyUG9pbnQ6IGZ1bmN0aW9uICggbm9ybWFsLCBwb2ludCApIHtcblxuXHRcdHRoaXMubm9ybWFsLmNvcHkoIG5vcm1hbCApO1xuXHRcdHRoaXMuY29uc3RhbnQgPSAtIHBvaW50LmRvdCggdGhpcy5ub3JtYWwgKTtcdC8vIG11c3QgYmUgdGhpcy5ub3JtYWwsIG5vdCBub3JtYWwsIGFzIHRoaXMubm9ybWFsIGlzIG5vcm1hbGl6ZWRcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbUNvcGxhbmFyUG9pbnRzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciB2MiA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gc2V0RnJvbUNvcGxhbmFyUG9pbnRzKCBhLCBiLCBjICkge1xuXG5cdFx0XHR2YXIgbm9ybWFsID0gdjEuc3ViVmVjdG9ycyggYywgYiApLmNyb3NzKCB2Mi5zdWJWZWN0b3JzKCBhLCBiICkgKS5ub3JtYWxpemUoKTtcblxuXHRcdFx0Ly8gUTogc2hvdWxkIGFuIGVycm9yIGJlIHRocm93biBpZiBub3JtYWwgaXMgemVybyAoZS5nLiBkZWdlbmVyYXRlIHBsYW5lKT9cblxuXHRcdFx0dGhpcy5zZXRGcm9tTm9ybWFsQW5kQ29wbGFuYXJQb2ludCggbm9ybWFsLCBhICk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggcGxhbmUgKSB7XG5cblx0XHR0aGlzLm5vcm1hbC5jb3B5KCBwbGFuZS5ub3JtYWwgKTtcblx0XHR0aGlzLmNvbnN0YW50ID0gcGxhbmUuY29uc3RhbnQ7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG5vcm1hbGl6ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gTm90ZTogd2lsbCBsZWFkIHRvIGEgZGl2aWRlIGJ5IHplcm8gaWYgdGhlIHBsYW5lIGlzIGludmFsaWQuXG5cblx0XHR2YXIgaW52ZXJzZU5vcm1hbExlbmd0aCA9IDEuMCAvIHRoaXMubm9ybWFsLmxlbmd0aCgpO1xuXHRcdHRoaXMubm9ybWFsLm11bHRpcGx5U2NhbGFyKCBpbnZlcnNlTm9ybWFsTGVuZ3RoICk7XG5cdFx0dGhpcy5jb25zdGFudCAqPSBpbnZlcnNlTm9ybWFsTGVuZ3RoO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRuZWdhdGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuY29uc3RhbnQgKj0gLSAxO1xuXHRcdHRoaXMubm9ybWFsLm5lZ2F0ZSgpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRkaXN0YW5jZVRvUG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5ub3JtYWwuZG90KCBwb2ludCApICsgdGhpcy5jb25zdGFudDtcblxuXHR9LFxuXG5cdGRpc3RhbmNlVG9TcGhlcmU6IGZ1bmN0aW9uICggc3BoZXJlICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZGlzdGFuY2VUb1BvaW50KCBzcGhlcmUuY2VudGVyICkgLSBzcGhlcmUucmFkaXVzO1xuXG5cdH0sXG5cblx0cHJvamVjdFBvaW50OiBmdW5jdGlvbiAoIHBvaW50LCBvcHRpb25hbFRhcmdldCApIHtcblxuXHRcdHJldHVybiB0aGlzLm9ydGhvUG9pbnQoIHBvaW50LCBvcHRpb25hbFRhcmdldCApLnN1YiggcG9pbnQgKS5uZWdhdGUoKTtcblxuXHR9LFxuXG5cdG9ydGhvUG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQsIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdFx0dmFyIHBlcnBlbmRpY3VsYXJNYWduaXR1ZGUgPSB0aGlzLmRpc3RhbmNlVG9Qb2ludCggcG9pbnQgKTtcblxuXHRcdHZhciByZXN1bHQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMygpO1xuXHRcdHJldHVybiByZXN1bHQuY29weSggdGhpcy5ub3JtYWwgKS5tdWx0aXBseVNjYWxhciggcGVycGVuZGljdWxhck1hZ25pdHVkZSApO1xuXG5cdH0sXG5cblx0aW50ZXJzZWN0TGluZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBpbnRlcnNlY3RMaW5lKCBsaW5lLCBvcHRpb25hbFRhcmdldCApIHtcblxuXHRcdFx0dmFyIHJlc3VsdCA9IG9wdGlvbmFsVGFyZ2V0IHx8IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRcdHZhciBkaXJlY3Rpb24gPSBsaW5lLmRlbHRhKCB2MSApO1xuXG5cdFx0XHR2YXIgZGVub21pbmF0b3IgPSB0aGlzLm5vcm1hbC5kb3QoIGRpcmVjdGlvbiApO1xuXG5cdFx0XHRpZiAoIGRlbm9taW5hdG9yID09PSAwICkge1xuXG5cdFx0XHRcdC8vIGxpbmUgaXMgY29wbGFuYXIsIHJldHVybiBvcmlnaW5cblx0XHRcdFx0aWYgKCB0aGlzLmRpc3RhbmNlVG9Qb2ludCggbGluZS5zdGFydCApID09PSAwICkge1xuXG5cdFx0XHRcdFx0cmV0dXJuIHJlc3VsdC5jb3B5KCBsaW5lLnN0YXJ0ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFVuc3VyZSBpZiB0aGlzIGlzIHRoZSBjb3JyZWN0IG1ldGhvZCB0byBoYW5kbGUgdGhpcyBjYXNlLlxuXHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXG5cdFx0XHR9XG5cblx0XHRcdHZhciB0ID0gLSAoIGxpbmUuc3RhcnQuZG90KCB0aGlzLm5vcm1hbCApICsgdGhpcy5jb25zdGFudCApIC8gZGVub21pbmF0b3I7XG5cblx0XHRcdGlmICggdCA8IDAgfHwgdCA+IDEgKSB7XG5cblx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gcmVzdWx0LmNvcHkoIGRpcmVjdGlvbiApLm11bHRpcGx5U2NhbGFyKCB0ICkuYWRkKCBsaW5lLnN0YXJ0ICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRpbnRlcnNlY3RzTGluZTogZnVuY3Rpb24gKCBsaW5lICkge1xuXG5cdFx0Ly8gTm90ZTogdGhpcyB0ZXN0cyBpZiBhIGxpbmUgaW50ZXJzZWN0cyB0aGUgcGxhbmUsIG5vdCB3aGV0aGVyIGl0IChvciBpdHMgZW5kLXBvaW50cykgYXJlIGNvcGxhbmFyIHdpdGggaXQuXG5cblx0XHR2YXIgc3RhcnRTaWduID0gdGhpcy5kaXN0YW5jZVRvUG9pbnQoIGxpbmUuc3RhcnQgKTtcblx0XHR2YXIgZW5kU2lnbiA9IHRoaXMuZGlzdGFuY2VUb1BvaW50KCBsaW5lLmVuZCApO1xuXG5cdFx0cmV0dXJuICggc3RhcnRTaWduIDwgMCAmJiBlbmRTaWduID4gMCApIHx8ICggZW5kU2lnbiA8IDAgJiYgc3RhcnRTaWduID4gMCApO1xuXG5cdH0sXG5cblx0aW50ZXJzZWN0c0JveDogZnVuY3Rpb24gKCBib3ggKSB7XG5cblx0XHRyZXR1cm4gYm94LmludGVyc2VjdHNQbGFuZSggdGhpcyApO1xuXG5cdH0sXG5cblx0aW50ZXJzZWN0c1NwaGVyZTogZnVuY3Rpb24gKCBzcGhlcmUgKSB7XG5cblx0XHRyZXR1cm4gc3BoZXJlLmludGVyc2VjdHNQbGFuZSggdGhpcyApO1xuXG5cdH0sXG5cblx0Y29wbGFuYXJQb2ludDogZnVuY3Rpb24gKCBvcHRpb25hbFRhcmdldCApIHtcblxuXHRcdHZhciByZXN1bHQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMygpO1xuXHRcdHJldHVybiByZXN1bHQuY29weSggdGhpcy5ub3JtYWwgKS5tdWx0aXBseVNjYWxhciggLSB0aGlzLmNvbnN0YW50ICk7XG5cblx0fSxcblxuXHRhcHBseU1hdHJpeDQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIG0xID0gbmV3IE1hdHJpeDMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBhcHBseU1hdHJpeDQoIG1hdHJpeCwgb3B0aW9uYWxOb3JtYWxNYXRyaXggKSB7XG5cblx0XHRcdHZhciByZWZlcmVuY2VQb2ludCA9IHRoaXMuY29wbGFuYXJQb2ludCggdjEgKS5hcHBseU1hdHJpeDQoIG1hdHJpeCApO1xuXG5cdFx0XHQvLyB0cmFuc2Zvcm0gbm9ybWFsIGJhc2VkIG9uIHRoZW9yeSBoZXJlOlxuXHRcdFx0Ly8gaHR0cDovL3d3dy5zb25naG8uY2Evb3BlbmdsL2dsX25vcm1hbHRyYW5zZm9ybS5odG1sXG5cdFx0XHR2YXIgbm9ybWFsTWF0cml4ID0gb3B0aW9uYWxOb3JtYWxNYXRyaXggfHwgbTEuZ2V0Tm9ybWFsTWF0cml4KCBtYXRyaXggKTtcblx0XHRcdHZhciBub3JtYWwgPSB0aGlzLm5vcm1hbC5hcHBseU1hdHJpeDMoIG5vcm1hbE1hdHJpeCApLm5vcm1hbGl6ZSgpO1xuXG5cdFx0XHQvLyByZWNhbGN1bGF0ZSBjb25zdGFudCAobGlrZSBpbiBzZXRGcm9tTm9ybWFsQW5kQ29wbGFuYXJQb2ludClcblx0XHRcdHRoaXMuY29uc3RhbnQgPSAtIHJlZmVyZW5jZVBvaW50LmRvdCggbm9ybWFsICk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0dHJhbnNsYXRlOiBmdW5jdGlvbiAoIG9mZnNldCApIHtcblxuXHRcdHRoaXMuY29uc3RhbnQgPSB0aGlzLmNvbnN0YW50IC0gb2Zmc2V0LmRvdCggdGhpcy5ub3JtYWwgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZXF1YWxzOiBmdW5jdGlvbiAoIHBsYW5lICkge1xuXG5cdFx0cmV0dXJuIHBsYW5lLm5vcm1hbC5lcXVhbHMoIHRoaXMubm9ybWFsICkgJiYgKCBwbGFuZS5jb25zdGFudCA9PT0gdGhpcy5jb25zdGFudCApO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pb1xuICovXG5cbmZ1bmN0aW9uIEZydXN0dW0oIHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUgKSB7XG5cblx0dGhpcy5wbGFuZXMgPSBbXG5cblx0XHQoIHAwICE9PSB1bmRlZmluZWQgKSA/IHAwIDogbmV3IFBsYW5lKCksXG5cdFx0KCBwMSAhPT0gdW5kZWZpbmVkICkgPyBwMSA6IG5ldyBQbGFuZSgpLFxuXHRcdCggcDIgIT09IHVuZGVmaW5lZCApID8gcDIgOiBuZXcgUGxhbmUoKSxcblx0XHQoIHAzICE9PSB1bmRlZmluZWQgKSA/IHAzIDogbmV3IFBsYW5lKCksXG5cdFx0KCBwNCAhPT0gdW5kZWZpbmVkICkgPyBwNCA6IG5ldyBQbGFuZSgpLFxuXHRcdCggcDUgIT09IHVuZGVmaW5lZCApID8gcDUgOiBuZXcgUGxhbmUoKVxuXG5cdF07XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggRnJ1c3R1bS5wcm90b3R5cGUsIHtcblxuXHRzZXQ6IGZ1bmN0aW9uICggcDAsIHAxLCBwMiwgcDMsIHA0LCBwNSApIHtcblxuXHRcdHZhciBwbGFuZXMgPSB0aGlzLnBsYW5lcztcblxuXHRcdHBsYW5lc1sgMCBdLmNvcHkoIHAwICk7XG5cdFx0cGxhbmVzWyAxIF0uY29weSggcDEgKTtcblx0XHRwbGFuZXNbIDIgXS5jb3B5KCBwMiApO1xuXHRcdHBsYW5lc1sgMyBdLmNvcHkoIHAzICk7XG5cdFx0cGxhbmVzWyA0IF0uY29weSggcDQgKTtcblx0XHRwbGFuZXNbIDUgXS5jb3B5KCBwNSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBmcnVzdHVtICkge1xuXG5cdFx0dmFyIHBsYW5lcyA9IHRoaXMucGxhbmVzO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgNjsgaSArKyApIHtcblxuXHRcdFx0cGxhbmVzWyBpIF0uY29weSggZnJ1c3R1bS5wbGFuZXNbIGkgXSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRGcm9tTWF0cml4OiBmdW5jdGlvbiAoIG0gKSB7XG5cblx0XHR2YXIgcGxhbmVzID0gdGhpcy5wbGFuZXM7XG5cdFx0dmFyIG1lID0gbS5lbGVtZW50cztcblx0XHR2YXIgbWUwID0gbWVbIDAgXSwgbWUxID0gbWVbIDEgXSwgbWUyID0gbWVbIDIgXSwgbWUzID0gbWVbIDMgXTtcblx0XHR2YXIgbWU0ID0gbWVbIDQgXSwgbWU1ID0gbWVbIDUgXSwgbWU2ID0gbWVbIDYgXSwgbWU3ID0gbWVbIDcgXTtcblx0XHR2YXIgbWU4ID0gbWVbIDggXSwgbWU5ID0gbWVbIDkgXSwgbWUxMCA9IG1lWyAxMCBdLCBtZTExID0gbWVbIDExIF07XG5cdFx0dmFyIG1lMTIgPSBtZVsgMTIgXSwgbWUxMyA9IG1lWyAxMyBdLCBtZTE0ID0gbWVbIDE0IF0sIG1lMTUgPSBtZVsgMTUgXTtcblxuXHRcdHBsYW5lc1sgMCBdLnNldENvbXBvbmVudHMoIG1lMyAtIG1lMCwgbWU3IC0gbWU0LCBtZTExIC0gbWU4LCBtZTE1IC0gbWUxMiApLm5vcm1hbGl6ZSgpO1xuXHRcdHBsYW5lc1sgMSBdLnNldENvbXBvbmVudHMoIG1lMyArIG1lMCwgbWU3ICsgbWU0LCBtZTExICsgbWU4LCBtZTE1ICsgbWUxMiApLm5vcm1hbGl6ZSgpO1xuXHRcdHBsYW5lc1sgMiBdLnNldENvbXBvbmVudHMoIG1lMyArIG1lMSwgbWU3ICsgbWU1LCBtZTExICsgbWU5LCBtZTE1ICsgbWUxMyApLm5vcm1hbGl6ZSgpO1xuXHRcdHBsYW5lc1sgMyBdLnNldENvbXBvbmVudHMoIG1lMyAtIG1lMSwgbWU3IC0gbWU1LCBtZTExIC0gbWU5LCBtZTE1IC0gbWUxMyApLm5vcm1hbGl6ZSgpO1xuXHRcdHBsYW5lc1sgNCBdLnNldENvbXBvbmVudHMoIG1lMyAtIG1lMiwgbWU3IC0gbWU2LCBtZTExIC0gbWUxMCwgbWUxNSAtIG1lMTQgKS5ub3JtYWxpemUoKTtcblx0XHRwbGFuZXNbIDUgXS5zZXRDb21wb25lbnRzKCBtZTMgKyBtZTIsIG1lNyArIG1lNiwgbWUxMSArIG1lMTAsIG1lMTUgKyBtZTE0ICkubm9ybWFsaXplKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGludGVyc2VjdHNPYmplY3Q6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBzcGhlcmUgPSBuZXcgU3BoZXJlKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gaW50ZXJzZWN0c09iamVjdCggb2JqZWN0ICkge1xuXG5cdFx0XHR2YXIgZ2VvbWV0cnkgPSBvYmplY3QuZ2VvbWV0cnk7XG5cblx0XHRcdGlmICggZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgPT09IG51bGwgKVxuXHRcdFx0XHRnZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtcblxuXHRcdFx0c3BoZXJlLmNvcHkoIGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlIClcblx0XHRcdFx0LmFwcGx5TWF0cml4NCggb2JqZWN0Lm1hdHJpeFdvcmxkICk7XG5cblx0XHRcdHJldHVybiB0aGlzLmludGVyc2VjdHNTcGhlcmUoIHNwaGVyZSApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0aW50ZXJzZWN0c1Nwcml0ZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHNwaGVyZSA9IG5ldyBTcGhlcmUoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBpbnRlcnNlY3RzU3ByaXRlKCBzcHJpdGUgKSB7XG5cblx0XHRcdHNwaGVyZS5jZW50ZXIuc2V0KCAwLCAwLCAwICk7XG5cdFx0XHRzcGhlcmUucmFkaXVzID0gMC43MDcxMDY3ODExODY1NDc2O1xuXHRcdFx0c3BoZXJlLmFwcGx5TWF0cml4NCggc3ByaXRlLm1hdHJpeFdvcmxkICk7XG5cblx0XHRcdHJldHVybiB0aGlzLmludGVyc2VjdHNTcGhlcmUoIHNwaGVyZSApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0aW50ZXJzZWN0c1NwaGVyZTogZnVuY3Rpb24gKCBzcGhlcmUgKSB7XG5cblx0XHR2YXIgcGxhbmVzID0gdGhpcy5wbGFuZXM7XG5cdFx0dmFyIGNlbnRlciA9IHNwaGVyZS5jZW50ZXI7XG5cdFx0dmFyIG5lZ1JhZGl1cyA9IC0gc3BoZXJlLnJhZGl1cztcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IDY7IGkgKysgKSB7XG5cblx0XHRcdHZhciBkaXN0YW5jZSA9IHBsYW5lc1sgaSBdLmRpc3RhbmNlVG9Qb2ludCggY2VudGVyICk7XG5cblx0XHRcdGlmICggZGlzdGFuY2UgPCBuZWdSYWRpdXMgKSB7XG5cblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblxuXHR9LFxuXG5cdGludGVyc2VjdHNCb3g6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBwMSA9IG5ldyBWZWN0b3IzKCksXG5cdFx0XHRwMiA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gaW50ZXJzZWN0c0JveCggYm94ICkge1xuXG5cdFx0XHR2YXIgcGxhbmVzID0gdGhpcy5wbGFuZXM7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IDY7IGkgKysgKSB7XG5cblx0XHRcdFx0dmFyIHBsYW5lID0gcGxhbmVzWyBpIF07XG5cblx0XHRcdFx0cDEueCA9IHBsYW5lLm5vcm1hbC54ID4gMCA/IGJveC5taW4ueCA6IGJveC5tYXgueDtcblx0XHRcdFx0cDIueCA9IHBsYW5lLm5vcm1hbC54ID4gMCA/IGJveC5tYXgueCA6IGJveC5taW4ueDtcblx0XHRcdFx0cDEueSA9IHBsYW5lLm5vcm1hbC55ID4gMCA/IGJveC5taW4ueSA6IGJveC5tYXgueTtcblx0XHRcdFx0cDIueSA9IHBsYW5lLm5vcm1hbC55ID4gMCA/IGJveC5tYXgueSA6IGJveC5taW4ueTtcblx0XHRcdFx0cDEueiA9IHBsYW5lLm5vcm1hbC56ID4gMCA/IGJveC5taW4ueiA6IGJveC5tYXguejtcblx0XHRcdFx0cDIueiA9IHBsYW5lLm5vcm1hbC56ID4gMCA/IGJveC5tYXgueiA6IGJveC5taW4uejtcblxuXHRcdFx0XHR2YXIgZDEgPSBwbGFuZS5kaXN0YW5jZVRvUG9pbnQoIHAxICk7XG5cdFx0XHRcdHZhciBkMiA9IHBsYW5lLmRpc3RhbmNlVG9Qb2ludCggcDIgKTtcblxuXHRcdFx0XHQvLyBpZiBib3RoIG91dHNpZGUgcGxhbmUsIG5vIGludGVyc2VjdGlvblxuXG5cdFx0XHRcdGlmICggZDEgPCAwICYmIGQyIDwgMCApIHtcblxuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRydWU7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRjb250YWluc1BvaW50OiBmdW5jdGlvbiAoIHBvaW50ICkge1xuXG5cdFx0dmFyIHBsYW5lcyA9IHRoaXMucGxhbmVzO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgNjsgaSArKyApIHtcblxuXHRcdFx0aWYgKCBwbGFuZXNbIGkgXS5kaXN0YW5jZVRvUG9pbnQoIHBvaW50ICkgPCAwICkge1xuXG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRydWU7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gV2ViR0xTaGFkb3dNYXAoIF9yZW5kZXJlciwgX2xpZ2h0cywgX29iamVjdHMsIGNhcGFiaWxpdGllcyApIHtcblxuXHR2YXIgX2dsID0gX3JlbmRlcmVyLmNvbnRleHQsXG5cdFx0X3N0YXRlID0gX3JlbmRlcmVyLnN0YXRlLFxuXHRcdF9mcnVzdHVtID0gbmV3IEZydXN0dW0oKSxcblx0XHRfcHJvalNjcmVlbk1hdHJpeCA9IG5ldyBNYXRyaXg0KCksXG5cblx0XHRfbGlnaHRTaGFkb3dzID0gX2xpZ2h0cy5zaGFkb3dzLFxuXG5cdFx0X3NoYWRvd01hcFNpemUgPSBuZXcgVmVjdG9yMigpLFxuXHRcdF9tYXhTaGFkb3dNYXBTaXplID0gbmV3IFZlY3RvcjIoIGNhcGFiaWxpdGllcy5tYXhUZXh0dXJlU2l6ZSwgY2FwYWJpbGl0aWVzLm1heFRleHR1cmVTaXplICksXG5cblx0XHRfbG9va1RhcmdldCA9IG5ldyBWZWN0b3IzKCksXG5cdFx0X2xpZ2h0UG9zaXRpb25Xb3JsZCA9IG5ldyBWZWN0b3IzKCksXG5cblx0XHRfTW9ycGhpbmdGbGFnID0gMSxcblx0XHRfU2tpbm5pbmdGbGFnID0gMixcblxuXHRcdF9OdW1iZXJPZk1hdGVyaWFsVmFyaWFudHMgPSAoIF9Nb3JwaGluZ0ZsYWcgfCBfU2tpbm5pbmdGbGFnICkgKyAxLFxuXG5cdFx0X2RlcHRoTWF0ZXJpYWxzID0gbmV3IEFycmF5KCBfTnVtYmVyT2ZNYXRlcmlhbFZhcmlhbnRzICksXG5cdFx0X2Rpc3RhbmNlTWF0ZXJpYWxzID0gbmV3IEFycmF5KCBfTnVtYmVyT2ZNYXRlcmlhbFZhcmlhbnRzICksXG5cblx0XHRfbWF0ZXJpYWxDYWNoZSA9IHt9O1xuXG5cdHZhciBjdWJlRGlyZWN0aW9ucyA9IFtcblx0XHRuZXcgVmVjdG9yMyggMSwgMCwgMCApLCBuZXcgVmVjdG9yMyggLSAxLCAwLCAwICksIG5ldyBWZWN0b3IzKCAwLCAwLCAxICksXG5cdFx0bmV3IFZlY3RvcjMoIDAsIDAsIC0gMSApLCBuZXcgVmVjdG9yMyggMCwgMSwgMCApLCBuZXcgVmVjdG9yMyggMCwgLSAxLCAwIClcblx0XTtcblxuXHR2YXIgY3ViZVVwcyA9IFtcblx0XHRuZXcgVmVjdG9yMyggMCwgMSwgMCApLCBuZXcgVmVjdG9yMyggMCwgMSwgMCApLCBuZXcgVmVjdG9yMyggMCwgMSwgMCApLFxuXHRcdG5ldyBWZWN0b3IzKCAwLCAxLCAwICksIG5ldyBWZWN0b3IzKCAwLCAwLCAxICksXHRuZXcgVmVjdG9yMyggMCwgMCwgLSAxIClcblx0XTtcblxuXHR2YXIgY3ViZTJEVmlld1BvcnRzID0gW1xuXHRcdG5ldyBWZWN0b3I0KCksIG5ldyBWZWN0b3I0KCksIG5ldyBWZWN0b3I0KCksXG5cdFx0bmV3IFZlY3RvcjQoKSwgbmV3IFZlY3RvcjQoKSwgbmV3IFZlY3RvcjQoKVxuXHRdO1xuXG5cdC8vIGluaXRcblxuXHR2YXIgZGVwdGhNYXRlcmlhbFRlbXBsYXRlID0gbmV3IE1lc2hEZXB0aE1hdGVyaWFsKCk7XG5cdGRlcHRoTWF0ZXJpYWxUZW1wbGF0ZS5kZXB0aFBhY2tpbmcgPSBSR0JBRGVwdGhQYWNraW5nO1xuXHRkZXB0aE1hdGVyaWFsVGVtcGxhdGUuY2xpcHBpbmcgPSB0cnVlO1xuXG5cdHZhciBkaXN0YW5jZVNoYWRlciA9IFNoYWRlckxpYlsgXCJkaXN0YW5jZVJHQkFcIiBdO1xuXHR2YXIgZGlzdGFuY2VVbmlmb3JtcyA9IFVuaWZvcm1zVXRpbHMuY2xvbmUoIGRpc3RhbmNlU2hhZGVyLnVuaWZvcm1zICk7XG5cblx0Zm9yICggdmFyIGkgPSAwOyBpICE9PSBfTnVtYmVyT2ZNYXRlcmlhbFZhcmlhbnRzOyArKyBpICkge1xuXG5cdFx0dmFyIHVzZU1vcnBoaW5nID0gKCBpICYgX01vcnBoaW5nRmxhZyApICE9PSAwO1xuXHRcdHZhciB1c2VTa2lubmluZyA9ICggaSAmIF9Ta2lubmluZ0ZsYWcgKSAhPT0gMDtcblxuXHRcdHZhciBkZXB0aE1hdGVyaWFsID0gZGVwdGhNYXRlcmlhbFRlbXBsYXRlLmNsb25lKCk7XG5cdFx0ZGVwdGhNYXRlcmlhbC5tb3JwaFRhcmdldHMgPSB1c2VNb3JwaGluZztcblx0XHRkZXB0aE1hdGVyaWFsLnNraW5uaW5nID0gdXNlU2tpbm5pbmc7XG5cblx0XHRfZGVwdGhNYXRlcmlhbHNbIGkgXSA9IGRlcHRoTWF0ZXJpYWw7XG5cblx0XHR2YXIgZGlzdGFuY2VNYXRlcmlhbCA9IG5ldyBTaGFkZXJNYXRlcmlhbCgge1xuXHRcdFx0ZGVmaW5lczoge1xuXHRcdFx0XHQnVVNFX1NIQURPV01BUCc6ICcnXG5cdFx0XHR9LFxuXHRcdFx0dW5pZm9ybXM6IGRpc3RhbmNlVW5pZm9ybXMsXG5cdFx0XHR2ZXJ0ZXhTaGFkZXI6IGRpc3RhbmNlU2hhZGVyLnZlcnRleFNoYWRlcixcblx0XHRcdGZyYWdtZW50U2hhZGVyOiBkaXN0YW5jZVNoYWRlci5mcmFnbWVudFNoYWRlcixcblx0XHRcdG1vcnBoVGFyZ2V0czogdXNlTW9ycGhpbmcsXG5cdFx0XHRza2lubmluZzogdXNlU2tpbm5pbmcsXG5cdFx0XHRjbGlwcGluZzogdHJ1ZVxuXHRcdH0gKTtcblxuXHRcdF9kaXN0YW5jZU1hdGVyaWFsc1sgaSBdID0gZGlzdGFuY2VNYXRlcmlhbDtcblxuXHR9XG5cblx0Ly9cblxuXHR2YXIgc2NvcGUgPSB0aGlzO1xuXG5cdHRoaXMuZW5hYmxlZCA9IGZhbHNlO1xuXG5cdHRoaXMuYXV0b1VwZGF0ZSA9IHRydWU7XG5cdHRoaXMubmVlZHNVcGRhdGUgPSBmYWxzZTtcblxuXHR0aGlzLnR5cGUgPSBQQ0ZTaGFkb3dNYXA7XG5cblx0dGhpcy5yZW5kZXJSZXZlcnNlU2lkZWQgPSB0cnVlO1xuXHR0aGlzLnJlbmRlclNpbmdsZVNpZGVkID0gdHJ1ZTtcblxuXHR0aGlzLnJlbmRlciA9IGZ1bmN0aW9uICggc2NlbmUsIGNhbWVyYSApIHtcblxuXHRcdGlmICggc2NvcGUuZW5hYmxlZCA9PT0gZmFsc2UgKSByZXR1cm47XG5cdFx0aWYgKCBzY29wZS5hdXRvVXBkYXRlID09PSBmYWxzZSAmJiBzY29wZS5uZWVkc1VwZGF0ZSA9PT0gZmFsc2UgKSByZXR1cm47XG5cblx0XHRpZiAoIF9saWdodFNoYWRvd3MubGVuZ3RoID09PSAwICkgcmV0dXJuO1xuXG5cdFx0Ly8gU2V0IEdMIHN0YXRlIGZvciBkZXB0aCBtYXAuXG5cdFx0X3N0YXRlLmRpc2FibGUoIF9nbC5CTEVORCApO1xuXHRcdF9zdGF0ZS5idWZmZXJzLmNvbG9yLnNldENsZWFyKCAxLCAxLCAxLCAxICk7XG5cdFx0X3N0YXRlLmJ1ZmZlcnMuZGVwdGguc2V0VGVzdCggdHJ1ZSApO1xuXHRcdF9zdGF0ZS5zZXRTY2lzc29yVGVzdCggZmFsc2UgKTtcblxuXHRcdC8vIHJlbmRlciBkZXB0aCBtYXBcblxuXHRcdHZhciBmYWNlQ291bnQsIGlzUG9pbnRMaWdodDtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBfbGlnaHRTaGFkb3dzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgbGlnaHQgPSBfbGlnaHRTaGFkb3dzWyBpIF07XG5cdFx0XHR2YXIgc2hhZG93ID0gbGlnaHQuc2hhZG93O1xuXG5cdFx0XHRpZiAoIHNoYWRvdyA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMU2hhZG93TWFwOicsIGxpZ2h0LCAnaGFzIG5vIHNoYWRvdy4nICk7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXG5cdFx0XHR9XG5cblx0XHRcdHZhciBzaGFkb3dDYW1lcmEgPSBzaGFkb3cuY2FtZXJhO1xuXHRcdFx0dmFyIHNoYWRvd01hdHJpeCA9IHNoYWRvdy5tYXRyaXg7XG5cblx0XHRcdF9saWdodFBvc2l0aW9uV29ybGQuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBsaWdodC5tYXRyaXhXb3JsZCApO1xuXHRcdFx0c2hhZG93Q2FtZXJhLnBvc2l0aW9uLmNvcHkoIF9saWdodFBvc2l0aW9uV29ybGQgKTtcblxuXHRcdFx0X3NoYWRvd01hcFNpemUuY29weSggc2hhZG93Lm1hcFNpemUgKTtcblx0XHRcdF9zaGFkb3dNYXBTaXplLm1pbiggX21heFNoYWRvd01hcFNpemUgKTtcblxuXHRcdFx0aWYgKCBsaWdodCAmJiBsaWdodC5pc1BvaW50TGlnaHQgKSB7XG5cblx0XHRcdFx0ZmFjZUNvdW50ID0gNjtcblx0XHRcdFx0aXNQb2ludExpZ2h0ID0gdHJ1ZTtcblxuXHRcdFx0XHR2YXIgdnBXaWR0aCA9IF9zaGFkb3dNYXBTaXplLng7XG5cdFx0XHRcdHZhciB2cEhlaWdodCA9IF9zaGFkb3dNYXBTaXplLnk7XG5cblx0XHRcdFx0Ly8gVGhlc2Ugdmlld3BvcnRzIG1hcCBhIGN1YmUtbWFwIG9udG8gYSAyRCB0ZXh0dXJlIHdpdGggdGhlXG5cdFx0XHRcdC8vIGZvbGxvd2luZyBvcmllbnRhdGlvbjpcblx0XHRcdFx0Ly9cblx0XHRcdFx0Ly8gIHh6WFpcblx0XHRcdFx0Ly8gICB5IFlcblx0XHRcdFx0Ly9cblx0XHRcdFx0Ly8gWCAtIFBvc2l0aXZlIHggZGlyZWN0aW9uXG5cdFx0XHRcdC8vIHggLSBOZWdhdGl2ZSB4IGRpcmVjdGlvblxuXHRcdFx0XHQvLyBZIC0gUG9zaXRpdmUgeSBkaXJlY3Rpb25cblx0XHRcdFx0Ly8geSAtIE5lZ2F0aXZlIHkgZGlyZWN0aW9uXG5cdFx0XHRcdC8vIFogLSBQb3NpdGl2ZSB6IGRpcmVjdGlvblxuXHRcdFx0XHQvLyB6IC0gTmVnYXRpdmUgeiBkaXJlY3Rpb25cblxuXHRcdFx0XHQvLyBwb3NpdGl2ZSBYXG5cdFx0XHRcdGN1YmUyRFZpZXdQb3J0c1sgMCBdLnNldCggdnBXaWR0aCAqIDIsIHZwSGVpZ2h0LCB2cFdpZHRoLCB2cEhlaWdodCApO1xuXHRcdFx0XHQvLyBuZWdhdGl2ZSBYXG5cdFx0XHRcdGN1YmUyRFZpZXdQb3J0c1sgMSBdLnNldCggMCwgdnBIZWlnaHQsIHZwV2lkdGgsIHZwSGVpZ2h0ICk7XG5cdFx0XHRcdC8vIHBvc2l0aXZlIFpcblx0XHRcdFx0Y3ViZTJEVmlld1BvcnRzWyAyIF0uc2V0KCB2cFdpZHRoICogMywgdnBIZWlnaHQsIHZwV2lkdGgsIHZwSGVpZ2h0ICk7XG5cdFx0XHRcdC8vIG5lZ2F0aXZlIFpcblx0XHRcdFx0Y3ViZTJEVmlld1BvcnRzWyAzIF0uc2V0KCB2cFdpZHRoLCB2cEhlaWdodCwgdnBXaWR0aCwgdnBIZWlnaHQgKTtcblx0XHRcdFx0Ly8gcG9zaXRpdmUgWVxuXHRcdFx0XHRjdWJlMkRWaWV3UG9ydHNbIDQgXS5zZXQoIHZwV2lkdGggKiAzLCAwLCB2cFdpZHRoLCB2cEhlaWdodCApO1xuXHRcdFx0XHQvLyBuZWdhdGl2ZSBZXG5cdFx0XHRcdGN1YmUyRFZpZXdQb3J0c1sgNSBdLnNldCggdnBXaWR0aCwgMCwgdnBXaWR0aCwgdnBIZWlnaHQgKTtcblxuXHRcdFx0XHRfc2hhZG93TWFwU2l6ZS54ICo9IDQuMDtcblx0XHRcdFx0X3NoYWRvd01hcFNpemUueSAqPSAyLjA7XG5cblxuXHRcdFx0XHQvLyBmb3IgcG9pbnQgbGlnaHRzIHdlIHNldCB0aGUgc2hhZG93IG1hdHJpeCB0byBiZSBhIHRyYW5zbGF0aW9uLW9ubHkgbWF0cml4XG5cdFx0XHRcdC8vIGVxdWFsIHRvIGludmVyc2Ugb2YgdGhlIGxpZ2h0J3MgcG9zaXRpb25cblxuXHRcdFx0XHRzaGFkb3dNYXRyaXgubWFrZVRyYW5zbGF0aW9uKCAtIF9saWdodFBvc2l0aW9uV29ybGQueCwgLSBfbGlnaHRQb3NpdGlvbldvcmxkLnksIC0gX2xpZ2h0UG9zaXRpb25Xb3JsZC56ICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0ZmFjZUNvdW50ID0gMTtcblx0XHRcdFx0aXNQb2ludExpZ2h0ID0gZmFsc2U7XG5cblx0XHRcdFx0X2xvb2tUYXJnZXQuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBsaWdodC50YXJnZXQubWF0cml4V29ybGQgKTtcblx0XHRcdFx0c2hhZG93Q2FtZXJhLmxvb2tBdCggX2xvb2tUYXJnZXQgKTtcblx0XHRcdFx0c2hhZG93Q2FtZXJhLnVwZGF0ZU1hdHJpeFdvcmxkKCk7XG5cdFx0XHRcdHNoYWRvd0NhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UuZ2V0SW52ZXJzZSggc2hhZG93Q2FtZXJhLm1hdHJpeFdvcmxkICk7XG5cblx0XHRcdFx0Ly8gY29tcHV0ZSBzaGFkb3cgbWF0cml4XG5cblx0XHRcdFx0c2hhZG93TWF0cml4LnNldChcblx0XHRcdFx0XHQwLjUsIDAuMCwgMC4wLCAwLjUsXG5cdFx0XHRcdFx0MC4wLCAwLjUsIDAuMCwgMC41LFxuXHRcdFx0XHRcdDAuMCwgMC4wLCAwLjUsIDAuNSxcblx0XHRcdFx0XHQwLjAsIDAuMCwgMC4wLCAxLjBcblx0XHRcdFx0KTtcblxuXHRcdFx0XHRzaGFkb3dNYXRyaXgubXVsdGlwbHkoIHNoYWRvd0NhbWVyYS5wcm9qZWN0aW9uTWF0cml4ICk7XG5cdFx0XHRcdHNoYWRvd01hdHJpeC5tdWx0aXBseSggc2hhZG93Q2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggc2hhZG93Lm1hcCA9PT0gbnVsbCApIHtcblxuXHRcdFx0XHR2YXIgcGFycyA9IHsgbWluRmlsdGVyOiBOZWFyZXN0RmlsdGVyLCBtYWdGaWx0ZXI6IE5lYXJlc3RGaWx0ZXIsIGZvcm1hdDogUkdCQUZvcm1hdCB9O1xuXG5cdFx0XHRcdHNoYWRvdy5tYXAgPSBuZXcgV2ViR0xSZW5kZXJUYXJnZXQoIF9zaGFkb3dNYXBTaXplLngsIF9zaGFkb3dNYXBTaXplLnksIHBhcnMgKTtcblx0XHRcdFx0c2hhZG93Lm1hcC50ZXh0dXJlLm5hbWUgPSBsaWdodC5uYW1lICsgXCIuc2hhZG93TWFwXCI7XG5cblx0XHRcdFx0c2hhZG93Q2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHNoYWRvdy5pc1Nwb3RMaWdodFNoYWRvdyApIHtcblxuXHRcdFx0XHRzaGFkb3cudXBkYXRlKCBsaWdodCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHZhciBzaGFkb3dNYXAgPSBzaGFkb3cubWFwO1xuXG5cdFx0XHRfcmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KCBzaGFkb3dNYXAgKTtcblx0XHRcdF9yZW5kZXJlci5jbGVhcigpO1xuXG5cdFx0XHQvLyByZW5kZXIgc2hhZG93IG1hcCBmb3IgZWFjaCBjdWJlIGZhY2UgKGlmIG9tbmktZGlyZWN0aW9uYWwpIG9yXG5cdFx0XHQvLyBydW4gYSBzaW5nbGUgcGFzcyBpZiBub3RcblxuXHRcdFx0Zm9yICggdmFyIGZhY2UgPSAwOyBmYWNlIDwgZmFjZUNvdW50OyBmYWNlICsrICkge1xuXG5cdFx0XHRcdGlmICggaXNQb2ludExpZ2h0ICkge1xuXG5cdFx0XHRcdFx0X2xvb2tUYXJnZXQuY29weSggc2hhZG93Q2FtZXJhLnBvc2l0aW9uICk7XG5cdFx0XHRcdFx0X2xvb2tUYXJnZXQuYWRkKCBjdWJlRGlyZWN0aW9uc1sgZmFjZSBdICk7XG5cdFx0XHRcdFx0c2hhZG93Q2FtZXJhLnVwLmNvcHkoIGN1YmVVcHNbIGZhY2UgXSApO1xuXHRcdFx0XHRcdHNoYWRvd0NhbWVyYS5sb29rQXQoIF9sb29rVGFyZ2V0ICk7XG5cdFx0XHRcdFx0c2hhZG93Q2FtZXJhLnVwZGF0ZU1hdHJpeFdvcmxkKCk7XG5cdFx0XHRcdFx0c2hhZG93Q2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZS5nZXRJbnZlcnNlKCBzaGFkb3dDYW1lcmEubWF0cml4V29ybGQgKTtcblxuXHRcdFx0XHRcdHZhciB2cERpbWVuc2lvbnMgPSBjdWJlMkRWaWV3UG9ydHNbIGZhY2UgXTtcblx0XHRcdFx0XHRfc3RhdGUudmlld3BvcnQoIHZwRGltZW5zaW9ucyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyB1cGRhdGUgY2FtZXJhIG1hdHJpY2VzIGFuZCBmcnVzdHVtXG5cblx0XHRcdFx0X3Byb2pTY3JlZW5NYXRyaXgubXVsdGlwbHlNYXRyaWNlcyggc2hhZG93Q2FtZXJhLnByb2plY3Rpb25NYXRyaXgsIHNoYWRvd0NhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UgKTtcblx0XHRcdFx0X2ZydXN0dW0uc2V0RnJvbU1hdHJpeCggX3Byb2pTY3JlZW5NYXRyaXggKTtcblxuXHRcdFx0XHQvLyBzZXQgb2JqZWN0IG1hdHJpY2VzICYgZnJ1c3R1bSBjdWxsaW5nXG5cblx0XHRcdFx0cmVuZGVyT2JqZWN0KCBzY2VuZSwgY2FtZXJhLCBzaGFkb3dDYW1lcmEsIGlzUG9pbnRMaWdodCApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvLyBSZXN0b3JlIEdMIHN0YXRlLlxuXHRcdHZhciBjbGVhckNvbG9yID0gX3JlbmRlcmVyLmdldENsZWFyQ29sb3IoKTtcblx0XHR2YXIgY2xlYXJBbHBoYSA9IF9yZW5kZXJlci5nZXRDbGVhckFscGhhKCk7XG5cdFx0X3JlbmRlcmVyLnNldENsZWFyQ29sb3IoIGNsZWFyQ29sb3IsIGNsZWFyQWxwaGEgKTtcblxuXHRcdHNjb3BlLm5lZWRzVXBkYXRlID0gZmFsc2U7XG5cblx0fTtcblxuXHRmdW5jdGlvbiBnZXREZXB0aE1hdGVyaWFsKCBvYmplY3QsIG1hdGVyaWFsLCBpc1BvaW50TGlnaHQsIGxpZ2h0UG9zaXRpb25Xb3JsZCApIHtcblxuXHRcdHZhciBnZW9tZXRyeSA9IG9iamVjdC5nZW9tZXRyeTtcblxuXHRcdHZhciByZXN1bHQgPSBudWxsO1xuXG5cdFx0dmFyIG1hdGVyaWFsVmFyaWFudHMgPSBfZGVwdGhNYXRlcmlhbHM7XG5cdFx0dmFyIGN1c3RvbU1hdGVyaWFsID0gb2JqZWN0LmN1c3RvbURlcHRoTWF0ZXJpYWw7XG5cblx0XHRpZiAoIGlzUG9pbnRMaWdodCApIHtcblxuXHRcdFx0bWF0ZXJpYWxWYXJpYW50cyA9IF9kaXN0YW5jZU1hdGVyaWFscztcblx0XHRcdGN1c3RvbU1hdGVyaWFsID0gb2JqZWN0LmN1c3RvbURpc3RhbmNlTWF0ZXJpYWw7XG5cblx0XHR9XG5cblx0XHRpZiAoICEgY3VzdG9tTWF0ZXJpYWwgKSB7XG5cblx0XHRcdHZhciB1c2VNb3JwaGluZyA9IGZhbHNlO1xuXG5cdFx0XHRpZiAoIG1hdGVyaWFsLm1vcnBoVGFyZ2V0cyApIHtcblxuXHRcdFx0XHRpZiAoIGdlb21ldHJ5ICYmIGdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgKSB7XG5cblx0XHRcdFx0XHR1c2VNb3JwaGluZyA9IGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcyAmJiBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb24gJiYgZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uLmxlbmd0aCA+IDA7XG5cblx0XHRcdFx0fSBlbHNlIGlmICggZ2VvbWV0cnkgJiYgZ2VvbWV0cnkuaXNHZW9tZXRyeSApIHtcblxuXHRcdFx0XHRcdHVzZU1vcnBoaW5nID0gZ2VvbWV0cnkubW9ycGhUYXJnZXRzICYmIGdlb21ldHJ5Lm1vcnBoVGFyZ2V0cy5sZW5ndGggPiAwO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIG9iamVjdC5pc1NraW5uZWRNZXNoICYmIG1hdGVyaWFsLnNraW5uaW5nID09PSBmYWxzZSApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFNoYWRvd01hcDogVEhSRUUuU2tpbm5lZE1lc2ggd2l0aCBtYXRlcmlhbC5za2lubmluZyBzZXQgdG8gZmFsc2U6Jywgb2JqZWN0ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIHVzZVNraW5uaW5nID0gb2JqZWN0LmlzU2tpbm5lZE1lc2ggJiYgbWF0ZXJpYWwuc2tpbm5pbmc7XG5cblx0XHRcdHZhciB2YXJpYW50SW5kZXggPSAwO1xuXG5cdFx0XHRpZiAoIHVzZU1vcnBoaW5nICkgdmFyaWFudEluZGV4IHw9IF9Nb3JwaGluZ0ZsYWc7XG5cdFx0XHRpZiAoIHVzZVNraW5uaW5nICkgdmFyaWFudEluZGV4IHw9IF9Ta2lubmluZ0ZsYWc7XG5cblx0XHRcdHJlc3VsdCA9IG1hdGVyaWFsVmFyaWFudHNbIHZhcmlhbnRJbmRleCBdO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0cmVzdWx0ID0gY3VzdG9tTWF0ZXJpYWw7XG5cblx0XHR9XG5cblx0XHRpZiAoIF9yZW5kZXJlci5sb2NhbENsaXBwaW5nRW5hYmxlZCAmJlxuXHRcdFx0XHRtYXRlcmlhbC5jbGlwU2hhZG93cyA9PT0gdHJ1ZSAmJlxuXHRcdFx0XHRtYXRlcmlhbC5jbGlwcGluZ1BsYW5lcy5sZW5ndGggIT09IDAgKSB7XG5cblx0XHRcdC8vIGluIHRoaXMgY2FzZSB3ZSBuZWVkIGEgdW5pcXVlIG1hdGVyaWFsIGluc3RhbmNlIHJlZmxlY3RpbmcgdGhlXG5cdFx0XHQvLyBhcHByb3ByaWF0ZSBzdGF0ZVxuXG5cdFx0XHR2YXIga2V5QSA9IHJlc3VsdC51dWlkLCBrZXlCID0gbWF0ZXJpYWwudXVpZDtcblxuXHRcdFx0dmFyIG1hdGVyaWFsc0ZvclZhcmlhbnQgPSBfbWF0ZXJpYWxDYWNoZVsga2V5QSBdO1xuXG5cdFx0XHRpZiAoIG1hdGVyaWFsc0ZvclZhcmlhbnQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRtYXRlcmlhbHNGb3JWYXJpYW50ID0ge307XG5cdFx0XHRcdF9tYXRlcmlhbENhY2hlWyBrZXlBIF0gPSBtYXRlcmlhbHNGb3JWYXJpYW50O1xuXG5cdFx0XHR9XG5cblx0XHRcdHZhciBjYWNoZWRNYXRlcmlhbCA9IG1hdGVyaWFsc0ZvclZhcmlhbnRbIGtleUIgXTtcblxuXHRcdFx0aWYgKCBjYWNoZWRNYXRlcmlhbCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNhY2hlZE1hdGVyaWFsID0gcmVzdWx0LmNsb25lKCk7XG5cdFx0XHRcdG1hdGVyaWFsc0ZvclZhcmlhbnRbIGtleUIgXSA9IGNhY2hlZE1hdGVyaWFsO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJlc3VsdCA9IGNhY2hlZE1hdGVyaWFsO1xuXG5cdFx0fVxuXG5cdFx0cmVzdWx0LnZpc2libGUgPSBtYXRlcmlhbC52aXNpYmxlO1xuXHRcdHJlc3VsdC53aXJlZnJhbWUgPSBtYXRlcmlhbC53aXJlZnJhbWU7XG5cblx0XHR2YXIgc2lkZSA9IG1hdGVyaWFsLnNpZGU7XG5cblx0XHRpZiAoIHNjb3BlLnJlbmRlclNpbmdsZVNpZGVkICYmIHNpZGUgPT0gRG91YmxlU2lkZSApIHtcblxuXHRcdFx0c2lkZSA9IEZyb250U2lkZTtcblxuXHRcdH1cblxuXHRcdGlmICggc2NvcGUucmVuZGVyUmV2ZXJzZVNpZGVkICkge1xuXG5cdFx0XHRpZiAoIHNpZGUgPT09IEZyb250U2lkZSApIHNpZGUgPSBCYWNrU2lkZTtcblx0XHRcdGVsc2UgaWYgKCBzaWRlID09PSBCYWNrU2lkZSApIHNpZGUgPSBGcm9udFNpZGU7XG5cblx0XHR9XG5cblx0XHRyZXN1bHQuc2lkZSA9IHNpZGU7XG5cblx0XHRyZXN1bHQuY2xpcFNoYWRvd3MgPSBtYXRlcmlhbC5jbGlwU2hhZG93cztcblx0XHRyZXN1bHQuY2xpcHBpbmdQbGFuZXMgPSBtYXRlcmlhbC5jbGlwcGluZ1BsYW5lcztcblxuXHRcdHJlc3VsdC53aXJlZnJhbWVMaW5ld2lkdGggPSBtYXRlcmlhbC53aXJlZnJhbWVMaW5ld2lkdGg7XG5cdFx0cmVzdWx0LmxpbmV3aWR0aCA9IG1hdGVyaWFsLmxpbmV3aWR0aDtcblxuXHRcdGlmICggaXNQb2ludExpZ2h0ICYmIHJlc3VsdC51bmlmb3Jtcy5saWdodFBvcyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRyZXN1bHQudW5pZm9ybXMubGlnaHRQb3MudmFsdWUuY29weSggbGlnaHRQb3NpdGlvbldvcmxkICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXG5cdH1cblxuXHRmdW5jdGlvbiByZW5kZXJPYmplY3QoIG9iamVjdCwgY2FtZXJhLCBzaGFkb3dDYW1lcmEsIGlzUG9pbnRMaWdodCApIHtcblxuXHRcdGlmICggb2JqZWN0LnZpc2libGUgPT09IGZhbHNlICkgcmV0dXJuO1xuXG5cdFx0dmFyIHZpc2libGUgPSBvYmplY3QubGF5ZXJzLnRlc3QoIGNhbWVyYS5sYXllcnMgKTtcblxuXHRcdGlmICggdmlzaWJsZSAmJiAoIG9iamVjdC5pc01lc2ggfHwgb2JqZWN0LmlzTGluZSB8fCBvYmplY3QuaXNQb2ludHMgKSApIHtcblxuXHRcdFx0aWYgKCBvYmplY3QuY2FzdFNoYWRvdyAmJiAoICEgb2JqZWN0LmZydXN0dW1DdWxsZWQgfHwgX2ZydXN0dW0uaW50ZXJzZWN0c09iamVjdCggb2JqZWN0ICkgKSApIHtcblxuXHRcdFx0XHRvYmplY3QubW9kZWxWaWV3TWF0cml4Lm11bHRpcGx5TWF0cmljZXMoIHNoYWRvd0NhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UsIG9iamVjdC5tYXRyaXhXb3JsZCApO1xuXG5cdFx0XHRcdHZhciBnZW9tZXRyeSA9IF9vYmplY3RzLnVwZGF0ZSggb2JqZWN0ICk7XG5cdFx0XHRcdHZhciBtYXRlcmlhbCA9IG9iamVjdC5tYXRlcmlhbDtcblxuXHRcdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIG1hdGVyaWFsICkgKSB7XG5cblx0XHRcdFx0XHR2YXIgZ3JvdXBzID0gZ2VvbWV0cnkuZ3JvdXBzO1xuXG5cdFx0XHRcdFx0Zm9yICggdmFyIGsgPSAwLCBrbCA9IGdyb3Vwcy5sZW5ndGg7IGsgPCBrbDsgayArKyApIHtcblxuXHRcdFx0XHRcdFx0dmFyIGdyb3VwID0gZ3JvdXBzWyBrIF07XG5cdFx0XHRcdFx0XHR2YXIgZ3JvdXBNYXRlcmlhbCA9IG1hdGVyaWFsWyBncm91cC5tYXRlcmlhbEluZGV4IF07XG5cblx0XHRcdFx0XHRcdGlmICggZ3JvdXBNYXRlcmlhbCAmJiBncm91cE1hdGVyaWFsLnZpc2libGUgKSB7XG5cblx0XHRcdFx0XHRcdFx0dmFyIGRlcHRoTWF0ZXJpYWwgPSBnZXREZXB0aE1hdGVyaWFsKCBvYmplY3QsIGdyb3VwTWF0ZXJpYWwsIGlzUG9pbnRMaWdodCwgX2xpZ2h0UG9zaXRpb25Xb3JsZCApO1xuXHRcdFx0XHRcdFx0XHRfcmVuZGVyZXIucmVuZGVyQnVmZmVyRGlyZWN0KCBzaGFkb3dDYW1lcmEsIG51bGwsIGdlb21ldHJ5LCBkZXB0aE1hdGVyaWFsLCBvYmplY3QsIGdyb3VwICk7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC52aXNpYmxlICkge1xuXG5cdFx0XHRcdFx0dmFyIGRlcHRoTWF0ZXJpYWwgPSBnZXREZXB0aE1hdGVyaWFsKCBvYmplY3QsIG1hdGVyaWFsLCBpc1BvaW50TGlnaHQsIF9saWdodFBvc2l0aW9uV29ybGQgKTtcblx0XHRcdFx0XHRfcmVuZGVyZXIucmVuZGVyQnVmZmVyRGlyZWN0KCBzaGFkb3dDYW1lcmEsIG51bGwsIGdlb21ldHJ5LCBkZXB0aE1hdGVyaWFsLCBvYmplY3QsIG51bGwgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHZhciBjaGlsZHJlbiA9IG9iamVjdC5jaGlsZHJlbjtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHJlbmRlck9iamVjdCggY2hpbGRyZW5bIGkgXSwgY2FtZXJhLCBzaGFkb3dDYW1lcmEsIGlzUG9pbnRMaWdodCApO1xuXG5cdFx0fVxuXG5cdH1cblxufVxuXG4vKipcbiAqIEBhdXRob3IgYmhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW9cbiAqL1xuXG5mdW5jdGlvbiBSYXkoIG9yaWdpbiwgZGlyZWN0aW9uICkge1xuXG5cdHRoaXMub3JpZ2luID0gKCBvcmlnaW4gIT09IHVuZGVmaW5lZCApID8gb3JpZ2luIDogbmV3IFZlY3RvcjMoKTtcblx0dGhpcy5kaXJlY3Rpb24gPSAoIGRpcmVjdGlvbiAhPT0gdW5kZWZpbmVkICkgPyBkaXJlY3Rpb24gOiBuZXcgVmVjdG9yMygpO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIFJheS5wcm90b3R5cGUsIHtcblxuXHRzZXQ6IGZ1bmN0aW9uICggb3JpZ2luLCBkaXJlY3Rpb24gKSB7XG5cblx0XHR0aGlzLm9yaWdpbi5jb3B5KCBvcmlnaW4gKTtcblx0XHR0aGlzLmRpcmVjdGlvbi5jb3B5KCBkaXJlY3Rpb24gKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggcmF5ICkge1xuXG5cdFx0dGhpcy5vcmlnaW4uY29weSggcmF5Lm9yaWdpbiApO1xuXHRcdHRoaXMuZGlyZWN0aW9uLmNvcHkoIHJheS5kaXJlY3Rpb24gKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YXQ6IGZ1bmN0aW9uICggdCwgb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0XHR2YXIgcmVzdWx0ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiByZXN1bHQuY29weSggdGhpcy5kaXJlY3Rpb24gKS5tdWx0aXBseVNjYWxhciggdCApLmFkZCggdGhpcy5vcmlnaW4gKTtcblxuXHR9LFxuXG5cdGxvb2tBdDogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0dGhpcy5kaXJlY3Rpb24uY29weSggdiApLnN1YiggdGhpcy5vcmlnaW4gKS5ub3JtYWxpemUoKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0cmVjYXN0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHJlY2FzdCggdCApIHtcblxuXHRcdFx0dGhpcy5vcmlnaW4uY29weSggdGhpcy5hdCggdCwgdjEgKSApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGNsb3Nlc3RQb2ludFRvUG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQsIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdFx0dmFyIHJlc3VsdCA9IG9wdGlvbmFsVGFyZ2V0IHx8IG5ldyBWZWN0b3IzKCk7XG5cdFx0cmVzdWx0LnN1YlZlY3RvcnMoIHBvaW50LCB0aGlzLm9yaWdpbiApO1xuXHRcdHZhciBkaXJlY3Rpb25EaXN0YW5jZSA9IHJlc3VsdC5kb3QoIHRoaXMuZGlyZWN0aW9uICk7XG5cblx0XHRpZiAoIGRpcmVjdGlvbkRpc3RhbmNlIDwgMCApIHtcblxuXHRcdFx0cmV0dXJuIHJlc3VsdC5jb3B5KCB0aGlzLm9yaWdpbiApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdC5jb3B5KCB0aGlzLmRpcmVjdGlvbiApLm11bHRpcGx5U2NhbGFyKCBkaXJlY3Rpb25EaXN0YW5jZSApLmFkZCggdGhpcy5vcmlnaW4gKTtcblxuXHR9LFxuXG5cdGRpc3RhbmNlVG9Qb2ludDogZnVuY3Rpb24gKCBwb2ludCApIHtcblxuXHRcdHJldHVybiBNYXRoLnNxcnQoIHRoaXMuZGlzdGFuY2VTcVRvUG9pbnQoIHBvaW50ICkgKTtcblxuXHR9LFxuXG5cdGRpc3RhbmNlU3FUb1BvaW50OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGRpc3RhbmNlU3FUb1BvaW50KCBwb2ludCApIHtcblxuXHRcdFx0dmFyIGRpcmVjdGlvbkRpc3RhbmNlID0gdjEuc3ViVmVjdG9ycyggcG9pbnQsIHRoaXMub3JpZ2luICkuZG90KCB0aGlzLmRpcmVjdGlvbiApO1xuXG5cdFx0XHQvLyBwb2ludCBiZWhpbmQgdGhlIHJheVxuXG5cdFx0XHRpZiAoIGRpcmVjdGlvbkRpc3RhbmNlIDwgMCApIHtcblxuXHRcdFx0XHRyZXR1cm4gdGhpcy5vcmlnaW4uZGlzdGFuY2VUb1NxdWFyZWQoIHBvaW50ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0djEuY29weSggdGhpcy5kaXJlY3Rpb24gKS5tdWx0aXBseVNjYWxhciggZGlyZWN0aW9uRGlzdGFuY2UgKS5hZGQoIHRoaXMub3JpZ2luICk7XG5cblx0XHRcdHJldHVybiB2MS5kaXN0YW5jZVRvU3F1YXJlZCggcG9pbnQgKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGRpc3RhbmNlU3FUb1NlZ21lbnQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBzZWdDZW50ZXIgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciBzZWdEaXIgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciBkaWZmID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBkaXN0YW5jZVNxVG9TZWdtZW50KCB2MCwgdjEsIG9wdGlvbmFsUG9pbnRPblJheSwgb3B0aW9uYWxQb2ludE9uU2VnbWVudCApIHtcblxuXHRcdFx0Ly8gZnJvbSBodHRwOi8vd3d3Lmdlb21ldHJpY3Rvb2xzLmNvbS9HVEVuZ2luZS9JbmNsdWRlL01hdGhlbWF0aWNzL0d0ZURpc3RSYXlTZWdtZW50Lmhcblx0XHRcdC8vIEl0IHJldHVybnMgdGhlIG1pbiBkaXN0YW5jZSBiZXR3ZWVuIHRoZSByYXkgYW5kIHRoZSBzZWdtZW50XG5cdFx0XHQvLyBkZWZpbmVkIGJ5IHYwIGFuZCB2MVxuXHRcdFx0Ly8gSXQgY2FuIGFsc28gc2V0IHR3byBvcHRpb25hbCB0YXJnZXRzIDpcblx0XHRcdC8vIC0gVGhlIGNsb3Nlc3QgcG9pbnQgb24gdGhlIHJheVxuXHRcdFx0Ly8gLSBUaGUgY2xvc2VzdCBwb2ludCBvbiB0aGUgc2VnbWVudFxuXG5cdFx0XHRzZWdDZW50ZXIuY29weSggdjAgKS5hZGQoIHYxICkubXVsdGlwbHlTY2FsYXIoIDAuNSApO1xuXHRcdFx0c2VnRGlyLmNvcHkoIHYxICkuc3ViKCB2MCApLm5vcm1hbGl6ZSgpO1xuXHRcdFx0ZGlmZi5jb3B5KCB0aGlzLm9yaWdpbiApLnN1Yiggc2VnQ2VudGVyICk7XG5cblx0XHRcdHZhciBzZWdFeHRlbnQgPSB2MC5kaXN0YW5jZVRvKCB2MSApICogMC41O1xuXHRcdFx0dmFyIGEwMSA9IC0gdGhpcy5kaXJlY3Rpb24uZG90KCBzZWdEaXIgKTtcblx0XHRcdHZhciBiMCA9IGRpZmYuZG90KCB0aGlzLmRpcmVjdGlvbiApO1xuXHRcdFx0dmFyIGIxID0gLSBkaWZmLmRvdCggc2VnRGlyICk7XG5cdFx0XHR2YXIgYyA9IGRpZmYubGVuZ3RoU3EoKTtcblx0XHRcdHZhciBkZXQgPSBNYXRoLmFicyggMSAtIGEwMSAqIGEwMSApO1xuXHRcdFx0dmFyIHMwLCBzMSwgc3FyRGlzdCwgZXh0RGV0O1xuXG5cdFx0XHRpZiAoIGRldCA+IDAgKSB7XG5cblx0XHRcdFx0Ly8gVGhlIHJheSBhbmQgc2VnbWVudCBhcmUgbm90IHBhcmFsbGVsLlxuXG5cdFx0XHRcdHMwID0gYTAxICogYjEgLSBiMDtcblx0XHRcdFx0czEgPSBhMDEgKiBiMCAtIGIxO1xuXHRcdFx0XHRleHREZXQgPSBzZWdFeHRlbnQgKiBkZXQ7XG5cblx0XHRcdFx0aWYgKCBzMCA+PSAwICkge1xuXG5cdFx0XHRcdFx0aWYgKCBzMSA+PSAtIGV4dERldCApIHtcblxuXHRcdFx0XHRcdFx0aWYgKCBzMSA8PSBleHREZXQgKSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gcmVnaW9uIDBcblx0XHRcdFx0XHRcdFx0Ly8gTWluaW11bSBhdCBpbnRlcmlvciBwb2ludHMgb2YgcmF5IGFuZCBzZWdtZW50LlxuXG5cdFx0XHRcdFx0XHRcdHZhciBpbnZEZXQgPSAxIC8gZGV0O1xuXHRcdFx0XHRcdFx0XHRzMCAqPSBpbnZEZXQ7XG5cdFx0XHRcdFx0XHRcdHMxICo9IGludkRldDtcblx0XHRcdFx0XHRcdFx0c3FyRGlzdCA9IHMwICogKCBzMCArIGEwMSAqIHMxICsgMiAqIGIwICkgKyBzMSAqICggYTAxICogczAgKyBzMSArIDIgKiBiMSApICsgYztcblxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0XHQvLyByZWdpb24gMVxuXG5cdFx0XHRcdFx0XHRcdHMxID0gc2VnRXh0ZW50O1xuXHRcdFx0XHRcdFx0XHRzMCA9IE1hdGgubWF4KCAwLCAtICggYTAxICogczEgKyBiMCApICk7XG5cdFx0XHRcdFx0XHRcdHNxckRpc3QgPSAtIHMwICogczAgKyBzMSAqICggczEgKyAyICogYjEgKSArIGM7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdC8vIHJlZ2lvbiA1XG5cblx0XHRcdFx0XHRcdHMxID0gLSBzZWdFeHRlbnQ7XG5cdFx0XHRcdFx0XHRzMCA9IE1hdGgubWF4KCAwLCAtICggYTAxICogczEgKyBiMCApICk7XG5cdFx0XHRcdFx0XHRzcXJEaXN0ID0gLSBzMCAqIHMwICsgczEgKiAoIHMxICsgMiAqIGIxICkgKyBjO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRpZiAoIHMxIDw9IC0gZXh0RGV0ICkge1xuXG5cdFx0XHRcdFx0XHQvLyByZWdpb24gNFxuXG5cdFx0XHRcdFx0XHRzMCA9IE1hdGgubWF4KCAwLCAtICggLSBhMDEgKiBzZWdFeHRlbnQgKyBiMCApICk7XG5cdFx0XHRcdFx0XHRzMSA9ICggczAgPiAwICkgPyAtIHNlZ0V4dGVudCA6IE1hdGgubWluKCBNYXRoLm1heCggLSBzZWdFeHRlbnQsIC0gYjEgKSwgc2VnRXh0ZW50ICk7XG5cdFx0XHRcdFx0XHRzcXJEaXN0ID0gLSBzMCAqIHMwICsgczEgKiAoIHMxICsgMiAqIGIxICkgKyBjO1xuXG5cdFx0XHRcdFx0fSBlbHNlIGlmICggczEgPD0gZXh0RGV0ICkge1xuXG5cdFx0XHRcdFx0XHQvLyByZWdpb24gM1xuXG5cdFx0XHRcdFx0XHRzMCA9IDA7XG5cdFx0XHRcdFx0XHRzMSA9IE1hdGgubWluKCBNYXRoLm1heCggLSBzZWdFeHRlbnQsIC0gYjEgKSwgc2VnRXh0ZW50ICk7XG5cdFx0XHRcdFx0XHRzcXJEaXN0ID0gczEgKiAoIHMxICsgMiAqIGIxICkgKyBjO1xuXG5cdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0Ly8gcmVnaW9uIDJcblxuXHRcdFx0XHRcdFx0czAgPSBNYXRoLm1heCggMCwgLSAoIGEwMSAqIHNlZ0V4dGVudCArIGIwICkgKTtcblx0XHRcdFx0XHRcdHMxID0gKCBzMCA+IDAgKSA/IHNlZ0V4dGVudCA6IE1hdGgubWluKCBNYXRoLm1heCggLSBzZWdFeHRlbnQsIC0gYjEgKSwgc2VnRXh0ZW50ICk7XG5cdFx0XHRcdFx0XHRzcXJEaXN0ID0gLSBzMCAqIHMwICsgczEgKiAoIHMxICsgMiAqIGIxICkgKyBjO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyBSYXkgYW5kIHNlZ21lbnQgYXJlIHBhcmFsbGVsLlxuXG5cdFx0XHRcdHMxID0gKCBhMDEgPiAwICkgPyAtIHNlZ0V4dGVudCA6IHNlZ0V4dGVudDtcblx0XHRcdFx0czAgPSBNYXRoLm1heCggMCwgLSAoIGEwMSAqIHMxICsgYjAgKSApO1xuXHRcdFx0XHRzcXJEaXN0ID0gLSBzMCAqIHMwICsgczEgKiAoIHMxICsgMiAqIGIxICkgKyBjO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggb3B0aW9uYWxQb2ludE9uUmF5ICkge1xuXG5cdFx0XHRcdG9wdGlvbmFsUG9pbnRPblJheS5jb3B5KCB0aGlzLmRpcmVjdGlvbiApLm11bHRpcGx5U2NhbGFyKCBzMCApLmFkZCggdGhpcy5vcmlnaW4gKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIG9wdGlvbmFsUG9pbnRPblNlZ21lbnQgKSB7XG5cblx0XHRcdFx0b3B0aW9uYWxQb2ludE9uU2VnbWVudC5jb3B5KCBzZWdEaXIgKS5tdWx0aXBseVNjYWxhciggczEgKS5hZGQoIHNlZ0NlbnRlciApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBzcXJEaXN0O1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0aW50ZXJzZWN0U3BoZXJlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGludGVyc2VjdFNwaGVyZSggc3BoZXJlLCBvcHRpb25hbFRhcmdldCApIHtcblxuXHRcdFx0djEuc3ViVmVjdG9ycyggc3BoZXJlLmNlbnRlciwgdGhpcy5vcmlnaW4gKTtcblx0XHRcdHZhciB0Y2EgPSB2MS5kb3QoIHRoaXMuZGlyZWN0aW9uICk7XG5cdFx0XHR2YXIgZDIgPSB2MS5kb3QoIHYxICkgLSB0Y2EgKiB0Y2E7XG5cdFx0XHR2YXIgcmFkaXVzMiA9IHNwaGVyZS5yYWRpdXMgKiBzcGhlcmUucmFkaXVzO1xuXG5cdFx0XHRpZiAoIGQyID4gcmFkaXVzMiApIHJldHVybiBudWxsO1xuXG5cdFx0XHR2YXIgdGhjID0gTWF0aC5zcXJ0KCByYWRpdXMyIC0gZDIgKTtcblxuXHRcdFx0Ly8gdDAgPSBmaXJzdCBpbnRlcnNlY3QgcG9pbnQgLSBlbnRyYW5jZSBvbiBmcm9udCBvZiBzcGhlcmVcblx0XHRcdHZhciB0MCA9IHRjYSAtIHRoYztcblxuXHRcdFx0Ly8gdDEgPSBzZWNvbmQgaW50ZXJzZWN0IHBvaW50IC0gZXhpdCBwb2ludCBvbiBiYWNrIG9mIHNwaGVyZVxuXHRcdFx0dmFyIHQxID0gdGNhICsgdGhjO1xuXG5cdFx0XHQvLyB0ZXN0IHRvIHNlZSBpZiBib3RoIHQwIGFuZCB0MSBhcmUgYmVoaW5kIHRoZSByYXkgLSBpZiBzbywgcmV0dXJuIG51bGxcblx0XHRcdGlmICggdDAgPCAwICYmIHQxIDwgMCApIHJldHVybiBudWxsO1xuXG5cdFx0XHQvLyB0ZXN0IHRvIHNlZSBpZiB0MCBpcyBiZWhpbmQgdGhlIHJheTpcblx0XHRcdC8vIGlmIGl0IGlzLCB0aGUgcmF5IGlzIGluc2lkZSB0aGUgc3BoZXJlLCBzbyByZXR1cm4gdGhlIHNlY29uZCBleGl0IHBvaW50IHNjYWxlZCBieSB0MSxcblx0XHRcdC8vIGluIG9yZGVyIHRvIGFsd2F5cyByZXR1cm4gYW4gaW50ZXJzZWN0IHBvaW50IHRoYXQgaXMgaW4gZnJvbnQgb2YgdGhlIHJheS5cblx0XHRcdGlmICggdDAgPCAwICkgcmV0dXJuIHRoaXMuYXQoIHQxLCBvcHRpb25hbFRhcmdldCApO1xuXG5cdFx0XHQvLyBlbHNlIHQwIGlzIGluIGZyb250IG9mIHRoZSByYXksIHNvIHJldHVybiB0aGUgZmlyc3QgY29sbGlzaW9uIHBvaW50IHNjYWxlZCBieSB0MFxuXHRcdFx0cmV0dXJuIHRoaXMuYXQoIHQwLCBvcHRpb25hbFRhcmdldCApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0aW50ZXJzZWN0c1NwaGVyZTogZnVuY3Rpb24gKCBzcGhlcmUgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5kaXN0YW5jZVRvUG9pbnQoIHNwaGVyZS5jZW50ZXIgKSA8PSBzcGhlcmUucmFkaXVzO1xuXG5cdH0sXG5cblx0ZGlzdGFuY2VUb1BsYW5lOiBmdW5jdGlvbiAoIHBsYW5lICkge1xuXG5cdFx0dmFyIGRlbm9taW5hdG9yID0gcGxhbmUubm9ybWFsLmRvdCggdGhpcy5kaXJlY3Rpb24gKTtcblxuXHRcdGlmICggZGVub21pbmF0b3IgPT09IDAgKSB7XG5cblx0XHRcdC8vIGxpbmUgaXMgY29wbGFuYXIsIHJldHVybiBvcmlnaW5cblx0XHRcdGlmICggcGxhbmUuZGlzdGFuY2VUb1BvaW50KCB0aGlzLm9yaWdpbiApID09PSAwICkge1xuXG5cdFx0XHRcdHJldHVybiAwO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIE51bGwgaXMgcHJlZmVyYWJsZSB0byB1bmRlZmluZWQgc2luY2UgdW5kZWZpbmVkIG1lYW5zLi4uLiBpdCBpcyB1bmRlZmluZWRcblxuXHRcdFx0cmV0dXJuIG51bGw7XG5cblx0XHR9XG5cblx0XHR2YXIgdCA9IC0gKCB0aGlzLm9yaWdpbi5kb3QoIHBsYW5lLm5vcm1hbCApICsgcGxhbmUuY29uc3RhbnQgKSAvIGRlbm9taW5hdG9yO1xuXG5cdFx0Ly8gUmV0dXJuIGlmIHRoZSByYXkgbmV2ZXIgaW50ZXJzZWN0cyB0aGUgcGxhbmVcblxuXHRcdHJldHVybiB0ID49IDAgPyB0IDogIG51bGw7XG5cblx0fSxcblxuXHRpbnRlcnNlY3RQbGFuZTogZnVuY3Rpb24gKCBwbGFuZSwgb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0XHR2YXIgdCA9IHRoaXMuZGlzdGFuY2VUb1BsYW5lKCBwbGFuZSApO1xuXG5cdFx0aWYgKCB0ID09PSBudWxsICkge1xuXG5cdFx0XHRyZXR1cm4gbnVsbDtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmF0KCB0LCBvcHRpb25hbFRhcmdldCApO1xuXG5cdH0sXG5cblx0aW50ZXJzZWN0c1BsYW5lOiBmdW5jdGlvbiAoIHBsYW5lICkge1xuXG5cdFx0Ly8gY2hlY2sgaWYgdGhlIHJheSBsaWVzIG9uIHRoZSBwbGFuZSBmaXJzdFxuXG5cdFx0dmFyIGRpc3RUb1BvaW50ID0gcGxhbmUuZGlzdGFuY2VUb1BvaW50KCB0aGlzLm9yaWdpbiApO1xuXG5cdFx0aWYgKCBkaXN0VG9Qb2ludCA9PT0gMCApIHtcblxuXHRcdFx0cmV0dXJuIHRydWU7XG5cblx0XHR9XG5cblx0XHR2YXIgZGVub21pbmF0b3IgPSBwbGFuZS5ub3JtYWwuZG90KCB0aGlzLmRpcmVjdGlvbiApO1xuXG5cdFx0aWYgKCBkZW5vbWluYXRvciAqIGRpc3RUb1BvaW50IDwgMCApIHtcblxuXHRcdFx0cmV0dXJuIHRydWU7XG5cblx0XHR9XG5cblx0XHQvLyByYXkgb3JpZ2luIGlzIGJlaGluZCB0aGUgcGxhbmUgKGFuZCBpcyBwb2ludGluZyBiZWhpbmQgaXQpXG5cblx0XHRyZXR1cm4gZmFsc2U7XG5cblx0fSxcblxuXHRpbnRlcnNlY3RCb3g6IGZ1bmN0aW9uICggYm94LCBvcHRpb25hbFRhcmdldCApIHtcblxuXHRcdHZhciB0bWluLCB0bWF4LCB0eW1pbiwgdHltYXgsIHR6bWluLCB0em1heDtcblxuXHRcdHZhciBpbnZkaXJ4ID0gMSAvIHRoaXMuZGlyZWN0aW9uLngsXG5cdFx0XHRpbnZkaXJ5ID0gMSAvIHRoaXMuZGlyZWN0aW9uLnksXG5cdFx0XHRpbnZkaXJ6ID0gMSAvIHRoaXMuZGlyZWN0aW9uLno7XG5cblx0XHR2YXIgb3JpZ2luID0gdGhpcy5vcmlnaW47XG5cblx0XHRpZiAoIGludmRpcnggPj0gMCApIHtcblxuXHRcdFx0dG1pbiA9ICggYm94Lm1pbi54IC0gb3JpZ2luLnggKSAqIGludmRpcng7XG5cdFx0XHR0bWF4ID0gKCBib3gubWF4LnggLSBvcmlnaW4ueCApICogaW52ZGlyeDtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHRtaW4gPSAoIGJveC5tYXgueCAtIG9yaWdpbi54ICkgKiBpbnZkaXJ4O1xuXHRcdFx0dG1heCA9ICggYm94Lm1pbi54IC0gb3JpZ2luLnggKSAqIGludmRpcng7XG5cblx0XHR9XG5cblx0XHRpZiAoIGludmRpcnkgPj0gMCApIHtcblxuXHRcdFx0dHltaW4gPSAoIGJveC5taW4ueSAtIG9yaWdpbi55ICkgKiBpbnZkaXJ5O1xuXHRcdFx0dHltYXggPSAoIGJveC5tYXgueSAtIG9yaWdpbi55ICkgKiBpbnZkaXJ5O1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dHltaW4gPSAoIGJveC5tYXgueSAtIG9yaWdpbi55ICkgKiBpbnZkaXJ5O1xuXHRcdFx0dHltYXggPSAoIGJveC5taW4ueSAtIG9yaWdpbi55ICkgKiBpbnZkaXJ5O1xuXG5cdFx0fVxuXG5cdFx0aWYgKCAoIHRtaW4gPiB0eW1heCApIHx8ICggdHltaW4gPiB0bWF4ICkgKSByZXR1cm4gbnVsbDtcblxuXHRcdC8vIFRoZXNlIGxpbmVzIGFsc28gaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHRtaW4gb3IgdG1heCBpcyBOYU5cblx0XHQvLyAocmVzdWx0IG9mIDAgKiBJbmZpbml0eSkuIHggIT09IHggcmV0dXJucyB0cnVlIGlmIHggaXMgTmFOXG5cblx0XHRpZiAoIHR5bWluID4gdG1pbiB8fCB0bWluICE9PSB0bWluICkgdG1pbiA9IHR5bWluO1xuXG5cdFx0aWYgKCB0eW1heCA8IHRtYXggfHwgdG1heCAhPT0gdG1heCApIHRtYXggPSB0eW1heDtcblxuXHRcdGlmICggaW52ZGlyeiA+PSAwICkge1xuXG5cdFx0XHR0em1pbiA9ICggYm94Lm1pbi56IC0gb3JpZ2luLnogKSAqIGludmRpcno7XG5cdFx0XHR0em1heCA9ICggYm94Lm1heC56IC0gb3JpZ2luLnogKSAqIGludmRpcno7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR0em1pbiA9ICggYm94Lm1heC56IC0gb3JpZ2luLnogKSAqIGludmRpcno7XG5cdFx0XHR0em1heCA9ICggYm94Lm1pbi56IC0gb3JpZ2luLnogKSAqIGludmRpcno7XG5cblx0XHR9XG5cblx0XHRpZiAoICggdG1pbiA+IHR6bWF4ICkgfHwgKCB0em1pbiA+IHRtYXggKSApIHJldHVybiBudWxsO1xuXG5cdFx0aWYgKCB0em1pbiA+IHRtaW4gfHwgdG1pbiAhPT0gdG1pbiApIHRtaW4gPSB0em1pbjtcblxuXHRcdGlmICggdHptYXggPCB0bWF4IHx8IHRtYXggIT09IHRtYXggKSB0bWF4ID0gdHptYXg7XG5cblx0XHQvL3JldHVybiBwb2ludCBjbG9zZXN0IHRvIHRoZSByYXkgKHBvc2l0aXZlIHNpZGUpXG5cblx0XHRpZiAoIHRtYXggPCAwICkgcmV0dXJuIG51bGw7XG5cblx0XHRyZXR1cm4gdGhpcy5hdCggdG1pbiA+PSAwID8gdG1pbiA6IHRtYXgsIG9wdGlvbmFsVGFyZ2V0ICk7XG5cblx0fSxcblxuXHRpbnRlcnNlY3RzQm94OiAoIGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBpbnRlcnNlY3RzQm94KCBib3ggKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLmludGVyc2VjdEJveCggYm94LCB2ICkgIT09IG51bGw7XG5cblx0XHR9O1xuXG5cdH0gKSgpLFxuXG5cdGludGVyc2VjdFRyaWFuZ2xlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyBDb21wdXRlIHRoZSBvZmZzZXQgb3JpZ2luLCBlZGdlcywgYW5kIG5vcm1hbC5cblx0XHR2YXIgZGlmZiA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIGVkZ2UxID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgZWRnZTIgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciBub3JtYWwgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGludGVyc2VjdFRyaWFuZ2xlKCBhLCBiLCBjLCBiYWNrZmFjZUN1bGxpbmcsIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdFx0XHQvLyBmcm9tIGh0dHA6Ly93d3cuZ2VvbWV0cmljdG9vbHMuY29tL0dURW5naW5lL0luY2x1ZGUvTWF0aGVtYXRpY3MvR3RlSW50clJheTNUcmlhbmdsZTMuaFxuXG5cdFx0XHRlZGdlMS5zdWJWZWN0b3JzKCBiLCBhICk7XG5cdFx0XHRlZGdlMi5zdWJWZWN0b3JzKCBjLCBhICk7XG5cdFx0XHRub3JtYWwuY3Jvc3NWZWN0b3JzKCBlZGdlMSwgZWRnZTIgKTtcblxuXHRcdFx0Ly8gU29sdmUgUSArIHQqRCA9IGIxKkUxICsgYjIqRTIgKFEgPSBrRGlmZiwgRCA9IHJheSBkaXJlY3Rpb24sXG5cdFx0XHQvLyBFMSA9IGtFZGdlMSwgRTIgPSBrRWRnZTIsIE4gPSBDcm9zcyhFMSxFMikpIGJ5XG5cdFx0XHQvLyAgIHxEb3QoRCxOKXwqYjEgPSBzaWduKERvdChELE4pKSpEb3QoRCxDcm9zcyhRLEUyKSlcblx0XHRcdC8vICAgfERvdChELE4pfCpiMiA9IHNpZ24oRG90KEQsTikpKkRvdChELENyb3NzKEUxLFEpKVxuXHRcdFx0Ly8gICB8RG90KEQsTil8KnQgPSAtc2lnbihEb3QoRCxOKSkqRG90KFEsTilcblx0XHRcdHZhciBEZE4gPSB0aGlzLmRpcmVjdGlvbi5kb3QoIG5vcm1hbCApO1xuXHRcdFx0dmFyIHNpZ247XG5cblx0XHRcdGlmICggRGROID4gMCApIHtcblxuXHRcdFx0XHRpZiAoIGJhY2tmYWNlQ3VsbGluZyApIHJldHVybiBudWxsO1xuXHRcdFx0XHRzaWduID0gMTtcblxuXHRcdFx0fSBlbHNlIGlmICggRGROIDwgMCApIHtcblxuXHRcdFx0XHRzaWduID0gLSAxO1xuXHRcdFx0XHREZE4gPSAtIERkTjtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRyZXR1cm4gbnVsbDtcblxuXHRcdFx0fVxuXG5cdFx0XHRkaWZmLnN1YlZlY3RvcnMoIHRoaXMub3JpZ2luLCBhICk7XG5cdFx0XHR2YXIgRGRReEUyID0gc2lnbiAqIHRoaXMuZGlyZWN0aW9uLmRvdCggZWRnZTIuY3Jvc3NWZWN0b3JzKCBkaWZmLCBlZGdlMiApICk7XG5cblx0XHRcdC8vIGIxIDwgMCwgbm8gaW50ZXJzZWN0aW9uXG5cdFx0XHRpZiAoIERkUXhFMiA8IDAgKSB7XG5cblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIERkRTF4USA9IHNpZ24gKiB0aGlzLmRpcmVjdGlvbi5kb3QoIGVkZ2UxLmNyb3NzKCBkaWZmICkgKTtcblxuXHRcdFx0Ly8gYjIgPCAwLCBubyBpbnRlcnNlY3Rpb25cblx0XHRcdGlmICggRGRFMXhRIDwgMCApIHtcblxuXHRcdFx0XHRyZXR1cm4gbnVsbDtcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBiMStiMiA+IDEsIG5vIGludGVyc2VjdGlvblxuXHRcdFx0aWYgKCBEZFF4RTIgKyBEZEUxeFEgPiBEZE4gKSB7XG5cblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gTGluZSBpbnRlcnNlY3RzIHRyaWFuZ2xlLCBjaGVjayBpZiByYXkgZG9lcy5cblx0XHRcdHZhciBRZE4gPSAtIHNpZ24gKiBkaWZmLmRvdCggbm9ybWFsICk7XG5cblx0XHRcdC8vIHQgPCAwLCBubyBpbnRlcnNlY3Rpb25cblx0XHRcdGlmICggUWROIDwgMCApIHtcblxuXHRcdFx0XHRyZXR1cm4gbnVsbDtcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBSYXkgaW50ZXJzZWN0cyB0cmlhbmdsZS5cblx0XHRcdHJldHVybiB0aGlzLmF0KCBRZE4gLyBEZE4sIG9wdGlvbmFsVGFyZ2V0ICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRhcHBseU1hdHJpeDQ6IGZ1bmN0aW9uICggbWF0cml4NCApIHtcblxuXHRcdHRoaXMuZGlyZWN0aW9uLmFkZCggdGhpcy5vcmlnaW4gKS5hcHBseU1hdHJpeDQoIG1hdHJpeDQgKTtcblx0XHR0aGlzLm9yaWdpbi5hcHBseU1hdHJpeDQoIG1hdHJpeDQgKTtcblx0XHR0aGlzLmRpcmVjdGlvbi5zdWIoIHRoaXMub3JpZ2luICk7XG5cdFx0dGhpcy5kaXJlY3Rpb24ubm9ybWFsaXplKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGVxdWFsczogZnVuY3Rpb24gKCByYXkgKSB7XG5cblx0XHRyZXR1cm4gcmF5Lm9yaWdpbi5lcXVhbHMoIHRoaXMub3JpZ2luICkgJiYgcmF5LmRpcmVjdGlvbi5lcXVhbHMoIHRoaXMuZGlyZWN0aW9uICk7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleVxuICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pb1xuICovXG5cbmZ1bmN0aW9uIEV1bGVyKCB4LCB5LCB6LCBvcmRlciApIHtcblxuXHR0aGlzLl94ID0geCB8fCAwO1xuXHR0aGlzLl95ID0geSB8fCAwO1xuXHR0aGlzLl96ID0geiB8fCAwO1xuXHR0aGlzLl9vcmRlciA9IG9yZGVyIHx8IEV1bGVyLkRlZmF1bHRPcmRlcjtcblxufVxuXG5FdWxlci5Sb3RhdGlvbk9yZGVycyA9IFsgJ1hZWicsICdZWlgnLCAnWlhZJywgJ1haWScsICdZWFonLCAnWllYJyBdO1xuXG5FdWxlci5EZWZhdWx0T3JkZXIgPSAnWFlaJztcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIEV1bGVyLnByb3RvdHlwZSwge1xuXG5cdHg6IHtcblxuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5feDtcblxuXHRcdH0sXG5cblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdHRoaXMuX3ggPSB2YWx1ZTtcblx0XHRcdHRoaXMub25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0eToge1xuXG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLl95O1xuXG5cdFx0fSxcblxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0dGhpcy5feSA9IHZhbHVlO1xuXHRcdFx0dGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHR9XG5cblx0fSxcblxuXHR6OiB7XG5cblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMuX3o7XG5cblx0XHR9LFxuXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHR0aGlzLl96ID0gdmFsdWU7XG5cdFx0XHR0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdG9yZGVyOiB7XG5cblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMuX29yZGVyO1xuXG5cdFx0fSxcblxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0dGhpcy5fb3JkZXIgPSB2YWx1ZTtcblx0XHRcdHRoaXMub25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0fVxuXG5cdH1cblxufSApO1xuXG5PYmplY3QuYXNzaWduKCBFdWxlci5wcm90b3R5cGUsIHtcblxuXHRpc0V1bGVyOiB0cnVlLFxuXG5cdHNldDogZnVuY3Rpb24gKCB4LCB5LCB6LCBvcmRlciApIHtcblxuXHRcdHRoaXMuX3ggPSB4O1xuXHRcdHRoaXMuX3kgPSB5O1xuXHRcdHRoaXMuX3ogPSB6O1xuXHRcdHRoaXMuX29yZGVyID0gb3JkZXIgfHwgdGhpcy5fb3JkZXI7XG5cblx0XHR0aGlzLm9uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvciggdGhpcy5feCwgdGhpcy5feSwgdGhpcy5feiwgdGhpcy5fb3JkZXIgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggZXVsZXIgKSB7XG5cblx0XHR0aGlzLl94ID0gZXVsZXIuX3g7XG5cdFx0dGhpcy5feSA9IGV1bGVyLl95O1xuXHRcdHRoaXMuX3ogPSBldWxlci5fejtcblx0XHR0aGlzLl9vcmRlciA9IGV1bGVyLl9vcmRlcjtcblxuXHRcdHRoaXMub25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRGcm9tUm90YXRpb25NYXRyaXg6IGZ1bmN0aW9uICggbSwgb3JkZXIsIHVwZGF0ZSApIHtcblxuXHRcdHZhciBjbGFtcCA9IF9NYXRoLmNsYW1wO1xuXG5cdFx0Ly8gYXNzdW1lcyB0aGUgdXBwZXIgM3gzIG9mIG0gaXMgYSBwdXJlIHJvdGF0aW9uIG1hdHJpeCAoaS5lLCB1bnNjYWxlZClcblxuXHRcdHZhciB0ZSA9IG0uZWxlbWVudHM7XG5cdFx0dmFyIG0xMSA9IHRlWyAwIF0sIG0xMiA9IHRlWyA0IF0sIG0xMyA9IHRlWyA4IF07XG5cdFx0dmFyIG0yMSA9IHRlWyAxIF0sIG0yMiA9IHRlWyA1IF0sIG0yMyA9IHRlWyA5IF07XG5cdFx0dmFyIG0zMSA9IHRlWyAyIF0sIG0zMiA9IHRlWyA2IF0sIG0zMyA9IHRlWyAxMCBdO1xuXG5cdFx0b3JkZXIgPSBvcmRlciB8fCB0aGlzLl9vcmRlcjtcblxuXHRcdGlmICggb3JkZXIgPT09ICdYWVonICkge1xuXG5cdFx0XHR0aGlzLl95ID0gTWF0aC5hc2luKCBjbGFtcCggbTEzLCAtIDEsIDEgKSApO1xuXG5cdFx0XHRpZiAoIE1hdGguYWJzKCBtMTMgKSA8IDAuOTk5OTkgKSB7XG5cblx0XHRcdFx0dGhpcy5feCA9IE1hdGguYXRhbjIoIC0gbTIzLCBtMzMgKTtcblx0XHRcdFx0dGhpcy5feiA9IE1hdGguYXRhbjIoIC0gbTEyLCBtMTEgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHR0aGlzLl94ID0gTWF0aC5hdGFuMiggbTMyLCBtMjIgKTtcblx0XHRcdFx0dGhpcy5feiA9IDA7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSBpZiAoIG9yZGVyID09PSAnWVhaJyApIHtcblxuXHRcdFx0dGhpcy5feCA9IE1hdGguYXNpbiggLSBjbGFtcCggbTIzLCAtIDEsIDEgKSApO1xuXG5cdFx0XHRpZiAoIE1hdGguYWJzKCBtMjMgKSA8IDAuOTk5OTkgKSB7XG5cblx0XHRcdFx0dGhpcy5feSA9IE1hdGguYXRhbjIoIG0xMywgbTMzICk7XG5cdFx0XHRcdHRoaXMuX3ogPSBNYXRoLmF0YW4yKCBtMjEsIG0yMiApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHRoaXMuX3kgPSBNYXRoLmF0YW4yKCAtIG0zMSwgbTExICk7XG5cdFx0XHRcdHRoaXMuX3ogPSAwO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2UgaWYgKCBvcmRlciA9PT0gJ1pYWScgKSB7XG5cblx0XHRcdHRoaXMuX3ggPSBNYXRoLmFzaW4oIGNsYW1wKCBtMzIsIC0gMSwgMSApICk7XG5cblx0XHRcdGlmICggTWF0aC5hYnMoIG0zMiApIDwgMC45OTk5OSApIHtcblxuXHRcdFx0XHR0aGlzLl95ID0gTWF0aC5hdGFuMiggLSBtMzEsIG0zMyApO1xuXHRcdFx0XHR0aGlzLl96ID0gTWF0aC5hdGFuMiggLSBtMTIsIG0yMiApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHRoaXMuX3kgPSAwO1xuXHRcdFx0XHR0aGlzLl96ID0gTWF0aC5hdGFuMiggbTIxLCBtMTEgKTtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIGlmICggb3JkZXIgPT09ICdaWVgnICkge1xuXG5cdFx0XHR0aGlzLl95ID0gTWF0aC5hc2luKCAtIGNsYW1wKCBtMzEsIC0gMSwgMSApICk7XG5cblx0XHRcdGlmICggTWF0aC5hYnMoIG0zMSApIDwgMC45OTk5OSApIHtcblxuXHRcdFx0XHR0aGlzLl94ID0gTWF0aC5hdGFuMiggbTMyLCBtMzMgKTtcblx0XHRcdFx0dGhpcy5feiA9IE1hdGguYXRhbjIoIG0yMSwgbTExICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0dGhpcy5feCA9IDA7XG5cdFx0XHRcdHRoaXMuX3ogPSBNYXRoLmF0YW4yKCAtIG0xMiwgbTIyICk7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSBpZiAoIG9yZGVyID09PSAnWVpYJyApIHtcblxuXHRcdFx0dGhpcy5feiA9IE1hdGguYXNpbiggY2xhbXAoIG0yMSwgLSAxLCAxICkgKTtcblxuXHRcdFx0aWYgKCBNYXRoLmFicyggbTIxICkgPCAwLjk5OTk5ICkge1xuXG5cdFx0XHRcdHRoaXMuX3ggPSBNYXRoLmF0YW4yKCAtIG0yMywgbTIyICk7XG5cdFx0XHRcdHRoaXMuX3kgPSBNYXRoLmF0YW4yKCAtIG0zMSwgbTExICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0dGhpcy5feCA9IDA7XG5cdFx0XHRcdHRoaXMuX3kgPSBNYXRoLmF0YW4yKCBtMTMsIG0zMyApO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2UgaWYgKCBvcmRlciA9PT0gJ1haWScgKSB7XG5cblx0XHRcdHRoaXMuX3ogPSBNYXRoLmFzaW4oIC0gY2xhbXAoIG0xMiwgLSAxLCAxICkgKTtcblxuXHRcdFx0aWYgKCBNYXRoLmFicyggbTEyICkgPCAwLjk5OTk5ICkge1xuXG5cdFx0XHRcdHRoaXMuX3ggPSBNYXRoLmF0YW4yKCBtMzIsIG0yMiApO1xuXHRcdFx0XHR0aGlzLl95ID0gTWF0aC5hdGFuMiggbTEzLCBtMTEgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHR0aGlzLl94ID0gTWF0aC5hdGFuMiggLSBtMjMsIG0zMyApO1xuXHRcdFx0XHR0aGlzLl95ID0gMDtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuRXVsZXI6IC5zZXRGcm9tUm90YXRpb25NYXRyaXgoKSBnaXZlbiB1bnN1cHBvcnRlZCBvcmRlcjogJyArIG9yZGVyICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLl9vcmRlciA9IG9yZGVyO1xuXG5cdFx0aWYgKCB1cGRhdGUgIT09IGZhbHNlICkgdGhpcy5vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21RdWF0ZXJuaW9uOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgbWF0cml4ID0gbmV3IE1hdHJpeDQoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBzZXRGcm9tUXVhdGVybmlvbiggcSwgb3JkZXIsIHVwZGF0ZSApIHtcblxuXHRcdFx0bWF0cml4Lm1ha2VSb3RhdGlvbkZyb21RdWF0ZXJuaW9uKCBxICk7XG5cblx0XHRcdHJldHVybiB0aGlzLnNldEZyb21Sb3RhdGlvbk1hdHJpeCggbWF0cml4LCBvcmRlciwgdXBkYXRlICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRzZXRGcm9tVmVjdG9yMzogZnVuY3Rpb24gKCB2LCBvcmRlciApIHtcblxuXHRcdHJldHVybiB0aGlzLnNldCggdi54LCB2LnksIHYueiwgb3JkZXIgfHwgdGhpcy5fb3JkZXIgKTtcblxuXHR9LFxuXG5cdHJlb3JkZXI6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIFdBUk5JTkc6IHRoaXMgZGlzY2FyZHMgcmV2b2x1dGlvbiBpbmZvcm1hdGlvbiAtYmhvdXN0b25cblxuXHRcdHZhciBxID0gbmV3IFF1YXRlcm5pb24oKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiByZW9yZGVyKCBuZXdPcmRlciApIHtcblxuXHRcdFx0cS5zZXRGcm9tRXVsZXIoIHRoaXMgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXMuc2V0RnJvbVF1YXRlcm5pb24oIHEsIG5ld09yZGVyICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRlcXVhbHM6IGZ1bmN0aW9uICggZXVsZXIgKSB7XG5cblx0XHRyZXR1cm4gKCBldWxlci5feCA9PT0gdGhpcy5feCApICYmICggZXVsZXIuX3kgPT09IHRoaXMuX3kgKSAmJiAoIGV1bGVyLl96ID09PSB0aGlzLl96ICkgJiYgKCBldWxlci5fb3JkZXIgPT09IHRoaXMuX29yZGVyICk7XG5cblx0fSxcblxuXHRmcm9tQXJyYXk6IGZ1bmN0aW9uICggYXJyYXkgKSB7XG5cblx0XHR0aGlzLl94ID0gYXJyYXlbIDAgXTtcblx0XHR0aGlzLl95ID0gYXJyYXlbIDEgXTtcblx0XHR0aGlzLl96ID0gYXJyYXlbIDIgXTtcblx0XHRpZiAoIGFycmF5WyAzIF0gIT09IHVuZGVmaW5lZCApIHRoaXMuX29yZGVyID0gYXJyYXlbIDMgXTtcblxuXHRcdHRoaXMub25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHR0b0FycmF5OiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoIGFycmF5ID09PSB1bmRlZmluZWQgKSBhcnJheSA9IFtdO1xuXHRcdGlmICggb2Zmc2V0ID09PSB1bmRlZmluZWQgKSBvZmZzZXQgPSAwO1xuXG5cdFx0YXJyYXlbIG9mZnNldCBdID0gdGhpcy5feDtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMSBdID0gdGhpcy5feTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMiBdID0gdGhpcy5fejtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMyBdID0gdGhpcy5fb3JkZXI7XG5cblx0XHRyZXR1cm4gYXJyYXk7XG5cblx0fSxcblxuXHR0b1ZlY3RvcjM6IGZ1bmN0aW9uICggb3B0aW9uYWxSZXN1bHQgKSB7XG5cblx0XHRpZiAoIG9wdGlvbmFsUmVzdWx0ICkge1xuXG5cdFx0XHRyZXR1cm4gb3B0aW9uYWxSZXN1bHQuc2V0KCB0aGlzLl94LCB0aGlzLl95LCB0aGlzLl96ICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRyZXR1cm4gbmV3IFZlY3RvcjMoIHRoaXMuX3gsIHRoaXMuX3ksIHRoaXMuX3ogKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdG9uQ2hhbmdlOiBmdW5jdGlvbiAoIGNhbGxiYWNrICkge1xuXG5cdFx0dGhpcy5vbkNoYW5nZUNhbGxiYWNrID0gY2FsbGJhY2s7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG9uQ2hhbmdlQ2FsbGJhY2s6IGZ1bmN0aW9uICgpIHt9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIExheWVycygpIHtcblxuXHR0aGlzLm1hc2sgPSAxIHwgMDtcblxufVxuXG5PYmplY3QuYXNzaWduKCBMYXllcnMucHJvdG90eXBlLCB7XG5cblx0c2V0OiBmdW5jdGlvbiAoIGNoYW5uZWwgKSB7XG5cblx0XHR0aGlzLm1hc2sgPSAxIDw8IGNoYW5uZWwgfCAwO1xuXG5cdH0sXG5cblx0ZW5hYmxlOiBmdW5jdGlvbiAoIGNoYW5uZWwgKSB7XG5cblx0XHR0aGlzLm1hc2sgfD0gMSA8PCBjaGFubmVsIHwgMDtcblxuXHR9LFxuXG5cdHRvZ2dsZTogZnVuY3Rpb24gKCBjaGFubmVsICkge1xuXG5cdFx0dGhpcy5tYXNrIF49IDEgPDwgY2hhbm5lbCB8IDA7XG5cblx0fSxcblxuXHRkaXNhYmxlOiBmdW5jdGlvbiAoIGNoYW5uZWwgKSB7XG5cblx0XHR0aGlzLm1hc2sgJj0gfiAoIDEgPDwgY2hhbm5lbCB8IDAgKTtcblxuXHR9LFxuXG5cdHRlc3Q6IGZ1bmN0aW9uICggbGF5ZXJzICkge1xuXG5cdFx0cmV0dXJuICggdGhpcy5tYXNrICYgbGF5ZXJzLm1hc2sgKSAhPT0gMDtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBtaWthZWwgZW10aW5nZXIgLyBodHRwOi8vZ29tby5zZS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqIEBhdXRob3IgZWxlcGhhbnRhdHdvcmsgLyB3d3cuZWxlcGhhbnRhdHdvcmsuY2hcbiAqL1xuXG52YXIgb2JqZWN0M0RJZCA9IDA7XG5cbmZ1bmN0aW9uIE9iamVjdDNEKCkge1xuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggdGhpcywgJ2lkJywgeyB2YWx1ZTogb2JqZWN0M0RJZCArKyB9ICk7XG5cblx0dGhpcy51dWlkID0gX01hdGguZ2VuZXJhdGVVVUlEKCk7XG5cblx0dGhpcy5uYW1lID0gJyc7XG5cdHRoaXMudHlwZSA9ICdPYmplY3QzRCc7XG5cblx0dGhpcy5wYXJlbnQgPSBudWxsO1xuXHR0aGlzLmNoaWxkcmVuID0gW107XG5cblx0dGhpcy51cCA9IE9iamVjdDNELkRlZmF1bHRVcC5jbG9uZSgpO1xuXG5cdHZhciBwb3NpdGlvbiA9IG5ldyBWZWN0b3IzKCk7XG5cdHZhciByb3RhdGlvbiA9IG5ldyBFdWxlcigpO1xuXHR2YXIgcXVhdGVybmlvbiA9IG5ldyBRdWF0ZXJuaW9uKCk7XG5cdHZhciBzY2FsZSA9IG5ldyBWZWN0b3IzKCAxLCAxLCAxICk7XG5cblx0ZnVuY3Rpb24gb25Sb3RhdGlvbkNoYW5nZSgpIHtcblxuXHRcdHF1YXRlcm5pb24uc2V0RnJvbUV1bGVyKCByb3RhdGlvbiwgZmFsc2UgKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gb25RdWF0ZXJuaW9uQ2hhbmdlKCkge1xuXG5cdFx0cm90YXRpb24uc2V0RnJvbVF1YXRlcm5pb24oIHF1YXRlcm5pb24sIHVuZGVmaW5lZCwgZmFsc2UgKTtcblxuXHR9XG5cblx0cm90YXRpb24ub25DaGFuZ2UoIG9uUm90YXRpb25DaGFuZ2UgKTtcblx0cXVhdGVybmlvbi5vbkNoYW5nZSggb25RdWF0ZXJuaW9uQ2hhbmdlICk7XG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIHRoaXMsIHtcblx0XHRwb3NpdGlvbjoge1xuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdHZhbHVlOiBwb3NpdGlvblxuXHRcdH0sXG5cdFx0cm90YXRpb246IHtcblx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHR2YWx1ZTogcm90YXRpb25cblx0XHR9LFxuXHRcdHF1YXRlcm5pb246IHtcblx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHR2YWx1ZTogcXVhdGVybmlvblxuXHRcdH0sXG5cdFx0c2NhbGU6IHtcblx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHR2YWx1ZTogc2NhbGVcblx0XHR9LFxuXHRcdG1vZGVsVmlld01hdHJpeDoge1xuXHRcdFx0dmFsdWU6IG5ldyBNYXRyaXg0KClcblx0XHR9LFxuXHRcdG5vcm1hbE1hdHJpeDoge1xuXHRcdFx0dmFsdWU6IG5ldyBNYXRyaXgzKClcblx0XHR9XG5cdH0gKTtcblxuXHR0aGlzLm1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7XG5cdHRoaXMubWF0cml4V29ybGQgPSBuZXcgTWF0cml4NCgpO1xuXG5cdHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IE9iamVjdDNELkRlZmF1bHRNYXRyaXhBdXRvVXBkYXRlO1xuXHR0aGlzLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUgPSBmYWxzZTtcblxuXHR0aGlzLmxheWVycyA9IG5ldyBMYXllcnMoKTtcblx0dGhpcy52aXNpYmxlID0gdHJ1ZTtcblxuXHR0aGlzLmNhc3RTaGFkb3cgPSBmYWxzZTtcblx0dGhpcy5yZWNlaXZlU2hhZG93ID0gZmFsc2U7XG5cblx0dGhpcy5mcnVzdHVtQ3VsbGVkID0gdHJ1ZTtcblx0dGhpcy5yZW5kZXJPcmRlciA9IDA7XG5cblx0dGhpcy51c2VyRGF0YSA9IHt9O1xuXG5cdHRoaXMub25CZWZvcmVSZW5kZXIgPSBmdW5jdGlvbiAoKSB7fTtcblx0dGhpcy5vbkFmdGVyUmVuZGVyID0gZnVuY3Rpb24gKCkge307XG5cbn1cblxuT2JqZWN0M0QuRGVmYXVsdFVwID0gbmV3IFZlY3RvcjMoIDAsIDEsIDAgKTtcbk9iamVjdDNELkRlZmF1bHRNYXRyaXhBdXRvVXBkYXRlID0gdHJ1ZTtcblxuT2JqZWN0LmFzc2lnbiggT2JqZWN0M0QucHJvdG90eXBlLCBFdmVudERpc3BhdGNoZXIucHJvdG90eXBlLCB7XG5cblx0aXNPYmplY3QzRDogdHJ1ZSxcblxuXHRhcHBseU1hdHJpeDogZnVuY3Rpb24gKCBtYXRyaXggKSB7XG5cblx0XHR0aGlzLm1hdHJpeC5tdWx0aXBseU1hdHJpY2VzKCBtYXRyaXgsIHRoaXMubWF0cml4ICk7XG5cblx0XHR0aGlzLm1hdHJpeC5kZWNvbXBvc2UoIHRoaXMucG9zaXRpb24sIHRoaXMucXVhdGVybmlvbiwgdGhpcy5zY2FsZSApO1xuXG5cdH0sXG5cblx0c2V0Um90YXRpb25Gcm9tQXhpc0FuZ2xlOiBmdW5jdGlvbiAoIGF4aXMsIGFuZ2xlICkge1xuXG5cdFx0Ly8gYXNzdW1lcyBheGlzIGlzIG5vcm1hbGl6ZWRcblxuXHRcdHRoaXMucXVhdGVybmlvbi5zZXRGcm9tQXhpc0FuZ2xlKCBheGlzLCBhbmdsZSApO1xuXG5cdH0sXG5cblx0c2V0Um90YXRpb25Gcm9tRXVsZXI6IGZ1bmN0aW9uICggZXVsZXIgKSB7XG5cblx0XHR0aGlzLnF1YXRlcm5pb24uc2V0RnJvbUV1bGVyKCBldWxlciwgdHJ1ZSApO1xuXG5cdH0sXG5cblx0c2V0Um90YXRpb25Gcm9tTWF0cml4OiBmdW5jdGlvbiAoIG0gKSB7XG5cblx0XHQvLyBhc3N1bWVzIHRoZSB1cHBlciAzeDMgb2YgbSBpcyBhIHB1cmUgcm90YXRpb24gbWF0cml4IChpLmUsIHVuc2NhbGVkKVxuXG5cdFx0dGhpcy5xdWF0ZXJuaW9uLnNldEZyb21Sb3RhdGlvbk1hdHJpeCggbSApO1xuXG5cdH0sXG5cblx0c2V0Um90YXRpb25Gcm9tUXVhdGVybmlvbjogZnVuY3Rpb24gKCBxICkge1xuXG5cdFx0Ly8gYXNzdW1lcyBxIGlzIG5vcm1hbGl6ZWRcblxuXHRcdHRoaXMucXVhdGVybmlvbi5jb3B5KCBxICk7XG5cblx0fSxcblxuXHRyb3RhdGVPbkF4aXM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIHJvdGF0ZSBvYmplY3Qgb24gYXhpcyBpbiBvYmplY3Qgc3BhY2Vcblx0XHQvLyBheGlzIGlzIGFzc3VtZWQgdG8gYmUgbm9ybWFsaXplZFxuXG5cdFx0dmFyIHExID0gbmV3IFF1YXRlcm5pb24oKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiByb3RhdGVPbkF4aXMoIGF4aXMsIGFuZ2xlICkge1xuXG5cdFx0XHRxMS5zZXRGcm9tQXhpc0FuZ2xlKCBheGlzLCBhbmdsZSApO1xuXG5cdFx0XHR0aGlzLnF1YXRlcm5pb24ubXVsdGlwbHkoIHExICk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0cm90YXRlWDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoIDEsIDAsIDAgKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiByb3RhdGVYKCBhbmdsZSApIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMucm90YXRlT25BeGlzKCB2MSwgYW5nbGUgKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHJvdGF0ZVk6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IzKCAwLCAxLCAwICk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gcm90YXRlWSggYW5nbGUgKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLnJvdGF0ZU9uQXhpcyggdjEsIGFuZ2xlICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRyb3RhdGVaOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMyggMCwgMCwgMSApO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHJvdGF0ZVooIGFuZ2xlICkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5yb3RhdGVPbkF4aXMoIHYxLCBhbmdsZSApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0dHJhbnNsYXRlT25BeGlzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyB0cmFuc2xhdGUgb2JqZWN0IGJ5IGRpc3RhbmNlIGFsb25nIGF4aXMgaW4gb2JqZWN0IHNwYWNlXG5cdFx0Ly8gYXhpcyBpcyBhc3N1bWVkIHRvIGJlIG5vcm1hbGl6ZWRcblxuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gdHJhbnNsYXRlT25BeGlzKCBheGlzLCBkaXN0YW5jZSApIHtcblxuXHRcdFx0djEuY29weSggYXhpcyApLmFwcGx5UXVhdGVybmlvbiggdGhpcy5xdWF0ZXJuaW9uICk7XG5cblx0XHRcdHRoaXMucG9zaXRpb24uYWRkKCB2MS5tdWx0aXBseVNjYWxhciggZGlzdGFuY2UgKSApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHRyYW5zbGF0ZVg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IzKCAxLCAwLCAwICk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gdHJhbnNsYXRlWCggZGlzdGFuY2UgKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLnRyYW5zbGF0ZU9uQXhpcyggdjEsIGRpc3RhbmNlICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHR0cmFuc2xhdGVZOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMyggMCwgMSwgMCApO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHRyYW5zbGF0ZVkoIGRpc3RhbmNlICkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy50cmFuc2xhdGVPbkF4aXMoIHYxLCBkaXN0YW5jZSApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0dHJhbnNsYXRlWjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHYxID0gbmV3IFZlY3RvcjMoIDAsIDAsIDEgKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiB0cmFuc2xhdGVaKCBkaXN0YW5jZSApIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMudHJhbnNsYXRlT25BeGlzKCB2MSwgZGlzdGFuY2UgKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGxvY2FsVG9Xb3JsZDogZnVuY3Rpb24gKCB2ZWN0b3IgKSB7XG5cblx0XHRyZXR1cm4gdmVjdG9yLmFwcGx5TWF0cml4NCggdGhpcy5tYXRyaXhXb3JsZCApO1xuXG5cdH0sXG5cblx0d29ybGRUb0xvY2FsOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgbTEgPSBuZXcgTWF0cml4NCgpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHdvcmxkVG9Mb2NhbCggdmVjdG9yICkge1xuXG5cdFx0XHRyZXR1cm4gdmVjdG9yLmFwcGx5TWF0cml4NCggbTEuZ2V0SW52ZXJzZSggdGhpcy5tYXRyaXhXb3JsZCApICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRsb29rQXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIFRoaXMgcm91dGluZSBkb2VzIG5vdCBzdXBwb3J0IG9iamVjdHMgd2l0aCByb3RhdGVkIGFuZC9vciB0cmFuc2xhdGVkIHBhcmVudChzKVxuXG5cdFx0dmFyIG0xID0gbmV3IE1hdHJpeDQoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBsb29rQXQoIHZlY3RvciApIHtcblxuXHRcdFx0aWYgKCB0aGlzLmlzQ2FtZXJhICkge1xuXG5cdFx0XHRcdG0xLmxvb2tBdCggdGhpcy5wb3NpdGlvbiwgdmVjdG9yLCB0aGlzLnVwICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0bTEubG9va0F0KCB2ZWN0b3IsIHRoaXMucG9zaXRpb24sIHRoaXMudXAgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLnF1YXRlcm5pb24uc2V0RnJvbVJvdGF0aW9uTWF0cml4KCBtMSApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0YWRkOiBmdW5jdGlvbiAoIG9iamVjdCApIHtcblxuXHRcdGlmICggYXJndW1lbnRzLmxlbmd0aCA+IDEgKSB7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdFx0dGhpcy5hZGQoIGFyZ3VtZW50c1sgaSBdICk7XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9XG5cblx0XHRpZiAoIG9iamVjdCA9PT0gdGhpcyApIHtcblxuXHRcdFx0Y29uc29sZS5lcnJvciggXCJUSFJFRS5PYmplY3QzRC5hZGQ6IG9iamVjdCBjYW4ndCBiZSBhZGRlZCBhcyBhIGNoaWxkIG9mIGl0c2VsZi5cIiwgb2JqZWN0ICk7XG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH1cblxuXHRcdGlmICggKCBvYmplY3QgJiYgb2JqZWN0LmlzT2JqZWN0M0QgKSApIHtcblxuXHRcdFx0aWYgKCBvYmplY3QucGFyZW50ICE9PSBudWxsICkge1xuXG5cdFx0XHRcdG9iamVjdC5wYXJlbnQucmVtb3ZlKCBvYmplY3QgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRvYmplY3QucGFyZW50ID0gdGhpcztcblx0XHRcdG9iamVjdC5kaXNwYXRjaEV2ZW50KCB7IHR5cGU6ICdhZGRlZCcgfSApO1xuXG5cdFx0XHR0aGlzLmNoaWxkcmVuLnB1c2goIG9iamVjdCApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Y29uc29sZS5lcnJvciggXCJUSFJFRS5PYmplY3QzRC5hZGQ6IG9iamVjdCBub3QgYW4gaW5zdGFuY2Ugb2YgVEhSRUUuT2JqZWN0M0QuXCIsIG9iamVjdCApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRyZW1vdmU6IGZ1bmN0aW9uICggb2JqZWN0ICkge1xuXG5cdFx0aWYgKCBhcmd1bWVudHMubGVuZ3RoID4gMSApIHtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0XHR0aGlzLnJlbW92ZSggYXJndW1lbnRzWyBpIF0gKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0dmFyIGluZGV4ID0gdGhpcy5jaGlsZHJlbi5pbmRleE9mKCBvYmplY3QgKTtcblxuXHRcdGlmICggaW5kZXggIT09IC0gMSApIHtcblxuXHRcdFx0b2JqZWN0LnBhcmVudCA9IG51bGw7XG5cblx0XHRcdG9iamVjdC5kaXNwYXRjaEV2ZW50KCB7IHR5cGU6ICdyZW1vdmVkJyB9ICk7XG5cblx0XHRcdHRoaXMuY2hpbGRyZW4uc3BsaWNlKCBpbmRleCwgMSApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0Z2V0T2JqZWN0QnlJZDogZnVuY3Rpb24gKCBpZCApIHtcblxuXHRcdHJldHVybiB0aGlzLmdldE9iamVjdEJ5UHJvcGVydHkoICdpZCcsIGlkICk7XG5cblx0fSxcblxuXHRnZXRPYmplY3RCeU5hbWU6IGZ1bmN0aW9uICggbmFtZSApIHtcblxuXHRcdHJldHVybiB0aGlzLmdldE9iamVjdEJ5UHJvcGVydHkoICduYW1lJywgbmFtZSApO1xuXG5cdH0sXG5cblx0Z2V0T2JqZWN0QnlQcm9wZXJ0eTogZnVuY3Rpb24gKCBuYW1lLCB2YWx1ZSApIHtcblxuXHRcdGlmICggdGhpc1sgbmFtZSBdID09PSB2YWx1ZSApIHJldHVybiB0aGlzO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgY2hpbGQgPSB0aGlzLmNoaWxkcmVuWyBpIF07XG5cdFx0XHR2YXIgb2JqZWN0ID0gY2hpbGQuZ2V0T2JqZWN0QnlQcm9wZXJ0eSggbmFtZSwgdmFsdWUgKTtcblxuXHRcdFx0aWYgKCBvYmplY3QgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRyZXR1cm4gb2JqZWN0O1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXG5cdH0sXG5cblx0Z2V0V29ybGRQb3NpdGlvbjogZnVuY3Rpb24gKCBvcHRpb25hbFRhcmdldCApIHtcblxuXHRcdHZhciByZXN1bHQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMygpO1xuXG5cdFx0dGhpcy51cGRhdGVNYXRyaXhXb3JsZCggdHJ1ZSApO1xuXG5cdFx0cmV0dXJuIHJlc3VsdC5zZXRGcm9tTWF0cml4UG9zaXRpb24oIHRoaXMubWF0cml4V29ybGQgKTtcblxuXHR9LFxuXG5cdGdldFdvcmxkUXVhdGVybmlvbjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHBvc2l0aW9uID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgc2NhbGUgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGdldFdvcmxkUXVhdGVybmlvbiggb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0XHRcdHZhciByZXN1bHQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgUXVhdGVybmlvbigpO1xuXG5cdFx0XHR0aGlzLnVwZGF0ZU1hdHJpeFdvcmxkKCB0cnVlICk7XG5cblx0XHRcdHRoaXMubWF0cml4V29ybGQuZGVjb21wb3NlKCBwb3NpdGlvbiwgcmVzdWx0LCBzY2FsZSApO1xuXG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0Z2V0V29ybGRSb3RhdGlvbjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHF1YXRlcm5pb24gPSBuZXcgUXVhdGVybmlvbigpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGdldFdvcmxkUm90YXRpb24oIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdFx0XHR2YXIgcmVzdWx0ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IEV1bGVyKCk7XG5cblx0XHRcdHRoaXMuZ2V0V29ybGRRdWF0ZXJuaW9uKCBxdWF0ZXJuaW9uICk7XG5cblx0XHRcdHJldHVybiByZXN1bHQuc2V0RnJvbVF1YXRlcm5pb24oIHF1YXRlcm5pb24sIHRoaXMucm90YXRpb24ub3JkZXIsIGZhbHNlICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRnZXRXb3JsZFNjYWxlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgcG9zaXRpb24gPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciBxdWF0ZXJuaW9uID0gbmV3IFF1YXRlcm5pb24oKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBnZXRXb3JsZFNjYWxlKCBvcHRpb25hbFRhcmdldCApIHtcblxuXHRcdFx0dmFyIHJlc3VsdCA9IG9wdGlvbmFsVGFyZ2V0IHx8IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRcdHRoaXMudXBkYXRlTWF0cml4V29ybGQoIHRydWUgKTtcblxuXHRcdFx0dGhpcy5tYXRyaXhXb3JsZC5kZWNvbXBvc2UoIHBvc2l0aW9uLCBxdWF0ZXJuaW9uLCByZXN1bHQgKTtcblxuXHRcdFx0cmV0dXJuIHJlc3VsdDtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGdldFdvcmxkRGlyZWN0aW9uOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgcXVhdGVybmlvbiA9IG5ldyBRdWF0ZXJuaW9uKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gZ2V0V29ybGREaXJlY3Rpb24oIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdFx0XHR2YXIgcmVzdWx0ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IFZlY3RvcjMoKTtcblxuXHRcdFx0dGhpcy5nZXRXb3JsZFF1YXRlcm5pb24oIHF1YXRlcm5pb24gKTtcblxuXHRcdFx0cmV0dXJuIHJlc3VsdC5zZXQoIDAsIDAsIDEgKS5hcHBseVF1YXRlcm5pb24oIHF1YXRlcm5pb24gKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdHJheWNhc3Q6IGZ1bmN0aW9uICgpIHt9LFxuXG5cdHRyYXZlcnNlOiBmdW5jdGlvbiAoIGNhbGxiYWNrICkge1xuXG5cdFx0Y2FsbGJhY2soIHRoaXMgKTtcblxuXHRcdHZhciBjaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW47XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRjaGlsZHJlblsgaSBdLnRyYXZlcnNlKCBjYWxsYmFjayApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0dHJhdmVyc2VWaXNpYmxlOiBmdW5jdGlvbiAoIGNhbGxiYWNrICkge1xuXG5cdFx0aWYgKCB0aGlzLnZpc2libGUgPT09IGZhbHNlICkgcmV0dXJuO1xuXG5cdFx0Y2FsbGJhY2soIHRoaXMgKTtcblxuXHRcdHZhciBjaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW47XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRjaGlsZHJlblsgaSBdLnRyYXZlcnNlVmlzaWJsZSggY2FsbGJhY2sgKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdHRyYXZlcnNlQW5jZXN0b3JzOiBmdW5jdGlvbiAoIGNhbGxiYWNrICkge1xuXG5cdFx0dmFyIHBhcmVudCA9IHRoaXMucGFyZW50O1xuXG5cdFx0aWYgKCBwYXJlbnQgIT09IG51bGwgKSB7XG5cblx0XHRcdGNhbGxiYWNrKCBwYXJlbnQgKTtcblxuXHRcdFx0cGFyZW50LnRyYXZlcnNlQW5jZXN0b3JzKCBjYWxsYmFjayApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0dXBkYXRlTWF0cml4OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLm1hdHJpeC5jb21wb3NlKCB0aGlzLnBvc2l0aW9uLCB0aGlzLnF1YXRlcm5pb24sIHRoaXMuc2NhbGUgKTtcblxuXHRcdHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0fSxcblxuXHR1cGRhdGVNYXRyaXhXb3JsZDogZnVuY3Rpb24gKCBmb3JjZSApIHtcblxuXHRcdGlmICggdGhpcy5tYXRyaXhBdXRvVXBkYXRlICkgdGhpcy51cGRhdGVNYXRyaXgoKTtcblxuXHRcdGlmICggdGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlIHx8IGZvcmNlICkge1xuXG5cdFx0XHRpZiAoIHRoaXMucGFyZW50ID09PSBudWxsICkge1xuXG5cdFx0XHRcdHRoaXMubWF0cml4V29ybGQuY29weSggdGhpcy5tYXRyaXggKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHR0aGlzLm1hdHJpeFdvcmxkLm11bHRpcGx5TWF0cmljZXMoIHRoaXMucGFyZW50Lm1hdHJpeFdvcmxkLCB0aGlzLm1hdHJpeCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZSA9IGZhbHNlO1xuXG5cdFx0XHRmb3JjZSA9IHRydWU7XG5cblx0XHR9XG5cblx0XHQvLyB1cGRhdGUgY2hpbGRyZW5cblxuXHRcdHZhciBjaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW47XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRjaGlsZHJlblsgaSBdLnVwZGF0ZU1hdHJpeFdvcmxkKCBmb3JjZSApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0dG9KU09OOiBmdW5jdGlvbiAoIG1ldGEgKSB7XG5cblx0XHQvLyBtZXRhIGlzICcnIHdoZW4gY2FsbGVkIGZyb20gSlNPTi5zdHJpbmdpZnlcblx0XHR2YXIgaXNSb290T2JqZWN0ID0gKCBtZXRhID09PSB1bmRlZmluZWQgfHwgbWV0YSA9PT0gJycgKTtcblxuXHRcdHZhciBvdXRwdXQgPSB7fTtcblxuXHRcdC8vIG1ldGEgaXMgYSBoYXNoIHVzZWQgdG8gY29sbGVjdCBnZW9tZXRyaWVzLCBtYXRlcmlhbHMuXG5cdFx0Ly8gbm90IHByb3ZpZGluZyBpdCBpbXBsaWVzIHRoYXQgdGhpcyBpcyB0aGUgcm9vdCBvYmplY3Rcblx0XHQvLyBiZWluZyBzZXJpYWxpemVkLlxuXHRcdGlmICggaXNSb290T2JqZWN0ICkge1xuXG5cdFx0XHQvLyBpbml0aWFsaXplIG1ldGEgb2JqXG5cdFx0XHRtZXRhID0ge1xuXHRcdFx0XHRnZW9tZXRyaWVzOiB7fSxcblx0XHRcdFx0bWF0ZXJpYWxzOiB7fSxcblx0XHRcdFx0dGV4dHVyZXM6IHt9LFxuXHRcdFx0XHRpbWFnZXM6IHt9XG5cdFx0XHR9O1xuXG5cdFx0XHRvdXRwdXQubWV0YWRhdGEgPSB7XG5cdFx0XHRcdHZlcnNpb246IDQuNSxcblx0XHRcdFx0dHlwZTogJ09iamVjdCcsXG5cdFx0XHRcdGdlbmVyYXRvcjogJ09iamVjdDNELnRvSlNPTidcblx0XHRcdH07XG5cblx0XHR9XG5cblx0XHQvLyBzdGFuZGFyZCBPYmplY3QzRCBzZXJpYWxpemF0aW9uXG5cblx0XHR2YXIgb2JqZWN0ID0ge307XG5cblx0XHRvYmplY3QudXVpZCA9IHRoaXMudXVpZDtcblx0XHRvYmplY3QudHlwZSA9IHRoaXMudHlwZTtcblxuXHRcdGlmICggdGhpcy5uYW1lICE9PSAnJyApIG9iamVjdC5uYW1lID0gdGhpcy5uYW1lO1xuXHRcdGlmICggSlNPTi5zdHJpbmdpZnkoIHRoaXMudXNlckRhdGEgKSAhPT0gJ3t9JyApIG9iamVjdC51c2VyRGF0YSA9IHRoaXMudXNlckRhdGE7XG5cdFx0aWYgKCB0aGlzLmNhc3RTaGFkb3cgPT09IHRydWUgKSBvYmplY3QuY2FzdFNoYWRvdyA9IHRydWU7XG5cdFx0aWYgKCB0aGlzLnJlY2VpdmVTaGFkb3cgPT09IHRydWUgKSBvYmplY3QucmVjZWl2ZVNoYWRvdyA9IHRydWU7XG5cdFx0aWYgKCB0aGlzLnZpc2libGUgPT09IGZhbHNlICkgb2JqZWN0LnZpc2libGUgPSBmYWxzZTtcblxuXHRcdG9iamVjdC5tYXRyaXggPSB0aGlzLm1hdHJpeC50b0FycmF5KCk7XG5cblx0XHQvL1xuXG5cdFx0ZnVuY3Rpb24gc2VyaWFsaXplKCBsaWJyYXJ5LCBlbGVtZW50ICkge1xuXG5cdFx0XHRpZiAoIGxpYnJhcnlbIGVsZW1lbnQudXVpZCBdID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0bGlicmFyeVsgZWxlbWVudC51dWlkIF0gPSBlbGVtZW50LnRvSlNPTiggbWV0YSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBlbGVtZW50LnV1aWQ7XG5cblx0XHR9XG5cblx0XHRpZiAoIHRoaXMuZ2VvbWV0cnkgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0b2JqZWN0Lmdlb21ldHJ5ID0gc2VyaWFsaXplKCBtZXRhLmdlb21ldHJpZXMsIHRoaXMuZ2VvbWV0cnkgKTtcblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5tYXRlcmlhbCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIHRoaXMubWF0ZXJpYWwgKSApIHtcblxuXHRcdFx0XHR2YXIgdXVpZHMgPSBbXTtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSB0aGlzLm1hdGVyaWFsLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHR1dWlkcy5wdXNoKCBzZXJpYWxpemUoIG1ldGEubWF0ZXJpYWxzLCB0aGlzLm1hdGVyaWFsWyBpIF0gKSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRvYmplY3QubWF0ZXJpYWwgPSB1dWlkcztcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRvYmplY3QubWF0ZXJpYWwgPSBzZXJpYWxpemUoIG1ldGEubWF0ZXJpYWxzLCB0aGlzLm1hdGVyaWFsICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vXG5cblx0XHRpZiAoIHRoaXMuY2hpbGRyZW4ubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0b2JqZWN0LmNoaWxkcmVuID0gW107XG5cblx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRcdG9iamVjdC5jaGlsZHJlbi5wdXNoKCB0aGlzLmNoaWxkcmVuWyBpIF0udG9KU09OKCBtZXRhICkub2JqZWN0ICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggaXNSb290T2JqZWN0ICkge1xuXG5cdFx0XHR2YXIgZ2VvbWV0cmllcyA9IGV4dHJhY3RGcm9tQ2FjaGUoIG1ldGEuZ2VvbWV0cmllcyApO1xuXHRcdFx0dmFyIG1hdGVyaWFscyA9IGV4dHJhY3RGcm9tQ2FjaGUoIG1ldGEubWF0ZXJpYWxzICk7XG5cdFx0XHR2YXIgdGV4dHVyZXMgPSBleHRyYWN0RnJvbUNhY2hlKCBtZXRhLnRleHR1cmVzICk7XG5cdFx0XHR2YXIgaW1hZ2VzID0gZXh0cmFjdEZyb21DYWNoZSggbWV0YS5pbWFnZXMgKTtcblxuXHRcdFx0aWYgKCBnZW9tZXRyaWVzLmxlbmd0aCA+IDAgKSBvdXRwdXQuZ2VvbWV0cmllcyA9IGdlb21ldHJpZXM7XG5cdFx0XHRpZiAoIG1hdGVyaWFscy5sZW5ndGggPiAwICkgb3V0cHV0Lm1hdGVyaWFscyA9IG1hdGVyaWFscztcblx0XHRcdGlmICggdGV4dHVyZXMubGVuZ3RoID4gMCApIG91dHB1dC50ZXh0dXJlcyA9IHRleHR1cmVzO1xuXHRcdFx0aWYgKCBpbWFnZXMubGVuZ3RoID4gMCApIG91dHB1dC5pbWFnZXMgPSBpbWFnZXM7XG5cblx0XHR9XG5cblx0XHRvdXRwdXQub2JqZWN0ID0gb2JqZWN0O1xuXG5cdFx0cmV0dXJuIG91dHB1dDtcblxuXHRcdC8vIGV4dHJhY3QgZGF0YSBmcm9tIHRoZSBjYWNoZSBoYXNoXG5cdFx0Ly8gcmVtb3ZlIG1ldGFkYXRhIG9uIGVhY2ggaXRlbVxuXHRcdC8vIGFuZCByZXR1cm4gYXMgYXJyYXlcblx0XHRmdW5jdGlvbiBleHRyYWN0RnJvbUNhY2hlKCBjYWNoZSApIHtcblxuXHRcdFx0dmFyIHZhbHVlcyA9IFtdO1xuXHRcdFx0Zm9yICggdmFyIGtleSBpbiBjYWNoZSApIHtcblxuXHRcdFx0XHR2YXIgZGF0YSA9IGNhY2hlWyBrZXkgXTtcblx0XHRcdFx0ZGVsZXRlIGRhdGEubWV0YWRhdGE7XG5cdFx0XHRcdHZhbHVlcy5wdXNoKCBkYXRhICk7XG5cblx0XHRcdH1cblx0XHRcdHJldHVybiB2YWx1ZXM7XG5cblx0XHR9XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCByZWN1cnNpdmUgKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzLCByZWN1cnNpdmUgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlLCByZWN1cnNpdmUgKSB7XG5cblx0XHRpZiAoIHJlY3Vyc2l2ZSA9PT0gdW5kZWZpbmVkICkgcmVjdXJzaXZlID0gdHJ1ZTtcblxuXHRcdHRoaXMubmFtZSA9IHNvdXJjZS5uYW1lO1xuXG5cdFx0dGhpcy51cC5jb3B5KCBzb3VyY2UudXAgKTtcblxuXHRcdHRoaXMucG9zaXRpb24uY29weSggc291cmNlLnBvc2l0aW9uICk7XG5cdFx0dGhpcy5xdWF0ZXJuaW9uLmNvcHkoIHNvdXJjZS5xdWF0ZXJuaW9uICk7XG5cdFx0dGhpcy5zY2FsZS5jb3B5KCBzb3VyY2Uuc2NhbGUgKTtcblxuXHRcdHRoaXMubWF0cml4LmNvcHkoIHNvdXJjZS5tYXRyaXggKTtcblx0XHR0aGlzLm1hdHJpeFdvcmxkLmNvcHkoIHNvdXJjZS5tYXRyaXhXb3JsZCApO1xuXG5cdFx0dGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gc291cmNlLm1hdHJpeEF1dG9VcGRhdGU7XG5cdFx0dGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlID0gc291cmNlLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU7XG5cblx0XHR0aGlzLmxheWVycy5tYXNrID0gc291cmNlLmxheWVycy5tYXNrO1xuXHRcdHRoaXMudmlzaWJsZSA9IHNvdXJjZS52aXNpYmxlO1xuXG5cdFx0dGhpcy5jYXN0U2hhZG93ID0gc291cmNlLmNhc3RTaGFkb3c7XG5cdFx0dGhpcy5yZWNlaXZlU2hhZG93ID0gc291cmNlLnJlY2VpdmVTaGFkb3c7XG5cblx0XHR0aGlzLmZydXN0dW1DdWxsZWQgPSBzb3VyY2UuZnJ1c3R1bUN1bGxlZDtcblx0XHR0aGlzLnJlbmRlck9yZGVyID0gc291cmNlLnJlbmRlck9yZGVyO1xuXG5cdFx0dGhpcy51c2VyRGF0YSA9IEpTT04ucGFyc2UoIEpTT04uc3RyaW5naWZ5KCBzb3VyY2UudXNlckRhdGEgKSApO1xuXG5cdFx0aWYgKCByZWN1cnNpdmUgPT09IHRydWUgKSB7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IHNvdXJjZS5jaGlsZHJlbi5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdFx0dmFyIGNoaWxkID0gc291cmNlLmNoaWxkcmVuWyBpIF07XG5cdFx0XHRcdHRoaXMuYWRkKCBjaGlsZC5jbG9uZSgpICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgYmhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW9cbiAqL1xuXG5mdW5jdGlvbiBMaW5lMyggc3RhcnQsIGVuZCApIHtcblxuXHR0aGlzLnN0YXJ0ID0gKCBzdGFydCAhPT0gdW5kZWZpbmVkICkgPyBzdGFydCA6IG5ldyBWZWN0b3IzKCk7XG5cdHRoaXMuZW5kID0gKCBlbmQgIT09IHVuZGVmaW5lZCApID8gZW5kIDogbmV3IFZlY3RvcjMoKTtcblxufVxuXG5PYmplY3QuYXNzaWduKCBMaW5lMy5wcm90b3R5cGUsIHtcblxuXHRzZXQ6IGZ1bmN0aW9uICggc3RhcnQsIGVuZCApIHtcblxuXHRcdHRoaXMuc3RhcnQuY29weSggc3RhcnQgKTtcblx0XHR0aGlzLmVuZC5jb3B5KCBlbmQgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggbGluZSApIHtcblxuXHRcdHRoaXMuc3RhcnQuY29weSggbGluZS5zdGFydCApO1xuXHRcdHRoaXMuZW5kLmNvcHkoIGxpbmUuZW5kICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGdldENlbnRlcjogZnVuY3Rpb24gKCBvcHRpb25hbFRhcmdldCApIHtcblxuXHRcdHZhciByZXN1bHQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMygpO1xuXHRcdHJldHVybiByZXN1bHQuYWRkVmVjdG9ycyggdGhpcy5zdGFydCwgdGhpcy5lbmQgKS5tdWx0aXBseVNjYWxhciggMC41ICk7XG5cblx0fSxcblxuXHRkZWx0YTogZnVuY3Rpb24gKCBvcHRpb25hbFRhcmdldCApIHtcblxuXHRcdHZhciByZXN1bHQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMygpO1xuXHRcdHJldHVybiByZXN1bHQuc3ViVmVjdG9ycyggdGhpcy5lbmQsIHRoaXMuc3RhcnQgKTtcblxuXHR9LFxuXG5cdGRpc3RhbmNlU3E6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLnN0YXJ0LmRpc3RhbmNlVG9TcXVhcmVkKCB0aGlzLmVuZCApO1xuXG5cdH0sXG5cblx0ZGlzdGFuY2U6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLnN0YXJ0LmRpc3RhbmNlVG8oIHRoaXMuZW5kICk7XG5cblx0fSxcblxuXHRhdDogZnVuY3Rpb24gKCB0LCBvcHRpb25hbFRhcmdldCApIHtcblxuXHRcdHZhciByZXN1bHQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIHRoaXMuZGVsdGEoIHJlc3VsdCApLm11bHRpcGx5U2NhbGFyKCB0ICkuYWRkKCB0aGlzLnN0YXJ0ICk7XG5cblx0fSxcblxuXHRjbG9zZXN0UG9pbnRUb1BvaW50UGFyYW1ldGVyOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgc3RhcnRQID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgc3RhcnRFbmQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGNsb3Nlc3RQb2ludFRvUG9pbnRQYXJhbWV0ZXIoIHBvaW50LCBjbGFtcFRvTGluZSApIHtcblxuXHRcdFx0c3RhcnRQLnN1YlZlY3RvcnMoIHBvaW50LCB0aGlzLnN0YXJ0ICk7XG5cdFx0XHRzdGFydEVuZC5zdWJWZWN0b3JzKCB0aGlzLmVuZCwgdGhpcy5zdGFydCApO1xuXG5cdFx0XHR2YXIgc3RhcnRFbmQyID0gc3RhcnRFbmQuZG90KCBzdGFydEVuZCApO1xuXHRcdFx0dmFyIHN0YXJ0RW5kX3N0YXJ0UCA9IHN0YXJ0RW5kLmRvdCggc3RhcnRQICk7XG5cblx0XHRcdHZhciB0ID0gc3RhcnRFbmRfc3RhcnRQIC8gc3RhcnRFbmQyO1xuXG5cdFx0XHRpZiAoIGNsYW1wVG9MaW5lICkge1xuXG5cdFx0XHRcdHQgPSBfTWF0aC5jbGFtcCggdCwgMCwgMSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0O1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0Y2xvc2VzdFBvaW50VG9Qb2ludDogZnVuY3Rpb24gKCBwb2ludCwgY2xhbXBUb0xpbmUsIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdFx0dmFyIHQgPSB0aGlzLmNsb3Nlc3RQb2ludFRvUG9pbnRQYXJhbWV0ZXIoIHBvaW50LCBjbGFtcFRvTGluZSApO1xuXG5cdFx0dmFyIHJlc3VsdCA9IG9wdGlvbmFsVGFyZ2V0IHx8IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gdGhpcy5kZWx0YSggcmVzdWx0ICkubXVsdGlwbHlTY2FsYXIoIHQgKS5hZGQoIHRoaXMuc3RhcnQgKTtcblxuXHR9LFxuXG5cdGFwcGx5TWF0cml4NDogZnVuY3Rpb24gKCBtYXRyaXggKSB7XG5cblx0XHR0aGlzLnN0YXJ0LmFwcGx5TWF0cml4NCggbWF0cml4ICk7XG5cdFx0dGhpcy5lbmQuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZXF1YWxzOiBmdW5jdGlvbiAoIGxpbmUgKSB7XG5cblx0XHRyZXR1cm4gbGluZS5zdGFydC5lcXVhbHMoIHRoaXMuc3RhcnQgKSAmJiBsaW5lLmVuZC5lcXVhbHMoIHRoaXMuZW5kICk7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pb1xuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBUcmlhbmdsZSggYSwgYiwgYyApIHtcblxuXHR0aGlzLmEgPSAoIGEgIT09IHVuZGVmaW5lZCApID8gYSA6IG5ldyBWZWN0b3IzKCk7XG5cdHRoaXMuYiA9ICggYiAhPT0gdW5kZWZpbmVkICkgPyBiIDogbmV3IFZlY3RvcjMoKTtcblx0dGhpcy5jID0gKCBjICE9PSB1bmRlZmluZWQgKSA/IGMgOiBuZXcgVmVjdG9yMygpO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIFRyaWFuZ2xlLCB7XG5cblx0bm9ybWFsOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjAgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIG5vcm1hbCggYSwgYiwgYywgb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0XHRcdHZhciByZXN1bHQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMygpO1xuXG5cdFx0XHRyZXN1bHQuc3ViVmVjdG9ycyggYywgYiApO1xuXHRcdFx0djAuc3ViVmVjdG9ycyggYSwgYiApO1xuXHRcdFx0cmVzdWx0LmNyb3NzKCB2MCApO1xuXG5cdFx0XHR2YXIgcmVzdWx0TGVuZ3RoU3EgPSByZXN1bHQubGVuZ3RoU3EoKTtcblx0XHRcdGlmICggcmVzdWx0TGVuZ3RoU3EgPiAwICkge1xuXG5cdFx0XHRcdHJldHVybiByZXN1bHQubXVsdGlwbHlTY2FsYXIoIDEgLyBNYXRoLnNxcnQoIHJlc3VsdExlbmd0aFNxICkgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gcmVzdWx0LnNldCggMCwgMCwgMCApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0Ly8gc3RhdGljL2luc3RhbmNlIG1ldGhvZCB0byBjYWxjdWxhdGUgYmFyeWNlbnRyaWMgY29vcmRpbmF0ZXNcblx0Ly8gYmFzZWQgb246IGh0dHA6Ly93d3cuYmxhY2twYXduLmNvbS90ZXh0cy9wb2ludGlucG9seS9kZWZhdWx0Lmh0bWxcblx0YmFyeWNvb3JkRnJvbVBvaW50OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjAgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIHYyID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBiYXJ5Y29vcmRGcm9tUG9pbnQoIHBvaW50LCBhLCBiLCBjLCBvcHRpb25hbFRhcmdldCApIHtcblxuXHRcdFx0djAuc3ViVmVjdG9ycyggYywgYSApO1xuXHRcdFx0djEuc3ViVmVjdG9ycyggYiwgYSApO1xuXHRcdFx0djIuc3ViVmVjdG9ycyggcG9pbnQsIGEgKTtcblxuXHRcdFx0dmFyIGRvdDAwID0gdjAuZG90KCB2MCApO1xuXHRcdFx0dmFyIGRvdDAxID0gdjAuZG90KCB2MSApO1xuXHRcdFx0dmFyIGRvdDAyID0gdjAuZG90KCB2MiApO1xuXHRcdFx0dmFyIGRvdDExID0gdjEuZG90KCB2MSApO1xuXHRcdFx0dmFyIGRvdDEyID0gdjEuZG90KCB2MiApO1xuXG5cdFx0XHR2YXIgZGVub20gPSAoIGRvdDAwICogZG90MTEgLSBkb3QwMSAqIGRvdDAxICk7XG5cblx0XHRcdHZhciByZXN1bHQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMygpO1xuXG5cdFx0XHQvLyBjb2xsaW5lYXIgb3Igc2luZ3VsYXIgdHJpYW5nbGVcblx0XHRcdGlmICggZGVub20gPT09IDAgKSB7XG5cblx0XHRcdFx0Ly8gYXJiaXRyYXJ5IGxvY2F0aW9uIG91dHNpZGUgb2YgdHJpYW5nbGU/XG5cdFx0XHRcdC8vIG5vdCBzdXJlIGlmIHRoaXMgaXMgdGhlIGJlc3QgaWRlYSwgbWF5YmUgc2hvdWxkIGJlIHJldHVybmluZyB1bmRlZmluZWRcblx0XHRcdFx0cmV0dXJuIHJlc3VsdC5zZXQoIC0gMiwgLSAxLCAtIDEgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgaW52RGVub20gPSAxIC8gZGVub207XG5cdFx0XHR2YXIgdSA9ICggZG90MTEgKiBkb3QwMiAtIGRvdDAxICogZG90MTIgKSAqIGludkRlbm9tO1xuXHRcdFx0dmFyIHYgPSAoIGRvdDAwICogZG90MTIgLSBkb3QwMSAqIGRvdDAyICkgKiBpbnZEZW5vbTtcblxuXHRcdFx0Ly8gYmFyeWNlbnRyaWMgY29vcmRpbmF0ZXMgbXVzdCBhbHdheXMgc3VtIHRvIDFcblx0XHRcdHJldHVybiByZXN1bHQuc2V0KCAxIC0gdSAtIHYsIHYsIHUgKTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGNvbnRhaW5zUG9pbnQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gY29udGFpbnNQb2ludCggcG9pbnQsIGEsIGIsIGMgKSB7XG5cblx0XHRcdHZhciByZXN1bHQgPSBUcmlhbmdsZS5iYXJ5Y29vcmRGcm9tUG9pbnQoIHBvaW50LCBhLCBiLCBjLCB2MSApO1xuXG5cdFx0XHRyZXR1cm4gKCByZXN1bHQueCA+PSAwICkgJiYgKCByZXN1bHQueSA+PSAwICkgJiYgKCAoIHJlc3VsdC54ICsgcmVzdWx0LnkgKSA8PSAxICk7XG5cblx0XHR9O1xuXG5cdH0oKVxuXG59ICk7XG5cbk9iamVjdC5hc3NpZ24oIFRyaWFuZ2xlLnByb3RvdHlwZSwge1xuXG5cdHNldDogZnVuY3Rpb24gKCBhLCBiLCBjICkge1xuXG5cdFx0dGhpcy5hLmNvcHkoIGEgKTtcblx0XHR0aGlzLmIuY29weSggYiApO1xuXHRcdHRoaXMuYy5jb3B5KCBjICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21Qb2ludHNBbmRJbmRpY2VzOiBmdW5jdGlvbiAoIHBvaW50cywgaTAsIGkxLCBpMiApIHtcblxuXHRcdHRoaXMuYS5jb3B5KCBwb2ludHNbIGkwIF0gKTtcblx0XHR0aGlzLmIuY29weSggcG9pbnRzWyBpMSBdICk7XG5cdFx0dGhpcy5jLmNvcHkoIHBvaW50c1sgaTIgXSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCB0cmlhbmdsZSApIHtcblxuXHRcdHRoaXMuYS5jb3B5KCB0cmlhbmdsZS5hICk7XG5cdFx0dGhpcy5iLmNvcHkoIHRyaWFuZ2xlLmIgKTtcblx0XHR0aGlzLmMuY29weSggdHJpYW5nbGUuYyApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRhcmVhOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjAgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciB2MSA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gYXJlYSgpIHtcblxuXHRcdFx0djAuc3ViVmVjdG9ycyggdGhpcy5jLCB0aGlzLmIgKTtcblx0XHRcdHYxLnN1YlZlY3RvcnMoIHRoaXMuYSwgdGhpcy5iICk7XG5cblx0XHRcdHJldHVybiB2MC5jcm9zcyggdjEgKS5sZW5ndGgoKSAqIDAuNTtcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdG1pZHBvaW50OiBmdW5jdGlvbiAoIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdFx0dmFyIHJlc3VsdCA9IG9wdGlvbmFsVGFyZ2V0IHx8IG5ldyBWZWN0b3IzKCk7XG5cdFx0cmV0dXJuIHJlc3VsdC5hZGRWZWN0b3JzKCB0aGlzLmEsIHRoaXMuYiApLmFkZCggdGhpcy5jICkubXVsdGlwbHlTY2FsYXIoIDEgLyAzICk7XG5cblx0fSxcblxuXHRub3JtYWw6IGZ1bmN0aW9uICggb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0XHRyZXR1cm4gVHJpYW5nbGUubm9ybWFsKCB0aGlzLmEsIHRoaXMuYiwgdGhpcy5jLCBvcHRpb25hbFRhcmdldCApO1xuXG5cdH0sXG5cblx0cGxhbmU6IGZ1bmN0aW9uICggb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0XHR2YXIgcmVzdWx0ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IFBsYW5lKCk7XG5cblx0XHRyZXR1cm4gcmVzdWx0LnNldEZyb21Db3BsYW5hclBvaW50cyggdGhpcy5hLCB0aGlzLmIsIHRoaXMuYyApO1xuXG5cdH0sXG5cblx0YmFyeWNvb3JkRnJvbVBvaW50OiBmdW5jdGlvbiAoIHBvaW50LCBvcHRpb25hbFRhcmdldCApIHtcblxuXHRcdHJldHVybiBUcmlhbmdsZS5iYXJ5Y29vcmRGcm9tUG9pbnQoIHBvaW50LCB0aGlzLmEsIHRoaXMuYiwgdGhpcy5jLCBvcHRpb25hbFRhcmdldCApO1xuXG5cdH0sXG5cblx0Y29udGFpbnNQb2ludDogZnVuY3Rpb24gKCBwb2ludCApIHtcblxuXHRcdHJldHVybiBUcmlhbmdsZS5jb250YWluc1BvaW50KCBwb2ludCwgdGhpcy5hLCB0aGlzLmIsIHRoaXMuYyApO1xuXG5cdH0sXG5cblx0Y2xvc2VzdFBvaW50VG9Qb2ludDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHBsYW5lID0gbmV3IFBsYW5lKCk7XG5cdFx0dmFyIGVkZ2VMaXN0ID0gWyBuZXcgTGluZTMoKSwgbmV3IExpbmUzKCksIG5ldyBMaW5lMygpIF07XG5cdFx0dmFyIHByb2plY3RlZFBvaW50ID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgY2xvc2VzdFBvaW50ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBjbG9zZXN0UG9pbnRUb1BvaW50KCBwb2ludCwgb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0XHRcdHZhciByZXN1bHQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMygpO1xuXHRcdFx0dmFyIG1pbkRpc3RhbmNlID0gSW5maW5pdHk7XG5cblx0XHRcdC8vIHByb2plY3QgdGhlIHBvaW50IG9udG8gdGhlIHBsYW5lIG9mIHRoZSB0cmlhbmdsZVxuXG5cdFx0XHRwbGFuZS5zZXRGcm9tQ29wbGFuYXJQb2ludHMoIHRoaXMuYSwgdGhpcy5iLCB0aGlzLmMgKTtcblx0XHRcdHBsYW5lLnByb2plY3RQb2ludCggcG9pbnQsIHByb2plY3RlZFBvaW50ICk7XG5cblx0XHRcdC8vIGNoZWNrIGlmIHRoZSBwcm9qZWN0aW9uIGxpZXMgd2l0aGluIHRoZSB0cmlhbmdsZVxuXG5cdFx0XHRpZiggdGhpcy5jb250YWluc1BvaW50KCBwcm9qZWN0ZWRQb2ludCApID09PSB0cnVlICkge1xuXG5cdFx0XHRcdC8vIGlmIHNvLCB0aGlzIGlzIHRoZSBjbG9zZXN0IHBvaW50XG5cblx0XHRcdFx0cmVzdWx0LmNvcHkoIHByb2plY3RlZFBvaW50ICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Ly8gaWYgbm90LCB0aGUgcG9pbnQgZmFsbHMgb3V0c2lkZSB0aGUgdHJpYW5nbGUuIHRoZSByZXN1bHQgaXMgdGhlIGNsb3Nlc3QgcG9pbnQgdG8gdGhlIHRyaWFuZ2xlJ3MgZWRnZXMgb3IgdmVydGljZXNcblxuXHRcdFx0XHRlZGdlTGlzdFsgMCBdLnNldCggdGhpcy5hLCB0aGlzLmIgKTtcblx0XHRcdFx0ZWRnZUxpc3RbIDEgXS5zZXQoIHRoaXMuYiwgdGhpcy5jICk7XG5cdFx0XHRcdGVkZ2VMaXN0WyAyIF0uc2V0KCB0aGlzLmMsIHRoaXMuYSApO1xuXG5cdFx0XHRcdGZvciggdmFyIGkgPSAwOyBpIDwgZWRnZUxpc3QubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRcdFx0ZWRnZUxpc3RbIGkgXS5jbG9zZXN0UG9pbnRUb1BvaW50KCBwcm9qZWN0ZWRQb2ludCwgdHJ1ZSwgY2xvc2VzdFBvaW50ICk7XG5cblx0XHRcdFx0XHR2YXIgZGlzdGFuY2UgPSBwcm9qZWN0ZWRQb2ludC5kaXN0YW5jZVRvU3F1YXJlZCggY2xvc2VzdFBvaW50ICk7XG5cblx0XHRcdFx0XHRpZiggZGlzdGFuY2UgPCBtaW5EaXN0YW5jZSApIHtcblxuXHRcdFx0XHRcdFx0bWluRGlzdGFuY2UgPSBkaXN0YW5jZTtcblxuXHRcdFx0XHRcdFx0cmVzdWx0LmNvcHkoIGNsb3Nlc3RQb2ludCApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0ZXF1YWxzOiBmdW5jdGlvbiAoIHRyaWFuZ2xlICkge1xuXG5cdFx0cmV0dXJuIHRyaWFuZ2xlLmEuZXF1YWxzKCB0aGlzLmEgKSAmJiB0cmlhbmdsZS5iLmVxdWFscyggdGhpcy5iICkgJiYgdHJpYW5nbGUuYy5lcXVhbHMoIHRoaXMuYyApO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICovXG5cbmZ1bmN0aW9uIEZhY2UzKCBhLCBiLCBjLCBub3JtYWwsIGNvbG9yLCBtYXRlcmlhbEluZGV4ICkge1xuXG5cdHRoaXMuYSA9IGE7XG5cdHRoaXMuYiA9IGI7XG5cdHRoaXMuYyA9IGM7XG5cblx0dGhpcy5ub3JtYWwgPSAoIG5vcm1hbCAmJiBub3JtYWwuaXNWZWN0b3IzICkgPyBub3JtYWwgOiBuZXcgVmVjdG9yMygpO1xuXHR0aGlzLnZlcnRleE5vcm1hbHMgPSBBcnJheS5pc0FycmF5KCBub3JtYWwgKSA/IG5vcm1hbCA6IFtdO1xuXG5cdHRoaXMuY29sb3IgPSAoIGNvbG9yICYmIGNvbG9yLmlzQ29sb3IgKSA/IGNvbG9yIDogbmV3IENvbG9yKCk7XG5cdHRoaXMudmVydGV4Q29sb3JzID0gQXJyYXkuaXNBcnJheSggY29sb3IgKSA/IGNvbG9yIDogW107XG5cblx0dGhpcy5tYXRlcmlhbEluZGV4ID0gbWF0ZXJpYWxJbmRleCAhPT0gdW5kZWZpbmVkID8gbWF0ZXJpYWxJbmRleCA6IDA7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggRmFjZTMucHJvdG90eXBlLCB7XG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0dGhpcy5hID0gc291cmNlLmE7XG5cdFx0dGhpcy5iID0gc291cmNlLmI7XG5cdFx0dGhpcy5jID0gc291cmNlLmM7XG5cblx0XHR0aGlzLm5vcm1hbC5jb3B5KCBzb3VyY2Uubm9ybWFsICk7XG5cdFx0dGhpcy5jb2xvci5jb3B5KCBzb3VyY2UuY29sb3IgKTtcblxuXHRcdHRoaXMubWF0ZXJpYWxJbmRleCA9IHNvdXJjZS5tYXRlcmlhbEluZGV4O1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IHNvdXJjZS52ZXJ0ZXhOb3JtYWxzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR0aGlzLnZlcnRleE5vcm1hbHNbIGkgXSA9IHNvdXJjZS52ZXJ0ZXhOb3JtYWxzWyBpIF0uY2xvbmUoKTtcblxuXHRcdH1cblxuXHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBzb3VyY2UudmVydGV4Q29sb3JzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR0aGlzLnZlcnRleENvbG9yc1sgaSBdID0gc291cmNlLnZlcnRleENvbG9yc1sgaSBdLmNsb25lKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqXG4gKiBwYXJhbWV0ZXJzID0ge1xuICogIGNvbG9yOiA8aGV4PixcbiAqICBvcGFjaXR5OiA8ZmxvYXQ+LFxuICogIG1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgbGlnaHRNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKiAgbGlnaHRNYXBJbnRlbnNpdHk6IDxmbG9hdD5cbiAqXG4gKiAgYW9NYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKiAgYW9NYXBJbnRlbnNpdHk6IDxmbG9hdD5cbiAqXG4gKiAgc3BlY3VsYXJNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIGFscGhhTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBlbnZNYXA6IG5ldyBUSFJFRS5UZXh0dXJlQ3ViZSggW3Bvc3gsIG5lZ3gsIHBvc3ksIG5lZ3ksIHBvc3osIG5lZ3pdICksXG4gKiAgY29tYmluZTogVEhSRUUuTXVsdGlwbHksXG4gKiAgcmVmbGVjdGl2aXR5OiA8ZmxvYXQ+LFxuICogIHJlZnJhY3Rpb25SYXRpbzogPGZsb2F0PixcbiAqXG4gKiAgc2hhZGluZzogVEhSRUUuU21vb3RoU2hhZGluZyxcbiAqICBkZXB0aFRlc3Q6IDxib29sPixcbiAqICBkZXB0aFdyaXRlOiA8Ym9vbD4sXG4gKlxuICogIHdpcmVmcmFtZTogPGJvb2xlYW4+LFxuICogIHdpcmVmcmFtZUxpbmV3aWR0aDogPGZsb2F0PixcbiAqXG4gKiAgc2tpbm5pbmc6IDxib29sPixcbiAqICBtb3JwaFRhcmdldHM6IDxib29sPlxuICogfVxuICovXG5cbmZ1bmN0aW9uIE1lc2hCYXNpY01hdGVyaWFsKCBwYXJhbWV0ZXJzICkge1xuXG5cdE1hdGVyaWFsLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnTWVzaEJhc2ljTWF0ZXJpYWwnO1xuXG5cdHRoaXMuY29sb3IgPSBuZXcgQ29sb3IoIDB4ZmZmZmZmICk7IC8vIGVtaXNzaXZlXG5cblx0dGhpcy5tYXAgPSBudWxsO1xuXG5cdHRoaXMubGlnaHRNYXAgPSBudWxsO1xuXHR0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5ID0gMS4wO1xuXG5cdHRoaXMuYW9NYXAgPSBudWxsO1xuXHR0aGlzLmFvTWFwSW50ZW5zaXR5ID0gMS4wO1xuXG5cdHRoaXMuc3BlY3VsYXJNYXAgPSBudWxsO1xuXG5cdHRoaXMuYWxwaGFNYXAgPSBudWxsO1xuXG5cdHRoaXMuZW52TWFwID0gbnVsbDtcblx0dGhpcy5jb21iaW5lID0gTXVsdGlwbHlPcGVyYXRpb247XG5cdHRoaXMucmVmbGVjdGl2aXR5ID0gMTtcblx0dGhpcy5yZWZyYWN0aW9uUmF0aW8gPSAwLjk4O1xuXG5cdHRoaXMud2lyZWZyYW1lID0gZmFsc2U7XG5cdHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gMTtcblx0dGhpcy53aXJlZnJhbWVMaW5lY2FwID0gJ3JvdW5kJztcblx0dGhpcy53aXJlZnJhbWVMaW5lam9pbiA9ICdyb3VuZCc7XG5cblx0dGhpcy5za2lubmluZyA9IGZhbHNlO1xuXHR0aGlzLm1vcnBoVGFyZ2V0cyA9IGZhbHNlO1xuXG5cdHRoaXMubGlnaHRzID0gZmFsc2U7XG5cblx0dGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTtcblxufVxuXG5NZXNoQmFzaWNNYXRlcmlhbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBNYXRlcmlhbC5wcm90b3R5cGUgKTtcbk1lc2hCYXNpY01hdGVyaWFsLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE1lc2hCYXNpY01hdGVyaWFsO1xuXG5NZXNoQmFzaWNNYXRlcmlhbC5wcm90b3R5cGUuaXNNZXNoQmFzaWNNYXRlcmlhbCA9IHRydWU7XG5cbk1lc2hCYXNpY01hdGVyaWFsLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0TWF0ZXJpYWwucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0dGhpcy5jb2xvci5jb3B5KCBzb3VyY2UuY29sb3IgKTtcblxuXHR0aGlzLm1hcCA9IHNvdXJjZS5tYXA7XG5cblx0dGhpcy5saWdodE1hcCA9IHNvdXJjZS5saWdodE1hcDtcblx0dGhpcy5saWdodE1hcEludGVuc2l0eSA9IHNvdXJjZS5saWdodE1hcEludGVuc2l0eTtcblxuXHR0aGlzLmFvTWFwID0gc291cmNlLmFvTWFwO1xuXHR0aGlzLmFvTWFwSW50ZW5zaXR5ID0gc291cmNlLmFvTWFwSW50ZW5zaXR5O1xuXG5cdHRoaXMuc3BlY3VsYXJNYXAgPSBzb3VyY2Uuc3BlY3VsYXJNYXA7XG5cblx0dGhpcy5hbHBoYU1hcCA9IHNvdXJjZS5hbHBoYU1hcDtcblxuXHR0aGlzLmVudk1hcCA9IHNvdXJjZS5lbnZNYXA7XG5cdHRoaXMuY29tYmluZSA9IHNvdXJjZS5jb21iaW5lO1xuXHR0aGlzLnJlZmxlY3Rpdml0eSA9IHNvdXJjZS5yZWZsZWN0aXZpdHk7XG5cdHRoaXMucmVmcmFjdGlvblJhdGlvID0gc291cmNlLnJlZnJhY3Rpb25SYXRpbztcblxuXHR0aGlzLndpcmVmcmFtZSA9IHNvdXJjZS53aXJlZnJhbWU7XG5cdHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gc291cmNlLndpcmVmcmFtZUxpbmV3aWR0aDtcblx0dGhpcy53aXJlZnJhbWVMaW5lY2FwID0gc291cmNlLndpcmVmcmFtZUxpbmVjYXA7XG5cdHRoaXMud2lyZWZyYW1lTGluZWpvaW4gPSBzb3VyY2Uud2lyZWZyYW1lTGluZWpvaW47XG5cblx0dGhpcy5za2lubmluZyA9IHNvdXJjZS5za2lubmluZztcblx0dGhpcy5tb3JwaFRhcmdldHMgPSBzb3VyY2UubW9ycGhUYXJnZXRzO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gQnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKSB7XG5cblx0aWYgKCBBcnJheS5pc0FycmF5KCBhcnJheSApICkge1xuXG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvciggJ1RIUkVFLkJ1ZmZlckF0dHJpYnV0ZTogYXJyYXkgc2hvdWxkIGJlIGEgVHlwZWQgQXJyYXkuJyApO1xuXG5cdH1cblxuXHR0aGlzLnV1aWQgPSBfTWF0aC5nZW5lcmF0ZVVVSUQoKTtcblxuXHR0aGlzLmFycmF5ID0gYXJyYXk7XG5cdHRoaXMuaXRlbVNpemUgPSBpdGVtU2l6ZTtcblx0dGhpcy5jb3VudCA9IGFycmF5ICE9PSB1bmRlZmluZWQgPyBhcnJheS5sZW5ndGggLyBpdGVtU2l6ZSA6IDA7XG5cdHRoaXMubm9ybWFsaXplZCA9IG5vcm1hbGl6ZWQgPT09IHRydWU7XG5cblx0dGhpcy5keW5hbWljID0gZmFsc2U7XG5cdHRoaXMudXBkYXRlUmFuZ2UgPSB7IG9mZnNldDogMCwgY291bnQ6IC0gMSB9O1xuXG5cdHRoaXMub25VcGxvYWRDYWxsYmFjayA9IGZ1bmN0aW9uICgpIHt9O1xuXG5cdHRoaXMudmVyc2lvbiA9IDA7XG5cbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KCBCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLCAnbmVlZHNVcGRhdGUnLCB7XG5cblx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0aWYgKCB2YWx1ZSA9PT0gdHJ1ZSApIHRoaXMudmVyc2lvbiArKztcblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmFzc2lnbiggQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSwge1xuXG5cdGlzQnVmZmVyQXR0cmlidXRlOiB0cnVlLFxuXG5cdHNldEFycmF5OiBmdW5jdGlvbiAoIGFycmF5ICkge1xuXG5cdFx0aWYgKCBBcnJheS5pc0FycmF5KCBhcnJheSApICkge1xuXG5cdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCAnVEhSRUUuQnVmZmVyQXR0cmlidXRlOiBhcnJheSBzaG91bGQgYmUgYSBUeXBlZCBBcnJheS4nICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLmNvdW50ID0gYXJyYXkgIT09IHVuZGVmaW5lZCA/IGFycmF5Lmxlbmd0aCAvIHRoaXMuaXRlbVNpemUgOiAwO1xuXHRcdHRoaXMuYXJyYXkgPSBhcnJheTtcblxuXHR9LFxuXG5cdHNldER5bmFtaWM6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLmR5bmFtaWMgPSB2YWx1ZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHR0aGlzLmFycmF5ID0gbmV3IHNvdXJjZS5hcnJheS5jb25zdHJ1Y3Rvciggc291cmNlLmFycmF5ICk7XG5cdFx0dGhpcy5pdGVtU2l6ZSA9IHNvdXJjZS5pdGVtU2l6ZTtcblx0XHR0aGlzLmNvdW50ID0gc291cmNlLmNvdW50O1xuXHRcdHRoaXMubm9ybWFsaXplZCA9IHNvdXJjZS5ub3JtYWxpemVkO1xuXG5cdFx0dGhpcy5keW5hbWljID0gc291cmNlLmR5bmFtaWM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvcHlBdDogZnVuY3Rpb24gKCBpbmRleDEsIGF0dHJpYnV0ZSwgaW5kZXgyICkge1xuXG5cdFx0aW5kZXgxICo9IHRoaXMuaXRlbVNpemU7XG5cdFx0aW5kZXgyICo9IGF0dHJpYnV0ZS5pdGVtU2l6ZTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHRoaXMuaXRlbVNpemU7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR0aGlzLmFycmF5WyBpbmRleDEgKyBpIF0gPSBhdHRyaWJ1dGUuYXJyYXlbIGluZGV4MiArIGkgXTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y29weUFycmF5OiBmdW5jdGlvbiAoIGFycmF5ICkge1xuXG5cdFx0dGhpcy5hcnJheS5zZXQoIGFycmF5ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvcHlDb2xvcnNBcnJheTogZnVuY3Rpb24gKCBjb2xvcnMgKSB7XG5cblx0XHR2YXIgYXJyYXkgPSB0aGlzLmFycmF5LCBvZmZzZXQgPSAwO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gY29sb3JzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBjb2xvciA9IGNvbG9yc1sgaSBdO1xuXG5cdFx0XHRpZiAoIGNvbG9yID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQnVmZmVyQXR0cmlidXRlLmNvcHlDb2xvcnNBcnJheSgpOiBjb2xvciBpcyB1bmRlZmluZWQnLCBpICk7XG5cdFx0XHRcdGNvbG9yID0gbmV3IENvbG9yKCk7XG5cblx0XHRcdH1cblxuXHRcdFx0YXJyYXlbIG9mZnNldCArKyBdID0gY29sb3Iucjtcblx0XHRcdGFycmF5WyBvZmZzZXQgKysgXSA9IGNvbG9yLmc7XG5cdFx0XHRhcnJheVsgb2Zmc2V0ICsrIF0gPSBjb2xvci5iO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjb3B5SW5kaWNlc0FycmF5OiBmdW5jdGlvbiAoIGluZGljZXMgKSB7XG5cblx0XHR2YXIgYXJyYXkgPSB0aGlzLmFycmF5LCBvZmZzZXQgPSAwO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gaW5kaWNlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgaW5kZXggPSBpbmRpY2VzWyBpIF07XG5cblx0XHRcdGFycmF5WyBvZmZzZXQgKysgXSA9IGluZGV4LmE7XG5cdFx0XHRhcnJheVsgb2Zmc2V0ICsrIF0gPSBpbmRleC5iO1xuXHRcdFx0YXJyYXlbIG9mZnNldCArKyBdID0gaW5kZXguYztcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y29weVZlY3RvcjJzQXJyYXk6IGZ1bmN0aW9uICggdmVjdG9ycyApIHtcblxuXHRcdHZhciBhcnJheSA9IHRoaXMuYXJyYXksIG9mZnNldCA9IDA7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSB2ZWN0b3JzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciB2ZWN0b3IgPSB2ZWN0b3JzWyBpIF07XG5cblx0XHRcdGlmICggdmVjdG9yID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQnVmZmVyQXR0cmlidXRlLmNvcHlWZWN0b3Iyc0FycmF5KCk6IHZlY3RvciBpcyB1bmRlZmluZWQnLCBpICk7XG5cdFx0XHRcdHZlY3RvciA9IG5ldyBWZWN0b3IyKCk7XG5cblx0XHRcdH1cblxuXHRcdFx0YXJyYXlbIG9mZnNldCArKyBdID0gdmVjdG9yLng7XG5cdFx0XHRhcnJheVsgb2Zmc2V0ICsrIF0gPSB2ZWN0b3IueTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y29weVZlY3RvcjNzQXJyYXk6IGZ1bmN0aW9uICggdmVjdG9ycyApIHtcblxuXHRcdHZhciBhcnJheSA9IHRoaXMuYXJyYXksIG9mZnNldCA9IDA7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSB2ZWN0b3JzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciB2ZWN0b3IgPSB2ZWN0b3JzWyBpIF07XG5cblx0XHRcdGlmICggdmVjdG9yID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQnVmZmVyQXR0cmlidXRlLmNvcHlWZWN0b3Izc0FycmF5KCk6IHZlY3RvciBpcyB1bmRlZmluZWQnLCBpICk7XG5cdFx0XHRcdHZlY3RvciA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRcdH1cblxuXHRcdFx0YXJyYXlbIG9mZnNldCArKyBdID0gdmVjdG9yLng7XG5cdFx0XHRhcnJheVsgb2Zmc2V0ICsrIF0gPSB2ZWN0b3IueTtcblx0XHRcdGFycmF5WyBvZmZzZXQgKysgXSA9IHZlY3Rvci56O1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjb3B5VmVjdG9yNHNBcnJheTogZnVuY3Rpb24gKCB2ZWN0b3JzICkge1xuXG5cdFx0dmFyIGFycmF5ID0gdGhpcy5hcnJheSwgb2Zmc2V0ID0gMDtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHZlY3RvcnMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIHZlY3RvciA9IHZlY3RvcnNbIGkgXTtcblxuXHRcdFx0aWYgKCB2ZWN0b3IgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJBdHRyaWJ1dGUuY29weVZlY3RvcjRzQXJyYXkoKTogdmVjdG9yIGlzIHVuZGVmaW5lZCcsIGkgKTtcblx0XHRcdFx0dmVjdG9yID0gbmV3IFZlY3RvcjQoKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRhcnJheVsgb2Zmc2V0ICsrIF0gPSB2ZWN0b3IueDtcblx0XHRcdGFycmF5WyBvZmZzZXQgKysgXSA9IHZlY3Rvci55O1xuXHRcdFx0YXJyYXlbIG9mZnNldCArKyBdID0gdmVjdG9yLno7XG5cdFx0XHRhcnJheVsgb2Zmc2V0ICsrIF0gPSB2ZWN0b3IudztcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlLCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0gMDtcblxuXHRcdHRoaXMuYXJyYXkuc2V0KCB2YWx1ZSwgb2Zmc2V0ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGdldFg6IGZ1bmN0aW9uICggaW5kZXggKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5hcnJheVsgaW5kZXggKiB0aGlzLml0ZW1TaXplIF07XG5cblx0fSxcblxuXHRzZXRYOiBmdW5jdGlvbiAoIGluZGV4LCB4ICkge1xuXG5cdFx0dGhpcy5hcnJheVsgaW5kZXggKiB0aGlzLml0ZW1TaXplIF0gPSB4O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRnZXRZOiBmdW5jdGlvbiAoIGluZGV4ICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuYXJyYXlbIGluZGV4ICogdGhpcy5pdGVtU2l6ZSArIDEgXTtcblxuXHR9LFxuXG5cdHNldFk6IGZ1bmN0aW9uICggaW5kZXgsIHkgKSB7XG5cblx0XHR0aGlzLmFycmF5WyBpbmRleCAqIHRoaXMuaXRlbVNpemUgKyAxIF0gPSB5O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRnZXRaOiBmdW5jdGlvbiAoIGluZGV4ICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuYXJyYXlbIGluZGV4ICogdGhpcy5pdGVtU2l6ZSArIDIgXTtcblxuXHR9LFxuXG5cdHNldFo6IGZ1bmN0aW9uICggaW5kZXgsIHogKSB7XG5cblx0XHR0aGlzLmFycmF5WyBpbmRleCAqIHRoaXMuaXRlbVNpemUgKyAyIF0gPSB6O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRnZXRXOiBmdW5jdGlvbiAoIGluZGV4ICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuYXJyYXlbIGluZGV4ICogdGhpcy5pdGVtU2l6ZSArIDMgXTtcblxuXHR9LFxuXG5cdHNldFc6IGZ1bmN0aW9uICggaW5kZXgsIHcgKSB7XG5cblx0XHR0aGlzLmFycmF5WyBpbmRleCAqIHRoaXMuaXRlbVNpemUgKyAzIF0gPSB3O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRYWTogZnVuY3Rpb24gKCBpbmRleCwgeCwgeSApIHtcblxuXHRcdGluZGV4ICo9IHRoaXMuaXRlbVNpemU7XG5cblx0XHR0aGlzLmFycmF5WyBpbmRleCArIDAgXSA9IHg7XG5cdFx0dGhpcy5hcnJheVsgaW5kZXggKyAxIF0gPSB5O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRYWVo6IGZ1bmN0aW9uICggaW5kZXgsIHgsIHksIHogKSB7XG5cblx0XHRpbmRleCAqPSB0aGlzLml0ZW1TaXplO1xuXG5cdFx0dGhpcy5hcnJheVsgaW5kZXggKyAwIF0gPSB4O1xuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICsgMSBdID0geTtcblx0XHR0aGlzLmFycmF5WyBpbmRleCArIDIgXSA9IHo7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFhZWlc6IGZ1bmN0aW9uICggaW5kZXgsIHgsIHksIHosIHcgKSB7XG5cblx0XHRpbmRleCAqPSB0aGlzLml0ZW1TaXplO1xuXG5cdFx0dGhpcy5hcnJheVsgaW5kZXggKyAwIF0gPSB4O1xuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICsgMSBdID0geTtcblx0XHR0aGlzLmFycmF5WyBpbmRleCArIDIgXSA9IHo7XG5cdFx0dGhpcy5hcnJheVsgaW5kZXggKyAzIF0gPSB3O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRvblVwbG9hZDogZnVuY3Rpb24gKCBjYWxsYmFjayApIHtcblxuXHRcdHRoaXMub25VcGxvYWRDYWxsYmFjayA9IGNhbGxiYWNrO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCB0aGlzLmFycmF5LCB0aGlzLml0ZW1TaXplICkuY29weSggdGhpcyApO1xuXG5cdH1cblxufSApO1xuXG4vL1xuXG5mdW5jdGlvbiBJbnQ4QnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKSB7XG5cblx0QnVmZmVyQXR0cmlidXRlLmNhbGwoIHRoaXMsIG5ldyBJbnQ4QXJyYXkoIGFycmF5ICksIGl0ZW1TaXplICk7XG5cbn1cblxuSW50OEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlICk7XG5JbnQ4QnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEludDhCdWZmZXJBdHRyaWJ1dGU7XG5cblxuZnVuY3Rpb24gVWludDhCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApIHtcblxuXHRCdWZmZXJBdHRyaWJ1dGUuY2FsbCggdGhpcywgbmV3IFVpbnQ4QXJyYXkoIGFycmF5ICksIGl0ZW1TaXplICk7XG5cbn1cblxuVWludDhCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSApO1xuVWludDhCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVWludDhCdWZmZXJBdHRyaWJ1dGU7XG5cblxuZnVuY3Rpb24gVWludDhDbGFtcGVkQnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKSB7XG5cblx0QnVmZmVyQXR0cmlidXRlLmNhbGwoIHRoaXMsIG5ldyBVaW50OENsYW1wZWRBcnJheSggYXJyYXkgKSwgaXRlbVNpemUgKTtcblxufVxuXG5VaW50OENsYW1wZWRCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSApO1xuVWludDhDbGFtcGVkQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFVpbnQ4Q2xhbXBlZEJ1ZmZlckF0dHJpYnV0ZTtcblxuXG5mdW5jdGlvbiBJbnQxNkJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplICkge1xuXG5cdEJ1ZmZlckF0dHJpYnV0ZS5jYWxsKCB0aGlzLCBuZXcgSW50MTZBcnJheSggYXJyYXkgKSwgaXRlbVNpemUgKTtcblxufVxuXG5JbnQxNkJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlICk7XG5JbnQxNkJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBJbnQxNkJ1ZmZlckF0dHJpYnV0ZTtcblxuXG5mdW5jdGlvbiBVaW50MTZCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApIHtcblxuXHRCdWZmZXJBdHRyaWJ1dGUuY2FsbCggdGhpcywgbmV3IFVpbnQxNkFycmF5KCBhcnJheSApLCBpdGVtU2l6ZSApO1xuXG59XG5cblVpbnQxNkJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlICk7XG5VaW50MTZCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVWludDE2QnVmZmVyQXR0cmlidXRlO1xuXG5cbmZ1bmN0aW9uIEludDMyQnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKSB7XG5cblx0QnVmZmVyQXR0cmlidXRlLmNhbGwoIHRoaXMsIG5ldyBJbnQzMkFycmF5KCBhcnJheSApLCBpdGVtU2l6ZSApO1xuXG59XG5cbkludDMyQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgKTtcbkludDMyQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEludDMyQnVmZmVyQXR0cmlidXRlO1xuXG5cbmZ1bmN0aW9uIFVpbnQzMkJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplICkge1xuXG5cdEJ1ZmZlckF0dHJpYnV0ZS5jYWxsKCB0aGlzLCBuZXcgVWludDMyQXJyYXkoIGFycmF5ICksIGl0ZW1TaXplICk7XG5cbn1cblxuVWludDMyQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgKTtcblVpbnQzMkJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBVaW50MzJCdWZmZXJBdHRyaWJ1dGU7XG5cblxuZnVuY3Rpb24gRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplICkge1xuXG5cdEJ1ZmZlckF0dHJpYnV0ZS5jYWxsKCB0aGlzLCBuZXcgRmxvYXQzMkFycmF5KCBhcnJheSApLCBpdGVtU2l6ZSApO1xuXG59XG5cbkZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSApO1xuRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBGbG9hdDMyQnVmZmVyQXR0cmlidXRlO1xuXG5cbmZ1bmN0aW9uIEZsb2F0NjRCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApIHtcblxuXHRCdWZmZXJBdHRyaWJ1dGUuY2FsbCggdGhpcywgbmV3IEZsb2F0NjRBcnJheSggYXJyYXkgKSwgaXRlbVNpemUgKTtcblxufVxuXG5GbG9hdDY0QnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgKTtcbkZsb2F0NjRCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gRmxvYXQ2NEJ1ZmZlckF0dHJpYnV0ZTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIERpcmVjdEdlb21ldHJ5KCkge1xuXG5cdHRoaXMuaW5kaWNlcyA9IFtdO1xuXHR0aGlzLnZlcnRpY2VzID0gW107XG5cdHRoaXMubm9ybWFscyA9IFtdO1xuXHR0aGlzLmNvbG9ycyA9IFtdO1xuXHR0aGlzLnV2cyA9IFtdO1xuXHR0aGlzLnV2czIgPSBbXTtcblxuXHR0aGlzLmdyb3VwcyA9IFtdO1xuXG5cdHRoaXMubW9ycGhUYXJnZXRzID0ge307XG5cblx0dGhpcy5za2luV2VpZ2h0cyA9IFtdO1xuXHR0aGlzLnNraW5JbmRpY2VzID0gW107XG5cblx0Ly8gdGhpcy5saW5lRGlzdGFuY2VzID0gW107XG5cblx0dGhpcy5ib3VuZGluZ0JveCA9IG51bGw7XG5cdHRoaXMuYm91bmRpbmdTcGhlcmUgPSBudWxsO1xuXG5cdC8vIHVwZGF0ZSBmbGFnc1xuXG5cdHRoaXMudmVydGljZXNOZWVkVXBkYXRlID0gZmFsc2U7XG5cdHRoaXMubm9ybWFsc05lZWRVcGRhdGUgPSBmYWxzZTtcblx0dGhpcy5jb2xvcnNOZWVkVXBkYXRlID0gZmFsc2U7XG5cdHRoaXMudXZzTmVlZFVwZGF0ZSA9IGZhbHNlO1xuXHR0aGlzLmdyb3Vwc05lZWRVcGRhdGUgPSBmYWxzZTtcblxufVxuXG5PYmplY3QuYXNzaWduKCBEaXJlY3RHZW9tZXRyeS5wcm90b3R5cGUsIHtcblxuXHRjb21wdXRlR3JvdXBzOiBmdW5jdGlvbiAoIGdlb21ldHJ5ICkge1xuXG5cdFx0dmFyIGdyb3VwO1xuXHRcdHZhciBncm91cHMgPSBbXTtcblx0XHR2YXIgbWF0ZXJpYWxJbmRleCA9IHVuZGVmaW5lZDtcblxuXHRcdHZhciBmYWNlcyA9IGdlb21ldHJ5LmZhY2VzO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgZmFjZXMubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHR2YXIgZmFjZSA9IGZhY2VzWyBpIF07XG5cblx0XHRcdC8vIG1hdGVyaWFsc1xuXG5cdFx0XHRpZiAoIGZhY2UubWF0ZXJpYWxJbmRleCAhPT0gbWF0ZXJpYWxJbmRleCApIHtcblxuXHRcdFx0XHRtYXRlcmlhbEluZGV4ID0gZmFjZS5tYXRlcmlhbEluZGV4O1xuXG5cdFx0XHRcdGlmICggZ3JvdXAgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdGdyb3VwLmNvdW50ID0gKCBpICogMyApIC0gZ3JvdXAuc3RhcnQ7XG5cdFx0XHRcdFx0Z3JvdXBzLnB1c2goIGdyb3VwICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGdyb3VwID0ge1xuXHRcdFx0XHRcdHN0YXJ0OiBpICogMyxcblx0XHRcdFx0XHRtYXRlcmlhbEluZGV4OiBtYXRlcmlhbEluZGV4XG5cdFx0XHRcdH07XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggZ3JvdXAgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Z3JvdXAuY291bnQgPSAoIGkgKiAzICkgLSBncm91cC5zdGFydDtcblx0XHRcdGdyb3Vwcy5wdXNoKCBncm91cCApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5ncm91cHMgPSBncm91cHM7XG5cblx0fSxcblxuXHRmcm9tR2VvbWV0cnk6IGZ1bmN0aW9uICggZ2VvbWV0cnkgKSB7XG5cblx0XHR2YXIgZmFjZXMgPSBnZW9tZXRyeS5mYWNlcztcblx0XHR2YXIgdmVydGljZXMgPSBnZW9tZXRyeS52ZXJ0aWNlcztcblx0XHR2YXIgZmFjZVZlcnRleFV2cyA9IGdlb21ldHJ5LmZhY2VWZXJ0ZXhVdnM7XG5cblx0XHR2YXIgaGFzRmFjZVZlcnRleFV2ID0gZmFjZVZlcnRleFV2c1sgMCBdICYmIGZhY2VWZXJ0ZXhVdnNbIDAgXS5sZW5ndGggPiAwO1xuXHRcdHZhciBoYXNGYWNlVmVydGV4VXYyID0gZmFjZVZlcnRleFV2c1sgMSBdICYmIGZhY2VWZXJ0ZXhVdnNbIDEgXS5sZW5ndGggPiAwO1xuXG5cdFx0Ly8gbW9ycGhzXG5cblx0XHR2YXIgbW9ycGhUYXJnZXRzID0gZ2VvbWV0cnkubW9ycGhUYXJnZXRzO1xuXHRcdHZhciBtb3JwaFRhcmdldHNMZW5ndGggPSBtb3JwaFRhcmdldHMubGVuZ3RoO1xuXG5cdFx0dmFyIG1vcnBoVGFyZ2V0c1Bvc2l0aW9uO1xuXG5cdFx0aWYgKCBtb3JwaFRhcmdldHNMZW5ndGggPiAwICkge1xuXG5cdFx0XHRtb3JwaFRhcmdldHNQb3NpdGlvbiA9IFtdO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBtb3JwaFRhcmdldHNMZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdFx0bW9ycGhUYXJnZXRzUG9zaXRpb25bIGkgXSA9IFtdO1xuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMubW9ycGhUYXJnZXRzLnBvc2l0aW9uID0gbW9ycGhUYXJnZXRzUG9zaXRpb247XG5cblx0XHR9XG5cblx0XHR2YXIgbW9ycGhOb3JtYWxzID0gZ2VvbWV0cnkubW9ycGhOb3JtYWxzO1xuXHRcdHZhciBtb3JwaE5vcm1hbHNMZW5ndGggPSBtb3JwaE5vcm1hbHMubGVuZ3RoO1xuXG5cdFx0dmFyIG1vcnBoVGFyZ2V0c05vcm1hbDtcblxuXHRcdGlmICggbW9ycGhOb3JtYWxzTGVuZ3RoID4gMCApIHtcblxuXHRcdFx0bW9ycGhUYXJnZXRzTm9ybWFsID0gW107XG5cblx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IG1vcnBoTm9ybWFsc0xlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0XHRtb3JwaFRhcmdldHNOb3JtYWxbIGkgXSA9IFtdO1xuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMubW9ycGhUYXJnZXRzLm5vcm1hbCA9IG1vcnBoVGFyZ2V0c05vcm1hbDtcblxuXHRcdH1cblxuXHRcdC8vIHNraW5zXG5cblx0XHR2YXIgc2tpbkluZGljZXMgPSBnZW9tZXRyeS5za2luSW5kaWNlcztcblx0XHR2YXIgc2tpbldlaWdodHMgPSBnZW9tZXRyeS5za2luV2VpZ2h0cztcblxuXHRcdHZhciBoYXNTa2luSW5kaWNlcyA9IHNraW5JbmRpY2VzLmxlbmd0aCA9PT0gdmVydGljZXMubGVuZ3RoO1xuXHRcdHZhciBoYXNTa2luV2VpZ2h0cyA9IHNraW5XZWlnaHRzLmxlbmd0aCA9PT0gdmVydGljZXMubGVuZ3RoO1xuXG5cdFx0Ly9cblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGZhY2VzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGZhY2UgPSBmYWNlc1sgaSBdO1xuXG5cdFx0XHR0aGlzLnZlcnRpY2VzLnB1c2goIHZlcnRpY2VzWyBmYWNlLmEgXSwgdmVydGljZXNbIGZhY2UuYiBdLCB2ZXJ0aWNlc1sgZmFjZS5jIF0gKTtcblxuXHRcdFx0dmFyIHZlcnRleE5vcm1hbHMgPSBmYWNlLnZlcnRleE5vcm1hbHM7XG5cblx0XHRcdGlmICggdmVydGV4Tm9ybWFscy5sZW5ndGggPT09IDMgKSB7XG5cblx0XHRcdFx0dGhpcy5ub3JtYWxzLnB1c2goIHZlcnRleE5vcm1hbHNbIDAgXSwgdmVydGV4Tm9ybWFsc1sgMSBdLCB2ZXJ0ZXhOb3JtYWxzWyAyIF0gKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHR2YXIgbm9ybWFsID0gZmFjZS5ub3JtYWw7XG5cblx0XHRcdFx0dGhpcy5ub3JtYWxzLnB1c2goIG5vcm1hbCwgbm9ybWFsLCBub3JtYWwgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgdmVydGV4Q29sb3JzID0gZmFjZS52ZXJ0ZXhDb2xvcnM7XG5cblx0XHRcdGlmICggdmVydGV4Q29sb3JzLmxlbmd0aCA9PT0gMyApIHtcblxuXHRcdFx0XHR0aGlzLmNvbG9ycy5wdXNoKCB2ZXJ0ZXhDb2xvcnNbIDAgXSwgdmVydGV4Q29sb3JzWyAxIF0sIHZlcnRleENvbG9yc1sgMiBdICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0dmFyIGNvbG9yID0gZmFjZS5jb2xvcjtcblxuXHRcdFx0XHR0aGlzLmNvbG9ycy5wdXNoKCBjb2xvciwgY29sb3IsIGNvbG9yICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBoYXNGYWNlVmVydGV4VXYgPT09IHRydWUgKSB7XG5cblx0XHRcdFx0dmFyIHZlcnRleFV2cyA9IGZhY2VWZXJ0ZXhVdnNbIDAgXVsgaSBdO1xuXG5cdFx0XHRcdGlmICggdmVydGV4VXZzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHR0aGlzLnV2cy5wdXNoKCB2ZXJ0ZXhVdnNbIDAgXSwgdmVydGV4VXZzWyAxIF0sIHZlcnRleFV2c1sgMiBdICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkRpcmVjdEdlb21ldHJ5LmZyb21HZW9tZXRyeSgpOiBVbmRlZmluZWQgdmVydGV4VXYgJywgaSApO1xuXG5cdFx0XHRcdFx0dGhpcy51dnMucHVzaCggbmV3IFZlY3RvcjIoKSwgbmV3IFZlY3RvcjIoKSwgbmV3IFZlY3RvcjIoKSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGhhc0ZhY2VWZXJ0ZXhVdjIgPT09IHRydWUgKSB7XG5cblx0XHRcdFx0dmFyIHZlcnRleFV2cyA9IGZhY2VWZXJ0ZXhVdnNbIDEgXVsgaSBdO1xuXG5cdFx0XHRcdGlmICggdmVydGV4VXZzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHR0aGlzLnV2czIucHVzaCggdmVydGV4VXZzWyAwIF0sIHZlcnRleFV2c1sgMSBdLCB2ZXJ0ZXhVdnNbIDIgXSApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5EaXJlY3RHZW9tZXRyeS5mcm9tR2VvbWV0cnkoKTogVW5kZWZpbmVkIHZlcnRleFV2MiAnLCBpICk7XG5cblx0XHRcdFx0XHR0aGlzLnV2czIucHVzaCggbmV3IFZlY3RvcjIoKSwgbmV3IFZlY3RvcjIoKSwgbmV3IFZlY3RvcjIoKSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBtb3JwaHNcblxuXHRcdFx0Zm9yICggdmFyIGogPSAwOyBqIDwgbW9ycGhUYXJnZXRzTGVuZ3RoOyBqICsrICkge1xuXG5cdFx0XHRcdHZhciBtb3JwaFRhcmdldCA9IG1vcnBoVGFyZ2V0c1sgaiBdLnZlcnRpY2VzO1xuXG5cdFx0XHRcdG1vcnBoVGFyZ2V0c1Bvc2l0aW9uWyBqIF0ucHVzaCggbW9ycGhUYXJnZXRbIGZhY2UuYSBdLCBtb3JwaFRhcmdldFsgZmFjZS5iIF0sIG1vcnBoVGFyZ2V0WyBmYWNlLmMgXSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGZvciAoIHZhciBqID0gMDsgaiA8IG1vcnBoTm9ybWFsc0xlbmd0aDsgaiArKyApIHtcblxuXHRcdFx0XHR2YXIgbW9ycGhOb3JtYWwgPSBtb3JwaE5vcm1hbHNbIGogXS52ZXJ0ZXhOb3JtYWxzWyBpIF07XG5cblx0XHRcdFx0bW9ycGhUYXJnZXRzTm9ybWFsWyBqIF0ucHVzaCggbW9ycGhOb3JtYWwuYSwgbW9ycGhOb3JtYWwuYiwgbW9ycGhOb3JtYWwuYyApO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIHNraW5zXG5cblx0XHRcdGlmICggaGFzU2tpbkluZGljZXMgKSB7XG5cblx0XHRcdFx0dGhpcy5za2luSW5kaWNlcy5wdXNoKCBza2luSW5kaWNlc1sgZmFjZS5hIF0sIHNraW5JbmRpY2VzWyBmYWNlLmIgXSwgc2tpbkluZGljZXNbIGZhY2UuYyBdICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBoYXNTa2luV2VpZ2h0cyApIHtcblxuXHRcdFx0XHR0aGlzLnNraW5XZWlnaHRzLnB1c2goIHNraW5XZWlnaHRzWyBmYWNlLmEgXSwgc2tpbldlaWdodHNbIGZhY2UuYiBdLCBza2luV2VpZ2h0c1sgZmFjZS5jIF0gKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0dGhpcy5jb21wdXRlR3JvdXBzKCBnZW9tZXRyeSApO1xuXG5cdFx0dGhpcy52ZXJ0aWNlc05lZWRVcGRhdGUgPSBnZW9tZXRyeS52ZXJ0aWNlc05lZWRVcGRhdGU7XG5cdFx0dGhpcy5ub3JtYWxzTmVlZFVwZGF0ZSA9IGdlb21ldHJ5Lm5vcm1hbHNOZWVkVXBkYXRlO1xuXHRcdHRoaXMuY29sb3JzTmVlZFVwZGF0ZSA9IGdlb21ldHJ5LmNvbG9yc05lZWRVcGRhdGU7XG5cdFx0dGhpcy51dnNOZWVkVXBkYXRlID0gZ2VvbWV0cnkudXZzTmVlZFVwZGF0ZTtcblx0XHR0aGlzLmdyb3Vwc05lZWRVcGRhdGUgPSBnZW9tZXRyeS5ncm91cHNOZWVkVXBkYXRlO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbmZ1bmN0aW9uIGFycmF5TWF4KCBhcnJheSApIHtcblxuXHRpZiAoIGFycmF5Lmxlbmd0aCA9PT0gMCApIHJldHVybiAtIEluZmluaXR5O1xuXG5cdHZhciBtYXggPSBhcnJheVsgMCBdO1xuXG5cdGZvciAoIHZhciBpID0gMSwgbCA9IGFycmF5Lmxlbmd0aDsgaSA8IGw7ICsrIGkgKSB7XG5cblx0XHRpZiAoIGFycmF5WyBpIF0gPiBtYXggKSBtYXggPSBhcnJheVsgaSBdO1xuXG5cdH1cblxuXHRyZXR1cm4gbWF4O1xuXG59XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3Iga2lsZSAvIGh0dHA6Ly9raWxlLnN0cmF2YWdhbnphLm9yZy9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKiBAYXV0aG9yIG1pa2FlbCBlbXRpbmdlciAvIGh0dHA6Ly9nb21vLnNlL1xuICogQGF1dGhvciB6ejg1IC8gaHR0cDovL3d3dy5sYWI0Z2FtZXMubmV0L3p6ODUvYmxvZ1xuICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pb1xuICovXG5cbnZhciBjb3VudCA9IDA7XG5mdW5jdGlvbiBHZW9tZXRyeUlkQ291bnQoKSB7IHJldHVybiBjb3VudCsrOyB9XG5cbmZ1bmN0aW9uIEdlb21ldHJ5KCkge1xuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggdGhpcywgJ2lkJywgeyB2YWx1ZTogR2VvbWV0cnlJZENvdW50KCkgfSApO1xuXG5cdHRoaXMudXVpZCA9IF9NYXRoLmdlbmVyYXRlVVVJRCgpO1xuXG5cdHRoaXMubmFtZSA9ICcnO1xuXHR0aGlzLnR5cGUgPSAnR2VvbWV0cnknO1xuXG5cdHRoaXMudmVydGljZXMgPSBbXTtcblx0dGhpcy5jb2xvcnMgPSBbXTtcblx0dGhpcy5mYWNlcyA9IFtdO1xuXHR0aGlzLmZhY2VWZXJ0ZXhVdnMgPSBbW11dO1xuXG5cdHRoaXMubW9ycGhUYXJnZXRzID0gW107XG5cdHRoaXMubW9ycGhOb3JtYWxzID0gW107XG5cblx0dGhpcy5za2luV2VpZ2h0cyA9IFtdO1xuXHR0aGlzLnNraW5JbmRpY2VzID0gW107XG5cblx0dGhpcy5saW5lRGlzdGFuY2VzID0gW107XG5cblx0dGhpcy5ib3VuZGluZ0JveCA9IG51bGw7XG5cdHRoaXMuYm91bmRpbmdTcGhlcmUgPSBudWxsO1xuXG5cdC8vIHVwZGF0ZSBmbGFnc1xuXG5cdHRoaXMuZWxlbWVudHNOZWVkVXBkYXRlID0gZmFsc2U7XG5cdHRoaXMudmVydGljZXNOZWVkVXBkYXRlID0gZmFsc2U7XG5cdHRoaXMudXZzTmVlZFVwZGF0ZSA9IGZhbHNlO1xuXHR0aGlzLm5vcm1hbHNOZWVkVXBkYXRlID0gZmFsc2U7XG5cdHRoaXMuY29sb3JzTmVlZFVwZGF0ZSA9IGZhbHNlO1xuXHR0aGlzLmxpbmVEaXN0YW5jZXNOZWVkVXBkYXRlID0gZmFsc2U7XG5cdHRoaXMuZ3JvdXBzTmVlZFVwZGF0ZSA9IGZhbHNlO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIEdlb21ldHJ5LnByb3RvdHlwZSwgRXZlbnREaXNwYXRjaGVyLnByb3RvdHlwZSwge1xuXG5cdGlzR2VvbWV0cnk6IHRydWUsXG5cblx0YXBwbHlNYXRyaXg6IGZ1bmN0aW9uICggbWF0cml4ICkge1xuXG5cdFx0dmFyIG5vcm1hbE1hdHJpeCA9IG5ldyBNYXRyaXgzKCkuZ2V0Tm9ybWFsTWF0cml4KCBtYXRyaXggKTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSB0aGlzLnZlcnRpY2VzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgdmVydGV4ID0gdGhpcy52ZXJ0aWNlc1sgaSBdO1xuXHRcdFx0dmVydGV4LmFwcGx5TWF0cml4NCggbWF0cml4ICk7XG5cblx0XHR9XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gdGhpcy5mYWNlcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGZhY2UgPSB0aGlzLmZhY2VzWyBpIF07XG5cdFx0XHRmYWNlLm5vcm1hbC5hcHBseU1hdHJpeDMoIG5vcm1hbE1hdHJpeCApLm5vcm1hbGl6ZSgpO1xuXG5cdFx0XHRmb3IgKCB2YXIgaiA9IDAsIGpsID0gZmFjZS52ZXJ0ZXhOb3JtYWxzLmxlbmd0aDsgaiA8IGpsOyBqICsrICkge1xuXG5cdFx0XHRcdGZhY2UudmVydGV4Tm9ybWFsc1sgaiBdLmFwcGx5TWF0cml4Myggbm9ybWFsTWF0cml4ICkubm9ybWFsaXplKCk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5ib3VuZGluZ0JveCAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5jb21wdXRlQm91bmRpbmdCb3goKTtcblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5ib3VuZGluZ1NwaGVyZSAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtcblxuXHRcdH1cblxuXHRcdHRoaXMudmVydGljZXNOZWVkVXBkYXRlID0gdHJ1ZTtcblx0XHR0aGlzLm5vcm1hbHNOZWVkVXBkYXRlID0gdHJ1ZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0cm90YXRlWDogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gcm90YXRlIGdlb21ldHJ5IGFyb3VuZCB3b3JsZCB4LWF4aXNcblxuXHRcdHZhciBtMSA9IG5ldyBNYXRyaXg0KCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gcm90YXRlWCggYW5nbGUgKSB7XG5cblx0XHRcdG0xLm1ha2VSb3RhdGlvblgoIGFuZ2xlICk7XG5cblx0XHRcdHRoaXMuYXBwbHlNYXRyaXgoIG0xICk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0cm90YXRlWTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gcm90YXRlIGdlb21ldHJ5IGFyb3VuZCB3b3JsZCB5LWF4aXNcblxuXHRcdHZhciBtMSA9IG5ldyBNYXRyaXg0KCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gcm90YXRlWSggYW5nbGUgKSB7XG5cblx0XHRcdG0xLm1ha2VSb3RhdGlvblkoIGFuZ2xlICk7XG5cblx0XHRcdHRoaXMuYXBwbHlNYXRyaXgoIG0xICk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0cm90YXRlWjogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gcm90YXRlIGdlb21ldHJ5IGFyb3VuZCB3b3JsZCB6LWF4aXNcblxuXHRcdHZhciBtMSA9IG5ldyBNYXRyaXg0KCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gcm90YXRlWiggYW5nbGUgKSB7XG5cblx0XHRcdG0xLm1ha2VSb3RhdGlvblooIGFuZ2xlICk7XG5cblx0XHRcdHRoaXMuYXBwbHlNYXRyaXgoIG0xICk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0dHJhbnNsYXRlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyB0cmFuc2xhdGUgZ2VvbWV0cnlcblxuXHRcdHZhciBtMSA9IG5ldyBNYXRyaXg0KCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gdHJhbnNsYXRlKCB4LCB5LCB6ICkge1xuXG5cdFx0XHRtMS5tYWtlVHJhbnNsYXRpb24oIHgsIHksIHogKTtcblxuXHRcdFx0dGhpcy5hcHBseU1hdHJpeCggbTEgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRzY2FsZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gc2NhbGUgZ2VvbWV0cnlcblxuXHRcdHZhciBtMSA9IG5ldyBNYXRyaXg0KCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gc2NhbGUoIHgsIHksIHogKSB7XG5cblx0XHRcdG0xLm1ha2VTY2FsZSggeCwgeSwgeiApO1xuXG5cdFx0XHR0aGlzLmFwcGx5TWF0cml4KCBtMSApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGxvb2tBdDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIG9iaiA9IG5ldyBPYmplY3QzRCgpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGxvb2tBdCggdmVjdG9yICkge1xuXG5cdFx0XHRvYmoubG9va0F0KCB2ZWN0b3IgKTtcblxuXHRcdFx0b2JqLnVwZGF0ZU1hdHJpeCgpO1xuXG5cdFx0XHR0aGlzLmFwcGx5TWF0cml4KCBvYmoubWF0cml4ICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRmcm9tQnVmZmVyR2VvbWV0cnk6IGZ1bmN0aW9uICggZ2VvbWV0cnkgKSB7XG5cblx0XHR2YXIgc2NvcGUgPSB0aGlzO1xuXG5cdFx0dmFyIGluZGljZXMgPSBnZW9tZXRyeS5pbmRleCAhPT0gbnVsbCA/IGdlb21ldHJ5LmluZGV4LmFycmF5IDogdW5kZWZpbmVkO1xuXHRcdHZhciBhdHRyaWJ1dGVzID0gZ2VvbWV0cnkuYXR0cmlidXRlcztcblxuXHRcdHZhciBwb3NpdGlvbnMgPSBhdHRyaWJ1dGVzLnBvc2l0aW9uLmFycmF5O1xuXHRcdHZhciBub3JtYWxzID0gYXR0cmlidXRlcy5ub3JtYWwgIT09IHVuZGVmaW5lZCA/IGF0dHJpYnV0ZXMubm9ybWFsLmFycmF5IDogdW5kZWZpbmVkO1xuXHRcdHZhciBjb2xvcnMgPSBhdHRyaWJ1dGVzLmNvbG9yICE9PSB1bmRlZmluZWQgPyBhdHRyaWJ1dGVzLmNvbG9yLmFycmF5IDogdW5kZWZpbmVkO1xuXHRcdHZhciB1dnMgPSBhdHRyaWJ1dGVzLnV2ICE9PSB1bmRlZmluZWQgPyBhdHRyaWJ1dGVzLnV2LmFycmF5IDogdW5kZWZpbmVkO1xuXHRcdHZhciB1dnMyID0gYXR0cmlidXRlcy51djIgIT09IHVuZGVmaW5lZCA/IGF0dHJpYnV0ZXMudXYyLmFycmF5IDogdW5kZWZpbmVkO1xuXG5cdFx0aWYgKCB1dnMyICE9PSB1bmRlZmluZWQgKSB0aGlzLmZhY2VWZXJ0ZXhVdnNbIDEgXSA9IFtdO1xuXG5cdFx0dmFyIHRlbXBOb3JtYWxzID0gW107XG5cdFx0dmFyIHRlbXBVVnMgPSBbXTtcblx0XHR2YXIgdGVtcFVWczIgPSBbXTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgaiA9IDA7IGkgPCBwb3NpdGlvbnMubGVuZ3RoOyBpICs9IDMsIGogKz0gMiApIHtcblxuXHRcdFx0c2NvcGUudmVydGljZXMucHVzaCggbmV3IFZlY3RvcjMoIHBvc2l0aW9uc1sgaSBdLCBwb3NpdGlvbnNbIGkgKyAxIF0sIHBvc2l0aW9uc1sgaSArIDIgXSApICk7XG5cblx0XHRcdGlmICggbm9ybWFscyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHRlbXBOb3JtYWxzLnB1c2goIG5ldyBWZWN0b3IzKCBub3JtYWxzWyBpIF0sIG5vcm1hbHNbIGkgKyAxIF0sIG5vcm1hbHNbIGkgKyAyIF0gKSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggY29sb3JzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0c2NvcGUuY29sb3JzLnB1c2goIG5ldyBDb2xvciggY29sb3JzWyBpIF0sIGNvbG9yc1sgaSArIDEgXSwgY29sb3JzWyBpICsgMiBdICkgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHV2cyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHRlbXBVVnMucHVzaCggbmV3IFZlY3RvcjIoIHV2c1sgaiBdLCB1dnNbIGogKyAxIF0gKSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggdXZzMiAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHRlbXBVVnMyLnB1c2goIG5ldyBWZWN0b3IyKCB1dnMyWyBqIF0sIHV2czJbIGogKyAxIF0gKSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBhZGRGYWNlKCBhLCBiLCBjLCBtYXRlcmlhbEluZGV4ICkge1xuXG5cdFx0XHR2YXIgdmVydGV4Tm9ybWFscyA9IG5vcm1hbHMgIT09IHVuZGVmaW5lZCA/IFsgdGVtcE5vcm1hbHNbIGEgXS5jbG9uZSgpLCB0ZW1wTm9ybWFsc1sgYiBdLmNsb25lKCksIHRlbXBOb3JtYWxzWyBjIF0uY2xvbmUoKSBdIDogW107XG5cdFx0XHR2YXIgdmVydGV4Q29sb3JzID0gY29sb3JzICE9PSB1bmRlZmluZWQgPyBbIHNjb3BlLmNvbG9yc1sgYSBdLmNsb25lKCksIHNjb3BlLmNvbG9yc1sgYiBdLmNsb25lKCksIHNjb3BlLmNvbG9yc1sgYyBdLmNsb25lKCkgXSA6IFtdO1xuXG5cdFx0XHR2YXIgZmFjZSA9IG5ldyBGYWNlMyggYSwgYiwgYywgdmVydGV4Tm9ybWFscywgdmVydGV4Q29sb3JzLCBtYXRlcmlhbEluZGV4ICk7XG5cblx0XHRcdHNjb3BlLmZhY2VzLnB1c2goIGZhY2UgKTtcblxuXHRcdFx0aWYgKCB1dnMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRzY29wZS5mYWNlVmVydGV4VXZzWyAwIF0ucHVzaCggWyB0ZW1wVVZzWyBhIF0uY2xvbmUoKSwgdGVtcFVWc1sgYiBdLmNsb25lKCksIHRlbXBVVnNbIGMgXS5jbG9uZSgpIF0gKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHV2czIgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRzY29wZS5mYWNlVmVydGV4VXZzWyAxIF0ucHVzaCggWyB0ZW1wVVZzMlsgYSBdLmNsb25lKCksIHRlbXBVVnMyWyBiIF0uY2xvbmUoKSwgdGVtcFVWczJbIGMgXS5jbG9uZSgpIF0gKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0dmFyIGdyb3VwcyA9IGdlb21ldHJ5Lmdyb3VwcztcblxuXHRcdGlmICggZ3JvdXBzLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGdyb3Vwcy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdFx0dmFyIGdyb3VwID0gZ3JvdXBzWyBpIF07XG5cblx0XHRcdFx0dmFyIHN0YXJ0ID0gZ3JvdXAuc3RhcnQ7XG5cdFx0XHRcdHZhciBjb3VudCA9IGdyb3VwLmNvdW50O1xuXG5cdFx0XHRcdGZvciAoIHZhciBqID0gc3RhcnQsIGpsID0gc3RhcnQgKyBjb3VudDsgaiA8IGpsOyBqICs9IDMgKSB7XG5cblx0XHRcdFx0XHRpZiAoIGluZGljZXMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdFx0YWRkRmFjZSggaW5kaWNlc1sgaiBdLCBpbmRpY2VzWyBqICsgMSBdLCBpbmRpY2VzWyBqICsgMiBdLCBncm91cC5tYXRlcmlhbEluZGV4ICk7XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRhZGRGYWNlKCBqLCBqICsgMSwgaiArIDIsIGdyb3VwLm1hdGVyaWFsSW5kZXggKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGlmICggaW5kaWNlcyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGluZGljZXMubGVuZ3RoOyBpICs9IDMgKSB7XG5cblx0XHRcdFx0XHRhZGRGYWNlKCBpbmRpY2VzWyBpIF0sIGluZGljZXNbIGkgKyAxIF0sIGluZGljZXNbIGkgKyAyIF0gKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgcG9zaXRpb25zLmxlbmd0aCAvIDM7IGkgKz0gMyApIHtcblxuXHRcdFx0XHRcdGFkZEZhY2UoIGksIGkgKyAxLCBpICsgMiApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0dGhpcy5jb21wdXRlRmFjZU5vcm1hbHMoKTtcblxuXHRcdGlmICggZ2VvbWV0cnkuYm91bmRpbmdCb3ggIT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuYm91bmRpbmdCb3ggPSBnZW9tZXRyeS5ib3VuZGluZ0JveC5jbG9uZSgpO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5ib3VuZGluZ1NwaGVyZSA9IGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlLmNsb25lKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNlbnRlcjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5jb21wdXRlQm91bmRpbmdCb3goKTtcblxuXHRcdHZhciBvZmZzZXQgPSB0aGlzLmJvdW5kaW5nQm94LmdldENlbnRlcigpLm5lZ2F0ZSgpO1xuXG5cdFx0dGhpcy50cmFuc2xhdGUoIG9mZnNldC54LCBvZmZzZXQueSwgb2Zmc2V0LnogKTtcblxuXHRcdHJldHVybiBvZmZzZXQ7XG5cblx0fSxcblxuXHRub3JtYWxpemU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7XG5cblx0XHR2YXIgY2VudGVyID0gdGhpcy5ib3VuZGluZ1NwaGVyZS5jZW50ZXI7XG5cdFx0dmFyIHJhZGl1cyA9IHRoaXMuYm91bmRpbmdTcGhlcmUucmFkaXVzO1xuXG5cdFx0dmFyIHMgPSByYWRpdXMgPT09IDAgPyAxIDogMS4wIC8gcmFkaXVzO1xuXG5cdFx0dmFyIG1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7XG5cdFx0bWF0cml4LnNldChcblx0XHRcdHMsIDAsIDAsIC0gcyAqIGNlbnRlci54LFxuXHRcdFx0MCwgcywgMCwgLSBzICogY2VudGVyLnksXG5cdFx0XHQwLCAwLCBzLCAtIHMgKiBjZW50ZXIueixcblx0XHRcdDAsIDAsIDAsIDFcblx0XHQpO1xuXG5cdFx0dGhpcy5hcHBseU1hdHJpeCggbWF0cml4ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvbXB1dGVGYWNlTm9ybWFsczogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGNiID0gbmV3IFZlY3RvcjMoKSwgYWIgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0Zm9yICggdmFyIGYgPSAwLCBmbCA9IHRoaXMuZmFjZXMubGVuZ3RoOyBmIDwgZmw7IGYgKysgKSB7XG5cblx0XHRcdHZhciBmYWNlID0gdGhpcy5mYWNlc1sgZiBdO1xuXG5cdFx0XHR2YXIgdkEgPSB0aGlzLnZlcnRpY2VzWyBmYWNlLmEgXTtcblx0XHRcdHZhciB2QiA9IHRoaXMudmVydGljZXNbIGZhY2UuYiBdO1xuXHRcdFx0dmFyIHZDID0gdGhpcy52ZXJ0aWNlc1sgZmFjZS5jIF07XG5cblx0XHRcdGNiLnN1YlZlY3RvcnMoIHZDLCB2QiApO1xuXHRcdFx0YWIuc3ViVmVjdG9ycyggdkEsIHZCICk7XG5cdFx0XHRjYi5jcm9zcyggYWIgKTtcblxuXHRcdFx0Y2Iubm9ybWFsaXplKCk7XG5cblx0XHRcdGZhY2Uubm9ybWFsLmNvcHkoIGNiICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHRjb21wdXRlVmVydGV4Tm9ybWFsczogZnVuY3Rpb24gKCBhcmVhV2VpZ2h0ZWQgKSB7XG5cblx0XHRpZiAoIGFyZWFXZWlnaHRlZCA9PT0gdW5kZWZpbmVkICkgYXJlYVdlaWdodGVkID0gdHJ1ZTtcblxuXHRcdHZhciB2LCB2bCwgZiwgZmwsIGZhY2UsIHZlcnRpY2VzO1xuXG5cdFx0dmVydGljZXMgPSBuZXcgQXJyYXkoIHRoaXMudmVydGljZXMubGVuZ3RoICk7XG5cblx0XHRmb3IgKCB2ID0gMCwgdmwgPSB0aGlzLnZlcnRpY2VzLmxlbmd0aDsgdiA8IHZsOyB2ICsrICkge1xuXG5cdFx0XHR2ZXJ0aWNlc1sgdiBdID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdH1cblxuXHRcdGlmICggYXJlYVdlaWdodGVkICkge1xuXG5cdFx0XHQvLyB2ZXJ0ZXggbm9ybWFscyB3ZWlnaHRlZCBieSB0cmlhbmdsZSBhcmVhc1xuXHRcdFx0Ly8gaHR0cDovL3d3dy5pcXVpbGV6bGVzLm9yZy93d3cvYXJ0aWNsZXMvbm9ybWFscy9ub3JtYWxzLmh0bVxuXG5cdFx0XHR2YXIgdkEsIHZCLCB2Qztcblx0XHRcdHZhciBjYiA9IG5ldyBWZWN0b3IzKCksIGFiID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdFx0Zm9yICggZiA9IDAsIGZsID0gdGhpcy5mYWNlcy5sZW5ndGg7IGYgPCBmbDsgZiArKyApIHtcblxuXHRcdFx0XHRmYWNlID0gdGhpcy5mYWNlc1sgZiBdO1xuXG5cdFx0XHRcdHZBID0gdGhpcy52ZXJ0aWNlc1sgZmFjZS5hIF07XG5cdFx0XHRcdHZCID0gdGhpcy52ZXJ0aWNlc1sgZmFjZS5iIF07XG5cdFx0XHRcdHZDID0gdGhpcy52ZXJ0aWNlc1sgZmFjZS5jIF07XG5cblx0XHRcdFx0Y2Iuc3ViVmVjdG9ycyggdkMsIHZCICk7XG5cdFx0XHRcdGFiLnN1YlZlY3RvcnMoIHZBLCB2QiApO1xuXHRcdFx0XHRjYi5jcm9zcyggYWIgKTtcblxuXHRcdFx0XHR2ZXJ0aWNlc1sgZmFjZS5hIF0uYWRkKCBjYiApO1xuXHRcdFx0XHR2ZXJ0aWNlc1sgZmFjZS5iIF0uYWRkKCBjYiApO1xuXHRcdFx0XHR2ZXJ0aWNlc1sgZmFjZS5jIF0uYWRkKCBjYiApO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR0aGlzLmNvbXB1dGVGYWNlTm9ybWFscygpO1xuXG5cdFx0XHRmb3IgKCBmID0gMCwgZmwgPSB0aGlzLmZhY2VzLmxlbmd0aDsgZiA8IGZsOyBmICsrICkge1xuXG5cdFx0XHRcdGZhY2UgPSB0aGlzLmZhY2VzWyBmIF07XG5cblx0XHRcdFx0dmVydGljZXNbIGZhY2UuYSBdLmFkZCggZmFjZS5ub3JtYWwgKTtcblx0XHRcdFx0dmVydGljZXNbIGZhY2UuYiBdLmFkZCggZmFjZS5ub3JtYWwgKTtcblx0XHRcdFx0dmVydGljZXNbIGZhY2UuYyBdLmFkZCggZmFjZS5ub3JtYWwgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Zm9yICggdiA9IDAsIHZsID0gdGhpcy52ZXJ0aWNlcy5sZW5ndGg7IHYgPCB2bDsgdiArKyApIHtcblxuXHRcdFx0dmVydGljZXNbIHYgXS5ub3JtYWxpemUoKTtcblxuXHRcdH1cblxuXHRcdGZvciAoIGYgPSAwLCBmbCA9IHRoaXMuZmFjZXMubGVuZ3RoOyBmIDwgZmw7IGYgKysgKSB7XG5cblx0XHRcdGZhY2UgPSB0aGlzLmZhY2VzWyBmIF07XG5cblx0XHRcdHZhciB2ZXJ0ZXhOb3JtYWxzID0gZmFjZS52ZXJ0ZXhOb3JtYWxzO1xuXG5cdFx0XHRpZiAoIHZlcnRleE5vcm1hbHMubGVuZ3RoID09PSAzICkge1xuXG5cdFx0XHRcdHZlcnRleE5vcm1hbHNbIDAgXS5jb3B5KCB2ZXJ0aWNlc1sgZmFjZS5hIF0gKTtcblx0XHRcdFx0dmVydGV4Tm9ybWFsc1sgMSBdLmNvcHkoIHZlcnRpY2VzWyBmYWNlLmIgXSApO1xuXHRcdFx0XHR2ZXJ0ZXhOb3JtYWxzWyAyIF0uY29weSggdmVydGljZXNbIGZhY2UuYyBdICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0dmVydGV4Tm9ybWFsc1sgMCBdID0gdmVydGljZXNbIGZhY2UuYSBdLmNsb25lKCk7XG5cdFx0XHRcdHZlcnRleE5vcm1hbHNbIDEgXSA9IHZlcnRpY2VzWyBmYWNlLmIgXS5jbG9uZSgpO1xuXHRcdFx0XHR2ZXJ0ZXhOb3JtYWxzWyAyIF0gPSB2ZXJ0aWNlc1sgZmFjZS5jIF0uY2xvbmUoKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLmZhY2VzLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdHRoaXMubm9ybWFsc05lZWRVcGRhdGUgPSB0cnVlO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0Y29tcHV0ZUZsYXRWZXJ0ZXhOb3JtYWxzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgZiwgZmwsIGZhY2U7XG5cblx0XHR0aGlzLmNvbXB1dGVGYWNlTm9ybWFscygpO1xuXG5cdFx0Zm9yICggZiA9IDAsIGZsID0gdGhpcy5mYWNlcy5sZW5ndGg7IGYgPCBmbDsgZiArKyApIHtcblxuXHRcdFx0ZmFjZSA9IHRoaXMuZmFjZXNbIGYgXTtcblxuXHRcdFx0dmFyIHZlcnRleE5vcm1hbHMgPSBmYWNlLnZlcnRleE5vcm1hbHM7XG5cblx0XHRcdGlmICggdmVydGV4Tm9ybWFscy5sZW5ndGggPT09IDMgKSB7XG5cblx0XHRcdFx0dmVydGV4Tm9ybWFsc1sgMCBdLmNvcHkoIGZhY2Uubm9ybWFsICk7XG5cdFx0XHRcdHZlcnRleE5vcm1hbHNbIDEgXS5jb3B5KCBmYWNlLm5vcm1hbCApO1xuXHRcdFx0XHR2ZXJ0ZXhOb3JtYWxzWyAyIF0uY29weSggZmFjZS5ub3JtYWwgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHR2ZXJ0ZXhOb3JtYWxzWyAwIF0gPSBmYWNlLm5vcm1hbC5jbG9uZSgpO1xuXHRcdFx0XHR2ZXJ0ZXhOb3JtYWxzWyAxIF0gPSBmYWNlLm5vcm1hbC5jbG9uZSgpO1xuXHRcdFx0XHR2ZXJ0ZXhOb3JtYWxzWyAyIF0gPSBmYWNlLm5vcm1hbC5jbG9uZSgpO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIHRoaXMuZmFjZXMubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0dGhpcy5ub3JtYWxzTmVlZFVwZGF0ZSA9IHRydWU7XG5cblx0XHR9XG5cblx0fSxcblxuXHRjb21wdXRlTW9ycGhOb3JtYWxzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgaSwgaWwsIGYsIGZsLCBmYWNlO1xuXG5cdFx0Ly8gc2F2ZSBvcmlnaW5hbCBub3JtYWxzXG5cdFx0Ly8gLSBjcmVhdGUgdGVtcCB2YXJpYWJsZXMgb24gZmlyc3QgYWNjZXNzXG5cdFx0Ly8gICBvdGhlcndpc2UganVzdCBjb3B5IChmb3IgZmFzdGVyIHJlcGVhdGVkIGNhbGxzKVxuXG5cdFx0Zm9yICggZiA9IDAsIGZsID0gdGhpcy5mYWNlcy5sZW5ndGg7IGYgPCBmbDsgZiArKyApIHtcblxuXHRcdFx0ZmFjZSA9IHRoaXMuZmFjZXNbIGYgXTtcblxuXHRcdFx0aWYgKCAhIGZhY2UuX19vcmlnaW5hbEZhY2VOb3JtYWwgKSB7XG5cblx0XHRcdFx0ZmFjZS5fX29yaWdpbmFsRmFjZU5vcm1hbCA9IGZhY2Uubm9ybWFsLmNsb25lKCk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0ZmFjZS5fX29yaWdpbmFsRmFjZU5vcm1hbC5jb3B5KCBmYWNlLm5vcm1hbCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggISBmYWNlLl9fb3JpZ2luYWxWZXJ0ZXhOb3JtYWxzICkgZmFjZS5fX29yaWdpbmFsVmVydGV4Tm9ybWFscyA9IFtdO1xuXG5cdFx0XHRmb3IgKCBpID0gMCwgaWwgPSBmYWNlLnZlcnRleE5vcm1hbHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdFx0aWYgKCAhIGZhY2UuX19vcmlnaW5hbFZlcnRleE5vcm1hbHNbIGkgXSApIHtcblxuXHRcdFx0XHRcdGZhY2UuX19vcmlnaW5hbFZlcnRleE5vcm1hbHNbIGkgXSA9IGZhY2UudmVydGV4Tm9ybWFsc1sgaSBdLmNsb25lKCk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGZhY2UuX19vcmlnaW5hbFZlcnRleE5vcm1hbHNbIGkgXS5jb3B5KCBmYWNlLnZlcnRleE5vcm1hbHNbIGkgXSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gdXNlIHRlbXAgZ2VvbWV0cnkgdG8gY29tcHV0ZSBmYWNlIGFuZCB2ZXJ0ZXggbm9ybWFscyBmb3IgZWFjaCBtb3JwaFxuXG5cdFx0dmFyIHRtcEdlbyA9IG5ldyBHZW9tZXRyeSgpO1xuXHRcdHRtcEdlby5mYWNlcyA9IHRoaXMuZmFjZXM7XG5cblx0XHRmb3IgKCBpID0gMCwgaWwgPSB0aGlzLm1vcnBoVGFyZ2V0cy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0Ly8gY3JlYXRlIG9uIGZpcnN0IGFjY2Vzc1xuXG5cdFx0XHRpZiAoICEgdGhpcy5tb3JwaE5vcm1hbHNbIGkgXSApIHtcblxuXHRcdFx0XHR0aGlzLm1vcnBoTm9ybWFsc1sgaSBdID0ge307XG5cdFx0XHRcdHRoaXMubW9ycGhOb3JtYWxzWyBpIF0uZmFjZU5vcm1hbHMgPSBbXTtcblx0XHRcdFx0dGhpcy5tb3JwaE5vcm1hbHNbIGkgXS52ZXJ0ZXhOb3JtYWxzID0gW107XG5cblx0XHRcdFx0dmFyIGRzdE5vcm1hbHNGYWNlID0gdGhpcy5tb3JwaE5vcm1hbHNbIGkgXS5mYWNlTm9ybWFscztcblx0XHRcdFx0dmFyIGRzdE5vcm1hbHNWZXJ0ZXggPSB0aGlzLm1vcnBoTm9ybWFsc1sgaSBdLnZlcnRleE5vcm1hbHM7XG5cblx0XHRcdFx0dmFyIGZhY2VOb3JtYWwsIHZlcnRleE5vcm1hbHM7XG5cblx0XHRcdFx0Zm9yICggZiA9IDAsIGZsID0gdGhpcy5mYWNlcy5sZW5ndGg7IGYgPCBmbDsgZiArKyApIHtcblxuXHRcdFx0XHRcdGZhY2VOb3JtYWwgPSBuZXcgVmVjdG9yMygpO1xuXHRcdFx0XHRcdHZlcnRleE5vcm1hbHMgPSB7IGE6IG5ldyBWZWN0b3IzKCksIGI6IG5ldyBWZWN0b3IzKCksIGM6IG5ldyBWZWN0b3IzKCkgfTtcblxuXHRcdFx0XHRcdGRzdE5vcm1hbHNGYWNlLnB1c2goIGZhY2VOb3JtYWwgKTtcblx0XHRcdFx0XHRkc3ROb3JtYWxzVmVydGV4LnB1c2goIHZlcnRleE5vcm1hbHMgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIG1vcnBoTm9ybWFscyA9IHRoaXMubW9ycGhOb3JtYWxzWyBpIF07XG5cblx0XHRcdC8vIHNldCB2ZXJ0aWNlcyB0byBtb3JwaCB0YXJnZXRcblxuXHRcdFx0dG1wR2VvLnZlcnRpY2VzID0gdGhpcy5tb3JwaFRhcmdldHNbIGkgXS52ZXJ0aWNlcztcblxuXHRcdFx0Ly8gY29tcHV0ZSBtb3JwaCBub3JtYWxzXG5cblx0XHRcdHRtcEdlby5jb21wdXRlRmFjZU5vcm1hbHMoKTtcblx0XHRcdHRtcEdlby5jb21wdXRlVmVydGV4Tm9ybWFscygpO1xuXG5cdFx0XHQvLyBzdG9yZSBtb3JwaCBub3JtYWxzXG5cblx0XHRcdHZhciBmYWNlTm9ybWFsLCB2ZXJ0ZXhOb3JtYWxzO1xuXG5cdFx0XHRmb3IgKCBmID0gMCwgZmwgPSB0aGlzLmZhY2VzLmxlbmd0aDsgZiA8IGZsOyBmICsrICkge1xuXG5cdFx0XHRcdGZhY2UgPSB0aGlzLmZhY2VzWyBmIF07XG5cblx0XHRcdFx0ZmFjZU5vcm1hbCA9IG1vcnBoTm9ybWFscy5mYWNlTm9ybWFsc1sgZiBdO1xuXHRcdFx0XHR2ZXJ0ZXhOb3JtYWxzID0gbW9ycGhOb3JtYWxzLnZlcnRleE5vcm1hbHNbIGYgXTtcblxuXHRcdFx0XHRmYWNlTm9ybWFsLmNvcHkoIGZhY2Uubm9ybWFsICk7XG5cblx0XHRcdFx0dmVydGV4Tm9ybWFscy5hLmNvcHkoIGZhY2UudmVydGV4Tm9ybWFsc1sgMCBdICk7XG5cdFx0XHRcdHZlcnRleE5vcm1hbHMuYi5jb3B5KCBmYWNlLnZlcnRleE5vcm1hbHNbIDEgXSApO1xuXHRcdFx0XHR2ZXJ0ZXhOb3JtYWxzLmMuY29weSggZmFjZS52ZXJ0ZXhOb3JtYWxzWyAyIF0gKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gcmVzdG9yZSBvcmlnaW5hbCBub3JtYWxzXG5cblx0XHRmb3IgKCBmID0gMCwgZmwgPSB0aGlzLmZhY2VzLmxlbmd0aDsgZiA8IGZsOyBmICsrICkge1xuXG5cdFx0XHRmYWNlID0gdGhpcy5mYWNlc1sgZiBdO1xuXG5cdFx0XHRmYWNlLm5vcm1hbCA9IGZhY2UuX19vcmlnaW5hbEZhY2VOb3JtYWw7XG5cdFx0XHRmYWNlLnZlcnRleE5vcm1hbHMgPSBmYWNlLl9fb3JpZ2luYWxWZXJ0ZXhOb3JtYWxzO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0Y29tcHV0ZUxpbmVEaXN0YW5jZXM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBkID0gMDtcblx0XHR2YXIgdmVydGljZXMgPSB0aGlzLnZlcnRpY2VzO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IHZlcnRpY2VzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRpZiAoIGkgPiAwICkge1xuXG5cdFx0XHRcdGQgKz0gdmVydGljZXNbIGkgXS5kaXN0YW5jZVRvKCB2ZXJ0aWNlc1sgaSAtIDEgXSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMubGluZURpc3RhbmNlc1sgaSBdID0gZDtcblxuXHRcdH1cblxuXHR9LFxuXG5cdGNvbXB1dGVCb3VuZGluZ0JveDogZnVuY3Rpb24gKCkge1xuXG5cdFx0aWYgKCB0aGlzLmJvdW5kaW5nQm94ID09PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLmJvdW5kaW5nQm94ID0gbmV3IEJveDMoKTtcblxuXHRcdH1cblxuXHRcdHRoaXMuYm91bmRpbmdCb3guc2V0RnJvbVBvaW50cyggdGhpcy52ZXJ0aWNlcyApO1xuXG5cdH0sXG5cblx0Y29tcHV0ZUJvdW5kaW5nU3BoZXJlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRpZiAoIHRoaXMuYm91bmRpbmdTcGhlcmUgPT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuYm91bmRpbmdTcGhlcmUgPSBuZXcgU3BoZXJlKCk7XG5cblx0XHR9XG5cblx0XHR0aGlzLmJvdW5kaW5nU3BoZXJlLnNldEZyb21Qb2ludHMoIHRoaXMudmVydGljZXMgKTtcblxuXHR9LFxuXG5cdG1lcmdlOiBmdW5jdGlvbiAoIGdlb21ldHJ5LCBtYXRyaXgsIG1hdGVyaWFsSW5kZXhPZmZzZXQgKSB7XG5cblx0XHRpZiAoICggZ2VvbWV0cnkgJiYgZ2VvbWV0cnkuaXNHZW9tZXRyeSApID09PSBmYWxzZSApIHtcblxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLkdlb21ldHJ5Lm1lcmdlKCk6IGdlb21ldHJ5IG5vdCBhbiBpbnN0YW5jZSBvZiBUSFJFRS5HZW9tZXRyeS4nLCBnZW9tZXRyeSApO1xuXHRcdFx0cmV0dXJuO1xuXG5cdFx0fVxuXG5cdFx0dmFyIG5vcm1hbE1hdHJpeCxcblx0XHRcdHZlcnRleE9mZnNldCA9IHRoaXMudmVydGljZXMubGVuZ3RoLFxuXHRcdFx0dmVydGljZXMxID0gdGhpcy52ZXJ0aWNlcyxcblx0XHRcdHZlcnRpY2VzMiA9IGdlb21ldHJ5LnZlcnRpY2VzLFxuXHRcdFx0ZmFjZXMxID0gdGhpcy5mYWNlcyxcblx0XHRcdGZhY2VzMiA9IGdlb21ldHJ5LmZhY2VzLFxuXHRcdFx0dXZzMSA9IHRoaXMuZmFjZVZlcnRleFV2c1sgMCBdLFxuXHRcdFx0dXZzMiA9IGdlb21ldHJ5LmZhY2VWZXJ0ZXhVdnNbIDAgXSxcblx0XHRcdGNvbG9yczEgPSB0aGlzLmNvbG9ycyxcblx0XHRcdGNvbG9yczIgPSBnZW9tZXRyeS5jb2xvcnM7XG5cblx0XHRpZiAoIG1hdGVyaWFsSW5kZXhPZmZzZXQgPT09IHVuZGVmaW5lZCApIG1hdGVyaWFsSW5kZXhPZmZzZXQgPSAwO1xuXG5cdFx0aWYgKCBtYXRyaXggIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0bm9ybWFsTWF0cml4ID0gbmV3IE1hdHJpeDMoKS5nZXROb3JtYWxNYXRyaXgoIG1hdHJpeCApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gdmVydGljZXNcblxuXHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSB2ZXJ0aWNlczIubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHZhciB2ZXJ0ZXggPSB2ZXJ0aWNlczJbIGkgXTtcblxuXHRcdFx0dmFyIHZlcnRleENvcHkgPSB2ZXJ0ZXguY2xvbmUoKTtcblxuXHRcdFx0aWYgKCBtYXRyaXggIT09IHVuZGVmaW5lZCApIHZlcnRleENvcHkuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTtcblxuXHRcdFx0dmVydGljZXMxLnB1c2goIHZlcnRleENvcHkgKTtcblxuXHRcdH1cblxuXHRcdC8vIGNvbG9yc1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IGNvbG9yczIubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdGNvbG9yczEucHVzaCggY29sb3JzMlsgaSBdLmNsb25lKCkgKTtcblxuXHRcdH1cblxuXHRcdC8vIGZhY2VzXG5cblx0XHRmb3IgKCBpID0gMCwgaWwgPSBmYWNlczIubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBmYWNlID0gZmFjZXMyWyBpIF0sIGZhY2VDb3B5LCBub3JtYWwsIGNvbG9yLFxuXHRcdFx0XHRmYWNlVmVydGV4Tm9ybWFscyA9IGZhY2UudmVydGV4Tm9ybWFscyxcblx0XHRcdFx0ZmFjZVZlcnRleENvbG9ycyA9IGZhY2UudmVydGV4Q29sb3JzO1xuXG5cdFx0XHRmYWNlQ29weSA9IG5ldyBGYWNlMyggZmFjZS5hICsgdmVydGV4T2Zmc2V0LCBmYWNlLmIgKyB2ZXJ0ZXhPZmZzZXQsIGZhY2UuYyArIHZlcnRleE9mZnNldCApO1xuXHRcdFx0ZmFjZUNvcHkubm9ybWFsLmNvcHkoIGZhY2Uubm9ybWFsICk7XG5cblx0XHRcdGlmICggbm9ybWFsTWF0cml4ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0ZmFjZUNvcHkubm9ybWFsLmFwcGx5TWF0cml4Myggbm9ybWFsTWF0cml4ICkubm9ybWFsaXplKCk7XG5cblx0XHRcdH1cblxuXHRcdFx0Zm9yICggdmFyIGogPSAwLCBqbCA9IGZhY2VWZXJ0ZXhOb3JtYWxzLmxlbmd0aDsgaiA8IGpsOyBqICsrICkge1xuXG5cdFx0XHRcdG5vcm1hbCA9IGZhY2VWZXJ0ZXhOb3JtYWxzWyBqIF0uY2xvbmUoKTtcblxuXHRcdFx0XHRpZiAoIG5vcm1hbE1hdHJpeCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0bm9ybWFsLmFwcGx5TWF0cml4Myggbm9ybWFsTWF0cml4ICkubm9ybWFsaXplKCk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGZhY2VDb3B5LnZlcnRleE5vcm1hbHMucHVzaCggbm9ybWFsICk7XG5cblx0XHRcdH1cblxuXHRcdFx0ZmFjZUNvcHkuY29sb3IuY29weSggZmFjZS5jb2xvciApO1xuXG5cdFx0XHRmb3IgKCB2YXIgaiA9IDAsIGpsID0gZmFjZVZlcnRleENvbG9ycy5sZW5ndGg7IGogPCBqbDsgaiArKyApIHtcblxuXHRcdFx0XHRjb2xvciA9IGZhY2VWZXJ0ZXhDb2xvcnNbIGogXTtcblx0XHRcdFx0ZmFjZUNvcHkudmVydGV4Q29sb3JzLnB1c2goIGNvbG9yLmNsb25lKCkgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRmYWNlQ29weS5tYXRlcmlhbEluZGV4ID0gZmFjZS5tYXRlcmlhbEluZGV4ICsgbWF0ZXJpYWxJbmRleE9mZnNldDtcblxuXHRcdFx0ZmFjZXMxLnB1c2goIGZhY2VDb3B5ICk7XG5cblx0XHR9XG5cblx0XHQvLyB1dnNcblxuXHRcdGZvciAoIGkgPSAwLCBpbCA9IHV2czIubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHZhciB1diA9IHV2czJbIGkgXSwgdXZDb3B5ID0gW107XG5cblx0XHRcdGlmICggdXYgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRjb250aW51ZTtcblxuXHRcdFx0fVxuXG5cdFx0XHRmb3IgKCB2YXIgaiA9IDAsIGpsID0gdXYubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7XG5cblx0XHRcdFx0dXZDb3B5LnB1c2goIHV2WyBqIF0uY2xvbmUoKSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHV2czEucHVzaCggdXZDb3B5ICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHRtZXJnZU1lc2g6IGZ1bmN0aW9uICggbWVzaCApIHtcblxuXHRcdGlmICggKCBtZXNoICYmIG1lc2guaXNNZXNoICkgPT09IGZhbHNlICkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuR2VvbWV0cnkubWVyZ2VNZXNoKCk6IG1lc2ggbm90IGFuIGluc3RhbmNlIG9mIFRIUkVFLk1lc2guJywgbWVzaCApO1xuXHRcdFx0cmV0dXJuO1xuXG5cdFx0fVxuXG5cdFx0bWVzaC5tYXRyaXhBdXRvVXBkYXRlICYmIG1lc2gudXBkYXRlTWF0cml4KCk7XG5cblx0XHR0aGlzLm1lcmdlKCBtZXNoLmdlb21ldHJ5LCBtZXNoLm1hdHJpeCApO1xuXG5cdH0sXG5cblx0Lypcblx0ICogQ2hlY2tzIGZvciBkdXBsaWNhdGUgdmVydGljZXMgd2l0aCBoYXNobWFwLlxuXHQgKiBEdXBsaWNhdGVkIHZlcnRpY2VzIGFyZSByZW1vdmVkXG5cdCAqIGFuZCBmYWNlcycgdmVydGljZXMgYXJlIHVwZGF0ZWQuXG5cdCAqL1xuXG5cdG1lcmdlVmVydGljZXM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB2ZXJ0aWNlc01hcCA9IHt9OyAvLyBIYXNobWFwIGZvciBsb29raW5nIHVwIHZlcnRpY2VzIGJ5IHBvc2l0aW9uIGNvb3JkaW5hdGVzIChhbmQgbWFraW5nIHN1cmUgdGhleSBhcmUgdW5pcXVlKVxuXHRcdHZhciB1bmlxdWUgPSBbXSwgY2hhbmdlcyA9IFtdO1xuXG5cdFx0dmFyIHYsIGtleTtcblx0XHR2YXIgcHJlY2lzaW9uUG9pbnRzID0gNDsgLy8gbnVtYmVyIG9mIGRlY2ltYWwgcG9pbnRzLCBlLmcuIDQgZm9yIGVwc2lsb24gb2YgMC4wMDAxXG5cdFx0dmFyIHByZWNpc2lvbiA9IE1hdGgucG93KCAxMCwgcHJlY2lzaW9uUG9pbnRzICk7XG5cdFx0dmFyIGksIGlsLCBmYWNlO1xuXHRcdHZhciBpbmRpY2VzLCBqLCBqbDtcblxuXHRcdGZvciAoIGkgPSAwLCBpbCA9IHRoaXMudmVydGljZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHYgPSB0aGlzLnZlcnRpY2VzWyBpIF07XG5cdFx0XHRrZXkgPSBNYXRoLnJvdW5kKCB2LnggKiBwcmVjaXNpb24gKSArICdfJyArIE1hdGgucm91bmQoIHYueSAqIHByZWNpc2lvbiApICsgJ18nICsgTWF0aC5yb3VuZCggdi56ICogcHJlY2lzaW9uICk7XG5cblx0XHRcdGlmICggdmVydGljZXNNYXBbIGtleSBdID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0dmVydGljZXNNYXBbIGtleSBdID0gaTtcblx0XHRcdFx0dW5pcXVlLnB1c2goIHRoaXMudmVydGljZXNbIGkgXSApO1xuXHRcdFx0XHRjaGFuZ2VzWyBpIF0gPSB1bmlxdWUubGVuZ3RoIC0gMTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvL2NvbnNvbGUubG9nKCdEdXBsaWNhdGUgdmVydGV4IGZvdW5kLiAnLCBpLCAnIGNvdWxkIGJlIHVzaW5nICcsIHZlcnRpY2VzTWFwW2tleV0pO1xuXHRcdFx0XHRjaGFuZ2VzWyBpIF0gPSBjaGFuZ2VzWyB2ZXJ0aWNlc01hcFsga2V5IF0gXTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cblx0XHQvLyBpZiBmYWNlcyBhcmUgY29tcGxldGVseSBkZWdlbmVyYXRlIGFmdGVyIG1lcmdpbmcgdmVydGljZXMsIHdlXG5cdFx0Ly8gaGF2ZSB0byByZW1vdmUgdGhlbSBmcm9tIHRoZSBnZW9tZXRyeS5cblx0XHR2YXIgZmFjZUluZGljZXNUb1JlbW92ZSA9IFtdO1xuXG5cdFx0Zm9yICggaSA9IDAsIGlsID0gdGhpcy5mYWNlcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0ZmFjZSA9IHRoaXMuZmFjZXNbIGkgXTtcblxuXHRcdFx0ZmFjZS5hID0gY2hhbmdlc1sgZmFjZS5hIF07XG5cdFx0XHRmYWNlLmIgPSBjaGFuZ2VzWyBmYWNlLmIgXTtcblx0XHRcdGZhY2UuYyA9IGNoYW5nZXNbIGZhY2UuYyBdO1xuXG5cdFx0XHRpbmRpY2VzID0gWyBmYWNlLmEsIGZhY2UuYiwgZmFjZS5jIF07XG5cblx0XHRcdC8vIGlmIGFueSBkdXBsaWNhdGUgdmVydGljZXMgYXJlIGZvdW5kIGluIGEgRmFjZTNcblx0XHRcdC8vIHdlIGhhdmUgdG8gcmVtb3ZlIHRoZSBmYWNlIGFzIG5vdGhpbmcgY2FuIGJlIHNhdmVkXG5cdFx0XHRmb3IgKCB2YXIgbiA9IDA7IG4gPCAzOyBuICsrICkge1xuXG5cdFx0XHRcdGlmICggaW5kaWNlc1sgbiBdID09PSBpbmRpY2VzWyAoIG4gKyAxICkgJSAzIF0gKSB7XG5cblx0XHRcdFx0XHRmYWNlSW5kaWNlc1RvUmVtb3ZlLnB1c2goIGkgKTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGZvciAoIGkgPSBmYWNlSW5kaWNlc1RvUmVtb3ZlLmxlbmd0aCAtIDE7IGkgPj0gMDsgaSAtLSApIHtcblxuXHRcdFx0dmFyIGlkeCA9IGZhY2VJbmRpY2VzVG9SZW1vdmVbIGkgXTtcblxuXHRcdFx0dGhpcy5mYWNlcy5zcGxpY2UoIGlkeCwgMSApO1xuXG5cdFx0XHRmb3IgKCBqID0gMCwgamwgPSB0aGlzLmZhY2VWZXJ0ZXhVdnMubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7XG5cblx0XHRcdFx0dGhpcy5mYWNlVmVydGV4VXZzWyBqIF0uc3BsaWNlKCBpZHgsIDEgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gVXNlIHVuaXF1ZSBzZXQgb2YgdmVydGljZXNcblxuXHRcdHZhciBkaWZmID0gdGhpcy52ZXJ0aWNlcy5sZW5ndGggLSB1bmlxdWUubGVuZ3RoO1xuXHRcdHRoaXMudmVydGljZXMgPSB1bmlxdWU7XG5cdFx0cmV0dXJuIGRpZmY7XG5cblx0fSxcblxuXHRzb3J0RmFjZXNCeU1hdGVyaWFsSW5kZXg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBmYWNlcyA9IHRoaXMuZmFjZXM7XG5cdFx0dmFyIGxlbmd0aCA9IGZhY2VzLmxlbmd0aDtcblxuXHRcdC8vIHRhZyBmYWNlc1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRmYWNlc1sgaSBdLl9pZCA9IGk7XG5cblx0XHR9XG5cblx0XHQvLyBzb3J0IGZhY2VzXG5cblx0XHRmdW5jdGlvbiBtYXRlcmlhbEluZGV4U29ydCggYSwgYiApIHtcblxuXHRcdFx0cmV0dXJuIGEubWF0ZXJpYWxJbmRleCAtIGIubWF0ZXJpYWxJbmRleDtcblxuXHRcdH1cblxuXHRcdGZhY2VzLnNvcnQoIG1hdGVyaWFsSW5kZXhTb3J0ICk7XG5cblx0XHQvLyBzb3J0IHV2c1xuXG5cdFx0dmFyIHV2czEgPSB0aGlzLmZhY2VWZXJ0ZXhVdnNbIDAgXTtcblx0XHR2YXIgdXZzMiA9IHRoaXMuZmFjZVZlcnRleFV2c1sgMSBdO1xuXG5cdFx0dmFyIG5ld1V2czEsIG5ld1V2czI7XG5cblx0XHRpZiAoIHV2czEgJiYgdXZzMS5sZW5ndGggPT09IGxlbmd0aCApIG5ld1V2czEgPSBbXTtcblx0XHRpZiAoIHV2czIgJiYgdXZzMi5sZW5ndGggPT09IGxlbmd0aCApIG5ld1V2czIgPSBbXTtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGlkID0gZmFjZXNbIGkgXS5faWQ7XG5cblx0XHRcdGlmICggbmV3VXZzMSApIG5ld1V2czEucHVzaCggdXZzMVsgaWQgXSApO1xuXHRcdFx0aWYgKCBuZXdVdnMyICkgbmV3VXZzMi5wdXNoKCB1dnMyWyBpZCBdICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIG5ld1V2czEgKSB0aGlzLmZhY2VWZXJ0ZXhVdnNbIDAgXSA9IG5ld1V2czE7XG5cdFx0aWYgKCBuZXdVdnMyICkgdGhpcy5mYWNlVmVydGV4VXZzWyAxIF0gPSBuZXdVdnMyO1xuXG5cdH0sXG5cblx0dG9KU09OOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgZGF0YSA9IHtcblx0XHRcdG1ldGFkYXRhOiB7XG5cdFx0XHRcdHZlcnNpb246IDQuNSxcblx0XHRcdFx0dHlwZTogJ0dlb21ldHJ5Jyxcblx0XHRcdFx0Z2VuZXJhdG9yOiAnR2VvbWV0cnkudG9KU09OJ1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHQvLyBzdGFuZGFyZCBHZW9tZXRyeSBzZXJpYWxpemF0aW9uXG5cblx0XHRkYXRhLnV1aWQgPSB0aGlzLnV1aWQ7XG5cdFx0ZGF0YS50eXBlID0gdGhpcy50eXBlO1xuXHRcdGlmICggdGhpcy5uYW1lICE9PSAnJyApIGRhdGEubmFtZSA9IHRoaXMubmFtZTtcblxuXHRcdGlmICggdGhpcy5wYXJhbWV0ZXJzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHZhciBwYXJhbWV0ZXJzID0gdGhpcy5wYXJhbWV0ZXJzO1xuXG5cdFx0XHRmb3IgKCB2YXIga2V5IGluIHBhcmFtZXRlcnMgKSB7XG5cblx0XHRcdFx0aWYgKCBwYXJhbWV0ZXJzWyBrZXkgXSAhPT0gdW5kZWZpbmVkICkgZGF0YVsga2V5IF0gPSBwYXJhbWV0ZXJzWyBrZXkgXTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZGF0YTtcblxuXHRcdH1cblxuXHRcdHZhciB2ZXJ0aWNlcyA9IFtdO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgdGhpcy52ZXJ0aWNlcy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdHZhciB2ZXJ0ZXggPSB0aGlzLnZlcnRpY2VzWyBpIF07XG5cdFx0XHR2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7XG5cblx0XHR9XG5cblx0XHR2YXIgZmFjZXMgPSBbXTtcblx0XHR2YXIgbm9ybWFscyA9IFtdO1xuXHRcdHZhciBub3JtYWxzSGFzaCA9IHt9O1xuXHRcdHZhciBjb2xvcnMgPSBbXTtcblx0XHR2YXIgY29sb3JzSGFzaCA9IHt9O1xuXHRcdHZhciB1dnMgPSBbXTtcblx0XHR2YXIgdXZzSGFzaCA9IHt9O1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgdGhpcy5mYWNlcy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdHZhciBmYWNlID0gdGhpcy5mYWNlc1sgaSBdO1xuXG5cdFx0XHR2YXIgaGFzTWF0ZXJpYWwgPSB0cnVlO1xuXHRcdFx0dmFyIGhhc0ZhY2VVdiA9IGZhbHNlOyAvLyBkZXByZWNhdGVkXG5cdFx0XHR2YXIgaGFzRmFjZVZlcnRleFV2ID0gdGhpcy5mYWNlVmVydGV4VXZzWyAwIF1bIGkgXSAhPT0gdW5kZWZpbmVkO1xuXHRcdFx0dmFyIGhhc0ZhY2VOb3JtYWwgPSBmYWNlLm5vcm1hbC5sZW5ndGgoKSA+IDA7XG5cdFx0XHR2YXIgaGFzRmFjZVZlcnRleE5vcm1hbCA9IGZhY2UudmVydGV4Tm9ybWFscy5sZW5ndGggPiAwO1xuXHRcdFx0dmFyIGhhc0ZhY2VDb2xvciA9IGZhY2UuY29sb3IuciAhPT0gMSB8fCBmYWNlLmNvbG9yLmcgIT09IDEgfHwgZmFjZS5jb2xvci5iICE9PSAxO1xuXHRcdFx0dmFyIGhhc0ZhY2VWZXJ0ZXhDb2xvciA9IGZhY2UudmVydGV4Q29sb3JzLmxlbmd0aCA+IDA7XG5cblx0XHRcdHZhciBmYWNlVHlwZSA9IDA7XG5cblx0XHRcdGZhY2VUeXBlID0gc2V0Qml0KCBmYWNlVHlwZSwgMCwgMCApOyAvLyBpc1F1YWRcblx0XHRcdGZhY2VUeXBlID0gc2V0Qml0KCBmYWNlVHlwZSwgMSwgaGFzTWF0ZXJpYWwgKTtcblx0XHRcdGZhY2VUeXBlID0gc2V0Qml0KCBmYWNlVHlwZSwgMiwgaGFzRmFjZVV2ICk7XG5cdFx0XHRmYWNlVHlwZSA9IHNldEJpdCggZmFjZVR5cGUsIDMsIGhhc0ZhY2VWZXJ0ZXhVdiApO1xuXHRcdFx0ZmFjZVR5cGUgPSBzZXRCaXQoIGZhY2VUeXBlLCA0LCBoYXNGYWNlTm9ybWFsICk7XG5cdFx0XHRmYWNlVHlwZSA9IHNldEJpdCggZmFjZVR5cGUsIDUsIGhhc0ZhY2VWZXJ0ZXhOb3JtYWwgKTtcblx0XHRcdGZhY2VUeXBlID0gc2V0Qml0KCBmYWNlVHlwZSwgNiwgaGFzRmFjZUNvbG9yICk7XG5cdFx0XHRmYWNlVHlwZSA9IHNldEJpdCggZmFjZVR5cGUsIDcsIGhhc0ZhY2VWZXJ0ZXhDb2xvciApO1xuXG5cdFx0XHRmYWNlcy5wdXNoKCBmYWNlVHlwZSApO1xuXHRcdFx0ZmFjZXMucHVzaCggZmFjZS5hLCBmYWNlLmIsIGZhY2UuYyApO1xuXHRcdFx0ZmFjZXMucHVzaCggZmFjZS5tYXRlcmlhbEluZGV4ICk7XG5cblx0XHRcdGlmICggaGFzRmFjZVZlcnRleFV2ICkge1xuXG5cdFx0XHRcdHZhciBmYWNlVmVydGV4VXZzID0gdGhpcy5mYWNlVmVydGV4VXZzWyAwIF1bIGkgXTtcblxuXHRcdFx0XHRmYWNlcy5wdXNoKFxuXHRcdFx0XHRcdGdldFV2SW5kZXgoIGZhY2VWZXJ0ZXhVdnNbIDAgXSApLFxuXHRcdFx0XHRcdGdldFV2SW5kZXgoIGZhY2VWZXJ0ZXhVdnNbIDEgXSApLFxuXHRcdFx0XHRcdGdldFV2SW5kZXgoIGZhY2VWZXJ0ZXhVdnNbIDIgXSApXG5cdFx0XHRcdCk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBoYXNGYWNlTm9ybWFsICkge1xuXG5cdFx0XHRcdGZhY2VzLnB1c2goIGdldE5vcm1hbEluZGV4KCBmYWNlLm5vcm1hbCApICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBoYXNGYWNlVmVydGV4Tm9ybWFsICkge1xuXG5cdFx0XHRcdHZhciB2ZXJ0ZXhOb3JtYWxzID0gZmFjZS52ZXJ0ZXhOb3JtYWxzO1xuXG5cdFx0XHRcdGZhY2VzLnB1c2goXG5cdFx0XHRcdFx0Z2V0Tm9ybWFsSW5kZXgoIHZlcnRleE5vcm1hbHNbIDAgXSApLFxuXHRcdFx0XHRcdGdldE5vcm1hbEluZGV4KCB2ZXJ0ZXhOb3JtYWxzWyAxIF0gKSxcblx0XHRcdFx0XHRnZXROb3JtYWxJbmRleCggdmVydGV4Tm9ybWFsc1sgMiBdIClcblx0XHRcdFx0KTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGhhc0ZhY2VDb2xvciApIHtcblxuXHRcdFx0XHRmYWNlcy5wdXNoKCBnZXRDb2xvckluZGV4KCBmYWNlLmNvbG9yICkgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGhhc0ZhY2VWZXJ0ZXhDb2xvciApIHtcblxuXHRcdFx0XHR2YXIgdmVydGV4Q29sb3JzID0gZmFjZS52ZXJ0ZXhDb2xvcnM7XG5cblx0XHRcdFx0ZmFjZXMucHVzaChcblx0XHRcdFx0XHRnZXRDb2xvckluZGV4KCB2ZXJ0ZXhDb2xvcnNbIDAgXSApLFxuXHRcdFx0XHRcdGdldENvbG9ySW5kZXgoIHZlcnRleENvbG9yc1sgMSBdICksXG5cdFx0XHRcdFx0Z2V0Q29sb3JJbmRleCggdmVydGV4Q29sb3JzWyAyIF0gKVxuXHRcdFx0XHQpO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBzZXRCaXQoIHZhbHVlLCBwb3NpdGlvbiwgZW5hYmxlZCApIHtcblxuXHRcdFx0cmV0dXJuIGVuYWJsZWQgPyB2YWx1ZSB8ICggMSA8PCBwb3NpdGlvbiApIDogdmFsdWUgJiAoIH4gKCAxIDw8IHBvc2l0aW9uICkgKTtcblxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIGdldE5vcm1hbEluZGV4KCBub3JtYWwgKSB7XG5cblx0XHRcdHZhciBoYXNoID0gbm9ybWFsLngudG9TdHJpbmcoKSArIG5vcm1hbC55LnRvU3RyaW5nKCkgKyBub3JtYWwuei50b1N0cmluZygpO1xuXG5cdFx0XHRpZiAoIG5vcm1hbHNIYXNoWyBoYXNoIF0gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRyZXR1cm4gbm9ybWFsc0hhc2hbIGhhc2ggXTtcblxuXHRcdFx0fVxuXG5cdFx0XHRub3JtYWxzSGFzaFsgaGFzaCBdID0gbm9ybWFscy5sZW5ndGggLyAzO1xuXHRcdFx0bm9ybWFscy5wdXNoKCBub3JtYWwueCwgbm9ybWFsLnksIG5vcm1hbC56ICk7XG5cblx0XHRcdHJldHVybiBub3JtYWxzSGFzaFsgaGFzaCBdO1xuXG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gZ2V0Q29sb3JJbmRleCggY29sb3IgKSB7XG5cblx0XHRcdHZhciBoYXNoID0gY29sb3Iuci50b1N0cmluZygpICsgY29sb3IuZy50b1N0cmluZygpICsgY29sb3IuYi50b1N0cmluZygpO1xuXG5cdFx0XHRpZiAoIGNvbG9yc0hhc2hbIGhhc2ggXSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHJldHVybiBjb2xvcnNIYXNoWyBoYXNoIF07XG5cblx0XHRcdH1cblxuXHRcdFx0Y29sb3JzSGFzaFsgaGFzaCBdID0gY29sb3JzLmxlbmd0aDtcblx0XHRcdGNvbG9ycy5wdXNoKCBjb2xvci5nZXRIZXgoKSApO1xuXG5cdFx0XHRyZXR1cm4gY29sb3JzSGFzaFsgaGFzaCBdO1xuXG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gZ2V0VXZJbmRleCggdXYgKSB7XG5cblx0XHRcdHZhciBoYXNoID0gdXYueC50b1N0cmluZygpICsgdXYueS50b1N0cmluZygpO1xuXG5cdFx0XHRpZiAoIHV2c0hhc2hbIGhhc2ggXSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHJldHVybiB1dnNIYXNoWyBoYXNoIF07XG5cblx0XHRcdH1cblxuXHRcdFx0dXZzSGFzaFsgaGFzaCBdID0gdXZzLmxlbmd0aCAvIDI7XG5cdFx0XHR1dnMucHVzaCggdXYueCwgdXYueSApO1xuXG5cdFx0XHRyZXR1cm4gdXZzSGFzaFsgaGFzaCBdO1xuXG5cdFx0fVxuXG5cdFx0ZGF0YS5kYXRhID0ge307XG5cblx0XHRkYXRhLmRhdGEudmVydGljZXMgPSB2ZXJ0aWNlcztcblx0XHRkYXRhLmRhdGEubm9ybWFscyA9IG5vcm1hbHM7XG5cdFx0aWYgKCBjb2xvcnMubGVuZ3RoID4gMCApIGRhdGEuZGF0YS5jb2xvcnMgPSBjb2xvcnM7XG5cdFx0aWYgKCB1dnMubGVuZ3RoID4gMCApIGRhdGEuZGF0YS51dnMgPSBbIHV2cyBdOyAvLyB0ZW1wb3JhbCBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG5cdFx0ZGF0YS5kYXRhLmZhY2VzID0gZmFjZXM7XG5cblx0XHRyZXR1cm4gZGF0YTtcblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvKlxuXHRcdCAvLyBIYW5kbGUgcHJpbWl0aXZlc1xuXG5cdFx0IHZhciBwYXJhbWV0ZXJzID0gdGhpcy5wYXJhbWV0ZXJzO1xuXG5cdFx0IGlmICggcGFyYW1ldGVycyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0IHZhciB2YWx1ZXMgPSBbXTtcblxuXHRcdCBmb3IgKCB2YXIga2V5IGluIHBhcmFtZXRlcnMgKSB7XG5cblx0XHQgdmFsdWVzLnB1c2goIHBhcmFtZXRlcnNbIGtleSBdICk7XG5cblx0XHQgfVxuXG5cdFx0IHZhciBnZW9tZXRyeSA9IE9iamVjdC5jcmVhdGUoIHRoaXMuY29uc3RydWN0b3IucHJvdG90eXBlICk7XG5cdFx0IHRoaXMuY29uc3RydWN0b3IuYXBwbHkoIGdlb21ldHJ5LCB2YWx1ZXMgKTtcblx0XHQgcmV0dXJuIGdlb21ldHJ5O1xuXG5cdFx0IH1cblxuXHRcdCByZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XG5cdFx0ICovXG5cblx0XHRyZXR1cm4gbmV3IEdlb21ldHJ5KCkuY29weSggdGhpcyApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHR2YXIgaSwgaWwsIGosIGpsLCBrLCBrbDtcblxuXHRcdC8vIHJlc2V0XG5cblx0XHR0aGlzLnZlcnRpY2VzID0gW107XG5cdFx0dGhpcy5jb2xvcnMgPSBbXTtcblx0XHR0aGlzLmZhY2VzID0gW107XG5cdFx0dGhpcy5mYWNlVmVydGV4VXZzID0gW1tdXTtcblx0XHR0aGlzLm1vcnBoVGFyZ2V0cyA9IFtdO1xuXHRcdHRoaXMubW9ycGhOb3JtYWxzID0gW107XG5cdFx0dGhpcy5za2luV2VpZ2h0cyA9IFtdO1xuXHRcdHRoaXMuc2tpbkluZGljZXMgPSBbXTtcblx0XHR0aGlzLmxpbmVEaXN0YW5jZXMgPSBbXTtcblx0XHR0aGlzLmJvdW5kaW5nQm94ID0gbnVsbDtcblx0XHR0aGlzLmJvdW5kaW5nU3BoZXJlID0gbnVsbDtcblxuXHRcdC8vIG5hbWVcblxuXHRcdHRoaXMubmFtZSA9IHNvdXJjZS5uYW1lO1xuXG5cdFx0Ly8gdmVydGljZXNcblxuXHRcdHZhciB2ZXJ0aWNlcyA9IHNvdXJjZS52ZXJ0aWNlcztcblxuXHRcdGZvciAoIGkgPSAwLCBpbCA9IHZlcnRpY2VzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR0aGlzLnZlcnRpY2VzLnB1c2goIHZlcnRpY2VzWyBpIF0uY2xvbmUoKSApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gY29sb3JzXG5cblx0XHR2YXIgY29sb3JzID0gc291cmNlLmNvbG9ycztcblxuXHRcdGZvciAoIGkgPSAwLCBpbCA9IGNvbG9ycy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0dGhpcy5jb2xvcnMucHVzaCggY29sb3JzWyBpIF0uY2xvbmUoKSApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gZmFjZXNcblxuXHRcdHZhciBmYWNlcyA9IHNvdXJjZS5mYWNlcztcblxuXHRcdGZvciAoIGkgPSAwLCBpbCA9IGZhY2VzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR0aGlzLmZhY2VzLnB1c2goIGZhY2VzWyBpIF0uY2xvbmUoKSApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gZmFjZSB2ZXJ0ZXggdXZzXG5cblx0XHRmb3IgKCBpID0gMCwgaWwgPSBzb3VyY2UuZmFjZVZlcnRleFV2cy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGZhY2VWZXJ0ZXhVdnMgPSBzb3VyY2UuZmFjZVZlcnRleFV2c1sgaSBdO1xuXG5cdFx0XHRpZiAoIHRoaXMuZmFjZVZlcnRleFV2c1sgaSBdID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0dGhpcy5mYWNlVmVydGV4VXZzWyBpIF0gPSBbXTtcblxuXHRcdFx0fVxuXG5cdFx0XHRmb3IgKCBqID0gMCwgamwgPSBmYWNlVmVydGV4VXZzLmxlbmd0aDsgaiA8IGpsOyBqICsrICkge1xuXG5cdFx0XHRcdHZhciB1dnMgPSBmYWNlVmVydGV4VXZzWyBqIF0sIHV2c0NvcHkgPSBbXTtcblxuXHRcdFx0XHRmb3IgKCBrID0gMCwga2wgPSB1dnMubGVuZ3RoOyBrIDwga2w7IGsgKysgKSB7XG5cblx0XHRcdFx0XHR2YXIgdXYgPSB1dnNbIGsgXTtcblxuXHRcdFx0XHRcdHV2c0NvcHkucHVzaCggdXYuY2xvbmUoKSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0aGlzLmZhY2VWZXJ0ZXhVdnNbIGkgXS5wdXNoKCB1dnNDb3B5ICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIG1vcnBoIHRhcmdldHNcblxuXHRcdHZhciBtb3JwaFRhcmdldHMgPSBzb3VyY2UubW9ycGhUYXJnZXRzO1xuXG5cdFx0Zm9yICggaSA9IDAsIGlsID0gbW9ycGhUYXJnZXRzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgbW9ycGhUYXJnZXQgPSB7fTtcblx0XHRcdG1vcnBoVGFyZ2V0Lm5hbWUgPSBtb3JwaFRhcmdldHNbIGkgXS5uYW1lO1xuXG5cdFx0XHQvLyB2ZXJ0aWNlc1xuXG5cdFx0XHRpZiAoIG1vcnBoVGFyZ2V0c1sgaSBdLnZlcnRpY2VzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0bW9ycGhUYXJnZXQudmVydGljZXMgPSBbXTtcblxuXHRcdFx0XHRmb3IgKCBqID0gMCwgamwgPSBtb3JwaFRhcmdldHNbIGkgXS52ZXJ0aWNlcy5sZW5ndGg7IGogPCBqbDsgaiArKyApIHtcblxuXHRcdFx0XHRcdG1vcnBoVGFyZ2V0LnZlcnRpY2VzLnB1c2goIG1vcnBoVGFyZ2V0c1sgaSBdLnZlcnRpY2VzWyBqIF0uY2xvbmUoKSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBub3JtYWxzXG5cblx0XHRcdGlmICggbW9ycGhUYXJnZXRzWyBpIF0ubm9ybWFscyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdG1vcnBoVGFyZ2V0Lm5vcm1hbHMgPSBbXTtcblxuXHRcdFx0XHRmb3IgKCBqID0gMCwgamwgPSBtb3JwaFRhcmdldHNbIGkgXS5ub3JtYWxzLmxlbmd0aDsgaiA8IGpsOyBqICsrICkge1xuXG5cdFx0XHRcdFx0bW9ycGhUYXJnZXQubm9ybWFscy5wdXNoKCBtb3JwaFRhcmdldHNbIGkgXS5ub3JtYWxzWyBqIF0uY2xvbmUoKSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLm1vcnBoVGFyZ2V0cy5wdXNoKCBtb3JwaFRhcmdldCApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gbW9ycGggbm9ybWFsc1xuXG5cdFx0dmFyIG1vcnBoTm9ybWFscyA9IHNvdXJjZS5tb3JwaE5vcm1hbHM7XG5cblx0XHRmb3IgKCBpID0gMCwgaWwgPSBtb3JwaE5vcm1hbHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBtb3JwaE5vcm1hbCA9IHt9O1xuXG5cdFx0XHQvLyB2ZXJ0ZXggbm9ybWFsc1xuXG5cdFx0XHRpZiAoIG1vcnBoTm9ybWFsc1sgaSBdLnZlcnRleE5vcm1hbHMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRtb3JwaE5vcm1hbC52ZXJ0ZXhOb3JtYWxzID0gW107XG5cblx0XHRcdFx0Zm9yICggaiA9IDAsIGpsID0gbW9ycGhOb3JtYWxzWyBpIF0udmVydGV4Tm9ybWFscy5sZW5ndGg7IGogPCBqbDsgaiArKyApIHtcblxuXHRcdFx0XHRcdHZhciBzcmNWZXJ0ZXhOb3JtYWwgPSBtb3JwaE5vcm1hbHNbIGkgXS52ZXJ0ZXhOb3JtYWxzWyBqIF07XG5cdFx0XHRcdFx0dmFyIGRlc3RWZXJ0ZXhOb3JtYWwgPSB7fTtcblxuXHRcdFx0XHRcdGRlc3RWZXJ0ZXhOb3JtYWwuYSA9IHNyY1ZlcnRleE5vcm1hbC5hLmNsb25lKCk7XG5cdFx0XHRcdFx0ZGVzdFZlcnRleE5vcm1hbC5iID0gc3JjVmVydGV4Tm9ybWFsLmIuY2xvbmUoKTtcblx0XHRcdFx0XHRkZXN0VmVydGV4Tm9ybWFsLmMgPSBzcmNWZXJ0ZXhOb3JtYWwuYy5jbG9uZSgpO1xuXG5cdFx0XHRcdFx0bW9ycGhOb3JtYWwudmVydGV4Tm9ybWFscy5wdXNoKCBkZXN0VmVydGV4Tm9ybWFsICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdC8vIGZhY2Ugbm9ybWFsc1xuXG5cdFx0XHRpZiAoIG1vcnBoTm9ybWFsc1sgaSBdLmZhY2VOb3JtYWxzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0bW9ycGhOb3JtYWwuZmFjZU5vcm1hbHMgPSBbXTtcblxuXHRcdFx0XHRmb3IgKCBqID0gMCwgamwgPSBtb3JwaE5vcm1hbHNbIGkgXS5mYWNlTm9ybWFscy5sZW5ndGg7IGogPCBqbDsgaiArKyApIHtcblxuXHRcdFx0XHRcdG1vcnBoTm9ybWFsLmZhY2VOb3JtYWxzLnB1c2goIG1vcnBoTm9ybWFsc1sgaSBdLmZhY2VOb3JtYWxzWyBqIF0uY2xvbmUoKSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLm1vcnBoTm9ybWFscy5wdXNoKCBtb3JwaE5vcm1hbCApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gc2tpbiB3ZWlnaHRzXG5cblx0XHR2YXIgc2tpbldlaWdodHMgPSBzb3VyY2Uuc2tpbldlaWdodHM7XG5cblx0XHRmb3IgKCBpID0gMCwgaWwgPSBza2luV2VpZ2h0cy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0dGhpcy5za2luV2VpZ2h0cy5wdXNoKCBza2luV2VpZ2h0c1sgaSBdLmNsb25lKCkgKTtcblxuXHRcdH1cblxuXHRcdC8vIHNraW4gaW5kaWNlc1xuXG5cdFx0dmFyIHNraW5JbmRpY2VzID0gc291cmNlLnNraW5JbmRpY2VzO1xuXG5cdFx0Zm9yICggaSA9IDAsIGlsID0gc2tpbkluZGljZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHRoaXMuc2tpbkluZGljZXMucHVzaCggc2tpbkluZGljZXNbIGkgXS5jbG9uZSgpICk7XG5cblx0XHR9XG5cblx0XHQvLyBsaW5lIGRpc3RhbmNlc1xuXG5cdFx0dmFyIGxpbmVEaXN0YW5jZXMgPSBzb3VyY2UubGluZURpc3RhbmNlcztcblxuXHRcdGZvciAoIGkgPSAwLCBpbCA9IGxpbmVEaXN0YW5jZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHRoaXMubGluZURpc3RhbmNlcy5wdXNoKCBsaW5lRGlzdGFuY2VzWyBpIF0gKTtcblxuXHRcdH1cblxuXHRcdC8vIGJvdW5kaW5nIGJveFxuXG5cdFx0dmFyIGJvdW5kaW5nQm94ID0gc291cmNlLmJvdW5kaW5nQm94O1xuXG5cdFx0aWYgKCBib3VuZGluZ0JveCAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5ib3VuZGluZ0JveCA9IGJvdW5kaW5nQm94LmNsb25lKCk7XG5cblx0XHR9XG5cblx0XHQvLyBib3VuZGluZyBzcGhlcmVcblxuXHRcdHZhciBib3VuZGluZ1NwaGVyZSA9IHNvdXJjZS5ib3VuZGluZ1NwaGVyZTtcblxuXHRcdGlmICggYm91bmRpbmdTcGhlcmUgIT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuYm91bmRpbmdTcGhlcmUgPSBib3VuZGluZ1NwaGVyZS5jbG9uZSgpO1xuXG5cdFx0fVxuXG5cdFx0Ly8gdXBkYXRlIGZsYWdzXG5cblx0XHR0aGlzLmVsZW1lbnRzTmVlZFVwZGF0ZSA9IHNvdXJjZS5lbGVtZW50c05lZWRVcGRhdGU7XG5cdFx0dGhpcy52ZXJ0aWNlc05lZWRVcGRhdGUgPSBzb3VyY2UudmVydGljZXNOZWVkVXBkYXRlO1xuXHRcdHRoaXMudXZzTmVlZFVwZGF0ZSA9IHNvdXJjZS51dnNOZWVkVXBkYXRlO1xuXHRcdHRoaXMubm9ybWFsc05lZWRVcGRhdGUgPSBzb3VyY2Uubm9ybWFsc05lZWRVcGRhdGU7XG5cdFx0dGhpcy5jb2xvcnNOZWVkVXBkYXRlID0gc291cmNlLmNvbG9yc05lZWRVcGRhdGU7XG5cdFx0dGhpcy5saW5lRGlzdGFuY2VzTmVlZFVwZGF0ZSA9IHNvdXJjZS5saW5lRGlzdGFuY2VzTmVlZFVwZGF0ZTtcblx0XHR0aGlzLmdyb3Vwc05lZWRVcGRhdGUgPSBzb3VyY2UuZ3JvdXBzTmVlZFVwZGF0ZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZGlzcG9zZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5kaXNwYXRjaEV2ZW50KCB7IHR5cGU6ICdkaXNwb3NlJyB9ICk7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gQnVmZmVyR2VvbWV0cnkoKSB7XG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KCB0aGlzLCAnaWQnLCB7IHZhbHVlOiBHZW9tZXRyeUlkQ291bnQoKSB9ICk7XG5cblx0dGhpcy51dWlkID0gX01hdGguZ2VuZXJhdGVVVUlEKCk7XG5cblx0dGhpcy5uYW1lID0gJyc7XG5cdHRoaXMudHlwZSA9ICdCdWZmZXJHZW9tZXRyeSc7XG5cblx0dGhpcy5pbmRleCA9IG51bGw7XG5cdHRoaXMuYXR0cmlidXRlcyA9IHt9O1xuXG5cdHRoaXMubW9ycGhBdHRyaWJ1dGVzID0ge307XG5cblx0dGhpcy5ncm91cHMgPSBbXTtcblxuXHR0aGlzLmJvdW5kaW5nQm94ID0gbnVsbDtcblx0dGhpcy5ib3VuZGluZ1NwaGVyZSA9IG51bGw7XG5cblx0dGhpcy5kcmF3UmFuZ2UgPSB7IHN0YXJ0OiAwLCBjb3VudDogSW5maW5pdHkgfTtcblxufVxuXG5CdWZmZXJHZW9tZXRyeS5NYXhJbmRleCA9IDY1NTM1O1xuXG5PYmplY3QuYXNzaWduKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUsIEV2ZW50RGlzcGF0Y2hlci5wcm90b3R5cGUsIHtcblxuXHRpc0J1ZmZlckdlb21ldHJ5OiB0cnVlLFxuXG5cdGdldEluZGV4OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5pbmRleDtcblxuXHR9LFxuXG5cdHNldEluZGV4OiBmdW5jdGlvbiAoIGluZGV4ICkge1xuXG5cdFx0aWYgKCBBcnJheS5pc0FycmF5KCBpbmRleCApICkge1xuXG5cdFx0XHR0aGlzLmluZGV4ID0gbmV3ICggYXJyYXlNYXgoIGluZGV4ICkgPiA2NTUzNSA/IFVpbnQzMkJ1ZmZlckF0dHJpYnV0ZSA6IFVpbnQxNkJ1ZmZlckF0dHJpYnV0ZSApKCBpbmRleCwgMSApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dGhpcy5pbmRleCA9IGluZGV4O1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0YWRkQXR0cmlidXRlOiBmdW5jdGlvbiAoIG5hbWUsIGF0dHJpYnV0ZSApIHtcblxuXHRcdGlmICggKCBhdHRyaWJ1dGUgJiYgYXR0cmlidXRlLmlzQnVmZmVyQXR0cmlidXRlICkgPT09IGZhbHNlICYmICggYXR0cmlidXRlICYmIGF0dHJpYnV0ZS5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlICkgPT09IGZhbHNlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmFkZEF0dHJpYnV0ZSgpIG5vdyBleHBlY3RzICggbmFtZSwgYXR0cmlidXRlICkuJyApO1xuXG5cdFx0XHR0aGlzLmFkZEF0dHJpYnV0ZSggbmFtZSwgbmV3IEJ1ZmZlckF0dHJpYnV0ZSggYXJndW1lbnRzWyAxIF0sIGFyZ3VtZW50c1sgMiBdICkgKTtcblxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBuYW1lID09PSAnaW5kZXgnICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJHZW9tZXRyeS5hZGRBdHRyaWJ1dGU6IFVzZSAuc2V0SW5kZXgoKSBmb3IgaW5kZXggYXR0cmlidXRlLicgKTtcblx0XHRcdHRoaXMuc2V0SW5kZXgoIGF0dHJpYnV0ZSApO1xuXG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHR0aGlzLmF0dHJpYnV0ZXNbIG5hbWUgXSA9IGF0dHJpYnV0ZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Z2V0QXR0cmlidXRlOiBmdW5jdGlvbiAoIG5hbWUgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5hdHRyaWJ1dGVzWyBuYW1lIF07XG5cblx0fSxcblxuXHRyZW1vdmVBdHRyaWJ1dGU6IGZ1bmN0aW9uICggbmFtZSApIHtcblxuXHRcdGRlbGV0ZSB0aGlzLmF0dHJpYnV0ZXNbIG5hbWUgXTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YWRkR3JvdXA6IGZ1bmN0aW9uICggc3RhcnQsIGNvdW50LCBtYXRlcmlhbEluZGV4ICkge1xuXG5cdFx0dGhpcy5ncm91cHMucHVzaCgge1xuXG5cdFx0XHRzdGFydDogc3RhcnQsXG5cdFx0XHRjb3VudDogY291bnQsXG5cdFx0XHRtYXRlcmlhbEluZGV4OiBtYXRlcmlhbEluZGV4ICE9PSB1bmRlZmluZWQgPyBtYXRlcmlhbEluZGV4IDogMFxuXG5cdFx0fSApO1xuXG5cdH0sXG5cblx0Y2xlYXJHcm91cHM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuZ3JvdXBzID0gW107XG5cblx0fSxcblxuXHRzZXREcmF3UmFuZ2U6IGZ1bmN0aW9uICggc3RhcnQsIGNvdW50ICkge1xuXG5cdFx0dGhpcy5kcmF3UmFuZ2Uuc3RhcnQgPSBzdGFydDtcblx0XHR0aGlzLmRyYXdSYW5nZS5jb3VudCA9IGNvdW50O1xuXG5cdH0sXG5cblx0YXBwbHlNYXRyaXg6IGZ1bmN0aW9uICggbWF0cml4ICkge1xuXG5cdFx0dmFyIHBvc2l0aW9uID0gdGhpcy5hdHRyaWJ1dGVzLnBvc2l0aW9uO1xuXG5cdFx0aWYgKCBwb3NpdGlvbiAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRtYXRyaXguYXBwbHlUb0J1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb24gKTtcblx0XHRcdHBvc2l0aW9uLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdH1cblxuXHRcdHZhciBub3JtYWwgPSB0aGlzLmF0dHJpYnV0ZXMubm9ybWFsO1xuXG5cdFx0aWYgKCBub3JtYWwgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dmFyIG5vcm1hbE1hdHJpeCA9IG5ldyBNYXRyaXgzKCkuZ2V0Tm9ybWFsTWF0cml4KCBtYXRyaXggKTtcblxuXHRcdFx0bm9ybWFsTWF0cml4LmFwcGx5VG9CdWZmZXJBdHRyaWJ1dGUoIG5vcm1hbCApO1xuXHRcdFx0bm9ybWFsLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5ib3VuZGluZ0JveCAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5jb21wdXRlQm91bmRpbmdCb3goKTtcblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5ib3VuZGluZ1NwaGVyZSAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0cm90YXRlWDogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gcm90YXRlIGdlb21ldHJ5IGFyb3VuZCB3b3JsZCB4LWF4aXNcblxuXHRcdHZhciBtMSA9IG5ldyBNYXRyaXg0KCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gcm90YXRlWCggYW5nbGUgKSB7XG5cblx0XHRcdG0xLm1ha2VSb3RhdGlvblgoIGFuZ2xlICk7XG5cblx0XHRcdHRoaXMuYXBwbHlNYXRyaXgoIG0xICk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0cm90YXRlWTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gcm90YXRlIGdlb21ldHJ5IGFyb3VuZCB3b3JsZCB5LWF4aXNcblxuXHRcdHZhciBtMSA9IG5ldyBNYXRyaXg0KCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gcm90YXRlWSggYW5nbGUgKSB7XG5cblx0XHRcdG0xLm1ha2VSb3RhdGlvblkoIGFuZ2xlICk7XG5cblx0XHRcdHRoaXMuYXBwbHlNYXRyaXgoIG0xICk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0cm90YXRlWjogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gcm90YXRlIGdlb21ldHJ5IGFyb3VuZCB3b3JsZCB6LWF4aXNcblxuXHRcdHZhciBtMSA9IG5ldyBNYXRyaXg0KCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gcm90YXRlWiggYW5nbGUgKSB7XG5cblx0XHRcdG0xLm1ha2VSb3RhdGlvblooIGFuZ2xlICk7XG5cblx0XHRcdHRoaXMuYXBwbHlNYXRyaXgoIG0xICk7XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0dHJhbnNsYXRlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyB0cmFuc2xhdGUgZ2VvbWV0cnlcblxuXHRcdHZhciBtMSA9IG5ldyBNYXRyaXg0KCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gdHJhbnNsYXRlKCB4LCB5LCB6ICkge1xuXG5cdFx0XHRtMS5tYWtlVHJhbnNsYXRpb24oIHgsIHksIHogKTtcblxuXHRcdFx0dGhpcy5hcHBseU1hdHJpeCggbTEgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRzY2FsZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gc2NhbGUgZ2VvbWV0cnlcblxuXHRcdHZhciBtMSA9IG5ldyBNYXRyaXg0KCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gc2NhbGUoIHgsIHksIHogKSB7XG5cblx0XHRcdG0xLm1ha2VTY2FsZSggeCwgeSwgeiApO1xuXG5cdFx0XHR0aGlzLmFwcGx5TWF0cml4KCBtMSApO1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGxvb2tBdDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIG9iaiA9IG5ldyBPYmplY3QzRCgpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGxvb2tBdCggdmVjdG9yICkge1xuXG5cdFx0XHRvYmoubG9va0F0KCB2ZWN0b3IgKTtcblxuXHRcdFx0b2JqLnVwZGF0ZU1hdHJpeCgpO1xuXG5cdFx0XHR0aGlzLmFwcGx5TWF0cml4KCBvYmoubWF0cml4ICk7XG5cblx0XHR9O1xuXG5cdH0oKSxcblxuXHRjZW50ZXI6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuY29tcHV0ZUJvdW5kaW5nQm94KCk7XG5cblx0XHR2YXIgb2Zmc2V0ID0gdGhpcy5ib3VuZGluZ0JveC5nZXRDZW50ZXIoKS5uZWdhdGUoKTtcblxuXHRcdHRoaXMudHJhbnNsYXRlKCBvZmZzZXQueCwgb2Zmc2V0LnksIG9mZnNldC56ICk7XG5cblx0XHRyZXR1cm4gb2Zmc2V0O1xuXG5cdH0sXG5cblx0c2V0RnJvbU9iamVjdDogZnVuY3Rpb24gKCBvYmplY3QgKSB7XG5cblx0XHQvLyBjb25zb2xlLmxvZyggJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5LnNldEZyb21PYmplY3QoKS4gQ29udmVydGluZycsIG9iamVjdCwgdGhpcyApO1xuXG5cdFx0dmFyIGdlb21ldHJ5ID0gb2JqZWN0Lmdlb21ldHJ5O1xuXG5cdFx0aWYgKCBvYmplY3QuaXNQb2ludHMgfHwgb2JqZWN0LmlzTGluZSApIHtcblxuXHRcdFx0dmFyIHBvc2l0aW9ucyA9IG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBnZW9tZXRyeS52ZXJ0aWNlcy5sZW5ndGggKiAzLCAzICk7XG5cdFx0XHR2YXIgY29sb3JzID0gbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIGdlb21ldHJ5LmNvbG9ycy5sZW5ndGggKiAzLCAzICk7XG5cblx0XHRcdHRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBwb3NpdGlvbnMuY29weVZlY3RvcjNzQXJyYXkoIGdlb21ldHJ5LnZlcnRpY2VzICkgKTtcblx0XHRcdHRoaXMuYWRkQXR0cmlidXRlKCAnY29sb3InLCBjb2xvcnMuY29weUNvbG9yc0FycmF5KCBnZW9tZXRyeS5jb2xvcnMgKSApO1xuXG5cdFx0XHRpZiAoIGdlb21ldHJ5LmxpbmVEaXN0YW5jZXMgJiYgZ2VvbWV0cnkubGluZURpc3RhbmNlcy5sZW5ndGggPT09IGdlb21ldHJ5LnZlcnRpY2VzLmxlbmd0aCApIHtcblxuXHRcdFx0XHR2YXIgbGluZURpc3RhbmNlcyA9IG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBnZW9tZXRyeS5saW5lRGlzdGFuY2VzLmxlbmd0aCwgMSApO1xuXG5cdFx0XHRcdHRoaXMuYWRkQXR0cmlidXRlKCAnbGluZURpc3RhbmNlJywgbGluZURpc3RhbmNlcy5jb3B5QXJyYXkoIGdlb21ldHJ5LmxpbmVEaXN0YW5jZXMgKSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgIT09IG51bGwgKSB7XG5cblx0XHRcdFx0dGhpcy5ib3VuZGluZ1NwaGVyZSA9IGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlLmNsb25lKCk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBnZW9tZXRyeS5ib3VuZGluZ0JveCAhPT0gbnVsbCApIHtcblxuXHRcdFx0XHR0aGlzLmJvdW5kaW5nQm94ID0gZ2VvbWV0cnkuYm91bmRpbmdCb3guY2xvbmUoKTtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIGlmICggb2JqZWN0LmlzTWVzaCApIHtcblxuXHRcdFx0aWYgKCBnZW9tZXRyeSAmJiBnZW9tZXRyeS5pc0dlb21ldHJ5ICkge1xuXG5cdFx0XHRcdHRoaXMuZnJvbUdlb21ldHJ5KCBnZW9tZXRyeSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHVwZGF0ZUZyb21PYmplY3Q6IGZ1bmN0aW9uICggb2JqZWN0ICkge1xuXG5cdFx0dmFyIGdlb21ldHJ5ID0gb2JqZWN0Lmdlb21ldHJ5O1xuXG5cdFx0aWYgKCBvYmplY3QuaXNNZXNoICkge1xuXG5cdFx0XHR2YXIgZGlyZWN0ID0gZ2VvbWV0cnkuX19kaXJlY3RHZW9tZXRyeTtcblxuXHRcdFx0aWYgKCBnZW9tZXRyeS5lbGVtZW50c05lZWRVcGRhdGUgPT09IHRydWUgKSB7XG5cblx0XHRcdFx0ZGlyZWN0ID0gdW5kZWZpbmVkO1xuXHRcdFx0XHRnZW9tZXRyeS5lbGVtZW50c05lZWRVcGRhdGUgPSBmYWxzZTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGRpcmVjdCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHJldHVybiB0aGlzLmZyb21HZW9tZXRyeSggZ2VvbWV0cnkgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRkaXJlY3QudmVydGljZXNOZWVkVXBkYXRlID0gZ2VvbWV0cnkudmVydGljZXNOZWVkVXBkYXRlO1xuXHRcdFx0ZGlyZWN0Lm5vcm1hbHNOZWVkVXBkYXRlID0gZ2VvbWV0cnkubm9ybWFsc05lZWRVcGRhdGU7XG5cdFx0XHRkaXJlY3QuY29sb3JzTmVlZFVwZGF0ZSA9IGdlb21ldHJ5LmNvbG9yc05lZWRVcGRhdGU7XG5cdFx0XHRkaXJlY3QudXZzTmVlZFVwZGF0ZSA9IGdlb21ldHJ5LnV2c05lZWRVcGRhdGU7XG5cdFx0XHRkaXJlY3QuZ3JvdXBzTmVlZFVwZGF0ZSA9IGdlb21ldHJ5Lmdyb3Vwc05lZWRVcGRhdGU7XG5cblx0XHRcdGdlb21ldHJ5LnZlcnRpY2VzTmVlZFVwZGF0ZSA9IGZhbHNlO1xuXHRcdFx0Z2VvbWV0cnkubm9ybWFsc05lZWRVcGRhdGUgPSBmYWxzZTtcblx0XHRcdGdlb21ldHJ5LmNvbG9yc05lZWRVcGRhdGUgPSBmYWxzZTtcblx0XHRcdGdlb21ldHJ5LnV2c05lZWRVcGRhdGUgPSBmYWxzZTtcblx0XHRcdGdlb21ldHJ5Lmdyb3Vwc05lZWRVcGRhdGUgPSBmYWxzZTtcblxuXHRcdFx0Z2VvbWV0cnkgPSBkaXJlY3Q7XG5cblx0XHR9XG5cblx0XHR2YXIgYXR0cmlidXRlO1xuXG5cdFx0aWYgKCBnZW9tZXRyeS52ZXJ0aWNlc05lZWRVcGRhdGUgPT09IHRydWUgKSB7XG5cblx0XHRcdGF0dHJpYnV0ZSA9IHRoaXMuYXR0cmlidXRlcy5wb3NpdGlvbjtcblxuXHRcdFx0aWYgKCBhdHRyaWJ1dGUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRhdHRyaWJ1dGUuY29weVZlY3RvcjNzQXJyYXkoIGdlb21ldHJ5LnZlcnRpY2VzICk7XG5cdFx0XHRcdGF0dHJpYnV0ZS5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdH1cblxuXHRcdFx0Z2VvbWV0cnkudmVydGljZXNOZWVkVXBkYXRlID0gZmFsc2U7XG5cblx0XHR9XG5cblx0XHRpZiAoIGdlb21ldHJ5Lm5vcm1hbHNOZWVkVXBkYXRlID09PSB0cnVlICkge1xuXG5cdFx0XHRhdHRyaWJ1dGUgPSB0aGlzLmF0dHJpYnV0ZXMubm9ybWFsO1xuXG5cdFx0XHRpZiAoIGF0dHJpYnV0ZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGF0dHJpYnV0ZS5jb3B5VmVjdG9yM3NBcnJheSggZ2VvbWV0cnkubm9ybWFscyApO1xuXHRcdFx0XHRhdHRyaWJ1dGUubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHR9XG5cblx0XHRcdGdlb21ldHJ5Lm5vcm1hbHNOZWVkVXBkYXRlID0gZmFsc2U7XG5cblx0XHR9XG5cblx0XHRpZiAoIGdlb21ldHJ5LmNvbG9yc05lZWRVcGRhdGUgPT09IHRydWUgKSB7XG5cblx0XHRcdGF0dHJpYnV0ZSA9IHRoaXMuYXR0cmlidXRlcy5jb2xvcjtcblxuXHRcdFx0aWYgKCBhdHRyaWJ1dGUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRhdHRyaWJ1dGUuY29weUNvbG9yc0FycmF5KCBnZW9tZXRyeS5jb2xvcnMgKTtcblx0XHRcdFx0YXR0cmlidXRlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0fVxuXG5cdFx0XHRnZW9tZXRyeS5jb2xvcnNOZWVkVXBkYXRlID0gZmFsc2U7XG5cblx0XHR9XG5cblx0XHRpZiAoIGdlb21ldHJ5LnV2c05lZWRVcGRhdGUgKSB7XG5cblx0XHRcdGF0dHJpYnV0ZSA9IHRoaXMuYXR0cmlidXRlcy51djtcblxuXHRcdFx0aWYgKCBhdHRyaWJ1dGUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRhdHRyaWJ1dGUuY29weVZlY3RvcjJzQXJyYXkoIGdlb21ldHJ5LnV2cyApO1xuXHRcdFx0XHRhdHRyaWJ1dGUubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHR9XG5cblx0XHRcdGdlb21ldHJ5LnV2c05lZWRVcGRhdGUgPSBmYWxzZTtcblxuXHRcdH1cblxuXHRcdGlmICggZ2VvbWV0cnkubGluZURpc3RhbmNlc05lZWRVcGRhdGUgKSB7XG5cblx0XHRcdGF0dHJpYnV0ZSA9IHRoaXMuYXR0cmlidXRlcy5saW5lRGlzdGFuY2U7XG5cblx0XHRcdGlmICggYXR0cmlidXRlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0YXR0cmlidXRlLmNvcHlBcnJheSggZ2VvbWV0cnkubGluZURpc3RhbmNlcyApO1xuXHRcdFx0XHRhdHRyaWJ1dGUubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHR9XG5cblx0XHRcdGdlb21ldHJ5LmxpbmVEaXN0YW5jZXNOZWVkVXBkYXRlID0gZmFsc2U7XG5cblx0XHR9XG5cblx0XHRpZiAoIGdlb21ldHJ5Lmdyb3Vwc05lZWRVcGRhdGUgKSB7XG5cblx0XHRcdGdlb21ldHJ5LmNvbXB1dGVHcm91cHMoIG9iamVjdC5nZW9tZXRyeSApO1xuXHRcdFx0dGhpcy5ncm91cHMgPSBnZW9tZXRyeS5ncm91cHM7XG5cblx0XHRcdGdlb21ldHJ5Lmdyb3Vwc05lZWRVcGRhdGUgPSBmYWxzZTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZnJvbUdlb21ldHJ5OiBmdW5jdGlvbiAoIGdlb21ldHJ5ICkge1xuXG5cdFx0Z2VvbWV0cnkuX19kaXJlY3RHZW9tZXRyeSA9IG5ldyBEaXJlY3RHZW9tZXRyeSgpLmZyb21HZW9tZXRyeSggZ2VvbWV0cnkgKTtcblxuXHRcdHJldHVybiB0aGlzLmZyb21EaXJlY3RHZW9tZXRyeSggZ2VvbWV0cnkuX19kaXJlY3RHZW9tZXRyeSApO1xuXG5cdH0sXG5cblx0ZnJvbURpcmVjdEdlb21ldHJ5OiBmdW5jdGlvbiAoIGdlb21ldHJ5ICkge1xuXG5cdFx0dmFyIHBvc2l0aW9ucyA9IG5ldyBGbG9hdDMyQXJyYXkoIGdlb21ldHJ5LnZlcnRpY2VzLmxlbmd0aCAqIDMgKTtcblx0XHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25zLCAzICkuY29weVZlY3RvcjNzQXJyYXkoIGdlb21ldHJ5LnZlcnRpY2VzICkgKTtcblxuXHRcdGlmICggZ2VvbWV0cnkubm9ybWFscy5sZW5ndGggPiAwICkge1xuXG5cdFx0XHR2YXIgbm9ybWFscyA9IG5ldyBGbG9hdDMyQXJyYXkoIGdlb21ldHJ5Lm5vcm1hbHMubGVuZ3RoICogMyApO1xuXHRcdFx0dGhpcy5hZGRBdHRyaWJ1dGUoICdub3JtYWwnLCBuZXcgQnVmZmVyQXR0cmlidXRlKCBub3JtYWxzLCAzICkuY29weVZlY3RvcjNzQXJyYXkoIGdlb21ldHJ5Lm5vcm1hbHMgKSApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBnZW9tZXRyeS5jb2xvcnMubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0dmFyIGNvbG9ycyA9IG5ldyBGbG9hdDMyQXJyYXkoIGdlb21ldHJ5LmNvbG9ycy5sZW5ndGggKiAzICk7XG5cdFx0XHR0aGlzLmFkZEF0dHJpYnV0ZSggJ2NvbG9yJywgbmV3IEJ1ZmZlckF0dHJpYnV0ZSggY29sb3JzLCAzICkuY29weUNvbG9yc0FycmF5KCBnZW9tZXRyeS5jb2xvcnMgKSApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBnZW9tZXRyeS51dnMubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0dmFyIHV2cyA9IG5ldyBGbG9hdDMyQXJyYXkoIGdlb21ldHJ5LnV2cy5sZW5ndGggKiAyICk7XG5cdFx0XHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3V2JywgbmV3IEJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAyICkuY29weVZlY3RvcjJzQXJyYXkoIGdlb21ldHJ5LnV2cyApICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIGdlb21ldHJ5LnV2czIubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0dmFyIHV2czIgPSBuZXcgRmxvYXQzMkFycmF5KCBnZW9tZXRyeS51dnMyLmxlbmd0aCAqIDIgKTtcblx0XHRcdHRoaXMuYWRkQXR0cmlidXRlKCAndXYyJywgbmV3IEJ1ZmZlckF0dHJpYnV0ZSggdXZzMiwgMiApLmNvcHlWZWN0b3Iyc0FycmF5KCBnZW9tZXRyeS51dnMyICkgKTtcblxuXHRcdH1cblxuXHRcdGlmICggZ2VvbWV0cnkuaW5kaWNlcy5sZW5ndGggPiAwICkge1xuXG5cdFx0XHR2YXIgVHlwZUFycmF5ID0gYXJyYXlNYXgoIGdlb21ldHJ5LmluZGljZXMgKSA+IDY1NTM1ID8gVWludDMyQXJyYXkgOiBVaW50MTZBcnJheTtcblx0XHRcdHZhciBpbmRpY2VzID0gbmV3IFR5cGVBcnJheSggZ2VvbWV0cnkuaW5kaWNlcy5sZW5ndGggKiAzICk7XG5cdFx0XHR0aGlzLnNldEluZGV4KCBuZXcgQnVmZmVyQXR0cmlidXRlKCBpbmRpY2VzLCAxICkuY29weUluZGljZXNBcnJheSggZ2VvbWV0cnkuaW5kaWNlcyApICk7XG5cblx0XHR9XG5cblx0XHQvLyBncm91cHNcblxuXHRcdHRoaXMuZ3JvdXBzID0gZ2VvbWV0cnkuZ3JvdXBzO1xuXG5cdFx0Ly8gbW9ycGhzXG5cblx0XHRmb3IgKCB2YXIgbmFtZSBpbiBnZW9tZXRyeS5tb3JwaFRhcmdldHMgKSB7XG5cblx0XHRcdHZhciBhcnJheSA9IFtdO1xuXHRcdFx0dmFyIG1vcnBoVGFyZ2V0cyA9IGdlb21ldHJ5Lm1vcnBoVGFyZ2V0c1sgbmFtZSBdO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBtb3JwaFRhcmdldHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHR2YXIgbW9ycGhUYXJnZXQgPSBtb3JwaFRhcmdldHNbIGkgXTtcblxuXHRcdFx0XHR2YXIgYXR0cmlidXRlID0gbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIG1vcnBoVGFyZ2V0Lmxlbmd0aCAqIDMsIDMgKTtcblxuXHRcdFx0XHRhcnJheS5wdXNoKCBhdHRyaWJ1dGUuY29weVZlY3RvcjNzQXJyYXkoIG1vcnBoVGFyZ2V0ICkgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLm1vcnBoQXR0cmlidXRlc1sgbmFtZSBdID0gYXJyYXk7XG5cblx0XHR9XG5cblx0XHQvLyBza2lubmluZ1xuXG5cdFx0aWYgKCBnZW9tZXRyeS5za2luSW5kaWNlcy5sZW5ndGggPiAwICkge1xuXG5cdFx0XHR2YXIgc2tpbkluZGljZXMgPSBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggZ2VvbWV0cnkuc2tpbkluZGljZXMubGVuZ3RoICogNCwgNCApO1xuXHRcdFx0dGhpcy5hZGRBdHRyaWJ1dGUoICdza2luSW5kZXgnLCBza2luSW5kaWNlcy5jb3B5VmVjdG9yNHNBcnJheSggZ2VvbWV0cnkuc2tpbkluZGljZXMgKSApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBnZW9tZXRyeS5za2luV2VpZ2h0cy5sZW5ndGggPiAwICkge1xuXG5cdFx0XHR2YXIgc2tpbldlaWdodHMgPSBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggZ2VvbWV0cnkuc2tpbldlaWdodHMubGVuZ3RoICogNCwgNCApO1xuXHRcdFx0dGhpcy5hZGRBdHRyaWJ1dGUoICdza2luV2VpZ2h0Jywgc2tpbldlaWdodHMuY29weVZlY3RvcjRzQXJyYXkoIGdlb21ldHJ5LnNraW5XZWlnaHRzICkgKTtcblxuXHRcdH1cblxuXHRcdC8vXG5cblx0XHRpZiAoIGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlICE9PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLmJvdW5kaW5nU3BoZXJlID0gZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUuY2xvbmUoKTtcblxuXHRcdH1cblxuXHRcdGlmICggZ2VvbWV0cnkuYm91bmRpbmdCb3ggIT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuYm91bmRpbmdCb3ggPSBnZW9tZXRyeS5ib3VuZGluZ0JveC5jbG9uZSgpO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjb21wdXRlQm91bmRpbmdCb3g6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGlmICggdGhpcy5ib3VuZGluZ0JveCA9PT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5ib3VuZGluZ0JveCA9IG5ldyBCb3gzKCk7XG5cblx0XHR9XG5cblx0XHR2YXIgcG9zaXRpb24gPSB0aGlzLmF0dHJpYnV0ZXMucG9zaXRpb247XG5cblx0XHRpZiAoIHBvc2l0aW9uICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHRoaXMuYm91bmRpbmdCb3guc2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb24gKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHRoaXMuYm91bmRpbmdCb3gubWFrZUVtcHR5KCk7XG5cblx0XHR9XG5cblx0XHRpZiAoIGlzTmFOKCB0aGlzLmJvdW5kaW5nQm94Lm1pbi54ICkgfHwgaXNOYU4oIHRoaXMuYm91bmRpbmdCb3gubWluLnkgKSB8fCBpc05hTiggdGhpcy5ib3VuZGluZ0JveC5taW4ueiApICkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nQm94OiBDb21wdXRlZCBtaW4vbWF4IGhhdmUgTmFOIHZhbHVlcy4gVGhlIFwicG9zaXRpb25cIiBhdHRyaWJ1dGUgaXMgbGlrZWx5IHRvIGhhdmUgTmFOIHZhbHVlcy4nLCB0aGlzICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHRjb21wdXRlQm91bmRpbmdTcGhlcmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBib3ggPSBuZXcgQm94MygpO1xuXHRcdHZhciB2ZWN0b3IgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIGNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpIHtcblxuXHRcdFx0aWYgKCB0aGlzLmJvdW5kaW5nU3BoZXJlID09PSBudWxsICkge1xuXG5cdFx0XHRcdHRoaXMuYm91bmRpbmdTcGhlcmUgPSBuZXcgU3BoZXJlKCk7XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIHBvc2l0aW9uID0gdGhpcy5hdHRyaWJ1dGVzLnBvc2l0aW9uO1xuXG5cdFx0XHRpZiAoIHBvc2l0aW9uICkge1xuXG5cdFx0XHRcdHZhciBjZW50ZXIgPSB0aGlzLmJvdW5kaW5nU3BoZXJlLmNlbnRlcjtcblxuXHRcdFx0XHRib3guc2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb24gKTtcblx0XHRcdFx0Ym94LmdldENlbnRlciggY2VudGVyICk7XG5cblx0XHRcdFx0Ly8gaG9waW5nIHRvIGZpbmQgYSBib3VuZGluZ1NwaGVyZSB3aXRoIGEgcmFkaXVzIHNtYWxsZXIgdGhhbiB0aGVcblx0XHRcdFx0Ly8gYm91bmRpbmdTcGhlcmUgb2YgdGhlIGJvdW5kaW5nQm94OiBzcXJ0KDMpIHNtYWxsZXIgaW4gdGhlIGJlc3QgY2FzZVxuXG5cdFx0XHRcdHZhciBtYXhSYWRpdXNTcSA9IDA7XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IHBvc2l0aW9uLmNvdW50OyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHR2ZWN0b3IueCA9IHBvc2l0aW9uLmdldFgoIGkgKTtcblx0XHRcdFx0XHR2ZWN0b3IueSA9IHBvc2l0aW9uLmdldFkoIGkgKTtcblx0XHRcdFx0XHR2ZWN0b3IueiA9IHBvc2l0aW9uLmdldFooIGkgKTtcblx0XHRcdFx0XHRtYXhSYWRpdXNTcSA9IE1hdGgubWF4KCBtYXhSYWRpdXNTcSwgY2VudGVyLmRpc3RhbmNlVG9TcXVhcmVkKCB2ZWN0b3IgKSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0aGlzLmJvdW5kaW5nU3BoZXJlLnJhZGl1cyA9IE1hdGguc3FydCggbWF4UmFkaXVzU3EgKTtcblxuXHRcdFx0XHRpZiAoIGlzTmFOKCB0aGlzLmJvdW5kaW5nU3BoZXJlLnJhZGl1cyApICkge1xuXG5cdFx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpOiBDb21wdXRlZCByYWRpdXMgaXMgTmFOLiBUaGUgXCJwb3NpdGlvblwiIGF0dHJpYnV0ZSBpcyBsaWtlbHkgdG8gaGF2ZSBOYU4gdmFsdWVzLicsIHRoaXMgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH07XG5cblx0fSgpLFxuXG5cdGNvbXB1dGVGYWNlTm9ybWFsczogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcblxuXHR9LFxuXG5cdGNvbXB1dGVWZXJ0ZXhOb3JtYWxzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgaW5kZXggPSB0aGlzLmluZGV4O1xuXHRcdHZhciBhdHRyaWJ1dGVzID0gdGhpcy5hdHRyaWJ1dGVzO1xuXHRcdHZhciBncm91cHMgPSB0aGlzLmdyb3VwcztcblxuXHRcdGlmICggYXR0cmlidXRlcy5wb3NpdGlvbiApIHtcblxuXHRcdFx0dmFyIHBvc2l0aW9ucyA9IGF0dHJpYnV0ZXMucG9zaXRpb24uYXJyYXk7XG5cblx0XHRcdGlmICggYXR0cmlidXRlcy5ub3JtYWwgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHR0aGlzLmFkZEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBCdWZmZXJBdHRyaWJ1dGUoIG5ldyBGbG9hdDMyQXJyYXkoIHBvc2l0aW9ucy5sZW5ndGggKSwgMyApICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Ly8gcmVzZXQgZXhpc3Rpbmcgbm9ybWFscyB0byB6ZXJvXG5cblx0XHRcdFx0dmFyIGFycmF5ID0gYXR0cmlidXRlcy5ub3JtYWwuYXJyYXk7XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IGFycmF5Lmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0YXJyYXlbIGkgXSA9IDA7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdHZhciBub3JtYWxzID0gYXR0cmlidXRlcy5ub3JtYWwuYXJyYXk7XG5cblx0XHRcdHZhciB2QSwgdkIsIHZDO1xuXHRcdFx0dmFyIHBBID0gbmV3IFZlY3RvcjMoKSwgcEIgPSBuZXcgVmVjdG9yMygpLCBwQyA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0XHR2YXIgY2IgPSBuZXcgVmVjdG9yMygpLCBhYiA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRcdC8vIGluZGV4ZWQgZWxlbWVudHNcblxuXHRcdFx0aWYgKCBpbmRleCApIHtcblxuXHRcdFx0XHR2YXIgaW5kaWNlcyA9IGluZGV4LmFycmF5O1xuXG5cdFx0XHRcdGlmICggZ3JvdXBzLmxlbmd0aCA9PT0gMCApIHtcblxuXHRcdFx0XHRcdHRoaXMuYWRkR3JvdXAoIDAsIGluZGljZXMubGVuZ3RoICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGZvciAoIHZhciBqID0gMCwgamwgPSBncm91cHMubGVuZ3RoOyBqIDwgamw7ICsrIGogKSB7XG5cblx0XHRcdFx0XHR2YXIgZ3JvdXAgPSBncm91cHNbIGogXTtcblxuXHRcdFx0XHRcdHZhciBzdGFydCA9IGdyb3VwLnN0YXJ0O1xuXHRcdFx0XHRcdHZhciBjb3VudCA9IGdyb3VwLmNvdW50O1xuXG5cdFx0XHRcdFx0Zm9yICggdmFyIGkgPSBzdGFydCwgaWwgPSBzdGFydCArIGNvdW50OyBpIDwgaWw7IGkgKz0gMyApIHtcblxuXHRcdFx0XHRcdFx0dkEgPSBpbmRpY2VzWyBpICsgMCBdICogMztcblx0XHRcdFx0XHRcdHZCID0gaW5kaWNlc1sgaSArIDEgXSAqIDM7XG5cdFx0XHRcdFx0XHR2QyA9IGluZGljZXNbIGkgKyAyIF0gKiAzO1xuXG5cdFx0XHRcdFx0XHRwQS5mcm9tQXJyYXkoIHBvc2l0aW9ucywgdkEgKTtcblx0XHRcdFx0XHRcdHBCLmZyb21BcnJheSggcG9zaXRpb25zLCB2QiApO1xuXHRcdFx0XHRcdFx0cEMuZnJvbUFycmF5KCBwb3NpdGlvbnMsIHZDICk7XG5cblx0XHRcdFx0XHRcdGNiLnN1YlZlY3RvcnMoIHBDLCBwQiApO1xuXHRcdFx0XHRcdFx0YWIuc3ViVmVjdG9ycyggcEEsIHBCICk7XG5cdFx0XHRcdFx0XHRjYi5jcm9zcyggYWIgKTtcblxuXHRcdFx0XHRcdFx0bm9ybWFsc1sgdkEgXSArPSBjYi54O1xuXHRcdFx0XHRcdFx0bm9ybWFsc1sgdkEgKyAxIF0gKz0gY2IueTtcblx0XHRcdFx0XHRcdG5vcm1hbHNbIHZBICsgMiBdICs9IGNiLno7XG5cblx0XHRcdFx0XHRcdG5vcm1hbHNbIHZCIF0gKz0gY2IueDtcblx0XHRcdFx0XHRcdG5vcm1hbHNbIHZCICsgMSBdICs9IGNiLnk7XG5cdFx0XHRcdFx0XHRub3JtYWxzWyB2QiArIDIgXSArPSBjYi56O1xuXG5cdFx0XHRcdFx0XHRub3JtYWxzWyB2QyBdICs9IGNiLng7XG5cdFx0XHRcdFx0XHRub3JtYWxzWyB2QyArIDEgXSArPSBjYi55O1xuXHRcdFx0XHRcdFx0bm9ybWFsc1sgdkMgKyAyIF0gKz0gY2IuejtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Ly8gbm9uLWluZGV4ZWQgZWxlbWVudHMgKHVuY29ubmVjdGVkIHRyaWFuZ2xlIHNvdXApXG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IHBvc2l0aW9ucy5sZW5ndGg7IGkgPCBpbDsgaSArPSA5ICkge1xuXG5cdFx0XHRcdFx0cEEuZnJvbUFycmF5KCBwb3NpdGlvbnMsIGkgKTtcblx0XHRcdFx0XHRwQi5mcm9tQXJyYXkoIHBvc2l0aW9ucywgaSArIDMgKTtcblx0XHRcdFx0XHRwQy5mcm9tQXJyYXkoIHBvc2l0aW9ucywgaSArIDYgKTtcblxuXHRcdFx0XHRcdGNiLnN1YlZlY3RvcnMoIHBDLCBwQiApO1xuXHRcdFx0XHRcdGFiLnN1YlZlY3RvcnMoIHBBLCBwQiApO1xuXHRcdFx0XHRcdGNiLmNyb3NzKCBhYiApO1xuXG5cdFx0XHRcdFx0bm9ybWFsc1sgaSBdID0gY2IueDtcblx0XHRcdFx0XHRub3JtYWxzWyBpICsgMSBdID0gY2IueTtcblx0XHRcdFx0XHRub3JtYWxzWyBpICsgMiBdID0gY2IuejtcblxuXHRcdFx0XHRcdG5vcm1hbHNbIGkgKyAzIF0gPSBjYi54O1xuXHRcdFx0XHRcdG5vcm1hbHNbIGkgKyA0IF0gPSBjYi55O1xuXHRcdFx0XHRcdG5vcm1hbHNbIGkgKyA1IF0gPSBjYi56O1xuXG5cdFx0XHRcdFx0bm9ybWFsc1sgaSArIDYgXSA9IGNiLng7XG5cdFx0XHRcdFx0bm9ybWFsc1sgaSArIDcgXSA9IGNiLnk7XG5cdFx0XHRcdFx0bm9ybWFsc1sgaSArIDggXSA9IGNiLno7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMubm9ybWFsaXplTm9ybWFscygpO1xuXG5cdFx0XHRhdHRyaWJ1dGVzLm5vcm1hbC5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHR9XG5cblx0fSxcblxuXHRtZXJnZTogZnVuY3Rpb24gKCBnZW9tZXRyeSwgb2Zmc2V0ICkge1xuXG5cdFx0aWYgKCAoIGdlb21ldHJ5ICYmIGdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgKSA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5CdWZmZXJHZW9tZXRyeS5tZXJnZSgpOiBnZW9tZXRyeSBub3QgYW4gaW5zdGFuY2Ugb2YgVEhSRUUuQnVmZmVyR2VvbWV0cnkuJywgZ2VvbWV0cnkgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdGlmICggb2Zmc2V0ID09PSB1bmRlZmluZWQgKSBvZmZzZXQgPSAwO1xuXG5cdFx0dmFyIGF0dHJpYnV0ZXMgPSB0aGlzLmF0dHJpYnV0ZXM7XG5cblx0XHRmb3IgKCB2YXIga2V5IGluIGF0dHJpYnV0ZXMgKSB7XG5cblx0XHRcdGlmICggZ2VvbWV0cnkuYXR0cmlidXRlc1sga2V5IF0gPT09IHVuZGVmaW5lZCApIGNvbnRpbnVlO1xuXG5cdFx0XHR2YXIgYXR0cmlidXRlMSA9IGF0dHJpYnV0ZXNbIGtleSBdO1xuXHRcdFx0dmFyIGF0dHJpYnV0ZUFycmF5MSA9IGF0dHJpYnV0ZTEuYXJyYXk7XG5cblx0XHRcdHZhciBhdHRyaWJ1dGUyID0gZ2VvbWV0cnkuYXR0cmlidXRlc1sga2V5IF07XG5cdFx0XHR2YXIgYXR0cmlidXRlQXJyYXkyID0gYXR0cmlidXRlMi5hcnJheTtcblxuXHRcdFx0dmFyIGF0dHJpYnV0ZVNpemUgPSBhdHRyaWJ1dGUyLml0ZW1TaXplO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGogPSBhdHRyaWJ1dGVTaXplICogb2Zmc2V0OyBpIDwgYXR0cmlidXRlQXJyYXkyLmxlbmd0aDsgaSArKywgaiArKyApIHtcblxuXHRcdFx0XHRhdHRyaWJ1dGVBcnJheTFbIGogXSA9IGF0dHJpYnV0ZUFycmF5MlsgaSBdO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG5vcm1hbGl6ZU5vcm1hbHM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBub3JtYWxzID0gdGhpcy5hdHRyaWJ1dGVzLm5vcm1hbDtcblxuXHRcdHZhciB4LCB5LCB6LCBuO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IG5vcm1hbHMuY291bnQ7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0eCA9IG5vcm1hbHMuZ2V0WCggaSApO1xuXHRcdFx0eSA9IG5vcm1hbHMuZ2V0WSggaSApO1xuXHRcdFx0eiA9IG5vcm1hbHMuZ2V0WiggaSApO1xuXG5cdFx0XHRuID0gMS4wIC8gTWF0aC5zcXJ0KCB4ICogeCArIHkgKiB5ICsgeiAqIHogKTtcblxuXHRcdFx0bm9ybWFscy5zZXRYWVooIGksIHggKiBuLCB5ICogbiwgeiAqIG4gKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdHRvTm9uSW5kZXhlZDogZnVuY3Rpb24gKCkge1xuXG5cdFx0aWYgKCB0aGlzLmluZGV4ID09PSBudWxsICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJHZW9tZXRyeS50b05vbkluZGV4ZWQoKTogR2VvbWV0cnkgaXMgYWxyZWFkeSBub24taW5kZXhlZC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH1cblxuXHRcdHZhciBnZW9tZXRyeTIgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcblxuXHRcdHZhciBpbmRpY2VzID0gdGhpcy5pbmRleC5hcnJheTtcblx0XHR2YXIgYXR0cmlidXRlcyA9IHRoaXMuYXR0cmlidXRlcztcblxuXHRcdGZvciAoIHZhciBuYW1lIGluIGF0dHJpYnV0ZXMgKSB7XG5cblx0XHRcdHZhciBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzWyBuYW1lIF07XG5cblx0XHRcdHZhciBhcnJheSA9IGF0dHJpYnV0ZS5hcnJheTtcblx0XHRcdHZhciBpdGVtU2l6ZSA9IGF0dHJpYnV0ZS5pdGVtU2l6ZTtcblxuXHRcdFx0dmFyIGFycmF5MiA9IG5ldyBhcnJheS5jb25zdHJ1Y3RvciggaW5kaWNlcy5sZW5ndGggKiBpdGVtU2l6ZSApO1xuXG5cdFx0XHR2YXIgaW5kZXggPSAwLCBpbmRleDIgPSAwO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBpbmRpY2VzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0aW5kZXggPSBpbmRpY2VzWyBpIF0gKiBpdGVtU2l6ZTtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaiA9IDA7IGogPCBpdGVtU2l6ZTsgaiArKyApIHtcblxuXHRcdFx0XHRcdGFycmF5MlsgaW5kZXgyICsrIF0gPSBhcnJheVsgaW5kZXggKysgXTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0Z2VvbWV0cnkyLmFkZEF0dHJpYnV0ZSggbmFtZSwgbmV3IEJ1ZmZlckF0dHJpYnV0ZSggYXJyYXkyLCBpdGVtU2l6ZSApICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gZ2VvbWV0cnkyO1xuXG5cdH0sXG5cblx0dG9KU09OOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgZGF0YSA9IHtcblx0XHRcdG1ldGFkYXRhOiB7XG5cdFx0XHRcdHZlcnNpb246IDQuNSxcblx0XHRcdFx0dHlwZTogJ0J1ZmZlckdlb21ldHJ5Jyxcblx0XHRcdFx0Z2VuZXJhdG9yOiAnQnVmZmVyR2VvbWV0cnkudG9KU09OJ1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHQvLyBzdGFuZGFyZCBCdWZmZXJHZW9tZXRyeSBzZXJpYWxpemF0aW9uXG5cblx0XHRkYXRhLnV1aWQgPSB0aGlzLnV1aWQ7XG5cdFx0ZGF0YS50eXBlID0gdGhpcy50eXBlO1xuXHRcdGlmICggdGhpcy5uYW1lICE9PSAnJyApIGRhdGEubmFtZSA9IHRoaXMubmFtZTtcblxuXHRcdGlmICggdGhpcy5wYXJhbWV0ZXJzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHZhciBwYXJhbWV0ZXJzID0gdGhpcy5wYXJhbWV0ZXJzO1xuXG5cdFx0XHRmb3IgKCB2YXIga2V5IGluIHBhcmFtZXRlcnMgKSB7XG5cblx0XHRcdFx0aWYgKCBwYXJhbWV0ZXJzWyBrZXkgXSAhPT0gdW5kZWZpbmVkICkgZGF0YVsga2V5IF0gPSBwYXJhbWV0ZXJzWyBrZXkgXTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZGF0YTtcblxuXHRcdH1cblxuXHRcdGRhdGEuZGF0YSA9IHsgYXR0cmlidXRlczoge30gfTtcblxuXHRcdHZhciBpbmRleCA9IHRoaXMuaW5kZXg7XG5cblx0XHRpZiAoIGluZGV4ICE9PSBudWxsICkge1xuXG5cdFx0XHR2YXIgYXJyYXkgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCggaW5kZXguYXJyYXkgKTtcblxuXHRcdFx0ZGF0YS5kYXRhLmluZGV4ID0ge1xuXHRcdFx0XHR0eXBlOiBpbmRleC5hcnJheS5jb25zdHJ1Y3Rvci5uYW1lLFxuXHRcdFx0XHRhcnJheTogYXJyYXlcblx0XHRcdH07XG5cblx0XHR9XG5cblx0XHR2YXIgYXR0cmlidXRlcyA9IHRoaXMuYXR0cmlidXRlcztcblxuXHRcdGZvciAoIHZhciBrZXkgaW4gYXR0cmlidXRlcyApIHtcblxuXHRcdFx0dmFyIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXNbIGtleSBdO1xuXG5cdFx0XHR2YXIgYXJyYXkgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCggYXR0cmlidXRlLmFycmF5ICk7XG5cblx0XHRcdGRhdGEuZGF0YS5hdHRyaWJ1dGVzWyBrZXkgXSA9IHtcblx0XHRcdFx0aXRlbVNpemU6IGF0dHJpYnV0ZS5pdGVtU2l6ZSxcblx0XHRcdFx0dHlwZTogYXR0cmlidXRlLmFycmF5LmNvbnN0cnVjdG9yLm5hbWUsXG5cdFx0XHRcdGFycmF5OiBhcnJheSxcblx0XHRcdFx0bm9ybWFsaXplZDogYXR0cmlidXRlLm5vcm1hbGl6ZWRcblx0XHRcdH07XG5cblx0XHR9XG5cblx0XHR2YXIgZ3JvdXBzID0gdGhpcy5ncm91cHM7XG5cblx0XHRpZiAoIGdyb3Vwcy5sZW5ndGggPiAwICkge1xuXG5cdFx0XHRkYXRhLmRhdGEuZ3JvdXBzID0gSlNPTi5wYXJzZSggSlNPTi5zdHJpbmdpZnkoIGdyb3VwcyApICk7XG5cblx0XHR9XG5cblx0XHR2YXIgYm91bmRpbmdTcGhlcmUgPSB0aGlzLmJvdW5kaW5nU3BoZXJlO1xuXG5cdFx0aWYgKCBib3VuZGluZ1NwaGVyZSAhPT0gbnVsbCApIHtcblxuXHRcdFx0ZGF0YS5kYXRhLmJvdW5kaW5nU3BoZXJlID0ge1xuXHRcdFx0XHRjZW50ZXI6IGJvdW5kaW5nU3BoZXJlLmNlbnRlci50b0FycmF5KCksXG5cdFx0XHRcdHJhZGl1czogYm91bmRpbmdTcGhlcmUucmFkaXVzXG5cdFx0XHR9O1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGRhdGE7XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Lypcblx0XHQgLy8gSGFuZGxlIHByaW1pdGl2ZXNcblxuXHRcdCB2YXIgcGFyYW1ldGVycyA9IHRoaXMucGFyYW1ldGVycztcblxuXHRcdCBpZiAoIHBhcmFtZXRlcnMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdCB2YXIgdmFsdWVzID0gW107XG5cblx0XHQgZm9yICggdmFyIGtleSBpbiBwYXJhbWV0ZXJzICkge1xuXG5cdFx0IHZhbHVlcy5wdXNoKCBwYXJhbWV0ZXJzWyBrZXkgXSApO1xuXG5cdFx0IH1cblxuXHRcdCB2YXIgZ2VvbWV0cnkgPSBPYmplY3QuY3JlYXRlKCB0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZSApO1xuXHRcdCB0aGlzLmNvbnN0cnVjdG9yLmFwcGx5KCBnZW9tZXRyeSwgdmFsdWVzICk7XG5cdFx0IHJldHVybiBnZW9tZXRyeTtcblxuXHRcdCB9XG5cblx0XHQgcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xuXHRcdCAqL1xuXG5cdFx0cmV0dXJuIG5ldyBCdWZmZXJHZW9tZXRyeSgpLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0dmFyIG5hbWUsIGksIGw7XG5cblx0XHQvLyByZXNldFxuXG5cdFx0dGhpcy5pbmRleCA9IG51bGw7XG5cdFx0dGhpcy5hdHRyaWJ1dGVzID0ge307XG5cdFx0dGhpcy5tb3JwaEF0dHJpYnV0ZXMgPSB7fTtcblx0XHR0aGlzLmdyb3VwcyA9IFtdO1xuXHRcdHRoaXMuYm91bmRpbmdCb3ggPSBudWxsO1xuXHRcdHRoaXMuYm91bmRpbmdTcGhlcmUgPSBudWxsO1xuXG5cdFx0Ly8gbmFtZVxuXG5cdFx0dGhpcy5uYW1lID0gc291cmNlLm5hbWU7XG5cblx0XHQvLyBpbmRleFxuXG5cdFx0dmFyIGluZGV4ID0gc291cmNlLmluZGV4O1xuXG5cdFx0aWYgKCBpbmRleCAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5zZXRJbmRleCggaW5kZXguY2xvbmUoKSApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gYXR0cmlidXRlc1xuXG5cdFx0dmFyIGF0dHJpYnV0ZXMgPSBzb3VyY2UuYXR0cmlidXRlcztcblxuXHRcdGZvciAoIG5hbWUgaW4gYXR0cmlidXRlcyApIHtcblxuXHRcdFx0dmFyIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXNbIG5hbWUgXTtcblx0XHRcdHRoaXMuYWRkQXR0cmlidXRlKCBuYW1lLCBhdHRyaWJ1dGUuY2xvbmUoKSApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gbW9ycGggYXR0cmlidXRlc1xuXG5cdFx0dmFyIG1vcnBoQXR0cmlidXRlcyA9IHNvdXJjZS5tb3JwaEF0dHJpYnV0ZXM7XG5cblx0XHRmb3IgKCBuYW1lIGluIG1vcnBoQXR0cmlidXRlcyApIHtcblxuXHRcdFx0dmFyIGFycmF5ID0gW107XG5cdFx0XHR2YXIgbW9ycGhBdHRyaWJ1dGUgPSBtb3JwaEF0dHJpYnV0ZXNbIG5hbWUgXTsgLy8gbW9ycGhBdHRyaWJ1dGU6IGFycmF5IG9mIEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGVzXG5cblx0XHRcdGZvciAoIGkgPSAwLCBsID0gbW9ycGhBdHRyaWJ1dGUubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRhcnJheS5wdXNoKCBtb3JwaEF0dHJpYnV0ZVsgaSBdLmNsb25lKCkgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLm1vcnBoQXR0cmlidXRlc1sgbmFtZSBdID0gYXJyYXk7XG5cblx0XHR9XG5cblx0XHQvLyBncm91cHNcblxuXHRcdHZhciBncm91cHMgPSBzb3VyY2UuZ3JvdXBzO1xuXG5cdFx0Zm9yICggaSA9IDAsIGwgPSBncm91cHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGdyb3VwID0gZ3JvdXBzWyBpIF07XG5cdFx0XHR0aGlzLmFkZEdyb3VwKCBncm91cC5zdGFydCwgZ3JvdXAuY291bnQsIGdyb3VwLm1hdGVyaWFsSW5kZXggKTtcblxuXHRcdH1cblxuXHRcdC8vIGJvdW5kaW5nIGJveFxuXG5cdFx0dmFyIGJvdW5kaW5nQm94ID0gc291cmNlLmJvdW5kaW5nQm94O1xuXG5cdFx0aWYgKCBib3VuZGluZ0JveCAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5ib3VuZGluZ0JveCA9IGJvdW5kaW5nQm94LmNsb25lKCk7XG5cblx0XHR9XG5cblx0XHQvLyBib3VuZGluZyBzcGhlcmVcblxuXHRcdHZhciBib3VuZGluZ1NwaGVyZSA9IHNvdXJjZS5ib3VuZGluZ1NwaGVyZTtcblxuXHRcdGlmICggYm91bmRpbmdTcGhlcmUgIT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuYm91bmRpbmdTcGhlcmUgPSBib3VuZGluZ1NwaGVyZS5jbG9uZSgpO1xuXG5cdFx0fVxuXG5cdFx0Ly8gZHJhdyByYW5nZVxuXG5cdFx0dGhpcy5kcmF3UmFuZ2Uuc3RhcnQgPSBzb3VyY2UuZHJhd1JhbmdlLnN0YXJ0O1xuXHRcdHRoaXMuZHJhd1JhbmdlLmNvdW50ID0gc291cmNlLmRyYXdSYW5nZS5jb3VudDtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZGlzcG9zZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5kaXNwYXRjaEV2ZW50KCB7IHR5cGU6ICdkaXNwb3NlJyB9ICk7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKiBAYXV0aG9yIG1pa2FlbCBlbXRpbmdlciAvIGh0dHA6Ly9nb21vLnNlL1xuICogQGF1dGhvciBqb25vYnIxIC8gaHR0cDovL2pvbm9icjEuY29tL1xuICovXG5cbmZ1bmN0aW9uIE1lc2goIGdlb21ldHJ5LCBtYXRlcmlhbCApIHtcblxuXHRPYmplY3QzRC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ01lc2gnO1xuXG5cdHRoaXMuZ2VvbWV0cnkgPSBnZW9tZXRyeSAhPT0gdW5kZWZpbmVkID8gZ2VvbWV0cnkgOiBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcblx0dGhpcy5tYXRlcmlhbCA9IG1hdGVyaWFsICE9PSB1bmRlZmluZWQgPyBtYXRlcmlhbCA6IG5ldyBNZXNoQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogTWF0aC5yYW5kb20oKSAqIDB4ZmZmZmZmIH0gKTtcblxuXHR0aGlzLmRyYXdNb2RlID0gVHJpYW5nbGVzRHJhd01vZGU7XG5cblx0dGhpcy51cGRhdGVNb3JwaFRhcmdldHMoKTtcblxufVxuXG5NZXNoLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IE1lc2gsXG5cblx0aXNNZXNoOiB0cnVlLFxuXG5cdHNldERyYXdNb2RlOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5kcmF3TW9kZSA9IHZhbHVlO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHRPYmplY3QzRC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHRcdHRoaXMuZHJhd01vZGUgPSBzb3VyY2UuZHJhd01vZGU7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHVwZGF0ZU1vcnBoVGFyZ2V0czogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIG1vcnBoVGFyZ2V0cyA9IHRoaXMuZ2VvbWV0cnkubW9ycGhUYXJnZXRzO1xuXG5cdFx0aWYgKCBtb3JwaFRhcmdldHMgIT09IHVuZGVmaW5lZCAmJiBtb3JwaFRhcmdldHMubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0dGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXMgPSBbXTtcblx0XHRcdHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5ID0ge307XG5cblx0XHRcdGZvciAoIHZhciBtID0gMCwgbWwgPSBtb3JwaFRhcmdldHMubGVuZ3RoOyBtIDwgbWw7IG0gKysgKSB7XG5cblx0XHRcdFx0dGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXMucHVzaCggMCApO1xuXHRcdFx0XHR0aGlzLm1vcnBoVGFyZ2V0RGljdGlvbmFyeVsgbW9ycGhUYXJnZXRzWyBtIF0ubmFtZSBdID0gbTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH0sXG5cblx0cmF5Y2FzdDogKCBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgaW52ZXJzZU1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7XG5cdFx0dmFyIHJheSA9IG5ldyBSYXkoKTtcblx0XHR2YXIgc3BoZXJlID0gbmV3IFNwaGVyZSgpO1xuXG5cdFx0dmFyIHZBID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgdkIgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciB2QyA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR2YXIgdGVtcEEgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciB0ZW1wQiA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIHRlbXBDID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHZhciB1dkEgPSBuZXcgVmVjdG9yMigpO1xuXHRcdHZhciB1dkIgPSBuZXcgVmVjdG9yMigpO1xuXHRcdHZhciB1dkMgPSBuZXcgVmVjdG9yMigpO1xuXG5cdFx0dmFyIGJhcnljb29yZCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR2YXIgaW50ZXJzZWN0aW9uUG9pbnQgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciBpbnRlcnNlY3Rpb25Qb2ludFdvcmxkID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdGZ1bmN0aW9uIHV2SW50ZXJzZWN0aW9uKCBwb2ludCwgcDEsIHAyLCBwMywgdXYxLCB1djIsIHV2MyApIHtcblxuXHRcdFx0VHJpYW5nbGUuYmFyeWNvb3JkRnJvbVBvaW50KCBwb2ludCwgcDEsIHAyLCBwMywgYmFyeWNvb3JkICk7XG5cblx0XHRcdHV2MS5tdWx0aXBseVNjYWxhciggYmFyeWNvb3JkLnggKTtcblx0XHRcdHV2Mi5tdWx0aXBseVNjYWxhciggYmFyeWNvb3JkLnkgKTtcblx0XHRcdHV2My5tdWx0aXBseVNjYWxhciggYmFyeWNvb3JkLnogKTtcblxuXHRcdFx0dXYxLmFkZCggdXYyICkuYWRkKCB1djMgKTtcblxuXHRcdFx0cmV0dXJuIHV2MS5jbG9uZSgpO1xuXG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gY2hlY2tJbnRlcnNlY3Rpb24oIG9iamVjdCwgcmF5Y2FzdGVyLCByYXksIHBBLCBwQiwgcEMsIHBvaW50ICkge1xuXG5cdFx0XHR2YXIgaW50ZXJzZWN0O1xuXHRcdFx0dmFyIG1hdGVyaWFsID0gb2JqZWN0Lm1hdGVyaWFsO1xuXG5cdFx0XHRpZiAoIG1hdGVyaWFsLnNpZGUgPT09IEJhY2tTaWRlICkge1xuXG5cdFx0XHRcdGludGVyc2VjdCA9IHJheS5pbnRlcnNlY3RUcmlhbmdsZSggcEMsIHBCLCBwQSwgdHJ1ZSwgcG9pbnQgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRpbnRlcnNlY3QgPSByYXkuaW50ZXJzZWN0VHJpYW5nbGUoIHBBLCBwQiwgcEMsIG1hdGVyaWFsLnNpZGUgIT09IERvdWJsZVNpZGUsIHBvaW50ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBpbnRlcnNlY3QgPT09IG51bGwgKSByZXR1cm4gbnVsbDtcblxuXHRcdFx0aW50ZXJzZWN0aW9uUG9pbnRXb3JsZC5jb3B5KCBwb2ludCApO1xuXHRcdFx0aW50ZXJzZWN0aW9uUG9pbnRXb3JsZC5hcHBseU1hdHJpeDQoIG9iamVjdC5tYXRyaXhXb3JsZCApO1xuXG5cdFx0XHR2YXIgZGlzdGFuY2UgPSByYXljYXN0ZXIucmF5Lm9yaWdpbi5kaXN0YW5jZVRvKCBpbnRlcnNlY3Rpb25Qb2ludFdvcmxkICk7XG5cblx0XHRcdGlmICggZGlzdGFuY2UgPCByYXljYXN0ZXIubmVhciB8fCBkaXN0YW5jZSA+IHJheWNhc3Rlci5mYXIgKSByZXR1cm4gbnVsbDtcblxuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0ZGlzdGFuY2U6IGRpc3RhbmNlLFxuXHRcdFx0XHRwb2ludDogaW50ZXJzZWN0aW9uUG9pbnRXb3JsZC5jbG9uZSgpLFxuXHRcdFx0XHRvYmplY3Q6IG9iamVjdFxuXHRcdFx0fTtcblxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIGNoZWNrQnVmZmVyR2VvbWV0cnlJbnRlcnNlY3Rpb24oIG9iamVjdCwgcmF5Y2FzdGVyLCByYXksIHBvc2l0aW9uLCB1diwgYSwgYiwgYyApIHtcblxuXHRcdFx0dkEuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb24sIGEgKTtcblx0XHRcdHZCLmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uLCBiICk7XG5cdFx0XHR2Qy5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbiwgYyApO1xuXG5cdFx0XHR2YXIgaW50ZXJzZWN0aW9uID0gY2hlY2tJbnRlcnNlY3Rpb24oIG9iamVjdCwgcmF5Y2FzdGVyLCByYXksIHZBLCB2QiwgdkMsIGludGVyc2VjdGlvblBvaW50ICk7XG5cblx0XHRcdGlmICggaW50ZXJzZWN0aW9uICkge1xuXG5cdFx0XHRcdGlmICggdXYgKSB7XG5cblx0XHRcdFx0XHR1dkEuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggdXYsIGEgKTtcblx0XHRcdFx0XHR1dkIuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggdXYsIGIgKTtcblx0XHRcdFx0XHR1dkMuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggdXYsIGMgKTtcblxuXHRcdFx0XHRcdGludGVyc2VjdGlvbi51diA9IHV2SW50ZXJzZWN0aW9uKCBpbnRlcnNlY3Rpb25Qb2ludCwgdkEsIHZCLCB2QywgdXZBLCB1dkIsIHV2QyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpbnRlcnNlY3Rpb24uZmFjZSA9IG5ldyBGYWNlMyggYSwgYiwgYywgVHJpYW5nbGUubm9ybWFsKCB2QSwgdkIsIHZDICkgKTtcblx0XHRcdFx0aW50ZXJzZWN0aW9uLmZhY2VJbmRleCA9IGE7XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGludGVyc2VjdGlvbjtcblxuXHRcdH1cblxuXHRcdHJldHVybiBmdW5jdGlvbiByYXljYXN0KCByYXljYXN0ZXIsIGludGVyc2VjdHMgKSB7XG5cblx0XHRcdHZhciBnZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7XG5cdFx0XHR2YXIgbWF0ZXJpYWwgPSB0aGlzLm1hdGVyaWFsO1xuXHRcdFx0dmFyIG1hdHJpeFdvcmxkID0gdGhpcy5tYXRyaXhXb3JsZDtcblxuXHRcdFx0aWYgKCBtYXRlcmlhbCA9PT0gdW5kZWZpbmVkICkgcmV0dXJuO1xuXG5cdFx0XHQvLyBDaGVja2luZyBib3VuZGluZ1NwaGVyZSBkaXN0YW5jZSB0byByYXlcblxuXHRcdFx0aWYgKCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSA9PT0gbnVsbCApIGdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO1xuXG5cdFx0XHRzcGhlcmUuY29weSggZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgKTtcblx0XHRcdHNwaGVyZS5hcHBseU1hdHJpeDQoIG1hdHJpeFdvcmxkICk7XG5cblx0XHRcdGlmICggcmF5Y2FzdGVyLnJheS5pbnRlcnNlY3RzU3BoZXJlKCBzcGhlcmUgKSA9PT0gZmFsc2UgKSByZXR1cm47XG5cblx0XHRcdC8vXG5cblx0XHRcdGludmVyc2VNYXRyaXguZ2V0SW52ZXJzZSggbWF0cml4V29ybGQgKTtcblx0XHRcdHJheS5jb3B5KCByYXljYXN0ZXIucmF5ICkuYXBwbHlNYXRyaXg0KCBpbnZlcnNlTWF0cml4ICk7XG5cblx0XHRcdC8vIENoZWNrIGJvdW5kaW5nQm94IGJlZm9yZSBjb250aW51aW5nXG5cblx0XHRcdGlmICggZ2VvbWV0cnkuYm91bmRpbmdCb3ggIT09IG51bGwgKSB7XG5cblx0XHRcdFx0aWYgKCByYXkuaW50ZXJzZWN0c0JveCggZ2VvbWV0cnkuYm91bmRpbmdCb3ggKSA9PT0gZmFsc2UgKSByZXR1cm47XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIGludGVyc2VjdGlvbjtcblxuXHRcdFx0aWYgKCBnZW9tZXRyeS5pc0J1ZmZlckdlb21ldHJ5ICkge1xuXG5cdFx0XHRcdHZhciBhLCBiLCBjO1xuXHRcdFx0XHR2YXIgaW5kZXggPSBnZW9tZXRyeS5pbmRleDtcblx0XHRcdFx0dmFyIHBvc2l0aW9uID0gZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbjtcblx0XHRcdFx0dmFyIHV2ID0gZ2VvbWV0cnkuYXR0cmlidXRlcy51djtcblx0XHRcdFx0dmFyIGksIGw7XG5cblx0XHRcdFx0aWYgKCBpbmRleCAhPT0gbnVsbCApIHtcblxuXHRcdFx0XHRcdC8vIGluZGV4ZWQgYnVmZmVyIGdlb21ldHJ5XG5cblx0XHRcdFx0XHRmb3IgKCBpID0gMCwgbCA9IGluZGV4LmNvdW50OyBpIDwgbDsgaSArPSAzICkge1xuXG5cdFx0XHRcdFx0XHRhID0gaW5kZXguZ2V0WCggaSApO1xuXHRcdFx0XHRcdFx0YiA9IGluZGV4LmdldFgoIGkgKyAxICk7XG5cdFx0XHRcdFx0XHRjID0gaW5kZXguZ2V0WCggaSArIDIgKTtcblxuXHRcdFx0XHRcdFx0aW50ZXJzZWN0aW9uID0gY2hlY2tCdWZmZXJHZW9tZXRyeUludGVyc2VjdGlvbiggdGhpcywgcmF5Y2FzdGVyLCByYXksIHBvc2l0aW9uLCB1diwgYSwgYiwgYyApO1xuXG5cdFx0XHRcdFx0XHRpZiAoIGludGVyc2VjdGlvbiApIHtcblxuXHRcdFx0XHRcdFx0XHRpbnRlcnNlY3Rpb24uZmFjZUluZGV4ID0gTWF0aC5mbG9vciggaSAvIDMgKTsgLy8gdHJpYW5nbGUgbnVtYmVyIGluIGluZGljZXMgYnVmZmVyIHNlbWFudGljc1xuXHRcdFx0XHRcdFx0XHRpbnRlcnNlY3RzLnB1c2goIGludGVyc2VjdGlvbiApO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdC8vIG5vbi1pbmRleGVkIGJ1ZmZlciBnZW9tZXRyeVxuXG5cdFx0XHRcdFx0Zm9yICggaSA9IDAsIGwgPSBwb3NpdGlvbi5jb3VudDsgaSA8IGw7IGkgKz0gMyApIHtcblxuXHRcdFx0XHRcdFx0YSA9IGk7XG5cdFx0XHRcdFx0XHRiID0gaSArIDE7XG5cdFx0XHRcdFx0XHRjID0gaSArIDI7XG5cblx0XHRcdFx0XHRcdGludGVyc2VjdGlvbiA9IGNoZWNrQnVmZmVyR2VvbWV0cnlJbnRlcnNlY3Rpb24oIHRoaXMsIHJheWNhc3RlciwgcmF5LCBwb3NpdGlvbiwgdXYsIGEsIGIsIGMgKTtcblxuXHRcdFx0XHRcdFx0aWYgKCBpbnRlcnNlY3Rpb24gKSB7XG5cblx0XHRcdFx0XHRcdFx0aW50ZXJzZWN0aW9uLmluZGV4ID0gYTsgLy8gdHJpYW5nbGUgbnVtYmVyIGluIHBvc2l0aW9ucyBidWZmZXIgc2VtYW50aWNzXG5cdFx0XHRcdFx0XHRcdGludGVyc2VjdHMucHVzaCggaW50ZXJzZWN0aW9uICk7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSBpZiAoIGdlb21ldHJ5LmlzR2VvbWV0cnkgKSB7XG5cblx0XHRcdFx0dmFyIGZ2QSwgZnZCLCBmdkM7XG5cdFx0XHRcdHZhciBpc011bHRpTWF0ZXJpYWwgPSBBcnJheS5pc0FycmF5KCBtYXRlcmlhbCApO1xuXG5cdFx0XHRcdHZhciB2ZXJ0aWNlcyA9IGdlb21ldHJ5LnZlcnRpY2VzO1xuXHRcdFx0XHR2YXIgZmFjZXMgPSBnZW9tZXRyeS5mYWNlcztcblx0XHRcdFx0dmFyIHV2cztcblxuXHRcdFx0XHR2YXIgZmFjZVZlcnRleFV2cyA9IGdlb21ldHJ5LmZhY2VWZXJ0ZXhVdnNbIDAgXTtcblx0XHRcdFx0aWYgKCBmYWNlVmVydGV4VXZzLmxlbmd0aCA+IDAgKSB1dnMgPSBmYWNlVmVydGV4VXZzO1xuXG5cdFx0XHRcdGZvciAoIHZhciBmID0gMCwgZmwgPSBmYWNlcy5sZW5ndGg7IGYgPCBmbDsgZiArKyApIHtcblxuXHRcdFx0XHRcdHZhciBmYWNlID0gZmFjZXNbIGYgXTtcblx0XHRcdFx0XHR2YXIgZmFjZU1hdGVyaWFsID0gaXNNdWx0aU1hdGVyaWFsID8gbWF0ZXJpYWxbIGZhY2UubWF0ZXJpYWxJbmRleCBdIDogbWF0ZXJpYWw7XG5cblx0XHRcdFx0XHRpZiAoIGZhY2VNYXRlcmlhbCA9PT0gdW5kZWZpbmVkICkgY29udGludWU7XG5cblx0XHRcdFx0XHRmdkEgPSB2ZXJ0aWNlc1sgZmFjZS5hIF07XG5cdFx0XHRcdFx0ZnZCID0gdmVydGljZXNbIGZhY2UuYiBdO1xuXHRcdFx0XHRcdGZ2QyA9IHZlcnRpY2VzWyBmYWNlLmMgXTtcblxuXHRcdFx0XHRcdGlmICggZmFjZU1hdGVyaWFsLm1vcnBoVGFyZ2V0cyA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0XHRcdFx0dmFyIG1vcnBoVGFyZ2V0cyA9IGdlb21ldHJ5Lm1vcnBoVGFyZ2V0cztcblx0XHRcdFx0XHRcdHZhciBtb3JwaEluZmx1ZW5jZXMgPSB0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcztcblxuXHRcdFx0XHRcdFx0dkEuc2V0KCAwLCAwLCAwICk7XG5cdFx0XHRcdFx0XHR2Qi5zZXQoIDAsIDAsIDAgKTtcblx0XHRcdFx0XHRcdHZDLnNldCggMCwgMCwgMCApO1xuXG5cdFx0XHRcdFx0XHRmb3IgKCB2YXIgdCA9IDAsIHRsID0gbW9ycGhUYXJnZXRzLmxlbmd0aDsgdCA8IHRsOyB0ICsrICkge1xuXG5cdFx0XHRcdFx0XHRcdHZhciBpbmZsdWVuY2UgPSBtb3JwaEluZmx1ZW5jZXNbIHQgXTtcblxuXHRcdFx0XHRcdFx0XHRpZiAoIGluZmx1ZW5jZSA9PT0gMCApIGNvbnRpbnVlO1xuXG5cdFx0XHRcdFx0XHRcdHZhciB0YXJnZXRzID0gbW9ycGhUYXJnZXRzWyB0IF0udmVydGljZXM7XG5cblx0XHRcdFx0XHRcdFx0dkEuYWRkU2NhbGVkVmVjdG9yKCB0ZW1wQS5zdWJWZWN0b3JzKCB0YXJnZXRzWyBmYWNlLmEgXSwgZnZBICksIGluZmx1ZW5jZSApO1xuXHRcdFx0XHRcdFx0XHR2Qi5hZGRTY2FsZWRWZWN0b3IoIHRlbXBCLnN1YlZlY3RvcnMoIHRhcmdldHNbIGZhY2UuYiBdLCBmdkIgKSwgaW5mbHVlbmNlICk7XG5cdFx0XHRcdFx0XHRcdHZDLmFkZFNjYWxlZFZlY3RvciggdGVtcEMuc3ViVmVjdG9ycyggdGFyZ2V0c1sgZmFjZS5jIF0sIGZ2QyApLCBpbmZsdWVuY2UgKTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHR2QS5hZGQoIGZ2QSApO1xuXHRcdFx0XHRcdFx0dkIuYWRkKCBmdkIgKTtcblx0XHRcdFx0XHRcdHZDLmFkZCggZnZDICk7XG5cblx0XHRcdFx0XHRcdGZ2QSA9IHZBO1xuXHRcdFx0XHRcdFx0ZnZCID0gdkI7XG5cdFx0XHRcdFx0XHRmdkMgPSB2QztcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGludGVyc2VjdGlvbiA9IGNoZWNrSW50ZXJzZWN0aW9uKCB0aGlzLCByYXljYXN0ZXIsIHJheSwgZnZBLCBmdkIsIGZ2QywgaW50ZXJzZWN0aW9uUG9pbnQgKTtcblxuXHRcdFx0XHRcdGlmICggaW50ZXJzZWN0aW9uICkge1xuXG5cdFx0XHRcdFx0XHRpZiAoIHV2cyAmJiB1dnNbIGYgXSApIHtcblxuXHRcdFx0XHRcdFx0XHR2YXIgdXZzX2YgPSB1dnNbIGYgXTtcblx0XHRcdFx0XHRcdFx0dXZBLmNvcHkoIHV2c19mWyAwIF0gKTtcblx0XHRcdFx0XHRcdFx0dXZCLmNvcHkoIHV2c19mWyAxIF0gKTtcblx0XHRcdFx0XHRcdFx0dXZDLmNvcHkoIHV2c19mWyAyIF0gKTtcblxuXHRcdFx0XHRcdFx0XHRpbnRlcnNlY3Rpb24udXYgPSB1dkludGVyc2VjdGlvbiggaW50ZXJzZWN0aW9uUG9pbnQsIGZ2QSwgZnZCLCBmdkMsIHV2QSwgdXZCLCB1dkMgKTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpbnRlcnNlY3Rpb24uZmFjZSA9IGZhY2U7XG5cdFx0XHRcdFx0XHRpbnRlcnNlY3Rpb24uZmFjZUluZGV4ID0gZjtcblx0XHRcdFx0XHRcdGludGVyc2VjdHMucHVzaCggaW50ZXJzZWN0aW9uICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9O1xuXG5cdH0oKSApLFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoIHRoaXMuZ2VvbWV0cnksIHRoaXMubWF0ZXJpYWwgKS5jb3B5KCB0aGlzICk7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKi9cblxuLy8gQm94R2VvbWV0cnlcblxuZnVuY3Rpb24gQm94R2VvbWV0cnkoIHdpZHRoLCBoZWlnaHQsIGRlcHRoLCB3aWR0aFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgZGVwdGhTZWdtZW50cyApIHtcblxuXHRHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0JveEdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0d2lkdGg6IHdpZHRoLFxuXHRcdGhlaWdodDogaGVpZ2h0LFxuXHRcdGRlcHRoOiBkZXB0aCxcblx0XHR3aWR0aFNlZ21lbnRzOiB3aWR0aFNlZ21lbnRzLFxuXHRcdGhlaWdodFNlZ21lbnRzOiBoZWlnaHRTZWdtZW50cyxcblx0XHRkZXB0aFNlZ21lbnRzOiBkZXB0aFNlZ21lbnRzXG5cdH07XG5cblx0dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIG5ldyBCb3hCdWZmZXJHZW9tZXRyeSggd2lkdGgsIGhlaWdodCwgZGVwdGgsIHdpZHRoU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCBkZXB0aFNlZ21lbnRzICkgKTtcblx0dGhpcy5tZXJnZVZlcnRpY2VzKCk7XG5cbn1cblxuQm94R2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7XG5Cb3hHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBCb3hHZW9tZXRyeTtcblxuLy8gQm94QnVmZmVyR2VvbWV0cnlcblxuZnVuY3Rpb24gQm94QnVmZmVyR2VvbWV0cnkoIHdpZHRoLCBoZWlnaHQsIGRlcHRoLCB3aWR0aFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgZGVwdGhTZWdtZW50cyApIHtcblxuXHRCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0JveEJ1ZmZlckdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0d2lkdGg6IHdpZHRoLFxuXHRcdGhlaWdodDogaGVpZ2h0LFxuXHRcdGRlcHRoOiBkZXB0aCxcblx0XHR3aWR0aFNlZ21lbnRzOiB3aWR0aFNlZ21lbnRzLFxuXHRcdGhlaWdodFNlZ21lbnRzOiBoZWlnaHRTZWdtZW50cyxcblx0XHRkZXB0aFNlZ21lbnRzOiBkZXB0aFNlZ21lbnRzXG5cdH07XG5cblx0dmFyIHNjb3BlID0gdGhpcztcblxuXHQvLyBzZWdtZW50c1xuXG5cdHdpZHRoU2VnbWVudHMgPSBNYXRoLmZsb29yKCB3aWR0aFNlZ21lbnRzICkgfHwgMTtcblx0aGVpZ2h0U2VnbWVudHMgPSBNYXRoLmZsb29yKCBoZWlnaHRTZWdtZW50cyApIHx8IDE7XG5cdGRlcHRoU2VnbWVudHMgPSBNYXRoLmZsb29yKCBkZXB0aFNlZ21lbnRzICkgfHwgMTtcblxuXHQvLyBidWZmZXJzXG5cblx0dmFyIGluZGljZXMgPSBbXTtcblx0dmFyIHZlcnRpY2VzID0gW107XG5cdHZhciBub3JtYWxzID0gW107XG5cdHZhciB1dnMgPSBbXTtcblxuXHQvLyBoZWxwZXIgdmFyaWFibGVzXG5cblx0dmFyIG51bWJlck9mVmVydGljZXMgPSAwO1xuXHR2YXIgZ3JvdXBTdGFydCA9IDA7XG5cblx0Ly8gYnVpbGQgZWFjaCBzaWRlIG9mIHRoZSBib3ggZ2VvbWV0cnlcblxuXHRidWlsZFBsYW5lKCAneicsICd5JywgJ3gnLCAtIDEsIC0gMSwgZGVwdGgsIGhlaWdodCwgICB3aWR0aCwgIGRlcHRoU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCAwICk7IC8vIHB4XG5cdGJ1aWxkUGxhbmUoICd6JywgJ3knLCAneCcsICAgMSwgLSAxLCBkZXB0aCwgaGVpZ2h0LCAtIHdpZHRoLCAgZGVwdGhTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIDEgKTsgLy8gbnhcblx0YnVpbGRQbGFuZSggJ3gnLCAneicsICd5JywgICAxLCAgIDEsIHdpZHRoLCBkZXB0aCwgICAgaGVpZ2h0LCB3aWR0aFNlZ21lbnRzLCBkZXB0aFNlZ21lbnRzLCAgMiApOyAvLyBweVxuXHRidWlsZFBsYW5lKCAneCcsICd6JywgJ3knLCAgIDEsIC0gMSwgd2lkdGgsIGRlcHRoLCAgLSBoZWlnaHQsIHdpZHRoU2VnbWVudHMsIGRlcHRoU2VnbWVudHMsICAzICk7IC8vIG55XG5cdGJ1aWxkUGxhbmUoICd4JywgJ3knLCAneicsICAgMSwgLSAxLCB3aWR0aCwgaGVpZ2h0LCAgIGRlcHRoLCAgd2lkdGhTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIDQgKTsgLy8gcHpcblx0YnVpbGRQbGFuZSggJ3gnLCAneScsICd6JywgLSAxLCAtIDEsIHdpZHRoLCBoZWlnaHQsIC0gZGVwdGgsICB3aWR0aFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgNSApOyAvLyBuelxuXG5cdC8vIGJ1aWxkIGdlb21ldHJ5XG5cblx0dGhpcy5zZXRJbmRleCggaW5kaWNlcyApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICdub3JtYWwnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbm9ybWFscywgMyApICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAyICkgKTtcblxuXHRmdW5jdGlvbiBidWlsZFBsYW5lKCB1LCB2LCB3LCB1ZGlyLCB2ZGlyLCB3aWR0aCwgaGVpZ2h0LCBkZXB0aCwgZ3JpZFgsIGdyaWRZLCBtYXRlcmlhbEluZGV4ICkge1xuXG5cdFx0dmFyIHNlZ21lbnRXaWR0aCA9IHdpZHRoIC8gZ3JpZFg7XG5cdFx0dmFyIHNlZ21lbnRIZWlnaHQgPSBoZWlnaHQgLyBncmlkWTtcblxuXHRcdHZhciB3aWR0aEhhbGYgPSB3aWR0aCAvIDI7XG5cdFx0dmFyIGhlaWdodEhhbGYgPSBoZWlnaHQgLyAyO1xuXHRcdHZhciBkZXB0aEhhbGYgPSBkZXB0aCAvIDI7XG5cblx0XHR2YXIgZ3JpZFgxID0gZ3JpZFggKyAxO1xuXHRcdHZhciBncmlkWTEgPSBncmlkWSArIDE7XG5cblx0XHR2YXIgdmVydGV4Q291bnRlciA9IDA7XG5cdFx0dmFyIGdyb3VwQ291bnQgPSAwO1xuXG5cdFx0dmFyIGl4LCBpeTtcblxuXHRcdHZhciB2ZWN0b3IgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0Ly8gZ2VuZXJhdGUgdmVydGljZXMsIG5vcm1hbHMgYW5kIHV2c1xuXG5cdFx0Zm9yICggaXkgPSAwOyBpeSA8IGdyaWRZMTsgaXkgKysgKSB7XG5cblx0XHRcdHZhciB5ID0gaXkgKiBzZWdtZW50SGVpZ2h0IC0gaGVpZ2h0SGFsZjtcblxuXHRcdFx0Zm9yICggaXggPSAwOyBpeCA8IGdyaWRYMTsgaXggKysgKSB7XG5cblx0XHRcdFx0dmFyIHggPSBpeCAqIHNlZ21lbnRXaWR0aCAtIHdpZHRoSGFsZjtcblxuXHRcdFx0XHQvLyBzZXQgdmFsdWVzIHRvIGNvcnJlY3QgdmVjdG9yIGNvbXBvbmVudFxuXG5cdFx0XHRcdHZlY3RvclsgdSBdID0geCAqIHVkaXI7XG5cdFx0XHRcdHZlY3RvclsgdiBdID0geSAqIHZkaXI7XG5cdFx0XHRcdHZlY3RvclsgdyBdID0gZGVwdGhIYWxmO1xuXG5cdFx0XHRcdC8vIG5vdyBhcHBseSB2ZWN0b3IgdG8gdmVydGV4IGJ1ZmZlclxuXG5cdFx0XHRcdHZlcnRpY2VzLnB1c2goIHZlY3Rvci54LCB2ZWN0b3IueSwgdmVjdG9yLnogKTtcblxuXHRcdFx0XHQvLyBzZXQgdmFsdWVzIHRvIGNvcnJlY3QgdmVjdG9yIGNvbXBvbmVudFxuXG5cdFx0XHRcdHZlY3RvclsgdSBdID0gMDtcblx0XHRcdFx0dmVjdG9yWyB2IF0gPSAwO1xuXHRcdFx0XHR2ZWN0b3JbIHcgXSA9IGRlcHRoID4gMCA/IDEgOiAtIDE7XG5cblx0XHRcdFx0Ly8gbm93IGFwcGx5IHZlY3RvciB0byBub3JtYWwgYnVmZmVyXG5cblx0XHRcdFx0bm9ybWFscy5wdXNoKCB2ZWN0b3IueCwgdmVjdG9yLnksIHZlY3Rvci56ICk7XG5cblx0XHRcdFx0Ly8gdXZzXG5cblx0XHRcdFx0dXZzLnB1c2goIGl4IC8gZ3JpZFggKTtcblx0XHRcdFx0dXZzLnB1c2goIDEgLSAoIGl5IC8gZ3JpZFkgKSApO1xuXG5cdFx0XHRcdC8vIGNvdW50ZXJzXG5cblx0XHRcdFx0dmVydGV4Q291bnRlciArPSAxO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvLyBpbmRpY2VzXG5cblx0XHQvLyAxLiB5b3UgbmVlZCB0aHJlZSBpbmRpY2VzIHRvIGRyYXcgYSBzaW5nbGUgZmFjZVxuXHRcdC8vIDIuIGEgc2luZ2xlIHNlZ21lbnQgY29uc2lzdHMgb2YgdHdvIGZhY2VzXG5cdFx0Ly8gMy4gc28gd2UgbmVlZCB0byBnZW5lcmF0ZSBzaXggKDIqMykgaW5kaWNlcyBwZXIgc2VnbWVudFxuXG5cdFx0Zm9yICggaXkgPSAwOyBpeSA8IGdyaWRZOyBpeSArKyApIHtcblxuXHRcdFx0Zm9yICggaXggPSAwOyBpeCA8IGdyaWRYOyBpeCArKyApIHtcblxuXHRcdFx0XHR2YXIgYSA9IG51bWJlck9mVmVydGljZXMgKyBpeCArIGdyaWRYMSAqIGl5O1xuXHRcdFx0XHR2YXIgYiA9IG51bWJlck9mVmVydGljZXMgKyBpeCArIGdyaWRYMSAqICggaXkgKyAxICk7XG5cdFx0XHRcdHZhciBjID0gbnVtYmVyT2ZWZXJ0aWNlcyArICggaXggKyAxICkgKyBncmlkWDEgKiAoIGl5ICsgMSApO1xuXHRcdFx0XHR2YXIgZCA9IG51bWJlck9mVmVydGljZXMgKyAoIGl4ICsgMSApICsgZ3JpZFgxICogaXk7XG5cblx0XHRcdFx0Ly8gZmFjZXNcblxuXHRcdFx0XHRpbmRpY2VzLnB1c2goIGEsIGIsIGQgKTtcblx0XHRcdFx0aW5kaWNlcy5wdXNoKCBiLCBjLCBkICk7XG5cblx0XHRcdFx0Ly8gaW5jcmVhc2UgY291bnRlclxuXG5cdFx0XHRcdGdyb3VwQ291bnQgKz0gNjtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gYWRkIGEgZ3JvdXAgdG8gdGhlIGdlb21ldHJ5LiB0aGlzIHdpbGwgZW5zdXJlIG11bHRpIG1hdGVyaWFsIHN1cHBvcnRcblxuXHRcdHNjb3BlLmFkZEdyb3VwKCBncm91cFN0YXJ0LCBncm91cENvdW50LCBtYXRlcmlhbEluZGV4ICk7XG5cblx0XHQvLyBjYWxjdWxhdGUgbmV3IHN0YXJ0IHZhbHVlIGZvciBncm91cHNcblxuXHRcdGdyb3VwU3RhcnQgKz0gZ3JvdXBDb3VudDtcblxuXHRcdC8vIHVwZGF0ZSB0b3RhbCBudW1iZXIgb2YgdmVydGljZXNcblxuXHRcdG51bWJlck9mVmVydGljZXMgKz0gdmVydGV4Q291bnRlcjtcblxuXHR9XG5cbn1cblxuQm94QnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7XG5Cb3hCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBCb3hCdWZmZXJHZW9tZXRyeTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqL1xuXG4vLyBQbGFuZUdlb21ldHJ5XG5cbmZ1bmN0aW9uIFBsYW5lR2VvbWV0cnkoIHdpZHRoLCBoZWlnaHQsIHdpZHRoU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzICkge1xuXG5cdEdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnUGxhbmVHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHdpZHRoOiB3aWR0aCxcblx0XHRoZWlnaHQ6IGhlaWdodCxcblx0XHR3aWR0aFNlZ21lbnRzOiB3aWR0aFNlZ21lbnRzLFxuXHRcdGhlaWdodFNlZ21lbnRzOiBoZWlnaHRTZWdtZW50c1xuXHR9O1xuXG5cdHRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgUGxhbmVCdWZmZXJHZW9tZXRyeSggd2lkdGgsIGhlaWdodCwgd2lkdGhTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMgKSApO1xuXHR0aGlzLm1lcmdlVmVydGljZXMoKTtcblxufVxuXG5QbGFuZUdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEdlb21ldHJ5LnByb3RvdHlwZSApO1xuUGxhbmVHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBQbGFuZUdlb21ldHJ5O1xuXG4vLyBQbGFuZUJ1ZmZlckdlb21ldHJ5XG5cbmZ1bmN0aW9uIFBsYW5lQnVmZmVyR2VvbWV0cnkoIHdpZHRoLCBoZWlnaHQsIHdpZHRoU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzICkge1xuXG5cdEJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnUGxhbmVCdWZmZXJHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHdpZHRoOiB3aWR0aCxcblx0XHRoZWlnaHQ6IGhlaWdodCxcblx0XHR3aWR0aFNlZ21lbnRzOiB3aWR0aFNlZ21lbnRzLFxuXHRcdGhlaWdodFNlZ21lbnRzOiBoZWlnaHRTZWdtZW50c1xuXHR9O1xuXG5cdHZhciB3aWR0aF9oYWxmID0gd2lkdGggLyAyO1xuXHR2YXIgaGVpZ2h0X2hhbGYgPSBoZWlnaHQgLyAyO1xuXG5cdHZhciBncmlkWCA9IE1hdGguZmxvb3IoIHdpZHRoU2VnbWVudHMgKSB8fCAxO1xuXHR2YXIgZ3JpZFkgPSBNYXRoLmZsb29yKCBoZWlnaHRTZWdtZW50cyApIHx8IDE7XG5cblx0dmFyIGdyaWRYMSA9IGdyaWRYICsgMTtcblx0dmFyIGdyaWRZMSA9IGdyaWRZICsgMTtcblxuXHR2YXIgc2VnbWVudF93aWR0aCA9IHdpZHRoIC8gZ3JpZFg7XG5cdHZhciBzZWdtZW50X2hlaWdodCA9IGhlaWdodCAvIGdyaWRZO1xuXG5cdHZhciBpeCwgaXk7XG5cblx0Ly8gYnVmZmVyc1xuXG5cdHZhciBpbmRpY2VzID0gW107XG5cdHZhciB2ZXJ0aWNlcyA9IFtdO1xuXHR2YXIgbm9ybWFscyA9IFtdO1xuXHR2YXIgdXZzID0gW107XG5cblx0Ly8gZ2VuZXJhdGUgdmVydGljZXMsIG5vcm1hbHMgYW5kIHV2c1xuXG5cdGZvciAoIGl5ID0gMDsgaXkgPCBncmlkWTE7IGl5ICsrICkge1xuXG5cdFx0dmFyIHkgPSBpeSAqIHNlZ21lbnRfaGVpZ2h0IC0gaGVpZ2h0X2hhbGY7XG5cblx0XHRmb3IgKCBpeCA9IDA7IGl4IDwgZ3JpZFgxOyBpeCArKyApIHtcblxuXHRcdFx0dmFyIHggPSBpeCAqIHNlZ21lbnRfd2lkdGggLSB3aWR0aF9oYWxmO1xuXG5cdFx0XHR2ZXJ0aWNlcy5wdXNoKCB4LCAtIHksIDAgKTtcblxuXHRcdFx0bm9ybWFscy5wdXNoKCAwLCAwLCAxICk7XG5cblx0XHRcdHV2cy5wdXNoKCBpeCAvIGdyaWRYICk7XG5cdFx0XHR1dnMucHVzaCggMSAtICggaXkgLyBncmlkWSApICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIGluZGljZXNcblxuXHRmb3IgKCBpeSA9IDA7IGl5IDwgZ3JpZFk7IGl5ICsrICkge1xuXG5cdFx0Zm9yICggaXggPSAwOyBpeCA8IGdyaWRYOyBpeCArKyApIHtcblxuXHRcdFx0dmFyIGEgPSBpeCArIGdyaWRYMSAqIGl5O1xuXHRcdFx0dmFyIGIgPSBpeCArIGdyaWRYMSAqICggaXkgKyAxICk7XG5cdFx0XHR2YXIgYyA9ICggaXggKyAxICkgKyBncmlkWDEgKiAoIGl5ICsgMSApO1xuXHRcdFx0dmFyIGQgPSAoIGl4ICsgMSApICsgZ3JpZFgxICogaXk7XG5cblx0XHRcdC8vIGZhY2VzXG5cblx0XHRcdGluZGljZXMucHVzaCggYSwgYiwgZCApO1xuXHRcdFx0aW5kaWNlcy5wdXNoKCBiLCBjLCBkICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIGJ1aWxkIGdlb21ldHJ5XG5cblx0dGhpcy5zZXRJbmRleCggaW5kaWNlcyApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICdub3JtYWwnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbm9ybWFscywgMyApICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAyICkgKTtcblxufVxuXG5QbGFuZUJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApO1xuUGxhbmVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBQbGFuZUJ1ZmZlckdlb21ldHJ5O1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIG1pa2FlbCBlbXRpbmdlciAvIGh0dHA6Ly9nb21vLnNlL1xuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4qL1xuXG5mdW5jdGlvbiBDYW1lcmEoKSB7XG5cblx0T2JqZWN0M0QuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdDYW1lcmEnO1xuXG5cdHRoaXMubWF0cml4V29ybGRJbnZlcnNlID0gbmV3IE1hdHJpeDQoKTtcblx0dGhpcy5wcm9qZWN0aW9uTWF0cml4ID0gbmV3IE1hdHJpeDQoKTtcblxufVxuXG5DYW1lcmEucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogQ2FtZXJhLFxuXG5cdGlzQ2FtZXJhOiB0cnVlLFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0T2JqZWN0M0QucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0XHR0aGlzLm1hdHJpeFdvcmxkSW52ZXJzZS5jb3B5KCBzb3VyY2UubWF0cml4V29ybGRJbnZlcnNlICk7XG5cdFx0dGhpcy5wcm9qZWN0aW9uTWF0cml4LmNvcHkoIHNvdXJjZS5wcm9qZWN0aW9uTWF0cml4ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGdldFdvcmxkRGlyZWN0aW9uOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgcXVhdGVybmlvbiA9IG5ldyBRdWF0ZXJuaW9uKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gZ2V0V29ybGREaXJlY3Rpb24oIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdFx0XHR2YXIgcmVzdWx0ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IFZlY3RvcjMoKTtcblxuXHRcdFx0dGhpcy5nZXRXb3JsZFF1YXRlcm5pb24oIHF1YXRlcm5pb24gKTtcblxuXHRcdFx0cmV0dXJuIHJlc3VsdC5zZXQoIDAsIDAsIC0gMSApLmFwcGx5UXVhdGVybmlvbiggcXVhdGVybmlvbiApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBncmVnZ21hbiAvIGh0dHA6Ly9nYW1lcy5ncmVnZ21hbi5jb20vXG4gKiBAYXV0aG9yIHp6ODUgLyBodHRwOi8vd3d3LmxhYjRnYW1lcy5uZXQveno4NS9ibG9nXG4gKiBAYXV0aG9yIHRzY2h3XG4gKi9cblxuZnVuY3Rpb24gUGVyc3BlY3RpdmVDYW1lcmEoIGZvdiwgYXNwZWN0LCBuZWFyLCBmYXIgKSB7XG5cblx0Q2FtZXJhLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnUGVyc3BlY3RpdmVDYW1lcmEnO1xuXG5cdHRoaXMuZm92ID0gZm92ICE9PSB1bmRlZmluZWQgPyBmb3YgOiA1MDtcblx0dGhpcy56b29tID0gMTtcblxuXHR0aGlzLm5lYXIgPSBuZWFyICE9PSB1bmRlZmluZWQgPyBuZWFyIDogMC4xO1xuXHR0aGlzLmZhciA9IGZhciAhPT0gdW5kZWZpbmVkID8gZmFyIDogMjAwMDtcblx0dGhpcy5mb2N1cyA9IDEwO1xuXG5cdHRoaXMuYXNwZWN0ID0gYXNwZWN0ICE9PSB1bmRlZmluZWQgPyBhc3BlY3QgOiAxO1xuXHR0aGlzLnZpZXcgPSBudWxsO1xuXG5cdHRoaXMuZmlsbUdhdWdlID0gMzU7XHQvLyB3aWR0aCBvZiB0aGUgZmlsbSAoZGVmYXVsdCBpbiBtaWxsaW1ldGVycylcblx0dGhpcy5maWxtT2Zmc2V0ID0gMDtcdC8vIGhvcml6b250YWwgZmlsbSBvZmZzZXQgKHNhbWUgdW5pdCBhcyBnYXVnZSlcblxuXHR0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtcblxufVxuXG5QZXJzcGVjdGl2ZUNhbWVyYS5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBDYW1lcmEucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogUGVyc3BlY3RpdmVDYW1lcmEsXG5cblx0aXNQZXJzcGVjdGl2ZUNhbWVyYTogdHJ1ZSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRcdENhbWVyYS5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHRcdHRoaXMuZm92ID0gc291cmNlLmZvdjtcblx0XHR0aGlzLnpvb20gPSBzb3VyY2Uuem9vbTtcblxuXHRcdHRoaXMubmVhciA9IHNvdXJjZS5uZWFyO1xuXHRcdHRoaXMuZmFyID0gc291cmNlLmZhcjtcblx0XHR0aGlzLmZvY3VzID0gc291cmNlLmZvY3VzO1xuXG5cdFx0dGhpcy5hc3BlY3QgPSBzb3VyY2UuYXNwZWN0O1xuXHRcdHRoaXMudmlldyA9IHNvdXJjZS52aWV3ID09PSBudWxsID8gbnVsbCA6IE9iamVjdC5hc3NpZ24oIHt9LCBzb3VyY2UudmlldyApO1xuXG5cdFx0dGhpcy5maWxtR2F1Z2UgPSBzb3VyY2UuZmlsbUdhdWdlO1xuXHRcdHRoaXMuZmlsbU9mZnNldCA9IHNvdXJjZS5maWxtT2Zmc2V0O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHQvKipcblx0ICogU2V0cyB0aGUgRk9WIGJ5IGZvY2FsIGxlbmd0aCBpbiByZXNwZWN0IHRvIHRoZSBjdXJyZW50IC5maWxtR2F1Z2UuXG5cdCAqXG5cdCAqIFRoZSBkZWZhdWx0IGZpbG0gZ2F1Z2UgaXMgMzUsIHNvIHRoYXQgdGhlIGZvY2FsIGxlbmd0aCBjYW4gYmUgc3BlY2lmaWVkIGZvclxuXHQgKiBhIDM1bW0gKGZ1bGwgZnJhbWUpIGNhbWVyYS5cblx0ICpcblx0ICogVmFsdWVzIGZvciBmb2NhbCBsZW5ndGggYW5kIGZpbG0gZ2F1Z2UgbXVzdCBoYXZlIHRoZSBzYW1lIHVuaXQuXG5cdCAqL1xuXHRzZXRGb2NhbExlbmd0aDogZnVuY3Rpb24gKCBmb2NhbExlbmd0aCApIHtcblxuXHRcdC8vIHNlZSBodHRwOi8vd3d3LmJvYmF0a2lucy5jb20vcGhvdG9ncmFwaHkvdGVjaG5pY2FsL2ZpZWxkX29mX3ZpZXcuaHRtbFxuXHRcdHZhciB2RXh0ZW50U2xvcGUgPSAwLjUgKiB0aGlzLmdldEZpbG1IZWlnaHQoKSAvIGZvY2FsTGVuZ3RoO1xuXG5cdFx0dGhpcy5mb3YgPSBfTWF0aC5SQUQyREVHICogMiAqIE1hdGguYXRhbiggdkV4dGVudFNsb3BlICk7XG5cdFx0dGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XG5cblx0fSxcblxuXHQvKipcblx0ICogQ2FsY3VsYXRlcyB0aGUgZm9jYWwgbGVuZ3RoIGZyb20gdGhlIGN1cnJlbnQgLmZvdiBhbmQgLmZpbG1HYXVnZS5cblx0ICovXG5cdGdldEZvY2FsTGVuZ3RoOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdkV4dGVudFNsb3BlID0gTWF0aC50YW4oIF9NYXRoLkRFRzJSQUQgKiAwLjUgKiB0aGlzLmZvdiApO1xuXG5cdFx0cmV0dXJuIDAuNSAqIHRoaXMuZ2V0RmlsbUhlaWdodCgpIC8gdkV4dGVudFNsb3BlO1xuXG5cdH0sXG5cblx0Z2V0RWZmZWN0aXZlRk9WOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gX01hdGguUkFEMkRFRyAqIDIgKiBNYXRoLmF0YW4oXG5cdFx0XHRcdE1hdGgudGFuKCBfTWF0aC5ERUcyUkFEICogMC41ICogdGhpcy5mb3YgKSAvIHRoaXMuem9vbSApO1xuXG5cdH0sXG5cblx0Z2V0RmlsbVdpZHRoOiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyBmaWxtIG5vdCBjb21wbGV0ZWx5IGNvdmVyZWQgaW4gcG9ydHJhaXQgZm9ybWF0IChhc3BlY3QgPCAxKVxuXHRcdHJldHVybiB0aGlzLmZpbG1HYXVnZSAqIE1hdGgubWluKCB0aGlzLmFzcGVjdCwgMSApO1xuXG5cdH0sXG5cblx0Z2V0RmlsbUhlaWdodDogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gZmlsbSBub3QgY29tcGxldGVseSBjb3ZlcmVkIGluIGxhbmRzY2FwZSBmb3JtYXQgKGFzcGVjdCA+IDEpXG5cdFx0cmV0dXJuIHRoaXMuZmlsbUdhdWdlIC8gTWF0aC5tYXgoIHRoaXMuYXNwZWN0LCAxICk7XG5cblx0fSxcblxuXHQvKipcblx0ICogU2V0cyBhbiBvZmZzZXQgaW4gYSBsYXJnZXIgZnJ1c3R1bS4gVGhpcyBpcyB1c2VmdWwgZm9yIG11bHRpLXdpbmRvdyBvclxuXHQgKiBtdWx0aS1tb25pdG9yL211bHRpLW1hY2hpbmUgc2V0dXBzLlxuXHQgKlxuXHQgKiBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgM3gyIG1vbml0b3JzIGFuZCBlYWNoIG1vbml0b3IgaXMgMTkyMHgxMDgwIGFuZFxuXHQgKiB0aGUgbW9uaXRvcnMgYXJlIGluIGdyaWQgbGlrZSB0aGlzXG5cdCAqXG5cdCAqICAgKy0tLSstLS0rLS0tK1xuXHQgKiAgIHwgQSB8IEIgfCBDIHxcblx0ICogICArLS0tKy0tLSstLS0rXG5cdCAqICAgfCBEIHwgRSB8IEYgfFxuXHQgKiAgICstLS0rLS0tKy0tLStcblx0ICpcblx0ICogdGhlbiBmb3IgZWFjaCBtb25pdG9yIHlvdSB3b3VsZCBjYWxsIGl0IGxpa2UgdGhpc1xuXHQgKlxuXHQgKiAgIHZhciB3ID0gMTkyMDtcblx0ICogICB2YXIgaCA9IDEwODA7XG5cdCAqICAgdmFyIGZ1bGxXaWR0aCA9IHcgKiAzO1xuXHQgKiAgIHZhciBmdWxsSGVpZ2h0ID0gaCAqIDI7XG5cdCAqXG5cdCAqICAgLS1BLS1cblx0ICogICBjYW1lcmEuc2V0T2Zmc2V0KCBmdWxsV2lkdGgsIGZ1bGxIZWlnaHQsIHcgKiAwLCBoICogMCwgdywgaCApO1xuXHQgKiAgIC0tQi0tXG5cdCAqICAgY2FtZXJhLnNldE9mZnNldCggZnVsbFdpZHRoLCBmdWxsSGVpZ2h0LCB3ICogMSwgaCAqIDAsIHcsIGggKTtcblx0ICogICAtLUMtLVxuXHQgKiAgIGNhbWVyYS5zZXRPZmZzZXQoIGZ1bGxXaWR0aCwgZnVsbEhlaWdodCwgdyAqIDIsIGggKiAwLCB3LCBoICk7XG5cdCAqICAgLS1ELS1cblx0ICogICBjYW1lcmEuc2V0T2Zmc2V0KCBmdWxsV2lkdGgsIGZ1bGxIZWlnaHQsIHcgKiAwLCBoICogMSwgdywgaCApO1xuXHQgKiAgIC0tRS0tXG5cdCAqICAgY2FtZXJhLnNldE9mZnNldCggZnVsbFdpZHRoLCBmdWxsSGVpZ2h0LCB3ICogMSwgaCAqIDEsIHcsIGggKTtcblx0ICogICAtLUYtLVxuXHQgKiAgIGNhbWVyYS5zZXRPZmZzZXQoIGZ1bGxXaWR0aCwgZnVsbEhlaWdodCwgdyAqIDIsIGggKiAxLCB3LCBoICk7XG5cdCAqXG5cdCAqICAgTm90ZSB0aGVyZSBpcyBubyByZWFzb24gbW9uaXRvcnMgaGF2ZSB0byBiZSB0aGUgc2FtZSBzaXplIG9yIGluIGEgZ3JpZC5cblx0ICovXG5cdHNldFZpZXdPZmZzZXQ6IGZ1bmN0aW9uICggZnVsbFdpZHRoLCBmdWxsSGVpZ2h0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0ICkge1xuXG5cdFx0dGhpcy5hc3BlY3QgPSBmdWxsV2lkdGggLyBmdWxsSGVpZ2h0O1xuXG5cdFx0dGhpcy52aWV3ID0ge1xuXHRcdFx0ZnVsbFdpZHRoOiBmdWxsV2lkdGgsXG5cdFx0XHRmdWxsSGVpZ2h0OiBmdWxsSGVpZ2h0LFxuXHRcdFx0b2Zmc2V0WDogeCxcblx0XHRcdG9mZnNldFk6IHksXG5cdFx0XHR3aWR0aDogd2lkdGgsXG5cdFx0XHRoZWlnaHQ6IGhlaWdodFxuXHRcdH07XG5cblx0XHR0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtcblxuXHR9LFxuXG5cdGNsZWFyVmlld09mZnNldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy52aWV3ID0gbnVsbDtcblx0XHR0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtcblxuXHR9LFxuXG5cdHVwZGF0ZVByb2plY3Rpb25NYXRyaXg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBuZWFyID0gdGhpcy5uZWFyLFxuXHRcdFx0dG9wID0gbmVhciAqIE1hdGgudGFuKFxuXHRcdFx0XHRcdF9NYXRoLkRFRzJSQUQgKiAwLjUgKiB0aGlzLmZvdiApIC8gdGhpcy56b29tLFxuXHRcdFx0aGVpZ2h0ID0gMiAqIHRvcCxcblx0XHRcdHdpZHRoID0gdGhpcy5hc3BlY3QgKiBoZWlnaHQsXG5cdFx0XHRsZWZ0ID0gLSAwLjUgKiB3aWR0aCxcblx0XHRcdHZpZXcgPSB0aGlzLnZpZXc7XG5cblx0XHRpZiAoIHZpZXcgIT09IG51bGwgKSB7XG5cblx0XHRcdHZhciBmdWxsV2lkdGggPSB2aWV3LmZ1bGxXaWR0aCxcblx0XHRcdFx0ZnVsbEhlaWdodCA9IHZpZXcuZnVsbEhlaWdodDtcblxuXHRcdFx0bGVmdCArPSB2aWV3Lm9mZnNldFggKiB3aWR0aCAvIGZ1bGxXaWR0aDtcblx0XHRcdHRvcCAtPSB2aWV3Lm9mZnNldFkgKiBoZWlnaHQgLyBmdWxsSGVpZ2h0O1xuXHRcdFx0d2lkdGggKj0gdmlldy53aWR0aCAvIGZ1bGxXaWR0aDtcblx0XHRcdGhlaWdodCAqPSB2aWV3LmhlaWdodCAvIGZ1bGxIZWlnaHQ7XG5cblx0XHR9XG5cblx0XHR2YXIgc2tldyA9IHRoaXMuZmlsbU9mZnNldDtcblx0XHRpZiAoIHNrZXcgIT09IDAgKSBsZWZ0ICs9IG5lYXIgKiBza2V3IC8gdGhpcy5nZXRGaWxtV2lkdGgoKTtcblxuXHRcdHRoaXMucHJvamVjdGlvbk1hdHJpeC5tYWtlUGVyc3BlY3RpdmUoIGxlZnQsIGxlZnQgKyB3aWR0aCwgdG9wLCB0b3AgLSBoZWlnaHQsIG5lYXIsIHRoaXMuZmFyICk7XG5cblx0fSxcblxuXHR0b0pTT046IGZ1bmN0aW9uICggbWV0YSApIHtcblxuXHRcdHZhciBkYXRhID0gT2JqZWN0M0QucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzLCBtZXRhICk7XG5cblx0XHRkYXRhLm9iamVjdC5mb3YgPSB0aGlzLmZvdjtcblx0XHRkYXRhLm9iamVjdC56b29tID0gdGhpcy56b29tO1xuXG5cdFx0ZGF0YS5vYmplY3QubmVhciA9IHRoaXMubmVhcjtcblx0XHRkYXRhLm9iamVjdC5mYXIgPSB0aGlzLmZhcjtcblx0XHRkYXRhLm9iamVjdC5mb2N1cyA9IHRoaXMuZm9jdXM7XG5cblx0XHRkYXRhLm9iamVjdC5hc3BlY3QgPSB0aGlzLmFzcGVjdDtcblxuXHRcdGlmICggdGhpcy52aWV3ICE9PSBudWxsICkgZGF0YS5vYmplY3QudmlldyA9IE9iamVjdC5hc3NpZ24oIHt9LCB0aGlzLnZpZXcgKTtcblxuXHRcdGRhdGEub2JqZWN0LmZpbG1HYXVnZSA9IHRoaXMuZmlsbUdhdWdlO1xuXHRcdGRhdGEub2JqZWN0LmZpbG1PZmZzZXQgPSB0aGlzLmZpbG1PZmZzZXQ7XG5cblx0XHRyZXR1cm4gZGF0YTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBhcm9zZSAvIGh0dHA6Ly9naXRodWIuY29tL2Fyb3NlXG4gKi9cblxuZnVuY3Rpb24gT3J0aG9ncmFwaGljQ2FtZXJhKCBsZWZ0LCByaWdodCwgdG9wLCBib3R0b20sIG5lYXIsIGZhciApIHtcblxuXHRDYW1lcmEuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdPcnRob2dyYXBoaWNDYW1lcmEnO1xuXG5cdHRoaXMuem9vbSA9IDE7XG5cdHRoaXMudmlldyA9IG51bGw7XG5cblx0dGhpcy5sZWZ0ID0gbGVmdDtcblx0dGhpcy5yaWdodCA9IHJpZ2h0O1xuXHR0aGlzLnRvcCA9IHRvcDtcblx0dGhpcy5ib3R0b20gPSBib3R0b207XG5cblx0dGhpcy5uZWFyID0gKCBuZWFyICE9PSB1bmRlZmluZWQgKSA/IG5lYXIgOiAwLjE7XG5cdHRoaXMuZmFyID0gKCBmYXIgIT09IHVuZGVmaW5lZCApID8gZmFyIDogMjAwMDtcblxuXHR0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtcblxufVxuXG5PcnRob2dyYXBoaWNDYW1lcmEucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggQ2FtZXJhLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IE9ydGhvZ3JhcGhpY0NhbWVyYSxcblxuXHRpc09ydGhvZ3JhcGhpY0NhbWVyYTogdHJ1ZSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRcdENhbWVyYS5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHRcdHRoaXMubGVmdCA9IHNvdXJjZS5sZWZ0O1xuXHRcdHRoaXMucmlnaHQgPSBzb3VyY2UucmlnaHQ7XG5cdFx0dGhpcy50b3AgPSBzb3VyY2UudG9wO1xuXHRcdHRoaXMuYm90dG9tID0gc291cmNlLmJvdHRvbTtcblx0XHR0aGlzLm5lYXIgPSBzb3VyY2UubmVhcjtcblx0XHR0aGlzLmZhciA9IHNvdXJjZS5mYXI7XG5cblx0XHR0aGlzLnpvb20gPSBzb3VyY2Uuem9vbTtcblx0XHR0aGlzLnZpZXcgPSBzb3VyY2UudmlldyA9PT0gbnVsbCA/IG51bGwgOiBPYmplY3QuYXNzaWduKCB7fSwgc291cmNlLnZpZXcgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0Vmlld09mZnNldDogZnVuY3Rpb24oIGZ1bGxXaWR0aCwgZnVsbEhlaWdodCwgeCwgeSwgd2lkdGgsIGhlaWdodCApIHtcblxuXHRcdHRoaXMudmlldyA9IHtcblx0XHRcdGZ1bGxXaWR0aDogZnVsbFdpZHRoLFxuXHRcdFx0ZnVsbEhlaWdodDogZnVsbEhlaWdodCxcblx0XHRcdG9mZnNldFg6IHgsXG5cdFx0XHRvZmZzZXRZOiB5LFxuXHRcdFx0d2lkdGg6IHdpZHRoLFxuXHRcdFx0aGVpZ2h0OiBoZWlnaHRcblx0XHR9O1xuXG5cdFx0dGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XG5cblx0fSxcblxuXHRjbGVhclZpZXdPZmZzZXQ6IGZ1bmN0aW9uKCkge1xuXG5cdFx0dGhpcy52aWV3ID0gbnVsbDtcblx0XHR0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtcblxuXHR9LFxuXG5cdHVwZGF0ZVByb2plY3Rpb25NYXRyaXg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBkeCA9ICggdGhpcy5yaWdodCAtIHRoaXMubGVmdCApIC8gKCAyICogdGhpcy56b29tICk7XG5cdFx0dmFyIGR5ID0gKCB0aGlzLnRvcCAtIHRoaXMuYm90dG9tICkgLyAoIDIgKiB0aGlzLnpvb20gKTtcblx0XHR2YXIgY3ggPSAoIHRoaXMucmlnaHQgKyB0aGlzLmxlZnQgKSAvIDI7XG5cdFx0dmFyIGN5ID0gKCB0aGlzLnRvcCArIHRoaXMuYm90dG9tICkgLyAyO1xuXG5cdFx0dmFyIGxlZnQgPSBjeCAtIGR4O1xuXHRcdHZhciByaWdodCA9IGN4ICsgZHg7XG5cdFx0dmFyIHRvcCA9IGN5ICsgZHk7XG5cdFx0dmFyIGJvdHRvbSA9IGN5IC0gZHk7XG5cblx0XHRpZiAoIHRoaXMudmlldyAhPT0gbnVsbCApIHtcblxuXHRcdFx0dmFyIHpvb21XID0gdGhpcy56b29tIC8gKCB0aGlzLnZpZXcud2lkdGggLyB0aGlzLnZpZXcuZnVsbFdpZHRoICk7XG5cdFx0XHR2YXIgem9vbUggPSB0aGlzLnpvb20gLyAoIHRoaXMudmlldy5oZWlnaHQgLyB0aGlzLnZpZXcuZnVsbEhlaWdodCApO1xuXHRcdFx0dmFyIHNjYWxlVyA9ICggdGhpcy5yaWdodCAtIHRoaXMubGVmdCApIC8gdGhpcy52aWV3LndpZHRoO1xuXHRcdFx0dmFyIHNjYWxlSCA9ICggdGhpcy50b3AgLSB0aGlzLmJvdHRvbSApIC8gdGhpcy52aWV3LmhlaWdodDtcblxuXHRcdFx0bGVmdCArPSBzY2FsZVcgKiAoIHRoaXMudmlldy5vZmZzZXRYIC8gem9vbVcgKTtcblx0XHRcdHJpZ2h0ID0gbGVmdCArIHNjYWxlVyAqICggdGhpcy52aWV3LndpZHRoIC8gem9vbVcgKTtcblx0XHRcdHRvcCAtPSBzY2FsZUggKiAoIHRoaXMudmlldy5vZmZzZXRZIC8gem9vbUggKTtcblx0XHRcdGJvdHRvbSA9IHRvcCAtIHNjYWxlSCAqICggdGhpcy52aWV3LmhlaWdodCAvIHpvb21IICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLnByb2plY3Rpb25NYXRyaXgubWFrZU9ydGhvZ3JhcGhpYyggbGVmdCwgcmlnaHQsIHRvcCwgYm90dG9tLCB0aGlzLm5lYXIsIHRoaXMuZmFyICk7XG5cblx0fSxcblxuXHR0b0pTT046IGZ1bmN0aW9uICggbWV0YSApIHtcblxuXHRcdHZhciBkYXRhID0gT2JqZWN0M0QucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzLCBtZXRhICk7XG5cblx0XHRkYXRhLm9iamVjdC56b29tID0gdGhpcy56b29tO1xuXHRcdGRhdGEub2JqZWN0LmxlZnQgPSB0aGlzLmxlZnQ7XG5cdFx0ZGF0YS5vYmplY3QucmlnaHQgPSB0aGlzLnJpZ2h0O1xuXHRcdGRhdGEub2JqZWN0LnRvcCA9IHRoaXMudG9wO1xuXHRcdGRhdGEub2JqZWN0LmJvdHRvbSA9IHRoaXMuYm90dG9tO1xuXHRcdGRhdGEub2JqZWN0Lm5lYXIgPSB0aGlzLm5lYXI7XG5cdFx0ZGF0YS5vYmplY3QuZmFyID0gdGhpcy5mYXI7XG5cblx0XHRpZiAoIHRoaXMudmlldyAhPT0gbnVsbCApIGRhdGEub2JqZWN0LnZpZXcgPSBPYmplY3QuYXNzaWduKCB7fSwgdGhpcy52aWV3ICk7XG5cblx0XHRyZXR1cm4gZGF0YTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIFdlYkdMQXR0cmlidXRlcyggZ2wgKSB7XG5cblx0dmFyIGJ1ZmZlcnMgPSB7fTtcblxuXHRmdW5jdGlvbiBjcmVhdGVCdWZmZXIoIGF0dHJpYnV0ZSwgYnVmZmVyVHlwZSApIHtcblxuXHRcdHZhciBhcnJheSA9IGF0dHJpYnV0ZS5hcnJheTtcblx0XHR2YXIgdXNhZ2UgPSBhdHRyaWJ1dGUuZHluYW1pYyA/IGdsLkRZTkFNSUNfRFJBVyA6IGdsLlNUQVRJQ19EUkFXO1xuXG5cdFx0dmFyIGJ1ZmZlciA9IGdsLmNyZWF0ZUJ1ZmZlcigpO1xuXG5cdFx0Z2wuYmluZEJ1ZmZlciggYnVmZmVyVHlwZSwgYnVmZmVyICk7XG5cdFx0Z2wuYnVmZmVyRGF0YSggYnVmZmVyVHlwZSwgYXJyYXksIHVzYWdlICk7XG5cblx0XHRhdHRyaWJ1dGUub25VcGxvYWRDYWxsYmFjaygpO1xuXG5cdFx0dmFyIHR5cGUgPSBnbC5GTE9BVDtcblxuXHRcdGlmICggYXJyYXkgaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXkgKSB7XG5cblx0XHRcdHR5cGUgPSBnbC5GTE9BVDtcblxuXHRcdH0gZWxzZSBpZiAoIGFycmF5IGluc3RhbmNlb2YgRmxvYXQ2NEFycmF5ICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oIFwiVW5zdXBwb3J0ZWQgZGF0YSBidWZmZXIgZm9ybWF0OiBGbG9hdDY0QXJyYXlcIiApO1xuXG5cdFx0fSBlbHNlIGlmICggYXJyYXkgaW5zdGFuY2VvZiBVaW50MTZBcnJheSApIHtcblxuXHRcdFx0dHlwZSA9IGdsLlVOU0lHTkVEX1NIT1JUO1xuXG5cdFx0fSBlbHNlIGlmICggYXJyYXkgaW5zdGFuY2VvZiBJbnQxNkFycmF5ICkge1xuXG5cdFx0XHR0eXBlID0gZ2wuU0hPUlQ7XG5cblx0XHR9IGVsc2UgaWYgKCBhcnJheSBpbnN0YW5jZW9mIFVpbnQzMkFycmF5ICkge1xuXG5cdFx0XHR0eXBlID0gZ2wuVU5TSUdORURfSU5UO1xuXG5cdFx0fSBlbHNlIGlmICggYXJyYXkgaW5zdGFuY2VvZiBJbnQzMkFycmF5ICkge1xuXG5cdFx0XHR0eXBlID0gZ2wuSU5UO1xuXG5cdFx0fSBlbHNlIGlmICggYXJyYXkgaW5zdGFuY2VvZiBJbnQ4QXJyYXkgKSB7XG5cblx0XHRcdHR5cGUgPSBnbC5CWVRFO1xuXG5cdFx0fSBlbHNlIGlmICggYXJyYXkgaW5zdGFuY2VvZiBVaW50OEFycmF5ICkge1xuXG5cdFx0XHR0eXBlID0gZ2wuVU5TSUdORURfQllURTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB7XG5cdFx0XHRidWZmZXI6IGJ1ZmZlcixcblx0XHRcdHR5cGU6IHR5cGUsXG5cdFx0XHRieXRlc1BlckVsZW1lbnQ6IGFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULFxuXHRcdFx0dmVyc2lvbjogYXR0cmlidXRlLnZlcnNpb25cblx0XHR9O1xuXG5cdH1cblxuXHRmdW5jdGlvbiB1cGRhdGVCdWZmZXIoIGJ1ZmZlciwgYXR0cmlidXRlLCBidWZmZXJUeXBlICkge1xuXG5cdFx0dmFyIGFycmF5ID0gYXR0cmlidXRlLmFycmF5O1xuXHRcdHZhciB1cGRhdGVSYW5nZSA9IGF0dHJpYnV0ZS51cGRhdGVSYW5nZTtcblxuXHRcdGdsLmJpbmRCdWZmZXIoIGJ1ZmZlclR5cGUsIGJ1ZmZlciApO1xuXG5cdFx0aWYgKCBhdHRyaWJ1dGUuZHluYW1pYyA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdGdsLmJ1ZmZlckRhdGEoIGJ1ZmZlclR5cGUsIGFycmF5LCBnbC5TVEFUSUNfRFJBVyApO1xuXG5cdFx0fSBlbHNlIGlmICggdXBkYXRlUmFuZ2UuY291bnQgPT09IC0gMSApIHtcblxuXHRcdFx0Ly8gTm90IHVzaW5nIHVwZGF0ZSByYW5nZXNcblxuXHRcdFx0Z2wuYnVmZmVyU3ViRGF0YSggYnVmZmVyVHlwZSwgMCwgYXJyYXkgKTtcblxuXHRcdH0gZWxzZSBpZiAoIHVwZGF0ZVJhbmdlLmNvdW50ID09PSAwICkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuV2ViR0xPYmplY3RzLnVwZGF0ZUJ1ZmZlcjogZHluYW1pYyBUSFJFRS5CdWZmZXJBdHRyaWJ1dGUgbWFya2VkIGFzIG5lZWRzVXBkYXRlIGJ1dCB1cGRhdGVSYW5nZS5jb3VudCBpcyAwLCBlbnN1cmUgeW91IGFyZSB1c2luZyBzZXQgbWV0aG9kcyBvciB1cGRhdGluZyBtYW51YWxseS4nICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRnbC5idWZmZXJTdWJEYXRhKCBidWZmZXJUeXBlLCB1cGRhdGVSYW5nZS5vZmZzZXQgKiBhcnJheS5CWVRFU19QRVJfRUxFTUVOVCxcblx0XHRcdFx0YXJyYXkuc3ViYXJyYXkoIHVwZGF0ZVJhbmdlLm9mZnNldCwgdXBkYXRlUmFuZ2Uub2Zmc2V0ICsgdXBkYXRlUmFuZ2UuY291bnQgKSApO1xuXG5cdFx0XHR1cGRhdGVSYW5nZS5jb3VudCA9IDA7IC8vIHJlc2V0IHJhbmdlXG5cblx0XHR9XG5cblx0fVxuXG5cdC8vXG5cblx0ZnVuY3Rpb24gZ2V0KCBhdHRyaWJ1dGUgKSB7XG5cblx0XHRpZiAoIGF0dHJpYnV0ZS5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlICkgYXR0cmlidXRlID0gYXR0cmlidXRlLmRhdGE7XG5cblx0XHRyZXR1cm4gYnVmZmVyc1sgYXR0cmlidXRlLnV1aWQgXTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVtb3ZlKCBhdHRyaWJ1dGUgKSB7XG5cblx0XHR2YXIgZGF0YSA9IGJ1ZmZlcnNbIGF0dHJpYnV0ZS51dWlkIF07XG5cblx0XHRpZiAoIGRhdGEgKSB7XG5cblx0XHRcdGdsLmRlbGV0ZUJ1ZmZlciggZGF0YS5idWZmZXIgKTtcblxuXHRcdFx0ZGVsZXRlIGJ1ZmZlcnNbIGF0dHJpYnV0ZS51dWlkIF07XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHVwZGF0ZSggYXR0cmlidXRlLCBidWZmZXJUeXBlICkge1xuXG5cdFx0aWYgKCBhdHRyaWJ1dGUuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSApIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZS5kYXRhO1xuXG5cdFx0dmFyIGRhdGEgPSBidWZmZXJzWyBhdHRyaWJ1dGUudXVpZCBdO1xuXG5cdFx0aWYgKCBkYXRhID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGJ1ZmZlcnNbIGF0dHJpYnV0ZS51dWlkIF0gPSBjcmVhdGVCdWZmZXIoIGF0dHJpYnV0ZSwgYnVmZmVyVHlwZSApO1xuXG5cdFx0fSBlbHNlIGlmICggZGF0YS52ZXJzaW9uIDwgYXR0cmlidXRlLnZlcnNpb24gKSB7XG5cblx0XHRcdHVwZGF0ZUJ1ZmZlciggZGF0YS5idWZmZXIsIGF0dHJpYnV0ZSwgYnVmZmVyVHlwZSApO1xuXG5cdFx0XHRkYXRhLnZlcnNpb24gPSBhdHRyaWJ1dGUudmVyc2lvbjtcblxuXHRcdH1cblxuXHR9XG5cblx0cmV0dXJuIHtcblxuXHRcdGdldDogZ2V0LFxuXHRcdHJlbW92ZTogcmVtb3ZlLFxuXHRcdHVwZGF0ZTogdXBkYXRlXG5cblx0fTtcblxufVxuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gcGFpbnRlclNvcnRTdGFibGUoIGEsIGIgKSB7XG5cblx0aWYgKCBhLnJlbmRlck9yZGVyICE9PSBiLnJlbmRlck9yZGVyICkge1xuXG5cdFx0cmV0dXJuIGEucmVuZGVyT3JkZXIgLSBiLnJlbmRlck9yZGVyO1xuXG5cdH0gZWxzZSBpZiAoIGEucHJvZ3JhbSAmJiBiLnByb2dyYW0gJiYgYS5wcm9ncmFtICE9PSBiLnByb2dyYW0gKSB7XG5cblx0XHRyZXR1cm4gYS5wcm9ncmFtLmlkIC0gYi5wcm9ncmFtLmlkO1xuXG5cdH0gZWxzZSBpZiAoIGEubWF0ZXJpYWwuaWQgIT09IGIubWF0ZXJpYWwuaWQgKSB7XG5cblx0XHRyZXR1cm4gYS5tYXRlcmlhbC5pZCAtIGIubWF0ZXJpYWwuaWQ7XG5cblx0fSBlbHNlIGlmICggYS56ICE9PSBiLnogKSB7XG5cblx0XHRyZXR1cm4gYS56IC0gYi56O1xuXG5cdH0gZWxzZSB7XG5cblx0XHRyZXR1cm4gYS5pZCAtIGIuaWQ7XG5cblx0fVxuXG59XG5cbmZ1bmN0aW9uIHJldmVyc2VQYWludGVyU29ydFN0YWJsZSggYSwgYiApIHtcblxuXHRpZiAoIGEucmVuZGVyT3JkZXIgIT09IGIucmVuZGVyT3JkZXIgKSB7XG5cblx0XHRyZXR1cm4gYS5yZW5kZXJPcmRlciAtIGIucmVuZGVyT3JkZXI7XG5cblx0fSBpZiAoIGEueiAhPT0gYi56ICkge1xuXG5cdFx0cmV0dXJuIGIueiAtIGEuejtcblxuXHR9IGVsc2Uge1xuXG5cdFx0cmV0dXJuIGEuaWQgLSBiLmlkO1xuXG5cdH1cblxufVxuXG5mdW5jdGlvbiBXZWJHTFJlbmRlckxpc3QoKSB7XG5cblx0dmFyIG9wYXF1ZSA9IFtdO1xuXHR2YXIgb3BhcXVlTGFzdEluZGV4ID0gLSAxO1xuXG5cdHZhciB0cmFuc3BhcmVudCA9IFtdO1xuXHR2YXIgdHJhbnNwYXJlbnRMYXN0SW5kZXggPSAtIDE7XG5cblx0ZnVuY3Rpb24gaW5pdCgpIHtcblxuXHRcdG9wYXF1ZUxhc3RJbmRleCA9IC0gMTtcblx0XHR0cmFuc3BhcmVudExhc3RJbmRleCA9IC0gMTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gcHVzaCggb2JqZWN0LCBnZW9tZXRyeSwgbWF0ZXJpYWwsIHosIGdyb3VwICkge1xuXG5cdFx0dmFyIGFycmF5LCBpbmRleDtcblxuXHRcdC8vIGFsbG9jYXRlIHRoZSBuZXh0IHBvc2l0aW9uIGluIHRoZSBhcHByb3ByaWF0ZSBhcnJheVxuXG5cdFx0aWYgKCBtYXRlcmlhbC50cmFuc3BhcmVudCApIHtcblxuXHRcdFx0YXJyYXkgPSB0cmFuc3BhcmVudDtcblx0XHRcdGluZGV4ID0gKysgdHJhbnNwYXJlbnRMYXN0SW5kZXg7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRhcnJheSA9IG9wYXF1ZTtcblx0XHRcdGluZGV4ID0gKysgb3BhcXVlTGFzdEluZGV4O1xuXG5cdFx0fVxuXG5cdFx0Ly8gcmVjeWNsZSBleGlzdGluZyByZW5kZXIgaXRlbSBvciBncm93IHRoZSBhcnJheVxuXG5cdFx0dmFyIHJlbmRlckl0ZW0gPSBhcnJheVsgaW5kZXggXTtcblxuXHRcdGlmICggcmVuZGVySXRlbSApIHtcblxuXHRcdFx0cmVuZGVySXRlbS5pZCA9IG9iamVjdC5pZDtcblx0XHRcdHJlbmRlckl0ZW0ub2JqZWN0ID0gb2JqZWN0O1xuXHRcdFx0cmVuZGVySXRlbS5nZW9tZXRyeSA9IGdlb21ldHJ5O1xuXHRcdFx0cmVuZGVySXRlbS5tYXRlcmlhbCA9IG1hdGVyaWFsO1xuXHRcdFx0cmVuZGVySXRlbS5wcm9ncmFtID0gbWF0ZXJpYWwucHJvZ3JhbTtcblx0XHRcdHJlbmRlckl0ZW0ucmVuZGVyT3JkZXIgPSBvYmplY3QucmVuZGVyT3JkZXI7XG5cdFx0XHRyZW5kZXJJdGVtLnogPSB6O1xuXHRcdFx0cmVuZGVySXRlbS5ncm91cCA9IGdyb3VwO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0cmVuZGVySXRlbSA9IHtcblx0XHRcdFx0aWQ6IG9iamVjdC5pZCxcblx0XHRcdFx0b2JqZWN0OiBvYmplY3QsXG5cdFx0XHRcdGdlb21ldHJ5OiBnZW9tZXRyeSxcblx0XHRcdFx0bWF0ZXJpYWw6IG1hdGVyaWFsLFxuXHRcdFx0XHRwcm9ncmFtOiBtYXRlcmlhbC5wcm9ncmFtLFxuXHRcdFx0XHRyZW5kZXJPcmRlcjogb2JqZWN0LnJlbmRlck9yZGVyLFxuXHRcdFx0XHR6OiB6LFxuXHRcdFx0XHRncm91cDogZ3JvdXBcblx0XHRcdH07XG5cblx0XHRcdC8vIGFzc2VydCggaW5kZXggPT09IGFycmF5Lmxlbmd0aCApO1xuXHRcdFx0YXJyYXkucHVzaCggcmVuZGVySXRlbSApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBmaW5pc2goKSB7XG5cblx0XHRvcGFxdWUubGVuZ3RoID0gb3BhcXVlTGFzdEluZGV4ICsgMTtcblx0XHR0cmFuc3BhcmVudC5sZW5ndGggPSB0cmFuc3BhcmVudExhc3RJbmRleCArIDE7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHNvcnQoKSB7XG5cblx0XHRvcGFxdWUuc29ydCggcGFpbnRlclNvcnRTdGFibGUgKTtcblx0XHR0cmFuc3BhcmVudC5zb3J0KCByZXZlcnNlUGFpbnRlclNvcnRTdGFibGUgKTtcblxuXHR9XG5cblx0cmV0dXJuIHtcblx0XHRvcGFxdWU6IG9wYXF1ZSxcblx0XHR0cmFuc3BhcmVudDogdHJhbnNwYXJlbnQsXG5cblx0XHRpbml0OiBpbml0LFxuXHRcdHB1c2g6IHB1c2gsXG5cdFx0ZmluaXNoOiBmaW5pc2gsXG5cblx0XHRzb3J0OiBzb3J0XG5cdH07XG5cbn1cblxuZnVuY3Rpb24gV2ViR0xSZW5kZXJMaXN0cygpIHtcblxuXHR2YXIgbGlzdHMgPSB7fTtcblxuXHRmdW5jdGlvbiBnZXQoIHNjZW5lLCBjYW1lcmEgKSB7XG5cblx0XHR2YXIgaGFzaCA9IHNjZW5lLmlkICsgJywnICsgY2FtZXJhLmlkO1xuXHRcdHZhciBsaXN0ID0gbGlzdHNbIGhhc2ggXTtcblxuXHRcdGlmICggbGlzdCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHQvLyBjb25zb2xlLmxvZyggJ1RIUkVFLldlYkdMUmVuZGVyTGlzdHM6JywgaGFzaCApO1xuXG5cdFx0XHRsaXN0ID0gbmV3IFdlYkdMUmVuZGVyTGlzdCgpO1xuXHRcdFx0bGlzdHNbIGhhc2ggXSA9IGxpc3Q7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gbGlzdDtcblxuXHR9XG5cblx0ZnVuY3Rpb24gZGlzcG9zZSgpIHtcblxuXHRcdGxpc3RzID0ge307XG5cblx0fVxuXG5cdHJldHVybiB7XG5cdFx0Z2V0OiBnZXQsXG5cdFx0ZGlzcG9zZTogZGlzcG9zZVxuXHR9O1xuXG59XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBXZWJHTEluZGV4ZWRCdWZmZXJSZW5kZXJlciggZ2wsIGV4dGVuc2lvbnMsIGluZm9SZW5kZXIgKSB7XG5cblx0dmFyIG1vZGU7XG5cblx0ZnVuY3Rpb24gc2V0TW9kZSggdmFsdWUgKSB7XG5cblx0XHRtb2RlID0gdmFsdWU7XG5cblx0fVxuXG5cdHZhciB0eXBlLCBzaXplO1xuXG5cdGZ1bmN0aW9uIHNldEluZGV4KCBpbmRleCApIHtcblxuXHRcdGlmICggaW5kZXguYXJyYXkgaW5zdGFuY2VvZiBVaW50MzJBcnJheSAmJiBleHRlbnNpb25zLmdldCggJ09FU19lbGVtZW50X2luZGV4X3VpbnQnICkgKSB7XG5cblx0XHRcdHR5cGUgPSBnbC5VTlNJR05FRF9JTlQ7XG5cdFx0XHRzaXplID0gNDtcblxuXHRcdH0gZWxzZSBpZiAoIGluZGV4LmFycmF5IGluc3RhbmNlb2YgVWludDE2QXJyYXkgKSB7XG5cblx0XHRcdHR5cGUgPSBnbC5VTlNJR05FRF9TSE9SVDtcblx0XHRcdHNpemUgPSAyO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dHlwZSA9IGdsLlVOU0lHTkVEX0JZVEU7XG5cdFx0XHRzaXplID0gMTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVuZGVyKCBzdGFydCwgY291bnQgKSB7XG5cblx0XHRnbC5kcmF3RWxlbWVudHMoIG1vZGUsIGNvdW50LCB0eXBlLCBzdGFydCAqIHNpemUgKTtcblxuXHRcdGluZm9SZW5kZXIuY2FsbHMgKys7XG5cdFx0aW5mb1JlbmRlci52ZXJ0aWNlcyArPSBjb3VudDtcblxuXHRcdGlmICggbW9kZSA9PT0gZ2wuVFJJQU5HTEVTICkgaW5mb1JlbmRlci5mYWNlcyArPSBjb3VudCAvIDM7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlbmRlckluc3RhbmNlcyggZ2VvbWV0cnksIHN0YXJ0LCBjb3VudCApIHtcblxuXHRcdHZhciBleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ0FOR0xFX2luc3RhbmNlZF9hcnJheXMnICk7XG5cblx0XHRpZiAoIGV4dGVuc2lvbiA9PT0gbnVsbCApIHtcblxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdMSW5kZXhlZEJ1ZmZlclJlbmRlcmVyOiB1c2luZyBUSFJFRS5JbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSBidXQgaGFyZHdhcmUgZG9lcyBub3Qgc3VwcG9ydCBleHRlbnNpb24gQU5HTEVfaW5zdGFuY2VkX2FycmF5cy4nICk7XG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHRleHRlbnNpb24uZHJhd0VsZW1lbnRzSW5zdGFuY2VkQU5HTEUoIG1vZGUsIGNvdW50LCB0eXBlLCBzdGFydCAqIHNpemUsIGdlb21ldHJ5Lm1heEluc3RhbmNlZENvdW50ICk7XG5cblx0XHRpbmZvUmVuZGVyLmNhbGxzICsrO1xuXHRcdGluZm9SZW5kZXIudmVydGljZXMgKz0gY291bnQgKiBnZW9tZXRyeS5tYXhJbnN0YW5jZWRDb3VudDtcblxuXHRcdGlmICggbW9kZSA9PT0gZ2wuVFJJQU5HTEVTICkgaW5mb1JlbmRlci5mYWNlcyArPSBnZW9tZXRyeS5tYXhJbnN0YW5jZWRDb3VudCAqIGNvdW50IC8gMztcblxuXHR9XG5cblx0Ly9cblxuXHR0aGlzLnNldE1vZGUgPSBzZXRNb2RlO1xuXHR0aGlzLnNldEluZGV4ID0gc2V0SW5kZXg7XG5cdHRoaXMucmVuZGVyID0gcmVuZGVyO1xuXHR0aGlzLnJlbmRlckluc3RhbmNlcyA9IHJlbmRlckluc3RhbmNlcztcblxufVxuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gV2ViR0xCdWZmZXJSZW5kZXJlciggZ2wsIGV4dGVuc2lvbnMsIGluZm9SZW5kZXIgKSB7XG5cblx0dmFyIG1vZGU7XG5cblx0ZnVuY3Rpb24gc2V0TW9kZSggdmFsdWUgKSB7XG5cblx0XHRtb2RlID0gdmFsdWU7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlbmRlciggc3RhcnQsIGNvdW50ICkge1xuXG5cdFx0Z2wuZHJhd0FycmF5cyggbW9kZSwgc3RhcnQsIGNvdW50ICk7XG5cblx0XHRpbmZvUmVuZGVyLmNhbGxzICsrO1xuXHRcdGluZm9SZW5kZXIudmVydGljZXMgKz0gY291bnQ7XG5cblx0XHRpZiAoIG1vZGUgPT09IGdsLlRSSUFOR0xFUyApIGluZm9SZW5kZXIuZmFjZXMgKz0gY291bnQgLyAzO1xuXG5cdH1cblxuXHRmdW5jdGlvbiByZW5kZXJJbnN0YW5jZXMoIGdlb21ldHJ5LCBzdGFydCwgY291bnQgKSB7XG5cblx0XHR2YXIgZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdBTkdMRV9pbnN0YW5jZWRfYXJyYXlzJyApO1xuXG5cdFx0aWYgKCBleHRlbnNpb24gPT09IG51bGwgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTEJ1ZmZlclJlbmRlcmVyOiB1c2luZyBUSFJFRS5JbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSBidXQgaGFyZHdhcmUgZG9lcyBub3Qgc3VwcG9ydCBleHRlbnNpb24gQU5HTEVfaW5zdGFuY2VkX2FycmF5cy4nICk7XG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHR2YXIgcG9zaXRpb24gPSBnZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uO1xuXG5cdFx0aWYgKCBwb3NpdGlvbi5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlICkge1xuXG5cdFx0XHRjb3VudCA9IHBvc2l0aW9uLmRhdGEuY291bnQ7XG5cblx0XHRcdGV4dGVuc2lvbi5kcmF3QXJyYXlzSW5zdGFuY2VkQU5HTEUoIG1vZGUsIDAsIGNvdW50LCBnZW9tZXRyeS5tYXhJbnN0YW5jZWRDb3VudCApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0ZXh0ZW5zaW9uLmRyYXdBcnJheXNJbnN0YW5jZWRBTkdMRSggbW9kZSwgc3RhcnQsIGNvdW50LCBnZW9tZXRyeS5tYXhJbnN0YW5jZWRDb3VudCApO1xuXG5cdFx0fVxuXG5cdFx0aW5mb1JlbmRlci5jYWxscyArKztcblx0XHRpbmZvUmVuZGVyLnZlcnRpY2VzICs9IGNvdW50ICogZ2VvbWV0cnkubWF4SW5zdGFuY2VkQ291bnQ7XG5cblx0XHRpZiAoIG1vZGUgPT09IGdsLlRSSUFOR0xFUyApIGluZm9SZW5kZXIuZmFjZXMgKz0gZ2VvbWV0cnkubWF4SW5zdGFuY2VkQ291bnQgKiBjb3VudCAvIDM7XG5cblx0fVxuXG5cdC8vXG5cblx0dGhpcy5zZXRNb2RlID0gc2V0TW9kZTtcblx0dGhpcy5yZW5kZXIgPSByZW5kZXI7XG5cdHRoaXMucmVuZGVySW5zdGFuY2VzID0gcmVuZGVySW5zdGFuY2VzO1xuXG59XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBXZWJHTEdlb21ldHJpZXMoIGdsLCBhdHRyaWJ1dGVzLCBpbmZvTWVtb3J5ICkge1xuXG5cdHZhciBnZW9tZXRyaWVzID0ge307XG5cdHZhciB3aXJlZnJhbWVBdHRyaWJ1dGVzID0ge307XG5cblx0ZnVuY3Rpb24gb25HZW9tZXRyeURpc3Bvc2UoIGV2ZW50ICkge1xuXG5cdFx0dmFyIGdlb21ldHJ5ID0gZXZlbnQudGFyZ2V0O1xuXHRcdHZhciBidWZmZXJnZW9tZXRyeSA9IGdlb21ldHJpZXNbIGdlb21ldHJ5LmlkIF07XG5cblx0XHRpZiAoIGJ1ZmZlcmdlb21ldHJ5LmluZGV4ICE9PSBudWxsICkge1xuXG5cdFx0XHRhdHRyaWJ1dGVzLnJlbW92ZSggYnVmZmVyZ2VvbWV0cnkuaW5kZXggKTtcblxuXHRcdH1cblxuXHRcdGZvciAoIHZhciBuYW1lIGluIGJ1ZmZlcmdlb21ldHJ5LmF0dHJpYnV0ZXMgKSB7XG5cblx0XHRcdGF0dHJpYnV0ZXMucmVtb3ZlKCBidWZmZXJnZW9tZXRyeS5hdHRyaWJ1dGVzWyBuYW1lIF0gKTtcblxuXHRcdH1cblxuXHRcdGdlb21ldHJ5LnJlbW92ZUV2ZW50TGlzdGVuZXIoICdkaXNwb3NlJywgb25HZW9tZXRyeURpc3Bvc2UgKTtcblxuXHRcdGRlbGV0ZSBnZW9tZXRyaWVzWyBnZW9tZXRyeS5pZCBdO1xuXG5cdFx0Ly8gVE9ETyBSZW1vdmUgZHVwbGljYXRlIGNvZGVcblxuXHRcdHZhciBhdHRyaWJ1dGUgPSB3aXJlZnJhbWVBdHRyaWJ1dGVzWyBnZW9tZXRyeS5pZCBdO1xuXG5cdFx0aWYgKCBhdHRyaWJ1dGUgKSB7XG5cblx0XHRcdGF0dHJpYnV0ZXMucmVtb3ZlKCBhdHRyaWJ1dGUgKTtcblx0XHRcdGRlbGV0ZSB3aXJlZnJhbWVBdHRyaWJ1dGVzWyBnZW9tZXRyeS5pZCBdO1xuXG5cdFx0fVxuXG5cdFx0YXR0cmlidXRlID0gd2lyZWZyYW1lQXR0cmlidXRlc1sgYnVmZmVyZ2VvbWV0cnkuaWQgXTtcblxuXHRcdGlmICggYXR0cmlidXRlICkge1xuXG5cdFx0XHRhdHRyaWJ1dGVzLnJlbW92ZSggYXR0cmlidXRlICk7XG5cdFx0XHRkZWxldGUgd2lyZWZyYW1lQXR0cmlidXRlc1sgYnVmZmVyZ2VvbWV0cnkuaWQgXTtcblxuXHRcdH1cblxuXHRcdC8vXG5cblx0XHRpbmZvTWVtb3J5Lmdlb21ldHJpZXMgLS07XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGdldCggb2JqZWN0LCBnZW9tZXRyeSApIHtcblxuXHRcdHZhciBidWZmZXJnZW9tZXRyeSA9IGdlb21ldHJpZXNbIGdlb21ldHJ5LmlkIF07XG5cblx0XHRpZiAoIGJ1ZmZlcmdlb21ldHJ5ICkgcmV0dXJuIGJ1ZmZlcmdlb21ldHJ5O1xuXG5cdFx0Z2VvbWV0cnkuYWRkRXZlbnRMaXN0ZW5lciggJ2Rpc3Bvc2UnLCBvbkdlb21ldHJ5RGlzcG9zZSApO1xuXG5cdFx0aWYgKCBnZW9tZXRyeS5pc0J1ZmZlckdlb21ldHJ5ICkge1xuXG5cdFx0XHRidWZmZXJnZW9tZXRyeSA9IGdlb21ldHJ5O1xuXG5cdFx0fSBlbHNlIGlmICggZ2VvbWV0cnkuaXNHZW9tZXRyeSApIHtcblxuXHRcdFx0aWYgKCBnZW9tZXRyeS5fYnVmZmVyR2VvbWV0cnkgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRnZW9tZXRyeS5fYnVmZmVyR2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKS5zZXRGcm9tT2JqZWN0KCBvYmplY3QgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRidWZmZXJnZW9tZXRyeSA9IGdlb21ldHJ5Ll9idWZmZXJHZW9tZXRyeTtcblxuXHRcdH1cblxuXHRcdGdlb21ldHJpZXNbIGdlb21ldHJ5LmlkIF0gPSBidWZmZXJnZW9tZXRyeTtcblxuXHRcdGluZm9NZW1vcnkuZ2VvbWV0cmllcyArKztcblxuXHRcdHJldHVybiBidWZmZXJnZW9tZXRyeTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gdXBkYXRlKCBnZW9tZXRyeSApIHtcblxuXHRcdHZhciBpbmRleCA9IGdlb21ldHJ5LmluZGV4O1xuXHRcdHZhciBnZW9tZXRyeUF0dHJpYnV0ZXMgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzO1xuXG5cdFx0aWYgKCBpbmRleCAhPT0gbnVsbCApIHtcblxuXHRcdFx0YXR0cmlidXRlcy51cGRhdGUoIGluZGV4LCBnbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiApO1xuXG5cdFx0fVxuXG5cdFx0Zm9yICggdmFyIG5hbWUgaW4gZ2VvbWV0cnlBdHRyaWJ1dGVzICkge1xuXG5cdFx0XHRhdHRyaWJ1dGVzLnVwZGF0ZSggZ2VvbWV0cnlBdHRyaWJ1dGVzWyBuYW1lIF0sIGdsLkFSUkFZX0JVRkZFUiApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gbW9ycGggdGFyZ2V0c1xuXG5cdFx0dmFyIG1vcnBoQXR0cmlidXRlcyA9IGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcztcblxuXHRcdGZvciAoIHZhciBuYW1lIGluIG1vcnBoQXR0cmlidXRlcyApIHtcblxuXHRcdFx0dmFyIGFycmF5ID0gbW9ycGhBdHRyaWJ1dGVzWyBuYW1lIF07XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGFycmF5Lmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0YXR0cmlidXRlcy51cGRhdGUoIGFycmF5WyBpIF0sIGdsLkFSUkFZX0JVRkZFUiApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGdldFdpcmVmcmFtZUF0dHJpYnV0ZSggZ2VvbWV0cnkgKSB7XG5cblx0XHR2YXIgYXR0cmlidXRlID0gd2lyZWZyYW1lQXR0cmlidXRlc1sgZ2VvbWV0cnkuaWQgXTtcblxuXHRcdGlmICggYXR0cmlidXRlICkgcmV0dXJuIGF0dHJpYnV0ZTtcblxuXHRcdHZhciBpbmRpY2VzID0gW107XG5cblx0XHR2YXIgZ2VvbWV0cnlJbmRleCA9IGdlb21ldHJ5LmluZGV4O1xuXHRcdHZhciBnZW9tZXRyeUF0dHJpYnV0ZXMgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzO1xuXG5cdFx0Ly8gY29uc29sZS50aW1lKCAnd2lyZWZyYW1lJyApO1xuXG5cdFx0aWYgKCBnZW9tZXRyeUluZGV4ICE9PSBudWxsICkge1xuXG5cdFx0XHR2YXIgYXJyYXkgPSBnZW9tZXRyeUluZGV4LmFycmF5O1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBhcnJheS5sZW5ndGg7IGkgPCBsOyBpICs9IDMgKSB7XG5cblx0XHRcdFx0dmFyIGEgPSBhcnJheVsgaSArIDAgXTtcblx0XHRcdFx0dmFyIGIgPSBhcnJheVsgaSArIDEgXTtcblx0XHRcdFx0dmFyIGMgPSBhcnJheVsgaSArIDIgXTtcblxuXHRcdFx0XHRpbmRpY2VzLnB1c2goIGEsIGIsIGIsIGMsIGMsIGEgKTtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dmFyIGFycmF5ID0gZ2VvbWV0cnlBdHRyaWJ1dGVzLnBvc2l0aW9uLmFycmF5O1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSAoIGFycmF5Lmxlbmd0aCAvIDMgKSAtIDE7IGkgPCBsOyBpICs9IDMgKSB7XG5cblx0XHRcdFx0dmFyIGEgPSBpICsgMDtcblx0XHRcdFx0dmFyIGIgPSBpICsgMTtcblx0XHRcdFx0dmFyIGMgPSBpICsgMjtcblxuXHRcdFx0XHRpbmRpY2VzLnB1c2goIGEsIGIsIGIsIGMsIGMsIGEgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gY29uc29sZS50aW1lRW5kKCAnd2lyZWZyYW1lJyApO1xuXG5cdFx0YXR0cmlidXRlID0gbmV3ICggYXJyYXlNYXgoIGluZGljZXMgKSA+IDY1NTM1ID8gVWludDMyQnVmZmVyQXR0cmlidXRlIDogVWludDE2QnVmZmVyQXR0cmlidXRlICkoIGluZGljZXMsIDEgKTtcblxuXHRcdGF0dHJpYnV0ZXMudXBkYXRlKCBhdHRyaWJ1dGUsIGdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSICk7XG5cblx0XHR3aXJlZnJhbWVBdHRyaWJ1dGVzWyBnZW9tZXRyeS5pZCBdID0gYXR0cmlidXRlO1xuXG5cdFx0cmV0dXJuIGF0dHJpYnV0ZTtcblxuXHR9XG5cblx0cmV0dXJuIHtcblxuXHRcdGdldDogZ2V0LFxuXHRcdHVwZGF0ZTogdXBkYXRlLFxuXG5cdFx0Z2V0V2lyZWZyYW1lQXR0cmlidXRlOiBnZXRXaXJlZnJhbWVBdHRyaWJ1dGVcblxuXHR9O1xuXG59XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBXZWJHTExpZ2h0cygpIHtcblxuXHR2YXIgbGlnaHRzID0ge307XG5cblx0cmV0dXJuIHtcblxuXHRcdGdldDogZnVuY3Rpb24gKCBsaWdodCApIHtcblxuXHRcdFx0aWYgKCBsaWdodHNbIGxpZ2h0LmlkIF0gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRyZXR1cm4gbGlnaHRzWyBsaWdodC5pZCBdO1xuXG5cdFx0XHR9XG5cblx0XHRcdHZhciB1bmlmb3JtcztcblxuXHRcdFx0c3dpdGNoICggbGlnaHQudHlwZSApIHtcblxuXHRcdFx0XHRjYXNlICdEaXJlY3Rpb25hbExpZ2h0Jzpcblx0XHRcdFx0XHR1bmlmb3JtcyA9IHtcblx0XHRcdFx0XHRcdGRpcmVjdGlvbjogbmV3IFZlY3RvcjMoKSxcblx0XHRcdFx0XHRcdGNvbG9yOiBuZXcgQ29sb3IoKSxcblxuXHRcdFx0XHRcdFx0c2hhZG93OiBmYWxzZSxcblx0XHRcdFx0XHRcdHNoYWRvd0JpYXM6IDAsXG5cdFx0XHRcdFx0XHRzaGFkb3dSYWRpdXM6IDEsXG5cdFx0XHRcdFx0XHRzaGFkb3dNYXBTaXplOiBuZXcgVmVjdG9yMigpXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlICdTcG90TGlnaHQnOlxuXHRcdFx0XHRcdHVuaWZvcm1zID0ge1xuXHRcdFx0XHRcdFx0cG9zaXRpb246IG5ldyBWZWN0b3IzKCksXG5cdFx0XHRcdFx0XHRkaXJlY3Rpb246IG5ldyBWZWN0b3IzKCksXG5cdFx0XHRcdFx0XHRjb2xvcjogbmV3IENvbG9yKCksXG5cdFx0XHRcdFx0XHRkaXN0YW5jZTogMCxcblx0XHRcdFx0XHRcdGNvbmVDb3M6IDAsXG5cdFx0XHRcdFx0XHRwZW51bWJyYUNvczogMCxcblx0XHRcdFx0XHRcdGRlY2F5OiAwLFxuXG5cdFx0XHRcdFx0XHRzaGFkb3c6IGZhbHNlLFxuXHRcdFx0XHRcdFx0c2hhZG93QmlhczogMCxcblx0XHRcdFx0XHRcdHNoYWRvd1JhZGl1czogMSxcblx0XHRcdFx0XHRcdHNoYWRvd01hcFNpemU6IG5ldyBWZWN0b3IyKClcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgJ1BvaW50TGlnaHQnOlxuXHRcdFx0XHRcdHVuaWZvcm1zID0ge1xuXHRcdFx0XHRcdFx0cG9zaXRpb246IG5ldyBWZWN0b3IzKCksXG5cdFx0XHRcdFx0XHRjb2xvcjogbmV3IENvbG9yKCksXG5cdFx0XHRcdFx0XHRkaXN0YW5jZTogMCxcblx0XHRcdFx0XHRcdGRlY2F5OiAwLFxuXG5cdFx0XHRcdFx0XHRzaGFkb3c6IGZhbHNlLFxuXHRcdFx0XHRcdFx0c2hhZG93QmlhczogMCxcblx0XHRcdFx0XHRcdHNoYWRvd1JhZGl1czogMSxcblx0XHRcdFx0XHRcdHNoYWRvd01hcFNpemU6IG5ldyBWZWN0b3IyKClcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgJ0hlbWlzcGhlcmVMaWdodCc6XG5cdFx0XHRcdFx0dW5pZm9ybXMgPSB7XG5cdFx0XHRcdFx0XHRkaXJlY3Rpb246IG5ldyBWZWN0b3IzKCksXG5cdFx0XHRcdFx0XHRza3lDb2xvcjogbmV3IENvbG9yKCksXG5cdFx0XHRcdFx0XHRncm91bmRDb2xvcjogbmV3IENvbG9yKClcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgJ1JlY3RBcmVhTGlnaHQnOlxuXHRcdFx0XHRcdHVuaWZvcm1zID0ge1xuXHRcdFx0XHRcdFx0Y29sb3I6IG5ldyBDb2xvcigpLFxuXHRcdFx0XHRcdFx0cG9zaXRpb246IG5ldyBWZWN0b3IzKCksXG5cdFx0XHRcdFx0XHRoYWxmV2lkdGg6IG5ldyBWZWN0b3IzKCksXG5cdFx0XHRcdFx0XHRoYWxmSGVpZ2h0OiBuZXcgVmVjdG9yMygpXG5cdFx0XHRcdFx0XHQvLyBUT0RPIChhYmVsbmF0aW9uKTogc2V0IFJlY3RBcmVhTGlnaHQgc2hhZG93IHVuaWZvcm1zXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0fVxuXG5cdFx0XHRsaWdodHNbIGxpZ2h0LmlkIF0gPSB1bmlmb3JtcztcblxuXHRcdFx0cmV0dXJuIHVuaWZvcm1zO1xuXG5cdFx0fVxuXG5cdH07XG5cbn1cblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIFdlYkdMT2JqZWN0cyggZ2wsIGdlb21ldHJpZXMsIGluZm9SZW5kZXIgKSB7XG5cblx0dmFyIHVwZGF0ZUxpc3QgPSB7fTtcblxuXHRmdW5jdGlvbiB1cGRhdGUoIG9iamVjdCApIHtcblxuXHRcdHZhciBmcmFtZSA9IGluZm9SZW5kZXIuZnJhbWU7XG5cblx0XHR2YXIgZ2VvbWV0cnkgPSBvYmplY3QuZ2VvbWV0cnk7XG5cdFx0dmFyIGJ1ZmZlcmdlb21ldHJ5ID0gZ2VvbWV0cmllcy5nZXQoIG9iamVjdCwgZ2VvbWV0cnkgKTtcblxuXHRcdC8vIFVwZGF0ZSBvbmNlIHBlciBmcmFtZVxuXG5cdFx0aWYgKCB1cGRhdGVMaXN0WyBidWZmZXJnZW9tZXRyeS5pZCBdICE9PSBmcmFtZSApIHtcblxuXHRcdFx0aWYgKCBnZW9tZXRyeS5pc0dlb21ldHJ5ICkge1xuXG5cdFx0XHRcdGJ1ZmZlcmdlb21ldHJ5LnVwZGF0ZUZyb21PYmplY3QoIG9iamVjdCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGdlb21ldHJpZXMudXBkYXRlKCBidWZmZXJnZW9tZXRyeSApO1xuXG5cdFx0XHR1cGRhdGVMaXN0WyBidWZmZXJnZW9tZXRyeS5pZCBdID0gZnJhbWU7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gYnVmZmVyZ2VvbWV0cnk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGNsZWFyKCkge1xuXG5cdFx0dXBkYXRlTGlzdCA9IHt9O1xuXG5cdH1cblxuXHRyZXR1cm4ge1xuXG5cdFx0dXBkYXRlOiB1cGRhdGUsXG5cdFx0Y2xlYXI6IGNsZWFyXG5cblx0fTtcblxufVxuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gYWRkTGluZU51bWJlcnMoIHN0cmluZyApIHtcblxuXHR2YXIgbGluZXMgPSBzdHJpbmcuc3BsaXQoICdcXG4nICk7XG5cblx0Zm9yICggdmFyIGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0bGluZXNbIGkgXSA9ICggaSArIDEgKSArICc6ICcgKyBsaW5lc1sgaSBdO1xuXG5cdH1cblxuXHRyZXR1cm4gbGluZXMuam9pbiggJ1xcbicgKTtcblxufVxuXG5mdW5jdGlvbiBXZWJHTFNoYWRlciggZ2wsIHR5cGUsIHN0cmluZyApIHtcblxuXHR2YXIgc2hhZGVyID0gZ2wuY3JlYXRlU2hhZGVyKCB0eXBlICk7XG5cblx0Z2wuc2hhZGVyU291cmNlKCBzaGFkZXIsIHN0cmluZyApO1xuXHRnbC5jb21waWxlU2hhZGVyKCBzaGFkZXIgKTtcblxuXHRpZiAoIGdsLmdldFNoYWRlclBhcmFtZXRlciggc2hhZGVyLCBnbC5DT01QSUxFX1NUQVRVUyApID09PSBmYWxzZSApIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFNoYWRlcjogU2hhZGVyIGNvdWxkblxcJ3QgY29tcGlsZS4nICk7XG5cblx0fVxuXG5cdGlmICggZ2wuZ2V0U2hhZGVySW5mb0xvZyggc2hhZGVyICkgIT09ICcnICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xTaGFkZXI6IGdsLmdldFNoYWRlckluZm9Mb2coKScsIHR5cGUgPT09IGdsLlZFUlRFWF9TSEFERVIgPyAndmVydGV4JyA6ICdmcmFnbWVudCcsIGdsLmdldFNoYWRlckluZm9Mb2coIHNoYWRlciApLCBhZGRMaW5lTnVtYmVycyggc3RyaW5nICkgKTtcblxuXHR9XG5cblx0Ly8gLS1lbmFibGUtcHJpdmlsZWdlZC13ZWJnbC1leHRlbnNpb25cblx0Ly8gY29uc29sZS5sb2coIHR5cGUsIGdsLmdldEV4dGVuc2lvbiggJ1dFQkdMX2RlYnVnX3NoYWRlcnMnICkuZ2V0VHJhbnNsYXRlZFNoYWRlclNvdXJjZSggc2hhZGVyICkgKTtcblxuXHRyZXR1cm4gc2hhZGVyO1xuXG59XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG52YXIgcHJvZ3JhbUlkQ291bnQgPSAwO1xuXG5mdW5jdGlvbiBnZXRFbmNvZGluZ0NvbXBvbmVudHMoIGVuY29kaW5nICkge1xuXG5cdHN3aXRjaCAoIGVuY29kaW5nICkge1xuXG5cdFx0Y2FzZSBMaW5lYXJFbmNvZGluZzpcblx0XHRcdHJldHVybiBbICdMaW5lYXInLCcoIHZhbHVlICknIF07XG5cdFx0Y2FzZSBzUkdCRW5jb2Rpbmc6XG5cdFx0XHRyZXR1cm4gWyAnc1JHQicsJyggdmFsdWUgKScgXTtcblx0XHRjYXNlIFJHQkVFbmNvZGluZzpcblx0XHRcdHJldHVybiBbICdSR0JFJywnKCB2YWx1ZSApJyBdO1xuXHRcdGNhc2UgUkdCTTdFbmNvZGluZzpcblx0XHRcdHJldHVybiBbICdSR0JNJywnKCB2YWx1ZSwgNy4wICknIF07XG5cdFx0Y2FzZSBSR0JNMTZFbmNvZGluZzpcblx0XHRcdHJldHVybiBbICdSR0JNJywnKCB2YWx1ZSwgMTYuMCApJyBdO1xuXHRcdGNhc2UgUkdCREVuY29kaW5nOlxuXHRcdFx0cmV0dXJuIFsgJ1JHQkQnLCcoIHZhbHVlLCAyNTYuMCApJyBdO1xuXHRcdGNhc2UgR2FtbWFFbmNvZGluZzpcblx0XHRcdHJldHVybiBbICdHYW1tYScsJyggdmFsdWUsIGZsb2F0KCBHQU1NQV9GQUNUT1IgKSApJyBdO1xuXHRcdGRlZmF1bHQ6XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoICd1bnN1cHBvcnRlZCBlbmNvZGluZzogJyArIGVuY29kaW5nICk7XG5cblx0fVxuXG59XG5cbmZ1bmN0aW9uIGdldFRleGVsRGVjb2RpbmdGdW5jdGlvbiggZnVuY3Rpb25OYW1lLCBlbmNvZGluZyApIHtcblxuXHR2YXIgY29tcG9uZW50cyA9IGdldEVuY29kaW5nQ29tcG9uZW50cyggZW5jb2RpbmcgKTtcblx0cmV0dXJuIFwidmVjNCBcIiArIGZ1bmN0aW9uTmFtZSArIFwiKCB2ZWM0IHZhbHVlICkgeyByZXR1cm4gXCIgKyBjb21wb25lbnRzWyAwIF0gKyBcIlRvTGluZWFyXCIgKyBjb21wb25lbnRzWyAxIF0gKyBcIjsgfVwiO1xuXG59XG5cbmZ1bmN0aW9uIGdldFRleGVsRW5jb2RpbmdGdW5jdGlvbiggZnVuY3Rpb25OYW1lLCBlbmNvZGluZyApIHtcblxuXHR2YXIgY29tcG9uZW50cyA9IGdldEVuY29kaW5nQ29tcG9uZW50cyggZW5jb2RpbmcgKTtcblx0cmV0dXJuIFwidmVjNCBcIiArIGZ1bmN0aW9uTmFtZSArIFwiKCB2ZWM0IHZhbHVlICkgeyByZXR1cm4gTGluZWFyVG9cIiArIGNvbXBvbmVudHNbIDAgXSArIGNvbXBvbmVudHNbIDEgXSArIFwiOyB9XCI7XG5cbn1cblxuZnVuY3Rpb24gZ2V0VG9uZU1hcHBpbmdGdW5jdGlvbiggZnVuY3Rpb25OYW1lLCB0b25lTWFwcGluZyApIHtcblxuXHR2YXIgdG9uZU1hcHBpbmdOYW1lO1xuXG5cdHN3aXRjaCAoIHRvbmVNYXBwaW5nICkge1xuXG5cdFx0Y2FzZSBMaW5lYXJUb25lTWFwcGluZzpcblx0XHRcdHRvbmVNYXBwaW5nTmFtZSA9IFwiTGluZWFyXCI7XG5cdFx0XHRicmVhaztcblxuXHRcdGNhc2UgUmVpbmhhcmRUb25lTWFwcGluZzpcblx0XHRcdHRvbmVNYXBwaW5nTmFtZSA9IFwiUmVpbmhhcmRcIjtcblx0XHRcdGJyZWFrO1xuXG5cdFx0Y2FzZSBVbmNoYXJ0ZWQyVG9uZU1hcHBpbmc6XG5cdFx0XHR0b25lTWFwcGluZ05hbWUgPSBcIlVuY2hhcnRlZDJcIjtcblx0XHRcdGJyZWFrO1xuXG5cdFx0Y2FzZSBDaW5lb25Ub25lTWFwcGluZzpcblx0XHRcdHRvbmVNYXBwaW5nTmFtZSA9IFwiT3B0aW1pemVkQ2luZW9uXCI7XG5cdFx0XHRicmVhaztcblxuXHRcdGRlZmF1bHQ6XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoICd1bnN1cHBvcnRlZCB0b25lTWFwcGluZzogJyArIHRvbmVNYXBwaW5nICk7XG5cblx0fVxuXG5cdHJldHVybiBcInZlYzMgXCIgKyBmdW5jdGlvbk5hbWUgKyBcIiggdmVjMyBjb2xvciApIHsgcmV0dXJuIFwiICsgdG9uZU1hcHBpbmdOYW1lICsgXCJUb25lTWFwcGluZyggY29sb3IgKTsgfVwiO1xuXG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlRXh0ZW5zaW9ucyggZXh0ZW5zaW9ucywgcGFyYW1ldGVycywgcmVuZGVyZXJFeHRlbnNpb25zICkge1xuXG5cdGV4dGVuc2lvbnMgPSBleHRlbnNpb25zIHx8IHt9O1xuXG5cdHZhciBjaHVua3MgPSBbXG5cdFx0KCBleHRlbnNpb25zLmRlcml2YXRpdmVzIHx8IHBhcmFtZXRlcnMuZW52TWFwQ3ViZVVWIHx8IHBhcmFtZXRlcnMuYnVtcE1hcCB8fCBwYXJhbWV0ZXJzLm5vcm1hbE1hcCB8fCBwYXJhbWV0ZXJzLmZsYXRTaGFkaW5nICkgPyAnI2V4dGVuc2lvbiBHTF9PRVNfc3RhbmRhcmRfZGVyaXZhdGl2ZXMgOiBlbmFibGUnIDogJycsXG5cdFx0KCBleHRlbnNpb25zLmZyYWdEZXB0aCB8fCBwYXJhbWV0ZXJzLmxvZ2FyaXRobWljRGVwdGhCdWZmZXIgKSAmJiByZW5kZXJlckV4dGVuc2lvbnMuZ2V0KCAnRVhUX2ZyYWdfZGVwdGgnICkgPyAnI2V4dGVuc2lvbiBHTF9FWFRfZnJhZ19kZXB0aCA6IGVuYWJsZScgOiAnJyxcblx0XHQoIGV4dGVuc2lvbnMuZHJhd0J1ZmZlcnMgKSAmJiByZW5kZXJlckV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfZHJhd19idWZmZXJzJyApID8gJyNleHRlbnNpb24gR0xfRVhUX2RyYXdfYnVmZmVycyA6IHJlcXVpcmUnIDogJycsXG5cdFx0KCBleHRlbnNpb25zLnNoYWRlclRleHR1cmVMT0QgfHwgcGFyYW1ldGVycy5lbnZNYXAgKSAmJiByZW5kZXJlckV4dGVuc2lvbnMuZ2V0KCAnRVhUX3NoYWRlcl90ZXh0dXJlX2xvZCcgKSA/ICcjZXh0ZW5zaW9uIEdMX0VYVF9zaGFkZXJfdGV4dHVyZV9sb2QgOiBlbmFibGUnIDogJydcblx0XTtcblxuXHRyZXR1cm4gY2h1bmtzLmZpbHRlciggZmlsdGVyRW1wdHlMaW5lICkuam9pbiggJ1xcbicgKTtcblxufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZURlZmluZXMoIGRlZmluZXMgKSB7XG5cblx0dmFyIGNodW5rcyA9IFtdO1xuXG5cdGZvciAoIHZhciBuYW1lIGluIGRlZmluZXMgKSB7XG5cblx0XHR2YXIgdmFsdWUgPSBkZWZpbmVzWyBuYW1lIF07XG5cblx0XHRpZiAoIHZhbHVlID09PSBmYWxzZSApIGNvbnRpbnVlO1xuXG5cdFx0Y2h1bmtzLnB1c2goICcjZGVmaW5lICcgKyBuYW1lICsgJyAnICsgdmFsdWUgKTtcblxuXHR9XG5cblx0cmV0dXJuIGNodW5rcy5qb2luKCAnXFxuJyApO1xuXG59XG5cbmZ1bmN0aW9uIGZldGNoQXR0cmlidXRlTG9jYXRpb25zKCBnbCwgcHJvZ3JhbSwgaWRlbnRpZmllcnMgKSB7XG5cblx0dmFyIGF0dHJpYnV0ZXMgPSB7fTtcblxuXHR2YXIgbiA9IGdsLmdldFByb2dyYW1QYXJhbWV0ZXIoIHByb2dyYW0sIGdsLkFDVElWRV9BVFRSSUJVVEVTICk7XG5cblx0Zm9yICggdmFyIGkgPSAwOyBpIDwgbjsgaSArKyApIHtcblxuXHRcdHZhciBpbmZvID0gZ2wuZ2V0QWN0aXZlQXR0cmliKCBwcm9ncmFtLCBpICk7XG5cdFx0dmFyIG5hbWUgPSBpbmZvLm5hbWU7XG5cblx0XHQvLyBjb25zb2xlLmxvZyhcIlRIUkVFLldlYkdMUHJvZ3JhbTogQUNUSVZFIFZFUlRFWCBBVFRSSUJVVEU6XCIsIG5hbWUsIGkgKTtcblxuXHRcdGF0dHJpYnV0ZXNbIG5hbWUgXSA9IGdsLmdldEF0dHJpYkxvY2F0aW9uKCBwcm9ncmFtLCBuYW1lICk7XG5cblx0fVxuXG5cdHJldHVybiBhdHRyaWJ1dGVzO1xuXG59XG5cbmZ1bmN0aW9uIGZpbHRlckVtcHR5TGluZSggc3RyaW5nICkge1xuXG5cdHJldHVybiBzdHJpbmcgIT09ICcnO1xuXG59XG5cbmZ1bmN0aW9uIHJlcGxhY2VMaWdodE51bXMoIHN0cmluZywgcGFyYW1ldGVycyApIHtcblxuXHRyZXR1cm4gc3RyaW5nXG5cdFx0LnJlcGxhY2UoIC9OVU1fRElSX0xJR0hUUy9nLCBwYXJhbWV0ZXJzLm51bURpckxpZ2h0cyApXG5cdFx0LnJlcGxhY2UoIC9OVU1fU1BPVF9MSUdIVFMvZywgcGFyYW1ldGVycy5udW1TcG90TGlnaHRzIClcblx0XHQucmVwbGFjZSggL05VTV9SRUNUX0FSRUFfTElHSFRTL2csIHBhcmFtZXRlcnMubnVtUmVjdEFyZWFMaWdodHMgKVxuXHRcdC5yZXBsYWNlKCAvTlVNX1BPSU5UX0xJR0hUUy9nLCBwYXJhbWV0ZXJzLm51bVBvaW50TGlnaHRzIClcblx0XHQucmVwbGFjZSggL05VTV9IRU1JX0xJR0hUUy9nLCBwYXJhbWV0ZXJzLm51bUhlbWlMaWdodHMgKTtcblxufVxuXG5mdW5jdGlvbiBwYXJzZUluY2x1ZGVzKCBzdHJpbmcgKSB7XG5cblx0dmFyIHBhdHRlcm4gPSAvXlsgXFx0XSojaW5jbHVkZSArPChbXFx3XFxkLl0rKT4vZ207XG5cblx0ZnVuY3Rpb24gcmVwbGFjZSggbWF0Y2gsIGluY2x1ZGUgKSB7XG5cblx0XHR2YXIgcmVwbGFjZSA9IFNoYWRlckNodW5rWyBpbmNsdWRlIF07XG5cblx0XHRpZiAoIHJlcGxhY2UgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCAnQ2FuIG5vdCByZXNvbHZlICNpbmNsdWRlIDwnICsgaW5jbHVkZSArICc+JyApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHBhcnNlSW5jbHVkZXMoIHJlcGxhY2UgKTtcblxuXHR9XG5cblx0cmV0dXJuIHN0cmluZy5yZXBsYWNlKCBwYXR0ZXJuLCByZXBsYWNlICk7XG5cbn1cblxuZnVuY3Rpb24gdW5yb2xsTG9vcHMoIHN0cmluZyApIHtcblxuXHR2YXIgcGF0dGVybiA9IC9mb3IgXFwoIGludCBpIFxcPSAoXFxkKylcXDsgaSA8IChcXGQrKVxcOyBpIFxcK1xcKyBcXCkgXFx7KFtcXHNcXFNdKz8pKD89XFx9KVxcfS9nO1xuXG5cdGZ1bmN0aW9uIHJlcGxhY2UoIG1hdGNoLCBzdGFydCwgZW5kLCBzbmlwcGV0ICkge1xuXG5cdFx0dmFyIHVucm9sbCA9ICcnO1xuXG5cdFx0Zm9yICggdmFyIGkgPSBwYXJzZUludCggc3RhcnQgKTsgaSA8IHBhcnNlSW50KCBlbmQgKTsgaSArKyApIHtcblxuXHRcdFx0dW5yb2xsICs9IHNuaXBwZXQucmVwbGFjZSggL1xcWyBpIFxcXS9nLCAnWyAnICsgaSArICcgXScgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB1bnJvbGw7XG5cblx0fVxuXG5cdHJldHVybiBzdHJpbmcucmVwbGFjZSggcGF0dGVybiwgcmVwbGFjZSApO1xuXG59XG5cbmZ1bmN0aW9uIFdlYkdMUHJvZ3JhbSggcmVuZGVyZXIsIGNvZGUsIG1hdGVyaWFsLCBwYXJhbWV0ZXJzICkge1xuXG5cdHZhciBnbCA9IHJlbmRlcmVyLmNvbnRleHQ7XG5cblx0dmFyIGV4dGVuc2lvbnMgPSBtYXRlcmlhbC5leHRlbnNpb25zO1xuXHR2YXIgZGVmaW5lcyA9IG1hdGVyaWFsLmRlZmluZXM7XG5cblx0dmFyIHZlcnRleFNoYWRlciA9IG1hdGVyaWFsLl9fd2ViZ2xTaGFkZXIudmVydGV4U2hhZGVyO1xuXHR2YXIgZnJhZ21lbnRTaGFkZXIgPSBtYXRlcmlhbC5fX3dlYmdsU2hhZGVyLmZyYWdtZW50U2hhZGVyO1xuXG5cdHZhciBzaGFkb3dNYXBUeXBlRGVmaW5lID0gJ1NIQURPV01BUF9UWVBFX0JBU0lDJztcblxuXHRpZiAoIHBhcmFtZXRlcnMuc2hhZG93TWFwVHlwZSA9PT0gUENGU2hhZG93TWFwICkge1xuXG5cdFx0c2hhZG93TWFwVHlwZURlZmluZSA9ICdTSEFET1dNQVBfVFlQRV9QQ0YnO1xuXG5cdH0gZWxzZSBpZiAoIHBhcmFtZXRlcnMuc2hhZG93TWFwVHlwZSA9PT0gUENGU29mdFNoYWRvd01hcCApIHtcblxuXHRcdHNoYWRvd01hcFR5cGVEZWZpbmUgPSAnU0hBRE9XTUFQX1RZUEVfUENGX1NPRlQnO1xuXG5cdH1cblxuXHR2YXIgZW52TWFwVHlwZURlZmluZSA9ICdFTlZNQVBfVFlQRV9DVUJFJztcblx0dmFyIGVudk1hcE1vZGVEZWZpbmUgPSAnRU5WTUFQX01PREVfUkVGTEVDVElPTic7XG5cdHZhciBlbnZNYXBCbGVuZGluZ0RlZmluZSA9ICdFTlZNQVBfQkxFTkRJTkdfTVVMVElQTFknO1xuXG5cdGlmICggcGFyYW1ldGVycy5lbnZNYXAgKSB7XG5cblx0XHRzd2l0Y2ggKCBtYXRlcmlhbC5lbnZNYXAubWFwcGluZyApIHtcblxuXHRcdFx0Y2FzZSBDdWJlUmVmbGVjdGlvbk1hcHBpbmc6XG5cdFx0XHRjYXNlIEN1YmVSZWZyYWN0aW9uTWFwcGluZzpcblx0XHRcdFx0ZW52TWFwVHlwZURlZmluZSA9ICdFTlZNQVBfVFlQRV9DVUJFJztcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgQ3ViZVVWUmVmbGVjdGlvbk1hcHBpbmc6XG5cdFx0XHRjYXNlIEN1YmVVVlJlZnJhY3Rpb25NYXBwaW5nOlxuXHRcdFx0XHRlbnZNYXBUeXBlRGVmaW5lID0gJ0VOVk1BUF9UWVBFX0NVQkVfVVYnO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBFcXVpcmVjdGFuZ3VsYXJSZWZsZWN0aW9uTWFwcGluZzpcblx0XHRcdGNhc2UgRXF1aXJlY3Rhbmd1bGFyUmVmcmFjdGlvbk1hcHBpbmc6XG5cdFx0XHRcdGVudk1hcFR5cGVEZWZpbmUgPSAnRU5WTUFQX1RZUEVfRVFVSVJFQyc7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIFNwaGVyaWNhbFJlZmxlY3Rpb25NYXBwaW5nOlxuXHRcdFx0XHRlbnZNYXBUeXBlRGVmaW5lID0gJ0VOVk1BUF9UWVBFX1NQSEVSRSc7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0fVxuXG5cdFx0c3dpdGNoICggbWF0ZXJpYWwuZW52TWFwLm1hcHBpbmcgKSB7XG5cblx0XHRcdGNhc2UgQ3ViZVJlZnJhY3Rpb25NYXBwaW5nOlxuXHRcdFx0Y2FzZSBFcXVpcmVjdGFuZ3VsYXJSZWZyYWN0aW9uTWFwcGluZzpcblx0XHRcdFx0ZW52TWFwTW9kZURlZmluZSA9ICdFTlZNQVBfTU9ERV9SRUZSQUNUSU9OJztcblx0XHRcdFx0YnJlYWs7XG5cblx0XHR9XG5cblx0XHRzd2l0Y2ggKCBtYXRlcmlhbC5jb21iaW5lICkge1xuXG5cdFx0XHRjYXNlIE11bHRpcGx5T3BlcmF0aW9uOlxuXHRcdFx0XHRlbnZNYXBCbGVuZGluZ0RlZmluZSA9ICdFTlZNQVBfQkxFTkRJTkdfTVVMVElQTFknO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBNaXhPcGVyYXRpb246XG5cdFx0XHRcdGVudk1hcEJsZW5kaW5nRGVmaW5lID0gJ0VOVk1BUF9CTEVORElOR19NSVgnO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBBZGRPcGVyYXRpb246XG5cdFx0XHRcdGVudk1hcEJsZW5kaW5nRGVmaW5lID0gJ0VOVk1BUF9CTEVORElOR19BREQnO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdH1cblxuXHR9XG5cblx0dmFyIGdhbW1hRmFjdG9yRGVmaW5lID0gKCByZW5kZXJlci5nYW1tYUZhY3RvciA+IDAgKSA/IHJlbmRlcmVyLmdhbW1hRmFjdG9yIDogMS4wO1xuXG5cdC8vIGNvbnNvbGUubG9nKCAnYnVpbGRpbmcgbmV3IHByb2dyYW0gJyApO1xuXG5cdC8vXG5cblx0dmFyIGN1c3RvbUV4dGVuc2lvbnMgPSBnZW5lcmF0ZUV4dGVuc2lvbnMoIGV4dGVuc2lvbnMsIHBhcmFtZXRlcnMsIHJlbmRlcmVyLmV4dGVuc2lvbnMgKTtcblxuXHR2YXIgY3VzdG9tRGVmaW5lcyA9IGdlbmVyYXRlRGVmaW5lcyggZGVmaW5lcyApO1xuXG5cdC8vXG5cblx0dmFyIHByb2dyYW0gPSBnbC5jcmVhdGVQcm9ncmFtKCk7XG5cblx0dmFyIHByZWZpeFZlcnRleCwgcHJlZml4RnJhZ21lbnQ7XG5cblx0aWYgKCBtYXRlcmlhbC5pc1Jhd1NoYWRlck1hdGVyaWFsICkge1xuXG5cdFx0cHJlZml4VmVydGV4ID0gW1xuXG5cdFx0XHRjdXN0b21EZWZpbmVzLFxuXG5cdFx0XHQnXFxuJ1xuXG5cdFx0XS5maWx0ZXIoIGZpbHRlckVtcHR5TGluZSApLmpvaW4oICdcXG4nICk7XG5cblx0XHRwcmVmaXhGcmFnbWVudCA9IFtcblxuXHRcdFx0Y3VzdG9tRXh0ZW5zaW9ucyxcblx0XHRcdGN1c3RvbURlZmluZXMsXG5cblx0XHRcdCdcXG4nXG5cblx0XHRdLmZpbHRlciggZmlsdGVyRW1wdHlMaW5lICkuam9pbiggJ1xcbicgKTtcblxuXHR9IGVsc2Uge1xuXG5cdFx0cHJlZml4VmVydGV4ID0gW1xuXG5cdFx0XHQncHJlY2lzaW9uICcgKyBwYXJhbWV0ZXJzLnByZWNpc2lvbiArICcgZmxvYXQ7Jyxcblx0XHRcdCdwcmVjaXNpb24gJyArIHBhcmFtZXRlcnMucHJlY2lzaW9uICsgJyBpbnQ7JyxcblxuXHRcdFx0JyNkZWZpbmUgU0hBREVSX05BTUUgJyArIG1hdGVyaWFsLl9fd2ViZ2xTaGFkZXIubmFtZSxcblxuXHRcdFx0Y3VzdG9tRGVmaW5lcyxcblxuXHRcdFx0cGFyYW1ldGVycy5zdXBwb3J0c1ZlcnRleFRleHR1cmVzID8gJyNkZWZpbmUgVkVSVEVYX1RFWFRVUkVTJyA6ICcnLFxuXG5cdFx0XHQnI2RlZmluZSBHQU1NQV9GQUNUT1IgJyArIGdhbW1hRmFjdG9yRGVmaW5lLFxuXG5cdFx0XHQnI2RlZmluZSBNQVhfQk9ORVMgJyArIHBhcmFtZXRlcnMubWF4Qm9uZXMsXG5cdFx0XHQoIHBhcmFtZXRlcnMudXNlRm9nICYmIHBhcmFtZXRlcnMuZm9nICkgPyAnI2RlZmluZSBVU0VfRk9HJyA6ICcnLFxuXHRcdFx0KCBwYXJhbWV0ZXJzLnVzZUZvZyAmJiBwYXJhbWV0ZXJzLmZvZ0V4cCApID8gJyNkZWZpbmUgRk9HX0VYUDInIDogJycsXG5cblx0XHRcdHBhcmFtZXRlcnMubWFwID8gJyNkZWZpbmUgVVNFX01BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuZW52TWFwID8gJyNkZWZpbmUgVVNFX0VOVk1BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuZW52TWFwID8gJyNkZWZpbmUgJyArIGVudk1hcE1vZGVEZWZpbmUgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMubGlnaHRNYXAgPyAnI2RlZmluZSBVU0VfTElHSFRNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmFvTWFwID8gJyNkZWZpbmUgVVNFX0FPTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5lbWlzc2l2ZU1hcCA/ICcjZGVmaW5lIFVTRV9FTUlTU0lWRU1BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuYnVtcE1hcCA/ICcjZGVmaW5lIFVTRV9CVU1QTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5ub3JtYWxNYXAgPyAnI2RlZmluZSBVU0VfTk9STUFMTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5kaXNwbGFjZW1lbnRNYXAgJiYgcGFyYW1ldGVycy5zdXBwb3J0c1ZlcnRleFRleHR1cmVzID8gJyNkZWZpbmUgVVNFX0RJU1BMQUNFTUVOVE1BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuc3BlY3VsYXJNYXAgPyAnI2RlZmluZSBVU0VfU1BFQ1VMQVJNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLnJvdWdobmVzc01hcCA/ICcjZGVmaW5lIFVTRV9ST1VHSE5FU1NNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLm1ldGFsbmVzc01hcCA/ICcjZGVmaW5lIFVTRV9NRVRBTE5FU1NNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmFscGhhTWFwID8gJyNkZWZpbmUgVVNFX0FMUEhBTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy52ZXJ0ZXhDb2xvcnMgPyAnI2RlZmluZSBVU0VfQ09MT1InIDogJycsXG5cblx0XHRcdHBhcmFtZXRlcnMuZmxhdFNoYWRpbmcgPyAnI2RlZmluZSBGTEFUX1NIQURFRCcgOiAnJyxcblxuXHRcdFx0cGFyYW1ldGVycy5za2lubmluZyA/ICcjZGVmaW5lIFVTRV9TS0lOTklORycgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMudXNlVmVydGV4VGV4dHVyZSA/ICcjZGVmaW5lIEJPTkVfVEVYVFVSRScgOiAnJyxcblxuXHRcdFx0cGFyYW1ldGVycy5tb3JwaFRhcmdldHMgPyAnI2RlZmluZSBVU0VfTU9SUEhUQVJHRVRTJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5tb3JwaE5vcm1hbHMgJiYgcGFyYW1ldGVycy5mbGF0U2hhZGluZyA9PT0gZmFsc2UgPyAnI2RlZmluZSBVU0VfTU9SUEhOT1JNQUxTJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5kb3VibGVTaWRlZCA/ICcjZGVmaW5lIERPVUJMRV9TSURFRCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuZmxpcFNpZGVkID8gJyNkZWZpbmUgRkxJUF9TSURFRCcgOiAnJyxcblxuXHRcdFx0JyNkZWZpbmUgTlVNX0NMSVBQSU5HX1BMQU5FUyAnICsgcGFyYW1ldGVycy5udW1DbGlwcGluZ1BsYW5lcyxcblxuXHRcdFx0cGFyYW1ldGVycy5zaGFkb3dNYXBFbmFibGVkID8gJyNkZWZpbmUgVVNFX1NIQURPV01BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuc2hhZG93TWFwRW5hYmxlZCA/ICcjZGVmaW5lICcgKyBzaGFkb3dNYXBUeXBlRGVmaW5lIDogJycsXG5cblx0XHRcdHBhcmFtZXRlcnMuc2l6ZUF0dGVudWF0aW9uID8gJyNkZWZpbmUgVVNFX1NJWkVBVFRFTlVBVElPTicgOiAnJyxcblxuXHRcdFx0cGFyYW1ldGVycy5sb2dhcml0aG1pY0RlcHRoQnVmZmVyID8gJyNkZWZpbmUgVVNFX0xPR0RFUFRIQlVGJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5sb2dhcml0aG1pY0RlcHRoQnVmZmVyICYmIHJlbmRlcmVyLmV4dGVuc2lvbnMuZ2V0KCAnRVhUX2ZyYWdfZGVwdGgnICkgPyAnI2RlZmluZSBVU0VfTE9HREVQVEhCVUZfRVhUJyA6ICcnLFxuXG5cdFx0XHQndW5pZm9ybSBtYXQ0IG1vZGVsTWF0cml4OycsXG5cdFx0XHQndW5pZm9ybSBtYXQ0IG1vZGVsVmlld01hdHJpeDsnLFxuXHRcdFx0J3VuaWZvcm0gbWF0NCBwcm9qZWN0aW9uTWF0cml4OycsXG5cdFx0XHQndW5pZm9ybSBtYXQ0IHZpZXdNYXRyaXg7Jyxcblx0XHRcdCd1bmlmb3JtIG1hdDMgbm9ybWFsTWF0cml4OycsXG5cdFx0XHQndW5pZm9ybSB2ZWMzIGNhbWVyYVBvc2l0aW9uOycsXG5cblx0XHRcdCdhdHRyaWJ1dGUgdmVjMyBwb3NpdGlvbjsnLFxuXHRcdFx0J2F0dHJpYnV0ZSB2ZWMzIG5vcm1hbDsnLFxuXHRcdFx0J2F0dHJpYnV0ZSB2ZWMyIHV2OycsXG5cblx0XHRcdCcjaWZkZWYgVVNFX0NPTE9SJyxcblxuXHRcdFx0J1x0YXR0cmlidXRlIHZlYzMgY29sb3I7JyxcblxuXHRcdFx0JyNlbmRpZicsXG5cblx0XHRcdCcjaWZkZWYgVVNFX01PUlBIVEFSR0VUUycsXG5cblx0XHRcdCdcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0MDsnLFxuXHRcdFx0J1x0YXR0cmlidXRlIHZlYzMgbW9ycGhUYXJnZXQxOycsXG5cdFx0XHQnXHRhdHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDI7Jyxcblx0XHRcdCdcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0MzsnLFxuXG5cdFx0XHQnXHQjaWZkZWYgVVNFX01PUlBITk9STUFMUycsXG5cblx0XHRcdCdcdFx0YXR0cmlidXRlIHZlYzMgbW9ycGhOb3JtYWwwOycsXG5cdFx0XHQnXHRcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoTm9ybWFsMTsnLFxuXHRcdFx0J1x0XHRhdHRyaWJ1dGUgdmVjMyBtb3JwaE5vcm1hbDI7Jyxcblx0XHRcdCdcdFx0YXR0cmlidXRlIHZlYzMgbW9ycGhOb3JtYWwzOycsXG5cblx0XHRcdCdcdCNlbHNlJyxcblxuXHRcdFx0J1x0XHRhdHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDQ7Jyxcblx0XHRcdCdcdFx0YXR0cmlidXRlIHZlYzMgbW9ycGhUYXJnZXQ1OycsXG5cdFx0XHQnXHRcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0NjsnLFxuXHRcdFx0J1x0XHRhdHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDc7JyxcblxuXHRcdFx0J1x0I2VuZGlmJyxcblxuXHRcdFx0JyNlbmRpZicsXG5cblx0XHRcdCcjaWZkZWYgVVNFX1NLSU5OSU5HJyxcblxuXHRcdFx0J1x0YXR0cmlidXRlIHZlYzQgc2tpbkluZGV4OycsXG5cdFx0XHQnXHRhdHRyaWJ1dGUgdmVjNCBza2luV2VpZ2h0OycsXG5cblx0XHRcdCcjZW5kaWYnLFxuXG5cdFx0XHQnXFxuJ1xuXG5cdFx0XS5maWx0ZXIoIGZpbHRlckVtcHR5TGluZSApLmpvaW4oICdcXG4nICk7XG5cblx0XHRwcmVmaXhGcmFnbWVudCA9IFtcblxuXHRcdFx0Y3VzdG9tRXh0ZW5zaW9ucyxcblxuXHRcdFx0J3ByZWNpc2lvbiAnICsgcGFyYW1ldGVycy5wcmVjaXNpb24gKyAnIGZsb2F0OycsXG5cdFx0XHQncHJlY2lzaW9uICcgKyBwYXJhbWV0ZXJzLnByZWNpc2lvbiArICcgaW50OycsXG5cblx0XHRcdCcjZGVmaW5lIFNIQURFUl9OQU1FICcgKyBtYXRlcmlhbC5fX3dlYmdsU2hhZGVyLm5hbWUsXG5cblx0XHRcdGN1c3RvbURlZmluZXMsXG5cblx0XHRcdHBhcmFtZXRlcnMuYWxwaGFUZXN0ID8gJyNkZWZpbmUgQUxQSEFURVNUICcgKyBwYXJhbWV0ZXJzLmFscGhhVGVzdCA6ICcnLFxuXG5cdFx0XHQnI2RlZmluZSBHQU1NQV9GQUNUT1IgJyArIGdhbW1hRmFjdG9yRGVmaW5lLFxuXG5cdFx0XHQoIHBhcmFtZXRlcnMudXNlRm9nICYmIHBhcmFtZXRlcnMuZm9nICkgPyAnI2RlZmluZSBVU0VfRk9HJyA6ICcnLFxuXHRcdFx0KCBwYXJhbWV0ZXJzLnVzZUZvZyAmJiBwYXJhbWV0ZXJzLmZvZ0V4cCApID8gJyNkZWZpbmUgRk9HX0VYUDInIDogJycsXG5cblx0XHRcdHBhcmFtZXRlcnMubWFwID8gJyNkZWZpbmUgVVNFX01BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuZW52TWFwID8gJyNkZWZpbmUgVVNFX0VOVk1BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuZW52TWFwID8gJyNkZWZpbmUgJyArIGVudk1hcFR5cGVEZWZpbmUgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuZW52TWFwID8gJyNkZWZpbmUgJyArIGVudk1hcE1vZGVEZWZpbmUgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuZW52TWFwID8gJyNkZWZpbmUgJyArIGVudk1hcEJsZW5kaW5nRGVmaW5lIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmxpZ2h0TWFwID8gJyNkZWZpbmUgVVNFX0xJR0hUTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5hb01hcCA/ICcjZGVmaW5lIFVTRV9BT01BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuZW1pc3NpdmVNYXAgPyAnI2RlZmluZSBVU0VfRU1JU1NJVkVNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmJ1bXBNYXAgPyAnI2RlZmluZSBVU0VfQlVNUE1BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMubm9ybWFsTWFwID8gJyNkZWZpbmUgVVNFX05PUk1BTE1BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuc3BlY3VsYXJNYXAgPyAnI2RlZmluZSBVU0VfU1BFQ1VMQVJNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLnJvdWdobmVzc01hcCA/ICcjZGVmaW5lIFVTRV9ST1VHSE5FU1NNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLm1ldGFsbmVzc01hcCA/ICcjZGVmaW5lIFVTRV9NRVRBTE5FU1NNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmFscGhhTWFwID8gJyNkZWZpbmUgVVNFX0FMUEhBTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy52ZXJ0ZXhDb2xvcnMgPyAnI2RlZmluZSBVU0VfQ09MT1InIDogJycsXG5cblx0XHRcdHBhcmFtZXRlcnMuZ3JhZGllbnRNYXAgPyAnI2RlZmluZSBVU0VfR1JBRElFTlRNQVAnIDogJycsXG5cblx0XHRcdHBhcmFtZXRlcnMuZmxhdFNoYWRpbmcgPyAnI2RlZmluZSBGTEFUX1NIQURFRCcgOiAnJyxcblxuXHRcdFx0cGFyYW1ldGVycy5kb3VibGVTaWRlZCA/ICcjZGVmaW5lIERPVUJMRV9TSURFRCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuZmxpcFNpZGVkID8gJyNkZWZpbmUgRkxJUF9TSURFRCcgOiAnJyxcblxuXHRcdFx0JyNkZWZpbmUgTlVNX0NMSVBQSU5HX1BMQU5FUyAnICsgcGFyYW1ldGVycy5udW1DbGlwcGluZ1BsYW5lcyxcblx0XHRcdCcjZGVmaW5lIFVOSU9OX0NMSVBQSU5HX1BMQU5FUyAnICsgKHBhcmFtZXRlcnMubnVtQ2xpcHBpbmdQbGFuZXMgLSBwYXJhbWV0ZXJzLm51bUNsaXBJbnRlcnNlY3Rpb24pLFxuXG5cdFx0XHRwYXJhbWV0ZXJzLnNoYWRvd01hcEVuYWJsZWQgPyAnI2RlZmluZSBVU0VfU0hBRE9XTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5zaGFkb3dNYXBFbmFibGVkID8gJyNkZWZpbmUgJyArIHNoYWRvd01hcFR5cGVEZWZpbmUgOiAnJyxcblxuXHRcdFx0cGFyYW1ldGVycy5wcmVtdWx0aXBsaWVkQWxwaGEgPyBcIiNkZWZpbmUgUFJFTVVMVElQTElFRF9BTFBIQVwiIDogJycsXG5cblx0XHRcdHBhcmFtZXRlcnMucGh5c2ljYWxseUNvcnJlY3RMaWdodHMgPyBcIiNkZWZpbmUgUEhZU0lDQUxMWV9DT1JSRUNUX0xJR0hUU1wiIDogJycsXG5cblx0XHRcdHBhcmFtZXRlcnMubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciA/ICcjZGVmaW5lIFVTRV9MT0dERVBUSEJVRicgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciAmJiByZW5kZXJlci5leHRlbnNpb25zLmdldCggJ0VYVF9mcmFnX2RlcHRoJyApID8gJyNkZWZpbmUgVVNFX0xPR0RFUFRIQlVGX0VYVCcgOiAnJyxcblxuXHRcdFx0cGFyYW1ldGVycy5lbnZNYXAgJiYgcmVuZGVyZXIuZXh0ZW5zaW9ucy5nZXQoICdFWFRfc2hhZGVyX3RleHR1cmVfbG9kJyApID8gJyNkZWZpbmUgVEVYVFVSRV9MT0RfRVhUJyA6ICcnLFxuXG5cdFx0XHQndW5pZm9ybSBtYXQ0IHZpZXdNYXRyaXg7Jyxcblx0XHRcdCd1bmlmb3JtIHZlYzMgY2FtZXJhUG9zaXRpb247JyxcblxuXHRcdFx0KCBwYXJhbWV0ZXJzLnRvbmVNYXBwaW5nICE9PSBOb1RvbmVNYXBwaW5nICkgPyBcIiNkZWZpbmUgVE9ORV9NQVBQSU5HXCIgOiAnJyxcblx0XHRcdCggcGFyYW1ldGVycy50b25lTWFwcGluZyAhPT0gTm9Ub25lTWFwcGluZyApID8gU2hhZGVyQ2h1bmtbICd0b25lbWFwcGluZ19wYXJzX2ZyYWdtZW50JyBdIDogJycsICAvLyB0aGlzIGNvZGUgaXMgcmVxdWlyZWQgaGVyZSBiZWNhdXNlIGl0IGlzIHVzZWQgYnkgdGhlIHRvbmVNYXBwaW5nKCkgZnVuY3Rpb24gZGVmaW5lZCBiZWxvd1xuXHRcdFx0KCBwYXJhbWV0ZXJzLnRvbmVNYXBwaW5nICE9PSBOb1RvbmVNYXBwaW5nICkgPyBnZXRUb25lTWFwcGluZ0Z1bmN0aW9uKCBcInRvbmVNYXBwaW5nXCIsIHBhcmFtZXRlcnMudG9uZU1hcHBpbmcgKSA6ICcnLFxuXG5cdFx0XHRwYXJhbWV0ZXJzLmRpdGhlcmluZyA/ICcjZGVmaW5lIERJVEhFUklORycgOiAnJyxcblxuXHRcdFx0KCBwYXJhbWV0ZXJzLm91dHB1dEVuY29kaW5nIHx8IHBhcmFtZXRlcnMubWFwRW5jb2RpbmcgfHwgcGFyYW1ldGVycy5lbnZNYXBFbmNvZGluZyB8fCBwYXJhbWV0ZXJzLmVtaXNzaXZlTWFwRW5jb2RpbmcgKSA/IFNoYWRlckNodW5rWyAnZW5jb2RpbmdzX3BhcnNfZnJhZ21lbnQnIF0gOiAnJywgLy8gdGhpcyBjb2RlIGlzIHJlcXVpcmVkIGhlcmUgYmVjYXVzZSBpdCBpcyB1c2VkIGJ5IHRoZSB2YXJpb3VzIGVuY29kaW5nL2RlY29kaW5nIGZ1bmN0aW9uIGRlZmluZWQgYmVsb3dcblx0XHRcdHBhcmFtZXRlcnMubWFwRW5jb2RpbmcgPyBnZXRUZXhlbERlY29kaW5nRnVuY3Rpb24oICdtYXBUZXhlbFRvTGluZWFyJywgcGFyYW1ldGVycy5tYXBFbmNvZGluZyApIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmVudk1hcEVuY29kaW5nID8gZ2V0VGV4ZWxEZWNvZGluZ0Z1bmN0aW9uKCAnZW52TWFwVGV4ZWxUb0xpbmVhcicsIHBhcmFtZXRlcnMuZW52TWFwRW5jb2RpbmcgKSA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5lbWlzc2l2ZU1hcEVuY29kaW5nID8gZ2V0VGV4ZWxEZWNvZGluZ0Z1bmN0aW9uKCAnZW1pc3NpdmVNYXBUZXhlbFRvTGluZWFyJywgcGFyYW1ldGVycy5lbWlzc2l2ZU1hcEVuY29kaW5nICkgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMub3V0cHV0RW5jb2RpbmcgPyBnZXRUZXhlbEVuY29kaW5nRnVuY3Rpb24oIFwibGluZWFyVG9PdXRwdXRUZXhlbFwiLCBwYXJhbWV0ZXJzLm91dHB1dEVuY29kaW5nICkgOiAnJyxcblxuXHRcdFx0cGFyYW1ldGVycy5kZXB0aFBhY2tpbmcgPyBcIiNkZWZpbmUgREVQVEhfUEFDS0lORyBcIiArIG1hdGVyaWFsLmRlcHRoUGFja2luZyA6ICcnLFxuXG5cdFx0XHQnXFxuJ1xuXG5cdFx0XS5maWx0ZXIoIGZpbHRlckVtcHR5TGluZSApLmpvaW4oICdcXG4nICk7XG5cblx0fVxuXG5cdHZlcnRleFNoYWRlciA9IHBhcnNlSW5jbHVkZXMoIHZlcnRleFNoYWRlciwgcGFyYW1ldGVycyApO1xuXHR2ZXJ0ZXhTaGFkZXIgPSByZXBsYWNlTGlnaHROdW1zKCB2ZXJ0ZXhTaGFkZXIsIHBhcmFtZXRlcnMgKTtcblxuXHRmcmFnbWVudFNoYWRlciA9IHBhcnNlSW5jbHVkZXMoIGZyYWdtZW50U2hhZGVyLCBwYXJhbWV0ZXJzICk7XG5cdGZyYWdtZW50U2hhZGVyID0gcmVwbGFjZUxpZ2h0TnVtcyggZnJhZ21lbnRTaGFkZXIsIHBhcmFtZXRlcnMgKTtcblxuXHRpZiAoICEgbWF0ZXJpYWwuaXNTaGFkZXJNYXRlcmlhbCApIHtcblxuXHRcdHZlcnRleFNoYWRlciA9IHVucm9sbExvb3BzKCB2ZXJ0ZXhTaGFkZXIgKTtcblx0XHRmcmFnbWVudFNoYWRlciA9IHVucm9sbExvb3BzKCBmcmFnbWVudFNoYWRlciApO1xuXG5cdH1cblxuXHR2YXIgdmVydGV4R2xzbCA9IHByZWZpeFZlcnRleCArIHZlcnRleFNoYWRlcjtcblx0dmFyIGZyYWdtZW50R2xzbCA9IHByZWZpeEZyYWdtZW50ICsgZnJhZ21lbnRTaGFkZXI7XG5cblx0Ly8gY29uc29sZS5sb2coICcqVkVSVEVYKicsIHZlcnRleEdsc2wgKTtcblx0Ly8gY29uc29sZS5sb2coICcqRlJBR01FTlQqJywgZnJhZ21lbnRHbHNsICk7XG5cblx0dmFyIGdsVmVydGV4U2hhZGVyID0gV2ViR0xTaGFkZXIoIGdsLCBnbC5WRVJURVhfU0hBREVSLCB2ZXJ0ZXhHbHNsICk7XG5cdHZhciBnbEZyYWdtZW50U2hhZGVyID0gV2ViR0xTaGFkZXIoIGdsLCBnbC5GUkFHTUVOVF9TSEFERVIsIGZyYWdtZW50R2xzbCApO1xuXG5cdGdsLmF0dGFjaFNoYWRlciggcHJvZ3JhbSwgZ2xWZXJ0ZXhTaGFkZXIgKTtcblx0Z2wuYXR0YWNoU2hhZGVyKCBwcm9ncmFtLCBnbEZyYWdtZW50U2hhZGVyICk7XG5cblx0Ly8gRm9yY2UgYSBwYXJ0aWN1bGFyIGF0dHJpYnV0ZSB0byBpbmRleCAwLlxuXG5cdGlmICggbWF0ZXJpYWwuaW5kZXgwQXR0cmlidXRlTmFtZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0Z2wuYmluZEF0dHJpYkxvY2F0aW9uKCBwcm9ncmFtLCAwLCBtYXRlcmlhbC5pbmRleDBBdHRyaWJ1dGVOYW1lICk7XG5cblx0fSBlbHNlIGlmICggcGFyYW1ldGVycy5tb3JwaFRhcmdldHMgPT09IHRydWUgKSB7XG5cblx0XHQvLyBwcm9ncmFtcyB3aXRoIG1vcnBoVGFyZ2V0cyBkaXNwbGFjZSBwb3NpdGlvbiBvdXQgb2YgYXR0cmlidXRlIDBcblx0XHRnbC5iaW5kQXR0cmliTG9jYXRpb24oIHByb2dyYW0sIDAsICdwb3NpdGlvbicgKTtcblxuXHR9XG5cblx0Z2wubGlua1Byb2dyYW0oIHByb2dyYW0gKTtcblxuXHR2YXIgcHJvZ3JhbUxvZyA9IGdsLmdldFByb2dyYW1JbmZvTG9nKCBwcm9ncmFtICk7XG5cdHZhciB2ZXJ0ZXhMb2cgPSBnbC5nZXRTaGFkZXJJbmZvTG9nKCBnbFZlcnRleFNoYWRlciApO1xuXHR2YXIgZnJhZ21lbnRMb2cgPSBnbC5nZXRTaGFkZXJJbmZvTG9nKCBnbEZyYWdtZW50U2hhZGVyICk7XG5cblx0dmFyIHJ1bm5hYmxlID0gdHJ1ZTtcblx0dmFyIGhhdmVEaWFnbm9zdGljcyA9IHRydWU7XG5cblx0Ly8gY29uc29sZS5sb2coICcqKlZFUlRFWCoqJywgZ2wuZ2V0RXh0ZW5zaW9uKCAnV0VCR0xfZGVidWdfc2hhZGVycycgKS5nZXRUcmFuc2xhdGVkU2hhZGVyU291cmNlKCBnbFZlcnRleFNoYWRlciApICk7XG5cdC8vIGNvbnNvbGUubG9nKCAnKipGUkFHTUVOVCoqJywgZ2wuZ2V0RXh0ZW5zaW9uKCAnV0VCR0xfZGVidWdfc2hhZGVycycgKS5nZXRUcmFuc2xhdGVkU2hhZGVyU291cmNlKCBnbEZyYWdtZW50U2hhZGVyICkgKTtcblxuXHRpZiAoIGdsLmdldFByb2dyYW1QYXJhbWV0ZXIoIHByb2dyYW0sIGdsLkxJTktfU1RBVFVTICkgPT09IGZhbHNlICkge1xuXG5cdFx0cnVubmFibGUgPSBmYWxzZTtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFByb2dyYW06IHNoYWRlciBlcnJvcjogJywgZ2wuZ2V0RXJyb3IoKSwgJ2dsLlZBTElEQVRFX1NUQVRVUycsIGdsLmdldFByb2dyYW1QYXJhbWV0ZXIoIHByb2dyYW0sIGdsLlZBTElEQVRFX1NUQVRVUyApLCAnZ2wuZ2V0UHJvZ3JhbUluZm9Mb2cnLCBwcm9ncmFtTG9nLCB2ZXJ0ZXhMb2csIGZyYWdtZW50TG9nICk7XG5cblx0fSBlbHNlIGlmICggcHJvZ3JhbUxvZyAhPT0gJycgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFByb2dyYW06IGdsLmdldFByb2dyYW1JbmZvTG9nKCknLCBwcm9ncmFtTG9nICk7XG5cblx0fSBlbHNlIGlmICggdmVydGV4TG9nID09PSAnJyB8fCBmcmFnbWVudExvZyA9PT0gJycgKSB7XG5cblx0XHRoYXZlRGlhZ25vc3RpY3MgPSBmYWxzZTtcblxuXHR9XG5cblx0aWYgKCBoYXZlRGlhZ25vc3RpY3MgKSB7XG5cblx0XHR0aGlzLmRpYWdub3N0aWNzID0ge1xuXG5cdFx0XHRydW5uYWJsZTogcnVubmFibGUsXG5cdFx0XHRtYXRlcmlhbDogbWF0ZXJpYWwsXG5cblx0XHRcdHByb2dyYW1Mb2c6IHByb2dyYW1Mb2csXG5cblx0XHRcdHZlcnRleFNoYWRlcjoge1xuXG5cdFx0XHRcdGxvZzogdmVydGV4TG9nLFxuXHRcdFx0XHRwcmVmaXg6IHByZWZpeFZlcnRleFxuXG5cdFx0XHR9LFxuXG5cdFx0XHRmcmFnbWVudFNoYWRlcjoge1xuXG5cdFx0XHRcdGxvZzogZnJhZ21lbnRMb2csXG5cdFx0XHRcdHByZWZpeDogcHJlZml4RnJhZ21lbnRcblxuXHRcdFx0fVxuXG5cdFx0fTtcblxuXHR9XG5cblx0Ly8gY2xlYW4gdXBcblxuXHRnbC5kZWxldGVTaGFkZXIoIGdsVmVydGV4U2hhZGVyICk7XG5cdGdsLmRlbGV0ZVNoYWRlciggZ2xGcmFnbWVudFNoYWRlciApO1xuXG5cdC8vIHNldCB1cCBjYWNoaW5nIGZvciB1bmlmb3JtIGxvY2F0aW9uc1xuXG5cdHZhciBjYWNoZWRVbmlmb3JtcztcblxuXHR0aGlzLmdldFVuaWZvcm1zID0gZnVuY3Rpb24oKSB7XG5cblx0XHRpZiAoIGNhY2hlZFVuaWZvcm1zID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNhY2hlZFVuaWZvcm1zID1cblx0XHRcdFx0bmV3IFdlYkdMVW5pZm9ybXMoIGdsLCBwcm9ncmFtLCByZW5kZXJlciApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNhY2hlZFVuaWZvcm1zO1xuXG5cdH07XG5cblx0Ly8gc2V0IHVwIGNhY2hpbmcgZm9yIGF0dHJpYnV0ZSBsb2NhdGlvbnNcblxuXHR2YXIgY2FjaGVkQXR0cmlidXRlcztcblxuXHR0aGlzLmdldEF0dHJpYnV0ZXMgPSBmdW5jdGlvbigpIHtcblxuXHRcdGlmICggY2FjaGVkQXR0cmlidXRlcyA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjYWNoZWRBdHRyaWJ1dGVzID0gZmV0Y2hBdHRyaWJ1dGVMb2NhdGlvbnMoIGdsLCBwcm9ncmFtICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gY2FjaGVkQXR0cmlidXRlcztcblxuXHR9O1xuXG5cdC8vIGZyZWUgcmVzb3VyY2VcblxuXHR0aGlzLmRlc3Ryb3kgPSBmdW5jdGlvbigpIHtcblxuXHRcdGdsLmRlbGV0ZVByb2dyYW0oIHByb2dyYW0gKTtcblx0XHR0aGlzLnByb2dyYW0gPSB1bmRlZmluZWQ7XG5cblx0fTtcblxuXHQvLyBERVBSRUNBVEVEXG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIHRoaXMsIHtcblxuXHRcdHVuaWZvcm1zOiB7XG5cdFx0XHRnZXQ6IGZ1bmN0aW9uKCkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUHJvZ3JhbTogLnVuaWZvcm1zIGlzIG5vdyAuZ2V0VW5pZm9ybXMoKS4nICk7XG5cdFx0XHRcdHJldHVybiB0aGlzLmdldFVuaWZvcm1zKCk7XG5cblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0YXR0cmlidXRlczoge1xuXHRcdFx0Z2V0OiBmdW5jdGlvbigpIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFByb2dyYW06IC5hdHRyaWJ1dGVzIGlzIG5vdyAuZ2V0QXR0cmlidXRlcygpLicgKTtcblx0XHRcdFx0cmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlcygpO1xuXG5cdFx0XHR9XG5cdFx0fVxuXG5cdH0gKTtcblxuXG5cdC8vXG5cblx0dGhpcy5pZCA9IHByb2dyYW1JZENvdW50ICsrO1xuXHR0aGlzLmNvZGUgPSBjb2RlO1xuXHR0aGlzLnVzZWRUaW1lcyA9IDE7XG5cdHRoaXMucHJvZ3JhbSA9IHByb2dyYW07XG5cdHRoaXMudmVydGV4U2hhZGVyID0gZ2xWZXJ0ZXhTaGFkZXI7XG5cdHRoaXMuZnJhZ21lbnRTaGFkZXIgPSBnbEZyYWdtZW50U2hhZGVyO1xuXG5cdHJldHVybiB0aGlzO1xuXG59XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBXZWJHTFByb2dyYW1zKCByZW5kZXJlciwgY2FwYWJpbGl0aWVzICkge1xuXG5cdHZhciBwcm9ncmFtcyA9IFtdO1xuXG5cdHZhciBzaGFkZXJJRHMgPSB7XG5cdFx0TWVzaERlcHRoTWF0ZXJpYWw6ICdkZXB0aCcsXG5cdFx0TWVzaE5vcm1hbE1hdGVyaWFsOiAnbm9ybWFsJyxcblx0XHRNZXNoQmFzaWNNYXRlcmlhbDogJ2Jhc2ljJyxcblx0XHRNZXNoTGFtYmVydE1hdGVyaWFsOiAnbGFtYmVydCcsXG5cdFx0TWVzaFBob25nTWF0ZXJpYWw6ICdwaG9uZycsXG5cdFx0TWVzaFRvb25NYXRlcmlhbDogJ3Bob25nJyxcblx0XHRNZXNoU3RhbmRhcmRNYXRlcmlhbDogJ3BoeXNpY2FsJyxcblx0XHRNZXNoUGh5c2ljYWxNYXRlcmlhbDogJ3BoeXNpY2FsJyxcblx0XHRMaW5lQmFzaWNNYXRlcmlhbDogJ2Jhc2ljJyxcblx0XHRMaW5lRGFzaGVkTWF0ZXJpYWw6ICdkYXNoZWQnLFxuXHRcdFBvaW50c01hdGVyaWFsOiAncG9pbnRzJ1xuXHR9O1xuXG5cdHZhciBwYXJhbWV0ZXJOYW1lcyA9IFtcblx0XHRcInByZWNpc2lvblwiLCBcInN1cHBvcnRzVmVydGV4VGV4dHVyZXNcIiwgXCJtYXBcIiwgXCJtYXBFbmNvZGluZ1wiLCBcImVudk1hcFwiLCBcImVudk1hcE1vZGVcIiwgXCJlbnZNYXBFbmNvZGluZ1wiLFxuXHRcdFwibGlnaHRNYXBcIiwgXCJhb01hcFwiLCBcImVtaXNzaXZlTWFwXCIsIFwiZW1pc3NpdmVNYXBFbmNvZGluZ1wiLCBcImJ1bXBNYXBcIiwgXCJub3JtYWxNYXBcIiwgXCJkaXNwbGFjZW1lbnRNYXBcIiwgXCJzcGVjdWxhck1hcFwiLFxuXHRcdFwicm91Z2huZXNzTWFwXCIsIFwibWV0YWxuZXNzTWFwXCIsIFwiZ3JhZGllbnRNYXBcIixcblx0XHRcImFscGhhTWFwXCIsIFwiY29tYmluZVwiLCBcInZlcnRleENvbG9yc1wiLCBcImZvZ1wiLCBcInVzZUZvZ1wiLCBcImZvZ0V4cFwiLFxuXHRcdFwiZmxhdFNoYWRpbmdcIiwgXCJzaXplQXR0ZW51YXRpb25cIiwgXCJsb2dhcml0aG1pY0RlcHRoQnVmZmVyXCIsIFwic2tpbm5pbmdcIixcblx0XHRcIm1heEJvbmVzXCIsIFwidXNlVmVydGV4VGV4dHVyZVwiLCBcIm1vcnBoVGFyZ2V0c1wiLCBcIm1vcnBoTm9ybWFsc1wiLFxuXHRcdFwibWF4TW9ycGhUYXJnZXRzXCIsIFwibWF4TW9ycGhOb3JtYWxzXCIsIFwicHJlbXVsdGlwbGllZEFscGhhXCIsXG5cdFx0XCJudW1EaXJMaWdodHNcIiwgXCJudW1Qb2ludExpZ2h0c1wiLCBcIm51bVNwb3RMaWdodHNcIiwgXCJudW1IZW1pTGlnaHRzXCIsIFwibnVtUmVjdEFyZWFMaWdodHNcIixcblx0XHRcInNoYWRvd01hcEVuYWJsZWRcIiwgXCJzaGFkb3dNYXBUeXBlXCIsIFwidG9uZU1hcHBpbmdcIiwgJ3BoeXNpY2FsbHlDb3JyZWN0TGlnaHRzJyxcblx0XHRcImFscGhhVGVzdFwiLCBcImRvdWJsZVNpZGVkXCIsIFwiZmxpcFNpZGVkXCIsIFwibnVtQ2xpcHBpbmdQbGFuZXNcIiwgXCJudW1DbGlwSW50ZXJzZWN0aW9uXCIsIFwiZGVwdGhQYWNraW5nXCIsIFwiZGl0aGVyaW5nXCJcblx0XTtcblxuXG5cdGZ1bmN0aW9uIGFsbG9jYXRlQm9uZXMoIG9iamVjdCApIHtcblxuXHRcdHZhciBza2VsZXRvbiA9IG9iamVjdC5za2VsZXRvbjtcblx0XHR2YXIgYm9uZXMgPSBza2VsZXRvbi5ib25lcztcblxuXHRcdGlmICggY2FwYWJpbGl0aWVzLmZsb2F0VmVydGV4VGV4dHVyZXMgKSB7XG5cblx0XHRcdHJldHVybiAxMDI0O1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gZGVmYXVsdCBmb3Igd2hlbiBvYmplY3QgaXMgbm90IHNwZWNpZmllZFxuXHRcdFx0Ly8gKCBmb3IgZXhhbXBsZSB3aGVuIHByZWJ1aWxkaW5nIHNoYWRlciB0byBiZSB1c2VkIHdpdGggbXVsdGlwbGUgb2JqZWN0cyApXG5cdFx0XHQvL1xuXHRcdFx0Ly8gIC0gbGVhdmUgc29tZSBleHRyYSBzcGFjZSBmb3Igb3RoZXIgdW5pZm9ybXNcblx0XHRcdC8vICAtIGxpbWl0IGhlcmUgaXMgQU5HTEUncyAyNTQgbWF4IHVuaWZvcm0gdmVjdG9yc1xuXHRcdFx0Ly8gICAgKHVwIHRvIDU0IHNob3VsZCBiZSBzYWZlKVxuXG5cdFx0XHR2YXIgblZlcnRleFVuaWZvcm1zID0gY2FwYWJpbGl0aWVzLm1heFZlcnRleFVuaWZvcm1zO1xuXHRcdFx0dmFyIG5WZXJ0ZXhNYXRyaWNlcyA9IE1hdGguZmxvb3IoICggblZlcnRleFVuaWZvcm1zIC0gMjAgKSAvIDQgKTtcblxuXHRcdFx0dmFyIG1heEJvbmVzID0gTWF0aC5taW4oIG5WZXJ0ZXhNYXRyaWNlcywgYm9uZXMubGVuZ3RoICk7XG5cblx0XHRcdGlmICggbWF4Qm9uZXMgPCBib25lcy5sZW5ndGggKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogU2tlbGV0b24gaGFzICcgKyBib25lcy5sZW5ndGggKyAnIGJvbmVzLiBUaGlzIEdQVSBzdXBwb3J0cyAnICsgbWF4Qm9uZXMgKyAnLicgKTtcblx0XHRcdFx0cmV0dXJuIDA7XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIG1heEJvbmVzO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBnZXRUZXh0dXJlRW5jb2RpbmdGcm9tTWFwKCBtYXAsIGdhbW1hT3ZlcnJpZGVMaW5lYXIgKSB7XG5cblx0XHR2YXIgZW5jb2Rpbmc7XG5cblx0XHRpZiAoICEgbWFwICkge1xuXG5cdFx0XHRlbmNvZGluZyA9IExpbmVhckVuY29kaW5nO1xuXG5cdFx0fSBlbHNlIGlmICggbWFwLmlzVGV4dHVyZSApIHtcblxuXHRcdFx0ZW5jb2RpbmcgPSBtYXAuZW5jb2Rpbmc7XG5cblx0XHR9IGVsc2UgaWYgKCBtYXAuaXNXZWJHTFJlbmRlclRhcmdldCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCBcIlRIUkVFLldlYkdMUHJvZ3JhbXMuZ2V0VGV4dHVyZUVuY29kaW5nRnJvbU1hcDogZG9uJ3QgdXNlIHJlbmRlciB0YXJnZXRzIGFzIHRleHR1cmVzLiBVc2UgdGhlaXIgLnRleHR1cmUgcHJvcGVydHkgaW5zdGVhZC5cIiApO1xuXHRcdFx0ZW5jb2RpbmcgPSBtYXAudGV4dHVyZS5lbmNvZGluZztcblxuXHRcdH1cblxuXHRcdC8vIGFkZCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBmb3IgV2ViR0xSZW5kZXJlci5nYW1tYUlucHV0L2dhbW1hT3V0cHV0IHBhcmFtZXRlciwgc2hvdWxkIHByb2JhYmx5IGJlIHJlbW92ZWQgYXQgc29tZSBwb2ludC5cblx0XHRpZiAoIGVuY29kaW5nID09PSBMaW5lYXJFbmNvZGluZyAmJiBnYW1tYU92ZXJyaWRlTGluZWFyICkge1xuXG5cdFx0XHRlbmNvZGluZyA9IEdhbW1hRW5jb2Rpbmc7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gZW5jb2Rpbmc7XG5cblx0fVxuXG5cdHRoaXMuZ2V0UGFyYW1ldGVycyA9IGZ1bmN0aW9uICggbWF0ZXJpYWwsIGxpZ2h0cywgZm9nLCBuQ2xpcFBsYW5lcywgbkNsaXBJbnRlcnNlY3Rpb24sIG9iamVjdCApIHtcblxuXHRcdHZhciBzaGFkZXJJRCA9IHNoYWRlcklEc1sgbWF0ZXJpYWwudHlwZSBdO1xuXG5cdFx0Ly8gaGV1cmlzdGljcyB0byBjcmVhdGUgc2hhZGVyIHBhcmFtZXRlcnMgYWNjb3JkaW5nIHRvIGxpZ2h0cyBpbiB0aGUgc2NlbmVcblx0XHQvLyAobm90IHRvIGJsb3cgb3ZlciBtYXhMaWdodHMgYnVkZ2V0KVxuXG5cdFx0dmFyIG1heEJvbmVzID0gb2JqZWN0LmlzU2tpbm5lZE1lc2ggPyBhbGxvY2F0ZUJvbmVzKCBvYmplY3QgKSA6IDA7XG5cdFx0dmFyIHByZWNpc2lvbiA9IHJlbmRlcmVyLmdldFByZWNpc2lvbigpO1xuXG5cdFx0aWYgKCBtYXRlcmlhbC5wcmVjaXNpb24gIT09IG51bGwgKSB7XG5cblx0XHRcdHByZWNpc2lvbiA9IGNhcGFiaWxpdGllcy5nZXRNYXhQcmVjaXNpb24oIG1hdGVyaWFsLnByZWNpc2lvbiApO1xuXG5cdFx0XHRpZiAoIHByZWNpc2lvbiAhPT0gbWF0ZXJpYWwucHJlY2lzaW9uICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUHJvZ3JhbS5nZXRQYXJhbWV0ZXJzOicsIG1hdGVyaWFsLnByZWNpc2lvbiwgJ25vdCBzdXBwb3J0ZWQsIHVzaW5nJywgcHJlY2lzaW9uLCAnaW5zdGVhZC4nICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHZhciBjdXJyZW50UmVuZGVyVGFyZ2V0ID0gcmVuZGVyZXIuZ2V0UmVuZGVyVGFyZ2V0KCk7XG5cblx0XHR2YXIgcGFyYW1ldGVycyA9IHtcblxuXHRcdFx0c2hhZGVySUQ6IHNoYWRlcklELFxuXG5cdFx0XHRwcmVjaXNpb246IHByZWNpc2lvbixcblx0XHRcdHN1cHBvcnRzVmVydGV4VGV4dHVyZXM6IGNhcGFiaWxpdGllcy52ZXJ0ZXhUZXh0dXJlcyxcblx0XHRcdG91dHB1dEVuY29kaW5nOiBnZXRUZXh0dXJlRW5jb2RpbmdGcm9tTWFwKCAoICEgY3VycmVudFJlbmRlclRhcmdldCApID8gbnVsbCA6IGN1cnJlbnRSZW5kZXJUYXJnZXQudGV4dHVyZSwgcmVuZGVyZXIuZ2FtbWFPdXRwdXQgKSxcblx0XHRcdG1hcDogISEgbWF0ZXJpYWwubWFwLFxuXHRcdFx0bWFwRW5jb2Rpbmc6IGdldFRleHR1cmVFbmNvZGluZ0Zyb21NYXAoIG1hdGVyaWFsLm1hcCwgcmVuZGVyZXIuZ2FtbWFJbnB1dCApLFxuXHRcdFx0ZW52TWFwOiAhISBtYXRlcmlhbC5lbnZNYXAsXG5cdFx0XHRlbnZNYXBNb2RlOiBtYXRlcmlhbC5lbnZNYXAgJiYgbWF0ZXJpYWwuZW52TWFwLm1hcHBpbmcsXG5cdFx0XHRlbnZNYXBFbmNvZGluZzogZ2V0VGV4dHVyZUVuY29kaW5nRnJvbU1hcCggbWF0ZXJpYWwuZW52TWFwLCByZW5kZXJlci5nYW1tYUlucHV0ICksXG5cdFx0XHRlbnZNYXBDdWJlVVY6ICggISEgbWF0ZXJpYWwuZW52TWFwICkgJiYgKCAoIG1hdGVyaWFsLmVudk1hcC5tYXBwaW5nID09PSBDdWJlVVZSZWZsZWN0aW9uTWFwcGluZyApIHx8ICggbWF0ZXJpYWwuZW52TWFwLm1hcHBpbmcgPT09IEN1YmVVVlJlZnJhY3Rpb25NYXBwaW5nICkgKSxcblx0XHRcdGxpZ2h0TWFwOiAhISBtYXRlcmlhbC5saWdodE1hcCxcblx0XHRcdGFvTWFwOiAhISBtYXRlcmlhbC5hb01hcCxcblx0XHRcdGVtaXNzaXZlTWFwOiAhISBtYXRlcmlhbC5lbWlzc2l2ZU1hcCxcblx0XHRcdGVtaXNzaXZlTWFwRW5jb2Rpbmc6IGdldFRleHR1cmVFbmNvZGluZ0Zyb21NYXAoIG1hdGVyaWFsLmVtaXNzaXZlTWFwLCByZW5kZXJlci5nYW1tYUlucHV0ICksXG5cdFx0XHRidW1wTWFwOiAhISBtYXRlcmlhbC5idW1wTWFwLFxuXHRcdFx0bm9ybWFsTWFwOiAhISBtYXRlcmlhbC5ub3JtYWxNYXAsXG5cdFx0XHRkaXNwbGFjZW1lbnRNYXA6ICEhIG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcCxcblx0XHRcdHJvdWdobmVzc01hcDogISEgbWF0ZXJpYWwucm91Z2huZXNzTWFwLFxuXHRcdFx0bWV0YWxuZXNzTWFwOiAhISBtYXRlcmlhbC5tZXRhbG5lc3NNYXAsXG5cdFx0XHRzcGVjdWxhck1hcDogISEgbWF0ZXJpYWwuc3BlY3VsYXJNYXAsXG5cdFx0XHRhbHBoYU1hcDogISEgbWF0ZXJpYWwuYWxwaGFNYXAsXG5cblx0XHRcdGdyYWRpZW50TWFwOiAhISBtYXRlcmlhbC5ncmFkaWVudE1hcCxcblxuXHRcdFx0Y29tYmluZTogbWF0ZXJpYWwuY29tYmluZSxcblxuXHRcdFx0dmVydGV4Q29sb3JzOiBtYXRlcmlhbC52ZXJ0ZXhDb2xvcnMsXG5cblx0XHRcdGZvZzogISEgZm9nLFxuXHRcdFx0dXNlRm9nOiBtYXRlcmlhbC5mb2csXG5cdFx0XHRmb2dFeHA6ICggZm9nICYmIGZvZy5pc0ZvZ0V4cDIgKSxcblxuXHRcdFx0ZmxhdFNoYWRpbmc6IG1hdGVyaWFsLnNoYWRpbmcgPT09IEZsYXRTaGFkaW5nLFxuXG5cdFx0XHRzaXplQXR0ZW51YXRpb246IG1hdGVyaWFsLnNpemVBdHRlbnVhdGlvbixcblx0XHRcdGxvZ2FyaXRobWljRGVwdGhCdWZmZXI6IGNhcGFiaWxpdGllcy5sb2dhcml0aG1pY0RlcHRoQnVmZmVyLFxuXG5cdFx0XHRza2lubmluZzogbWF0ZXJpYWwuc2tpbm5pbmcgJiYgbWF4Qm9uZXMgPiAwLFxuXHRcdFx0bWF4Qm9uZXM6IG1heEJvbmVzLFxuXHRcdFx0dXNlVmVydGV4VGV4dHVyZTogY2FwYWJpbGl0aWVzLmZsb2F0VmVydGV4VGV4dHVyZXMsXG5cblx0XHRcdG1vcnBoVGFyZ2V0czogbWF0ZXJpYWwubW9ycGhUYXJnZXRzLFxuXHRcdFx0bW9ycGhOb3JtYWxzOiBtYXRlcmlhbC5tb3JwaE5vcm1hbHMsXG5cdFx0XHRtYXhNb3JwaFRhcmdldHM6IHJlbmRlcmVyLm1heE1vcnBoVGFyZ2V0cyxcblx0XHRcdG1heE1vcnBoTm9ybWFsczogcmVuZGVyZXIubWF4TW9ycGhOb3JtYWxzLFxuXG5cdFx0XHRudW1EaXJMaWdodHM6IGxpZ2h0cy5kaXJlY3Rpb25hbC5sZW5ndGgsXG5cdFx0XHRudW1Qb2ludExpZ2h0czogbGlnaHRzLnBvaW50Lmxlbmd0aCxcblx0XHRcdG51bVNwb3RMaWdodHM6IGxpZ2h0cy5zcG90Lmxlbmd0aCxcblx0XHRcdG51bVJlY3RBcmVhTGlnaHRzOiBsaWdodHMucmVjdEFyZWEubGVuZ3RoLFxuXHRcdFx0bnVtSGVtaUxpZ2h0czogbGlnaHRzLmhlbWkubGVuZ3RoLFxuXG5cdFx0XHRudW1DbGlwcGluZ1BsYW5lczogbkNsaXBQbGFuZXMsXG5cdFx0XHRudW1DbGlwSW50ZXJzZWN0aW9uOiBuQ2xpcEludGVyc2VjdGlvbixcblxuXHRcdFx0ZGl0aGVyaW5nOiBtYXRlcmlhbC5kaXRoZXJpbmcsXG5cblx0XHRcdHNoYWRvd01hcEVuYWJsZWQ6IHJlbmRlcmVyLnNoYWRvd01hcC5lbmFibGVkICYmIG9iamVjdC5yZWNlaXZlU2hhZG93ICYmIGxpZ2h0cy5zaGFkb3dzLmxlbmd0aCA+IDAsXG5cdFx0XHRzaGFkb3dNYXBUeXBlOiByZW5kZXJlci5zaGFkb3dNYXAudHlwZSxcblxuXHRcdFx0dG9uZU1hcHBpbmc6IHJlbmRlcmVyLnRvbmVNYXBwaW5nLFxuXHRcdFx0cGh5c2ljYWxseUNvcnJlY3RMaWdodHM6IHJlbmRlcmVyLnBoeXNpY2FsbHlDb3JyZWN0TGlnaHRzLFxuXG5cdFx0XHRwcmVtdWx0aXBsaWVkQWxwaGE6IG1hdGVyaWFsLnByZW11bHRpcGxpZWRBbHBoYSxcblxuXHRcdFx0YWxwaGFUZXN0OiBtYXRlcmlhbC5hbHBoYVRlc3QsXG5cdFx0XHRkb3VibGVTaWRlZDogbWF0ZXJpYWwuc2lkZSA9PT0gRG91YmxlU2lkZSxcblx0XHRcdGZsaXBTaWRlZDogbWF0ZXJpYWwuc2lkZSA9PT0gQmFja1NpZGUsXG5cblx0XHRcdGRlcHRoUGFja2luZzogKCBtYXRlcmlhbC5kZXB0aFBhY2tpbmcgIT09IHVuZGVmaW5lZCApID8gbWF0ZXJpYWwuZGVwdGhQYWNraW5nIDogZmFsc2VcblxuXHRcdH07XG5cblx0XHRyZXR1cm4gcGFyYW1ldGVycztcblxuXHR9O1xuXG5cdHRoaXMuZ2V0UHJvZ3JhbUNvZGUgPSBmdW5jdGlvbiAoIG1hdGVyaWFsLCBwYXJhbWV0ZXJzICkge1xuXG5cdFx0dmFyIGFycmF5ID0gW107XG5cblx0XHRpZiAoIHBhcmFtZXRlcnMuc2hhZGVySUQgKSB7XG5cblx0XHRcdGFycmF5LnB1c2goIHBhcmFtZXRlcnMuc2hhZGVySUQgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGFycmF5LnB1c2goIG1hdGVyaWFsLmZyYWdtZW50U2hhZGVyICk7XG5cdFx0XHRhcnJheS5wdXNoKCBtYXRlcmlhbC52ZXJ0ZXhTaGFkZXIgKTtcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwuZGVmaW5lcyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRmb3IgKCB2YXIgbmFtZSBpbiBtYXRlcmlhbC5kZWZpbmVzICkge1xuXG5cdFx0XHRcdGFycmF5LnB1c2goIG5hbWUgKTtcblx0XHRcdFx0YXJyYXkucHVzaCggbWF0ZXJpYWwuZGVmaW5lc1sgbmFtZSBdICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IHBhcmFtZXRlck5hbWVzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0YXJyYXkucHVzaCggcGFyYW1ldGVyc1sgcGFyYW1ldGVyTmFtZXNbIGkgXSBdICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gYXJyYXkuam9pbigpO1xuXG5cdH07XG5cblx0dGhpcy5hY3F1aXJlUHJvZ3JhbSA9IGZ1bmN0aW9uICggbWF0ZXJpYWwsIHBhcmFtZXRlcnMsIGNvZGUgKSB7XG5cblx0XHR2YXIgcHJvZ3JhbTtcblxuXHRcdC8vIENoZWNrIGlmIGNvZGUgaGFzIGJlZW4gYWxyZWFkeSBjb21waWxlZFxuXHRcdGZvciAoIHZhciBwID0gMCwgcGwgPSBwcm9ncmFtcy5sZW5ndGg7IHAgPCBwbDsgcCArKyApIHtcblxuXHRcdFx0dmFyIHByb2dyYW1JbmZvID0gcHJvZ3JhbXNbIHAgXTtcblxuXHRcdFx0aWYgKCBwcm9ncmFtSW5mby5jb2RlID09PSBjb2RlICkge1xuXG5cdFx0XHRcdHByb2dyYW0gPSBwcm9ncmFtSW5mbztcblx0XHRcdFx0KysgcHJvZ3JhbS51c2VkVGltZXM7XG5cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggcHJvZ3JhbSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRwcm9ncmFtID0gbmV3IFdlYkdMUHJvZ3JhbSggcmVuZGVyZXIsIGNvZGUsIG1hdGVyaWFsLCBwYXJhbWV0ZXJzICk7XG5cdFx0XHRwcm9ncmFtcy5wdXNoKCBwcm9ncmFtICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gcHJvZ3JhbTtcblxuXHR9O1xuXG5cdHRoaXMucmVsZWFzZVByb2dyYW0gPSBmdW5jdGlvbiAoIHByb2dyYW0gKSB7XG5cblx0XHRpZiAoIC0tIHByb2dyYW0udXNlZFRpbWVzID09PSAwICkge1xuXG5cdFx0XHQvLyBSZW1vdmUgZnJvbSB1bm9yZGVyZWQgc2V0XG5cdFx0XHR2YXIgaSA9IHByb2dyYW1zLmluZGV4T2YoIHByb2dyYW0gKTtcblx0XHRcdHByb2dyYW1zWyBpIF0gPSBwcm9ncmFtc1sgcHJvZ3JhbXMubGVuZ3RoIC0gMSBdO1xuXHRcdFx0cHJvZ3JhbXMucG9wKCk7XG5cblx0XHRcdC8vIEZyZWUgV2ViR0wgcmVzb3VyY2VzXG5cdFx0XHRwcm9ncmFtLmRlc3Ryb3koKTtcblxuXHRcdH1cblxuXHR9O1xuXG5cdC8vIEV4cG9zZWQgZm9yIHJlc291cmNlIG1vbml0b3JpbmcgJiBlcnJvciBmZWVkYmFjayB2aWEgcmVuZGVyZXIuaW5mbzpcblx0dGhpcy5wcm9ncmFtcyA9IHByb2dyYW1zO1xuXG59XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBXZWJHTFRleHR1cmVzKCBfZ2wsIGV4dGVuc2lvbnMsIHN0YXRlLCBwcm9wZXJ0aWVzLCBjYXBhYmlsaXRpZXMsIHBhcmFtVGhyZWVUb0dMLCBpbmZvTWVtb3J5ICkge1xuXG5cdHZhciBfaXNXZWJHTDIgPSAoIHR5cGVvZiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0ICE9PSAndW5kZWZpbmVkJyAmJiBfZ2wgaW5zdGFuY2VvZiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0ICk7XG5cblx0Ly9cblxuXHRmdW5jdGlvbiBjbGFtcFRvTWF4U2l6ZSggaW1hZ2UsIG1heFNpemUgKSB7XG5cblx0XHRpZiAoIGltYWdlLndpZHRoID4gbWF4U2l6ZSB8fCBpbWFnZS5oZWlnaHQgPiBtYXhTaXplICkge1xuXG5cdFx0XHQvLyBXYXJuaW5nOiBTY2FsaW5nIHRocm91Z2ggdGhlIGNhbnZhcyB3aWxsIG9ubHkgd29yayB3aXRoIGltYWdlcyB0aGF0IHVzZVxuXHRcdFx0Ly8gcHJlbXVsdGlwbGllZCBhbHBoYS5cblxuXHRcdFx0dmFyIHNjYWxlID0gbWF4U2l6ZSAvIE1hdGgubWF4KCBpbWFnZS53aWR0aCwgaW1hZ2UuaGVpZ2h0ICk7XG5cblx0XHRcdHZhciBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJywgJ2NhbnZhcycgKTtcblx0XHRcdGNhbnZhcy53aWR0aCA9IE1hdGguZmxvb3IoIGltYWdlLndpZHRoICogc2NhbGUgKTtcblx0XHRcdGNhbnZhcy5oZWlnaHQgPSBNYXRoLmZsb29yKCBpbWFnZS5oZWlnaHQgKiBzY2FsZSApO1xuXG5cdFx0XHR2YXIgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KCAnMmQnICk7XG5cdFx0XHRjb250ZXh0LmRyYXdJbWFnZSggaW1hZ2UsIDAsIDAsIGltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHQsIDAsIDAsIGNhbnZhcy53aWR0aCwgY2FudmFzLmhlaWdodCApO1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBpbWFnZSBpcyB0b28gYmlnICgnICsgaW1hZ2Uud2lkdGggKyAneCcgKyBpbWFnZS5oZWlnaHQgKyAnKS4gUmVzaXplZCB0byAnICsgY2FudmFzLndpZHRoICsgJ3gnICsgY2FudmFzLmhlaWdodCwgaW1hZ2UgKTtcblxuXHRcdFx0cmV0dXJuIGNhbnZhcztcblxuXHRcdH1cblxuXHRcdHJldHVybiBpbWFnZTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gaXNQb3dlck9mVHdvKCBpbWFnZSApIHtcblxuXHRcdHJldHVybiBfTWF0aC5pc1Bvd2VyT2ZUd28oIGltYWdlLndpZHRoICkgJiYgX01hdGguaXNQb3dlck9mVHdvKCBpbWFnZS5oZWlnaHQgKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gbWFrZVBvd2VyT2ZUd28oIGltYWdlICkge1xuXG5cdFx0aWYgKCBpbWFnZSBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnQgfHwgaW1hZ2UgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudCApIHtcblxuXHRcdFx0dmFyIGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyggJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnLCAnY2FudmFzJyApO1xuXHRcdFx0Y2FudmFzLndpZHRoID0gX01hdGgubmVhcmVzdFBvd2VyT2ZUd28oIGltYWdlLndpZHRoICk7XG5cdFx0XHRjYW52YXMuaGVpZ2h0ID0gX01hdGgubmVhcmVzdFBvd2VyT2ZUd28oIGltYWdlLmhlaWdodCApO1xuXG5cdFx0XHR2YXIgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KCAnMmQnICk7XG5cdFx0XHRjb250ZXh0LmRyYXdJbWFnZSggaW1hZ2UsIDAsIDAsIGNhbnZhcy53aWR0aCwgY2FudmFzLmhlaWdodCApO1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBpbWFnZSBpcyBub3QgcG93ZXIgb2YgdHdvICgnICsgaW1hZ2Uud2lkdGggKyAneCcgKyBpbWFnZS5oZWlnaHQgKyAnKS4gUmVzaXplZCB0byAnICsgY2FudmFzLndpZHRoICsgJ3gnICsgY2FudmFzLmhlaWdodCwgaW1hZ2UgKTtcblxuXHRcdFx0cmV0dXJuIGNhbnZhcztcblxuXHRcdH1cblxuXHRcdHJldHVybiBpbWFnZTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gdGV4dHVyZU5lZWRzUG93ZXJPZlR3byggdGV4dHVyZSApIHtcblxuXHRcdHJldHVybiAoIHRleHR1cmUud3JhcFMgIT09IENsYW1wVG9FZGdlV3JhcHBpbmcgfHwgdGV4dHVyZS53cmFwVCAhPT0gQ2xhbXBUb0VkZ2VXcmFwcGluZyApIHx8XG5cdFx0XHQoIHRleHR1cmUubWluRmlsdGVyICE9PSBOZWFyZXN0RmlsdGVyICYmIHRleHR1cmUubWluRmlsdGVyICE9PSBMaW5lYXJGaWx0ZXIgKTtcblxuXHR9XG5cblx0Ly8gRmFsbGJhY2sgZmlsdGVycyBmb3Igbm9uLXBvd2VyLW9mLTIgdGV4dHVyZXNcblxuXHRmdW5jdGlvbiBmaWx0ZXJGYWxsYmFjayggZiApIHtcblxuXHRcdGlmICggZiA9PT0gTmVhcmVzdEZpbHRlciB8fCBmID09PSBOZWFyZXN0TWlwTWFwTmVhcmVzdEZpbHRlciB8fCBmID09PSBOZWFyZXN0TWlwTWFwTGluZWFyRmlsdGVyICkge1xuXG5cdFx0XHRyZXR1cm4gX2dsLk5FQVJFU1Q7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gX2dsLkxJTkVBUjtcblxuXHR9XG5cblx0Ly9cblxuXHRmdW5jdGlvbiBvblRleHR1cmVEaXNwb3NlKCBldmVudCApIHtcblxuXHRcdHZhciB0ZXh0dXJlID0gZXZlbnQudGFyZ2V0O1xuXG5cdFx0dGV4dHVyZS5yZW1vdmVFdmVudExpc3RlbmVyKCAnZGlzcG9zZScsIG9uVGV4dHVyZURpc3Bvc2UgKTtcblxuXHRcdGRlYWxsb2NhdGVUZXh0dXJlKCB0ZXh0dXJlICk7XG5cblx0XHRpbmZvTWVtb3J5LnRleHR1cmVzIC0tO1xuXG5cblx0fVxuXG5cdGZ1bmN0aW9uIG9uUmVuZGVyVGFyZ2V0RGlzcG9zZSggZXZlbnQgKSB7XG5cblx0XHR2YXIgcmVuZGVyVGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuXG5cdFx0cmVuZGVyVGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoICdkaXNwb3NlJywgb25SZW5kZXJUYXJnZXREaXNwb3NlICk7XG5cblx0XHRkZWFsbG9jYXRlUmVuZGVyVGFyZ2V0KCByZW5kZXJUYXJnZXQgKTtcblxuXHRcdGluZm9NZW1vcnkudGV4dHVyZXMgLS07XG5cblx0fVxuXG5cdC8vXG5cblx0ZnVuY3Rpb24gZGVhbGxvY2F0ZVRleHR1cmUoIHRleHR1cmUgKSB7XG5cblx0XHR2YXIgdGV4dHVyZVByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggdGV4dHVyZSApO1xuXG5cdFx0aWYgKCB0ZXh0dXJlLmltYWdlICYmIHRleHR1cmVQcm9wZXJ0aWVzLl9faW1hZ2VfX3dlYmdsVGV4dHVyZUN1YmUgKSB7XG5cblx0XHRcdC8vIGN1YmUgdGV4dHVyZVxuXG5cdFx0XHRfZ2wuZGVsZXRlVGV4dHVyZSggdGV4dHVyZVByb3BlcnRpZXMuX19pbWFnZV9fd2ViZ2xUZXh0dXJlQ3ViZSApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gMkQgdGV4dHVyZVxuXG5cdFx0XHRpZiAoIHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xJbml0ID09PSB1bmRlZmluZWQgKSByZXR1cm47XG5cblx0XHRcdF9nbC5kZWxldGVUZXh0dXJlKCB0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gcmVtb3ZlIGFsbCB3ZWJnbCBwcm9wZXJ0aWVzXG5cdFx0cHJvcGVydGllcy5yZW1vdmUoIHRleHR1cmUgKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gZGVhbGxvY2F0ZVJlbmRlclRhcmdldCggcmVuZGVyVGFyZ2V0ICkge1xuXG5cdFx0dmFyIHJlbmRlclRhcmdldFByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0ICk7XG5cdFx0dmFyIHRleHR1cmVQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIHJlbmRlclRhcmdldC50ZXh0dXJlICk7XG5cblx0XHRpZiAoICEgcmVuZGVyVGFyZ2V0ICkgcmV0dXJuO1xuXG5cdFx0aWYgKCB0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRfZ2wuZGVsZXRlVGV4dHVyZSggdGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbFRleHR1cmUgKTtcblxuXHRcdH1cblxuXHRcdGlmICggcmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZSApIHtcblxuXHRcdFx0cmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZS5kaXNwb3NlKCk7XG5cblx0XHR9XG5cblx0XHRpZiAoIHJlbmRlclRhcmdldC5pc1dlYkdMUmVuZGVyVGFyZ2V0Q3ViZSApIHtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgNjsgaSArKyApIHtcblxuXHRcdFx0XHRfZ2wuZGVsZXRlRnJhbWVidWZmZXIoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyWyBpIF0gKTtcblx0XHRcdFx0aWYgKCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xEZXB0aGJ1ZmZlciApIF9nbC5kZWxldGVSZW5kZXJidWZmZXIoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbERlcHRoYnVmZmVyWyBpIF0gKTtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0X2dsLmRlbGV0ZUZyYW1lYnVmZmVyKCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlciApO1xuXHRcdFx0aWYgKCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xEZXB0aGJ1ZmZlciApIF9nbC5kZWxldGVSZW5kZXJidWZmZXIoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbERlcHRoYnVmZmVyICk7XG5cblx0XHR9XG5cblx0XHRwcm9wZXJ0aWVzLnJlbW92ZSggcmVuZGVyVGFyZ2V0LnRleHR1cmUgKTtcblx0XHRwcm9wZXJ0aWVzLnJlbW92ZSggcmVuZGVyVGFyZ2V0ICk7XG5cblx0fVxuXG5cdC8vXG5cblxuXG5cdGZ1bmN0aW9uIHNldFRleHR1cmUyRCggdGV4dHVyZSwgc2xvdCApIHtcblxuXHRcdHZhciB0ZXh0dXJlUHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCB0ZXh0dXJlICk7XG5cblx0XHRpZiAoIHRleHR1cmUudmVyc2lvbiA+IDAgJiYgdGV4dHVyZVByb3BlcnRpZXMuX192ZXJzaW9uICE9PSB0ZXh0dXJlLnZlcnNpb24gKSB7XG5cblx0XHRcdHZhciBpbWFnZSA9IHRleHR1cmUuaW1hZ2U7XG5cblx0XHRcdGlmICggaW1hZ2UgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBUZXh0dXJlIG1hcmtlZCBmb3IgdXBkYXRlIGJ1dCBpbWFnZSBpcyB1bmRlZmluZWQnLCB0ZXh0dXJlICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIGltYWdlLmNvbXBsZXRlID09PSBmYWxzZSApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBUZXh0dXJlIG1hcmtlZCBmb3IgdXBkYXRlIGJ1dCBpbWFnZSBpcyBpbmNvbXBsZXRlJywgdGV4dHVyZSApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHVwbG9hZFRleHR1cmUoIHRleHR1cmVQcm9wZXJ0aWVzLCB0ZXh0dXJlLCBzbG90ICk7XG5cdFx0XHRcdHJldHVybjtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0c3RhdGUuYWN0aXZlVGV4dHVyZSggX2dsLlRFWFRVUkUwICsgc2xvdCApO1xuXHRcdHN0YXRlLmJpbmRUZXh0dXJlKCBfZ2wuVEVYVFVSRV8yRCwgdGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbFRleHR1cmUgKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gc2V0VGV4dHVyZUN1YmUoIHRleHR1cmUsIHNsb3QgKSB7XG5cblx0XHR2YXIgdGV4dHVyZVByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggdGV4dHVyZSApO1xuXG5cdFx0aWYgKCB0ZXh0dXJlLmltYWdlLmxlbmd0aCA9PT0gNiApIHtcblxuXHRcdFx0aWYgKCB0ZXh0dXJlLnZlcnNpb24gPiAwICYmIHRleHR1cmVQcm9wZXJ0aWVzLl9fdmVyc2lvbiAhPT0gdGV4dHVyZS52ZXJzaW9uICkge1xuXG5cdFx0XHRcdGlmICggISB0ZXh0dXJlUHJvcGVydGllcy5fX2ltYWdlX193ZWJnbFRleHR1cmVDdWJlICkge1xuXG5cdFx0XHRcdFx0dGV4dHVyZS5hZGRFdmVudExpc3RlbmVyKCAnZGlzcG9zZScsIG9uVGV4dHVyZURpc3Bvc2UgKTtcblxuXHRcdFx0XHRcdHRleHR1cmVQcm9wZXJ0aWVzLl9faW1hZ2VfX3dlYmdsVGV4dHVyZUN1YmUgPSBfZ2wuY3JlYXRlVGV4dHVyZSgpO1xuXG5cdFx0XHRcdFx0aW5mb01lbW9yeS50ZXh0dXJlcyArKztcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0c3RhdGUuYWN0aXZlVGV4dHVyZSggX2dsLlRFWFRVUkUwICsgc2xvdCApO1xuXHRcdFx0XHRzdGF0ZS5iaW5kVGV4dHVyZSggX2dsLlRFWFRVUkVfQ1VCRV9NQVAsIHRleHR1cmVQcm9wZXJ0aWVzLl9faW1hZ2VfX3dlYmdsVGV4dHVyZUN1YmUgKTtcblxuXHRcdFx0XHRfZ2wucGl4ZWxTdG9yZWkoIF9nbC5VTlBBQ0tfRkxJUF9ZX1dFQkdMLCB0ZXh0dXJlLmZsaXBZICk7XG5cblx0XHRcdFx0dmFyIGlzQ29tcHJlc3NlZCA9ICggdGV4dHVyZSAmJiB0ZXh0dXJlLmlzQ29tcHJlc3NlZFRleHR1cmUgKTtcblx0XHRcdFx0dmFyIGlzRGF0YVRleHR1cmUgPSAoIHRleHR1cmUuaW1hZ2VbIDAgXSAmJiB0ZXh0dXJlLmltYWdlWyAwIF0uaXNEYXRhVGV4dHVyZSApO1xuXG5cdFx0XHRcdHZhciBjdWJlSW1hZ2UgPSBbXTtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCA2OyBpICsrICkge1xuXG5cdFx0XHRcdFx0aWYgKCAhIGlzQ29tcHJlc3NlZCAmJiAhIGlzRGF0YVRleHR1cmUgKSB7XG5cblx0XHRcdFx0XHRcdGN1YmVJbWFnZVsgaSBdID0gY2xhbXBUb01heFNpemUoIHRleHR1cmUuaW1hZ2VbIGkgXSwgY2FwYWJpbGl0aWVzLm1heEN1YmVtYXBTaXplICk7XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRjdWJlSW1hZ2VbIGkgXSA9IGlzRGF0YVRleHR1cmUgPyB0ZXh0dXJlLmltYWdlWyBpIF0uaW1hZ2UgOiB0ZXh0dXJlLmltYWdlWyBpIF07XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHZhciBpbWFnZSA9IGN1YmVJbWFnZVsgMCBdLFxuXHRcdFx0XHRpc1Bvd2VyT2ZUd29JbWFnZSA9IGlzUG93ZXJPZlR3byggaW1hZ2UgKSxcblx0XHRcdFx0Z2xGb3JtYXQgPSBwYXJhbVRocmVlVG9HTCggdGV4dHVyZS5mb3JtYXQgKSxcblx0XHRcdFx0Z2xUeXBlID0gcGFyYW1UaHJlZVRvR0woIHRleHR1cmUudHlwZSApO1xuXG5cdFx0XHRcdHNldFRleHR1cmVQYXJhbWV0ZXJzKCBfZ2wuVEVYVFVSRV9DVUJFX01BUCwgdGV4dHVyZSwgaXNQb3dlck9mVHdvSW1hZ2UgKTtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCA2OyBpICsrICkge1xuXG5cdFx0XHRcdFx0aWYgKCAhIGlzQ29tcHJlc3NlZCApIHtcblxuXHRcdFx0XHRcdFx0aWYgKCBpc0RhdGFUZXh0dXJlICkge1xuXG5cdFx0XHRcdFx0XHRcdHN0YXRlLnRleEltYWdlMkQoIF9nbC5URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1ggKyBpLCAwLCBnbEZvcm1hdCwgY3ViZUltYWdlWyBpIF0ud2lkdGgsIGN1YmVJbWFnZVsgaSBdLmhlaWdodCwgMCwgZ2xGb3JtYXQsIGdsVHlwZSwgY3ViZUltYWdlWyBpIF0uZGF0YSApO1xuXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdHN0YXRlLnRleEltYWdlMkQoIF9nbC5URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1ggKyBpLCAwLCBnbEZvcm1hdCwgZ2xGb3JtYXQsIGdsVHlwZSwgY3ViZUltYWdlWyBpIF0gKTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0dmFyIG1pcG1hcCwgbWlwbWFwcyA9IGN1YmVJbWFnZVsgaSBdLm1pcG1hcHM7XG5cblx0XHRcdFx0XHRcdGZvciAoIHZhciBqID0gMCwgamwgPSBtaXBtYXBzLmxlbmd0aDsgaiA8IGpsOyBqICsrICkge1xuXG5cdFx0XHRcdFx0XHRcdG1pcG1hcCA9IG1pcG1hcHNbIGogXTtcblxuXHRcdFx0XHRcdFx0XHRpZiAoIHRleHR1cmUuZm9ybWF0ICE9PSBSR0JBRm9ybWF0ICYmIHRleHR1cmUuZm9ybWF0ICE9PSBSR0JGb3JtYXQgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRpZiAoIHN0YXRlLmdldENvbXByZXNzZWRUZXh0dXJlRm9ybWF0cygpLmluZGV4T2YoIGdsRm9ybWF0ICkgPiAtIDEgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRcdHN0YXRlLmNvbXByZXNzZWRUZXhJbWFnZTJEKCBfZ2wuVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YICsgaSwgaiwgZ2xGb3JtYXQsIG1pcG1hcC53aWR0aCwgbWlwbWFwLmhlaWdodCwgMCwgbWlwbWFwLmRhdGEgKTtcblxuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdFx0XHRcdGNvbnNvbGUud2FybiggXCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBBdHRlbXB0IHRvIGxvYWQgdW5zdXBwb3J0ZWQgY29tcHJlc3NlZCB0ZXh0dXJlIGZvcm1hdCBpbiAuc2V0VGV4dHVyZUN1YmUoKVwiICk7XG5cblx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0XHRcdHN0YXRlLnRleEltYWdlMkQoIF9nbC5URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1ggKyBpLCBqLCBnbEZvcm1hdCwgbWlwbWFwLndpZHRoLCBtaXBtYXAuaGVpZ2h0LCAwLCBnbEZvcm1hdCwgZ2xUeXBlLCBtaXBtYXAuZGF0YSApO1xuXG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIHRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzICYmIGlzUG93ZXJPZlR3b0ltYWdlICkge1xuXG5cdFx0XHRcdFx0X2dsLmdlbmVyYXRlTWlwbWFwKCBfZ2wuVEVYVFVSRV9DVUJFX01BUCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0ZXh0dXJlUHJvcGVydGllcy5fX3ZlcnNpb24gPSB0ZXh0dXJlLnZlcnNpb247XG5cblx0XHRcdFx0aWYgKCB0ZXh0dXJlLm9uVXBkYXRlICkgdGV4dHVyZS5vblVwZGF0ZSggdGV4dHVyZSApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHN0YXRlLmFjdGl2ZVRleHR1cmUoIF9nbC5URVhUVVJFMCArIHNsb3QgKTtcblx0XHRcdFx0c3RhdGUuYmluZFRleHR1cmUoIF9nbC5URVhUVVJFX0NVQkVfTUFQLCB0ZXh0dXJlUHJvcGVydGllcy5fX2ltYWdlX193ZWJnbFRleHR1cmVDdWJlICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gc2V0VGV4dHVyZUN1YmVEeW5hbWljKCB0ZXh0dXJlLCBzbG90ICkge1xuXG5cdFx0c3RhdGUuYWN0aXZlVGV4dHVyZSggX2dsLlRFWFRVUkUwICsgc2xvdCApO1xuXHRcdHN0YXRlLmJpbmRUZXh0dXJlKCBfZ2wuVEVYVFVSRV9DVUJFX01BUCwgcHJvcGVydGllcy5nZXQoIHRleHR1cmUgKS5fX3dlYmdsVGV4dHVyZSApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBzZXRUZXh0dXJlUGFyYW1ldGVycyggdGV4dHVyZVR5cGUsIHRleHR1cmUsIGlzUG93ZXJPZlR3b0ltYWdlICkge1xuXG5cdFx0dmFyIGV4dGVuc2lvbjtcblxuXHRcdGlmICggaXNQb3dlck9mVHdvSW1hZ2UgKSB7XG5cblx0XHRcdF9nbC50ZXhQYXJhbWV0ZXJpKCB0ZXh0dXJlVHlwZSwgX2dsLlRFWFRVUkVfV1JBUF9TLCBwYXJhbVRocmVlVG9HTCggdGV4dHVyZS53cmFwUyApICk7XG5cdFx0XHRfZ2wudGV4UGFyYW1ldGVyaSggdGV4dHVyZVR5cGUsIF9nbC5URVhUVVJFX1dSQVBfVCwgcGFyYW1UaHJlZVRvR0woIHRleHR1cmUud3JhcFQgKSApO1xuXG5cdFx0XHRfZ2wudGV4UGFyYW1ldGVyaSggdGV4dHVyZVR5cGUsIF9nbC5URVhUVVJFX01BR19GSUxURVIsIHBhcmFtVGhyZWVUb0dMKCB0ZXh0dXJlLm1hZ0ZpbHRlciApICk7XG5cdFx0XHRfZ2wudGV4UGFyYW1ldGVyaSggdGV4dHVyZVR5cGUsIF9nbC5URVhUVVJFX01JTl9GSUxURVIsIHBhcmFtVGhyZWVUb0dMKCB0ZXh0dXJlLm1pbkZpbHRlciApICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRfZ2wudGV4UGFyYW1ldGVyaSggdGV4dHVyZVR5cGUsIF9nbC5URVhUVVJFX1dSQVBfUywgX2dsLkNMQU1QX1RPX0VER0UgKTtcblx0XHRcdF9nbC50ZXhQYXJhbWV0ZXJpKCB0ZXh0dXJlVHlwZSwgX2dsLlRFWFRVUkVfV1JBUF9ULCBfZ2wuQ0xBTVBfVE9fRURHRSApO1xuXG5cdFx0XHRpZiAoIHRleHR1cmUud3JhcFMgIT09IENsYW1wVG9FZGdlV3JhcHBpbmcgfHwgdGV4dHVyZS53cmFwVCAhPT0gQ2xhbXBUb0VkZ2VXcmFwcGluZyApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBUZXh0dXJlIGlzIG5vdCBwb3dlciBvZiB0d28uIFRleHR1cmUud3JhcFMgYW5kIFRleHR1cmUud3JhcFQgc2hvdWxkIGJlIHNldCB0byBUSFJFRS5DbGFtcFRvRWRnZVdyYXBwaW5nLicsIHRleHR1cmUgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRfZ2wudGV4UGFyYW1ldGVyaSggdGV4dHVyZVR5cGUsIF9nbC5URVhUVVJFX01BR19GSUxURVIsIGZpbHRlckZhbGxiYWNrKCB0ZXh0dXJlLm1hZ0ZpbHRlciApICk7XG5cdFx0XHRfZ2wudGV4UGFyYW1ldGVyaSggdGV4dHVyZVR5cGUsIF9nbC5URVhUVVJFX01JTl9GSUxURVIsIGZpbHRlckZhbGxiYWNrKCB0ZXh0dXJlLm1pbkZpbHRlciApICk7XG5cblx0XHRcdGlmICggdGV4dHVyZS5taW5GaWx0ZXIgIT09IE5lYXJlc3RGaWx0ZXIgJiYgdGV4dHVyZS5taW5GaWx0ZXIgIT09IExpbmVhckZpbHRlciApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBUZXh0dXJlIGlzIG5vdCBwb3dlciBvZiB0d28uIFRleHR1cmUubWluRmlsdGVyIHNob3VsZCBiZSBzZXQgdG8gVEhSRUUuTmVhcmVzdEZpbHRlciBvciBUSFJFRS5MaW5lYXJGaWx0ZXIuJywgdGV4dHVyZSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ0VYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYycgKTtcblxuXHRcdGlmICggZXh0ZW5zaW9uICkge1xuXG5cdFx0XHRpZiAoIHRleHR1cmUudHlwZSA9PT0gRmxvYXRUeXBlICYmIGV4dGVuc2lvbnMuZ2V0KCAnT0VTX3RleHR1cmVfZmxvYXRfbGluZWFyJyApID09PSBudWxsICkgcmV0dXJuO1xuXHRcdFx0aWYgKCB0ZXh0dXJlLnR5cGUgPT09IEhhbGZGbG9hdFR5cGUgJiYgZXh0ZW5zaW9ucy5nZXQoICdPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0X2xpbmVhcicgKSA9PT0gbnVsbCApIHJldHVybjtcblxuXHRcdFx0aWYgKCB0ZXh0dXJlLmFuaXNvdHJvcHkgPiAxIHx8IHByb3BlcnRpZXMuZ2V0KCB0ZXh0dXJlICkuX19jdXJyZW50QW5pc290cm9weSApIHtcblxuXHRcdFx0XHRfZ2wudGV4UGFyYW1ldGVyZiggdGV4dHVyZVR5cGUsIGV4dGVuc2lvbi5URVhUVVJFX01BWF9BTklTT1RST1BZX0VYVCwgTWF0aC5taW4oIHRleHR1cmUuYW5pc290cm9weSwgY2FwYWJpbGl0aWVzLmdldE1heEFuaXNvdHJvcHkoKSApICk7XG5cdFx0XHRcdHByb3BlcnRpZXMuZ2V0KCB0ZXh0dXJlICkuX19jdXJyZW50QW5pc290cm9weSA9IHRleHR1cmUuYW5pc290cm9weTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiB1cGxvYWRUZXh0dXJlKCB0ZXh0dXJlUHJvcGVydGllcywgdGV4dHVyZSwgc2xvdCApIHtcblxuXHRcdGlmICggdGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbEluaXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbEluaXQgPSB0cnVlO1xuXG5cdFx0XHR0ZXh0dXJlLmFkZEV2ZW50TGlzdGVuZXIoICdkaXNwb3NlJywgb25UZXh0dXJlRGlzcG9zZSApO1xuXG5cdFx0XHR0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSA9IF9nbC5jcmVhdGVUZXh0dXJlKCk7XG5cblx0XHRcdGluZm9NZW1vcnkudGV4dHVyZXMgKys7XG5cblx0XHR9XG5cblx0XHRzdGF0ZS5hY3RpdmVUZXh0dXJlKCBfZ2wuVEVYVFVSRTAgKyBzbG90ICk7XG5cdFx0c3RhdGUuYmluZFRleHR1cmUoIF9nbC5URVhUVVJFXzJELCB0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSApO1xuXG5cdFx0X2dsLnBpeGVsU3RvcmVpKCBfZ2wuVU5QQUNLX0ZMSVBfWV9XRUJHTCwgdGV4dHVyZS5mbGlwWSApO1xuXHRcdF9nbC5waXhlbFN0b3JlaSggX2dsLlVOUEFDS19QUkVNVUxUSVBMWV9BTFBIQV9XRUJHTCwgdGV4dHVyZS5wcmVtdWx0aXBseUFscGhhICk7XG5cdFx0X2dsLnBpeGVsU3RvcmVpKCBfZ2wuVU5QQUNLX0FMSUdOTUVOVCwgdGV4dHVyZS51bnBhY2tBbGlnbm1lbnQgKTtcblxuXHRcdHZhciBpbWFnZSA9IGNsYW1wVG9NYXhTaXplKCB0ZXh0dXJlLmltYWdlLCBjYXBhYmlsaXRpZXMubWF4VGV4dHVyZVNpemUgKTtcblxuXHRcdGlmICggdGV4dHVyZU5lZWRzUG93ZXJPZlR3byggdGV4dHVyZSApICYmIGlzUG93ZXJPZlR3byggaW1hZ2UgKSA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdGltYWdlID0gbWFrZVBvd2VyT2ZUd28oIGltYWdlICk7XG5cblx0XHR9XG5cblx0XHR2YXIgaXNQb3dlck9mVHdvSW1hZ2UgPSBpc1Bvd2VyT2ZUd28oIGltYWdlICksXG5cdFx0Z2xGb3JtYXQgPSBwYXJhbVRocmVlVG9HTCggdGV4dHVyZS5mb3JtYXQgKSxcblx0XHRnbFR5cGUgPSBwYXJhbVRocmVlVG9HTCggdGV4dHVyZS50eXBlICk7XG5cblx0XHRzZXRUZXh0dXJlUGFyYW1ldGVycyggX2dsLlRFWFRVUkVfMkQsIHRleHR1cmUsIGlzUG93ZXJPZlR3b0ltYWdlICk7XG5cblx0XHR2YXIgbWlwbWFwLCBtaXBtYXBzID0gdGV4dHVyZS5taXBtYXBzO1xuXG5cdFx0aWYgKCB0ZXh0dXJlLmlzRGVwdGhUZXh0dXJlICkge1xuXG5cdFx0XHQvLyBwb3B1bGF0ZSBkZXB0aCB0ZXh0dXJlIHdpdGggZHVtbXkgZGF0YVxuXG5cdFx0XHR2YXIgaW50ZXJuYWxGb3JtYXQgPSBfZ2wuREVQVEhfQ09NUE9ORU5UO1xuXG5cdFx0XHRpZiAoIHRleHR1cmUudHlwZSA9PT0gRmxvYXRUeXBlICkge1xuXG5cdFx0XHRcdGlmICggIV9pc1dlYkdMMiApIHRocm93IG5ldyBFcnJvcignRmxvYXQgRGVwdGggVGV4dHVyZSBvbmx5IHN1cHBvcnRlZCBpbiBXZWJHTDIuMCcpO1xuXHRcdFx0XHRpbnRlcm5hbEZvcm1hdCA9IF9nbC5ERVBUSF9DT01QT05FTlQzMkY7XG5cblx0XHRcdH0gZWxzZSBpZiAoIF9pc1dlYkdMMiApIHtcblxuXHRcdFx0XHQvLyBXZWJHTCAyLjAgcmVxdWlyZXMgc2lnbmVkIGludGVybmFsZm9ybWF0IGZvciBnbFRleEltYWdlMkRcblx0XHRcdFx0aW50ZXJuYWxGb3JtYXQgPSBfZ2wuREVQVEhfQ09NUE9ORU5UMTY7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCB0ZXh0dXJlLmZvcm1hdCA9PT0gRGVwdGhGb3JtYXQgJiYgaW50ZXJuYWxGb3JtYXQgPT09IF9nbC5ERVBUSF9DT01QT05FTlQgKSB7XG5cblx0XHRcdFx0Ly8gVGhlIGVycm9yIElOVkFMSURfT1BFUkFUSU9OIGlzIGdlbmVyYXRlZCBieSB0ZXhJbWFnZTJEIGlmIGZvcm1hdCBhbmQgaW50ZXJuYWxmb3JtYXQgYXJlXG5cdFx0XHRcdC8vIERFUFRIX0NPTVBPTkVOVCBhbmQgdHlwZSBpcyBub3QgVU5TSUdORURfU0hPUlQgb3IgVU5TSUdORURfSU5UXG5cdFx0XHRcdC8vIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS93ZWJnbC9leHRlbnNpb25zL1dFQkdMX2RlcHRoX3RleHR1cmUvKVxuXHRcdFx0XHRpZiAoIHRleHR1cmUudHlwZSAhPT0gVW5zaWduZWRTaG9ydFR5cGUgJiYgdGV4dHVyZS50eXBlICE9PSBVbnNpZ25lZEludFR5cGUgKSB7XG5cblx0XHRcdFx0ICAgICAgICBjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBVc2UgVW5zaWduZWRTaG9ydFR5cGUgb3IgVW5zaWduZWRJbnRUeXBlIGZvciBEZXB0aEZvcm1hdCBEZXB0aFRleHR1cmUuJyApO1xuXG5cdFx0XHRcdFx0dGV4dHVyZS50eXBlID0gVW5zaWduZWRTaG9ydFR5cGU7XG5cdFx0XHRcdFx0Z2xUeXBlID0gcGFyYW1UaHJlZVRvR0woIHRleHR1cmUudHlwZSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBEZXB0aCBzdGVuY2lsIHRleHR1cmVzIG5lZWQgdGhlIERFUFRIX1NURU5DSUwgaW50ZXJuYWwgZm9ybWF0XG5cdFx0XHQvLyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvd2ViZ2wvZXh0ZW5zaW9ucy9XRUJHTF9kZXB0aF90ZXh0dXJlLylcblx0XHRcdGlmICggdGV4dHVyZS5mb3JtYXQgPT09IERlcHRoU3RlbmNpbEZvcm1hdCApIHtcblxuXHRcdFx0XHRpbnRlcm5hbEZvcm1hdCA9IF9nbC5ERVBUSF9TVEVOQ0lMO1xuXG5cdFx0XHRcdC8vIFRoZSBlcnJvciBJTlZBTElEX09QRVJBVElPTiBpcyBnZW5lcmF0ZWQgYnkgdGV4SW1hZ2UyRCBpZiBmb3JtYXQgYW5kIGludGVybmFsZm9ybWF0IGFyZVxuXHRcdFx0XHQvLyBERVBUSF9TVEVOQ0lMIGFuZCB0eXBlIGlzIG5vdCBVTlNJR05FRF9JTlRfMjRfOF9XRUJHTC5cblx0XHRcdFx0Ly8gKGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3dlYmdsL2V4dGVuc2lvbnMvV0VCR0xfZGVwdGhfdGV4dHVyZS8pXG5cdFx0XHRcdGlmICggdGV4dHVyZS50eXBlICE9PSBVbnNpZ25lZEludDI0OFR5cGUgKSB7XG5cblx0XHRcdFx0ICAgICAgICBjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBVc2UgVW5zaWduZWRJbnQyNDhUeXBlIGZvciBEZXB0aFN0ZW5jaWxGb3JtYXQgRGVwdGhUZXh0dXJlLicgKTtcblxuXHRcdFx0XHRcdHRleHR1cmUudHlwZSA9IFVuc2lnbmVkSW50MjQ4VHlwZTtcblx0XHRcdFx0XHRnbFR5cGUgPSBwYXJhbVRocmVlVG9HTCggdGV4dHVyZS50eXBlICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdHN0YXRlLnRleEltYWdlMkQoIF9nbC5URVhUVVJFXzJELCAwLCBpbnRlcm5hbEZvcm1hdCwgaW1hZ2Uud2lkdGgsIGltYWdlLmhlaWdodCwgMCwgZ2xGb3JtYXQsIGdsVHlwZSwgbnVsbCApO1xuXG5cdFx0fSBlbHNlIGlmICggdGV4dHVyZS5pc0RhdGFUZXh0dXJlICkge1xuXG5cdFx0XHQvLyB1c2UgbWFudWFsbHkgY3JlYXRlZCBtaXBtYXBzIGlmIGF2YWlsYWJsZVxuXHRcdFx0Ly8gaWYgdGhlcmUgYXJlIG5vIG1hbnVhbCBtaXBtYXBzXG5cdFx0XHQvLyBzZXQgMCBsZXZlbCBtaXBtYXAgYW5kIHRoZW4gdXNlIEdMIHRvIGdlbmVyYXRlIG90aGVyIG1pcG1hcCBsZXZlbHNcblxuXHRcdFx0aWYgKCBtaXBtYXBzLmxlbmd0aCA+IDAgJiYgaXNQb3dlck9mVHdvSW1hZ2UgKSB7XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IG1pcG1hcHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRtaXBtYXAgPSBtaXBtYXBzWyBpIF07XG5cdFx0XHRcdFx0c3RhdGUudGV4SW1hZ2UyRCggX2dsLlRFWFRVUkVfMkQsIGksIGdsRm9ybWF0LCBtaXBtYXAud2lkdGgsIG1pcG1hcC5oZWlnaHQsIDAsIGdsRm9ybWF0LCBnbFR5cGUsIG1pcG1hcC5kYXRhICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzID0gZmFsc2U7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0c3RhdGUudGV4SW1hZ2UyRCggX2dsLlRFWFRVUkVfMkQsIDAsIGdsRm9ybWF0LCBpbWFnZS53aWR0aCwgaW1hZ2UuaGVpZ2h0LCAwLCBnbEZvcm1hdCwgZ2xUeXBlLCBpbWFnZS5kYXRhICk7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSBpZiAoIHRleHR1cmUuaXNDb21wcmVzc2VkVGV4dHVyZSApIHtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IG1pcG1hcHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdFx0bWlwbWFwID0gbWlwbWFwc1sgaSBdO1xuXG5cdFx0XHRcdGlmICggdGV4dHVyZS5mb3JtYXQgIT09IFJHQkFGb3JtYXQgJiYgdGV4dHVyZS5mb3JtYXQgIT09IFJHQkZvcm1hdCApIHtcblxuXHRcdFx0XHRcdGlmICggc3RhdGUuZ2V0Q29tcHJlc3NlZFRleHR1cmVGb3JtYXRzKCkuaW5kZXhPZiggZ2xGb3JtYXQgKSA+IC0gMSApIHtcblxuXHRcdFx0XHRcdFx0c3RhdGUuY29tcHJlc3NlZFRleEltYWdlMkQoIF9nbC5URVhUVVJFXzJELCBpLCBnbEZvcm1hdCwgbWlwbWFwLndpZHRoLCBtaXBtYXAuaGVpZ2h0LCAwLCBtaXBtYXAuZGF0YSApO1xuXG5cdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0Y29uc29sZS53YXJuKCBcIlRIUkVFLldlYkdMUmVuZGVyZXI6IEF0dGVtcHQgdG8gbG9hZCB1bnN1cHBvcnRlZCBjb21wcmVzc2VkIHRleHR1cmUgZm9ybWF0IGluIC51cGxvYWRUZXh0dXJlKClcIiApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRzdGF0ZS50ZXhJbWFnZTJEKCBfZ2wuVEVYVFVSRV8yRCwgaSwgZ2xGb3JtYXQsIG1pcG1hcC53aWR0aCwgbWlwbWFwLmhlaWdodCwgMCwgZ2xGb3JtYXQsIGdsVHlwZSwgbWlwbWFwLmRhdGEgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIHJlZ3VsYXIgVGV4dHVyZSAoaW1hZ2UsIHZpZGVvLCBjYW52YXMpXG5cblx0XHRcdC8vIHVzZSBtYW51YWxseSBjcmVhdGVkIG1pcG1hcHMgaWYgYXZhaWxhYmxlXG5cdFx0XHQvLyBpZiB0aGVyZSBhcmUgbm8gbWFudWFsIG1pcG1hcHNcblx0XHRcdC8vIHNldCAwIGxldmVsIG1pcG1hcCBhbmQgdGhlbiB1c2UgR0wgdG8gZ2VuZXJhdGUgb3RoZXIgbWlwbWFwIGxldmVsc1xuXG5cdFx0XHRpZiAoIG1pcG1hcHMubGVuZ3RoID4gMCAmJiBpc1Bvd2VyT2ZUd29JbWFnZSApIHtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gbWlwbWFwcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdG1pcG1hcCA9IG1pcG1hcHNbIGkgXTtcblx0XHRcdFx0XHRzdGF0ZS50ZXhJbWFnZTJEKCBfZ2wuVEVYVFVSRV8yRCwgaSwgZ2xGb3JtYXQsIGdsRm9ybWF0LCBnbFR5cGUsIG1pcG1hcCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHN0YXRlLnRleEltYWdlMkQoIF9nbC5URVhUVVJFXzJELCAwLCBnbEZvcm1hdCwgZ2xGb3JtYXQsIGdsVHlwZSwgaW1hZ2UgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCB0ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyAmJiBpc1Bvd2VyT2ZUd29JbWFnZSApIF9nbC5nZW5lcmF0ZU1pcG1hcCggX2dsLlRFWFRVUkVfMkQgKTtcblxuXHRcdHRleHR1cmVQcm9wZXJ0aWVzLl9fdmVyc2lvbiA9IHRleHR1cmUudmVyc2lvbjtcblxuXHRcdGlmICggdGV4dHVyZS5vblVwZGF0ZSApIHRleHR1cmUub25VcGRhdGUoIHRleHR1cmUgKTtcblxuXHR9XG5cblx0Ly8gUmVuZGVyIHRhcmdldHNcblxuXHQvLyBTZXR1cCBzdG9yYWdlIGZvciB0YXJnZXQgdGV4dHVyZSBhbmQgYmluZCBpdCB0byBjb3JyZWN0IGZyYW1lYnVmZmVyXG5cdGZ1bmN0aW9uIHNldHVwRnJhbWVCdWZmZXJUZXh0dXJlKCBmcmFtZWJ1ZmZlciwgcmVuZGVyVGFyZ2V0LCBhdHRhY2htZW50LCB0ZXh0dXJlVGFyZ2V0ICkge1xuXG5cdFx0dmFyIGdsRm9ybWF0ID0gcGFyYW1UaHJlZVRvR0woIHJlbmRlclRhcmdldC50ZXh0dXJlLmZvcm1hdCApO1xuXHRcdHZhciBnbFR5cGUgPSBwYXJhbVRocmVlVG9HTCggcmVuZGVyVGFyZ2V0LnRleHR1cmUudHlwZSApO1xuXHRcdHN0YXRlLnRleEltYWdlMkQoIHRleHR1cmVUYXJnZXQsIDAsIGdsRm9ybWF0LCByZW5kZXJUYXJnZXQud2lkdGgsIHJlbmRlclRhcmdldC5oZWlnaHQsIDAsIGdsRm9ybWF0LCBnbFR5cGUsIG51bGwgKTtcblx0XHRfZ2wuYmluZEZyYW1lYnVmZmVyKCBfZ2wuRlJBTUVCVUZGRVIsIGZyYW1lYnVmZmVyICk7XG5cdFx0X2dsLmZyYW1lYnVmZmVyVGV4dHVyZTJEKCBfZ2wuRlJBTUVCVUZGRVIsIGF0dGFjaG1lbnQsIHRleHR1cmVUYXJnZXQsIHByb3BlcnRpZXMuZ2V0KCByZW5kZXJUYXJnZXQudGV4dHVyZSApLl9fd2ViZ2xUZXh0dXJlLCAwICk7XG5cdFx0X2dsLmJpbmRGcmFtZWJ1ZmZlciggX2dsLkZSQU1FQlVGRkVSLCBudWxsICk7XG5cblx0fVxuXG5cdC8vIFNldHVwIHN0b3JhZ2UgZm9yIGludGVybmFsIGRlcHRoL3N0ZW5jaWwgYnVmZmVycyBhbmQgYmluZCB0byBjb3JyZWN0IGZyYW1lYnVmZmVyXG5cdGZ1bmN0aW9uIHNldHVwUmVuZGVyQnVmZmVyU3RvcmFnZSggcmVuZGVyYnVmZmVyLCByZW5kZXJUYXJnZXQgKSB7XG5cblx0XHRfZ2wuYmluZFJlbmRlcmJ1ZmZlciggX2dsLlJFTkRFUkJVRkZFUiwgcmVuZGVyYnVmZmVyICk7XG5cblx0XHRpZiAoIHJlbmRlclRhcmdldC5kZXB0aEJ1ZmZlciAmJiAhIHJlbmRlclRhcmdldC5zdGVuY2lsQnVmZmVyICkge1xuXG5cdFx0XHRfZ2wucmVuZGVyYnVmZmVyU3RvcmFnZSggX2dsLlJFTkRFUkJVRkZFUiwgX2dsLkRFUFRIX0NPTVBPTkVOVDE2LCByZW5kZXJUYXJnZXQud2lkdGgsIHJlbmRlclRhcmdldC5oZWlnaHQgKTtcblx0XHRcdF9nbC5mcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlciggX2dsLkZSQU1FQlVGRkVSLCBfZ2wuREVQVEhfQVRUQUNITUVOVCwgX2dsLlJFTkRFUkJVRkZFUiwgcmVuZGVyYnVmZmVyICk7XG5cblx0XHR9IGVsc2UgaWYgKCByZW5kZXJUYXJnZXQuZGVwdGhCdWZmZXIgJiYgcmVuZGVyVGFyZ2V0LnN0ZW5jaWxCdWZmZXIgKSB7XG5cblx0XHRcdF9nbC5yZW5kZXJidWZmZXJTdG9yYWdlKCBfZ2wuUkVOREVSQlVGRkVSLCBfZ2wuREVQVEhfU1RFTkNJTCwgcmVuZGVyVGFyZ2V0LndpZHRoLCByZW5kZXJUYXJnZXQuaGVpZ2h0ICk7XG5cdFx0XHRfZ2wuZnJhbWVidWZmZXJSZW5kZXJidWZmZXIoIF9nbC5GUkFNRUJVRkZFUiwgX2dsLkRFUFRIX1NURU5DSUxfQVRUQUNITUVOVCwgX2dsLlJFTkRFUkJVRkZFUiwgcmVuZGVyYnVmZmVyICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBGSVhNRTogV2UgZG9uJ3Qgc3VwcG9ydCAhZGVwdGggIXN0ZW5jaWxcblx0XHRcdF9nbC5yZW5kZXJidWZmZXJTdG9yYWdlKCBfZ2wuUkVOREVSQlVGRkVSLCBfZ2wuUkdCQTQsIHJlbmRlclRhcmdldC53aWR0aCwgcmVuZGVyVGFyZ2V0LmhlaWdodCApO1xuXG5cdFx0fVxuXG5cdFx0X2dsLmJpbmRSZW5kZXJidWZmZXIoIF9nbC5SRU5ERVJCVUZGRVIsIG51bGwgKTtcblxuXHR9XG5cblx0Ly8gU2V0dXAgcmVzb3VyY2VzIGZvciBhIERlcHRoIFRleHR1cmUgZm9yIGEgRkJPIChuZWVkcyBhbiBleHRlbnNpb24pXG5cdGZ1bmN0aW9uIHNldHVwRGVwdGhUZXh0dXJlKCBmcmFtZWJ1ZmZlciwgcmVuZGVyVGFyZ2V0ICkge1xuXG5cdFx0dmFyIGlzQ3ViZSA9ICggcmVuZGVyVGFyZ2V0ICYmIHJlbmRlclRhcmdldC5pc1dlYkdMUmVuZGVyVGFyZ2V0Q3ViZSApO1xuXHRcdGlmICggaXNDdWJlICkgdGhyb3cgbmV3IEVycm9yKCdEZXB0aCBUZXh0dXJlIHdpdGggY3ViZSByZW5kZXIgdGFyZ2V0cyBpcyBub3Qgc3VwcG9ydGVkIScpO1xuXG5cdFx0X2dsLmJpbmRGcmFtZWJ1ZmZlciggX2dsLkZSQU1FQlVGRkVSLCBmcmFtZWJ1ZmZlciApO1xuXG5cdFx0aWYgKCAhKCByZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlICYmIHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUuaXNEZXB0aFRleHR1cmUgKSApIHtcblxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdyZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlIG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgVEhSRUUuRGVwdGhUZXh0dXJlJyk7XG5cblx0XHR9XG5cblx0XHQvLyB1cGxvYWQgYW4gZW1wdHkgZGVwdGggdGV4dHVyZSB3aXRoIGZyYW1lYnVmZmVyIHNpemVcblx0XHRpZiAoICFwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZSApLl9fd2ViZ2xUZXh0dXJlIHx8XG5cdFx0XHRcdHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUuaW1hZ2Uud2lkdGggIT09IHJlbmRlclRhcmdldC53aWR0aCB8fFxuXHRcdFx0XHRyZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlLmltYWdlLmhlaWdodCAhPT0gcmVuZGVyVGFyZ2V0LmhlaWdodCApIHtcblx0XHRcdHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUuaW1hZ2Uud2lkdGggPSByZW5kZXJUYXJnZXQud2lkdGg7XG5cdFx0XHRyZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlLmltYWdlLmhlaWdodCA9IHJlbmRlclRhcmdldC5oZWlnaHQ7XG5cdFx0XHRyZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblx0XHR9XG5cblx0XHRzZXRUZXh0dXJlMkQoIHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUsIDAgKTtcblxuXHRcdHZhciB3ZWJnbERlcHRoVGV4dHVyZSA9IHByb3BlcnRpZXMuZ2V0KCByZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlICkuX193ZWJnbFRleHR1cmU7XG5cblx0XHRpZiAoIHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUuZm9ybWF0ID09PSBEZXB0aEZvcm1hdCApIHtcblxuXHRcdFx0X2dsLmZyYW1lYnVmZmVyVGV4dHVyZTJEKCBfZ2wuRlJBTUVCVUZGRVIsIF9nbC5ERVBUSF9BVFRBQ0hNRU5ULCBfZ2wuVEVYVFVSRV8yRCwgd2ViZ2xEZXB0aFRleHR1cmUsIDAgKTtcblxuXHRcdH0gZWxzZSBpZiAoIHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUuZm9ybWF0ID09PSBEZXB0aFN0ZW5jaWxGb3JtYXQgKSB7XG5cblx0XHRcdF9nbC5mcmFtZWJ1ZmZlclRleHR1cmUyRCggX2dsLkZSQU1FQlVGRkVSLCBfZ2wuREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5ULCBfZ2wuVEVYVFVSRV8yRCwgd2ViZ2xEZXB0aFRleHR1cmUsIDAgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHRocm93IG5ldyBFcnJvcignVW5rbm93biBkZXB0aFRleHR1cmUgZm9ybWF0JylcblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gU2V0dXAgR0wgcmVzb3VyY2VzIGZvciBhIG5vbi10ZXh0dXJlIGRlcHRoIGJ1ZmZlclxuXHRmdW5jdGlvbiBzZXR1cERlcHRoUmVuZGVyYnVmZmVyKCByZW5kZXJUYXJnZXQgKSB7XG5cblx0XHR2YXIgcmVuZGVyVGFyZ2V0UHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCByZW5kZXJUYXJnZXQgKTtcblxuXHRcdHZhciBpc0N1YmUgPSAoIHJlbmRlclRhcmdldC5pc1dlYkdMUmVuZGVyVGFyZ2V0Q3ViZSA9PT0gdHJ1ZSApO1xuXG5cdFx0aWYgKCByZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlICkge1xuXG5cdFx0XHRpZiAoIGlzQ3ViZSApIHRocm93IG5ldyBFcnJvcigndGFyZ2V0LmRlcHRoVGV4dHVyZSBub3Qgc3VwcG9ydGVkIGluIEN1YmUgcmVuZGVyIHRhcmdldHMnKTtcblxuXHRcdFx0c2V0dXBEZXB0aFRleHR1cmUoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyLCByZW5kZXJUYXJnZXQgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGlmICggaXNDdWJlICkge1xuXG5cdFx0XHRcdHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbERlcHRoYnVmZmVyID0gW107XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgNjsgaSArKyApIHtcblxuXHRcdFx0XHRcdF9nbC5iaW5kRnJhbWVidWZmZXIoIF9nbC5GUkFNRUJVRkZFUiwgcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXJbIGkgXSApO1xuXHRcdFx0XHRcdHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbERlcHRoYnVmZmVyWyBpIF0gPSBfZ2wuY3JlYXRlUmVuZGVyYnVmZmVyKCk7XG5cdFx0XHRcdFx0c2V0dXBSZW5kZXJCdWZmZXJTdG9yYWdlKCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xEZXB0aGJ1ZmZlclsgaSBdLCByZW5kZXJUYXJnZXQgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0X2dsLmJpbmRGcmFtZWJ1ZmZlciggX2dsLkZSQU1FQlVGRkVSLCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlciApO1xuXHRcdFx0XHRyZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xEZXB0aGJ1ZmZlciA9IF9nbC5jcmVhdGVSZW5kZXJidWZmZXIoKTtcblx0XHRcdFx0c2V0dXBSZW5kZXJCdWZmZXJTdG9yYWdlKCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xEZXB0aGJ1ZmZlciwgcmVuZGVyVGFyZ2V0ICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdF9nbC5iaW5kRnJhbWVidWZmZXIoIF9nbC5GUkFNRUJVRkZFUiwgbnVsbCApO1xuXG5cdH1cblxuXHQvLyBTZXQgdXAgR0wgcmVzb3VyY2VzIGZvciB0aGUgcmVuZGVyIHRhcmdldFxuXHRmdW5jdGlvbiBzZXR1cFJlbmRlclRhcmdldCggcmVuZGVyVGFyZ2V0ICkge1xuXG5cdFx0dmFyIHJlbmRlclRhcmdldFByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0ICk7XG5cdFx0dmFyIHRleHR1cmVQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIHJlbmRlclRhcmdldC50ZXh0dXJlICk7XG5cblx0XHRyZW5kZXJUYXJnZXQuYWRkRXZlbnRMaXN0ZW5lciggJ2Rpc3Bvc2UnLCBvblJlbmRlclRhcmdldERpc3Bvc2UgKTtcblxuXHRcdHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlID0gX2dsLmNyZWF0ZVRleHR1cmUoKTtcblxuXHRcdGluZm9NZW1vcnkudGV4dHVyZXMgKys7XG5cblx0XHR2YXIgaXNDdWJlID0gKCByZW5kZXJUYXJnZXQuaXNXZWJHTFJlbmRlclRhcmdldEN1YmUgPT09IHRydWUgKTtcblx0XHR2YXIgaXNUYXJnZXRQb3dlck9mVHdvID0gaXNQb3dlck9mVHdvKCByZW5kZXJUYXJnZXQgKTtcblxuXHRcdC8vIFNldHVwIGZyYW1lYnVmZmVyXG5cblx0XHRpZiAoIGlzQ3ViZSApIHtcblxuXHRcdFx0cmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXIgPSBbXTtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgNjsgaSArKyApIHtcblxuXHRcdFx0XHRyZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlclsgaSBdID0gX2dsLmNyZWF0ZUZyYW1lYnVmZmVyKCk7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyID0gX2dsLmNyZWF0ZUZyYW1lYnVmZmVyKCk7XG5cblx0XHR9XG5cblx0XHQvLyBTZXR1cCBjb2xvciBidWZmZXJcblxuXHRcdGlmICggaXNDdWJlICkge1xuXG5cdFx0XHRzdGF0ZS5iaW5kVGV4dHVyZSggX2dsLlRFWFRVUkVfQ1VCRV9NQVAsIHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlICk7XG5cdFx0XHRzZXRUZXh0dXJlUGFyYW1ldGVycyggX2dsLlRFWFRVUkVfQ1VCRV9NQVAsIHJlbmRlclRhcmdldC50ZXh0dXJlLCBpc1RhcmdldFBvd2VyT2ZUd28gKTtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgNjsgaSArKyApIHtcblxuXHRcdFx0XHRzZXR1cEZyYW1lQnVmZmVyVGV4dHVyZSggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXJbIGkgXSwgcmVuZGVyVGFyZ2V0LCBfZ2wuQ09MT1JfQVRUQUNITUVOVDAsIF9nbC5URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1ggKyBpICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCByZW5kZXJUYXJnZXQudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgJiYgaXNUYXJnZXRQb3dlck9mVHdvICkgX2dsLmdlbmVyYXRlTWlwbWFwKCBfZ2wuVEVYVFVSRV9DVUJFX01BUCApO1xuXHRcdFx0c3RhdGUuYmluZFRleHR1cmUoIF9nbC5URVhUVVJFX0NVQkVfTUFQLCBudWxsICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRzdGF0ZS5iaW5kVGV4dHVyZSggX2dsLlRFWFRVUkVfMkQsIHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlICk7XG5cdFx0XHRzZXRUZXh0dXJlUGFyYW1ldGVycyggX2dsLlRFWFRVUkVfMkQsIHJlbmRlclRhcmdldC50ZXh0dXJlLCBpc1RhcmdldFBvd2VyT2ZUd28gKTtcblx0XHRcdHNldHVwRnJhbWVCdWZmZXJUZXh0dXJlKCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlciwgcmVuZGVyVGFyZ2V0LCBfZ2wuQ09MT1JfQVRUQUNITUVOVDAsIF9nbC5URVhUVVJFXzJEICk7XG5cblx0XHRcdGlmICggcmVuZGVyVGFyZ2V0LnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzICYmIGlzVGFyZ2V0UG93ZXJPZlR3byApIF9nbC5nZW5lcmF0ZU1pcG1hcCggX2dsLlRFWFRVUkVfMkQgKTtcblx0XHRcdHN0YXRlLmJpbmRUZXh0dXJlKCBfZ2wuVEVYVFVSRV8yRCwgbnVsbCApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gU2V0dXAgZGVwdGggYW5kIHN0ZW5jaWwgYnVmZmVyc1xuXG5cdFx0aWYgKCByZW5kZXJUYXJnZXQuZGVwdGhCdWZmZXIgKSB7XG5cblx0XHRcdHNldHVwRGVwdGhSZW5kZXJidWZmZXIoIHJlbmRlclRhcmdldCApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiB1cGRhdGVSZW5kZXJUYXJnZXRNaXBtYXAoIHJlbmRlclRhcmdldCApIHtcblxuXHRcdHZhciB0ZXh0dXJlID0gcmVuZGVyVGFyZ2V0LnRleHR1cmU7XG5cblx0XHRpZiAoIHRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzICYmIGlzUG93ZXJPZlR3byggcmVuZGVyVGFyZ2V0ICkgJiZcblx0XHRcdFx0dGV4dHVyZS5taW5GaWx0ZXIgIT09IE5lYXJlc3RGaWx0ZXIgJiZcblx0XHRcdFx0dGV4dHVyZS5taW5GaWx0ZXIgIT09IExpbmVhckZpbHRlciApIHtcblxuXHRcdFx0dmFyIHRhcmdldCA9IChyZW5kZXJUYXJnZXQgJiYgcmVuZGVyVGFyZ2V0LmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlKSA/IF9nbC5URVhUVVJFX0NVQkVfTUFQIDogX2dsLlRFWFRVUkVfMkQ7XG5cdFx0XHR2YXIgd2ViZ2xUZXh0dXJlID0gcHJvcGVydGllcy5nZXQoIHRleHR1cmUgKS5fX3dlYmdsVGV4dHVyZTtcblxuXHRcdFx0c3RhdGUuYmluZFRleHR1cmUoIHRhcmdldCwgd2ViZ2xUZXh0dXJlICk7XG5cdFx0XHRfZ2wuZ2VuZXJhdGVNaXBtYXAoIHRhcmdldCApO1xuXHRcdFx0c3RhdGUuYmluZFRleHR1cmUoIHRhcmdldCwgbnVsbCApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHR0aGlzLnNldFRleHR1cmUyRCA9IHNldFRleHR1cmUyRDtcblx0dGhpcy5zZXRUZXh0dXJlQ3ViZSA9IHNldFRleHR1cmVDdWJlO1xuXHR0aGlzLnNldFRleHR1cmVDdWJlRHluYW1pYyA9IHNldFRleHR1cmVDdWJlRHluYW1pYztcblx0dGhpcy5zZXR1cFJlbmRlclRhcmdldCA9IHNldHVwUmVuZGVyVGFyZ2V0O1xuXHR0aGlzLnVwZGF0ZVJlbmRlclRhcmdldE1pcG1hcCA9IHVwZGF0ZVJlbmRlclRhcmdldE1pcG1hcDtcblxufVxuXG4vKipcbiAqIEBhdXRob3IgZm9yZGFjaW91cyAvIGZvcmRhY2lvdXMuZ2l0aHViLmlvXG4gKi9cblxuZnVuY3Rpb24gV2ViR0xQcm9wZXJ0aWVzKCkge1xuXG5cdHZhciBwcm9wZXJ0aWVzID0ge307XG5cblx0ZnVuY3Rpb24gZ2V0KCBvYmplY3QgKSB7XG5cblx0XHR2YXIgdXVpZCA9IG9iamVjdC51dWlkO1xuXHRcdHZhciBtYXAgPSBwcm9wZXJ0aWVzWyB1dWlkIF07XG5cblx0XHRpZiAoIG1hcCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRtYXAgPSB7fTtcblx0XHRcdHByb3BlcnRpZXNbIHV1aWQgXSA9IG1hcDtcblxuXHRcdH1cblxuXHRcdHJldHVybiBtYXA7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlbW92ZSggb2JqZWN0ICkge1xuXG5cdFx0ZGVsZXRlIHByb3BlcnRpZXNbIG9iamVjdC51dWlkIF07XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGNsZWFyKCkge1xuXG5cdFx0cHJvcGVydGllcyA9IHt9O1xuXG5cdH1cblxuXHRyZXR1cm4ge1xuXHRcdGdldDogZ2V0LFxuXHRcdHJlbW92ZTogcmVtb3ZlLFxuXHRcdGNsZWFyOiBjbGVhclxuXHR9O1xuXG59XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBXZWJHTFN0YXRlKCBnbCwgZXh0ZW5zaW9ucywgcGFyYW1UaHJlZVRvR0wgKSB7XG5cblx0ZnVuY3Rpb24gQ29sb3JCdWZmZXIoKSB7XG5cblx0XHR2YXIgbG9ja2VkID0gZmFsc2U7XG5cblx0XHR2YXIgY29sb3IgPSBuZXcgVmVjdG9yNCgpO1xuXHRcdHZhciBjdXJyZW50Q29sb3JNYXNrID0gbnVsbDtcblx0XHR2YXIgY3VycmVudENvbG9yQ2xlYXIgPSBuZXcgVmVjdG9yNCgpO1xuXG5cdFx0cmV0dXJuIHtcblxuXHRcdFx0c2V0TWFzazogZnVuY3Rpb24gKCBjb2xvck1hc2sgKSB7XG5cblx0XHRcdFx0aWYgKCBjdXJyZW50Q29sb3JNYXNrICE9PSBjb2xvck1hc2sgJiYgISBsb2NrZWQgKSB7XG5cblx0XHRcdFx0XHRnbC5jb2xvck1hc2soIGNvbG9yTWFzaywgY29sb3JNYXNrLCBjb2xvck1hc2ssIGNvbG9yTWFzayApO1xuXHRcdFx0XHRcdGN1cnJlbnRDb2xvck1hc2sgPSBjb2xvck1hc2s7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9LFxuXG5cdFx0XHRzZXRMb2NrZWQ6IGZ1bmN0aW9uICggbG9jayApIHtcblxuXHRcdFx0XHRsb2NrZWQgPSBsb2NrO1xuXG5cdFx0XHR9LFxuXG5cdFx0XHRzZXRDbGVhcjogZnVuY3Rpb24gKCByLCBnLCBiLCBhLCBwcmVtdWx0aXBsaWVkQWxwaGEgKSB7XG5cblx0XHRcdFx0aWYgKCBwcmVtdWx0aXBsaWVkQWxwaGEgPT09IHRydWUgKSB7XG5cblx0XHRcdFx0XHRyICo9IGE7IGcgKj0gYTsgYiAqPSBhO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb2xvci5zZXQoIHIsIGcsIGIsIGEgKTtcblxuXHRcdFx0XHRpZiAoIGN1cnJlbnRDb2xvckNsZWFyLmVxdWFscyggY29sb3IgKSA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdFx0XHRnbC5jbGVhckNvbG9yKCByLCBnLCBiLCBhICk7XG5cdFx0XHRcdFx0Y3VycmVudENvbG9yQ2xlYXIuY29weSggY29sb3IgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0sXG5cblx0XHRcdHJlc2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdFx0bG9ja2VkID0gZmFsc2U7XG5cblx0XHRcdFx0Y3VycmVudENvbG9yTWFzayA9IG51bGw7XG5cdFx0XHRcdGN1cnJlbnRDb2xvckNsZWFyLnNldCggMCwgMCwgMCwgMSApO1xuXG5cdFx0XHR9XG5cblx0XHR9O1xuXG5cdH1cblxuXHRmdW5jdGlvbiBEZXB0aEJ1ZmZlcigpIHtcblxuXHRcdHZhciBsb2NrZWQgPSBmYWxzZTtcblxuXHRcdHZhciBjdXJyZW50RGVwdGhNYXNrID0gbnVsbDtcblx0XHR2YXIgY3VycmVudERlcHRoRnVuYyA9IG51bGw7XG5cdFx0dmFyIGN1cnJlbnREZXB0aENsZWFyID0gbnVsbDtcblxuXHRcdHJldHVybiB7XG5cblx0XHRcdHNldFRlc3Q6IGZ1bmN0aW9uICggZGVwdGhUZXN0ICkge1xuXG5cdFx0XHRcdGlmICggZGVwdGhUZXN0ICkge1xuXG5cdFx0XHRcdFx0ZW5hYmxlKCBnbC5ERVBUSF9URVNUICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGRpc2FibGUoIGdsLkRFUFRIX1RFU1QgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0sXG5cblx0XHRcdHNldE1hc2s6IGZ1bmN0aW9uICggZGVwdGhNYXNrICkge1xuXG5cdFx0XHRcdGlmICggY3VycmVudERlcHRoTWFzayAhPT0gZGVwdGhNYXNrICYmICEgbG9ja2VkICkge1xuXG5cdFx0XHRcdFx0Z2wuZGVwdGhNYXNrKCBkZXB0aE1hc2sgKTtcblx0XHRcdFx0XHRjdXJyZW50RGVwdGhNYXNrID0gZGVwdGhNYXNrO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSxcblxuXHRcdFx0c2V0RnVuYzogZnVuY3Rpb24gKCBkZXB0aEZ1bmMgKSB7XG5cblx0XHRcdFx0aWYgKCBjdXJyZW50RGVwdGhGdW5jICE9PSBkZXB0aEZ1bmMgKSB7XG5cblx0XHRcdFx0XHRpZiAoIGRlcHRoRnVuYyApIHtcblxuXHRcdFx0XHRcdFx0c3dpdGNoICggZGVwdGhGdW5jICkge1xuXG5cdFx0XHRcdFx0XHRcdGNhc2UgTmV2ZXJEZXB0aDpcblxuXHRcdFx0XHRcdFx0XHRcdGdsLmRlcHRoRnVuYyggZ2wuTkVWRVIgKTtcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdFx0XHRjYXNlIEFsd2F5c0RlcHRoOlxuXG5cdFx0XHRcdFx0XHRcdFx0Z2wuZGVwdGhGdW5jKCBnbC5BTFdBWVMgKTtcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdFx0XHRjYXNlIExlc3NEZXB0aDpcblxuXHRcdFx0XHRcdFx0XHRcdGdsLmRlcHRoRnVuYyggZ2wuTEVTUyApO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHRcdGNhc2UgTGVzc0VxdWFsRGVwdGg6XG5cblx0XHRcdFx0XHRcdFx0XHRnbC5kZXB0aEZ1bmMoIGdsLkxFUVVBTCApO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHRcdGNhc2UgRXF1YWxEZXB0aDpcblxuXHRcdFx0XHRcdFx0XHRcdGdsLmRlcHRoRnVuYyggZ2wuRVFVQUwgKTtcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdFx0XHRjYXNlIEdyZWF0ZXJFcXVhbERlcHRoOlxuXG5cdFx0XHRcdFx0XHRcdFx0Z2wuZGVwdGhGdW5jKCBnbC5HRVFVQUwgKTtcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdFx0XHRjYXNlIEdyZWF0ZXJEZXB0aDpcblxuXHRcdFx0XHRcdFx0XHRcdGdsLmRlcHRoRnVuYyggZ2wuR1JFQVRFUiApO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHRcdGNhc2UgTm90RXF1YWxEZXB0aDpcblxuXHRcdFx0XHRcdFx0XHRcdGdsLmRlcHRoRnVuYyggZ2wuTk9URVFVQUwgKTtcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdFx0XHRkZWZhdWx0OlxuXG5cdFx0XHRcdFx0XHRcdFx0Z2wuZGVwdGhGdW5jKCBnbC5MRVFVQUwgKTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0Z2wuZGVwdGhGdW5jKCBnbC5MRVFVQUwgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGN1cnJlbnREZXB0aEZ1bmMgPSBkZXB0aEZ1bmM7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9LFxuXG5cdFx0XHRzZXRMb2NrZWQ6IGZ1bmN0aW9uICggbG9jayApIHtcblxuXHRcdFx0XHRsb2NrZWQgPSBsb2NrO1xuXG5cdFx0XHR9LFxuXG5cdFx0XHRzZXRDbGVhcjogZnVuY3Rpb24gKCBkZXB0aCApIHtcblxuXHRcdFx0XHRpZiAoIGN1cnJlbnREZXB0aENsZWFyICE9PSBkZXB0aCApIHtcblxuXHRcdFx0XHRcdGdsLmNsZWFyRGVwdGgoIGRlcHRoICk7XG5cdFx0XHRcdFx0Y3VycmVudERlcHRoQ2xlYXIgPSBkZXB0aDtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0sXG5cblx0XHRcdHJlc2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdFx0bG9ja2VkID0gZmFsc2U7XG5cblx0XHRcdFx0Y3VycmVudERlcHRoTWFzayA9IG51bGw7XG5cdFx0XHRcdGN1cnJlbnREZXB0aEZ1bmMgPSBudWxsO1xuXHRcdFx0XHRjdXJyZW50RGVwdGhDbGVhciA9IG51bGw7XG5cblx0XHRcdH1cblxuXHRcdH07XG5cblx0fVxuXG5cdGZ1bmN0aW9uIFN0ZW5jaWxCdWZmZXIoKSB7XG5cblx0XHR2YXIgbG9ja2VkID0gZmFsc2U7XG5cblx0XHR2YXIgY3VycmVudFN0ZW5jaWxNYXNrID0gbnVsbDtcblx0XHR2YXIgY3VycmVudFN0ZW5jaWxGdW5jID0gbnVsbDtcblx0XHR2YXIgY3VycmVudFN0ZW5jaWxSZWYgPSBudWxsO1xuXHRcdHZhciBjdXJyZW50U3RlbmNpbEZ1bmNNYXNrID0gbnVsbDtcblx0XHR2YXIgY3VycmVudFN0ZW5jaWxGYWlsID0gbnVsbDtcblx0XHR2YXIgY3VycmVudFN0ZW5jaWxaRmFpbCA9IG51bGw7XG5cdFx0dmFyIGN1cnJlbnRTdGVuY2lsWlBhc3MgPSBudWxsO1xuXHRcdHZhciBjdXJyZW50U3RlbmNpbENsZWFyID0gbnVsbDtcblxuXHRcdHJldHVybiB7XG5cblx0XHRcdHNldFRlc3Q6IGZ1bmN0aW9uICggc3RlbmNpbFRlc3QgKSB7XG5cblx0XHRcdFx0aWYgKCBzdGVuY2lsVGVzdCApIHtcblxuXHRcdFx0XHRcdGVuYWJsZSggZ2wuU1RFTkNJTF9URVNUICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGRpc2FibGUoIGdsLlNURU5DSUxfVEVTVCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSxcblxuXHRcdFx0c2V0TWFzazogZnVuY3Rpb24gKCBzdGVuY2lsTWFzayApIHtcblxuXHRcdFx0XHRpZiAoIGN1cnJlbnRTdGVuY2lsTWFzayAhPT0gc3RlbmNpbE1hc2sgJiYgISBsb2NrZWQgKSB7XG5cblx0XHRcdFx0XHRnbC5zdGVuY2lsTWFzayggc3RlbmNpbE1hc2sgKTtcblx0XHRcdFx0XHRjdXJyZW50U3RlbmNpbE1hc2sgPSBzdGVuY2lsTWFzaztcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0sXG5cblx0XHRcdHNldEZ1bmM6IGZ1bmN0aW9uICggc3RlbmNpbEZ1bmMsIHN0ZW5jaWxSZWYsIHN0ZW5jaWxNYXNrICkge1xuXG5cdFx0XHRcdGlmICggY3VycmVudFN0ZW5jaWxGdW5jICE9PSBzdGVuY2lsRnVuYyB8fFxuXHRcdFx0XHQgICAgIGN1cnJlbnRTdGVuY2lsUmVmIFx0IT09IHN0ZW5jaWxSZWYgXHR8fFxuXHRcdFx0XHQgICAgIGN1cnJlbnRTdGVuY2lsRnVuY01hc2sgIT09IHN0ZW5jaWxNYXNrICkge1xuXG5cdFx0XHRcdFx0Z2wuc3RlbmNpbEZ1bmMoIHN0ZW5jaWxGdW5jLCBzdGVuY2lsUmVmLCBzdGVuY2lsTWFzayApO1xuXG5cdFx0XHRcdFx0Y3VycmVudFN0ZW5jaWxGdW5jID0gc3RlbmNpbEZ1bmM7XG5cdFx0XHRcdFx0Y3VycmVudFN0ZW5jaWxSZWYgPSBzdGVuY2lsUmVmO1xuXHRcdFx0XHRcdGN1cnJlbnRTdGVuY2lsRnVuY01hc2sgPSBzdGVuY2lsTWFzaztcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0sXG5cblx0XHRcdHNldE9wOiBmdW5jdGlvbiAoIHN0ZW5jaWxGYWlsLCBzdGVuY2lsWkZhaWwsIHN0ZW5jaWxaUGFzcyApIHtcblxuXHRcdFx0XHRpZiAoIGN1cnJlbnRTdGVuY2lsRmFpbFx0ICE9PSBzdGVuY2lsRmFpbCBcdHx8XG5cdFx0XHRcdCAgICAgY3VycmVudFN0ZW5jaWxaRmFpbCAhPT0gc3RlbmNpbFpGYWlsIHx8XG5cdFx0XHRcdCAgICAgY3VycmVudFN0ZW5jaWxaUGFzcyAhPT0gc3RlbmNpbFpQYXNzICkge1xuXG5cdFx0XHRcdFx0Z2wuc3RlbmNpbE9wKCBzdGVuY2lsRmFpbCwgc3RlbmNpbFpGYWlsLCBzdGVuY2lsWlBhc3MgKTtcblxuXHRcdFx0XHRcdGN1cnJlbnRTdGVuY2lsRmFpbCA9IHN0ZW5jaWxGYWlsO1xuXHRcdFx0XHRcdGN1cnJlbnRTdGVuY2lsWkZhaWwgPSBzdGVuY2lsWkZhaWw7XG5cdFx0XHRcdFx0Y3VycmVudFN0ZW5jaWxaUGFzcyA9IHN0ZW5jaWxaUGFzcztcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0sXG5cblx0XHRcdHNldExvY2tlZDogZnVuY3Rpb24gKCBsb2NrICkge1xuXG5cdFx0XHRcdGxvY2tlZCA9IGxvY2s7XG5cblx0XHRcdH0sXG5cblx0XHRcdHNldENsZWFyOiBmdW5jdGlvbiAoIHN0ZW5jaWwgKSB7XG5cblx0XHRcdFx0aWYgKCBjdXJyZW50U3RlbmNpbENsZWFyICE9PSBzdGVuY2lsICkge1xuXG5cdFx0XHRcdFx0Z2wuY2xlYXJTdGVuY2lsKCBzdGVuY2lsICk7XG5cdFx0XHRcdFx0Y3VycmVudFN0ZW5jaWxDbGVhciA9IHN0ZW5jaWw7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9LFxuXG5cdFx0XHRyZXNldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRcdGxvY2tlZCA9IGZhbHNlO1xuXG5cdFx0XHRcdGN1cnJlbnRTdGVuY2lsTWFzayA9IG51bGw7XG5cdFx0XHRcdGN1cnJlbnRTdGVuY2lsRnVuYyA9IG51bGw7XG5cdFx0XHRcdGN1cnJlbnRTdGVuY2lsUmVmID0gbnVsbDtcblx0XHRcdFx0Y3VycmVudFN0ZW5jaWxGdW5jTWFzayA9IG51bGw7XG5cdFx0XHRcdGN1cnJlbnRTdGVuY2lsRmFpbCA9IG51bGw7XG5cdFx0XHRcdGN1cnJlbnRTdGVuY2lsWkZhaWwgPSBudWxsO1xuXHRcdFx0XHRjdXJyZW50U3RlbmNpbFpQYXNzID0gbnVsbDtcblx0XHRcdFx0Y3VycmVudFN0ZW5jaWxDbGVhciA9IG51bGw7XG5cblx0XHRcdH1cblxuXHRcdH07XG5cblx0fVxuXG5cdC8vXG5cblx0dmFyIGNvbG9yQnVmZmVyID0gbmV3IENvbG9yQnVmZmVyKCk7XG5cdHZhciBkZXB0aEJ1ZmZlciA9IG5ldyBEZXB0aEJ1ZmZlcigpO1xuXHR2YXIgc3RlbmNpbEJ1ZmZlciA9IG5ldyBTdGVuY2lsQnVmZmVyKCk7XG5cblx0dmFyIG1heFZlcnRleEF0dHJpYnV0ZXMgPSBnbC5nZXRQYXJhbWV0ZXIoIGdsLk1BWF9WRVJURVhfQVRUUklCUyApO1xuXHR2YXIgbmV3QXR0cmlidXRlcyA9IG5ldyBVaW50OEFycmF5KCBtYXhWZXJ0ZXhBdHRyaWJ1dGVzICk7XG5cdHZhciBlbmFibGVkQXR0cmlidXRlcyA9IG5ldyBVaW50OEFycmF5KCBtYXhWZXJ0ZXhBdHRyaWJ1dGVzICk7XG5cdHZhciBhdHRyaWJ1dGVEaXZpc29ycyA9IG5ldyBVaW50OEFycmF5KCBtYXhWZXJ0ZXhBdHRyaWJ1dGVzICk7XG5cblx0dmFyIGNhcGFiaWxpdGllcyA9IHt9O1xuXG5cdHZhciBjb21wcmVzc2VkVGV4dHVyZUZvcm1hdHMgPSBudWxsO1xuXG5cdHZhciBjdXJyZW50QmxlbmRpbmcgPSBudWxsO1xuXHR2YXIgY3VycmVudEJsZW5kRXF1YXRpb24gPSBudWxsO1xuXHR2YXIgY3VycmVudEJsZW5kU3JjID0gbnVsbDtcblx0dmFyIGN1cnJlbnRCbGVuZERzdCA9IG51bGw7XG5cdHZhciBjdXJyZW50QmxlbmRFcXVhdGlvbkFscGhhID0gbnVsbDtcblx0dmFyIGN1cnJlbnRCbGVuZFNyY0FscGhhID0gbnVsbDtcblx0dmFyIGN1cnJlbnRCbGVuZERzdEFscGhhID0gbnVsbDtcblx0dmFyIGN1cnJlbnRQcmVtdWx0aXBsZWRBbHBoYSA9IGZhbHNlO1xuXG5cdHZhciBjdXJyZW50RmxpcFNpZGVkID0gbnVsbDtcblx0dmFyIGN1cnJlbnRDdWxsRmFjZSA9IG51bGw7XG5cblx0dmFyIGN1cnJlbnRMaW5lV2lkdGggPSBudWxsO1xuXG5cdHZhciBjdXJyZW50UG9seWdvbk9mZnNldEZhY3RvciA9IG51bGw7XG5cdHZhciBjdXJyZW50UG9seWdvbk9mZnNldFVuaXRzID0gbnVsbDtcblxuXHR2YXIgY3VycmVudFNjaXNzb3JUZXN0ID0gbnVsbDtcblxuXHR2YXIgbWF4VGV4dHVyZXMgPSBnbC5nZXRQYXJhbWV0ZXIoIGdsLk1BWF9URVhUVVJFX0lNQUdFX1VOSVRTICk7XG5cblx0dmFyIHZlcnNpb24gPSBwYXJzZUZsb2F0KCAvXldlYkdMXFwgKFswLTldKS8uZXhlYyggZ2wuZ2V0UGFyYW1ldGVyKCBnbC5WRVJTSU9OICkgKVsgMSBdICk7XG5cdHZhciBsaW5lV2lkdGhBdmFpbGFibGUgPSBwYXJzZUZsb2F0KCB2ZXJzaW9uICkgPj0gMS4wO1xuXG5cdHZhciBjdXJyZW50VGV4dHVyZVNsb3QgPSBudWxsO1xuXHR2YXIgY3VycmVudEJvdW5kVGV4dHVyZXMgPSB7fTtcblxuXHR2YXIgY3VycmVudFNjaXNzb3IgPSBuZXcgVmVjdG9yNCgpO1xuXHR2YXIgY3VycmVudFZpZXdwb3J0ID0gbmV3IFZlY3RvcjQoKTtcblxuXHRmdW5jdGlvbiBjcmVhdGVUZXh0dXJlKCB0eXBlLCB0YXJnZXQsIGNvdW50ICkge1xuXG5cdFx0dmFyIGRhdGEgPSBuZXcgVWludDhBcnJheSggNCApOyAvLyA0IGlzIHJlcXVpcmVkIHRvIG1hdGNoIGRlZmF1bHQgdW5wYWNrIGFsaWdubWVudCBvZiA0LlxuXHRcdHZhciB0ZXh0dXJlID0gZ2wuY3JlYXRlVGV4dHVyZSgpO1xuXG5cdFx0Z2wuYmluZFRleHR1cmUoIHR5cGUsIHRleHR1cmUgKTtcblx0XHRnbC50ZXhQYXJhbWV0ZXJpKCB0eXBlLCBnbC5URVhUVVJFX01JTl9GSUxURVIsIGdsLk5FQVJFU1QgKTtcblx0XHRnbC50ZXhQYXJhbWV0ZXJpKCB0eXBlLCBnbC5URVhUVVJFX01BR19GSUxURVIsIGdsLk5FQVJFU1QgKTtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGNvdW50OyBpICsrICkge1xuXG5cdFx0XHRnbC50ZXhJbWFnZTJEKCB0YXJnZXQgKyBpLCAwLCBnbC5SR0JBLCAxLCAxLCAwLCBnbC5SR0JBLCBnbC5VTlNJR05FRF9CWVRFLCBkYXRhICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGV4dHVyZTtcblxuXHR9XG5cblx0dmFyIGVtcHR5VGV4dHVyZXMgPSB7fTtcblx0ZW1wdHlUZXh0dXJlc1sgZ2wuVEVYVFVSRV8yRCBdID0gY3JlYXRlVGV4dHVyZSggZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV8yRCwgMSApO1xuXHRlbXB0eVRleHR1cmVzWyBnbC5URVhUVVJFX0NVQkVfTUFQIF0gPSBjcmVhdGVUZXh0dXJlKCBnbC5URVhUVVJFX0NVQkVfTUFQLCBnbC5URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1gsIDYgKTtcblxuXHQvL1xuXG5cdGZ1bmN0aW9uIGluaXQoKSB7XG5cblx0XHRjb2xvckJ1ZmZlci5zZXRDbGVhciggMCwgMCwgMCwgMSApO1xuXHRcdGRlcHRoQnVmZmVyLnNldENsZWFyKCAxICk7XG5cdFx0c3RlbmNpbEJ1ZmZlci5zZXRDbGVhciggMCApO1xuXG5cdFx0ZW5hYmxlKCBnbC5ERVBUSF9URVNUICk7XG5cdFx0ZGVwdGhCdWZmZXIuc2V0RnVuYyggTGVzc0VxdWFsRGVwdGggKTtcblxuXHRcdHNldEZsaXBTaWRlZCggZmFsc2UgKTtcblx0XHRzZXRDdWxsRmFjZSggQ3VsbEZhY2VCYWNrICk7XG5cdFx0ZW5hYmxlKCBnbC5DVUxMX0ZBQ0UgKTtcblxuXHRcdGVuYWJsZSggZ2wuQkxFTkQgKTtcblx0XHRzZXRCbGVuZGluZyggTm9ybWFsQmxlbmRpbmcgKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gaW5pdEF0dHJpYnV0ZXMoKSB7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBuZXdBdHRyaWJ1dGVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdG5ld0F0dHJpYnV0ZXNbIGkgXSA9IDA7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGVuYWJsZUF0dHJpYnV0ZSggYXR0cmlidXRlICkge1xuXG5cdFx0bmV3QXR0cmlidXRlc1sgYXR0cmlidXRlIF0gPSAxO1xuXG5cdFx0aWYgKCBlbmFibGVkQXR0cmlidXRlc1sgYXR0cmlidXRlIF0gPT09IDAgKSB7XG5cblx0XHRcdGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KCBhdHRyaWJ1dGUgKTtcblx0XHRcdGVuYWJsZWRBdHRyaWJ1dGVzWyBhdHRyaWJ1dGUgXSA9IDE7XG5cblx0XHR9XG5cblx0XHRpZiAoIGF0dHJpYnV0ZURpdmlzb3JzWyBhdHRyaWJ1dGUgXSAhPT0gMCApIHtcblxuXHRcdFx0dmFyIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCAnQU5HTEVfaW5zdGFuY2VkX2FycmF5cycgKTtcblxuXHRcdFx0ZXh0ZW5zaW9uLnZlcnRleEF0dHJpYkRpdmlzb3JBTkdMRSggYXR0cmlidXRlLCAwICk7XG5cdFx0XHRhdHRyaWJ1dGVEaXZpc29yc1sgYXR0cmlidXRlIF0gPSAwO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBlbmFibGVBdHRyaWJ1dGVBbmREaXZpc29yKCBhdHRyaWJ1dGUsIG1lc2hQZXJBdHRyaWJ1dGUgKSB7XG5cblx0XHRuZXdBdHRyaWJ1dGVzWyBhdHRyaWJ1dGUgXSA9IDE7XG5cblx0XHRpZiAoIGVuYWJsZWRBdHRyaWJ1dGVzWyBhdHRyaWJ1dGUgXSA9PT0gMCApIHtcblxuXHRcdFx0Z2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoIGF0dHJpYnV0ZSApO1xuXHRcdFx0ZW5hYmxlZEF0dHJpYnV0ZXNbIGF0dHJpYnV0ZSBdID0gMTtcblxuXHRcdH1cblxuXHRcdGlmICggYXR0cmlidXRlRGl2aXNvcnNbIGF0dHJpYnV0ZSBdICE9PSBtZXNoUGVyQXR0cmlidXRlICkge1xuXG5cdFx0XHR2YXIgZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdBTkdMRV9pbnN0YW5jZWRfYXJyYXlzJyApO1xuXG5cdFx0XHRleHRlbnNpb24udmVydGV4QXR0cmliRGl2aXNvckFOR0xFKCBhdHRyaWJ1dGUsIG1lc2hQZXJBdHRyaWJ1dGUgKTtcblx0XHRcdGF0dHJpYnV0ZURpdmlzb3JzWyBhdHRyaWJ1dGUgXSA9IG1lc2hQZXJBdHRyaWJ1dGU7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGRpc2FibGVVbnVzZWRBdHRyaWJ1dGVzKCkge1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gZW5hYmxlZEF0dHJpYnV0ZXMubGVuZ3RoOyBpICE9PSBsOyArKyBpICkge1xuXG5cdFx0XHRpZiAoIGVuYWJsZWRBdHRyaWJ1dGVzWyBpIF0gIT09IG5ld0F0dHJpYnV0ZXNbIGkgXSApIHtcblxuXHRcdFx0XHRnbC5kaXNhYmxlVmVydGV4QXR0cmliQXJyYXkoIGkgKTtcblx0XHRcdFx0ZW5hYmxlZEF0dHJpYnV0ZXNbIGkgXSA9IDA7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gZW5hYmxlKCBpZCApIHtcblxuXHRcdGlmICggY2FwYWJpbGl0aWVzWyBpZCBdICE9PSB0cnVlICkge1xuXG5cdFx0XHRnbC5lbmFibGUoIGlkICk7XG5cdFx0XHRjYXBhYmlsaXRpZXNbIGlkIF0gPSB0cnVlO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBkaXNhYmxlKCBpZCApIHtcblxuXHRcdGlmICggY2FwYWJpbGl0aWVzWyBpZCBdICE9PSBmYWxzZSApIHtcblxuXHRcdFx0Z2wuZGlzYWJsZSggaWQgKTtcblx0XHRcdGNhcGFiaWxpdGllc1sgaWQgXSA9IGZhbHNlO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBnZXRDb21wcmVzc2VkVGV4dHVyZUZvcm1hdHMoKSB7XG5cblx0XHRpZiAoIGNvbXByZXNzZWRUZXh0dXJlRm9ybWF0cyA9PT0gbnVsbCApIHtcblxuXHRcdFx0Y29tcHJlc3NlZFRleHR1cmVGb3JtYXRzID0gW107XG5cblx0XHRcdGlmICggZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfcHZydGMnICkgfHxcblx0XHRcdCAgICAgZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0YycgKSB8fFxuXHRcdFx0ICAgICBleHRlbnNpb25zLmdldCggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9ldGMxJyApICkge1xuXG5cdFx0XHRcdHZhciBmb3JtYXRzID0gZ2wuZ2V0UGFyYW1ldGVyKCBnbC5DT01QUkVTU0VEX1RFWFRVUkVfRk9STUFUUyApO1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGZvcm1hdHMubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRcdFx0Y29tcHJlc3NlZFRleHR1cmVGb3JtYXRzLnB1c2goIGZvcm1hdHNbIGkgXSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNvbXByZXNzZWRUZXh0dXJlRm9ybWF0cztcblxuXHR9XG5cblx0ZnVuY3Rpb24gc2V0QmxlbmRpbmcoIGJsZW5kaW5nLCBibGVuZEVxdWF0aW9uLCBibGVuZFNyYywgYmxlbmREc3QsIGJsZW5kRXF1YXRpb25BbHBoYSwgYmxlbmRTcmNBbHBoYSwgYmxlbmREc3RBbHBoYSwgcHJlbXVsdGlwbGllZEFscGhhICkge1xuXG5cdFx0aWYgKCBibGVuZGluZyAhPT0gTm9CbGVuZGluZyApIHtcblxuXHRcdFx0ZW5hYmxlKCBnbC5CTEVORCApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0ZGlzYWJsZSggZ2wuQkxFTkQgKTtcblxuXHRcdH1cblxuXHRcdGlmICggYmxlbmRpbmcgIT09IGN1cnJlbnRCbGVuZGluZyB8fCBwcmVtdWx0aXBsaWVkQWxwaGEgIT09IGN1cnJlbnRQcmVtdWx0aXBsZWRBbHBoYSApIHtcblxuXHRcdFx0aWYgKCBibGVuZGluZyA9PT0gQWRkaXRpdmVCbGVuZGluZyApIHtcblxuXHRcdFx0XHRpZiAoIHByZW11bHRpcGxpZWRBbHBoYSApIHtcblxuXHRcdFx0XHRcdGdsLmJsZW5kRXF1YXRpb25TZXBhcmF0ZSggZ2wuRlVOQ19BREQsIGdsLkZVTkNfQUREICk7XG5cdFx0XHRcdFx0Z2wuYmxlbmRGdW5jU2VwYXJhdGUoIGdsLk9ORSwgZ2wuT05FLCBnbC5PTkUsIGdsLk9ORSApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRnbC5ibGVuZEVxdWF0aW9uKCBnbC5GVU5DX0FERCApO1xuXHRcdFx0XHRcdGdsLmJsZW5kRnVuYyggZ2wuU1JDX0FMUEhBLCBnbC5PTkUgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSBpZiAoIGJsZW5kaW5nID09PSBTdWJ0cmFjdGl2ZUJsZW5kaW5nICkge1xuXG5cdFx0XHRcdGlmICggcHJlbXVsdGlwbGllZEFscGhhICkge1xuXG5cdFx0XHRcdFx0Z2wuYmxlbmRFcXVhdGlvblNlcGFyYXRlKCBnbC5GVU5DX0FERCwgZ2wuRlVOQ19BREQgKTtcblx0XHRcdFx0XHRnbC5ibGVuZEZ1bmNTZXBhcmF0ZSggZ2wuWkVSTywgZ2wuWkVSTywgZ2wuT05FX01JTlVTX1NSQ19DT0xPUiwgZ2wuT05FX01JTlVTX1NSQ19BTFBIQSApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRnbC5ibGVuZEVxdWF0aW9uKCBnbC5GVU5DX0FERCApO1xuXHRcdFx0XHRcdGdsLmJsZW5kRnVuYyggZ2wuWkVSTywgZ2wuT05FX01JTlVTX1NSQ19DT0xPUiApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIGlmICggYmxlbmRpbmcgPT09IE11bHRpcGx5QmxlbmRpbmcgKSB7XG5cblx0XHRcdFx0aWYgKCBwcmVtdWx0aXBsaWVkQWxwaGEgKSB7XG5cblx0XHRcdFx0XHRnbC5ibGVuZEVxdWF0aW9uU2VwYXJhdGUoIGdsLkZVTkNfQURELCBnbC5GVU5DX0FERCApO1xuXHRcdFx0XHRcdGdsLmJsZW5kRnVuY1NlcGFyYXRlKCBnbC5aRVJPLCBnbC5TUkNfQ09MT1IsIGdsLlpFUk8sIGdsLlNSQ19BTFBIQSApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRnbC5ibGVuZEVxdWF0aW9uKCBnbC5GVU5DX0FERCApO1xuXHRcdFx0XHRcdGdsLmJsZW5kRnVuYyggZ2wuWkVSTywgZ2wuU1JDX0NPTE9SICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGlmICggcHJlbXVsdGlwbGllZEFscGhhICkge1xuXG5cdFx0XHRcdFx0Z2wuYmxlbmRFcXVhdGlvblNlcGFyYXRlKCBnbC5GVU5DX0FERCwgZ2wuRlVOQ19BREQgKTtcblx0XHRcdFx0XHRnbC5ibGVuZEZ1bmNTZXBhcmF0ZSggZ2wuT05FLCBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBLCBnbC5PTkUsIGdsLk9ORV9NSU5VU19TUkNfQUxQSEEgKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Z2wuYmxlbmRFcXVhdGlvblNlcGFyYXRlKCBnbC5GVU5DX0FERCwgZ2wuRlVOQ19BREQgKTtcblx0XHRcdFx0XHRnbC5ibGVuZEZ1bmNTZXBhcmF0ZSggZ2wuU1JDX0FMUEhBLCBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBLCBnbC5PTkUsIGdsLk9ORV9NSU5VU19TUkNfQUxQSEEgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0Y3VycmVudEJsZW5kaW5nID0gYmxlbmRpbmc7XG5cdFx0XHRjdXJyZW50UHJlbXVsdGlwbGVkQWxwaGEgPSBwcmVtdWx0aXBsaWVkQWxwaGE7XG5cblx0XHR9XG5cblx0XHRpZiAoIGJsZW5kaW5nID09PSBDdXN0b21CbGVuZGluZyApIHtcblxuXHRcdFx0YmxlbmRFcXVhdGlvbkFscGhhID0gYmxlbmRFcXVhdGlvbkFscGhhIHx8IGJsZW5kRXF1YXRpb247XG5cdFx0XHRibGVuZFNyY0FscGhhID0gYmxlbmRTcmNBbHBoYSB8fCBibGVuZFNyYztcblx0XHRcdGJsZW5kRHN0QWxwaGEgPSBibGVuZERzdEFscGhhIHx8IGJsZW5kRHN0O1xuXG5cdFx0XHRpZiAoIGJsZW5kRXF1YXRpb24gIT09IGN1cnJlbnRCbGVuZEVxdWF0aW9uIHx8IGJsZW5kRXF1YXRpb25BbHBoYSAhPT0gY3VycmVudEJsZW5kRXF1YXRpb25BbHBoYSApIHtcblxuXHRcdFx0XHRnbC5ibGVuZEVxdWF0aW9uU2VwYXJhdGUoIHBhcmFtVGhyZWVUb0dMKCBibGVuZEVxdWF0aW9uICksIHBhcmFtVGhyZWVUb0dMKCBibGVuZEVxdWF0aW9uQWxwaGEgKSApO1xuXG5cdFx0XHRcdGN1cnJlbnRCbGVuZEVxdWF0aW9uID0gYmxlbmRFcXVhdGlvbjtcblx0XHRcdFx0Y3VycmVudEJsZW5kRXF1YXRpb25BbHBoYSA9IGJsZW5kRXF1YXRpb25BbHBoYTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGJsZW5kU3JjICE9PSBjdXJyZW50QmxlbmRTcmMgfHwgYmxlbmREc3QgIT09IGN1cnJlbnRCbGVuZERzdCB8fCBibGVuZFNyY0FscGhhICE9PSBjdXJyZW50QmxlbmRTcmNBbHBoYSB8fCBibGVuZERzdEFscGhhICE9PSBjdXJyZW50QmxlbmREc3RBbHBoYSApIHtcblxuXHRcdFx0XHRnbC5ibGVuZEZ1bmNTZXBhcmF0ZSggcGFyYW1UaHJlZVRvR0woIGJsZW5kU3JjICksIHBhcmFtVGhyZWVUb0dMKCBibGVuZERzdCApLCBwYXJhbVRocmVlVG9HTCggYmxlbmRTcmNBbHBoYSApLCBwYXJhbVRocmVlVG9HTCggYmxlbmREc3RBbHBoYSApICk7XG5cblx0XHRcdFx0Y3VycmVudEJsZW5kU3JjID0gYmxlbmRTcmM7XG5cdFx0XHRcdGN1cnJlbnRCbGVuZERzdCA9IGJsZW5kRHN0O1xuXHRcdFx0XHRjdXJyZW50QmxlbmRTcmNBbHBoYSA9IGJsZW5kU3JjQWxwaGE7XG5cdFx0XHRcdGN1cnJlbnRCbGVuZERzdEFscGhhID0gYmxlbmREc3RBbHBoYTtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Y3VycmVudEJsZW5kRXF1YXRpb24gPSBudWxsO1xuXHRcdFx0Y3VycmVudEJsZW5kU3JjID0gbnVsbDtcblx0XHRcdGN1cnJlbnRCbGVuZERzdCA9IG51bGw7XG5cdFx0XHRjdXJyZW50QmxlbmRFcXVhdGlvbkFscGhhID0gbnVsbDtcblx0XHRcdGN1cnJlbnRCbGVuZFNyY0FscGhhID0gbnVsbDtcblx0XHRcdGN1cnJlbnRCbGVuZERzdEFscGhhID0gbnVsbDtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gc2V0TWF0ZXJpYWwoIG1hdGVyaWFsICkge1xuXG5cdFx0bWF0ZXJpYWwuc2lkZSA9PT0gRG91YmxlU2lkZVxuXHRcdFx0PyBkaXNhYmxlKCBnbC5DVUxMX0ZBQ0UgKVxuXHRcdFx0OiBlbmFibGUoIGdsLkNVTExfRkFDRSApO1xuXG5cdFx0c2V0RmxpcFNpZGVkKCBtYXRlcmlhbC5zaWRlID09PSBCYWNrU2lkZSApO1xuXG5cdFx0bWF0ZXJpYWwudHJhbnNwYXJlbnQgPT09IHRydWVcblx0XHRcdD8gc2V0QmxlbmRpbmcoIG1hdGVyaWFsLmJsZW5kaW5nLCBtYXRlcmlhbC5ibGVuZEVxdWF0aW9uLCBtYXRlcmlhbC5ibGVuZFNyYywgbWF0ZXJpYWwuYmxlbmREc3QsIG1hdGVyaWFsLmJsZW5kRXF1YXRpb25BbHBoYSwgbWF0ZXJpYWwuYmxlbmRTcmNBbHBoYSwgbWF0ZXJpYWwuYmxlbmREc3RBbHBoYSwgbWF0ZXJpYWwucHJlbXVsdGlwbGllZEFscGhhIClcblx0XHRcdDogc2V0QmxlbmRpbmcoIE5vQmxlbmRpbmcgKTtcblxuXHRcdGRlcHRoQnVmZmVyLnNldEZ1bmMoIG1hdGVyaWFsLmRlcHRoRnVuYyApO1xuXHRcdGRlcHRoQnVmZmVyLnNldFRlc3QoIG1hdGVyaWFsLmRlcHRoVGVzdCApO1xuXHRcdGRlcHRoQnVmZmVyLnNldE1hc2soIG1hdGVyaWFsLmRlcHRoV3JpdGUgKTtcblx0XHRjb2xvckJ1ZmZlci5zZXRNYXNrKCBtYXRlcmlhbC5jb2xvcldyaXRlICk7XG5cblx0XHRzZXRQb2x5Z29uT2Zmc2V0KCBtYXRlcmlhbC5wb2x5Z29uT2Zmc2V0LCBtYXRlcmlhbC5wb2x5Z29uT2Zmc2V0RmFjdG9yLCBtYXRlcmlhbC5wb2x5Z29uT2Zmc2V0VW5pdHMgKTtcblxuXHR9XG5cblx0Ly9cblxuXHRmdW5jdGlvbiBzZXRGbGlwU2lkZWQoIGZsaXBTaWRlZCApIHtcblxuXHRcdGlmICggY3VycmVudEZsaXBTaWRlZCAhPT0gZmxpcFNpZGVkICkge1xuXG5cdFx0XHRpZiAoIGZsaXBTaWRlZCApIHtcblxuXHRcdFx0XHRnbC5mcm9udEZhY2UoIGdsLkNXICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Z2wuZnJvbnRGYWNlKCBnbC5DQ1cgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRjdXJyZW50RmxpcFNpZGVkID0gZmxpcFNpZGVkO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBzZXRDdWxsRmFjZSggY3VsbEZhY2UgKSB7XG5cblx0XHRpZiAoIGN1bGxGYWNlICE9PSBDdWxsRmFjZU5vbmUgKSB7XG5cblx0XHRcdGVuYWJsZSggZ2wuQ1VMTF9GQUNFICk7XG5cblx0XHRcdGlmICggY3VsbEZhY2UgIT09IGN1cnJlbnRDdWxsRmFjZSApIHtcblxuXHRcdFx0XHRpZiAoIGN1bGxGYWNlID09PSBDdWxsRmFjZUJhY2sgKSB7XG5cblx0XHRcdFx0XHRnbC5jdWxsRmFjZSggZ2wuQkFDSyApO1xuXG5cdFx0XHRcdH0gZWxzZSBpZiAoIGN1bGxGYWNlID09PSBDdWxsRmFjZUZyb250ICkge1xuXG5cdFx0XHRcdFx0Z2wuY3VsbEZhY2UoIGdsLkZST05UICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGdsLmN1bGxGYWNlKCBnbC5GUk9OVF9BTkRfQkFDSyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0ZGlzYWJsZSggZ2wuQ1VMTF9GQUNFICk7XG5cblx0XHR9XG5cblx0XHRjdXJyZW50Q3VsbEZhY2UgPSBjdWxsRmFjZTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gc2V0TGluZVdpZHRoKCB3aWR0aCApIHtcblxuXHRcdGlmICggd2lkdGggIT09IGN1cnJlbnRMaW5lV2lkdGggKSB7XG5cblx0XHRcdGlmICggbGluZVdpZHRoQXZhaWxhYmxlICkgZ2wubGluZVdpZHRoKCB3aWR0aCApO1xuXG5cdFx0XHRjdXJyZW50TGluZVdpZHRoID0gd2lkdGg7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHNldFBvbHlnb25PZmZzZXQoIHBvbHlnb25PZmZzZXQsIGZhY3RvciwgdW5pdHMgKSB7XG5cblx0XHRpZiAoIHBvbHlnb25PZmZzZXQgKSB7XG5cblx0XHRcdGVuYWJsZSggZ2wuUE9MWUdPTl9PRkZTRVRfRklMTCApO1xuXG5cdFx0XHRpZiAoIGN1cnJlbnRQb2x5Z29uT2Zmc2V0RmFjdG9yICE9PSBmYWN0b3IgfHwgY3VycmVudFBvbHlnb25PZmZzZXRVbml0cyAhPT0gdW5pdHMgKSB7XG5cblx0XHRcdFx0Z2wucG9seWdvbk9mZnNldCggZmFjdG9yLCB1bml0cyApO1xuXG5cdFx0XHRcdGN1cnJlbnRQb2x5Z29uT2Zmc2V0RmFjdG9yID0gZmFjdG9yO1xuXHRcdFx0XHRjdXJyZW50UG9seWdvbk9mZnNldFVuaXRzID0gdW5pdHM7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGRpc2FibGUoIGdsLlBPTFlHT05fT0ZGU0VUX0ZJTEwgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gZ2V0U2Npc3NvclRlc3QoKSB7XG5cblx0XHRyZXR1cm4gY3VycmVudFNjaXNzb3JUZXN0O1xuXG5cdH1cblxuXHRmdW5jdGlvbiBzZXRTY2lzc29yVGVzdCggc2Npc3NvclRlc3QgKSB7XG5cblx0XHRjdXJyZW50U2Npc3NvclRlc3QgPSBzY2lzc29yVGVzdDtcblxuXHRcdGlmICggc2Npc3NvclRlc3QgKSB7XG5cblx0XHRcdGVuYWJsZSggZ2wuU0NJU1NPUl9URVNUICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRkaXNhYmxlKCBnbC5TQ0lTU09SX1RFU1QgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gdGV4dHVyZVxuXG5cdGZ1bmN0aW9uIGFjdGl2ZVRleHR1cmUoIHdlYmdsU2xvdCApIHtcblxuXHRcdGlmICggd2ViZ2xTbG90ID09PSB1bmRlZmluZWQgKSB3ZWJnbFNsb3QgPSBnbC5URVhUVVJFMCArIG1heFRleHR1cmVzIC0gMTtcblxuXHRcdGlmICggY3VycmVudFRleHR1cmVTbG90ICE9PSB3ZWJnbFNsb3QgKSB7XG5cblx0XHRcdGdsLmFjdGl2ZVRleHR1cmUoIHdlYmdsU2xvdCApO1xuXHRcdFx0Y3VycmVudFRleHR1cmVTbG90ID0gd2ViZ2xTbG90O1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBiaW5kVGV4dHVyZSggd2ViZ2xUeXBlLCB3ZWJnbFRleHR1cmUgKSB7XG5cblx0XHRpZiAoIGN1cnJlbnRUZXh0dXJlU2xvdCA9PT0gbnVsbCApIHtcblxuXHRcdFx0YWN0aXZlVGV4dHVyZSgpO1xuXG5cdFx0fVxuXG5cdFx0dmFyIGJvdW5kVGV4dHVyZSA9IGN1cnJlbnRCb3VuZFRleHR1cmVzWyBjdXJyZW50VGV4dHVyZVNsb3QgXTtcblxuXHRcdGlmICggYm91bmRUZXh0dXJlID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGJvdW5kVGV4dHVyZSA9IHsgdHlwZTogdW5kZWZpbmVkLCB0ZXh0dXJlOiB1bmRlZmluZWQgfTtcblx0XHRcdGN1cnJlbnRCb3VuZFRleHR1cmVzWyBjdXJyZW50VGV4dHVyZVNsb3QgXSA9IGJvdW5kVGV4dHVyZTtcblxuXHRcdH1cblxuXHRcdGlmICggYm91bmRUZXh0dXJlLnR5cGUgIT09IHdlYmdsVHlwZSB8fCBib3VuZFRleHR1cmUudGV4dHVyZSAhPT0gd2ViZ2xUZXh0dXJlICkge1xuXG5cdFx0XHRnbC5iaW5kVGV4dHVyZSggd2ViZ2xUeXBlLCB3ZWJnbFRleHR1cmUgfHwgZW1wdHlUZXh0dXJlc1sgd2ViZ2xUeXBlIF0gKTtcblxuXHRcdFx0Ym91bmRUZXh0dXJlLnR5cGUgPSB3ZWJnbFR5cGU7XG5cdFx0XHRib3VuZFRleHR1cmUudGV4dHVyZSA9IHdlYmdsVGV4dHVyZTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gY29tcHJlc3NlZFRleEltYWdlMkQoKSB7XG5cblx0XHR0cnkge1xuXG5cdFx0XHRnbC5jb21wcmVzc2VkVGV4SW1hZ2UyRC5hcHBseSggZ2wsIGFyZ3VtZW50cyApO1xuXG5cdFx0fSBjYXRjaCAoIGVycm9yICkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCBlcnJvciApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiB0ZXhJbWFnZTJEKCkge1xuXG5cdFx0dHJ5IHtcblxuXHRcdFx0Z2wudGV4SW1hZ2UyRC5hcHBseSggZ2wsIGFyZ3VtZW50cyApO1xuXG5cdFx0fSBjYXRjaCAoIGVycm9yICkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCBlcnJvciApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHQvL1xuXG5cdGZ1bmN0aW9uIHNjaXNzb3IoIHNjaXNzb3IgKSB7XG5cblx0XHRpZiAoIGN1cnJlbnRTY2lzc29yLmVxdWFscyggc2Npc3NvciApID09PSBmYWxzZSApIHtcblxuXHRcdFx0Z2wuc2Npc3Nvciggc2Npc3Nvci54LCBzY2lzc29yLnksIHNjaXNzb3Iueiwgc2Npc3Nvci53ICk7XG5cdFx0XHRjdXJyZW50U2Npc3Nvci5jb3B5KCBzY2lzc29yICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHZpZXdwb3J0KCB2aWV3cG9ydCApIHtcblxuXHRcdGlmICggY3VycmVudFZpZXdwb3J0LmVxdWFscyggdmlld3BvcnQgKSA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdGdsLnZpZXdwb3J0KCB2aWV3cG9ydC54LCB2aWV3cG9ydC55LCB2aWV3cG9ydC56LCB2aWV3cG9ydC53ICk7XG5cdFx0XHRjdXJyZW50Vmlld3BvcnQuY29weSggdmlld3BvcnQgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0Ly9cblxuXHRmdW5jdGlvbiByZXNldCgpIHtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGVuYWJsZWRBdHRyaWJ1dGVzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0aWYgKCBlbmFibGVkQXR0cmlidXRlc1sgaSBdID09PSAxICkge1xuXG5cdFx0XHRcdGdsLmRpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheSggaSApO1xuXHRcdFx0XHRlbmFibGVkQXR0cmlidXRlc1sgaSBdID0gMDtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Y2FwYWJpbGl0aWVzID0ge307XG5cblx0XHRjb21wcmVzc2VkVGV4dHVyZUZvcm1hdHMgPSBudWxsO1xuXG5cdFx0Y3VycmVudFRleHR1cmVTbG90ID0gbnVsbDtcblx0XHRjdXJyZW50Qm91bmRUZXh0dXJlcyA9IHt9O1xuXG5cdFx0Y3VycmVudEJsZW5kaW5nID0gbnVsbDtcblxuXHRcdGN1cnJlbnRGbGlwU2lkZWQgPSBudWxsO1xuXHRcdGN1cnJlbnRDdWxsRmFjZSA9IG51bGw7XG5cblx0XHRjb2xvckJ1ZmZlci5yZXNldCgpO1xuXHRcdGRlcHRoQnVmZmVyLnJlc2V0KCk7XG5cdFx0c3RlbmNpbEJ1ZmZlci5yZXNldCgpO1xuXG5cdH1cblxuXHRyZXR1cm4ge1xuXG5cdFx0YnVmZmVyczoge1xuXHRcdFx0Y29sb3I6IGNvbG9yQnVmZmVyLFxuXHRcdFx0ZGVwdGg6IGRlcHRoQnVmZmVyLFxuXHRcdFx0c3RlbmNpbDogc3RlbmNpbEJ1ZmZlclxuXHRcdH0sXG5cblx0XHRpbml0OiBpbml0LFxuXHRcdGluaXRBdHRyaWJ1dGVzOiBpbml0QXR0cmlidXRlcyxcblx0XHRlbmFibGVBdHRyaWJ1dGU6IGVuYWJsZUF0dHJpYnV0ZSxcblx0XHRlbmFibGVBdHRyaWJ1dGVBbmREaXZpc29yOiBlbmFibGVBdHRyaWJ1dGVBbmREaXZpc29yLFxuXHRcdGRpc2FibGVVbnVzZWRBdHRyaWJ1dGVzOiBkaXNhYmxlVW51c2VkQXR0cmlidXRlcyxcblx0XHRlbmFibGU6IGVuYWJsZSxcblx0XHRkaXNhYmxlOiBkaXNhYmxlLFxuXHRcdGdldENvbXByZXNzZWRUZXh0dXJlRm9ybWF0czogZ2V0Q29tcHJlc3NlZFRleHR1cmVGb3JtYXRzLFxuXG5cdFx0c2V0QmxlbmRpbmc6IHNldEJsZW5kaW5nLFxuXHRcdHNldE1hdGVyaWFsOiBzZXRNYXRlcmlhbCxcblxuXHRcdHNldEZsaXBTaWRlZDogc2V0RmxpcFNpZGVkLFxuXHRcdHNldEN1bGxGYWNlOiBzZXRDdWxsRmFjZSxcblxuXHRcdHNldExpbmVXaWR0aDogc2V0TGluZVdpZHRoLFxuXHRcdHNldFBvbHlnb25PZmZzZXQ6IHNldFBvbHlnb25PZmZzZXQsXG5cblx0XHRnZXRTY2lzc29yVGVzdDogZ2V0U2Npc3NvclRlc3QsXG5cdFx0c2V0U2Npc3NvclRlc3Q6IHNldFNjaXNzb3JUZXN0LFxuXG5cdFx0YWN0aXZlVGV4dHVyZTogYWN0aXZlVGV4dHVyZSxcblx0XHRiaW5kVGV4dHVyZTogYmluZFRleHR1cmUsXG5cdFx0Y29tcHJlc3NlZFRleEltYWdlMkQ6IGNvbXByZXNzZWRUZXhJbWFnZTJELFxuXHRcdHRleEltYWdlMkQ6IHRleEltYWdlMkQsXG5cblx0XHRzY2lzc29yOiBzY2lzc29yLFxuXHRcdHZpZXdwb3J0OiB2aWV3cG9ydCxcblxuXHRcdHJlc2V0OiByZXNldFxuXG5cdH07XG5cbn1cblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIFdlYkdMQ2FwYWJpbGl0aWVzKCBnbCwgZXh0ZW5zaW9ucywgcGFyYW1ldGVycyApIHtcblxuXHR2YXIgbWF4QW5pc290cm9weTtcblxuXHRmdW5jdGlvbiBnZXRNYXhBbmlzb3Ryb3B5KCkge1xuXG5cdFx0aWYgKCBtYXhBbmlzb3Ryb3B5ICE9PSB1bmRlZmluZWQgKSByZXR1cm4gbWF4QW5pc290cm9weTtcblxuXHRcdHZhciBleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ0VYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYycgKTtcblxuXHRcdGlmICggZXh0ZW5zaW9uICE9PSBudWxsICkge1xuXG5cdFx0XHRtYXhBbmlzb3Ryb3B5ID0gZ2wuZ2V0UGFyYW1ldGVyKCBleHRlbnNpb24uTUFYX1RFWFRVUkVfTUFYX0FOSVNPVFJPUFlfRVhUICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRtYXhBbmlzb3Ryb3B5ID0gMDtcblxuXHRcdH1cblxuXHRcdHJldHVybiBtYXhBbmlzb3Ryb3B5O1xuXG5cdH1cblxuXHRmdW5jdGlvbiBnZXRNYXhQcmVjaXNpb24oIHByZWNpc2lvbiApIHtcblxuXHRcdGlmICggcHJlY2lzaW9uID09PSAnaGlnaHAnICkge1xuXG5cdFx0XHRpZiAoIGdsLmdldFNoYWRlclByZWNpc2lvbkZvcm1hdCggZ2wuVkVSVEVYX1NIQURFUiwgZ2wuSElHSF9GTE9BVCApLnByZWNpc2lvbiA+IDAgJiZcblx0XHRcdCAgICAgZ2wuZ2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0KCBnbC5GUkFHTUVOVF9TSEFERVIsIGdsLkhJR0hfRkxPQVQgKS5wcmVjaXNpb24gPiAwICkge1xuXG5cdFx0XHRcdHJldHVybiAnaGlnaHAnO1xuXG5cdFx0XHR9XG5cblx0XHRcdHByZWNpc2lvbiA9ICdtZWRpdW1wJztcblxuXHRcdH1cblxuXHRcdGlmICggcHJlY2lzaW9uID09PSAnbWVkaXVtcCcgKSB7XG5cblx0XHRcdGlmICggZ2wuZ2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0KCBnbC5WRVJURVhfU0hBREVSLCBnbC5NRURJVU1fRkxPQVQgKS5wcmVjaXNpb24gPiAwICYmXG5cdFx0XHQgICAgIGdsLmdldFNoYWRlclByZWNpc2lvbkZvcm1hdCggZ2wuRlJBR01FTlRfU0hBREVSLCBnbC5NRURJVU1fRkxPQVQgKS5wcmVjaXNpb24gPiAwICkge1xuXG5cdFx0XHRcdHJldHVybiAnbWVkaXVtcCc7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiAnbG93cCc7XG5cblx0fVxuXG5cdHZhciBwcmVjaXNpb24gPSBwYXJhbWV0ZXJzLnByZWNpc2lvbiAhPT0gdW5kZWZpbmVkID8gcGFyYW1ldGVycy5wcmVjaXNpb24gOiAnaGlnaHAnO1xuXHR2YXIgbWF4UHJlY2lzaW9uID0gZ2V0TWF4UHJlY2lzaW9uKCBwcmVjaXNpb24gKTtcblxuXHRpZiAoIG1heFByZWNpc2lvbiAhPT0gcHJlY2lzaW9uICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjonLCBwcmVjaXNpb24sICdub3Qgc3VwcG9ydGVkLCB1c2luZycsIG1heFByZWNpc2lvbiwgJ2luc3RlYWQuJyApO1xuXHRcdHByZWNpc2lvbiA9IG1heFByZWNpc2lvbjtcblxuXHR9XG5cblx0dmFyIGxvZ2FyaXRobWljRGVwdGhCdWZmZXIgPSBwYXJhbWV0ZXJzLmxvZ2FyaXRobWljRGVwdGhCdWZmZXIgPT09IHRydWUgJiYgISEgZXh0ZW5zaW9ucy5nZXQoICdFWFRfZnJhZ19kZXB0aCcgKTtcblxuXHR2YXIgbWF4VGV4dHVyZXMgPSBnbC5nZXRQYXJhbWV0ZXIoIGdsLk1BWF9URVhUVVJFX0lNQUdFX1VOSVRTICk7XG5cdHZhciBtYXhWZXJ0ZXhUZXh0dXJlcyA9IGdsLmdldFBhcmFtZXRlciggZ2wuTUFYX1ZFUlRFWF9URVhUVVJFX0lNQUdFX1VOSVRTICk7XG5cdHZhciBtYXhUZXh0dXJlU2l6ZSA9IGdsLmdldFBhcmFtZXRlciggZ2wuTUFYX1RFWFRVUkVfU0laRSApO1xuXHR2YXIgbWF4Q3ViZW1hcFNpemUgPSBnbC5nZXRQYXJhbWV0ZXIoIGdsLk1BWF9DVUJFX01BUF9URVhUVVJFX1NJWkUgKTtcblxuXHR2YXIgbWF4QXR0cmlidXRlcyA9IGdsLmdldFBhcmFtZXRlciggZ2wuTUFYX1ZFUlRFWF9BVFRSSUJTICk7XG5cdHZhciBtYXhWZXJ0ZXhVbmlmb3JtcyA9IGdsLmdldFBhcmFtZXRlciggZ2wuTUFYX1ZFUlRFWF9VTklGT1JNX1ZFQ1RPUlMgKTtcblx0dmFyIG1heFZhcnlpbmdzID0gZ2wuZ2V0UGFyYW1ldGVyKCBnbC5NQVhfVkFSWUlOR19WRUNUT1JTICk7XG5cdHZhciBtYXhGcmFnbWVudFVuaWZvcm1zID0gZ2wuZ2V0UGFyYW1ldGVyKCBnbC5NQVhfRlJBR01FTlRfVU5JRk9STV9WRUNUT1JTICk7XG5cblx0dmFyIHZlcnRleFRleHR1cmVzID0gbWF4VmVydGV4VGV4dHVyZXMgPiAwO1xuXHR2YXIgZmxvYXRGcmFnbWVudFRleHR1cmVzID0gISEgZXh0ZW5zaW9ucy5nZXQoICdPRVNfdGV4dHVyZV9mbG9hdCcgKTtcblx0dmFyIGZsb2F0VmVydGV4VGV4dHVyZXMgPSB2ZXJ0ZXhUZXh0dXJlcyAmJiBmbG9hdEZyYWdtZW50VGV4dHVyZXM7XG5cblx0cmV0dXJuIHtcblxuXHRcdGdldE1heEFuaXNvdHJvcHk6IGdldE1heEFuaXNvdHJvcHksXG5cdFx0Z2V0TWF4UHJlY2lzaW9uOiBnZXRNYXhQcmVjaXNpb24sXG5cblx0XHRwcmVjaXNpb246IHByZWNpc2lvbixcblx0XHRsb2dhcml0aG1pY0RlcHRoQnVmZmVyOiBsb2dhcml0aG1pY0RlcHRoQnVmZmVyLFxuXG5cdFx0bWF4VGV4dHVyZXM6IG1heFRleHR1cmVzLFxuXHRcdG1heFZlcnRleFRleHR1cmVzOiBtYXhWZXJ0ZXhUZXh0dXJlcyxcblx0XHRtYXhUZXh0dXJlU2l6ZTogbWF4VGV4dHVyZVNpemUsXG5cdFx0bWF4Q3ViZW1hcFNpemU6IG1heEN1YmVtYXBTaXplLFxuXG5cdFx0bWF4QXR0cmlidXRlczogbWF4QXR0cmlidXRlcyxcblx0XHRtYXhWZXJ0ZXhVbmlmb3JtczogbWF4VmVydGV4VW5pZm9ybXMsXG5cdFx0bWF4VmFyeWluZ3M6IG1heFZhcnlpbmdzLFxuXHRcdG1heEZyYWdtZW50VW5pZm9ybXM6IG1heEZyYWdtZW50VW5pZm9ybXMsXG5cblx0XHR2ZXJ0ZXhUZXh0dXJlczogdmVydGV4VGV4dHVyZXMsXG5cdFx0ZmxvYXRGcmFnbWVudFRleHR1cmVzOiBmbG9hdEZyYWdtZW50VGV4dHVyZXMsXG5cdFx0ZmxvYXRWZXJ0ZXhUZXh0dXJlczogZmxvYXRWZXJ0ZXhUZXh0dXJlc1xuXG5cdH07XG5cbn1cblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIFdlYkdMRXh0ZW5zaW9ucyggZ2wgKSB7XG5cblx0dmFyIGV4dGVuc2lvbnMgPSB7fTtcblxuXHRyZXR1cm4ge1xuXG5cdFx0Z2V0OiBmdW5jdGlvbiAoIG5hbWUgKSB7XG5cblx0XHRcdGlmICggZXh0ZW5zaW9uc1sgbmFtZSBdICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0cmV0dXJuIGV4dGVuc2lvbnNbIG5hbWUgXTtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgZXh0ZW5zaW9uO1xuXG5cdFx0XHRzd2l0Y2ggKCBuYW1lICkge1xuXG5cdFx0XHRcdGNhc2UgJ1dFQkdMX2RlcHRoX3RleHR1cmUnOlxuXHRcdFx0XHRcdGV4dGVuc2lvbiA9IGdsLmdldEV4dGVuc2lvbiggJ1dFQkdMX2RlcHRoX3RleHR1cmUnICkgfHwgZ2wuZ2V0RXh0ZW5zaW9uKCAnTU9aX1dFQkdMX2RlcHRoX3RleHR1cmUnICkgfHwgZ2wuZ2V0RXh0ZW5zaW9uKCAnV0VCS0lUX1dFQkdMX2RlcHRoX3RleHR1cmUnICk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSAnRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljJzpcblx0XHRcdFx0XHRleHRlbnNpb24gPSBnbC5nZXRFeHRlbnNpb24oICdFWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMnICkgfHwgZ2wuZ2V0RXh0ZW5zaW9uKCAnTU9aX0VYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYycgKSB8fCBnbC5nZXRFeHRlbnNpb24oICdXRUJLSVRfRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljJyApO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjJzpcblx0XHRcdFx0XHRleHRlbnNpb24gPSBnbC5nZXRFeHRlbnNpb24oICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0YycgKSB8fCBnbC5nZXRFeHRlbnNpb24oICdNT1pfV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMnICkgfHwgZ2wuZ2V0RXh0ZW5zaW9uKCAnV0VCS0lUX1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjJyApO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0Yyc6XG5cdFx0XHRcdFx0ZXh0ZW5zaW9uID0gZ2wuZ2V0RXh0ZW5zaW9uKCAnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjJyApIHx8IGdsLmdldEV4dGVuc2lvbiggJ1dFQktJVF9XRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfcHZydGMnICk7XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSAnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX2V0YzEnOlxuXHRcdFx0XHRcdGV4dGVuc2lvbiA9IGdsLmdldEV4dGVuc2lvbiggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9ldGMxJyApO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0ZXh0ZW5zaW9uID0gZ2wuZ2V0RXh0ZW5zaW9uKCBuYW1lICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBleHRlbnNpb24gPT09IG51bGwgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogJyArIG5hbWUgKyAnIGV4dGVuc2lvbiBub3Qgc3VwcG9ydGVkLicgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRleHRlbnNpb25zWyBuYW1lIF0gPSBleHRlbnNpb247XG5cblx0XHRcdHJldHVybiBleHRlbnNpb247XG5cblx0XHR9XG5cblx0fTtcblxufVxuXG4vKipcbiAqIEBhdXRob3IgdHNjaHdcbiAqL1xuXG5mdW5jdGlvbiBXZWJHTENsaXBwaW5nKCkge1xuXG5cdHZhciBzY29wZSA9IHRoaXMsXG5cblx0XHRnbG9iYWxTdGF0ZSA9IG51bGwsXG5cdFx0bnVtR2xvYmFsUGxhbmVzID0gMCxcblx0XHRsb2NhbENsaXBwaW5nRW5hYmxlZCA9IGZhbHNlLFxuXHRcdHJlbmRlcmluZ1NoYWRvd3MgPSBmYWxzZSxcblxuXHRcdHBsYW5lID0gbmV3IFBsYW5lKCksXG5cdFx0dmlld05vcm1hbE1hdHJpeCA9IG5ldyBNYXRyaXgzKCksXG5cblx0XHR1bmlmb3JtID0geyB2YWx1ZTogbnVsbCwgbmVlZHNVcGRhdGU6IGZhbHNlIH07XG5cblx0dGhpcy51bmlmb3JtID0gdW5pZm9ybTtcblx0dGhpcy5udW1QbGFuZXMgPSAwO1xuXHR0aGlzLm51bUludGVyc2VjdGlvbiA9IDA7XG5cblx0dGhpcy5pbml0ID0gZnVuY3Rpb24oIHBsYW5lcywgZW5hYmxlTG9jYWxDbGlwcGluZywgY2FtZXJhICkge1xuXG5cdFx0dmFyIGVuYWJsZWQgPVxuXHRcdFx0cGxhbmVzLmxlbmd0aCAhPT0gMCB8fFxuXHRcdFx0ZW5hYmxlTG9jYWxDbGlwcGluZyB8fFxuXHRcdFx0Ly8gZW5hYmxlIHN0YXRlIG9mIHByZXZpb3VzIGZyYW1lIC0gdGhlIGNsaXBwaW5nIGNvZGUgaGFzIHRvXG5cdFx0XHQvLyBydW4gYW5vdGhlciBmcmFtZSBpbiBvcmRlciB0byByZXNldCB0aGUgc3RhdGU6XG5cdFx0XHRudW1HbG9iYWxQbGFuZXMgIT09IDAgfHxcblx0XHRcdGxvY2FsQ2xpcHBpbmdFbmFibGVkO1xuXG5cdFx0bG9jYWxDbGlwcGluZ0VuYWJsZWQgPSBlbmFibGVMb2NhbENsaXBwaW5nO1xuXG5cdFx0Z2xvYmFsU3RhdGUgPSBwcm9qZWN0UGxhbmVzKCBwbGFuZXMsIGNhbWVyYSwgMCApO1xuXHRcdG51bUdsb2JhbFBsYW5lcyA9IHBsYW5lcy5sZW5ndGg7XG5cblx0XHRyZXR1cm4gZW5hYmxlZDtcblxuXHR9O1xuXG5cdHRoaXMuYmVnaW5TaGFkb3dzID0gZnVuY3Rpb24oKSB7XG5cblx0XHRyZW5kZXJpbmdTaGFkb3dzID0gdHJ1ZTtcblx0XHRwcm9qZWN0UGxhbmVzKCBudWxsICk7XG5cblx0fTtcblxuXHR0aGlzLmVuZFNoYWRvd3MgPSBmdW5jdGlvbigpIHtcblxuXHRcdHJlbmRlcmluZ1NoYWRvd3MgPSBmYWxzZTtcblx0XHRyZXNldEdsb2JhbFN0YXRlKCk7XG5cblx0fTtcblxuXHR0aGlzLnNldFN0YXRlID0gZnVuY3Rpb24oIHBsYW5lcywgY2xpcEludGVyc2VjdGlvbiwgY2xpcFNoYWRvd3MsIGNhbWVyYSwgY2FjaGUsIGZyb21DYWNoZSApIHtcblxuXHRcdGlmICggISBsb2NhbENsaXBwaW5nRW5hYmxlZCB8fFxuXHRcdFx0XHRwbGFuZXMgPT09IG51bGwgfHwgcGxhbmVzLmxlbmd0aCA9PT0gMCB8fFxuXHRcdFx0XHRyZW5kZXJpbmdTaGFkb3dzICYmICEgY2xpcFNoYWRvd3MgKSB7XG5cdFx0XHQvLyB0aGVyZSdzIG5vIGxvY2FsIGNsaXBwaW5nXG5cblx0XHRcdGlmICggcmVuZGVyaW5nU2hhZG93cyApIHtcblx0XHRcdFx0Ly8gdGhlcmUncyBubyBnbG9iYWwgY2xpcHBpbmdcblxuXHRcdFx0XHRwcm9qZWN0UGxhbmVzKCBudWxsICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0cmVzZXRHbG9iYWxTdGF0ZSgpO1xuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dmFyIG5HbG9iYWwgPSByZW5kZXJpbmdTaGFkb3dzID8gMCA6IG51bUdsb2JhbFBsYW5lcyxcblx0XHRcdFx0bEdsb2JhbCA9IG5HbG9iYWwgKiA0LFxuXG5cdFx0XHRcdGRzdEFycmF5ID0gY2FjaGUuY2xpcHBpbmdTdGF0ZSB8fCBudWxsO1xuXG5cdFx0XHR1bmlmb3JtLnZhbHVlID0gZHN0QXJyYXk7IC8vIGVuc3VyZSB1bmlxdWUgc3RhdGVcblxuXHRcdFx0ZHN0QXJyYXkgPSBwcm9qZWN0UGxhbmVzKCBwbGFuZXMsIGNhbWVyYSwgbEdsb2JhbCwgZnJvbUNhY2hlICk7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMDsgaSAhPT0gbEdsb2JhbDsgKysgaSApIHtcblxuXHRcdFx0XHRkc3RBcnJheVsgaSBdID0gZ2xvYmFsU3RhdGVbIGkgXTtcblxuXHRcdFx0fVxuXG5cdFx0XHRjYWNoZS5jbGlwcGluZ1N0YXRlID0gZHN0QXJyYXk7XG5cdFx0XHR0aGlzLm51bUludGVyc2VjdGlvbiA9IGNsaXBJbnRlcnNlY3Rpb24gPyB0aGlzLm51bVBsYW5lcyA6IDA7XG5cdFx0XHR0aGlzLm51bVBsYW5lcyArPSBuR2xvYmFsO1xuXG5cdFx0fVxuXG5cblx0fTtcblxuXHRmdW5jdGlvbiByZXNldEdsb2JhbFN0YXRlKCkge1xuXG5cdFx0aWYgKCB1bmlmb3JtLnZhbHVlICE9PSBnbG9iYWxTdGF0ZSApIHtcblxuXHRcdFx0dW5pZm9ybS52YWx1ZSA9IGdsb2JhbFN0YXRlO1xuXHRcdFx0dW5pZm9ybS5uZWVkc1VwZGF0ZSA9IG51bUdsb2JhbFBsYW5lcyA+IDA7XG5cblx0XHR9XG5cblx0XHRzY29wZS5udW1QbGFuZXMgPSBudW1HbG9iYWxQbGFuZXM7XG5cdFx0c2NvcGUubnVtSW50ZXJzZWN0aW9uID0gMDtcblxuXHR9XG5cblx0ZnVuY3Rpb24gcHJvamVjdFBsYW5lcyggcGxhbmVzLCBjYW1lcmEsIGRzdE9mZnNldCwgc2tpcFRyYW5zZm9ybSApIHtcblxuXHRcdHZhciBuUGxhbmVzID0gcGxhbmVzICE9PSBudWxsID8gcGxhbmVzLmxlbmd0aCA6IDAsXG5cdFx0XHRkc3RBcnJheSA9IG51bGw7XG5cblx0XHRpZiAoIG5QbGFuZXMgIT09IDAgKSB7XG5cblx0XHRcdGRzdEFycmF5ID0gdW5pZm9ybS52YWx1ZTtcblxuXHRcdFx0aWYgKCBza2lwVHJhbnNmb3JtICE9PSB0cnVlIHx8IGRzdEFycmF5ID09PSBudWxsICkge1xuXG5cdFx0XHRcdHZhciBmbGF0U2l6ZSA9IGRzdE9mZnNldCArIG5QbGFuZXMgKiA0LFxuXHRcdFx0XHRcdHZpZXdNYXRyaXggPSBjYW1lcmEubWF0cml4V29ybGRJbnZlcnNlO1xuXG5cdFx0XHRcdHZpZXdOb3JtYWxNYXRyaXguZ2V0Tm9ybWFsTWF0cml4KCB2aWV3TWF0cml4ICk7XG5cblx0XHRcdFx0aWYgKCBkc3RBcnJheSA9PT0gbnVsbCB8fCBkc3RBcnJheS5sZW5ndGggPCBmbGF0U2l6ZSApIHtcblxuXHRcdFx0XHRcdGRzdEFycmF5ID0gbmV3IEZsb2F0MzJBcnJheSggZmxhdFNpemUgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBpNCA9IGRzdE9mZnNldDtcblx0XHRcdFx0XHRcdFx0XHRcdGkgIT09IG5QbGFuZXM7ICsrIGksIGk0ICs9IDQgKSB7XG5cblx0XHRcdFx0XHRwbGFuZS5jb3B5KCBwbGFuZXNbIGkgXSApLlxuXHRcdFx0XHRcdFx0XHRhcHBseU1hdHJpeDQoIHZpZXdNYXRyaXgsIHZpZXdOb3JtYWxNYXRyaXggKTtcblxuXHRcdFx0XHRcdHBsYW5lLm5vcm1hbC50b0FycmF5KCBkc3RBcnJheSwgaTQgKTtcblx0XHRcdFx0XHRkc3RBcnJheVsgaTQgKyAzIF0gPSBwbGFuZS5jb25zdGFudDtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0dW5pZm9ybS52YWx1ZSA9IGRzdEFycmF5O1xuXHRcdFx0dW5pZm9ybS5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHR9XG5cblx0XHRzY29wZS5udW1QbGFuZXMgPSBuUGxhbmVzO1xuXHRcdFxuXHRcdHJldHVybiBkc3RBcnJheTtcblxuXHR9XG5cbn1cblxuLy8gaW1wb3J0IHsgU3BoZXJlIH0gZnJvbSAnLi4vbWF0aC9TcGhlcmUnO1xuLyoqXG4gKiBAYXV0aG9yIHN1cGVyZWdnYmVydCAvIGh0dHA6Ly93d3cucGF1bGJydW50LmNvLnVrL1xuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKiBAYXV0aG9yIHN6aW1layAvIGh0dHBzOi8vZ2l0aHViLmNvbS9zemltZWsvXG4gKiBAYXV0aG9yIHRzY2h3XG4gKi9cblxuZnVuY3Rpb24gV2ViR0xSZW5kZXJlciggcGFyYW1ldGVycyApIHtcblxuXHRjb25zb2xlLmxvZyggJ1RIUkVFLldlYkdMUmVuZGVyZXInLCBSRVZJU0lPTiApO1xuXG5cdHBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzIHx8IHt9O1xuXG5cdHZhciBfY2FudmFzID0gcGFyYW1ldGVycy5jYW52YXMgIT09IHVuZGVmaW5lZCA/IHBhcmFtZXRlcnMuY2FudmFzIDogZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCcsICdjYW52YXMnICksXG5cdFx0X2NvbnRleHQgPSBwYXJhbWV0ZXJzLmNvbnRleHQgIT09IHVuZGVmaW5lZCA/IHBhcmFtZXRlcnMuY29udGV4dCA6IG51bGwsXG5cblx0XHRfYWxwaGEgPSBwYXJhbWV0ZXJzLmFscGhhICE9PSB1bmRlZmluZWQgPyBwYXJhbWV0ZXJzLmFscGhhIDogZmFsc2UsXG5cdFx0X2RlcHRoID0gcGFyYW1ldGVycy5kZXB0aCAhPT0gdW5kZWZpbmVkID8gcGFyYW1ldGVycy5kZXB0aCA6IHRydWUsXG5cdFx0X3N0ZW5jaWwgPSBwYXJhbWV0ZXJzLnN0ZW5jaWwgIT09IHVuZGVmaW5lZCA/IHBhcmFtZXRlcnMuc3RlbmNpbCA6IHRydWUsXG5cdFx0X2FudGlhbGlhcyA9IHBhcmFtZXRlcnMuYW50aWFsaWFzICE9PSB1bmRlZmluZWQgPyBwYXJhbWV0ZXJzLmFudGlhbGlhcyA6IGZhbHNlLFxuXHRcdF9wcmVtdWx0aXBsaWVkQWxwaGEgPSBwYXJhbWV0ZXJzLnByZW11bHRpcGxpZWRBbHBoYSAhPT0gdW5kZWZpbmVkID8gcGFyYW1ldGVycy5wcmVtdWx0aXBsaWVkQWxwaGEgOiB0cnVlLFxuXHRcdF9wcmVzZXJ2ZURyYXdpbmdCdWZmZXIgPSBwYXJhbWV0ZXJzLnByZXNlcnZlRHJhd2luZ0J1ZmZlciAhPT0gdW5kZWZpbmVkID8gcGFyYW1ldGVycy5wcmVzZXJ2ZURyYXdpbmdCdWZmZXIgOiBmYWxzZTtcblxuXHR2YXIgbGlnaHRzID0gW107XG5cblx0dmFyIGN1cnJlbnRSZW5kZXJMaXN0ID0gbnVsbDtcblxuXHR2YXIgbW9ycGhJbmZsdWVuY2VzID0gbmV3IEZsb2F0MzJBcnJheSggOCApO1xuXG5cdHZhciBzcHJpdGVzID0gW107XG5cdHZhciBsZW5zRmxhcmVzID0gW107XG5cblx0Ly8gcHVibGljIHByb3BlcnRpZXNcblxuXHR0aGlzLmRvbUVsZW1lbnQgPSBfY2FudmFzO1xuXHR0aGlzLmNvbnRleHQgPSBudWxsO1xuXG5cdC8vIGNsZWFyaW5nXG5cblx0dGhpcy5hdXRvQ2xlYXIgPSB0cnVlO1xuXHR0aGlzLmF1dG9DbGVhckNvbG9yID0gdHJ1ZTtcblx0dGhpcy5hdXRvQ2xlYXJEZXB0aCA9IHRydWU7XG5cdHRoaXMuYXV0b0NsZWFyU3RlbmNpbCA9IHRydWU7XG5cblx0Ly8gc2NlbmUgZ3JhcGhcblxuXHR0aGlzLnNvcnRPYmplY3RzID0gdHJ1ZTtcblxuXHQvLyB1c2VyLWRlZmluZWQgY2xpcHBpbmdcblxuXHR0aGlzLmNsaXBwaW5nUGxhbmVzID0gW107XG5cdHRoaXMubG9jYWxDbGlwcGluZ0VuYWJsZWQgPSBmYWxzZTtcblxuXHQvLyBwaHlzaWNhbGx5IGJhc2VkIHNoYWRpbmdcblxuXHR0aGlzLmdhbW1hRmFjdG9yID0gMi4wO1x0Ly8gZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG5cdHRoaXMuZ2FtbWFJbnB1dCA9IGZhbHNlO1xuXHR0aGlzLmdhbW1hT3V0cHV0ID0gZmFsc2U7XG5cblx0Ly8gcGh5c2ljYWwgbGlnaHRzXG5cblx0dGhpcy5waHlzaWNhbGx5Q29ycmVjdExpZ2h0cyA9IGZhbHNlO1xuXG5cdC8vIHRvbmUgbWFwcGluZ1xuXG5cdHRoaXMudG9uZU1hcHBpbmcgPSBMaW5lYXJUb25lTWFwcGluZztcblx0dGhpcy50b25lTWFwcGluZ0V4cG9zdXJlID0gMS4wO1xuXHR0aGlzLnRvbmVNYXBwaW5nV2hpdGVQb2ludCA9IDEuMDtcblxuXHQvLyBtb3JwaHNcblxuXHR0aGlzLm1heE1vcnBoVGFyZ2V0cyA9IDg7XG5cdHRoaXMubWF4TW9ycGhOb3JtYWxzID0gNDtcblxuXHQvLyBpbnRlcm5hbCBwcm9wZXJ0aWVzXG5cblx0dmFyIF90aGlzID0gdGhpcyxcblxuXHRcdC8vIGludGVybmFsIHN0YXRlIGNhY2hlXG5cblx0XHRfY3VycmVudFByb2dyYW0gPSBudWxsLFxuXHRcdF9jdXJyZW50UmVuZGVyVGFyZ2V0ID0gbnVsbCxcblx0XHRfY3VycmVudEZyYW1lYnVmZmVyID0gbnVsbCxcblx0XHRfY3VycmVudE1hdGVyaWFsSWQgPSAtIDEsXG5cdFx0X2N1cnJlbnRHZW9tZXRyeVByb2dyYW0gPSAnJyxcblx0XHRfY3VycmVudENhbWVyYSA9IG51bGwsXG5cblx0XHRfY3VycmVudFNjaXNzb3IgPSBuZXcgVmVjdG9yNCgpLFxuXHRcdF9jdXJyZW50U2Npc3NvclRlc3QgPSBudWxsLFxuXG5cdFx0X2N1cnJlbnRWaWV3cG9ydCA9IG5ldyBWZWN0b3I0KCksXG5cblx0XHQvL1xuXG5cdFx0X3VzZWRUZXh0dXJlVW5pdHMgPSAwLFxuXG5cdFx0Ly9cblxuXHRcdF9jbGVhckNvbG9yID0gbmV3IENvbG9yKCAweDAwMDAwMCApLFxuXHRcdF9jbGVhckFscGhhID0gMCxcblxuXHRcdF93aWR0aCA9IF9jYW52YXMud2lkdGgsXG5cdFx0X2hlaWdodCA9IF9jYW52YXMuaGVpZ2h0LFxuXG5cdFx0X3BpeGVsUmF0aW8gPSAxLFxuXG5cdFx0X3NjaXNzb3IgPSBuZXcgVmVjdG9yNCggMCwgMCwgX3dpZHRoLCBfaGVpZ2h0ICksXG5cdFx0X3NjaXNzb3JUZXN0ID0gZmFsc2UsXG5cblx0XHRfdmlld3BvcnQgPSBuZXcgVmVjdG9yNCggMCwgMCwgX3dpZHRoLCBfaGVpZ2h0ICksXG5cblx0XHQvLyBmcnVzdHVtXG5cblx0XHRfZnJ1c3R1bSA9IG5ldyBGcnVzdHVtKCksXG5cblx0XHQvLyBjbGlwcGluZ1xuXG5cdFx0X2NsaXBwaW5nID0gbmV3IFdlYkdMQ2xpcHBpbmcoKSxcblx0XHRfY2xpcHBpbmdFbmFibGVkID0gZmFsc2UsXG5cdFx0X2xvY2FsQ2xpcHBpbmdFbmFibGVkID0gZmFsc2UsXG5cblx0XHQvLyBjYW1lcmEgbWF0cmljZXMgY2FjaGVcblxuXHRcdF9wcm9qU2NyZWVuTWF0cml4ID0gbmV3IE1hdHJpeDQoKSxcblxuXHRcdF92ZWN0b3IzID0gbmV3IFZlY3RvcjMoKSxcblx0XHRfbWF0cml4NCA9IG5ldyBNYXRyaXg0KCksXG5cdFx0X21hdHJpeDQyID0gbmV3IE1hdHJpeDQoKSxcblxuXHRcdC8vIGxpZ2h0IGFycmF5cyBjYWNoZVxuXG5cdFx0X2xpZ2h0cyA9IHtcblxuXHRcdFx0aGFzaDogJycsXG5cblx0XHRcdGFtYmllbnQ6IFsgMCwgMCwgMCBdLFxuXHRcdFx0ZGlyZWN0aW9uYWw6IFtdLFxuXHRcdFx0ZGlyZWN0aW9uYWxTaGFkb3dNYXA6IFtdLFxuXHRcdFx0ZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXg6IFtdLFxuXHRcdFx0c3BvdDogW10sXG5cdFx0XHRzcG90U2hhZG93TWFwOiBbXSxcblx0XHRcdHNwb3RTaGFkb3dNYXRyaXg6IFtdLFxuXHRcdFx0cmVjdEFyZWE6IFtdLFxuXHRcdFx0cG9pbnQ6IFtdLFxuXHRcdFx0cG9pbnRTaGFkb3dNYXA6IFtdLFxuXHRcdFx0cG9pbnRTaGFkb3dNYXRyaXg6IFtdLFxuXHRcdFx0aGVtaTogW10sXG5cblx0XHRcdHNoYWRvd3M6IFtdXG5cblx0XHR9LFxuXG5cdFx0Ly8gaW5mb1xuXG5cdFx0X2luZm9NZW1vcnkgPSB7XG5cdFx0XHRnZW9tZXRyaWVzOiAwLFxuXHRcdFx0dGV4dHVyZXM6IDBcblx0XHR9LFxuXG5cdFx0X2luZm9SZW5kZXIgPSB7XG5cblx0XHRcdGZyYW1lOiAwLFxuXHRcdFx0Y2FsbHM6IDAsXG5cdFx0XHR2ZXJ0aWNlczogMCxcblx0XHRcdGZhY2VzOiAwLFxuXHRcdFx0cG9pbnRzOiAwXG5cblx0XHR9O1xuXG5cdHRoaXMuaW5mbyA9IHtcblxuXHRcdHJlbmRlcjogX2luZm9SZW5kZXIsXG5cdFx0bWVtb3J5OiBfaW5mb01lbW9yeSxcblx0XHRwcm9ncmFtczogbnVsbFxuXG5cdH07XG5cblxuXHQvLyBpbml0aWFsaXplXG5cblx0dmFyIF9nbDtcblxuXHR0cnkge1xuXG5cdFx0dmFyIGNvbnRleHRBdHRyaWJ1dGVzID0ge1xuXHRcdFx0YWxwaGE6IF9hbHBoYSxcblx0XHRcdGRlcHRoOiBfZGVwdGgsXG5cdFx0XHRzdGVuY2lsOiBfc3RlbmNpbCxcblx0XHRcdGFudGlhbGlhczogX2FudGlhbGlhcyxcblx0XHRcdHByZW11bHRpcGxpZWRBbHBoYTogX3ByZW11bHRpcGxpZWRBbHBoYSxcblx0XHRcdHByZXNlcnZlRHJhd2luZ0J1ZmZlcjogX3ByZXNlcnZlRHJhd2luZ0J1ZmZlclxuXHRcdH07XG5cblx0XHRfZ2wgPSBfY29udGV4dCB8fCBfY2FudmFzLmdldENvbnRleHQoICd3ZWJnbCcsIGNvbnRleHRBdHRyaWJ1dGVzICkgfHwgX2NhbnZhcy5nZXRDb250ZXh0KCAnZXhwZXJpbWVudGFsLXdlYmdsJywgY29udGV4dEF0dHJpYnV0ZXMgKTtcblxuXHRcdGlmICggX2dsID09PSBudWxsICkge1xuXG5cdFx0XHRpZiAoIF9jYW52YXMuZ2V0Q29udGV4dCggJ3dlYmdsJyApICE9PSBudWxsICkge1xuXG5cdFx0XHRcdHRocm93ICdFcnJvciBjcmVhdGluZyBXZWJHTCBjb250ZXh0IHdpdGggeW91ciBzZWxlY3RlZCBhdHRyaWJ1dGVzLic7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0dGhyb3cgJ0Vycm9yIGNyZWF0aW5nIFdlYkdMIGNvbnRleHQuJztcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gU29tZSBleHBlcmltZW50YWwtd2ViZ2wgaW1wbGVtZW50YXRpb25zIGRvIG5vdCBoYXZlIGdldFNoYWRlclByZWNpc2lvbkZvcm1hdFxuXG5cdFx0aWYgKCBfZ2wuZ2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdF9nbC5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdFx0cmV0dXJuIHsgJ3JhbmdlTWluJzogMSwgJ3JhbmdlTWF4JzogMSwgJ3ByZWNpc2lvbic6IDEgfTtcblxuXHRcdFx0fTtcblxuXHRcdH1cblxuXHRcdF9jYW52YXMuYWRkRXZlbnRMaXN0ZW5lciggJ3dlYmdsY29udGV4dGxvc3QnLCBvbkNvbnRleHRMb3N0LCBmYWxzZSApO1xuXG5cdH0gY2F0Y2ggKCBlcnJvciApIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAnICsgZXJyb3IgKTtcblxuXHR9XG5cblx0dmFyIGV4dGVuc2lvbnMgPSBuZXcgV2ViR0xFeHRlbnNpb25zKCBfZ2wgKTtcblxuXHRleHRlbnNpb25zLmdldCggJ1dFQkdMX2RlcHRoX3RleHR1cmUnICk7XG5cdGV4dGVuc2lvbnMuZ2V0KCAnT0VTX3RleHR1cmVfZmxvYXQnICk7XG5cdGV4dGVuc2lvbnMuZ2V0KCAnT0VTX3RleHR1cmVfZmxvYXRfbGluZWFyJyApO1xuXHRleHRlbnNpb25zLmdldCggJ09FU190ZXh0dXJlX2hhbGZfZmxvYXQnICk7XG5cdGV4dGVuc2lvbnMuZ2V0KCAnT0VTX3RleHR1cmVfaGFsZl9mbG9hdF9saW5lYXInICk7XG5cdGV4dGVuc2lvbnMuZ2V0KCAnT0VTX3N0YW5kYXJkX2Rlcml2YXRpdmVzJyApO1xuXHRleHRlbnNpb25zLmdldCggJ0FOR0xFX2luc3RhbmNlZF9hcnJheXMnICk7XG5cblx0aWYgKCBleHRlbnNpb25zLmdldCggJ09FU19lbGVtZW50X2luZGV4X3VpbnQnICkgKSB7XG5cblx0XHRCdWZmZXJHZW9tZXRyeS5NYXhJbmRleCA9IDQyOTQ5NjcyOTY7XG5cblx0fVxuXG5cdHZhciBjYXBhYmlsaXRpZXMgPSBuZXcgV2ViR0xDYXBhYmlsaXRpZXMoIF9nbCwgZXh0ZW5zaW9ucywgcGFyYW1ldGVycyApO1xuXG5cdHZhciBzdGF0ZSA9IG5ldyBXZWJHTFN0YXRlKCBfZ2wsIGV4dGVuc2lvbnMsIHBhcmFtVGhyZWVUb0dMICk7XG5cblx0dmFyIHByb3BlcnRpZXMgPSBuZXcgV2ViR0xQcm9wZXJ0aWVzKCk7XG5cdHZhciB0ZXh0dXJlcyA9IG5ldyBXZWJHTFRleHR1cmVzKCBfZ2wsIGV4dGVuc2lvbnMsIHN0YXRlLCBwcm9wZXJ0aWVzLCBjYXBhYmlsaXRpZXMsIHBhcmFtVGhyZWVUb0dMLCBfaW5mb01lbW9yeSApO1xuXHR2YXIgYXR0cmlidXRlcyA9IG5ldyBXZWJHTEF0dHJpYnV0ZXMoIF9nbCApO1xuXHR2YXIgZ2VvbWV0cmllcyA9IG5ldyBXZWJHTEdlb21ldHJpZXMoIF9nbCwgYXR0cmlidXRlcywgX2luZm9NZW1vcnkgKTtcblx0dmFyIG9iamVjdHMgPSBuZXcgV2ViR0xPYmplY3RzKCBfZ2wsIGdlb21ldHJpZXMsIF9pbmZvUmVuZGVyICk7XG5cdHZhciBwcm9ncmFtQ2FjaGUgPSBuZXcgV2ViR0xQcm9ncmFtcyggdGhpcywgY2FwYWJpbGl0aWVzICk7XG5cdHZhciBsaWdodENhY2hlID0gbmV3IFdlYkdMTGlnaHRzKCk7XG5cdHZhciByZW5kZXJMaXN0cyA9IG5ldyBXZWJHTFJlbmRlckxpc3RzKCk7XG5cblx0dGhpcy5pbmZvLnByb2dyYW1zID0gcHJvZ3JhbUNhY2hlLnByb2dyYW1zO1xuXG5cdHZhciBidWZmZXJSZW5kZXJlciA9IG5ldyBXZWJHTEJ1ZmZlclJlbmRlcmVyKCBfZ2wsIGV4dGVuc2lvbnMsIF9pbmZvUmVuZGVyICk7XG5cdHZhciBpbmRleGVkQnVmZmVyUmVuZGVyZXIgPSBuZXcgV2ViR0xJbmRleGVkQnVmZmVyUmVuZGVyZXIoIF9nbCwgZXh0ZW5zaW9ucywgX2luZm9SZW5kZXIgKTtcblxuXHQvL1xuXG5cdHZhciBiYWNrZ3JvdW5kUGxhbmVDYW1lcmEsIGJhY2tncm91bmRQbGFuZU1lc2g7XG5cdHZhciBiYWNrZ3JvdW5kQm94Q2FtZXJhLCBiYWNrZ3JvdW5kQm94TWVzaDtcblxuXHQvL1xuXG5cdGZ1bmN0aW9uIGdldFRhcmdldFBpeGVsUmF0aW8oKSB7XG5cblx0XHRyZXR1cm4gX2N1cnJlbnRSZW5kZXJUYXJnZXQgPT09IG51bGwgPyBfcGl4ZWxSYXRpbyA6IDE7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHNldERlZmF1bHRHTFN0YXRlKCkge1xuXG5cdFx0c3RhdGUuaW5pdCgpO1xuXG5cdFx0c3RhdGUuc2Npc3NvciggX2N1cnJlbnRTY2lzc29yLmNvcHkoIF9zY2lzc29yICkubXVsdGlwbHlTY2FsYXIoIF9waXhlbFJhdGlvICkgKTtcblx0XHRzdGF0ZS52aWV3cG9ydCggX2N1cnJlbnRWaWV3cG9ydC5jb3B5KCBfdmlld3BvcnQgKS5tdWx0aXBseVNjYWxhciggX3BpeGVsUmF0aW8gKSApO1xuXG5cdFx0c3RhdGUuYnVmZmVycy5jb2xvci5zZXRDbGVhciggX2NsZWFyQ29sb3IuciwgX2NsZWFyQ29sb3IuZywgX2NsZWFyQ29sb3IuYiwgX2NsZWFyQWxwaGEsIF9wcmVtdWx0aXBsaWVkQWxwaGEgKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVzZXRHTFN0YXRlKCkge1xuXG5cdFx0X2N1cnJlbnRQcm9ncmFtID0gbnVsbDtcblx0XHRfY3VycmVudENhbWVyYSA9IG51bGw7XG5cblx0XHRfY3VycmVudEdlb21ldHJ5UHJvZ3JhbSA9ICcnO1xuXHRcdF9jdXJyZW50TWF0ZXJpYWxJZCA9IC0gMTtcblxuXHRcdHN0YXRlLnJlc2V0KCk7XG5cblx0fVxuXG5cdHNldERlZmF1bHRHTFN0YXRlKCk7XG5cblx0dGhpcy5jb250ZXh0ID0gX2dsO1xuXHR0aGlzLmNhcGFiaWxpdGllcyA9IGNhcGFiaWxpdGllcztcblx0dGhpcy5leHRlbnNpb25zID0gZXh0ZW5zaW9ucztcblx0dGhpcy5wcm9wZXJ0aWVzID0gcHJvcGVydGllcztcblx0dGhpcy5zdGF0ZSA9IHN0YXRlO1xuXG5cdC8vIHNoYWRvdyBtYXBcblxuXHR2YXIgc2hhZG93TWFwID0gbmV3IFdlYkdMU2hhZG93TWFwKCB0aGlzLCBfbGlnaHRzLCBvYmplY3RzLCBjYXBhYmlsaXRpZXMgKTtcblxuXHR0aGlzLnNoYWRvd01hcCA9IHNoYWRvd01hcDtcblxuXG5cdC8vIFBsdWdpbnNcblxuXHR2YXIgc3ByaXRlUGx1Z2luID0gbmV3IFNwcml0ZVBsdWdpbiggdGhpcywgc3ByaXRlcyApO1xuXHR2YXIgbGVuc0ZsYXJlUGx1Z2luID0gbmV3IExlbnNGbGFyZVBsdWdpbiggdGhpcywgbGVuc0ZsYXJlcyApO1xuXG5cdC8vIEFQSVxuXG5cdHRoaXMuZ2V0Q29udGV4dCA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBfZ2w7XG5cblx0fTtcblxuXHR0aGlzLmdldENvbnRleHRBdHRyaWJ1dGVzID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIF9nbC5nZXRDb250ZXh0QXR0cmlidXRlcygpO1xuXG5cdH07XG5cblx0dGhpcy5mb3JjZUNvbnRleHRMb3NzID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfbG9zZV9jb250ZXh0JyApO1xuXHRcdGlmICggZXh0ZW5zaW9uICkgZXh0ZW5zaW9uLmxvc2VDb250ZXh0KCk7XG5cblx0fTtcblxuXHR0aGlzLmdldE1heEFuaXNvdHJvcHkgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gY2FwYWJpbGl0aWVzLmdldE1heEFuaXNvdHJvcHkoKTtcblxuXHR9O1xuXG5cdHRoaXMuZ2V0UHJlY2lzaW9uID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIGNhcGFiaWxpdGllcy5wcmVjaXNpb247XG5cblx0fTtcblxuXHR0aGlzLmdldFBpeGVsUmF0aW8gPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gX3BpeGVsUmF0aW87XG5cblx0fTtcblxuXHR0aGlzLnNldFBpeGVsUmF0aW8gPSBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0aWYgKCB2YWx1ZSA9PT0gdW5kZWZpbmVkICkgcmV0dXJuO1xuXG5cdFx0X3BpeGVsUmF0aW8gPSB2YWx1ZTtcblxuXHRcdHRoaXMuc2V0U2l6ZSggX3ZpZXdwb3J0LnosIF92aWV3cG9ydC53LCBmYWxzZSApO1xuXG5cdH07XG5cblx0dGhpcy5nZXRTaXplID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHtcblx0XHRcdHdpZHRoOiBfd2lkdGgsXG5cdFx0XHRoZWlnaHQ6IF9oZWlnaHRcblx0XHR9O1xuXG5cdH07XG5cblx0dGhpcy5zZXRTaXplID0gZnVuY3Rpb24gKCB3aWR0aCwgaGVpZ2h0LCB1cGRhdGVTdHlsZSApIHtcblxuXHRcdF93aWR0aCA9IHdpZHRoO1xuXHRcdF9oZWlnaHQgPSBoZWlnaHQ7XG5cblx0XHRfY2FudmFzLndpZHRoID0gd2lkdGggKiBfcGl4ZWxSYXRpbztcblx0XHRfY2FudmFzLmhlaWdodCA9IGhlaWdodCAqIF9waXhlbFJhdGlvO1xuXG5cdFx0aWYgKCB1cGRhdGVTdHlsZSAhPT0gZmFsc2UgKSB7XG5cblx0XHRcdF9jYW52YXMuc3R5bGUud2lkdGggPSB3aWR0aCArICdweCc7XG5cdFx0XHRfY2FudmFzLnN0eWxlLmhlaWdodCA9IGhlaWdodCArICdweCc7XG5cblx0XHR9XG5cblx0XHR0aGlzLnNldFZpZXdwb3J0KCAwLCAwLCB3aWR0aCwgaGVpZ2h0ICk7XG5cblx0fTtcblxuXHR0aGlzLnNldFZpZXdwb3J0ID0gZnVuY3Rpb24gKCB4LCB5LCB3aWR0aCwgaGVpZ2h0ICkge1xuXG5cdFx0c3RhdGUudmlld3BvcnQoIF92aWV3cG9ydC5zZXQoIHgsIHksIHdpZHRoLCBoZWlnaHQgKSApO1xuXG5cdH07XG5cblx0dGhpcy5zZXRTY2lzc29yID0gZnVuY3Rpb24gKCB4LCB5LCB3aWR0aCwgaGVpZ2h0ICkge1xuXG5cdFx0c3RhdGUuc2Npc3NvciggX3NjaXNzb3Iuc2V0KCB4LCB5LCB3aWR0aCwgaGVpZ2h0ICkgKTtcblxuXHR9O1xuXG5cdHRoaXMuc2V0U2Npc3NvclRlc3QgPSBmdW5jdGlvbiAoIGJvb2xlYW4gKSB7XG5cblx0XHRzdGF0ZS5zZXRTY2lzc29yVGVzdCggX3NjaXNzb3JUZXN0ID0gYm9vbGVhbiApO1xuXG5cdH07XG5cblx0Ly8gQ2xlYXJpbmdcblxuXHR0aGlzLmdldENsZWFyQ29sb3IgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gX2NsZWFyQ29sb3I7XG5cblx0fTtcblxuXHR0aGlzLnNldENsZWFyQ29sb3IgPSBmdW5jdGlvbiAoIGNvbG9yLCBhbHBoYSApIHtcblxuXHRcdF9jbGVhckNvbG9yLnNldCggY29sb3IgKTtcblxuXHRcdF9jbGVhckFscGhhID0gYWxwaGEgIT09IHVuZGVmaW5lZCA/IGFscGhhIDogMTtcblxuXHRcdHN0YXRlLmJ1ZmZlcnMuY29sb3Iuc2V0Q2xlYXIoIF9jbGVhckNvbG9yLnIsIF9jbGVhckNvbG9yLmcsIF9jbGVhckNvbG9yLmIsIF9jbGVhckFscGhhLCBfcHJlbXVsdGlwbGllZEFscGhhICk7XG5cblx0fTtcblxuXHR0aGlzLmdldENsZWFyQWxwaGEgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gX2NsZWFyQWxwaGE7XG5cblx0fTtcblxuXHR0aGlzLnNldENsZWFyQWxwaGEgPSBmdW5jdGlvbiAoIGFscGhhICkge1xuXG5cdFx0X2NsZWFyQWxwaGEgPSBhbHBoYTtcblxuXHRcdHN0YXRlLmJ1ZmZlcnMuY29sb3Iuc2V0Q2xlYXIoIF9jbGVhckNvbG9yLnIsIF9jbGVhckNvbG9yLmcsIF9jbGVhckNvbG9yLmIsIF9jbGVhckFscGhhLCBfcHJlbXVsdGlwbGllZEFscGhhICk7XG5cblx0fTtcblxuXHR0aGlzLmNsZWFyID0gZnVuY3Rpb24gKCBjb2xvciwgZGVwdGgsIHN0ZW5jaWwgKSB7XG5cblx0XHR2YXIgYml0cyA9IDA7XG5cblx0XHRpZiAoIGNvbG9yID09PSB1bmRlZmluZWQgfHwgY29sb3IgKSBiaXRzIHw9IF9nbC5DT0xPUl9CVUZGRVJfQklUO1xuXHRcdGlmICggZGVwdGggPT09IHVuZGVmaW5lZCB8fCBkZXB0aCApIGJpdHMgfD0gX2dsLkRFUFRIX0JVRkZFUl9CSVQ7XG5cdFx0aWYgKCBzdGVuY2lsID09PSB1bmRlZmluZWQgfHwgc3RlbmNpbCApIGJpdHMgfD0gX2dsLlNURU5DSUxfQlVGRkVSX0JJVDtcblxuXHRcdF9nbC5jbGVhciggYml0cyApO1xuXG5cdH07XG5cblx0dGhpcy5jbGVhckNvbG9yID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5jbGVhciggdHJ1ZSwgZmFsc2UsIGZhbHNlICk7XG5cblx0fTtcblxuXHR0aGlzLmNsZWFyRGVwdGggPSBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLmNsZWFyKCBmYWxzZSwgdHJ1ZSwgZmFsc2UgKTtcblxuXHR9O1xuXG5cdHRoaXMuY2xlYXJTdGVuY2lsID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5jbGVhciggZmFsc2UsIGZhbHNlLCB0cnVlICk7XG5cblx0fTtcblxuXHR0aGlzLmNsZWFyVGFyZ2V0ID0gZnVuY3Rpb24gKCByZW5kZXJUYXJnZXQsIGNvbG9yLCBkZXB0aCwgc3RlbmNpbCApIHtcblxuXHRcdHRoaXMuc2V0UmVuZGVyVGFyZ2V0KCByZW5kZXJUYXJnZXQgKTtcblx0XHR0aGlzLmNsZWFyKCBjb2xvciwgZGVwdGgsIHN0ZW5jaWwgKTtcblxuXHR9O1xuXG5cdC8vIFJlc2V0XG5cblx0dGhpcy5yZXNldEdMU3RhdGUgPSByZXNldEdMU3RhdGU7XG5cblx0dGhpcy5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0X2NhbnZhcy5yZW1vdmVFdmVudExpc3RlbmVyKCAnd2ViZ2xjb250ZXh0bG9zdCcsIG9uQ29udGV4dExvc3QsIGZhbHNlICk7XG5cblx0XHRyZW5kZXJMaXN0cy5kaXNwb3NlKCk7XG5cblx0fTtcblxuXHQvLyBFdmVudHNcblxuXHRmdW5jdGlvbiBvbkNvbnRleHRMb3N0KCBldmVudCApIHtcblxuXHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cblx0XHRyZXNldEdMU3RhdGUoKTtcblx0XHRzZXREZWZhdWx0R0xTdGF0ZSgpO1xuXG5cdFx0cHJvcGVydGllcy5jbGVhcigpO1xuXHRcdG9iamVjdHMuY2xlYXIoKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gb25NYXRlcmlhbERpc3Bvc2UoIGV2ZW50ICkge1xuXG5cdFx0dmFyIG1hdGVyaWFsID0gZXZlbnQudGFyZ2V0O1xuXG5cdFx0bWF0ZXJpYWwucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ2Rpc3Bvc2UnLCBvbk1hdGVyaWFsRGlzcG9zZSApO1xuXG5cdFx0ZGVhbGxvY2F0ZU1hdGVyaWFsKCBtYXRlcmlhbCApO1xuXG5cdH1cblxuXHQvLyBCdWZmZXIgZGVhbGxvY2F0aW9uXG5cblx0ZnVuY3Rpb24gZGVhbGxvY2F0ZU1hdGVyaWFsKCBtYXRlcmlhbCApIHtcblxuXHRcdHJlbGVhc2VNYXRlcmlhbFByb2dyYW1SZWZlcmVuY2UoIG1hdGVyaWFsICk7XG5cblx0XHRwcm9wZXJ0aWVzLnJlbW92ZSggbWF0ZXJpYWwgKTtcblxuXHR9XG5cblxuXHRmdW5jdGlvbiByZWxlYXNlTWF0ZXJpYWxQcm9ncmFtUmVmZXJlbmNlKCBtYXRlcmlhbCApIHtcblxuXHRcdHZhciBwcm9ncmFtSW5mbyA9IHByb3BlcnRpZXMuZ2V0KCBtYXRlcmlhbCApLnByb2dyYW07XG5cblx0XHRtYXRlcmlhbC5wcm9ncmFtID0gdW5kZWZpbmVkO1xuXG5cdFx0aWYgKCBwcm9ncmFtSW5mbyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRwcm9ncmFtQ2FjaGUucmVsZWFzZVByb2dyYW0oIHByb2dyYW1JbmZvICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIEJ1ZmZlciByZW5kZXJpbmdcblxuXHRmdW5jdGlvbiByZW5kZXJPYmplY3RJbW1lZGlhdGUoIG9iamVjdCwgcHJvZ3JhbSwgbWF0ZXJpYWwgKSB7XG5cblx0XHRvYmplY3QucmVuZGVyKCBmdW5jdGlvbiAoIG9iamVjdCApIHtcblxuXHRcdFx0X3RoaXMucmVuZGVyQnVmZmVySW1tZWRpYXRlKCBvYmplY3QsIHByb2dyYW0sIG1hdGVyaWFsICk7XG5cblx0XHR9ICk7XG5cblx0fVxuXG5cdHRoaXMucmVuZGVyQnVmZmVySW1tZWRpYXRlID0gZnVuY3Rpb24gKCBvYmplY3QsIHByb2dyYW0sIG1hdGVyaWFsICkge1xuXG5cdFx0c3RhdGUuaW5pdEF0dHJpYnV0ZXMoKTtcblxuXHRcdHZhciBidWZmZXJzID0gcHJvcGVydGllcy5nZXQoIG9iamVjdCApO1xuXG5cdFx0aWYgKCBvYmplY3QuaGFzUG9zaXRpb25zICYmICEgYnVmZmVycy5wb3NpdGlvbiApIGJ1ZmZlcnMucG9zaXRpb24gPSBfZ2wuY3JlYXRlQnVmZmVyKCk7XG5cdFx0aWYgKCBvYmplY3QuaGFzTm9ybWFscyAmJiAhIGJ1ZmZlcnMubm9ybWFsICkgYnVmZmVycy5ub3JtYWwgPSBfZ2wuY3JlYXRlQnVmZmVyKCk7XG5cdFx0aWYgKCBvYmplY3QuaGFzVXZzICYmICEgYnVmZmVycy51diApIGJ1ZmZlcnMudXYgPSBfZ2wuY3JlYXRlQnVmZmVyKCk7XG5cdFx0aWYgKCBvYmplY3QuaGFzQ29sb3JzICYmICEgYnVmZmVycy5jb2xvciApIGJ1ZmZlcnMuY29sb3IgPSBfZ2wuY3JlYXRlQnVmZmVyKCk7XG5cblx0XHR2YXIgcHJvZ3JhbUF0dHJpYnV0ZXMgPSBwcm9ncmFtLmdldEF0dHJpYnV0ZXMoKTtcblxuXHRcdGlmICggb2JqZWN0Lmhhc1Bvc2l0aW9ucyApIHtcblxuXHRcdFx0X2dsLmJpbmRCdWZmZXIoIF9nbC5BUlJBWV9CVUZGRVIsIGJ1ZmZlcnMucG9zaXRpb24gKTtcblx0XHRcdF9nbC5idWZmZXJEYXRhKCBfZ2wuQVJSQVlfQlVGRkVSLCBvYmplY3QucG9zaXRpb25BcnJheSwgX2dsLkRZTkFNSUNfRFJBVyApO1xuXG5cdFx0XHRzdGF0ZS5lbmFibGVBdHRyaWJ1dGUoIHByb2dyYW1BdHRyaWJ1dGVzLnBvc2l0aW9uICk7XG5cdFx0XHRfZ2wudmVydGV4QXR0cmliUG9pbnRlciggcHJvZ3JhbUF0dHJpYnV0ZXMucG9zaXRpb24sIDMsIF9nbC5GTE9BVCwgZmFsc2UsIDAsIDAgKTtcblxuXHRcdH1cblxuXHRcdGlmICggb2JqZWN0Lmhhc05vcm1hbHMgKSB7XG5cblx0XHRcdF9nbC5iaW5kQnVmZmVyKCBfZ2wuQVJSQVlfQlVGRkVSLCBidWZmZXJzLm5vcm1hbCApO1xuXG5cdFx0XHRpZiAoICEgbWF0ZXJpYWwuaXNNZXNoUGhvbmdNYXRlcmlhbCAmJlxuXHRcdFx0XHQhIG1hdGVyaWFsLmlzTWVzaFN0YW5kYXJkTWF0ZXJpYWwgJiZcblx0XHRcdFx0ISBtYXRlcmlhbC5pc01lc2hOb3JtYWxNYXRlcmlhbCAmJlxuXHRcdFx0XHRtYXRlcmlhbC5zaGFkaW5nID09PSBGbGF0U2hhZGluZyApIHtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBvYmplY3QuY291bnQgKiAzOyBpIDwgbDsgaSArPSA5ICkge1xuXG5cdFx0XHRcdFx0dmFyIGFycmF5ID0gb2JqZWN0Lm5vcm1hbEFycmF5O1xuXG5cdFx0XHRcdFx0dmFyIG54ID0gKCBhcnJheVsgaSArIDAgXSArIGFycmF5WyBpICsgMyBdICsgYXJyYXlbIGkgKyA2IF0gKSAvIDM7XG5cdFx0XHRcdFx0dmFyIG55ID0gKCBhcnJheVsgaSArIDEgXSArIGFycmF5WyBpICsgNCBdICsgYXJyYXlbIGkgKyA3IF0gKSAvIDM7XG5cdFx0XHRcdFx0dmFyIG56ID0gKCBhcnJheVsgaSArIDIgXSArIGFycmF5WyBpICsgNSBdICsgYXJyYXlbIGkgKyA4IF0gKSAvIDM7XG5cblx0XHRcdFx0XHRhcnJheVsgaSArIDAgXSA9IG54O1xuXHRcdFx0XHRcdGFycmF5WyBpICsgMSBdID0gbnk7XG5cdFx0XHRcdFx0YXJyYXlbIGkgKyAyIF0gPSBuejtcblxuXHRcdFx0XHRcdGFycmF5WyBpICsgMyBdID0gbng7XG5cdFx0XHRcdFx0YXJyYXlbIGkgKyA0IF0gPSBueTtcblx0XHRcdFx0XHRhcnJheVsgaSArIDUgXSA9IG56O1xuXG5cdFx0XHRcdFx0YXJyYXlbIGkgKyA2IF0gPSBueDtcblx0XHRcdFx0XHRhcnJheVsgaSArIDcgXSA9IG55O1xuXHRcdFx0XHRcdGFycmF5WyBpICsgOCBdID0gbno7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdF9nbC5idWZmZXJEYXRhKCBfZ2wuQVJSQVlfQlVGRkVSLCBvYmplY3Qubm9ybWFsQXJyYXksIF9nbC5EWU5BTUlDX0RSQVcgKTtcblxuXHRcdFx0c3RhdGUuZW5hYmxlQXR0cmlidXRlKCBwcm9ncmFtQXR0cmlidXRlcy5ub3JtYWwgKTtcblxuXHRcdFx0X2dsLnZlcnRleEF0dHJpYlBvaW50ZXIoIHByb2dyYW1BdHRyaWJ1dGVzLm5vcm1hbCwgMywgX2dsLkZMT0FULCBmYWxzZSwgMCwgMCApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBvYmplY3QuaGFzVXZzICYmIG1hdGVyaWFsLm1hcCApIHtcblxuXHRcdFx0X2dsLmJpbmRCdWZmZXIoIF9nbC5BUlJBWV9CVUZGRVIsIGJ1ZmZlcnMudXYgKTtcblx0XHRcdF9nbC5idWZmZXJEYXRhKCBfZ2wuQVJSQVlfQlVGRkVSLCBvYmplY3QudXZBcnJheSwgX2dsLkRZTkFNSUNfRFJBVyApO1xuXG5cdFx0XHRzdGF0ZS5lbmFibGVBdHRyaWJ1dGUoIHByb2dyYW1BdHRyaWJ1dGVzLnV2ICk7XG5cblx0XHRcdF9nbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKCBhdHRyaWJ1dGVzLnV2LCAyLCBfZ2wuRkxPQVQsIGZhbHNlLCAwLCAwICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIG9iamVjdC5oYXNDb2xvcnMgJiYgbWF0ZXJpYWwudmVydGV4Q29sb3JzICE9PSBOb0NvbG9ycyApIHtcblxuXHRcdFx0X2dsLmJpbmRCdWZmZXIoIF9nbC5BUlJBWV9CVUZGRVIsIGJ1ZmZlcnMuY29sb3IgKTtcblx0XHRcdF9nbC5idWZmZXJEYXRhKCBfZ2wuQVJSQVlfQlVGRkVSLCBvYmplY3QuY29sb3JBcnJheSwgX2dsLkRZTkFNSUNfRFJBVyApO1xuXG5cdFx0XHRzdGF0ZS5lbmFibGVBdHRyaWJ1dGUoIHByb2dyYW1BdHRyaWJ1dGVzLmNvbG9yICk7XG5cblx0XHRcdF9nbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKCBwcm9ncmFtQXR0cmlidXRlcy5jb2xvciwgMywgX2dsLkZMT0FULCBmYWxzZSwgMCwgMCApO1xuXG5cdFx0fVxuXG5cdFx0c3RhdGUuZGlzYWJsZVVudXNlZEF0dHJpYnV0ZXMoKTtcblxuXHRcdF9nbC5kcmF3QXJyYXlzKCBfZ2wuVFJJQU5HTEVTLCAwLCBvYmplY3QuY291bnQgKTtcblxuXHRcdG9iamVjdC5jb3VudCA9IDA7XG5cblx0fTtcblxuXHRmdW5jdGlvbiBhYnNOdW1lcmljYWxTb3J0KCBhLCBiICkge1xuXG5cdFx0cmV0dXJuIE1hdGguYWJzKCBiWyAwIF0gKSAtIE1hdGguYWJzKCBhWyAwIF0gKTtcblxuXHR9XG5cblx0dGhpcy5yZW5kZXJCdWZmZXJEaXJlY3QgPSBmdW5jdGlvbiAoIGNhbWVyYSwgZm9nLCBnZW9tZXRyeSwgbWF0ZXJpYWwsIG9iamVjdCwgZ3JvdXAgKSB7XG5cblx0XHRzdGF0ZS5zZXRNYXRlcmlhbCggbWF0ZXJpYWwgKTtcblxuXHRcdHZhciBwcm9ncmFtID0gc2V0UHJvZ3JhbSggY2FtZXJhLCBmb2csIG1hdGVyaWFsLCBvYmplY3QgKTtcblx0XHR2YXIgZ2VvbWV0cnlQcm9ncmFtID0gZ2VvbWV0cnkuaWQgKyAnXycgKyBwcm9ncmFtLmlkICsgJ18nICsgKCBtYXRlcmlhbC53aXJlZnJhbWUgPT09IHRydWUgKTtcblxuXHRcdHZhciB1cGRhdGVCdWZmZXJzID0gZmFsc2U7XG5cblx0XHRpZiAoIGdlb21ldHJ5UHJvZ3JhbSAhPT0gX2N1cnJlbnRHZW9tZXRyeVByb2dyYW0gKSB7XG5cblx0XHRcdF9jdXJyZW50R2VvbWV0cnlQcm9ncmFtID0gZ2VvbWV0cnlQcm9ncmFtO1xuXHRcdFx0dXBkYXRlQnVmZmVycyA9IHRydWU7XG5cblx0XHR9XG5cblx0XHQvLyBtb3JwaCB0YXJnZXRzXG5cblx0XHR2YXIgbW9ycGhUYXJnZXRJbmZsdWVuY2VzID0gb2JqZWN0Lm1vcnBoVGFyZ2V0SW5mbHVlbmNlcztcblxuXHRcdGlmICggbW9ycGhUYXJnZXRJbmZsdWVuY2VzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdC8vIFRPRE8gUmVtb3ZlIGFsbG9jYXRpb25zXG5cblx0XHRcdHZhciBhY3RpdmVJbmZsdWVuY2VzID0gW107XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IG1vcnBoVGFyZ2V0SW5mbHVlbmNlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdHZhciBpbmZsdWVuY2UgPSBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIGkgXTtcblx0XHRcdFx0YWN0aXZlSW5mbHVlbmNlcy5wdXNoKCBbIGluZmx1ZW5jZSwgaSBdICk7XG5cblx0XHRcdH1cblxuXHRcdFx0YWN0aXZlSW5mbHVlbmNlcy5zb3J0KCBhYnNOdW1lcmljYWxTb3J0ICk7XG5cblx0XHRcdGlmICggYWN0aXZlSW5mbHVlbmNlcy5sZW5ndGggPiA4ICkge1xuXG5cdFx0XHRcdGFjdGl2ZUluZmx1ZW5jZXMubGVuZ3RoID0gODtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgbW9ycGhBdHRyaWJ1dGVzID0gZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBhY3RpdmVJbmZsdWVuY2VzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0dmFyIGluZmx1ZW5jZSA9IGFjdGl2ZUluZmx1ZW5jZXNbIGkgXTtcblx0XHRcdFx0bW9ycGhJbmZsdWVuY2VzWyBpIF0gPSBpbmZsdWVuY2VbIDAgXTtcblxuXHRcdFx0XHRpZiAoIGluZmx1ZW5jZVsgMCBdICE9PSAwICkge1xuXG5cdFx0XHRcdFx0dmFyIGluZGV4ID0gaW5mbHVlbmNlWyAxIF07XG5cblx0XHRcdFx0XHRpZiAoIG1hdGVyaWFsLm1vcnBoVGFyZ2V0cyA9PT0gdHJ1ZSAmJiBtb3JwaEF0dHJpYnV0ZXMucG9zaXRpb24gKSBnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdtb3JwaFRhcmdldCcgKyBpLCBtb3JwaEF0dHJpYnV0ZXMucG9zaXRpb25bIGluZGV4IF0gKTtcblx0XHRcdFx0XHRpZiAoIG1hdGVyaWFsLm1vcnBoTm9ybWFscyA9PT0gdHJ1ZSAmJiBtb3JwaEF0dHJpYnV0ZXMubm9ybWFsICkgZ2VvbWV0cnkuYWRkQXR0cmlidXRlKCAnbW9ycGhOb3JtYWwnICsgaSwgbW9ycGhBdHRyaWJ1dGVzLm5vcm1hbFsgaW5kZXggXSApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRpZiAoIG1hdGVyaWFsLm1vcnBoVGFyZ2V0cyA9PT0gdHJ1ZSApIGdlb21ldHJ5LnJlbW92ZUF0dHJpYnV0ZSggJ21vcnBoVGFyZ2V0JyArIGkgKTtcblx0XHRcdFx0XHRpZiAoIG1hdGVyaWFsLm1vcnBoTm9ybWFscyA9PT0gdHJ1ZSApIGdlb21ldHJ5LnJlbW92ZUF0dHJpYnV0ZSggJ21vcnBoTm9ybWFsJyArIGkgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0Zm9yICggdmFyIGkgPSBhY3RpdmVJbmZsdWVuY2VzLmxlbmd0aCwgaWwgPSBtb3JwaEluZmx1ZW5jZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdFx0bW9ycGhJbmZsdWVuY2VzWyBpIF0gPSAwLjA7XG5cblx0XHRcdH1cblxuXHRcdFx0cHJvZ3JhbS5nZXRVbmlmb3JtcygpLnNldFZhbHVlKCBfZ2wsICdtb3JwaFRhcmdldEluZmx1ZW5jZXMnLCBtb3JwaEluZmx1ZW5jZXMgKTtcblxuXHRcdFx0dXBkYXRlQnVmZmVycyA9IHRydWU7XG5cblx0XHR9XG5cblx0XHQvL1xuXG5cdFx0dmFyIGluZGV4ID0gZ2VvbWV0cnkuaW5kZXg7XG5cdFx0dmFyIHBvc2l0aW9uID0gZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbjtcblx0XHR2YXIgcmFuZ2VGYWN0b3IgPSAxO1xuXG5cdFx0aWYgKCBtYXRlcmlhbC53aXJlZnJhbWUgPT09IHRydWUgKSB7XG5cblx0XHRcdGluZGV4ID0gZ2VvbWV0cmllcy5nZXRXaXJlZnJhbWVBdHRyaWJ1dGUoIGdlb21ldHJ5ICk7XG5cdFx0XHRyYW5nZUZhY3RvciA9IDI7XG5cblx0XHR9XG5cblx0XHR2YXIgcmVuZGVyZXIgPSBidWZmZXJSZW5kZXJlcjtcblxuXHRcdGlmICggaW5kZXggIT09IG51bGwgKSB7XG5cblx0XHRcdHJlbmRlcmVyID0gaW5kZXhlZEJ1ZmZlclJlbmRlcmVyO1xuXHRcdFx0cmVuZGVyZXIuc2V0SW5kZXgoIGluZGV4ICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIHVwZGF0ZUJ1ZmZlcnMgKSB7XG5cblx0XHRcdHNldHVwVmVydGV4QXR0cmlidXRlcyggbWF0ZXJpYWwsIHByb2dyYW0sIGdlb21ldHJ5ICk7XG5cblx0XHRcdGlmICggaW5kZXggIT09IG51bGwgKSB7XG5cblx0XHRcdFx0X2dsLmJpbmRCdWZmZXIoIF9nbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgYXR0cmlidXRlcy5nZXQoIGluZGV4ICkuYnVmZmVyICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vXG5cblx0XHR2YXIgZGF0YUNvdW50ID0gMDtcblxuXHRcdGlmICggaW5kZXggIT09IG51bGwgKSB7XG5cblx0XHRcdGRhdGFDb3VudCA9IGluZGV4LmNvdW50O1xuXG5cdFx0fSBlbHNlIGlmICggcG9zaXRpb24gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0ZGF0YUNvdW50ID0gcG9zaXRpb24uY291bnQ7XG5cblx0XHR9XG5cblx0XHR2YXIgcmFuZ2VTdGFydCA9IGdlb21ldHJ5LmRyYXdSYW5nZS5zdGFydCAqIHJhbmdlRmFjdG9yO1xuXHRcdHZhciByYW5nZUNvdW50ID0gZ2VvbWV0cnkuZHJhd1JhbmdlLmNvdW50ICogcmFuZ2VGYWN0b3I7XG5cblx0XHR2YXIgZ3JvdXBTdGFydCA9IGdyb3VwICE9PSBudWxsID8gZ3JvdXAuc3RhcnQgKiByYW5nZUZhY3RvciA6IDA7XG5cdFx0dmFyIGdyb3VwQ291bnQgPSBncm91cCAhPT0gbnVsbCA/IGdyb3VwLmNvdW50ICogcmFuZ2VGYWN0b3IgOiBJbmZpbml0eTtcblxuXHRcdHZhciBkcmF3U3RhcnQgPSBNYXRoLm1heCggcmFuZ2VTdGFydCwgZ3JvdXBTdGFydCApO1xuXHRcdHZhciBkcmF3RW5kID0gTWF0aC5taW4oIGRhdGFDb3VudCwgcmFuZ2VTdGFydCArIHJhbmdlQ291bnQsIGdyb3VwU3RhcnQgKyBncm91cENvdW50ICkgLSAxO1xuXG5cdFx0dmFyIGRyYXdDb3VudCA9IE1hdGgubWF4KCAwLCBkcmF3RW5kIC0gZHJhd1N0YXJ0ICsgMSApO1xuXG5cdFx0aWYgKCBkcmF3Q291bnQgPT09IDAgKSByZXR1cm47XG5cblx0XHQvL1xuXG5cdFx0aWYgKCBvYmplY3QuaXNNZXNoICkge1xuXG5cdFx0XHRpZiAoIG1hdGVyaWFsLndpcmVmcmFtZSA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0XHRzdGF0ZS5zZXRMaW5lV2lkdGgoIG1hdGVyaWFsLndpcmVmcmFtZUxpbmV3aWR0aCAqIGdldFRhcmdldFBpeGVsUmF0aW8oKSApO1xuXHRcdFx0XHRyZW5kZXJlci5zZXRNb2RlKCBfZ2wuTElORVMgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRzd2l0Y2ggKCBvYmplY3QuZHJhd01vZGUgKSB7XG5cblx0XHRcdFx0XHRjYXNlIFRyaWFuZ2xlc0RyYXdNb2RlOlxuXHRcdFx0XHRcdFx0cmVuZGVyZXIuc2V0TW9kZSggX2dsLlRSSUFOR0xFUyApO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlIFRyaWFuZ2xlU3RyaXBEcmF3TW9kZTpcblx0XHRcdFx0XHRcdHJlbmRlcmVyLnNldE1vZGUoIF9nbC5UUklBTkdMRV9TVFJJUCApO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlIFRyaWFuZ2xlRmFuRHJhd01vZGU6XG5cdFx0XHRcdFx0XHRyZW5kZXJlci5zZXRNb2RlKCBfZ2wuVFJJQU5HTEVfRkFOICk7XG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXG5cdFx0fSBlbHNlIGlmICggb2JqZWN0LmlzTGluZSApIHtcblxuXHRcdFx0dmFyIGxpbmVXaWR0aCA9IG1hdGVyaWFsLmxpbmV3aWR0aDtcblxuXHRcdFx0aWYgKCBsaW5lV2lkdGggPT09IHVuZGVmaW5lZCApIGxpbmVXaWR0aCA9IDE7IC8vIE5vdCB1c2luZyBMaW5lKk1hdGVyaWFsXG5cblx0XHRcdHN0YXRlLnNldExpbmVXaWR0aCggbGluZVdpZHRoICogZ2V0VGFyZ2V0UGl4ZWxSYXRpbygpICk7XG5cblx0XHRcdGlmICggb2JqZWN0LmlzTGluZVNlZ21lbnRzICkge1xuXG5cdFx0XHRcdHJlbmRlcmVyLnNldE1vZGUoIF9nbC5MSU5FUyApO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBvYmplY3QuaXNMaW5lTG9vcCApIHtcblxuXHRcdFx0XHRyZW5kZXJlci5zZXRNb2RlKCBfZ2wuTElORV9MT09QICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0cmVuZGVyZXIuc2V0TW9kZSggX2dsLkxJTkVfU1RSSVAgKTtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIGlmICggb2JqZWN0LmlzUG9pbnRzICkge1xuXG5cdFx0XHRyZW5kZXJlci5zZXRNb2RlKCBfZ2wuUE9JTlRTICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIGdlb21ldHJ5ICYmIGdlb21ldHJ5LmlzSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkgKSB7XG5cblx0XHRcdGlmICggZ2VvbWV0cnkubWF4SW5zdGFuY2VkQ291bnQgPiAwICkge1xuXG5cdFx0XHRcdHJlbmRlcmVyLnJlbmRlckluc3RhbmNlcyggZ2VvbWV0cnksIGRyYXdTdGFydCwgZHJhd0NvdW50ICk7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHJlbmRlcmVyLnJlbmRlciggZHJhd1N0YXJ0LCBkcmF3Q291bnQgKTtcblxuXHRcdH1cblxuXHR9O1xuXG5cdGZ1bmN0aW9uIHNldHVwVmVydGV4QXR0cmlidXRlcyggbWF0ZXJpYWwsIHByb2dyYW0sIGdlb21ldHJ5LCBzdGFydEluZGV4ICkge1xuXG5cdFx0aWYgKCBnZW9tZXRyeSAmJiBnZW9tZXRyeS5pc0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5ICkge1xuXG5cdFx0XHRpZiAoIGV4dGVuc2lvbnMuZ2V0KCAnQU5HTEVfaW5zdGFuY2VkX2FycmF5cycgKSA9PT0gbnVsbCApIHtcblxuXHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuV2ViR0xSZW5kZXJlci5zZXR1cFZlcnRleEF0dHJpYnV0ZXM6IHVzaW5nIFRIUkVFLkluc3RhbmNlZEJ1ZmZlckdlb21ldHJ5IGJ1dCBoYXJkd2FyZSBkb2VzIG5vdCBzdXBwb3J0IGV4dGVuc2lvbiBBTkdMRV9pbnN0YW5jZWRfYXJyYXlzLicgKTtcblx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIHN0YXJ0SW5kZXggPT09IHVuZGVmaW5lZCApIHN0YXJ0SW5kZXggPSAwO1xuXG5cdFx0c3RhdGUuaW5pdEF0dHJpYnV0ZXMoKTtcblxuXHRcdHZhciBnZW9tZXRyeUF0dHJpYnV0ZXMgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzO1xuXG5cdFx0dmFyIHByb2dyYW1BdHRyaWJ1dGVzID0gcHJvZ3JhbS5nZXRBdHRyaWJ1dGVzKCk7XG5cblx0XHR2YXIgbWF0ZXJpYWxEZWZhdWx0QXR0cmlidXRlVmFsdWVzID0gbWF0ZXJpYWwuZGVmYXVsdEF0dHJpYnV0ZVZhbHVlcztcblxuXHRcdGZvciAoIHZhciBuYW1lIGluIHByb2dyYW1BdHRyaWJ1dGVzICkge1xuXG5cdFx0XHR2YXIgcHJvZ3JhbUF0dHJpYnV0ZSA9IHByb2dyYW1BdHRyaWJ1dGVzWyBuYW1lIF07XG5cblx0XHRcdGlmICggcHJvZ3JhbUF0dHJpYnV0ZSA+PSAwICkge1xuXG5cdFx0XHRcdHZhciBnZW9tZXRyeUF0dHJpYnV0ZSA9IGdlb21ldHJ5QXR0cmlidXRlc1sgbmFtZSBdO1xuXG5cdFx0XHRcdGlmICggZ2VvbWV0cnlBdHRyaWJ1dGUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdHZhciBub3JtYWxpemVkID0gZ2VvbWV0cnlBdHRyaWJ1dGUubm9ybWFsaXplZDtcblx0XHRcdFx0XHR2YXIgc2l6ZSA9IGdlb21ldHJ5QXR0cmlidXRlLml0ZW1TaXplO1xuXG5cdFx0XHRcdFx0dmFyIGF0dHJpYnV0ZVByb3BlcnRpZXMgPSBhdHRyaWJ1dGVzLmdldCggZ2VvbWV0cnlBdHRyaWJ1dGUgKTtcblxuXHRcdFx0XHRcdHZhciBidWZmZXIgPSBhdHRyaWJ1dGVQcm9wZXJ0aWVzLmJ1ZmZlcjtcblx0XHRcdFx0XHR2YXIgdHlwZSA9IGF0dHJpYnV0ZVByb3BlcnRpZXMudHlwZTtcblx0XHRcdFx0XHR2YXIgYnl0ZXNQZXJFbGVtZW50ID0gYXR0cmlidXRlUHJvcGVydGllcy5ieXRlc1BlckVsZW1lbnQ7XG5cblx0XHRcdFx0XHRpZiAoIGdlb21ldHJ5QXR0cmlidXRlLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUgKSB7XG5cblx0XHRcdFx0XHRcdHZhciBkYXRhID0gZ2VvbWV0cnlBdHRyaWJ1dGUuZGF0YTtcblx0XHRcdFx0XHRcdHZhciBzdHJpZGUgPSBkYXRhLnN0cmlkZTtcblx0XHRcdFx0XHRcdHZhciBvZmZzZXQgPSBnZW9tZXRyeUF0dHJpYnV0ZS5vZmZzZXQ7XG5cblx0XHRcdFx0XHRcdGlmICggZGF0YSAmJiBkYXRhLmlzSW5zdGFuY2VkSW50ZXJsZWF2ZWRCdWZmZXIgKSB7XG5cblx0XHRcdFx0XHRcdFx0c3RhdGUuZW5hYmxlQXR0cmlidXRlQW5kRGl2aXNvciggcHJvZ3JhbUF0dHJpYnV0ZSwgZGF0YS5tZXNoUGVyQXR0cmlidXRlICk7XG5cblx0XHRcdFx0XHRcdFx0aWYgKCBnZW9tZXRyeS5tYXhJbnN0YW5jZWRDb3VudCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Z2VvbWV0cnkubWF4SW5zdGFuY2VkQ291bnQgPSBkYXRhLm1lc2hQZXJBdHRyaWJ1dGUgKiBkYXRhLmNvdW50O1xuXG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0XHRzdGF0ZS5lbmFibGVBdHRyaWJ1dGUoIHByb2dyYW1BdHRyaWJ1dGUgKTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRfZ2wuYmluZEJ1ZmZlciggX2dsLkFSUkFZX0JVRkZFUiwgYnVmZmVyICk7XG5cdFx0XHRcdFx0XHRfZ2wudmVydGV4QXR0cmliUG9pbnRlciggcHJvZ3JhbUF0dHJpYnV0ZSwgc2l6ZSwgdHlwZSwgbm9ybWFsaXplZCwgc3RyaWRlICogYnl0ZXNQZXJFbGVtZW50LCAoIHN0YXJ0SW5kZXggKiBzdHJpZGUgKyBvZmZzZXQgKSAqIGJ5dGVzUGVyRWxlbWVudCApO1xuXG5cdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0aWYgKCBnZW9tZXRyeUF0dHJpYnV0ZS5pc0luc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZSApIHtcblxuXHRcdFx0XHRcdFx0XHRzdGF0ZS5lbmFibGVBdHRyaWJ1dGVBbmREaXZpc29yKCBwcm9ncmFtQXR0cmlidXRlLCBnZW9tZXRyeUF0dHJpYnV0ZS5tZXNoUGVyQXR0cmlidXRlICk7XG5cblx0XHRcdFx0XHRcdFx0aWYgKCBnZW9tZXRyeS5tYXhJbnN0YW5jZWRDb3VudCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Z2VvbWV0cnkubWF4SW5zdGFuY2VkQ291bnQgPSBnZW9tZXRyeUF0dHJpYnV0ZS5tZXNoUGVyQXR0cmlidXRlICogZ2VvbWV0cnlBdHRyaWJ1dGUuY291bnQ7XG5cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdHN0YXRlLmVuYWJsZUF0dHJpYnV0ZSggcHJvZ3JhbUF0dHJpYnV0ZSApO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdF9nbC5iaW5kQnVmZmVyKCBfZ2wuQVJSQVlfQlVGRkVSLCBidWZmZXIgKTtcblx0XHRcdFx0XHRcdF9nbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKCBwcm9ncmFtQXR0cmlidXRlLCBzaXplLCB0eXBlLCBub3JtYWxpemVkLCAwLCBzdGFydEluZGV4ICogc2l6ZSAqIGJ5dGVzUGVyRWxlbWVudCApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsRGVmYXVsdEF0dHJpYnV0ZVZhbHVlcyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0dmFyIHZhbHVlID0gbWF0ZXJpYWxEZWZhdWx0QXR0cmlidXRlVmFsdWVzWyBuYW1lIF07XG5cblx0XHRcdFx0XHRpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRcdHN3aXRjaCAoIHZhbHVlLmxlbmd0aCApIHtcblxuXHRcdFx0XHRcdFx0XHRjYXNlIDI6XG5cdFx0XHRcdFx0XHRcdFx0X2dsLnZlcnRleEF0dHJpYjJmdiggcHJvZ3JhbUF0dHJpYnV0ZSwgdmFsdWUgKTtcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdFx0XHRjYXNlIDM6XG5cdFx0XHRcdFx0XHRcdFx0X2dsLnZlcnRleEF0dHJpYjNmdiggcHJvZ3JhbUF0dHJpYnV0ZSwgdmFsdWUgKTtcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdFx0XHRjYXNlIDQ6XG5cdFx0XHRcdFx0XHRcdFx0X2dsLnZlcnRleEF0dHJpYjRmdiggcHJvZ3JhbUF0dHJpYnV0ZSwgdmFsdWUgKTtcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdFx0XHRcdF9nbC52ZXJ0ZXhBdHRyaWIxZnYoIHByb2dyYW1BdHRyaWJ1dGUsIHZhbHVlICk7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHN0YXRlLmRpc2FibGVVbnVzZWRBdHRyaWJ1dGVzKCk7XG5cblx0fVxuXG5cdC8vIENvbXBpbGVcblxuXHR0aGlzLmNvbXBpbGUgPSBmdW5jdGlvbiAoIHNjZW5lLCBjYW1lcmEgKSB7XG5cblx0XHRsaWdodHMgPSBbXTtcblxuXHRcdHNjZW5lLnRyYXZlcnNlKCBmdW5jdGlvbiAoIG9iamVjdCApIHtcblxuXHRcdFx0aWYgKCBvYmplY3QuaXNMaWdodCApIHtcblxuXHRcdFx0XHRsaWdodHMucHVzaCggb2JqZWN0ICk7XG5cblx0XHRcdH1cblxuXHRcdH0gKTtcblxuXHRcdHNldHVwTGlnaHRzKCBsaWdodHMsIGNhbWVyYSApO1xuXG5cdFx0c2NlbmUudHJhdmVyc2UoIGZ1bmN0aW9uICggb2JqZWN0ICkge1xuXG5cdFx0XHRpZiAoIG9iamVjdC5tYXRlcmlhbCApIHtcblxuXHRcdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIG9iamVjdC5tYXRlcmlhbCApICkge1xuXG5cdFx0XHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgb2JqZWN0Lm1hdGVyaWFsLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0XHRcdFx0aW5pdE1hdGVyaWFsKCBvYmplY3QubWF0ZXJpYWxbIGkgXSwgc2NlbmUuZm9nLCBvYmplY3QgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0aW5pdE1hdGVyaWFsKCBvYmplY3QubWF0ZXJpYWwsIHNjZW5lLmZvZywgb2JqZWN0ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9ICk7XG5cblx0fTtcblxuXHQvLyBSZW5kZXJpbmdcblxuXHR0aGlzLnJlbmRlciA9IGZ1bmN0aW9uICggc2NlbmUsIGNhbWVyYSwgcmVuZGVyVGFyZ2V0LCBmb3JjZUNsZWFyICkge1xuXG5cdFx0aWYgKCBjYW1lcmEgIT09IHVuZGVmaW5lZCAmJiBjYW1lcmEuaXNDYW1lcmEgIT09IHRydWUgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFJlbmRlcmVyLnJlbmRlcjogY2FtZXJhIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBUSFJFRS5DYW1lcmEuJyApO1xuXHRcdFx0cmV0dXJuO1xuXG5cdFx0fVxuXG5cdFx0Ly8gcmVzZXQgY2FjaGluZyBmb3IgdGhpcyBmcmFtZVxuXG5cdFx0X2N1cnJlbnRHZW9tZXRyeVByb2dyYW0gPSAnJztcblx0XHRfY3VycmVudE1hdGVyaWFsSWQgPSAtIDE7XG5cdFx0X2N1cnJlbnRDYW1lcmEgPSBudWxsO1xuXG5cdFx0Ly8gdXBkYXRlIHNjZW5lIGdyYXBoXG5cblx0XHRpZiAoIHNjZW5lLmF1dG9VcGRhdGUgPT09IHRydWUgKSBzY2VuZS51cGRhdGVNYXRyaXhXb3JsZCgpO1xuXG5cdFx0Ly8gdXBkYXRlIGNhbWVyYSBtYXRyaWNlcyBhbmQgZnJ1c3R1bVxuXG5cdFx0Y2FtZXJhLm9uQmVmb3JlUmVuZGVyKCBfdGhpcyApO1xuXG5cdFx0aWYgKCBjYW1lcmEucGFyZW50ID09PSBudWxsICkgY2FtZXJhLnVwZGF0ZU1hdHJpeFdvcmxkKCk7XG5cblx0XHRjYW1lcmEubWF0cml4V29ybGRJbnZlcnNlLmdldEludmVyc2UoIGNhbWVyYS5tYXRyaXhXb3JsZCApO1xuXG5cdFx0X3Byb2pTY3JlZW5NYXRyaXgubXVsdGlwbHlNYXRyaWNlcyggY2FtZXJhLnByb2plY3Rpb25NYXRyaXgsIGNhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UgKTtcblx0XHRfZnJ1c3R1bS5zZXRGcm9tTWF0cml4KCBfcHJvalNjcmVlbk1hdHJpeCApO1xuXG5cdFx0bGlnaHRzLmxlbmd0aCA9IDA7XG5cdFx0c3ByaXRlcy5sZW5ndGggPSAwO1xuXHRcdGxlbnNGbGFyZXMubGVuZ3RoID0gMDtcblxuXHRcdF9sb2NhbENsaXBwaW5nRW5hYmxlZCA9IHRoaXMubG9jYWxDbGlwcGluZ0VuYWJsZWQ7XG5cdFx0X2NsaXBwaW5nRW5hYmxlZCA9IF9jbGlwcGluZy5pbml0KCB0aGlzLmNsaXBwaW5nUGxhbmVzLCBfbG9jYWxDbGlwcGluZ0VuYWJsZWQsIGNhbWVyYSApO1xuXG5cdFx0Y3VycmVudFJlbmRlckxpc3QgPSByZW5kZXJMaXN0cy5nZXQoIHNjZW5lLCBjYW1lcmEgKTtcblx0XHRjdXJyZW50UmVuZGVyTGlzdC5pbml0KCk7XG5cblx0XHRwcm9qZWN0T2JqZWN0KCBzY2VuZSwgY2FtZXJhLCBfdGhpcy5zb3J0T2JqZWN0cyApO1xuXG5cdFx0Y3VycmVudFJlbmRlckxpc3QuZmluaXNoKCk7XG5cblx0XHRpZiAoIF90aGlzLnNvcnRPYmplY3RzID09PSB0cnVlICkge1xuXG5cdFx0XHRjdXJyZW50UmVuZGVyTGlzdC5zb3J0KCk7XG5cblx0XHR9XG5cblx0XHQvL1xuXG5cdFx0aWYgKCBfY2xpcHBpbmdFbmFibGVkICkgX2NsaXBwaW5nLmJlZ2luU2hhZG93cygpO1xuXG5cdFx0c2V0dXBTaGFkb3dzKCBsaWdodHMgKTtcblxuXHRcdHNoYWRvd01hcC5yZW5kZXIoIHNjZW5lLCBjYW1lcmEgKTtcblxuXHRcdHNldHVwTGlnaHRzKCBsaWdodHMsIGNhbWVyYSApO1xuXG5cdFx0aWYgKCBfY2xpcHBpbmdFbmFibGVkICkgX2NsaXBwaW5nLmVuZFNoYWRvd3MoKTtcblxuXHRcdC8vXG5cblx0XHRfaW5mb1JlbmRlci5mcmFtZSArKztcblx0XHRfaW5mb1JlbmRlci5jYWxscyA9IDA7XG5cdFx0X2luZm9SZW5kZXIudmVydGljZXMgPSAwO1xuXHRcdF9pbmZvUmVuZGVyLmZhY2VzID0gMDtcblx0XHRfaW5mb1JlbmRlci5wb2ludHMgPSAwO1xuXG5cdFx0aWYgKCByZW5kZXJUYXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0cmVuZGVyVGFyZ2V0ID0gbnVsbDtcblxuXHRcdH1cblxuXHRcdHRoaXMuc2V0UmVuZGVyVGFyZ2V0KCByZW5kZXJUYXJnZXQgKTtcblxuXHRcdC8vXG5cblx0XHR2YXIgYmFja2dyb3VuZCA9IHNjZW5lLmJhY2tncm91bmQ7XG5cblx0XHRpZiAoIGJhY2tncm91bmQgPT09IG51bGwgKSB7XG5cblx0XHRcdHN0YXRlLmJ1ZmZlcnMuY29sb3Iuc2V0Q2xlYXIoIF9jbGVhckNvbG9yLnIsIF9jbGVhckNvbG9yLmcsIF9jbGVhckNvbG9yLmIsIF9jbGVhckFscGhhLCBfcHJlbXVsdGlwbGllZEFscGhhICk7XG5cblx0XHR9IGVsc2UgaWYgKCBiYWNrZ3JvdW5kICYmIGJhY2tncm91bmQuaXNDb2xvciApIHtcblxuXHRcdFx0c3RhdGUuYnVmZmVycy5jb2xvci5zZXRDbGVhciggYmFja2dyb3VuZC5yLCBiYWNrZ3JvdW5kLmcsIGJhY2tncm91bmQuYiwgMSwgX3ByZW11bHRpcGxpZWRBbHBoYSApO1xuXHRcdFx0Zm9yY2VDbGVhciA9IHRydWU7XG5cblx0XHR9XG5cblx0XHRpZiAoIHRoaXMuYXV0b0NsZWFyIHx8IGZvcmNlQ2xlYXIgKSB7XG5cblx0XHRcdHRoaXMuY2xlYXIoIHRoaXMuYXV0b0NsZWFyQ29sb3IsIHRoaXMuYXV0b0NsZWFyRGVwdGgsIHRoaXMuYXV0b0NsZWFyU3RlbmNpbCApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBiYWNrZ3JvdW5kICYmIGJhY2tncm91bmQuaXNDdWJlVGV4dHVyZSApIHtcblxuXHRcdFx0aWYgKCBiYWNrZ3JvdW5kQm94Q2FtZXJhID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0YmFja2dyb3VuZEJveENhbWVyYSA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSgpO1xuXG5cdFx0XHRcdGJhY2tncm91bmRCb3hNZXNoID0gbmV3IE1lc2goXG5cdFx0XHRcdFx0bmV3IEJveEJ1ZmZlckdlb21ldHJ5KCA1LCA1LCA1ICksXG5cdFx0XHRcdFx0bmV3IFNoYWRlck1hdGVyaWFsKCB7XG5cdFx0XHRcdFx0XHR1bmlmb3JtczogU2hhZGVyTGliLmN1YmUudW5pZm9ybXMsXG5cdFx0XHRcdFx0XHR2ZXJ0ZXhTaGFkZXI6IFNoYWRlckxpYi5jdWJlLnZlcnRleFNoYWRlcixcblx0XHRcdFx0XHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJMaWIuY3ViZS5mcmFnbWVudFNoYWRlcixcblx0XHRcdFx0XHRcdHNpZGU6IEJhY2tTaWRlLFxuXHRcdFx0XHRcdFx0ZGVwdGhUZXN0OiBmYWxzZSxcblx0XHRcdFx0XHRcdGRlcHRoV3JpdGU6IGZhbHNlLFxuXHRcdFx0XHRcdFx0Zm9nOiBmYWxzZVxuXHRcdFx0XHRcdH0gKVxuXHRcdFx0XHQpO1xuXG5cdFx0XHR9XG5cblx0XHRcdGJhY2tncm91bmRCb3hDYW1lcmEucHJvamVjdGlvbk1hdHJpeC5jb3B5KCBjYW1lcmEucHJvamVjdGlvbk1hdHJpeCApO1xuXG5cdFx0XHRiYWNrZ3JvdW5kQm94Q2FtZXJhLm1hdHJpeFdvcmxkLmV4dHJhY3RSb3RhdGlvbiggY2FtZXJhLm1hdHJpeFdvcmxkICk7XG5cdFx0XHRiYWNrZ3JvdW5kQm94Q2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZS5nZXRJbnZlcnNlKCBiYWNrZ3JvdW5kQm94Q2FtZXJhLm1hdHJpeFdvcmxkICk7XG5cblxuXHRcdFx0YmFja2dyb3VuZEJveE1lc2gubWF0ZXJpYWwudW5pZm9ybXNbIFwidEN1YmVcIiBdLnZhbHVlID0gYmFja2dyb3VuZDtcblx0XHRcdGJhY2tncm91bmRCb3hNZXNoLm1vZGVsVmlld01hdHJpeC5tdWx0aXBseU1hdHJpY2VzKCBiYWNrZ3JvdW5kQm94Q2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZSwgYmFja2dyb3VuZEJveE1lc2gubWF0cml4V29ybGQgKTtcblxuXHRcdFx0b2JqZWN0cy51cGRhdGUoIGJhY2tncm91bmRCb3hNZXNoICk7XG5cblx0XHRcdF90aGlzLnJlbmRlckJ1ZmZlckRpcmVjdCggYmFja2dyb3VuZEJveENhbWVyYSwgbnVsbCwgYmFja2dyb3VuZEJveE1lc2guZ2VvbWV0cnksIGJhY2tncm91bmRCb3hNZXNoLm1hdGVyaWFsLCBiYWNrZ3JvdW5kQm94TWVzaCwgbnVsbCApO1xuXG5cdFx0fSBlbHNlIGlmICggYmFja2dyb3VuZCAmJiBiYWNrZ3JvdW5kLmlzVGV4dHVyZSApIHtcblxuXHRcdFx0aWYgKCBiYWNrZ3JvdW5kUGxhbmVDYW1lcmEgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRiYWNrZ3JvdW5kUGxhbmVDYW1lcmEgPSBuZXcgT3J0aG9ncmFwaGljQ2FtZXJhKCAtIDEsIDEsIDEsIC0gMSwgMCwgMSApO1xuXG5cdFx0XHRcdGJhY2tncm91bmRQbGFuZU1lc2ggPSBuZXcgTWVzaChcblx0XHRcdFx0XHRuZXcgUGxhbmVCdWZmZXJHZW9tZXRyeSggMiwgMiApLFxuXHRcdFx0XHRcdG5ldyBNZXNoQmFzaWNNYXRlcmlhbCggeyBkZXB0aFRlc3Q6IGZhbHNlLCBkZXB0aFdyaXRlOiBmYWxzZSwgZm9nOiBmYWxzZSB9IClcblx0XHRcdFx0KTtcblxuXHRcdFx0fVxuXG5cdFx0XHRiYWNrZ3JvdW5kUGxhbmVNZXNoLm1hdGVyaWFsLm1hcCA9IGJhY2tncm91bmQ7XG5cblx0XHRcdG9iamVjdHMudXBkYXRlKCBiYWNrZ3JvdW5kUGxhbmVNZXNoICk7XG5cblx0XHRcdF90aGlzLnJlbmRlckJ1ZmZlckRpcmVjdCggYmFja2dyb3VuZFBsYW5lQ2FtZXJhLCBudWxsLCBiYWNrZ3JvdW5kUGxhbmVNZXNoLmdlb21ldHJ5LCBiYWNrZ3JvdW5kUGxhbmVNZXNoLm1hdGVyaWFsLCBiYWNrZ3JvdW5kUGxhbmVNZXNoLCBudWxsICk7XG5cblx0XHR9XG5cblx0XHQvL1xuXG5cdFx0dmFyIG9wYXF1ZU9iamVjdHMgPSBjdXJyZW50UmVuZGVyTGlzdC5vcGFxdWU7XG5cdFx0dmFyIHRyYW5zcGFyZW50T2JqZWN0cyA9IGN1cnJlbnRSZW5kZXJMaXN0LnRyYW5zcGFyZW50O1xuXG5cdFx0aWYgKCBzY2VuZS5vdmVycmlkZU1hdGVyaWFsICkge1xuXG5cdFx0XHR2YXIgb3ZlcnJpZGVNYXRlcmlhbCA9IHNjZW5lLm92ZXJyaWRlTWF0ZXJpYWw7XG5cblx0XHRcdGlmICggb3BhcXVlT2JqZWN0cy5sZW5ndGggKSByZW5kZXJPYmplY3RzKCBvcGFxdWVPYmplY3RzLCBzY2VuZSwgY2FtZXJhLCBvdmVycmlkZU1hdGVyaWFsICk7XG5cdFx0XHRpZiAoIHRyYW5zcGFyZW50T2JqZWN0cy5sZW5ndGggKSByZW5kZXJPYmplY3RzKCB0cmFuc3BhcmVudE9iamVjdHMsIHNjZW5lLCBjYW1lcmEsIG92ZXJyaWRlTWF0ZXJpYWwgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIG9wYXF1ZSBwYXNzIChmcm9udC10by1iYWNrIG9yZGVyKVxuXG5cdFx0XHRpZiAoIG9wYXF1ZU9iamVjdHMubGVuZ3RoICkgcmVuZGVyT2JqZWN0cyggb3BhcXVlT2JqZWN0cywgc2NlbmUsIGNhbWVyYSApO1xuXG5cdFx0XHQvLyB0cmFuc3BhcmVudCBwYXNzIChiYWNrLXRvLWZyb250IG9yZGVyKVxuXG5cdFx0XHRpZiAoIHRyYW5zcGFyZW50T2JqZWN0cy5sZW5ndGggKSByZW5kZXJPYmplY3RzKCB0cmFuc3BhcmVudE9iamVjdHMsIHNjZW5lLCBjYW1lcmEgKTtcblxuXHRcdH1cblxuXHRcdC8vIGN1c3RvbSByZW5kZXIgcGx1Z2lucyAocG9zdCBwYXNzKVxuXG5cdFx0c3ByaXRlUGx1Z2luLnJlbmRlciggc2NlbmUsIGNhbWVyYSApO1xuXHRcdGxlbnNGbGFyZVBsdWdpbi5yZW5kZXIoIHNjZW5lLCBjYW1lcmEsIF9jdXJyZW50Vmlld3BvcnQgKTtcblxuXHRcdC8vIEdlbmVyYXRlIG1pcG1hcCBpZiB3ZSdyZSB1c2luZyBhbnkga2luZCBvZiBtaXBtYXAgZmlsdGVyaW5nXG5cblx0XHRpZiAoIHJlbmRlclRhcmdldCApIHtcblxuXHRcdFx0dGV4dHVyZXMudXBkYXRlUmVuZGVyVGFyZ2V0TWlwbWFwKCByZW5kZXJUYXJnZXQgKTtcblxuXHRcdH1cblxuXHRcdC8vIEVuc3VyZSBkZXB0aCBidWZmZXIgd3JpdGluZyBpcyBlbmFibGVkIHNvIGl0IGNhbiBiZSBjbGVhcmVkIG9uIG5leHQgcmVuZGVyXG5cblx0XHRzdGF0ZS5idWZmZXJzLmRlcHRoLnNldFRlc3QoIHRydWUgKTtcblx0XHRzdGF0ZS5idWZmZXJzLmRlcHRoLnNldE1hc2soIHRydWUgKTtcblx0XHRzdGF0ZS5idWZmZXJzLmNvbG9yLnNldE1hc2soIHRydWUgKTtcblxuXHRcdGlmICggY2FtZXJhLmlzQXJyYXlDYW1lcmEgJiYgY2FtZXJhLmVuYWJsZWQgKSB7XG5cblx0XHRcdF90aGlzLnNldFNjaXNzb3JUZXN0KCBmYWxzZSApO1xuXG5cdFx0fVxuXG5cdFx0Y2FtZXJhLm9uQWZ0ZXJSZW5kZXIoIF90aGlzICk7XG5cblx0XHQvLyBfZ2wuZmluaXNoKCk7XG5cblx0fTtcblxuXHQvKlxuXHQvLyBUT0RPIER1cGxpY2F0ZWQgY29kZSAoRnJ1c3R1bSlcblxuXHR2YXIgX3NwaGVyZSA9IG5ldyBTcGhlcmUoKTtcblxuXHRmdW5jdGlvbiBpc09iamVjdFZpZXdhYmxlKCBvYmplY3QgKSB7XG5cblx0XHR2YXIgZ2VvbWV0cnkgPSBvYmplY3QuZ2VvbWV0cnk7XG5cblx0XHRpZiAoIGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlID09PSBudWxsIClcblx0XHRcdGdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO1xuXG5cdFx0X3NwaGVyZS5jb3B5KCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSApLlxuXHRcdGFwcGx5TWF0cml4NCggb2JqZWN0Lm1hdHJpeFdvcmxkICk7XG5cblx0XHRyZXR1cm4gaXNTcGhlcmVWaWV3YWJsZSggX3NwaGVyZSApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBpc1Nwcml0ZVZpZXdhYmxlKCBzcHJpdGUgKSB7XG5cblx0XHRfc3BoZXJlLmNlbnRlci5zZXQoIDAsIDAsIDAgKTtcblx0XHRfc3BoZXJlLnJhZGl1cyA9IDAuNzA3MTA2NzgxMTg2NTQ3Njtcblx0XHRfc3BoZXJlLmFwcGx5TWF0cml4NCggc3ByaXRlLm1hdHJpeFdvcmxkICk7XG5cblx0XHRyZXR1cm4gaXNTcGhlcmVWaWV3YWJsZSggX3NwaGVyZSApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBpc1NwaGVyZVZpZXdhYmxlKCBzcGhlcmUgKSB7XG5cblx0XHRpZiAoICEgX2ZydXN0dW0uaW50ZXJzZWN0c1NwaGVyZSggc3BoZXJlICkgKSByZXR1cm4gZmFsc2U7XG5cblx0XHR2YXIgbnVtUGxhbmVzID0gX2NsaXBwaW5nLm51bVBsYW5lcztcblxuXHRcdGlmICggbnVtUGxhbmVzID09PSAwICkgcmV0dXJuIHRydWU7XG5cblx0XHR2YXIgcGxhbmVzID0gX3RoaXMuY2xpcHBpbmdQbGFuZXMsXG5cblx0XHRcdGNlbnRlciA9IHNwaGVyZS5jZW50ZXIsXG5cdFx0XHRuZWdSYWQgPSAtIHNwaGVyZS5yYWRpdXMsXG5cdFx0XHRpID0gMDtcblxuXHRcdGRvIHtcblxuXHRcdFx0Ly8gb3V0IHdoZW4gZGVlcGVyIHRoYW4gcmFkaXVzIGluIHRoZSBuZWdhdGl2ZSBoYWxmc3BhY2Vcblx0XHRcdGlmICggcGxhbmVzWyBpIF0uZGlzdGFuY2VUb1BvaW50KCBjZW50ZXIgKSA8IG5lZ1JhZCApIHJldHVybiBmYWxzZTtcblxuXHRcdH0gd2hpbGUgKCArKyBpICE9PSBudW1QbGFuZXMgKTtcblxuXHRcdHJldHVybiB0cnVlO1xuXG5cdH1cblx0Ki9cblxuXHRmdW5jdGlvbiBwcm9qZWN0T2JqZWN0KCBvYmplY3QsIGNhbWVyYSwgc29ydE9iamVjdHMgKSB7XG5cblx0XHRpZiAoICEgb2JqZWN0LnZpc2libGUgKSByZXR1cm47XG5cblx0XHR2YXIgdmlzaWJsZSA9IG9iamVjdC5sYXllcnMudGVzdCggY2FtZXJhLmxheWVycyApO1xuXG5cdFx0aWYgKCB2aXNpYmxlICkge1xuXG5cdFx0XHRpZiAoIG9iamVjdC5pc0xpZ2h0ICkge1xuXG5cdFx0XHRcdGxpZ2h0cy5wdXNoKCBvYmplY3QgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggb2JqZWN0LmlzU3ByaXRlICkge1xuXG5cdFx0XHRcdGlmICggISBvYmplY3QuZnJ1c3R1bUN1bGxlZCB8fCBfZnJ1c3R1bS5pbnRlcnNlY3RzU3ByaXRlKCBvYmplY3QgKSApIHtcblxuXHRcdFx0XHRcdHNwcml0ZXMucHVzaCggb2JqZWN0ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IGVsc2UgaWYgKCBvYmplY3QuaXNMZW5zRmxhcmUgKSB7XG5cblx0XHRcdFx0bGVuc0ZsYXJlcy5wdXNoKCBvYmplY3QgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggb2JqZWN0LmlzSW1tZWRpYXRlUmVuZGVyT2JqZWN0ICkge1xuXG5cdFx0XHRcdGlmICggc29ydE9iamVjdHMgKSB7XG5cblx0XHRcdFx0XHRfdmVjdG9yMy5zZXRGcm9tTWF0cml4UG9zaXRpb24oIG9iamVjdC5tYXRyaXhXb3JsZCApXG5cdFx0XHRcdFx0XHQuYXBwbHlNYXRyaXg0KCBfcHJvalNjcmVlbk1hdHJpeCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjdXJyZW50UmVuZGVyTGlzdC5wdXNoKCBvYmplY3QsIG51bGwsIG9iamVjdC5tYXRlcmlhbCwgX3ZlY3RvcjMueiwgbnVsbCApO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBvYmplY3QuaXNNZXNoIHx8IG9iamVjdC5pc0xpbmUgfHwgb2JqZWN0LmlzUG9pbnRzICkge1xuXG5cdFx0XHRcdGlmICggb2JqZWN0LmlzU2tpbm5lZE1lc2ggKSB7XG5cblx0XHRcdFx0XHRvYmplY3Quc2tlbGV0b24udXBkYXRlKCk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggISBvYmplY3QuZnJ1c3R1bUN1bGxlZCB8fCBfZnJ1c3R1bS5pbnRlcnNlY3RzT2JqZWN0KCBvYmplY3QgKSApIHtcblxuXHRcdFx0XHRcdGlmICggc29ydE9iamVjdHMgKSB7XG5cblx0XHRcdFx0XHRcdF92ZWN0b3IzLnNldEZyb21NYXRyaXhQb3NpdGlvbiggb2JqZWN0Lm1hdHJpeFdvcmxkIClcblx0XHRcdFx0XHRcdFx0LmFwcGx5TWF0cml4NCggX3Byb2pTY3JlZW5NYXRyaXggKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHZhciBnZW9tZXRyeSA9IG9iamVjdHMudXBkYXRlKCBvYmplY3QgKTtcblx0XHRcdFx0XHR2YXIgbWF0ZXJpYWwgPSBvYmplY3QubWF0ZXJpYWw7XG5cblx0XHRcdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIG1hdGVyaWFsICkgKSB7XG5cblx0XHRcdFx0XHRcdHZhciBncm91cHMgPSBnZW9tZXRyeS5ncm91cHM7XG5cblx0XHRcdFx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGdyb3Vwcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0XHRcdHZhciBncm91cCA9IGdyb3Vwc1sgaSBdO1xuXHRcdFx0XHRcdFx0XHR2YXIgZ3JvdXBNYXRlcmlhbCA9IG1hdGVyaWFsWyBncm91cC5tYXRlcmlhbEluZGV4IF07XG5cblx0XHRcdFx0XHRcdFx0aWYgKCBncm91cE1hdGVyaWFsICYmIGdyb3VwTWF0ZXJpYWwudmlzaWJsZSApIHtcblxuXHRcdFx0XHRcdFx0XHRcdGN1cnJlbnRSZW5kZXJMaXN0LnB1c2goIG9iamVjdCwgZ2VvbWV0cnksIGdyb3VwTWF0ZXJpYWwsIF92ZWN0b3IzLnosIGdyb3VwICk7XG5cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC52aXNpYmxlICkge1xuXG5cdFx0XHRcdFx0XHRjdXJyZW50UmVuZGVyTGlzdC5wdXNoKCBvYmplY3QsIGdlb21ldHJ5LCBtYXRlcmlhbCwgX3ZlY3RvcjMueiwgbnVsbCApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0dmFyIGNoaWxkcmVuID0gb2JqZWN0LmNoaWxkcmVuO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0cHJvamVjdE9iamVjdCggY2hpbGRyZW5bIGkgXSwgY2FtZXJhLCBzb3J0T2JqZWN0cyApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiByZW5kZXJPYmplY3RzKCByZW5kZXJMaXN0LCBzY2VuZSwgY2FtZXJhLCBvdmVycmlkZU1hdGVyaWFsICkge1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gcmVuZGVyTGlzdC5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgcmVuZGVySXRlbSA9IHJlbmRlckxpc3RbIGkgXTtcblxuXHRcdFx0dmFyIG9iamVjdCA9IHJlbmRlckl0ZW0ub2JqZWN0O1xuXHRcdFx0dmFyIGdlb21ldHJ5ID0gcmVuZGVySXRlbS5nZW9tZXRyeTtcblx0XHRcdHZhciBtYXRlcmlhbCA9IG92ZXJyaWRlTWF0ZXJpYWwgPT09IHVuZGVmaW5lZCA/IHJlbmRlckl0ZW0ubWF0ZXJpYWwgOiBvdmVycmlkZU1hdGVyaWFsO1xuXHRcdFx0dmFyIGdyb3VwID0gcmVuZGVySXRlbS5ncm91cDtcblxuXHRcdFx0b2JqZWN0Lm9uQmVmb3JlUmVuZGVyKCBfdGhpcywgc2NlbmUsIGNhbWVyYSwgZ2VvbWV0cnksIG1hdGVyaWFsLCBncm91cCApO1xuXG5cdFx0XHRpZiAoIGNhbWVyYS5pc0FycmF5Q2FtZXJhICYmIGNhbWVyYS5lbmFibGVkICkge1xuXG5cdFx0XHRcdHZhciBjYW1lcmFzID0gY2FtZXJhLmNhbWVyYXM7XG5cblx0XHRcdFx0Zm9yICggdmFyIGogPSAwLCBqbCA9IGNhbWVyYXMubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7XG5cblx0XHRcdFx0XHR2YXIgY2FtZXJhMiA9IGNhbWVyYXNbIGogXTtcblx0XHRcdFx0XHR2YXIgYm91bmRzID0gY2FtZXJhMi5ib3VuZHM7XG5cblx0XHRcdFx0XHRfdGhpcy5zZXRWaWV3cG9ydChcblx0XHRcdFx0XHRcdGJvdW5kcy54ICogX3dpZHRoICogX3BpeGVsUmF0aW8sIGJvdW5kcy55ICogX2hlaWdodCAqIF9waXhlbFJhdGlvLFxuXHRcdFx0XHRcdFx0Ym91bmRzLnogKiBfd2lkdGggKiBfcGl4ZWxSYXRpbywgYm91bmRzLncgKiBfaGVpZ2h0ICogX3BpeGVsUmF0aW9cblx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdF90aGlzLnNldFNjaXNzb3IoXG5cdFx0XHRcdFx0XHRib3VuZHMueCAqIF93aWR0aCAqIF9waXhlbFJhdGlvLCBib3VuZHMueSAqIF9oZWlnaHQgKiBfcGl4ZWxSYXRpbyxcblx0XHRcdFx0XHRcdGJvdW5kcy56ICogX3dpZHRoICogX3BpeGVsUmF0aW8sIGJvdW5kcy53ICogX2hlaWdodCAqIF9waXhlbFJhdGlvXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRfdGhpcy5zZXRTY2lzc29yVGVzdCggdHJ1ZSApO1xuXG5cdFx0XHRcdFx0cmVuZGVyT2JqZWN0KCBvYmplY3QsIHNjZW5lLCBjYW1lcmEyLCBnZW9tZXRyeSwgbWF0ZXJpYWwsIGdyb3VwICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHJlbmRlck9iamVjdCggb2JqZWN0LCBzY2VuZSwgY2FtZXJhLCBnZW9tZXRyeSwgbWF0ZXJpYWwsIGdyb3VwICk7XG5cblx0XHRcdH1cblxuXHRcdFx0b2JqZWN0Lm9uQWZ0ZXJSZW5kZXIoIF90aGlzLCBzY2VuZSwgY2FtZXJhLCBnZW9tZXRyeSwgbWF0ZXJpYWwsIGdyb3VwICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlbmRlck9iamVjdCggb2JqZWN0LCBzY2VuZSwgY2FtZXJhLCBnZW9tZXRyeSwgbWF0ZXJpYWwsIGdyb3VwICkge1xuXG5cdFx0b2JqZWN0Lm1vZGVsVmlld01hdHJpeC5tdWx0aXBseU1hdHJpY2VzKCBjYW1lcmEubWF0cml4V29ybGRJbnZlcnNlLCBvYmplY3QubWF0cml4V29ybGQgKTtcblx0XHRvYmplY3Qubm9ybWFsTWF0cml4LmdldE5vcm1hbE1hdHJpeCggb2JqZWN0Lm1vZGVsVmlld01hdHJpeCApO1xuXG5cdFx0aWYgKCBvYmplY3QuaXNJbW1lZGlhdGVSZW5kZXJPYmplY3QgKSB7XG5cblx0XHRcdHN0YXRlLnNldE1hdGVyaWFsKCBtYXRlcmlhbCApO1xuXG5cdFx0XHR2YXIgcHJvZ3JhbSA9IHNldFByb2dyYW0oIGNhbWVyYSwgc2NlbmUuZm9nLCBtYXRlcmlhbCwgb2JqZWN0ICk7XG5cblx0XHRcdF9jdXJyZW50R2VvbWV0cnlQcm9ncmFtID0gJyc7XG5cblx0XHRcdHJlbmRlck9iamVjdEltbWVkaWF0ZSggb2JqZWN0LCBwcm9ncmFtLCBtYXRlcmlhbCApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0X3RoaXMucmVuZGVyQnVmZmVyRGlyZWN0KCBjYW1lcmEsIHNjZW5lLmZvZywgZ2VvbWV0cnksIG1hdGVyaWFsLCBvYmplY3QsIGdyb3VwICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGluaXRNYXRlcmlhbCggbWF0ZXJpYWwsIGZvZywgb2JqZWN0ICkge1xuXG5cdFx0dmFyIG1hdGVyaWFsUHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCBtYXRlcmlhbCApO1xuXG5cdFx0dmFyIHBhcmFtZXRlcnMgPSBwcm9ncmFtQ2FjaGUuZ2V0UGFyYW1ldGVycyhcblx0XHRcdG1hdGVyaWFsLCBfbGlnaHRzLCBmb2csIF9jbGlwcGluZy5udW1QbGFuZXMsIF9jbGlwcGluZy5udW1JbnRlcnNlY3Rpb24sIG9iamVjdCApO1xuXG5cdFx0dmFyIGNvZGUgPSBwcm9ncmFtQ2FjaGUuZ2V0UHJvZ3JhbUNvZGUoIG1hdGVyaWFsLCBwYXJhbWV0ZXJzICk7XG5cblx0XHR2YXIgcHJvZ3JhbSA9IG1hdGVyaWFsUHJvcGVydGllcy5wcm9ncmFtO1xuXHRcdHZhciBwcm9ncmFtQ2hhbmdlID0gdHJ1ZTtcblxuXHRcdGlmICggcHJvZ3JhbSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHQvLyBuZXcgbWF0ZXJpYWxcblx0XHRcdG1hdGVyaWFsLmFkZEV2ZW50TGlzdGVuZXIoICdkaXNwb3NlJywgb25NYXRlcmlhbERpc3Bvc2UgKTtcblxuXHRcdH0gZWxzZSBpZiAoIHByb2dyYW0uY29kZSAhPT0gY29kZSApIHtcblxuXHRcdFx0Ly8gY2hhbmdlZCBnbHNsIG9yIHBhcmFtZXRlcnNcblx0XHRcdHJlbGVhc2VNYXRlcmlhbFByb2dyYW1SZWZlcmVuY2UoIG1hdGVyaWFsICk7XG5cblx0XHR9IGVsc2UgaWYgKCBwYXJhbWV0ZXJzLnNoYWRlcklEICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdC8vIHNhbWUgZ2xzbCBhbmQgdW5pZm9ybSBsaXN0XG5cdFx0XHRyZXR1cm47XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBvbmx5IHJlYnVpbGQgdW5pZm9ybSBsaXN0XG5cdFx0XHRwcm9ncmFtQ2hhbmdlID0gZmFsc2U7XG5cblx0XHR9XG5cblx0XHRpZiAoIHByb2dyYW1DaGFuZ2UgKSB7XG5cblx0XHRcdGlmICggcGFyYW1ldGVycy5zaGFkZXJJRCApIHtcblxuXHRcdFx0XHR2YXIgc2hhZGVyID0gU2hhZGVyTGliWyBwYXJhbWV0ZXJzLnNoYWRlcklEIF07XG5cblx0XHRcdFx0bWF0ZXJpYWxQcm9wZXJ0aWVzLl9fd2ViZ2xTaGFkZXIgPSB7XG5cdFx0XHRcdFx0bmFtZTogbWF0ZXJpYWwudHlwZSxcblx0XHRcdFx0XHR1bmlmb3JtczogVW5pZm9ybXNVdGlscy5jbG9uZSggc2hhZGVyLnVuaWZvcm1zICksXG5cdFx0XHRcdFx0dmVydGV4U2hhZGVyOiBzaGFkZXIudmVydGV4U2hhZGVyLFxuXHRcdFx0XHRcdGZyYWdtZW50U2hhZGVyOiBzaGFkZXIuZnJhZ21lbnRTaGFkZXJcblx0XHRcdFx0fTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRtYXRlcmlhbFByb3BlcnRpZXMuX193ZWJnbFNoYWRlciA9IHtcblx0XHRcdFx0XHRuYW1lOiBtYXRlcmlhbC50eXBlLFxuXHRcdFx0XHRcdHVuaWZvcm1zOiBtYXRlcmlhbC51bmlmb3Jtcyxcblx0XHRcdFx0XHR2ZXJ0ZXhTaGFkZXI6IG1hdGVyaWFsLnZlcnRleFNoYWRlcixcblx0XHRcdFx0XHRmcmFnbWVudFNoYWRlcjogbWF0ZXJpYWwuZnJhZ21lbnRTaGFkZXJcblx0XHRcdFx0fTtcblxuXHRcdFx0fVxuXG5cdFx0XHRtYXRlcmlhbC5fX3dlYmdsU2hhZGVyID0gbWF0ZXJpYWxQcm9wZXJ0aWVzLl9fd2ViZ2xTaGFkZXI7XG5cblx0XHRcdHByb2dyYW0gPSBwcm9ncmFtQ2FjaGUuYWNxdWlyZVByb2dyYW0oIG1hdGVyaWFsLCBwYXJhbWV0ZXJzLCBjb2RlICk7XG5cblx0XHRcdG1hdGVyaWFsUHJvcGVydGllcy5wcm9ncmFtID0gcHJvZ3JhbTtcblx0XHRcdG1hdGVyaWFsLnByb2dyYW0gPSBwcm9ncmFtO1xuXG5cdFx0fVxuXG5cdFx0dmFyIHByb2dyYW1BdHRyaWJ1dGVzID0gcHJvZ3JhbS5nZXRBdHRyaWJ1dGVzKCk7XG5cblx0XHRpZiAoIG1hdGVyaWFsLm1vcnBoVGFyZ2V0cyApIHtcblxuXHRcdFx0bWF0ZXJpYWwubnVtU3VwcG9ydGVkTW9ycGhUYXJnZXRzID0gMDtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgX3RoaXMubWF4TW9ycGhUYXJnZXRzOyBpICsrICkge1xuXG5cdFx0XHRcdGlmICggcHJvZ3JhbUF0dHJpYnV0ZXNbICdtb3JwaFRhcmdldCcgKyBpIF0gPj0gMCApIHtcblxuXHRcdFx0XHRcdG1hdGVyaWFsLm51bVN1cHBvcnRlZE1vcnBoVGFyZ2V0cyArKztcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwubW9ycGhOb3JtYWxzICkge1xuXG5cdFx0XHRtYXRlcmlhbC5udW1TdXBwb3J0ZWRNb3JwaE5vcm1hbHMgPSAwO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBfdGhpcy5tYXhNb3JwaE5vcm1hbHM7IGkgKysgKSB7XG5cblx0XHRcdFx0aWYgKCBwcm9ncmFtQXR0cmlidXRlc1sgJ21vcnBoTm9ybWFsJyArIGkgXSA+PSAwICkge1xuXG5cdFx0XHRcdFx0bWF0ZXJpYWwubnVtU3VwcG9ydGVkTW9ycGhOb3JtYWxzICsrO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0dmFyIHVuaWZvcm1zID0gbWF0ZXJpYWxQcm9wZXJ0aWVzLl9fd2ViZ2xTaGFkZXIudW5pZm9ybXM7XG5cblx0XHRpZiAoICEgbWF0ZXJpYWwuaXNTaGFkZXJNYXRlcmlhbCAmJlxuXHRcdFx0ISBtYXRlcmlhbC5pc1Jhd1NoYWRlck1hdGVyaWFsIHx8XG5cdFx0XHRtYXRlcmlhbC5jbGlwcGluZyA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0bWF0ZXJpYWxQcm9wZXJ0aWVzLm51bUNsaXBwaW5nUGxhbmVzID0gX2NsaXBwaW5nLm51bVBsYW5lcztcblx0XHRcdG1hdGVyaWFsUHJvcGVydGllcy5udW1JbnRlcnNlY3Rpb24gPSBfY2xpcHBpbmcubnVtSW50ZXJzZWN0aW9uO1xuXHRcdFx0dW5pZm9ybXMuY2xpcHBpbmdQbGFuZXMgPSBfY2xpcHBpbmcudW5pZm9ybTtcblxuXHRcdH1cblxuXHRcdG1hdGVyaWFsUHJvcGVydGllcy5mb2cgPSBmb2c7XG5cblx0XHQvLyBzdG9yZSB0aGUgbGlnaHQgc2V0dXAgaXQgd2FzIGNyZWF0ZWQgZm9yXG5cblx0XHRtYXRlcmlhbFByb3BlcnRpZXMubGlnaHRzSGFzaCA9IF9saWdodHMuaGFzaDtcblxuXHRcdGlmICggbWF0ZXJpYWwubGlnaHRzICkge1xuXG5cdFx0XHQvLyB3aXJlIHVwIHRoZSBtYXRlcmlhbCB0byB0aGlzIHJlbmRlcmVyJ3MgbGlnaHRpbmcgc3RhdGVcblxuXHRcdFx0dW5pZm9ybXMuYW1iaWVudExpZ2h0Q29sb3IudmFsdWUgPSBfbGlnaHRzLmFtYmllbnQ7XG5cdFx0XHR1bmlmb3Jtcy5kaXJlY3Rpb25hbExpZ2h0cy52YWx1ZSA9IF9saWdodHMuZGlyZWN0aW9uYWw7XG5cdFx0XHR1bmlmb3Jtcy5zcG90TGlnaHRzLnZhbHVlID0gX2xpZ2h0cy5zcG90O1xuXHRcdFx0dW5pZm9ybXMucmVjdEFyZWFMaWdodHMudmFsdWUgPSBfbGlnaHRzLnJlY3RBcmVhO1xuXHRcdFx0dW5pZm9ybXMucG9pbnRMaWdodHMudmFsdWUgPSBfbGlnaHRzLnBvaW50O1xuXHRcdFx0dW5pZm9ybXMuaGVtaXNwaGVyZUxpZ2h0cy52YWx1ZSA9IF9saWdodHMuaGVtaTtcblxuXHRcdFx0dW5pZm9ybXMuZGlyZWN0aW9uYWxTaGFkb3dNYXAudmFsdWUgPSBfbGlnaHRzLmRpcmVjdGlvbmFsU2hhZG93TWFwO1xuXHRcdFx0dW5pZm9ybXMuZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXgudmFsdWUgPSBfbGlnaHRzLmRpcmVjdGlvbmFsU2hhZG93TWF0cml4O1xuXHRcdFx0dW5pZm9ybXMuc3BvdFNoYWRvd01hcC52YWx1ZSA9IF9saWdodHMuc3BvdFNoYWRvd01hcDtcblx0XHRcdHVuaWZvcm1zLnNwb3RTaGFkb3dNYXRyaXgudmFsdWUgPSBfbGlnaHRzLnNwb3RTaGFkb3dNYXRyaXg7XG5cdFx0XHR1bmlmb3Jtcy5wb2ludFNoYWRvd01hcC52YWx1ZSA9IF9saWdodHMucG9pbnRTaGFkb3dNYXA7XG5cdFx0XHR1bmlmb3Jtcy5wb2ludFNoYWRvd01hdHJpeC52YWx1ZSA9IF9saWdodHMucG9pbnRTaGFkb3dNYXRyaXg7XG5cdFx0XHQvLyBUT0RPIChhYmVsbmF0aW9uKTogYWRkIGFyZWEgbGlnaHRzIHNoYWRvdyBpbmZvIHRvIHVuaWZvcm1zXG5cblx0XHR9XG5cblx0XHR2YXIgcHJvZ1VuaWZvcm1zID0gbWF0ZXJpYWxQcm9wZXJ0aWVzLnByb2dyYW0uZ2V0VW5pZm9ybXMoKSxcblx0XHRcdHVuaWZvcm1zTGlzdCA9XG5cdFx0XHRcdFdlYkdMVW5pZm9ybXMuc2VxV2l0aFZhbHVlKCBwcm9nVW5pZm9ybXMuc2VxLCB1bmlmb3JtcyApO1xuXG5cdFx0bWF0ZXJpYWxQcm9wZXJ0aWVzLnVuaWZvcm1zTGlzdCA9IHVuaWZvcm1zTGlzdDtcblxuXHR9XG5cblx0ZnVuY3Rpb24gc2V0UHJvZ3JhbSggY2FtZXJhLCBmb2csIG1hdGVyaWFsLCBvYmplY3QgKSB7XG5cblx0XHRfdXNlZFRleHR1cmVVbml0cyA9IDA7XG5cblx0XHR2YXIgbWF0ZXJpYWxQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIG1hdGVyaWFsICk7XG5cblx0XHRpZiAoIF9jbGlwcGluZ0VuYWJsZWQgKSB7XG5cblx0XHRcdGlmICggX2xvY2FsQ2xpcHBpbmdFbmFibGVkIHx8IGNhbWVyYSAhPT0gX2N1cnJlbnRDYW1lcmEgKSB7XG5cblx0XHRcdFx0dmFyIHVzZUNhY2hlID1cblx0XHRcdFx0XHRjYW1lcmEgPT09IF9jdXJyZW50Q2FtZXJhICYmXG5cdFx0XHRcdFx0bWF0ZXJpYWwuaWQgPT09IF9jdXJyZW50TWF0ZXJpYWxJZDtcblxuXHRcdFx0XHQvLyB3ZSBtaWdodCB3YW50IHRvIGNhbGwgdGhpcyBmdW5jdGlvbiB3aXRoIHNvbWUgQ2xpcHBpbmdHcm91cFxuXHRcdFx0XHQvLyBvYmplY3QgaW5zdGVhZCBvZiB0aGUgbWF0ZXJpYWwsIG9uY2UgaXQgYmVjb21lcyBmZWFzaWJsZVxuXHRcdFx0XHQvLyAoIzg0NjUsICM4Mzc5KVxuXHRcdFx0XHRfY2xpcHBpbmcuc2V0U3RhdGUoXG5cdFx0XHRcdFx0bWF0ZXJpYWwuY2xpcHBpbmdQbGFuZXMsIG1hdGVyaWFsLmNsaXBJbnRlcnNlY3Rpb24sIG1hdGVyaWFsLmNsaXBTaGFkb3dzLFxuXHRcdFx0XHRcdGNhbWVyYSwgbWF0ZXJpYWxQcm9wZXJ0aWVzLCB1c2VDYWNoZSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLm5lZWRzVXBkYXRlID09PSBmYWxzZSApIHtcblxuXHRcdFx0aWYgKCBtYXRlcmlhbFByb3BlcnRpZXMucHJvZ3JhbSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdG1hdGVyaWFsLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuZm9nICYmIG1hdGVyaWFsUHJvcGVydGllcy5mb2cgIT09IGZvZyApIHtcblxuXHRcdFx0XHRtYXRlcmlhbC5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLmxpZ2h0cyAmJiBtYXRlcmlhbFByb3BlcnRpZXMubGlnaHRzSGFzaCAhPT0gX2xpZ2h0cy5oYXNoICkge1xuXG5cdFx0XHRcdG1hdGVyaWFsLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0fSBlbHNlIGlmICggbWF0ZXJpYWxQcm9wZXJ0aWVzLm51bUNsaXBwaW5nUGxhbmVzICE9PSB1bmRlZmluZWQgJiZcblx0XHRcdFx0KCBtYXRlcmlhbFByb3BlcnRpZXMubnVtQ2xpcHBpbmdQbGFuZXMgIT09IF9jbGlwcGluZy5udW1QbGFuZXMgfHxcblx0XHRcdFx0bWF0ZXJpYWxQcm9wZXJ0aWVzLm51bUludGVyc2VjdGlvbiAhPT0gX2NsaXBwaW5nLm51bUludGVyc2VjdGlvbiApICkge1xuXG5cdFx0XHRcdG1hdGVyaWFsLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5uZWVkc1VwZGF0ZSApIHtcblxuXHRcdFx0aW5pdE1hdGVyaWFsKCBtYXRlcmlhbCwgZm9nLCBvYmplY3QgKTtcblx0XHRcdG1hdGVyaWFsLm5lZWRzVXBkYXRlID0gZmFsc2U7XG5cblx0XHR9XG5cblx0XHR2YXIgcmVmcmVzaFByb2dyYW0gPSBmYWxzZTtcblx0XHR2YXIgcmVmcmVzaE1hdGVyaWFsID0gZmFsc2U7XG5cdFx0dmFyIHJlZnJlc2hMaWdodHMgPSBmYWxzZTtcblxuXHRcdHZhciBwcm9ncmFtID0gbWF0ZXJpYWxQcm9wZXJ0aWVzLnByb2dyYW0sXG5cdFx0XHRwX3VuaWZvcm1zID0gcHJvZ3JhbS5nZXRVbmlmb3JtcygpLFxuXHRcdFx0bV91bmlmb3JtcyA9IG1hdGVyaWFsUHJvcGVydGllcy5fX3dlYmdsU2hhZGVyLnVuaWZvcm1zO1xuXG5cdFx0aWYgKCBwcm9ncmFtLmlkICE9PSBfY3VycmVudFByb2dyYW0gKSB7XG5cblx0XHRcdF9nbC51c2VQcm9ncmFtKCBwcm9ncmFtLnByb2dyYW0gKTtcblx0XHRcdF9jdXJyZW50UHJvZ3JhbSA9IHByb2dyYW0uaWQ7XG5cblx0XHRcdHJlZnJlc2hQcm9ncmFtID0gdHJ1ZTtcblx0XHRcdHJlZnJlc2hNYXRlcmlhbCA9IHRydWU7XG5cdFx0XHRyZWZyZXNoTGlnaHRzID0gdHJ1ZTtcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwuaWQgIT09IF9jdXJyZW50TWF0ZXJpYWxJZCApIHtcblxuXHRcdFx0X2N1cnJlbnRNYXRlcmlhbElkID0gbWF0ZXJpYWwuaWQ7XG5cblx0XHRcdHJlZnJlc2hNYXRlcmlhbCA9IHRydWU7XG5cblx0XHR9XG5cblx0XHRpZiAoIHJlZnJlc2hQcm9ncmFtIHx8IGNhbWVyYSAhPT0gX2N1cnJlbnRDYW1lcmEgKSB7XG5cblx0XHRcdHBfdW5pZm9ybXMuc2V0VmFsdWUoIF9nbCwgJ3Byb2plY3Rpb25NYXRyaXgnLCBjYW1lcmEucHJvamVjdGlvbk1hdHJpeCApO1xuXG5cdFx0XHRpZiAoIGNhcGFiaWxpdGllcy5sb2dhcml0aG1pY0RlcHRoQnVmZmVyICkge1xuXG5cdFx0XHRcdHBfdW5pZm9ybXMuc2V0VmFsdWUoIF9nbCwgJ2xvZ0RlcHRoQnVmRkMnLFxuXHRcdFx0XHRcdDIuMCAvICggTWF0aC5sb2coIGNhbWVyYS5mYXIgKyAxLjAgKSAvIE1hdGguTE4yICkgKTtcblxuXHRcdFx0fVxuXG5cblx0XHRcdGlmICggY2FtZXJhICE9PSBfY3VycmVudENhbWVyYSApIHtcblxuXHRcdFx0XHRfY3VycmVudENhbWVyYSA9IGNhbWVyYTtcblxuXHRcdFx0XHQvLyBsaWdodGluZyB1bmlmb3JtcyBkZXBlbmQgb24gdGhlIGNhbWVyYSBzbyBlbmZvcmNlIGFuIHVwZGF0ZVxuXHRcdFx0XHQvLyBub3csIGluIGNhc2UgdGhpcyBtYXRlcmlhbCBzdXBwb3J0cyBsaWdodHMgLSBvciBsYXRlciwgd2hlblxuXHRcdFx0XHQvLyB0aGUgbmV4dCBtYXRlcmlhbCB0aGF0IGRvZXMgZ2V0cyBhY3RpdmF0ZWQ6XG5cblx0XHRcdFx0cmVmcmVzaE1hdGVyaWFsID0gdHJ1ZTtcdFx0Ly8gc2V0IHRvIHRydWUgb24gbWF0ZXJpYWwgY2hhbmdlXG5cdFx0XHRcdHJlZnJlc2hMaWdodHMgPSB0cnVlO1x0XHQvLyByZW1haW5zIHNldCB1bnRpbCB1cGRhdGUgZG9uZVxuXG5cdFx0XHR9XG5cblx0XHRcdC8vIGxvYWQgbWF0ZXJpYWwgc3BlY2lmaWMgdW5pZm9ybXNcblx0XHRcdC8vIChzaGFkZXIgbWF0ZXJpYWwgYWxzbyBnZXRzIHRoZW0gZm9yIHRoZSBzYWtlIG9mIGdlbmVyaWNpdHkpXG5cblx0XHRcdGlmICggbWF0ZXJpYWwuaXNTaGFkZXJNYXRlcmlhbCB8fFxuXHRcdFx0XHRtYXRlcmlhbC5pc01lc2hQaG9uZ01hdGVyaWFsIHx8XG5cdFx0XHRcdG1hdGVyaWFsLmlzTWVzaFN0YW5kYXJkTWF0ZXJpYWwgfHxcblx0XHRcdFx0bWF0ZXJpYWwuZW52TWFwICkge1xuXG5cdFx0XHRcdHZhciB1Q2FtUG9zID0gcF91bmlmb3Jtcy5tYXAuY2FtZXJhUG9zaXRpb247XG5cblx0XHRcdFx0aWYgKCB1Q2FtUG9zICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHR1Q2FtUG9zLnNldFZhbHVlKCBfZ2wsXG5cdFx0XHRcdFx0XHRfdmVjdG9yMy5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGNhbWVyYS5tYXRyaXhXb3JsZCApICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggbWF0ZXJpYWwuaXNNZXNoUGhvbmdNYXRlcmlhbCB8fFxuXHRcdFx0XHRtYXRlcmlhbC5pc01lc2hMYW1iZXJ0TWF0ZXJpYWwgfHxcblx0XHRcdFx0bWF0ZXJpYWwuaXNNZXNoQmFzaWNNYXRlcmlhbCB8fFxuXHRcdFx0XHRtYXRlcmlhbC5pc01lc2hTdGFuZGFyZE1hdGVyaWFsIHx8XG5cdFx0XHRcdG1hdGVyaWFsLmlzU2hhZGVyTWF0ZXJpYWwgfHxcblx0XHRcdFx0bWF0ZXJpYWwuc2tpbm5pbmcgKSB7XG5cblx0XHRcdFx0cF91bmlmb3Jtcy5zZXRWYWx1ZSggX2dsLCAndmlld01hdHJpeCcsIGNhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRwX3VuaWZvcm1zLnNldFZhbHVlKCBfZ2wsICd0b25lTWFwcGluZ0V4cG9zdXJlJywgX3RoaXMudG9uZU1hcHBpbmdFeHBvc3VyZSApO1xuXHRcdFx0cF91bmlmb3Jtcy5zZXRWYWx1ZSggX2dsLCAndG9uZU1hcHBpbmdXaGl0ZVBvaW50JywgX3RoaXMudG9uZU1hcHBpbmdXaGl0ZVBvaW50ICk7XG5cblx0XHR9XG5cblx0XHQvLyBza2lubmluZyB1bmlmb3JtcyBtdXN0IGJlIHNldCBldmVuIGlmIG1hdGVyaWFsIGRpZG4ndCBjaGFuZ2Vcblx0XHQvLyBhdXRvLXNldHRpbmcgb2YgdGV4dHVyZSB1bml0IGZvciBib25lIHRleHR1cmUgbXVzdCBnbyBiZWZvcmUgb3RoZXIgdGV4dHVyZXNcblx0XHQvLyBub3Qgc3VyZSB3aHksIGJ1dCBvdGhlcndpc2Ugd2VpcmQgdGhpbmdzIGhhcHBlblxuXG5cdFx0aWYgKCBtYXRlcmlhbC5za2lubmluZyApIHtcblxuXHRcdFx0cF91bmlmb3Jtcy5zZXRPcHRpb25hbCggX2dsLCBvYmplY3QsICdiaW5kTWF0cml4JyApO1xuXHRcdFx0cF91bmlmb3Jtcy5zZXRPcHRpb25hbCggX2dsLCBvYmplY3QsICdiaW5kTWF0cml4SW52ZXJzZScgKTtcblxuXHRcdFx0dmFyIHNrZWxldG9uID0gb2JqZWN0LnNrZWxldG9uO1xuXG5cdFx0XHRpZiAoIHNrZWxldG9uICkge1xuXG5cdFx0XHRcdHZhciBib25lcyA9IHNrZWxldG9uLmJvbmVzO1xuXG5cdFx0XHRcdGlmICggY2FwYWJpbGl0aWVzLmZsb2F0VmVydGV4VGV4dHVyZXMgKSB7XG5cblx0XHRcdFx0XHRpZiAoIHNrZWxldG9uLmJvbmVUZXh0dXJlID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRcdC8vIGxheW91dCAoMSBtYXRyaXggPSA0IHBpeGVscylcblx0XHRcdFx0XHRcdC8vICAgICAgUkdCQSBSR0JBIFJHQkEgUkdCQSAoPT4gY29sdW1uMSwgY29sdW1uMiwgY29sdW1uMywgY29sdW1uNClcblx0XHRcdFx0XHRcdC8vICB3aXRoICA4eDggIHBpeGVsIHRleHR1cmUgbWF4ICAgMTYgYm9uZXMgKiA0IHBpeGVscyA9ICAoOCAqIDgpXG5cdFx0XHRcdFx0XHQvLyAgICAgICAxNngxNiBwaXhlbCB0ZXh0dXJlIG1heCAgIDY0IGJvbmVzICogNCBwaXhlbHMgPSAoMTYgKiAxNilcblx0XHRcdFx0XHRcdC8vICAgICAgIDMyeDMyIHBpeGVsIHRleHR1cmUgbWF4ICAyNTYgYm9uZXMgKiA0IHBpeGVscyA9ICgzMiAqIDMyKVxuXHRcdFx0XHRcdFx0Ly8gICAgICAgNjR4NjQgcGl4ZWwgdGV4dHVyZSBtYXggMTAyNCBib25lcyAqIDQgcGl4ZWxzID0gKDY0ICogNjQpXG5cblxuXHRcdFx0XHRcdFx0dmFyIHNpemUgPSBNYXRoLnNxcnQoIGJvbmVzLmxlbmd0aCAqIDQgKTsgLy8gNCBwaXhlbHMgbmVlZGVkIGZvciAxIG1hdHJpeFxuXHRcdFx0XHRcdFx0c2l6ZSA9IF9NYXRoLm5leHRQb3dlck9mVHdvKCBNYXRoLmNlaWwoIHNpemUgKSApO1xuXHRcdFx0XHRcdFx0c2l6ZSA9IE1hdGgubWF4KCBzaXplLCA0ICk7XG5cblx0XHRcdFx0XHRcdHZhciBib25lTWF0cmljZXMgPSBuZXcgRmxvYXQzMkFycmF5KCBzaXplICogc2l6ZSAqIDQgKTsgLy8gNCBmbG9hdHMgcGVyIFJHQkEgcGl4ZWxcblx0XHRcdFx0XHRcdGJvbmVNYXRyaWNlcy5zZXQoIHNrZWxldG9uLmJvbmVNYXRyaWNlcyApOyAvLyBjb3B5IGN1cnJlbnQgdmFsdWVzXG5cblx0XHRcdFx0XHRcdHZhciBib25lVGV4dHVyZSA9IG5ldyBEYXRhVGV4dHVyZSggYm9uZU1hdHJpY2VzLCBzaXplLCBzaXplLCBSR0JBRm9ybWF0LCBGbG9hdFR5cGUgKTtcblxuXHRcdFx0XHRcdFx0c2tlbGV0b24uYm9uZU1hdHJpY2VzID0gYm9uZU1hdHJpY2VzO1xuXHRcdFx0XHRcdFx0c2tlbGV0b24uYm9uZVRleHR1cmUgPSBib25lVGV4dHVyZTtcblx0XHRcdFx0XHRcdHNrZWxldG9uLmJvbmVUZXh0dXJlU2l6ZSA9IHNpemU7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRwX3VuaWZvcm1zLnNldFZhbHVlKCBfZ2wsICdib25lVGV4dHVyZScsIHNrZWxldG9uLmJvbmVUZXh0dXJlICk7XG5cdFx0XHRcdFx0cF91bmlmb3Jtcy5zZXRWYWx1ZSggX2dsLCAnYm9uZVRleHR1cmVTaXplJywgc2tlbGV0b24uYm9uZVRleHR1cmVTaXplICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHBfdW5pZm9ybXMuc2V0T3B0aW9uYWwoIF9nbCwgc2tlbGV0b24sICdib25lTWF0cmljZXMnICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIHJlZnJlc2hNYXRlcmlhbCApIHtcblxuXHRcdFx0aWYgKCBtYXRlcmlhbC5saWdodHMgKSB7XG5cblx0XHRcdFx0Ly8gdGhlIGN1cnJlbnQgbWF0ZXJpYWwgcmVxdWlyZXMgbGlnaHRpbmcgaW5mb1xuXG5cdFx0XHRcdC8vIG5vdGU6IGFsbCBsaWdodGluZyB1bmlmb3JtcyBhcmUgYWx3YXlzIHNldCBjb3JyZWN0bHlcblx0XHRcdFx0Ly8gdGhleSBzaW1wbHkgcmVmZXJlbmNlIHRoZSByZW5kZXJlcidzIHN0YXRlIGZvciB0aGVpclxuXHRcdFx0XHQvLyB2YWx1ZXNcblx0XHRcdFx0Ly9cblx0XHRcdFx0Ly8gdXNlIHRoZSBjdXJyZW50IG1hdGVyaWFsJ3MgLm5lZWRzVXBkYXRlIGZsYWdzIHRvIHNldFxuXHRcdFx0XHQvLyB0aGUgR0wgc3RhdGUgd2hlbiByZXF1aXJlZFxuXG5cdFx0XHRcdG1hcmtVbmlmb3Jtc0xpZ2h0c05lZWRzVXBkYXRlKCBtX3VuaWZvcm1zLCByZWZyZXNoTGlnaHRzICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gcmVmcmVzaCB1bmlmb3JtcyBjb21tb24gdG8gc2V2ZXJhbCBtYXRlcmlhbHNcblxuXHRcdFx0aWYgKCBmb2cgJiYgbWF0ZXJpYWwuZm9nICkge1xuXG5cdFx0XHRcdHJlZnJlc2hVbmlmb3Jtc0ZvZyggbV91bmlmb3JtcywgZm9nICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBtYXRlcmlhbC5pc01lc2hCYXNpY01hdGVyaWFsIHx8XG5cdFx0XHRcdG1hdGVyaWFsLmlzTWVzaExhbWJlcnRNYXRlcmlhbCB8fFxuXHRcdFx0XHRtYXRlcmlhbC5pc01lc2hQaG9uZ01hdGVyaWFsIHx8XG5cdFx0XHRcdG1hdGVyaWFsLmlzTWVzaFN0YW5kYXJkTWF0ZXJpYWwgfHxcblx0XHRcdFx0bWF0ZXJpYWwuaXNNZXNoTm9ybWFsTWF0ZXJpYWwgfHxcblx0XHRcdFx0bWF0ZXJpYWwuaXNNZXNoRGVwdGhNYXRlcmlhbCApIHtcblxuXHRcdFx0XHRyZWZyZXNoVW5pZm9ybXNDb21tb24oIG1fdW5pZm9ybXMsIG1hdGVyaWFsICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gcmVmcmVzaCBzaW5nbGUgbWF0ZXJpYWwgc3BlY2lmaWMgdW5pZm9ybXNcblxuXHRcdFx0aWYgKCBtYXRlcmlhbC5pc0xpbmVCYXNpY01hdGVyaWFsICkge1xuXG5cdFx0XHRcdHJlZnJlc2hVbmlmb3Jtc0xpbmUoIG1fdW5pZm9ybXMsIG1hdGVyaWFsICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLmlzTGluZURhc2hlZE1hdGVyaWFsICkge1xuXG5cdFx0XHRcdHJlZnJlc2hVbmlmb3Jtc0xpbmUoIG1fdW5pZm9ybXMsIG1hdGVyaWFsICk7XG5cdFx0XHRcdHJlZnJlc2hVbmlmb3Jtc0Rhc2goIG1fdW5pZm9ybXMsIG1hdGVyaWFsICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLmlzUG9pbnRzTWF0ZXJpYWwgKSB7XG5cblx0XHRcdFx0cmVmcmVzaFVuaWZvcm1zUG9pbnRzKCBtX3VuaWZvcm1zLCBtYXRlcmlhbCApO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC5pc01lc2hMYW1iZXJ0TWF0ZXJpYWwgKSB7XG5cblx0XHRcdFx0cmVmcmVzaFVuaWZvcm1zTGFtYmVydCggbV91bmlmb3JtcywgbWF0ZXJpYWwgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuaXNNZXNoVG9vbk1hdGVyaWFsICkge1xuXG5cdFx0XHRcdHJlZnJlc2hVbmlmb3Jtc1Rvb24oIG1fdW5pZm9ybXMsIG1hdGVyaWFsICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLmlzTWVzaFBob25nTWF0ZXJpYWwgKSB7XG5cblx0XHRcdFx0cmVmcmVzaFVuaWZvcm1zUGhvbmcoIG1fdW5pZm9ybXMsIG1hdGVyaWFsICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLmlzTWVzaFBoeXNpY2FsTWF0ZXJpYWwgKSB7XG5cblx0XHRcdFx0cmVmcmVzaFVuaWZvcm1zUGh5c2ljYWwoIG1fdW5pZm9ybXMsIG1hdGVyaWFsICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLmlzTWVzaFN0YW5kYXJkTWF0ZXJpYWwgKSB7XG5cblx0XHRcdFx0cmVmcmVzaFVuaWZvcm1zU3RhbmRhcmQoIG1fdW5pZm9ybXMsIG1hdGVyaWFsICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLmlzTWVzaERlcHRoTWF0ZXJpYWwgKSB7XG5cblx0XHRcdFx0aWYgKCBtYXRlcmlhbC5kaXNwbGFjZW1lbnRNYXAgKSB7XG5cblx0XHRcdFx0XHRtX3VuaWZvcm1zLmRpc3BsYWNlbWVudE1hcC52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcDtcblx0XHRcdFx0XHRtX3VuaWZvcm1zLmRpc3BsYWNlbWVudFNjYWxlLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50U2NhbGU7XG5cdFx0XHRcdFx0bV91bmlmb3Jtcy5kaXNwbGFjZW1lbnRCaWFzLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50QmlhcztcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLmlzTWVzaE5vcm1hbE1hdGVyaWFsICkge1xuXG5cdFx0XHRcdHJlZnJlc2hVbmlmb3Jtc05vcm1hbCggbV91bmlmb3JtcywgbWF0ZXJpYWwgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBSZWN0QXJlYUxpZ2h0IFRleHR1cmVcblx0XHRcdC8vIFRPRE8gKG1yZG9vYik6IEZpbmQgYSBuaWNlciBpbXBsZW1lbnRhdGlvblxuXG5cdFx0XHRpZiAoIG1fdW5pZm9ybXMubHRjTWF0ICE9PSB1bmRlZmluZWQgKSBtX3VuaWZvcm1zLmx0Y01hdC52YWx1ZSA9IFVuaWZvcm1zTGliLkxUQ19NQVRfVEVYVFVSRTtcblx0XHRcdGlmICggbV91bmlmb3Jtcy5sdGNNYWcgIT09IHVuZGVmaW5lZCApIG1fdW5pZm9ybXMubHRjTWFnLnZhbHVlID0gVW5pZm9ybXNMaWIuTFRDX01BR19URVhUVVJFO1xuXG5cdFx0XHRXZWJHTFVuaWZvcm1zLnVwbG9hZChcblx0XHRcdFx0X2dsLCBtYXRlcmlhbFByb3BlcnRpZXMudW5pZm9ybXNMaXN0LCBtX3VuaWZvcm1zLCBfdGhpcyApO1xuXG5cdFx0fVxuXG5cblx0XHQvLyBjb21tb24gbWF0cmljZXNcblxuXHRcdHBfdW5pZm9ybXMuc2V0VmFsdWUoIF9nbCwgJ21vZGVsVmlld01hdHJpeCcsIG9iamVjdC5tb2RlbFZpZXdNYXRyaXggKTtcblx0XHRwX3VuaWZvcm1zLnNldFZhbHVlKCBfZ2wsICdub3JtYWxNYXRyaXgnLCBvYmplY3Qubm9ybWFsTWF0cml4ICk7XG5cdFx0cF91bmlmb3Jtcy5zZXRWYWx1ZSggX2dsLCAnbW9kZWxNYXRyaXgnLCBvYmplY3QubWF0cml4V29ybGQgKTtcblxuXHRcdHJldHVybiBwcm9ncmFtO1xuXG5cdH1cblxuXHQvLyBVbmlmb3JtcyAocmVmcmVzaCB1bmlmb3JtcyBvYmplY3RzKVxuXG5cdGZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc0NvbW1vbiggdW5pZm9ybXMsIG1hdGVyaWFsICkge1xuXG5cdFx0dW5pZm9ybXMub3BhY2l0eS52YWx1ZSA9IG1hdGVyaWFsLm9wYWNpdHk7XG5cblx0XHR1bmlmb3Jtcy5kaWZmdXNlLnZhbHVlID0gbWF0ZXJpYWwuY29sb3I7XG5cblx0XHRpZiAoIG1hdGVyaWFsLmVtaXNzaXZlICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5lbWlzc2l2ZS52YWx1ZS5jb3B5KCBtYXRlcmlhbC5lbWlzc2l2ZSApLm11bHRpcGx5U2NhbGFyKCBtYXRlcmlhbC5lbWlzc2l2ZUludGVuc2l0eSApO1xuXG5cdFx0fVxuXG5cdFx0dW5pZm9ybXMubWFwLnZhbHVlID0gbWF0ZXJpYWwubWFwO1xuXHRcdHVuaWZvcm1zLnNwZWN1bGFyTWFwLnZhbHVlID0gbWF0ZXJpYWwuc3BlY3VsYXJNYXA7XG5cdFx0dW5pZm9ybXMuYWxwaGFNYXAudmFsdWUgPSBtYXRlcmlhbC5hbHBoYU1hcDtcblxuXHRcdGlmICggbWF0ZXJpYWwubGlnaHRNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmxpZ2h0TWFwLnZhbHVlID0gbWF0ZXJpYWwubGlnaHRNYXA7XG5cdFx0XHR1bmlmb3Jtcy5saWdodE1hcEludGVuc2l0eS52YWx1ZSA9IG1hdGVyaWFsLmxpZ2h0TWFwSW50ZW5zaXR5O1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5hb01hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMuYW9NYXAudmFsdWUgPSBtYXRlcmlhbC5hb01hcDtcblx0XHRcdHVuaWZvcm1zLmFvTWFwSW50ZW5zaXR5LnZhbHVlID0gbWF0ZXJpYWwuYW9NYXBJbnRlbnNpdHk7XG5cblx0XHR9XG5cblx0XHQvLyB1diByZXBlYXQgYW5kIG9mZnNldCBzZXR0aW5nIHByaW9yaXRpZXNcblx0XHQvLyAxLiBjb2xvciBtYXBcblx0XHQvLyAyLiBzcGVjdWxhciBtYXBcblx0XHQvLyAzLiBub3JtYWwgbWFwXG5cdFx0Ly8gNC4gYnVtcCBtYXBcblx0XHQvLyA1LiBhbHBoYSBtYXBcblx0XHQvLyA2LiBlbWlzc2l2ZSBtYXBcblxuXHRcdHZhciB1dlNjYWxlTWFwO1xuXG5cdFx0aWYgKCBtYXRlcmlhbC5tYXAgKSB7XG5cblx0XHRcdHV2U2NhbGVNYXAgPSBtYXRlcmlhbC5tYXA7XG5cblx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC5zcGVjdWxhck1hcCApIHtcblxuXHRcdFx0dXZTY2FsZU1hcCA9IG1hdGVyaWFsLnNwZWN1bGFyTWFwO1xuXG5cdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwICkge1xuXG5cdFx0XHR1dlNjYWxlTWFwID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwO1xuXG5cdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwubm9ybWFsTWFwICkge1xuXG5cdFx0XHR1dlNjYWxlTWFwID0gbWF0ZXJpYWwubm9ybWFsTWFwO1xuXG5cdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuYnVtcE1hcCApIHtcblxuXHRcdFx0dXZTY2FsZU1hcCA9IG1hdGVyaWFsLmJ1bXBNYXA7XG5cblx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC5yb3VnaG5lc3NNYXAgKSB7XG5cblx0XHRcdHV2U2NhbGVNYXAgPSBtYXRlcmlhbC5yb3VnaG5lc3NNYXA7XG5cblx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC5tZXRhbG5lc3NNYXAgKSB7XG5cblx0XHRcdHV2U2NhbGVNYXAgPSBtYXRlcmlhbC5tZXRhbG5lc3NNYXA7XG5cblx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC5hbHBoYU1hcCApIHtcblxuXHRcdFx0dXZTY2FsZU1hcCA9IG1hdGVyaWFsLmFscGhhTWFwO1xuXG5cdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuZW1pc3NpdmVNYXAgKSB7XG5cblx0XHRcdHV2U2NhbGVNYXAgPSBtYXRlcmlhbC5lbWlzc2l2ZU1hcDtcblxuXHRcdH1cblxuXHRcdGlmICggdXZTY2FsZU1hcCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHQvLyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuXHRcdFx0aWYgKCB1dlNjYWxlTWFwLmlzV2ViR0xSZW5kZXJUYXJnZXQgKSB7XG5cblx0XHRcdFx0dXZTY2FsZU1hcCA9IHV2U2NhbGVNYXAudGV4dHVyZTtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgb2Zmc2V0ID0gdXZTY2FsZU1hcC5vZmZzZXQ7XG5cdFx0XHR2YXIgcmVwZWF0ID0gdXZTY2FsZU1hcC5yZXBlYXQ7XG5cblx0XHRcdHVuaWZvcm1zLm9mZnNldFJlcGVhdC52YWx1ZS5zZXQoIG9mZnNldC54LCBvZmZzZXQueSwgcmVwZWF0LngsIHJlcGVhdC55ICk7XG5cblx0XHR9XG5cblx0XHR1bmlmb3Jtcy5lbnZNYXAudmFsdWUgPSBtYXRlcmlhbC5lbnZNYXA7XG5cblx0XHQvLyBkb24ndCBmbGlwIEN1YmVUZXh0dXJlIGVudk1hcHMsIGZsaXAgZXZlcnl0aGluZyBlbHNlOlxuXHRcdC8vICBXZWJHTFJlbmRlclRhcmdldEN1YmUgd2lsbCBiZSBmbGlwcGVkIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuXHRcdC8vICBXZWJHTFJlbmRlclRhcmdldEN1YmUudGV4dHVyZSB3aWxsIGJlIGZsaXBwZWQgYmVjYXVzZSBpdCdzIGEgVGV4dHVyZSBhbmQgTk9UIGEgQ3ViZVRleHR1cmVcblx0XHQvLyB0aGlzIGNoZWNrIG11c3QgYmUgaGFuZGxlZCBkaWZmZXJlbnRseSwgb3IgcmVtb3ZlZCBlbnRpcmVseSwgaWYgV2ViR0xSZW5kZXJUYXJnZXRDdWJlIHVzZXMgYSBDdWJlVGV4dHVyZSBpbiB0aGUgZnV0dXJlXG5cdFx0dW5pZm9ybXMuZmxpcEVudk1hcC52YWx1ZSA9ICggISAoIG1hdGVyaWFsLmVudk1hcCAmJiBtYXRlcmlhbC5lbnZNYXAuaXNDdWJlVGV4dHVyZSApICkgPyAxIDogLSAxO1xuXG5cdFx0dW5pZm9ybXMucmVmbGVjdGl2aXR5LnZhbHVlID0gbWF0ZXJpYWwucmVmbGVjdGl2aXR5O1xuXHRcdHVuaWZvcm1zLnJlZnJhY3Rpb25SYXRpby52YWx1ZSA9IG1hdGVyaWFsLnJlZnJhY3Rpb25SYXRpbztcblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVmcmVzaFVuaWZvcm1zTGluZSggdW5pZm9ybXMsIG1hdGVyaWFsICkge1xuXG5cdFx0dW5pZm9ybXMuZGlmZnVzZS52YWx1ZSA9IG1hdGVyaWFsLmNvbG9yO1xuXHRcdHVuaWZvcm1zLm9wYWNpdHkudmFsdWUgPSBtYXRlcmlhbC5vcGFjaXR5O1xuXG5cdH1cblxuXHRmdW5jdGlvbiByZWZyZXNoVW5pZm9ybXNEYXNoKCB1bmlmb3JtcywgbWF0ZXJpYWwgKSB7XG5cblx0XHR1bmlmb3Jtcy5kYXNoU2l6ZS52YWx1ZSA9IG1hdGVyaWFsLmRhc2hTaXplO1xuXHRcdHVuaWZvcm1zLnRvdGFsU2l6ZS52YWx1ZSA9IG1hdGVyaWFsLmRhc2hTaXplICsgbWF0ZXJpYWwuZ2FwU2l6ZTtcblx0XHR1bmlmb3Jtcy5zY2FsZS52YWx1ZSA9IG1hdGVyaWFsLnNjYWxlO1xuXG5cdH1cblxuXHRmdW5jdGlvbiByZWZyZXNoVW5pZm9ybXNQb2ludHMoIHVuaWZvcm1zLCBtYXRlcmlhbCApIHtcblxuXHRcdHVuaWZvcm1zLmRpZmZ1c2UudmFsdWUgPSBtYXRlcmlhbC5jb2xvcjtcblx0XHR1bmlmb3Jtcy5vcGFjaXR5LnZhbHVlID0gbWF0ZXJpYWwub3BhY2l0eTtcblx0XHR1bmlmb3Jtcy5zaXplLnZhbHVlID0gbWF0ZXJpYWwuc2l6ZSAqIF9waXhlbFJhdGlvO1xuXHRcdHVuaWZvcm1zLnNjYWxlLnZhbHVlID0gX2hlaWdodCAqIDAuNTtcblxuXHRcdHVuaWZvcm1zLm1hcC52YWx1ZSA9IG1hdGVyaWFsLm1hcDtcblxuXHRcdGlmICggbWF0ZXJpYWwubWFwICE9PSBudWxsICkge1xuXG5cdFx0XHR2YXIgb2Zmc2V0ID0gbWF0ZXJpYWwubWFwLm9mZnNldDtcblx0XHRcdHZhciByZXBlYXQgPSBtYXRlcmlhbC5tYXAucmVwZWF0O1xuXG5cdFx0XHR1bmlmb3Jtcy5vZmZzZXRSZXBlYXQudmFsdWUuc2V0KCBvZmZzZXQueCwgb2Zmc2V0LnksIHJlcGVhdC54LCByZXBlYXQueSApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiByZWZyZXNoVW5pZm9ybXNGb2coIHVuaWZvcm1zLCBmb2cgKSB7XG5cblx0XHR1bmlmb3Jtcy5mb2dDb2xvci52YWx1ZSA9IGZvZy5jb2xvcjtcblxuXHRcdGlmICggZm9nLmlzRm9nICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5mb2dOZWFyLnZhbHVlID0gZm9nLm5lYXI7XG5cdFx0XHR1bmlmb3Jtcy5mb2dGYXIudmFsdWUgPSBmb2cuZmFyO1xuXG5cdFx0fSBlbHNlIGlmICggZm9nLmlzRm9nRXhwMiApIHtcblxuXHRcdFx0dW5pZm9ybXMuZm9nRGVuc2l0eS52YWx1ZSA9IGZvZy5kZW5zaXR5O1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiByZWZyZXNoVW5pZm9ybXNMYW1iZXJ0KCB1bmlmb3JtcywgbWF0ZXJpYWwgKSB7XG5cblx0XHRpZiAoIG1hdGVyaWFsLmVtaXNzaXZlTWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5lbWlzc2l2ZU1hcC52YWx1ZSA9IG1hdGVyaWFsLmVtaXNzaXZlTWFwO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiByZWZyZXNoVW5pZm9ybXNQaG9uZyggdW5pZm9ybXMsIG1hdGVyaWFsICkge1xuXG5cdFx0dW5pZm9ybXMuc3BlY3VsYXIudmFsdWUgPSBtYXRlcmlhbC5zcGVjdWxhcjtcblx0XHR1bmlmb3Jtcy5zaGluaW5lc3MudmFsdWUgPSBNYXRoLm1heCggbWF0ZXJpYWwuc2hpbmluZXNzLCAxZS00ICk7IC8vIHRvIHByZXZlbnQgcG93KCAwLjAsIDAuMCApXG5cblx0XHRpZiAoIG1hdGVyaWFsLmVtaXNzaXZlTWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5lbWlzc2l2ZU1hcC52YWx1ZSA9IG1hdGVyaWFsLmVtaXNzaXZlTWFwO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5idW1wTWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5idW1wTWFwLnZhbHVlID0gbWF0ZXJpYWwuYnVtcE1hcDtcblx0XHRcdHVuaWZvcm1zLmJ1bXBTY2FsZS52YWx1ZSA9IG1hdGVyaWFsLmJ1bXBTY2FsZTtcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwubm9ybWFsTWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5ub3JtYWxNYXAudmFsdWUgPSBtYXRlcmlhbC5ub3JtYWxNYXA7XG5cdFx0XHR1bmlmb3Jtcy5ub3JtYWxTY2FsZS52YWx1ZS5jb3B5KCBtYXRlcmlhbC5ub3JtYWxTY2FsZSApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5kaXNwbGFjZW1lbnRNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmRpc3BsYWNlbWVudE1hcC52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcDtcblx0XHRcdHVuaWZvcm1zLmRpc3BsYWNlbWVudFNjYWxlLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50U2NhbGU7XG5cdFx0XHR1bmlmb3Jtcy5kaXNwbGFjZW1lbnRCaWFzLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50QmlhcztcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVmcmVzaFVuaWZvcm1zVG9vbiggdW5pZm9ybXMsIG1hdGVyaWFsICkge1xuXG5cdFx0cmVmcmVzaFVuaWZvcm1zUGhvbmcoIHVuaWZvcm1zLCBtYXRlcmlhbCApO1xuXG5cdFx0aWYgKCBtYXRlcmlhbC5ncmFkaWVudE1hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMuZ3JhZGllbnRNYXAudmFsdWUgPSBtYXRlcmlhbC5ncmFkaWVudE1hcDtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVmcmVzaFVuaWZvcm1zU3RhbmRhcmQoIHVuaWZvcm1zLCBtYXRlcmlhbCApIHtcblxuXHRcdHVuaWZvcm1zLnJvdWdobmVzcy52YWx1ZSA9IG1hdGVyaWFsLnJvdWdobmVzcztcblx0XHR1bmlmb3Jtcy5tZXRhbG5lc3MudmFsdWUgPSBtYXRlcmlhbC5tZXRhbG5lc3M7XG5cblx0XHRpZiAoIG1hdGVyaWFsLnJvdWdobmVzc01hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMucm91Z2huZXNzTWFwLnZhbHVlID0gbWF0ZXJpYWwucm91Z2huZXNzTWFwO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5tZXRhbG5lc3NNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLm1ldGFsbmVzc01hcC52YWx1ZSA9IG1hdGVyaWFsLm1ldGFsbmVzc01hcDtcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwuZW1pc3NpdmVNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmVtaXNzaXZlTWFwLnZhbHVlID0gbWF0ZXJpYWwuZW1pc3NpdmVNYXA7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLmJ1bXBNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmJ1bXBNYXAudmFsdWUgPSBtYXRlcmlhbC5idW1wTWFwO1xuXHRcdFx0dW5pZm9ybXMuYnVtcFNjYWxlLnZhbHVlID0gbWF0ZXJpYWwuYnVtcFNjYWxlO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5ub3JtYWxNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLm5vcm1hbE1hcC52YWx1ZSA9IG1hdGVyaWFsLm5vcm1hbE1hcDtcblx0XHRcdHVuaWZvcm1zLm5vcm1hbFNjYWxlLnZhbHVlLmNvcHkoIG1hdGVyaWFsLm5vcm1hbFNjYWxlICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMuZGlzcGxhY2VtZW50TWFwLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwO1xuXHRcdFx0dW5pZm9ybXMuZGlzcGxhY2VtZW50U2NhbGUudmFsdWUgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRTY2FsZTtcblx0XHRcdHVuaWZvcm1zLmRpc3BsYWNlbWVudEJpYXMudmFsdWUgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRCaWFzO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5lbnZNYXAgKSB7XG5cblx0XHRcdC8vdW5pZm9ybXMuZW52TWFwLnZhbHVlID0gbWF0ZXJpYWwuZW52TWFwOyAvLyBwYXJ0IG9mIHVuaWZvcm1zIGNvbW1vblxuXHRcdFx0dW5pZm9ybXMuZW52TWFwSW50ZW5zaXR5LnZhbHVlID0gbWF0ZXJpYWwuZW52TWFwSW50ZW5zaXR5O1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiByZWZyZXNoVW5pZm9ybXNQaHlzaWNhbCggdW5pZm9ybXMsIG1hdGVyaWFsICkge1xuXG5cdFx0dW5pZm9ybXMuY2xlYXJDb2F0LnZhbHVlID0gbWF0ZXJpYWwuY2xlYXJDb2F0O1xuXHRcdHVuaWZvcm1zLmNsZWFyQ29hdFJvdWdobmVzcy52YWx1ZSA9IG1hdGVyaWFsLmNsZWFyQ29hdFJvdWdobmVzcztcblxuXHRcdHJlZnJlc2hVbmlmb3Jtc1N0YW5kYXJkKCB1bmlmb3JtcywgbWF0ZXJpYWwgKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVmcmVzaFVuaWZvcm1zTm9ybWFsKCB1bmlmb3JtcywgbWF0ZXJpYWwgKSB7XG5cblx0XHRpZiAoIG1hdGVyaWFsLmJ1bXBNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmJ1bXBNYXAudmFsdWUgPSBtYXRlcmlhbC5idW1wTWFwO1xuXHRcdFx0dW5pZm9ybXMuYnVtcFNjYWxlLnZhbHVlID0gbWF0ZXJpYWwuYnVtcFNjYWxlO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5ub3JtYWxNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLm5vcm1hbE1hcC52YWx1ZSA9IG1hdGVyaWFsLm5vcm1hbE1hcDtcblx0XHRcdHVuaWZvcm1zLm5vcm1hbFNjYWxlLnZhbHVlLmNvcHkoIG1hdGVyaWFsLm5vcm1hbFNjYWxlICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMuZGlzcGxhY2VtZW50TWFwLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwO1xuXHRcdFx0dW5pZm9ybXMuZGlzcGxhY2VtZW50U2NhbGUudmFsdWUgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRTY2FsZTtcblx0XHRcdHVuaWZvcm1zLmRpc3BsYWNlbWVudEJpYXMudmFsdWUgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRCaWFzO1xuXG5cdFx0fVxuXG5cdH1cblxuXHQvLyBJZiB1bmlmb3JtcyBhcmUgbWFya2VkIGFzIGNsZWFuLCB0aGV5IGRvbid0IG5lZWQgdG8gYmUgbG9hZGVkIHRvIHRoZSBHUFUuXG5cblx0ZnVuY3Rpb24gbWFya1VuaWZvcm1zTGlnaHRzTmVlZHNVcGRhdGUoIHVuaWZvcm1zLCB2YWx1ZSApIHtcblxuXHRcdHVuaWZvcm1zLmFtYmllbnRMaWdodENvbG9yLm5lZWRzVXBkYXRlID0gdmFsdWU7XG5cblx0XHR1bmlmb3Jtcy5kaXJlY3Rpb25hbExpZ2h0cy5uZWVkc1VwZGF0ZSA9IHZhbHVlO1xuXHRcdHVuaWZvcm1zLnBvaW50TGlnaHRzLm5lZWRzVXBkYXRlID0gdmFsdWU7XG5cdFx0dW5pZm9ybXMuc3BvdExpZ2h0cy5uZWVkc1VwZGF0ZSA9IHZhbHVlO1xuXHRcdHVuaWZvcm1zLnJlY3RBcmVhTGlnaHRzLm5lZWRzVXBkYXRlID0gdmFsdWU7XG5cdFx0dW5pZm9ybXMuaGVtaXNwaGVyZUxpZ2h0cy5uZWVkc1VwZGF0ZSA9IHZhbHVlO1xuXG5cdH1cblxuXHQvLyBMaWdodGluZ1xuXG5cdGZ1bmN0aW9uIHNldHVwU2hhZG93cyggbGlnaHRzICkge1xuXG5cdFx0dmFyIGxpZ2h0U2hhZG93c0xlbmd0aCA9IDA7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBsaWdodHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGxpZ2h0ID0gbGlnaHRzWyBpIF07XG5cblx0XHRcdGlmICggbGlnaHQuY2FzdFNoYWRvdyApIHtcblxuXHRcdFx0XHRfbGlnaHRzLnNoYWRvd3NbIGxpZ2h0U2hhZG93c0xlbmd0aCBdID0gbGlnaHQ7XG5cdFx0XHRcdGxpZ2h0U2hhZG93c0xlbmd0aCArKztcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0X2xpZ2h0cy5zaGFkb3dzLmxlbmd0aCA9IGxpZ2h0U2hhZG93c0xlbmd0aDtcblxuXHR9XG5cblx0ZnVuY3Rpb24gc2V0dXBMaWdodHMoIGxpZ2h0cywgY2FtZXJhICkge1xuXG5cdFx0dmFyIGwsIGxsLCBsaWdodCwgc2hhZG93LFxuXHRcdFx0ciA9IDAsIGcgPSAwLCBiID0gMCxcblx0XHRcdGNvbG9yLFxuXHRcdFx0aW50ZW5zaXR5LFxuXHRcdFx0ZGlzdGFuY2UsXG5cdFx0XHRzaGFkb3dNYXAsXG5cblx0XHRcdHZpZXdNYXRyaXggPSBjYW1lcmEubWF0cml4V29ybGRJbnZlcnNlLFxuXG5cdFx0XHRkaXJlY3Rpb25hbExlbmd0aCA9IDAsXG5cdFx0XHRwb2ludExlbmd0aCA9IDAsXG5cdFx0XHRzcG90TGVuZ3RoID0gMCxcblx0XHRcdHJlY3RBcmVhTGVuZ3RoID0gMCxcblx0XHRcdGhlbWlMZW5ndGggPSAwO1xuXG5cdFx0Zm9yICggbCA9IDAsIGxsID0gbGlnaHRzLmxlbmd0aDsgbCA8IGxsOyBsICsrICkge1xuXG5cdFx0XHRsaWdodCA9IGxpZ2h0c1sgbCBdO1xuXG5cdFx0XHRjb2xvciA9IGxpZ2h0LmNvbG9yO1xuXHRcdFx0aW50ZW5zaXR5ID0gbGlnaHQuaW50ZW5zaXR5O1xuXHRcdFx0ZGlzdGFuY2UgPSBsaWdodC5kaXN0YW5jZTtcblxuXHRcdFx0c2hhZG93TWFwID0gKCBsaWdodC5zaGFkb3cgJiYgbGlnaHQuc2hhZG93Lm1hcCApID8gbGlnaHQuc2hhZG93Lm1hcC50ZXh0dXJlIDogbnVsbDtcblxuXHRcdFx0aWYgKCBsaWdodC5pc0FtYmllbnRMaWdodCApIHtcblxuXHRcdFx0XHRyICs9IGNvbG9yLnIgKiBpbnRlbnNpdHk7XG5cdFx0XHRcdGcgKz0gY29sb3IuZyAqIGludGVuc2l0eTtcblx0XHRcdFx0YiArPSBjb2xvci5iICogaW50ZW5zaXR5O1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBsaWdodC5pc0RpcmVjdGlvbmFsTGlnaHQgKSB7XG5cblx0XHRcdFx0dmFyIHVuaWZvcm1zID0gbGlnaHRDYWNoZS5nZXQoIGxpZ2h0ICk7XG5cblx0XHRcdFx0dW5pZm9ybXMuY29sb3IuY29weSggbGlnaHQuY29sb3IgKS5tdWx0aXBseVNjYWxhciggbGlnaHQuaW50ZW5zaXR5ICk7XG5cdFx0XHRcdHVuaWZvcm1zLmRpcmVjdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGxpZ2h0Lm1hdHJpeFdvcmxkICk7XG5cdFx0XHRcdF92ZWN0b3IzLnNldEZyb21NYXRyaXhQb3NpdGlvbiggbGlnaHQudGFyZ2V0Lm1hdHJpeFdvcmxkICk7XG5cdFx0XHRcdHVuaWZvcm1zLmRpcmVjdGlvbi5zdWIoIF92ZWN0b3IzICk7XG5cdFx0XHRcdHVuaWZvcm1zLmRpcmVjdGlvbi50cmFuc2Zvcm1EaXJlY3Rpb24oIHZpZXdNYXRyaXggKTtcblxuXHRcdFx0XHR1bmlmb3Jtcy5zaGFkb3cgPSBsaWdodC5jYXN0U2hhZG93O1xuXG5cdFx0XHRcdGlmICggbGlnaHQuY2FzdFNoYWRvdyApIHtcblxuXHRcdFx0XHRcdHNoYWRvdyA9IGxpZ2h0LnNoYWRvdztcblxuXHRcdFx0XHRcdHVuaWZvcm1zLnNoYWRvd0JpYXMgPSBzaGFkb3cuYmlhcztcblx0XHRcdFx0XHR1bmlmb3Jtcy5zaGFkb3dSYWRpdXMgPSBzaGFkb3cucmFkaXVzO1xuXHRcdFx0XHRcdHVuaWZvcm1zLnNoYWRvd01hcFNpemUgPSBzaGFkb3cubWFwU2l6ZTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0X2xpZ2h0cy5kaXJlY3Rpb25hbFNoYWRvd01hcFsgZGlyZWN0aW9uYWxMZW5ndGggXSA9IHNoYWRvd01hcDtcblx0XHRcdFx0X2xpZ2h0cy5kaXJlY3Rpb25hbFNoYWRvd01hdHJpeFsgZGlyZWN0aW9uYWxMZW5ndGggXSA9IGxpZ2h0LnNoYWRvdy5tYXRyaXg7XG5cdFx0XHRcdF9saWdodHMuZGlyZWN0aW9uYWxbIGRpcmVjdGlvbmFsTGVuZ3RoIF0gPSB1bmlmb3JtcztcblxuXHRcdFx0XHRkaXJlY3Rpb25hbExlbmd0aCArKztcblxuXHRcdFx0fSBlbHNlIGlmICggbGlnaHQuaXNTcG90TGlnaHQgKSB7XG5cblx0XHRcdFx0dmFyIHVuaWZvcm1zID0gbGlnaHRDYWNoZS5nZXQoIGxpZ2h0ICk7XG5cblx0XHRcdFx0dW5pZm9ybXMucG9zaXRpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBsaWdodC5tYXRyaXhXb3JsZCApO1xuXHRcdFx0XHR1bmlmb3Jtcy5wb3NpdGlvbi5hcHBseU1hdHJpeDQoIHZpZXdNYXRyaXggKTtcblxuXHRcdFx0XHR1bmlmb3Jtcy5jb2xvci5jb3B5KCBjb2xvciApLm11bHRpcGx5U2NhbGFyKCBpbnRlbnNpdHkgKTtcblx0XHRcdFx0dW5pZm9ybXMuZGlzdGFuY2UgPSBkaXN0YW5jZTtcblxuXHRcdFx0XHR1bmlmb3Jtcy5kaXJlY3Rpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBsaWdodC5tYXRyaXhXb3JsZCApO1xuXHRcdFx0XHRfdmVjdG9yMy5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGxpZ2h0LnRhcmdldC5tYXRyaXhXb3JsZCApO1xuXHRcdFx0XHR1bmlmb3Jtcy5kaXJlY3Rpb24uc3ViKCBfdmVjdG9yMyApO1xuXHRcdFx0XHR1bmlmb3Jtcy5kaXJlY3Rpb24udHJhbnNmb3JtRGlyZWN0aW9uKCB2aWV3TWF0cml4ICk7XG5cblx0XHRcdFx0dW5pZm9ybXMuY29uZUNvcyA9IE1hdGguY29zKCBsaWdodC5hbmdsZSApO1xuXHRcdFx0XHR1bmlmb3Jtcy5wZW51bWJyYUNvcyA9IE1hdGguY29zKCBsaWdodC5hbmdsZSAqICggMSAtIGxpZ2h0LnBlbnVtYnJhICkgKTtcblx0XHRcdFx0dW5pZm9ybXMuZGVjYXkgPSAoIGxpZ2h0LmRpc3RhbmNlID09PSAwICkgPyAwLjAgOiBsaWdodC5kZWNheTtcblxuXHRcdFx0XHR1bmlmb3Jtcy5zaGFkb3cgPSBsaWdodC5jYXN0U2hhZG93O1xuXG5cdFx0XHRcdGlmICggbGlnaHQuY2FzdFNoYWRvdyApIHtcblxuXHRcdFx0XHRcdHNoYWRvdyA9IGxpZ2h0LnNoYWRvdztcblxuXHRcdFx0XHRcdHVuaWZvcm1zLnNoYWRvd0JpYXMgPSBzaGFkb3cuYmlhcztcblx0XHRcdFx0XHR1bmlmb3Jtcy5zaGFkb3dSYWRpdXMgPSBzaGFkb3cucmFkaXVzO1xuXHRcdFx0XHRcdHVuaWZvcm1zLnNoYWRvd01hcFNpemUgPSBzaGFkb3cubWFwU2l6ZTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0X2xpZ2h0cy5zcG90U2hhZG93TWFwWyBzcG90TGVuZ3RoIF0gPSBzaGFkb3dNYXA7XG5cdFx0XHRcdF9saWdodHMuc3BvdFNoYWRvd01hdHJpeFsgc3BvdExlbmd0aCBdID0gbGlnaHQuc2hhZG93Lm1hdHJpeDtcblx0XHRcdFx0X2xpZ2h0cy5zcG90WyBzcG90TGVuZ3RoIF0gPSB1bmlmb3JtcztcblxuXHRcdFx0XHRzcG90TGVuZ3RoICsrO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBsaWdodC5pc1JlY3RBcmVhTGlnaHQgKSB7XG5cblx0XHRcdFx0dmFyIHVuaWZvcm1zID0gbGlnaHRDYWNoZS5nZXQoIGxpZ2h0ICk7XG5cblx0XHRcdFx0Ly8gKGEpIGludGVuc2l0eSBjb250cm9scyBpcnJhZGlhbmNlIG9mIGVudGlyZSBsaWdodFxuXHRcdFx0XHR1bmlmb3Jtcy5jb2xvclxuXHRcdFx0XHRcdC5jb3B5KCBjb2xvciApXG5cdFx0XHRcdFx0Lm11bHRpcGx5U2NhbGFyKCBpbnRlbnNpdHkgLyAoIGxpZ2h0LndpZHRoICogbGlnaHQuaGVpZ2h0ICkgKTtcblxuXHRcdFx0XHQvLyAoYikgaW50ZW5zaXR5IGNvbnRyb2xzIHRoZSByYWRpYW5jZSBwZXIgbGlnaHQgYXJlYVxuXHRcdFx0XHQvLyB1bmlmb3Jtcy5jb2xvci5jb3B5KCBjb2xvciApLm11bHRpcGx5U2NhbGFyKCBpbnRlbnNpdHkgKTtcblxuXHRcdFx0XHR1bmlmb3Jtcy5wb3NpdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGxpZ2h0Lm1hdHJpeFdvcmxkICk7XG5cdFx0XHRcdHVuaWZvcm1zLnBvc2l0aW9uLmFwcGx5TWF0cml4NCggdmlld01hdHJpeCApO1xuXG5cdFx0XHRcdC8vIGV4dHJhY3QgbG9jYWwgcm90YXRpb24gb2YgbGlnaHQgdG8gZGVyaXZlIHdpZHRoL2hlaWdodCBoYWxmIHZlY3RvcnNcblx0XHRcdFx0X21hdHJpeDQyLmlkZW50aXR5KCk7XG5cdFx0XHRcdF9tYXRyaXg0LmNvcHkoIGxpZ2h0Lm1hdHJpeFdvcmxkICk7XG5cdFx0XHRcdF9tYXRyaXg0LnByZW11bHRpcGx5KCB2aWV3TWF0cml4ICk7XG5cdFx0XHRcdF9tYXRyaXg0Mi5leHRyYWN0Um90YXRpb24oIF9tYXRyaXg0ICk7XG5cblx0XHRcdFx0dW5pZm9ybXMuaGFsZldpZHRoLnNldCggbGlnaHQud2lkdGggKiAwLjUsICAgICAgICAgICAgICAgIDAuMCwgMC4wICk7XG5cdFx0XHRcdHVuaWZvcm1zLmhhbGZIZWlnaHQuc2V0KCAgICAgICAgICAgICAgMC4wLCBsaWdodC5oZWlnaHQgKiAwLjUsIDAuMCApO1xuXG5cdFx0XHRcdHVuaWZvcm1zLmhhbGZXaWR0aC5hcHBseU1hdHJpeDQoIF9tYXRyaXg0MiApO1xuXHRcdFx0XHR1bmlmb3Jtcy5oYWxmSGVpZ2h0LmFwcGx5TWF0cml4NCggX21hdHJpeDQyICk7XG5cblx0XHRcdFx0Ly8gVE9ETyAoYWJlbG5hdGlvbik6IFJlY3RBcmVhTGlnaHQgZGlzdGFuY2U/XG5cdFx0XHRcdC8vIHVuaWZvcm1zLmRpc3RhbmNlID0gZGlzdGFuY2U7XG5cblx0XHRcdFx0X2xpZ2h0cy5yZWN0QXJlYVsgcmVjdEFyZWFMZW5ndGggXSA9IHVuaWZvcm1zO1xuXG5cdFx0XHRcdHJlY3RBcmVhTGVuZ3RoICsrO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBsaWdodC5pc1BvaW50TGlnaHQgKSB7XG5cblx0XHRcdFx0dmFyIHVuaWZvcm1zID0gbGlnaHRDYWNoZS5nZXQoIGxpZ2h0ICk7XG5cblx0XHRcdFx0dW5pZm9ybXMucG9zaXRpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBsaWdodC5tYXRyaXhXb3JsZCApO1xuXHRcdFx0XHR1bmlmb3Jtcy5wb3NpdGlvbi5hcHBseU1hdHJpeDQoIHZpZXdNYXRyaXggKTtcblxuXHRcdFx0XHR1bmlmb3Jtcy5jb2xvci5jb3B5KCBsaWdodC5jb2xvciApLm11bHRpcGx5U2NhbGFyKCBsaWdodC5pbnRlbnNpdHkgKTtcblx0XHRcdFx0dW5pZm9ybXMuZGlzdGFuY2UgPSBsaWdodC5kaXN0YW5jZTtcblx0XHRcdFx0dW5pZm9ybXMuZGVjYXkgPSAoIGxpZ2h0LmRpc3RhbmNlID09PSAwICkgPyAwLjAgOiBsaWdodC5kZWNheTtcblxuXHRcdFx0XHR1bmlmb3Jtcy5zaGFkb3cgPSBsaWdodC5jYXN0U2hhZG93O1xuXG5cdFx0XHRcdGlmICggbGlnaHQuY2FzdFNoYWRvdyApIHtcblxuXHRcdFx0XHRcdHNoYWRvdyA9IGxpZ2h0LnNoYWRvdztcblxuXHRcdFx0XHRcdHVuaWZvcm1zLnNoYWRvd0JpYXMgPSBzaGFkb3cuYmlhcztcblx0XHRcdFx0XHR1bmlmb3Jtcy5zaGFkb3dSYWRpdXMgPSBzaGFkb3cucmFkaXVzO1xuXHRcdFx0XHRcdHVuaWZvcm1zLnNoYWRvd01hcFNpemUgPSBzaGFkb3cubWFwU2l6ZTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0X2xpZ2h0cy5wb2ludFNoYWRvd01hcFsgcG9pbnRMZW5ndGggXSA9IHNoYWRvd01hcDtcblx0XHRcdFx0X2xpZ2h0cy5wb2ludFNoYWRvd01hdHJpeFsgcG9pbnRMZW5ndGggXSA9IGxpZ2h0LnNoYWRvdy5tYXRyaXg7XG5cdFx0XHRcdF9saWdodHMucG9pbnRbIHBvaW50TGVuZ3RoIF0gPSB1bmlmb3JtcztcblxuXHRcdFx0XHRwb2ludExlbmd0aCArKztcblxuXHRcdFx0fSBlbHNlIGlmICggbGlnaHQuaXNIZW1pc3BoZXJlTGlnaHQgKSB7XG5cblx0XHRcdFx0dmFyIHVuaWZvcm1zID0gbGlnaHRDYWNoZS5nZXQoIGxpZ2h0ICk7XG5cblx0XHRcdFx0dW5pZm9ybXMuZGlyZWN0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbiggbGlnaHQubWF0cml4V29ybGQgKTtcblx0XHRcdFx0dW5pZm9ybXMuZGlyZWN0aW9uLnRyYW5zZm9ybURpcmVjdGlvbiggdmlld01hdHJpeCApO1xuXHRcdFx0XHR1bmlmb3Jtcy5kaXJlY3Rpb24ubm9ybWFsaXplKCk7XG5cblx0XHRcdFx0dW5pZm9ybXMuc2t5Q29sb3IuY29weSggbGlnaHQuY29sb3IgKS5tdWx0aXBseVNjYWxhciggaW50ZW5zaXR5ICk7XG5cdFx0XHRcdHVuaWZvcm1zLmdyb3VuZENvbG9yLmNvcHkoIGxpZ2h0Lmdyb3VuZENvbG9yICkubXVsdGlwbHlTY2FsYXIoIGludGVuc2l0eSApO1xuXG5cdFx0XHRcdF9saWdodHMuaGVtaVsgaGVtaUxlbmd0aCBdID0gdW5pZm9ybXM7XG5cblx0XHRcdFx0aGVtaUxlbmd0aCArKztcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0X2xpZ2h0cy5hbWJpZW50WyAwIF0gPSByO1xuXHRcdF9saWdodHMuYW1iaWVudFsgMSBdID0gZztcblx0XHRfbGlnaHRzLmFtYmllbnRbIDIgXSA9IGI7XG5cblx0XHRfbGlnaHRzLmRpcmVjdGlvbmFsLmxlbmd0aCA9IGRpcmVjdGlvbmFsTGVuZ3RoO1xuXHRcdF9saWdodHMuc3BvdC5sZW5ndGggPSBzcG90TGVuZ3RoO1xuXHRcdF9saWdodHMucmVjdEFyZWEubGVuZ3RoID0gcmVjdEFyZWFMZW5ndGg7XG5cdFx0X2xpZ2h0cy5wb2ludC5sZW5ndGggPSBwb2ludExlbmd0aDtcblx0XHRfbGlnaHRzLmhlbWkubGVuZ3RoID0gaGVtaUxlbmd0aDtcblxuXHRcdC8vIFRPRE8gKHNhbS1nLXN0ZWVsKSB3aHkgYXJlbid0IHdlIHVzaW5nIGpvaW5cblx0XHRfbGlnaHRzLmhhc2ggPSBkaXJlY3Rpb25hbExlbmd0aCArICcsJyArIHBvaW50TGVuZ3RoICsgJywnICsgc3BvdExlbmd0aCArICcsJyArIHJlY3RBcmVhTGVuZ3RoICsgJywnICsgaGVtaUxlbmd0aCArICcsJyArIF9saWdodHMuc2hhZG93cy5sZW5ndGg7XG5cblx0fVxuXG5cdC8vIEdMIHN0YXRlIHNldHRpbmdcblxuXHR0aGlzLnNldEZhY2VDdWxsaW5nID0gZnVuY3Rpb24gKCBjdWxsRmFjZSwgZnJvbnRGYWNlRGlyZWN0aW9uICkge1xuXG5cdFx0c3RhdGUuc2V0Q3VsbEZhY2UoIGN1bGxGYWNlICk7XG5cdFx0c3RhdGUuc2V0RmxpcFNpZGVkKCBmcm9udEZhY2VEaXJlY3Rpb24gPT09IEZyb250RmFjZURpcmVjdGlvbkNXICk7XG5cblx0fTtcblxuXHQvLyBUZXh0dXJlc1xuXG5cdGZ1bmN0aW9uIGFsbG9jVGV4dHVyZVVuaXQoKSB7XG5cblx0XHR2YXIgdGV4dHVyZVVuaXQgPSBfdXNlZFRleHR1cmVVbml0cztcblxuXHRcdGlmICggdGV4dHVyZVVuaXQgPj0gY2FwYWJpbGl0aWVzLm1heFRleHR1cmVzICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdXZWJHTFJlbmRlcmVyOiB0cnlpbmcgdG8gdXNlICcgKyB0ZXh0dXJlVW5pdCArICcgdGV4dHVyZSB1bml0cyB3aGlsZSB0aGlzIEdQVSBzdXBwb3J0cyBvbmx5ICcgKyBjYXBhYmlsaXRpZXMubWF4VGV4dHVyZXMgKTtcblxuXHRcdH1cblxuXHRcdF91c2VkVGV4dHVyZVVuaXRzICs9IDE7XG5cblx0XHRyZXR1cm4gdGV4dHVyZVVuaXQ7XG5cblx0fVxuXG5cdHRoaXMuYWxsb2NUZXh0dXJlVW5pdCA9IGFsbG9jVGV4dHVyZVVuaXQ7XG5cblx0Ly8gdGhpcy5zZXRUZXh0dXJlMkQgPSBzZXRUZXh0dXJlMkQ7XG5cdHRoaXMuc2V0VGV4dHVyZTJEID0gKCBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgd2FybmVkID0gZmFsc2U7XG5cblx0XHQvLyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eTogcGVlbCB0ZXh0dXJlLnRleHR1cmVcblx0XHRyZXR1cm4gZnVuY3Rpb24gc2V0VGV4dHVyZTJEKCB0ZXh0dXJlLCBzbG90ICkge1xuXG5cdFx0XHRpZiAoIHRleHR1cmUgJiYgdGV4dHVyZS5pc1dlYkdMUmVuZGVyVGFyZ2V0ICkge1xuXG5cdFx0XHRcdGlmICggISB3YXJuZWQgKSB7XG5cblx0XHRcdFx0XHRjb25zb2xlLndhcm4oIFwiVEhSRUUuV2ViR0xSZW5kZXJlci5zZXRUZXh0dXJlMkQ6IGRvbid0IHVzZSByZW5kZXIgdGFyZ2V0cyBhcyB0ZXh0dXJlcy4gVXNlIHRoZWlyIC50ZXh0dXJlIHByb3BlcnR5IGluc3RlYWQuXCIgKTtcblx0XHRcdFx0XHR3YXJuZWQgPSB0cnVlO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0ZXh0dXJlID0gdGV4dHVyZS50ZXh0dXJlO1xuXG5cdFx0XHR9XG5cblx0XHRcdHRleHR1cmVzLnNldFRleHR1cmUyRCggdGV4dHVyZSwgc2xvdCApO1xuXG5cdFx0fTtcblxuXHR9KCkgKTtcblxuXHR0aGlzLnNldFRleHR1cmUgPSAoIGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB3YXJuZWQgPSBmYWxzZTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiBzZXRUZXh0dXJlKCB0ZXh0dXJlLCBzbG90ICkge1xuXG5cdFx0XHRpZiAoICEgd2FybmVkICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggXCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2V0VGV4dHVyZSBpcyBkZXByZWNhdGVkLCB1c2Ugc2V0VGV4dHVyZTJEIGluc3RlYWQuXCIgKTtcblx0XHRcdFx0d2FybmVkID0gdHJ1ZTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0ZXh0dXJlcy5zZXRUZXh0dXJlMkQoIHRleHR1cmUsIHNsb3QgKTtcblxuXHRcdH07XG5cblx0fSgpICk7XG5cblx0dGhpcy5zZXRUZXh0dXJlQ3ViZSA9ICggZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHdhcm5lZCA9IGZhbHNlO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHNldFRleHR1cmVDdWJlKCB0ZXh0dXJlLCBzbG90ICkge1xuXG5cdFx0XHQvLyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eTogcGVlbCB0ZXh0dXJlLnRleHR1cmVcblx0XHRcdGlmICggdGV4dHVyZSAmJiB0ZXh0dXJlLmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlICkge1xuXG5cdFx0XHRcdGlmICggISB3YXJuZWQgKSB7XG5cblx0XHRcdFx0XHRjb25zb2xlLndhcm4oIFwiVEhSRUUuV2ViR0xSZW5kZXJlci5zZXRUZXh0dXJlQ3ViZTogZG9uJ3QgdXNlIGN1YmUgcmVuZGVyIHRhcmdldHMgYXMgdGV4dHVyZXMuIFVzZSB0aGVpciAudGV4dHVyZSBwcm9wZXJ0eSBpbnN0ZWFkLlwiICk7XG5cdFx0XHRcdFx0d2FybmVkID0gdHJ1ZTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGV4dHVyZSA9IHRleHR1cmUudGV4dHVyZTtcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBjdXJyZW50bHkgcmVseWluZyBvbiB0aGUgZmFjdCB0aGF0IFdlYkdMUmVuZGVyVGFyZ2V0Q3ViZS50ZXh0dXJlIGlzIGEgVGV4dHVyZSBhbmQgTk9UIGEgQ3ViZVRleHR1cmVcblx0XHRcdC8vIFRPRE86IHVuaWZ5IHRoZXNlIGNvZGUgcGF0aHNcblx0XHRcdGlmICggKCB0ZXh0dXJlICYmIHRleHR1cmUuaXNDdWJlVGV4dHVyZSApIHx8XG5cdFx0XHRcdCggQXJyYXkuaXNBcnJheSggdGV4dHVyZS5pbWFnZSApICYmIHRleHR1cmUuaW1hZ2UubGVuZ3RoID09PSA2ICkgKSB7XG5cblx0XHRcdFx0Ly8gQ29tcHJlc3NlZFRleHR1cmUgY2FuIGhhdmUgQXJyYXkgaW4gaW1hZ2UgOi9cblxuXHRcdFx0XHQvLyB0aGlzIGZ1bmN0aW9uIGFsb25lIHNob3VsZCB0YWtlIGNhcmUgb2YgY3ViZSB0ZXh0dXJlc1xuXHRcdFx0XHR0ZXh0dXJlcy5zZXRUZXh0dXJlQ3ViZSggdGV4dHVyZSwgc2xvdCApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdC8vIGFzc3VtZWQ6IHRleHR1cmUgcHJvcGVydHkgb2YgVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXRDdWJlXG5cblx0XHRcdFx0dGV4dHVyZXMuc2V0VGV4dHVyZUN1YmVEeW5hbWljKCB0ZXh0dXJlLCBzbG90ICk7XG5cblx0XHRcdH1cblxuXHRcdH07XG5cblx0fSgpICk7XG5cblx0dGhpcy5nZXRSZW5kZXJUYXJnZXQgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gX2N1cnJlbnRSZW5kZXJUYXJnZXQ7XG5cblx0fTtcblxuXHR0aGlzLnNldFJlbmRlclRhcmdldCA9IGZ1bmN0aW9uICggcmVuZGVyVGFyZ2V0ICkge1xuXG5cdFx0X2N1cnJlbnRSZW5kZXJUYXJnZXQgPSByZW5kZXJUYXJnZXQ7XG5cblx0XHRpZiAoIHJlbmRlclRhcmdldCAmJiBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0ICkuX193ZWJnbEZyYW1lYnVmZmVyID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHRleHR1cmVzLnNldHVwUmVuZGVyVGFyZ2V0KCByZW5kZXJUYXJnZXQgKTtcblxuXHRcdH1cblxuXHRcdHZhciBpc0N1YmUgPSAoIHJlbmRlclRhcmdldCAmJiByZW5kZXJUYXJnZXQuaXNXZWJHTFJlbmRlclRhcmdldEN1YmUgKTtcblx0XHR2YXIgZnJhbWVidWZmZXI7XG5cblx0XHRpZiAoIHJlbmRlclRhcmdldCApIHtcblxuXHRcdFx0dmFyIHJlbmRlclRhcmdldFByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0ICk7XG5cblx0XHRcdGlmICggaXNDdWJlICkge1xuXG5cdFx0XHRcdGZyYW1lYnVmZmVyID0gcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXJbIHJlbmRlclRhcmdldC5hY3RpdmVDdWJlRmFjZSBdO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGZyYW1lYnVmZmVyID0gcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXI7XG5cblx0XHRcdH1cblxuXHRcdFx0X2N1cnJlbnRTY2lzc29yLmNvcHkoIHJlbmRlclRhcmdldC5zY2lzc29yICk7XG5cdFx0XHRfY3VycmVudFNjaXNzb3JUZXN0ID0gcmVuZGVyVGFyZ2V0LnNjaXNzb3JUZXN0O1xuXG5cdFx0XHRfY3VycmVudFZpZXdwb3J0LmNvcHkoIHJlbmRlclRhcmdldC52aWV3cG9ydCApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0ZnJhbWVidWZmZXIgPSBudWxsO1xuXG5cdFx0XHRfY3VycmVudFNjaXNzb3IuY29weSggX3NjaXNzb3IgKS5tdWx0aXBseVNjYWxhciggX3BpeGVsUmF0aW8gKTtcblx0XHRcdF9jdXJyZW50U2Npc3NvclRlc3QgPSBfc2Npc3NvclRlc3Q7XG5cblx0XHRcdF9jdXJyZW50Vmlld3BvcnQuY29weSggX3ZpZXdwb3J0ICkubXVsdGlwbHlTY2FsYXIoIF9waXhlbFJhdGlvICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIF9jdXJyZW50RnJhbWVidWZmZXIgIT09IGZyYW1lYnVmZmVyICkge1xuXG5cdFx0XHRfZ2wuYmluZEZyYW1lYnVmZmVyKCBfZ2wuRlJBTUVCVUZGRVIsIGZyYW1lYnVmZmVyICk7XG5cdFx0XHRfY3VycmVudEZyYW1lYnVmZmVyID0gZnJhbWVidWZmZXI7XG5cblx0XHR9XG5cblx0XHRzdGF0ZS5zY2lzc29yKCBfY3VycmVudFNjaXNzb3IgKTtcblx0XHRzdGF0ZS5zZXRTY2lzc29yVGVzdCggX2N1cnJlbnRTY2lzc29yVGVzdCApO1xuXG5cdFx0c3RhdGUudmlld3BvcnQoIF9jdXJyZW50Vmlld3BvcnQgKTtcblxuXHRcdGlmICggaXNDdWJlICkge1xuXG5cdFx0XHR2YXIgdGV4dHVyZVByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0LnRleHR1cmUgKTtcblx0XHRcdF9nbC5mcmFtZWJ1ZmZlclRleHR1cmUyRCggX2dsLkZSQU1FQlVGRkVSLCBfZ2wuQ09MT1JfQVRUQUNITUVOVDAsIF9nbC5URVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1ggKyByZW5kZXJUYXJnZXQuYWN0aXZlQ3ViZUZhY2UsIHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlLCByZW5kZXJUYXJnZXQuYWN0aXZlTWlwTWFwTGV2ZWwgKTtcblxuXHRcdH1cblxuXHR9O1xuXG5cdHRoaXMucmVhZFJlbmRlclRhcmdldFBpeGVscyA9IGZ1bmN0aW9uICggcmVuZGVyVGFyZ2V0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBidWZmZXIgKSB7XG5cblx0XHRpZiAoICggcmVuZGVyVGFyZ2V0ICYmIHJlbmRlclRhcmdldC5pc1dlYkdMUmVuZGVyVGFyZ2V0ICkgPT09IGZhbHNlICkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuV2ViR0xSZW5kZXJlci5yZWFkUmVuZGVyVGFyZ2V0UGl4ZWxzOiByZW5kZXJUYXJnZXQgaXMgbm90IFRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0LicgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdHZhciBmcmFtZWJ1ZmZlciA9IHByb3BlcnRpZXMuZ2V0KCByZW5kZXJUYXJnZXQgKS5fX3dlYmdsRnJhbWVidWZmZXI7XG5cblx0XHRpZiAoIGZyYW1lYnVmZmVyICkge1xuXG5cdFx0XHR2YXIgcmVzdG9yZSA9IGZhbHNlO1xuXG5cdFx0XHRpZiAoIGZyYW1lYnVmZmVyICE9PSBfY3VycmVudEZyYW1lYnVmZmVyICkge1xuXG5cdFx0XHRcdF9nbC5iaW5kRnJhbWVidWZmZXIoIF9nbC5GUkFNRUJVRkZFUiwgZnJhbWVidWZmZXIgKTtcblxuXHRcdFx0XHRyZXN0b3JlID0gdHJ1ZTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0cnkge1xuXG5cdFx0XHRcdHZhciB0ZXh0dXJlID0gcmVuZGVyVGFyZ2V0LnRleHR1cmU7XG5cdFx0XHRcdHZhciB0ZXh0dXJlRm9ybWF0ID0gdGV4dHVyZS5mb3JtYXQ7XG5cdFx0XHRcdHZhciB0ZXh0dXJlVHlwZSA9IHRleHR1cmUudHlwZTtcblxuXHRcdFx0XHRpZiAoIHRleHR1cmVGb3JtYXQgIT09IFJHQkFGb3JtYXQgJiYgcGFyYW1UaHJlZVRvR0woIHRleHR1cmVGb3JtYXQgKSAhPT0gX2dsLmdldFBhcmFtZXRlciggX2dsLklNUExFTUVOVEFUSU9OX0NPTE9SX1JFQURfRk9STUFUICkgKSB7XG5cblx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuV2ViR0xSZW5kZXJlci5yZWFkUmVuZGVyVGFyZ2V0UGl4ZWxzOiByZW5kZXJUYXJnZXQgaXMgbm90IGluIFJHQkEgb3IgaW1wbGVtZW50YXRpb24gZGVmaW5lZCBmb3JtYXQuJyApO1xuXHRcdFx0XHRcdHJldHVybjtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCB0ZXh0dXJlVHlwZSAhPT0gVW5zaWduZWRCeXRlVHlwZSAmJiBwYXJhbVRocmVlVG9HTCggdGV4dHVyZVR5cGUgKSAhPT0gX2dsLmdldFBhcmFtZXRlciggX2dsLklNUExFTUVOVEFUSU9OX0NPTE9SX1JFQURfVFlQRSApICYmIC8vIElFMTEsIEVkZ2UgYW5kIENocm9tZSBNYWMgPCA1MiAoIzk1MTMpXG5cdFx0XHRcdFx0ISAoIHRleHR1cmVUeXBlID09PSBGbG9hdFR5cGUgJiYgKCBleHRlbnNpb25zLmdldCggJ09FU190ZXh0dXJlX2Zsb2F0JyApIHx8IGV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfY29sb3JfYnVmZmVyX2Zsb2F0JyApICkgKSAmJiAvLyBDaHJvbWUgTWFjID49IDUyIGFuZCBGaXJlZm94XG5cdFx0XHRcdFx0ISAoIHRleHR1cmVUeXBlID09PSBIYWxmRmxvYXRUeXBlICYmIGV4dGVuc2lvbnMuZ2V0KCAnRVhUX2NvbG9yX2J1ZmZlcl9oYWxmX2Zsb2F0JyApICkgKSB7XG5cblx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuV2ViR0xSZW5kZXJlci5yZWFkUmVuZGVyVGFyZ2V0UGl4ZWxzOiByZW5kZXJUYXJnZXQgaXMgbm90IGluIFVuc2lnbmVkQnl0ZVR5cGUgb3IgaW1wbGVtZW50YXRpb24gZGVmaW5lZCB0eXBlLicgKTtcblx0XHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggX2dsLmNoZWNrRnJhbWVidWZmZXJTdGF0dXMoIF9nbC5GUkFNRUJVRkZFUiApID09PSBfZ2wuRlJBTUVCVUZGRVJfQ09NUExFVEUgKSB7XG5cblx0XHRcdFx0XHQvLyB0aGUgZm9sbG93aW5nIGlmIHN0YXRlbWVudCBlbnN1cmVzIHZhbGlkIHJlYWQgcmVxdWVzdHMgKG5vIG91dC1vZi1ib3VuZHMgcGl4ZWxzLCBzZWUgIzg2MDQpXG5cblx0XHRcdFx0XHRpZiAoICggeCA+PSAwICYmIHggPD0gKCByZW5kZXJUYXJnZXQud2lkdGggLSB3aWR0aCApICkgJiYgKCB5ID49IDAgJiYgeSA8PSAoIHJlbmRlclRhcmdldC5oZWlnaHQgLSBoZWlnaHQgKSApICkge1xuXG5cdFx0XHRcdFx0XHRfZ2wucmVhZFBpeGVscyggeCwgeSwgd2lkdGgsIGhlaWdodCwgcGFyYW1UaHJlZVRvR0woIHRleHR1cmVGb3JtYXQgKSwgcGFyYW1UaHJlZVRvR0woIHRleHR1cmVUeXBlICksIGJ1ZmZlciApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuV2ViR0xSZW5kZXJlci5yZWFkUmVuZGVyVGFyZ2V0UGl4ZWxzOiByZWFkUGl4ZWxzIGZyb20gcmVuZGVyVGFyZ2V0IGZhaWxlZC4gRnJhbWVidWZmZXIgbm90IGNvbXBsZXRlLicgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZmluYWxseSB7XG5cblx0XHRcdFx0aWYgKCByZXN0b3JlICkge1xuXG5cdFx0XHRcdFx0X2dsLmJpbmRGcmFtZWJ1ZmZlciggX2dsLkZSQU1FQlVGRkVSLCBfY3VycmVudEZyYW1lYnVmZmVyICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fTtcblxuXHQvLyBNYXAgdGhyZWUuanMgY29uc3RhbnRzIHRvIFdlYkdMIGNvbnN0YW50c1xuXG5cdGZ1bmN0aW9uIHBhcmFtVGhyZWVUb0dMKCBwICkge1xuXG5cdFx0dmFyIGV4dGVuc2lvbjtcblxuXHRcdGlmICggcCA9PT0gUmVwZWF0V3JhcHBpbmcgKSByZXR1cm4gX2dsLlJFUEVBVDtcblx0XHRpZiAoIHAgPT09IENsYW1wVG9FZGdlV3JhcHBpbmcgKSByZXR1cm4gX2dsLkNMQU1QX1RPX0VER0U7XG5cdFx0aWYgKCBwID09PSBNaXJyb3JlZFJlcGVhdFdyYXBwaW5nICkgcmV0dXJuIF9nbC5NSVJST1JFRF9SRVBFQVQ7XG5cblx0XHRpZiAoIHAgPT09IE5lYXJlc3RGaWx0ZXIgKSByZXR1cm4gX2dsLk5FQVJFU1Q7XG5cdFx0aWYgKCBwID09PSBOZWFyZXN0TWlwTWFwTmVhcmVzdEZpbHRlciApIHJldHVybiBfZ2wuTkVBUkVTVF9NSVBNQVBfTkVBUkVTVDtcblx0XHRpZiAoIHAgPT09IE5lYXJlc3RNaXBNYXBMaW5lYXJGaWx0ZXIgKSByZXR1cm4gX2dsLk5FQVJFU1RfTUlQTUFQX0xJTkVBUjtcblxuXHRcdGlmICggcCA9PT0gTGluZWFyRmlsdGVyICkgcmV0dXJuIF9nbC5MSU5FQVI7XG5cdFx0aWYgKCBwID09PSBMaW5lYXJNaXBNYXBOZWFyZXN0RmlsdGVyICkgcmV0dXJuIF9nbC5MSU5FQVJfTUlQTUFQX05FQVJFU1Q7XG5cdFx0aWYgKCBwID09PSBMaW5lYXJNaXBNYXBMaW5lYXJGaWx0ZXIgKSByZXR1cm4gX2dsLkxJTkVBUl9NSVBNQVBfTElORUFSO1xuXG5cdFx0aWYgKCBwID09PSBVbnNpZ25lZEJ5dGVUeXBlICkgcmV0dXJuIF9nbC5VTlNJR05FRF9CWVRFO1xuXHRcdGlmICggcCA9PT0gVW5zaWduZWRTaG9ydDQ0NDRUeXBlICkgcmV0dXJuIF9nbC5VTlNJR05FRF9TSE9SVF80XzRfNF80O1xuXHRcdGlmICggcCA9PT0gVW5zaWduZWRTaG9ydDU1NTFUeXBlICkgcmV0dXJuIF9nbC5VTlNJR05FRF9TSE9SVF81XzVfNV8xO1xuXHRcdGlmICggcCA9PT0gVW5zaWduZWRTaG9ydDU2NVR5cGUgKSByZXR1cm4gX2dsLlVOU0lHTkVEX1NIT1JUXzVfNl81O1xuXG5cdFx0aWYgKCBwID09PSBCeXRlVHlwZSApIHJldHVybiBfZ2wuQllURTtcblx0XHRpZiAoIHAgPT09IFNob3J0VHlwZSApIHJldHVybiBfZ2wuU0hPUlQ7XG5cdFx0aWYgKCBwID09PSBVbnNpZ25lZFNob3J0VHlwZSApIHJldHVybiBfZ2wuVU5TSUdORURfU0hPUlQ7XG5cdFx0aWYgKCBwID09PSBJbnRUeXBlICkgcmV0dXJuIF9nbC5JTlQ7XG5cdFx0aWYgKCBwID09PSBVbnNpZ25lZEludFR5cGUgKSByZXR1cm4gX2dsLlVOU0lHTkVEX0lOVDtcblx0XHRpZiAoIHAgPT09IEZsb2F0VHlwZSApIHJldHVybiBfZ2wuRkxPQVQ7XG5cblx0XHRpZiAoIHAgPT09IEhhbGZGbG9hdFR5cGUgKSB7XG5cblx0XHRcdGV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCAnT0VTX3RleHR1cmVfaGFsZl9mbG9hdCcgKTtcblxuXHRcdFx0aWYgKCBleHRlbnNpb24gIT09IG51bGwgKSByZXR1cm4gZXh0ZW5zaW9uLkhBTEZfRkxPQVRfT0VTO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBwID09PSBBbHBoYUZvcm1hdCApIHJldHVybiBfZ2wuQUxQSEE7XG5cdFx0aWYgKCBwID09PSBSR0JGb3JtYXQgKSByZXR1cm4gX2dsLlJHQjtcblx0XHRpZiAoIHAgPT09IFJHQkFGb3JtYXQgKSByZXR1cm4gX2dsLlJHQkE7XG5cdFx0aWYgKCBwID09PSBMdW1pbmFuY2VGb3JtYXQgKSByZXR1cm4gX2dsLkxVTUlOQU5DRTtcblx0XHRpZiAoIHAgPT09IEx1bWluYW5jZUFscGhhRm9ybWF0ICkgcmV0dXJuIF9nbC5MVU1JTkFOQ0VfQUxQSEE7XG5cdFx0aWYgKCBwID09PSBEZXB0aEZvcm1hdCApIHJldHVybiBfZ2wuREVQVEhfQ09NUE9ORU5UO1xuXHRcdGlmICggcCA9PT0gRGVwdGhTdGVuY2lsRm9ybWF0ICkgcmV0dXJuIF9nbC5ERVBUSF9TVEVOQ0lMO1xuXG5cdFx0aWYgKCBwID09PSBBZGRFcXVhdGlvbiApIHJldHVybiBfZ2wuRlVOQ19BREQ7XG5cdFx0aWYgKCBwID09PSBTdWJ0cmFjdEVxdWF0aW9uICkgcmV0dXJuIF9nbC5GVU5DX1NVQlRSQUNUO1xuXHRcdGlmICggcCA9PT0gUmV2ZXJzZVN1YnRyYWN0RXF1YXRpb24gKSByZXR1cm4gX2dsLkZVTkNfUkVWRVJTRV9TVUJUUkFDVDtcblxuXHRcdGlmICggcCA9PT0gWmVyb0ZhY3RvciApIHJldHVybiBfZ2wuWkVSTztcblx0XHRpZiAoIHAgPT09IE9uZUZhY3RvciApIHJldHVybiBfZ2wuT05FO1xuXHRcdGlmICggcCA9PT0gU3JjQ29sb3JGYWN0b3IgKSByZXR1cm4gX2dsLlNSQ19DT0xPUjtcblx0XHRpZiAoIHAgPT09IE9uZU1pbnVzU3JjQ29sb3JGYWN0b3IgKSByZXR1cm4gX2dsLk9ORV9NSU5VU19TUkNfQ09MT1I7XG5cdFx0aWYgKCBwID09PSBTcmNBbHBoYUZhY3RvciApIHJldHVybiBfZ2wuU1JDX0FMUEhBO1xuXHRcdGlmICggcCA9PT0gT25lTWludXNTcmNBbHBoYUZhY3RvciApIHJldHVybiBfZ2wuT05FX01JTlVTX1NSQ19BTFBIQTtcblx0XHRpZiAoIHAgPT09IERzdEFscGhhRmFjdG9yICkgcmV0dXJuIF9nbC5EU1RfQUxQSEE7XG5cdFx0aWYgKCBwID09PSBPbmVNaW51c0RzdEFscGhhRmFjdG9yICkgcmV0dXJuIF9nbC5PTkVfTUlOVVNfRFNUX0FMUEhBO1xuXG5cdFx0aWYgKCBwID09PSBEc3RDb2xvckZhY3RvciApIHJldHVybiBfZ2wuRFNUX0NPTE9SO1xuXHRcdGlmICggcCA9PT0gT25lTWludXNEc3RDb2xvckZhY3RvciApIHJldHVybiBfZ2wuT05FX01JTlVTX0RTVF9DT0xPUjtcblx0XHRpZiAoIHAgPT09IFNyY0FscGhhU2F0dXJhdGVGYWN0b3IgKSByZXR1cm4gX2dsLlNSQ19BTFBIQV9TQVRVUkFURTtcblxuXHRcdGlmICggcCA9PT0gUkdCX1MzVENfRFhUMV9Gb3JtYXQgfHwgcCA9PT0gUkdCQV9TM1RDX0RYVDFfRm9ybWF0IHx8XG5cdFx0XHRwID09PSBSR0JBX1MzVENfRFhUM19Gb3JtYXQgfHwgcCA9PT0gUkdCQV9TM1RDX0RYVDVfRm9ybWF0ICkge1xuXG5cdFx0XHRleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjJyApO1xuXG5cdFx0XHRpZiAoIGV4dGVuc2lvbiAhPT0gbnVsbCApIHtcblxuXHRcdFx0XHRpZiAoIHAgPT09IFJHQl9TM1RDX0RYVDFfRm9ybWF0ICkgcmV0dXJuIGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQl9TM1RDX0RYVDFfRVhUO1xuXHRcdFx0XHRpZiAoIHAgPT09IFJHQkFfUzNUQ19EWFQxX0Zvcm1hdCApIHJldHVybiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUMV9FWFQ7XG5cdFx0XHRcdGlmICggcCA9PT0gUkdCQV9TM1RDX0RYVDNfRm9ybWF0ICkgcmV0dXJuIGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQzX0VYVDtcblx0XHRcdFx0aWYgKCBwID09PSBSR0JBX1MzVENfRFhUNV9Gb3JtYXQgKSByZXR1cm4gZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDVfRVhUO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIHAgPT09IFJHQl9QVlJUQ180QlBQVjFfRm9ybWF0IHx8IHAgPT09IFJHQl9QVlJUQ18yQlBQVjFfRm9ybWF0IHx8XG5cdFx0XHRwID09PSBSR0JBX1BWUlRDXzRCUFBWMV9Gb3JtYXQgfHwgcCA9PT0gUkdCQV9QVlJUQ18yQlBQVjFfRm9ybWF0ICkge1xuXG5cdFx0XHRleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0YycgKTtcblxuXHRcdFx0aWYgKCBleHRlbnNpb24gIT09IG51bGwgKSB7XG5cblx0XHRcdFx0aWYgKCBwID09PSBSR0JfUFZSVENfNEJQUFYxX0Zvcm1hdCApIHJldHVybiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JfUFZSVENfNEJQUFYxX0lNRztcblx0XHRcdFx0aWYgKCBwID09PSBSR0JfUFZSVENfMkJQUFYxX0Zvcm1hdCApIHJldHVybiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JfUFZSVENfMkJQUFYxX0lNRztcblx0XHRcdFx0aWYgKCBwID09PSBSR0JBX1BWUlRDXzRCUFBWMV9Gb3JtYXQgKSByZXR1cm4gZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCQV9QVlJUQ180QlBQVjFfSU1HO1xuXHRcdFx0XHRpZiAoIHAgPT09IFJHQkFfUFZSVENfMkJQUFYxX0Zvcm1hdCApIHJldHVybiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JBX1BWUlRDXzJCUFBWMV9JTUc7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggcCA9PT0gUkdCX0VUQzFfRm9ybWF0ICkge1xuXG5cdFx0XHRleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9ldGMxJyApO1xuXG5cdFx0XHRpZiAoIGV4dGVuc2lvbiAhPT0gbnVsbCApIHJldHVybiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JfRVRDMV9XRUJHTDtcblxuXHRcdH1cblxuXHRcdGlmICggcCA9PT0gTWluRXF1YXRpb24gfHwgcCA9PT0gTWF4RXF1YXRpb24gKSB7XG5cblx0XHRcdGV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCAnRVhUX2JsZW5kX21pbm1heCcgKTtcblxuXHRcdFx0aWYgKCBleHRlbnNpb24gIT09IG51bGwgKSB7XG5cblx0XHRcdFx0aWYgKCBwID09PSBNaW5FcXVhdGlvbiApIHJldHVybiBleHRlbnNpb24uTUlOX0VYVDtcblx0XHRcdFx0aWYgKCBwID09PSBNYXhFcXVhdGlvbiApIHJldHVybiBleHRlbnNpb24uTUFYX0VYVDtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCBwID09PSBVbnNpZ25lZEludDI0OFR5cGUgKSB7XG5cblx0XHRcdGV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfZGVwdGhfdGV4dHVyZScgKTtcblxuXHRcdFx0aWYgKCBleHRlbnNpb24gIT09IG51bGwgKSByZXR1cm4gZXh0ZW5zaW9uLlVOU0lHTkVEX0lOVF8yNF84X1dFQkdMO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIDA7XG5cblx0fVxuXG59XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKi9cblxuZnVuY3Rpb24gRm9nRXhwMiAoIGNvbG9yLCBkZW5zaXR5ICkge1xuXG5cdHRoaXMubmFtZSA9ICcnO1xuXG5cdHRoaXMuY29sb3IgPSBuZXcgQ29sb3IoIGNvbG9yICk7XG5cdHRoaXMuZGVuc2l0eSA9ICggZGVuc2l0eSAhPT0gdW5kZWZpbmVkICkgPyBkZW5zaXR5IDogMC4wMDAyNTtcblxufVxuXG5Gb2dFeHAyLnByb3RvdHlwZS5pc0ZvZ0V4cDIgPSB0cnVlO1xuXG5Gb2dFeHAyLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uICgpIHtcblxuXHRyZXR1cm4gbmV3IEZvZ0V4cDIoIHRoaXMuY29sb3IuZ2V0SGV4KCksIHRoaXMuZGVuc2l0eSApO1xuXG59O1xuXG5Gb2dFeHAyLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoIG1ldGEgKSB7XG5cblx0cmV0dXJuIHtcblx0XHR0eXBlOiAnRm9nRXhwMicsXG5cdFx0Y29sb3I6IHRoaXMuY29sb3IuZ2V0SGV4KCksXG5cdFx0ZGVuc2l0eTogdGhpcy5kZW5zaXR5XG5cdH07XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKi9cblxuZnVuY3Rpb24gRm9nICggY29sb3IsIG5lYXIsIGZhciApIHtcblxuXHR0aGlzLm5hbWUgPSAnJztcblxuXHR0aGlzLmNvbG9yID0gbmV3IENvbG9yKCBjb2xvciApO1xuXG5cdHRoaXMubmVhciA9ICggbmVhciAhPT0gdW5kZWZpbmVkICkgPyBuZWFyIDogMTtcblx0dGhpcy5mYXIgPSAoIGZhciAhPT0gdW5kZWZpbmVkICkgPyBmYXIgOiAxMDAwO1xuXG59XG5cbkZvZy5wcm90b3R5cGUuaXNGb2cgPSB0cnVlO1xuXG5Gb2cucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKCkge1xuXG5cdHJldHVybiBuZXcgRm9nKCB0aGlzLmNvbG9yLmdldEhleCgpLCB0aGlzLm5lYXIsIHRoaXMuZmFyICk7XG5cbn07XG5cbkZvZy5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gKCBtZXRhICkge1xuXG5cdHJldHVybiB7XG5cdFx0dHlwZTogJ0ZvZycsXG5cdFx0Y29sb3I6IHRoaXMuY29sb3IuZ2V0SGV4KCksXG5cdFx0bmVhcjogdGhpcy5uZWFyLFxuXHRcdGZhcjogdGhpcy5mYXJcblx0fTtcblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIFNjZW5lICgpIHtcblxuXHRPYmplY3QzRC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1NjZW5lJztcblxuXHR0aGlzLmJhY2tncm91bmQgPSBudWxsO1xuXHR0aGlzLmZvZyA9IG51bGw7XG5cdHRoaXMub3ZlcnJpZGVNYXRlcmlhbCA9IG51bGw7XG5cblx0dGhpcy5hdXRvVXBkYXRlID0gdHJ1ZTsgLy8gY2hlY2tlZCBieSB0aGUgcmVuZGVyZXJcblxufVxuXG5TY2VuZS5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBTY2VuZSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSwgcmVjdXJzaXZlICkge1xuXG5cdFx0T2JqZWN0M0QucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlLCByZWN1cnNpdmUgKTtcblxuXHRcdGlmICggc291cmNlLmJhY2tncm91bmQgIT09IG51bGwgKSB0aGlzLmJhY2tncm91bmQgPSBzb3VyY2UuYmFja2dyb3VuZC5jbG9uZSgpO1xuXHRcdGlmICggc291cmNlLmZvZyAhPT0gbnVsbCApIHRoaXMuZm9nID0gc291cmNlLmZvZy5jbG9uZSgpO1xuXHRcdGlmICggc291cmNlLm92ZXJyaWRlTWF0ZXJpYWwgIT09IG51bGwgKSB0aGlzLm92ZXJyaWRlTWF0ZXJpYWwgPSBzb3VyY2Uub3ZlcnJpZGVNYXRlcmlhbC5jbG9uZSgpO1xuXG5cdFx0dGhpcy5hdXRvVXBkYXRlID0gc291cmNlLmF1dG9VcGRhdGU7XG5cdFx0dGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gc291cmNlLm1hdHJpeEF1dG9VcGRhdGU7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCBtZXRhICkge1xuXG5cdFx0dmFyIGRhdGEgPSBPYmplY3QzRC5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMsIG1ldGEgKTtcblxuXHRcdGlmICggdGhpcy5iYWNrZ3JvdW5kICE9PSBudWxsICkgZGF0YS5vYmplY3QuYmFja2dyb3VuZCA9IHRoaXMuYmFja2dyb3VuZC50b0pTT04oIG1ldGEgKTtcblx0XHRpZiAoIHRoaXMuZm9nICE9PSBudWxsICkgZGF0YS5vYmplY3QuZm9nID0gdGhpcy5mb2cudG9KU09OKCk7XG5cblx0XHRyZXR1cm4gZGF0YTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1pa2FlbCBlbXRpbmdlciAvIGh0dHA6Ly9nb21vLnNlL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBMZW5zRmxhcmUoIHRleHR1cmUsIHNpemUsIGRpc3RhbmNlLCBibGVuZGluZywgY29sb3IgKSB7XG5cblx0T2JqZWN0M0QuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMubGVuc0ZsYXJlcyA9IFtdO1xuXG5cdHRoaXMucG9zaXRpb25TY3JlZW4gPSBuZXcgVmVjdG9yMygpO1xuXHR0aGlzLmN1c3RvbVVwZGF0ZUNhbGxiYWNrID0gdW5kZWZpbmVkO1xuXG5cdGlmICggdGV4dHVyZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0dGhpcy5hZGQoIHRleHR1cmUsIHNpemUsIGRpc3RhbmNlLCBibGVuZGluZywgY29sb3IgKTtcblxuXHR9XG5cbn1cblxuTGVuc0ZsYXJlLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IExlbnNGbGFyZSxcblxuXHRpc0xlbnNGbGFyZTogdHJ1ZSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRcdE9iamVjdDNELnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdFx0dGhpcy5wb3NpdGlvblNjcmVlbi5jb3B5KCBzb3VyY2UucG9zaXRpb25TY3JlZW4gKTtcblx0XHR0aGlzLmN1c3RvbVVwZGF0ZUNhbGxiYWNrID0gc291cmNlLmN1c3RvbVVwZGF0ZUNhbGxiYWNrO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gc291cmNlLmxlbnNGbGFyZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dGhpcy5sZW5zRmxhcmVzLnB1c2goIHNvdXJjZS5sZW5zRmxhcmVzWyBpIF0gKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YWRkOiBmdW5jdGlvbiAoIHRleHR1cmUsIHNpemUsIGRpc3RhbmNlLCBibGVuZGluZywgY29sb3IsIG9wYWNpdHkgKSB7XG5cblx0XHRpZiAoIHNpemUgPT09IHVuZGVmaW5lZCApIHNpemUgPSAtIDE7XG5cdFx0aWYgKCBkaXN0YW5jZSA9PT0gdW5kZWZpbmVkICkgZGlzdGFuY2UgPSAwO1xuXHRcdGlmICggb3BhY2l0eSA9PT0gdW5kZWZpbmVkICkgb3BhY2l0eSA9IDE7XG5cdFx0aWYgKCBjb2xvciA9PT0gdW5kZWZpbmVkICkgY29sb3IgPSBuZXcgQ29sb3IoIDB4ZmZmZmZmICk7XG5cdFx0aWYgKCBibGVuZGluZyA9PT0gdW5kZWZpbmVkICkgYmxlbmRpbmcgPSBOb3JtYWxCbGVuZGluZztcblxuXHRcdGRpc3RhbmNlID0gTWF0aC5taW4oIGRpc3RhbmNlLCBNYXRoLm1heCggMCwgZGlzdGFuY2UgKSApO1xuXG5cdFx0dGhpcy5sZW5zRmxhcmVzLnB1c2goIHtcblx0XHRcdHRleHR1cmU6IHRleHR1cmUsXHQvLyBUSFJFRS5UZXh0dXJlXG5cdFx0XHRzaXplOiBzaXplLCBcdFx0Ly8gc2l6ZSBpbiBwaXhlbHMgKC0xID0gdXNlIHRleHR1cmUud2lkdGgpXG5cdFx0XHRkaXN0YW5jZTogZGlzdGFuY2UsIFx0Ly8gZGlzdGFuY2UgKDAtMSkgZnJvbSBsaWdodCBzb3VyY2UgKDA9YXQgbGlnaHQgc291cmNlKVxuXHRcdFx0eDogMCwgeTogMCwgejogMCxcdC8vIHNjcmVlbiBwb3NpdGlvbiAoLTEgPT4gMSkgeiA9IDAgaXMgaW4gZnJvbnQgeiA9IDEgaXMgYmFja1xuXHRcdFx0c2NhbGU6IDEsIFx0XHQvLyBzY2FsZVxuXHRcdFx0cm90YXRpb246IDAsIFx0XHQvLyByb3RhdGlvblxuXHRcdFx0b3BhY2l0eTogb3BhY2l0eSxcdC8vIG9wYWNpdHlcblx0XHRcdGNvbG9yOiBjb2xvcixcdFx0Ly8gY29sb3Jcblx0XHRcdGJsZW5kaW5nOiBibGVuZGluZ1x0Ly8gYmxlbmRpbmdcblx0XHR9ICk7XG5cblx0fSxcblxuXHQvKlxuXHQgKiBVcGRhdGUgbGVucyBmbGFyZXMgdXBkYXRlIHBvc2l0aW9ucyBvbiBhbGwgZmxhcmVzIGJhc2VkIG9uIHRoZSBzY3JlZW4gcG9zaXRpb25cblx0ICogU2V0IG15TGVuc0ZsYXJlLmN1c3RvbVVwZGF0ZUNhbGxiYWNrIHRvIGFsdGVyIHRoZSBmbGFyZXMgaW4geW91ciBwcm9qZWN0IHNwZWNpZmljIHdheS5cblx0ICovXG5cblx0dXBkYXRlTGVuc0ZsYXJlczogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGYsIGZsID0gdGhpcy5sZW5zRmxhcmVzLmxlbmd0aDtcblx0XHR2YXIgZmxhcmU7XG5cdFx0dmFyIHZlY1ggPSAtIHRoaXMucG9zaXRpb25TY3JlZW4ueCAqIDI7XG5cdFx0dmFyIHZlY1kgPSAtIHRoaXMucG9zaXRpb25TY3JlZW4ueSAqIDI7XG5cblx0XHRmb3IgKCBmID0gMDsgZiA8IGZsOyBmICsrICkge1xuXG5cdFx0XHRmbGFyZSA9IHRoaXMubGVuc0ZsYXJlc1sgZiBdO1xuXG5cdFx0XHRmbGFyZS54ID0gdGhpcy5wb3NpdGlvblNjcmVlbi54ICsgdmVjWCAqIGZsYXJlLmRpc3RhbmNlO1xuXHRcdFx0ZmxhcmUueSA9IHRoaXMucG9zaXRpb25TY3JlZW4ueSArIHZlY1kgKiBmbGFyZS5kaXN0YW5jZTtcblxuXHRcdFx0ZmxhcmUud2FudGVkUm90YXRpb24gPSBmbGFyZS54ICogTWF0aC5QSSAqIDAuMjU7XG5cdFx0XHRmbGFyZS5yb3RhdGlvbiArPSAoIGZsYXJlLndhbnRlZFJvdGF0aW9uIC0gZmxhcmUucm90YXRpb24gKSAqIDAuMjU7XG5cblx0XHR9XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqXG4gKiBwYXJhbWV0ZXJzID0ge1xuICogIGNvbG9yOiA8aGV4PixcbiAqICBvcGFjaXR5OiA8ZmxvYXQ+LFxuICogIG1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKlx0dXZPZmZzZXQ6IG5ldyBUSFJFRS5WZWN0b3IyKCksXG4gKlx0dXZTY2FsZTogbmV3IFRIUkVFLlZlY3RvcjIoKVxuICogfVxuICovXG5cbmZ1bmN0aW9uIFNwcml0ZU1hdGVyaWFsKCBwYXJhbWV0ZXJzICkge1xuXG5cdE1hdGVyaWFsLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnU3ByaXRlTWF0ZXJpYWwnO1xuXG5cdHRoaXMuY29sb3IgPSBuZXcgQ29sb3IoIDB4ZmZmZmZmICk7XG5cdHRoaXMubWFwID0gbnVsbDtcblxuXHR0aGlzLnJvdGF0aW9uID0gMDtcblxuXHR0aGlzLmZvZyA9IGZhbHNlO1xuXHR0aGlzLmxpZ2h0cyA9IGZhbHNlO1xuXG5cdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XG5cbn1cblxuU3ByaXRlTWF0ZXJpYWwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTWF0ZXJpYWwucHJvdG90eXBlICk7XG5TcHJpdGVNYXRlcmlhbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBTcHJpdGVNYXRlcmlhbDtcblNwcml0ZU1hdGVyaWFsLnByb3RvdHlwZS5pc1Nwcml0ZU1hdGVyaWFsID0gdHJ1ZTtcblxuU3ByaXRlTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRNYXRlcmlhbC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHR0aGlzLmNvbG9yLmNvcHkoIHNvdXJjZS5jb2xvciApO1xuXHR0aGlzLm1hcCA9IHNvdXJjZS5tYXA7XG5cblx0dGhpcy5yb3RhdGlvbiA9IHNvdXJjZS5yb3RhdGlvbjtcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIG1pa2FlbCBlbXRpbmdlciAvIGh0dHA6Ly9nb21vLnNlL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBTcHJpdGUoIG1hdGVyaWFsICkge1xuXG5cdE9iamVjdDNELmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnU3ByaXRlJztcblxuXHR0aGlzLm1hdGVyaWFsID0gKCBtYXRlcmlhbCAhPT0gdW5kZWZpbmVkICkgPyBtYXRlcmlhbCA6IG5ldyBTcHJpdGVNYXRlcmlhbCgpO1xuXG59XG5cblNwcml0ZS5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBTcHJpdGUsXG5cblx0aXNTcHJpdGU6IHRydWUsXG5cblx0cmF5Y2FzdDogKCBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgaW50ZXJzZWN0UG9pbnQgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciB3b3JsZFBvc2l0aW9uID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgd29ybGRTY2FsZSA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gcmF5Y2FzdCggcmF5Y2FzdGVyLCBpbnRlcnNlY3RzICkge1xuXG5cdFx0XHR3b3JsZFBvc2l0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbiggdGhpcy5tYXRyaXhXb3JsZCApO1xuXHRcdFx0cmF5Y2FzdGVyLnJheS5jbG9zZXN0UG9pbnRUb1BvaW50KCB3b3JsZFBvc2l0aW9uLCBpbnRlcnNlY3RQb2ludCApO1xuXG5cdFx0XHR3b3JsZFNjYWxlLnNldEZyb21NYXRyaXhTY2FsZSggdGhpcy5tYXRyaXhXb3JsZCApO1xuXHRcdFx0dmFyIGd1ZXNzU2l6ZVNxID0gd29ybGRTY2FsZS54ICogd29ybGRTY2FsZS55IC8gNDtcblxuXHRcdFx0aWYgKCB3b3JsZFBvc2l0aW9uLmRpc3RhbmNlVG9TcXVhcmVkKCBpbnRlcnNlY3RQb2ludCApID4gZ3Vlc3NTaXplU3EgKSByZXR1cm47XG5cblx0XHRcdHZhciBkaXN0YW5jZSA9IHJheWNhc3Rlci5yYXkub3JpZ2luLmRpc3RhbmNlVG8oIGludGVyc2VjdFBvaW50ICk7XG5cblx0XHRcdGlmICggZGlzdGFuY2UgPCByYXljYXN0ZXIubmVhciB8fCBkaXN0YW5jZSA+IHJheWNhc3Rlci5mYXIgKSByZXR1cm47XG5cblx0XHRcdGludGVyc2VjdHMucHVzaCgge1xuXG5cdFx0XHRcdGRpc3RhbmNlOiBkaXN0YW5jZSxcblx0XHRcdFx0cG9pbnQ6IGludGVyc2VjdFBvaW50LmNsb25lKCksXG5cdFx0XHRcdGZhY2U6IG51bGwsXG5cdFx0XHRcdG9iamVjdDogdGhpc1xuXG5cdFx0XHR9ICk7XG5cblx0XHR9O1xuXG5cdH0oKSApLFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoIHRoaXMubWF0ZXJpYWwgKS5jb3B5KCB0aGlzICk7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtaWthZWwgZW10aW5nZXIgLyBodHRwOi8vZ29tby5zZS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIExPRCgpIHtcblxuXHRPYmplY3QzRC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0xPRCc7XG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIHRoaXMsIHtcblx0XHRsZXZlbHM6IHtcblx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHR2YWx1ZTogW11cblx0XHR9XG5cdH0gKTtcblxufVxuXG5MT0QucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogTE9ELFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0T2JqZWN0M0QucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlLCBmYWxzZSApO1xuXG5cdFx0dmFyIGxldmVscyA9IHNvdXJjZS5sZXZlbHM7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBsZXZlbHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGxldmVsID0gbGV2ZWxzWyBpIF07XG5cblx0XHRcdHRoaXMuYWRkTGV2ZWwoIGxldmVsLm9iamVjdC5jbG9uZSgpLCBsZXZlbC5kaXN0YW5jZSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRhZGRMZXZlbDogZnVuY3Rpb24gKCBvYmplY3QsIGRpc3RhbmNlICkge1xuXG5cdFx0aWYgKCBkaXN0YW5jZSA9PT0gdW5kZWZpbmVkICkgZGlzdGFuY2UgPSAwO1xuXG5cdFx0ZGlzdGFuY2UgPSBNYXRoLmFicyggZGlzdGFuY2UgKTtcblxuXHRcdHZhciBsZXZlbHMgPSB0aGlzLmxldmVscztcblxuXHRcdGZvciAoIHZhciBsID0gMDsgbCA8IGxldmVscy5sZW5ndGg7IGwgKysgKSB7XG5cblx0XHRcdGlmICggZGlzdGFuY2UgPCBsZXZlbHNbIGwgXS5kaXN0YW5jZSApIHtcblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0bGV2ZWxzLnNwbGljZSggbCwgMCwgeyBkaXN0YW5jZTogZGlzdGFuY2UsIG9iamVjdDogb2JqZWN0IH0gKTtcblxuXHRcdHRoaXMuYWRkKCBvYmplY3QgKTtcblxuXHR9LFxuXG5cdGdldE9iamVjdEZvckRpc3RhbmNlOiBmdW5jdGlvbiAoIGRpc3RhbmNlICkge1xuXG5cdFx0dmFyIGxldmVscyA9IHRoaXMubGV2ZWxzO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAxLCBsID0gbGV2ZWxzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdGlmICggZGlzdGFuY2UgPCBsZXZlbHNbIGkgXS5kaXN0YW5jZSApIHtcblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGxldmVsc1sgaSAtIDEgXS5vYmplY3Q7XG5cblx0fSxcblxuXHRyYXljYXN0OiAoIGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBtYXRyaXhQb3NpdGlvbiA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gcmF5Y2FzdCggcmF5Y2FzdGVyLCBpbnRlcnNlY3RzICkge1xuXG5cdFx0XHRtYXRyaXhQb3NpdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oIHRoaXMubWF0cml4V29ybGQgKTtcblxuXHRcdFx0dmFyIGRpc3RhbmNlID0gcmF5Y2FzdGVyLnJheS5vcmlnaW4uZGlzdGFuY2VUbyggbWF0cml4UG9zaXRpb24gKTtcblxuXHRcdFx0dGhpcy5nZXRPYmplY3RGb3JEaXN0YW5jZSggZGlzdGFuY2UgKS5yYXljYXN0KCByYXljYXN0ZXIsIGludGVyc2VjdHMgKTtcblxuXHRcdH07XG5cblx0fSgpICksXG5cblx0dXBkYXRlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjEgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciB2MiA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gdXBkYXRlKCBjYW1lcmEgKSB7XG5cblx0XHRcdHZhciBsZXZlbHMgPSB0aGlzLmxldmVscztcblxuXHRcdFx0aWYgKCBsZXZlbHMubGVuZ3RoID4gMSApIHtcblxuXHRcdFx0XHR2MS5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGNhbWVyYS5tYXRyaXhXb3JsZCApO1xuXHRcdFx0XHR2Mi5zZXRGcm9tTWF0cml4UG9zaXRpb24oIHRoaXMubWF0cml4V29ybGQgKTtcblxuXHRcdFx0XHR2YXIgZGlzdGFuY2UgPSB2MS5kaXN0YW5jZVRvKCB2MiApO1xuXG5cdFx0XHRcdGxldmVsc1sgMCBdLm9iamVjdC52aXNpYmxlID0gdHJ1ZTtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDEsIGwgPSBsZXZlbHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdGlmICggZGlzdGFuY2UgPj0gbGV2ZWxzWyBpIF0uZGlzdGFuY2UgKSB7XG5cblx0XHRcdFx0XHRcdGxldmVsc1sgaSAtIDEgXS5vYmplY3QudmlzaWJsZSA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0bGV2ZWxzWyBpIF0ub2JqZWN0LnZpc2libGUgPSB0cnVlO1xuXG5cdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGZvciAoIDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRsZXZlbHNbIGkgXS5vYmplY3QudmlzaWJsZSA9IGZhbHNlO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fTtcblxuXHR9KCksXG5cblx0dG9KU09OOiBmdW5jdGlvbiAoIG1ldGEgKSB7XG5cblx0XHR2YXIgZGF0YSA9IE9iamVjdDNELnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcywgbWV0YSApO1xuXG5cdFx0ZGF0YS5vYmplY3QubGV2ZWxzID0gW107XG5cblx0XHR2YXIgbGV2ZWxzID0gdGhpcy5sZXZlbHM7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBsZXZlbHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGxldmVsID0gbGV2ZWxzWyBpIF07XG5cblx0XHRcdGRhdGEub2JqZWN0LmxldmVscy5wdXNoKCB7XG5cdFx0XHRcdG9iamVjdDogbGV2ZWwub2JqZWN0LnV1aWQsXG5cdFx0XHRcdGRpc3RhbmNlOiBsZXZlbC5kaXN0YW5jZVxuXHRcdFx0fSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGRhdGE7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtaWthZWwgZW10aW5nZXIgLyBodHRwOi8vZ29tby5zZS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKiBAYXV0aG9yIG1pY2hhZWwgZ3VlcnJlcm8gLyBodHRwOi8vcmVhbGl0eW1lbHRkb3duLmNvbVxuICogQGF1dGhvciBpa2VyciAvIGh0dHA6Ly92ZXJvbGQuY29tXG4gKi9cblxuZnVuY3Rpb24gU2tlbGV0b24oIGJvbmVzLCBib25lSW52ZXJzZXMgKSB7XG5cblx0Ly8gY29weSB0aGUgYm9uZSBhcnJheVxuXG5cdGJvbmVzID0gYm9uZXMgfHwgW107XG5cblx0dGhpcy5ib25lcyA9IGJvbmVzLnNsaWNlKCAwICk7XG5cdHRoaXMuYm9uZU1hdHJpY2VzID0gbmV3IEZsb2F0MzJBcnJheSggdGhpcy5ib25lcy5sZW5ndGggKiAxNiApO1xuXG5cdC8vIHVzZSB0aGUgc3VwcGxpZWQgYm9uZSBpbnZlcnNlcyBvciBjYWxjdWxhdGUgdGhlIGludmVyc2VzXG5cblx0aWYgKCBib25lSW52ZXJzZXMgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdHRoaXMuY2FsY3VsYXRlSW52ZXJzZXMoKTtcblxuXHR9IGVsc2Uge1xuXG5cdFx0aWYgKCB0aGlzLmJvbmVzLmxlbmd0aCA9PT0gYm9uZUludmVyc2VzLmxlbmd0aCApIHtcblxuXHRcdFx0dGhpcy5ib25lSW52ZXJzZXMgPSBib25lSW52ZXJzZXMuc2xpY2UoIDAgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlNrZWxldG9uIGJvbmVJbnZlcnNlcyBpcyB0aGUgd3JvbmcgbGVuZ3RoLicgKTtcblxuXHRcdFx0dGhpcy5ib25lSW52ZXJzZXMgPSBbXTtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IHRoaXMuYm9uZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdFx0dGhpcy5ib25lSW52ZXJzZXMucHVzaCggbmV3IE1hdHJpeDQoKSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fVxuXG59XG5cbk9iamVjdC5hc3NpZ24oIFNrZWxldG9uLnByb3RvdHlwZSwge1xuXG5cdGNhbGN1bGF0ZUludmVyc2VzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLmJvbmVJbnZlcnNlcyA9IFtdO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IHRoaXMuYm9uZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBpbnZlcnNlID0gbmV3IE1hdHJpeDQoKTtcblxuXHRcdFx0aWYgKCB0aGlzLmJvbmVzWyBpIF0gKSB7XG5cblx0XHRcdFx0aW52ZXJzZS5nZXRJbnZlcnNlKCB0aGlzLmJvbmVzWyBpIF0ubWF0cml4V29ybGQgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmJvbmVJbnZlcnNlcy5wdXNoKCBpbnZlcnNlICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHRwb3NlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgYm9uZSwgaSwgaWw7XG5cblx0XHQvLyByZWNvdmVyIHRoZSBiaW5kLXRpbWUgd29ybGQgbWF0cmljZXNcblxuXHRcdGZvciAoIGkgPSAwLCBpbCA9IHRoaXMuYm9uZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdGJvbmUgPSB0aGlzLmJvbmVzWyBpIF07XG5cblx0XHRcdGlmICggYm9uZSApIHtcblxuXHRcdFx0XHRib25lLm1hdHJpeFdvcmxkLmdldEludmVyc2UoIHRoaXMuYm9uZUludmVyc2VzWyBpIF0gKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gY29tcHV0ZSB0aGUgbG9jYWwgbWF0cmljZXMsIHBvc2l0aW9ucywgcm90YXRpb25zIGFuZCBzY2FsZXNcblxuXHRcdGZvciAoIGkgPSAwLCBpbCA9IHRoaXMuYm9uZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdGJvbmUgPSB0aGlzLmJvbmVzWyBpIF07XG5cblx0XHRcdGlmICggYm9uZSApIHtcblxuXHRcdFx0XHRpZiAoIGJvbmUucGFyZW50ICYmIGJvbmUucGFyZW50LmlzQm9uZSApIHtcblxuXHRcdFx0XHRcdGJvbmUubWF0cml4LmdldEludmVyc2UoIGJvbmUucGFyZW50Lm1hdHJpeFdvcmxkICk7XG5cdFx0XHRcdFx0Ym9uZS5tYXRyaXgubXVsdGlwbHkoIGJvbmUubWF0cml4V29ybGQgKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Ym9uZS5tYXRyaXguY29weSggYm9uZS5tYXRyaXhXb3JsZCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRib25lLm1hdHJpeC5kZWNvbXBvc2UoIGJvbmUucG9zaXRpb24sIGJvbmUucXVhdGVybmlvbiwgYm9uZS5zY2FsZSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fSxcblxuXHR1cGRhdGU6ICggZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIG9mZnNldE1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7XG5cdFx0dmFyIGlkZW50aXR5TWF0cml4ID0gbmV3IE1hdHJpeDQoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiB1cGRhdGUoKSB7XG5cblx0XHRcdHZhciBib25lcyA9IHRoaXMuYm9uZXM7XG5cdFx0XHR2YXIgYm9uZUludmVyc2VzID0gdGhpcy5ib25lSW52ZXJzZXM7XG5cdFx0XHR2YXIgYm9uZU1hdHJpY2VzID0gdGhpcy5ib25lTWF0cmljZXM7XG5cdFx0XHR2YXIgYm9uZVRleHR1cmUgPSB0aGlzLmJvbmVUZXh0dXJlO1xuXG5cdFx0XHQvLyBmbGF0dGVuIGJvbmUgbWF0cmljZXMgdG8gYXJyYXlcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IGJvbmVzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdC8vIGNvbXB1dGUgdGhlIG9mZnNldCBiZXR3ZWVuIHRoZSBjdXJyZW50IGFuZCB0aGUgb3JpZ2luYWwgdHJhbnNmb3JtXG5cblx0XHRcdFx0dmFyIG1hdHJpeCA9IGJvbmVzWyBpIF0gPyBib25lc1sgaSBdLm1hdHJpeFdvcmxkIDogaWRlbnRpdHlNYXRyaXg7XG5cblx0XHRcdFx0b2Zmc2V0TWF0cml4Lm11bHRpcGx5TWF0cmljZXMoIG1hdHJpeCwgYm9uZUludmVyc2VzWyBpIF0gKTtcblx0XHRcdFx0b2Zmc2V0TWF0cml4LnRvQXJyYXkoIGJvbmVNYXRyaWNlcywgaSAqIDE2ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBib25lVGV4dHVyZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGJvbmVUZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0fVxuXG5cdFx0fTtcblxuXHR9ICkoKSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyBTa2VsZXRvbiggdGhpcy5ib25lcywgdGhpcy5ib25lSW52ZXJzZXMgKTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1pa2FlbCBlbXRpbmdlciAvIGh0dHA6Ly9nb21vLnNlL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3IgaWtlcnIgLyBodHRwOi8vdmVyb2xkLmNvbVxuICovXG5cbmZ1bmN0aW9uIEJvbmUoKSB7XG5cblx0T2JqZWN0M0QuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdCb25lJztcblxufVxuXG5Cb25lLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IEJvbmUsXG5cblx0aXNCb25lOiB0cnVlXG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1pa2FlbCBlbXRpbmdlciAvIGh0dHA6Ly9nb21vLnNlL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3IgaWtlcnIgLyBodHRwOi8vdmVyb2xkLmNvbVxuICovXG5cbmZ1bmN0aW9uIFNraW5uZWRNZXNoKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKSB7XG5cblx0TWVzaC5jYWxsKCB0aGlzLCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcblxuXHR0aGlzLnR5cGUgPSAnU2tpbm5lZE1lc2gnO1xuXG5cdHRoaXMuYmluZE1vZGUgPSAnYXR0YWNoZWQnO1xuXHR0aGlzLmJpbmRNYXRyaXggPSBuZXcgTWF0cml4NCgpO1xuXHR0aGlzLmJpbmRNYXRyaXhJbnZlcnNlID0gbmV3IE1hdHJpeDQoKTtcblxuXHR2YXIgYm9uZXMgPSB0aGlzLmluaXRCb25lcygpO1xuXHR2YXIgc2tlbGV0b24gPSBuZXcgU2tlbGV0b24oIGJvbmVzICk7XG5cblx0dGhpcy5iaW5kKCBza2VsZXRvbiwgdGhpcy5tYXRyaXhXb3JsZCApO1xuXG5cdHRoaXMubm9ybWFsaXplU2tpbldlaWdodHMoKTtcblxufVxuXG5Ta2lubmVkTWVzaC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBNZXNoLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IFNraW5uZWRNZXNoLFxuXG5cdGlzU2tpbm5lZE1lc2g6IHRydWUsXG5cblx0aW5pdEJvbmVzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgYm9uZXMgPSBbXSwgYm9uZSwgZ2JvbmU7XG5cdFx0dmFyIGksIGlsO1xuXG5cdFx0aWYgKCB0aGlzLmdlb21ldHJ5ICYmIHRoaXMuZ2VvbWV0cnkuYm9uZXMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Ly8gZmlyc3QsIGNyZWF0ZSBhcnJheSBvZiAnQm9uZScgb2JqZWN0cyBmcm9tIGdlb21ldHJ5IGRhdGFcblxuXHRcdFx0Zm9yICggaSA9IDAsIGlsID0gdGhpcy5nZW9tZXRyeS5ib25lcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHRnYm9uZSA9IHRoaXMuZ2VvbWV0cnkuYm9uZXNbIGkgXTtcblxuXHRcdFx0XHQvLyBjcmVhdGUgbmV3ICdCb25lJyBvYmplY3RcblxuXHRcdFx0XHRib25lID0gbmV3IEJvbmUoKTtcblx0XHRcdFx0Ym9uZXMucHVzaCggYm9uZSApO1xuXG5cdFx0XHRcdC8vIGFwcGx5IHZhbHVlc1xuXG5cdFx0XHRcdGJvbmUubmFtZSA9IGdib25lLm5hbWU7XG5cdFx0XHRcdGJvbmUucG9zaXRpb24uZnJvbUFycmF5KCBnYm9uZS5wb3MgKTtcblx0XHRcdFx0Ym9uZS5xdWF0ZXJuaW9uLmZyb21BcnJheSggZ2JvbmUucm90cSApO1xuXHRcdFx0XHRpZiAoIGdib25lLnNjbCAhPT0gdW5kZWZpbmVkICkgYm9uZS5zY2FsZS5mcm9tQXJyYXkoIGdib25lLnNjbCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIHNlY29uZCwgY3JlYXRlIGJvbmUgaGllcmFyY2h5XG5cblx0XHRcdGZvciAoIGkgPSAwLCBpbCA9IHRoaXMuZ2VvbWV0cnkuYm9uZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdFx0Z2JvbmUgPSB0aGlzLmdlb21ldHJ5LmJvbmVzWyBpIF07XG5cblx0XHRcdFx0aWYgKCAoIGdib25lLnBhcmVudCAhPT0gLSAxICkgJiYgKCBnYm9uZS5wYXJlbnQgIT09IG51bGwgKSAmJiAoIGJvbmVzWyBnYm9uZS5wYXJlbnQgXSAhPT0gdW5kZWZpbmVkICkgKSB7XG5cblx0XHRcdFx0XHQvLyBzdWJzZXF1ZW50IGJvbmVzIGluIHRoZSBoaWVyYXJjaHlcblxuXHRcdFx0XHRcdGJvbmVzWyBnYm9uZS5wYXJlbnQgXS5hZGQoIGJvbmVzWyBpIF0gKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Ly8gdG9wbW9zdCBib25lLCBpbW1lZGlhdGUgY2hpbGQgb2YgdGhlIHNraW5uZWQgbWVzaFxuXG5cdFx0XHRcdFx0dGhpcy5hZGQoIGJvbmVzWyBpIF0gKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIG5vdyB0aGUgYm9uZXMgYXJlIHBhcnQgb2YgdGhlIHNjZW5lIGdyYXBoIGFuZCBjaGlsZHJlbiBvZiB0aGUgc2tpbm5lZCBtZXNoLlxuXHRcdC8vIGxldCdzIHVwZGF0ZSB0aGUgY29ycmVzcG9uZGluZyBtYXRyaWNlc1xuXG5cdFx0dGhpcy51cGRhdGVNYXRyaXhXb3JsZCggdHJ1ZSApO1xuXG5cdFx0cmV0dXJuIGJvbmVzO1xuXG5cdH0sXG5cblx0YmluZDogZnVuY3Rpb24gKCBza2VsZXRvbiwgYmluZE1hdHJpeCApIHtcblxuXHRcdHRoaXMuc2tlbGV0b24gPSBza2VsZXRvbjtcblxuXHRcdGlmICggYmluZE1hdHJpeCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR0aGlzLnVwZGF0ZU1hdHJpeFdvcmxkKCB0cnVlICk7XG5cblx0XHRcdHRoaXMuc2tlbGV0b24uY2FsY3VsYXRlSW52ZXJzZXMoKTtcblxuXHRcdFx0YmluZE1hdHJpeCA9IHRoaXMubWF0cml4V29ybGQ7XG5cblx0XHR9XG5cblx0XHR0aGlzLmJpbmRNYXRyaXguY29weSggYmluZE1hdHJpeCApO1xuXHRcdHRoaXMuYmluZE1hdHJpeEludmVyc2UuZ2V0SW52ZXJzZSggYmluZE1hdHJpeCApO1xuXG5cdH0sXG5cblx0cG9zZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5za2VsZXRvbi5wb3NlKCk7XG5cblx0fSxcblxuXHRub3JtYWxpemVTa2luV2VpZ2h0czogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHNjYWxlLCBpO1xuXG5cdFx0aWYgKCB0aGlzLmdlb21ldHJ5ICYmIHRoaXMuZ2VvbWV0cnkuaXNHZW9tZXRyeSApIHtcblxuXHRcdFx0Zm9yICggaSA9IDA7IGkgPCB0aGlzLmdlb21ldHJ5LnNraW5XZWlnaHRzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0XHR2YXIgc3cgPSB0aGlzLmdlb21ldHJ5LnNraW5XZWlnaHRzWyBpIF07XG5cblx0XHRcdFx0c2NhbGUgPSAxLjAgLyBzdy5sZW5ndGhNYW5oYXR0YW4oKTtcblxuXHRcdFx0XHRpZiAoIHNjYWxlICE9PSBJbmZpbml0eSApIHtcblxuXHRcdFx0XHRcdHN3Lm11bHRpcGx5U2NhbGFyKCBzY2FsZSApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRzdy5zZXQoIDEsIDAsIDAsIDAgKTsgLy8gZG8gc29tZXRoaW5nIHJlYXNvbmFibGVcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSBpZiAoIHRoaXMuZ2VvbWV0cnkgJiYgdGhpcy5nZW9tZXRyeS5pc0J1ZmZlckdlb21ldHJ5ICkge1xuXG5cdFx0XHR2YXIgdmVjID0gbmV3IFZlY3RvcjQoKTtcblxuXHRcdFx0dmFyIHNraW5XZWlnaHQgPSB0aGlzLmdlb21ldHJ5LmF0dHJpYnV0ZXMuc2tpbldlaWdodDtcblxuXHRcdFx0Zm9yICggaSA9IDA7IGkgPCBza2luV2VpZ2h0LmNvdW50OyBpICsrICkge1xuXG5cdFx0XHRcdHZlYy54ID0gc2tpbldlaWdodC5nZXRYKCBpICk7XG5cdFx0XHRcdHZlYy55ID0gc2tpbldlaWdodC5nZXRZKCBpICk7XG5cdFx0XHRcdHZlYy56ID0gc2tpbldlaWdodC5nZXRaKCBpICk7XG5cdFx0XHRcdHZlYy53ID0gc2tpbldlaWdodC5nZXRXKCBpICk7XG5cblx0XHRcdFx0c2NhbGUgPSAxLjAgLyB2ZWMubGVuZ3RoTWFuaGF0dGFuKCk7XG5cblx0XHRcdFx0aWYgKCBzY2FsZSAhPT0gSW5maW5pdHkgKSB7XG5cblx0XHRcdFx0XHR2ZWMubXVsdGlwbHlTY2FsYXIoIHNjYWxlICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHZlYy5zZXQoIDEsIDAsIDAsIDAgKTsgLy8gZG8gc29tZXRoaW5nIHJlYXNvbmFibGVcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0c2tpbldlaWdodC5zZXRYWVpXKCBpLCB2ZWMueCwgdmVjLnksIHZlYy56LCB2ZWMudyApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fSxcblxuXHR1cGRhdGVNYXRyaXhXb3JsZDogZnVuY3Rpb24gKCBmb3JjZSApIHtcblxuXHRcdE1lc2gucHJvdG90eXBlLnVwZGF0ZU1hdHJpeFdvcmxkLmNhbGwoIHRoaXMsIGZvcmNlICk7XG5cblx0XHRpZiAoIHRoaXMuYmluZE1vZGUgPT09ICdhdHRhY2hlZCcgKSB7XG5cblx0XHRcdHRoaXMuYmluZE1hdHJpeEludmVyc2UuZ2V0SW52ZXJzZSggdGhpcy5tYXRyaXhXb3JsZCApO1xuXG5cdFx0fSBlbHNlIGlmICggdGhpcy5iaW5kTW9kZSA9PT0gJ2RldGFjaGVkJyApIHtcblxuXHRcdFx0dGhpcy5iaW5kTWF0cml4SW52ZXJzZS5nZXRJbnZlcnNlKCB0aGlzLmJpbmRNYXRyaXggKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlNraW5uZWRNZXNoOiBVbnJlY29nbml6ZWQgYmluZE1vZGU6ICcgKyB0aGlzLmJpbmRNb2RlICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCB0aGlzLmdlb21ldHJ5LCB0aGlzLm1hdGVyaWFsICkuY29weSggdGhpcyApO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICpcbiAqIHBhcmFtZXRlcnMgPSB7XG4gKiAgY29sb3I6IDxoZXg+LFxuICogIG9wYWNpdHk6IDxmbG9hdD4sXG4gKlxuICogIGxpbmV3aWR0aDogPGZsb2F0PixcbiAqICBsaW5lY2FwOiBcInJvdW5kXCIsXG4gKiAgbGluZWpvaW46IFwicm91bmRcIlxuICogfVxuICovXG5cbmZ1bmN0aW9uIExpbmVCYXNpY01hdGVyaWFsKCBwYXJhbWV0ZXJzICkge1xuXG5cdE1hdGVyaWFsLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnTGluZUJhc2ljTWF0ZXJpYWwnO1xuXG5cdHRoaXMuY29sb3IgPSBuZXcgQ29sb3IoIDB4ZmZmZmZmICk7XG5cblx0dGhpcy5saW5ld2lkdGggPSAxO1xuXHR0aGlzLmxpbmVjYXAgPSAncm91bmQnO1xuXHR0aGlzLmxpbmVqb2luID0gJ3JvdW5kJztcblxuXHR0aGlzLmxpZ2h0cyA9IGZhbHNlO1xuXG5cdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XG5cbn1cblxuTGluZUJhc2ljTWF0ZXJpYWwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTWF0ZXJpYWwucHJvdG90eXBlICk7XG5MaW5lQmFzaWNNYXRlcmlhbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBMaW5lQmFzaWNNYXRlcmlhbDtcblxuTGluZUJhc2ljTWF0ZXJpYWwucHJvdG90eXBlLmlzTGluZUJhc2ljTWF0ZXJpYWwgPSB0cnVlO1xuXG5MaW5lQmFzaWNNYXRlcmlhbC5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMuY29sb3IuY29weSggc291cmNlLmNvbG9yICk7XG5cblx0dGhpcy5saW5ld2lkdGggPSBzb3VyY2UubGluZXdpZHRoO1xuXHR0aGlzLmxpbmVjYXAgPSBzb3VyY2UubGluZWNhcDtcblx0dGhpcy5saW5lam9pbiA9IHNvdXJjZS5saW5lam9pbjtcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIExpbmUoIGdlb21ldHJ5LCBtYXRlcmlhbCwgbW9kZSApIHtcblxuXHRpZiAoIG1vZGUgPT09IDEgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5MaW5lOiBwYXJhbWV0ZXIgVEhSRUUuTGluZVBpZWNlcyBubyBsb25nZXIgc3VwcG9ydGVkLiBDcmVhdGVkIFRIUkVFLkxpbmVTZWdtZW50cyBpbnN0ZWFkLicgKTtcblx0XHRyZXR1cm4gbmV3IExpbmVTZWdtZW50cyggZ2VvbWV0cnksIG1hdGVyaWFsICk7XG5cblx0fVxuXG5cdE9iamVjdDNELmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnTGluZSc7XG5cblx0dGhpcy5nZW9tZXRyeSA9IGdlb21ldHJ5ICE9PSB1bmRlZmluZWQgPyBnZW9tZXRyeSA6IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXHR0aGlzLm1hdGVyaWFsID0gbWF0ZXJpYWwgIT09IHVuZGVmaW5lZCA/IG1hdGVyaWFsIDogbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiBNYXRoLnJhbmRvbSgpICogMHhmZmZmZmYgfSApO1xuXG59XG5cbkxpbmUucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogTGluZSxcblxuXHRpc0xpbmU6IHRydWUsXG5cblx0cmF5Y2FzdDogKCBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgaW52ZXJzZU1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7XG5cdFx0dmFyIHJheSA9IG5ldyBSYXkoKTtcblx0XHR2YXIgc3BoZXJlID0gbmV3IFNwaGVyZSgpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHJheWNhc3QoIHJheWNhc3RlciwgaW50ZXJzZWN0cyApIHtcblxuXHRcdFx0dmFyIHByZWNpc2lvbiA9IHJheWNhc3Rlci5saW5lUHJlY2lzaW9uO1xuXHRcdFx0dmFyIHByZWNpc2lvblNxID0gcHJlY2lzaW9uICogcHJlY2lzaW9uO1xuXG5cdFx0XHR2YXIgZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5O1xuXHRcdFx0dmFyIG1hdHJpeFdvcmxkID0gdGhpcy5tYXRyaXhXb3JsZDtcblxuXHRcdFx0Ly8gQ2hlY2tpbmcgYm91bmRpbmdTcGhlcmUgZGlzdGFuY2UgdG8gcmF5XG5cblx0XHRcdGlmICggZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgPT09IG51bGwgKSBnZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtcblxuXHRcdFx0c3BoZXJlLmNvcHkoIGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlICk7XG5cdFx0XHRzcGhlcmUuYXBwbHlNYXRyaXg0KCBtYXRyaXhXb3JsZCApO1xuXG5cdFx0XHRpZiAoIHJheWNhc3Rlci5yYXkuaW50ZXJzZWN0c1NwaGVyZSggc3BoZXJlICkgPT09IGZhbHNlICkgcmV0dXJuO1xuXG5cdFx0XHQvL1xuXG5cdFx0XHRpbnZlcnNlTWF0cml4LmdldEludmVyc2UoIG1hdHJpeFdvcmxkICk7XG5cdFx0XHRyYXkuY29weSggcmF5Y2FzdGVyLnJheSApLmFwcGx5TWF0cml4NCggaW52ZXJzZU1hdHJpeCApO1xuXG5cdFx0XHR2YXIgdlN0YXJ0ID0gbmV3IFZlY3RvcjMoKTtcblx0XHRcdHZhciB2RW5kID0gbmV3IFZlY3RvcjMoKTtcblx0XHRcdHZhciBpbnRlclNlZ21lbnQgPSBuZXcgVmVjdG9yMygpO1xuXHRcdFx0dmFyIGludGVyUmF5ID0gbmV3IFZlY3RvcjMoKTtcblx0XHRcdHZhciBzdGVwID0gKHRoaXMgJiYgdGhpcy5pc0xpbmVTZWdtZW50cykgPyAyIDogMTtcblxuXHRcdFx0aWYgKCBnZW9tZXRyeS5pc0J1ZmZlckdlb21ldHJ5ICkge1xuXG5cdFx0XHRcdHZhciBpbmRleCA9IGdlb21ldHJ5LmluZGV4O1xuXHRcdFx0XHR2YXIgYXR0cmlidXRlcyA9IGdlb21ldHJ5LmF0dHJpYnV0ZXM7XG5cdFx0XHRcdHZhciBwb3NpdGlvbnMgPSBhdHRyaWJ1dGVzLnBvc2l0aW9uLmFycmF5O1xuXG5cdFx0XHRcdGlmICggaW5kZXggIT09IG51bGwgKSB7XG5cblx0XHRcdFx0XHR2YXIgaW5kaWNlcyA9IGluZGV4LmFycmF5O1xuXG5cdFx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gaW5kaWNlcy5sZW5ndGggLSAxOyBpIDwgbDsgaSArPSBzdGVwICkge1xuXG5cdFx0XHRcdFx0XHR2YXIgYSA9IGluZGljZXNbIGkgXTtcblx0XHRcdFx0XHRcdHZhciBiID0gaW5kaWNlc1sgaSArIDEgXTtcblxuXHRcdFx0XHRcdFx0dlN0YXJ0LmZyb21BcnJheSggcG9zaXRpb25zLCBhICogMyApO1xuXHRcdFx0XHRcdFx0dkVuZC5mcm9tQXJyYXkoIHBvc2l0aW9ucywgYiAqIDMgKTtcblxuXHRcdFx0XHRcdFx0dmFyIGRpc3RTcSA9IHJheS5kaXN0YW5jZVNxVG9TZWdtZW50KCB2U3RhcnQsIHZFbmQsIGludGVyUmF5LCBpbnRlclNlZ21lbnQgKTtcblxuXHRcdFx0XHRcdFx0aWYgKCBkaXN0U3EgPiBwcmVjaXNpb25TcSApIGNvbnRpbnVlO1xuXG5cdFx0XHRcdFx0XHRpbnRlclJheS5hcHBseU1hdHJpeDQoIHRoaXMubWF0cml4V29ybGQgKTsgLy9Nb3ZlIGJhY2sgdG8gd29ybGQgc3BhY2UgZm9yIGRpc3RhbmNlIGNhbGN1bGF0aW9uXG5cblx0XHRcdFx0XHRcdHZhciBkaXN0YW5jZSA9IHJheWNhc3Rlci5yYXkub3JpZ2luLmRpc3RhbmNlVG8oIGludGVyUmF5ICk7XG5cblx0XHRcdFx0XHRcdGlmICggZGlzdGFuY2UgPCByYXljYXN0ZXIubmVhciB8fCBkaXN0YW5jZSA+IHJheWNhc3Rlci5mYXIgKSBjb250aW51ZTtcblxuXHRcdFx0XHRcdFx0aW50ZXJzZWN0cy5wdXNoKCB7XG5cblx0XHRcdFx0XHRcdFx0ZGlzdGFuY2U6IGRpc3RhbmNlLFxuXHRcdFx0XHRcdFx0XHQvLyBXaGF0IGRvIHdlIHdhbnQ/IGludGVyc2VjdGlvbiBwb2ludCBvbiB0aGUgcmF5IG9yIG9uIHRoZSBzZWdtZW50Pz9cblx0XHRcdFx0XHRcdFx0Ly8gcG9pbnQ6IHJheWNhc3Rlci5yYXkuYXQoIGRpc3RhbmNlICksXG5cdFx0XHRcdFx0XHRcdHBvaW50OiBpbnRlclNlZ21lbnQuY2xvbmUoKS5hcHBseU1hdHJpeDQoIHRoaXMubWF0cml4V29ybGQgKSxcblx0XHRcdFx0XHRcdFx0aW5kZXg6IGksXG5cdFx0XHRcdFx0XHRcdGZhY2U6IG51bGwsXG5cdFx0XHRcdFx0XHRcdGZhY2VJbmRleDogbnVsbCxcblx0XHRcdFx0XHRcdFx0b2JqZWN0OiB0aGlzXG5cblx0XHRcdFx0XHRcdH0gKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gcG9zaXRpb25zLmxlbmd0aCAvIDMgLSAxOyBpIDwgbDsgaSArPSBzdGVwICkge1xuXG5cdFx0XHRcdFx0XHR2U3RhcnQuZnJvbUFycmF5KCBwb3NpdGlvbnMsIDMgKiBpICk7XG5cdFx0XHRcdFx0XHR2RW5kLmZyb21BcnJheSggcG9zaXRpb25zLCAzICogaSArIDMgKTtcblxuXHRcdFx0XHRcdFx0dmFyIGRpc3RTcSA9IHJheS5kaXN0YW5jZVNxVG9TZWdtZW50KCB2U3RhcnQsIHZFbmQsIGludGVyUmF5LCBpbnRlclNlZ21lbnQgKTtcblxuXHRcdFx0XHRcdFx0aWYgKCBkaXN0U3EgPiBwcmVjaXNpb25TcSApIGNvbnRpbnVlO1xuXG5cdFx0XHRcdFx0XHRpbnRlclJheS5hcHBseU1hdHJpeDQoIHRoaXMubWF0cml4V29ybGQgKTsgLy9Nb3ZlIGJhY2sgdG8gd29ybGQgc3BhY2UgZm9yIGRpc3RhbmNlIGNhbGN1bGF0aW9uXG5cblx0XHRcdFx0XHRcdHZhciBkaXN0YW5jZSA9IHJheWNhc3Rlci5yYXkub3JpZ2luLmRpc3RhbmNlVG8oIGludGVyUmF5ICk7XG5cblx0XHRcdFx0XHRcdGlmICggZGlzdGFuY2UgPCByYXljYXN0ZXIubmVhciB8fCBkaXN0YW5jZSA+IHJheWNhc3Rlci5mYXIgKSBjb250aW51ZTtcblxuXHRcdFx0XHRcdFx0aW50ZXJzZWN0cy5wdXNoKCB7XG5cblx0XHRcdFx0XHRcdFx0ZGlzdGFuY2U6IGRpc3RhbmNlLFxuXHRcdFx0XHRcdFx0XHQvLyBXaGF0IGRvIHdlIHdhbnQ/IGludGVyc2VjdGlvbiBwb2ludCBvbiB0aGUgcmF5IG9yIG9uIHRoZSBzZWdtZW50Pz9cblx0XHRcdFx0XHRcdFx0Ly8gcG9pbnQ6IHJheWNhc3Rlci5yYXkuYXQoIGRpc3RhbmNlICksXG5cdFx0XHRcdFx0XHRcdHBvaW50OiBpbnRlclNlZ21lbnQuY2xvbmUoKS5hcHBseU1hdHJpeDQoIHRoaXMubWF0cml4V29ybGQgKSxcblx0XHRcdFx0XHRcdFx0aW5kZXg6IGksXG5cdFx0XHRcdFx0XHRcdGZhY2U6IG51bGwsXG5cdFx0XHRcdFx0XHRcdGZhY2VJbmRleDogbnVsbCxcblx0XHRcdFx0XHRcdFx0b2JqZWN0OiB0aGlzXG5cblx0XHRcdFx0XHRcdH0gKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSBpZiAoIGdlb21ldHJ5LmlzR2VvbWV0cnkgKSB7XG5cblx0XHRcdFx0dmFyIHZlcnRpY2VzID0gZ2VvbWV0cnkudmVydGljZXM7XG5cdFx0XHRcdHZhciBuYlZlcnRpY2VzID0gdmVydGljZXMubGVuZ3RoO1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IG5iVmVydGljZXMgLSAxOyBpICs9IHN0ZXAgKSB7XG5cblx0XHRcdFx0XHR2YXIgZGlzdFNxID0gcmF5LmRpc3RhbmNlU3FUb1NlZ21lbnQoIHZlcnRpY2VzWyBpIF0sIHZlcnRpY2VzWyBpICsgMSBdLCBpbnRlclJheSwgaW50ZXJTZWdtZW50ICk7XG5cblx0XHRcdFx0XHRpZiAoIGRpc3RTcSA+IHByZWNpc2lvblNxICkgY29udGludWU7XG5cblx0XHRcdFx0XHRpbnRlclJheS5hcHBseU1hdHJpeDQoIHRoaXMubWF0cml4V29ybGQgKTsgLy9Nb3ZlIGJhY2sgdG8gd29ybGQgc3BhY2UgZm9yIGRpc3RhbmNlIGNhbGN1bGF0aW9uXG5cblx0XHRcdFx0XHR2YXIgZGlzdGFuY2UgPSByYXljYXN0ZXIucmF5Lm9yaWdpbi5kaXN0YW5jZVRvKCBpbnRlclJheSApO1xuXG5cdFx0XHRcdFx0aWYgKCBkaXN0YW5jZSA8IHJheWNhc3Rlci5uZWFyIHx8IGRpc3RhbmNlID4gcmF5Y2FzdGVyLmZhciApIGNvbnRpbnVlO1xuXG5cdFx0XHRcdFx0aW50ZXJzZWN0cy5wdXNoKCB7XG5cblx0XHRcdFx0XHRcdGRpc3RhbmNlOiBkaXN0YW5jZSxcblx0XHRcdFx0XHRcdC8vIFdoYXQgZG8gd2Ugd2FudD8gaW50ZXJzZWN0aW9uIHBvaW50IG9uIHRoZSByYXkgb3Igb24gdGhlIHNlZ21lbnQ/P1xuXHRcdFx0XHRcdFx0Ly8gcG9pbnQ6IHJheWNhc3Rlci5yYXkuYXQoIGRpc3RhbmNlICksXG5cdFx0XHRcdFx0XHRwb2ludDogaW50ZXJTZWdtZW50LmNsb25lKCkuYXBwbHlNYXRyaXg0KCB0aGlzLm1hdHJpeFdvcmxkICksXG5cdFx0XHRcdFx0XHRpbmRleDogaSxcblx0XHRcdFx0XHRcdGZhY2U6IG51bGwsXG5cdFx0XHRcdFx0XHRmYWNlSW5kZXg6IG51bGwsXG5cdFx0XHRcdFx0XHRvYmplY3Q6IHRoaXNcblxuXHRcdFx0XHRcdH0gKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH07XG5cblx0fSgpICksXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvciggdGhpcy5nZW9tZXRyeSwgdGhpcy5tYXRlcmlhbCApLmNvcHkoIHRoaXMgKTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIExpbmVTZWdtZW50cyggZ2VvbWV0cnksIG1hdGVyaWFsICkge1xuXG5cdExpbmUuY2FsbCggdGhpcywgZ2VvbWV0cnksIG1hdGVyaWFsICk7XG5cblx0dGhpcy50eXBlID0gJ0xpbmVTZWdtZW50cyc7XG5cbn1cblxuTGluZVNlZ21lbnRzLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIExpbmUucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogTGluZVNlZ21lbnRzLFxuXG5cdGlzTGluZVNlZ21lbnRzOiB0cnVlXG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1ncmV0ZXIgLyBodHRwOi8vZ2l0aHViLmNvbS9tZ3JldGVyXG4gKi9cblxuZnVuY3Rpb24gTGluZUxvb3AoIGdlb21ldHJ5LCBtYXRlcmlhbCApIHtcblxuXHRMaW5lLmNhbGwoIHRoaXMsIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xuXG5cdHRoaXMudHlwZSA9ICdMaW5lTG9vcCc7XG5cbn1cblxuTGluZUxvb3AucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggTGluZS5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBMaW5lTG9vcCxcblxuXHRpc0xpbmVMb29wOiB0cnVlLFxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKlxuICogcGFyYW1ldGVycyA9IHtcbiAqICBjb2xvcjogPGhleD4sXG4gKiAgb3BhY2l0eTogPGZsb2F0PixcbiAqICBtYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIHNpemU6IDxmbG9hdD4sXG4gKiAgc2l6ZUF0dGVudWF0aW9uOiA8Ym9vbD5cbiAqIH1cbiAqL1xuXG5mdW5jdGlvbiBQb2ludHNNYXRlcmlhbCggcGFyYW1ldGVycyApIHtcblxuXHRNYXRlcmlhbC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1BvaW50c01hdGVyaWFsJztcblxuXHR0aGlzLmNvbG9yID0gbmV3IENvbG9yKCAweGZmZmZmZiApO1xuXG5cdHRoaXMubWFwID0gbnVsbDtcblxuXHR0aGlzLnNpemUgPSAxO1xuXHR0aGlzLnNpemVBdHRlbnVhdGlvbiA9IHRydWU7XG5cblx0dGhpcy5saWdodHMgPSBmYWxzZTtcblxuXHR0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApO1xuXG59XG5cblBvaW50c01hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE1hdGVyaWFsLnByb3RvdHlwZSApO1xuUG9pbnRzTWF0ZXJpYWwucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUG9pbnRzTWF0ZXJpYWw7XG5cblBvaW50c01hdGVyaWFsLnByb3RvdHlwZS5pc1BvaW50c01hdGVyaWFsID0gdHJ1ZTtcblxuUG9pbnRzTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRNYXRlcmlhbC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHR0aGlzLmNvbG9yLmNvcHkoIHNvdXJjZS5jb2xvciApO1xuXG5cdHRoaXMubWFwID0gc291cmNlLm1hcDtcblxuXHR0aGlzLnNpemUgPSBzb3VyY2Uuc2l6ZTtcblx0dGhpcy5zaXplQXR0ZW51YXRpb24gPSBzb3VyY2Uuc2l6ZUF0dGVudWF0aW9uO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG4vKipcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKi9cblxuZnVuY3Rpb24gUG9pbnRzKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKSB7XG5cblx0T2JqZWN0M0QuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdQb2ludHMnO1xuXG5cdHRoaXMuZ2VvbWV0cnkgPSBnZW9tZXRyeSAhPT0gdW5kZWZpbmVkID8gZ2VvbWV0cnkgOiBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcblx0dGhpcy5tYXRlcmlhbCA9IG1hdGVyaWFsICE9PSB1bmRlZmluZWQgPyBtYXRlcmlhbCA6IG5ldyBQb2ludHNNYXRlcmlhbCggeyBjb2xvcjogTWF0aC5yYW5kb20oKSAqIDB4ZmZmZmZmIH0gKTtcblxufVxuXG5Qb2ludHMucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogUG9pbnRzLFxuXG5cdGlzUG9pbnRzOiB0cnVlLFxuXG5cdHJheWNhc3Q6ICggZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGludmVyc2VNYXRyaXggPSBuZXcgTWF0cml4NCgpO1xuXHRcdHZhciByYXkgPSBuZXcgUmF5KCk7XG5cdFx0dmFyIHNwaGVyZSA9IG5ldyBTcGhlcmUoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiByYXljYXN0KCByYXljYXN0ZXIsIGludGVyc2VjdHMgKSB7XG5cblx0XHRcdHZhciBvYmplY3QgPSB0aGlzO1xuXHRcdFx0dmFyIGdlb21ldHJ5ID0gdGhpcy5nZW9tZXRyeTtcblx0XHRcdHZhciBtYXRyaXhXb3JsZCA9IHRoaXMubWF0cml4V29ybGQ7XG5cdFx0XHR2YXIgdGhyZXNob2xkID0gcmF5Y2FzdGVyLnBhcmFtcy5Qb2ludHMudGhyZXNob2xkO1xuXG5cdFx0XHQvLyBDaGVja2luZyBib3VuZGluZ1NwaGVyZSBkaXN0YW5jZSB0byByYXlcblxuXHRcdFx0aWYgKCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSA9PT0gbnVsbCApIGdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO1xuXG5cdFx0XHRzcGhlcmUuY29weSggZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgKTtcblx0XHRcdHNwaGVyZS5hcHBseU1hdHJpeDQoIG1hdHJpeFdvcmxkICk7XG5cdFx0XHRzcGhlcmUucmFkaXVzICs9IHRocmVzaG9sZDtcblxuXHRcdFx0aWYgKCByYXljYXN0ZXIucmF5LmludGVyc2VjdHNTcGhlcmUoIHNwaGVyZSApID09PSBmYWxzZSApIHJldHVybjtcblxuXHRcdFx0Ly9cblxuXHRcdFx0aW52ZXJzZU1hdHJpeC5nZXRJbnZlcnNlKCBtYXRyaXhXb3JsZCApO1xuXHRcdFx0cmF5LmNvcHkoIHJheWNhc3Rlci5yYXkgKS5hcHBseU1hdHJpeDQoIGludmVyc2VNYXRyaXggKTtcblxuXHRcdFx0dmFyIGxvY2FsVGhyZXNob2xkID0gdGhyZXNob2xkIC8gKCAoIHRoaXMuc2NhbGUueCArIHRoaXMuc2NhbGUueSArIHRoaXMuc2NhbGUueiApIC8gMyApO1xuXHRcdFx0dmFyIGxvY2FsVGhyZXNob2xkU3EgPSBsb2NhbFRocmVzaG9sZCAqIGxvY2FsVGhyZXNob2xkO1xuXHRcdFx0dmFyIHBvc2l0aW9uID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdFx0ZnVuY3Rpb24gdGVzdFBvaW50KCBwb2ludCwgaW5kZXggKSB7XG5cblx0XHRcdFx0dmFyIHJheVBvaW50RGlzdGFuY2VTcSA9IHJheS5kaXN0YW5jZVNxVG9Qb2ludCggcG9pbnQgKTtcblxuXHRcdFx0XHRpZiAoIHJheVBvaW50RGlzdGFuY2VTcSA8IGxvY2FsVGhyZXNob2xkU3EgKSB7XG5cblx0XHRcdFx0XHR2YXIgaW50ZXJzZWN0UG9pbnQgPSByYXkuY2xvc2VzdFBvaW50VG9Qb2ludCggcG9pbnQgKTtcblx0XHRcdFx0XHRpbnRlcnNlY3RQb2ludC5hcHBseU1hdHJpeDQoIG1hdHJpeFdvcmxkICk7XG5cblx0XHRcdFx0XHR2YXIgZGlzdGFuY2UgPSByYXljYXN0ZXIucmF5Lm9yaWdpbi5kaXN0YW5jZVRvKCBpbnRlcnNlY3RQb2ludCApO1xuXG5cdFx0XHRcdFx0aWYgKCBkaXN0YW5jZSA8IHJheWNhc3Rlci5uZWFyIHx8IGRpc3RhbmNlID4gcmF5Y2FzdGVyLmZhciApIHJldHVybjtcblxuXHRcdFx0XHRcdGludGVyc2VjdHMucHVzaCgge1xuXG5cdFx0XHRcdFx0XHRkaXN0YW5jZTogZGlzdGFuY2UsXG5cdFx0XHRcdFx0XHRkaXN0YW5jZVRvUmF5OiBNYXRoLnNxcnQoIHJheVBvaW50RGlzdGFuY2VTcSApLFxuXHRcdFx0XHRcdFx0cG9pbnQ6IGludGVyc2VjdFBvaW50LmNsb25lKCksXG5cdFx0XHRcdFx0XHRpbmRleDogaW5kZXgsXG5cdFx0XHRcdFx0XHRmYWNlOiBudWxsLFxuXHRcdFx0XHRcdFx0b2JqZWN0OiBvYmplY3RcblxuXHRcdFx0XHRcdH0gKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBnZW9tZXRyeS5pc0J1ZmZlckdlb21ldHJ5ICkge1xuXG5cdFx0XHRcdHZhciBpbmRleCA9IGdlb21ldHJ5LmluZGV4O1xuXHRcdFx0XHR2YXIgYXR0cmlidXRlcyA9IGdlb21ldHJ5LmF0dHJpYnV0ZXM7XG5cdFx0XHRcdHZhciBwb3NpdGlvbnMgPSBhdHRyaWJ1dGVzLnBvc2l0aW9uLmFycmF5O1xuXG5cdFx0XHRcdGlmICggaW5kZXggIT09IG51bGwgKSB7XG5cblx0XHRcdFx0XHR2YXIgaW5kaWNlcyA9IGluZGV4LmFycmF5O1xuXG5cdFx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IGluZGljZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdHZhciBhID0gaW5kaWNlc1sgaSBdO1xuXG5cdFx0XHRcdFx0XHRwb3NpdGlvbi5mcm9tQXJyYXkoIHBvc2l0aW9ucywgYSAqIDMgKTtcblxuXHRcdFx0XHRcdFx0dGVzdFBvaW50KCBwb3NpdGlvbiwgYSApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBwb3NpdGlvbnMubGVuZ3RoIC8gMzsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdHBvc2l0aW9uLmZyb21BcnJheSggcG9zaXRpb25zLCBpICogMyApO1xuXG5cdFx0XHRcdFx0XHR0ZXN0UG9pbnQoIHBvc2l0aW9uLCBpICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHZhciB2ZXJ0aWNlcyA9IGdlb21ldHJ5LnZlcnRpY2VzO1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHZlcnRpY2VzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHR0ZXN0UG9pbnQoIHZlcnRpY2VzWyBpIF0sIGkgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH07XG5cblx0fSgpICksXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvciggdGhpcy5nZW9tZXRyeSwgdGhpcy5tYXRlcmlhbCApLmNvcHkoIHRoaXMgKTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIEdyb3VwKCkge1xuXG5cdE9iamVjdDNELmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnR3JvdXAnO1xuXG59XG5cbkdyb3VwLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IEdyb3VwXG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIFZpZGVvVGV4dHVyZSggdmlkZW8sIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGZvcm1hdCwgdHlwZSwgYW5pc290cm9weSApIHtcblxuXHRUZXh0dXJlLmNhbGwoIHRoaXMsIHZpZGVvLCBtYXBwaW5nLCB3cmFwUywgd3JhcFQsIG1hZ0ZpbHRlciwgbWluRmlsdGVyLCBmb3JtYXQsIHR5cGUsIGFuaXNvdHJvcHkgKTtcblxuXHR0aGlzLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlO1xuXG5cdHZhciBzY29wZSA9IHRoaXM7XG5cblx0ZnVuY3Rpb24gdXBkYXRlKCkge1xuXG5cdFx0cmVxdWVzdEFuaW1hdGlvbkZyYW1lKCB1cGRhdGUgKTtcblxuXHRcdGlmICggdmlkZW8ucmVhZHlTdGF0ZSA+PSB2aWRlby5IQVZFX0NVUlJFTlRfREFUQSApIHtcblxuXHRcdFx0c2NvcGUubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0fVxuXG5cdH1cblxuXHR1cGRhdGUoKTtcblxufVxuXG5WaWRlb1RleHR1cmUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggVGV4dHVyZS5wcm90b3R5cGUgKTtcblZpZGVvVGV4dHVyZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBWaWRlb1RleHR1cmU7XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBDb21wcmVzc2VkVGV4dHVyZSggbWlwbWFwcywgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCB0eXBlLCBtYXBwaW5nLCB3cmFwUywgd3JhcFQsIG1hZ0ZpbHRlciwgbWluRmlsdGVyLCBhbmlzb3Ryb3B5LCBlbmNvZGluZyApIHtcblxuXHRUZXh0dXJlLmNhbGwoIHRoaXMsIG51bGwsIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGZvcm1hdCwgdHlwZSwgYW5pc290cm9weSwgZW5jb2RpbmcgKTtcblxuXHR0aGlzLmltYWdlID0geyB3aWR0aDogd2lkdGgsIGhlaWdodDogaGVpZ2h0IH07XG5cdHRoaXMubWlwbWFwcyA9IG1pcG1hcHM7XG5cblx0Ly8gbm8gZmxpcHBpbmcgZm9yIGN1YmUgdGV4dHVyZXNcblx0Ly8gKGFsc28gZmxpcHBpbmcgZG9lc24ndCB3b3JrIGZvciBjb21wcmVzc2VkIHRleHR1cmVzIClcblxuXHR0aGlzLmZsaXBZID0gZmFsc2U7XG5cblx0Ly8gY2FuJ3QgZ2VuZXJhdGUgbWlwbWFwcyBmb3IgY29tcHJlc3NlZCB0ZXh0dXJlc1xuXHQvLyBtaXBzIG11c3QgYmUgZW1iZWRkZWQgaW4gRERTIGZpbGVzXG5cblx0dGhpcy5nZW5lcmF0ZU1pcG1hcHMgPSBmYWxzZTtcblxufVxuXG5Db21wcmVzc2VkVGV4dHVyZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBUZXh0dXJlLnByb3RvdHlwZSApO1xuQ29tcHJlc3NlZFRleHR1cmUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ29tcHJlc3NlZFRleHR1cmU7XG5cbkNvbXByZXNzZWRUZXh0dXJlLnByb3RvdHlwZS5pc0NvbXByZXNzZWRUZXh0dXJlID0gdHJ1ZTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIENhbnZhc1RleHR1cmUoIGNhbnZhcywgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIsIG1pbkZpbHRlciwgZm9ybWF0LCB0eXBlLCBhbmlzb3Ryb3B5ICkge1xuXG5cdFRleHR1cmUuY2FsbCggdGhpcywgY2FudmFzLCBtYXBwaW5nLCB3cmFwUywgd3JhcFQsIG1hZ0ZpbHRlciwgbWluRmlsdGVyLCBmb3JtYXQsIHR5cGUsIGFuaXNvdHJvcHkgKTtcblxuXHR0aGlzLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxufVxuXG5DYW52YXNUZXh0dXJlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIFRleHR1cmUucHJvdG90eXBlICk7XG5DYW52YXNUZXh0dXJlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IENhbnZhc1RleHR1cmU7XG5cbi8qKlxuICogQGF1dGhvciBNYXR0IERlc0xhdXJpZXJzIC8gQG1hdHRkZXNsXG4gKiBAYXV0aG9yIGF0aXggLyBhcnRodXJzaWxiZXIuZGVcbiAqL1xuXG5mdW5jdGlvbiBEZXB0aFRleHR1cmUoIHdpZHRoLCBoZWlnaHQsIHR5cGUsIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGFuaXNvdHJvcHksIGZvcm1hdCApIHtcblxuXHRmb3JtYXQgPSBmb3JtYXQgIT09IHVuZGVmaW5lZCA/IGZvcm1hdCA6IERlcHRoRm9ybWF0O1xuXG5cdGlmICggZm9ybWF0ICE9PSBEZXB0aEZvcm1hdCAmJiBmb3JtYXQgIT09IERlcHRoU3RlbmNpbEZvcm1hdCApIHtcblxuXHRcdHRocm93IG5ldyBFcnJvciggJ0RlcHRoVGV4dHVyZSBmb3JtYXQgbXVzdCBiZSBlaXRoZXIgVEhSRUUuRGVwdGhGb3JtYXQgb3IgVEhSRUUuRGVwdGhTdGVuY2lsRm9ybWF0JyApXG5cblx0fVxuXG5cdGlmICggdHlwZSA9PT0gdW5kZWZpbmVkICYmIGZvcm1hdCA9PT0gRGVwdGhGb3JtYXQgKSB0eXBlID0gVW5zaWduZWRTaG9ydFR5cGU7XG5cdGlmICggdHlwZSA9PT0gdW5kZWZpbmVkICYmIGZvcm1hdCA9PT0gRGVwdGhTdGVuY2lsRm9ybWF0ICkgdHlwZSA9IFVuc2lnbmVkSW50MjQ4VHlwZTtcblxuXHRUZXh0dXJlLmNhbGwoIHRoaXMsIG51bGwsIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGZvcm1hdCwgdHlwZSwgYW5pc290cm9weSApO1xuXG5cdHRoaXMuaW1hZ2UgPSB7IHdpZHRoOiB3aWR0aCwgaGVpZ2h0OiBoZWlnaHQgfTtcblxuXHR0aGlzLm1hZ0ZpbHRlciA9IG1hZ0ZpbHRlciAhPT0gdW5kZWZpbmVkID8gbWFnRmlsdGVyIDogTmVhcmVzdEZpbHRlcjtcblx0dGhpcy5taW5GaWx0ZXIgPSBtaW5GaWx0ZXIgIT09IHVuZGVmaW5lZCA/IG1pbkZpbHRlciA6IE5lYXJlc3RGaWx0ZXI7XG5cblx0dGhpcy5mbGlwWSA9IGZhbHNlO1xuXHR0aGlzLmdlbmVyYXRlTWlwbWFwc1x0PSBmYWxzZTtcblxufVxuXG5EZXB0aFRleHR1cmUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggVGV4dHVyZS5wcm90b3R5cGUgKTtcbkRlcHRoVGV4dHVyZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBEZXB0aFRleHR1cmU7XG5EZXB0aFRleHR1cmUucHJvdG90eXBlLmlzRGVwdGhUZXh0dXJlID0gdHJ1ZTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqL1xuXG5mdW5jdGlvbiBXaXJlZnJhbWVHZW9tZXRyeSggZ2VvbWV0cnkgKSB7XG5cblx0QnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdXaXJlZnJhbWVHZW9tZXRyeSc7XG5cblx0Ly8gYnVmZmVyXG5cblx0dmFyIHZlcnRpY2VzID0gW107XG5cblx0Ly8gaGVscGVyIHZhcmlhYmxlc1xuXG5cdHZhciBpLCBqLCBsLCBvLCBvbDtcblx0dmFyIGVkZ2UgPSBbIDAsIDAgXSwgZWRnZXMgPSB7fSwgZSwgZWRnZTEsIGVkZ2UyO1xuXHR2YXIga2V5LCBrZXlzID0gWyAnYScsICdiJywgJ2MnIF07XG5cdHZhciB2ZXJ0ZXg7XG5cblx0Ly8gZGlmZmVyZW50IGxvZ2ljIGZvciBHZW9tZXRyeSBhbmQgQnVmZmVyR2VvbWV0cnlcblxuXHRpZiAoIGdlb21ldHJ5ICYmIGdlb21ldHJ5LmlzR2VvbWV0cnkgKSB7XG5cblx0XHQvLyBjcmVhdGUgYSBkYXRhIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zIGFsbCBlZGdlcyB3aXRob3V0IGR1cGxpY2F0ZXNcblxuXHRcdHZhciBmYWNlcyA9IGdlb21ldHJ5LmZhY2VzO1xuXG5cdFx0Zm9yICggaSA9IDAsIGwgPSBmYWNlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgZmFjZSA9IGZhY2VzWyBpIF07XG5cblx0XHRcdGZvciAoIGogPSAwOyBqIDwgMzsgaiArKyApIHtcblxuXHRcdFx0XHRlZGdlMSA9IGZhY2VbIGtleXNbIGogXSBdO1xuXHRcdFx0XHRlZGdlMiA9IGZhY2VbIGtleXNbICggaiArIDEgKSAlIDMgXSBdO1xuXHRcdFx0XHRlZGdlWyAwIF0gPSBNYXRoLm1pbiggZWRnZTEsIGVkZ2UyICk7IC8vIHNvcnRpbmcgcHJldmVudHMgZHVwbGljYXRlc1xuXHRcdFx0XHRlZGdlWyAxIF0gPSBNYXRoLm1heCggZWRnZTEsIGVkZ2UyICk7XG5cblx0XHRcdFx0a2V5ID0gZWRnZVsgMCBdICsgJywnICsgZWRnZVsgMSBdO1xuXG5cdFx0XHRcdGlmICggZWRnZXNbIGtleSBdID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRlZGdlc1sga2V5IF0gPSB7IGluZGV4MTogZWRnZVsgMCBdLCBpbmRleDI6IGVkZ2VbIDEgXSB9O1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gZ2VuZXJhdGUgdmVydGljZXNcblxuXHRcdGZvciAoIGtleSBpbiBlZGdlcyApIHtcblxuXHRcdFx0ZSA9IGVkZ2VzWyBrZXkgXTtcblxuXHRcdFx0dmVydGV4ID0gZ2VvbWV0cnkudmVydGljZXNbIGUuaW5kZXgxIF07XG5cdFx0XHR2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7XG5cblx0XHRcdHZlcnRleCA9IGdlb21ldHJ5LnZlcnRpY2VzWyBlLmluZGV4MiBdO1xuXHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0fVxuXG5cdH0gZWxzZSBpZiAoIGdlb21ldHJ5ICYmIGdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgKSB7XG5cblx0XHR2YXIgcG9zaXRpb24sIGluZGljZXMsIGdyb3Vwcztcblx0XHR2YXIgZ3JvdXAsIHN0YXJ0LCBjb3VudDtcblx0XHR2YXIgaW5kZXgxLCBpbmRleDI7XG5cblx0XHR2ZXJ0ZXggPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0aWYgKCBnZW9tZXRyeS5pbmRleCAhPT0gbnVsbCApIHtcblxuXHRcdFx0Ly8gaW5kZXhlZCBCdWZmZXJHZW9tZXRyeVxuXG5cdFx0XHRwb3NpdGlvbiA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247XG5cdFx0XHRpbmRpY2VzID0gZ2VvbWV0cnkuaW5kZXg7XG5cdFx0XHRncm91cHMgPSBnZW9tZXRyeS5ncm91cHM7XG5cblx0XHRcdGlmICggZ3JvdXBzLmxlbmd0aCA9PT0gMCApIHtcblxuXHRcdFx0XHRncm91cHMgPSBbIHsgc3RhcnQ6IDAsIGNvdW50OiBpbmRpY2VzLmNvdW50LCBtYXRlcmlhbEluZGV4OiAwIH0gXTtcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBjcmVhdGUgYSBkYXRhIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zIGFsbCBlZ2VzIHdpdGhvdXQgZHVwbGljYXRlc1xuXG5cdFx0XHRmb3IgKCBvID0gMCwgb2wgPSBncm91cHMubGVuZ3RoOyBvIDwgb2w7ICsrIG8gKSB7XG5cblx0XHRcdFx0Z3JvdXAgPSBncm91cHNbIG8gXTtcblxuXHRcdFx0XHRzdGFydCA9IGdyb3VwLnN0YXJ0O1xuXHRcdFx0XHRjb3VudCA9IGdyb3VwLmNvdW50O1xuXG5cdFx0XHRcdGZvciAoIGkgPSBzdGFydCwgbCA9ICggc3RhcnQgKyBjb3VudCApOyBpIDwgbDsgaSArPSAzICkge1xuXG5cdFx0XHRcdFx0Zm9yICggaiA9IDA7IGogPCAzOyBqICsrICkge1xuXG5cdFx0XHRcdFx0XHRlZGdlMSA9IGluZGljZXMuZ2V0WCggaSArIGogKTtcblx0XHRcdFx0XHRcdGVkZ2UyID0gaW5kaWNlcy5nZXRYKCBpICsgKCBqICsgMSApICUgMyApO1xuXHRcdFx0XHRcdFx0ZWRnZVsgMCBdID0gTWF0aC5taW4oIGVkZ2UxLCBlZGdlMiApOyAvLyBzb3J0aW5nIHByZXZlbnRzIGR1cGxpY2F0ZXNcblx0XHRcdFx0XHRcdGVkZ2VbIDEgXSA9IE1hdGgubWF4KCBlZGdlMSwgZWRnZTIgKTtcblxuXHRcdFx0XHRcdFx0a2V5ID0gZWRnZVsgMCBdICsgJywnICsgZWRnZVsgMSBdO1xuXG5cdFx0XHRcdFx0XHRpZiAoIGVkZ2VzWyBrZXkgXSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0XHRcdGVkZ2VzWyBrZXkgXSA9IHsgaW5kZXgxOiBlZGdlWyAwIF0sIGluZGV4MjogZWRnZVsgMSBdIH07XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gZ2VuZXJhdGUgdmVydGljZXNcblxuXHRcdFx0Zm9yICgga2V5IGluIGVkZ2VzICkge1xuXG5cdFx0XHRcdGUgPSBlZGdlc1sga2V5IF07XG5cblx0XHRcdFx0dmVydGV4LmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uLCBlLmluZGV4MSApO1xuXHRcdFx0XHR2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7XG5cblx0XHRcdFx0dmVydGV4LmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uLCBlLmluZGV4MiApO1xuXHRcdFx0XHR2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIG5vbi1pbmRleGVkIEJ1ZmZlckdlb21ldHJ5XG5cblx0XHRcdHBvc2l0aW9uID0gZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbjtcblxuXHRcdFx0Zm9yICggaSA9IDAsIGwgPSAoIHBvc2l0aW9uLmNvdW50IC8gMyApOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRmb3IgKCBqID0gMDsgaiA8IDM7IGogKysgKSB7XG5cblx0XHRcdFx0XHQvLyB0aHJlZSBlZGdlcyBwZXIgdHJpYW5nbGUsIGFuIGVkZ2UgaXMgcmVwcmVzZW50ZWQgYXMgKGluZGV4MSwgaW5kZXgyKVxuXHRcdFx0XHRcdC8vIGUuZy4gdGhlIGZpcnN0IHRyaWFuZ2xlIGhhcyB0aGUgZm9sbG93aW5nIGVkZ2VzOiAoMCwxKSwoMSwyKSwoMiwwKVxuXG5cdFx0XHRcdFx0aW5kZXgxID0gMyAqIGkgKyBqO1xuXHRcdFx0XHRcdHZlcnRleC5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbiwgaW5kZXgxICk7XG5cdFx0XHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0XHRcdFx0aW5kZXgyID0gMyAqIGkgKyAoICggaiArIDEgKSAlIDMgKTtcblx0XHRcdFx0XHR2ZXJ0ZXguZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb24sIGluZGV4MiApO1xuXHRcdFx0XHRcdHZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gYnVpbGQgZ2VvbWV0cnlcblxuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcblxufVxuXG5XaXJlZnJhbWVHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTtcbldpcmVmcmFtZUdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFdpcmVmcmFtZUdlb21ldHJ5O1xuXG4vKipcbiAqIEBhdXRob3Igeno4NSAvIGh0dHBzOi8vZ2l0aHViLmNvbS96ejg1XG4gKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44N1xuICpcbiAqIFBhcmFtZXRyaWMgU3VyZmFjZXMgR2VvbWV0cnlcbiAqIGJhc2VkIG9uIHRoZSBicmlsbGlhbnQgYXJ0aWNsZSBieSBAcHJpZGVvdXQgaHR0cDovL3ByaWRlb3V0Lm5ldC9ibG9nLz9wPTQ0XG4gKi9cblxuLy8gUGFyYW1ldHJpY0dlb21ldHJ5XG5cbmZ1bmN0aW9uIFBhcmFtZXRyaWNHZW9tZXRyeSggZnVuYywgc2xpY2VzLCBzdGFja3MgKSB7XG5cblx0R2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdQYXJhbWV0cmljR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRmdW5jOiBmdW5jLFxuXHRcdHNsaWNlczogc2xpY2VzLFxuXHRcdHN0YWNrczogc3RhY2tzXG5cdH07XG5cblx0dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIG5ldyBQYXJhbWV0cmljQnVmZmVyR2VvbWV0cnkoIGZ1bmMsIHNsaWNlcywgc3RhY2tzICkgKTtcblx0dGhpcy5tZXJnZVZlcnRpY2VzKCk7XG5cbn1cblxuUGFyYW1ldHJpY0dlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEdlb21ldHJ5LnByb3RvdHlwZSApO1xuUGFyYW1ldHJpY0dlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFBhcmFtZXRyaWNHZW9tZXRyeTtcblxuLy8gUGFyYW1ldHJpY0J1ZmZlckdlb21ldHJ5XG5cbmZ1bmN0aW9uIFBhcmFtZXRyaWNCdWZmZXJHZW9tZXRyeSggZnVuYywgc2xpY2VzLCBzdGFja3MgKSB7XG5cblx0QnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdQYXJhbWV0cmljQnVmZmVyR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRmdW5jOiBmdW5jLFxuXHRcdHNsaWNlczogc2xpY2VzLFxuXHRcdHN0YWNrczogc3RhY2tzXG5cdH07XG5cblx0Ly8gYnVmZmVyc1xuXG5cdHZhciBpbmRpY2VzID0gW107XG5cdHZhciB2ZXJ0aWNlcyA9IFtdO1xuXHR2YXIgbm9ybWFscyA9IFtdO1xuXHR2YXIgdXZzID0gW107XG5cblx0dmFyIEVQUyA9IDAuMDAwMDE7XG5cblx0dmFyIG5vcm1hbCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0dmFyIHAwID0gbmV3IFZlY3RvcjMoKSwgcDEgPSBuZXcgVmVjdG9yMygpO1xuXHR2YXIgcHUgPSBuZXcgVmVjdG9yMygpLCBwdiA9IG5ldyBWZWN0b3IzKCk7XG5cblx0dmFyIGksIGo7XG5cblx0Ly8gZ2VuZXJhdGUgdmVydGljZXMsIG5vcm1hbHMgYW5kIHV2c1xuXG5cdHZhciBzbGljZUNvdW50ID0gc2xpY2VzICsgMTtcblxuXHRmb3IgKCBpID0gMDsgaSA8PSBzdGFja3M7IGkgKysgKSB7XG5cblx0XHR2YXIgdiA9IGkgLyBzdGFja3M7XG5cblx0XHRmb3IgKCBqID0gMDsgaiA8PSBzbGljZXM7IGogKysgKSB7XG5cblx0XHRcdHZhciB1ID0gaiAvIHNsaWNlcztcblxuXHRcdFx0Ly8gdmVydGV4XG5cblx0XHRcdHAwID0gZnVuYyggdSwgdiwgcDAgKTtcblx0XHRcdHZlcnRpY2VzLnB1c2goIHAwLngsIHAwLnksIHAwLnogKTtcblxuXHRcdFx0Ly8gbm9ybWFsXG5cblx0XHRcdC8vIGFwcHJveGltYXRlIHRhbmdlbnQgdmVjdG9ycyB2aWEgZmluaXRlIGRpZmZlcmVuY2VzXG5cblx0XHRcdGlmICggdSAtIEVQUyA+PSAwICkge1xuXG5cdFx0XHRcdHAxID0gZnVuYyggdSAtIEVQUywgdiwgcDEgKTtcblx0XHRcdFx0cHUuc3ViVmVjdG9ycyggcDAsIHAxICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0cDEgPSBmdW5jKCB1ICsgRVBTLCB2LCBwMSApO1xuXHRcdFx0XHRwdS5zdWJWZWN0b3JzKCBwMSwgcDAgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHYgLSBFUFMgPj0gMCApIHtcblxuXHRcdFx0XHRwMSA9IGZ1bmMoIHUsIHYgLSBFUFMsIHAxICk7XG5cdFx0XHRcdHB2LnN1YlZlY3RvcnMoIHAwLCBwMSApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHAxID0gZnVuYyggdSwgdiArIEVQUywgcDEgKTtcblx0XHRcdFx0cHYuc3ViVmVjdG9ycyggcDEsIHAwICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gY3Jvc3MgcHJvZHVjdCBvZiB0YW5nZW50IHZlY3RvcnMgcmV0dXJucyBzdXJmYWNlIG5vcm1hbFxuXG5cdFx0XHRub3JtYWwuY3Jvc3NWZWN0b3JzKCBwdSwgcHYgKS5ub3JtYWxpemUoKTtcblx0XHRcdG5vcm1hbHMucHVzaCggbm9ybWFsLngsIG5vcm1hbC55LCBub3JtYWwueiApO1xuXG5cdFx0XHQvLyB1dlxuXG5cdFx0XHR1dnMucHVzaCggdSwgdiApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHQvLyBnZW5lcmF0ZSBpbmRpY2VzXG5cblx0Zm9yICggaSA9IDA7IGkgPCBzdGFja3M7IGkgKysgKSB7XG5cblx0XHRmb3IgKCBqID0gMDsgaiA8IHNsaWNlczsgaiArKyApIHtcblxuXHRcdFx0dmFyIGEgPSBpICogc2xpY2VDb3VudCArIGo7XG5cdFx0XHR2YXIgYiA9IGkgKiBzbGljZUNvdW50ICsgaiArIDE7XG5cdFx0XHR2YXIgYyA9ICggaSArIDEgKSAqIHNsaWNlQ291bnQgKyBqICsgMTtcblx0XHRcdHZhciBkID0gKCBpICsgMSApICogc2xpY2VDb3VudCArIGo7XG5cblx0XHRcdC8vIGZhY2VzIG9uZSBhbmQgdHdvXG5cblx0XHRcdGluZGljZXMucHVzaCggYSwgYiwgZCApO1xuXHRcdFx0aW5kaWNlcy5wdXNoKCBiLCBjLCBkICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIGJ1aWxkIGdlb21ldHJ5XG5cblx0dGhpcy5zZXRJbmRleCggaW5kaWNlcyApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICdub3JtYWwnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbm9ybWFscywgMyApICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAyICkgKTtcblxufVxuXG5QYXJhbWV0cmljQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7XG5QYXJhbWV0cmljQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUGFyYW1ldHJpY0J1ZmZlckdlb21ldHJ5O1xuXG4vKipcbiAqIEBhdXRob3IgY2xvY2t3b3JrZ2VlayAvIGh0dHBzOi8vZ2l0aHViLmNvbS9jbG9ja3dvcmtnZWVrXG4gKiBAYXV0aG9yIHRpbW90aHlwcmF0bGV5IC8gaHR0cHM6Ly9naXRodWIuY29tL3RpbW90aHlwcmF0bGV5XG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXlcbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKi9cblxuLy8gUG9seWhlZHJvbkdlb21ldHJ5XG5cbmZ1bmN0aW9uIFBvbHloZWRyb25HZW9tZXRyeSggdmVydGljZXMsIGluZGljZXMsIHJhZGl1cywgZGV0YWlsICkge1xuXG5cdEdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnUG9seWhlZHJvbkdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0dmVydGljZXM6IHZlcnRpY2VzLFxuXHRcdGluZGljZXM6IGluZGljZXMsXG5cdFx0cmFkaXVzOiByYWRpdXMsXG5cdFx0ZGV0YWlsOiBkZXRhaWxcblx0fTtcblxuXHR0aGlzLmZyb21CdWZmZXJHZW9tZXRyeSggbmV3IFBvbHloZWRyb25CdWZmZXJHZW9tZXRyeSggdmVydGljZXMsIGluZGljZXMsIHJhZGl1cywgZGV0YWlsICkgKTtcblx0dGhpcy5tZXJnZVZlcnRpY2VzKCk7XG5cbn1cblxuUG9seWhlZHJvbkdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEdlb21ldHJ5LnByb3RvdHlwZSApO1xuUG9seWhlZHJvbkdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFBvbHloZWRyb25HZW9tZXRyeTtcblxuLy8gUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5XG5cbmZ1bmN0aW9uIFBvbHloZWRyb25CdWZmZXJHZW9tZXRyeSggdmVydGljZXMsIGluZGljZXMsIHJhZGl1cywgZGV0YWlsICkge1xuXG5cdEJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0dmVydGljZXM6IHZlcnRpY2VzLFxuXHRcdGluZGljZXM6IGluZGljZXMsXG5cdFx0cmFkaXVzOiByYWRpdXMsXG5cdFx0ZGV0YWlsOiBkZXRhaWxcblx0fTtcblxuXHRyYWRpdXMgPSByYWRpdXMgfHwgMTtcblx0ZGV0YWlsID0gZGV0YWlsIHx8IDA7XG5cblx0Ly8gZGVmYXVsdCBidWZmZXIgZGF0YVxuXG5cdHZhciB2ZXJ0ZXhCdWZmZXIgPSBbXTtcblx0dmFyIHV2QnVmZmVyID0gW107XG5cblx0Ly8gdGhlIHN1YmRpdmlzaW9uIGNyZWF0ZXMgdGhlIHZlcnRleCBidWZmZXIgZGF0YVxuXG5cdHN1YmRpdmlkZSggZGV0YWlsICk7XG5cblx0Ly8gYWxsIHZlcnRpY2VzIHNob3VsZCBsaWUgb24gYSBjb25jZXB0dWFsIHNwaGVyZSB3aXRoIGEgZ2l2ZW4gcmFkaXVzXG5cblx0YXBwcGx5UmFkaXVzKCByYWRpdXMgKTtcblxuXHQvLyBmaW5hbGx5LCBjcmVhdGUgdGhlIHV2IGRhdGFcblxuXHRnZW5lcmF0ZVVWcygpO1xuXG5cdC8vIGJ1aWxkIG5vbi1pbmRleGVkIGdlb21ldHJ5XG5cblx0dGhpcy5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0ZXhCdWZmZXIsIDMgKSApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0ZXhCdWZmZXIuc2xpY2UoKSwgMyApICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZCdWZmZXIsIDIgKSApO1xuXHR0aGlzLm5vcm1hbGl6ZU5vcm1hbHMoKTtcblxuXHQvLyBoZWxwZXIgZnVuY3Rpb25zXG5cblx0ZnVuY3Rpb24gc3ViZGl2aWRlKCBkZXRhaWwgKSB7XG5cblx0XHR2YXIgYSA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIGIgPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciBjID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdC8vIGl0ZXJhdGUgb3ZlciBhbGwgZmFjZXMgYW5kIGFwcGx5IGEgc3ViZGl2aXNvbiB3aXRoIHRoZSBnaXZlbiBkZXRhaWwgdmFsdWVcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGluZGljZXMubGVuZ3RoOyBpICs9IDMgKSB7XG5cblx0XHRcdC8vIGdldCB0aGUgdmVydGljZXMgb2YgdGhlIGZhY2VcblxuXHRcdFx0Z2V0VmVydGV4QnlJbmRleCggaW5kaWNlc1sgaSArIDAgXSwgYSApO1xuXHRcdFx0Z2V0VmVydGV4QnlJbmRleCggaW5kaWNlc1sgaSArIDEgXSwgYiApO1xuXHRcdFx0Z2V0VmVydGV4QnlJbmRleCggaW5kaWNlc1sgaSArIDIgXSwgYyApO1xuXG5cdFx0XHQvLyBwZXJmb3JtIHN1YmRpdmlzaW9uXG5cblx0XHRcdHN1YmRpdmlkZUZhY2UoIGEsIGIsIGMsIGRldGFpbCApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBzdWJkaXZpZGVGYWNlKCBhLCBiLCBjLCBkZXRhaWwgKSB7XG5cblx0XHR2YXIgY29scyA9IE1hdGgucG93KCAyLCBkZXRhaWwgKTtcblxuXHRcdC8vIHdlIHVzZSB0aGlzIG11bHRpZGltZW5zaW9uYWwgYXJyYXkgYXMgYSBkYXRhIHN0cnVjdHVyZSBmb3IgY3JlYXRpbmcgdGhlIHN1YmRpdmlzaW9uXG5cblx0XHR2YXIgdiA9IFtdO1xuXG5cdFx0dmFyIGksIGo7XG5cblx0XHQvLyBjb25zdHJ1Y3QgYWxsIG9mIHRoZSB2ZXJ0aWNlcyBmb3IgdGhpcyBzdWJkaXZpc2lvblxuXG5cdFx0Zm9yICggaSA9IDA7IGkgPD0gY29sczsgaSArKyApIHtcblxuXHRcdFx0dlsgaSBdID0gW107XG5cblx0XHRcdHZhciBhaiA9IGEuY2xvbmUoKS5sZXJwKCBjLCBpIC8gY29scyApO1xuXHRcdFx0dmFyIGJqID0gYi5jbG9uZSgpLmxlcnAoIGMsIGkgLyBjb2xzICk7XG5cblx0XHRcdHZhciByb3dzID0gY29scyAtIGk7XG5cblx0XHRcdGZvciAoIGogPSAwOyBqIDw9IHJvd3M7IGogKysgKSB7XG5cblx0XHRcdFx0aWYgKCBqID09PSAwICYmIGkgPT09IGNvbHMgKSB7XG5cblx0XHRcdFx0XHR2WyBpIF1bIGogXSA9IGFqO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHR2WyBpIF1bIGogXSA9IGFqLmNsb25lKCkubGVycCggYmosIGogLyByb3dzICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvLyBjb25zdHJ1Y3QgYWxsIG9mIHRoZSBmYWNlc1xuXG5cdFx0Zm9yICggaSA9IDA7IGkgPCBjb2xzOyBpICsrICkge1xuXG5cdFx0XHRmb3IgKCBqID0gMDsgaiA8IDIgKiAoIGNvbHMgLSBpICkgLSAxOyBqICsrICkge1xuXG5cdFx0XHRcdHZhciBrID0gTWF0aC5mbG9vciggaiAvIDIgKTtcblxuXHRcdFx0XHRpZiAoIGogJSAyID09PSAwICkge1xuXG5cdFx0XHRcdFx0cHVzaFZlcnRleCggdlsgaSBdWyBrICsgMSBdICk7XG5cdFx0XHRcdFx0cHVzaFZlcnRleCggdlsgaSArIDEgXVsgayBdICk7XG5cdFx0XHRcdFx0cHVzaFZlcnRleCggdlsgaSBdWyBrIF0gKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0cHVzaFZlcnRleCggdlsgaSBdWyBrICsgMSBdICk7XG5cdFx0XHRcdFx0cHVzaFZlcnRleCggdlsgaSArIDEgXVsgayArIDEgXSApO1xuXHRcdFx0XHRcdHB1c2hWZXJ0ZXgoIHZbIGkgKyAxIF1bIGsgXSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBhcHBwbHlSYWRpdXMoIHJhZGl1cyApIHtcblxuXHRcdHZhciB2ZXJ0ZXggPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0Ly8gaXRlcmF0ZSBvdmVyIHRoZSBlbnRpcmUgYnVmZmVyIGFuZCBhcHBseSB0aGUgcmFkaXVzIHRvIGVhY2ggdmVydGV4XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCB2ZXJ0ZXhCdWZmZXIubGVuZ3RoOyBpICs9IDMgKSB7XG5cblx0XHRcdHZlcnRleC54ID0gdmVydGV4QnVmZmVyWyBpICsgMCBdO1xuXHRcdFx0dmVydGV4LnkgPSB2ZXJ0ZXhCdWZmZXJbIGkgKyAxIF07XG5cdFx0XHR2ZXJ0ZXgueiA9IHZlcnRleEJ1ZmZlclsgaSArIDIgXTtcblxuXHRcdFx0dmVydGV4Lm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKCByYWRpdXMgKTtcblxuXHRcdFx0dmVydGV4QnVmZmVyWyBpICsgMCBdID0gdmVydGV4Lng7XG5cdFx0XHR2ZXJ0ZXhCdWZmZXJbIGkgKyAxIF0gPSB2ZXJ0ZXgueTtcblx0XHRcdHZlcnRleEJ1ZmZlclsgaSArIDIgXSA9IHZlcnRleC56O1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBnZW5lcmF0ZVVWcygpIHtcblxuXHRcdHZhciB2ZXJ0ZXggPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgdmVydGV4QnVmZmVyLmxlbmd0aDsgaSArPSAzICkge1xuXG5cdFx0XHR2ZXJ0ZXgueCA9IHZlcnRleEJ1ZmZlclsgaSArIDAgXTtcblx0XHRcdHZlcnRleC55ID0gdmVydGV4QnVmZmVyWyBpICsgMSBdO1xuXHRcdFx0dmVydGV4LnogPSB2ZXJ0ZXhCdWZmZXJbIGkgKyAyIF07XG5cblx0XHRcdHZhciB1ID0gYXppbXV0aCggdmVydGV4ICkgLyAyIC8gTWF0aC5QSSArIDAuNTtcblx0XHRcdHZhciB2ID0gaW5jbGluYXRpb24oIHZlcnRleCApIC8gTWF0aC5QSSArIDAuNTtcblx0XHRcdHV2QnVmZmVyLnB1c2goIHUsIDEgLSB2ICk7XG5cblx0XHR9XG5cblx0XHRjb3JyZWN0VVZzKCk7XG5cblx0XHRjb3JyZWN0U2VhbSgpO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBjb3JyZWN0U2VhbSgpIHtcblxuXHRcdC8vIGhhbmRsZSBjYXNlIHdoZW4gZmFjZSBzdHJhZGRsZXMgdGhlIHNlYW0sIHNlZSAjMzI2OVxuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgdXZCdWZmZXIubGVuZ3RoOyBpICs9IDYgKSB7XG5cblx0XHRcdC8vIHV2IGRhdGEgb2YgYSBzaW5nbGUgZmFjZVxuXG5cdFx0XHR2YXIgeDAgPSB1dkJ1ZmZlclsgaSArIDAgXTtcblx0XHRcdHZhciB4MSA9IHV2QnVmZmVyWyBpICsgMiBdO1xuXHRcdFx0dmFyIHgyID0gdXZCdWZmZXJbIGkgKyA0IF07XG5cblx0XHRcdHZhciBtYXggPSBNYXRoLm1heCggeDAsIHgxLCB4MiApO1xuXHRcdFx0dmFyIG1pbiA9IE1hdGgubWluKCB4MCwgeDEsIHgyICk7XG5cblx0XHRcdC8vIDAuOSBpcyBzb21ld2hhdCBhcmJpdHJhcnlcblxuXHRcdFx0aWYgKCBtYXggPiAwLjkgJiYgbWluIDwgMC4xICkge1xuXG5cdFx0XHRcdGlmICggeDAgPCAwLjIgKSB1dkJ1ZmZlclsgaSArIDAgXSArPSAxO1xuXHRcdFx0XHRpZiAoIHgxIDwgMC4yICkgdXZCdWZmZXJbIGkgKyAyIF0gKz0gMTtcblx0XHRcdFx0aWYgKCB4MiA8IDAuMiApIHV2QnVmZmVyWyBpICsgNCBdICs9IDE7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gcHVzaFZlcnRleCggdmVydGV4ICkge1xuXG5cdFx0dmVydGV4QnVmZmVyLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gZ2V0VmVydGV4QnlJbmRleCggaW5kZXgsIHZlcnRleCApIHtcblxuXHRcdHZhciBzdHJpZGUgPSBpbmRleCAqIDM7XG5cblx0XHR2ZXJ0ZXgueCA9IHZlcnRpY2VzWyBzdHJpZGUgKyAwIF07XG5cdFx0dmVydGV4LnkgPSB2ZXJ0aWNlc1sgc3RyaWRlICsgMSBdO1xuXHRcdHZlcnRleC56ID0gdmVydGljZXNbIHN0cmlkZSArIDIgXTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gY29ycmVjdFVWcygpIHtcblxuXHRcdHZhciBhID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgYiA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIGMgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0dmFyIGNlbnRyb2lkID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHZhciB1dkEgPSBuZXcgVmVjdG9yMigpO1xuXHRcdHZhciB1dkIgPSBuZXcgVmVjdG9yMigpO1xuXHRcdHZhciB1dkMgPSBuZXcgVmVjdG9yMigpO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBqID0gMDsgaSA8IHZlcnRleEJ1ZmZlci5sZW5ndGg7IGkgKz0gOSwgaiArPSA2ICkge1xuXG5cdFx0XHRhLnNldCggdmVydGV4QnVmZmVyWyBpICsgMCBdLCB2ZXJ0ZXhCdWZmZXJbIGkgKyAxIF0sIHZlcnRleEJ1ZmZlclsgaSArIDIgXSApO1xuXHRcdFx0Yi5zZXQoIHZlcnRleEJ1ZmZlclsgaSArIDMgXSwgdmVydGV4QnVmZmVyWyBpICsgNCBdLCB2ZXJ0ZXhCdWZmZXJbIGkgKyA1IF0gKTtcblx0XHRcdGMuc2V0KCB2ZXJ0ZXhCdWZmZXJbIGkgKyA2IF0sIHZlcnRleEJ1ZmZlclsgaSArIDcgXSwgdmVydGV4QnVmZmVyWyBpICsgOCBdICk7XG5cblx0XHRcdHV2QS5zZXQoIHV2QnVmZmVyWyBqICsgMCBdLCB1dkJ1ZmZlclsgaiArIDEgXSApO1xuXHRcdFx0dXZCLnNldCggdXZCdWZmZXJbIGogKyAyIF0sIHV2QnVmZmVyWyBqICsgMyBdICk7XG5cdFx0XHR1dkMuc2V0KCB1dkJ1ZmZlclsgaiArIDQgXSwgdXZCdWZmZXJbIGogKyA1IF0gKTtcblxuXHRcdFx0Y2VudHJvaWQuY29weSggYSApLmFkZCggYiApLmFkZCggYyApLmRpdmlkZVNjYWxhciggMyApO1xuXG5cdFx0XHR2YXIgYXppID0gYXppbXV0aCggY2VudHJvaWQgKTtcblxuXHRcdFx0Y29ycmVjdFVWKCB1dkEsIGogKyAwLCBhLCBhemkgKTtcblx0XHRcdGNvcnJlY3RVViggdXZCLCBqICsgMiwgYiwgYXppICk7XG5cdFx0XHRjb3JyZWN0VVYoIHV2QywgaiArIDQsIGMsIGF6aSApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBjb3JyZWN0VVYoIHV2LCBzdHJpZGUsIHZlY3RvciwgYXppbXV0aCApIHtcblxuXHRcdGlmICggKCBhemltdXRoIDwgMCApICYmICggdXYueCA9PT0gMSApICkge1xuXG5cdFx0XHR1dkJ1ZmZlclsgc3RyaWRlIF0gPSB1di54IC0gMTtcblxuXHRcdH1cblxuXHRcdGlmICggKCB2ZWN0b3IueCA9PT0gMCApICYmICggdmVjdG9yLnogPT09IDAgKSApIHtcblxuXHRcdFx0dXZCdWZmZXJbIHN0cmlkZSBdID0gYXppbXV0aCAvIDIgLyBNYXRoLlBJICsgMC41O1xuXG5cdFx0fVxuXG5cdH1cblxuXHQvLyBBbmdsZSBhcm91bmQgdGhlIFkgYXhpcywgY291bnRlci1jbG9ja3dpc2Ugd2hlbiBsb29raW5nIGZyb20gYWJvdmUuXG5cblx0ZnVuY3Rpb24gYXppbXV0aCggdmVjdG9yICkge1xuXG5cdFx0cmV0dXJuIE1hdGguYXRhbjIoIHZlY3Rvci56LCAtIHZlY3Rvci54ICk7XG5cblx0fVxuXG5cblx0Ly8gQW5nbGUgYWJvdmUgdGhlIFhaIHBsYW5lLlxuXG5cdGZ1bmN0aW9uIGluY2xpbmF0aW9uKCB2ZWN0b3IgKSB7XG5cblx0XHRyZXR1cm4gTWF0aC5hdGFuMiggLSB2ZWN0b3IueSwgTWF0aC5zcXJ0KCAoIHZlY3Rvci54ICogdmVjdG9yLnggKSArICggdmVjdG9yLnogKiB2ZWN0b3IueiApICkgKTtcblxuXHR9XG5cbn1cblxuUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApO1xuUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFBvbHloZWRyb25CdWZmZXJHZW9tZXRyeTtcblxuLyoqXG4gKiBAYXV0aG9yIHRpbW90aHlwcmF0bGV5IC8gaHR0cHM6Ly9naXRodWIuY29tL3RpbW90aHlwcmF0bGV5XG4gKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44N1xuICovXG5cbi8vIFRldHJhaGVkcm9uR2VvbWV0cnlcblxuZnVuY3Rpb24gVGV0cmFoZWRyb25HZW9tZXRyeSggcmFkaXVzLCBkZXRhaWwgKSB7XG5cblx0R2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdUZXRyYWhlZHJvbkdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0cmFkaXVzOiByYWRpdXMsXG5cdFx0ZGV0YWlsOiBkZXRhaWxcblx0fTtcblxuXHR0aGlzLmZyb21CdWZmZXJHZW9tZXRyeSggbmV3IFRldHJhaGVkcm9uQnVmZmVyR2VvbWV0cnkoIHJhZGl1cywgZGV0YWlsICkgKTtcblx0dGhpcy5tZXJnZVZlcnRpY2VzKCk7XG5cbn1cblxuVGV0cmFoZWRyb25HZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBHZW9tZXRyeS5wcm90b3R5cGUgKTtcblRldHJhaGVkcm9uR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVGV0cmFoZWRyb25HZW9tZXRyeTtcblxuLy8gVGV0cmFoZWRyb25CdWZmZXJHZW9tZXRyeVxuXG5mdW5jdGlvbiBUZXRyYWhlZHJvbkJ1ZmZlckdlb21ldHJ5KCByYWRpdXMsIGRldGFpbCApIHtcblxuXHR2YXIgdmVydGljZXMgPSBbXG5cdFx0MSwgIDEsICAxLCAgIC0gMSwgLSAxLCAgMSwgICAtIDEsICAxLCAtIDEsICAgIDEsIC0gMSwgLSAxXG5cdF07XG5cblx0dmFyIGluZGljZXMgPSBbXG5cdFx0MiwgIDEsICAwLCAgICAwLCAgMywgIDIsICAgIDEsICAzLCAgMCwgICAgMiwgIDMsICAxXG5cdF07XG5cblx0UG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMsIHZlcnRpY2VzLCBpbmRpY2VzLCByYWRpdXMsIGRldGFpbCApO1xuXG5cdHRoaXMudHlwZSA9ICdUZXRyYWhlZHJvbkJ1ZmZlckdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0cmFkaXVzOiByYWRpdXMsXG5cdFx0ZGV0YWlsOiBkZXRhaWxcblx0fTtcblxufVxuXG5UZXRyYWhlZHJvbkJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIFBvbHloZWRyb25CdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTtcblRldHJhaGVkcm9uQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVGV0cmFoZWRyb25CdWZmZXJHZW9tZXRyeTtcblxuLyoqXG4gKiBAYXV0aG9yIHRpbW90aHlwcmF0bGV5IC8gaHR0cHM6Ly9naXRodWIuY29tL3RpbW90aHlwcmF0bGV5XG4gKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44N1xuICovXG5cbi8vIE9jdGFoZWRyb25HZW9tZXRyeVxuXG5mdW5jdGlvbiBPY3RhaGVkcm9uR2VvbWV0cnkoIHJhZGl1cywgZGV0YWlsICkge1xuXG5cdEdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnT2N0YWhlZHJvbkdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0cmFkaXVzOiByYWRpdXMsXG5cdFx0ZGV0YWlsOiBkZXRhaWxcblx0fTtcblxuXHR0aGlzLmZyb21CdWZmZXJHZW9tZXRyeSggbmV3IE9jdGFoZWRyb25CdWZmZXJHZW9tZXRyeSggcmFkaXVzLCBkZXRhaWwgKSApO1xuXHR0aGlzLm1lcmdlVmVydGljZXMoKTtcblxufVxuXG5PY3RhaGVkcm9uR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7XG5PY3RhaGVkcm9uR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gT2N0YWhlZHJvbkdlb21ldHJ5O1xuXG4vLyBPY3RhaGVkcm9uQnVmZmVyR2VvbWV0cnlcblxuZnVuY3Rpb24gT2N0YWhlZHJvbkJ1ZmZlckdlb21ldHJ5KCByYWRpdXMsIGRldGFpbCApIHtcblxuXHR2YXIgdmVydGljZXMgPSBbXG5cdFx0MSwgMCwgMCwgICAtIDEsIDAsIDAsICAgIDAsIDEsIDAsICAgIDAsIC0gMSwgMCwgICAgMCwgMCwgMSwgICAgMCwgMCwgLSAxXG5cdF07XG5cblx0dmFyIGluZGljZXMgPSBbXG5cdFx0MCwgMiwgNCwgICAgMCwgNCwgMywgICAgMCwgMywgNSwgICAgMCwgNSwgMiwgICAgMSwgMiwgNSwgICAgMSwgNSwgMywgICAgMSwgMywgNCwgICAgMSwgNCwgMlxuXHRdO1xuXG5cdFBvbHloZWRyb25CdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzLCB2ZXJ0aWNlcywgaW5kaWNlcywgcmFkaXVzLCBkZXRhaWwgKTtcblxuXHR0aGlzLnR5cGUgPSAnT2N0YWhlZHJvbkJ1ZmZlckdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0cmFkaXVzOiByYWRpdXMsXG5cdFx0ZGV0YWlsOiBkZXRhaWxcblx0fTtcblxufVxuXG5PY3RhaGVkcm9uQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApO1xuT2N0YWhlZHJvbkJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE9jdGFoZWRyb25CdWZmZXJHZW9tZXRyeTtcblxuLyoqXG4gKiBAYXV0aG9yIHRpbW90aHlwcmF0bGV5IC8gaHR0cHM6Ly9naXRodWIuY29tL3RpbW90aHlwcmF0bGV5XG4gKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44N1xuICovXG5cbi8vIEljb3NhaGVkcm9uR2VvbWV0cnlcblxuZnVuY3Rpb24gSWNvc2FoZWRyb25HZW9tZXRyeSggcmFkaXVzLCBkZXRhaWwgKSB7XG5cbiBcdEdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnSWNvc2FoZWRyb25HZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdGRldGFpbDogZGV0YWlsXG5cdH07XG5cblx0dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIG5ldyBJY29zYWhlZHJvbkJ1ZmZlckdlb21ldHJ5KCByYWRpdXMsIGRldGFpbCApICk7XG5cdHRoaXMubWVyZ2VWZXJ0aWNlcygpO1xuXG59XG5cbkljb3NhaGVkcm9uR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7XG5JY29zYWhlZHJvbkdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEljb3NhaGVkcm9uR2VvbWV0cnk7XG5cbi8vIEljb3NhaGVkcm9uQnVmZmVyR2VvbWV0cnlcblxuZnVuY3Rpb24gSWNvc2FoZWRyb25CdWZmZXJHZW9tZXRyeSggcmFkaXVzLCBkZXRhaWwgKSB7XG5cblx0dmFyIHQgPSAoIDEgKyBNYXRoLnNxcnQoIDUgKSApIC8gMjtcblxuXHR2YXIgdmVydGljZXMgPSBbXG5cdFx0LSAxLCAgdCwgIDAsICAgIDEsICB0LCAgMCwgICAtIDEsIC0gdCwgIDAsICAgIDEsIC0gdCwgIDAsXG5cdFx0IDAsIC0gMSwgIHQsICAgIDAsICAxLCAgdCwgICAgMCwgLSAxLCAtIHQsICAgIDAsICAxLCAtIHQsXG5cdFx0IHQsICAwLCAtIDEsICAgIHQsICAwLCAgMSwgICAtIHQsICAwLCAtIDEsICAgLSB0LCAgMCwgIDFcblx0XTtcblxuXHR2YXIgaW5kaWNlcyA9IFtcblx0XHQgMCwgMTEsICA1LCAgICAwLCAgNSwgIDEsICAgIDAsICAxLCAgNywgICAgMCwgIDcsIDEwLCAgICAwLCAxMCwgMTEsXG5cdFx0IDEsICA1LCAgOSwgICAgNSwgMTEsICA0LCAgIDExLCAxMCwgIDIsICAgMTAsICA3LCAgNiwgICAgNywgIDEsICA4LFxuXHRcdCAzLCAgOSwgIDQsICAgIDMsICA0LCAgMiwgICAgMywgIDIsICA2LCAgICAzLCAgNiwgIDgsICAgIDMsICA4LCAgOSxcblx0XHQgNCwgIDksICA1LCAgICAyLCAgNCwgMTEsICAgIDYsICAyLCAxMCwgICAgOCwgIDYsICA3LCAgICA5LCAgOCwgIDFcblx0XTtcblxuXHRQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcywgdmVydGljZXMsIGluZGljZXMsIHJhZGl1cywgZGV0YWlsICk7XG5cblx0dGhpcy50eXBlID0gJ0ljb3NhaGVkcm9uQnVmZmVyR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRyYWRpdXM6IHJhZGl1cyxcblx0XHRkZXRhaWw6IGRldGFpbFxuXHR9O1xuXG59XG5cbkljb3NhaGVkcm9uQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApO1xuSWNvc2FoZWRyb25CdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBJY29zYWhlZHJvbkJ1ZmZlckdlb21ldHJ5O1xuXG4vKipcbiAqIEBhdXRob3IgQWJlIFBhem9zIC8gaHR0cHM6Ly9oYW1vaWQuY29tXG4gKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44N1xuICovXG5cbi8vIERvZGVjYWhlZHJvbkdlb21ldHJ5XG5cbmZ1bmN0aW9uIERvZGVjYWhlZHJvbkdlb21ldHJ5KCByYWRpdXMsIGRldGFpbCApIHtcblxuXHRHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0RvZGVjYWhlZHJvbkdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0cmFkaXVzOiByYWRpdXMsXG5cdFx0ZGV0YWlsOiBkZXRhaWxcblx0fTtcblxuXHR0aGlzLmZyb21CdWZmZXJHZW9tZXRyeSggbmV3IERvZGVjYWhlZHJvbkJ1ZmZlckdlb21ldHJ5KCByYWRpdXMsIGRldGFpbCApICk7XG5cdHRoaXMubWVyZ2VWZXJ0aWNlcygpO1xuXG59XG5cbkRvZGVjYWhlZHJvbkdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEdlb21ldHJ5LnByb3RvdHlwZSApO1xuRG9kZWNhaGVkcm9uR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gRG9kZWNhaGVkcm9uR2VvbWV0cnk7XG5cbi8vIERvZGVjYWhlZHJvbkJ1ZmZlckdlb21ldHJ5XG5cbmZ1bmN0aW9uIERvZGVjYWhlZHJvbkJ1ZmZlckdlb21ldHJ5KCByYWRpdXMsIGRldGFpbCApIHtcblxuXHR2YXIgdCA9ICggMSArIE1hdGguc3FydCggNSApICkgLyAyO1xuXHR2YXIgciA9IDEgLyB0O1xuXG5cdHZhciB2ZXJ0aWNlcyA9IFtcblxuXHRcdC8vICjCsTEsIMKxMSwgwrExKVxuXHRcdC0gMSwgLSAxLCAtIDEsICAgIC0gMSwgLSAxLCAgMSxcblx0XHQtIDEsICAxLCAtIDEsICAgIC0gMSwgIDEsICAxLFxuXHRcdCAgMSwgLSAxLCAtIDEsICAgICAxLCAtIDEsICAxLFxuXHRcdCAgMSwgIDEsIC0gMSwgICAgIDEsICAxLCAgMSxcblxuXHRcdC8vICgwLCDCsTEvz4YsIMKxz4YpXG5cdFx0IDAsIC0gciwgLSB0LCAgICAgMCwgLSByLCAgdCxcblx0XHQgMCwgIHIsIC0gdCwgICAgIDAsICByLCAgdCxcblxuXHRcdC8vICjCsTEvz4YsIMKxz4YsIDApXG5cdFx0LSByLCAtIHQsICAwLCAgICAtIHIsICB0LCAgMCxcblx0XHQgciwgLSB0LCAgMCwgICAgIHIsICB0LCAgMCxcblxuXHRcdC8vICjCsc+GLCAwLCDCsTEvz4YpXG5cdFx0LSB0LCAgMCwgLSByLCAgICAgdCwgIDAsIC0gcixcblx0XHQtIHQsICAwLCAgciwgICAgIHQsICAwLCAgclxuXHRdO1xuXG5cdHZhciBpbmRpY2VzID0gW1xuXHRcdCAzLCAxMSwgIDcsICAgICAgMywgIDcsIDE1LCAgICAgIDMsIDE1LCAxMyxcblx0XHQgNywgMTksIDE3LCAgICAgIDcsIDE3LCAgNiwgICAgICA3LCAgNiwgMTUsXG5cdFx0MTcsICA0LCAgOCwgICAgIDE3LCAgOCwgMTAsICAgICAxNywgMTAsICA2LFxuXHRcdCA4LCAgMCwgMTYsICAgICAgOCwgMTYsICAyLCAgICAgIDgsICAyLCAxMCxcblx0XHQgMCwgMTIsICAxLCAgICAgIDAsICAxLCAxOCwgICAgICAwLCAxOCwgMTYsXG5cdFx0IDYsIDEwLCAgMiwgICAgICA2LCAgMiwgMTMsICAgICAgNiwgMTMsIDE1LFxuXHRcdCAyLCAxNiwgMTgsICAgICAgMiwgMTgsICAzLCAgICAgIDIsICAzLCAxMyxcblx0XHQxOCwgIDEsICA5LCAgICAgMTgsICA5LCAxMSwgICAgIDE4LCAxMSwgIDMsXG5cdFx0IDQsIDE0LCAxMiwgICAgICA0LCAxMiwgIDAsICAgICAgNCwgIDAsICA4LFxuXHRcdDExLCAgOSwgIDUsICAgICAxMSwgIDUsIDE5LCAgICAgMTEsIDE5LCAgNyxcblx0XHQxOSwgIDUsIDE0LCAgICAgMTksIDE0LCAgNCwgICAgIDE5LCAgNCwgMTcsXG5cdFx0IDEsIDEyLCAxNCwgICAgICAxLCAxNCwgIDUsICAgICAgMSwgIDUsICA5XG5cdF07XG5cblx0UG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMsIHZlcnRpY2VzLCBpbmRpY2VzLCByYWRpdXMsIGRldGFpbCApO1xuXG5cdHRoaXMudHlwZSA9ICdEb2RlY2FoZWRyb25CdWZmZXJHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdGRldGFpbDogZGV0YWlsXG5cdH07XG5cbn1cblxuRG9kZWNhaGVkcm9uQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApO1xuRG9kZWNhaGVkcm9uQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gRG9kZWNhaGVkcm9uQnVmZmVyR2VvbWV0cnk7XG5cbi8qKlxuICogQGF1dGhvciBvb3Ntb3hpZWNvZGUgLyBodHRwczovL2dpdGh1Yi5jb20vb29zbW94aWVjb2RlXG4gKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cHM6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKiBAYXV0aG9yIHp6ODUgLyBodHRwczovL2dpdGh1Yi5jb20veno4NVxuICogQGF1dGhvciBtaW5pbmdvbGQgLyBodHRwczovL2dpdGh1Yi5jb20vbWluaW5nb2xkXG4gKiBAYXV0aG9yIGpvbm9icjEgLyBodHRwczovL2dpdGh1Yi5jb20vam9ub2JyMVxuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqXG4gKi9cblxuLy8gVHViZUdlb21ldHJ5XG5cbmZ1bmN0aW9uIFR1YmVHZW9tZXRyeSggcGF0aCwgdHVidWxhclNlZ21lbnRzLCByYWRpdXMsIHJhZGlhbFNlZ21lbnRzLCBjbG9zZWQsIHRhcGVyICkge1xuXG5cdEdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnVHViZUdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0cGF0aDogcGF0aCxcblx0XHR0dWJ1bGFyU2VnbWVudHM6IHR1YnVsYXJTZWdtZW50cyxcblx0XHRyYWRpdXM6IHJhZGl1cyxcblx0XHRyYWRpYWxTZWdtZW50czogcmFkaWFsU2VnbWVudHMsXG5cdFx0Y2xvc2VkOiBjbG9zZWRcblx0fTtcblxuXHRpZiAoIHRhcGVyICE9PSB1bmRlZmluZWQgKSBjb25zb2xlLndhcm4oICdUSFJFRS5UdWJlR2VvbWV0cnk6IHRhcGVyIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdHZhciBidWZmZXJHZW9tZXRyeSA9IG5ldyBUdWJlQnVmZmVyR2VvbWV0cnkoIHBhdGgsIHR1YnVsYXJTZWdtZW50cywgcmFkaXVzLCByYWRpYWxTZWdtZW50cywgY2xvc2VkICk7XG5cblx0Ly8gZXhwb3NlIGludGVybmFsc1xuXG5cdHRoaXMudGFuZ2VudHMgPSBidWZmZXJHZW9tZXRyeS50YW5nZW50cztcblx0dGhpcy5ub3JtYWxzID0gYnVmZmVyR2VvbWV0cnkubm9ybWFscztcblx0dGhpcy5iaW5vcm1hbHMgPSBidWZmZXJHZW9tZXRyeS5iaW5vcm1hbHM7XG5cblx0Ly8gY3JlYXRlIGdlb21ldHJ5XG5cblx0dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIGJ1ZmZlckdlb21ldHJ5ICk7XG5cdHRoaXMubWVyZ2VWZXJ0aWNlcygpO1xuXG59XG5cblR1YmVHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBHZW9tZXRyeS5wcm90b3R5cGUgKTtcblR1YmVHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBUdWJlR2VvbWV0cnk7XG5cbi8vIFR1YmVCdWZmZXJHZW9tZXRyeVxuXG5mdW5jdGlvbiBUdWJlQnVmZmVyR2VvbWV0cnkoIHBhdGgsIHR1YnVsYXJTZWdtZW50cywgcmFkaXVzLCByYWRpYWxTZWdtZW50cywgY2xvc2VkICkge1xuXG5cdEJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnVHViZUJ1ZmZlckdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0cGF0aDogcGF0aCxcblx0XHR0dWJ1bGFyU2VnbWVudHM6IHR1YnVsYXJTZWdtZW50cyxcblx0XHRyYWRpdXM6IHJhZGl1cyxcblx0XHRyYWRpYWxTZWdtZW50czogcmFkaWFsU2VnbWVudHMsXG5cdFx0Y2xvc2VkOiBjbG9zZWRcblx0fTtcblxuXHR0dWJ1bGFyU2VnbWVudHMgPSB0dWJ1bGFyU2VnbWVudHMgfHwgNjQ7XG5cdHJhZGl1cyA9IHJhZGl1cyB8fCAxO1xuXHRyYWRpYWxTZWdtZW50cyA9IHJhZGlhbFNlZ21lbnRzIHx8IDg7XG5cdGNsb3NlZCA9IGNsb3NlZCB8fCBmYWxzZTtcblxuXHR2YXIgZnJhbWVzID0gcGF0aC5jb21wdXRlRnJlbmV0RnJhbWVzKCB0dWJ1bGFyU2VnbWVudHMsIGNsb3NlZCApO1xuXG5cdC8vIGV4cG9zZSBpbnRlcm5hbHNcblxuXHR0aGlzLnRhbmdlbnRzID0gZnJhbWVzLnRhbmdlbnRzO1xuXHR0aGlzLm5vcm1hbHMgPSBmcmFtZXMubm9ybWFscztcblx0dGhpcy5iaW5vcm1hbHMgPSBmcmFtZXMuYmlub3JtYWxzO1xuXG5cdC8vIGhlbHBlciB2YXJpYWJsZXNcblxuXHR2YXIgdmVydGV4ID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIG5vcm1hbCA9IG5ldyBWZWN0b3IzKCk7XG5cdHZhciB1diA9IG5ldyBWZWN0b3IyKCk7XG5cblx0dmFyIGksIGo7XG5cblx0Ly8gYnVmZmVyXG5cblx0dmFyIHZlcnRpY2VzID0gW107XG5cdHZhciBub3JtYWxzID0gW107XG5cdHZhciB1dnMgPSBbXTtcblx0dmFyIGluZGljZXMgPSBbXTtcblxuXHQvLyBjcmVhdGUgYnVmZmVyIGRhdGFcblxuXHRnZW5lcmF0ZUJ1ZmZlckRhdGEoKTtcblxuXHQvLyBidWlsZCBnZW9tZXRyeVxuXG5cdHRoaXMuc2V0SW5kZXgoIGluZGljZXMgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIG5vcm1hbHMsIDMgKSApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2cywgMiApICk7XG5cblx0Ly8gZnVuY3Rpb25zXG5cblx0ZnVuY3Rpb24gZ2VuZXJhdGVCdWZmZXJEYXRhKCkge1xuXG5cdFx0Zm9yICggaSA9IDA7IGkgPCB0dWJ1bGFyU2VnbWVudHM7IGkgKysgKSB7XG5cblx0XHRcdGdlbmVyYXRlU2VnbWVudCggaSApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gaWYgdGhlIGdlb21ldHJ5IGlzIG5vdCBjbG9zZWQsIGdlbmVyYXRlIHRoZSBsYXN0IHJvdyBvZiB2ZXJ0aWNlcyBhbmQgbm9ybWFsc1xuXHRcdC8vIGF0IHRoZSByZWd1bGFyIHBvc2l0aW9uIG9uIHRoZSBnaXZlbiBwYXRoXG5cdFx0Ly9cblx0XHQvLyBpZiB0aGUgZ2VvbWV0cnkgaXMgY2xvc2VkLCBkdXBsaWNhdGUgdGhlIGZpcnN0IHJvdyBvZiB2ZXJ0aWNlcyBhbmQgbm9ybWFscyAodXZzIHdpbGwgZGlmZmVyKVxuXG5cdFx0Z2VuZXJhdGVTZWdtZW50KCAoIGNsb3NlZCA9PT0gZmFsc2UgKSA/IHR1YnVsYXJTZWdtZW50cyA6IDAgKTtcblxuXHRcdC8vIHV2cyBhcmUgZ2VuZXJhdGVkIGluIGEgc2VwYXJhdGUgZnVuY3Rpb24uXG5cdFx0Ly8gdGhpcyBtYWtlcyBpdCBlYXN5IGNvbXB1dGUgY29ycmVjdCB2YWx1ZXMgZm9yIGNsb3NlZCBnZW9tZXRyaWVzXG5cblx0XHRnZW5lcmF0ZVVWcygpO1xuXG5cdFx0Ly8gZmluYWxseSBjcmVhdGUgZmFjZXNcblxuXHRcdGdlbmVyYXRlSW5kaWNlcygpO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBnZW5lcmF0ZVNlZ21lbnQoIGkgKSB7XG5cblx0XHQvLyB3ZSB1c2UgZ2V0UG9pbnRBdCB0byBzYW1wbGUgZXZlbmx5IGRpc3RyaWJ1dGVkIHBvaW50cyBmcm9tIHRoZSBnaXZlbiBwYXRoXG5cblx0XHR2YXIgUCA9IHBhdGguZ2V0UG9pbnRBdCggaSAvIHR1YnVsYXJTZWdtZW50cyApO1xuXG5cdFx0Ly8gcmV0cmlldmUgY29ycmVzcG9uZGluZyBub3JtYWwgYW5kIGJpbm9ybWFsXG5cblx0XHR2YXIgTiA9IGZyYW1lcy5ub3JtYWxzWyBpIF07XG5cdFx0dmFyIEIgPSBmcmFtZXMuYmlub3JtYWxzWyBpIF07XG5cblx0XHQvLyBnZW5lcmF0ZSBub3JtYWxzIGFuZCB2ZXJ0aWNlcyBmb3IgdGhlIGN1cnJlbnQgc2VnbWVudFxuXG5cdFx0Zm9yICggaiA9IDA7IGogPD0gcmFkaWFsU2VnbWVudHM7IGogKysgKSB7XG5cblx0XHRcdHZhciB2ID0gaiAvIHJhZGlhbFNlZ21lbnRzICogTWF0aC5QSSAqIDI7XG5cblx0XHRcdHZhciBzaW4gPSAgIE1hdGguc2luKCB2ICk7XG5cdFx0XHR2YXIgY29zID0gLSBNYXRoLmNvcyggdiApO1xuXG5cdFx0XHQvLyBub3JtYWxcblxuXHRcdFx0bm9ybWFsLnggPSAoIGNvcyAqIE4ueCArIHNpbiAqIEIueCApO1xuXHRcdFx0bm9ybWFsLnkgPSAoIGNvcyAqIE4ueSArIHNpbiAqIEIueSApO1xuXHRcdFx0bm9ybWFsLnogPSAoIGNvcyAqIE4ueiArIHNpbiAqIEIueiApO1xuXHRcdFx0bm9ybWFsLm5vcm1hbGl6ZSgpO1xuXG5cdFx0XHRub3JtYWxzLnB1c2goIG5vcm1hbC54LCBub3JtYWwueSwgbm9ybWFsLnogKTtcblxuXHRcdFx0Ly8gdmVydGV4XG5cblx0XHRcdHZlcnRleC54ID0gUC54ICsgcmFkaXVzICogbm9ybWFsLng7XG5cdFx0XHR2ZXJ0ZXgueSA9IFAueSArIHJhZGl1cyAqIG5vcm1hbC55O1xuXHRcdFx0dmVydGV4LnogPSBQLnogKyByYWRpdXMgKiBub3JtYWwuejtcblxuXHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBnZW5lcmF0ZUluZGljZXMoKSB7XG5cblx0XHRmb3IgKCBqID0gMTsgaiA8PSB0dWJ1bGFyU2VnbWVudHM7IGogKysgKSB7XG5cblx0XHRcdGZvciAoIGkgPSAxOyBpIDw9IHJhZGlhbFNlZ21lbnRzOyBpICsrICkge1xuXG5cdFx0XHRcdHZhciBhID0gKCByYWRpYWxTZWdtZW50cyArIDEgKSAqICggaiAtIDEgKSArICggaSAtIDEgKTtcblx0XHRcdFx0dmFyIGIgPSAoIHJhZGlhbFNlZ21lbnRzICsgMSApICogaiArICggaSAtIDEgKTtcblx0XHRcdFx0dmFyIGMgPSAoIHJhZGlhbFNlZ21lbnRzICsgMSApICogaiArIGk7XG5cdFx0XHRcdHZhciBkID0gKCByYWRpYWxTZWdtZW50cyArIDEgKSAqICggaiAtIDEgKSArIGk7XG5cblx0XHRcdFx0Ly8gZmFjZXNcblxuXHRcdFx0XHRpbmRpY2VzLnB1c2goIGEsIGIsIGQgKTtcblx0XHRcdFx0aW5kaWNlcy5wdXNoKCBiLCBjLCBkICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gZ2VuZXJhdGVVVnMoKSB7XG5cblx0XHRmb3IgKCBpID0gMDsgaSA8PSB0dWJ1bGFyU2VnbWVudHM7IGkgKysgKSB7XG5cblx0XHRcdGZvciAoIGogPSAwOyBqIDw9IHJhZGlhbFNlZ21lbnRzOyBqICsrICkge1xuXG5cdFx0XHRcdHV2LnggPSBpIC8gdHVidWxhclNlZ21lbnRzO1xuXHRcdFx0XHR1di55ID0gaiAvIHJhZGlhbFNlZ21lbnRzO1xuXG5cdFx0XHRcdHV2cy5wdXNoKCB1di54LCB1di55ICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9XG5cbn1cblxuVHViZUJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApO1xuVHViZUJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFR1YmVCdWZmZXJHZW9tZXRyeTtcblxuLyoqXG4gKiBAYXV0aG9yIG9vc21veGllY29kZVxuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqXG4gKiBiYXNlZCBvbiBodHRwOi8vd3d3LmJsYWNrcGF3bi5jb20vdGV4dHMvcHF0b3J1cy9cbiAqL1xuXG4vLyBUb3J1c0tub3RHZW9tZXRyeVxuXG5mdW5jdGlvbiBUb3J1c0tub3RHZW9tZXRyeSggcmFkaXVzLCB0dWJlLCB0dWJ1bGFyU2VnbWVudHMsIHJhZGlhbFNlZ21lbnRzLCBwLCBxLCBoZWlnaHRTY2FsZSApIHtcblxuXHRHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1RvcnVzS25vdEdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0cmFkaXVzOiByYWRpdXMsXG5cdFx0dHViZTogdHViZSxcblx0XHR0dWJ1bGFyU2VnbWVudHM6IHR1YnVsYXJTZWdtZW50cyxcblx0XHRyYWRpYWxTZWdtZW50czogcmFkaWFsU2VnbWVudHMsXG5cdFx0cDogcCxcblx0XHRxOiBxXG5cdH07XG5cblx0aWYgKCBoZWlnaHRTY2FsZSAhPT0gdW5kZWZpbmVkICkgY29uc29sZS53YXJuKCAnVEhSRUUuVG9ydXNLbm90R2VvbWV0cnk6IGhlaWdodFNjYWxlIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAuc2NhbGUoIHgsIHksIHogKSBpbnN0ZWFkLicgKTtcblxuXHR0aGlzLmZyb21CdWZmZXJHZW9tZXRyeSggbmV3IFRvcnVzS25vdEJ1ZmZlckdlb21ldHJ5KCByYWRpdXMsIHR1YmUsIHR1YnVsYXJTZWdtZW50cywgcmFkaWFsU2VnbWVudHMsIHAsIHEgKSApO1xuXHR0aGlzLm1lcmdlVmVydGljZXMoKTtcblxufVxuXG5Ub3J1c0tub3RHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBHZW9tZXRyeS5wcm90b3R5cGUgKTtcblRvcnVzS25vdEdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFRvcnVzS25vdEdlb21ldHJ5O1xuXG4vLyBUb3J1c0tub3RCdWZmZXJHZW9tZXRyeVxuXG5mdW5jdGlvbiBUb3J1c0tub3RCdWZmZXJHZW9tZXRyeSggcmFkaXVzLCB0dWJlLCB0dWJ1bGFyU2VnbWVudHMsIHJhZGlhbFNlZ21lbnRzLCBwLCBxICkge1xuXG5cdEJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnVG9ydXNLbm90QnVmZmVyR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRyYWRpdXM6IHJhZGl1cyxcblx0XHR0dWJlOiB0dWJlLFxuXHRcdHR1YnVsYXJTZWdtZW50czogdHVidWxhclNlZ21lbnRzLFxuXHRcdHJhZGlhbFNlZ21lbnRzOiByYWRpYWxTZWdtZW50cyxcblx0XHRwOiBwLFxuXHRcdHE6IHFcblx0fTtcblxuXHRyYWRpdXMgPSByYWRpdXMgfHwgMTAwO1xuXHR0dWJlID0gdHViZSB8fCA0MDtcblx0dHVidWxhclNlZ21lbnRzID0gTWF0aC5mbG9vciggdHVidWxhclNlZ21lbnRzICkgfHwgNjQ7XG5cdHJhZGlhbFNlZ21lbnRzID0gTWF0aC5mbG9vciggcmFkaWFsU2VnbWVudHMgKSB8fCA4O1xuXHRwID0gcCB8fCAyO1xuXHRxID0gcSB8fCAzO1xuXG5cdC8vIGJ1ZmZlcnNcblxuXHR2YXIgaW5kaWNlcyA9IFtdO1xuXHR2YXIgdmVydGljZXMgPSBbXTtcblx0dmFyIG5vcm1hbHMgPSBbXTtcblx0dmFyIHV2cyA9IFtdO1xuXG5cdC8vIGhlbHBlciB2YXJpYWJsZXNcblxuXHR2YXIgaSwgajtcblxuXHR2YXIgdmVydGV4ID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIG5vcm1hbCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0dmFyIFAxID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIFAyID0gbmV3IFZlY3RvcjMoKTtcblxuXHR2YXIgQiA9IG5ldyBWZWN0b3IzKCk7XG5cdHZhciBUID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIE4gPSBuZXcgVmVjdG9yMygpO1xuXG5cdC8vIGdlbmVyYXRlIHZlcnRpY2VzLCBub3JtYWxzIGFuZCB1dnNcblxuXHRmb3IgKCBpID0gMDsgaSA8PSB0dWJ1bGFyU2VnbWVudHM7ICsrIGkgKSB7XG5cblx0XHQvLyB0aGUgcmFkaWFuIFwidVwiIGlzIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBwb3NpdGlvbiBvbiB0aGUgdG9ydXMgY3VydmUgb2YgdGhlIGN1cnJlbnQgdHVidWxhciBzZWdlbWVudFxuXG5cdFx0dmFyIHUgPSBpIC8gdHVidWxhclNlZ21lbnRzICogcCAqIE1hdGguUEkgKiAyO1xuXG5cdFx0Ly8gbm93IHdlIGNhbGN1bGF0ZSB0d28gcG9pbnRzLiBQMSBpcyBvdXIgY3VycmVudCBwb3NpdGlvbiBvbiB0aGUgY3VydmUsIFAyIGlzIGEgbGl0dGxlIGZhcnRoZXIgYWhlYWQuXG5cdFx0Ly8gdGhlc2UgcG9pbnRzIGFyZSB1c2VkIHRvIGNyZWF0ZSBhIHNwZWNpYWwgXCJjb29yZGluYXRlIHNwYWNlXCIsIHdoaWNoIGlzIG5lY2Vzc2FyeSB0byBjYWxjdWxhdGUgdGhlIGNvcnJlY3QgdmVydGV4IHBvc2l0aW9uc1xuXG5cdFx0Y2FsY3VsYXRlUG9zaXRpb25PbkN1cnZlKCB1LCBwLCBxLCByYWRpdXMsIFAxICk7XG5cdFx0Y2FsY3VsYXRlUG9zaXRpb25PbkN1cnZlKCB1ICsgMC4wMSwgcCwgcSwgcmFkaXVzLCBQMiApO1xuXG5cdFx0Ly8gY2FsY3VsYXRlIG9ydGhvbm9ybWFsIGJhc2lzXG5cblx0XHRULnN1YlZlY3RvcnMoIFAyLCBQMSApO1xuXHRcdE4uYWRkVmVjdG9ycyggUDIsIFAxICk7XG5cdFx0Qi5jcm9zc1ZlY3RvcnMoIFQsIE4gKTtcblx0XHROLmNyb3NzVmVjdG9ycyggQiwgVCApO1xuXG5cdFx0Ly8gbm9ybWFsaXplIEIsIE4uIFQgY2FuIGJlIGlnbm9yZWQsIHdlIGRvbid0IHVzZSBpdFxuXG5cdFx0Qi5ub3JtYWxpemUoKTtcblx0XHROLm5vcm1hbGl6ZSgpO1xuXG5cdFx0Zm9yICggaiA9IDA7IGogPD0gcmFkaWFsU2VnbWVudHM7ICsrIGogKSB7XG5cblx0XHRcdC8vIG5vdyBjYWxjdWxhdGUgdGhlIHZlcnRpY2VzLiB0aGV5IGFyZSBub3RoaW5nIG1vcmUgdGhhbiBhbiBleHRydXNpb24gb2YgdGhlIHRvcnVzIGN1cnZlLlxuXHRcdFx0Ly8gYmVjYXVzZSB3ZSBleHRydWRlIGEgc2hhcGUgaW4gdGhlIHh5LXBsYW5lLCB0aGVyZSBpcyBubyBuZWVkIHRvIGNhbGN1bGF0ZSBhIHotdmFsdWUuXG5cblx0XHRcdHZhciB2ID0gaiAvIHJhZGlhbFNlZ21lbnRzICogTWF0aC5QSSAqIDI7XG5cdFx0XHR2YXIgY3ggPSAtIHR1YmUgKiBNYXRoLmNvcyggdiApO1xuXHRcdFx0dmFyIGN5ID0gdHViZSAqIE1hdGguc2luKCB2ICk7XG5cblx0XHRcdC8vIG5vdyBjYWxjdWxhdGUgdGhlIGZpbmFsIHZlcnRleCBwb3NpdGlvbi5cblx0XHRcdC8vIGZpcnN0IHdlIG9yaWVudCB0aGUgZXh0cnVzaW9uIHdpdGggb3VyIGJhc2lzIHZlY3RvcywgdGhlbiB3ZSBhZGQgaXQgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24gb24gdGhlIGN1cnZlXG5cblx0XHRcdHZlcnRleC54ID0gUDEueCArICggY3ggKiBOLnggKyBjeSAqIEIueCApO1xuXHRcdFx0dmVydGV4LnkgPSBQMS55ICsgKCBjeCAqIE4ueSArIGN5ICogQi55ICk7XG5cdFx0XHR2ZXJ0ZXgueiA9IFAxLnogKyAoIGN4ICogTi56ICsgY3kgKiBCLnogKTtcblxuXHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0XHQvLyBub3JtYWwgKFAxIGlzIGFsd2F5cyB0aGUgY2VudGVyL29yaWdpbiBvZiB0aGUgZXh0cnVzaW9uLCB0aHVzIHdlIGNhbiB1c2UgaXQgdG8gY2FsY3VsYXRlIHRoZSBub3JtYWwpXG5cblx0XHRcdG5vcm1hbC5zdWJWZWN0b3JzKCB2ZXJ0ZXgsIFAxICkubm9ybWFsaXplKCk7XG5cblx0XHRcdG5vcm1hbHMucHVzaCggbm9ybWFsLngsIG5vcm1hbC55LCBub3JtYWwueiApO1xuXG5cdFx0XHQvLyB1dlxuXG5cdFx0XHR1dnMucHVzaCggaSAvIHR1YnVsYXJTZWdtZW50cyApO1xuXHRcdFx0dXZzLnB1c2goIGogLyByYWRpYWxTZWdtZW50cyApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHQvLyBnZW5lcmF0ZSBpbmRpY2VzXG5cblx0Zm9yICggaiA9IDE7IGogPD0gdHVidWxhclNlZ21lbnRzOyBqICsrICkge1xuXG5cdFx0Zm9yICggaSA9IDE7IGkgPD0gcmFkaWFsU2VnbWVudHM7IGkgKysgKSB7XG5cblx0XHRcdC8vIGluZGljZXNcblxuXHRcdFx0dmFyIGEgPSAoIHJhZGlhbFNlZ21lbnRzICsgMSApICogKCBqIC0gMSApICsgKCBpIC0gMSApO1xuXHRcdFx0dmFyIGIgPSAoIHJhZGlhbFNlZ21lbnRzICsgMSApICogaiArICggaSAtIDEgKTtcblx0XHRcdHZhciBjID0gKCByYWRpYWxTZWdtZW50cyArIDEgKSAqIGogKyBpO1xuXHRcdFx0dmFyIGQgPSAoIHJhZGlhbFNlZ21lbnRzICsgMSApICogKCBqIC0gMSApICsgaTtcblxuXHRcdFx0Ly8gZmFjZXNcblxuXHRcdFx0aW5kaWNlcy5wdXNoKCBhLCBiLCBkICk7XG5cdFx0XHRpbmRpY2VzLnB1c2goIGIsIGMsIGQgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gYnVpbGQgZ2VvbWV0cnlcblxuXHR0aGlzLnNldEluZGV4KCBpbmRpY2VzICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBub3JtYWxzLCAzICkgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICd1dicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB1dnMsIDIgKSApO1xuXG5cdC8vIHRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgY3VycmVudCBwb3NpdGlvbiBvbiB0aGUgdG9ydXMgY3VydmVcblxuXHRmdW5jdGlvbiBjYWxjdWxhdGVQb3NpdGlvbk9uQ3VydmUoIHUsIHAsIHEsIHJhZGl1cywgcG9zaXRpb24gKSB7XG5cblx0XHR2YXIgY3UgPSBNYXRoLmNvcyggdSApO1xuXHRcdHZhciBzdSA9IE1hdGguc2luKCB1ICk7XG5cdFx0dmFyIHF1T3ZlclAgPSBxIC8gcCAqIHU7XG5cdFx0dmFyIGNzID0gTWF0aC5jb3MoIHF1T3ZlclAgKTtcblxuXHRcdHBvc2l0aW9uLnggPSByYWRpdXMgKiAoIDIgKyBjcyApICogMC41ICogY3U7XG5cdFx0cG9zaXRpb24ueSA9IHJhZGl1cyAqICggMiArIGNzICkgKiBzdSAqIDAuNTtcblx0XHRwb3NpdGlvbi56ID0gcmFkaXVzICogTWF0aC5zaW4oIHF1T3ZlclAgKSAqIDAuNTtcblxuXHR9XG5cbn1cblxuVG9ydXNLbm90QnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7XG5Ub3J1c0tub3RCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBUb3J1c0tub3RCdWZmZXJHZW9tZXRyeTtcblxuLyoqXG4gKiBAYXV0aG9yIG9vc21veGllY29kZVxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKi9cblxuLy8gVG9ydXNHZW9tZXRyeVxuXG5mdW5jdGlvbiBUb3J1c0dlb21ldHJ5KCByYWRpdXMsIHR1YmUsIHJhZGlhbFNlZ21lbnRzLCB0dWJ1bGFyU2VnbWVudHMsIGFyYyApIHtcblxuXHRHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1RvcnVzR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRyYWRpdXM6IHJhZGl1cyxcblx0XHR0dWJlOiB0dWJlLFxuXHRcdHJhZGlhbFNlZ21lbnRzOiByYWRpYWxTZWdtZW50cyxcblx0XHR0dWJ1bGFyU2VnbWVudHM6IHR1YnVsYXJTZWdtZW50cyxcblx0XHRhcmM6IGFyY1xuXHR9O1xuXG5cdHRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgVG9ydXNCdWZmZXJHZW9tZXRyeSggcmFkaXVzLCB0dWJlLCByYWRpYWxTZWdtZW50cywgdHVidWxhclNlZ21lbnRzLCBhcmMgKSApO1xuXHR0aGlzLm1lcmdlVmVydGljZXMoKTtcblxufVxuXG5Ub3J1c0dlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEdlb21ldHJ5LnByb3RvdHlwZSApO1xuVG9ydXNHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBUb3J1c0dlb21ldHJ5O1xuXG4vLyBUb3J1c0J1ZmZlckdlb21ldHJ5XG5cbmZ1bmN0aW9uIFRvcnVzQnVmZmVyR2VvbWV0cnkoIHJhZGl1cywgdHViZSwgcmFkaWFsU2VnbWVudHMsIHR1YnVsYXJTZWdtZW50cywgYXJjICkge1xuXG5cdEJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnVG9ydXNCdWZmZXJHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdHR1YmU6IHR1YmUsXG5cdFx0cmFkaWFsU2VnbWVudHM6IHJhZGlhbFNlZ21lbnRzLFxuXHRcdHR1YnVsYXJTZWdtZW50czogdHVidWxhclNlZ21lbnRzLFxuXHRcdGFyYzogYXJjXG5cdH07XG5cblx0cmFkaXVzID0gcmFkaXVzIHx8IDEwMDtcblx0dHViZSA9IHR1YmUgfHwgNDA7XG5cdHJhZGlhbFNlZ21lbnRzID0gTWF0aC5mbG9vciggcmFkaWFsU2VnbWVudHMgKSB8fCA4O1xuXHR0dWJ1bGFyU2VnbWVudHMgPSBNYXRoLmZsb29yKCB0dWJ1bGFyU2VnbWVudHMgKSB8fCA2O1xuXHRhcmMgPSBhcmMgfHwgTWF0aC5QSSAqIDI7XG5cblx0Ly8gYnVmZmVyc1xuXG5cdHZhciBpbmRpY2VzID0gW107XG5cdHZhciB2ZXJ0aWNlcyA9IFtdO1xuXHR2YXIgbm9ybWFscyA9IFtdO1xuXHR2YXIgdXZzID0gW107XG5cblx0Ly8gaGVscGVyIHZhcmlhYmxlc1xuXG5cdHZhciBjZW50ZXIgPSBuZXcgVmVjdG9yMygpO1xuXHR2YXIgdmVydGV4ID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIG5vcm1hbCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0dmFyIGosIGk7XG5cblx0Ly8gZ2VuZXJhdGUgdmVydGljZXMsIG5vcm1hbHMgYW5kIHV2c1xuXG5cdGZvciAoIGogPSAwOyBqIDw9IHJhZGlhbFNlZ21lbnRzOyBqICsrICkge1xuXG5cdFx0Zm9yICggaSA9IDA7IGkgPD0gdHVidWxhclNlZ21lbnRzOyBpICsrICkge1xuXG5cdFx0XHR2YXIgdSA9IGkgLyB0dWJ1bGFyU2VnbWVudHMgKiBhcmM7XG5cdFx0XHR2YXIgdiA9IGogLyByYWRpYWxTZWdtZW50cyAqIE1hdGguUEkgKiAyO1xuXG5cdFx0XHQvLyB2ZXJ0ZXhcblxuXHRcdFx0dmVydGV4LnggPSAoIHJhZGl1cyArIHR1YmUgKiBNYXRoLmNvcyggdiApICkgKiBNYXRoLmNvcyggdSApO1xuXHRcdFx0dmVydGV4LnkgPSAoIHJhZGl1cyArIHR1YmUgKiBNYXRoLmNvcyggdiApICkgKiBNYXRoLnNpbiggdSApO1xuXHRcdFx0dmVydGV4LnogPSB0dWJlICogTWF0aC5zaW4oIHYgKTtcblxuXHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0XHQvLyBub3JtYWxcblxuXHRcdFx0Y2VudGVyLnggPSByYWRpdXMgKiBNYXRoLmNvcyggdSApO1xuXHRcdFx0Y2VudGVyLnkgPSByYWRpdXMgKiBNYXRoLnNpbiggdSApO1xuXHRcdFx0bm9ybWFsLnN1YlZlY3RvcnMoIHZlcnRleCwgY2VudGVyICkubm9ybWFsaXplKCk7XG5cblx0XHRcdG5vcm1hbHMucHVzaCggbm9ybWFsLngsIG5vcm1hbC55LCBub3JtYWwueiApO1xuXG5cdFx0XHQvLyB1dlxuXG5cdFx0XHR1dnMucHVzaCggaSAvIHR1YnVsYXJTZWdtZW50cyApO1xuXHRcdFx0dXZzLnB1c2goIGogLyByYWRpYWxTZWdtZW50cyApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHQvLyBnZW5lcmF0ZSBpbmRpY2VzXG5cblx0Zm9yICggaiA9IDE7IGogPD0gcmFkaWFsU2VnbWVudHM7IGogKysgKSB7XG5cblx0XHRmb3IgKCBpID0gMTsgaSA8PSB0dWJ1bGFyU2VnbWVudHM7IGkgKysgKSB7XG5cblx0XHRcdC8vIGluZGljZXNcblxuXHRcdFx0dmFyIGEgPSAoIHR1YnVsYXJTZWdtZW50cyArIDEgKSAqIGogKyBpIC0gMTtcblx0XHRcdHZhciBiID0gKCB0dWJ1bGFyU2VnbWVudHMgKyAxICkgKiAoIGogLSAxICkgKyBpIC0gMTtcblx0XHRcdHZhciBjID0gKCB0dWJ1bGFyU2VnbWVudHMgKyAxICkgKiAoIGogLSAxICkgKyBpO1xuXHRcdFx0dmFyIGQgPSAoIHR1YnVsYXJTZWdtZW50cyArIDEgKSAqIGogKyBpO1xuXG5cdFx0XHQvLyBmYWNlc1xuXG5cdFx0XHRpbmRpY2VzLnB1c2goIGEsIGIsIGQgKTtcblx0XHRcdGluZGljZXMucHVzaCggYiwgYywgZCApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHQvLyBidWlsZCBnZW9tZXRyeVxuXG5cdHRoaXMuc2V0SW5kZXgoIGluZGljZXMgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIG5vcm1hbHMsIDMgKSApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2cywgMiApICk7XG5cbn1cblxuVG9ydXNCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTtcblRvcnVzQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVG9ydXNCdWZmZXJHZW9tZXRyeTtcblxuLyoqXG4gKiBAYXV0aG9yIHp6ODUgLyBodHRwOi8vd3d3LmxhYjRnYW1lcy5uZXQveno4NS9ibG9nXG4gKi9cblxudmFyIFNoYXBlVXRpbHMgPSB7XG5cblx0Ly8gY2FsY3VsYXRlIGFyZWEgb2YgdGhlIGNvbnRvdXIgcG9seWdvblxuXG5cdGFyZWE6IGZ1bmN0aW9uICggY29udG91ciApIHtcblxuXHRcdHZhciBuID0gY29udG91ci5sZW5ndGg7XG5cdFx0dmFyIGEgPSAwLjA7XG5cblx0XHRmb3IgKCB2YXIgcCA9IG4gLSAxLCBxID0gMDsgcSA8IG47IHAgPSBxICsrICkge1xuXG5cdFx0XHRhICs9IGNvbnRvdXJbIHAgXS54ICogY29udG91clsgcSBdLnkgLSBjb250b3VyWyBxIF0ueCAqIGNvbnRvdXJbIHAgXS55O1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGEgKiAwLjU7XG5cblx0fSxcblxuXHR0cmlhbmd1bGF0ZTogKCBmdW5jdGlvbiAoKSB7XG5cblx0XHQvKipcblx0XHQgKiBUaGlzIGNvZGUgaXMgYSBxdWljayBwb3J0IG9mIGNvZGUgd3JpdHRlbiBpbiBDKysgd2hpY2ggd2FzIHN1Ym1pdHRlZCB0b1xuXHRcdCAqIGZsaXBjb2RlLmNvbSBieSBKb2huIFcuIFJhdGNsaWZmICAvLyBKdWx5IDIyLCAyMDAwXG5cdFx0ICogU2VlIG9yaWdpbmFsIGNvZGUgYW5kIG1vcmUgaW5mb3JtYXRpb24gaGVyZTpcblx0XHQgKiBodHRwOi8vd3d3LmZsaXBjb2RlLmNvbS9hcmNoaXZlcy9FZmZpY2llbnRfUG9seWdvbl9Ucmlhbmd1bGF0aW9uLnNodG1sXG5cdFx0ICpcblx0XHQgKiBwb3J0ZWQgdG8gYWN0aW9uc2NyaXB0IGJ5IFpldmFuIFJvc3NlclxuXHRcdCAqIHd3dy5hY3Rpb25zbmlwcGV0LmNvbVxuXHRcdCAqXG5cdFx0ICogcG9ydGVkIHRvIGphdmFzY3JpcHQgYnkgSm9zaHVhIEtvb1xuXHRcdCAqIGh0dHA6Ly93d3cubGFiNGdhbWVzLm5ldC96ejg1L2Jsb2dcblx0XHQgKlxuXHRcdCAqL1xuXG5cdFx0ZnVuY3Rpb24gc25pcCggY29udG91ciwgdSwgdiwgdywgbiwgdmVydHMgKSB7XG5cblx0XHRcdHZhciBwO1xuXHRcdFx0dmFyIGF4LCBheSwgYngsIGJ5O1xuXHRcdFx0dmFyIGN4LCBjeSwgcHgsIHB5O1xuXG5cdFx0XHRheCA9IGNvbnRvdXJbIHZlcnRzWyB1IF0gXS54O1xuXHRcdFx0YXkgPSBjb250b3VyWyB2ZXJ0c1sgdSBdIF0ueTtcblxuXHRcdFx0YnggPSBjb250b3VyWyB2ZXJ0c1sgdiBdIF0ueDtcblx0XHRcdGJ5ID0gY29udG91clsgdmVydHNbIHYgXSBdLnk7XG5cblx0XHRcdGN4ID0gY29udG91clsgdmVydHNbIHcgXSBdLng7XG5cdFx0XHRjeSA9IGNvbnRvdXJbIHZlcnRzWyB3IF0gXS55O1xuXG5cdFx0XHRpZiAoICggYnggLSBheCApICogKCBjeSAtIGF5ICkgLSAoIGJ5IC0gYXkgKSAqICggY3ggLSBheCApIDw9IDAgKSByZXR1cm4gZmFsc2U7XG5cblx0XHRcdHZhciBhWCwgYVksIGJYLCBiWSwgY1gsIGNZO1xuXHRcdFx0dmFyIGFweCwgYXB5LCBicHgsIGJweSwgY3B4LCBjcHk7XG5cdFx0XHR2YXIgY0NST1NTYXAsIGJDUk9TU2NwLCBhQ1JPU1NicDtcblxuXHRcdFx0YVggPSBjeCAtIGJ4OyAgYVkgPSBjeSAtIGJ5O1xuXHRcdFx0YlggPSBheCAtIGN4OyAgYlkgPSBheSAtIGN5O1xuXHRcdFx0Y1ggPSBieCAtIGF4OyAgY1kgPSBieSAtIGF5O1xuXG5cdFx0XHRmb3IgKCBwID0gMDsgcCA8IG47IHAgKysgKSB7XG5cblx0XHRcdFx0cHggPSBjb250b3VyWyB2ZXJ0c1sgcCBdIF0ueDtcblx0XHRcdFx0cHkgPSBjb250b3VyWyB2ZXJ0c1sgcCBdIF0ueTtcblxuXHRcdFx0XHRpZiAoICggKCBweCA9PT0gYXggKSAmJiAoIHB5ID09PSBheSApICkgfHxcblx0XHRcdFx0XHQgKCAoIHB4ID09PSBieCApICYmICggcHkgPT09IGJ5ICkgKSB8fFxuXHRcdFx0XHRcdCAoICggcHggPT09IGN4ICkgJiYgKCBweSA9PT0gY3kgKSApIClcdGNvbnRpbnVlO1xuXG5cdFx0XHRcdGFweCA9IHB4IC0gYXg7ICBhcHkgPSBweSAtIGF5O1xuXHRcdFx0XHRicHggPSBweCAtIGJ4OyAgYnB5ID0gcHkgLSBieTtcblx0XHRcdFx0Y3B4ID0gcHggLSBjeDsgIGNweSA9IHB5IC0gY3k7XG5cblx0XHRcdFx0Ly8gc2VlIGlmIHAgaXMgaW5zaWRlIHRyaWFuZ2xlIGFiY1xuXG5cdFx0XHRcdGFDUk9TU2JwID0gYVggKiBicHkgLSBhWSAqIGJweDtcblx0XHRcdFx0Y0NST1NTYXAgPSBjWCAqIGFweSAtIGNZICogYXB4O1xuXHRcdFx0XHRiQ1JPU1NjcCA9IGJYICogY3B5IC0gYlkgKiBjcHg7XG5cblx0XHRcdFx0aWYgKCAoIGFDUk9TU2JwID49IC0gTnVtYmVyLkVQU0lMT04gKSAmJiAoIGJDUk9TU2NwID49IC0gTnVtYmVyLkVQU0lMT04gKSAmJiAoIGNDUk9TU2FwID49IC0gTnVtYmVyLkVQU0lMT04gKSApIHJldHVybiBmYWxzZTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblxuXHRcdH1cblxuXHRcdC8vIHRha2VzIGluIGFuIGNvbnRvdXIgYXJyYXkgYW5kIHJldHVybnNcblxuXHRcdHJldHVybiBmdW5jdGlvbiB0cmlhbmd1bGF0ZSggY29udG91ciwgaW5kaWNlcyApIHtcblxuXHRcdFx0dmFyIG4gPSBjb250b3VyLmxlbmd0aDtcblxuXHRcdFx0aWYgKCBuIDwgMyApIHJldHVybiBudWxsO1xuXG5cdFx0XHR2YXIgcmVzdWx0ID0gW10sXG5cdFx0XHRcdHZlcnRzID0gW10sXG5cdFx0XHRcdHZlcnRJbmRpY2VzID0gW107XG5cblx0XHRcdC8qIHdlIHdhbnQgYSBjb3VudGVyLWNsb2Nrd2lzZSBwb2x5Z29uIGluIHZlcnRzICovXG5cblx0XHRcdHZhciB1LCB2LCB3O1xuXG5cdFx0XHRpZiAoIFNoYXBlVXRpbHMuYXJlYSggY29udG91ciApID4gMC4wICkge1xuXG5cdFx0XHRcdGZvciAoIHYgPSAwOyB2IDwgbjsgdiArKyApIHZlcnRzWyB2IF0gPSB2O1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGZvciAoIHYgPSAwOyB2IDwgbjsgdiArKyApIHZlcnRzWyB2IF0gPSAoIG4gLSAxICkgLSB2O1xuXG5cdFx0XHR9XG5cblx0XHRcdHZhciBudiA9IG47XG5cblx0XHRcdC8qICByZW1vdmUgbnYgLSAyIHZlcnRpY2VzLCBjcmVhdGluZyAxIHRyaWFuZ2xlIGV2ZXJ5IHRpbWUgKi9cblxuXHRcdFx0dmFyIGNvdW50ID0gMiAqIG52OyAgIC8qIGVycm9yIGRldGVjdGlvbiAqL1xuXG5cdFx0XHRmb3IgKCB2ID0gbnYgLSAxOyBudiA+IDI7ICkge1xuXG5cdFx0XHRcdC8qIGlmIHdlIGxvb3AsIGl0IGlzIHByb2JhYmx5IGEgbm9uLXNpbXBsZSBwb2x5Z29uICovXG5cblx0XHRcdFx0aWYgKCAoIGNvdW50IC0tICkgPD0gMCApIHtcblxuXHRcdFx0XHRcdC8vKiogVHJpYW5ndWxhdGU6IEVSUk9SIC0gcHJvYmFibGUgYmFkIHBvbHlnb24hXG5cblx0XHRcdFx0XHQvL3Rocm93ICggXCJXYXJuaW5nLCB1bmFibGUgdG8gdHJpYW5ndWxhdGUgcG9seWdvbiFcIiApO1xuXHRcdFx0XHRcdC8vcmV0dXJuIG51bGw7XG5cdFx0XHRcdFx0Ly8gU29tZXRpbWVzIHdhcm5pbmcgaXMgZmluZSwgZXNwZWNpYWxseSBwb2x5Z29ucyBhcmUgdHJpYW5ndWxhdGVkIGluIHJldmVyc2UuXG5cdFx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuU2hhcGVVdGlsczogVW5hYmxlIHRvIHRyaWFuZ3VsYXRlIHBvbHlnb24hIGluIHRyaWFuZ3VsYXRlKCknICk7XG5cblx0XHRcdFx0XHRpZiAoIGluZGljZXMgKSByZXR1cm4gdmVydEluZGljZXM7XG5cdFx0XHRcdFx0cmV0dXJuIHJlc3VsdDtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0LyogdGhyZWUgY29uc2VjdXRpdmUgdmVydGljZXMgaW4gY3VycmVudCBwb2x5Z29uLCA8dSx2LHc+ICovXG5cblx0XHRcdFx0dSA9IHY7IFx0IFx0aWYgKCBudiA8PSB1ICkgdSA9IDA7ICAgICAvKiBwcmV2aW91cyAqL1xuXHRcdFx0XHR2ID0gdSArIDE7ICBpZiAoIG52IDw9IHYgKSB2ID0gMDsgICAgIC8qIG5ldyB2ICAgICovXG5cdFx0XHRcdHcgPSB2ICsgMTsgIGlmICggbnYgPD0gdyApIHcgPSAwOyAgICAgLyogbmV4dCAgICAgKi9cblxuXHRcdFx0XHRpZiAoIHNuaXAoIGNvbnRvdXIsIHUsIHYsIHcsIG52LCB2ZXJ0cyApICkge1xuXG5cdFx0XHRcdFx0dmFyIGEsIGIsIGMsIHMsIHQ7XG5cblx0XHRcdFx0XHQvKiB0cnVlIG5hbWVzIG9mIHRoZSB2ZXJ0aWNlcyAqL1xuXG5cdFx0XHRcdFx0YSA9IHZlcnRzWyB1IF07XG5cdFx0XHRcdFx0YiA9IHZlcnRzWyB2IF07XG5cdFx0XHRcdFx0YyA9IHZlcnRzWyB3IF07XG5cblx0XHRcdFx0XHQvKiBvdXRwdXQgVHJpYW5nbGUgKi9cblxuXHRcdFx0XHRcdHJlc3VsdC5wdXNoKCBbIGNvbnRvdXJbIGEgXSxcblx0XHRcdFx0XHRcdGNvbnRvdXJbIGIgXSxcblx0XHRcdFx0XHRcdGNvbnRvdXJbIGMgXSBdICk7XG5cblxuXHRcdFx0XHRcdHZlcnRJbmRpY2VzLnB1c2goIFsgdmVydHNbIHUgXSwgdmVydHNbIHYgXSwgdmVydHNbIHcgXSBdICk7XG5cblx0XHRcdFx0XHQvKiByZW1vdmUgdiBmcm9tIHRoZSByZW1haW5pbmcgcG9seWdvbiAqL1xuXG5cdFx0XHRcdFx0Zm9yICggcyA9IHYsIHQgPSB2ICsgMTsgdCA8IG52OyBzICsrLCB0ICsrICkge1xuXG5cdFx0XHRcdFx0XHR2ZXJ0c1sgcyBdID0gdmVydHNbIHQgXTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdG52IC0tO1xuXG5cdFx0XHRcdFx0LyogcmVzZXQgZXJyb3IgZGV0ZWN0aW9uIGNvdW50ZXIgKi9cblxuXHRcdFx0XHRcdGNvdW50ID0gMiAqIG52O1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGluZGljZXMgKSByZXR1cm4gdmVydEluZGljZXM7XG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xuXG5cdFx0fVxuXG5cdH0gKSgpLFxuXG5cdHRyaWFuZ3VsYXRlU2hhcGU6IGZ1bmN0aW9uICggY29udG91ciwgaG9sZXMgKSB7XG5cblx0XHRmdW5jdGlvbiByZW1vdmVEdXBFbmRQdHMocG9pbnRzKSB7XG5cblx0XHRcdHZhciBsID0gcG9pbnRzLmxlbmd0aDtcblxuXHRcdFx0aWYgKCBsID4gMiAmJiBwb2ludHNbIGwgLSAxIF0uZXF1YWxzKCBwb2ludHNbIDAgXSApICkge1xuXG5cdFx0XHRcdHBvaW50cy5wb3AoKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmVtb3ZlRHVwRW5kUHRzKCBjb250b3VyICk7XG5cdFx0aG9sZXMuZm9yRWFjaCggcmVtb3ZlRHVwRW5kUHRzICk7XG5cblx0XHRmdW5jdGlvbiBwb2ludF9pbl9zZWdtZW50XzJEX2NvbGluKCBpblNlZ1B0MSwgaW5TZWdQdDIsIGluT3RoZXJQdCApIHtcblxuXHRcdFx0Ly8gaW5PdGhlclB0IG5lZWRzIHRvIGJlIGNvbGxpbmVhciB0byB0aGUgaW5TZWdtZW50XG5cdFx0XHRpZiAoIGluU2VnUHQxLnggIT09IGluU2VnUHQyLnggKSB7XG5cblx0XHRcdFx0aWYgKCBpblNlZ1B0MS54IDwgaW5TZWdQdDIueCApIHtcblxuXHRcdFx0XHRcdHJldHVyblx0KCAoIGluU2VnUHQxLnggPD0gaW5PdGhlclB0LnggKSAmJiAoIGluT3RoZXJQdC54IDw9IGluU2VnUHQyLnggKSApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRyZXR1cm5cdCggKCBpblNlZ1B0Mi54IDw9IGluT3RoZXJQdC54ICkgJiYgKCBpbk90aGVyUHQueCA8PSBpblNlZ1B0MS54ICkgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0aWYgKCBpblNlZ1B0MS55IDwgaW5TZWdQdDIueSApIHtcblxuXHRcdFx0XHRcdHJldHVyblx0KCAoIGluU2VnUHQxLnkgPD0gaW5PdGhlclB0LnkgKSAmJiAoIGluT3RoZXJQdC55IDw9IGluU2VnUHQyLnkgKSApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRyZXR1cm5cdCggKCBpblNlZ1B0Mi55IDw9IGluT3RoZXJQdC55ICkgJiYgKCBpbk90aGVyUHQueSA8PSBpblNlZ1B0MS55ICkgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIGludGVyc2VjdF9zZWdtZW50c18yRCggaW5TZWcxUHQxLCBpblNlZzFQdDIsIGluU2VnMlB0MSwgaW5TZWcyUHQyLCBpbkV4Y2x1ZGVBZGphY2VudFNlZ3MgKSB7XG5cblx0XHRcdHZhciBzZWcxZHggPSBpblNlZzFQdDIueCAtIGluU2VnMVB0MS54LCAgIHNlZzFkeSA9IGluU2VnMVB0Mi55IC0gaW5TZWcxUHQxLnk7XG5cdFx0XHR2YXIgc2VnMmR4ID0gaW5TZWcyUHQyLnggLSBpblNlZzJQdDEueCwgICBzZWcyZHkgPSBpblNlZzJQdDIueSAtIGluU2VnMlB0MS55O1xuXG5cdFx0XHR2YXIgc2VnMXNlZzJkeCA9IGluU2VnMVB0MS54IC0gaW5TZWcyUHQxLng7XG5cdFx0XHR2YXIgc2VnMXNlZzJkeSA9IGluU2VnMVB0MS55IC0gaW5TZWcyUHQxLnk7XG5cblx0XHRcdHZhciBsaW1pdFx0XHQ9IHNlZzFkeSAqIHNlZzJkeCAtIHNlZzFkeCAqIHNlZzJkeTtcblx0XHRcdHZhciBwZXJwU2VnMVx0PSBzZWcxZHkgKiBzZWcxc2VnMmR4IC0gc2VnMWR4ICogc2VnMXNlZzJkeTtcblxuXHRcdFx0aWYgKCBNYXRoLmFicyggbGltaXQgKSA+IE51bWJlci5FUFNJTE9OICkge1xuXG5cdFx0XHRcdC8vIG5vdCBwYXJhbGxlbFxuXG5cdFx0XHRcdHZhciBwZXJwU2VnMjtcblx0XHRcdFx0aWYgKCBsaW1pdCA+IDAgKSB7XG5cblx0XHRcdFx0XHRpZiAoICggcGVycFNlZzEgPCAwICkgfHwgKCBwZXJwU2VnMSA+IGxpbWl0ICkgKSBcdFx0cmV0dXJuIFtdO1xuXHRcdFx0XHRcdHBlcnBTZWcyID0gc2VnMmR5ICogc2VnMXNlZzJkeCAtIHNlZzJkeCAqIHNlZzFzZWcyZHk7XG5cdFx0XHRcdFx0aWYgKCAoIHBlcnBTZWcyIDwgMCApIHx8ICggcGVycFNlZzIgPiBsaW1pdCApICkgXHRcdHJldHVybiBbXTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0aWYgKCAoIHBlcnBTZWcxID4gMCApIHx8ICggcGVycFNlZzEgPCBsaW1pdCApICkgXHRcdHJldHVybiBbXTtcblx0XHRcdFx0XHRwZXJwU2VnMiA9IHNlZzJkeSAqIHNlZzFzZWcyZHggLSBzZWcyZHggKiBzZWcxc2VnMmR5O1xuXHRcdFx0XHRcdGlmICggKCBwZXJwU2VnMiA+IDAgKSB8fCAoIHBlcnBTZWcyIDwgbGltaXQgKSApIFx0XHRyZXR1cm4gW107XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIGkuZS4gdG8gcmVkdWNlIHJvdW5kaW5nIGVycm9yc1xuXHRcdFx0XHQvLyBpbnRlcnNlY3Rpb24gYXQgZW5kcG9pbnQgb2Ygc2VnbWVudCMxP1xuXHRcdFx0XHRpZiAoIHBlcnBTZWcyID09PSAwICkge1xuXG5cdFx0XHRcdFx0aWYgKCAoIGluRXhjbHVkZUFkamFjZW50U2VncyApICYmXG5cdFx0XHRcdFx0XHQgKCAoIHBlcnBTZWcxID09PSAwICkgfHwgKCBwZXJwU2VnMSA9PT0gbGltaXQgKSApIClcdFx0cmV0dXJuIFtdO1xuXHRcdFx0XHRcdHJldHVybiBbIGluU2VnMVB0MSBdO1xuXG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCBwZXJwU2VnMiA9PT0gbGltaXQgKSB7XG5cblx0XHRcdFx0XHRpZiAoICggaW5FeGNsdWRlQWRqYWNlbnRTZWdzICkgJiZcblx0XHRcdFx0XHRcdCAoICggcGVycFNlZzEgPT09IDAgKSB8fCAoIHBlcnBTZWcxID09PSBsaW1pdCApICkgKVx0XHRyZXR1cm4gW107XG5cdFx0XHRcdFx0cmV0dXJuIFsgaW5TZWcxUHQyIF07XG5cblx0XHRcdFx0fVxuXHRcdFx0XHQvLyBpbnRlcnNlY3Rpb24gYXQgZW5kcG9pbnQgb2Ygc2VnbWVudCMyP1xuXHRcdFx0XHRpZiAoIHBlcnBTZWcxID09PSAwIClcdFx0cmV0dXJuIFsgaW5TZWcyUHQxIF07XG5cdFx0XHRcdGlmICggcGVycFNlZzEgPT09IGxpbWl0IClcdHJldHVybiBbIGluU2VnMlB0MiBdO1xuXG5cdFx0XHRcdC8vIHJldHVybiByZWFsIGludGVyc2VjdGlvbiBwb2ludFxuXHRcdFx0XHR2YXIgZmFjdG9yU2VnMSA9IHBlcnBTZWcyIC8gbGltaXQ7XG5cdFx0XHRcdHJldHVyblx0WyB7IHg6IGluU2VnMVB0MS54ICsgZmFjdG9yU2VnMSAqIHNlZzFkeCxcblx0XHRcdFx0XHRcdFx0eTogaW5TZWcxUHQxLnkgKyBmYWN0b3JTZWcxICogc2VnMWR5IH0gXTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyBwYXJhbGxlbCBvciBjb2xsaW5lYXJcblx0XHRcdFx0aWYgKCAoIHBlcnBTZWcxICE9PSAwICkgfHxcblx0XHRcdFx0XHQgKCBzZWcyZHkgKiBzZWcxc2VnMmR4ICE9PSBzZWcyZHggKiBzZWcxc2VnMmR5ICkgKSBcdFx0XHRyZXR1cm4gW107XG5cblx0XHRcdFx0Ly8gdGhleSBhcmUgY29sbGluZWFyIG9yIGRlZ2VuZXJhdGVcblx0XHRcdFx0dmFyIHNlZzFQdCA9ICggKCBzZWcxZHggPT09IDAgKSAmJiAoIHNlZzFkeSA9PT0gMCApICk7XHQvLyBzZWdtZW50MSBpcyBqdXN0IGEgcG9pbnQ/XG5cdFx0XHRcdHZhciBzZWcyUHQgPSAoICggc2VnMmR4ID09PSAwICkgJiYgKCBzZWcyZHkgPT09IDAgKSApO1x0Ly8gc2VnbWVudDIgaXMganVzdCBhIHBvaW50P1xuXHRcdFx0XHQvLyBib3RoIHNlZ21lbnRzIGFyZSBwb2ludHNcblx0XHRcdFx0aWYgKCBzZWcxUHQgJiYgc2VnMlB0ICkge1xuXG5cdFx0XHRcdFx0aWYgKCAoIGluU2VnMVB0MS54ICE9PSBpblNlZzJQdDEueCApIHx8XG5cdFx0XHRcdFx0XHQgKCBpblNlZzFQdDEueSAhPT0gaW5TZWcyUHQxLnkgKSApXHRcdHJldHVybiBbXTtcdC8vIHRoZXkgYXJlIGRpc3RpbmN0ICBwb2ludHNcblx0XHRcdFx0XHRyZXR1cm4gWyBpblNlZzFQdDEgXTsgICAgICAgICAgICAgICAgIFx0XHRcdFx0XHRcdC8vIHRoZXkgYXJlIHRoZSBzYW1lIHBvaW50XG5cblx0XHRcdFx0fVxuXHRcdFx0XHQvLyBzZWdtZW50IzEgIGlzIGEgc2luZ2xlIHBvaW50XG5cdFx0XHRcdGlmICggc2VnMVB0ICkge1xuXG5cdFx0XHRcdFx0aWYgKCAhIHBvaW50X2luX3NlZ21lbnRfMkRfY29saW4oIGluU2VnMlB0MSwgaW5TZWcyUHQyLCBpblNlZzFQdDEgKSApXHRcdHJldHVybiBbXTtcdFx0Ly8gYnV0IG5vdCBpbiBzZWdtZW50IzJcblx0XHRcdFx0XHRyZXR1cm4gWyBpblNlZzFQdDEgXTtcblxuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIHNlZ21lbnQjMiAgaXMgYSBzaW5nbGUgcG9pbnRcblx0XHRcdFx0aWYgKCBzZWcyUHQgKSB7XG5cblx0XHRcdFx0XHRpZiAoICEgcG9pbnRfaW5fc2VnbWVudF8yRF9jb2xpbiggaW5TZWcxUHQxLCBpblNlZzFQdDIsIGluU2VnMlB0MSApIClcdFx0cmV0dXJuIFtdO1x0XHQvLyBidXQgbm90IGluIHNlZ21lbnQjMVxuXHRcdFx0XHRcdHJldHVybiBbIGluU2VnMlB0MSBdO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyB0aGV5IGFyZSBjb2xsaW5lYXIgc2VnbWVudHMsIHdoaWNoIG1pZ2h0IG92ZXJsYXBcblx0XHRcdFx0dmFyIHNlZzFtaW4sIHNlZzFtYXgsIHNlZzFtaW5WYWwsIHNlZzFtYXhWYWw7XG5cdFx0XHRcdHZhciBzZWcybWluLCBzZWcybWF4LCBzZWcybWluVmFsLCBzZWcybWF4VmFsO1xuXHRcdFx0XHRpZiAoIHNlZzFkeCAhPT0gMCApIHtcblxuXHRcdFx0XHRcdC8vIHRoZSBzZWdtZW50cyBhcmUgTk9UIG9uIGEgdmVydGljYWwgbGluZVxuXHRcdFx0XHRcdGlmICggaW5TZWcxUHQxLnggPCBpblNlZzFQdDIueCApIHtcblxuXHRcdFx0XHRcdFx0c2VnMW1pbiA9IGluU2VnMVB0MTsgc2VnMW1pblZhbCA9IGluU2VnMVB0MS54O1xuXHRcdFx0XHRcdFx0c2VnMW1heCA9IGluU2VnMVB0Mjsgc2VnMW1heFZhbCA9IGluU2VnMVB0Mi54O1xuXG5cdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0c2VnMW1pbiA9IGluU2VnMVB0Mjsgc2VnMW1pblZhbCA9IGluU2VnMVB0Mi54O1xuXHRcdFx0XHRcdFx0c2VnMW1heCA9IGluU2VnMVB0MTsgc2VnMW1heFZhbCA9IGluU2VnMVB0MS54O1xuXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmICggaW5TZWcyUHQxLnggPCBpblNlZzJQdDIueCApIHtcblxuXHRcdFx0XHRcdFx0c2VnMm1pbiA9IGluU2VnMlB0MTsgc2VnMm1pblZhbCA9IGluU2VnMlB0MS54O1xuXHRcdFx0XHRcdFx0c2VnMm1heCA9IGluU2VnMlB0Mjsgc2VnMm1heFZhbCA9IGluU2VnMlB0Mi54O1xuXG5cdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0c2VnMm1pbiA9IGluU2VnMlB0Mjsgc2VnMm1pblZhbCA9IGluU2VnMlB0Mi54O1xuXHRcdFx0XHRcdFx0c2VnMm1heCA9IGluU2VnMlB0MTsgc2VnMm1heFZhbCA9IGluU2VnMlB0MS54O1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHQvLyB0aGUgc2VnbWVudHMgYXJlIG9uIGEgdmVydGljYWwgbGluZVxuXHRcdFx0XHRcdGlmICggaW5TZWcxUHQxLnkgPCBpblNlZzFQdDIueSApIHtcblxuXHRcdFx0XHRcdFx0c2VnMW1pbiA9IGluU2VnMVB0MTsgc2VnMW1pblZhbCA9IGluU2VnMVB0MS55O1xuXHRcdFx0XHRcdFx0c2VnMW1heCA9IGluU2VnMVB0Mjsgc2VnMW1heFZhbCA9IGluU2VnMVB0Mi55O1xuXG5cdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0c2VnMW1pbiA9IGluU2VnMVB0Mjsgc2VnMW1pblZhbCA9IGluU2VnMVB0Mi55O1xuXHRcdFx0XHRcdFx0c2VnMW1heCA9IGluU2VnMVB0MTsgc2VnMW1heFZhbCA9IGluU2VnMVB0MS55O1xuXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmICggaW5TZWcyUHQxLnkgPCBpblNlZzJQdDIueSApIHtcblxuXHRcdFx0XHRcdFx0c2VnMm1pbiA9IGluU2VnMlB0MTsgc2VnMm1pblZhbCA9IGluU2VnMlB0MS55O1xuXHRcdFx0XHRcdFx0c2VnMm1heCA9IGluU2VnMlB0Mjsgc2VnMm1heFZhbCA9IGluU2VnMlB0Mi55O1xuXG5cdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0c2VnMm1pbiA9IGluU2VnMlB0Mjsgc2VnMm1pblZhbCA9IGluU2VnMlB0Mi55O1xuXHRcdFx0XHRcdFx0c2VnMm1heCA9IGluU2VnMlB0MTsgc2VnMm1heFZhbCA9IGluU2VnMlB0MS55O1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCBzZWcxbWluVmFsIDw9IHNlZzJtaW5WYWwgKSB7XG5cblx0XHRcdFx0XHRpZiAoIHNlZzFtYXhWYWwgPCAgc2VnMm1pblZhbCApXHRyZXR1cm4gW107XG5cdFx0XHRcdFx0aWYgKCBzZWcxbWF4VmFsID09PSBzZWcybWluVmFsIClcdHtcblxuXHRcdFx0XHRcdFx0aWYgKCBpbkV4Y2x1ZGVBZGphY2VudFNlZ3MgKVx0XHRyZXR1cm4gW107XG5cdFx0XHRcdFx0XHRyZXR1cm4gWyBzZWcybWluIF07XG5cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKCBzZWcxbWF4VmFsIDw9IHNlZzJtYXhWYWwgKVx0cmV0dXJuIFsgc2VnMm1pbiwgc2VnMW1heCBdO1xuXHRcdFx0XHRcdHJldHVyblx0WyBzZWcybWluLCBzZWcybWF4IF07XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGlmICggc2VnMW1pblZhbCA+ICBzZWcybWF4VmFsIClcdHJldHVybiBbXTtcblx0XHRcdFx0XHRpZiAoIHNlZzFtaW5WYWwgPT09IHNlZzJtYXhWYWwgKVx0e1xuXG5cdFx0XHRcdFx0XHRpZiAoIGluRXhjbHVkZUFkamFjZW50U2VncyApXHRcdHJldHVybiBbXTtcblx0XHRcdFx0XHRcdHJldHVybiBbIHNlZzFtaW4gXTtcblxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoIHNlZzFtYXhWYWwgPD0gc2VnMm1heFZhbCApXHRyZXR1cm4gWyBzZWcxbWluLCBzZWcxbWF4IF07XG5cdFx0XHRcdFx0cmV0dXJuXHRbIHNlZzFtaW4sIHNlZzJtYXggXTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIGlzUG9pbnRJbnNpZGVBbmdsZSggaW5WZXJ0ZXgsIGluTGVnRnJvbVB0LCBpbkxlZ1RvUHQsIGluT3RoZXJQdCApIHtcblxuXHRcdFx0Ly8gVGhlIG9yZGVyIG9mIGxlZ3MgaXMgaW1wb3J0YW50XG5cblx0XHRcdC8vIHRyYW5zbGF0aW9uIG9mIGFsbCBwb2ludHMsIHNvIHRoYXQgVmVydGV4IGlzIGF0ICgwLDApXG5cdFx0XHR2YXIgbGVnRnJvbVB0WFx0PSBpbkxlZ0Zyb21QdC54IC0gaW5WZXJ0ZXgueCwgIGxlZ0Zyb21QdFlcdD0gaW5MZWdGcm9tUHQueSAtIGluVmVydGV4Lnk7XG5cdFx0XHR2YXIgbGVnVG9QdFhcdD0gaW5MZWdUb1B0LnhcdC0gaW5WZXJ0ZXgueCwgIGxlZ1RvUHRZXHRcdD0gaW5MZWdUb1B0LnlcdC0gaW5WZXJ0ZXgueTtcblx0XHRcdHZhciBvdGhlclB0WFx0PSBpbk90aGVyUHQueFx0LSBpblZlcnRleC54LCAgb3RoZXJQdFlcdFx0PSBpbk90aGVyUHQueVx0LSBpblZlcnRleC55O1xuXG5cdFx0XHQvLyBtYWluIGFuZ2xlID4wOiA8IDE4MCBkZWcuOyAwOiAxODAgZGVnLjsgPDA6ID4gMTgwIGRlZy5cblx0XHRcdHZhciBmcm9tMnRvQW5nbGVcdD0gbGVnRnJvbVB0WCAqIGxlZ1RvUHRZIC0gbGVnRnJvbVB0WSAqIGxlZ1RvUHRYO1xuXHRcdFx0dmFyIGZyb20yb3RoZXJBbmdsZVx0PSBsZWdGcm9tUHRYICogb3RoZXJQdFkgLSBsZWdGcm9tUHRZICogb3RoZXJQdFg7XG5cblx0XHRcdGlmICggTWF0aC5hYnMoIGZyb20ydG9BbmdsZSApID4gTnVtYmVyLkVQU0lMT04gKSB7XG5cblx0XHRcdFx0Ly8gYW5nbGUgIT0gMTgwIGRlZy5cblxuXHRcdFx0XHR2YXIgb3RoZXIydG9BbmdsZVx0XHQ9IG90aGVyUHRYICogbGVnVG9QdFkgLSBvdGhlclB0WSAqIGxlZ1RvUHRYO1xuXHRcdFx0XHQvLyBjb25zb2xlLmxvZyggXCJmcm9tMnRvOiBcIiArIGZyb20ydG9BbmdsZSArIFwiLCBmcm9tMm90aGVyOiBcIiArIGZyb20yb3RoZXJBbmdsZSArIFwiLCBvdGhlcjJ0bzogXCIgKyBvdGhlcjJ0b0FuZ2xlICk7XG5cblx0XHRcdFx0aWYgKCBmcm9tMnRvQW5nbGUgPiAwICkge1xuXG5cdFx0XHRcdFx0Ly8gbWFpbiBhbmdsZSA8IDE4MCBkZWcuXG5cdFx0XHRcdFx0cmV0dXJuXHQoICggZnJvbTJvdGhlckFuZ2xlID49IDAgKSAmJiAoIG90aGVyMnRvQW5nbGUgPj0gMCApICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdC8vIG1haW4gYW5nbGUgPiAxODAgZGVnLlxuXHRcdFx0XHRcdHJldHVyblx0KCAoIGZyb20yb3RoZXJBbmdsZSA+PSAwICkgfHwgKCBvdGhlcjJ0b0FuZ2xlID49IDAgKSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyBhbmdsZSA9PSAxODAgZGVnLlxuXHRcdFx0XHQvLyBjb25zb2xlLmxvZyggXCJmcm9tMnRvOiAxODAgZGVnLiwgZnJvbTJvdGhlcjogXCIgKyBmcm9tMm90aGVyQW5nbGUgICk7XG5cdFx0XHRcdHJldHVyblx0KCBmcm9tMm90aGVyQW5nbGUgPiAwICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXG5cdFx0ZnVuY3Rpb24gcmVtb3ZlSG9sZXMoIGNvbnRvdXIsIGhvbGVzICkge1xuXG5cdFx0XHR2YXIgc2hhcGUgPSBjb250b3VyLmNvbmNhdCgpOyAvLyB3b3JrIG9uIHRoaXMgc2hhcGVcblx0XHRcdHZhciBob2xlO1xuXG5cdFx0XHRmdW5jdGlvbiBpc0N1dExpbmVJbnNpZGVBbmdsZXMoIGluU2hhcGVJZHgsIGluSG9sZUlkeCApIHtcblxuXHRcdFx0XHQvLyBDaGVjayBpZiBob2xlIHBvaW50IGxpZXMgd2l0aGluIGFuZ2xlIGFyb3VuZCBzaGFwZSBwb2ludFxuXHRcdFx0XHR2YXIgbGFzdFNoYXBlSWR4ID0gc2hhcGUubGVuZ3RoIC0gMTtcblxuXHRcdFx0XHR2YXIgcHJldlNoYXBlSWR4ID0gaW5TaGFwZUlkeCAtIDE7XG5cdFx0XHRcdGlmICggcHJldlNoYXBlSWR4IDwgMCApXHRcdFx0cHJldlNoYXBlSWR4ID0gbGFzdFNoYXBlSWR4O1xuXG5cdFx0XHRcdHZhciBuZXh0U2hhcGVJZHggPSBpblNoYXBlSWR4ICsgMTtcblx0XHRcdFx0aWYgKCBuZXh0U2hhcGVJZHggPiBsYXN0U2hhcGVJZHggKVx0bmV4dFNoYXBlSWR4ID0gMDtcblxuXHRcdFx0XHR2YXIgaW5zaWRlQW5nbGUgPSBpc1BvaW50SW5zaWRlQW5nbGUoIHNoYXBlWyBpblNoYXBlSWR4IF0sIHNoYXBlWyBwcmV2U2hhcGVJZHggXSwgc2hhcGVbIG5leHRTaGFwZUlkeCBdLCBob2xlWyBpbkhvbGVJZHggXSApO1xuXHRcdFx0XHRpZiAoICEgaW5zaWRlQW5nbGUgKSB7XG5cblx0XHRcdFx0XHQvLyBjb25zb2xlLmxvZyggXCJWZXJ0ZXggKFNoYXBlKTogXCIgKyBpblNoYXBlSWR4ICsgXCIsIFBvaW50OiBcIiArIGhvbGVbaW5Ib2xlSWR4XS54ICsgXCIvXCIgKyBob2xlW2luSG9sZUlkeF0ueSApO1xuXHRcdFx0XHRcdHJldHVyblx0ZmFsc2U7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIENoZWNrIGlmIHNoYXBlIHBvaW50IGxpZXMgd2l0aGluIGFuZ2xlIGFyb3VuZCBob2xlIHBvaW50XG5cdFx0XHRcdHZhciBsYXN0SG9sZUlkeCA9IGhvbGUubGVuZ3RoIC0gMTtcblxuXHRcdFx0XHR2YXIgcHJldkhvbGVJZHggPSBpbkhvbGVJZHggLSAxO1xuXHRcdFx0XHRpZiAoIHByZXZIb2xlSWR4IDwgMCApXHRcdFx0cHJldkhvbGVJZHggPSBsYXN0SG9sZUlkeDtcblxuXHRcdFx0XHR2YXIgbmV4dEhvbGVJZHggPSBpbkhvbGVJZHggKyAxO1xuXHRcdFx0XHRpZiAoIG5leHRIb2xlSWR4ID4gbGFzdEhvbGVJZHggKVx0bmV4dEhvbGVJZHggPSAwO1xuXG5cdFx0XHRcdGluc2lkZUFuZ2xlID0gaXNQb2ludEluc2lkZUFuZ2xlKCBob2xlWyBpbkhvbGVJZHggXSwgaG9sZVsgcHJldkhvbGVJZHggXSwgaG9sZVsgbmV4dEhvbGVJZHggXSwgc2hhcGVbIGluU2hhcGVJZHggXSApO1xuXHRcdFx0XHRpZiAoICEgaW5zaWRlQW5nbGUgKSB7XG5cblx0XHRcdFx0XHQvLyBjb25zb2xlLmxvZyggXCJWZXJ0ZXggKEhvbGUpOiBcIiArIGluSG9sZUlkeCArIFwiLCBQb2ludDogXCIgKyBzaGFwZVtpblNoYXBlSWR4XS54ICsgXCIvXCIgKyBzaGFwZVtpblNoYXBlSWR4XS55ICk7XG5cdFx0XHRcdFx0cmV0dXJuXHRmYWxzZTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuXHR0cnVlO1xuXG5cdFx0XHR9XG5cblx0XHRcdGZ1bmN0aW9uIGludGVyc2VjdHNTaGFwZUVkZ2UoIGluU2hhcGVQdCwgaW5Ib2xlUHQgKSB7XG5cblx0XHRcdFx0Ly8gY2hlY2tzIGZvciBpbnRlcnNlY3Rpb25zIHdpdGggc2hhcGUgZWRnZXNcblx0XHRcdFx0dmFyIHNJZHgsIG5leHRJZHgsIGludGVyc2VjdGlvbjtcblx0XHRcdFx0Zm9yICggc0lkeCA9IDA7IHNJZHggPCBzaGFwZS5sZW5ndGg7IHNJZHggKysgKSB7XG5cblx0XHRcdFx0XHRuZXh0SWR4ID0gc0lkeCArIDE7IG5leHRJZHggJT0gc2hhcGUubGVuZ3RoO1xuXHRcdFx0XHRcdGludGVyc2VjdGlvbiA9IGludGVyc2VjdF9zZWdtZW50c18yRCggaW5TaGFwZVB0LCBpbkhvbGVQdCwgc2hhcGVbIHNJZHggXSwgc2hhcGVbIG5leHRJZHggXSwgdHJ1ZSApO1xuXHRcdFx0XHRcdGlmICggaW50ZXJzZWN0aW9uLmxlbmd0aCA+IDAgKVx0XHRyZXR1cm5cdHRydWU7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVyblx0ZmFsc2U7XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIGluZGVwSG9sZXMgPSBbXTtcblxuXHRcdFx0ZnVuY3Rpb24gaW50ZXJzZWN0c0hvbGVFZGdlKCBpblNoYXBlUHQsIGluSG9sZVB0ICkge1xuXG5cdFx0XHRcdC8vIGNoZWNrcyBmb3IgaW50ZXJzZWN0aW9ucyB3aXRoIGhvbGUgZWRnZXNcblx0XHRcdFx0dmFyIGloSWR4LCBjaGtIb2xlLFxuXHRcdFx0XHRcdGhJZHgsIG5leHRJZHgsIGludGVyc2VjdGlvbjtcblx0XHRcdFx0Zm9yICggaWhJZHggPSAwOyBpaElkeCA8IGluZGVwSG9sZXMubGVuZ3RoOyBpaElkeCArKyApIHtcblxuXHRcdFx0XHRcdGNoa0hvbGUgPSBob2xlc1sgaW5kZXBIb2xlc1sgaWhJZHggXV07XG5cdFx0XHRcdFx0Zm9yICggaElkeCA9IDA7IGhJZHggPCBjaGtIb2xlLmxlbmd0aDsgaElkeCArKyApIHtcblxuXHRcdFx0XHRcdFx0bmV4dElkeCA9IGhJZHggKyAxOyBuZXh0SWR4ICU9IGNoa0hvbGUubGVuZ3RoO1xuXHRcdFx0XHRcdFx0aW50ZXJzZWN0aW9uID0gaW50ZXJzZWN0X3NlZ21lbnRzXzJEKCBpblNoYXBlUHQsIGluSG9sZVB0LCBjaGtIb2xlWyBoSWR4IF0sIGNoa0hvbGVbIG5leHRJZHggXSwgdHJ1ZSApO1xuXHRcdFx0XHRcdFx0aWYgKCBpbnRlcnNlY3Rpb24ubGVuZ3RoID4gMCApXHRcdHJldHVyblx0dHJ1ZTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVyblx0ZmFsc2U7XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIGhvbGVJbmRleCwgc2hhcGVJbmRleCxcblx0XHRcdFx0c2hhcGVQdCwgaG9sZVB0LFxuXHRcdFx0XHRob2xlSWR4LCBjdXRLZXksIGZhaWxlZEN1dHMgPSBbXSxcblx0XHRcdFx0dG1wU2hhcGUxLCB0bXBTaGFwZTIsXG5cdFx0XHRcdHRtcEhvbGUxLCB0bXBIb2xlMjtcblxuXHRcdFx0Zm9yICggdmFyIGggPSAwLCBobCA9IGhvbGVzLmxlbmd0aDsgaCA8IGhsOyBoICsrICkge1xuXG5cdFx0XHRcdGluZGVwSG9sZXMucHVzaCggaCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHZhciBtaW5TaGFwZUluZGV4ID0gMDtcblx0XHRcdHZhciBjb3VudGVyID0gaW5kZXBIb2xlcy5sZW5ndGggKiAyO1xuXHRcdFx0d2hpbGUgKCBpbmRlcEhvbGVzLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdFx0Y291bnRlciAtLTtcblx0XHRcdFx0aWYgKCBjb3VudGVyIDwgMCApIHtcblxuXHRcdFx0XHRcdGNvbnNvbGUubG9nKCBcIkluZmluaXRlIExvb3AhIEhvbGVzIGxlZnQ6XCIgKyBpbmRlcEhvbGVzLmxlbmd0aCArIFwiLCBQcm9iYWJseSBIb2xlIG91dHNpZGUgU2hhcGUhXCIgKTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gc2VhcmNoIGZvciBzaGFwZS12ZXJ0ZXggYW5kIGhvbGUtdmVydGV4LFxuXHRcdFx0XHQvLyB3aGljaCBjYW4gYmUgY29ubmVjdGVkIHdpdGhvdXQgaW50ZXJzZWN0aW9uc1xuXHRcdFx0XHRmb3IgKCBzaGFwZUluZGV4ID0gbWluU2hhcGVJbmRleDsgc2hhcGVJbmRleCA8IHNoYXBlLmxlbmd0aDsgc2hhcGVJbmRleCArKyApIHtcblxuXHRcdFx0XHRcdHNoYXBlUHQgPSBzaGFwZVsgc2hhcGVJbmRleCBdO1xuXHRcdFx0XHRcdGhvbGVJbmRleFx0PSAtIDE7XG5cblx0XHRcdFx0XHQvLyBzZWFyY2ggZm9yIGhvbGUgd2hpY2ggY2FuIGJlIHJlYWNoZWQgd2l0aG91dCBpbnRlcnNlY3Rpb25zXG5cdFx0XHRcdFx0Zm9yICggdmFyIGggPSAwOyBoIDwgaW5kZXBIb2xlcy5sZW5ndGg7IGggKysgKSB7XG5cblx0XHRcdFx0XHRcdGhvbGVJZHggPSBpbmRlcEhvbGVzWyBoIF07XG5cblx0XHRcdFx0XHRcdC8vIHByZXZlbnQgbXVsdGlwbGUgY2hlY2tzXG5cdFx0XHRcdFx0XHRjdXRLZXkgPSBzaGFwZVB0LnggKyBcIjpcIiArIHNoYXBlUHQueSArIFwiOlwiICsgaG9sZUlkeDtcblx0XHRcdFx0XHRcdGlmICggZmFpbGVkQ3V0c1sgY3V0S2V5IF0gIT09IHVuZGVmaW5lZCApXHRcdFx0Y29udGludWU7XG5cblx0XHRcdFx0XHRcdGhvbGUgPSBob2xlc1sgaG9sZUlkeCBdO1xuXHRcdFx0XHRcdFx0Zm9yICggdmFyIGgyID0gMDsgaDIgPCBob2xlLmxlbmd0aDsgaDIgKysgKSB7XG5cblx0XHRcdFx0XHRcdFx0aG9sZVB0ID0gaG9sZVsgaDIgXTtcblx0XHRcdFx0XHRcdFx0aWYgKCAhIGlzQ3V0TGluZUluc2lkZUFuZ2xlcyggc2hhcGVJbmRleCwgaDIgKSApXHRcdGNvbnRpbnVlO1xuXHRcdFx0XHRcdFx0XHRpZiAoIGludGVyc2VjdHNTaGFwZUVkZ2UoIHNoYXBlUHQsIGhvbGVQdCApIClcdFx0Y29udGludWU7XG5cdFx0XHRcdFx0XHRcdGlmICggaW50ZXJzZWN0c0hvbGVFZGdlKCBzaGFwZVB0LCBob2xlUHQgKSApXHRcdGNvbnRpbnVlO1xuXG5cdFx0XHRcdFx0XHRcdGhvbGVJbmRleCA9IGgyO1xuXHRcdFx0XHRcdFx0XHRpbmRlcEhvbGVzLnNwbGljZSggaCwgMSApO1xuXG5cdFx0XHRcdFx0XHRcdHRtcFNoYXBlMSA9IHNoYXBlLnNsaWNlKCAwLCBzaGFwZUluZGV4ICsgMSApO1xuXHRcdFx0XHRcdFx0XHR0bXBTaGFwZTIgPSBzaGFwZS5zbGljZSggc2hhcGVJbmRleCApO1xuXHRcdFx0XHRcdFx0XHR0bXBIb2xlMSA9IGhvbGUuc2xpY2UoIGhvbGVJbmRleCApO1xuXHRcdFx0XHRcdFx0XHR0bXBIb2xlMiA9IGhvbGUuc2xpY2UoIDAsIGhvbGVJbmRleCArIDEgKTtcblxuXHRcdFx0XHRcdFx0XHRzaGFwZSA9IHRtcFNoYXBlMS5jb25jYXQoIHRtcEhvbGUxICkuY29uY2F0KCB0bXBIb2xlMiApLmNvbmNhdCggdG1wU2hhcGUyICk7XG5cblx0XHRcdFx0XHRcdFx0bWluU2hhcGVJbmRleCA9IHNoYXBlSW5kZXg7XG5cblx0XHRcdFx0XHRcdFx0Ly8gRGVidWcgb25seSwgdG8gc2hvdyB0aGUgc2VsZWN0ZWQgY3V0c1xuXHRcdFx0XHRcdFx0XHQvLyBnbG9iX0N1dExpbmVzLnB1c2goIFsgc2hhcGVQdCwgaG9sZVB0IF0gKTtcblxuXHRcdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aWYgKCBob2xlSW5kZXggPj0gMCApXHRicmVhaztcdFx0Ly8gaG9sZS12ZXJ0ZXggZm91bmRcblxuXHRcdFx0XHRcdFx0ZmFpbGVkQ3V0c1sgY3V0S2V5IF0gPSB0cnVlO1x0XHRcdC8vIHJlbWVtYmVyIGZhaWx1cmVcblxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoIGhvbGVJbmRleCA+PSAwIClcdGJyZWFrO1x0XHQvLyBob2xlLXZlcnRleCBmb3VuZFxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gc2hhcGU7IFx0XHRcdC8qIHNoYXBlIHdpdGggbm8gaG9sZXMgKi9cblxuXHRcdH1cblxuXG5cdFx0dmFyIGksIGlsLCBmLCBmYWNlLFxuXHRcdFx0a2V5LCBpbmRleCxcblx0XHRcdGFsbFBvaW50c01hcCA9IHt9O1xuXG5cdFx0Ly8gVG8gbWFpbnRhaW4gcmVmZXJlbmNlIHRvIG9sZCBzaGFwZSwgb25lIG11c3QgbWF0Y2ggY29vcmRpbmF0ZXMsIG9yIG9mZnNldCB0aGUgaW5kaWNlcyBmcm9tIG9yaWdpbmFsIGFycmF5cy4gSXQncyBwcm9iYWJseSBlYXNpZXIgdG8gZG8gdGhlIGZpcnN0LlxuXG5cdFx0dmFyIGFsbHBvaW50cyA9IGNvbnRvdXIuY29uY2F0KCk7XG5cblx0XHRmb3IgKCB2YXIgaCA9IDAsIGhsID0gaG9sZXMubGVuZ3RoOyBoIDwgaGw7IGggKysgKSB7XG5cblx0XHRcdEFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KCBhbGxwb2ludHMsIGhvbGVzWyBoIF0gKTtcblxuXHRcdH1cblxuXHRcdC8vY29uc29sZS5sb2coIFwiYWxscG9pbnRzXCIsYWxscG9pbnRzLCBhbGxwb2ludHMubGVuZ3RoICk7XG5cblx0XHQvLyBwcmVwYXJlIGFsbCBwb2ludHMgbWFwXG5cblx0XHRmb3IgKCBpID0gMCwgaWwgPSBhbGxwb2ludHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdGtleSA9IGFsbHBvaW50c1sgaSBdLnggKyBcIjpcIiArIGFsbHBvaW50c1sgaSBdLnk7XG5cblx0XHRcdGlmICggYWxsUG9pbnRzTWFwWyBrZXkgXSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggXCJUSFJFRS5TaGFwZVV0aWxzOiBEdXBsaWNhdGUgcG9pbnRcIiwga2V5LCBpICk7XG5cblx0XHRcdH1cblxuXHRcdFx0YWxsUG9pbnRzTWFwWyBrZXkgXSA9IGk7XG5cblx0XHR9XG5cblx0XHQvLyByZW1vdmUgaG9sZXMgYnkgY3V0dGluZyBwYXRocyB0byBob2xlcyBhbmQgYWRkaW5nIHRoZW0gdG8gdGhlIHNoYXBlXG5cdFx0dmFyIHNoYXBlV2l0aG91dEhvbGVzID0gcmVtb3ZlSG9sZXMoIGNvbnRvdXIsIGhvbGVzICk7XG5cblx0XHR2YXIgdHJpYW5nbGVzID0gU2hhcGVVdGlscy50cmlhbmd1bGF0ZSggc2hhcGVXaXRob3V0SG9sZXMsIGZhbHNlICk7IC8vIFRydWUgcmV0dXJucyBpbmRpY2VzIGZvciBwb2ludHMgb2Ygc3Bvb2xlZCBzaGFwZVxuXHRcdC8vY29uc29sZS5sb2coIFwidHJpYW5nbGVzXCIsdHJpYW5nbGVzLCB0cmlhbmdsZXMubGVuZ3RoICk7XG5cblx0XHQvLyBjaGVjayBhbGwgZmFjZSB2ZXJ0aWNlcyBhZ2FpbnN0IGFsbCBwb2ludHMgbWFwXG5cblx0XHRmb3IgKCBpID0gMCwgaWwgPSB0cmlhbmdsZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdGZhY2UgPSB0cmlhbmdsZXNbIGkgXTtcblxuXHRcdFx0Zm9yICggZiA9IDA7IGYgPCAzOyBmICsrICkge1xuXG5cdFx0XHRcdGtleSA9IGZhY2VbIGYgXS54ICsgXCI6XCIgKyBmYWNlWyBmIF0ueTtcblxuXHRcdFx0XHRpbmRleCA9IGFsbFBvaW50c01hcFsga2V5IF07XG5cblx0XHRcdFx0aWYgKCBpbmRleCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0ZmFjZVsgZiBdID0gaW5kZXg7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdHJpYW5nbGVzLmNvbmNhdCgpO1xuXG5cdH0sXG5cblx0aXNDbG9ja1dpc2U6IGZ1bmN0aW9uICggcHRzICkge1xuXG5cdFx0cmV0dXJuIFNoYXBlVXRpbHMuYXJlYSggcHRzICkgPCAwO1xuXG5cdH1cblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIHp6ODUgLyBodHRwOi8vd3d3LmxhYjRnYW1lcy5uZXQveno4NS9ibG9nXG4gKlxuICogQ3JlYXRlcyBleHRydWRlZCBnZW9tZXRyeSBmcm9tIGEgcGF0aCBzaGFwZS5cbiAqXG4gKiBwYXJhbWV0ZXJzID0ge1xuICpcbiAqICBjdXJ2ZVNlZ21lbnRzOiA8aW50PiwgLy8gbnVtYmVyIG9mIHBvaW50cyBvbiB0aGUgY3VydmVzXG4gKiAgc3RlcHM6IDxpbnQ+LCAvLyBudW1iZXIgb2YgcG9pbnRzIGZvciB6LXNpZGUgZXh0cnVzaW9ucyAvIHVzZWQgZm9yIHN1YmRpdmlkaW5nIHNlZ21lbnRzIG9mIGV4dHJ1ZGUgc3BsaW5lIHRvb1xuICogIGFtb3VudDogPGludD4sIC8vIERlcHRoIHRvIGV4dHJ1ZGUgdGhlIHNoYXBlXG4gKlxuICogIGJldmVsRW5hYmxlZDogPGJvb2w+LCAvLyB0dXJuIG9uIGJldmVsXG4gKiAgYmV2ZWxUaGlja25lc3M6IDxmbG9hdD4sIC8vIGhvdyBkZWVwIGludG8gdGhlIG9yaWdpbmFsIHNoYXBlIGJldmVsIGdvZXNcbiAqICBiZXZlbFNpemU6IDxmbG9hdD4sIC8vIGhvdyBmYXIgZnJvbSBzaGFwZSBvdXRsaW5lIGlzIGJldmVsXG4gKiAgYmV2ZWxTZWdtZW50czogPGludD4sIC8vIG51bWJlciBvZiBiZXZlbCBsYXllcnNcbiAqXG4gKiAgZXh0cnVkZVBhdGg6IDxUSFJFRS5DdXJ2ZT4gLy8gY3VydmUgdG8gZXh0cnVkZSBzaGFwZSBhbG9uZ1xuICogIGZyYW1lczogPE9iamVjdD4gLy8gY29udGFpbmluZyBhcnJheXMgb2YgdGFuZ2VudHMsIG5vcm1hbHMsIGJpbm9ybWFsc1xuICpcbiAqICBVVkdlbmVyYXRvcjogPE9iamVjdD4gLy8gb2JqZWN0IHRoYXQgcHJvdmlkZXMgVVYgZ2VuZXJhdG9yIGZ1bmN0aW9uc1xuICpcbiAqIH1cbiAqL1xuXG4vLyBFeHRydWRlR2VvbWV0cnlcblxuZnVuY3Rpb24gRXh0cnVkZUdlb21ldHJ5KCBzaGFwZXMsIG9wdGlvbnMgKSB7XG5cblx0R2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdFeHRydWRlR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRzaGFwZXM6IHNoYXBlcyxcblx0XHRvcHRpb25zOiBvcHRpb25zXG5cdH07XG5cblx0dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIG5ldyBFeHRydWRlQnVmZmVyR2VvbWV0cnkoIHNoYXBlcywgb3B0aW9ucyApICk7XG5cdHRoaXMubWVyZ2VWZXJ0aWNlcygpO1xuXG59XG5cbkV4dHJ1ZGVHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBHZW9tZXRyeS5wcm90b3R5cGUgKTtcbkV4dHJ1ZGVHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBFeHRydWRlR2VvbWV0cnk7XG5cbi8vIEV4dHJ1ZGVCdWZmZXJHZW9tZXRyeVxuXG5mdW5jdGlvbiBFeHRydWRlQnVmZmVyR2VvbWV0cnkoIHNoYXBlcywgb3B0aW9ucyApIHtcblxuXHRpZiAoIHR5cGVvZiAoIHNoYXBlcyApID09PSBcInVuZGVmaW5lZFwiICkge1xuXG5cdFx0c2hhcGVzID0gW107XG5cdFx0cmV0dXJuO1xuXG5cdH1cblxuXHRCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0V4dHJ1ZGVCdWZmZXJHZW9tZXRyeSc7XG5cblx0c2hhcGVzID0gQXJyYXkuaXNBcnJheSggc2hhcGVzICkgPyBzaGFwZXMgOiBbIHNoYXBlcyBdO1xuXG5cdHRoaXMuYWRkU2hhcGVMaXN0KCBzaGFwZXMsIG9wdGlvbnMgKTtcblxuXHR0aGlzLmNvbXB1dGVWZXJ0ZXhOb3JtYWxzKCk7XG5cblx0Ly8gY2FuJ3QgcmVhbGx5IHVzZSBhdXRvbWF0aWMgdmVydGV4IG5vcm1hbHNcblx0Ly8gYXMgdGhlbiBmcm9udCBhbmQgYmFjayBzaWRlcyBnZXQgc21vb3RoZWQgdG9vXG5cdC8vIHNob3VsZCBkbyBzZXBhcmF0ZSBzbW9vdGhpbmcganVzdCBmb3Igc2lkZXNcblxuXHQvL3RoaXMuY29tcHV0ZVZlcnRleE5vcm1hbHMoKTtcblxuXHQvL2NvbnNvbGUubG9nKCBcInRvb2tcIiwgKCBEYXRlLm5vdygpIC0gc3RhcnRUaW1lICkgKTtcblxufVxuXG5FeHRydWRlQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7XG5FeHRydWRlQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gRXh0cnVkZUJ1ZmZlckdlb21ldHJ5O1xuXG5FeHRydWRlQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmdldEFycmF5cyA9IGZ1bmN0aW9uICgpIHtcblxuXHR2YXIgcG9zaXRpb25BdHRyaWJ1dGUgPSB0aGlzLmdldEF0dHJpYnV0ZSggXCJwb3NpdGlvblwiICk7XG5cdHZhciB2ZXJ0aWNlc0FycmF5ID0gcG9zaXRpb25BdHRyaWJ1dGUgPyBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCggcG9zaXRpb25BdHRyaWJ1dGUuYXJyYXkgKSA6IFtdO1xuXG5cdHZhciB1dkF0dHJpYnV0ZSA9IHRoaXMuZ2V0QXR0cmlidXRlKCBcInV2XCIgKTtcblx0dmFyIHV2QXJyYXkgPSB1dkF0dHJpYnV0ZSA/IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKCB1dkF0dHJpYnV0ZS5hcnJheSApIDogW107XG5cblx0dmFyIEluZGV4QXR0cmlidXRlID0gdGhpcy5pbmRleDtcblx0dmFyIGluZGljZXNBcnJheSA9IEluZGV4QXR0cmlidXRlID8gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoIEluZGV4QXR0cmlidXRlLmFycmF5ICkgOiBbXTtcblxuXHRyZXR1cm4ge1xuXHRcdHBvc2l0aW9uOiB2ZXJ0aWNlc0FycmF5LFxuXHRcdHV2OiB1dkFycmF5LFxuXHRcdGluZGV4OiBpbmRpY2VzQXJyYXlcblx0fTtcblxufTtcblxuRXh0cnVkZUJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5hZGRTaGFwZUxpc3QgPSBmdW5jdGlvbiAoIHNoYXBlcywgb3B0aW9ucyApIHtcblxuXHR2YXIgc2wgPSBzaGFwZXMubGVuZ3RoO1xuXHRvcHRpb25zLmFycmF5cyA9IHRoaXMuZ2V0QXJyYXlzKCk7XG5cblx0Zm9yICggdmFyIHMgPSAwOyBzIDwgc2w7IHMgKysgKSB7XG5cblx0XHR2YXIgc2hhcGUgPSBzaGFwZXNbIHMgXTtcblx0XHR0aGlzLmFkZFNoYXBlKCBzaGFwZSwgb3B0aW9ucyApO1xuXG5cdH1cblxuXHR0aGlzLnNldEluZGV4KCBvcHRpb25zLmFycmF5cy5pbmRleCApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIG9wdGlvbnMuYXJyYXlzLnBvc2l0aW9uLCAzICkgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICd1dicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBvcHRpb25zLmFycmF5cy51diwgMiApICk7XG5cbn07XG5cbkV4dHJ1ZGVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuYWRkU2hhcGUgPSBmdW5jdGlvbiAoIHNoYXBlLCBvcHRpb25zICkge1xuXG5cdHZhciBhcnJheXMgPSBvcHRpb25zLmFycmF5cyA/IG9wdGlvbnMuYXJyYXlzIDogdGhpcy5nZXRBcnJheXMoKTtcblx0dmFyIHZlcnRpY2VzQXJyYXkgPSBhcnJheXMucG9zaXRpb247XG5cdHZhciBpbmRpY2VzQXJyYXkgPSBhcnJheXMuaW5kZXg7XG5cdHZhciB1dkFycmF5ID0gYXJyYXlzLnV2O1xuXG5cdHZhciBwbGFjZWhvbGRlciA9IFtdO1xuXG5cblx0dmFyIGFtb3VudCA9IG9wdGlvbnMuYW1vdW50ICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmFtb3VudCA6IDEwMDtcblxuXHR2YXIgYmV2ZWxUaGlja25lc3MgPSBvcHRpb25zLmJldmVsVGhpY2tuZXNzICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmJldmVsVGhpY2tuZXNzIDogNjsgLy8gMTBcblx0dmFyIGJldmVsU2l6ZSA9IG9wdGlvbnMuYmV2ZWxTaXplICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmJldmVsU2l6ZSA6IGJldmVsVGhpY2tuZXNzIC0gMjsgLy8gOFxuXHR2YXIgYmV2ZWxTZWdtZW50cyA9IG9wdGlvbnMuYmV2ZWxTZWdtZW50cyAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5iZXZlbFNlZ21lbnRzIDogMztcblxuXHR2YXIgYmV2ZWxFbmFibGVkID0gb3B0aW9ucy5iZXZlbEVuYWJsZWQgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuYmV2ZWxFbmFibGVkIDogdHJ1ZTsgLy8gZmFsc2VcblxuXHR2YXIgY3VydmVTZWdtZW50cyA9IG9wdGlvbnMuY3VydmVTZWdtZW50cyAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5jdXJ2ZVNlZ21lbnRzIDogMTI7XG5cblx0dmFyIHN0ZXBzID0gb3B0aW9ucy5zdGVwcyAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5zdGVwcyA6IDE7XG5cblx0dmFyIGV4dHJ1ZGVQYXRoID0gb3B0aW9ucy5leHRydWRlUGF0aDtcblx0dmFyIGV4dHJ1ZGVQdHMsIGV4dHJ1ZGVCeVBhdGggPSBmYWxzZTtcblxuXHQvLyBVc2UgZGVmYXVsdCBXb3JsZFVWR2VuZXJhdG9yIGlmIG5vIFVWIGdlbmVyYXRvcnMgYXJlIHNwZWNpZmllZC5cblx0dmFyIHV2Z2VuID0gb3B0aW9ucy5VVkdlbmVyYXRvciAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5VVkdlbmVyYXRvciA6IEV4dHJ1ZGVHZW9tZXRyeS5Xb3JsZFVWR2VuZXJhdG9yO1xuXG5cdHZhciBzcGxpbmVUdWJlLCBiaW5vcm1hbCwgbm9ybWFsLCBwb3NpdGlvbjI7XG5cdGlmICggZXh0cnVkZVBhdGggKSB7XG5cblx0XHRleHRydWRlUHRzID0gZXh0cnVkZVBhdGguZ2V0U3BhY2VkUG9pbnRzKCBzdGVwcyApO1xuXG5cdFx0ZXh0cnVkZUJ5UGF0aCA9IHRydWU7XG5cdFx0YmV2ZWxFbmFibGVkID0gZmFsc2U7IC8vIGJldmVscyBub3Qgc3VwcG9ydGVkIGZvciBwYXRoIGV4dHJ1c2lvblxuXG5cdFx0Ly8gU0VUVVAgVE5CIHZhcmlhYmxlc1xuXG5cdFx0Ly8gVE9ETzEgLSBoYXZlIGEgLmlzQ2xvc2VkIGluIHNwbGluZT9cblxuXHRcdHNwbGluZVR1YmUgPSBvcHRpb25zLmZyYW1lcyAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5mcmFtZXMgOiBleHRydWRlUGF0aC5jb21wdXRlRnJlbmV0RnJhbWVzKCBzdGVwcywgZmFsc2UgKTtcblxuXHRcdC8vIGNvbnNvbGUubG9nKHNwbGluZVR1YmUsICdzcGxpbmVUdWJlJywgc3BsaW5lVHViZS5ub3JtYWxzLmxlbmd0aCwgJ3N0ZXBzJywgc3RlcHMsICdleHRydWRlUHRzJywgZXh0cnVkZVB0cy5sZW5ndGgpO1xuXG5cdFx0Ymlub3JtYWwgPSBuZXcgVmVjdG9yMygpO1xuXHRcdG5vcm1hbCA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0cG9zaXRpb24yID0gbmV3IFZlY3RvcjMoKTtcblxuXHR9XG5cblx0Ly8gU2FmZWd1YXJkcyBpZiBiZXZlbHMgYXJlIG5vdCBlbmFibGVkXG5cblx0aWYgKCAhIGJldmVsRW5hYmxlZCApIHtcblxuXHRcdGJldmVsU2VnbWVudHMgPSAwO1xuXHRcdGJldmVsVGhpY2tuZXNzID0gMDtcblx0XHRiZXZlbFNpemUgPSAwO1xuXG5cdH1cblxuXHQvLyBWYXJpYWJsZXMgaW5pdGlhbGl6YXRpb25cblxuXHR2YXIgYWhvbGUsIGgsIGhsOyAvLyBsb29waW5nIG9mIGhvbGVzXG5cdHZhciBzY29wZSA9IHRoaXM7XG5cblx0dmFyIHNoYXBlUG9pbnRzID0gc2hhcGUuZXh0cmFjdFBvaW50cyggY3VydmVTZWdtZW50cyApO1xuXG5cdHZhciB2ZXJ0aWNlcyA9IHNoYXBlUG9pbnRzLnNoYXBlO1xuXHR2YXIgaG9sZXMgPSBzaGFwZVBvaW50cy5ob2xlcztcblxuXHR2YXIgcmV2ZXJzZSA9ICEgU2hhcGVVdGlscy5pc0Nsb2NrV2lzZSggdmVydGljZXMgKTtcblxuXHRpZiAoIHJldmVyc2UgKSB7XG5cblx0XHR2ZXJ0aWNlcyA9IHZlcnRpY2VzLnJldmVyc2UoKTtcblxuXHRcdC8vIE1heWJlIHdlIHNob3VsZCBhbHNvIGNoZWNrIGlmIGhvbGVzIGFyZSBpbiB0aGUgb3Bwb3NpdGUgZGlyZWN0aW9uLCBqdXN0IHRvIGJlIHNhZmUgLi4uXG5cblx0XHRmb3IgKCBoID0gMCwgaGwgPSBob2xlcy5sZW5ndGg7IGggPCBobDsgaCArKyApIHtcblxuXHRcdFx0YWhvbGUgPSBob2xlc1sgaCBdO1xuXG5cdFx0XHRpZiAoIFNoYXBlVXRpbHMuaXNDbG9ja1dpc2UoIGFob2xlICkgKSB7XG5cblx0XHRcdFx0aG9sZXNbIGggXSA9IGFob2xlLnJldmVyc2UoKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV2ZXJzZSA9IGZhbHNlOyAvLyBJZiB2ZXJ0aWNlcyBhcmUgaW4gb3JkZXIgbm93LCB3ZSBzaG91bGRuJ3QgbmVlZCB0byB3b3JyeSBhYm91dCB0aGVtIGFnYWluIChob3BlZnVsbHkpIVxuXG5cdH1cblxuXG5cdHZhciBmYWNlcyA9IFNoYXBlVXRpbHMudHJpYW5ndWxhdGVTaGFwZSggdmVydGljZXMsIGhvbGVzICk7XG5cblx0LyogVmVydGljZXMgKi9cblxuXHR2YXIgY29udG91ciA9IHZlcnRpY2VzOyAvLyB2ZXJ0aWNlcyBoYXMgYWxsIHBvaW50cyBidXQgY29udG91ciBoYXMgb25seSBwb2ludHMgb2YgY2lyY3VtZmVyZW5jZVxuXG5cdGZvciAoIGggPSAwLCBobCA9IGhvbGVzLmxlbmd0aDsgaCA8IGhsOyBoICsrICkge1xuXG5cdFx0YWhvbGUgPSBob2xlc1sgaCBdO1xuXG5cdFx0dmVydGljZXMgPSB2ZXJ0aWNlcy5jb25jYXQoIGFob2xlICk7XG5cblx0fVxuXG5cblx0ZnVuY3Rpb24gc2NhbGVQdDIoIHB0LCB2ZWMsIHNpemUgKSB7XG5cblx0XHRpZiAoICEgdmVjICkgY29uc29sZS5lcnJvciggXCJUSFJFRS5FeHRydWRlR2VvbWV0cnk6IHZlYyBkb2VzIG5vdCBleGlzdFwiICk7XG5cblx0XHRyZXR1cm4gdmVjLmNsb25lKCkubXVsdGlwbHlTY2FsYXIoIHNpemUgKS5hZGQoIHB0ICk7XG5cblx0fVxuXG5cdHZhciBiLCBicywgdCwgeixcblx0XHR2ZXJ0LCB2bGVuID0gdmVydGljZXMubGVuZ3RoLFxuXHRcdGZhY2UsIGZsZW4gPSBmYWNlcy5sZW5ndGg7XG5cblxuXHQvLyBGaW5kIGRpcmVjdGlvbnMgZm9yIHBvaW50IG1vdmVtZW50XG5cblxuXHRmdW5jdGlvbiBnZXRCZXZlbFZlYyggaW5QdCwgaW5QcmV2LCBpbk5leHQgKSB7XG5cblx0XHQvLyBjb21wdXRlcyBmb3IgaW5QdCB0aGUgY29ycmVzcG9uZGluZyBwb2ludCBpblB0JyBvbiBhIG5ldyBjb250b3VyXG5cdFx0Ly8gICBzaGlmdGVkIGJ5IDEgdW5pdCAobGVuZ3RoIG9mIG5vcm1hbGl6ZWQgdmVjdG9yKSB0byB0aGUgbGVmdFxuXHRcdC8vIGlmIHdlIHdhbGsgYWxvbmcgY29udG91ciBjbG9ja3dpc2UsIHRoaXMgbmV3IGNvbnRvdXIgaXMgb3V0c2lkZSB0aGUgb2xkIG9uZVxuXHRcdC8vXG5cdFx0Ly8gaW5QdCcgaXMgdGhlIGludGVyc2VjdGlvbiBvZiB0aGUgdHdvIGxpbmVzIHBhcmFsbGVsIHRvIHRoZSB0d29cblx0XHQvLyAgYWRqYWNlbnQgZWRnZXMgb2YgaW5QdCBhdCBhIGRpc3RhbmNlIG9mIDEgdW5pdCBvbiB0aGUgbGVmdCBzaWRlLlxuXG5cdFx0dmFyIHZfdHJhbnNfeCwgdl90cmFuc195LCBzaHJpbmtfYnkgPSAxOyAvLyByZXN1bHRpbmcgdHJhbnNsYXRpb24gdmVjdG9yIGZvciBpblB0XG5cblx0XHQvLyBnb29kIHJlYWRpbmcgZm9yIGdlb21ldHJ5IGFsZ29yaXRobXMgKGhlcmU6IGxpbmUtbGluZSBpbnRlcnNlY3Rpb24pXG5cdFx0Ly8gaHR0cDovL2dlb21hbGdvcml0aG1zLmNvbS9hMDUtX2ludGVyc2VjdC0xLmh0bWxcblxuXHRcdHZhciB2X3ByZXZfeCA9IGluUHQueCAtIGluUHJldi54LFxuXHRcdFx0dl9wcmV2X3kgPSBpblB0LnkgLSBpblByZXYueTtcblx0XHR2YXIgdl9uZXh0X3ggPSBpbk5leHQueCAtIGluUHQueCxcblx0XHRcdHZfbmV4dF95ID0gaW5OZXh0LnkgLSBpblB0Lnk7XG5cblx0XHR2YXIgdl9wcmV2X2xlbnNxID0gKCB2X3ByZXZfeCAqIHZfcHJldl94ICsgdl9wcmV2X3kgKiB2X3ByZXZfeSApO1xuXG5cdFx0Ly8gY2hlY2sgZm9yIGNvbGxpbmVhciBlZGdlc1xuXHRcdHZhciBjb2xsaW5lYXIwID0gKCB2X3ByZXZfeCAqIHZfbmV4dF95IC0gdl9wcmV2X3kgKiB2X25leHRfeCApO1xuXG5cdFx0aWYgKCBNYXRoLmFicyggY29sbGluZWFyMCApID4gTnVtYmVyLkVQU0lMT04gKSB7XG5cblx0XHRcdC8vIG5vdCBjb2xsaW5lYXJcblxuXHRcdFx0Ly8gbGVuZ3RoIG9mIHZlY3RvcnMgZm9yIG5vcm1hbGl6aW5nXG5cblx0XHRcdHZhciB2X3ByZXZfbGVuID0gTWF0aC5zcXJ0KCB2X3ByZXZfbGVuc3EgKTtcblx0XHRcdHZhciB2X25leHRfbGVuID0gTWF0aC5zcXJ0KCB2X25leHRfeCAqIHZfbmV4dF94ICsgdl9uZXh0X3kgKiB2X25leHRfeSApO1xuXG5cdFx0XHQvLyBzaGlmdCBhZGphY2VudCBwb2ludHMgYnkgdW5pdCB2ZWN0b3JzIHRvIHRoZSBsZWZ0XG5cblx0XHRcdHZhciBwdFByZXZTaGlmdF94ID0gKCBpblByZXYueCAtIHZfcHJldl95IC8gdl9wcmV2X2xlbiApO1xuXHRcdFx0dmFyIHB0UHJldlNoaWZ0X3kgPSAoIGluUHJldi55ICsgdl9wcmV2X3ggLyB2X3ByZXZfbGVuICk7XG5cblx0XHRcdHZhciBwdE5leHRTaGlmdF94ID0gKCBpbk5leHQueCAtIHZfbmV4dF95IC8gdl9uZXh0X2xlbiApO1xuXHRcdFx0dmFyIHB0TmV4dFNoaWZ0X3kgPSAoIGluTmV4dC55ICsgdl9uZXh0X3ggLyB2X25leHRfbGVuICk7XG5cblx0XHRcdC8vIHNjYWxpbmcgZmFjdG9yIGZvciB2X3ByZXYgdG8gaW50ZXJzZWN0aW9uIHBvaW50XG5cblx0XHRcdHZhciBzZiA9ICggKCBwdE5leHRTaGlmdF94IC0gcHRQcmV2U2hpZnRfeCApICogdl9uZXh0X3kgLVxuXHRcdFx0XHRcdCggcHROZXh0U2hpZnRfeSAtIHB0UHJldlNoaWZ0X3kgKSAqIHZfbmV4dF94ICkgL1xuXHRcdFx0XHQoIHZfcHJldl94ICogdl9uZXh0X3kgLSB2X3ByZXZfeSAqIHZfbmV4dF94ICk7XG5cblx0XHRcdC8vIHZlY3RvciBmcm9tIGluUHQgdG8gaW50ZXJzZWN0aW9uIHBvaW50XG5cblx0XHRcdHZfdHJhbnNfeCA9ICggcHRQcmV2U2hpZnRfeCArIHZfcHJldl94ICogc2YgLSBpblB0LnggKTtcblx0XHRcdHZfdHJhbnNfeSA9ICggcHRQcmV2U2hpZnRfeSArIHZfcHJldl95ICogc2YgLSBpblB0LnkgKTtcblxuXHRcdFx0Ly8gRG9uJ3Qgbm9ybWFsaXplISwgb3RoZXJ3aXNlIHNoYXJwIGNvcm5lcnMgYmVjb21lIHVnbHlcblx0XHRcdC8vICBidXQgcHJldmVudCBjcmF6eSBzcGlrZXNcblx0XHRcdHZhciB2X3RyYW5zX2xlbnNxID0gKCB2X3RyYW5zX3ggKiB2X3RyYW5zX3ggKyB2X3RyYW5zX3kgKiB2X3RyYW5zX3kgKTtcblx0XHRcdGlmICggdl90cmFuc19sZW5zcSA8PSAyICkge1xuXG5cdFx0XHRcdHJldHVybiBuZXcgVmVjdG9yMiggdl90cmFuc194LCB2X3RyYW5zX3kgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRzaHJpbmtfYnkgPSBNYXRoLnNxcnQoIHZfdHJhbnNfbGVuc3EgLyAyICk7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIGhhbmRsZSBzcGVjaWFsIGNhc2Ugb2YgY29sbGluZWFyIGVkZ2VzXG5cblx0XHRcdHZhciBkaXJlY3Rpb25fZXEgPSBmYWxzZTsgLy8gYXNzdW1lczogb3Bwb3NpdGVcblx0XHRcdGlmICggdl9wcmV2X3ggPiBOdW1iZXIuRVBTSUxPTiApIHtcblxuXHRcdFx0XHRpZiAoIHZfbmV4dF94ID4gTnVtYmVyLkVQU0lMT04gKSB7XG5cblx0XHRcdFx0XHRkaXJlY3Rpb25fZXEgPSB0cnVlO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRpZiAoIHZfcHJldl94IDwgLSBOdW1iZXIuRVBTSUxPTiApIHtcblxuXHRcdFx0XHRcdGlmICggdl9uZXh0X3ggPCAtIE51bWJlci5FUFNJTE9OICkge1xuXG5cdFx0XHRcdFx0XHRkaXJlY3Rpb25fZXEgPSB0cnVlO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRpZiAoIE1hdGguc2lnbiggdl9wcmV2X3kgKSA9PT0gTWF0aC5zaWduKCB2X25leHRfeSApICkge1xuXG5cdFx0XHRcdFx0XHRkaXJlY3Rpb25fZXEgPSB0cnVlO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGRpcmVjdGlvbl9lcSApIHtcblxuXHRcdFx0XHQvLyBjb25zb2xlLmxvZyhcIldhcm5pbmc6IGxpbmVzIGFyZSBhIHN0cmFpZ2h0IHNlcXVlbmNlXCIpO1xuXHRcdFx0XHR2X3RyYW5zX3ggPSAtIHZfcHJldl95O1xuXHRcdFx0XHR2X3RyYW5zX3kgPSB2X3ByZXZfeDtcblx0XHRcdFx0c2hyaW5rX2J5ID0gTWF0aC5zcXJ0KCB2X3ByZXZfbGVuc3EgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyBjb25zb2xlLmxvZyhcIldhcm5pbmc6IGxpbmVzIGFyZSBhIHN0cmFpZ2h0IHNwaWtlXCIpO1xuXHRcdFx0XHR2X3RyYW5zX3ggPSB2X3ByZXZfeDtcblx0XHRcdFx0dl90cmFuc195ID0gdl9wcmV2X3k7XG5cdFx0XHRcdHNocmlua19ieSA9IE1hdGguc3FydCggdl9wcmV2X2xlbnNxIC8gMiApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gbmV3IFZlY3RvcjIoIHZfdHJhbnNfeCAvIHNocmlua19ieSwgdl90cmFuc195IC8gc2hyaW5rX2J5ICk7XG5cblx0fVxuXG5cblx0dmFyIGNvbnRvdXJNb3ZlbWVudHMgPSBbXTtcblxuXHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gY29udG91ci5sZW5ndGgsIGogPSBpbCAtIDEsIGsgPSBpICsgMTsgaSA8IGlsOyBpICsrLCBqICsrLCBrICsrICkge1xuXG5cdFx0aWYgKCBqID09PSBpbCApIGogPSAwO1xuXHRcdGlmICggayA9PT0gaWwgKSBrID0gMDtcblxuXHRcdC8vICAoaiktLS0oaSktLS0oaylcblx0XHQvLyBjb25zb2xlLmxvZygnaSxqLGsnLCBpLCBqICwgaylcblxuXHRcdGNvbnRvdXJNb3ZlbWVudHNbIGkgXSA9IGdldEJldmVsVmVjKCBjb250b3VyWyBpIF0sIGNvbnRvdXJbIGogXSwgY29udG91clsgayBdICk7XG5cblx0fVxuXG5cdHZhciBob2xlc01vdmVtZW50cyA9IFtdLFxuXHRcdG9uZUhvbGVNb3ZlbWVudHMsIHZlcnRpY2VzTW92ZW1lbnRzID0gY29udG91ck1vdmVtZW50cy5jb25jYXQoKTtcblxuXHRmb3IgKCBoID0gMCwgaGwgPSBob2xlcy5sZW5ndGg7IGggPCBobDsgaCArKyApIHtcblxuXHRcdGFob2xlID0gaG9sZXNbIGggXTtcblxuXHRcdG9uZUhvbGVNb3ZlbWVudHMgPSBbXTtcblxuXHRcdGZvciAoIGkgPSAwLCBpbCA9IGFob2xlLmxlbmd0aCwgaiA9IGlsIC0gMSwgayA9IGkgKyAxOyBpIDwgaWw7IGkgKyssIGogKyssIGsgKysgKSB7XG5cblx0XHRcdGlmICggaiA9PT0gaWwgKSBqID0gMDtcblx0XHRcdGlmICggayA9PT0gaWwgKSBrID0gMDtcblxuXHRcdFx0Ly8gIChqKS0tLShpKS0tLShrKVxuXHRcdFx0b25lSG9sZU1vdmVtZW50c1sgaSBdID0gZ2V0QmV2ZWxWZWMoIGFob2xlWyBpIF0sIGFob2xlWyBqIF0sIGFob2xlWyBrIF0gKTtcblxuXHRcdH1cblxuXHRcdGhvbGVzTW92ZW1lbnRzLnB1c2goIG9uZUhvbGVNb3ZlbWVudHMgKTtcblx0XHR2ZXJ0aWNlc01vdmVtZW50cyA9IHZlcnRpY2VzTW92ZW1lbnRzLmNvbmNhdCggb25lSG9sZU1vdmVtZW50cyApO1xuXG5cdH1cblxuXG5cdC8vIExvb3AgYmV2ZWxTZWdtZW50cywgMSBmb3IgdGhlIGZyb250LCAxIGZvciB0aGUgYmFja1xuXG5cdGZvciAoIGIgPSAwOyBiIDwgYmV2ZWxTZWdtZW50czsgYiArKyApIHtcblxuXHRcdC8vZm9yICggYiA9IGJldmVsU2VnbWVudHM7IGIgPiAwOyBiIC0tICkge1xuXG5cdFx0dCA9IGIgLyBiZXZlbFNlZ21lbnRzO1xuXHRcdHogPSBiZXZlbFRoaWNrbmVzcyAqIE1hdGguY29zKCB0ICogTWF0aC5QSSAvIDIgKTtcblx0XHRicyA9IGJldmVsU2l6ZSAqIE1hdGguc2luKCB0ICogTWF0aC5QSSAvIDIgKTtcblxuXHRcdC8vIGNvbnRyYWN0IHNoYXBlXG5cblx0XHRmb3IgKCBpID0gMCwgaWwgPSBjb250b3VyLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR2ZXJ0ID0gc2NhbGVQdDIoIGNvbnRvdXJbIGkgXSwgY29udG91ck1vdmVtZW50c1sgaSBdLCBicyApO1xuXG5cdFx0XHR2KCB2ZXJ0LngsIHZlcnQueSwgLSB6ICk7XG5cblx0XHR9XG5cblx0XHQvLyBleHBhbmQgaG9sZXNcblxuXHRcdGZvciAoIGggPSAwLCBobCA9IGhvbGVzLmxlbmd0aDsgaCA8IGhsOyBoICsrICkge1xuXG5cdFx0XHRhaG9sZSA9IGhvbGVzWyBoIF07XG5cdFx0XHRvbmVIb2xlTW92ZW1lbnRzID0gaG9sZXNNb3ZlbWVudHNbIGggXTtcblxuXHRcdFx0Zm9yICggaSA9IDAsIGlsID0gYWhvbGUubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdFx0dmVydCA9IHNjYWxlUHQyKCBhaG9sZVsgaSBdLCBvbmVIb2xlTW92ZW1lbnRzWyBpIF0sIGJzICk7XG5cblx0XHRcdFx0diggdmVydC54LCB2ZXJ0LnksIC0geiApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fVxuXG5cdGJzID0gYmV2ZWxTaXplO1xuXG5cdC8vIEJhY2sgZmFjaW5nIHZlcnRpY2VzXG5cblx0Zm9yICggaSA9IDA7IGkgPCB2bGVuOyBpICsrICkge1xuXG5cdFx0dmVydCA9IGJldmVsRW5hYmxlZCA/IHNjYWxlUHQyKCB2ZXJ0aWNlc1sgaSBdLCB2ZXJ0aWNlc01vdmVtZW50c1sgaSBdLCBicyApIDogdmVydGljZXNbIGkgXTtcblxuXHRcdGlmICggISBleHRydWRlQnlQYXRoICkge1xuXG5cdFx0XHR2KCB2ZXJ0LngsIHZlcnQueSwgMCApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gdiggdmVydC54LCB2ZXJ0LnkgKyBleHRydWRlUHRzWyAwIF0ueSwgZXh0cnVkZVB0c1sgMCBdLnggKTtcblxuXHRcdFx0bm9ybWFsLmNvcHkoIHNwbGluZVR1YmUubm9ybWFsc1sgMCBdICkubXVsdGlwbHlTY2FsYXIoIHZlcnQueCApO1xuXHRcdFx0Ymlub3JtYWwuY29weSggc3BsaW5lVHViZS5iaW5vcm1hbHNbIDAgXSApLm11bHRpcGx5U2NhbGFyKCB2ZXJ0LnkgKTtcblxuXHRcdFx0cG9zaXRpb24yLmNvcHkoIGV4dHJ1ZGVQdHNbIDAgXSApLmFkZCggbm9ybWFsICkuYWRkKCBiaW5vcm1hbCApO1xuXG5cdFx0XHR2KCBwb3NpdGlvbjIueCwgcG9zaXRpb24yLnksIHBvc2l0aW9uMi56ICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIEFkZCBzdGVwcGVkIHZlcnRpY2VzLi4uXG5cdC8vIEluY2x1ZGluZyBmcm9udCBmYWNpbmcgdmVydGljZXNcblxuXHR2YXIgcztcblxuXHRmb3IgKCBzID0gMTsgcyA8PSBzdGVwczsgcyArKyApIHtcblxuXHRcdGZvciAoIGkgPSAwOyBpIDwgdmxlbjsgaSArKyApIHtcblxuXHRcdFx0dmVydCA9IGJldmVsRW5hYmxlZCA/IHNjYWxlUHQyKCB2ZXJ0aWNlc1sgaSBdLCB2ZXJ0aWNlc01vdmVtZW50c1sgaSBdLCBicyApIDogdmVydGljZXNbIGkgXTtcblxuXHRcdFx0aWYgKCAhIGV4dHJ1ZGVCeVBhdGggKSB7XG5cblx0XHRcdFx0diggdmVydC54LCB2ZXJ0LnksIGFtb3VudCAvIHN0ZXBzICogcyApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdC8vIHYoIHZlcnQueCwgdmVydC55ICsgZXh0cnVkZVB0c1sgcyAtIDEgXS55LCBleHRydWRlUHRzWyBzIC0gMSBdLnggKTtcblxuXHRcdFx0XHRub3JtYWwuY29weSggc3BsaW5lVHViZS5ub3JtYWxzWyBzIF0gKS5tdWx0aXBseVNjYWxhciggdmVydC54ICk7XG5cdFx0XHRcdGJpbm9ybWFsLmNvcHkoIHNwbGluZVR1YmUuYmlub3JtYWxzWyBzIF0gKS5tdWx0aXBseVNjYWxhciggdmVydC55ICk7XG5cblx0XHRcdFx0cG9zaXRpb24yLmNvcHkoIGV4dHJ1ZGVQdHNbIHMgXSApLmFkZCggbm9ybWFsICkuYWRkKCBiaW5vcm1hbCApO1xuXG5cdFx0XHRcdHYoIHBvc2l0aW9uMi54LCBwb3NpdGlvbjIueSwgcG9zaXRpb24yLnogKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH1cblxuXG5cdC8vIEFkZCBiZXZlbCBzZWdtZW50cyBwbGFuZXNcblxuXHQvL2ZvciAoIGIgPSAxOyBiIDw9IGJldmVsU2VnbWVudHM7IGIgKysgKSB7XG5cdGZvciAoIGIgPSBiZXZlbFNlZ21lbnRzIC0gMTsgYiA+PSAwOyBiIC0tICkge1xuXG5cdFx0dCA9IGIgLyBiZXZlbFNlZ21lbnRzO1xuXHRcdHogPSBiZXZlbFRoaWNrbmVzcyAqIE1hdGguY29zKCB0ICogTWF0aC5QSSAvIDIgKTtcblx0XHRicyA9IGJldmVsU2l6ZSAqIE1hdGguc2luKCB0ICogTWF0aC5QSSAvIDIgKTtcblxuXHRcdC8vIGNvbnRyYWN0IHNoYXBlXG5cblx0XHRmb3IgKCBpID0gMCwgaWwgPSBjb250b3VyLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR2ZXJ0ID0gc2NhbGVQdDIoIGNvbnRvdXJbIGkgXSwgY29udG91ck1vdmVtZW50c1sgaSBdLCBicyApO1xuXHRcdFx0diggdmVydC54LCB2ZXJ0LnksIGFtb3VudCArIHogKTtcblxuXHRcdH1cblxuXHRcdC8vIGV4cGFuZCBob2xlc1xuXG5cdFx0Zm9yICggaCA9IDAsIGhsID0gaG9sZXMubGVuZ3RoOyBoIDwgaGw7IGggKysgKSB7XG5cblx0XHRcdGFob2xlID0gaG9sZXNbIGggXTtcblx0XHRcdG9uZUhvbGVNb3ZlbWVudHMgPSBob2xlc01vdmVtZW50c1sgaCBdO1xuXG5cdFx0XHRmb3IgKCBpID0gMCwgaWwgPSBhaG9sZS5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHR2ZXJ0ID0gc2NhbGVQdDIoIGFob2xlWyBpIF0sIG9uZUhvbGVNb3ZlbWVudHNbIGkgXSwgYnMgKTtcblxuXHRcdFx0XHRpZiAoICEgZXh0cnVkZUJ5UGF0aCApIHtcblxuXHRcdFx0XHRcdHYoIHZlcnQueCwgdmVydC55LCBhbW91bnQgKyB6ICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHYoIHZlcnQueCwgdmVydC55ICsgZXh0cnVkZVB0c1sgc3RlcHMgLSAxIF0ueSwgZXh0cnVkZVB0c1sgc3RlcHMgLSAxIF0ueCArIHogKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9XG5cblx0LyogRmFjZXMgKi9cblxuXHQvLyBUb3AgYW5kIGJvdHRvbSBmYWNlc1xuXG5cdGJ1aWxkTGlkRmFjZXMoKTtcblxuXHQvLyBTaWRlcyBmYWNlc1xuXG5cdGJ1aWxkU2lkZUZhY2VzKCk7XG5cblxuXHQvLy8vLyAgSW50ZXJuYWwgZnVuY3Rpb25zXG5cblx0ZnVuY3Rpb24gYnVpbGRMaWRGYWNlcygpIHtcblxuXHRcdHZhciBzdGFydCA9IHZlcnRpY2VzQXJyYXkubGVuZ3RoLzM7XG5cblx0XHRpZiAoIGJldmVsRW5hYmxlZCApIHtcblxuXHRcdFx0dmFyIGxheWVyID0gMDsgLy8gc3RlcHMgKyAxXG5cdFx0XHR2YXIgb2Zmc2V0ID0gdmxlbiAqIGxheWVyO1xuXG5cdFx0XHQvLyBCb3R0b20gZmFjZXNcblxuXHRcdFx0Zm9yICggaSA9IDA7IGkgPCBmbGVuOyBpICsrICkge1xuXG5cdFx0XHRcdGZhY2UgPSBmYWNlc1sgaSBdO1xuXHRcdFx0XHRmMyggZmFjZVsgMiBdICsgb2Zmc2V0LCBmYWNlWyAxIF0gKyBvZmZzZXQsIGZhY2VbIDAgXSArIG9mZnNldCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGxheWVyID0gc3RlcHMgKyBiZXZlbFNlZ21lbnRzICogMjtcblx0XHRcdG9mZnNldCA9IHZsZW4gKiBsYXllcjtcblxuXHRcdFx0Ly8gVG9wIGZhY2VzXG5cblx0XHRcdGZvciAoIGkgPSAwOyBpIDwgZmxlbjsgaSArKyApIHtcblxuXHRcdFx0XHRmYWNlID0gZmFjZXNbIGkgXTtcblx0XHRcdFx0ZjMoIGZhY2VbIDAgXSArIG9mZnNldCwgZmFjZVsgMSBdICsgb2Zmc2V0LCBmYWNlWyAyIF0gKyBvZmZzZXQgKTtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gQm90dG9tIGZhY2VzXG5cblx0XHRcdGZvciAoIGkgPSAwOyBpIDwgZmxlbjsgaSArKyApIHtcblxuXHRcdFx0XHRmYWNlID0gZmFjZXNbIGkgXTtcblx0XHRcdFx0ZjMoIGZhY2VbIDIgXSwgZmFjZVsgMSBdLCBmYWNlWyAwIF0gKTtcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBUb3AgZmFjZXNcblxuXHRcdFx0Zm9yICggaSA9IDA7IGkgPCBmbGVuOyBpICsrICkge1xuXG5cdFx0XHRcdGZhY2UgPSBmYWNlc1sgaSBdO1xuXHRcdFx0XHRmMyggZmFjZVsgMCBdICsgdmxlbiAqIHN0ZXBzLCBmYWNlWyAxIF0gKyB2bGVuICogc3RlcHMsIGZhY2VbIDIgXSArIHZsZW4gKiBzdGVwcyApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRzY29wZS5hZGRHcm91cCggc3RhcnQsIHZlcnRpY2VzQXJyYXkubGVuZ3RoLzMgLXN0YXJ0LCBvcHRpb25zLm1hdGVyaWFsICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLm1hdGVyaWFsIDogMCk7XG5cblx0fVxuXG5cdC8vIENyZWF0ZSBmYWNlcyBmb3IgdGhlIHotc2lkZXMgb2YgdGhlIHNoYXBlXG5cblx0ZnVuY3Rpb24gYnVpbGRTaWRlRmFjZXMoKSB7XG5cblx0XHR2YXIgc3RhcnQgPSB2ZXJ0aWNlc0FycmF5Lmxlbmd0aC8zO1xuXHRcdHZhciBsYXllcm9mZnNldCA9IDA7XG5cdFx0c2lkZXdhbGxzKCBjb250b3VyLCBsYXllcm9mZnNldCApO1xuXHRcdGxheWVyb2Zmc2V0ICs9IGNvbnRvdXIubGVuZ3RoO1xuXG5cdFx0Zm9yICggaCA9IDAsIGhsID0gaG9sZXMubGVuZ3RoOyBoIDwgaGw7IGggKysgKSB7XG5cblx0XHRcdGFob2xlID0gaG9sZXNbIGggXTtcblx0XHRcdHNpZGV3YWxscyggYWhvbGUsIGxheWVyb2Zmc2V0ICk7XG5cblx0XHRcdC8vLCB0cnVlXG5cdFx0XHRsYXllcm9mZnNldCArPSBhaG9sZS5sZW5ndGg7XG5cblx0XHR9XG5cblxuXHRcdHNjb3BlLmFkZEdyb3VwKCBzdGFydCwgdmVydGljZXNBcnJheS5sZW5ndGgvMyAtc3RhcnQsIG9wdGlvbnMuZXh0cnVkZU1hdGVyaWFsICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmV4dHJ1ZGVNYXRlcmlhbCA6IDEpO1xuXG5cblx0fVxuXG5cdGZ1bmN0aW9uIHNpZGV3YWxscyggY29udG91ciwgbGF5ZXJvZmZzZXQgKSB7XG5cblx0XHR2YXIgaiwgaztcblx0XHRpID0gY29udG91ci5sZW5ndGg7XG5cblx0XHR3aGlsZSAoIC0tIGkgPj0gMCApIHtcblxuXHRcdFx0aiA9IGk7XG5cdFx0XHRrID0gaSAtIDE7XG5cdFx0XHRpZiAoIGsgPCAwICkgayA9IGNvbnRvdXIubGVuZ3RoIC0gMTtcblxuXHRcdFx0Ly9jb25zb2xlLmxvZygnYicsIGksaiwgaS0xLCBrLHZlcnRpY2VzLmxlbmd0aCk7XG5cblx0XHRcdHZhciBzID0gMCxcblx0XHRcdFx0c2wgPSBzdGVwcyArIGJldmVsU2VnbWVudHMgKiAyO1xuXG5cdFx0XHRmb3IgKCBzID0gMDsgcyA8IHNsOyBzICsrICkge1xuXG5cdFx0XHRcdHZhciBzbGVuMSA9IHZsZW4gKiBzO1xuXHRcdFx0XHR2YXIgc2xlbjIgPSB2bGVuICogKCBzICsgMSApO1xuXG5cdFx0XHRcdHZhciBhID0gbGF5ZXJvZmZzZXQgKyBqICsgc2xlbjEsXG5cdFx0XHRcdFx0YiA9IGxheWVyb2Zmc2V0ICsgayArIHNsZW4xLFxuXHRcdFx0XHRcdGMgPSBsYXllcm9mZnNldCArIGsgKyBzbGVuMixcblx0XHRcdFx0XHRkID0gbGF5ZXJvZmZzZXQgKyBqICsgc2xlbjI7XG5cblx0XHRcdFx0ZjQoIGEsIGIsIGMsIGQsIGNvbnRvdXIsIHMsIHNsLCBqLCBrICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gdiggeCwgeSwgeiApIHtcblxuXHRcdHBsYWNlaG9sZGVyLnB1c2goIHggKTtcblx0XHRwbGFjZWhvbGRlci5wdXNoKCB5ICk7XG5cdFx0cGxhY2Vob2xkZXIucHVzaCggeiApO1xuXG5cdH1cblxuXG5cdGZ1bmN0aW9uIGYzKCBhLCBiLCBjICkge1xuXG5cdFx0YWRkVmVydGV4KCBhICk7XG5cdFx0YWRkVmVydGV4KCBiICk7XG5cdFx0YWRkVmVydGV4KCBjICk7XG5cblx0XHR2YXIgbmV4dEluZGV4ID0gdmVydGljZXNBcnJheS5sZW5ndGggLyAzO1xuXHRcdHZhciB1dnMgPSB1dmdlbi5nZW5lcmF0ZVRvcFVWKCBzY29wZSwgdmVydGljZXNBcnJheSwgbmV4dEluZGV4IC0gMywgbmV4dEluZGV4IC0gMiwgbmV4dEluZGV4IC0gMSApO1xuXG5cdFx0YWRkVVYoIHV2c1sgMCBdICk7XG5cdFx0YWRkVVYoIHV2c1sgMSBdICk7XG5cdFx0YWRkVVYoIHV2c1sgMiBdICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGY0KCBhLCBiLCBjLCBkLCB3YWxsQ29udG91ciwgc3RlcEluZGV4LCBzdGVwc0xlbmd0aCwgY29udG91ckluZGV4MSwgY29udG91ckluZGV4MiApIHtcblxuXHRcdGFkZFZlcnRleCggYSApO1xuXHRcdGFkZFZlcnRleCggYiApO1xuXHRcdGFkZFZlcnRleCggZCApO1xuXG5cdFx0YWRkVmVydGV4KCBiICk7XG5cdFx0YWRkVmVydGV4KCBjICk7XG5cdFx0YWRkVmVydGV4KCBkICk7XG5cblxuXHRcdHZhciBuZXh0SW5kZXggPSB2ZXJ0aWNlc0FycmF5Lmxlbmd0aCAvIDM7XG5cdFx0dmFyIHV2cyA9IHV2Z2VuLmdlbmVyYXRlU2lkZVdhbGxVViggc2NvcGUsIHZlcnRpY2VzQXJyYXksIG5leHRJbmRleCAtIDYsIG5leHRJbmRleCAtIDMsIG5leHRJbmRleCAtIDIsIG5leHRJbmRleCAtIDEgKTtcblxuXHRcdGFkZFVWKCB1dnNbIDAgXSApO1xuXHRcdGFkZFVWKCB1dnNbIDEgXSApO1xuXHRcdGFkZFVWKCB1dnNbIDMgXSApO1xuXG5cdFx0YWRkVVYoIHV2c1sgMSBdICk7XG5cdFx0YWRkVVYoIHV2c1sgMiBdICk7XG5cdFx0YWRkVVYoIHV2c1sgMyBdICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGFkZFZlcnRleCggaW5kZXggKSB7XG5cblx0XHRpbmRpY2VzQXJyYXkucHVzaCggdmVydGljZXNBcnJheS5sZW5ndGggLyAzICk7XG5cdFx0dmVydGljZXNBcnJheS5wdXNoKCBwbGFjZWhvbGRlclsgaW5kZXggKiAzICsgMCBdICk7XG5cdFx0dmVydGljZXNBcnJheS5wdXNoKCBwbGFjZWhvbGRlclsgaW5kZXggKiAzICsgMSBdICk7XG5cdFx0dmVydGljZXNBcnJheS5wdXNoKCBwbGFjZWhvbGRlclsgaW5kZXggKiAzICsgMiBdICk7XG5cblx0fVxuXG5cblx0ZnVuY3Rpb24gYWRkVVYoIHZlY3RvcjIgKSB7XG5cblx0XHR1dkFycmF5LnB1c2goIHZlY3RvcjIueCApO1xuXHRcdHV2QXJyYXkucHVzaCggdmVjdG9yMi55ICk7XG5cblx0fVxuXG5cdGlmICggISBvcHRpb25zLmFycmF5cyApIHtcblxuXHRcdHRoaXMuc2V0SW5kZXgoIGluZGljZXNBcnJheSApO1xuXHRcdHRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXNBcnJheSwgMyApICk7XG5cdFx0dGhpcy5hZGRBdHRyaWJ1dGUoICd1dicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBvcHRpb25zLmFycmF5cy51diwgMiApICk7XG5cblx0fVxuXG59O1xuXG5FeHRydWRlR2VvbWV0cnkuV29ybGRVVkdlbmVyYXRvciA9IHtcblxuXHRnZW5lcmF0ZVRvcFVWOiBmdW5jdGlvbiAoIGdlb21ldHJ5LCB2ZXJ0aWNlcywgaW5kZXhBLCBpbmRleEIsIGluZGV4QyApIHtcblxuXHRcdHZhciBhX3ggPSB2ZXJ0aWNlc1sgaW5kZXhBICogMyBdO1xuXHRcdHZhciBhX3kgPSB2ZXJ0aWNlc1sgaW5kZXhBICogMyArIDEgXTtcblx0XHR2YXIgYl94ID0gdmVydGljZXNbIGluZGV4QiAqIDMgXTtcblx0XHR2YXIgYl95ID0gdmVydGljZXNbIGluZGV4QiAqIDMgKyAxIF07XG5cdFx0dmFyIGNfeCA9IHZlcnRpY2VzWyBpbmRleEMgKiAzIF07XG5cdFx0dmFyIGNfeSA9IHZlcnRpY2VzWyBpbmRleEMgKiAzICsgMSBdO1xuXG5cdFx0cmV0dXJuIFtcblx0XHRcdG5ldyBWZWN0b3IyKCBhX3gsIGFfeSApLFxuXHRcdFx0bmV3IFZlY3RvcjIoIGJfeCwgYl95ICksXG5cdFx0XHRuZXcgVmVjdG9yMiggY194LCBjX3kgKVxuXHRcdF07XG5cblx0fSxcblxuXHRnZW5lcmF0ZVNpZGVXYWxsVVY6IGZ1bmN0aW9uICggZ2VvbWV0cnksIHZlcnRpY2VzLCBpbmRleEEsIGluZGV4QiwgaW5kZXhDLCBpbmRleEQgKSB7XG5cblx0XHR2YXIgYV94ID0gdmVydGljZXNbIGluZGV4QSAqIDMgXTtcblx0XHR2YXIgYV95ID0gdmVydGljZXNbIGluZGV4QSAqIDMgKyAxIF07XG5cdFx0dmFyIGFfeiA9IHZlcnRpY2VzWyBpbmRleEEgKiAzICsgMiBdO1xuXHRcdHZhciBiX3ggPSB2ZXJ0aWNlc1sgaW5kZXhCICogMyBdO1xuXHRcdHZhciBiX3kgPSB2ZXJ0aWNlc1sgaW5kZXhCICogMyArIDEgXTtcblx0XHR2YXIgYl96ID0gdmVydGljZXNbIGluZGV4QiAqIDMgKyAyIF07XG5cdFx0dmFyIGNfeCA9IHZlcnRpY2VzWyBpbmRleEMgKiAzIF07XG5cdFx0dmFyIGNfeSA9IHZlcnRpY2VzWyBpbmRleEMgKiAzICsgMSBdO1xuXHRcdHZhciBjX3ogPSB2ZXJ0aWNlc1sgaW5kZXhDICogMyArIDIgXTtcblx0XHR2YXIgZF94ID0gdmVydGljZXNbIGluZGV4RCAqIDMgXTtcblx0XHR2YXIgZF95ID0gdmVydGljZXNbIGluZGV4RCAqIDMgKyAxIF07XG5cdFx0dmFyIGRfeiA9IHZlcnRpY2VzWyBpbmRleEQgKiAzICsgMiBdO1xuXG5cdFx0aWYgKCBNYXRoLmFicyggYV95IC0gYl95ICkgPCAwLjAxICkge1xuXG5cdFx0XHRyZXR1cm4gW1xuXHRcdFx0XHRuZXcgVmVjdG9yMiggYV94LCAxIC0gYV96ICksXG5cdFx0XHRcdG5ldyBWZWN0b3IyKCBiX3gsIDEgLSBiX3ogKSxcblx0XHRcdFx0bmV3IFZlY3RvcjIoIGNfeCwgMSAtIGNfeiApLFxuXHRcdFx0XHRuZXcgVmVjdG9yMiggZF94LCAxIC0gZF96IClcblx0XHRcdF07XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRyZXR1cm4gW1xuXHRcdFx0XHRuZXcgVmVjdG9yMiggYV95LCAxIC0gYV96ICksXG5cdFx0XHRcdG5ldyBWZWN0b3IyKCBiX3ksIDEgLSBiX3ogKSxcblx0XHRcdFx0bmV3IFZlY3RvcjIoIGNfeSwgMSAtIGNfeiApLFxuXHRcdFx0XHRuZXcgVmVjdG9yMiggZF95LCAxIC0gZF96IClcblx0XHRcdF07XG5cblx0XHR9XG5cblx0fVxufTtcblxuLyoqXG4gKiBAYXV0aG9yIHp6ODUgLyBodHRwOi8vd3d3LmxhYjRnYW1lcy5uZXQveno4NS9ibG9nXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICpcbiAqIFRleHQgPSAzRCBUZXh0XG4gKlxuICogcGFyYW1ldGVycyA9IHtcbiAqICBmb250OiA8VEhSRUUuRm9udD4sIC8vIGZvbnRcbiAqXG4gKiAgc2l6ZTogPGZsb2F0PiwgLy8gc2l6ZSBvZiB0aGUgdGV4dFxuICogIGhlaWdodDogPGZsb2F0PiwgLy8gdGhpY2tuZXNzIHRvIGV4dHJ1ZGUgdGV4dFxuICogIGN1cnZlU2VnbWVudHM6IDxpbnQ+LCAvLyBudW1iZXIgb2YgcG9pbnRzIG9uIHRoZSBjdXJ2ZXNcbiAqXG4gKiAgYmV2ZWxFbmFibGVkOiA8Ym9vbD4sIC8vIHR1cm4gb24gYmV2ZWxcbiAqICBiZXZlbFRoaWNrbmVzczogPGZsb2F0PiwgLy8gaG93IGRlZXAgaW50byB0ZXh0IGJldmVsIGdvZXNcbiAqICBiZXZlbFNpemU6IDxmbG9hdD4gLy8gaG93IGZhciBmcm9tIHRleHQgb3V0bGluZSBpcyBiZXZlbFxuICogfVxuICovXG5cbi8vIFRleHRHZW9tZXRyeVxuXG5mdW5jdGlvbiBUZXh0R2VvbWV0cnkoICB0ZXh0LCBwYXJhbWV0ZXJzICkge1xuXG5cdEdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnVGV4dEdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0dGV4dDogdGV4dCxcblx0XHRwYXJhbWV0ZXJzOiBwYXJhbWV0ZXJzXG5cdH07XG5cblx0dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIG5ldyBUZXh0QnVmZmVyR2VvbWV0cnkoIHRleHQsIHBhcmFtZXRlcnMgKSApO1xuXHR0aGlzLm1lcmdlVmVydGljZXMoKTtcblxufVxuXG5UZXh0R2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7XG5UZXh0R2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVGV4dEdlb21ldHJ5O1xuXG4vLyBUZXh0QnVmZmVyR2VvbWV0cnlcblxuZnVuY3Rpb24gVGV4dEJ1ZmZlckdlb21ldHJ5KCB0ZXh0LCBwYXJhbWV0ZXJzICkge1xuXG5cdHBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzIHx8IHt9O1xuXG5cdHZhciBmb250ID0gcGFyYW1ldGVycy5mb250O1xuXG5cdGlmICggKCBmb250ICYmIGZvbnQuaXNGb250ICkgPT09IGZhbHNlICkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlRleHRHZW9tZXRyeTogZm9udCBwYXJhbWV0ZXIgaXMgbm90IGFuIGluc3RhbmNlIG9mIFRIUkVFLkZvbnQuJyApO1xuXHRcdHJldHVybiBuZXcgR2VvbWV0cnkoKTtcblxuXHR9XG5cblx0dmFyIHNoYXBlcyA9IGZvbnQuZ2VuZXJhdGVTaGFwZXMoIHRleHQsIHBhcmFtZXRlcnMuc2l6ZSwgcGFyYW1ldGVycy5jdXJ2ZVNlZ21lbnRzICk7XG5cblx0Ly8gdHJhbnNsYXRlIHBhcmFtZXRlcnMgdG8gRXh0cnVkZUdlb21ldHJ5IEFQSVxuXG5cdHBhcmFtZXRlcnMuYW1vdW50ID0gcGFyYW1ldGVycy5oZWlnaHQgIT09IHVuZGVmaW5lZCA/IHBhcmFtZXRlcnMuaGVpZ2h0IDogNTA7XG5cblx0Ly8gZGVmYXVsdHNcblxuXHRpZiAoIHBhcmFtZXRlcnMuYmV2ZWxUaGlja25lc3MgPT09IHVuZGVmaW5lZCApIHBhcmFtZXRlcnMuYmV2ZWxUaGlja25lc3MgPSAxMDtcblx0aWYgKCBwYXJhbWV0ZXJzLmJldmVsU2l6ZSA9PT0gdW5kZWZpbmVkICkgcGFyYW1ldGVycy5iZXZlbFNpemUgPSA4O1xuXHRpZiAoIHBhcmFtZXRlcnMuYmV2ZWxFbmFibGVkID09PSB1bmRlZmluZWQgKSBwYXJhbWV0ZXJzLmJldmVsRW5hYmxlZCA9IGZhbHNlO1xuXG5cdEV4dHJ1ZGVCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzLCBzaGFwZXMsIHBhcmFtZXRlcnMgKTtcblxuXHR0aGlzLnR5cGUgPSAnVGV4dEJ1ZmZlckdlb21ldHJ5JztcblxufVxuXG5UZXh0QnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggRXh0cnVkZUJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApO1xuVGV4dEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFRleHRCdWZmZXJHZW9tZXRyeTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBiZW5hYWRhbXMgLyBodHRwczovL3R3aXR0ZXIuY29tL2Jlbl9hX2FkYW1zXG4gKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44N1xuICovXG5cbi8vIFNwaGVyZUdlb21ldHJ5XG5cbmZ1bmN0aW9uIFNwaGVyZUdlb21ldHJ5KCByYWRpdXMsIHdpZHRoU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCBwaGlTdGFydCwgcGhpTGVuZ3RoLCB0aGV0YVN0YXJ0LCB0aGV0YUxlbmd0aCApIHtcblxuXHRHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1NwaGVyZUdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0cmFkaXVzOiByYWRpdXMsXG5cdFx0d2lkdGhTZWdtZW50czogd2lkdGhTZWdtZW50cyxcblx0XHRoZWlnaHRTZWdtZW50czogaGVpZ2h0U2VnbWVudHMsXG5cdFx0cGhpU3RhcnQ6IHBoaVN0YXJ0LFxuXHRcdHBoaUxlbmd0aDogcGhpTGVuZ3RoLFxuXHRcdHRoZXRhU3RhcnQ6IHRoZXRhU3RhcnQsXG5cdFx0dGhldGFMZW5ndGg6IHRoZXRhTGVuZ3RoXG5cdH07XG5cblx0dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIG5ldyBTcGhlcmVCdWZmZXJHZW9tZXRyeSggcmFkaXVzLCB3aWR0aFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgcGhpU3RhcnQsIHBoaUxlbmd0aCwgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKSApO1xuXHR0aGlzLm1lcmdlVmVydGljZXMoKTtcblxufVxuXG5TcGhlcmVHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBHZW9tZXRyeS5wcm90b3R5cGUgKTtcblNwaGVyZUdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFNwaGVyZUdlb21ldHJ5O1xuXG4vLyBTcGhlcmVCdWZmZXJHZW9tZXRyeVxuXG5mdW5jdGlvbiBTcGhlcmVCdWZmZXJHZW9tZXRyeSggcmFkaXVzLCB3aWR0aFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgcGhpU3RhcnQsIHBoaUxlbmd0aCwgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKSB7XG5cblx0QnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdTcGhlcmVCdWZmZXJHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdHdpZHRoU2VnbWVudHM6IHdpZHRoU2VnbWVudHMsXG5cdFx0aGVpZ2h0U2VnbWVudHM6IGhlaWdodFNlZ21lbnRzLFxuXHRcdHBoaVN0YXJ0OiBwaGlTdGFydCxcblx0XHRwaGlMZW5ndGg6IHBoaUxlbmd0aCxcblx0XHR0aGV0YVN0YXJ0OiB0aGV0YVN0YXJ0LFxuXHRcdHRoZXRhTGVuZ3RoOiB0aGV0YUxlbmd0aFxuXHR9O1xuXG5cdHJhZGl1cyA9IHJhZGl1cyB8fCA1MDtcblxuXHR3aWR0aFNlZ21lbnRzID0gTWF0aC5tYXgoIDMsIE1hdGguZmxvb3IoIHdpZHRoU2VnbWVudHMgKSB8fCA4ICk7XG5cdGhlaWdodFNlZ21lbnRzID0gTWF0aC5tYXgoIDIsIE1hdGguZmxvb3IoIGhlaWdodFNlZ21lbnRzICkgfHwgNiApO1xuXG5cdHBoaVN0YXJ0ID0gcGhpU3RhcnQgIT09IHVuZGVmaW5lZCA/IHBoaVN0YXJ0IDogMDtcblx0cGhpTGVuZ3RoID0gcGhpTGVuZ3RoICE9PSB1bmRlZmluZWQgPyBwaGlMZW5ndGggOiBNYXRoLlBJICogMjtcblxuXHR0aGV0YVN0YXJ0ID0gdGhldGFTdGFydCAhPT0gdW5kZWZpbmVkID8gdGhldGFTdGFydCA6IDA7XG5cdHRoZXRhTGVuZ3RoID0gdGhldGFMZW5ndGggIT09IHVuZGVmaW5lZCA/IHRoZXRhTGVuZ3RoIDogTWF0aC5QSTtcblxuXHR2YXIgdGhldGFFbmQgPSB0aGV0YVN0YXJ0ICsgdGhldGFMZW5ndGg7XG5cblx0dmFyIGl4LCBpeTtcblxuXHR2YXIgaW5kZXggPSAwO1xuXHR2YXIgZ3JpZCA9IFtdO1xuXG5cdHZhciB2ZXJ0ZXggPSBuZXcgVmVjdG9yMygpO1xuXHR2YXIgbm9ybWFsID0gbmV3IFZlY3RvcjMoKTtcblxuXHQvLyBidWZmZXJzXG5cblx0dmFyIGluZGljZXMgPSBbXTtcblx0dmFyIHZlcnRpY2VzID0gW107XG5cdHZhciBub3JtYWxzID0gW107XG5cdHZhciB1dnMgPSBbXTtcblxuXHQvLyBnZW5lcmF0ZSB2ZXJ0aWNlcywgbm9ybWFscyBhbmQgdXZzXG5cblx0Zm9yICggaXkgPSAwOyBpeSA8PSBoZWlnaHRTZWdtZW50czsgaXkgKysgKSB7XG5cblx0XHR2YXIgdmVydGljZXNSb3cgPSBbXTtcblxuXHRcdHZhciB2ID0gaXkgLyBoZWlnaHRTZWdtZW50cztcblxuXHRcdGZvciAoIGl4ID0gMDsgaXggPD0gd2lkdGhTZWdtZW50czsgaXggKysgKSB7XG5cblx0XHRcdHZhciB1ID0gaXggLyB3aWR0aFNlZ21lbnRzO1xuXG5cdFx0XHQvLyB2ZXJ0ZXhcblxuXHRcdFx0dmVydGV4LnggPSAtIHJhZGl1cyAqIE1hdGguY29zKCBwaGlTdGFydCArIHUgKiBwaGlMZW5ndGggKSAqIE1hdGguc2luKCB0aGV0YVN0YXJ0ICsgdiAqIHRoZXRhTGVuZ3RoICk7XG5cdFx0XHR2ZXJ0ZXgueSA9IHJhZGl1cyAqIE1hdGguY29zKCB0aGV0YVN0YXJ0ICsgdiAqIHRoZXRhTGVuZ3RoICk7XG5cdFx0XHR2ZXJ0ZXgueiA9IHJhZGl1cyAqIE1hdGguc2luKCBwaGlTdGFydCArIHUgKiBwaGlMZW5ndGggKSAqIE1hdGguc2luKCB0aGV0YVN0YXJ0ICsgdiAqIHRoZXRhTGVuZ3RoICk7XG5cblx0XHRcdHZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTtcblxuXHRcdFx0Ly8gbm9ybWFsXG5cblx0XHRcdG5vcm1hbC5zZXQoIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKS5ub3JtYWxpemUoKTtcblx0XHRcdG5vcm1hbHMucHVzaCggbm9ybWFsLngsIG5vcm1hbC55LCBub3JtYWwueiApO1xuXG5cdFx0XHQvLyB1dlxuXG5cdFx0XHR1dnMucHVzaCggdSwgMSAtIHYgKTtcblxuXHRcdFx0dmVydGljZXNSb3cucHVzaCggaW5kZXggKysgKTtcblxuXHRcdH1cblxuXHRcdGdyaWQucHVzaCggdmVydGljZXNSb3cgKTtcblxuXHR9XG5cblx0Ly8gaW5kaWNlc1xuXG5cdGZvciAoIGl5ID0gMDsgaXkgPCBoZWlnaHRTZWdtZW50czsgaXkgKysgKSB7XG5cblx0XHRmb3IgKCBpeCA9IDA7IGl4IDwgd2lkdGhTZWdtZW50czsgaXggKysgKSB7XG5cblx0XHRcdHZhciBhID0gZ3JpZFsgaXkgXVsgaXggKyAxIF07XG5cdFx0XHR2YXIgYiA9IGdyaWRbIGl5IF1bIGl4IF07XG5cdFx0XHR2YXIgYyA9IGdyaWRbIGl5ICsgMSBdWyBpeCBdO1xuXHRcdFx0dmFyIGQgPSBncmlkWyBpeSArIDEgXVsgaXggKyAxIF07XG5cblx0XHRcdGlmICggaXkgIT09IDAgfHwgdGhldGFTdGFydCA+IDAgKSBpbmRpY2VzLnB1c2goIGEsIGIsIGQgKTtcblx0XHRcdGlmICggaXkgIT09IGhlaWdodFNlZ21lbnRzIC0gMSB8fCB0aGV0YUVuZCA8IE1hdGguUEkgKSBpbmRpY2VzLnB1c2goIGIsIGMsIGQgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gYnVpbGQgZ2VvbWV0cnlcblxuXHR0aGlzLnNldEluZGV4KCBpbmRpY2VzICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBub3JtYWxzLCAzICkgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICd1dicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB1dnMsIDIgKSApO1xuXG59XG5cblNwaGVyZUJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApO1xuU3BoZXJlQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU3BoZXJlQnVmZmVyR2VvbWV0cnk7XG5cbi8qKlxuICogQGF1dGhvciBLYWxlYiBNdXJwaHlcbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKi9cblxuLy8gUmluZ0dlb21ldHJ5XG5cbmZ1bmN0aW9uIFJpbmdHZW9tZXRyeSggaW5uZXJSYWRpdXMsIG91dGVyUmFkaXVzLCB0aGV0YVNlZ21lbnRzLCBwaGlTZWdtZW50cywgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKSB7XG5cblx0R2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdSaW5nR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRpbm5lclJhZGl1czogaW5uZXJSYWRpdXMsXG5cdFx0b3V0ZXJSYWRpdXM6IG91dGVyUmFkaXVzLFxuXHRcdHRoZXRhU2VnbWVudHM6IHRoZXRhU2VnbWVudHMsXG5cdFx0cGhpU2VnbWVudHM6IHBoaVNlZ21lbnRzLFxuXHRcdHRoZXRhU3RhcnQ6IHRoZXRhU3RhcnQsXG5cdFx0dGhldGFMZW5ndGg6IHRoZXRhTGVuZ3RoXG5cdH07XG5cblx0dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIG5ldyBSaW5nQnVmZmVyR2VvbWV0cnkoIGlubmVyUmFkaXVzLCBvdXRlclJhZGl1cywgdGhldGFTZWdtZW50cywgcGhpU2VnbWVudHMsIHRoZXRhU3RhcnQsIHRoZXRhTGVuZ3RoICkgKTtcblx0dGhpcy5tZXJnZVZlcnRpY2VzKCk7XG5cbn1cblxuUmluZ0dlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEdlb21ldHJ5LnByb3RvdHlwZSApO1xuUmluZ0dlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFJpbmdHZW9tZXRyeTtcblxuLy8gUmluZ0J1ZmZlckdlb21ldHJ5XG5cbmZ1bmN0aW9uIFJpbmdCdWZmZXJHZW9tZXRyeSggaW5uZXJSYWRpdXMsIG91dGVyUmFkaXVzLCB0aGV0YVNlZ21lbnRzLCBwaGlTZWdtZW50cywgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKSB7XG5cblx0QnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdSaW5nQnVmZmVyR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRpbm5lclJhZGl1czogaW5uZXJSYWRpdXMsXG5cdFx0b3V0ZXJSYWRpdXM6IG91dGVyUmFkaXVzLFxuXHRcdHRoZXRhU2VnbWVudHM6IHRoZXRhU2VnbWVudHMsXG5cdFx0cGhpU2VnbWVudHM6IHBoaVNlZ21lbnRzLFxuXHRcdHRoZXRhU3RhcnQ6IHRoZXRhU3RhcnQsXG5cdFx0dGhldGFMZW5ndGg6IHRoZXRhTGVuZ3RoXG5cdH07XG5cblx0aW5uZXJSYWRpdXMgPSBpbm5lclJhZGl1cyB8fCAyMDtcblx0b3V0ZXJSYWRpdXMgPSBvdXRlclJhZGl1cyB8fCA1MDtcblxuXHR0aGV0YVN0YXJ0ID0gdGhldGFTdGFydCAhPT0gdW5kZWZpbmVkID8gdGhldGFTdGFydCA6IDA7XG5cdHRoZXRhTGVuZ3RoID0gdGhldGFMZW5ndGggIT09IHVuZGVmaW5lZCA/IHRoZXRhTGVuZ3RoIDogTWF0aC5QSSAqIDI7XG5cblx0dGhldGFTZWdtZW50cyA9IHRoZXRhU2VnbWVudHMgIT09IHVuZGVmaW5lZCA/IE1hdGgubWF4KCAzLCB0aGV0YVNlZ21lbnRzICkgOiA4O1xuXHRwaGlTZWdtZW50cyA9IHBoaVNlZ21lbnRzICE9PSB1bmRlZmluZWQgPyBNYXRoLm1heCggMSwgcGhpU2VnbWVudHMgKSA6IDE7XG5cblx0Ly8gYnVmZmVyc1xuXG5cdHZhciBpbmRpY2VzID0gW107XG5cdHZhciB2ZXJ0aWNlcyA9IFtdO1xuXHR2YXIgbm9ybWFscyA9IFtdO1xuXHR2YXIgdXZzID0gW107XG5cblx0Ly8gc29tZSBoZWxwZXIgdmFyaWFibGVzXG5cblx0dmFyIHNlZ21lbnQ7XG5cdHZhciByYWRpdXMgPSBpbm5lclJhZGl1cztcblx0dmFyIHJhZGl1c1N0ZXAgPSAoICggb3V0ZXJSYWRpdXMgLSBpbm5lclJhZGl1cyApIC8gcGhpU2VnbWVudHMgKTtcblx0dmFyIHZlcnRleCA9IG5ldyBWZWN0b3IzKCk7XG5cdHZhciB1diA9IG5ldyBWZWN0b3IyKCk7XG5cdHZhciBqLCBpO1xuXG5cdC8vIGdlbmVyYXRlIHZlcnRpY2VzLCBub3JtYWxzIGFuZCB1dnNcblxuXHRmb3IgKCBqID0gMDsgaiA8PSBwaGlTZWdtZW50czsgaiArKyApIHtcblxuXHRcdGZvciAoIGkgPSAwOyBpIDw9IHRoZXRhU2VnbWVudHM7IGkgKysgKSB7XG5cblx0XHRcdC8vIHZhbHVlcyBhcmUgZ2VuZXJhdGUgZnJvbSB0aGUgaW5zaWRlIG9mIHRoZSByaW5nIHRvIHRoZSBvdXRzaWRlXG5cblx0XHRcdHNlZ21lbnQgPSB0aGV0YVN0YXJ0ICsgaSAvIHRoZXRhU2VnbWVudHMgKiB0aGV0YUxlbmd0aDtcblxuXHRcdFx0Ly8gdmVydGV4XG5cblx0XHRcdHZlcnRleC54ID0gcmFkaXVzICogTWF0aC5jb3MoIHNlZ21lbnQgKTtcblx0XHRcdHZlcnRleC55ID0gcmFkaXVzICogTWF0aC5zaW4oIHNlZ21lbnQgKTtcblxuXHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0XHQvLyBub3JtYWxcblxuXHRcdFx0bm9ybWFscy5wdXNoKCAwLCAwLCAxICk7XG5cblx0XHRcdC8vIHV2XG5cblx0XHRcdHV2LnggPSAoIHZlcnRleC54IC8gb3V0ZXJSYWRpdXMgKyAxICkgLyAyO1xuXHRcdFx0dXYueSA9ICggdmVydGV4LnkgLyBvdXRlclJhZGl1cyArIDEgKSAvIDI7XG5cblx0XHRcdHV2cy5wdXNoKCB1di54LCB1di55ICk7XG5cblx0XHR9XG5cblx0XHQvLyBpbmNyZWFzZSB0aGUgcmFkaXVzIGZvciBuZXh0IHJvdyBvZiB2ZXJ0aWNlc1xuXG5cdFx0cmFkaXVzICs9IHJhZGl1c1N0ZXA7XG5cblx0fVxuXG5cdC8vIGluZGljZXNcblxuXHRmb3IgKCBqID0gMDsgaiA8IHBoaVNlZ21lbnRzOyBqICsrICkge1xuXG5cdFx0dmFyIHRoZXRhU2VnbWVudExldmVsID0gaiAqICggdGhldGFTZWdtZW50cyArIDEgKTtcblxuXHRcdGZvciAoIGkgPSAwOyBpIDwgdGhldGFTZWdtZW50czsgaSArKyApIHtcblxuXHRcdFx0c2VnbWVudCA9IGkgKyB0aGV0YVNlZ21lbnRMZXZlbDtcblxuXHRcdFx0dmFyIGEgPSBzZWdtZW50O1xuXHRcdFx0dmFyIGIgPSBzZWdtZW50ICsgdGhldGFTZWdtZW50cyArIDE7XG5cdFx0XHR2YXIgYyA9IHNlZ21lbnQgKyB0aGV0YVNlZ21lbnRzICsgMjtcblx0XHRcdHZhciBkID0gc2VnbWVudCArIDE7XG5cblx0XHRcdC8vIGZhY2VzXG5cblx0XHRcdGluZGljZXMucHVzaCggYSwgYiwgZCApO1xuXHRcdFx0aW5kaWNlcy5wdXNoKCBiLCBjLCBkICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIGJ1aWxkIGdlb21ldHJ5XG5cblx0dGhpcy5zZXRJbmRleCggaW5kaWNlcyApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICdub3JtYWwnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbm9ybWFscywgMyApICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAyICkgKTtcblxufVxuXG5SaW5nQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7XG5SaW5nQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUmluZ0J1ZmZlckdlb21ldHJ5O1xuXG4vKipcbiAqIEBhdXRob3IgYXN0cm9kdWQgLyBodHRwOi8vYXN0cm9kdWQuaXNncmVhdC5vcmcvXG4gKiBAYXV0aG9yIHp6ODUgLyBodHRwczovL2dpdGh1Yi5jb20veno4NVxuICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pb1xuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqL1xuXG4vLyBMYXRoZUdlb21ldHJ5XG5cbmZ1bmN0aW9uIExhdGhlR2VvbWV0cnkoIHBvaW50cywgc2VnbWVudHMsIHBoaVN0YXJ0LCBwaGlMZW5ndGggKSB7XG5cblx0R2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdMYXRoZUdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0cG9pbnRzOiBwb2ludHMsXG5cdFx0c2VnbWVudHM6IHNlZ21lbnRzLFxuXHRcdHBoaVN0YXJ0OiBwaGlTdGFydCxcblx0XHRwaGlMZW5ndGg6IHBoaUxlbmd0aFxuXHR9O1xuXG5cdHRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgTGF0aGVCdWZmZXJHZW9tZXRyeSggcG9pbnRzLCBzZWdtZW50cywgcGhpU3RhcnQsIHBoaUxlbmd0aCApICk7XG5cdHRoaXMubWVyZ2VWZXJ0aWNlcygpO1xuXG59XG5cbkxhdGhlR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7XG5MYXRoZUdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IExhdGhlR2VvbWV0cnk7XG5cbi8vIExhdGhlQnVmZmVyR2VvbWV0cnlcblxuZnVuY3Rpb24gTGF0aGVCdWZmZXJHZW9tZXRyeSggcG9pbnRzLCBzZWdtZW50cywgcGhpU3RhcnQsIHBoaUxlbmd0aCApIHtcblxuXHRCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0xhdGhlQnVmZmVyR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRwb2ludHM6IHBvaW50cyxcblx0XHRzZWdtZW50czogc2VnbWVudHMsXG5cdFx0cGhpU3RhcnQ6IHBoaVN0YXJ0LFxuXHRcdHBoaUxlbmd0aDogcGhpTGVuZ3RoXG5cdH07XG5cblx0c2VnbWVudHMgPSBNYXRoLmZsb29yKCBzZWdtZW50cyApIHx8IDEyO1xuXHRwaGlTdGFydCA9IHBoaVN0YXJ0IHx8IDA7XG5cdHBoaUxlbmd0aCA9IHBoaUxlbmd0aCB8fCBNYXRoLlBJICogMjtcblxuXHQvLyBjbGFtcCBwaGlMZW5ndGggc28gaXQncyBpbiByYW5nZSBvZiBbIDAsIDJQSSBdXG5cblx0cGhpTGVuZ3RoID0gX01hdGguY2xhbXAoIHBoaUxlbmd0aCwgMCwgTWF0aC5QSSAqIDIgKTtcblxuXG5cdC8vIGJ1ZmZlcnNcblxuXHR2YXIgaW5kaWNlcyA9IFtdO1xuXHR2YXIgdmVydGljZXMgPSBbXTtcblx0dmFyIHV2cyA9IFtdO1xuXG5cdC8vIGhlbHBlciB2YXJpYWJsZXNcblxuXHR2YXIgYmFzZTtcblx0dmFyIGludmVyc2VTZWdtZW50cyA9IDEuMCAvIHNlZ21lbnRzO1xuXHR2YXIgdmVydGV4ID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIHV2ID0gbmV3IFZlY3RvcjIoKTtcblx0dmFyIGksIGo7XG5cblx0Ly8gZ2VuZXJhdGUgdmVydGljZXMgYW5kIHV2c1xuXG5cdGZvciAoIGkgPSAwOyBpIDw9IHNlZ21lbnRzOyBpICsrICkge1xuXG5cdFx0dmFyIHBoaSA9IHBoaVN0YXJ0ICsgaSAqIGludmVyc2VTZWdtZW50cyAqIHBoaUxlbmd0aDtcblxuXHRcdHZhciBzaW4gPSBNYXRoLnNpbiggcGhpICk7XG5cdFx0dmFyIGNvcyA9IE1hdGguY29zKCBwaGkgKTtcblxuXHRcdGZvciAoIGogPSAwOyBqIDw9ICggcG9pbnRzLmxlbmd0aCAtIDEgKTsgaiArKyApIHtcblxuXHRcdFx0Ly8gdmVydGV4XG5cblx0XHRcdHZlcnRleC54ID0gcG9pbnRzWyBqIF0ueCAqIHNpbjtcblx0XHRcdHZlcnRleC55ID0gcG9pbnRzWyBqIF0ueTtcblx0XHRcdHZlcnRleC56ID0gcG9pbnRzWyBqIF0ueCAqIGNvcztcblxuXHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0XHQvLyB1dlxuXG5cdFx0XHR1di54ID0gaSAvIHNlZ21lbnRzO1xuXHRcdFx0dXYueSA9IGogLyAoIHBvaW50cy5sZW5ndGggLSAxICk7XG5cblx0XHRcdHV2cy5wdXNoKCB1di54LCB1di55ICk7XG5cblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gaW5kaWNlc1xuXG5cdGZvciAoIGkgPSAwOyBpIDwgc2VnbWVudHM7IGkgKysgKSB7XG5cblx0XHRmb3IgKCBqID0gMDsgaiA8ICggcG9pbnRzLmxlbmd0aCAtIDEgKTsgaiArKyApIHtcblxuXHRcdFx0YmFzZSA9IGogKyBpICogcG9pbnRzLmxlbmd0aDtcblxuXHRcdFx0dmFyIGEgPSBiYXNlO1xuXHRcdFx0dmFyIGIgPSBiYXNlICsgcG9pbnRzLmxlbmd0aDtcblx0XHRcdHZhciBjID0gYmFzZSArIHBvaW50cy5sZW5ndGggKyAxO1xuXHRcdFx0dmFyIGQgPSBiYXNlICsgMTtcblxuXHRcdFx0Ly8gZmFjZXNcblxuXHRcdFx0aW5kaWNlcy5wdXNoKCBhLCBiLCBkICk7XG5cdFx0XHRpbmRpY2VzLnB1c2goIGIsIGMsIGQgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gYnVpbGQgZ2VvbWV0cnlcblxuXHR0aGlzLnNldEluZGV4KCBpbmRpY2VzICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2cywgMiApICk7XG5cblx0Ly8gZ2VuZXJhdGUgbm9ybWFsc1xuXG5cdHRoaXMuY29tcHV0ZVZlcnRleE5vcm1hbHMoKTtcblxuXHQvLyBpZiB0aGUgZ2VvbWV0cnkgaXMgY2xvc2VkLCB3ZSBuZWVkIHRvIGF2ZXJhZ2UgdGhlIG5vcm1hbHMgYWxvbmcgdGhlIHNlYW0uXG5cdC8vIGJlY2F1c2UgdGhlIGNvcnJlc3BvbmRpbmcgdmVydGljZXMgYXJlIGlkZW50aWNhbCAoYnV0IHN0aWxsIGhhdmUgZGlmZmVyZW50IFVWcykuXG5cblx0aWYgKCBwaGlMZW5ndGggPT09IE1hdGguUEkgKiAyICkge1xuXG5cdFx0dmFyIG5vcm1hbHMgPSB0aGlzLmF0dHJpYnV0ZXMubm9ybWFsLmFycmF5O1xuXHRcdHZhciBuMSA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIG4yID0gbmV3IFZlY3RvcjMoKTtcblx0XHR2YXIgbiA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHQvLyB0aGlzIGlzIHRoZSBidWZmZXIgb2Zmc2V0IGZvciB0aGUgbGFzdCBsaW5lIG9mIHZlcnRpY2VzXG5cblx0XHRiYXNlID0gc2VnbWVudHMgKiBwb2ludHMubGVuZ3RoICogMztcblxuXHRcdGZvciAoIGkgPSAwLCBqID0gMDsgaSA8IHBvaW50cy5sZW5ndGg7IGkgKyssIGogKz0gMyApIHtcblxuXHRcdFx0Ly8gc2VsZWN0IHRoZSBub3JtYWwgb2YgdGhlIHZlcnRleCBpbiB0aGUgZmlyc3QgbGluZVxuXG5cdFx0XHRuMS54ID0gbm9ybWFsc1sgaiArIDAgXTtcblx0XHRcdG4xLnkgPSBub3JtYWxzWyBqICsgMSBdO1xuXHRcdFx0bjEueiA9IG5vcm1hbHNbIGogKyAyIF07XG5cblx0XHRcdC8vIHNlbGVjdCB0aGUgbm9ybWFsIG9mIHRoZSB2ZXJ0ZXggaW4gdGhlIGxhc3QgbGluZVxuXG5cdFx0XHRuMi54ID0gbm9ybWFsc1sgYmFzZSArIGogKyAwIF07XG5cdFx0XHRuMi55ID0gbm9ybWFsc1sgYmFzZSArIGogKyAxIF07XG5cdFx0XHRuMi56ID0gbm9ybWFsc1sgYmFzZSArIGogKyAyIF07XG5cblx0XHRcdC8vIGF2ZXJhZ2Ugbm9ybWFsc1xuXG5cdFx0XHRuLmFkZFZlY3RvcnMoIG4xLCBuMiApLm5vcm1hbGl6ZSgpO1xuXG5cdFx0XHQvLyBhc3NpZ24gdGhlIG5ldyB2YWx1ZXMgdG8gYm90aCBub3JtYWxzXG5cblx0XHRcdG5vcm1hbHNbIGogKyAwIF0gPSBub3JtYWxzWyBiYXNlICsgaiArIDAgXSA9IG4ueDtcblx0XHRcdG5vcm1hbHNbIGogKyAxIF0gPSBub3JtYWxzWyBiYXNlICsgaiArIDEgXSA9IG4ueTtcblx0XHRcdG5vcm1hbHNbIGogKyAyIF0gPSBub3JtYWxzWyBiYXNlICsgaiArIDIgXSA9IG4uejtcblxuXHRcdH1cblxuXHR9XG5cbn1cblxuTGF0aGVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTtcbkxhdGhlQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTGF0aGVCdWZmZXJHZW9tZXRyeTtcblxuLyoqXG4gKiBAYXV0aG9yIGpvbm9icjEgLyBodHRwOi8vam9ub2JyMS5jb21cbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKi9cblxuLy8gU2hhcGVHZW9tZXRyeVxuXG5mdW5jdGlvbiBTaGFwZUdlb21ldHJ5KCBzaGFwZXMsIGN1cnZlU2VnbWVudHMgKSB7XG5cblx0R2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdTaGFwZUdlb21ldHJ5JztcblxuXHRpZiAoIHR5cGVvZiBjdXJ2ZVNlZ21lbnRzID09PSAnb2JqZWN0JyApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlNoYXBlR2VvbWV0cnk6IE9wdGlvbnMgcGFyYW1ldGVyIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdFx0Y3VydmVTZWdtZW50cyA9IGN1cnZlU2VnbWVudHMuY3VydmVTZWdtZW50cztcblxuXHR9XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHNoYXBlczogc2hhcGVzLFxuXHRcdGN1cnZlU2VnbWVudHM6IGN1cnZlU2VnbWVudHNcblx0fTtcblxuXHR0aGlzLmZyb21CdWZmZXJHZW9tZXRyeSggbmV3IFNoYXBlQnVmZmVyR2VvbWV0cnkoIHNoYXBlcywgY3VydmVTZWdtZW50cyApICk7XG5cdHRoaXMubWVyZ2VWZXJ0aWNlcygpO1xuXG59XG5cblNoYXBlR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7XG5TaGFwZUdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFNoYXBlR2VvbWV0cnk7XG5cbi8vIFNoYXBlQnVmZmVyR2VvbWV0cnlcblxuZnVuY3Rpb24gU2hhcGVCdWZmZXJHZW9tZXRyeSggc2hhcGVzLCBjdXJ2ZVNlZ21lbnRzICkge1xuXG5cdEJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnU2hhcGVCdWZmZXJHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHNoYXBlczogc2hhcGVzLFxuXHRcdGN1cnZlU2VnbWVudHM6IGN1cnZlU2VnbWVudHNcblx0fTtcblxuXHRjdXJ2ZVNlZ21lbnRzID0gY3VydmVTZWdtZW50cyB8fCAxMjtcblxuXHQvLyBidWZmZXJzXG5cblx0dmFyIGluZGljZXMgPSBbXTtcblx0dmFyIHZlcnRpY2VzID0gW107XG5cdHZhciBub3JtYWxzID0gW107XG5cdHZhciB1dnMgPSBbXTtcblxuXHQvLyBoZWxwZXIgdmFyaWFibGVzXG5cblx0dmFyIGdyb3VwU3RhcnQgPSAwO1xuXHR2YXIgZ3JvdXBDb3VudCA9IDA7XG5cblx0Ly8gYWxsb3cgc2luZ2xlIGFuZCBhcnJheSB2YWx1ZXMgZm9yIFwic2hhcGVzXCIgcGFyYW1ldGVyXG5cblx0aWYgKCBBcnJheS5pc0FycmF5KCBzaGFwZXMgKSA9PT0gZmFsc2UgKSB7XG5cblx0XHRhZGRTaGFwZSggc2hhcGVzICk7XG5cblx0fSBlbHNlIHtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IHNoYXBlcy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdGFkZFNoYXBlKCBzaGFwZXNbIGkgXSApO1xuXG5cdFx0XHR0aGlzLmFkZEdyb3VwKCBncm91cFN0YXJ0LCBncm91cENvdW50LCBpICk7IC8vIGVuYWJsZXMgTXVsdGlNYXRlcmlhbCBzdXBwb3J0XG5cblx0XHRcdGdyb3VwU3RhcnQgKz0gZ3JvdXBDb3VudDtcblx0XHRcdGdyb3VwQ291bnQgPSAwO1xuXG5cdFx0fVxuXG5cdH1cblxuXHQvLyBidWlsZCBnZW9tZXRyeVxuXG5cdHRoaXMuc2V0SW5kZXgoIGluZGljZXMgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIG5vcm1hbHMsIDMgKSApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2cywgMiApICk7XG5cblxuXHQvLyBoZWxwZXIgZnVuY3Rpb25zXG5cblx0ZnVuY3Rpb24gYWRkU2hhcGUoIHNoYXBlICkge1xuXG5cdFx0dmFyIGksIGwsIHNoYXBlSG9sZTtcblxuXHRcdHZhciBpbmRleE9mZnNldCA9IHZlcnRpY2VzLmxlbmd0aCAvIDM7XG5cdFx0dmFyIHBvaW50cyA9IHNoYXBlLmV4dHJhY3RQb2ludHMoIGN1cnZlU2VnbWVudHMgKTtcblxuXHRcdHZhciBzaGFwZVZlcnRpY2VzID0gcG9pbnRzLnNoYXBlO1xuXHRcdHZhciBzaGFwZUhvbGVzID0gcG9pbnRzLmhvbGVzO1xuXG5cdFx0Ly8gY2hlY2sgZGlyZWN0aW9uIG9mIHZlcnRpY2VzXG5cblx0XHRpZiAoIFNoYXBlVXRpbHMuaXNDbG9ja1dpc2UoIHNoYXBlVmVydGljZXMgKSA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdHNoYXBlVmVydGljZXMgPSBzaGFwZVZlcnRpY2VzLnJldmVyc2UoKTtcblxuXHRcdFx0Ly8gYWxzbyBjaGVjayBpZiBob2xlcyBhcmUgaW4gdGhlIG9wcG9zaXRlIGRpcmVjdGlvblxuXG5cdFx0XHRmb3IgKCBpID0gMCwgbCA9IHNoYXBlSG9sZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRzaGFwZUhvbGUgPSBzaGFwZUhvbGVzWyBpIF07XG5cblx0XHRcdFx0aWYgKCBTaGFwZVV0aWxzLmlzQ2xvY2tXaXNlKCBzaGFwZUhvbGUgKSA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0XHRcdHNoYXBlSG9sZXNbIGkgXSA9IHNoYXBlSG9sZS5yZXZlcnNlKCk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHR2YXIgZmFjZXMgPSBTaGFwZVV0aWxzLnRyaWFuZ3VsYXRlU2hhcGUoIHNoYXBlVmVydGljZXMsIHNoYXBlSG9sZXMgKTtcblxuXHRcdC8vIGpvaW4gdmVydGljZXMgb2YgaW5uZXIgYW5kIG91dGVyIHBhdGhzIHRvIGEgc2luZ2xlIGFycmF5XG5cblx0XHRmb3IgKCBpID0gMCwgbCA9IHNoYXBlSG9sZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0c2hhcGVIb2xlID0gc2hhcGVIb2xlc1sgaSBdO1xuXHRcdFx0c2hhcGVWZXJ0aWNlcyA9IHNoYXBlVmVydGljZXMuY29uY2F0KCBzaGFwZUhvbGUgKTtcblxuXHRcdH1cblxuXHRcdC8vIHZlcnRpY2VzLCBub3JtYWxzLCB1dnNcblxuXHRcdGZvciAoIGkgPSAwLCBsID0gc2hhcGVWZXJ0aWNlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgdmVydGV4ID0gc2hhcGVWZXJ0aWNlc1sgaSBdO1xuXG5cdFx0XHR2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIDAgKTtcblx0XHRcdG5vcm1hbHMucHVzaCggMCwgMCwgMSApO1xuXHRcdFx0dXZzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSApOyAvLyB3b3JsZCB1dnNcblxuXHRcdH1cblxuXHRcdC8vIGluY2lkZXNcblxuXHRcdGZvciAoIGkgPSAwLCBsID0gZmFjZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGZhY2UgPSBmYWNlc1sgaSBdO1xuXG5cdFx0XHR2YXIgYSA9IGZhY2VbIDAgXSArIGluZGV4T2Zmc2V0O1xuXHRcdFx0dmFyIGIgPSBmYWNlWyAxIF0gKyBpbmRleE9mZnNldDtcblx0XHRcdHZhciBjID0gZmFjZVsgMiBdICsgaW5kZXhPZmZzZXQ7XG5cblx0XHRcdGluZGljZXMucHVzaCggYSwgYiwgYyApO1xuXHRcdFx0Z3JvdXBDb3VudCArPSAzO1xuXG5cdFx0fVxuXG5cdH1cblxufVxuXG5TaGFwZUJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApO1xuU2hhcGVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBTaGFwZUJ1ZmZlckdlb21ldHJ5O1xuXG4vKipcbiAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleVxuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqL1xuXG5mdW5jdGlvbiBFZGdlc0dlb21ldHJ5KCBnZW9tZXRyeSwgdGhyZXNob2xkQW5nbGUgKSB7XG5cblx0QnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdFZGdlc0dlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0dGhyZXNob2xkQW5nbGU6IHRocmVzaG9sZEFuZ2xlXG5cdH07XG5cblx0dGhyZXNob2xkQW5nbGUgPSAoIHRocmVzaG9sZEFuZ2xlICE9PSB1bmRlZmluZWQgKSA/IHRocmVzaG9sZEFuZ2xlIDogMTtcblxuXHQvLyBidWZmZXJcblxuXHR2YXIgdmVydGljZXMgPSBbXTtcblxuXHQvLyBoZWxwZXIgdmFyaWFibGVzXG5cblx0dmFyIHRocmVzaG9sZERvdCA9IE1hdGguY29zKCBfTWF0aC5ERUcyUkFEICogdGhyZXNob2xkQW5nbGUgKTtcblx0dmFyIGVkZ2UgPSBbIDAsIDAgXSwgZWRnZXMgPSB7fSwgZWRnZTEsIGVkZ2UyO1xuXHR2YXIga2V5LCBrZXlzID0gWyAnYScsICdiJywgJ2MnIF07XG5cblx0Ly8gcHJlcGFyZSBzb3VyY2UgZ2VvbWV0cnlcblxuXHR2YXIgZ2VvbWV0cnkyO1xuXG5cdGlmICggZ2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSApIHtcblxuXHRcdGdlb21ldHJ5MiA9IG5ldyBHZW9tZXRyeSgpO1xuXHRcdGdlb21ldHJ5Mi5mcm9tQnVmZmVyR2VvbWV0cnkoIGdlb21ldHJ5ICk7XG5cblx0fSBlbHNlIHtcblxuXHRcdGdlb21ldHJ5MiA9IGdlb21ldHJ5LmNsb25lKCk7XG5cblx0fVxuXG5cdGdlb21ldHJ5Mi5tZXJnZVZlcnRpY2VzKCk7XG5cdGdlb21ldHJ5Mi5jb21wdXRlRmFjZU5vcm1hbHMoKTtcblxuXHR2YXIgc291cmNlVmVydGljZXMgPSBnZW9tZXRyeTIudmVydGljZXM7XG5cdHZhciBmYWNlcyA9IGdlb21ldHJ5Mi5mYWNlcztcblxuXHQvLyBub3cgY3JlYXRlIGEgZGF0YSBzdHJ1Y3R1cmUgd2hlcmUgZWFjaCBlbnRyeSByZXByZXNlbnRzIGFuIGVkZ2Ugd2l0aCBpdHMgYWRqb2luaW5nIGZhY2VzXG5cblx0Zm9yICggdmFyIGkgPSAwLCBsID0gZmFjZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdHZhciBmYWNlID0gZmFjZXNbIGkgXTtcblxuXHRcdGZvciAoIHZhciBqID0gMDsgaiA8IDM7IGogKysgKSB7XG5cblx0XHRcdGVkZ2UxID0gZmFjZVsga2V5c1sgaiBdIF07XG5cdFx0XHRlZGdlMiA9IGZhY2VbIGtleXNbICggaiArIDEgKSAlIDMgXSBdO1xuXHRcdFx0ZWRnZVsgMCBdID0gTWF0aC5taW4oIGVkZ2UxLCBlZGdlMiApO1xuXHRcdFx0ZWRnZVsgMSBdID0gTWF0aC5tYXgoIGVkZ2UxLCBlZGdlMiApO1xuXG5cdFx0XHRrZXkgPSBlZGdlWyAwIF0gKyAnLCcgKyBlZGdlWyAxIF07XG5cblx0XHRcdGlmICggZWRnZXNbIGtleSBdID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0ZWRnZXNbIGtleSBdID0geyBpbmRleDE6IGVkZ2VbIDAgXSwgaW5kZXgyOiBlZGdlWyAxIF0sIGZhY2UxOiBpLCBmYWNlMjogdW5kZWZpbmVkIH07XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0ZWRnZXNbIGtleSBdLmZhY2UyID0gaTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH1cblxuXHQvLyBnZW5lcmF0ZSB2ZXJ0aWNlc1xuXG5cdGZvciAoIGtleSBpbiBlZGdlcyApIHtcblxuXHRcdHZhciBlID0gZWRnZXNbIGtleSBdO1xuXG5cdFx0Ly8gYW4gZWRnZSBpcyBvbmx5IHJlbmRlcmVkIGlmIHRoZSBhbmdsZSAoaW4gZGVncmVlcykgYmV0d2VlbiB0aGUgZmFjZSBub3JtYWxzIG9mIHRoZSBhZGpvaW5pbmcgZmFjZXMgZXhjZWVkcyB0aGlzIHZhbHVlLiBkZWZhdWx0ID0gMSBkZWdyZWUuXG5cblx0XHRpZiAoIGUuZmFjZTIgPT09IHVuZGVmaW5lZCB8fCBmYWNlc1sgZS5mYWNlMSBdLm5vcm1hbC5kb3QoIGZhY2VzWyBlLmZhY2UyIF0ubm9ybWFsICkgPD0gdGhyZXNob2xkRG90ICkge1xuXG5cdFx0XHR2YXIgdmVydGV4ID0gc291cmNlVmVydGljZXNbIGUuaW5kZXgxIF07XG5cdFx0XHR2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7XG5cblx0XHRcdHZlcnRleCA9IHNvdXJjZVZlcnRpY2VzWyBlLmluZGV4MiBdO1xuXHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHQvLyBidWlsZCBnZW9tZXRyeVxuXG5cdHRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXG59XG5cbkVkZ2VzR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7XG5FZGdlc0dlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEVkZ2VzR2VvbWV0cnk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKi9cblxuLy8gQ3lsaW5kZXJHZW9tZXRyeVxuXG5mdW5jdGlvbiBDeWxpbmRlckdlb21ldHJ5KCByYWRpdXNUb3AsIHJhZGl1c0JvdHRvbSwgaGVpZ2h0LCByYWRpYWxTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIG9wZW5FbmRlZCwgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKSB7XG5cblx0R2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdDeWxpbmRlckdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0cmFkaXVzVG9wOiByYWRpdXNUb3AsXG5cdFx0cmFkaXVzQm90dG9tOiByYWRpdXNCb3R0b20sXG5cdFx0aGVpZ2h0OiBoZWlnaHQsXG5cdFx0cmFkaWFsU2VnbWVudHM6IHJhZGlhbFNlZ21lbnRzLFxuXHRcdGhlaWdodFNlZ21lbnRzOiBoZWlnaHRTZWdtZW50cyxcblx0XHRvcGVuRW5kZWQ6IG9wZW5FbmRlZCxcblx0XHR0aGV0YVN0YXJ0OiB0aGV0YVN0YXJ0LFxuXHRcdHRoZXRhTGVuZ3RoOiB0aGV0YUxlbmd0aFxuXHR9O1xuXG5cdHRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeSggcmFkaXVzVG9wLCByYWRpdXNCb3R0b20sIGhlaWdodCwgcmFkaWFsU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCBvcGVuRW5kZWQsIHRoZXRhU3RhcnQsIHRoZXRhTGVuZ3RoICkgKTtcblx0dGhpcy5tZXJnZVZlcnRpY2VzKCk7XG5cbn1cblxuQ3lsaW5kZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBHZW9tZXRyeS5wcm90b3R5cGUgKTtcbkN5bGluZGVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ3lsaW5kZXJHZW9tZXRyeTtcblxuLy8gQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeVxuXG5mdW5jdGlvbiBDeWxpbmRlckJ1ZmZlckdlb21ldHJ5KCByYWRpdXNUb3AsIHJhZGl1c0JvdHRvbSwgaGVpZ2h0LCByYWRpYWxTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIG9wZW5FbmRlZCwgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKSB7XG5cblx0QnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdDeWxpbmRlckJ1ZmZlckdlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0cmFkaXVzVG9wOiByYWRpdXNUb3AsXG5cdFx0cmFkaXVzQm90dG9tOiByYWRpdXNCb3R0b20sXG5cdFx0aGVpZ2h0OiBoZWlnaHQsXG5cdFx0cmFkaWFsU2VnbWVudHM6IHJhZGlhbFNlZ21lbnRzLFxuXHRcdGhlaWdodFNlZ21lbnRzOiBoZWlnaHRTZWdtZW50cyxcblx0XHRvcGVuRW5kZWQ6IG9wZW5FbmRlZCxcblx0XHR0aGV0YVN0YXJ0OiB0aGV0YVN0YXJ0LFxuXHRcdHRoZXRhTGVuZ3RoOiB0aGV0YUxlbmd0aFxuXHR9O1xuXG5cdHZhciBzY29wZSA9IHRoaXM7XG5cblx0cmFkaXVzVG9wID0gcmFkaXVzVG9wICE9PSB1bmRlZmluZWQgPyByYWRpdXNUb3AgOiAyMDtcblx0cmFkaXVzQm90dG9tID0gcmFkaXVzQm90dG9tICE9PSB1bmRlZmluZWQgPyByYWRpdXNCb3R0b20gOiAyMDtcblx0aGVpZ2h0ID0gaGVpZ2h0ICE9PSB1bmRlZmluZWQgPyBoZWlnaHQgOiAxMDA7XG5cblx0cmFkaWFsU2VnbWVudHMgPSBNYXRoLmZsb29yKCByYWRpYWxTZWdtZW50cyApIHx8IDg7XG5cdGhlaWdodFNlZ21lbnRzID0gTWF0aC5mbG9vciggaGVpZ2h0U2VnbWVudHMgKSB8fCAxO1xuXG5cdG9wZW5FbmRlZCA9IG9wZW5FbmRlZCAhPT0gdW5kZWZpbmVkID8gb3BlbkVuZGVkIDogZmFsc2U7XG5cdHRoZXRhU3RhcnQgPSB0aGV0YVN0YXJ0ICE9PSB1bmRlZmluZWQgPyB0aGV0YVN0YXJ0IDogMC4wO1xuXHR0aGV0YUxlbmd0aCA9IHRoZXRhTGVuZ3RoICE9PSB1bmRlZmluZWQgPyB0aGV0YUxlbmd0aCA6IDIuMCAqIE1hdGguUEk7XG5cblx0Ly8gYnVmZmVyc1xuXG5cdHZhciBpbmRpY2VzID0gW107XG5cdHZhciB2ZXJ0aWNlcyA9IFtdO1xuXHR2YXIgbm9ybWFscyA9IFtdO1xuXHR2YXIgdXZzID0gW107XG5cblx0Ly8gaGVscGVyIHZhcmlhYmxlc1xuXG5cdHZhciBpbmRleCA9IDA7XG5cdHZhciBpbmRleEFycmF5ID0gW107XG5cdHZhciBoYWxmSGVpZ2h0ID0gaGVpZ2h0IC8gMjtcblx0dmFyIGdyb3VwU3RhcnQgPSAwO1xuXG5cdC8vIGdlbmVyYXRlIGdlb21ldHJ5XG5cblx0Z2VuZXJhdGVUb3JzbygpO1xuXG5cdGlmICggb3BlbkVuZGVkID09PSBmYWxzZSApIHtcblxuXHRcdGlmICggcmFkaXVzVG9wID4gMCApIGdlbmVyYXRlQ2FwKCB0cnVlICk7XG5cdFx0aWYgKCByYWRpdXNCb3R0b20gPiAwICkgZ2VuZXJhdGVDYXAoIGZhbHNlICk7XG5cblx0fVxuXG5cdC8vIGJ1aWxkIGdlb21ldHJ5XG5cblx0dGhpcy5zZXRJbmRleCggaW5kaWNlcyApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICdub3JtYWwnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbm9ybWFscywgMyApICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAyICkgKTtcblxuXHRmdW5jdGlvbiBnZW5lcmF0ZVRvcnNvKCkge1xuXG5cdFx0dmFyIHgsIHk7XG5cdFx0dmFyIG5vcm1hbCA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIHZlcnRleCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR2YXIgZ3JvdXBDb3VudCA9IDA7XG5cblx0XHQvLyB0aGlzIHdpbGwgYmUgdXNlZCB0byBjYWxjdWxhdGUgdGhlIG5vcm1hbFxuXHRcdHZhciBzbG9wZSA9ICggcmFkaXVzQm90dG9tIC0gcmFkaXVzVG9wICkgLyBoZWlnaHQ7XG5cblx0XHQvLyBnZW5lcmF0ZSB2ZXJ0aWNlcywgbm9ybWFscyBhbmQgdXZzXG5cblx0XHRmb3IgKCB5ID0gMDsgeSA8PSBoZWlnaHRTZWdtZW50czsgeSArKyApIHtcblxuXHRcdFx0dmFyIGluZGV4Um93ID0gW107XG5cblx0XHRcdHZhciB2ID0geSAvIGhlaWdodFNlZ21lbnRzO1xuXG5cdFx0XHQvLyBjYWxjdWxhdGUgdGhlIHJhZGl1cyBvZiB0aGUgY3VycmVudCByb3dcblxuXHRcdFx0dmFyIHJhZGl1cyA9IHYgKiAoIHJhZGl1c0JvdHRvbSAtIHJhZGl1c1RvcCApICsgcmFkaXVzVG9wO1xuXG5cdFx0XHRmb3IgKCB4ID0gMDsgeCA8PSByYWRpYWxTZWdtZW50czsgeCArKyApIHtcblxuXHRcdFx0XHR2YXIgdSA9IHggLyByYWRpYWxTZWdtZW50cztcblxuXHRcdFx0XHR2YXIgdGhldGEgPSB1ICogdGhldGFMZW5ndGggKyB0aGV0YVN0YXJ0O1xuXG5cdFx0XHRcdHZhciBzaW5UaGV0YSA9IE1hdGguc2luKCB0aGV0YSApO1xuXHRcdFx0XHR2YXIgY29zVGhldGEgPSBNYXRoLmNvcyggdGhldGEgKTtcblxuXHRcdFx0XHQvLyB2ZXJ0ZXhcblxuXHRcdFx0XHR2ZXJ0ZXgueCA9IHJhZGl1cyAqIHNpblRoZXRhO1xuXHRcdFx0XHR2ZXJ0ZXgueSA9IC0gdiAqIGhlaWdodCArIGhhbGZIZWlnaHQ7XG5cdFx0XHRcdHZlcnRleC56ID0gcmFkaXVzICogY29zVGhldGE7XG5cdFx0XHRcdHZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTtcblxuXHRcdFx0XHQvLyBub3JtYWxcblxuXHRcdFx0XHRub3JtYWwuc2V0KCBzaW5UaGV0YSwgc2xvcGUsIGNvc1RoZXRhICkubm9ybWFsaXplKCk7XG5cdFx0XHRcdG5vcm1hbHMucHVzaCggbm9ybWFsLngsIG5vcm1hbC55LCBub3JtYWwueiApO1xuXG5cdFx0XHRcdC8vIHV2XG5cblx0XHRcdFx0dXZzLnB1c2goIHUsIDEgLSB2ICk7XG5cblx0XHRcdFx0Ly8gc2F2ZSBpbmRleCBvZiB2ZXJ0ZXggaW4gcmVzcGVjdGl2ZSByb3dcblxuXHRcdFx0XHRpbmRleFJvdy5wdXNoKCBpbmRleCArKyApO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIG5vdyBzYXZlIHZlcnRpY2VzIG9mIHRoZSByb3cgaW4gb3VyIGluZGV4IGFycmF5XG5cblx0XHRcdGluZGV4QXJyYXkucHVzaCggaW5kZXhSb3cgKTtcblxuXHRcdH1cblxuXHRcdC8vIGdlbmVyYXRlIGluZGljZXNcblxuXHRcdGZvciAoIHggPSAwOyB4IDwgcmFkaWFsU2VnbWVudHM7IHggKysgKSB7XG5cblx0XHRcdGZvciAoIHkgPSAwOyB5IDwgaGVpZ2h0U2VnbWVudHM7IHkgKysgKSB7XG5cblx0XHRcdFx0Ly8gd2UgdXNlIHRoZSBpbmRleCBhcnJheSB0byBhY2Nlc3MgdGhlIGNvcnJlY3QgaW5kaWNlc1xuXG5cdFx0XHRcdHZhciBhID0gaW5kZXhBcnJheVsgeSBdWyB4IF07XG5cdFx0XHRcdHZhciBiID0gaW5kZXhBcnJheVsgeSArIDEgXVsgeCBdO1xuXHRcdFx0XHR2YXIgYyA9IGluZGV4QXJyYXlbIHkgKyAxIF1bIHggKyAxIF07XG5cdFx0XHRcdHZhciBkID0gaW5kZXhBcnJheVsgeSBdWyB4ICsgMSBdO1xuXG5cdFx0XHRcdC8vIGZhY2VzXG5cblx0XHRcdFx0aW5kaWNlcy5wdXNoKCBhLCBiLCBkICk7XG5cdFx0XHRcdGluZGljZXMucHVzaCggYiwgYywgZCApO1xuXG5cdFx0XHRcdC8vIHVwZGF0ZSBncm91cCBjb3VudGVyXG5cblx0XHRcdFx0Z3JvdXBDb3VudCArPSA2O1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvLyBhZGQgYSBncm91cCB0byB0aGUgZ2VvbWV0cnkuIHRoaXMgd2lsbCBlbnN1cmUgbXVsdGkgbWF0ZXJpYWwgc3VwcG9ydFxuXG5cdFx0c2NvcGUuYWRkR3JvdXAoIGdyb3VwU3RhcnQsIGdyb3VwQ291bnQsIDAgKTtcblxuXHRcdC8vIGNhbGN1bGF0ZSBuZXcgc3RhcnQgdmFsdWUgZm9yIGdyb3Vwc1xuXG5cdFx0Z3JvdXBTdGFydCArPSBncm91cENvdW50O1xuXG5cdH1cblxuXHRmdW5jdGlvbiBnZW5lcmF0ZUNhcCggdG9wICkge1xuXG5cdFx0dmFyIHgsIGNlbnRlckluZGV4U3RhcnQsIGNlbnRlckluZGV4RW5kO1xuXG5cdFx0dmFyIHV2ID0gbmV3IFZlY3RvcjIoKTtcblx0XHR2YXIgdmVydGV4ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHZhciBncm91cENvdW50ID0gMDtcblxuXHRcdHZhciByYWRpdXMgPSAoIHRvcCA9PT0gdHJ1ZSApID8gcmFkaXVzVG9wIDogcmFkaXVzQm90dG9tO1xuXHRcdHZhciBzaWduID0gKCB0b3AgPT09IHRydWUgKSA/IDEgOiAtIDE7XG5cblx0XHQvLyBzYXZlIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgY2VudGVyIHZlcnRleFxuXHRcdGNlbnRlckluZGV4U3RhcnQgPSBpbmRleDtcblxuXHRcdC8vIGZpcnN0IHdlIGdlbmVyYXRlIHRoZSBjZW50ZXIgdmVydGV4IGRhdGEgb2YgdGhlIGNhcC5cblx0XHQvLyBiZWNhdXNlIHRoZSBnZW9tZXRyeSBuZWVkcyBvbmUgc2V0IG9mIHV2cyBwZXIgZmFjZSxcblx0XHQvLyB3ZSBtdXN0IGdlbmVyYXRlIGEgY2VudGVyIHZlcnRleCBwZXIgZmFjZS9zZWdtZW50XG5cblx0XHRmb3IgKCB4ID0gMTsgeCA8PSByYWRpYWxTZWdtZW50czsgeCArKyApIHtcblxuXHRcdFx0Ly8gdmVydGV4XG5cblx0XHRcdHZlcnRpY2VzLnB1c2goIDAsIGhhbGZIZWlnaHQgKiBzaWduLCAwICk7XG5cblx0XHRcdC8vIG5vcm1hbFxuXG5cdFx0XHRub3JtYWxzLnB1c2goIDAsIHNpZ24sIDAgKTtcblxuXHRcdFx0Ly8gdXZcblxuXHRcdFx0dXZzLnB1c2goIDAuNSwgMC41ICk7XG5cblx0XHRcdC8vIGluY3JlYXNlIGluZGV4XG5cblx0XHRcdGluZGV4ICsrO1xuXG5cdFx0fVxuXG5cdFx0Ly8gc2F2ZSB0aGUgaW5kZXggb2YgdGhlIGxhc3QgY2VudGVyIHZlcnRleFxuXG5cdFx0Y2VudGVySW5kZXhFbmQgPSBpbmRleDtcblxuXHRcdC8vIG5vdyB3ZSBnZW5lcmF0ZSB0aGUgc3Vycm91bmRpbmcgdmVydGljZXMsIG5vcm1hbHMgYW5kIHV2c1xuXG5cdFx0Zm9yICggeCA9IDA7IHggPD0gcmFkaWFsU2VnbWVudHM7IHggKysgKSB7XG5cblx0XHRcdHZhciB1ID0geCAvIHJhZGlhbFNlZ21lbnRzO1xuXHRcdFx0dmFyIHRoZXRhID0gdSAqIHRoZXRhTGVuZ3RoICsgdGhldGFTdGFydDtcblxuXHRcdFx0dmFyIGNvc1RoZXRhID0gTWF0aC5jb3MoIHRoZXRhICk7XG5cdFx0XHR2YXIgc2luVGhldGEgPSBNYXRoLnNpbiggdGhldGEgKTtcblxuXHRcdFx0Ly8gdmVydGV4XG5cblx0XHRcdHZlcnRleC54ID0gcmFkaXVzICogc2luVGhldGE7XG5cdFx0XHR2ZXJ0ZXgueSA9IGhhbGZIZWlnaHQgKiBzaWduO1xuXHRcdFx0dmVydGV4LnogPSByYWRpdXMgKiBjb3NUaGV0YTtcblx0XHRcdHZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTtcblxuXHRcdFx0Ly8gbm9ybWFsXG5cblx0XHRcdG5vcm1hbHMucHVzaCggMCwgc2lnbiwgMCApO1xuXG5cdFx0XHQvLyB1dlxuXG5cdFx0XHR1di54ID0gKCBjb3NUaGV0YSAqIDAuNSApICsgMC41O1xuXHRcdFx0dXYueSA9ICggc2luVGhldGEgKiAwLjUgKiBzaWduICkgKyAwLjU7XG5cdFx0XHR1dnMucHVzaCggdXYueCwgdXYueSApO1xuXG5cdFx0XHQvLyBpbmNyZWFzZSBpbmRleFxuXG5cdFx0XHRpbmRleCArKztcblxuXHRcdH1cblxuXHRcdC8vIGdlbmVyYXRlIGluZGljZXNcblxuXHRcdGZvciAoIHggPSAwOyB4IDwgcmFkaWFsU2VnbWVudHM7IHggKysgKSB7XG5cblx0XHRcdHZhciBjID0gY2VudGVySW5kZXhTdGFydCArIHg7XG5cdFx0XHR2YXIgaSA9IGNlbnRlckluZGV4RW5kICsgeDtcblxuXHRcdFx0aWYgKCB0b3AgPT09IHRydWUgKSB7XG5cblx0XHRcdFx0Ly8gZmFjZSB0b3BcblxuXHRcdFx0XHRpbmRpY2VzLnB1c2goIGksIGkgKyAxLCBjICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Ly8gZmFjZSBib3R0b21cblxuXHRcdFx0XHRpbmRpY2VzLnB1c2goIGkgKyAxLCBpLCBjICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Z3JvdXBDb3VudCArPSAzO1xuXG5cdFx0fVxuXG5cdFx0Ly8gYWRkIGEgZ3JvdXAgdG8gdGhlIGdlb21ldHJ5LiB0aGlzIHdpbGwgZW5zdXJlIG11bHRpIG1hdGVyaWFsIHN1cHBvcnRcblxuXHRcdHNjb3BlLmFkZEdyb3VwKCBncm91cFN0YXJ0LCBncm91cENvdW50LCB0b3AgPT09IHRydWUgPyAxIDogMiApO1xuXG5cdFx0Ly8gY2FsY3VsYXRlIG5ldyBzdGFydCB2YWx1ZSBmb3IgZ3JvdXBzXG5cblx0XHRncm91cFN0YXJ0ICs9IGdyb3VwQ291bnQ7XG5cblx0fVxuXG59XG5cbkN5bGluZGVyQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7XG5DeWxpbmRlckJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEN5bGluZGVyQnVmZmVyR2VvbWV0cnk7XG5cbi8qKlxuICogQGF1dGhvciBhYmVsbmF0aW9uIC8gaHR0cDovL2dpdGh1Yi5jb20vYWJlbG5hdGlvblxuICovXG5cbi8vIENvbmVHZW9tZXRyeVxuXG5mdW5jdGlvbiBDb25lR2VvbWV0cnkoIHJhZGl1cywgaGVpZ2h0LCByYWRpYWxTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIG9wZW5FbmRlZCwgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKSB7XG5cblx0Q3lsaW5kZXJHZW9tZXRyeS5jYWxsKCB0aGlzLCAwLCByYWRpdXMsIGhlaWdodCwgcmFkaWFsU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCBvcGVuRW5kZWQsIHRoZXRhU3RhcnQsIHRoZXRhTGVuZ3RoICk7XG5cblx0dGhpcy50eXBlID0gJ0NvbmVHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdGhlaWdodDogaGVpZ2h0LFxuXHRcdHJhZGlhbFNlZ21lbnRzOiByYWRpYWxTZWdtZW50cyxcblx0XHRoZWlnaHRTZWdtZW50czogaGVpZ2h0U2VnbWVudHMsXG5cdFx0b3BlbkVuZGVkOiBvcGVuRW5kZWQsXG5cdFx0dGhldGFTdGFydDogdGhldGFTdGFydCxcblx0XHR0aGV0YUxlbmd0aDogdGhldGFMZW5ndGhcblx0fTtcblxufVxuXG5Db25lR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQ3lsaW5kZXJHZW9tZXRyeS5wcm90b3R5cGUgKTtcbkNvbmVHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDb25lR2VvbWV0cnk7XG5cbi8vIENvbmVCdWZmZXJHZW9tZXRyeVxuXG5mdW5jdGlvbiBDb25lQnVmZmVyR2VvbWV0cnkoIHJhZGl1cywgaGVpZ2h0LCByYWRpYWxTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIG9wZW5FbmRlZCwgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKSB7XG5cblx0Q3lsaW5kZXJCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzLCAwLCByYWRpdXMsIGhlaWdodCwgcmFkaWFsU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCBvcGVuRW5kZWQsIHRoZXRhU3RhcnQsIHRoZXRhTGVuZ3RoICk7XG5cblx0dGhpcy50eXBlID0gJ0NvbmVCdWZmZXJHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdGhlaWdodDogaGVpZ2h0LFxuXHRcdHJhZGlhbFNlZ21lbnRzOiByYWRpYWxTZWdtZW50cyxcblx0XHRoZWlnaHRTZWdtZW50czogaGVpZ2h0U2VnbWVudHMsXG5cdFx0b3BlbkVuZGVkOiBvcGVuRW5kZWQsXG5cdFx0dGhldGFTdGFydDogdGhldGFTdGFydCxcblx0XHR0aGV0YUxlbmd0aDogdGhldGFMZW5ndGhcblx0fTtcblxufVxuXG5Db25lQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTtcbkNvbmVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDb25lQnVmZmVyR2VvbWV0cnk7XG5cbi8qKlxuICogQGF1dGhvciBiZW5hYWRhbXMgLyBodHRwczovL3R3aXR0ZXIuY29tL2Jlbl9hX2FkYW1zXG4gKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44N1xuICogQGF1dGhvciBodWdoZXNcbiAqL1xuXG4vLyBDaXJjbGVHZW9tZXRyeVxuXG5mdW5jdGlvbiBDaXJjbGVHZW9tZXRyeSggcmFkaXVzLCBzZWdtZW50cywgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKSB7XG5cblx0R2VvbWV0cnkuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdDaXJjbGVHZW9tZXRyeSc7XG5cblx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdHNlZ21lbnRzOiBzZWdtZW50cyxcblx0XHR0aGV0YVN0YXJ0OiB0aGV0YVN0YXJ0LFxuXHRcdHRoZXRhTGVuZ3RoOiB0aGV0YUxlbmd0aFxuXHR9O1xuXG5cdHRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgQ2lyY2xlQnVmZmVyR2VvbWV0cnkoIHJhZGl1cywgc2VnbWVudHMsIHRoZXRhU3RhcnQsIHRoZXRhTGVuZ3RoICkgKTtcblx0dGhpcy5tZXJnZVZlcnRpY2VzKCk7XG5cbn1cblxuQ2lyY2xlR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7XG5DaXJjbGVHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDaXJjbGVHZW9tZXRyeTtcblxuLy8gQ2lyY2xlQnVmZmVyR2VvbWV0cnlcblxuZnVuY3Rpb24gQ2lyY2xlQnVmZmVyR2VvbWV0cnkoIHJhZGl1cywgc2VnbWVudHMsIHRoZXRhU3RhcnQsIHRoZXRhTGVuZ3RoICkge1xuXG5cdEJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnQ2lyY2xlQnVmZmVyR2VvbWV0cnknO1xuXG5cdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRyYWRpdXM6IHJhZGl1cyxcblx0XHRzZWdtZW50czogc2VnbWVudHMsXG5cdFx0dGhldGFTdGFydDogdGhldGFTdGFydCxcblx0XHR0aGV0YUxlbmd0aDogdGhldGFMZW5ndGhcblx0fTtcblxuXHRyYWRpdXMgPSByYWRpdXMgfHwgNTA7XG5cdHNlZ21lbnRzID0gc2VnbWVudHMgIT09IHVuZGVmaW5lZCA/IE1hdGgubWF4KCAzLCBzZWdtZW50cyApIDogODtcblxuXHR0aGV0YVN0YXJ0ID0gdGhldGFTdGFydCAhPT0gdW5kZWZpbmVkID8gdGhldGFTdGFydCA6IDA7XG5cdHRoZXRhTGVuZ3RoID0gdGhldGFMZW5ndGggIT09IHVuZGVmaW5lZCA/IHRoZXRhTGVuZ3RoIDogTWF0aC5QSSAqIDI7XG5cblx0Ly8gYnVmZmVyc1xuXG5cdHZhciBpbmRpY2VzID0gW107XG5cdHZhciB2ZXJ0aWNlcyA9IFtdO1xuXHR2YXIgbm9ybWFscyA9IFtdO1xuXHR2YXIgdXZzID0gW107XG5cblx0Ly8gaGVscGVyIHZhcmlhYmxlc1xuXG5cdHZhciBpLCBzO1xuXHR2YXIgdmVydGV4ID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIHV2ID0gbmV3IFZlY3RvcjIoKTtcblxuXHQvLyBjZW50ZXIgcG9pbnRcblxuXHR2ZXJ0aWNlcy5wdXNoKCAwLCAwLCAwICk7XG5cdG5vcm1hbHMucHVzaCggMCwgMCwgMSApO1xuXHR1dnMucHVzaCggMC41LCAwLjUgKTtcblxuXHRmb3IgKCBzID0gMCwgaSA9IDM7IHMgPD0gc2VnbWVudHM7IHMgKyssIGkgKz0gMyApIHtcblxuXHRcdHZhciBzZWdtZW50ID0gdGhldGFTdGFydCArIHMgLyBzZWdtZW50cyAqIHRoZXRhTGVuZ3RoO1xuXG5cdFx0Ly8gdmVydGV4XG5cblx0XHR2ZXJ0ZXgueCA9IHJhZGl1cyAqIE1hdGguY29zKCBzZWdtZW50ICk7XG5cdFx0dmVydGV4LnkgPSByYWRpdXMgKiBNYXRoLnNpbiggc2VnbWVudCApO1xuXG5cdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0Ly8gbm9ybWFsXG5cblx0XHRub3JtYWxzLnB1c2goIDAsIDAsIDEgKTtcblxuXHRcdC8vIHV2c1xuXG5cdFx0dXYueCA9ICggdmVydGljZXNbIGkgXSAvIHJhZGl1cyArIDEgKSAvIDI7XG5cdFx0dXYueSA9ICggdmVydGljZXNbIGkgKyAxIF0gLyByYWRpdXMgKyAxICkgLyAyO1xuXG5cdFx0dXZzLnB1c2goIHV2LngsIHV2LnkgKTtcblxuXHR9XG5cblx0Ly8gaW5kaWNlc1xuXG5cdGZvciAoIGkgPSAxOyBpIDw9IHNlZ21lbnRzOyBpICsrICkge1xuXG5cdFx0aW5kaWNlcy5wdXNoKCBpLCBpICsgMSwgMCApO1xuXG5cdH1cblxuXHQvLyBidWlsZCBnZW9tZXRyeVxuXG5cdHRoaXMuc2V0SW5kZXgoIGluZGljZXMgKTtcblx0dGhpcy5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XG5cdHRoaXMuYWRkQXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIG5vcm1hbHMsIDMgKSApO1xuXHR0aGlzLmFkZEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2cywgMiApICk7XG5cbn1cblxuQ2lyY2xlQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7XG5DaXJjbGVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDaXJjbGVCdWZmZXJHZW9tZXRyeTtcblxuXG5cbnZhciBHZW9tZXRyaWVzID0gT2JqZWN0LmZyZWV6ZSh7XG5cdFdpcmVmcmFtZUdlb21ldHJ5OiBXaXJlZnJhbWVHZW9tZXRyeSxcblx0UGFyYW1ldHJpY0dlb21ldHJ5OiBQYXJhbWV0cmljR2VvbWV0cnksXG5cdFBhcmFtZXRyaWNCdWZmZXJHZW9tZXRyeTogUGFyYW1ldHJpY0J1ZmZlckdlb21ldHJ5LFxuXHRUZXRyYWhlZHJvbkdlb21ldHJ5OiBUZXRyYWhlZHJvbkdlb21ldHJ5LFxuXHRUZXRyYWhlZHJvbkJ1ZmZlckdlb21ldHJ5OiBUZXRyYWhlZHJvbkJ1ZmZlckdlb21ldHJ5LFxuXHRPY3RhaGVkcm9uR2VvbWV0cnk6IE9jdGFoZWRyb25HZW9tZXRyeSxcblx0T2N0YWhlZHJvbkJ1ZmZlckdlb21ldHJ5OiBPY3RhaGVkcm9uQnVmZmVyR2VvbWV0cnksXG5cdEljb3NhaGVkcm9uR2VvbWV0cnk6IEljb3NhaGVkcm9uR2VvbWV0cnksXG5cdEljb3NhaGVkcm9uQnVmZmVyR2VvbWV0cnk6IEljb3NhaGVkcm9uQnVmZmVyR2VvbWV0cnksXG5cdERvZGVjYWhlZHJvbkdlb21ldHJ5OiBEb2RlY2FoZWRyb25HZW9tZXRyeSxcblx0RG9kZWNhaGVkcm9uQnVmZmVyR2VvbWV0cnk6IERvZGVjYWhlZHJvbkJ1ZmZlckdlb21ldHJ5LFxuXHRQb2x5aGVkcm9uR2VvbWV0cnk6IFBvbHloZWRyb25HZW9tZXRyeSxcblx0UG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5OiBQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnksXG5cdFR1YmVHZW9tZXRyeTogVHViZUdlb21ldHJ5LFxuXHRUdWJlQnVmZmVyR2VvbWV0cnk6IFR1YmVCdWZmZXJHZW9tZXRyeSxcblx0VG9ydXNLbm90R2VvbWV0cnk6IFRvcnVzS25vdEdlb21ldHJ5LFxuXHRUb3J1c0tub3RCdWZmZXJHZW9tZXRyeTogVG9ydXNLbm90QnVmZmVyR2VvbWV0cnksXG5cdFRvcnVzR2VvbWV0cnk6IFRvcnVzR2VvbWV0cnksXG5cdFRvcnVzQnVmZmVyR2VvbWV0cnk6IFRvcnVzQnVmZmVyR2VvbWV0cnksXG5cdFRleHRHZW9tZXRyeTogVGV4dEdlb21ldHJ5LFxuXHRUZXh0QnVmZmVyR2VvbWV0cnk6IFRleHRCdWZmZXJHZW9tZXRyeSxcblx0U3BoZXJlR2VvbWV0cnk6IFNwaGVyZUdlb21ldHJ5LFxuXHRTcGhlcmVCdWZmZXJHZW9tZXRyeTogU3BoZXJlQnVmZmVyR2VvbWV0cnksXG5cdFJpbmdHZW9tZXRyeTogUmluZ0dlb21ldHJ5LFxuXHRSaW5nQnVmZmVyR2VvbWV0cnk6IFJpbmdCdWZmZXJHZW9tZXRyeSxcblx0UGxhbmVHZW9tZXRyeTogUGxhbmVHZW9tZXRyeSxcblx0UGxhbmVCdWZmZXJHZW9tZXRyeTogUGxhbmVCdWZmZXJHZW9tZXRyeSxcblx0TGF0aGVHZW9tZXRyeTogTGF0aGVHZW9tZXRyeSxcblx0TGF0aGVCdWZmZXJHZW9tZXRyeTogTGF0aGVCdWZmZXJHZW9tZXRyeSxcblx0U2hhcGVHZW9tZXRyeTogU2hhcGVHZW9tZXRyeSxcblx0U2hhcGVCdWZmZXJHZW9tZXRyeTogU2hhcGVCdWZmZXJHZW9tZXRyeSxcblx0RXh0cnVkZUdlb21ldHJ5OiBFeHRydWRlR2VvbWV0cnksXG5cdEV4dHJ1ZGVCdWZmZXJHZW9tZXRyeTogRXh0cnVkZUJ1ZmZlckdlb21ldHJ5LFxuXHRFZGdlc0dlb21ldHJ5OiBFZGdlc0dlb21ldHJ5LFxuXHRDb25lR2VvbWV0cnk6IENvbmVHZW9tZXRyeSxcblx0Q29uZUJ1ZmZlckdlb21ldHJ5OiBDb25lQnVmZmVyR2VvbWV0cnksXG5cdEN5bGluZGVyR2VvbWV0cnk6IEN5bGluZGVyR2VvbWV0cnksXG5cdEN5bGluZGVyQnVmZmVyR2VvbWV0cnk6IEN5bGluZGVyQnVmZmVyR2VvbWV0cnksXG5cdENpcmNsZUdlb21ldHJ5OiBDaXJjbGVHZW9tZXRyeSxcblx0Q2lyY2xlQnVmZmVyR2VvbWV0cnk6IENpcmNsZUJ1ZmZlckdlb21ldHJ5LFxuXHRCb3hHZW9tZXRyeTogQm94R2VvbWV0cnksXG5cdEJveEJ1ZmZlckdlb21ldHJ5OiBCb3hCdWZmZXJHZW9tZXRyeVxufSk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqXG4gKiBwYXJhbWV0ZXJzID0ge1xuICogIG9wYWNpdHk6IDxmbG9hdD5cbiAqIH1cbiAqL1xuXG5mdW5jdGlvbiBTaGFkb3dNYXRlcmlhbCggcGFyYW1ldGVycyApIHtcblxuXHRTaGFkZXJNYXRlcmlhbC5jYWxsKCB0aGlzLCB7XG5cdFx0dW5pZm9ybXM6IFVuaWZvcm1zVXRpbHMubWVyZ2UoIFtcblx0XHRcdFVuaWZvcm1zTGliLmxpZ2h0cyxcblx0XHRcdHtcblx0XHRcdFx0b3BhY2l0eTogeyB2YWx1ZTogMS4wIH1cblx0XHRcdH1cblx0XHRdICksXG5cdFx0dmVydGV4U2hhZGVyOiBTaGFkZXJDaHVua1sgJ3NoYWRvd192ZXJ0JyBdLFxuXHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVua1sgJ3NoYWRvd19mcmFnJyBdXG5cdH0gKTtcblxuXHR0aGlzLmxpZ2h0cyA9IHRydWU7XG5cdHRoaXMudHJhbnNwYXJlbnQgPSB0cnVlO1xuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCB0aGlzLCB7XG5cdFx0b3BhY2l0eToge1xuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdGdldDogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy51bmlmb3Jtcy5vcGFjaXR5LnZhbHVlO1xuXHRcdFx0fSxcblx0XHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblx0XHRcdFx0dGhpcy51bmlmb3Jtcy5vcGFjaXR5LnZhbHVlID0gdmFsdWU7XG5cdFx0XHR9XG5cdFx0fVxuXHR9ICk7XG5cblx0dGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTtcblxufVxuXG5TaGFkb3dNYXRlcmlhbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBTaGFkZXJNYXRlcmlhbC5wcm90b3R5cGUgKTtcblNoYWRvd01hdGVyaWFsLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFNoYWRvd01hdGVyaWFsO1xuXG5TaGFkb3dNYXRlcmlhbC5wcm90b3R5cGUuaXNTaGFkb3dNYXRlcmlhbCA9IHRydWU7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBSYXdTaGFkZXJNYXRlcmlhbCggcGFyYW1ldGVycyApIHtcblxuXHRTaGFkZXJNYXRlcmlhbC5jYWxsKCB0aGlzLCBwYXJhbWV0ZXJzICk7XG5cblx0dGhpcy50eXBlID0gJ1Jhd1NoYWRlck1hdGVyaWFsJztcblxufVxuXG5SYXdTaGFkZXJNYXRlcmlhbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBTaGFkZXJNYXRlcmlhbC5wcm90b3R5cGUgKTtcblJhd1NoYWRlck1hdGVyaWFsLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFJhd1NoYWRlck1hdGVyaWFsO1xuXG5SYXdTaGFkZXJNYXRlcmlhbC5wcm90b3R5cGUuaXNSYXdTaGFkZXJNYXRlcmlhbCA9IHRydWU7XG5cbi8qKlxuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKlxuICogcGFyYW1ldGVycyA9IHtcbiAqICBjb2xvcjogPGhleD4sXG4gKiAgcm91Z2huZXNzOiA8ZmxvYXQ+LFxuICogIG1ldGFsbmVzczogPGZsb2F0PixcbiAqICBvcGFjaXR5OiA8ZmxvYXQ+LFxuICpcbiAqICBtYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIGxpZ2h0TWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGxpZ2h0TWFwSW50ZW5zaXR5OiA8ZmxvYXQ+XG4gKlxuICogIGFvTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGFvTWFwSW50ZW5zaXR5OiA8ZmxvYXQ+XG4gKlxuICogIGVtaXNzaXZlOiA8aGV4PixcbiAqICBlbWlzc2l2ZUludGVuc2l0eTogPGZsb2F0PlxuICogIGVtaXNzaXZlTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBidW1wTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGJ1bXBTY2FsZTogPGZsb2F0PixcbiAqXG4gKiAgbm9ybWFsTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIG5vcm1hbFNjYWxlOiA8VmVjdG9yMj4sXG4gKlxuICogIGRpc3BsYWNlbWVudE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBkaXNwbGFjZW1lbnRTY2FsZTogPGZsb2F0PixcbiAqICBkaXNwbGFjZW1lbnRCaWFzOiA8ZmxvYXQ+LFxuICpcbiAqICByb3VnaG5lc3NNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIG1ldGFsbmVzc01hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgYWxwaGFNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIGVudk1hcDogbmV3IFRIUkVFLkN1YmVUZXh0dXJlKCBbcG9zeCwgbmVneCwgcG9zeSwgbmVneSwgcG9zeiwgbmVnel0gKSxcbiAqICBlbnZNYXBJbnRlbnNpdHk6IDxmbG9hdD5cbiAqXG4gKiAgcmVmcmFjdGlvblJhdGlvOiA8ZmxvYXQ+LFxuICpcbiAqICB3aXJlZnJhbWU6IDxib29sZWFuPixcbiAqICB3aXJlZnJhbWVMaW5ld2lkdGg6IDxmbG9hdD4sXG4gKlxuICogIHNraW5uaW5nOiA8Ym9vbD4sXG4gKiAgbW9ycGhUYXJnZXRzOiA8Ym9vbD4sXG4gKiAgbW9ycGhOb3JtYWxzOiA8Ym9vbD5cbiAqIH1cbiAqL1xuXG5mdW5jdGlvbiBNZXNoU3RhbmRhcmRNYXRlcmlhbCggcGFyYW1ldGVycyApIHtcblxuXHRNYXRlcmlhbC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy5kZWZpbmVzID0geyAnU1RBTkRBUkQnOiAnJyB9O1xuXG5cdHRoaXMudHlwZSA9ICdNZXNoU3RhbmRhcmRNYXRlcmlhbCc7XG5cblx0dGhpcy5jb2xvciA9IG5ldyBDb2xvciggMHhmZmZmZmYgKTsgLy8gZGlmZnVzZVxuXHR0aGlzLnJvdWdobmVzcyA9IDAuNTtcblx0dGhpcy5tZXRhbG5lc3MgPSAwLjU7XG5cblx0dGhpcy5tYXAgPSBudWxsO1xuXG5cdHRoaXMubGlnaHRNYXAgPSBudWxsO1xuXHR0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5ID0gMS4wO1xuXG5cdHRoaXMuYW9NYXAgPSBudWxsO1xuXHR0aGlzLmFvTWFwSW50ZW5zaXR5ID0gMS4wO1xuXG5cdHRoaXMuZW1pc3NpdmUgPSBuZXcgQ29sb3IoIDB4MDAwMDAwICk7XG5cdHRoaXMuZW1pc3NpdmVJbnRlbnNpdHkgPSAxLjA7XG5cdHRoaXMuZW1pc3NpdmVNYXAgPSBudWxsO1xuXG5cdHRoaXMuYnVtcE1hcCA9IG51bGw7XG5cdHRoaXMuYnVtcFNjYWxlID0gMTtcblxuXHR0aGlzLm5vcm1hbE1hcCA9IG51bGw7XG5cdHRoaXMubm9ybWFsU2NhbGUgPSBuZXcgVmVjdG9yMiggMSwgMSApO1xuXG5cdHRoaXMuZGlzcGxhY2VtZW50TWFwID0gbnVsbDtcblx0dGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IDE7XG5cdHRoaXMuZGlzcGxhY2VtZW50QmlhcyA9IDA7XG5cblx0dGhpcy5yb3VnaG5lc3NNYXAgPSBudWxsO1xuXG5cdHRoaXMubWV0YWxuZXNzTWFwID0gbnVsbDtcblxuXHR0aGlzLmFscGhhTWFwID0gbnVsbDtcblxuXHR0aGlzLmVudk1hcCA9IG51bGw7XG5cdHRoaXMuZW52TWFwSW50ZW5zaXR5ID0gMS4wO1xuXG5cdHRoaXMucmVmcmFjdGlvblJhdGlvID0gMC45ODtcblxuXHR0aGlzLndpcmVmcmFtZSA9IGZhbHNlO1xuXHR0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IDE7XG5cdHRoaXMud2lyZWZyYW1lTGluZWNhcCA9ICdyb3VuZCc7XG5cdHRoaXMud2lyZWZyYW1lTGluZWpvaW4gPSAncm91bmQnO1xuXG5cdHRoaXMuc2tpbm5pbmcgPSBmYWxzZTtcblx0dGhpcy5tb3JwaFRhcmdldHMgPSBmYWxzZTtcblx0dGhpcy5tb3JwaE5vcm1hbHMgPSBmYWxzZTtcblxuXHR0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApO1xuXG59XG5cbk1lc2hTdGFuZGFyZE1hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE1hdGVyaWFsLnByb3RvdHlwZSApO1xuTWVzaFN0YW5kYXJkTWF0ZXJpYWwucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTWVzaFN0YW5kYXJkTWF0ZXJpYWw7XG5cbk1lc2hTdGFuZGFyZE1hdGVyaWFsLnByb3RvdHlwZS5pc01lc2hTdGFuZGFyZE1hdGVyaWFsID0gdHJ1ZTtcblxuTWVzaFN0YW5kYXJkTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRNYXRlcmlhbC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHR0aGlzLmRlZmluZXMgPSB7ICdTVEFOREFSRCc6ICcnIH07XG5cblx0dGhpcy5jb2xvci5jb3B5KCBzb3VyY2UuY29sb3IgKTtcblx0dGhpcy5yb3VnaG5lc3MgPSBzb3VyY2Uucm91Z2huZXNzO1xuXHR0aGlzLm1ldGFsbmVzcyA9IHNvdXJjZS5tZXRhbG5lc3M7XG5cblx0dGhpcy5tYXAgPSBzb3VyY2UubWFwO1xuXG5cdHRoaXMubGlnaHRNYXAgPSBzb3VyY2UubGlnaHRNYXA7XG5cdHRoaXMubGlnaHRNYXBJbnRlbnNpdHkgPSBzb3VyY2UubGlnaHRNYXBJbnRlbnNpdHk7XG5cblx0dGhpcy5hb01hcCA9IHNvdXJjZS5hb01hcDtcblx0dGhpcy5hb01hcEludGVuc2l0eSA9IHNvdXJjZS5hb01hcEludGVuc2l0eTtcblxuXHR0aGlzLmVtaXNzaXZlLmNvcHkoIHNvdXJjZS5lbWlzc2l2ZSApO1xuXHR0aGlzLmVtaXNzaXZlTWFwID0gc291cmNlLmVtaXNzaXZlTWFwO1xuXHR0aGlzLmVtaXNzaXZlSW50ZW5zaXR5ID0gc291cmNlLmVtaXNzaXZlSW50ZW5zaXR5O1xuXG5cdHRoaXMuYnVtcE1hcCA9IHNvdXJjZS5idW1wTWFwO1xuXHR0aGlzLmJ1bXBTY2FsZSA9IHNvdXJjZS5idW1wU2NhbGU7XG5cblx0dGhpcy5ub3JtYWxNYXAgPSBzb3VyY2Uubm9ybWFsTWFwO1xuXHR0aGlzLm5vcm1hbFNjYWxlLmNvcHkoIHNvdXJjZS5ub3JtYWxTY2FsZSApO1xuXG5cdHRoaXMuZGlzcGxhY2VtZW50TWFwID0gc291cmNlLmRpc3BsYWNlbWVudE1hcDtcblx0dGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IHNvdXJjZS5kaXNwbGFjZW1lbnRTY2FsZTtcblx0dGhpcy5kaXNwbGFjZW1lbnRCaWFzID0gc291cmNlLmRpc3BsYWNlbWVudEJpYXM7XG5cblx0dGhpcy5yb3VnaG5lc3NNYXAgPSBzb3VyY2Uucm91Z2huZXNzTWFwO1xuXG5cdHRoaXMubWV0YWxuZXNzTWFwID0gc291cmNlLm1ldGFsbmVzc01hcDtcblxuXHR0aGlzLmFscGhhTWFwID0gc291cmNlLmFscGhhTWFwO1xuXG5cdHRoaXMuZW52TWFwID0gc291cmNlLmVudk1hcDtcblx0dGhpcy5lbnZNYXBJbnRlbnNpdHkgPSBzb3VyY2UuZW52TWFwSW50ZW5zaXR5O1xuXG5cdHRoaXMucmVmcmFjdGlvblJhdGlvID0gc291cmNlLnJlZnJhY3Rpb25SYXRpbztcblxuXHR0aGlzLndpcmVmcmFtZSA9IHNvdXJjZS53aXJlZnJhbWU7XG5cdHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gc291cmNlLndpcmVmcmFtZUxpbmV3aWR0aDtcblx0dGhpcy53aXJlZnJhbWVMaW5lY2FwID0gc291cmNlLndpcmVmcmFtZUxpbmVjYXA7XG5cdHRoaXMud2lyZWZyYW1lTGluZWpvaW4gPSBzb3VyY2Uud2lyZWZyYW1lTGluZWpvaW47XG5cblx0dGhpcy5za2lubmluZyA9IHNvdXJjZS5za2lubmluZztcblx0dGhpcy5tb3JwaFRhcmdldHMgPSBzb3VyY2UubW9ycGhUYXJnZXRzO1xuXHR0aGlzLm1vcnBoTm9ybWFscyA9IHNvdXJjZS5tb3JwaE5vcm1hbHM7XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKlxuICogcGFyYW1ldGVycyA9IHtcbiAqICByZWZsZWN0aXZpdHk6IDxmbG9hdD5cbiAqIH1cbiAqL1xuXG5mdW5jdGlvbiBNZXNoUGh5c2ljYWxNYXRlcmlhbCggcGFyYW1ldGVycyApIHtcblxuXHRNZXNoU3RhbmRhcmRNYXRlcmlhbC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy5kZWZpbmVzID0geyAnUEhZU0lDQUwnOiAnJyB9O1xuXG5cdHRoaXMudHlwZSA9ICdNZXNoUGh5c2ljYWxNYXRlcmlhbCc7XG5cblx0dGhpcy5yZWZsZWN0aXZpdHkgPSAwLjU7IC8vIG1hcHMgdG8gRjAgPSAwLjA0XG5cblx0dGhpcy5jbGVhckNvYXQgPSAwLjA7XG5cdHRoaXMuY2xlYXJDb2F0Um91Z2huZXNzID0gMC4wO1xuXG5cdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XG5cbn1cblxuTWVzaFBoeXNpY2FsTWF0ZXJpYWwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTWVzaFN0YW5kYXJkTWF0ZXJpYWwucHJvdG90eXBlICk7XG5NZXNoUGh5c2ljYWxNYXRlcmlhbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNZXNoUGh5c2ljYWxNYXRlcmlhbDtcblxuTWVzaFBoeXNpY2FsTWF0ZXJpYWwucHJvdG90eXBlLmlzTWVzaFBoeXNpY2FsTWF0ZXJpYWwgPSB0cnVlO1xuXG5NZXNoUGh5c2ljYWxNYXRlcmlhbC5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdE1lc2hTdGFuZGFyZE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMuZGVmaW5lcyA9IHsgJ1BIWVNJQ0FMJzogJycgfTtcblxuXHR0aGlzLnJlZmxlY3Rpdml0eSA9IHNvdXJjZS5yZWZsZWN0aXZpdHk7XG5cblx0dGhpcy5jbGVhckNvYXQgPSBzb3VyY2UuY2xlYXJDb2F0O1xuXHR0aGlzLmNsZWFyQ29hdFJvdWdobmVzcyA9IHNvdXJjZS5jbGVhckNvYXRSb3VnaG5lc3M7XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKlxuICogcGFyYW1ldGVycyA9IHtcbiAqICBjb2xvcjogPGhleD4sXG4gKiAgc3BlY3VsYXI6IDxoZXg+LFxuICogIHNoaW5pbmVzczogPGZsb2F0PixcbiAqICBvcGFjaXR5OiA8ZmxvYXQ+LFxuICpcbiAqICBtYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIGxpZ2h0TWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGxpZ2h0TWFwSW50ZW5zaXR5OiA8ZmxvYXQ+XG4gKlxuICogIGFvTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGFvTWFwSW50ZW5zaXR5OiA8ZmxvYXQ+XG4gKlxuICogIGVtaXNzaXZlOiA8aGV4PixcbiAqICBlbWlzc2l2ZUludGVuc2l0eTogPGZsb2F0PlxuICogIGVtaXNzaXZlTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBidW1wTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGJ1bXBTY2FsZTogPGZsb2F0PixcbiAqXG4gKiAgbm9ybWFsTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIG5vcm1hbFNjYWxlOiA8VmVjdG9yMj4sXG4gKlxuICogIGRpc3BsYWNlbWVudE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBkaXNwbGFjZW1lbnRTY2FsZTogPGZsb2F0PixcbiAqICBkaXNwbGFjZW1lbnRCaWFzOiA8ZmxvYXQ+LFxuICpcbiAqICBzcGVjdWxhck1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgYWxwaGFNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIGVudk1hcDogbmV3IFRIUkVFLlRleHR1cmVDdWJlKCBbcG9zeCwgbmVneCwgcG9zeSwgbmVneSwgcG9zeiwgbmVnel0gKSxcbiAqICBjb21iaW5lOiBUSFJFRS5NdWx0aXBseSxcbiAqICByZWZsZWN0aXZpdHk6IDxmbG9hdD4sXG4gKiAgcmVmcmFjdGlvblJhdGlvOiA8ZmxvYXQ+LFxuICpcbiAqICB3aXJlZnJhbWU6IDxib29sZWFuPixcbiAqICB3aXJlZnJhbWVMaW5ld2lkdGg6IDxmbG9hdD4sXG4gKlxuICogIHNraW5uaW5nOiA8Ym9vbD4sXG4gKiAgbW9ycGhUYXJnZXRzOiA8Ym9vbD4sXG4gKiAgbW9ycGhOb3JtYWxzOiA8Ym9vbD5cbiAqIH1cbiAqL1xuXG5mdW5jdGlvbiBNZXNoUGhvbmdNYXRlcmlhbCggcGFyYW1ldGVycyApIHtcblxuXHRNYXRlcmlhbC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ01lc2hQaG9uZ01hdGVyaWFsJztcblxuXHR0aGlzLmNvbG9yID0gbmV3IENvbG9yKCAweGZmZmZmZiApOyAvLyBkaWZmdXNlXG5cdHRoaXMuc3BlY3VsYXIgPSBuZXcgQ29sb3IoIDB4MTExMTExICk7XG5cdHRoaXMuc2hpbmluZXNzID0gMzA7XG5cblx0dGhpcy5tYXAgPSBudWxsO1xuXG5cdHRoaXMubGlnaHRNYXAgPSBudWxsO1xuXHR0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5ID0gMS4wO1xuXG5cdHRoaXMuYW9NYXAgPSBudWxsO1xuXHR0aGlzLmFvTWFwSW50ZW5zaXR5ID0gMS4wO1xuXG5cdHRoaXMuZW1pc3NpdmUgPSBuZXcgQ29sb3IoIDB4MDAwMDAwICk7XG5cdHRoaXMuZW1pc3NpdmVJbnRlbnNpdHkgPSAxLjA7XG5cdHRoaXMuZW1pc3NpdmVNYXAgPSBudWxsO1xuXG5cdHRoaXMuYnVtcE1hcCA9IG51bGw7XG5cdHRoaXMuYnVtcFNjYWxlID0gMTtcblxuXHR0aGlzLm5vcm1hbE1hcCA9IG51bGw7XG5cdHRoaXMubm9ybWFsU2NhbGUgPSBuZXcgVmVjdG9yMiggMSwgMSApO1xuXG5cdHRoaXMuZGlzcGxhY2VtZW50TWFwID0gbnVsbDtcblx0dGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IDE7XG5cdHRoaXMuZGlzcGxhY2VtZW50QmlhcyA9IDA7XG5cblx0dGhpcy5zcGVjdWxhck1hcCA9IG51bGw7XG5cblx0dGhpcy5hbHBoYU1hcCA9IG51bGw7XG5cblx0dGhpcy5lbnZNYXAgPSBudWxsO1xuXHR0aGlzLmNvbWJpbmUgPSBNdWx0aXBseU9wZXJhdGlvbjtcblx0dGhpcy5yZWZsZWN0aXZpdHkgPSAxO1xuXHR0aGlzLnJlZnJhY3Rpb25SYXRpbyA9IDAuOTg7XG5cblx0dGhpcy53aXJlZnJhbWUgPSBmYWxzZTtcblx0dGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSAxO1xuXHR0aGlzLndpcmVmcmFtZUxpbmVjYXAgPSAncm91bmQnO1xuXHR0aGlzLndpcmVmcmFtZUxpbmVqb2luID0gJ3JvdW5kJztcblxuXHR0aGlzLnNraW5uaW5nID0gZmFsc2U7XG5cdHRoaXMubW9ycGhUYXJnZXRzID0gZmFsc2U7XG5cdHRoaXMubW9ycGhOb3JtYWxzID0gZmFsc2U7XG5cblx0dGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTtcblxufVxuXG5NZXNoUGhvbmdNYXRlcmlhbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBNYXRlcmlhbC5wcm90b3R5cGUgKTtcbk1lc2hQaG9uZ01hdGVyaWFsLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE1lc2hQaG9uZ01hdGVyaWFsO1xuXG5NZXNoUGhvbmdNYXRlcmlhbC5wcm90b3R5cGUuaXNNZXNoUGhvbmdNYXRlcmlhbCA9IHRydWU7XG5cbk1lc2hQaG9uZ01hdGVyaWFsLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0TWF0ZXJpYWwucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0dGhpcy5jb2xvci5jb3B5KCBzb3VyY2UuY29sb3IgKTtcblx0dGhpcy5zcGVjdWxhci5jb3B5KCBzb3VyY2Uuc3BlY3VsYXIgKTtcblx0dGhpcy5zaGluaW5lc3MgPSBzb3VyY2Uuc2hpbmluZXNzO1xuXG5cdHRoaXMubWFwID0gc291cmNlLm1hcDtcblxuXHR0aGlzLmxpZ2h0TWFwID0gc291cmNlLmxpZ2h0TWFwO1xuXHR0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5ID0gc291cmNlLmxpZ2h0TWFwSW50ZW5zaXR5O1xuXG5cdHRoaXMuYW9NYXAgPSBzb3VyY2UuYW9NYXA7XG5cdHRoaXMuYW9NYXBJbnRlbnNpdHkgPSBzb3VyY2UuYW9NYXBJbnRlbnNpdHk7XG5cblx0dGhpcy5lbWlzc2l2ZS5jb3B5KCBzb3VyY2UuZW1pc3NpdmUgKTtcblx0dGhpcy5lbWlzc2l2ZU1hcCA9IHNvdXJjZS5lbWlzc2l2ZU1hcDtcblx0dGhpcy5lbWlzc2l2ZUludGVuc2l0eSA9IHNvdXJjZS5lbWlzc2l2ZUludGVuc2l0eTtcblxuXHR0aGlzLmJ1bXBNYXAgPSBzb3VyY2UuYnVtcE1hcDtcblx0dGhpcy5idW1wU2NhbGUgPSBzb3VyY2UuYnVtcFNjYWxlO1xuXG5cdHRoaXMubm9ybWFsTWFwID0gc291cmNlLm5vcm1hbE1hcDtcblx0dGhpcy5ub3JtYWxTY2FsZS5jb3B5KCBzb3VyY2Uubm9ybWFsU2NhbGUgKTtcblxuXHR0aGlzLmRpc3BsYWNlbWVudE1hcCA9IHNvdXJjZS5kaXNwbGFjZW1lbnRNYXA7XG5cdHRoaXMuZGlzcGxhY2VtZW50U2NhbGUgPSBzb3VyY2UuZGlzcGxhY2VtZW50U2NhbGU7XG5cdHRoaXMuZGlzcGxhY2VtZW50QmlhcyA9IHNvdXJjZS5kaXNwbGFjZW1lbnRCaWFzO1xuXG5cdHRoaXMuc3BlY3VsYXJNYXAgPSBzb3VyY2Uuc3BlY3VsYXJNYXA7XG5cblx0dGhpcy5hbHBoYU1hcCA9IHNvdXJjZS5hbHBoYU1hcDtcblxuXHR0aGlzLmVudk1hcCA9IHNvdXJjZS5lbnZNYXA7XG5cdHRoaXMuY29tYmluZSA9IHNvdXJjZS5jb21iaW5lO1xuXHR0aGlzLnJlZmxlY3Rpdml0eSA9IHNvdXJjZS5yZWZsZWN0aXZpdHk7XG5cdHRoaXMucmVmcmFjdGlvblJhdGlvID0gc291cmNlLnJlZnJhY3Rpb25SYXRpbztcblxuXHR0aGlzLndpcmVmcmFtZSA9IHNvdXJjZS53aXJlZnJhbWU7XG5cdHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gc291cmNlLndpcmVmcmFtZUxpbmV3aWR0aDtcblx0dGhpcy53aXJlZnJhbWVMaW5lY2FwID0gc291cmNlLndpcmVmcmFtZUxpbmVjYXA7XG5cdHRoaXMud2lyZWZyYW1lTGluZWpvaW4gPSBzb3VyY2Uud2lyZWZyYW1lTGluZWpvaW47XG5cblx0dGhpcy5za2lubmluZyA9IHNvdXJjZS5za2lubmluZztcblx0dGhpcy5tb3JwaFRhcmdldHMgPSBzb3VyY2UubW9ycGhUYXJnZXRzO1xuXHR0aGlzLm1vcnBoTm9ybWFscyA9IHNvdXJjZS5tb3JwaE5vcm1hbHM7XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciB0YWthaGlyb3ggLyBodHRwOi8vZ2l0aHViLmNvbS90YWthaGlyb3hcbiAqXG4gKiBwYXJhbWV0ZXJzID0ge1xuICogIGdyYWRpZW50TWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApXG4gKiB9XG4gKi9cblxuZnVuY3Rpb24gTWVzaFRvb25NYXRlcmlhbCggcGFyYW1ldGVycyApIHtcblxuXHRNZXNoUGhvbmdNYXRlcmlhbC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy5kZWZpbmVzID0geyAnVE9PTic6ICcnIH07XG5cblx0dGhpcy50eXBlID0gJ01lc2hUb29uTWF0ZXJpYWwnO1xuXG5cdHRoaXMuZ3JhZGllbnRNYXAgPSBudWxsO1xuXG5cdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XG5cbn1cblxuTWVzaFRvb25NYXRlcmlhbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBNZXNoUGhvbmdNYXRlcmlhbC5wcm90b3R5cGUgKTtcbk1lc2hUb29uTWF0ZXJpYWwucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTWVzaFRvb25NYXRlcmlhbDtcblxuTWVzaFRvb25NYXRlcmlhbC5wcm90b3R5cGUuaXNNZXNoVG9vbk1hdGVyaWFsID0gdHJ1ZTtcblxuTWVzaFRvb25NYXRlcmlhbC5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdE1lc2hQaG9uZ01hdGVyaWFsLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMuZ3JhZGllbnRNYXAgPSBzb3VyY2UuZ3JhZGllbnRNYXA7XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleVxuICpcbiAqIHBhcmFtZXRlcnMgPSB7XG4gKiAgb3BhY2l0eTogPGZsb2F0PixcbiAqXG4gKiAgYnVtcE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBidW1wU2NhbGU6IDxmbG9hdD4sXG4gKlxuICogIG5vcm1hbE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBub3JtYWxTY2FsZTogPFZlY3RvcjI+LFxuICpcbiAqICBkaXNwbGFjZW1lbnRNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKiAgZGlzcGxhY2VtZW50U2NhbGU6IDxmbG9hdD4sXG4gKiAgZGlzcGxhY2VtZW50QmlhczogPGZsb2F0PixcbiAqXG4gKiAgd2lyZWZyYW1lOiA8Ym9vbGVhbj4sXG4gKiAgd2lyZWZyYW1lTGluZXdpZHRoOiA8ZmxvYXQ+XG4gKlxuICogIHNraW5uaW5nOiA8Ym9vbD4sXG4gKiAgbW9ycGhUYXJnZXRzOiA8Ym9vbD4sXG4gKiAgbW9ycGhOb3JtYWxzOiA8Ym9vbD5cbiAqIH1cbiAqL1xuXG5mdW5jdGlvbiBNZXNoTm9ybWFsTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7XG5cblx0TWF0ZXJpYWwuY2FsbCggdGhpcywgcGFyYW1ldGVycyApO1xuXG5cdHRoaXMudHlwZSA9ICdNZXNoTm9ybWFsTWF0ZXJpYWwnO1xuXG5cdHRoaXMuYnVtcE1hcCA9IG51bGw7XG5cdHRoaXMuYnVtcFNjYWxlID0gMTtcblxuXHR0aGlzLm5vcm1hbE1hcCA9IG51bGw7XG5cdHRoaXMubm9ybWFsU2NhbGUgPSBuZXcgVmVjdG9yMiggMSwgMSApO1xuXG5cdHRoaXMuZGlzcGxhY2VtZW50TWFwID0gbnVsbDtcblx0dGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IDE7XG5cdHRoaXMuZGlzcGxhY2VtZW50QmlhcyA9IDA7XG5cblx0dGhpcy53aXJlZnJhbWUgPSBmYWxzZTtcblx0dGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSAxO1xuXG5cdHRoaXMuZm9nID0gZmFsc2U7XG5cdHRoaXMubGlnaHRzID0gZmFsc2U7XG5cblx0dGhpcy5za2lubmluZyA9IGZhbHNlO1xuXHR0aGlzLm1vcnBoVGFyZ2V0cyA9IGZhbHNlO1xuXHR0aGlzLm1vcnBoTm9ybWFscyA9IGZhbHNlO1xuXG5cdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XG5cbn1cblxuTWVzaE5vcm1hbE1hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE1hdGVyaWFsLnByb3RvdHlwZSApO1xuTWVzaE5vcm1hbE1hdGVyaWFsLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE1lc2hOb3JtYWxNYXRlcmlhbDtcblxuTWVzaE5vcm1hbE1hdGVyaWFsLnByb3RvdHlwZS5pc01lc2hOb3JtYWxNYXRlcmlhbCA9IHRydWU7XG5cbk1lc2hOb3JtYWxNYXRlcmlhbC5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMuYnVtcE1hcCA9IHNvdXJjZS5idW1wTWFwO1xuXHR0aGlzLmJ1bXBTY2FsZSA9IHNvdXJjZS5idW1wU2NhbGU7XG5cblx0dGhpcy5ub3JtYWxNYXAgPSBzb3VyY2Uubm9ybWFsTWFwO1xuXHR0aGlzLm5vcm1hbFNjYWxlLmNvcHkoIHNvdXJjZS5ub3JtYWxTY2FsZSApO1xuXG5cdHRoaXMuZGlzcGxhY2VtZW50TWFwID0gc291cmNlLmRpc3BsYWNlbWVudE1hcDtcblx0dGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IHNvdXJjZS5kaXNwbGFjZW1lbnRTY2FsZTtcblx0dGhpcy5kaXNwbGFjZW1lbnRCaWFzID0gc291cmNlLmRpc3BsYWNlbWVudEJpYXM7XG5cblx0dGhpcy53aXJlZnJhbWUgPSBzb3VyY2Uud2lyZWZyYW1lO1xuXHR0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IHNvdXJjZS53aXJlZnJhbWVMaW5ld2lkdGg7XG5cblx0dGhpcy5za2lubmluZyA9IHNvdXJjZS5za2lubmluZztcblx0dGhpcy5tb3JwaFRhcmdldHMgPSBzb3VyY2UubW9ycGhUYXJnZXRzO1xuXHR0aGlzLm1vcnBoTm9ybWFscyA9IHNvdXJjZS5tb3JwaE5vcm1hbHM7XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKlxuICogcGFyYW1ldGVycyA9IHtcbiAqICBjb2xvcjogPGhleD4sXG4gKiAgb3BhY2l0eTogPGZsb2F0PixcbiAqXG4gKiAgbWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBsaWdodE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBsaWdodE1hcEludGVuc2l0eTogPGZsb2F0PlxuICpcbiAqICBhb01hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBhb01hcEludGVuc2l0eTogPGZsb2F0PlxuICpcbiAqICBlbWlzc2l2ZTogPGhleD4sXG4gKiAgZW1pc3NpdmVJbnRlbnNpdHk6IDxmbG9hdD5cbiAqICBlbWlzc2l2ZU1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgc3BlY3VsYXJNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIGFscGhhTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBlbnZNYXA6IG5ldyBUSFJFRS5UZXh0dXJlQ3ViZSggW3Bvc3gsIG5lZ3gsIHBvc3ksIG5lZ3ksIHBvc3osIG5lZ3pdICksXG4gKiAgY29tYmluZTogVEhSRUUuTXVsdGlwbHksXG4gKiAgcmVmbGVjdGl2aXR5OiA8ZmxvYXQ+LFxuICogIHJlZnJhY3Rpb25SYXRpbzogPGZsb2F0PixcbiAqXG4gKiAgd2lyZWZyYW1lOiA8Ym9vbGVhbj4sXG4gKiAgd2lyZWZyYW1lTGluZXdpZHRoOiA8ZmxvYXQ+LFxuICpcbiAqICBza2lubmluZzogPGJvb2w+LFxuICogIG1vcnBoVGFyZ2V0czogPGJvb2w+LFxuICogIG1vcnBoTm9ybWFsczogPGJvb2w+XG4gKiB9XG4gKi9cblxuZnVuY3Rpb24gTWVzaExhbWJlcnRNYXRlcmlhbCggcGFyYW1ldGVycyApIHtcblxuXHRNYXRlcmlhbC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ01lc2hMYW1iZXJ0TWF0ZXJpYWwnO1xuXG5cdHRoaXMuY29sb3IgPSBuZXcgQ29sb3IoIDB4ZmZmZmZmICk7IC8vIGRpZmZ1c2VcblxuXHR0aGlzLm1hcCA9IG51bGw7XG5cblx0dGhpcy5saWdodE1hcCA9IG51bGw7XG5cdHRoaXMubGlnaHRNYXBJbnRlbnNpdHkgPSAxLjA7XG5cblx0dGhpcy5hb01hcCA9IG51bGw7XG5cdHRoaXMuYW9NYXBJbnRlbnNpdHkgPSAxLjA7XG5cblx0dGhpcy5lbWlzc2l2ZSA9IG5ldyBDb2xvciggMHgwMDAwMDAgKTtcblx0dGhpcy5lbWlzc2l2ZUludGVuc2l0eSA9IDEuMDtcblx0dGhpcy5lbWlzc2l2ZU1hcCA9IG51bGw7XG5cblx0dGhpcy5zcGVjdWxhck1hcCA9IG51bGw7XG5cblx0dGhpcy5hbHBoYU1hcCA9IG51bGw7XG5cblx0dGhpcy5lbnZNYXAgPSBudWxsO1xuXHR0aGlzLmNvbWJpbmUgPSBNdWx0aXBseU9wZXJhdGlvbjtcblx0dGhpcy5yZWZsZWN0aXZpdHkgPSAxO1xuXHR0aGlzLnJlZnJhY3Rpb25SYXRpbyA9IDAuOTg7XG5cblx0dGhpcy53aXJlZnJhbWUgPSBmYWxzZTtcblx0dGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSAxO1xuXHR0aGlzLndpcmVmcmFtZUxpbmVjYXAgPSAncm91bmQnO1xuXHR0aGlzLndpcmVmcmFtZUxpbmVqb2luID0gJ3JvdW5kJztcblxuXHR0aGlzLnNraW5uaW5nID0gZmFsc2U7XG5cdHRoaXMubW9ycGhUYXJnZXRzID0gZmFsc2U7XG5cdHRoaXMubW9ycGhOb3JtYWxzID0gZmFsc2U7XG5cblx0dGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTtcblxufVxuXG5NZXNoTGFtYmVydE1hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE1hdGVyaWFsLnByb3RvdHlwZSApO1xuTWVzaExhbWJlcnRNYXRlcmlhbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNZXNoTGFtYmVydE1hdGVyaWFsO1xuXG5NZXNoTGFtYmVydE1hdGVyaWFsLnByb3RvdHlwZS5pc01lc2hMYW1iZXJ0TWF0ZXJpYWwgPSB0cnVlO1xuXG5NZXNoTGFtYmVydE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0TWF0ZXJpYWwucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0dGhpcy5jb2xvci5jb3B5KCBzb3VyY2UuY29sb3IgKTtcblxuXHR0aGlzLm1hcCA9IHNvdXJjZS5tYXA7XG5cblx0dGhpcy5saWdodE1hcCA9IHNvdXJjZS5saWdodE1hcDtcblx0dGhpcy5saWdodE1hcEludGVuc2l0eSA9IHNvdXJjZS5saWdodE1hcEludGVuc2l0eTtcblxuXHR0aGlzLmFvTWFwID0gc291cmNlLmFvTWFwO1xuXHR0aGlzLmFvTWFwSW50ZW5zaXR5ID0gc291cmNlLmFvTWFwSW50ZW5zaXR5O1xuXG5cdHRoaXMuZW1pc3NpdmUuY29weSggc291cmNlLmVtaXNzaXZlICk7XG5cdHRoaXMuZW1pc3NpdmVNYXAgPSBzb3VyY2UuZW1pc3NpdmVNYXA7XG5cdHRoaXMuZW1pc3NpdmVJbnRlbnNpdHkgPSBzb3VyY2UuZW1pc3NpdmVJbnRlbnNpdHk7XG5cblx0dGhpcy5zcGVjdWxhck1hcCA9IHNvdXJjZS5zcGVjdWxhck1hcDtcblxuXHR0aGlzLmFscGhhTWFwID0gc291cmNlLmFscGhhTWFwO1xuXG5cdHRoaXMuZW52TWFwID0gc291cmNlLmVudk1hcDtcblx0dGhpcy5jb21iaW5lID0gc291cmNlLmNvbWJpbmU7XG5cdHRoaXMucmVmbGVjdGl2aXR5ID0gc291cmNlLnJlZmxlY3Rpdml0eTtcblx0dGhpcy5yZWZyYWN0aW9uUmF0aW8gPSBzb3VyY2UucmVmcmFjdGlvblJhdGlvO1xuXG5cdHRoaXMud2lyZWZyYW1lID0gc291cmNlLndpcmVmcmFtZTtcblx0dGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSBzb3VyY2Uud2lyZWZyYW1lTGluZXdpZHRoO1xuXHR0aGlzLndpcmVmcmFtZUxpbmVjYXAgPSBzb3VyY2Uud2lyZWZyYW1lTGluZWNhcDtcblx0dGhpcy53aXJlZnJhbWVMaW5lam9pbiA9IHNvdXJjZS53aXJlZnJhbWVMaW5lam9pbjtcblxuXHR0aGlzLnNraW5uaW5nID0gc291cmNlLnNraW5uaW5nO1xuXHR0aGlzLm1vcnBoVGFyZ2V0cyA9IHNvdXJjZS5tb3JwaFRhcmdldHM7XG5cdHRoaXMubW9ycGhOb3JtYWxzID0gc291cmNlLm1vcnBoTm9ybWFscztcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICpcbiAqIHBhcmFtZXRlcnMgPSB7XG4gKiAgY29sb3I6IDxoZXg+LFxuICogIG9wYWNpdHk6IDxmbG9hdD4sXG4gKlxuICogIGxpbmV3aWR0aDogPGZsb2F0PixcbiAqXG4gKiAgc2NhbGU6IDxmbG9hdD4sXG4gKiAgZGFzaFNpemU6IDxmbG9hdD4sXG4gKiAgZ2FwU2l6ZTogPGZsb2F0PlxuICogfVxuICovXG5cbmZ1bmN0aW9uIExpbmVEYXNoZWRNYXRlcmlhbCggcGFyYW1ldGVycyApIHtcblxuXHRNYXRlcmlhbC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0xpbmVEYXNoZWRNYXRlcmlhbCc7XG5cblx0dGhpcy5jb2xvciA9IG5ldyBDb2xvciggMHhmZmZmZmYgKTtcblxuXHR0aGlzLmxpbmV3aWR0aCA9IDE7XG5cblx0dGhpcy5zY2FsZSA9IDE7XG5cdHRoaXMuZGFzaFNpemUgPSAzO1xuXHR0aGlzLmdhcFNpemUgPSAxO1xuXG5cdHRoaXMubGlnaHRzID0gZmFsc2U7XG5cblx0dGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTtcblxufVxuXG5MaW5lRGFzaGVkTWF0ZXJpYWwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTWF0ZXJpYWwucHJvdG90eXBlICk7XG5MaW5lRGFzaGVkTWF0ZXJpYWwucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTGluZURhc2hlZE1hdGVyaWFsO1xuXG5MaW5lRGFzaGVkTWF0ZXJpYWwucHJvdG90eXBlLmlzTGluZURhc2hlZE1hdGVyaWFsID0gdHJ1ZTtcblxuTGluZURhc2hlZE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0TWF0ZXJpYWwucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0dGhpcy5jb2xvci5jb3B5KCBzb3VyY2UuY29sb3IgKTtcblxuXHR0aGlzLmxpbmV3aWR0aCA9IHNvdXJjZS5saW5ld2lkdGg7XG5cblx0dGhpcy5zY2FsZSA9IHNvdXJjZS5zY2FsZTtcblx0dGhpcy5kYXNoU2l6ZSA9IHNvdXJjZS5kYXNoU2l6ZTtcblx0dGhpcy5nYXBTaXplID0gc291cmNlLmdhcFNpemU7XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cblxuXG52YXIgTWF0ZXJpYWxzID0gT2JqZWN0LmZyZWV6ZSh7XG5cdFNoYWRvd01hdGVyaWFsOiBTaGFkb3dNYXRlcmlhbCxcblx0U3ByaXRlTWF0ZXJpYWw6IFNwcml0ZU1hdGVyaWFsLFxuXHRSYXdTaGFkZXJNYXRlcmlhbDogUmF3U2hhZGVyTWF0ZXJpYWwsXG5cdFNoYWRlck1hdGVyaWFsOiBTaGFkZXJNYXRlcmlhbCxcblx0UG9pbnRzTWF0ZXJpYWw6IFBvaW50c01hdGVyaWFsLFxuXHRNZXNoUGh5c2ljYWxNYXRlcmlhbDogTWVzaFBoeXNpY2FsTWF0ZXJpYWwsXG5cdE1lc2hTdGFuZGFyZE1hdGVyaWFsOiBNZXNoU3RhbmRhcmRNYXRlcmlhbCxcblx0TWVzaFBob25nTWF0ZXJpYWw6IE1lc2hQaG9uZ01hdGVyaWFsLFxuXHRNZXNoVG9vbk1hdGVyaWFsOiBNZXNoVG9vbk1hdGVyaWFsLFxuXHRNZXNoTm9ybWFsTWF0ZXJpYWw6IE1lc2hOb3JtYWxNYXRlcmlhbCxcblx0TWVzaExhbWJlcnRNYXRlcmlhbDogTWVzaExhbWJlcnRNYXRlcmlhbCxcblx0TWVzaERlcHRoTWF0ZXJpYWw6IE1lc2hEZXB0aE1hdGVyaWFsLFxuXHRNZXNoQmFzaWNNYXRlcmlhbDogTWVzaEJhc2ljTWF0ZXJpYWwsXG5cdExpbmVEYXNoZWRNYXRlcmlhbDogTGluZURhc2hlZE1hdGVyaWFsLFxuXHRMaW5lQmFzaWNNYXRlcmlhbDogTGluZUJhc2ljTWF0ZXJpYWwsXG5cdE1hdGVyaWFsOiBNYXRlcmlhbFxufSk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG52YXIgQ2FjaGUgPSB7XG5cblx0ZW5hYmxlZDogZmFsc2UsXG5cblx0ZmlsZXM6IHt9LFxuXG5cdGFkZDogZnVuY3Rpb24gKCBrZXksIGZpbGUgKSB7XG5cblx0XHRpZiAoIHRoaXMuZW5hYmxlZCA9PT0gZmFsc2UgKSByZXR1cm47XG5cblx0XHQvLyBjb25zb2xlLmxvZyggJ1RIUkVFLkNhY2hlJywgJ0FkZGluZyBrZXk6Jywga2V5ICk7XG5cblx0XHR0aGlzLmZpbGVzWyBrZXkgXSA9IGZpbGU7XG5cblx0fSxcblxuXHRnZXQ6IGZ1bmN0aW9uICgga2V5ICkge1xuXG5cdFx0aWYgKCB0aGlzLmVuYWJsZWQgPT09IGZhbHNlICkgcmV0dXJuO1xuXG5cdFx0Ly8gY29uc29sZS5sb2coICdUSFJFRS5DYWNoZScsICdDaGVja2luZyBrZXk6Jywga2V5ICk7XG5cblx0XHRyZXR1cm4gdGhpcy5maWxlc1sga2V5IF07XG5cblx0fSxcblxuXHRyZW1vdmU6IGZ1bmN0aW9uICgga2V5ICkge1xuXG5cdFx0ZGVsZXRlIHRoaXMuZmlsZXNbIGtleSBdO1xuXG5cdH0sXG5cblx0Y2xlYXI6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuZmlsZXMgPSB7fTtcblxuXHR9XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBMb2FkaW5nTWFuYWdlciggb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkge1xuXG5cdHZhciBzY29wZSA9IHRoaXM7XG5cblx0dmFyIGlzTG9hZGluZyA9IGZhbHNlLCBpdGVtc0xvYWRlZCA9IDAsIGl0ZW1zVG90YWwgPSAwO1xuXG5cdHRoaXMub25TdGFydCA9IHVuZGVmaW5lZDtcblx0dGhpcy5vbkxvYWQgPSBvbkxvYWQ7XG5cdHRoaXMub25Qcm9ncmVzcyA9IG9uUHJvZ3Jlc3M7XG5cdHRoaXMub25FcnJvciA9IG9uRXJyb3I7XG5cblx0dGhpcy5pdGVtU3RhcnQgPSBmdW5jdGlvbiAoIHVybCApIHtcblxuXHRcdGl0ZW1zVG90YWwgKys7XG5cblx0XHRpZiAoIGlzTG9hZGluZyA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdGlmICggc2NvcGUub25TdGFydCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHNjb3BlLm9uU3RhcnQoIHVybCwgaXRlbXNMb2FkZWQsIGl0ZW1zVG90YWwgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aXNMb2FkaW5nID0gdHJ1ZTtcblxuXHR9O1xuXG5cdHRoaXMuaXRlbUVuZCA9IGZ1bmN0aW9uICggdXJsICkge1xuXG5cdFx0aXRlbXNMb2FkZWQgKys7XG5cblx0XHRpZiAoIHNjb3BlLm9uUHJvZ3Jlc3MgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0c2NvcGUub25Qcm9ncmVzcyggdXJsLCBpdGVtc0xvYWRlZCwgaXRlbXNUb3RhbCApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBpdGVtc0xvYWRlZCA9PT0gaXRlbXNUb3RhbCApIHtcblxuXHRcdFx0aXNMb2FkaW5nID0gZmFsc2U7XG5cblx0XHRcdGlmICggc2NvcGUub25Mb2FkICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0c2NvcGUub25Mb2FkKCk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9O1xuXG5cdHRoaXMuaXRlbUVycm9yID0gZnVuY3Rpb24gKCB1cmwgKSB7XG5cblx0XHRpZiAoIHNjb3BlLm9uRXJyb3IgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0c2NvcGUub25FcnJvciggdXJsICk7XG5cblx0XHR9XG5cblx0fTtcblxufVxuXG52YXIgRGVmYXVsdExvYWRpbmdNYW5hZ2VyID0gbmV3IExvYWRpbmdNYW5hZ2VyKCk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBGaWxlTG9hZGVyKCBtYW5hZ2VyICkge1xuXG5cdHRoaXMubWFuYWdlciA9ICggbWFuYWdlciAhPT0gdW5kZWZpbmVkICkgPyBtYW5hZ2VyIDogRGVmYXVsdExvYWRpbmdNYW5hZ2VyO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIEZpbGVMb2FkZXIucHJvdG90eXBlLCB7XG5cblx0bG9hZDogZnVuY3Rpb24gKCB1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciApIHtcblxuXHRcdGlmICggdXJsID09PSB1bmRlZmluZWQgKSB1cmwgPSAnJztcblxuXHRcdGlmICggdGhpcy5wYXRoICE9PSB1bmRlZmluZWQgKSB1cmwgPSB0aGlzLnBhdGggKyB1cmw7XG5cblx0XHR2YXIgc2NvcGUgPSB0aGlzO1xuXG5cdFx0dmFyIGNhY2hlZCA9IENhY2hlLmdldCggdXJsICk7XG5cblx0XHRpZiAoIGNhY2hlZCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1TdGFydCggdXJsICk7XG5cblx0XHRcdHNldFRpbWVvdXQoIGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0XHRpZiAoIG9uTG9hZCApIG9uTG9hZCggY2FjaGVkICk7XG5cblx0XHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRW5kKCB1cmwgKTtcblxuXHRcdFx0fSwgMCApO1xuXG5cdFx0XHRyZXR1cm4gY2FjaGVkO1xuXG5cdFx0fVxuXG5cdFx0Ly8gQ2hlY2sgZm9yIGRhdGE6IFVSSVxuXHRcdHZhciBkYXRhVXJpUmVnZXggPSAvXmRhdGE6KC4qPykoO2Jhc2U2NCk/LCguKikkLztcblx0XHR2YXIgZGF0YVVyaVJlZ2V4UmVzdWx0ID0gdXJsLm1hdGNoKCBkYXRhVXJpUmVnZXggKTtcblxuXHRcdC8vIFNhZmFyaSBjYW4gbm90IGhhbmRsZSBEYXRhIFVSSXMgdGhyb3VnaCBYTUxIdHRwUmVxdWVzdCBzbyBwcm9jZXNzIG1hbnVhbGx5XG5cdFx0aWYgKCBkYXRhVXJpUmVnZXhSZXN1bHQgKSB7XG5cblx0XHRcdHZhciBtaW1lVHlwZSA9IGRhdGFVcmlSZWdleFJlc3VsdFsgMSBdO1xuXHRcdFx0dmFyIGlzQmFzZTY0ID0gISEgZGF0YVVyaVJlZ2V4UmVzdWx0WyAyIF07XG5cdFx0XHR2YXIgZGF0YSA9IGRhdGFVcmlSZWdleFJlc3VsdFsgMyBdO1xuXG5cdFx0XHRkYXRhID0gd2luZG93LmRlY29kZVVSSUNvbXBvbmVudCggZGF0YSApO1xuXG5cdFx0XHRpZiAoIGlzQmFzZTY0ICkgZGF0YSA9IHdpbmRvdy5hdG9iKCBkYXRhICk7XG5cblx0XHRcdHRyeSB7XG5cblx0XHRcdFx0dmFyIHJlc3BvbnNlO1xuXHRcdFx0XHR2YXIgcmVzcG9uc2VUeXBlID0gKCB0aGlzLnJlc3BvbnNlVHlwZSB8fCAnJyApLnRvTG93ZXJDYXNlKCk7XG5cblx0XHRcdFx0c3dpdGNoICggcmVzcG9uc2VUeXBlICkge1xuXG5cdFx0XHRcdFx0Y2FzZSAnYXJyYXlidWZmZXInOlxuXHRcdFx0XHRcdGNhc2UgJ2Jsb2InOlxuXG5cdFx0XHRcdFx0IFx0cmVzcG9uc2UgPSBuZXcgQXJyYXlCdWZmZXIoIGRhdGEubGVuZ3RoICk7XG5cblx0XHRcdFx0XHRcdHZhciB2aWV3ID0gbmV3IFVpbnQ4QXJyYXkoIHJlc3BvbnNlICk7XG5cblx0XHRcdFx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRcdFx0XHRcdHZpZXdbIGkgXSA9IGRhdGEuY2hhckNvZGVBdCggaSApO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGlmICggcmVzcG9uc2VUeXBlID09PSAnYmxvYicgKSB7XG5cblx0XHRcdFx0XHRcdFx0cmVzcG9uc2UgPSBuZXcgQmxvYiggWyByZXNwb25zZSBdLCB7IHR5cGU6IG1pbWVUeXBlIH0gKTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgJ2RvY3VtZW50JzpcblxuXHRcdFx0XHRcdFx0dmFyIHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTtcblx0XHRcdFx0XHRcdHJlc3BvbnNlID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyggZGF0YSwgbWltZVR5cGUgKTtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlICdqc29uJzpcblxuXHRcdFx0XHRcdFx0cmVzcG9uc2UgPSBKU09OLnBhcnNlKCBkYXRhICk7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0ZGVmYXVsdDogLy8gJ3RleHQnIG9yIG90aGVyXG5cblx0XHRcdFx0XHRcdHJlc3BvbnNlID0gZGF0YTtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFdhaXQgZm9yIG5leHQgYnJvd3NlciB0aWNrXG5cdFx0XHRcdHdpbmRvdy5zZXRUaW1lb3V0KCBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdFx0XHRpZiAoIG9uTG9hZCApIG9uTG9hZCggcmVzcG9uc2UgKTtcblxuXHRcdFx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7XG5cblx0XHRcdFx0fSwgMCApO1xuXG5cdFx0XHR9IGNhdGNoICggZXJyb3IgKSB7XG5cblx0XHRcdFx0Ly8gV2FpdCBmb3IgbmV4dCBicm93c2VyIHRpY2tcblx0XHRcdFx0d2luZG93LnNldFRpbWVvdXQoIGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0XHRcdGlmICggb25FcnJvciApIG9uRXJyb3IoIGVycm9yICk7XG5cblx0XHRcdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FbmQoIHVybCApO1xuXHRcdFx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVycm9yKCB1cmwgKTtcblxuXHRcdFx0XHR9LCAwICk7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHZhciByZXF1ZXN0ID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG5cdFx0XHRyZXF1ZXN0Lm9wZW4oICdHRVQnLCB1cmwsIHRydWUgKTtcblxuXHRcdFx0cmVxdWVzdC5hZGRFdmVudExpc3RlbmVyKCAnbG9hZCcsIGZ1bmN0aW9uICggZXZlbnQgKSB7XG5cblx0XHRcdFx0dmFyIHJlc3BvbnNlID0gZXZlbnQudGFyZ2V0LnJlc3BvbnNlO1xuXG5cdFx0XHRcdENhY2hlLmFkZCggdXJsLCByZXNwb25zZSApO1xuXG5cdFx0XHRcdGlmICggdGhpcy5zdGF0dXMgPT09IDIwMCApIHtcblxuXHRcdFx0XHRcdGlmICggb25Mb2FkICkgb25Mb2FkKCByZXNwb25zZSApO1xuXG5cdFx0XHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRW5kKCB1cmwgKTtcblxuXHRcdFx0XHR9IGVsc2UgaWYgKCB0aGlzLnN0YXR1cyA9PT0gMCApIHtcblxuXHRcdFx0XHRcdC8vIFNvbWUgYnJvd3NlcnMgcmV0dXJuIEhUVFAgU3RhdHVzIDAgd2hlbiB1c2luZyBub24taHR0cCBwcm90b2NvbFxuXHRcdFx0XHRcdC8vIGUuZy4gJ2ZpbGU6Ly8nIG9yICdkYXRhOi8vJy4gSGFuZGxlIGFzIHN1Y2Nlc3MuXG5cblx0XHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5GaWxlTG9hZGVyOiBIVFRQIFN0YXR1cyAwIHJlY2VpdmVkLicgKTtcblxuXHRcdFx0XHRcdGlmICggb25Mb2FkICkgb25Mb2FkKCByZXNwb25zZSApO1xuXG5cdFx0XHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRW5kKCB1cmwgKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0aWYgKCBvbkVycm9yICkgb25FcnJvciggZXZlbnQgKTtcblxuXHRcdFx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7XG5cdFx0XHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRXJyb3IoIHVybCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSwgZmFsc2UgKTtcblxuXHRcdFx0aWYgKCBvblByb2dyZXNzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0cmVxdWVzdC5hZGRFdmVudExpc3RlbmVyKCAncHJvZ3Jlc3MnLCBmdW5jdGlvbiAoIGV2ZW50ICkge1xuXG5cdFx0XHRcdFx0b25Qcm9ncmVzcyggZXZlbnQgKTtcblxuXHRcdFx0XHR9LCBmYWxzZSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJlcXVlc3QuYWRkRXZlbnRMaXN0ZW5lciggJ2Vycm9yJywgZnVuY3Rpb24gKCBldmVudCApIHtcblxuXHRcdFx0XHRpZiAoIG9uRXJyb3IgKSBvbkVycm9yKCBldmVudCApO1xuXG5cdFx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7XG5cdFx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVycm9yKCB1cmwgKTtcblxuXHRcdFx0fSwgZmFsc2UgKTtcblxuXHRcdFx0aWYgKCB0aGlzLnJlc3BvbnNlVHlwZSAhPT0gdW5kZWZpbmVkICkgcmVxdWVzdC5yZXNwb25zZVR5cGUgPSB0aGlzLnJlc3BvbnNlVHlwZTtcblx0XHRcdGlmICggdGhpcy53aXRoQ3JlZGVudGlhbHMgIT09IHVuZGVmaW5lZCApIHJlcXVlc3Qud2l0aENyZWRlbnRpYWxzID0gdGhpcy53aXRoQ3JlZGVudGlhbHM7XG5cblx0XHRcdGlmICggcmVxdWVzdC5vdmVycmlkZU1pbWVUeXBlICkgcmVxdWVzdC5vdmVycmlkZU1pbWVUeXBlKCB0aGlzLm1pbWVUeXBlICE9PSB1bmRlZmluZWQgPyB0aGlzLm1pbWVUeXBlIDogJ3RleHQvcGxhaW4nICk7XG5cblx0XHRcdGZvciAoIHZhciBoZWFkZXIgaW4gdGhpcy5yZXF1ZXN0SGVhZGVyICkge1xuXG5cdFx0XHRcdHJlcXVlc3Quc2V0UmVxdWVzdEhlYWRlciggaGVhZGVyLCB0aGlzLnJlcXVlc3RIZWFkZXJbIGhlYWRlciBdICk7XG5cblx0XHRcdH1cblxuXHRcdFx0cmVxdWVzdC5zZW5kKCBudWxsICk7XG5cblx0XHR9XG5cblx0XHRzY29wZS5tYW5hZ2VyLml0ZW1TdGFydCggdXJsICk7XG5cblx0XHRyZXR1cm4gcmVxdWVzdDtcblxuXHR9LFxuXG5cdHNldFBhdGg6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLnBhdGggPSB2YWx1ZTtcblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFJlc3BvbnNlVHlwZTogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMucmVzcG9uc2VUeXBlID0gdmFsdWU7XG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRXaXRoQ3JlZGVudGlhbHM6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLndpdGhDcmVkZW50aWFscyA9IHZhbHVlO1xuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0TWltZVR5cGU6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLm1pbWVUeXBlID0gdmFsdWU7XG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRSZXF1ZXN0SGVhZGVyOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5yZXF1ZXN0SGVhZGVyID0gdmFsdWU7XG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqXG4gKiBBYnN0cmFjdCBCYXNlIGNsYXNzIHRvIGJsb2NrIGJhc2VkIHRleHR1cmVzIGxvYWRlciAoZGRzLCBwdnIsIC4uLilcbiAqL1xuXG5mdW5jdGlvbiBDb21wcmVzc2VkVGV4dHVyZUxvYWRlciggbWFuYWdlciApIHtcblxuXHR0aGlzLm1hbmFnZXIgPSAoIG1hbmFnZXIgIT09IHVuZGVmaW5lZCApID8gbWFuYWdlciA6IERlZmF1bHRMb2FkaW5nTWFuYWdlcjtcblxuXHQvLyBvdmVycmlkZSBpbiBzdWIgY2xhc3Nlc1xuXHR0aGlzLl9wYXJzZXIgPSBudWxsO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIENvbXByZXNzZWRUZXh0dXJlTG9hZGVyLnByb3RvdHlwZSwge1xuXG5cdGxvYWQ6IGZ1bmN0aW9uICggdXJsLCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKSB7XG5cblx0XHR2YXIgc2NvcGUgPSB0aGlzO1xuXG5cdFx0dmFyIGltYWdlcyA9IFtdO1xuXG5cdFx0dmFyIHRleHR1cmUgPSBuZXcgQ29tcHJlc3NlZFRleHR1cmUoKTtcblx0XHR0ZXh0dXJlLmltYWdlID0gaW1hZ2VzO1xuXG5cdFx0dmFyIGxvYWRlciA9IG5ldyBGaWxlTG9hZGVyKCB0aGlzLm1hbmFnZXIgKTtcblx0XHRsb2FkZXIuc2V0UGF0aCggdGhpcy5wYXRoICk7XG5cdFx0bG9hZGVyLnNldFJlc3BvbnNlVHlwZSggJ2FycmF5YnVmZmVyJyApO1xuXG5cdFx0ZnVuY3Rpb24gbG9hZFRleHR1cmUoIGkgKSB7XG5cblx0XHRcdGxvYWRlci5sb2FkKCB1cmxbIGkgXSwgZnVuY3Rpb24gKCBidWZmZXIgKSB7XG5cblx0XHRcdFx0dmFyIHRleERhdGFzID0gc2NvcGUuX3BhcnNlciggYnVmZmVyLCB0cnVlICk7XG5cblx0XHRcdFx0aW1hZ2VzWyBpIF0gPSB7XG5cdFx0XHRcdFx0d2lkdGg6IHRleERhdGFzLndpZHRoLFxuXHRcdFx0XHRcdGhlaWdodDogdGV4RGF0YXMuaGVpZ2h0LFxuXHRcdFx0XHRcdGZvcm1hdDogdGV4RGF0YXMuZm9ybWF0LFxuXHRcdFx0XHRcdG1pcG1hcHM6IHRleERhdGFzLm1pcG1hcHNcblx0XHRcdFx0fTtcblxuXHRcdFx0XHRsb2FkZWQgKz0gMTtcblxuXHRcdFx0XHRpZiAoIGxvYWRlZCA9PT0gNiApIHtcblxuXHRcdFx0XHRcdGlmICggdGV4RGF0YXMubWlwbWFwQ291bnQgPT09IDEgKVxuXHRcdFx0XHRcdFx0dGV4dHVyZS5taW5GaWx0ZXIgPSBMaW5lYXJGaWx0ZXI7XG5cblx0XHRcdFx0XHR0ZXh0dXJlLmZvcm1hdCA9IHRleERhdGFzLmZvcm1hdDtcblx0XHRcdFx0XHR0ZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0XHRcdGlmICggb25Mb2FkICkgb25Mb2FkKCB0ZXh0dXJlICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9LCBvblByb2dyZXNzLCBvbkVycm9yICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIHVybCApICkge1xuXG5cdFx0XHR2YXIgbG9hZGVkID0gMDtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBpbCA9IHVybC5sZW5ndGg7IGkgPCBpbDsgKysgaSApIHtcblxuXHRcdFx0XHRsb2FkVGV4dHVyZSggaSApO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBjb21wcmVzc2VkIGN1YmVtYXAgdGV4dHVyZSBzdG9yZWQgaW4gYSBzaW5nbGUgRERTIGZpbGVcblxuXHRcdFx0bG9hZGVyLmxvYWQoIHVybCwgZnVuY3Rpb24gKCBidWZmZXIgKSB7XG5cblx0XHRcdFx0dmFyIHRleERhdGFzID0gc2NvcGUuX3BhcnNlciggYnVmZmVyLCB0cnVlICk7XG5cblx0XHRcdFx0aWYgKCB0ZXhEYXRhcy5pc0N1YmVtYXAgKSB7XG5cblx0XHRcdFx0XHR2YXIgZmFjZXMgPSB0ZXhEYXRhcy5taXBtYXBzLmxlbmd0aCAvIHRleERhdGFzLm1pcG1hcENvdW50O1xuXG5cdFx0XHRcdFx0Zm9yICggdmFyIGYgPSAwOyBmIDwgZmFjZXM7IGYgKysgKSB7XG5cblx0XHRcdFx0XHRcdGltYWdlc1sgZiBdID0geyBtaXBtYXBzIDogW10gfTtcblxuXHRcdFx0XHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgdGV4RGF0YXMubWlwbWFwQ291bnQ7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdFx0aW1hZ2VzWyBmIF0ubWlwbWFwcy5wdXNoKCB0ZXhEYXRhcy5taXBtYXBzWyBmICogdGV4RGF0YXMubWlwbWFwQ291bnQgKyBpIF0gKTtcblx0XHRcdFx0XHRcdFx0aW1hZ2VzWyBmIF0uZm9ybWF0ID0gdGV4RGF0YXMuZm9ybWF0O1xuXHRcdFx0XHRcdFx0XHRpbWFnZXNbIGYgXS53aWR0aCA9IHRleERhdGFzLndpZHRoO1xuXHRcdFx0XHRcdFx0XHRpbWFnZXNbIGYgXS5oZWlnaHQgPSB0ZXhEYXRhcy5oZWlnaHQ7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0dGV4dHVyZS5pbWFnZS53aWR0aCA9IHRleERhdGFzLndpZHRoO1xuXHRcdFx0XHRcdHRleHR1cmUuaW1hZ2UuaGVpZ2h0ID0gdGV4RGF0YXMuaGVpZ2h0O1xuXHRcdFx0XHRcdHRleHR1cmUubWlwbWFwcyA9IHRleERhdGFzLm1pcG1hcHM7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggdGV4RGF0YXMubWlwbWFwQ291bnQgPT09IDEgKSB7XG5cblx0XHRcdFx0XHR0ZXh0dXJlLm1pbkZpbHRlciA9IExpbmVhckZpbHRlcjtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGV4dHVyZS5mb3JtYXQgPSB0ZXhEYXRhcy5mb3JtYXQ7XG5cdFx0XHRcdHRleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHRcdGlmICggb25Mb2FkICkgb25Mb2FkKCB0ZXh0dXJlICk7XG5cblx0XHRcdH0sIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0ZXh0dXJlO1xuXG5cdH0sXG5cblx0c2V0UGF0aDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMucGF0aCA9IHZhbHVlO1xuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgTmlrb3MgTS4gLyBodHRwczovL2dpdGh1Yi5jb20vZm9vMTIzL1xuICpcbiAqIEFic3RyYWN0IEJhc2UgY2xhc3MgdG8gbG9hZCBnZW5lcmljIGJpbmFyeSB0ZXh0dXJlcyBmb3JtYXRzIChyZ2JlLCBoZHIsIC4uLilcbiAqL1xuXG5mdW5jdGlvbiBEYXRhVGV4dHVyZUxvYWRlciggbWFuYWdlciApIHtcblxuXHR0aGlzLm1hbmFnZXIgPSAoIG1hbmFnZXIgIT09IHVuZGVmaW5lZCApID8gbWFuYWdlciA6IERlZmF1bHRMb2FkaW5nTWFuYWdlcjtcblxuXHQvLyBvdmVycmlkZSBpbiBzdWIgY2xhc3Nlc1xuXHR0aGlzLl9wYXJzZXIgPSBudWxsO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIERhdGFUZXh0dXJlTG9hZGVyLnByb3RvdHlwZSwge1xuXG5cdGxvYWQ6IGZ1bmN0aW9uICggdXJsLCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKSB7XG5cblx0XHR2YXIgc2NvcGUgPSB0aGlzO1xuXG5cdFx0dmFyIHRleHR1cmUgPSBuZXcgRGF0YVRleHR1cmUoKTtcblxuXHRcdHZhciBsb2FkZXIgPSBuZXcgRmlsZUxvYWRlciggdGhpcy5tYW5hZ2VyICk7XG5cdFx0bG9hZGVyLnNldFJlc3BvbnNlVHlwZSggJ2FycmF5YnVmZmVyJyApO1xuXG5cdFx0bG9hZGVyLmxvYWQoIHVybCwgZnVuY3Rpb24gKCBidWZmZXIgKSB7XG5cblx0XHRcdHZhciB0ZXhEYXRhID0gc2NvcGUuX3BhcnNlciggYnVmZmVyICk7XG5cblx0XHRcdGlmICggISB0ZXhEYXRhICkgcmV0dXJuO1xuXG5cdFx0XHRpZiAoIHVuZGVmaW5lZCAhPT0gdGV4RGF0YS5pbWFnZSApIHtcblxuXHRcdFx0XHR0ZXh0dXJlLmltYWdlID0gdGV4RGF0YS5pbWFnZTtcblxuXHRcdFx0fSBlbHNlIGlmICggdW5kZWZpbmVkICE9PSB0ZXhEYXRhLmRhdGEgKSB7XG5cblx0XHRcdFx0dGV4dHVyZS5pbWFnZS53aWR0aCA9IHRleERhdGEud2lkdGg7XG5cdFx0XHRcdHRleHR1cmUuaW1hZ2UuaGVpZ2h0ID0gdGV4RGF0YS5oZWlnaHQ7XG5cdFx0XHRcdHRleHR1cmUuaW1hZ2UuZGF0YSA9IHRleERhdGEuZGF0YTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0ZXh0dXJlLndyYXBTID0gdW5kZWZpbmVkICE9PSB0ZXhEYXRhLndyYXBTID8gdGV4RGF0YS53cmFwUyA6IENsYW1wVG9FZGdlV3JhcHBpbmc7XG5cdFx0XHR0ZXh0dXJlLndyYXBUID0gdW5kZWZpbmVkICE9PSB0ZXhEYXRhLndyYXBUID8gdGV4RGF0YS53cmFwVCA6IENsYW1wVG9FZGdlV3JhcHBpbmc7XG5cblx0XHRcdHRleHR1cmUubWFnRmlsdGVyID0gdW5kZWZpbmVkICE9PSB0ZXhEYXRhLm1hZ0ZpbHRlciA/IHRleERhdGEubWFnRmlsdGVyIDogTGluZWFyRmlsdGVyO1xuXHRcdFx0dGV4dHVyZS5taW5GaWx0ZXIgPSB1bmRlZmluZWQgIT09IHRleERhdGEubWluRmlsdGVyID8gdGV4RGF0YS5taW5GaWx0ZXIgOiBMaW5lYXJNaXBNYXBMaW5lYXJGaWx0ZXI7XG5cblx0XHRcdHRleHR1cmUuYW5pc290cm9weSA9IHVuZGVmaW5lZCAhPT0gdGV4RGF0YS5hbmlzb3Ryb3B5ID8gdGV4RGF0YS5hbmlzb3Ryb3B5IDogMTtcblxuXHRcdFx0aWYgKCB1bmRlZmluZWQgIT09IHRleERhdGEuZm9ybWF0ICkge1xuXG5cdFx0XHRcdHRleHR1cmUuZm9ybWF0ID0gdGV4RGF0YS5mb3JtYXQ7XG5cblx0XHRcdH1cblx0XHRcdGlmICggdW5kZWZpbmVkICE9PSB0ZXhEYXRhLnR5cGUgKSB7XG5cblx0XHRcdFx0dGV4dHVyZS50eXBlID0gdGV4RGF0YS50eXBlO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggdW5kZWZpbmVkICE9PSB0ZXhEYXRhLm1pcG1hcHMgKSB7XG5cblx0XHRcdFx0dGV4dHVyZS5taXBtYXBzID0gdGV4RGF0YS5taXBtYXBzO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggMSA9PT0gdGV4RGF0YS5taXBtYXBDb3VudCApIHtcblxuXHRcdFx0XHR0ZXh0dXJlLm1pbkZpbHRlciA9IExpbmVhckZpbHRlcjtcblxuXHRcdFx0fVxuXG5cdFx0XHR0ZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0aWYgKCBvbkxvYWQgKSBvbkxvYWQoIHRleHR1cmUsIHRleERhdGEgKTtcblxuXHRcdH0sIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKTtcblxuXG5cdFx0cmV0dXJuIHRleHR1cmU7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBJbWFnZUxvYWRlciggbWFuYWdlciApIHtcblxuXHR0aGlzLm1hbmFnZXIgPSAoIG1hbmFnZXIgIT09IHVuZGVmaW5lZCApID8gbWFuYWdlciA6IERlZmF1bHRMb2FkaW5nTWFuYWdlcjtcblxufVxuXG5PYmplY3QuYXNzaWduKCBJbWFnZUxvYWRlci5wcm90b3R5cGUsIHtcblxuXHRsb2FkOiBmdW5jdGlvbiAoIHVybCwgb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkge1xuXG5cdFx0aWYgKCB1cmwgPT09IHVuZGVmaW5lZCApIHVybCA9ICcnO1xuXG5cdFx0aWYgKCB0aGlzLnBhdGggIT09IHVuZGVmaW5lZCApIHVybCA9IHRoaXMucGF0aCArIHVybDtcblxuXHRcdHZhciBzY29wZSA9IHRoaXM7XG5cblx0XHR2YXIgY2FjaGVkID0gQ2FjaGUuZ2V0KCB1cmwgKTtcblxuXHRcdGlmICggY2FjaGVkICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbVN0YXJ0KCB1cmwgKTtcblxuXHRcdFx0c2V0VGltZW91dCggZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRcdGlmICggb25Mb2FkICkgb25Mb2FkKCBjYWNoZWQgKTtcblxuXHRcdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FbmQoIHVybCApO1xuXG5cdFx0XHR9LCAwICk7XG5cblx0XHRcdHJldHVybiBjYWNoZWQ7XG5cblx0XHR9XG5cblx0XHR2YXIgaW1hZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJywgJ2ltZycgKTtcblxuXHRcdGltYWdlLmFkZEV2ZW50TGlzdGVuZXIoICdsb2FkJywgZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRDYWNoZS5hZGQoIHVybCwgdGhpcyApO1xuXG5cdFx0XHRpZiAoIG9uTG9hZCApIG9uTG9hZCggdGhpcyApO1xuXG5cdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FbmQoIHVybCApO1xuXG5cdFx0fSwgZmFsc2UgKTtcblxuXHRcdC8qXG5cdFx0aW1hZ2UuYWRkRXZlbnRMaXN0ZW5lciggJ3Byb2dyZXNzJywgZnVuY3Rpb24gKCBldmVudCApIHtcblxuXHRcdFx0aWYgKCBvblByb2dyZXNzICkgb25Qcm9ncmVzcyggZXZlbnQgKTtcblxuXHRcdH0sIGZhbHNlICk7XG5cdFx0Ki9cblxuXHRcdGltYWdlLmFkZEV2ZW50TGlzdGVuZXIoICdlcnJvcicsIGZ1bmN0aW9uICggZXZlbnQgKSB7XG5cblx0XHRcdGlmICggb25FcnJvciApIG9uRXJyb3IoIGV2ZW50ICk7XG5cblx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7XG5cdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FcnJvciggdXJsICk7XG5cblx0XHR9LCBmYWxzZSApO1xuXG5cdFx0aWYgKCB1cmwuc3Vic3RyKCAwLCA1ICkgIT09ICdkYXRhOicgKSB7XG5cblx0XHRcdGlmICggdGhpcy5jcm9zc09yaWdpbiAhPT0gdW5kZWZpbmVkICkgaW1hZ2UuY3Jvc3NPcmlnaW4gPSB0aGlzLmNyb3NzT3JpZ2luO1xuXG5cdFx0fVxuXG5cdFx0c2NvcGUubWFuYWdlci5pdGVtU3RhcnQoIHVybCApO1xuXG5cdFx0aW1hZ2Uuc3JjID0gdXJsO1xuXG5cdFx0cmV0dXJuIGltYWdlO1xuXG5cdH0sXG5cblx0c2V0Q3Jvc3NPcmlnaW46IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLmNyb3NzT3JpZ2luID0gdmFsdWU7XG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRQYXRoOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5wYXRoID0gdmFsdWU7XG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBDdWJlVGV4dHVyZUxvYWRlciggbWFuYWdlciApIHtcblxuXHR0aGlzLm1hbmFnZXIgPSAoIG1hbmFnZXIgIT09IHVuZGVmaW5lZCApID8gbWFuYWdlciA6IERlZmF1bHRMb2FkaW5nTWFuYWdlcjtcblxufVxuXG5PYmplY3QuYXNzaWduKCBDdWJlVGV4dHVyZUxvYWRlci5wcm90b3R5cGUsIHtcblxuXHRsb2FkOiBmdW5jdGlvbiAoIHVybHMsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciApIHtcblxuXHRcdHZhciB0ZXh0dXJlID0gbmV3IEN1YmVUZXh0dXJlKCk7XG5cblx0XHR2YXIgbG9hZGVyID0gbmV3IEltYWdlTG9hZGVyKCB0aGlzLm1hbmFnZXIgKTtcblx0XHRsb2FkZXIuc2V0Q3Jvc3NPcmlnaW4oIHRoaXMuY3Jvc3NPcmlnaW4gKTtcblx0XHRsb2FkZXIuc2V0UGF0aCggdGhpcy5wYXRoICk7XG5cblx0XHR2YXIgbG9hZGVkID0gMDtcblxuXHRcdGZ1bmN0aW9uIGxvYWRUZXh0dXJlKCBpICkge1xuXG5cdFx0XHRsb2FkZXIubG9hZCggdXJsc1sgaSBdLCBmdW5jdGlvbiAoIGltYWdlICkge1xuXG5cdFx0XHRcdHRleHR1cmUuaW1hZ2VzWyBpIF0gPSBpbWFnZTtcblxuXHRcdFx0XHRsb2FkZWQgKys7XG5cblx0XHRcdFx0aWYgKCBsb2FkZWQgPT09IDYgKSB7XG5cblx0XHRcdFx0XHR0ZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0XHRcdGlmICggb25Mb2FkICkgb25Mb2FkKCB0ZXh0dXJlICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9LCB1bmRlZmluZWQsIG9uRXJyb3IgKTtcblxuXHRcdH1cblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IHVybHMubGVuZ3RoOyArKyBpICkge1xuXG5cdFx0XHRsb2FkVGV4dHVyZSggaSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRleHR1cmU7XG5cblx0fSxcblxuXHRzZXRDcm9zc09yaWdpbjogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMuY3Jvc3NPcmlnaW4gPSB2YWx1ZTtcblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFBhdGg6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLnBhdGggPSB2YWx1ZTtcblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIFRleHR1cmVMb2FkZXIoIG1hbmFnZXIgKSB7XG5cblx0dGhpcy5tYW5hZ2VyID0gKCBtYW5hZ2VyICE9PSB1bmRlZmluZWQgKSA/IG1hbmFnZXIgOiBEZWZhdWx0TG9hZGluZ01hbmFnZXI7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggVGV4dHVyZUxvYWRlci5wcm90b3R5cGUsIHtcblxuXHRsb2FkOiBmdW5jdGlvbiAoIHVybCwgb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkge1xuXG5cdFx0dmFyIGxvYWRlciA9IG5ldyBJbWFnZUxvYWRlciggdGhpcy5tYW5hZ2VyICk7XG5cdFx0bG9hZGVyLnNldENyb3NzT3JpZ2luKCB0aGlzLmNyb3NzT3JpZ2luICk7XG5cdFx0bG9hZGVyLnNldFBhdGgoIHRoaXMucGF0aCApO1xuXG5cdFx0dmFyIHRleHR1cmUgPSBuZXcgVGV4dHVyZSgpO1xuXHRcdHRleHR1cmUuaW1hZ2UgPSBsb2FkZXIubG9hZCggdXJsLCBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdC8vIEpQRUdzIGNhbid0IGhhdmUgYW4gYWxwaGEgY2hhbm5lbCwgc28gbWVtb3J5IGNhbiBiZSBzYXZlZCBieSBzdG9yaW5nIHRoZW0gYXMgUkdCLlxuXHRcdFx0dmFyIGlzSlBFRyA9IHVybC5zZWFyY2goIC9cXC4oanBnfGpwZWcpJC8gKSA+IDAgfHwgdXJsLnNlYXJjaCggL15kYXRhXFw6aW1hZ2VcXC9qcGVnLyApID09PSAwO1xuXG5cdFx0XHR0ZXh0dXJlLmZvcm1hdCA9IGlzSlBFRyA/IFJHQkZvcm1hdCA6IFJHQkFGb3JtYXQ7XG5cdFx0XHR0ZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0aWYgKCBvbkxvYWQgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRvbkxvYWQoIHRleHR1cmUgKTtcblxuXHRcdFx0fVxuXG5cdFx0fSwgb25Qcm9ncmVzcywgb25FcnJvciApO1xuXG5cdFx0cmV0dXJuIHRleHR1cmU7XG5cblx0fSxcblxuXHRzZXRDcm9zc09yaWdpbjogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMuY3Jvc3NPcmlnaW4gPSB2YWx1ZTtcblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFBhdGg6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLnBhdGggPSB2YWx1ZTtcblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBMaWdodCggY29sb3IsIGludGVuc2l0eSApIHtcblxuXHRPYmplY3QzRC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0xpZ2h0JztcblxuXHR0aGlzLmNvbG9yID0gbmV3IENvbG9yKCBjb2xvciApO1xuXHR0aGlzLmludGVuc2l0eSA9IGludGVuc2l0eSAhPT0gdW5kZWZpbmVkID8gaW50ZW5zaXR5IDogMTtcblxuXHR0aGlzLnJlY2VpdmVTaGFkb3cgPSB1bmRlZmluZWQ7XG5cbn1cblxuTGlnaHQucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogTGlnaHQsXG5cblx0aXNMaWdodDogdHJ1ZSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRcdE9iamVjdDNELnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdFx0dGhpcy5jb2xvci5jb3B5KCBzb3VyY2UuY29sb3IgKTtcblx0XHR0aGlzLmludGVuc2l0eSA9IHNvdXJjZS5pbnRlbnNpdHk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCBtZXRhICkge1xuXG5cdFx0dmFyIGRhdGEgPSBPYmplY3QzRC5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMsIG1ldGEgKTtcblxuXHRcdGRhdGEub2JqZWN0LmNvbG9yID0gdGhpcy5jb2xvci5nZXRIZXgoKTtcblx0XHRkYXRhLm9iamVjdC5pbnRlbnNpdHkgPSB0aGlzLmludGVuc2l0eTtcblxuXHRcdGlmICggdGhpcy5ncm91bmRDb2xvciAhPT0gdW5kZWZpbmVkICkgZGF0YS5vYmplY3QuZ3JvdW5kQ29sb3IgPSB0aGlzLmdyb3VuZENvbG9yLmdldEhleCgpO1xuXG5cdFx0aWYgKCB0aGlzLmRpc3RhbmNlICE9PSB1bmRlZmluZWQgKSBkYXRhLm9iamVjdC5kaXN0YW5jZSA9IHRoaXMuZGlzdGFuY2U7XG5cdFx0aWYgKCB0aGlzLmFuZ2xlICE9PSB1bmRlZmluZWQgKSBkYXRhLm9iamVjdC5hbmdsZSA9IHRoaXMuYW5nbGU7XG5cdFx0aWYgKCB0aGlzLmRlY2F5ICE9PSB1bmRlZmluZWQgKSBkYXRhLm9iamVjdC5kZWNheSA9IHRoaXMuZGVjYXk7XG5cdFx0aWYgKCB0aGlzLnBlbnVtYnJhICE9PSB1bmRlZmluZWQgKSBkYXRhLm9iamVjdC5wZW51bWJyYSA9IHRoaXMucGVudW1icmE7XG5cblx0XHRpZiAoIHRoaXMuc2hhZG93ICE9PSB1bmRlZmluZWQgKSBkYXRhLm9iamVjdC5zaGFkb3cgPSB0aGlzLnNoYWRvdy50b0pTT04oKTtcblxuXHRcdHJldHVybiBkYXRhO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKi9cblxuZnVuY3Rpb24gSGVtaXNwaGVyZUxpZ2h0KCBza3lDb2xvciwgZ3JvdW5kQ29sb3IsIGludGVuc2l0eSApIHtcblxuXHRMaWdodC5jYWxsKCB0aGlzLCBza3lDb2xvciwgaW50ZW5zaXR5ICk7XG5cblx0dGhpcy50eXBlID0gJ0hlbWlzcGhlcmVMaWdodCc7XG5cblx0dGhpcy5jYXN0U2hhZG93ID0gdW5kZWZpbmVkO1xuXG5cdHRoaXMucG9zaXRpb24uY29weSggT2JqZWN0M0QuRGVmYXVsdFVwICk7XG5cdHRoaXMudXBkYXRlTWF0cml4KCk7XG5cblx0dGhpcy5ncm91bmRDb2xvciA9IG5ldyBDb2xvciggZ3JvdW5kQ29sb3IgKTtcblxufVxuXG5IZW1pc3BoZXJlTGlnaHQucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggTGlnaHQucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogSGVtaXNwaGVyZUxpZ2h0LFxuXG5cdGlzSGVtaXNwaGVyZUxpZ2h0OiB0cnVlLFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0TGlnaHQucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0XHR0aGlzLmdyb3VuZENvbG9yLmNvcHkoIHNvdXJjZS5ncm91bmRDb2xvciApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBMaWdodFNoYWRvdyggY2FtZXJhICkge1xuXG5cdHRoaXMuY2FtZXJhID0gY2FtZXJhO1xuXG5cdHRoaXMuYmlhcyA9IDA7XG5cdHRoaXMucmFkaXVzID0gMTtcblxuXHR0aGlzLm1hcFNpemUgPSBuZXcgVmVjdG9yMiggNTEyLCA1MTIgKTtcblxuXHR0aGlzLm1hcCA9IG51bGw7XG5cdHRoaXMubWF0cml4ID0gbmV3IE1hdHJpeDQoKTtcblxufVxuXG5PYmplY3QuYXNzaWduKCBMaWdodFNoYWRvdy5wcm90b3R5cGUsIHtcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRcdHRoaXMuY2FtZXJhID0gc291cmNlLmNhbWVyYS5jbG9uZSgpO1xuXG5cdFx0dGhpcy5iaWFzID0gc291cmNlLmJpYXM7XG5cdFx0dGhpcy5yYWRpdXMgPSBzb3VyY2UucmFkaXVzO1xuXG5cdFx0dGhpcy5tYXBTaXplLmNvcHkoIHNvdXJjZS5tYXBTaXplICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XG5cblx0fSxcblxuXHR0b0pTT046IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBvYmplY3QgPSB7fTtcblxuXHRcdGlmICggdGhpcy5iaWFzICE9PSAwICkgb2JqZWN0LmJpYXMgPSB0aGlzLmJpYXM7XG5cdFx0aWYgKCB0aGlzLnJhZGl1cyAhPT0gMSApIG9iamVjdC5yYWRpdXMgPSB0aGlzLnJhZGl1cztcblx0XHRpZiAoIHRoaXMubWFwU2l6ZS54ICE9PSA1MTIgfHwgdGhpcy5tYXBTaXplLnkgIT09IDUxMiApIG9iamVjdC5tYXBTaXplID0gdGhpcy5tYXBTaXplLnRvQXJyYXkoKTtcblxuXHRcdG9iamVjdC5jYW1lcmEgPSB0aGlzLmNhbWVyYS50b0pTT04oIGZhbHNlICkub2JqZWN0O1xuXHRcdGRlbGV0ZSBvYmplY3QuY2FtZXJhLm1hdHJpeDtcblxuXHRcdHJldHVybiBvYmplY3Q7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBTcG90TGlnaHRTaGFkb3coKSB7XG5cblx0TGlnaHRTaGFkb3cuY2FsbCggdGhpcywgbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCA1MCwgMSwgMC41LCA1MDAgKSApO1xuXG59XG5cblNwb3RMaWdodFNoYWRvdy5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBMaWdodFNoYWRvdy5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBTcG90TGlnaHRTaGFkb3csXG5cblx0aXNTcG90TGlnaHRTaGFkb3c6IHRydWUsXG5cblx0dXBkYXRlOiBmdW5jdGlvbiAoIGxpZ2h0ICkge1xuXG5cdFx0dmFyIGNhbWVyYSA9IHRoaXMuY2FtZXJhO1xuXG5cdFx0dmFyIGZvdiA9IF9NYXRoLlJBRDJERUcgKiAyICogbGlnaHQuYW5nbGU7XG5cdFx0dmFyIGFzcGVjdCA9IHRoaXMubWFwU2l6ZS53aWR0aCAvIHRoaXMubWFwU2l6ZS5oZWlnaHQ7XG5cdFx0dmFyIGZhciA9IGxpZ2h0LmRpc3RhbmNlIHx8IGNhbWVyYS5mYXI7XG5cblx0XHRpZiAoIGZvdiAhPT0gY2FtZXJhLmZvdiB8fCBhc3BlY3QgIT09IGNhbWVyYS5hc3BlY3QgfHwgZmFyICE9PSBjYW1lcmEuZmFyICkge1xuXG5cdFx0XHRjYW1lcmEuZm92ID0gZm92O1xuXHRcdFx0Y2FtZXJhLmFzcGVjdCA9IGFzcGVjdDtcblx0XHRcdGNhbWVyYS5mYXIgPSBmYXI7XG5cdFx0XHRjYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xuXG5cdFx0fVxuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKi9cblxuZnVuY3Rpb24gU3BvdExpZ2h0KCBjb2xvciwgaW50ZW5zaXR5LCBkaXN0YW5jZSwgYW5nbGUsIHBlbnVtYnJhLCBkZWNheSApIHtcblxuXHRMaWdodC5jYWxsKCB0aGlzLCBjb2xvciwgaW50ZW5zaXR5ICk7XG5cblx0dGhpcy50eXBlID0gJ1Nwb3RMaWdodCc7XG5cblx0dGhpcy5wb3NpdGlvbi5jb3B5KCBPYmplY3QzRC5EZWZhdWx0VXAgKTtcblx0dGhpcy51cGRhdGVNYXRyaXgoKTtcblxuXHR0aGlzLnRhcmdldCA9IG5ldyBPYmplY3QzRCgpO1xuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggdGhpcywgJ3Bvd2VyJywge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXHRcdFx0Ly8gaW50ZW5zaXR5ID0gcG93ZXIgcGVyIHNvbGlkIGFuZ2xlLlxuXHRcdFx0Ly8gcmVmOiBlcXVhdGlvbiAoMTcpIGZyb20gaHR0cDovL3d3dy5mcm9zdGJpdGUuY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDE0LzExL2NvdXJzZV9ub3Rlc19tb3ZpbmdfZnJvc3RiaXRlX3RvX3Bici5wZGZcblx0XHRcdHJldHVybiB0aGlzLmludGVuc2l0eSAqIE1hdGguUEk7XG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICggcG93ZXIgKSB7XG5cdFx0XHQvLyBpbnRlbnNpdHkgPSBwb3dlciBwZXIgc29saWQgYW5nbGUuXG5cdFx0XHQvLyByZWY6IGVxdWF0aW9uICgxNykgZnJvbSBodHRwOi8vd3d3LmZyb3N0Yml0ZS5jb20vd3AtY29udGVudC91cGxvYWRzLzIwMTQvMTEvY291cnNlX25vdGVzX21vdmluZ19mcm9zdGJpdGVfdG9fcGJyLnBkZlxuXHRcdFx0dGhpcy5pbnRlbnNpdHkgPSBwb3dlciAvIE1hdGguUEk7XG5cdFx0fVxuXHR9ICk7XG5cblx0dGhpcy5kaXN0YW5jZSA9ICggZGlzdGFuY2UgIT09IHVuZGVmaW5lZCApID8gZGlzdGFuY2UgOiAwO1xuXHR0aGlzLmFuZ2xlID0gKCBhbmdsZSAhPT0gdW5kZWZpbmVkICkgPyBhbmdsZSA6IE1hdGguUEkgLyAzO1xuXHR0aGlzLnBlbnVtYnJhID0gKCBwZW51bWJyYSAhPT0gdW5kZWZpbmVkICkgPyBwZW51bWJyYSA6IDA7XG5cdHRoaXMuZGVjYXkgPSAoIGRlY2F5ICE9PSB1bmRlZmluZWQgKSA/IGRlY2F5IDogMTtcdC8vIGZvciBwaHlzaWNhbGx5IGNvcnJlY3QgbGlnaHRzLCBzaG91bGQgYmUgMi5cblxuXHR0aGlzLnNoYWRvdyA9IG5ldyBTcG90TGlnaHRTaGFkb3coKTtcblxufVxuXG5TcG90TGlnaHQucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggTGlnaHQucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogU3BvdExpZ2h0LFxuXG5cdGlzU3BvdExpZ2h0OiB0cnVlLFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0TGlnaHQucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0XHR0aGlzLmRpc3RhbmNlID0gc291cmNlLmRpc3RhbmNlO1xuXHRcdHRoaXMuYW5nbGUgPSBzb3VyY2UuYW5nbGU7XG5cdFx0dGhpcy5wZW51bWJyYSA9IHNvdXJjZS5wZW51bWJyYTtcblx0XHR0aGlzLmRlY2F5ID0gc291cmNlLmRlY2F5O1xuXG5cdFx0dGhpcy50YXJnZXQgPSBzb3VyY2UudGFyZ2V0LmNsb25lKCk7XG5cblx0XHR0aGlzLnNoYWRvdyA9IHNvdXJjZS5zaGFkb3cuY2xvbmUoKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuXG5mdW5jdGlvbiBQb2ludExpZ2h0KCBjb2xvciwgaW50ZW5zaXR5LCBkaXN0YW5jZSwgZGVjYXkgKSB7XG5cblx0TGlnaHQuY2FsbCggdGhpcywgY29sb3IsIGludGVuc2l0eSApO1xuXG5cdHRoaXMudHlwZSA9ICdQb2ludExpZ2h0JztcblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoIHRoaXMsICdwb3dlcicsIHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblx0XHRcdC8vIGludGVuc2l0eSA9IHBvd2VyIHBlciBzb2xpZCBhbmdsZS5cblx0XHRcdC8vIHJlZjogZXF1YXRpb24gKDE1KSBmcm9tIGh0dHA6Ly93d3cuZnJvc3RiaXRlLmNvbS93cC1jb250ZW50L3VwbG9hZHMvMjAxNC8xMS9jb3Vyc2Vfbm90ZXNfbW92aW5nX2Zyb3N0Yml0ZV90b19wYnIucGRmXG5cdFx0XHRyZXR1cm4gdGhpcy5pbnRlbnNpdHkgKiA0ICogTWF0aC5QSTtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHBvd2VyICkge1xuXHRcdFx0Ly8gaW50ZW5zaXR5ID0gcG93ZXIgcGVyIHNvbGlkIGFuZ2xlLlxuXHRcdFx0Ly8gcmVmOiBlcXVhdGlvbiAoMTUpIGZyb20gaHR0cDovL3d3dy5mcm9zdGJpdGUuY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDE0LzExL2NvdXJzZV9ub3Rlc19tb3ZpbmdfZnJvc3RiaXRlX3RvX3Bici5wZGZcblx0XHRcdHRoaXMuaW50ZW5zaXR5ID0gcG93ZXIgLyAoIDQgKiBNYXRoLlBJICk7XG5cdFx0fVxuXHR9ICk7XG5cblx0dGhpcy5kaXN0YW5jZSA9ICggZGlzdGFuY2UgIT09IHVuZGVmaW5lZCApID8gZGlzdGFuY2UgOiAwO1xuXHR0aGlzLmRlY2F5ID0gKCBkZWNheSAhPT0gdW5kZWZpbmVkICkgPyBkZWNheSA6IDE7XHQvLyBmb3IgcGh5c2ljYWxseSBjb3JyZWN0IGxpZ2h0cywgc2hvdWxkIGJlIDIuXG5cblx0dGhpcy5zaGFkb3cgPSBuZXcgTGlnaHRTaGFkb3coIG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSggOTAsIDEsIDAuNSwgNTAwICkgKTtcblxufVxuXG5Qb2ludExpZ2h0LnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIExpZ2h0LnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IFBvaW50TGlnaHQsXG5cblx0aXNQb2ludExpZ2h0OiB0cnVlLFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0TGlnaHQucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0XHR0aGlzLmRpc3RhbmNlID0gc291cmNlLmRpc3RhbmNlO1xuXHRcdHRoaXMuZGVjYXkgPSBzb3VyY2UuZGVjYXk7XG5cblx0XHR0aGlzLnNoYWRvdyA9IHNvdXJjZS5zaGFkb3cuY2xvbmUoKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gRGlyZWN0aW9uYWxMaWdodFNoYWRvdyggKSB7XG5cblx0TGlnaHRTaGFkb3cuY2FsbCggdGhpcywgbmV3IE9ydGhvZ3JhcGhpY0NhbWVyYSggLSA1LCA1LCA1LCAtIDUsIDAuNSwgNTAwICkgKTtcblxufVxuXG5EaXJlY3Rpb25hbExpZ2h0U2hhZG93LnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIExpZ2h0U2hhZG93LnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IERpcmVjdGlvbmFsTGlnaHRTaGFkb3dcblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICovXG5cbmZ1bmN0aW9uIERpcmVjdGlvbmFsTGlnaHQoIGNvbG9yLCBpbnRlbnNpdHkgKSB7XG5cblx0TGlnaHQuY2FsbCggdGhpcywgY29sb3IsIGludGVuc2l0eSApO1xuXG5cdHRoaXMudHlwZSA9ICdEaXJlY3Rpb25hbExpZ2h0JztcblxuXHR0aGlzLnBvc2l0aW9uLmNvcHkoIE9iamVjdDNELkRlZmF1bHRVcCApO1xuXHR0aGlzLnVwZGF0ZU1hdHJpeCgpO1xuXG5cdHRoaXMudGFyZ2V0ID0gbmV3IE9iamVjdDNEKCk7XG5cblx0dGhpcy5zaGFkb3cgPSBuZXcgRGlyZWN0aW9uYWxMaWdodFNoYWRvdygpO1xuXG59XG5cbkRpcmVjdGlvbmFsTGlnaHQucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggTGlnaHQucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogRGlyZWN0aW9uYWxMaWdodCxcblxuXHRpc0RpcmVjdGlvbmFsTGlnaHQ6IHRydWUsXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHRMaWdodC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHRcdHRoaXMudGFyZ2V0ID0gc291cmNlLnRhcmdldC5jbG9uZSgpO1xuXG5cdFx0dGhpcy5zaGFkb3cgPSBzb3VyY2Uuc2hhZG93LmNsb25lKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIEFtYmllbnRMaWdodCggY29sb3IsIGludGVuc2l0eSApIHtcblxuXHRMaWdodC5jYWxsKCB0aGlzLCBjb2xvciwgaW50ZW5zaXR5ICk7XG5cblx0dGhpcy50eXBlID0gJ0FtYmllbnRMaWdodCc7XG5cblx0dGhpcy5jYXN0U2hhZG93ID0gdW5kZWZpbmVkO1xuXG59XG5cbkFtYmllbnRMaWdodC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBMaWdodC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBBbWJpZW50TGlnaHQsXG5cblx0aXNBbWJpZW50TGlnaHQ6IHRydWVcblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgYWJlbG5hdGlvbiAvIGh0dHA6Ly9naXRodWIuY29tL2FiZWxuYXRpb25cbiAqL1xuXG5mdW5jdGlvbiBSZWN0QXJlYUxpZ2h0KCBjb2xvciwgaW50ZW5zaXR5LCB3aWR0aCwgaGVpZ2h0ICkge1xuXG5cdExpZ2h0LmNhbGwoIHRoaXMsIGNvbG9yLCBpbnRlbnNpdHkgKTtcblxuXHR0aGlzLnR5cGUgPSAnUmVjdEFyZWFMaWdodCc7XG5cblx0dGhpcy5wb3NpdGlvbi5zZXQoIDAsIDEsIDAgKTtcblx0dGhpcy51cGRhdGVNYXRyaXgoKTtcblxuXHR0aGlzLndpZHRoID0gKCB3aWR0aCAhPT0gdW5kZWZpbmVkICkgPyB3aWR0aCA6IDEwO1xuXHR0aGlzLmhlaWdodCA9ICggaGVpZ2h0ICE9PSB1bmRlZmluZWQgKSA/IGhlaWdodCA6IDEwO1xuXG5cdC8vIFRPRE8gKGFiZWxuYXRpb24pOiBkaXN0YW5jZS9kZWNheVxuXG5cdC8vIFRPRE8gKGFiZWxuYXRpb24pOiB1cGRhdGUgbWV0aG9kIGZvciBSZWN0QXJlYUxpZ2h0IHRvIHVwZGF0ZSB0cmFuc2Zvcm0gdG8gbG9va2F0IHRhcmdldFxuXG5cdC8vIFRPRE8gKGFiZWxuYXRpb24pOiBzaGFkb3dzXG5cbn1cblxuLy8gVE9ETyAoYWJlbG5hdGlvbik6IFJlY3RBcmVhTGlnaHQgdXBkYXRlIHdoZW4gbGlnaHQgc2hhcGUgaXMgY2hhbmdlZFxuUmVjdEFyZWFMaWdodC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBMaWdodC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBSZWN0QXJlYUxpZ2h0LFxuXG5cdGlzUmVjdEFyZWFMaWdodDogdHJ1ZSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRcdExpZ2h0LnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdFx0dGhpcy53aWR0aCA9IHNvdXJjZS53aWR0aDtcblx0XHR0aGlzLmhlaWdodCA9IHNvdXJjZS5oZWlnaHQ7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCBtZXRhICkge1xuXG5cdFx0dmFyIGRhdGEgPSBMaWdodC5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMsIG1ldGEgKTtcblxuXHRcdGRhdGEub2JqZWN0LndpZHRoID0gdGhpcy53aWR0aDtcblx0XHRkYXRhLm9iamVjdC5oZWlnaHQgPSB0aGlzLmhlaWdodDtcblxuXHRcdHJldHVybiBkYXRhO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgdHNjaHdcbiAqIEBhdXRob3IgQmVuIEhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8vXG4gKiBAYXV0aG9yIERhdmlkIFNhcm5vIC8gaHR0cDovL2xpZ2h0aGF1cy51cy9cbiAqL1xuXG52YXIgQW5pbWF0aW9uVXRpbHMgPSB7XG5cblx0Ly8gc2FtZSBhcyBBcnJheS5wcm90b3R5cGUuc2xpY2UsIGJ1dCBhbHNvIHdvcmtzIG9uIHR5cGVkIGFycmF5c1xuXHRhcnJheVNsaWNlOiBmdW5jdGlvbiAoIGFycmF5LCBmcm9tLCB0byApIHtcblxuXHRcdGlmICggQW5pbWF0aW9uVXRpbHMuaXNUeXBlZEFycmF5KCBhcnJheSApICkge1xuXG5cdFx0XHQvLyBpbiBpb3M5IGFycmF5LnN1YmFycmF5KGZyb20sIHVuZGVmaW5lZCkgd2lsbCByZXR1cm4gZW1wdHkgYXJyYXlcblx0XHRcdC8vIGJ1dCBhcnJheS5zdWJhcnJheShmcm9tKSBvciBhcnJheS5zdWJhcnJheShmcm9tLCBsZW4pIGlzIGNvcnJlY3Rcblx0XHRcdHJldHVybiBuZXcgYXJyYXkuY29uc3RydWN0b3IoIGFycmF5LnN1YmFycmF5KCBmcm9tLCB0byAhPT0gdW5kZWZpbmVkID8gdG8gOiBhcnJheS5sZW5ndGggKSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGFycmF5LnNsaWNlKCBmcm9tLCB0byApO1xuXG5cdH0sXG5cblx0Ly8gY29udmVydHMgYW4gYXJyYXkgdG8gYSBzcGVjaWZpYyB0eXBlXG5cdGNvbnZlcnRBcnJheTogZnVuY3Rpb24gKCBhcnJheSwgdHlwZSwgZm9yY2VDbG9uZSApIHtcblxuXHRcdGlmICggISBhcnJheSB8fCAvLyBsZXQgJ3VuZGVmaW5lZCcgYW5kICdudWxsJyBwYXNzXG5cdFx0XHRcdCEgZm9yY2VDbG9uZSAmJiBhcnJheS5jb25zdHJ1Y3RvciA9PT0gdHlwZSApIHJldHVybiBhcnJheTtcblxuXHRcdGlmICggdHlwZW9mIHR5cGUuQllURVNfUEVSX0VMRU1FTlQgPT09ICdudW1iZXInICkge1xuXG5cdFx0XHRyZXR1cm4gbmV3IHR5cGUoIGFycmF5ICk7IC8vIGNyZWF0ZSB0eXBlZCBhcnJheVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKCBhcnJheSApOyAvLyBjcmVhdGUgQXJyYXlcblxuXHR9LFxuXG5cdGlzVHlwZWRBcnJheTogZnVuY3Rpb24gKCBvYmplY3QgKSB7XG5cblx0XHRyZXR1cm4gQXJyYXlCdWZmZXIuaXNWaWV3KCBvYmplY3QgKSAmJlxuXHRcdFx0XHQhICggb2JqZWN0IGluc3RhbmNlb2YgRGF0YVZpZXcgKTtcblxuXHR9LFxuXG5cdC8vIHJldHVybnMgYW4gYXJyYXkgYnkgd2hpY2ggdGltZXMgYW5kIHZhbHVlcyBjYW4gYmUgc29ydGVkXG5cdGdldEtleWZyYW1lT3JkZXI6IGZ1bmN0aW9uICggdGltZXMgKSB7XG5cblx0XHRmdW5jdGlvbiBjb21wYXJlVGltZSggaSwgaiApIHtcblxuXHRcdFx0cmV0dXJuIHRpbWVzWyBpIF0gLSB0aW1lc1sgaiBdO1xuXG5cdFx0fVxuXG5cdFx0dmFyIG4gPSB0aW1lcy5sZW5ndGg7XG5cdFx0dmFyIHJlc3VsdCA9IG5ldyBBcnJheSggbiApO1xuXHRcdGZvciAoIHZhciBpID0gMDsgaSAhPT0gbjsgKysgaSApIHJlc3VsdFsgaSBdID0gaTtcblxuXHRcdHJlc3VsdC5zb3J0KCBjb21wYXJlVGltZSApO1xuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblxuXHR9LFxuXG5cdC8vIHVzZXMgdGhlIGFycmF5IHByZXZpb3VzbHkgcmV0dXJuZWQgYnkgJ2dldEtleWZyYW1lT3JkZXInIHRvIHNvcnQgZGF0YVxuXHRzb3J0ZWRBcnJheTogZnVuY3Rpb24gKCB2YWx1ZXMsIHN0cmlkZSwgb3JkZXIgKSB7XG5cblx0XHR2YXIgblZhbHVlcyA9IHZhbHVlcy5sZW5ndGg7XG5cdFx0dmFyIHJlc3VsdCA9IG5ldyB2YWx1ZXMuY29uc3RydWN0b3IoIG5WYWx1ZXMgKTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgZHN0T2Zmc2V0ID0gMDsgZHN0T2Zmc2V0ICE9PSBuVmFsdWVzOyArKyBpICkge1xuXG5cdFx0XHR2YXIgc3JjT2Zmc2V0ID0gb3JkZXJbIGkgXSAqIHN0cmlkZTtcblxuXHRcdFx0Zm9yICggdmFyIGogPSAwOyBqICE9PSBzdHJpZGU7ICsrIGogKSB7XG5cblx0XHRcdFx0cmVzdWx0WyBkc3RPZmZzZXQgKysgXSA9IHZhbHVlc1sgc3JjT2Zmc2V0ICsgaiBdO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXG5cdH0sXG5cblx0Ly8gZnVuY3Rpb24gZm9yIHBhcnNpbmcgQU9TIGtleWZyYW1lIGZvcm1hdHNcblx0ZmxhdHRlbkpTT046IGZ1bmN0aW9uICgganNvbktleXMsIHRpbWVzLCB2YWx1ZXMsIHZhbHVlUHJvcGVydHlOYW1lICkge1xuXG5cdFx0dmFyIGkgPSAxLCBrZXkgPSBqc29uS2V5c1sgMCBdO1xuXG5cdFx0d2hpbGUgKCBrZXkgIT09IHVuZGVmaW5lZCAmJiBrZXlbIHZhbHVlUHJvcGVydHlOYW1lIF0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0a2V5ID0ganNvbktleXNbIGkgKysgXTtcblxuXHRcdH1cblxuXHRcdGlmICgga2V5ID09PSB1bmRlZmluZWQgKSByZXR1cm47IC8vIG5vIGRhdGFcblxuXHRcdHZhciB2YWx1ZSA9IGtleVsgdmFsdWVQcm9wZXJ0eU5hbWUgXTtcblx0XHRpZiAoIHZhbHVlID09PSB1bmRlZmluZWQgKSByZXR1cm47IC8vIG5vIGRhdGFcblxuXHRcdGlmICggQXJyYXkuaXNBcnJheSggdmFsdWUgKSApIHtcblxuXHRcdFx0ZG8ge1xuXG5cdFx0XHRcdHZhbHVlID0ga2V5WyB2YWx1ZVByb3BlcnR5TmFtZSBdO1xuXG5cdFx0XHRcdGlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdHRpbWVzLnB1c2goIGtleS50aW1lICk7XG5cdFx0XHRcdFx0dmFsdWVzLnB1c2guYXBwbHkoIHZhbHVlcywgdmFsdWUgKTsgLy8gcHVzaCBhbGwgZWxlbWVudHNcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0a2V5ID0ganNvbktleXNbIGkgKysgXTtcblxuXHRcdFx0fSB3aGlsZSAoIGtleSAhPT0gdW5kZWZpbmVkICk7XG5cblx0XHR9IGVsc2UgaWYgKCB2YWx1ZS50b0FycmF5ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdC8vIC4uLmFzc3VtZSBUSFJFRS5NYXRoLWlzaFxuXG5cdFx0XHRkbyB7XG5cblx0XHRcdFx0dmFsdWUgPSBrZXlbIHZhbHVlUHJvcGVydHlOYW1lIF07XG5cblx0XHRcdFx0aWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0dGltZXMucHVzaCgga2V5LnRpbWUgKTtcblx0XHRcdFx0XHR2YWx1ZS50b0FycmF5KCB2YWx1ZXMsIHZhbHVlcy5sZW5ndGggKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0a2V5ID0ganNvbktleXNbIGkgKysgXTtcblxuXHRcdFx0fSB3aGlsZSAoIGtleSAhPT0gdW5kZWZpbmVkICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBvdGhlcndpc2UgcHVzaCBhcy1pc1xuXG5cdFx0XHRkbyB7XG5cblx0XHRcdFx0dmFsdWUgPSBrZXlbIHZhbHVlUHJvcGVydHlOYW1lIF07XG5cblx0XHRcdFx0aWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0dGltZXMucHVzaCgga2V5LnRpbWUgKTtcblx0XHRcdFx0XHR2YWx1ZXMucHVzaCggdmFsdWUgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0a2V5ID0ganNvbktleXNbIGkgKysgXTtcblxuXHRcdFx0fSB3aGlsZSAoIGtleSAhPT0gdW5kZWZpbmVkICk7XG5cblx0XHR9XG5cblx0fVxuXG59O1xuXG4vKipcbiAqIEFic3RyYWN0IGJhc2UgY2xhc3Mgb2YgaW50ZXJwb2xhbnRzIG92ZXIgcGFyYW1ldHJpYyBzYW1wbGVzLlxuICpcbiAqIFRoZSBwYXJhbWV0ZXIgZG9tYWluIGlzIG9uZSBkaW1lbnNpb25hbCwgdHlwaWNhbGx5IHRoZSB0aW1lIG9yIGEgcGF0aFxuICogYWxvbmcgYSBjdXJ2ZSBkZWZpbmVkIGJ5IHRoZSBkYXRhLlxuICpcbiAqIFRoZSBzYW1wbGUgdmFsdWVzIGNhbiBoYXZlIGFueSBkaW1lbnNpb25hbGl0eSBhbmQgZGVyaXZlZCBjbGFzc2VzIG1heVxuICogYXBwbHkgc3BlY2lhbCBpbnRlcnByZXRhdGlvbnMgdG8gdGhlIGRhdGEuXG4gKlxuICogVGhpcyBjbGFzcyBwcm92aWRlcyB0aGUgaW50ZXJ2YWwgc2VlayBpbiBhIFRlbXBsYXRlIE1ldGhvZCwgZGVmZXJyaW5nXG4gKiB0aGUgYWN0dWFsIGludGVycG9sYXRpb24gdG8gZGVyaXZlZCBjbGFzc2VzLlxuICpcbiAqIFRpbWUgY29tcGxleGl0eSBpcyBPKDEpIGZvciBsaW5lYXIgYWNjZXNzIGNyb3NzaW5nIGF0IG1vc3QgdHdvIHBvaW50c1xuICogYW5kIE8obG9nIE4pIGZvciByYW5kb20gYWNjZXNzLCB3aGVyZSBOIGlzIHRoZSBudW1iZXIgb2YgcG9zaXRpb25zLlxuICpcbiAqIFJlZmVyZW5jZXM6XG4gKlxuICogXHRcdGh0dHA6Ly93d3cub29kZXNpZ24uY29tL3RlbXBsYXRlLW1ldGhvZC1wYXR0ZXJuLmh0bWxcbiAqXG4gKiBAYXV0aG9yIHRzY2h3XG4gKi9cblxuZnVuY3Rpb24gSW50ZXJwb2xhbnQoIHBhcmFtZXRlclBvc2l0aW9ucywgc2FtcGxlVmFsdWVzLCBzYW1wbGVTaXplLCByZXN1bHRCdWZmZXIgKSB7XG5cblx0dGhpcy5wYXJhbWV0ZXJQb3NpdGlvbnMgPSBwYXJhbWV0ZXJQb3NpdGlvbnM7XG5cdHRoaXMuX2NhY2hlZEluZGV4ID0gMDtcblxuXHR0aGlzLnJlc3VsdEJ1ZmZlciA9IHJlc3VsdEJ1ZmZlciAhPT0gdW5kZWZpbmVkID9cblx0XHRcdHJlc3VsdEJ1ZmZlciA6IG5ldyBzYW1wbGVWYWx1ZXMuY29uc3RydWN0b3IoIHNhbXBsZVNpemUgKTtcblx0dGhpcy5zYW1wbGVWYWx1ZXMgPSBzYW1wbGVWYWx1ZXM7XG5cdHRoaXMudmFsdWVTaXplID0gc2FtcGxlU2l6ZTtcblxufVxuXG5PYmplY3QuYXNzaWduKCBJbnRlcnBvbGFudC5wcm90b3R5cGUsIHtcblxuXHRldmFsdWF0ZTogZnVuY3Rpb24oIHQgKSB7XG5cblx0XHR2YXIgcHAgPSB0aGlzLnBhcmFtZXRlclBvc2l0aW9ucyxcblx0XHRcdGkxID0gdGhpcy5fY2FjaGVkSW5kZXgsXG5cblx0XHRcdHQxID0gcHBbICAgaTEgICBdLFxuXHRcdFx0dDAgPSBwcFsgaTEgLSAxIF07XG5cblx0XHR2YWxpZGF0ZV9pbnRlcnZhbDoge1xuXG5cdFx0XHRzZWVrOiB7XG5cblx0XHRcdFx0dmFyIHJpZ2h0O1xuXG5cdFx0XHRcdGxpbmVhcl9zY2FuOiB7XG5cdFx0XHRcdFx0Ly8tIFNlZSBodHRwOi8vanNwZXJmLmNvbS9jb21wYXJpc29uLXRvLXVuZGVmaW5lZC8zXG5cdFx0XHRcdFx0Ly8tIHNsb3dlciBjb2RlOlxuXHRcdFx0XHRcdC8vLVxuXHRcdFx0XHRcdC8vLSBcdFx0XHRcdGlmICggdCA+PSB0MSB8fCB0MSA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdGZvcndhcmRfc2NhbjogaWYgKCAhICggdCA8IHQxICkgKSB7XG5cblx0XHRcdFx0XHRcdGZvciAoIHZhciBnaXZlVXBBdCA9IGkxICsgMjsgOykge1xuXG5cdFx0XHRcdFx0XHRcdGlmICggdDEgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdFx0XHRcdGlmICggdCA8IHQwICkgYnJlYWsgZm9yd2FyZF9zY2FuO1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gYWZ0ZXIgZW5kXG5cblx0XHRcdFx0XHRcdFx0XHRpMSA9IHBwLmxlbmd0aDtcblx0XHRcdFx0XHRcdFx0XHR0aGlzLl9jYWNoZWRJbmRleCA9IGkxO1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiB0aGlzLmFmdGVyRW5kXyggaTEgLSAxLCB0LCB0MCApO1xuXG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRpZiAoIGkxID09PSBnaXZlVXBBdCApIGJyZWFrOyAvLyB0aGlzIGxvb3BcblxuXHRcdFx0XHRcdFx0XHR0MCA9IHQxO1xuXHRcdFx0XHRcdFx0XHR0MSA9IHBwWyArKyBpMSBdO1xuXG5cdFx0XHRcdFx0XHRcdGlmICggdCA8IHQxICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gd2UgaGF2ZSBhcnJpdmVkIGF0IHRoZSBzb3VnaHQgaW50ZXJ2YWxcblx0XHRcdFx0XHRcdFx0XHRicmVhayBzZWVrO1xuXG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHQvLyBwcmVwYXJlIGJpbmFyeSBzZWFyY2ggb24gdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIGluZGV4XG5cdFx0XHRcdFx0XHRyaWdodCA9IHBwLmxlbmd0aDtcblx0XHRcdFx0XHRcdGJyZWFrIGxpbmVhcl9zY2FuO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8tIHNsb3dlciBjb2RlOlxuXHRcdFx0XHRcdC8vLVx0XHRcdFx0XHRpZiAoIHQgPCB0MCB8fCB0MCA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdGlmICggISAoIHQgPj0gdDAgKSApIHtcblxuXHRcdFx0XHRcdFx0Ly8gbG9vcGluZz9cblxuXHRcdFx0XHRcdFx0dmFyIHQxZ2xvYmFsID0gcHBbIDEgXTtcblxuXHRcdFx0XHRcdFx0aWYgKCB0IDwgdDFnbG9iYWwgKSB7XG5cblx0XHRcdFx0XHRcdFx0aTEgPSAyOyAvLyArIDEsIHVzaW5nIHRoZSBzY2FuIGZvciB0aGUgZGV0YWlsc1xuXHRcdFx0XHRcdFx0XHR0MCA9IHQxZ2xvYmFsO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdC8vIGxpbmVhciByZXZlcnNlIHNjYW5cblxuXHRcdFx0XHRcdFx0Zm9yICggdmFyIGdpdmVVcEF0ID0gaTEgLSAyOyA7KSB7XG5cblx0XHRcdFx0XHRcdFx0aWYgKCB0MCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gYmVmb3JlIHN0YXJ0XG5cblx0XHRcdFx0XHRcdFx0XHR0aGlzLl9jYWNoZWRJbmRleCA9IDA7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMuYmVmb3JlU3RhcnRfKCAwLCB0LCB0MSApO1xuXG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRpZiAoIGkxID09PSBnaXZlVXBBdCApIGJyZWFrOyAvLyB0aGlzIGxvb3BcblxuXHRcdFx0XHRcdFx0XHR0MSA9IHQwO1xuXHRcdFx0XHRcdFx0XHR0MCA9IHBwWyAtLSBpMSAtIDEgXTtcblxuXHRcdFx0XHRcdFx0XHRpZiAoIHQgPj0gdDAgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHQvLyB3ZSBoYXZlIGFycml2ZWQgYXQgdGhlIHNvdWdodCBpbnRlcnZhbFxuXHRcdFx0XHRcdFx0XHRcdGJyZWFrIHNlZWs7XG5cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdC8vIHByZXBhcmUgYmluYXJ5IHNlYXJjaCBvbiB0aGUgbGVmdCBzaWRlIG9mIHRoZSBpbmRleFxuXHRcdFx0XHRcdFx0cmlnaHQgPSBpMTtcblx0XHRcdFx0XHRcdGkxID0gMDtcblx0XHRcdFx0XHRcdGJyZWFrIGxpbmVhcl9zY2FuO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gdGhlIGludGVydmFsIGlzIHZhbGlkXG5cblx0XHRcdFx0XHRicmVhayB2YWxpZGF0ZV9pbnRlcnZhbDtcblxuXHRcdFx0XHR9IC8vIGxpbmVhciBzY2FuXG5cblx0XHRcdFx0Ly8gYmluYXJ5IHNlYXJjaFxuXG5cdFx0XHRcdHdoaWxlICggaTEgPCByaWdodCApIHtcblxuXHRcdFx0XHRcdHZhciBtaWQgPSAoIGkxICsgcmlnaHQgKSA+Pj4gMTtcblxuXHRcdFx0XHRcdGlmICggdCA8IHBwWyBtaWQgXSApIHtcblxuXHRcdFx0XHRcdFx0cmlnaHQgPSBtaWQ7XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRpMSA9IG1pZCArIDE7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHQxID0gcHBbICAgaTEgICBdO1xuXHRcdFx0XHR0MCA9IHBwWyBpMSAtIDEgXTtcblxuXHRcdFx0XHQvLyBjaGVjayBib3VuZGFyeSBjYXNlcywgYWdhaW5cblxuXHRcdFx0XHRpZiAoIHQwID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHR0aGlzLl9jYWNoZWRJbmRleCA9IDA7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuYmVmb3JlU3RhcnRfKCAwLCB0LCB0MSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIHQxID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRpMSA9IHBwLmxlbmd0aDtcblx0XHRcdFx0XHR0aGlzLl9jYWNoZWRJbmRleCA9IGkxO1xuXHRcdFx0XHRcdHJldHVybiB0aGlzLmFmdGVyRW5kXyggaTEgLSAxLCB0MCwgdCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSAvLyBzZWVrXG5cblx0XHRcdHRoaXMuX2NhY2hlZEluZGV4ID0gaTE7XG5cblx0XHRcdHRoaXMuaW50ZXJ2YWxDaGFuZ2VkXyggaTEsIHQwLCB0MSApO1xuXG5cdFx0fSAvLyB2YWxpZGF0ZV9pbnRlcnZhbFxuXG5cdFx0cmV0dXJuIHRoaXMuaW50ZXJwb2xhdGVfKCBpMSwgdDAsIHQsIHQxICk7XG5cblx0fSxcblxuXHRzZXR0aW5nczogbnVsbCwgLy8gb3B0aW9uYWwsIHN1YmNsYXNzLXNwZWNpZmljIHNldHRpbmdzIHN0cnVjdHVyZVxuXHQvLyBOb3RlOiBUaGUgaW5kaXJlY3Rpb24gYWxsb3dzIGNlbnRyYWwgY29udHJvbCBvZiBtYW55IGludGVycG9sYW50cy5cblxuXHQvLyAtLS0gUHJvdGVjdGVkIGludGVyZmFjZVxuXG5cdERlZmF1bHRTZXR0aW5nc186IHt9LFxuXG5cdGdldFNldHRpbmdzXzogZnVuY3Rpb24oKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5zZXR0aW5ncyB8fCB0aGlzLkRlZmF1bHRTZXR0aW5nc187XG5cblx0fSxcblxuXHRjb3B5U2FtcGxlVmFsdWVfOiBmdW5jdGlvbiggaW5kZXggKSB7XG5cblx0XHQvLyBjb3BpZXMgYSBzYW1wbGUgdmFsdWUgdG8gdGhlIHJlc3VsdCBidWZmZXJcblxuXHRcdHZhciByZXN1bHQgPSB0aGlzLnJlc3VsdEJ1ZmZlcixcblx0XHRcdHZhbHVlcyA9IHRoaXMuc2FtcGxlVmFsdWVzLFxuXHRcdFx0c3RyaWRlID0gdGhpcy52YWx1ZVNpemUsXG5cdFx0XHRvZmZzZXQgPSBpbmRleCAqIHN0cmlkZTtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSAhPT0gc3RyaWRlOyArKyBpICkge1xuXG5cdFx0XHRyZXN1bHRbIGkgXSA9IHZhbHVlc1sgb2Zmc2V0ICsgaSBdO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblxuXHR9LFxuXG5cdC8vIFRlbXBsYXRlIG1ldGhvZHMgZm9yIGRlcml2ZWQgY2xhc3NlczpcblxuXHRpbnRlcnBvbGF0ZV86IGZ1bmN0aW9uKCBpMSwgdDAsIHQsIHQxICkge1xuXG5cdFx0dGhyb3cgbmV3IEVycm9yKCBcImNhbGwgdG8gYWJzdHJhY3QgbWV0aG9kXCIgKTtcblx0XHQvLyBpbXBsZW1lbnRhdGlvbnMgc2hhbGwgcmV0dXJuIHRoaXMucmVzdWx0QnVmZmVyXG5cblx0fSxcblxuXHRpbnRlcnZhbENoYW5nZWRfOiBmdW5jdGlvbiggaTEsIHQwLCB0MSApIHtcblxuXHRcdC8vIGVtcHR5XG5cblx0fVxuXG59ICk7XG5cbi8vIVxcIERFQ0xBUkUgQUxJQVMgQUZURVIgYXNzaWduIHByb3RvdHlwZSAhXG5PYmplY3QuYXNzaWduKCBJbnRlcnBvbGFudC5wcm90b3R5cGUsIHtcblxuXHQvLyggMCwgdCwgdDAgKSwgcmV0dXJucyB0aGlzLnJlc3VsdEJ1ZmZlclxuXHRiZWZvcmVTdGFydF86IEludGVycG9sYW50LnByb3RvdHlwZS5jb3B5U2FtcGxlVmFsdWVfLFxuXG5cdC8vKCBOLTEsIHROLTEsIHQgKSwgcmV0dXJucyB0aGlzLnJlc3VsdEJ1ZmZlclxuXHRhZnRlckVuZF86IEludGVycG9sYW50LnByb3RvdHlwZS5jb3B5U2FtcGxlVmFsdWVfLFxuXG59ICk7XG5cbi8qKlxuICogRmFzdCBhbmQgc2ltcGxlIGN1YmljIHNwbGluZSBpbnRlcnBvbGFudC5cbiAqXG4gKiBJdCB3YXMgZGVyaXZlZCBmcm9tIGEgSGVybWl0aWFuIGNvbnN0cnVjdGlvbiBzZXR0aW5nIHRoZSBmaXJzdCBkZXJpdmF0aXZlXG4gKiBhdCBlYWNoIHNhbXBsZSBwb3NpdGlvbiB0byB0aGUgbGluZWFyIHNsb3BlIGJldHdlZW4gbmVpZ2hib3JpbmcgcG9zaXRpb25zXG4gKiBvdmVyIHRoZWlyIHBhcmFtZXRlciBpbnRlcnZhbC5cbiAqXG4gKiBAYXV0aG9yIHRzY2h3XG4gKi9cblxuZnVuY3Rpb24gQ3ViaWNJbnRlcnBvbGFudCggcGFyYW1ldGVyUG9zaXRpb25zLCBzYW1wbGVWYWx1ZXMsIHNhbXBsZVNpemUsIHJlc3VsdEJ1ZmZlciApIHtcblxuXHRJbnRlcnBvbGFudC5jYWxsKFxuXHRcdFx0dGhpcywgcGFyYW1ldGVyUG9zaXRpb25zLCBzYW1wbGVWYWx1ZXMsIHNhbXBsZVNpemUsIHJlc3VsdEJ1ZmZlciApO1xuXG5cdHRoaXMuX3dlaWdodFByZXYgPSAtMDtcblx0dGhpcy5fb2Zmc2V0UHJldiA9IC0wO1xuXHR0aGlzLl93ZWlnaHROZXh0ID0gLTA7XG5cdHRoaXMuX29mZnNldE5leHQgPSAtMDtcblxufVxuXG5DdWJpY0ludGVycG9sYW50LnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEludGVycG9sYW50LnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IEN1YmljSW50ZXJwb2xhbnQsXG5cblx0RGVmYXVsdFNldHRpbmdzXzoge1xuXG5cdFx0ZW5kaW5nU3RhcnQ6IFx0WmVyb0N1cnZhdHVyZUVuZGluZyxcblx0XHRlbmRpbmdFbmQ6XHRcdFplcm9DdXJ2YXR1cmVFbmRpbmdcblxuXHR9LFxuXG5cdGludGVydmFsQ2hhbmdlZF86IGZ1bmN0aW9uKCBpMSwgdDAsIHQxICkge1xuXG5cdFx0dmFyIHBwID0gdGhpcy5wYXJhbWV0ZXJQb3NpdGlvbnMsXG5cdFx0XHRpUHJldiA9IGkxIC0gMixcblx0XHRcdGlOZXh0ID0gaTEgKyAxLFxuXG5cdFx0XHR0UHJldiA9IHBwWyBpUHJldiBdLFxuXHRcdFx0dE5leHQgPSBwcFsgaU5leHQgXTtcblxuXHRcdGlmICggdFByZXYgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0c3dpdGNoICggdGhpcy5nZXRTZXR0aW5nc18oKS5lbmRpbmdTdGFydCApIHtcblxuXHRcdFx0XHRjYXNlIFplcm9TbG9wZUVuZGluZzpcblxuXHRcdFx0XHRcdC8vIGYnKHQwKSA9IDBcblx0XHRcdFx0XHRpUHJldiA9IGkxO1xuXHRcdFx0XHRcdHRQcmV2ID0gMiAqIHQwIC0gdDE7XG5cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlIFdyYXBBcm91bmRFbmRpbmc6XG5cblx0XHRcdFx0XHQvLyB1c2UgdGhlIG90aGVyIGVuZCBvZiB0aGUgY3VydmVcblx0XHRcdFx0XHRpUHJldiA9IHBwLmxlbmd0aCAtIDI7XG5cdFx0XHRcdFx0dFByZXYgPSB0MCArIHBwWyBpUHJldiBdIC0gcHBbIGlQcmV2ICsgMSBdO1xuXG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0ZGVmYXVsdDogLy8gWmVyb0N1cnZhdHVyZUVuZGluZ1xuXG5cdFx0XHRcdFx0Ly8gZicnKHQwKSA9IDAgYS5rLmEuIE5hdHVyYWwgU3BsaW5lXG5cdFx0XHRcdFx0aVByZXYgPSBpMTtcblx0XHRcdFx0XHR0UHJldiA9IHQxO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIHROZXh0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHN3aXRjaCAoIHRoaXMuZ2V0U2V0dGluZ3NfKCkuZW5kaW5nRW5kICkge1xuXG5cdFx0XHRcdGNhc2UgWmVyb1Nsb3BlRW5kaW5nOlxuXG5cdFx0XHRcdFx0Ly8gZicodE4pID0gMFxuXHRcdFx0XHRcdGlOZXh0ID0gaTE7XG5cdFx0XHRcdFx0dE5leHQgPSAyICogdDEgLSB0MDtcblxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgV3JhcEFyb3VuZEVuZGluZzpcblxuXHRcdFx0XHRcdC8vIHVzZSB0aGUgb3RoZXIgZW5kIG9mIHRoZSBjdXJ2ZVxuXHRcdFx0XHRcdGlOZXh0ID0gMTtcblx0XHRcdFx0XHR0TmV4dCA9IHQxICsgcHBbIDEgXSAtIHBwWyAwIF07XG5cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRkZWZhdWx0OiAvLyBaZXJvQ3VydmF0dXJlRW5kaW5nXG5cblx0XHRcdFx0XHQvLyBmJycodE4pID0gMCwgYS5rLmEuIE5hdHVyYWwgU3BsaW5lXG5cdFx0XHRcdFx0aU5leHQgPSBpMSAtIDE7XG5cdFx0XHRcdFx0dE5leHQgPSB0MDtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0dmFyIGhhbGZEdCA9ICggdDEgLSB0MCApICogMC41LFxuXHRcdFx0c3RyaWRlID0gdGhpcy52YWx1ZVNpemU7XG5cblx0XHR0aGlzLl93ZWlnaHRQcmV2ID0gaGFsZkR0IC8gKCB0MCAtIHRQcmV2ICk7XG5cdFx0dGhpcy5fd2VpZ2h0TmV4dCA9IGhhbGZEdCAvICggdE5leHQgLSB0MSApO1xuXHRcdHRoaXMuX29mZnNldFByZXYgPSBpUHJldiAqIHN0cmlkZTtcblx0XHR0aGlzLl9vZmZzZXROZXh0ID0gaU5leHQgKiBzdHJpZGU7XG5cblx0fSxcblxuXHRpbnRlcnBvbGF0ZV86IGZ1bmN0aW9uKCBpMSwgdDAsIHQsIHQxICkge1xuXG5cdFx0dmFyIHJlc3VsdCA9IHRoaXMucmVzdWx0QnVmZmVyLFxuXHRcdFx0dmFsdWVzID0gdGhpcy5zYW1wbGVWYWx1ZXMsXG5cdFx0XHRzdHJpZGUgPSB0aGlzLnZhbHVlU2l6ZSxcblxuXHRcdFx0bzEgPSBpMSAqIHN0cmlkZSxcdFx0bzAgPSBvMSAtIHN0cmlkZSxcblx0XHRcdG9QID0gdGhpcy5fb2Zmc2V0UHJldiwgXHRvTiA9IHRoaXMuX29mZnNldE5leHQsXG5cdFx0XHR3UCA9IHRoaXMuX3dlaWdodFByZXYsXHR3TiA9IHRoaXMuX3dlaWdodE5leHQsXG5cblx0XHRcdHAgPSAoIHQgLSB0MCApIC8gKCB0MSAtIHQwICksXG5cdFx0XHRwcCA9IHAgKiBwLFxuXHRcdFx0cHBwID0gcHAgKiBwO1xuXG5cdFx0Ly8gZXZhbHVhdGUgcG9seW5vbWlhbHNcblxuXHRcdHZhciBzUCA9ICAgICAtIHdQICAgKiBwcHAgICArICAgICAgICAgMiAqIHdQICAgICogcHAgICAgLSAgICAgICAgICB3UCAgICogcDtcblx0XHR2YXIgczAgPSAoIDEgKyB3UCApICogcHBwICAgKyAoLTEuNSAtIDIgKiB3UCApICAqIHBwICAgICsgKCAtMC41ICsgd1AgKSAqIHAgICAgICsgMTtcblx0XHR2YXIgczEgPSAoLTEgLSB3TiApICogcHBwICAgKyAoIDEuNSArICAgd04gICApICAqIHBwICAgICsgICAgMC41ICAgICAgICAqIHA7XG5cdFx0dmFyIHNOID0gICAgICAgd04gICAqIHBwcCAgIC0gICAgICAgICAgIHdOICAgICAgKiBwcDtcblxuXHRcdC8vIGNvbWJpbmUgZGF0YSBsaW5lYXJseVxuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpICE9PSBzdHJpZGU7ICsrIGkgKSB7XG5cblx0XHRcdHJlc3VsdFsgaSBdID1cblx0XHRcdFx0XHRzUCAqIHZhbHVlc1sgb1AgKyBpIF0gK1xuXHRcdFx0XHRcdHMwICogdmFsdWVzWyBvMCArIGkgXSArXG5cdFx0XHRcdFx0czEgKiB2YWx1ZXNbIG8xICsgaSBdICtcblx0XHRcdFx0XHRzTiAqIHZhbHVlc1sgb04gKyBpIF07XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgdHNjaHdcbiAqL1xuXG5mdW5jdGlvbiBMaW5lYXJJbnRlcnBvbGFudCggcGFyYW1ldGVyUG9zaXRpb25zLCBzYW1wbGVWYWx1ZXMsIHNhbXBsZVNpemUsIHJlc3VsdEJ1ZmZlciApIHtcblxuXHRJbnRlcnBvbGFudC5jYWxsKCB0aGlzLCBwYXJhbWV0ZXJQb3NpdGlvbnMsIHNhbXBsZVZhbHVlcywgc2FtcGxlU2l6ZSwgcmVzdWx0QnVmZmVyICk7XG5cbn1cblxuTGluZWFySW50ZXJwb2xhbnQucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggSW50ZXJwb2xhbnQucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogTGluZWFySW50ZXJwb2xhbnQsXG5cblx0aW50ZXJwb2xhdGVfOiBmdW5jdGlvbiggaTEsIHQwLCB0LCB0MSApIHtcblxuXHRcdHZhciByZXN1bHQgPSB0aGlzLnJlc3VsdEJ1ZmZlcixcblx0XHRcdHZhbHVlcyA9IHRoaXMuc2FtcGxlVmFsdWVzLFxuXHRcdFx0c3RyaWRlID0gdGhpcy52YWx1ZVNpemUsXG5cblx0XHRcdG9mZnNldDEgPSBpMSAqIHN0cmlkZSxcblx0XHRcdG9mZnNldDAgPSBvZmZzZXQxIC0gc3RyaWRlLFxuXG5cdFx0XHR3ZWlnaHQxID0gKCB0IC0gdDAgKSAvICggdDEgLSB0MCApLFxuXHRcdFx0d2VpZ2h0MCA9IDEgLSB3ZWlnaHQxO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpICE9PSBzdHJpZGU7ICsrIGkgKSB7XG5cblx0XHRcdHJlc3VsdFsgaSBdID1cblx0XHRcdFx0XHR2YWx1ZXNbIG9mZnNldDAgKyBpIF0gKiB3ZWlnaHQwICtcblx0XHRcdFx0XHR2YWx1ZXNbIG9mZnNldDEgKyBpIF0gKiB3ZWlnaHQxO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKlxuICogSW50ZXJwb2xhbnQgdGhhdCBldmFsdWF0ZXMgdG8gdGhlIHNhbXBsZSB2YWx1ZSBhdCB0aGUgcG9zaXRpb24gcHJlY2VlZGluZ1xuICogdGhlIHBhcmFtZXRlci5cbiAqXG4gKiBAYXV0aG9yIHRzY2h3XG4gKi9cblxuZnVuY3Rpb24gRGlzY3JldGVJbnRlcnBvbGFudCggcGFyYW1ldGVyUG9zaXRpb25zLCBzYW1wbGVWYWx1ZXMsIHNhbXBsZVNpemUsIHJlc3VsdEJ1ZmZlciApIHtcblxuXHRJbnRlcnBvbGFudC5jYWxsKCB0aGlzLCBwYXJhbWV0ZXJQb3NpdGlvbnMsIHNhbXBsZVZhbHVlcywgc2FtcGxlU2l6ZSwgcmVzdWx0QnVmZmVyICk7XG5cbn1cblxuRGlzY3JldGVJbnRlcnBvbGFudC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBJbnRlcnBvbGFudC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBEaXNjcmV0ZUludGVycG9sYW50LFxuXG5cdGludGVycG9sYXRlXzogZnVuY3Rpb24oIGkxLCB0MCwgdCwgdDEgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5jb3B5U2FtcGxlVmFsdWVfKCBpMSAtIDEgKTtcblxuXHR9XG5cbn0gKTtcblxudmFyIEtleWZyYW1lVHJhY2tQcm90b3R5cGU7XG5cbktleWZyYW1lVHJhY2tQcm90b3R5cGUgPSB7XG5cblx0VGltZUJ1ZmZlclR5cGU6IEZsb2F0MzJBcnJheSxcblx0VmFsdWVCdWZmZXJUeXBlOiBGbG9hdDMyQXJyYXksXG5cblx0RGVmYXVsdEludGVycG9sYXRpb246IEludGVycG9sYXRlTGluZWFyLFxuXG5cdEludGVycG9sYW50RmFjdG9yeU1ldGhvZERpc2NyZXRlOiBmdW5jdGlvbiAoIHJlc3VsdCApIHtcblxuXHRcdHJldHVybiBuZXcgRGlzY3JldGVJbnRlcnBvbGFudChcblx0XHRcdFx0dGhpcy50aW1lcywgdGhpcy52YWx1ZXMsIHRoaXMuZ2V0VmFsdWVTaXplKCksIHJlc3VsdCApO1xuXG5cdH0sXG5cblx0SW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kTGluZWFyOiBmdW5jdGlvbiAoIHJlc3VsdCApIHtcblxuXHRcdHJldHVybiBuZXcgTGluZWFySW50ZXJwb2xhbnQoXG5cdFx0XHRcdHRoaXMudGltZXMsIHRoaXMudmFsdWVzLCB0aGlzLmdldFZhbHVlU2l6ZSgpLCByZXN1bHQgKTtcblxuXHR9LFxuXG5cdEludGVycG9sYW50RmFjdG9yeU1ldGhvZFNtb290aDogZnVuY3Rpb24gKCByZXN1bHQgKSB7XG5cblx0XHRyZXR1cm4gbmV3IEN1YmljSW50ZXJwb2xhbnQoXG5cdFx0XHRcdHRoaXMudGltZXMsIHRoaXMudmFsdWVzLCB0aGlzLmdldFZhbHVlU2l6ZSgpLCByZXN1bHQgKTtcblxuXHR9LFxuXG5cdHNldEludGVycG9sYXRpb246IGZ1bmN0aW9uICggaW50ZXJwb2xhdGlvbiApIHtcblxuXHRcdHZhciBmYWN0b3J5TWV0aG9kO1xuXG5cdFx0c3dpdGNoICggaW50ZXJwb2xhdGlvbiApIHtcblxuXHRcdFx0Y2FzZSBJbnRlcnBvbGF0ZURpc2NyZXRlOlxuXG5cdFx0XHRcdGZhY3RvcnlNZXRob2QgPSB0aGlzLkludGVycG9sYW50RmFjdG9yeU1ldGhvZERpc2NyZXRlO1xuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIEludGVycG9sYXRlTGluZWFyOlxuXG5cdFx0XHRcdGZhY3RvcnlNZXRob2QgPSB0aGlzLkludGVycG9sYW50RmFjdG9yeU1ldGhvZExpbmVhcjtcblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBJbnRlcnBvbGF0ZVNtb290aDpcblxuXHRcdFx0XHRmYWN0b3J5TWV0aG9kID0gdGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGg7XG5cblx0XHRcdFx0YnJlYWs7XG5cblx0XHR9XG5cblx0XHRpZiAoIGZhY3RvcnlNZXRob2QgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dmFyIG1lc3NhZ2UgPSBcInVuc3VwcG9ydGVkIGludGVycG9sYXRpb24gZm9yIFwiICtcblx0XHRcdFx0XHR0aGlzLlZhbHVlVHlwZU5hbWUgKyBcIiBrZXlmcmFtZSB0cmFjayBuYW1lZCBcIiArIHRoaXMubmFtZTtcblxuXHRcdFx0aWYgKCB0aGlzLmNyZWF0ZUludGVycG9sYW50ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Ly8gZmFsbCBiYWNrIHRvIGRlZmF1bHQsIHVubGVzcyB0aGUgZGVmYXVsdCBpdHNlbGYgaXMgbWVzc2VkIHVwXG5cdFx0XHRcdGlmICggaW50ZXJwb2xhdGlvbiAhPT0gdGhpcy5EZWZhdWx0SW50ZXJwb2xhdGlvbiApIHtcblxuXHRcdFx0XHRcdHRoaXMuc2V0SW50ZXJwb2xhdGlvbiggdGhpcy5EZWZhdWx0SW50ZXJwb2xhdGlvbiApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoIG1lc3NhZ2UgKTsgLy8gZmF0YWwsIGluIHRoaXMgY2FzZVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRjb25zb2xlLndhcm4oIG1lc3NhZ2UgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdHRoaXMuY3JlYXRlSW50ZXJwb2xhbnQgPSBmYWN0b3J5TWV0aG9kO1xuXG5cdH0sXG5cblx0Z2V0SW50ZXJwb2xhdGlvbjogZnVuY3Rpb24gKCkge1xuXG5cdFx0c3dpdGNoICggdGhpcy5jcmVhdGVJbnRlcnBvbGFudCApIHtcblxuXHRcdFx0Y2FzZSB0aGlzLkludGVycG9sYW50RmFjdG9yeU1ldGhvZERpc2NyZXRlOlxuXG5cdFx0XHRcdHJldHVybiBJbnRlcnBvbGF0ZURpc2NyZXRlO1xuXG5cdFx0XHRjYXNlIHRoaXMuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kTGluZWFyOlxuXG5cdFx0XHRcdHJldHVybiBJbnRlcnBvbGF0ZUxpbmVhcjtcblxuXHRcdFx0Y2FzZSB0aGlzLkludGVycG9sYW50RmFjdG9yeU1ldGhvZFNtb290aDpcblxuXHRcdFx0XHRyZXR1cm4gSW50ZXJwb2xhdGVTbW9vdGg7XG5cblx0XHR9XG5cblx0fSxcblxuXHRnZXRWYWx1ZVNpemU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLnZhbHVlcy5sZW5ndGggLyB0aGlzLnRpbWVzLmxlbmd0aDtcblxuXHR9LFxuXG5cdC8vIG1vdmUgYWxsIGtleWZyYW1lcyBlaXRoZXIgZm9yd2FyZHMgb3IgYmFja3dhcmRzIGluIHRpbWVcblx0c2hpZnQ6IGZ1bmN0aW9uICggdGltZU9mZnNldCApIHtcblxuXHRcdGlmICggdGltZU9mZnNldCAhPT0gMC4wICkge1xuXG5cdFx0XHR2YXIgdGltZXMgPSB0aGlzLnRpbWVzO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIG4gPSB0aW1lcy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRcdFx0dGltZXNbIGkgXSArPSB0aW1lT2Zmc2V0O1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdC8vIHNjYWxlIGFsbCBrZXlmcmFtZSB0aW1lcyBieSBhIGZhY3RvciAodXNlZnVsIGZvciBmcmFtZSA8LT4gc2Vjb25kcyBjb252ZXJzaW9ucylcblx0c2NhbGU6IGZ1bmN0aW9uICggdGltZVNjYWxlICkge1xuXG5cdFx0aWYgKCB0aW1lU2NhbGUgIT09IDEuMCApIHtcblxuXHRcdFx0dmFyIHRpbWVzID0gdGhpcy50aW1lcztcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBuID0gdGltZXMubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHRcdHRpbWVzWyBpIF0gKj0gdGltZVNjYWxlO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdC8vIHJlbW92ZXMga2V5ZnJhbWVzIGJlZm9yZSBhbmQgYWZ0ZXIgYW5pbWF0aW9uIHdpdGhvdXQgY2hhbmdpbmcgYW55IHZhbHVlcyB3aXRoaW4gdGhlIHJhbmdlIFtzdGFydFRpbWUsIGVuZFRpbWVdLlxuXHQvLyBJTVBPUlRBTlQ6IFdlIGRvIG5vdCBzaGlmdCBhcm91bmQga2V5cyB0byB0aGUgc3RhcnQgb2YgdGhlIHRyYWNrIHRpbWUsIGJlY2F1c2UgZm9yIGludGVycG9sYXRlZCBrZXlzIHRoaXMgd2lsbCBjaGFuZ2UgdGhlaXIgdmFsdWVzXG5cdHRyaW06IGZ1bmN0aW9uICggc3RhcnRUaW1lLCBlbmRUaW1lICkge1xuXG5cdFx0dmFyIHRpbWVzID0gdGhpcy50aW1lcyxcblx0XHRcdG5LZXlzID0gdGltZXMubGVuZ3RoLFxuXHRcdFx0ZnJvbSA9IDAsXG5cdFx0XHR0byA9IG5LZXlzIC0gMTtcblxuXHRcdHdoaWxlICggZnJvbSAhPT0gbktleXMgJiYgdGltZXNbIGZyb20gXSA8IHN0YXJ0VGltZSApICsrIGZyb207XG5cdFx0d2hpbGUgKCB0byAhPT0gLSAxICYmIHRpbWVzWyB0byBdID4gZW5kVGltZSApIC0tIHRvO1xuXG5cdFx0KysgdG87IC8vIGluY2x1c2l2ZSAtPiBleGNsdXNpdmUgYm91bmRcblxuXHRcdGlmICggZnJvbSAhPT0gMCB8fCB0byAhPT0gbktleXMgKSB7XG5cblx0XHRcdC8vIGVtcHR5IHRyYWNrcyBhcmUgZm9yYmlkZGVuLCBzbyBrZWVwIGF0IGxlYXN0IG9uZSBrZXlmcmFtZVxuXHRcdFx0aWYgKCBmcm9tID49IHRvICkgdG8gPSBNYXRoLm1heCggdG8sIDEgKSwgZnJvbSA9IHRvIC0gMTtcblxuXHRcdFx0dmFyIHN0cmlkZSA9IHRoaXMuZ2V0VmFsdWVTaXplKCk7XG5cdFx0XHR0aGlzLnRpbWVzID0gQW5pbWF0aW9uVXRpbHMuYXJyYXlTbGljZSggdGltZXMsIGZyb20sIHRvICk7XG5cdFx0XHR0aGlzLnZhbHVlcyA9IEFuaW1hdGlvblV0aWxzLlxuXHRcdFx0XHRcdGFycmF5U2xpY2UoIHRoaXMudmFsdWVzLCBmcm9tICogc3RyaWRlLCB0byAqIHN0cmlkZSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHQvLyBlbnN1cmUgd2UgZG8gbm90IGdldCBhIEdhcmJhZ2VJbkdhcmJhZ2VPdXQgc2l0dWF0aW9uLCBtYWtlIHN1cmUgdHJhY2tzIGFyZSBhdCBsZWFzdCBtaW5pbWFsbHkgdmlhYmxlXG5cdHZhbGlkYXRlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdmFsaWQgPSB0cnVlO1xuXG5cdFx0dmFyIHZhbHVlU2l6ZSA9IHRoaXMuZ2V0VmFsdWVTaXplKCk7XG5cdFx0aWYgKCB2YWx1ZVNpemUgLSBNYXRoLmZsb29yKCB2YWx1ZVNpemUgKSAhPT0gMCApIHtcblxuXHRcdFx0Y29uc29sZS5lcnJvciggXCJpbnZhbGlkIHZhbHVlIHNpemUgaW4gdHJhY2tcIiwgdGhpcyApO1xuXHRcdFx0dmFsaWQgPSBmYWxzZTtcblxuXHRcdH1cblxuXHRcdHZhciB0aW1lcyA9IHRoaXMudGltZXMsXG5cdFx0XHR2YWx1ZXMgPSB0aGlzLnZhbHVlcyxcblxuXHRcdFx0bktleXMgPSB0aW1lcy5sZW5ndGg7XG5cblx0XHRpZiAoIG5LZXlzID09PSAwICkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCBcInRyYWNrIGlzIGVtcHR5XCIsIHRoaXMgKTtcblx0XHRcdHZhbGlkID0gZmFsc2U7XG5cblx0XHR9XG5cblx0XHR2YXIgcHJldlRpbWUgPSBudWxsO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpICE9PSBuS2V5czsgaSArKyApIHtcblxuXHRcdFx0dmFyIGN1cnJUaW1lID0gdGltZXNbIGkgXTtcblxuXHRcdFx0aWYgKCB0eXBlb2YgY3VyclRpbWUgPT09ICdudW1iZXInICYmIGlzTmFOKCBjdXJyVGltZSApICkge1xuXG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoIFwidGltZSBpcyBub3QgYSB2YWxpZCBudW1iZXJcIiwgdGhpcywgaSwgY3VyclRpbWUgKTtcblx0XHRcdFx0dmFsaWQgPSBmYWxzZTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBwcmV2VGltZSAhPT0gbnVsbCAmJiBwcmV2VGltZSA+IGN1cnJUaW1lICkge1xuXG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoIFwib3V0IG9mIG9yZGVyIGtleXNcIiwgdGhpcywgaSwgY3VyclRpbWUsIHByZXZUaW1lICk7XG5cdFx0XHRcdHZhbGlkID0gZmFsc2U7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHR9XG5cblx0XHRcdHByZXZUaW1lID0gY3VyclRpbWU7XG5cblx0XHR9XG5cblx0XHRpZiAoIHZhbHVlcyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRpZiAoIEFuaW1hdGlvblV0aWxzLmlzVHlwZWRBcnJheSggdmFsdWVzICkgKSB7XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBuID0gdmFsdWVzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0XHRcdHZhciB2YWx1ZSA9IHZhbHVlc1sgaSBdO1xuXG5cdFx0XHRcdFx0aWYgKCBpc05hTiggdmFsdWUgKSApIHtcblxuXHRcdFx0XHRcdFx0Y29uc29sZS5lcnJvciggXCJ2YWx1ZSBpcyBub3QgYSB2YWxpZCBudW1iZXJcIiwgdGhpcywgaSwgdmFsdWUgKTtcblx0XHRcdFx0XHRcdHZhbGlkID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiB2YWxpZDtcblxuXHR9LFxuXG5cdC8vIHJlbW92ZXMgZXF1aXZhbGVudCBzZXF1ZW50aWFsIGtleXMgYXMgY29tbW9uIGluIG1vcnBoIHRhcmdldCBzZXF1ZW5jZXNcblx0Ly8gKDAsMCwwLDAsMSwxLDEsMCwwLDAsMCwwLDAsMCkgLS0+ICgwLDAsMSwxLDAsMClcblx0b3B0aW1pemU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciB0aW1lcyA9IHRoaXMudGltZXMsXG5cdFx0XHR2YWx1ZXMgPSB0aGlzLnZhbHVlcyxcblx0XHRcdHN0cmlkZSA9IHRoaXMuZ2V0VmFsdWVTaXplKCksXG5cblx0XHRcdHNtb290aEludGVycG9sYXRpb24gPSB0aGlzLmdldEludGVycG9sYXRpb24oKSA9PT0gSW50ZXJwb2xhdGVTbW9vdGgsXG5cblx0XHRcdHdyaXRlSW5kZXggPSAxLFxuXHRcdFx0bGFzdEluZGV4ID0gdGltZXMubGVuZ3RoIC0gMTtcblxuXHRcdGZvciAoIHZhciBpID0gMTsgaSA8IGxhc3RJbmRleDsgKysgaSApIHtcblxuXHRcdFx0dmFyIGtlZXAgPSBmYWxzZTtcblxuXHRcdFx0dmFyIHRpbWUgPSB0aW1lc1sgaSBdO1xuXHRcdFx0dmFyIHRpbWVOZXh0ID0gdGltZXNbIGkgKyAxIF07XG5cblx0XHRcdC8vIHJlbW92ZSBhZGphY2VudCBrZXlmcmFtZXMgc2NoZWR1bGVkIGF0IHRoZSBzYW1lIHRpbWVcblxuXHRcdFx0aWYgKCB0aW1lICE9PSB0aW1lTmV4dCAmJiAoIGkgIT09IDEgfHwgdGltZSAhPT0gdGltZVsgMCBdICkgKSB7XG5cblx0XHRcdFx0aWYgKCAhIHNtb290aEludGVycG9sYXRpb24gKSB7XG5cblx0XHRcdFx0XHQvLyByZW1vdmUgdW5uZWNlc3Nhcnkga2V5ZnJhbWVzIHNhbWUgYXMgdGhlaXIgbmVpZ2hib3JzXG5cblx0XHRcdFx0XHR2YXIgb2Zmc2V0ID0gaSAqIHN0cmlkZSxcblx0XHRcdFx0XHRcdG9mZnNldFAgPSBvZmZzZXQgLSBzdHJpZGUsXG5cdFx0XHRcdFx0XHRvZmZzZXROID0gb2Zmc2V0ICsgc3RyaWRlO1xuXG5cdFx0XHRcdFx0Zm9yICggdmFyIGogPSAwOyBqICE9PSBzdHJpZGU7ICsrIGogKSB7XG5cblx0XHRcdFx0XHRcdHZhciB2YWx1ZSA9IHZhbHVlc1sgb2Zmc2V0ICsgaiBdO1xuXG5cdFx0XHRcdFx0XHRpZiAoIHZhbHVlICE9PSB2YWx1ZXNbIG9mZnNldFAgKyBqIF0gfHxcblx0XHRcdFx0XHRcdFx0XHR2YWx1ZSAhPT0gdmFsdWVzWyBvZmZzZXROICsgaiBdICkge1xuXG5cdFx0XHRcdFx0XHRcdGtlZXAgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gZWxzZSBrZWVwID0gdHJ1ZTtcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBpbi1wbGFjZSBjb21wYWN0aW9uXG5cblx0XHRcdGlmICgga2VlcCApIHtcblxuXHRcdFx0XHRpZiAoIGkgIT09IHdyaXRlSW5kZXggKSB7XG5cblx0XHRcdFx0XHR0aW1lc1sgd3JpdGVJbmRleCBdID0gdGltZXNbIGkgXTtcblxuXHRcdFx0XHRcdHZhciByZWFkT2Zmc2V0ID0gaSAqIHN0cmlkZSxcblx0XHRcdFx0XHRcdHdyaXRlT2Zmc2V0ID0gd3JpdGVJbmRleCAqIHN0cmlkZTtcblxuXHRcdFx0XHRcdGZvciAoIHZhciBqID0gMDsgaiAhPT0gc3RyaWRlOyArKyBqIClcblxuXHRcdFx0XHRcdFx0dmFsdWVzWyB3cml0ZU9mZnNldCArIGogXSA9IHZhbHVlc1sgcmVhZE9mZnNldCArIGogXTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Kysgd3JpdGVJbmRleDtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gZmx1c2ggbGFzdCBrZXlmcmFtZSAoY29tcGFjdGlvbiBsb29rcyBhaGVhZClcblxuXHRcdGlmICggbGFzdEluZGV4ID4gMCApIHtcblxuXHRcdFx0dGltZXNbIHdyaXRlSW5kZXggXSA9IHRpbWVzWyBsYXN0SW5kZXggXTtcblxuXHRcdFx0Zm9yICggdmFyIHJlYWRPZmZzZXQgPSBsYXN0SW5kZXggKiBzdHJpZGUsIHdyaXRlT2Zmc2V0ID0gd3JpdGVJbmRleCAqIHN0cmlkZSwgaiA9IDA7IGogIT09IHN0cmlkZTsgKysgaiApXG5cblx0XHRcdFx0dmFsdWVzWyB3cml0ZU9mZnNldCArIGogXSA9IHZhbHVlc1sgcmVhZE9mZnNldCArIGogXTtcblxuXHRcdFx0Kysgd3JpdGVJbmRleDtcblxuXHRcdH1cblxuXHRcdGlmICggd3JpdGVJbmRleCAhPT0gdGltZXMubGVuZ3RoICkge1xuXG5cdFx0XHR0aGlzLnRpbWVzID0gQW5pbWF0aW9uVXRpbHMuYXJyYXlTbGljZSggdGltZXMsIDAsIHdyaXRlSW5kZXggKTtcblx0XHRcdHRoaXMudmFsdWVzID0gQW5pbWF0aW9uVXRpbHMuYXJyYXlTbGljZSggdmFsdWVzLCAwLCB3cml0ZUluZGV4ICogc3RyaWRlICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn07XG5cbmZ1bmN0aW9uIEtleWZyYW1lVHJhY2tDb25zdHJ1Y3RvciggbmFtZSwgdGltZXMsIHZhbHVlcywgaW50ZXJwb2xhdGlvbiApIHtcblxuXHRpZiAoIG5hbWUgPT09IHVuZGVmaW5lZCApIHRocm93IG5ldyBFcnJvciggXCJ0cmFjayBuYW1lIGlzIHVuZGVmaW5lZFwiICk7XG5cblx0aWYgKCB0aW1lcyA9PT0gdW5kZWZpbmVkIHx8IHRpbWVzLmxlbmd0aCA9PT0gMCApIHtcblxuXHRcdHRocm93IG5ldyBFcnJvciggXCJubyBrZXlmcmFtZXMgaW4gdHJhY2sgbmFtZWQgXCIgKyBuYW1lICk7XG5cblx0fVxuXG5cdHRoaXMubmFtZSA9IG5hbWU7XG5cblx0dGhpcy50aW1lcyA9IEFuaW1hdGlvblV0aWxzLmNvbnZlcnRBcnJheSggdGltZXMsIHRoaXMuVGltZUJ1ZmZlclR5cGUgKTtcblx0dGhpcy52YWx1ZXMgPSBBbmltYXRpb25VdGlscy5jb252ZXJ0QXJyYXkoIHZhbHVlcywgdGhpcy5WYWx1ZUJ1ZmZlclR5cGUgKTtcblxuXHR0aGlzLnNldEludGVycG9sYXRpb24oIGludGVycG9sYXRpb24gfHwgdGhpcy5EZWZhdWx0SW50ZXJwb2xhdGlvbiApO1xuXG5cdHRoaXMudmFsaWRhdGUoKTtcblx0dGhpcy5vcHRpbWl6ZSgpO1xuXG59XG5cbi8qKlxuICpcbiAqIEEgVHJhY2sgb2YgdmVjdG9yZWQga2V5ZnJhbWUgdmFsdWVzLlxuICpcbiAqXG4gKiBAYXV0aG9yIEJlbiBIb3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvL1xuICogQGF1dGhvciBEYXZpZCBTYXJubyAvIGh0dHA6Ly9saWdodGhhdXMudXMvXG4gKiBAYXV0aG9yIHRzY2h3XG4gKi9cblxuZnVuY3Rpb24gVmVjdG9yS2V5ZnJhbWVUcmFjayggbmFtZSwgdGltZXMsIHZhbHVlcywgaW50ZXJwb2xhdGlvbiApIHtcblxuXHRLZXlmcmFtZVRyYWNrQ29uc3RydWN0b3IuY2FsbCggdGhpcywgbmFtZSwgdGltZXMsIHZhbHVlcywgaW50ZXJwb2xhdGlvbiApO1xuXG59XG5cblZlY3RvcktleWZyYW1lVHJhY2sucHJvdG90eXBlID1cblx0XHRPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBLZXlmcmFtZVRyYWNrUHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogVmVjdG9yS2V5ZnJhbWVUcmFjayxcblxuXHRWYWx1ZVR5cGVOYW1lOiAndmVjdG9yJ1xuXG5cdC8vIFZhbHVlQnVmZmVyVHlwZSBpcyBpbmhlcml0ZWRcblxuXHQvLyBEZWZhdWx0SW50ZXJwb2xhdGlvbiBpcyBpbmhlcml0ZWRcblxufSApO1xuXG4vKipcbiAqIFNwaGVyaWNhbCBsaW5lYXIgdW5pdCBxdWF0ZXJuaW9uIGludGVycG9sYW50LlxuICpcbiAqIEBhdXRob3IgdHNjaHdcbiAqL1xuXG5mdW5jdGlvbiBRdWF0ZXJuaW9uTGluZWFySW50ZXJwb2xhbnQoIHBhcmFtZXRlclBvc2l0aW9ucywgc2FtcGxlVmFsdWVzLCBzYW1wbGVTaXplLCByZXN1bHRCdWZmZXIgKSB7XG5cblx0SW50ZXJwb2xhbnQuY2FsbCggdGhpcywgcGFyYW1ldGVyUG9zaXRpb25zLCBzYW1wbGVWYWx1ZXMsIHNhbXBsZVNpemUsIHJlc3VsdEJ1ZmZlciApO1xuXG59XG5cblF1YXRlcm5pb25MaW5lYXJJbnRlcnBvbGFudC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBJbnRlcnBvbGFudC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBRdWF0ZXJuaW9uTGluZWFySW50ZXJwb2xhbnQsXG5cblx0aW50ZXJwb2xhdGVfOiBmdW5jdGlvbiggaTEsIHQwLCB0LCB0MSApIHtcblxuXHRcdHZhciByZXN1bHQgPSB0aGlzLnJlc3VsdEJ1ZmZlcixcblx0XHRcdHZhbHVlcyA9IHRoaXMuc2FtcGxlVmFsdWVzLFxuXHRcdFx0c3RyaWRlID0gdGhpcy52YWx1ZVNpemUsXG5cblx0XHRcdG9mZnNldCA9IGkxICogc3RyaWRlLFxuXG5cdFx0XHRhbHBoYSA9ICggdCAtIHQwICkgLyAoIHQxIC0gdDAgKTtcblxuXHRcdGZvciAoIHZhciBlbmQgPSBvZmZzZXQgKyBzdHJpZGU7IG9mZnNldCAhPT0gZW5kOyBvZmZzZXQgKz0gNCApIHtcblxuXHRcdFx0UXVhdGVybmlvbi5zbGVycEZsYXQoIHJlc3VsdCwgMCxcblx0XHRcdFx0XHR2YWx1ZXMsIG9mZnNldCAtIHN0cmlkZSwgdmFsdWVzLCBvZmZzZXQsIGFscGhhICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqXG4gKiBBIFRyYWNrIG9mIHF1YXRlcm5pb24ga2V5ZnJhbWUgdmFsdWVzLlxuICpcbiAqIEBhdXRob3IgQmVuIEhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8vXG4gKiBAYXV0aG9yIERhdmlkIFNhcm5vIC8gaHR0cDovL2xpZ2h0aGF1cy51cy9cbiAqIEBhdXRob3IgdHNjaHdcbiAqL1xuXG5mdW5jdGlvbiBRdWF0ZXJuaW9uS2V5ZnJhbWVUcmFjayggbmFtZSwgdGltZXMsIHZhbHVlcywgaW50ZXJwb2xhdGlvbiApIHtcblxuXHRLZXlmcmFtZVRyYWNrQ29uc3RydWN0b3IuY2FsbCggdGhpcywgbmFtZSwgdGltZXMsIHZhbHVlcywgaW50ZXJwb2xhdGlvbiApO1xuXG59XG5cblF1YXRlcm5pb25LZXlmcmFtZVRyYWNrLnByb3RvdHlwZSA9XG5cdFx0T2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggS2V5ZnJhbWVUcmFja1Byb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IFF1YXRlcm5pb25LZXlmcmFtZVRyYWNrLFxuXG5cdFZhbHVlVHlwZU5hbWU6ICdxdWF0ZXJuaW9uJyxcblxuXHQvLyBWYWx1ZUJ1ZmZlclR5cGUgaXMgaW5oZXJpdGVkXG5cblx0RGVmYXVsdEludGVycG9sYXRpb246IEludGVycG9sYXRlTGluZWFyLFxuXG5cdEludGVycG9sYW50RmFjdG9yeU1ldGhvZExpbmVhcjogZnVuY3Rpb24oIHJlc3VsdCApIHtcblxuXHRcdHJldHVybiBuZXcgUXVhdGVybmlvbkxpbmVhckludGVycG9sYW50KFxuXHRcdFx0XHR0aGlzLnRpbWVzLCB0aGlzLnZhbHVlcywgdGhpcy5nZXRWYWx1ZVNpemUoKSwgcmVzdWx0ICk7XG5cblx0fSxcblxuXHRJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGg6IHVuZGVmaW5lZCAvLyBub3QgeWV0IGltcGxlbWVudGVkXG5cbn0gKTtcblxuLyoqXG4gKlxuICogQSBUcmFjayBvZiBudW1lcmljIGtleWZyYW1lIHZhbHVlcy5cbiAqXG4gKiBAYXV0aG9yIEJlbiBIb3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvL1xuICogQGF1dGhvciBEYXZpZCBTYXJubyAvIGh0dHA6Ly9saWdodGhhdXMudXMvXG4gKiBAYXV0aG9yIHRzY2h3XG4gKi9cblxuZnVuY3Rpb24gTnVtYmVyS2V5ZnJhbWVUcmFjayggbmFtZSwgdGltZXMsIHZhbHVlcywgaW50ZXJwb2xhdGlvbiApIHtcblxuXHRLZXlmcmFtZVRyYWNrQ29uc3RydWN0b3IuY2FsbCggdGhpcywgbmFtZSwgdGltZXMsIHZhbHVlcywgaW50ZXJwb2xhdGlvbiApO1xuXG59XG5cbk51bWJlcktleWZyYW1lVHJhY2sucHJvdG90eXBlID1cblx0XHRPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBLZXlmcmFtZVRyYWNrUHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogTnVtYmVyS2V5ZnJhbWVUcmFjayxcblxuXHRWYWx1ZVR5cGVOYW1lOiAnbnVtYmVyJ1xuXG5cdC8vIFZhbHVlQnVmZmVyVHlwZSBpcyBpbmhlcml0ZWRcblxuXHQvLyBEZWZhdWx0SW50ZXJwb2xhdGlvbiBpcyBpbmhlcml0ZWRcblxufSApO1xuXG4vKipcbiAqXG4gKiBBIFRyYWNrIHRoYXQgaW50ZXJwb2xhdGVzIFN0cmluZ3NcbiAqXG4gKlxuICogQGF1dGhvciBCZW4gSG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pby9cbiAqIEBhdXRob3IgRGF2aWQgU2Fybm8gLyBodHRwOi8vbGlnaHRoYXVzLnVzL1xuICogQGF1dGhvciB0c2Nod1xuICovXG5cbmZ1bmN0aW9uIFN0cmluZ0tleWZyYW1lVHJhY2soIG5hbWUsIHRpbWVzLCB2YWx1ZXMsIGludGVycG9sYXRpb24gKSB7XG5cblx0S2V5ZnJhbWVUcmFja0NvbnN0cnVjdG9yLmNhbGwoIHRoaXMsIG5hbWUsIHRpbWVzLCB2YWx1ZXMsIGludGVycG9sYXRpb24gKTtcblxufVxuXG5TdHJpbmdLZXlmcmFtZVRyYWNrLnByb3RvdHlwZSA9XG5cdFx0T2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggS2V5ZnJhbWVUcmFja1Byb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IFN0cmluZ0tleWZyYW1lVHJhY2ssXG5cblx0VmFsdWVUeXBlTmFtZTogJ3N0cmluZycsXG5cdFZhbHVlQnVmZmVyVHlwZTogQXJyYXksXG5cblx0RGVmYXVsdEludGVycG9sYXRpb246IEludGVycG9sYXRlRGlzY3JldGUsXG5cblx0SW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kTGluZWFyOiB1bmRlZmluZWQsXG5cblx0SW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kU21vb3RoOiB1bmRlZmluZWRcblxufSApO1xuXG4vKipcbiAqXG4gKiBBIFRyYWNrIG9mIEJvb2xlYW4ga2V5ZnJhbWUgdmFsdWVzLlxuICpcbiAqXG4gKiBAYXV0aG9yIEJlbiBIb3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvL1xuICogQGF1dGhvciBEYXZpZCBTYXJubyAvIGh0dHA6Ly9saWdodGhhdXMudXMvXG4gKiBAYXV0aG9yIHRzY2h3XG4gKi9cblxuZnVuY3Rpb24gQm9vbGVhbktleWZyYW1lVHJhY2soIG5hbWUsIHRpbWVzLCB2YWx1ZXMgKSB7XG5cblx0S2V5ZnJhbWVUcmFja0NvbnN0cnVjdG9yLmNhbGwoIHRoaXMsIG5hbWUsIHRpbWVzLCB2YWx1ZXMgKTtcblxufVxuXG5Cb29sZWFuS2V5ZnJhbWVUcmFjay5wcm90b3R5cGUgPVxuXHRcdE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEtleWZyYW1lVHJhY2tQcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBCb29sZWFuS2V5ZnJhbWVUcmFjayxcblxuXHRWYWx1ZVR5cGVOYW1lOiAnYm9vbCcsXG5cdFZhbHVlQnVmZmVyVHlwZTogQXJyYXksXG5cblx0RGVmYXVsdEludGVycG9sYXRpb246IEludGVycG9sYXRlRGlzY3JldGUsXG5cblx0SW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kTGluZWFyOiB1bmRlZmluZWQsXG5cdEludGVycG9sYW50RmFjdG9yeU1ldGhvZFNtb290aDogdW5kZWZpbmVkXG5cblx0Ly8gTm90ZTogQWN0dWFsbHkgdGhpcyB0cmFjayBjb3VsZCBoYXZlIGEgb3B0aW1pemVkIC8gY29tcHJlc3NlZFxuXHQvLyByZXByZXNlbnRhdGlvbiBvZiBhIHNpbmdsZSB2YWx1ZSBhbmQgYSBjdXN0b20gaW50ZXJwb2xhbnQgdGhhdFxuXHQvLyBjb21wdXRlcyBcImZpcnN0VmFsdWUgXiBpc09kZCggaW5kZXggKVwiLlxuXG59ICk7XG5cbi8qKlxuICpcbiAqIEEgVHJhY2sgb2Yga2V5ZnJhbWUgdmFsdWVzIHRoYXQgcmVwcmVzZW50IGNvbG9yLlxuICpcbiAqXG4gKiBAYXV0aG9yIEJlbiBIb3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvL1xuICogQGF1dGhvciBEYXZpZCBTYXJubyAvIGh0dHA6Ly9saWdodGhhdXMudXMvXG4gKiBAYXV0aG9yIHRzY2h3XG4gKi9cblxuZnVuY3Rpb24gQ29sb3JLZXlmcmFtZVRyYWNrKCBuYW1lLCB0aW1lcywgdmFsdWVzLCBpbnRlcnBvbGF0aW9uICkge1xuXG5cdEtleWZyYW1lVHJhY2tDb25zdHJ1Y3Rvci5jYWxsKCB0aGlzLCBuYW1lLCB0aW1lcywgdmFsdWVzLCBpbnRlcnBvbGF0aW9uICk7XG5cbn1cblxuQ29sb3JLZXlmcmFtZVRyYWNrLnByb3RvdHlwZSA9XG5cdFx0T2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggS2V5ZnJhbWVUcmFja1Byb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IENvbG9yS2V5ZnJhbWVUcmFjayxcblxuXHRWYWx1ZVR5cGVOYW1lOiAnY29sb3InXG5cblx0Ly8gVmFsdWVCdWZmZXJUeXBlIGlzIGluaGVyaXRlZFxuXG5cdC8vIERlZmF1bHRJbnRlcnBvbGF0aW9uIGlzIGluaGVyaXRlZFxuXG5cblx0Ly8gTm90ZTogVmVyeSBiYXNpYyBpbXBsZW1lbnRhdGlvbiBhbmQgbm90aGluZyBzcGVjaWFsIHlldC5cblx0Ly8gSG93ZXZlciwgdGhpcyBpcyB0aGUgcGxhY2UgZm9yIGNvbG9yIHNwYWNlIHBhcmFtZXRlcml6YXRpb24uXG5cbn0gKTtcblxuLyoqXG4gKlxuICogQSB0aW1lZCBzZXF1ZW5jZSBvZiBrZXlmcmFtZXMgZm9yIGEgc3BlY2lmaWMgcHJvcGVydHkuXG4gKlxuICpcbiAqIEBhdXRob3IgQmVuIEhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8vXG4gKiBAYXV0aG9yIERhdmlkIFNhcm5vIC8gaHR0cDovL2xpZ2h0aGF1cy51cy9cbiAqIEBhdXRob3IgdHNjaHdcbiAqL1xuXG5mdW5jdGlvbiBLZXlmcmFtZVRyYWNrKCBuYW1lLCB0aW1lcywgdmFsdWVzLCBpbnRlcnBvbGF0aW9uICkge1xuXG5cdEtleWZyYW1lVHJhY2tDb25zdHJ1Y3Rvci5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cbn1cblxuS2V5ZnJhbWVUcmFjay5wcm90b3R5cGUgPSBLZXlmcmFtZVRyYWNrUHJvdG90eXBlO1xuS2V5ZnJhbWVUcmFja1Byb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEtleWZyYW1lVHJhY2s7XG5cbi8vIFN0YXRpYyBtZXRob2RzOlxuXG5PYmplY3QuYXNzaWduKCBLZXlmcmFtZVRyYWNrLCB7XG5cblx0Ly8gU2VyaWFsaXphdGlvbiAoaW4gc3RhdGljIGNvbnRleHQsIGJlY2F1c2Ugb2YgY29uc3RydWN0b3IgaW52b2NhdGlvblxuXHQvLyBhbmQgYXV0b21hdGljIGludm9jYXRpb24gb2YgLnRvSlNPTik6XG5cblx0cGFyc2U6IGZ1bmN0aW9uKCBqc29uICkge1xuXG5cdFx0aWYoIGpzb24udHlwZSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoIFwidHJhY2sgdHlwZSB1bmRlZmluZWQsIGNhbiBub3QgcGFyc2VcIiApO1xuXG5cdFx0fVxuXG5cdFx0dmFyIHRyYWNrVHlwZSA9IEtleWZyYW1lVHJhY2suX2dldFRyYWNrVHlwZUZvclZhbHVlVHlwZU5hbWUoIGpzb24udHlwZSApO1xuXG5cdFx0aWYgKCBqc29uLnRpbWVzID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHZhciB0aW1lcyA9IFtdLCB2YWx1ZXMgPSBbXTtcblxuXHRcdFx0QW5pbWF0aW9uVXRpbHMuZmxhdHRlbkpTT04oIGpzb24ua2V5cywgdGltZXMsIHZhbHVlcywgJ3ZhbHVlJyApO1xuXG5cdFx0XHRqc29uLnRpbWVzID0gdGltZXM7XG5cdFx0XHRqc29uLnZhbHVlcyA9IHZhbHVlcztcblxuXHRcdH1cblxuXHRcdC8vIGRlcml2ZWQgY2xhc3NlcyBjYW4gZGVmaW5lIGEgc3RhdGljIHBhcnNlIG1ldGhvZFxuXHRcdGlmICggdHJhY2tUeXBlLnBhcnNlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHJldHVybiB0cmFja1R5cGUucGFyc2UoIGpzb24gKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIGJ5IGRlZmF1bHQsIHdlIGFzc3N1bWUgYSBjb25zdHJ1Y3RvciBjb21wYXRpYmxlIHdpdGggdGhlIGJhc2Vcblx0XHRcdHJldHVybiBuZXcgdHJhY2tUeXBlKFxuXHRcdFx0XHRcdGpzb24ubmFtZSwganNvbi50aW1lcywganNvbi52YWx1ZXMsIGpzb24uaW50ZXJwb2xhdGlvbiApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0dG9KU09OOiBmdW5jdGlvbiggdHJhY2sgKSB7XG5cblx0XHR2YXIgdHJhY2tUeXBlID0gdHJhY2suY29uc3RydWN0b3I7XG5cblx0XHR2YXIganNvbjtcblxuXHRcdC8vIGRlcml2ZWQgY2xhc3NlcyBjYW4gZGVmaW5lIGEgc3RhdGljIHRvSlNPTiBtZXRob2Rcblx0XHRpZiAoIHRyYWNrVHlwZS50b0pTT04gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0anNvbiA9IHRyYWNrVHlwZS50b0pTT04oIHRyYWNrICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBieSBkZWZhdWx0LCB3ZSBhc3N1bWUgdGhlIGRhdGEgY2FuIGJlIHNlcmlhbGl6ZWQgYXMtaXNcblx0XHRcdGpzb24gPSB7XG5cblx0XHRcdFx0J25hbWUnOiB0cmFjay5uYW1lLFxuXHRcdFx0XHQndGltZXMnOiBBbmltYXRpb25VdGlscy5jb252ZXJ0QXJyYXkoIHRyYWNrLnRpbWVzLCBBcnJheSApLFxuXHRcdFx0XHQndmFsdWVzJzogQW5pbWF0aW9uVXRpbHMuY29udmVydEFycmF5KCB0cmFjay52YWx1ZXMsIEFycmF5IClcblxuXHRcdFx0fTtcblxuXHRcdFx0dmFyIGludGVycG9sYXRpb24gPSB0cmFjay5nZXRJbnRlcnBvbGF0aW9uKCk7XG5cblx0XHRcdGlmICggaW50ZXJwb2xhdGlvbiAhPT0gdHJhY2suRGVmYXVsdEludGVycG9sYXRpb24gKSB7XG5cblx0XHRcdFx0anNvbi5pbnRlcnBvbGF0aW9uID0gaW50ZXJwb2xhdGlvbjtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0anNvbi50eXBlID0gdHJhY2suVmFsdWVUeXBlTmFtZTsgLy8gbWFuZGF0b3J5XG5cblx0XHRyZXR1cm4ganNvbjtcblxuXHR9LFxuXG5cdF9nZXRUcmFja1R5cGVGb3JWYWx1ZVR5cGVOYW1lOiBmdW5jdGlvbiggdHlwZU5hbWUgKSB7XG5cblx0XHRzd2l0Y2goIHR5cGVOYW1lLnRvTG93ZXJDYXNlKCkgKSB7XG5cblx0XHRcdGNhc2UgXCJzY2FsYXJcIjpcblx0XHRcdGNhc2UgXCJkb3VibGVcIjpcblx0XHRcdGNhc2UgXCJmbG9hdFwiOlxuXHRcdFx0Y2FzZSBcIm51bWJlclwiOlxuXHRcdFx0Y2FzZSBcImludGVnZXJcIjpcblxuXHRcdFx0XHRyZXR1cm4gTnVtYmVyS2V5ZnJhbWVUcmFjaztcblxuXHRcdFx0Y2FzZSBcInZlY3RvclwiOlxuXHRcdFx0Y2FzZSBcInZlY3RvcjJcIjpcblx0XHRcdGNhc2UgXCJ2ZWN0b3IzXCI6XG5cdFx0XHRjYXNlIFwidmVjdG9yNFwiOlxuXG5cdFx0XHRcdHJldHVybiBWZWN0b3JLZXlmcmFtZVRyYWNrO1xuXG5cdFx0XHRjYXNlIFwiY29sb3JcIjpcblxuXHRcdFx0XHRyZXR1cm4gQ29sb3JLZXlmcmFtZVRyYWNrO1xuXG5cdFx0XHRjYXNlIFwicXVhdGVybmlvblwiOlxuXG5cdFx0XHRcdHJldHVybiBRdWF0ZXJuaW9uS2V5ZnJhbWVUcmFjaztcblxuXHRcdFx0Y2FzZSBcImJvb2xcIjpcblx0XHRcdGNhc2UgXCJib29sZWFuXCI6XG5cblx0XHRcdFx0cmV0dXJuIEJvb2xlYW5LZXlmcmFtZVRyYWNrO1xuXG5cdFx0XHRjYXNlIFwic3RyaW5nXCI6XG5cblx0XHRcdFx0cmV0dXJuIFN0cmluZ0tleWZyYW1lVHJhY2s7XG5cblx0XHR9XG5cblx0XHR0aHJvdyBuZXcgRXJyb3IoIFwiVW5zdXBwb3J0ZWQgdHlwZU5hbWU6IFwiICsgdHlwZU5hbWUgKTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKlxuICogUmV1c2FibGUgc2V0IG9mIFRyYWNrcyB0aGF0IHJlcHJlc2VudCBhbiBhbmltYXRpb24uXG4gKlxuICogQGF1dGhvciBCZW4gSG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pby9cbiAqIEBhdXRob3IgRGF2aWQgU2Fybm8gLyBodHRwOi8vbGlnaHRoYXVzLnVzL1xuICovXG5cbmZ1bmN0aW9uIEFuaW1hdGlvbkNsaXAoIG5hbWUsIGR1cmF0aW9uLCB0cmFja3MgKSB7XG5cblx0dGhpcy5uYW1lID0gbmFtZTtcblx0dGhpcy50cmFja3MgPSB0cmFja3M7XG5cdHRoaXMuZHVyYXRpb24gPSAoIGR1cmF0aW9uICE9PSB1bmRlZmluZWQgKSA/IGR1cmF0aW9uIDogLSAxO1xuXG5cdHRoaXMudXVpZCA9IF9NYXRoLmdlbmVyYXRlVVVJRCgpO1xuXG5cdC8vIHRoaXMgbWVhbnMgaXQgc2hvdWxkIGZpZ3VyZSBvdXQgaXRzIGR1cmF0aW9uIGJ5IHNjYW5uaW5nIHRoZSB0cmFja3Ncblx0aWYgKCB0aGlzLmR1cmF0aW9uIDwgMCApIHtcblxuXHRcdHRoaXMucmVzZXREdXJhdGlvbigpO1xuXG5cdH1cblxuXHR0aGlzLm9wdGltaXplKCk7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggQW5pbWF0aW9uQ2xpcCwge1xuXG5cdHBhcnNlOiBmdW5jdGlvbiAoIGpzb24gKSB7XG5cblx0XHR2YXIgdHJhY2tzID0gW10sXG5cdFx0XHRqc29uVHJhY2tzID0ganNvbi50cmFja3MsXG5cdFx0XHRmcmFtZVRpbWUgPSAxLjAgLyAoIGpzb24uZnBzIHx8IDEuMCApO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBuID0ganNvblRyYWNrcy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRcdHRyYWNrcy5wdXNoKCBLZXlmcmFtZVRyYWNrLnBhcnNlKCBqc29uVHJhY2tzWyBpIF0gKS5zY2FsZSggZnJhbWVUaW1lICkgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBuZXcgQW5pbWF0aW9uQ2xpcCgganNvbi5uYW1lLCBqc29uLmR1cmF0aW9uLCB0cmFja3MgKTtcblxuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCBjbGlwICkge1xuXG5cdFx0dmFyIHRyYWNrcyA9IFtdLFxuXHRcdFx0Y2xpcFRyYWNrcyA9IGNsaXAudHJhY2tzO1xuXG5cdFx0dmFyIGpzb24gPSB7XG5cblx0XHRcdCduYW1lJzogY2xpcC5uYW1lLFxuXHRcdFx0J2R1cmF0aW9uJzogY2xpcC5kdXJhdGlvbixcblx0XHRcdCd0cmFja3MnOiB0cmFja3NcblxuXHRcdH07XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIG4gPSBjbGlwVHJhY2tzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0dHJhY2tzLnB1c2goIEtleWZyYW1lVHJhY2sudG9KU09OKCBjbGlwVHJhY2tzWyBpIF0gKSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGpzb247XG5cblx0fSxcblxuXHRDcmVhdGVGcm9tTW9ycGhUYXJnZXRTZXF1ZW5jZTogZnVuY3Rpb24gKCBuYW1lLCBtb3JwaFRhcmdldFNlcXVlbmNlLCBmcHMsIG5vTG9vcCApIHtcblxuXHRcdHZhciBudW1Nb3JwaFRhcmdldHMgPSBtb3JwaFRhcmdldFNlcXVlbmNlLmxlbmd0aDtcblx0XHR2YXIgdHJhY2tzID0gW107XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBudW1Nb3JwaFRhcmdldHM7IGkgKysgKSB7XG5cblx0XHRcdHZhciB0aW1lcyA9IFtdO1xuXHRcdFx0dmFyIHZhbHVlcyA9IFtdO1xuXG5cdFx0XHR0aW1lcy5wdXNoKFxuXHRcdFx0XHRcdCggaSArIG51bU1vcnBoVGFyZ2V0cyAtIDEgKSAlIG51bU1vcnBoVGFyZ2V0cyxcblx0XHRcdFx0XHRpLFxuXHRcdFx0XHRcdCggaSArIDEgKSAlIG51bU1vcnBoVGFyZ2V0cyApO1xuXG5cdFx0XHR2YWx1ZXMucHVzaCggMCwgMSwgMCApO1xuXG5cdFx0XHR2YXIgb3JkZXIgPSBBbmltYXRpb25VdGlscy5nZXRLZXlmcmFtZU9yZGVyKCB0aW1lcyApO1xuXHRcdFx0dGltZXMgPSBBbmltYXRpb25VdGlscy5zb3J0ZWRBcnJheSggdGltZXMsIDEsIG9yZGVyICk7XG5cdFx0XHR2YWx1ZXMgPSBBbmltYXRpb25VdGlscy5zb3J0ZWRBcnJheSggdmFsdWVzLCAxLCBvcmRlciApO1xuXG5cdFx0XHQvLyBpZiB0aGVyZSBpcyBhIGtleSBhdCB0aGUgZmlyc3QgZnJhbWUsIGR1cGxpY2F0ZSBpdCBhcyB0aGVcblx0XHRcdC8vIGxhc3QgZnJhbWUgYXMgd2VsbCBmb3IgcGVyZmVjdCBsb29wLlxuXHRcdFx0aWYgKCAhIG5vTG9vcCAmJiB0aW1lc1sgMCBdID09PSAwICkge1xuXG5cdFx0XHRcdHRpbWVzLnB1c2goIG51bU1vcnBoVGFyZ2V0cyApO1xuXHRcdFx0XHR2YWx1ZXMucHVzaCggdmFsdWVzWyAwIF0gKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0cmFja3MucHVzaChcblx0XHRcdFx0XHRuZXcgTnVtYmVyS2V5ZnJhbWVUcmFjayhcblx0XHRcdFx0XHRcdCcubW9ycGhUYXJnZXRJbmZsdWVuY2VzWycgKyBtb3JwaFRhcmdldFNlcXVlbmNlWyBpIF0ubmFtZSArICddJyxcblx0XHRcdFx0XHRcdHRpbWVzLCB2YWx1ZXNcblx0XHRcdFx0XHQpLnNjYWxlKCAxLjAgLyBmcHMgKSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIG5ldyBBbmltYXRpb25DbGlwKCBuYW1lLCAtIDEsIHRyYWNrcyApO1xuXG5cdH0sXG5cblx0ZmluZEJ5TmFtZTogZnVuY3Rpb24gKCBvYmplY3RPckNsaXBBcnJheSwgbmFtZSApIHtcblxuXHRcdHZhciBjbGlwQXJyYXkgPSBvYmplY3RPckNsaXBBcnJheTtcblxuXHRcdGlmICggISBBcnJheS5pc0FycmF5KCBvYmplY3RPckNsaXBBcnJheSApICkge1xuXG5cdFx0XHR2YXIgbyA9IG9iamVjdE9yQ2xpcEFycmF5O1xuXHRcdFx0Y2xpcEFycmF5ID0gby5nZW9tZXRyeSAmJiBvLmdlb21ldHJ5LmFuaW1hdGlvbnMgfHwgby5hbmltYXRpb25zO1xuXG5cdFx0fVxuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgY2xpcEFycmF5Lmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0aWYgKCBjbGlwQXJyYXlbIGkgXS5uYW1lID09PSBuYW1lICkge1xuXG5cdFx0XHRcdHJldHVybiBjbGlwQXJyYXlbIGkgXTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIG51bGw7XG5cblx0fSxcblxuXHRDcmVhdGVDbGlwc0Zyb21Nb3JwaFRhcmdldFNlcXVlbmNlczogZnVuY3Rpb24gKCBtb3JwaFRhcmdldHMsIGZwcywgbm9Mb29wICkge1xuXG5cdFx0dmFyIGFuaW1hdGlvblRvTW9ycGhUYXJnZXRzID0ge307XG5cblx0XHQvLyB0ZXN0ZWQgd2l0aCBodHRwczovL3JlZ2V4MTAxLmNvbS8gb24gdHJpY2sgc2VxdWVuY2VzXG5cdFx0Ly8gc3VjaCBmbGFtaW5nb19mbHlBXzAwMywgZmxhbWluZ29fcnVuMV8wMDMsIGNyZGVhdGgwMDU5XG5cdFx0dmFyIHBhdHRlcm4gPSAvXihbXFx3LV0qPykoW1xcZF0rKSQvO1xuXG5cdFx0Ly8gc29ydCBtb3JwaCB0YXJnZXQgbmFtZXMgaW50byBhbmltYXRpb24gZ3JvdXBzIGJhc2VkXG5cdFx0Ly8gcGF0dGVybnMgbGlrZSBXYWxrXzAwMSwgV2Fsa18wMDIsIFJ1bl8wMDEsIFJ1bl8wMDJcblx0XHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gbW9ycGhUYXJnZXRzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgbW9ycGhUYXJnZXQgPSBtb3JwaFRhcmdldHNbIGkgXTtcblx0XHRcdHZhciBwYXJ0cyA9IG1vcnBoVGFyZ2V0Lm5hbWUubWF0Y2goIHBhdHRlcm4gKTtcblxuXHRcdFx0aWYgKCBwYXJ0cyAmJiBwYXJ0cy5sZW5ndGggPiAxICkge1xuXG5cdFx0XHRcdHZhciBuYW1lID0gcGFydHNbIDEgXTtcblxuXHRcdFx0XHR2YXIgYW5pbWF0aW9uTW9ycGhUYXJnZXRzID0gYW5pbWF0aW9uVG9Nb3JwaFRhcmdldHNbIG5hbWUgXTtcblx0XHRcdFx0aWYgKCAhIGFuaW1hdGlvbk1vcnBoVGFyZ2V0cyApIHtcblxuXHRcdFx0XHRcdGFuaW1hdGlvblRvTW9ycGhUYXJnZXRzWyBuYW1lIF0gPSBhbmltYXRpb25Nb3JwaFRhcmdldHMgPSBbXTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0YW5pbWF0aW9uTW9ycGhUYXJnZXRzLnB1c2goIG1vcnBoVGFyZ2V0ICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHZhciBjbGlwcyA9IFtdO1xuXG5cdFx0Zm9yICggdmFyIG5hbWUgaW4gYW5pbWF0aW9uVG9Nb3JwaFRhcmdldHMgKSB7XG5cblx0XHRcdGNsaXBzLnB1c2goIEFuaW1hdGlvbkNsaXAuQ3JlYXRlRnJvbU1vcnBoVGFyZ2V0U2VxdWVuY2UoIG5hbWUsIGFuaW1hdGlvblRvTW9ycGhUYXJnZXRzWyBuYW1lIF0sIGZwcywgbm9Mb29wICkgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBjbGlwcztcblxuXHR9LFxuXG5cdC8vIHBhcnNlIHRoZSBhbmltYXRpb24uaGllcmFyY2h5IGZvcm1hdFxuXHRwYXJzZUFuaW1hdGlvbjogZnVuY3Rpb24gKCBhbmltYXRpb24sIGJvbmVzICkge1xuXG5cdFx0aWYgKCAhIGFuaW1hdGlvbiApIHtcblxuXHRcdFx0Y29uc29sZS5lcnJvciggXCIgIG5vIGFuaW1hdGlvbiBpbiBKU09OTG9hZGVyIGRhdGFcIiApO1xuXHRcdFx0cmV0dXJuIG51bGw7XG5cblx0XHR9XG5cblx0XHR2YXIgYWRkTm9uZW1wdHlUcmFjayA9IGZ1bmN0aW9uICggdHJhY2tUeXBlLCB0cmFja05hbWUsIGFuaW1hdGlvbktleXMsIHByb3BlcnR5TmFtZSwgZGVzdFRyYWNrcyApIHtcblxuXHRcdFx0Ly8gb25seSByZXR1cm4gdHJhY2sgaWYgdGhlcmUgYXJlIGFjdHVhbGx5IGtleXMuXG5cdFx0XHRpZiAoIGFuaW1hdGlvbktleXMubGVuZ3RoICE9PSAwICkge1xuXG5cdFx0XHRcdHZhciB0aW1lcyA9IFtdO1xuXHRcdFx0XHR2YXIgdmFsdWVzID0gW107XG5cblx0XHRcdFx0QW5pbWF0aW9uVXRpbHMuZmxhdHRlbkpTT04oIGFuaW1hdGlvbktleXMsIHRpbWVzLCB2YWx1ZXMsIHByb3BlcnR5TmFtZSApO1xuXG5cdFx0XHRcdC8vIGVtcHR5IGtleXMgYXJlIGZpbHRlcmVkIG91dCwgc28gY2hlY2sgYWdhaW5cblx0XHRcdFx0aWYgKCB0aW1lcy5sZW5ndGggIT09IDAgKSB7XG5cblx0XHRcdFx0XHRkZXN0VHJhY2tzLnB1c2goIG5ldyB0cmFja1R5cGUoIHRyYWNrTmFtZSwgdGltZXMsIHZhbHVlcyApICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9O1xuXG5cdFx0dmFyIHRyYWNrcyA9IFtdO1xuXG5cdFx0dmFyIGNsaXBOYW1lID0gYW5pbWF0aW9uLm5hbWUgfHwgJ2RlZmF1bHQnO1xuXHRcdC8vIGF1dG9tYXRpYyBsZW5ndGggZGV0ZXJtaW5hdGlvbiBpbiBBbmltYXRpb25DbGlwLlxuXHRcdHZhciBkdXJhdGlvbiA9IGFuaW1hdGlvbi5sZW5ndGggfHwgLSAxO1xuXHRcdHZhciBmcHMgPSBhbmltYXRpb24uZnBzIHx8IDMwO1xuXG5cdFx0dmFyIGhpZXJhcmNoeVRyYWNrcyA9IGFuaW1hdGlvbi5oaWVyYXJjaHkgfHwgW107XG5cblx0XHRmb3IgKCB2YXIgaCA9IDA7IGggPCBoaWVyYXJjaHlUcmFja3MubGVuZ3RoOyBoICsrICkge1xuXG5cdFx0XHR2YXIgYW5pbWF0aW9uS2V5cyA9IGhpZXJhcmNoeVRyYWNrc1sgaCBdLmtleXM7XG5cblx0XHRcdC8vIHNraXAgZW1wdHkgdHJhY2tzXG5cdFx0XHRpZiAoICEgYW5pbWF0aW9uS2V5cyB8fCBhbmltYXRpb25LZXlzLmxlbmd0aCA9PT0gMCApIGNvbnRpbnVlO1xuXG5cdFx0XHQvLyBwcm9jZXNzIG1vcnBoIHRhcmdldHMgaW4gYSB3YXkgZXhhY3RseSBjb21wYXRpYmxlXG5cdFx0XHQvLyB3aXRoIEFuaW1hdGlvbkhhbmRsZXIuaW5pdCggYW5pbWF0aW9uIClcblx0XHRcdGlmICggYW5pbWF0aW9uS2V5c1sgMCBdLm1vcnBoVGFyZ2V0cyApIHtcblxuXHRcdFx0XHQvLyBmaWd1cmUgb3V0IGFsbCBtb3JwaCB0YXJnZXRzIHVzZWQgaW4gdGhpcyB0cmFja1xuXHRcdFx0XHR2YXIgbW9ycGhUYXJnZXROYW1lcyA9IHt9O1xuXG5cdFx0XHRcdGZvciAoIHZhciBrID0gMDsgayA8IGFuaW1hdGlvbktleXMubGVuZ3RoOyBrICsrICkge1xuXG5cdFx0XHRcdFx0aWYgKCBhbmltYXRpb25LZXlzWyBrIF0ubW9ycGhUYXJnZXRzICkge1xuXG5cdFx0XHRcdFx0XHRmb3IgKCB2YXIgbSA9IDA7IG0gPCBhbmltYXRpb25LZXlzWyBrIF0ubW9ycGhUYXJnZXRzLmxlbmd0aDsgbSArKyApIHtcblxuXHRcdFx0XHRcdFx0XHRtb3JwaFRhcmdldE5hbWVzWyBhbmltYXRpb25LZXlzWyBrIF0ubW9ycGhUYXJnZXRzWyBtIF0gXSA9IC0gMTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBjcmVhdGUgYSB0cmFjayBmb3IgZWFjaCBtb3JwaCB0YXJnZXQgd2l0aCBhbGwgemVyb1xuXHRcdFx0XHQvLyBtb3JwaFRhcmdldEluZmx1ZW5jZXMgZXhjZXB0IGZvciB0aGUga2V5cyBpbiB3aGljaFxuXHRcdFx0XHQvLyB0aGUgbW9ycGhUYXJnZXQgaXMgbmFtZWQuXG5cdFx0XHRcdGZvciAoIHZhciBtb3JwaFRhcmdldE5hbWUgaW4gbW9ycGhUYXJnZXROYW1lcyApIHtcblxuXHRcdFx0XHRcdHZhciB0aW1lcyA9IFtdO1xuXHRcdFx0XHRcdHZhciB2YWx1ZXMgPSBbXTtcblxuXHRcdFx0XHRcdGZvciAoIHZhciBtID0gMDsgbSAhPT0gYW5pbWF0aW9uS2V5c1sgayBdLm1vcnBoVGFyZ2V0cy5sZW5ndGg7ICsrIG0gKSB7XG5cblx0XHRcdFx0XHRcdHZhciBhbmltYXRpb25LZXkgPSBhbmltYXRpb25LZXlzWyBrIF07XG5cblx0XHRcdFx0XHRcdHRpbWVzLnB1c2goIGFuaW1hdGlvbktleS50aW1lICk7XG5cdFx0XHRcdFx0XHR2YWx1ZXMucHVzaCggKCBhbmltYXRpb25LZXkubW9ycGhUYXJnZXQgPT09IG1vcnBoVGFyZ2V0TmFtZSApID8gMSA6IDAgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHRyYWNrcy5wdXNoKCBuZXcgTnVtYmVyS2V5ZnJhbWVUcmFjayggJy5tb3JwaFRhcmdldEluZmx1ZW5jZVsnICsgbW9ycGhUYXJnZXROYW1lICsgJ10nLCB0aW1lcywgdmFsdWVzICkgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0ZHVyYXRpb24gPSBtb3JwaFRhcmdldE5hbWVzLmxlbmd0aCAqICggZnBzIHx8IDEuMCApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdC8vIC4uLmFzc3VtZSBza2VsZXRhbCBhbmltYXRpb25cblxuXHRcdFx0XHR2YXIgYm9uZU5hbWUgPSAnLmJvbmVzWycgKyBib25lc1sgaCBdLm5hbWUgKyAnXSc7XG5cblx0XHRcdFx0YWRkTm9uZW1wdHlUcmFjayhcblx0XHRcdFx0XHRcdFZlY3RvcktleWZyYW1lVHJhY2ssIGJvbmVOYW1lICsgJy5wb3NpdGlvbicsXG5cdFx0XHRcdFx0XHRhbmltYXRpb25LZXlzLCAncG9zJywgdHJhY2tzICk7XG5cblx0XHRcdFx0YWRkTm9uZW1wdHlUcmFjayhcblx0XHRcdFx0XHRcdFF1YXRlcm5pb25LZXlmcmFtZVRyYWNrLCBib25lTmFtZSArICcucXVhdGVybmlvbicsXG5cdFx0XHRcdFx0XHRhbmltYXRpb25LZXlzLCAncm90JywgdHJhY2tzICk7XG5cblx0XHRcdFx0YWRkTm9uZW1wdHlUcmFjayhcblx0XHRcdFx0XHRcdFZlY3RvcktleWZyYW1lVHJhY2ssIGJvbmVOYW1lICsgJy5zY2FsZScsXG5cdFx0XHRcdFx0XHRhbmltYXRpb25LZXlzLCAnc2NsJywgdHJhY2tzICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggdHJhY2tzLmxlbmd0aCA9PT0gMCApIHtcblxuXHRcdFx0cmV0dXJuIG51bGw7XG5cblx0XHR9XG5cblx0XHR2YXIgY2xpcCA9IG5ldyBBbmltYXRpb25DbGlwKCBjbGlwTmFtZSwgZHVyYXRpb24sIHRyYWNrcyApO1xuXG5cdFx0cmV0dXJuIGNsaXA7XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5hc3NpZ24oIEFuaW1hdGlvbkNsaXAucHJvdG90eXBlLCB7XG5cblx0cmVzZXREdXJhdGlvbjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHRyYWNrcyA9IHRoaXMudHJhY2tzLCBkdXJhdGlvbiA9IDA7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIG4gPSB0cmFja3MubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHR2YXIgdHJhY2sgPSB0aGlzLnRyYWNrc1sgaSBdO1xuXG5cdFx0XHRkdXJhdGlvbiA9IE1hdGgubWF4KCBkdXJhdGlvbiwgdHJhY2sudGltZXNbIHRyYWNrLnRpbWVzLmxlbmd0aCAtIDEgXSApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5kdXJhdGlvbiA9IGR1cmF0aW9uO1xuXG5cdH0sXG5cblx0dHJpbTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgdGhpcy50cmFja3MubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHR0aGlzLnRyYWNrc1sgaSBdLnRyaW0oIDAsIHRoaXMuZHVyYXRpb24gKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0b3B0aW1pemU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IHRoaXMudHJhY2tzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0dGhpcy50cmFja3NbIGkgXS5vcHRpbWl6ZSgpO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBNYXRlcmlhbExvYWRlciggbWFuYWdlciApIHtcblxuXHR0aGlzLm1hbmFnZXIgPSAoIG1hbmFnZXIgIT09IHVuZGVmaW5lZCApID8gbWFuYWdlciA6IERlZmF1bHRMb2FkaW5nTWFuYWdlcjtcblx0dGhpcy50ZXh0dXJlcyA9IHt9O1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIE1hdGVyaWFsTG9hZGVyLnByb3RvdHlwZSwge1xuXG5cdGxvYWQ6IGZ1bmN0aW9uICggdXJsLCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKSB7XG5cblx0XHR2YXIgc2NvcGUgPSB0aGlzO1xuXG5cdFx0dmFyIGxvYWRlciA9IG5ldyBGaWxlTG9hZGVyKCBzY29wZS5tYW5hZ2VyICk7XG5cdFx0bG9hZGVyLnNldFJlc3BvbnNlVHlwZSggJ2pzb24nICk7XG5cdFx0bG9hZGVyLmxvYWQoIHVybCwgZnVuY3Rpb24gKCBqc29uICkge1xuXG5cdFx0XHRvbkxvYWQoIHNjb3BlLnBhcnNlKCBqc29uICkgKTtcblxuXHRcdH0sIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKTtcblxuXHR9LFxuXG5cdHNldFRleHR1cmVzOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy50ZXh0dXJlcyA9IHZhbHVlO1xuXG5cdH0sXG5cblx0cGFyc2U6IGZ1bmN0aW9uICgganNvbiApIHtcblxuXHRcdHZhciB0ZXh0dXJlcyA9IHRoaXMudGV4dHVyZXM7XG5cblx0XHRmdW5jdGlvbiBnZXRUZXh0dXJlKCBuYW1lICkge1xuXG5cdFx0XHRpZiAoIHRleHR1cmVzWyBuYW1lIF0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5NYXRlcmlhbExvYWRlcjogVW5kZWZpbmVkIHRleHR1cmUnLCBuYW1lICk7XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRleHR1cmVzWyBuYW1lIF07XG5cblx0XHR9XG5cblx0XHR2YXIgbWF0ZXJpYWwgPSBuZXcgTWF0ZXJpYWxzWyBqc29uLnR5cGUgXSgpO1xuXG5cdFx0aWYgKCBqc29uLnV1aWQgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnV1aWQgPSBqc29uLnV1aWQ7XG5cdFx0aWYgKCBqc29uLm5hbWUgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLm5hbWUgPSBqc29uLm5hbWU7XG5cdFx0aWYgKCBqc29uLmNvbG9yICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5jb2xvci5zZXRIZXgoIGpzb24uY29sb3IgKTtcblx0XHRpZiAoIGpzb24ucm91Z2huZXNzICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5yb3VnaG5lc3MgPSBqc29uLnJvdWdobmVzcztcblx0XHRpZiAoIGpzb24ubWV0YWxuZXNzICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5tZXRhbG5lc3MgPSBqc29uLm1ldGFsbmVzcztcblx0XHRpZiAoIGpzb24uZW1pc3NpdmUgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmVtaXNzaXZlLnNldEhleCgganNvbi5lbWlzc2l2ZSApO1xuXHRcdGlmICgganNvbi5zcGVjdWxhciAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuc3BlY3VsYXIuc2V0SGV4KCBqc29uLnNwZWN1bGFyICk7XG5cdFx0aWYgKCBqc29uLnNoaW5pbmVzcyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuc2hpbmluZXNzID0ganNvbi5zaGluaW5lc3M7XG5cdFx0aWYgKCBqc29uLmNsZWFyQ29hdCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuY2xlYXJDb2F0ID0ganNvbi5jbGVhckNvYXQ7XG5cdFx0aWYgKCBqc29uLmNsZWFyQ29hdFJvdWdobmVzcyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuY2xlYXJDb2F0Um91Z2huZXNzID0ganNvbi5jbGVhckNvYXRSb3VnaG5lc3M7XG5cdFx0aWYgKCBqc29uLnVuaWZvcm1zICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC51bmlmb3JtcyA9IGpzb24udW5pZm9ybXM7XG5cdFx0aWYgKCBqc29uLnZlcnRleFNoYWRlciAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwudmVydGV4U2hhZGVyID0ganNvbi52ZXJ0ZXhTaGFkZXI7XG5cdFx0aWYgKCBqc29uLmZyYWdtZW50U2hhZGVyICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5mcmFnbWVudFNoYWRlciA9IGpzb24uZnJhZ21lbnRTaGFkZXI7XG5cdFx0aWYgKCBqc29uLnZlcnRleENvbG9ycyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwudmVydGV4Q29sb3JzID0ganNvbi52ZXJ0ZXhDb2xvcnM7XG5cdFx0aWYgKCBqc29uLmZvZyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZm9nID0ganNvbi5mb2c7XG5cdFx0aWYgKCBqc29uLnNoYWRpbmcgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnNoYWRpbmcgPSBqc29uLnNoYWRpbmc7XG5cdFx0aWYgKCBqc29uLmJsZW5kaW5nICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5ibGVuZGluZyA9IGpzb24uYmxlbmRpbmc7XG5cdFx0aWYgKCBqc29uLnNpZGUgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnNpZGUgPSBqc29uLnNpZGU7XG5cdFx0aWYgKCBqc29uLm9wYWNpdHkgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLm9wYWNpdHkgPSBqc29uLm9wYWNpdHk7XG5cdFx0aWYgKCBqc29uLnRyYW5zcGFyZW50ICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC50cmFuc3BhcmVudCA9IGpzb24udHJhbnNwYXJlbnQ7XG5cdFx0aWYgKCBqc29uLmFscGhhVGVzdCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuYWxwaGFUZXN0ID0ganNvbi5hbHBoYVRlc3Q7XG5cdFx0aWYgKCBqc29uLmRlcHRoVGVzdCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZGVwdGhUZXN0ID0ganNvbi5kZXB0aFRlc3Q7XG5cdFx0aWYgKCBqc29uLmRlcHRoV3JpdGUgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmRlcHRoV3JpdGUgPSBqc29uLmRlcHRoV3JpdGU7XG5cdFx0aWYgKCBqc29uLmNvbG9yV3JpdGUgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmNvbG9yV3JpdGUgPSBqc29uLmNvbG9yV3JpdGU7XG5cdFx0aWYgKCBqc29uLndpcmVmcmFtZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwud2lyZWZyYW1lID0ganNvbi53aXJlZnJhbWU7XG5cdFx0aWYgKCBqc29uLndpcmVmcmFtZUxpbmV3aWR0aCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwud2lyZWZyYW1lTGluZXdpZHRoID0ganNvbi53aXJlZnJhbWVMaW5ld2lkdGg7XG5cdFx0aWYgKCBqc29uLndpcmVmcmFtZUxpbmVjYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLndpcmVmcmFtZUxpbmVjYXAgPSBqc29uLndpcmVmcmFtZUxpbmVjYXA7XG5cdFx0aWYgKCBqc29uLndpcmVmcmFtZUxpbmVqb2luICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC53aXJlZnJhbWVMaW5lam9pbiA9IGpzb24ud2lyZWZyYW1lTGluZWpvaW47XG5cdFx0aWYgKCBqc29uLnNraW5uaW5nICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5za2lubmluZyA9IGpzb24uc2tpbm5pbmc7XG5cdFx0aWYgKCBqc29uLm1vcnBoVGFyZ2V0cyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwubW9ycGhUYXJnZXRzID0ganNvbi5tb3JwaFRhcmdldHM7XG5cblx0XHQvLyBmb3IgUG9pbnRzTWF0ZXJpYWxcblxuXHRcdGlmICgganNvbi5zaXplICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5zaXplID0ganNvbi5zaXplO1xuXHRcdGlmICgganNvbi5zaXplQXR0ZW51YXRpb24gIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnNpemVBdHRlbnVhdGlvbiA9IGpzb24uc2l6ZUF0dGVudWF0aW9uO1xuXG5cdFx0Ly8gbWFwc1xuXG5cdFx0aWYgKCBqc29uLm1hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwubWFwID0gZ2V0VGV4dHVyZSgganNvbi5tYXAgKTtcblxuXHRcdGlmICgganNvbi5hbHBoYU1hcCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRtYXRlcmlhbC5hbHBoYU1hcCA9IGdldFRleHR1cmUoIGpzb24uYWxwaGFNYXAgKTtcblx0XHRcdG1hdGVyaWFsLnRyYW5zcGFyZW50ID0gdHJ1ZTtcblxuXHRcdH1cblxuXHRcdGlmICgganNvbi5idW1wTWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5idW1wTWFwID0gZ2V0VGV4dHVyZSgganNvbi5idW1wTWFwICk7XG5cdFx0aWYgKCBqc29uLmJ1bXBTY2FsZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuYnVtcFNjYWxlID0ganNvbi5idW1wU2NhbGU7XG5cblx0XHRpZiAoIGpzb24ubm9ybWFsTWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5ub3JtYWxNYXAgPSBnZXRUZXh0dXJlKCBqc29uLm5vcm1hbE1hcCApO1xuXHRcdGlmICgganNvbi5ub3JtYWxTY2FsZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR2YXIgbm9ybWFsU2NhbGUgPSBqc29uLm5vcm1hbFNjYWxlO1xuXG5cdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIG5vcm1hbFNjYWxlICkgPT09IGZhbHNlICkge1xuXG5cdFx0XHRcdC8vIEJsZW5kZXIgZXhwb3J0ZXIgdXNlZCB0byBleHBvcnQgYSBzY2FsYXIuIFNlZSAjNzQ1OVxuXG5cdFx0XHRcdG5vcm1hbFNjYWxlID0gWyBub3JtYWxTY2FsZSwgbm9ybWFsU2NhbGUgXTtcblxuXHRcdFx0fVxuXG5cdFx0XHRtYXRlcmlhbC5ub3JtYWxTY2FsZSA9IG5ldyBWZWN0b3IyKCkuZnJvbUFycmF5KCBub3JtYWxTY2FsZSApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBqc29uLmRpc3BsYWNlbWVudE1hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwID0gZ2V0VGV4dHVyZSgganNvbi5kaXNwbGFjZW1lbnRNYXAgKTtcblx0XHRpZiAoIGpzb24uZGlzcGxhY2VtZW50U2NhbGUgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmRpc3BsYWNlbWVudFNjYWxlID0ganNvbi5kaXNwbGFjZW1lbnRTY2FsZTtcblx0XHRpZiAoIGpzb24uZGlzcGxhY2VtZW50QmlhcyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZGlzcGxhY2VtZW50QmlhcyA9IGpzb24uZGlzcGxhY2VtZW50QmlhcztcblxuXHRcdGlmICgganNvbi5yb3VnaG5lc3NNYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnJvdWdobmVzc01hcCA9IGdldFRleHR1cmUoIGpzb24ucm91Z2huZXNzTWFwICk7XG5cdFx0aWYgKCBqc29uLm1ldGFsbmVzc01hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwubWV0YWxuZXNzTWFwID0gZ2V0VGV4dHVyZSgganNvbi5tZXRhbG5lc3NNYXAgKTtcblxuXHRcdGlmICgganNvbi5lbWlzc2l2ZU1hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZW1pc3NpdmVNYXAgPSBnZXRUZXh0dXJlKCBqc29uLmVtaXNzaXZlTWFwICk7XG5cdFx0aWYgKCBqc29uLmVtaXNzaXZlSW50ZW5zaXR5ICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5lbWlzc2l2ZUludGVuc2l0eSA9IGpzb24uZW1pc3NpdmVJbnRlbnNpdHk7XG5cblx0XHRpZiAoIGpzb24uc3BlY3VsYXJNYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnNwZWN1bGFyTWFwID0gZ2V0VGV4dHVyZSgganNvbi5zcGVjdWxhck1hcCApO1xuXG5cdFx0aWYgKCBqc29uLmVudk1hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZW52TWFwID0gZ2V0VGV4dHVyZSgganNvbi5lbnZNYXAgKTtcblxuXHRcdGlmICgganNvbi5yZWZsZWN0aXZpdHkgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnJlZmxlY3Rpdml0eSA9IGpzb24ucmVmbGVjdGl2aXR5O1xuXG5cdFx0aWYgKCBqc29uLmxpZ2h0TWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5saWdodE1hcCA9IGdldFRleHR1cmUoIGpzb24ubGlnaHRNYXAgKTtcblx0XHRpZiAoIGpzb24ubGlnaHRNYXBJbnRlbnNpdHkgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmxpZ2h0TWFwSW50ZW5zaXR5ID0ganNvbi5saWdodE1hcEludGVuc2l0eTtcblxuXHRcdGlmICgganNvbi5hb01hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuYW9NYXAgPSBnZXRUZXh0dXJlKCBqc29uLmFvTWFwICk7XG5cdFx0aWYgKCBqc29uLmFvTWFwSW50ZW5zaXR5ICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5hb01hcEludGVuc2l0eSA9IGpzb24uYW9NYXBJbnRlbnNpdHk7XG5cblx0XHRpZiAoIGpzb24uZ3JhZGllbnRNYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmdyYWRpZW50TWFwID0gZ2V0VGV4dHVyZSgganNvbi5ncmFkaWVudE1hcCApO1xuXG5cdFx0cmV0dXJuIG1hdGVyaWFsO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gQnVmZmVyR2VvbWV0cnlMb2FkZXIoIG1hbmFnZXIgKSB7XG5cblx0dGhpcy5tYW5hZ2VyID0gKCBtYW5hZ2VyICE9PSB1bmRlZmluZWQgKSA/IG1hbmFnZXIgOiBEZWZhdWx0TG9hZGluZ01hbmFnZXI7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggQnVmZmVyR2VvbWV0cnlMb2FkZXIucHJvdG90eXBlLCB7XG5cblx0bG9hZDogZnVuY3Rpb24gKCB1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciApIHtcblxuXHRcdHZhciBzY29wZSA9IHRoaXM7XG5cblx0XHR2YXIgbG9hZGVyID0gbmV3IEZpbGVMb2FkZXIoIHNjb3BlLm1hbmFnZXIgKTtcblx0XHRsb2FkZXIuc2V0UmVzcG9uc2VUeXBlKCAnanNvbicgKTtcblx0XHRsb2FkZXIubG9hZCggdXJsLCBmdW5jdGlvbiAoIGpzb24gKSB7XG5cblx0XHRcdG9uTG9hZCggc2NvcGUucGFyc2UoIGpzb24gKSApO1xuXG5cdFx0fSwgb25Qcm9ncmVzcywgb25FcnJvciApO1xuXG5cdH0sXG5cblx0cGFyc2U6IGZ1bmN0aW9uICgganNvbiApIHtcblxuXHRcdHZhciBnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXG5cdFx0dmFyIGluZGV4ID0ganNvbi5kYXRhLmluZGV4O1xuXG5cdFx0aWYgKCBpbmRleCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR2YXIgdHlwZWRBcnJheSA9IG5ldyBUWVBFRF9BUlJBWVNbIGluZGV4LnR5cGUgXSggaW5kZXguYXJyYXkgKTtcblx0XHRcdGdlb21ldHJ5LnNldEluZGV4KCBuZXcgQnVmZmVyQXR0cmlidXRlKCB0eXBlZEFycmF5LCAxICkgKTtcblxuXHRcdH1cblxuXHRcdHZhciBhdHRyaWJ1dGVzID0ganNvbi5kYXRhLmF0dHJpYnV0ZXM7XG5cblx0XHRmb3IgKCB2YXIga2V5IGluIGF0dHJpYnV0ZXMgKSB7XG5cblx0XHRcdHZhciBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzWyBrZXkgXTtcblx0XHRcdHZhciB0eXBlZEFycmF5ID0gbmV3IFRZUEVEX0FSUkFZU1sgYXR0cmlidXRlLnR5cGUgXSggYXR0cmlidXRlLmFycmF5ICk7XG5cblx0XHRcdGdlb21ldHJ5LmFkZEF0dHJpYnV0ZSgga2V5LCBuZXcgQnVmZmVyQXR0cmlidXRlKCB0eXBlZEFycmF5LCBhdHRyaWJ1dGUuaXRlbVNpemUsIGF0dHJpYnV0ZS5ub3JtYWxpemVkICkgKTtcblxuXHRcdH1cblxuXHRcdHZhciBncm91cHMgPSBqc29uLmRhdGEuZ3JvdXBzIHx8IGpzb24uZGF0YS5kcmF3Y2FsbHMgfHwganNvbi5kYXRhLm9mZnNldHM7XG5cblx0XHRpZiAoIGdyb3VwcyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIG4gPSBncm91cHMubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHRcdHZhciBncm91cCA9IGdyb3Vwc1sgaSBdO1xuXG5cdFx0XHRcdGdlb21ldHJ5LmFkZEdyb3VwKCBncm91cC5zdGFydCwgZ3JvdXAuY291bnQsIGdyb3VwLm1hdGVyaWFsSW5kZXggKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0dmFyIGJvdW5kaW5nU3BoZXJlID0ganNvbi5kYXRhLmJvdW5kaW5nU3BoZXJlO1xuXG5cdFx0aWYgKCBib3VuZGluZ1NwaGVyZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR2YXIgY2VudGVyID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdFx0aWYgKCBib3VuZGluZ1NwaGVyZS5jZW50ZXIgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRjZW50ZXIuZnJvbUFycmF5KCBib3VuZGluZ1NwaGVyZS5jZW50ZXIgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSA9IG5ldyBTcGhlcmUoIGNlbnRlciwgYm91bmRpbmdTcGhlcmUucmFkaXVzICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gZ2VvbWV0cnk7XG5cblx0fVxuXG59ICk7XG5cbnZhciBUWVBFRF9BUlJBWVMgPSB7XG5cdEludDhBcnJheTogSW50OEFycmF5LFxuXHRVaW50OEFycmF5OiBVaW50OEFycmF5LFxuXHRVaW50OENsYW1wZWRBcnJheTogVWludDhDbGFtcGVkQXJyYXksXG5cdEludDE2QXJyYXk6IEludDE2QXJyYXksXG5cdFVpbnQxNkFycmF5OiBVaW50MTZBcnJheSxcblx0SW50MzJBcnJheTogSW50MzJBcnJheSxcblx0VWludDMyQXJyYXk6IFVpbnQzMkFycmF5LFxuXHRGbG9hdDMyQXJyYXk6IEZsb2F0MzJBcnJheSxcblx0RmxvYXQ2NEFycmF5OiBGbG9hdDY0QXJyYXlcbn07XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBMb2FkZXIoKSB7XG5cblx0dGhpcy5vbkxvYWRTdGFydCA9IGZ1bmN0aW9uICgpIHt9O1xuXHR0aGlzLm9uTG9hZFByb2dyZXNzID0gZnVuY3Rpb24gKCkge307XG5cdHRoaXMub25Mb2FkQ29tcGxldGUgPSBmdW5jdGlvbiAoKSB7fTtcblxufVxuXG5Mb2FkZXIuSGFuZGxlcnMgPSB7XG5cblx0aGFuZGxlcnM6IFtdLFxuXG5cdGFkZDogZnVuY3Rpb24gKCByZWdleCwgbG9hZGVyICkge1xuXG5cdFx0dGhpcy5oYW5kbGVycy5wdXNoKCByZWdleCwgbG9hZGVyICk7XG5cblx0fSxcblxuXHRnZXQ6IGZ1bmN0aW9uICggZmlsZSApIHtcblxuXHRcdHZhciBoYW5kbGVycyA9IHRoaXMuaGFuZGxlcnM7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBoYW5kbGVycy5sZW5ndGg7IGkgPCBsOyBpICs9IDIgKSB7XG5cblx0XHRcdHZhciByZWdleCA9IGhhbmRsZXJzWyBpIF07XG5cdFx0XHR2YXIgbG9hZGVyID0gaGFuZGxlcnNbIGkgKyAxIF07XG5cblx0XHRcdGlmICggcmVnZXgudGVzdCggZmlsZSApICkge1xuXG5cdFx0XHRcdHJldHVybiBsb2FkZXI7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiBudWxsO1xuXG5cdH1cblxufTtcblxuT2JqZWN0LmFzc2lnbiggTG9hZGVyLnByb3RvdHlwZSwge1xuXG5cdGNyb3NzT3JpZ2luOiB1bmRlZmluZWQsXG5cblx0ZXh0cmFjdFVybEJhc2U6IGZ1bmN0aW9uICggdXJsICkge1xuXG5cdFx0dmFyIHBhcnRzID0gdXJsLnNwbGl0KCAnLycgKTtcblxuXHRcdGlmICggcGFydHMubGVuZ3RoID09PSAxICkgcmV0dXJuICcuLyc7XG5cblx0XHRwYXJ0cy5wb3AoKTtcblxuXHRcdHJldHVybiBwYXJ0cy5qb2luKCAnLycgKSArICcvJztcblxuXHR9LFxuXG5cdGluaXRNYXRlcmlhbHM6IGZ1bmN0aW9uICggbWF0ZXJpYWxzLCB0ZXh0dXJlUGF0aCwgY3Jvc3NPcmlnaW4gKSB7XG5cblx0XHR2YXIgYXJyYXkgPSBbXTtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IG1hdGVyaWFscy5sZW5ndGg7ICsrIGkgKSB7XG5cblx0XHRcdGFycmF5WyBpIF0gPSB0aGlzLmNyZWF0ZU1hdGVyaWFsKCBtYXRlcmlhbHNbIGkgXSwgdGV4dHVyZVBhdGgsIGNyb3NzT3JpZ2luICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gYXJyYXk7XG5cblx0fSxcblxuXHRjcmVhdGVNYXRlcmlhbDogKCBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgQmxlbmRpbmdNb2RlID0ge1xuXHRcdFx0Tm9CbGVuZGluZzogTm9CbGVuZGluZyxcblx0XHRcdE5vcm1hbEJsZW5kaW5nOiBOb3JtYWxCbGVuZGluZyxcblx0XHRcdEFkZGl0aXZlQmxlbmRpbmc6IEFkZGl0aXZlQmxlbmRpbmcsXG5cdFx0XHRTdWJ0cmFjdGl2ZUJsZW5kaW5nOiBTdWJ0cmFjdGl2ZUJsZW5kaW5nLFxuXHRcdFx0TXVsdGlwbHlCbGVuZGluZzogTXVsdGlwbHlCbGVuZGluZyxcblx0XHRcdEN1c3RvbUJsZW5kaW5nOiBDdXN0b21CbGVuZGluZ1xuXHRcdH07XG5cblx0XHR2YXIgY29sb3IgPSBuZXcgQ29sb3IoKTtcblx0XHR2YXIgdGV4dHVyZUxvYWRlciA9IG5ldyBUZXh0dXJlTG9hZGVyKCk7XG5cdFx0dmFyIG1hdGVyaWFsTG9hZGVyID0gbmV3IE1hdGVyaWFsTG9hZGVyKCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gY3JlYXRlTWF0ZXJpYWwoIG0sIHRleHR1cmVQYXRoLCBjcm9zc09yaWdpbiApIHtcblxuXHRcdFx0Ly8gY29udmVydCBmcm9tIG9sZCBtYXRlcmlhbCBmb3JtYXRcblxuXHRcdFx0dmFyIHRleHR1cmVzID0ge307XG5cblx0XHRcdGZ1bmN0aW9uIGxvYWRUZXh0dXJlKCBwYXRoLCByZXBlYXQsIG9mZnNldCwgd3JhcCwgYW5pc290cm9weSApIHtcblxuXHRcdFx0XHR2YXIgZnVsbFBhdGggPSB0ZXh0dXJlUGF0aCArIHBhdGg7XG5cdFx0XHRcdHZhciBsb2FkZXIgPSBMb2FkZXIuSGFuZGxlcnMuZ2V0KCBmdWxsUGF0aCApO1xuXG5cdFx0XHRcdHZhciB0ZXh0dXJlO1xuXG5cdFx0XHRcdGlmICggbG9hZGVyICE9PSBudWxsICkge1xuXG5cdFx0XHRcdFx0dGV4dHVyZSA9IGxvYWRlci5sb2FkKCBmdWxsUGF0aCApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHR0ZXh0dXJlTG9hZGVyLnNldENyb3NzT3JpZ2luKCBjcm9zc09yaWdpbiApO1xuXHRcdFx0XHRcdHRleHR1cmUgPSB0ZXh0dXJlTG9hZGVyLmxvYWQoIGZ1bGxQYXRoICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggcmVwZWF0ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHR0ZXh0dXJlLnJlcGVhdC5mcm9tQXJyYXkoIHJlcGVhdCApO1xuXG5cdFx0XHRcdFx0aWYgKCByZXBlYXRbIDAgXSAhPT0gMSApIHRleHR1cmUud3JhcFMgPSBSZXBlYXRXcmFwcGluZztcblx0XHRcdFx0XHRpZiAoIHJlcGVhdFsgMSBdICE9PSAxICkgdGV4dHVyZS53cmFwVCA9IFJlcGVhdFdyYXBwaW5nO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIG9mZnNldCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0dGV4dHVyZS5vZmZzZXQuZnJvbUFycmF5KCBvZmZzZXQgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCB3cmFwICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRpZiAoIHdyYXBbIDAgXSA9PT0gJ3JlcGVhdCcgKSB0ZXh0dXJlLndyYXBTID0gUmVwZWF0V3JhcHBpbmc7XG5cdFx0XHRcdFx0aWYgKCB3cmFwWyAwIF0gPT09ICdtaXJyb3InICkgdGV4dHVyZS53cmFwUyA9IE1pcnJvcmVkUmVwZWF0V3JhcHBpbmc7XG5cblx0XHRcdFx0XHRpZiAoIHdyYXBbIDEgXSA9PT0gJ3JlcGVhdCcgKSB0ZXh0dXJlLndyYXBUID0gUmVwZWF0V3JhcHBpbmc7XG5cdFx0XHRcdFx0aWYgKCB3cmFwWyAxIF0gPT09ICdtaXJyb3InICkgdGV4dHVyZS53cmFwVCA9IE1pcnJvcmVkUmVwZWF0V3JhcHBpbmc7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggYW5pc290cm9weSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0dGV4dHVyZS5hbmlzb3Ryb3B5ID0gYW5pc290cm9weTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dmFyIHV1aWQgPSBfTWF0aC5nZW5lcmF0ZVVVSUQoKTtcblxuXHRcdFx0XHR0ZXh0dXJlc1sgdXVpZCBdID0gdGV4dHVyZTtcblxuXHRcdFx0XHRyZXR1cm4gdXVpZDtcblxuXHRcdFx0fVxuXG5cdFx0XHQvL1xuXG5cdFx0XHR2YXIganNvbiA9IHtcblx0XHRcdFx0dXVpZDogX01hdGguZ2VuZXJhdGVVVUlEKCksXG5cdFx0XHRcdHR5cGU6ICdNZXNoTGFtYmVydE1hdGVyaWFsJ1xuXHRcdFx0fTtcblxuXHRcdFx0Zm9yICggdmFyIG5hbWUgaW4gbSApIHtcblxuXHRcdFx0XHR2YXIgdmFsdWUgPSBtWyBuYW1lIF07XG5cblx0XHRcdFx0c3dpdGNoICggbmFtZSApIHtcblxuXHRcdFx0XHRcdGNhc2UgJ0RiZ0NvbG9yJzpcblx0XHRcdFx0XHRjYXNlICdEYmdJbmRleCc6XG5cdFx0XHRcdFx0Y2FzZSAnb3B0aWNhbERlbnNpdHknOlxuXHRcdFx0XHRcdGNhc2UgJ2lsbHVtaW5hdGlvbic6XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdEYmdOYW1lJzpcblx0XHRcdFx0XHRcdGpzb24ubmFtZSA9IHZhbHVlO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnYmxlbmRpbmcnOlxuXHRcdFx0XHRcdFx0anNvbi5ibGVuZGluZyA9IEJsZW5kaW5nTW9kZVsgdmFsdWUgXTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2NvbG9yQW1iaWVudCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwQW1iaWVudCc6XG5cdFx0XHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Mb2FkZXIuY3JlYXRlTWF0ZXJpYWw6JywgbmFtZSwgJ2lzIG5vIGxvbmdlciBzdXBwb3J0ZWQuJyApO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnY29sb3JEaWZmdXNlJzpcblx0XHRcdFx0XHRcdGpzb24uY29sb3IgPSBjb2xvci5mcm9tQXJyYXkoIHZhbHVlICkuZ2V0SGV4KCk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdjb2xvclNwZWN1bGFyJzpcblx0XHRcdFx0XHRcdGpzb24uc3BlY3VsYXIgPSBjb2xvci5mcm9tQXJyYXkoIHZhbHVlICkuZ2V0SGV4KCk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdjb2xvckVtaXNzaXZlJzpcblx0XHRcdFx0XHRcdGpzb24uZW1pc3NpdmUgPSBjb2xvci5mcm9tQXJyYXkoIHZhbHVlICkuZ2V0SGV4KCk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdzcGVjdWxhckNvZWYnOlxuXHRcdFx0XHRcdFx0anNvbi5zaGluaW5lc3MgPSB2YWx1ZTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3NoYWRpbmcnOlxuXHRcdFx0XHRcdFx0aWYgKCB2YWx1ZS50b0xvd2VyQ2FzZSgpID09PSAnYmFzaWMnICkganNvbi50eXBlID0gJ01lc2hCYXNpY01hdGVyaWFsJztcblx0XHRcdFx0XHRcdGlmICggdmFsdWUudG9Mb3dlckNhc2UoKSA9PT0gJ3Bob25nJyApIGpzb24udHlwZSA9ICdNZXNoUGhvbmdNYXRlcmlhbCc7XG5cdFx0XHRcdFx0XHRpZiAoIHZhbHVlLnRvTG93ZXJDYXNlKCkgPT09ICdzdGFuZGFyZCcgKSBqc29uLnR5cGUgPSAnTWVzaFN0YW5kYXJkTWF0ZXJpYWwnO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbWFwRGlmZnVzZSc6XG5cdFx0XHRcdFx0XHRqc29uLm1hcCA9IGxvYWRUZXh0dXJlKCB2YWx1ZSwgbS5tYXBEaWZmdXNlUmVwZWF0LCBtLm1hcERpZmZ1c2VPZmZzZXQsIG0ubWFwRGlmZnVzZVdyYXAsIG0ubWFwRGlmZnVzZUFuaXNvdHJvcHkgKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ21hcERpZmZ1c2VSZXBlYXQnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcERpZmZ1c2VPZmZzZXQnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcERpZmZ1c2VXcmFwJzpcblx0XHRcdFx0XHRjYXNlICdtYXBEaWZmdXNlQW5pc290cm9weSc6XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdtYXBFbWlzc2l2ZSc6XG5cdFx0XHRcdFx0XHRqc29uLmVtaXNzaXZlTWFwID0gbG9hZFRleHR1cmUoIHZhbHVlLCBtLm1hcEVtaXNzaXZlUmVwZWF0LCBtLm1hcEVtaXNzaXZlT2Zmc2V0LCBtLm1hcEVtaXNzaXZlV3JhcCwgbS5tYXBFbWlzc2l2ZUFuaXNvdHJvcHkgKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ21hcEVtaXNzaXZlUmVwZWF0Jzpcblx0XHRcdFx0XHRjYXNlICdtYXBFbWlzc2l2ZU9mZnNldCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwRW1pc3NpdmVXcmFwJzpcblx0XHRcdFx0XHRjYXNlICdtYXBFbWlzc2l2ZUFuaXNvdHJvcHknOlxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbWFwTGlnaHQnOlxuXHRcdFx0XHRcdFx0anNvbi5saWdodE1hcCA9IGxvYWRUZXh0dXJlKCB2YWx1ZSwgbS5tYXBMaWdodFJlcGVhdCwgbS5tYXBMaWdodE9mZnNldCwgbS5tYXBMaWdodFdyYXAsIG0ubWFwTGlnaHRBbmlzb3Ryb3B5ICk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdtYXBMaWdodFJlcGVhdCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwTGlnaHRPZmZzZXQnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcExpZ2h0V3JhcCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwTGlnaHRBbmlzb3Ryb3B5Jzpcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ21hcEFPJzpcblx0XHRcdFx0XHRcdGpzb24uYW9NYXAgPSBsb2FkVGV4dHVyZSggdmFsdWUsIG0ubWFwQU9SZXBlYXQsIG0ubWFwQU9PZmZzZXQsIG0ubWFwQU9XcmFwLCBtLm1hcEFPQW5pc290cm9weSApO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbWFwQU9SZXBlYXQnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcEFPT2Zmc2V0Jzpcblx0XHRcdFx0XHRjYXNlICdtYXBBT1dyYXAnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcEFPQW5pc290cm9weSc6XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdtYXBCdW1wJzpcblx0XHRcdFx0XHRcdGpzb24uYnVtcE1hcCA9IGxvYWRUZXh0dXJlKCB2YWx1ZSwgbS5tYXBCdW1wUmVwZWF0LCBtLm1hcEJ1bXBPZmZzZXQsIG0ubWFwQnVtcFdyYXAsIG0ubWFwQnVtcEFuaXNvdHJvcHkgKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ21hcEJ1bXBTY2FsZSc6XG5cdFx0XHRcdFx0XHRqc29uLmJ1bXBTY2FsZSA9IHZhbHVlO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbWFwQnVtcFJlcGVhdCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwQnVtcE9mZnNldCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwQnVtcFdyYXAnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcEJ1bXBBbmlzb3Ryb3B5Jzpcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ21hcE5vcm1hbCc6XG5cdFx0XHRcdFx0XHRqc29uLm5vcm1hbE1hcCA9IGxvYWRUZXh0dXJlKCB2YWx1ZSwgbS5tYXBOb3JtYWxSZXBlYXQsIG0ubWFwTm9ybWFsT2Zmc2V0LCBtLm1hcE5vcm1hbFdyYXAsIG0ubWFwTm9ybWFsQW5pc290cm9weSApO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbWFwTm9ybWFsRmFjdG9yJzpcblx0XHRcdFx0XHRcdGpzb24ubm9ybWFsU2NhbGUgPSBbIHZhbHVlLCB2YWx1ZSBdO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbWFwTm9ybWFsUmVwZWF0Jzpcblx0XHRcdFx0XHRjYXNlICdtYXBOb3JtYWxPZmZzZXQnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcE5vcm1hbFdyYXAnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcE5vcm1hbEFuaXNvdHJvcHknOlxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbWFwU3BlY3VsYXInOlxuXHRcdFx0XHRcdFx0anNvbi5zcGVjdWxhck1hcCA9IGxvYWRUZXh0dXJlKCB2YWx1ZSwgbS5tYXBTcGVjdWxhclJlcGVhdCwgbS5tYXBTcGVjdWxhck9mZnNldCwgbS5tYXBTcGVjdWxhcldyYXAsIG0ubWFwU3BlY3VsYXJBbmlzb3Ryb3B5ICk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdtYXBTcGVjdWxhclJlcGVhdCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwU3BlY3VsYXJPZmZzZXQnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcFNwZWN1bGFyV3JhcCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwU3BlY3VsYXJBbmlzb3Ryb3B5Jzpcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ21hcE1ldGFsbmVzcyc6XG5cdFx0XHRcdFx0XHRqc29uLm1ldGFsbmVzc01hcCA9IGxvYWRUZXh0dXJlKCB2YWx1ZSwgbS5tYXBNZXRhbG5lc3NSZXBlYXQsIG0ubWFwTWV0YWxuZXNzT2Zmc2V0LCBtLm1hcE1ldGFsbmVzc1dyYXAsIG0ubWFwTWV0YWxuZXNzQW5pc290cm9weSApO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbWFwTWV0YWxuZXNzUmVwZWF0Jzpcblx0XHRcdFx0XHRjYXNlICdtYXBNZXRhbG5lc3NPZmZzZXQnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcE1ldGFsbmVzc1dyYXAnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcE1ldGFsbmVzc0FuaXNvdHJvcHknOlxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnbWFwUm91Z2huZXNzJzpcblx0XHRcdFx0XHRcdGpzb24ucm91Z2huZXNzTWFwID0gbG9hZFRleHR1cmUoIHZhbHVlLCBtLm1hcFJvdWdobmVzc1JlcGVhdCwgbS5tYXBSb3VnaG5lc3NPZmZzZXQsIG0ubWFwUm91Z2huZXNzV3JhcCwgbS5tYXBSb3VnaG5lc3NBbmlzb3Ryb3B5ICk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdtYXBSb3VnaG5lc3NSZXBlYXQnOlxuXHRcdFx0XHRcdGNhc2UgJ21hcFJvdWdobmVzc09mZnNldCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwUm91Z2huZXNzV3JhcCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwUm91Z2huZXNzQW5pc290cm9weSc6XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdtYXBBbHBoYSc6XG5cdFx0XHRcdFx0XHRqc29uLmFscGhhTWFwID0gbG9hZFRleHR1cmUoIHZhbHVlLCBtLm1hcEFscGhhUmVwZWF0LCBtLm1hcEFscGhhT2Zmc2V0LCBtLm1hcEFscGhhV3JhcCwgbS5tYXBBbHBoYUFuaXNvdHJvcHkgKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ21hcEFscGhhUmVwZWF0Jzpcblx0XHRcdFx0XHRjYXNlICdtYXBBbHBoYU9mZnNldCc6XG5cdFx0XHRcdFx0Y2FzZSAnbWFwQWxwaGFXcmFwJzpcblx0XHRcdFx0XHRjYXNlICdtYXBBbHBoYUFuaXNvdHJvcHknOlxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnZmxpcFNpZGVkJzpcblx0XHRcdFx0XHRcdGpzb24uc2lkZSA9IEJhY2tTaWRlO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnZG91YmxlU2lkZWQnOlxuXHRcdFx0XHRcdFx0anNvbi5zaWRlID0gRG91YmxlU2lkZTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ3RyYW5zcGFyZW5jeSc6XG5cdFx0XHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Mb2FkZXIuY3JlYXRlTWF0ZXJpYWw6IHRyYW5zcGFyZW5jeSBoYXMgYmVlbiByZW5hbWVkIHRvIG9wYWNpdHknICk7XG5cdFx0XHRcdFx0XHRqc29uLm9wYWNpdHkgPSB2YWx1ZTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2RlcHRoVGVzdCc6XG5cdFx0XHRcdFx0Y2FzZSAnZGVwdGhXcml0ZSc6XG5cdFx0XHRcdFx0Y2FzZSAnY29sb3JXcml0ZSc6XG5cdFx0XHRcdFx0Y2FzZSAnb3BhY2l0eSc6XG5cdFx0XHRcdFx0Y2FzZSAncmVmbGVjdGl2aXR5Jzpcblx0XHRcdFx0XHRjYXNlICd0cmFuc3BhcmVudCc6XG5cdFx0XHRcdFx0Y2FzZSAndmlzaWJsZSc6XG5cdFx0XHRcdFx0Y2FzZSAnd2lyZWZyYW1lJzpcblx0XHRcdFx0XHRcdGpzb25bIG5hbWUgXSA9IHZhbHVlO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAndmVydGV4Q29sb3JzJzpcblx0XHRcdFx0XHRcdGlmICggdmFsdWUgPT09IHRydWUgKSBqc29uLnZlcnRleENvbG9ycyA9IFZlcnRleENvbG9ycztcblx0XHRcdFx0XHRcdGlmICggdmFsdWUgPT09ICdmYWNlJyApIGpzb24udmVydGV4Q29sb3JzID0gRmFjZUNvbG9ycztcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuTG9hZGVyLmNyZWF0ZU1hdGVyaWFsOiBVbnN1cHBvcnRlZCcsIG5hbWUsIHZhbHVlICk7XG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBqc29uLnR5cGUgPT09ICdNZXNoQmFzaWNNYXRlcmlhbCcgKSBkZWxldGUganNvbi5lbWlzc2l2ZTtcblx0XHRcdGlmICgganNvbi50eXBlICE9PSAnTWVzaFBob25nTWF0ZXJpYWwnICkgZGVsZXRlIGpzb24uc3BlY3VsYXI7XG5cblx0XHRcdGlmICgganNvbi5vcGFjaXR5IDwgMSApIGpzb24udHJhbnNwYXJlbnQgPSB0cnVlO1xuXG5cdFx0XHRtYXRlcmlhbExvYWRlci5zZXRUZXh0dXJlcyggdGV4dHVyZXMgKTtcblxuXHRcdFx0cmV0dXJuIG1hdGVyaWFsTG9hZGVyLnBhcnNlKCBqc29uICk7XG5cblx0XHR9O1xuXG5cdH0gKSgpXG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBKU09OTG9hZGVyKCBtYW5hZ2VyICkge1xuXG5cdGlmICggdHlwZW9mIG1hbmFnZXIgPT09ICdib29sZWFuJyApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkpTT05Mb2FkZXI6IHNob3dTdGF0dXMgcGFyYW1ldGVyIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSBjb25zdHJ1Y3Rvci4nICk7XG5cdFx0bWFuYWdlciA9IHVuZGVmaW5lZDtcblxuXHR9XG5cblx0dGhpcy5tYW5hZ2VyID0gKCBtYW5hZ2VyICE9PSB1bmRlZmluZWQgKSA/IG1hbmFnZXIgOiBEZWZhdWx0TG9hZGluZ01hbmFnZXI7XG5cblx0dGhpcy53aXRoQ3JlZGVudGlhbHMgPSBmYWxzZTtcblxufVxuXG5PYmplY3QuYXNzaWduKCBKU09OTG9hZGVyLnByb3RvdHlwZSwge1xuXG5cdGxvYWQ6IGZ1bmN0aW9uICggdXJsLCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKSB7XG5cblx0XHR2YXIgc2NvcGUgPSB0aGlzO1xuXG5cdFx0dmFyIHRleHR1cmVQYXRoID0gdGhpcy50ZXh0dXJlUGF0aCAmJiAoIHR5cGVvZiB0aGlzLnRleHR1cmVQYXRoID09PSBcInN0cmluZ1wiICkgPyB0aGlzLnRleHR1cmVQYXRoIDogTG9hZGVyLnByb3RvdHlwZS5leHRyYWN0VXJsQmFzZSggdXJsICk7XG5cblx0XHR2YXIgbG9hZGVyID0gbmV3IEZpbGVMb2FkZXIoIHRoaXMubWFuYWdlciApO1xuXHRcdGxvYWRlci5zZXRSZXNwb25zZVR5cGUoICdqc29uJyApO1xuXHRcdGxvYWRlci5zZXRXaXRoQ3JlZGVudGlhbHMoIHRoaXMud2l0aENyZWRlbnRpYWxzICk7XG5cdFx0bG9hZGVyLmxvYWQoIHVybCwgZnVuY3Rpb24gKCBqc29uICkge1xuXG5cdFx0XHR2YXIgbWV0YWRhdGEgPSBqc29uLm1ldGFkYXRhO1xuXG5cdFx0XHRpZiAoIG1ldGFkYXRhICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0dmFyIHR5cGUgPSBtZXRhZGF0YS50eXBlO1xuXG5cdFx0XHRcdGlmICggdHlwZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0aWYgKCB0eXBlLnRvTG93ZXJDYXNlKCkgPT09ICdvYmplY3QnICkge1xuXG5cdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuSlNPTkxvYWRlcjogJyArIHVybCArICcgc2hvdWxkIGJlIGxvYWRlZCB3aXRoIFRIUkVFLk9iamVjdExvYWRlciBpbnN0ZWFkLicgKTtcblx0XHRcdFx0XHRcdHJldHVybjtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmICggdHlwZS50b0xvd2VyQ2FzZSgpID09PSAnc2NlbmUnICkge1xuXG5cdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuSlNPTkxvYWRlcjogJyArIHVybCArICcgc2hvdWxkIGJlIGxvYWRlZCB3aXRoIFRIUkVFLlNjZW5lTG9hZGVyIGluc3RlYWQuJyApO1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgb2JqZWN0ID0gc2NvcGUucGFyc2UoIGpzb24sIHRleHR1cmVQYXRoICk7XG5cdFx0XHRvbkxvYWQoIG9iamVjdC5nZW9tZXRyeSwgb2JqZWN0Lm1hdGVyaWFscyApO1xuXG5cdFx0fSwgb25Qcm9ncmVzcywgb25FcnJvciApO1xuXG5cdH0sXG5cblx0c2V0VGV4dHVyZVBhdGg6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLnRleHR1cmVQYXRoID0gdmFsdWU7XG5cblx0fSxcblxuXHRwYXJzZTogKCBmdW5jdGlvbiAoKSB7XG5cblx0XHRmdW5jdGlvbiBwYXJzZU1vZGVsKCBqc29uLCBnZW9tZXRyeSApIHtcblxuXHRcdFx0ZnVuY3Rpb24gaXNCaXRTZXQoIHZhbHVlLCBwb3NpdGlvbiApIHtcblxuXHRcdFx0XHRyZXR1cm4gdmFsdWUgJiAoIDEgPDwgcG9zaXRpb24gKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgaSwgaiwgZmksXG5cblx0XHRcdFx0b2Zmc2V0LCB6TGVuZ3RoLFxuXG5cdFx0XHRcdGNvbG9ySW5kZXgsIG5vcm1hbEluZGV4LCB1dkluZGV4LCBtYXRlcmlhbEluZGV4LFxuXG5cdFx0XHRcdHR5cGUsXG5cdFx0XHRcdGlzUXVhZCxcblx0XHRcdFx0aGFzTWF0ZXJpYWwsXG5cdFx0XHRcdGhhc0ZhY2VWZXJ0ZXhVdixcblx0XHRcdFx0aGFzRmFjZU5vcm1hbCwgaGFzRmFjZVZlcnRleE5vcm1hbCxcblx0XHRcdFx0aGFzRmFjZUNvbG9yLCBoYXNGYWNlVmVydGV4Q29sb3IsXG5cblx0XHRcdFx0dmVydGV4LCBmYWNlLCBmYWNlQSwgZmFjZUIsIGhleCwgbm9ybWFsLFxuXG5cdFx0XHRcdHV2TGF5ZXIsIHV2LCB1LCB2LFxuXG5cdFx0XHRcdGZhY2VzID0ganNvbi5mYWNlcyxcblx0XHRcdFx0dmVydGljZXMgPSBqc29uLnZlcnRpY2VzLFxuXHRcdFx0XHRub3JtYWxzID0ganNvbi5ub3JtYWxzLFxuXHRcdFx0XHRjb2xvcnMgPSBqc29uLmNvbG9ycyxcblxuXHRcdFx0XHRzY2FsZSA9IGpzb24uc2NhbGUsXG5cblx0XHRcdFx0blV2TGF5ZXJzID0gMDtcblxuXG5cdFx0XHRpZiAoIGpzb24udXZzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Ly8gZGlzcmVnYXJkIGVtcHR5IGFycmF5c1xuXG5cdFx0XHRcdGZvciAoIGkgPSAwOyBpIDwganNvbi51dnMubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRcdFx0aWYgKCBqc29uLnV2c1sgaSBdLmxlbmd0aCApIG5VdkxheWVycyArKztcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Zm9yICggaSA9IDA7IGkgPCBuVXZMYXllcnM7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRnZW9tZXRyeS5mYWNlVmVydGV4VXZzWyBpIF0gPSBbXTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0b2Zmc2V0ID0gMDtcblx0XHRcdHpMZW5ndGggPSB2ZXJ0aWNlcy5sZW5ndGg7XG5cblx0XHRcdHdoaWxlICggb2Zmc2V0IDwgekxlbmd0aCApIHtcblxuXHRcdFx0XHR2ZXJ0ZXggPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0XHRcdHZlcnRleC54ID0gdmVydGljZXNbIG9mZnNldCArKyBdICogc2NhbGU7XG5cdFx0XHRcdHZlcnRleC55ID0gdmVydGljZXNbIG9mZnNldCArKyBdICogc2NhbGU7XG5cdFx0XHRcdHZlcnRleC56ID0gdmVydGljZXNbIG9mZnNldCArKyBdICogc2NhbGU7XG5cblx0XHRcdFx0Z2VvbWV0cnkudmVydGljZXMucHVzaCggdmVydGV4ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0b2Zmc2V0ID0gMDtcblx0XHRcdHpMZW5ndGggPSBmYWNlcy5sZW5ndGg7XG5cblx0XHRcdHdoaWxlICggb2Zmc2V0IDwgekxlbmd0aCApIHtcblxuXHRcdFx0XHR0eXBlID0gZmFjZXNbIG9mZnNldCArKyBdO1xuXG5cdFx0XHRcdGlzUXVhZCA9IGlzQml0U2V0KCB0eXBlLCAwICk7XG5cdFx0XHRcdGhhc01hdGVyaWFsID0gaXNCaXRTZXQoIHR5cGUsIDEgKTtcblx0XHRcdFx0aGFzRmFjZVZlcnRleFV2ID0gaXNCaXRTZXQoIHR5cGUsIDMgKTtcblx0XHRcdFx0aGFzRmFjZU5vcm1hbCA9IGlzQml0U2V0KCB0eXBlLCA0ICk7XG5cdFx0XHRcdGhhc0ZhY2VWZXJ0ZXhOb3JtYWwgPSBpc0JpdFNldCggdHlwZSwgNSApO1xuXHRcdFx0XHRoYXNGYWNlQ29sb3IgPSBpc0JpdFNldCggdHlwZSwgNiApO1xuXHRcdFx0XHRoYXNGYWNlVmVydGV4Q29sb3IgPSBpc0JpdFNldCggdHlwZSwgNyApO1xuXG5cdFx0XHRcdC8vIGNvbnNvbGUubG9nKFwidHlwZVwiLCB0eXBlLCBcImJpdHNcIiwgaXNRdWFkLCBoYXNNYXRlcmlhbCwgaGFzRmFjZVZlcnRleFV2LCBoYXNGYWNlTm9ybWFsLCBoYXNGYWNlVmVydGV4Tm9ybWFsLCBoYXNGYWNlQ29sb3IsIGhhc0ZhY2VWZXJ0ZXhDb2xvcik7XG5cblx0XHRcdFx0aWYgKCBpc1F1YWQgKSB7XG5cblx0XHRcdFx0XHRmYWNlQSA9IG5ldyBGYWNlMygpO1xuXHRcdFx0XHRcdGZhY2VBLmEgPSBmYWNlc1sgb2Zmc2V0IF07XG5cdFx0XHRcdFx0ZmFjZUEuYiA9IGZhY2VzWyBvZmZzZXQgKyAxIF07XG5cdFx0XHRcdFx0ZmFjZUEuYyA9IGZhY2VzWyBvZmZzZXQgKyAzIF07XG5cblx0XHRcdFx0XHRmYWNlQiA9IG5ldyBGYWNlMygpO1xuXHRcdFx0XHRcdGZhY2VCLmEgPSBmYWNlc1sgb2Zmc2V0ICsgMSBdO1xuXHRcdFx0XHRcdGZhY2VCLmIgPSBmYWNlc1sgb2Zmc2V0ICsgMiBdO1xuXHRcdFx0XHRcdGZhY2VCLmMgPSBmYWNlc1sgb2Zmc2V0ICsgMyBdO1xuXG5cdFx0XHRcdFx0b2Zmc2V0ICs9IDQ7XG5cblx0XHRcdFx0XHRpZiAoIGhhc01hdGVyaWFsICkge1xuXG5cdFx0XHRcdFx0XHRtYXRlcmlhbEluZGV4ID0gZmFjZXNbIG9mZnNldCArKyBdO1xuXHRcdFx0XHRcdFx0ZmFjZUEubWF0ZXJpYWxJbmRleCA9IG1hdGVyaWFsSW5kZXg7XG5cdFx0XHRcdFx0XHRmYWNlQi5tYXRlcmlhbEluZGV4ID0gbWF0ZXJpYWxJbmRleDtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIHRvIGdldCBmYWNlIDw9PiB1diBpbmRleCBjb3JyZXNwb25kZW5jZVxuXG5cdFx0XHRcdFx0ZmkgPSBnZW9tZXRyeS5mYWNlcy5sZW5ndGg7XG5cblx0XHRcdFx0XHRpZiAoIGhhc0ZhY2VWZXJ0ZXhVdiApIHtcblxuXHRcdFx0XHRcdFx0Zm9yICggaSA9IDA7IGkgPCBuVXZMYXllcnM7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdFx0dXZMYXllciA9IGpzb24udXZzWyBpIF07XG5cblx0XHRcdFx0XHRcdFx0Z2VvbWV0cnkuZmFjZVZlcnRleFV2c1sgaSBdWyBmaSBdID0gW107XG5cdFx0XHRcdFx0XHRcdGdlb21ldHJ5LmZhY2VWZXJ0ZXhVdnNbIGkgXVsgZmkgKyAxIF0gPSBbXTtcblxuXHRcdFx0XHRcdFx0XHRmb3IgKCBqID0gMDsgaiA8IDQ7IGogKysgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHR1dkluZGV4ID0gZmFjZXNbIG9mZnNldCArKyBdO1xuXG5cdFx0XHRcdFx0XHRcdFx0dSA9IHV2TGF5ZXJbIHV2SW5kZXggKiAyIF07XG5cdFx0XHRcdFx0XHRcdFx0diA9IHV2TGF5ZXJbIHV2SW5kZXggKiAyICsgMSBdO1xuXG5cdFx0XHRcdFx0XHRcdFx0dXYgPSBuZXcgVmVjdG9yMiggdSwgdiApO1xuXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCBqICE9PSAyICkgZ2VvbWV0cnkuZmFjZVZlcnRleFV2c1sgaSBdWyBmaSBdLnB1c2goIHV2ICk7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKCBqICE9PSAwICkgZ2VvbWV0cnkuZmFjZVZlcnRleFV2c1sgaSBdWyBmaSArIDEgXS5wdXNoKCB1diApO1xuXG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKCBoYXNGYWNlTm9ybWFsICkge1xuXG5cdFx0XHRcdFx0XHRub3JtYWxJbmRleCA9IGZhY2VzWyBvZmZzZXQgKysgXSAqIDM7XG5cblx0XHRcdFx0XHRcdGZhY2VBLm5vcm1hbC5zZXQoXG5cdFx0XHRcdFx0XHRcdG5vcm1hbHNbIG5vcm1hbEluZGV4ICsrIF0sXG5cdFx0XHRcdFx0XHRcdG5vcm1hbHNbIG5vcm1hbEluZGV4ICsrIF0sXG5cdFx0XHRcdFx0XHRcdG5vcm1hbHNbIG5vcm1hbEluZGV4IF1cblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdGZhY2VCLm5vcm1hbC5jb3B5KCBmYWNlQS5ub3JtYWwgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmICggaGFzRmFjZVZlcnRleE5vcm1hbCApIHtcblxuXHRcdFx0XHRcdFx0Zm9yICggaSA9IDA7IGkgPCA0OyBpICsrICkge1xuXG5cdFx0XHRcdFx0XHRcdG5vcm1hbEluZGV4ID0gZmFjZXNbIG9mZnNldCArKyBdICogMztcblxuXHRcdFx0XHRcdFx0XHRub3JtYWwgPSBuZXcgVmVjdG9yMyhcblx0XHRcdFx0XHRcdFx0XHRub3JtYWxzWyBub3JtYWxJbmRleCArKyBdLFxuXHRcdFx0XHRcdFx0XHRcdG5vcm1hbHNbIG5vcm1hbEluZGV4ICsrIF0sXG5cdFx0XHRcdFx0XHRcdFx0bm9ybWFsc1sgbm9ybWFsSW5kZXggXVxuXHRcdFx0XHRcdFx0XHQpO1xuXG5cblx0XHRcdFx0XHRcdFx0aWYgKCBpICE9PSAyICkgZmFjZUEudmVydGV4Tm9ybWFscy5wdXNoKCBub3JtYWwgKTtcblx0XHRcdFx0XHRcdFx0aWYgKCBpICE9PSAwICkgZmFjZUIudmVydGV4Tm9ybWFscy5wdXNoKCBub3JtYWwgKTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cblx0XHRcdFx0XHRpZiAoIGhhc0ZhY2VDb2xvciApIHtcblxuXHRcdFx0XHRcdFx0Y29sb3JJbmRleCA9IGZhY2VzWyBvZmZzZXQgKysgXTtcblx0XHRcdFx0XHRcdGhleCA9IGNvbG9yc1sgY29sb3JJbmRleCBdO1xuXG5cdFx0XHRcdFx0XHRmYWNlQS5jb2xvci5zZXRIZXgoIGhleCApO1xuXHRcdFx0XHRcdFx0ZmFjZUIuY29sb3Iuc2V0SGV4KCBoZXggKTtcblxuXHRcdFx0XHRcdH1cblxuXG5cdFx0XHRcdFx0aWYgKCBoYXNGYWNlVmVydGV4Q29sb3IgKSB7XG5cblx0XHRcdFx0XHRcdGZvciAoIGkgPSAwOyBpIDwgNDsgaSArKyApIHtcblxuXHRcdFx0XHRcdFx0XHRjb2xvckluZGV4ID0gZmFjZXNbIG9mZnNldCArKyBdO1xuXHRcdFx0XHRcdFx0XHRoZXggPSBjb2xvcnNbIGNvbG9ySW5kZXggXTtcblxuXHRcdFx0XHRcdFx0XHRpZiAoIGkgIT09IDIgKSBmYWNlQS52ZXJ0ZXhDb2xvcnMucHVzaCggbmV3IENvbG9yKCBoZXggKSApO1xuXHRcdFx0XHRcdFx0XHRpZiAoIGkgIT09IDAgKSBmYWNlQi52ZXJ0ZXhDb2xvcnMucHVzaCggbmV3IENvbG9yKCBoZXggKSApO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRnZW9tZXRyeS5mYWNlcy5wdXNoKCBmYWNlQSApO1xuXHRcdFx0XHRcdGdlb21ldHJ5LmZhY2VzLnB1c2goIGZhY2VCICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGZhY2UgPSBuZXcgRmFjZTMoKTtcblx0XHRcdFx0XHRmYWNlLmEgPSBmYWNlc1sgb2Zmc2V0ICsrIF07XG5cdFx0XHRcdFx0ZmFjZS5iID0gZmFjZXNbIG9mZnNldCArKyBdO1xuXHRcdFx0XHRcdGZhY2UuYyA9IGZhY2VzWyBvZmZzZXQgKysgXTtcblxuXHRcdFx0XHRcdGlmICggaGFzTWF0ZXJpYWwgKSB7XG5cblx0XHRcdFx0XHRcdG1hdGVyaWFsSW5kZXggPSBmYWNlc1sgb2Zmc2V0ICsrIF07XG5cdFx0XHRcdFx0XHRmYWNlLm1hdGVyaWFsSW5kZXggPSBtYXRlcmlhbEluZGV4O1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gdG8gZ2V0IGZhY2UgPD0+IHV2IGluZGV4IGNvcnJlc3BvbmRlbmNlXG5cblx0XHRcdFx0XHRmaSA9IGdlb21ldHJ5LmZhY2VzLmxlbmd0aDtcblxuXHRcdFx0XHRcdGlmICggaGFzRmFjZVZlcnRleFV2ICkge1xuXG5cdFx0XHRcdFx0XHRmb3IgKCBpID0gMDsgaSA8IG5VdkxheWVyczsgaSArKyApIHtcblxuXHRcdFx0XHRcdFx0XHR1dkxheWVyID0ganNvbi51dnNbIGkgXTtcblxuXHRcdFx0XHRcdFx0XHRnZW9tZXRyeS5mYWNlVmVydGV4VXZzWyBpIF1bIGZpIF0gPSBbXTtcblxuXHRcdFx0XHRcdFx0XHRmb3IgKCBqID0gMDsgaiA8IDM7IGogKysgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHR1dkluZGV4ID0gZmFjZXNbIG9mZnNldCArKyBdO1xuXG5cdFx0XHRcdFx0XHRcdFx0dSA9IHV2TGF5ZXJbIHV2SW5kZXggKiAyIF07XG5cdFx0XHRcdFx0XHRcdFx0diA9IHV2TGF5ZXJbIHV2SW5kZXggKiAyICsgMSBdO1xuXG5cdFx0XHRcdFx0XHRcdFx0dXYgPSBuZXcgVmVjdG9yMiggdSwgdiApO1xuXG5cdFx0XHRcdFx0XHRcdFx0Z2VvbWV0cnkuZmFjZVZlcnRleFV2c1sgaSBdWyBmaSBdLnB1c2goIHV2ICk7XG5cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoIGhhc0ZhY2VOb3JtYWwgKSB7XG5cblx0XHRcdFx0XHRcdG5vcm1hbEluZGV4ID0gZmFjZXNbIG9mZnNldCArKyBdICogMztcblxuXHRcdFx0XHRcdFx0ZmFjZS5ub3JtYWwuc2V0KFxuXHRcdFx0XHRcdFx0XHRub3JtYWxzWyBub3JtYWxJbmRleCArKyBdLFxuXHRcdFx0XHRcdFx0XHRub3JtYWxzWyBub3JtYWxJbmRleCArKyBdLFxuXHRcdFx0XHRcdFx0XHRub3JtYWxzWyBub3JtYWxJbmRleCBdXG5cdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKCBoYXNGYWNlVmVydGV4Tm9ybWFsICkge1xuXG5cdFx0XHRcdFx0XHRmb3IgKCBpID0gMDsgaSA8IDM7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdFx0bm9ybWFsSW5kZXggPSBmYWNlc1sgb2Zmc2V0ICsrIF0gKiAzO1xuXG5cdFx0XHRcdFx0XHRcdG5vcm1hbCA9IG5ldyBWZWN0b3IzKFxuXHRcdFx0XHRcdFx0XHRcdG5vcm1hbHNbIG5vcm1hbEluZGV4ICsrIF0sXG5cdFx0XHRcdFx0XHRcdFx0bm9ybWFsc1sgbm9ybWFsSW5kZXggKysgXSxcblx0XHRcdFx0XHRcdFx0XHRub3JtYWxzWyBub3JtYWxJbmRleCBdXG5cdFx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdFx0ZmFjZS52ZXJ0ZXhOb3JtYWxzLnB1c2goIG5vcm1hbCApO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9XG5cblxuXHRcdFx0XHRcdGlmICggaGFzRmFjZUNvbG9yICkge1xuXG5cdFx0XHRcdFx0XHRjb2xvckluZGV4ID0gZmFjZXNbIG9mZnNldCArKyBdO1xuXHRcdFx0XHRcdFx0ZmFjZS5jb2xvci5zZXRIZXgoIGNvbG9yc1sgY29sb3JJbmRleCBdICk7XG5cblx0XHRcdFx0XHR9XG5cblxuXHRcdFx0XHRcdGlmICggaGFzRmFjZVZlcnRleENvbG9yICkge1xuXG5cdFx0XHRcdFx0XHRmb3IgKCBpID0gMDsgaSA8IDM7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdFx0Y29sb3JJbmRleCA9IGZhY2VzWyBvZmZzZXQgKysgXTtcblx0XHRcdFx0XHRcdFx0ZmFjZS52ZXJ0ZXhDb2xvcnMucHVzaCggbmV3IENvbG9yKCBjb2xvcnNbIGNvbG9ySW5kZXggXSApICk7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGdlb21ldHJ5LmZhY2VzLnB1c2goIGZhY2UgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIHBhcnNlU2tpbigganNvbiwgZ2VvbWV0cnkgKSB7XG5cblx0XHRcdHZhciBpbmZsdWVuY2VzUGVyVmVydGV4ID0gKCBqc29uLmluZmx1ZW5jZXNQZXJWZXJ0ZXggIT09IHVuZGVmaW5lZCApID8ganNvbi5pbmZsdWVuY2VzUGVyVmVydGV4IDogMjtcblxuXHRcdFx0aWYgKCBqc29uLnNraW5XZWlnaHRzICkge1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGpzb24uc2tpbldlaWdodHMubGVuZ3RoOyBpIDwgbDsgaSArPSBpbmZsdWVuY2VzUGVyVmVydGV4ICkge1xuXG5cdFx0XHRcdFx0dmFyIHggPSBqc29uLnNraW5XZWlnaHRzWyBpIF07XG5cdFx0XHRcdFx0dmFyIHkgPSAoIGluZmx1ZW5jZXNQZXJWZXJ0ZXggPiAxICkgPyBqc29uLnNraW5XZWlnaHRzWyBpICsgMSBdIDogMDtcblx0XHRcdFx0XHR2YXIgeiA9ICggaW5mbHVlbmNlc1BlclZlcnRleCA+IDIgKSA/IGpzb24uc2tpbldlaWdodHNbIGkgKyAyIF0gOiAwO1xuXHRcdFx0XHRcdHZhciB3ID0gKCBpbmZsdWVuY2VzUGVyVmVydGV4ID4gMyApID8ganNvbi5za2luV2VpZ2h0c1sgaSArIDMgXSA6IDA7XG5cblx0XHRcdFx0XHRnZW9tZXRyeS5za2luV2VpZ2h0cy5wdXNoKCBuZXcgVmVjdG9yNCggeCwgeSwgeiwgdyApICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdGlmICgganNvbi5za2luSW5kaWNlcyApIHtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBqc29uLnNraW5JbmRpY2VzLmxlbmd0aDsgaSA8IGw7IGkgKz0gaW5mbHVlbmNlc1BlclZlcnRleCApIHtcblxuXHRcdFx0XHRcdHZhciBhID0ganNvbi5za2luSW5kaWNlc1sgaSBdO1xuXHRcdFx0XHRcdHZhciBiID0gKCBpbmZsdWVuY2VzUGVyVmVydGV4ID4gMSApID8ganNvbi5za2luSW5kaWNlc1sgaSArIDEgXSA6IDA7XG5cdFx0XHRcdFx0dmFyIGMgPSAoIGluZmx1ZW5jZXNQZXJWZXJ0ZXggPiAyICkgPyBqc29uLnNraW5JbmRpY2VzWyBpICsgMiBdIDogMDtcblx0XHRcdFx0XHR2YXIgZCA9ICggaW5mbHVlbmNlc1BlclZlcnRleCA+IDMgKSA/IGpzb24uc2tpbkluZGljZXNbIGkgKyAzIF0gOiAwO1xuXG5cdFx0XHRcdFx0Z2VvbWV0cnkuc2tpbkluZGljZXMucHVzaCggbmV3IFZlY3RvcjQoIGEsIGIsIGMsIGQgKSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRnZW9tZXRyeS5ib25lcyA9IGpzb24uYm9uZXM7XG5cblx0XHRcdGlmICggZ2VvbWV0cnkuYm9uZXMgJiYgZ2VvbWV0cnkuYm9uZXMubGVuZ3RoID4gMCAmJiAoIGdlb21ldHJ5LnNraW5XZWlnaHRzLmxlbmd0aCAhPT0gZ2VvbWV0cnkuc2tpbkluZGljZXMubGVuZ3RoIHx8IGdlb21ldHJ5LnNraW5JbmRpY2VzLmxlbmd0aCAhPT0gZ2VvbWV0cnkudmVydGljZXMubGVuZ3RoICkgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnV2hlbiBza2lubmluZywgbnVtYmVyIG9mIHZlcnRpY2VzICgnICsgZ2VvbWV0cnkudmVydGljZXMubGVuZ3RoICsgJyksIHNraW5JbmRpY2VzICgnICtcblx0XHRcdFx0XHRnZW9tZXRyeS5za2luSW5kaWNlcy5sZW5ndGggKyAnKSwgYW5kIHNraW5XZWlnaHRzICgnICsgZ2VvbWV0cnkuc2tpbldlaWdodHMubGVuZ3RoICsgJykgc2hvdWxkIG1hdGNoLicgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gcGFyc2VNb3JwaGluZygganNvbiwgZ2VvbWV0cnkgKSB7XG5cblx0XHRcdHZhciBzY2FsZSA9IGpzb24uc2NhbGU7XG5cblx0XHRcdGlmICgganNvbi5tb3JwaFRhcmdldHMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBqc29uLm1vcnBoVGFyZ2V0cy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0Z2VvbWV0cnkubW9ycGhUYXJnZXRzWyBpIF0gPSB7fTtcblx0XHRcdFx0XHRnZW9tZXRyeS5tb3JwaFRhcmdldHNbIGkgXS5uYW1lID0ganNvbi5tb3JwaFRhcmdldHNbIGkgXS5uYW1lO1xuXHRcdFx0XHRcdGdlb21ldHJ5Lm1vcnBoVGFyZ2V0c1sgaSBdLnZlcnRpY2VzID0gW107XG5cblx0XHRcdFx0XHR2YXIgZHN0VmVydGljZXMgPSBnZW9tZXRyeS5tb3JwaFRhcmdldHNbIGkgXS52ZXJ0aWNlcztcblx0XHRcdFx0XHR2YXIgc3JjVmVydGljZXMgPSBqc29uLm1vcnBoVGFyZ2V0c1sgaSBdLnZlcnRpY2VzO1xuXG5cdFx0XHRcdFx0Zm9yICggdmFyIHYgPSAwLCB2bCA9IHNyY1ZlcnRpY2VzLmxlbmd0aDsgdiA8IHZsOyB2ICs9IDMgKSB7XG5cblx0XHRcdFx0XHRcdHZhciB2ZXJ0ZXggPSBuZXcgVmVjdG9yMygpO1xuXHRcdFx0XHRcdFx0dmVydGV4LnggPSBzcmNWZXJ0aWNlc1sgdiBdICogc2NhbGU7XG5cdFx0XHRcdFx0XHR2ZXJ0ZXgueSA9IHNyY1ZlcnRpY2VzWyB2ICsgMSBdICogc2NhbGU7XG5cdFx0XHRcdFx0XHR2ZXJ0ZXgueiA9IHNyY1ZlcnRpY2VzWyB2ICsgMiBdICogc2NhbGU7XG5cblx0XHRcdFx0XHRcdGRzdFZlcnRpY2VzLnB1c2goIHZlcnRleCApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGpzb24ubW9ycGhDb2xvcnMgIT09IHVuZGVmaW5lZCAmJiBqc29uLm1vcnBoQ29sb3JzLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuSlNPTkxvYWRlcjogXCJtb3JwaENvbG9yc1wiIG5vIGxvbmdlciBzdXBwb3J0ZWQuIFVzaW5nIHRoZW0gYXMgZmFjZSBjb2xvcnMuJyApO1xuXG5cdFx0XHRcdHZhciBmYWNlcyA9IGdlb21ldHJ5LmZhY2VzO1xuXHRcdFx0XHR2YXIgbW9ycGhDb2xvcnMgPSBqc29uLm1vcnBoQ29sb3JzWyAwIF0uY29sb3JzO1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGZhY2VzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRmYWNlc1sgaSBdLmNvbG9yLmZyb21BcnJheSggbW9ycGhDb2xvcnMsIGkgKiAzICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBwYXJzZUFuaW1hdGlvbnMoIGpzb24sIGdlb21ldHJ5ICkge1xuXG5cdFx0XHR2YXIgb3V0cHV0QW5pbWF0aW9ucyA9IFtdO1xuXG5cdFx0XHQvLyBwYXJzZSBvbGQgc3R5bGUgQm9uZS9IaWVyYXJjaHkgYW5pbWF0aW9uc1xuXHRcdFx0dmFyIGFuaW1hdGlvbnMgPSBbXTtcblxuXHRcdFx0aWYgKCBqc29uLmFuaW1hdGlvbiAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGFuaW1hdGlvbnMucHVzaCgganNvbi5hbmltYXRpb24gKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGpzb24uYW5pbWF0aW9ucyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGlmICgganNvbi5hbmltYXRpb25zLmxlbmd0aCApIHtcblxuXHRcdFx0XHRcdGFuaW1hdGlvbnMgPSBhbmltYXRpb25zLmNvbmNhdCgganNvbi5hbmltYXRpb25zICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGFuaW1hdGlvbnMucHVzaCgganNvbi5hbmltYXRpb25zICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGFuaW1hdGlvbnMubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRcdHZhciBjbGlwID0gQW5pbWF0aW9uQ2xpcC5wYXJzZUFuaW1hdGlvbiggYW5pbWF0aW9uc1sgaSBdLCBnZW9tZXRyeS5ib25lcyApO1xuXHRcdFx0XHRpZiAoIGNsaXAgKSBvdXRwdXRBbmltYXRpb25zLnB1c2goIGNsaXAgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBwYXJzZSBpbXBsaWNpdCBtb3JwaCBhbmltYXRpb25zXG5cdFx0XHRpZiAoIGdlb21ldHJ5Lm1vcnBoVGFyZ2V0cyApIHtcblxuXHRcdFx0XHQvLyBUT0RPOiBGaWd1cmUgb3V0IHdoYXQgYW4gYXBwcm9wcmFpdGUgRlBTIGlzIGZvciBtb3JwaCB0YXJnZXQgYW5pbWF0aW9ucyAtLSBkZWZhdWx0aW5nIHRvIDEwLCBidXQgcmVhbGx5IGl0IGlzIGNvbXBsZXRlbHkgYXJiaXRyYXJ5LlxuXHRcdFx0XHR2YXIgbW9ycGhBbmltYXRpb25DbGlwcyA9IEFuaW1hdGlvbkNsaXAuQ3JlYXRlQ2xpcHNGcm9tTW9ycGhUYXJnZXRTZXF1ZW5jZXMoIGdlb21ldHJ5Lm1vcnBoVGFyZ2V0cywgMTAgKTtcblx0XHRcdFx0b3V0cHV0QW5pbWF0aW9ucyA9IG91dHB1dEFuaW1hdGlvbnMuY29uY2F0KCBtb3JwaEFuaW1hdGlvbkNsaXBzICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBvdXRwdXRBbmltYXRpb25zLmxlbmd0aCA+IDAgKSBnZW9tZXRyeS5hbmltYXRpb25zID0gb3V0cHV0QW5pbWF0aW9ucztcblxuXHRcdH1cblxuXHRcdHJldHVybiBmdW5jdGlvbiAoIGpzb24sIHRleHR1cmVQYXRoICkge1xuXG5cdFx0XHRpZiAoIGpzb24uZGF0YSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdC8vIEdlb21ldHJ5IDQuMCBzcGVjXG5cdFx0XHRcdGpzb24gPSBqc29uLmRhdGE7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBqc29uLnNjYWxlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0anNvbi5zY2FsZSA9IDEuMCAvIGpzb24uc2NhbGU7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0anNvbi5zY2FsZSA9IDEuMDtcblxuXHRcdFx0fVxuXG5cdFx0XHR2YXIgZ2VvbWV0cnkgPSBuZXcgR2VvbWV0cnkoKTtcblxuXHRcdFx0cGFyc2VNb2RlbCgganNvbiwgZ2VvbWV0cnkgKTtcblx0XHRcdHBhcnNlU2tpbigganNvbiwgZ2VvbWV0cnkgKTtcblx0XHRcdHBhcnNlTW9ycGhpbmcoIGpzb24sIGdlb21ldHJ5ICk7XG5cdFx0XHRwYXJzZUFuaW1hdGlvbnMoIGpzb24sIGdlb21ldHJ5ICk7XG5cblx0XHRcdGdlb21ldHJ5LmNvbXB1dGVGYWNlTm9ybWFscygpO1xuXHRcdFx0Z2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7XG5cblx0XHRcdGlmICgganNvbi5tYXRlcmlhbHMgPT09IHVuZGVmaW5lZCB8fCBqc29uLm1hdGVyaWFscy5sZW5ndGggPT09IDAgKSB7XG5cblx0XHRcdFx0cmV0dXJuIHsgZ2VvbWV0cnk6IGdlb21ldHJ5IH07XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0dmFyIG1hdGVyaWFscyA9IExvYWRlci5wcm90b3R5cGUuaW5pdE1hdGVyaWFscygganNvbi5tYXRlcmlhbHMsIHRleHR1cmVQYXRoLCB0aGlzLmNyb3NzT3JpZ2luICk7XG5cblx0XHRcdFx0cmV0dXJuIHsgZ2VvbWV0cnk6IGdlb21ldHJ5LCBtYXRlcmlhbHM6IG1hdGVyaWFscyB9O1xuXG5cdFx0XHR9XG5cblx0XHR9O1xuXG5cdH0gKSgpXG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIE9iamVjdExvYWRlciggbWFuYWdlciApIHtcblxuXHR0aGlzLm1hbmFnZXIgPSAoIG1hbmFnZXIgIT09IHVuZGVmaW5lZCApID8gbWFuYWdlciA6IERlZmF1bHRMb2FkaW5nTWFuYWdlcjtcblx0dGhpcy50ZXh0dXJlUGF0aCA9ICcnO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIE9iamVjdExvYWRlci5wcm90b3R5cGUsIHtcblxuXHRsb2FkOiBmdW5jdGlvbiAoIHVybCwgb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkge1xuXG5cdFx0aWYgKCB0aGlzLnRleHR1cmVQYXRoID09PSAnJyApIHtcblxuXHRcdFx0dGhpcy50ZXh0dXJlUGF0aCA9IHVybC5zdWJzdHJpbmcoIDAsIHVybC5sYXN0SW5kZXhPZiggJy8nICkgKyAxICk7XG5cblx0XHR9XG5cblx0XHR2YXIgc2NvcGUgPSB0aGlzO1xuXG5cdFx0dmFyIGxvYWRlciA9IG5ldyBGaWxlTG9hZGVyKCBzY29wZS5tYW5hZ2VyICk7XG5cdFx0bG9hZGVyLmxvYWQoIHVybCwgZnVuY3Rpb24gKCB0ZXh0ICkge1xuXG5cdFx0XHR2YXIganNvbiA9IG51bGw7XG5cblx0XHRcdHRyeSB7XG5cblx0XHRcdFx0anNvbiA9IEpTT04ucGFyc2UoIHRleHQgKTtcblxuXHRcdFx0fSBjYXRjaCAoIGVycm9yICkge1xuXG5cdFx0XHRcdGlmICggb25FcnJvciAhPT0gdW5kZWZpbmVkICkgb25FcnJvciggZXJyb3IgKTtcblxuXHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUU6T2JqZWN0TG9hZGVyOiBDYW5cXCd0IHBhcnNlICcgKyB1cmwgKyAnLicsIGVycm9yLm1lc3NhZ2UgKTtcblxuXHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIG1ldGFkYXRhID0ganNvbi5tZXRhZGF0YTtcblxuXHRcdFx0aWYgKCBtZXRhZGF0YSA9PT0gdW5kZWZpbmVkIHx8IG1ldGFkYXRhLnR5cGUgPT09IHVuZGVmaW5lZCB8fCBtZXRhZGF0YS50eXBlLnRvTG93ZXJDYXNlKCkgPT09ICdnZW9tZXRyeScgKSB7XG5cblx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLk9iamVjdExvYWRlcjogQ2FuXFwndCBsb2FkICcgKyB1cmwgKyAnLiBVc2UgVEhSRUUuSlNPTkxvYWRlciBpbnN0ZWFkLicgKTtcblx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHR9XG5cblx0XHRcdHNjb3BlLnBhcnNlKCBqc29uLCBvbkxvYWQgKTtcblxuXHRcdH0sIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKTtcblxuXHR9LFxuXG5cdHNldFRleHR1cmVQYXRoOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy50ZXh0dXJlUGF0aCA9IHZhbHVlO1xuXG5cdH0sXG5cblx0c2V0Q3Jvc3NPcmlnaW46IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLmNyb3NzT3JpZ2luID0gdmFsdWU7XG5cblx0fSxcblxuXHRwYXJzZTogZnVuY3Rpb24gKCBqc29uLCBvbkxvYWQgKSB7XG5cblx0XHR2YXIgZ2VvbWV0cmllcyA9IHRoaXMucGFyc2VHZW9tZXRyaWVzKCBqc29uLmdlb21ldHJpZXMgKTtcblxuXHRcdHZhciBpbWFnZXMgPSB0aGlzLnBhcnNlSW1hZ2VzKCBqc29uLmltYWdlcywgZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRpZiAoIG9uTG9hZCAhPT0gdW5kZWZpbmVkICkgb25Mb2FkKCBvYmplY3QgKTtcblxuXHRcdH0gKTtcblxuXHRcdHZhciB0ZXh0dXJlcyA9IHRoaXMucGFyc2VUZXh0dXJlcygganNvbi50ZXh0dXJlcywgaW1hZ2VzICk7XG5cdFx0dmFyIG1hdGVyaWFscyA9IHRoaXMucGFyc2VNYXRlcmlhbHMoIGpzb24ubWF0ZXJpYWxzLCB0ZXh0dXJlcyApO1xuXG5cdFx0dmFyIG9iamVjdCA9IHRoaXMucGFyc2VPYmplY3QoIGpzb24ub2JqZWN0LCBnZW9tZXRyaWVzLCBtYXRlcmlhbHMgKTtcblxuXHRcdGlmICgganNvbi5hbmltYXRpb25zICkge1xuXG5cdFx0XHRvYmplY3QuYW5pbWF0aW9ucyA9IHRoaXMucGFyc2VBbmltYXRpb25zKCBqc29uLmFuaW1hdGlvbnMgKTtcblxuXHRcdH1cblxuXHRcdGlmICgganNvbi5pbWFnZXMgPT09IHVuZGVmaW5lZCB8fCBqc29uLmltYWdlcy5sZW5ndGggPT09IDAgKSB7XG5cblx0XHRcdGlmICggb25Mb2FkICE9PSB1bmRlZmluZWQgKSBvbkxvYWQoIG9iamVjdCApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIG9iamVjdDtcblxuXHR9LFxuXG5cdHBhcnNlR2VvbWV0cmllczogZnVuY3Rpb24gKCBqc29uICkge1xuXG5cdFx0dmFyIGdlb21ldHJpZXMgPSB7fTtcblxuXHRcdGlmICgganNvbiAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR2YXIgZ2VvbWV0cnlMb2FkZXIgPSBuZXcgSlNPTkxvYWRlcigpO1xuXHRcdFx0dmFyIGJ1ZmZlckdlb21ldHJ5TG9hZGVyID0gbmV3IEJ1ZmZlckdlb21ldHJ5TG9hZGVyKCk7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGpzb24ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHR2YXIgZ2VvbWV0cnk7XG5cdFx0XHRcdHZhciBkYXRhID0ganNvblsgaSBdO1xuXG5cdFx0XHRcdHN3aXRjaCAoIGRhdGEudHlwZSApIHtcblxuXHRcdFx0XHRcdGNhc2UgJ1BsYW5lR2VvbWV0cnknOlxuXHRcdFx0XHRcdGNhc2UgJ1BsYW5lQnVmZmVyR2VvbWV0cnknOlxuXG5cdFx0XHRcdFx0XHRnZW9tZXRyeSA9IG5ldyBHZW9tZXRyaWVzWyBkYXRhLnR5cGUgXShcblx0XHRcdFx0XHRcdFx0ZGF0YS53aWR0aCxcblx0XHRcdFx0XHRcdFx0ZGF0YS5oZWlnaHQsXG5cdFx0XHRcdFx0XHRcdGRhdGEud2lkdGhTZWdtZW50cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5oZWlnaHRTZWdtZW50c1xuXHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlICdCb3hHZW9tZXRyeSc6XG5cdFx0XHRcdFx0Y2FzZSAnQm94QnVmZmVyR2VvbWV0cnknOlxuXHRcdFx0XHRcdGNhc2UgJ0N1YmVHZW9tZXRyeSc6IC8vIGJhY2t3YXJkcyBjb21wYXRpYmxlXG5cblx0XHRcdFx0XHRcdGdlb21ldHJ5ID0gbmV3IEdlb21ldHJpZXNbIGRhdGEudHlwZSBdKFxuXHRcdFx0XHRcdFx0XHRkYXRhLndpZHRoLFxuXHRcdFx0XHRcdFx0XHRkYXRhLmhlaWdodCxcblx0XHRcdFx0XHRcdFx0ZGF0YS5kZXB0aCxcblx0XHRcdFx0XHRcdFx0ZGF0YS53aWR0aFNlZ21lbnRzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLmhlaWdodFNlZ21lbnRzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLmRlcHRoU2VnbWVudHNcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSAnQ2lyY2xlR2VvbWV0cnknOlxuXHRcdFx0XHRcdGNhc2UgJ0NpcmNsZUJ1ZmZlckdlb21ldHJ5JzpcblxuXHRcdFx0XHRcdFx0Z2VvbWV0cnkgPSBuZXcgR2VvbWV0cmllc1sgZGF0YS50eXBlIF0oXG5cdFx0XHRcdFx0XHRcdGRhdGEucmFkaXVzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnNlZ21lbnRzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnRoZXRhU3RhcnQsXG5cdFx0XHRcdFx0XHRcdGRhdGEudGhldGFMZW5ndGhcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSAnQ3lsaW5kZXJHZW9tZXRyeSc6XG5cdFx0XHRcdFx0Y2FzZSAnQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeSc6XG5cblx0XHRcdFx0XHRcdGdlb21ldHJ5ID0gbmV3IEdlb21ldHJpZXNbIGRhdGEudHlwZSBdKFxuXHRcdFx0XHRcdFx0XHRkYXRhLnJhZGl1c1RvcCxcblx0XHRcdFx0XHRcdFx0ZGF0YS5yYWRpdXNCb3R0b20sXG5cdFx0XHRcdFx0XHRcdGRhdGEuaGVpZ2h0LFxuXHRcdFx0XHRcdFx0XHRkYXRhLnJhZGlhbFNlZ21lbnRzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLmhlaWdodFNlZ21lbnRzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLm9wZW5FbmRlZCxcblx0XHRcdFx0XHRcdFx0ZGF0YS50aGV0YVN0YXJ0LFxuXHRcdFx0XHRcdFx0XHRkYXRhLnRoZXRhTGVuZ3RoXG5cdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgJ0NvbmVHZW9tZXRyeSc6XG5cdFx0XHRcdFx0Y2FzZSAnQ29uZUJ1ZmZlckdlb21ldHJ5JzpcblxuXHRcdFx0XHRcdFx0Z2VvbWV0cnkgPSBuZXcgR2VvbWV0cmllc1sgZGF0YS50eXBlIF0oXG5cdFx0XHRcdFx0XHRcdGRhdGEucmFkaXVzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLmhlaWdodCxcblx0XHRcdFx0XHRcdFx0ZGF0YS5yYWRpYWxTZWdtZW50cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5oZWlnaHRTZWdtZW50cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5vcGVuRW5kZWQsXG5cdFx0XHRcdFx0XHRcdGRhdGEudGhldGFTdGFydCxcblx0XHRcdFx0XHRcdFx0ZGF0YS50aGV0YUxlbmd0aFxuXHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlICdTcGhlcmVHZW9tZXRyeSc6XG5cdFx0XHRcdFx0Y2FzZSAnU3BoZXJlQnVmZmVyR2VvbWV0cnknOlxuXG5cdFx0XHRcdFx0XHRnZW9tZXRyeSA9IG5ldyBHZW9tZXRyaWVzWyBkYXRhLnR5cGUgXShcblx0XHRcdFx0XHRcdFx0ZGF0YS5yYWRpdXMsXG5cdFx0XHRcdFx0XHRcdGRhdGEud2lkdGhTZWdtZW50cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5oZWlnaHRTZWdtZW50cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5waGlTdGFydCxcblx0XHRcdFx0XHRcdFx0ZGF0YS5waGlMZW5ndGgsXG5cdFx0XHRcdFx0XHRcdGRhdGEudGhldGFTdGFydCxcblx0XHRcdFx0XHRcdFx0ZGF0YS50aGV0YUxlbmd0aFxuXHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlICdEb2RlY2FoZWRyb25HZW9tZXRyeSc6XG5cdFx0XHRcdFx0Y2FzZSAnSWNvc2FoZWRyb25HZW9tZXRyeSc6XG5cdFx0XHRcdFx0Y2FzZSAnT2N0YWhlZHJvbkdlb21ldHJ5Jzpcblx0XHRcdFx0XHRjYXNlICdUZXRyYWhlZHJvbkdlb21ldHJ5JzpcblxuXHRcdFx0XHRcdFx0Z2VvbWV0cnkgPSBuZXcgR2VvbWV0cmllc1sgZGF0YS50eXBlIF0oXG5cdFx0XHRcdFx0XHRcdGRhdGEucmFkaXVzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLmRldGFpbFxuXHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlICdSaW5nR2VvbWV0cnknOlxuXHRcdFx0XHRcdGNhc2UgJ1JpbmdCdWZmZXJHZW9tZXRyeSc6XG5cblx0XHRcdFx0XHRcdGdlb21ldHJ5ID0gbmV3IEdlb21ldHJpZXNbIGRhdGEudHlwZSBdKFxuXHRcdFx0XHRcdFx0XHRkYXRhLmlubmVyUmFkaXVzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLm91dGVyUmFkaXVzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnRoZXRhU2VnbWVudHMsXG5cdFx0XHRcdFx0XHRcdGRhdGEucGhpU2VnbWVudHMsXG5cdFx0XHRcdFx0XHRcdGRhdGEudGhldGFTdGFydCxcblx0XHRcdFx0XHRcdFx0ZGF0YS50aGV0YUxlbmd0aFxuXHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlICdUb3J1c0dlb21ldHJ5Jzpcblx0XHRcdFx0XHRjYXNlICdUb3J1c0J1ZmZlckdlb21ldHJ5JzpcblxuXHRcdFx0XHRcdFx0Z2VvbWV0cnkgPSBuZXcgR2VvbWV0cmllc1sgZGF0YS50eXBlIF0oXG5cdFx0XHRcdFx0XHRcdGRhdGEucmFkaXVzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnR1YmUsXG5cdFx0XHRcdFx0XHRcdGRhdGEucmFkaWFsU2VnbWVudHMsXG5cdFx0XHRcdFx0XHRcdGRhdGEudHVidWxhclNlZ21lbnRzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLmFyY1xuXHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlICdUb3J1c0tub3RHZW9tZXRyeSc6XG5cdFx0XHRcdFx0Y2FzZSAnVG9ydXNLbm90QnVmZmVyR2VvbWV0cnknOlxuXG5cdFx0XHRcdFx0XHRnZW9tZXRyeSA9IG5ldyBHZW9tZXRyaWVzWyBkYXRhLnR5cGUgXShcblx0XHRcdFx0XHRcdFx0ZGF0YS5yYWRpdXMsXG5cdFx0XHRcdFx0XHRcdGRhdGEudHViZSxcblx0XHRcdFx0XHRcdFx0ZGF0YS50dWJ1bGFyU2VnbWVudHMsXG5cdFx0XHRcdFx0XHRcdGRhdGEucmFkaWFsU2VnbWVudHMsXG5cdFx0XHRcdFx0XHRcdGRhdGEucCxcblx0XHRcdFx0XHRcdFx0ZGF0YS5xXG5cdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgJ0xhdGhlR2VvbWV0cnknOlxuXHRcdFx0XHRcdGNhc2UgJ0xhdGhlQnVmZmVyR2VvbWV0cnknOlxuXG5cdFx0XHRcdFx0XHRnZW9tZXRyeSA9IG5ldyBHZW9tZXRyaWVzWyBkYXRhLnR5cGUgXShcblx0XHRcdFx0XHRcdFx0ZGF0YS5wb2ludHMsXG5cdFx0XHRcdFx0XHRcdGRhdGEuc2VnbWVudHMsXG5cdFx0XHRcdFx0XHRcdGRhdGEucGhpU3RhcnQsXG5cdFx0XHRcdFx0XHRcdGRhdGEucGhpTGVuZ3RoXG5cdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgJ0J1ZmZlckdlb21ldHJ5JzpcblxuXHRcdFx0XHRcdFx0Z2VvbWV0cnkgPSBidWZmZXJHZW9tZXRyeUxvYWRlci5wYXJzZSggZGF0YSApO1xuXG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgJ0dlb21ldHJ5JzpcblxuXHRcdFx0XHRcdFx0Z2VvbWV0cnkgPSBnZW9tZXRyeUxvYWRlci5wYXJzZSggZGF0YSwgdGhpcy50ZXh0dXJlUGF0aCApLmdlb21ldHJ5O1xuXG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGRlZmF1bHQ6XG5cblx0XHRcdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdExvYWRlcjogVW5zdXBwb3J0ZWQgZ2VvbWV0cnkgdHlwZSBcIicgKyBkYXRhLnR5cGUgKyAnXCInICk7XG5cblx0XHRcdFx0XHRcdGNvbnRpbnVlO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRnZW9tZXRyeS51dWlkID0gZGF0YS51dWlkO1xuXG5cdFx0XHRcdGlmICggZGF0YS5uYW1lICE9PSB1bmRlZmluZWQgKSBnZW9tZXRyeS5uYW1lID0gZGF0YS5uYW1lO1xuXG5cdFx0XHRcdGdlb21ldHJpZXNbIGRhdGEudXVpZCBdID0gZ2VvbWV0cnk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiBnZW9tZXRyaWVzO1xuXG5cdH0sXG5cblx0cGFyc2VNYXRlcmlhbHM6IGZ1bmN0aW9uICgganNvbiwgdGV4dHVyZXMgKSB7XG5cblx0XHR2YXIgbWF0ZXJpYWxzID0ge307XG5cblx0XHRpZiAoIGpzb24gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dmFyIGxvYWRlciA9IG5ldyBNYXRlcmlhbExvYWRlcigpO1xuXHRcdFx0bG9hZGVyLnNldFRleHR1cmVzKCB0ZXh0dXJlcyApO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBqc29uLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0dmFyIGRhdGEgPSBqc29uWyBpIF07XG5cblx0XHRcdFx0aWYgKCBkYXRhLnR5cGUgPT09ICdNdWx0aU1hdGVyaWFsJyApIHtcblxuXHRcdFx0XHRcdC8vIERlcHJlY2F0ZWRcblxuXHRcdFx0XHRcdHZhciBhcnJheSA9IFtdO1xuXG5cdFx0XHRcdFx0Zm9yICggdmFyIGogPSAwOyBqIDwgZGF0YS5tYXRlcmlhbHMubGVuZ3RoOyBqICsrICkge1xuXG5cdFx0XHRcdFx0XHRhcnJheS5wdXNoKCBsb2FkZXIucGFyc2UoIGRhdGEubWF0ZXJpYWxzWyBqIF0gKSApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0bWF0ZXJpYWxzWyBkYXRhLnV1aWQgXSA9IGFycmF5O1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRtYXRlcmlhbHNbIGRhdGEudXVpZCBdID0gbG9hZGVyLnBhcnNlKCBkYXRhICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gbWF0ZXJpYWxzO1xuXG5cdH0sXG5cblx0cGFyc2VBbmltYXRpb25zOiBmdW5jdGlvbiAoIGpzb24gKSB7XG5cblx0XHR2YXIgYW5pbWF0aW9ucyA9IFtdO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwganNvbi5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdHZhciBjbGlwID0gQW5pbWF0aW9uQ2xpcC5wYXJzZSgganNvblsgaSBdICk7XG5cblx0XHRcdGFuaW1hdGlvbnMucHVzaCggY2xpcCApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGFuaW1hdGlvbnM7XG5cblx0fSxcblxuXHRwYXJzZUltYWdlczogZnVuY3Rpb24gKCBqc29uLCBvbkxvYWQgKSB7XG5cblx0XHR2YXIgc2NvcGUgPSB0aGlzO1xuXHRcdHZhciBpbWFnZXMgPSB7fTtcblxuXHRcdGZ1bmN0aW9uIGxvYWRJbWFnZSggdXJsICkge1xuXG5cdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1TdGFydCggdXJsICk7XG5cblx0XHRcdHJldHVybiBsb2FkZXIubG9hZCggdXJsLCBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRW5kKCB1cmwgKTtcblxuXHRcdFx0fSwgdW5kZWZpbmVkLCBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRW5kKCB1cmwgKTtcblx0XHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRXJyb3IoIHVybCApO1xuXG5cdFx0XHR9ICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIGpzb24gIT09IHVuZGVmaW5lZCAmJiBqc29uLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdHZhciBtYW5hZ2VyID0gbmV3IExvYWRpbmdNYW5hZ2VyKCBvbkxvYWQgKTtcblxuXHRcdFx0dmFyIGxvYWRlciA9IG5ldyBJbWFnZUxvYWRlciggbWFuYWdlciApO1xuXHRcdFx0bG9hZGVyLnNldENyb3NzT3JpZ2luKCB0aGlzLmNyb3NzT3JpZ2luICk7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGpzb24ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHR2YXIgaW1hZ2UgPSBqc29uWyBpIF07XG5cdFx0XHRcdHZhciBwYXRoID0gL14oXFwvXFwvKXwoW2Etel0rOihcXC9cXC8pPykvaS50ZXN0KCBpbWFnZS51cmwgKSA/IGltYWdlLnVybCA6IHNjb3BlLnRleHR1cmVQYXRoICsgaW1hZ2UudXJsO1xuXG5cdFx0XHRcdGltYWdlc1sgaW1hZ2UudXVpZCBdID0gbG9hZEltYWdlKCBwYXRoICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiBpbWFnZXM7XG5cblx0fSxcblxuXHRwYXJzZVRleHR1cmVzOiBmdW5jdGlvbiAoIGpzb24sIGltYWdlcyApIHtcblxuXHRcdGZ1bmN0aW9uIHBhcnNlQ29uc3RhbnQoIHZhbHVlLCB0eXBlICkge1xuXG5cdFx0XHRpZiAoIHR5cGVvZiggdmFsdWUgKSA9PT0gJ251bWJlcicgKSByZXR1cm4gdmFsdWU7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdExvYWRlci5wYXJzZVRleHR1cmU6IENvbnN0YW50IHNob3VsZCBiZSBpbiBudW1lcmljIGZvcm0uJywgdmFsdWUgKTtcblxuXHRcdFx0cmV0dXJuIHR5cGVbIHZhbHVlIF07XG5cblx0XHR9XG5cblx0XHR2YXIgdGV4dHVyZXMgPSB7fTtcblxuXHRcdGlmICgganNvbiAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBqc29uLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0dmFyIGRhdGEgPSBqc29uWyBpIF07XG5cblx0XHRcdFx0aWYgKCBkYXRhLmltYWdlID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3RMb2FkZXI6IE5vIFwiaW1hZ2VcIiBzcGVjaWZpZWQgZm9yJywgZGF0YS51dWlkICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggaW1hZ2VzWyBkYXRhLmltYWdlIF0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdExvYWRlcjogVW5kZWZpbmVkIGltYWdlJywgZGF0YS5pbWFnZSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHR2YXIgdGV4dHVyZSA9IG5ldyBUZXh0dXJlKCBpbWFnZXNbIGRhdGEuaW1hZ2UgXSApO1xuXHRcdFx0XHR0ZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0XHR0ZXh0dXJlLnV1aWQgPSBkYXRhLnV1aWQ7XG5cblx0XHRcdFx0aWYgKCBkYXRhLm5hbWUgIT09IHVuZGVmaW5lZCApIHRleHR1cmUubmFtZSA9IGRhdGEubmFtZTtcblxuXHRcdFx0XHRpZiAoIGRhdGEubWFwcGluZyAhPT0gdW5kZWZpbmVkICkgdGV4dHVyZS5tYXBwaW5nID0gcGFyc2VDb25zdGFudCggZGF0YS5tYXBwaW5nLCBURVhUVVJFX01BUFBJTkcgKTtcblxuXHRcdFx0XHRpZiAoIGRhdGEub2Zmc2V0ICE9PSB1bmRlZmluZWQgKSB0ZXh0dXJlLm9mZnNldC5mcm9tQXJyYXkoIGRhdGEub2Zmc2V0ICk7XG5cdFx0XHRcdGlmICggZGF0YS5yZXBlYXQgIT09IHVuZGVmaW5lZCApIHRleHR1cmUucmVwZWF0LmZyb21BcnJheSggZGF0YS5yZXBlYXQgKTtcblx0XHRcdFx0aWYgKCBkYXRhLndyYXAgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdHRleHR1cmUud3JhcFMgPSBwYXJzZUNvbnN0YW50KCBkYXRhLndyYXBbIDAgXSwgVEVYVFVSRV9XUkFQUElORyApO1xuXHRcdFx0XHRcdHRleHR1cmUud3JhcFQgPSBwYXJzZUNvbnN0YW50KCBkYXRhLndyYXBbIDEgXSwgVEVYVFVSRV9XUkFQUElORyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIGRhdGEubWluRmlsdGVyICE9PSB1bmRlZmluZWQgKSB0ZXh0dXJlLm1pbkZpbHRlciA9IHBhcnNlQ29uc3RhbnQoIGRhdGEubWluRmlsdGVyLCBURVhUVVJFX0ZJTFRFUiApO1xuXHRcdFx0XHRpZiAoIGRhdGEubWFnRmlsdGVyICE9PSB1bmRlZmluZWQgKSB0ZXh0dXJlLm1hZ0ZpbHRlciA9IHBhcnNlQ29uc3RhbnQoIGRhdGEubWFnRmlsdGVyLCBURVhUVVJFX0ZJTFRFUiApO1xuXHRcdFx0XHRpZiAoIGRhdGEuYW5pc290cm9weSAhPT0gdW5kZWZpbmVkICkgdGV4dHVyZS5hbmlzb3Ryb3B5ID0gZGF0YS5hbmlzb3Ryb3B5O1xuXG5cdFx0XHRcdGlmICggZGF0YS5mbGlwWSAhPT0gdW5kZWZpbmVkICkgdGV4dHVyZS5mbGlwWSA9IGRhdGEuZmxpcFk7XG5cblx0XHRcdFx0dGV4dHVyZXNbIGRhdGEudXVpZCBdID0gdGV4dHVyZTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRleHR1cmVzO1xuXG5cdH0sXG5cblx0cGFyc2VPYmplY3Q6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBtYXRyaXggPSBuZXcgTWF0cml4NCgpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHBhcnNlT2JqZWN0KCBkYXRhLCBnZW9tZXRyaWVzLCBtYXRlcmlhbHMgKSB7XG5cblx0XHRcdHZhciBvYmplY3Q7XG5cblx0XHRcdGZ1bmN0aW9uIGdldEdlb21ldHJ5KCBuYW1lICkge1xuXG5cdFx0XHRcdGlmICggZ2VvbWV0cmllc1sgbmFtZSBdID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3RMb2FkZXI6IFVuZGVmaW5lZCBnZW9tZXRyeScsIG5hbWUgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIGdlb21ldHJpZXNbIG5hbWUgXTtcblxuXHRcdFx0fVxuXG5cdFx0XHRmdW5jdGlvbiBnZXRNYXRlcmlhbCggbmFtZSApIHtcblxuXHRcdFx0XHRpZiAoIG5hbWUgPT09IHVuZGVmaW5lZCApIHJldHVybiB1bmRlZmluZWQ7XG5cblx0XHRcdFx0aWYgKCBBcnJheS5pc0FycmF5KCBuYW1lICkgKSB7XG5cblx0XHRcdFx0XHR2YXIgYXJyYXkgPSBbXTtcblxuXHRcdFx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IG5hbWUubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdFx0dmFyIHV1aWQgPSBuYW1lWyBpIF07XG5cblx0XHRcdFx0XHRcdGlmICggbWF0ZXJpYWxzWyB1dWlkIF0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3RMb2FkZXI6IFVuZGVmaW5lZCBtYXRlcmlhbCcsIHV1aWQgKTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRhcnJheS5wdXNoKCBtYXRlcmlhbHNbIHV1aWQgXSApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmV0dXJuIGFycmF5O1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIG1hdGVyaWFsc1sgbmFtZSBdID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3RMb2FkZXI6IFVuZGVmaW5lZCBtYXRlcmlhbCcsIG5hbWUgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIG1hdGVyaWFsc1sgbmFtZSBdO1xuXG5cdFx0XHR9XG5cblx0XHRcdHN3aXRjaCAoIGRhdGEudHlwZSApIHtcblxuXHRcdFx0XHRjYXNlICdTY2VuZSc6XG5cblx0XHRcdFx0XHRvYmplY3QgPSBuZXcgU2NlbmUoKTtcblxuXHRcdFx0XHRcdGlmICggZGF0YS5iYWNrZ3JvdW5kICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRcdGlmICggTnVtYmVyLmlzSW50ZWdlciggZGF0YS5iYWNrZ3JvdW5kICkgKSB7XG5cblx0XHRcdFx0XHRcdFx0b2JqZWN0LmJhY2tncm91bmQgPSBuZXcgQ29sb3IoIGRhdGEuYmFja2dyb3VuZCApO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoIGRhdGEuZm9nICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRcdGlmICggZGF0YS5mb2cudHlwZSA9PT0gJ0ZvZycgKSB7XG5cblx0XHRcdFx0XHRcdFx0b2JqZWN0LmZvZyA9IG5ldyBGb2coIGRhdGEuZm9nLmNvbG9yLCBkYXRhLmZvZy5uZWFyLCBkYXRhLmZvZy5mYXIgKTtcblxuXHRcdFx0XHRcdFx0fSBlbHNlIGlmICggZGF0YS5mb2cudHlwZSA9PT0gJ0ZvZ0V4cDInICkge1xuXG5cdFx0XHRcdFx0XHRcdG9iamVjdC5mb2cgPSBuZXcgRm9nRXhwMiggZGF0YS5mb2cuY29sb3IsIGRhdGEuZm9nLmRlbnNpdHkgKTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSAnUGVyc3BlY3RpdmVDYW1lcmEnOlxuXG5cdFx0XHRcdFx0b2JqZWN0ID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCBkYXRhLmZvdiwgZGF0YS5hc3BlY3QsIGRhdGEubmVhciwgZGF0YS5mYXIgKTtcblxuXHRcdFx0XHRcdGlmICggZGF0YS5mb2N1cyAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LmZvY3VzID0gZGF0YS5mb2N1cztcblx0XHRcdFx0XHRpZiAoIGRhdGEuem9vbSAhPT0gdW5kZWZpbmVkICkgb2JqZWN0Lnpvb20gPSBkYXRhLnpvb207XG5cdFx0XHRcdFx0aWYgKCBkYXRhLmZpbG1HYXVnZSAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LmZpbG1HYXVnZSA9IGRhdGEuZmlsbUdhdWdlO1xuXHRcdFx0XHRcdGlmICggZGF0YS5maWxtT2Zmc2V0ICE9PSB1bmRlZmluZWQgKSBvYmplY3QuZmlsbU9mZnNldCA9IGRhdGEuZmlsbU9mZnNldDtcblx0XHRcdFx0XHRpZiAoIGRhdGEudmlldyAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnZpZXcgPSBPYmplY3QuYXNzaWduKCB7fSwgZGF0YS52aWV3ICk7XG5cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlICdPcnRob2dyYXBoaWNDYW1lcmEnOlxuXG5cdFx0XHRcdFx0b2JqZWN0ID0gbmV3IE9ydGhvZ3JhcGhpY0NhbWVyYSggZGF0YS5sZWZ0LCBkYXRhLnJpZ2h0LCBkYXRhLnRvcCwgZGF0YS5ib3R0b20sIGRhdGEubmVhciwgZGF0YS5mYXIgKTtcblxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgJ0FtYmllbnRMaWdodCc6XG5cblx0XHRcdFx0XHRvYmplY3QgPSBuZXcgQW1iaWVudExpZ2h0KCBkYXRhLmNvbG9yLCBkYXRhLmludGVuc2l0eSApO1xuXG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSAnRGlyZWN0aW9uYWxMaWdodCc6XG5cblx0XHRcdFx0XHRvYmplY3QgPSBuZXcgRGlyZWN0aW9uYWxMaWdodCggZGF0YS5jb2xvciwgZGF0YS5pbnRlbnNpdHkgKTtcblxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgJ1BvaW50TGlnaHQnOlxuXG5cdFx0XHRcdFx0b2JqZWN0ID0gbmV3IFBvaW50TGlnaHQoIGRhdGEuY29sb3IsIGRhdGEuaW50ZW5zaXR5LCBkYXRhLmRpc3RhbmNlLCBkYXRhLmRlY2F5ICk7XG5cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlICdSZWN0QXJlYUxpZ2h0JzpcblxuXHRcdFx0XHRcdG9iamVjdCA9IG5ldyBSZWN0QXJlYUxpZ2h0KCBkYXRhLmNvbG9yLCBkYXRhLmludGVuc2l0eSwgZGF0YS53aWR0aCwgZGF0YS5oZWlnaHQgKTtcblxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgJ1Nwb3RMaWdodCc6XG5cblx0XHRcdFx0XHRvYmplY3QgPSBuZXcgU3BvdExpZ2h0KCBkYXRhLmNvbG9yLCBkYXRhLmludGVuc2l0eSwgZGF0YS5kaXN0YW5jZSwgZGF0YS5hbmdsZSwgZGF0YS5wZW51bWJyYSwgZGF0YS5kZWNheSApO1xuXG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSAnSGVtaXNwaGVyZUxpZ2h0JzpcblxuXHRcdFx0XHRcdG9iamVjdCA9IG5ldyBIZW1pc3BoZXJlTGlnaHQoIGRhdGEuY29sb3IsIGRhdGEuZ3JvdW5kQ29sb3IsIGRhdGEuaW50ZW5zaXR5ICk7XG5cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlICdTa2lubmVkTWVzaCc6XG5cblx0XHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3RMb2FkZXIucGFyc2VPYmplY3QoKSBkb2VzIG5vdCBzdXBwb3J0IFNraW5uZWRNZXNoIHlldC4nICk7XG5cblx0XHRcdFx0Y2FzZSAnTWVzaCc6XG5cblx0XHRcdFx0XHR2YXIgZ2VvbWV0cnkgPSBnZXRHZW9tZXRyeSggZGF0YS5nZW9tZXRyeSApO1xuXHRcdFx0XHRcdHZhciBtYXRlcmlhbCA9IGdldE1hdGVyaWFsKCBkYXRhLm1hdGVyaWFsICk7XG5cblx0XHRcdFx0XHRpZiAoIGdlb21ldHJ5LmJvbmVzICYmIGdlb21ldHJ5LmJvbmVzLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdFx0XHRcdG9iamVjdCA9IG5ldyBTa2lubmVkTWVzaCggZ2VvbWV0cnksIG1hdGVyaWFsICk7XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRvYmplY3QgPSBuZXcgTWVzaCggZ2VvbWV0cnksIG1hdGVyaWFsICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlICdMT0QnOlxuXG5cdFx0XHRcdFx0b2JqZWN0ID0gbmV3IExPRCgpO1xuXG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSAnTGluZSc6XG5cblx0XHRcdFx0XHRvYmplY3QgPSBuZXcgTGluZSggZ2V0R2VvbWV0cnkoIGRhdGEuZ2VvbWV0cnkgKSwgZ2V0TWF0ZXJpYWwoIGRhdGEubWF0ZXJpYWwgKSwgZGF0YS5tb2RlICk7XG5cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlICdMaW5lTG9vcCc6XG5cblx0XHRcdFx0XHRvYmplY3QgPSBuZXcgTGluZUxvb3AoIGdldEdlb21ldHJ5KCBkYXRhLmdlb21ldHJ5ICksIGdldE1hdGVyaWFsKCBkYXRhLm1hdGVyaWFsICkgKTtcblxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgJ0xpbmVTZWdtZW50cyc6XG5cblx0XHRcdFx0XHRvYmplY3QgPSBuZXcgTGluZVNlZ21lbnRzKCBnZXRHZW9tZXRyeSggZGF0YS5nZW9tZXRyeSApLCBnZXRNYXRlcmlhbCggZGF0YS5tYXRlcmlhbCApICk7XG5cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlICdQb2ludENsb3VkJzpcblx0XHRcdFx0Y2FzZSAnUG9pbnRzJzpcblxuXHRcdFx0XHRcdG9iamVjdCA9IG5ldyBQb2ludHMoIGdldEdlb21ldHJ5KCBkYXRhLmdlb21ldHJ5ICksIGdldE1hdGVyaWFsKCBkYXRhLm1hdGVyaWFsICkgKTtcblxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgJ1Nwcml0ZSc6XG5cblx0XHRcdFx0XHRvYmplY3QgPSBuZXcgU3ByaXRlKCBnZXRNYXRlcmlhbCggZGF0YS5tYXRlcmlhbCApICk7XG5cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlICdHcm91cCc6XG5cblx0XHRcdFx0XHRvYmplY3QgPSBuZXcgR3JvdXAoKTtcblxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGRlZmF1bHQ6XG5cblx0XHRcdFx0XHRvYmplY3QgPSBuZXcgT2JqZWN0M0QoKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRvYmplY3QudXVpZCA9IGRhdGEudXVpZDtcblxuXHRcdFx0aWYgKCBkYXRhLm5hbWUgIT09IHVuZGVmaW5lZCApIG9iamVjdC5uYW1lID0gZGF0YS5uYW1lO1xuXHRcdFx0aWYgKCBkYXRhLm1hdHJpeCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdG1hdHJpeC5mcm9tQXJyYXkoIGRhdGEubWF0cml4ICk7XG5cdFx0XHRcdG1hdHJpeC5kZWNvbXBvc2UoIG9iamVjdC5wb3NpdGlvbiwgb2JqZWN0LnF1YXRlcm5pb24sIG9iamVjdC5zY2FsZSApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGlmICggZGF0YS5wb3NpdGlvbiAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnBvc2l0aW9uLmZyb21BcnJheSggZGF0YS5wb3NpdGlvbiApO1xuXHRcdFx0XHRpZiAoIGRhdGEucm90YXRpb24gIT09IHVuZGVmaW5lZCApIG9iamVjdC5yb3RhdGlvbi5mcm9tQXJyYXkoIGRhdGEucm90YXRpb24gKTtcblx0XHRcdFx0aWYgKCBkYXRhLnF1YXRlcm5pb24gIT09IHVuZGVmaW5lZCApIG9iamVjdC5xdWF0ZXJuaW9uLmZyb21BcnJheSggZGF0YS5xdWF0ZXJuaW9uICk7XG5cdFx0XHRcdGlmICggZGF0YS5zY2FsZSAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnNjYWxlLmZyb21BcnJheSggZGF0YS5zY2FsZSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggZGF0YS5jYXN0U2hhZG93ICE9PSB1bmRlZmluZWQgKSBvYmplY3QuY2FzdFNoYWRvdyA9IGRhdGEuY2FzdFNoYWRvdztcblx0XHRcdGlmICggZGF0YS5yZWNlaXZlU2hhZG93ICE9PSB1bmRlZmluZWQgKSBvYmplY3QucmVjZWl2ZVNoYWRvdyA9IGRhdGEucmVjZWl2ZVNoYWRvdztcblxuXHRcdFx0aWYgKCBkYXRhLnNoYWRvdyApIHtcblxuXHRcdFx0XHRpZiAoIGRhdGEuc2hhZG93LmJpYXMgIT09IHVuZGVmaW5lZCApIG9iamVjdC5zaGFkb3cuYmlhcyA9IGRhdGEuc2hhZG93LmJpYXM7XG5cdFx0XHRcdGlmICggZGF0YS5zaGFkb3cucmFkaXVzICE9PSB1bmRlZmluZWQgKSBvYmplY3Quc2hhZG93LnJhZGl1cyA9IGRhdGEuc2hhZG93LnJhZGl1cztcblx0XHRcdFx0aWYgKCBkYXRhLnNoYWRvdy5tYXBTaXplICE9PSB1bmRlZmluZWQgKSBvYmplY3Quc2hhZG93Lm1hcFNpemUuZnJvbUFycmF5KCBkYXRhLnNoYWRvdy5tYXBTaXplICk7XG5cdFx0XHRcdGlmICggZGF0YS5zaGFkb3cuY2FtZXJhICE9PSB1bmRlZmluZWQgKSBvYmplY3Quc2hhZG93LmNhbWVyYSA9IHRoaXMucGFyc2VPYmplY3QoIGRhdGEuc2hhZG93LmNhbWVyYSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggZGF0YS52aXNpYmxlICE9PSB1bmRlZmluZWQgKSBvYmplY3QudmlzaWJsZSA9IGRhdGEudmlzaWJsZTtcblx0XHRcdGlmICggZGF0YS51c2VyRGF0YSAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnVzZXJEYXRhID0gZGF0YS51c2VyRGF0YTtcblxuXHRcdFx0aWYgKCBkYXRhLmNoaWxkcmVuICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Zm9yICggdmFyIGNoaWxkIGluIGRhdGEuY2hpbGRyZW4gKSB7XG5cblx0XHRcdFx0XHRvYmplY3QuYWRkKCB0aGlzLnBhcnNlT2JqZWN0KCBkYXRhLmNoaWxkcmVuWyBjaGlsZCBdLCBnZW9tZXRyaWVzLCBtYXRlcmlhbHMgKSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGRhdGEudHlwZSA9PT0gJ0xPRCcgKSB7XG5cblx0XHRcdFx0dmFyIGxldmVscyA9IGRhdGEubGV2ZWxzO1xuXG5cdFx0XHRcdGZvciAoIHZhciBsID0gMDsgbCA8IGxldmVscy5sZW5ndGg7IGwgKysgKSB7XG5cblx0XHRcdFx0XHR2YXIgbGV2ZWwgPSBsZXZlbHNbIGwgXTtcblx0XHRcdFx0XHR2YXIgY2hpbGQgPSBvYmplY3QuZ2V0T2JqZWN0QnlQcm9wZXJ0eSggJ3V1aWQnLCBsZXZlbC5vYmplY3QgKTtcblxuXHRcdFx0XHRcdGlmICggY2hpbGQgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdFx0b2JqZWN0LmFkZExldmVsKCBjaGlsZCwgbGV2ZWwuZGlzdGFuY2UgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIG9iamVjdDtcblxuXHRcdH07XG5cblx0fSgpXG5cbn0gKTtcblxudmFyIFRFWFRVUkVfTUFQUElORyA9IHtcblx0VVZNYXBwaW5nOiBVVk1hcHBpbmcsXG5cdEN1YmVSZWZsZWN0aW9uTWFwcGluZzogQ3ViZVJlZmxlY3Rpb25NYXBwaW5nLFxuXHRDdWJlUmVmcmFjdGlvbk1hcHBpbmc6IEN1YmVSZWZyYWN0aW9uTWFwcGluZyxcblx0RXF1aXJlY3Rhbmd1bGFyUmVmbGVjdGlvbk1hcHBpbmc6IEVxdWlyZWN0YW5ndWxhclJlZmxlY3Rpb25NYXBwaW5nLFxuXHRFcXVpcmVjdGFuZ3VsYXJSZWZyYWN0aW9uTWFwcGluZzogRXF1aXJlY3Rhbmd1bGFyUmVmcmFjdGlvbk1hcHBpbmcsXG5cdFNwaGVyaWNhbFJlZmxlY3Rpb25NYXBwaW5nOiBTcGhlcmljYWxSZWZsZWN0aW9uTWFwcGluZyxcblx0Q3ViZVVWUmVmbGVjdGlvbk1hcHBpbmc6IEN1YmVVVlJlZmxlY3Rpb25NYXBwaW5nLFxuXHRDdWJlVVZSZWZyYWN0aW9uTWFwcGluZzogQ3ViZVVWUmVmcmFjdGlvbk1hcHBpbmdcbn07XG5cbnZhciBURVhUVVJFX1dSQVBQSU5HID0ge1xuXHRSZXBlYXRXcmFwcGluZzogUmVwZWF0V3JhcHBpbmcsXG5cdENsYW1wVG9FZGdlV3JhcHBpbmc6IENsYW1wVG9FZGdlV3JhcHBpbmcsXG5cdE1pcnJvcmVkUmVwZWF0V3JhcHBpbmc6IE1pcnJvcmVkUmVwZWF0V3JhcHBpbmdcbn07XG5cbnZhciBURVhUVVJFX0ZJTFRFUiA9IHtcblx0TmVhcmVzdEZpbHRlcjogTmVhcmVzdEZpbHRlcixcblx0TmVhcmVzdE1pcE1hcE5lYXJlc3RGaWx0ZXI6IE5lYXJlc3RNaXBNYXBOZWFyZXN0RmlsdGVyLFxuXHROZWFyZXN0TWlwTWFwTGluZWFyRmlsdGVyOiBOZWFyZXN0TWlwTWFwTGluZWFyRmlsdGVyLFxuXHRMaW5lYXJGaWx0ZXI6IExpbmVhckZpbHRlcixcblx0TGluZWFyTWlwTWFwTmVhcmVzdEZpbHRlcjogTGluZWFyTWlwTWFwTmVhcmVzdEZpbHRlcixcblx0TGluZWFyTWlwTWFwTGluZWFyRmlsdGVyOiBMaW5lYXJNaXBNYXBMaW5lYXJGaWx0ZXJcbn07XG5cbi8qKlxuICogQGF1dGhvciB6ejg1IC8gaHR0cDovL3d3dy5sYWI0Z2FtZXMubmV0L3p6ODUvYmxvZ1xuICpcbiAqIEJlemllciBDdXJ2ZXMgZm9ybXVsYXMgb2J0YWluZWQgZnJvbVxuICogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Cw6l6aWVyX2N1cnZlXG4gKi9cblxuZnVuY3Rpb24gQ2F0bXVsbFJvbSggdCwgcDAsIHAxLCBwMiwgcDMgKSB7XG5cblx0dmFyIHYwID0gKCBwMiAtIHAwICkgKiAwLjU7XG5cdHZhciB2MSA9ICggcDMgLSBwMSApICogMC41O1xuXHR2YXIgdDIgPSB0ICogdDtcblx0dmFyIHQzID0gdCAqIHQyO1xuXHRyZXR1cm4gKCAyICogcDEgLSAyICogcDIgKyB2MCArIHYxICkgKiB0MyArICggLSAzICogcDEgKyAzICogcDIgLSAyICogdjAgLSB2MSApICogdDIgKyB2MCAqIHQgKyBwMTtcblxufVxuXG4vL1xuXG5mdW5jdGlvbiBRdWFkcmF0aWNCZXppZXJQMCggdCwgcCApIHtcblxuXHR2YXIgayA9IDEgLSB0O1xuXHRyZXR1cm4gayAqIGsgKiBwO1xuXG59XG5cbmZ1bmN0aW9uIFF1YWRyYXRpY0JlemllclAxKCB0LCBwICkge1xuXG5cdHJldHVybiAyICogKCAxIC0gdCApICogdCAqIHA7XG5cbn1cblxuZnVuY3Rpb24gUXVhZHJhdGljQmV6aWVyUDIoIHQsIHAgKSB7XG5cblx0cmV0dXJuIHQgKiB0ICogcDtcblxufVxuXG5mdW5jdGlvbiBRdWFkcmF0aWNCZXppZXIoIHQsIHAwLCBwMSwgcDIgKSB7XG5cblx0cmV0dXJuIFF1YWRyYXRpY0JlemllclAwKCB0LCBwMCApICsgUXVhZHJhdGljQmV6aWVyUDEoIHQsIHAxICkgK1xuXHRcdFF1YWRyYXRpY0JlemllclAyKCB0LCBwMiApO1xuXG59XG5cbi8vXG5cbmZ1bmN0aW9uIEN1YmljQmV6aWVyUDAoIHQsIHAgKSB7XG5cblx0dmFyIGsgPSAxIC0gdDtcblx0cmV0dXJuIGsgKiBrICogayAqIHA7XG5cbn1cblxuZnVuY3Rpb24gQ3ViaWNCZXppZXJQMSggdCwgcCApIHtcblxuXHR2YXIgayA9IDEgLSB0O1xuXHRyZXR1cm4gMyAqIGsgKiBrICogdCAqIHA7XG5cbn1cblxuZnVuY3Rpb24gQ3ViaWNCZXppZXJQMiggdCwgcCApIHtcblxuXHRyZXR1cm4gMyAqICggMSAtIHQgKSAqIHQgKiB0ICogcDtcblxufVxuXG5mdW5jdGlvbiBDdWJpY0JlemllclAzKCB0LCBwICkge1xuXG5cdHJldHVybiB0ICogdCAqIHQgKiBwO1xuXG59XG5cbmZ1bmN0aW9uIEN1YmljQmV6aWVyKCB0LCBwMCwgcDEsIHAyLCBwMyApIHtcblxuXHRyZXR1cm4gQ3ViaWNCZXppZXJQMCggdCwgcDAgKSArIEN1YmljQmV6aWVyUDEoIHQsIHAxICkgKyBDdWJpY0JlemllclAyKCB0LCBwMiApICtcblx0XHRDdWJpY0JlemllclAzKCB0LCBwMyApO1xuXG59XG5cbi8qKlxuICogQGF1dGhvciB6ejg1IC8gaHR0cDovL3d3dy5sYWI0Z2FtZXMubmV0L3p6ODUvYmxvZ1xuICogRXh0ZW5zaWJsZSBjdXJ2ZSBvYmplY3RcbiAqXG4gKiBTb21lIGNvbW1vbiBvZiBjdXJ2ZSBtZXRob2RzOlxuICogLmdldFBvaW50KHQpLCBnZXRUYW5nZW50KHQpXG4gKiAuZ2V0UG9pbnRBdCh1KSwgZ2V0VGFuZ2VudEF0KHUpXG4gKiAuZ2V0UG9pbnRzKCksIC5nZXRTcGFjZWRQb2ludHMoKVxuICogLmdldExlbmd0aCgpXG4gKiAudXBkYXRlQXJjTGVuZ3RocygpXG4gKlxuICogVGhpcyBmb2xsb3dpbmcgY3VydmVzIGluaGVyaXQgZnJvbSBUSFJFRS5DdXJ2ZTpcbiAqXG4gKiAtLSAyRCBjdXJ2ZXMgLS1cbiAqIFRIUkVFLkFyY0N1cnZlXG4gKiBUSFJFRS5DdWJpY0JlemllckN1cnZlXG4gKiBUSFJFRS5FbGxpcHNlQ3VydmVcbiAqIFRIUkVFLkxpbmVDdXJ2ZVxuICogVEhSRUUuUXVhZHJhdGljQmV6aWVyQ3VydmVcbiAqIFRIUkVFLlNwbGluZUN1cnZlXG4gKlxuICogLS0gM0QgY3VydmVzIC0tXG4gKiBUSFJFRS5DYXRtdWxsUm9tQ3VydmUzXG4gKiBUSFJFRS5DdWJpY0JlemllckN1cnZlM1xuICogVEhSRUUuTGluZUN1cnZlM1xuICogVEhSRUUuUXVhZHJhdGljQmV6aWVyQ3VydmUzXG4gKlxuICogQSBzZXJpZXMgb2YgY3VydmVzIGNhbiBiZSByZXByZXNlbnRlZCBhcyBhIFRIUkVFLkN1cnZlUGF0aC5cbiAqXG4gKiovXG5cbi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICpcdEFic3RyYWN0IEN1cnZlIGJhc2UgY2xhc3NcbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuZnVuY3Rpb24gQ3VydmUoKSB7XG5cblx0dGhpcy5hcmNMZW5ndGhEaXZpc2lvbnMgPSAyMDA7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggQ3VydmUucHJvdG90eXBlLCB7XG5cblx0Ly8gVmlydHVhbCBiYXNlIGNsYXNzIG1ldGhvZCB0byBvdmVyd3JpdGUgYW5kIGltcGxlbWVudCBpbiBzdWJjbGFzc2VzXG5cdC8vXHQtIHQgWzAgLi4gMV1cblxuXHRnZXRQb2ludDogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQ3VydmU6IC5nZXRQb2ludCgpIG5vdCBpbXBsZW1lbnRlZC4nICk7XG5cdFx0cmV0dXJuIG51bGw7XG5cblx0fSxcblxuXHQvLyBHZXQgcG9pbnQgYXQgcmVsYXRpdmUgcG9zaXRpb24gaW4gY3VydmUgYWNjb3JkaW5nIHRvIGFyYyBsZW5ndGhcblx0Ly8gLSB1IFswIC4uIDFdXG5cblx0Z2V0UG9pbnRBdDogZnVuY3Rpb24gKCB1ICkge1xuXG5cdFx0dmFyIHQgPSB0aGlzLmdldFV0b1RtYXBwaW5nKCB1ICk7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0UG9pbnQoIHQgKTtcblxuXHR9LFxuXG5cdC8vIEdldCBzZXF1ZW5jZSBvZiBwb2ludHMgdXNpbmcgZ2V0UG9pbnQoIHQgKVxuXG5cdGdldFBvaW50czogZnVuY3Rpb24gKCBkaXZpc2lvbnMgKSB7XG5cblx0XHRpZiAoIGRpdmlzaW9ucyA9PT0gdW5kZWZpbmVkICkgZGl2aXNpb25zID0gNTtcblxuXHRcdHZhciBwb2ludHMgPSBbXTtcblxuXHRcdGZvciAoIHZhciBkID0gMDsgZCA8PSBkaXZpc2lvbnM7IGQgKysgKSB7XG5cblx0XHRcdHBvaW50cy5wdXNoKCB0aGlzLmdldFBvaW50KCBkIC8gZGl2aXNpb25zICkgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBwb2ludHM7XG5cblx0fSxcblxuXHQvLyBHZXQgc2VxdWVuY2Ugb2YgcG9pbnRzIHVzaW5nIGdldFBvaW50QXQoIHUgKVxuXG5cdGdldFNwYWNlZFBvaW50czogZnVuY3Rpb24gKCBkaXZpc2lvbnMgKSB7XG5cblx0XHRpZiAoIGRpdmlzaW9ucyA9PT0gdW5kZWZpbmVkICkgZGl2aXNpb25zID0gNTtcblxuXHRcdHZhciBwb2ludHMgPSBbXTtcblxuXHRcdGZvciAoIHZhciBkID0gMDsgZCA8PSBkaXZpc2lvbnM7IGQgKysgKSB7XG5cblx0XHRcdHBvaW50cy5wdXNoKCB0aGlzLmdldFBvaW50QXQoIGQgLyBkaXZpc2lvbnMgKSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHBvaW50cztcblxuXHR9LFxuXG5cdC8vIEdldCB0b3RhbCBjdXJ2ZSBhcmMgbGVuZ3RoXG5cblx0Z2V0TGVuZ3RoOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgbGVuZ3RocyA9IHRoaXMuZ2V0TGVuZ3RocygpO1xuXHRcdHJldHVybiBsZW5ndGhzWyBsZW5ndGhzLmxlbmd0aCAtIDEgXTtcblxuXHR9LFxuXG5cdC8vIEdldCBsaXN0IG9mIGN1bXVsYXRpdmUgc2VnbWVudCBsZW5ndGhzXG5cblx0Z2V0TGVuZ3RoczogZnVuY3Rpb24gKCBkaXZpc2lvbnMgKSB7XG5cblx0XHRpZiAoIGRpdmlzaW9ucyA9PT0gdW5kZWZpbmVkICkgZGl2aXNpb25zID0gdGhpcy5hcmNMZW5ndGhEaXZpc2lvbnM7XG5cblx0XHRpZiAoIHRoaXMuY2FjaGVBcmNMZW5ndGhzICYmXG5cdFx0XHQoIHRoaXMuY2FjaGVBcmNMZW5ndGhzLmxlbmd0aCA9PT0gZGl2aXNpb25zICsgMSApICYmXG5cdFx0XHQhIHRoaXMubmVlZHNVcGRhdGUgKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLmNhY2hlQXJjTGVuZ3RocztcblxuXHRcdH1cblxuXHRcdHRoaXMubmVlZHNVcGRhdGUgPSBmYWxzZTtcblxuXHRcdHZhciBjYWNoZSA9IFtdO1xuXHRcdHZhciBjdXJyZW50LCBsYXN0ID0gdGhpcy5nZXRQb2ludCggMCApO1xuXHRcdHZhciBwLCBzdW0gPSAwO1xuXG5cdFx0Y2FjaGUucHVzaCggMCApO1xuXG5cdFx0Zm9yICggcCA9IDE7IHAgPD0gZGl2aXNpb25zOyBwICsrICkge1xuXG5cdFx0XHRjdXJyZW50ID0gdGhpcy5nZXRQb2ludCggcCAvIGRpdmlzaW9ucyApO1xuXHRcdFx0c3VtICs9IGN1cnJlbnQuZGlzdGFuY2VUbyggbGFzdCApO1xuXHRcdFx0Y2FjaGUucHVzaCggc3VtICk7XG5cdFx0XHRsYXN0ID0gY3VycmVudDtcblxuXHRcdH1cblxuXHRcdHRoaXMuY2FjaGVBcmNMZW5ndGhzID0gY2FjaGU7XG5cblx0XHRyZXR1cm4gY2FjaGU7IC8vIHsgc3VtczogY2FjaGUsIHN1bTogc3VtIH07IFN1bSBpcyBpbiB0aGUgbGFzdCBlbGVtZW50LlxuXG5cdH0sXG5cblx0dXBkYXRlQXJjTGVuZ3RoczogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cdFx0dGhpcy5nZXRMZW5ndGhzKCk7XG5cblx0fSxcblxuXHQvLyBHaXZlbiB1ICggMCAuLiAxICksIGdldCBhIHQgdG8gZmluZCBwLiBUaGlzIGdpdmVzIHlvdSBwb2ludHMgd2hpY2ggYXJlIGVxdWlkaXN0YW50XG5cblx0Z2V0VXRvVG1hcHBpbmc6IGZ1bmN0aW9uICggdSwgZGlzdGFuY2UgKSB7XG5cblx0XHR2YXIgYXJjTGVuZ3RocyA9IHRoaXMuZ2V0TGVuZ3RocygpO1xuXG5cdFx0dmFyIGkgPSAwLCBpbCA9IGFyY0xlbmd0aHMubGVuZ3RoO1xuXG5cdFx0dmFyIHRhcmdldEFyY0xlbmd0aDsgLy8gVGhlIHRhcmdldGVkIHUgZGlzdGFuY2UgdmFsdWUgdG8gZ2V0XG5cblx0XHRpZiAoIGRpc3RhbmNlICkge1xuXG5cdFx0XHR0YXJnZXRBcmNMZW5ndGggPSBkaXN0YW5jZTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHRhcmdldEFyY0xlbmd0aCA9IHUgKiBhcmNMZW5ndGhzWyBpbCAtIDEgXTtcblxuXHRcdH1cblxuXHRcdC8vIGJpbmFyeSBzZWFyY2ggZm9yIHRoZSBpbmRleCB3aXRoIGxhcmdlc3QgdmFsdWUgc21hbGxlciB0aGFuIHRhcmdldCB1IGRpc3RhbmNlXG5cblx0XHR2YXIgbG93ID0gMCwgaGlnaCA9IGlsIC0gMSwgY29tcGFyaXNvbjtcblxuXHRcdHdoaWxlICggbG93IDw9IGhpZ2ggKSB7XG5cblx0XHRcdGkgPSBNYXRoLmZsb29yKCBsb3cgKyAoIGhpZ2ggLSBsb3cgKSAvIDIgKTsgLy8gbGVzcyBsaWtlbHkgdG8gb3ZlcmZsb3csIHRob3VnaCBwcm9iYWJseSBub3QgaXNzdWUgaGVyZSwgSlMgZG9lc24ndCByZWFsbHkgaGF2ZSBpbnRlZ2VycywgYWxsIG51bWJlcnMgYXJlIGZsb2F0c1xuXG5cdFx0XHRjb21wYXJpc29uID0gYXJjTGVuZ3Roc1sgaSBdIC0gdGFyZ2V0QXJjTGVuZ3RoO1xuXG5cdFx0XHRpZiAoIGNvbXBhcmlzb24gPCAwICkge1xuXG5cdFx0XHRcdGxvdyA9IGkgKyAxO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBjb21wYXJpc29uID4gMCApIHtcblxuXHRcdFx0XHRoaWdoID0gaSAtIDE7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0aGlnaCA9IGk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdC8vIERPTkVcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aSA9IGhpZ2g7XG5cblx0XHRpZiAoIGFyY0xlbmd0aHNbIGkgXSA9PT0gdGFyZ2V0QXJjTGVuZ3RoICkge1xuXG5cdFx0XHRyZXR1cm4gaSAvICggaWwgLSAxICk7XG5cblx0XHR9XG5cblx0XHQvLyB3ZSBjb3VsZCBnZXQgZmluZXIgZ3JhaW4gYXQgbGVuZ3Rocywgb3IgdXNlIHNpbXBsZSBpbnRlcnBvbGF0aW9uIGJldHdlZW4gdHdvIHBvaW50c1xuXG5cdFx0dmFyIGxlbmd0aEJlZm9yZSA9IGFyY0xlbmd0aHNbIGkgXTtcblx0XHR2YXIgbGVuZ3RoQWZ0ZXIgPSBhcmNMZW5ndGhzWyBpICsgMSBdO1xuXG5cdFx0dmFyIHNlZ21lbnRMZW5ndGggPSBsZW5ndGhBZnRlciAtIGxlbmd0aEJlZm9yZTtcblxuXHRcdC8vIGRldGVybWluZSB3aGVyZSB3ZSBhcmUgYmV0d2VlbiB0aGUgJ2JlZm9yZScgYW5kICdhZnRlcicgcG9pbnRzXG5cblx0XHR2YXIgc2VnbWVudEZyYWN0aW9uID0gKCB0YXJnZXRBcmNMZW5ndGggLSBsZW5ndGhCZWZvcmUgKSAvIHNlZ21lbnRMZW5ndGg7XG5cblx0XHQvLyBhZGQgdGhhdCBmcmFjdGlvbmFsIGFtb3VudCB0byB0XG5cblx0XHR2YXIgdCA9ICggaSArIHNlZ21lbnRGcmFjdGlvbiApIC8gKCBpbCAtIDEgKTtcblxuXHRcdHJldHVybiB0O1xuXG5cdH0sXG5cblx0Ly8gUmV0dXJucyBhIHVuaXQgdmVjdG9yIHRhbmdlbnQgYXQgdFxuXHQvLyBJbiBjYXNlIGFueSBzdWIgY3VydmUgZG9lcyBub3QgaW1wbGVtZW50IGl0cyB0YW5nZW50IGRlcml2YXRpb24sXG5cdC8vIDIgcG9pbnRzIGEgc21hbGwgZGVsdGEgYXBhcnQgd2lsbCBiZSB1c2VkIHRvIGZpbmQgaXRzIGdyYWRpZW50XG5cdC8vIHdoaWNoIHNlZW1zIHRvIGdpdmUgYSByZWFzb25hYmxlIGFwcHJveGltYXRpb25cblxuXHRnZXRUYW5nZW50OiBmdW5jdGlvbiAoIHQgKSB7XG5cblx0XHR2YXIgZGVsdGEgPSAwLjAwMDE7XG5cdFx0dmFyIHQxID0gdCAtIGRlbHRhO1xuXHRcdHZhciB0MiA9IHQgKyBkZWx0YTtcblxuXHRcdC8vIENhcHBpbmcgaW4gY2FzZSBvZiBkYW5nZXJcblxuXHRcdGlmICggdDEgPCAwICkgdDEgPSAwO1xuXHRcdGlmICggdDIgPiAxICkgdDIgPSAxO1xuXG5cdFx0dmFyIHB0MSA9IHRoaXMuZ2V0UG9pbnQoIHQxICk7XG5cdFx0dmFyIHB0MiA9IHRoaXMuZ2V0UG9pbnQoIHQyICk7XG5cblx0XHR2YXIgdmVjID0gcHQyLmNsb25lKCkuc3ViKCBwdDEgKTtcblx0XHRyZXR1cm4gdmVjLm5vcm1hbGl6ZSgpO1xuXG5cdH0sXG5cblx0Z2V0VGFuZ2VudEF0OiBmdW5jdGlvbiAoIHUgKSB7XG5cblx0XHR2YXIgdCA9IHRoaXMuZ2V0VXRvVG1hcHBpbmcoIHUgKTtcblx0XHRyZXR1cm4gdGhpcy5nZXRUYW5nZW50KCB0ICk7XG5cblx0fSxcblxuXHRjb21wdXRlRnJlbmV0RnJhbWVzOiBmdW5jdGlvbiAoIHNlZ21lbnRzLCBjbG9zZWQgKSB7XG5cblx0XHQvLyBzZWUgaHR0cDovL3d3dy5jcy5pbmRpYW5hLmVkdS9wdWIvdGVjaHJlcG9ydHMvVFI0MjUucGRmXG5cblx0XHR2YXIgbm9ybWFsID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHZhciB0YW5nZW50cyA9IFtdO1xuXHRcdHZhciBub3JtYWxzID0gW107XG5cdFx0dmFyIGJpbm9ybWFscyA9IFtdO1xuXG5cdFx0dmFyIHZlYyA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIG1hdCA9IG5ldyBNYXRyaXg0KCk7XG5cblx0XHR2YXIgaSwgdSwgdGhldGE7XG5cblx0XHQvLyBjb21wdXRlIHRoZSB0YW5nZW50IHZlY3RvcnMgZm9yIGVhY2ggc2VnbWVudCBvbiB0aGUgY3VydmVcblxuXHRcdGZvciAoIGkgPSAwOyBpIDw9IHNlZ21lbnRzOyBpICsrICkge1xuXG5cdFx0XHR1ID0gaSAvIHNlZ21lbnRzO1xuXG5cdFx0XHR0YW5nZW50c1sgaSBdID0gdGhpcy5nZXRUYW5nZW50QXQoIHUgKTtcblx0XHRcdHRhbmdlbnRzWyBpIF0ubm9ybWFsaXplKCk7XG5cblx0XHR9XG5cblx0XHQvLyBzZWxlY3QgYW4gaW5pdGlhbCBub3JtYWwgdmVjdG9yIHBlcnBlbmRpY3VsYXIgdG8gdGhlIGZpcnN0IHRhbmdlbnQgdmVjdG9yLFxuXHRcdC8vIGFuZCBpbiB0aGUgZGlyZWN0aW9uIG9mIHRoZSBtaW5pbXVtIHRhbmdlbnQgeHl6IGNvbXBvbmVudFxuXG5cdFx0bm9ybWFsc1sgMCBdID0gbmV3IFZlY3RvcjMoKTtcblx0XHRiaW5vcm1hbHNbIDAgXSA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0dmFyIG1pbiA9IE51bWJlci5NQVhfVkFMVUU7XG5cdFx0dmFyIHR4ID0gTWF0aC5hYnMoIHRhbmdlbnRzWyAwIF0ueCApO1xuXHRcdHZhciB0eSA9IE1hdGguYWJzKCB0YW5nZW50c1sgMCBdLnkgKTtcblx0XHR2YXIgdHogPSBNYXRoLmFicyggdGFuZ2VudHNbIDAgXS56ICk7XG5cblx0XHRpZiAoIHR4IDw9IG1pbiApIHtcblxuXHRcdFx0bWluID0gdHg7XG5cdFx0XHRub3JtYWwuc2V0KCAxLCAwLCAwICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIHR5IDw9IG1pbiApIHtcblxuXHRcdFx0bWluID0gdHk7XG5cdFx0XHRub3JtYWwuc2V0KCAwLCAxLCAwICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIHR6IDw9IG1pbiApIHtcblxuXHRcdFx0bm9ybWFsLnNldCggMCwgMCwgMSApO1xuXG5cdFx0fVxuXG5cdFx0dmVjLmNyb3NzVmVjdG9ycyggdGFuZ2VudHNbIDAgXSwgbm9ybWFsICkubm9ybWFsaXplKCk7XG5cblx0XHRub3JtYWxzWyAwIF0uY3Jvc3NWZWN0b3JzKCB0YW5nZW50c1sgMCBdLCB2ZWMgKTtcblx0XHRiaW5vcm1hbHNbIDAgXS5jcm9zc1ZlY3RvcnMoIHRhbmdlbnRzWyAwIF0sIG5vcm1hbHNbIDAgXSApO1xuXG5cblx0XHQvLyBjb21wdXRlIHRoZSBzbG93bHktdmFyeWluZyBub3JtYWwgYW5kIGJpbm9ybWFsIHZlY3RvcnMgZm9yIGVhY2ggc2VnbWVudCBvbiB0aGUgY3VydmVcblxuXHRcdGZvciAoIGkgPSAxOyBpIDw9IHNlZ21lbnRzOyBpICsrICkge1xuXG5cdFx0XHRub3JtYWxzWyBpIF0gPSBub3JtYWxzWyBpIC0gMSBdLmNsb25lKCk7XG5cblx0XHRcdGJpbm9ybWFsc1sgaSBdID0gYmlub3JtYWxzWyBpIC0gMSBdLmNsb25lKCk7XG5cblx0XHRcdHZlYy5jcm9zc1ZlY3RvcnMoIHRhbmdlbnRzWyBpIC0gMSBdLCB0YW5nZW50c1sgaSBdICk7XG5cblx0XHRcdGlmICggdmVjLmxlbmd0aCgpID4gTnVtYmVyLkVQU0lMT04gKSB7XG5cblx0XHRcdFx0dmVjLm5vcm1hbGl6ZSgpO1xuXG5cdFx0XHRcdHRoZXRhID0gTWF0aC5hY29zKCBfTWF0aC5jbGFtcCggdGFuZ2VudHNbIGkgLSAxIF0uZG90KCB0YW5nZW50c1sgaSBdICksIC0gMSwgMSApICk7IC8vIGNsYW1wIGZvciBmbG9hdGluZyBwdCBlcnJvcnNcblxuXHRcdFx0XHRub3JtYWxzWyBpIF0uYXBwbHlNYXRyaXg0KCBtYXQubWFrZVJvdGF0aW9uQXhpcyggdmVjLCB0aGV0YSApICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Ymlub3JtYWxzWyBpIF0uY3Jvc3NWZWN0b3JzKCB0YW5nZW50c1sgaSBdLCBub3JtYWxzWyBpIF0gKTtcblxuXHRcdH1cblxuXHRcdC8vIGlmIHRoZSBjdXJ2ZSBpcyBjbG9zZWQsIHBvc3Rwcm9jZXNzIHRoZSB2ZWN0b3JzIHNvIHRoZSBmaXJzdCBhbmQgbGFzdCBub3JtYWwgdmVjdG9ycyBhcmUgdGhlIHNhbWVcblxuXHRcdGlmICggY2xvc2VkID09PSB0cnVlICkge1xuXG5cdFx0XHR0aGV0YSA9IE1hdGguYWNvcyggX01hdGguY2xhbXAoIG5vcm1hbHNbIDAgXS5kb3QoIG5vcm1hbHNbIHNlZ21lbnRzIF0gKSwgLSAxLCAxICkgKTtcblx0XHRcdHRoZXRhIC89IHNlZ21lbnRzO1xuXG5cdFx0XHRpZiAoIHRhbmdlbnRzWyAwIF0uZG90KCB2ZWMuY3Jvc3NWZWN0b3JzKCBub3JtYWxzWyAwIF0sIG5vcm1hbHNbIHNlZ21lbnRzIF0gKSApID4gMCApIHtcblxuXHRcdFx0XHR0aGV0YSA9IC0gdGhldGE7XG5cblx0XHRcdH1cblxuXHRcdFx0Zm9yICggaSA9IDE7IGkgPD0gc2VnbWVudHM7IGkgKysgKSB7XG5cblx0XHRcdFx0Ly8gdHdpc3QgYSBsaXR0bGUuLi5cblx0XHRcdFx0bm9ybWFsc1sgaSBdLmFwcGx5TWF0cml4NCggbWF0Lm1ha2VSb3RhdGlvbkF4aXMoIHRhbmdlbnRzWyBpIF0sIHRoZXRhICogaSApICk7XG5cdFx0XHRcdGJpbm9ybWFsc1sgaSBdLmNyb3NzVmVjdG9ycyggdGFuZ2VudHNbIGkgXSwgbm9ybWFsc1sgaSBdICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiB7XG5cdFx0XHR0YW5nZW50czogdGFuZ2VudHMsXG5cdFx0XHRub3JtYWxzOiBub3JtYWxzLFxuXHRcdFx0Ymlub3JtYWxzOiBiaW5vcm1hbHNcblx0XHR9O1xuXG5cdH1cblxufSApO1xuXG5mdW5jdGlvbiBMaW5lQ3VydmUoIHYxLCB2MiApIHtcblxuXHRDdXJ2ZS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy52MSA9IHYxO1xuXHR0aGlzLnYyID0gdjI7XG5cbn1cblxuTGluZUN1cnZlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEN1cnZlLnByb3RvdHlwZSApO1xuTGluZUN1cnZlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IExpbmVDdXJ2ZTtcblxuTGluZUN1cnZlLnByb3RvdHlwZS5pc0xpbmVDdXJ2ZSA9IHRydWU7XG5cbkxpbmVDdXJ2ZS5wcm90b3R5cGUuZ2V0UG9pbnQgPSBmdW5jdGlvbiAoIHQgKSB7XG5cblx0aWYgKCB0ID09PSAxICkge1xuXG5cdFx0cmV0dXJuIHRoaXMudjIuY2xvbmUoKTtcblxuXHR9XG5cblx0dmFyIHBvaW50ID0gdGhpcy52Mi5jbG9uZSgpLnN1YiggdGhpcy52MSApO1xuXHRwb2ludC5tdWx0aXBseVNjYWxhciggdCApLmFkZCggdGhpcy52MSApO1xuXG5cdHJldHVybiBwb2ludDtcblxufTtcblxuLy8gTGluZSBjdXJ2ZSBpcyBsaW5lYXIsIHNvIHdlIGNhbiBvdmVyd3JpdGUgZGVmYXVsdCBnZXRQb2ludEF0XG5cbkxpbmVDdXJ2ZS5wcm90b3R5cGUuZ2V0UG9pbnRBdCA9IGZ1bmN0aW9uICggdSApIHtcblxuXHRyZXR1cm4gdGhpcy5nZXRQb2ludCggdSApO1xuXG59O1xuXG5MaW5lQ3VydmUucHJvdG90eXBlLmdldFRhbmdlbnQgPSBmdW5jdGlvbiAoIHQgKSB7XG5cblx0dmFyIHRhbmdlbnQgPSB0aGlzLnYyLmNsb25lKCkuc3ViKCB0aGlzLnYxICk7XG5cblx0cmV0dXJuIHRhbmdlbnQubm9ybWFsaXplKCk7XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciB6ejg1IC8gaHR0cDovL3d3dy5sYWI0Z2FtZXMubmV0L3p6ODUvYmxvZ1xuICpcbiAqKi9cblxuLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gKlx0Q3VydmVkIFBhdGggLSBhIGN1cnZlIHBhdGggaXMgc2ltcGx5IGEgYXJyYXkgb2YgY29ubmVjdGVkXG4gKiAgY3VydmVzLCBidXQgcmV0YWlucyB0aGUgYXBpIG9mIGEgY3VydmVcbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuZnVuY3Rpb24gQ3VydmVQYXRoKCkge1xuXG5cdEN1cnZlLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLmN1cnZlcyA9IFtdO1xuXG5cdHRoaXMuYXV0b0Nsb3NlID0gZmFsc2U7IC8vIEF1dG9tYXRpY2FsbHkgY2xvc2VzIHRoZSBwYXRoXG5cbn1cblxuQ3VydmVQYXRoLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEN1cnZlLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IEN1cnZlUGF0aCxcblxuXHRhZGQ6IGZ1bmN0aW9uICggY3VydmUgKSB7XG5cblx0XHR0aGlzLmN1cnZlcy5wdXNoKCBjdXJ2ZSApO1xuXG5cdH0sXG5cblx0Y2xvc2VQYXRoOiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyBBZGQgYSBsaW5lIGN1cnZlIGlmIHN0YXJ0IGFuZCBlbmQgb2YgbGluZXMgYXJlIG5vdCBjb25uZWN0ZWRcblx0XHR2YXIgc3RhcnRQb2ludCA9IHRoaXMuY3VydmVzWyAwIF0uZ2V0UG9pbnQoIDAgKTtcblx0XHR2YXIgZW5kUG9pbnQgPSB0aGlzLmN1cnZlc1sgdGhpcy5jdXJ2ZXMubGVuZ3RoIC0gMSBdLmdldFBvaW50KCAxICk7XG5cblx0XHRpZiAoICEgc3RhcnRQb2ludC5lcXVhbHMoIGVuZFBvaW50ICkgKSB7XG5cblx0XHRcdHRoaXMuY3VydmVzLnB1c2goIG5ldyBMaW5lQ3VydmUoIGVuZFBvaW50LCBzdGFydFBvaW50ICkgKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdC8vIFRvIGdldCBhY2N1cmF0ZSBwb2ludCB3aXRoIHJlZmVyZW5jZSB0b1xuXHQvLyBlbnRpcmUgcGF0aCBkaXN0YW5jZSBhdCB0aW1lIHQsXG5cdC8vIGZvbGxvd2luZyBoYXMgdG8gYmUgZG9uZTpcblxuXHQvLyAxLiBMZW5ndGggb2YgZWFjaCBzdWIgcGF0aCBoYXZlIHRvIGJlIGtub3duXG5cdC8vIDIuIExvY2F0ZSBhbmQgaWRlbnRpZnkgdHlwZSBvZiBjdXJ2ZVxuXHQvLyAzLiBHZXQgdCBmb3IgdGhlIGN1cnZlXG5cdC8vIDQuIFJldHVybiBjdXJ2ZS5nZXRQb2ludEF0KHQnKVxuXG5cdGdldFBvaW50OiBmdW5jdGlvbiAoIHQgKSB7XG5cblx0XHR2YXIgZCA9IHQgKiB0aGlzLmdldExlbmd0aCgpO1xuXHRcdHZhciBjdXJ2ZUxlbmd0aHMgPSB0aGlzLmdldEN1cnZlTGVuZ3RocygpO1xuXHRcdHZhciBpID0gMDtcblxuXHRcdC8vIFRvIHRoaW5rIGFib3V0IGJvdW5kYXJpZXMgcG9pbnRzLlxuXG5cdFx0d2hpbGUgKCBpIDwgY3VydmVMZW5ndGhzLmxlbmd0aCApIHtcblxuXHRcdFx0aWYgKCBjdXJ2ZUxlbmd0aHNbIGkgXSA+PSBkICkge1xuXG5cdFx0XHRcdHZhciBkaWZmID0gY3VydmVMZW5ndGhzWyBpIF0gLSBkO1xuXHRcdFx0XHR2YXIgY3VydmUgPSB0aGlzLmN1cnZlc1sgaSBdO1xuXG5cdFx0XHRcdHZhciBzZWdtZW50TGVuZ3RoID0gY3VydmUuZ2V0TGVuZ3RoKCk7XG5cdFx0XHRcdHZhciB1ID0gc2VnbWVudExlbmd0aCA9PT0gMCA/IDAgOiAxIC0gZGlmZiAvIHNlZ21lbnRMZW5ndGg7XG5cblx0XHRcdFx0cmV0dXJuIGN1cnZlLmdldFBvaW50QXQoIHUgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpICsrO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIG51bGw7XG5cblx0XHQvLyBsb29wIHdoZXJlIHN1bSAhPSAwLCBzdW0gPiBkICwgc3VtKzEgPGRcblxuXHR9LFxuXG5cdC8vIFdlIGNhbm5vdCB1c2UgdGhlIGRlZmF1bHQgVEhSRUUuQ3VydmUgZ2V0UG9pbnQoKSB3aXRoIGdldExlbmd0aCgpIGJlY2F1c2UgaW5cblx0Ly8gVEhSRUUuQ3VydmUsIGdldExlbmd0aCgpIGRlcGVuZHMgb24gZ2V0UG9pbnQoKSBidXQgaW4gVEhSRUUuQ3VydmVQYXRoXG5cdC8vIGdldFBvaW50KCkgZGVwZW5kcyBvbiBnZXRMZW5ndGhcblxuXHRnZXRMZW5ndGg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBsZW5zID0gdGhpcy5nZXRDdXJ2ZUxlbmd0aHMoKTtcblx0XHRyZXR1cm4gbGVuc1sgbGVucy5sZW5ndGggLSAxIF07XG5cblx0fSxcblxuXHQvLyBjYWNoZUxlbmd0aHMgbXVzdCBiZSByZWNhbGN1bGF0ZWQuXG5cdHVwZGF0ZUFyY0xlbmd0aHM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlO1xuXHRcdHRoaXMuY2FjaGVMZW5ndGhzID0gbnVsbDtcblx0XHR0aGlzLmdldEN1cnZlTGVuZ3RocygpO1xuXG5cdH0sXG5cblx0Ly8gQ29tcHV0ZSBsZW5ndGhzIGFuZCBjYWNoZSB0aGVtXG5cdC8vIFdlIGNhbm5vdCBvdmVyd3JpdGUgZ2V0TGVuZ3RocygpIGJlY2F1c2UgVXRvVCBtYXBwaW5nIHVzZXMgaXQuXG5cblx0Z2V0Q3VydmVMZW5ndGhzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyBXZSB1c2UgY2FjaGUgdmFsdWVzIGlmIGN1cnZlcyBhbmQgY2FjaGUgYXJyYXkgYXJlIHNhbWUgbGVuZ3RoXG5cblx0XHRpZiAoIHRoaXMuY2FjaGVMZW5ndGhzICYmIHRoaXMuY2FjaGVMZW5ndGhzLmxlbmd0aCA9PT0gdGhpcy5jdXJ2ZXMubGVuZ3RoICkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5jYWNoZUxlbmd0aHM7XG5cblx0XHR9XG5cblx0XHQvLyBHZXQgbGVuZ3RoIG9mIHN1Yi1jdXJ2ZVxuXHRcdC8vIFB1c2ggc3VtcyBpbnRvIGNhY2hlZCBhcnJheVxuXG5cdFx0dmFyIGxlbmd0aHMgPSBbXSwgc3VtcyA9IDA7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSB0aGlzLmN1cnZlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRzdW1zICs9IHRoaXMuY3VydmVzWyBpIF0uZ2V0TGVuZ3RoKCk7XG5cdFx0XHRsZW5ndGhzLnB1c2goIHN1bXMgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMuY2FjaGVMZW5ndGhzID0gbGVuZ3RocztcblxuXHRcdHJldHVybiBsZW5ndGhzO1xuXG5cdH0sXG5cblx0Z2V0U3BhY2VkUG9pbnRzOiBmdW5jdGlvbiAoIGRpdmlzaW9ucyApIHtcblxuXHRcdGlmICggZGl2aXNpb25zID09PSB1bmRlZmluZWQgKSBkaXZpc2lvbnMgPSA0MDtcblxuXHRcdHZhciBwb2ludHMgPSBbXTtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8PSBkaXZpc2lvbnM7IGkgKysgKSB7XG5cblx0XHRcdHBvaW50cy5wdXNoKCB0aGlzLmdldFBvaW50KCBpIC8gZGl2aXNpb25zICkgKTtcblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5hdXRvQ2xvc2UgKSB7XG5cblx0XHRcdHBvaW50cy5wdXNoKCBwb2ludHNbIDAgXSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHBvaW50cztcblxuXHR9LFxuXG5cdGdldFBvaW50czogZnVuY3Rpb24gKCBkaXZpc2lvbnMgKSB7XG5cblx0XHRkaXZpc2lvbnMgPSBkaXZpc2lvbnMgfHwgMTI7XG5cblx0XHR2YXIgcG9pbnRzID0gW10sIGxhc3Q7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGN1cnZlcyA9IHRoaXMuY3VydmVzOyBpIDwgY3VydmVzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGN1cnZlID0gY3VydmVzWyBpIF07XG5cdFx0XHR2YXIgcmVzb2x1dGlvbiA9IChjdXJ2ZSAmJiBjdXJ2ZS5pc0VsbGlwc2VDdXJ2ZSkgPyBkaXZpc2lvbnMgKiAyXG5cdFx0XHRcdDogKGN1cnZlICYmIGN1cnZlLmlzTGluZUN1cnZlKSA/IDFcblx0XHRcdFx0OiAoY3VydmUgJiYgY3VydmUuaXNTcGxpbmVDdXJ2ZSkgPyBkaXZpc2lvbnMgKiBjdXJ2ZS5wb2ludHMubGVuZ3RoXG5cdFx0XHRcdDogZGl2aXNpb25zO1xuXG5cdFx0XHR2YXIgcHRzID0gY3VydmUuZ2V0UG9pbnRzKCByZXNvbHV0aW9uICk7XG5cblx0XHRcdGZvciAoIHZhciBqID0gMDsgaiA8IHB0cy5sZW5ndGg7IGorKyApIHtcblxuXHRcdFx0XHR2YXIgcG9pbnQgPSBwdHNbIGogXTtcblxuXHRcdFx0XHRpZiAoIGxhc3QgJiYgbGFzdC5lcXVhbHMoIHBvaW50ICkgKSBjb250aW51ZTsgLy8gZW5zdXJlcyBubyBjb25zZWN1dGl2ZSBwb2ludHMgYXJlIGR1cGxpY2F0ZXNcblxuXHRcdFx0XHRwb2ludHMucHVzaCggcG9pbnQgKTtcblx0XHRcdFx0bGFzdCA9IHBvaW50O1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIHRoaXMuYXV0b0Nsb3NlICYmIHBvaW50cy5sZW5ndGggPiAxICYmICFwb2ludHNbIHBvaW50cy5sZW5ndGggLSAxIF0uZXF1YWxzKCBwb2ludHNbIDAgXSApICkge1xuXG5cdFx0XHRwb2ludHMucHVzaCggcG9pbnRzWyAwIF0gKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBwb2ludHM7XG5cblx0fSxcblxuXHQvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcblx0ICpcdENyZWF0ZSBHZW9tZXRyaWVzIEhlbHBlcnNcblx0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5cdC8vLyBHZW5lcmF0ZSBnZW9tZXRyeSBmcm9tIHBhdGggcG9pbnRzIChmb3IgTGluZSBvciBQb2ludHMgb2JqZWN0cylcblxuXHRjcmVhdGVQb2ludHNHZW9tZXRyeTogZnVuY3Rpb24gKCBkaXZpc2lvbnMgKSB7XG5cblx0XHR2YXIgcHRzID0gdGhpcy5nZXRQb2ludHMoIGRpdmlzaW9ucyApO1xuXHRcdHJldHVybiB0aGlzLmNyZWF0ZUdlb21ldHJ5KCBwdHMgKTtcblxuXHR9LFxuXG5cdC8vIEdlbmVyYXRlIGdlb21ldHJ5IGZyb20gZXF1aWRpc3RhbnQgc2FtcGxpbmcgYWxvbmcgdGhlIHBhdGhcblxuXHRjcmVhdGVTcGFjZWRQb2ludHNHZW9tZXRyeTogZnVuY3Rpb24gKCBkaXZpc2lvbnMgKSB7XG5cblx0XHR2YXIgcHRzID0gdGhpcy5nZXRTcGFjZWRQb2ludHMoIGRpdmlzaW9ucyApO1xuXHRcdHJldHVybiB0aGlzLmNyZWF0ZUdlb21ldHJ5KCBwdHMgKTtcblxuXHR9LFxuXG5cdGNyZWF0ZUdlb21ldHJ5OiBmdW5jdGlvbiAoIHBvaW50cyApIHtcblxuXHRcdHZhciBnZW9tZXRyeSA9IG5ldyBHZW9tZXRyeSgpO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gcG9pbnRzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHZhciBwb2ludCA9IHBvaW50c1sgaSBdO1xuXHRcdFx0Z2VvbWV0cnkudmVydGljZXMucHVzaCggbmV3IFZlY3RvcjMoIHBvaW50LngsIHBvaW50LnksIHBvaW50LnogfHwgMCApICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gZ2VvbWV0cnk7XG5cblx0fVxuXG59ICk7XG5cbmZ1bmN0aW9uIEVsbGlwc2VDdXJ2ZSggYVgsIGFZLCB4UmFkaXVzLCB5UmFkaXVzLCBhU3RhcnRBbmdsZSwgYUVuZEFuZ2xlLCBhQ2xvY2t3aXNlLCBhUm90YXRpb24gKSB7XG5cblx0Q3VydmUuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMuYVggPSBhWDtcblx0dGhpcy5hWSA9IGFZO1xuXG5cdHRoaXMueFJhZGl1cyA9IHhSYWRpdXM7XG5cdHRoaXMueVJhZGl1cyA9IHlSYWRpdXM7XG5cblx0dGhpcy5hU3RhcnRBbmdsZSA9IGFTdGFydEFuZ2xlO1xuXHR0aGlzLmFFbmRBbmdsZSA9IGFFbmRBbmdsZTtcblxuXHR0aGlzLmFDbG9ja3dpc2UgPSBhQ2xvY2t3aXNlO1xuXG5cdHRoaXMuYVJvdGF0aW9uID0gYVJvdGF0aW9uIHx8IDA7XG5cbn1cblxuRWxsaXBzZUN1cnZlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEN1cnZlLnByb3RvdHlwZSApO1xuRWxsaXBzZUN1cnZlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEVsbGlwc2VDdXJ2ZTtcblxuRWxsaXBzZUN1cnZlLnByb3RvdHlwZS5pc0VsbGlwc2VDdXJ2ZSA9IHRydWU7XG5cbkVsbGlwc2VDdXJ2ZS5wcm90b3R5cGUuZ2V0UG9pbnQgPSBmdW5jdGlvbiAoIHQgKSB7XG5cblx0dmFyIHR3b1BpID0gTWF0aC5QSSAqIDI7XG5cdHZhciBkZWx0YUFuZ2xlID0gdGhpcy5hRW5kQW5nbGUgLSB0aGlzLmFTdGFydEFuZ2xlO1xuXHR2YXIgc2FtZVBvaW50cyA9IE1hdGguYWJzKCBkZWx0YUFuZ2xlICkgPCBOdW1iZXIuRVBTSUxPTjtcblxuXHQvLyBlbnN1cmVzIHRoYXQgZGVsdGFBbmdsZSBpcyAwIC4uIDIgUElcblx0d2hpbGUgKCBkZWx0YUFuZ2xlIDwgMCApIGRlbHRhQW5nbGUgKz0gdHdvUGk7XG5cdHdoaWxlICggZGVsdGFBbmdsZSA+IHR3b1BpICkgZGVsdGFBbmdsZSAtPSB0d29QaTtcblxuXHRpZiAoIGRlbHRhQW5nbGUgPCBOdW1iZXIuRVBTSUxPTiApIHtcblxuXHRcdGlmICggc2FtZVBvaW50cyApIHtcblxuXHRcdFx0ZGVsdGFBbmdsZSA9IDA7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRkZWx0YUFuZ2xlID0gdHdvUGk7XG5cblx0XHR9XG5cblx0fVxuXG5cdGlmICggdGhpcy5hQ2xvY2t3aXNlID09PSB0cnVlICYmICEgc2FtZVBvaW50cyApIHtcblxuXHRcdGlmICggZGVsdGFBbmdsZSA9PT0gdHdvUGkgKSB7XG5cblx0XHRcdGRlbHRhQW5nbGUgPSAtIHR3b1BpO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0ZGVsdGFBbmdsZSA9IGRlbHRhQW5nbGUgLSB0d29QaTtcblxuXHRcdH1cblxuXHR9XG5cblx0dmFyIGFuZ2xlID0gdGhpcy5hU3RhcnRBbmdsZSArIHQgKiBkZWx0YUFuZ2xlO1xuXHR2YXIgeCA9IHRoaXMuYVggKyB0aGlzLnhSYWRpdXMgKiBNYXRoLmNvcyggYW5nbGUgKTtcblx0dmFyIHkgPSB0aGlzLmFZICsgdGhpcy55UmFkaXVzICogTWF0aC5zaW4oIGFuZ2xlICk7XG5cblx0aWYgKCB0aGlzLmFSb3RhdGlvbiAhPT0gMCApIHtcblxuXHRcdHZhciBjb3MgPSBNYXRoLmNvcyggdGhpcy5hUm90YXRpb24gKTtcblx0XHR2YXIgc2luID0gTWF0aC5zaW4oIHRoaXMuYVJvdGF0aW9uICk7XG5cblx0XHR2YXIgdHggPSB4IC0gdGhpcy5hWDtcblx0XHR2YXIgdHkgPSB5IC0gdGhpcy5hWTtcblxuXHRcdC8vIFJvdGF0ZSB0aGUgcG9pbnQgYWJvdXQgdGhlIGNlbnRlciBvZiB0aGUgZWxsaXBzZS5cblx0XHR4ID0gdHggKiBjb3MgLSB0eSAqIHNpbiArIHRoaXMuYVg7XG5cdFx0eSA9IHR4ICogc2luICsgdHkgKiBjb3MgKyB0aGlzLmFZO1xuXG5cdH1cblxuXHRyZXR1cm4gbmV3IFZlY3RvcjIoIHgsIHkgKTtcblxufTtcblxuZnVuY3Rpb24gU3BsaW5lQ3VydmUoIHBvaW50cyAvKiBhcnJheSBvZiBWZWN0b3IyICovICkge1xuXG5cdEN1cnZlLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnBvaW50cyA9ICggcG9pbnRzID09PSB1bmRlZmluZWQgKSA/IFtdIDogcG9pbnRzO1xuXG59XG5cblNwbGluZUN1cnZlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEN1cnZlLnByb3RvdHlwZSApO1xuU3BsaW5lQ3VydmUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU3BsaW5lQ3VydmU7XG5cblNwbGluZUN1cnZlLnByb3RvdHlwZS5pc1NwbGluZUN1cnZlID0gdHJ1ZTtcblxuU3BsaW5lQ3VydmUucHJvdG90eXBlLmdldFBvaW50ID0gZnVuY3Rpb24gKCB0ICkge1xuXG5cdHZhciBwb2ludHMgPSB0aGlzLnBvaW50cztcblx0dmFyIHBvaW50ID0gKCBwb2ludHMubGVuZ3RoIC0gMSApICogdDtcblxuXHR2YXIgaW50UG9pbnQgPSBNYXRoLmZsb29yKCBwb2ludCApO1xuXHR2YXIgd2VpZ2h0ID0gcG9pbnQgLSBpbnRQb2ludDtcblxuXHR2YXIgcG9pbnQwID0gcG9pbnRzWyBpbnRQb2ludCA9PT0gMCA/IGludFBvaW50IDogaW50UG9pbnQgLSAxIF07XG5cdHZhciBwb2ludDEgPSBwb2ludHNbIGludFBvaW50IF07XG5cdHZhciBwb2ludDIgPSBwb2ludHNbIGludFBvaW50ID4gcG9pbnRzLmxlbmd0aCAtIDIgPyBwb2ludHMubGVuZ3RoIC0gMSA6IGludFBvaW50ICsgMSBdO1xuXHR2YXIgcG9pbnQzID0gcG9pbnRzWyBpbnRQb2ludCA+IHBvaW50cy5sZW5ndGggLSAzID8gcG9pbnRzLmxlbmd0aCAtIDEgOiBpbnRQb2ludCArIDIgXTtcblxuXHRyZXR1cm4gbmV3IFZlY3RvcjIoXG5cdFx0Q2F0bXVsbFJvbSggd2VpZ2h0LCBwb2ludDAueCwgcG9pbnQxLngsIHBvaW50Mi54LCBwb2ludDMueCApLFxuXHRcdENhdG11bGxSb20oIHdlaWdodCwgcG9pbnQwLnksIHBvaW50MS55LCBwb2ludDIueSwgcG9pbnQzLnkgKVxuXHQpO1xuXG59O1xuXG5mdW5jdGlvbiBDdWJpY0JlemllckN1cnZlKCB2MCwgdjEsIHYyLCB2MyApIHtcblxuXHRDdXJ2ZS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy52MCA9IHYwO1xuXHR0aGlzLnYxID0gdjE7XG5cdHRoaXMudjIgPSB2Mjtcblx0dGhpcy52MyA9IHYzO1xuXG59XG5cbkN1YmljQmV6aWVyQ3VydmUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQ3VydmUucHJvdG90eXBlICk7XG5DdWJpY0JlemllckN1cnZlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEN1YmljQmV6aWVyQ3VydmU7XG5cbkN1YmljQmV6aWVyQ3VydmUucHJvdG90eXBlLmdldFBvaW50ID0gZnVuY3Rpb24gKCB0ICkge1xuXG5cdHZhciB2MCA9IHRoaXMudjAsIHYxID0gdGhpcy52MSwgdjIgPSB0aGlzLnYyLCB2MyA9IHRoaXMudjM7XG5cblx0cmV0dXJuIG5ldyBWZWN0b3IyKFxuXHRcdEN1YmljQmV6aWVyKCB0LCB2MC54LCB2MS54LCB2Mi54LCB2My54ICksXG5cdFx0Q3ViaWNCZXppZXIoIHQsIHYwLnksIHYxLnksIHYyLnksIHYzLnkgKVxuXHQpO1xuXG59O1xuXG5mdW5jdGlvbiBRdWFkcmF0aWNCZXppZXJDdXJ2ZSggdjAsIHYxLCB2MiApIHtcblxuXHRDdXJ2ZS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy52MCA9IHYwO1xuXHR0aGlzLnYxID0gdjE7XG5cdHRoaXMudjIgPSB2MjtcblxufVxuXG5RdWFkcmF0aWNCZXppZXJDdXJ2ZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDdXJ2ZS5wcm90b3R5cGUgKTtcblF1YWRyYXRpY0JlemllckN1cnZlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFF1YWRyYXRpY0JlemllckN1cnZlO1xuXG5RdWFkcmF0aWNCZXppZXJDdXJ2ZS5wcm90b3R5cGUuZ2V0UG9pbnQgPSBmdW5jdGlvbiAoIHQgKSB7XG5cblx0dmFyIHYwID0gdGhpcy52MCwgdjEgPSB0aGlzLnYxLCB2MiA9IHRoaXMudjI7XG5cblx0cmV0dXJuIG5ldyBWZWN0b3IyKFxuXHRcdFF1YWRyYXRpY0JlemllciggdCwgdjAueCwgdjEueCwgdjIueCApLFxuXHRcdFF1YWRyYXRpY0JlemllciggdCwgdjAueSwgdjEueSwgdjIueSApXG5cdCk7XG5cbn07XG5cbnZhciBQYXRoUHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggQ3VydmVQYXRoLnByb3RvdHlwZSApLCB7XG5cblx0ZnJvbVBvaW50czogZnVuY3Rpb24gKCB2ZWN0b3JzICkge1xuXG5cdFx0dGhpcy5tb3ZlVG8oIHZlY3RvcnNbIDAgXS54LCB2ZWN0b3JzWyAwIF0ueSApO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAxLCBsID0gdmVjdG9ycy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR0aGlzLmxpbmVUbyggdmVjdG9yc1sgaSBdLngsIHZlY3RvcnNbIGkgXS55ICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHRtb3ZlVG86IGZ1bmN0aW9uICggeCwgeSApIHtcblxuXHRcdHRoaXMuY3VycmVudFBvaW50LnNldCggeCwgeSApOyAvLyBUT0RPIGNvbnNpZGVyIHJlZmVyZW5jaW5nIHZlY3RvcnMgaW5zdGVhZCBvZiBjb3B5aW5nP1xuXG5cdH0sXG5cblx0bGluZVRvOiBmdW5jdGlvbiAoIHgsIHkgKSB7XG5cblx0XHR2YXIgY3VydmUgPSBuZXcgTGluZUN1cnZlKCB0aGlzLmN1cnJlbnRQb2ludC5jbG9uZSgpLCBuZXcgVmVjdG9yMiggeCwgeSApICk7XG5cdFx0dGhpcy5jdXJ2ZXMucHVzaCggY3VydmUgKTtcblxuXHRcdHRoaXMuY3VycmVudFBvaW50LnNldCggeCwgeSApO1xuXG5cdH0sXG5cblx0cXVhZHJhdGljQ3VydmVUbzogZnVuY3Rpb24gKCBhQ1B4LCBhQ1B5LCBhWCwgYVkgKSB7XG5cblx0XHR2YXIgY3VydmUgPSBuZXcgUXVhZHJhdGljQmV6aWVyQ3VydmUoXG5cdFx0XHR0aGlzLmN1cnJlbnRQb2ludC5jbG9uZSgpLFxuXHRcdFx0bmV3IFZlY3RvcjIoIGFDUHgsIGFDUHkgKSxcblx0XHRcdG5ldyBWZWN0b3IyKCBhWCwgYVkgKVxuXHRcdCk7XG5cblx0XHR0aGlzLmN1cnZlcy5wdXNoKCBjdXJ2ZSApO1xuXG5cdFx0dGhpcy5jdXJyZW50UG9pbnQuc2V0KCBhWCwgYVkgKTtcblxuXHR9LFxuXG5cdGJlemllckN1cnZlVG86IGZ1bmN0aW9uICggYUNQMXgsIGFDUDF5LCBhQ1AyeCwgYUNQMnksIGFYLCBhWSApIHtcblxuXHRcdHZhciBjdXJ2ZSA9IG5ldyBDdWJpY0JlemllckN1cnZlKFxuXHRcdFx0dGhpcy5jdXJyZW50UG9pbnQuY2xvbmUoKSxcblx0XHRcdG5ldyBWZWN0b3IyKCBhQ1AxeCwgYUNQMXkgKSxcblx0XHRcdG5ldyBWZWN0b3IyKCBhQ1AyeCwgYUNQMnkgKSxcblx0XHRcdG5ldyBWZWN0b3IyKCBhWCwgYVkgKVxuXHRcdCk7XG5cblx0XHR0aGlzLmN1cnZlcy5wdXNoKCBjdXJ2ZSApO1xuXG5cdFx0dGhpcy5jdXJyZW50UG9pbnQuc2V0KCBhWCwgYVkgKTtcblxuXHR9LFxuXG5cdHNwbGluZVRocnU6IGZ1bmN0aW9uICggcHRzIC8qQXJyYXkgb2YgVmVjdG9yKi8gKSB7XG5cblx0XHR2YXIgbnB0cyA9IFsgdGhpcy5jdXJyZW50UG9pbnQuY2xvbmUoKSBdLmNvbmNhdCggcHRzICk7XG5cblx0XHR2YXIgY3VydmUgPSBuZXcgU3BsaW5lQ3VydmUoIG5wdHMgKTtcblx0XHR0aGlzLmN1cnZlcy5wdXNoKCBjdXJ2ZSApO1xuXG5cdFx0dGhpcy5jdXJyZW50UG9pbnQuY29weSggcHRzWyBwdHMubGVuZ3RoIC0gMSBdICk7XG5cblx0fSxcblxuXHRhcmM6IGZ1bmN0aW9uICggYVgsIGFZLCBhUmFkaXVzLCBhU3RhcnRBbmdsZSwgYUVuZEFuZ2xlLCBhQ2xvY2t3aXNlICkge1xuXG5cdFx0dmFyIHgwID0gdGhpcy5jdXJyZW50UG9pbnQueDtcblx0XHR2YXIgeTAgPSB0aGlzLmN1cnJlbnRQb2ludC55O1xuXG5cdFx0dGhpcy5hYnNhcmMoIGFYICsgeDAsIGFZICsgeTAsIGFSYWRpdXMsXG5cdFx0XHRhU3RhcnRBbmdsZSwgYUVuZEFuZ2xlLCBhQ2xvY2t3aXNlICk7XG5cblx0fSxcblxuXHRhYnNhcmM6IGZ1bmN0aW9uICggYVgsIGFZLCBhUmFkaXVzLCBhU3RhcnRBbmdsZSwgYUVuZEFuZ2xlLCBhQ2xvY2t3aXNlICkge1xuXG5cdFx0dGhpcy5hYnNlbGxpcHNlKCBhWCwgYVksIGFSYWRpdXMsIGFSYWRpdXMsIGFTdGFydEFuZ2xlLCBhRW5kQW5nbGUsIGFDbG9ja3dpc2UgKTtcblxuXHR9LFxuXG5cdGVsbGlwc2U6IGZ1bmN0aW9uICggYVgsIGFZLCB4UmFkaXVzLCB5UmFkaXVzLCBhU3RhcnRBbmdsZSwgYUVuZEFuZ2xlLCBhQ2xvY2t3aXNlLCBhUm90YXRpb24gKSB7XG5cblx0XHR2YXIgeDAgPSB0aGlzLmN1cnJlbnRQb2ludC54O1xuXHRcdHZhciB5MCA9IHRoaXMuY3VycmVudFBvaW50Lnk7XG5cblx0XHR0aGlzLmFic2VsbGlwc2UoIGFYICsgeDAsIGFZICsgeTAsIHhSYWRpdXMsIHlSYWRpdXMsIGFTdGFydEFuZ2xlLCBhRW5kQW5nbGUsIGFDbG9ja3dpc2UsIGFSb3RhdGlvbiApO1xuXG5cdH0sXG5cblx0YWJzZWxsaXBzZTogZnVuY3Rpb24gKCBhWCwgYVksIHhSYWRpdXMsIHlSYWRpdXMsIGFTdGFydEFuZ2xlLCBhRW5kQW5nbGUsIGFDbG9ja3dpc2UsIGFSb3RhdGlvbiApIHtcblxuXHRcdHZhciBjdXJ2ZSA9IG5ldyBFbGxpcHNlQ3VydmUoIGFYLCBhWSwgeFJhZGl1cywgeVJhZGl1cywgYVN0YXJ0QW5nbGUsIGFFbmRBbmdsZSwgYUNsb2Nrd2lzZSwgYVJvdGF0aW9uICk7XG5cblx0XHRpZiAoIHRoaXMuY3VydmVzLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdC8vIGlmIGEgcHJldmlvdXMgY3VydmUgaXMgcHJlc2VudCwgYXR0ZW1wdCB0byBqb2luXG5cdFx0XHR2YXIgZmlyc3RQb2ludCA9IGN1cnZlLmdldFBvaW50KCAwICk7XG5cblx0XHRcdGlmICggISBmaXJzdFBvaW50LmVxdWFscyggdGhpcy5jdXJyZW50UG9pbnQgKSApIHtcblxuXHRcdFx0XHR0aGlzLmxpbmVUbyggZmlyc3RQb2ludC54LCBmaXJzdFBvaW50LnkgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0dGhpcy5jdXJ2ZXMucHVzaCggY3VydmUgKTtcblxuXHRcdHZhciBsYXN0UG9pbnQgPSBjdXJ2ZS5nZXRQb2ludCggMSApO1xuXHRcdHRoaXMuY3VycmVudFBvaW50LmNvcHkoIGxhc3RQb2ludCApO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3Igeno4NSAvIGh0dHA6Ly93d3cubGFiNGdhbWVzLm5ldC96ejg1L2Jsb2dcbiAqIENyZWF0ZXMgZnJlZSBmb3JtIDJkIHBhdGggdXNpbmcgc2VyaWVzIG9mIHBvaW50cywgbGluZXMgb3IgY3VydmVzLlxuICoqL1xuXG5mdW5jdGlvbiBQYXRoKCBwb2ludHMgKSB7XG5cblx0Q3VydmVQYXRoLmNhbGwoIHRoaXMgKTtcblx0dGhpcy5jdXJyZW50UG9pbnQgPSBuZXcgVmVjdG9yMigpO1xuXG5cdGlmICggcG9pbnRzICkge1xuXG5cdFx0dGhpcy5mcm9tUG9pbnRzKCBwb2ludHMgKTtcblxuXHR9XG5cbn1cblxuUGF0aC5wcm90b3R5cGUgPSBQYXRoUHJvdG90eXBlO1xuUGF0aFByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFBhdGg7XG5cbi8qKlxuICogQGF1dGhvciB6ejg1IC8gaHR0cDovL3d3dy5sYWI0Z2FtZXMubmV0L3p6ODUvYmxvZ1xuICogRGVmaW5lcyBhIDJkIHNoYXBlIHBsYW5lIHVzaW5nIHBhdGhzLlxuICoqL1xuXG4vLyBTVEVQIDEgQ3JlYXRlIGEgcGF0aC5cbi8vIFNURVAgMiBUdXJuIHBhdGggaW50byBzaGFwZS5cbi8vIFNURVAgMyBFeHRydWRlR2VvbWV0cnkgdGFrZXMgaW4gU2hhcGUvU2hhcGVzXG4vLyBTVEVQIDNhIC0gRXh0cmFjdCBwb2ludHMgZnJvbSBlYWNoIHNoYXBlLCB0dXJuIHRvIHZlcnRpY2VzXG4vLyBTVEVQIDNiIC0gVHJpYW5ndWxhdGUgZWFjaCBzaGFwZSwgYWRkIGZhY2VzLlxuXG5mdW5jdGlvbiBTaGFwZSgpIHtcblxuXHRQYXRoLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblxuXHR0aGlzLmhvbGVzID0gW107XG5cbn1cblxuU2hhcGUucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggUGF0aFByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IFNoYXBlLFxuXG5cdGdldFBvaW50c0hvbGVzOiBmdW5jdGlvbiAoIGRpdmlzaW9ucyApIHtcblxuXHRcdHZhciBob2xlc1B0cyA9IFtdO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gdGhpcy5ob2xlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRob2xlc1B0c1sgaSBdID0gdGhpcy5ob2xlc1sgaSBdLmdldFBvaW50cyggZGl2aXNpb25zICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gaG9sZXNQdHM7XG5cblx0fSxcblxuXHQvLyBHZXQgcG9pbnRzIG9mIHNoYXBlIGFuZCBob2xlcyAoa2V5cG9pbnRzIGJhc2VkIG9uIHNlZ21lbnRzIHBhcmFtZXRlcilcblxuXHRleHRyYWN0QWxsUG9pbnRzOiBmdW5jdGlvbiAoIGRpdmlzaW9ucyApIHtcblxuXHRcdHJldHVybiB7XG5cblx0XHRcdHNoYXBlOiB0aGlzLmdldFBvaW50cyggZGl2aXNpb25zICksXG5cdFx0XHRob2xlczogdGhpcy5nZXRQb2ludHNIb2xlcyggZGl2aXNpb25zIClcblxuXHRcdH07XG5cblx0fSxcblxuXHRleHRyYWN0UG9pbnRzOiBmdW5jdGlvbiAoIGRpdmlzaW9ucyApIHtcblxuXHRcdHJldHVybiB0aGlzLmV4dHJhY3RBbGxQb2ludHMoIGRpdmlzaW9ucyApO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3Igeno4NSAvIGh0dHA6Ly93d3cubGFiNGdhbWVzLm5ldC96ejg1L2Jsb2dcbiAqIG1pbmltYWwgY2xhc3MgZm9yIHByb3hpbmcgZnVuY3Rpb25zIHRvIFBhdGguIFJlcGxhY2VzIG9sZCBcImV4dHJhY3RTdWJwYXRocygpXCJcbiAqKi9cblxuZnVuY3Rpb24gU2hhcGVQYXRoKCkge1xuXG5cdHRoaXMuc3ViUGF0aHMgPSBbXTtcblx0dGhpcy5jdXJyZW50UGF0aCA9IG51bGw7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggU2hhcGVQYXRoLnByb3RvdHlwZSwge1xuXG5cdG1vdmVUbzogZnVuY3Rpb24gKCB4LCB5ICkge1xuXG5cdFx0dGhpcy5jdXJyZW50UGF0aCA9IG5ldyBQYXRoKCk7XG5cdFx0dGhpcy5zdWJQYXRocy5wdXNoKCB0aGlzLmN1cnJlbnRQYXRoICk7XG5cdFx0dGhpcy5jdXJyZW50UGF0aC5tb3ZlVG8oIHgsIHkgKTtcblxuXHR9LFxuXG5cdGxpbmVUbzogZnVuY3Rpb24gKCB4LCB5ICkge1xuXG5cdFx0dGhpcy5jdXJyZW50UGF0aC5saW5lVG8oIHgsIHkgKTtcblxuXHR9LFxuXG5cdHF1YWRyYXRpY0N1cnZlVG86IGZ1bmN0aW9uICggYUNQeCwgYUNQeSwgYVgsIGFZICkge1xuXG5cdFx0dGhpcy5jdXJyZW50UGF0aC5xdWFkcmF0aWNDdXJ2ZVRvKCBhQ1B4LCBhQ1B5LCBhWCwgYVkgKTtcblxuXHR9LFxuXG5cdGJlemllckN1cnZlVG86IGZ1bmN0aW9uICggYUNQMXgsIGFDUDF5LCBhQ1AyeCwgYUNQMnksIGFYLCBhWSApIHtcblxuXHRcdHRoaXMuY3VycmVudFBhdGguYmV6aWVyQ3VydmVUbyggYUNQMXgsIGFDUDF5LCBhQ1AyeCwgYUNQMnksIGFYLCBhWSApO1xuXG5cdH0sXG5cblx0c3BsaW5lVGhydTogZnVuY3Rpb24gKCBwdHMgKSB7XG5cblx0XHR0aGlzLmN1cnJlbnRQYXRoLnNwbGluZVRocnUoIHB0cyApO1xuXG5cdH0sXG5cblx0dG9TaGFwZXM6IGZ1bmN0aW9uICggaXNDQ1csIG5vSG9sZXMgKSB7XG5cblx0XHRmdW5jdGlvbiB0b1NoYXBlc05vSG9sZXMoIGluU3VicGF0aHMgKSB7XG5cblx0XHRcdHZhciBzaGFwZXMgPSBbXTtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gaW5TdWJwYXRocy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdHZhciB0bXBQYXRoID0gaW5TdWJwYXRoc1sgaSBdO1xuXG5cdFx0XHRcdHZhciB0bXBTaGFwZSA9IG5ldyBTaGFwZSgpO1xuXHRcdFx0XHR0bXBTaGFwZS5jdXJ2ZXMgPSB0bXBQYXRoLmN1cnZlcztcblxuXHRcdFx0XHRzaGFwZXMucHVzaCggdG1wU2hhcGUgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gc2hhcGVzO1xuXG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gaXNQb2ludEluc2lkZVBvbHlnb24oIGluUHQsIGluUG9seWdvbiApIHtcblxuXHRcdFx0dmFyIHBvbHlMZW4gPSBpblBvbHlnb24ubGVuZ3RoO1xuXG5cdFx0XHQvLyBpblB0IG9uIHBvbHlnb24gY29udG91ciA9PiBpbW1lZGlhdGUgc3VjY2VzcyAgICBvclxuXHRcdFx0Ly8gdG9nZ2xpbmcgb2YgaW5zaWRlL291dHNpZGUgYXQgZXZlcnkgc2luZ2xlISBpbnRlcnNlY3Rpb24gcG9pbnQgb2YgYW4gZWRnZVxuXHRcdFx0Ly8gIHdpdGggdGhlIGhvcml6b250YWwgbGluZSB0aHJvdWdoIGluUHQsIGxlZnQgb2YgaW5QdFxuXHRcdFx0Ly8gIG5vdCBjb3VudGluZyBsb3dlclkgZW5kcG9pbnRzIG9mIGVkZ2VzIGFuZCB3aG9sZSBlZGdlcyBvbiB0aGF0IGxpbmVcblx0XHRcdHZhciBpbnNpZGUgPSBmYWxzZTtcblx0XHRcdGZvciAoIHZhciBwID0gcG9seUxlbiAtIDEsIHEgPSAwOyBxIDwgcG9seUxlbjsgcCA9IHEgKysgKSB7XG5cblx0XHRcdFx0dmFyIGVkZ2VMb3dQdCAgPSBpblBvbHlnb25bIHAgXTtcblx0XHRcdFx0dmFyIGVkZ2VIaWdoUHQgPSBpblBvbHlnb25bIHEgXTtcblxuXHRcdFx0XHR2YXIgZWRnZUR4ID0gZWRnZUhpZ2hQdC54IC0gZWRnZUxvd1B0Lng7XG5cdFx0XHRcdHZhciBlZGdlRHkgPSBlZGdlSGlnaFB0LnkgLSBlZGdlTG93UHQueTtcblxuXHRcdFx0XHRpZiAoIE1hdGguYWJzKCBlZGdlRHkgKSA+IE51bWJlci5FUFNJTE9OICkge1xuXG5cdFx0XHRcdFx0Ly8gbm90IHBhcmFsbGVsXG5cdFx0XHRcdFx0aWYgKCBlZGdlRHkgPCAwICkge1xuXG5cdFx0XHRcdFx0XHRlZGdlTG93UHQgID0gaW5Qb2x5Z29uWyBxIF07IGVkZ2VEeCA9IC0gZWRnZUR4O1xuXHRcdFx0XHRcdFx0ZWRnZUhpZ2hQdCA9IGluUG9seWdvblsgcCBdOyBlZGdlRHkgPSAtIGVkZ2VEeTtcblxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoICggaW5QdC55IDwgZWRnZUxvd1B0LnkgKSB8fCAoIGluUHQueSA+IGVkZ2VIaWdoUHQueSApICkgXHRcdGNvbnRpbnVlO1xuXG5cdFx0XHRcdFx0aWYgKCBpblB0LnkgPT09IGVkZ2VMb3dQdC55ICkge1xuXG5cdFx0XHRcdFx0XHRpZiAoIGluUHQueCA9PT0gZWRnZUxvd1B0LnggKVx0XHRyZXR1cm5cdHRydWU7XHRcdC8vIGluUHQgaXMgb24gY29udG91ciA/XG5cdFx0XHRcdFx0XHQvLyBjb250aW51ZTtcdFx0XHRcdC8vIG5vIGludGVyc2VjdGlvbiBvciBlZGdlTG93UHQgPT4gZG9lc24ndCBjb3VudCAhISFcblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdHZhciBwZXJwRWRnZSA9IGVkZ2VEeSAqICggaW5QdC54IC0gZWRnZUxvd1B0LnggKSAtIGVkZ2VEeCAqICggaW5QdC55IC0gZWRnZUxvd1B0LnkgKTtcblx0XHRcdFx0XHRcdGlmICggcGVycEVkZ2UgPT09IDAgKVx0XHRcdFx0cmV0dXJuXHR0cnVlO1x0XHQvLyBpblB0IGlzIG9uIGNvbnRvdXIgP1xuXHRcdFx0XHRcdFx0aWYgKCBwZXJwRWRnZSA8IDAgKSBcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHRcdFx0aW5zaWRlID0gISBpbnNpZGU7XHRcdC8vIHRydWUgaW50ZXJzZWN0aW9uIGxlZnQgb2YgaW5QdFxuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHQvLyBwYXJhbGxlbCBvciBjb2xsaW5lYXJcblx0XHRcdFx0XHRpZiAoIGluUHQueSAhPT0gZWRnZUxvd1B0LnkgKSBcdFx0Y29udGludWU7XHRcdFx0Ly8gcGFyYWxsZWxcblx0XHRcdFx0XHQvLyBlZGdlIGxpZXMgb24gdGhlIHNhbWUgaG9yaXpvbnRhbCBsaW5lIGFzIGluUHRcblx0XHRcdFx0XHRpZiAoICggKCBlZGdlSGlnaFB0LnggPD0gaW5QdC54ICkgJiYgKCBpblB0LnggPD0gZWRnZUxvd1B0LnggKSApIHx8XG5cdFx0XHRcdFx0XHQgKCAoIGVkZ2VMb3dQdC54IDw9IGluUHQueCApICYmICggaW5QdC54IDw9IGVkZ2VIaWdoUHQueCApICkgKVx0XHRyZXR1cm5cdHRydWU7XHQvLyBpblB0OiBQb2ludCBvbiBjb250b3VyICFcblx0XHRcdFx0XHQvLyBjb250aW51ZTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuXHRpbnNpZGU7XG5cblx0XHR9XG5cblx0XHR2YXIgaXNDbG9ja1dpc2UgPSBTaGFwZVV0aWxzLmlzQ2xvY2tXaXNlO1xuXG5cdFx0dmFyIHN1YlBhdGhzID0gdGhpcy5zdWJQYXRocztcblx0XHRpZiAoIHN1YlBhdGhzLmxlbmd0aCA9PT0gMCApIHJldHVybiBbXTtcblxuXHRcdGlmICggbm9Ib2xlcyA9PT0gdHJ1ZSApXHRyZXR1cm5cdHRvU2hhcGVzTm9Ib2xlcyggc3ViUGF0aHMgKTtcblxuXG5cdFx0dmFyIHNvbGlkLCB0bXBQYXRoLCB0bXBTaGFwZSwgc2hhcGVzID0gW107XG5cblx0XHRpZiAoIHN1YlBhdGhzLmxlbmd0aCA9PT0gMSApIHtcblxuXHRcdFx0dG1wUGF0aCA9IHN1YlBhdGhzWyAwIF07XG5cdFx0XHR0bXBTaGFwZSA9IG5ldyBTaGFwZSgpO1xuXHRcdFx0dG1wU2hhcGUuY3VydmVzID0gdG1wUGF0aC5jdXJ2ZXM7XG5cdFx0XHRzaGFwZXMucHVzaCggdG1wU2hhcGUgKTtcblx0XHRcdHJldHVybiBzaGFwZXM7XG5cblx0XHR9XG5cblx0XHR2YXIgaG9sZXNGaXJzdCA9ICEgaXNDbG9ja1dpc2UoIHN1YlBhdGhzWyAwIF0uZ2V0UG9pbnRzKCkgKTtcblx0XHRob2xlc0ZpcnN0ID0gaXNDQ1cgPyAhIGhvbGVzRmlyc3QgOiBob2xlc0ZpcnN0O1xuXG5cdFx0Ly8gY29uc29sZS5sb2coXCJIb2xlcyBmaXJzdFwiLCBob2xlc0ZpcnN0KTtcblxuXHRcdHZhciBiZXR0ZXJTaGFwZUhvbGVzID0gW107XG5cdFx0dmFyIG5ld1NoYXBlcyA9IFtdO1xuXHRcdHZhciBuZXdTaGFwZUhvbGVzID0gW107XG5cdFx0dmFyIG1haW5JZHggPSAwO1xuXHRcdHZhciB0bXBQb2ludHM7XG5cblx0XHRuZXdTaGFwZXNbIG1haW5JZHggXSA9IHVuZGVmaW5lZDtcblx0XHRuZXdTaGFwZUhvbGVzWyBtYWluSWR4IF0gPSBbXTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IHN1YlBhdGhzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHRtcFBhdGggPSBzdWJQYXRoc1sgaSBdO1xuXHRcdFx0dG1wUG9pbnRzID0gdG1wUGF0aC5nZXRQb2ludHMoKTtcblx0XHRcdHNvbGlkID0gaXNDbG9ja1dpc2UoIHRtcFBvaW50cyApO1xuXHRcdFx0c29saWQgPSBpc0NDVyA/ICEgc29saWQgOiBzb2xpZDtcblxuXHRcdFx0aWYgKCBzb2xpZCApIHtcblxuXHRcdFx0XHRpZiAoICggISBob2xlc0ZpcnN0ICkgJiYgKCBuZXdTaGFwZXNbIG1haW5JZHggXSApIClcdG1haW5JZHggKys7XG5cblx0XHRcdFx0bmV3U2hhcGVzWyBtYWluSWR4IF0gPSB7IHM6IG5ldyBTaGFwZSgpLCBwOiB0bXBQb2ludHMgfTtcblx0XHRcdFx0bmV3U2hhcGVzWyBtYWluSWR4IF0ucy5jdXJ2ZXMgPSB0bXBQYXRoLmN1cnZlcztcblxuXHRcdFx0XHRpZiAoIGhvbGVzRmlyc3QgKVx0bWFpbklkeCArKztcblx0XHRcdFx0bmV3U2hhcGVIb2xlc1sgbWFpbklkeCBdID0gW107XG5cblx0XHRcdFx0Ly9jb25zb2xlLmxvZygnY3cnLCBpKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRuZXdTaGFwZUhvbGVzWyBtYWluSWR4IF0ucHVzaCggeyBoOiB0bXBQYXRoLCBwOiB0bXBQb2ludHNbIDAgXSB9ICk7XG5cblx0XHRcdFx0Ly9jb25zb2xlLmxvZygnY2N3JywgaSk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIG9ubHkgSG9sZXM/IC0+IHByb2JhYmx5IGFsbCBTaGFwZXMgd2l0aCB3cm9uZyBvcmllbnRhdGlvblxuXHRcdGlmICggISBuZXdTaGFwZXNbIDAgXSApXHRyZXR1cm5cdHRvU2hhcGVzTm9Ib2xlcyggc3ViUGF0aHMgKTtcblxuXG5cdFx0aWYgKCBuZXdTaGFwZXMubGVuZ3RoID4gMSApIHtcblxuXHRcdFx0dmFyIGFtYmlndW91cyA9IGZhbHNlO1xuXHRcdFx0dmFyIHRvQ2hhbmdlID0gW107XG5cblx0XHRcdGZvciAoIHZhciBzSWR4ID0gMCwgc0xlbiA9IG5ld1NoYXBlcy5sZW5ndGg7IHNJZHggPCBzTGVuOyBzSWR4ICsrICkge1xuXG5cdFx0XHRcdGJldHRlclNoYXBlSG9sZXNbIHNJZHggXSA9IFtdO1xuXG5cdFx0XHR9XG5cblx0XHRcdGZvciAoIHZhciBzSWR4ID0gMCwgc0xlbiA9IG5ld1NoYXBlcy5sZW5ndGg7IHNJZHggPCBzTGVuOyBzSWR4ICsrICkge1xuXG5cdFx0XHRcdHZhciBzaG8gPSBuZXdTaGFwZUhvbGVzWyBzSWR4IF07XG5cblx0XHRcdFx0Zm9yICggdmFyIGhJZHggPSAwOyBoSWR4IDwgc2hvLmxlbmd0aDsgaElkeCArKyApIHtcblxuXHRcdFx0XHRcdHZhciBobyA9IHNob1sgaElkeCBdO1xuXHRcdFx0XHRcdHZhciBob2xlX3VuYXNzaWduZWQgPSB0cnVlO1xuXG5cdFx0XHRcdFx0Zm9yICggdmFyIHMySWR4ID0gMDsgczJJZHggPCBuZXdTaGFwZXMubGVuZ3RoOyBzMklkeCArKyApIHtcblxuXHRcdFx0XHRcdFx0aWYgKCBpc1BvaW50SW5zaWRlUG9seWdvbiggaG8ucCwgbmV3U2hhcGVzWyBzMklkeCBdLnAgKSApIHtcblxuXHRcdFx0XHRcdFx0XHRpZiAoIHNJZHggIT09IHMySWR4IClcdHRvQ2hhbmdlLnB1c2goIHsgZnJvbXM6IHNJZHgsIHRvczogczJJZHgsIGhvbGU6IGhJZHggfSApO1xuXHRcdFx0XHRcdFx0XHRpZiAoIGhvbGVfdW5hc3NpZ25lZCApIHtcblxuXHRcdFx0XHRcdFx0XHRcdGhvbGVfdW5hc3NpZ25lZCA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0XHRcdGJldHRlclNoYXBlSG9sZXNbIHMySWR4IF0ucHVzaCggaG8gKTtcblxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdFx0YW1iaWd1b3VzID0gdHJ1ZTtcblxuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoIGhvbGVfdW5hc3NpZ25lZCApIHtcblxuXHRcdFx0XHRcdFx0YmV0dGVyU2hhcGVIb2xlc1sgc0lkeCBdLnB1c2goIGhvICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cdFx0XHQvLyBjb25zb2xlLmxvZyhcImFtYmlndW91czogXCIsIGFtYmlndW91cyk7XG5cdFx0XHRpZiAoIHRvQ2hhbmdlLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdFx0Ly8gY29uc29sZS5sb2coXCJ0byBjaGFuZ2U6IFwiLCB0b0NoYW5nZSk7XG5cdFx0XHRcdGlmICggISBhbWJpZ3VvdXMgKVx0bmV3U2hhcGVIb2xlcyA9IGJldHRlclNoYXBlSG9sZXM7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHZhciB0bXBIb2xlcztcblxuXHRcdGZvciAoIHZhciBpID0gMCwgaWwgPSBuZXdTaGFwZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHRtcFNoYXBlID0gbmV3U2hhcGVzWyBpIF0ucztcblx0XHRcdHNoYXBlcy5wdXNoKCB0bXBTaGFwZSApO1xuXHRcdFx0dG1wSG9sZXMgPSBuZXdTaGFwZUhvbGVzWyBpIF07XG5cblx0XHRcdGZvciAoIHZhciBqID0gMCwgamwgPSB0bXBIb2xlcy5sZW5ndGg7IGogPCBqbDsgaiArKyApIHtcblxuXHRcdFx0XHR0bXBTaGFwZS5ob2xlcy5wdXNoKCB0bXBIb2xlc1sgaiBdLmggKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly9jb25zb2xlLmxvZyhcInNoYXBlXCIsIHNoYXBlcyk7XG5cblx0XHRyZXR1cm4gc2hhcGVzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3Igeno4NSAvIGh0dHA6Ly93d3cubGFiNGdhbWVzLm5ldC96ejg1L2Jsb2dcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gRm9udCggZGF0YSApIHtcblxuXHR0aGlzLmRhdGEgPSBkYXRhO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIEZvbnQucHJvdG90eXBlLCB7XG5cblx0aXNGb250OiB0cnVlLFxuXG5cdGdlbmVyYXRlU2hhcGVzOiBmdW5jdGlvbiAoIHRleHQsIHNpemUsIGRpdmlzaW9ucyApIHtcblxuXHRcdGZ1bmN0aW9uIGNyZWF0ZVBhdGhzKCB0ZXh0ICkge1xuXG5cdFx0XHR2YXIgY2hhcnMgPSBTdHJpbmcoIHRleHQgKS5zcGxpdCggJycgKTtcblx0XHRcdHZhciBzY2FsZSA9IHNpemUgLyBkYXRhLnJlc29sdXRpb247XG5cdFx0XHR2YXIgbGluZV9oZWlnaHQgPSAoIGRhdGEuYm91bmRpbmdCb3gueU1heCAtIGRhdGEuYm91bmRpbmdCb3gueU1pbiArIGRhdGEudW5kZXJsaW5lVGhpY2tuZXNzICkgKiBzY2FsZTtcblxuXHRcdFx0dmFyIG9mZnNldFggPSAwLCBvZmZzZXRZID0gMDtcblxuXHRcdFx0dmFyIHBhdGhzID0gW107XG5cblx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGNoYXJzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0XHR2YXIgY2hhciA9IGNoYXJzWyBpIF07XG5cblx0XHRcdFx0aWYgKCBjaGFyID09PSAnXFxuJyApIHtcblxuXHRcdFx0XHRcdG9mZnNldFggPSAwO1xuXHRcdFx0XHRcdG9mZnNldFkgLT0gbGluZV9oZWlnaHQ7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHZhciByZXQgPSBjcmVhdGVQYXRoKCBjaGFyLCBzY2FsZSwgb2Zmc2V0WCwgb2Zmc2V0WSApO1xuXHRcdFx0XHRcdG9mZnNldFggKz0gcmV0Lm9mZnNldFg7XG5cdFx0XHRcdFx0cGF0aHMucHVzaCggcmV0LnBhdGggKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHBhdGhzO1xuXG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gY3JlYXRlUGF0aCggYywgc2NhbGUsIG9mZnNldFgsIG9mZnNldFkgKSB7XG5cblx0XHRcdHZhciBnbHlwaCA9IGRhdGEuZ2x5cGhzWyBjIF0gfHwgZGF0YS5nbHlwaHNbICc/JyBdO1xuXG5cdFx0XHRpZiAoICEgZ2x5cGggKSByZXR1cm47XG5cblx0XHRcdHZhciBwYXRoID0gbmV3IFNoYXBlUGF0aCgpO1xuXG5cdFx0XHR2YXIgcHRzID0gW107XG5cdFx0XHR2YXIgeCwgeSwgY3B4LCBjcHksIGNweDAsIGNweTAsIGNweDEsIGNweTEsIGNweDIsIGNweTIsIGxhc3RlO1xuXG5cdFx0XHRpZiAoIGdseXBoLm8gKSB7XG5cblx0XHRcdFx0dmFyIG91dGxpbmUgPSBnbHlwaC5fY2FjaGVkT3V0bGluZSB8fCAoIGdseXBoLl9jYWNoZWRPdXRsaW5lID0gZ2x5cGguby5zcGxpdCggJyAnICkgKTtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBvdXRsaW5lLmxlbmd0aDsgaSA8IGw7ICkge1xuXG5cdFx0XHRcdFx0dmFyIGFjdGlvbiA9IG91dGxpbmVbIGkgKysgXTtcblxuXHRcdFx0XHRcdHN3aXRjaCAoIGFjdGlvbiApIHtcblxuXHRcdFx0XHRcdFx0Y2FzZSAnbSc6IC8vIG1vdmVUb1xuXG5cdFx0XHRcdFx0XHRcdHggPSBvdXRsaW5lWyBpICsrIF0gKiBzY2FsZSArIG9mZnNldFg7XG5cdFx0XHRcdFx0XHRcdHkgPSBvdXRsaW5lWyBpICsrIF0gKiBzY2FsZSArIG9mZnNldFk7XG5cblx0XHRcdFx0XHRcdFx0cGF0aC5tb3ZlVG8oIHgsIHkgKTtcblxuXHRcdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdFx0Y2FzZSAnbCc6IC8vIGxpbmVUb1xuXG5cdFx0XHRcdFx0XHRcdHggPSBvdXRsaW5lWyBpICsrIF0gKiBzY2FsZSArIG9mZnNldFg7XG5cdFx0XHRcdFx0XHRcdHkgPSBvdXRsaW5lWyBpICsrIF0gKiBzY2FsZSArIG9mZnNldFk7XG5cblx0XHRcdFx0XHRcdFx0cGF0aC5saW5lVG8oIHgsIHkgKTtcblxuXHRcdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdFx0Y2FzZSAncSc6IC8vIHF1YWRyYXRpY0N1cnZlVG9cblxuXHRcdFx0XHRcdFx0XHRjcHggID0gb3V0bGluZVsgaSArKyBdICogc2NhbGUgKyBvZmZzZXRYO1xuXHRcdFx0XHRcdFx0XHRjcHkgID0gb3V0bGluZVsgaSArKyBdICogc2NhbGUgKyBvZmZzZXRZO1xuXHRcdFx0XHRcdFx0XHRjcHgxID0gb3V0bGluZVsgaSArKyBdICogc2NhbGUgKyBvZmZzZXRYO1xuXHRcdFx0XHRcdFx0XHRjcHkxID0gb3V0bGluZVsgaSArKyBdICogc2NhbGUgKyBvZmZzZXRZO1xuXG5cdFx0XHRcdFx0XHRcdHBhdGgucXVhZHJhdGljQ3VydmVUbyggY3B4MSwgY3B5MSwgY3B4LCBjcHkgKTtcblxuXHRcdFx0XHRcdFx0XHRsYXN0ZSA9IHB0c1sgcHRzLmxlbmd0aCAtIDEgXTtcblxuXHRcdFx0XHRcdFx0XHRpZiAoIGxhc3RlICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Y3B4MCA9IGxhc3RlLng7XG5cdFx0XHRcdFx0XHRcdFx0Y3B5MCA9IGxhc3RlLnk7XG5cblx0XHRcdFx0XHRcdFx0XHRmb3IgKCB2YXIgaTIgPSAxOyBpMiA8PSBkaXZpc2lvbnM7IGkyICsrICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0XHR2YXIgdCA9IGkyIC8gZGl2aXNpb25zO1xuXHRcdFx0XHRcdFx0XHRcdFx0UXVhZHJhdGljQmV6aWVyKCB0LCBjcHgwLCBjcHgxLCBjcHggKTtcblx0XHRcdFx0XHRcdFx0XHRcdFF1YWRyYXRpY0JlemllciggdCwgY3B5MCwgY3B5MSwgY3B5ICk7XG5cblx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHRjYXNlICdiJzogLy8gYmV6aWVyQ3VydmVUb1xuXG5cdFx0XHRcdFx0XHRcdGNweCAgPSBvdXRsaW5lWyBpICsrIF0gKiBzY2FsZSArIG9mZnNldFg7XG5cdFx0XHRcdFx0XHRcdGNweSAgPSBvdXRsaW5lWyBpICsrIF0gKiBzY2FsZSArIG9mZnNldFk7XG5cdFx0XHRcdFx0XHRcdGNweDEgPSBvdXRsaW5lWyBpICsrIF0gKiBzY2FsZSArIG9mZnNldFg7XG5cdFx0XHRcdFx0XHRcdGNweTEgPSBvdXRsaW5lWyBpICsrIF0gKiBzY2FsZSArIG9mZnNldFk7XG5cdFx0XHRcdFx0XHRcdGNweDIgPSBvdXRsaW5lWyBpICsrIF0gKiBzY2FsZSArIG9mZnNldFg7XG5cdFx0XHRcdFx0XHRcdGNweTIgPSBvdXRsaW5lWyBpICsrIF0gKiBzY2FsZSArIG9mZnNldFk7XG5cblx0XHRcdFx0XHRcdFx0cGF0aC5iZXppZXJDdXJ2ZVRvKCBjcHgxLCBjcHkxLCBjcHgyLCBjcHkyLCBjcHgsIGNweSApO1xuXG5cdFx0XHRcdFx0XHRcdGxhc3RlID0gcHRzWyBwdHMubGVuZ3RoIC0gMSBdO1xuXG5cdFx0XHRcdFx0XHRcdGlmICggbGFzdGUgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRjcHgwID0gbGFzdGUueDtcblx0XHRcdFx0XHRcdFx0XHRjcHkwID0gbGFzdGUueTtcblxuXHRcdFx0XHRcdFx0XHRcdGZvciAoIHZhciBpMiA9IDE7IGkyIDw9IGRpdmlzaW9uczsgaTIgKysgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRcdHZhciB0ID0gaTIgLyBkaXZpc2lvbnM7XG5cdFx0XHRcdFx0XHRcdFx0XHRDdWJpY0JlemllciggdCwgY3B4MCwgY3B4MSwgY3B4MiwgY3B4ICk7XG5cdFx0XHRcdFx0XHRcdFx0XHRDdWJpY0JlemllciggdCwgY3B5MCwgY3B5MSwgY3B5MiwgY3B5ICk7XG5cblx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4geyBvZmZzZXRYOiBnbHlwaC5oYSAqIHNjYWxlLCBwYXRoOiBwYXRoIH07XG5cblx0XHR9XG5cblx0XHQvL1xuXG5cdFx0aWYgKCBzaXplID09PSB1bmRlZmluZWQgKSBzaXplID0gMTAwO1xuXHRcdGlmICggZGl2aXNpb25zID09PSB1bmRlZmluZWQgKSBkaXZpc2lvbnMgPSA0O1xuXG5cdFx0dmFyIGRhdGEgPSB0aGlzLmRhdGE7XG5cblx0XHR2YXIgcGF0aHMgPSBjcmVhdGVQYXRocyggdGV4dCApO1xuXHRcdHZhciBzaGFwZXMgPSBbXTtcblxuXHRcdGZvciAoIHZhciBwID0gMCwgcGwgPSBwYXRocy5sZW5ndGg7IHAgPCBwbDsgcCArKyApIHtcblxuXHRcdFx0QXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkoIHNoYXBlcywgcGF0aHNbIHAgXS50b1NoYXBlcygpICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gc2hhcGVzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gRm9udExvYWRlciggbWFuYWdlciApIHtcblxuXHR0aGlzLm1hbmFnZXIgPSAoIG1hbmFnZXIgIT09IHVuZGVmaW5lZCApID8gbWFuYWdlciA6IERlZmF1bHRMb2FkaW5nTWFuYWdlcjtcblxufVxuXG5PYmplY3QuYXNzaWduKCBGb250TG9hZGVyLnByb3RvdHlwZSwge1xuXG5cdGxvYWQ6IGZ1bmN0aW9uICggdXJsLCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKSB7XG5cblx0XHR2YXIgc2NvcGUgPSB0aGlzO1xuXG5cdFx0dmFyIGxvYWRlciA9IG5ldyBGaWxlTG9hZGVyKCB0aGlzLm1hbmFnZXIgKTtcblx0XHRsb2FkZXIubG9hZCggdXJsLCBmdW5jdGlvbiAoIHRleHQgKSB7XG5cblx0XHRcdHZhciBqc29uO1xuXG5cdFx0XHR0cnkge1xuXG5cdFx0XHRcdGpzb24gPSBKU09OLnBhcnNlKCB0ZXh0ICk7XG5cblx0XHRcdH0gY2F0Y2ggKCBlICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkZvbnRMb2FkZXI6IHR5cGVmYWNlLmpzIHN1cHBvcnQgaXMgYmVpbmcgZGVwcmVjYXRlZC4gVXNlIHR5cGVmYWNlLmpzb24gaW5zdGVhZC4nICk7XG5cdFx0XHRcdGpzb24gPSBKU09OLnBhcnNlKCB0ZXh0LnN1YnN0cmluZyggNjUsIHRleHQubGVuZ3RoIC0gMiApICk7XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIGZvbnQgPSBzY29wZS5wYXJzZSgganNvbiApO1xuXG5cdFx0XHRpZiAoIG9uTG9hZCApIG9uTG9hZCggZm9udCApO1xuXG5cdFx0fSwgb25Qcm9ncmVzcywgb25FcnJvciApO1xuXG5cdH0sXG5cblx0cGFyc2U6IGZ1bmN0aW9uICgganNvbiApIHtcblxuXHRcdHJldHVybiBuZXcgRm9udCgganNvbiApO1xuXG5cdH1cblxufSApO1xuXG52YXIgY29udGV4dDtcblxudmFyIEF1ZGlvQ29udGV4dCA9IHtcblxuXHRnZXRDb250ZXh0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRpZiAoIGNvbnRleHQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29udGV4dCA9IG5ldyAoIHdpbmRvdy5BdWRpb0NvbnRleHQgfHwgd2luZG93LndlYmtpdEF1ZGlvQ29udGV4dCApKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gY29udGV4dDtcblxuXHR9LFxuXG5cdHNldENvbnRleHQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRjb250ZXh0ID0gdmFsdWU7XG5cblx0fVxuXG59O1xuXG4vKipcbiAqIEBhdXRob3IgUmVlY2UgQWFyb24gTGVjcml2YWluIC8gaHR0cDovL3JlZWNlbm90ZXMuY29tL1xuICovXG5cbmZ1bmN0aW9uIEF1ZGlvTG9hZGVyKCBtYW5hZ2VyICkge1xuXG5cdHRoaXMubWFuYWdlciA9ICggbWFuYWdlciAhPT0gdW5kZWZpbmVkICkgPyBtYW5hZ2VyIDogRGVmYXVsdExvYWRpbmdNYW5hZ2VyO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIEF1ZGlvTG9hZGVyLnByb3RvdHlwZSwge1xuXG5cdGxvYWQ6IGZ1bmN0aW9uICggdXJsLCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKSB7XG5cblx0XHR2YXIgbG9hZGVyID0gbmV3IEZpbGVMb2FkZXIoIHRoaXMubWFuYWdlciApO1xuXHRcdGxvYWRlci5zZXRSZXNwb25zZVR5cGUoICdhcnJheWJ1ZmZlcicgKTtcblx0XHRsb2FkZXIubG9hZCggdXJsLCBmdW5jdGlvbiAoIGJ1ZmZlciApIHtcblxuXHRcdFx0dmFyIGNvbnRleHQgPSBBdWRpb0NvbnRleHQuZ2V0Q29udGV4dCgpO1xuXG5cdFx0XHRjb250ZXh0LmRlY29kZUF1ZGlvRGF0YSggYnVmZmVyLCBmdW5jdGlvbiAoIGF1ZGlvQnVmZmVyICkge1xuXG5cdFx0XHRcdG9uTG9hZCggYXVkaW9CdWZmZXIgKTtcblxuXHRcdFx0fSApO1xuXG5cdFx0fSwgb25Qcm9ncmVzcywgb25FcnJvciApO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gU3RlcmVvQ2FtZXJhKCkge1xuXG5cdHRoaXMudHlwZSA9ICdTdGVyZW9DYW1lcmEnO1xuXG5cdHRoaXMuYXNwZWN0ID0gMTtcblxuXHR0aGlzLmV5ZVNlcCA9IDAuMDY0O1xuXG5cdHRoaXMuY2FtZXJhTCA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSgpO1xuXHR0aGlzLmNhbWVyYUwubGF5ZXJzLmVuYWJsZSggMSApO1xuXHR0aGlzLmNhbWVyYUwubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xuXG5cdHRoaXMuY2FtZXJhUiA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSgpO1xuXHR0aGlzLmNhbWVyYVIubGF5ZXJzLmVuYWJsZSggMiApO1xuXHR0aGlzLmNhbWVyYVIubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIFN0ZXJlb0NhbWVyYS5wcm90b3R5cGUsIHtcblxuXHR1cGRhdGU6ICggZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIGluc3RhbmNlLCBmb2N1cywgZm92LCBhc3BlY3QsIG5lYXIsIGZhciwgem9vbSwgZXllU2VwO1xuXG5cdFx0dmFyIGV5ZVJpZ2h0ID0gbmV3IE1hdHJpeDQoKTtcblx0XHR2YXIgZXllTGVmdCA9IG5ldyBNYXRyaXg0KCk7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gdXBkYXRlKCBjYW1lcmEgKSB7XG5cblx0XHRcdHZhciBuZWVkc1VwZGF0ZSA9IGluc3RhbmNlICE9PSB0aGlzIHx8IGZvY3VzICE9PSBjYW1lcmEuZm9jdXMgfHwgZm92ICE9PSBjYW1lcmEuZm92IHx8XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhc3BlY3QgIT09IGNhbWVyYS5hc3BlY3QgKiB0aGlzLmFzcGVjdCB8fCBuZWFyICE9PSBjYW1lcmEubmVhciB8fFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZmFyICE9PSBjYW1lcmEuZmFyIHx8IHpvb20gIT09IGNhbWVyYS56b29tIHx8IGV5ZVNlcCAhPT0gdGhpcy5leWVTZXA7XG5cblx0XHRcdGlmICggbmVlZHNVcGRhdGUgKSB7XG5cblx0XHRcdFx0aW5zdGFuY2UgPSB0aGlzO1xuXHRcdFx0XHRmb2N1cyA9IGNhbWVyYS5mb2N1cztcblx0XHRcdFx0Zm92ID0gY2FtZXJhLmZvdjtcblx0XHRcdFx0YXNwZWN0ID0gY2FtZXJhLmFzcGVjdCAqIHRoaXMuYXNwZWN0O1xuXHRcdFx0XHRuZWFyID0gY2FtZXJhLm5lYXI7XG5cdFx0XHRcdGZhciA9IGNhbWVyYS5mYXI7XG5cdFx0XHRcdHpvb20gPSBjYW1lcmEuem9vbTtcblxuXHRcdFx0XHQvLyBPZmYtYXhpcyBzdGVyZW9zY29waWMgZWZmZWN0IGJhc2VkIG9uXG5cdFx0XHRcdC8vIGh0dHA6Ly9wYXVsYm91cmtlLm5ldC9zdGVyZW9ncmFwaGljcy9zdGVyZW9yZW5kZXIvXG5cblx0XHRcdFx0dmFyIHByb2plY3Rpb25NYXRyaXggPSBjYW1lcmEucHJvamVjdGlvbk1hdHJpeC5jbG9uZSgpO1xuXHRcdFx0XHRleWVTZXAgPSB0aGlzLmV5ZVNlcCAvIDI7XG5cdFx0XHRcdHZhciBleWVTZXBPblByb2plY3Rpb24gPSBleWVTZXAgKiBuZWFyIC8gZm9jdXM7XG5cdFx0XHRcdHZhciB5bWF4ID0gKCBuZWFyICogTWF0aC50YW4oIF9NYXRoLkRFRzJSQUQgKiBmb3YgKiAwLjUgKSApIC8gem9vbTtcblx0XHRcdFx0dmFyIHhtaW4sIHhtYXg7XG5cblx0XHRcdFx0Ly8gdHJhbnNsYXRlIHhPZmZzZXRcblxuXHRcdFx0XHRleWVMZWZ0LmVsZW1lbnRzWyAxMiBdID0gLSBleWVTZXA7XG5cdFx0XHRcdGV5ZVJpZ2h0LmVsZW1lbnRzWyAxMiBdID0gZXllU2VwO1xuXG5cdFx0XHRcdC8vIGZvciBsZWZ0IGV5ZVxuXG5cdFx0XHRcdHhtaW4gPSAtIHltYXggKiBhc3BlY3QgKyBleWVTZXBPblByb2plY3Rpb247XG5cdFx0XHRcdHhtYXggPSB5bWF4ICogYXNwZWN0ICsgZXllU2VwT25Qcm9qZWN0aW9uO1xuXG5cdFx0XHRcdHByb2plY3Rpb25NYXRyaXguZWxlbWVudHNbIDAgXSA9IDIgKiBuZWFyIC8gKCB4bWF4IC0geG1pbiApO1xuXHRcdFx0XHRwcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzWyA4IF0gPSAoIHhtYXggKyB4bWluICkgLyAoIHhtYXggLSB4bWluICk7XG5cblx0XHRcdFx0dGhpcy5jYW1lcmFMLnByb2plY3Rpb25NYXRyaXguY29weSggcHJvamVjdGlvbk1hdHJpeCApO1xuXG5cdFx0XHRcdC8vIGZvciByaWdodCBleWVcblxuXHRcdFx0XHR4bWluID0gLSB5bWF4ICogYXNwZWN0IC0gZXllU2VwT25Qcm9qZWN0aW9uO1xuXHRcdFx0XHR4bWF4ID0geW1heCAqIGFzcGVjdCAtIGV5ZVNlcE9uUHJvamVjdGlvbjtcblxuXHRcdFx0XHRwcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzWyAwIF0gPSAyICogbmVhciAvICggeG1heCAtIHhtaW4gKTtcblx0XHRcdFx0cHJvamVjdGlvbk1hdHJpeC5lbGVtZW50c1sgOCBdID0gKCB4bWF4ICsgeG1pbiApIC8gKCB4bWF4IC0geG1pbiApO1xuXG5cdFx0XHRcdHRoaXMuY2FtZXJhUi5wcm9qZWN0aW9uTWF0cml4LmNvcHkoIHByb2plY3Rpb25NYXRyaXggKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmNhbWVyYUwubWF0cml4V29ybGQuY29weSggY2FtZXJhLm1hdHJpeFdvcmxkICkubXVsdGlwbHkoIGV5ZUxlZnQgKTtcblx0XHRcdHRoaXMuY2FtZXJhUi5tYXRyaXhXb3JsZC5jb3B5KCBjYW1lcmEubWF0cml4V29ybGQgKS5tdWx0aXBseSggZXllUmlnaHQgKTtcblxuXHRcdH07XG5cblx0fSApKClcblxufSApO1xuXG4vKipcbiAqIENhbWVyYSBmb3IgcmVuZGVyaW5nIGN1YmUgbWFwc1xuICpcdC0gcmVuZGVycyBzY2VuZSBpbnRvIGF4aXMtYWxpZ25lZCBjdWJlXG4gKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBDdWJlQ2FtZXJhKCBuZWFyLCBmYXIsIGN1YmVSZXNvbHV0aW9uICkge1xuXG5cdE9iamVjdDNELmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnQ3ViZUNhbWVyYSc7XG5cblx0dmFyIGZvdiA9IDkwLCBhc3BlY3QgPSAxO1xuXG5cdHZhciBjYW1lcmFQWCA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSggZm92LCBhc3BlY3QsIG5lYXIsIGZhciApO1xuXHRjYW1lcmFQWC51cC5zZXQoIDAsIC0gMSwgMCApO1xuXHRjYW1lcmFQWC5sb29rQXQoIG5ldyBWZWN0b3IzKCAxLCAwLCAwICkgKTtcblx0dGhpcy5hZGQoIGNhbWVyYVBYICk7XG5cblx0dmFyIGNhbWVyYU5YID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCBmb3YsIGFzcGVjdCwgbmVhciwgZmFyICk7XG5cdGNhbWVyYU5YLnVwLnNldCggMCwgLSAxLCAwICk7XG5cdGNhbWVyYU5YLmxvb2tBdCggbmV3IFZlY3RvcjMoIC0gMSwgMCwgMCApICk7XG5cdHRoaXMuYWRkKCBjYW1lcmFOWCApO1xuXG5cdHZhciBjYW1lcmFQWSA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSggZm92LCBhc3BlY3QsIG5lYXIsIGZhciApO1xuXHRjYW1lcmFQWS51cC5zZXQoIDAsIDAsIDEgKTtcblx0Y2FtZXJhUFkubG9va0F0KCBuZXcgVmVjdG9yMyggMCwgMSwgMCApICk7XG5cdHRoaXMuYWRkKCBjYW1lcmFQWSApO1xuXG5cdHZhciBjYW1lcmFOWSA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSggZm92LCBhc3BlY3QsIG5lYXIsIGZhciApO1xuXHRjYW1lcmFOWS51cC5zZXQoIDAsIDAsIC0gMSApO1xuXHRjYW1lcmFOWS5sb29rQXQoIG5ldyBWZWN0b3IzKCAwLCAtIDEsIDAgKSApO1xuXHR0aGlzLmFkZCggY2FtZXJhTlkgKTtcblxuXHR2YXIgY2FtZXJhUFogPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoIGZvdiwgYXNwZWN0LCBuZWFyLCBmYXIgKTtcblx0Y2FtZXJhUFoudXAuc2V0KCAwLCAtIDEsIDAgKTtcblx0Y2FtZXJhUFoubG9va0F0KCBuZXcgVmVjdG9yMyggMCwgMCwgMSApICk7XG5cdHRoaXMuYWRkKCBjYW1lcmFQWiApO1xuXG5cdHZhciBjYW1lcmFOWiA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSggZm92LCBhc3BlY3QsIG5lYXIsIGZhciApO1xuXHRjYW1lcmFOWi51cC5zZXQoIDAsIC0gMSwgMCApO1xuXHRjYW1lcmFOWi5sb29rQXQoIG5ldyBWZWN0b3IzKCAwLCAwLCAtIDEgKSApO1xuXHR0aGlzLmFkZCggY2FtZXJhTlogKTtcblxuXHR2YXIgb3B0aW9ucyA9IHsgZm9ybWF0OiBSR0JGb3JtYXQsIG1hZ0ZpbHRlcjogTGluZWFyRmlsdGVyLCBtaW5GaWx0ZXI6IExpbmVhckZpbHRlciB9O1xuXG5cdHRoaXMucmVuZGVyVGFyZ2V0ID0gbmV3IFdlYkdMUmVuZGVyVGFyZ2V0Q3ViZSggY3ViZVJlc29sdXRpb24sIGN1YmVSZXNvbHV0aW9uLCBvcHRpb25zICk7XG5cdHRoaXMucmVuZGVyVGFyZ2V0LnRleHR1cmUubmFtZSA9IFwiQ3ViZUNhbWVyYVwiO1xuXG5cdHRoaXMudXBkYXRlQ3ViZU1hcCA9IGZ1bmN0aW9uICggcmVuZGVyZXIsIHNjZW5lICkge1xuXG5cdFx0aWYgKCB0aGlzLnBhcmVudCA9PT0gbnVsbCApIHRoaXMudXBkYXRlTWF0cml4V29ybGQoKTtcblxuXHRcdHZhciByZW5kZXJUYXJnZXQgPSB0aGlzLnJlbmRlclRhcmdldDtcblx0XHR2YXIgZ2VuZXJhdGVNaXBtYXBzID0gcmVuZGVyVGFyZ2V0LnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzO1xuXG5cdFx0cmVuZGVyVGFyZ2V0LnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzID0gZmFsc2U7XG5cblx0XHRyZW5kZXJUYXJnZXQuYWN0aXZlQ3ViZUZhY2UgPSAwO1xuXHRcdHJlbmRlcmVyLnJlbmRlciggc2NlbmUsIGNhbWVyYVBYLCByZW5kZXJUYXJnZXQgKTtcblxuXHRcdHJlbmRlclRhcmdldC5hY3RpdmVDdWJlRmFjZSA9IDE7XG5cdFx0cmVuZGVyZXIucmVuZGVyKCBzY2VuZSwgY2FtZXJhTlgsIHJlbmRlclRhcmdldCApO1xuXG5cdFx0cmVuZGVyVGFyZ2V0LmFjdGl2ZUN1YmVGYWNlID0gMjtcblx0XHRyZW5kZXJlci5yZW5kZXIoIHNjZW5lLCBjYW1lcmFQWSwgcmVuZGVyVGFyZ2V0ICk7XG5cblx0XHRyZW5kZXJUYXJnZXQuYWN0aXZlQ3ViZUZhY2UgPSAzO1xuXHRcdHJlbmRlcmVyLnJlbmRlciggc2NlbmUsIGNhbWVyYU5ZLCByZW5kZXJUYXJnZXQgKTtcblxuXHRcdHJlbmRlclRhcmdldC5hY3RpdmVDdWJlRmFjZSA9IDQ7XG5cdFx0cmVuZGVyZXIucmVuZGVyKCBzY2VuZSwgY2FtZXJhUFosIHJlbmRlclRhcmdldCApO1xuXG5cdFx0cmVuZGVyVGFyZ2V0LnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzID0gZ2VuZXJhdGVNaXBtYXBzO1xuXG5cdFx0cmVuZGVyVGFyZ2V0LmFjdGl2ZUN1YmVGYWNlID0gNTtcblx0XHRyZW5kZXJlci5yZW5kZXIoIHNjZW5lLCBjYW1lcmFOWiwgcmVuZGVyVGFyZ2V0ICk7XG5cblx0XHRyZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoIG51bGwgKTtcblxuXHR9O1xuXG59XG5cbkN1YmVDYW1lcmEucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICk7XG5DdWJlQ2FtZXJhLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEN1YmVDYW1lcmE7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBBcnJheUNhbWVyYSggYXJyYXkgKSB7XG5cblx0UGVyc3BlY3RpdmVDYW1lcmEuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMuZW5hYmxlZCA9IGZhbHNlO1xuXHR0aGlzLmNhbWVyYXMgPSBhcnJheSB8fCBbXTtcblxufVxuXG5BcnJheUNhbWVyYS5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBQZXJzcGVjdGl2ZUNhbWVyYS5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBBcnJheUNhbWVyYSxcblxuXHRpc0FycmF5Q2FtZXJhOiB0cnVlXG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIEF1ZGlvTGlzdGVuZXIoKSB7XG5cblx0T2JqZWN0M0QuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdBdWRpb0xpc3RlbmVyJztcblxuXHR0aGlzLmNvbnRleHQgPSBBdWRpb0NvbnRleHQuZ2V0Q29udGV4dCgpO1xuXG5cdHRoaXMuZ2FpbiA9IHRoaXMuY29udGV4dC5jcmVhdGVHYWluKCk7XG5cdHRoaXMuZ2Fpbi5jb25uZWN0KCB0aGlzLmNvbnRleHQuZGVzdGluYXRpb24gKTtcblxuXHR0aGlzLmZpbHRlciA9IG51bGw7XG5cbn1cblxuQXVkaW9MaXN0ZW5lci5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBBdWRpb0xpc3RlbmVyLFxuXG5cdGdldElucHV0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5nYWluO1xuXG5cdH0sXG5cblx0cmVtb3ZlRmlsdGVyOiBmdW5jdGlvbiAoICkge1xuXG5cdFx0aWYgKCB0aGlzLmZpbHRlciAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5nYWluLmRpc2Nvbm5lY3QoIHRoaXMuZmlsdGVyICk7XG5cdFx0XHR0aGlzLmZpbHRlci5kaXNjb25uZWN0KCB0aGlzLmNvbnRleHQuZGVzdGluYXRpb24gKTtcblx0XHRcdHRoaXMuZ2Fpbi5jb25uZWN0KCB0aGlzLmNvbnRleHQuZGVzdGluYXRpb24gKTtcblx0XHRcdHRoaXMuZmlsdGVyID0gbnVsbDtcblxuXHRcdH1cblxuXHR9LFxuXG5cdGdldEZpbHRlcjogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZmlsdGVyO1xuXG5cdH0sXG5cblx0c2V0RmlsdGVyOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0aWYgKCB0aGlzLmZpbHRlciAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5nYWluLmRpc2Nvbm5lY3QoIHRoaXMuZmlsdGVyICk7XG5cdFx0XHR0aGlzLmZpbHRlci5kaXNjb25uZWN0KCB0aGlzLmNvbnRleHQuZGVzdGluYXRpb24gKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHRoaXMuZ2Fpbi5kaXNjb25uZWN0KCB0aGlzLmNvbnRleHQuZGVzdGluYXRpb24gKTtcblxuXHRcdH1cblxuXHRcdHRoaXMuZmlsdGVyID0gdmFsdWU7XG5cdFx0dGhpcy5nYWluLmNvbm5lY3QoIHRoaXMuZmlsdGVyICk7XG5cdFx0dGhpcy5maWx0ZXIuY29ubmVjdCggdGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uICk7XG5cblx0fSxcblxuXHRnZXRNYXN0ZXJWb2x1bWU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLmdhaW4uZ2Fpbi52YWx1ZTtcblxuXHR9LFxuXG5cdHNldE1hc3RlclZvbHVtZTogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMuZ2Fpbi5nYWluLnZhbHVlID0gdmFsdWU7XG5cblx0fSxcblxuXHR1cGRhdGVNYXRyaXhXb3JsZDogKCBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgcG9zaXRpb24gPSBuZXcgVmVjdG9yMygpO1xuXHRcdHZhciBxdWF0ZXJuaW9uID0gbmV3IFF1YXRlcm5pb24oKTtcblx0XHR2YXIgc2NhbGUgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0dmFyIG9yaWVudGF0aW9uID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdHJldHVybiBmdW5jdGlvbiB1cGRhdGVNYXRyaXhXb3JsZCggZm9yY2UgKSB7XG5cblx0XHRcdE9iamVjdDNELnByb3RvdHlwZS51cGRhdGVNYXRyaXhXb3JsZC5jYWxsKCB0aGlzLCBmb3JjZSApO1xuXG5cdFx0XHR2YXIgbGlzdGVuZXIgPSB0aGlzLmNvbnRleHQubGlzdGVuZXI7XG5cdFx0XHR2YXIgdXAgPSB0aGlzLnVwO1xuXG5cdFx0XHR0aGlzLm1hdHJpeFdvcmxkLmRlY29tcG9zZSggcG9zaXRpb24sIHF1YXRlcm5pb24sIHNjYWxlICk7XG5cblx0XHRcdG9yaWVudGF0aW9uLnNldCggMCwgMCwgLSAxICkuYXBwbHlRdWF0ZXJuaW9uKCBxdWF0ZXJuaW9uICk7XG5cblx0XHRcdGlmICggbGlzdGVuZXIucG9zaXRpb25YICkge1xuXG5cdFx0XHRcdGxpc3RlbmVyLnBvc2l0aW9uWC5zZXRWYWx1ZUF0VGltZSggcG9zaXRpb24ueCwgdGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lICk7XG5cdFx0XHRcdGxpc3RlbmVyLnBvc2l0aW9uWS5zZXRWYWx1ZUF0VGltZSggcG9zaXRpb24ueSwgdGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lICk7XG5cdFx0XHRcdGxpc3RlbmVyLnBvc2l0aW9uWi5zZXRWYWx1ZUF0VGltZSggcG9zaXRpb24ueiwgdGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lICk7XG5cdFx0XHRcdGxpc3RlbmVyLmZvcndhcmRYLnNldFZhbHVlQXRUaW1lKCBvcmllbnRhdGlvbi54LCB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUgKTtcblx0XHRcdFx0bGlzdGVuZXIuZm9yd2FyZFkuc2V0VmFsdWVBdFRpbWUoIG9yaWVudGF0aW9uLnksIHRoaXMuY29udGV4dC5jdXJyZW50VGltZSApO1xuXHRcdFx0XHRsaXN0ZW5lci5mb3J3YXJkWi5zZXRWYWx1ZUF0VGltZSggb3JpZW50YXRpb24ueiwgdGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lICk7XG5cdFx0XHRcdGxpc3RlbmVyLnVwWC5zZXRWYWx1ZUF0VGltZSggdXAueCwgdGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lICk7XG5cdFx0XHRcdGxpc3RlbmVyLnVwWS5zZXRWYWx1ZUF0VGltZSggdXAueSwgdGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lICk7XG5cdFx0XHRcdGxpc3RlbmVyLnVwWi5zZXRWYWx1ZUF0VGltZSggdXAueiwgdGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0bGlzdGVuZXIuc2V0UG9zaXRpb24oIHBvc2l0aW9uLngsIHBvc2l0aW9uLnksIHBvc2l0aW9uLnogKTtcblx0XHRcdFx0bGlzdGVuZXIuc2V0T3JpZW50YXRpb24oIG9yaWVudGF0aW9uLngsIG9yaWVudGF0aW9uLnksIG9yaWVudGF0aW9uLnosIHVwLngsIHVwLnksIHVwLnogKTtcblxuXHRcdFx0fVxuXG5cdFx0fTtcblxuXHR9ICkoKVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgUmVlY2UgQWFyb24gTGVjcml2YWluIC8gaHR0cDovL3JlZWNlbm90ZXMuY29tL1xuICovXG5cbmZ1bmN0aW9uIEF1ZGlvKCBsaXN0ZW5lciApIHtcblxuXHRPYmplY3QzRC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0F1ZGlvJztcblxuXHR0aGlzLmNvbnRleHQgPSBsaXN0ZW5lci5jb250ZXh0O1xuXG5cdHRoaXMuZ2FpbiA9IHRoaXMuY29udGV4dC5jcmVhdGVHYWluKCk7XG5cdHRoaXMuZ2Fpbi5jb25uZWN0KCBsaXN0ZW5lci5nZXRJbnB1dCgpICk7XG5cblx0dGhpcy5hdXRvcGxheSA9IGZhbHNlO1xuXG5cdHRoaXMuYnVmZmVyID0gbnVsbDtcblx0dGhpcy5sb29wID0gZmFsc2U7XG5cdHRoaXMuc3RhcnRUaW1lID0gMDtcblx0dGhpcy5wbGF5YmFja1JhdGUgPSAxO1xuXHR0aGlzLmlzUGxheWluZyA9IGZhbHNlO1xuXHR0aGlzLmhhc1BsYXliYWNrQ29udHJvbCA9IHRydWU7XG5cdHRoaXMuc291cmNlVHlwZSA9ICdlbXB0eSc7XG5cblx0dGhpcy5maWx0ZXJzID0gW107XG5cbn1cblxuQXVkaW8ucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogQXVkaW8sXG5cblx0Z2V0T3V0cHV0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5nYWluO1xuXG5cdH0sXG5cblx0c2V0Tm9kZVNvdXJjZTogZnVuY3Rpb24gKCBhdWRpb05vZGUgKSB7XG5cblx0XHR0aGlzLmhhc1BsYXliYWNrQ29udHJvbCA9IGZhbHNlO1xuXHRcdHRoaXMuc291cmNlVHlwZSA9ICdhdWRpb05vZGUnO1xuXHRcdHRoaXMuc291cmNlID0gYXVkaW9Ob2RlO1xuXHRcdHRoaXMuY29ubmVjdCgpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRCdWZmZXI6IGZ1bmN0aW9uICggYXVkaW9CdWZmZXIgKSB7XG5cblx0XHR0aGlzLmJ1ZmZlciA9IGF1ZGlvQnVmZmVyO1xuXHRcdHRoaXMuc291cmNlVHlwZSA9ICdidWZmZXInO1xuXG5cdFx0aWYgKCB0aGlzLmF1dG9wbGF5ICkgdGhpcy5wbGF5KCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHBsYXk6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGlmICggdGhpcy5pc1BsYXlpbmcgPT09IHRydWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkF1ZGlvOiBBdWRpbyBpcyBhbHJlYWR5IHBsYXlpbmcuJyApO1xuXHRcdFx0cmV0dXJuO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLmhhc1BsYXliYWNrQ29udHJvbCA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLicgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdHZhciBzb3VyY2UgPSB0aGlzLmNvbnRleHQuY3JlYXRlQnVmZmVyU291cmNlKCk7XG5cblx0XHRzb3VyY2UuYnVmZmVyID0gdGhpcy5idWZmZXI7XG5cdFx0c291cmNlLmxvb3AgPSB0aGlzLmxvb3A7XG5cdFx0c291cmNlLm9uZW5kZWQgPSB0aGlzLm9uRW5kZWQuYmluZCggdGhpcyApO1xuXHRcdHNvdXJjZS5wbGF5YmFja1JhdGUuc2V0VmFsdWVBdFRpbWUoIHRoaXMucGxheWJhY2tSYXRlLCB0aGlzLnN0YXJ0VGltZSApO1xuXHRcdHNvdXJjZS5zdGFydCggMCwgdGhpcy5zdGFydFRpbWUgKTtcblxuXHRcdHRoaXMuaXNQbGF5aW5nID0gdHJ1ZTtcblxuXHRcdHRoaXMuc291cmNlID0gc291cmNlO1xuXG5cdFx0cmV0dXJuIHRoaXMuY29ubmVjdCgpO1xuXG5cdH0sXG5cblx0cGF1c2U6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGlmICggdGhpcy5oYXNQbGF5YmFja0NvbnRyb2wgPT09IGZhbHNlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5BdWRpbzogdGhpcyBBdWRpbyBoYXMgbm8gcGxheWJhY2sgY29udHJvbC4nICk7XG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHR0aGlzLnNvdXJjZS5zdG9wKCk7XG5cdFx0dGhpcy5zdGFydFRpbWUgPSB0aGlzLmNvbnRleHQuY3VycmVudFRpbWU7XG5cdFx0dGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c3RvcDogZnVuY3Rpb24gKCkge1xuXG5cdFx0aWYgKCB0aGlzLmhhc1BsYXliYWNrQ29udHJvbCA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLicgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdHRoaXMuc291cmNlLnN0b3AoKTtcblx0XHR0aGlzLnN0YXJ0VGltZSA9IDA7XG5cdFx0dGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y29ubmVjdDogZnVuY3Rpb24gKCkge1xuXG5cdFx0aWYgKCB0aGlzLmZpbHRlcnMubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0dGhpcy5zb3VyY2UuY29ubmVjdCggdGhpcy5maWx0ZXJzWyAwIF0gKTtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAxLCBsID0gdGhpcy5maWx0ZXJzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0dGhpcy5maWx0ZXJzWyBpIC0gMSBdLmNvbm5lY3QoIHRoaXMuZmlsdGVyc1sgaSBdICk7XG5cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5maWx0ZXJzWyB0aGlzLmZpbHRlcnMubGVuZ3RoIC0gMSBdLmNvbm5lY3QoIHRoaXMuZ2V0T3V0cHV0KCkgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHRoaXMuc291cmNlLmNvbm5lY3QoIHRoaXMuZ2V0T3V0cHV0KCkgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZGlzY29ubmVjdDogZnVuY3Rpb24gKCkge1xuXG5cdFx0aWYgKCB0aGlzLmZpbHRlcnMubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0dGhpcy5zb3VyY2UuZGlzY29ubmVjdCggdGhpcy5maWx0ZXJzWyAwIF0gKTtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAxLCBsID0gdGhpcy5maWx0ZXJzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0dGhpcy5maWx0ZXJzWyBpIC0gMSBdLmRpc2Nvbm5lY3QoIHRoaXMuZmlsdGVyc1sgaSBdICk7XG5cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5maWx0ZXJzWyB0aGlzLmZpbHRlcnMubGVuZ3RoIC0gMSBdLmRpc2Nvbm5lY3QoIHRoaXMuZ2V0T3V0cHV0KCkgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHRoaXMuc291cmNlLmRpc2Nvbm5lY3QoIHRoaXMuZ2V0T3V0cHV0KCkgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Z2V0RmlsdGVyczogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZmlsdGVycztcblxuXHR9LFxuXG5cdHNldEZpbHRlcnM6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRpZiAoICEgdmFsdWUgKSB2YWx1ZSA9IFtdO1xuXG5cdFx0aWYgKCB0aGlzLmlzUGxheWluZyA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0dGhpcy5kaXNjb25uZWN0KCk7XG5cdFx0XHR0aGlzLmZpbHRlcnMgPSB2YWx1ZTtcblx0XHRcdHRoaXMuY29ubmVjdCgpO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dGhpcy5maWx0ZXJzID0gdmFsdWU7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGdldEZpbHRlcjogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZ2V0RmlsdGVycygpWyAwIF07XG5cblx0fSxcblxuXHRzZXRGaWx0ZXI6IGZ1bmN0aW9uICggZmlsdGVyICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuc2V0RmlsdGVycyggZmlsdGVyID8gWyBmaWx0ZXIgXSA6IFtdICk7XG5cblx0fSxcblxuXHRzZXRQbGF5YmFja1JhdGU6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRpZiAoIHRoaXMuaGFzUGxheWJhY2tDb250cm9sID09PSBmYWxzZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQXVkaW86IHRoaXMgQXVkaW8gaGFzIG5vIHBsYXliYWNrIGNvbnRyb2wuJyApO1xuXHRcdFx0cmV0dXJuO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5wbGF5YmFja1JhdGUgPSB2YWx1ZTtcblxuXHRcdGlmICggdGhpcy5pc1BsYXlpbmcgPT09IHRydWUgKSB7XG5cblx0XHRcdHRoaXMuc291cmNlLnBsYXliYWNrUmF0ZS5zZXRWYWx1ZUF0VGltZSggdGhpcy5wbGF5YmFja1JhdGUsIHRoaXMuY29udGV4dC5jdXJyZW50VGltZSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRnZXRQbGF5YmFja1JhdGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLnBsYXliYWNrUmF0ZTtcblxuXHR9LFxuXG5cdG9uRW5kZWQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XG5cblx0fSxcblxuXHRnZXRMb29wOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRpZiAoIHRoaXMuaGFzUGxheWJhY2tDb250cm9sID09PSBmYWxzZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQXVkaW86IHRoaXMgQXVkaW8gaGFzIG5vIHBsYXliYWNrIGNvbnRyb2wuJyApO1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMubG9vcDtcblxuXHR9LFxuXG5cdHNldExvb3A6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRpZiAoIHRoaXMuaGFzUGxheWJhY2tDb250cm9sID09PSBmYWxzZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQXVkaW86IHRoaXMgQXVkaW8gaGFzIG5vIHBsYXliYWNrIGNvbnRyb2wuJyApO1xuXHRcdFx0cmV0dXJuO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5sb29wID0gdmFsdWU7XG5cblx0XHRpZiAoIHRoaXMuaXNQbGF5aW5nID09PSB0cnVlICkge1xuXG5cdFx0XHR0aGlzLnNvdXJjZS5sb29wID0gdGhpcy5sb29wO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRnZXRWb2x1bWU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLmdhaW4uZ2Fpbi52YWx1ZTtcblxuXHR9LFxuXHRcblx0c2V0Vm9sdW1lOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5nYWluLmdhaW4udmFsdWUgPSB2YWx1ZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gUG9zaXRpb25hbEF1ZGlvKCBsaXN0ZW5lciApIHtcblxuXHRBdWRpby5jYWxsKCB0aGlzLCBsaXN0ZW5lciApO1xuXG5cdHRoaXMucGFubmVyID0gdGhpcy5jb250ZXh0LmNyZWF0ZVBhbm5lcigpO1xuXHR0aGlzLnBhbm5lci5jb25uZWN0KCB0aGlzLmdhaW4gKTtcblxufVxuXG5Qb3NpdGlvbmFsQXVkaW8ucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggQXVkaW8ucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogUG9zaXRpb25hbEF1ZGlvLFxuXG5cdGdldE91dHB1dDogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMucGFubmVyO1xuXG5cdH0sXG5cblx0Z2V0UmVmRGlzdGFuY2U6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLnBhbm5lci5yZWZEaXN0YW5jZTtcblxuXHR9LFxuXG5cdHNldFJlZkRpc3RhbmNlOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5wYW5uZXIucmVmRGlzdGFuY2UgPSB2YWx1ZTtcblxuXHR9LFxuXG5cdGdldFJvbGxvZmZGYWN0b3I6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLnBhbm5lci5yb2xsb2ZmRmFjdG9yO1xuXG5cdH0sXG5cblx0c2V0Um9sbG9mZkZhY3RvcjogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMucGFubmVyLnJvbGxvZmZGYWN0b3IgPSB2YWx1ZTtcblxuXHR9LFxuXG5cdGdldERpc3RhbmNlTW9kZWw6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLnBhbm5lci5kaXN0YW5jZU1vZGVsO1xuXG5cdH0sXG5cblx0c2V0RGlzdGFuY2VNb2RlbDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMucGFubmVyLmRpc3RhbmNlTW9kZWwgPSB2YWx1ZTtcblxuXHR9LFxuXG5cdGdldE1heERpc3RhbmNlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5wYW5uZXIubWF4RGlzdGFuY2U7XG5cblx0fSxcblxuXHRzZXRNYXhEaXN0YW5jZTogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMucGFubmVyLm1heERpc3RhbmNlID0gdmFsdWU7XG5cblx0fSxcblxuXHR1cGRhdGVNYXRyaXhXb3JsZDogKCBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgcG9zaXRpb24gPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0cmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZU1hdHJpeFdvcmxkKCBmb3JjZSApIHtcblxuXHRcdFx0T2JqZWN0M0QucHJvdG90eXBlLnVwZGF0ZU1hdHJpeFdvcmxkLmNhbGwoIHRoaXMsIGZvcmNlICk7XG5cblx0XHRcdHBvc2l0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbiggdGhpcy5tYXRyaXhXb3JsZCApO1xuXG5cdFx0XHR0aGlzLnBhbm5lci5zZXRQb3NpdGlvbiggcG9zaXRpb24ueCwgcG9zaXRpb24ueSwgcG9zaXRpb24ueiApO1xuXG5cdFx0fTtcblxuXHR9ICkoKVxuXG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIEF1ZGlvQW5hbHlzZXIoIGF1ZGlvLCBmZnRTaXplICkge1xuXG5cdHRoaXMuYW5hbHlzZXIgPSBhdWRpby5jb250ZXh0LmNyZWF0ZUFuYWx5c2VyKCk7XG5cdHRoaXMuYW5hbHlzZXIuZmZ0U2l6ZSA9IGZmdFNpemUgIT09IHVuZGVmaW5lZCA/IGZmdFNpemUgOiAyMDQ4O1xuXG5cdHRoaXMuZGF0YSA9IG5ldyBVaW50OEFycmF5KCB0aGlzLmFuYWx5c2VyLmZyZXF1ZW5jeUJpbkNvdW50ICk7XG5cblx0YXVkaW8uZ2V0T3V0cHV0KCkuY29ubmVjdCggdGhpcy5hbmFseXNlciApO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIEF1ZGlvQW5hbHlzZXIucHJvdG90eXBlLCB7XG5cblx0Z2V0RnJlcXVlbmN5RGF0YTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5hbmFseXNlci5nZXRCeXRlRnJlcXVlbmN5RGF0YSggdGhpcy5kYXRhICk7XG5cblx0XHRyZXR1cm4gdGhpcy5kYXRhO1xuXG5cdH0sXG5cblx0Z2V0QXZlcmFnZUZyZXF1ZW5jeTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHZhbHVlID0gMCwgZGF0YSA9IHRoaXMuZ2V0RnJlcXVlbmN5RGF0YSgpO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdHZhbHVlICs9IGRhdGFbIGkgXTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB2YWx1ZSAvIGRhdGEubGVuZ3RoO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqXG4gKiBCdWZmZXJlZCBzY2VuZSBncmFwaCBwcm9wZXJ0eSB0aGF0IGFsbG93cyB3ZWlnaHRlZCBhY2N1bXVsYXRpb24uXG4gKlxuICpcbiAqIEBhdXRob3IgQmVuIEhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8vXG4gKiBAYXV0aG9yIERhdmlkIFNhcm5vIC8gaHR0cDovL2xpZ2h0aGF1cy51cy9cbiAqIEBhdXRob3IgdHNjaHdcbiAqL1xuXG5mdW5jdGlvbiBQcm9wZXJ0eU1peGVyKCBiaW5kaW5nLCB0eXBlTmFtZSwgdmFsdWVTaXplICkge1xuXG5cdHRoaXMuYmluZGluZyA9IGJpbmRpbmc7XG5cdHRoaXMudmFsdWVTaXplID0gdmFsdWVTaXplO1xuXG5cdHZhciBidWZmZXJUeXBlID0gRmxvYXQ2NEFycmF5LFxuXHRcdG1peEZ1bmN0aW9uO1xuXG5cdHN3aXRjaCAoIHR5cGVOYW1lICkge1xuXG5cdFx0Y2FzZSAncXVhdGVybmlvbic6XG5cdFx0XHRtaXhGdW5jdGlvbiA9IHRoaXMuX3NsZXJwO1xuXHRcdFx0YnJlYWs7XG5cblx0XHRjYXNlICdzdHJpbmcnOlxuXHRcdGNhc2UgJ2Jvb2wnOlxuXHRcdFx0YnVmZmVyVHlwZSA9IEFycmF5O1xuXHRcdFx0bWl4RnVuY3Rpb24gPSB0aGlzLl9zZWxlY3Q7XG5cdFx0XHRicmVhaztcblxuXHRcdGRlZmF1bHQ6XG5cdFx0XHRtaXhGdW5jdGlvbiA9IHRoaXMuX2xlcnA7XG5cblx0fVxuXG5cdHRoaXMuYnVmZmVyID0gbmV3IGJ1ZmZlclR5cGUoIHZhbHVlU2l6ZSAqIDQgKTtcblx0Ly8gbGF5b3V0OiBbIGluY29taW5nIHwgYWNjdTAgfCBhY2N1MSB8IG9yaWcgXVxuXHQvL1xuXHQvLyBpbnRlcnBvbGF0b3JzIGNhbiB1c2UgLmJ1ZmZlciBhcyB0aGVpciAucmVzdWx0XG5cdC8vIHRoZSBkYXRhIHRoZW4gZ29lcyB0byAnaW5jb21pbmcnXG5cdC8vXG5cdC8vICdhY2N1MCcgYW5kICdhY2N1MScgYXJlIHVzZWQgZnJhbWUtaW50ZXJsZWF2ZWQgZm9yXG5cdC8vIHRoZSBjdW11bGF0aXZlIHJlc3VsdCBhbmQgYXJlIGNvbXBhcmVkIHRvIGRldGVjdFxuXHQvLyBjaGFuZ2VzXG5cdC8vXG5cdC8vICdvcmlnJyBzdG9yZXMgdGhlIG9yaWdpbmFsIHN0YXRlIG9mIHRoZSBwcm9wZXJ0eVxuXG5cdHRoaXMuX21peEJ1ZmZlclJlZ2lvbiA9IG1peEZ1bmN0aW9uO1xuXG5cdHRoaXMuY3VtdWxhdGl2ZVdlaWdodCA9IDA7XG5cblx0dGhpcy51c2VDb3VudCA9IDA7XG5cdHRoaXMucmVmZXJlbmNlQ291bnQgPSAwO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIFByb3BlcnR5TWl4ZXIucHJvdG90eXBlLCB7XG5cblx0Ly8gYWNjdW11bGF0ZSBkYXRhIGluIHRoZSAnaW5jb21pbmcnIHJlZ2lvbiBpbnRvICdhY2N1PGk+J1xuXHRhY2N1bXVsYXRlOiBmdW5jdGlvbiAoIGFjY3VJbmRleCwgd2VpZ2h0ICkge1xuXG5cdFx0Ly8gbm90ZTogaGFwcGlseSBhY2N1bXVsYXRpbmcgbm90aGluZyB3aGVuIHdlaWdodCA9IDAsIHRoZSBjYWxsZXIga25vd3Ncblx0XHQvLyB0aGUgd2VpZ2h0IGFuZCBzaG91bGRuJ3QgaGF2ZSBtYWRlIHRoZSBjYWxsIGluIHRoZSBmaXJzdCBwbGFjZVxuXG5cdFx0dmFyIGJ1ZmZlciA9IHRoaXMuYnVmZmVyLFxuXHRcdFx0c3RyaWRlID0gdGhpcy52YWx1ZVNpemUsXG5cdFx0XHRvZmZzZXQgPSBhY2N1SW5kZXggKiBzdHJpZGUgKyBzdHJpZGUsXG5cblx0XHRcdGN1cnJlbnRXZWlnaHQgPSB0aGlzLmN1bXVsYXRpdmVXZWlnaHQ7XG5cblx0XHRpZiAoIGN1cnJlbnRXZWlnaHQgPT09IDAgKSB7XG5cblx0XHRcdC8vIGFjY3VOIDo9IGluY29taW5nICogd2VpZ2h0XG5cblx0XHRcdGZvciAoIHZhciBpID0gMDsgaSAhPT0gc3RyaWRlOyArKyBpICkge1xuXG5cdFx0XHRcdGJ1ZmZlclsgb2Zmc2V0ICsgaSBdID0gYnVmZmVyWyBpIF07XG5cblx0XHRcdH1cblxuXHRcdFx0Y3VycmVudFdlaWdodCA9IHdlaWdodDtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIGFjY3VOIDo9IGFjY3VOICsgaW5jb21pbmcgKiB3ZWlnaHRcblxuXHRcdFx0Y3VycmVudFdlaWdodCArPSB3ZWlnaHQ7XG5cdFx0XHR2YXIgbWl4ID0gd2VpZ2h0IC8gY3VycmVudFdlaWdodDtcblx0XHRcdHRoaXMuX21peEJ1ZmZlclJlZ2lvbiggYnVmZmVyLCBvZmZzZXQsIDAsIG1peCwgc3RyaWRlICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLmN1bXVsYXRpdmVXZWlnaHQgPSBjdXJyZW50V2VpZ2h0O1xuXG5cdH0sXG5cblx0Ly8gYXBwbHkgdGhlIHN0YXRlIG9mICdhY2N1PGk+JyB0byB0aGUgYmluZGluZyB3aGVuIGFjY3VzIGRpZmZlclxuXHRhcHBseTogZnVuY3Rpb24gKCBhY2N1SW5kZXggKSB7XG5cblx0XHR2YXIgc3RyaWRlID0gdGhpcy52YWx1ZVNpemUsXG5cdFx0XHRidWZmZXIgPSB0aGlzLmJ1ZmZlcixcblx0XHRcdG9mZnNldCA9IGFjY3VJbmRleCAqIHN0cmlkZSArIHN0cmlkZSxcblxuXHRcdFx0d2VpZ2h0ID0gdGhpcy5jdW11bGF0aXZlV2VpZ2h0LFxuXG5cdFx0XHRiaW5kaW5nID0gdGhpcy5iaW5kaW5nO1xuXG5cdFx0dGhpcy5jdW11bGF0aXZlV2VpZ2h0ID0gMDtcblxuXHRcdGlmICggd2VpZ2h0IDwgMSApIHtcblxuXHRcdFx0Ly8gYWNjdU4gOj0gYWNjdU4gKyBvcmlnaW5hbCAqICggMSAtIGN1bXVsYXRpdmVXZWlnaHQgKVxuXG5cdFx0XHR2YXIgb3JpZ2luYWxWYWx1ZU9mZnNldCA9IHN0cmlkZSAqIDM7XG5cblx0XHRcdHRoaXMuX21peEJ1ZmZlclJlZ2lvbihcblx0XHRcdFx0YnVmZmVyLCBvZmZzZXQsIG9yaWdpbmFsVmFsdWVPZmZzZXQsIDEgLSB3ZWlnaHQsIHN0cmlkZSApO1xuXG5cdFx0fVxuXG5cdFx0Zm9yICggdmFyIGkgPSBzdHJpZGUsIGUgPSBzdHJpZGUgKyBzdHJpZGU7IGkgIT09IGU7ICsrIGkgKSB7XG5cblx0XHRcdGlmICggYnVmZmVyWyBpIF0gIT09IGJ1ZmZlclsgaSArIHN0cmlkZSBdICkge1xuXG5cdFx0XHRcdC8vIHZhbHVlIGhhcyBjaGFuZ2VkIC0+IHVwZGF0ZSBzY2VuZSBncmFwaFxuXG5cdFx0XHRcdGJpbmRpbmcuc2V0VmFsdWUoIGJ1ZmZlciwgb2Zmc2V0ICk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fSxcblxuXHQvLyByZW1lbWJlciB0aGUgc3RhdGUgb2YgdGhlIGJvdW5kIHByb3BlcnR5IGFuZCBjb3B5IGl0IHRvIGJvdGggYWNjdXNcblx0c2F2ZU9yaWdpbmFsU3RhdGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBiaW5kaW5nID0gdGhpcy5iaW5kaW5nO1xuXG5cdFx0dmFyIGJ1ZmZlciA9IHRoaXMuYnVmZmVyLFxuXHRcdFx0c3RyaWRlID0gdGhpcy52YWx1ZVNpemUsXG5cblx0XHRcdG9yaWdpbmFsVmFsdWVPZmZzZXQgPSBzdHJpZGUgKiAzO1xuXG5cdFx0YmluZGluZy5nZXRWYWx1ZSggYnVmZmVyLCBvcmlnaW5hbFZhbHVlT2Zmc2V0ICk7XG5cblx0XHQvLyBhY2N1WzAuLjFdIDo9IG9yaWcgLS0gaW5pdGlhbGx5IGRldGVjdCBjaGFuZ2VzIGFnYWluc3QgdGhlIG9yaWdpbmFsXG5cdFx0Zm9yICggdmFyIGkgPSBzdHJpZGUsIGUgPSBvcmlnaW5hbFZhbHVlT2Zmc2V0OyBpICE9PSBlOyArKyBpICkge1xuXG5cdFx0XHRidWZmZXJbIGkgXSA9IGJ1ZmZlclsgb3JpZ2luYWxWYWx1ZU9mZnNldCArICggaSAlIHN0cmlkZSApIF07XG5cblx0XHR9XG5cblx0XHR0aGlzLmN1bXVsYXRpdmVXZWlnaHQgPSAwO1xuXG5cdH0sXG5cblx0Ly8gYXBwbHkgdGhlIHN0YXRlIHByZXZpb3VzbHkgdGFrZW4gdmlhICdzYXZlT3JpZ2luYWxTdGF0ZScgdG8gdGhlIGJpbmRpbmdcblx0cmVzdG9yZU9yaWdpbmFsU3RhdGU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBvcmlnaW5hbFZhbHVlT2Zmc2V0ID0gdGhpcy52YWx1ZVNpemUgKiAzO1xuXHRcdHRoaXMuYmluZGluZy5zZXRWYWx1ZSggdGhpcy5idWZmZXIsIG9yaWdpbmFsVmFsdWVPZmZzZXQgKTtcblxuXHR9LFxuXG5cblx0Ly8gbWl4IGZ1bmN0aW9uc1xuXG5cdF9zZWxlY3Q6IGZ1bmN0aW9uICggYnVmZmVyLCBkc3RPZmZzZXQsIHNyY09mZnNldCwgdCwgc3RyaWRlICkge1xuXG5cdFx0aWYgKCB0ID49IDAuNSApIHtcblxuXHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpICE9PSBzdHJpZGU7ICsrIGkgKSB7XG5cblx0XHRcdFx0YnVmZmVyWyBkc3RPZmZzZXQgKyBpIF0gPSBidWZmZXJbIHNyY09mZnNldCArIGkgXTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH0sXG5cblx0X3NsZXJwOiBmdW5jdGlvbiAoIGJ1ZmZlciwgZHN0T2Zmc2V0LCBzcmNPZmZzZXQsIHQgKSB7XG5cblx0XHRRdWF0ZXJuaW9uLnNsZXJwRmxhdCggYnVmZmVyLCBkc3RPZmZzZXQsIGJ1ZmZlciwgZHN0T2Zmc2V0LCBidWZmZXIsIHNyY09mZnNldCwgdCApO1xuXG5cdH0sXG5cblx0X2xlcnA6IGZ1bmN0aW9uICggYnVmZmVyLCBkc3RPZmZzZXQsIHNyY09mZnNldCwgdCwgc3RyaWRlICkge1xuXG5cdFx0dmFyIHMgPSAxIC0gdDtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSAhPT0gc3RyaWRlOyArKyBpICkge1xuXG5cdFx0XHR2YXIgaiA9IGRzdE9mZnNldCArIGk7XG5cblx0XHRcdGJ1ZmZlclsgaiBdID0gYnVmZmVyWyBqIF0gKiBzICsgYnVmZmVyWyBzcmNPZmZzZXQgKyBpIF0gKiB0O1xuXG5cdFx0fVxuXG5cdH1cblxufSApO1xuXG4vKipcbiAqXG4gKiBBIHJlZmVyZW5jZSB0byBhIHJlYWwgcHJvcGVydHkgaW4gdGhlIHNjZW5lIGdyYXBoLlxuICpcbiAqXG4gKiBAYXV0aG9yIEJlbiBIb3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvL1xuICogQGF1dGhvciBEYXZpZCBTYXJubyAvIGh0dHA6Ly9saWdodGhhdXMudXMvXG4gKiBAYXV0aG9yIHRzY2h3XG4gKi9cblxuZnVuY3Rpb24gQ29tcG9zaXRlKCB0YXJnZXRHcm91cCwgcGF0aCwgb3B0aW9uYWxQYXJzZWRQYXRoICkge1xuXG5cdHZhciBwYXJzZWRQYXRoID0gb3B0aW9uYWxQYXJzZWRQYXRoIHx8IFByb3BlcnR5QmluZGluZy5wYXJzZVRyYWNrTmFtZSggcGF0aCApO1xuXG5cdHRoaXMuX3RhcmdldEdyb3VwID0gdGFyZ2V0R3JvdXA7XG5cdHRoaXMuX2JpbmRpbmdzID0gdGFyZ2V0R3JvdXAuc3Vic2NyaWJlXyggcGF0aCwgcGFyc2VkUGF0aCApO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIENvbXBvc2l0ZS5wcm90b3R5cGUsIHtcblxuXHRnZXRWYWx1ZTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0dGhpcy5iaW5kKCk7IC8vIGJpbmQgYWxsIGJpbmRpbmdcblxuXHRcdHZhciBmaXJzdFZhbGlkSW5kZXggPSB0aGlzLl90YXJnZXRHcm91cC5uQ2FjaGVkT2JqZWN0c18sXG5cdFx0XHRiaW5kaW5nID0gdGhpcy5fYmluZGluZ3NbIGZpcnN0VmFsaWRJbmRleCBdO1xuXG5cdFx0Ly8gYW5kIG9ubHkgY2FsbCAuZ2V0VmFsdWUgb24gdGhlIGZpcnN0XG5cdFx0aWYgKCBiaW5kaW5nICE9PSB1bmRlZmluZWQgKSBiaW5kaW5nLmdldFZhbHVlKCBhcnJheSwgb2Zmc2V0ICk7XG5cblx0fSxcblxuXHRzZXRWYWx1ZTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0dmFyIGJpbmRpbmdzID0gdGhpcy5fYmluZGluZ3M7XG5cblx0XHRmb3IgKCB2YXIgaSA9IHRoaXMuX3RhcmdldEdyb3VwLm5DYWNoZWRPYmplY3RzXyxcblx0XHRcdFx0ICBuID0gYmluZGluZ3MubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHRiaW5kaW5nc1sgaSBdLnNldFZhbHVlKCBhcnJheSwgb2Zmc2V0ICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHRiaW5kOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgYmluZGluZ3MgPSB0aGlzLl9iaW5kaW5ncztcblxuXHRcdGZvciAoIHZhciBpID0gdGhpcy5fdGFyZ2V0R3JvdXAubkNhY2hlZE9iamVjdHNfLFxuXHRcdFx0XHQgIG4gPSBiaW5kaW5ncy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRcdGJpbmRpbmdzWyBpIF0uYmluZCgpO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0dW5iaW5kOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgYmluZGluZ3MgPSB0aGlzLl9iaW5kaW5ncztcblxuXHRcdGZvciAoIHZhciBpID0gdGhpcy5fdGFyZ2V0R3JvdXAubkNhY2hlZE9iamVjdHNfLFxuXHRcdFx0XHQgIG4gPSBiaW5kaW5ncy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRcdGJpbmRpbmdzWyBpIF0udW5iaW5kKCk7XG5cblx0XHR9XG5cblx0fVxuXG59ICk7XG5cblxuZnVuY3Rpb24gUHJvcGVydHlCaW5kaW5nKCByb290Tm9kZSwgcGF0aCwgcGFyc2VkUGF0aCApIHtcblxuXHR0aGlzLnBhdGggPSBwYXRoO1xuXHR0aGlzLnBhcnNlZFBhdGggPSBwYXJzZWRQYXRoIHx8IFByb3BlcnR5QmluZGluZy5wYXJzZVRyYWNrTmFtZSggcGF0aCApO1xuXG5cdHRoaXMubm9kZSA9IFByb3BlcnR5QmluZGluZy5maW5kTm9kZSggcm9vdE5vZGUsIHRoaXMucGFyc2VkUGF0aC5ub2RlTmFtZSApIHx8IHJvb3ROb2RlO1xuXG5cdHRoaXMucm9vdE5vZGUgPSByb290Tm9kZTtcblxufVxuXG5PYmplY3QuYXNzaWduKCBQcm9wZXJ0eUJpbmRpbmcsIHtcblxuXHRDb21wb3NpdGU6IENvbXBvc2l0ZSxcblxuXHRjcmVhdGU6IGZ1bmN0aW9uICggcm9vdCwgcGF0aCwgcGFyc2VkUGF0aCApIHtcblxuXHRcdGlmICggISAoIHJvb3QgJiYgcm9vdC5pc0FuaW1hdGlvbk9iamVjdEdyb3VwICkgKSB7XG5cblx0XHRcdHJldHVybiBuZXcgUHJvcGVydHlCaW5kaW5nKCByb290LCBwYXRoLCBwYXJzZWRQYXRoICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRyZXR1cm4gbmV3IFByb3BlcnR5QmluZGluZy5Db21wb3NpdGUoIHJvb3QsIHBhdGgsIHBhcnNlZFBhdGggKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdHBhcnNlVHJhY2tOYW1lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyBQYXJlbnQgZGlyZWN0b3JpZXMsIGRlbGltaXRlZCBieSAnLycgb3IgJzonLiBDdXJyZW50bHkgdW51c2VkLCBidXQgbXVzdFxuXHRcdC8vIGJlIG1hdGNoZWQgdG8gcGFyc2UgdGhlIHJlc3Qgb2YgdGhlIHRyYWNrIG5hbWUuXG5cdFx0dmFyIGRpcmVjdG9yeVJlID0gLygoPzpbXFx3LV0rW1xcLzpdKSopLztcblxuXHRcdC8vIFRhcmdldCBub2RlLiBNYXkgY29udGFpbiB3b3JkIGNoYXJhY3RlcnMgKGEtekEtWjAtOV8pIGFuZCAnLicgb3IgJy0nLlxuXHRcdHZhciBub2RlUmUgPSAvKFtcXHctXFwuXSspPy87XG5cblx0XHQvLyBPYmplY3Qgb24gdGFyZ2V0IG5vZGUsIGFuZCBhY2Nlc3Nvci4gTmFtZSBtYXkgY29udGFpbiBvbmx5IHdvcmRcblx0XHQvLyBjaGFyYWN0ZXJzLiBBY2Nlc3NvciBtYXkgY29udGFpbiBhbnkgY2hhcmFjdGVyIGV4Y2VwdCBjbG9zaW5nIGJyYWNrZXQuXG5cdFx0dmFyIG9iamVjdFJlID0gLyg/OlxcLihbXFx3LV0rKSg/OlxcWyguKylcXF0pPyk/LztcblxuXHRcdC8vIFByb3BlcnR5IGFuZCBhY2Nlc3Nvci4gTWF5IGNvbnRhaW4gb25seSB3b3JkIGNoYXJhY3RlcnMuIEFjY2Vzc29yIG1heVxuXHRcdC8vIGNvbnRhaW4gYW55IG5vbi1icmFja2V0IGNoYXJhY3RlcnMuXG5cdFx0dmFyIHByb3BlcnR5UmUgPSAvXFwuKFtcXHctXSspKD86XFxbKC4rKVxcXSk/LztcblxuXHRcdHZhciB0cmFja1JlID0gbmV3IFJlZ0V4cCgnJ1xuXHRcdFx0KyAnXidcblx0XHRcdCsgZGlyZWN0b3J5UmUuc291cmNlXG5cdFx0XHQrIG5vZGVSZS5zb3VyY2Vcblx0XHRcdCsgb2JqZWN0UmUuc291cmNlXG5cdFx0XHQrIHByb3BlcnR5UmUuc291cmNlXG5cdFx0XHQrICckJ1xuXHRcdCk7XG5cblx0XHR2YXIgc3VwcG9ydGVkT2JqZWN0TmFtZXMgPSBbICdtYXRlcmlhbCcsICdtYXRlcmlhbHMnLCAnYm9uZXMnIF07XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gKCB0cmFja05hbWUgKSB7XG5cblx0XHRcdFx0dmFyIG1hdGNoZXMgPSB0cmFja1JlLmV4ZWMoIHRyYWNrTmFtZSApO1xuXG5cdFx0XHRcdGlmICggISBtYXRjaGVzICkge1xuXG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCAnUHJvcGVydHlCaW5kaW5nOiBDYW5ub3QgcGFyc2UgdHJhY2tOYW1lOiAnICsgdHJhY2tOYW1lICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHZhciByZXN1bHRzID0ge1xuXHRcdFx0XHRcdC8vIGRpcmVjdG9yeU5hbWU6IG1hdGNoZXNbIDEgXSwgLy8gKHRzY2h3KSBjdXJyZW50bHkgdW51c2VkXG5cdFx0XHRcdFx0bm9kZU5hbWU6IG1hdGNoZXNbIDIgXSxcblx0XHRcdFx0XHRvYmplY3ROYW1lOiBtYXRjaGVzWyAzIF0sXG5cdFx0XHRcdFx0b2JqZWN0SW5kZXg6IG1hdGNoZXNbIDQgXSxcblx0XHRcdFx0XHRwcm9wZXJ0eU5hbWU6IG1hdGNoZXNbIDUgXSwgICAgIC8vIHJlcXVpcmVkXG5cdFx0XHRcdFx0cHJvcGVydHlJbmRleDogbWF0Y2hlc1sgNiBdXG5cdFx0XHRcdH07XG5cblx0XHRcdFx0dmFyIGxhc3REb3QgPSByZXN1bHRzLm5vZGVOYW1lICYmIHJlc3VsdHMubm9kZU5hbWUubGFzdEluZGV4T2YoICcuJyApO1xuXG5cdFx0XHRcdGlmICggbGFzdERvdCAhPT0gdW5kZWZpbmVkICYmIGxhc3REb3QgIT09IC0xICkge1xuXG5cdFx0XHRcdFx0dmFyIG9iamVjdE5hbWUgPSByZXN1bHRzLm5vZGVOYW1lLnN1YnN0cmluZyggbGFzdERvdCArIDEgKTtcblxuXHRcdFx0XHRcdC8vIE9iamVjdCBuYW1lcyBtdXN0IGJlIGNoZWNrZWQgYWdhaW5zdCBhIHdoaXRlbGlzdC4gT3RoZXJ3aXNlLCB0aGVyZVxuXHRcdFx0XHRcdC8vIGlzIG5vIHdheSB0byBwYXJzZSAnZm9vLmJhci5iYXonOiAnYmF6JyBtdXN0IGJlIGEgcHJvcGVydHksIGJ1dFxuXHRcdFx0XHRcdC8vICdiYXInIGNvdWxkIGJlIHRoZSBvYmplY3ROYW1lLCBvciBwYXJ0IG9mIGEgbm9kZU5hbWUgKHdoaWNoIGNhblxuXHRcdFx0XHRcdC8vIGluY2x1ZGUgJy4nIGNoYXJhY3RlcnMpLlxuXHRcdFx0XHRcdGlmICggc3VwcG9ydGVkT2JqZWN0TmFtZXMuaW5kZXhPZiggb2JqZWN0TmFtZSApICE9PSAtMSApIHtcblxuXHRcdFx0XHRcdFx0cmVzdWx0cy5ub2RlTmFtZSA9IHJlc3VsdHMubm9kZU5hbWUuc3Vic3RyaW5nKCAwLCBsYXN0RG90ICk7XG5cdFx0XHRcdFx0XHRyZXN1bHRzLm9iamVjdE5hbWUgPSBvYmplY3ROYW1lO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIHJlc3VsdHMucHJvcGVydHlOYW1lID09PSBudWxsIHx8IHJlc3VsdHMucHJvcGVydHlOYW1lLmxlbmd0aCA9PT0gMCApIHtcblxuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvciggJ1Byb3BlcnR5QmluZGluZzogY2FuIG5vdCBwYXJzZSBwcm9wZXJ0eU5hbWUgZnJvbSB0cmFja05hbWU6ICcgKyB0cmFja05hbWUgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cblx0XHRcdH07XG5cblx0fSgpLFxuXG5cdGZpbmROb2RlOiBmdW5jdGlvbiAoIHJvb3QsIG5vZGVOYW1lICkge1xuXG5cdFx0aWYgKCAhIG5vZGVOYW1lIHx8IG5vZGVOYW1lID09PSBcIlwiIHx8IG5vZGVOYW1lID09PSBcInJvb3RcIiB8fCBub2RlTmFtZSA9PT0gXCIuXCIgfHwgbm9kZU5hbWUgPT09IC0gMSB8fCBub2RlTmFtZSA9PT0gcm9vdC5uYW1lIHx8IG5vZGVOYW1lID09PSByb290LnV1aWQgKSB7XG5cblx0XHRcdHJldHVybiByb290O1xuXG5cdFx0fVxuXG5cdFx0Ly8gc2VhcmNoIGludG8gc2tlbGV0b24gYm9uZXMuXG5cdFx0aWYgKCByb290LnNrZWxldG9uICkge1xuXG5cdFx0XHR2YXIgc2VhcmNoU2tlbGV0b24gPSBmdW5jdGlvbiAoIHNrZWxldG9uICkge1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IHNrZWxldG9uLmJvbmVzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0XHRcdHZhciBib25lID0gc2tlbGV0b24uYm9uZXNbIGkgXTtcblxuXHRcdFx0XHRcdGlmICggYm9uZS5uYW1lID09PSBub2RlTmFtZSApIHtcblxuXHRcdFx0XHRcdFx0cmV0dXJuIGJvbmU7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBudWxsO1xuXG5cdFx0XHR9O1xuXG5cdFx0XHR2YXIgYm9uZSA9IHNlYXJjaFNrZWxldG9uKCByb290LnNrZWxldG9uICk7XG5cblx0XHRcdGlmICggYm9uZSApIHtcblxuXHRcdFx0XHRyZXR1cm4gYm9uZTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gc2VhcmNoIGludG8gbm9kZSBzdWJ0cmVlLlxuXHRcdGlmICggcm9vdC5jaGlsZHJlbiApIHtcblxuXHRcdFx0dmFyIHNlYXJjaE5vZGVTdWJ0cmVlID0gZnVuY3Rpb24gKCBjaGlsZHJlbiApIHtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdFx0XHR2YXIgY2hpbGROb2RlID0gY2hpbGRyZW5bIGkgXTtcblxuXHRcdFx0XHRcdGlmICggY2hpbGROb2RlLm5hbWUgPT09IG5vZGVOYW1lIHx8IGNoaWxkTm9kZS51dWlkID09PSBub2RlTmFtZSApIHtcblxuXHRcdFx0XHRcdFx0cmV0dXJuIGNoaWxkTm9kZTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHZhciByZXN1bHQgPSBzZWFyY2hOb2RlU3VidHJlZSggY2hpbGROb2RlLmNoaWxkcmVuICk7XG5cblx0XHRcdFx0XHRpZiAoIHJlc3VsdCApIHJldHVybiByZXN1bHQ7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBudWxsO1xuXG5cdFx0XHR9O1xuXG5cdFx0XHR2YXIgc3ViVHJlZU5vZGUgPSBzZWFyY2hOb2RlU3VidHJlZSggcm9vdC5jaGlsZHJlbiApO1xuXG5cdFx0XHRpZiAoIHN1YlRyZWVOb2RlICkge1xuXG5cdFx0XHRcdHJldHVybiBzdWJUcmVlTm9kZTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIG51bGw7XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5hc3NpZ24oIFByb3BlcnR5QmluZGluZy5wcm90b3R5cGUsIHsgLy8gcHJvdG90eXBlLCBjb250aW51ZWRcblxuXHQvLyB0aGVzZSBhcmUgdXNlZCB0byBcImJpbmRcIiBhIG5vbmV4aXN0ZW50IHByb3BlcnR5XG5cdF9nZXRWYWx1ZV91bmF2YWlsYWJsZTogZnVuY3Rpb24gKCkge30sXG5cdF9zZXRWYWx1ZV91bmF2YWlsYWJsZTogZnVuY3Rpb24gKCkge30sXG5cblx0QmluZGluZ1R5cGU6IHtcblx0XHREaXJlY3Q6IDAsXG5cdFx0RW50aXJlQXJyYXk6IDEsXG5cdFx0QXJyYXlFbGVtZW50OiAyLFxuXHRcdEhhc0Zyb21Ub0FycmF5OiAzXG5cdH0sXG5cblx0VmVyc2lvbmluZzoge1xuXHRcdE5vbmU6IDAsXG5cdFx0TmVlZHNVcGRhdGU6IDEsXG5cdFx0TWF0cml4V29ybGROZWVkc1VwZGF0ZTogMlxuXHR9LFxuXG5cdEdldHRlckJ5QmluZGluZ1R5cGU6IFtcblxuXHRcdGZ1bmN0aW9uIGdldFZhbHVlX2RpcmVjdCggYnVmZmVyLCBvZmZzZXQgKSB7XG5cblx0XHRcdGJ1ZmZlclsgb2Zmc2V0IF0gPSB0aGlzLm5vZGVbIHRoaXMucHJvcGVydHlOYW1lIF07XG5cblx0XHR9LFxuXG5cdFx0ZnVuY3Rpb24gZ2V0VmFsdWVfYXJyYXkoIGJ1ZmZlciwgb2Zmc2V0ICkge1xuXG5cdFx0XHR2YXIgc291cmNlID0gdGhpcy5yZXNvbHZlZFByb3BlcnR5O1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIG4gPSBzb3VyY2UubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHRcdGJ1ZmZlclsgb2Zmc2V0ICsrIF0gPSBzb3VyY2VbIGkgXTtcblxuXHRcdFx0fVxuXG5cdFx0fSxcblxuXHRcdGZ1bmN0aW9uIGdldFZhbHVlX2FycmF5RWxlbWVudCggYnVmZmVyLCBvZmZzZXQgKSB7XG5cblx0XHRcdGJ1ZmZlclsgb2Zmc2V0IF0gPSB0aGlzLnJlc29sdmVkUHJvcGVydHlbIHRoaXMucHJvcGVydHlJbmRleCBdO1xuXG5cdFx0fSxcblxuXHRcdGZ1bmN0aW9uIGdldFZhbHVlX3RvQXJyYXkoIGJ1ZmZlciwgb2Zmc2V0ICkge1xuXG5cdFx0XHR0aGlzLnJlc29sdmVkUHJvcGVydHkudG9BcnJheSggYnVmZmVyLCBvZmZzZXQgKTtcblxuXHRcdH1cblxuXHRdLFxuXG5cdFNldHRlckJ5QmluZGluZ1R5cGVBbmRWZXJzaW9uaW5nOiBbXG5cblx0XHRbXG5cdFx0XHQvLyBEaXJlY3RcblxuXHRcdFx0ZnVuY3Rpb24gc2V0VmFsdWVfZGlyZWN0KCBidWZmZXIsIG9mZnNldCApIHtcblxuXHRcdFx0XHR0aGlzLm5vZGVbIHRoaXMucHJvcGVydHlOYW1lIF0gPSBidWZmZXJbIG9mZnNldCBdO1xuXG5cdFx0XHR9LFxuXG5cdFx0XHRmdW5jdGlvbiBzZXRWYWx1ZV9kaXJlY3Rfc2V0TmVlZHNVcGRhdGUoIGJ1ZmZlciwgb2Zmc2V0ICkge1xuXG5cdFx0XHRcdHRoaXMubm9kZVsgdGhpcy5wcm9wZXJ0eU5hbWUgXSA9IGJ1ZmZlclsgb2Zmc2V0IF07XG5cdFx0XHRcdHRoaXMudGFyZ2V0T2JqZWN0Lm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0fSxcblxuXHRcdFx0ZnVuY3Rpb24gc2V0VmFsdWVfZGlyZWN0X3NldE1hdHJpeFdvcmxkTmVlZHNVcGRhdGUoIGJ1ZmZlciwgb2Zmc2V0ICkge1xuXG5cdFx0XHRcdHRoaXMubm9kZVsgdGhpcy5wcm9wZXJ0eU5hbWUgXSA9IGJ1ZmZlclsgb2Zmc2V0IF07XG5cdFx0XHRcdHRoaXMudGFyZ2V0T2JqZWN0Lm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHR9XG5cblx0XHRdLCBbXG5cblx0XHRcdC8vIEVudGlyZUFycmF5XG5cblx0XHRcdGZ1bmN0aW9uIHNldFZhbHVlX2FycmF5KCBidWZmZXIsIG9mZnNldCApIHtcblxuXHRcdFx0XHR2YXIgZGVzdCA9IHRoaXMucmVzb2x2ZWRQcm9wZXJ0eTtcblxuXHRcdFx0XHRmb3IgKCB2YXIgaSA9IDAsIG4gPSBkZXN0Lmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0XHRcdGRlc3RbIGkgXSA9IGJ1ZmZlclsgb2Zmc2V0ICsrIF07XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9LFxuXG5cdFx0XHRmdW5jdGlvbiBzZXRWYWx1ZV9hcnJheV9zZXROZWVkc1VwZGF0ZSggYnVmZmVyLCBvZmZzZXQgKSB7XG5cblx0XHRcdFx0dmFyIGRlc3QgPSB0aGlzLnJlc29sdmVkUHJvcGVydHk7XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwLCBuID0gZGVzdC5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRcdFx0XHRkZXN0WyBpIF0gPSBidWZmZXJbIG9mZnNldCArKyBdO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0aGlzLnRhcmdldE9iamVjdC5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdH0sXG5cblx0XHRcdGZ1bmN0aW9uIHNldFZhbHVlX2FycmF5X3NldE1hdHJpeFdvcmxkTmVlZHNVcGRhdGUoIGJ1ZmZlciwgb2Zmc2V0ICkge1xuXG5cdFx0XHRcdHZhciBkZXN0ID0gdGhpcy5yZXNvbHZlZFByb3BlcnR5O1xuXG5cdFx0XHRcdGZvciAoIHZhciBpID0gMCwgbiA9IGRlc3QubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHRcdFx0ZGVzdFsgaSBdID0gYnVmZmVyWyBvZmZzZXQgKysgXTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGhpcy50YXJnZXRPYmplY3QubWF0cml4V29ybGROZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdH1cblxuXHRcdF0sIFtcblxuXHRcdFx0Ly8gQXJyYXlFbGVtZW50XG5cblx0XHRcdGZ1bmN0aW9uIHNldFZhbHVlX2FycmF5RWxlbWVudCggYnVmZmVyLCBvZmZzZXQgKSB7XG5cblx0XHRcdFx0dGhpcy5yZXNvbHZlZFByb3BlcnR5WyB0aGlzLnByb3BlcnR5SW5kZXggXSA9IGJ1ZmZlclsgb2Zmc2V0IF07XG5cblx0XHRcdH0sXG5cblx0XHRcdGZ1bmN0aW9uIHNldFZhbHVlX2FycmF5RWxlbWVudF9zZXROZWVkc1VwZGF0ZSggYnVmZmVyLCBvZmZzZXQgKSB7XG5cblx0XHRcdFx0dGhpcy5yZXNvbHZlZFByb3BlcnR5WyB0aGlzLnByb3BlcnR5SW5kZXggXSA9IGJ1ZmZlclsgb2Zmc2V0IF07XG5cdFx0XHRcdHRoaXMudGFyZ2V0T2JqZWN0Lm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0fSxcblxuXHRcdFx0ZnVuY3Rpb24gc2V0VmFsdWVfYXJyYXlFbGVtZW50X3NldE1hdHJpeFdvcmxkTmVlZHNVcGRhdGUoIGJ1ZmZlciwgb2Zmc2V0ICkge1xuXG5cdFx0XHRcdHRoaXMucmVzb2x2ZWRQcm9wZXJ0eVsgdGhpcy5wcm9wZXJ0eUluZGV4IF0gPSBidWZmZXJbIG9mZnNldCBdO1xuXHRcdFx0XHR0aGlzLnRhcmdldE9iamVjdC5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0fVxuXG5cdFx0XSwgW1xuXG5cdFx0XHQvLyBIYXNUb0Zyb21BcnJheVxuXG5cdFx0XHRmdW5jdGlvbiBzZXRWYWx1ZV9mcm9tQXJyYXkoIGJ1ZmZlciwgb2Zmc2V0ICkge1xuXG5cdFx0XHRcdHRoaXMucmVzb2x2ZWRQcm9wZXJ0eS5mcm9tQXJyYXkoIGJ1ZmZlciwgb2Zmc2V0ICk7XG5cblx0XHRcdH0sXG5cblx0XHRcdGZ1bmN0aW9uIHNldFZhbHVlX2Zyb21BcnJheV9zZXROZWVkc1VwZGF0ZSggYnVmZmVyLCBvZmZzZXQgKSB7XG5cblx0XHRcdFx0dGhpcy5yZXNvbHZlZFByb3BlcnR5LmZyb21BcnJheSggYnVmZmVyLCBvZmZzZXQgKTtcblx0XHRcdFx0dGhpcy50YXJnZXRPYmplY3QubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHR9LFxuXG5cdFx0XHRmdW5jdGlvbiBzZXRWYWx1ZV9mcm9tQXJyYXlfc2V0TWF0cml4V29ybGROZWVkc1VwZGF0ZSggYnVmZmVyLCBvZmZzZXQgKSB7XG5cblx0XHRcdFx0dGhpcy5yZXNvbHZlZFByb3BlcnR5LmZyb21BcnJheSggYnVmZmVyLCBvZmZzZXQgKTtcblx0XHRcdFx0dGhpcy50YXJnZXRPYmplY3QubWF0cml4V29ybGROZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdH1cblxuXHRcdF1cblxuXHRdLFxuXG5cdGdldFZhbHVlOiBmdW5jdGlvbiBnZXRWYWx1ZV91bmJvdW5kKCB0YXJnZXRBcnJheSwgb2Zmc2V0ICkge1xuXG5cdFx0dGhpcy5iaW5kKCk7XG5cdFx0dGhpcy5nZXRWYWx1ZSggdGFyZ2V0QXJyYXksIG9mZnNldCApO1xuXG5cdFx0Ly8gTm90ZTogVGhpcyBjbGFzcyB1c2VzIGEgU3RhdGUgcGF0dGVybiBvbiBhIHBlci1tZXRob2QgYmFzaXM6XG5cdFx0Ly8gJ2JpbmQnIHNldHMgJ3RoaXMuZ2V0VmFsdWUnIC8gJ3NldFZhbHVlJyBhbmQgc2hhZG93cyB0aGVcblx0XHQvLyBwcm90b3R5cGUgdmVyc2lvbiBvZiB0aGVzZSBtZXRob2RzIHdpdGggb25lIHRoYXQgcmVwcmVzZW50c1xuXHRcdC8vIHRoZSBib3VuZCBzdGF0ZS4gV2hlbiB0aGUgcHJvcGVydHkgaXMgbm90IGZvdW5kLCB0aGUgbWV0aG9kc1xuXHRcdC8vIGJlY29tZSBuby1vcHMuXG5cblx0fSxcblxuXHRzZXRWYWx1ZTogZnVuY3Rpb24gZ2V0VmFsdWVfdW5ib3VuZCggc291cmNlQXJyYXksIG9mZnNldCApIHtcblxuXHRcdHRoaXMuYmluZCgpO1xuXHRcdHRoaXMuc2V0VmFsdWUoIHNvdXJjZUFycmF5LCBvZmZzZXQgKTtcblxuXHR9LFxuXG5cdC8vIGNyZWF0ZSBnZXR0ZXIgLyBzZXR0ZXIgcGFpciBmb3IgYSBwcm9wZXJ0eSBpbiB0aGUgc2NlbmUgZ3JhcGhcblx0YmluZDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dmFyIHRhcmdldE9iamVjdCA9IHRoaXMubm9kZSxcblx0XHRcdHBhcnNlZFBhdGggPSB0aGlzLnBhcnNlZFBhdGgsXG5cblx0XHRcdG9iamVjdE5hbWUgPSBwYXJzZWRQYXRoLm9iamVjdE5hbWUsXG5cdFx0XHRwcm9wZXJ0eU5hbWUgPSBwYXJzZWRQYXRoLnByb3BlcnR5TmFtZSxcblx0XHRcdHByb3BlcnR5SW5kZXggPSBwYXJzZWRQYXRoLnByb3BlcnR5SW5kZXg7XG5cblx0XHRpZiAoICEgdGFyZ2V0T2JqZWN0ICkge1xuXG5cdFx0XHR0YXJnZXRPYmplY3QgPSBQcm9wZXJ0eUJpbmRpbmcuZmluZE5vZGUoXG5cdFx0XHRcdFx0dGhpcy5yb290Tm9kZSwgcGFyc2VkUGF0aC5ub2RlTmFtZSApIHx8IHRoaXMucm9vdE5vZGU7XG5cblx0XHRcdHRoaXMubm9kZSA9IHRhcmdldE9iamVjdDtcblxuXHRcdH1cblxuXHRcdC8vIHNldCBmYWlsIHN0YXRlIHNvIHdlIGNhbiBqdXN0ICdyZXR1cm4nIG9uIGVycm9yXG5cdFx0dGhpcy5nZXRWYWx1ZSA9IHRoaXMuX2dldFZhbHVlX3VuYXZhaWxhYmxlO1xuXHRcdHRoaXMuc2V0VmFsdWUgPSB0aGlzLl9zZXRWYWx1ZV91bmF2YWlsYWJsZTtcblxuXHRcdC8vIGVuc3VyZSB0aGVyZSBpcyBhIHZhbHVlIG5vZGVcblx0XHRpZiAoICEgdGFyZ2V0T2JqZWN0ICkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCBcIiAgdHJ5aW5nIHRvIHVwZGF0ZSBub2RlIGZvciB0cmFjazogXCIgKyB0aGlzLnBhdGggKyBcIiBidXQgaXQgd2Fzbid0IGZvdW5kLlwiICk7XG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHRpZiAoIG9iamVjdE5hbWUgKSB7XG5cblx0XHRcdHZhciBvYmplY3RJbmRleCA9IHBhcnNlZFBhdGgub2JqZWN0SW5kZXg7XG5cblx0XHRcdC8vIHNwZWNpYWwgY2FzZXMgd2VyZSB3ZSBuZWVkIHRvIHJlYWNoIGRlZXBlciBpbnRvIHRoZSBoaWVyYXJjaHkgdG8gZ2V0IHRoZSBmYWNlIG1hdGVyaWFscy4uLi5cblx0XHRcdHN3aXRjaCAoIG9iamVjdE5hbWUgKSB7XG5cblx0XHRcdFx0Y2FzZSAnbWF0ZXJpYWxzJzpcblxuXHRcdFx0XHRcdGlmICggISB0YXJnZXRPYmplY3QubWF0ZXJpYWwgKSB7XG5cblx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoICcgIGNhbiBub3QgYmluZCB0byBtYXRlcmlhbCBhcyBub2RlIGRvZXMgbm90IGhhdmUgYSBtYXRlcmlhbCcsIHRoaXMgKTtcblx0XHRcdFx0XHRcdHJldHVybjtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmICggISB0YXJnZXRPYmplY3QubWF0ZXJpYWwubWF0ZXJpYWxzICkge1xuXG5cdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnICBjYW4gbm90IGJpbmQgdG8gbWF0ZXJpYWwubWF0ZXJpYWxzIGFzIG5vZGUubWF0ZXJpYWwgZG9lcyBub3QgaGF2ZSBhIG1hdGVyaWFscyBhcnJheScsIHRoaXMgKTtcblx0XHRcdFx0XHRcdHJldHVybjtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHRhcmdldE9iamVjdCA9IHRhcmdldE9iamVjdC5tYXRlcmlhbC5tYXRlcmlhbHM7XG5cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlICdib25lcyc6XG5cblx0XHRcdFx0XHRpZiAoICEgdGFyZ2V0T2JqZWN0LnNrZWxldG9uICkge1xuXG5cdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnICBjYW4gbm90IGJpbmQgdG8gYm9uZXMgYXMgbm9kZSBkb2VzIG5vdCBoYXZlIGEgc2tlbGV0b24nLCB0aGlzICk7XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBwb3RlbnRpYWwgZnV0dXJlIG9wdGltaXphdGlvbjogc2tpcCB0aGlzIGlmIHByb3BlcnR5SW5kZXggaXMgYWxyZWFkeSBhbiBpbnRlZ2VyXG5cdFx0XHRcdFx0Ly8gYW5kIGNvbnZlcnQgdGhlIGludGVnZXIgc3RyaW5nIHRvIGEgdHJ1ZSBpbnRlZ2VyLlxuXG5cdFx0XHRcdFx0dGFyZ2V0T2JqZWN0ID0gdGFyZ2V0T2JqZWN0LnNrZWxldG9uLmJvbmVzO1xuXG5cdFx0XHRcdFx0Ly8gc3VwcG9ydCByZXNvbHZpbmcgbW9ycGhUYXJnZXQgbmFtZXMgaW50byBpbmRpY2VzLlxuXHRcdFx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IHRhcmdldE9iamVjdC5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdGlmICggdGFyZ2V0T2JqZWN0WyBpIF0ubmFtZSA9PT0gb2JqZWN0SW5kZXggKSB7XG5cblx0XHRcdFx0XHRcdFx0b2JqZWN0SW5kZXggPSBpO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0ZGVmYXVsdDpcblxuXHRcdFx0XHRcdGlmICggdGFyZ2V0T2JqZWN0WyBvYmplY3ROYW1lIF0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdFx0Y29uc29sZS5lcnJvciggJyAgY2FuIG5vdCBiaW5kIHRvIG9iamVjdE5hbWUgb2Ygbm9kZSwgdW5kZWZpbmVkJywgdGhpcyApO1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0dGFyZ2V0T2JqZWN0ID0gdGFyZ2V0T2JqZWN0WyBvYmplY3ROYW1lIF07XG5cblx0XHRcdH1cblxuXG5cdFx0XHRpZiAoIG9iamVjdEluZGV4ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0aWYgKCB0YXJnZXRPYmplY3RbIG9iamVjdEluZGV4IF0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoIFwiICB0cnlpbmcgdG8gYmluZCB0byBvYmplY3RJbmRleCBvZiBvYmplY3ROYW1lLCBidXQgaXMgdW5kZWZpbmVkOlwiLCB0aGlzLCB0YXJnZXRPYmplY3QgKTtcblx0XHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRhcmdldE9iamVjdCA9IHRhcmdldE9iamVjdFsgb2JqZWN0SW5kZXggXTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gcmVzb2x2ZSBwcm9wZXJ0eVxuXHRcdHZhciBub2RlUHJvcGVydHkgPSB0YXJnZXRPYmplY3RbIHByb3BlcnR5TmFtZSBdO1xuXG5cdFx0aWYgKCBub2RlUHJvcGVydHkgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dmFyIG5vZGVOYW1lID0gcGFyc2VkUGF0aC5ub2RlTmFtZTtcblxuXHRcdFx0Y29uc29sZS5lcnJvciggXCIgIHRyeWluZyB0byB1cGRhdGUgcHJvcGVydHkgZm9yIHRyYWNrOiBcIiArIG5vZGVOYW1lICtcblx0XHRcdFx0Jy4nICsgcHJvcGVydHlOYW1lICsgXCIgYnV0IGl0IHdhc24ndCBmb3VuZC5cIiwgdGFyZ2V0T2JqZWN0ICk7XG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHQvLyBkZXRlcm1pbmUgdmVyc2lvbmluZyBzY2hlbWVcblx0XHR2YXIgdmVyc2lvbmluZyA9IHRoaXMuVmVyc2lvbmluZy5Ob25lO1xuXG5cdFx0aWYgKCB0YXJnZXRPYmplY3QubmVlZHNVcGRhdGUgIT09IHVuZGVmaW5lZCApIHsgLy8gbWF0ZXJpYWxcblxuXHRcdFx0dmVyc2lvbmluZyA9IHRoaXMuVmVyc2lvbmluZy5OZWVkc1VwZGF0ZTtcblx0XHRcdHRoaXMudGFyZ2V0T2JqZWN0ID0gdGFyZ2V0T2JqZWN0O1xuXG5cdFx0fSBlbHNlIGlmICggdGFyZ2V0T2JqZWN0Lm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUgIT09IHVuZGVmaW5lZCApIHsgLy8gbm9kZSB0cmFuc2Zvcm1cblxuXHRcdFx0dmVyc2lvbmluZyA9IHRoaXMuVmVyc2lvbmluZy5NYXRyaXhXb3JsZE5lZWRzVXBkYXRlO1xuXHRcdFx0dGhpcy50YXJnZXRPYmplY3QgPSB0YXJnZXRPYmplY3Q7XG5cblx0XHR9XG5cblx0XHQvLyBkZXRlcm1pbmUgaG93IHRoZSBwcm9wZXJ0eSBnZXRzIGJvdW5kXG5cdFx0dmFyIGJpbmRpbmdUeXBlID0gdGhpcy5CaW5kaW5nVHlwZS5EaXJlY3Q7XG5cblx0XHRpZiAoIHByb3BlcnR5SW5kZXggIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Ly8gYWNjZXNzIGEgc3ViIGVsZW1lbnQgb2YgdGhlIHByb3BlcnR5IGFycmF5IChvbmx5IHByaW1pdGl2ZXMgYXJlIHN1cHBvcnRlZCByaWdodCBub3cpXG5cblx0XHRcdGlmICggcHJvcGVydHlOYW1lID09PSBcIm1vcnBoVGFyZ2V0SW5mbHVlbmNlc1wiICkge1xuXG5cdFx0XHRcdC8vIHBvdGVudGlhbCBvcHRpbWl6YXRpb24sIHNraXAgdGhpcyBpZiBwcm9wZXJ0eUluZGV4IGlzIGFscmVhZHkgYW4gaW50ZWdlciwgYW5kIGNvbnZlcnQgdGhlIGludGVnZXIgc3RyaW5nIHRvIGEgdHJ1ZSBpbnRlZ2VyLlxuXG5cdFx0XHRcdC8vIHN1cHBvcnQgcmVzb2x2aW5nIG1vcnBoVGFyZ2V0IG5hbWVzIGludG8gaW5kaWNlcy5cblx0XHRcdFx0aWYgKCAhIHRhcmdldE9iamVjdC5nZW9tZXRyeSApIHtcblxuXHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoICcgIGNhbiBub3QgYmluZCB0byBtb3JwaFRhcmdldEluZmx1ZW5jZXMgYmVjYXN1c2Ugbm9kZSBkb2VzIG5vdCBoYXZlIGEgZ2VvbWV0cnknLCB0aGlzICk7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoICEgdGFyZ2V0T2JqZWN0Lmdlb21ldHJ5Lm1vcnBoVGFyZ2V0cyApIHtcblxuXHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoICcgIGNhbiBub3QgYmluZCB0byBtb3JwaFRhcmdldEluZmx1ZW5jZXMgYmVjYXN1c2Ugbm9kZSBkb2VzIG5vdCBoYXZlIGEgZ2VvbWV0cnkubW9ycGhUYXJnZXRzJywgdGhpcyApO1xuXHRcdFx0XHRcdHJldHVybjtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgdGhpcy5ub2RlLmdlb21ldHJ5Lm1vcnBoVGFyZ2V0cy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRpZiAoIHRhcmdldE9iamVjdC5nZW9tZXRyeS5tb3JwaFRhcmdldHNbIGkgXS5uYW1lID09PSBwcm9wZXJ0eUluZGV4ICkge1xuXG5cdFx0XHRcdFx0XHRwcm9wZXJ0eUluZGV4ID0gaTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRiaW5kaW5nVHlwZSA9IHRoaXMuQmluZGluZ1R5cGUuQXJyYXlFbGVtZW50O1xuXG5cdFx0XHR0aGlzLnJlc29sdmVkUHJvcGVydHkgPSBub2RlUHJvcGVydHk7XG5cdFx0XHR0aGlzLnByb3BlcnR5SW5kZXggPSBwcm9wZXJ0eUluZGV4O1xuXG5cdFx0fSBlbHNlIGlmICggbm9kZVByb3BlcnR5LmZyb21BcnJheSAhPT0gdW5kZWZpbmVkICYmIG5vZGVQcm9wZXJ0eS50b0FycmF5ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdC8vIG11c3QgdXNlIGNvcHkgZm9yIE9iamVjdDNELkV1bGVyL1F1YXRlcm5pb25cblxuXHRcdFx0YmluZGluZ1R5cGUgPSB0aGlzLkJpbmRpbmdUeXBlLkhhc0Zyb21Ub0FycmF5O1xuXG5cdFx0XHR0aGlzLnJlc29sdmVkUHJvcGVydHkgPSBub2RlUHJvcGVydHk7XG5cblx0XHR9IGVsc2UgaWYgKCBBcnJheS5pc0FycmF5KCBub2RlUHJvcGVydHkgKSApIHtcblxuXHRcdFx0YmluZGluZ1R5cGUgPSB0aGlzLkJpbmRpbmdUeXBlLkVudGlyZUFycmF5O1xuXG5cdFx0XHR0aGlzLnJlc29sdmVkUHJvcGVydHkgPSBub2RlUHJvcGVydHk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR0aGlzLnByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZTtcblxuXHRcdH1cblxuXHRcdC8vIHNlbGVjdCBnZXR0ZXIgLyBzZXR0ZXJcblx0XHR0aGlzLmdldFZhbHVlID0gdGhpcy5HZXR0ZXJCeUJpbmRpbmdUeXBlWyBiaW5kaW5nVHlwZSBdO1xuXHRcdHRoaXMuc2V0VmFsdWUgPSB0aGlzLlNldHRlckJ5QmluZGluZ1R5cGVBbmRWZXJzaW9uaW5nWyBiaW5kaW5nVHlwZSBdWyB2ZXJzaW9uaW5nIF07XG5cblx0fSxcblxuXHR1bmJpbmQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMubm9kZSA9IG51bGw7XG5cblx0XHQvLyBiYWNrIHRvIHRoZSBwcm90b3R5cGUgdmVyc2lvbiBvZiBnZXRWYWx1ZSAvIHNldFZhbHVlXG5cdFx0Ly8gbm90ZTogYXZvaWRpbmcgdG8gbXV0YXRlIHRoZSBzaGFwZSBvZiAndGhpcycgdmlhICdkZWxldGUnXG5cdFx0dGhpcy5nZXRWYWx1ZSA9IHRoaXMuX2dldFZhbHVlX3VuYm91bmQ7XG5cdFx0dGhpcy5zZXRWYWx1ZSA9IHRoaXMuX3NldFZhbHVlX3VuYm91bmQ7XG5cblx0fVxuXG59ICk7XG5cbi8vIVxcIERFQ0xBUkUgQUxJQVMgQUZURVIgYXNzaWduIHByb3RvdHlwZSAhXG5PYmplY3QuYXNzaWduKCBQcm9wZXJ0eUJpbmRpbmcucHJvdG90eXBlLCB7XG5cblx0Ly8gaW5pdGlhbCBzdGF0ZSBvZiB0aGVzZSBtZXRob2RzIHRoYXQgY2FsbHMgJ2JpbmQnXG5cdF9nZXRWYWx1ZV91bmJvdW5kOiBQcm9wZXJ0eUJpbmRpbmcucHJvdG90eXBlLmdldFZhbHVlLFxuXHRfc2V0VmFsdWVfdW5ib3VuZDogUHJvcGVydHlCaW5kaW5nLnByb3RvdHlwZS5zZXRWYWx1ZSxcblxufSApO1xuXG4vKipcbiAqXG4gKiBBIGdyb3VwIG9mIG9iamVjdHMgdGhhdCByZWNlaXZlcyBhIHNoYXJlZCBhbmltYXRpb24gc3RhdGUuXG4gKlxuICogVXNhZ2U6XG4gKlxuICogXHQtXHRBZGQgb2JqZWN0cyB5b3Ugd291bGQgb3RoZXJ3aXNlIHBhc3MgYXMgJ3Jvb3QnIHRvIHRoZVxuICogXHRcdGNvbnN0cnVjdG9yIG9yIHRoZSAuY2xpcEFjdGlvbiBtZXRob2Qgb2YgQW5pbWF0aW9uTWl4ZXIuXG4gKlxuICogXHQtXHRJbnN0ZWFkIHBhc3MgdGhpcyBvYmplY3QgYXMgJ3Jvb3QnLlxuICpcbiAqIFx0LVx0WW91IGNhbiBhbHNvIGFkZCBhbmQgcmVtb3ZlIG9iamVjdHMgbGF0ZXIgd2hlbiB0aGUgbWl4ZXJcbiAqIFx0XHRpcyBydW5uaW5nLlxuICpcbiAqIE5vdGU6XG4gKlxuICogIFx0T2JqZWN0cyBvZiB0aGlzIGNsYXNzIGFwcGVhciBhcyBvbmUgb2JqZWN0IHRvIHRoZSBtaXhlcixcbiAqICBcdHNvIGNhY2hlIGNvbnRyb2wgb2YgdGhlIGluZGl2aWR1YWwgb2JqZWN0cyBtdXN0IGJlIGRvbmVcbiAqICBcdG9uIHRoZSBncm91cC5cbiAqXG4gKiBMaW1pdGF0aW9uOlxuICpcbiAqIFx0LSBcdFRoZSBhbmltYXRlZCBwcm9wZXJ0aWVzIG11c3QgYmUgY29tcGF0aWJsZSBhbW9uZyB0aGVcbiAqIFx0XHRhbGwgb2JqZWN0cyBpbiB0aGUgZ3JvdXAuXG4gKlxuICogIC1cdEEgc2luZ2xlIHByb3BlcnR5IGNhbiBlaXRoZXIgYmUgY29udHJvbGxlZCB0aHJvdWdoIGFcbiAqICBcdHRhcmdldCBncm91cCBvciBkaXJlY3RseSwgYnV0IG5vdCBib3RoLlxuICpcbiAqIEBhdXRob3IgdHNjaHdcbiAqL1xuXG5mdW5jdGlvbiBBbmltYXRpb25PYmplY3RHcm91cCggdmFyX2FyZ3MgKSB7XG5cblx0dGhpcy51dWlkID0gX01hdGguZ2VuZXJhdGVVVUlEKCk7XG5cblx0Ly8gY2FjaGVkIG9iamVjdHMgZm9sbG93ZWQgYnkgdGhlIGFjdGl2ZSBvbmVzXG5cdHRoaXMuX29iamVjdHMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCggYXJndW1lbnRzICk7XG5cblx0dGhpcy5uQ2FjaGVkT2JqZWN0c18gPSAwO1x0XHRcdC8vIHRocmVzaG9sZFxuXHQvLyBub3RlOiByZWFkIGJ5IFByb3BlcnR5QmluZGluZy5Db21wb3NpdGVcblxuXHR2YXIgaW5kaWNlcyA9IHt9O1xuXHR0aGlzLl9pbmRpY2VzQnlVVUlEID0gaW5kaWNlcztcdFx0Ly8gZm9yIGJvb2trZWVwaW5nXG5cblx0Zm9yICggdmFyIGkgPSAwLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdGluZGljZXNbIGFyZ3VtZW50c1sgaSBdLnV1aWQgXSA9IGk7XG5cblx0fVxuXG5cdHRoaXMuX3BhdGhzID0gW107XHRcdFx0XHRcdC8vIGluc2lkZTogc3RyaW5nXG5cdHRoaXMuX3BhcnNlZFBhdGhzID0gW107XHRcdFx0XHQvLyBpbnNpZGU6IHsgd2UgZG9uJ3QgY2FyZSwgaGVyZSB9XG5cdHRoaXMuX2JpbmRpbmdzID0gW107IFx0XHRcdFx0Ly8gaW5zaWRlOiBBcnJheTwgUHJvcGVydHlCaW5kaW5nID5cblx0dGhpcy5fYmluZGluZ3NJbmRpY2VzQnlQYXRoID0ge307IFx0Ly8gaW5zaWRlOiBpbmRpY2VzIGluIHRoZXNlIGFycmF5c1xuXG5cdHZhciBzY29wZSA9IHRoaXM7XG5cblx0dGhpcy5zdGF0cyA9IHtcblxuXHRcdG9iamVjdHM6IHtcblx0XHRcdGdldCB0b3RhbCgpIHsgcmV0dXJuIHNjb3BlLl9vYmplY3RzLmxlbmd0aDsgfSxcblx0XHRcdGdldCBpblVzZSgpIHsgcmV0dXJuIHRoaXMudG90YWwgLSBzY29wZS5uQ2FjaGVkT2JqZWN0c187IH1cblx0XHR9LFxuXG5cdFx0Z2V0IGJpbmRpbmdzUGVyT2JqZWN0KCkgeyByZXR1cm4gc2NvcGUuX2JpbmRpbmdzLmxlbmd0aDsgfVxuXG5cdH07XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggQW5pbWF0aW9uT2JqZWN0R3JvdXAucHJvdG90eXBlLCB7XG5cblx0aXNBbmltYXRpb25PYmplY3RHcm91cDogdHJ1ZSxcblxuXHRhZGQ6IGZ1bmN0aW9uKCB2YXJfYXJncyApIHtcblxuXHRcdHZhciBvYmplY3RzID0gdGhpcy5fb2JqZWN0cyxcblx0XHRcdG5PYmplY3RzID0gb2JqZWN0cy5sZW5ndGgsXG5cdFx0XHRuQ2FjaGVkT2JqZWN0cyA9IHRoaXMubkNhY2hlZE9iamVjdHNfLFxuXHRcdFx0aW5kaWNlc0J5VVVJRCA9IHRoaXMuX2luZGljZXNCeVVVSUQsXG5cdFx0XHRwYXRocyA9IHRoaXMuX3BhdGhzLFxuXHRcdFx0cGFyc2VkUGF0aHMgPSB0aGlzLl9wYXJzZWRQYXRocyxcblx0XHRcdGJpbmRpbmdzID0gdGhpcy5fYmluZGluZ3MsXG5cdFx0XHRuQmluZGluZ3MgPSBiaW5kaW5ncy5sZW5ndGg7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHR2YXIgb2JqZWN0ID0gYXJndW1lbnRzWyBpIF0sXG5cdFx0XHRcdHV1aWQgPSBvYmplY3QudXVpZCxcblx0XHRcdFx0aW5kZXggPSBpbmRpY2VzQnlVVUlEWyB1dWlkIF0sXG5cdFx0XHRcdGtub3duT2JqZWN0ID0gdW5kZWZpbmVkO1xuXG5cdFx0XHRpZiAoIGluZGV4ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Ly8gdW5rbm93biBvYmplY3QgLT4gYWRkIGl0IHRvIHRoZSBBQ1RJVkUgcmVnaW9uXG5cblx0XHRcdFx0aW5kZXggPSBuT2JqZWN0cyArKztcblx0XHRcdFx0aW5kaWNlc0J5VVVJRFsgdXVpZCBdID0gaW5kZXg7XG5cdFx0XHRcdG9iamVjdHMucHVzaCggb2JqZWN0ICk7XG5cblx0XHRcdFx0Ly8gYWNjb3VudGluZyBpcyBkb25lLCBub3cgZG8gdGhlIHNhbWUgZm9yIGFsbCBiaW5kaW5nc1xuXG5cdFx0XHRcdGZvciAoIHZhciBqID0gMCwgbSA9IG5CaW5kaW5nczsgaiAhPT0gbTsgKysgaiApIHtcblxuXHRcdFx0XHRcdGJpbmRpbmdzWyBqIF0ucHVzaChcblx0XHRcdFx0XHRcdFx0bmV3IFByb3BlcnR5QmluZGluZyhcblx0XHRcdFx0XHRcdFx0XHRvYmplY3QsIHBhdGhzWyBqIF0sIHBhcnNlZFBhdGhzWyBqIF0gKSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIGlmICggaW5kZXggPCBuQ2FjaGVkT2JqZWN0cyApIHtcblxuXHRcdFx0XHRrbm93bk9iamVjdCA9IG9iamVjdHNbIGluZGV4IF07XG5cblx0XHRcdFx0Ly8gbW92ZSBleGlzdGluZyBvYmplY3QgdG8gdGhlIEFDVElWRSByZWdpb25cblxuXHRcdFx0XHR2YXIgZmlyc3RBY3RpdmVJbmRleCA9IC0tIG5DYWNoZWRPYmplY3RzLFxuXHRcdFx0XHRcdGxhc3RDYWNoZWRPYmplY3QgPSBvYmplY3RzWyBmaXJzdEFjdGl2ZUluZGV4IF07XG5cblx0XHRcdFx0aW5kaWNlc0J5VVVJRFsgbGFzdENhY2hlZE9iamVjdC51dWlkIF0gPSBpbmRleDtcblx0XHRcdFx0b2JqZWN0c1sgaW5kZXggXSA9IGxhc3RDYWNoZWRPYmplY3Q7XG5cblx0XHRcdFx0aW5kaWNlc0J5VVVJRFsgdXVpZCBdID0gZmlyc3RBY3RpdmVJbmRleDtcblx0XHRcdFx0b2JqZWN0c1sgZmlyc3RBY3RpdmVJbmRleCBdID0gb2JqZWN0O1xuXG5cdFx0XHRcdC8vIGFjY291bnRpbmcgaXMgZG9uZSwgbm93IGRvIHRoZSBzYW1lIGZvciBhbGwgYmluZGluZ3NcblxuXHRcdFx0XHRmb3IgKCB2YXIgaiA9IDAsIG0gPSBuQmluZGluZ3M7IGogIT09IG07ICsrIGogKSB7XG5cblx0XHRcdFx0XHR2YXIgYmluZGluZ3NGb3JQYXRoID0gYmluZGluZ3NbIGogXSxcblx0XHRcdFx0XHRcdGxhc3RDYWNoZWQgPSBiaW5kaW5nc0ZvclBhdGhbIGZpcnN0QWN0aXZlSW5kZXggXSxcblx0XHRcdFx0XHRcdGJpbmRpbmcgPSBiaW5kaW5nc0ZvclBhdGhbIGluZGV4IF07XG5cblx0XHRcdFx0XHRiaW5kaW5nc0ZvclBhdGhbIGluZGV4IF0gPSBsYXN0Q2FjaGVkO1xuXG5cdFx0XHRcdFx0aWYgKCBiaW5kaW5nID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRcdC8vIHNpbmNlIHdlIGRvIG5vdCBib3RoZXIgdG8gY3JlYXRlIG5ldyBiaW5kaW5nc1xuXHRcdFx0XHRcdFx0Ly8gZm9yIG9iamVjdHMgdGhhdCBhcmUgY2FjaGVkLCB0aGUgYmluZGluZyBtYXlcblx0XHRcdFx0XHRcdC8vIG9yIG1heSBub3QgZXhpc3RcblxuXHRcdFx0XHRcdFx0YmluZGluZyA9IG5ldyBQcm9wZXJ0eUJpbmRpbmcoXG5cdFx0XHRcdFx0XHRcdFx0b2JqZWN0LCBwYXRoc1sgaiBdLCBwYXJzZWRQYXRoc1sgaiBdICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRiaW5kaW5nc0ZvclBhdGhbIGZpcnN0QWN0aXZlSW5kZXggXSA9IGJpbmRpbmc7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IGVsc2UgaWYgKCBvYmplY3RzWyBpbmRleCBdICE9PSBrbm93bk9iamVjdCApIHtcblxuXHRcdFx0XHRjb25zb2xlLmVycm9yKCBcIkRpZmZlcmVudCBvYmplY3RzIHdpdGggdGhlIHNhbWUgVVVJRCBcIiArXG5cdFx0XHRcdFx0XHRcImRldGVjdGVkLiBDbGVhbiB0aGUgY2FjaGVzIG9yIHJlY3JlYXRlIHlvdXIgXCIgK1xuXHRcdFx0XHRcdFx0XCJpbmZyYXN0cnVjdHVyZSB3aGVuIHJlbG9hZGluZyBzY2VuZXMuLi5cIiApO1xuXG5cdFx0XHR9IC8vIGVsc2UgdGhlIG9iamVjdCBpcyBhbHJlYWR5IHdoZXJlIHdlIHdhbnQgaXQgdG8gYmVcblxuXHRcdH0gLy8gZm9yIGFyZ3VtZW50c1xuXG5cdFx0dGhpcy5uQ2FjaGVkT2JqZWN0c18gPSBuQ2FjaGVkT2JqZWN0cztcblxuXHR9LFxuXG5cdHJlbW92ZTogZnVuY3Rpb24oIHZhcl9hcmdzICkge1xuXG5cdFx0dmFyIG9iamVjdHMgPSB0aGlzLl9vYmplY3RzLFxuXHRcdFx0bkNhY2hlZE9iamVjdHMgPSB0aGlzLm5DYWNoZWRPYmplY3RzXyxcblx0XHRcdGluZGljZXNCeVVVSUQgPSB0aGlzLl9pbmRpY2VzQnlVVUlELFxuXHRcdFx0YmluZGluZ3MgPSB0aGlzLl9iaW5kaW5ncyxcblx0XHRcdG5CaW5kaW5ncyA9IGJpbmRpbmdzLmxlbmd0aDtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRcdHZhciBvYmplY3QgPSBhcmd1bWVudHNbIGkgXSxcblx0XHRcdFx0dXVpZCA9IG9iamVjdC51dWlkLFxuXHRcdFx0XHRpbmRleCA9IGluZGljZXNCeVVVSURbIHV1aWQgXTtcblxuXHRcdFx0aWYgKCBpbmRleCAhPT0gdW5kZWZpbmVkICYmIGluZGV4ID49IG5DYWNoZWRPYmplY3RzICkge1xuXG5cdFx0XHRcdC8vIG1vdmUgZXhpc3Rpbmcgb2JqZWN0IGludG8gdGhlIENBQ0hFRCByZWdpb25cblxuXHRcdFx0XHR2YXIgbGFzdENhY2hlZEluZGV4ID0gbkNhY2hlZE9iamVjdHMgKyssXG5cdFx0XHRcdFx0Zmlyc3RBY3RpdmVPYmplY3QgPSBvYmplY3RzWyBsYXN0Q2FjaGVkSW5kZXggXTtcblxuXHRcdFx0XHRpbmRpY2VzQnlVVUlEWyBmaXJzdEFjdGl2ZU9iamVjdC51dWlkIF0gPSBpbmRleDtcblx0XHRcdFx0b2JqZWN0c1sgaW5kZXggXSA9IGZpcnN0QWN0aXZlT2JqZWN0O1xuXG5cdFx0XHRcdGluZGljZXNCeVVVSURbIHV1aWQgXSA9IGxhc3RDYWNoZWRJbmRleDtcblx0XHRcdFx0b2JqZWN0c1sgbGFzdENhY2hlZEluZGV4IF0gPSBvYmplY3Q7XG5cblx0XHRcdFx0Ly8gYWNjb3VudGluZyBpcyBkb25lLCBub3cgZG8gdGhlIHNhbWUgZm9yIGFsbCBiaW5kaW5nc1xuXG5cdFx0XHRcdGZvciAoIHZhciBqID0gMCwgbSA9IG5CaW5kaW5nczsgaiAhPT0gbTsgKysgaiApIHtcblxuXHRcdFx0XHRcdHZhciBiaW5kaW5nc0ZvclBhdGggPSBiaW5kaW5nc1sgaiBdLFxuXHRcdFx0XHRcdFx0Zmlyc3RBY3RpdmUgPSBiaW5kaW5nc0ZvclBhdGhbIGxhc3RDYWNoZWRJbmRleCBdLFxuXHRcdFx0XHRcdFx0YmluZGluZyA9IGJpbmRpbmdzRm9yUGF0aFsgaW5kZXggXTtcblxuXHRcdFx0XHRcdGJpbmRpbmdzRm9yUGF0aFsgaW5kZXggXSA9IGZpcnN0QWN0aXZlO1xuXHRcdFx0XHRcdGJpbmRpbmdzRm9yUGF0aFsgbGFzdENhY2hlZEluZGV4IF0gPSBiaW5kaW5nO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fSAvLyBmb3IgYXJndW1lbnRzXG5cblx0XHR0aGlzLm5DYWNoZWRPYmplY3RzXyA9IG5DYWNoZWRPYmplY3RzO1xuXG5cdH0sXG5cblx0Ly8gcmVtb3ZlICYgZm9yZ2V0XG5cdHVuY2FjaGU6IGZ1bmN0aW9uKCB2YXJfYXJncyApIHtcblxuXHRcdHZhciBvYmplY3RzID0gdGhpcy5fb2JqZWN0cyxcblx0XHRcdG5PYmplY3RzID0gb2JqZWN0cy5sZW5ndGgsXG5cdFx0XHRuQ2FjaGVkT2JqZWN0cyA9IHRoaXMubkNhY2hlZE9iamVjdHNfLFxuXHRcdFx0aW5kaWNlc0J5VVVJRCA9IHRoaXMuX2luZGljZXNCeVVVSUQsXG5cdFx0XHRiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzLFxuXHRcdFx0bkJpbmRpbmdzID0gYmluZGluZ3MubGVuZ3RoO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0dmFyIG9iamVjdCA9IGFyZ3VtZW50c1sgaSBdLFxuXHRcdFx0XHR1dWlkID0gb2JqZWN0LnV1aWQsXG5cdFx0XHRcdGluZGV4ID0gaW5kaWNlc0J5VVVJRFsgdXVpZCBdO1xuXG5cdFx0XHRpZiAoIGluZGV4ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0ZGVsZXRlIGluZGljZXNCeVVVSURbIHV1aWQgXTtcblxuXHRcdFx0XHRpZiAoIGluZGV4IDwgbkNhY2hlZE9iamVjdHMgKSB7XG5cblx0XHRcdFx0XHQvLyBvYmplY3QgaXMgY2FjaGVkLCBzaHJpbmsgdGhlIENBQ0hFRCByZWdpb25cblxuXHRcdFx0XHRcdHZhciBmaXJzdEFjdGl2ZUluZGV4ID0gLS0gbkNhY2hlZE9iamVjdHMsXG5cdFx0XHRcdFx0XHRsYXN0Q2FjaGVkT2JqZWN0ID0gb2JqZWN0c1sgZmlyc3RBY3RpdmVJbmRleCBdLFxuXHRcdFx0XHRcdFx0bGFzdEluZGV4ID0gLS0gbk9iamVjdHMsXG5cdFx0XHRcdFx0XHRsYXN0T2JqZWN0ID0gb2JqZWN0c1sgbGFzdEluZGV4IF07XG5cblx0XHRcdFx0XHQvLyBsYXN0IGNhY2hlZCBvYmplY3QgdGFrZXMgdGhpcyBvYmplY3QncyBwbGFjZVxuXHRcdFx0XHRcdGluZGljZXNCeVVVSURbIGxhc3RDYWNoZWRPYmplY3QudXVpZCBdID0gaW5kZXg7XG5cdFx0XHRcdFx0b2JqZWN0c1sgaW5kZXggXSA9IGxhc3RDYWNoZWRPYmplY3Q7XG5cblx0XHRcdFx0XHQvLyBsYXN0IG9iamVjdCBnb2VzIHRvIHRoZSBhY3RpdmF0ZWQgc2xvdCBhbmQgcG9wXG5cdFx0XHRcdFx0aW5kaWNlc0J5VVVJRFsgbGFzdE9iamVjdC51dWlkIF0gPSBmaXJzdEFjdGl2ZUluZGV4O1xuXHRcdFx0XHRcdG9iamVjdHNbIGZpcnN0QWN0aXZlSW5kZXggXSA9IGxhc3RPYmplY3Q7XG5cdFx0XHRcdFx0b2JqZWN0cy5wb3AoKTtcblxuXHRcdFx0XHRcdC8vIGFjY291bnRpbmcgaXMgZG9uZSwgbm93IGRvIHRoZSBzYW1lIGZvciBhbGwgYmluZGluZ3NcblxuXHRcdFx0XHRcdGZvciAoIHZhciBqID0gMCwgbSA9IG5CaW5kaW5nczsgaiAhPT0gbTsgKysgaiApIHtcblxuXHRcdFx0XHRcdFx0dmFyIGJpbmRpbmdzRm9yUGF0aCA9IGJpbmRpbmdzWyBqIF0sXG5cdFx0XHRcdFx0XHRcdGxhc3RDYWNoZWQgPSBiaW5kaW5nc0ZvclBhdGhbIGZpcnN0QWN0aXZlSW5kZXggXSxcblx0XHRcdFx0XHRcdFx0bGFzdCA9IGJpbmRpbmdzRm9yUGF0aFsgbGFzdEluZGV4IF07XG5cblx0XHRcdFx0XHRcdGJpbmRpbmdzRm9yUGF0aFsgaW5kZXggXSA9IGxhc3RDYWNoZWQ7XG5cdFx0XHRcdFx0XHRiaW5kaW5nc0ZvclBhdGhbIGZpcnN0QWN0aXZlSW5kZXggXSA9IGxhc3Q7XG5cdFx0XHRcdFx0XHRiaW5kaW5nc0ZvclBhdGgucG9wKCk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdC8vIG9iamVjdCBpcyBhY3RpdmUsIGp1c3Qgc3dhcCB3aXRoIHRoZSBsYXN0IGFuZCBwb3BcblxuXHRcdFx0XHRcdHZhciBsYXN0SW5kZXggPSAtLSBuT2JqZWN0cyxcblx0XHRcdFx0XHRcdGxhc3RPYmplY3QgPSBvYmplY3RzWyBsYXN0SW5kZXggXTtcblxuXHRcdFx0XHRcdGluZGljZXNCeVVVSURbIGxhc3RPYmplY3QudXVpZCBdID0gaW5kZXg7XG5cdFx0XHRcdFx0b2JqZWN0c1sgaW5kZXggXSA9IGxhc3RPYmplY3Q7XG5cdFx0XHRcdFx0b2JqZWN0cy5wb3AoKTtcblxuXHRcdFx0XHRcdC8vIGFjY291bnRpbmcgaXMgZG9uZSwgbm93IGRvIHRoZSBzYW1lIGZvciBhbGwgYmluZGluZ3NcblxuXHRcdFx0XHRcdGZvciAoIHZhciBqID0gMCwgbSA9IG5CaW5kaW5nczsgaiAhPT0gbTsgKysgaiApIHtcblxuXHRcdFx0XHRcdFx0dmFyIGJpbmRpbmdzRm9yUGF0aCA9IGJpbmRpbmdzWyBqIF07XG5cblx0XHRcdFx0XHRcdGJpbmRpbmdzRm9yUGF0aFsgaW5kZXggXSA9IGJpbmRpbmdzRm9yUGF0aFsgbGFzdEluZGV4IF07XG5cdFx0XHRcdFx0XHRiaW5kaW5nc0ZvclBhdGgucG9wKCk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSAvLyBjYWNoZWQgb3IgYWN0aXZlXG5cblx0XHRcdH0gLy8gaWYgb2JqZWN0IGlzIGtub3duXG5cblx0XHR9IC8vIGZvciBhcmd1bWVudHNcblxuXHRcdHRoaXMubkNhY2hlZE9iamVjdHNfID0gbkNhY2hlZE9iamVjdHM7XG5cblx0fSxcblxuXHQvLyBJbnRlcm5hbCBpbnRlcmZhY2UgdXNlZCBieSBiZWZyaWVuZGVkIFByb3BlcnR5QmluZGluZy5Db21wb3NpdGU6XG5cblx0c3Vic2NyaWJlXzogZnVuY3Rpb24gKCBwYXRoLCBwYXJzZWRQYXRoICkge1xuXG5cdFx0Ly8gcmV0dXJucyBhbiBhcnJheSBvZiBiaW5kaW5ncyBmb3IgdGhlIGdpdmVuIHBhdGggdGhhdCBpcyBjaGFuZ2VkXG5cdFx0Ly8gYWNjb3JkaW5nIHRvIHRoZSBjb250YWluZWQgb2JqZWN0cyBpbiB0aGUgZ3JvdXBcblxuXHRcdHZhciBpbmRpY2VzQnlQYXRoID0gdGhpcy5fYmluZGluZ3NJbmRpY2VzQnlQYXRoLFxuXHRcdFx0aW5kZXggPSBpbmRpY2VzQnlQYXRoWyBwYXRoIF0sXG5cdFx0XHRiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzO1xuXG5cdFx0aWYgKCBpbmRleCAhPT0gdW5kZWZpbmVkICkgcmV0dXJuIGJpbmRpbmdzWyBpbmRleCBdO1xuXG5cdFx0dmFyIHBhdGhzID0gdGhpcy5fcGF0aHMsXG5cdFx0XHRwYXJzZWRQYXRocyA9IHRoaXMuX3BhcnNlZFBhdGhzLFxuXHRcdFx0b2JqZWN0cyA9IHRoaXMuX29iamVjdHMsXG5cdFx0XHRuT2JqZWN0cyA9IG9iamVjdHMubGVuZ3RoLFxuXHRcdFx0bkNhY2hlZE9iamVjdHMgPSB0aGlzLm5DYWNoZWRPYmplY3RzXyxcblx0XHRcdGJpbmRpbmdzRm9yUGF0aCA9IG5ldyBBcnJheSggbk9iamVjdHMgKTtcblxuXHRcdGluZGV4ID0gYmluZGluZ3MubGVuZ3RoO1xuXG5cdFx0aW5kaWNlc0J5UGF0aFsgcGF0aCBdID0gaW5kZXg7XG5cblx0XHRwYXRocy5wdXNoKCBwYXRoICk7XG5cdFx0cGFyc2VkUGF0aHMucHVzaCggcGFyc2VkUGF0aCApO1xuXHRcdGJpbmRpbmdzLnB1c2goIGJpbmRpbmdzRm9yUGF0aCApO1xuXG5cdFx0Zm9yICggdmFyIGkgPSBuQ2FjaGVkT2JqZWN0cywgbiA9IG9iamVjdHMubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHR2YXIgb2JqZWN0ID0gb2JqZWN0c1sgaSBdO1xuXHRcdFx0YmluZGluZ3NGb3JQYXRoWyBpIF0gPSBuZXcgUHJvcGVydHlCaW5kaW5nKCBvYmplY3QsIHBhdGgsIHBhcnNlZFBhdGggKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBiaW5kaW5nc0ZvclBhdGg7XG5cblx0fSxcblxuXHR1bnN1YnNjcmliZV86IGZ1bmN0aW9uICggcGF0aCApIHtcblxuXHRcdC8vIHRlbGxzIHRoZSBncm91cCB0byBmb3JnZXQgYWJvdXQgYSBwcm9wZXJ0eSBwYXRoIGFuZCBubyBsb25nZXJcblx0XHQvLyB1cGRhdGUgdGhlIGFycmF5IHByZXZpb3VzbHkgb2J0YWluZWQgd2l0aCAnc3Vic2NyaWJlXydcblxuXHRcdHZhciBpbmRpY2VzQnlQYXRoID0gdGhpcy5fYmluZGluZ3NJbmRpY2VzQnlQYXRoLFxuXHRcdFx0aW5kZXggPSBpbmRpY2VzQnlQYXRoWyBwYXRoIF07XG5cblx0XHRpZiAoIGluZGV4ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHZhciBwYXRocyA9IHRoaXMuX3BhdGhzLFxuXHRcdFx0XHRwYXJzZWRQYXRocyA9IHRoaXMuX3BhcnNlZFBhdGhzLFxuXHRcdFx0XHRiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzLFxuXHRcdFx0XHRsYXN0QmluZGluZ3NJbmRleCA9IGJpbmRpbmdzLmxlbmd0aCAtIDEsXG5cdFx0XHRcdGxhc3RCaW5kaW5ncyA9IGJpbmRpbmdzWyBsYXN0QmluZGluZ3NJbmRleCBdLFxuXHRcdFx0XHRsYXN0QmluZGluZ3NQYXRoID0gcGF0aFsgbGFzdEJpbmRpbmdzSW5kZXggXTtcblxuXHRcdFx0aW5kaWNlc0J5UGF0aFsgbGFzdEJpbmRpbmdzUGF0aCBdID0gaW5kZXg7XG5cblx0XHRcdGJpbmRpbmdzWyBpbmRleCBdID0gbGFzdEJpbmRpbmdzO1xuXHRcdFx0YmluZGluZ3MucG9wKCk7XG5cblx0XHRcdHBhcnNlZFBhdGhzWyBpbmRleCBdID0gcGFyc2VkUGF0aHNbIGxhc3RCaW5kaW5nc0luZGV4IF07XG5cdFx0XHRwYXJzZWRQYXRocy5wb3AoKTtcblxuXHRcdFx0cGF0aHNbIGluZGV4IF0gPSBwYXRoc1sgbGFzdEJpbmRpbmdzSW5kZXggXTtcblx0XHRcdHBhdGhzLnBvcCgpO1xuXG5cdFx0fVxuXG5cdH1cblxufSApO1xuXG4vKipcbiAqXG4gKiBBY3Rpb24gcHJvdmlkZWQgYnkgQW5pbWF0aW9uTWl4ZXIgZm9yIHNjaGVkdWxpbmcgY2xpcCBwbGF5YmFjayBvbiBzcGVjaWZpY1xuICogb2JqZWN0cy5cbiAqXG4gKiBAYXV0aG9yIEJlbiBIb3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvL1xuICogQGF1dGhvciBEYXZpZCBTYXJubyAvIGh0dHA6Ly9saWdodGhhdXMudXMvXG4gKiBAYXV0aG9yIHRzY2h3XG4gKlxuICovXG5cbmZ1bmN0aW9uIEFuaW1hdGlvbkFjdGlvbiggbWl4ZXIsIGNsaXAsIGxvY2FsUm9vdCApIHtcblxuXHR0aGlzLl9taXhlciA9IG1peGVyO1xuXHR0aGlzLl9jbGlwID0gY2xpcDtcblx0dGhpcy5fbG9jYWxSb290ID0gbG9jYWxSb290IHx8IG51bGw7XG5cblx0dmFyIHRyYWNrcyA9IGNsaXAudHJhY2tzLFxuXHRcdG5UcmFja3MgPSB0cmFja3MubGVuZ3RoLFxuXHRcdGludGVycG9sYW50cyA9IG5ldyBBcnJheSggblRyYWNrcyApO1xuXG5cdHZhciBpbnRlcnBvbGFudFNldHRpbmdzID0ge1xuXHRcdFx0ZW5kaW5nU3RhcnQ6IFx0WmVyb0N1cnZhdHVyZUVuZGluZyxcblx0XHRcdGVuZGluZ0VuZDpcdFx0WmVyb0N1cnZhdHVyZUVuZGluZ1xuXHR9O1xuXG5cdGZvciAoIHZhciBpID0gMDsgaSAhPT0gblRyYWNrczsgKysgaSApIHtcblxuXHRcdHZhciBpbnRlcnBvbGFudCA9IHRyYWNrc1sgaSBdLmNyZWF0ZUludGVycG9sYW50KCBudWxsICk7XG5cdFx0aW50ZXJwb2xhbnRzWyBpIF0gPSBpbnRlcnBvbGFudDtcblx0XHRpbnRlcnBvbGFudC5zZXR0aW5ncyA9IGludGVycG9sYW50U2V0dGluZ3M7XG5cblx0fVxuXG5cdHRoaXMuX2ludGVycG9sYW50U2V0dGluZ3MgPSBpbnRlcnBvbGFudFNldHRpbmdzO1xuXG5cdHRoaXMuX2ludGVycG9sYW50cyA9IGludGVycG9sYW50cztcdC8vIGJvdW5kIGJ5IHRoZSBtaXhlclxuXG5cdC8vIGluc2lkZTogUHJvcGVydHlNaXhlciAobWFuYWdlZCBieSB0aGUgbWl4ZXIpXG5cdHRoaXMuX3Byb3BlcnR5QmluZGluZ3MgPSBuZXcgQXJyYXkoIG5UcmFja3MgKTtcblxuXHR0aGlzLl9jYWNoZUluZGV4ID0gbnVsbDtcdFx0XHQvLyBmb3IgdGhlIG1lbW9yeSBtYW5hZ2VyXG5cdHRoaXMuX2J5Q2xpcENhY2hlSW5kZXggPSBudWxsO1x0XHQvLyBmb3IgdGhlIG1lbW9yeSBtYW5hZ2VyXG5cblx0dGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQgPSBudWxsO1xuXHR0aGlzLl93ZWlnaHRJbnRlcnBvbGFudCA9IG51bGw7XG5cblx0dGhpcy5sb29wID0gTG9vcFJlcGVhdDtcblx0dGhpcy5fbG9vcENvdW50ID0gLTE7XG5cblx0Ly8gZ2xvYmFsIG1peGVyIHRpbWUgd2hlbiB0aGUgYWN0aW9uIGlzIHRvIGJlIHN0YXJ0ZWRcblx0Ly8gaXQncyBzZXQgYmFjayB0byAnbnVsbCcgdXBvbiBzdGFydCBvZiB0aGUgYWN0aW9uXG5cdHRoaXMuX3N0YXJ0VGltZSA9IG51bGw7XG5cblx0Ly8gc2NhbGVkIGxvY2FsIHRpbWUgb2YgdGhlIGFjdGlvblxuXHQvLyBnZXRzIGNsYW1wZWQgb3Igd3JhcHBlZCB0byAwLi5jbGlwLmR1cmF0aW9uIGFjY29yZGluZyB0byBsb29wXG5cdHRoaXMudGltZSA9IDA7XG5cblx0dGhpcy50aW1lU2NhbGUgPSAxO1xuXHR0aGlzLl9lZmZlY3RpdmVUaW1lU2NhbGUgPSAxO1xuXG5cdHRoaXMud2VpZ2h0ID0gMTtcblx0dGhpcy5fZWZmZWN0aXZlV2VpZ2h0ID0gMTtcblxuXHR0aGlzLnJlcGV0aXRpb25zID0gSW5maW5pdHk7IFx0XHQvLyBuby4gb2YgcmVwZXRpdGlvbnMgd2hlbiBsb29waW5nXG5cblx0dGhpcy5wYXVzZWQgPSBmYWxzZTtcdFx0XHRcdC8vIHRydWUgLT4gemVybyBlZmZlY3RpdmUgdGltZSBzY2FsZVxuXHR0aGlzLmVuYWJsZWQgPSB0cnVlO1x0XHRcdFx0Ly8gZmFsc2UgLT4gemVybyBlZmZlY3RpdmUgd2VpZ2h0XG5cblx0dGhpcy5jbGFtcFdoZW5GaW5pc2hlZCBcdD0gZmFsc2U7XHQvLyBrZWVwIGZlZWRpbmcgdGhlIGxhc3QgZnJhbWU/XG5cblx0dGhpcy56ZXJvU2xvcGVBdFN0YXJ0IFx0PSB0cnVlO1x0XHQvLyBmb3Igc21vb3RoIGludGVycG9sYXRpb24gdy9vIHNlcGFyYXRlXG5cdHRoaXMuemVyb1Nsb3BlQXRFbmRcdFx0PSB0cnVlO1x0XHQvLyBjbGlwcyBmb3Igc3RhcnQsIGxvb3AgYW5kIGVuZFxuXG59XG5cbk9iamVjdC5hc3NpZ24oIEFuaW1hdGlvbkFjdGlvbi5wcm90b3R5cGUsIHtcblxuXHQvLyBTdGF0ZSAmIFNjaGVkdWxpbmdcblxuXHRwbGF5OiBmdW5jdGlvbigpIHtcblxuXHRcdHRoaXMuX21peGVyLl9hY3RpdmF0ZUFjdGlvbiggdGhpcyApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzdG9wOiBmdW5jdGlvbigpIHtcblxuXHRcdHRoaXMuX21peGVyLl9kZWFjdGl2YXRlQWN0aW9uKCB0aGlzICk7XG5cblx0XHRyZXR1cm4gdGhpcy5yZXNldCgpO1xuXG5cdH0sXG5cblx0cmVzZXQ6IGZ1bmN0aW9uKCkge1xuXG5cdFx0dGhpcy5wYXVzZWQgPSBmYWxzZTtcblx0XHR0aGlzLmVuYWJsZWQgPSB0cnVlO1xuXG5cdFx0dGhpcy50aW1lID0gMDtcdFx0XHQvLyByZXN0YXJ0IGNsaXBcblx0XHR0aGlzLl9sb29wQ291bnQgPSAtMTtcdC8vIGZvcmdldCBwcmV2aW91cyBsb29wc1xuXHRcdHRoaXMuX3N0YXJ0VGltZSA9IG51bGw7XHQvLyBmb3JnZXQgc2NoZWR1bGluZ1xuXG5cdFx0cmV0dXJuIHRoaXMuc3RvcEZhZGluZygpLnN0b3BXYXJwaW5nKCk7XG5cblx0fSxcblxuXHRpc1J1bm5pbmc6IGZ1bmN0aW9uKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZW5hYmxlZCAmJiAhIHRoaXMucGF1c2VkICYmIHRoaXMudGltZVNjYWxlICE9PSAwICYmXG5cdFx0XHRcdHRoaXMuX3N0YXJ0VGltZSA9PT0gbnVsbCAmJiB0aGlzLl9taXhlci5faXNBY3RpdmVBY3Rpb24oIHRoaXMgKTtcblxuXHR9LFxuXG5cdC8vIHJldHVybiB0cnVlIHdoZW4gcGxheSBoYXMgYmVlbiBjYWxsZWRcblx0aXNTY2hlZHVsZWQ6IGZ1bmN0aW9uKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuX21peGVyLl9pc0FjdGl2ZUFjdGlvbiggdGhpcyApO1xuXG5cdH0sXG5cblx0c3RhcnRBdDogZnVuY3Rpb24oIHRpbWUgKSB7XG5cblx0XHR0aGlzLl9zdGFydFRpbWUgPSB0aW1lO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRMb29wOiBmdW5jdGlvbiggbW9kZSwgcmVwZXRpdGlvbnMgKSB7XG5cblx0XHR0aGlzLmxvb3AgPSBtb2RlO1xuXHRcdHRoaXMucmVwZXRpdGlvbnMgPSByZXBldGl0aW9ucztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Ly8gV2VpZ2h0XG5cblx0Ly8gc2V0IHRoZSB3ZWlnaHQgc3RvcHBpbmcgYW55IHNjaGVkdWxlZCBmYWRpbmdcblx0Ly8gYWx0aG91Z2ggLmVuYWJsZWQgPSBmYWxzZSB5aWVsZHMgYW4gZWZmZWN0aXZlIHdlaWdodCBvZiB6ZXJvLCB0aGlzXG5cdC8vIG1ldGhvZCBkb2VzICpub3QqIGNoYW5nZSAuZW5hYmxlZCwgYmVjYXVzZSBpdCB3b3VsZCBiZSBjb25mdXNpbmdcblx0c2V0RWZmZWN0aXZlV2VpZ2h0OiBmdW5jdGlvbiggd2VpZ2h0ICkge1xuXG5cdFx0dGhpcy53ZWlnaHQgPSB3ZWlnaHQ7XG5cblx0XHQvLyBub3RlOiBzYW1lIGxvZ2ljIGFzIHdoZW4gdXBkYXRlZCBhdCBydW50aW1lXG5cdFx0dGhpcy5fZWZmZWN0aXZlV2VpZ2h0ID0gdGhpcy5lbmFibGVkID8gd2VpZ2h0IDogMDtcblxuXHRcdHJldHVybiB0aGlzLnN0b3BGYWRpbmcoKTtcblxuXHR9LFxuXG5cdC8vIHJldHVybiB0aGUgd2VpZ2h0IGNvbnNpZGVyaW5nIGZhZGluZyBhbmQgLmVuYWJsZWRcblx0Z2V0RWZmZWN0aXZlV2VpZ2h0OiBmdW5jdGlvbigpIHtcblxuXHRcdHJldHVybiB0aGlzLl9lZmZlY3RpdmVXZWlnaHQ7XG5cblx0fSxcblxuXHRmYWRlSW46IGZ1bmN0aW9uKCBkdXJhdGlvbiApIHtcblxuXHRcdHJldHVybiB0aGlzLl9zY2hlZHVsZUZhZGluZyggZHVyYXRpb24sIDAsIDEgKTtcblxuXHR9LFxuXG5cdGZhZGVPdXQ6IGZ1bmN0aW9uKCBkdXJhdGlvbiApIHtcblxuXHRcdHJldHVybiB0aGlzLl9zY2hlZHVsZUZhZGluZyggZHVyYXRpb24sIDEsIDAgKTtcblxuXHR9LFxuXG5cdGNyb3NzRmFkZUZyb206IGZ1bmN0aW9uKCBmYWRlT3V0QWN0aW9uLCBkdXJhdGlvbiwgd2FycCApIHtcblxuXHRcdGZhZGVPdXRBY3Rpb24uZmFkZU91dCggZHVyYXRpb24gKTtcblx0XHR0aGlzLmZhZGVJbiggZHVyYXRpb24gKTtcblxuXHRcdGlmKCB3YXJwICkge1xuXG5cdFx0XHR2YXIgZmFkZUluRHVyYXRpb24gPSB0aGlzLl9jbGlwLmR1cmF0aW9uLFxuXHRcdFx0XHRmYWRlT3V0RHVyYXRpb24gPSBmYWRlT3V0QWN0aW9uLl9jbGlwLmR1cmF0aW9uLFxuXG5cdFx0XHRcdHN0YXJ0RW5kUmF0aW8gPSBmYWRlT3V0RHVyYXRpb24gLyBmYWRlSW5EdXJhdGlvbixcblx0XHRcdFx0ZW5kU3RhcnRSYXRpbyA9IGZhZGVJbkR1cmF0aW9uIC8gZmFkZU91dER1cmF0aW9uO1xuXG5cdFx0XHRmYWRlT3V0QWN0aW9uLndhcnAoIDEuMCwgc3RhcnRFbmRSYXRpbywgZHVyYXRpb24gKTtcblx0XHRcdHRoaXMud2FycCggZW5kU3RhcnRSYXRpbywgMS4wLCBkdXJhdGlvbiApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjcm9zc0ZhZGVUbzogZnVuY3Rpb24oIGZhZGVJbkFjdGlvbiwgZHVyYXRpb24sIHdhcnAgKSB7XG5cblx0XHRyZXR1cm4gZmFkZUluQWN0aW9uLmNyb3NzRmFkZUZyb20oIHRoaXMsIGR1cmF0aW9uLCB3YXJwICk7XG5cblx0fSxcblxuXHRzdG9wRmFkaW5nOiBmdW5jdGlvbigpIHtcblxuXHRcdHZhciB3ZWlnaHRJbnRlcnBvbGFudCA9IHRoaXMuX3dlaWdodEludGVycG9sYW50O1xuXG5cdFx0aWYgKCB3ZWlnaHRJbnRlcnBvbGFudCAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5fd2VpZ2h0SW50ZXJwb2xhbnQgPSBudWxsO1xuXHRcdFx0dGhpcy5fbWl4ZXIuX3Rha2VCYWNrQ29udHJvbEludGVycG9sYW50KCB3ZWlnaHRJbnRlcnBvbGFudCApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHQvLyBUaW1lIFNjYWxlIENvbnRyb2xcblxuXHQvLyBzZXQgdGhlIHRpbWUgc2NhbGUgc3RvcHBpbmcgYW55IHNjaGVkdWxlZCB3YXJwaW5nXG5cdC8vIGFsdGhvdWdoIC5wYXVzZWQgPSB0cnVlIHlpZWxkcyBhbiBlZmZlY3RpdmUgdGltZSBzY2FsZSBvZiB6ZXJvLCB0aGlzXG5cdC8vIG1ldGhvZCBkb2VzICpub3QqIGNoYW5nZSAucGF1c2VkLCBiZWNhdXNlIGl0IHdvdWxkIGJlIGNvbmZ1c2luZ1xuXHRzZXRFZmZlY3RpdmVUaW1lU2NhbGU6IGZ1bmN0aW9uKCB0aW1lU2NhbGUgKSB7XG5cblx0XHR0aGlzLnRpbWVTY2FsZSA9IHRpbWVTY2FsZTtcblx0XHR0aGlzLl9lZmZlY3RpdmVUaW1lU2NhbGUgPSB0aGlzLnBhdXNlZCA/IDAgOnRpbWVTY2FsZTtcblxuXHRcdHJldHVybiB0aGlzLnN0b3BXYXJwaW5nKCk7XG5cblx0fSxcblxuXHQvLyByZXR1cm4gdGhlIHRpbWUgc2NhbGUgY29uc2lkZXJpbmcgd2FycGluZyBhbmQgLnBhdXNlZFxuXHRnZXRFZmZlY3RpdmVUaW1lU2NhbGU6IGZ1bmN0aW9uKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuX2VmZmVjdGl2ZVRpbWVTY2FsZTtcblxuXHR9LFxuXG5cdHNldER1cmF0aW9uOiBmdW5jdGlvbiggZHVyYXRpb24gKSB7XG5cblx0XHR0aGlzLnRpbWVTY2FsZSA9IHRoaXMuX2NsaXAuZHVyYXRpb24gLyBkdXJhdGlvbjtcblxuXHRcdHJldHVybiB0aGlzLnN0b3BXYXJwaW5nKCk7XG5cblx0fSxcblxuXHRzeW5jV2l0aDogZnVuY3Rpb24oIGFjdGlvbiApIHtcblxuXHRcdHRoaXMudGltZSA9IGFjdGlvbi50aW1lO1xuXHRcdHRoaXMudGltZVNjYWxlID0gYWN0aW9uLnRpbWVTY2FsZTtcblxuXHRcdHJldHVybiB0aGlzLnN0b3BXYXJwaW5nKCk7XG5cblx0fSxcblxuXHRoYWx0OiBmdW5jdGlvbiggZHVyYXRpb24gKSB7XG5cblx0XHRyZXR1cm4gdGhpcy53YXJwKCB0aGlzLl9lZmZlY3RpdmVUaW1lU2NhbGUsIDAsIGR1cmF0aW9uICk7XG5cblx0fSxcblxuXHR3YXJwOiBmdW5jdGlvbiggc3RhcnRUaW1lU2NhbGUsIGVuZFRpbWVTY2FsZSwgZHVyYXRpb24gKSB7XG5cblx0XHR2YXIgbWl4ZXIgPSB0aGlzLl9taXhlciwgbm93ID0gbWl4ZXIudGltZSxcblx0XHRcdGludGVycG9sYW50ID0gdGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQsXG5cblx0XHRcdHRpbWVTY2FsZSA9IHRoaXMudGltZVNjYWxlO1xuXG5cdFx0aWYgKCBpbnRlcnBvbGFudCA9PT0gbnVsbCApIHtcblxuXHRcdFx0aW50ZXJwb2xhbnQgPSBtaXhlci5fbGVuZENvbnRyb2xJbnRlcnBvbGFudCgpO1xuXHRcdFx0dGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQgPSBpbnRlcnBvbGFudDtcblxuXHRcdH1cblxuXHRcdHZhciB0aW1lcyA9IGludGVycG9sYW50LnBhcmFtZXRlclBvc2l0aW9ucyxcblx0XHRcdHZhbHVlcyA9IGludGVycG9sYW50LnNhbXBsZVZhbHVlcztcblxuXHRcdHRpbWVzWyAwIF0gPSBub3c7XG5cdFx0dGltZXNbIDEgXSA9IG5vdyArIGR1cmF0aW9uO1xuXG5cdFx0dmFsdWVzWyAwIF0gPSBzdGFydFRpbWVTY2FsZSAvIHRpbWVTY2FsZTtcblx0XHR2YWx1ZXNbIDEgXSA9IGVuZFRpbWVTY2FsZSAvIHRpbWVTY2FsZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c3RvcFdhcnBpbmc6IGZ1bmN0aW9uKCkge1xuXG5cdFx0dmFyIHRpbWVTY2FsZUludGVycG9sYW50ID0gdGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQ7XG5cblx0XHRpZiAoIHRpbWVTY2FsZUludGVycG9sYW50ICE9PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLl90aW1lU2NhbGVJbnRlcnBvbGFudCA9IG51bGw7XG5cdFx0XHR0aGlzLl9taXhlci5fdGFrZUJhY2tDb250cm9sSW50ZXJwb2xhbnQoIHRpbWVTY2FsZUludGVycG9sYW50ICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdC8vIE9iamVjdCBBY2Nlc3NvcnNcblxuXHRnZXRNaXhlcjogZnVuY3Rpb24oKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5fbWl4ZXI7XG5cblx0fSxcblxuXHRnZXRDbGlwOiBmdW5jdGlvbigpIHtcblxuXHRcdHJldHVybiB0aGlzLl9jbGlwO1xuXG5cdH0sXG5cblx0Z2V0Um9vdDogZnVuY3Rpb24oKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5fbG9jYWxSb290IHx8IHRoaXMuX21peGVyLl9yb290O1xuXG5cdH0sXG5cblx0Ly8gSW50ZXJuYVxuXG5cdF91cGRhdGU6IGZ1bmN0aW9uKCB0aW1lLCBkZWx0YVRpbWUsIHRpbWVEaXJlY3Rpb24sIGFjY3VJbmRleCApIHtcblxuXHRcdC8vIGNhbGxlZCBieSB0aGUgbWl4ZXJcblxuXHRcdGlmICggISB0aGlzLmVuYWJsZWQgKSB7XG5cblx0XHRcdC8vIGNhbGwgLl91cGRhdGVXZWlnaHQoKSB0byB1cGRhdGUgLl9lZmZlY3RpdmVXZWlnaHRcblxuXHRcdFx0dGhpcy5fdXBkYXRlV2VpZ2h0KCB0aW1lICk7XG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHR2YXIgc3RhcnRUaW1lID0gdGhpcy5fc3RhcnRUaW1lO1xuXG5cdFx0aWYgKCBzdGFydFRpbWUgIT09IG51bGwgKSB7XG5cblx0XHRcdC8vIGNoZWNrIGZvciBzY2hlZHVsZWQgc3RhcnQgb2YgYWN0aW9uXG5cblx0XHRcdHZhciB0aW1lUnVubmluZyA9ICggdGltZSAtIHN0YXJ0VGltZSApICogdGltZURpcmVjdGlvbjtcblx0XHRcdGlmICggdGltZVJ1bm5pbmcgPCAwIHx8IHRpbWVEaXJlY3Rpb24gPT09IDAgKSB7XG5cblx0XHRcdFx0cmV0dXJuOyAvLyB5ZXQgdG8gY29tZSAvIGRvbid0IGRlY2lkZSB3aGVuIGRlbHRhID0gMFxuXG5cdFx0XHR9XG5cblx0XHRcdC8vIHN0YXJ0XG5cblx0XHRcdHRoaXMuX3N0YXJ0VGltZSA9IG51bGw7IC8vIHVuc2NoZWR1bGVcblx0XHRcdGRlbHRhVGltZSA9IHRpbWVEaXJlY3Rpb24gKiB0aW1lUnVubmluZztcblxuXHRcdH1cblxuXHRcdC8vIGFwcGx5IHRpbWUgc2NhbGUgYW5kIGFkdmFuY2UgdGltZVxuXG5cdFx0ZGVsdGFUaW1lICo9IHRoaXMuX3VwZGF0ZVRpbWVTY2FsZSggdGltZSApO1xuXHRcdHZhciBjbGlwVGltZSA9IHRoaXMuX3VwZGF0ZVRpbWUoIGRlbHRhVGltZSApO1xuXG5cdFx0Ly8gbm90ZTogX3VwZGF0ZVRpbWUgbWF5IGRpc2FibGUgdGhlIGFjdGlvbiByZXN1bHRpbmcgaW5cblx0XHQvLyBhbiBlZmZlY3RpdmUgd2VpZ2h0IG9mIDBcblxuXHRcdHZhciB3ZWlnaHQgPSB0aGlzLl91cGRhdGVXZWlnaHQoIHRpbWUgKTtcblxuXHRcdGlmICggd2VpZ2h0ID4gMCApIHtcblxuXHRcdFx0dmFyIGludGVycG9sYW50cyA9IHRoaXMuX2ludGVycG9sYW50cztcblx0XHRcdHZhciBwcm9wZXJ0eU1peGVycyA9IHRoaXMuX3Byb3BlcnR5QmluZGluZ3M7XG5cblx0XHRcdGZvciAoIHZhciBqID0gMCwgbSA9IGludGVycG9sYW50cy5sZW5ndGg7IGogIT09IG07ICsrIGogKSB7XG5cblx0XHRcdFx0aW50ZXJwb2xhbnRzWyBqIF0uZXZhbHVhdGUoIGNsaXBUaW1lICk7XG5cdFx0XHRcdHByb3BlcnR5TWl4ZXJzWyBqIF0uYWNjdW11bGF0ZSggYWNjdUluZGV4LCB3ZWlnaHQgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH0sXG5cblx0X3VwZGF0ZVdlaWdodDogZnVuY3Rpb24oIHRpbWUgKSB7XG5cblx0XHR2YXIgd2VpZ2h0ID0gMDtcblxuXHRcdGlmICggdGhpcy5lbmFibGVkICkge1xuXG5cdFx0XHR3ZWlnaHQgPSB0aGlzLndlaWdodDtcblx0XHRcdHZhciBpbnRlcnBvbGFudCA9IHRoaXMuX3dlaWdodEludGVycG9sYW50O1xuXG5cdFx0XHRpZiAoIGludGVycG9sYW50ICE9PSBudWxsICkge1xuXG5cdFx0XHRcdHZhciBpbnRlcnBvbGFudFZhbHVlID0gaW50ZXJwb2xhbnQuZXZhbHVhdGUoIHRpbWUgKVsgMCBdO1xuXG5cdFx0XHRcdHdlaWdodCAqPSBpbnRlcnBvbGFudFZhbHVlO1xuXG5cdFx0XHRcdGlmICggdGltZSA+IGludGVycG9sYW50LnBhcmFtZXRlclBvc2l0aW9uc1sgMSBdICkge1xuXG5cdFx0XHRcdFx0dGhpcy5zdG9wRmFkaW5nKCk7XG5cblx0XHRcdFx0XHRpZiAoIGludGVycG9sYW50VmFsdWUgPT09IDAgKSB7XG5cblx0XHRcdFx0XHRcdC8vIGZhZGVkIG91dCwgZGlzYWJsZVxuXHRcdFx0XHRcdFx0dGhpcy5lbmFibGVkID0gZmFsc2U7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHR0aGlzLl9lZmZlY3RpdmVXZWlnaHQgPSB3ZWlnaHQ7XG5cdFx0cmV0dXJuIHdlaWdodDtcblxuXHR9LFxuXG5cdF91cGRhdGVUaW1lU2NhbGU6IGZ1bmN0aW9uKCB0aW1lICkge1xuXG5cdFx0dmFyIHRpbWVTY2FsZSA9IDA7XG5cblx0XHRpZiAoICEgdGhpcy5wYXVzZWQgKSB7XG5cblx0XHRcdHRpbWVTY2FsZSA9IHRoaXMudGltZVNjYWxlO1xuXG5cdFx0XHR2YXIgaW50ZXJwb2xhbnQgPSB0aGlzLl90aW1lU2NhbGVJbnRlcnBvbGFudDtcblxuXHRcdFx0aWYgKCBpbnRlcnBvbGFudCAhPT0gbnVsbCApIHtcblxuXHRcdFx0XHR2YXIgaW50ZXJwb2xhbnRWYWx1ZSA9IGludGVycG9sYW50LmV2YWx1YXRlKCB0aW1lIClbIDAgXTtcblxuXHRcdFx0XHR0aW1lU2NhbGUgKj0gaW50ZXJwb2xhbnRWYWx1ZTtcblxuXHRcdFx0XHRpZiAoIHRpbWUgPiBpbnRlcnBvbGFudC5wYXJhbWV0ZXJQb3NpdGlvbnNbIDEgXSApIHtcblxuXHRcdFx0XHRcdHRoaXMuc3RvcFdhcnBpbmcoKTtcblxuXHRcdFx0XHRcdGlmICggdGltZVNjYWxlID09PSAwICkge1xuXG5cdFx0XHRcdFx0XHQvLyBtb3Rpb24gaGFzIGhhbHRlZCwgcGF1c2Vcblx0XHRcdFx0XHRcdHRoaXMucGF1c2VkID0gdHJ1ZTtcblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdC8vIHdhcnAgZG9uZSAtIGFwcGx5IGZpbmFsIHRpbWUgc2NhbGVcblx0XHRcdFx0XHRcdHRoaXMudGltZVNjYWxlID0gdGltZVNjYWxlO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0dGhpcy5fZWZmZWN0aXZlVGltZVNjYWxlID0gdGltZVNjYWxlO1xuXHRcdHJldHVybiB0aW1lU2NhbGU7XG5cblx0fSxcblxuXHRfdXBkYXRlVGltZTogZnVuY3Rpb24oIGRlbHRhVGltZSApIHtcblxuXHRcdHZhciB0aW1lID0gdGhpcy50aW1lICsgZGVsdGFUaW1lO1xuXG5cdFx0aWYgKCBkZWx0YVRpbWUgPT09IDAgKSByZXR1cm4gdGltZTtcblxuXHRcdHZhciBkdXJhdGlvbiA9IHRoaXMuX2NsaXAuZHVyYXRpb24sXG5cblx0XHRcdGxvb3AgPSB0aGlzLmxvb3AsXG5cdFx0XHRsb29wQ291bnQgPSB0aGlzLl9sb29wQ291bnQ7XG5cblx0XHRpZiAoIGxvb3AgPT09IExvb3BPbmNlICkge1xuXG5cdFx0XHRpZiAoIGxvb3BDb3VudCA9PT0gLTEgKSB7XG5cdFx0XHRcdC8vIGp1c3Qgc3RhcnRlZFxuXG5cdFx0XHRcdHRoaXMuX2xvb3BDb3VudCA9IDA7XG5cdFx0XHRcdHRoaXMuX3NldEVuZGluZ3MoIHRydWUsIHRydWUsIGZhbHNlICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aGFuZGxlX3N0b3A6IHtcblxuXHRcdFx0XHRpZiAoIHRpbWUgPj0gZHVyYXRpb24gKSB7XG5cblx0XHRcdFx0XHR0aW1lID0gZHVyYXRpb247XG5cblx0XHRcdFx0fSBlbHNlIGlmICggdGltZSA8IDAgKSB7XG5cblx0XHRcdFx0XHR0aW1lID0gMDtcblxuXHRcdFx0XHR9IGVsc2UgYnJlYWsgaGFuZGxlX3N0b3A7XG5cblx0XHRcdFx0aWYgKCB0aGlzLmNsYW1wV2hlbkZpbmlzaGVkICkgdGhpcy5wYXVzZWQgPSB0cnVlO1xuXHRcdFx0XHRlbHNlIHRoaXMuZW5hYmxlZCA9IGZhbHNlO1xuXG5cdFx0XHRcdHRoaXMuX21peGVyLmRpc3BhdGNoRXZlbnQoIHtcblx0XHRcdFx0XHR0eXBlOiAnZmluaXNoZWQnLCBhY3Rpb246IHRoaXMsXG5cdFx0XHRcdFx0ZGlyZWN0aW9uOiBkZWx0YVRpbWUgPCAwID8gLTEgOiAxXG5cdFx0XHRcdH0gKTtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHsgLy8gcmVwZXRpdGl2ZSBSZXBlYXQgb3IgUGluZ1BvbmdcblxuXHRcdFx0dmFyIHBpbmdQb25nID0gKCBsb29wID09PSBMb29wUGluZ1BvbmcgKTtcblxuXHRcdFx0aWYgKCBsb29wQ291bnQgPT09IC0xICkge1xuXHRcdFx0XHQvLyBqdXN0IHN0YXJ0ZWRcblxuXHRcdFx0XHRpZiAoIGRlbHRhVGltZSA+PSAwICkge1xuXG5cdFx0XHRcdFx0bG9vcENvdW50ID0gMDtcblxuXHRcdFx0XHRcdHRoaXMuX3NldEVuZGluZ3MoXG5cdFx0XHRcdFx0XHRcdHRydWUsIHRoaXMucmVwZXRpdGlvbnMgPT09IDAsIHBpbmdQb25nICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdC8vIHdoZW4gbG9vcGluZyBpbiByZXZlcnNlIGRpcmVjdGlvbiwgdGhlIGluaXRpYWxcblx0XHRcdFx0XHQvLyB0cmFuc2l0aW9uIHRocm91Z2ggemVybyBjb3VudHMgYXMgYSByZXBldGl0aW9uLFxuXHRcdFx0XHRcdC8vIHNvIGxlYXZlIGxvb3BDb3VudCBhdCAtMVxuXG5cdFx0XHRcdFx0dGhpcy5fc2V0RW5kaW5ncyhcblx0XHRcdFx0XHRcdFx0dGhpcy5yZXBldGl0aW9ucyA9PT0gMCwgdHJ1ZSwgcGluZ1BvbmcgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCB0aW1lID49IGR1cmF0aW9uIHx8IHRpbWUgPCAwICkge1xuXHRcdFx0XHQvLyB3cmFwIGFyb3VuZFxuXG5cdFx0XHRcdHZhciBsb29wRGVsdGEgPSBNYXRoLmZsb29yKCB0aW1lIC8gZHVyYXRpb24gKTsgLy8gc2lnbmVkXG5cdFx0XHRcdHRpbWUgLT0gZHVyYXRpb24gKiBsb29wRGVsdGE7XG5cblx0XHRcdFx0bG9vcENvdW50ICs9IE1hdGguYWJzKCBsb29wRGVsdGEgKTtcblxuXHRcdFx0XHR2YXIgcGVuZGluZyA9IHRoaXMucmVwZXRpdGlvbnMgLSBsb29wQ291bnQ7XG5cblx0XHRcdFx0aWYgKCBwZW5kaW5nIDwgMCApIHtcblx0XHRcdFx0XHQvLyBoYXZlIHRvIHN0b3AgKHN3aXRjaCBzdGF0ZSwgY2xhbXAgdGltZSwgZmlyZSBldmVudClcblxuXHRcdFx0XHRcdGlmICggdGhpcy5jbGFtcFdoZW5GaW5pc2hlZCApIHRoaXMucGF1c2VkID0gdHJ1ZTtcblx0XHRcdFx0XHRlbHNlIHRoaXMuZW5hYmxlZCA9IGZhbHNlO1xuXG5cdFx0XHRcdFx0dGltZSA9IGRlbHRhVGltZSA+IDAgPyBkdXJhdGlvbiA6IDA7XG5cblx0XHRcdFx0XHR0aGlzLl9taXhlci5kaXNwYXRjaEV2ZW50KCB7XG5cdFx0XHRcdFx0XHR0eXBlOiAnZmluaXNoZWQnLCBhY3Rpb246IHRoaXMsXG5cdFx0XHRcdFx0XHRkaXJlY3Rpb246IGRlbHRhVGltZSA+IDAgPyAxIDogLTFcblx0XHRcdFx0XHR9ICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQvLyBrZWVwIHJ1bm5pbmdcblxuXHRcdFx0XHRcdGlmICggcGVuZGluZyA9PT0gMCApIHtcblx0XHRcdFx0XHRcdC8vIGVudGVyaW5nIHRoZSBsYXN0IHJvdW5kXG5cblx0XHRcdFx0XHRcdHZhciBhdFN0YXJ0ID0gZGVsdGFUaW1lIDwgMDtcblx0XHRcdFx0XHRcdHRoaXMuX3NldEVuZGluZ3MoIGF0U3RhcnQsICEgYXRTdGFydCwgcGluZ1BvbmcgKTtcblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdHRoaXMuX3NldEVuZGluZ3MoIGZhbHNlLCBmYWxzZSwgcGluZ1BvbmcgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHRoaXMuX2xvb3BDb3VudCA9IGxvb3BDb3VudDtcblxuXHRcdFx0XHRcdHRoaXMuX21peGVyLmRpc3BhdGNoRXZlbnQoIHtcblx0XHRcdFx0XHRcdHR5cGU6ICdsb29wJywgYWN0aW9uOiB0aGlzLCBsb29wRGVsdGE6IGxvb3BEZWx0YVxuXHRcdFx0XHRcdH0gKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBwaW5nUG9uZyAmJiAoIGxvb3BDb3VudCAmIDEgKSA9PT0gMSApIHtcblx0XHRcdFx0Ly8gaW52ZXJ0IHRpbWUgZm9yIHRoZSBcInBvbmcgcm91bmRcIlxuXG5cdFx0XHRcdHRoaXMudGltZSA9IHRpbWU7XG5cdFx0XHRcdHJldHVybiBkdXJhdGlvbiAtIHRpbWU7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHRoaXMudGltZSA9IHRpbWU7XG5cdFx0cmV0dXJuIHRpbWU7XG5cblx0fSxcblxuXHRfc2V0RW5kaW5nczogZnVuY3Rpb24oIGF0U3RhcnQsIGF0RW5kLCBwaW5nUG9uZyApIHtcblxuXHRcdHZhciBzZXR0aW5ncyA9IHRoaXMuX2ludGVycG9sYW50U2V0dGluZ3M7XG5cblx0XHRpZiAoIHBpbmdQb25nICkge1xuXG5cdFx0XHRzZXR0aW5ncy5lbmRpbmdTdGFydCBcdD0gWmVyb1Nsb3BlRW5kaW5nO1xuXHRcdFx0c2V0dGluZ3MuZW5kaW5nRW5kXHRcdD0gWmVyb1Nsb3BlRW5kaW5nO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gYXNzdW1pbmcgZm9yIExvb3BPbmNlIGF0U3RhcnQgPT0gYXRFbmQgPT0gdHJ1ZVxuXG5cdFx0XHRpZiAoIGF0U3RhcnQgKSB7XG5cblx0XHRcdFx0c2V0dGluZ3MuZW5kaW5nU3RhcnQgPSB0aGlzLnplcm9TbG9wZUF0U3RhcnQgP1xuXHRcdFx0XHRcdFx0WmVyb1Nsb3BlRW5kaW5nIDogWmVyb0N1cnZhdHVyZUVuZGluZztcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRzZXR0aW5ncy5lbmRpbmdTdGFydCA9IFdyYXBBcm91bmRFbmRpbmc7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBhdEVuZCApIHtcblxuXHRcdFx0XHRzZXR0aW5ncy5lbmRpbmdFbmQgPSB0aGlzLnplcm9TbG9wZUF0RW5kID9cblx0XHRcdFx0XHRcdFplcm9TbG9wZUVuZGluZyA6IFplcm9DdXJ2YXR1cmVFbmRpbmc7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0c2V0dGluZ3MuZW5kaW5nRW5kIFx0ID0gV3JhcEFyb3VuZEVuZGluZztcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH0sXG5cblx0X3NjaGVkdWxlRmFkaW5nOiBmdW5jdGlvbiggZHVyYXRpb24sIHdlaWdodE5vdywgd2VpZ2h0VGhlbiApIHtcblxuXHRcdHZhciBtaXhlciA9IHRoaXMuX21peGVyLCBub3cgPSBtaXhlci50aW1lLFxuXHRcdFx0aW50ZXJwb2xhbnQgPSB0aGlzLl93ZWlnaHRJbnRlcnBvbGFudDtcblxuXHRcdGlmICggaW50ZXJwb2xhbnQgPT09IG51bGwgKSB7XG5cblx0XHRcdGludGVycG9sYW50ID0gbWl4ZXIuX2xlbmRDb250cm9sSW50ZXJwb2xhbnQoKTtcblx0XHRcdHRoaXMuX3dlaWdodEludGVycG9sYW50ID0gaW50ZXJwb2xhbnQ7XG5cblx0XHR9XG5cblx0XHR2YXIgdGltZXMgPSBpbnRlcnBvbGFudC5wYXJhbWV0ZXJQb3NpdGlvbnMsXG5cdFx0XHR2YWx1ZXMgPSBpbnRlcnBvbGFudC5zYW1wbGVWYWx1ZXM7XG5cblx0XHR0aW1lc1sgMCBdID0gbm93OyBcdFx0XHRcdHZhbHVlc1sgMCBdID0gd2VpZ2h0Tm93O1xuXHRcdHRpbWVzWyAxIF0gPSBub3cgKyBkdXJhdGlvbjtcdHZhbHVlc1sgMSBdID0gd2VpZ2h0VGhlbjtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqXG4gKiBQbGF5ZXIgZm9yIEFuaW1hdGlvbkNsaXBzLlxuICpcbiAqXG4gKiBAYXV0aG9yIEJlbiBIb3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvL1xuICogQGF1dGhvciBEYXZpZCBTYXJubyAvIGh0dHA6Ly9saWdodGhhdXMudXMvXG4gKiBAYXV0aG9yIHRzY2h3XG4gKi9cblxuZnVuY3Rpb24gQW5pbWF0aW9uTWl4ZXIoIHJvb3QgKSB7XG5cblx0dGhpcy5fcm9vdCA9IHJvb3Q7XG5cdHRoaXMuX2luaXRNZW1vcnlNYW5hZ2VyKCk7XG5cdHRoaXMuX2FjY3VJbmRleCA9IDA7XG5cblx0dGhpcy50aW1lID0gMDtcblxuXHR0aGlzLnRpbWVTY2FsZSA9IDEuMDtcblxufVxuXG5PYmplY3QuYXNzaWduKCBBbmltYXRpb25NaXhlci5wcm90b3R5cGUsIEV2ZW50RGlzcGF0Y2hlci5wcm90b3R5cGUsIHtcblxuXHRfYmluZEFjdGlvbjogZnVuY3Rpb24gKCBhY3Rpb24sIHByb3RvdHlwZUFjdGlvbiApIHtcblxuXHRcdHZhciByb290ID0gYWN0aW9uLl9sb2NhbFJvb3QgfHwgdGhpcy5fcm9vdCxcblx0XHRcdHRyYWNrcyA9IGFjdGlvbi5fY2xpcC50cmFja3MsXG5cdFx0XHRuVHJhY2tzID0gdHJhY2tzLmxlbmd0aCxcblx0XHRcdGJpbmRpbmdzID0gYWN0aW9uLl9wcm9wZXJ0eUJpbmRpbmdzLFxuXHRcdFx0aW50ZXJwb2xhbnRzID0gYWN0aW9uLl9pbnRlcnBvbGFudHMsXG5cdFx0XHRyb290VXVpZCA9IHJvb3QudXVpZCxcblx0XHRcdGJpbmRpbmdzQnlSb290ID0gdGhpcy5fYmluZGluZ3NCeVJvb3RBbmROYW1lLFxuXHRcdFx0YmluZGluZ3NCeU5hbWUgPSBiaW5kaW5nc0J5Um9vdFsgcm9vdFV1aWQgXTtcblxuXHRcdGlmICggYmluZGluZ3NCeU5hbWUgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0YmluZGluZ3NCeU5hbWUgPSB7fTtcblx0XHRcdGJpbmRpbmdzQnlSb290WyByb290VXVpZCBdID0gYmluZGluZ3NCeU5hbWU7XG5cblx0XHR9XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgIT09IG5UcmFja3M7ICsrIGkgKSB7XG5cblx0XHRcdHZhciB0cmFjayA9IHRyYWNrc1sgaSBdLFxuXHRcdFx0XHR0cmFja05hbWUgPSB0cmFjay5uYW1lLFxuXHRcdFx0XHRiaW5kaW5nID0gYmluZGluZ3NCeU5hbWVbIHRyYWNrTmFtZSBdO1xuXG5cdFx0XHRpZiAoIGJpbmRpbmcgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRiaW5kaW5nc1sgaSBdID0gYmluZGluZztcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRiaW5kaW5nID0gYmluZGluZ3NbIGkgXTtcblxuXHRcdFx0XHRpZiAoIGJpbmRpbmcgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdC8vIGV4aXN0aW5nIGJpbmRpbmcsIG1ha2Ugc3VyZSB0aGUgY2FjaGUga25vd3NcblxuXHRcdFx0XHRcdGlmICggYmluZGluZy5fY2FjaGVJbmRleCA9PT0gbnVsbCApIHtcblxuXHRcdFx0XHRcdFx0KysgYmluZGluZy5yZWZlcmVuY2VDb3VudDtcblx0XHRcdFx0XHRcdHRoaXMuX2FkZEluYWN0aXZlQmluZGluZyggYmluZGluZywgcm9vdFV1aWQsIHRyYWNrTmFtZSApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Y29udGludWU7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHZhciBwYXRoID0gcHJvdG90eXBlQWN0aW9uICYmIHByb3RvdHlwZUFjdGlvbi5cblx0XHRcdFx0XHRcdF9wcm9wZXJ0eUJpbmRpbmdzWyBpIF0uYmluZGluZy5wYXJzZWRQYXRoO1xuXG5cdFx0XHRcdGJpbmRpbmcgPSBuZXcgUHJvcGVydHlNaXhlcihcblx0XHRcdFx0XHRQcm9wZXJ0eUJpbmRpbmcuY3JlYXRlKCByb290LCB0cmFja05hbWUsIHBhdGggKSxcblx0XHRcdFx0XHR0cmFjay5WYWx1ZVR5cGVOYW1lLCB0cmFjay5nZXRWYWx1ZVNpemUoKSApO1xuXG5cdFx0XHRcdCsrIGJpbmRpbmcucmVmZXJlbmNlQ291bnQ7XG5cdFx0XHRcdHRoaXMuX2FkZEluYWN0aXZlQmluZGluZyggYmluZGluZywgcm9vdFV1aWQsIHRyYWNrTmFtZSApO1xuXG5cdFx0XHRcdGJpbmRpbmdzWyBpIF0gPSBiaW5kaW5nO1xuXG5cdFx0XHR9XG5cblx0XHRcdGludGVycG9sYW50c1sgaSBdLnJlc3VsdEJ1ZmZlciA9IGJpbmRpbmcuYnVmZmVyO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0X2FjdGl2YXRlQWN0aW9uOiBmdW5jdGlvbiAoIGFjdGlvbiApIHtcblxuXHRcdGlmICggISB0aGlzLl9pc0FjdGl2ZUFjdGlvbiggYWN0aW9uICkgKSB7XG5cblx0XHRcdGlmICggYWN0aW9uLl9jYWNoZUluZGV4ID09PSBudWxsICkge1xuXG5cdFx0XHRcdC8vIHRoaXMgYWN0aW9uIGhhcyBiZWVuIGZvcmdvdHRlbiBieSB0aGUgY2FjaGUsIGJ1dCB0aGUgdXNlclxuXHRcdFx0XHQvLyBhcHBlYXJzIHRvIGJlIHN0aWxsIHVzaW5nIGl0IC0+IHJlYmluZFxuXG5cdFx0XHRcdHZhciByb290VXVpZCA9ICggYWN0aW9uLl9sb2NhbFJvb3QgfHwgdGhpcy5fcm9vdCApLnV1aWQsXG5cdFx0XHRcdFx0Y2xpcFV1aWQgPSBhY3Rpb24uX2NsaXAudXVpZCxcblx0XHRcdFx0XHRhY3Rpb25zRm9yQ2xpcCA9IHRoaXMuX2FjdGlvbnNCeUNsaXBbIGNsaXBVdWlkIF07XG5cblx0XHRcdFx0dGhpcy5fYmluZEFjdGlvbiggYWN0aW9uLFxuXHRcdFx0XHRcdGFjdGlvbnNGb3JDbGlwICYmIGFjdGlvbnNGb3JDbGlwLmtub3duQWN0aW9uc1sgMCBdICk7XG5cblx0XHRcdFx0dGhpcy5fYWRkSW5hY3RpdmVBY3Rpb24oIGFjdGlvbiwgY2xpcFV1aWQsIHJvb3RVdWlkICk7XG5cblx0XHRcdH1cblxuXHRcdFx0dmFyIGJpbmRpbmdzID0gYWN0aW9uLl9wcm9wZXJ0eUJpbmRpbmdzO1xuXG5cdFx0XHQvLyBpbmNyZW1lbnQgcmVmZXJlbmNlIGNvdW50cyAvIHNvcnQgb3V0IHN0YXRlXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIG4gPSBiaW5kaW5ncy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRcdFx0dmFyIGJpbmRpbmcgPSBiaW5kaW5nc1sgaSBdO1xuXG5cdFx0XHRcdGlmICggYmluZGluZy51c2VDb3VudCArKyA9PT0gMCApIHtcblxuXHRcdFx0XHRcdHRoaXMuX2xlbmRCaW5kaW5nKCBiaW5kaW5nICk7XG5cdFx0XHRcdFx0YmluZGluZy5zYXZlT3JpZ2luYWxTdGF0ZSgpO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLl9sZW5kQWN0aW9uKCBhY3Rpb24gKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdF9kZWFjdGl2YXRlQWN0aW9uOiBmdW5jdGlvbiAoIGFjdGlvbiApIHtcblxuXHRcdGlmICggdGhpcy5faXNBY3RpdmVBY3Rpb24oIGFjdGlvbiApICkge1xuXG5cdFx0XHR2YXIgYmluZGluZ3MgPSBhY3Rpb24uX3Byb3BlcnR5QmluZGluZ3M7XG5cblx0XHRcdC8vIGRlY3JlbWVudCByZWZlcmVuY2UgY291bnRzIC8gc29ydCBvdXQgc3RhdGVcblx0XHRcdGZvciAoIHZhciBpID0gMCwgbiA9IGJpbmRpbmdzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0XHR2YXIgYmluZGluZyA9IGJpbmRpbmdzWyBpIF07XG5cblx0XHRcdFx0aWYgKCAtLSBiaW5kaW5nLnVzZUNvdW50ID09PSAwICkge1xuXG5cdFx0XHRcdFx0YmluZGluZy5yZXN0b3JlT3JpZ2luYWxTdGF0ZSgpO1xuXHRcdFx0XHRcdHRoaXMuX3Rha2VCYWNrQmluZGluZyggYmluZGluZyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLl90YWtlQmFja0FjdGlvbiggYWN0aW9uICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHQvLyBNZW1vcnkgbWFuYWdlclxuXG5cdF9pbml0TWVtb3J5TWFuYWdlcjogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5fYWN0aW9ucyA9IFtdOyAvLyAnbkFjdGl2ZUFjdGlvbnMnIGZvbGxvd2VkIGJ5IGluYWN0aXZlIG9uZXNcblx0XHR0aGlzLl9uQWN0aXZlQWN0aW9ucyA9IDA7XG5cblx0XHR0aGlzLl9hY3Rpb25zQnlDbGlwID0ge307XG5cdFx0Ly8gaW5zaWRlOlxuXHRcdC8vIHtcblx0XHQvLyBcdFx0a25vd25BY3Rpb25zOiBBcnJheTwgQW5pbWF0aW9uQWN0aW9uID5cdC0gdXNlZCBhcyBwcm90b3R5cGVzXG5cdFx0Ly8gXHRcdGFjdGlvbkJ5Um9vdDogQW5pbWF0aW9uQWN0aW9uXHRcdFx0LSBsb29rdXBcblx0XHQvLyB9XG5cblxuXHRcdHRoaXMuX2JpbmRpbmdzID0gW107IC8vICduQWN0aXZlQmluZGluZ3MnIGZvbGxvd2VkIGJ5IGluYWN0aXZlIG9uZXNcblx0XHR0aGlzLl9uQWN0aXZlQmluZGluZ3MgPSAwO1xuXG5cdFx0dGhpcy5fYmluZGluZ3NCeVJvb3RBbmROYW1lID0ge307IC8vIGluc2lkZTogTWFwPCBuYW1lLCBQcm9wZXJ0eU1peGVyID5cblxuXG5cdFx0dGhpcy5fY29udHJvbEludGVycG9sYW50cyA9IFtdOyAvLyBzYW1lIGdhbWUgYXMgYWJvdmVcblx0XHR0aGlzLl9uQWN0aXZlQ29udHJvbEludGVycG9sYW50cyA9IDA7XG5cblx0XHR2YXIgc2NvcGUgPSB0aGlzO1xuXG5cdFx0dGhpcy5zdGF0cyA9IHtcblxuXHRcdFx0YWN0aW9uczoge1xuXHRcdFx0XHRnZXQgdG90YWwoKSB7IHJldHVybiBzY29wZS5fYWN0aW9ucy5sZW5ndGg7IH0sXG5cdFx0XHRcdGdldCBpblVzZSgpIHsgcmV0dXJuIHNjb3BlLl9uQWN0aXZlQWN0aW9uczsgfVxuXHRcdFx0fSxcblx0XHRcdGJpbmRpbmdzOiB7XG5cdFx0XHRcdGdldCB0b3RhbCgpIHsgcmV0dXJuIHNjb3BlLl9iaW5kaW5ncy5sZW5ndGg7IH0sXG5cdFx0XHRcdGdldCBpblVzZSgpIHsgcmV0dXJuIHNjb3BlLl9uQWN0aXZlQmluZGluZ3M7IH1cblx0XHRcdH0sXG5cdFx0XHRjb250cm9sSW50ZXJwb2xhbnRzOiB7XG5cdFx0XHRcdGdldCB0b3RhbCgpIHsgcmV0dXJuIHNjb3BlLl9jb250cm9sSW50ZXJwb2xhbnRzLmxlbmd0aDsgfSxcblx0XHRcdFx0Z2V0IGluVXNlKCkgeyByZXR1cm4gc2NvcGUuX25BY3RpdmVDb250cm9sSW50ZXJwb2xhbnRzOyB9XG5cdFx0XHR9XG5cblx0XHR9O1xuXG5cdH0sXG5cblx0Ly8gTWVtb3J5IG1hbmFnZW1lbnQgZm9yIEFuaW1hdGlvbkFjdGlvbiBvYmplY3RzXG5cblx0X2lzQWN0aXZlQWN0aW9uOiBmdW5jdGlvbiAoIGFjdGlvbiApIHtcblxuXHRcdHZhciBpbmRleCA9IGFjdGlvbi5fY2FjaGVJbmRleDtcblx0XHRyZXR1cm4gaW5kZXggIT09IG51bGwgJiYgaW5kZXggPCB0aGlzLl9uQWN0aXZlQWN0aW9ucztcblxuXHR9LFxuXG5cdF9hZGRJbmFjdGl2ZUFjdGlvbjogZnVuY3Rpb24gKCBhY3Rpb24sIGNsaXBVdWlkLCByb290VXVpZCApIHtcblxuXHRcdHZhciBhY3Rpb25zID0gdGhpcy5fYWN0aW9ucyxcblx0XHRcdGFjdGlvbnNCeUNsaXAgPSB0aGlzLl9hY3Rpb25zQnlDbGlwLFxuXHRcdFx0YWN0aW9uc0ZvckNsaXAgPSBhY3Rpb25zQnlDbGlwWyBjbGlwVXVpZCBdO1xuXG5cdFx0aWYgKCBhY3Rpb25zRm9yQ2xpcCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRhY3Rpb25zRm9yQ2xpcCA9IHtcblxuXHRcdFx0XHRrbm93bkFjdGlvbnM6IFsgYWN0aW9uIF0sXG5cdFx0XHRcdGFjdGlvbkJ5Um9vdDoge31cblxuXHRcdFx0fTtcblxuXHRcdFx0YWN0aW9uLl9ieUNsaXBDYWNoZUluZGV4ID0gMDtcblxuXHRcdFx0YWN0aW9uc0J5Q2xpcFsgY2xpcFV1aWQgXSA9IGFjdGlvbnNGb3JDbGlwO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dmFyIGtub3duQWN0aW9ucyA9IGFjdGlvbnNGb3JDbGlwLmtub3duQWN0aW9ucztcblxuXHRcdFx0YWN0aW9uLl9ieUNsaXBDYWNoZUluZGV4ID0ga25vd25BY3Rpb25zLmxlbmd0aDtcblx0XHRcdGtub3duQWN0aW9ucy5wdXNoKCBhY3Rpb24gKTtcblxuXHRcdH1cblxuXHRcdGFjdGlvbi5fY2FjaGVJbmRleCA9IGFjdGlvbnMubGVuZ3RoO1xuXHRcdGFjdGlvbnMucHVzaCggYWN0aW9uICk7XG5cblx0XHRhY3Rpb25zRm9yQ2xpcC5hY3Rpb25CeVJvb3RbIHJvb3RVdWlkIF0gPSBhY3Rpb247XG5cblx0fSxcblxuXHRfcmVtb3ZlSW5hY3RpdmVBY3Rpb246IGZ1bmN0aW9uICggYWN0aW9uICkge1xuXG5cdFx0dmFyIGFjdGlvbnMgPSB0aGlzLl9hY3Rpb25zLFxuXHRcdFx0bGFzdEluYWN0aXZlQWN0aW9uID0gYWN0aW9uc1sgYWN0aW9ucy5sZW5ndGggLSAxIF0sXG5cdFx0XHRjYWNoZUluZGV4ID0gYWN0aW9uLl9jYWNoZUluZGV4O1xuXG5cdFx0bGFzdEluYWN0aXZlQWN0aW9uLl9jYWNoZUluZGV4ID0gY2FjaGVJbmRleDtcblx0XHRhY3Rpb25zWyBjYWNoZUluZGV4IF0gPSBsYXN0SW5hY3RpdmVBY3Rpb247XG5cdFx0YWN0aW9ucy5wb3AoKTtcblxuXHRcdGFjdGlvbi5fY2FjaGVJbmRleCA9IG51bGw7XG5cblxuXHRcdHZhciBjbGlwVXVpZCA9IGFjdGlvbi5fY2xpcC51dWlkLFxuXHRcdFx0YWN0aW9uc0J5Q2xpcCA9IHRoaXMuX2FjdGlvbnNCeUNsaXAsXG5cdFx0XHRhY3Rpb25zRm9yQ2xpcCA9IGFjdGlvbnNCeUNsaXBbIGNsaXBVdWlkIF0sXG5cdFx0XHRrbm93bkFjdGlvbnNGb3JDbGlwID0gYWN0aW9uc0ZvckNsaXAua25vd25BY3Rpb25zLFxuXG5cdFx0XHRsYXN0S25vd25BY3Rpb24gPVxuXHRcdFx0XHRrbm93bkFjdGlvbnNGb3JDbGlwWyBrbm93bkFjdGlvbnNGb3JDbGlwLmxlbmd0aCAtIDEgXSxcblxuXHRcdFx0YnlDbGlwQ2FjaGVJbmRleCA9IGFjdGlvbi5fYnlDbGlwQ2FjaGVJbmRleDtcblxuXHRcdGxhc3RLbm93bkFjdGlvbi5fYnlDbGlwQ2FjaGVJbmRleCA9IGJ5Q2xpcENhY2hlSW5kZXg7XG5cdFx0a25vd25BY3Rpb25zRm9yQ2xpcFsgYnlDbGlwQ2FjaGVJbmRleCBdID0gbGFzdEtub3duQWN0aW9uO1xuXHRcdGtub3duQWN0aW9uc0ZvckNsaXAucG9wKCk7XG5cblx0XHRhY3Rpb24uX2J5Q2xpcENhY2hlSW5kZXggPSBudWxsO1xuXG5cblx0XHR2YXIgYWN0aW9uQnlSb290ID0gYWN0aW9uc0ZvckNsaXAuYWN0aW9uQnlSb290LFxuXHRcdFx0cm9vdFV1aWQgPSAoIGFjdGlvbi5fbG9jYWxSb290IHx8IHRoaXMuX3Jvb3QgKS51dWlkO1xuXG5cdFx0ZGVsZXRlIGFjdGlvbkJ5Um9vdFsgcm9vdFV1aWQgXTtcblxuXHRcdGlmICgga25vd25BY3Rpb25zRm9yQ2xpcC5sZW5ndGggPT09IDAgKSB7XG5cblx0XHRcdGRlbGV0ZSBhY3Rpb25zQnlDbGlwWyBjbGlwVXVpZCBdO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5fcmVtb3ZlSW5hY3RpdmVCaW5kaW5nc0ZvckFjdGlvbiggYWN0aW9uICk7XG5cblx0fSxcblxuXHRfcmVtb3ZlSW5hY3RpdmVCaW5kaW5nc0ZvckFjdGlvbjogZnVuY3Rpb24gKCBhY3Rpb24gKSB7XG5cblx0XHR2YXIgYmluZGluZ3MgPSBhY3Rpb24uX3Byb3BlcnR5QmluZGluZ3M7XG5cdFx0Zm9yICggdmFyIGkgPSAwLCBuID0gYmluZGluZ3MubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHR2YXIgYmluZGluZyA9IGJpbmRpbmdzWyBpIF07XG5cblx0XHRcdGlmICggLS0gYmluZGluZy5yZWZlcmVuY2VDb3VudCA9PT0gMCApIHtcblxuXHRcdFx0XHR0aGlzLl9yZW1vdmVJbmFjdGl2ZUJpbmRpbmcoIGJpbmRpbmcgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH0sXG5cblx0X2xlbmRBY3Rpb246IGZ1bmN0aW9uICggYWN0aW9uICkge1xuXG5cdFx0Ly8gWyBhY3RpdmUgYWN0aW9ucyB8ICBpbmFjdGl2ZSBhY3Rpb25zICBdXG5cdFx0Ly8gWyAgYWN0aXZlIGFjdGlvbnMgPnwgaW5hY3RpdmUgYWN0aW9ucyBdXG5cdFx0Ly8gICAgICAgICAgICAgICAgIHMgICAgICAgIGFcblx0XHQvLyAgICAgICAgICAgICAgICAgIDwtc3dhcC0+XG5cdFx0Ly8gICAgICAgICAgICAgICAgIGEgICAgICAgIHNcblxuXHRcdHZhciBhY3Rpb25zID0gdGhpcy5fYWN0aW9ucyxcblx0XHRcdHByZXZJbmRleCA9IGFjdGlvbi5fY2FjaGVJbmRleCxcblxuXHRcdFx0bGFzdEFjdGl2ZUluZGV4ID0gdGhpcy5fbkFjdGl2ZUFjdGlvbnMgKyssXG5cblx0XHRcdGZpcnN0SW5hY3RpdmVBY3Rpb24gPSBhY3Rpb25zWyBsYXN0QWN0aXZlSW5kZXggXTtcblxuXHRcdGFjdGlvbi5fY2FjaGVJbmRleCA9IGxhc3RBY3RpdmVJbmRleDtcblx0XHRhY3Rpb25zWyBsYXN0QWN0aXZlSW5kZXggXSA9IGFjdGlvbjtcblxuXHRcdGZpcnN0SW5hY3RpdmVBY3Rpb24uX2NhY2hlSW5kZXggPSBwcmV2SW5kZXg7XG5cdFx0YWN0aW9uc1sgcHJldkluZGV4IF0gPSBmaXJzdEluYWN0aXZlQWN0aW9uO1xuXG5cdH0sXG5cblx0X3Rha2VCYWNrQWN0aW9uOiBmdW5jdGlvbiAoIGFjdGlvbiApIHtcblxuXHRcdC8vIFsgIGFjdGl2ZSBhY3Rpb25zICB8IGluYWN0aXZlIGFjdGlvbnMgXVxuXHRcdC8vIFsgYWN0aXZlIGFjdGlvbnMgfDwgaW5hY3RpdmUgYWN0aW9ucyAgXVxuXHRcdC8vICAgICAgICBhICAgICAgICBzXG5cdFx0Ly8gICAgICAgICA8LXN3YXAtPlxuXHRcdC8vICAgICAgICBzICAgICAgICBhXG5cblx0XHR2YXIgYWN0aW9ucyA9IHRoaXMuX2FjdGlvbnMsXG5cdFx0XHRwcmV2SW5kZXggPSBhY3Rpb24uX2NhY2hlSW5kZXgsXG5cblx0XHRcdGZpcnN0SW5hY3RpdmVJbmRleCA9IC0tIHRoaXMuX25BY3RpdmVBY3Rpb25zLFxuXG5cdFx0XHRsYXN0QWN0aXZlQWN0aW9uID0gYWN0aW9uc1sgZmlyc3RJbmFjdGl2ZUluZGV4IF07XG5cblx0XHRhY3Rpb24uX2NhY2hlSW5kZXggPSBmaXJzdEluYWN0aXZlSW5kZXg7XG5cdFx0YWN0aW9uc1sgZmlyc3RJbmFjdGl2ZUluZGV4IF0gPSBhY3Rpb247XG5cblx0XHRsYXN0QWN0aXZlQWN0aW9uLl9jYWNoZUluZGV4ID0gcHJldkluZGV4O1xuXHRcdGFjdGlvbnNbIHByZXZJbmRleCBdID0gbGFzdEFjdGl2ZUFjdGlvbjtcblxuXHR9LFxuXG5cdC8vIE1lbW9yeSBtYW5hZ2VtZW50IGZvciBQcm9wZXJ0eU1peGVyIG9iamVjdHNcblxuXHRfYWRkSW5hY3RpdmVCaW5kaW5nOiBmdW5jdGlvbiAoIGJpbmRpbmcsIHJvb3RVdWlkLCB0cmFja05hbWUgKSB7XG5cblx0XHR2YXIgYmluZGluZ3NCeVJvb3QgPSB0aGlzLl9iaW5kaW5nc0J5Um9vdEFuZE5hbWUsXG5cdFx0XHRiaW5kaW5nQnlOYW1lID0gYmluZGluZ3NCeVJvb3RbIHJvb3RVdWlkIF0sXG5cblx0XHRcdGJpbmRpbmdzID0gdGhpcy5fYmluZGluZ3M7XG5cblx0XHRpZiAoIGJpbmRpbmdCeU5hbWUgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0YmluZGluZ0J5TmFtZSA9IHt9O1xuXHRcdFx0YmluZGluZ3NCeVJvb3RbIHJvb3RVdWlkIF0gPSBiaW5kaW5nQnlOYW1lO1xuXG5cdFx0fVxuXG5cdFx0YmluZGluZ0J5TmFtZVsgdHJhY2tOYW1lIF0gPSBiaW5kaW5nO1xuXG5cdFx0YmluZGluZy5fY2FjaGVJbmRleCA9IGJpbmRpbmdzLmxlbmd0aDtcblx0XHRiaW5kaW5ncy5wdXNoKCBiaW5kaW5nICk7XG5cblx0fSxcblxuXHRfcmVtb3ZlSW5hY3RpdmVCaW5kaW5nOiBmdW5jdGlvbiAoIGJpbmRpbmcgKSB7XG5cblx0XHR2YXIgYmluZGluZ3MgPSB0aGlzLl9iaW5kaW5ncyxcblx0XHRcdHByb3BCaW5kaW5nID0gYmluZGluZy5iaW5kaW5nLFxuXHRcdFx0cm9vdFV1aWQgPSBwcm9wQmluZGluZy5yb290Tm9kZS51dWlkLFxuXHRcdFx0dHJhY2tOYW1lID0gcHJvcEJpbmRpbmcucGF0aCxcblx0XHRcdGJpbmRpbmdzQnlSb290ID0gdGhpcy5fYmluZGluZ3NCeVJvb3RBbmROYW1lLFxuXHRcdFx0YmluZGluZ0J5TmFtZSA9IGJpbmRpbmdzQnlSb290WyByb290VXVpZCBdLFxuXG5cdFx0XHRsYXN0SW5hY3RpdmVCaW5kaW5nID0gYmluZGluZ3NbIGJpbmRpbmdzLmxlbmd0aCAtIDEgXSxcblx0XHRcdGNhY2hlSW5kZXggPSBiaW5kaW5nLl9jYWNoZUluZGV4O1xuXG5cdFx0bGFzdEluYWN0aXZlQmluZGluZy5fY2FjaGVJbmRleCA9IGNhY2hlSW5kZXg7XG5cdFx0YmluZGluZ3NbIGNhY2hlSW5kZXggXSA9IGxhc3RJbmFjdGl2ZUJpbmRpbmc7XG5cdFx0YmluZGluZ3MucG9wKCk7XG5cblx0XHRkZWxldGUgYmluZGluZ0J5TmFtZVsgdHJhY2tOYW1lIF07XG5cblx0XHRyZW1vdmVfZW1wdHlfbWFwOiB7XG5cblx0XHRcdGZvciAoIHZhciBfIGluIGJpbmRpbmdCeU5hbWUgKSBicmVhayByZW1vdmVfZW1wdHlfbWFwO1xuXG5cdFx0XHRkZWxldGUgYmluZGluZ3NCeVJvb3RbIHJvb3RVdWlkIF07XG5cblx0XHR9XG5cblx0fSxcblxuXHRfbGVuZEJpbmRpbmc6IGZ1bmN0aW9uICggYmluZGluZyApIHtcblxuXHRcdHZhciBiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzLFxuXHRcdFx0cHJldkluZGV4ID0gYmluZGluZy5fY2FjaGVJbmRleCxcblxuXHRcdFx0bGFzdEFjdGl2ZUluZGV4ID0gdGhpcy5fbkFjdGl2ZUJpbmRpbmdzICsrLFxuXG5cdFx0XHRmaXJzdEluYWN0aXZlQmluZGluZyA9IGJpbmRpbmdzWyBsYXN0QWN0aXZlSW5kZXggXTtcblxuXHRcdGJpbmRpbmcuX2NhY2hlSW5kZXggPSBsYXN0QWN0aXZlSW5kZXg7XG5cdFx0YmluZGluZ3NbIGxhc3RBY3RpdmVJbmRleCBdID0gYmluZGluZztcblxuXHRcdGZpcnN0SW5hY3RpdmVCaW5kaW5nLl9jYWNoZUluZGV4ID0gcHJldkluZGV4O1xuXHRcdGJpbmRpbmdzWyBwcmV2SW5kZXggXSA9IGZpcnN0SW5hY3RpdmVCaW5kaW5nO1xuXG5cdH0sXG5cblx0X3Rha2VCYWNrQmluZGluZzogZnVuY3Rpb24gKCBiaW5kaW5nICkge1xuXG5cdFx0dmFyIGJpbmRpbmdzID0gdGhpcy5fYmluZGluZ3MsXG5cdFx0XHRwcmV2SW5kZXggPSBiaW5kaW5nLl9jYWNoZUluZGV4LFxuXG5cdFx0XHRmaXJzdEluYWN0aXZlSW5kZXggPSAtLSB0aGlzLl9uQWN0aXZlQmluZGluZ3MsXG5cblx0XHRcdGxhc3RBY3RpdmVCaW5kaW5nID0gYmluZGluZ3NbIGZpcnN0SW5hY3RpdmVJbmRleCBdO1xuXG5cdFx0YmluZGluZy5fY2FjaGVJbmRleCA9IGZpcnN0SW5hY3RpdmVJbmRleDtcblx0XHRiaW5kaW5nc1sgZmlyc3RJbmFjdGl2ZUluZGV4IF0gPSBiaW5kaW5nO1xuXG5cdFx0bGFzdEFjdGl2ZUJpbmRpbmcuX2NhY2hlSW5kZXggPSBwcmV2SW5kZXg7XG5cdFx0YmluZGluZ3NbIHByZXZJbmRleCBdID0gbGFzdEFjdGl2ZUJpbmRpbmc7XG5cblx0fSxcblxuXG5cdC8vIE1lbW9yeSBtYW5hZ2VtZW50IG9mIEludGVycG9sYW50cyBmb3Igd2VpZ2h0IGFuZCB0aW1lIHNjYWxlXG5cblx0X2xlbmRDb250cm9sSW50ZXJwb2xhbnQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHZhciBpbnRlcnBvbGFudHMgPSB0aGlzLl9jb250cm9sSW50ZXJwb2xhbnRzLFxuXHRcdFx0bGFzdEFjdGl2ZUluZGV4ID0gdGhpcy5fbkFjdGl2ZUNvbnRyb2xJbnRlcnBvbGFudHMgKyssXG5cdFx0XHRpbnRlcnBvbGFudCA9IGludGVycG9sYW50c1sgbGFzdEFjdGl2ZUluZGV4IF07XG5cblx0XHRpZiAoIGludGVycG9sYW50ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGludGVycG9sYW50ID0gbmV3IExpbmVhckludGVycG9sYW50KFxuXHRcdFx0XHRuZXcgRmxvYXQzMkFycmF5KCAyICksIG5ldyBGbG9hdDMyQXJyYXkoIDIgKSxcblx0XHRcdFx0MSwgdGhpcy5fY29udHJvbEludGVycG9sYW50c1Jlc3VsdEJ1ZmZlciApO1xuXG5cdFx0XHRpbnRlcnBvbGFudC5fX2NhY2hlSW5kZXggPSBsYXN0QWN0aXZlSW5kZXg7XG5cdFx0XHRpbnRlcnBvbGFudHNbIGxhc3RBY3RpdmVJbmRleCBdID0gaW50ZXJwb2xhbnQ7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gaW50ZXJwb2xhbnQ7XG5cblx0fSxcblxuXHRfdGFrZUJhY2tDb250cm9sSW50ZXJwb2xhbnQ6IGZ1bmN0aW9uICggaW50ZXJwb2xhbnQgKSB7XG5cblx0XHR2YXIgaW50ZXJwb2xhbnRzID0gdGhpcy5fY29udHJvbEludGVycG9sYW50cyxcblx0XHRcdHByZXZJbmRleCA9IGludGVycG9sYW50Ll9fY2FjaGVJbmRleCxcblxuXHRcdFx0Zmlyc3RJbmFjdGl2ZUluZGV4ID0gLS0gdGhpcy5fbkFjdGl2ZUNvbnRyb2xJbnRlcnBvbGFudHMsXG5cblx0XHRcdGxhc3RBY3RpdmVJbnRlcnBvbGFudCA9IGludGVycG9sYW50c1sgZmlyc3RJbmFjdGl2ZUluZGV4IF07XG5cblx0XHRpbnRlcnBvbGFudC5fX2NhY2hlSW5kZXggPSBmaXJzdEluYWN0aXZlSW5kZXg7XG5cdFx0aW50ZXJwb2xhbnRzWyBmaXJzdEluYWN0aXZlSW5kZXggXSA9IGludGVycG9sYW50O1xuXG5cdFx0bGFzdEFjdGl2ZUludGVycG9sYW50Ll9fY2FjaGVJbmRleCA9IHByZXZJbmRleDtcblx0XHRpbnRlcnBvbGFudHNbIHByZXZJbmRleCBdID0gbGFzdEFjdGl2ZUludGVycG9sYW50O1xuXG5cdH0sXG5cblx0X2NvbnRyb2xJbnRlcnBvbGFudHNSZXN1bHRCdWZmZXI6IG5ldyBGbG9hdDMyQXJyYXkoIDEgKSxcblxuXHQvLyByZXR1cm4gYW4gYWN0aW9uIGZvciBhIGNsaXAgb3B0aW9uYWxseSB1c2luZyBhIGN1c3RvbSByb290IHRhcmdldFxuXHQvLyBvYmplY3QgKHRoaXMgbWV0aG9kIGFsbG9jYXRlcyBhIGxvdCBvZiBkeW5hbWljIG1lbW9yeSBpbiBjYXNlIGFcblx0Ly8gcHJldmlvdXNseSB1bmtub3duIGNsaXAvcm9vdCBjb21iaW5hdGlvbiBpcyBzcGVjaWZpZWQpXG5cdGNsaXBBY3Rpb246IGZ1bmN0aW9uICggY2xpcCwgb3B0aW9uYWxSb290ICkge1xuXG5cdFx0dmFyIHJvb3QgPSBvcHRpb25hbFJvb3QgfHwgdGhpcy5fcm9vdCxcblx0XHRcdHJvb3RVdWlkID0gcm9vdC51dWlkLFxuXG5cdFx0XHRjbGlwT2JqZWN0ID0gdHlwZW9mIGNsaXAgPT09ICdzdHJpbmcnID9cblx0XHRcdFx0QW5pbWF0aW9uQ2xpcC5maW5kQnlOYW1lKCByb290LCBjbGlwICkgOiBjbGlwLFxuXG5cdFx0XHRjbGlwVXVpZCA9IGNsaXBPYmplY3QgIT09IG51bGwgPyBjbGlwT2JqZWN0LnV1aWQgOiBjbGlwLFxuXG5cdFx0XHRhY3Rpb25zRm9yQ2xpcCA9IHRoaXMuX2FjdGlvbnNCeUNsaXBbIGNsaXBVdWlkIF0sXG5cdFx0XHRwcm90b3R5cGVBY3Rpb24gPSBudWxsO1xuXG5cdFx0aWYgKCBhY3Rpb25zRm9yQ2xpcCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR2YXIgZXhpc3RpbmdBY3Rpb24gPVxuXHRcdFx0XHRcdGFjdGlvbnNGb3JDbGlwLmFjdGlvbkJ5Um9vdFsgcm9vdFV1aWQgXTtcblxuXHRcdFx0aWYgKCBleGlzdGluZ0FjdGlvbiAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHJldHVybiBleGlzdGluZ0FjdGlvbjtcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyB3ZSBrbm93IHRoZSBjbGlwLCBzbyB3ZSBkb24ndCBoYXZlIHRvIHBhcnNlIGFsbFxuXHRcdFx0Ly8gdGhlIGJpbmRpbmdzIGFnYWluIGJ1dCBjYW4ganVzdCBjb3B5XG5cdFx0XHRwcm90b3R5cGVBY3Rpb24gPSBhY3Rpb25zRm9yQ2xpcC5rbm93bkFjdGlvbnNbIDAgXTtcblxuXHRcdFx0Ly8gYWxzbywgdGFrZSB0aGUgY2xpcCBmcm9tIHRoZSBwcm90b3R5cGUgYWN0aW9uXG5cdFx0XHRpZiAoIGNsaXBPYmplY3QgPT09IG51bGwgKVxuXHRcdFx0XHRjbGlwT2JqZWN0ID0gcHJvdG90eXBlQWN0aW9uLl9jbGlwO1xuXG5cdFx0fVxuXG5cdFx0Ly8gY2xpcCBtdXN0IGJlIGtub3duIHdoZW4gc3BlY2lmaWVkIHZpYSBzdHJpbmdcblx0XHRpZiAoIGNsaXBPYmplY3QgPT09IG51bGwgKSByZXR1cm4gbnVsbDtcblxuXHRcdC8vIGFsbG9jYXRlIGFsbCByZXNvdXJjZXMgcmVxdWlyZWQgdG8gcnVuIGl0XG5cdFx0dmFyIG5ld0FjdGlvbiA9IG5ldyBBbmltYXRpb25BY3Rpb24oIHRoaXMsIGNsaXBPYmplY3QsIG9wdGlvbmFsUm9vdCApO1xuXG5cdFx0dGhpcy5fYmluZEFjdGlvbiggbmV3QWN0aW9uLCBwcm90b3R5cGVBY3Rpb24gKTtcblxuXHRcdC8vIGFuZCBtYWtlIHRoZSBhY3Rpb24ga25vd24gdG8gdGhlIG1lbW9yeSBtYW5hZ2VyXG5cdFx0dGhpcy5fYWRkSW5hY3RpdmVBY3Rpb24oIG5ld0FjdGlvbiwgY2xpcFV1aWQsIHJvb3RVdWlkICk7XG5cblx0XHRyZXR1cm4gbmV3QWN0aW9uO1xuXG5cdH0sXG5cblx0Ly8gZ2V0IGFuIGV4aXN0aW5nIGFjdGlvblxuXHRleGlzdGluZ0FjdGlvbjogZnVuY3Rpb24gKCBjbGlwLCBvcHRpb25hbFJvb3QgKSB7XG5cblx0XHR2YXIgcm9vdCA9IG9wdGlvbmFsUm9vdCB8fCB0aGlzLl9yb290LFxuXHRcdFx0cm9vdFV1aWQgPSByb290LnV1aWQsXG5cblx0XHRcdGNsaXBPYmplY3QgPSB0eXBlb2YgY2xpcCA9PT0gJ3N0cmluZycgP1xuXHRcdFx0XHRBbmltYXRpb25DbGlwLmZpbmRCeU5hbWUoIHJvb3QsIGNsaXAgKSA6IGNsaXAsXG5cblx0XHRcdGNsaXBVdWlkID0gY2xpcE9iamVjdCA/IGNsaXBPYmplY3QudXVpZCA6IGNsaXAsXG5cblx0XHRcdGFjdGlvbnNGb3JDbGlwID0gdGhpcy5fYWN0aW9uc0J5Q2xpcFsgY2xpcFV1aWQgXTtcblxuXHRcdGlmICggYWN0aW9uc0ZvckNsaXAgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0cmV0dXJuIGFjdGlvbnNGb3JDbGlwLmFjdGlvbkJ5Um9vdFsgcm9vdFV1aWQgXSB8fCBudWxsO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIG51bGw7XG5cblx0fSxcblxuXHQvLyBkZWFjdGl2YXRlcyBhbGwgcHJldmlvdXNseSBzY2hlZHVsZWQgYWN0aW9uc1xuXHRzdG9wQWxsQWN0aW9uOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgYWN0aW9ucyA9IHRoaXMuX2FjdGlvbnMsXG5cdFx0XHRuQWN0aW9ucyA9IHRoaXMuX25BY3RpdmVBY3Rpb25zLFxuXHRcdFx0YmluZGluZ3MgPSB0aGlzLl9iaW5kaW5ncyxcblx0XHRcdG5CaW5kaW5ncyA9IHRoaXMuX25BY3RpdmVCaW5kaW5ncztcblxuXHRcdHRoaXMuX25BY3RpdmVBY3Rpb25zID0gMDtcblx0XHR0aGlzLl9uQWN0aXZlQmluZGluZ3MgPSAwO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpICE9PSBuQWN0aW9uczsgKysgaSApIHtcblxuXHRcdFx0YWN0aW9uc1sgaSBdLnJlc2V0KCk7XG5cblx0XHR9XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgIT09IG5CaW5kaW5nczsgKysgaSApIHtcblxuXHRcdFx0YmluZGluZ3NbIGkgXS51c2VDb3VudCA9IDA7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdC8vIGFkdmFuY2UgdGhlIHRpbWUgYW5kIHVwZGF0ZSBhcHBseSB0aGUgYW5pbWF0aW9uXG5cdHVwZGF0ZTogZnVuY3Rpb24gKCBkZWx0YVRpbWUgKSB7XG5cblx0XHRkZWx0YVRpbWUgKj0gdGhpcy50aW1lU2NhbGU7XG5cblx0XHR2YXIgYWN0aW9ucyA9IHRoaXMuX2FjdGlvbnMsXG5cdFx0XHRuQWN0aW9ucyA9IHRoaXMuX25BY3RpdmVBY3Rpb25zLFxuXG5cdFx0XHR0aW1lID0gdGhpcy50aW1lICs9IGRlbHRhVGltZSxcblx0XHRcdHRpbWVEaXJlY3Rpb24gPSBNYXRoLnNpZ24oIGRlbHRhVGltZSApLFxuXG5cdFx0XHRhY2N1SW5kZXggPSB0aGlzLl9hY2N1SW5kZXggXj0gMTtcblxuXHRcdC8vIHJ1biBhY3RpdmUgYWN0aW9uc1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpICE9PSBuQWN0aW9uczsgKysgaSApIHtcblxuXHRcdFx0dmFyIGFjdGlvbiA9IGFjdGlvbnNbIGkgXTtcblxuXHRcdFx0YWN0aW9uLl91cGRhdGUoIHRpbWUsIGRlbHRhVGltZSwgdGltZURpcmVjdGlvbiwgYWNjdUluZGV4ICk7XG5cblx0XHR9XG5cblx0XHQvLyB1cGRhdGUgc2NlbmUgZ3JhcGhcblxuXHRcdHZhciBiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzLFxuXHRcdFx0bkJpbmRpbmdzID0gdGhpcy5fbkFjdGl2ZUJpbmRpbmdzO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpICE9PSBuQmluZGluZ3M7ICsrIGkgKSB7XG5cblx0XHRcdGJpbmRpbmdzWyBpIF0uYXBwbHkoIGFjY3VJbmRleCApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHQvLyByZXR1cm4gdGhpcyBtaXhlcidzIHJvb3QgdGFyZ2V0IG9iamVjdFxuXHRnZXRSb290OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5fcm9vdDtcblxuXHR9LFxuXG5cdC8vIGZyZWUgYWxsIHJlc291cmNlcyBzcGVjaWZpYyB0byBhIHBhcnRpY3VsYXIgY2xpcFxuXHR1bmNhY2hlQ2xpcDogZnVuY3Rpb24gKCBjbGlwICkge1xuXG5cdFx0dmFyIGFjdGlvbnMgPSB0aGlzLl9hY3Rpb25zLFxuXHRcdFx0Y2xpcFV1aWQgPSBjbGlwLnV1aWQsXG5cdFx0XHRhY3Rpb25zQnlDbGlwID0gdGhpcy5fYWN0aW9uc0J5Q2xpcCxcblx0XHRcdGFjdGlvbnNGb3JDbGlwID0gYWN0aW9uc0J5Q2xpcFsgY2xpcFV1aWQgXTtcblxuXHRcdGlmICggYWN0aW9uc0ZvckNsaXAgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Ly8gbm90ZToganVzdCBjYWxsaW5nIF9yZW1vdmVJbmFjdGl2ZUFjdGlvbiB3b3VsZCBtZXNzIHVwIHRoZVxuXHRcdFx0Ly8gaXRlcmF0aW9uIHN0YXRlIGFuZCBhbHNvIHJlcXVpcmUgdXBkYXRpbmcgdGhlIHN0YXRlIHdlIGNhblxuXHRcdFx0Ly8ganVzdCB0aHJvdyBhd2F5XG5cblx0XHRcdHZhciBhY3Rpb25zVG9SZW1vdmUgPSBhY3Rpb25zRm9yQ2xpcC5rbm93bkFjdGlvbnM7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgbiA9IGFjdGlvbnNUb1JlbW92ZS5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRcdFx0dmFyIGFjdGlvbiA9IGFjdGlvbnNUb1JlbW92ZVsgaSBdO1xuXG5cdFx0XHRcdHRoaXMuX2RlYWN0aXZhdGVBY3Rpb24oIGFjdGlvbiApO1xuXG5cdFx0XHRcdHZhciBjYWNoZUluZGV4ID0gYWN0aW9uLl9jYWNoZUluZGV4LFxuXHRcdFx0XHRcdGxhc3RJbmFjdGl2ZUFjdGlvbiA9IGFjdGlvbnNbIGFjdGlvbnMubGVuZ3RoIC0gMSBdO1xuXG5cdFx0XHRcdGFjdGlvbi5fY2FjaGVJbmRleCA9IG51bGw7XG5cdFx0XHRcdGFjdGlvbi5fYnlDbGlwQ2FjaGVJbmRleCA9IG51bGw7XG5cblx0XHRcdFx0bGFzdEluYWN0aXZlQWN0aW9uLl9jYWNoZUluZGV4ID0gY2FjaGVJbmRleDtcblx0XHRcdFx0YWN0aW9uc1sgY2FjaGVJbmRleCBdID0gbGFzdEluYWN0aXZlQWN0aW9uO1xuXHRcdFx0XHRhY3Rpb25zLnBvcCgpO1xuXG5cdFx0XHRcdHRoaXMuX3JlbW92ZUluYWN0aXZlQmluZGluZ3NGb3JBY3Rpb24oIGFjdGlvbiApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGRlbGV0ZSBhY3Rpb25zQnlDbGlwWyBjbGlwVXVpZCBdO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0Ly8gZnJlZSBhbGwgcmVzb3VyY2VzIHNwZWNpZmljIHRvIGEgcGFydGljdWxhciByb290IHRhcmdldCBvYmplY3Rcblx0dW5jYWNoZVJvb3Q6IGZ1bmN0aW9uICggcm9vdCApIHtcblxuXHRcdHZhciByb290VXVpZCA9IHJvb3QudXVpZCxcblx0XHRcdGFjdGlvbnNCeUNsaXAgPSB0aGlzLl9hY3Rpb25zQnlDbGlwO1xuXG5cdFx0Zm9yICggdmFyIGNsaXBVdWlkIGluIGFjdGlvbnNCeUNsaXAgKSB7XG5cblx0XHRcdHZhciBhY3Rpb25CeVJvb3QgPSBhY3Rpb25zQnlDbGlwWyBjbGlwVXVpZCBdLmFjdGlvbkJ5Um9vdCxcblx0XHRcdFx0YWN0aW9uID0gYWN0aW9uQnlSb290WyByb290VXVpZCBdO1xuXG5cdFx0XHRpZiAoIGFjdGlvbiAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHRoaXMuX2RlYWN0aXZhdGVBY3Rpb24oIGFjdGlvbiApO1xuXHRcdFx0XHR0aGlzLl9yZW1vdmVJbmFjdGl2ZUFjdGlvbiggYWN0aW9uICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHZhciBiaW5kaW5nc0J5Um9vdCA9IHRoaXMuX2JpbmRpbmdzQnlSb290QW5kTmFtZSxcblx0XHRcdGJpbmRpbmdCeU5hbWUgPSBiaW5kaW5nc0J5Um9vdFsgcm9vdFV1aWQgXTtcblxuXHRcdGlmICggYmluZGluZ0J5TmFtZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRmb3IgKCB2YXIgdHJhY2tOYW1lIGluIGJpbmRpbmdCeU5hbWUgKSB7XG5cblx0XHRcdFx0dmFyIGJpbmRpbmcgPSBiaW5kaW5nQnlOYW1lWyB0cmFja05hbWUgXTtcblx0XHRcdFx0YmluZGluZy5yZXN0b3JlT3JpZ2luYWxTdGF0ZSgpO1xuXHRcdFx0XHR0aGlzLl9yZW1vdmVJbmFjdGl2ZUJpbmRpbmcoIGJpbmRpbmcgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH0sXG5cblx0Ly8gcmVtb3ZlIGEgdGFyZ2V0ZWQgY2xpcCBmcm9tIHRoZSBjYWNoZVxuXHR1bmNhY2hlQWN0aW9uOiBmdW5jdGlvbiAoIGNsaXAsIG9wdGlvbmFsUm9vdCApIHtcblxuXHRcdHZhciBhY3Rpb24gPSB0aGlzLmV4aXN0aW5nQWN0aW9uKCBjbGlwLCBvcHRpb25hbFJvb3QgKTtcblxuXHRcdGlmICggYWN0aW9uICE9PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLl9kZWFjdGl2YXRlQWN0aW9uKCBhY3Rpb24gKTtcblx0XHRcdHRoaXMuX3JlbW92ZUluYWN0aXZlQWN0aW9uKCBhY3Rpb24gKTtcblxuXHRcdH1cblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIFVuaWZvcm0oIHZhbHVlICkge1xuXG5cdGlmICggdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlVuaWZvcm06IFR5cGUgcGFyYW1ldGVyIGlzIG5vIGxvbmdlciBuZWVkZWQuJyApO1xuXHRcdHZhbHVlID0gYXJndW1lbnRzWyAxIF07XG5cblx0fVxuXG5cdHRoaXMudmFsdWUgPSB2YWx1ZTtcblxufVxuXG5Vbmlmb3JtLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uICgpIHtcblxuXHRyZXR1cm4gbmV3IFVuaWZvcm0oIHRoaXMudmFsdWUuY2xvbmUgPT09IHVuZGVmaW5lZCA/IHRoaXMudmFsdWUgOiB0aGlzLnZhbHVlLmNsb25lKCkgKTtcblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIGJlbmFhZGFtcyAvIGh0dHBzOi8vdHdpdHRlci5jb20vYmVuX2FfYWRhbXNcbiAqL1xuXG5mdW5jdGlvbiBJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSgpIHtcblxuXHRCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5Jztcblx0dGhpcy5tYXhJbnN0YW5jZWRDb3VudCA9IHVuZGVmaW5lZDtcblxufVxuXG5JbnN0YW5jZWRCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSxcblxuXHRpc0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5OiB0cnVlLFxuXG5cdGFkZEdyb3VwOiBmdW5jdGlvbiAoIHN0YXJ0LCBjb3VudCwgbWF0ZXJpYWxJbmRleCApIHtcblxuXHRcdHRoaXMuZ3JvdXBzLnB1c2goIHtcblxuXHRcdFx0c3RhcnQ6IHN0YXJ0LFxuXHRcdFx0Y291bnQ6IGNvdW50LFxuXHRcdFx0bWF0ZXJpYWxJbmRleDogbWF0ZXJpYWxJbmRleFxuXG5cdFx0fSApO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHR2YXIgaW5kZXggPSBzb3VyY2UuaW5kZXg7XG5cblx0XHRpZiAoIGluZGV4ICE9PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLnNldEluZGV4KCBpbmRleC5jbG9uZSgpICk7XG5cblx0XHR9XG5cblx0XHR2YXIgYXR0cmlidXRlcyA9IHNvdXJjZS5hdHRyaWJ1dGVzO1xuXG5cdFx0Zm9yICggdmFyIG5hbWUgaW4gYXR0cmlidXRlcyApIHtcblxuXHRcdFx0dmFyIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXNbIG5hbWUgXTtcblx0XHRcdHRoaXMuYWRkQXR0cmlidXRlKCBuYW1lLCBhdHRyaWJ1dGUuY2xvbmUoKSApO1xuXG5cdFx0fVxuXG5cdFx0dmFyIGdyb3VwcyA9IHNvdXJjZS5ncm91cHM7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBncm91cHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGdyb3VwID0gZ3JvdXBzWyBpIF07XG5cdFx0XHR0aGlzLmFkZEdyb3VwKCBncm91cC5zdGFydCwgZ3JvdXAuY291bnQsIGdyb3VwLm1hdGVyaWFsSW5kZXggKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgYmVuYWFkYW1zIC8gaHR0cHM6Ly90d2l0dGVyLmNvbS9iZW5fYV9hZGFtc1xuICovXG5cbmZ1bmN0aW9uIEludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlKCBpbnRlcmxlYXZlZEJ1ZmZlciwgaXRlbVNpemUsIG9mZnNldCwgbm9ybWFsaXplZCApIHtcblxuXHR0aGlzLnV1aWQgPSBfTWF0aC5nZW5lcmF0ZVVVSUQoKTtcblxuXHR0aGlzLmRhdGEgPSBpbnRlcmxlYXZlZEJ1ZmZlcjtcblx0dGhpcy5pdGVtU2l6ZSA9IGl0ZW1TaXplO1xuXHR0aGlzLm9mZnNldCA9IG9mZnNldDtcblxuXHR0aGlzLm5vcm1hbGl6ZWQgPSBub3JtYWxpemVkID09PSB0cnVlO1xuXG59XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUsIHtcblxuXHRjb3VudDoge1xuXG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLmRhdGEuY291bnQ7XG5cblx0XHR9XG5cblx0fSxcblxuXHRhcnJheToge1xuXG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLmRhdGEuYXJyYXk7XG5cblx0XHR9XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5hc3NpZ24oIEludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSwge1xuXG5cdGlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGU6IHRydWUsXG5cblx0c2V0WDogZnVuY3Rpb24gKCBpbmRleCwgeCApIHtcblxuXHRcdHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKiB0aGlzLmRhdGEuc3RyaWRlICsgdGhpcy5vZmZzZXQgXSA9IHg7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFk6IGZ1bmN0aW9uICggaW5kZXgsIHkgKSB7XG5cblx0XHR0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0ICsgMSBdID0geTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0WjogZnVuY3Rpb24gKCBpbmRleCwgeiApIHtcblxuXHRcdHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKiB0aGlzLmRhdGEuc3RyaWRlICsgdGhpcy5vZmZzZXQgKyAyIF0gPSB6O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRXOiBmdW5jdGlvbiAoIGluZGV4LCB3ICkge1xuXG5cdFx0dGhpcy5kYXRhLmFycmF5WyBpbmRleCAqIHRoaXMuZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNldCArIDMgXSA9IHc7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGdldFg6IGZ1bmN0aW9uICggaW5kZXggKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5kYXRhLmFycmF5WyBpbmRleCAqIHRoaXMuZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNldCBdO1xuXG5cdH0sXG5cblx0Z2V0WTogZnVuY3Rpb24gKCBpbmRleCApIHtcblxuXHRcdHJldHVybiB0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0ICsgMSBdO1xuXG5cdH0sXG5cblx0Z2V0WjogZnVuY3Rpb24gKCBpbmRleCApIHtcblxuXHRcdHJldHVybiB0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0ICsgMiBdO1xuXG5cdH0sXG5cblx0Z2V0VzogZnVuY3Rpb24gKCBpbmRleCApIHtcblxuXHRcdHJldHVybiB0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0ICsgMyBdO1xuXG5cdH0sXG5cblx0c2V0WFk6IGZ1bmN0aW9uICggaW5kZXgsIHgsIHkgKSB7XG5cblx0XHRpbmRleCA9IGluZGV4ICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0O1xuXG5cdFx0dGhpcy5kYXRhLmFycmF5WyBpbmRleCArIDAgXSA9IHg7XG5cdFx0dGhpcy5kYXRhLmFycmF5WyBpbmRleCArIDEgXSA9IHk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFhZWjogZnVuY3Rpb24gKCBpbmRleCwgeCwgeSwgeiApIHtcblxuXHRcdGluZGV4ID0gaW5kZXggKiB0aGlzLmRhdGEuc3RyaWRlICsgdGhpcy5vZmZzZXQ7XG5cblx0XHR0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICsgMCBdID0geDtcblx0XHR0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICsgMSBdID0geTtcblx0XHR0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICsgMiBdID0gejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0WFlaVzogZnVuY3Rpb24gKCBpbmRleCwgeCwgeSwgeiwgdyApIHtcblxuXHRcdGluZGV4ID0gaW5kZXggKiB0aGlzLmRhdGEuc3RyaWRlICsgdGhpcy5vZmZzZXQ7XG5cblx0XHR0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICsgMCBdID0geDtcblx0XHR0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICsgMSBdID0geTtcblx0XHR0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICsgMiBdID0gejtcblx0XHR0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICsgMyBdID0gdztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgYmVuYWFkYW1zIC8gaHR0cHM6Ly90d2l0dGVyLmNvbS9iZW5fYV9hZGFtc1xuICovXG5cbmZ1bmN0aW9uIEludGVybGVhdmVkQnVmZmVyKCBhcnJheSwgc3RyaWRlICkge1xuXG5cdHRoaXMudXVpZCA9IF9NYXRoLmdlbmVyYXRlVVVJRCgpO1xuXG5cdHRoaXMuYXJyYXkgPSBhcnJheTtcblx0dGhpcy5zdHJpZGUgPSBzdHJpZGU7XG5cdHRoaXMuY291bnQgPSBhcnJheSAhPT0gdW5kZWZpbmVkID8gYXJyYXkubGVuZ3RoIC8gc3RyaWRlIDogMDtcblxuXHR0aGlzLmR5bmFtaWMgPSBmYWxzZTtcblx0dGhpcy51cGRhdGVSYW5nZSA9IHsgb2Zmc2V0OiAwLCBjb3VudDogLSAxIH07XG5cblx0dGhpcy5vblVwbG9hZENhbGxiYWNrID0gZnVuY3Rpb24gKCkge307XG5cblx0dGhpcy52ZXJzaW9uID0gMDtcblxufVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoIEludGVybGVhdmVkQnVmZmVyLnByb3RvdHlwZSwgJ25lZWRzVXBkYXRlJywge1xuXG5cdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdGlmICggdmFsdWUgPT09IHRydWUgKSB0aGlzLnZlcnNpb24gKys7XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5hc3NpZ24oIEludGVybGVhdmVkQnVmZmVyLnByb3RvdHlwZSwge1xuXG5cdGlzSW50ZXJsZWF2ZWRCdWZmZXI6IHRydWUsXG5cblx0c2V0QXJyYXk6IGZ1bmN0aW9uICggYXJyYXkgKSB7XG5cblx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIGFycmF5ICkgKSB7XG5cblx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoICdUSFJFRS5CdWZmZXJBdHRyaWJ1dGU6IGFycmF5IHNob3VsZCBiZSBhIFR5cGVkIEFycmF5LicgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMuY291bnQgPSBhcnJheSAhPT0gdW5kZWZpbmVkID8gYXJyYXkubGVuZ3RoIC8gdGhpcy5zdHJpZGUgOiAwO1xuXHRcdHRoaXMuYXJyYXkgPSBhcnJheTtcblxuXHR9LFxuXG5cdHNldER5bmFtaWM6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLmR5bmFtaWMgPSB2YWx1ZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHR0aGlzLmFycmF5ID0gbmV3IHNvdXJjZS5hcnJheS5jb25zdHJ1Y3Rvciggc291cmNlLmFycmF5ICk7XG5cdFx0dGhpcy5jb3VudCA9IHNvdXJjZS5jb3VudDtcblx0XHR0aGlzLnN0cmlkZSA9IHNvdXJjZS5zdHJpZGU7XG5cdFx0dGhpcy5keW5hbWljID0gc291cmNlLmR5bmFtaWM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvcHlBdDogZnVuY3Rpb24gKCBpbmRleDEsIGF0dHJpYnV0ZSwgaW5kZXgyICkge1xuXG5cdFx0aW5kZXgxICo9IHRoaXMuc3RyaWRlO1xuXHRcdGluZGV4MiAqPSBhdHRyaWJ1dGUuc3RyaWRlO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gdGhpcy5zdHJpZGU7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR0aGlzLmFycmF5WyBpbmRleDEgKyBpIF0gPSBhdHRyaWJ1dGUuYXJyYXlbIGluZGV4MiArIGkgXTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlLCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0gMDtcblxuXHRcdHRoaXMuYXJyYXkuc2V0KCB2YWx1ZSwgb2Zmc2V0ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XG5cblx0fSxcblxuXHRvblVwbG9hZDogZnVuY3Rpb24gKCBjYWxsYmFjayApIHtcblxuXHRcdHRoaXMub25VcGxvYWRDYWxsYmFjayA9IGNhbGxiYWNrO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBiZW5hYWRhbXMgLyBodHRwczovL3R3aXR0ZXIuY29tL2Jlbl9hX2FkYW1zXG4gKi9cblxuZnVuY3Rpb24gSW5zdGFuY2VkSW50ZXJsZWF2ZWRCdWZmZXIoIGFycmF5LCBzdHJpZGUsIG1lc2hQZXJBdHRyaWJ1dGUgKSB7XG5cblx0SW50ZXJsZWF2ZWRCdWZmZXIuY2FsbCggdGhpcywgYXJyYXksIHN0cmlkZSApO1xuXG5cdHRoaXMubWVzaFBlckF0dHJpYnV0ZSA9IG1lc2hQZXJBdHRyaWJ1dGUgfHwgMTtcblxufVxuXG5JbnN0YW5jZWRJbnRlcmxlYXZlZEJ1ZmZlci5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBJbnRlcmxlYXZlZEJ1ZmZlci5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBJbnN0YW5jZWRJbnRlcmxlYXZlZEJ1ZmZlcixcblxuXHRpc0luc3RhbmNlZEludGVybGVhdmVkQnVmZmVyOiB0cnVlLFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0SW50ZXJsZWF2ZWRCdWZmZXIucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0XHR0aGlzLm1lc2hQZXJBdHRyaWJ1dGUgPSBzb3VyY2UubWVzaFBlckF0dHJpYnV0ZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgYmVuYWFkYW1zIC8gaHR0cHM6Ly90d2l0dGVyLmNvbS9iZW5fYV9hZGFtc1xuICovXG5cbmZ1bmN0aW9uIEluc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplLCBtZXNoUGVyQXR0cmlidXRlICkge1xuXG5cdEJ1ZmZlckF0dHJpYnV0ZS5jYWxsKCB0aGlzLCBhcnJheSwgaXRlbVNpemUgKTtcblxuXHR0aGlzLm1lc2hQZXJBdHRyaWJ1dGUgPSBtZXNoUGVyQXR0cmlidXRlIHx8IDE7XG5cbn1cblxuSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUsXG5cblx0aXNJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGU6IHRydWUsXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHRCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0XHR0aGlzLm1lc2hQZXJBdHRyaWJ1dGUgPSBzb3VyY2UubWVzaFBlckF0dHJpYnV0ZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvL1xuICogQGF1dGhvciBzdGVwaG9taSAvIGh0dHA6Ly9zdGVwaGFuZWdpbmllci5jb20vXG4gKi9cblxuZnVuY3Rpb24gUmF5Y2FzdGVyKCBvcmlnaW4sIGRpcmVjdGlvbiwgbmVhciwgZmFyICkge1xuXG5cdHRoaXMucmF5ID0gbmV3IFJheSggb3JpZ2luLCBkaXJlY3Rpb24gKTtcblx0Ly8gZGlyZWN0aW9uIGlzIGFzc3VtZWQgdG8gYmUgbm9ybWFsaXplZCAoZm9yIGFjY3VyYXRlIGRpc3RhbmNlIGNhbGN1bGF0aW9ucylcblxuXHR0aGlzLm5lYXIgPSBuZWFyIHx8IDA7XG5cdHRoaXMuZmFyID0gZmFyIHx8IEluZmluaXR5O1xuXG5cdHRoaXMucGFyYW1zID0ge1xuXHRcdE1lc2g6IHt9LFxuXHRcdExpbmU6IHt9LFxuXHRcdExPRDoge30sXG5cdFx0UG9pbnRzOiB7IHRocmVzaG9sZDogMSB9LFxuXHRcdFNwcml0ZToge31cblx0fTtcblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydGllcyggdGhpcy5wYXJhbXMsIHtcblx0XHRQb2ludENsb3VkOiB7XG5cdFx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuUmF5Y2FzdGVyOiBwYXJhbXMuUG9pbnRDbG91ZCBoYXMgYmVlbiByZW5hbWVkIHRvIHBhcmFtcy5Qb2ludHMuJyApO1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5Qb2ludHM7XG5cdFx0XHR9XG5cdFx0fVxuXHR9ICk7XG5cbn1cblxuZnVuY3Rpb24gYXNjU29ydCggYSwgYiApIHtcblxuXHRyZXR1cm4gYS5kaXN0YW5jZSAtIGIuZGlzdGFuY2U7XG5cbn1cblxuZnVuY3Rpb24gaW50ZXJzZWN0T2JqZWN0KCBvYmplY3QsIHJheWNhc3RlciwgaW50ZXJzZWN0cywgcmVjdXJzaXZlICkge1xuXG5cdGlmICggb2JqZWN0LnZpc2libGUgPT09IGZhbHNlICkgcmV0dXJuO1xuXG5cdG9iamVjdC5yYXljYXN0KCByYXljYXN0ZXIsIGludGVyc2VjdHMgKTtcblxuXHRpZiAoIHJlY3Vyc2l2ZSA9PT0gdHJ1ZSApIHtcblxuXHRcdHZhciBjaGlsZHJlbiA9IG9iamVjdC5jaGlsZHJlbjtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdGludGVyc2VjdE9iamVjdCggY2hpbGRyZW5bIGkgXSwgcmF5Y2FzdGVyLCBpbnRlcnNlY3RzLCB0cnVlICk7XG5cblx0XHR9XG5cblx0fVxuXG59XG5cbk9iamVjdC5hc3NpZ24oIFJheWNhc3Rlci5wcm90b3R5cGUsIHtcblxuXHRsaW5lUHJlY2lzaW9uOiAxLFxuXG5cdHNldDogZnVuY3Rpb24gKCBvcmlnaW4sIGRpcmVjdGlvbiApIHtcblxuXHRcdC8vIGRpcmVjdGlvbiBpcyBhc3N1bWVkIHRvIGJlIG5vcm1hbGl6ZWQgKGZvciBhY2N1cmF0ZSBkaXN0YW5jZSBjYWxjdWxhdGlvbnMpXG5cblx0XHR0aGlzLnJheS5zZXQoIG9yaWdpbiwgZGlyZWN0aW9uICk7XG5cblx0fSxcblxuXHRzZXRGcm9tQ2FtZXJhOiBmdW5jdGlvbiAoIGNvb3JkcywgY2FtZXJhICkge1xuXG5cdFx0aWYgKCAoIGNhbWVyYSAmJiBjYW1lcmEuaXNQZXJzcGVjdGl2ZUNhbWVyYSApICkge1xuXG5cdFx0XHR0aGlzLnJheS5vcmlnaW4uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBjYW1lcmEubWF0cml4V29ybGQgKTtcblx0XHRcdHRoaXMucmF5LmRpcmVjdGlvbi5zZXQoIGNvb3Jkcy54LCBjb29yZHMueSwgMC41ICkudW5wcm9qZWN0KCBjYW1lcmEgKS5zdWIoIHRoaXMucmF5Lm9yaWdpbiApLm5vcm1hbGl6ZSgpO1xuXG5cdFx0fSBlbHNlIGlmICggKCBjYW1lcmEgJiYgY2FtZXJhLmlzT3J0aG9ncmFwaGljQ2FtZXJhICkgKSB7XG5cblx0XHRcdHRoaXMucmF5Lm9yaWdpbi5zZXQoIGNvb3Jkcy54LCBjb29yZHMueSwgKCBjYW1lcmEubmVhciArIGNhbWVyYS5mYXIgKSAvICggY2FtZXJhLm5lYXIgLSBjYW1lcmEuZmFyICkgKS51bnByb2plY3QoIGNhbWVyYSApOyAvLyBzZXQgb3JpZ2luIGluIHBsYW5lIG9mIGNhbWVyYVxuXHRcdFx0dGhpcy5yYXkuZGlyZWN0aW9uLnNldCggMCwgMCwgLSAxICkudHJhbnNmb3JtRGlyZWN0aW9uKCBjYW1lcmEubWF0cml4V29ybGQgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5SYXljYXN0ZXI6IFVuc3VwcG9ydGVkIGNhbWVyYSB0eXBlLicgKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdGludGVyc2VjdE9iamVjdDogZnVuY3Rpb24gKCBvYmplY3QsIHJlY3Vyc2l2ZSApIHtcblxuXHRcdHZhciBpbnRlcnNlY3RzID0gW107XG5cblx0XHRpbnRlcnNlY3RPYmplY3QoIG9iamVjdCwgdGhpcywgaW50ZXJzZWN0cywgcmVjdXJzaXZlICk7XG5cblx0XHRpbnRlcnNlY3RzLnNvcnQoIGFzY1NvcnQgKTtcblxuXHRcdHJldHVybiBpbnRlcnNlY3RzO1xuXG5cdH0sXG5cblx0aW50ZXJzZWN0T2JqZWN0czogZnVuY3Rpb24gKCBvYmplY3RzLCByZWN1cnNpdmUgKSB7XG5cblx0XHR2YXIgaW50ZXJzZWN0cyA9IFtdO1xuXG5cdFx0aWYgKCBBcnJheS5pc0FycmF5KCBvYmplY3RzICkgPT09IGZhbHNlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5SYXljYXN0ZXIuaW50ZXJzZWN0T2JqZWN0czogb2JqZWN0cyBpcyBub3QgYW4gQXJyYXkuJyApO1xuXHRcdFx0cmV0dXJuIGludGVyc2VjdHM7XG5cblx0XHR9XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBvYmplY3RzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdGludGVyc2VjdE9iamVjdCggb2JqZWN0c1sgaSBdLCB0aGlzLCBpbnRlcnNlY3RzLCByZWN1cnNpdmUgKTtcblxuXHRcdH1cblxuXHRcdGludGVyc2VjdHMuc29ydCggYXNjU29ydCApO1xuXG5cdFx0cmV0dXJuIGludGVyc2VjdHM7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBDbG9jayggYXV0b1N0YXJ0ICkge1xuXG5cdHRoaXMuYXV0b1N0YXJ0ID0gKCBhdXRvU3RhcnQgIT09IHVuZGVmaW5lZCApID8gYXV0b1N0YXJ0IDogdHJ1ZTtcblxuXHR0aGlzLnN0YXJ0VGltZSA9IDA7XG5cdHRoaXMub2xkVGltZSA9IDA7XG5cdHRoaXMuZWxhcHNlZFRpbWUgPSAwO1xuXG5cdHRoaXMucnVubmluZyA9IGZhbHNlO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIENsb2NrLnByb3RvdHlwZSwge1xuXG5cdHN0YXJ0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLnN0YXJ0VGltZSA9ICggdHlwZW9mIHBlcmZvcm1hbmNlID09PSAndW5kZWZpbmVkJyA/IERhdGUgOiBwZXJmb3JtYW5jZSApLm5vdygpOyAvLyBzZWUgIzEwNzMyXG5cblx0XHR0aGlzLm9sZFRpbWUgPSB0aGlzLnN0YXJ0VGltZTtcblx0XHR0aGlzLmVsYXBzZWRUaW1lID0gMDtcblx0XHR0aGlzLnJ1bm5pbmcgPSB0cnVlO1xuXG5cdH0sXG5cblx0c3RvcDogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5nZXRFbGFwc2VkVGltZSgpO1xuXHRcdHRoaXMucnVubmluZyA9IGZhbHNlO1xuXG5cdH0sXG5cblx0Z2V0RWxhcHNlZFRpbWU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuZ2V0RGVsdGEoKTtcblx0XHRyZXR1cm4gdGhpcy5lbGFwc2VkVGltZTtcblxuXHR9LFxuXG5cdGdldERlbHRhOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgZGlmZiA9IDA7XG5cblx0XHRpZiAoIHRoaXMuYXV0b1N0YXJ0ICYmICEgdGhpcy5ydW5uaW5nICkge1xuXG5cdFx0XHR0aGlzLnN0YXJ0KCk7XG5cdFx0XHRyZXR1cm4gMDtcblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5ydW5uaW5nICkge1xuXG5cdFx0XHR2YXIgbmV3VGltZSA9ICggdHlwZW9mIHBlcmZvcm1hbmNlID09PSAndW5kZWZpbmVkJyA/IERhdGUgOiBwZXJmb3JtYW5jZSApLm5vdygpO1xuXG5cdFx0XHRkaWZmID0gKCBuZXdUaW1lIC0gdGhpcy5vbGRUaW1lICkgLyAxMDAwO1xuXHRcdFx0dGhpcy5vbGRUaW1lID0gbmV3VGltZTtcblxuXHRcdFx0dGhpcy5lbGFwc2VkVGltZSArPSBkaWZmO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGRpZmY7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pb1xuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKlxuICogUmVmOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TcGhlcmljYWxfY29vcmRpbmF0ZV9zeXN0ZW1cbiAqXG4gKiBUaGUgcG9sZXMgKHBoaSkgYXJlIGF0IHRoZSBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgeSBheGlzLlxuICogVGhlIGVxdWF0b3Igc3RhcnRzIGF0IHBvc2l0aXZlIHouXG4gKi9cblxuZnVuY3Rpb24gU3BoZXJpY2FsKCByYWRpdXMsIHBoaSwgdGhldGEgKSB7XG5cblx0dGhpcy5yYWRpdXMgPSAoIHJhZGl1cyAhPT0gdW5kZWZpbmVkICkgPyByYWRpdXMgOiAxLjA7XG5cdHRoaXMucGhpID0gKCBwaGkgIT09IHVuZGVmaW5lZCApID8gcGhpIDogMDsgLy8gdXAgLyBkb3duIHRvd2FyZHMgdG9wIGFuZCBib3R0b20gcG9sZVxuXHR0aGlzLnRoZXRhID0gKCB0aGV0YSAhPT0gdW5kZWZpbmVkICkgPyB0aGV0YSA6IDA7IC8vIGFyb3VuZCB0aGUgZXF1YXRvciBvZiB0aGUgc3BoZXJlXG5cblx0cmV0dXJuIHRoaXM7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggU3BoZXJpY2FsLnByb3RvdHlwZSwge1xuXG5cdHNldDogZnVuY3Rpb24gKCByYWRpdXMsIHBoaSwgdGhldGEgKSB7XG5cblx0XHR0aGlzLnJhZGl1cyA9IHJhZGl1cztcblx0XHR0aGlzLnBoaSA9IHBoaTtcblx0XHR0aGlzLnRoZXRhID0gdGhldGE7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XG5cblx0fSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIG90aGVyICkge1xuXG5cdFx0dGhpcy5yYWRpdXMgPSBvdGhlci5yYWRpdXM7XG5cdFx0dGhpcy5waGkgPSBvdGhlci5waGk7XG5cdFx0dGhpcy50aGV0YSA9IG90aGVyLnRoZXRhO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHQvLyByZXN0cmljdCBwaGkgdG8gYmUgYmV0d2VlIEVQUyBhbmQgUEktRVBTXG5cdG1ha2VTYWZlOiBmdW5jdGlvbigpIHtcblxuXHRcdHZhciBFUFMgPSAwLjAwMDAwMTtcblx0XHR0aGlzLnBoaSA9IE1hdGgubWF4KCBFUFMsIE1hdGgubWluKCBNYXRoLlBJIC0gRVBTLCB0aGlzLnBoaSApICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21WZWN0b3IzOiBmdW5jdGlvbiggdmVjMyApIHtcblxuXHRcdHRoaXMucmFkaXVzID0gdmVjMy5sZW5ndGgoKTtcblxuXHRcdGlmICggdGhpcy5yYWRpdXMgPT09IDAgKSB7XG5cblx0XHRcdHRoaXMudGhldGEgPSAwO1xuXHRcdFx0dGhpcy5waGkgPSAwO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dGhpcy50aGV0YSA9IE1hdGguYXRhbjIoIHZlYzMueCwgdmVjMy56ICk7IC8vIGVxdWF0b3IgYW5nbGUgYXJvdW5kIHktdXAgYXhpc1xuXHRcdFx0dGhpcy5waGkgPSBNYXRoLmFjb3MoIF9NYXRoLmNsYW1wKCB2ZWMzLnkgLyB0aGlzLnJhZGl1cywgLSAxLCAxICkgKTsgLy8gcG9sYXIgYW5nbGVcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKlxuICogUmVmOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9DeWxpbmRyaWNhbF9jb29yZGluYXRlX3N5c3RlbVxuICpcbiAqL1xuXG5mdW5jdGlvbiBDeWxpbmRyaWNhbCggcmFkaXVzLCB0aGV0YSwgeSApIHtcblxuXHR0aGlzLnJhZGl1cyA9ICggcmFkaXVzICE9PSB1bmRlZmluZWQgKSA/IHJhZGl1cyA6IDEuMDsgLy8gZGlzdGFuY2UgZnJvbSB0aGUgb3JpZ2luIHRvIGEgcG9pbnQgaW4gdGhlIHgteiBwbGFuZVxuXHR0aGlzLnRoZXRhID0gKCB0aGV0YSAhPT0gdW5kZWZpbmVkICkgPyB0aGV0YSA6IDA7IC8vIGNvdW50ZXJjbG9ja3dpc2UgYW5nbGUgaW4gdGhlIHgteiBwbGFuZSBtZWFzdXJlZCBpbiByYWRpYW5zIGZyb20gdGhlIHBvc2l0aXZlIHotYXhpc1xuXHR0aGlzLnkgPSAoIHkgIT09IHVuZGVmaW5lZCApID8geSA6IDA7IC8vIGhlaWdodCBhYm92ZSB0aGUgeC16IHBsYW5lXG5cblx0cmV0dXJuIHRoaXM7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggQ3lsaW5kcmljYWwucHJvdG90eXBlLCB7XG5cblx0c2V0OiBmdW5jdGlvbiAoIHJhZGl1cywgdGhldGEsIHkgKSB7XG5cblx0XHR0aGlzLnJhZGl1cyA9IHJhZGl1cztcblx0XHR0aGlzLnRoZXRhID0gdGhldGE7XG5cdFx0dGhpcy55ID0geTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggb3RoZXIgKSB7XG5cblx0XHR0aGlzLnJhZGl1cyA9IG90aGVyLnJhZGl1cztcblx0XHR0aGlzLnRoZXRhID0gb3RoZXIudGhldGE7XG5cdFx0dGhpcy55ID0gb3RoZXIueTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0RnJvbVZlY3RvcjM6IGZ1bmN0aW9uKCB2ZWMzICkge1xuXG5cdFx0dGhpcy5yYWRpdXMgPSBNYXRoLnNxcnQoIHZlYzMueCAqIHZlYzMueCArIHZlYzMueiAqIHZlYzMueiApO1xuXHRcdHRoaXMudGhldGEgPSBNYXRoLmF0YW4yKCB2ZWMzLngsIHZlYzMueiApO1xuXHRcdHRoaXMueSA9IHZlYzMueTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG4vKipcclxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cclxuICovXHJcblxyXG5mdW5jdGlvbiBNb3JwaEJsZW5kTWVzaCggZ2VvbWV0cnksIG1hdGVyaWFsICkge1xuXHJcblx0TWVzaC5jYWxsKCB0aGlzLCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcclxuXHJcblx0dGhpcy5hbmltYXRpb25zTWFwID0ge307XHJcblx0dGhpcy5hbmltYXRpb25zTGlzdCA9IFtdO1xyXG5cclxuXHQvLyBwcmVwYXJlIGRlZmF1bHQgYW5pbWF0aW9uXHJcblx0Ly8gKGFsbCBmcmFtZXMgcGxheWVkIHRvZ2V0aGVyIGluIDEgc2Vjb25kKVxyXG5cclxuXHR2YXIgbnVtRnJhbWVzID0gdGhpcy5nZW9tZXRyeS5tb3JwaFRhcmdldHMubGVuZ3RoO1xyXG5cclxuXHR2YXIgbmFtZSA9IFwiX19kZWZhdWx0XCI7XHJcblxyXG5cdHZhciBzdGFydEZyYW1lID0gMDtcclxuXHR2YXIgZW5kRnJhbWUgPSBudW1GcmFtZXMgLSAxO1xyXG5cclxuXHR2YXIgZnBzID0gbnVtRnJhbWVzIC8gMTtcclxuXHJcblx0dGhpcy5jcmVhdGVBbmltYXRpb24oIG5hbWUsIHN0YXJ0RnJhbWUsIGVuZEZyYW1lLCBmcHMgKTtcclxuXHR0aGlzLnNldEFuaW1hdGlvbldlaWdodCggbmFtZSwgMSApO1xyXG5cclxufVxyXG5cclxuTW9ycGhCbGVuZE1lc2gucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTWVzaC5wcm90b3R5cGUgKTtcclxuTW9ycGhCbGVuZE1lc2gucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTW9ycGhCbGVuZE1lc2g7XHJcblxyXG5Nb3JwaEJsZW5kTWVzaC5wcm90b3R5cGUuY3JlYXRlQW5pbWF0aW9uID0gZnVuY3Rpb24gKCBuYW1lLCBzdGFydCwgZW5kLCBmcHMgKSB7XHJcblxyXG5cdHZhciBhbmltYXRpb24gPSB7XHJcblxyXG5cdFx0c3RhcnQ6IHN0YXJ0LFxyXG5cdFx0ZW5kOiBlbmQsXHJcblxyXG5cdFx0bGVuZ3RoOiBlbmQgLSBzdGFydCArIDEsXHJcblxyXG5cdFx0ZnBzOiBmcHMsXHJcblx0XHRkdXJhdGlvbjogKCBlbmQgLSBzdGFydCApIC8gZnBzLFxyXG5cclxuXHRcdGxhc3RGcmFtZTogMCxcclxuXHRcdGN1cnJlbnRGcmFtZTogMCxcclxuXHJcblx0XHRhY3RpdmU6IGZhbHNlLFxyXG5cclxuXHRcdHRpbWU6IDAsXHJcblx0XHRkaXJlY3Rpb246IDEsXHJcblx0XHR3ZWlnaHQ6IDEsXHJcblxyXG5cdFx0ZGlyZWN0aW9uQmFja3dhcmRzOiBmYWxzZSxcclxuXHRcdG1pcnJvcmVkTG9vcDogZmFsc2VcclxuXHJcblx0fTtcclxuXHJcblx0dGhpcy5hbmltYXRpb25zTWFwWyBuYW1lIF0gPSBhbmltYXRpb247XHJcblx0dGhpcy5hbmltYXRpb25zTGlzdC5wdXNoKCBhbmltYXRpb24gKTtcclxuXHJcbn07XHJcblxyXG5Nb3JwaEJsZW5kTWVzaC5wcm90b3R5cGUuYXV0b0NyZWF0ZUFuaW1hdGlvbnMgPSBmdW5jdGlvbiAoIGZwcyApIHtcclxuXHJcblx0dmFyIHBhdHRlcm4gPSAvKFthLXpdKylfPyhcXGQrKS9pO1xyXG5cclxuXHR2YXIgZmlyc3RBbmltYXRpb24sIGZyYW1lUmFuZ2VzID0ge307XHJcblxyXG5cdHZhciBnZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7XHJcblxyXG5cdGZvciAoIHZhciBpID0gMCwgaWwgPSBnZW9tZXRyeS5tb3JwaFRhcmdldHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XHJcblxyXG5cdFx0dmFyIG1vcnBoID0gZ2VvbWV0cnkubW9ycGhUYXJnZXRzWyBpIF07XHJcblx0XHR2YXIgY2h1bmtzID0gbW9ycGgubmFtZS5tYXRjaCggcGF0dGVybiApO1xyXG5cclxuXHRcdGlmICggY2h1bmtzICYmIGNodW5rcy5sZW5ndGggPiAxICkge1xyXG5cclxuXHRcdFx0dmFyIG5hbWUgPSBjaHVua3NbIDEgXTtcclxuXHJcblx0XHRcdGlmICggISBmcmFtZVJhbmdlc1sgbmFtZSBdICkgZnJhbWVSYW5nZXNbIG5hbWUgXSA9IHsgc3RhcnQ6IEluZmluaXR5LCBlbmQ6IC0gSW5maW5pdHkgfTtcclxuXHJcblx0XHRcdHZhciByYW5nZSA9IGZyYW1lUmFuZ2VzWyBuYW1lIF07XHJcblxyXG5cdFx0XHRpZiAoIGkgPCByYW5nZS5zdGFydCApIHJhbmdlLnN0YXJ0ID0gaTtcclxuXHRcdFx0aWYgKCBpID4gcmFuZ2UuZW5kICkgcmFuZ2UuZW5kID0gaTtcclxuXHJcblx0XHRcdGlmICggISBmaXJzdEFuaW1hdGlvbiApIGZpcnN0QW5pbWF0aW9uID0gbmFtZTtcclxuXHJcblx0XHR9XHJcblxyXG5cdH1cclxuXHJcblx0Zm9yICggdmFyIG5hbWUgaW4gZnJhbWVSYW5nZXMgKSB7XHJcblxyXG5cdFx0dmFyIHJhbmdlID0gZnJhbWVSYW5nZXNbIG5hbWUgXTtcclxuXHRcdHRoaXMuY3JlYXRlQW5pbWF0aW9uKCBuYW1lLCByYW5nZS5zdGFydCwgcmFuZ2UuZW5kLCBmcHMgKTtcclxuXHJcblx0fVxyXG5cclxuXHR0aGlzLmZpcnN0QW5pbWF0aW9uID0gZmlyc3RBbmltYXRpb247XHJcblxyXG59O1xyXG5cclxuTW9ycGhCbGVuZE1lc2gucHJvdG90eXBlLnNldEFuaW1hdGlvbkRpcmVjdGlvbkZvcndhcmQgPSBmdW5jdGlvbiAoIG5hbWUgKSB7XHJcblxyXG5cdHZhciBhbmltYXRpb24gPSB0aGlzLmFuaW1hdGlvbnNNYXBbIG5hbWUgXTtcclxuXHJcblx0aWYgKCBhbmltYXRpb24gKSB7XHJcblxyXG5cdFx0YW5pbWF0aW9uLmRpcmVjdGlvbiA9IDE7XHJcblx0XHRhbmltYXRpb24uZGlyZWN0aW9uQmFja3dhcmRzID0gZmFsc2U7XHJcblxyXG5cdH1cclxuXHJcbn07XHJcblxyXG5Nb3JwaEJsZW5kTWVzaC5wcm90b3R5cGUuc2V0QW5pbWF0aW9uRGlyZWN0aW9uQmFja3dhcmQgPSBmdW5jdGlvbiAoIG5hbWUgKSB7XHJcblxyXG5cdHZhciBhbmltYXRpb24gPSB0aGlzLmFuaW1hdGlvbnNNYXBbIG5hbWUgXTtcclxuXHJcblx0aWYgKCBhbmltYXRpb24gKSB7XHJcblxyXG5cdFx0YW5pbWF0aW9uLmRpcmVjdGlvbiA9IC0gMTtcclxuXHRcdGFuaW1hdGlvbi5kaXJlY3Rpb25CYWNrd2FyZHMgPSB0cnVlO1xyXG5cclxuXHR9XHJcblxyXG59O1xyXG5cclxuTW9ycGhCbGVuZE1lc2gucHJvdG90eXBlLnNldEFuaW1hdGlvbkZQUyA9IGZ1bmN0aW9uICggbmFtZSwgZnBzICkge1xyXG5cclxuXHR2YXIgYW5pbWF0aW9uID0gdGhpcy5hbmltYXRpb25zTWFwWyBuYW1lIF07XHJcblxyXG5cdGlmICggYW5pbWF0aW9uICkge1xyXG5cclxuXHRcdGFuaW1hdGlvbi5mcHMgPSBmcHM7XHJcblx0XHRhbmltYXRpb24uZHVyYXRpb24gPSAoIGFuaW1hdGlvbi5lbmQgLSBhbmltYXRpb24uc3RhcnQgKSAvIGFuaW1hdGlvbi5mcHM7XHJcblxyXG5cdH1cclxuXHJcbn07XHJcblxyXG5Nb3JwaEJsZW5kTWVzaC5wcm90b3R5cGUuc2V0QW5pbWF0aW9uRHVyYXRpb24gPSBmdW5jdGlvbiAoIG5hbWUsIGR1cmF0aW9uICkge1xyXG5cclxuXHR2YXIgYW5pbWF0aW9uID0gdGhpcy5hbmltYXRpb25zTWFwWyBuYW1lIF07XHJcblxyXG5cdGlmICggYW5pbWF0aW9uICkge1xyXG5cclxuXHRcdGFuaW1hdGlvbi5kdXJhdGlvbiA9IGR1cmF0aW9uO1xyXG5cdFx0YW5pbWF0aW9uLmZwcyA9ICggYW5pbWF0aW9uLmVuZCAtIGFuaW1hdGlvbi5zdGFydCApIC8gYW5pbWF0aW9uLmR1cmF0aW9uO1xyXG5cclxuXHR9XHJcblxyXG59O1xyXG5cclxuTW9ycGhCbGVuZE1lc2gucHJvdG90eXBlLnNldEFuaW1hdGlvbldlaWdodCA9IGZ1bmN0aW9uICggbmFtZSwgd2VpZ2h0ICkge1xyXG5cclxuXHR2YXIgYW5pbWF0aW9uID0gdGhpcy5hbmltYXRpb25zTWFwWyBuYW1lIF07XHJcblxyXG5cdGlmICggYW5pbWF0aW9uICkge1xyXG5cclxuXHRcdGFuaW1hdGlvbi53ZWlnaHQgPSB3ZWlnaHQ7XHJcblxyXG5cdH1cclxuXHJcbn07XHJcblxyXG5Nb3JwaEJsZW5kTWVzaC5wcm90b3R5cGUuc2V0QW5pbWF0aW9uVGltZSA9IGZ1bmN0aW9uICggbmFtZSwgdGltZSApIHtcclxuXHJcblx0dmFyIGFuaW1hdGlvbiA9IHRoaXMuYW5pbWF0aW9uc01hcFsgbmFtZSBdO1xyXG5cclxuXHRpZiAoIGFuaW1hdGlvbiApIHtcclxuXHJcblx0XHRhbmltYXRpb24udGltZSA9IHRpbWU7XHJcblxyXG5cdH1cclxuXHJcbn07XHJcblxyXG5Nb3JwaEJsZW5kTWVzaC5wcm90b3R5cGUuZ2V0QW5pbWF0aW9uVGltZSA9IGZ1bmN0aW9uICggbmFtZSApIHtcclxuXHJcblx0dmFyIHRpbWUgPSAwO1xyXG5cclxuXHR2YXIgYW5pbWF0aW9uID0gdGhpcy5hbmltYXRpb25zTWFwWyBuYW1lIF07XHJcblxyXG5cdGlmICggYW5pbWF0aW9uICkge1xyXG5cclxuXHRcdHRpbWUgPSBhbmltYXRpb24udGltZTtcclxuXHJcblx0fVxyXG5cclxuXHRyZXR1cm4gdGltZTtcclxuXHJcbn07XHJcblxyXG5Nb3JwaEJsZW5kTWVzaC5wcm90b3R5cGUuZ2V0QW5pbWF0aW9uRHVyYXRpb24gPSBmdW5jdGlvbiAoIG5hbWUgKSB7XHJcblxyXG5cdHZhciBkdXJhdGlvbiA9IC0gMTtcclxuXHJcblx0dmFyIGFuaW1hdGlvbiA9IHRoaXMuYW5pbWF0aW9uc01hcFsgbmFtZSBdO1xyXG5cclxuXHRpZiAoIGFuaW1hdGlvbiApIHtcclxuXHJcblx0XHRkdXJhdGlvbiA9IGFuaW1hdGlvbi5kdXJhdGlvbjtcclxuXHJcblx0fVxyXG5cclxuXHRyZXR1cm4gZHVyYXRpb247XHJcblxyXG59O1xyXG5cclxuTW9ycGhCbGVuZE1lc2gucHJvdG90eXBlLnBsYXlBbmltYXRpb24gPSBmdW5jdGlvbiAoIG5hbWUgKSB7XHJcblxyXG5cdHZhciBhbmltYXRpb24gPSB0aGlzLmFuaW1hdGlvbnNNYXBbIG5hbWUgXTtcclxuXHJcblx0aWYgKCBhbmltYXRpb24gKSB7XHJcblxyXG5cdFx0YW5pbWF0aW9uLnRpbWUgPSAwO1xyXG5cdFx0YW5pbWF0aW9uLmFjdGl2ZSA9IHRydWU7XHJcblxyXG5cdH0gZWxzZSB7XHJcblxyXG5cdFx0Y29uc29sZS53YXJuKCBcIlRIUkVFLk1vcnBoQmxlbmRNZXNoOiBhbmltYXRpb25bXCIgKyBuYW1lICsgXCJdIHVuZGVmaW5lZCBpbiAucGxheUFuaW1hdGlvbigpXCIgKTtcclxuXHJcblx0fVxyXG5cclxufTtcclxuXHJcbk1vcnBoQmxlbmRNZXNoLnByb3RvdHlwZS5zdG9wQW5pbWF0aW9uID0gZnVuY3Rpb24gKCBuYW1lICkge1xyXG5cclxuXHR2YXIgYW5pbWF0aW9uID0gdGhpcy5hbmltYXRpb25zTWFwWyBuYW1lIF07XHJcblxyXG5cdGlmICggYW5pbWF0aW9uICkge1xyXG5cclxuXHRcdGFuaW1hdGlvbi5hY3RpdmUgPSBmYWxzZTtcclxuXHJcblx0fVxyXG5cclxufTtcclxuXHJcbk1vcnBoQmxlbmRNZXNoLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAoIGRlbHRhICkge1xyXG5cclxuXHRmb3IgKCB2YXIgaSA9IDAsIGlsID0gdGhpcy5hbmltYXRpb25zTGlzdC5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcclxuXHJcblx0XHR2YXIgYW5pbWF0aW9uID0gdGhpcy5hbmltYXRpb25zTGlzdFsgaSBdO1xyXG5cclxuXHRcdGlmICggISBhbmltYXRpb24uYWN0aXZlICkgY29udGludWU7XHJcblxyXG5cdFx0dmFyIGZyYW1lVGltZSA9IGFuaW1hdGlvbi5kdXJhdGlvbiAvIGFuaW1hdGlvbi5sZW5ndGg7XHJcblxyXG5cdFx0YW5pbWF0aW9uLnRpbWUgKz0gYW5pbWF0aW9uLmRpcmVjdGlvbiAqIGRlbHRhO1xyXG5cclxuXHRcdGlmICggYW5pbWF0aW9uLm1pcnJvcmVkTG9vcCApIHtcclxuXHJcblx0XHRcdGlmICggYW5pbWF0aW9uLnRpbWUgPiBhbmltYXRpb24uZHVyYXRpb24gfHwgYW5pbWF0aW9uLnRpbWUgPCAwICkge1xyXG5cclxuXHRcdFx0XHRhbmltYXRpb24uZGlyZWN0aW9uICo9IC0gMTtcclxuXHJcblx0XHRcdFx0aWYgKCBhbmltYXRpb24udGltZSA+IGFuaW1hdGlvbi5kdXJhdGlvbiApIHtcclxuXHJcblx0XHRcdFx0XHRhbmltYXRpb24udGltZSA9IGFuaW1hdGlvbi5kdXJhdGlvbjtcclxuXHRcdFx0XHRcdGFuaW1hdGlvbi5kaXJlY3Rpb25CYWNrd2FyZHMgPSB0cnVlO1xyXG5cclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdGlmICggYW5pbWF0aW9uLnRpbWUgPCAwICkge1xyXG5cclxuXHRcdFx0XHRcdGFuaW1hdGlvbi50aW1lID0gMDtcclxuXHRcdFx0XHRcdGFuaW1hdGlvbi5kaXJlY3Rpb25CYWNrd2FyZHMgPSBmYWxzZTtcclxuXHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0fVxyXG5cclxuXHRcdH0gZWxzZSB7XHJcblxyXG5cdFx0XHRhbmltYXRpb24udGltZSA9IGFuaW1hdGlvbi50aW1lICUgYW5pbWF0aW9uLmR1cmF0aW9uO1xyXG5cclxuXHRcdFx0aWYgKCBhbmltYXRpb24udGltZSA8IDAgKSBhbmltYXRpb24udGltZSArPSBhbmltYXRpb24uZHVyYXRpb247XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHZhciBrZXlmcmFtZSA9IGFuaW1hdGlvbi5zdGFydCArIF9NYXRoLmNsYW1wKCBNYXRoLmZsb29yKCBhbmltYXRpb24udGltZSAvIGZyYW1lVGltZSApLCAwLCBhbmltYXRpb24ubGVuZ3RoIC0gMSApO1xyXG5cdFx0dmFyIHdlaWdodCA9IGFuaW1hdGlvbi53ZWlnaHQ7XHJcblxyXG5cdFx0aWYgKCBrZXlmcmFtZSAhPT0gYW5pbWF0aW9uLmN1cnJlbnRGcmFtZSApIHtcclxuXHJcblx0XHRcdHRoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzWyBhbmltYXRpb24ubGFzdEZyYW1lIF0gPSAwO1xyXG5cdFx0XHR0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgYW5pbWF0aW9uLmN1cnJlbnRGcmFtZSBdID0gMSAqIHdlaWdodDtcclxuXHJcblx0XHRcdHRoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzWyBrZXlmcmFtZSBdID0gMDtcclxuXHJcblx0XHRcdGFuaW1hdGlvbi5sYXN0RnJhbWUgPSBhbmltYXRpb24uY3VycmVudEZyYW1lO1xyXG5cdFx0XHRhbmltYXRpb24uY3VycmVudEZyYW1lID0ga2V5ZnJhbWU7XHJcblxyXG5cdFx0fVxyXG5cclxuXHRcdHZhciBtaXggPSAoIGFuaW1hdGlvbi50aW1lICUgZnJhbWVUaW1lICkgLyBmcmFtZVRpbWU7XHJcblxyXG5cdFx0aWYgKCBhbmltYXRpb24uZGlyZWN0aW9uQmFja3dhcmRzICkgbWl4ID0gMSAtIG1peDtcclxuXHJcblx0XHRpZiAoIGFuaW1hdGlvbi5jdXJyZW50RnJhbWUgIT09IGFuaW1hdGlvbi5sYXN0RnJhbWUgKSB7XHJcblxyXG5cdFx0XHR0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgYW5pbWF0aW9uLmN1cnJlbnRGcmFtZSBdID0gbWl4ICogd2VpZ2h0O1xyXG5cdFx0XHR0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgYW5pbWF0aW9uLmxhc3RGcmFtZSBdID0gKCAxIC0gbWl4ICkgKiB3ZWlnaHQ7XHJcblxyXG5cdFx0fSBlbHNlIHtcclxuXHJcblx0XHRcdHRoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzWyBhbmltYXRpb24uY3VycmVudEZyYW1lIF0gPSB3ZWlnaHQ7XHJcblxyXG5cdFx0fVxyXG5cclxuXHR9XHJcblxyXG59O1xuXG4vKipcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKi9cblxuZnVuY3Rpb24gSW1tZWRpYXRlUmVuZGVyT2JqZWN0KCBtYXRlcmlhbCApIHtcblxuXHRPYmplY3QzRC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy5tYXRlcmlhbCA9IG1hdGVyaWFsO1xuXHR0aGlzLnJlbmRlciA9IGZ1bmN0aW9uICggcmVuZGVyQ2FsbGJhY2sgKSB7fTtcblxufVxuXG5JbW1lZGlhdGVSZW5kZXJPYmplY3QucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICk7XG5JbW1lZGlhdGVSZW5kZXJPYmplY3QucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gSW1tZWRpYXRlUmVuZGVyT2JqZWN0O1xuXG5JbW1lZGlhdGVSZW5kZXJPYmplY3QucHJvdG90eXBlLmlzSW1tZWRpYXRlUmVuZGVyT2JqZWN0ID0gdHJ1ZTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4qL1xuXG5mdW5jdGlvbiBWZXJ0ZXhOb3JtYWxzSGVscGVyKCBvYmplY3QsIHNpemUsIGhleCwgbGluZXdpZHRoICkge1xuXG5cdHRoaXMub2JqZWN0ID0gb2JqZWN0O1xuXG5cdHRoaXMuc2l6ZSA9ICggc2l6ZSAhPT0gdW5kZWZpbmVkICkgPyBzaXplIDogMTtcblxuXHR2YXIgY29sb3IgPSAoIGhleCAhPT0gdW5kZWZpbmVkICkgPyBoZXggOiAweGZmMDAwMDtcblxuXHR2YXIgd2lkdGggPSAoIGxpbmV3aWR0aCAhPT0gdW5kZWZpbmVkICkgPyBsaW5ld2lkdGggOiAxO1xuXG5cdC8vXG5cblx0dmFyIG5Ob3JtYWxzID0gMDtcblxuXHR2YXIgb2JqR2VvbWV0cnkgPSB0aGlzLm9iamVjdC5nZW9tZXRyeTtcblxuXHRpZiAoIG9iakdlb21ldHJ5ICYmIG9iakdlb21ldHJ5LmlzR2VvbWV0cnkgKSB7XG5cblx0XHRuTm9ybWFscyA9IG9iakdlb21ldHJ5LmZhY2VzLmxlbmd0aCAqIDM7XG5cblx0fSBlbHNlIGlmICggb2JqR2VvbWV0cnkgJiYgb2JqR2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSApIHtcblxuXHRcdG5Ob3JtYWxzID0gb2JqR2VvbWV0cnkuYXR0cmlidXRlcy5ub3JtYWwuY291bnQ7XG5cblx0fVxuXG5cdC8vXG5cblx0dmFyIGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cblx0dmFyIHBvc2l0aW9ucyA9IG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBuTm9ybWFscyAqIDIgKiAzLCAzICk7XG5cblx0Z2VvbWV0cnkuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBwb3NpdGlvbnMgKTtcblxuXHRMaW5lU2VnbWVudHMuY2FsbCggdGhpcywgZ2VvbWV0cnksIG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogY29sb3IsIGxpbmV3aWR0aDogd2lkdGggfSApICk7XG5cblx0Ly9cblxuXHR0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTtcblxuXHR0aGlzLnVwZGF0ZSgpO1xuXG59XG5cblZlcnRleE5vcm1hbHNIZWxwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTGluZVNlZ21lbnRzLnByb3RvdHlwZSApO1xuVmVydGV4Tm9ybWFsc0hlbHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBWZXJ0ZXhOb3JtYWxzSGVscGVyO1xuXG5WZXJ0ZXhOb3JtYWxzSGVscGVyLnByb3RvdHlwZS51cGRhdGUgPSAoIGZ1bmN0aW9uICgpIHtcblxuXHR2YXIgdjEgPSBuZXcgVmVjdG9yMygpO1xuXHR2YXIgdjIgPSBuZXcgVmVjdG9yMygpO1xuXHR2YXIgbm9ybWFsTWF0cml4ID0gbmV3IE1hdHJpeDMoKTtcblxuXHRyZXR1cm4gZnVuY3Rpb24gdXBkYXRlKCkge1xuXG5cdFx0dmFyIGtleXMgPSBbICdhJywgJ2InLCAnYycgXTtcblxuXHRcdHRoaXMub2JqZWN0LnVwZGF0ZU1hdHJpeFdvcmxkKCB0cnVlICk7XG5cblx0XHRub3JtYWxNYXRyaXguZ2V0Tm9ybWFsTWF0cml4KCB0aGlzLm9iamVjdC5tYXRyaXhXb3JsZCApO1xuXG5cdFx0dmFyIG1hdHJpeFdvcmxkID0gdGhpcy5vYmplY3QubWF0cml4V29ybGQ7XG5cblx0XHR2YXIgcG9zaXRpb24gPSB0aGlzLmdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247XG5cblx0XHQvL1xuXG5cdFx0dmFyIG9iakdlb21ldHJ5ID0gdGhpcy5vYmplY3QuZ2VvbWV0cnk7XG5cblx0XHRpZiAoIG9iakdlb21ldHJ5ICYmIG9iakdlb21ldHJ5LmlzR2VvbWV0cnkgKSB7XG5cblx0XHRcdHZhciB2ZXJ0aWNlcyA9IG9iakdlb21ldHJ5LnZlcnRpY2VzO1xuXG5cdFx0XHR2YXIgZmFjZXMgPSBvYmpHZW9tZXRyeS5mYWNlcztcblxuXHRcdFx0dmFyIGlkeCA9IDA7XG5cblx0XHRcdGZvciAoIHZhciBpID0gMCwgbCA9IGZhY2VzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0dmFyIGZhY2UgPSBmYWNlc1sgaSBdO1xuXG5cdFx0XHRcdGZvciAoIHZhciBqID0gMCwgamwgPSBmYWNlLnZlcnRleE5vcm1hbHMubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7XG5cblx0XHRcdFx0XHR2YXIgdmVydGV4ID0gdmVydGljZXNbIGZhY2VbIGtleXNbIGogXSBdIF07XG5cblx0XHRcdFx0XHR2YXIgbm9ybWFsID0gZmFjZS52ZXJ0ZXhOb3JtYWxzWyBqIF07XG5cblx0XHRcdFx0XHR2MS5jb3B5KCB2ZXJ0ZXggKS5hcHBseU1hdHJpeDQoIG1hdHJpeFdvcmxkICk7XG5cblx0XHRcdFx0XHR2Mi5jb3B5KCBub3JtYWwgKS5hcHBseU1hdHJpeDMoIG5vcm1hbE1hdHJpeCApLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKCB0aGlzLnNpemUgKS5hZGQoIHYxICk7XG5cblx0XHRcdFx0XHRwb3NpdGlvbi5zZXRYWVooIGlkeCwgdjEueCwgdjEueSwgdjEueiApO1xuXG5cdFx0XHRcdFx0aWR4ID0gaWR4ICsgMTtcblxuXHRcdFx0XHRcdHBvc2l0aW9uLnNldFhZWiggaWR4LCB2Mi54LCB2Mi55LCB2Mi56ICk7XG5cblx0XHRcdFx0XHRpZHggPSBpZHggKyAxO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIGlmICggb2JqR2VvbWV0cnkgJiYgb2JqR2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSApIHtcblxuXHRcdFx0dmFyIG9ialBvcyA9IG9iakdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247XG5cblx0XHRcdHZhciBvYmpOb3JtID0gb2JqR2VvbWV0cnkuYXR0cmlidXRlcy5ub3JtYWw7XG5cblx0XHRcdHZhciBpZHggPSAwO1xuXG5cdFx0XHQvLyBmb3Igc2ltcGxpY2l0eSwgaWdub3JlIGluZGV4IGFuZCBkcmF3Y2FsbHMsIGFuZCByZW5kZXIgZXZlcnkgbm9ybWFsXG5cblx0XHRcdGZvciAoIHZhciBqID0gMCwgamwgPSBvYmpQb3MuY291bnQ7IGogPCBqbDsgaiArKyApIHtcblxuXHRcdFx0XHR2MS5zZXQoIG9ialBvcy5nZXRYKCBqICksIG9ialBvcy5nZXRZKCBqICksIG9ialBvcy5nZXRaKCBqICkgKS5hcHBseU1hdHJpeDQoIG1hdHJpeFdvcmxkICk7XG5cblx0XHRcdFx0djIuc2V0KCBvYmpOb3JtLmdldFgoIGogKSwgb2JqTm9ybS5nZXRZKCBqICksIG9iak5vcm0uZ2V0WiggaiApICk7XG5cblx0XHRcdFx0djIuYXBwbHlNYXRyaXgzKCBub3JtYWxNYXRyaXggKS5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhciggdGhpcy5zaXplICkuYWRkKCB2MSApO1xuXG5cdFx0XHRcdHBvc2l0aW9uLnNldFhZWiggaWR4LCB2MS54LCB2MS55LCB2MS56ICk7XG5cblx0XHRcdFx0aWR4ID0gaWR4ICsgMTtcblxuXHRcdFx0XHRwb3NpdGlvbi5zZXRYWVooIGlkeCwgdjIueCwgdjIueSwgdjIueiApO1xuXG5cdFx0XHRcdGlkeCA9IGlkeCArIDE7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHBvc2l0aW9uLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHR9O1xuXG59KCkgKTtcblxuLyoqXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleVxuKi9cblxuZnVuY3Rpb24gU3BvdExpZ2h0SGVscGVyKCBsaWdodCApIHtcblxuXHRPYmplY3QzRC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy5saWdodCA9IGxpZ2h0O1xuXHR0aGlzLmxpZ2h0LnVwZGF0ZU1hdHJpeFdvcmxkKCk7XG5cblx0dGhpcy5tYXRyaXggPSBsaWdodC5tYXRyaXhXb3JsZDtcblx0dGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7XG5cblx0dmFyIGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cblx0dmFyIHBvc2l0aW9ucyA9IFtcblx0XHQwLCAwLCAwLCAgIDAsICAgMCwgICAxLFxuXHRcdDAsIDAsIDAsICAgMSwgICAwLCAgIDEsXG5cdFx0MCwgMCwgMCwgLSAxLCAgIDAsICAgMSxcblx0XHQwLCAwLCAwLCAgIDAsICAgMSwgICAxLFxuXHRcdDAsIDAsIDAsICAgMCwgLSAxLCAgIDFcblx0XTtcblxuXHRmb3IgKCB2YXIgaSA9IDAsIGogPSAxLCBsID0gMzI7IGkgPCBsOyBpICsrLCBqICsrICkge1xuXG5cdFx0dmFyIHAxID0gKCBpIC8gbCApICogTWF0aC5QSSAqIDI7XG5cdFx0dmFyIHAyID0gKCBqIC8gbCApICogTWF0aC5QSSAqIDI7XG5cblx0XHRwb3NpdGlvbnMucHVzaChcblx0XHRcdE1hdGguY29zKCBwMSApLCBNYXRoLnNpbiggcDEgKSwgMSxcblx0XHRcdE1hdGguY29zKCBwMiApLCBNYXRoLnNpbiggcDIgKSwgMVxuXHRcdCk7XG5cblx0fVxuXG5cdGdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9ucywgMyApICk7XG5cblx0dmFyIG1hdGVyaWFsID0gbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IGZvZzogZmFsc2UgfSApO1xuXG5cdHRoaXMuY29uZSA9IG5ldyBMaW5lU2VnbWVudHMoIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xuXHR0aGlzLmFkZCggdGhpcy5jb25lICk7XG5cblx0dGhpcy51cGRhdGUoKTtcblxufVxuXG5TcG90TGlnaHRIZWxwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICk7XG5TcG90TGlnaHRIZWxwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU3BvdExpZ2h0SGVscGVyO1xuXG5TcG90TGlnaHRIZWxwZXIucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG5cblx0dGhpcy5jb25lLmdlb21ldHJ5LmRpc3Bvc2UoKTtcblx0dGhpcy5jb25lLm1hdGVyaWFsLmRpc3Bvc2UoKTtcblxufTtcblxuU3BvdExpZ2h0SGVscGVyLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAoKSB7XG5cblx0dmFyIHZlY3RvciA9IG5ldyBWZWN0b3IzKCk7XG5cdHZhciB2ZWN0b3IyID0gbmV3IFZlY3RvcjMoKTtcblxuXHRyZXR1cm4gZnVuY3Rpb24gdXBkYXRlKCkge1xuXG5cdFx0dmFyIGNvbmVMZW5ndGggPSB0aGlzLmxpZ2h0LmRpc3RhbmNlID8gdGhpcy5saWdodC5kaXN0YW5jZSA6IDEwMDA7XG5cdFx0dmFyIGNvbmVXaWR0aCA9IGNvbmVMZW5ndGggKiBNYXRoLnRhbiggdGhpcy5saWdodC5hbmdsZSApO1xuXG5cdFx0dGhpcy5jb25lLnNjYWxlLnNldCggY29uZVdpZHRoLCBjb25lV2lkdGgsIGNvbmVMZW5ndGggKTtcblxuXHRcdHZlY3Rvci5zZXRGcm9tTWF0cml4UG9zaXRpb24oIHRoaXMubGlnaHQubWF0cml4V29ybGQgKTtcblx0XHR2ZWN0b3IyLnNldEZyb21NYXRyaXhQb3NpdGlvbiggdGhpcy5saWdodC50YXJnZXQubWF0cml4V29ybGQgKTtcblxuXHRcdHRoaXMuY29uZS5sb29rQXQoIHZlY3RvcjIuc3ViKCB2ZWN0b3IgKSApO1xuXG5cdFx0dGhpcy5jb25lLm1hdGVyaWFsLmNvbG9yLmNvcHkoIHRoaXMubGlnaHQuY29sb3IgKTtcblxuXHR9O1xuXG59KCk7XG5cbi8qKlxuICogQGF1dGhvciBTZWFuIEdyaWZmaW4gLyBodHRwOi8vdHdpdHRlci5jb20vc2dyaWZcbiAqIEBhdXRob3IgTWljaGFlbCBHdWVycmVybyAvIGh0dHA6Ly9yZWFsaXR5bWVsdGRvd24uY29tXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBpa2VyciAvIGh0dHA6Ly92ZXJvbGQuY29tXG4gKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44N1xuICovXG5cbmZ1bmN0aW9uIFNrZWxldG9uSGVscGVyKCBvYmplY3QgKSB7XG5cblx0dGhpcy5ib25lcyA9IHRoaXMuZ2V0Qm9uZUxpc3QoIG9iamVjdCApO1xuXG5cdHZhciBnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXG5cdHZhciB2ZXJ0aWNlcyA9IFtdO1xuXHR2YXIgY29sb3JzID0gW107XG5cblx0dmFyIGNvbG9yMSA9IG5ldyBDb2xvciggMCwgMCwgMSApO1xuXHR2YXIgY29sb3IyID0gbmV3IENvbG9yKCAwLCAxLCAwICk7XG5cblx0Zm9yICggdmFyIGkgPSAwOyBpIDwgdGhpcy5ib25lcy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHR2YXIgYm9uZSA9IHRoaXMuYm9uZXNbIGkgXTtcblxuXHRcdGlmICggYm9uZS5wYXJlbnQgJiYgYm9uZS5wYXJlbnQuaXNCb25lICkge1xuXG5cdFx0XHR2ZXJ0aWNlcy5wdXNoKCAwLCAwLCAwICk7XG5cdFx0XHR2ZXJ0aWNlcy5wdXNoKCAwLCAwLCAwICk7XG5cdFx0XHRjb2xvcnMucHVzaCggY29sb3IxLnIsIGNvbG9yMS5nLCBjb2xvcjEuYiApO1xuXHRcdFx0Y29sb3JzLnB1c2goIGNvbG9yMi5yLCBjb2xvcjIuZywgY29sb3IyLmIgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0Z2VvbWV0cnkuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXHRnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdjb2xvcicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBjb2xvcnMsIDMgKSApO1xuXG5cdHZhciBtYXRlcmlhbCA9IG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyB2ZXJ0ZXhDb2xvcnM6IFZlcnRleENvbG9ycywgZGVwdGhUZXN0OiBmYWxzZSwgZGVwdGhXcml0ZTogZmFsc2UsIHRyYW5zcGFyZW50OiB0cnVlIH0gKTtcblxuXHRMaW5lU2VnbWVudHMuY2FsbCggdGhpcywgZ2VvbWV0cnksIG1hdGVyaWFsICk7XG5cblx0dGhpcy5yb290ID0gb2JqZWN0O1xuXG5cdHRoaXMubWF0cml4ID0gb2JqZWN0Lm1hdHJpeFdvcmxkO1xuXHR0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTtcblxuXHR0aGlzLnVwZGF0ZSgpO1xuXG59XG5cblxuU2tlbGV0b25IZWxwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTGluZVNlZ21lbnRzLnByb3RvdHlwZSApO1xuU2tlbGV0b25IZWxwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU2tlbGV0b25IZWxwZXI7XG5cblNrZWxldG9uSGVscGVyLnByb3RvdHlwZS5nZXRCb25lTGlzdCA9IGZ1bmN0aW9uKCBvYmplY3QgKSB7XG5cblx0dmFyIGJvbmVMaXN0ID0gW107XG5cblx0aWYgKCBvYmplY3QgJiYgb2JqZWN0LmlzQm9uZSApIHtcblxuXHRcdGJvbmVMaXN0LnB1c2goIG9iamVjdCApO1xuXG5cdH1cblxuXHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBvYmplY3QuY2hpbGRyZW4ubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0Ym9uZUxpc3QucHVzaC5hcHBseSggYm9uZUxpc3QsIHRoaXMuZ2V0Qm9uZUxpc3QoIG9iamVjdC5jaGlsZHJlblsgaSBdICkgKTtcblxuXHR9XG5cblx0cmV0dXJuIGJvbmVMaXN0O1xuXG59O1xuXG5Ta2VsZXRvbkhlbHBlci5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gKCkge1xuXG5cdHZhciB2ZWN0b3IgPSBuZXcgVmVjdG9yMygpO1xuXG5cdHZhciBib25lTWF0cml4ID0gbmV3IE1hdHJpeDQoKTtcblx0dmFyIG1hdHJpeFdvcmxkSW52ID0gbmV3IE1hdHJpeDQoKTtcblxuXHRyZXR1cm4gZnVuY3Rpb24gdXBkYXRlKCkge1xuXG5cdFx0dmFyIGdlb21ldHJ5ID0gdGhpcy5nZW9tZXRyeTtcblx0XHR2YXIgcG9zaXRpb24gPSBnZW9tZXRyeS5nZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicgKTtcblxuXHRcdG1hdHJpeFdvcmxkSW52LmdldEludmVyc2UoIHRoaXMucm9vdC5tYXRyaXhXb3JsZCApO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBqID0gMDsgaSA8IHRoaXMuYm9uZXMubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHR2YXIgYm9uZSA9IHRoaXMuYm9uZXNbIGkgXTtcblxuXHRcdFx0aWYgKCBib25lLnBhcmVudCAmJiBib25lLnBhcmVudC5pc0JvbmUgKSB7XG5cblx0XHRcdFx0Ym9uZU1hdHJpeC5tdWx0aXBseU1hdHJpY2VzKCBtYXRyaXhXb3JsZEludiwgYm9uZS5tYXRyaXhXb3JsZCApO1xuXHRcdFx0XHR2ZWN0b3Iuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBib25lTWF0cml4ICk7XG5cdFx0XHRcdHBvc2l0aW9uLnNldFhZWiggaiwgdmVjdG9yLngsIHZlY3Rvci55LCB2ZWN0b3IueiApO1xuXG5cdFx0XHRcdGJvbmVNYXRyaXgubXVsdGlwbHlNYXRyaWNlcyggbWF0cml4V29ybGRJbnYsIGJvbmUucGFyZW50Lm1hdHJpeFdvcmxkICk7XG5cdFx0XHRcdHZlY3Rvci5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGJvbmVNYXRyaXggKTtcblx0XHRcdFx0cG9zaXRpb24uc2V0WFlaKCBqICsgMSwgdmVjdG9yLngsIHZlY3Rvci55LCB2ZWN0b3IueiApO1xuXG5cdFx0XHRcdGogKz0gMjtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Z2VvbWV0cnkuZ2V0QXR0cmlidXRlKCAncG9zaXRpb24nICkubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdH07XG5cbn0oKTtcblxuLyoqXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqL1xuXG5mdW5jdGlvbiBQb2ludExpZ2h0SGVscGVyKCBsaWdodCwgc3BoZXJlU2l6ZSApIHtcblxuXHR0aGlzLmxpZ2h0ID0gbGlnaHQ7XG5cdHRoaXMubGlnaHQudXBkYXRlTWF0cml4V29ybGQoKTtcblxuXHR2YXIgZ2VvbWV0cnkgPSBuZXcgU3BoZXJlQnVmZmVyR2VvbWV0cnkoIHNwaGVyZVNpemUsIDQsIDIgKTtcblx0dmFyIG1hdGVyaWFsID0gbmV3IE1lc2hCYXNpY01hdGVyaWFsKCB7IHdpcmVmcmFtZTogdHJ1ZSwgZm9nOiBmYWxzZSB9ICk7XG5cdG1hdGVyaWFsLmNvbG9yLmNvcHkoIHRoaXMubGlnaHQuY29sb3IgKTtcblxuXHRNZXNoLmNhbGwoIHRoaXMsIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xuXG5cdHRoaXMubWF0cml4ID0gdGhpcy5saWdodC5tYXRyaXhXb3JsZDtcblx0dGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7XG5cblx0Lypcblx0dmFyIGRpc3RhbmNlR2VvbWV0cnkgPSBuZXcgVEhSRUUuSWNvc2FoZWRyb25HZW9tZXRyeSggMSwgMiApO1xuXHR2YXIgZGlzdGFuY2VNYXRlcmlhbCA9IG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogaGV4Q29sb3IsIGZvZzogZmFsc2UsIHdpcmVmcmFtZTogdHJ1ZSwgb3BhY2l0eTogMC4xLCB0cmFuc3BhcmVudDogdHJ1ZSB9ICk7XG5cblx0dGhpcy5saWdodFNwaGVyZSA9IG5ldyBUSFJFRS5NZXNoKCBidWxiR2VvbWV0cnksIGJ1bGJNYXRlcmlhbCApO1xuXHR0aGlzLmxpZ2h0RGlzdGFuY2UgPSBuZXcgVEhSRUUuTWVzaCggZGlzdGFuY2VHZW9tZXRyeSwgZGlzdGFuY2VNYXRlcmlhbCApO1xuXG5cdHZhciBkID0gbGlnaHQuZGlzdGFuY2U7XG5cblx0aWYgKCBkID09PSAwLjAgKSB7XG5cblx0XHR0aGlzLmxpZ2h0RGlzdGFuY2UudmlzaWJsZSA9IGZhbHNlO1xuXG5cdH0gZWxzZSB7XG5cblx0XHR0aGlzLmxpZ2h0RGlzdGFuY2Uuc2NhbGUuc2V0KCBkLCBkLCBkICk7XG5cblx0fVxuXG5cdHRoaXMuYWRkKCB0aGlzLmxpZ2h0RGlzdGFuY2UgKTtcblx0Ki9cblxufVxuXG5Qb2ludExpZ2h0SGVscGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE1lc2gucHJvdG90eXBlICk7XG5Qb2ludExpZ2h0SGVscGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFBvaW50TGlnaHRIZWxwZXI7XG5cblBvaW50TGlnaHRIZWxwZXIucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG5cblx0dGhpcy5nZW9tZXRyeS5kaXNwb3NlKCk7XG5cdHRoaXMubWF0ZXJpYWwuZGlzcG9zZSgpO1xuXG59O1xuXG5Qb2ludExpZ2h0SGVscGVyLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAoKSB7XG5cblx0dGhpcy5tYXRlcmlhbC5jb2xvci5jb3B5KCB0aGlzLmxpZ2h0LmNvbG9yICk7XG5cblx0Lypcblx0dmFyIGQgPSB0aGlzLmxpZ2h0LmRpc3RhbmNlO1xuXG5cdGlmICggZCA9PT0gMC4wICkge1xuXG5cdFx0dGhpcy5saWdodERpc3RhbmNlLnZpc2libGUgPSBmYWxzZTtcblxuXHR9IGVsc2Uge1xuXG5cdFx0dGhpcy5saWdodERpc3RhbmNlLnZpc2libGUgPSB0cnVlO1xuXHRcdHRoaXMubGlnaHREaXN0YW5jZS5zY2FsZS5zZXQoIGQsIGQsIGQgKTtcblxuXHR9XG5cdCovXG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBhYmVsbmF0aW9uIC8gaHR0cDovL2dpdGh1Yi5jb20vYWJlbG5hdGlvblxuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cDovL2dpdGh1Yi5jb20vTXVnZW44N1xuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKi9cblxuZnVuY3Rpb24gUmVjdEFyZWFMaWdodEhlbHBlciggbGlnaHQgKSB7XG5cblx0T2JqZWN0M0QuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMubGlnaHQgPSBsaWdodDtcblx0dGhpcy5saWdodC51cGRhdGVNYXRyaXhXb3JsZCgpO1xuXG5cdHRoaXMubWF0cml4ID0gbGlnaHQubWF0cml4V29ybGQ7XG5cdHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xuXG5cdHZhciBtYXRlcmlhbCA9IG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogbGlnaHQuY29sb3IgfSApO1xuXG5cdHZhciBnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXG5cdGdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEJ1ZmZlckF0dHJpYnV0ZSggbmV3IEZsb2F0MzJBcnJheSggNSAqIDMgKSwgMyApICk7XG5cblx0dGhpcy5hZGQoIG5ldyBMaW5lKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKSApO1xuXG5cdHRoaXMudXBkYXRlKCk7XG5cbn1cblxuUmVjdEFyZWFMaWdodEhlbHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKTtcblJlY3RBcmVhTGlnaHRIZWxwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUmVjdEFyZWFMaWdodEhlbHBlcjtcblxuUmVjdEFyZWFMaWdodEhlbHBlci5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcblxuXHR0aGlzLmNoaWxkcmVuWyAwIF0uZ2VvbWV0cnkuZGlzcG9zZSgpO1xuXHR0aGlzLmNoaWxkcmVuWyAwIF0ubWF0ZXJpYWwuZGlzcG9zZSgpO1xuXG59O1xuXG5SZWN0QXJlYUxpZ2h0SGVscGVyLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAoKSB7XG5cblx0dmFyIGxpbmUgPSB0aGlzLmNoaWxkcmVuWyAwIF07XG5cblx0Ly8gdXBkYXRlIG1hdGVyaWFsXG5cblx0bGluZS5tYXRlcmlhbC5jb2xvci5jb3B5KCB0aGlzLmxpZ2h0LmNvbG9yICk7XG5cblx0Ly8gY2FsY3VsYXRlIG5ldyBkaW1lbnNpb25zIG9mIHRoZSBoZWxwZXJcblxuXHR2YXIgaHggPSB0aGlzLmxpZ2h0LndpZHRoICogMC41O1xuXHR2YXIgaHkgPSB0aGlzLmxpZ2h0LmhlaWdodCAqIDAuNTtcblxuXHR2YXIgcG9zaXRpb24gPSBsaW5lLmdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247XG5cdHZhciBhcnJheSA9IHBvc2l0aW9uLmFycmF5O1xuXG5cdC8vIHVwZGF0ZSB2ZXJ0aWNlc1xuXG5cdGFycmF5WyAgMCBdID0gICBoeDsgYXJyYXlbICAxIF0gPSAtIGh5OyBhcnJheVsgIDIgXSA9IDA7XG5cdGFycmF5WyAgMyBdID0gICBoeDsgYXJyYXlbICA0IF0gPSAgIGh5OyBhcnJheVsgIDUgXSA9IDA7XG5cdGFycmF5WyAgNiBdID0gLSBoeDsgYXJyYXlbICA3IF0gPSAgIGh5OyBhcnJheVsgIDggXSA9IDA7XG5cdGFycmF5WyAgOSBdID0gLSBoeDsgYXJyYXlbIDEwIF0gPSAtIGh5OyBhcnJheVsgMTEgXSA9IDA7XG5cdGFycmF5WyAxMiBdID0gICBoeDsgYXJyYXlbIDEzIF0gPSAtIGh5OyBhcnJheVsgMTQgXSA9IDA7XG5cblx0cG9zaXRpb24ubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG59O1xuXG4vKipcbiAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqL1xuXG5mdW5jdGlvbiBIZW1pc3BoZXJlTGlnaHRIZWxwZXIoIGxpZ2h0LCBzaXplICkge1xuXG5cdE9iamVjdDNELmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLmxpZ2h0ID0gbGlnaHQ7XG5cdHRoaXMubGlnaHQudXBkYXRlTWF0cml4V29ybGQoKTtcblxuXHR0aGlzLm1hdHJpeCA9IGxpZ2h0Lm1hdHJpeFdvcmxkO1xuXHR0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTtcblxuXHR2YXIgZ2VvbWV0cnkgPSBuZXcgT2N0YWhlZHJvbkJ1ZmZlckdlb21ldHJ5KCBzaXplICk7XG5cdGdlb21ldHJ5LnJvdGF0ZVkoIE1hdGguUEkgKiAwLjUgKTtcblxuXHR2YXIgbWF0ZXJpYWwgPSBuZXcgTWVzaEJhc2ljTWF0ZXJpYWwoIHsgdmVydGV4Q29sb3JzOiBWZXJ0ZXhDb2xvcnMsIHdpcmVmcmFtZTogdHJ1ZSB9ICk7XG5cblx0dmFyIHBvc2l0aW9uID0gZ2VvbWV0cnkuZ2V0QXR0cmlidXRlKCAncG9zaXRpb24nICk7XG5cdHZhciBjb2xvcnMgPSBuZXcgRmxvYXQzMkFycmF5KCBwb3NpdGlvbi5jb3VudCAqIDMgKTtcblxuXHRnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdjb2xvcicsIG5ldyBCdWZmZXJBdHRyaWJ1dGUoIGNvbG9ycywgMyApICk7XG5cblx0dGhpcy5hZGQoIG5ldyBNZXNoKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKSApO1xuXG5cdHRoaXMudXBkYXRlKCk7XG5cbn1cblxuSGVtaXNwaGVyZUxpZ2h0SGVscGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApO1xuSGVtaXNwaGVyZUxpZ2h0SGVscGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEhlbWlzcGhlcmVMaWdodEhlbHBlcjtcblxuSGVtaXNwaGVyZUxpZ2h0SGVscGVyLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuXG5cdHRoaXMuY2hpbGRyZW5bIDAgXS5nZW9tZXRyeS5kaXNwb3NlKCk7XG5cdHRoaXMuY2hpbGRyZW5bIDAgXS5tYXRlcmlhbC5kaXNwb3NlKCk7XG5cbn07XG5cbkhlbWlzcGhlcmVMaWdodEhlbHBlci5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gKCkge1xuXG5cdHZhciB2ZWN0b3IgPSBuZXcgVmVjdG9yMygpO1xuXG5cdHZhciBjb2xvcjEgPSBuZXcgQ29sb3IoKTtcblx0dmFyIGNvbG9yMiA9IG5ldyBDb2xvcigpO1xuXG5cdHJldHVybiBmdW5jdGlvbiB1cGRhdGUoKSB7XG5cblx0XHR2YXIgbWVzaCA9IHRoaXMuY2hpbGRyZW5bIDAgXTtcblxuXHRcdHZhciBjb2xvcnMgPSBtZXNoLmdlb21ldHJ5LmdldEF0dHJpYnV0ZSggJ2NvbG9yJyApO1xuXG5cdFx0Y29sb3IxLmNvcHkoIHRoaXMubGlnaHQuY29sb3IgKTtcblx0XHRjb2xvcjIuY29weSggdGhpcy5saWdodC5ncm91bmRDb2xvciApO1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwLCBsID0gY29sb3JzLmNvdW50OyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmFyIGNvbG9yID0gKCBpIDwgKCBsIC8gMiApICkgPyBjb2xvcjEgOiBjb2xvcjI7XG5cblx0XHRcdGNvbG9ycy5zZXRYWVooIGksIGNvbG9yLnIsIGNvbG9yLmcsIGNvbG9yLmIgKTtcblxuXHRcdH1cblxuXHRcdG1lc2gubG9va0F0KCB2ZWN0b3Iuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCB0aGlzLmxpZ2h0Lm1hdHJpeFdvcmxkICkubmVnYXRlKCkgKTtcblxuXHRcdGNvbG9ycy5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0fTtcblxufSgpO1xuXG4vKipcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gR3JpZEhlbHBlciggc2l6ZSwgZGl2aXNpb25zLCBjb2xvcjEsIGNvbG9yMiApIHtcblxuXHRzaXplID0gc2l6ZSB8fCAxMDtcblx0ZGl2aXNpb25zID0gZGl2aXNpb25zIHx8IDEwO1xuXHRjb2xvcjEgPSBuZXcgQ29sb3IoIGNvbG9yMSAhPT0gdW5kZWZpbmVkID8gY29sb3IxIDogMHg0NDQ0NDQgKTtcblx0Y29sb3IyID0gbmV3IENvbG9yKCBjb2xvcjIgIT09IHVuZGVmaW5lZCA/IGNvbG9yMiA6IDB4ODg4ODg4ICk7XG5cblx0dmFyIGNlbnRlciA9IGRpdmlzaW9ucyAvIDI7XG5cdHZhciBzdGVwID0gc2l6ZSAvIGRpdmlzaW9ucztcblx0dmFyIGhhbGZTaXplID0gc2l6ZSAvIDI7XG5cblx0dmFyIHZlcnRpY2VzID0gW10sIGNvbG9ycyA9IFtdO1xuXG5cdGZvciAoIHZhciBpID0gMCwgaiA9IDAsIGsgPSAtIGhhbGZTaXplOyBpIDw9IGRpdmlzaW9uczsgaSArKywgayArPSBzdGVwICkge1xuXG5cdFx0dmVydGljZXMucHVzaCggLSBoYWxmU2l6ZSwgMCwgaywgaGFsZlNpemUsIDAsIGsgKTtcblx0XHR2ZXJ0aWNlcy5wdXNoKCBrLCAwLCAtIGhhbGZTaXplLCBrLCAwLCBoYWxmU2l6ZSApO1xuXG5cdFx0dmFyIGNvbG9yID0gaSA9PT0gY2VudGVyID8gY29sb3IxIDogY29sb3IyO1xuXG5cdFx0Y29sb3IudG9BcnJheSggY29sb3JzLCBqICk7IGogKz0gMztcblx0XHRjb2xvci50b0FycmF5KCBjb2xvcnMsIGogKTsgaiArPSAzO1xuXHRcdGNvbG9yLnRvQXJyYXkoIGNvbG9ycywgaiApOyBqICs9IDM7XG5cdFx0Y29sb3IudG9BcnJheSggY29sb3JzLCBqICk7IGogKz0gMztcblxuXHR9XG5cblx0dmFyIGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cdGdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcblx0Z2VvbWV0cnkuYWRkQXR0cmlidXRlKCAnY29sb3InLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggY29sb3JzLCAzICkgKTtcblxuXHR2YXIgbWF0ZXJpYWwgPSBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgdmVydGV4Q29sb3JzOiBWZXJ0ZXhDb2xvcnMgfSApO1xuXG5cdExpbmVTZWdtZW50cy5jYWxsKCB0aGlzLCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcblxufVxuXG5HcmlkSGVscGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIExpbmVTZWdtZW50cy5wcm90b3R5cGUgKTtcbkdyaWRIZWxwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gR3JpZEhlbHBlcjtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cDovL2dpdGh1Yi5jb20vTXVnZW44N1xuICogQGF1dGhvciBIZWN0YXRlIC8gaHR0cDovL3d3dy5naXRodWIuY29tL0hlY3RhdGVcbiAqL1xuXG5mdW5jdGlvbiBQb2xhckdyaWRIZWxwZXIoIHJhZGl1cywgcmFkaWFscywgY2lyY2xlcywgZGl2aXNpb25zLCBjb2xvcjEsIGNvbG9yMiApIHtcblxuXHRyYWRpdXMgPSByYWRpdXMgfHwgMTA7XG5cdHJhZGlhbHMgPSByYWRpYWxzIHx8IDE2O1xuXHRjaXJjbGVzID0gY2lyY2xlcyB8fCA4O1xuXHRkaXZpc2lvbnMgPSBkaXZpc2lvbnMgfHwgNjQ7XG5cdGNvbG9yMSA9IG5ldyBDb2xvciggY29sb3IxICE9PSB1bmRlZmluZWQgPyBjb2xvcjEgOiAweDQ0NDQ0NCApO1xuXHRjb2xvcjIgPSBuZXcgQ29sb3IoIGNvbG9yMiAhPT0gdW5kZWZpbmVkID8gY29sb3IyIDogMHg4ODg4ODggKTtcblxuXHR2YXIgdmVydGljZXMgPSBbXTtcblx0dmFyIGNvbG9ycyA9IFtdO1xuXG5cdHZhciB4LCB6O1xuXHR2YXIgdiwgaSwgaiwgciwgY29sb3I7XG5cblx0Ly8gY3JlYXRlIHRoZSByYWRpYWxzXG5cblx0Zm9yICggaSA9IDA7IGkgPD0gcmFkaWFsczsgaSArKyApIHtcblxuXHRcdHYgPSAoIGkgLyByYWRpYWxzICkgKiAoIE1hdGguUEkgKiAyICk7XG5cblx0XHR4ID0gTWF0aC5zaW4oIHYgKSAqIHJhZGl1cztcblx0XHR6ID0gTWF0aC5jb3MoIHYgKSAqIHJhZGl1cztcblxuXHRcdHZlcnRpY2VzLnB1c2goIDAsIDAsIDAgKTtcblx0XHR2ZXJ0aWNlcy5wdXNoKCB4LCAwLCB6ICk7XG5cblx0XHRjb2xvciA9ICggaSAmIDEgKSA/IGNvbG9yMSA6IGNvbG9yMjtcblxuXHRcdGNvbG9ycy5wdXNoKCBjb2xvci5yLCBjb2xvci5nLCBjb2xvci5iICk7XG5cdFx0Y29sb3JzLnB1c2goIGNvbG9yLnIsIGNvbG9yLmcsIGNvbG9yLmIgKTtcblxuXHR9XG5cblx0Ly8gY3JlYXRlIHRoZSBjaXJjbGVzXG5cblx0Zm9yICggaSA9IDA7IGkgPD0gY2lyY2xlczsgaSArKyApIHtcblxuXHRcdGNvbG9yID0gKCBpICYgMSApID8gY29sb3IxIDogY29sb3IyO1xuXG5cdFx0ciA9IHJhZGl1cyAtICggcmFkaXVzIC8gY2lyY2xlcyAqIGkgKTtcblxuXHRcdGZvciAoIGogPSAwOyBqIDwgZGl2aXNpb25zOyBqICsrICkge1xuXG5cdFx0XHQvLyBmaXJzdCB2ZXJ0ZXhcblxuXHRcdFx0diA9ICggaiAvIGRpdmlzaW9ucyApICogKCBNYXRoLlBJICogMiApO1xuXG5cdFx0XHR4ID0gTWF0aC5zaW4oIHYgKSAqIHI7XG5cdFx0XHR6ID0gTWF0aC5jb3MoIHYgKSAqIHI7XG5cblx0XHRcdHZlcnRpY2VzLnB1c2goIHgsIDAsIHogKTtcblx0XHRcdGNvbG9ycy5wdXNoKCBjb2xvci5yLCBjb2xvci5nLCBjb2xvci5iICk7XG5cblx0XHRcdC8vIHNlY29uZCB2ZXJ0ZXhcblxuXHRcdFx0diA9ICggKCBqICsgMSApIC8gZGl2aXNpb25zICkgKiAoIE1hdGguUEkgKiAyICk7XG5cblx0XHRcdHggPSBNYXRoLnNpbiggdiApICogcjtcblx0XHRcdHogPSBNYXRoLmNvcyggdiApICogcjtcblxuXHRcdFx0dmVydGljZXMucHVzaCggeCwgMCwgeiApO1xuXHRcdFx0Y29sb3JzLnB1c2goIGNvbG9yLnIsIGNvbG9yLmcsIGNvbG9yLmIgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0dmFyIGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cdGdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcblx0Z2VvbWV0cnkuYWRkQXR0cmlidXRlKCAnY29sb3InLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggY29sb3JzLCAzICkgKTtcblxuXHR2YXIgbWF0ZXJpYWwgPSBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgdmVydGV4Q29sb3JzOiBWZXJ0ZXhDb2xvcnMgfSApO1xuXG5cdExpbmVTZWdtZW50cy5jYWxsKCB0aGlzLCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcblxufVxuXG5Qb2xhckdyaWRIZWxwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTGluZVNlZ21lbnRzLnByb3RvdHlwZSApO1xuUG9sYXJHcmlkSGVscGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFBvbGFyR3JpZEhlbHBlcjtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4qL1xuXG5mdW5jdGlvbiBGYWNlTm9ybWFsc0hlbHBlciggb2JqZWN0LCBzaXplLCBoZXgsIGxpbmV3aWR0aCApIHtcblxuXHQvLyBGYWNlTm9ybWFsc0hlbHBlciBvbmx5IHN1cHBvcnRzIFRIUkVFLkdlb21ldHJ5XG5cblx0dGhpcy5vYmplY3QgPSBvYmplY3Q7XG5cblx0dGhpcy5zaXplID0gKCBzaXplICE9PSB1bmRlZmluZWQgKSA/IHNpemUgOiAxO1xuXG5cdHZhciBjb2xvciA9ICggaGV4ICE9PSB1bmRlZmluZWQgKSA/IGhleCA6IDB4ZmZmZjAwO1xuXG5cdHZhciB3aWR0aCA9ICggbGluZXdpZHRoICE9PSB1bmRlZmluZWQgKSA/IGxpbmV3aWR0aCA6IDE7XG5cblx0Ly9cblxuXHR2YXIgbk5vcm1hbHMgPSAwO1xuXG5cdHZhciBvYmpHZW9tZXRyeSA9IHRoaXMub2JqZWN0Lmdlb21ldHJ5O1xuXG5cdGlmICggb2JqR2VvbWV0cnkgJiYgb2JqR2VvbWV0cnkuaXNHZW9tZXRyeSApIHtcblxuXHRcdG5Ob3JtYWxzID0gb2JqR2VvbWV0cnkuZmFjZXMubGVuZ3RoO1xuXG5cdH0gZWxzZSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5GYWNlTm9ybWFsc0hlbHBlcjogb25seSBUSFJFRS5HZW9tZXRyeSBpcyBzdXBwb3J0ZWQuIFVzZSBUSFJFRS5WZXJ0ZXhOb3JtYWxzSGVscGVyLCBpbnN0ZWFkLicgKTtcblxuXHR9XG5cblx0Ly9cblxuXHR2YXIgZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcblxuXHR2YXIgcG9zaXRpb25zID0gbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIG5Ob3JtYWxzICogMiAqIDMsIDMgKTtcblxuXHRnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIHBvc2l0aW9ucyApO1xuXG5cdExpbmVTZWdtZW50cy5jYWxsKCB0aGlzLCBnZW9tZXRyeSwgbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiBjb2xvciwgbGluZXdpZHRoOiB3aWR0aCB9ICkgKTtcblxuXHQvL1xuXG5cdHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xuXHR0aGlzLnVwZGF0ZSgpO1xuXG59XG5cbkZhY2VOb3JtYWxzSGVscGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIExpbmVTZWdtZW50cy5wcm90b3R5cGUgKTtcbkZhY2VOb3JtYWxzSGVscGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEZhY2VOb3JtYWxzSGVscGVyO1xuXG5GYWNlTm9ybWFsc0hlbHBlci5wcm90b3R5cGUudXBkYXRlID0gKCBmdW5jdGlvbiAoKSB7XG5cblx0dmFyIHYxID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIHYyID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIG5vcm1hbE1hdHJpeCA9IG5ldyBNYXRyaXgzKCk7XG5cblx0cmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZSgpIHtcblxuXHRcdHRoaXMub2JqZWN0LnVwZGF0ZU1hdHJpeFdvcmxkKCB0cnVlICk7XG5cblx0XHRub3JtYWxNYXRyaXguZ2V0Tm9ybWFsTWF0cml4KCB0aGlzLm9iamVjdC5tYXRyaXhXb3JsZCApO1xuXG5cdFx0dmFyIG1hdHJpeFdvcmxkID0gdGhpcy5vYmplY3QubWF0cml4V29ybGQ7XG5cblx0XHR2YXIgcG9zaXRpb24gPSB0aGlzLmdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247XG5cblx0XHQvL1xuXG5cdFx0dmFyIG9iakdlb21ldHJ5ID0gdGhpcy5vYmplY3QuZ2VvbWV0cnk7XG5cblx0XHR2YXIgdmVydGljZXMgPSBvYmpHZW9tZXRyeS52ZXJ0aWNlcztcblxuXHRcdHZhciBmYWNlcyA9IG9iakdlb21ldHJ5LmZhY2VzO1xuXG5cdFx0dmFyIGlkeCA9IDA7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBmYWNlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR2YXIgZmFjZSA9IGZhY2VzWyBpIF07XG5cblx0XHRcdHZhciBub3JtYWwgPSBmYWNlLm5vcm1hbDtcblxuXHRcdFx0djEuY29weSggdmVydGljZXNbIGZhY2UuYSBdIClcblx0XHRcdFx0LmFkZCggdmVydGljZXNbIGZhY2UuYiBdIClcblx0XHRcdFx0LmFkZCggdmVydGljZXNbIGZhY2UuYyBdIClcblx0XHRcdFx0LmRpdmlkZVNjYWxhciggMyApXG5cdFx0XHRcdC5hcHBseU1hdHJpeDQoIG1hdHJpeFdvcmxkICk7XG5cblx0XHRcdHYyLmNvcHkoIG5vcm1hbCApLmFwcGx5TWF0cml4Myggbm9ybWFsTWF0cml4ICkubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIoIHRoaXMuc2l6ZSApLmFkZCggdjEgKTtcblxuXHRcdFx0cG9zaXRpb24uc2V0WFlaKCBpZHgsIHYxLngsIHYxLnksIHYxLnogKTtcblxuXHRcdFx0aWR4ID0gaWR4ICsgMTtcblxuXHRcdFx0cG9zaXRpb24uc2V0WFlaKCBpZHgsIHYyLngsIHYyLnksIHYyLnogKTtcblxuXHRcdFx0aWR4ID0gaWR4ICsgMTtcblxuXHRcdH1cblxuXHRcdHBvc2l0aW9uLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHR9O1xuXG59KCkgKTtcblxuLyoqXG4gKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tL1xuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleVxuICovXG5cbmZ1bmN0aW9uIERpcmVjdGlvbmFsTGlnaHRIZWxwZXIoIGxpZ2h0LCBzaXplICkge1xuXG5cdE9iamVjdDNELmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLmxpZ2h0ID0gbGlnaHQ7XG5cdHRoaXMubGlnaHQudXBkYXRlTWF0cml4V29ybGQoKTtcblxuXHR0aGlzLm1hdHJpeCA9IGxpZ2h0Lm1hdHJpeFdvcmxkO1xuXHR0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTtcblxuXHRpZiAoIHNpemUgPT09IHVuZGVmaW5lZCApIHNpemUgPSAxO1xuXG5cdHZhciBnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXHRnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBbXG5cdFx0LSBzaXplLCAgIHNpemUsIDAsXG5cdFx0ICBzaXplLCAgIHNpemUsIDAsXG5cdFx0ICBzaXplLCAtIHNpemUsIDAsXG5cdFx0LSBzaXplLCAtIHNpemUsIDAsXG5cdFx0LSBzaXplLCAgIHNpemUsIDBcblx0XSwgMyApICk7XG5cblx0dmFyIG1hdGVyaWFsID0gbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IGZvZzogZmFsc2UgfSApO1xuXG5cdHRoaXMuYWRkKCBuZXcgTGluZSggZ2VvbWV0cnksIG1hdGVyaWFsICkgKTtcblxuXHRnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXHRnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBbIDAsIDAsIDAsIDAsIDAsIDEgXSwgMyApICk7XG5cblx0dGhpcy5hZGQoIG5ldyBMaW5lKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKSk7XG5cblx0dGhpcy51cGRhdGUoKTtcblxufVxuXG5EaXJlY3Rpb25hbExpZ2h0SGVscGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApO1xuRGlyZWN0aW9uYWxMaWdodEhlbHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBEaXJlY3Rpb25hbExpZ2h0SGVscGVyO1xuXG5EaXJlY3Rpb25hbExpZ2h0SGVscGVyLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkge1xuXG5cdHZhciBsaWdodFBsYW5lID0gdGhpcy5jaGlsZHJlblsgMCBdO1xuXHR2YXIgdGFyZ2V0TGluZSA9IHRoaXMuY2hpbGRyZW5bIDEgXTtcblxuXHRsaWdodFBsYW5lLmdlb21ldHJ5LmRpc3Bvc2UoKTtcblx0bGlnaHRQbGFuZS5tYXRlcmlhbC5kaXNwb3NlKCk7XG5cdHRhcmdldExpbmUuZ2VvbWV0cnkuZGlzcG9zZSgpO1xuXHR0YXJnZXRMaW5lLm1hdGVyaWFsLmRpc3Bvc2UoKTtcblxufTtcblxuRGlyZWN0aW9uYWxMaWdodEhlbHBlci5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gKCkge1xuXG5cdHZhciB2MSA9IG5ldyBWZWN0b3IzKCk7XG5cdHZhciB2MiA9IG5ldyBWZWN0b3IzKCk7XG5cdHZhciB2MyA9IG5ldyBWZWN0b3IzKCk7XG5cblx0cmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZSgpIHtcblxuXHRcdHYxLnNldEZyb21NYXRyaXhQb3NpdGlvbiggdGhpcy5saWdodC5tYXRyaXhXb3JsZCApO1xuXHRcdHYyLnNldEZyb21NYXRyaXhQb3NpdGlvbiggdGhpcy5saWdodC50YXJnZXQubWF0cml4V29ybGQgKTtcblx0XHR2My5zdWJWZWN0b3JzKCB2MiwgdjEgKTtcblxuXHRcdHZhciBsaWdodFBsYW5lID0gdGhpcy5jaGlsZHJlblsgMCBdO1xuXHRcdHZhciB0YXJnZXRMaW5lID0gdGhpcy5jaGlsZHJlblsgMSBdO1xuXG5cdFx0bGlnaHRQbGFuZS5sb29rQXQoIHYzICk7XG5cdFx0bGlnaHRQbGFuZS5tYXRlcmlhbC5jb2xvci5jb3B5KCB0aGlzLmxpZ2h0LmNvbG9yICk7XG5cblx0XHR0YXJnZXRMaW5lLmxvb2tBdCggdjMgKTtcblx0XHR0YXJnZXRMaW5lLnNjYWxlLnogPSB2My5sZW5ndGgoKTtcblxuXHR9O1xuXG59KCk7XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3XG4gKlxuICpcdC0gc2hvd3MgZnJ1c3R1bSwgbGluZSBvZiBzaWdodCBhbmQgdXAgb2YgdGhlIGNhbWVyYVxuICpcdC0gc3VpdGFibGUgZm9yIGZhc3QgdXBkYXRlc1xuICogXHQtIGJhc2VkIG9uIGZydXN0dW0gdmlzdWFsaXphdGlvbiBpbiBsaWdodGdsLmpzIHNoYWRvd21hcCBleGFtcGxlXG4gKlx0XHRodHRwOi8vZXZhbncuZ2l0aHViLmNvbS9saWdodGdsLmpzL3Rlc3RzL3NoYWRvd21hcC5odG1sXG4gKi9cblxuZnVuY3Rpb24gQ2FtZXJhSGVscGVyKCBjYW1lcmEgKSB7XG5cblx0dmFyIGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cdHZhciBtYXRlcmlhbCA9IG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogMHhmZmZmZmYsIHZlcnRleENvbG9yczogRmFjZUNvbG9ycyB9ICk7XG5cblx0dmFyIHZlcnRpY2VzID0gW107XG5cdHZhciBjb2xvcnMgPSBbXTtcblxuXHR2YXIgcG9pbnRNYXAgPSB7fTtcblxuXHQvLyBjb2xvcnNcblxuXHR2YXIgY29sb3JGcnVzdHVtID0gbmV3IENvbG9yKCAweGZmYWEwMCApO1xuXHR2YXIgY29sb3JDb25lID0gbmV3IENvbG9yKCAweGZmMDAwMCApO1xuXHR2YXIgY29sb3JVcCA9IG5ldyBDb2xvciggMHgwMGFhZmYgKTtcblx0dmFyIGNvbG9yVGFyZ2V0ID0gbmV3IENvbG9yKCAweGZmZmZmZiApO1xuXHR2YXIgY29sb3JDcm9zcyA9IG5ldyBDb2xvciggMHgzMzMzMzMgKTtcblxuXHQvLyBuZWFyXG5cblx0YWRkTGluZSggXCJuMVwiLCBcIm4yXCIsIGNvbG9yRnJ1c3R1bSApO1xuXHRhZGRMaW5lKCBcIm4yXCIsIFwibjRcIiwgY29sb3JGcnVzdHVtICk7XG5cdGFkZExpbmUoIFwibjRcIiwgXCJuM1wiLCBjb2xvckZydXN0dW0gKTtcblx0YWRkTGluZSggXCJuM1wiLCBcIm4xXCIsIGNvbG9yRnJ1c3R1bSApO1xuXG5cdC8vIGZhclxuXG5cdGFkZExpbmUoIFwiZjFcIiwgXCJmMlwiLCBjb2xvckZydXN0dW0gKTtcblx0YWRkTGluZSggXCJmMlwiLCBcImY0XCIsIGNvbG9yRnJ1c3R1bSApO1xuXHRhZGRMaW5lKCBcImY0XCIsIFwiZjNcIiwgY29sb3JGcnVzdHVtICk7XG5cdGFkZExpbmUoIFwiZjNcIiwgXCJmMVwiLCBjb2xvckZydXN0dW0gKTtcblxuXHQvLyBzaWRlc1xuXG5cdGFkZExpbmUoIFwibjFcIiwgXCJmMVwiLCBjb2xvckZydXN0dW0gKTtcblx0YWRkTGluZSggXCJuMlwiLCBcImYyXCIsIGNvbG9yRnJ1c3R1bSApO1xuXHRhZGRMaW5lKCBcIm4zXCIsIFwiZjNcIiwgY29sb3JGcnVzdHVtICk7XG5cdGFkZExpbmUoIFwibjRcIiwgXCJmNFwiLCBjb2xvckZydXN0dW0gKTtcblxuXHQvLyBjb25lXG5cblx0YWRkTGluZSggXCJwXCIsIFwibjFcIiwgY29sb3JDb25lICk7XG5cdGFkZExpbmUoIFwicFwiLCBcIm4yXCIsIGNvbG9yQ29uZSApO1xuXHRhZGRMaW5lKCBcInBcIiwgXCJuM1wiLCBjb2xvckNvbmUgKTtcblx0YWRkTGluZSggXCJwXCIsIFwibjRcIiwgY29sb3JDb25lICk7XG5cblx0Ly8gdXBcblxuXHRhZGRMaW5lKCBcInUxXCIsIFwidTJcIiwgY29sb3JVcCApO1xuXHRhZGRMaW5lKCBcInUyXCIsIFwidTNcIiwgY29sb3JVcCApO1xuXHRhZGRMaW5lKCBcInUzXCIsIFwidTFcIiwgY29sb3JVcCApO1xuXG5cdC8vIHRhcmdldFxuXG5cdGFkZExpbmUoIFwiY1wiLCBcInRcIiwgY29sb3JUYXJnZXQgKTtcblx0YWRkTGluZSggXCJwXCIsIFwiY1wiLCBjb2xvckNyb3NzICk7XG5cblx0Ly8gY3Jvc3NcblxuXHRhZGRMaW5lKCBcImNuMVwiLCBcImNuMlwiLCBjb2xvckNyb3NzICk7XG5cdGFkZExpbmUoIFwiY24zXCIsIFwiY240XCIsIGNvbG9yQ3Jvc3MgKTtcblxuXHRhZGRMaW5lKCBcImNmMVwiLCBcImNmMlwiLCBjb2xvckNyb3NzICk7XG5cdGFkZExpbmUoIFwiY2YzXCIsIFwiY2Y0XCIsIGNvbG9yQ3Jvc3MgKTtcblxuXHRmdW5jdGlvbiBhZGRMaW5lKCBhLCBiLCBjb2xvciApIHtcblxuXHRcdGFkZFBvaW50KCBhLCBjb2xvciApO1xuXHRcdGFkZFBvaW50KCBiLCBjb2xvciApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBhZGRQb2ludCggaWQsIGNvbG9yICkge1xuXG5cdFx0dmVydGljZXMucHVzaCggMCwgMCwgMCApO1xuXHRcdGNvbG9ycy5wdXNoKCBjb2xvci5yLCBjb2xvci5nLCBjb2xvci5iICk7XG5cblx0XHRpZiAoIHBvaW50TWFwWyBpZCBdID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHBvaW50TWFwWyBpZCBdID0gW107XG5cblx0XHR9XG5cblx0XHRwb2ludE1hcFsgaWQgXS5wdXNoKCAoIHZlcnRpY2VzLmxlbmd0aCAvIDMgKSAtIDEgKTtcblxuXHR9XG5cblx0Z2VvbWV0cnkuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXHRnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdjb2xvcicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBjb2xvcnMsIDMgKSApO1xuXG5cdExpbmVTZWdtZW50cy5jYWxsKCB0aGlzLCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcblxuXHR0aGlzLmNhbWVyYSA9IGNhbWVyYTtcblx0aWYgKCB0aGlzLmNhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4ICkgdGhpcy5jYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xuXG5cdHRoaXMubWF0cml4ID0gY2FtZXJhLm1hdHJpeFdvcmxkO1xuXHR0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTtcblxuXHR0aGlzLnBvaW50TWFwID0gcG9pbnRNYXA7XG5cblx0dGhpcy51cGRhdGUoKTtcblxufVxuXG5DYW1lcmFIZWxwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTGluZVNlZ21lbnRzLnByb3RvdHlwZSApO1xuQ2FtZXJhSGVscGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IENhbWVyYUhlbHBlcjtcblxuQ2FtZXJhSGVscGVyLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAoKSB7XG5cblx0dmFyIGdlb21ldHJ5LCBwb2ludE1hcDtcblxuXHR2YXIgdmVjdG9yID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIGNhbWVyYSA9IG5ldyBDYW1lcmEoKTtcblxuXHRmdW5jdGlvbiBzZXRQb2ludCggcG9pbnQsIHgsIHksIHogKSB7XG5cblx0XHR2ZWN0b3Iuc2V0KCB4LCB5LCB6ICkudW5wcm9qZWN0KCBjYW1lcmEgKTtcblxuXHRcdHZhciBwb2ludHMgPSBwb2ludE1hcFsgcG9pbnQgXTtcblxuXHRcdGlmICggcG9pbnRzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHZhciBwb3NpdGlvbiA9IGdlb21ldHJ5LmdldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJyApO1xuXG5cdFx0XHRmb3IgKCB2YXIgaSA9IDAsIGwgPSBwb2ludHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRwb3NpdGlvbi5zZXRYWVooIHBvaW50c1sgaSBdLCB2ZWN0b3IueCwgdmVjdG9yLnksIHZlY3Rvci56ICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9XG5cblx0cmV0dXJuIGZ1bmN0aW9uIHVwZGF0ZSgpIHtcblxuXHRcdGdlb21ldHJ5ID0gdGhpcy5nZW9tZXRyeTtcblx0XHRwb2ludE1hcCA9IHRoaXMucG9pbnRNYXA7XG5cblx0XHR2YXIgdyA9IDEsIGggPSAxO1xuXG5cdFx0Ly8gd2UgbmVlZCBqdXN0IGNhbWVyYSBwcm9qZWN0aW9uIG1hdHJpeFxuXHRcdC8vIHdvcmxkIG1hdHJpeCBtdXN0IGJlIGlkZW50aXR5XG5cblx0XHRjYW1lcmEucHJvamVjdGlvbk1hdHJpeC5jb3B5KCB0aGlzLmNhbWVyYS5wcm9qZWN0aW9uTWF0cml4ICk7XG5cblx0XHQvLyBjZW50ZXIgLyB0YXJnZXRcblxuXHRcdHNldFBvaW50KCBcImNcIiwgMCwgMCwgLSAxICk7XG5cdFx0c2V0UG9pbnQoIFwidFwiLCAwLCAwLCAgMSApO1xuXG5cdFx0Ly8gbmVhclxuXG5cdFx0c2V0UG9pbnQoIFwibjFcIiwgLSB3LCAtIGgsIC0gMSApO1xuXHRcdHNldFBvaW50KCBcIm4yXCIsICAgdywgLSBoLCAtIDEgKTtcblx0XHRzZXRQb2ludCggXCJuM1wiLCAtIHcsICAgaCwgLSAxICk7XG5cdFx0c2V0UG9pbnQoIFwibjRcIiwgICB3LCAgIGgsIC0gMSApO1xuXG5cdFx0Ly8gZmFyXG5cblx0XHRzZXRQb2ludCggXCJmMVwiLCAtIHcsIC0gaCwgMSApO1xuXHRcdHNldFBvaW50KCBcImYyXCIsICAgdywgLSBoLCAxICk7XG5cdFx0c2V0UG9pbnQoIFwiZjNcIiwgLSB3LCAgIGgsIDEgKTtcblx0XHRzZXRQb2ludCggXCJmNFwiLCAgIHcsICAgaCwgMSApO1xuXG5cdFx0Ly8gdXBcblxuXHRcdHNldFBvaW50KCBcInUxXCIsICAgdyAqIDAuNywgaCAqIDEuMSwgLSAxICk7XG5cdFx0c2V0UG9pbnQoIFwidTJcIiwgLSB3ICogMC43LCBoICogMS4xLCAtIDEgKTtcblx0XHRzZXRQb2ludCggXCJ1M1wiLCAgICAgICAgIDAsIGggKiAyLCAgIC0gMSApO1xuXG5cdFx0Ly8gY3Jvc3NcblxuXHRcdHNldFBvaW50KCBcImNmMVwiLCAtIHcsICAgMCwgMSApO1xuXHRcdHNldFBvaW50KCBcImNmMlwiLCAgIHcsICAgMCwgMSApO1xuXHRcdHNldFBvaW50KCBcImNmM1wiLCAgIDAsIC0gaCwgMSApO1xuXHRcdHNldFBvaW50KCBcImNmNFwiLCAgIDAsICAgaCwgMSApO1xuXG5cdFx0c2V0UG9pbnQoIFwiY24xXCIsIC0gdywgICAwLCAtIDEgKTtcblx0XHRzZXRQb2ludCggXCJjbjJcIiwgICB3LCAgIDAsIC0gMSApO1xuXHRcdHNldFBvaW50KCBcImNuM1wiLCAgIDAsIC0gaCwgLSAxICk7XG5cdFx0c2V0UG9pbnQoIFwiY240XCIsICAgMCwgICBoLCAtIDEgKTtcblxuXHRcdGdlb21ldHJ5LmdldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJyApLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHR9O1xuXG59KCk7XG5cbi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS9cbiAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHA6Ly9naXRodWIuY29tL011Z2VuODdcbiAqL1xuXG5mdW5jdGlvbiBCb3hIZWxwZXIoIG9iamVjdCwgY29sb3IgKSB7XG5cblx0dGhpcy5vYmplY3QgPSBvYmplY3Q7XG5cblx0aWYgKCBjb2xvciA9PT0gdW5kZWZpbmVkICkgY29sb3IgPSAweGZmZmYwMDtcblxuXHR2YXIgaW5kaWNlcyA9IG5ldyBVaW50MTZBcnJheSggWyAwLCAxLCAxLCAyLCAyLCAzLCAzLCAwLCA0LCA1LCA1LCA2LCA2LCA3LCA3LCA0LCAwLCA0LCAxLCA1LCAyLCA2LCAzLCA3IF0gKTtcblx0dmFyIHBvc2l0aW9ucyA9IG5ldyBGbG9hdDMyQXJyYXkoIDggKiAzICk7XG5cblx0dmFyIGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cdGdlb21ldHJ5LnNldEluZGV4KCBuZXcgQnVmZmVyQXR0cmlidXRlKCBpbmRpY2VzLCAxICkgKTtcblx0Z2VvbWV0cnkuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbnMsIDMgKSApO1xuXG5cdExpbmVTZWdtZW50cy5jYWxsKCB0aGlzLCBnZW9tZXRyeSwgbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiBjb2xvciB9ICkgKTtcblxuXHR0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTtcblxuXHR0aGlzLnVwZGF0ZSgpO1xuXG59XG5cbkJveEhlbHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBMaW5lU2VnbWVudHMucHJvdG90eXBlICk7XG5Cb3hIZWxwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQm94SGVscGVyO1xuXG5Cb3hIZWxwZXIucHJvdG90eXBlLnVwZGF0ZSA9ICggZnVuY3Rpb24gKCkge1xuXG5cdHZhciBib3ggPSBuZXcgQm94MygpO1xuXG5cdHJldHVybiBmdW5jdGlvbiB1cGRhdGUoIG9iamVjdCApIHtcblxuXHRcdGlmICggb2JqZWN0ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJveEhlbHBlcjogLnVwZGF0ZSgpIGhhcyBubyBsb25nZXIgYXJndW1lbnRzLicgKTtcblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5vYmplY3QgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Ym94LnNldEZyb21PYmplY3QoIHRoaXMub2JqZWN0ICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIGJveC5pc0VtcHR5KCkgKSByZXR1cm47XG5cblx0XHR2YXIgbWluID0gYm94Lm1pbjtcblx0XHR2YXIgbWF4ID0gYm94Lm1heDtcblxuXHRcdC8qXG5cdFx0ICA1X19fXzRcblx0XHQxL19fXzAvfFxuXHRcdHwgNl9ffF83XG5cdFx0Mi9fX18zL1xuXG5cdFx0MDogbWF4LngsIG1heC55LCBtYXguelxuXHRcdDE6IG1pbi54LCBtYXgueSwgbWF4Lnpcblx0XHQyOiBtaW4ueCwgbWluLnksIG1heC56XG5cdFx0MzogbWF4LngsIG1pbi55LCBtYXguelxuXHRcdDQ6IG1heC54LCBtYXgueSwgbWluLnpcblx0XHQ1OiBtaW4ueCwgbWF4LnksIG1pbi56XG5cdFx0NjogbWluLngsIG1pbi55LCBtaW4uelxuXHRcdDc6IG1heC54LCBtaW4ueSwgbWluLnpcblx0XHQqL1xuXG5cdFx0dmFyIHBvc2l0aW9uID0gdGhpcy5nZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uO1xuXHRcdHZhciBhcnJheSA9IHBvc2l0aW9uLmFycmF5O1xuXG5cdFx0YXJyYXlbICAwIF0gPSBtYXgueDsgYXJyYXlbICAxIF0gPSBtYXgueTsgYXJyYXlbICAyIF0gPSBtYXguejtcblx0XHRhcnJheVsgIDMgXSA9IG1pbi54OyBhcnJheVsgIDQgXSA9IG1heC55OyBhcnJheVsgIDUgXSA9IG1heC56O1xuXHRcdGFycmF5WyAgNiBdID0gbWluLng7IGFycmF5WyAgNyBdID0gbWluLnk7IGFycmF5WyAgOCBdID0gbWF4Lno7XG5cdFx0YXJyYXlbICA5IF0gPSBtYXgueDsgYXJyYXlbIDEwIF0gPSBtaW4ueTsgYXJyYXlbIDExIF0gPSBtYXguejtcblx0XHRhcnJheVsgMTIgXSA9IG1heC54OyBhcnJheVsgMTMgXSA9IG1heC55OyBhcnJheVsgMTQgXSA9IG1pbi56O1xuXHRcdGFycmF5WyAxNSBdID0gbWluLng7IGFycmF5WyAxNiBdID0gbWF4Lnk7IGFycmF5WyAxNyBdID0gbWluLno7XG5cdFx0YXJyYXlbIDE4IF0gPSBtaW4ueDsgYXJyYXlbIDE5IF0gPSBtaW4ueTsgYXJyYXlbIDIwIF0gPSBtaW4uejtcblx0XHRhcnJheVsgMjEgXSA9IG1heC54OyBhcnJheVsgMjIgXSA9IG1pbi55OyBhcnJheVsgMjMgXSA9IG1pbi56O1xuXG5cdFx0cG9zaXRpb24ubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0dGhpcy5nZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtcblxuXHR9O1xuXG59ICkoKTtcblxuQm94SGVscGVyLnByb3RvdHlwZS5zZXRGcm9tT2JqZWN0ID0gZnVuY3Rpb24gKCBvYmplY3QgKSB7XG5cblx0dGhpcy5vYmplY3QgPSBvYmplY3Q7XG5cdHRoaXMudXBkYXRlKCk7XG5cblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cbi8qKlxuICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5XG4gKiBAYXV0aG9yIHp6ODUgLyBodHRwOi8vZ2l0aHViLmNvbS96ejg1XG4gKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvXG4gKlxuICogQ3JlYXRlcyBhbiBhcnJvdyBmb3IgdmlzdWFsaXppbmcgZGlyZWN0aW9uc1xuICpcbiAqIFBhcmFtZXRlcnM6XG4gKiAgZGlyIC0gVmVjdG9yM1xuICogIG9yaWdpbiAtIFZlY3RvcjNcbiAqICBsZW5ndGggLSBOdW1iZXJcbiAqICBjb2xvciAtIGNvbG9yIGluIGhleCB2YWx1ZVxuICogIGhlYWRMZW5ndGggLSBOdW1iZXJcbiAqICBoZWFkV2lkdGggLSBOdW1iZXJcbiAqL1xuXG52YXIgbGluZUdlb21ldHJ5O1xudmFyIGNvbmVHZW9tZXRyeTtcblxuZnVuY3Rpb24gQXJyb3dIZWxwZXIoIGRpciwgb3JpZ2luLCBsZW5ndGgsIGNvbG9yLCBoZWFkTGVuZ3RoLCBoZWFkV2lkdGggKSB7XG5cblx0Ly8gZGlyIGlzIGFzc3VtZWQgdG8gYmUgbm9ybWFsaXplZFxuXG5cdE9iamVjdDNELmNhbGwoIHRoaXMgKTtcblxuXHRpZiAoIGNvbG9yID09PSB1bmRlZmluZWQgKSBjb2xvciA9IDB4ZmZmZjAwO1xuXHRpZiAoIGxlbmd0aCA9PT0gdW5kZWZpbmVkICkgbGVuZ3RoID0gMTtcblx0aWYgKCBoZWFkTGVuZ3RoID09PSB1bmRlZmluZWQgKSBoZWFkTGVuZ3RoID0gMC4yICogbGVuZ3RoO1xuXHRpZiAoIGhlYWRXaWR0aCA9PT0gdW5kZWZpbmVkICkgaGVhZFdpZHRoID0gMC4yICogaGVhZExlbmd0aDtcblxuXHRpZiAoIGxpbmVHZW9tZXRyeSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0bGluZUdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cdFx0bGluZUdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIFsgMCwgMCwgMCwgMCwgMSwgMCBdLCAzICkgKTtcblxuXHRcdGNvbmVHZW9tZXRyeSA9IG5ldyBDeWxpbmRlckJ1ZmZlckdlb21ldHJ5KCAwLCAwLjUsIDEsIDUsIDEgKTtcblx0XHRjb25lR2VvbWV0cnkudHJhbnNsYXRlKCAwLCAtIDAuNSwgMCApO1xuXG5cdH1cblxuXHR0aGlzLnBvc2l0aW9uLmNvcHkoIG9yaWdpbiApO1xuXG5cdHRoaXMubGluZSA9IG5ldyBMaW5lKCBsaW5lR2VvbWV0cnksIG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogY29sb3IgfSApICk7XG5cdHRoaXMubGluZS5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7XG5cdHRoaXMuYWRkKCB0aGlzLmxpbmUgKTtcblxuXHR0aGlzLmNvbmUgPSBuZXcgTWVzaCggY29uZUdlb21ldHJ5LCBuZXcgTWVzaEJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IGNvbG9yIH0gKSApO1xuXHR0aGlzLmNvbmUubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xuXHR0aGlzLmFkZCggdGhpcy5jb25lICk7XG5cblx0dGhpcy5zZXREaXJlY3Rpb24oIGRpciApO1xuXHR0aGlzLnNldExlbmd0aCggbGVuZ3RoLCBoZWFkTGVuZ3RoLCBoZWFkV2lkdGggKTtcblxufVxuXG5BcnJvd0hlbHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKTtcbkFycm93SGVscGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEFycm93SGVscGVyO1xuXG5BcnJvd0hlbHBlci5wcm90b3R5cGUuc2V0RGlyZWN0aW9uID0gKCBmdW5jdGlvbiAoKSB7XG5cblx0dmFyIGF4aXMgPSBuZXcgVmVjdG9yMygpO1xuXHR2YXIgcmFkaWFucztcblxuXHRyZXR1cm4gZnVuY3Rpb24gc2V0RGlyZWN0aW9uKCBkaXIgKSB7XG5cblx0XHQvLyBkaXIgaXMgYXNzdW1lZCB0byBiZSBub3JtYWxpemVkXG5cblx0XHRpZiAoIGRpci55ID4gMC45OTk5OSApIHtcblxuXHRcdFx0dGhpcy5xdWF0ZXJuaW9uLnNldCggMCwgMCwgMCwgMSApO1xuXG5cdFx0fSBlbHNlIGlmICggZGlyLnkgPCAtIDAuOTk5OTkgKSB7XG5cblx0XHRcdHRoaXMucXVhdGVybmlvbi5zZXQoIDEsIDAsIDAsIDAgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGF4aXMuc2V0KCBkaXIueiwgMCwgLSBkaXIueCApLm5vcm1hbGl6ZSgpO1xuXG5cdFx0XHRyYWRpYW5zID0gTWF0aC5hY29zKCBkaXIueSApO1xuXG5cdFx0XHR0aGlzLnF1YXRlcm5pb24uc2V0RnJvbUF4aXNBbmdsZSggYXhpcywgcmFkaWFucyApO1xuXG5cdFx0fVxuXG5cdH07XG5cbn0oKSApO1xuXG5BcnJvd0hlbHBlci5wcm90b3R5cGUuc2V0TGVuZ3RoID0gZnVuY3Rpb24gKCBsZW5ndGgsIGhlYWRMZW5ndGgsIGhlYWRXaWR0aCApIHtcblxuXHRpZiAoIGhlYWRMZW5ndGggPT09IHVuZGVmaW5lZCApIGhlYWRMZW5ndGggPSAwLjIgKiBsZW5ndGg7XG5cdGlmICggaGVhZFdpZHRoID09PSB1bmRlZmluZWQgKSBoZWFkV2lkdGggPSAwLjIgKiBoZWFkTGVuZ3RoO1xuXG5cdHRoaXMubGluZS5zY2FsZS5zZXQoIDEsIE1hdGgubWF4KCAwLCBsZW5ndGggLSBoZWFkTGVuZ3RoICksIDEgKTtcblx0dGhpcy5saW5lLnVwZGF0ZU1hdHJpeCgpO1xuXG5cdHRoaXMuY29uZS5zY2FsZS5zZXQoIGhlYWRXaWR0aCwgaGVhZExlbmd0aCwgaGVhZFdpZHRoICk7XG5cdHRoaXMuY29uZS5wb3NpdGlvbi55ID0gbGVuZ3RoO1xuXHR0aGlzLmNvbmUudXBkYXRlTWF0cml4KCk7XG5cbn07XG5cbkFycm93SGVscGVyLnByb3RvdHlwZS5zZXRDb2xvciA9IGZ1bmN0aW9uICggY29sb3IgKSB7XG5cblx0dGhpcy5saW5lLm1hdGVyaWFsLmNvbG9yLmNvcHkoIGNvbG9yICk7XG5cdHRoaXMuY29uZS5tYXRlcmlhbC5jb2xvci5jb3B5KCBjb2xvciApO1xuXG59O1xuXG4vKipcbiAqIEBhdXRob3Igc3JvdWNoZXJheSAvIGh0dHA6Ly9zcm91Y2hlcmF5Lm9yZy9cbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vXG4gKi9cblxuZnVuY3Rpb24gQXhpc0hlbHBlciggc2l6ZSApIHtcblxuXHRzaXplID0gc2l6ZSB8fCAxO1xuXG5cdHZhciB2ZXJ0aWNlcyA9IFtcblx0XHQwLCAwLCAwLCAgc2l6ZSwgMCwgMCxcblx0XHQwLCAwLCAwLCAgMCwgc2l6ZSwgMCxcblx0XHQwLCAwLCAwLCAgMCwgMCwgc2l6ZVxuXHRdO1xuXG5cdHZhciBjb2xvcnMgPSBbXG5cdFx0MSwgMCwgMCwgIDEsIDAuNiwgMCxcblx0XHQwLCAxLCAwLCAgMC42LCAxLCAwLFxuXHRcdDAsIDAsIDEsICAwLCAwLjYsIDFcblx0XTtcblxuXHR2YXIgZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcblx0Z2VvbWV0cnkuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXHRnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdjb2xvcicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBjb2xvcnMsIDMgKSApO1xuXG5cdHZhciBtYXRlcmlhbCA9IG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyB2ZXJ0ZXhDb2xvcnM6IFZlcnRleENvbG9ycyB9ICk7XG5cblx0TGluZVNlZ21lbnRzLmNhbGwoIHRoaXMsIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xuXG59XG5cbkF4aXNIZWxwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTGluZVNlZ21lbnRzLnByb3RvdHlwZSApO1xuQXhpc0hlbHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBBeGlzSGVscGVyO1xuXG4vKipcbiAqIEBhdXRob3Igeno4NSBodHRwczovL2dpdGh1Yi5jb20veno4NVxuICpcbiAqIENlbnRyaXBldGFsIENhdG11bGxSb20gQ3VydmUgLSB3aGljaCBpcyB1c2VmdWwgZm9yIGF2b2lkaW5nXG4gKiBjdXNwcyBhbmQgc2VsZi1pbnRlcnNlY3Rpb25zIGluIG5vbi11bmlmb3JtIGNhdG11bGwgcm9tIGN1cnZlcy5cbiAqIGh0dHA6Ly93d3cuY2VteXVrc2VsLmNvbS9yZXNlYXJjaC9jYXRtdWxscm9tX3BhcmFtL2NhdG11bGxyb20ucGRmXG4gKlxuICogY3VydmUudHlwZSBhY2NlcHRzIGNlbnRyaXBldGFsKGRlZmF1bHQpLCBjaG9yZGFsIGFuZCBjYXRtdWxscm9tXG4gKiBjdXJ2ZS50ZW5zaW9uIGlzIHVzZWQgZm9yIGNhdG11bGxyb20gd2hpY2ggZGVmYXVsdHMgdG8gMC41XG4gKi9cblxuXG4vKlxuQmFzZWQgb24gYW4gb3B0aW1pemVkIGMrKyBzb2x1dGlvbiBpblxuIC0gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy85NDg5NzM2L2NhdG11bGwtcm9tLWN1cnZlLXdpdGgtbm8tY3VzcHMtYW5kLW5vLXNlbGYtaW50ZXJzZWN0aW9ucy9cbiAtIGh0dHA6Ly9pZGVvbmUuY29tL05vRWJWTVxuXG5UaGlzIEN1YmljUG9seSBjbGFzcyBjb3VsZCBiZSB1c2VkIGZvciByZXVzaW5nIHNvbWUgdmFyaWFibGVzIGFuZCBjYWxjdWxhdGlvbnMsXG5idXQgZm9yIHRocmVlLmpzIGN1cnZlIHVzZSwgaXQgY291bGQgYmUgcG9zc2libGUgaW5saW5lZCBhbmQgZmxhdHRlbiBpbnRvIGEgc2luZ2xlIGZ1bmN0aW9uIGNhbGxcbndoaWNoIGNhbiBiZSBwbGFjZWQgaW4gQ3VydmVVdGlscy5cbiovXG5cbmZ1bmN0aW9uIEN1YmljUG9seSgpIHtcblxuXHR2YXIgYzAgPSAwLCBjMSA9IDAsIGMyID0gMCwgYzMgPSAwO1xuXG5cdC8qXG5cdCAqIENvbXB1dGUgY29lZmZpY2llbnRzIGZvciBhIGN1YmljIHBvbHlub21pYWxcblx0ICogICBwKHMpID0gYzAgKyBjMSpzICsgYzIqc14yICsgYzMqc14zXG5cdCAqIHN1Y2ggdGhhdFxuXHQgKiAgIHAoMCkgPSB4MCwgcCgxKSA9IHgxXG5cdCAqICBhbmRcblx0ICogICBwJygwKSA9IHQwLCBwJygxKSA9IHQxLlxuXHQgKi9cblx0ZnVuY3Rpb24gaW5pdCggeDAsIHgxLCB0MCwgdDEgKSB7XG5cblx0XHRjMCA9IHgwO1xuXHRcdGMxID0gdDA7XG5cdFx0YzIgPSAtIDMgKiB4MCArIDMgKiB4MSAtIDIgKiB0MCAtIHQxO1xuXHRcdGMzID0gMiAqIHgwIC0gMiAqIHgxICsgdDAgKyB0MTtcblxuXHR9XG5cblx0cmV0dXJuIHtcblxuXHRcdGluaXRDYXRtdWxsUm9tOiBmdW5jdGlvbiAoIHgwLCB4MSwgeDIsIHgzLCB0ZW5zaW9uICkge1xuXG5cdFx0XHRpbml0KCB4MSwgeDIsIHRlbnNpb24gKiAoIHgyIC0geDAgKSwgdGVuc2lvbiAqICggeDMgLSB4MSApICk7XG5cblx0XHR9LFxuXG5cdFx0aW5pdE5vbnVuaWZvcm1DYXRtdWxsUm9tOiBmdW5jdGlvbiAoIHgwLCB4MSwgeDIsIHgzLCBkdDAsIGR0MSwgZHQyICkge1xuXG5cdFx0XHQvLyBjb21wdXRlIHRhbmdlbnRzIHdoZW4gcGFyYW1ldGVyaXplZCBpbiBbdDEsdDJdXG5cdFx0XHR2YXIgdDEgPSAoIHgxIC0geDAgKSAvIGR0MCAtICggeDIgLSB4MCApIC8gKCBkdDAgKyBkdDEgKSArICggeDIgLSB4MSApIC8gZHQxO1xuXHRcdFx0dmFyIHQyID0gKCB4MiAtIHgxICkgLyBkdDEgLSAoIHgzIC0geDEgKSAvICggZHQxICsgZHQyICkgKyAoIHgzIC0geDIgKSAvIGR0MjtcblxuXHRcdFx0Ly8gcmVzY2FsZSB0YW5nZW50cyBmb3IgcGFyYW1ldHJpemF0aW9uIGluIFswLDFdXG5cdFx0XHR0MSAqPSBkdDE7XG5cdFx0XHR0MiAqPSBkdDE7XG5cblx0XHRcdGluaXQoIHgxLCB4MiwgdDEsIHQyICk7XG5cblx0XHR9LFxuXG5cdFx0Y2FsYzogZnVuY3Rpb24gKCB0ICkge1xuXG5cdFx0XHR2YXIgdDIgPSB0ICogdDtcblx0XHRcdHZhciB0MyA9IHQyICogdDtcblx0XHRcdHJldHVybiBjMCArIGMxICogdCArIGMyICogdDIgKyBjMyAqIHQzO1xuXG5cdFx0fVxuXG5cdH07XG5cbn1cblxuLy9cblxudmFyIHRtcCA9IG5ldyBWZWN0b3IzKCk7XG52YXIgcHggPSBuZXcgQ3ViaWNQb2x5KCk7XG52YXIgcHkgPSBuZXcgQ3ViaWNQb2x5KCk7XG52YXIgcHogPSBuZXcgQ3ViaWNQb2x5KCk7XG5cbmZ1bmN0aW9uIENhdG11bGxSb21DdXJ2ZTMoIHAgLyogYXJyYXkgb2YgVmVjdG9yMyAqLyApIHtcblxuXHRDdXJ2ZS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy5wb2ludHMgPSBwIHx8IFtdO1xuXHR0aGlzLmNsb3NlZCA9IGZhbHNlO1xuXG59XG5cbkNhdG11bGxSb21DdXJ2ZTMucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQ3VydmUucHJvdG90eXBlICk7XG5DYXRtdWxsUm9tQ3VydmUzLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IENhdG11bGxSb21DdXJ2ZTM7XG5cbkNhdG11bGxSb21DdXJ2ZTMucHJvdG90eXBlLmdldFBvaW50ID0gZnVuY3Rpb24gKCB0ICkge1xuXG5cdHZhciBwb2ludHMgPSB0aGlzLnBvaW50cztcblx0dmFyIGwgPSBwb2ludHMubGVuZ3RoO1xuXG5cdGlmICggbCA8IDIgKSBjb25zb2xlLmxvZyggJ2R1aCwgeW91IG5lZWQgYXQgbGVhc3QgMiBwb2ludHMnICk7XG5cblx0dmFyIHBvaW50ID0gKCBsIC0gKCB0aGlzLmNsb3NlZCA/IDAgOiAxICkgKSAqIHQ7XG5cdHZhciBpbnRQb2ludCA9IE1hdGguZmxvb3IoIHBvaW50ICk7XG5cdHZhciB3ZWlnaHQgPSBwb2ludCAtIGludFBvaW50O1xuXG5cdGlmICggdGhpcy5jbG9zZWQgKSB7XG5cblx0XHRpbnRQb2ludCArPSBpbnRQb2ludCA+IDAgPyAwIDogKCBNYXRoLmZsb29yKCBNYXRoLmFicyggaW50UG9pbnQgKSAvIHBvaW50cy5sZW5ndGggKSArIDEgKSAqIHBvaW50cy5sZW5ndGg7XG5cblx0fSBlbHNlIGlmICggd2VpZ2h0ID09PSAwICYmIGludFBvaW50ID09PSBsIC0gMSApIHtcblxuXHRcdGludFBvaW50ID0gbCAtIDI7XG5cdFx0d2VpZ2h0ID0gMTtcblxuXHR9XG5cblx0dmFyIHAwLCBwMSwgcDIsIHAzOyAvLyA0IHBvaW50c1xuXG5cdGlmICggdGhpcy5jbG9zZWQgfHwgaW50UG9pbnQgPiAwICkge1xuXG5cdFx0cDAgPSBwb2ludHNbICggaW50UG9pbnQgLSAxICkgJSBsIF07XG5cblx0fSBlbHNlIHtcblxuXHRcdC8vIGV4dHJhcG9sYXRlIGZpcnN0IHBvaW50XG5cdFx0dG1wLnN1YlZlY3RvcnMoIHBvaW50c1sgMCBdLCBwb2ludHNbIDEgXSApLmFkZCggcG9pbnRzWyAwIF0gKTtcblx0XHRwMCA9IHRtcDtcblxuXHR9XG5cblx0cDEgPSBwb2ludHNbIGludFBvaW50ICUgbCBdO1xuXHRwMiA9IHBvaW50c1sgKCBpbnRQb2ludCArIDEgKSAlIGwgXTtcblxuXHRpZiAoIHRoaXMuY2xvc2VkIHx8IGludFBvaW50ICsgMiA8IGwgKSB7XG5cblx0XHRwMyA9IHBvaW50c1sgKCBpbnRQb2ludCArIDIgKSAlIGwgXTtcblxuXHR9IGVsc2Uge1xuXG5cdFx0Ly8gZXh0cmFwb2xhdGUgbGFzdCBwb2ludFxuXHRcdHRtcC5zdWJWZWN0b3JzKCBwb2ludHNbIGwgLSAxIF0sIHBvaW50c1sgbCAtIDIgXSApLmFkZCggcG9pbnRzWyBsIC0gMSBdICk7XG5cdFx0cDMgPSB0bXA7XG5cblx0fVxuXG5cdGlmICggdGhpcy50eXBlID09PSB1bmRlZmluZWQgfHwgdGhpcy50eXBlID09PSAnY2VudHJpcGV0YWwnIHx8IHRoaXMudHlwZSA9PT0gJ2Nob3JkYWwnICkge1xuXG5cdFx0Ly8gaW5pdCBDZW50cmlwZXRhbCAvIENob3JkYWwgQ2F0bXVsbC1Sb21cblx0XHR2YXIgcG93ID0gdGhpcy50eXBlID09PSAnY2hvcmRhbCcgPyAwLjUgOiAwLjI1O1xuXHRcdHZhciBkdDAgPSBNYXRoLnBvdyggcDAuZGlzdGFuY2VUb1NxdWFyZWQoIHAxICksIHBvdyApO1xuXHRcdHZhciBkdDEgPSBNYXRoLnBvdyggcDEuZGlzdGFuY2VUb1NxdWFyZWQoIHAyICksIHBvdyApO1xuXHRcdHZhciBkdDIgPSBNYXRoLnBvdyggcDIuZGlzdGFuY2VUb1NxdWFyZWQoIHAzICksIHBvdyApO1xuXG5cdFx0Ly8gc2FmZXR5IGNoZWNrIGZvciByZXBlYXRlZCBwb2ludHNcblx0XHRpZiAoIGR0MSA8IDFlLTQgKSBkdDEgPSAxLjA7XG5cdFx0aWYgKCBkdDAgPCAxZS00ICkgZHQwID0gZHQxO1xuXHRcdGlmICggZHQyIDwgMWUtNCApIGR0MiA9IGR0MTtcblxuXHRcdHB4LmluaXROb251bmlmb3JtQ2F0bXVsbFJvbSggcDAueCwgcDEueCwgcDIueCwgcDMueCwgZHQwLCBkdDEsIGR0MiApO1xuXHRcdHB5LmluaXROb251bmlmb3JtQ2F0bXVsbFJvbSggcDAueSwgcDEueSwgcDIueSwgcDMueSwgZHQwLCBkdDEsIGR0MiApO1xuXHRcdHB6LmluaXROb251bmlmb3JtQ2F0bXVsbFJvbSggcDAueiwgcDEueiwgcDIueiwgcDMueiwgZHQwLCBkdDEsIGR0MiApO1xuXG5cdH0gZWxzZSBpZiAoIHRoaXMudHlwZSA9PT0gJ2NhdG11bGxyb20nICkge1xuXG5cdFx0dmFyIHRlbnNpb24gPSB0aGlzLnRlbnNpb24gIT09IHVuZGVmaW5lZCA/IHRoaXMudGVuc2lvbiA6IDAuNTtcblx0XHRweC5pbml0Q2F0bXVsbFJvbSggcDAueCwgcDEueCwgcDIueCwgcDMueCwgdGVuc2lvbiApO1xuXHRcdHB5LmluaXRDYXRtdWxsUm9tKCBwMC55LCBwMS55LCBwMi55LCBwMy55LCB0ZW5zaW9uICk7XG5cdFx0cHouaW5pdENhdG11bGxSb20oIHAwLnosIHAxLnosIHAyLnosIHAzLnosIHRlbnNpb24gKTtcblxuXHR9XG5cblx0cmV0dXJuIG5ldyBWZWN0b3IzKCBweC5jYWxjKCB3ZWlnaHQgKSwgcHkuY2FsYyggd2VpZ2h0ICksIHB6LmNhbGMoIHdlaWdodCApICk7XG5cbn07XG5cbmZ1bmN0aW9uIEN1YmljQmV6aWVyQ3VydmUzKCB2MCwgdjEsIHYyLCB2MyApIHtcblxuXHRDdXJ2ZS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy52MCA9IHYwO1xuXHR0aGlzLnYxID0gdjE7XG5cdHRoaXMudjIgPSB2Mjtcblx0dGhpcy52MyA9IHYzO1xuXG59XG5cbkN1YmljQmV6aWVyQ3VydmUzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEN1cnZlLnByb3RvdHlwZSApO1xuQ3ViaWNCZXppZXJDdXJ2ZTMucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ3ViaWNCZXppZXJDdXJ2ZTM7XG5cbkN1YmljQmV6aWVyQ3VydmUzLnByb3RvdHlwZS5nZXRQb2ludCA9IGZ1bmN0aW9uICggdCApIHtcblxuXHR2YXIgdjAgPSB0aGlzLnYwLCB2MSA9IHRoaXMudjEsIHYyID0gdGhpcy52MiwgdjMgPSB0aGlzLnYzO1xuXG5cdHJldHVybiBuZXcgVmVjdG9yMyhcblx0XHRDdWJpY0JlemllciggdCwgdjAueCwgdjEueCwgdjIueCwgdjMueCApLFxuXHRcdEN1YmljQmV6aWVyKCB0LCB2MC55LCB2MS55LCB2Mi55LCB2My55ICksXG5cdFx0Q3ViaWNCZXppZXIoIHQsIHYwLnosIHYxLnosIHYyLnosIHYzLnogKVxuXHQpO1xuXG59O1xuXG5mdW5jdGlvbiBRdWFkcmF0aWNCZXppZXJDdXJ2ZTMoIHYwLCB2MSwgdjIgKSB7XG5cblx0Q3VydmUuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudjAgPSB2MDtcblx0dGhpcy52MSA9IHYxO1xuXHR0aGlzLnYyID0gdjI7XG5cbn1cblxuUXVhZHJhdGljQmV6aWVyQ3VydmUzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEN1cnZlLnByb3RvdHlwZSApO1xuUXVhZHJhdGljQmV6aWVyQ3VydmUzLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFF1YWRyYXRpY0JlemllckN1cnZlMztcblxuUXVhZHJhdGljQmV6aWVyQ3VydmUzLnByb3RvdHlwZS5nZXRQb2ludCA9IGZ1bmN0aW9uICggdCApIHtcblxuXHR2YXIgdjAgPSB0aGlzLnYwLCB2MSA9IHRoaXMudjEsIHYyID0gdGhpcy52MjtcblxuXHRyZXR1cm4gbmV3IFZlY3RvcjMoXG5cdFx0UXVhZHJhdGljQmV6aWVyKCB0LCB2MC54LCB2MS54LCB2Mi54ICksXG5cdFx0UXVhZHJhdGljQmV6aWVyKCB0LCB2MC55LCB2MS55LCB2Mi55ICksXG5cdFx0UXVhZHJhdGljQmV6aWVyKCB0LCB2MC56LCB2MS56LCB2Mi56IClcblx0KTtcblxufTtcblxuZnVuY3Rpb24gTGluZUN1cnZlMyggdjEsIHYyICkge1xuXG5cdEN1cnZlLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnYxID0gdjE7XG5cdHRoaXMudjIgPSB2MjtcblxufVxuXG5MaW5lQ3VydmUzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEN1cnZlLnByb3RvdHlwZSApO1xuTGluZUN1cnZlMy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBMaW5lQ3VydmUzO1xuXG5MaW5lQ3VydmUzLnByb3RvdHlwZS5nZXRQb2ludCA9IGZ1bmN0aW9uICggdCApIHtcblxuXHRpZiAoIHQgPT09IDEgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy52Mi5jbG9uZSgpO1xuXG5cdH1cblxuXHR2YXIgdmVjdG9yID0gbmV3IFZlY3RvcjMoKTtcblxuXHR2ZWN0b3Iuc3ViVmVjdG9ycyggdGhpcy52MiwgdGhpcy52MSApOyAvLyBkaWZmXG5cdHZlY3Rvci5tdWx0aXBseVNjYWxhciggdCApO1xuXHR2ZWN0b3IuYWRkKCB0aGlzLnYxICk7XG5cblx0cmV0dXJuIHZlY3RvcjtcblxufTtcblxuZnVuY3Rpb24gQXJjQ3VydmUoIGFYLCBhWSwgYVJhZGl1cywgYVN0YXJ0QW5nbGUsIGFFbmRBbmdsZSwgYUNsb2Nrd2lzZSApIHtcblxuXHRFbGxpcHNlQ3VydmUuY2FsbCggdGhpcywgYVgsIGFZLCBhUmFkaXVzLCBhUmFkaXVzLCBhU3RhcnRBbmdsZSwgYUVuZEFuZ2xlLCBhQ2xvY2t3aXNlICk7XG5cbn1cblxuQXJjQ3VydmUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggRWxsaXBzZUN1cnZlLnByb3RvdHlwZSApO1xuQXJjQ3VydmUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQXJjQ3VydmU7XG5cbi8qKlxuICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS9cbiAqL1xuXG52YXIgU2NlbmVVdGlscyA9IHtcblxuXHRjcmVhdGVNdWx0aU1hdGVyaWFsT2JqZWN0OiBmdW5jdGlvbiAoIGdlb21ldHJ5LCBtYXRlcmlhbHMgKSB7XG5cblx0XHR2YXIgZ3JvdXAgPSBuZXcgR3JvdXAoKTtcblxuXHRcdGZvciAoIHZhciBpID0gMCwgbCA9IG1hdGVyaWFscy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRncm91cC5hZGQoIG5ldyBNZXNoKCBnZW9tZXRyeSwgbWF0ZXJpYWxzWyBpIF0gKSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGdyb3VwO1xuXG5cdH0sXG5cblx0ZGV0YWNoOiBmdW5jdGlvbiAoIGNoaWxkLCBwYXJlbnQsIHNjZW5lICkge1xuXG5cdFx0Y2hpbGQuYXBwbHlNYXRyaXgoIHBhcmVudC5tYXRyaXhXb3JsZCApO1xuXHRcdHBhcmVudC5yZW1vdmUoIGNoaWxkICk7XG5cdFx0c2NlbmUuYWRkKCBjaGlsZCApO1xuXG5cdH0sXG5cblx0YXR0YWNoOiBmdW5jdGlvbiAoIGNoaWxkLCBzY2VuZSwgcGFyZW50ICkge1xuXG5cdFx0dmFyIG1hdHJpeFdvcmxkSW52ZXJzZSA9IG5ldyBNYXRyaXg0KCk7XG5cdFx0bWF0cml4V29ybGRJbnZlcnNlLmdldEludmVyc2UoIHBhcmVudC5tYXRyaXhXb3JsZCApO1xuXHRcdGNoaWxkLmFwcGx5TWF0cml4KCBtYXRyaXhXb3JsZEludmVyc2UgKTtcblxuXHRcdHNjZW5lLnJlbW92ZSggY2hpbGQgKTtcblx0XHRwYXJlbnQuYWRkKCBjaGlsZCApO1xuXG5cdH1cblxufTtcblxuLyoqXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tL1xuICovXG5cbmZ1bmN0aW9uIEZhY2U0KCBhLCBiLCBjLCBkLCBub3JtYWwsIGNvbG9yLCBtYXRlcmlhbEluZGV4ICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLkZhY2U0IGhhcyBiZWVuIHJlbW92ZWQuIEEgVEhSRUUuRmFjZTMgd2lsbCBiZSBjcmVhdGVkIGluc3RlYWQuJyApO1xuXHRyZXR1cm4gbmV3IEZhY2UzKCBhLCBiLCBjLCBub3JtYWwsIGNvbG9yLCBtYXRlcmlhbEluZGV4ICk7XG5cbn1cblxudmFyIExpbmVTdHJpcCA9IDA7XG5cbnZhciBMaW5lUGllY2VzID0gMTtcblxuZnVuY3Rpb24gTWVzaEZhY2VNYXRlcmlhbCggbWF0ZXJpYWxzICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLk1lc2hGYWNlTWF0ZXJpYWwgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIGFuIEFycmF5IGluc3RlYWQuJyApO1xuXHRyZXR1cm4gbWF0ZXJpYWxzO1xuXG59XG5cbmZ1bmN0aW9uIE11bHRpTWF0ZXJpYWwoIG1hdGVyaWFscyApIHtcblxuXHRpZiAoIG1hdGVyaWFscyA9PT0gdW5kZWZpbmVkICkgbWF0ZXJpYWxzID0gW107XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuTXVsdGlNYXRlcmlhbCBoYXMgYmVlbiByZW1vdmVkLiBVc2UgYW4gQXJyYXkgaW5zdGVhZC4nICk7XG5cdG1hdGVyaWFscy5pc011bHRpTWF0ZXJpYWwgPSB0cnVlO1xuXHRtYXRlcmlhbHMubWF0ZXJpYWxzID0gbWF0ZXJpYWxzO1xuXHRtYXRlcmlhbHMuY2xvbmUgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbWF0ZXJpYWxzLnNsaWNlKCk7XG5cblx0fTtcblx0cmV0dXJuIG1hdGVyaWFscztcblxufVxuXG5mdW5jdGlvbiBQb2ludENsb3VkKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuUG9pbnRDbG91ZCBoYXMgYmVlbiByZW5hbWVkIHRvIFRIUkVFLlBvaW50cy4nICk7XG5cdHJldHVybiBuZXcgUG9pbnRzKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcblxufVxuXG5mdW5jdGlvbiBQYXJ0aWNsZSggbWF0ZXJpYWwgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuUGFydGljbGUgaGFzIGJlZW4gcmVuYW1lZCB0byBUSFJFRS5TcHJpdGUuJyApO1xuXHRyZXR1cm4gbmV3IFNwcml0ZSggbWF0ZXJpYWwgKTtcblxufVxuXG5mdW5jdGlvbiBQYXJ0aWNsZVN5c3RlbSggZ2VvbWV0cnksIG1hdGVyaWFsICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLlBhcnRpY2xlU3lzdGVtIGhhcyBiZWVuIHJlbmFtZWQgdG8gVEhSRUUuUG9pbnRzLicgKTtcblx0cmV0dXJuIG5ldyBQb2ludHMoIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xuXG59XG5cbmZ1bmN0aW9uIFBvaW50Q2xvdWRNYXRlcmlhbCggcGFyYW1ldGVycyApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5Qb2ludENsb3VkTWF0ZXJpYWwgaGFzIGJlZW4gcmVuYW1lZCB0byBUSFJFRS5Qb2ludHNNYXRlcmlhbC4nICk7XG5cdHJldHVybiBuZXcgUG9pbnRzTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKTtcblxufVxuXG5mdW5jdGlvbiBQYXJ0aWNsZUJhc2ljTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuUGFydGljbGVCYXNpY01hdGVyaWFsIGhhcyBiZWVuIHJlbmFtZWQgdG8gVEhSRUUuUG9pbnRzTWF0ZXJpYWwuJyApO1xuXHRyZXR1cm4gbmV3IFBvaW50c01hdGVyaWFsKCBwYXJhbWV0ZXJzICk7XG5cbn1cblxuZnVuY3Rpb24gUGFydGljbGVTeXN0ZW1NYXRlcmlhbCggcGFyYW1ldGVycyApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5QYXJ0aWNsZVN5c3RlbU1hdGVyaWFsIGhhcyBiZWVuIHJlbmFtZWQgdG8gVEhSRUUuUG9pbnRzTWF0ZXJpYWwuJyApO1xuXHRyZXR1cm4gbmV3IFBvaW50c01hdGVyaWFsKCBwYXJhbWV0ZXJzICk7XG5cbn1cblxuZnVuY3Rpb24gVmVydGV4KCB4LCB5LCB6ICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlcnRleCBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuVmVjdG9yMyBpbnN0ZWFkLicgKTtcblx0cmV0dXJuIG5ldyBWZWN0b3IzKCB4LCB5LCB6ICk7XG5cbn1cblxuLy9cblxuZnVuY3Rpb24gRHluYW1pY0J1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLkR5bmFtaWNCdWZmZXJBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5CdWZmZXJBdHRyaWJ1dGUoKS5zZXREeW5hbWljKCB0cnVlICkgaW5zdGVhZC4nICk7XG5cdHJldHVybiBuZXcgQnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKS5zZXREeW5hbWljKCB0cnVlICk7XG5cbn1cblxuZnVuY3Rpb24gSW50OEF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLkludDhBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5JbnQ4QnVmZmVyQXR0cmlidXRlKCkgaW5zdGVhZC4nICk7XG5cdHJldHVybiBuZXcgSW50OEJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplICk7XG5cbn1cblxuZnVuY3Rpb24gVWludDhBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5VaW50OEF0dHJpYnV0ZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLlVpbnQ4QnVmZmVyQXR0cmlidXRlKCkgaW5zdGVhZC4nICk7XG5cdHJldHVybiBuZXcgVWludDhCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApO1xuXG59XG5cbmZ1bmN0aW9uIFVpbnQ4Q2xhbXBlZEF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLlVpbnQ4Q2xhbXBlZEF0dHJpYnV0ZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLlVpbnQ4Q2xhbXBlZEJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuJyApO1xuXHRyZXR1cm4gbmV3IFVpbnQ4Q2xhbXBlZEJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplICk7XG5cbn1cblxuZnVuY3Rpb24gSW50MTZBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5JbnQxNkF0dHJpYnV0ZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLkludDE2QnVmZmVyQXR0cmlidXRlKCkgaW5zdGVhZC4nICk7XG5cdHJldHVybiBuZXcgSW50MTZCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApO1xuXG59XG5cbmZ1bmN0aW9uIFVpbnQxNkF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLlVpbnQxNkF0dHJpYnV0ZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLlVpbnQxNkJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuJyApO1xuXHRyZXR1cm4gbmV3IFVpbnQxNkJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplICk7XG5cbn1cblxuZnVuY3Rpb24gSW50MzJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5JbnQzMkF0dHJpYnV0ZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLkludDMyQnVmZmVyQXR0cmlidXRlKCkgaW5zdGVhZC4nICk7XG5cdHJldHVybiBuZXcgSW50MzJCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApO1xuXG59XG5cbmZ1bmN0aW9uIFVpbnQzMkF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLlVpbnQzMkF0dHJpYnV0ZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLlVpbnQzMkJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuJyApO1xuXHRyZXR1cm4gbmV3IFVpbnQzMkJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplICk7XG5cbn1cblxuZnVuY3Rpb24gRmxvYXQzMkF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLkZsb2F0MzJBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5GbG9hdDMyQnVmZmVyQXR0cmlidXRlKCkgaW5zdGVhZC4nICk7XG5cdHJldHVybiBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplICk7XG5cbn1cblxuZnVuY3Rpb24gRmxvYXQ2NEF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLkZsb2F0NjRBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5GbG9hdDY0QnVmZmVyQXR0cmlidXRlKCkgaW5zdGVhZC4nICk7XG5cdHJldHVybiBuZXcgRmxvYXQ2NEJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplICk7XG5cbn1cblxuLy9cblxuQ3VydmUuY3JlYXRlID0gZnVuY3Rpb24gKCBjb25zdHJ1Y3QsIGdldFBvaW50ICkge1xuXG5cdGNvbnNvbGUubG9nKCAnVEhSRUUuQ3VydmUuY3JlYXRlKCkgaGFzIGJlZW4gZGVwcmVjYXRlZCcgKTtcblxuXHRjb25zdHJ1Y3QucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQ3VydmUucHJvdG90eXBlICk7XG5cdGNvbnN0cnVjdC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBjb25zdHJ1Y3Q7XG5cdGNvbnN0cnVjdC5wcm90b3R5cGUuZ2V0UG9pbnQgPSBnZXRQb2ludDtcblxuXHRyZXR1cm4gY29uc3RydWN0O1xuXG59O1xuXG4vL1xuXG5mdW5jdGlvbiBDbG9zZWRTcGxpbmVDdXJ2ZTMoIHBvaW50cyApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5DbG9zZWRTcGxpbmVDdXJ2ZTMgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIFRIUkVFLkNhdG11bGxSb21DdXJ2ZTMgaW5zdGVhZC4nICk7XG5cblx0Q2F0bXVsbFJvbUN1cnZlMy5jYWxsKCB0aGlzLCBwb2ludHMgKTtcblx0dGhpcy50eXBlID0gJ2NhdG11bGxyb20nO1xuXHR0aGlzLmNsb3NlZCA9IHRydWU7XG5cbn1cblxuQ2xvc2VkU3BsaW5lQ3VydmUzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIENhdG11bGxSb21DdXJ2ZTMucHJvdG90eXBlICk7XG5cbi8vXG5cbmZ1bmN0aW9uIFNwbGluZUN1cnZlMyggcG9pbnRzICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLlNwbGluZUN1cnZlMyBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgVEhSRUUuQ2F0bXVsbFJvbUN1cnZlMyBpbnN0ZWFkLicgKTtcblxuXHRDYXRtdWxsUm9tQ3VydmUzLmNhbGwoIHRoaXMsIHBvaW50cyApO1xuXHR0aGlzLnR5cGUgPSAnY2F0bXVsbHJvbSc7XG5cbn1cblxuU3BsaW5lQ3VydmUzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIENhdG11bGxSb21DdXJ2ZTMucHJvdG90eXBlICk7XG5cbi8vXG5cbmZ1bmN0aW9uIFNwbGluZSggcG9pbnRzICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLlNwbGluZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuQ2F0bXVsbFJvbUN1cnZlMyBpbnN0ZWFkLicgKTtcblxuXHRDYXRtdWxsUm9tQ3VydmUzLmNhbGwoIHRoaXMsIHBvaW50cyApO1xuXHR0aGlzLnR5cGUgPSAnY2F0bXVsbHJvbSc7XG5cbn1cblxuU3BsaW5lLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIENhdG11bGxSb21DdXJ2ZTMucHJvdG90eXBlICk7XG5cbk9iamVjdC5hc3NpZ24oIFNwbGluZS5wcm90b3R5cGUsIHtcblxuXHRpbml0RnJvbUFycmF5OiBmdW5jdGlvbiAoIGEgKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuU3BsaW5lOiAuaW5pdEZyb21BcnJheSgpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdH0sXG5cdGdldENvbnRyb2xQb2ludHNBcnJheTogZnVuY3Rpb24gKCBvcHRpb25hbFRhcmdldCApIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5TcGxpbmU6IC5nZXRDb250cm9sUG9pbnRzQXJyYXkoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9LFxuXHRyZXBhcmFtZXRyaXplQnlBcmNMZW5ndGg6IGZ1bmN0aW9uICggc2FtcGxpbmdDb2VmICkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlNwbGluZTogLnJlcGFyYW1ldHJpemVCeUFyY0xlbmd0aCgpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdH1cblxufSApO1xuXG4vL1xuZnVuY3Rpb24gQm91bmRpbmdCb3hIZWxwZXIoIG9iamVjdCwgY29sb3IgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuQm91bmRpbmdCb3hIZWxwZXIgaGFzIGJlZW4gZGVwcmVjYXRlZC4gQ3JlYXRpbmcgYSBUSFJFRS5Cb3hIZWxwZXIgaW5zdGVhZC4nICk7XG5cdHJldHVybiBuZXcgQm94SGVscGVyKCBvYmplY3QsIGNvbG9yICk7XG5cbn1cblxuZnVuY3Rpb24gRWRnZXNIZWxwZXIoIG9iamVjdCwgaGV4ICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLkVkZ2VzSGVscGVyIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBUSFJFRS5FZGdlc0dlb21ldHJ5IGluc3RlYWQuJyApO1xuXHRyZXR1cm4gbmV3IExpbmVTZWdtZW50cyggbmV3IEVkZ2VzR2VvbWV0cnkoIG9iamVjdC5nZW9tZXRyeSApLCBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IGhleCAhPT0gdW5kZWZpbmVkID8gaGV4IDogMHhmZmZmZmYgfSApICk7XG5cbn1cblxuR3JpZEhlbHBlci5wcm90b3R5cGUuc2V0Q29sb3JzID0gZnVuY3Rpb24gKCkge1xuXG5cdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5HcmlkSGVscGVyOiBzZXRDb2xvcnMoKSBoYXMgYmVlbiBkZXByZWNhdGVkLCBwYXNzIHRoZW0gaW4gdGhlIGNvbnN0cnVjdG9yIGluc3RlYWQuJyApO1xuXG59O1xuXG5mdW5jdGlvbiBXaXJlZnJhbWVIZWxwZXIoIG9iamVjdCwgaGV4ICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLldpcmVmcmFtZUhlbHBlciBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuV2lyZWZyYW1lR2VvbWV0cnkgaW5zdGVhZC4nICk7XG5cdHJldHVybiBuZXcgTGluZVNlZ21lbnRzKCBuZXcgV2lyZWZyYW1lR2VvbWV0cnkoIG9iamVjdC5nZW9tZXRyeSApLCBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IGhleCAhPT0gdW5kZWZpbmVkID8gaGV4IDogMHhmZmZmZmYgfSApICk7XG5cbn1cblxuLy9cblxuZnVuY3Rpb24gWEhSTG9hZGVyKCBtYW5hZ2VyICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLlhIUkxvYWRlciBoYXMgYmVlbiByZW5hbWVkIHRvIFRIUkVFLkZpbGVMb2FkZXIuJyApO1xuXHRyZXR1cm4gbmV3IEZpbGVMb2FkZXIoIG1hbmFnZXIgKTtcblxufVxuXG5mdW5jdGlvbiBCaW5hcnlUZXh0dXJlTG9hZGVyKCBtYW5hZ2VyICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLkJpbmFyeVRleHR1cmVMb2FkZXIgaGFzIGJlZW4gcmVuYW1lZCB0byBUSFJFRS5EYXRhVGV4dHVyZUxvYWRlci4nICk7XG5cdHJldHVybiBuZXcgRGF0YVRleHR1cmVMb2FkZXIoIG1hbmFnZXIgKTtcblxufVxuXG4vL1xuXG5PYmplY3QuYXNzaWduKCBCb3gyLnByb3RvdHlwZSwge1xuXG5cdGNlbnRlcjogZnVuY3Rpb24gKCBvcHRpb25hbFRhcmdldCApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJveDI6IC5jZW50ZXIoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRDZW50ZXIoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0Q2VudGVyKCBvcHRpb25hbFRhcmdldCApO1xuXG5cdH0sXG5cdGVtcHR5OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Cb3gyOiAuZW1wdHkoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pc0VtcHR5KCkuJyApO1xuXHRcdHJldHVybiB0aGlzLmlzRW1wdHkoKTtcblxuXHR9LFxuXHRpc0ludGVyc2VjdGlvbkJveDogZnVuY3Rpb24gKCBib3ggKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Cb3gyOiAuaXNJbnRlcnNlY3Rpb25Cb3goKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pbnRlcnNlY3RzQm94KCkuJyApO1xuXHRcdHJldHVybiB0aGlzLmludGVyc2VjdHNCb3goIGJveCApO1xuXG5cdH0sXG5cdHNpemU6IGZ1bmN0aW9uICggb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Cb3gyOiAuc2l6ZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldFNpemUoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0U2l6ZSggb3B0aW9uYWxUYXJnZXQgKTtcblxuXHR9XG59ICk7XG5cbk9iamVjdC5hc3NpZ24oIEJveDMucHJvdG90eXBlLCB7XG5cblx0Y2VudGVyOiBmdW5jdGlvbiAoIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQm94MzogLmNlbnRlcigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldENlbnRlcigpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5nZXRDZW50ZXIoIG9wdGlvbmFsVGFyZ2V0ICk7XG5cblx0fSxcblx0ZW1wdHk6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJveDM6IC5lbXB0eSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmlzRW1wdHkoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuaXNFbXB0eSgpO1xuXG5cdH0sXG5cdGlzSW50ZXJzZWN0aW9uQm94OiBmdW5jdGlvbiAoIGJveCApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJveDM6IC5pc0ludGVyc2VjdGlvbkJveCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmludGVyc2VjdHNCb3goKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuaW50ZXJzZWN0c0JveCggYm94ICk7XG5cblx0fSxcblx0aXNJbnRlcnNlY3Rpb25TcGhlcmU6IGZ1bmN0aW9uICggc3BoZXJlICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQm94MzogLmlzSW50ZXJzZWN0aW9uU3BoZXJlKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaW50ZXJzZWN0c1NwaGVyZSgpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5pbnRlcnNlY3RzU3BoZXJlKCBzcGhlcmUgKTtcblxuXHR9LFxuXHRzaXplOiBmdW5jdGlvbiAoIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQm94MzogLnNpemUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRTaXplKCkuJyApO1xuXHRcdHJldHVybiB0aGlzLmdldFNpemUoIG9wdGlvbmFsVGFyZ2V0ICk7XG5cblx0fVxufSApO1xuXG5MaW5lMy5wcm90b3R5cGUuY2VudGVyID0gZnVuY3Rpb24gKCBvcHRpb25hbFRhcmdldCApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5MaW5lMzogLmNlbnRlcigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldENlbnRlcigpLicgKTtcblx0cmV0dXJuIHRoaXMuZ2V0Q2VudGVyKCBvcHRpb25hbFRhcmdldCApO1xuXG59O1xuXG5fTWF0aC5yYW5kb20xNiA9IGZ1bmN0aW9uICgpIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5NYXRoLnJhbmRvbTE2KCkgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIE1hdGgucmFuZG9tKCkgaW5zdGVhZC4nICk7XG5cdHJldHVybiBNYXRoLnJhbmRvbSgpO1xuXG59O1xuXG5PYmplY3QuYXNzaWduKCBNYXRyaXgzLnByb3RvdHlwZSwge1xuXG5cdGZsYXR0ZW5Ub0FycmF5T2Zmc2V0OiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oIFwiVEhSRUUuTWF0cml4MzogLmZsYXR0ZW5Ub0FycmF5T2Zmc2V0KCkgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIC50b0FycmF5KCkgaW5zdGVhZC5cIiApO1xuXHRcdHJldHVybiB0aGlzLnRvQXJyYXkoIGFycmF5LCBvZmZzZXQgKTtcblxuXHR9LFxuXHRtdWx0aXBseVZlY3RvcjM6IGZ1bmN0aW9uICggdmVjdG9yICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0cml4MzogLm11bHRpcGx5VmVjdG9yMygpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSB2ZWN0b3IuYXBwbHlNYXRyaXgzKCBtYXRyaXggKSBpbnN0ZWFkLicgKTtcblx0XHRyZXR1cm4gdmVjdG9yLmFwcGx5TWF0cml4MyggdGhpcyApO1xuXG5cdH0sXG5cdG11bHRpcGx5VmVjdG9yM0FycmF5OiBmdW5jdGlvbiAoIGEgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5NYXRyaXgzOiAubXVsdGlwbHlWZWN0b3IzQXJyYXkoKSBoYXMgYmVlbiByZW5hbWVkLiBVc2UgbWF0cml4LmFwcGx5VG9WZWN0b3IzQXJyYXkoIGFycmF5ICkgaW5zdGVhZC4nICk7XG5cdFx0cmV0dXJuIHRoaXMuYXBwbHlUb1ZlY3RvcjNBcnJheSggYSApO1xuXG5cdH0sXG5cdGFwcGx5VG9CdWZmZXI6IGZ1bmN0aW9uKCBidWZmZXIsIG9mZnNldCwgbGVuZ3RoICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0cml4MzogLmFwcGx5VG9CdWZmZXIoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbWF0cml4LmFwcGx5VG9CdWZmZXJBdHRyaWJ1dGUoIGF0dHJpYnV0ZSApIGluc3RlYWQuJyApO1xuXHRcdHJldHVybiB0aGlzLmFwcGx5VG9CdWZmZXJBdHRyaWJ1dGUoIGJ1ZmZlciApO1xuXG5cdH0sXG5cdGFwcGx5VG9WZWN0b3IzQXJyYXk6IGZ1bmN0aW9uKCBhcnJheSwgb2Zmc2V0LCBsZW5ndGggKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuTWF0cml4MzogLmFwcGx5VG9WZWN0b3IzQXJyYXkoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmFzc2lnbiggTWF0cml4NC5wcm90b3R5cGUsIHtcblxuXHRleHRyYWN0UG9zaXRpb246IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDQ6IC5leHRyYWN0UG9zaXRpb24oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5jb3B5UG9zaXRpb24oKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuY29weVBvc2l0aW9uKCBtICk7XG5cblx0fSxcblx0ZmxhdHRlblRvQXJyYXlPZmZzZXQ6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCApIHtcblxuXHRcdGNvbnNvbGUud2FybiggXCJUSFJFRS5NYXRyaXg0OiAuZmxhdHRlblRvQXJyYXlPZmZzZXQoKSBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgLnRvQXJyYXkoKSBpbnN0ZWFkLlwiICk7XG5cdFx0cmV0dXJuIHRoaXMudG9BcnJheSggYXJyYXksIG9mZnNldCApO1xuXG5cdH0sXG5cdGdldFBvc2l0aW9uOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR2YXIgdjE7XG5cblx0XHRyZXR1cm4gZnVuY3Rpb24gZ2V0UG9zaXRpb24oKSB7XG5cblx0XHRcdGlmICggdjEgPT09IHVuZGVmaW5lZCApIHYxID0gbmV3IFZlY3RvcjMoKTtcblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDQ6IC5nZXRQb3NpdGlvbigpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBWZWN0b3IzLnNldEZyb21NYXRyaXhQb3NpdGlvbiggbWF0cml4ICkgaW5zdGVhZC4nICk7XG5cdFx0XHRyZXR1cm4gdjEuc2V0RnJvbU1hdHJpeENvbHVtbiggdGhpcywgMyApO1xuXG5cdFx0fTtcblxuXHR9KCksXG5cdHNldFJvdGF0aW9uRnJvbVF1YXRlcm5pb246IGZ1bmN0aW9uICggcSApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDQ6IC5zZXRSb3RhdGlvbkZyb21RdWF0ZXJuaW9uKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAubWFrZVJvdGF0aW9uRnJvbVF1YXRlcm5pb24oKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMubWFrZVJvdGF0aW9uRnJvbVF1YXRlcm5pb24oIHEgKTtcblxuXHR9LFxuXHRtdWx0aXBseVRvQXJyYXk6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDQ6IC5tdWx0aXBseVRvQXJyYXkoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9LFxuXHRtdWx0aXBseVZlY3RvcjM6IGZ1bmN0aW9uICggdmVjdG9yICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0cml4NDogLm11bHRpcGx5VmVjdG9yMygpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSB2ZWN0b3IuYXBwbHlNYXRyaXg0KCBtYXRyaXggKSBpbnN0ZWFkLicgKTtcblx0XHRyZXR1cm4gdmVjdG9yLmFwcGx5TWF0cml4NCggdGhpcyApO1xuXG5cdH0sXG5cdG11bHRpcGx5VmVjdG9yNDogZnVuY3Rpb24gKCB2ZWN0b3IgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5NYXRyaXg0OiAubXVsdGlwbHlWZWN0b3I0KCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIHZlY3Rvci5hcHBseU1hdHJpeDQoIG1hdHJpeCApIGluc3RlYWQuJyApO1xuXHRcdHJldHVybiB2ZWN0b3IuYXBwbHlNYXRyaXg0KCB0aGlzICk7XG5cblx0fSxcblx0bXVsdGlwbHlWZWN0b3IzQXJyYXk6IGZ1bmN0aW9uICggYSApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDQ6IC5tdWx0aXBseVZlY3RvcjNBcnJheSgpIGhhcyBiZWVuIHJlbmFtZWQuIFVzZSBtYXRyaXguYXBwbHlUb1ZlY3RvcjNBcnJheSggYXJyYXkgKSBpbnN0ZWFkLicgKTtcblx0XHRyZXR1cm4gdGhpcy5hcHBseVRvVmVjdG9yM0FycmF5KCBhICk7XG5cblx0fSxcblx0cm90YXRlQXhpczogZnVuY3Rpb24gKCB2ICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0cml4NDogLnJvdGF0ZUF4aXMoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVmVjdG9yMy50cmFuc2Zvcm1EaXJlY3Rpb24oIG1hdHJpeCApIGluc3RlYWQuJyApO1xuXHRcdHYudHJhbnNmb3JtRGlyZWN0aW9uKCB0aGlzICk7XG5cblx0fSxcblx0Y3Jvc3NWZWN0b3I6IGZ1bmN0aW9uICggdmVjdG9yICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0cml4NDogLmNyb3NzVmVjdG9yKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIHZlY3Rvci5hcHBseU1hdHJpeDQoIG1hdHJpeCApIGluc3RlYWQuJyApO1xuXHRcdHJldHVybiB2ZWN0b3IuYXBwbHlNYXRyaXg0KCB0aGlzICk7XG5cblx0fSxcblx0dHJhbnNsYXRlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuTWF0cml4NDogLnRyYW5zbGF0ZSgpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdH0sXG5cdHJvdGF0ZVg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5NYXRyaXg0OiAucm90YXRlWCgpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdH0sXG5cdHJvdGF0ZVk6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5NYXRyaXg0OiAucm90YXRlWSgpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdH0sXG5cdHJvdGF0ZVo6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5NYXRyaXg0OiAucm90YXRlWigpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdH0sXG5cdHJvdGF0ZUJ5QXhpczogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLk1hdHJpeDQ6IC5yb3RhdGVCeUF4aXMoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9LFxuXHRhcHBseVRvQnVmZmVyOiBmdW5jdGlvbiggYnVmZmVyLCBvZmZzZXQsIGxlbmd0aCApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDQ6IC5hcHBseVRvQnVmZmVyKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG1hdHJpeC5hcHBseVRvQnVmZmVyQXR0cmlidXRlKCBhdHRyaWJ1dGUgKSBpbnN0ZWFkLicgKTtcblx0XHRyZXR1cm4gdGhpcy5hcHBseVRvQnVmZmVyQXR0cmlidXRlKCBidWZmZXIgKTtcblxuXHR9LFxuXHRhcHBseVRvVmVjdG9yM0FycmF5OiBmdW5jdGlvbiggYXJyYXksIG9mZnNldCwgbGVuZ3RoICkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLk1hdHJpeDQ6IC5hcHBseVRvVmVjdG9yM0FycmF5KCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fSxcblx0bWFrZUZydXN0dW06IGZ1bmN0aW9uKCBsZWZ0LCByaWdodCwgYm90dG9tLCB0b3AsIG5lYXIsIGZhciApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDQ6IC5tYWtlRnJ1c3R1bSgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSAubWFrZVBlcnNwZWN0aXZlKCBsZWZ0LCByaWdodCwgdG9wLCBib3R0b20sIG5lYXIsIGZhciApIGluc3RlYWQuJyApO1xuXHRcdHJldHVybiB0aGlzLm1ha2VQZXJzcGVjdGl2ZSggbGVmdCwgcmlnaHQsIHRvcCwgYm90dG9tLCBuZWFyLCBmYXIgKTtcblxuXHR9XG5cbn0gKTtcblxuUGxhbmUucHJvdG90eXBlLmlzSW50ZXJzZWN0aW9uTGluZSA9IGZ1bmN0aW9uICggbGluZSApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5QbGFuZTogLmlzSW50ZXJzZWN0aW9uTGluZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmludGVyc2VjdHNMaW5lKCkuJyApO1xuXHRyZXR1cm4gdGhpcy5pbnRlcnNlY3RzTGluZSggbGluZSApO1xuXG59O1xuXG5RdWF0ZXJuaW9uLnByb3RvdHlwZS5tdWx0aXBseVZlY3RvcjMgPSBmdW5jdGlvbiAoIHZlY3RvciApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5RdWF0ZXJuaW9uOiAubXVsdGlwbHlWZWN0b3IzKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIGlzIG5vdyB2ZWN0b3IuYXBwbHlRdWF0ZXJuaW9uKCBxdWF0ZXJuaW9uICkgaW5zdGVhZC4nICk7XG5cdHJldHVybiB2ZWN0b3IuYXBwbHlRdWF0ZXJuaW9uKCB0aGlzICk7XG5cbn07XG5cbk9iamVjdC5hc3NpZ24oIFJheS5wcm90b3R5cGUsIHtcblxuXHRpc0ludGVyc2VjdGlvbkJveDogZnVuY3Rpb24gKCBib3ggKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5SYXk6IC5pc0ludGVyc2VjdGlvbkJveCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmludGVyc2VjdHNCb3goKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuaW50ZXJzZWN0c0JveCggYm94ICk7XG5cblx0fSxcblx0aXNJbnRlcnNlY3Rpb25QbGFuZTogZnVuY3Rpb24gKCBwbGFuZSApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlJheTogLmlzSW50ZXJzZWN0aW9uUGxhbmUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pbnRlcnNlY3RzUGxhbmUoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuaW50ZXJzZWN0c1BsYW5lKCBwbGFuZSApO1xuXG5cdH0sXG5cdGlzSW50ZXJzZWN0aW9uU3BoZXJlOiBmdW5jdGlvbiAoIHNwaGVyZSApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlJheTogLmlzSW50ZXJzZWN0aW9uU3BoZXJlKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaW50ZXJzZWN0c1NwaGVyZSgpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5pbnRlcnNlY3RzU3BoZXJlKCBzcGhlcmUgKTtcblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmFzc2lnbiggU2hhcGUucHJvdG90eXBlLCB7XG5cblx0ZXh0cnVkZTogZnVuY3Rpb24gKCBvcHRpb25zICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuU2hhcGU6IC5leHRydWRlKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIEV4dHJ1ZGVHZW9tZXRyeSgpIGluc3RlYWQuJyApO1xuXHRcdHJldHVybiBuZXcgRXh0cnVkZUdlb21ldHJ5KCB0aGlzLCBvcHRpb25zICk7XG5cblx0fSxcblx0bWFrZUdlb21ldHJ5OiBmdW5jdGlvbiAoIG9wdGlvbnMgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5TaGFwZTogLm1ha2VHZW9tZXRyeSgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBTaGFwZUdlb21ldHJ5KCkgaW5zdGVhZC4nICk7XG5cdFx0cmV0dXJuIG5ldyBTaGFwZUdlb21ldHJ5KCB0aGlzLCBvcHRpb25zICk7XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5hc3NpZ24oIFZlY3RvcjIucHJvdG90eXBlLCB7XG5cblx0ZnJvbUF0dHJpYnV0ZTogZnVuY3Rpb24gKCBhdHRyaWJ1dGUsIGluZGV4LCBvZmZzZXQgKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuVmVjdG9yMjogLmZyb21BdHRyaWJ1dGUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5mcm9tQnVmZmVyQXR0cmlidXRlKCkuJyApO1xuXHRcdHJldHVybiB0aGlzLmZyb21CdWZmZXJBdHRyaWJ1dGUoIGF0dHJpYnV0ZSwgaW5kZXgsIG9mZnNldCApO1xuXG5cdH1cblxufSApO1xuXG5PYmplY3QuYXNzaWduKCBWZWN0b3IzLnByb3RvdHlwZSwge1xuXG5cdHNldEV1bGVyRnJvbVJvdGF0aW9uTWF0cml4OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuVmVjdG9yMzogLnNldEV1bGVyRnJvbVJvdGF0aW9uTWF0cml4KCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIEV1bGVyLnNldEZyb21Sb3RhdGlvbk1hdHJpeCgpIGluc3RlYWQuJyApO1xuXG5cdH0sXG5cdHNldEV1bGVyRnJvbVF1YXRlcm5pb246IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5WZWN0b3IzOiAuc2V0RXVsZXJGcm9tUXVhdGVybmlvbigpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBFdWxlci5zZXRGcm9tUXVhdGVybmlvbigpIGluc3RlYWQuJyApO1xuXG5cdH0sXG5cdGdldFBvc2l0aW9uRnJvbU1hdHJpeDogZnVuY3Rpb24gKCBtICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yMzogLmdldFBvc2l0aW9uRnJvbU1hdHJpeCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLnNldEZyb21NYXRyaXhQb3NpdGlvbigpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5zZXRGcm9tTWF0cml4UG9zaXRpb24oIG0gKTtcblxuXHR9LFxuXHRnZXRTY2FsZUZyb21NYXRyaXg6IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjM6IC5nZXRTY2FsZUZyb21NYXRyaXgoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5zZXRGcm9tTWF0cml4U2NhbGUoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuc2V0RnJvbU1hdHJpeFNjYWxlKCBtICk7XG5cblx0fSxcblx0Z2V0Q29sdW1uRnJvbU1hdHJpeDogZnVuY3Rpb24gKCBpbmRleCwgbWF0cml4ICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yMzogLmdldENvbHVtbkZyb21NYXRyaXgoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5zZXRGcm9tTWF0cml4Q29sdW1uKCkuJyApO1xuXHRcdHJldHVybiB0aGlzLnNldEZyb21NYXRyaXhDb2x1bW4oIG1hdHJpeCwgaW5kZXggKTtcblxuXHR9LFxuXHRhcHBseVByb2plY3Rpb246IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjM6IC5hcHBseVByb2plY3Rpb24oKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgLmFwcGx5TWF0cml4NCggbSApIGluc3RlYWQuJyApO1xuXHRcdHJldHVybiB0aGlzLmFwcGx5TWF0cml4NCggbSApO1xuXG5cdH0sXG5cdGZyb21BdHRyaWJ1dGU6IGZ1bmN0aW9uICggYXR0cmlidXRlLCBpbmRleCwgb2Zmc2V0ICkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlZlY3RvcjM6IC5mcm9tQXR0cmlidXRlKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZnJvbUJ1ZmZlckF0dHJpYnV0ZSgpLicgKTtcblx0XHRyZXR1cm4gdGhpcy5mcm9tQnVmZmVyQXR0cmlidXRlKCBhdHRyaWJ1dGUsIGluZGV4LCBvZmZzZXQgKTtcblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmFzc2lnbiggVmVjdG9yNC5wcm90b3R5cGUsIHtcblxuXHRmcm9tQXR0cmlidXRlOiBmdW5jdGlvbiAoIGF0dHJpYnV0ZSwgaW5kZXgsIG9mZnNldCApIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5WZWN0b3I0OiAuZnJvbUF0dHJpYnV0ZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmZyb21CdWZmZXJBdHRyaWJ1dGUoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggYXR0cmlidXRlLCBpbmRleCwgb2Zmc2V0ICk7XG5cblx0fVxuXG59ICk7XG5cbi8vXG5cbkdlb21ldHJ5LnByb3RvdHlwZS5jb21wdXRlVGFuZ2VudHMgPSBmdW5jdGlvbiAoKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuR2VvbWV0cnk6IC5jb21wdXRlVGFuZ2VudHMoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxufTtcblxuT2JqZWN0LmFzc2lnbiggT2JqZWN0M0QucHJvdG90eXBlLCB7XG5cblx0Z2V0Q2hpbGRCeU5hbWU6IGZ1bmN0aW9uICggbmFtZSApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdDNEOiAuZ2V0Q2hpbGRCeU5hbWUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRPYmplY3RCeU5hbWUoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0T2JqZWN0QnlOYW1lKCBuYW1lICk7XG5cblx0fSxcblx0cmVuZGVyRGVwdGg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdDNEOiAucmVuZGVyRGVwdGggaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIC5yZW5kZXJPcmRlciwgaW5zdGVhZC4nICk7XG5cblx0fSxcblx0dHJhbnNsYXRlOiBmdW5jdGlvbiAoIGRpc3RhbmNlLCBheGlzICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0M0Q6IC50cmFuc2xhdGUoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgLnRyYW5zbGF0ZU9uQXhpcyggYXhpcywgZGlzdGFuY2UgKSBpbnN0ZWFkLicgKTtcblx0XHRyZXR1cm4gdGhpcy50cmFuc2xhdGVPbkF4aXMoIGF4aXMsIGRpc3RhbmNlICk7XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBPYmplY3QzRC5wcm90b3R5cGUsIHtcblxuXHRldWxlck9yZGVyOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdDNEOiAuZXVsZXJPcmRlciBpcyBub3cgLnJvdGF0aW9uLm9yZGVyLicgKTtcblx0XHRcdHJldHVybiB0aGlzLnJvdGF0aW9uLm9yZGVyO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdDNEOiAuZXVsZXJPcmRlciBpcyBub3cgLnJvdGF0aW9uLm9yZGVyLicgKTtcblx0XHRcdHRoaXMucm90YXRpb24ub3JkZXIgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0dXNlUXVhdGVybmlvbjoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3QzRDogLnVzZVF1YXRlcm5pb24gaGFzIGJlZW4gcmVtb3ZlZC4gVGhlIGxpYnJhcnkgbm93IHVzZXMgcXVhdGVybmlvbnMgYnkgZGVmYXVsdC4nICk7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3QzRDogLnVzZVF1YXRlcm5pb24gaGFzIGJlZW4gcmVtb3ZlZC4gVGhlIGxpYnJhcnkgbm93IHVzZXMgcXVhdGVybmlvbnMgYnkgZGVmYXVsdC4nICk7XG5cblx0XHR9XG5cdH1cblxufSApO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyggTE9ELnByb3RvdHlwZSwge1xuXG5cdG9iamVjdHM6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTE9EOiAub2JqZWN0cyBoYXMgYmVlbiByZW5hbWVkIHRvIC5sZXZlbHMuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMubGV2ZWxzO1xuXG5cdFx0fVxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KCBTa2VsZXRvbi5wcm90b3R5cGUsICd1c2VWZXJ0ZXhUZXh0dXJlJywge1xuXG5cdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuU2tlbGV0b246IHVzZVZlcnRleFRleHR1cmUgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fSxcblx0c2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Ta2VsZXRvbjogdXNlVmVydGV4VGV4dHVyZSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KCBDdXJ2ZS5wcm90b3R5cGUsICdfX2FyY0xlbmd0aERpdmlzaW9ucycsIHtcblxuXHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkN1cnZlOiAuX19hcmNMZW5ndGhEaXZpc2lvbnMgaXMgbm93IC5hcmNMZW5ndGhEaXZpc2lvbnMuJyApO1xuXHRcdHJldHVybiB0aGlzLmFyY0xlbmd0aERpdmlzaW9ucztcblxuXHR9LFxuXHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5DdXJ2ZTogLl9fYXJjTGVuZ3RoRGl2aXNpb25zIGlzIG5vdyAuYXJjTGVuZ3RoRGl2aXNpb25zLicgKTtcblx0XHR0aGlzLmFyY0xlbmd0aERpdmlzaW9ucyA9IHZhbHVlO1xuXG5cdH1cblxufSApO1xuXG4vL1xuXG5QZXJzcGVjdGl2ZUNhbWVyYS5wcm90b3R5cGUuc2V0TGVucyA9IGZ1bmN0aW9uICggZm9jYWxMZW5ndGgsIGZpbG1HYXVnZSApIHtcblxuXHRjb25zb2xlLndhcm4oIFwiVEhSRUUuUGVyc3BlY3RpdmVDYW1lcmEuc2V0TGVucyBpcyBkZXByZWNhdGVkLiBcIiArXG5cdFx0XHRcIlVzZSAuc2V0Rm9jYWxMZW5ndGggYW5kIC5maWxtR2F1Z2UgZm9yIGEgcGhvdG9ncmFwaGljIHNldHVwLlwiICk7XG5cblx0aWYgKCBmaWxtR2F1Z2UgIT09IHVuZGVmaW5lZCApIHRoaXMuZmlsbUdhdWdlID0gZmlsbUdhdWdlO1xuXHR0aGlzLnNldEZvY2FsTGVuZ3RoKCBmb2NhbExlbmd0aCApO1xuXG59O1xuXG4vL1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyggTGlnaHQucHJvdG90eXBlLCB7XG5cdG9ubHlTaGFkb3c6IHtcblx0XHRzZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGlnaHQ6IC5vbmx5U2hhZG93IGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdFx0fVxuXHR9LFxuXHRzaGFkb3dDYW1lcmFGb3Y6IHtcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxpZ2h0OiAuc2hhZG93Q2FtZXJhRm92IGlzIG5vdyAuc2hhZG93LmNhbWVyYS5mb3YuJyApO1xuXHRcdFx0dGhpcy5zaGFkb3cuY2FtZXJhLmZvdiA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9LFxuXHRzaGFkb3dDYW1lcmFMZWZ0OiB7XG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5MaWdodDogLnNoYWRvd0NhbWVyYUxlZnQgaXMgbm93IC5zaGFkb3cuY2FtZXJhLmxlZnQuJyApO1xuXHRcdFx0dGhpcy5zaGFkb3cuY2FtZXJhLmxlZnQgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0c2hhZG93Q2FtZXJhUmlnaHQ6IHtcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxpZ2h0OiAuc2hhZG93Q2FtZXJhUmlnaHQgaXMgbm93IC5zaGFkb3cuY2FtZXJhLnJpZ2h0LicgKTtcblx0XHRcdHRoaXMuc2hhZG93LmNhbWVyYS5yaWdodCA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9LFxuXHRzaGFkb3dDYW1lcmFUb3A6IHtcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxpZ2h0OiAuc2hhZG93Q2FtZXJhVG9wIGlzIG5vdyAuc2hhZG93LmNhbWVyYS50b3AuJyApO1xuXHRcdFx0dGhpcy5zaGFkb3cuY2FtZXJhLnRvcCA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9LFxuXHRzaGFkb3dDYW1lcmFCb3R0b206IHtcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxpZ2h0OiAuc2hhZG93Q2FtZXJhQm90dG9tIGlzIG5vdyAuc2hhZG93LmNhbWVyYS5ib3R0b20uJyApO1xuXHRcdFx0dGhpcy5zaGFkb3cuY2FtZXJhLmJvdHRvbSA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9LFxuXHRzaGFkb3dDYW1lcmFOZWFyOiB7XG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5MaWdodDogLnNoYWRvd0NhbWVyYU5lYXIgaXMgbm93IC5zaGFkb3cuY2FtZXJhLm5lYXIuJyApO1xuXHRcdFx0dGhpcy5zaGFkb3cuY2FtZXJhLm5lYXIgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0c2hhZG93Q2FtZXJhRmFyOiB7XG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5MaWdodDogLnNoYWRvd0NhbWVyYUZhciBpcyBub3cgLnNoYWRvdy5jYW1lcmEuZmFyLicgKTtcblx0XHRcdHRoaXMuc2hhZG93LmNhbWVyYS5mYXIgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0c2hhZG93Q2FtZXJhVmlzaWJsZToge1xuXHRcdHNldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5MaWdodDogLnNoYWRvd0NhbWVyYVZpc2libGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5DYW1lcmFIZWxwZXIoIGxpZ2h0LnNoYWRvdy5jYW1lcmEgKSBpbnN0ZWFkLicgKTtcblxuXHRcdH1cblx0fSxcblx0c2hhZG93Qmlhczoge1xuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGlnaHQ6IC5zaGFkb3dCaWFzIGlzIG5vdyAuc2hhZG93LmJpYXMuJyApO1xuXHRcdFx0dGhpcy5zaGFkb3cuYmlhcyA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9LFxuXHRzaGFkb3dEYXJrbmVzczoge1xuXHRcdHNldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5MaWdodDogLnNoYWRvd0RhcmtuZXNzIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdFx0fVxuXHR9LFxuXHRzaGFkb3dNYXBXaWR0aDoge1xuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGlnaHQ6IC5zaGFkb3dNYXBXaWR0aCBpcyBub3cgLnNoYWRvdy5tYXBTaXplLndpZHRoLicgKTtcblx0XHRcdHRoaXMuc2hhZG93Lm1hcFNpemUud2lkdGggPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0c2hhZG93TWFwSGVpZ2h0OiB7XG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5MaWdodDogLnNoYWRvd01hcEhlaWdodCBpcyBub3cgLnNoYWRvdy5tYXBTaXplLmhlaWdodC4nICk7XG5cdFx0XHR0aGlzLnNoYWRvdy5tYXBTaXplLmhlaWdodCA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9XG59ICk7XG5cbi8vXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLCB7XG5cblx0bGVuZ3RoOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckF0dHJpYnV0ZTogLmxlbmd0aCBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgLmNvdW50IGluc3RlYWQuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMuYXJyYXkubGVuZ3RoO1xuXG5cdFx0fVxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmFzc2lnbiggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLCB7XG5cblx0YWRkSW5kZXg6IGZ1bmN0aW9uICggaW5kZXggKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmFkZEluZGV4KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuc2V0SW5kZXgoKS4nICk7XG5cdFx0dGhpcy5zZXRJbmRleCggaW5kZXggKTtcblxuXHR9LFxuXHRhZGREcmF3Q2FsbDogZnVuY3Rpb24gKCBzdGFydCwgY291bnQsIGluZGV4T2Zmc2V0ICkge1xuXG5cdFx0aWYgKCBpbmRleE9mZnNldCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmFkZERyYXdDYWxsKCkgbm8gbG9uZ2VyIHN1cHBvcnRzIGluZGV4T2Zmc2V0LicgKTtcblxuXHRcdH1cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmFkZERyYXdDYWxsKCkgaXMgbm93IC5hZGRHcm91cCgpLicgKTtcblx0XHR0aGlzLmFkZEdyb3VwKCBzdGFydCwgY291bnQgKTtcblxuXHR9LFxuXHRjbGVhckRyYXdDYWxsczogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5jbGVhckRyYXdDYWxscygpIGlzIG5vdyAuY2xlYXJHcm91cHMoKS4nICk7XG5cdFx0dGhpcy5jbGVhckdyb3VwcygpO1xuXG5cdH0sXG5cdGNvbXB1dGVUYW5nZW50czogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5jb21wdXRlVGFuZ2VudHMoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHR9LFxuXHRjb21wdXRlT2Zmc2V0czogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5jb21wdXRlT2Zmc2V0cygpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdH1cblxufSApO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLCB7XG5cblx0ZHJhd2NhbGxzOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmRyYXdjYWxscyBoYXMgYmVlbiByZW5hbWVkIHRvIC5ncm91cHMuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMuZ3JvdXBzO1xuXG5cdFx0fVxuXHR9LFxuXHRvZmZzZXRzOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5OiAub2Zmc2V0cyBoYXMgYmVlbiByZW5hbWVkIHRvIC5ncm91cHMuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMuZ3JvdXBzO1xuXG5cdFx0fVxuXHR9XG5cbn0gKTtcblxuLy9cblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIFVuaWZvcm0ucHJvdG90eXBlLCB7XG5cblx0ZHluYW1pYzoge1xuXHRcdHNldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Vbmlmb3JtOiAuZHluYW1pYyBoYXMgYmVlbiByZW1vdmVkLiBVc2Ugb2JqZWN0Lm9uQmVmb3JlUmVuZGVyKCkgaW5zdGVhZC4nICk7XG5cblx0XHR9XG5cdH0sXG5cdG9uVXBkYXRlOiB7XG5cdFx0dmFsdWU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVW5pZm9ybTogLm9uVXBkYXRlKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG9iamVjdC5vbkJlZm9yZVJlbmRlcigpIGluc3RlYWQuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9XG5cdH1cblxufSApO1xuXG4vL1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyggTWF0ZXJpYWwucHJvdG90eXBlLCB7XG5cblx0d3JhcEFyb3VuZDoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5NYXRlcmlhbDogLndyYXBBcm91bmQgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5NYXRlcmlhbDogLndyYXBBcm91bmQgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0XHR9XG5cdH0sXG5cdHdyYXBSR0I6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0ZXJpYWw6IC53cmFwUkdCIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXHRcdFx0cmV0dXJuIG5ldyBDb2xvcigpO1xuXG5cdFx0fVxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIE1lc2hQaG9uZ01hdGVyaWFsLnByb3RvdHlwZSwge1xuXG5cdG1ldGFsOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1lc2hQaG9uZ01hdGVyaWFsOiAubWV0YWwgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFRIUkVFLk1lc2hTdGFuZGFyZE1hdGVyaWFsIGluc3RlYWQuJyApO1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWVzaFBob25nTWF0ZXJpYWw6IC5tZXRhbCBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWwgaW5zdGVhZCcgKTtcblxuXHRcdH1cblx0fVxuXG59ICk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBTaGFkZXJNYXRlcmlhbC5wcm90b3R5cGUsIHtcblxuXHRkZXJpdmF0aXZlczoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5TaGFkZXJNYXRlcmlhbDogLmRlcml2YXRpdmVzIGhhcyBiZWVuIG1vdmVkIHRvIC5leHRlbnNpb25zLmRlcml2YXRpdmVzLicgKTtcblx0XHRcdHJldHVybiB0aGlzLmV4dGVuc2lvbnMuZGVyaXZhdGl2ZXM7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuIFNoYWRlck1hdGVyaWFsOiAuZGVyaXZhdGl2ZXMgaGFzIGJlZW4gbW92ZWQgdG8gLmV4dGVuc2lvbnMuZGVyaXZhdGl2ZXMuJyApO1xuXHRcdFx0dGhpcy5leHRlbnNpb25zLmRlcml2YXRpdmVzID0gdmFsdWU7XG5cblx0XHR9XG5cdH1cblxufSApO1xuXG4vL1xuXG5PYmplY3QuYXNzaWduKCBXZWJHTFJlbmRlcmVyLnByb3RvdHlwZSwge1xuXG5cdGdldEN1cnJlbnRSZW5kZXJUYXJnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5nZXRDdXJyZW50UmVuZGVyVGFyZ2V0KCkgaXMgbm93IC5nZXRSZW5kZXJUYXJnZXQoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0UmVuZGVyVGFyZ2V0KCk7XG5cblx0fSxcblxuXHRzdXBwb3J0c0Zsb2F0VGV4dHVyZXM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5zdXBwb3J0c0Zsb2F0VGV4dHVyZXMoKSBpcyBub3cgLmV4dGVuc2lvbnMuZ2V0KCBcXCdPRVNfdGV4dHVyZV9mbG9hdFxcJyApLicgKTtcblx0XHRyZXR1cm4gdGhpcy5leHRlbnNpb25zLmdldCggJ09FU190ZXh0dXJlX2Zsb2F0JyApO1xuXG5cdH0sXG5cdHN1cHBvcnRzSGFsZkZsb2F0VGV4dHVyZXM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5zdXBwb3J0c0hhbGZGbG9hdFRleHR1cmVzKCkgaXMgbm93IC5leHRlbnNpb25zLmdldCggXFwnT0VTX3RleHR1cmVfaGFsZl9mbG9hdFxcJyApLicgKTtcblx0XHRyZXR1cm4gdGhpcy5leHRlbnNpb25zLmdldCggJ09FU190ZXh0dXJlX2hhbGZfZmxvYXQnICk7XG5cblx0fSxcblx0c3VwcG9ydHNTdGFuZGFyZERlcml2YXRpdmVzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc3VwcG9ydHNTdGFuZGFyZERlcml2YXRpdmVzKCkgaXMgbm93IC5leHRlbnNpb25zLmdldCggXFwnT0VTX3N0YW5kYXJkX2Rlcml2YXRpdmVzXFwnICkuJyApO1xuXHRcdHJldHVybiB0aGlzLmV4dGVuc2lvbnMuZ2V0KCAnT0VTX3N0YW5kYXJkX2Rlcml2YXRpdmVzJyApO1xuXG5cdH0sXG5cdHN1cHBvcnRzQ29tcHJlc3NlZFRleHR1cmVTM1RDOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc3VwcG9ydHNDb21wcmVzc2VkVGV4dHVyZVMzVEMoKSBpcyBub3cgLmV4dGVuc2lvbnMuZ2V0KCBcXCdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0Y1xcJyApLicgKTtcblx0XHRyZXR1cm4gdGhpcy5leHRlbnNpb25zLmdldCggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjJyApO1xuXG5cdH0sXG5cdHN1cHBvcnRzQ29tcHJlc3NlZFRleHR1cmVQVlJUQzogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzQ29tcHJlc3NlZFRleHR1cmVQVlJUQygpIGlzIG5vdyAuZXh0ZW5zaW9ucy5nZXQoIFxcJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0Y1xcJyApLicgKTtcblx0XHRyZXR1cm4gdGhpcy5leHRlbnNpb25zLmdldCggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0YycgKTtcblxuXHR9LFxuXHRzdXBwb3J0c0JsZW5kTWluTWF4OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc3VwcG9ydHNCbGVuZE1pbk1heCgpIGlzIG5vdyAuZXh0ZW5zaW9ucy5nZXQoIFxcJ0VYVF9ibGVuZF9taW5tYXhcXCcgKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuZXh0ZW5zaW9ucy5nZXQoICdFWFRfYmxlbmRfbWlubWF4JyApO1xuXG5cdH0sXG5cdHN1cHBvcnRzVmVydGV4VGV4dHVyZXM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5zdXBwb3J0c1ZlcnRleFRleHR1cmVzKCkgaXMgbm93IC5jYXBhYmlsaXRpZXMudmVydGV4VGV4dHVyZXMuJyApO1xuXHRcdHJldHVybiB0aGlzLmNhcGFiaWxpdGllcy52ZXJ0ZXhUZXh0dXJlcztcblxuXHR9LFxuXHRzdXBwb3J0c0luc3RhbmNlZEFycmF5czogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzSW5zdGFuY2VkQXJyYXlzKCkgaXMgbm93IC5leHRlbnNpb25zLmdldCggXFwnQU5HTEVfaW5zdGFuY2VkX2FycmF5c1xcJyApLicgKTtcblx0XHRyZXR1cm4gdGhpcy5leHRlbnNpb25zLmdldCggJ0FOR0xFX2luc3RhbmNlZF9hcnJheXMnICk7XG5cblx0fSxcblx0ZW5hYmxlU2Npc3NvclRlc3Q6IGZ1bmN0aW9uICggYm9vbGVhbiApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5lbmFibGVTY2lzc29yVGVzdCgpIGlzIG5vdyAuc2V0U2Npc3NvclRlc3QoKS4nICk7XG5cdFx0dGhpcy5zZXRTY2lzc29yVGVzdCggYm9vbGVhbiApO1xuXG5cdH0sXG5cdGluaXRNYXRlcmlhbDogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLmluaXRNYXRlcmlhbCgpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdH0sXG5cdGFkZFByZVBsdWdpbjogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLmFkZFByZVBsdWdpbigpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG5cdH0sXG5cdGFkZFBvc3RQbHVnaW46IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5hZGRQb3N0UGx1Z2luKCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fSxcblx0dXBkYXRlU2hhZG93TWFwOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAudXBkYXRlU2hhZG93TWFwKCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBXZWJHTFJlbmRlcmVyLnByb3RvdHlwZSwge1xuXG5cdHNoYWRvd01hcEVuYWJsZWQ6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMuc2hhZG93TWFwLmVuYWJsZWQ7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcEVuYWJsZWQgaXMgbm93IC5zaGFkb3dNYXAuZW5hYmxlZC4nICk7XG5cdFx0XHR0aGlzLnNoYWRvd01hcC5lbmFibGVkID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdHNoYWRvd01hcFR5cGU6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMuc2hhZG93TWFwLnR5cGU7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcFR5cGUgaXMgbm93IC5zaGFkb3dNYXAudHlwZS4nICk7XG5cdFx0XHR0aGlzLnNoYWRvd01hcC50eXBlID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdHNoYWRvd01hcEN1bGxGYWNlOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLnNoYWRvd01hcC5jdWxsRmFjZTtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwQ3VsbEZhY2UgaXMgbm93IC5zaGFkb3dNYXAuY3VsbEZhY2UuJyApO1xuXHRcdFx0dGhpcy5zaGFkb3dNYXAuY3VsbEZhY2UgPSB2YWx1ZTtcblxuXHRcdH1cblx0fVxufSApO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyggV2ViR0xTaGFkb3dNYXAucHJvdG90eXBlLCB7XG5cblx0Y3VsbEZhY2U6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMucmVuZGVyUmV2ZXJzZVNpZGVkID8gQ3VsbEZhY2VGcm9udCA6IEN1bGxGYWNlQmFjaztcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIGN1bGxGYWNlICkge1xuXG5cdFx0XHR2YXIgdmFsdWUgPSAoIGN1bGxGYWNlICE9PSBDdWxsRmFjZUJhY2sgKTtcblx0XHRcdGNvbnNvbGUud2FybiggXCJXZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwLmN1bGxGYWNlIGlzIGRlcHJlY2F0ZWQuIFNldCAuc2hhZG93TWFwLnJlbmRlclJldmVyc2VTaWRlZCB0byBcIiArIHZhbHVlICsgXCIuXCIgKTtcblx0XHRcdHRoaXMucmVuZGVyUmV2ZXJzZVNpZGVkID0gdmFsdWU7XG5cblx0XHR9XG5cdH1cblxufSApO1xuXG4vL1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyggV2ViR0xSZW5kZXJUYXJnZXQucHJvdG90eXBlLCB7XG5cblx0d3JhcFM6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC53cmFwUyBpcyBub3cgLnRleHR1cmUud3JhcFMuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMudGV4dHVyZS53cmFwUztcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLndyYXBTIGlzIG5vdyAudGV4dHVyZS53cmFwUy4nICk7XG5cdFx0XHR0aGlzLnRleHR1cmUud3JhcFMgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0d3JhcFQ6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC53cmFwVCBpcyBub3cgLnRleHR1cmUud3JhcFQuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMudGV4dHVyZS53cmFwVDtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLndyYXBUIGlzIG5vdyAudGV4dHVyZS53cmFwVC4nICk7XG5cdFx0XHR0aGlzLnRleHR1cmUud3JhcFQgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0bWFnRmlsdGVyOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAubWFnRmlsdGVyIGlzIG5vdyAudGV4dHVyZS5tYWdGaWx0ZXIuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMudGV4dHVyZS5tYWdGaWx0ZXI7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5tYWdGaWx0ZXIgaXMgbm93IC50ZXh0dXJlLm1hZ0ZpbHRlci4nICk7XG5cdFx0XHR0aGlzLnRleHR1cmUubWFnRmlsdGVyID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdG1pbkZpbHRlcjoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLm1pbkZpbHRlciBpcyBub3cgLnRleHR1cmUubWluRmlsdGVyLicgKTtcblx0XHRcdHJldHVybiB0aGlzLnRleHR1cmUubWluRmlsdGVyO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAubWluRmlsdGVyIGlzIG5vdyAudGV4dHVyZS5taW5GaWx0ZXIuJyApO1xuXHRcdFx0dGhpcy50ZXh0dXJlLm1pbkZpbHRlciA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9LFxuXHRhbmlzb3Ryb3B5OiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAuYW5pc290cm9weSBpcyBub3cgLnRleHR1cmUuYW5pc290cm9weS4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy50ZXh0dXJlLmFuaXNvdHJvcHk7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5hbmlzb3Ryb3B5IGlzIG5vdyAudGV4dHVyZS5hbmlzb3Ryb3B5LicgKTtcblx0XHRcdHRoaXMudGV4dHVyZS5hbmlzb3Ryb3B5ID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdG9mZnNldDoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLm9mZnNldCBpcyBub3cgLnRleHR1cmUub2Zmc2V0LicgKTtcblx0XHRcdHJldHVybiB0aGlzLnRleHR1cmUub2Zmc2V0O1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAub2Zmc2V0IGlzIG5vdyAudGV4dHVyZS5vZmZzZXQuJyApO1xuXHRcdFx0dGhpcy50ZXh0dXJlLm9mZnNldCA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9LFxuXHRyZXBlYXQ6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5yZXBlYXQgaXMgbm93IC50ZXh0dXJlLnJlcGVhdC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy50ZXh0dXJlLnJlcGVhdDtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLnJlcGVhdCBpcyBub3cgLnRleHR1cmUucmVwZWF0LicgKTtcblx0XHRcdHRoaXMudGV4dHVyZS5yZXBlYXQgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0Zm9ybWF0OiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAuZm9ybWF0IGlzIG5vdyAudGV4dHVyZS5mb3JtYXQuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMudGV4dHVyZS5mb3JtYXQ7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5mb3JtYXQgaXMgbm93IC50ZXh0dXJlLmZvcm1hdC4nICk7XG5cdFx0XHR0aGlzLnRleHR1cmUuZm9ybWF0ID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdHR5cGU6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC50eXBlIGlzIG5vdyAudGV4dHVyZS50eXBlLicgKTtcblx0XHRcdHJldHVybiB0aGlzLnRleHR1cmUudHlwZTtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLnR5cGUgaXMgbm93IC50ZXh0dXJlLnR5cGUuJyApO1xuXHRcdFx0dGhpcy50ZXh0dXJlLnR5cGUgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0Z2VuZXJhdGVNaXBtYXBzOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAuZ2VuZXJhdGVNaXBtYXBzIGlzIG5vdyAudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHM7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5nZW5lcmF0ZU1pcG1hcHMgaXMgbm93IC50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcy4nICk7XG5cdFx0XHR0aGlzLnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzID0gdmFsdWU7XG5cblx0XHR9XG5cdH1cblxufSApO1xuXG4vL1xuXG5BdWRpby5wcm90b3R5cGUubG9hZCA9IGZ1bmN0aW9uICggZmlsZSApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5BdWRpbzogLmxvYWQgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIFRIUkVFLkF1ZGlvTG9hZGVyIGluc3RlYWQuJyApO1xuXHR2YXIgc2NvcGUgPSB0aGlzO1xuXHR2YXIgYXVkaW9Mb2FkZXIgPSBuZXcgQXVkaW9Mb2FkZXIoKTtcblx0YXVkaW9Mb2FkZXIubG9hZCggZmlsZSwgZnVuY3Rpb24gKCBidWZmZXIgKSB7XG5cblx0XHRzY29wZS5zZXRCdWZmZXIoIGJ1ZmZlciApO1xuXG5cdH0gKTtcblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cbkF1ZGlvQW5hbHlzZXIucHJvdG90eXBlLmdldERhdGEgPSBmdW5jdGlvbiAoKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuQXVkaW9BbmFseXNlcjogLmdldERhdGEoKSBpcyBub3cgLmdldEZyZXF1ZW5jeURhdGEoKS4nICk7XG5cdHJldHVybiB0aGlzLmdldEZyZXF1ZW5jeURhdGEoKTtcblxufTtcblxuLy9cblxudmFyIEdlb21ldHJ5VXRpbHMgPSB7XG5cblx0bWVyZ2U6IGZ1bmN0aW9uICggZ2VvbWV0cnkxLCBnZW9tZXRyeTIsIG1hdGVyaWFsSW5kZXhPZmZzZXQgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5HZW9tZXRyeVV0aWxzOiAubWVyZ2UoKSBoYXMgYmVlbiBtb3ZlZCB0byBHZW9tZXRyeS4gVXNlIGdlb21ldHJ5Lm1lcmdlKCBnZW9tZXRyeTIsIG1hdHJpeCwgbWF0ZXJpYWxJbmRleE9mZnNldCApIGluc3RlYWQuJyApO1xuXHRcdHZhciBtYXRyaXg7XG5cblx0XHRpZiAoIGdlb21ldHJ5Mi5pc01lc2ggKSB7XG5cblx0XHRcdGdlb21ldHJ5Mi5tYXRyaXhBdXRvVXBkYXRlICYmIGdlb21ldHJ5Mi51cGRhdGVNYXRyaXgoKTtcblxuXHRcdFx0bWF0cml4ID0gZ2VvbWV0cnkyLm1hdHJpeDtcblx0XHRcdGdlb21ldHJ5MiA9IGdlb21ldHJ5Mi5nZW9tZXRyeTtcblxuXHRcdH1cblxuXHRcdGdlb21ldHJ5MS5tZXJnZSggZ2VvbWV0cnkyLCBtYXRyaXgsIG1hdGVyaWFsSW5kZXhPZmZzZXQgKTtcblxuXHR9LFxuXG5cdGNlbnRlcjogZnVuY3Rpb24gKCBnZW9tZXRyeSApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkdlb21ldHJ5VXRpbHM6IC5jZW50ZXIoKSBoYXMgYmVlbiBtb3ZlZCB0byBHZW9tZXRyeS4gVXNlIGdlb21ldHJ5LmNlbnRlcigpIGluc3RlYWQuJyApO1xuXHRcdHJldHVybiBnZW9tZXRyeS5jZW50ZXIoKTtcblxuXHR9XG5cbn07XG5cbnZhciBJbWFnZVV0aWxzID0ge1xuXG5cdGNyb3NzT3JpZ2luOiB1bmRlZmluZWQsXG5cblx0bG9hZFRleHR1cmU6IGZ1bmN0aW9uICggdXJsLCBtYXBwaW5nLCBvbkxvYWQsIG9uRXJyb3IgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5JbWFnZVV0aWxzLmxvYWRUZXh0dXJlIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSBUSFJFRS5UZXh0dXJlTG9hZGVyKCkgaW5zdGVhZC4nICk7XG5cblx0XHR2YXIgbG9hZGVyID0gbmV3IFRleHR1cmVMb2FkZXIoKTtcblx0XHRsb2FkZXIuc2V0Q3Jvc3NPcmlnaW4oIHRoaXMuY3Jvc3NPcmlnaW4gKTtcblxuXHRcdHZhciB0ZXh0dXJlID0gbG9hZGVyLmxvYWQoIHVybCwgb25Mb2FkLCB1bmRlZmluZWQsIG9uRXJyb3IgKTtcblxuXHRcdGlmICggbWFwcGluZyApIHRleHR1cmUubWFwcGluZyA9IG1hcHBpbmc7XG5cblx0XHRyZXR1cm4gdGV4dHVyZTtcblxuXHR9LFxuXG5cdGxvYWRUZXh0dXJlQ3ViZTogZnVuY3Rpb24gKCB1cmxzLCBtYXBwaW5nLCBvbkxvYWQsIG9uRXJyb3IgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5JbWFnZVV0aWxzLmxvYWRUZXh0dXJlQ3ViZSBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgVEhSRUUuQ3ViZVRleHR1cmVMb2FkZXIoKSBpbnN0ZWFkLicgKTtcblxuXHRcdHZhciBsb2FkZXIgPSBuZXcgQ3ViZVRleHR1cmVMb2FkZXIoKTtcblx0XHRsb2FkZXIuc2V0Q3Jvc3NPcmlnaW4oIHRoaXMuY3Jvc3NPcmlnaW4gKTtcblxuXHRcdHZhciB0ZXh0dXJlID0gbG9hZGVyLmxvYWQoIHVybHMsIG9uTG9hZCwgdW5kZWZpbmVkLCBvbkVycm9yICk7XG5cblx0XHRpZiAoIG1hcHBpbmcgKSB0ZXh0dXJlLm1hcHBpbmcgPSBtYXBwaW5nO1xuXG5cdFx0cmV0dXJuIHRleHR1cmU7XG5cblx0fSxcblxuXHRsb2FkQ29tcHJlc3NlZFRleHR1cmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5JbWFnZVV0aWxzLmxvYWRDb21wcmVzc2VkVGV4dHVyZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuRERTTG9hZGVyIGluc3RlYWQuJyApO1xuXG5cdH0sXG5cblx0bG9hZENvbXByZXNzZWRUZXh0dXJlQ3ViZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLkltYWdlVXRpbHMubG9hZENvbXByZXNzZWRUZXh0dXJlQ3ViZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuRERTTG9hZGVyIGluc3RlYWQuJyApO1xuXG5cdH1cblxufTtcblxuLy9cblxuZnVuY3Rpb24gUHJvamVjdG9yKCkge1xuXG5cdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5Qcm9qZWN0b3IgaGFzIGJlZW4gbW92ZWQgdG8gL2V4YW1wbGVzL2pzL3JlbmRlcmVycy9Qcm9qZWN0b3IuanMuJyApO1xuXG5cdHRoaXMucHJvamVjdFZlY3RvciA9IGZ1bmN0aW9uICggdmVjdG9yLCBjYW1lcmEgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Qcm9qZWN0b3I6IC5wcm9qZWN0VmVjdG9yKCkgaXMgbm93IHZlY3Rvci5wcm9qZWN0KCkuJyApO1xuXHRcdHZlY3Rvci5wcm9qZWN0KCBjYW1lcmEgKTtcblxuXHR9O1xuXG5cdHRoaXMudW5wcm9qZWN0VmVjdG9yID0gZnVuY3Rpb24gKCB2ZWN0b3IsIGNhbWVyYSApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlByb2plY3RvcjogLnVucHJvamVjdFZlY3RvcigpIGlzIG5vdyB2ZWN0b3IudW5wcm9qZWN0KCkuJyApO1xuXHRcdHZlY3Rvci51bnByb2plY3QoIGNhbWVyYSApO1xuXG5cdH07XG5cblx0dGhpcy5waWNraW5nUmF5ID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlByb2plY3RvcjogLnBpY2tpbmdSYXkoKSBpcyBub3cgcmF5Y2FzdGVyLnNldEZyb21DYW1lcmEoKS4nICk7XG5cblx0fTtcblxufVxuXG4vL1xuXG5mdW5jdGlvbiBDYW52YXNSZW5kZXJlcigpIHtcblxuXHRjb25zb2xlLmVycm9yKCAnVEhSRUUuQ2FudmFzUmVuZGVyZXIgaGFzIGJlZW4gbW92ZWQgdG8gL2V4YW1wbGVzL2pzL3JlbmRlcmVycy9DYW52YXNSZW5kZXJlci5qcycgKTtcblxuXHR0aGlzLmRvbUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJywgJ2NhbnZhcycgKTtcblx0dGhpcy5jbGVhciA9IGZ1bmN0aW9uICgpIHt9O1xuXHR0aGlzLnJlbmRlciA9IGZ1bmN0aW9uICgpIHt9O1xuXHR0aGlzLnNldENsZWFyQ29sb3IgPSBmdW5jdGlvbiAoKSB7fTtcblx0dGhpcy5zZXRTaXplID0gZnVuY3Rpb24gKCkge307XG5cbn1cblxuZXhwb3J0IHsgV2ViR0xSZW5kZXJUYXJnZXRDdWJlLCBXZWJHTFJlbmRlclRhcmdldCwgV2ViR0xSZW5kZXJlciwgU2hhZGVyTGliLCBVbmlmb3Jtc0xpYiwgVW5pZm9ybXNVdGlscywgU2hhZGVyQ2h1bmssIEZvZ0V4cDIsIEZvZywgU2NlbmUsIExlbnNGbGFyZSwgU3ByaXRlLCBMT0QsIFNraW5uZWRNZXNoLCBTa2VsZXRvbiwgQm9uZSwgTWVzaCwgTGluZVNlZ21lbnRzLCBMaW5lTG9vcCwgTGluZSwgUG9pbnRzLCBHcm91cCwgVmlkZW9UZXh0dXJlLCBEYXRhVGV4dHVyZSwgQ29tcHJlc3NlZFRleHR1cmUsIEN1YmVUZXh0dXJlLCBDYW52YXNUZXh0dXJlLCBEZXB0aFRleHR1cmUsIFRleHR1cmUsIENvbXByZXNzZWRUZXh0dXJlTG9hZGVyLCBEYXRhVGV4dHVyZUxvYWRlciwgQ3ViZVRleHR1cmVMb2FkZXIsIFRleHR1cmVMb2FkZXIsIE9iamVjdExvYWRlciwgTWF0ZXJpYWxMb2FkZXIsIEJ1ZmZlckdlb21ldHJ5TG9hZGVyLCBEZWZhdWx0TG9hZGluZ01hbmFnZXIsIExvYWRpbmdNYW5hZ2VyLCBKU09OTG9hZGVyLCBJbWFnZUxvYWRlciwgRm9udExvYWRlciwgRmlsZUxvYWRlciwgTG9hZGVyLCBDYWNoZSwgQXVkaW9Mb2FkZXIsIFNwb3RMaWdodFNoYWRvdywgU3BvdExpZ2h0LCBQb2ludExpZ2h0LCBSZWN0QXJlYUxpZ2h0LCBIZW1pc3BoZXJlTGlnaHQsIERpcmVjdGlvbmFsTGlnaHRTaGFkb3csIERpcmVjdGlvbmFsTGlnaHQsIEFtYmllbnRMaWdodCwgTGlnaHRTaGFkb3csIExpZ2h0LCBTdGVyZW9DYW1lcmEsIFBlcnNwZWN0aXZlQ2FtZXJhLCBPcnRob2dyYXBoaWNDYW1lcmEsIEN1YmVDYW1lcmEsIEFycmF5Q2FtZXJhLCBDYW1lcmEsIEF1ZGlvTGlzdGVuZXIsIFBvc2l0aW9uYWxBdWRpbywgQXVkaW9Db250ZXh0LCBBdWRpb0FuYWx5c2VyLCBBdWRpbywgVmVjdG9yS2V5ZnJhbWVUcmFjaywgU3RyaW5nS2V5ZnJhbWVUcmFjaywgUXVhdGVybmlvbktleWZyYW1lVHJhY2ssIE51bWJlcktleWZyYW1lVHJhY2ssIENvbG9yS2V5ZnJhbWVUcmFjaywgQm9vbGVhbktleWZyYW1lVHJhY2ssIFByb3BlcnR5TWl4ZXIsIFByb3BlcnR5QmluZGluZywgS2V5ZnJhbWVUcmFjaywgQW5pbWF0aW9uVXRpbHMsIEFuaW1hdGlvbk9iamVjdEdyb3VwLCBBbmltYXRpb25NaXhlciwgQW5pbWF0aW9uQ2xpcCwgVW5pZm9ybSwgSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnksIEJ1ZmZlckdlb21ldHJ5LCBHZW9tZXRyeUlkQ291bnQsIEdlb21ldHJ5LCBJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSwgSW5zdGFuY2VkSW50ZXJsZWF2ZWRCdWZmZXIsIEludGVybGVhdmVkQnVmZmVyLCBJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUsIEZhY2UzLCBPYmplY3QzRCwgUmF5Y2FzdGVyLCBMYXllcnMsIEV2ZW50RGlzcGF0Y2hlciwgQ2xvY2ssIFF1YXRlcm5pb25MaW5lYXJJbnRlcnBvbGFudCwgTGluZWFySW50ZXJwb2xhbnQsIERpc2NyZXRlSW50ZXJwb2xhbnQsIEN1YmljSW50ZXJwb2xhbnQsIEludGVycG9sYW50LCBUcmlhbmdsZSwgX01hdGggYXMgTWF0aCwgU3BoZXJpY2FsLCBDeWxpbmRyaWNhbCwgUGxhbmUsIEZydXN0dW0sIFNwaGVyZSwgUmF5LCBNYXRyaXg0LCBNYXRyaXgzLCBCb3gzLCBCb3gyLCBMaW5lMywgRXVsZXIsIFZlY3RvcjQsIFZlY3RvcjMsIFZlY3RvcjIsIFF1YXRlcm5pb24sIENvbG9yLCBNb3JwaEJsZW5kTWVzaCwgSW1tZWRpYXRlUmVuZGVyT2JqZWN0LCBWZXJ0ZXhOb3JtYWxzSGVscGVyLCBTcG90TGlnaHRIZWxwZXIsIFNrZWxldG9uSGVscGVyLCBQb2ludExpZ2h0SGVscGVyLCBSZWN0QXJlYUxpZ2h0SGVscGVyLCBIZW1pc3BoZXJlTGlnaHRIZWxwZXIsIEdyaWRIZWxwZXIsIFBvbGFyR3JpZEhlbHBlciwgRmFjZU5vcm1hbHNIZWxwZXIsIERpcmVjdGlvbmFsTGlnaHRIZWxwZXIsIENhbWVyYUhlbHBlciwgQm94SGVscGVyLCBBcnJvd0hlbHBlciwgQXhpc0hlbHBlciwgQ2F0bXVsbFJvbUN1cnZlMywgQ3ViaWNCZXppZXJDdXJ2ZTMsIFF1YWRyYXRpY0JlemllckN1cnZlMywgTGluZUN1cnZlMywgQXJjQ3VydmUsIEVsbGlwc2VDdXJ2ZSwgU3BsaW5lQ3VydmUsIEN1YmljQmV6aWVyQ3VydmUsIFF1YWRyYXRpY0JlemllckN1cnZlLCBMaW5lQ3VydmUsIFNoYXBlLCBQYXRoLCBTaGFwZVBhdGgsIEZvbnQsIEN1cnZlUGF0aCwgQ3VydmUsIFNoYXBlVXRpbHMsIFNjZW5lVXRpbHMsIFdpcmVmcmFtZUdlb21ldHJ5LCBQYXJhbWV0cmljR2VvbWV0cnksIFBhcmFtZXRyaWNCdWZmZXJHZW9tZXRyeSwgVGV0cmFoZWRyb25HZW9tZXRyeSwgVGV0cmFoZWRyb25CdWZmZXJHZW9tZXRyeSwgT2N0YWhlZHJvbkdlb21ldHJ5LCBPY3RhaGVkcm9uQnVmZmVyR2VvbWV0cnksIEljb3NhaGVkcm9uR2VvbWV0cnksIEljb3NhaGVkcm9uQnVmZmVyR2VvbWV0cnksIERvZGVjYWhlZHJvbkdlb21ldHJ5LCBEb2RlY2FoZWRyb25CdWZmZXJHZW9tZXRyeSwgUG9seWhlZHJvbkdlb21ldHJ5LCBQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnksIFR1YmVHZW9tZXRyeSwgVHViZUJ1ZmZlckdlb21ldHJ5LCBUb3J1c0tub3RHZW9tZXRyeSwgVG9ydXNLbm90QnVmZmVyR2VvbWV0cnksIFRvcnVzR2VvbWV0cnksIFRvcnVzQnVmZmVyR2VvbWV0cnksIFRleHRHZW9tZXRyeSwgVGV4dEJ1ZmZlckdlb21ldHJ5LCBTcGhlcmVHZW9tZXRyeSwgU3BoZXJlQnVmZmVyR2VvbWV0cnksIFJpbmdHZW9tZXRyeSwgUmluZ0J1ZmZlckdlb21ldHJ5LCBQbGFuZUdlb21ldHJ5LCBQbGFuZUJ1ZmZlckdlb21ldHJ5LCBMYXRoZUdlb21ldHJ5LCBMYXRoZUJ1ZmZlckdlb21ldHJ5LCBTaGFwZUdlb21ldHJ5LCBTaGFwZUJ1ZmZlckdlb21ldHJ5LCBFeHRydWRlR2VvbWV0cnksIEV4dHJ1ZGVCdWZmZXJHZW9tZXRyeSwgRWRnZXNHZW9tZXRyeSwgQ29uZUdlb21ldHJ5LCBDb25lQnVmZmVyR2VvbWV0cnksIEN5bGluZGVyR2VvbWV0cnksIEN5bGluZGVyQnVmZmVyR2VvbWV0cnksIENpcmNsZUdlb21ldHJ5LCBDaXJjbGVCdWZmZXJHZW9tZXRyeSwgQm94R2VvbWV0cnksIEJveEJ1ZmZlckdlb21ldHJ5LCBTaGFkb3dNYXRlcmlhbCwgU3ByaXRlTWF0ZXJpYWwsIFJhd1NoYWRlck1hdGVyaWFsLCBTaGFkZXJNYXRlcmlhbCwgUG9pbnRzTWF0ZXJpYWwsIE1lc2hQaHlzaWNhbE1hdGVyaWFsLCBNZXNoU3RhbmRhcmRNYXRlcmlhbCwgTWVzaFBob25nTWF0ZXJpYWwsIE1lc2hUb29uTWF0ZXJpYWwsIE1lc2hOb3JtYWxNYXRlcmlhbCwgTWVzaExhbWJlcnRNYXRlcmlhbCwgTWVzaERlcHRoTWF0ZXJpYWwsIE1lc2hCYXNpY01hdGVyaWFsLCBMaW5lRGFzaGVkTWF0ZXJpYWwsIExpbmVCYXNpY01hdGVyaWFsLCBNYXRlcmlhbCwgRmxvYXQ2NEJ1ZmZlckF0dHJpYnV0ZSwgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSwgVWludDMyQnVmZmVyQXR0cmlidXRlLCBJbnQzMkJ1ZmZlckF0dHJpYnV0ZSwgVWludDE2QnVmZmVyQXR0cmlidXRlLCBJbnQxNkJ1ZmZlckF0dHJpYnV0ZSwgVWludDhDbGFtcGVkQnVmZmVyQXR0cmlidXRlLCBVaW50OEJ1ZmZlckF0dHJpYnV0ZSwgSW50OEJ1ZmZlckF0dHJpYnV0ZSwgQnVmZmVyQXR0cmlidXRlLCBSRVZJU0lPTiwgTU9VU0UsIEN1bGxGYWNlTm9uZSwgQ3VsbEZhY2VCYWNrLCBDdWxsRmFjZUZyb250LCBDdWxsRmFjZUZyb250QmFjaywgRnJvbnRGYWNlRGlyZWN0aW9uQ1csIEZyb250RmFjZURpcmVjdGlvbkNDVywgQmFzaWNTaGFkb3dNYXAsIFBDRlNoYWRvd01hcCwgUENGU29mdFNoYWRvd01hcCwgRnJvbnRTaWRlLCBCYWNrU2lkZSwgRG91YmxlU2lkZSwgRmxhdFNoYWRpbmcsIFNtb290aFNoYWRpbmcsIE5vQ29sb3JzLCBGYWNlQ29sb3JzLCBWZXJ0ZXhDb2xvcnMsIE5vQmxlbmRpbmcsIE5vcm1hbEJsZW5kaW5nLCBBZGRpdGl2ZUJsZW5kaW5nLCBTdWJ0cmFjdGl2ZUJsZW5kaW5nLCBNdWx0aXBseUJsZW5kaW5nLCBDdXN0b21CbGVuZGluZywgQWRkRXF1YXRpb24sIFN1YnRyYWN0RXF1YXRpb24sIFJldmVyc2VTdWJ0cmFjdEVxdWF0aW9uLCBNaW5FcXVhdGlvbiwgTWF4RXF1YXRpb24sIFplcm9GYWN0b3IsIE9uZUZhY3RvciwgU3JjQ29sb3JGYWN0b3IsIE9uZU1pbnVzU3JjQ29sb3JGYWN0b3IsIFNyY0FscGhhRmFjdG9yLCBPbmVNaW51c1NyY0FscGhhRmFjdG9yLCBEc3RBbHBoYUZhY3RvciwgT25lTWludXNEc3RBbHBoYUZhY3RvciwgRHN0Q29sb3JGYWN0b3IsIE9uZU1pbnVzRHN0Q29sb3JGYWN0b3IsIFNyY0FscGhhU2F0dXJhdGVGYWN0b3IsIE5ldmVyRGVwdGgsIEFsd2F5c0RlcHRoLCBMZXNzRGVwdGgsIExlc3NFcXVhbERlcHRoLCBFcXVhbERlcHRoLCBHcmVhdGVyRXF1YWxEZXB0aCwgR3JlYXRlckRlcHRoLCBOb3RFcXVhbERlcHRoLCBNdWx0aXBseU9wZXJhdGlvbiwgTWl4T3BlcmF0aW9uLCBBZGRPcGVyYXRpb24sIE5vVG9uZU1hcHBpbmcsIExpbmVhclRvbmVNYXBwaW5nLCBSZWluaGFyZFRvbmVNYXBwaW5nLCBVbmNoYXJ0ZWQyVG9uZU1hcHBpbmcsIENpbmVvblRvbmVNYXBwaW5nLCBVVk1hcHBpbmcsIEN1YmVSZWZsZWN0aW9uTWFwcGluZywgQ3ViZVJlZnJhY3Rpb25NYXBwaW5nLCBFcXVpcmVjdGFuZ3VsYXJSZWZsZWN0aW9uTWFwcGluZywgRXF1aXJlY3Rhbmd1bGFyUmVmcmFjdGlvbk1hcHBpbmcsIFNwaGVyaWNhbFJlZmxlY3Rpb25NYXBwaW5nLCBDdWJlVVZSZWZsZWN0aW9uTWFwcGluZywgQ3ViZVVWUmVmcmFjdGlvbk1hcHBpbmcsIFJlcGVhdFdyYXBwaW5nLCBDbGFtcFRvRWRnZVdyYXBwaW5nLCBNaXJyb3JlZFJlcGVhdFdyYXBwaW5nLCBOZWFyZXN0RmlsdGVyLCBOZWFyZXN0TWlwTWFwTmVhcmVzdEZpbHRlciwgTmVhcmVzdE1pcE1hcExpbmVhckZpbHRlciwgTGluZWFyRmlsdGVyLCBMaW5lYXJNaXBNYXBOZWFyZXN0RmlsdGVyLCBMaW5lYXJNaXBNYXBMaW5lYXJGaWx0ZXIsIFVuc2lnbmVkQnl0ZVR5cGUsIEJ5dGVUeXBlLCBTaG9ydFR5cGUsIFVuc2lnbmVkU2hvcnRUeXBlLCBJbnRUeXBlLCBVbnNpZ25lZEludFR5cGUsIEZsb2F0VHlwZSwgSGFsZkZsb2F0VHlwZSwgVW5zaWduZWRTaG9ydDQ0NDRUeXBlLCBVbnNpZ25lZFNob3J0NTU1MVR5cGUsIFVuc2lnbmVkU2hvcnQ1NjVUeXBlLCBVbnNpZ25lZEludDI0OFR5cGUsIEFscGhhRm9ybWF0LCBSR0JGb3JtYXQsIFJHQkFGb3JtYXQsIEx1bWluYW5jZUZvcm1hdCwgTHVtaW5hbmNlQWxwaGFGb3JtYXQsIFJHQkVGb3JtYXQsIERlcHRoRm9ybWF0LCBEZXB0aFN0ZW5jaWxGb3JtYXQsIFJHQl9TM1RDX0RYVDFfRm9ybWF0LCBSR0JBX1MzVENfRFhUMV9Gb3JtYXQsIFJHQkFfUzNUQ19EWFQzX0Zvcm1hdCwgUkdCQV9TM1RDX0RYVDVfRm9ybWF0LCBSR0JfUFZSVENfNEJQUFYxX0Zvcm1hdCwgUkdCX1BWUlRDXzJCUFBWMV9Gb3JtYXQsIFJHQkFfUFZSVENfNEJQUFYxX0Zvcm1hdCwgUkdCQV9QVlJUQ18yQlBQVjFfRm9ybWF0LCBSR0JfRVRDMV9Gb3JtYXQsIExvb3BPbmNlLCBMb29wUmVwZWF0LCBMb29wUGluZ1BvbmcsIEludGVycG9sYXRlRGlzY3JldGUsIEludGVycG9sYXRlTGluZWFyLCBJbnRlcnBvbGF0ZVNtb290aCwgWmVyb0N1cnZhdHVyZUVuZGluZywgWmVyb1Nsb3BlRW5kaW5nLCBXcmFwQXJvdW5kRW5kaW5nLCBUcmlhbmdsZXNEcmF3TW9kZSwgVHJpYW5nbGVTdHJpcERyYXdNb2RlLCBUcmlhbmdsZUZhbkRyYXdNb2RlLCBMaW5lYXJFbmNvZGluZywgc1JHQkVuY29kaW5nLCBHYW1tYUVuY29kaW5nLCBSR0JFRW5jb2RpbmcsIExvZ0x1dkVuY29kaW5nLCBSR0JNN0VuY29kaW5nLCBSR0JNMTZFbmNvZGluZywgUkdCREVuY29kaW5nLCBCYXNpY0RlcHRoUGFja2luZywgUkdCQURlcHRoUGFja2luZywgQm94R2VvbWV0cnkgYXMgQ3ViZUdlb21ldHJ5LCBGYWNlNCwgTGluZVN0cmlwLCBMaW5lUGllY2VzLCBNZXNoRmFjZU1hdGVyaWFsLCBNdWx0aU1hdGVyaWFsLCBQb2ludENsb3VkLCBQYXJ0aWNsZSwgUGFydGljbGVTeXN0ZW0sIFBvaW50Q2xvdWRNYXRlcmlhbCwgUGFydGljbGVCYXNpY01hdGVyaWFsLCBQYXJ0aWNsZVN5c3RlbU1hdGVyaWFsLCBWZXJ0ZXgsIER5bmFtaWNCdWZmZXJBdHRyaWJ1dGUsIEludDhBdHRyaWJ1dGUsIFVpbnQ4QXR0cmlidXRlLCBVaW50OENsYW1wZWRBdHRyaWJ1dGUsIEludDE2QXR0cmlidXRlLCBVaW50MTZBdHRyaWJ1dGUsIEludDMyQXR0cmlidXRlLCBVaW50MzJBdHRyaWJ1dGUsIEZsb2F0MzJBdHRyaWJ1dGUsIEZsb2F0NjRBdHRyaWJ1dGUsIENsb3NlZFNwbGluZUN1cnZlMywgU3BsaW5lQ3VydmUzLCBTcGxpbmUsIEJvdW5kaW5nQm94SGVscGVyLCBFZGdlc0hlbHBlciwgV2lyZWZyYW1lSGVscGVyLCBYSFJMb2FkZXIsIEJpbmFyeVRleHR1cmVMb2FkZXIsIEdlb21ldHJ5VXRpbHMsIEltYWdlVXRpbHMsIFByb2plY3RvciwgQ2FudmFzUmVuZGVyZXIgfTtcbiIsIi8qKlxuICogQGF1dGhvciBkbWFyY29zIC8gaHR0cHM6Ly9naXRodWIuY29tL2RtYXJjb3NcbiAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb21cbiAqXG4gKiBXZWJWUiBTcGVjOiBodHRwOi8vbW96dnIuZ2l0aHViLmlvL3dlYnZyLXNwZWMvd2VidnIuaHRtbFxuICpcbiAqIEZpcmVmb3g6IGh0dHA6Ly9tb3p2ci5jb20vZG93bmxvYWRzL1xuICogQ2hyb21pdW06IGh0dHBzOi8vd2VidnIuaW5mby9nZXQtY2hyb21lXG4gKlxuICovXG5cbmltcG9ydCB7XG4gIFZlY3RvcjMsXG4gIFBlcnNwZWN0aXZlQ2FtZXJhLFxuICBNYXRyaXg0XG59IGZyb20gJ3RocmVlJztcblxuZXhwb3J0IGNvbnN0IFZSRWZmZWN0ID0gZnVuY3Rpb24gKCByZW5kZXJlciwgb25FcnJvciApIHtcblxuXHR2YXIgdnJEaXNwbGF5LCB2ckRpc3BsYXlzO1xuXHR2YXIgZXllVHJhbnNsYXRpb25MID0gbmV3IFZlY3RvcjMoKTtcblx0dmFyIGV5ZVRyYW5zbGF0aW9uUiA9IG5ldyBWZWN0b3IzKCk7XG5cdHZhciByZW5kZXJSZWN0TCwgcmVuZGVyUmVjdFI7XG5cblx0dmFyIGZyYW1lRGF0YSA9IG51bGw7XG5cblx0aWYgKCAnVlJGcmFtZURhdGEnIGluIHdpbmRvdyApIHtcblxuXHRcdGZyYW1lRGF0YSA9IG5ldyBWUkZyYW1lRGF0YSgpO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBnb3RWUkRpc3BsYXlzKCBkaXNwbGF5cyApIHtcblxuXHRcdHZyRGlzcGxheXMgPSBkaXNwbGF5cztcblxuXHRcdGlmICggZGlzcGxheXMubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0dnJEaXNwbGF5ID0gZGlzcGxheXNbIDAgXTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGlmICggb25FcnJvciApIG9uRXJyb3IoICdITUQgbm90IGF2YWlsYWJsZScgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0aWYgKCBuYXZpZ2F0b3IuZ2V0VlJEaXNwbGF5cyApIHtcblxuXHRcdG5hdmlnYXRvci5nZXRWUkRpc3BsYXlzKCkudGhlbiggZ290VlJEaXNwbGF5cyApLmNhdGNoICggZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5WUkVmZmVjdDogVW5hYmxlIHRvIGdldCBWUiBEaXNwbGF5cycgKTtcblxuXHRcdH0gKTtcblxuXHR9XG5cblx0Ly9cblxuXHR0aGlzLmlzUHJlc2VudGluZyA9IGZhbHNlO1xuXHR0aGlzLnNjYWxlID0gMTtcblxuXHR2YXIgc2NvcGUgPSB0aGlzO1xuXG5cdHZhciByZW5kZXJlclNpemUgPSByZW5kZXJlci5nZXRTaXplKCk7XG5cdHZhciByZW5kZXJlclVwZGF0ZVN0eWxlID0gZmFsc2U7XG5cdHZhciByZW5kZXJlclBpeGVsUmF0aW8gPSByZW5kZXJlci5nZXRQaXhlbFJhdGlvKCk7XG5cblx0dGhpcy5nZXRWUkRpc3BsYXkgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdnJEaXNwbGF5O1xuXG5cdH07XG5cblx0dGhpcy5zZXRWUkRpc3BsYXkgPSBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dnJEaXNwbGF5ID0gdmFsdWU7XG5cblx0fTtcblxuXHR0aGlzLmdldFZSRGlzcGxheXMgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5WUkVmZmVjdDogZ2V0VlJEaXNwbGF5cygpIGlzIGJlaW5nIGRlcHJlY2F0ZWQuJyApO1xuXHRcdHJldHVybiB2ckRpc3BsYXlzO1xuXG5cdH07XG5cblx0dGhpcy5zZXRTaXplID0gZnVuY3Rpb24gKCB3aWR0aCwgaGVpZ2h0LCB1cGRhdGVTdHlsZSApIHtcblxuXHRcdHJlbmRlcmVyU2l6ZSA9IHsgd2lkdGg6IHdpZHRoLCBoZWlnaHQ6IGhlaWdodCB9O1xuXHRcdHJlbmRlcmVyVXBkYXRlU3R5bGUgPSB1cGRhdGVTdHlsZTtcblxuXHRcdGlmICggc2NvcGUuaXNQcmVzZW50aW5nICkge1xuXG5cdFx0XHR2YXIgZXllUGFyYW1zTCA9IHZyRGlzcGxheS5nZXRFeWVQYXJhbWV0ZXJzKCAnbGVmdCcgKTtcblx0XHRcdHJlbmRlcmVyLnNldFBpeGVsUmF0aW8oIDEgKTtcblx0XHRcdHJlbmRlcmVyLnNldFNpemUoIGV5ZVBhcmFtc0wucmVuZGVyV2lkdGggKiAyLCBleWVQYXJhbXNMLnJlbmRlckhlaWdodCwgZmFsc2UgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHJlbmRlcmVyLnNldFBpeGVsUmF0aW8oIHJlbmRlcmVyUGl4ZWxSYXRpbyApO1xuXHRcdFx0cmVuZGVyZXIuc2V0U2l6ZSggd2lkdGgsIGhlaWdodCwgdXBkYXRlU3R5bGUgKTtcblxuXHRcdH1cblxuXHR9O1xuXG5cdC8vIGZ1bGxzY3JlZW5cblxuXHR2YXIgY2FudmFzID0gcmVuZGVyZXIuZG9tRWxlbWVudDtcblx0dmFyIHJlcXVlc3RGdWxsc2NyZWVuO1xuXHR2YXIgZXhpdEZ1bGxzY3JlZW47XG5cdHZhciBmdWxsc2NyZWVuRWxlbWVudDtcblx0dmFyIGRlZmF1bHRMZWZ0Qm91bmRzID0gWyAwLjAsIDAuMCwgMC41LCAxLjAgXTtcblx0dmFyIGRlZmF1bHRSaWdodEJvdW5kcyA9IFsgMC41LCAwLjAsIDAuNSwgMS4wIF07XG5cblx0ZnVuY3Rpb24gb25WUkRpc3BsYXlQcmVzZW50Q2hhbmdlKCkge1xuXG5cdFx0dmFyIHdhc1ByZXNlbnRpbmcgPSBzY29wZS5pc1ByZXNlbnRpbmc7XG5cdFx0c2NvcGUuaXNQcmVzZW50aW5nID0gdnJEaXNwbGF5ICE9PSB1bmRlZmluZWQgJiYgdnJEaXNwbGF5LmlzUHJlc2VudGluZztcblxuXHRcdGlmICggc2NvcGUuaXNQcmVzZW50aW5nICkge1xuXG5cdFx0XHR2YXIgZXllUGFyYW1zTCA9IHZyRGlzcGxheS5nZXRFeWVQYXJhbWV0ZXJzKCAnbGVmdCcgKTtcblx0XHRcdHZhciBleWVXaWR0aCA9IGV5ZVBhcmFtc0wucmVuZGVyV2lkdGg7XG5cdFx0XHR2YXIgZXllSGVpZ2h0ID0gZXllUGFyYW1zTC5yZW5kZXJIZWlnaHQ7XG5cblx0XHRcdGlmICggIXdhc1ByZXNlbnRpbmcgKSB7XG5cblx0XHRcdFx0cmVuZGVyZXJQaXhlbFJhdGlvID0gcmVuZGVyZXIuZ2V0UGl4ZWxSYXRpbygpO1xuXHRcdFx0XHRyZW5kZXJlclNpemUgPSByZW5kZXJlci5nZXRTaXplKCk7XG5cblx0XHRcdFx0cmVuZGVyZXIuc2V0UGl4ZWxSYXRpbyggMSApO1xuXHRcdFx0XHRyZW5kZXJlci5zZXRTaXplKCBleWVXaWR0aCAqIDIsIGV5ZUhlaWdodCwgZmFsc2UgKTtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIGlmICggd2FzUHJlc2VudGluZyApIHtcblxuXHRcdFx0cmVuZGVyZXIuc2V0UGl4ZWxSYXRpbyggcmVuZGVyZXJQaXhlbFJhdGlvICk7XG5cdFx0XHRyZW5kZXJlci5zZXRTaXplKCByZW5kZXJlclNpemUud2lkdGgsIHJlbmRlcmVyU2l6ZS5oZWlnaHQsIHJlbmRlcmVyVXBkYXRlU3R5bGUgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoICd2cmRpc3BsYXlwcmVzZW50Y2hhbmdlJywgb25WUkRpc3BsYXlQcmVzZW50Q2hhbmdlLCBmYWxzZSApO1xuXG5cdHRoaXMuc2V0RnVsbFNjcmVlbiA9IGZ1bmN0aW9uICggYm9vbGVhbiApIHtcblxuXHRcdHJldHVybiBuZXcgUHJvbWlzZSggZnVuY3Rpb24gKCByZXNvbHZlLCByZWplY3QgKSB7XG5cblx0XHRcdGlmICggdnJEaXNwbGF5ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0cmVqZWN0KCBuZXcgRXJyb3IoICdObyBWUiBoYXJkd2FyZSBmb3VuZC4nICkgKTtcblx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggc2NvcGUuaXNQcmVzZW50aW5nID09PSBib29sZWFuICkge1xuXG5cdFx0XHRcdHJlc29sdmUoKTtcblx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggYm9vbGVhbiApIHtcblxuXHRcdFx0XHRyZXNvbHZlKCB2ckRpc3BsYXkucmVxdWVzdFByZXNlbnQoIFsgeyBzb3VyY2U6IGNhbnZhcyB9IF0gKSApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHJlc29sdmUoIHZyRGlzcGxheS5leGl0UHJlc2VudCgpICk7XG5cblx0XHRcdH1cblxuXHRcdH0gKTtcblxuXHR9O1xuXG5cdHRoaXMucmVxdWVzdFByZXNlbnQgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5zZXRGdWxsU2NyZWVuKCB0cnVlICk7XG5cblx0fTtcblxuXHR0aGlzLmV4aXRQcmVzZW50ID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuc2V0RnVsbFNjcmVlbiggZmFsc2UgKTtcblxuXHR9O1xuXG5cdHRoaXMucmVxdWVzdEFuaW1hdGlvbkZyYW1lID0gZnVuY3Rpb24gKCBmICkge1xuXG5cdFx0aWYgKCB2ckRpc3BsYXkgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0cmV0dXJuIHZyRGlzcGxheS5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoIGYgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHJldHVybiB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCBmICk7XG5cblx0XHR9XG5cblx0fTtcblxuXHR0aGlzLmNhbmNlbEFuaW1hdGlvbkZyYW1lID0gZnVuY3Rpb24gKCBoICkge1xuXG5cdFx0aWYgKCB2ckRpc3BsYXkgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dnJEaXNwbGF5LmNhbmNlbEFuaW1hdGlvbkZyYW1lKCBoICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUoIGggKTtcblxuXHRcdH1cblxuXHR9O1xuXG5cdHRoaXMuc3VibWl0RnJhbWUgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRpZiAoIHZyRGlzcGxheSAhPT0gdW5kZWZpbmVkICYmIHNjb3BlLmlzUHJlc2VudGluZyApIHtcblxuXHRcdFx0dnJEaXNwbGF5LnN1Ym1pdEZyYW1lKCk7XG5cblx0XHR9XG5cblx0fTtcblxuXHR0aGlzLmF1dG9TdWJtaXRGcmFtZSA9IHRydWU7XG5cblx0Ly8gcmVuZGVyXG5cblx0dmFyIGNhbWVyYUwgPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoKTtcblx0Y2FtZXJhTC5sYXllcnMuZW5hYmxlKCAxICk7XG5cblx0dmFyIGNhbWVyYVIgPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoKTtcblx0Y2FtZXJhUi5sYXllcnMuZW5hYmxlKCAyICk7XG5cblx0dGhpcy5yZW5kZXIgPSBmdW5jdGlvbiAoIHNjZW5lLCBjYW1lcmEsIHJlbmRlclRhcmdldCwgZm9yY2VDbGVhciApIHtcblxuXHRcdGlmICggdnJEaXNwbGF5ICYmIHNjb3BlLmlzUHJlc2VudGluZyApIHtcblxuXHRcdFx0dmFyIGF1dG9VcGRhdGUgPSBzY2VuZS5hdXRvVXBkYXRlO1xuXG5cdFx0XHRpZiAoIGF1dG9VcGRhdGUgKSB7XG5cblx0XHRcdFx0c2NlbmUudXBkYXRlTWF0cml4V29ybGQoKTtcblx0XHRcdFx0c2NlbmUuYXV0b1VwZGF0ZSA9IGZhbHNlO1xuXG5cdFx0XHR9XG5cblx0XHRcdHZhciBleWVQYXJhbXNMID0gdnJEaXNwbGF5LmdldEV5ZVBhcmFtZXRlcnMoICdsZWZ0JyApO1xuXHRcdFx0dmFyIGV5ZVBhcmFtc1IgPSB2ckRpc3BsYXkuZ2V0RXllUGFyYW1ldGVycyggJ3JpZ2h0JyApO1xuXG5cdFx0XHRleWVUcmFuc2xhdGlvbkwuZnJvbUFycmF5KCBleWVQYXJhbXNMLm9mZnNldCApO1xuXHRcdFx0ZXllVHJhbnNsYXRpb25SLmZyb21BcnJheSggZXllUGFyYW1zUi5vZmZzZXQgKTtcblxuXHRcdFx0aWYgKCBBcnJheS5pc0FycmF5KCBzY2VuZSApICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZSRWZmZWN0LnJlbmRlcigpIG5vIGxvbmdlciBzdXBwb3J0cyBhcnJheXMuIFVzZSBvYmplY3QubGF5ZXJzIGluc3RlYWQuJyApO1xuXHRcdFx0XHRzY2VuZSA9IHNjZW5lWyAwIF07XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gV2hlbiByZW5kZXJpbmcgd2UgZG9uJ3QgY2FyZSB3aGF0IHRoZSByZWNvbW1lbmRlZCBzaXplIGlzLCBvbmx5IHdoYXQgdGhlIGFjdHVhbCBzaXplXG5cdFx0XHQvLyBvZiB0aGUgYmFja2J1ZmZlciBpcy5cblx0XHRcdHZhciBzaXplID0gcmVuZGVyZXIuZ2V0U2l6ZSgpO1xuXHRcdFx0dmFyIGxheWVycyA9IHZyRGlzcGxheS5nZXRMYXllcnMoKTtcblx0XHRcdHZhciBsZWZ0Qm91bmRzO1xuXHRcdFx0dmFyIHJpZ2h0Qm91bmRzO1xuXG5cdFx0XHRpZiAoIGxheWVycy5sZW5ndGggKSB7XG5cblx0XHRcdFx0dmFyIGxheWVyID0gbGF5ZXJzWyAwIF07XG5cblx0XHRcdFx0bGVmdEJvdW5kcyA9IGxheWVyLmxlZnRCb3VuZHMgIT09IG51bGwgJiYgbGF5ZXIubGVmdEJvdW5kcy5sZW5ndGggPT09IDQgPyBsYXllci5sZWZ0Qm91bmRzIDogZGVmYXVsdExlZnRCb3VuZHM7XG5cdFx0XHRcdHJpZ2h0Qm91bmRzID0gbGF5ZXIucmlnaHRCb3VuZHMgIT09IG51bGwgJiYgbGF5ZXIucmlnaHRCb3VuZHMubGVuZ3RoID09PSA0ID8gbGF5ZXIucmlnaHRCb3VuZHMgOiBkZWZhdWx0UmlnaHRCb3VuZHM7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0bGVmdEJvdW5kcyA9IGRlZmF1bHRMZWZ0Qm91bmRzO1xuXHRcdFx0XHRyaWdodEJvdW5kcyA9IGRlZmF1bHRSaWdodEJvdW5kcztcblxuXHRcdFx0fVxuXG5cdFx0XHRyZW5kZXJSZWN0TCA9IHtcblx0XHRcdFx0eDogTWF0aC5yb3VuZCggc2l6ZS53aWR0aCAqIGxlZnRCb3VuZHNbIDAgXSApLFxuXHRcdFx0XHR5OiBNYXRoLnJvdW5kKCBzaXplLmhlaWdodCAqIGxlZnRCb3VuZHNbIDEgXSApLFxuXHRcdFx0XHR3aWR0aDogTWF0aC5yb3VuZCggc2l6ZS53aWR0aCAqIGxlZnRCb3VuZHNbIDIgXSApLFxuXHRcdFx0XHRoZWlnaHQ6IE1hdGgucm91bmQoc2l6ZS5oZWlnaHQgKiBsZWZ0Qm91bmRzWyAzIF0gKVxuXHRcdFx0fTtcblx0XHRcdHJlbmRlclJlY3RSID0ge1xuXHRcdFx0XHR4OiBNYXRoLnJvdW5kKCBzaXplLndpZHRoICogcmlnaHRCb3VuZHNbIDAgXSApLFxuXHRcdFx0XHR5OiBNYXRoLnJvdW5kKCBzaXplLmhlaWdodCAqIHJpZ2h0Qm91bmRzWyAxIF0gKSxcblx0XHRcdFx0d2lkdGg6IE1hdGgucm91bmQoIHNpemUud2lkdGggKiByaWdodEJvdW5kc1sgMiBdICksXG5cdFx0XHRcdGhlaWdodDogTWF0aC5yb3VuZChzaXplLmhlaWdodCAqIHJpZ2h0Qm91bmRzWyAzIF0gKVxuXHRcdFx0fTtcblxuXHRcdFx0aWYgKCByZW5kZXJUYXJnZXQgKSB7XG5cblx0XHRcdFx0cmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KCByZW5kZXJUYXJnZXQgKTtcblx0XHRcdFx0cmVuZGVyVGFyZ2V0LnNjaXNzb3JUZXN0ID0gdHJ1ZTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRyZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoIG51bGwgKTtcblx0XHRcdFx0cmVuZGVyZXIuc2V0U2Npc3NvclRlc3QoIHRydWUgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHJlbmRlcmVyLmF1dG9DbGVhciB8fCBmb3JjZUNsZWFyICkgcmVuZGVyZXIuY2xlYXIoKTtcblxuXHRcdFx0aWYgKCBjYW1lcmEucGFyZW50ID09PSBudWxsICkgY2FtZXJhLnVwZGF0ZU1hdHJpeFdvcmxkKCk7XG5cblx0XHRcdGNhbWVyYS5tYXRyaXhXb3JsZC5kZWNvbXBvc2UoIGNhbWVyYUwucG9zaXRpb24sIGNhbWVyYUwucXVhdGVybmlvbiwgY2FtZXJhTC5zY2FsZSApO1xuXHRcdFx0Y2FtZXJhLm1hdHJpeFdvcmxkLmRlY29tcG9zZSggY2FtZXJhUi5wb3NpdGlvbiwgY2FtZXJhUi5xdWF0ZXJuaW9uLCBjYW1lcmFSLnNjYWxlICk7XG5cblx0XHRcdHZhciBzY2FsZSA9IHRoaXMuc2NhbGU7XG5cdFx0XHRjYW1lcmFMLnRyYW5zbGF0ZU9uQXhpcyggZXllVHJhbnNsYXRpb25MLCBzY2FsZSApO1xuXHRcdFx0Y2FtZXJhUi50cmFuc2xhdGVPbkF4aXMoIGV5ZVRyYW5zbGF0aW9uUiwgc2NhbGUgKTtcblxuXHRcdFx0aWYgKCB2ckRpc3BsYXkuZ2V0RnJhbWVEYXRhICkge1xuXG5cdFx0XHRcdHZyRGlzcGxheS5kZXB0aE5lYXIgPSBjYW1lcmEubmVhcjtcblx0XHRcdFx0dnJEaXNwbGF5LmRlcHRoRmFyID0gY2FtZXJhLmZhcjtcblxuXHRcdFx0XHR2ckRpc3BsYXkuZ2V0RnJhbWVEYXRhKCBmcmFtZURhdGEgKTtcblxuXHRcdFx0XHRjYW1lcmFMLnByb2plY3Rpb25NYXRyaXguZWxlbWVudHMgPSBmcmFtZURhdGEubGVmdFByb2plY3Rpb25NYXRyaXg7XG5cdFx0XHRcdGNhbWVyYVIucHJvamVjdGlvbk1hdHJpeC5lbGVtZW50cyA9IGZyYW1lRGF0YS5yaWdodFByb2plY3Rpb25NYXRyaXg7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Y2FtZXJhTC5wcm9qZWN0aW9uTWF0cml4ID0gZm92VG9Qcm9qZWN0aW9uKCBleWVQYXJhbXNMLmZpZWxkT2ZWaWV3LCB0cnVlLCBjYW1lcmEubmVhciwgY2FtZXJhLmZhciApO1xuXHRcdFx0XHRjYW1lcmFSLnByb2plY3Rpb25NYXRyaXggPSBmb3ZUb1Byb2plY3Rpb24oIGV5ZVBhcmFtc1IuZmllbGRPZlZpZXcsIHRydWUsIGNhbWVyYS5uZWFyLCBjYW1lcmEuZmFyICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gcmVuZGVyIGxlZnQgZXllXG5cdFx0XHRpZiAoIHJlbmRlclRhcmdldCApIHtcblxuXHRcdFx0XHRyZW5kZXJUYXJnZXQudmlld3BvcnQuc2V0KCByZW5kZXJSZWN0TC54LCByZW5kZXJSZWN0TC55LCByZW5kZXJSZWN0TC53aWR0aCwgcmVuZGVyUmVjdEwuaGVpZ2h0ICk7XG5cdFx0XHRcdHJlbmRlclRhcmdldC5zY2lzc29yLnNldCggcmVuZGVyUmVjdEwueCwgcmVuZGVyUmVjdEwueSwgcmVuZGVyUmVjdEwud2lkdGgsIHJlbmRlclJlY3RMLmhlaWdodCApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHJlbmRlcmVyLnNldFZpZXdwb3J0KCByZW5kZXJSZWN0TC54LCByZW5kZXJSZWN0TC55LCByZW5kZXJSZWN0TC53aWR0aCwgcmVuZGVyUmVjdEwuaGVpZ2h0ICk7XG5cdFx0XHRcdHJlbmRlcmVyLnNldFNjaXNzb3IoIHJlbmRlclJlY3RMLngsIHJlbmRlclJlY3RMLnksIHJlbmRlclJlY3RMLndpZHRoLCByZW5kZXJSZWN0TC5oZWlnaHQgKTtcblxuXHRcdFx0fVxuXHRcdFx0cmVuZGVyZXIucmVuZGVyKCBzY2VuZSwgY2FtZXJhTCwgcmVuZGVyVGFyZ2V0LCBmb3JjZUNsZWFyICk7XG5cblx0XHRcdC8vIHJlbmRlciByaWdodCBleWVcblx0XHRcdGlmICggcmVuZGVyVGFyZ2V0ICkge1xuXG5cdFx0XHRcdHJlbmRlclRhcmdldC52aWV3cG9ydC5zZXQoIHJlbmRlclJlY3RSLngsIHJlbmRlclJlY3RSLnksIHJlbmRlclJlY3RSLndpZHRoLCByZW5kZXJSZWN0Ui5oZWlnaHQgKTtcblx0XHRcdFx0cmVuZGVyVGFyZ2V0LnNjaXNzb3Iuc2V0KCByZW5kZXJSZWN0Ui54LCByZW5kZXJSZWN0Ui55LCByZW5kZXJSZWN0Ui53aWR0aCwgcmVuZGVyUmVjdFIuaGVpZ2h0ICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0cmVuZGVyZXIuc2V0Vmlld3BvcnQoIHJlbmRlclJlY3RSLngsIHJlbmRlclJlY3RSLnksIHJlbmRlclJlY3RSLndpZHRoLCByZW5kZXJSZWN0Ui5oZWlnaHQgKTtcblx0XHRcdFx0cmVuZGVyZXIuc2V0U2Npc3NvciggcmVuZGVyUmVjdFIueCwgcmVuZGVyUmVjdFIueSwgcmVuZGVyUmVjdFIud2lkdGgsIHJlbmRlclJlY3RSLmhlaWdodCApO1xuXG5cdFx0XHR9XG5cdFx0XHRyZW5kZXJlci5yZW5kZXIoIHNjZW5lLCBjYW1lcmFSLCByZW5kZXJUYXJnZXQsIGZvcmNlQ2xlYXIgKTtcblxuXHRcdFx0aWYgKCByZW5kZXJUYXJnZXQgKSB7XG5cblx0XHRcdFx0cmVuZGVyVGFyZ2V0LnZpZXdwb3J0LnNldCggMCwgMCwgc2l6ZS53aWR0aCwgc2l6ZS5oZWlnaHQgKTtcblx0XHRcdFx0cmVuZGVyVGFyZ2V0LnNjaXNzb3Iuc2V0KCAwLCAwLCBzaXplLndpZHRoLCBzaXplLmhlaWdodCApO1xuXHRcdFx0XHRyZW5kZXJUYXJnZXQuc2Npc3NvclRlc3QgPSBmYWxzZTtcblx0XHRcdFx0cmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KCBudWxsICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0cmVuZGVyZXIuc2V0Vmlld3BvcnQoIDAsIDAsIHNpemUud2lkdGgsIHNpemUuaGVpZ2h0ICk7XG5cdFx0XHRcdHJlbmRlcmVyLnNldFNjaXNzb3JUZXN0KCBmYWxzZSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggYXV0b1VwZGF0ZSApIHtcblxuXHRcdFx0XHRzY2VuZS5hdXRvVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHNjb3BlLmF1dG9TdWJtaXRGcmFtZSApIHtcblxuXHRcdFx0XHRzY29wZS5zdWJtaXRGcmFtZSgpO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdC8vIFJlZ3VsYXIgcmVuZGVyIG1vZGUgaWYgbm90IEhNRFxuXG5cdFx0cmVuZGVyZXIucmVuZGVyKCBzY2VuZSwgY2FtZXJhLCByZW5kZXJUYXJnZXQsIGZvcmNlQ2xlYXIgKTtcblxuXHR9O1xuXG5cdHRoaXMuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCAndnJkaXNwbGF5cHJlc2VudGNoYW5nZScsIG9uVlJEaXNwbGF5UHJlc2VudENoYW5nZSwgZmFsc2UgKTtcblxuXHR9O1xuXG5cdC8vXG5cblx0ZnVuY3Rpb24gZm92VG9ORENTY2FsZU9mZnNldCggZm92ICkge1xuXG5cdFx0dmFyIHB4c2NhbGUgPSAyLjAgLyAoIGZvdi5sZWZ0VGFuICsgZm92LnJpZ2h0VGFuICk7XG5cdFx0dmFyIHB4b2Zmc2V0ID0gKCBmb3YubGVmdFRhbiAtIGZvdi5yaWdodFRhbiApICogcHhzY2FsZSAqIDAuNTtcblx0XHR2YXIgcHlzY2FsZSA9IDIuMCAvICggZm92LnVwVGFuICsgZm92LmRvd25UYW4gKTtcblx0XHR2YXIgcHlvZmZzZXQgPSAoIGZvdi51cFRhbiAtIGZvdi5kb3duVGFuICkgKiBweXNjYWxlICogMC41O1xuXHRcdHJldHVybiB7IHNjYWxlOiBbIHB4c2NhbGUsIHB5c2NhbGUgXSwgb2Zmc2V0OiBbIHB4b2Zmc2V0LCBweW9mZnNldCBdIH07XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGZvdlBvcnRUb1Byb2plY3Rpb24oIGZvdiwgcmlnaHRIYW5kZWQsIHpOZWFyLCB6RmFyICkge1xuXG5cdFx0cmlnaHRIYW5kZWQgPSByaWdodEhhbmRlZCA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IHJpZ2h0SGFuZGVkO1xuXHRcdHpOZWFyID0gek5lYXIgPT09IHVuZGVmaW5lZCA/IDAuMDEgOiB6TmVhcjtcblx0XHR6RmFyID0gekZhciA9PT0gdW5kZWZpbmVkID8gMTAwMDAuMCA6IHpGYXI7XG5cblx0XHR2YXIgaGFuZGVkbmVzc1NjYWxlID0gcmlnaHRIYW5kZWQgPyAtIDEuMCA6IDEuMDtcblxuXHRcdC8vIHN0YXJ0IHdpdGggYW4gaWRlbnRpdHkgbWF0cml4XG5cdFx0dmFyIG1vYmogPSBuZXcgTWF0cml4NCgpO1xuXHRcdHZhciBtID0gbW9iai5lbGVtZW50cztcblxuXHRcdC8vIGFuZCB3aXRoIHNjYWxlL29mZnNldCBpbmZvIGZvciBub3JtYWxpemVkIGRldmljZSBjb29yZHNcblx0XHR2YXIgc2NhbGVBbmRPZmZzZXQgPSBmb3ZUb05EQ1NjYWxlT2Zmc2V0KCBmb3YgKTtcblxuXHRcdC8vIFggcmVzdWx0LCBtYXAgY2xpcCBlZGdlcyB0byBbLXcsK3ddXG5cdFx0bVsgMCAqIDQgKyAwIF0gPSBzY2FsZUFuZE9mZnNldC5zY2FsZVsgMCBdO1xuXHRcdG1bIDAgKiA0ICsgMSBdID0gMC4wO1xuXHRcdG1bIDAgKiA0ICsgMiBdID0gc2NhbGVBbmRPZmZzZXQub2Zmc2V0WyAwIF0gKiBoYW5kZWRuZXNzU2NhbGU7XG5cdFx0bVsgMCAqIDQgKyAzIF0gPSAwLjA7XG5cblx0XHQvLyBZIHJlc3VsdCwgbWFwIGNsaXAgZWRnZXMgdG8gWy13LCt3XVxuXHRcdC8vIFkgb2Zmc2V0IGlzIG5lZ2F0ZWQgYmVjYXVzZSB0aGlzIHByb2ogbWF0cml4IHRyYW5zZm9ybXMgZnJvbSB3b3JsZCBjb29yZHMgd2l0aCBZPXVwLFxuXHRcdC8vIGJ1dCB0aGUgTkRDIHNjYWxpbmcgaGFzIFk9ZG93biAodGhhbmtzIEQzRD8pXG5cdFx0bVsgMSAqIDQgKyAwIF0gPSAwLjA7XG5cdFx0bVsgMSAqIDQgKyAxIF0gPSBzY2FsZUFuZE9mZnNldC5zY2FsZVsgMSBdO1xuXHRcdG1bIDEgKiA0ICsgMiBdID0gLSBzY2FsZUFuZE9mZnNldC5vZmZzZXRbIDEgXSAqIGhhbmRlZG5lc3NTY2FsZTtcblx0XHRtWyAxICogNCArIDMgXSA9IDAuMDtcblxuXHRcdC8vIFogcmVzdWx0ICh1cCB0byB0aGUgYXBwKVxuXHRcdG1bIDIgKiA0ICsgMCBdID0gMC4wO1xuXHRcdG1bIDIgKiA0ICsgMSBdID0gMC4wO1xuXHRcdG1bIDIgKiA0ICsgMiBdID0gekZhciAvICggek5lYXIgLSB6RmFyICkgKiAtIGhhbmRlZG5lc3NTY2FsZTtcblx0XHRtWyAyICogNCArIDMgXSA9ICggekZhciAqIHpOZWFyICkgLyAoIHpOZWFyIC0gekZhciApO1xuXG5cdFx0Ly8gVyByZXN1bHQgKD0gWiBpbilcblx0XHRtWyAzICogNCArIDAgXSA9IDAuMDtcblx0XHRtWyAzICogNCArIDEgXSA9IDAuMDtcblx0XHRtWyAzICogNCArIDIgXSA9IGhhbmRlZG5lc3NTY2FsZTtcblx0XHRtWyAzICogNCArIDMgXSA9IDAuMDtcblxuXHRcdG1vYmoudHJhbnNwb3NlKCk7XG5cblx0XHRyZXR1cm4gbW9iajtcblxuXHR9XG5cblx0ZnVuY3Rpb24gZm92VG9Qcm9qZWN0aW9uKCBmb3YsIHJpZ2h0SGFuZGVkLCB6TmVhciwgekZhciApIHtcblxuXHRcdHZhciBERUcyUkFEID0gTWF0aC5QSSAvIDE4MC4wO1xuXG5cdFx0dmFyIGZvdlBvcnQgPSB7XG5cdFx0XHR1cFRhbjogTWF0aC50YW4oIGZvdi51cERlZ3JlZXMgKiBERUcyUkFEICksXG5cdFx0XHRkb3duVGFuOiBNYXRoLnRhbiggZm92LmRvd25EZWdyZWVzICogREVHMlJBRCApLFxuXHRcdFx0bGVmdFRhbjogTWF0aC50YW4oIGZvdi5sZWZ0RGVncmVlcyAqIERFRzJSQUQgKSxcblx0XHRcdHJpZ2h0VGFuOiBNYXRoLnRhbiggZm92LnJpZ2h0RGVncmVlcyAqIERFRzJSQUQgKVxuXHRcdH07XG5cblx0XHRyZXR1cm4gZm92UG9ydFRvUHJvamVjdGlvbiggZm92UG9ydCwgcmlnaHRIYW5kZWQsIHpOZWFyLCB6RmFyICk7XG5cblx0fVxuXG59O1xuIiwiaW1wb3J0IHtNYXRyaXg0fSBmcm9tICd0aHJlZSc7XG5cbiAgICAvKipcbiAqIEBhdXRob3IgZG1hcmNvcyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9kbWFyY29zXG4gKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tXG4gKiBAYXV0aG9yIGhhbHZ2ZXMgLyBodHRwczovL2dpdGh1Yi5jb20vaGFsdnZlcyAoaSBvbmx5IGVzNiBtb2R1bGVkIGl0KVxuICovXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZSQ29udHJvbHMge1xuICBjb25zdHJ1Y3RvcihjYW1lcmEsIG9uRXJyb3IpIHtcbiAgICB0aGlzLmNhbWVyYSA9IGNhbWVyYTtcbiAgICB0aGlzLnZyRGlzcGxheTtcbiAgICB0aGlzLnZyRGlzcGxheXM7XG4gICAgdGhpcy5zdGFuZGluZ01hdHJpeCA9IG5ldyBNYXRyaXg0KCk7XG4gICAgdGhpcy5mcmFtZURhdGEgPSBudWxsO1xuXG4gICAgaWYgKCdWUkZyYW1lRGF0YScgaW4gd2luZG93KSB7XG4gICAgICB0aGlzLmZyYW1lRGF0YSA9IG5ldyBWUkZyYW1lRGF0YSgpO1xuICAgIH1cblxuICAgIGlmIChuYXZpZ2F0b3IuZ2V0VlJEaXNwbGF5cykge1xuICAgICAgbmF2aWdhdG9yXG4gICAgICAgIC5nZXRWUkRpc3BsYXlzKClcbiAgICAgICAgLnRoZW4oKGRpc3BsYXlzKSA9PiB7XG4gICAgICAgICAgdGhpcy52ckRpc3BsYXlzID0gZGlzcGxheXM7XG4gICAgICAgICAgaWYgKGRpc3BsYXlzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMudnJEaXNwbGF5ID0gZGlzcGxheXNbMF07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChvbkVycm9yKSBvbkVycm9yKCdWUiBpbnB1dCBub3QgYXZhaWxhYmxlLicpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ1ZSQ29udHJvbHM6IFVuYWJsZSB0byBnZXQgVlIgRGlzcGxheXMnKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gdGhlIFJpZnQgU0RLIHJldHVybnMgdGhlIHBvc2l0aW9uIGluIG1ldGVyc1xuICAgIC8vIHRoaXMgc2NhbGUgZmFjdG9yIGFsbG93cyB0aGUgdXNlciB0byBkZWZpbmUgaG93IG1ldGVyc1xuICAgIC8vIGFyZSBjb252ZXJ0ZWQgdG8gc2NlbmUgdW5pdHMuXG4gICAgdGhpcy5zY2FsZSA9IDE7XG5cbiAgICAvLyBJZiB0cnVlIHdpbGwgdXNlIFwic3RhbmRpbmcgc3BhY2VcIiBjb29yZGluYXRlIHN5c3RlbSB3aGVyZSB5PTAgaXMgdGhlXG4gICAgLy8gZmxvb3IgYW5kIHg9MCwgej0wIGlzIHRoZSBjZW50ZXIgb2YgdGhlIHJvb20uXG4gICAgdGhpcy5zdGFuZGluZyA9IGZhbHNlO1xuXG4gICAgLy8gRGlzdGFuY2UgZnJvbSB0aGUgdXNlcnMgZXllcyB0byB0aGUgZmxvb3IgaW4gbWV0ZXJzLiBVc2VkIHdoZW5cbiAgICAvLyBzdGFuZGluZz10cnVlIGJ1dCB0aGUgVlJEaXNwbGF5IGRvZXNuJ3QgcHJvdmlkZSBzdGFnZVBhcmFtZXRlcnMuXG4gICAgdGhpcy51c2VySGVpZ2h0ID0gMS42O1xuICB9XG5cbiAgZ2V0VlJEaXNwbGF5KCkge1xuICAgIHJldHVybiB0aGlzLnZyRGlzcGxheTtcbiAgfTtcblxuICBzZXRWUkRpc3BsYXkodmFsdWUpIHtcbiAgICB0aGlzLnZyRGlzcGxheSA9IHZhbHVlO1xuICB9O1xuXG4gIGdldFZSRGlzcGxheXMoKSB7XG4gICAgY29uc29sZS53YXJuKCdWUkNvbnRyb2xzOiBnZXRWUkRpc3BsYXlzKCkgaXMgYmVpbmcgZGVwcmVjYXRlZC4nKTtcbiAgICByZXR1cm4gdGhpcy52ckRpc3BsYXlzO1xuICB9O1xuXG4gIGdldFN0YW5kaW5nTWF0cml4KCkge1xuICAgIHJldHVybiB0aGlzLnN0YW5kaW5nTWF0cml4O1xuICB9O1xuXG4gIHVwZGF0ZSgpIHtcbiAgICBjb25zdCBjYW1lcmEgPSB0aGlzLmNhbWVyYTtcblxuICAgIGlmICh0aGlzLnZyRGlzcGxheSkge1xuICAgICAgbGV0IHBvc2U7XG4gICAgICBpZiAodGhpcy52ckRpc3BsYXkuZ2V0RnJhbWVEYXRhKSB7XG4gICAgICAgIHRoaXMudnJEaXNwbGF5LmdldEZyYW1lRGF0YSh0aGlzLmZyYW1lRGF0YSk7XG4gICAgICAgIHBvc2UgPSB0aGlzLmZyYW1lRGF0YS5wb3NlO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnZyRGlzcGxheS5nZXRQb3NlKSB7XG4gICAgICAgIHBvc2UgPSB0aGlzLnZyRGlzcGxheS5nZXRQb3NlKCk7XG4gICAgICB9XG4gICAgICBpZiAocG9zZS5vcmllbnRhdGlvbiAhPT0gbnVsbCkge1xuICAgICAgICBjYW1lcmEucXVhdGVybmlvbi5mcm9tQXJyYXkocG9zZS5vcmllbnRhdGlvbik7XG4gICAgICB9XG4gICAgICBpZiAocG9zZS5wb3NpdGlvbiAhPT0gbnVsbCkge1xuICAgICAgICBjYW1lcmEucG9zaXRpb24uZnJvbUFycmF5KHBvc2UucG9zaXRpb24pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2FtZXJhLnBvc2l0aW9uLnNldCgwLCAwLCAwKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnN0YW5kaW5nKSB7XG4gICAgICAgIGlmICh0aGlzLnZyRGlzcGxheS5zdGFnZVBhcmFtZXRlcnMpIHtcbiAgICAgICAgICBjYW1lcmEudXBkYXRlTWF0cml4KCk7XG4gICAgICAgICAgdGhpcy5zdGFuZGluZ01hdHJpeC5mcm9tQXJyYXkodGhpcy52ckRpc3BsYXkuc3RhZ2VQYXJhbWV0ZXJzLnNpdHRpbmdUb1N0YW5kaW5nVHJhbnNmb3JtKTtcbiAgICAgICAgICBjYW1lcmEuYXBwbHlNYXRyaXgodGhpcy5zdGFuZGluZ01hdHJpeCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2FtZXJhLnBvc2l0aW9uLnNldFkoY2FtZXJhLnBvc2l0aW9uLnkgKyB0aGlzLnVzZXJIZWlnaHQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjYW1lcmEucG9zaXRpb24ubXVsdGlwbHlTY2FsYXIodGhpcy5zY2FsZSk7XG4gICAgfVxuICB9O1xuXG4gIGRpc3Bvc2UoKSB7XG4gICAgdGhpcy52ckRpc3BsYXkgPSBudWxsO1xuICB9O1xufTtcbiIsIi8qKlxuICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbVxuICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODdcbiAqXG4gKiBCYXNlZCBvbiBAdG9qaXJvJ3MgdnItc2FtcGxlcy11dGlscy5qc1xuICovXG5cbmV4cG9ydCBjb25zdCBXRUJWUiA9IHtcblxuXHRpc0F2YWlsYWJsZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnV0VCVlI6IGlzQXZhaWxhYmxlKCkgaXMgYmVpbmcgZGVwcmVjYXRlZC4gVXNlIC5jaGVja0F2YWlsYWJpbGl0eSgpIGluc3RlYWQuJyApO1xuXHRcdHJldHVybiBuYXZpZ2F0b3IuZ2V0VlJEaXNwbGF5cyAhPT0gdW5kZWZpbmVkO1xuXG5cdH0sXG5cblx0Y2hlY2tBdmFpbGFiaWxpdHk6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgUHJvbWlzZSggZnVuY3Rpb24oIHJlc29sdmUsIHJlamVjdCApIHtcblxuXHRcdFx0aWYgKCBuYXZpZ2F0b3IuZ2V0VlJEaXNwbGF5cyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdG5hdmlnYXRvci5nZXRWUkRpc3BsYXlzKCkudGhlbiggZnVuY3Rpb24gKCBkaXNwbGF5cyApIHtcblxuXHRcdFx0XHRcdGlmICggZGlzcGxheXMubGVuZ3RoID09PSAwICkge1xuXG5cdFx0XHRcdFx0XHRyZWplY3QoICdXZWJWUiBzdXBwb3J0ZWQsIGJ1dCBubyBWUkRpc3BsYXlzIGZvdW5kLicgKTtcblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdHJlc29sdmUoKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9ICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0cmVqZWN0KCAnWW91ciBicm93c2VyIGRvZXMgbm90IHN1cHBvcnQgV2ViVlIuIFNlZSA8YSBocmVmPVwiaHR0cHM6Ly93ZWJ2ci5pbmZvXCI+d2VidnIuaW5mbzwvYT4gZm9yIGFzc2lzdGFuY2UuJyApO1xuXG5cdFx0XHR9XG5cblx0XHR9ICk7XG5cblx0fSxcblxuXHRnZXRWUkRpc3BsYXk6IGZ1bmN0aW9uICggb25EaXNwbGF5ICkge1xuXG5cdFx0aWYgKCAnZ2V0VlJEaXNwbGF5cycgaW4gbmF2aWdhdG9yICkge1xuXG5cdFx0XHRuYXZpZ2F0b3IuZ2V0VlJEaXNwbGF5cygpXG5cdFx0XHRcdC50aGVuKCBmdW5jdGlvbiAoIGRpc3BsYXlzICkge1xuXHRcdFx0XHRcdG9uRGlzcGxheSggZGlzcGxheXNbIDAgXSApO1xuXHRcdFx0XHR9ICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHRnZXRNZXNzYWdlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdXRUJWUjogZ2V0TWVzc2FnZSgpIGlzIGJlaW5nIGRlcHJlY2F0ZWQuIFVzZSAuZ2V0TWVzc2FnZUNvbnRhaW5lciggbWVzc2FnZSApIGluc3RlYWQuJyApO1xuXG5cdFx0dmFyIG1lc3NhZ2U7XG5cblx0XHRpZiAoIG5hdmlnYXRvci5nZXRWUkRpc3BsYXlzICkge1xuXG5cdFx0XHRuYXZpZ2F0b3IuZ2V0VlJEaXNwbGF5cygpLnRoZW4oIGZ1bmN0aW9uICggZGlzcGxheXMgKSB7XG5cblx0XHRcdFx0aWYgKCBkaXNwbGF5cy5sZW5ndGggPT09IDAgKSBtZXNzYWdlID0gJ1dlYlZSIHN1cHBvcnRlZCwgYnV0IG5vIFZSRGlzcGxheXMgZm91bmQuJztcblxuXHRcdFx0fSApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0bWVzc2FnZSA9ICdZb3VyIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBXZWJWUi4gU2VlIDxhIGhyZWY9XCJodHRwOi8vd2VidnIuaW5mb1wiPndlYnZyLmluZm88L2E+IGZvciBhc3Npc3RhbmNlLic7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1lc3NhZ2UgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dmFyIGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICdkaXYnICk7XG5cdFx0XHRjb250YWluZXIuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuXHRcdFx0Y29udGFpbmVyLnN0eWxlLmxlZnQgPSAnMCc7XG5cdFx0XHRjb250YWluZXIuc3R5bGUudG9wID0gJzAnO1xuXHRcdFx0Y29udGFpbmVyLnN0eWxlLnJpZ2h0ID0gJzAnO1xuXHRcdFx0Y29udGFpbmVyLnN0eWxlLnpJbmRleCA9ICc5OTknO1xuXHRcdFx0Y29udGFpbmVyLmFsaWduID0gJ2NlbnRlcic7XG5cblx0XHRcdHZhciBlcnJvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICdkaXYnICk7XG5cdFx0XHRlcnJvci5zdHlsZS5mb250RmFtaWx5ID0gJ3NhbnMtc2VyaWYnO1xuXHRcdFx0ZXJyb3Iuc3R5bGUuZm9udFNpemUgPSAnMTZweCc7XG5cdFx0XHRlcnJvci5zdHlsZS5mb250U3R5bGUgPSAnbm9ybWFsJztcblx0XHRcdGVycm9yLnN0eWxlLmxpbmVIZWlnaHQgPSAnMjZweCc7XG5cdFx0XHRlcnJvci5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAnI2ZmZic7XG5cdFx0XHRlcnJvci5zdHlsZS5jb2xvciA9ICcjMDAwJztcblx0XHRcdGVycm9yLnN0eWxlLnBhZGRpbmcgPSAnMTBweCAyMHB4Jztcblx0XHRcdGVycm9yLnN0eWxlLm1hcmdpbiA9ICc1MHB4Jztcblx0XHRcdGVycm9yLnN0eWxlLmRpc3BsYXkgPSAnaW5saW5lLWJsb2NrJztcblx0XHRcdGVycm9yLmlubmVySFRNTCA9IG1lc3NhZ2U7XG5cdFx0XHRjb250YWluZXIuYXBwZW5kQ2hpbGQoIGVycm9yICk7XG5cblx0XHRcdHJldHVybiBjb250YWluZXI7XG5cblx0XHR9XG5cblx0fSxcblxuXHRnZXRNZXNzYWdlQ29udGFpbmVyOiBmdW5jdGlvbiAoIG1lc3NhZ2UgKSB7XG5cblx0XHR2YXIgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggJ2RpdicgKTtcblx0XHRjb250YWluZXIuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuXHRcdGNvbnRhaW5lci5zdHlsZS5sZWZ0ID0gJzAnO1xuXHRcdGNvbnRhaW5lci5zdHlsZS50b3AgPSAnMCc7XG5cdFx0Y29udGFpbmVyLnN0eWxlLnJpZ2h0ID0gJzAnO1xuXHRcdGNvbnRhaW5lci5zdHlsZS56SW5kZXggPSAnOTk5Jztcblx0XHRjb250YWluZXIuYWxpZ24gPSAnY2VudGVyJztcblxuXHRcdHZhciBlcnJvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICdkaXYnICk7XG5cdFx0ZXJyb3Iuc3R5bGUuZm9udEZhbWlseSA9ICdzYW5zLXNlcmlmJztcblx0XHRlcnJvci5zdHlsZS5mb250U2l6ZSA9ICcxNnB4Jztcblx0XHRlcnJvci5zdHlsZS5mb250U3R5bGUgPSAnbm9ybWFsJztcblx0XHRlcnJvci5zdHlsZS5saW5lSGVpZ2h0ID0gJzI2cHgnO1xuXHRcdGVycm9yLnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICcjZmZmJztcblx0XHRlcnJvci5zdHlsZS5jb2xvciA9ICcjMDAwJztcblx0XHRlcnJvci5zdHlsZS5wYWRkaW5nID0gJzEwcHggMjBweCc7XG5cdFx0ZXJyb3Iuc3R5bGUubWFyZ2luID0gJzUwcHgnO1xuXHRcdGVycm9yLnN0eWxlLmRpc3BsYXkgPSAnaW5saW5lLWJsb2NrJztcblx0XHRlcnJvci5pbm5lckhUTUwgPSBtZXNzYWdlO1xuXHRcdGNvbnRhaW5lci5hcHBlbmRDaGlsZCggZXJyb3IgKTtcblxuXHRcdHJldHVybiBjb250YWluZXI7XG5cblx0fSxcblxuXHRnZXRCdXR0b246IGZ1bmN0aW9uICggZGlzcGxheSwgY2FudmFzICkge1xuXG5cdFx0aWYgKCAnVlJFZmZlY3QnIGluIFRIUkVFICYmIGRpc3BsYXkgaW5zdGFuY2VvZiBUSFJFRS5WUkVmZmVjdCApIHtcblxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1dlYlZSLmdldEJ1dHRvbigpIG5vdyBleHBlY3RzIGEgVlJEaXNwbGF5LicgKTtcblx0XHRcdHJldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAnYnV0dG9uJyApO1xuXG5cdFx0fVxuXG5cdFx0dmFyIGJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICdidXR0b24nICk7XG5cdFx0YnV0dG9uLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcblx0XHRidXR0b24uc3R5bGUubGVmdCA9ICdjYWxjKDUwJSAtIDUwcHgpJztcblx0XHRidXR0b24uc3R5bGUuYm90dG9tID0gJzIwcHgnO1xuXHRcdGJ1dHRvbi5zdHlsZS53aWR0aCA9ICcxMDBweCc7XG5cdFx0YnV0dG9uLnN0eWxlLmJvcmRlciA9ICcwJztcblx0XHRidXR0b24uc3R5bGUucGFkZGluZyA9ICc4cHgnO1xuXHRcdGJ1dHRvbi5zdHlsZS5jdXJzb3IgPSAncG9pbnRlcic7XG5cdFx0YnV0dG9uLnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICcjMDAwJztcblx0XHRidXR0b24uc3R5bGUuY29sb3IgPSAnI2ZmZic7XG5cdFx0YnV0dG9uLnN0eWxlLmZvbnRGYW1pbHkgPSAnc2Fucy1zZXJpZic7XG5cdFx0YnV0dG9uLnN0eWxlLmZvbnRTaXplID0gJzEzcHgnO1xuXHRcdGJ1dHRvbi5zdHlsZS5mb250U3R5bGUgPSAnbm9ybWFsJztcblx0XHRidXR0b24uc3R5bGUudGV4dEFsaWduID0gJ2NlbnRlcic7XG5cdFx0YnV0dG9uLnN0eWxlLnpJbmRleCA9ICc5OTknO1xuXG5cdFx0aWYgKCBkaXNwbGF5ICkge1xuXG5cdFx0XHRidXR0b24udGV4dENvbnRlbnQgPSAnRU5URVIgVlInO1xuXHRcdFx0YnV0dG9uLm9uY2xpY2sgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdFx0ZGlzcGxheS5pc1ByZXNlbnRpbmcgPyBkaXNwbGF5LmV4aXRQcmVzZW50KCkgOiBkaXNwbGF5LnJlcXVlc3RQcmVzZW50KCBbIHsgc291cmNlOiBjYW52YXMgfSBdICk7XG5cblx0XHRcdH07XG5cblx0XHRcdHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCAndnJkaXNwbGF5cHJlc2VudGNoYW5nZScsIGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0XHRidXR0b24udGV4dENvbnRlbnQgPSBkaXNwbGF5LmlzUHJlc2VudGluZyA/ICdFWElUIFZSJyA6ICdFTlRFUiBWUic7XG5cblx0XHRcdH0sIGZhbHNlICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRidXR0b24udGV4dENvbnRlbnQgPSAnTk8gVlIgRElTUExBWSc7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gYnV0dG9uO1xuXG5cdH1cblxufTtcbiIsImltcG9ydCB7TG9vcCwgQ29udHJvbHNNb2R1bGUsIENhbWVyYUNvbXBvbmVudH0gZnJvbSAnd2hzJztcbmltcG9ydCB7UkVWSVNJT059IGZyb20gJ3RocmVlJztcblxuaW1wb3J0IHtWUkVmZmVjdH0gZnJvbSAnLi92ci9WUkVmZmVjdCc7XG5pbXBvcnQgVlJDb250cm9sc05hdGl2ZSBmcm9tICd0aHJlZS12cmNvbnRyb2xzLW1vZHVsZSc7XG5pbXBvcnQge1dFQlZSfSBmcm9tICcuL3ZyL1dlYlZSJztcblxuZXhwb3J0IHtcbiAgV0VCVlJcbn07XG5cbmV4cG9ydCBjbGFzcyBWUk1vZHVsZSB7XG4gIGNvbnN0cnVjdG9yKHBhcmFtcyA9IHt9KSB7XG4gICAgdGhpcy5wYXJhbXMgPSBPYmplY3QuYXNzaWduKHBhcmFtcywge1xuICAgICAgbWVzc2FnZTogdHJ1ZSxcbiAgICAgIGJ1dHRvbjogdHJ1ZVxuICAgIH0pO1xuXG4gICAgdGhpcy5zY2VuZSA9IG51bGw7XG4gICAgdGhpcy5jYW1lcmEgPSBudWxsO1xuICAgIHRoaXMuZWZmZWN0ID0gbnVsbDtcbiAgfVxuXG4gIG1hbmFnZXIobWFuYWdlcikge1xuICAgIG1hbmFnZXIuZGVmaW5lKCd2cicpO1xuXG4gICAgaWYgKFJFVklTSU9OID4gODYpIGNvbnNvbGUud2FybignUGxlYXNlIHVzZSBWUk1vZHVsZTIgZm9yIFRocmVlLmpzIF4wLjg3LjAgKHI4NyknKTtcblxuICAgIGNvbnN0IHJlbmRlcmluZyA9IG1hbmFnZXIudXNlKCdyZW5kZXJpbmcnKTtcbiAgICBjb25zdCByZW5kZXJlciA9IG1hbmFnZXIuZ2V0KCdyZW5kZXJlcicpO1xuXG4gICAgY29uc3QgcmVzaXplID0gbWFuYWdlci51c2UoJ3Jlc2l6ZScpO1xuXG4gICAgdGhpcy5lZmZlY3QgPSBuZXcgVlJFZmZlY3QocmVuZGVyZXIpO1xuXG4gICAgdGhpcy5zY2VuZSA9IG1hbmFnZXIuZ2V0KCdzY2VuZScpO1xuICAgIHRoaXMuY2FtZXJhID0gbWFuYWdlci5nZXQoJ2NhbWVyYScpO1xuXG4gICAgcmVuZGVyaW5nLmVmZmVjdCh0aGlzLmVmZmVjdCk7XG5cbiAgICAvLyBUT0RPOiBGaXggcmVzaXplLlxuXG4gICAgcmVzaXplLmFkZENhbGxiYWNrKCh3aWR0aCwgaGVpZ2h0KSA9PiB7XG4gICAgICB0aGlzLmVmZmVjdC5zZXRTaXplKCt3aWR0aCwgK2hlaWdodCk7XG4gICAgfSk7XG5cbiAgICAvLyBXRUJWUlxuICAgIGNvbnN0IHttZXNzYWdlLCBidXR0b259ID0gdGhpcy5wYXJhbXM7XG5cbiAgICBpZiAobWVzc2FnZSkgV0VCVlIuY2hlY2tBdmFpbGFiaWxpdHkoKS5jYXRjaChtZXNzYWdlID0+IHtcblx0XHRcdGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoV0VCVlIuZ2V0TWVzc2FnZUNvbnRhaW5lcihtZXNzYWdlKSk7XG5cdFx0fSk7XG5cbiAgICBpZiAoYnV0dG9uKSBXRUJWUi5nZXRWUkRpc3BsYXkoZGlzcGxheSA9PiB7XG4gICAgICBjb25zdCB2cmJ0biA9IFdFQlZSLmdldEJ1dHRvbihkaXNwbGF5LCByZW5kZXJlci5kb21FbGVtZW50KTtcbiAgICAgIHZyYnRuLmNsYXNzTmFtZSA9ICd2ci1idG4nO1xuXG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHZyYnRuKTtcbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVlIyTW9kdWxlIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5kaXNwbGF5ID0gbmV3IFByb21pc2UocmVzb2x2ZSA9PiBXRUJWUi5nZXRWUkRpc3BsYXkoZGlzcGxheSA9PiByZXNvbHZlKGRpc3BsYXkpKSk7XG4gIH1cblxuICBtYW5hZ2VyKG1hbmFnZXIpIHtcbiAgICBtYW5hZ2VyLmRlZmluZSgndnInKTtcblxuICAgIGNvbnN0IHJlbmRlcmVyID0gbWFuYWdlci5nZXQoJ3JlbmRlcmVyJyk7XG4gICAgcmVuZGVyZXIudnIuZW5hYmxlZCA9IHRydWU7XG4gICAgY29uc29sZS5sb2coUkVWSVNJT04pO1xuICAgIGNvbnNvbGUubG9nKDEpO1xuXG4gICAgdGhpcy5kaXNwbGF5LnRoZW4oZGlzcGxheSA9PiB7XG4gICAgICByZW5kZXJlci52ci5zZXREZXZpY2UoZGlzcGxheSk7XG5cbiAgICAgIGNvbnN0IHZyYnRuID0gV0VCVlIuZ2V0QnV0dG9uKGRpc3BsYXksIHJlbmRlcmVyLmRvbUVsZW1lbnQpO1xuICAgICAgdnJidG4uY2xhc3NOYW1lID0gJ3ZyLWJ0bic7XG5cbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodnJidG4pO1xuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBWUkNvbnRyb2xzIGV4dGVuZHMgQ29udHJvbHNNb2R1bGUge1xuICBjb25zdHJ1Y3Rvcih7b2JqZWN0LCBvbkVycm9yLCBpbnRlbnNpdHl9KSB7XG4gICAgY29uc3QgY29udHJvbHMgPSBuZXcgVlJDb250cm9sc05hdGl2ZShvYmplY3QubmF0aXZlLCBvbkVycm9yKTtcblxuICAgIGNvbnRyb2xzLnN0YW5kaW5nID0gdHJ1ZTtcbiAgICBjb250cm9scy5zY2FsZSA9IGludGVuc2l0eTtcblxuICAgIHN1cGVyKHtjb250cm9sc30pO1xuICB9XG59XG4iXSwibmFtZXMiOlsiZm4iLCJtb2R1bGUiLCJleHBvcnRzIiwiY3JlYXRlQ29tbW9uanNNb2R1bGUiLCJnbG9iYWwiLCJPYmplY3QiLCJwcm90b3R5cGUiLCJPcCIsImhhc093blByb3BlcnR5IiwiU3ltYm9sIiwiJFN5bWJvbCIsIml0ZXJhdG9yIiwiYXN5bmNJdGVyYXRvciIsInRvU3RyaW5nVGFnIiwicmVnZW5lcmF0b3JSdW50aW1lIiwicnVudGltZSIsImluTW9kdWxlIiwiaW5uZXJGbiIsIm91dGVyRm4iLCJzZWxmIiwidHJ5TG9jc0xpc3QiLCJHZW5lcmF0b3IiLCJjcmVhdGUiLCJwcm90b0dlbmVyYXRvciIsImdlbmVyYXRvciIsIl9pbnZva2UiLCJtYWtlSW52b2tlTWV0aG9kIiwiY29udGV4dCIsIndyYXAiLCJvYmoiLCJhcmciLCJ0eXBlIiwiY2FsbCIsImVyciIsIkl0ZXJhdG9yUHJvdG90eXBlIiwiaXRlcmF0b3JTeW1ib2wiLCJnZXRQcm90b3R5cGVPZiIsImdldFByb3RvIiwidmFsdWVzIiwiTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUiLCJoYXNPd24iLCJHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSIsIkdlbmVyYXRvckZ1bmN0aW9uIiwiR3AiLCJjb25zdHJ1Y3RvciIsInRvU3RyaW5nVGFnU3ltYm9sIiwiZGlzcGxheU5hbWUiLCJmb3JFYWNoIiwibWV0aG9kIiwiaXNHZW5lcmF0b3JGdW5jdGlvbiIsImdlbkZ1biIsImN0b3IiLCJuYW1lIiwibWFyayIsInNldFByb3RvdHlwZU9mIiwiX19wcm90b19fIiwiYXdyYXAiLCJfX2F3YWl0IiwicmVzb2x2ZSIsInJlamVjdCIsInRyeUNhdGNoIiwicmVjb3JkIiwicmVzdWx0IiwidmFsdWUiLCJ0aGVuIiwiaW52b2tlIiwidW53cmFwcGVkIiwicHJldmlvdXNQcm9taXNlIiwiY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmciLCJlbnF1ZXVlIiwiZGVmaW5lSXRlcmF0b3JNZXRob2RzIiwiQXN5bmNJdGVyYXRvciIsImFzeW5jSXRlcmF0b3JTeW1ib2wiLCJhc3luYyIsIml0ZXIiLCJuZXh0IiwiZG9uZSIsIkdlblN0YXRlU3VzcGVuZGVkU3RhcnQiLCJzdGF0ZSIsIkdlblN0YXRlRXhlY3V0aW5nIiwiR2VuU3RhdGVDb21wbGV0ZWQiLCJkZWxlZ2F0ZSIsIm1heWJlSW52b2tlRGVsZWdhdGUiLCJkZWxlZ2F0ZVJlc3VsdCIsIkNvbnRpbnVlU2VudGluZWwiLCJzZW50IiwiX3NlbnQiLCJkaXNwYXRjaEV4Y2VwdGlvbiIsImFicnVwdCIsIkdlblN0YXRlU3VzcGVuZGVkWWllbGQiLCJ1bmRlZmluZWQiLCJyZXR1cm4iLCJpbmZvIiwicmVzdWx0TmFtZSIsIm5leHRMb2MiLCJ0b1N0cmluZyIsImxvY3MiLCJ0cnlMb2MiLCJlbnRyeSIsImNhdGNoTG9jIiwiZmluYWxseUxvYyIsImFmdGVyTG9jIiwidHJ5RW50cmllcyIsInB1c2giLCJjb21wbGV0aW9uIiwicHVzaFRyeUVudHJ5IiwicmVzZXQiLCJrZXlzIiwib2JqZWN0Iiwia2V5IiwicmV2ZXJzZSIsImxlbmd0aCIsInBvcCIsIml0ZXJhYmxlIiwiaXRlcmF0b3JNZXRob2QiLCJpc05hTiIsImkiLCJkb25lUmVzdWx0IiwiQ29udGV4dCIsInNraXBUZW1wUmVzZXQiLCJwcmV2IiwicmVzZXRUcnlFbnRyeSIsImNoYXJBdCIsInNsaWNlIiwic3RvcCIsInJvb3RFbnRyeSIsInJvb3RSZWNvcmQiLCJydmFsIiwiZXhjZXB0aW9uIiwibG9jIiwiY2F1Z2h0IiwiaGFzQ2F0Y2giLCJoYXNGaW5hbGx5IiwiZmluYWxseUVudHJ5IiwiY29tcGxldGUiLCJmaW5pc2giLCJkZWxlZ2F0ZVlpZWxkIiwiRnVuY3Rpb24iLCJnIiwiZ2V0T3duUHJvcGVydHlOYW1lcyIsImluZGV4T2YiLCJoYWRSdW50aW1lIiwib2xkUnVudGltZSIsImUiLCJydW50aW1lTW9kdWxlIiwiTWF0aCIsImNlaWwiLCJmbG9vciIsIml0IiwiVE9fU1RSSU5HIiwidGhhdCIsInBvcyIsIlN0cmluZyIsIl9kZWZpbmVkIiwiX3RvSW50ZWdlciIsInMiLCJiIiwibCIsImEiLCJjaGFyQ29kZUF0Iiwid2luZG93IiwiX19nIiwidmVyc2lvbiIsIl9fZSIsImNvcmUiLCJfY29yZSIsIl9hRnVuY3Rpb24iLCJjIiwiYXBwbHkiLCJhcmd1bWVudHMiLCJfaXNPYmplY3QiLCJleGVjIiwiX2ZhaWxzIiwiZGVmaW5lUHJvcGVydHkiLCJnZXQiLCJfZ2xvYmFsIiwiZG9jdW1lbnQiLCJkb2N1bWVudCQxIiwiY3JlYXRlRWxlbWVudCIsIl9kZXNjcmlwdG9ycyIsIl9kb21DcmVhdGUiLCJTIiwidmFsIiwidmFsdWVPZiIsIk8iLCJQIiwiQXR0cmlidXRlcyIsIl9hbk9iamVjdCIsIl90b1ByaW1pdGl2ZSIsIl9pZThEb21EZWZpbmUiLCJmIiwiYml0bWFwIiwiZW51bWVyYWJsZSIsImNvbmZpZ3VyYWJsZSIsIndyaXRhYmxlIiwiX3Byb3BlcnR5RGVzYyIsInNvdXJjZSIsIiRleHBvcnQiLCJGIiwiRyIsIkIiLCJXIiwiSVNfR0xPQkFMIiwiUFJPVE9UWVBFIiwiSVNfU1RBVElDIiwib3duIiwib3V0IiwiSVNfRk9SQ0VEIiwidGFyZ2V0IiwiX2hhcyIsIklTX0JJTkQiLCJfY3R4IiwiSVNfV1JBUCIsIkMiLCJJU19QUk9UTyIsInZpcnR1YWwiLCJSIiwiZXhwUHJvdG8iLCJfaGlkZSIsIlUiLCJwcm9wZXJ0eUlzRW51bWVyYWJsZSIsInNwbGl0IiwibWluIiwibWF4IiwiaW5kZXgiLCJtaW4kMSIsIklTX0lOQ0xVREVTIiwiJHRoaXMiLCJlbCIsImZyb21JbmRleCIsIl90b0lvYmplY3QiLCJfdG9MZW5ndGgiLCJfdG9BYnNvbHV0ZUluZGV4IiwiU0hBUkVEIiwic3RvcmUiLCJtb2RlIiwiX2xpYnJhcnkiLCJjb3B5cmlnaHQiLCJyYW5kb20iLCJjb25jYXQiLCJpZCIsInB4IiwiX3NoYXJlZCIsInNoYXJlZCIsIl91aWQiLCJfYXJyYXlJbmNsdWRlcyIsIl9zaGFyZWRLZXkiLCJuYW1lcyIsIklFX1BST1RPIiwiYXJyYXlJbmRleE9mIiwiX2VudW1CdWdLZXlzIiwiZGVmaW5lUHJvcGVydGllcyIsIlByb3BlcnRpZXMiLCJfb2JqZWN0S2V5cyIsIl9vYmplY3REcCIsImRvY3VtZW50JDIiLCJkb2N1bWVudEVsZW1lbnQiLCJpZnJhbWUiLCJzdHlsZSIsImRpc3BsYXkiLCJfaHRtbCIsImFwcGVuZENoaWxkIiwic3JjIiwiaWZyYW1lRG9jdW1lbnQiLCJjb250ZW50V2luZG93Iiwib3BlbiIsIndyaXRlIiwibHQiLCJndCIsImNsb3NlIiwiY3JlYXRlRGljdCIsIlBST1RPVFlQRSQxIiwiRW1wdHkiLCJJRV9QUk9UTyQxIiwiX29iamVjdERwcyIsIlVTRV9TWU1CT0wiLCIkZXhwb3J0cyIsIl93a3MiLCJ0YWciLCJzdGF0IiwiVEFHIiwiZGVmIiwiQ29uc3RydWN0b3IiLCJOQU1FIiwiX29iamVjdENyZWF0ZSIsIl9zZXRUb1N0cmluZ1RhZyIsIl90b09iamVjdCIsIklFX1BST1RPJDIiLCJPYmplY3RQcm90byIsIkJhc2UiLCJERUZBVUxUIiwiSVNfU0VUIiwiRk9SQ0VEIiwiX2l0ZXJDcmVhdGUiLCJraW5kIiwiQlVHR1kiLCJWQUxVRVMiLCJwcm90byIsIklURVJBVE9SIiwiRkZfSVRFUkFUT1IiLCIkbmF0aXZlIiwiZ2V0TWV0aG9kIiwiREVGX1ZBTFVFUyIsIiRkZWZhdWx0IiwiZW50cmllcyIsIiRhbnlOYXRpdmUiLCJfb2JqZWN0R3BvIiwiVkFMVUVTX0JVRyIsIl9pdGVyYXRvcnMiLCJyZXR1cm5UaGlzIiwibWV0aG9kcyIsIktFWVMiLCIkZW50cmllcyIsIl9yZWRlZmluZSIsIl9leHBvcnQiLCJfc3RyaW5nQXQiLCJfaXRlckRlZmluZSIsIml0ZXJhdGVkIiwiX3QiLCJfaSIsInBvaW50IiwiJGF0IiwiQXJyYXkiLCJfayIsIkFyZ3VtZW50cyIsIkRPTUl0ZXJhYmxlcyIsIkNvbGxlY3Rpb24iLCJUT19TVFJJTkdfVEFHIiwiX2NvZiIsIlQiLCJ0cnlHZXQiLCJUQUckMSIsIkFSRyIsImNhbGxlZSIsImZvcmJpZGRlbkZpZWxkIiwicmV0IiwiQXJyYXlQcm90byIsIklURVJBVE9SJDEiLCJnZXRJdGVyYXRvck1ldGhvZCIsIklURVJBVE9SJDIiLCJfY2xhc3NvZiIsImNvcmVfZ2V0SXRlcmF0b3JNZXRob2QiLCJzdGVwIiwiX2lzQXJyYXlJdGVyIiwiaXRlckZuIiwiQlJFQUsiLCJSRVRVUk4iLCJfaXRlckNhbGwiLCJEIiwiU1BFQ0lFUyIsImFyZ3MiLCJwcm9jZXNzIiwic2V0SW1tZWRpYXRlIiwiY2xlYXJJbW1lZGlhdGUiLCJNZXNzYWdlQ2hhbm5lbCIsIkRpc3BhdGNoIiwiY2hhbm5lbCIsInBvcnQiLCJxdWV1ZSIsImV2ZW50IiwicnVuIiwiZGF0YSIsInNldFRhc2siLCJjbGVhclRhc2siLCJjb3VudGVyIiwiZGVmZXIiLCJuZXh0VGljayIsIm5vdyIsInBvcnQyIiwicG9ydDEiLCJvbm1lc3NhZ2UiLCJsaXN0ZW5lciIsInBvc3RNZXNzYWdlIiwiYWRkRXZlbnRMaXN0ZW5lciIsImltcG9ydFNjcmlwdHMiLCJPTlJFQURZU1RBVEVDSEFOR0UiLCJyZW1vdmVDaGlsZCIsInNldFRpbWVvdXQiLCJzZXQiLCJjbGVhciIsIl90YXNrIiwiTXV0YXRpb25PYnNlcnZlciIsIldlYktpdE11dGF0aW9uT2JzZXJ2ZXIiLCJQcm9taXNlIiwicHJvY2VzcyQxIiwibGFzdCIsIm5vdGlmeSIsImlzTm9kZSIsInBhcmVudCIsImRvbWFpbiIsImV4aXQiLCJoZWFkIiwiZW50ZXIiLCJmbHVzaCIsIk9ic2VydmVyIiwibmF2aWdhdG9yIiwic3RhbmRhbG9uZSIsImNyZWF0ZVRleHROb2RlIiwib2JzZXJ2ZSIsIm5vZGUiLCJjaGFyYWN0ZXJEYXRhIiwidG9nZ2xlIiwiUHJvbWlzZSQxIiwicHJvbWlzZSIsIm1hY3JvdGFzayIsInRhc2siLCIkJHJlc29sdmUiLCIkJHJlamVjdCIsImYkMSIsInYiLCJ1c2VyQWdlbnQiLCJ4IiwiX25ld1Byb21pc2VDYXBhYmlsaXR5IiwicHJvbWlzZUNhcGFiaWxpdHkiLCJzYWZlIiwiS0VZIiwiU1BFQ0lFUyQxIiwiSVRFUkFUT1IkMyIsInJpdGVyIiwiU0FGRV9DTE9TSU5HIiwic2tpcENsb3NpbmciLCJhcnIiLCJfbWljcm90YXNrIiwiVHlwZUVycm9yIiwicHJvY2VzcyQyIiwidmVyc2lvbnMiLCJ2OCIsIlBST01JU0UiLCJuZXdHZW5lcmljUHJvbWlzZUNhcGFiaWxpdHkiLCJPd25Qcm9taXNlQ2FwYWJpbGl0eSIsIldyYXBwZXIiLCIkUHJvbWlzZSIsImVtcHR5IiwiaXNOb2RlJDEiLCJfdXNlckFnZW50IiwiaXNSZWplY3QiLCJfbiIsIl9jIiwibWljcm90YXNrIiwiX3YiLCJfcyIsInJlYWN0aW9uIiwib2siLCJmYWlsIiwiZXhpdGVkIiwiaGFuZGxlciIsIl9oIiwib25IYW5kbGVVbmhhbmRsZWQiLCJUeXBlRXJyb3IkMSIsImlzVGhlbmFibGUiLCJjaGFpbiIsIm9uVW5oYW5kbGVkIiwiaXNVbmhhbmRsZWQiLCJjb25zb2xlIiwidW5oYW5kbGVkIiwiX3BlcmZvcm0iLCJlbWl0Iiwib251bmhhbmRsZWRyZWplY3Rpb24iLCJyZWFzb24iLCJlcnJvciIsIl9hIiwib25yZWplY3Rpb25oYW5kbGVkIiwiX2QiLCJfdyIsIiRyZXNvbHZlIiwid3JhcHBlciIsIiRyZWplY3QiLCJVU0VfTkFUSVZFIiwiZXhlY3V0b3IiLCJfYW5JbnN0YW5jZSIsIkludGVybmFsIiwiX3JlZGVmaW5lQWxsIiwib25GdWxmaWxsZWQiLCJvblJlamVjdGVkIiwibmV3UHJvbWlzZUNhcGFiaWxpdHkiLCJfc3BlY2llc0NvbnN0cnVjdG9yIiwiX3NldFNwZWNpZXMiLCJyIiwiY2FwYWJpbGl0eSIsIl9pdGVyRGV0ZWN0IiwiYWxsIiwiX2Zvck9mIiwicmVtYWluaW5nIiwiYWxyZWFkeUNhbGxlZCIsIiRpbmRleCIsInJhY2UiLCJvbkZpbmFsbHkiLCJpc0Z1bmN0aW9uIiwiY2FsbGJhY2tmbiIsImdlbiIsInByb21pc2UkMSIsIl9uZXh0IiwiX3Rocm93IiwiX2FzeW5jVG9HZW5lcmF0b3IiLCJmJDIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJnT1BEIiwiX29iamVjdFBpZSIsImYkMyIsImV4cCIsIl9vYmplY3RHb3BkIiwiX29iamVjdFNhcCIsImlzRXh0ZW5zaWJsZSIsInByZXZlbnRFeHRlbnNpb25zIiwic2V0RGVzYyIsIk1FVEEiLCJ3Iiwic2V0TWV0YSIsIkZSRUVaRSIsIm1ldGEiLCJORUVEIiwiZmFzdEtleSIsImdldFdlYWsiLCJvbkZyZWV6ZSIsIl9tZXRhIiwiZiQ0IiwiX3drc0V4dCIsImdldE93blByb3BlcnR5U3ltYm9scyIsImYkNSIsIl9vYmplY3RHb3BzIiwiZ2V0U3ltYm9scyIsInN5bWJvbHMiLCJpc0VudW0iLCJpc0FycmF5IiwiaGlkZGVuS2V5cyIsImYkNiIsIl9vYmplY3RHb3BuIiwidG9TdHJpbmckMSIsImdldFdpbmRvd05hbWVzIiwiZ09QTiIsImYkNyIsIl9vYmplY3RHb3BuRXh0IiwiSlNPTiIsIiRKU09OIiwic3RyaW5naWZ5IiwiUFJPVE9UWVBFJDIiLCJRT2JqZWN0IiwiZmluZENoaWxkIiwiZFAkMSIsImdPUEQkMSIsIk9iamVjdFByb3RvJDEiLCJwcm90b0Rlc2MiLCJBbGxTeW1ib2xzIiwic3ltIiwiVVNFX05BVElWRSQxIiwiJGRlZmluZVByb3BlcnR5IiwiT1BTeW1ib2xzIiwiSElEREVOIiwiX2VudW1LZXlzIiwiJGRlZmluZVByb3BlcnRpZXMiLCJFIiwiZ09QTiQxIiwiSVNfT1AiLCIkc2V0Iiwic2V0U3ltYm9sRGVzYyIsInNldHRlciIsIiRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IkMSIsIiRnZXRPd25Qcm9wZXJ0eU5hbWVzIiwiJHByb3BlcnR5SXNFbnVtZXJhYmxlIiwiJGdldE93blByb3BlcnR5U3ltYm9scyIsImoiLCJlczZTeW1ib2xzIiwiayIsIndlbGxLbm93blN5bWJvbHMiLCJfd2tzRGVmaW5lIiwiU3ltYm9sUmVnaXN0cnkiLCJrZXlGb3IiLCJpc1N5bWJvbCIsInVzZVNldHRlciIsInVzZVNpbXBsZSIsIiRjcmVhdGUiLCJfc3RyaW5naWZ5IiwiJHJlcGxhY2VyIiwicmVwbGFjZXIiLCJfaXNBcnJheSIsIlRPX1BSSU1JVElWRSIsImRlc2MiLCJkZWZpbmVQcm9wZXJ0eSQxIiwiZGVmaW5lUHJvcGVydHkkMiIsIl9kZWZpbmVQcm9wZXJ0eSIsImtleXMkMSIsIm93bktleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMkMSIsImZpbHRlciIsImRlZmluZVByb3BlcnR5JDMiLCJfb2JqZWN0U3ByZWFkIiwiaW5zdGFuY2UiLCJfY2xhc3NDYWxsQ2hlY2siLCJ0ZXN0IiwiYnVnZ3kiLCJjaGVjayIsIl9zZXRQcm90byIsIm8iLCJwIiwiX3NldFByb3RvdHlwZU9mIiwic2V0UHJvdG90eXBlT2YkMSIsInN1YkNsYXNzIiwic3VwZXJDbGFzcyIsInNldFByb3RvdHlwZU9mJDIiLCJfaW5oZXJpdHMiLCJwcm9wcyIsImRlc2NyaXB0b3IiLCJwcm90b1Byb3BzIiwic3RhdGljUHJvcHMiLCJfZGVmaW5lUHJvcGVydGllcyIsIl9jcmVhdGVDbGFzcyIsInN5bWJvbCIsIl90eXBlb2YyIiwic3ltYm9sJDEiLCJpdGVyYXRvciQxIiwiX3R5cGVvZiIsIl9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQiLCJfdHlwZW9mXzEiLCJfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybiIsIl9nZXRQcm90b3R5cGVPZiIsImdldFByb3RvdHlwZU9mJDEiLCJleHRlbnNpb25zIiwiX2xlbiIsIl9rZXkiLCJleHRlbnNpb24iLCJfc3RlcCIsIl9pdGVyYXRvck5vcm1hbENvbXBsZXRpb24iLCJfaXRlcmF0b3IiLCJwcm9wIiwiZXh0ZW5kIiwiX2RpZEl0ZXJhdG9yRXJyb3IiLCJfaXRlcmF0b3JFcnJvciIsImFycmF5IiwiaW5zdEFycmF5IiwidGVtcE9iamVjdCIsImd1aWRlIiwiaW5zdHJ1Y3Rpb25zIiwiaW5zdHJ1Y3QiLCJ0cmFuc2Zvcm1EYXRhIiwiTnVtYmVyIiwiRVBTSUxPTiIsInBvdyIsImlzSW50ZWdlciIsImlzRmluaXRlIiwic2lnbiIsIm1hdGNoIiwiYXNzaWduIiwibmV4dEtleSIsIm91dHB1dCIsIkV2ZW50RGlzcGF0Y2hlciIsIl9saXN0ZW5lcnMiLCJsaXN0ZW5lcnMiLCJoYXNFdmVudExpc3RlbmVyIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsImxpc3RlbmVyQXJyYXkiLCJzcGxpY2UiLCJkaXNwYXRjaEV2ZW50IiwiTEVGVCIsIk1JRERMRSIsIlJJR0hUIiwiREVHMlJBRCIsIlBJIiwiUkFEMkRFRyIsImdlbmVyYXRlVVVJRCIsImx1dCIsImQwIiwiZDEiLCJkMiIsImQzIiwidG9VcHBlckNhc2UiLCJjbGFtcCIsImV1Y2xpZGVhbk1vZHVsbyIsIm4iLCJtIiwibWFwTGluZWFyIiwiYTEiLCJhMiIsImIxIiwiYjIiLCJsZXJwIiwieSIsInQiLCJzbW9vdGhzdGVwIiwic21vb3RoZXJzdGVwIiwicmFuZEludCIsImxvdyIsImhpZ2giLCJyYW5kRmxvYXQiLCJyYW5kRmxvYXRTcHJlYWQiLCJyYW5nZSIsImRlZ1RvUmFkIiwiZGVncmVlcyIsIl9NYXRoIiwicmFkVG9EZWciLCJyYWRpYW5zIiwiaXNQb3dlck9mVHdvIiwiY2VpbFBvd2VyT2ZUd28iLCJsb2ciLCJMTjIiLCJmbG9vclBvd2VyT2ZUd28iLCJWZWN0b3IyIiwiaXNWZWN0b3IyIiwic2V0U2NhbGFyIiwic2NhbGFyIiwic2V0WCIsInNldFkiLCJzZXRDb21wb25lbnQiLCJnZXRDb21wb25lbnQiLCJjbG9uZSIsImNvcHkiLCJhZGQiLCJ3YXJuIiwiYWRkVmVjdG9ycyIsImFkZFNjYWxhciIsImFkZFNjYWxlZFZlY3RvciIsInN1YiIsInN1YlZlY3RvcnMiLCJzdWJTY2FsYXIiLCJtdWx0aXBseSIsIm11bHRpcGx5U2NhbGFyIiwiZGl2aWRlIiwiZGl2aWRlU2NhbGFyIiwiYXBwbHlNYXRyaXgzIiwiZWxlbWVudHMiLCJjbGFtcFNjYWxhciIsIm1pblZhbCIsIm1heFZhbCIsImNsYW1wTGVuZ3RoIiwicm91bmQiLCJyb3VuZFRvWmVybyIsIm5lZ2F0ZSIsImRvdCIsImxlbmd0aFNxIiwic3FydCIsIm1hbmhhdHRhbkxlbmd0aCIsImFicyIsIm5vcm1hbGl6ZSIsImFuZ2xlIiwiYXRhbjIiLCJkaXN0YW5jZVRvIiwiZGlzdGFuY2VUb1NxdWFyZWQiLCJkeSIsImR4IiwibWFuaGF0dGFuRGlzdGFuY2VUbyIsInNldExlbmd0aCIsImFscGhhIiwibGVycFZlY3RvcnMiLCJ2MSIsInYyIiwiZXF1YWxzIiwiZnJvbUFycmF5Iiwib2Zmc2V0IiwidG9BcnJheSIsImZyb21CdWZmZXJBdHRyaWJ1dGUiLCJhdHRyaWJ1dGUiLCJnZXRYIiwiZ2V0WSIsInJvdGF0ZUFyb3VuZCIsImNlbnRlciIsImNvcyIsInNpbiIsIk1hdHJpeDQiLCJpc01hdHJpeDQiLCJuMTEiLCJuMTIiLCJuMTMiLCJuMTQiLCJuMjEiLCJuMjIiLCJuMjMiLCJuMjQiLCJuMzEiLCJuMzIiLCJuMzMiLCJuMzQiLCJuNDEiLCJuNDIiLCJuNDMiLCJuNDQiLCJ0ZSIsImlkZW50aXR5IiwibWUiLCJjb3B5UG9zaXRpb24iLCJleHRyYWN0QmFzaXMiLCJ4QXhpcyIsInlBeGlzIiwiekF4aXMiLCJzZXRGcm9tTWF0cml4Q29sdW1uIiwibWFrZUJhc2lzIiwieiIsImV4dHJhY3RSb3RhdGlvbiIsInNjYWxlWCIsInNjYWxlWSIsInNjYWxlWiIsIm1ha2VSb3RhdGlvbkZyb21FdWxlciIsImV1bGVyIiwiaXNFdWxlciIsImQiLCJvcmRlciIsImFmIiwiYmUiLCJiZiIsImFlIiwiY2YiLCJkZSIsImRmIiwiY2UiLCJhZCIsImJjIiwiYmQiLCJhYyIsIm1ha2VSb3RhdGlvbkZyb21RdWF0ZXJuaW9uIiwicSIsIl94IiwiX3kiLCJfeiIsInkyIiwiejIiLCJ4MiIsInh5IiwieHoiLCJ5eiIsInp6Iiwid3kiLCJ3eiIsInl5IiwieHgiLCJ3eCIsImxvb2tBdCIsImV5ZSIsInVwIiwiY3Jvc3NWZWN0b3JzIiwibXVsdGlwbHlNYXRyaWNlcyIsInByZW11bHRpcGx5IiwiYTEyIiwiYTEzIiwiYTE0IiwiYTIyIiwiYTIzIiwiYTI0IiwiYTMyIiwiYTMzIiwiYTM0IiwiYTQyIiwiYTQzIiwiYTQ0IiwiYjEyIiwiYjEzIiwiYjE0IiwiYjIyIiwiYjIzIiwiYjI0IiwiYjMyIiwiYjMzIiwiYjM0IiwiYjQyIiwiYjQzIiwiYjQ0IiwiYTExIiwiYjExIiwiYjIxIiwiYjMxIiwiYjQxIiwiYTIxIiwiYTMxIiwiYTQxIiwiYXBwbHlUb0J1ZmZlckF0dHJpYnV0ZSIsImNvdW50IiwiZ2V0WiIsImFwcGx5TWF0cml4NCIsInNldFhZWiIsImRldGVybWluYW50IiwidHJhbnNwb3NlIiwidG1wIiwic2V0UG9zaXRpb24iLCJnZXRJbnZlcnNlIiwidGhyb3dPbkRlZ2VuZXJhdGUiLCJ0MTEiLCJ0MTIiLCJ0MTMiLCJ0MTQiLCJkZXQiLCJtc2ciLCJkZXRJbnYiLCJzY2FsZSIsImdldE1heFNjYWxlT25BeGlzIiwic2NhbGVYU3EiLCJzY2FsZVlTcSIsInNjYWxlWlNxIiwibWFrZVRyYW5zbGF0aW9uIiwibWFrZVJvdGF0aW9uWCIsInRoZXRhIiwibWFrZVJvdGF0aW9uWSIsIm1ha2VSb3RhdGlvbloiLCJtYWtlUm90YXRpb25BeGlzIiwiYXhpcyIsInR5IiwidHgiLCJtYWtlU2NhbGUiLCJtYWtlU2hlYXIiLCJjb21wb3NlIiwicG9zaXRpb24iLCJxdWF0ZXJuaW9uIiwiZGVjb21wb3NlIiwidmVjdG9yIiwic3giLCJtYXRyaXgiLCJzeSIsInN6IiwiaW52U1giLCJpbnZTWSIsImludlNaIiwic2V0RnJvbVJvdGF0aW9uTWF0cml4IiwibWFrZVBlcnNwZWN0aXZlIiwibGVmdCIsInJpZ2h0IiwidG9wIiwiYm90dG9tIiwibmVhciIsImZhciIsIm1ha2VPcnRob2dyYXBoaWMiLCJoIiwiUXVhdGVybmlvbiIsInNsZXJwIiwicWEiLCJxYiIsInFtIiwic2xlcnBGbGF0IiwiZHN0IiwiZHN0T2Zmc2V0Iiwic3JjMCIsInNyY09mZnNldDAiLCJzcmMxIiwic3JjT2Zmc2V0MSIsInkwIiwiejAiLCJ3MCIsIngxIiwieTEiLCJ6MSIsIncxIiwieDAiLCJkaXIiLCJzcXJTaW4iLCJsZW4iLCJ0RGlyIiwib25DaGFuZ2VDYWxsYmFjayIsInNldEZyb21FdWxlciIsInVwZGF0ZSIsInMxIiwiYzIiLCJjMyIsImMxIiwiczIiLCJzMyIsInNldEZyb21BeGlzQW5nbGUiLCJoYWxmQW5nbGUiLCJtMTEiLCJtMTIiLCJtMTMiLCJtMjEiLCJtMjIiLCJtMjMiLCJtMzEiLCJtMzIiLCJtMzMiLCJ0cmFjZSIsInNldEZyb21Vbml0VmVjdG9ycyIsInZGcm9tIiwidlRvIiwiRVBTIiwiaW52ZXJzZSIsImNvbmp1Z2F0ZSIsIm11bHRpcGx5UXVhdGVybmlvbnMiLCJxYXkiLCJxYXoiLCJxYXciLCJxYnkiLCJxYnoiLCJxYnciLCJxYXgiLCJxYngiLCJjb3NIYWxmVGhldGEiLCJzaW5IYWxmVGhldGEiLCJoYWxmVGhldGEiLCJyYXRpb0IiLCJyYXRpb0EiLCJvbkNoYW5nZSIsImNhbGxiYWNrIiwiVmVjdG9yMyIsImlzVmVjdG9yMyIsInNldFoiLCJtdWx0aXBseVZlY3RvcnMiLCJhcHBseUV1bGVyIiwiYXBwbHlRdWF0ZXJuaW9uIiwiYXBwbHlBeGlzQW5nbGUiLCJxeSIsInF6IiwicXciLCJxeCIsIml4IiwiaXciLCJpeSIsIml6IiwicHJvamVjdCIsImNhbWVyYSIsInByb2plY3Rpb25NYXRyaXgiLCJtYXRyaXhXb3JsZCIsInVucHJvamVjdCIsInRyYW5zZm9ybURpcmVjdGlvbiIsImNyb3NzIiwiYXkiLCJheiIsImJ5IiwiYnoiLCJieCIsImF4IiwicHJvamVjdE9uVmVjdG9yIiwicHJvamVjdE9uUGxhbmUiLCJwbGFuZU5vcm1hbCIsInJlZmxlY3QiLCJub3JtYWwiLCJhbmdsZVRvIiwiYWNvcyIsImR6Iiwic2V0RnJvbVNwaGVyaWNhbCIsInBoaSIsInJhZGl1cyIsInNpblBoaVJhZGl1cyIsInNldEZyb21DeWxpbmRyaWNhbCIsInNldEZyb21NYXRyaXhQb3NpdGlvbiIsInNldEZyb21NYXRyaXhTY2FsZSIsIk1hdHJpeDMiLCJpc01hdHJpeDMiLCJzZXRGcm9tTWF0cml4NCIsImdldE5vcm1hbE1hdHJpeCIsIm1hdHJpeDQiLCJ0cmFuc3Bvc2VJbnRvQXJyYXkiLCJzZXRVdlRyYW5zZm9ybSIsInJvdGF0aW9uIiwiY3giLCJjeSIsInJvdGF0ZSIsInRyYW5zbGF0ZSIsImltYWdlIiwibWFwcGluZyIsIndyYXBTIiwid3JhcFQiLCJtYWdGaWx0ZXIiLCJtaW5GaWx0ZXIiLCJmb3JtYXQiLCJhbmlzb3Ryb3B5IiwiZW5jb2RpbmciLCJ0ZXh0dXJlSWQiLCJ1dWlkIiwiVGV4dHVyZSIsIkRFRkFVTFRfSU1BR0UiLCJtaXBtYXBzIiwiREVGQVVMVF9NQVBQSU5HIiwiQ2xhbXBUb0VkZ2VXcmFwcGluZyIsIkxpbmVhckZpbHRlciIsIkxpbmVhck1pcE1hcExpbmVhckZpbHRlciIsIlJHQkFGb3JtYXQiLCJVbnNpZ25lZEJ5dGVUeXBlIiwicmVwZWF0IiwibWF0cml4QXV0b1VwZGF0ZSIsImdlbmVyYXRlTWlwbWFwcyIsInByZW11bHRpcGx5QWxwaGEiLCJmbGlwWSIsInVucGFja0FsaWdubWVudCIsIkxpbmVhckVuY29kaW5nIiwib25VcGRhdGUiLCJVVk1hcHBpbmciLCJpc1RleHR1cmUiLCJ1cGRhdGVNYXRyaXgiLCJ0b0pTT04iLCJpc1Jvb3RPYmplY3QiLCJ0ZXh0dXJlcyIsImNhbnZhcyIsImNyZWF0ZUVsZW1lbnROUyIsIndpZHRoIiwiaGVpZ2h0IiwiZ2V0Q29udGV4dCIsInB1dEltYWdlRGF0YSIsImRyYXdJbWFnZSIsInRvRGF0YVVSTCIsIm1ldGFkYXRhIiwiaW1hZ2VzIiwidXJsIiwiZ2V0RGF0YVVSTCIsImRpc3Bvc2UiLCJ0cmFuc2Zvcm1VdiIsInV2IiwiVmVjdG9yNCIsImlzVmVjdG9yNCIsInNldFciLCJzZXRBeGlzQW5nbGVGcm9tUXVhdGVybmlvbiIsInNldEF4aXNBbmdsZUZyb21Sb3RhdGlvbk1hdHJpeCIsImVwc2lsb24iLCJlcHNpbG9uMiIsImdldFciLCJvcHRpb25zIiwic2Npc3NvciIsInNjaXNzb3JUZXN0Iiwidmlld3BvcnQiLCJ0ZXh0dXJlIiwiZGVwdGhCdWZmZXIiLCJzdGVuY2lsQnVmZmVyIiwiZGVwdGhUZXh0dXJlIiwiV2ViR0xSZW5kZXJUYXJnZXQiLCJpc1dlYkdMUmVuZGVyVGFyZ2V0Iiwic2V0U2l6ZSIsImFjdGl2ZUN1YmVGYWNlIiwiYWN0aXZlTWlwTWFwTGV2ZWwiLCJXZWJHTFJlbmRlclRhcmdldEN1YmUiLCJpc1dlYkdMUmVuZGVyVGFyZ2V0Q3ViZSIsIk5lYXJlc3RGaWx0ZXIiLCJEYXRhVGV4dHVyZSIsImlzRGF0YVRleHR1cmUiLCJJbmZpbml0eSIsIkJveDMiLCJpc0JveDMiLCJzZXRGcm9tQXJyYXkiLCJtaW5YIiwibWluWSIsIm1pbloiLCJtYXhYIiwibWF4WSIsIm1heFoiLCJzZXRGcm9tQnVmZmVyQXR0cmlidXRlIiwic2V0RnJvbVBvaW50cyIsInBvaW50cyIsIm1ha2VFbXB0eSIsImlsIiwiZXhwYW5kQnlQb2ludCIsInNldEZyb21DZW50ZXJBbmRTaXplIiwic2l6ZSIsImhhbGZTaXplIiwic2V0RnJvbU9iamVjdCIsImV4cGFuZEJ5T2JqZWN0IiwiYm94IiwiaXNFbXB0eSIsImdldENlbnRlciIsImdldFNpemUiLCJleHBhbmRCeVZlY3RvciIsImV4cGFuZEJ5U2NhbGFyIiwiZ2VvbWV0cnkiLCJpc0dlb21ldHJ5IiwidmVydGljZXMiLCJzY29wZSIsImlzQnVmZmVyR2VvbWV0cnkiLCJhdHRyaWJ1dGVzIiwidXBkYXRlTWF0cml4V29ybGQiLCJ0cmF2ZXJzZSIsImNvbnRhaW5zUG9pbnQiLCJjb250YWluc0JveCIsImdldFBhcmFtZXRlciIsImludGVyc2VjdHNCb3giLCJpbnRlcnNlY3RzU3BoZXJlIiwic3BoZXJlIiwiY2xhbXBQb2ludCIsImNsb3Nlc3RQb2ludCIsImludGVyc2VjdHNQbGFuZSIsInBsYW5lIiwiY29uc3RhbnQiLCJpbnRlcnNlY3RzVHJpYW5nbGUiLCJheGVzIiwidGVzdEF4aXMiLCJleHRlbnRzIiwidjAiLCJwMCIsInAxIiwicDIiLCJ0cmlhbmdsZSIsImYwIiwiZjEiLCJmMiIsInNhdEZvckF4ZXMiLCJ0cmlhbmdsZU5vcm1hbCIsImRpc3RhbmNlVG9Qb2ludCIsImdldEJvdW5kaW5nU3BoZXJlIiwiaW50ZXJzZWN0IiwidW5pb24iLCJTcGhlcmUiLCJvcHRpb25hbENlbnRlciIsIm1heFJhZGl1c1NxIiwicmFkaXVzU3VtIiwiZGVsdGFMZW5ndGhTcSIsImdldEJvdW5kaW5nQm94IiwiUGxhbmUiLCJzZXRDb21wb25lbnRzIiwic2V0RnJvbU5vcm1hbEFuZENvcGxhbmFyUG9pbnQiLCJzZXRGcm9tQ29wbGFuYXJQb2ludHMiLCJpbnZlcnNlTm9ybWFsTGVuZ3RoIiwiZGlzdGFuY2VUb1NwaGVyZSIsInByb2plY3RQb2ludCIsImludGVyc2VjdExpbmUiLCJsaW5lIiwiZGVsdGEiLCJkaXJlY3Rpb24iLCJkZW5vbWluYXRvciIsInN0YXJ0IiwiaW50ZXJzZWN0c0xpbmUiLCJlbmQiLCJlbmRTaWduIiwic3RhcnRTaWduIiwiY29wbGFuYXJQb2ludCIsIm9wdGlvbmFsTm9ybWFsTWF0cml4IiwibTEiLCJub3JtYWxNYXRyaXgiLCJyZWZlcmVuY2VQb2ludCIsInAzIiwicDQiLCJwNSIsInBsYW5lcyIsIkZydXN0dW0iLCJmcnVzdHVtIiwic2V0RnJvbU1hdHJpeCIsIm1lMSIsIm1lMiIsIm1lMyIsIm1lNSIsIm1lNiIsIm1lNyIsIm1lOSIsIm1lMTAiLCJtZTExIiwibWUxMyIsIm1lMTQiLCJtZTE1IiwibWUwIiwibWU0IiwibWU4IiwibWUxMiIsImludGVyc2VjdHNPYmplY3QiLCJib3VuZGluZ1NwaGVyZSIsImNvbXB1dGVCb3VuZGluZ1NwaGVyZSIsImludGVyc2VjdHNTcHJpdGUiLCJzcHJpdGUiLCJkaXN0YW5jZSIsIm5lZ1JhZGl1cyIsImFscGhhbWFwX2ZyYWdtZW50IiwiYWxwaGFtYXBfcGFyc19mcmFnbWVudCIsImFscGhhdGVzdF9mcmFnbWVudCIsImFvbWFwX2ZyYWdtZW50IiwiYW9tYXBfcGFyc19mcmFnbWVudCIsImJlZ2luX3ZlcnRleCIsImJlZ2lubm9ybWFsX3ZlcnRleCIsImJzZGZzIiwiYnVtcG1hcF9wYXJzX2ZyYWdtZW50IiwiY2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50IiwiY2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQiLCJjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXgiLCJjbGlwcGluZ19wbGFuZXNfdmVydGV4IiwiY29sb3JfZnJhZ21lbnQiLCJjb2xvcl9wYXJzX2ZyYWdtZW50IiwiY29sb3JfcGFyc192ZXJ0ZXgiLCJjb2xvcl92ZXJ0ZXgiLCJjb21tb24iLCJjdWJlX3V2X3JlZmxlY3Rpb25fZnJhZ21lbnQiLCJkZWZhdWx0bm9ybWFsX3ZlcnRleCIsImRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleCIsImRpc3BsYWNlbWVudG1hcF92ZXJ0ZXgiLCJlbWlzc2l2ZW1hcF9mcmFnbWVudCIsImVtaXNzaXZlbWFwX3BhcnNfZnJhZ21lbnQiLCJlbmNvZGluZ3NfZnJhZ21lbnQiLCJlbmNvZGluZ3NfcGFyc19mcmFnbWVudCIsImVudm1hcF9mcmFnbWVudCIsImVudm1hcF9wYXJzX2ZyYWdtZW50IiwiZW52bWFwX3BhcnNfdmVydGV4IiwiZW52bWFwX3ZlcnRleCIsImZvZ192ZXJ0ZXgiLCJmb2dfcGFyc192ZXJ0ZXgiLCJmb2dfZnJhZ21lbnQiLCJmb2dfcGFyc19mcmFnbWVudCIsImdyYWRpZW50bWFwX3BhcnNfZnJhZ21lbnQiLCJsaWdodG1hcF9mcmFnbWVudCIsImxpZ2h0bWFwX3BhcnNfZnJhZ21lbnQiLCJsaWdodHNfbGFtYmVydF92ZXJ0ZXgiLCJsaWdodHNfcGFyc19iZWdpbiIsImxpZ2h0c19wYXJzX21hcHMiLCJsaWdodHNfcGhvbmdfZnJhZ21lbnQiLCJsaWdodHNfcGhvbmdfcGFyc19mcmFnbWVudCIsImxpZ2h0c19waHlzaWNhbF9mcmFnbWVudCIsImxpZ2h0c19waHlzaWNhbF9wYXJzX2ZyYWdtZW50IiwibGlnaHRzX2ZyYWdtZW50X2JlZ2luIiwibGlnaHRzX2ZyYWdtZW50X21hcHMiLCJsaWdodHNfZnJhZ21lbnRfZW5kIiwibG9nZGVwdGhidWZfZnJhZ21lbnQiLCJsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50IiwibG9nZGVwdGhidWZfcGFyc192ZXJ0ZXgiLCJsb2dkZXB0aGJ1Zl92ZXJ0ZXgiLCJtYXBfZnJhZ21lbnQiLCJtYXBfcGFyc19mcmFnbWVudCIsIm1hcF9wYXJ0aWNsZV9mcmFnbWVudCIsIm1hcF9wYXJ0aWNsZV9wYXJzX2ZyYWdtZW50IiwibWV0YWxuZXNzbWFwX2ZyYWdtZW50IiwibWV0YWxuZXNzbWFwX3BhcnNfZnJhZ21lbnQiLCJtb3JwaG5vcm1hbF92ZXJ0ZXgiLCJtb3JwaHRhcmdldF9wYXJzX3ZlcnRleCIsIm1vcnBodGFyZ2V0X3ZlcnRleCIsIm5vcm1hbF9mcmFnbWVudF9iZWdpbiIsIm5vcm1hbF9mcmFnbWVudF9tYXBzIiwibm9ybWFsbWFwX3BhcnNfZnJhZ21lbnQiLCJwYWNraW5nIiwicHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudCIsInByb2plY3RfdmVydGV4IiwiZGl0aGVyaW5nX2ZyYWdtZW50IiwiZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnQiLCJyb3VnaG5lc3NtYXBfZnJhZ21lbnQiLCJyb3VnaG5lc3NtYXBfcGFyc19mcmFnbWVudCIsInNoYWRvd21hcF9wYXJzX2ZyYWdtZW50Iiwic2hhZG93bWFwX3BhcnNfdmVydGV4Iiwic2hhZG93bWFwX3ZlcnRleCIsInNoYWRvd21hc2tfcGFyc19mcmFnbWVudCIsInNraW5iYXNlX3ZlcnRleCIsInNraW5uaW5nX3BhcnNfdmVydGV4Iiwic2tpbm5pbmdfdmVydGV4Iiwic2tpbm5vcm1hbF92ZXJ0ZXgiLCJzcGVjdWxhcm1hcF9mcmFnbWVudCIsInNwZWN1bGFybWFwX3BhcnNfZnJhZ21lbnQiLCJ0b25lbWFwcGluZ19mcmFnbWVudCIsInRvbmVtYXBwaW5nX3BhcnNfZnJhZ21lbnQiLCJ1dl9wYXJzX2ZyYWdtZW50IiwidXZfcGFyc192ZXJ0ZXgiLCJ1dl92ZXJ0ZXgiLCJ1djJfcGFyc19mcmFnbWVudCIsInV2Ml9wYXJzX3ZlcnRleCIsInV2Ml92ZXJ0ZXgiLCJ3b3JsZHBvc192ZXJ0ZXgiLCJjdWJlX2ZyYWciLCJjdWJlX3ZlcnQiLCJkZXB0aF9mcmFnIiwiZGVwdGhfdmVydCIsImRpc3RhbmNlUkdCQV9mcmFnIiwiZGlzdGFuY2VSR0JBX3ZlcnQiLCJlcXVpcmVjdF9mcmFnIiwiZXF1aXJlY3RfdmVydCIsImxpbmVkYXNoZWRfZnJhZyIsImxpbmVkYXNoZWRfdmVydCIsIm1lc2hiYXNpY19mcmFnIiwibWVzaGJhc2ljX3ZlcnQiLCJtZXNobGFtYmVydF9mcmFnIiwibWVzaGxhbWJlcnRfdmVydCIsIm1lc2hwaG9uZ19mcmFnIiwibWVzaHBob25nX3ZlcnQiLCJtZXNocGh5c2ljYWxfZnJhZyIsIm1lc2hwaHlzaWNhbF92ZXJ0Iiwibm9ybWFsX2ZyYWciLCJub3JtYWxfdmVydCIsInBvaW50c19mcmFnIiwicG9pbnRzX3ZlcnQiLCJzaGFkb3dfZnJhZyIsInNoYWRvd192ZXJ0IiwibWVyZ2UiLCJ1bmlmb3JtcyIsInUiLCJtZXJnZWQiLCJ1bmlmb3Jtc19zcmMiLCJ1bmlmb3Jtc19kc3QiLCJwYXJhbWV0ZXJfc3JjIiwiaXNDb2xvciIsInNldFJHQiIsIkNvbG9yIiwic2V0SGV4Iiwic2V0U3R5bGUiLCJoZXgiLCJzZXRIU0wiLCJodWUycmdiIiwic3RyaW5nIiwicGFyc2VGbG9hdCIsImNvbG9yIiwiY29tcG9uZW50cyIsInBhcnNlSW50IiwiaGFuZGxlQWxwaGEiLCJDb2xvcktleXdvcmRzIiwiY29weUdhbW1hVG9MaW5lYXIiLCJnYW1tYUZhY3RvciIsImNvcHlMaW5lYXJUb0dhbW1hIiwic2FmZUludmVyc2UiLCJjb252ZXJ0R2FtbWFUb0xpbmVhciIsImNvbnZlcnRMaW5lYXJUb0dhbW1hIiwiZ2V0SGV4IiwiZ2V0SGV4U3RyaW5nIiwiZ2V0SFNMIiwic2F0dXJhdGlvbiIsImh1ZSIsImxpZ2h0bmVzcyIsImdldFN0eWxlIiwib2Zmc2V0SFNMIiwiaHNsIiwiYWRkQ29sb3JzIiwiY29sb3IxIiwiY29sb3IyIiwiZGlmZnVzZSIsIm9wYWNpdHkiLCJtYXAiLCJ1dlRyYW5zZm9ybSIsImFscGhhTWFwIiwic3BlY3VsYXJtYXAiLCJzcGVjdWxhck1hcCIsImVudm1hcCIsImVudk1hcCIsImZsaXBFbnZNYXAiLCJyZWZsZWN0aXZpdHkiLCJyZWZyYWN0aW9uUmF0aW8iLCJtYXhNaXBMZXZlbCIsImFvbWFwIiwiYW9NYXAiLCJhb01hcEludGVuc2l0eSIsImxpZ2h0bWFwIiwibGlnaHRNYXAiLCJsaWdodE1hcEludGVuc2l0eSIsImVtaXNzaXZlbWFwIiwiZW1pc3NpdmVNYXAiLCJidW1wbWFwIiwiYnVtcE1hcCIsImJ1bXBTY2FsZSIsIm5vcm1hbG1hcCIsIm5vcm1hbE1hcCIsIm5vcm1hbFNjYWxlIiwiZGlzcGxhY2VtZW50bWFwIiwiZGlzcGxhY2VtZW50TWFwIiwiZGlzcGxhY2VtZW50U2NhbGUiLCJkaXNwbGFjZW1lbnRCaWFzIiwicm91Z2huZXNzbWFwIiwicm91Z2huZXNzTWFwIiwibWV0YWxuZXNzbWFwIiwibWV0YWxuZXNzTWFwIiwiZ3JhZGllbnRtYXAiLCJncmFkaWVudE1hcCIsImZvZyIsImZvZ0RlbnNpdHkiLCJmb2dOZWFyIiwiZm9nRmFyIiwiZm9nQ29sb3IiLCJsaWdodHMiLCJhbWJpZW50TGlnaHRDb2xvciIsImRpcmVjdGlvbmFsTGlnaHRzIiwicHJvcGVydGllcyIsInNoYWRvdyIsInNoYWRvd0JpYXMiLCJzaGFkb3dSYWRpdXMiLCJzaGFkb3dNYXBTaXplIiwiZGlyZWN0aW9uYWxTaGFkb3dNYXAiLCJkaXJlY3Rpb25hbFNoYWRvd01hdHJpeCIsInNwb3RMaWdodHMiLCJjb25lQ29zIiwicGVudW1icmFDb3MiLCJkZWNheSIsInNwb3RTaGFkb3dNYXAiLCJzcG90U2hhZG93TWF0cml4IiwicG9pbnRMaWdodHMiLCJzaGFkb3dDYW1lcmFOZWFyIiwic2hhZG93Q2FtZXJhRmFyIiwicG9pbnRTaGFkb3dNYXAiLCJwb2ludFNoYWRvd01hdHJpeCIsImhlbWlzcGhlcmVMaWdodHMiLCJza3lDb2xvciIsImdyb3VuZENvbG9yIiwicmVjdEFyZWFMaWdodHMiLCJiYXNpYyIsIlVuaWZvcm1zVXRpbHMiLCJVbmlmb3Jtc0xpYiIsInZlcnRleFNoYWRlciIsIlNoYWRlckNodW5rIiwiZnJhZ21lbnRTaGFkZXIiLCJsYW1iZXJ0IiwiZW1pc3NpdmUiLCJwaG9uZyIsInNwZWN1bGFyIiwic2hpbmluZXNzIiwic3RhbmRhcmQiLCJyb3VnaG5lc3MiLCJtZXRhbG5lc3MiLCJlbnZNYXBJbnRlbnNpdHkiLCJkYXNoZWQiLCJkYXNoU2l6ZSIsInRvdGFsU2l6ZSIsImRlcHRoIiwiY3ViZSIsInRDdWJlIiwidEZsaXAiLCJlcXVpcmVjdCIsInRFcXVpcmVjdCIsImRpc3RhbmNlUkdCQSIsInJlZmVyZW5jZVBvc2l0aW9uIiwibmVhckRpc3RhbmNlIiwiZmFyRGlzdGFuY2UiLCJTaGFkZXJMaWIiLCJwaHlzaWNhbCIsImNsZWFyQ29hdCIsImNsZWFyQ29hdFJvdWdobmVzcyIsImdsIiwiYnVmZmVyVHlwZSIsImR5bmFtaWMiLCJEWU5BTUlDX0RSQVciLCJTVEFUSUNfRFJBVyIsImNyZWF0ZUJ1ZmZlciIsImJpbmRCdWZmZXIiLCJidWZmZXIiLCJidWZmZXJEYXRhIiwidXNhZ2UiLCJvblVwbG9hZENhbGxiYWNrIiwiRkxPQVQiLCJVTlNJR05FRF9TSE9SVCIsIlNIT1JUIiwiVU5TSUdORURfSU5UIiwiSU5UIiwiQllURSIsIlVOU0lHTkVEX0JZVEUiLCJieXRlc1BlckVsZW1lbnQiLCJCWVRFU19QRVJfRUxFTUVOVCIsInVwZGF0ZVJhbmdlIiwiYnVmZmVyU3ViRGF0YSIsInN1YmFycmF5IiwiaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSIsImJ1ZmZlcnMiLCJkZWxldGVCdWZmZXIiLCJkZWxldGUiLCJ1cGRhdGVCdWZmZXIiLCJyZW1vdmUiLCJfb3JkZXIiLCJFdWxlciIsIkRlZmF1bHRPcmRlciIsIlJvdGF0aW9uT3JkZXJzIiwiYXNpbiIsInNldEZyb21RdWF0ZXJuaW9uIiwic2V0RnJvbVZlY3RvcjMiLCJyZW9yZGVyIiwibmV3T3JkZXIiLCJ0b1ZlY3RvcjMiLCJvcHRpb25hbFJlc3VsdCIsIm1hc2siLCJMYXllcnMiLCJlbmFibGUiLCJkaXNhYmxlIiwibGF5ZXJzIiwib2JqZWN0M0RJZCIsImNoaWxkcmVuIiwiT2JqZWN0M0QiLCJEZWZhdWx0VXAiLCJvblJvdGF0aW9uQ2hhbmdlIiwib25RdWF0ZXJuaW9uQ2hhbmdlIiwibW9kZWxWaWV3TWF0cml4IiwiRGVmYXVsdE1hdHJpeEF1dG9VcGRhdGUiLCJtYXRyaXhXb3JsZE5lZWRzVXBkYXRlIiwidmlzaWJsZSIsImNhc3RTaGFkb3ciLCJyZWNlaXZlU2hhZG93IiwiZnJ1c3R1bUN1bGxlZCIsInJlbmRlck9yZGVyIiwidXNlckRhdGEiLCJpc09iamVjdDNEIiwib25CZWZvcmVSZW5kZXIiLCJvbkFmdGVyUmVuZGVyIiwiYXBwbHlNYXRyaXgiLCJzZXRSb3RhdGlvbkZyb21BeGlzQW5nbGUiLCJzZXRSb3RhdGlvbkZyb21FdWxlciIsInNldFJvdGF0aW9uRnJvbU1hdHJpeCIsInNldFJvdGF0aW9uRnJvbVF1YXRlcm5pb24iLCJyb3RhdGVPbkF4aXMiLCJxMSIsInJvdGF0ZU9uV29ybGRBeGlzIiwicm90YXRlWCIsInJvdGF0ZVkiLCJyb3RhdGVaIiwidHJhbnNsYXRlT25BeGlzIiwidHJhbnNsYXRlWCIsInRyYW5zbGF0ZVkiLCJ0cmFuc2xhdGVaIiwibG9jYWxUb1dvcmxkIiwid29ybGRUb0xvY2FsIiwiaXNDYW1lcmEiLCJnZXRPYmplY3RCeUlkIiwiZ2V0T2JqZWN0QnlQcm9wZXJ0eSIsImdldE9iamVjdEJ5TmFtZSIsImNoaWxkIiwiZ2V0V29ybGRQb3NpdGlvbiIsImdldFdvcmxkUXVhdGVybmlvbiIsImdldFdvcmxkU2NhbGUiLCJnZXRXb3JsZERpcmVjdGlvbiIsInJheWNhc3QiLCJ0cmF2ZXJzZVZpc2libGUiLCJ0cmF2ZXJzZUFuY2VzdG9ycyIsImZvcmNlIiwiZ2VvbWV0cmllcyIsIm1hdGVyaWFscyIsInNoYXBlcyIsImxpYnJhcnkiLCJlbGVtZW50Iiwic2VyaWFsaXplIiwicGFyYW1ldGVycyIsInNoYXBlIiwibWF0ZXJpYWwiLCJ1dWlkcyIsImV4dHJhY3RGcm9tQ2FjaGUiLCJjYWNoZSIsInJlY3Vyc2l2ZSIsInBhcnNlIiwibWF0cml4V29ybGRJbnZlcnNlIiwiQ2FtZXJhIiwiem9vbSIsInZpZXciLCJ1cGRhdGVQcm9qZWN0aW9uTWF0cml4IiwiT3J0aG9ncmFwaGljQ2FtZXJhIiwiaXNPcnRob2dyYXBoaWNDYW1lcmEiLCJzZXRWaWV3T2Zmc2V0IiwiZnVsbFdpZHRoIiwiZnVsbEhlaWdodCIsImVuYWJsZWQiLCJvZmZzZXRYIiwib2Zmc2V0WSIsImNsZWFyVmlld09mZnNldCIsInNjYWxlVyIsInpvb21XIiwic2NhbGVIIiwiem9vbUgiLCJtYXRlcmlhbEluZGV4IiwidmVydGV4Tm9ybWFscyIsInZlcnRleENvbG9ycyIsIkZhY2UzIiwiZ2VvbWV0cnlJZCIsImNvbG9ycyIsImZhY2VzIiwiZmFjZVZlcnRleFV2cyIsIm1vcnBoVGFyZ2V0cyIsIm1vcnBoTm9ybWFscyIsInNraW5XZWlnaHRzIiwic2tpbkluZGljZXMiLCJsaW5lRGlzdGFuY2VzIiwiYm91bmRpbmdCb3giLCJlbGVtZW50c05lZWRVcGRhdGUiLCJ2ZXJ0aWNlc05lZWRVcGRhdGUiLCJ1dnNOZWVkVXBkYXRlIiwibm9ybWFsc05lZWRVcGRhdGUiLCJjb2xvcnNOZWVkVXBkYXRlIiwibGluZURpc3RhbmNlc05lZWRVcGRhdGUiLCJncm91cHNOZWVkVXBkYXRlIiwiR2VvbWV0cnkiLCJ2ZXJ0ZXgiLCJmYWNlIiwiamwiLCJjb21wdXRlQm91bmRpbmdCb3giLCJmcm9tQnVmZmVyR2VvbWV0cnkiLCJ1djIiLCJ1dnMyIiwicG9zaXRpb25zIiwibm9ybWFscyIsInRlbXBOb3JtYWxzIiwidXZzIiwidGVtcFVWcyIsInRlbXBVVnMyIiwiZ3JvdXBzIiwiZ3JvdXAiLCJpbmRpY2VzIiwiYWRkRmFjZSIsImNvbXB1dGVGYWNlTm9ybWFscyIsImFiIiwiZmwiLCJjYiIsInZDIiwidkIiLCJ2QSIsImNvbXB1dGVWZXJ0ZXhOb3JtYWxzIiwiYXJlYVdlaWdodGVkIiwidmwiLCJjb21wdXRlRmxhdFZlcnRleE5vcm1hbHMiLCJjb21wdXRlTW9ycGhOb3JtYWxzIiwiX19vcmlnaW5hbEZhY2VOb3JtYWwiLCJfX29yaWdpbmFsVmVydGV4Tm9ybWFscyIsInRtcEdlbyIsImZhY2VOb3JtYWxzIiwiZmFjZU5vcm1hbCIsImRzdE5vcm1hbHNGYWNlIiwiZHN0Tm9ybWFsc1ZlcnRleCIsIm1hdGVyaWFsSW5kZXhPZmZzZXQiLCJ2ZXJ0ZXhPZmZzZXQiLCJ2ZXJ0aWNlczEiLCJ2ZXJ0aWNlczIiLCJmYWNlczEiLCJmYWNlczIiLCJ1dnMxIiwiY29sb3JzMSIsImNvbG9yczIiLCJ2ZXJ0ZXhDb3B5IiwiZmFjZUNvcHkiLCJmYWNlVmVydGV4Tm9ybWFscyIsImZhY2VWZXJ0ZXhDb2xvcnMiLCJ1dkNvcHkiLCJtZXJnZU1lc2giLCJtZXNoIiwiaXNNZXNoIiwibWVyZ2VWZXJ0aWNlcyIsImNoYW5nZXMiLCJwcmVjaXNpb25Qb2ludHMiLCJwcmVjaXNpb24iLCJ2ZXJ0aWNlc01hcCIsInVuaXF1ZSIsImZhY2VJbmRpY2VzVG9SZW1vdmUiLCJpZHgiLCJzb3J0RmFjZXNCeU1hdGVyaWFsSW5kZXgiLCJfaWQiLCJzb3J0IiwibWF0ZXJpYWxJbmRleFNvcnQiLCJuZXdVdnMyIiwibmV3VXZzMSIsImZhY2VUeXBlIiwic2V0Qml0IiwiaGFzTWF0ZXJpYWwiLCJoYXNGYWNlVXYiLCJoYXNGYWNlVmVydGV4VXYiLCJoYXNGYWNlTm9ybWFsIiwiaGFzRmFjZVZlcnRleE5vcm1hbCIsImhhc0ZhY2VDb2xvciIsImhhc0ZhY2VWZXJ0ZXhDb2xvciIsImdldFV2SW5kZXgiLCJnZXROb3JtYWxJbmRleCIsImdldENvbG9ySW5kZXgiLCJub3JtYWxzSGFzaCIsImhhc2giLCJjb2xvcnNIYXNoIiwidXZzSGFzaCIsImtsIiwidXZzQ29weSIsIm1vcnBoVGFyZ2V0IiwibW9ycGhOb3JtYWwiLCJkZXN0VmVydGV4Tm9ybWFsIiwic3JjVmVydGV4Tm9ybWFsIiwiaXRlbVNpemUiLCJub3JtYWxpemVkIiwiQnVmZmVyQXR0cmlidXRlIiwiaXNCdWZmZXJBdHRyaWJ1dGUiLCJzZXRBcnJheSIsInNldER5bmFtaWMiLCJjb3B5QXQiLCJpbmRleDEiLCJpbmRleDIiLCJjb3B5QXJyYXkiLCJjb3B5Q29sb3JzQXJyYXkiLCJjb3B5VmVjdG9yMnNBcnJheSIsInZlY3RvcnMiLCJjb3B5VmVjdG9yM3NBcnJheSIsImNvcHlWZWN0b3I0c0FycmF5Iiwic2V0WFkiLCJzZXRYWVpXIiwib25VcGxvYWQiLCJJbnQ4QnVmZmVyQXR0cmlidXRlIiwiVWludDhCdWZmZXJBdHRyaWJ1dGUiLCJVaW50OENsYW1wZWRCdWZmZXJBdHRyaWJ1dGUiLCJJbnQxNkJ1ZmZlckF0dHJpYnV0ZSIsIlVpbnQxNkJ1ZmZlckF0dHJpYnV0ZSIsIkludDMyQnVmZmVyQXR0cmlidXRlIiwiVWludDMyQnVmZmVyQXR0cmlidXRlIiwiRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSIsIkZsb2F0NjRCdWZmZXJBdHRyaWJ1dGUiLCJEaXJlY3RHZW9tZXRyeSIsImNvbXB1dGVHcm91cHMiLCJmcm9tR2VvbWV0cnkiLCJtb3JwaFRhcmdldHNMZW5ndGgiLCJtb3JwaFRhcmdldHNQb3NpdGlvbiIsIm1vcnBoTm9ybWFsc0xlbmd0aCIsIm1vcnBoVGFyZ2V0c05vcm1hbCIsInZlcnRleFV2cyIsImhhc0ZhY2VWZXJ0ZXhVdjIiLCJoYXNTa2luSW5kaWNlcyIsImhhc1NraW5XZWlnaHRzIiwiYnVmZmVyR2VvbWV0cnlJZCIsIm1vcnBoQXR0cmlidXRlcyIsImRyYXdSYW5nZSIsIkJ1ZmZlckdlb21ldHJ5IiwiZ2V0SW5kZXgiLCJzZXRJbmRleCIsImFycmF5TWF4IiwiYWRkQXR0cmlidXRlIiwiZ2V0QXR0cmlidXRlIiwicmVtb3ZlQXR0cmlidXRlIiwiYWRkR3JvdXAiLCJjbGVhckdyb3VwcyIsInNldERyYXdSYW5nZSIsIm5lZWRzVXBkYXRlIiwiaXNQb2ludHMiLCJpc0xpbmUiLCJ1cGRhdGVGcm9tT2JqZWN0IiwiX19kaXJlY3RHZW9tZXRyeSIsImRpcmVjdCIsImxpbmVEaXN0YW5jZSIsImZyb21EaXJlY3RHZW9tZXRyeSIsInBCIiwicEMiLCJwQSIsIm5vcm1hbGl6ZU5vcm1hbHMiLCJhdHRyaWJ1dGUxIiwiYXR0cmlidXRlMiIsImF0dHJpYnV0ZVNpemUiLCJhdHRyaWJ1dGVBcnJheTIiLCJhdHRyaWJ1dGVBcnJheTEiLCJ0b05vbkluZGV4ZWQiLCJhcnJheTIiLCJnZW9tZXRyeTIiLCJtb3JwaEF0dHJpYnV0ZSIsIndpZHRoU2VnbWVudHMiLCJoZWlnaHRTZWdtZW50cyIsImRlcHRoU2VnbWVudHMiLCJCb3hHZW9tZXRyeSIsImJ1aWxkUGxhbmUiLCJ1ZGlyIiwidmRpciIsImdyaWRYIiwiZ3JpZFkiLCJncmlkWTEiLCJzZWdtZW50SGVpZ2h0IiwiaGVpZ2h0SGFsZiIsImdyaWRYMSIsInNlZ21lbnRXaWR0aCIsIndpZHRoSGFsZiIsImRlcHRoSGFsZiIsInZlcnRleENvdW50ZXIiLCJudW1iZXJPZlZlcnRpY2VzIiwiZ3JvdXBDb3VudCIsImdyb3VwU3RhcnQiLCJCb3hCdWZmZXJHZW9tZXRyeSIsIlBsYW5lR2VvbWV0cnkiLCJzZWdtZW50X2hlaWdodCIsImhlaWdodF9oYWxmIiwic2VnbWVudF93aWR0aCIsIndpZHRoX2hhbGYiLCJQbGFuZUJ1ZmZlckdlb21ldHJ5IiwibWF0ZXJpYWxJZCIsImJsZW5kaW5nIiwiTm9ybWFsQmxlbmRpbmciLCJzaWRlIiwiRnJvbnRTaWRlIiwiZmxhdFNoYWRpbmciLCJOb0NvbG9ycyIsInRyYW5zcGFyZW50IiwiYmxlbmRTcmMiLCJTcmNBbHBoYUZhY3RvciIsImJsZW5kRHN0IiwiT25lTWludXNTcmNBbHBoYUZhY3RvciIsImJsZW5kRXF1YXRpb24iLCJBZGRFcXVhdGlvbiIsImJsZW5kU3JjQWxwaGEiLCJibGVuZERzdEFscGhhIiwiYmxlbmRFcXVhdGlvbkFscGhhIiwiZGVwdGhGdW5jIiwiTGVzc0VxdWFsRGVwdGgiLCJkZXB0aFRlc3QiLCJkZXB0aFdyaXRlIiwiY2xpcHBpbmdQbGFuZXMiLCJjbGlwSW50ZXJzZWN0aW9uIiwiY2xpcFNoYWRvd3MiLCJzaGFkb3dTaWRlIiwiY29sb3JXcml0ZSIsInBvbHlnb25PZmZzZXQiLCJwb2x5Z29uT2Zmc2V0RmFjdG9yIiwicG9seWdvbk9mZnNldFVuaXRzIiwiZGl0aGVyaW5nIiwiYWxwaGFUZXN0IiwicHJlbXVsdGlwbGllZEFscGhhIiwib3ZlcmRyYXciLCJNYXRlcmlhbCIsImlzTWF0ZXJpYWwiLCJvbkJlZm9yZUNvbXBpbGUiLCJzZXRWYWx1ZXMiLCJuZXdWYWx1ZSIsIkZsYXRTaGFkaW5nIiwiY3VycmVudFZhbHVlIiwiaXNSb290IiwiZW1pc3NpdmVJbnRlbnNpdHkiLCJzaXplQXR0ZW51YXRpb24iLCJsaW5ld2lkdGgiLCJnYXBTaXplIiwid2lyZWZyYW1lIiwid2lyZWZyYW1lTGluZXdpZHRoIiwid2lyZWZyYW1lTGluZWNhcCIsIndpcmVmcmFtZUxpbmVqb2luIiwic2tpbm5pbmciLCJkc3RQbGFuZXMiLCJzcmNQbGFuZXMiLCJjb21iaW5lIiwiTXVsdGlwbHlPcGVyYXRpb24iLCJNZXNoQmFzaWNNYXRlcmlhbCIsImlzTWVzaEJhc2ljTWF0ZXJpYWwiLCJkZWZpbmVzIiwiY2xpcHBpbmciLCJkZXJpdmF0aXZlcyIsImZyYWdEZXB0aCIsImRyYXdCdWZmZXJzIiwic2hhZGVyVGV4dHVyZUxPRCIsImRlZmF1bHRBdHRyaWJ1dGVWYWx1ZXMiLCJpbmRleDBBdHRyaWJ1dGVOYW1lIiwidW5pZm9ybXNOZWVkVXBkYXRlIiwiU2hhZGVyTWF0ZXJpYWwiLCJpc1NoYWRlck1hdGVyaWFsIiwib3JpZ2luIiwiUmF5IiwicmF5IiwiYXQiLCJyZWNhc3QiLCJjbG9zZXN0UG9pbnRUb1BvaW50IiwiZGlyZWN0aW9uRGlzdGFuY2UiLCJkaXN0YW5jZVNxVG9Qb2ludCIsImRpc3RhbmNlU3FUb1NlZ21lbnQiLCJvcHRpb25hbFBvaW50T25SYXkiLCJvcHRpb25hbFBvaW50T25TZWdtZW50Iiwic2VnQ2VudGVyIiwic2VnRGlyIiwiZGlmZiIsImEwMSIsInNxckRpc3QiLCJleHREZXQiLCJzMCIsImIwIiwic2VnRXh0ZW50IiwiaW52RGV0IiwiaW50ZXJzZWN0U3BoZXJlIiwidGNhIiwicmFkaXVzMiIsInRoYyIsInQwIiwidDEiLCJkaXN0YW5jZVRvUGxhbmUiLCJpbnRlcnNlY3RQbGFuZSIsImRpc3RUb1BvaW50IiwiaW50ZXJzZWN0Qm94IiwidG1heCIsInR5bWluIiwidHltYXgiLCJ0em1pbiIsInR6bWF4IiwiaW52ZGlyeSIsImludmRpcnoiLCJpbnZkaXJ4IiwidG1pbiIsImludGVyc2VjdFRyaWFuZ2xlIiwiYmFja2ZhY2VDdWxsaW5nIiwiZWRnZTEiLCJlZGdlMiIsIkRkTiIsIkRkUXhFMiIsIkRkRTF4USIsIlFkTiIsIkxpbmUzIiwiZGlzdGFuY2VTcSIsImNsb3Nlc3RQb2ludFRvUG9pbnRQYXJhbWV0ZXIiLCJjbGFtcFRvTGluZSIsInN0YXJ0UCIsInN0YXJ0RW5kIiwic3RhcnRFbmRfc3RhcnRQIiwic3RhcnRFbmQyIiwiVHJpYW5nbGUiLCJnZXROb3JtYWwiLCJ0YXJnZXRMZW5ndGhTcSIsImdldEJhcnljb29yZCIsImRvdDAwIiwiZG90MTEiLCJkb3QwMSIsImRlbm9tIiwiZG90MDIiLCJkb3QxMiIsImludkRlbm9tIiwic2V0RnJvbVBvaW50c0FuZEluZGljZXMiLCJpMCIsImkxIiwiaTIiLCJnZXRBcmVhIiwiZ2V0TWlkcG9pbnQiLCJnZXRQbGFuZSIsInByb2plY3RlZFBvaW50IiwiZWRnZUxpc3QiLCJtaW5EaXN0YW5jZSIsImRyYXdNb2RlIiwiVHJpYW5nbGVzRHJhd01vZGUiLCJ1cGRhdGVNb3JwaFRhcmdldHMiLCJNZXNoIiwic2V0RHJhd01vZGUiLCJtb3JwaFRhcmdldEluZmx1ZW5jZXMiLCJtb3JwaFRhcmdldERpY3Rpb25hcnkiLCJtbCIsInV2MSIsInV2MyIsImJhcnljb29yZCIsInJheWNhc3RlciIsIkJhY2tTaWRlIiwiRG91YmxlU2lkZSIsImludGVyc2VjdGlvblBvaW50V29ybGQiLCJjaGVja0ludGVyc2VjdGlvbiIsImludGVyc2VjdGlvblBvaW50IiwiaW50ZXJzZWN0aW9uIiwidXZBIiwidXZCIiwidXZDIiwidXZJbnRlcnNlY3Rpb24iLCJmYWNlSW5kZXgiLCJpbnRlcnNlY3RzIiwiaW52ZXJzZU1hdHJpeCIsImNoZWNrQnVmZmVyR2VvbWV0cnlJbnRlcnNlY3Rpb24iLCJmdkIiLCJmdkMiLCJpc011bHRpTWF0ZXJpYWwiLCJmYWNlTWF0ZXJpYWwiLCJmdkEiLCJ0bCIsIm1vcnBoSW5mbHVlbmNlcyIsImluZmx1ZW5jZSIsInRlbXBBIiwidGFyZ2V0cyIsInRlbXBCIiwidGVtcEMiLCJ1dnNfZiIsInJlbmRlcmVyIiwicGxhbmVNZXNoIiwicmVuZGVyTGlzdCIsInNjZW5lIiwiZm9yY2VDbGVhciIsImJhY2tncm91bmQiLCJzZXRDbGVhciIsImNsZWFyQ29sb3IiLCJjbGVhckFscGhhIiwiYXV0b0NsZWFyIiwiYXV0b0NsZWFyQ29sb3IiLCJhdXRvQ2xlYXJEZXB0aCIsImF1dG9DbGVhclN0ZW5jaWwiLCJpc0N1YmVUZXh0dXJlIiwiYm94TWVzaCIsInBsYW5lQ2FtZXJhIiwicmVuZGVyQnVmZmVyRGlyZWN0IiwiZ2V0Q2xlYXJDb2xvciIsInNldENsZWFyQ29sb3IiLCJnZXRDbGVhckFscGhhIiwic2V0Q2xlYXJBbHBoYSIsInJlbmRlciIsImRyYXdBcnJheXMiLCJkcmF3QXJyYXlzSW5zdGFuY2VkQU5HTEUiLCJtYXhJbnN0YW5jZWRDb3VudCIsInNldE1vZGUiLCJyZW5kZXJJbnN0YW5jZXMiLCJtYXhBbmlzb3Ryb3B5IiwiTUFYX1RFWFRVUkVfTUFYX0FOSVNPVFJPUFlfRVhUIiwiZ2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0IiwiVkVSVEVYX1NIQURFUiIsIkhJR0hfRkxPQVQiLCJGUkFHTUVOVF9TSEFERVIiLCJNRURJVU1fRkxPQVQiLCJnZXRNYXhQcmVjaXNpb24iLCJtYXhQcmVjaXNpb24iLCJsb2dhcml0aG1pY0RlcHRoQnVmZmVyIiwiTUFYX1RFWFRVUkVfSU1BR0VfVU5JVFMiLCJNQVhfVkVSVEVYX1RFWFRVUkVfSU1BR0VfVU5JVFMiLCJNQVhfVEVYVFVSRV9TSVpFIiwiTUFYX0NVQkVfTUFQX1RFWFRVUkVfU0laRSIsIk1BWF9WRVJURVhfQVRUUklCUyIsIk1BWF9WRVJURVhfVU5JRk9STV9WRUNUT1JTIiwiTUFYX1ZBUllJTkdfVkVDVE9SUyIsIk1BWF9GUkFHTUVOVF9VTklGT1JNX1ZFQ1RPUlMiLCJtYXhWZXJ0ZXhUZXh0dXJlcyIsInZlcnRleFRleHR1cmVzIiwiZmxvYXRGcmFnbWVudFRleHR1cmVzIiwiZ2V0TWF4QW5pc290cm9weSIsIm1heFRleHR1cmVzIiwibWF4VGV4dHVyZVNpemUiLCJtYXhDdWJlbWFwU2l6ZSIsIm1heEF0dHJpYnV0ZXMiLCJtYXhWZXJ0ZXhVbmlmb3JtcyIsIm1heFZhcnlpbmdzIiwibWF4RnJhZ21lbnRVbmlmb3JtcyIsImZsb2F0VmVydGV4VGV4dHVyZXMiLCJnbG9iYWxTdGF0ZSIsIm51bUdsb2JhbFBsYW5lcyIsImxvY2FsQ2xpcHBpbmdFbmFibGVkIiwicmVuZGVyaW5nU2hhZG93cyIsInZpZXdOb3JtYWxNYXRyaXgiLCJ1bmlmb3JtIiwibnVtUGxhbmVzIiwibnVtSW50ZXJzZWN0aW9uIiwiaW5pdCIsImVuYWJsZUxvY2FsQ2xpcHBpbmciLCJwcm9qZWN0UGxhbmVzIiwiYmVnaW5TaGFkb3dzIiwiZW5kU2hhZG93cyIsInJlc2V0R2xvYmFsU3RhdGUiLCJzZXRTdGF0ZSIsImZyb21DYWNoZSIsImxHbG9iYWwiLCJuR2xvYmFsIiwiZHN0QXJyYXkiLCJjbGlwcGluZ1N0YXRlIiwic2tpcFRyYW5zZm9ybSIsIm5QbGFuZXMiLCJ2aWV3TWF0cml4IiwiZmxhdFNpemUiLCJpNCIsImdldEV4dGVuc2lvbiIsImJ1ZmZlcmdlb21ldHJ5Iiwib25HZW9tZXRyeURpc3Bvc2UiLCJ3aXJlZnJhbWVBdHRyaWJ1dGVzIiwibWVtb3J5IiwiX2J1ZmZlckdlb21ldHJ5IiwiRUxFTUVOVF9BUlJBWV9CVUZGRVIiLCJnZW9tZXRyeUF0dHJpYnV0ZXMiLCJBUlJBWV9CVUZGRVIiLCJnZW9tZXRyeUluZGV4IiwiZ2V0V2lyZWZyYW1lQXR0cmlidXRlIiwiZHJhd0VsZW1lbnRzIiwiZHJhd0VsZW1lbnRzSW5zdGFuY2VkQU5HTEUiLCJmcmFtZSIsImNhbGxzIiwidHJpYW5nbGVzIiwibGluZXMiLCJpbnN0YW5jZUNvdW50IiwiVFJJQU5HTEVTIiwiVFJJQU5HTEVfU1RSSVAiLCJUUklBTkdMRV9GQU4iLCJMSU5FUyIsIkxJTkVfU1RSSVAiLCJMSU5FX0xPT1AiLCJQT0lOVFMiLCJwcm9ncmFtcyIsImF1dG9SZXNldCIsInByb2dyYW0iLCJvYmplY3RJbmZsdWVuY2VzIiwiaW5mbHVlbmNlc0xpc3QiLCJpbmZsdWVuY2VzIiwiYWJzTnVtZXJpY2FsU29ydCIsImdldFVuaWZvcm1zIiwic2V0VmFsdWUiLCJ1cGRhdGVMaXN0IiwiQ3ViZVJlZmxlY3Rpb25NYXBwaW5nIiwiQ3ViZVRleHR1cmUiLCJzZXEiLCJuQmxvY2tzIiwiYmxvY2tTaXplIiwiZmlyc3RFbGVtIiwiYXJyYXlDYWNoZUYzMiIsImFycmF5Q2FjaGVJMzIiLCJhbGxvY1RleHR1cmVVbml0IiwidW5pZm9ybTFmIiwiYWRkciIsInVuaWZvcm0xaSIsInVuaWZvcm0yZnYiLCJ1bmlmb3JtMmYiLCJ1bmlmb3JtM2YiLCJ1bmlmb3JtM2Z2IiwidW5pZm9ybTRmdiIsInVuaWZvcm00ZiIsInVuaWZvcm1NYXRyaXgyZnYiLCJ1bmlmb3JtTWF0cml4M2Z2IiwibWF0M2FycmF5IiwidW5pZm9ybU1hdHJpeDRmdiIsIm1hdDRhcnJheSIsInVuaXQiLCJzZXRUZXh0dXJlMkQiLCJlbXB0eVRleHR1cmUiLCJzZXRUZXh0dXJlQ3ViZSIsImVtcHR5Q3ViZVRleHR1cmUiLCJ1bmlmb3JtMml2IiwidW5pZm9ybTNpdiIsInVuaWZvcm00aXYiLCJ1bmlmb3JtMWZ2IiwidW5pZm9ybTFpdiIsImZsYXR0ZW4iLCJ1bml0cyIsImFsbG9jVGV4VW5pdHMiLCJhY3RpdmVJbmZvIiwiZ2V0U2luZ3VsYXJTZXR0ZXIiLCJnZXRQdXJlQXJyYXlTZXR0ZXIiLCJVbmlmb3JtQ29udGFpbmVyIiwiU3RydWN0dXJlZFVuaWZvcm0iLCJjb250YWluZXIiLCJ1bmlmb3JtT2JqZWN0IiwicGF0aExlbmd0aCIsInBhdGgiLCJSZVBhdGhQYXJ0IiwibGFzdEluZGV4IiwibWF0Y2hFbmQiLCJpZElzSW5kZXgiLCJzdWJzY3JpcHQiLCJhZGRVbmlmb3JtIiwiZ2V0UHJvZ3JhbVBhcmFtZXRlciIsIkFDVElWRV9VTklGT1JNUyIsImdldEFjdGl2ZVVuaWZvcm0iLCJnZXRVbmlmb3JtTG9jYXRpb24iLCJwYXJzZVVuaWZvcm0iLCJXZWJHTFVuaWZvcm1zIiwic2V0T3B0aW9uYWwiLCJ1cGxvYWQiLCJzZXFXaXRoVmFsdWUiLCJqb2luIiwiY3JlYXRlU2hhZGVyIiwic2hhZGVyU291cmNlIiwic2hhZGVyIiwiY29tcGlsZVNoYWRlciIsImdldFNoYWRlclBhcmFtZXRlciIsIkNPTVBJTEVfU1RBVFVTIiwiZ2V0U2hhZGVySW5mb0xvZyIsImFkZExpbmVOdW1iZXJzIiwiZnVuY3Rpb25OYW1lIiwiZ2V0RW5jb2RpbmdDb21wb25lbnRzIiwidG9uZU1hcHBpbmciLCJ0b25lTWFwcGluZ05hbWUiLCJyZW5kZXJlckV4dGVuc2lvbnMiLCJlbnZNYXBDdWJlVVYiLCJmaWx0ZXJFbXB0eUxpbmUiLCJjaHVua3MiLCJBQ1RJVkVfQVRUUklCVVRFUyIsImdldEFjdGl2ZUF0dHJpYiIsImdldEF0dHJpYkxvY2F0aW9uIiwicmVwbGFjZSIsIm51bURpckxpZ2h0cyIsIm51bVNwb3RMaWdodHMiLCJudW1SZWN0QXJlYUxpZ2h0cyIsIm51bVBvaW50TGlnaHRzIiwibnVtSGVtaUxpZ2h0cyIsIm51bUNsaXBwaW5nUGxhbmVzIiwibnVtQ2xpcEludGVyc2VjdGlvbiIsImluY2x1ZGUiLCJwYXR0ZXJuIiwic25pcHBldCIsInVucm9sbCIsImNvZGUiLCJzaGFkb3dNYXBUeXBlIiwiUENGU2hhZG93TWFwIiwic2hhZG93TWFwVHlwZURlZmluZSIsIlBDRlNvZnRTaGFkb3dNYXAiLCJlbnZNYXBUeXBlRGVmaW5lIiwiZW52TWFwTW9kZURlZmluZSIsImVudk1hcEJsZW5kaW5nRGVmaW5lIiwiZ2VuZXJhdGVFeHRlbnNpb25zIiwiZ2VuZXJhdGVEZWZpbmVzIiwiY3JlYXRlUHJvZ3JhbSIsInByZWZpeEZyYWdtZW50IiwiaXNSYXdTaGFkZXJNYXRlcmlhbCIsInByZWZpeFZlcnRleCIsImN1c3RvbURlZmluZXMiLCJjdXN0b21FeHRlbnNpb25zIiwic3VwcG9ydHNWZXJ0ZXhUZXh0dXJlcyIsImdhbW1hRmFjdG9yRGVmaW5lIiwibWF4Qm9uZXMiLCJ1c2VGb2ciLCJmb2dFeHAiLCJ1c2VWZXJ0ZXhUZXh0dXJlIiwiZG91YmxlU2lkZWQiLCJmbGlwU2lkZWQiLCJzaGFkb3dNYXBFbmFibGVkIiwicGh5c2ljYWxseUNvcnJlY3RMaWdodHMiLCJOb1RvbmVNYXBwaW5nIiwiZ2V0VG9uZU1hcHBpbmdGdW5jdGlvbiIsIm91dHB1dEVuY29kaW5nIiwibWFwRW5jb2RpbmciLCJlbnZNYXBFbmNvZGluZyIsImVtaXNzaXZlTWFwRW5jb2RpbmciLCJnZXRUZXhlbERlY29kaW5nRnVuY3Rpb24iLCJnZXRUZXhlbEVuY29kaW5nRnVuY3Rpb24iLCJkZXB0aFBhY2tpbmciLCJwYXJzZUluY2x1ZGVzIiwicmVwbGFjZUxpZ2h0TnVtcyIsInJlcGxhY2VDbGlwcGluZ1BsYW5lTnVtcyIsInVucm9sbExvb3BzIiwiV2ViR0xTaGFkZXIiLCJ2ZXJ0ZXhHbHNsIiwiZnJhZ21lbnRHbHNsIiwiYXR0YWNoU2hhZGVyIiwiZ2xWZXJ0ZXhTaGFkZXIiLCJnbEZyYWdtZW50U2hhZGVyIiwiYmluZEF0dHJpYkxvY2F0aW9uIiwibGlua1Byb2dyYW0iLCJnZXRQcm9ncmFtSW5mb0xvZyIsInRyaW0iLCJMSU5LX1NUQVRVUyIsInJ1bm5hYmxlIiwiZ2V0RXJyb3IiLCJWQUxJREFURV9TVEFUVVMiLCJwcm9ncmFtTG9nIiwidmVydGV4TG9nIiwiZnJhZ21lbnRMb2ciLCJoYXZlRGlhZ25vc3RpY3MiLCJkaWFnbm9zdGljcyIsInByZWZpeCIsImRlbGV0ZVNoYWRlciIsImNhY2hlZFVuaWZvcm1zIiwiZ2V0QXR0cmlidXRlcyIsImNhY2hlZEF0dHJpYnV0ZXMiLCJmZXRjaEF0dHJpYnV0ZUxvY2F0aW9ucyIsImRlc3Ryb3kiLCJkZWxldGVQcm9ncmFtIiwicHJvZ3JhbUlkQ291bnQiLCJ1c2VkVGltZXMiLCJjYXBhYmlsaXRpZXMiLCJNZXNoRGVwdGhNYXRlcmlhbCIsIk1lc2hEaXN0YW5jZU1hdGVyaWFsIiwiTWVzaE5vcm1hbE1hdGVyaWFsIiwiTWVzaExhbWJlcnRNYXRlcmlhbCIsIk1lc2hQaG9uZ01hdGVyaWFsIiwiTWVzaFRvb25NYXRlcmlhbCIsIk1lc2hTdGFuZGFyZE1hdGVyaWFsIiwiTWVzaFBoeXNpY2FsTWF0ZXJpYWwiLCJMaW5lQmFzaWNNYXRlcmlhbCIsIkxpbmVEYXNoZWRNYXRlcmlhbCIsIlBvaW50c01hdGVyaWFsIiwiU2hhZG93TWF0ZXJpYWwiLCJza2VsZXRvbiIsImJvbmVzIiwiblZlcnRleFVuaWZvcm1zIiwiblZlcnRleE1hdHJpY2VzIiwiZ2FtbWFPdmVycmlkZUxpbmVhciIsIkdhbW1hRW5jb2RpbmciLCJnZXRQYXJhbWV0ZXJzIiwic2hhZG93cyIsIm5DbGlwUGxhbmVzIiwibkNsaXBJbnRlcnNlY3Rpb24iLCJzaGFkZXJJRHMiLCJpc1NraW5uZWRNZXNoIiwiYWxsb2NhdGVCb25lcyIsImdldFJlbmRlclRhcmdldCIsInNoYWRlcklEIiwiZ2V0VGV4dHVyZUVuY29kaW5nRnJvbU1hcCIsImN1cnJlbnRSZW5kZXJUYXJnZXQiLCJnYW1tYU91dHB1dCIsImdhbW1hSW5wdXQiLCJlbnZNYXBNb2RlIiwiQ3ViZVVWUmVmbGVjdGlvbk1hcHBpbmciLCJDdWJlVVZSZWZyYWN0aW9uTWFwcGluZyIsImlzRm9nRXhwMiIsIm1heE1vcnBoVGFyZ2V0cyIsIm1heE1vcnBoTm9ybWFscyIsImRpcmVjdGlvbmFsIiwic3BvdCIsInJlY3RBcmVhIiwiaGVtaSIsInNoYWRvd01hcCIsImdldFByb2dyYW1Db2RlIiwicGFyYW1ldGVyTmFtZXMiLCJhY3F1aXJlUHJvZ3JhbSIsInBsIiwicHJvZ3JhbUluZm8iLCJyZWxlYXNlUHJvZ3JhbSIsInJlbmRlckl0ZW1zSW5kZXgiLCJvcGFxdWUiLCJyZW5kZXJJdGVtcyIsInJlbmRlckl0ZW0iLCJwYWludGVyU29ydFN0YWJsZSIsInJldmVyc2VQYWludGVyU29ydFN0YWJsZSIsImxpc3RzIiwibGlzdCIsImxpZ2h0IiwiaGFsZldpZHRoIiwiaGFsZkhlaWdodCIsImFtYmllbnQiLCJpbnRlbnNpdHkiLCJpc0FtYmllbnRMaWdodCIsImlzRGlyZWN0aW9uYWxMaWdodCIsInZlY3RvcjMiLCJiaWFzIiwibWFwU2l6ZSIsImRpcmVjdGlvbmFsTGVuZ3RoIiwiaXNTcG90TGlnaHQiLCJwZW51bWJyYSIsInNwb3RMZW5ndGgiLCJpc1JlY3RBcmVhTGlnaHQiLCJtYXRyaXg0MiIsInJlY3RBcmVhTGVuZ3RoIiwiaXNQb2ludExpZ2h0IiwicG9pbnRMZW5ndGgiLCJpc0hlbWlzcGhlcmVMaWdodCIsImhlbWlMZW5ndGgiLCJzZXR1cCIsImxpZ2h0c0FycmF5Iiwic2hhZG93c0FycmF5Iiwic3ByaXRlc0FycmF5Iiwic2hhZG93TGlnaHQiLCJzZXR1cExpZ2h0cyIsInB1c2hMaWdodCIsInB1c2hTaGFkb3ciLCJwdXNoU3ByaXRlIiwicmVuZGVyU3RhdGVzIiwicmVuZGVyU3RhdGUiLCJCYXNpY0RlcHRoUGFja2luZyIsImlzTWVzaERlcHRoTWF0ZXJpYWwiLCJpc01lc2hEaXN0YW5jZU1hdGVyaWFsIiwiX3JlbmRlcmVyIiwiX29iamVjdHMiLCJfcHJvalNjcmVlbk1hdHJpeCIsIl9zaGFkb3dNYXBTaXplIiwiX21heFNoYWRvd01hcFNpemUiLCJfbG9va1RhcmdldCIsIl9saWdodFBvc2l0aW9uV29ybGQiLCJfTW9ycGhpbmdGbGFnIiwiX1NraW5uaW5nRmxhZyIsIl9OdW1iZXJPZk1hdGVyaWFsVmFyaWFudHMiLCJfZGVwdGhNYXRlcmlhbHMiLCJfZGlzdGFuY2VNYXRlcmlhbHMiLCJfbWF0ZXJpYWxDYWNoZSIsIlJHQkFEZXB0aFBhY2tpbmciLCJ1c2VNb3JwaGluZyIsInVzZVNraW5uaW5nIiwiZGVwdGhNYXRlcmlhbCIsImRpc3RhbmNlTWF0ZXJpYWwiLCJhdXRvVXBkYXRlIiwiX3N0YXRlIiwiX2dsIiwiQkxFTkQiLCJzZXRUZXN0Iiwic2V0U2Npc3NvclRlc3QiLCJjdWJlMkRWaWV3UG9ydHMiLCJ2cFdpZHRoIiwidnBIZWlnaHQiLCJwYXJzIiwic2hhZG93Q2FtZXJhIiwiaXNTcG90TGlnaHRTaGFkb3ciLCJmYWNlQ291bnQiLCJzaGFkb3dNYXRyaXgiLCJzZXRSZW5kZXJUYXJnZXQiLCJjdWJlRGlyZWN0aW9ucyIsImN1YmVVcHMiLCJ2cERpbWVuc2lvbnMiLCJfZnJ1c3R1bSIsInJlbmRlck9iamVjdCIsImxpZ2h0UG9zaXRpb25Xb3JsZCIsImN1c3RvbURlcHRoTWF0ZXJpYWwiLCJtYXRlcmlhbFZhcmlhbnRzIiwiY3VzdG9tTWF0ZXJpYWwiLCJjdXN0b21EaXN0YW5jZU1hdGVyaWFsIiwidmFyaWFudEluZGV4Iiwia2V5QiIsImtleUEiLCJtYXRlcmlhbHNGb3JWYXJpYW50IiwiY2FjaGVkTWF0ZXJpYWwiLCJncm91cE1hdGVyaWFsIiwiZ2V0RGVwdGhNYXRlcmlhbCIsIkNhbnZhc1RleHR1cmUiLCJlbGVtZW50QnVmZmVyIiwidmVydGV4QnVmZmVyIiwidXZPZmZzZXQiLCJ1dlNjYWxlIiwiZm9nVHlwZSIsImZvZ0RlcHRoIiwiZmlsbFN0eWxlIiwiZmlsbFJlY3QiLCJzcHJpdGVzIiwidXNlUHJvZ3JhbSIsImluaXRBdHRyaWJ1dGVzIiwiZW5hYmxlQXR0cmlidXRlIiwiZGlzYWJsZVVudXNlZEF0dHJpYnV0ZXMiLCJDVUxMX0ZBQ0UiLCJ2ZXJ0ZXhBdHRyaWJQb2ludGVyIiwiYWN0aXZlVGV4dHVyZSIsIlRFWFRVUkUwIiwiaXNGb2ciLCJvbGRGb2dUeXBlIiwic2NlbmVGb2dUeXBlIiwiZGVuc2l0eSIsInNwcml0ZVBvc2l0aW9uIiwic3ByaXRlUm90YXRpb24iLCJzcHJpdGVTY2FsZSIsInNldEJsZW5kaW5nIiwic2V0TWFzayIsInV0aWxzIiwiY29sb3JNYXNrIiwiY3VycmVudENvbG9yTWFzayIsImxvY2tlZCIsInNldExvY2tlZCIsImxvY2siLCJjdXJyZW50Q29sb3JDbGVhciIsIkRFUFRIX1RFU1QiLCJkZXB0aE1hc2siLCJjdXJyZW50RGVwdGhNYXNrIiwic2V0RnVuYyIsImN1cnJlbnREZXB0aEZ1bmMiLCJORVZFUiIsIkFMV0FZUyIsIkxFU1MiLCJMRVFVQUwiLCJFUVVBTCIsIkdFUVVBTCIsIkdSRUFURVIiLCJOT1RFUVVBTCIsImN1cnJlbnREZXB0aENsZWFyIiwiY2xlYXJEZXB0aCIsInN0ZW5jaWxUZXN0IiwiU1RFTkNJTF9URVNUIiwic3RlbmNpbE1hc2siLCJjdXJyZW50U3RlbmNpbE1hc2siLCJzdGVuY2lsRnVuYyIsInN0ZW5jaWxSZWYiLCJjdXJyZW50U3RlbmNpbEZ1bmMiLCJjdXJyZW50U3RlbmNpbFJlZiIsImN1cnJlbnRTdGVuY2lsRnVuY01hc2siLCJzZXRPcCIsInN0ZW5jaWxGYWlsIiwic3RlbmNpbFpGYWlsIiwic3RlbmNpbFpQYXNzIiwiY3VycmVudFN0ZW5jaWxGYWlsIiwiY3VycmVudFN0ZW5jaWxaRmFpbCIsImN1cnJlbnRTdGVuY2lsWlBhc3MiLCJzdGVuY2lsT3AiLCJzdGVuY2lsIiwiY3VycmVudFN0ZW5jaWxDbGVhciIsImNsZWFyU3RlbmNpbCIsIm1heFZlcnRleEF0dHJpYnV0ZXMiLCJNQVhfQ09NQklORURfVEVYVFVSRV9JTUFHRV9VTklUUyIsIlZFUlNJT04iLCJnbFZlcnNpb24iLCJsaW5lV2lkdGhBdmFpbGFibGUiLCJjcmVhdGVUZXh0dXJlIiwiYmluZFRleHR1cmUiLCJ0ZXhQYXJhbWV0ZXJpIiwiVEVYVFVSRV9NSU5fRklMVEVSIiwiTkVBUkVTVCIsIlRFWFRVUkVfTUFHX0ZJTFRFUiIsInRleEltYWdlMkQiLCJSR0JBIiwiZW1wdHlUZXh0dXJlcyIsIlRFWFRVUkVfMkQiLCJURVhUVVJFX0NVQkVfTUFQIiwiVEVYVFVSRV9DVUJFX01BUF9QT1NJVElWRV9YIiwiY29sb3JCdWZmZXIiLCJzZXRGbGlwU2lkZWQiLCJzZXRDdWxsRmFjZSIsIkN1bGxGYWNlQmFjayIsIm5ld0F0dHJpYnV0ZXMiLCJlbmFibGVkQXR0cmlidXRlcyIsImVuYWJsZVZlcnRleEF0dHJpYkFycmF5IiwiYXR0cmlidXRlRGl2aXNvcnMiLCJ2ZXJ0ZXhBdHRyaWJEaXZpc29yQU5HTEUiLCJtZXNoUGVyQXR0cmlidXRlIiwiZGlzYWJsZVZlcnRleEF0dHJpYkFycmF5IiwiY29tcHJlc3NlZFRleHR1cmVGb3JtYXRzIiwiQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFMiLCJmb3JtYXRzIiwiY3VycmVudFByb2dyYW0iLCJOb0JsZW5kaW5nIiwiQ3VzdG9tQmxlbmRpbmciLCJjdXJyZW50QmxlbmRpbmciLCJjdXJyZW50UHJlbXVsdGlwbGVkQWxwaGEiLCJibGVuZEVxdWF0aW9uU2VwYXJhdGUiLCJGVU5DX0FERCIsImJsZW5kRnVuY1NlcGFyYXRlIiwiT05FIiwiYmxlbmRGdW5jIiwiU1JDX0FMUEhBIiwiWkVSTyIsIk9ORV9NSU5VU19TUkNfQ09MT1IiLCJPTkVfTUlOVVNfU1JDX0FMUEhBIiwiU1JDX0NPTE9SIiwiY3VycmVudEJsZW5kRXF1YXRpb24iLCJjdXJyZW50QmxlbmRTcmMiLCJjdXJyZW50QmxlbmREc3QiLCJjdXJyZW50QmxlbmRFcXVhdGlvbkFscGhhIiwiY3VycmVudEJsZW5kU3JjQWxwaGEiLCJjdXJyZW50QmxlbmREc3RBbHBoYSIsImNvbnZlcnQiLCJmcm9udEZhY2VDVyIsInNldFBvbHlnb25PZmZzZXQiLCJjdXJyZW50RmxpcFNpZGVkIiwiZnJvbnRGYWNlIiwiQ1ciLCJDQ1ciLCJjdWxsRmFjZSIsIkN1bGxGYWNlTm9uZSIsImN1cnJlbnRDdWxsRmFjZSIsIkJBQ0siLCJDdWxsRmFjZUZyb250IiwiRlJPTlQiLCJGUk9OVF9BTkRfQkFDSyIsImN1cnJlbnRMaW5lV2lkdGgiLCJsaW5lV2lkdGgiLCJmYWN0b3IiLCJQT0xZR09OX09GRlNFVF9GSUxMIiwiY3VycmVudFBvbHlnb25PZmZzZXRGYWN0b3IiLCJjdXJyZW50UG9seWdvbk9mZnNldFVuaXRzIiwiU0NJU1NPUl9URVNUIiwid2ViZ2xTbG90IiwiY3VycmVudFRleHR1cmVTbG90Iiwid2ViZ2xUeXBlIiwid2ViZ2xUZXh0dXJlIiwiY3VycmVudEJvdW5kVGV4dHVyZXMiLCJib3VuZFRleHR1cmUiLCJjb21wcmVzc2VkVGV4SW1hZ2UyRCIsImN1cnJlbnRTY2lzc29yIiwiY3VycmVudFZpZXdwb3J0IiwiZW5hYmxlQXR0cmlidXRlQW5kRGl2aXNvciIsImdldENvbXByZXNzZWRUZXh0dXJlRm9ybWF0cyIsInNldE1hdGVyaWFsIiwic2V0TGluZVdpZHRoIiwibWF4U2l6ZSIsIl9jYW52YXMiLCJnZW5lcmF0ZU1pcG1hcCIsInRleHR1cmVQcm9wZXJ0aWVzIiwiX19tYXhNaXBMZXZlbCIsIkxPRzJFIiwiTmVhcmVzdE1pcE1hcE5lYXJlc3RGaWx0ZXIiLCJOZWFyZXN0TWlwTWFwTGluZWFyRmlsdGVyIiwiTElORUFSIiwib25UZXh0dXJlRGlzcG9zZSIsImRlYWxsb2NhdGVUZXh0dXJlIiwiaXNWaWRlb1RleHR1cmUiLCJyZW5kZXJUYXJnZXQiLCJvblJlbmRlclRhcmdldERpc3Bvc2UiLCJkZWFsbG9jYXRlUmVuZGVyVGFyZ2V0IiwiX19pbWFnZV9fd2ViZ2xUZXh0dXJlQ3ViZSIsImRlbGV0ZVRleHR1cmUiLCJfX3dlYmdsSW5pdCIsIl9fd2ViZ2xUZXh0dXJlIiwiZGVsZXRlRnJhbWVidWZmZXIiLCJyZW5kZXJUYXJnZXRQcm9wZXJ0aWVzIiwiX193ZWJnbEZyYW1lYnVmZmVyIiwiX193ZWJnbERlcHRoYnVmZmVyIiwiZGVsZXRlUmVuZGVyYnVmZmVyIiwic2xvdCIsInVwZGF0ZVZpZGVvVGV4dHVyZSIsIl9fdmVyc2lvbiIsInVwbG9hZFRleHR1cmUiLCJwaXhlbFN0b3JlaSIsIlVOUEFDS19GTElQX1lfV0VCR0wiLCJpc0NvbXByZXNzZWRUZXh0dXJlIiwiaXNDb21wcmVzc2VkIiwiY3ViZUltYWdlIiwiY2xhbXBUb01heFNpemUiLCJpc1Bvd2VyT2ZUd29JbWFnZSIsImdsRm9ybWF0IiwiZ2xUeXBlIiwic2V0VGV4dHVyZVBhcmFtZXRlcnMiLCJtaXBtYXAiLCJSR0JGb3JtYXQiLCJ0ZXh0dXJlTmVlZHNHZW5lcmF0ZU1pcG1hcHMiLCJ0ZXh0dXJlVHlwZSIsIlRFWFRVUkVfV1JBUF9TIiwiVEVYVFVSRV9XUkFQX1QiLCJDTEFNUF9UT19FREdFIiwiZmlsdGVyRmFsbGJhY2siLCJGbG9hdFR5cGUiLCJIYWxmRmxvYXRUeXBlIiwiX19jdXJyZW50QW5pc290cm9weSIsInRleFBhcmFtZXRlcmYiLCJURVhUVVJFX01BWF9BTklTT1RST1BZX0VYVCIsIlVOUEFDS19QUkVNVUxUSVBMWV9BTFBIQV9XRUJHTCIsIlVOUEFDS19BTElHTk1FTlQiLCJ0ZXh0dXJlTmVlZHNQb3dlck9mVHdvIiwibWFrZVBvd2VyT2ZUd28iLCJpc0RlcHRoVGV4dHVyZSIsIkRFUFRIX0NPTVBPTkVOVCIsIl9pc1dlYkdMMiIsImludGVybmFsRm9ybWF0IiwiREVQVEhfQ09NUE9ORU5UMzJGIiwiREVQVEhfQ09NUE9ORU5UMTYiLCJEZXB0aEZvcm1hdCIsIlVuc2lnbmVkU2hvcnRUeXBlIiwiVW5zaWduZWRJbnRUeXBlIiwiRGVwdGhTdGVuY2lsRm9ybWF0IiwiREVQVEhfU1RFTkNJTCIsIlVuc2lnbmVkSW50MjQ4VHlwZSIsImZyYW1lYnVmZmVyIiwiYXR0YWNobWVudCIsInRleHR1cmVUYXJnZXQiLCJiaW5kRnJhbWVidWZmZXIiLCJGUkFNRUJVRkZFUiIsImZyYW1lYnVmZmVyVGV4dHVyZTJEIiwicmVuZGVyYnVmZmVyIiwiYmluZFJlbmRlcmJ1ZmZlciIsIlJFTkRFUkJVRkZFUiIsInJlbmRlcmJ1ZmZlclN0b3JhZ2UiLCJmcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlciIsIkRFUFRIX0FUVEFDSE1FTlQiLCJERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlQiLCJSR0JBNCIsImlzQ3ViZSIsIndlYmdsRGVwdGhUZXh0dXJlIiwic2V0dXBEZXB0aFRleHR1cmUiLCJjcmVhdGVSZW5kZXJidWZmZXIiLCJzZXR1cFJlbmRlckJ1ZmZlclN0b3JhZ2UiLCJjcmVhdGVGcmFtZWJ1ZmZlciIsImlzVGFyZ2V0UG93ZXJPZlR3byIsInNldHVwRnJhbWVCdWZmZXJUZXh0dXJlIiwiQ09MT1JfQVRUQUNITUVOVDAiLCJzZXR1cERlcHRoUmVuZGVyYnVmZmVyIiwiX3ZpZGVvVGV4dHVyZXMiLCJzZXRUZXh0dXJlQ3ViZUR5bmFtaWMiLCJzZXR1cFJlbmRlclRhcmdldCIsInVwZGF0ZVJlbmRlclRhcmdldE1pcG1hcCIsIlJlcGVhdFdyYXBwaW5nIiwiUkVQRUFUIiwiTWlycm9yZWRSZXBlYXRXcmFwcGluZyIsIk1JUlJPUkVEX1JFUEVBVCIsIk5FQVJFU1RfTUlQTUFQX05FQVJFU1QiLCJORUFSRVNUX01JUE1BUF9MSU5FQVIiLCJMaW5lYXJNaXBNYXBOZWFyZXN0RmlsdGVyIiwiTElORUFSX01JUE1BUF9ORUFSRVNUIiwiTElORUFSX01JUE1BUF9MSU5FQVIiLCJVbnNpZ25lZFNob3J0NDQ0NFR5cGUiLCJVTlNJR05FRF9TSE9SVF80XzRfNF80IiwiVW5zaWduZWRTaG9ydDU1NTFUeXBlIiwiVU5TSUdORURfU0hPUlRfNV81XzVfMSIsIlVuc2lnbmVkU2hvcnQ1NjVUeXBlIiwiVU5TSUdORURfU0hPUlRfNV82XzUiLCJCeXRlVHlwZSIsIlNob3J0VHlwZSIsIkludFR5cGUiLCJIQUxGX0ZMT0FUX09FUyIsIkFscGhhRm9ybWF0IiwiQUxQSEEiLCJSR0IiLCJMdW1pbmFuY2VGb3JtYXQiLCJMVU1JTkFOQ0UiLCJMdW1pbmFuY2VBbHBoYUZvcm1hdCIsIkxVTUlOQU5DRV9BTFBIQSIsIlN1YnRyYWN0RXF1YXRpb24iLCJGVU5DX1NVQlRSQUNUIiwiUmV2ZXJzZVN1YnRyYWN0RXF1YXRpb24iLCJGVU5DX1JFVkVSU0VfU1VCVFJBQ1QiLCJaZXJvRmFjdG9yIiwiT25lRmFjdG9yIiwiU3JjQ29sb3JGYWN0b3IiLCJPbmVNaW51c1NyY0NvbG9yRmFjdG9yIiwiRHN0QWxwaGFGYWN0b3IiLCJEU1RfQUxQSEEiLCJPbmVNaW51c0RzdEFscGhhRmFjdG9yIiwiT05FX01JTlVTX0RTVF9BTFBIQSIsIkRzdENvbG9yRmFjdG9yIiwiRFNUX0NPTE9SIiwiT25lTWludXNEc3RDb2xvckZhY3RvciIsIk9ORV9NSU5VU19EU1RfQ09MT1IiLCJTcmNBbHBoYVNhdHVyYXRlRmFjdG9yIiwiU1JDX0FMUEhBX1NBVFVSQVRFIiwiUkdCX1MzVENfRFhUMV9Gb3JtYXQiLCJSR0JBX1MzVENfRFhUMV9Gb3JtYXQiLCJSR0JBX1MzVENfRFhUM19Gb3JtYXQiLCJSR0JBX1MzVENfRFhUNV9Gb3JtYXQiLCJDT01QUkVTU0VEX1JHQl9TM1RDX0RYVDFfRVhUIiwiQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUMV9FWFQiLCJDT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQzX0VYVCIsIkNPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDVfRVhUIiwiUkdCX1BWUlRDXzRCUFBWMV9Gb3JtYXQiLCJSR0JfUFZSVENfMkJQUFYxX0Zvcm1hdCIsIlJHQkFfUFZSVENfNEJQUFYxX0Zvcm1hdCIsIlJHQkFfUFZSVENfMkJQUFYxX0Zvcm1hdCIsIkNPTVBSRVNTRURfUkdCX1BWUlRDXzRCUFBWMV9JTUciLCJDT01QUkVTU0VEX1JHQl9QVlJUQ18yQlBQVjFfSU1HIiwiQ09NUFJFU1NFRF9SR0JBX1BWUlRDXzRCUFBWMV9JTUciLCJDT01QUkVTU0VEX1JHQkFfUFZSVENfMkJQUFYxX0lNRyIsIlJHQl9FVEMxX0Zvcm1hdCIsIkNPTVBSRVNTRURfUkdCX0VUQzFfV0VCR0wiLCJSR0JBX0FTVENfNHg0X0Zvcm1hdCIsIlJHQkFfQVNUQ181eDRfRm9ybWF0IiwiUkdCQV9BU1RDXzV4NV9Gb3JtYXQiLCJSR0JBX0FTVENfNng1X0Zvcm1hdCIsIlJHQkFfQVNUQ182eDZfRm9ybWF0IiwiUkdCQV9BU1RDXzh4NV9Gb3JtYXQiLCJSR0JBX0FTVENfOHg2X0Zvcm1hdCIsIlJHQkFfQVNUQ184eDhfRm9ybWF0IiwiUkdCQV9BU1RDXzEweDVfRm9ybWF0IiwiUkdCQV9BU1RDXzEweDZfRm9ybWF0IiwiUkdCQV9BU1RDXzEweDhfRm9ybWF0IiwiUkdCQV9BU1RDXzEweDEwX0Zvcm1hdCIsIlJHQkFfQVNUQ18xMngxMF9Gb3JtYXQiLCJSR0JBX0FTVENfMTJ4MTJfRm9ybWF0IiwiTWluRXF1YXRpb24iLCJNYXhFcXVhdGlvbiIsIk1JTl9FWFQiLCJNQVhfRVhUIiwiVU5TSUdORURfSU5UXzI0XzhfV0VCR0wiLCJmb3YiLCJhc3BlY3QiLCJmb2N1cyIsImZpbG1HYXVnZSIsImZpbG1PZmZzZXQiLCJQZXJzcGVjdGl2ZUNhbWVyYSIsImlzUGVyc3BlY3RpdmVDYW1lcmEiLCJzZXRGb2NhbExlbmd0aCIsImZvY2FsTGVuZ3RoIiwiZ2V0RmlsbUhlaWdodCIsImF0YW4iLCJ2RXh0ZW50U2xvcGUiLCJnZXRGb2NhbExlbmd0aCIsInRhbiIsImdldEVmZmVjdGl2ZUZPViIsImdldEZpbG1XaWR0aCIsInNrZXciLCJjYW1lcmFzIiwiQXJyYXlDYW1lcmEiLCJpc0FycmF5Q2FtZXJhIiwiZnJhbWVEYXRhIiwiVlJGcmFtZURhdGEiLCJvblZSRGlzcGxheVByZXNlbnRDaGFuZ2UiLCJjYW1lcmFMIiwiYm91bmRzIiwiY2FtZXJhUiIsImNhbWVyYVZSIiwiZGV2aWNlIiwiaXNQcmVzZW50aW5nIiwiY3VycmVudFBpeGVsUmF0aW8iLCJnZXRFeWVQYXJhbWV0ZXJzIiwiZXllUGFyYW1ldGVycyIsInJlbmRlcldpZHRoIiwicmVuZGVySGVpZ2h0IiwiZ2V0UGl4ZWxSYXRpbyIsImN1cnJlbnRTaXplIiwic2V0RHJhd2luZ0J1ZmZlclNpemUiLCJ1c2VySGVpZ2h0IiwiZ2V0RGV2aWNlIiwic2V0RGV2aWNlIiwic2V0UG9zZVRhcmdldCIsInBvc2VUYXJnZXQiLCJnZXRDYW1lcmEiLCJkZXB0aE5lYXIiLCJkZXB0aEZhciIsImdldEZyYW1lRGF0YSIsInN0YWdlUGFyYW1ldGVycyIsInN0YW5kaW5nTWF0cml4Iiwic2l0dGluZ1RvU3RhbmRpbmdUcmFuc2Zvcm0iLCJwb3NlIiwicG9zZU9iamVjdCIsIm9yaWVudGF0aW9uIiwidGVtcFF1YXRlcm5pb24iLCJ0ZW1wUG9zaXRpb24iLCJsZWZ0Vmlld01hdHJpeCIsInJpZ2h0Vmlld01hdHJpeCIsInN0YW5kaW5nTWF0cml4SW52ZXJzZSIsImxlZnRQcm9qZWN0aW9uTWF0cml4IiwicmlnaHRQcm9qZWN0aW9uTWF0cml4IiwiZ2V0TGF5ZXJzIiwibGF5ZXIiLCJsZWZ0Qm91bmRzIiwicmlnaHRCb3VuZHMiLCJnZXRTdGFuZGluZ01hdHJpeCIsInN1Ym1pdEZyYW1lIiwiUkVWSVNJT04iLCJfY29udGV4dCIsIl9hbHBoYSIsIl9kZXB0aCIsIl9zdGVuY2lsIiwiX2FudGlhbGlhcyIsImFudGlhbGlhcyIsIl9wcmVtdWx0aXBsaWVkQWxwaGEiLCJfcHJlc2VydmVEcmF3aW5nQnVmZmVyIiwicHJlc2VydmVEcmF3aW5nQnVmZmVyIiwiX3Bvd2VyUHJlZmVyZW5jZSIsInBvd2VyUHJlZmVyZW5jZSIsImRvbUVsZW1lbnQiLCJzb3J0T2JqZWN0cyIsIkxpbmVhclRvbmVNYXBwaW5nIiwidG9uZU1hcHBpbmdFeHBvc3VyZSIsInRvbmVNYXBwaW5nV2hpdGVQb2ludCIsIl9pc0NvbnRleHRMb3N0IiwiX2N1cnJlbnRSZW5kZXJUYXJnZXQiLCJfY3VycmVudEZyYW1lYnVmZmVyIiwiX2N1cnJlbnRNYXRlcmlhbElkIiwiX2N1cnJlbnRHZW9tZXRyeVByb2dyYW0iLCJfY3VycmVudENhbWVyYSIsIl9jdXJyZW50QXJyYXlDYW1lcmEiLCJfY3VycmVudFZpZXdwb3J0IiwiX2N1cnJlbnRTY2lzc29yIiwiX2N1cnJlbnRTY2lzc29yVGVzdCIsIl91c2VkVGV4dHVyZVVuaXRzIiwiX3dpZHRoIiwiX2hlaWdodCIsIl9waXhlbFJhdGlvIiwiX3ZpZXdwb3J0IiwiX3NjaXNzb3IiLCJfc2Npc3NvclRlc3QiLCJfY2xpcHBpbmciLCJfY2xpcHBpbmdFbmFibGVkIiwiX2xvY2FsQ2xpcHBpbmdFbmFibGVkIiwiX3ZlY3RvcjMiLCJvbkNvbnRleHRMb3N0Iiwib25Db250ZXh0UmVzdG9yZSIsImNvbnRleHRBdHRyaWJ1dGVzIiwibWVzc2FnZSIsIm9iamVjdHMiLCJyZW5kZXJMaXN0cyIsIm1vcnBodGFyZ2V0cyIsImJ1ZmZlclJlbmRlcmVyIiwiaW5kZXhlZEJ1ZmZlclJlbmRlcmVyIiwicHJvZ3JhbUNhY2hlIiwiX3RoaXMiLCJzcHJpdGVSZW5kZXJlciIsImluaXRHTENvbnRleHQiLCJ2ciIsImdldENvbnRleHRBdHRyaWJ1dGVzIiwiZm9yY2VDb250ZXh0TG9zcyIsImxvc2VDb250ZXh0IiwiZm9yY2VDb250ZXh0UmVzdG9yZSIsInJlc3RvcmVDb250ZXh0Iiwic2V0UGl4ZWxSYXRpbyIsInVwZGF0ZVN0eWxlIiwic2V0Vmlld3BvcnQiLCJnZXREcmF3aW5nQnVmZmVyU2l6ZSIsInBpeGVsUmF0aW8iLCJnZXRDdXJyZW50Vmlld3BvcnQiLCJzZXRTY2lzc29yIiwiYm9vbGVhbiIsImJpdHMiLCJDT0xPUl9CVUZGRVJfQklUIiwiREVQVEhfQlVGRkVSX0JJVCIsIlNURU5DSUxfQlVGRkVSX0JJVCIsImNsZWFyVGFyZ2V0Iiwic3RvcEFuaW1hdGlvbiIsInByZXZlbnREZWZhdWx0Iiwib25NYXRlcmlhbERpc3Bvc2UiLCJkZWFsbG9jYXRlTWF0ZXJpYWwiLCJyZWxlYXNlTWF0ZXJpYWxQcm9ncmFtUmVmZXJlbmNlIiwicmVuZGVyQnVmZmVySW1tZWRpYXRlIiwiaGFzUG9zaXRpb25zIiwiaGFzTm9ybWFscyIsImhhc1V2cyIsImhhc0NvbG9ycyIsInBvc2l0aW9uQXJyYXkiLCJwcm9ncmFtQXR0cmlidXRlcyIsImlzTWVzaFBob25nTWF0ZXJpYWwiLCJpc01lc2hTdGFuZGFyZE1hdGVyaWFsIiwiaXNNZXNoTm9ybWFsTWF0ZXJpYWwiLCJub3JtYWxBcnJheSIsIm54IiwibnkiLCJueiIsInV2QXJyYXkiLCJjb2xvckFycmF5Iiwic2V0UHJvZ3JhbSIsImdlb21ldHJ5UHJvZ3JhbSIsInVwZGF0ZUJ1ZmZlcnMiLCJyYW5nZUZhY3RvciIsInNldHVwVmVydGV4QXR0cmlidXRlcyIsImRhdGFDb3VudCIsInJhbmdlU3RhcnQiLCJyYW5nZUNvdW50IiwiZHJhd0VuZCIsImRyYXdTdGFydCIsImRyYXdDb3VudCIsImdldFRhcmdldFBpeGVsUmF0aW8iLCJpc0xpbmVTZWdtZW50cyIsImlzTGluZUxvb3AiLCJpc0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5IiwicHJvZ3JhbUF0dHJpYnV0ZSIsImdlb21ldHJ5QXR0cmlidXRlIiwic3RyaWRlIiwiaXNJbnN0YW5jZWRJbnRlcmxlYXZlZEJ1ZmZlciIsImlzSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlIiwibWF0ZXJpYWxEZWZhdWx0QXR0cmlidXRlVmFsdWVzIiwidmVydGV4QXR0cmliMmZ2IiwidmVydGV4QXR0cmliM2Z2IiwidmVydGV4QXR0cmliNGZ2IiwidmVydGV4QXR0cmliMWZ2IiwiY29tcGlsZSIsImN1cnJlbnRSZW5kZXJTdGF0ZSIsImlzTGlnaHQiLCJpbml0TWF0ZXJpYWwiLCJpc0FuaW1hdGluZyIsInJlcXVlc3RBbmltYXRpb25Mb29wRnJhbWUiLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJhbmltYXRpb25Mb29wIiwidGltZSIsIm9uQW5pbWF0aW9uRnJhbWUiLCJhbmltYXRlIiwic3RhcnRBbmltYXRpb24iLCJjdXJyZW50UmVuZGVyTGlzdCIsInByb2plY3RPYmplY3QiLCJvdmVycmlkZU1hdGVyaWFsIiwib3BhcXVlT2JqZWN0cyIsInJlbmRlck9iamVjdHMiLCJ0cmFuc3BhcmVudE9iamVjdHMiLCJpc1Nwcml0ZSIsImlzSW1tZWRpYXRlUmVuZGVyT2JqZWN0IiwiY2FtZXJhMiIsInJlbmRlck9iamVjdEltbWVkaWF0ZSIsIm1hdGVyaWFsUHJvcGVydGllcyIsImxpZ2h0c0hhc2giLCJwcm9ncmFtQ2hhbmdlIiwibnVtU3VwcG9ydGVkTW9ycGhUYXJnZXRzIiwibnVtU3VwcG9ydGVkTW9ycGhOb3JtYWxzIiwidW5pZm9ybXNMaXN0IiwicHJvZ1VuaWZvcm1zIiwidXNlQ2FjaGUiLCJwX3VuaWZvcm1zIiwibV91bmlmb3JtcyIsInJlZnJlc2hQcm9ncmFtIiwicmVmcmVzaE1hdGVyaWFsIiwicmVmcmVzaExpZ2h0cyIsImNhbWVyYVBvc2l0aW9uIiwidUNhbVBvcyIsImlzTWVzaExhbWJlcnRNYXRlcmlhbCIsImJvbmVUZXh0dXJlIiwiYm9uZU1hdHJpY2VzIiwiYm9uZVRleHR1cmVTaXplIiwibWFya1VuaWZvcm1zTGlnaHRzTmVlZHNVcGRhdGUiLCJyZWZyZXNoVW5pZm9ybXNGb2ciLCJyZWZyZXNoVW5pZm9ybXNDb21tb24iLCJyZWZyZXNoVW5pZm9ybXNMYW1iZXJ0IiwiaXNNZXNoVG9vbk1hdGVyaWFsIiwicmVmcmVzaFVuaWZvcm1zVG9vbiIsInJlZnJlc2hVbmlmb3Jtc1Bob25nIiwiaXNNZXNoUGh5c2ljYWxNYXRlcmlhbCIsInJlZnJlc2hVbmlmb3Jtc1BoeXNpY2FsIiwicmVmcmVzaFVuaWZvcm1zU3RhbmRhcmQiLCJyZWZyZXNoVW5pZm9ybXNEZXB0aCIsInJlZnJlc2hVbmlmb3Jtc0Rpc3RhbmNlIiwicmVmcmVzaFVuaWZvcm1zTm9ybWFsIiwiaXNMaW5lQmFzaWNNYXRlcmlhbCIsInJlZnJlc2hVbmlmb3Jtc0xpbmUiLCJpc0xpbmVEYXNoZWRNYXRlcmlhbCIsInJlZnJlc2hVbmlmb3Jtc0Rhc2giLCJpc1BvaW50c01hdGVyaWFsIiwicmVmcmVzaFVuaWZvcm1zUG9pbnRzIiwiaXNTaGFkb3dNYXRlcmlhbCIsImx0Y18xIiwiTFRDXzEiLCJsdGNfMiIsIkxUQ18yIiwidXZTY2FsZU1hcCIsInRleHR1cmVVbml0Iiwid2FybmVkIiwic2V0VGV4dHVyZSIsInJlYWRSZW5kZXJUYXJnZXRQaXhlbHMiLCJyZXN0b3JlIiwidGV4dHVyZUZvcm1hdCIsIklNUExFTUVOVEFUSU9OX0NPTE9SX1JFQURfRk9STUFUIiwiSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9UWVBFIiwiY2hlY2tGcmFtZWJ1ZmZlclN0YXR1cyIsIkZSQU1FQlVGRkVSX0NPTVBMRVRFIiwicmVhZFBpeGVscyIsImNvcHlGcmFtZWJ1ZmZlclRvVGV4dHVyZSIsImxldmVsIiwiY29weVRleEltYWdlMkQiLCJjb3B5VGV4dHVyZVRvVGV4dHVyZSIsInNyY1RleHR1cmUiLCJkc3RUZXh0dXJlIiwidGV4U3ViSW1hZ2UyRCIsInBpeGVscyIsIkZvZ0V4cDIiLCJGb2ciLCJTY2VuZSIsIlNwcml0ZU1hdGVyaWFsIiwiaXNTcHJpdGVNYXRlcmlhbCIsIlNwcml0ZSIsIndvcmxkUG9zaXRpb24iLCJpbnRlcnNlY3RQb2ludCIsIndvcmxkU2NhbGUiLCJndWVzc1NpemVTcSIsImxldmVscyIsIkxPRCIsImFkZExldmVsIiwiZ2V0T2JqZWN0Rm9yRGlzdGFuY2UiLCJtYXRyaXhQb3NpdGlvbiIsImJvbmVJbnZlcnNlcyIsImNhbGN1bGF0ZUludmVyc2VzIiwiU2tlbGV0b24iLCJib25lIiwiaXNCb25lIiwiaWRlbnRpdHlNYXRyaXgiLCJvZmZzZXRNYXRyaXgiLCJnZXRCb25lQnlOYW1lIiwiQm9uZSIsImJpbmRNb2RlIiwiYmluZE1hdHJpeCIsImJpbmRNYXRyaXhJbnZlcnNlIiwiaW5pdEJvbmVzIiwiYmluZCIsIm5vcm1hbGl6ZVNraW5XZWlnaHRzIiwiU2tpbm5lZE1lc2giLCJnYm9uZSIsInJvdHEiLCJzY2wiLCJzdyIsInNraW5XZWlnaHQiLCJ2ZWMiLCJsaW5lY2FwIiwibGluZWpvaW4iLCJMaW5lIiwiY29tcHV0ZUxpbmVEaXN0YW5jZXMiLCJwb3NpdGlvbkF0dHJpYnV0ZSIsImxpbmVQcmVjaXNpb24iLCJ2U3RhcnQiLCJ2RW5kIiwiaW50ZXJSYXkiLCJpbnRlclNlZ21lbnQiLCJkaXN0U3EiLCJwcmVjaXNpb25TcSIsIm5iVmVydGljZXMiLCJMaW5lU2VnbWVudHMiLCJMaW5lTG9vcCIsIlBvaW50cyIsInBhcmFtcyIsInRocmVzaG9sZCIsImxvY2FsVGhyZXNob2xkIiwicmF5UG9pbnREaXN0YW5jZVNxIiwibG9jYWxUaHJlc2hvbGRTcSIsImRpc3RhbmNlVG9SYXkiLCJ0ZXN0UG9pbnQiLCJHcm91cCIsImlzR3JvdXAiLCJ2aWRlbyIsIlZpZGVvVGV4dHVyZSIsInJlYWR5U3RhdGUiLCJIQVZFX0NVUlJFTlRfREFUQSIsIkNvbXByZXNzZWRUZXh0dXJlIiwiRGVwdGhUZXh0dXJlIiwib2wiLCJlZGdlcyIsImVkZ2UiLCJXaXJlZnJhbWVHZW9tZXRyeSIsImZ1bmMiLCJzbGljZXMiLCJzdGFja3MiLCJQYXJhbWV0cmljR2VvbWV0cnkiLCJwdiIsInB1Iiwic2xpY2VDb3VudCIsIlBhcmFtZXRyaWNCdWZmZXJHZW9tZXRyeSIsImRldGFpbCIsIlBvbHloZWRyb25HZW9tZXRyeSIsInN1YmRpdmlkZSIsImFwcHBseVJhZGl1cyIsImdlbmVyYXRlVVZzIiwidXZCdWZmZXIiLCJnZXRWZXJ0ZXhCeUluZGV4Iiwic3ViZGl2aWRlRmFjZSIsImNvbHMiLCJyb3dzIiwiYWoiLCJiaiIsInB1c2hWZXJ0ZXgiLCJhemltdXRoIiwiaW5jbGluYXRpb24iLCJjb3JyZWN0VVZzIiwiY29ycmVjdFNlYW0iLCJjZW50cm9pZCIsImNvcnJlY3RVViIsImF6aSIsIlBvbHloZWRyb25CdWZmZXJHZW9tZXRyeSIsIlRldHJhaGVkcm9uR2VvbWV0cnkiLCJUZXRyYWhlZHJvbkJ1ZmZlckdlb21ldHJ5IiwiT2N0YWhlZHJvbkdlb21ldHJ5IiwiT2N0YWhlZHJvbkJ1ZmZlckdlb21ldHJ5IiwiSWNvc2FoZWRyb25HZW9tZXRyeSIsIkljb3NhaGVkcm9uQnVmZmVyR2VvbWV0cnkiLCJEb2RlY2FoZWRyb25HZW9tZXRyeSIsIkRvZGVjYWhlZHJvbkJ1ZmZlckdlb21ldHJ5IiwidHVidWxhclNlZ21lbnRzIiwicmFkaWFsU2VnbWVudHMiLCJjbG9zZWQiLCJ0YXBlciIsInRhbmdlbnRzIiwiYnVmZmVyR2VvbWV0cnkiLCJiaW5vcm1hbHMiLCJUdWJlR2VvbWV0cnkiLCJjb21wdXRlRnJlbmV0RnJhbWVzIiwiZnJhbWVzIiwiZ2VuZXJhdGVCdWZmZXJEYXRhIiwiZ2VuZXJhdGVTZWdtZW50IiwiZ2VuZXJhdGVJbmRpY2VzIiwiZ2V0UG9pbnRBdCIsIk4iLCJUdWJlQnVmZmVyR2VvbWV0cnkiLCJ0dWJlIiwiaGVpZ2h0U2NhbGUiLCJUb3J1c0tub3RHZW9tZXRyeSIsImNhbGN1bGF0ZVBvc2l0aW9uT25DdXJ2ZSIsIlAxIiwiUDIiLCJxdU92ZXJQIiwiY3MiLCJjdSIsInN1IiwiVG9ydXNLbm90QnVmZmVyR2VvbWV0cnkiLCJhcmMiLCJUb3J1c0dlb21ldHJ5IiwiVG9ydXNCdWZmZXJHZW9tZXRyeSIsInRyaWFuZ3VsYXRlIiwiaG9sZUluZGljZXMiLCJkaW0iLCJvdXRlckxlbiIsImhhc0hvbGVzIiwib3V0ZXJOb2RlIiwibGlua2VkTGlzdCIsImludlNpemUiLCJlbGltaW5hdGVIb2xlcyIsImVhcmN1dExpbmtlZCIsImNsb2Nrd2lzZSIsInNpZ25lZEFyZWEiLCJpbnNlcnROb2RlIiwicmVtb3ZlTm9kZSIsImFnYWluIiwic3RlaW5lciIsImFyZWEiLCJlYXIiLCJwYXNzIiwiaW5kZXhDdXJ2ZSIsImlzRWFySGFzaGVkIiwiaXNFYXIiLCJmaWx0ZXJQb2ludHMiLCJjdXJlTG9jYWxJbnRlcnNlY3Rpb25zIiwic3BsaXRFYXJjdXQiLCJwb2ludEluVHJpYW5nbGUiLCJtaW5UWSIsIm1heFRYIiwibWF4VFkiLCJ6T3JkZXIiLCJtaW5UWCIsIm5leHRaIiwicHJldloiLCJsb2NhbGx5SW5zaWRlIiwiaXNWYWxpZERpYWdvbmFsIiwic3BsaXRQb2x5Z29uIiwiZ2V0TGVmdG1vc3QiLCJjb21wYXJlWCIsImVsaW1pbmF0ZUhvbGUiLCJob2xlIiwiZmluZEhvbGVCcmlkZ2UiLCJoeCIsImh5IiwibXgiLCJteSIsInRhbk1pbiIsInNvcnRMaW5rZWQiLCJ0YWlsIiwibnVtTWVyZ2VzIiwicFNpemUiLCJxU2l6ZSIsImluU2l6ZSIsImxlZnRtb3N0IiwicHkiLCJpbnRlcnNlY3RzUG9seWdvbiIsIm1pZGRsZUluc2lkZSIsInEyIiwiaW5zaWRlIiwiYW4iLCJicCIsInN1bSIsImNvbnRvdXIiLCJpc0Nsb2NrV2lzZSIsInB0cyIsInRyaWFuZ3VsYXRlU2hhcGUiLCJob2xlcyIsInJlbW92ZUR1cEVuZFB0cyIsImFkZENvbnRvdXIiLCJob2xlSW5kZXgiLCJFYXJjdXQiLCJFeHRydWRlR2VvbWV0cnkiLCJhZGRTaGFwZSIsInZlcnRpY2VzQXJyYXkiLCJjdXJ2ZVNlZ21lbnRzIiwic3RlcHMiLCJhbW91bnQiLCJiZXZlbEVuYWJsZWQiLCJiZXZlbFRoaWNrbmVzcyIsImJldmVsU2l6ZSIsImJldmVsU2VnbWVudHMiLCJleHRydWRlUGF0aCIsIlVWR2VuZXJhdG9yIiwiV29ybGRVVkdlbmVyYXRvciIsImV4dHJ1ZGVCeVBhdGgiLCJiaW5vcm1hbCIsInBvc2l0aW9uMiIsImV4dHJ1ZGVQdHMiLCJnZXRTcGFjZWRQb2ludHMiLCJzcGxpbmVUdWJlIiwiaGwiLCJleHRyYWN0UG9pbnRzIiwic2hhcGVQb2ludHMiLCJTaGFwZVV0aWxzIiwiYWhvbGUiLCJwdCIsImJzIiwidmVydCIsInZsZW4iLCJmbGVuIiwiaW5QdCIsImluUHJldiIsImluTmV4dCIsInZfdHJhbnNfeSIsInNocmlua19ieSIsInZfcHJldl95Iiwidl9uZXh0X3kiLCJ2X3ByZXZfeCIsInZfbmV4dF94IiwiY29sbGluZWFyMCIsInZfcHJldl9sZW5zcSIsInZfcHJldl9sZW4iLCJ2X25leHRfbGVuIiwicHROZXh0U2hpZnRfeCIsInB0UHJldlNoaWZ0X3giLCJwdE5leHRTaGlmdF95IiwicHRQcmV2U2hpZnRfeSIsInZfdHJhbnNfeCIsInNmIiwidl90cmFuc19sZW5zcSIsImRpcmVjdGlvbl9lcSIsImNvbnRvdXJNb3ZlbWVudHMiLCJnZXRCZXZlbFZlYyIsIm9uZUhvbGVNb3ZlbWVudHMiLCJ2ZXJ0aWNlc01vdmVtZW50cyIsImhvbGVzTW92ZW1lbnRzIiwic2NhbGVQdDIiLCJidWlsZExpZEZhY2VzIiwiYnVpbGRTaWRlRmFjZXMiLCJmMyIsInNpZGV3YWxscyIsImxheWVyb2Zmc2V0Iiwic2wiLCJzbGVuMSIsInNsZW4yIiwiZjQiLCJwbGFjZWhvbGRlciIsImFkZFZlcnRleCIsInV2Z2VuIiwiZ2VuZXJhdGVUb3BVViIsIm5leHRJbmRleCIsImFkZFVWIiwiZ2VuZXJhdGVTaWRlV2FsbFVWIiwidmVjdG9yMiIsIkV4dHJ1ZGVCdWZmZXJHZW9tZXRyeSIsImluZGV4QSIsImluZGV4QiIsImluZGV4QyIsImFfeCIsImFfeSIsImJfeCIsImJfeSIsImNfeCIsImNfeSIsImluZGV4RCIsImFfeiIsImJfeiIsImNfeiIsImRfeCIsImRfeiIsImRfeSIsInRleHQiLCJUZXh0R2VvbWV0cnkiLCJmb250IiwiaXNGb250IiwiZ2VuZXJhdGVTaGFwZXMiLCJUZXh0QnVmZmVyR2VvbWV0cnkiLCJwaGlTdGFydCIsInBoaUxlbmd0aCIsInRoZXRhU3RhcnQiLCJ0aGV0YUxlbmd0aCIsIlNwaGVyZUdlb21ldHJ5IiwidmVydGljZXNSb3ciLCJncmlkIiwidGhldGFFbmQiLCJTcGhlcmVCdWZmZXJHZW9tZXRyeSIsImlubmVyUmFkaXVzIiwib3V0ZXJSYWRpdXMiLCJ0aGV0YVNlZ21lbnRzIiwicGhpU2VnbWVudHMiLCJSaW5nR2VvbWV0cnkiLCJzZWdtZW50IiwicmFkaXVzU3RlcCIsInRoZXRhU2VnbWVudExldmVsIiwiUmluZ0J1ZmZlckdlb21ldHJ5Iiwic2VnbWVudHMiLCJMYXRoZUdlb21ldHJ5IiwiaW52ZXJzZVNlZ21lbnRzIiwiYmFzZSIsIm4xIiwibjIiLCJMYXRoZUJ1ZmZlckdlb21ldHJ5IiwiU2hhcGVHZW9tZXRyeSIsInNoYXBlSG9sZSIsInNoYXBlVmVydGljZXMiLCJzaGFwZUhvbGVzIiwiaW5kZXhPZmZzZXQiLCJTaGFwZUJ1ZmZlckdlb21ldHJ5IiwidGhyZXNob2xkQW5nbGUiLCJmYWNlMSIsImZhY2UyIiwidGhyZXNob2xkRG90Iiwic291cmNlVmVydGljZXMiLCJFZGdlc0dlb21ldHJ5IiwicmFkaXVzVG9wIiwicmFkaXVzQm90dG9tIiwib3BlbkVuZGVkIiwiQ3lsaW5kZXJHZW9tZXRyeSIsImdlbmVyYXRlVG9yc28iLCJnZW5lcmF0ZUNhcCIsInNpblRoZXRhIiwiY29zVGhldGEiLCJzbG9wZSIsImluZGV4Um93IiwiaW5kZXhBcnJheSIsImNlbnRlckluZGV4U3RhcnQiLCJjZW50ZXJJbmRleEVuZCIsIkN5bGluZGVyQnVmZmVyR2VvbWV0cnkiLCJDb25lR2VvbWV0cnkiLCJDb25lQnVmZmVyR2VvbWV0cnkiLCJDaXJjbGVHZW9tZXRyeSIsIkNpcmNsZUJ1ZmZlckdlb21ldHJ5IiwiZnJlZXplIiwiUmF3U2hhZGVyTWF0ZXJpYWwiLCJmaWxlcyIsImZpbGUiLCJvbkxvYWQiLCJvblByb2dyZXNzIiwib25FcnJvciIsIm9uU3RhcnQiLCJpdGVtU3RhcnQiLCJpdGVtc1RvdGFsIiwiaXNMb2FkaW5nIiwiaXRlbXNMb2FkZWQiLCJpdGVtRW5kIiwiaXRlbUVycm9yIiwicmVzb2x2ZVVSTCIsInVybE1vZGlmaWVyIiwic2V0VVJMTW9kaWZpZXIiLCJ0cmFuc2Zvcm0iLCJtYW5hZ2VyIiwiRGVmYXVsdExvYWRpbmdNYW5hZ2VyIiwiRmlsZUxvYWRlciIsImxvYWQiLCJDYWNoZSIsImNhY2hlZCIsImxvYWRpbmciLCJkYXRhVXJpUmVnZXgiLCJkYXRhVXJpUmVnZXhSZXN1bHQiLCJkZWNvZGVVUklDb21wb25lbnQiLCJpc0Jhc2U2NCIsImF0b2IiLCJyZXNwb25zZVR5cGUiLCJ0b0xvd2VyQ2FzZSIsInJlc3BvbnNlIiwibWltZVR5cGUiLCJwYXJzZXIiLCJwYXJzZUZyb21TdHJpbmciLCJyZXF1ZXN0Iiwic3RhdHVzIiwiY2FsbGJhY2tzIiwid2l0aENyZWRlbnRpYWxzIiwib3ZlcnJpZGVNaW1lVHlwZSIsInJlcXVlc3RIZWFkZXIiLCJzZXRSZXF1ZXN0SGVhZGVyIiwiaGVhZGVyIiwic2VuZCIsInNldFBhdGgiLCJzZXRSZXNwb25zZVR5cGUiLCJzZXRXaXRoQ3JlZGVudGlhbHMiLCJzZXRNaW1lVHlwZSIsIl9wYXJzZXIiLCJDb21wcmVzc2VkVGV4dHVyZUxvYWRlciIsImxvYWRlciIsInRleERhdGFzIiwibG9hZGVkIiwibWlwbWFwQ291bnQiLCJsb2FkVGV4dHVyZSIsImlzQ3ViZW1hcCIsIkRhdGFUZXh0dXJlTG9hZGVyIiwidGV4RGF0YSIsIkltYWdlTG9hZGVyIiwiY3Jvc3NPcmlnaW4iLCJzdWJzdHIiLCJzZXRDcm9zc09yaWdpbiIsIkN1YmVUZXh0dXJlTG9hZGVyIiwidXJscyIsIlRleHR1cmVMb2FkZXIiLCJzZWFyY2giLCJpc0pQRUciLCJhcmNMZW5ndGhEaXZpc2lvbnMiLCJDdXJ2ZSIsImdldFBvaW50Iiwib3B0aW9uYWxUYXJnZXQiLCJnZXRVdG9UbWFwcGluZyIsImdldFBvaW50cyIsImRpdmlzaW9ucyIsImdldExlbmd0aCIsImdldExlbmd0aHMiLCJsZW5ndGhzIiwiY2FjaGVBcmNMZW5ndGhzIiwiY3VycmVudCIsInVwZGF0ZUFyY0xlbmd0aHMiLCJhcmNMZW5ndGhzIiwidGFyZ2V0QXJjTGVuZ3RoIiwiY29tcGFyaXNvbiIsImxlbmd0aEFmdGVyIiwibGVuZ3RoQmVmb3JlIiwic2VnbWVudExlbmd0aCIsInNlZ21lbnRGcmFjdGlvbiIsImdldFRhbmdlbnQiLCJ0MiIsInB0MiIsInB0MSIsImdldFRhbmdlbnRBdCIsIk1BWF9WQUxVRSIsInR6IiwibWF0IiwiZnJvbUpTT04iLCJqc29uIiwiYVgiLCJhWSIsInhSYWRpdXMiLCJ5UmFkaXVzIiwiYVN0YXJ0QW5nbGUiLCJhRW5kQW5nbGUiLCJhQ2xvY2t3aXNlIiwiYVJvdGF0aW9uIiwiRWxsaXBzZUN1cnZlIiwiaXNFbGxpcHNlQ3VydmUiLCJkZWx0YUFuZ2xlIiwidHdvUGkiLCJzYW1lUG9pbnRzIiwiYVJhZGl1cyIsIkFyY0N1cnZlIiwiaXNBcmNDdXJ2ZSIsImMwIiwiaW5pdENhdG11bGxSb20iLCJ4MyIsInRlbnNpb24iLCJpbml0Tm9udW5pZm9ybUNhdG11bGxSb20iLCJkdDAiLCJkdDEiLCJkdDIiLCJjYWxjIiwidDMiLCJjdXJ2ZVR5cGUiLCJDYXRtdWxsUm9tQ3VydmUzIiwiaXNDYXRtdWxsUm9tQ3VydmUzIiwiaW50UG9pbnQiLCJ3ZWlnaHQiLCJweCQxIiwicHoiLCJRdWFkcmF0aWNCZXppZXJQMSIsIlF1YWRyYXRpY0JlemllclAyIiwiQ3ViaWNCZXppZXJQMSIsIkN1YmljQmV6aWVyUDIiLCJDdWJpY0JlemllclAzIiwidjMiLCJDdWJpY0JlemllckN1cnZlIiwiaXNDdWJpY0JlemllckN1cnZlIiwiQ3ViaWNCZXppZXIiLCJDdWJpY0JlemllckN1cnZlMyIsImlzQ3ViaWNCZXppZXJDdXJ2ZTMiLCJMaW5lQ3VydmUiLCJpc0xpbmVDdXJ2ZSIsIkxpbmVDdXJ2ZTMiLCJpc0xpbmVDdXJ2ZTMiLCJRdWFkcmF0aWNCZXppZXJDdXJ2ZSIsImlzUXVhZHJhdGljQmV6aWVyQ3VydmUiLCJRdWFkcmF0aWNCZXppZXIiLCJRdWFkcmF0aWNCZXppZXJDdXJ2ZTMiLCJpc1F1YWRyYXRpY0JlemllckN1cnZlMyIsIlNwbGluZUN1cnZlIiwiaXNTcGxpbmVDdXJ2ZSIsIkNhdG11bGxSb20iLCJjdXJ2ZXMiLCJhdXRvQ2xvc2UiLCJDdXJ2ZVBhdGgiLCJjdXJ2ZSIsImNsb3NlUGF0aCIsInN0YXJ0UG9pbnQiLCJlbmRQb2ludCIsImdldEN1cnZlTGVuZ3RocyIsImN1cnZlTGVuZ3RocyIsImxlbnMiLCJjYWNoZUxlbmd0aHMiLCJzdW1zIiwicmVzb2x1dGlvbiIsImN1cnJlbnRQb2ludCIsIlBhdGgiLCJtb3ZlVG8iLCJsaW5lVG8iLCJxdWFkcmF0aWNDdXJ2ZVRvIiwiYUNQeCIsImFDUHkiLCJiZXppZXJDdXJ2ZVRvIiwiYUNQMXgiLCJhQ1AxeSIsImFDUDJ4IiwiYUNQMnkiLCJzcGxpbmVUaHJ1IiwibnB0cyIsImFic2FyYyIsImFic2VsbGlwc2UiLCJlbGxpcHNlIiwiZmlyc3RQb2ludCIsImxhc3RQb2ludCIsIlNoYXBlIiwiZ2V0UG9pbnRzSG9sZXMiLCJob2xlc1B0cyIsIkxpZ2h0IiwiSGVtaXNwaGVyZUxpZ2h0IiwiTGlnaHRTaGFkb3ciLCJTcG90TGlnaHRTaGFkb3ciLCJwb3dlciIsIlNwb3RMaWdodCIsIlBvaW50TGlnaHQiLCJEaXJlY3Rpb25hbExpZ2h0U2hhZG93IiwiRGlyZWN0aW9uYWxMaWdodCIsIkFtYmllbnRMaWdodCIsIlJlY3RBcmVhTGlnaHQiLCJ0aW1lcyIsImludGVycG9sYXRpb24iLCJLZXlmcmFtZVRyYWNrIiwiU3RyaW5nS2V5ZnJhbWVUcmFjayIsIlZhbHVlVHlwZU5hbWUiLCJWYWx1ZUJ1ZmZlclR5cGUiLCJEZWZhdWx0SW50ZXJwb2xhdGlvbiIsIkludGVycG9sYXRlRGlzY3JldGUiLCJJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5lYXIiLCJJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGgiLCJCb29sZWFuS2V5ZnJhbWVUcmFjayIsInBhcmFtZXRlclBvc2l0aW9ucyIsInNhbXBsZVZhbHVlcyIsInNhbXBsZVNpemUiLCJyZXN1bHRCdWZmZXIiLCJfY2FjaGVkSW5kZXgiLCJ2YWx1ZVNpemUiLCJJbnRlcnBvbGFudCIsImV2YWx1YXRlIiwicHAiLCJ2YWxpZGF0ZV9pbnRlcnZhbCIsInNlZWsiLCJsaW5lYXJfc2NhbiIsImZvcndhcmRfc2NhbiIsImFmdGVyRW5kXyIsImdpdmVVcEF0IiwidDFnbG9iYWwiLCJiZWZvcmVTdGFydF8iLCJtaWQiLCJpbnRlcnZhbENoYW5nZWRfIiwiaW50ZXJwb2xhdGVfIiwic2V0dGluZ3MiLCJEZWZhdWx0U2V0dGluZ3NfIiwiZ2V0U2V0dGluZ3NfIiwiY29weVNhbXBsZVZhbHVlXyIsIlF1YXRlcm5pb25MaW5lYXJJbnRlcnBvbGFudCIsIlF1YXRlcm5pb25LZXlmcmFtZVRyYWNrIiwiSW50ZXJwb2xhdGVMaW5lYXIiLCJnZXRWYWx1ZVNpemUiLCJDb2xvcktleWZyYW1lVHJhY2siLCJOdW1iZXJLZXlmcmFtZVRyYWNrIiwiX3dlaWdodFByZXYiLCJfb2Zmc2V0UHJldiIsIl93ZWlnaHROZXh0IiwiX29mZnNldE5leHQiLCJDdWJpY0ludGVycG9sYW50IiwiZW5kaW5nU3RhcnQiLCJaZXJvQ3VydmF0dXJlRW5kaW5nIiwiZW5kaW5nRW5kIiwiaVByZXYiLCJpTmV4dCIsInRQcmV2IiwidE5leHQiLCJoYWxmRHQiLCJvMSIsIm8wIiwib1AiLCJvTiIsIndQIiwid04iLCJwcHAiLCJzUCIsInNOIiwiTGluZWFySW50ZXJwb2xhbnQiLCJvZmZzZXQxIiwib2Zmc2V0MCIsIndlaWdodDEiLCJ3ZWlnaHQwIiwiRGlzY3JldGVJbnRlcnBvbGFudCIsImFycmF5U2xpY2UiLCJmcm9tIiwidG8iLCJBbmltYXRpb25VdGlscyIsImlzVHlwZWRBcnJheSIsImNvbnZlcnRBcnJheSIsImZvcmNlQ2xvbmUiLCJpc1ZpZXciLCJnZXRLZXlmcmFtZU9yZGVyIiwiY29tcGFyZVRpbWUiLCJzb3J0ZWRBcnJheSIsIm5WYWx1ZXMiLCJzcmNPZmZzZXQiLCJmbGF0dGVuSlNPTiIsImpzb25LZXlzIiwidmFsdWVQcm9wZXJ0eU5hbWUiLCJUaW1lQnVmZmVyVHlwZSIsInNldEludGVycG9sYXRpb24iLCJ2YWxpZGF0ZSIsIm9wdGltaXplIiwiX2dldFRyYWNrVHlwZUZvclZhbHVlVHlwZU5hbWUiLCJ0cmFja1R5cGUiLCJ0cmFjayIsImdldEludGVycG9sYXRpb24iLCJ0eXBlTmFtZSIsIkZsb2F0MzJBcnJheSIsIkludGVycG9sYW50RmFjdG9yeU1ldGhvZERpc2NyZXRlIiwiZmFjdG9yeU1ldGhvZCIsImNyZWF0ZUludGVycG9sYW50Iiwic2hpZnQiLCJ0aW1lT2Zmc2V0IiwidGltZVNjYWxlIiwic3RhcnRUaW1lIiwiZW5kVGltZSIsIm5LZXlzIiwidmFsaWQiLCJjdXJyVGltZSIsInByZXZUaW1lIiwic21vb3RoSW50ZXJwb2xhdGlvbiIsIkludGVycG9sYXRlU21vb3RoIiwid3JpdGVJbmRleCIsInRpbWVOZXh0Iiwib2Zmc2V0UCIsIm9mZnNldE4iLCJrZWVwIiwid3JpdGVPZmZzZXQiLCJyZWFkT2Zmc2V0IiwiVmVjdG9yS2V5ZnJhbWVUcmFjayIsImR1cmF0aW9uIiwidHJhY2tzIiwicmVzZXREdXJhdGlvbiIsIkFuaW1hdGlvbkNsaXAiLCJqc29uVHJhY2tzIiwiZnJhbWVUaW1lIiwiZnBzIiwiY2xpcCIsImNsaXBUcmFja3MiLCJDcmVhdGVGcm9tTW9ycGhUYXJnZXRTZXF1ZW5jZSIsIm1vcnBoVGFyZ2V0U2VxdWVuY2UiLCJub0xvb3AiLCJudW1Nb3JwaFRhcmdldHMiLCJmaW5kQnlOYW1lIiwib2JqZWN0T3JDbGlwQXJyYXkiLCJjbGlwQXJyYXkiLCJhbmltYXRpb25zIiwiQ3JlYXRlQ2xpcHNGcm9tTW9ycGhUYXJnZXRTZXF1ZW5jZXMiLCJwYXJ0cyIsImFuaW1hdGlvblRvTW9ycGhUYXJnZXRzIiwiYW5pbWF0aW9uTW9ycGhUYXJnZXRzIiwiY2xpcHMiLCJwYXJzZUFuaW1hdGlvbiIsImFuaW1hdGlvbiIsInRyYWNrTmFtZSIsImFuaW1hdGlvbktleXMiLCJwcm9wZXJ0eU5hbWUiLCJkZXN0VHJhY2tzIiwiaGllcmFyY2h5IiwiaGllcmFyY2h5VHJhY2tzIiwibW9ycGhUYXJnZXROYW1lcyIsImFuaW1hdGlvbktleSIsIm1vcnBoVGFyZ2V0TmFtZSIsImFkZE5vbmVtcHR5VHJhY2siLCJib25lTmFtZSIsImNsaXBOYW1lIiwiTWF0ZXJpYWxMb2FkZXIiLCJzZXRUZXh0dXJlcyIsInNoYWRpbmciLCJnZXRUZXh0dXJlIiwiQnVmZmVyR2VvbWV0cnlMb2FkZXIiLCJ0eXBlZEFycmF5IiwiZHJhd2NhbGxzIiwib2Zmc2V0cyIsIkludDhBcnJheSIsIlVpbnQ4QXJyYXkiLCJVaW50OENsYW1wZWRBcnJheSIsIkludDE2QXJyYXkiLCJVaW50MTZBcnJheSIsIkludDMyQXJyYXkiLCJVaW50MzJBcnJheSIsIkZsb2F0NjRBcnJheSIsIkxvYWRlciIsIkhhbmRsZXJzIiwiaGFuZGxlcnMiLCJyZWdleCIsIm9uTG9hZFN0YXJ0Iiwib25Mb2FkUHJvZ3Jlc3MiLCJvbkxvYWRDb21wbGV0ZSIsImluaXRNYXRlcmlhbHMiLCJ0ZXh0dXJlUGF0aCIsImNyZWF0ZU1hdGVyaWFsIiwiQWRkaXRpdmVCbGVuZGluZyIsIlN1YnRyYWN0aXZlQmxlbmRpbmciLCJNdWx0aXBseUJsZW5kaW5nIiwiZnVsbFBhdGgiLCJ0ZXh0dXJlTG9hZGVyIiwiQmxlbmRpbmdNb2RlIiwibWFwRGlmZnVzZVJlcGVhdCIsIm1hcERpZmZ1c2VPZmZzZXQiLCJtYXBEaWZmdXNlV3JhcCIsIm1hcERpZmZ1c2VBbmlzb3Ryb3B5IiwibWFwRW1pc3NpdmVSZXBlYXQiLCJtYXBFbWlzc2l2ZU9mZnNldCIsIm1hcEVtaXNzaXZlV3JhcCIsIm1hcEVtaXNzaXZlQW5pc290cm9weSIsIm1hcExpZ2h0UmVwZWF0IiwibWFwTGlnaHRPZmZzZXQiLCJtYXBMaWdodFdyYXAiLCJtYXBMaWdodEFuaXNvdHJvcHkiLCJtYXBBT1JlcGVhdCIsIm1hcEFPT2Zmc2V0IiwibWFwQU9XcmFwIiwibWFwQU9Bbmlzb3Ryb3B5IiwibWFwQnVtcFJlcGVhdCIsIm1hcEJ1bXBPZmZzZXQiLCJtYXBCdW1wV3JhcCIsIm1hcEJ1bXBBbmlzb3Ryb3B5IiwibWFwTm9ybWFsUmVwZWF0IiwibWFwTm9ybWFsT2Zmc2V0IiwibWFwTm9ybWFsV3JhcCIsIm1hcE5vcm1hbEFuaXNvdHJvcHkiLCJtYXBTcGVjdWxhclJlcGVhdCIsIm1hcFNwZWN1bGFyT2Zmc2V0IiwibWFwU3BlY3VsYXJXcmFwIiwibWFwU3BlY3VsYXJBbmlzb3Ryb3B5IiwibWFwTWV0YWxuZXNzUmVwZWF0IiwibWFwTWV0YWxuZXNzT2Zmc2V0IiwibWFwTWV0YWxuZXNzV3JhcCIsIm1hcE1ldGFsbmVzc0FuaXNvdHJvcHkiLCJtYXBSb3VnaG5lc3NSZXBlYXQiLCJtYXBSb3VnaG5lc3NPZmZzZXQiLCJtYXBSb3VnaG5lc3NXcmFwIiwibWFwUm91Z2huZXNzQW5pc290cm9weSIsIm1hcEFscGhhUmVwZWF0IiwibWFwQWxwaGFPZmZzZXQiLCJtYXBBbHBoYVdyYXAiLCJtYXBBbHBoYUFuaXNvdHJvcHkiLCJWZXJ0ZXhDb2xvcnMiLCJGYWNlQ29sb3JzIiwibWF0ZXJpYWxMb2FkZXIiLCJkZWNvZGVUZXh0IiwiZGVjb2RlIiwiZnJvbUNoYXJDb2RlIiwiZXNjYXBlIiwiZXh0cmFjdFVybEJhc2UiLCJsYXN0SW5kZXhPZiIsIkpTT05Mb2FkZXIiLCJMb2FkZXJVdGlscyIsInNldFRleHR1cmVQYXRoIiwiZmkiLCJ6TGVuZ3RoIiwiY29sb3JJbmRleCIsIm5vcm1hbEluZGV4IiwidXZJbmRleCIsImlzUXVhZCIsImZhY2VBIiwiZmFjZUIiLCJ1dkxheWVyIiwiblV2TGF5ZXJzIiwiaXNCaXRTZXQiLCJpbmZsdWVuY2VzUGVyVmVydGV4Iiwic3JjVmVydGljZXMiLCJkc3RWZXJ0aWNlcyIsIm1vcnBoQ29sb3JzIiwib3V0cHV0QW5pbWF0aW9ucyIsIm1vcnBoQW5pbWF0aW9uQ2xpcHMiLCJwYXJzZU1vZGVsIiwicGFyc2VTa2luIiwicGFyc2VNb3JwaGluZyIsInBhcnNlQW5pbWF0aW9ucyIsIk9iamVjdExvYWRlciIsInN1YnN0cmluZyIsInBhcnNlU2hhcGUiLCJwYXJzZUdlb21ldHJpZXMiLCJwYXJzZUltYWdlcyIsInBhcnNlVGV4dHVyZXMiLCJwYXJzZU1hdGVyaWFscyIsInBhcnNlT2JqZWN0IiwiZGV0YWlscyIsImdlb21ldHJ5U2hhcGVzIiwiYnVmZmVyR2VvbWV0cnlMb2FkZXIiLCJnZW9tZXRyeUxvYWRlciIsImxvYWRJbWFnZSIsInBhcnNlQ29uc3RhbnQiLCJURVhUVVJFX01BUFBJTkciLCJURVhUVVJFX1dSQVBQSU5HIiwiVEVYVFVSRV9GSUxURVIiLCJnZXRHZW9tZXRyeSIsImdldE1hdGVyaWFsIiwiQ3ViZVJlZnJhY3Rpb25NYXBwaW5nIiwiRXF1aXJlY3Rhbmd1bGFyUmVmbGVjdGlvbk1hcHBpbmciLCJFcXVpcmVjdGFuZ3VsYXJSZWZyYWN0aW9uTWFwcGluZyIsIlNwaGVyaWNhbFJlZmxlY3Rpb25NYXBwaW5nIiwic3ViUGF0aHMiLCJjdXJyZW50UGF0aCIsIlNoYXBlUGF0aCIsInRvU2hhcGVzIiwiaXNDQ1ciLCJub0hvbGVzIiwiaW5TdWJwYXRocyIsInRtcFNoYXBlIiwidG1wUGF0aCIsImluUG9seWdvbiIsInBvbHlMZW4iLCJlZGdlSGlnaFB0IiwiZWRnZUxvd1B0IiwiZWRnZUR5IiwiZWRnZUR4IiwicGVycEVkZ2UiLCJob2xlc0ZpcnN0IiwibmV3U2hhcGVzIiwibWFpbklkeCIsIm5ld1NoYXBlSG9sZXMiLCJ0bXBQb2ludHMiLCJzb2xpZCIsInNMZW4iLCJzSWR4IiwiYmV0dGVyU2hhcGVIb2xlcyIsImhJZHgiLCJzaG8iLCJzMklkeCIsImlzUG9pbnRJbnNpZGVQb2x5Z29uIiwiaG8iLCJ0b0NoYW5nZSIsImZyb21zIiwidG9zIiwiaG9sZV91bmFzc2lnbmVkIiwiYW1iaWd1b3VzIiwidG1wSG9sZXMiLCJGb250IiwiY3JlYXRlUGF0aHMiLCJwYXRocyIsInlNYXgiLCJ5TWluIiwidW5kZXJsaW5lVGhpY2tuZXNzIiwiY2hhcnMiLCJjaGFyIiwibGluZV9oZWlnaHQiLCJjcmVhdGVQYXRoIiwiZ2x5cGhzIiwiZ2x5cGgiLCJjcHgiLCJjcHkiLCJjcHgxIiwiY3B5MSIsImNweDIiLCJjcHkyIiwiX2NhY2hlZE91dGxpbmUiLCJvdXRsaW5lIiwiYWN0aW9uIiwiaGEiLCJGb250TG9hZGVyIiwiQXVkaW9Db250ZXh0Iiwid2Via2l0QXVkaW9Db250ZXh0Iiwic2V0Q29udGV4dCIsIkF1ZGlvTG9hZGVyIiwiZGVjb2RlQXVkaW9EYXRhIiwiYXVkaW9CdWZmZXIiLCJleWVTZXAiLCJTdGVyZW9DYW1lcmEiLCJ4bWF4IiwiZXllTGVmdCIsImV5ZVJpZ2h0IiwieG1pbiIsInltYXgiLCJleWVTZXBPblByb2plY3Rpb24iLCJjdWJlUmVzb2x1dGlvbiIsImNhbWVyYVBYIiwiY2FtZXJhTlgiLCJjYW1lcmFQWSIsImNhbWVyYU5ZIiwiY2FtZXJhUFoiLCJjYW1lcmFOWiIsIkN1YmVDYW1lcmEiLCJnYWluIiwiY3JlYXRlR2FpbiIsImNvbm5lY3QiLCJkZXN0aW5hdGlvbiIsIkF1ZGlvTGlzdGVuZXIiLCJnZXRJbnB1dCIsInJlbW92ZUZpbHRlciIsImRpc2Nvbm5lY3QiLCJnZXRGaWx0ZXIiLCJzZXRGaWx0ZXIiLCJnZXRNYXN0ZXJWb2x1bWUiLCJzZXRNYXN0ZXJWb2x1bWUiLCJzZXRUYXJnZXRBdFRpbWUiLCJjdXJyZW50VGltZSIsInBvc2l0aW9uWCIsInNldFZhbHVlQXRUaW1lIiwicG9zaXRpb25ZIiwicG9zaXRpb25aIiwiZm9yd2FyZFgiLCJmb3J3YXJkWSIsImZvcndhcmRaIiwidXBYIiwidXBZIiwidXBaIiwic2V0T3JpZW50YXRpb24iLCJhdXRvcGxheSIsImxvb3AiLCJwbGF5YmFja1JhdGUiLCJpc1BsYXlpbmciLCJoYXNQbGF5YmFja0NvbnRyb2wiLCJzb3VyY2VUeXBlIiwiZmlsdGVycyIsIkF1ZGlvIiwiZ2V0T3V0cHV0Iiwic2V0Tm9kZVNvdXJjZSIsImF1ZGlvTm9kZSIsInNldEJ1ZmZlciIsInBsYXkiLCJjcmVhdGVCdWZmZXJTb3VyY2UiLCJvbmVuZGVkIiwib25FbmRlZCIsInBhdXNlIiwiZ2V0RmlsdGVycyIsInNldEZpbHRlcnMiLCJzZXRQbGF5YmFja1JhdGUiLCJnZXRQbGF5YmFja1JhdGUiLCJnZXRMb29wIiwic2V0TG9vcCIsImdldFZvbHVtZSIsInNldFZvbHVtZSIsInBhbm5lciIsImNyZWF0ZVBhbm5lciIsIlBvc2l0aW9uYWxBdWRpbyIsImdldFJlZkRpc3RhbmNlIiwicmVmRGlzdGFuY2UiLCJzZXRSZWZEaXN0YW5jZSIsImdldFJvbGxvZmZGYWN0b3IiLCJyb2xsb2ZmRmFjdG9yIiwic2V0Um9sbG9mZkZhY3RvciIsImdldERpc3RhbmNlTW9kZWwiLCJkaXN0YW5jZU1vZGVsIiwic2V0RGlzdGFuY2VNb2RlbCIsImdldE1heERpc3RhbmNlIiwibWF4RGlzdGFuY2UiLCJzZXRNYXhEaXN0YW5jZSIsImF1ZGlvIiwiZmZ0U2l6ZSIsImFuYWx5c2VyIiwiY3JlYXRlQW5hbHlzZXIiLCJmcmVxdWVuY3lCaW5Db3VudCIsIkF1ZGlvQW5hbHlzZXIiLCJnZXRGcmVxdWVuY3lEYXRhIiwiZ2V0Qnl0ZUZyZXF1ZW5jeURhdGEiLCJnZXRBdmVyYWdlRnJlcXVlbmN5IiwiYmluZGluZyIsIm1peEZ1bmN0aW9uIiwiX3NsZXJwIiwiX3NlbGVjdCIsIl9sZXJwIiwiX21peEJ1ZmZlclJlZ2lvbiIsImN1bXVsYXRpdmVXZWlnaHQiLCJ1c2VDb3VudCIsInJlZmVyZW5jZUNvdW50IiwiUHJvcGVydHlNaXhlciIsImFjY3VtdWxhdGUiLCJhY2N1SW5kZXgiLCJjdXJyZW50V2VpZ2h0IiwibWl4Iiwib3JpZ2luYWxWYWx1ZU9mZnNldCIsInNhdmVPcmlnaW5hbFN0YXRlIiwiZ2V0VmFsdWUiLCJyZXN0b3JlT3JpZ2luYWxTdGF0ZSIsInRhcmdldEdyb3VwIiwib3B0aW9uYWxQYXJzZWRQYXRoIiwiUHJvcGVydHlCaW5kaW5nIiwicGFyc2VUcmFja05hbWUiLCJfdGFyZ2V0R3JvdXAiLCJfYmluZGluZ3MiLCJzdWJzY3JpYmVfIiwicGFyc2VkUGF0aCIsIkNvbXBvc2l0ZSIsIm5DYWNoZWRPYmplY3RzXyIsImZpcnN0VmFsaWRJbmRleCIsImJpbmRpbmdzIiwidW5iaW5kIiwicm9vdE5vZGUiLCJmaW5kTm9kZSIsIm5vZGVOYW1lIiwicm9vdCIsImlzQW5pbWF0aW9uT2JqZWN0R3JvdXAiLCJzYW5pdGl6ZU5vZGVOYW1lIiwiUkVTRVJWRURfQ0hBUlNfUkUiLCJyZXNlcnZlZFJlIiwid29yZENoYXIiLCJ3b3JkQ2hhck9yRG90IiwiZGlyZWN0b3J5UmUiLCJub2RlUmUiLCJvYmplY3RSZSIsInByb3BlcnR5UmUiLCJ0cmFja1JlIiwibWF0Y2hlcyIsIm9iamVjdE5hbWUiLCJvYmplY3RJbmRleCIsInByb3BlcnR5SW5kZXgiLCJyZXN1bHRzIiwibGFzdERvdCIsInN1cHBvcnRlZE9iamVjdE5hbWVzIiwiY2hpbGROb2RlIiwic2VhcmNoTm9kZVN1YnRyZWUiLCJzdWJUcmVlTm9kZSIsIl9nZXRWYWx1ZV91bmF2YWlsYWJsZSIsIl9zZXRWYWx1ZV91bmF2YWlsYWJsZSIsIkJpbmRpbmdUeXBlIiwiRGlyZWN0IiwiRW50aXJlQXJyYXkiLCJBcnJheUVsZW1lbnQiLCJIYXNGcm9tVG9BcnJheSIsIlZlcnNpb25pbmciLCJOb25lIiwiTmVlZHNVcGRhdGUiLCJNYXRyaXhXb3JsZE5lZWRzVXBkYXRlIiwiR2V0dGVyQnlCaW5kaW5nVHlwZSIsInJlc29sdmVkUHJvcGVydHkiLCJTZXR0ZXJCeUJpbmRpbmdUeXBlQW5kVmVyc2lvbmluZyIsInRhcmdldE9iamVjdCIsImRlc3QiLCJ0YXJnZXRBcnJheSIsInNvdXJjZUFycmF5Iiwibm9kZVByb3BlcnR5IiwidmVyc2lvbmluZyIsImJpbmRpbmdUeXBlIiwiX2dldFZhbHVlX3VuYm91bmQiLCJfc2V0VmFsdWVfdW5ib3VuZCIsIl9pbmRpY2VzQnlVVUlEIiwiX3BhdGhzIiwiX3BhcnNlZFBhdGhzIiwiX2JpbmRpbmdzSW5kaWNlc0J5UGF0aCIsInN0YXRzIiwidG90YWwiLCJBbmltYXRpb25PYmplY3RHcm91cCIsIm5PYmplY3RzIiwibkNhY2hlZE9iamVjdHMiLCJpbmRpY2VzQnlVVUlEIiwicGFyc2VkUGF0aHMiLCJuQmluZGluZ3MiLCJrbm93bk9iamVjdCIsImxhc3RDYWNoZWRPYmplY3QiLCJmaXJzdEFjdGl2ZUluZGV4IiwibGFzdENhY2hlZCIsImJpbmRpbmdzRm9yUGF0aCIsImZpcnN0QWN0aXZlT2JqZWN0IiwibGFzdENhY2hlZEluZGV4IiwiZmlyc3RBY3RpdmUiLCJ1bmNhY2hlIiwibGFzdE9iamVjdCIsImluZGljZXNCeVBhdGgiLCJ1bnN1YnNjcmliZV8iLCJsYXN0QmluZGluZ3NJbmRleCIsImxhc3RCaW5kaW5ncyIsImxhc3RCaW5kaW5nc1BhdGgiLCJtaXhlciIsImxvY2FsUm9vdCIsIl9taXhlciIsIl9jbGlwIiwiX2xvY2FsUm9vdCIsIm5UcmFja3MiLCJpbnRlcnBvbGFudHMiLCJpbnRlcnBvbGFudCIsImludGVycG9sYW50U2V0dGluZ3MiLCJfaW50ZXJwb2xhbnRTZXR0aW5ncyIsIl9pbnRlcnBvbGFudHMiLCJfcHJvcGVydHlCaW5kaW5ncyIsIl9jYWNoZUluZGV4IiwiX2J5Q2xpcENhY2hlSW5kZXgiLCJfdGltZVNjYWxlSW50ZXJwb2xhbnQiLCJfd2VpZ2h0SW50ZXJwb2xhbnQiLCJMb29wUmVwZWF0IiwiX2xvb3BDb3VudCIsIl9zdGFydFRpbWUiLCJfZWZmZWN0aXZlVGltZVNjYWxlIiwiX2VmZmVjdGl2ZVdlaWdodCIsInJlcGV0aXRpb25zIiwicGF1c2VkIiwiY2xhbXBXaGVuRmluaXNoZWQiLCJ6ZXJvU2xvcGVBdFN0YXJ0IiwiemVyb1Nsb3BlQXRFbmQiLCJBbmltYXRpb25BY3Rpb24iLCJfYWN0aXZhdGVBY3Rpb24iLCJfZGVhY3RpdmF0ZUFjdGlvbiIsInN0b3BGYWRpbmciLCJzdG9wV2FycGluZyIsImlzUnVubmluZyIsIl9pc0FjdGl2ZUFjdGlvbiIsImlzU2NoZWR1bGVkIiwic3RhcnRBdCIsInNldEVmZmVjdGl2ZVdlaWdodCIsImdldEVmZmVjdGl2ZVdlaWdodCIsImZhZGVJbiIsIl9zY2hlZHVsZUZhZGluZyIsImZhZGVPdXQiLCJjcm9zc0ZhZGVGcm9tIiwiZmFkZU91dEFjdGlvbiIsIndhcnAiLCJmYWRlT3V0RHVyYXRpb24iLCJzdGFydEVuZFJhdGlvIiwiZmFkZUluRHVyYXRpb24iLCJlbmRTdGFydFJhdGlvIiwiY3Jvc3NGYWRlVG8iLCJmYWRlSW5BY3Rpb24iLCJ3ZWlnaHRJbnRlcnBvbGFudCIsIl90YWtlQmFja0NvbnRyb2xJbnRlcnBvbGFudCIsInNldEVmZmVjdGl2ZVRpbWVTY2FsZSIsImdldEVmZmVjdGl2ZVRpbWVTY2FsZSIsInNldER1cmF0aW9uIiwic3luY1dpdGgiLCJoYWx0Iiwic3RhcnRUaW1lU2NhbGUiLCJlbmRUaW1lU2NhbGUiLCJfbGVuZENvbnRyb2xJbnRlcnBvbGFudCIsInRpbWVTY2FsZUludGVycG9sYW50IiwiZ2V0TWl4ZXIiLCJnZXRDbGlwIiwiZ2V0Um9vdCIsIl9yb290IiwiX3VwZGF0ZSIsImRlbHRhVGltZSIsInRpbWVEaXJlY3Rpb24iLCJfdXBkYXRlV2VpZ2h0IiwidGltZVJ1bm5pbmciLCJfdXBkYXRlVGltZVNjYWxlIiwiX3VwZGF0ZVRpbWUiLCJjbGlwVGltZSIsInByb3BlcnR5TWl4ZXJzIiwiaW50ZXJwb2xhbnRWYWx1ZSIsImxvb3BDb3VudCIsIkxvb3BPbmNlIiwiX3NldEVuZGluZ3MiLCJoYW5kbGVfc3RvcCIsIkxvb3BQaW5nUG9uZyIsInBpbmdQb25nIiwibG9vcERlbHRhIiwicGVuZGluZyIsImF0U3RhcnQiLCJhdEVuZCIsIlplcm9TbG9wZUVuZGluZyIsIldyYXBBcm91bmRFbmRpbmciLCJ3ZWlnaHROb3ciLCJ3ZWlnaHRUaGVuIiwiX2luaXRNZW1vcnlNYW5hZ2VyIiwiX2FjY3VJbmRleCIsIkFuaW1hdGlvbk1peGVyIiwiX2JpbmRBY3Rpb24iLCJwcm90b3R5cGVBY3Rpb24iLCJyb290VXVpZCIsImJpbmRpbmdzQnlSb290IiwiX2JpbmRpbmdzQnlSb290QW5kTmFtZSIsImJpbmRpbmdzQnlOYW1lIiwiX2FkZEluYWN0aXZlQmluZGluZyIsImNsaXBVdWlkIiwiYWN0aW9uc0ZvckNsaXAiLCJfYWN0aW9uc0J5Q2xpcCIsImtub3duQWN0aW9ucyIsIl9hZGRJbmFjdGl2ZUFjdGlvbiIsIl9sZW5kQmluZGluZyIsIl9sZW5kQWN0aW9uIiwiX3Rha2VCYWNrQmluZGluZyIsIl90YWtlQmFja0FjdGlvbiIsIl9hY3Rpb25zIiwiX25BY3RpdmVBY3Rpb25zIiwiX25BY3RpdmVCaW5kaW5ncyIsIl9jb250cm9sSW50ZXJwb2xhbnRzIiwiX25BY3RpdmVDb250cm9sSW50ZXJwb2xhbnRzIiwiYWN0aW9ucyIsImNvbnRyb2xJbnRlcnBvbGFudHMiLCJhY3Rpb25zQnlDbGlwIiwiYWN0aW9uQnlSb290IiwiX3JlbW92ZUluYWN0aXZlQWN0aW9uIiwibGFzdEluYWN0aXZlQWN0aW9uIiwiY2FjaGVJbmRleCIsImtub3duQWN0aW9uc0ZvckNsaXAiLCJsYXN0S25vd25BY3Rpb24iLCJieUNsaXBDYWNoZUluZGV4IiwiX3JlbW92ZUluYWN0aXZlQmluZGluZ3NGb3JBY3Rpb24iLCJfcmVtb3ZlSW5hY3RpdmVCaW5kaW5nIiwicHJldkluZGV4IiwibGFzdEFjdGl2ZUluZGV4IiwiZmlyc3RJbmFjdGl2ZUFjdGlvbiIsImZpcnN0SW5hY3RpdmVJbmRleCIsImxhc3RBY3RpdmVBY3Rpb24iLCJiaW5kaW5nQnlOYW1lIiwicHJvcEJpbmRpbmciLCJsYXN0SW5hY3RpdmVCaW5kaW5nIiwicmVtb3ZlX2VtcHR5X21hcCIsImZpcnN0SW5hY3RpdmVCaW5kaW5nIiwibGFzdEFjdGl2ZUJpbmRpbmciLCJfY29udHJvbEludGVycG9sYW50c1Jlc3VsdEJ1ZmZlciIsIl9fY2FjaGVJbmRleCIsImxhc3RBY3RpdmVJbnRlcnBvbGFudCIsImNsaXBBY3Rpb24iLCJvcHRpb25hbFJvb3QiLCJjbGlwT2JqZWN0IiwiZXhpc3RpbmdBY3Rpb24iLCJuZXdBY3Rpb24iLCJzdG9wQWxsQWN0aW9uIiwibkFjdGlvbnMiLCJ1bmNhY2hlQ2xpcCIsImFjdGlvbnNUb1JlbW92ZSIsInVuY2FjaGVSb290IiwidW5jYWNoZUFjdGlvbiIsIlVuaWZvcm0iLCJJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSIsImludGVybGVhdmVkQnVmZmVyIiwiSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUiLCJJbnRlcmxlYXZlZEJ1ZmZlciIsImlzSW50ZXJsZWF2ZWRCdWZmZXIiLCJJbnN0YW5jZWRJbnRlcmxlYXZlZEJ1ZmZlciIsIkluc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZSIsIlBvaW50Q2xvdWQiLCJpbnRlcnNlY3RPYmplY3QiLCJSYXljYXN0ZXIiLCJzZXRGcm9tQ2FtZXJhIiwiY29vcmRzIiwiYXNjU29ydCIsImludGVyc2VjdE9iamVjdHMiLCJhdXRvU3RhcnQiLCJvbGRUaW1lIiwiZWxhcHNlZFRpbWUiLCJydW5uaW5nIiwiQ2xvY2siLCJEYXRlIiwicGVyZm9ybWFuY2UiLCJnZXRFbGFwc2VkVGltZSIsImdldERlbHRhIiwibmV3VGltZSIsIlNwaGVyaWNhbCIsIm90aGVyIiwibWFrZVNhZmUiLCJ2ZWMzIiwiQ3lsaW5kcmljYWwiLCJCb3gyIiwiSW1tZWRpYXRlUmVuZGVyT2JqZWN0Iiwib2JqR2VvbWV0cnkiLCJuTm9ybWFscyIsIlZlcnRleE5vcm1hbHNIZWxwZXIiLCJvYmpQb3MiLCJvYmpOb3JtIiwiY29uZSIsIlNwb3RMaWdodEhlbHBlciIsImNvbmVMZW5ndGgiLCJjb25lV2lkdGgiLCJib25lTGlzdCIsImdldEJvbmVMaXN0IiwiU2tlbGV0b25IZWxwZXIiLCJtYXRyaXhXb3JsZEludiIsImJvbmVNYXRyaXgiLCJzcGhlcmVTaXplIiwiUG9pbnRMaWdodEhlbHBlciIsIlJlY3RBcmVhTGlnaHRIZWxwZXIiLCJIZW1pc3BoZXJlTGlnaHRIZWxwZXIiLCJHcmlkSGVscGVyIiwicmFkaWFscyIsImNpcmNsZXMiLCJQb2xhckdyaWRIZWxwZXIiLCJGYWNlTm9ybWFsc0hlbHBlciIsImxpZ2h0UGxhbmUiLCJ0YXJnZXRMaW5lIiwiRGlyZWN0aW9uYWxMaWdodEhlbHBlciIsImFkZExpbmUiLCJjb2xvckZydXN0dW0iLCJjb2xvckNvbmUiLCJjb2xvclVwIiwiY29sb3JUYXJnZXQiLCJjb2xvckNyb3NzIiwiYWRkUG9pbnQiLCJwb2ludE1hcCIsIkNhbWVyYUhlbHBlciIsInNldFBvaW50IiwiQm94SGVscGVyIiwiQm94M0hlbHBlciIsInBvc2l0aW9uczIiLCJQbGFuZUhlbHBlciIsImhlYWRMZW5ndGgiLCJoZWFkV2lkdGgiLCJsaW5lR2VvbWV0cnkiLCJjb25lR2VvbWV0cnkiLCJzZXREaXJlY3Rpb24iLCJBcnJvd0hlbHBlciIsInNldENvbG9yIiwiQXhlc0hlbHBlciIsImNvbnN0cnVjdCIsImNyZWF0ZVBvaW50c0dlb21ldHJ5IiwiY3JlYXRlR2VvbWV0cnkiLCJjcmVhdGVTcGFjZWRQb2ludHNHZW9tZXRyeSIsImZyb21Qb2ludHMiLCJTcGxpbmUiLCJpbml0RnJvbUFycmF5IiwiZ2V0Q29udHJvbFBvaW50c0FycmF5IiwicmVwYXJhbWV0cml6ZUJ5QXJjTGVuZ3RoIiwic2V0Q29sb3JzIiwiaXNJbnRlcnNlY3Rpb25Cb3giLCJpc0ludGVyc2VjdGlvblNwaGVyZSIsInJhbmRvbTE2IiwibmVhcmVzdFBvd2VyT2ZUd28iLCJuZXh0UG93ZXJPZlR3byIsImZsYXR0ZW5Ub0FycmF5T2Zmc2V0IiwibXVsdGlwbHlWZWN0b3IzIiwibXVsdGlwbHlWZWN0b3IzQXJyYXkiLCJhcHBseVRvQnVmZmVyIiwiYXBwbHlUb1ZlY3RvcjNBcnJheSIsImV4dHJhY3RQb3NpdGlvbiIsImdldFBvc2l0aW9uIiwibXVsdGlwbHlUb0FycmF5IiwibXVsdGlwbHlWZWN0b3I0Iiwicm90YXRlQXhpcyIsImNyb3NzVmVjdG9yIiwicm90YXRlQnlBeGlzIiwibWFrZUZydXN0dW0iLCJpc0ludGVyc2VjdGlvbkxpbmUiLCJpc0ludGVyc2VjdGlvblBsYW5lIiwiYmFyeWNvb3JkRnJvbVBvaW50IiwibWlkcG9pbnQiLCJleHRyYWN0QWxsUG9pbnRzIiwiZXh0cnVkZSIsIm1ha2VHZW9tZXRyeSIsImZyb21BdHRyaWJ1dGUiLCJkaXN0YW5jZVRvTWFuaGF0dGFuIiwibGVuZ3RoTWFuaGF0dGFuIiwic2V0RXVsZXJGcm9tUm90YXRpb25NYXRyaXgiLCJzZXRFdWxlckZyb21RdWF0ZXJuaW9uIiwiZ2V0UG9zaXRpb25Gcm9tTWF0cml4IiwiZ2V0U2NhbGVGcm9tTWF0cml4IiwiZ2V0Q29sdW1uRnJvbU1hdHJpeCIsImFwcGx5UHJvamVjdGlvbiIsImNvbXB1dGVUYW5nZW50cyIsImdldENoaWxkQnlOYW1lIiwicmVuZGVyRGVwdGgiLCJnZXRXb3JsZFJvdGF0aW9uIiwiZXVsZXJPcmRlciIsInVzZVF1YXRlcm5pb24iLCJzZXRMZW5zIiwib25seVNoYWRvdyIsInNoYWRvd0NhbWVyYUZvdiIsInNoYWRvd0NhbWVyYUxlZnQiLCJzaGFkb3dDYW1lcmFSaWdodCIsInNoYWRvd0NhbWVyYVRvcCIsInNoYWRvd0NhbWVyYUJvdHRvbSIsInNoYWRvd0NhbWVyYVZpc2libGUiLCJzaGFkb3dEYXJrbmVzcyIsInNoYWRvd01hcFdpZHRoIiwic2hhZG93TWFwSGVpZ2h0IiwiY29weUluZGljZXNBcnJheSIsImFkZEluZGV4IiwiYWRkRHJhd0NhbGwiLCJjbGVhckRyYXdDYWxscyIsImNvbXB1dGVPZmZzZXRzIiwiZ2V0QXJyYXlzIiwiYWRkU2hhcGVMaXN0Iiwid3JhcEFyb3VuZCIsIndyYXBSR0IiLCJtZXRhbCIsIldlYkdMUmVuZGVyZXIiLCJnZXRDdXJyZW50UmVuZGVyVGFyZ2V0IiwiZ2V0UHJlY2lzaW9uIiwicmVzZXRHTFN0YXRlIiwic3VwcG9ydHNGbG9hdFRleHR1cmVzIiwic3VwcG9ydHNIYWxmRmxvYXRUZXh0dXJlcyIsInN1cHBvcnRzU3RhbmRhcmREZXJpdmF0aXZlcyIsInN1cHBvcnRzQ29tcHJlc3NlZFRleHR1cmVTM1RDIiwic3VwcG9ydHNDb21wcmVzc2VkVGV4dHVyZVBWUlRDIiwic3VwcG9ydHNCbGVuZE1pbk1heCIsInN1cHBvcnRzSW5zdGFuY2VkQXJyYXlzIiwiZW5hYmxlU2Npc3NvclRlc3QiLCJhZGRQcmVQbHVnaW4iLCJhZGRQb3N0UGx1Z2luIiwidXBkYXRlU2hhZG93TWFwIiwic2V0RmFjZUN1bGxpbmciLCJzaGFkb3dNYXBDdWxsRmFjZSIsIldlYkdMU2hhZG93TWFwIiwicmVuZGVyUmV2ZXJzZVNpZGVkIiwicmVuZGVyU2luZ2xlU2lkZWQiLCJXZWJWUk1hbmFnZXIiLCJzdGFuZGluZyIsImF1ZGlvTG9hZGVyIiwiZ2V0RGF0YSIsInVwZGF0ZUN1YmVNYXAiLCJvbiIsImN0eCIsImV2ZW50cyIsIm9mZiIsIlRZUEUiLCJfZiIsImdldENvbnN0cnVjdG9yIiwiSVNfTUFQIiwiQURERVIiLCJfbCIsIlNJWkUiLCJfdmFsaWRhdGVDb2xsZWN0aW9uIiwiZ2V0RW50cnkiLCJoYXMiLCJkUCQyIiwic2V0U3Ryb25nIiwib3JpZ2luYWwiLCJTUEVDSUVTJDIiLCJfYXJyYXlTcGVjaWVzQ29uc3RydWN0b3IiLCJJU19GSU5EX0lOREVYIiwiX2FycmF5U3BlY2llc0NyZWF0ZSIsIl9pb2JqZWN0IiwiSVNfRklMVEVSIiwicmVzIiwiTk9fSE9MRVMiLCJJU19FVkVSWSIsIklTX1NPTUUiLCJfYXJyYXlNZXRob2RzIiwiSVNfV0VBSyIsImVhY2giLCJJU19BRERFUiIsImRQJDMiLCJfY29sbGVjdGlvbiIsIk1BUCIsIl9jb2xsZWN0aW9uU3Ryb25nIiwiX2NvbGxlY3Rpb25Ub0pzb24iLCJDT0xMRUNUSU9OIiwib2YiLCJBIiwiX3NldENvbGxlY3Rpb25PZiIsIm1hcEZuIiwibmV4dEl0ZW0iLCJfc2V0Q29sbGVjdGlvbkZyb20iLCJNYXAiLCJmYWN0b3JpZXMiLCJwYXJ0QXJncyIsImJvdW5kIiwiUmVmbGVjdCIsInJDb25zdHJ1Y3QiLCJORVdfVEFSR0VUX0JVRyIsIkFSR1NfQlVHIiwiVGFyZ2V0IiwibmV3VGFyZ2V0IiwiJGFyZ3MiLCJfYmluZCIsImNvbnN0cnVjdCQxIiwiUGFyZW50IiwiQ2xhc3MiLCJjb25zdHJ1Y3QkMiIsIl9jb25zdHJ1Y3QiLCJfd3JhcE5hdGl2ZVN1cGVyIiwiX2NhY2hlIiwiY3JlYXRlJDEiLCJnZXRQcm90b3R5cGVPZiQyIiwiX0Vycm9yIiwiY2xhc3NJbnN0YW5jZSIsImNvbXBvbmVudCIsImNsYXNzQ2FsbENoZWNrIiwiQ29tcG9zaXRpb25FcnJvciIsInBvc3NpYmxlQ29uc3RydWN0b3JSZXR1cm4iLCJzdGFjayIsInN0YWNrQXJyYXkiLCJpbmhlcml0cyIsIndyYXBOYXRpdmVTdXBlciIsIkVycm9yIiwiX0Vycm9yMiIsImFjdGl2ZU1vZHVsZSIsIkRlcGVuZGVuY3lFcnJvciIsIl90aGlzMiIsImRlcGVuZGVuY3lNb2R1bGUiLCJfRXJyb3IzIiwiTWFuYWdlckVycm9yIiwiX3RoaXMzIiwid2FybkRlcHMiLCJfRXZlbnRzIiwiTW9kdWxlU3lzdGVtIiwiY3JlYXRlQ2xhc3MiLCJtb2R1bGVzIiwiYXBwbHlNb2R1bGUiLCJhcHBseUJyaWRnZSIsIm9uQ29weSIsImJyaWRnZU1hcCIsImJyaWRnZSIsIm1vZHVsZVNjb3BlIiwiYWN0aXZlIiwiaW50ZWdyYXRlIiwiZGlzcG9zZU1vZHVsZSIsIl9tb2R1bGUiLCJtaW5pdmVudHNfY29tbW9uanMiLCJfYXJyYXlXaXRoSG9sZXMiLCJnZXRJdGVyYXRvciIsImNvcmVfZ2V0SXRlcmF0b3IiLCJnZXRJdGVyYXRvciQxIiwiX2FyciIsIl9lIiwiX2l0ZXJhYmxlVG9BcnJheUxpbWl0IiwiX25vbkl0ZXJhYmxlUmVzdCIsIml0ZXJhYmxlVG9BcnJheUxpbWl0Iiwibm9uSXRlcmFibGVSZXN0IiwiX3NsaWNlZFRvQXJyYXkiLCJvYnNlcnZhYmxlIiwic3ltYm9sT2JzZXJ2YWJsZVBvbnlmaWxsIiwiSU5JVCIsIlJFUExBQ0UiLCJyZWR1Y2VyIiwicHJlbG9hZGVkU3RhdGUiLCJlbmhhbmNlciIsImNyZWF0ZVN0b3JlIiwiY3VycmVudExpc3RlbmVycyIsIm5leHRMaXN0ZW5lcnMiLCJpc0Rpc3BhdGNoaW5nIiwiZW5zdXJlQ2FuTXV0YXRlTmV4dExpc3RlbmVycyIsImlzU3Vic2NyaWJlZCIsImlzUGxhaW5PYmplY3QiLCJjdXJyZW50U3RhdGUiLCJjdXJyZW50UmVkdWNlciIsIm5leHRSZWR1Y2VyIiwiZGlzcGF0Y2giLCJBY3Rpb25UeXBlcyIsInN1YnNjcmliZSIsIm9ic2VydmVyIiwiZ2V0U3RhdGUiLCJvYnNlcnZlU3RhdGUiLCJvdXRlclN1YnNjcmliZSIsInVuc3Vic2NyaWJlIiwiX3JlZiIsInJlcGxhY2VSZWR1Y2VyIiwiX3JlZjIiLCJNb2R1bGVNYW5hZ2VyIiwiY3VycmVudE1vZHVsZSIsIl90aGlzJHN0b3JlJGdldFN0YXRlMiIsInNsaWNlZFRvQXJyYXkiLCJfdGhpcyRzdG9yZSRnZXRTdGF0ZSIsImNoYW5nZWRLZXkiLCJkZXBzTWFwIiwibW9kdWxlRXhlY3V0b3IiLCJ1c2UiLCJfTW9kdWxlU3lzdGVtIiwiQ29tcG9uZW50IiwiZGVmYXVsdHMiLCJhc3NlcnRUaGlzSW5pdGlhbGl6ZWQiLCJpbnRlZ3JhdGVNb2R1bGVzIiwiX3dhaXQiLCJpc0RlZmZlcmVkIiwid2FpdCIsImN1c3RvbWl6ZSIsIm9iamVjdFNwcmVhZCIsIm5hdGl2ZSIsImFzeW5jVG9HZW5lcmF0b3IiLCJyZWdlbmVyYXRvciIsIm9uQWRkIiwiX2NhbGxlZSIsIl9jb250ZXh0MiIsIl9jYWxsZWUyIiwiX3gyIiwiX21hbmFnZXIiLCJfbmF0aXZlIiwicHJvcGVydHlLZXkiLCJyZWNlaXZlciIsImdldCQxIiwicHJvcGVydHkiLCJfc3VwZXJQcm9wQmFzZSIsImdldCQyIiwiX2dldCIsInN1cGVyUHJvcEJhc2UiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IkMSIsIm1hcHBlcnMiLCJtYXBwZXIiLCJnZXR0ZXIiLCJfbGVuMiIsIl9rZXkyIiwiX2xlbjMiLCJfa2V5MyIsIl9jbGFzcyIsIk1lc2hDb21wb25lbnQiLCJfZGVjIiwibWlycm9yIiwiX0NvbXBvbmVudCIsImdlb20iLCJfTWVzaENvbXBvbmVudCIsIl9jbGFzczIiLCJfdGhpcyRhcHBseUJyaWRnZSIsImN1c3RvbSIsImJ1aWxkIiwiYXBwbHlDb21tYW5kIiwiX3RoaXMyJHBhcmFtcyIsImNhc3QiLCJyZWNlaXZlIiwib25XcmFwIiwiX2NsYXNzJDEiLCJMaWdodENvbXBvbmVudCIsIl9kZWMkMSIsIndyYXBTaGFkb3ciLCJfY2xhc3MkMiIsIkNhbWVyYUNvbXBvbmVudCIsIl9kZWMkMiIsIkFwcCIsInN5c3RlbSIsIndlYmtpdFJlcXVlc3RBbmltYXRpb25GcmFtZSIsIm1velJlcXVlc3RBbmltYXRpb25GcmFtZSIsImxvb3BzIiwicmVxdWVzdEFuaW1GcmFtZSIsImxsIiwiZXhlY3V0ZSIsImNsb2NrIiwiTG9vcCIsInVzZUNsb2NrIiwid29ybGQiLCJhZGRMb29wIiwicmVtb3ZlTG9vcCIsIl9MaWdodENvbXBvbmVudCIsIkFtYmllbnRMaWdodCQkMSIsIkFtYmllbnRMaWdodCQxIiwiRGlyZWN0aW9uYWxMaWdodCQkMSIsIkRpcmVjdGlvbmFsTGlnaHQkMSIsIkhlbWlzcGhlcmVMaWdodCQkMSIsIkhlbWlzcGhlcmVMaWdodCQxIiwiUG9pbnRMaWdodCQkMSIsIlBvaW50TGlnaHQkMSIsIlNwb3RMaWdodCQkMSIsImV4cG9uZW50IiwiU3BvdExpZ2h0JDEiLCJBcmVhTGlnaHQiLCJfQ2FtZXJhQ29tcG9uZW50IiwiQ3ViZUNhbWVyYSQkMSIsIkN1YmVDYW1lcmEkMSIsIk9ydGhvZ3JhcGhpY0NhbWVyYSQkMSIsIk9ydGhvZ3JhcGhpY0NhbWVyYSQxIiwiaW5uZXJXaWR0aCIsImlubmVySGVpZ2h0IiwiUGVyc3BlY3RpdmVDYW1lcmEkJDEiLCJQZXJzcGVjdGl2ZUNhbWVyYSQxIiwiQm94IiwiYnVpbGRHZW9tZXRyeSIsIkNpcmNsZSIsIkNvbmUiLCJnZXQkMyIsInJhZGl1c1NlZ21lbnRzIiwiQ3lsaW5kZXIiLCJEb2RlY2FoZWRyb24iLCJFeHRydWRlIiwiSWNvc2FoZWRyb24iLCJMYXRoZSIsIkxpbmUkJDEiLCJ2ZXJ0cyIsImkzIiwiTGluZSQxIiwiSW1wb3J0ZXIiLCJfZmlsdGVyIiwicHJvY2Vzc0ZpbHRlciIsInVzZUN1c3RvbU1hdGVyaWFsIiwiT2N0YWhlZHJvbiIsIlBhcmFtZXRyaWMiLCJQbGFuZSQkMSIsIndTZWdtZW50cyIsImhTZWdtZW50cyIsIlBsYW5lJDEiLCJpbmRpY2VzT2ZGYWNlcyIsIlBvbHloZWRyb24iLCJ2ZXJ0aWNlc09mQ3ViZSIsIlJpbmciLCJTaGFwZSQkMSIsIlNoYXBlJDEiLCJTcGhlcmUkJDEiLCJTcGhlcmUkMSIsIlRldHJhaGVkcm9uIiwiVGV4dCIsIlRvcnVzIiwiVG9ydXNrbm90IiwiVHViZSIsIkdyb3VwJCQxIiwiYWRkVG8iLCJib2R5IiwiRWxlbWVudE1vZHVsZSIsImNsYXNzTmFtZSIsIlJlbmRlcmluZ01vZHVsZSIsImRldmljZVBpeGVsUmF0aW8iLCJiZ0NvbG9yIiwiYmdPcGFjaXR5IiwiZml4IiwiX3RoaXMkcGFyYW1zIiwiZWZmZWN0cyIsInRvRml4ZWQiLCJhZGRpdGlvbmFsIiwiYXBwbHlBZGRpdGlvbmFsIiwiYXR0YWNoVG9DYW52YXMiLCJfZWZmZWN0IiwicmVuZGVyTG9vcCIsImVmZmVjdExvb3AiLCJhcHAiLCJkZWZpbmUiLCJpbnRlZ3JhdGVSZW5kZXJlciIsIl9lbGVtZW50IiwiX3NjZW5lIiwiX2NhbWVyYSIsIl90aGlzNCIsIlNjZW5lTW9kdWxlIiwid2lsbFNjZW5lQmVSZXBsYWNlZCIsIl9zZXRTY2VuZSIsIlNZTUJPTF9DSElMRFJFTl9GT1JfU0NFTkUiLCJzZXRTY2VuZSIsImdldFNjZW5lIiwiUmVzaXplTW9kdWxlIiwiYXV0byIsInJlbmRlcmluZyIsIm9mZnNldFdpZHRoIiwiX3RoaXMkY29udGFpbmVyIiwib2Zmc2V0SGVpZ2h0IiwiZ2V0Q29udGFpbmVyIiwiZ2V0UmVzb2x1dGlvbiIsInRyaWdnZXIiLCJfY29udGFpbmVyIiwiYWRkQXV0b3Jlc2l6ZSIsIl9TaGFkZXJNYXRlcmlhbCIsIkFkYXB0aXZlTHVtaW5vc2l0eU1hdGVyaWFsIiwiTUlQX0xFVkVMXzFYMSIsInRQcmV2aW91c0x1bSIsInRDdXJyZW50THVtIiwibWluTHVtaW5hbmNlIiwidGF1IiwiZnJhZ21lbnQiLCJCb2tlaE1hdGVyaWFsIiwiZG9mIiwiYXBlcnR1cmUiLCJtYXhCbHVyIiwiY2FtZXJhTmVhciIsImNhbWVyYUZhciIsInREaWZmdXNlIiwidERlcHRoIiwiZnJhZ21lbnQkMSIsInZlcnRleCQxIiwiYWRvcHRDYW1lcmFTZXR0aW5ncyIsIkNvbG9yRWRnZXNNYXRlcmlhbCIsIkVER0VfVEhSRVNIT0xEIiwidGV4ZWxTaXplIiwiZnJhZ21lbnQkMiIsInZlcnRleCQyIiwiQ29tYmluZU1hdGVyaWFsIiwidGV4dHVyZTEiLCJ0ZXh0dXJlMiIsIm9wYWNpdHkxIiwib3BhY2l0eTIiLCJmcmFnbWVudCQzIiwidmVydGV4JDMiLCJzZXRTY3JlZW5Nb2RlRW5hYmxlZCIsInNjcmVlbk1vZGUiLCJTQ1JFRU5fTU9ERSIsIkNvbnZvbHV0aW9uTWF0ZXJpYWwiLCJoYWxmVGV4ZWxTaXplIiwia2VybmVsIiwiZnJhZ21lbnQkNCIsInZlcnRleCQ0Iiwic2V0VGV4ZWxTaXplIiwia2VybmVsU2l6ZSIsIktlcm5lbFNpemUiLCJMQVJHRSIsIlZFUllfU01BTEwiLCJTTUFMTCIsIk1FRElVTSIsIlZFUllfTEFSR0UiLCJIVUdFIiwiQ29weU1hdGVyaWFsIiwiZnJhZ21lbnQkNSIsInZlcnRleCQ1IiwiRGVwdGhDb21wYXJpc29uTWF0ZXJpYWwiLCJmcmFnbWVudCQ2IiwidmVydGV4JDYiLCJQRVJTUEVDVElWRV9DQU1FUkEiLCJEb3RTY3JlZW5NYXRlcmlhbCIsImF2ZXJhZ2UiLCJvZmZzZXRSZXBlYXQiLCJmcmFnbWVudCQ3IiwidmVydGV4JDciLCJzZXRBdmVyYWdlRW5hYmxlZCIsIkFWRVJBR0UiLCJGaWxtTWF0ZXJpYWwiLCJub2lzZSIsInNjYW5saW5lcyIsImdyZXlzY2FsZSIsInNlcGlhIiwidmlnbmV0dGUiLCJlc2tpbCIsIm5vaXNlSW50ZW5zaXR5Iiwic2NhbmxpbmVJbnRlbnNpdHkiLCJncmlkSW50ZW5zaXR5IiwiZ3JleXNjYWxlSW50ZW5zaXR5Iiwic2VwaWFJbnRlbnNpdHkiLCJ2aWduZXR0ZU9mZnNldCIsInZpZ25ldHRlRGFya25lc3MiLCJzY2FubGluZUNvdW50IiwiZ3JpZFNjYWxlIiwiZ3JpZExpbmVXaWR0aCIsImZyYWdtZW50JDgiLCJ2ZXJ0ZXgkOCIsInNldE5vaXNlRW5hYmxlZCIsInNldFNjYW5saW5lc0VuYWJsZWQiLCJzZXRHcmlkRW5hYmxlZCIsInNldEdyZXlzY2FsZUVuYWJsZWQiLCJzZXRTZXBpYUVuYWJsZWQiLCJzZXRWaWduZXR0ZUVuYWJsZWQiLCJzZXRFc2tpbEVuYWJsZWQiLCJOT0lTRSIsIlNDQU5MSU5FUyIsIkdSSUQiLCJHUkVZU0NBTEUiLCJTRVBJQSIsIlZJR05FVFRFIiwiRVNLSUwiLCJHbGl0Y2hNYXRlcmlhbCIsInRQZXJ0dXJiIiwic2VlZCIsInNlZWRYIiwic2VlZFkiLCJkaXN0b3J0aW9uWCIsImRpc3RvcnRpb25ZIiwiY29sUyIsImZyYWdtZW50JDkiLCJ2ZXJ0ZXgkOSIsIkdvZFJheXNNYXRlcmlhbCIsImV4cG9zdXJlIiwiY2xhbXBNYXgiLCJOVU1fU0FNUExFU19GTE9BVCIsIk5VTV9TQU1QTEVTX0lOVCIsImxpZ2h0UG9zaXRpb24iLCJmcmFnbWVudCQxMCIsInZlcnRleCQxMCIsIkx1bWlub3NpdHlNYXRlcmlhbCIsImx1bWluYW5jZVJhbmdlIiwiZGlzdGluY3Rpb24iLCJtYXNrTHVtaW5hbmNlIiwiZnJhZ21lbnQkMTEiLCJ2ZXJ0ZXgkMTEiLCJzZXRDb2xvck91dHB1dEVuYWJsZWQiLCJjb2xvck91dHB1dCIsInNldEx1bWluYW5jZVJhbmdlRW5hYmxlZCIsIkNPTE9SIiwiUkFOR0UiLCJPdXRsaW5lQmxlbmRNYXRlcmlhbCIsImVkZ2VTdHJlbmd0aCIsInBhdHRlcm5TY2FsZSIsInZpc2libGVFZGdlQ29sb3IiLCJoaWRkZW5FZGdlQ29sb3IiLCJhbHBoYUJsZW5kaW5nIiwieFJheSIsInB1bHNlIiwidE1hc2siLCJ0RWRnZXMiLCJ0UGF0dGVybiIsImZyYWdtZW50JDEyIiwidmVydGV4JDEyIiwic2V0QWxwaGFCbGVuZGluZ0VuYWJsZWQiLCJzZXRYUmF5RW5hYmxlZCIsIkFMUEhBX0JMRU5ESU5HIiwiWF9SQVkiLCJVU0VfUEFUVEVSTiIsIk91dGxpbmVFZGdlc01hdGVyaWFsIiwiZnJhZ21lbnQkMTMiLCJ2ZXJ0ZXgkMTMiLCJQaXhlbGF0aW9uTWF0ZXJpYWwiLCJncmFudWxhcml0eSIsImZyYWdtZW50JDE0IiwidmVydGV4JDE0IiwiUmVhbGlzdGljQm9rZWhNYXRlcmlhbCIsInJpbmdzIiwic2FtcGxlcyIsInNob3dGb2N1cyIsIm1hbnVhbERvRiIsInBlbnRhZ29uIiwic2hhZGVyRm9jdXMiLCJsdW1pbmFuY2VUaHJlc2hvbGQiLCJsdW1pbmFuY2VHYWluIiwiZnJpbmdlIiwiZGl0aGVyU3RyZW5ndGgiLCJSSU5HU19JTlQiLCJSSU5HU19GTE9BVCIsIlNBTVBMRVNfSU5UIiwiU0FNUExFU19GTE9BVCIsImZvY2FsU3RvcCIsImZvY3VzQ29vcmRzIiwiZm9jYWxEZXB0aCIsImZyYWdtZW50JDE1IiwidmVydGV4JDE1Iiwic2V0U2hvd0ZvY3VzRW5hYmxlZCIsInNldE1hbnVhbERlcHRoT2ZGaWVsZEVuYWJsZWQiLCJzZXRQZW50YWdvbkVuYWJsZWQiLCJzZXRTaGFkZXJGb2N1c0VuYWJsZWQiLCJTSE9XX0ZPQ1VTIiwiTUFOVUFMX0RPRiIsIlBFTlRBR09OIiwiU0hBREVSX0ZPQ1VTIiwiU2hvY2tXYXZlTWF0ZXJpYWwiLCJtYXhSYWRpdXMiLCJ3YXZlU2l6ZSIsImFtcGxpdHVkZSIsImNhbWVyYURpc3RhbmNlIiwiZnJhZ21lbnQkMTYiLCJ2ZXJ0ZXgkMTYiLCJTTUFBQmxlbmRNYXRlcmlhbCIsInRXZWlnaHRzIiwiZnJhZ21lbnQkMTciLCJ2ZXJ0ZXgkMTciLCJTTUFBV2VpZ2h0c01hdGVyaWFsIiwiTUFYX1NFQVJDSF9TVEVQU19JTlQiLCJNQVhfU0VBUkNIX1NURVBTX0ZMT0FUIiwiQVJFQVRFWF9NQVhfRElTVEFOQ0UiLCJBUkVBVEVYX1BJWEVMX1NJWkUiLCJBUkVBVEVYX1NVQlRFWF9TSVpFIiwiU0VBUkNIVEVYX1NJWkUiLCJTRUFSQ0hURVhfUEFDS0VEX1NJWkUiLCJ0QXJlYSIsInRTZWFyY2giLCJmcmFnbWVudCQxOCIsInZlcnRleCQxOCIsIlRvbmVNYXBwaW5nTWF0ZXJpYWwiLCJsdW1pbmFuY2VNYXAiLCJhdmVyYWdlTHVtaW5hbmNlIiwibWF4THVtaW5hbmNlIiwibWlkZGxlR3JleSIsImZyYWdtZW50JDE5IiwidmVydGV4JDE5IiwiUGFzcyIsInF1YWQiLCJyZW5kZXJUb1NjcmVlbiIsIm5lZWRzU3dhcCIsImlucHV0QnVmZmVyIiwib3V0cHV0QnVmZmVyIiwiX1Bhc3MiLCJCbHVyUGFzcyIsInJlbmRlclRhcmdldFgiLCJyZW5kZXJUYXJnZXRZIiwicmVzb2x1dGlvblNjYWxlIiwiY29udm9sdXRpb25NYXRlcmlhbCIsImRpdGhlcmVkQ29udm9sdXRpb25NYXRlcmlhbCIsImdldEtlcm5lbCIsImRlc3RSVCIsImxhc3RSVCIsIkJsb29tUGFzcyIsImJsdXJQYXNzIiwiY29tYmluZU1hdGVyaWFsIiwibHVtaW5vc2l0eU1hdGVyaWFsIiwiYmxlbmQiLCJpbml0aWFsaXplIiwiQm9rZWhQYXNzIiwiQ2xlYXJNYXNrUGFzcyIsIkNsZWFyUGFzcyIsIkRvdFNjcmVlblBhc3MiLCJGaWxtUGFzcyIsInNjYW5saW5lRGVuc2l0eSIsIkdsaXRjaFBhc3MiLCJwZXJ0dXJiTWFwIiwiZ2VuZXJhdGVQZXJ0dXJiTWFwIiwiZHRTaXplIiwiR2xpdGNoTW9kZSIsIlNQT1JBRElDIiwiYnJlYWtQb2ludCIsInJhbmRvbUludCIsImR0IiwiQ09OU1RBTlRfV0lMRCIsInJhbmRvbUZsb2F0IiwiQ09OU1RBTlRfTUlMRCIsIlJlbmRlclBhc3MiLCJjbGVhclBhc3MiLCJsaWdodFNvdXJjZSIsIkdvZFJheXNQYXNzIiwibGlnaHRTY2VuZSIsIm1haW5TY2VuZSIsIm1haW5DYW1lcmEiLCJyZW5kZXJUYXJnZXRNYXNrIiwicmVuZGVyUGFzc0xpZ2h0IiwicmVuZGVyUGFzc01hc2siLCJzY3JlZW5Qb3NpdGlvbiIsImdvZFJheXNNYXRlcmlhbCIsIk1hc2tQYXNzIiwid3JpdGVWYWx1ZSIsImNsZWFyVmFsdWUiLCJLRUVQIiwiU2hhZGVyUGFzcyIsInRleHR1cmVJRCIsIk91dGxpbmVQYXNzIiwicmVuZGVyVGFyZ2V0RGVwdGgiLCJyZW5kZXJUYXJnZXRFZGdlcyIsInJlbmRlclRhcmdldEJsdXJyZWRFZGdlcyIsInJlbmRlclBhc3NEZXB0aCIsImNvcHlQYXNzIiwib3V0bGluZUVkZ2VzTWF0ZXJpYWwiLCJvdXRsaW5lQmxlbmRNYXRlcmlhbCIsImJsdXIiLCJzZWxlY3Rpb24iLCJwdWxzZVNwZWVkIiwic2VsZWN0aW9uTGF5ZXIiLCJzZXRQYXR0ZXJuVGV4dHVyZSIsImNsZWFyU2VsZWN0aW9uIiwic2V0U2VsZWN0aW9uVmlzaWJsZSIsIlBpeGVsYXRpb25QYXNzIiwic2V0UmVzb2x1dGlvbiIsIlJlYWxpc3RpY0Jva2VoUGFzcyIsIlNhdmVQYXNzIiwicmVzaXplIiwiU2hvY2tXYXZlUGFzcyIsImVwaWNlbnRlciIsInNwZWVkIiwic2hvY2tXYXZlTWF0ZXJpYWwiLCJjb3B5TWF0ZXJpYWwiLCJIQUxGX1BJIiwic2VhcmNoSW1hZ2UiLCJhcmVhSW1hZ2UiLCJTTUFBUGFzcyIsInJlbmRlclRhcmdldENvbG9yRWRnZXMiLCJyZW5kZXJUYXJnZXRXZWlnaHRzIiwiY29sb3JFZGdlc01hdGVyaWFsIiwid2VpZ2h0c01hdGVyaWFsIiwic2VhcmNoVGV4dHVyZSIsImFyZWFUZXh0dXJlIiwiYmxlbmRNYXRlcmlhbCIsIlRleHR1cmVQYXNzIiwib3BhY2l0eVNvdXJjZSIsIlRvbmVNYXBwaW5nUGFzcyIsInJlbmRlclRhcmdldEx1bWlub3NpdHkiLCJyZW5kZXJUYXJnZXRBZGFwdGVkIiwicmVuZGVyVGFyZ2V0UHJldmlvdXMiLCJhZGFwdGl2ZUx1bWlub3NpdHlNYXRlcmlhbCIsInRvbmVNYXBwaW5nTWF0ZXJpYWwiLCJhZGFwdGl2ZSIsImxvZzIiLCJBREFQVEVEX0xVTUlOQU5DRSIsIkVmZmVjdENvbXBvc2VyIiwicGFzc2VzIiwib2xkU2l6ZSIsIm5ld1NpemUiLCJvbGRSZW5kZXJlciIsInBhcmVudE5vZGUiLCJkcmF3aW5nQnVmZmVyU2l6ZSIsInNob3dXYXJuIiwiUG9zdFByb2Nlc3Nvck1vZHVsZSIsImRlYnVnIiwiY29tcG9zZXIiLCJyZXBsYWNlUmVuZGVyZXIiLCJhZGRQYXNzIiwiY3VycmVudFBhc3MiLCJfcGFzcyIsInBvbHlmaWxsIiwiX3RoaXM1IiwiX3RoaXM2IiwiYm9vbCIsIkV2ZW50c1BhdGNoTW9kdWxlIiwib3JpZ2luT2JqZWN0IiwicGF0Y2hFdmVudHMiLCJWaXJ0dWFsTW91c2VNb2R1bGUiLCJnbG9iYWxNb3ZlbWVudCIsImN1c3RvbVgiLCJjdXN0b21ZIiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiwiY2xpZW50WCIsImNsaWVudFkiLCJtb3VzZSIsInJlY3QiLCJwcm9qZWN0aW9uUGxhbmUiLCJyZXF1aXJlIiwiZXYiLCJnbG9iYWxYIiwiZ2xvYmFsWSIsInBvaW50ZXJMb2NrRWxlbWVudCIsIm1vdmVtZW50WCIsIm1vdmVtZW50WSIsImhvdmVycyIsIm5lc3RlZCIsImlzSG92ZXJlZCIsIkNvbnRyb2xzTW9kdWxlIiwiY29udHJvbHMiLCJ1cGRhdGVMb29wIiwiRm9nTW9kdWxlIiwiU3RhdGVNb2R1bGUiLCJpc0VxdWFsIiwiaXNFcXVhbERlZmF1bHQiLCJhY3Rpb25HZW5lcmF0ZSIsImVxdWFsQ2hlY2siLCJjb25maWd1cmF0aW9uIiwiY3VycmVudENvbmZpZyIsInByZXZDb25maWciLCJjb25maWciLCJkZWZhdWx0IiwiY29uZmlncyIsInVwZGF0ZXMiLCJjb25maWdOYW1lIiwidHJ1ZVZhbCIsImZhbHNlVmFsIiwiX0V2ZW50RGlzcGF0Y2hlciIsImV2ZW50SGFuZGxlciIsIlRocmVlT3JiaXRDb250cm9scyIsIm1pblpvb20iLCJtYXhab29tIiwibWluUG9sYXJBbmdsZSIsIm1heFBvbGFyQW5nbGUiLCJtaW5BemltdXRoQW5nbGUiLCJtYXhBemltdXRoQW5nbGUiLCJlbmFibGVEYW1waW5nIiwiZGFtcGluZ0ZhY3RvciIsImVuYWJsZVpvb20iLCJ6b29tU3BlZWQiLCJlbmFibGVSb3RhdGUiLCJyb3RhdGVTcGVlZCIsImVuYWJsZVBhbiIsImtleVBhblNwZWVkIiwiYXV0b1JvdGF0ZSIsImF1dG9Sb3RhdGVTcGVlZCIsImVuYWJsZUtleXMiLCJVUCIsIkJPVFRPTSIsIm1vdXNlQnV0dG9ucyIsIk9SQklUIiwiTU9VU0UiLCJaT09NIiwiUEFOIiwidGFyZ2V0MCIsInBvc2l0aW9uMCIsInpvb20wIiwiZ2V0UG9sYXJBbmdsZSIsImdldEF6aW11dGhhbEFuZ2xlIiwiY2hhbmdlRXZlbnQiLCJTVEFURSIsIk5PTkUiLCJxdWF0Iiwic3BoZXJpY2FsIiwicm90YXRlTGVmdCIsImdldEF1dG9Sb3RhdGlvbkFuZ2xlIiwic3BoZXJpY2FsRGVsdGEiLCJwYW5PZmZzZXQiLCJxdWF0SW52ZXJzZSIsInpvb21DaGFuZ2VkIiwibGFzdFBvc2l0aW9uIiwibGFzdFF1YXRlcm5pb24iLCJvbkNvbnRleHRNZW51Iiwib25Nb3VzZURvd24iLCJvbk1vdXNlV2hlZWwiLCJvblRvdWNoU3RhcnQiLCJvblRvdWNoRW5kIiwib25Ub3VjaE1vdmUiLCJvbk1vdXNlTW92ZSIsIm9uTW91c2VVcCIsIm9uS2V5RG93biIsIlJPVEFURSIsIkRPTExZIiwiVE9VQ0hfUk9UQVRFIiwiVE9VQ0hfRE9MTFkiLCJUT1VDSF9QQU4iLCJvYmplY3RNYXRyaXgiLCJkZWx0YVgiLCJkZWx0YVkiLCJ0YXJnZXREaXN0YW5jZSIsInBhbkxlZnQiLCJjbGllbnRIZWlnaHQiLCJwYW5VcCIsImNsaWVudFdpZHRoIiwiZG9sbHlTY2FsZSIsInJvdGF0ZVN0YXJ0IiwiZG9sbHlTdGFydCIsInBhblN0YXJ0Iiwicm90YXRlRW5kIiwicm90YXRlRGVsdGEiLCJyb3RhdGVVcCIsImRvbGx5RW5kIiwiZG9sbHlEZWx0YSIsImRvbGx5SW4iLCJnZXRab29tU2NhbGUiLCJkb2xseU91dCIsInBhbkVuZCIsInBhbkRlbHRhIiwicGFuIiwia2V5Q29kZSIsInRvdWNoZXMiLCJwYWdlWCIsInBhZ2VZIiwiYnV0dG9uIiwiaGFuZGxlTW91c2VEb3duUm90YXRlIiwiaGFuZGxlTW91c2VEb3duRG9sbHkiLCJoYW5kbGVNb3VzZURvd25QYW4iLCJzdGFydEV2ZW50IiwiaGFuZGxlTW91c2VNb3ZlUm90YXRlIiwiaGFuZGxlTW91c2VNb3ZlRG9sbHkiLCJoYW5kbGVNb3VzZU1vdmVQYW4iLCJlbmRFdmVudCIsInN0b3BQcm9wYWdhdGlvbiIsImhhbmRsZU1vdXNlV2hlZWwiLCJoYW5kbGVLZXlEb3duIiwiaGFuZGxlVG91Y2hTdGFydFJvdGF0ZSIsImhhbmRsZVRvdWNoU3RhcnREb2xseSIsImhhbmRsZVRvdWNoU3RhcnRQYW4iLCJoYW5kbGVUb3VjaE1vdmVSb3RhdGUiLCJoYW5kbGVUb3VjaE1vdmVEb2xseSIsImhhbmRsZVRvdWNoTW92ZVBhbiIsIl9Db250cm9sc01vZHVsZSIsIk9yYml0Q29udHJvbHNNb2R1bGUiLCJmb2xsb3ciLCJzZXRDb250cm9scyIsInNldFVwZGF0ZSIsInVwZGF0ZVByb2Nlc3NvciIsIkR5bmFtaWNHZW9tZXRyeU1vZHVsZSIsImdfIiwidXBkYXRlUGFyYW1zIiwiX2xvb3AiLCJUZXh0dXJlTW9kdWxlIiwiX21hdGVyaWFsIiwiX3JlZiR0eXBlIiwiX3JlZiRvZmZzZXQiLCJfcmVmJHJlcGVhdCIsIl9yZWYkd3JhcCIsIl9yZWYkbWFwcGluZyIsIl9yZWYkZml4IiwidGV4IiwiaXNEZWZlcnJlZCIsIkFuaW1hdGlvbk1vZHVsZSIsIl9tZXNoIiwiRGVmaW5lTW9kdWxlIiwiX0ltcG9ydGVyIiwiTW9kZWwiLCJfZ2V0UHJvdG90eXBlT2YyIiwiQ2FtZXJhTW9kdWxlIiwiTmV2ZXJEZXB0aCIsIkFsd2F5c0RlcHRoIiwiTGVzc0RlcHRoIiwiRXF1YWxEZXB0aCIsIkdyZWF0ZXJFcXVhbERlcHRoIiwiR3JlYXRlckRlcHRoIiwiTm90RXF1YWxEZXB0aCIsIk1peE9wZXJhdGlvbiIsIkFkZE9wZXJhdGlvbiIsIlJlaW5oYXJkVG9uZU1hcHBpbmciLCJVbmNoYXJ0ZWQyVG9uZU1hcHBpbmciLCJDaW5lb25Ub25lTWFwcGluZyIsIlRyaWFuZ2xlU3RyaXBEcmF3TW9kZSIsIlRyaWFuZ2xlRmFuRHJhd01vZGUiLCJzUkdCRW5jb2RpbmciLCJSR0JFRW5jb2RpbmciLCJSR0JNN0VuY29kaW5nIiwiUkdCTTE2RW5jb2RpbmciLCJSR0JERW5jb2RpbmciLCJzZXRWYWx1ZTFmIiwic2V0VmFsdWUxaSIsInNldFZhbHVlMmZ2Iiwic2V0VmFsdWUzZnYiLCJzZXRWYWx1ZTRmdiIsInNldFZhbHVlMmZtIiwic2V0VmFsdWUzZm0iLCJzZXRWYWx1ZTRmbSIsInNldFZhbHVlVDEiLCJzZXRWYWx1ZVQ2Iiwic2V0VmFsdWUyaXYiLCJzZXRWYWx1ZTNpdiIsInNldFZhbHVlNGl2Iiwic2V0VmFsdWUxZnYiLCJzZXRWYWx1ZTFpdiIsInNldFZhbHVlVjJhIiwic2V0VmFsdWVWM2EiLCJzZXRWYWx1ZVY0YSIsInNldFZhbHVlTTJhIiwic2V0VmFsdWVNM2EiLCJzZXRWYWx1ZU00YSIsInNldFZhbHVlVDFhIiwic2V0VmFsdWVUNmEiLCJTaW5nbGVVbmlmb3JtIiwiUHVyZUFycmF5VW5pZm9ybSIsIldlYkdMQXR0cmlidXRlcyIsIldlYkdMUmVuZGVyTGlzdCIsIldlYkdMUmVuZGVyTGlzdHMiLCJXZWJHTEluZGV4ZWRCdWZmZXJSZW5kZXJlciIsIldlYkdMQnVmZmVyUmVuZGVyZXIiLCJXZWJHTEdlb21ldHJpZXMiLCJXZWJHTExpZ2h0cyIsIldlYkdMT2JqZWN0cyIsIldlYkdMUHJvZ3JhbSIsIldlYkdMUHJvZ3JhbXMiLCJXZWJHTFRleHR1cmVzIiwiV2ViR0xQcm9wZXJ0aWVzIiwiV2ViR0xTdGF0ZSIsIldlYkdMQ2FwYWJpbGl0aWVzIiwiV2ViR0xFeHRlbnNpb25zIiwiV2ViR0xDbGlwcGluZyIsIkdlb21ldHJpZXMiLCJNYXRlcmlhbHMiLCJMb2FkaW5nTWFuYWdlciIsIlRZUEVEX0FSUkFZUyIsIlF1YWRyYXRpY0JlemllclAwIiwiQ3ViaWNCZXppZXJQMCIsIkN1YmljUG9seSIsIlZSRWZmZWN0IiwidnJEaXNwbGF5IiwidnJEaXNwbGF5cyIsImV5ZVRyYW5zbGF0aW9uTCIsImV5ZVRyYW5zbGF0aW9uUiIsInJlbmRlclJlY3RMIiwicmVuZGVyUmVjdFIiLCJnb3RWUkRpc3BsYXlzIiwiZGlzcGxheXMiLCJnZXRWUkRpc3BsYXlzIiwiY2F0Y2giLCJyZW5kZXJlclNpemUiLCJyZW5kZXJlclVwZGF0ZVN0eWxlIiwicmVuZGVyZXJQaXhlbFJhdGlvIiwiZ2V0VlJEaXNwbGF5Iiwic2V0VlJEaXNwbGF5IiwiZXllUGFyYW1zTCIsImRlZmF1bHRMZWZ0Qm91bmRzIiwiZGVmYXVsdFJpZ2h0Qm91bmRzIiwid2FzUHJlc2VudGluZyIsImV5ZVdpZHRoIiwiZXllSGVpZ2h0Iiwic2V0RnVsbFNjcmVlbiIsInJlcXVlc3RQcmVzZW50IiwiZXhpdFByZXNlbnQiLCJjYW5jZWxBbmltYXRpb25GcmFtZSIsImF1dG9TdWJtaXRGcmFtZSIsImV5ZVBhcmFtc1IiLCJmb3ZUb1Byb2plY3Rpb24iLCJmaWVsZE9mVmlldyIsImZvdlRvTkRDU2NhbGVPZmZzZXQiLCJweHNjYWxlIiwibGVmdFRhbiIsInJpZ2h0VGFuIiwicHhvZmZzZXQiLCJweXNjYWxlIiwidXBUYW4iLCJkb3duVGFuIiwicHlvZmZzZXQiLCJmb3ZQb3J0VG9Qcm9qZWN0aW9uIiwicmlnaHRIYW5kZWQiLCJ6TmVhciIsInpGYXIiLCJoYW5kZWRuZXNzU2NhbGUiLCJtb2JqIiwic2NhbGVBbmRPZmZzZXQiLCJmb3ZQb3J0IiwidXBEZWdyZWVzIiwiZG93bkRlZ3JlZXMiLCJsZWZ0RGVncmVlcyIsInJpZ2h0RGVncmVlcyIsIldFQlZSIiwiaXNBdmFpbGFibGUiLCJjaGVja0F2YWlsYWJpbGl0eSIsIm9uRGlzcGxheSIsImdldE1lc3NhZ2UiLCJ6SW5kZXgiLCJhbGlnbiIsImZvbnRGYW1pbHkiLCJmb250U2l6ZSIsImZvbnRTdHlsZSIsImxpbmVIZWlnaHQiLCJiYWNrZ3JvdW5kQ29sb3IiLCJwYWRkaW5nIiwibWFyZ2luIiwiaW5uZXJIVE1MIiwiZ2V0TWVzc2FnZUNvbnRhaW5lciIsImdldEJ1dHRvbiIsIlRIUkVFIiwiYm9yZGVyIiwiY3Vyc29yIiwidGV4dEFsaWduIiwidGV4dENvbnRlbnQiLCJvbmNsaWNrIiwiVlJNb2R1bGUiLCJlZmZlY3QiLCJhZGRDYWxsYmFjayIsInZyYnRuIiwiVlIyTW9kdWxlIiwiVlJDb250cm9scyIsIlZSQ29udHJvbHNOYXRpdmUiXSwibWFwcGluZ3Mi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SSxFQUFMLENBQVUwSSxHQUFLQyxFQUFMLENBQVVGLEVBQVYsQ0FBZUYsR0FBS0MsRUFBTCxDQUFVSSxFQUFuQyxDQUNBLEtBQUszSSxFQUFMLENBQVV5SSxHQUFLRixFQUFMLENBQVVJLEVBQVYsQ0FBZUwsR0FBS0ksRUFBTCxDQUFVRixFQUFuQyxDQUNBLEtBQUtuZSxFQUFMLENBQVVvZSxHQUFLRixFQUFMLENBQVVDLEVBQVYsQ0FBZUYsR0FBS0ksRUFBTCxDQUFVQyxFQUFuQyxDQUVBLENBUE0sUUFPSzVKLFFBQVUsS0FBZixDQUF1QixDQUU3QixLQUFLZSxFQUFMLENBQVV3SSxHQUFLQyxFQUFMLENBQVVDLEVBQVYsQ0FBZUMsR0FBS0MsRUFBTCxDQUFVQyxFQUFuQyxDQUNBLEtBQUs1SSxFQUFMLENBQVUwSSxHQUFLQyxFQUFMLENBQVVGLEVBQVYsQ0FBZUYsR0FBS0MsRUFBTCxDQUFVSSxFQUFuQyxDQUNBLEtBQUszSSxFQUFMLENBQVV5SSxHQUFLRixFQUFMLENBQVVJLEVBQVYsQ0FBZUwsR0FBS0ksRUFBTCxDQUFVRixFQUFuQyxDQUNBLEtBQUtuZSxFQUFMLENBQVVvZSxHQUFLRixFQUFMLENBQVVDLEVBQVYsQ0FBZUYsR0FBS0ksRUFBTCxDQUFVQyxFQUFuQyxDQUVBLENBUE0sUUFPSzVKLFFBQVUsS0FBZixDQUF1QixDQUU3QixLQUFLZSxFQUFMLENBQVV3SSxHQUFLQyxFQUFMLENBQVVDLEVBQVYsQ0FBZUMsR0FBS0MsRUFBTCxDQUFVQyxFQUFuQyxDQUNBLEtBQUs1SSxFQUFMLENBQVUwSSxHQUFLQyxFQUFMLENBQVVGLEVBQVYsQ0FBZUYsR0FBS0MsRUFBTCxDQUFVSSxFQUFuQyxDQUNBLEtBQUszSSxFQUFMLENBQVV5SSxHQUFLRixFQUFMLENBQVVJLEVBQVYsQ0FBZUwsR0FBS0ksRUFBTCxDQUFVRixFQUFuQyxDQUNBLEtBQUtuZSxFQUFMLENBQVVvZSxHQUFLRixFQUFMLENBQVVDLEVBQVYsQ0FBZUYsR0FBS0ksRUFBTCxDQUFVQyxFQUFuQyxDQUVBLENBUE0sUUFPSzVKLFFBQVUsS0FBZixDQUF1QixDQUU3QixLQUFLZSxFQUFMLENBQVV3SSxHQUFLQyxFQUFMLENBQVVDLEVBQVYsQ0FBZUMsR0FBS0MsRUFBTCxDQUFVQyxFQUFuQyxDQUNBLEtBQUs1SSxFQUFMLENBQVUwSSxHQUFLQyxFQUFMLENBQVVGLEVBQVYsQ0FBZUYsR0FBS0MsRUFBTCxDQUFVSSxFQUFuQyxDQUNBLEtBQUszSSxFQUFMLENBQVV5SSxHQUFLRixFQUFMLENBQVVJLEVBQVYsQ0FBZUwsR0FBS0ksRUFBTCxDQUFVRixFQUFuQyxDQUNBLEtBQUtuZSxFQUFMLENBQVVvZSxHQUFLRixFQUFMLENBQVVDLEVBQVYsQ0FBZUYsR0FBS0ksRUFBTCxDQUFVQyxFQUFuQyxDQUVBLENBUE0sUUFPSzVKLFFBQVUsS0FBZixDQUF1QixDQUU3QixLQUFLZSxFQUFMLENBQVV3SSxHQUFLQyxFQUFMLENBQVVDLEVBQVYsQ0FBZUMsR0FBS0MsRUFBTCxDQUFVQyxFQUFuQyxDQUNBLEtBQUs1SSxFQUFMLENBQVUwSSxHQUFLQyxFQUFMLENBQVVGLEVBQVYsQ0FBZUYsR0FBS0MsRUFBTCxDQUFVSSxFQUFuQyxDQUNBLEtBQUszSSxFQUFMLENBQVV5SSxHQUFLRixFQUFMLENBQVVJLEVBQVYsQ0FBZUwsR0FBS0ksRUFBTCxDQUFVRixFQUFuQyxDQUNBLEtBQUtuZSxFQUFMLENBQVVvZSxHQUFLRixFQUFMLENBQVVDLEVBQVYsQ0FBZUYsR0FBS0ksRUFBTCxDQUFVQyxFQUFuQyxDQUVBLENBRUQsR0FBS04sU0FBVyxLQUFoQixDQUF3QixLQUFLRixnQkFBTCxHQUV4QixXQUFBLENBRUEsQ0EzR21DLENBNkdwQ1MsaUJBQWtCLFNBQVc1RCxJQUFYLENBQWlCOUosS0FBakIsQ0FBeUI7RUFJMUM7RUFFQSxjQUFnQkEsTUFBUSxDQUF4QixDQUEyQmprQixFQUFJVixLQUFLa21CLEdBQUwsQ0FBVW9NLFNBQVYsQ0FBL0IsQ0FFQSxLQUFLL0ksRUFBTCxDQUFVa0YsS0FBSy9kLENBQUwsQ0FBU2hRLENBQW5CLENBQ0EsS0FBSzhvQixFQUFMLENBQVVpRixLQUFLdk4sQ0FBTCxDQUFTeGdCLENBQW5CLENBQ0EsS0FBSytvQixFQUFMLENBQVVnRixLQUFLMUcsQ0FBTCxDQUFTcm5CLENBQW5CLENBQ0EsS0FBS29ULEVBQUwsQ0FBVTlULEtBQUtpbUIsR0FBTCxDQUFVcU0sU0FBVixDQUFWLENBRUEsS0FBS1YsZ0JBQUwsR0FFQSxXQUFBLENBRUEsQ0E5SG1DLENBZ0lwQ2xDLHNCQUF1QixTQUFXL08sQ0FBWCxDQUFlO0VBSXJDO0VBRUEsT0FBU0EsRUFBRWtELFFBQVgsQ0FFQzBPLElBQU1sTCxHQUFJLENBQUosQ0FGUCxDQUVnQm1MLElBQU1uTCxHQUFJLENBQUosQ0FGdEIsQ0FFK0JvTCxJQUFNcEwsR0FBSSxDQUFKLENBRnJDLENBR0NxTCxJQUFNckwsR0FBSSxDQUFKLENBSFAsQ0FHZ0JzTCxJQUFNdEwsR0FBSSxDQUFKLENBSHRCLENBRytCdUwsSUFBTXZMLEdBQUksQ0FBSixDQUhyQyxDQUlDd0wsSUFBTXhMLEdBQUksQ0FBSixDQUpQLENBSWdCeUwsSUFBTXpMLEdBQUksQ0FBSixDQUp0QixDQUkrQjBMLElBQU0xTCxHQUFJLEVBQUosQ0FKckMsQ0FNQzJMLE1BQVFULElBQU1JLEdBQU4sQ0FBWUksR0FOckIsQ0FPQ3J5QixDQVBELENBU0EsR0FBS3N5QixNQUFRLENBQWIsQ0FBaUIsQ0FFaEJ0eUIsRUFBSSxJQUFNVixLQUFLdWtCLElBQUwsQ0FBV3lPLE1BQVEsR0FBbkIsQ0FBVixDQUVBLEtBQUtsZixFQUFMLENBQVUsS0FBT3BULENBQWpCLENBQ0EsS0FBSzZvQixFQUFMLENBQVUsQ0FBRXVKLElBQU1GLEdBQVIsRUFBZ0JseUIsQ0FBMUIsQ0FDQSxLQUFLOG9CLEVBQUwsQ0FBVSxDQUFFaUosSUFBTUksR0FBUixFQUFnQm55QixDQUExQixDQUNBLEtBQUsrb0IsRUFBTCxDQUFVLENBQUVpSixJQUFNRixHQUFSLEVBQWdCOXhCLENBQTFCLENBRUEsQ0FURCxRQVNZNnhCLElBQU1JLEdBQU4sRUFBYUosSUFBTVEsR0FBeEIsQ0FBOEIsQ0FFcENyeUIsRUFBSSxJQUFNVixLQUFLdWtCLElBQUwsQ0FBVyxJQUFNZ08sR0FBTixDQUFZSSxHQUFaLENBQWtCSSxHQUE3QixDQUFWLENBRUEsS0FBS2pmLEVBQUwsQ0FBVSxDQUFFZ2YsSUFBTUYsR0FBUixFQUFnQmx5QixDQUExQixDQUNBLEtBQUs2b0IsRUFBTCxDQUFVLEtBQU83b0IsQ0FBakIsQ0FDQSxLQUFLOG9CLEVBQUwsQ0FBVSxDQUFFZ0osSUFBTUUsR0FBUixFQUFnQmh5QixDQUExQixDQUNBLEtBQUsrb0IsRUFBTCxDQUFVLENBQUVnSixJQUFNSSxHQUFSLEVBQWdCbnlCLENBQTFCLENBRUEsQ0FUTSxRQVNLaXlCLElBQU1JLEdBQVgsQ0FBaUIsQ0FFdkJyeUIsRUFBSSxJQUFNVixLQUFLdWtCLElBQUwsQ0FBVyxJQUFNb08sR0FBTixDQUFZSixHQUFaLENBQWtCUSxHQUE3QixDQUFWLENBRUEsS0FBS2pmLEVBQUwsQ0FBVSxDQUFFMmUsSUFBTUksR0FBUixFQUFnQm55QixDQUExQixDQUNBLEtBQUs2b0IsRUFBTCxDQUFVLENBQUVpSixJQUFNRSxHQUFSLEVBQWdCaHlCLENBQTFCLENBQ0EsS0FBSzhvQixFQUFMLENBQVUsS0FBTzlvQixDQUFqQixDQUNBLEtBQUsrb0IsRUFBTCxDQUFVLENBQUVtSixJQUFNRSxHQUFSLEVBQWdCcHlCLENBQTFCLENBRUEsQ0FUTSxJQVNBLENBRU5BLEVBQUksSUFBTVYsS0FBS3VrQixJQUFMLENBQVcsSUFBTXdPLEdBQU4sQ0FBWVIsR0FBWixDQUFrQkksR0FBN0IsQ0FBVixDQUVBLEtBQUs3ZSxFQUFMLENBQVUsQ0FBRTRlLElBQU1GLEdBQVIsRUFBZ0I5eEIsQ0FBMUIsQ0FDQSxLQUFLNm9CLEVBQUwsQ0FBVSxDQUFFa0osSUFBTUksR0FBUixFQUFnQm55QixDQUExQixDQUNBLEtBQUs4b0IsRUFBTCxDQUFVLENBQUVvSixJQUFNRSxHQUFSLEVBQWdCcHlCLENBQTFCLENBQ0EsS0FBSytvQixFQUFMLENBQVUsS0FBTy9vQixDQUFqQixDQUVBLENBRUQsS0FBS2t4QixnQkFBTCxHQUVBLFdBQUEsQ0FFQSxDQXpMbUMsQ0EyTHBDcUIsbUJBQW9CLFVBQVk7RUFJL0IsT0FBUyxXQUFBLEVBQVQsQ0FDQSxLQUFBLENBRUEsUUFBVSxRQUFWLENBRUEsa0NBQU8sQ0FBNkJDLEtBQTdCLENBQW9DQyxHQUFwQyxDQUEwQyxDQUVoRCxHQUFLOU4sS0FBTzVvQixTQUFaLENBQXdCNG9CLEdBQUssV0FBQSxFQUFMLENBRXhCelEsRUFBSXNlLE1BQU03TyxHQUFOLENBQVc4TyxHQUFYLEVBQW1CLENBQXZCLENBRUEsR0FBS3ZlLEVBQUl3ZSxHQUFULENBQWUsQ0FFZHhlLEVBQUksQ0FBSixDQUVBLEdBQUs1VSxLQUFLeWtCLEdBQUwsQ0FBVXlPLE1BQU14aUIsQ0FBaEIsRUFBc0IxUSxLQUFLeWtCLEdBQUwsQ0FBVXlPLE1BQU1uTCxDQUFoQixDQUEzQixDQUFpRCxDQUVoRDFDLEdBQUc1VyxHQUFILENBQVEsQ0FBRXlrQixNQUFNaFMsQ0FBaEIsQ0FBbUJnUyxNQUFNeGlCLENBQXpCLENBQTRCLENBQTVCLEVBRUEsQ0FKRCxJQUlPLENBRU4yVSxHQUFHNVcsR0FBSCxDQUFRLENBQVIsQ0FBVyxDQUFFeWtCLE1BQU1uTCxDQUFuQixDQUFzQm1MLE1BQU1oUyxDQUE1QixFQUVBLENBRUQsQ0FkRCxJQWNPLENBRU5tRSxHQUFHb0YsWUFBSCxDQUFpQnlJLEtBQWpCLENBQXdCQyxHQUF4QixFQUVBLENBRUQsS0FBSzVKLEVBQUwsQ0FBVWxFLEdBQUczVSxDQUFiLENBQ0EsS0FBSzhZLEVBQUwsQ0FBVW5FLEdBQUduRSxDQUFiLENBQ0EsS0FBS3VJLEVBQUwsQ0FBVXBFLEdBQUcwQyxDQUFiLENBQ0EsS0FBS2pVLEVBQUwsQ0FBVWMsQ0FBVixDQUVBLFlBQVk4UCxTQUFMLEVBQVAsQ0FFQSxDQWpDRCxDQW1DQSxDQTVDbUIsRUEzTGdCLENBeU9wQzJPLFFBQVMsVUFBWTtFQUlwQixZQUFZQyxTQUFMLEVBQVAsQ0FFQSxDQS9PbUMsQ0FpUHBDQSxVQUFXLFVBQVksQ0FFdEIsS0FBSy9KLEVBQUwsRUFBVyxDQUFFLENBQWIsQ0FDQSxLQUFLQyxFQUFMLEVBQVcsQ0FBRSxDQUFiLENBQ0EsS0FBS0MsRUFBTCxFQUFXLENBQUUsQ0FBYixDQUVBLEtBQUttSSxnQkFBTCxHQUVBLFdBQUEsQ0FFQSxDQTNQbUMsQ0E2UHBDdk4sSUFBSyxTQUFXN1QsQ0FBWCxDQUFlLENBRW5CLFlBQVkrWSxFQUFMLENBQVUvWSxFQUFFK1ksRUFBWixDQUFpQixLQUFLQyxFQUFMLENBQVVoWixFQUFFZ1osRUFBN0IsQ0FBa0MsS0FBS0MsRUFBTCxDQUFValosRUFBRWlaLEVBQTlDLENBQW1ELEtBQUszVixFQUFMLENBQVV0RCxFQUFFc0QsRUFBdEUsQ0FFQSxDQWpRbUMsQ0FtUXBDd1EsU0FBVSxVQUFZLENBRXJCLFlBQVlpRixFQUFMLENBQVUsS0FBS0EsRUFBZixDQUFvQixLQUFLQyxFQUFMLENBQVUsS0FBS0EsRUFBbkMsQ0FBd0MsS0FBS0MsRUFBTCxDQUFVLEtBQUtBLEVBQXZELENBQTRELEtBQUszVixFQUFMLENBQVUsS0FBS0EsRUFBbEYsQ0FFQSxDQXZRbUMsQ0F5UXBDaFcsT0FBUSxVQUFZLENBRW5CLFlBQVl5bUIsSUFBTCxDQUFXLEtBQUtnRixFQUFMLENBQVUsS0FBS0EsRUFBZixDQUFvQixLQUFLQyxFQUFMLENBQVUsS0FBS0EsRUFBbkMsQ0FBd0MsS0FBS0MsRUFBTCxDQUFVLEtBQUtBLEVBQXZELENBQTRELEtBQUszVixFQUFMLENBQVUsS0FBS0EsRUFBdEYsQ0FBUCxDQUVBLENBN1FtQyxDQStRcEM0USxVQUFXLFVBQVksQ0FFdEIsTUFBUSxLQUFLNW1CLE1BQUwsRUFBUixDQUVBLEdBQUs4QyxJQUFNLENBQVgsQ0FBZSxDQUVkLEtBQUsyb0IsRUFBTCxDQUFVLENBQVYsQ0FDQSxLQUFLQyxFQUFMLENBQVUsQ0FBVixDQUNBLEtBQUtDLEVBQUwsQ0FBVSxDQUFWLENBQ0EsS0FBSzNWLEVBQUwsQ0FBVSxDQUFWLENBRUEsQ0FQRCxJQU9PLENBRU5sVCxFQUFJLEVBQUlBLENBQVIsQ0FFQSxLQUFLMm9CLEVBQUwsQ0FBVSxLQUFLQSxFQUFMLENBQVUzb0IsQ0FBcEIsQ0FDQSxLQUFLNG9CLEVBQUwsQ0FBVSxLQUFLQSxFQUFMLENBQVU1b0IsQ0FBcEIsQ0FDQSxLQUFLNm9CLEVBQUwsQ0FBVSxLQUFLQSxFQUFMLENBQVU3b0IsQ0FBcEIsQ0FDQSxLQUFLa1QsRUFBTCxDQUFVLEtBQUtBLEVBQUwsQ0FBVWxULENBQXBCLENBRUEsQ0FFRCxLQUFLZ3hCLGdCQUFMLEdBRUEsV0FBQSxDQUVBLENBelNtQyxDQTJTcENwTyxTQUFVLFNBQVc4RixDQUFYLENBQWN0TixDQUFkLENBQWtCLENBRTNCLEdBQUtBLElBQU12ZixTQUFYLENBQXVCLENBRXRCMlcsUUFBUTZQLElBQVIsQ0FBYyx3R0FBZCxFQUNBLFlBQVlzUSxtQkFBTCxDQUEwQmpLLENBQTFCLENBQTZCdE4sQ0FBN0IsQ0FBUCxDQUVBLENBRUQsWUFBWXVYLG1CQUFMLENBQTBCLElBQTFCLENBQWdDakssQ0FBaEMsQ0FBUCxDQUVBLENBdFRtQyxDQXdUcENxQixZQUFhLFNBQVdyQixDQUFYLENBQWUsQ0FFM0IsWUFBWWlLLG1CQUFMLENBQTBCakssQ0FBMUIsQ0FBNkIsSUFBN0IsQ0FBUCxDQUVBLENBNVRtQyxDQThUcENpSyxvQkFBcUIsU0FBVzF5QixDQUFYLENBQWNGLENBQWQsQ0FBa0I7RUFJdEMsUUFBVUUsRUFBRTBvQixFQUFaLENBQWdCaUssSUFBTTN5QixFQUFFMm9CLEVBQXhCLENBQTRCaUssSUFBTTV5QixFQUFFNG9CLEVBQXBDLENBQXdDaUssSUFBTTd5QixFQUFFaVQsRUFBaEQsQ0FDQSxRQUFVblQsRUFBRTRvQixFQUFaLENBQWdCb0ssSUFBTWh6QixFQUFFNm9CLEVBQXhCLENBQTRCb0ssSUFBTWp6QixFQUFFOG9CLEVBQXBDLENBQXdDb0ssSUFBTWx6QixFQUFFbVQsRUFBaEQsQ0FFQSxLQUFLeVYsRUFBTCxDQUFVdUssSUFBTUQsR0FBTixDQUFZSCxJQUFNSyxHQUFsQixDQUF3QlAsSUFBTUksR0FBOUIsQ0FBb0NILElBQU1FLEdBQXBELENBQ0EsS0FBS25LLEVBQUwsQ0FBVWdLLElBQU1LLEdBQU4sQ0FBWUgsSUFBTUMsR0FBbEIsQ0FBd0JGLElBQU1NLEdBQTlCLENBQW9DRCxJQUFNRixHQUFwRCxDQUNBLEtBQUtuSyxFQUFMLENBQVVnSyxJQUFNSSxHQUFOLENBQVlILElBQU1FLEdBQWxCLENBQXdCRSxJQUFNSCxHQUE5QixDQUFvQ0gsSUFBTU8sR0FBcEQsQ0FDQSxLQUFLamdCLEVBQUwsQ0FBVTRmLElBQU1HLEdBQU4sQ0FBWUMsSUFBTUMsR0FBbEIsQ0FBd0JQLElBQU1HLEdBQTlCLENBQW9DRixJQUFNRyxHQUFwRCxDQUVBLEtBQUtoQyxnQkFBTCxHQUVBLFdBQUEsQ0FFQSxDQTlVbUMsQ0FnVnBDdkIsTUFBTyxTQUFXRSxFQUFYLENBQWVwUCxDQUFmLENBQW1CLENBRXpCLEdBQUtBLElBQU0sQ0FBWCxDQUFlLFdBQUEsQ0FDZixHQUFLQSxJQUFNLENBQVgsQ0FBZSxZQUFZNEIsSUFBTCxDQUFXd04sRUFBWCxDQUFQLENBRWYsTUFBUSxLQUFLaEgsRUFBYixDQUFpQnJJLEVBQUksS0FBS3NJLEVBQTFCLENBQThCekIsRUFBSSxLQUFLMEIsRUFBdkMsQ0FBMkNoVCxFQUFJLEtBQUszQyxFQUFwRCxDQUVBO0VBRUEsaUJBQW1CMkMsRUFBSThaLEdBQUd6YyxFQUFQLENBQVlwRCxFQUFJNmYsR0FBR2hILEVBQW5CLENBQXdCckksRUFBSXFQLEdBQUcvRyxFQUEvQixDQUFvQ3pCLEVBQUl3SSxHQUFHOUcsRUFBOUQsQ0FFQSxHQUFLdUssYUFBZSxDQUFwQixDQUF3QixDQUV2QixLQUFLbGdCLEVBQUwsQ0FBVSxDQUFFeWMsR0FBR3pjLEVBQWYsQ0FDQSxLQUFLeVYsRUFBTCxDQUFVLENBQUVnSCxHQUFHaEgsRUFBZixDQUNBLEtBQUtDLEVBQUwsQ0FBVSxDQUFFK0csR0FBRy9HLEVBQWYsQ0FDQSxLQUFLQyxFQUFMLENBQVUsQ0FBRThHLEdBQUc5RyxFQUFmLENBRUF1SyxhQUFlLENBQUVBLFlBQWpCLENBRUEsQ0FURCxJQVNPLENBRU4sS0FBS2pSLElBQUwsQ0FBV3dOLEVBQVgsRUFFQSxDQUVELEdBQUt5RCxjQUFnQixHQUFyQixDQUEyQixDQUUxQixLQUFLbGdCLEVBQUwsQ0FBVTJDLENBQVYsQ0FDQSxLQUFLOFMsRUFBTCxDQUFVN1ksQ0FBVixDQUNBLEtBQUs4WSxFQUFMLENBQVV0SSxDQUFWLENBQ0EsS0FBS3VJLEVBQUwsQ0FBVTFCLENBQVYsQ0FFQSxXQUFBLENBRUEsQ0FFRCxpQkFBbUIvbkIsS0FBS3VrQixJQUFMLENBQVcsSUFBTXlQLGFBQWVBLFlBQWhDLENBQW5CLENBRUEsR0FBS2gwQixLQUFLeWtCLEdBQUwsQ0FBVXdQLFlBQVYsRUFBMkIsS0FBaEMsQ0FBd0MsQ0FFdkMsS0FBS25nQixFQUFMLENBQVUsS0FBUTJDLEVBQUksS0FBSzNDLEVBQWpCLENBQVYsQ0FDQSxLQUFLeVYsRUFBTCxDQUFVLEtBQVE3WSxFQUFJLEtBQUs2WSxFQUFqQixDQUFWLENBQ0EsS0FBS0MsRUFBTCxDQUFVLEtBQVF0SSxFQUFJLEtBQUtzSSxFQUFqQixDQUFWLENBQ0EsS0FBS0MsRUFBTCxDQUFVLEtBQVExQixFQUFJLEtBQUswQixFQUFqQixDQUFWLENBRUEsV0FBQSxDQUVBLENBRUQsY0FBZ0J6cEIsS0FBSzRrQixLQUFMLENBQVlxUCxZQUFaLENBQTBCRCxZQUExQixDQUFoQixDQUNBLFdBQWFoMEIsS0FBS2ttQixHQUFMLENBQVUsQ0FBRSxFQUFJL0UsQ0FBTixFQUFZK1MsU0FBdEIsRUFBb0NELFlBQWpELENBQ0NFLE9BQVNuMEIsS0FBS2ttQixHQUFMLENBQVUvRSxFQUFJK1MsU0FBZCxFQUE0QkQsWUFEdEMsQ0FHQSxLQUFLbmdCLEVBQUwsQ0FBWTJDLEVBQUkyZCxNQUFKLENBQWEsS0FBS3RnQixFQUFMLENBQVVxZ0IsTUFBbkMsQ0FDQSxLQUFLNUssRUFBTCxDQUFZN1ksRUFBSTBqQixNQUFKLENBQWEsS0FBSzdLLEVBQUwsQ0FBVTRLLE1BQW5DLENBQ0EsS0FBSzNLLEVBQUwsQ0FBWXRJLEVBQUlrVCxNQUFKLENBQWEsS0FBSzVLLEVBQUwsQ0FBVTJLLE1BQW5DLENBQ0EsS0FBSzFLLEVBQUwsQ0FBWTFCLEVBQUlxTSxNQUFKLENBQWEsS0FBSzNLLEVBQUwsQ0FBVTBLLE1BQW5DLENBRUEsS0FBS3ZDLGdCQUFMLEdBRUEsV0FBQSxDQUVBLENBL1ltQyxDQWlacENyTSxPQUFRLFNBQVd5SixVQUFYLENBQXdCLENBRS9CLGtCQUFvQnpGLEVBQVgsR0FBa0IsS0FBS0EsRUFBekIsRUFBbUN5RixXQUFXeEYsRUFBWCxHQUFrQixLQUFLQSxFQUExRCxFQUFvRXdGLFdBQVd2RixFQUFYLEdBQWtCLEtBQUtBLEVBQTNGLEVBQXFHdUYsV0FBV2xiLEVBQVgsR0FBa0IsS0FBS0EsRUFBbkksQ0FFQSxDQXJabUMsQ0F1WnBDMFIsVUFBVyxTQUFXdEgsS0FBWCxDQUFrQnVILE1BQWxCLENBQTJCLENBRXJDLEdBQUtBLFNBQVdocEIsU0FBaEIsQ0FBNEJncEIsT0FBUyxDQUFULENBRTVCLEtBQUs4RCxFQUFMLENBQVVyTCxNQUFPdUgsTUFBUCxDQUFWLENBQ0EsS0FBSytELEVBQUwsQ0FBVXRMLE1BQU91SCxPQUFTLENBQWhCLENBQVYsQ0FDQSxLQUFLZ0UsRUFBTCxDQUFVdkwsTUFBT3VILE9BQVMsQ0FBaEIsQ0FBVixDQUNBLEtBQUszUixFQUFMLENBQVVvSyxNQUFPdUgsT0FBUyxDQUFoQixDQUFWLENBRUEsS0FBS21NLGdCQUFMLEdBRUEsV0FBQSxDQUVBLENBcGFtQyxDQXNhcENsTSxRQUFTLFNBQVd4SCxLQUFYLENBQWtCdUgsTUFBbEIsQ0FBMkIsQ0FFbkMsR0FBS3ZILFFBQVV6aEIsU0FBZixDQUEyQnloQixNQUFRLEVBQVIsQ0FDM0IsR0FBS3VILFNBQVdocEIsU0FBaEIsQ0FBNEJncEIsT0FBUyxDQUFULENBRTVCdkgsTUFBT3VILE1BQVAsRUFBa0IsS0FBSzhELEVBQXZCLENBQ0FyTCxNQUFPdUgsT0FBUyxDQUFoQixFQUFzQixLQUFLK0QsRUFBM0IsQ0FDQXRMLE1BQU91SCxPQUFTLENBQWhCLEVBQXNCLEtBQUtnRSxFQUEzQixDQUNBdkwsTUFBT3VILE9BQVMsQ0FBaEIsRUFBc0IsS0FBSzNSLEVBQTNCLENBRUEsWUFBQSxDQUVBLENBbGJtQyxDQW9icEN1Z0IsU0FBVSxTQUFXQyxRQUFYLENBQXNCLENBRS9CLEtBQUsxQyxnQkFBTCxDQUF3QjBDLFFBQXhCLENBRUEsV0FBQSxDQUVBLENBMWJtQyxDQTRicEMxQyxpQkFBa0IsVUFBWSxFQTViTSxDQUFyQyxFQWdjQTs7Ozs7OztLQVNBLGdCQUFBLENBQWtCbGhCLENBQWxCLENBQXFCd1EsQ0FBckIsQ0FBd0I2RyxDQUF4QixDQUE0QixDQUUzQixLQUFLclgsQ0FBTCxDQUFTQSxHQUFLLENBQWQsQ0FDQSxLQUFLd1EsQ0FBTCxDQUFTQSxHQUFLLENBQWQsQ0FDQSxLQUFLNkcsQ0FBTCxDQUFTQSxHQUFLLENBQWQsQ0FFQSxDQUVEM3dCLE9BQU80bkIsTUFBUCxDQUFldVYsUUFBUWw5QixTQUF2QixDQUFrQyxDQUVqQ205QixVQUFXLElBRnNCLENBSWpDL2xCLElBQUssU0FBV2lDLENBQVgsQ0FBY3dRLENBQWQsQ0FBaUI2RyxDQUFqQixDQUFxQixDQUV6QixLQUFLclgsQ0FBTCxDQUFTQSxDQUFULENBQ0EsS0FBS3dRLENBQUwsQ0FBU0EsQ0FBVCxDQUNBLEtBQUs2RyxDQUFMLENBQVNBLENBQVQsQ0FFQSxXQUFBLENBRUEsQ0FaZ0MsQ0FjakN2RixVQUFXLFNBQVdDLE1BQVgsQ0FBb0IsQ0FFOUIsS0FBSy9SLENBQUwsQ0FBUytSLE1BQVQsQ0FDQSxLQUFLdkIsQ0FBTCxDQUFTdUIsTUFBVCxDQUNBLEtBQUtzRixDQUFMLENBQVN0RixNQUFULENBRUEsV0FBQSxDQUVBLENBdEJnQyxDQXdCakNDLEtBQU0sU0FBV2hTLENBQVgsQ0FBZSxDQUVwQixLQUFLQSxDQUFMLENBQVNBLENBQVQsQ0FFQSxXQUFBLENBRUEsQ0E5QmdDLENBZ0NqQ2lTLEtBQU0sU0FBV3pCLENBQVgsQ0FBZSxDQUVwQixLQUFLQSxDQUFMLENBQVNBLENBQVQsQ0FFQSxXQUFBLENBRUEsQ0F0Q2dDLENBd0NqQ3VULEtBQU0sU0FBVzFNLENBQVgsQ0FBZSxDQUVwQixLQUFLQSxDQUFMLENBQVNBLENBQVQsQ0FFQSxXQUFBLENBRUEsQ0E5Q2dDLENBZ0RqQ25GLGFBQWMsU0FBVzdkLEtBQVgsQ0FBa0JqSyxLQUFsQixDQUEwQixDQUV2QyxPQUFTaUssS0FBVCxFQUVDLE1BQUEsQ0FBUSxLQUFLMkwsQ0FBTCxDQUFTNVYsS0FBVCxDQUFnQixNQUN4QixNQUFBLENBQVEsS0FBS29tQixDQUFMLENBQVNwbUIsS0FBVCxDQUFnQixNQUN4QixNQUFBLENBQVEsS0FBS2l0QixDQUFMLENBQVNqdEIsS0FBVCxDQUFnQixNQUN4QixRQUFTLGVBQU0sQ0FBVywwQkFBNEJpSyxLQUF2QyxDQUFOLENBTFYsQ0FTQSxXQUFBLENBRUEsQ0E3RGdDLENBK0RqQzhkLGFBQWMsU0FBVzlkLEtBQVgsQ0FBbUIsQ0FFaEMsT0FBU0EsS0FBVCxFQUVDLE1BQUEsQ0FBUSxZQUFZMkwsQ0FBWixDQUNSLE1BQUEsQ0FBUSxZQUFZd1EsQ0FBWixDQUNSLE1BQUEsQ0FBUSxZQUFZNkcsQ0FBWixDQUNSLFFBQVMsZUFBTSxDQUFXLDBCQUE0QmhqQixLQUF2QyxDQUFOLENBTFYsQ0FTQSxDQTFFZ0MsQ0E0RWpDK2QsTUFBTyxVQUFZLENBRWxCLGdCQUFnQm5wQixXQUFULENBQXNCLEtBQUsrVyxDQUEzQixDQUE4QixLQUFLd1EsQ0FBbkMsQ0FBc0MsS0FBSzZHLENBQTNDLENBQVAsQ0FFQSxDQWhGZ0MsQ0FrRmpDaEYsS0FBTSxTQUFXdlMsQ0FBWCxDQUFlLENBRXBCLEtBQUtFLENBQUwsQ0FBU0YsRUFBRUUsQ0FBWCxDQUNBLEtBQUt3USxDQUFMLENBQVMxUSxFQUFFMFEsQ0FBWCxDQUNBLEtBQUs2RyxDQUFMLENBQVN2WCxFQUFFdVgsQ0FBWCxDQUVBLFdBQUEsQ0FFQSxDQTFGZ0MsQ0E0RmpDL0UsSUFBSyxTQUFXeFMsQ0FBWCxDQUFjaUcsQ0FBZCxDQUFrQixDQUV0QixHQUFLQSxJQUFNaGEsU0FBWCxDQUF1QixDQUV0QjJXLFFBQVE2UCxJQUFSLENBQWMsdUZBQWQsRUFDQSxZQUFZQyxVQUFMLENBQWlCMVMsQ0FBakIsQ0FBb0JpRyxDQUFwQixDQUFQLENBRUEsQ0FFRCxLQUFLL0YsQ0FBTCxFQUFVRixFQUFFRSxDQUFaLENBQ0EsS0FBS3dRLENBQUwsRUFBVTFRLEVBQUUwUSxDQUFaLENBQ0EsS0FBSzZHLENBQUwsRUFBVXZYLEVBQUV1WCxDQUFaLENBRUEsV0FBQSxDQUVBLENBM0dnQyxDQTZHakM1RSxVQUFXLFNBQVd6aUIsQ0FBWCxDQUFlLENBRXpCLEtBQUtnUSxDQUFMLEVBQVVoUSxDQUFWLENBQ0EsS0FBS3dnQixDQUFMLEVBQVV4Z0IsQ0FBVixDQUNBLEtBQUtxbkIsQ0FBTCxFQUFVcm5CLENBQVYsQ0FFQSxXQUFBLENBRUEsQ0FySGdDLENBdUhqQ3dpQixXQUFZLFNBQVdyaUIsQ0FBWCxDQUFjRixDQUFkLENBQWtCLENBRTdCLEtBQUsrUCxDQUFMLENBQVM3UCxFQUFFNlAsQ0FBRixDQUFNL1AsRUFBRStQLENBQWpCLENBQ0EsS0FBS3dRLENBQUwsQ0FBU3JnQixFQUFFcWdCLENBQUYsQ0FBTXZnQixFQUFFdWdCLENBQWpCLENBQ0EsS0FBSzZHLENBQUwsQ0FBU2xuQixFQUFFa25CLENBQUYsQ0FBTXBuQixFQUFFb25CLENBQWpCLENBRUEsV0FBQSxDQUVBLENBL0hnQyxDQWlJakMzRSxnQkFBaUIsU0FBVzVTLENBQVgsQ0FBYzlQLENBQWQsQ0FBa0IsQ0FFbEMsS0FBS2dRLENBQUwsRUFBVUYsRUFBRUUsQ0FBRixDQUFNaFEsQ0FBaEIsQ0FDQSxLQUFLd2dCLENBQUwsRUFBVTFRLEVBQUUwUSxDQUFGLENBQU14Z0IsQ0FBaEIsQ0FDQSxLQUFLcW5CLENBQUwsRUFBVXZYLEVBQUV1WCxDQUFGLENBQU1ybkIsQ0FBaEIsQ0FFQSxXQUFBLENBRUEsQ0F6SWdDLENBMklqQzJpQixJQUFLLFNBQVc3UyxDQUFYLENBQWNpRyxDQUFkLENBQWtCLENBRXRCLEdBQUtBLElBQU1oYSxTQUFYLENBQXVCLENBRXRCMlcsUUFBUTZQLElBQVIsQ0FBYyx1RkFBZCxFQUNBLFlBQVlLLFVBQUwsQ0FBaUI5UyxDQUFqQixDQUFvQmlHLENBQXBCLENBQVAsQ0FFQSxDQUVELEtBQUsvRixDQUFMLEVBQVVGLEVBQUVFLENBQVosQ0FDQSxLQUFLd1EsQ0FBTCxFQUFVMVEsRUFBRTBRLENBQVosQ0FDQSxLQUFLNkcsQ0FBTCxFQUFVdlgsRUFBRXVYLENBQVosQ0FFQSxXQUFBLENBRUEsQ0ExSmdDLENBNEpqQ3hFLFVBQVcsU0FBVzdpQixDQUFYLENBQWUsQ0FFekIsS0FBS2dRLENBQUwsRUFBVWhRLENBQVYsQ0FDQSxLQUFLd2dCLENBQUwsRUFBVXhnQixDQUFWLENBQ0EsS0FBS3FuQixDQUFMLEVBQVVybkIsQ0FBVixDQUVBLFdBQUEsQ0FFQSxDQXBLZ0MsQ0FzS2pDNGlCLFdBQVksU0FBV3ppQixDQUFYLENBQWNGLENBQWQsQ0FBa0IsQ0FFN0IsS0FBSytQLENBQUwsQ0FBUzdQLEVBQUU2UCxDQUFGLENBQU0vUCxFQUFFK1AsQ0FBakIsQ0FDQSxLQUFLd1EsQ0FBTCxDQUFTcmdCLEVBQUVxZ0IsQ0FBRixDQUFNdmdCLEVBQUV1Z0IsQ0FBakIsQ0FDQSxLQUFLNkcsQ0FBTCxDQUFTbG5CLEVBQUVrbkIsQ0FBRixDQUFNcG5CLEVBQUVvbkIsQ0FBakIsQ0FFQSxXQUFBLENBRUEsQ0E5S2dDLENBZ0xqQ3ZFLFNBQVUsU0FBV2hULENBQVgsQ0FBY2lHLENBQWQsQ0FBa0IsQ0FFM0IsR0FBS0EsSUFBTWhhLFNBQVgsQ0FBdUIsQ0FFdEIyVyxRQUFRNlAsSUFBUixDQUFjLGlHQUFkLEVBQ0EsWUFBWXlSLGVBQUwsQ0FBc0Jsa0IsQ0FBdEIsQ0FBeUJpRyxDQUF6QixDQUFQLENBRUEsQ0FFRCxLQUFLL0YsQ0FBTCxFQUFVRixFQUFFRSxDQUFaLENBQ0EsS0FBS3dRLENBQUwsRUFBVTFRLEVBQUUwUSxDQUFaLENBQ0EsS0FBSzZHLENBQUwsRUFBVXZYLEVBQUV1WCxDQUFaLENBRUEsV0FBQSxDQUVBLENBL0xnQyxDQWlNakN0RSxlQUFnQixTQUFXaEIsTUFBWCxDQUFvQixDQUVuQyxLQUFLL1IsQ0FBTCxFQUFVK1IsTUFBVixDQUNBLEtBQUt2QixDQUFMLEVBQVV1QixNQUFWLENBQ0EsS0FBS3NGLENBQUwsRUFBVXRGLE1BQVYsQ0FFQSxXQUFBLENBRUEsQ0F6TWdDLENBMk1qQ2lTLGdCQUFpQixTQUFXN3pCLENBQVgsQ0FBY0YsQ0FBZCxDQUFrQixDQUVsQyxLQUFLK1AsQ0FBTCxDQUFTN1AsRUFBRTZQLENBQUYsQ0FBTS9QLEVBQUUrUCxDQUFqQixDQUNBLEtBQUt3USxDQUFMLENBQVNyZ0IsRUFBRXFnQixDQUFGLENBQU12Z0IsRUFBRXVnQixDQUFqQixDQUNBLEtBQUs2RyxDQUFMLENBQVNsbkIsRUFBRWtuQixDQUFGLENBQU1wbkIsRUFBRW9uQixDQUFqQixDQUVBLFdBQUEsQ0FFQSxDQW5OZ0MsQ0FxTmpDNE0sV0FBWSxVQUFZLENBRXZCLGVBQWlCLGNBQUEsRUFBakIsQ0FFQSwwQkFBTyxDQUFxQnRNLEtBQXJCLENBQTZCLENBRW5DLEdBQUssRUFBSUEsT0FBU0EsTUFBTUMsT0FBbkIsQ0FBTCxDQUFvQyxDQUVuQ2xWLFFBQVFNLEtBQVIsQ0FBZSw2RkFBZixFQUVBLENBRUQsWUFBWWtoQixlQUFMLENBQXNCNUYsV0FBVzZDLFlBQVgsQ0FBeUJ4SixLQUF6QixDQUF0QixDQUFQLENBRUEsQ0FWRCxDQVlBLENBaEJXLEVBck5xQixDQXVPakN3TSxlQUFnQixVQUFZLENBRTNCLGVBQWlCLGNBQUEsRUFBakIsQ0FFQSw4QkFBTyxDQUF5QnBHLElBQXpCLENBQStCOUosS0FBL0IsQ0FBdUMsQ0FFN0MsWUFBWWlRLGVBQUwsQ0FBc0I1RixXQUFXcUQsZ0JBQVgsQ0FBNkI1RCxJQUE3QixDQUFtQzlKLEtBQW5DLENBQXRCLENBQVAsQ0FFQSxDQUpELENBTUEsQ0FWZSxFQXZPaUIsQ0FtUGpDZixhQUFjLFNBQVdqRCxDQUFYLENBQWUsQ0FFNUIsTUFBUSxLQUFLalEsQ0FBYixDQUFnQndRLEVBQUksS0FBS0EsQ0FBekIsQ0FBNEI2RyxFQUFJLEtBQUtBLENBQXJDLENBQ0EsTUFBUXBILEVBQUVrRCxRQUFWLENBRUEsS0FBS25ULENBQUwsQ0FBUzVRLEVBQUcsQ0FBSCxFQUFTNFEsQ0FBVCxDQUFhNVEsRUFBRyxDQUFILEVBQVNvaEIsQ0FBdEIsQ0FBMEJwaEIsRUFBRyxDQUFILEVBQVNpb0IsQ0FBNUMsQ0FDQSxLQUFLN0csQ0FBTCxDQUFTcGhCLEVBQUcsQ0FBSCxFQUFTNFEsQ0FBVCxDQUFhNVEsRUFBRyxDQUFILEVBQVNvaEIsQ0FBdEIsQ0FBMEJwaEIsRUFBRyxDQUFILEVBQVNpb0IsQ0FBNUMsQ0FDQSxLQUFLQSxDQUFMLENBQVNqb0IsRUFBRyxDQUFILEVBQVM0USxDQUFULENBQWE1USxFQUFHLENBQUgsRUFBU29oQixDQUF0QixDQUEwQnBoQixFQUFHLENBQUgsRUFBU2lvQixDQUE1QyxDQUVBLFdBQUEsQ0FFQSxDQTlQZ0MsQ0FnUWpDZ0YsYUFBYyxTQUFXcE0sQ0FBWCxDQUFlLENBRTVCLE1BQVEsS0FBS2pRLENBQWIsQ0FBZ0J3USxFQUFJLEtBQUtBLENBQXpCLENBQTRCNkcsRUFBSSxLQUFLQSxDQUFyQyxDQUNBLE1BQVFwSCxFQUFFa0QsUUFBVixDQUVBLE1BQVEsR0FBTS9qQixFQUFHLENBQUgsRUFBUzRRLENBQVQsQ0FBYTVRLEVBQUcsQ0FBSCxFQUFTb2hCLENBQXRCLENBQTBCcGhCLEVBQUcsRUFBSCxFQUFVaW9CLENBQXBDLENBQXdDam9CLEVBQUcsRUFBSCxDQUE5QyxDQUFSLENBRUEsS0FBSzRRLENBQUwsQ0FBUyxDQUFFNVEsRUFBRyxDQUFILEVBQVM0USxDQUFULENBQWE1USxFQUFHLENBQUgsRUFBU29oQixDQUF0QixDQUEwQnBoQixFQUFHLENBQUgsRUFBU2lvQixDQUFuQyxDQUF1Q2pvQixFQUFHLEVBQUgsQ0FBekMsRUFBcUQyVyxDQUE5RCxDQUNBLEtBQUt5SyxDQUFMLENBQVMsQ0FBRXBoQixFQUFHLENBQUgsRUFBUzRRLENBQVQsQ0FBYTVRLEVBQUcsQ0FBSCxFQUFTb2hCLENBQXRCLENBQTBCcGhCLEVBQUcsQ0FBSCxFQUFTaW9CLENBQW5DLENBQXVDam9CLEVBQUcsRUFBSCxDQUF6QyxFQUFxRDJXLENBQTlELENBQ0EsS0FBS3NSLENBQUwsQ0FBUyxDQUFFam9CLEVBQUcsQ0FBSCxFQUFTNFEsQ0FBVCxDQUFhNVEsRUFBRyxDQUFILEVBQVNvaEIsQ0FBdEIsQ0FBMEJwaEIsRUFBRyxFQUFILEVBQVVpb0IsQ0FBcEMsQ0FBd0Nqb0IsRUFBRyxFQUFILENBQTFDLEVBQXNEMlcsQ0FBL0QsQ0FFQSxXQUFBLENBRUEsQ0E3UWdDLENBK1FqQ21lLGdCQUFpQixTQUFXdEwsQ0FBWCxDQUFlLENBRS9CLE1BQVEsS0FBSzVZLENBQWIsQ0FBZ0J3USxFQUFJLEtBQUtBLENBQXpCLENBQTRCNkcsRUFBSSxLQUFLQSxDQUFyQyxDQUNBLE9BQVN1QixFQUFFNVksQ0FBWCxDQUFjb2tCLEdBQUt4TCxFQUFFcEksQ0FBckIsQ0FBd0I2VCxHQUFLekwsRUFBRXZCLENBQS9CLENBQWtDaU4sR0FBSzFMLEVBQUU3UyxDQUF6QyxDQUVBO0VBRUEsT0FBU3VlLEdBQUt0a0IsQ0FBTCxDQUFTb2tCLEdBQUsvTSxDQUFkLENBQWtCZ04sR0FBSzdULENBQWhDLENBQ0EsT0FBUzhULEdBQUs5VCxDQUFMLENBQVM2VCxHQUFLcmtCLENBQWQsQ0FBa0J1a0IsR0FBS2xOLENBQWhDLENBQ0EsT0FBU2lOLEdBQUtqTixDQUFMLENBQVNrTixHQUFLL1QsQ0FBZCxDQUFrQjRULEdBQUtwa0IsQ0FBaEMsQ0FDQSxPQUFTLENBQUV1a0IsRUFBRixDQUFPdmtCLENBQVAsQ0FBV29rQixHQUFLNVQsQ0FBaEIsQ0FBb0I2VCxHQUFLaE4sQ0FBbEMsQ0FFQTtFQUVBLEtBQUtyWCxDQUFMLENBQVN3a0IsR0FBS0YsRUFBTCxDQUFVRyxHQUFLLENBQUVGLEVBQWpCLENBQXNCRyxHQUFLLENBQUVMLEVBQTdCLENBQWtDTSxHQUFLLENBQUVQLEVBQWxELENBQ0EsS0FBSzVULENBQUwsQ0FBU2tVLEdBQUtKLEVBQUwsQ0FBVUcsR0FBSyxDQUFFTCxFQUFqQixDQUFzQk8sR0FBSyxDQUFFSixFQUE3QixDQUFrQ0MsR0FBSyxDQUFFSCxFQUFsRCxDQUNBLEtBQUtoTixDQUFMLENBQVNzTixHQUFLTCxFQUFMLENBQVVHLEdBQUssQ0FBRUosRUFBakIsQ0FBc0JHLEdBQUssQ0FBRUosRUFBN0IsQ0FBa0NNLEdBQUssQ0FBRUgsRUFBbEQsQ0FFQSxXQUFBLENBRUEsQ0FuU2dDLENBcVNqQ0ssUUFBUyxVQUFZLENBRXBCLFdBQWEsV0FBQSxFQUFiLENBRUEsdUJBQU8sQ0FBa0JDLE1BQWxCLENBQTJCLENBRWpDbkcsT0FBTzFFLGdCQUFQLENBQXlCNkssT0FBT0MsZ0JBQWhDLENBQWtEcEcsT0FBTy9CLFVBQVAsQ0FBbUJrSSxPQUFPRSxXQUExQixDQUFsRCxFQUNBLFlBQVkxSSxZQUFMLENBQW1CcUMsTUFBbkIsQ0FBUCxDQUVBLENBTEQsQ0FPQSxDQVhRLEVBclN3QixDQWtUakNzRyxVQUFXLFVBQVksQ0FFdEIsV0FBYSxXQUFBLEVBQWIsQ0FFQSx5QkFBTyxDQUFvQkgsTUFBcEIsQ0FBNkIsQ0FFbkNuRyxPQUFPMUUsZ0JBQVAsQ0FBeUI2SyxPQUFPRSxXQUFoQyxDQUE2Q3JHLE9BQU8vQixVQUFQLENBQW1Ca0ksT0FBT0MsZ0JBQTFCLENBQTdDLEVBQ0EsWUFBWXpJLFlBQUwsQ0FBbUJxQyxNQUFuQixDQUFQLENBRUEsQ0FMRCxDQU9BLENBWFUsRUFsVHNCLENBK1RqQ3VHLG1CQUFvQixTQUFXaFYsQ0FBWCxDQUFlO0VBR2xDO0VBRUEsTUFBUSxLQUFLalEsQ0FBYixDQUFnQndRLEVBQUksS0FBS0EsQ0FBekIsQ0FBNEI2RyxFQUFJLEtBQUtBLENBQXJDLENBQ0EsTUFBUXBILEVBQUVrRCxRQUFWLENBRUEsS0FBS25ULENBQUwsQ0FBUzVRLEVBQUcsQ0FBSCxFQUFTNFEsQ0FBVCxDQUFhNVEsRUFBRyxDQUFILEVBQVNvaEIsQ0FBdEIsQ0FBMEJwaEIsRUFBRyxDQUFILEVBQVNpb0IsQ0FBNUMsQ0FDQSxLQUFLN0csQ0FBTCxDQUFTcGhCLEVBQUcsQ0FBSCxFQUFTNFEsQ0FBVCxDQUFhNVEsRUFBRyxDQUFILEVBQVNvaEIsQ0FBdEIsQ0FBMEJwaEIsRUFBRyxDQUFILEVBQVNpb0IsQ0FBNUMsQ0FDQSxLQUFLQSxDQUFMLENBQVNqb0IsRUFBRyxDQUFILEVBQVM0USxDQUFULENBQWE1USxFQUFHLENBQUgsRUFBU29oQixDQUF0QixDQUEwQnBoQixFQUFHLEVBQUgsRUFBVWlvQixDQUE3QyxDQUVBLFlBQVlyRCxTQUFMLEVBQVAsQ0FFQSxDQTdVZ0MsQ0ErVWpDaEIsT0FBUSxTQUFXbFQsQ0FBWCxDQUFlLENBRXRCLEtBQUtFLENBQUwsRUFBVUYsRUFBRUUsQ0FBWixDQUNBLEtBQUt3USxDQUFMLEVBQVUxUSxFQUFFMFEsQ0FBWixDQUNBLEtBQUs2RyxDQUFMLEVBQVV2WCxFQUFFdVgsQ0FBWixDQUVBLFdBQUEsQ0FFQSxDQXZWZ0MsQ0F5VmpDcEUsYUFBYyxTQUFXbEIsTUFBWCxDQUFvQixDQUVqQyxZQUFZZ0IsY0FBTCxDQUFxQixFQUFJaEIsTUFBekIsQ0FBUCxDQUVBLENBN1ZnQyxDQStWakM1ZCxJQUFLLFNBQVcyTCxDQUFYLENBQWUsQ0FFbkIsS0FBS0UsQ0FBTCxDQUFTMVEsS0FBSzZFLEdBQUwsQ0FBVSxLQUFLNkwsQ0FBZixDQUFrQkYsRUFBRUUsQ0FBcEIsQ0FBVCxDQUNBLEtBQUt3USxDQUFMLENBQVNsaEIsS0FBSzZFLEdBQUwsQ0FBVSxLQUFLcWMsQ0FBZixDQUFrQjFRLEVBQUUwUSxDQUFwQixDQUFULENBQ0EsS0FBSzZHLENBQUwsQ0FBUy9uQixLQUFLNkUsR0FBTCxDQUFVLEtBQUtrakIsQ0FBZixDQUFrQnZYLEVBQUV1WCxDQUFwQixDQUFULENBRUEsV0FBQSxDQUVBLENBdldnQyxDQXlXakNqakIsSUFBSyxTQUFXMEwsQ0FBWCxDQUFlLENBRW5CLEtBQUtFLENBQUwsQ0FBUzFRLEtBQUs4RSxHQUFMLENBQVUsS0FBSzRMLENBQWYsQ0FBa0JGLEVBQUVFLENBQXBCLENBQVQsQ0FDQSxLQUFLd1EsQ0FBTCxDQUFTbGhCLEtBQUs4RSxHQUFMLENBQVUsS0FBS29jLENBQWYsQ0FBa0IxUSxFQUFFMFEsQ0FBcEIsQ0FBVCxDQUNBLEtBQUs2RyxDQUFMLENBQVMvbkIsS0FBSzhFLEdBQUwsQ0FBVSxLQUFLaWpCLENBQWYsQ0FBa0J2WCxFQUFFdVgsQ0FBcEIsQ0FBVCxDQUVBLFdBQUEsQ0FFQSxDQWpYZ0MsQ0FtWGpDdkgsTUFBTyxTQUFXM2IsR0FBWCxDQUFnQkMsR0FBaEIsQ0FBc0I7RUFJNUIsS0FBSzRMLENBQUwsQ0FBUzFRLEtBQUs4RSxHQUFMLENBQVVELElBQUk2TCxDQUFkLENBQWlCMVEsS0FBSzZFLEdBQUwsQ0FBVUMsSUFBSTRMLENBQWQsQ0FBaUIsS0FBS0EsQ0FBdEIsQ0FBakIsQ0FBVCxDQUNBLEtBQUt3USxDQUFMLENBQVNsaEIsS0FBSzhFLEdBQUwsQ0FBVUQsSUFBSXFjLENBQWQsQ0FBaUJsaEIsS0FBSzZFLEdBQUwsQ0FBVUMsSUFBSW9jLENBQWQsQ0FBaUIsS0FBS0EsQ0FBdEIsQ0FBakIsQ0FBVCxDQUNBLEtBQUs2RyxDQUFMLENBQVMvbkIsS0FBSzhFLEdBQUwsQ0FBVUQsSUFBSWtqQixDQUFkLENBQWlCL25CLEtBQUs2RSxHQUFMLENBQVVDLElBQUlpakIsQ0FBZCxDQUFpQixLQUFLQSxDQUF0QixDQUFqQixDQUFULENBRUEsV0FBQSxDQUVBLENBN1hnQyxDQStYakNqRSxZQUFhLFVBQVksQ0FFeEIsUUFBVSxXQUFBLEVBQVYsQ0FDQSxRQUFVLFdBQUEsRUFBVixDQUVBLDJCQUFPLENBQXNCQyxNQUF0QixDQUE4QkMsTUFBOUIsQ0FBdUMsQ0FFN0NuZixJQUFJNEosR0FBSixDQUFTc1YsTUFBVCxDQUFpQkEsTUFBakIsQ0FBeUJBLE1BQXpCLEVBQ0FqZixJQUFJMkosR0FBSixDQUFTdVYsTUFBVCxDQUFpQkEsTUFBakIsQ0FBeUJBLE1BQXpCLEVBRUEsWUFBWXhELEtBQUwsQ0FBWTNiLEdBQVosQ0FBaUJDLEdBQWpCLENBQVAsQ0FFQSxDQVBELENBU0EsQ0FkWSxFQS9Yb0IsQ0ErWWpDbWYsWUFBYSxTQUFXcGYsR0FBWCxDQUFnQkMsR0FBaEIsQ0FBc0IsQ0FFbEMsV0FBYSxLQUFLaEgsTUFBTCxFQUFiLENBRUEsWUFBWTZsQixZQUFMLENBQW1CN2xCLFFBQVUsQ0FBN0IsRUFBaUMybEIsY0FBakMsQ0FBaUR6akIsS0FBSzhFLEdBQUwsQ0FBVUQsR0FBVixDQUFlN0UsS0FBSzZFLEdBQUwsQ0FBVUMsR0FBVixDQUFlaEgsTUFBZixDQUFmLENBQWpELENBQVAsQ0FFQSxDQXJaZ0MsQ0F1WmpDb0MsTUFBTyxVQUFZLENBRWxCLEtBQUt3USxDQUFMLENBQVMxUSxLQUFLRSxLQUFMLENBQVksS0FBS3dRLENBQWpCLENBQVQsQ0FDQSxLQUFLd1EsQ0FBTCxDQUFTbGhCLEtBQUtFLEtBQUwsQ0FBWSxLQUFLZ2hCLENBQWpCLENBQVQsQ0FDQSxLQUFLNkcsQ0FBTCxDQUFTL25CLEtBQUtFLEtBQUwsQ0FBWSxLQUFLNm5CLENBQWpCLENBQVQsQ0FFQSxXQUFBLENBRUEsQ0EvWmdDLENBaWFqQzluQixLQUFNLFVBQVksQ0FFakIsS0FBS3lRLENBQUwsQ0FBUzFRLEtBQUtDLElBQUwsQ0FBVyxLQUFLeVEsQ0FBaEIsQ0FBVCxDQUNBLEtBQUt3USxDQUFMLENBQVNsaEIsS0FBS0MsSUFBTCxDQUFXLEtBQUtpaEIsQ0FBaEIsQ0FBVCxDQUNBLEtBQUs2RyxDQUFMLENBQVMvbkIsS0FBS0MsSUFBTCxDQUFXLEtBQUs4bkIsQ0FBaEIsQ0FBVCxDQUVBLFdBQUEsQ0FFQSxDQXphZ0MsQ0EyYWpDN0QsTUFBTyxVQUFZLENBRWxCLEtBQUt4VCxDQUFMLENBQVMxUSxLQUFLa2tCLEtBQUwsQ0FBWSxLQUFLeFQsQ0FBakIsQ0FBVCxDQUNBLEtBQUt3USxDQUFMLENBQVNsaEIsS0FBS2trQixLQUFMLENBQVksS0FBS2hELENBQWpCLENBQVQsQ0FDQSxLQUFLNkcsQ0FBTCxDQUFTL25CLEtBQUtra0IsS0FBTCxDQUFZLEtBQUs2RCxDQUFqQixDQUFULENBRUEsV0FBQSxDQUVBLENBbmJnQyxDQXFiakM1RCxZQUFhLFVBQVksQ0FFeEIsS0FBS3pULENBQUwsQ0FBVyxLQUFLQSxDQUFMLENBQVMsQ0FBWCxDQUFpQjFRLEtBQUtDLElBQUwsQ0FBVyxLQUFLeVEsQ0FBaEIsQ0FBakIsQ0FBdUMxUSxLQUFLRSxLQUFMLENBQVksS0FBS3dRLENBQWpCLENBQWhELENBQ0EsS0FBS3dRLENBQUwsQ0FBVyxLQUFLQSxDQUFMLENBQVMsQ0FBWCxDQUFpQmxoQixLQUFLQyxJQUFMLENBQVcsS0FBS2loQixDQUFoQixDQUFqQixDQUF1Q2xoQixLQUFLRSxLQUFMLENBQVksS0FBS2doQixDQUFqQixDQUFoRCxDQUNBLEtBQUs2RyxDQUFMLENBQVcsS0FBS0EsQ0FBTCxDQUFTLENBQVgsQ0FBaUIvbkIsS0FBS0MsSUFBTCxDQUFXLEtBQUs4bkIsQ0FBaEIsQ0FBakIsQ0FBdUMvbkIsS0FBS0UsS0FBTCxDQUFZLEtBQUs2bkIsQ0FBakIsQ0FBaEQsQ0FFQSxXQUFBLENBRUEsQ0E3YmdDLENBK2JqQzNELE9BQVEsVUFBWSxDQUVuQixLQUFLMVQsQ0FBTCxDQUFTLENBQUUsS0FBS0EsQ0FBaEIsQ0FDQSxLQUFLd1EsQ0FBTCxDQUFTLENBQUUsS0FBS0EsQ0FBaEIsQ0FDQSxLQUFLNkcsQ0FBTCxDQUFTLENBQUUsS0FBS0EsQ0FBaEIsQ0FFQSxXQUFBLENBRUEsQ0F2Y2dDLENBeWNqQzFELElBQUssU0FBVzdULENBQVgsQ0FBZSxDQUVuQixZQUFZRSxDQUFMLENBQVNGLEVBQUVFLENBQVgsQ0FBZSxLQUFLd1EsQ0FBTCxDQUFTMVEsRUFBRTBRLENBQTFCLENBQThCLEtBQUs2RyxDQUFMLENBQVN2WCxFQUFFdVgsQ0FBaEQsQ0FFQSxDQTdjZ0M7RUFpZGpDekQsU0FBVSxVQUFZLENBRXJCLFlBQVk1VCxDQUFMLENBQVMsS0FBS0EsQ0FBZCxDQUFrQixLQUFLd1EsQ0FBTCxDQUFTLEtBQUtBLENBQWhDLENBQW9DLEtBQUs2RyxDQUFMLENBQVMsS0FBS0EsQ0FBekQsQ0FFQSxDQXJkZ0MsQ0F1ZGpDanFCLE9BQVEsVUFBWSxDQUVuQixZQUFZeW1CLElBQUwsQ0FBVyxLQUFLN1QsQ0FBTCxDQUFTLEtBQUtBLENBQWQsQ0FBa0IsS0FBS3dRLENBQUwsQ0FBUyxLQUFLQSxDQUFoQyxDQUFvQyxLQUFLNkcsQ0FBTCxDQUFTLEtBQUtBLENBQTdELENBQVAsQ0FFQSxDQTNkZ0MsQ0E2ZGpDdkQsZ0JBQWlCLFVBQVksQ0FFNUIsWUFBWUMsR0FBTCxDQUFVLEtBQUsvVCxDQUFmLEVBQXFCMVEsS0FBS3lrQixHQUFMLENBQVUsS0FBS3ZELENBQWYsQ0FBckIsQ0FBMENsaEIsS0FBS3lrQixHQUFMLENBQVUsS0FBS3NELENBQWYsQ0FBakQsQ0FFQSxDQWplZ0MsQ0FtZWpDckQsVUFBVyxVQUFZLENBRXRCLFlBQVlmLFlBQUwsQ0FBbUIsS0FBSzdsQixNQUFMLElBQWlCLENBQXBDLENBQVAsQ0FFQSxDQXZlZ0MsQ0F5ZWpDb25CLFVBQVcsU0FBV3BuQixNQUFYLENBQW9CLENBRTlCLFlBQVk0bUIsU0FBTCxHQUFpQmpCLGNBQWpCLENBQWlDM2xCLE1BQWpDLENBQVAsQ0FFQSxDQTdlZ0MsQ0ErZWpDbWpCLEtBQU0sU0FBV3pRLENBQVgsQ0FBYzJVLEtBQWQsQ0FBc0IsQ0FFM0IsS0FBS3pVLENBQUwsRUFBVSxDQUFFRixFQUFFRSxDQUFGLENBQU0sS0FBS0EsQ0FBYixFQUFtQnlVLEtBQTdCLENBQ0EsS0FBS2pFLENBQUwsRUFBVSxDQUFFMVEsRUFBRTBRLENBQUYsQ0FBTSxLQUFLQSxDQUFiLEVBQW1CaUUsS0FBN0IsQ0FDQSxLQUFLNEMsQ0FBTCxFQUFVLENBQUV2WCxFQUFFdVgsQ0FBRixDQUFNLEtBQUtBLENBQWIsRUFBbUI1QyxLQUE3QixDQUVBLFdBQUEsQ0FFQSxDQXZmZ0MsQ0F5ZmpDQyxZQUFhLFNBQVdDLEVBQVgsQ0FBZUMsRUFBZixDQUFtQkgsS0FBbkIsQ0FBMkIsQ0FFdkMsWUFBWTdCLFVBQUwsQ0FBaUJnQyxFQUFqQixDQUFxQkQsRUFBckIsRUFBMEI1QixjQUExQixDQUEwQzBCLEtBQTFDLEVBQWtEbkMsR0FBbEQsQ0FBdURxQyxFQUF2RCxDQUFQLENBRUEsQ0E3ZmdDLENBK2ZqQ3VRLE1BQU8sU0FBV3BsQixDQUFYLENBQWNpRyxDQUFkLENBQWtCLENBRXhCLEdBQUtBLElBQU1oYSxTQUFYLENBQXVCLENBRXRCMlcsUUFBUTZQLElBQVIsQ0FBYywyRkFBZCxFQUNBLFlBQVl3SCxZQUFMLENBQW1CamEsQ0FBbkIsQ0FBc0JpRyxDQUF0QixDQUFQLENBRUEsQ0FFRCxZQUFZZ1UsWUFBTCxDQUFtQixJQUFuQixDQUF5QmphLENBQXpCLENBQVAsQ0FFQSxDQTFnQmdDLENBNGdCakNpYSxhQUFjLFNBQVc1cEIsQ0FBWCxDQUFjRixDQUFkLENBQWtCLENBRS9CLE9BQVNFLEVBQUU2UCxDQUFYLENBQWNtbEIsR0FBS2gxQixFQUFFcWdCLENBQXJCLENBQXdCNFUsR0FBS2oxQixFQUFFa25CLENBQS9CLENBQ0EsT0FBU3BuQixFQUFFK1AsQ0FBWCxDQUFjcWxCLEdBQUtwMUIsRUFBRXVnQixDQUFyQixDQUF3QjhVLEdBQUtyMUIsRUFBRW9uQixDQUEvQixDQUVBLEtBQUtyWCxDQUFMLENBQVNtbEIsR0FBS0csRUFBTCxDQUFVRixHQUFLQyxFQUF4QixDQUNBLEtBQUs3VSxDQUFMLENBQVM0VSxHQUFLRyxFQUFMLENBQVVDLEdBQUtGLEVBQXhCLENBQ0EsS0FBS2pPLENBQUwsQ0FBU21PLEdBQUtILEVBQUwsQ0FBVUYsR0FBS0ksRUFBeEIsQ0FFQSxXQUFBLENBRUEsQ0F2aEJnQyxDQXloQmpDRSxnQkFBaUIsU0FBV2pILE1BQVgsQ0FBb0IsQ0FFcEMsV0FBYUEsT0FBTzdLLEdBQVAsQ0FBWSxJQUFaLEVBQXFCNkssT0FBTzVLLFFBQVAsRUFBbEMsQ0FFQSxZQUFZdkIsSUFBTCxDQUFXbU0sTUFBWCxFQUFvQnpMLGNBQXBCLENBQW9DaEIsTUFBcEMsQ0FBUCxDQUVBLENBL2hCZ0MsQ0FpaUJqQzJULGVBQWdCLFVBQVksQ0FFM0IsT0FBUyxXQUFBLEVBQVQsQ0FFQSw4QkFBTyxDQUF5QkMsV0FBekIsQ0FBdUMsQ0FFN0NoUixHQUFHdEMsSUFBSCxDQUFTLElBQVQsRUFBZ0JvVCxlQUFoQixDQUFpQ0UsV0FBakMsRUFFQSxZQUFZaFQsR0FBTCxDQUFVZ0MsRUFBVixDQUFQLENBRUEsQ0FORCxDQVFBLENBWmUsRUFqaUJpQixDQStpQmpDaVIsUUFBUyxVQUFZO0VBR3BCO0VBRUEsT0FBUyxXQUFBLEVBQVQsQ0FFQSx1QkFBTyxDQUFrQkMsTUFBbEIsQ0FBMkIsQ0FFakMsWUFBWWxULEdBQUwsQ0FBVWdDLEdBQUd0QyxJQUFILENBQVN3VCxNQUFULEVBQWtCOVMsY0FBbEIsQ0FBa0MsRUFBSSxLQUFLWSxHQUFMLENBQVVrUyxNQUFWLENBQXRDLENBQVYsQ0FBUCxDQUVBLENBSkQsQ0FNQSxDQWJRLEVBL2lCd0IsQ0E4akJqQ0MsUUFBUyxTQUFXaG1CLENBQVgsQ0FBZSxDQUV2QixVQUFZLEtBQUs2VCxHQUFMLENBQVU3VCxDQUFWLEVBQWtCeFEsS0FBS3VrQixJQUFMLENBQVcsS0FBS0QsUUFBTCxHQUFrQjlULEVBQUU4VCxRQUFGLEVBQTdCLENBQTlCLENBRUE7RUFFQSxZQUFZbVMsSUFBTCxDQUFXM1UsTUFBTXRCLEtBQU4sQ0FBYTZOLEtBQWIsQ0FBb0IsQ0FBRSxDQUF0QixDQUF5QixDQUF6QixDQUFYLENBQVAsQ0FFQSxDQXRrQmdDLENBd2tCakN4SixXQUFZLFNBQVdyVSxDQUFYLENBQWUsQ0FFMUIsWUFBWStULElBQUwsQ0FBVyxLQUFLTyxpQkFBTCxDQUF3QnRVLENBQXhCLENBQVgsQ0FBUCxDQUVBLENBNWtCZ0MsQ0E4a0JqQ3NVLGtCQUFtQixTQUFXdFUsQ0FBWCxDQUFlLENBRWpDLE9BQVMsS0FBS0UsQ0FBTCxDQUFTRixFQUFFRSxDQUFwQixDQUF1QnFVLEdBQUssS0FBSzdELENBQUwsQ0FBUzFRLEVBQUUwUSxDQUF2QyxDQUEwQ3dWLEdBQUssS0FBSzNPLENBQUwsQ0FBU3ZYLEVBQUV1WCxDQUExRCxDQUVBLFVBQVkvQyxFQUFMLENBQVVELEdBQUtBLEVBQWYsQ0FBb0IyUixHQUFLQSxFQUFoQyxDQUVBLENBcGxCZ0MsQ0FzbEJqQ3pSLG9CQUFxQixTQUFXelUsQ0FBWCxDQUFlLENBRW5DLFlBQVlpVSxHQUFMLENBQVUsS0FBSy9ULENBQUwsQ0FBU0YsRUFBRUUsQ0FBckIsRUFBMkIxUSxLQUFLeWtCLEdBQUwsQ0FBVSxLQUFLdkQsQ0FBTCxDQUFTMVEsRUFBRTBRLENBQXJCLENBQTNCLENBQXNEbGhCLEtBQUt5a0IsR0FBTCxDQUFVLEtBQUtzRCxDQUFMLENBQVN2WCxFQUFFdVgsQ0FBckIsQ0FBN0QsQ0FFQSxDQTFsQmdDLENBNGxCakM0TyxpQkFBa0IsU0FBV2oyQixDQUFYLENBQWUsQ0FFaEMsaUJBQW1CVixLQUFLa21CLEdBQUwsQ0FBVXhsQixFQUFFazJCLEdBQVosRUFBb0JsMkIsRUFBRW0yQixNQUF6QyxDQUVBLEtBQUtubUIsQ0FBTCxDQUFTb21CLGFBQWU5MkIsS0FBS2ttQixHQUFMLENBQVV4bEIsRUFBRTJ0QixLQUFaLENBQXhCLENBQ0EsS0FBS25OLENBQUwsQ0FBU2xoQixLQUFLaW1CLEdBQUwsQ0FBVXZsQixFQUFFazJCLEdBQVosRUFBb0JsMkIsRUFBRW0yQixNQUEvQixDQUNBLEtBQUs5TyxDQUFMLENBQVMrTyxhQUFlOTJCLEtBQUtpbUIsR0FBTCxDQUFVdmxCLEVBQUUydEIsS0FBWixDQUF4QixDQUVBLFdBQUEsQ0FFQSxDQXRtQmdDLENBd21CakMwSSxtQkFBb0IsU0FBV3oxQixDQUFYLENBQWUsQ0FFbEMsS0FBS29QLENBQUwsQ0FBU3BQLEVBQUV1MUIsTUFBRixDQUFXNzJCLEtBQUtrbUIsR0FBTCxDQUFVNWtCLEVBQUUrc0IsS0FBWixDQUFwQixDQUNBLEtBQUtuTixDQUFMLENBQVM1ZixFQUFFNGYsQ0FBWCxDQUNBLEtBQUs2RyxDQUFMLENBQVN6bUIsRUFBRXUxQixNQUFGLENBQVc3MkIsS0FBS2ltQixHQUFMLENBQVUza0IsRUFBRStzQixLQUFaLENBQXBCLENBRUEsV0FBQSxDQUVBLENBaG5CZ0MsQ0FrbkJqQzJJLHNCQUF1QixTQUFXclcsQ0FBWCxDQUFlLENBRXJDLE1BQVFBLEVBQUVrRCxRQUFWLENBRUEsS0FBS25ULENBQUwsQ0FBUzVRLEVBQUcsRUFBSCxDQUFULENBQ0EsS0FBS29oQixDQUFMLENBQVNwaEIsRUFBRyxFQUFILENBQVQsQ0FDQSxLQUFLaW9CLENBQUwsQ0FBU2pvQixFQUFHLEVBQUgsQ0FBVCxDQUVBLFdBQUEsQ0FFQSxDQTVuQmdDLENBOG5CakNtM0IsbUJBQW9CLFNBQVd0VyxDQUFYLENBQWUsQ0FFbEMsT0FBUyxLQUFLa0gsbUJBQUwsQ0FBMEJsSCxDQUExQixDQUE2QixDQUE3QixFQUFpQzdpQixNQUFqQyxFQUFULENBQ0EsT0FBUyxLQUFLK3BCLG1CQUFMLENBQTBCbEgsQ0FBMUIsQ0FBNkIsQ0FBN0IsRUFBaUM3aUIsTUFBakMsRUFBVCxDQUNBLE9BQVMsS0FBSytwQixtQkFBTCxDQUEwQmxILENBQTFCLENBQTZCLENBQTdCLEVBQWlDN2lCLE1BQWpDLEVBQVQsQ0FFQSxLQUFLNFMsQ0FBTCxDQUFTeWUsRUFBVCxDQUNBLEtBQUtqTyxDQUFMLENBQVNtTyxFQUFULENBQ0EsS0FBS3RILENBQUwsQ0FBU3VILEVBQVQsQ0FFQSxXQUFBLENBRUEsQ0Exb0JnQyxDQTRvQmpDekgsb0JBQXFCLFNBQVdsSCxDQUFYLENBQWM1YixLQUFkLENBQXNCLENBRTFDLFlBQVl5Z0IsU0FBTCxDQUFnQjdFLEVBQUVrRCxRQUFsQixDQUE0QjllLE1BQVEsQ0FBcEMsQ0FBUCxDQUVBLENBaHBCZ0MsQ0FrcEJqQ3dnQixPQUFRLFNBQVcvVSxDQUFYLENBQWUsQ0FFdEIsU0FBYUUsQ0FBRixHQUFRLEtBQUtBLENBQWYsRUFBd0JGLEVBQUUwUSxDQUFGLEdBQVEsS0FBS0EsQ0FBckMsRUFBOEMxUSxFQUFFdVgsQ0FBRixHQUFRLEtBQUtBLENBQXBFLENBRUEsQ0F0cEJnQyxDQXdwQmpDdkMsVUFBVyxTQUFXdEgsS0FBWCxDQUFrQnVILE1BQWxCLENBQTJCLENBRXJDLEdBQUtBLFNBQVdocEIsU0FBaEIsQ0FBNEJncEIsT0FBUyxDQUFULENBRTVCLEtBQUsvVSxDQUFMLENBQVN3TixNQUFPdUgsTUFBUCxDQUFULENBQ0EsS0FBS3ZFLENBQUwsQ0FBU2hELE1BQU91SCxPQUFTLENBQWhCLENBQVQsQ0FDQSxLQUFLc0MsQ0FBTCxDQUFTN0osTUFBT3VILE9BQVMsQ0FBaEIsQ0FBVCxDQUVBLFdBQUEsQ0FFQSxDQWxxQmdDLENBb3FCakNDLFFBQVMsU0FBV3hILEtBQVgsQ0FBa0J1SCxNQUFsQixDQUEyQixDQUVuQyxHQUFLdkgsUUFBVXpoQixTQUFmLENBQTJCeWhCLE1BQVEsRUFBUixDQUMzQixHQUFLdUgsU0FBV2hwQixTQUFoQixDQUE0QmdwQixPQUFTLENBQVQsQ0FFNUJ2SCxNQUFPdUgsTUFBUCxFQUFrQixLQUFLL1UsQ0FBdkIsQ0FDQXdOLE1BQU91SCxPQUFTLENBQWhCLEVBQXNCLEtBQUt2RSxDQUEzQixDQUNBaEQsTUFBT3VILE9BQVMsQ0FBaEIsRUFBc0IsS0FBS3NDLENBQTNCLENBRUEsWUFBQSxDQUVBLENBL3FCZ0MsQ0FpckJqQ3BDLG9CQUFxQixTQUFXQyxTQUFYLENBQXNCN2dCLEtBQXRCLENBQTZCMGdCLE1BQTdCLENBQXNDLENBRTFELEdBQUtBLFNBQVdocEIsU0FBaEIsQ0FBNEIsQ0FFM0IyVyxRQUFRNlAsSUFBUixDQUFjLHFFQUFkLEVBRUEsQ0FFRCxLQUFLdlMsQ0FBTCxDQUFTa1YsVUFBVUMsSUFBVixDQUFnQjlnQixLQUFoQixDQUFULENBQ0EsS0FBS21jLENBQUwsQ0FBUzBFLFVBQVVFLElBQVYsQ0FBZ0IvZ0IsS0FBaEIsQ0FBVCxDQUNBLEtBQUtnakIsQ0FBTCxDQUFTbkMsVUFBVWtILElBQVYsQ0FBZ0IvbkIsS0FBaEIsQ0FBVCxDQUVBLFdBQUEsQ0FFQSxDQS9yQmdDLENBQWxDLEVBbXNCQTs7Ozs7S0FPQSxnQkFBQSxFQUFtQixDQUVsQixLQUFLOGUsUUFBTCxDQUFnQixDQUVmLENBRmUsQ0FFWixDQUZZLENBRVQsQ0FGUyxDQUdmLENBSGUsQ0FHWixDQUhZLENBR1QsQ0FIUyxDQUlmLENBSmUsQ0FJWixDQUpZLENBSVQsQ0FKUyxDQUFoQixDQVFBLEdBQUtyaUIsVUFBVTFELE1BQVYsQ0FBbUIsQ0FBeEIsQ0FBNEIsQ0FFM0JzVixRQUFRTSxLQUFSLENBQWUsK0VBQWYsRUFFQSxDQUVELENBRUR0YyxPQUFPNG5CLE1BQVAsQ0FBZWtZLFFBQVE3L0IsU0FBdkIsQ0FBa0MsQ0FFakM4L0IsVUFBVyxJQUZzQixDQUlqQzFvQixJQUFLLFNBQVc0WCxHQUFYLENBQWdCQyxHQUFoQixDQUFxQkMsR0FBckIsQ0FBMEJFLEdBQTFCLENBQStCQyxHQUEvQixDQUFvQ0MsR0FBcEMsQ0FBeUNFLEdBQXpDLENBQThDQyxHQUE5QyxDQUFtREMsR0FBbkQsQ0FBeUQsQ0FFN0QsT0FBUyxLQUFLbEQsUUFBZCxDQUVBd0QsR0FBSSxDQUFKLEVBQVVoQixHQUFWLENBQWVnQixHQUFJLENBQUosRUFBVVosR0FBVixDQUFlWSxHQUFJLENBQUosRUFBVVIsR0FBVixDQUM5QlEsR0FBSSxDQUFKLEVBQVVmLEdBQVYsQ0FBZWUsR0FBSSxDQUFKLEVBQVVYLEdBQVYsQ0FBZVcsR0FBSSxDQUFKLEVBQVVQLEdBQVYsQ0FDOUJPLEdBQUksQ0FBSixFQUFVZCxHQUFWLENBQWVjLEdBQUksQ0FBSixFQUFVVixHQUFWLENBQWVVLEdBQUksQ0FBSixFQUFVTixHQUFWLENBRTlCLFdBQUEsQ0FFQSxDQWRnQyxDQWdCakNPLFNBQVUsVUFBWSxDQUVyQixLQUFLN1ksR0FBTCxDQUVDLENBRkQsQ0FFSSxDQUZKLENBRU8sQ0FGUCxDQUdDLENBSEQsQ0FHSSxDQUhKLENBR08sQ0FIUCxDQUlDLENBSkQsQ0FJSSxDQUpKLENBSU8sQ0FKUCxFQVFBLFdBQUEsQ0FFQSxDQTVCZ0MsQ0E4QmpDcVUsTUFBTyxVQUFZLENBRWxCLGdCQUFnQm5wQixXQUFULEdBQXVCNnJCLFNBQXZCLENBQWtDLEtBQUszQixRQUF2QyxDQUFQLENBRUEsQ0FsQ2dDLENBb0NqQ2QsS0FBTSxTQUFXcEMsQ0FBWCxDQUFlLENBRXBCLE9BQVMsS0FBS2tELFFBQWQsQ0FDQSxPQUFTbEQsRUFBRWtELFFBQVgsQ0FFQXdELEdBQUksQ0FBSixFQUFVRSxHQUFJLENBQUosQ0FBVixDQUFtQkYsR0FBSSxDQUFKLEVBQVVFLEdBQUksQ0FBSixDQUFWLENBQW1CRixHQUFJLENBQUosRUFBVUUsR0FBSSxDQUFKLENBQVYsQ0FDdENGLEdBQUksQ0FBSixFQUFVRSxHQUFJLENBQUosQ0FBVixDQUFtQkYsR0FBSSxDQUFKLEVBQVVFLEdBQUksQ0FBSixDQUFWLENBQW1CRixHQUFJLENBQUosRUFBVUUsR0FBSSxDQUFKLENBQVYsQ0FDdENGLEdBQUksQ0FBSixFQUFVRSxHQUFJLENBQUosQ0FBVixDQUFtQkYsR0FBSSxDQUFKLEVBQVVFLEdBQUksQ0FBSixDQUFWLENBQW1CRixHQUFJLENBQUosRUFBVUUsR0FBSSxDQUFKLENBQVYsQ0FFdEMsV0FBQSxDQUVBLENBL0NnQyxDQWlEakM2UCxlQUFnQixTQUFXelcsQ0FBWCxDQUFlLENBRTlCLE9BQVNBLEVBQUVrRCxRQUFYLENBRUEsS0FBS3BWLEdBQUwsQ0FFQzhZLEdBQUksQ0FBSixDQUZELENBRVVBLEdBQUksQ0FBSixDQUZWLENBRW1CQSxHQUFJLENBQUosQ0FGbkIsQ0FHQ0EsR0FBSSxDQUFKLENBSEQsQ0FHVUEsR0FBSSxDQUFKLENBSFYsQ0FHbUJBLEdBQUksQ0FBSixDQUhuQixDQUlDQSxHQUFJLENBQUosQ0FKRCxDQUlVQSxHQUFJLENBQUosQ0FKVixDQUltQkEsR0FBSSxFQUFKLENBSm5CLEVBUUEsV0FBQSxDQUVBLENBL0RnQyxDQWlFakNxRix1QkFBd0IsVUFBWSxDQUVuQyxPQUFTLFdBQUEsRUFBVCxDQUVBLHNDQUFPLENBQWlDaEgsU0FBakMsQ0FBNkMsQ0FFbkQsSUFBTSxNQUFRLENBQVIsQ0FBV2hsQixFQUFJZ2xCLFVBQVVpSCxLQUEvQixDQUFzQzF1QixFQUFJeUMsQ0FBMUMsQ0FBNkN6QyxHQUE3QyxDQUFvRCxDQUVuRGtuQixHQUFHM1UsQ0FBSCxDQUFPa1YsVUFBVUMsSUFBVixDQUFnQjFuQixDQUFoQixDQUFQLENBQ0FrbkIsR0FBR25FLENBQUgsQ0FBTzBFLFVBQVVFLElBQVYsQ0FBZ0IzbkIsQ0FBaEIsQ0FBUCxDQUNBa25CLEdBQUcwQyxDQUFILENBQU9uQyxVQUFVa0gsSUFBVixDQUFnQjN1QixDQUFoQixDQUFQLENBRUFrbkIsR0FBR3pCLFlBQUgsQ0FBaUIsSUFBakIsRUFFQWdDLFVBQVVvSCxNQUFWLENBQWtCN3VCLENBQWxCLENBQXFCa25CLEdBQUczVSxDQUF4QixDQUEyQjJVLEdBQUduRSxDQUE5QixDQUFpQ21FLEdBQUcwQyxDQUFwQyxFQUVBLENBRUQsZ0JBQUEsQ0FFQSxDQWhCRCxDQWtCQSxDQXRCdUIsRUFqRVMsQ0F5RmpDdkUsU0FBVSxTQUFXN0MsQ0FBWCxDQUFlLENBRXhCLFlBQVkrSixnQkFBTCxDQUF1QixJQUF2QixDQUE2Qi9KLENBQTdCLENBQVAsQ0FFQSxDQTdGZ0MsQ0ErRmpDZ0ssWUFBYSxTQUFXaEssQ0FBWCxDQUFlLENBRTNCLFlBQVkrSixnQkFBTCxDQUF1Qi9KLENBQXZCLENBQTBCLElBQTFCLENBQVAsQ0FFQSxDQW5HZ0MsQ0FxR2pDK0osaUJBQWtCLFNBQVc3cEIsQ0FBWCxDQUFjRixDQUFkLENBQWtCLENBRW5DLE9BQVNFLEVBQUVnakIsUUFBWCxDQUNBLE9BQVNsakIsRUFBRWtqQixRQUFYLENBQ0EsT0FBUyxLQUFLQSxRQUFkLENBRUEsUUFBVStFLEdBQUksQ0FBSixDQUFWLENBQW1CZ0MsSUFBTWhDLEdBQUksQ0FBSixDQUF6QixDQUFrQ2lDLElBQU1qQyxHQUFJLENBQUosQ0FBeEMsQ0FDQSxRQUFVQSxHQUFJLENBQUosQ0FBVixDQUFtQm1DLElBQU1uQyxHQUFJLENBQUosQ0FBekIsQ0FBa0NvQyxJQUFNcEMsR0FBSSxDQUFKLENBQXhDLENBQ0EsUUFBVUEsR0FBSSxDQUFKLENBQVYsQ0FBbUJzQyxJQUFNdEMsR0FBSSxDQUFKLENBQXpCLENBQWtDdUMsSUFBTXZDLEdBQUksQ0FBSixDQUF4QyxDQUVBLFFBQVVGLEdBQUksQ0FBSixDQUFWLENBQW1COEMsSUFBTTlDLEdBQUksQ0FBSixDQUF6QixDQUFrQytDLElBQU0vQyxHQUFJLENBQUosQ0FBeEMsQ0FDQSxRQUFVQSxHQUFJLENBQUosQ0FBVixDQUFtQmlELElBQU1qRCxHQUFJLENBQUosQ0FBekIsQ0FBa0NrRCxJQUFNbEQsR0FBSSxDQUFKLENBQXhDLENBQ0EsUUFBVUEsR0FBSSxDQUFKLENBQVYsQ0FBbUJvRCxJQUFNcEQsR0FBSSxDQUFKLENBQXpCLENBQWtDcUQsSUFBTXJELEdBQUksQ0FBSixDQUF4QyxDQUVBckIsR0FBSSxDQUFKLEVBQVUrRSxJQUFNQyxHQUFOLENBQVl6QixJQUFNMEIsR0FBbEIsQ0FBd0J6QixJQUFNMEIsR0FBeEMsQ0FDQWxGLEdBQUksQ0FBSixFQUFVK0UsSUFBTVosR0FBTixDQUFZWixJQUFNZSxHQUFsQixDQUF3QmQsSUFBTWlCLEdBQXhDLENBQ0F6RSxHQUFJLENBQUosRUFBVStFLElBQU1YLEdBQU4sQ0FBWWIsSUFBTWdCLEdBQWxCLENBQXdCZixJQUFNa0IsR0FBeEMsQ0FFQTFFLEdBQUksQ0FBSixFQUFVb0YsSUFBTUosR0FBTixDQUFZdEIsSUFBTXVCLEdBQWxCLENBQXdCdEIsSUFBTXVCLEdBQXhDLENBQ0FsRixHQUFJLENBQUosRUFBVW9GLElBQU1qQixHQUFOLENBQVlULElBQU1ZLEdBQWxCLENBQXdCWCxJQUFNYyxHQUF4QyxDQUNBekUsR0FBSSxDQUFKLEVBQVVvRixJQUFNaEIsR0FBTixDQUFZVixJQUFNYSxHQUFsQixDQUF3QlosSUFBTWUsR0FBeEMsQ0FFQTFFLEdBQUksQ0FBSixFQUFVcUYsSUFBTUwsR0FBTixDQUFZbkIsSUFBTW9CLEdBQWxCLENBQXdCbkIsSUFBTW9CLEdBQXhDLENBQ0FsRixHQUFJLENBQUosRUFBVXFGLElBQU1sQixHQUFOLENBQVlOLElBQU1TLEdBQWxCLENBQXdCUixJQUFNVyxHQUF4QyxDQUNBekUsR0FBSSxDQUFKLEVBQVVxRixJQUFNakIsR0FBTixDQUFZUCxJQUFNVSxHQUFsQixDQUF3QlQsSUFBTVksR0FBeEMsQ0FFQSxXQUFBLENBRUEsQ0FqSWdDLENBbUlqQ3RJLGVBQWdCLFNBQVcvaUIsQ0FBWCxDQUFlLENBRTlCLE9BQVMsS0FBS21qQixRQUFkLENBRUF3RCxHQUFJLENBQUosR0FBVzNtQixDQUFYLENBQWMybUIsR0FBSSxDQUFKLEdBQVczbUIsQ0FBWCxDQUFjMm1CLEdBQUksQ0FBSixHQUFXM21CLENBQVgsQ0FDNUIybUIsR0FBSSxDQUFKLEdBQVczbUIsQ0FBWCxDQUFjMm1CLEdBQUksQ0FBSixHQUFXM21CLENBQVgsQ0FBYzJtQixHQUFJLENBQUosR0FBVzNtQixDQUFYLENBQzVCMm1CLEdBQUksQ0FBSixHQUFXM21CLENBQVgsQ0FBYzJtQixHQUFJLENBQUosR0FBVzNtQixDQUFYLENBQWMybUIsR0FBSSxDQUFKLEdBQVczbUIsQ0FBWCxDQUU1QixXQUFBLENBRUEsQ0E3SWdDLENBK0lqQ3VzQixZQUFhLFVBQVksQ0FFeEIsT0FBUyxLQUFLcEosUUFBZCxDQUVBLE1BQVF3RCxHQUFJLENBQUosQ0FBUixDQUFpQjFtQixFQUFJMG1CLEdBQUksQ0FBSixDQUFyQixDQUE4Qi9sQixFQUFJK2xCLEdBQUksQ0FBSixDQUFsQyxDQUNDa0IsRUFBSWxCLEdBQUksQ0FBSixDQURMLENBQ2N2bkIsRUFBSXVuQixHQUFJLENBQUosQ0FEbEIsQ0FDMkJ4a0IsRUFBSXdrQixHQUFJLENBQUosQ0FEL0IsQ0FFQzVuQixFQUFJNG5CLEdBQUksQ0FBSixDQUZMLENBRWM4SSxFQUFJOUksR0FBSSxDQUFKLENBRmxCLENBRTJCbHBCLEVBQUlrcEIsR0FBSSxDQUFKLENBRi9CLENBSUEsU0FBV3ZuQixDQUFKLENBQVEzQixDQUFSLENBQVkwQyxFQUFJZ0MsQ0FBSixDQUFRc3RCLENBQXBCLENBQXdCeHZCLEVBQUk0bkIsQ0FBSixDQUFRcHFCLENBQWhDLENBQW9Dd0MsRUFBSWtDLENBQUosQ0FBUXBELENBQTVDLENBQWdENkIsRUFBSWluQixDQUFKLENBQVE0SCxDQUF4RCxDQUE0RDd1QixFQUFJeEIsQ0FBSixDQUFRTCxDQUEzRSxDQUVBLENBekpnQyxDQTJKakM0dEIsV0FBWSxTQUFXK0IsTUFBWCxDQUFtQjlCLGlCQUFuQixDQUF1QyxDQUVsRCxHQUFLOEIsUUFBVUEsT0FBT2hKLFNBQXRCLENBQWtDLENBRWpDaFQsUUFBUU0sS0FBUixDQUFlLGtFQUFmLEVBRUEsQ0FFRCxPQUFTMGIsT0FBT3ZMLFFBQWhCLENBQ0N3RCxHQUFLLEtBQUt4RCxRQURYLENBR0N3QyxJQUFNa0IsR0FBSSxDQUFKLENBSFAsQ0FHZ0JkLElBQU1jLEdBQUksQ0FBSixDQUh0QixDQUcrQlYsSUFBTVUsR0FBSSxDQUFKLENBSHJDLENBSUNqQixJQUFNaUIsR0FBSSxDQUFKLENBSlAsQ0FJZ0JiLElBQU1hLEdBQUksQ0FBSixDQUp0QixDQUkrQlQsSUFBTVMsR0FBSSxDQUFKLENBSnJDLENBS0NoQixJQUFNZ0IsR0FBSSxDQUFKLENBTFAsQ0FLZ0JaLElBQU1ZLEdBQUksQ0FBSixDQUx0QixDQUsrQlIsSUFBTVEsR0FBSSxDQUFKLENBTHJDLENBT0NnRyxJQUFNeEcsSUFBTUwsR0FBTixDQUFZSSxJQUFNSCxHQVB6QixDQVFDNkcsSUFBTTFHLElBQU1QLEdBQU4sQ0FBWVEsSUFBTVQsR0FSekIsQ0FTQ21ILElBQU05RyxJQUFNTCxHQUFOLENBQVlJLElBQU1ILEdBVHpCLENBV0NvSCxJQUFNdEgsSUFBTWtILEdBQU4sQ0FBWTlHLElBQU0rRyxHQUFsQixDQUF3QjNHLElBQU00RyxHQVhyQyxDQWFBLEdBQUtFLE1BQVEsQ0FBYixDQUFpQixDQUVoQixRQUFVLG9FQUFWLENBRUEsR0FBS0wsb0JBQXNCLElBQTNCLENBQWtDLENBRWpDLGVBQU0sQ0FBV00sR0FBWCxDQUFOLENBRUEsQ0FKRCxJQUlPLENBRU54YSxRQUFRNlAsSUFBUixDQUFjMkssR0FBZCxFQUVBLENBRUQsWUFBWXRHLFFBQUwsRUFBUCxDQUVBLENBRUQsV0FBYSxFQUFJcUcsR0FBakIsQ0FFQXRHLEdBQUksQ0FBSixFQUFVa0csSUFBTU0sTUFBaEIsQ0FDQXhHLEdBQUksQ0FBSixFQUFVLENBQUVSLElBQU1GLEdBQU4sQ0FBWUksSUFBTU4sR0FBcEIsRUFBNEJvSCxNQUF0QyxDQUNBeEcsR0FBSSxDQUFKLEVBQVUsQ0FBRVAsSUFBTUwsR0FBTixDQUFZSSxJQUFNSCxHQUFwQixFQUE0Qm1ILE1BQXRDLENBRUF4RyxHQUFJLENBQUosRUFBVW1HLElBQU1LLE1BQWhCLENBQ0F4RyxHQUFJLENBQUosRUFBVSxDQUFFTixJQUFNVixHQUFOLENBQVlRLElBQU1OLEdBQXBCLEVBQTRCc0gsTUFBdEMsQ0FDQXhHLEdBQUksQ0FBSixFQUFVLENBQUVSLElBQU1QLEdBQU4sQ0FBWVEsSUFBTVQsR0FBcEIsRUFBNEJ3SCxNQUF0QyxDQUVBeEcsR0FBSSxDQUFKLEVBQVVvRyxJQUFNSSxNQUFoQixDQUNBeEcsR0FBSSxDQUFKLEVBQVUsQ0FBRVosSUFBTUYsR0FBTixDQUFZSSxJQUFNTixHQUFwQixFQUE0QndILE1BQXRDLENBQ0F4RyxHQUFJLENBQUosRUFBVSxDQUFFWCxJQUFNTCxHQUFOLENBQVlJLElBQU1ILEdBQXBCLEVBQTRCdUgsTUFBdEMsQ0FFQSxXQUFBLENBRUEsQ0FsTmdDLENBb05qQ1gsVUFBVyxVQUFZLENBRXRCLE9BQUEsQ0FBU3ZNLEVBQUksS0FBS2tELFFBQWxCLENBRUFzSixJQUFNeE0sRUFBRyxDQUFILENBQU4sQ0FBY0EsRUFBRyxDQUFILEVBQVNBLEVBQUcsQ0FBSCxDQUFULENBQWlCQSxFQUFHLENBQUgsRUFBU3dNLEdBQVQsQ0FDL0JBLElBQU14TSxFQUFHLENBQUgsQ0FBTixDQUFjQSxFQUFHLENBQUgsRUFBU0EsRUFBRyxDQUFILENBQVQsQ0FBaUJBLEVBQUcsQ0FBSCxFQUFTd00sR0FBVCxDQUMvQkEsSUFBTXhNLEVBQUcsQ0FBSCxDQUFOLENBQWNBLEVBQUcsQ0FBSCxFQUFTQSxFQUFHLENBQUgsQ0FBVCxDQUFpQkEsRUFBRyxDQUFILEVBQVN3TSxHQUFULENBRS9CLFdBQUEsQ0FFQSxDQTlOZ0MsQ0FnT2pDa0ssZ0JBQWlCLFNBQVdDLE9BQVgsQ0FBcUIsQ0FFckMsWUFBWUYsY0FBTCxDQUFxQkUsT0FBckIsRUFBK0JqSyxVQUEvQixDQUEyQyxJQUEzQyxFQUFrREgsU0FBbEQsRUFBUCxDQUVBLENBcE9nQyxDQXNPakNxSyxtQkFBb0IsU0FBVzNpQixDQUFYLENBQWUsQ0FFbEMsTUFBUSxLQUFLaVAsUUFBYixDQUVBalAsRUFBRyxDQUFILEVBQVMrTCxFQUFHLENBQUgsQ0FBVCxDQUNBL0wsRUFBRyxDQUFILEVBQVMrTCxFQUFHLENBQUgsQ0FBVCxDQUNBL0wsRUFBRyxDQUFILEVBQVMrTCxFQUFHLENBQUgsQ0FBVCxDQUNBL0wsRUFBRyxDQUFILEVBQVMrTCxFQUFHLENBQUgsQ0FBVCxDQUNBL0wsRUFBRyxDQUFILEVBQVMrTCxFQUFHLENBQUgsQ0FBVCxDQUNBL0wsRUFBRyxDQUFILEVBQVMrTCxFQUFHLENBQUgsQ0FBVCxDQUNBL0wsRUFBRyxDQUFILEVBQVMrTCxFQUFHLENBQUgsQ0FBVCxDQUNBL0wsRUFBRyxDQUFILEVBQVMrTCxFQUFHLENBQUgsQ0FBVCxDQUNBL0wsRUFBRyxDQUFILEVBQVMrTCxFQUFHLENBQUgsQ0FBVCxDQUVBLFdBQUEsQ0FFQSxDQXRQZ0MsQ0F3UGpDNlcsZUFBZ0IsU0FBVzdJLEVBQVgsQ0FBZUQsRUFBZixDQUFtQlMsRUFBbkIsQ0FBdUJFLEVBQXZCLENBQTJCb0ksUUFBM0IsQ0FBcUNDLEVBQXJDLENBQXlDQyxFQUF6QyxDQUE4QyxDQUU3RCxNQUFRMzNCLEtBQUtpbUIsR0FBTCxDQUFVd1IsUUFBVixDQUFSLENBQ0EsTUFBUXozQixLQUFLa21CLEdBQUwsQ0FBVXVSLFFBQVYsQ0FBUixDQUVBLEtBQUtocEIsR0FBTCxDQUNDMGdCLEdBQUs3dEIsQ0FETixDQUNTNnRCLEdBQUt6dUIsQ0FEZCxDQUNpQixDQUFFeXVCLEVBQUYsRUFBUzd0QixFQUFJbzJCLEVBQUosQ0FBU2gzQixFQUFJaTNCLEVBQXRCLEVBQTZCRCxFQUE3QixDQUFrQy9JLEVBRG5ELENBRUMsQ0FBRVUsRUFBRixDQUFPM3VCLENBRlIsQ0FFVzJ1QixHQUFLL3RCLENBRmhCLENBRW1CLENBQUUrdEIsRUFBRixFQUFTLENBQUUzdUIsQ0FBRixDQUFNZzNCLEVBQU4sQ0FBV3AyQixFQUFJcTJCLEVBQXhCLEVBQStCQSxFQUEvQixDQUFvQ2pKLEVBRnZELENBR0MsQ0FIRCxDQUdJLENBSEosQ0FHTyxDQUhQLEVBTUEsQ0FuUWdDLENBcVFqQ1osTUFBTyxTQUFXcUIsRUFBWCxDQUFlRSxFQUFmLENBQW9CLENBRTFCLE9BQVMsS0FBS3hMLFFBQWQsQ0FFQXdELEdBQUksQ0FBSixHQUFXOEgsRUFBWCxDQUFlOUgsR0FBSSxDQUFKLEdBQVc4SCxFQUFYLENBQWU5SCxHQUFJLENBQUosR0FBVzhILEVBQVgsQ0FDOUI5SCxHQUFJLENBQUosR0FBV2dJLEVBQVgsQ0FBZWhJLEdBQUksQ0FBSixHQUFXZ0ksRUFBWCxDQUFlaEksR0FBSSxDQUFKLEdBQVdnSSxFQUFYLENBRTlCLFdBQUEsQ0FFQSxDQTlRZ0MsQ0FnUmpDdUksT0FBUSxTQUFXdkosS0FBWCxDQUFtQixDQUUxQixNQUFRcnVCLEtBQUtpbUIsR0FBTCxDQUFVb0ksS0FBVixDQUFSLENBQ0EsTUFBUXJ1QixLQUFLa21CLEdBQUwsQ0FBVW1JLEtBQVYsQ0FBUixDQUVBLE9BQVMsS0FBS3hLLFFBQWQsQ0FFQSxRQUFVd0QsR0FBSSxDQUFKLENBQVYsQ0FBbUJ1RCxJQUFNdkQsR0FBSSxDQUFKLENBQXpCLENBQWtDd0QsSUFBTXhELEdBQUksQ0FBSixDQUF4QyxDQUNBLFFBQVVBLEdBQUksQ0FBSixDQUFWLENBQW1CMEQsSUFBTTFELEdBQUksQ0FBSixDQUF6QixDQUFrQzJELElBQU0zRCxHQUFJLENBQUosQ0FBeEMsQ0FFQUEsR0FBSSxDQUFKLEVBQVUvbEIsRUFBSThxQixHQUFKLENBQVUxckIsRUFBSStyQixHQUF4QixDQUNBcEYsR0FBSSxDQUFKLEVBQVUvbEIsRUFBSXNwQixHQUFKLENBQVVscUIsRUFBSXFxQixHQUF4QixDQUNBMUQsR0FBSSxDQUFKLEVBQVUvbEIsRUFBSXVwQixHQUFKLENBQVVucUIsRUFBSXNxQixHQUF4QixDQUVBM0QsR0FBSSxDQUFKLEVBQVUsQ0FBRTNtQixDQUFGLENBQU0wckIsR0FBTixDQUFZOXFCLEVBQUltckIsR0FBMUIsQ0FDQXBGLEdBQUksQ0FBSixFQUFVLENBQUUzbUIsQ0FBRixDQUFNa3FCLEdBQU4sQ0FBWXRwQixFQUFJeXBCLEdBQTFCLENBQ0ExRCxHQUFJLENBQUosRUFBVSxDQUFFM21CLENBQUYsQ0FBTW1xQixHQUFOLENBQVl2cEIsRUFBSTBwQixHQUExQixDQUVBLFdBQUEsQ0FFQSxDQXBTZ0MsQ0FzU2pDNk0sVUFBVyxTQUFXbEosRUFBWCxDQUFlRCxFQUFmLENBQW9CLENBRTlCLE9BQVMsS0FBSzdLLFFBQWQsQ0FFQXdELEdBQUksQ0FBSixHQUFXc0gsR0FBS3RILEdBQUksQ0FBSixDQUFoQixDQUF5QkEsR0FBSSxDQUFKLEdBQVdzSCxHQUFLdEgsR0FBSSxDQUFKLENBQWhCLENBQXlCQSxHQUFJLENBQUosR0FBV3NILEdBQUt0SCxHQUFJLENBQUosQ0FBaEIsQ0FDbERBLEdBQUksQ0FBSixHQUFXcUgsR0FBS3JILEdBQUksQ0FBSixDQUFoQixDQUF5QkEsR0FBSSxDQUFKLEdBQVdxSCxHQUFLckgsR0FBSSxDQUFKLENBQWhCLENBQXlCQSxHQUFJLENBQUosR0FBV3FILEdBQUtySCxHQUFJLENBQUosQ0FBaEIsQ0FFbEQsV0FBQSxDQUVBLENBL1NnQyxDQWlUakM5QixPQUFRLFNBQVc2SixNQUFYLENBQW9CLENBRTNCLE9BQVMsS0FBS3ZMLFFBQWQsQ0FDQSxPQUFTdUwsT0FBT3ZMLFFBQWhCLENBRUEsSUFBTSxNQUFRLENBQWQsQ0FBaUIxbEIsRUFBSSxDQUFyQixDQUF3QkEsR0FBeEIsQ0FBK0IsQ0FFOUIsR0FBS2twQixHQUFJbHBCLENBQUosSUFBWW9wQixHQUFJcHBCLENBQUosQ0FBakIsQ0FBMkIsWUFBQSxDQUUzQixDQUVELFdBQUEsQ0FFQSxDQTlUZ0MsQ0FnVWpDcW5CLFVBQVcsU0FBV3RILEtBQVgsQ0FBa0J1SCxNQUFsQixDQUEyQixDQUVyQyxHQUFLQSxTQUFXaHBCLFNBQWhCLENBQTRCZ3BCLE9BQVMsQ0FBVCxDQUU1QixJQUFNLE1BQVEsQ0FBZCxDQUFpQnRuQixFQUFJLENBQXJCLENBQXdCQSxHQUF4QixDQUErQixDQUU5QixLQUFLMGxCLFFBQUwsQ0FBZTFsQixDQUFmLEVBQXFCK2YsTUFBTy9mLEVBQUlzbkIsTUFBWCxDQUFyQixDQUVBLENBRUQsV0FBQSxDQUVBLENBNVVnQyxDQThVakNDLFFBQVMsU0FBV3hILEtBQVgsQ0FBa0J1SCxNQUFsQixDQUEyQixDQUVuQyxHQUFLdkgsUUFBVXpoQixTQUFmLENBQTJCeWhCLE1BQVEsRUFBUixDQUMzQixHQUFLdUgsU0FBV2hwQixTQUFoQixDQUE0QmdwQixPQUFTLENBQVQsQ0FFNUIsT0FBUyxLQUFLNUIsUUFBZCxDQUVBM0YsTUFBT3VILE1BQVAsRUFBa0I0QixHQUFJLENBQUosQ0FBbEIsQ0FDQW5KLE1BQU91SCxPQUFTLENBQWhCLEVBQXNCNEIsR0FBSSxDQUFKLENBQXRCLENBQ0FuSixNQUFPdUgsT0FBUyxDQUFoQixFQUFzQjRCLEdBQUksQ0FBSixDQUF0QixDQUVBbkosTUFBT3VILE9BQVMsQ0FBaEIsRUFBc0I0QixHQUFJLENBQUosQ0FBdEIsQ0FDQW5KLE1BQU91SCxPQUFTLENBQWhCLEVBQXNCNEIsR0FBSSxDQUFKLENBQXRCLENBQ0FuSixNQUFPdUgsT0FBUyxDQUFoQixFQUFzQjRCLEdBQUksQ0FBSixDQUF0QixDQUVBbkosTUFBT3VILE9BQVMsQ0FBaEIsRUFBc0I0QixHQUFJLENBQUosQ0FBdEIsQ0FDQW5KLE1BQU91SCxPQUFTLENBQWhCLEVBQXNCNEIsR0FBSSxDQUFKLENBQXRCLENBQ0FuSixNQUFPdUgsT0FBUyxDQUFoQixFQUFzQjRCLEdBQUksQ0FBSixDQUF0QixDQUVBLFlBQUEsQ0FFQSxDQW5XZ0MsQ0FBbEMsRUF1V0E7Ozs7S0FNQSxjQUFnQixDQUFoQixDQUVBLGdCQUFBLENBQWtCeVEsS0FBbEIsQ0FBeUJDLE9BQXpCLENBQWtDQyxLQUFsQyxDQUF5Q0MsS0FBekMsQ0FBZ0RDLFNBQWhELENBQTJEQyxTQUEzRCxDQUFzRUMsTUFBdEUsQ0FBOEV0L0IsSUFBOUUsQ0FBb0Z1L0IsVUFBcEYsQ0FBZ0dDLFFBQWhHLENBQTJHLENBRTFHbGhDLE9BQU93SyxjQUFQLENBQXVCLElBQXZCLENBQTZCLElBQTdCLENBQW1DLENBQUU5RyxNQUFPeTlCLFdBQVQsQ0FBbkMsRUFFQSxLQUFLQyxJQUFMLENBQVkxVyxNQUFNN0IsWUFBTixFQUFaLENBRUEsS0FBSzlsQixJQUFMLENBQVksRUFBWixDQUVBLEtBQUsyOUIsS0FBTCxDQUFhQSxRQUFVcjdCLFNBQVYsQ0FBc0JxN0IsS0FBdEIsQ0FBOEJXLFFBQVFDLGFBQW5ELENBQ0EsS0FBS0MsT0FBTCxDQUFlLEVBQWYsQ0FFQSxLQUFLWixPQUFMLENBQWVBLFVBQVl0N0IsU0FBWixDQUF3QnM3QixPQUF4QixDQUFrQ1UsUUFBUUcsZUFBekQsQ0FFQSxLQUFLWixLQUFMLENBQWFBLFFBQVV2N0IsU0FBVixDQUFzQnU3QixLQUF0QixDQUE4QmEsbUJBQTNDLENBQ0EsS0FBS1osS0FBTCxDQUFhQSxRQUFVeDdCLFNBQVYsQ0FBc0J3N0IsS0FBdEIsQ0FBOEJZLG1CQUEzQyxDQUVBLEtBQUtYLFNBQUwsQ0FBaUJBLFlBQWN6N0IsU0FBZCxDQUEwQnk3QixTQUExQixDQUFzQ1ksWUFBdkQsQ0FDQSxLQUFLWCxTQUFMLENBQWlCQSxZQUFjMTdCLFNBQWQsQ0FBMEIwN0IsU0FBMUIsQ0FBc0NZLHdCQUF2RCxDQUVBLEtBQUtWLFVBQUwsQ0FBa0JBLGFBQWU1N0IsU0FBZixDQUEyQjQ3QixVQUEzQixDQUF3QyxDQUExRCxDQUVBLEtBQUtELE1BQUwsQ0FBY0EsU0FBVzM3QixTQUFYLENBQXVCMjdCLE1BQXZCLENBQWdDWSxVQUE5QyxDQUNBLEtBQUtsZ0MsSUFBTCxDQUFZQSxPQUFTMkQsU0FBVCxDQUFxQjNELElBQXJCLENBQTRCbWdDLGdCQUF4QyxDQUVBLEtBQUt4VCxNQUFMLENBQWMsV0FBQSxDQUFhLENBQWIsQ0FBZ0IsQ0FBaEIsQ0FBZCxDQUNBLEtBQUt5VCxNQUFMLENBQWMsV0FBQSxDQUFhLENBQWIsQ0FBZ0IsQ0FBaEIsQ0FBZCxDQUNBLEtBQUtsVCxNQUFMLENBQWMsV0FBQSxDQUFhLENBQWIsQ0FBZ0IsQ0FBaEIsQ0FBZCxDQUNBLEtBQUt5UixRQUFMLENBQWdCLENBQWhCLENBRUEsS0FBSzBCLGdCQUFMLENBQXdCLElBQXhCLENBQ0EsS0FBSy9KLE1BQUwsQ0FBYyxXQUFBLEVBQWQsQ0FFQSxLQUFLZ0ssZUFBTCxDQUF1QixJQUF2QixDQUNBLEtBQUtDLGdCQUFMLENBQXdCLEtBQXhCLENBQ0EsS0FBS0MsS0FBTCxDQUFhLElBQWIsQ0FDQSxLQUFLQyxlQUFMLENBQXVCLENBQXZCLENBQTBCO0VBRTFCO0VBQ0E7RUFDQTtFQUNBO0VBQ0EsS0FBS2pCLFFBQUwsQ0FBZ0JBLFdBQWE3N0IsU0FBYixDQUF5QjY3QixRQUF6QixDQUFvQ2tCLGNBQXBELENBRUEsS0FBS3Y0QixPQUFMLENBQWUsQ0FBZixDQUNBLEtBQUt3NEIsUUFBTCxDQUFnQixJQUFoQixDQUVBLENBRURoQixRQUFRQyxhQUFSLENBQXdCajhCLFNBQXhCLENBQ0FnOEIsUUFBUUcsZUFBUixDQUEwQmMsU0FBMUIsQ0FFQWpCLFFBQVFwaEMsU0FBUixDQUFvQkQsT0FBTzRuQixNQUFQLENBQWU1bkIsT0FBT2lCLE1BQVAsQ0FBZThtQixnQkFBZ0I5bkIsU0FBL0IsQ0FBZixDQUEyRCxDQUU5RXNDLFlBQWE4K0IsT0FGaUUsQ0FJOUVrQixVQUFXLElBSm1FLENBTTlFQyxhQUFjLFVBQVksQ0FFekIsS0FBS3hLLE1BQUwsQ0FBWW9JLGNBQVosQ0FBNEIsS0FBSy9SLE1BQUwsQ0FBWS9VLENBQXhDLENBQTJDLEtBQUsrVSxNQUFMLENBQVl2RSxDQUF2RCxDQUEwRCxLQUFLZ1ksTUFBTCxDQUFZeG9CLENBQXRFLENBQXlFLEtBQUt3b0IsTUFBTCxDQUFZaFksQ0FBckYsQ0FBd0YsS0FBS3VXLFFBQTdGLENBQXVHLEtBQUt6UixNQUFMLENBQVl0VixDQUFuSCxDQUFzSCxLQUFLc1YsTUFBTCxDQUFZOUUsQ0FBbEksRUFFQSxDQVY2RSxDQVk5RTRCLE1BQU8sVUFBWSxDQUVsQixnQkFBZ0JucEIsV0FBVCxHQUF1Qm9wQixJQUF2QixDQUE2QixJQUE3QixDQUFQLENBRUEsQ0FoQjZFLENBa0I5RUEsS0FBTSxTQUFXNWYsTUFBWCxDQUFvQixDQUV6QixLQUFLaEosSUFBTCxDQUFZZ0osT0FBT2hKLElBQW5CLENBRUEsS0FBSzI5QixLQUFMLENBQWEzMEIsT0FBTzIwQixLQUFwQixDQUNBLEtBQUthLE9BQUwsQ0FBZXgxQixPQUFPdzFCLE9BQVAsQ0FBZWo2QixLQUFmLENBQXNCLENBQXRCLENBQWYsQ0FFQSxLQUFLcTVCLE9BQUwsQ0FBZTUwQixPQUFPNDBCLE9BQXRCLENBRUEsS0FBS0MsS0FBTCxDQUFhNzBCLE9BQU82MEIsS0FBcEIsQ0FDQSxLQUFLQyxLQUFMLENBQWE5MEIsT0FBTzgwQixLQUFwQixDQUVBLEtBQUtDLFNBQUwsQ0FBaUIvMEIsT0FBTyswQixTQUF4QixDQUNBLEtBQUtDLFNBQUwsQ0FBaUJoMUIsT0FBT2cxQixTQUF4QixDQUVBLEtBQUtFLFVBQUwsQ0FBa0JsMUIsT0FBT2sxQixVQUF6QixDQUVBLEtBQUtELE1BQUwsQ0FBY2oxQixPQUFPaTFCLE1BQXJCLENBQ0EsS0FBS3QvQixJQUFMLENBQVlxSyxPQUFPckssSUFBbkIsQ0FFQSxLQUFLMnNCLE1BQUwsQ0FBWTFDLElBQVosQ0FBa0I1ZixPQUFPc2lCLE1BQXpCLEVBQ0EsS0FBS3lULE1BQUwsQ0FBWW5XLElBQVosQ0FBa0I1ZixPQUFPKzFCLE1BQXpCLEVBQ0EsS0FBS2xULE1BQUwsQ0FBWWpELElBQVosQ0FBa0I1ZixPQUFPNmlCLE1BQXpCLEVBQ0EsS0FBS3lSLFFBQUwsQ0FBZ0J0MEIsT0FBT3MwQixRQUF2QixDQUVBLEtBQUswQixnQkFBTCxDQUF3QmgyQixPQUFPZzJCLGdCQUEvQixDQUNBLEtBQUsvSixNQUFMLENBQVlyTSxJQUFaLENBQWtCNWYsT0FBT2lzQixNQUF6QixFQUVBLEtBQUtnSyxlQUFMLENBQXVCajJCLE9BQU9pMkIsZUFBOUIsQ0FDQSxLQUFLQyxnQkFBTCxDQUF3QmwyQixPQUFPazJCLGdCQUEvQixDQUNBLEtBQUtDLEtBQUwsQ0FBYW4yQixPQUFPbTJCLEtBQXBCLENBQ0EsS0FBS0MsZUFBTCxDQUF1QnAyQixPQUFPbzJCLGVBQTlCLENBQ0EsS0FBS2pCLFFBQUwsQ0FBZ0JuMUIsT0FBT20xQixRQUF2QixDQUVBLFdBQUEsQ0FFQSxDQXRENkUsQ0F3RDlFdUIsT0FBUSxTQUFXampCLElBQVgsQ0FBa0IsQ0FFekIsaUJBQXFCQSxPQUFTbmEsU0FBVCxFQUFzQixXQUFBLEdBQWdCLFFBQTNELENBRUEsR0FBSyxDQUFFcTlCLFlBQUYsRUFBa0JsakIsS0FBS21qQixRQUFMLENBQWUsS0FBS3ZCLElBQXBCLElBQStCLzdCLFNBQXRELENBQWtFLENBRWpFLFlBQVlzOUIsUUFBTCxDQUFlLEtBQUt2QixJQUFwQixDQUFQLENBRUEsQ0FFRCxtQkFBQSxDQUFxQlYsS0FBckIsQ0FBNkIsQ0FFNUIsVUFBQSxDQUVBLEdBQUtBLGtDQUFMLENBQTBDLENBRXpDa0MsT0FBU2xDLEtBQVQsQ0FFQSxDQUpELElBSU8sQ0FFTmtDLE9BQVNqNEIsU0FBU2s0QixlQUFULENBQTBCLDhCQUExQixDQUEwRCxRQUExRCxDQUFULENBQ0FELE9BQU9FLEtBQVAsQ0FBZXBDLE1BQU1vQyxLQUFyQixDQUNBRixPQUFPRyxNQUFQLENBQWdCckMsTUFBTXFDLE1BQXRCLENBRUEsWUFBY0gsT0FBT0ksVUFBUCxDQUFtQixJQUFuQixDQUFkLENBRUEsR0FBS3RDLDBCQUFMLENBQWtDLENBRWpDcC9CLFFBQVEyaEMsWUFBUixDQUFzQnZDLEtBQXRCLENBQTZCLENBQTdCLENBQWdDLENBQWhDLEVBRUEsQ0FKRCxJQUlPLENBRU5wL0IsUUFBUTRoQyxTQUFSLENBQW1CeEMsS0FBbkIsQ0FBMEIsQ0FBMUIsQ0FBNkIsQ0FBN0IsQ0FBZ0NBLE1BQU1vQyxLQUF0QyxDQUE2Q3BDLE1BQU1xQyxNQUFuRCxFQUVBLENBRUQsQ0FFRCxHQUFLSCxPQUFPRSxLQUFQLENBQWUsSUFBZixFQUF1QkYsT0FBT0csTUFBUCxDQUFnQixJQUE1QyxDQUFtRCxDQUVsRCxjQUFjSSxTQUFQLENBQWtCLFlBQWxCLENBQWdDLEdBQWhDLENBQVAsQ0FFQSxDQUpELElBSU8sQ0FFTixjQUFjQSxTQUFQLENBQWtCLFdBQWxCLENBQVAsQ0FFQSxDQUVELENBRUQsV0FBYSxDQUVaQyxTQUFVLENBQ1R2NUIsUUFBUyxHQURBLENBRVRuSSxLQUFNLFNBRkcsQ0FHVFAsVUFBVyxnQkFIRixDQUZFLENBUVppZ0MsS0FBTSxLQUFLQSxJQVJDLENBU1pyK0IsS0FBTSxLQUFLQSxJQVRDLENBV1o0OUIsUUFBUyxLQUFLQSxPQVhGLENBYVptQixPQUFRLENBQUUsS0FBS0EsTUFBTCxDQUFZeG9CLENBQWQsQ0FBaUIsS0FBS3dvQixNQUFMLENBQVloWSxDQUE3QixDQWJJLENBY1p1RSxPQUFRLENBQUUsS0FBS0EsTUFBTCxDQUFZL1UsQ0FBZCxDQUFpQixLQUFLK1UsTUFBTCxDQUFZdkUsQ0FBN0IsQ0FkSSxDQWVaOEUsT0FBUSxDQUFFLEtBQUtBLE1BQUwsQ0FBWXRWLENBQWQsQ0FBaUIsS0FBS3NWLE1BQUwsQ0FBWTlFLENBQTdCLENBZkksQ0FnQlp1VyxTQUFVLEtBQUtBLFFBaEJILENBa0JaOStCLEtBQU0sQ0FBRSxLQUFLcS9CLEtBQVAsQ0FBYyxLQUFLQyxLQUFuQixDQWxCTSxDQW9CWkcsT0FBUSxLQUFLQSxNQXBCRCxDQXFCWkQsVUFBVyxLQUFLQSxTQXJCSixDQXNCWkQsVUFBVyxLQUFLQSxTQXRCSixDQXVCWkcsV0FBWSxLQUFLQSxVQXZCTCxDQXlCWmlCLE1BQU8sS0FBS0EsS0F6QkEsQ0FBYixDQTZCQSxHQUFLLEtBQUt4QixLQUFMLEdBQWVyN0IsU0FBcEIsQ0FBZ0M7RUFJL0IsVUFBWSxLQUFLcTdCLEtBQWpCLENBRUEsR0FBS0EsTUFBTVUsSUFBTixHQUFlLzdCLFNBQXBCLENBQWdDLENBRS9CcTdCLE1BQU1VLElBQU4sQ0FBYTFXLE1BQU03QixZQUFOLEVBQWIsQ0FBbUM7RUFFbkMsQ0FFRCxHQUFLLENBQUU2WixZQUFGLEVBQWtCbGpCLEtBQUs2akIsTUFBTCxDQUFhM0MsTUFBTVUsSUFBbkIsSUFBOEIvN0IsU0FBckQsQ0FBaUUsQ0FFaEVtYSxLQUFLNmpCLE1BQUwsQ0FBYTNDLE1BQU1VLElBQW5CLEVBQTRCLENBQzNCQSxLQUFNVixNQUFNVSxJQURlLENBRTNCa0MsSUFBS0MsV0FBWTdDLEtBQVosQ0FGc0IsQ0FBNUIsQ0FLQSxDQUVENVksT0FBTzRZLEtBQVAsQ0FBZUEsTUFBTVUsSUFBckIsQ0FFQSxDQUVELEdBQUssQ0FBRXNCLFlBQVAsQ0FBc0IsQ0FFckJsakIsS0FBS21qQixRQUFMLENBQWUsS0FBS3ZCLElBQXBCLEVBQTZCdFosTUFBN0IsQ0FFQSxDQUVELGFBQUEsQ0FFQSxDQXhLNkUsQ0EwSzlFMGIsUUFBUyxVQUFZLENBRXBCLEtBQUtsYixhQUFMLENBQW9CLENBQUU1bUIsS0FBTSxTQUFSLENBQXBCLEVBRUEsQ0E5SzZFLENBZ0w5RStoQyxZQUFhLFNBQVdDLEVBQVgsQ0FBZ0IsQ0FFNUIsR0FBSyxLQUFLL0MsT0FBTCxHQUFpQjJCLFNBQXRCLENBQWtDLE9BRWxDb0IsR0FBR2xYLFlBQUgsQ0FBaUIsS0FBS3dMLE1BQXRCLEVBRUEsR0FBSzBMLEdBQUdwcUIsQ0FBSCxDQUFPLENBQVAsRUFBWW9xQixHQUFHcHFCLENBQUgsQ0FBTyxDQUF4QixDQUE0QixDQUUzQixPQUFTLEtBQUtzbkIsS0FBZCxFQUVDLG1CQUFBLENBRUM4QyxHQUFHcHFCLENBQUgsQ0FBT29xQixHQUFHcHFCLENBQUgsQ0FBTzFRLEtBQUtFLEtBQUwsQ0FBWTQ2QixHQUFHcHFCLENBQWYsQ0FBZCxDQUNBLE1BRUQsd0JBQUEsQ0FFQ29xQixHQUFHcHFCLENBQUgsQ0FBT29xQixHQUFHcHFCLENBQUgsQ0FBTyxDQUFQLENBQVcsQ0FBWCxDQUFlLENBQXRCLENBQ0EsTUFFRCwyQkFBQSxDQUVDLEdBQUsxUSxLQUFLeWtCLEdBQUwsQ0FBVXprQixLQUFLRSxLQUFMLENBQVk0NkIsR0FBR3BxQixDQUFmLEVBQXFCLENBQS9CLElBQXVDLENBQTVDLENBQWdELENBRS9Db3FCLEdBQUdwcUIsQ0FBSCxDQUFPMVEsS0FBS0MsSUFBTCxDQUFXNjZCLEdBQUdwcUIsQ0FBZCxFQUFvQm9xQixHQUFHcHFCLENBQTlCLENBRUEsQ0FKRCxJQUlPLENBRU5vcUIsR0FBR3BxQixDQUFILENBQU9vcUIsR0FBR3BxQixDQUFILENBQU8xUSxLQUFLRSxLQUFMLENBQVk0NkIsR0FBR3BxQixDQUFmLENBQWQsQ0FFQSxDQUNELE1BdkJGLENBMkJBLENBRUQsR0FBS29xQixHQUFHNVosQ0FBSCxDQUFPLENBQVAsRUFBWTRaLEdBQUc1WixDQUFILENBQU8sQ0FBeEIsQ0FBNEIsQ0FFM0IsT0FBUyxLQUFLK1csS0FBZCxFQUVDLG1CQUFBLENBRUM2QyxHQUFHNVosQ0FBSCxDQUFPNFosR0FBRzVaLENBQUgsQ0FBT2xoQixLQUFLRSxLQUFMLENBQVk0NkIsR0FBRzVaLENBQWYsQ0FBZCxDQUNBLE1BRUQsd0JBQUEsQ0FFQzRaLEdBQUc1WixDQUFILENBQU80WixHQUFHNVosQ0FBSCxDQUFPLENBQVAsQ0FBVyxDQUFYLENBQWUsQ0FBdEIsQ0FDQSxNQUVELDJCQUFBLENBRUMsR0FBS2xoQixLQUFLeWtCLEdBQUwsQ0FBVXprQixLQUFLRSxLQUFMLENBQVk0NkIsR0FBRzVaLENBQWYsRUFBcUIsQ0FBL0IsSUFBdUMsQ0FBNUMsQ0FBZ0QsQ0FFL0M0WixHQUFHNVosQ0FBSCxDQUFPbGhCLEtBQUtDLElBQUwsQ0FBVzY2QixHQUFHNVosQ0FBZCxFQUFvQjRaLEdBQUc1WixDQUE5QixDQUVBLENBSkQsSUFJTyxDQUVONFosR0FBRzVaLENBQUgsQ0FBTzRaLEdBQUc1WixDQUFILENBQU9saEIsS0FBS0UsS0FBTCxDQUFZNDZCLEdBQUc1WixDQUFmLENBQWQsQ0FFQSxDQUNELE1BdkJGLENBMkJBLENBRUQsR0FBSyxLQUFLb1ksS0FBVixDQUFrQixDQUVqQndCLEdBQUc1WixDQUFILENBQU8sRUFBSTRaLEdBQUc1WixDQUFkLENBRUEsQ0FFRCxDQTFQNkUsQ0FBM0QsQ0FBcEIsQ0E4UEE5cEIsT0FBT3dLLGNBQVAsQ0FBdUI2MkIsUUFBUXBoQyxTQUEvQixDQUEwQyxhQUExQyxDQUF5RCxDQUV4RG9YLElBQUssU0FBVzNULEtBQVgsQ0FBbUIsQ0FFdkIsR0FBS0EsUUFBVSxJQUFmLENBQXNCLEtBQUttRyxPQUFMLEdBRXRCLENBTnVELENBQXpELEVBVUE7Ozs7OztLQVFBLGdCQUFBLENBQWtCeVAsQ0FBbEIsQ0FBcUJ3USxDQUFyQixDQUF3QjZHLENBQXhCLENBQTJCdFIsQ0FBM0IsQ0FBK0IsQ0FFOUIsS0FBSy9GLENBQUwsQ0FBU0EsR0FBSyxDQUFkLENBQ0EsS0FBS3dRLENBQUwsQ0FBU0EsR0FBSyxDQUFkLENBQ0EsS0FBSzZHLENBQUwsQ0FBU0EsR0FBSyxDQUFkLENBQ0EsS0FBS3RSLENBQUwsQ0FBV0EsSUFBTWhhLFNBQVIsQ0FBc0JnYSxDQUF0QixDQUEwQixDQUFuQyxDQUVBLENBRURyZixPQUFPNG5CLE1BQVAsQ0FBZStiLFFBQVExakMsU0FBdkIsQ0FBa0MsQ0FFakMyakMsVUFBVyxJQUZzQixDQUlqQ3ZzQixJQUFLLFNBQVdpQyxDQUFYLENBQWN3USxDQUFkLENBQWlCNkcsQ0FBakIsQ0FBb0J0UixDQUFwQixDQUF3QixDQUU1QixLQUFLL0YsQ0FBTCxDQUFTQSxDQUFULENBQ0EsS0FBS3dRLENBQUwsQ0FBU0EsQ0FBVCxDQUNBLEtBQUs2RyxDQUFMLENBQVNBLENBQVQsQ0FDQSxLQUFLdFIsQ0FBTCxDQUFTQSxDQUFULENBRUEsV0FBQSxDQUVBLENBYmdDLENBZWpDK0wsVUFBVyxTQUFXQyxNQUFYLENBQW9CLENBRTlCLEtBQUsvUixDQUFMLENBQVMrUixNQUFULENBQ0EsS0FBS3ZCLENBQUwsQ0FBU3VCLE1BQVQsQ0FDQSxLQUFLc0YsQ0FBTCxDQUFTdEYsTUFBVCxDQUNBLEtBQUtoTSxDQUFMLENBQVNnTSxNQUFULENBRUEsV0FBQSxDQUVBLENBeEJnQyxDQTBCakNDLEtBQU0sU0FBV2hTLENBQVgsQ0FBZSxDQUVwQixLQUFLQSxDQUFMLENBQVNBLENBQVQsQ0FFQSxXQUFBLENBRUEsQ0FoQ2dDLENBa0NqQ2lTLEtBQU0sU0FBV3pCLENBQVgsQ0FBZSxDQUVwQixLQUFLQSxDQUFMLENBQVNBLENBQVQsQ0FFQSxXQUFBLENBRUEsQ0F4Q2dDLENBMENqQ3VULEtBQU0sU0FBVzFNLENBQVgsQ0FBZSxDQUVwQixLQUFLQSxDQUFMLENBQVNBLENBQVQsQ0FFQSxXQUFBLENBRUEsQ0FoRGdDLENBa0RqQ2tULEtBQU0sU0FBV3hrQixDQUFYLENBQWUsQ0FFcEIsS0FBS0EsQ0FBTCxDQUFTQSxDQUFULENBRUEsV0FBQSxDQUVBLENBeERnQyxDQTBEakNtTSxhQUFjLFNBQVc3ZCxLQUFYLENBQWtCakssS0FBbEIsQ0FBMEIsQ0FFdkMsT0FBU2lLLEtBQVQsRUFFQyxNQUFBLENBQVEsS0FBSzJMLENBQUwsQ0FBUzVWLEtBQVQsQ0FBZ0IsTUFDeEIsTUFBQSxDQUFRLEtBQUtvbUIsQ0FBTCxDQUFTcG1CLEtBQVQsQ0FBZ0IsTUFDeEIsTUFBQSxDQUFRLEtBQUtpdEIsQ0FBTCxDQUFTanRCLEtBQVQsQ0FBZ0IsTUFDeEIsTUFBQSxDQUFRLEtBQUsyYixDQUFMLENBQVMzYixLQUFULENBQWdCLE1BQ3hCLFFBQVMsZUFBTSxDQUFXLDBCQUE0QmlLLEtBQXZDLENBQU4sQ0FOVixDQVVBLFdBQUEsQ0FFQSxDQXhFZ0MsQ0EwRWpDOGQsYUFBYyxTQUFXOWQsS0FBWCxDQUFtQixDQUVoQyxPQUFTQSxLQUFULEVBRUMsTUFBQSxDQUFRLFlBQVkyTCxDQUFaLENBQ1IsTUFBQSxDQUFRLFlBQVl3USxDQUFaLENBQ1IsTUFBQSxDQUFRLFlBQVk2RyxDQUFaLENBQ1IsTUFBQSxDQUFRLFlBQVl0UixDQUFaLENBQ1IsUUFBUyxlQUFNLENBQVcsMEJBQTRCMVIsS0FBdkMsQ0FBTixDQU5WLENBVUEsQ0F0RmdDLENBd0ZqQytkLE1BQU8sVUFBWSxDQUVsQixnQkFBZ0JucEIsV0FBVCxDQUFzQixLQUFLK1csQ0FBM0IsQ0FBOEIsS0FBS3dRLENBQW5DLENBQXNDLEtBQUs2RyxDQUEzQyxDQUE4QyxLQUFLdFIsQ0FBbkQsQ0FBUCxDQUVBLENBNUZnQyxDQThGakNzTSxLQUFNLFNBQVd2UyxDQUFYLENBQWUsQ0FFcEIsS0FBS0UsQ0FBTCxDQUFTRixFQUFFRSxDQUFYLENBQ0EsS0FBS3dRLENBQUwsQ0FBUzFRLEVBQUUwUSxDQUFYLENBQ0EsS0FBSzZHLENBQUwsQ0FBU3ZYLEVBQUV1WCxDQUFYLENBQ0EsS0FBS3RSLENBQUwsQ0FBV2pHLEVBQUVpRyxDQUFGLEdBQVFoYSxTQUFWLENBQXdCK1QsRUFBRWlHLENBQTFCLENBQThCLENBQXZDLENBRUEsV0FBQSxDQUVBLENBdkdnQyxDQXlHakN1TSxJQUFLLFNBQVd4UyxDQUFYLENBQWNpRyxDQUFkLENBQWtCLENBRXRCLEdBQUtBLElBQU1oYSxTQUFYLENBQXVCLENBRXRCMlcsUUFBUTZQLElBQVIsQ0FBYyx1RkFBZCxFQUNBLFlBQVlDLFVBQUwsQ0FBaUIxUyxDQUFqQixDQUFvQmlHLENBQXBCLENBQVAsQ0FFQSxDQUVELEtBQUsvRixDQUFMLEVBQVVGLEVBQUVFLENBQVosQ0FDQSxLQUFLd1EsQ0FBTCxFQUFVMVEsRUFBRTBRLENBQVosQ0FDQSxLQUFLNkcsQ0FBTCxFQUFVdlgsRUFBRXVYLENBQVosQ0FDQSxLQUFLdFIsQ0FBTCxFQUFVakcsRUFBRWlHLENBQVosQ0FFQSxXQUFBLENBRUEsQ0F6SGdDLENBMkhqQzBNLFVBQVcsU0FBV3ppQixDQUFYLENBQWUsQ0FFekIsS0FBS2dRLENBQUwsRUFBVWhRLENBQVYsQ0FDQSxLQUFLd2dCLENBQUwsRUFBVXhnQixDQUFWLENBQ0EsS0FBS3FuQixDQUFMLEVBQVVybkIsQ0FBVixDQUNBLEtBQUsrVixDQUFMLEVBQVUvVixDQUFWLENBRUEsV0FBQSxDQUVBLENBcElnQyxDQXNJakN3aUIsV0FBWSxTQUFXcmlCLENBQVgsQ0FBY0YsQ0FBZCxDQUFrQixDQUU3QixLQUFLK1AsQ0FBTCxDQUFTN1AsRUFBRTZQLENBQUYsQ0FBTS9QLEVBQUUrUCxDQUFqQixDQUNBLEtBQUt3USxDQUFMLENBQVNyZ0IsRUFBRXFnQixDQUFGLENBQU12Z0IsRUFBRXVnQixDQUFqQixDQUNBLEtBQUs2RyxDQUFMLENBQVNsbkIsRUFBRWtuQixDQUFGLENBQU1wbkIsRUFBRW9uQixDQUFqQixDQUNBLEtBQUt0UixDQUFMLENBQVM1VixFQUFFNFYsQ0FBRixDQUFNOVYsRUFBRThWLENBQWpCLENBRUEsV0FBQSxDQUVBLENBL0lnQyxDQWlKakMyTSxnQkFBaUIsU0FBVzVTLENBQVgsQ0FBYzlQLENBQWQsQ0FBa0IsQ0FFbEMsS0FBS2dRLENBQUwsRUFBVUYsRUFBRUUsQ0FBRixDQUFNaFEsQ0FBaEIsQ0FDQSxLQUFLd2dCLENBQUwsRUFBVTFRLEVBQUUwUSxDQUFGLENBQU14Z0IsQ0FBaEIsQ0FDQSxLQUFLcW5CLENBQUwsRUFBVXZYLEVBQUV1WCxDQUFGLENBQU1ybkIsQ0FBaEIsQ0FDQSxLQUFLK1YsQ0FBTCxFQUFVakcsRUFBRWlHLENBQUYsQ0FBTS9WLENBQWhCLENBRUEsV0FBQSxDQUVBLENBMUpnQyxDQTRKakMyaUIsSUFBSyxTQUFXN1MsQ0FBWCxDQUFjaUcsQ0FBZCxDQUFrQixDQUV0QixHQUFLQSxJQUFNaGEsU0FBWCxDQUF1QixDQUV0QjJXLFFBQVE2UCxJQUFSLENBQWMsdUZBQWQsRUFDQSxZQUFZSyxVQUFMLENBQWlCOVMsQ0FBakIsQ0FBb0JpRyxDQUFwQixDQUFQLENBRUEsQ0FFRCxLQUFLL0YsQ0FBTCxFQUFVRixFQUFFRSxDQUFaLENBQ0EsS0FBS3dRLENBQUwsRUFBVTFRLEVBQUUwUSxDQUFaLENBQ0EsS0FBSzZHLENBQUwsRUFBVXZYLEVBQUV1WCxDQUFaLENBQ0EsS0FBS3RSLENBQUwsRUFBVWpHLEVBQUVpRyxDQUFaLENBRUEsV0FBQSxDQUVBLENBNUtnQyxDQThLakM4TSxVQUFXLFNBQVc3aUIsQ0FBWCxDQUFlLENBRXpCLEtBQUtnUSxDQUFMLEVBQVVoUSxDQUFWLENBQ0EsS0FBS3dnQixDQUFMLEVBQVV4Z0IsQ0FBVixDQUNBLEtBQUtxbkIsQ0FBTCxFQUFVcm5CLENBQVYsQ0FDQSxLQUFLK1YsQ0FBTCxFQUFVL1YsQ0FBVixDQUVBLFdBQUEsQ0FFQSxDQXZMZ0MsQ0F5TGpDNGlCLFdBQVksU0FBV3ppQixDQUFYLENBQWNGLENBQWQsQ0FBa0IsQ0FFN0IsS0FBSytQLENBQUwsQ0FBUzdQLEVBQUU2UCxDQUFGLENBQU0vUCxFQUFFK1AsQ0FBakIsQ0FDQSxLQUFLd1EsQ0FBTCxDQUFTcmdCLEVBQUVxZ0IsQ0FBRixDQUFNdmdCLEVBQUV1Z0IsQ0FBakIsQ0FDQSxLQUFLNkcsQ0FBTCxDQUFTbG5CLEVBQUVrbkIsQ0FBRixDQUFNcG5CLEVBQUVvbkIsQ0FBakIsQ0FDQSxLQUFLdFIsQ0FBTCxDQUFTNVYsRUFBRTRWLENBQUYsQ0FBTTlWLEVBQUU4VixDQUFqQixDQUVBLFdBQUEsQ0FFQSxDQWxNZ0MsQ0FvTWpDZ04sZUFBZ0IsU0FBV2hCLE1BQVgsQ0FBb0IsQ0FFbkMsS0FBSy9SLENBQUwsRUFBVStSLE1BQVYsQ0FDQSxLQUFLdkIsQ0FBTCxFQUFVdUIsTUFBVixDQUNBLEtBQUtzRixDQUFMLEVBQVV0RixNQUFWLENBQ0EsS0FBS2hNLENBQUwsRUFBVWdNLE1BQVYsQ0FFQSxXQUFBLENBRUEsQ0E3TWdDLENBK01qQ3NLLGFBQWMsU0FBV3BNLENBQVgsQ0FBZSxDQUU1QixNQUFRLEtBQUtqUSxDQUFiLENBQWdCd1EsRUFBSSxLQUFLQSxDQUF6QixDQUE0QjZHLEVBQUksS0FBS0EsQ0FBckMsQ0FBd0N0UixFQUFJLEtBQUtBLENBQWpELENBQ0EsTUFBUWtLLEVBQUVrRCxRQUFWLENBRUEsS0FBS25ULENBQUwsQ0FBUzVRLEVBQUcsQ0FBSCxFQUFTNFEsQ0FBVCxDQUFhNVEsRUFBRyxDQUFILEVBQVNvaEIsQ0FBdEIsQ0FBMEJwaEIsRUFBRyxDQUFILEVBQVNpb0IsQ0FBbkMsQ0FBdUNqb0IsRUFBRyxFQUFILEVBQVUyVyxDQUExRCxDQUNBLEtBQUt5SyxDQUFMLENBQVNwaEIsRUFBRyxDQUFILEVBQVM0USxDQUFULENBQWE1USxFQUFHLENBQUgsRUFBU29oQixDQUF0QixDQUEwQnBoQixFQUFHLENBQUgsRUFBU2lvQixDQUFuQyxDQUF1Q2pvQixFQUFHLEVBQUgsRUFBVTJXLENBQTFELENBQ0EsS0FBS3NSLENBQUwsQ0FBU2pvQixFQUFHLENBQUgsRUFBUzRRLENBQVQsQ0FBYTVRLEVBQUcsQ0FBSCxFQUFTb2hCLENBQXRCLENBQTBCcGhCLEVBQUcsRUFBSCxFQUFVaW9CLENBQXBDLENBQXdDam9CLEVBQUcsRUFBSCxFQUFVMlcsQ0FBM0QsQ0FDQSxLQUFLQSxDQUFMLENBQVMzVyxFQUFHLENBQUgsRUFBUzRRLENBQVQsQ0FBYTVRLEVBQUcsQ0FBSCxFQUFTb2hCLENBQXRCLENBQTBCcGhCLEVBQUcsRUFBSCxFQUFVaW9CLENBQXBDLENBQXdDam9CLEVBQUcsRUFBSCxFQUFVMlcsQ0FBM0QsQ0FFQSxXQUFBLENBRUEsQ0EzTmdDLENBNk5qQ2tOLGFBQWMsU0FBV2xCLE1BQVgsQ0FBb0IsQ0FFakMsWUFBWWdCLGNBQUwsQ0FBcUIsRUFBSWhCLE1BQXpCLENBQVAsQ0FFQSxDQWpPZ0MsQ0FtT2pDeVksMkJBQTRCLFNBQVc1UixDQUFYLENBQWU7RUFJMUM7RUFFQSxLQUFLN1MsQ0FBTCxDQUFTLEVBQUl6VyxLQUFLeTJCLElBQUwsQ0FBV25OLEVBQUU3UyxDQUFiLENBQWIsQ0FFQSxNQUFRelcsS0FBS3VrQixJQUFMLENBQVcsRUFBSStFLEVBQUU3UyxDQUFGLENBQU02UyxFQUFFN1MsQ0FBdkIsQ0FBUixDQUVBLEdBQUsvVixFQUFJLE1BQVQsQ0FBa0IsQ0FFakIsS0FBS2dRLENBQUwsQ0FBUyxDQUFULENBQ0EsS0FBS3dRLENBQUwsQ0FBUyxDQUFULENBQ0EsS0FBSzZHLENBQUwsQ0FBUyxDQUFULENBRUEsQ0FORCxJQU1PLENBRU4sS0FBS3JYLENBQUwsQ0FBUzRZLEVBQUU1WSxDQUFGLENBQU1oUSxDQUFmLENBQ0EsS0FBS3dnQixDQUFMLENBQVNvSSxFQUFFcEksQ0FBRixDQUFNeGdCLENBQWYsQ0FDQSxLQUFLcW5CLENBQUwsQ0FBU3VCLEVBQUV2QixDQUFGLENBQU1ybkIsQ0FBZixDQUVBLENBRUQsV0FBQSxDQUVBLENBN1BnQyxDQStQakN5NkIsK0JBQWdDLFNBQVd4YSxDQUFYLENBQWU7RUFJOUM7RUFFQSxTQUFBLENBQVdqUSxDQUFYLENBQWN3USxDQUFkLENBQWlCNkcsQ0FBakI7RUFDQ3FULFFBQVUsSUFEWDtFQUVDQyxTQUFXLEdBRlo7RUFJQ2hVLEdBQUsxRyxFQUFFa0QsUUFKUixDQU1DME8sSUFBTWxMLEdBQUksQ0FBSixDQU5QLENBTWdCbUwsSUFBTW5MLEdBQUksQ0FBSixDQU50QixDQU0rQm9MLElBQU1wTCxHQUFJLENBQUosQ0FOckMsQ0FPQ3FMLElBQU1yTCxHQUFJLENBQUosQ0FQUCxDQU9nQnNMLElBQU10TCxHQUFJLENBQUosQ0FQdEIsQ0FPK0J1TCxJQUFNdkwsR0FBSSxDQUFKLENBUHJDLENBUUN3TCxJQUFNeEwsR0FBSSxDQUFKLENBUlAsQ0FRZ0J5TCxJQUFNekwsR0FBSSxDQUFKLENBUnRCLENBUStCMEwsSUFBTTFMLEdBQUksRUFBSixDQVJyQyxDQVVBLEdBQU9ybkIsS0FBS3lrQixHQUFMLENBQVUrTixJQUFNRSxHQUFoQixFQUF3QjBJLE9BQTFCLEVBQ0VwN0IsS0FBS3lrQixHQUFMLENBQVVnTyxJQUFNSSxHQUFoQixFQUF3QnVJLE9BRDFCLEVBRUVwN0IsS0FBS3lrQixHQUFMLENBQVVtTyxJQUFNRSxHQUFoQixFQUF3QnNJLE9BRi9CLENBRTJDO0VBRzFDO0VBQ0E7RUFFQSxHQUFPcDdCLEtBQUt5a0IsR0FBTCxDQUFVK04sSUFBTUUsR0FBaEIsRUFBd0IySSxRQUExQixFQUNFcjdCLEtBQUt5a0IsR0FBTCxDQUFVZ08sSUFBTUksR0FBaEIsRUFBd0J3SSxRQUQxQixFQUVFcjdCLEtBQUt5a0IsR0FBTCxDQUFVbU8sSUFBTUUsR0FBaEIsRUFBd0J1SSxRQUYxQixFQUdFcjdCLEtBQUt5a0IsR0FBTCxDQUFVOE4sSUFBTUksR0FBTixDQUFZSSxHQUFaLENBQWtCLENBQTVCLEVBQWtDc0ksUUFIekMsQ0FHc0Q7RUFJckQsS0FBSzVzQixHQUFMLENBQVUsQ0FBVixDQUFhLENBQWIsQ0FBZ0IsQ0FBaEIsQ0FBbUIsQ0FBbkIsRUFFQSxXQUFBLENBQWE7RUFFYixDQUVEO0VBRUFrVyxNQUFRM2tCLEtBQUsrZixFQUFiLENBRUEsT0FBUyxDQUFFd1MsSUFBTSxDQUFSLEVBQWMsQ0FBdkIsQ0FDQSxPQUFTLENBQUVJLElBQU0sQ0FBUixFQUFjLENBQXZCLENBQ0EsT0FBUyxDQUFFSSxJQUFNLENBQVIsRUFBYyxDQUF2QixDQUNBLE9BQVMsQ0FBRVAsSUFBTUUsR0FBUixFQUFnQixDQUF6QixDQUNBLE9BQVMsQ0FBRUQsSUFBTUksR0FBUixFQUFnQixDQUF6QixDQUNBLE9BQVMsQ0FBRUQsSUFBTUUsR0FBUixFQUFnQixDQUF6QixDQUVBLEdBQU8xSSxHQUFLRCxFQUFQLEVBQWlCQyxHQUFLSixFQUEzQixDQUFrQztFQUlqQyxHQUFLSSxHQUFLZ1IsT0FBVixDQUFvQixDQUVuQjFxQixFQUFJLENBQUosQ0FDQXdRLEVBQUksV0FBSixDQUNBNkcsRUFBSSxXQUFKLENBRUEsQ0FORCxJQU1PLENBRU5yWCxFQUFJMVEsS0FBS3VrQixJQUFMLENBQVc2RixFQUFYLENBQUosQ0FDQWxKLEVBQUkySSxHQUFLblosQ0FBVCxDQUNBcVgsRUFBSStCLEdBQUtwWixDQUFULENBRUEsQ0FFRCxDQWxCRCxRQWtCWXlaLEdBQUtILEVBQVYsQ0FBZTtFQUlyQixHQUFLRyxHQUFLaVIsT0FBVixDQUFvQixDQUVuQjFxQixFQUFJLFdBQUosQ0FDQXdRLEVBQUksQ0FBSixDQUNBNkcsRUFBSSxXQUFKLENBRUEsQ0FORCxJQU1PLENBRU43RyxFQUFJbGhCLEtBQUt1a0IsSUFBTCxDQUFXNEYsRUFBWCxDQUFKLENBQ0F6WixFQUFJbVosR0FBSzNJLENBQVQsQ0FDQTZHLEVBQUlnQyxHQUFLN0ksQ0FBVCxDQUVBLENBRUQsQ0FsQk0sSUFrQkE7RUFJTixHQUFLOEksR0FBS29SLE9BQVYsQ0FBb0IsQ0FFbkIxcUIsRUFBSSxXQUFKLENBQ0F3USxFQUFJLFdBQUosQ0FDQTZHLEVBQUksQ0FBSixDQUVBLENBTkQsSUFNTyxDQUVOQSxFQUFJL25CLEtBQUt1a0IsSUFBTCxDQUFXeUYsRUFBWCxDQUFKLENBQ0F0WixFQUFJb1osR0FBSy9CLENBQVQsQ0FDQTdHLEVBQUk2SSxHQUFLaEMsQ0FBVCxDQUVBLENBRUQsQ0FFRCxLQUFLdFosR0FBTCxDQUFVaUMsQ0FBVixDQUFhd1EsQ0FBYixDQUFnQjZHLENBQWhCLENBQW1CcEQsS0FBbkIsRUFFQSxXQUFBLENBQWE7RUFFYixDQUVEO0VBRUEsTUFBUTNrQixLQUFLdWtCLElBQUwsQ0FBVyxDQUFFdU8sSUFBTUYsR0FBUixHQUFrQkUsSUFBTUYsR0FBeEIsRUFDQSxDQUFFSCxJQUFNSSxHQUFSLEdBQWtCSixJQUFNSSxHQUF4QixDQURBLENBRUEsQ0FBRUgsSUFBTUYsR0FBUixHQUFrQkUsSUFBTUYsR0FBeEIsQ0FGWCxDQUFSLENBRW9EO0VBRXBELEdBQUt4eUIsS0FBS3lrQixHQUFMLENBQVUvakIsQ0FBVixFQUFnQixLQUFyQixDQUE2QkEsRUFBSSxDQUFKLENBRTdCO0VBQ0E7RUFFQSxLQUFLZ1EsQ0FBTCxDQUFTLENBQUVvaUIsSUFBTUYsR0FBUixFQUFnQmx5QixDQUF6QixDQUNBLEtBQUt3Z0IsQ0FBTCxDQUFTLENBQUV1UixJQUFNSSxHQUFSLEVBQWdCbnlCLENBQXpCLENBQ0EsS0FBS3FuQixDQUFMLENBQVMsQ0FBRTJLLElBQU1GLEdBQVIsRUFBZ0I5eEIsQ0FBekIsQ0FDQSxLQUFLK1YsQ0FBTCxDQUFTelcsS0FBS3kyQixJQUFMLENBQVcsQ0FBRWxFLElBQU1JLEdBQU4sQ0FBWUksR0FBWixDQUFrQixDQUFwQixFQUEwQixDQUFyQyxDQUFULENBRUEsV0FBQSxDQUVBLENBL1hnQyxDQWlZakNsdUIsSUFBSyxTQUFXMkwsQ0FBWCxDQUFlLENBRW5CLEtBQUtFLENBQUwsQ0FBUzFRLEtBQUs2RSxHQUFMLENBQVUsS0FBSzZMLENBQWYsQ0FBa0JGLEVBQUVFLENBQXBCLENBQVQsQ0FDQSxLQUFLd1EsQ0FBTCxDQUFTbGhCLEtBQUs2RSxHQUFMLENBQVUsS0FBS3FjLENBQWYsQ0FBa0IxUSxFQUFFMFEsQ0FBcEIsQ0FBVCxDQUNBLEtBQUs2RyxDQUFMLENBQVMvbkIsS0FBSzZFLEdBQUwsQ0FBVSxLQUFLa2pCLENBQWYsQ0FBa0J2WCxFQUFFdVgsQ0FBcEIsQ0FBVCxDQUNBLEtBQUt0UixDQUFMLENBQVN6VyxLQUFLNkUsR0FBTCxDQUFVLEtBQUs0UixDQUFmLENBQWtCakcsRUFBRWlHLENBQXBCLENBQVQsQ0FFQSxXQUFBLENBRUEsQ0ExWWdDLENBNFlqQzNSLElBQUssU0FBVzBMLENBQVgsQ0FBZSxDQUVuQixLQUFLRSxDQUFMLENBQVMxUSxLQUFLOEUsR0FBTCxDQUFVLEtBQUs0TCxDQUFmLENBQWtCRixFQUFFRSxDQUFwQixDQUFULENBQ0EsS0FBS3dRLENBQUwsQ0FBU2xoQixLQUFLOEUsR0FBTCxDQUFVLEtBQUtvYyxDQUFmLENBQWtCMVEsRUFBRTBRLENBQXBCLENBQVQsQ0FDQSxLQUFLNkcsQ0FBTCxDQUFTL25CLEtBQUs4RSxHQUFMLENBQVUsS0FBS2lqQixDQUFmLENBQWtCdlgsRUFBRXVYLENBQXBCLENBQVQsQ0FDQSxLQUFLdFIsQ0FBTCxDQUFTelcsS0FBSzhFLEdBQUwsQ0FBVSxLQUFLMlIsQ0FBZixDQUFrQmpHLEVBQUVpRyxDQUFwQixDQUFULENBRUEsV0FBQSxDQUVBLENBclpnQyxDQXVaakMrSixNQUFPLFNBQVczYixHQUFYLENBQWdCQyxHQUFoQixDQUFzQjtFQUk1QixLQUFLNEwsQ0FBTCxDQUFTMVEsS0FBSzhFLEdBQUwsQ0FBVUQsSUFBSTZMLENBQWQsQ0FBaUIxUSxLQUFLNkUsR0FBTCxDQUFVQyxJQUFJNEwsQ0FBZCxDQUFpQixLQUFLQSxDQUF0QixDQUFqQixDQUFULENBQ0EsS0FBS3dRLENBQUwsQ0FBU2xoQixLQUFLOEUsR0FBTCxDQUFVRCxJQUFJcWMsQ0FBZCxDQUFpQmxoQixLQUFLNkUsR0FBTCxDQUFVQyxJQUFJb2MsQ0FBZCxDQUFpQixLQUFLQSxDQUF0QixDQUFqQixDQUFULENBQ0EsS0FBSzZHLENBQUwsQ0FBUy9uQixLQUFLOEUsR0FBTCxDQUFVRCxJQUFJa2pCLENBQWQsQ0FBaUIvbkIsS0FBSzZFLEdBQUwsQ0FBVUMsSUFBSWlqQixDQUFkLENBQWlCLEtBQUtBLENBQXRCLENBQWpCLENBQVQsQ0FDQSxLQUFLdFIsQ0FBTCxDQUFTelcsS0FBSzhFLEdBQUwsQ0FBVUQsSUFBSTRSLENBQWQsQ0FBaUJ6VyxLQUFLNkUsR0FBTCxDQUFVQyxJQUFJMlIsQ0FBZCxDQUFpQixLQUFLQSxDQUF0QixDQUFqQixDQUFULENBRUEsV0FBQSxDQUVBLENBbGFnQyxDQW9hakNxTixZQUFhLFVBQVksQ0FFeEIsT0FBQSxDQUFTaGYsR0FBVCxDQUVBLDJCQUFPLENBQXNCaWYsTUFBdEIsQ0FBOEJDLE1BQTlCLENBQXVDLENBRTdDLEdBQUtuZixNQUFRcEksU0FBYixDQUF5QixDQUV4Qm9JLElBQU0sV0FBQSxFQUFOLENBQ0FDLElBQU0sV0FBQSxFQUFOLENBRUEsQ0FFREQsSUFBSTRKLEdBQUosQ0FBU3NWLE1BQVQsQ0FBaUJBLE1BQWpCLENBQXlCQSxNQUF6QixDQUFpQ0EsTUFBakMsRUFDQWpmLElBQUkySixHQUFKLENBQVN1VixNQUFULENBQWlCQSxNQUFqQixDQUF5QkEsTUFBekIsQ0FBaUNBLE1BQWpDLEVBRUEsWUFBWXhELEtBQUwsQ0FBWTNiLEdBQVosQ0FBaUJDLEdBQWpCLENBQVAsQ0FFQSxDQWRELENBZ0JBLENBcEJZLEVBcGFvQixDQTBiakNtZixZQUFhLFNBQVdwZixHQUFYLENBQWdCQyxHQUFoQixDQUFzQixDQUVsQyxXQUFhLEtBQUtoSCxNQUFMLEVBQWIsQ0FFQSxZQUFZNmxCLFlBQUwsQ0FBbUI3bEIsUUFBVSxDQUE3QixFQUFpQzJsQixjQUFqQyxDQUFpRHpqQixLQUFLOEUsR0FBTCxDQUFVRCxHQUFWLENBQWU3RSxLQUFLNkUsR0FBTCxDQUFVQyxHQUFWLENBQWVoSCxNQUFmLENBQWYsQ0FBakQsQ0FBUCxDQUVBLENBaGNnQyxDQWtjakNvQyxNQUFPLFVBQVksQ0FFbEIsS0FBS3dRLENBQUwsQ0FBUzFRLEtBQUtFLEtBQUwsQ0FBWSxLQUFLd1EsQ0FBakIsQ0FBVCxDQUNBLEtBQUt3USxDQUFMLENBQVNsaEIsS0FBS0UsS0FBTCxDQUFZLEtBQUtnaEIsQ0FBakIsQ0FBVCxDQUNBLEtBQUs2RyxDQUFMLENBQVMvbkIsS0FBS0UsS0FBTCxDQUFZLEtBQUs2bkIsQ0FBakIsQ0FBVCxDQUNBLEtBQUt0UixDQUFMLENBQVN6VyxLQUFLRSxLQUFMLENBQVksS0FBS3VXLENBQWpCLENBQVQsQ0FFQSxXQUFBLENBRUEsQ0EzY2dDLENBNmNqQ3hXLEtBQU0sVUFBWSxDQUVqQixLQUFLeVEsQ0FBTCxDQUFTMVEsS0FBS0MsSUFBTCxDQUFXLEtBQUt5USxDQUFoQixDQUFULENBQ0EsS0FBS3dRLENBQUwsQ0FBU2xoQixLQUFLQyxJQUFMLENBQVcsS0FBS2loQixDQUFoQixDQUFULENBQ0EsS0FBSzZHLENBQUwsQ0FBUy9uQixLQUFLQyxJQUFMLENBQVcsS0FBSzhuQixDQUFoQixDQUFULENBQ0EsS0FBS3RSLENBQUwsQ0FBU3pXLEtBQUtDLElBQUwsQ0FBVyxLQUFLd1csQ0FBaEIsQ0FBVCxDQUVBLFdBQUEsQ0FFQSxDQXRkZ0MsQ0F3ZGpDeU4sTUFBTyxVQUFZLENBRWxCLEtBQUt4VCxDQUFMLENBQVMxUSxLQUFLa2tCLEtBQUwsQ0FBWSxLQUFLeFQsQ0FBakIsQ0FBVCxDQUNBLEtBQUt3USxDQUFMLENBQVNsaEIsS0FBS2trQixLQUFMLENBQVksS0FBS2hELENBQWpCLENBQVQsQ0FDQSxLQUFLNkcsQ0FBTCxDQUFTL25CLEtBQUtra0IsS0FBTCxDQUFZLEtBQUs2RCxDQUFqQixDQUFULENBQ0EsS0FBS3RSLENBQUwsQ0FBU3pXLEtBQUtra0IsS0FBTCxDQUFZLEtBQUt6TixDQUFqQixDQUFULENBRUEsV0FBQSxDQUVBLENBamVnQyxDQW1lakMwTixZQUFhLFVBQVksQ0FFeEIsS0FBS3pULENBQUwsQ0FBVyxLQUFLQSxDQUFMLENBQVMsQ0FBWCxDQUFpQjFRLEtBQUtDLElBQUwsQ0FBVyxLQUFLeVEsQ0FBaEIsQ0FBakIsQ0FBdUMxUSxLQUFLRSxLQUFMLENBQVksS0FBS3dRLENBQWpCLENBQWhELENBQ0EsS0FBS3dRLENBQUwsQ0FBVyxLQUFLQSxDQUFMLENBQVMsQ0FBWCxDQUFpQmxoQixLQUFLQyxJQUFMLENBQVcsS0FBS2loQixDQUFoQixDQUFqQixDQUF1Q2xoQixLQUFLRSxLQUFMLENBQVksS0FBS2doQixDQUFqQixDQUFoRCxDQUNBLEtBQUs2RyxDQUFMLENBQVcsS0FBS0EsQ0FBTCxDQUFTLENBQVgsQ0FBaUIvbkIsS0FBS0MsSUFBTCxDQUFXLEtBQUs4bkIsQ0FBaEIsQ0FBakIsQ0FBdUMvbkIsS0FBS0UsS0FBTCxDQUFZLEtBQUs2bkIsQ0FBakIsQ0FBaEQsQ0FDQSxLQUFLdFIsQ0FBTCxDQUFXLEtBQUtBLENBQUwsQ0FBUyxDQUFYLENBQWlCelcsS0FBS0MsSUFBTCxDQUFXLEtBQUt3VyxDQUFoQixDQUFqQixDQUF1Q3pXLEtBQUtFLEtBQUwsQ0FBWSxLQUFLdVcsQ0FBakIsQ0FBaEQsQ0FFQSxXQUFBLENBRUEsQ0E1ZWdDLENBOGVqQzJOLE9BQVEsVUFBWSxDQUVuQixLQUFLMVQsQ0FBTCxDQUFTLENBQUUsS0FBS0EsQ0FBaEIsQ0FDQSxLQUFLd1EsQ0FBTCxDQUFTLENBQUUsS0FBS0EsQ0FBaEIsQ0FDQSxLQUFLNkcsQ0FBTCxDQUFTLENBQUUsS0FBS0EsQ0FBaEIsQ0FDQSxLQUFLdFIsQ0FBTCxDQUFTLENBQUUsS0FBS0EsQ0FBaEIsQ0FFQSxXQUFBLENBRUEsQ0F2ZmdDLENBeWZqQzROLElBQUssU0FBVzdULENBQVgsQ0FBZSxDQUVuQixZQUFZRSxDQUFMLENBQVNGLEVBQUVFLENBQVgsQ0FBZSxLQUFLd1EsQ0FBTCxDQUFTMVEsRUFBRTBRLENBQTFCLENBQThCLEtBQUs2RyxDQUFMLENBQVN2WCxFQUFFdVgsQ0FBekMsQ0FBNkMsS0FBS3RSLENBQUwsQ0FBU2pHLEVBQUVpRyxDQUEvRCxDQUVBLENBN2ZnQyxDQStmakM2TixTQUFVLFVBQVksQ0FFckIsWUFBWTVULENBQUwsQ0FBUyxLQUFLQSxDQUFkLENBQWtCLEtBQUt3USxDQUFMLENBQVMsS0FBS0EsQ0FBaEMsQ0FBb0MsS0FBSzZHLENBQUwsQ0FBUyxLQUFLQSxDQUFsRCxDQUFzRCxLQUFLdFIsQ0FBTCxDQUFTLEtBQUtBLENBQTNFLENBRUEsQ0FuZ0JnQyxDQXFnQmpDM1ksT0FBUSxVQUFZLENBRW5CLFlBQVl5bUIsSUFBTCxDQUFXLEtBQUs3VCxDQUFMLENBQVMsS0FBS0EsQ0FBZCxDQUFrQixLQUFLd1EsQ0FBTCxDQUFTLEtBQUtBLENBQWhDLENBQW9DLEtBQUs2RyxDQUFMLENBQVMsS0FBS0EsQ0FBbEQsQ0FBc0QsS0FBS3RSLENBQUwsQ0FBUyxLQUFLQSxDQUEvRSxDQUFQLENBRUEsQ0F6Z0JnQyxDQTJnQmpDK04sZ0JBQWlCLFVBQVksQ0FFNUIsWUFBWUMsR0FBTCxDQUFVLEtBQUsvVCxDQUFmLEVBQXFCMVEsS0FBS3lrQixHQUFMLENBQVUsS0FBS3ZELENBQWYsQ0FBckIsQ0FBMENsaEIsS0FBS3lrQixHQUFMLENBQVUsS0FBS3NELENBQWYsQ0FBMUMsQ0FBK0QvbkIsS0FBS3lrQixHQUFMLENBQVUsS0FBS2hPLENBQWYsQ0FBdEUsQ0FFQSxDQS9nQmdDLENBaWhCakNpTyxVQUFXLFVBQVksQ0FFdEIsWUFBWWYsWUFBTCxDQUFtQixLQUFLN2xCLE1BQUwsSUFBaUIsQ0FBcEMsQ0FBUCxDQUVBLENBcmhCZ0MsQ0F1aEJqQ29uQixVQUFXLFNBQVdwbkIsTUFBWCxDQUFvQixDQUU5QixZQUFZNG1CLFNBQUwsR0FBaUJqQixjQUFqQixDQUFpQzNsQixNQUFqQyxDQUFQLENBRUEsQ0EzaEJnQyxDQTZoQmpDbWpCLEtBQU0sU0FBV3pRLENBQVgsQ0FBYzJVLEtBQWQsQ0FBc0IsQ0FFM0IsS0FBS3pVLENBQUwsRUFBVSxDQUFFRixFQUFFRSxDQUFGLENBQU0sS0FBS0EsQ0FBYixFQUFtQnlVLEtBQTdCLENBQ0EsS0FBS2pFLENBQUwsRUFBVSxDQUFFMVEsRUFBRTBRLENBQUYsQ0FBTSxLQUFLQSxDQUFiLEVBQW1CaUUsS0FBN0IsQ0FDQSxLQUFLNEMsQ0FBTCxFQUFVLENBQUV2WCxFQUFFdVgsQ0FBRixDQUFNLEtBQUtBLENBQWIsRUFBbUI1QyxLQUE3QixDQUNBLEtBQUsxTyxDQUFMLEVBQVUsQ0FBRWpHLEVBQUVpRyxDQUFGLENBQU0sS0FBS0EsQ0FBYixFQUFtQjBPLEtBQTdCLENBRUEsV0FBQSxDQUVBLENBdGlCZ0MsQ0F3aUJqQ0MsWUFBYSxTQUFXQyxFQUFYLENBQWVDLEVBQWYsQ0FBbUJILEtBQW5CLENBQTJCLENBRXZDLFlBQVk3QixVQUFMLENBQWlCZ0MsRUFBakIsQ0FBcUJELEVBQXJCLEVBQTBCNUIsY0FBMUIsQ0FBMEMwQixLQUExQyxFQUFrRG5DLEdBQWxELENBQXVEcUMsRUFBdkQsQ0FBUCxDQUVBLENBNWlCZ0MsQ0E4aUJqQ0UsT0FBUSxTQUFXL1UsQ0FBWCxDQUFlLENBRXRCLFNBQWFFLENBQUYsR0FBUSxLQUFLQSxDQUFmLEVBQXdCRixFQUFFMFEsQ0FBRixHQUFRLEtBQUtBLENBQXJDLEVBQThDMVEsRUFBRXVYLENBQUYsR0FBUSxLQUFLQSxDQUEzRCxFQUFvRXZYLEVBQUVpRyxDQUFGLEdBQVEsS0FBS0EsQ0FBMUYsQ0FFQSxDQWxqQmdDLENBb2pCakMrTyxVQUFXLFNBQVd0SCxLQUFYLENBQWtCdUgsTUFBbEIsQ0FBMkIsQ0FFckMsR0FBS0EsU0FBV2hwQixTQUFoQixDQUE0QmdwQixPQUFTLENBQVQsQ0FFNUIsS0FBSy9VLENBQUwsQ0FBU3dOLE1BQU91SCxNQUFQLENBQVQsQ0FDQSxLQUFLdkUsQ0FBTCxDQUFTaEQsTUFBT3VILE9BQVMsQ0FBaEIsQ0FBVCxDQUNBLEtBQUtzQyxDQUFMLENBQVM3SixNQUFPdUgsT0FBUyxDQUFoQixDQUFULENBQ0EsS0FBS2hQLENBQUwsQ0FBU3lILE1BQU91SCxPQUFTLENBQWhCLENBQVQsQ0FFQSxXQUFBLENBRUEsQ0EvakJnQyxDQWlrQmpDQyxRQUFTLFNBQVd4SCxLQUFYLENBQWtCdUgsTUFBbEIsQ0FBMkIsQ0FFbkMsR0FBS3ZILFFBQVV6aEIsU0FBZixDQUEyQnloQixNQUFRLEVBQVIsQ0FDM0IsR0FBS3VILFNBQVdocEIsU0FBaEIsQ0FBNEJncEIsT0FBUyxDQUFULENBRTVCdkgsTUFBT3VILE1BQVAsRUFBa0IsS0FBSy9VLENBQXZCLENBQ0F3TixNQUFPdUgsT0FBUyxDQUFoQixFQUFzQixLQUFLdkUsQ0FBM0IsQ0FDQWhELE1BQU91SCxPQUFTLENBQWhCLEVBQXNCLEtBQUtzQyxDQUEzQixDQUNBN0osTUFBT3VILE9BQVMsQ0FBaEIsRUFBc0IsS0FBS2hQLENBQTNCLENBRUEsWUFBQSxDQUVBLENBN2tCZ0MsQ0Era0JqQ2tQLG9CQUFxQixTQUFXQyxTQUFYLENBQXNCN2dCLEtBQXRCLENBQTZCMGdCLE1BQTdCLENBQXNDLENBRTFELEdBQUtBLFNBQVdocEIsU0FBaEIsQ0FBNEIsQ0FFM0IyVyxRQUFRNlAsSUFBUixDQUFjLHFFQUFkLEVBRUEsQ0FFRCxLQUFLdlMsQ0FBTCxDQUFTa1YsVUFBVUMsSUFBVixDQUFnQjlnQixLQUFoQixDQUFULENBQ0EsS0FBS21jLENBQUwsQ0FBUzBFLFVBQVVFLElBQVYsQ0FBZ0IvZ0IsS0FBaEIsQ0FBVCxDQUNBLEtBQUtnakIsQ0FBTCxDQUFTbkMsVUFBVWtILElBQVYsQ0FBZ0IvbkIsS0FBaEIsQ0FBVCxDQUNBLEtBQUswUixDQUFMLENBQVNtUCxVQUFVMFYsSUFBVixDQUFnQnYyQixLQUFoQixDQUFULENBRUEsV0FBQSxDQUVBLENBOWxCZ0MsQ0FBbEMsRUFrbUJBOzs7Ozs7OztJQVdBLDBCQUFBLENBQTRCbTFCLEtBQTVCLENBQW1DQyxNQUFuQyxDQUEyQ29CLE9BQTNDLENBQXFELENBRXBELEtBQUtyQixLQUFMLENBQWFBLEtBQWIsQ0FDQSxLQUFLQyxNQUFMLENBQWNBLE1BQWQsQ0FFQSxLQUFLcUIsT0FBTCxDQUFlLFdBQUEsQ0FBYSxDQUFiLENBQWdCLENBQWhCLENBQW1CdEIsS0FBbkIsQ0FBMEJDLE1BQTFCLENBQWYsQ0FDQSxLQUFLc0IsV0FBTCxDQUFtQixLQUFuQixDQUVBLEtBQUtDLFFBQUwsQ0FBZ0IsV0FBQSxDQUFhLENBQWIsQ0FBZ0IsQ0FBaEIsQ0FBbUJ4QixLQUFuQixDQUEwQkMsTUFBMUIsQ0FBaEIsQ0FFQW9CLFFBQVVBLFNBQVcsRUFBckIsQ0FFQSxHQUFLQSxRQUFRcEQsU0FBUixHQUFzQjE3QixTQUEzQixDQUF1QzgrQixRQUFRcEQsU0FBUixDQUFvQlcsWUFBcEIsQ0FFdkMsS0FBSzZDLE9BQUwsQ0FBZSxXQUFBLENBQWFsL0IsU0FBYixDQUF3QkEsU0FBeEIsQ0FBbUM4K0IsUUFBUXZELEtBQTNDLENBQWtEdUQsUUFBUXRELEtBQTFELENBQWlFc0QsUUFBUXJELFNBQXpFLENBQW9GcUQsUUFBUXBELFNBQTVGLENBQXVHb0QsUUFBUW5ELE1BQS9HLENBQXVIbUQsUUFBUXppQyxJQUEvSCxDQUFxSXlpQyxRQUFRbEQsVUFBN0ksQ0FBeUprRCxRQUFRakQsUUFBakssQ0FBZixDQUVBLEtBQUtzRCxXQUFMLENBQW1CTCxRQUFRSyxXQUFSLEdBQXdCbi9CLFNBQXhCLENBQW9DOCtCLFFBQVFLLFdBQTVDLENBQTBELElBQTdFLENBQ0EsS0FBS0MsYUFBTCxDQUFxQk4sUUFBUU0sYUFBUixHQUEwQnAvQixTQUExQixDQUFzQzgrQixRQUFRTSxhQUE5QyxDQUE4RCxJQUFuRixDQUNBLEtBQUtDLFlBQUwsQ0FBb0JQLFFBQVFPLFlBQVIsR0FBeUJyL0IsU0FBekIsQ0FBcUM4K0IsUUFBUU8sWUFBN0MsQ0FBNEQsSUFBaEYsQ0FFQSxDQUVEQyxrQkFBa0Ixa0MsU0FBbEIsQ0FBOEJELE9BQU80bkIsTUFBUCxDQUFlNW5CLE9BQU9pQixNQUFQLENBQWU4bUIsZ0JBQWdCOW5CLFNBQS9CLENBQWYsQ0FBMkQsQ0FFeEZzQyxZQUFhb2lDLGlCQUYyRSxDQUl4RkMsb0JBQXFCLElBSm1FLENBTXhGQyxRQUFTLFNBQVcvQixLQUFYLENBQWtCQyxNQUFsQixDQUEyQixDQUVuQyxHQUFLLEtBQUtELEtBQUwsR0FBZUEsS0FBZixFQUF3QixLQUFLQyxNQUFMLEdBQWdCQSxNQUE3QyxDQUFzRCxDQUVyRCxLQUFLRCxLQUFMLENBQWFBLEtBQWIsQ0FDQSxLQUFLQyxNQUFMLENBQWNBLE1BQWQsQ0FFQSxLQUFLUyxPQUFMLEdBRUEsQ0FFRCxLQUFLYyxRQUFMLENBQWNqdEIsR0FBZCxDQUFtQixDQUFuQixDQUFzQixDQUF0QixDQUF5QnlyQixLQUF6QixDQUFnQ0MsTUFBaEMsRUFDQSxLQUFLcUIsT0FBTCxDQUFhL3NCLEdBQWIsQ0FBa0IsQ0FBbEIsQ0FBcUIsQ0FBckIsQ0FBd0J5ckIsS0FBeEIsQ0FBK0JDLE1BQS9CLEVBRUEsQ0FwQnVGLENBc0J4RnJYLE1BQU8sVUFBWSxDQUVsQixnQkFBZ0JucEIsV0FBVCxHQUF1Qm9wQixJQUF2QixDQUE2QixJQUE3QixDQUFQLENBRUEsQ0ExQnVGLENBNEJ4RkEsS0FBTSxTQUFXNWYsTUFBWCxDQUFvQixDQUV6QixLQUFLKzJCLEtBQUwsQ0FBYS8yQixPQUFPKzJCLEtBQXBCLENBQ0EsS0FBS0MsTUFBTCxDQUFjaDNCLE9BQU9nM0IsTUFBckIsQ0FFQSxLQUFLdUIsUUFBTCxDQUFjM1ksSUFBZCxDQUFvQjVmLE9BQU91NEIsUUFBM0IsRUFFQSxLQUFLQyxPQUFMLENBQWV4NEIsT0FBT3c0QixPQUFQLENBQWU3WSxLQUFmLEVBQWYsQ0FFQSxLQUFLOFksV0FBTCxDQUFtQno0QixPQUFPeTRCLFdBQTFCLENBQ0EsS0FBS0MsYUFBTCxDQUFxQjE0QixPQUFPMDRCLGFBQTVCLENBQ0EsS0FBS0MsWUFBTCxDQUFvQjM0QixPQUFPMjRCLFlBQTNCLENBRUEsV0FBQSxDQUVBLENBM0N1RixDQTZDeEZsQixRQUFTLFVBQVksQ0FFcEIsS0FBS2xiLGFBQUwsQ0FBb0IsQ0FBRTVtQixLQUFNLFNBQVIsQ0FBcEIsRUFFQSxDQWpEdUYsQ0FBM0QsQ0FBOUIsQ0FxREE7O0tBSUEsOEJBQUEsQ0FBZ0NvaEMsS0FBaEMsQ0FBdUNDLE1BQXZDLENBQStDb0IsT0FBL0MsQ0FBeUQsQ0FFeERRLGtCQUFrQmhqQyxJQUFsQixDQUF3QixJQUF4QixDQUE4Qm1oQyxLQUE5QixDQUFxQ0MsTUFBckMsQ0FBNkNvQixPQUE3QyxFQUVBLEtBQUtXLGNBQUwsQ0FBc0IsQ0FBdEIsQ0FBeUI7RUFDekIsS0FBS0MsaUJBQUwsQ0FBeUIsQ0FBekIsQ0FFQSxDQUVEQyxzQkFBc0Iva0MsU0FBdEIsQ0FBa0NELE9BQU9pQixNQUFQLENBQWUwakMsa0JBQWtCMWtDLFNBQWpDLENBQWxDLENBQ0Era0Msc0JBQXNCL2tDLFNBQXRCLENBQWdDc0MsV0FBaEMsQ0FBOEN5aUMscUJBQTlDLENBRUFBLHNCQUFzQi9rQyxTQUF0QixDQUFnQ2dsQyx1QkFBaEMsQ0FBMEQsSUFBMUQsQ0FFQTs7S0FJQSxvQkFBQSxDQUFzQjd1QixJQUF0QixDQUE0QjBzQixLQUE1QixDQUFtQ0MsTUFBbkMsQ0FBMkMvQixNQUEzQyxDQUFtRHQvQixJQUFuRCxDQUF5RGkvQixPQUF6RCxDQUFrRUMsS0FBbEUsQ0FBeUVDLEtBQXpFLENBQWdGQyxTQUFoRixDQUEyRkMsU0FBM0YsQ0FBc0dFLFVBQXRHLENBQWtIQyxRQUFsSCxDQUE2SCxDQUU1SEcsUUFBUTEvQixJQUFSLENBQWMsSUFBZCxDQUFvQixJQUFwQixDQUEwQmcvQixPQUExQixDQUFtQ0MsS0FBbkMsQ0FBMENDLEtBQTFDLENBQWlEQyxTQUFqRCxDQUE0REMsU0FBNUQsQ0FBdUVDLE1BQXZFLENBQStFdC9CLElBQS9FLENBQXFGdS9CLFVBQXJGLENBQWlHQyxRQUFqRyxFQUVBLEtBQUtSLEtBQUwsQ0FBYSxDQUFFdHFCLEtBQU1BLElBQVIsQ0FBYzBzQixNQUFPQSxLQUFyQixDQUE0QkMsT0FBUUEsTUFBcEMsQ0FBYixDQUVBLEtBQUtqQyxTQUFMLENBQWlCQSxZQUFjejdCLFNBQWQsQ0FBMEJ5N0IsU0FBMUIsQ0FBc0NvRSxhQUF2RCxDQUNBLEtBQUtuRSxTQUFMLENBQWlCQSxZQUFjMTdCLFNBQWQsQ0FBMEIwN0IsU0FBMUIsQ0FBc0NtRSxhQUF2RCxDQUVBLEtBQUtsRCxlQUFMLENBQXVCLEtBQXZCLENBQ0EsS0FBS0UsS0FBTCxDQUFhLEtBQWIsQ0FDQSxLQUFLQyxlQUFMLENBQXVCLENBQXZCLENBRUEsQ0FFRGdELFlBQVlsbEMsU0FBWixDQUF3QkQsT0FBT2lCLE1BQVAsQ0FBZW9nQyxRQUFRcGhDLFNBQXZCLENBQXhCLENBQ0FrbEMsWUFBWWxsQyxTQUFaLENBQXNCc0MsV0FBdEIsQ0FBb0M0aUMsV0FBcEMsQ0FFQUEsWUFBWWxsQyxTQUFaLENBQXNCbWxDLGFBQXRCLENBQXNDLElBQXRDLENBRUE7OztLQUtBLGFBQUEsQ0FBZTMzQixHQUFmLENBQW9CQyxHQUFwQixDQUEwQixDQUV6QixLQUFLRCxHQUFMLENBQWFBLE1BQVFwSSxTQUFWLENBQXdCb0ksR0FBeEIsQ0FBOEIsV0FBQSxDQUFhLENBQUU0M0IsUUFBZixDQUF5QixDQUFFQSxRQUEzQixDQUFxQyxDQUFFQSxRQUF2QyxDQUF6QyxDQUNBLEtBQUszM0IsR0FBTCxDQUFhQSxNQUFRckksU0FBVixDQUF3QnFJLEdBQXhCLENBQThCLFdBQUEsQ0FBYSxDQUFFMjNCLFFBQWYsQ0FBeUIsQ0FBRUEsUUFBM0IsQ0FBcUMsQ0FBRUEsUUFBdkMsQ0FBekMsQ0FFQSxDQUVEcmxDLE9BQU80bkIsTUFBUCxDQUFlMGQsS0FBS3JsQyxTQUFwQixDQUErQixDQUU5QnNsQyxPQUFRLElBRnNCLENBSTlCbHVCLElBQUssU0FBVzVKLEdBQVgsQ0FBZ0JDLEdBQWhCLENBQXNCLENBRTFCLEtBQUtELEdBQUwsQ0FBU2tlLElBQVQsQ0FBZWxlLEdBQWYsRUFDQSxLQUFLQyxHQUFMLENBQVNpZSxJQUFULENBQWVqZSxHQUFmLEVBRUEsV0FBQSxDQUVBLENBWDZCLENBYTlCODNCLGFBQWMsU0FBVzFlLEtBQVgsQ0FBbUIsQ0FFaEMsU0FBVyxDQUFFdWUsUUFBYixDQUNBLFNBQVcsQ0FBRUEsUUFBYixDQUNBLFNBQVcsQ0FBRUEsUUFBYixDQUVBLFNBQVcsQ0FBRUEsUUFBYixDQUNBLFNBQVcsQ0FBRUEsUUFBYixDQUNBLFNBQVcsQ0FBRUEsUUFBYixDQUVBLElBQU0sTUFBUSxDQUFSLENBQVc3N0IsRUFBSXNkLE1BQU1wZ0IsTUFBM0IsQ0FBbUNLLEVBQUl5QyxDQUF2QyxDQUEwQ3pDLEdBQUssQ0FBL0MsQ0FBbUQsQ0FFbEQsTUFBUStmLE1BQU8vZixDQUFQLENBQVIsQ0FDQSxNQUFRK2YsTUFBTy9mLEVBQUksQ0FBWCxDQUFSLENBQ0EsTUFBUStmLE1BQU8vZixFQUFJLENBQVgsQ0FBUixDQUVBLEdBQUt1UyxFQUFJbXNCLElBQVQsQ0FBZ0JBLEtBQU9uc0IsQ0FBUCxDQUNoQixHQUFLd1EsRUFBSTRiLElBQVQsQ0FBZ0JBLEtBQU81YixDQUFQLENBQ2hCLEdBQUs2RyxFQUFJZ1YsSUFBVCxDQUFnQkEsS0FBT2hWLENBQVAsQ0FFaEIsR0FBS3JYLEVBQUlzc0IsSUFBVCxDQUFnQkEsS0FBT3RzQixDQUFQLENBQ2hCLEdBQUt3USxFQUFJK2IsSUFBVCxDQUFnQkEsS0FBTy9iLENBQVAsQ0FDaEIsR0FBSzZHLEVBQUltVixJQUFULENBQWdCQSxLQUFPblYsQ0FBUCxDQUVoQixDQUVELEtBQUtsakIsR0FBTCxDQUFTNEosR0FBVCxDQUFjb3VCLElBQWQsQ0FBb0JDLElBQXBCLENBQTBCQyxJQUExQixFQUNBLEtBQUtqNEIsR0FBTCxDQUFTMkosR0FBVCxDQUFjdXVCLElBQWQsQ0FBb0JDLElBQXBCLENBQTBCQyxJQUExQixFQUVBLFdBQUEsQ0FFQSxDQTVDNkIsQ0E4QzlCQyx1QkFBd0IsU0FBV3ZYLFNBQVgsQ0FBdUIsQ0FFOUMsU0FBVyxDQUFFNlcsUUFBYixDQUNBLFNBQVcsQ0FBRUEsUUFBYixDQUNBLFNBQVcsQ0FBRUEsUUFBYixDQUVBLFNBQVcsQ0FBRUEsUUFBYixDQUNBLFNBQVcsQ0FBRUEsUUFBYixDQUNBLFNBQVcsQ0FBRUEsUUFBYixDQUVBLElBQU0sTUFBUSxDQUFSLENBQVc3N0IsRUFBSWdsQixVQUFVaUgsS0FBL0IsQ0FBc0MxdUIsRUFBSXlDLENBQTFDLENBQTZDekMsR0FBN0MsQ0FBb0QsQ0FFbkQsTUFBUXluQixVQUFVQyxJQUFWLENBQWdCMW5CLENBQWhCLENBQVIsQ0FDQSxNQUFReW5CLFVBQVVFLElBQVYsQ0FBZ0IzbkIsQ0FBaEIsQ0FBUixDQUNBLE1BQVF5bkIsVUFBVWtILElBQVYsQ0FBZ0IzdUIsQ0FBaEIsQ0FBUixDQUVBLEdBQUt1UyxFQUFJbXNCLElBQVQsQ0FBZ0JBLEtBQU9uc0IsQ0FBUCxDQUNoQixHQUFLd1EsRUFBSTRiLElBQVQsQ0FBZ0JBLEtBQU81YixDQUFQLENBQ2hCLEdBQUs2RyxFQUFJZ1YsSUFBVCxDQUFnQkEsS0FBT2hWLENBQVAsQ0FFaEIsR0FBS3JYLEVBQUlzc0IsSUFBVCxDQUFnQkEsS0FBT3RzQixDQUFQLENBQ2hCLEdBQUt3USxFQUFJK2IsSUFBVCxDQUFnQkEsS0FBTy9iLENBQVAsQ0FDaEIsR0FBSzZHLEVBQUltVixJQUFULENBQWdCQSxLQUFPblYsQ0FBUCxDQUVoQixDQUVELEtBQUtsakIsR0FBTCxDQUFTNEosR0FBVCxDQUFjb3VCLElBQWQsQ0FBb0JDLElBQXBCLENBQTBCQyxJQUExQixFQUNBLEtBQUtqNEIsR0FBTCxDQUFTMkosR0FBVCxDQUFjdXVCLElBQWQsQ0FBb0JDLElBQXBCLENBQTBCQyxJQUExQixFQUVBLFdBQUEsQ0FFQSxDQTdFNkIsQ0ErRTlCRSxjQUFlLFNBQVdDLE1BQVgsQ0FBb0IsQ0FFbEMsS0FBS0MsU0FBTCxHQUVBLElBQU0sTUFBUSxDQUFSLENBQVdDLEdBQUtGLE9BQU92L0IsTUFBN0IsQ0FBcUNLLEVBQUlvL0IsRUFBekMsQ0FBNkNwL0IsR0FBN0MsQ0FBb0QsQ0FFbkQsS0FBS3EvQixhQUFMLENBQW9CSCxPQUFRbC9CLENBQVIsQ0FBcEIsRUFFQSxDQUVELFdBQUEsQ0FFQSxDQTNGNkIsQ0E2RjlCcy9CLHFCQUFzQixVQUFZLENBRWpDLE9BQVMsV0FBQSxFQUFULENBRUEsb0NBQU8sQ0FBK0J6WCxNQUEvQixDQUF1QzBYLElBQXZDLENBQThDLENBRXBELGFBQWVyWSxHQUFHdEMsSUFBSCxDQUFTMmEsSUFBVCxFQUFnQmphLGNBQWhCLENBQWdDLEdBQWhDLENBQWYsQ0FFQSxLQUFLNWUsR0FBTCxDQUFTa2UsSUFBVCxDQUFlaUQsTUFBZixFQUF3QjNDLEdBQXhCLENBQTZCc2EsUUFBN0IsRUFDQSxLQUFLNzRCLEdBQUwsQ0FBU2llLElBQVQsQ0FBZWlELE1BQWYsRUFBd0JoRCxHQUF4QixDQUE2QjJhLFFBQTdCLEVBRUEsV0FBQSxDQUVBLENBVEQsQ0FXQSxDQWZxQixFQTdGUSxDQThHOUJDLGNBQWUsU0FBV2pnQyxNQUFYLENBQW9CLENBRWxDLEtBQUsyL0IsU0FBTCxHQUVBLFlBQVlPLGNBQUwsQ0FBcUJsZ0MsTUFBckIsQ0FBUCxDQUVBLENBcEg2QixDQXNIOUJtbEIsTUFBTyxVQUFZLENBRWxCLGdCQUFnQm5wQixXQUFULEdBQXVCb3BCLElBQXZCLENBQTZCLElBQTdCLENBQVAsQ0FFQSxDQTFINkIsQ0E0SDlCQSxLQUFNLFNBQVcrYSxHQUFYLENBQWlCLENBRXRCLEtBQUtqNUIsR0FBTCxDQUFTa2UsSUFBVCxDQUFlK2EsSUFBSWo1QixHQUFuQixFQUNBLEtBQUtDLEdBQUwsQ0FBU2llLElBQVQsQ0FBZSthLElBQUloNUIsR0FBbkIsRUFFQSxXQUFBLENBRUEsQ0FuSTZCLENBcUk5Qnc0QixVQUFXLFVBQVksQ0FFdEIsS0FBS3o0QixHQUFMLENBQVM2TCxDQUFULENBQWEsS0FBSzdMLEdBQUwsQ0FBU3FjLENBQVQsQ0FBYSxLQUFLcmMsR0FBTCxDQUFTa2pCLENBQVQsQ0FBYSxDQUFFMFUsUUFBekMsQ0FDQSxLQUFLMzNCLEdBQUwsQ0FBUzRMLENBQVQsQ0FBYSxLQUFLNUwsR0FBTCxDQUFTb2MsQ0FBVCxDQUFhLEtBQUtwYyxHQUFMLENBQVNpakIsQ0FBVCxDQUFhLENBQUUwVSxRQUF6QyxDQUVBLFdBQUEsQ0FFQSxDQTVJNkIsQ0E4STlCc0IsUUFBUyxVQUFZO0VBSXBCLFlBQWNqNUIsR0FBTCxDQUFTNEwsQ0FBVCxDQUFhLEtBQUs3TCxHQUFMLENBQVM2TCxDQUF4QixFQUFpQyxLQUFLNUwsR0FBTCxDQUFTb2MsQ0FBVCxDQUFhLEtBQUtyYyxHQUFMLENBQVNxYyxDQUF2RCxFQUFnRSxLQUFLcGMsR0FBTCxDQUFTaWpCLENBQVQsQ0FBYSxLQUFLbGpCLEdBQUwsQ0FBU2tqQixDQUE3RixDQUVBLENBcEo2QixDQXNKOUJpVyxVQUFXLFNBQVdqNkIsTUFBWCxDQUFvQixDQUU5QixHQUFLQSxTQUFXdEgsU0FBaEIsQ0FBNEIsQ0FFM0IyVyxRQUFRNlAsSUFBUixDQUFjLGlEQUFkLEVBQ0FsZixPQUFTLFdBQUEsRUFBVCxDQUVBLENBRUQsWUFBWWc2QixPQUFMLEdBQWlCaDZCLE9BQU8wSyxHQUFQLENBQVksQ0FBWixDQUFlLENBQWYsQ0FBa0IsQ0FBbEIsQ0FBakIsQ0FBeUMxSyxPQUFPbWYsVUFBUCxDQUFtQixLQUFLcmUsR0FBeEIsQ0FBNkIsS0FBS0MsR0FBbEMsRUFBd0MyZSxjQUF4QyxDQUF3RCxHQUF4RCxDQUFoRCxDQUVBLENBaks2QixDQW1LOUJ3YSxRQUFTLFNBQVdsNkIsTUFBWCxDQUFvQixDQUU1QixHQUFLQSxTQUFXdEgsU0FBaEIsQ0FBNEIsQ0FFM0IyVyxRQUFRNlAsSUFBUixDQUFjLCtDQUFkLEVBQ0FsZixPQUFTLFdBQUEsRUFBVCxDQUVBLENBRUQsWUFBWWc2QixPQUFMLEdBQWlCaDZCLE9BQU8wSyxHQUFQLENBQVksQ0FBWixDQUFlLENBQWYsQ0FBa0IsQ0FBbEIsQ0FBakIsQ0FBeUMxSyxPQUFPdWYsVUFBUCxDQUFtQixLQUFLeGUsR0FBeEIsQ0FBNkIsS0FBS0QsR0FBbEMsQ0FBaEQsQ0FFQSxDQTlLNkIsQ0FnTDlCMjRCLGNBQWUsU0FBV3p5QixLQUFYLENBQW1CLENBRWpDLEtBQUtsRyxHQUFMLENBQVNBLEdBQVQsQ0FBY2tHLEtBQWQsRUFDQSxLQUFLakcsR0FBTCxDQUFTQSxHQUFULENBQWNpRyxLQUFkLEVBRUEsV0FBQSxDQUVBLENBdkw2QixDQXlMOUJtekIsZUFBZ0IsU0FBV2hQLE1BQVgsQ0FBb0IsQ0FFbkMsS0FBS3JxQixHQUFMLENBQVN3ZSxHQUFULENBQWM2TCxNQUFkLEVBQ0EsS0FBS3BxQixHQUFMLENBQVNrZSxHQUFULENBQWNrTSxNQUFkLEVBRUEsV0FBQSxDQUVBLENBaE02QixDQWtNOUJpUCxlQUFnQixTQUFXMWIsTUFBWCxDQUFvQixDQUVuQyxLQUFLNWQsR0FBTCxDQUFTc2UsU0FBVCxDQUFvQixDQUFFVixNQUF0QixFQUNBLEtBQUszZCxHQUFMLENBQVNxZSxTQUFULENBQW9CVixNQUFwQixFQUVBLFdBQUEsQ0FFQSxDQXpNNkIsQ0EyTTlCb2IsZUFBZ0IsVUFBWTtFQUczQjtFQUVBLFNBQUEsQ0FBVzEvQixDQUFYLENBQWN5QyxDQUFkLENBRUEsT0FBUyxXQUFBLEVBQVQsQ0FFQSxpQkFBQSxDQUFtQmtQLElBQW5CLENBQTBCLENBRXpCLGFBQWVBLEtBQUtzdUIsUUFBcEIsQ0FFQSxHQUFLQSxXQUFhM2hDLFNBQWxCLENBQThCLENBRTdCLEdBQUsyaEMsU0FBU0MsVUFBZCxDQUEyQixDQUUxQixhQUFlRCxTQUFTRSxRQUF4QixDQUVBLElBQU1uZ0MsRUFBSSxDQUFKLENBQU95QyxFQUFJMDlCLFNBQVN4Z0MsTUFBMUIsQ0FBa0NLLEVBQUl5QyxDQUF0QyxDQUF5Q3pDLEdBQXpDLENBQWdELENBRS9Da25CLEdBQUd0QyxJQUFILENBQVN1YixTQUFVbmdDLENBQVYsQ0FBVCxFQUNBa25CLEdBQUcwSCxZQUFILENBQWlCamQsS0FBSzJsQixXQUF0QixFQUVBOEksTUFBTWYsYUFBTixDQUFxQm5ZLEVBQXJCLEVBRUEsQ0FFRCxDQWJELFFBYVkrWSxTQUFTSSxnQkFBZCxDQUFpQyxDQUV2QyxjQUFnQkosU0FBU0ssVUFBVCxDQUFvQjFQLFFBQXBDLENBRUEsR0FBS25KLFlBQWNucEIsU0FBbkIsQ0FBK0IsQ0FFOUIsSUFBTTBCLEVBQUksQ0FBSixDQUFPeUMsRUFBSWdsQixVQUFVaUgsS0FBM0IsQ0FBa0MxdUIsRUFBSXlDLENBQXRDLENBQXlDekMsR0FBekMsQ0FBZ0QsQ0FFL0NrbkIsR0FBR00sbUJBQUgsQ0FBd0JDLFNBQXhCLENBQW1Dem5CLENBQW5DLEVBQXVDNHVCLFlBQXZDLENBQXFEamQsS0FBSzJsQixXQUExRCxFQUVBOEksTUFBTWYsYUFBTixDQUFxQm5ZLEVBQXJCLEVBRUEsQ0FFRCxDQUVELENBRUQsQ0FFRCxDQUVELDhCQUFPLENBQXlCMW5CLE1BQXpCLENBQWtDLENBRXhDNGdDLE1BQVEsSUFBUixDQUVBNWdDLE9BQU8rZ0MsaUJBQVAsQ0FBMEIsSUFBMUIsRUFFQS9nQyxPQUFPZ2hDLFFBQVAsQ0FBaUJBLFFBQWpCLEVBRUEsV0FBQSxDQUVBLENBVkQsQ0FZQSxDQTlEZSxFQTNNYyxDQTJROUJDLGNBQWUsU0FBVzd6QixLQUFYLENBQW1CLENBRWpDLGFBQWEyRixDQUFOLENBQVUsS0FBSzdMLEdBQUwsQ0FBUzZMLENBQW5CLEVBQXdCM0YsTUFBTTJGLENBQU4sQ0FBVSxLQUFLNUwsR0FBTCxDQUFTNEwsQ0FBM0MsRUFDTjNGLE1BQU1tVyxDQUFOLENBQVUsS0FBS3JjLEdBQUwsQ0FBU3FjLENBRGIsRUFDa0JuVyxNQUFNbVcsQ0FBTixDQUFVLEtBQUtwYyxHQUFMLENBQVNvYyxDQURyQyxFQUVOblcsTUFBTWdkLENBQU4sQ0FBVSxLQUFLbGpCLEdBQUwsQ0FBU2tqQixDQUZiLEVBRWtCaGQsTUFBTWdkLENBQU4sQ0FBVSxLQUFLampCLEdBQUwsQ0FBU2lqQixDQUZyQyxDQUV5QyxLQUZ6QyxDQUVpRCxJQUZ4RCxDQUlBLENBalI2QixDQW1SOUI4VyxZQUFhLFNBQVdmLEdBQVgsQ0FBaUIsQ0FFN0IsWUFBWWo1QixHQUFMLENBQVM2TCxDQUFULEVBQWNvdEIsSUFBSWo1QixHQUFKLENBQVE2TCxDQUF0QixFQUEyQm90QixJQUFJaDVCLEdBQUosQ0FBUTRMLENBQVIsRUFBYSxLQUFLNUwsR0FBTCxDQUFTNEwsQ0FBakQsRUFDTixLQUFLN0wsR0FBTCxDQUFTcWMsQ0FBVCxFQUFjNGMsSUFBSWo1QixHQUFKLENBQVFxYyxDQURoQixFQUNxQjRjLElBQUloNUIsR0FBSixDQUFRb2MsQ0FBUixFQUFhLEtBQUtwYyxHQUFMLENBQVNvYyxDQUQzQyxFQUVOLEtBQUtyYyxHQUFMLENBQVNrakIsQ0FBVCxFQUFjK1YsSUFBSWo1QixHQUFKLENBQVFrakIsQ0FGaEIsRUFFcUIrVixJQUFJaDVCLEdBQUosQ0FBUWlqQixDQUFSLEVBQWEsS0FBS2pqQixHQUFMLENBQVNpakIsQ0FGbEQsQ0FJQSxDQXpSNkIsQ0EyUjlCK1csYUFBYyxTQUFXL3pCLEtBQVgsQ0FBa0JoSCxNQUFsQixDQUEyQjtFQUd4QztFQUVBLEdBQUtBLFNBQVd0SCxTQUFoQixDQUE0QixDQUUzQjJXLFFBQVE2UCxJQUFSLENBQWMsb0RBQWQsRUFDQWxmLE9BQVMsV0FBQSxFQUFULENBRUEsQ0FFRCxjQUFjMEssR0FBUCxDQUNOLENBQUUxRCxNQUFNMkYsQ0FBTixDQUFVLEtBQUs3TCxHQUFMLENBQVM2TCxDQUFyQixHQUE2QixLQUFLNUwsR0FBTCxDQUFTNEwsQ0FBVCxDQUFhLEtBQUs3TCxHQUFMLENBQVM2TCxDQUFuRCxDQURNLENBRU4sQ0FBRTNGLE1BQU1tVyxDQUFOLENBQVUsS0FBS3JjLEdBQUwsQ0FBU3FjLENBQXJCLEdBQTZCLEtBQUtwYyxHQUFMLENBQVNvYyxDQUFULENBQWEsS0FBS3JjLEdBQUwsQ0FBU3FjLENBQW5ELENBRk0sQ0FHTixDQUFFblcsTUFBTWdkLENBQU4sQ0FBVSxLQUFLbGpCLEdBQUwsQ0FBU2tqQixDQUFyQixHQUE2QixLQUFLampCLEdBQUwsQ0FBU2lqQixDQUFULENBQWEsS0FBS2xqQixHQUFMLENBQVNrakIsQ0FBbkQsQ0FITSxDQUFQLENBTUEsQ0E3UzZCLENBK1M5QmdYLGNBQWUsU0FBV2pCLEdBQVgsQ0FBaUI7RUFHL0IsV0FBV2g1QixHQUFKLENBQVE0TCxDQUFSLENBQVksS0FBSzdMLEdBQUwsQ0FBUzZMLENBQXJCLEVBQTBCb3RCLElBQUlqNUIsR0FBSixDQUFRNkwsQ0FBUixDQUFZLEtBQUs1TCxHQUFMLENBQVM0TCxDQUEvQyxFQUNOb3RCLElBQUloNUIsR0FBSixDQUFRb2MsQ0FBUixDQUFZLEtBQUtyYyxHQUFMLENBQVNxYyxDQURmLEVBQ29CNGMsSUFBSWo1QixHQUFKLENBQVFxYyxDQUFSLENBQVksS0FBS3BjLEdBQUwsQ0FBU29jLENBRHpDLEVBRU40YyxJQUFJaDVCLEdBQUosQ0FBUWlqQixDQUFSLENBQVksS0FBS2xqQixHQUFMLENBQVNrakIsQ0FGZixFQUVvQitWLElBQUlqNUIsR0FBSixDQUFRa2pCLENBQVIsQ0FBWSxLQUFLampCLEdBQUwsQ0FBU2lqQixDQUZ6QyxDQUU2QyxLQUY3QyxDQUVxRCxJQUY1RCxDQUlBLENBdFQ2QixDQXdUOUJpWCxpQkFBb0IsVUFBWSxDQUUvQixpQkFBbUIsV0FBQSxFQUFuQixDQUVBLGdDQUFPLENBQTJCQyxNQUEzQixDQUFvQztFQUcxQyxLQUFLQyxVQUFMLENBQWlCRCxPQUFPalosTUFBeEIsQ0FBZ0NtWixZQUFoQyxFQUVBO0VBQ0Esb0JBQW9CcmEsaUJBQWIsQ0FBZ0NtYSxPQUFPalosTUFBdkMsR0FBcURpWixPQUFPcEksTUFBUCxDQUFnQm9JLE9BQU9wSSxNQUFuRixDQUVBLENBUkQsQ0FVQSxDQWRpQixFQXhUWSxDQXdVOUJ1SSxnQkFBaUIsU0FBV0MsS0FBWCxDQUFtQjtFQUduQztFQUVBLE9BQUEsQ0FBU3Y2QixHQUFULENBRUEsR0FBS3U2QixNQUFNOUksTUFBTixDQUFhN2xCLENBQWIsQ0FBaUIsQ0FBdEIsQ0FBMEIsQ0FFekI3TCxJQUFNdzZCLE1BQU05SSxNQUFOLENBQWE3bEIsQ0FBYixDQUFpQixLQUFLN0wsR0FBTCxDQUFTNkwsQ0FBaEMsQ0FDQTVMLElBQU11NkIsTUFBTTlJLE1BQU4sQ0FBYTdsQixDQUFiLENBQWlCLEtBQUs1TCxHQUFMLENBQVM0TCxDQUFoQyxDQUVBLENBTEQsSUFLTyxDQUVON0wsSUFBTXc2QixNQUFNOUksTUFBTixDQUFhN2xCLENBQWIsQ0FBaUIsS0FBSzVMLEdBQUwsQ0FBUzRMLENBQWhDLENBQ0E1TCxJQUFNdTZCLE1BQU05SSxNQUFOLENBQWE3bEIsQ0FBYixDQUFpQixLQUFLN0wsR0FBTCxDQUFTNkwsQ0FBaEMsQ0FFQSxDQUVELEdBQUsydUIsTUFBTTlJLE1BQU4sQ0FBYXJWLENBQWIsQ0FBaUIsQ0FBdEIsQ0FBMEIsQ0FFekJyYyxLQUFPdzZCLE1BQU05SSxNQUFOLENBQWFyVixDQUFiLENBQWlCLEtBQUtyYyxHQUFMLENBQVNxYyxDQUFqQyxDQUNBcGMsS0FBT3U2QixNQUFNOUksTUFBTixDQUFhclYsQ0FBYixDQUFpQixLQUFLcGMsR0FBTCxDQUFTb2MsQ0FBakMsQ0FFQSxDQUxELElBS08sQ0FFTnJjLEtBQU93NkIsTUFBTTlJLE1BQU4sQ0FBYXJWLENBQWIsQ0FBaUIsS0FBS3BjLEdBQUwsQ0FBU29jLENBQWpDLENBQ0FwYyxLQUFPdTZCLE1BQU05SSxNQUFOLENBQWFyVixDQUFiLENBQWlCLEtBQUtyYyxHQUFMLENBQVNxYyxDQUFqQyxDQUVBLENBRUQsR0FBS21lLE1BQU05SSxNQUFOLENBQWF4TyxDQUFiLENBQWlCLENBQXRCLENBQTBCLENBRXpCbGpCLEtBQU93NkIsTUFBTTlJLE1BQU4sQ0FBYXhPLENBQWIsQ0FBaUIsS0FBS2xqQixHQUFMLENBQVNrakIsQ0FBakMsQ0FDQWpqQixLQUFPdTZCLE1BQU05SSxNQUFOLENBQWF4TyxDQUFiLENBQWlCLEtBQUtqakIsR0FBTCxDQUFTaWpCLENBQWpDLENBRUEsQ0FMRCxJQUtPLENBRU5sakIsS0FBT3c2QixNQUFNOUksTUFBTixDQUFheE8sQ0FBYixDQUFpQixLQUFLampCLEdBQUwsQ0FBU2lqQixDQUFqQyxDQUNBampCLEtBQU91NkIsTUFBTTlJLE1BQU4sQ0FBYXhPLENBQWIsQ0FBaUIsS0FBS2xqQixHQUFMLENBQVNrakIsQ0FBakMsQ0FFQSxDQUVELFlBQWdCc1gsTUFBTUMsUUFBYixFQUF5Qng2QixLQUFPdTZCLE1BQU1DLFFBQS9DLENBRUEsQ0FyWDZCLENBdVg5QkMsbUJBQXNCLFVBQVk7RUFHakMsT0FBUyxXQUFBLEVBQVQsQ0FDQSxPQUFTLFdBQUEsRUFBVCxDQUNBLE9BQVMsV0FBQSxFQUFULENBRUE7RUFDQSxPQUFTLFdBQUEsRUFBVCxDQUNBLE9BQVMsV0FBQSxFQUFULENBQ0EsT0FBUyxXQUFBLEVBQVQsQ0FFQSxhQUFlLFdBQUEsRUFBZixDQUVBLFdBQWEsV0FBQSxFQUFiLENBQ0EsWUFBYyxXQUFBLEVBQWQsQ0FFQSxtQkFBcUIsV0FBQSxFQUFyQixDQUVBLG1CQUFBLENBQXFCQyxJQUFyQixDQUE0QixDQUUzQixLQUFBLENBQU96bEIsQ0FBUCxDQUVBLElBQU01YixFQUFJLENBQUosQ0FBTzRiLEVBQUl5bEIsS0FBSzFoQyxNQUFMLENBQWMsQ0FBL0IsQ0FBa0NLLEdBQUs0YixDQUF2QyxDQUEwQzViLEdBQUssQ0FBL0MsQ0FBbUQsQ0FFbERzaEMsU0FBU2phLFNBQVQsQ0FBb0JnYSxJQUFwQixDQUEwQnJoQyxDQUExQixFQUNBO0VBQ0EsTUFBUXVoQyxRQUFRaHZCLENBQVIsQ0FBWTFRLEtBQUt5a0IsR0FBTCxDQUFVZ2IsU0FBUy91QixDQUFuQixDQUFaLENBQXFDZ3ZCLFFBQVF4ZSxDQUFSLENBQVlsaEIsS0FBS3lrQixHQUFMLENBQVVnYixTQUFTdmUsQ0FBbkIsQ0FBakQsQ0FBMEV3ZSxRQUFRM1gsQ0FBUixDQUFZL25CLEtBQUt5a0IsR0FBTCxDQUFVZ2IsU0FBUzFYLENBQW5CLENBQTlGLENBQ0E7RUFDQSxPQUFTNFgsR0FBR3RiLEdBQUgsQ0FBUW9iLFFBQVIsQ0FBVCxDQUNBLE9BQVNwYSxHQUFHaEIsR0FBSCxDQUFRb2IsUUFBUixDQUFULENBQ0EsT0FBU25hLEdBQUdqQixHQUFILENBQVFvYixRQUFSLENBQVQsQ0FDQTtFQUNBLEdBQUt6L0IsS0FBSzhFLEdBQUwsQ0FBVSxDQUFFOUUsS0FBSzhFLEdBQUwsQ0FBVTg2QixFQUFWLENBQWNDLEVBQWQsQ0FBa0JDLEVBQWxCLENBQVosQ0FBb0M5L0IsS0FBSzZFLEdBQUwsQ0FBVSs2QixFQUFWLENBQWNDLEVBQWQsQ0FBa0JDLEVBQWxCLENBQXBDLEVBQStEbHJCLENBQXBFLENBQXdFO0VBR3ZFO0VBQ0EsWUFBQSxDQUVBLENBRUQsQ0FFRCxXQUFBLENBRUEsQ0FFRCxrQ0FBTyxDQUE2Qm1yQixRQUE3QixDQUF3QyxDQUU5QyxHQUFLLEtBQUtoQyxPQUFMLEVBQUwsQ0FBc0IsQ0FFckIsWUFBQSxDQUVBLENBRUQ7RUFDQSxLQUFLQyxTQUFMLENBQWdCaFksTUFBaEIsRUFDQTBaLFFBQVFwYyxVQUFSLENBQW9CLEtBQUt4ZSxHQUF6QixDQUE4QmtoQixNQUE5QixFQUVBO0VBQ0EyWixHQUFHcmMsVUFBSCxDQUFleWMsU0FBU2wvQixDQUF4QixDQUEyQm1sQixNQUEzQixFQUNBWCxHQUFHL0IsVUFBSCxDQUFleWMsU0FBU3AvQixDQUF4QixDQUEyQnFsQixNQUEzQixFQUNBVixHQUFHaEMsVUFBSCxDQUFleWMsU0FBU3orQixDQUF4QixDQUEyQjBrQixNQUEzQixFQUVBO0VBQ0FnYSxHQUFHMWMsVUFBSCxDQUFlK0IsRUFBZixDQUFtQnNhLEVBQW5CLEVBQ0FNLEdBQUczYyxVQUFILENBQWVnQyxFQUFmLENBQW1CRCxFQUFuQixFQUNBNmEsR0FBRzVjLFVBQUgsQ0FBZXFjLEVBQWYsQ0FBbUJyYSxFQUFuQixFQUVBO0VBQ0E7RUFDQTtFQUNBLFNBQVcsQ0FDVixDQURVLENBQ1AsQ0FBRTBhLEdBQUdqWSxDQURFLENBQ0NpWSxHQUFHOWUsQ0FESixDQUNPLENBRFAsQ0FDVSxDQUFFK2UsR0FBR2xZLENBRGYsQ0FDa0JrWSxHQUFHL2UsQ0FEckIsQ0FDd0IsQ0FEeEIsQ0FDMkIsQ0FBRWdmLEdBQUduWSxDQURoQyxDQUNtQ21ZLEdBQUdoZixDQUR0QyxDQUVWOGUsR0FBR2pZLENBRk8sQ0FFSixDQUZJLENBRUQsQ0FBRWlZLEdBQUd0dkIsQ0FGSixDQUVPdXZCLEdBQUdsWSxDQUZWLENBRWEsQ0FGYixDQUVnQixDQUFFa1ksR0FBR3Z2QixDQUZyQixDQUV3Qnd2QixHQUFHblksQ0FGM0IsQ0FFOEIsQ0FGOUIsQ0FFaUMsQ0FBRW1ZLEdBQUd4dkIsQ0FGdEMsQ0FHVixDQUFFc3ZCLEdBQUc5ZSxDQUhLLENBR0Y4ZSxHQUFHdHZCLENBSEQsQ0FHSSxDQUhKLENBR08sQ0FBRXV2QixHQUFHL2UsQ0FIWixDQUdlK2UsR0FBR3Z2QixDQUhsQixDQUdxQixDQUhyQixDQUd3QixDQUFFd3ZCLEdBQUdoZixDQUg3QixDQUdnQ2dmLEdBQUd4dkIsQ0FIbkMsQ0FHc0MsQ0FIdEMsQ0FBWCxDQUtBLEdBQUssQ0FBRXl2QixXQUFZWCxJQUFaLENBQVAsQ0FBNEIsQ0FFM0IsWUFBQSxDQUVBLENBRUQ7RUFDQUEsS0FBTyxDQUFFLENBQUYsQ0FBSyxDQUFMLENBQVEsQ0FBUixDQUFXLENBQVgsQ0FBYyxDQUFkLENBQWlCLENBQWpCLENBQW9CLENBQXBCLENBQXVCLENBQXZCLENBQTBCLENBQTFCLENBQVAsQ0FDQSxHQUFLLENBQUVXLFdBQVlYLElBQVosQ0FBUCxDQUE0QixDQUUzQixZQUFBLENBRUEsQ0FFRDtFQUNBO0VBQ0FZLGVBQWUzVixZQUFmLENBQTZCdVYsRUFBN0IsQ0FBaUNDLEVBQWpDLEVBQ0FULEtBQU8sQ0FBRVksZUFBZTF2QixDQUFqQixDQUFvQjB2QixlQUFlbGYsQ0FBbkMsQ0FBc0NrZixlQUFlclksQ0FBckQsQ0FBUCxDQUNBLGtCQUFtQnlYLElBQVosQ0FBUCxDQUVBLENBbERELENBb0RBLENBbkdtQixFQXZYVSxDQTRkOUJOLFdBQVksU0FBV24wQixLQUFYLENBQWtCaEgsTUFBbEIsQ0FBMkIsQ0FFdEMsR0FBS0EsU0FBV3RILFNBQWhCLENBQTRCLENBRTNCMlcsUUFBUTZQLElBQVIsQ0FBYyxrREFBZCxFQUNBbGYsT0FBUyxXQUFBLEVBQVQsQ0FFQSxDQUVELGNBQWNnZixJQUFQLENBQWFoWSxLQUFiLEVBQXFCeVYsS0FBckIsQ0FBNEIsS0FBSzNiLEdBQWpDLENBQXNDLEtBQUtDLEdBQTNDLENBQVAsQ0FFQSxDQXZlNkIsQ0F5ZTlCdTdCLGdCQUFpQixVQUFZLENBRTVCLE9BQVMsV0FBQSxFQUFULENBRUEsK0JBQU8sQ0FBMEJ0MUIsS0FBMUIsQ0FBa0MsQ0FFeEMsaUJBQW1Cc2EsR0FBR3RDLElBQUgsQ0FBU2hZLEtBQVQsRUFBaUJ5VixLQUFqQixDQUF3QixLQUFLM2IsR0FBN0IsQ0FBa0MsS0FBS0MsR0FBdkMsQ0FBbkIsQ0FDQSxvQkFBb0J1ZSxHQUFiLENBQWtCdFksS0FBbEIsRUFBMEJqTixNQUExQixFQUFQLENBRUEsQ0FMRCxDQU9BLENBWGdCLEVBemVhLENBc2Y5QndpQyxrQkFBbUIsVUFBWSxDQUU5QixPQUFTLFdBQUEsRUFBVCxDQUVBLGlDQUFPLENBQTRCdjhCLE1BQTVCLENBQXFDLENBRTNDLEdBQUtBLFNBQVd0SCxTQUFoQixDQUE0QixDQUUzQjJXLFFBQVE2UCxJQUFSLENBQWMseURBQWQsRUFDQWxmLE9BQVMsVUFBQSxFQUFULENBRUEsQ0FFRCxLQUFLaTZCLFNBQUwsQ0FBZ0JqNkIsT0FBT2lpQixNQUF2QixFQUVBamlCLE9BQU84eUIsTUFBUCxDQUFnQixLQUFLb0gsT0FBTCxDQUFjNVksRUFBZCxFQUFtQnZuQixNQUFuQixHQUE4QixHQUE5QyxDQUVBLGFBQUEsQ0FFQSxDQWZELENBaUJBLENBckJrQixFQXRmVyxDQTZnQjlCeWlDLFVBQVcsU0FBV3pDLEdBQVgsQ0FBaUIsQ0FFM0IsS0FBS2o1QixHQUFMLENBQVNDLEdBQVQsQ0FBY2c1QixJQUFJajVCLEdBQWxCLEVBQ0EsS0FBS0MsR0FBTCxDQUFTRCxHQUFULENBQWNpNUIsSUFBSWg1QixHQUFsQixFQUVBO0VBQ0EsR0FBSyxLQUFLaTVCLE9BQUwsRUFBTCxDQUFzQixLQUFLVCxTQUFMLEdBRXRCLFdBQUEsQ0FFQSxDQXZoQjZCLENBeWhCOUJrRCxNQUFPLFNBQVcxQyxHQUFYLENBQWlCLENBRXZCLEtBQUtqNUIsR0FBTCxDQUFTQSxHQUFULENBQWNpNUIsSUFBSWo1QixHQUFsQixFQUNBLEtBQUtDLEdBQUwsQ0FBU0EsR0FBVCxDQUFjZzVCLElBQUloNUIsR0FBbEIsRUFFQSxXQUFBLENBRUEsQ0FoaUI2QixDQWtpQjlCaW9CLGFBQWMsVUFBWSxDQUV6QixXQUFhLENBQ1osV0FBQSxFQURZLENBRVosV0FBQSxFQUZZLENBR1osV0FBQSxFQUhZLENBSVosV0FBQSxFQUpZLENBS1osV0FBQSxFQUxZLENBTVosV0FBQSxFQU5ZLENBT1osV0FBQSxFQVBZLENBUVosV0FBQSxFQVJZLENBQWIsQ0FXQSw0QkFBTyxDQUF1QnFDLE1BQXZCLENBQWdDO0VBR3RDLEdBQUssS0FBSzJPLE9BQUwsRUFBTCxDQUFzQixXQUFBLENBRXRCO0VBQ0FWLE9BQVEsQ0FBUixFQUFZNXVCLEdBQVosQ0FBaUIsS0FBSzVKLEdBQUwsQ0FBUzZMLENBQTFCLENBQTZCLEtBQUs3TCxHQUFMLENBQVNxYyxDQUF0QyxDQUF5QyxLQUFLcmMsR0FBTCxDQUFTa2pCLENBQWxELEVBQXNEZ0YsWUFBdEQsQ0FBb0VxQyxNQUFwRSxFQUE4RTtFQUM5RWlPLE9BQVEsQ0FBUixFQUFZNXVCLEdBQVosQ0FBaUIsS0FBSzVKLEdBQUwsQ0FBUzZMLENBQTFCLENBQTZCLEtBQUs3TCxHQUFMLENBQVNxYyxDQUF0QyxDQUF5QyxLQUFLcGMsR0FBTCxDQUFTaWpCLENBQWxELEVBQXNEZ0YsWUFBdEQsQ0FBb0VxQyxNQUFwRSxFQUE4RTtFQUM5RWlPLE9BQVEsQ0FBUixFQUFZNXVCLEdBQVosQ0FBaUIsS0FBSzVKLEdBQUwsQ0FBUzZMLENBQTFCLENBQTZCLEtBQUs1TCxHQUFMLENBQVNvYyxDQUF0QyxDQUF5QyxLQUFLcmMsR0FBTCxDQUFTa2pCLENBQWxELEVBQXNEZ0YsWUFBdEQsQ0FBb0VxQyxNQUFwRSxFQUE4RTtFQUM5RWlPLE9BQVEsQ0FBUixFQUFZNXVCLEdBQVosQ0FBaUIsS0FBSzVKLEdBQUwsQ0FBUzZMLENBQTFCLENBQTZCLEtBQUs1TCxHQUFMLENBQVNvYyxDQUF0QyxDQUF5QyxLQUFLcGMsR0FBTCxDQUFTaWpCLENBQWxELEVBQXNEZ0YsWUFBdEQsQ0FBb0VxQyxNQUFwRSxFQUE4RTtFQUM5RWlPLE9BQVEsQ0FBUixFQUFZNXVCLEdBQVosQ0FBaUIsS0FBSzNKLEdBQUwsQ0FBUzRMLENBQTFCLENBQTZCLEtBQUs3TCxHQUFMLENBQVNxYyxDQUF0QyxDQUF5QyxLQUFLcmMsR0FBTCxDQUFTa2pCLENBQWxELEVBQXNEZ0YsWUFBdEQsQ0FBb0VxQyxNQUFwRSxFQUE4RTtFQUM5RWlPLE9BQVEsQ0FBUixFQUFZNXVCLEdBQVosQ0FBaUIsS0FBSzNKLEdBQUwsQ0FBUzRMLENBQTFCLENBQTZCLEtBQUs3TCxHQUFMLENBQVNxYyxDQUF0QyxDQUF5QyxLQUFLcGMsR0FBTCxDQUFTaWpCLENBQWxELEVBQXNEZ0YsWUFBdEQsQ0FBb0VxQyxNQUFwRSxFQUE4RTtFQUM5RWlPLE9BQVEsQ0FBUixFQUFZNXVCLEdBQVosQ0FBaUIsS0FBSzNKLEdBQUwsQ0FBUzRMLENBQTFCLENBQTZCLEtBQUs1TCxHQUFMLENBQVNvYyxDQUF0QyxDQUF5QyxLQUFLcmMsR0FBTCxDQUFTa2pCLENBQWxELEVBQXNEZ0YsWUFBdEQsQ0FBb0VxQyxNQUFwRSxFQUE4RTtFQUM5RWlPLE9BQVEsQ0FBUixFQUFZNXVCLEdBQVosQ0FBaUIsS0FBSzNKLEdBQUwsQ0FBUzRMLENBQTFCLENBQTZCLEtBQUs1TCxHQUFMLENBQVNvYyxDQUF0QyxDQUF5QyxLQUFLcGMsR0FBTCxDQUFTaWpCLENBQWxELEVBQXNEZ0YsWUFBdEQsQ0FBb0VxQyxNQUFwRSxFQUE4RTtFQUU5RSxLQUFLZ08sYUFBTCxDQUFvQkMsTUFBcEIsRUFFQSxXQUFBLENBRUEsQ0FuQkQsQ0FxQkEsQ0FsQ2EsRUFsaUJnQixDQXNrQjlCeEYsVUFBVyxTQUFXcFMsTUFBWCxDQUFvQixDQUU5QixLQUFLNWdCLEdBQUwsQ0FBU21lLEdBQVQsQ0FBY3lDLE1BQWQsRUFDQSxLQUFLM2dCLEdBQUwsQ0FBU2tlLEdBQVQsQ0FBY3lDLE1BQWQsRUFFQSxXQUFBLENBRUEsQ0E3a0I2QixDQStrQjlCRixPQUFRLFNBQVd1WSxHQUFYLENBQWlCLENBRXhCLFdBQVdqNUIsR0FBSixDQUFRMGdCLE1BQVIsQ0FBZ0IsS0FBSzFnQixHQUFyQixHQUE4Qmk1QixJQUFJaDVCLEdBQUosQ0FBUXlnQixNQUFSLENBQWdCLEtBQUt6Z0IsR0FBckIsQ0FBckMsQ0FFQSxDQW5sQjZCLENBQS9CLEVBdWxCQTs7O0tBS0EsZUFBQSxDQUFpQmtoQixNQUFqQixDQUF5QjZRLE1BQXpCLENBQWtDLENBRWpDLEtBQUs3USxNQUFMLENBQWdCQSxTQUFXdnBCLFNBQWIsQ0FBMkJ1cEIsTUFBM0IsQ0FBb0MsV0FBQSxFQUFsRCxDQUNBLEtBQUs2USxNQUFMLENBQWdCQSxTQUFXcDZCLFNBQWIsQ0FBMkJvNkIsTUFBM0IsQ0FBb0MsQ0FBbEQsQ0FFQSxDQUVEei9CLE9BQU80bkIsTUFBUCxDQUFleWhCLE9BQU9wcEMsU0FBdEIsQ0FBaUMsQ0FFaENvWCxJQUFLLFNBQVd1WCxNQUFYLENBQW1CNlEsTUFBbkIsQ0FBNEIsQ0FFaEMsS0FBSzdRLE1BQUwsQ0FBWWpELElBQVosQ0FBa0JpRCxNQUFsQixFQUNBLEtBQUs2USxNQUFMLENBQWNBLE1BQWQsQ0FFQSxXQUFBLENBRUEsQ0FUK0IsQ0FXaEN1RyxjQUFlLFVBQVksQ0FFMUIsUUFBVSxRQUFBLEVBQVYsQ0FFQSw2QkFBTyxDQUF3QkMsTUFBeEIsQ0FBZ0NxRCxjQUFoQyxDQUFpRCxDQUV2RCxXQUFhLEtBQUsxYSxNQUFsQixDQUVBLEdBQUswYSxpQkFBbUJqa0MsU0FBeEIsQ0FBb0MsQ0FFbkN1cEIsT0FBT2pELElBQVAsQ0FBYTJkLGNBQWIsRUFFQSxDQUpELElBSU8sQ0FFTjVDLElBQUlWLGFBQUosQ0FBbUJDLE1BQW5CLEVBQTRCVyxTQUE1QixDQUF1Q2hZLE1BQXZDLEVBRUEsQ0FFRCxnQkFBa0IsQ0FBbEIsQ0FFQSxJQUFNLE1BQVEsQ0FBUixDQUFXdVgsR0FBS0YsT0FBT3YvQixNQUE3QixDQUFxQ0ssRUFBSW8vQixFQUF6QyxDQUE2Q3AvQixHQUE3QyxDQUFvRCxDQUVuRHdpQyxZQUFjM2dDLEtBQUs4RSxHQUFMLENBQVU2N0IsV0FBVixDQUF1QjNhLE9BQU9sQixpQkFBUCxDQUEwQnVZLE9BQVFsL0IsQ0FBUixDQUExQixDQUF2QixDQUFkLENBRUEsQ0FFRCxLQUFLMDRCLE1BQUwsQ0FBYzcyQixLQUFLdWtCLElBQUwsQ0FBV29jLFdBQVgsQ0FBZCxDQUVBLFdBQUEsQ0FFQSxDQTFCRCxDQTRCQSxDQWhDYyxFQVhpQixDQTZDaEM3ZCxNQUFPLFVBQVksQ0FFbEIsZ0JBQWdCbnBCLFdBQVQsR0FBdUJvcEIsSUFBdkIsQ0FBNkIsSUFBN0IsQ0FBUCxDQUVBLENBakQrQixDQW1EaENBLEtBQU0sU0FBV2tjLE1BQVgsQ0FBb0IsQ0FFekIsS0FBS2paLE1BQUwsQ0FBWWpELElBQVosQ0FBa0JrYyxPQUFPalosTUFBekIsRUFDQSxLQUFLNlEsTUFBTCxDQUFjb0ksT0FBT3BJLE1BQXJCLENBRUEsV0FBQSxDQUVBLENBMUQrQixDQTREaEM5a0IsTUFBTyxVQUFZLENBRWxCLFlBQWM4a0IsTUFBTCxFQUFlLENBQXhCLENBRUEsQ0FoRStCLENBa0VoQytILGNBQWUsU0FBVzd6QixLQUFYLENBQW1CLENBRWpDLGFBQWUrWixpQkFBTixDQUF5QixLQUFLa0IsTUFBOUIsR0FBNEMsS0FBSzZRLE1BQUwsQ0FBYyxLQUFLQSxNQUF4RSxDQUVBLENBdEUrQixDQXdFaEN3SixnQkFBaUIsU0FBV3QxQixLQUFYLENBQW1CLENBRW5DLGFBQWU4WixVQUFOLENBQWtCLEtBQUttQixNQUF2QixFQUFrQyxLQUFLNlEsTUFBaEQsQ0FFQSxDQTVFK0IsQ0E4RWhDbUksaUJBQWtCLFNBQVdDLE1BQVgsQ0FBb0IsQ0FFckMsY0FBZ0IsS0FBS3BJLE1BQUwsQ0FBY29JLE9BQU9wSSxNQUFyQyxDQUVBLGNBQWM3USxNQUFQLENBQWNsQixpQkFBZCxDQUFpQyxLQUFLa0IsTUFBdEMsR0FBb0Q0YSxVQUFZQSxTQUF2RSxDQUVBLENBcEYrQixDQXNGaEM3QixjQUFlLFNBQVdqQixHQUFYLENBQWlCLENBRS9CLFdBQVdrQixnQkFBSixDQUFzQixJQUF0QixDQUFQLENBRUEsQ0ExRitCLENBNEZoQ0ksZ0JBQWlCLFNBQVdDLEtBQVgsQ0FBbUIsQ0FFbkMsWUFBWTVhLEdBQUwsQ0FBVTRhLE1BQU1nQixlQUFOLENBQXVCLEtBQUtyYSxNQUE1QixDQUFWLEdBQW9ELEtBQUs2USxNQUFoRSxDQUVBLENBaEcrQixDQWtHaENxSSxXQUFZLFNBQVduMEIsS0FBWCxDQUFrQmhILE1BQWxCLENBQTJCLENBRXRDLGtCQUFvQixLQUFLaWlCLE1BQUwsQ0FBWWxCLGlCQUFaLENBQStCL1osS0FBL0IsQ0FBcEIsQ0FFQSxHQUFLaEgsU0FBV3RILFNBQWhCLENBQTRCLENBRTNCMlcsUUFBUTZQLElBQVIsQ0FBYyxvREFBZCxFQUNBbGYsT0FBUyxXQUFBLEVBQVQsQ0FFQSxDQUVEQSxPQUFPZ2YsSUFBUCxDQUFhaFksS0FBYixFQUVBLEdBQUs4MUIsY0FBa0IsS0FBS2hLLE1BQUwsQ0FBYyxLQUFLQSxNQUExQyxDQUFxRCxDQUVwRDl5QixPQUFPc2YsR0FBUCxDQUFZLEtBQUsyQyxNQUFqQixFQUEwQnRCLFNBQTFCLEdBQ0EzZ0IsT0FBTzBmLGNBQVAsQ0FBdUIsS0FBS29ULE1BQTVCLEVBQXFDN1QsR0FBckMsQ0FBMEMsS0FBS2dELE1BQS9DLEVBRUEsQ0FFRCxhQUFBLENBRUEsQ0F4SCtCLENBMEhoQzhhLGVBQWdCLFNBQVcvOEIsTUFBWCxDQUFvQixDQUVuQyxHQUFLQSxTQUFXdEgsU0FBaEIsQ0FBNEIsQ0FFM0IyVyxRQUFRNlAsSUFBUixDQUFjLHdEQUFkLEVBQ0FsZixPQUFTLFFBQUEsRUFBVCxDQUVBLENBRURBLE9BQU8wSyxHQUFQLENBQVksS0FBS3VYLE1BQWpCLENBQXlCLEtBQUtBLE1BQTlCLEVBQ0FqaUIsT0FBT282QixjQUFQLENBQXVCLEtBQUt0SCxNQUE1QixFQUVBLGFBQUEsQ0FFQSxDQXhJK0IsQ0EwSWhDOUosYUFBYyxTQUFXcUMsTUFBWCxDQUFvQixDQUVqQyxLQUFLcEosTUFBTCxDQUFZK0csWUFBWixDQUEwQnFDLE1BQTFCLEVBQ0EsS0FBS3lILE1BQUwsQ0FBYyxLQUFLQSxNQUFMLENBQWN6SCxPQUFPckIsaUJBQVAsRUFBNUIsQ0FFQSxXQUFBLENBRUEsQ0FqSitCLENBbUpoQzhKLFVBQVcsU0FBV3BTLE1BQVgsQ0FBb0IsQ0FFOUIsS0FBS08sTUFBTCxDQUFZaEQsR0FBWixDQUFpQnlDLE1BQWpCLEVBRUEsV0FBQSxDQUVBLENBekorQixDQTJKaENGLE9BQVEsU0FBVzBaLE1BQVgsQ0FBb0IsQ0FFM0IsY0FBY2paLE1BQVAsQ0FBY1QsTUFBZCxDQUFzQixLQUFLUyxNQUEzQixHQUF5Q2laLE9BQU9wSSxNQUFQLEdBQWtCLEtBQUtBLE1BQXZFLENBRUEsQ0EvSitCLENBQWpDLEVBbUtBOztLQUlBLGNBQUEsQ0FBZ0JOLE1BQWhCLENBQXdCK0ksUUFBeEIsQ0FBbUM7RUFJbEMsS0FBSy9JLE1BQUwsQ0FBZ0JBLFNBQVc5NUIsU0FBYixDQUEyQjg1QixNQUEzQixDQUFvQyxXQUFBLENBQWEsQ0FBYixDQUFnQixDQUFoQixDQUFtQixDQUFuQixDQUFsRCxDQUNBLEtBQUsrSSxRQUFMLENBQWtCQSxXQUFhN2lDLFNBQWYsQ0FBNkI2aUMsUUFBN0IsQ0FBd0MsQ0FBeEQsQ0FFQSxDQUVEbG9DLE9BQU80bkIsTUFBUCxDQUFlK2hCLE1BQU0xcEMsU0FBckIsQ0FBZ0MsQ0FFL0JvWCxJQUFLLFNBQVc4bkIsTUFBWCxDQUFtQitJLFFBQW5CLENBQThCLENBRWxDLEtBQUsvSSxNQUFMLENBQVl4VCxJQUFaLENBQWtCd1QsTUFBbEIsRUFDQSxLQUFLK0ksUUFBTCxDQUFnQkEsUUFBaEIsQ0FFQSxXQUFBLENBRUEsQ0FUOEIsQ0FXL0IwQixjQUFlLFNBQVd0d0IsQ0FBWCxDQUFjd1EsQ0FBZCxDQUFpQjZHLENBQWpCLENBQW9CdFIsQ0FBcEIsQ0FBd0IsQ0FFdEMsS0FBSzhmLE1BQUwsQ0FBWTluQixHQUFaLENBQWlCaUMsQ0FBakIsQ0FBb0J3USxDQUFwQixDQUF1QjZHLENBQXZCLEVBQ0EsS0FBS3VYLFFBQUwsQ0FBZ0I3b0IsQ0FBaEIsQ0FFQSxXQUFBLENBRUEsQ0FsQjhCLENBb0IvQndxQiw4QkFBK0IsU0FBVzFLLE1BQVgsQ0FBbUJ4ckIsS0FBbkIsQ0FBMkIsQ0FFekQsS0FBS3dyQixNQUFMLENBQVl4VCxJQUFaLENBQWtCd1QsTUFBbEIsRUFDQSxLQUFLK0ksUUFBTCxDQUFnQixDQUFFdjBCLE1BQU1zWixHQUFOLENBQVcsS0FBS2tTLE1BQWhCLENBQWxCLENBRUEsV0FBQSxDQUVBLENBM0I4QixDQTZCL0IySyxzQkFBdUIsVUFBWSxDQUVsQyxPQUFTLFdBQUEsRUFBVCxDQUNBLE9BQVMsV0FBQSxFQUFULENBRUEscUNBQU8sQ0FBZ0NyZ0MsQ0FBaEMsQ0FBbUNGLENBQW5DLENBQXNDVyxDQUF0QyxDQUEwQyxDQUVoRCxXQUFhK2pCLEdBQUcvQixVQUFILENBQWVoaUIsQ0FBZixDQUFrQlgsQ0FBbEIsRUFBc0JpMUIsS0FBdEIsQ0FBNkJ0USxHQUFHaEMsVUFBSCxDQUFlemlCLENBQWYsQ0FBa0JGLENBQWxCLENBQTdCLEVBQXFEK2pCLFNBQXJELEVBQWIsQ0FFQTtFQUVBLEtBQUt1Yyw2QkFBTCxDQUFvQzFLLE1BQXBDLENBQTRDMTFCLENBQTVDLEVBRUEsV0FBQSxDQUVBLENBVkQsQ0FZQSxDQWpCc0IsRUE3QlEsQ0FnRC9CaWlCLE1BQU8sVUFBWSxDQUVsQixnQkFBZ0JucEIsV0FBVCxHQUF1Qm9wQixJQUF2QixDQUE2QixJQUE3QixDQUFQLENBRUEsQ0FwRDhCLENBc0QvQkEsS0FBTSxTQUFXc2MsS0FBWCxDQUFtQixDQUV4QixLQUFLOUksTUFBTCxDQUFZeFQsSUFBWixDQUFrQnNjLE1BQU05SSxNQUF4QixFQUNBLEtBQUsrSSxRQUFMLENBQWdCRCxNQUFNQyxRQUF0QixDQUVBLFdBQUEsQ0FFQSxDQTdEOEIsQ0ErRC9CNWEsVUFBVyxVQUFZO0VBSXRCLHdCQUEwQixJQUFNLEtBQUs2UixNQUFMLENBQVl6NEIsTUFBWixFQUFoQyxDQUNBLEtBQUt5NEIsTUFBTCxDQUFZOVMsY0FBWixDQUE0QjBkLG1CQUE1QixFQUNBLEtBQUs3QixRQUFMLEVBQWlCNkIsbUJBQWpCLENBRUEsV0FBQSxDQUVBLENBekU4QixDQTJFL0IvYyxPQUFRLFVBQVksQ0FFbkIsS0FBS2tiLFFBQUwsRUFBaUIsQ0FBRSxDQUFuQixDQUNBLEtBQUsvSSxNQUFMLENBQVluUyxNQUFaLEdBRUEsV0FBQSxDQUVBLENBbEY4QixDQW9GL0JpYyxnQkFBaUIsU0FBV3QxQixLQUFYLENBQW1CLENBRW5DLFlBQVl3ckIsTUFBTCxDQUFZbFMsR0FBWixDQUFpQnRaLEtBQWpCLEVBQTJCLEtBQUt1MEIsUUFBdkMsQ0FFQSxDQXhGOEIsQ0EwRi9COEIsaUJBQWtCLFNBQVduQyxNQUFYLENBQW9CLENBRXJDLFlBQVlvQixlQUFMLENBQXNCcEIsT0FBT2paLE1BQTdCLEVBQXdDaVosT0FBT3BJLE1BQXRELENBRUEsQ0E5RjhCLENBZ0cvQndLLGFBQWMsU0FBV3QyQixLQUFYLENBQWtCaEgsTUFBbEIsQ0FBMkIsQ0FFeEMsR0FBS0EsU0FBV3RILFNBQWhCLENBQTRCLENBRTNCMlcsUUFBUTZQLElBQVIsQ0FBYyxxREFBZCxFQUNBbGYsT0FBUyxXQUFBLEVBQVQsQ0FFQSxDQUVELGNBQWNnZixJQUFQLENBQWEsS0FBS3dULE1BQWxCLEVBQTJCOVMsY0FBM0IsQ0FBMkMsQ0FBRSxLQUFLNGMsZUFBTCxDQUFzQnQxQixLQUF0QixDQUE3QyxFQUE2RWlZLEdBQTdFLENBQWtGalksS0FBbEYsQ0FBUCxDQUVBLENBM0c4QixDQTZHL0J1MkIsY0FBZSxVQUFZLENBRTFCLE9BQVMsV0FBQSxFQUFULENBRUEsNkJBQU8sQ0FBd0JDLElBQXhCLENBQThCeDlCLE1BQTlCLENBQXVDLENBRTdDLEdBQUtBLFNBQVd0SCxTQUFoQixDQUE0QixDQUUzQjJXLFFBQVE2UCxJQUFSLENBQWMsc0RBQWQsRUFDQWxmLE9BQVMsV0FBQSxFQUFULENBRUEsQ0FFRCxjQUFnQnc5QixLQUFLQyxLQUFMLENBQVluYyxFQUFaLENBQWhCLENBRUEsZ0JBQWtCLEtBQUtrUixNQUFMLENBQVlsUyxHQUFaLENBQWlCb2QsU0FBakIsQ0FBbEIsQ0FFQSxHQUFLQyxjQUFnQixDQUFyQixDQUF5QjtFQUd4QixHQUFLLEtBQUtyQixlQUFMLENBQXNCa0IsS0FBS0ksS0FBM0IsSUFBdUMsQ0FBNUMsQ0FBZ0QsQ0FFL0MsY0FBYzVlLElBQVAsQ0FBYXdlLEtBQUtJLEtBQWxCLENBQVAsQ0FFQSxDQUVEO0VBQ0EsZ0JBQUEsQ0FFQSxDQUVELE1BQVEsRUFBSUosS0FBS0ksS0FBTCxDQUFXdGQsR0FBWCxDQUFnQixLQUFLa1MsTUFBckIsRUFBZ0MsS0FBSytJLFFBQXpDLEVBQXNEb0MsV0FBOUQsQ0FFQSxHQUFLdmdCLEVBQUksQ0FBSixFQUFTQSxFQUFJLENBQWxCLENBQXNCLENBRXJCLGdCQUFBLENBRUEsQ0FFRCxjQUFjNEIsSUFBUCxDQUFhMGUsU0FBYixFQUF5QmhlLGNBQXpCLENBQXlDdEMsQ0FBekMsRUFBNkM2QixHQUE3QyxDQUFrRHVlLEtBQUtJLEtBQXZELENBQVAsQ0FFQSxDQXJDRCxDQXVDQSxDQTNDYyxFQTdHZ0IsQ0EwSi9CQyxlQUFnQixTQUFXTCxJQUFYLENBQWtCO0VBSWpDLGNBQWdCLEtBQUtsQixlQUFMLENBQXNCa0IsS0FBS0ksS0FBM0IsQ0FBaEIsQ0FDQSxZQUFjLEtBQUt0QixlQUFMLENBQXNCa0IsS0FBS00sR0FBM0IsQ0FBZCxDQUVBLGlCQUFxQixDQUFaLEVBQWlCQyxRQUFVLENBQTdCLEVBQXNDQSxRQUFVLENBQVYsRUFBZUMsVUFBWSxDQUF4RSxDQUVBLENBbks4QixDQXFLL0JoRCxjQUFlLFNBQVdqQixHQUFYLENBQWlCLENBRS9CLFdBQVdzQixlQUFKLENBQXFCLElBQXJCLENBQVAsQ0FFQSxDQXpLOEIsQ0EySy9CSixpQkFBa0IsU0FBV0MsTUFBWCxDQUFvQixDQUVyQyxjQUFjRyxlQUFQLENBQXdCLElBQXhCLENBQVAsQ0FFQSxDQS9LOEIsQ0FpTC9CNEMsY0FBZSxTQUFXaitCLE1BQVgsQ0FBb0IsQ0FFbEMsR0FBS0EsU0FBV3RILFNBQWhCLENBQTRCLENBRTNCMlcsUUFBUTZQLElBQVIsQ0FBYyxzREFBZCxFQUNBbGYsT0FBUyxXQUFBLEVBQVQsQ0FFQSxDQUVELGNBQWNnZixJQUFQLENBQWEsS0FBS3dULE1BQWxCLEVBQTJCOVMsY0FBM0IsQ0FBMkMsQ0FBRSxLQUFLNmIsUUFBbEQsQ0FBUCxDQUVBLENBNUw4QixDQThML0J2UyxhQUFjLFVBQVksQ0FFekIsT0FBUyxXQUFBLEVBQVQsQ0FDQSxPQUFTLFdBQUEsRUFBVCxDQUVBLDRCQUFPLENBQXVCcUMsTUFBdkIsQ0FBK0I2UyxvQkFBL0IsQ0FBc0QsQ0FFNUQsaUJBQW1CQSxzQkFBd0JDLEdBQUc3SyxlQUFILENBQW9CakksTUFBcEIsQ0FBM0MsQ0FFQSxtQkFBcUIsS0FBSzRTLGFBQUwsQ0FBb0IzYyxFQUFwQixFQUF5QjBILFlBQXpCLENBQXVDcUMsTUFBdkMsQ0FBckIsQ0FFQSxXQUFhLEtBQUttSCxNQUFMLENBQVkzUyxZQUFaLENBQTBCdWUsWUFBMUIsRUFBeUN6ZCxTQUF6QyxFQUFiLENBRUEsS0FBSzRhLFFBQUwsQ0FBZ0IsQ0FBRThDLGVBQWUvZCxHQUFmLENBQW9Ca1MsTUFBcEIsQ0FBbEIsQ0FFQSxXQUFBLENBRUEsQ0FaRCxDQWNBLENBbkJhLEVBOUxpQixDQW1OL0JzQixVQUFXLFNBQVdwUyxNQUFYLENBQW9CLENBRTlCLEtBQUs2WixRQUFMLEVBQWlCN1osT0FBT3BCLEdBQVAsQ0FBWSxLQUFLa1MsTUFBakIsQ0FBakIsQ0FFQSxXQUFBLENBRUEsQ0F6TjhCLENBMk4vQmhSLE9BQVEsU0FBVzhaLEtBQVgsQ0FBbUIsQ0FFMUIsYUFBYTlJLE1BQU4sQ0FBYWhSLE1BQWIsQ0FBcUIsS0FBS2dSLE1BQTFCLEdBQXdDOEksTUFBTUMsUUFBTixHQUFtQixLQUFLQSxRQUF2RSxDQUVBLENBL044QixDQUFoQyxFQW1PQTs7OztLQU1BLGdCQUFBLENBQWtCTSxFQUFsQixDQUFzQkMsRUFBdEIsQ0FBMEJDLEVBQTFCLENBQThCdUMsRUFBOUIsQ0FBa0NDLEVBQWxDLENBQXNDQyxFQUF0QyxDQUEyQyxDQUUxQyxLQUFLQyxNQUFMLENBQWMsQ0FFWDVDLEtBQU9uakMsU0FBVCxDQUF1Qm1qQyxFQUF2QixDQUE0QixTQUFBLEVBRmYsQ0FHWEMsS0FBT3BqQyxTQUFULENBQXVCb2pDLEVBQXZCLENBQTRCLFNBQUEsRUFIZixDQUlYQyxLQUFPcmpDLFNBQVQsQ0FBdUJxakMsRUFBdkIsQ0FBNEIsU0FBQSxFQUpmLENBS1h1QyxLQUFPNWxDLFNBQVQsQ0FBdUI0bEMsRUFBdkIsQ0FBNEIsU0FBQSxFQUxmLENBTVhDLEtBQU83bEMsU0FBVCxDQUF1QjZsQyxFQUF2QixDQUE0QixTQUFBLEVBTmYsQ0FPWEMsS0FBTzlsQyxTQUFULENBQXVCOGxDLEVBQXZCLENBQTRCLFNBQUEsRUFQZixDQUFkLENBV0EsQ0FFRG5yQyxPQUFPNG5CLE1BQVAsQ0FBZXlqQixRQUFRcHJDLFNBQXZCLENBQWtDLENBRWpDb1gsSUFBSyxTQUFXbXhCLEVBQVgsQ0FBZUMsRUFBZixDQUFtQkMsRUFBbkIsQ0FBdUJ1QyxFQUF2QixDQUEyQkMsRUFBM0IsQ0FBK0JDLEVBQS9CLENBQW9DLENBRXhDLFdBQWEsS0FBS0MsTUFBbEIsQ0FFQUEsT0FBUSxDQUFSLEVBQVl6ZixJQUFaLENBQWtCNmMsRUFBbEIsRUFDQTRDLE9BQVEsQ0FBUixFQUFZemYsSUFBWixDQUFrQjhjLEVBQWxCLEVBQ0EyQyxPQUFRLENBQVIsRUFBWXpmLElBQVosQ0FBa0IrYyxFQUFsQixFQUNBMEMsT0FBUSxDQUFSLEVBQVl6ZixJQUFaLENBQWtCc2YsRUFBbEIsRUFDQUcsT0FBUSxDQUFSLEVBQVl6ZixJQUFaLENBQWtCdWYsRUFBbEIsRUFDQUUsT0FBUSxDQUFSLEVBQVl6ZixJQUFaLENBQWtCd2YsRUFBbEIsRUFFQSxXQUFBLENBRUEsQ0FmZ0MsQ0FpQmpDemYsTUFBTyxVQUFZLENBRWxCLGdCQUFnQm5wQixXQUFULEdBQXVCb3BCLElBQXZCLENBQTZCLElBQTdCLENBQVAsQ0FFQSxDQXJCZ0MsQ0F1QmpDQSxLQUFNLFNBQVcyZixPQUFYLENBQXFCLENBRTFCLFdBQWEsS0FBS0YsTUFBbEIsQ0FFQSxJQUFNLE1BQVEsQ0FBZCxDQUFpQnJrQyxFQUFJLENBQXJCLENBQXdCQSxHQUF4QixDQUErQixDQUU5QnFrQyxPQUFRcmtDLENBQVIsRUFBWTRrQixJQUFaLENBQWtCMmYsUUFBUUYsTUFBUixDQUFnQnJrQyxDQUFoQixDQUFsQixFQUVBLENBRUQsV0FBQSxDQUVBLENBbkNnQyxDQXFDakN3a0MsY0FBZSxTQUFXaGlCLENBQVgsQ0FBZSxDQUU3QixXQUFhLEtBQUs2aEIsTUFBbEIsQ0FDQSxPQUFTN2hCLEVBQUVrRCxRQUFYLENBQ0EsUUFBVTBELEdBQUksQ0FBSixDQUFWLENBQW1CcWIsSUFBTXJiLEdBQUksQ0FBSixDQUF6QixDQUFrQ3NiLElBQU10YixHQUFJLENBQUosQ0FBeEMsQ0FBaUR1YixJQUFNdmIsR0FBSSxDQUFKLENBQXZELENBQ0EsUUFBVUEsR0FBSSxDQUFKLENBQVYsQ0FBbUJ3YixJQUFNeGIsR0FBSSxDQUFKLENBQXpCLENBQWtDeWIsSUFBTXpiLEdBQUksQ0FBSixDQUF4QyxDQUFpRDBiLElBQU0xYixHQUFJLENBQUosQ0FBdkQsQ0FDQSxRQUFVQSxHQUFJLENBQUosQ0FBVixDQUFtQjJiLElBQU0zYixHQUFJLENBQUosQ0FBekIsQ0FBa0M0YixLQUFPNWIsR0FBSSxFQUFKLENBQXpDLENBQW1ENmIsS0FBTzdiLEdBQUksRUFBSixDQUExRCxDQUNBLFNBQVdBLEdBQUksRUFBSixDQUFYLENBQXFCOGIsS0FBTzliLEdBQUksRUFBSixDQUE1QixDQUFzQytiLEtBQU8vYixHQUFJLEVBQUosQ0FBN0MsQ0FBdURnYyxLQUFPaGMsR0FBSSxFQUFKLENBQTlELENBRUFpYixPQUFRLENBQVIsRUFBWXhCLGFBQVosQ0FBMkI4QixJQUFNVSxHQUFqQyxDQUFzQ1AsSUFBTVEsR0FBNUMsQ0FBaURMLEtBQU9NLEdBQXhELENBQTZESCxLQUFPSSxJQUFwRSxFQUEyRWpmLFNBQTNFLEdBQ0E4ZCxPQUFRLENBQVIsRUFBWXhCLGFBQVosQ0FBMkI4QixJQUFNVSxHQUFqQyxDQUFzQ1AsSUFBTVEsR0FBNUMsQ0FBaURMLEtBQU9NLEdBQXhELENBQTZESCxLQUFPSSxJQUFwRSxFQUEyRWpmLFNBQTNFLEdBQ0E4ZCxPQUFRLENBQVIsRUFBWXhCLGFBQVosQ0FBMkI4QixJQUFNRixHQUFqQyxDQUFzQ0ssSUFBTUYsR0FBNUMsQ0FBaURLLEtBQU9GLEdBQXhELENBQTZESyxLQUFPRixJQUFwRSxFQUEyRTNlLFNBQTNFLEdBQ0E4ZCxPQUFRLENBQVIsRUFBWXhCLGFBQVosQ0FBMkI4QixJQUFNRixHQUFqQyxDQUFzQ0ssSUFBTUYsR0FBNUMsQ0FBaURLLEtBQU9GLEdBQXhELENBQTZESyxLQUFPRixJQUFwRSxFQUEyRTNlLFNBQTNFLEdBQ0E4ZCxPQUFRLENBQVIsRUFBWXhCLGFBQVosQ0FBMkI4QixJQUFNRCxHQUFqQyxDQUFzQ0ksSUFBTUQsR0FBNUMsQ0FBaURJLEtBQU9ELElBQXhELENBQThESSxLQUFPRCxJQUFyRSxFQUE0RTVlLFNBQTVFLEdBQ0E4ZCxPQUFRLENBQVIsRUFBWXhCLGFBQVosQ0FBMkI4QixJQUFNRCxHQUFqQyxDQUFzQ0ksSUFBTUQsR0FBNUMsQ0FBaURJLEtBQU9ELElBQXhELENBQThESSxLQUFPRCxJQUFyRSxFQUE0RTVlLFNBQTVFLEdBRUEsV0FBQSxDQUVBLENBdkRnQyxDQXlEakNrZixpQkFBa0IsVUFBWSxDQUU3QixXQUFhLFVBQUEsRUFBYixDQUVBLGdDQUFPLENBQTJCam1DLE1BQTNCLENBQW9DLENBRTFDLGFBQWVBLE9BQU95Z0MsUUFBdEIsQ0FFQSxHQUFLQSxTQUFTeUYsY0FBVCxHQUE0QixJQUFqQyxDQUNDekYsU0FBUzBGLHFCQUFULEdBRUQ3RSxPQUFPbGMsSUFBUCxDQUFhcWIsU0FBU3lGLGNBQXRCLEVBQ0U5VyxZQURGLENBQ2dCcHZCLE9BQU84M0IsV0FEdkIsRUFHQSxZQUFZdUosZ0JBQUwsQ0FBdUJDLE1BQXZCLENBQVAsQ0FFQSxDQVpELENBY0EsQ0FsQmlCLEVBekRlLENBNkVqQzhFLGlCQUFrQixVQUFZLENBRTdCLFdBQWEsVUFBQSxFQUFiLENBRUEsZ0NBQU8sQ0FBMkJDLE1BQTNCLENBQW9DLENBRTFDL0UsT0FBT2paLE1BQVAsQ0FBY3ZYLEdBQWQsQ0FBbUIsQ0FBbkIsQ0FBc0IsQ0FBdEIsQ0FBeUIsQ0FBekIsRUFDQXd3QixPQUFPcEksTUFBUCxDQUFnQixrQkFBaEIsQ0FDQW9JLE9BQU9sUyxZQUFQLENBQXFCaVgsT0FBT3ZPLFdBQTVCLEVBRUEsWUFBWXVKLGdCQUFMLENBQXVCQyxNQUF2QixDQUFQLENBRUEsQ0FSRCxDQVVBLENBZGlCLEVBN0VlLENBNkZqQ0QsaUJBQWtCLFNBQVdDLE1BQVgsQ0FBb0IsQ0FFckMsV0FBYSxLQUFLdUQsTUFBbEIsQ0FDQSxXQUFhdkQsT0FBT2paLE1BQXBCLENBQ0EsY0FBZ0IsQ0FBRWlaLE9BQU9wSSxNQUF6QixDQUVBLElBQU0sTUFBUSxDQUFkLENBQWlCMTRCLEVBQUksQ0FBckIsQ0FBd0JBLEdBQXhCLENBQStCLENBRTlCLGFBQWVxa0MsT0FBUXJrQyxDQUFSLEVBQVlraUMsZUFBWixDQUE2QnJhLE1BQTdCLENBQWYsQ0FFQSxHQUFLaWUsU0FBV0MsU0FBaEIsQ0FBNEIsQ0FFM0IsWUFBQSxDQUVBLENBRUQsQ0FFRCxXQUFBLENBRUEsQ0FqSGdDLENBbUhqQ25GLGNBQWUsVUFBWSxDQUUxQixPQUFTLFdBQUEsRUFBVCxDQUNDZSxHQUFLLFdBQUEsRUFETixDQUdBLDZCQUFPLENBQXdCaEMsR0FBeEIsQ0FBOEIsQ0FFcEMsV0FBYSxLQUFLMEUsTUFBbEIsQ0FFQSxJQUFNLE1BQVEsQ0FBZCxDQUFpQnJrQyxFQUFJLENBQXJCLENBQXdCQSxHQUF4QixDQUErQixDQUU5QixVQUFZcWtDLE9BQVFya0MsQ0FBUixDQUFaLENBRUEwaEMsR0FBR252QixDQUFILENBQU8ydUIsTUFBTTlJLE1BQU4sQ0FBYTdsQixDQUFiLENBQWlCLENBQWpCLENBQXFCb3RCLElBQUlqNUIsR0FBSixDQUFRNkwsQ0FBN0IsQ0FBaUNvdEIsSUFBSWg1QixHQUFKLENBQVE0TCxDQUFoRCxDQUNBb3ZCLEdBQUdwdkIsQ0FBSCxDQUFPMnVCLE1BQU05SSxNQUFOLENBQWE3bEIsQ0FBYixDQUFpQixDQUFqQixDQUFxQm90QixJQUFJaDVCLEdBQUosQ0FBUTRMLENBQTdCLENBQWlDb3RCLElBQUlqNUIsR0FBSixDQUFRNkwsQ0FBaEQsQ0FDQW12QixHQUFHM2UsQ0FBSCxDQUFPbWUsTUFBTTlJLE1BQU4sQ0FBYXJWLENBQWIsQ0FBaUIsQ0FBakIsQ0FBcUI0YyxJQUFJajVCLEdBQUosQ0FBUXFjLENBQTdCLENBQWlDNGMsSUFBSWg1QixHQUFKLENBQVFvYyxDQUFoRCxDQUNBNGUsR0FBRzVlLENBQUgsQ0FBT21lLE1BQU05SSxNQUFOLENBQWFyVixDQUFiLENBQWlCLENBQWpCLENBQXFCNGMsSUFBSWg1QixHQUFKLENBQVFvYyxDQUE3QixDQUFpQzRjLElBQUlqNUIsR0FBSixDQUFRcWMsQ0FBaEQsQ0FDQTJlLEdBQUc5WCxDQUFILENBQU9zWCxNQUFNOUksTUFBTixDQUFheE8sQ0FBYixDQUFpQixDQUFqQixDQUFxQitWLElBQUlqNUIsR0FBSixDQUFRa2pCLENBQTdCLENBQWlDK1YsSUFBSWg1QixHQUFKLENBQVFpakIsQ0FBaEQsQ0FDQStYLEdBQUcvWCxDQUFILENBQU9zWCxNQUFNOUksTUFBTixDQUFheE8sQ0FBYixDQUFpQixDQUFqQixDQUFxQitWLElBQUloNUIsR0FBSixDQUFRaWpCLENBQTdCLENBQWlDK1YsSUFBSWo1QixHQUFKLENBQVFrakIsQ0FBaEQsQ0FFQSxPQUFTc1gsTUFBTWdCLGVBQU4sQ0FBdUJSLEVBQXZCLENBQVQsQ0FDQSxPQUFTUixNQUFNZ0IsZUFBTixDQUF1QlAsRUFBdkIsQ0FBVCxDQUVBO0VBRUEsR0FBSzFmLEdBQUssQ0FBTCxFQUFVQyxHQUFLLENBQXBCLENBQXdCLENBRXZCLFlBQUEsQ0FFQSxDQUVELENBRUQsV0FBQSxDQUVBLENBOUJELENBZ0NBLENBckNjLEVBbkhrQixDQTBKakN1ZSxjQUFlLFNBQVc3ekIsS0FBWCxDQUFtQixDQUVqQyxXQUFhLEtBQUt5M0IsTUFBbEIsQ0FFQSxJQUFNLE1BQVEsQ0FBZCxDQUFpQnJrQyxFQUFJLENBQXJCLENBQXdCQSxHQUF4QixDQUErQixDQUU5QixHQUFLcWtDLE9BQVFya0MsQ0FBUixFQUFZa2lDLGVBQVosQ0FBNkJ0MUIsS0FBN0IsRUFBdUMsQ0FBNUMsQ0FBZ0QsQ0FFL0MsWUFBQSxDQUVBLENBRUQsQ0FFRCxXQUFBLENBRUEsQ0ExS2dDLENBQWxDLEVBOEtBLHNCQUF3QixrRkFBeEIsQ0FFQSwyQkFBNkIsOERBQTdCLENBRUEsdUJBQXlCLDBFQUF6QixDQUVBLG1CQUFxQiw0YUFBckIsQ0FFQSx3QkFBMEIsdUZBQTFCLENBRUEsaUJBQW1CLDBDQUFuQixDQUVBLHVCQUF5Qix5Q0FBekIsQ0FFQSxVQUFZLG83TEFBWixDQUVBLDBCQUE0Qiw0NUJBQTVCLENBRUEsNkJBQStCLDBqQkFBL0IsQ0FFQSxrQ0FBb0MsNExBQXBDLENBRUEsZ0NBQWtDLHFIQUFsQyxDQUVBLDJCQUE2QiwySEFBN0IsQ0FFQSxtQkFBcUIseURBQXJCLENBRUEsd0JBQTBCLG9EQUExQixDQUVBLHNCQUF3QixrREFBeEIsQ0FFQSxpQkFBbUIscURBQW5CLENBRUEsV0FBYSwyckVBQWIsQ0FFQSxnQ0FBa0Msb2xJQUFsQyxDQUVBLHlCQUEyQixnSUFBM0IsQ0FFQSxnQ0FBa0MsbUpBQWxDLENBRUEsMkJBQTZCLG1LQUE3QixDQUVBLHlCQUEyQiw4TUFBM0IsQ0FFQSw4QkFBZ0Msb0VBQWhDLENBRUEsdUJBQXlCLHlEQUF6QixDQUVBLDRCQUE4QiwrdUZBQTlCLENBRUEsb0JBQXNCLGdxREFBdEIsQ0FFQSx5QkFBMkIsOG9CQUEzQixDQUVBLHVCQUF5QixnT0FBekIsQ0FFQSxrQkFBb0Isc2dCQUFwQixDQUVBLGVBQWlCLHFEQUFqQixDQUVBLG9CQUFzQixxREFBdEIsQ0FFQSxpQkFBbUIsOFNBQW5CLENBRUEsc0JBQXdCLDJNQUF4QixDQUVBLDhCQUFnQyx5WUFBaEMsQ0FFQSxzQkFBd0IsOEhBQXhCLENBRUEsMkJBQTZCLGdHQUE3QixDQUVBLDBCQUE0Qix3dUVBQTVCLENBRUEsc0JBQXdCLHFwSEFBeEIsQ0FFQSxxQkFBdUIsazVHQUF2QixDQUVBLDBCQUE0Qix1TUFBNUIsQ0FFQSwrQkFBaUMsNDZDQUFqQyxDQUVBLDZCQUErQiw2aUJBQS9CLENBRUEsa0NBQW9DLDh1SkFBcEMsQ0FFQSwwQkFBNEIsNnhGQUE1QixDQUVBLHlCQUEyQiwweUJBQTNCLENBRUEsd0JBQTBCLDZQQUExQixDQUVBLHlCQUEyQix5SUFBM0IsQ0FFQSw4QkFBZ0MseUlBQWhDLENBRUEsNEJBQThCLHVJQUE5QixDQUVBLHVCQUF5Qix1UEFBekIsQ0FFQSxpQkFBbUIscUpBQW5CLENBRUEsc0JBQXdCLG9EQUF4QixDQUVBLDBCQUE0Qix5TUFBNUIsQ0FFQSwrQkFBaUMsaUZBQWpDLENBRUEsMEJBQTRCLHdLQUE1QixDQUVBLCtCQUFpQyxvRUFBakMsQ0FFQSx1QkFBeUIsK1VBQXpCLENBRUEsNEJBQThCLDBLQUE5QixDQUVBLHVCQUF5Qix5cUJBQXpCLENBRUEsMEJBQTRCLGdhQUE1QixDQUVBLHlCQUEyQiw0TEFBM0IsQ0FFQSw0QkFBOEIsMnpCQUE5QixDQUVBLFlBQWMsb3lDQUFkLENBRUEsaUNBQW1DLDZFQUFuQyxDQUVBLG1CQUFxQiwrR0FBckIsQ0FFQSx1QkFBeUIseUZBQXpCLENBRUEsNEJBQThCLG9WQUE5QixDQUVBLDBCQUE0Qix3S0FBNUIsQ0FFQSwrQkFBaUMsb0VBQWpDLENBRUEsNEJBQThCLGlwTkFBOUIsQ0FFQSwwQkFBNEIseWVBQTVCLENBRUEscUJBQXVCLHFsQkFBdkIsQ0FFQSw2QkFBK0IsMndDQUEvQixDQUVBLG9CQUFzQixpT0FBdEIsQ0FFQSx5QkFBMkIsMmdDQUEzQixDQUVBLG9CQUFzQixnWUFBdEIsQ0FFQSxzQkFBd0IsNldBQXhCLENBRUEseUJBQTJCLHlMQUEzQixDQUVBLDhCQUFnQyxrRUFBaEMsQ0FFQSx5QkFBMkIsOEZBQTNCLENBRUEsOEJBQWdDLCs2QkFBaEMsQ0FFQSxxQkFBdUIsZ1FBQXZCLENBRUEsbUJBQXFCLCtSQUFyQixDQUVBLGNBQWdCLHdSQUFoQixDQUVBLHNCQUF3QixtRkFBeEIsQ0FFQSxvQkFBc0IsMEdBQXRCLENBRUEsZUFBaUIsNEVBQWpCLENBRUEsb0JBQXNCLHlKQUF0QixDQUVBLGNBQWdCLHVQQUFoQixDQUVBLGNBQWdCLGdPQUFoQixDQUVBLGVBQWlCLHN2QkFBakIsQ0FFQSxlQUFpQixtcUJBQWpCLENBRUEsc0JBQXdCLDhyQkFBeEIsQ0FFQSxzQkFBd0IsbXRCQUF4QixDQUVBLGtCQUFvQixtWEFBcEIsQ0FFQSxrQkFBb0IsOExBQXBCLENBRUEsb0JBQXNCLG95QkFBdEIsQ0FFQSxvQkFBc0IsaWhCQUF0QixDQUVBLG1CQUFxQix1OENBQXJCLENBRUEsbUJBQXFCLHMyQkFBckIsQ0FFQSxxQkFBdUIscW5FQUF2QixDQUVBLHFCQUF1Qiw4bENBQXZCLENBRUEsbUJBQXFCLHNoRUFBckIsQ0FFQSxtQkFBcUIsc3FDQUFyQixDQUVBLHNCQUF3Qixnd0VBQXhCLENBRUEsc0JBQXdCLDhtQ0FBeEIsQ0FFQSxnQkFBa0IsZ2pCQUFsQixDQUVBLGdCQUFrQixnOEJBQWxCLENBRUEsZ0JBQWtCLDZ5QkFBbEIsQ0FFQSxnQkFBa0IsMm1CQUFsQixDQUVBLGdCQUFrQixnV0FBbEIsQ0FFQSxnQkFBa0IsZ09BQWxCLENBRUEsZ0JBQWtCLENBQ2pCbzVCLGtCQUFtQkEsaUJBREYsQ0FFakJDLHVCQUF3QkEsc0JBRlAsQ0FHakJDLG1CQUFvQkEsa0JBSEgsQ0FJakJDLGVBQWdCQSxjQUpDLENBS2pCQyxvQkFBcUJBLG1CQUxKLENBTWpCQyxhQUFjQSxZQU5HLENBT2pCQyxtQkFBb0JBLGtCQVBILENBUWpCQyxNQUFPQSxLQVJVLENBU2pCQyxzQkFBdUJBLHFCQVROLENBVWpCQyx5QkFBMEJBLHdCQVZULENBV2pCQyw4QkFBK0JBLDZCQVhkLENBWWpCQyw0QkFBNkJBLDJCQVpaLENBYWpCQyx1QkFBd0JBLHNCQWJQLENBY2pCQyxlQUFnQkEsY0FkQyxDQWVqQkMsb0JBQXFCQSxtQkFmSixDQWdCakJDLGtCQUFtQkEsaUJBaEJGLENBaUJqQkMsYUFBY0EsWUFqQkcsQ0FrQmpCQyxPQUFRQSxNQWxCUyxDQW1CakJDLDRCQUE2QkEsMkJBbkJaLENBb0JqQkMscUJBQXNCQSxvQkFwQkwsQ0FxQmpCQyw0QkFBNkJBLDJCQXJCWixDQXNCakJDLHVCQUF3QkEsc0JBdEJQLENBdUJqQkMscUJBQXNCQSxvQkF2QkwsQ0F3QmpCQywwQkFBMkJBLHlCQXhCVixDQXlCakJDLG1CQUFvQkEsa0JBekJILENBMEJqQkMsd0JBQXlCQSx1QkExQlIsQ0EyQmpCQyxnQkFBaUJBLGVBM0JBLENBNEJqQkMscUJBQXNCQSxvQkE1QkwsQ0E2QmpCQyxtQkFBb0JBLGtCQTdCSCxDQThCakJDLGNBQWVBLGFBOUJFLENBK0JqQkMsV0FBWUEsVUEvQkssQ0FnQ2pCQyxnQkFBaUJBLGVBaENBLENBaUNqQkMsYUFBY0EsWUFqQ0csQ0FrQ2pCQyxrQkFBbUJBLGlCQWxDRixDQW1DakJDLDBCQUEyQkEseUJBbkNWLENBb0NqQkMsa0JBQW1CQSxpQkFwQ0YsQ0FxQ2pCQyx1QkFBd0JBLHNCQXJDUCxDQXNDakJDLHNCQUF1QkEscUJBdENOLENBdUNqQkMsa0JBQW1CQSxpQkF2Q0YsQ0F3Q2pCQyxpQkFBa0JBLGdCQXhDRCxDQXlDakJDLHNCQUF1QkEscUJBekNOLENBMENqQkMsMkJBQTRCQSwwQkExQ1gsQ0EyQ2pCQyx5QkFBMEJBLHdCQTNDVCxDQTRDakJDLDhCQUErQkEsNkJBNUNkLENBNkNqQkMsc0JBQXVCQSxxQkE3Q04sQ0E4Q2pCQyxxQkFBc0JBLG9CQTlDTCxDQStDakJDLG9CQUFxQkEsbUJBL0NKLENBZ0RqQkMscUJBQXNCQSxvQkFoREwsQ0FpRGpCQywwQkFBMkJBLHlCQWpEVixDQWtEakJDLHdCQUF5QkEsdUJBbERSLENBbURqQkMsbUJBQW9CQSxrQkFuREgsQ0FvRGpCQyxhQUFjQSxZQXBERyxDQXFEakJDLGtCQUFtQkEsaUJBckRGLENBc0RqQkMsc0JBQXVCQSxxQkF0RE4sQ0F1RGpCQywyQkFBNEJBLDBCQXZEWCxDQXdEakJDLHNCQUF1QkEscUJBeEROLENBeURqQkMsMkJBQTRCQSwwQkF6RFgsQ0EwRGpCQyxtQkFBb0JBLGtCQTFESCxDQTJEakJDLHdCQUF5QkEsdUJBM0RSLENBNERqQkMsbUJBQW9CQSxrQkE1REgsQ0E2RGpCQyxzQkFBdUJBLHFCQTdETixDQThEakJDLHFCQUFzQkEsb0JBOURMLENBK0RqQkMsd0JBQXlCQSx1QkEvRFIsQ0FnRWpCQyxRQUFTQSxPQWhFUSxDQWlFakJDLDZCQUE4QkEsNEJBakViLENBa0VqQkMsZUFBZ0JBLGNBbEVDLENBbUVqQkMsbUJBQW9CQSxrQkFuRUgsQ0FvRWpCQyx3QkFBeUJBLHVCQXBFUixDQXFFakJDLHNCQUF1QkEscUJBckVOLENBc0VqQkMsMkJBQTRCQSwwQkF0RVgsQ0F1RWpCQyx3QkFBeUJBLHVCQXZFUixDQXdFakJDLHNCQUF1QkEscUJBeEVOLENBeUVqQkMsaUJBQWtCQSxnQkF6RUQsQ0EwRWpCQyx5QkFBMEJBLHdCQTFFVCxDQTJFakJDLGdCQUFpQkEsZUEzRUEsQ0E0RWpCQyxxQkFBc0JBLG9CQTVFTCxDQTZFakJDLGdCQUFpQkEsZUE3RUEsQ0E4RWpCQyxrQkFBbUJBLGlCQTlFRixDQStFakJDLHFCQUFzQkEsb0JBL0VMLENBZ0ZqQkMsMEJBQTJCQSx5QkFoRlYsQ0FpRmpCQyxxQkFBc0JBLG9CQWpGTCxDQWtGakJDLDBCQUEyQkEseUJBbEZWLENBbUZqQkMsaUJBQWtCQSxnQkFuRkQsQ0FvRmpCQyxlQUFnQkEsY0FwRkMsQ0FxRmpCQyxVQUFXQSxTQXJGTSxDQXNGakJDLGtCQUFtQkEsaUJBdEZGLENBdUZqQkMsZ0JBQWlCQSxlQXZGQSxDQXdGakJDLFdBQVlBLFVBeEZLLENBeUZqQkMsZ0JBQWlCQSxlQXpGQSxDQTJGakJDLFVBQVdBLFNBM0ZNLENBNEZqQkMsVUFBV0EsU0E1Rk0sQ0E2RmpCQyxXQUFZQSxVQTdGSyxDQThGakJDLFdBQVlBLFVBOUZLLENBK0ZqQkMsa0JBQW1CQSxpQkEvRkYsQ0FnR2pCQyxrQkFBbUJBLGlCQWhHRixDQWlHakJDLGNBQWVBLGFBakdFLENBa0dqQkMsY0FBZUEsYUFsR0UsQ0FtR2pCQyxnQkFBaUJBLGVBbkdBLENBb0dqQkMsZ0JBQWlCQSxlQXBHQSxDQXFHakJDLGVBQWdCQSxjQXJHQyxDQXNHakJDLGVBQWdCQSxjQXRHQyxDQXVHakJDLGlCQUFrQkEsZ0JBdkdELENBd0dqQkMsaUJBQWtCQSxnQkF4R0QsQ0F5R2pCQyxlQUFnQkEsY0F6R0MsQ0EwR2pCQyxlQUFnQkEsY0ExR0MsQ0EyR2pCQyxrQkFBbUJBLGlCQTNHRixDQTRHakJDLGtCQUFtQkEsaUJBNUdGLENBNkdqQkMsWUFBYUEsV0E3R0ksQ0E4R2pCQyxZQUFhQSxXQTlHSSxDQStHakJDLFlBQWFBLFdBL0dJLENBZ0hqQkMsWUFBYUEsV0FoSEksQ0FpSGpCQyxZQUFhQSxXQWpISSxDQWtIakJDLFlBQWFBLFdBbEhJLENBQWxCLENBcUhBOztLQUlBLGtCQUFvQixDQUVuQkMsTUFBTyxTQUFXQyxRQUFYLENBQXNCLENBRTVCLFdBQWEsRUFBYixDQUVBLElBQU0sTUFBUSxDQUFkLENBQWlCQyxFQUFJRCxTQUFTdnRDLE1BQTlCLENBQXNDd3RDLEdBQXRDLENBQTZDLENBRTVDLFFBQVUsS0FBS3hvQixLQUFMLENBQVl1b0IsU0FBVUMsQ0FBVixDQUFaLENBQVYsQ0FFQSxJQUFNLEtBQU4sT0FBQSxDQUFxQixDQUVwQkMsT0FBUXZ2QixDQUFSLEVBQWNtUixJQUFLblIsQ0FBTCxDQUFkLENBRUEsQ0FFRCxDQUVELGFBQUEsQ0FFQSxDQXBCa0IsQ0FzQm5COEcsTUFBTyxTQUFXMG9CLFlBQVgsQ0FBMEIsQ0FFaEMsaUJBQW1CLEVBQW5CLENBRUEsSUFBTSxLQUFOLGdCQUFBLENBQThCLENBRTdCQyxhQUFjSCxDQUFkLEVBQW9CLEVBQXBCLENBRUEsSUFBTSxLQUFOLGlCQUE2QkEsQ0FBZCxDQUFmLENBQW1DLENBRWxDLGtCQUFvQkUsYUFBY0YsQ0FBZCxFQUFtQnR2QixDQUFuQixDQUFwQixDQUVBLEdBQUswdkIsZ0JBQW1CQSxjQUFjQyxPQUFkLEVBQ3ZCRCxjQUFjdlUsU0FEUyxFQUNJdVUsY0FBY3RsQixTQURsQixFQUV2QnNsQixjQUFjbnBCLFNBRlMsRUFFSW1wQixjQUFjbFgsU0FGbEIsRUFFK0JrWCxjQUFjMVEsU0FGN0MsRUFHdkIwUSxjQUFjL1IsU0FIVixDQUFMLENBRzZCLENBRTVCOFIsYUFBY0gsQ0FBZCxFQUFtQnR2QixDQUFuQixFQUF5QjB2QixjQUFjNW9CLEtBQWQsRUFBekIsQ0FFQSxDQVBELFFBT1k3WCxNQUFNeU0sT0FBTixDQUFlZzBCLGFBQWYsQ0FBTCxDQUFzQyxDQUU1Q0QsYUFBY0gsQ0FBZCxFQUFtQnR2QixDQUFuQixFQUF5QjB2QixjQUFjaHRDLEtBQWQsRUFBekIsQ0FFQSxDQUpNLElBSUEsQ0FFTitzQyxhQUFjSCxDQUFkLEVBQW1CdHZCLENBQW5CLEVBQXlCMHZCLGFBQXpCLENBRUEsQ0FFRCxDQUVELENBRUQsbUJBQUEsQ0FFQSxDQXpEa0IsQ0FBcEIsQ0E2REE7O0tBSUEsa0JBQW9CLENBQUUsWUFBYSxRQUFmLENBQXlCLGVBQWdCLFFBQXpDLENBQW1ELE9BQVEsUUFBM0QsQ0FBcUUsYUFBYyxRQUFuRixDQUE2RixRQUFTLFFBQXRHLENBQ25CLFFBQVMsUUFEVSxDQUNBLFNBQVUsUUFEVixDQUNvQixRQUFTLFFBRDdCLENBQ3VDLGlCQUFrQixRQUR6RCxDQUNtRSxPQUFRLFFBRDNFLENBQ3FGLGFBQWMsUUFEbkcsQ0FFbkIsUUFBUyxRQUZVLENBRUEsWUFBYSxRQUZiLENBRXVCLFlBQWEsUUFGcEMsQ0FFOEMsYUFBYyxRQUY1RCxDQUVzRSxZQUFhLFFBRm5GLENBRTZGLFFBQVMsUUFGdEcsQ0FHbkIsaUJBQWtCLFFBSEMsQ0FHUyxXQUFZLFFBSHJCLENBRytCLFVBQVcsUUFIMUMsQ0FHb0QsT0FBUSxRQUg1RCxDQUdzRSxXQUFZLFFBSGxGLENBRzRGLFdBQVksUUFIeEcsQ0FJbkIsZ0JBQWlCLFFBSkUsQ0FJUSxXQUFZLFFBSnBCLENBSThCLFlBQWEsUUFKM0MsQ0FJcUQsV0FBWSxRQUpqRSxDQUkyRSxZQUFhLFFBSnhGLENBSWtHLGNBQWUsUUFKakgsQ0FLbkIsaUJBQWtCLFFBTEMsQ0FLUyxhQUFjLFFBTHZCLENBS2lDLGFBQWMsUUFML0MsQ0FLeUQsVUFBVyxRQUxwRSxDQUs4RSxhQUFjLFFBTDVGLENBS3NHLGVBQWdCLFFBTHRILENBTW5CLGdCQUFpQixRQU5FLENBTVEsZ0JBQWlCLFFBTnpCLENBTW1DLGdCQUFpQixRQU5wRCxDQU04RCxnQkFBaUIsUUFOL0UsQ0FNeUYsYUFBYyxRQU52RyxDQU9uQixXQUFZLFFBUE8sQ0FPRyxjQUFlLFFBUGxCLENBTzRCLFVBQVcsUUFQdkMsQ0FPaUQsVUFBVyxRQVA1RCxDQU9zRSxhQUFjLFFBUHBGLENBTzhGLFlBQWEsUUFQM0csQ0FRbkIsY0FBZSxRQVJJLENBUU0sY0FBZSxRQVJyQixDQVErQixVQUFXLFFBUjFDLENBUW9ELFlBQWEsUUFSakUsQ0FRMkUsYUFBYyxRQVJ6RixDQVFtRyxPQUFRLFFBUjNHLENBU25CLFlBQWEsUUFUTSxDQVNJLE9BQVEsUUFUWixDQVNzQixRQUFTLFFBVC9CLENBU3lDLGNBQWUsUUFUeEQsQ0FTa0UsT0FBUSxRQVQxRSxDQVNvRixXQUFZLFFBVGhHLENBUzBHLFVBQVcsUUFUckgsQ0FVbkIsWUFBYSxRQVZNLENBVUksU0FBVSxRQVZkLENBVXdCLFFBQVMsUUFWakMsQ0FVMkMsUUFBUyxRQVZwRCxDQVU4RCxXQUFZLFFBVjFFLENBVW9GLGdCQUFpQixRQVZyRyxDQVUrRyxZQUFhLFFBVjVILENBV25CLGVBQWdCLFFBWEcsQ0FXTyxZQUFhLFFBWHBCLENBVzhCLGFBQWMsUUFYNUMsQ0FXc0QsWUFBYSxRQVhuRSxDQVc2RSx1QkFBd0IsUUFYckcsQ0FXK0csWUFBYSxRQVg1SCxDQVluQixhQUFjLFFBWkssQ0FZSyxZQUFhLFFBWmxCLENBWTRCLFlBQWEsUUFaekMsQ0FZbUQsY0FBZSxRQVpsRSxDQVk0RSxnQkFBaUIsUUFaN0YsQ0FZdUcsZUFBZ0IsUUFadkgsQ0FhbkIsaUJBQWtCLFFBYkMsQ0FhUyxpQkFBa0IsUUFiM0IsQ0FhcUMsaUJBQWtCLFFBYnZELENBYWlFLGNBQWUsUUFiaEYsQ0FhMEYsT0FBUSxRQWJsRyxDQWE0RyxZQUFhLFFBYnpILENBY25CLFFBQVMsUUFkVSxDQWNBLFVBQVcsUUFkWCxDQWNxQixTQUFVLFFBZC9CLENBY3lDLG1CQUFvQixRQWQ3RCxDQWN1RSxhQUFjLFFBZHJGLENBYytGLGVBQWdCLFFBZC9HLENBZW5CLGVBQWdCLFFBZkcsQ0FlTyxpQkFBa0IsUUFmekIsQ0FlbUMsa0JBQW1CLFFBZnRELENBZWdFLG9CQUFxQixRQWZyRixDQWUrRixrQkFBbUIsUUFmbEgsQ0FnQm5CLGtCQUFtQixRQWhCQSxDQWdCVSxlQUFnQixRQWhCMUIsQ0FnQm9DLFlBQWEsUUFoQmpELENBZ0IyRCxZQUFhLFFBaEJ4RSxDQWdCa0YsV0FBWSxRQWhCOUYsQ0FnQndHLGNBQWUsUUFoQnZILENBaUJuQixPQUFRLFFBakJXLENBaUJELFVBQVcsUUFqQlYsQ0FpQm9CLFFBQVMsUUFqQjdCLENBaUJ1QyxZQUFhLFFBakJwRCxDQWlCOEQsU0FBVSxRQWpCeEUsQ0FpQmtGLFlBQWEsUUFqQi9GLENBaUJ5RyxTQUFVLFFBakJuSCxDQWtCbkIsZ0JBQWlCLFFBbEJFLENBa0JRLFlBQWEsUUFsQnJCLENBa0IrQixnQkFBaUIsUUFsQmhELENBa0IwRCxnQkFBaUIsUUFsQjNFLENBa0JxRixhQUFjLFFBbEJuRyxDQWtCNkcsWUFBYSxRQWxCMUgsQ0FtQm5CLE9BQVEsUUFuQlcsQ0FtQkQsT0FBUSxRQW5CUCxDQW1CaUIsT0FBUSxRQW5CekIsQ0FtQm1DLGFBQWMsUUFuQmpELENBbUIyRCxTQUFVLFFBbkJyRSxDQW1CK0UsZ0JBQWlCLFFBbkJoRyxDQW1CMEcsTUFBTyxRQW5CakgsQ0FtQjJILFlBQWEsUUFuQnhJLENBb0JuQixZQUFhLFFBcEJNLENBb0JJLGNBQWUsUUFwQm5CLENBb0I2QixTQUFVLFFBcEJ2QyxDQW9CaUQsYUFBYyxRQXBCL0QsQ0FvQnlFLFdBQVksUUFwQnJGLENBb0IrRixXQUFZLFFBcEIzRyxDQXFCbkIsU0FBVSxRQXJCUyxDQXFCQyxTQUFVLFFBckJYLENBcUJxQixVQUFXLFFBckJoQyxDQXFCMEMsWUFBYSxRQXJCdkQsQ0FxQmlFLFlBQWEsUUFyQjlFLENBcUJ3RixZQUFhLFFBckJyRyxDQXFCK0csT0FBUSxRQXJCdkgsQ0FzQm5CLGNBQWUsUUF0QkksQ0FzQk0sWUFBYSxRQXRCbkIsQ0FzQjZCLE1BQU8sUUF0QnBDLENBc0I4QyxPQUFRLFFBdEJ0RCxDQXNCZ0UsVUFBVyxRQXRCM0UsQ0FzQnFGLFNBQVUsUUF0Qi9GLENBc0J5RyxZQUFhLFFBdEJ0SCxDQXVCbkIsU0FBVSxRQXZCUyxDQXVCQyxRQUFTLFFBdkJWLENBdUJvQixRQUFTLFFBdkI3QixDQXVCdUMsYUFBYyxRQXZCckQsQ0F1QitELFNBQVUsUUF2QnpFLENBdUJtRixjQUFlLFFBdkJsRyxDQUFwQixDQXlCQSxjQUFBLENBQWdCOTJCLENBQWhCLENBQW1CblYsQ0FBbkIsQ0FBc0JrQixDQUF0QixDQUEwQixDQUV6QixHQUFLbEIsSUFBTWhELFNBQU4sRUFBbUJrRSxJQUFNbEUsU0FBOUIsQ0FBMEM7RUFHekMsWUFBWWdTLEdBQUwsQ0FBVW1HLENBQVYsQ0FBUCxDQUVBLENBRUQsWUFBWWczQixNQUFMLENBQWFoM0IsQ0FBYixDQUFnQm5WLENBQWhCLENBQW1Ca0IsQ0FBbkIsQ0FBUCxDQUVBLENBRUR2SixPQUFPNG5CLE1BQVAsQ0FBZTZzQixNQUFNeDBDLFNBQXJCLENBQWdDLENBRS9CczBDLFFBQVMsSUFGc0IsQ0FJL0IvMkIsRUFBRyxDQUo0QixDQUl6Qm5WLEVBQUcsQ0FKc0IsQ0FJbkJrQixFQUFHLENBSmdCLENBTS9COE4sSUFBSyxTQUFXM1QsS0FBWCxDQUFtQixDQUV2QixHQUFLQSxPQUFTQSxNQUFNNndDLE9BQXBCLENBQThCLENBRTdCLEtBQUs1b0IsSUFBTCxDQUFXam9CLEtBQVgsRUFFQSxDQUpELFFBSVksWUFBQSxHQUFpQixRQUF0QixDQUFpQyxDQUV2QyxLQUFLZ3hDLE1BQUwsQ0FBYWh4QyxLQUFiLEVBRUEsQ0FKTSxRQUlLLFlBQUEsR0FBaUIsUUFBdEIsQ0FBaUMsQ0FFdkMsS0FBS2l4QyxRQUFMLENBQWVqeEMsS0FBZixFQUVBLENBRUQsV0FBQSxDQUVBLENBeEI4QixDQTBCL0IwbkIsVUFBVyxTQUFXQyxNQUFYLENBQW9CLENBRTlCLEtBQUs3TixDQUFMLENBQVM2TixNQUFULENBQ0EsS0FBS2hqQixDQUFMLENBQVNnakIsTUFBVCxDQUNBLEtBQUs5aEIsQ0FBTCxDQUFTOGhCLE1BQVQsQ0FFQSxXQUFBLENBRUEsQ0FsQzhCLENBb0MvQnFwQixPQUFRLFNBQVdFLEdBQVgsQ0FBaUIsQ0FFeEJBLElBQU1oc0MsS0FBS0UsS0FBTCxDQUFZOHJDLEdBQVosQ0FBTixDQUVBLEtBQUtwM0IsQ0FBTCxDQUFTLENBQUVvM0IsS0FBTyxFQUFQLENBQVksR0FBZCxFQUFzQixHQUEvQixDQUNBLEtBQUt2c0MsQ0FBTCxDQUFTLENBQUV1c0MsS0FBTyxDQUFQLENBQVcsR0FBYixFQUFxQixHQUE5QixDQUNBLEtBQUtyckMsQ0FBTCxDQUFTLENBQUVxckMsSUFBTSxHQUFSLEVBQWdCLEdBQXpCLENBRUEsV0FBQSxDQUVBLENBOUM4QixDQWdEL0JKLE9BQVEsU0FBV2gzQixDQUFYLENBQWNuVixDQUFkLENBQWlCa0IsQ0FBakIsQ0FBcUIsQ0FFNUIsS0FBS2lVLENBQUwsQ0FBU0EsQ0FBVCxDQUNBLEtBQUtuVixDQUFMLENBQVNBLENBQVQsQ0FDQSxLQUFLa0IsQ0FBTCxDQUFTQSxDQUFULENBRUEsV0FBQSxDQUVBLENBeEQ4QixDQTBEL0JzckMsT0FBUSxVQUFZLENBRW5CLGdCQUFBLENBQWtCandCLENBQWxCLENBQXFCc04sQ0FBckIsQ0FBd0JuSSxDQUF4QixDQUE0QixDQUUzQixHQUFLQSxFQUFJLENBQVQsQ0FBYUEsR0FBSyxDQUFMLENBQ2IsR0FBS0EsRUFBSSxDQUFULENBQWFBLEdBQUssQ0FBTCxDQUNiLEdBQUtBLEVBQUksRUFBSSxDQUFiLENBQWlCLFNBQVcsQ0FBRW1JLEVBQUl0TixDQUFOLEVBQVksQ0FBWixDQUFnQm1GLENBQTNCLENBQ2pCLEdBQUtBLEVBQUksRUFBSSxDQUFiLENBQWlCLFFBQUEsQ0FDakIsR0FBS0EsRUFBSSxFQUFJLENBQWIsQ0FBaUIsU0FBVyxDQUFFbUksRUFBSXROLENBQU4sRUFBWSxDQUFaLEVBQWtCLEVBQUksQ0FBSixDQUFRbUYsQ0FBMUIsQ0FBWCxDQUNqQixRQUFBLENBRUEsQ0FFRCxzQkFBTyxDQUFpQmdQLENBQWpCLENBQW9CenZCLENBQXBCLENBQXVCRSxDQUF2QixDQUEyQjtFQUdqQ3V2QixFQUFJck8sTUFBTXJCLGVBQU4sQ0FBdUIwUCxDQUF2QixDQUEwQixDQUExQixDQUFKLENBQ0F6dkIsRUFBSW9oQixNQUFNdEIsS0FBTixDQUFhOWYsQ0FBYixDQUFnQixDQUFoQixDQUFtQixDQUFuQixDQUFKLENBQ0FFLEVBQUlraEIsTUFBTXRCLEtBQU4sQ0FBYTVmLENBQWIsQ0FBZ0IsQ0FBaEIsQ0FBbUIsQ0FBbkIsQ0FBSixDQUVBLEdBQUtGLElBQU0sQ0FBWCxDQUFlLENBRWQsS0FBS2tVLENBQUwsQ0FBUyxLQUFLblYsQ0FBTCxDQUFTLEtBQUtrQixDQUFMLENBQVNDLENBQTNCLENBRUEsQ0FKRCxJQUlPLENBRU4sTUFBUUEsR0FBSyxHQUFMLENBQVdBLEdBQU0sRUFBSUYsQ0FBVixDQUFYLENBQTJCRSxFQUFJRixDQUFKLENBQVVFLEVBQUlGLENBQWpELENBQ0EsTUFBVSxFQUFJRSxDQUFOLENBQVlvYixDQUFwQixDQUVBLEtBQUtwSCxDQUFMLENBQVNzM0IsUUFBUzVpQixDQUFULENBQVl0TixDQUFaLENBQWVtVSxFQUFJLEVBQUksQ0FBdkIsQ0FBVCxDQUNBLEtBQUsxd0IsQ0FBTCxDQUFTeXNDLFFBQVM1aUIsQ0FBVCxDQUFZdE4sQ0FBWixDQUFlbVUsQ0FBZixDQUFULENBQ0EsS0FBS3h2QixDQUFMLENBQVN1ckMsUUFBUzVpQixDQUFULENBQVl0TixDQUFaLENBQWVtVSxFQUFJLEVBQUksQ0FBdkIsQ0FBVCxDQUVBLENBRUQsV0FBQSxDQUVBLENBeEJELENBMEJBLENBdkNPLEVBMUR1QixDQW1HL0I0YixTQUFVLFNBQVc5a0MsS0FBWCxDQUFtQixDQUU1QixvQkFBQSxDQUFzQmtsQyxNQUF0QixDQUErQixDQUU5QixHQUFLQSxTQUFXMXZDLFNBQWhCLENBQTRCLE9BRTVCLEdBQUsydkMsV0FBWUQsTUFBWixFQUF1QixDQUE1QixDQUFnQyxDQUUvQi80QixRQUFRNlAsSUFBUixDQUFjLG1DQUFxQ2hjLEtBQXJDLENBQTZDLG1CQUEzRCxFQUVBLENBRUQsQ0FHRCxLQUFBLENBRUEsR0FBSzBaLEVBQUksa0NBQWtDamYsSUFBbEMsQ0FBd0N1RixLQUF4QyxDQUFULENBQTJEO0VBSTFELFNBQUEsQ0FDQSxTQUFXMFosRUFBRyxDQUFILENBQVgsQ0FDQSxlQUFpQkEsRUFBRyxDQUFILENBQWpCLENBRUEsT0FBU3htQixJQUFULEVBRUMsSUFBSyxLQUFMLENBQ0EsSUFBSyxNQUFMLENBRUMsR0FBS2t5QyxNQUFRLGdFQUFnRTNxQyxJQUFoRSxDQUFzRTRxQyxVQUF0RSxDQUFiLENBQWtHO0VBR2pHLEtBQUsxM0IsQ0FBTCxDQUFTNVUsS0FBSzZFLEdBQUwsQ0FBVSxHQUFWLENBQWUwbkMsU0FBVUYsTUFBTyxDQUFQLENBQVYsQ0FBc0IsRUFBdEIsQ0FBZixFQUE4QyxHQUF2RCxDQUNBLEtBQUs1c0MsQ0FBTCxDQUFTTyxLQUFLNkUsR0FBTCxDQUFVLEdBQVYsQ0FBZTBuQyxTQUFVRixNQUFPLENBQVAsQ0FBVixDQUFzQixFQUF0QixDQUFmLEVBQThDLEdBQXZELENBQ0EsS0FBSzFyQyxDQUFMLENBQVNYLEtBQUs2RSxHQUFMLENBQVUsR0FBVixDQUFlMG5DLFNBQVVGLE1BQU8sQ0FBUCxDQUFWLENBQXNCLEVBQXRCLENBQWYsRUFBOEMsR0FBdkQsQ0FFQUcsWUFBYUgsTUFBTyxDQUFQLENBQWIsRUFFQSxXQUFBLENBRUEsQ0FFRCxHQUFLQSxNQUFRLHNFQUFzRTNxQyxJQUF0RSxDQUE0RTRxQyxVQUE1RSxDQUFiLENBQXdHO0VBR3ZHLEtBQUsxM0IsQ0FBTCxDQUFTNVUsS0FBSzZFLEdBQUwsQ0FBVSxHQUFWLENBQWUwbkMsU0FBVUYsTUFBTyxDQUFQLENBQVYsQ0FBc0IsRUFBdEIsQ0FBZixFQUE4QyxHQUF2RCxDQUNBLEtBQUs1c0MsQ0FBTCxDQUFTTyxLQUFLNkUsR0FBTCxDQUFVLEdBQVYsQ0FBZTBuQyxTQUFVRixNQUFPLENBQVAsQ0FBVixDQUFzQixFQUF0QixDQUFmLEVBQThDLEdBQXZELENBQ0EsS0FBSzFyQyxDQUFMLENBQVNYLEtBQUs2RSxHQUFMLENBQVUsR0FBVixDQUFlMG5DLFNBQVVGLE1BQU8sQ0FBUCxDQUFWLENBQXNCLEVBQXRCLENBQWYsRUFBOEMsR0FBdkQsQ0FFQUcsWUFBYUgsTUFBTyxDQUFQLENBQWIsRUFFQSxXQUFBLENBRUEsQ0FFRCxNQUVELElBQUssS0FBTCxDQUNBLElBQUssTUFBTCxDQUVDLEdBQUtBLE1BQVEsZ0ZBQWdGM3FDLElBQWhGLENBQXNGNHFDLFVBQXRGLENBQWIsQ0FBa0g7RUFHakgsTUFBUUYsV0FBWUMsTUFBTyxDQUFQLENBQVosRUFBMkIsR0FBbkMsQ0FDQSxNQUFRRSxTQUFVRixNQUFPLENBQVAsQ0FBVixDQUFzQixFQUF0QixFQUE2QixHQUFyQyxDQUNBLE1BQVFFLFNBQVVGLE1BQU8sQ0FBUCxDQUFWLENBQXNCLEVBQXRCLEVBQTZCLEdBQXJDLENBRUFHLFlBQWFILE1BQU8sQ0FBUCxDQUFiLEVBRUEsWUFBWUosTUFBTCxDQUFhOWIsQ0FBYixDQUFnQnp2QixDQUFoQixDQUFtQkUsQ0FBbkIsQ0FBUCxDQUVBLENBRUQsTUFqREYsQ0FxREEsQ0E3REQsUUE2RFkrZixFQUFJLHFCQUFxQmpmLElBQXJCLENBQTJCdUYsS0FBM0IsQ0FBVCxDQUE4QztFQUlwRCxRQUFVMFosRUFBRyxDQUFILENBQVYsQ0FDQSxTQUFXcXJCLElBQUlsdUMsTUFBZixDQUVBLEdBQUs0L0IsT0FBUyxDQUFkLENBQWtCO0VBR2pCLEtBQUs5b0IsQ0FBTCxDQUFTMjNCLFNBQVVQLElBQUl2dEMsTUFBSixDQUFZLENBQVosRUFBa0J1dEMsSUFBSXZ0QyxNQUFKLENBQVksQ0FBWixDQUE1QixDQUE2QyxFQUE3QyxFQUFvRCxHQUE3RCxDQUNBLEtBQUtnQixDQUFMLENBQVM4c0MsU0FBVVAsSUFBSXZ0QyxNQUFKLENBQVksQ0FBWixFQUFrQnV0QyxJQUFJdnRDLE1BQUosQ0FBWSxDQUFaLENBQTVCLENBQTZDLEVBQTdDLEVBQW9ELEdBQTdELENBQ0EsS0FBS2tDLENBQUwsQ0FBUzRyQyxTQUFVUCxJQUFJdnRDLE1BQUosQ0FBWSxDQUFaLEVBQWtCdXRDLElBQUl2dEMsTUFBSixDQUFZLENBQVosQ0FBNUIsQ0FBNkMsRUFBN0MsRUFBb0QsR0FBN0QsQ0FFQSxXQUFBLENBRUEsQ0FURCxRQVNZaS9CLE9BQVMsQ0FBZCxDQUFrQjtFQUd4QixLQUFLOW9CLENBQUwsQ0FBUzIzQixTQUFVUCxJQUFJdnRDLE1BQUosQ0FBWSxDQUFaLEVBQWtCdXRDLElBQUl2dEMsTUFBSixDQUFZLENBQVosQ0FBNUIsQ0FBNkMsRUFBN0MsRUFBb0QsR0FBN0QsQ0FDQSxLQUFLZ0IsQ0FBTCxDQUFTOHNDLFNBQVVQLElBQUl2dEMsTUFBSixDQUFZLENBQVosRUFBa0J1dEMsSUFBSXZ0QyxNQUFKLENBQVksQ0FBWixDQUE1QixDQUE2QyxFQUE3QyxFQUFvRCxHQUE3RCxDQUNBLEtBQUtrQyxDQUFMLENBQVM0ckMsU0FBVVAsSUFBSXZ0QyxNQUFKLENBQVksQ0FBWixFQUFrQnV0QyxJQUFJdnRDLE1BQUosQ0FBWSxDQUFaLENBQTVCLENBQTZDLEVBQTdDLEVBQW9ELEdBQTdELENBRUEsV0FBQSxDQUVBLENBRUQsQ0FFRCxHQUFLd0ksT0FBU0EsTUFBTW5KLE1BQU4sQ0FBZSxDQUE3QixDQUFpQztFQUdoQyxRQUFVMnVDLGNBQWV4bEMsS0FBZixDQUFWLENBRUEsR0FBSytrQyxNQUFRdnZDLFNBQWIsQ0FBeUI7RUFHeEIsS0FBS3F2QyxNQUFMLENBQWFFLEdBQWIsRUFFQSxDQUxELElBS087RUFHTjU0QixRQUFRNlAsSUFBUixDQUFjLDhCQUFnQ2hjLEtBQTlDLEVBRUEsQ0FFRCxDQUVELFdBQUEsQ0FFQSxDQW5POEIsQ0FxTy9CNmIsTUFBTyxVQUFZLENBRWxCLGdCQUFnQm5wQixXQUFULENBQXNCLEtBQUtpYixDQUEzQixDQUE4QixLQUFLblYsQ0FBbkMsQ0FBc0MsS0FBS2tCLENBQTNDLENBQVAsQ0FFQSxDQXpPOEIsQ0EyTy9Cb2lCLEtBQU0sU0FBV3NwQixLQUFYLENBQW1CLENBRXhCLEtBQUt6M0IsQ0FBTCxDQUFTeTNCLE1BQU16M0IsQ0FBZixDQUNBLEtBQUtuVixDQUFMLENBQVM0c0MsTUFBTTVzQyxDQUFmLENBQ0EsS0FBS2tCLENBQUwsQ0FBUzByQyxNQUFNMXJDLENBQWYsQ0FFQSxXQUFBLENBRUEsQ0FuUDhCLENBcVAvQityQyxrQkFBbUIsU0FBV0wsS0FBWCxDQUFrQk0sV0FBbEIsQ0FBZ0MsQ0FFbEQsR0FBS0EsY0FBZ0Jsd0MsU0FBckIsQ0FBaUNrd0MsWUFBYyxHQUFkLENBRWpDLEtBQUsvM0IsQ0FBTCxDQUFTNVUsS0FBSzJlLEdBQUwsQ0FBVTB0QixNQUFNejNCLENBQWhCLENBQW1CKzNCLFdBQW5CLENBQVQsQ0FDQSxLQUFLbHRDLENBQUwsQ0FBU08sS0FBSzJlLEdBQUwsQ0FBVTB0QixNQUFNNXNDLENBQWhCLENBQW1Ca3RDLFdBQW5CLENBQVQsQ0FDQSxLQUFLaHNDLENBQUwsQ0FBU1gsS0FBSzJlLEdBQUwsQ0FBVTB0QixNQUFNMXJDLENBQWhCLENBQW1CZ3NDLFdBQW5CLENBQVQsQ0FFQSxXQUFBLENBRUEsQ0EvUDhCLENBaVEvQkMsa0JBQW1CLFNBQVdQLEtBQVgsQ0FBa0JNLFdBQWxCLENBQWdDLENBRWxELEdBQUtBLGNBQWdCbHdDLFNBQXJCLENBQWlDa3dDLFlBQWMsR0FBZCxDQUVqQyxnQkFBb0JBLFlBQWMsQ0FBaEIsQ0FBd0IsSUFBTUEsV0FBOUIsQ0FBOEMsR0FBaEUsQ0FFQSxLQUFLLzNCLENBQUwsQ0FBUzVVLEtBQUsyZSxHQUFMLENBQVUwdEIsTUFBTXozQixDQUFoQixDQUFtQmk0QixXQUFuQixDQUFULENBQ0EsS0FBS3B0QyxDQUFMLENBQVNPLEtBQUsyZSxHQUFMLENBQVUwdEIsTUFBTTVzQyxDQUFoQixDQUFtQm90QyxXQUFuQixDQUFULENBQ0EsS0FBS2xzQyxDQUFMLENBQVNYLEtBQUsyZSxHQUFMLENBQVUwdEIsTUFBTTFyQyxDQUFoQixDQUFtQmtzQyxXQUFuQixDQUFULENBRUEsV0FBQSxDQUVBLENBN1E4QixDQStRL0JDLHFCQUFzQixVQUFZLENBRWpDLE1BQVEsS0FBS2w0QixDQUFiLENBQWdCblYsRUFBSSxLQUFLQSxDQUF6QixDQUE0QmtCLEVBQUksS0FBS0EsQ0FBckMsQ0FFQSxLQUFLaVUsQ0FBTCxDQUFTQSxFQUFJQSxDQUFiLENBQ0EsS0FBS25WLENBQUwsQ0FBU0EsRUFBSUEsQ0FBYixDQUNBLEtBQUtrQixDQUFMLENBQVNBLEVBQUlBLENBQWIsQ0FFQSxXQUFBLENBRUEsQ0F6UjhCLENBMlIvQm9zQyxxQkFBc0IsVUFBWSxDQUVqQyxLQUFLbjRCLENBQUwsQ0FBUzVVLEtBQUt1a0IsSUFBTCxDQUFXLEtBQUszUCxDQUFoQixDQUFULENBQ0EsS0FBS25WLENBQUwsQ0FBU08sS0FBS3VrQixJQUFMLENBQVcsS0FBSzlrQixDQUFoQixDQUFULENBQ0EsS0FBS2tCLENBQUwsQ0FBU1gsS0FBS3VrQixJQUFMLENBQVcsS0FBSzVqQixDQUFoQixDQUFULENBRUEsV0FBQSxDQUVBLENBblM4QixDQXFTL0Jxc0MsT0FBUSxVQUFZLENBRW5CLFlBQWNwNEIsQ0FBTCxDQUFTLEdBQVgsRUFBb0IsRUFBcEIsQ0FBMkIsS0FBS25WLENBQUwsQ0FBUyxHQUFYLEVBQW9CLENBQTdDLENBQW1ELEtBQUtrQixDQUFMLENBQVMsR0FBWCxFQUFvQixDQUE1RSxDQUVBLENBelM4QixDQTJTL0Jzc0MsYUFBYyxVQUFZLENBRXpCLE9BQU8sQ0FBRSxTQUFXLEtBQUtELE1BQUwsR0FBY2x3QyxRQUFkLENBQXdCLEVBQXhCLENBQWIsRUFBNEM0QixLQUE1QyxDQUFtRCxDQUFFLENBQXJELENBQVAsQ0FFQSxDQS9TOEIsQ0FpVC9Cd3VDLE9BQVEsU0FBV25wQyxNQUFYLENBQW9CO0VBSTNCLEdBQUtBLFNBQVd0SCxTQUFoQixDQUE0QixDQUUzQjJXLFFBQVE2UCxJQUFSLENBQWMsK0NBQWQsRUFDQWxmLE9BQVMsQ0FBRW9zQixFQUFHLENBQUwsQ0FBUXp2QixFQUFHLENBQVgsQ0FBY0UsRUFBRyxDQUFqQixDQUFULENBRUEsQ0FFRCxNQUFRLEtBQUtnVSxDQUFiLENBQWdCblYsRUFBSSxLQUFLQSxDQUF6QixDQUE0QmtCLEVBQUksS0FBS0EsQ0FBckMsQ0FFQSxRQUFVWCxLQUFLOEUsR0FBTCxDQUFVOFAsQ0FBVixDQUFhblYsQ0FBYixDQUFnQmtCLENBQWhCLENBQVYsQ0FDQSxRQUFVWCxLQUFLNkUsR0FBTCxDQUFVK1AsQ0FBVixDQUFhblYsQ0FBYixDQUFnQmtCLENBQWhCLENBQVYsQ0FFQSxPQUFBLENBQVN3c0MsVUFBVCxDQUNBLGNBQWdCLENBQUV0b0MsSUFBTUMsR0FBUixFQUFnQixHQUFoQyxDQUVBLEdBQUtELE1BQVFDLEdBQWIsQ0FBbUIsQ0FFbEJzb0MsSUFBTSxDQUFOLENBQ0FELFdBQWEsQ0FBYixDQUVBLENBTEQsSUFLTyxDQUVOLFVBQVlyb0MsSUFBTUQsR0FBbEIsQ0FFQXNvQyxXQUFhRSxXQUFhLEdBQWIsQ0FBbUI3TCxPQUFVMThCLElBQU1ELEdBQWhCLENBQW5CLENBQTJDMjhCLE9BQVUsRUFBSTE4QixHQUFKLENBQVVELEdBQXBCLENBQXhELENBRUEsT0FBU0MsR0FBVCxFQUVDLE1BQUEsQ0FBUXNvQyxJQUFNLENBQUUzdEMsRUFBSWtCLENBQU4sRUFBWTZnQyxLQUFaLEVBQXNCL2hDLEVBQUlrQixDQUFKLENBQVEsQ0FBUixDQUFZLENBQWxDLENBQU4sQ0FBNkMsTUFDckQsTUFBQSxDQUFReXNDLElBQU0sQ0FBRXpzQyxFQUFJaVUsQ0FBTixFQUFZNHNCLEtBQVosQ0FBb0IsQ0FBMUIsQ0FBNkIsTUFDckMsTUFBQSxDQUFRNEwsSUFBTSxDQUFFeDRCLEVBQUluVixDQUFOLEVBQVkraEMsS0FBWixDQUFvQixDQUExQixDQUE2QixNQUp0QyxDQVFBNEwsS0FBTyxDQUFQLENBRUEsQ0FFRHJwQyxPQUFPb3NCLENBQVAsQ0FBV2lkLEdBQVgsQ0FDQXJwQyxPQUFPckQsQ0FBUCxDQUFXeXNDLFVBQVgsQ0FDQXBwQyxPQUFPbkQsQ0FBUCxDQUFXeXNDLFNBQVgsQ0FFQSxhQUFBLENBRUEsQ0FqVzhCLENBbVcvQkMsU0FBVSxVQUFZLENBRXJCLE9BQU8sUUFBYSxLQUFLMTRCLENBQUwsQ0FBUyxHQUFYLENBQW1CLENBQTlCLEVBQW9DLEdBQXBDLEVBQThDLEtBQUtuVixDQUFMLENBQVMsR0FBWCxDQUFtQixDQUEvRCxFQUFxRSxHQUFyRSxFQUErRSxLQUFLa0IsQ0FBTCxDQUFTLEdBQVgsQ0FBbUIsQ0FBaEcsRUFBc0csR0FBN0csQ0FFQSxDQXZXOEIsQ0F5Vy9CNHNDLFVBQVcsVUFBWSxDQUV0QixRQUFVLEVBQVYsQ0FFQSxnQkFBa0JwZCxDQUFYLENBQWN6dkIsQ0FBZCxDQUFpQkUsQ0FBakIsQ0FBcUIsQ0FFM0IsS0FBS3NzQyxNQUFMLENBQWFNLEdBQWIsRUFFQUEsSUFBSXJkLENBQUosRUFBU0EsQ0FBVCxDQUFZcWQsSUFBSTlzQyxDQUFKLEVBQVNBLENBQVQsQ0FBWThzQyxJQUFJNXNDLENBQUosRUFBU0EsQ0FBVCxDQUV4QixLQUFLcXJDLE1BQUwsQ0FBYXVCLElBQUlyZCxDQUFqQixDQUFvQnFkLElBQUk5c0MsQ0FBeEIsQ0FBMkI4c0MsSUFBSTVzQyxDQUEvQixFQUVBLFdBQUEsQ0FFQSxDQVZELENBWUEsQ0FoQlUsRUF6V29CLENBMlgvQm9pQixJQUFLLFNBQVdxcEIsS0FBWCxDQUFtQixDQUV2QixLQUFLejNCLENBQUwsRUFBVXkzQixNQUFNejNCLENBQWhCLENBQ0EsS0FBS25WLENBQUwsRUFBVTRzQyxNQUFNNXNDLENBQWhCLENBQ0EsS0FBS2tCLENBQUwsRUFBVTByQyxNQUFNMXJDLENBQWhCLENBRUEsV0FBQSxDQUVBLENBblk4QixDQXFZL0I4c0MsVUFBVyxTQUFXQyxNQUFYLENBQW1CQyxNQUFuQixDQUE0QixDQUV0QyxLQUFLLzRCLENBQUwsQ0FBUzg0QixPQUFPOTRCLENBQVAsQ0FBVys0QixPQUFPLzRCLENBQTNCLENBQ0EsS0FBS25WLENBQUwsQ0FBU2l1QyxPQUFPanVDLENBQVAsQ0FBV2t1QyxPQUFPbHVDLENBQTNCLENBQ0EsS0FBS2tCLENBQUwsQ0FBUytzQyxPQUFPL3NDLENBQVAsQ0FBV2d0QyxPQUFPaHRDLENBQTNCLENBRUEsV0FBQSxDQUVBLENBN1k4QixDQStZL0J3aUIsVUFBVyxTQUFXemlCLENBQVgsQ0FBZSxDQUV6QixLQUFLa1UsQ0FBTCxFQUFVbFUsQ0FBVixDQUNBLEtBQUtqQixDQUFMLEVBQVVpQixDQUFWLENBQ0EsS0FBS0MsQ0FBTCxFQUFVRCxDQUFWLENBRUEsV0FBQSxDQUVBLENBdlo4QixDQXlaL0IyaUIsSUFBSyxTQUFXZ3BCLEtBQVgsQ0FBbUIsQ0FFdkIsS0FBS3ozQixDQUFMLENBQVM1VSxLQUFLOEUsR0FBTCxDQUFVLENBQVYsQ0FBYSxLQUFLOFAsQ0FBTCxDQUFTeTNCLE1BQU16M0IsQ0FBNUIsQ0FBVCxDQUNBLEtBQUtuVixDQUFMLENBQVNPLEtBQUs4RSxHQUFMLENBQVUsQ0FBVixDQUFhLEtBQUtyRixDQUFMLENBQVM0c0MsTUFBTTVzQyxDQUE1QixDQUFULENBQ0EsS0FBS2tCLENBQUwsQ0FBU1gsS0FBSzhFLEdBQUwsQ0FBVSxDQUFWLENBQWEsS0FBS25FLENBQUwsQ0FBUzByQyxNQUFNMXJDLENBQTVCLENBQVQsQ0FFQSxXQUFBLENBRUEsQ0FqYThCLENBbWEvQjZpQixTQUFVLFNBQVc2b0IsS0FBWCxDQUFtQixDQUU1QixLQUFLejNCLENBQUwsRUFBVXkzQixNQUFNejNCLENBQWhCLENBQ0EsS0FBS25WLENBQUwsRUFBVTRzQyxNQUFNNXNDLENBQWhCLENBQ0EsS0FBS2tCLENBQUwsRUFBVTByQyxNQUFNMXJDLENBQWhCLENBRUEsV0FBQSxDQUVBLENBM2E4QixDQTZhL0I4aUIsZUFBZ0IsU0FBVy9pQixDQUFYLENBQWUsQ0FFOUIsS0FBS2tVLENBQUwsRUFBVWxVLENBQVYsQ0FDQSxLQUFLakIsQ0FBTCxFQUFVaUIsQ0FBVixDQUNBLEtBQUtDLENBQUwsRUFBVUQsQ0FBVixDQUVBLFdBQUEsQ0FFQSxDQXJiOEIsQ0F1Yi9CdWdCLEtBQU0sU0FBV29yQixLQUFYLENBQWtCbG5CLEtBQWxCLENBQTBCLENBRS9CLEtBQUt2USxDQUFMLEVBQVUsQ0FBRXkzQixNQUFNejNCLENBQU4sQ0FBVSxLQUFLQSxDQUFqQixFQUF1QnVRLEtBQWpDLENBQ0EsS0FBSzFsQixDQUFMLEVBQVUsQ0FBRTRzQyxNQUFNNXNDLENBQU4sQ0FBVSxLQUFLQSxDQUFqQixFQUF1QjBsQixLQUFqQyxDQUNBLEtBQUt4a0IsQ0FBTCxFQUFVLENBQUUwckMsTUFBTTFyQyxDQUFOLENBQVUsS0FBS0EsQ0FBakIsRUFBdUJ3a0IsS0FBakMsQ0FFQSxXQUFBLENBRUEsQ0EvYjhCLENBaWMvQkksT0FBUSxTQUFXamtCLENBQVgsQ0FBZSxDQUV0QixTQUFXc1QsQ0FBRixHQUFRLEtBQUtBLENBQWYsRUFBd0J0VCxFQUFFN0IsQ0FBRixHQUFRLEtBQUtBLENBQXJDLEVBQThDNkIsRUFBRVgsQ0FBRixHQUFRLEtBQUtBLENBQWxFLENBRUEsQ0FyYzhCLENBdWMvQjZrQixVQUFXLFNBQVd0SCxLQUFYLENBQWtCdUgsTUFBbEIsQ0FBMkIsQ0FFckMsR0FBS0EsU0FBV2hwQixTQUFoQixDQUE0QmdwQixPQUFTLENBQVQsQ0FFNUIsS0FBSzdRLENBQUwsQ0FBU3NKLE1BQU91SCxNQUFQLENBQVQsQ0FDQSxLQUFLaG1CLENBQUwsQ0FBU3llLE1BQU91SCxPQUFTLENBQWhCLENBQVQsQ0FDQSxLQUFLOWtCLENBQUwsQ0FBU3VkLE1BQU91SCxPQUFTLENBQWhCLENBQVQsQ0FFQSxXQUFBLENBRUEsQ0FqZDhCLENBbWQvQkMsUUFBUyxTQUFXeEgsS0FBWCxDQUFrQnVILE1BQWxCLENBQTJCLENBRW5DLEdBQUt2SCxRQUFVemhCLFNBQWYsQ0FBMkJ5aEIsTUFBUSxFQUFSLENBQzNCLEdBQUt1SCxTQUFXaHBCLFNBQWhCLENBQTRCZ3BCLE9BQVMsQ0FBVCxDQUU1QnZILE1BQU91SCxNQUFQLEVBQWtCLEtBQUs3USxDQUF2QixDQUNBc0osTUFBT3VILE9BQVMsQ0FBaEIsRUFBc0IsS0FBS2htQixDQUEzQixDQUNBeWUsTUFBT3VILE9BQVMsQ0FBaEIsRUFBc0IsS0FBSzlrQixDQUEzQixDQUVBLFlBQUEsQ0FFQSxDQTlkOEIsQ0FnZS9CazVCLE9BQVEsVUFBWSxDQUVuQixZQUFZbVQsTUFBTCxFQUFQLENBRUEsQ0FwZThCLENBQWhDLEVBd2VBOztLQUlBLGdCQUFrQixDQUVqQjVILE9BQVEsQ0FFUHdJLFFBQVMsQ0FBRTl5QyxNQUFPLFNBQUEsQ0FBVyxRQUFYLENBQVQsQ0FGRixDQUdQK3lDLFFBQVMsQ0FBRS95QyxNQUFPLEdBQVQsQ0FIRixDQUtQZ3pDLElBQUssQ0FBRWh6QyxNQUFPLElBQVQsQ0FMRSxDQU1QaXpDLFlBQWEsQ0FBRWp6QyxNQUFPLFdBQUEsRUFBVCxDQU5OLENBUVBrekMsU0FBVSxDQUFFbHpDLE1BQU8sSUFBVCxDQVJILENBRlMsQ0FjakJtekMsWUFBYSxDQUVaQyxZQUFhLENBQUVwekMsTUFBTyxJQUFULENBRkQsQ0FkSSxDQW9CakJxekMsT0FBUSxDQUVQQyxPQUFRLENBQUV0ekMsTUFBTyxJQUFULENBRkQsQ0FHUHV6QyxXQUFZLENBQUV2ekMsTUFBTyxDQUFFLENBQVgsQ0FITCxDQUlQd3pDLGFBQWMsQ0FBRXh6QyxNQUFPLEdBQVQsQ0FKUCxDQUtQeXpDLGdCQUFpQixDQUFFenpDLE1BQU8sSUFBVCxDQUxWLENBTVAwekMsWUFBYSxDQUFFMXpDLE1BQU8sQ0FBVCxDQU5OLENBcEJTLENBOEJqQjJ6QyxNQUFPLENBRU5DLE1BQU8sQ0FBRTV6QyxNQUFPLElBQVQsQ0FGRCxDQUdONnpDLGVBQWdCLENBQUU3ekMsTUFBTyxDQUFULENBSFYsQ0E5QlUsQ0FxQ2pCOHpDLFNBQVUsQ0FFVEMsU0FBVSxDQUFFL3pDLE1BQU8sSUFBVCxDQUZELENBR1RnMEMsa0JBQW1CLENBQUVoMEMsTUFBTyxDQUFULENBSFYsQ0FyQ08sQ0E0Q2pCaTBDLFlBQWEsQ0FFWkMsWUFBYSxDQUFFbDBDLE1BQU8sSUFBVCxDQUZELENBNUNJLENBa0RqQm0wQyxRQUFTLENBRVJDLFFBQVMsQ0FBRXAwQyxNQUFPLElBQVQsQ0FGRCxDQUdScTBDLFVBQVcsQ0FBRXIwQyxNQUFPLENBQVQsQ0FISCxDQWxEUSxDQXlEakJzMEMsVUFBVyxDQUVWQyxVQUFXLENBQUV2MEMsTUFBTyxJQUFULENBRkQsQ0FHVncwQyxZQUFhLENBQUV4MEMsTUFBTyxXQUFBLENBQWEsQ0FBYixDQUFnQixDQUFoQixDQUFULENBSEgsQ0F6RE0sQ0FnRWpCeTBDLGdCQUFpQixDQUVoQkMsZ0JBQWlCLENBQUUxMEMsTUFBTyxJQUFULENBRkQsQ0FHaEIyMEMsa0JBQW1CLENBQUUzMEMsTUFBTyxDQUFULENBSEgsQ0FJaEI0MEMsaUJBQWtCLENBQUU1MEMsTUFBTyxDQUFULENBSkYsQ0FoRUEsQ0F3RWpCNjBDLGFBQWMsQ0FFYkMsYUFBYyxDQUFFOTBDLE1BQU8sSUFBVCxDQUZELENBeEVHLENBOEVqQiswQyxhQUFjLENBRWJDLGFBQWMsQ0FBRWgxQyxNQUFPLElBQVQsQ0FGRCxDQTlFRyxDQW9GakJpMUMsWUFBYSxDQUVaQyxZQUFhLENBQUVsMUMsTUFBTyxJQUFULENBRkQsQ0FwRkksQ0EwRmpCbTFDLElBQUssQ0FFSkMsV0FBWSxDQUFFcDFDLE1BQU8sT0FBVCxDQUZSLENBR0pxMUMsUUFBUyxDQUFFcjFDLE1BQU8sQ0FBVCxDQUhMLENBSUpzMUMsT0FBUSxDQUFFdDFDLE1BQU8sSUFBVCxDQUpKLENBS0p1MUMsU0FBVSxDQUFFdjFDLE1BQU8sU0FBQSxDQUFXLFFBQVgsQ0FBVCxDQUxOLENBMUZZLENBbUdqQncxQyxPQUFRLENBRVBDLGtCQUFtQixDQUFFejFDLE1BQU8sRUFBVCxDQUZaLENBSVAwMUMsa0JBQW1CLENBQUUxMUMsTUFBTyxFQUFULENBQWEyMUMsV0FBWSxDQUMzQ2hQLFVBQVcsRUFEZ0MsQ0FFM0M0SyxNQUFPLEVBRm9DLENBSTNDcUUsT0FBUSxFQUptQyxDQUszQ0MsV0FBWSxFQUwrQixDQU0zQ0MsYUFBYyxFQU42QixDQU8zQ0MsY0FBZSxFQVA0QixDQUF6QixDQUpaLENBY1BDLHFCQUFzQixDQUFFaDJDLE1BQU8sRUFBVCxDQWRmLENBZVBpMkMsd0JBQXlCLENBQUVqMkMsTUFBTyxFQUFULENBZmxCLENBaUJQazJDLFdBQVksQ0FBRWwyQyxNQUFPLEVBQVQsQ0FBYTIxQyxXQUFZLENBQ3BDcEUsTUFBTyxFQUQ2QixDQUVwQ3RkLFNBQVUsRUFGMEIsQ0FHcEMwUyxVQUFXLEVBSHlCLENBSXBDd0MsU0FBVSxFQUowQixDQUtwQ2dOLFFBQVMsRUFMMkIsQ0FNcENDLFlBQWEsRUFOdUIsQ0FPcENDLE1BQU8sRUFQNkIsQ0FTcENULE9BQVEsRUFUNEIsQ0FVcENDLFdBQVksRUFWd0IsQ0FXcENDLGFBQWMsRUFYc0IsQ0FZcENDLGNBQWUsRUFacUIsQ0FBekIsQ0FqQkwsQ0FnQ1BPLGNBQWUsQ0FBRXQyQyxNQUFPLEVBQVQsQ0FoQ1IsQ0FpQ1B1MkMsaUJBQWtCLENBQUV2MkMsTUFBTyxFQUFULENBakNYLENBbUNQdzJDLFlBQWEsQ0FBRXgyQyxNQUFPLEVBQVQsQ0FBYTIxQyxXQUFZLENBQ3JDcEUsTUFBTyxFQUQ4QixDQUVyQ3RkLFNBQVUsRUFGMkIsQ0FHckNvaUIsTUFBTyxFQUg4QixDQUlyQ2xOLFNBQVUsRUFKMkIsQ0FNckN5TSxPQUFRLEVBTjZCLENBT3JDQyxXQUFZLEVBUHlCLENBUXJDQyxhQUFjLEVBUnVCLENBU3JDQyxjQUFlLEVBVHNCLENBVXJDVSxpQkFBa0IsRUFWbUIsQ0FXckNDLGdCQUFpQixFQVhvQixDQUF6QixDQW5DTixDQWlEUEMsZUFBZ0IsQ0FBRTMyQyxNQUFPLEVBQVQsQ0FqRFQsQ0FrRFA0MkMsa0JBQW1CLENBQUU1MkMsTUFBTyxFQUFULENBbERaLENBb0RQNjJDLGlCQUFrQixDQUFFNzJDLE1BQU8sRUFBVCxDQUFhMjFDLFdBQVksQ0FDMUNoUCxVQUFXLEVBRCtCLENBRTFDbVEsU0FBVSxFQUZnQyxDQUcxQ0MsWUFBYSxFQUg2QixDQUF6QixDQXBEWDtFQTJEUEMsZUFBZ0IsQ0FBRWgzQyxNQUFPLEVBQVQsQ0FBYTIxQyxXQUFZLENBQ3hDcEUsTUFBTyxFQURpQyxDQUV4Q3RkLFNBQVUsRUFGOEIsQ0FHeENtTCxNQUFPLEVBSGlDLENBSXhDQyxPQUFRLEVBSmdDLENBQXpCLENBM0RULENBbkdTLENBdUtqQmtELE9BQVEsQ0FFUHVRLFFBQVMsQ0FBRTl5QyxNQUFPLFNBQUEsQ0FBVyxRQUFYLENBQVQsQ0FGRixDQUdQK3lDLFFBQVMsQ0FBRS95QyxNQUFPLEdBQVQsQ0FIRixDQUlQNGlDLEtBQU0sQ0FBRTVpQyxNQUFPLEdBQVQsQ0FKQyxDQUtQZ3pCLE1BQU8sQ0FBRWh6QixNQUFPLEdBQVQsQ0FMQSxDQU1QZ3pDLElBQUssQ0FBRWh6QyxNQUFPLElBQVQsQ0FORSxDQU9QaXpDLFlBQWEsQ0FBRWp6QyxNQUFPLFdBQUEsRUFBVCxDQVBOLENBdktTLENBQWxCLENBb0xBOzs7O0tBTUEsY0FBZ0IsQ0FFZmkzQyxNQUFPLENBRU4xRyxTQUFVMkcsY0FBYzVHLEtBQWQsQ0FBcUIsQ0FDOUI2RyxZQUFZN00sTUFEa0IsQ0FFOUI2TSxZQUFZaEUsV0FGa0IsQ0FHOUJnRSxZQUFZOUQsTUFIa0IsQ0FJOUI4RCxZQUFZeEQsS0FKa0IsQ0FLOUJ3RCxZQUFZckQsUUFMa0IsQ0FNOUJxRCxZQUFZaEMsR0FOa0IsQ0FBckIsQ0FGSixDQVdOaUMsYUFBY0MsWUFBWTVILGNBWHBCLENBWU42SCxlQUFnQkQsWUFBWTdILGNBWnRCLENBRlEsQ0FrQmYrSCxRQUFTLENBRVJoSCxTQUFVMkcsY0FBYzVHLEtBQWQsQ0FBcUIsQ0FDOUI2RyxZQUFZN00sTUFEa0IsQ0FFOUI2TSxZQUFZaEUsV0FGa0IsQ0FHOUJnRSxZQUFZOUQsTUFIa0IsQ0FJOUI4RCxZQUFZeEQsS0FKa0IsQ0FLOUJ3RCxZQUFZckQsUUFMa0IsQ0FNOUJxRCxZQUFZbEQsV0FOa0IsQ0FPOUJrRCxZQUFZaEMsR0FQa0IsQ0FROUJnQyxZQUFZM0IsTUFSa0IsQ0FTOUIsQ0FDQ2dDLFNBQVUsQ0FBRXgzQyxNQUFPLFNBQUEsQ0FBVyxRQUFYLENBQVQsQ0FEWCxDQVQ4QixDQUFyQixDQUZGLENBZ0JSbzNDLGFBQWNDLFlBQVkxSCxnQkFoQmxCLENBaUJSMkgsZUFBZ0JELFlBQVkzSCxnQkFqQnBCLENBbEJNLENBdUNmK0gsTUFBTyxDQUVObEgsU0FBVTJHLGNBQWM1RyxLQUFkLENBQXFCLENBQzlCNkcsWUFBWTdNLE1BRGtCLENBRTlCNk0sWUFBWWhFLFdBRmtCLENBRzlCZ0UsWUFBWTlELE1BSGtCLENBSTlCOEQsWUFBWXhELEtBSmtCLENBSzlCd0QsWUFBWXJELFFBTGtCLENBTTlCcUQsWUFBWWxELFdBTmtCLENBTzlCa0QsWUFBWWhELE9BUGtCLENBUTlCZ0QsWUFBWTdDLFNBUmtCLENBUzlCNkMsWUFBWTFDLGVBVGtCLENBVTlCMEMsWUFBWWxDLFdBVmtCLENBVzlCa0MsWUFBWWhDLEdBWGtCLENBWTlCZ0MsWUFBWTNCLE1BWmtCLENBYTlCLENBQ0NnQyxTQUFVLENBQUV4M0MsTUFBTyxTQUFBLENBQVcsUUFBWCxDQUFULENBRFgsQ0FFQzAzQyxTQUFVLENBQUUxM0MsTUFBTyxTQUFBLENBQVcsUUFBWCxDQUFULENBRlgsQ0FHQzIzQyxVQUFXLENBQUUzM0MsTUFBTyxFQUFULENBSFosQ0FiOEIsQ0FBckIsQ0FGSixDQXNCTm8zQyxhQUFjQyxZQUFZeEgsY0F0QnBCLENBdUJOeUgsZUFBZ0JELFlBQVl6SCxjQXZCdEIsQ0F2Q1EsQ0FrRWZnSSxTQUFVLENBRVRySCxTQUFVMkcsY0FBYzVHLEtBQWQsQ0FBcUIsQ0FDOUI2RyxZQUFZN00sTUFEa0IsQ0FFOUI2TSxZQUFZOUQsTUFGa0IsQ0FHOUI4RCxZQUFZeEQsS0FIa0IsQ0FJOUJ3RCxZQUFZckQsUUFKa0IsQ0FLOUJxRCxZQUFZbEQsV0FMa0IsQ0FNOUJrRCxZQUFZaEQsT0FOa0IsQ0FPOUJnRCxZQUFZN0MsU0FQa0IsQ0FROUI2QyxZQUFZMUMsZUFSa0IsQ0FTOUIwQyxZQUFZdEMsWUFUa0IsQ0FVOUJzQyxZQUFZcEMsWUFWa0IsQ0FXOUJvQyxZQUFZaEMsR0FYa0IsQ0FZOUJnQyxZQUFZM0IsTUFaa0IsQ0FhOUIsQ0FDQ2dDLFNBQVUsQ0FBRXgzQyxNQUFPLFNBQUEsQ0FBVyxRQUFYLENBQVQsQ0FEWCxDQUVDNjNDLFVBQVcsQ0FBRTczQyxNQUFPLEdBQVQsQ0FGWixDQUdDODNDLFVBQVcsQ0FBRTkzQyxNQUFPLEdBQVQsQ0FIWixDQUlDKzNDLGdCQUFpQixDQUFFLzNDLE1BQU8sQ0FBSTtFQUFiLENBSmxCLENBYjhCLENBQXJCLENBRkQsQ0F1QlRvM0MsYUFBY0MsWUFBWXRILGlCQXZCakIsQ0F3QlR1SCxlQUFnQkQsWUFBWXZILGlCQXhCbkIsQ0FsRUssQ0E4RmZ2TixPQUFRLENBRVBnTyxTQUFVMkcsY0FBYzVHLEtBQWQsQ0FBcUIsQ0FDOUI2RyxZQUFZNVUsTUFEa0IsQ0FFOUI0VSxZQUFZaEMsR0FGa0IsQ0FBckIsQ0FGSCxDQU9QaUMsYUFBY0MsWUFBWWxILFdBUG5CLENBUVBtSCxlQUFnQkQsWUFBWW5ILFdBUnJCLENBOUZPLENBMEdmOEgsT0FBUSxDQUVQekgsU0FBVTJHLGNBQWM1RyxLQUFkLENBQXFCLENBQzlCNkcsWUFBWTdNLE1BRGtCLENBRTlCNk0sWUFBWWhDLEdBRmtCLENBRzlCLENBQ0NuaUIsTUFBTyxDQUFFaHpCLE1BQU8sQ0FBVCxDQURSLENBRUNpNEMsU0FBVSxDQUFFajRDLE1BQU8sQ0FBVCxDQUZYLENBR0NrNEMsVUFBVyxDQUFFbDRDLE1BQU8sQ0FBVCxDQUhaLENBSDhCLENBQXJCLENBRkgsQ0FZUG8zQyxhQUFjQyxZQUFZOUgsZUFabkIsQ0FhUCtILGVBQWdCRCxZQUFZL0gsZUFickIsQ0ExR08sQ0EySGY2SSxNQUFPLENBRU41SCxTQUFVMkcsY0FBYzVHLEtBQWQsQ0FBcUIsQ0FDOUI2RyxZQUFZN00sTUFEa0IsQ0FFOUI2TSxZQUFZMUMsZUFGa0IsQ0FBckIsQ0FGSixDQU9OMkMsYUFBY0MsWUFBWXBJLFVBUHBCLENBUU5xSSxlQUFnQkQsWUFBWXJJLFVBUnRCLENBM0hRLENBdUlmdlQsT0FBUSxDQUVQOFUsU0FBVTJHLGNBQWM1RyxLQUFkLENBQXFCLENBQzlCNkcsWUFBWTdNLE1BRGtCLENBRTlCNk0sWUFBWWhELE9BRmtCLENBRzlCZ0QsWUFBWTdDLFNBSGtCLENBSTlCNkMsWUFBWTFDLGVBSmtCLENBSzlCLENBQ0MxQixRQUFTLENBQUUveUMsTUFBTyxHQUFULENBRFYsQ0FMOEIsQ0FBckIsQ0FGSCxDQVlQbzNDLGFBQWNDLFlBQVlwSCxXQVpuQixDQWFQcUgsZUFBZ0JELFlBQVlySCxXQWJyQixDQXZJTzs7Z0ZBNEpmb0ksS0FBTSxDQUVMN0gsU0FBVSxDQUNUOEgsTUFBTyxDQUFFcjRDLE1BQU8sSUFBVCxDQURFLENBRVRzNEMsTUFBTyxDQUFFdDRDLE1BQU8sQ0FBRSxDQUFYLENBRkUsQ0FHVCt5QyxRQUFTLENBQUUveUMsTUFBTyxHQUFULENBSEEsQ0FGTCxDQVFMbzNDLGFBQWNDLFlBQVl0SSxTQVJyQixDQVNMdUksZUFBZ0JELFlBQVl2SSxTQVR2QixDQTVKUyxDQXlLZnlKLFNBQVUsQ0FFVGhJLFNBQVUsQ0FDVGlJLFVBQVcsQ0FBRXg0QyxNQUFPLElBQVQsQ0FERixDQUZELENBTVRvM0MsYUFBY0MsWUFBWWhJLGFBTmpCLENBT1RpSSxlQUFnQkQsWUFBWWpJLGFBUG5CLENBektLLENBb0xmcUosYUFBYyxDQUVibEksU0FBVTJHLGNBQWM1RyxLQUFkLENBQXFCLENBQzlCNkcsWUFBWTdNLE1BRGtCLENBRTlCNk0sWUFBWTFDLGVBRmtCLENBRzlCLENBQ0NpRSxrQkFBbUIsQ0FBRTE0QyxNQUFPLFdBQUEsRUFBVCxDQURwQixDQUVDMjRDLGFBQWMsQ0FBRTM0QyxNQUFPLENBQVQsQ0FGZixDQUdDNDRDLFlBQWEsQ0FBRTU0QyxNQUFPLElBQVQsQ0FIZCxDQUg4QixDQUFyQixDQUZHLENBWWJvM0MsYUFBY0MsWUFBWWxJLGlCQVpiLENBYWJtSSxlQUFnQkQsWUFBWW5JLGlCQWJmLENBcExDLENBcU1mMEcsT0FBUSxDQUVQckYsU0FBVTJHLGNBQWM1RyxLQUFkLENBQXFCLENBQzlCNkcsWUFBWTNCLE1BRGtCLENBRTlCMkIsWUFBWWhDLEdBRmtCLENBRzlCLENBQ0M1RCxNQUFPLENBQUV2eEMsTUFBTyxTQUFBLENBQVcsT0FBWCxDQUFULENBRFIsQ0FFQyt5QyxRQUFTLENBQUUveUMsTUFBTyxHQUFULENBRlYsQ0FIOEIsQ0FBckIsQ0FGSCxDQVdQbzNDLGFBQWNDLFlBQVloSCxXQVhuQixDQVlQaUgsZUFBZ0JELFlBQVlqSCxXQVpyQixDQXJNTyxDQUFoQixDQXVOQXlJLFVBQVVDLFFBQVYsQ0FBcUIsQ0FFcEJ2SSxTQUFVMkcsY0FBYzVHLEtBQWQsQ0FBcUIsQ0FDOUJ1SSxVQUFVakIsUUFBVixDQUFtQnJILFFBRFcsQ0FFOUIsQ0FDQ3dJLFVBQVcsQ0FBRS80QyxNQUFPLENBQVQsQ0FEWixDQUVDZzVDLG1CQUFvQixDQUFFaDVDLE1BQU8sQ0FBVCxDQUZyQixDQUY4QixDQUFyQixDQUZVLENBVXBCbzNDLGFBQWNDLFlBQVl0SCxpQkFWTixDQVdwQnVILGVBQWdCRCxZQUFZdkgsaUJBWFIsQ0FBckIsQ0FlQTs7S0FJQSx3QkFBQSxDQUEwQm1KLEVBQTFCLENBQStCLENBRTlCLFlBQWMsV0FBQSxFQUFkLENBRUEscUJBQUEsQ0FBdUJudUIsU0FBdkIsQ0FBa0NvdUIsVUFBbEMsQ0FBK0MsQ0FFOUMsVUFBWXB1QixVQUFVMUgsS0FBdEIsQ0FDQSxVQUFZMEgsVUFBVXF1QixPQUFWLENBQW9CRixHQUFHRyxZQUF2QixDQUFzQ0gsR0FBR0ksV0FBckQsQ0FFQSxXQUFhSixHQUFHSyxZQUFILEVBQWIsQ0FFQUwsR0FBR00sVUFBSCxDQUFlTCxVQUFmLENBQTJCTSxNQUEzQixFQUNBUCxHQUFHUSxVQUFILENBQWVQLFVBQWYsQ0FBMkI5MUIsS0FBM0IsQ0FBa0NzMkIsS0FBbEMsRUFFQTV1QixVQUFVNnVCLGdCQUFWLEdBRUEsU0FBV1YsR0FBR1csS0FBZCxDQUVBLEdBQUt4MkIsNkJBQUwsQ0FBcUMsQ0FFcENwbEIsS0FBT2k3QyxHQUFHVyxLQUFWLENBRUEsQ0FKRCxRQUlZeDJCLDZCQUFMLENBQXFDLENBRTNDOUssUUFBUTZQLElBQVIsQ0FBYyxzRUFBZCxFQUVBLENBSk0sUUFJSy9FLDRCQUFMLENBQW9DLENBRTFDcGxCLEtBQU9pN0MsR0FBR1ksY0FBVixDQUVBLENBSk0sUUFJS3oyQiwyQkFBTCxDQUFtQyxDQUV6Q3BsQixLQUFPaTdDLEdBQUdhLEtBQVYsQ0FFQSxDQUpNLFFBSUsxMkIsNEJBQUwsQ0FBb0MsQ0FFMUNwbEIsS0FBT2k3QyxHQUFHYyxZQUFWLENBRUEsQ0FKTSxRQUlLMzJCLDJCQUFMLENBQW1DLENBRXpDcGxCLEtBQU9pN0MsR0FBR2UsR0FBVixDQUVBLENBSk0sUUFJSzUyQiwwQkFBTCxDQUFrQyxDQUV4Q3BsQixLQUFPaTdDLEdBQUdnQixJQUFWLENBRUEsQ0FKTSxRQUlLNzJCLDJCQUFMLENBQW1DLENBRXpDcGxCLEtBQU9pN0MsR0FBR2lCLGFBQVYsQ0FFQSxDQUVELE9BQU8sQ0FDTlYsT0FBUUEsTUFERixDQUVOeDdDLEtBQU1BLElBRkEsQ0FHTm04QyxnQkFBaUIvMkIsTUFBTWczQixpQkFIakIsQ0FJTmowQyxRQUFTMmtCLFVBQVUza0IsT0FKYixDQUFQLENBT0EsQ0FFRCxxQkFBQSxDQUF1QnF6QyxNQUF2QixDQUErQjF1QixTQUEvQixDQUEwQ291QixVQUExQyxDQUF1RCxDQUV0RCxVQUFZcHVCLFVBQVUxSCxLQUF0QixDQUNBLGdCQUFrQjBILFVBQVV1dkIsV0FBNUIsQ0FFQXBCLEdBQUdNLFVBQUgsQ0FBZUwsVUFBZixDQUEyQk0sTUFBM0IsRUFFQSxHQUFLMXVCLFVBQVVxdUIsT0FBVixHQUFzQixLQUEzQixDQUFtQyxDQUVsQ0YsR0FBR1EsVUFBSCxDQUFlUCxVQUFmLENBQTJCOTFCLEtBQTNCLENBQWtDNjFCLEdBQUdJLFdBQXJDLEVBRUEsQ0FKRCxRQUlZZ0IsWUFBWXRvQixLQUFaLEdBQXNCLENBQUUsQ0FBN0IsQ0FBaUM7RUFJdkNrbkIsR0FBR3FCLGFBQUgsQ0FBa0JwQixVQUFsQixDQUE4QixDQUE5QixDQUFpQzkxQixLQUFqQyxFQUVBLENBTk0sUUFNS2kzQixZQUFZdG9CLEtBQVosR0FBc0IsQ0FBM0IsQ0FBK0IsQ0FFckN6WixRQUFRTSxLQUFSLENBQWUseUtBQWYsRUFFQSxDQUpNLElBSUEsQ0FFTnFnQyxHQUFHcUIsYUFBSCxDQUFrQnBCLFVBQWxCLENBQThCbUIsWUFBWTF2QixNQUFaLENBQXFCdkgsTUFBTWczQixpQkFBekQsQ0FDQ2gzQixNQUFNbTNCLFFBQU4sQ0FBZ0JGLFlBQVkxdkIsTUFBNUIsQ0FBb0MwdkIsWUFBWTF2QixNQUFaLENBQXFCMHZCLFlBQVl0b0IsS0FBckUsQ0FERCxFQUdBc29CLFlBQVl0b0IsS0FBWixDQUFvQixDQUFFLENBQXRCLENBQXlCO0VBRXpCLENBRUQsQ0FFRDtFQUVBLFlBQUEsQ0FBY2pILFNBQWQsQ0FBMEIsQ0FFekIsR0FBS0EsVUFBVTB2Qiw0QkFBZixDQUE4QzF2QixVQUFZQSxVQUFVcFksSUFBdEIsQ0FFOUMsZUFBZTNMLEdBQVIsQ0FBYStqQixTQUFiLENBQVAsQ0FFQSxDQUVELGVBQUEsQ0FBaUJBLFNBQWpCLENBQTZCLENBRTVCLEdBQUtBLFVBQVUwdkIsNEJBQWYsQ0FBOEMxdkIsVUFBWUEsVUFBVXBZLElBQXRCLENBRTlDLFNBQVcrbkMsUUFBUTF6QyxHQUFSLENBQWErakIsU0FBYixDQUFYLENBRUEsR0FBS3BZLElBQUwsQ0FBWSxDQUVYdW1DLEdBQUd5QixZQUFILENBQWlCaG9DLEtBQUs4bUMsTUFBdEIsRUFFQWlCLFFBQVFFLE1BQVIsQ0FBZ0I3dkIsU0FBaEIsRUFFQSxDQUVELENBRUQsZUFBQSxDQUFpQkEsU0FBakIsQ0FBNEJvdUIsVUFBNUIsQ0FBeUMsQ0FFeEMsR0FBS3B1QixVQUFVMHZCLDRCQUFmLENBQThDMXZCLFVBQVlBLFVBQVVwWSxJQUF0QixDQUU5QyxTQUFXK25DLFFBQVExekMsR0FBUixDQUFhK2pCLFNBQWIsQ0FBWCxDQUVBLEdBQUtwWSxPQUFTL1EsU0FBZCxDQUEwQixDQUV6Qjg0QyxRQUFROW1DLEdBQVIsQ0FBYW1YLFNBQWIsQ0FBd0J3dUIsYUFBY3h1QixTQUFkLENBQXlCb3VCLFVBQXpCLENBQXhCLEVBRUEsQ0FKRCxRQUlZeG1DLEtBQUt2TSxPQUFMLENBQWUya0IsVUFBVTNrQixPQUE5QixDQUF3QyxDQUU5Q3kwQyxhQUFjbG9DLEtBQUs4bUMsTUFBbkIsQ0FBMkIxdUIsU0FBM0IsQ0FBc0NvdUIsVUFBdEMsRUFFQXhtQyxLQUFLdk0sT0FBTCxDQUFlMmtCLFVBQVUza0IsT0FBekIsQ0FFQSxDQUVELENBRUQsT0FBTyxDQUVOWSxJQUFLQSxHQUZDLENBR044ekMsT0FBUUEsTUFIRixDQUlON2pCLE9BQVFBLE1BSkYsQ0FBUCxDQVFBLENBRUQ7Ozs7S0FNQSxjQUFBLENBQWdCcGhCLENBQWhCLENBQW1Cd1EsQ0FBbkIsQ0FBc0I2RyxDQUF0QixDQUF5QlMsS0FBekIsQ0FBaUMsQ0FFaEMsS0FBS2UsRUFBTCxDQUFVN1ksR0FBSyxDQUFmLENBQ0EsS0FBSzhZLEVBQUwsQ0FBVXRJLEdBQUssQ0FBZixDQUNBLEtBQUt1SSxFQUFMLENBQVUxQixHQUFLLENBQWYsQ0FDQSxLQUFLNnRCLE1BQUwsQ0FBY3B0QixPQUFTcXRCLE1BQU1DLFlBQTdCLENBRUEsQ0FFREQsTUFBTUUsY0FBTixDQUF1QixDQUFFLEtBQUYsQ0FBUyxLQUFULENBQWdCLEtBQWhCLENBQXVCLEtBQXZCLENBQThCLEtBQTlCLENBQXFDLEtBQXJDLENBQXZCLENBRUFGLE1BQU1DLFlBQU4sQ0FBcUIsS0FBckIsQ0FFQTErQyxPQUFPc1AsZ0JBQVAsQ0FBeUJtdkMsTUFBTXgrQyxTQUEvQixDQUEwQyxDQUV6Q3FaLEVBQUcsQ0FFRjdPLElBQUssVUFBWSxDQUVoQixZQUFZMG5CLEVBQVosQ0FFQSxDQU5DLENBUUY5YSxJQUFLLFNBQVczVCxLQUFYLENBQW1CLENBRXZCLEtBQUt5dUIsRUFBTCxDQUFVenVCLEtBQVYsQ0FDQSxLQUFLODJCLGdCQUFMLEdBRUEsQ0FiQyxDQUZzQyxDQW1CekMxUSxFQUFHLENBRUZyZixJQUFLLFVBQVksQ0FFaEIsWUFBWTJuQixFQUFaLENBRUEsQ0FOQyxDQVFGL2EsSUFBSyxTQUFXM1QsS0FBWCxDQUFtQixDQUV2QixLQUFLMHVCLEVBQUwsQ0FBVTF1QixLQUFWLENBQ0EsS0FBSzgyQixnQkFBTCxHQUVBLENBYkMsQ0FuQnNDLENBb0N6QzdKLEVBQUcsQ0FFRmxtQixJQUFLLFVBQVksQ0FFaEIsWUFBWTRuQixFQUFaLENBRUEsQ0FOQyxDQVFGaGIsSUFBSyxTQUFXM1QsS0FBWCxDQUFtQixDQUV2QixLQUFLMnVCLEVBQUwsQ0FBVTN1QixLQUFWLENBQ0EsS0FBSzgyQixnQkFBTCxHQUVBLENBYkMsQ0FwQ3NDLENBcUR6Q3BKLE1BQU8sQ0FFTjNtQixJQUFLLFVBQVksQ0FFaEIsWUFBWSt6QyxNQUFaLENBRUEsQ0FOSyxDQVFObm5DLElBQUssU0FBVzNULEtBQVgsQ0FBbUIsQ0FFdkIsS0FBSzg2QyxNQUFMLENBQWM5NkMsS0FBZCxDQUNBLEtBQUs4MkIsZ0JBQUwsR0FFQSxDQWJLLENBckRrQyxDQUExQyxFQXdFQXg2QixPQUFPNG5CLE1BQVAsQ0FBZTYyQixNQUFNeCtDLFNBQXJCLENBQWdDLENBRS9CaXhCLFFBQVMsSUFGc0IsQ0FJL0I3WixJQUFLLFNBQVdpQyxDQUFYLENBQWN3USxDQUFkLENBQWlCNkcsQ0FBakIsQ0FBb0JTLEtBQXBCLENBQTRCLENBRWhDLEtBQUtlLEVBQUwsQ0FBVTdZLENBQVYsQ0FDQSxLQUFLOFksRUFBTCxDQUFVdEksQ0FBVixDQUNBLEtBQUt1SSxFQUFMLENBQVUxQixDQUFWLENBQ0EsS0FBSzZ0QixNQUFMLENBQWNwdEIsT0FBUyxLQUFLb3RCLE1BQTVCLENBRUEsS0FBS2hrQixnQkFBTCxHQUVBLFdBQUEsQ0FFQSxDQWY4QixDQWlCL0I5TyxNQUFPLFVBQVksQ0FFbEIsZ0JBQWdCbnBCLFdBQVQsQ0FBc0IsS0FBSzR2QixFQUEzQixDQUErQixLQUFLQyxFQUFwQyxDQUF3QyxLQUFLQyxFQUE3QyxDQUFpRCxLQUFLbXNCLE1BQXRELENBQVAsQ0FFQSxDQXJCOEIsQ0F1Qi9CN3lCLEtBQU0sU0FBV3NGLEtBQVgsQ0FBbUIsQ0FFeEIsS0FBS2tCLEVBQUwsQ0FBVWxCLE1BQU1rQixFQUFoQixDQUNBLEtBQUtDLEVBQUwsQ0FBVW5CLE1BQU1tQixFQUFoQixDQUNBLEtBQUtDLEVBQUwsQ0FBVXBCLE1BQU1vQixFQUFoQixDQUNBLEtBQUttc0IsTUFBTCxDQUFjdnRCLE1BQU11dEIsTUFBcEIsQ0FFQSxLQUFLaGtCLGdCQUFMLEdBRUEsV0FBQSxDQUVBLENBbEM4QixDQW9DL0JsQyxzQkFBdUIsU0FBVy9PLENBQVgsQ0FBYzZILEtBQWQsQ0FBcUJzSixNQUFyQixDQUE4QixDQUVwRCxVQUFZaFEsTUFBTXRCLEtBQWxCLENBRUE7RUFFQSxPQUFTRyxFQUFFa0QsUUFBWCxDQUNBLFFBQVV3RCxHQUFJLENBQUosQ0FBVixDQUFtQm1MLElBQU1uTCxHQUFJLENBQUosQ0FBekIsQ0FBa0NvTCxJQUFNcEwsR0FBSSxDQUFKLENBQXhDLENBQ0EsUUFBVUEsR0FBSSxDQUFKLENBQVYsQ0FBbUJzTCxJQUFNdEwsR0FBSSxDQUFKLENBQXpCLENBQWtDdUwsSUFBTXZMLEdBQUksQ0FBSixDQUF4QyxDQUNBLFFBQVVBLEdBQUksQ0FBSixDQUFWLENBQW1CeUwsSUFBTXpMLEdBQUksQ0FBSixDQUF6QixDQUFrQzBMLElBQU0xTCxHQUFJLEVBQUosQ0FBeEMsQ0FFQW1CLE1BQVFBLE9BQVMsS0FBS290QixNQUF0QixDQUVBLEdBQUtwdEIsUUFBVSxLQUFmLENBQXVCLENBRXRCLEtBQUtnQixFQUFMLENBQVV4cEIsS0FBS2cyQyxJQUFMLENBQVd4MUIsTUFBT2lTLEdBQVAsQ0FBWSxDQUFFLENBQWQsQ0FBaUIsQ0FBakIsQ0FBWCxDQUFWLENBRUEsR0FBS3p5QixLQUFLeWtCLEdBQUwsQ0FBVWdPLEdBQVYsRUFBa0IsT0FBdkIsQ0FBaUMsQ0FFaEMsS0FBS2xKLEVBQUwsQ0FBVXZwQixLQUFLNGtCLEtBQUwsQ0FBWSxDQUFFZ08sR0FBZCxDQUFtQkcsR0FBbkIsQ0FBVixDQUNBLEtBQUt0SixFQUFMLENBQVV6cEIsS0FBSzRrQixLQUFMLENBQVksQ0FBRTROLEdBQWQsQ0FBbUJELEdBQW5CLENBQVYsQ0FFQSxDQUxELElBS08sQ0FFTixLQUFLaEosRUFBTCxDQUFVdnBCLEtBQUs0a0IsS0FBTCxDQUFZa08sR0FBWixDQUFpQkgsR0FBakIsQ0FBVixDQUNBLEtBQUtsSixFQUFMLENBQVUsQ0FBVixDQUVBLENBRUQsQ0FoQkQsUUFnQllqQixRQUFVLEtBQWYsQ0FBdUIsQ0FFN0IsS0FBS2UsRUFBTCxDQUFVdnBCLEtBQUtnMkMsSUFBTCxDQUFXLENBQUV4MUIsTUFBT29TLEdBQVAsQ0FBWSxDQUFFLENBQWQsQ0FBaUIsQ0FBakIsQ0FBYixDQUFWLENBRUEsR0FBSzV5QixLQUFLeWtCLEdBQUwsQ0FBVW1PLEdBQVYsRUFBa0IsT0FBdkIsQ0FBaUMsQ0FFaEMsS0FBS3BKLEVBQUwsQ0FBVXhwQixLQUFLNGtCLEtBQUwsQ0FBWTZOLEdBQVosQ0FBaUJNLEdBQWpCLENBQVYsQ0FDQSxLQUFLdEosRUFBTCxDQUFVenBCLEtBQUs0a0IsS0FBTCxDQUFZOE4sR0FBWixDQUFpQkMsR0FBakIsQ0FBVixDQUVBLENBTEQsSUFLTyxDQUVOLEtBQUtuSixFQUFMLENBQVV4cEIsS0FBSzRrQixLQUFMLENBQVksQ0FBRWlPLEdBQWQsQ0FBbUJOLEdBQW5CLENBQVYsQ0FDQSxLQUFLOUksRUFBTCxDQUFVLENBQVYsQ0FFQSxDQUVELENBaEJNLFFBZ0JLakIsUUFBVSxLQUFmLENBQXVCLENBRTdCLEtBQUtlLEVBQUwsQ0FBVXZwQixLQUFLZzJDLElBQUwsQ0FBV3gxQixNQUFPc1MsR0FBUCxDQUFZLENBQUUsQ0FBZCxDQUFpQixDQUFqQixDQUFYLENBQVYsQ0FFQSxHQUFLOXlCLEtBQUt5a0IsR0FBTCxDQUFVcU8sR0FBVixFQUFrQixPQUF2QixDQUFpQyxDQUVoQyxLQUFLdEosRUFBTCxDQUFVeHBCLEtBQUs0a0IsS0FBTCxDQUFZLENBQUVpTyxHQUFkLENBQW1CRSxHQUFuQixDQUFWLENBQ0EsS0FBS3RKLEVBQUwsQ0FBVXpwQixLQUFLNGtCLEtBQUwsQ0FBWSxDQUFFNE4sR0FBZCxDQUFtQkcsR0FBbkIsQ0FBVixDQUVBLENBTEQsSUFLTyxDQUVOLEtBQUtuSixFQUFMLENBQVUsQ0FBVixDQUNBLEtBQUtDLEVBQUwsQ0FBVXpwQixLQUFLNGtCLEtBQUwsQ0FBWThOLEdBQVosQ0FBaUJILEdBQWpCLENBQVYsQ0FFQSxDQUVELENBaEJNLFFBZ0JLL0osUUFBVSxLQUFmLENBQXVCLENBRTdCLEtBQUtnQixFQUFMLENBQVV4cEIsS0FBS2cyQyxJQUFMLENBQVcsQ0FBRXgxQixNQUFPcVMsR0FBUCxDQUFZLENBQUUsQ0FBZCxDQUFpQixDQUFqQixDQUFiLENBQVYsQ0FFQSxHQUFLN3lCLEtBQUt5a0IsR0FBTCxDQUFVb08sR0FBVixFQUFrQixPQUF2QixDQUFpQyxDQUVoQyxLQUFLdEosRUFBTCxDQUFVdnBCLEtBQUs0a0IsS0FBTCxDQUFZa08sR0FBWixDQUFpQkMsR0FBakIsQ0FBVixDQUNBLEtBQUt0SixFQUFMLENBQVV6cEIsS0FBSzRrQixLQUFMLENBQVk4TixHQUFaLENBQWlCSCxHQUFqQixDQUFWLENBRUEsQ0FMRCxJQUtPLENBRU4sS0FBS2hKLEVBQUwsQ0FBVSxDQUFWLENBQ0EsS0FBS0UsRUFBTCxDQUFVenBCLEtBQUs0a0IsS0FBTCxDQUFZLENBQUU0TixHQUFkLENBQW1CRyxHQUFuQixDQUFWLENBRUEsQ0FFRCxDQWhCTSxRQWdCS25LLFFBQVUsS0FBZixDQUF1QixDQUU3QixLQUFLaUIsRUFBTCxDQUFVenBCLEtBQUtnMkMsSUFBTCxDQUFXeDFCLE1BQU9rUyxHQUFQLENBQVksQ0FBRSxDQUFkLENBQWlCLENBQWpCLENBQVgsQ0FBVixDQUVBLEdBQUsxeUIsS0FBS3lrQixHQUFMLENBQVVpTyxHQUFWLEVBQWtCLE9BQXZCLENBQWlDLENBRWhDLEtBQUtuSixFQUFMLENBQVV2cEIsS0FBSzRrQixLQUFMLENBQVksQ0FBRWdPLEdBQWQsQ0FBbUJELEdBQW5CLENBQVYsQ0FDQSxLQUFLbkosRUFBTCxDQUFVeHBCLEtBQUs0a0IsS0FBTCxDQUFZLENBQUVpTyxHQUFkLENBQW1CTixHQUFuQixDQUFWLENBRUEsQ0FMRCxJQUtPLENBRU4sS0FBS2hKLEVBQUwsQ0FBVSxDQUFWLENBQ0EsS0FBS0MsRUFBTCxDQUFVeHBCLEtBQUs0a0IsS0FBTCxDQUFZNk4sR0FBWixDQUFpQk0sR0FBakIsQ0FBVixDQUVBLENBRUQsQ0FoQk0sUUFnQkt2SyxRQUFVLEtBQWYsQ0FBdUIsQ0FFN0IsS0FBS2lCLEVBQUwsQ0FBVXpwQixLQUFLZzJDLElBQUwsQ0FBVyxDQUFFeDFCLE1BQU9nUyxHQUFQLENBQVksQ0FBRSxDQUFkLENBQWlCLENBQWpCLENBQWIsQ0FBVixDQUVBLEdBQUt4eUIsS0FBS3lrQixHQUFMLENBQVUrTixHQUFWLEVBQWtCLE9BQXZCLENBQWlDLENBRWhDLEtBQUtqSixFQUFMLENBQVV2cEIsS0FBSzRrQixLQUFMLENBQVlrTyxHQUFaLENBQWlCSCxHQUFqQixDQUFWLENBQ0EsS0FBS25KLEVBQUwsQ0FBVXhwQixLQUFLNGtCLEtBQUwsQ0FBWTZOLEdBQVosQ0FBaUJGLEdBQWpCLENBQVYsQ0FFQSxDQUxELElBS08sQ0FFTixLQUFLaEosRUFBTCxDQUFVdnBCLEtBQUs0a0IsS0FBTCxDQUFZLENBQUVnTyxHQUFkLENBQW1CRyxHQUFuQixDQUFWLENBQ0EsS0FBS3ZKLEVBQUwsQ0FBVSxDQUFWLENBRUEsQ0FFRCxDQWhCTSxJQWdCQSxDQUVOcFcsUUFBUTZQLElBQVIsQ0FBYyxrRUFBb0V1RixLQUFsRixFQUVBLENBRUQsS0FBS290QixNQUFMLENBQWNwdEIsS0FBZCxDQUVBLEdBQUtzSixTQUFXLEtBQWhCLENBQXdCLEtBQUtGLGdCQUFMLEdBRXhCLFdBQUEsQ0FFQSxDQTdKOEIsQ0ErSi9CcWtCLGtCQUFtQixVQUFZLENBRTlCLFdBQWEsV0FBQSxFQUFiLENBRUEsaUNBQU8sQ0FBNEIzc0IsQ0FBNUIsQ0FBK0JkLEtBQS9CLENBQXNDc0osTUFBdEMsQ0FBK0MsQ0FFckQxQyxPQUFPL0YsMEJBQVAsQ0FBbUNDLENBQW5DLEVBRUEsWUFBWW9HLHFCQUFMLENBQTRCTixNQUE1QixDQUFvQzVHLEtBQXBDLENBQTJDc0osTUFBM0MsQ0FBUCxDQUVBLENBTkQsQ0FRQSxDQVprQixFQS9KWSxDQTZLL0Jva0IsZUFBZ0IsU0FBVzFsQyxDQUFYLENBQWNnWSxLQUFkLENBQXNCLENBRXJDLFlBQVkvWixHQUFMLENBQVUrQixFQUFFRSxDQUFaLENBQWVGLEVBQUUwUSxDQUFqQixDQUFvQjFRLEVBQUV1WCxDQUF0QixDQUF5QlMsT0FBUyxLQUFLb3RCLE1BQXZDLENBQVAsQ0FFQSxDQWpMOEIsQ0FtTC9CTyxRQUFTLFVBQVk7RUFJcEIsTUFBUSxjQUFBLEVBQVIsQ0FFQSx1QkFBTyxDQUFrQkMsUUFBbEIsQ0FBNkIsQ0FFbkM5c0IsRUFBRXVJLFlBQUYsQ0FBZ0IsSUFBaEIsRUFFQSxZQUFZb2tCLGlCQUFMLENBQXdCM3NCLENBQXhCLENBQTJCOHNCLFFBQTNCLENBQVAsQ0FFQSxDQU5ELENBUUEsQ0FkUSxFQW5Mc0IsQ0FtTS9CN3dCLE9BQVEsU0FBVzhDLEtBQVgsQ0FBbUIsQ0FFMUIsYUFBZWtCLEVBQU4sR0FBYSxLQUFLQSxFQUFwQixFQUE4QmxCLE1BQU1tQixFQUFOLEdBQWEsS0FBS0EsRUFBaEQsRUFBMERuQixNQUFNb0IsRUFBTixHQUFhLEtBQUtBLEVBQTVFLEVBQXNGcEIsTUFBTXV0QixNQUFOLEdBQWlCLEtBQUtBLE1BQW5ILENBRUEsQ0F2TThCLENBeU0vQnB3QixVQUFXLFNBQVd0SCxLQUFYLENBQW1CLENBRTdCLEtBQUtxTCxFQUFMLENBQVVyTCxNQUFPLENBQVAsQ0FBVixDQUNBLEtBQUtzTCxFQUFMLENBQVV0TCxNQUFPLENBQVAsQ0FBVixDQUNBLEtBQUt1TCxFQUFMLENBQVV2TCxNQUFPLENBQVAsQ0FBVixDQUNBLEdBQUtBLE1BQU8sQ0FBUCxJQUFlemhCLFNBQXBCLENBQWdDLEtBQUttNUMsTUFBTCxDQUFjMTNCLE1BQU8sQ0FBUCxDQUFkLENBRWhDLEtBQUswVCxnQkFBTCxHQUVBLFdBQUEsQ0FFQSxDQXBOOEIsQ0FzTi9CbE0sUUFBUyxTQUFXeEgsS0FBWCxDQUFrQnVILE1BQWxCLENBQTJCLENBRW5DLEdBQUt2SCxRQUFVemhCLFNBQWYsQ0FBMkJ5aEIsTUFBUSxFQUFSLENBQzNCLEdBQUt1SCxTQUFXaHBCLFNBQWhCLENBQTRCZ3BCLE9BQVMsQ0FBVCxDQUU1QnZILE1BQU91SCxNQUFQLEVBQWtCLEtBQUs4RCxFQUF2QixDQUNBckwsTUFBT3VILE9BQVMsQ0FBaEIsRUFBc0IsS0FBSytELEVBQTNCLENBQ0F0TCxNQUFPdUgsT0FBUyxDQUFoQixFQUFzQixLQUFLZ0UsRUFBM0IsQ0FDQXZMLE1BQU91SCxPQUFTLENBQWhCLEVBQXNCLEtBQUttd0IsTUFBM0IsQ0FFQSxZQUFBLENBRUEsQ0FsTzhCLENBb08vQlMsVUFBVyxTQUFXQyxjQUFYLENBQTRCLENBRXRDLEdBQUtBLGNBQUwsQ0FBc0IsQ0FFckIsc0JBQXNCN25DLEdBQWYsQ0FBb0IsS0FBSzhhLEVBQXpCLENBQTZCLEtBQUtDLEVBQWxDLENBQXNDLEtBQUtDLEVBQTNDLENBQVAsQ0FFQSxDQUpELElBSU8sQ0FFTixrQkFBTyxDQUFhLEtBQUtGLEVBQWxCLENBQXNCLEtBQUtDLEVBQTNCLENBQStCLEtBQUtDLEVBQXBDLENBQVAsQ0FFQSxDQUVELENBaFA4QixDQWtQL0I0SyxTQUFVLFNBQVdDLFFBQVgsQ0FBc0IsQ0FFL0IsS0FBSzFDLGdCQUFMLENBQXdCMEMsUUFBeEIsQ0FFQSxXQUFBLENBRUEsQ0F4UDhCLENBMFAvQjFDLGlCQUFrQixVQUFZLEVBMVBDLENBQWhDLEVBOFBBOztLQUlBLGVBQUEsRUFBa0IsQ0FFakIsS0FBSzJrQixJQUFMLENBQVksRUFBSSxDQUFoQixDQUVBLENBRURuL0MsT0FBTzRuQixNQUFQLENBQWV3M0IsT0FBT24vQyxTQUF0QixDQUFpQyxDQUVoQ29YLElBQUssU0FBV3RCLE9BQVgsQ0FBcUIsQ0FFekIsS0FBS29wQyxJQUFMLENBQVksR0FBS3BwQyxPQUFMLENBQWUsQ0FBM0IsQ0FFQSxDQU4rQixDQVFoQ3NwQyxPQUFRLFNBQVd0cEMsT0FBWCxDQUFxQixDQUU1QixLQUFLb3BDLElBQUwsRUFBYSxHQUFLcHBDLE9BQUwsQ0FBZSxDQUE1QixDQUVBLENBWitCLENBY2hDNkMsT0FBUSxTQUFXN0MsT0FBWCxDQUFxQixDQUU1QixLQUFLb3BDLElBQUwsRUFBYSxHQUFLcHBDLE9BQUwsQ0FBZSxDQUE1QixDQUVBLENBbEIrQixDQW9CaEN1cEMsUUFBUyxTQUFXdnBDLE9BQVgsQ0FBcUIsQ0FFN0IsS0FBS29wQyxJQUFMLEVBQWEsRUFBSSxHQUFLcHBDLE9BQUwsQ0FBZSxDQUFuQixDQUFiLENBRUEsQ0F4QitCLENBMEJoQ3dPLEtBQU0sU0FBV2c3QixNQUFYLENBQW9CLENBRXpCLE9BQU8sQ0FBRSxLQUFLSixJQUFMLENBQVlJLE9BQU9KLElBQXJCLElBQWdDLENBQXZDLENBRUEsQ0E5QitCLENBQWpDLEVBa0NBOzs7Ozs7S0FRQSxlQUFpQixDQUFqQixDQUVBLGlCQUFBLEVBQW9CLENBRW5Cbi9DLE9BQU93SyxjQUFQLENBQXVCLElBQXZCLENBQTZCLElBQTdCLENBQW1DLENBQUU5RyxNQUFPODdDLFlBQVQsQ0FBbkMsRUFFQSxLQUFLcGUsSUFBTCxDQUFZMVcsTUFBTTdCLFlBQU4sRUFBWixDQUVBLEtBQUs5bEIsSUFBTCxDQUFZLEVBQVosQ0FDQSxLQUFLckIsSUFBTCxDQUFZLFVBQVosQ0FFQSxLQUFLcVcsTUFBTCxDQUFjLElBQWQsQ0FDQSxLQUFLMG5DLFFBQUwsQ0FBZ0IsRUFBaEIsQ0FFQSxLQUFLcnNCLEVBQUwsQ0FBVXNzQixTQUFTQyxTQUFULENBQW1CajBCLEtBQW5CLEVBQVYsQ0FFQSxhQUFlLFdBQUEsRUFBZixDQUNBLGFBQWUsU0FBQSxFQUFmLENBQ0EsZUFBaUIsY0FBQSxFQUFqQixDQUNBLFVBQVksV0FBQSxDQUFhLENBQWIsQ0FBZ0IsQ0FBaEIsQ0FBbUIsQ0FBbkIsQ0FBWixDQUVBLHlCQUFBLEVBQTRCLENBRTNCa00sV0FBVzZDLFlBQVgsQ0FBeUI0RixRQUF6QixDQUFtQyxLQUFuQyxFQUVBLENBRUQsMkJBQUEsRUFBOEIsQ0FFN0JBLFNBQVN3ZSxpQkFBVCxDQUE0QmpuQixVQUE1QixDQUF3Q3Z5QixTQUF4QyxDQUFtRCxLQUFuRCxFQUVBLENBRURnN0IsU0FBU3BELFFBQVQsQ0FBbUIyaUIsZ0JBQW5CLEVBQ0Fob0IsV0FBV3FGLFFBQVgsQ0FBcUI0aUIsa0JBQXJCLEVBRUE3L0MsT0FBT3NQLGdCQUFQLENBQXlCLElBQXpCLENBQStCLENBQzlCcW9CLFNBQVUsQ0FDVGhzQixXQUFZLElBREgsQ0FFVGpJLE1BQU9pMEIsUUFGRSxDQURvQixDQUs5QjBJLFNBQVUsQ0FDVDEwQixXQUFZLElBREgsQ0FFVGpJLE1BQU8yOEIsUUFGRSxDQUxvQixDQVM5QnpJLFdBQVksQ0FDWGpzQixXQUFZLElBREQsQ0FFWGpJLE1BQU9rMEIsVUFGSSxDQVRrQixDQWE5QmxCLE1BQU8sQ0FDTi9xQixXQUFZLElBRE4sQ0FFTmpJLE1BQU9nekIsS0FGRCxDQWJ1QixDQWlCOUJvcEIsZ0JBQWlCLENBQ2hCcDhDLE1BQU8sV0FBQSxFQURTLENBakJhLENBb0I5QnFuQyxhQUFjLENBQ2JybkMsTUFBTyxXQUFBLEVBRE0sQ0FwQmdCLENBQS9CLEVBeUJBLEtBQUtzMEIsTUFBTCxDQUFjLFdBQUEsRUFBZCxDQUNBLEtBQUtxRyxXQUFMLENBQW1CLFdBQUEsRUFBbkIsQ0FFQSxLQUFLMEQsZ0JBQUwsQ0FBd0IyZCxTQUFTSyx1QkFBakMsQ0FDQSxLQUFLQyxzQkFBTCxDQUE4QixLQUE5QixDQUVBLEtBQUtULE1BQUwsQ0FBYyxVQUFBLEVBQWQsQ0FDQSxLQUFLVSxPQUFMLENBQWUsSUFBZixDQUVBLEtBQUtDLFVBQUwsQ0FBa0IsS0FBbEIsQ0FDQSxLQUFLQyxhQUFMLENBQXFCLEtBQXJCLENBRUEsS0FBS0MsYUFBTCxDQUFxQixJQUFyQixDQUNBLEtBQUtDLFdBQUwsQ0FBbUIsQ0FBbkIsQ0FFQSxLQUFLQyxRQUFMLENBQWdCLEVBQWhCLENBRUEsQ0FFRFosU0FBU0MsU0FBVCxDQUFxQixXQUFBLENBQWEsQ0FBYixDQUFnQixDQUFoQixDQUFtQixDQUFuQixDQUFyQixDQUNBRCxTQUFTSyx1QkFBVCxDQUFtQyxJQUFuQyxDQUVBTCxTQUFTei9DLFNBQVQsQ0FBcUJELE9BQU80bkIsTUFBUCxDQUFlNW5CLE9BQU9pQixNQUFQLENBQWU4bUIsZ0JBQWdCOW5CLFNBQS9CLENBQWYsQ0FBMkQsQ0FFL0VzQyxZQUFhbTlDLFFBRmtFLENBSS9FYSxXQUFZLElBSm1FLENBTS9FQyxlQUFnQixVQUFZLEVBTm1ELENBTy9FQyxjQUFlLFVBQVksRUFQb0QsQ0FTL0VDLFlBQWEsU0FBVzFvQixNQUFYLENBQW9CLENBRWhDLEtBQUtBLE1BQUwsQ0FBWTFFLGdCQUFaLENBQThCMEUsTUFBOUIsQ0FBc0MsS0FBS0EsTUFBM0MsRUFFQSxLQUFLQSxNQUFMLENBQVlILFNBQVosQ0FBdUIsS0FBS0YsUUFBNUIsQ0FBc0MsS0FBS0MsVUFBM0MsQ0FBdUQsS0FBS2xCLEtBQTVELEVBRUEsQ0FmOEUsQ0FpQi9FOEcsZ0JBQWlCLFNBQVd0TCxDQUFYLENBQWUsQ0FFL0IsS0FBSzBGLFVBQUwsQ0FBZ0JyRSxXQUFoQixDQUE2QnJCLENBQTdCLEVBRUEsV0FBQSxDQUVBLENBdkI4RSxDQXlCL0V5dUIseUJBQTBCLFNBQVd0cEIsSUFBWCxDQUFpQjlKLEtBQWpCLENBQXlCO0VBSWxELEtBQUtxSyxVQUFMLENBQWdCcUQsZ0JBQWhCLENBQWtDNUQsSUFBbEMsQ0FBd0M5SixLQUF4QyxFQUVBLENBL0I4RSxDQWlDL0VxekIscUJBQXNCLFNBQVczdkIsS0FBWCxDQUFtQixDQUV4QyxLQUFLMkcsVUFBTCxDQUFnQjZDLFlBQWhCLENBQThCeEosS0FBOUIsQ0FBcUMsSUFBckMsRUFFQSxDQXJDOEUsQ0F1Qy9FNHZCLHNCQUF1QixTQUFXdDNCLENBQVgsQ0FBZTtFQUlyQyxLQUFLcU8sVUFBTCxDQUFnQlUscUJBQWhCLENBQXVDL08sQ0FBdkMsRUFFQSxDQTdDOEUsQ0ErQy9FdTNCLDBCQUEyQixTQUFXNXVCLENBQVgsQ0FBZTtFQUl6QyxLQUFLMEYsVUFBTCxDQUFnQmpNLElBQWhCLENBQXNCdUcsQ0FBdEIsRUFFQSxDQXJEOEUsQ0F1RC9FNnVCLGFBQWMsVUFBWTtFQUd6QjtFQUVBLE9BQVMsY0FBQSxFQUFULENBRUEsNEJBQU8sQ0FBdUIxcEIsSUFBdkIsQ0FBNkI5SixLQUE3QixDQUFxQyxDQUUzQ3l6QixHQUFHL2xCLGdCQUFILENBQXFCNUQsSUFBckIsQ0FBMkI5SixLQUEzQixFQUVBLEtBQUtxSyxVQUFMLENBQWdCeEwsUUFBaEIsQ0FBMEI0MEIsRUFBMUIsRUFFQSxXQUFBLENBRUEsQ0FSRCxDQVVBLENBakJhLEVBdkRpRSxDQTBFL0VDLGtCQUFtQixVQUFZO0VBRzlCO0VBQ0E7RUFFQSxPQUFTLGNBQUEsRUFBVCxDQUVBLGlDQUFPLENBQTRCNXBCLElBQTVCLENBQWtDOUosS0FBbEMsQ0FBMEMsQ0FFaER5ekIsR0FBRy9sQixnQkFBSCxDQUFxQjVELElBQXJCLENBQTJCOUosS0FBM0IsRUFFQSxLQUFLcUssVUFBTCxDQUFnQnJFLFdBQWhCLENBQTZCeXRCLEVBQTdCLEVBRUEsV0FBQSxDQUVBLENBUkQsQ0FVQSxDQWxCa0IsRUExRTRELENBOEYvRUUsUUFBUyxVQUFZLENBRXBCLE9BQVMsV0FBQSxDQUFhLENBQWIsQ0FBZ0IsQ0FBaEIsQ0FBbUIsQ0FBbkIsQ0FBVCxDQUVBLHVCQUFPLENBQWtCM3pCLEtBQWxCLENBQTBCLENBRWhDLFlBQVl3ekIsWUFBTCxDQUFtQjl5QixFQUFuQixDQUF1QlYsS0FBdkIsQ0FBUCxDQUVBLENBSkQsQ0FNQSxDQVZRLEVBOUZzRSxDQTBHL0U0ekIsUUFBUyxVQUFZLENBRXBCLE9BQVMsV0FBQSxDQUFhLENBQWIsQ0FBZ0IsQ0FBaEIsQ0FBbUIsQ0FBbkIsQ0FBVCxDQUVBLHVCQUFPLENBQWtCNXpCLEtBQWxCLENBQTBCLENBRWhDLFlBQVl3ekIsWUFBTCxDQUFtQjl5QixFQUFuQixDQUF1QlYsS0FBdkIsQ0FBUCxDQUVBLENBSkQsQ0FNQSxDQVZRLEVBMUdzRSxDQXNIL0U2ekIsUUFBUyxVQUFZLENBRXBCLE9BQVMsV0FBQSxDQUFhLENBQWIsQ0FBZ0IsQ0FBaEIsQ0FBbUIsQ0FBbkIsQ0FBVCxDQUVBLHVCQUFPLENBQWtCN3pCLEtBQWxCLENBQTBCLENBRWhDLFlBQVl3ekIsWUFBTCxDQUFtQjl5QixFQUFuQixDQUF1QlYsS0FBdkIsQ0FBUCxDQUVBLENBSkQsQ0FNQSxDQVZRLEVBdEhzRSxDQWtJL0U4ekIsZ0JBQWlCLFVBQVk7RUFHNUI7RUFFQSxPQUFTLFdBQUEsRUFBVCxDQUVBLCtCQUFPLENBQTBCaHFCLElBQTFCLENBQWdDd1YsUUFBaEMsQ0FBMkMsQ0FFakQ1ZSxHQUFHdEMsSUFBSCxDQUFTMEwsSUFBVCxFQUFnQm1HLGVBQWhCLENBQWlDLEtBQUs1RixVQUF0QyxFQUVBLEtBQUtELFFBQUwsQ0FBYy9MLEdBQWQsQ0FBbUJxQyxHQUFHNUIsY0FBSCxDQUFtQndnQixRQUFuQixDQUFuQixFQUVBLFdBQUEsQ0FFQSxDQVJELENBVUEsQ0FqQmdCLEVBbEk4RCxDQXFKL0V5VSxXQUFZLFVBQVksQ0FFdkIsT0FBUyxXQUFBLENBQWEsQ0FBYixDQUFnQixDQUFoQixDQUFtQixDQUFuQixDQUFULENBRUEsMEJBQU8sQ0FBcUJ6VSxRQUFyQixDQUFnQyxDQUV0QyxZQUFZd1UsZUFBTCxDQUFzQnB6QixFQUF0QixDQUEwQjRlLFFBQTFCLENBQVAsQ0FFQSxDQUpELENBTUEsQ0FWVyxFQXJKbUUsQ0FpSy9FMFUsV0FBWSxVQUFZLENBRXZCLE9BQVMsV0FBQSxDQUFhLENBQWIsQ0FBZ0IsQ0FBaEIsQ0FBbUIsQ0FBbkIsQ0FBVCxDQUVBLDBCQUFPLENBQXFCMVUsUUFBckIsQ0FBZ0MsQ0FFdEMsWUFBWXdVLGVBQUwsQ0FBc0JwekIsRUFBdEIsQ0FBMEI0ZSxRQUExQixDQUFQLENBRUEsQ0FKRCxDQU1BLENBVlcsRUFqS21FLENBNksvRTJVLFdBQVksVUFBWSxDQUV2QixPQUFTLFdBQUEsQ0FBYSxDQUFiLENBQWdCLENBQWhCLENBQW1CLENBQW5CLENBQVQsQ0FFQSwwQkFBTyxDQUFxQjNVLFFBQXJCLENBQWdDLENBRXRDLFlBQVl3VSxlQUFMLENBQXNCcHpCLEVBQXRCLENBQTBCNGUsUUFBMUIsQ0FBUCxDQUVBLENBSkQsQ0FNQSxDQVZXLEVBN0ttRSxDQXlML0U0VSxhQUFjLFNBQVczcEIsTUFBWCxDQUFvQixDQUVqQyxjQUFjbkMsWUFBUCxDQUFxQixLQUFLMEksV0FBMUIsQ0FBUCxDQUVBLENBN0w4RSxDQStML0VxakIsYUFBYyxVQUFZLENBRXpCLE9BQVMsV0FBQSxFQUFULENBRUEsNEJBQU8sQ0FBdUI1cEIsTUFBdkIsQ0FBZ0MsQ0FFdEMsY0FBY25DLFlBQVAsQ0FBcUJtVixHQUFHN1UsVUFBSCxDQUFlLEtBQUtvSSxXQUFwQixDQUFyQixDQUFQLENBRUEsQ0FKRCxDQU1BLENBVmEsRUEvTGlFLENBMk0vRW5MLE9BQVEsVUFBWTtFQUluQixPQUFTLFdBQUEsRUFBVCxDQUNBLFdBQWEsV0FBQSxFQUFiLENBRUEsc0JBQU8sQ0FBaUI1WixDQUFqQixDQUFvQndRLENBQXBCLENBQXVCNkcsQ0FBdkIsQ0FBMkIsQ0FFakMsR0FBS3JYLEVBQUU4akIsU0FBUCxDQUFtQixDQUVsQnRGLE9BQU9uTSxJQUFQLENBQWFyUyxDQUFiLEVBRUEsQ0FKRCxJQUlPLENBRU53ZSxPQUFPemdCLEdBQVAsQ0FBWWlDLENBQVosQ0FBZXdRLENBQWYsQ0FBa0I2RyxDQUFsQixFQUVBLENBRUQsR0FBSyxLQUFLZ3hCLFFBQVYsQ0FBcUIsQ0FFcEI3VyxHQUFHNVgsTUFBSCxDQUFXLEtBQUt5RSxRQUFoQixDQUEwQkcsTUFBMUIsQ0FBa0MsS0FBSzFFLEVBQXZDLEVBRUEsQ0FKRCxJQUlPLENBRU4wWCxHQUFHNVgsTUFBSCxDQUFXNEUsTUFBWCxDQUFtQixLQUFLSCxRQUF4QixDQUFrQyxLQUFLdkUsRUFBdkMsRUFFQSxDQUVELEtBQUt3RSxVQUFMLENBQWdCVSxxQkFBaEIsQ0FBdUN3UyxFQUF2QyxFQUVBLENBeEJELENBMEJBLENBakNPLEVBM011RSxDQThPL0VsZixJQUFLLFNBQVdybEIsTUFBWCxDQUFvQixDQUV4QixHQUFLNkQsVUFBVTFELE1BQVYsQ0FBbUIsQ0FBeEIsQ0FBNEIsQ0FFM0IsSUFBTSxNQUFRLENBQWQsQ0FBaUJLLEVBQUlxRCxVQUFVMUQsTUFBL0IsQ0FBdUNLLEdBQXZDLENBQThDLENBRTdDLEtBQUs2a0IsR0FBTCxDQUFVeGhCLFVBQVdyRCxDQUFYLENBQVYsRUFFQSxDQUVELFdBQUEsQ0FFQSxDQUVELEdBQUtSLFNBQVcsSUFBaEIsQ0FBdUIsQ0FFdEJ5VixRQUFRTSxLQUFSLENBQWUsaUVBQWYsQ0FBa0YvVixNQUFsRixFQUNBLFdBQUEsQ0FFQSxDQUVELEdBQU9BLFFBQVVBLE9BQU9nNkMsVUFBeEIsQ0FBdUMsQ0FFdEMsR0FBS2g2QyxPQUFPd1IsTUFBUCxHQUFrQixJQUF2QixDQUE4QixDQUU3QnhSLE9BQU93UixNQUFQLENBQWN3bUMsTUFBZCxDQUFzQmg0QyxNQUF0QixFQUVBLENBRURBLE9BQU93UixNQUFQLENBQWdCLElBQWhCLENBQ0F4UixPQUFPK2hCLGFBQVAsQ0FBc0IsQ0FBRTVtQixLQUFNLE9BQVIsQ0FBdEIsRUFFQSxLQUFLKzlDLFFBQUwsQ0FBY3Y1QyxJQUFkLENBQW9CSyxNQUFwQixFQUVBLENBYkQsSUFhTyxDQUVOeVYsUUFBUU0sS0FBUixDQUFlLCtEQUFmLENBQWdGL1YsTUFBaEYsRUFFQSxDQUVELFdBQUEsQ0FFQSxDQXhSOEUsQ0EwUi9FZzRDLE9BQVEsU0FBV2g0QyxNQUFYLENBQW9CLENBRTNCLEdBQUs2RCxVQUFVMUQsTUFBVixDQUFtQixDQUF4QixDQUE0QixDQUUzQixJQUFNLE1BQVEsQ0FBZCxDQUFpQkssRUFBSXFELFVBQVUxRCxNQUEvQixDQUF1Q0ssR0FBdkMsQ0FBOEMsQ0FFN0MsS0FBS3czQyxNQUFMLENBQWFuMEMsVUFBV3JELENBQVgsQ0FBYixFQUVBLENBRUQsV0FBQSxDQUVBLENBRUQsVUFBWSxLQUFLMDRDLFFBQUwsQ0FBY2wzQyxPQUFkLENBQXVCaEMsTUFBdkIsQ0FBWixDQUVBLEdBQUtvSCxRQUFVLENBQUUsQ0FBakIsQ0FBcUIsQ0FFcEJwSCxPQUFPd1IsTUFBUCxDQUFnQixJQUFoQixDQUVBeFIsT0FBTytoQixhQUFQLENBQXNCLENBQUU1bUIsS0FBTSxTQUFSLENBQXRCLEVBRUEsS0FBSys5QyxRQUFMLENBQWNwM0IsTUFBZCxDQUFzQjFhLEtBQXRCLENBQTZCLENBQTdCLEVBRUEsQ0FFRCxXQUFBLENBRUEsQ0F0VDhFLENBd1QvRWkwQyxjQUFlLFNBQVdqekMsRUFBWCxDQUFnQixDQUU5QixZQUFZa3pDLG1CQUFMLENBQTBCLElBQTFCLENBQWdDbHpDLEVBQWhDLENBQVAsQ0FFQSxDQTVUOEUsQ0E4VC9FbXpDLGdCQUFpQixTQUFXLytDLElBQVgsQ0FBa0IsQ0FFbEMsWUFBWTgrQyxtQkFBTCxDQUEwQixNQUExQixDQUFrQzkrQyxJQUFsQyxDQUFQLENBRUEsQ0FsVThFLENBb1UvRTgrQyxvQkFBcUIsU0FBVzkrQyxJQUFYLENBQWlCVyxLQUFqQixDQUF5QixDQUU3QyxHQUFLLEtBQU1YLElBQU4sSUFBaUJXLEtBQXRCLENBQThCLFdBQUEsQ0FFOUIsSUFBTSxNQUFRLENBQVIsQ0FBVzhGLEVBQUksS0FBS2kyQyxRQUFMLENBQWMvNEMsTUFBbkMsQ0FBMkNLLEVBQUl5QyxDQUEvQyxDQUFrRHpDLEdBQWxELENBQXlELENBRXhELFVBQVksS0FBSzA0QyxRQUFMLENBQWUxNEMsQ0FBZixDQUFaLENBQ0EsV0FBYWc3QyxNQUFNRixtQkFBTixDQUEyQjkrQyxJQUEzQixDQUFpQ1csS0FBakMsQ0FBYixDQUVBLEdBQUs2QyxTQUFXbEIsU0FBaEIsQ0FBNEIsQ0FFM0IsYUFBQSxDQUVBLENBRUQsQ0FFRCxnQkFBQSxDQUVBLENBdlY4RSxDQXlWL0UyOEMsaUJBQWtCLFNBQVdyMUMsTUFBWCxDQUFvQixDQUVyQyxHQUFLQSxTQUFXdEgsU0FBaEIsQ0FBNEIsQ0FFM0IyVyxRQUFRNlAsSUFBUixDQUFjLDREQUFkLEVBQ0FsZixPQUFTLFdBQUEsRUFBVCxDQUVBLENBRUQsS0FBSzI2QixpQkFBTCxDQUF3QixJQUF4QixFQUVBLGNBQWMxSCxxQkFBUCxDQUE4QixLQUFLdkIsV0FBbkMsQ0FBUCxDQUVBLENBdFc4RSxDQXdXL0U0akIsbUJBQW9CLFVBQVksQ0FFL0IsYUFBZSxXQUFBLEVBQWYsQ0FDQSxVQUFZLFdBQUEsRUFBWixDQUVBLGtDQUFPLENBQTZCdDFDLE1BQTdCLENBQXNDLENBRTVDLEdBQUtBLFNBQVd0SCxTQUFoQixDQUE0QixDQUUzQjJXLFFBQVE2UCxJQUFSLENBQWMsOERBQWQsRUFDQWxmLE9BQVMsY0FBQSxFQUFULENBRUEsQ0FFRCxLQUFLMjZCLGlCQUFMLENBQXdCLElBQXhCLEVBRUEsS0FBS2pKLFdBQUwsQ0FBaUJ4RyxTQUFqQixDQUE0QkYsUUFBNUIsQ0FBc0NockIsTUFBdEMsQ0FBOEMrcEIsS0FBOUMsRUFFQSxhQUFBLENBRUEsQ0FmRCxDQWlCQSxDQXRCbUIsRUF4VzJELENBZ1kvRXdyQixjQUFlLFVBQVksQ0FFMUIsYUFBZSxXQUFBLEVBQWYsQ0FDQSxlQUFpQixjQUFBLEVBQWpCLENBRUEsNkJBQU8sQ0FBd0J2MUMsTUFBeEIsQ0FBaUMsQ0FFdkMsR0FBS0EsU0FBV3RILFNBQWhCLENBQTRCLENBRTNCMlcsUUFBUTZQLElBQVIsQ0FBYyx5REFBZCxFQUNBbGYsT0FBUyxXQUFBLEVBQVQsQ0FFQSxDQUVELEtBQUsyNkIsaUJBQUwsQ0FBd0IsSUFBeEIsRUFFQSxLQUFLakosV0FBTCxDQUFpQnhHLFNBQWpCLENBQTRCRixRQUE1QixDQUFzQ0MsVUFBdEMsQ0FBa0RqckIsTUFBbEQsRUFFQSxhQUFBLENBRUEsQ0FmRCxDQWlCQSxDQXRCYyxFQWhZZ0UsQ0F3Wi9FdzFDLGtCQUFtQixVQUFZLENBRTlCLGVBQWlCLGNBQUEsRUFBakIsQ0FFQSxpQ0FBTyxDQUE0QngxQyxNQUE1QixDQUFxQyxDQUUzQyxHQUFLQSxTQUFXdEgsU0FBaEIsQ0FBNEIsQ0FFM0IyVyxRQUFRNlAsSUFBUixDQUFjLDZEQUFkLEVBQ0FsZixPQUFTLFdBQUEsRUFBVCxDQUVBLENBRUQsS0FBS3MxQyxrQkFBTCxDQUF5QnJxQixVQUF6QixFQUVBLGNBQWN2Z0IsR0FBUCxDQUFZLENBQVosQ0FBZSxDQUFmLENBQWtCLENBQWxCLEVBQXNCbW1CLGVBQXRCLENBQXVDNUYsVUFBdkMsQ0FBUCxDQUVBLENBYkQsQ0FlQSxDQW5Ca0IsRUF4WjRELENBNmEvRXdxQixRQUFTLFVBQVksRUE3YTBELENBK2EvRTdhLFNBQVUsU0FBV3JLLFFBQVgsQ0FBc0IsQ0FFL0JBLFNBQVUsSUFBVixFQUVBLGFBQWUsS0FBS3VpQixRQUFwQixDQUVBLElBQU0sTUFBUSxDQUFSLENBQVdqMkMsRUFBSWkyQyxTQUFTLzRDLE1BQTlCLENBQXNDSyxFQUFJeUMsQ0FBMUMsQ0FBNkN6QyxHQUE3QyxDQUFvRCxDQUVuRDA0QyxTQUFVMTRDLENBQVYsRUFBY3dnQyxRQUFkLENBQXdCckssUUFBeEIsRUFFQSxDQUVELENBM2I4RSxDQTZiL0VtbEIsZ0JBQWlCLFNBQVdubEIsUUFBWCxDQUFzQixDQUV0QyxHQUFLLEtBQUsraUIsT0FBTCxHQUFpQixLQUF0QixDQUE4QixPQUU5Qi9pQixTQUFVLElBQVYsRUFFQSxhQUFlLEtBQUt1aUIsUUFBcEIsQ0FFQSxJQUFNLE1BQVEsQ0FBUixDQUFXajJDLEVBQUlpMkMsU0FBUy80QyxNQUE5QixDQUFzQ0ssRUFBSXlDLENBQTFDLENBQTZDekMsR0FBN0MsQ0FBb0QsQ0FFbkQwNEMsU0FBVTE0QyxDQUFWLEVBQWNzN0MsZUFBZCxDQUErQm5sQixRQUEvQixFQUVBLENBRUQsQ0EzYzhFLENBNmMvRW9sQixrQkFBbUIsU0FBV3BsQixRQUFYLENBQXNCLENBRXhDLFdBQWEsS0FBS25sQixNQUFsQixDQUVBLEdBQUtBLFNBQVcsSUFBaEIsQ0FBdUIsQ0FFdEJtbEIsU0FBVW5sQixNQUFWLEVBRUFBLE9BQU91cUMsaUJBQVAsQ0FBMEJwbEIsUUFBMUIsRUFFQSxDQUVELENBemQ4RSxDQTJkL0VzRixhQUFjLFVBQVksQ0FFekIsS0FBS3hLLE1BQUwsQ0FBWU4sT0FBWixDQUFxQixLQUFLQyxRQUExQixDQUFvQyxLQUFLQyxVQUF6QyxDQUFxRCxLQUFLbEIsS0FBMUQsRUFFQSxLQUFLc3BCLHNCQUFMLENBQThCLElBQTlCLENBRUEsQ0FqZThFLENBbWUvRTFZLGtCQUFtQixTQUFXaWIsS0FBWCxDQUFtQixDQUVyQyxHQUFLLEtBQUt4Z0IsZ0JBQVYsQ0FBNkIsS0FBS1MsWUFBTCxHQUU3QixHQUFLLEtBQUt3ZCxzQkFBTCxFQUErQnVDLEtBQXBDLENBQTRDLENBRTNDLEdBQUssS0FBS3hxQyxNQUFMLEdBQWdCLElBQXJCLENBQTRCLENBRTNCLEtBQUtzbUIsV0FBTCxDQUFpQjFTLElBQWpCLENBQXVCLEtBQUtxTSxNQUE1QixFQUVBLENBSkQsSUFJTyxDQUVOLEtBQUtxRyxXQUFMLENBQWlCL0ssZ0JBQWpCLENBQW1DLEtBQUt2YixNQUFMLENBQVlzbUIsV0FBL0MsQ0FBNEQsS0FBS3JHLE1BQWpFLEVBRUEsQ0FFRCxLQUFLZ29CLHNCQUFMLENBQThCLEtBQTlCLENBRUF1QyxNQUFRLElBQVIsQ0FFQSxDQUVEO0VBRUEsYUFBZSxLQUFLOUMsUUFBcEIsQ0FFQSxJQUFNLE1BQVEsQ0FBUixDQUFXajJDLEVBQUlpMkMsU0FBUy80QyxNQUE5QixDQUFzQ0ssRUFBSXlDLENBQTFDLENBQTZDekMsR0FBN0MsQ0FBb0QsQ0FFbkQwNEMsU0FBVTE0QyxDQUFWLEVBQWN1Z0MsaUJBQWQsQ0FBaUNpYixLQUFqQyxFQUVBLENBRUQsQ0FuZ0I4RSxDQXFnQi9FOWYsT0FBUSxTQUFXampCLElBQVgsQ0FBa0I7RUFHekIsaUJBQXFCQSxPQUFTbmEsU0FBVCxFQUFzQixXQUFBLEdBQWdCLFFBQTNELENBRUEsV0FBYSxFQUFiLENBRUE7RUFDQTtFQUNBO0VBQ0EsR0FBS3E5QixZQUFMLENBQW9CO0VBR25CbGpCLEtBQU8sQ0FDTmdqQyxXQUFZLEVBRE4sQ0FFTkMsVUFBVyxFQUZMLENBR045ZixTQUFVLEVBSEosQ0FJTlUsT0FBUSxFQUpGLENBS05xZixPQUFRLEVBTEYsQ0FBUCxDQVFBNTZCLE9BQU9zYixRQUFQLENBQWtCLENBQ2pCdjVCLFFBQVMsR0FEUSxDQUVqQm5JLEtBQU0sUUFGVyxDQUdqQlAsVUFBVyxpQkFITSxDQUFsQixDQU1BLENBRUQ7RUFFQSxXQUFhLEVBQWIsQ0FFQW9GLE9BQU82NkIsSUFBUCxDQUFjLEtBQUtBLElBQW5CLENBQ0E3NkIsT0FBTzdFLElBQVAsQ0FBYyxLQUFLQSxJQUFuQixDQUVBLEdBQUssS0FBS3FCLElBQUwsR0FBYyxFQUFuQixDQUF3QndELE9BQU94RCxJQUFQLENBQWMsS0FBS0EsSUFBbkIsQ0FDeEIsR0FBSyxLQUFLbTlDLFVBQUwsR0FBb0IsSUFBekIsQ0FBZ0MzNUMsT0FBTzI1QyxVQUFQLENBQW9CLElBQXBCLENBQ2hDLEdBQUssS0FBS0MsYUFBTCxHQUF1QixJQUE1QixDQUFtQzU1QyxPQUFPNDVDLGFBQVAsQ0FBdUIsSUFBdkIsQ0FDbkMsR0FBSyxLQUFLRixPQUFMLEdBQWlCLEtBQXRCLENBQThCMTVDLE9BQU8wNUMsT0FBUCxDQUFpQixLQUFqQixDQUM5QixHQUFLLEtBQUtHLGFBQUwsR0FBdUIsS0FBNUIsQ0FBb0M3NUMsT0FBTzY1QyxhQUFQLENBQXVCLEtBQXZCLENBQ3BDLEdBQUssS0FBS0MsV0FBTCxHQUFxQixDQUExQixDQUE4Qjk1QyxPQUFPODVDLFdBQVAsQ0FBcUIsS0FBS0EsV0FBMUIsQ0FDOUIsR0FBS3QvQixLQUFLRSxTQUFMLENBQWdCLEtBQUtxL0IsUUFBckIsSUFBb0MsSUFBekMsQ0FBZ0QvNUMsT0FBTys1QyxRQUFQLENBQWtCLEtBQUtBLFFBQXZCLENBRWhELzVDLE9BQU95eEIsTUFBUCxDQUFnQixLQUFLQSxNQUFMLENBQVkxSixPQUFaLEVBQWhCLENBRUEsR0FBSyxLQUFLeVQsZ0JBQUwsR0FBMEIsS0FBL0IsQ0FBdUN4N0IsT0FBT3c3QixnQkFBUCxDQUEwQixLQUExQixDQUV2QztFQUVBLGtCQUFBLENBQW9CNGdCLE9BQXBCLENBQTZCQyxPQUE3QixDQUF1QyxDQUV0QyxHQUFLRCxRQUFTQyxRQUFReGhCLElBQWpCLElBQTRCLzdCLFNBQWpDLENBQTZDLENBRTVDczlDLFFBQVNDLFFBQVF4aEIsSUFBakIsRUFBMEJ3aEIsUUFBUW5nQixNQUFSLENBQWdCampCLElBQWhCLENBQTFCLENBRUEsQ0FFRCxlQUFlNGhCLElBQWYsQ0FFQSxDQUVELEdBQUssS0FBSzRGLFFBQUwsR0FBa0IzaEMsU0FBdkIsQ0FBbUMsQ0FFbENrQixPQUFPeWdDLFFBQVAsQ0FBa0I2YixVQUFXcmpDLEtBQUtnakMsVUFBaEIsQ0FBNEIsS0FBS3hiLFFBQWpDLENBQWxCLENBRUEsZUFBaUIsS0FBS0EsUUFBTCxDQUFjOGIsVUFBL0IsQ0FFQSxHQUFLQSxhQUFlejlDLFNBQWYsRUFBNEJ5OUMsV0FBV0osTUFBWCxHQUFzQnI5QyxTQUF2RCxDQUFtRSxDQUVsRSxXQUFheTlDLFdBQVdKLE1BQXhCLENBRUEsR0FBSzd1QyxNQUFNeU0sT0FBTixDQUFlb2lDLE1BQWYsQ0FBTCxDQUErQixDQUU5QixJQUFNLE1BQVEsQ0FBUixDQUFXbDVDLEVBQUlrNUMsT0FBT2g4QyxNQUE1QixDQUFvQ0ssRUFBSXlDLENBQXhDLENBQTJDekMsR0FBM0MsQ0FBa0QsQ0FFakQsVUFBWTI3QyxPQUFRMzdDLENBQVIsQ0FBWixDQUVBODdDLFVBQVdyakMsS0FBS2tqQyxNQUFoQixDQUF3QkssS0FBeEIsRUFFQSxDQUVELENBVkQsSUFVTyxDQUVORixVQUFXcmpDLEtBQUtrakMsTUFBaEIsQ0FBd0JBLE1BQXhCLEVBRUEsQ0FFRCxDQUVELENBRUQsR0FBSyxLQUFLTSxRQUFMLEdBQWtCMzlDLFNBQXZCLENBQW1DLENBRWxDLEdBQUt3TyxNQUFNeU0sT0FBTixDQUFlLEtBQUswaUMsUUFBcEIsQ0FBTCxDQUFzQyxDQUVyQyxVQUFZLEVBQVosQ0FFQSxJQUFNLE1BQVEsQ0FBUixDQUFXeDVDLEVBQUksS0FBS3c1QyxRQUFMLENBQWN0OEMsTUFBbkMsQ0FBMkNLLEVBQUl5QyxDQUEvQyxDQUFrRHpDLEdBQWxELENBQXlELENBRXhEazhDLE1BQU0vOEMsSUFBTixDQUFZMjhDLFVBQVdyakMsS0FBS2lqQyxTQUFoQixDQUEyQixLQUFLTyxRQUFMLENBQWVqOEMsQ0FBZixDQUEzQixDQUFaLEVBRUEsQ0FFRFIsT0FBT3k4QyxRQUFQLENBQWtCQyxLQUFsQixDQUVBLENBWkQsSUFZTyxDQUVOMThDLE9BQU95OEMsUUFBUCxDQUFrQkgsVUFBV3JqQyxLQUFLaWpDLFNBQWhCLENBQTJCLEtBQUtPLFFBQWhDLENBQWxCLENBRUEsQ0FFRCxDQUVEO0VBRUEsR0FBSyxLQUFLdkQsUUFBTCxDQUFjLzRDLE1BQWQsQ0FBdUIsQ0FBNUIsQ0FBZ0MsQ0FFL0JILE9BQU9rNUMsUUFBUCxDQUFrQixFQUFsQixDQUVBLElBQU0sTUFBUSxDQUFkLENBQWlCMTRDLEVBQUksS0FBSzA0QyxRQUFMLENBQWMvNEMsTUFBbkMsQ0FBMkNLLEdBQTNDLENBQWtELENBRWpEUixPQUFPazVDLFFBQVAsQ0FBZ0J2NUMsSUFBaEIsQ0FBc0IsS0FBS3U1QyxRQUFMLENBQWUxNEMsQ0FBZixFQUFtQjA3QixNQUFuQixDQUEyQmpqQixJQUEzQixFQUFrQ2paLE1BQXhELEVBRUEsQ0FFRCxDQUVELEdBQUttOEIsWUFBTCxDQUFvQixDQUVuQixlQUFpQndnQixpQkFBa0IxakMsS0FBS2dqQyxVQUF2QixDQUFqQixDQUNBLGNBQWdCVSxpQkFBa0IxakMsS0FBS2lqQyxTQUF2QixDQUFoQixDQUNBLGFBQWVTLGlCQUFrQjFqQyxLQUFLbWpCLFFBQXZCLENBQWYsQ0FDQSxXQUFhdWdCLGlCQUFrQjFqQyxLQUFLNmpCLE1BQXZCLENBQWIsQ0FDQSxXQUFhNmYsaUJBQWtCMWpDLEtBQUtrakMsTUFBdkIsQ0FBYixDQUVBLEdBQUtGLFdBQVc5N0MsTUFBWCxDQUFvQixDQUF6QixDQUE2Qm9oQixPQUFPMDZCLFVBQVAsQ0FBb0JBLFVBQXBCLENBQzdCLEdBQUtDLFVBQVUvN0MsTUFBVixDQUFtQixDQUF4QixDQUE0Qm9oQixPQUFPMjZCLFNBQVAsQ0FBbUJBLFNBQW5CLENBQzVCLEdBQUs5ZixTQUFTajhCLE1BQVQsQ0FBa0IsQ0FBdkIsQ0FBMkJvaEIsT0FBTzZhLFFBQVAsQ0FBa0JBLFFBQWxCLENBQzNCLEdBQUtVLE9BQU8zOEIsTUFBUCxDQUFnQixDQUFyQixDQUF5Qm9oQixPQUFPdWIsTUFBUCxDQUFnQkEsTUFBaEIsQ0FDekIsR0FBS3FmLE9BQU9oOEMsTUFBUCxDQUFnQixDQUFyQixDQUF5Qm9oQixPQUFPNDZCLE1BQVAsQ0FBZ0JBLE1BQWhCLENBRXpCLENBRUQ1NkIsT0FBT3ZoQixNQUFQLENBQWdCQSxNQUFoQixDQUVBLGFBQUEsQ0FFQTtFQUNBO0VBQ0E7RUFDQSx5QkFBQSxDQUEyQjQ4QyxLQUEzQixDQUFtQyxDQUVsQyxXQUFhLEVBQWIsQ0FDQSxJQUFNLE9BQU4sU0FBQSxDQUF5QixDQUV4QixTQUFXQSxNQUFPMzhDLEdBQVAsQ0FBWCxDQUNBLFlBQVk0OEIsUUFBWixDQUNBbmhDLE9BQU9pRSxJQUFQLENBQWFrUSxJQUFiLEVBRUEsQ0FDRCxhQUFBLENBRUEsQ0FFRCxDQTFxQjhFLENBNHFCL0VzVixNQUFPLFNBQVcwM0IsU0FBWCxDQUF1QixDQUU3QixnQkFBZ0I3Z0QsV0FBVCxHQUF1Qm9wQixJQUF2QixDQUE2QixJQUE3QixDQUFtQ3kzQixTQUFuQyxDQUFQLENBRUEsQ0FockI4RSxDQWtyQi9FejNCLEtBQU0sU0FBVzVmLE1BQVgsQ0FBbUJxM0MsU0FBbkIsQ0FBK0IsQ0FFcEMsR0FBS0EsWUFBYy85QyxTQUFuQixDQUErQis5QyxVQUFZLElBQVosQ0FFL0IsS0FBS3JnRCxJQUFMLENBQVlnSixPQUFPaEosSUFBbkIsQ0FFQSxLQUFLcXdCLEVBQUwsQ0FBUXpILElBQVIsQ0FBYzVmLE9BQU9xbkIsRUFBckIsRUFFQSxLQUFLdUUsUUFBTCxDQUFjaE0sSUFBZCxDQUFvQjVmLE9BQU80ckIsUUFBM0IsRUFDQSxLQUFLQyxVQUFMLENBQWdCak0sSUFBaEIsQ0FBc0I1ZixPQUFPNnJCLFVBQTdCLEVBQ0EsS0FBS2xCLEtBQUwsQ0FBVy9LLElBQVgsQ0FBaUI1ZixPQUFPMnFCLEtBQXhCLEVBRUEsS0FBS3NCLE1BQUwsQ0FBWXJNLElBQVosQ0FBa0I1ZixPQUFPaXNCLE1BQXpCLEVBQ0EsS0FBS3FHLFdBQUwsQ0FBaUIxUyxJQUFqQixDQUF1QjVmLE9BQU9zeUIsV0FBOUIsRUFFQSxLQUFLMEQsZ0JBQUwsQ0FBd0JoMkIsT0FBT2cyQixnQkFBL0IsQ0FDQSxLQUFLaWUsc0JBQUwsQ0FBOEJqMEMsT0FBT2kwQyxzQkFBckMsQ0FFQSxLQUFLVCxNQUFMLENBQVlKLElBQVosQ0FBbUJwekMsT0FBT3d6QyxNQUFQLENBQWNKLElBQWpDLENBQ0EsS0FBS2MsT0FBTCxDQUFlbDBDLE9BQU9rMEMsT0FBdEIsQ0FFQSxLQUFLQyxVQUFMLENBQWtCbjBDLE9BQU9tMEMsVUFBekIsQ0FDQSxLQUFLQyxhQUFMLENBQXFCcDBDLE9BQU9vMEMsYUFBNUIsQ0FFQSxLQUFLQyxhQUFMLENBQXFCcjBDLE9BQU9xMEMsYUFBNUIsQ0FDQSxLQUFLQyxXQUFMLENBQW1CdDBDLE9BQU9zMEMsV0FBMUIsQ0FFQSxLQUFLQyxRQUFMLENBQWdCdi9CLEtBQUtzaUMsS0FBTCxDQUFZdGlDLEtBQUtFLFNBQUwsQ0FBZ0JsVixPQUFPdTBDLFFBQXZCLENBQVosQ0FBaEIsQ0FFQSxHQUFLOEMsWUFBYyxJQUFuQixDQUEwQixDQUV6QixJQUFNLE1BQVEsQ0FBZCxDQUFpQnI4QyxFQUFJZ0YsT0FBTzB6QyxRQUFQLENBQWdCLzRDLE1BQXJDLENBQTZDSyxHQUE3QyxDQUFvRCxDQUVuRCxVQUFZZ0YsT0FBTzB6QyxRQUFQLENBQWlCMTRDLENBQWpCLENBQVosQ0FDQSxLQUFLNmtCLEdBQUwsQ0FBVW0yQixNQUFNcjJCLEtBQU4sRUFBVixFQUVBLENBRUQsQ0FFRCxXQUFBLENBRUEsQ0E1dEI4RSxDQUEzRCxDQUFyQixDQWd1QkE7Ozs7SUFNQSxlQUFBLEVBQWtCLENBRWpCZzBCLFNBQVMvOUMsSUFBVCxDQUFlLElBQWYsRUFFQSxLQUFLRCxJQUFMLENBQVksUUFBWixDQUVBLEtBQUs0aEQsa0JBQUwsQ0FBMEIsV0FBQSxFQUExQixDQUNBLEtBQUtsbEIsZ0JBQUwsQ0FBd0IsV0FBQSxFQUF4QixDQUVBLENBRURtbEIsT0FBT3RqRCxTQUFQLENBQW1CRCxPQUFPNG5CLE1BQVAsQ0FBZTVuQixPQUFPaUIsTUFBUCxDQUFleStDLFNBQVN6L0MsU0FBeEIsQ0FBZixDQUFvRCxDQUV0RXNDLFlBQWFnaEQsTUFGeUQsQ0FJdEU1QixTQUFVLElBSjRELENBTXRFaDJCLEtBQU0sU0FBVzVmLE1BQVgsQ0FBbUJxM0MsU0FBbkIsQ0FBK0IsQ0FFcEMxRCxTQUFTei9DLFNBQVQsQ0FBbUIwckIsSUFBbkIsQ0FBd0JocUIsSUFBeEIsQ0FBOEIsSUFBOUIsQ0FBb0NvSyxNQUFwQyxDQUE0Q3EzQyxTQUE1QyxFQUVBLEtBQUtFLGtCQUFMLENBQXdCMzNCLElBQXhCLENBQThCNWYsT0FBT3UzQyxrQkFBckMsRUFDQSxLQUFLbGxCLGdCQUFMLENBQXNCelMsSUFBdEIsQ0FBNEI1ZixPQUFPcXlCLGdCQUFuQyxFQUVBLFdBQUEsQ0FFQSxDQWZxRSxDQWlCdEUrakIsa0JBQW1CLFVBQVksQ0FFOUIsZUFBaUIsY0FBQSxFQUFqQixDQUVBLGlDQUFPLENBQTRCeDFDLE1BQTVCLENBQXFDLENBRTNDLEdBQUtBLFNBQVd0SCxTQUFoQixDQUE0QixDQUUzQjJXLFFBQVE2UCxJQUFSLENBQWMsMkRBQWQsRUFDQWxmLE9BQVMsV0FBQSxFQUFULENBRUEsQ0FFRCxLQUFLczFDLGtCQUFMLENBQXlCcnFCLFVBQXpCLEVBRUEsY0FBY3ZnQixHQUFQLENBQVksQ0FBWixDQUFlLENBQWYsQ0FBa0IsQ0FBRSxDQUFwQixFQUF3Qm1tQixlQUF4QixDQUF5QzVGLFVBQXpDLENBQVAsQ0FFQSxDQWJELENBZUEsQ0FuQmtCLEVBakJtRCxDQXNDdEUwUCxrQkFBbUIsU0FBV2liLEtBQVgsQ0FBbUIsQ0FFckM3QyxTQUFTei9DLFNBQVQsQ0FBbUJxbkMsaUJBQW5CLENBQXFDM2xDLElBQXJDLENBQTJDLElBQTNDLENBQWlENGdELEtBQWpELEVBRUEsS0FBS2Usa0JBQUwsQ0FBd0JydEIsVUFBeEIsQ0FBb0MsS0FBS29JLFdBQXpDLEVBRUEsQ0E1Q3FFLENBOEN0RTNTLE1BQU8sVUFBWSxDQUVsQixnQkFBZ0JucEIsV0FBVCxHQUF1Qm9wQixJQUF2QixDQUE2QixJQUE3QixDQUFQLENBRUEsQ0FsRHFFLENBQXBELENBQW5CLENBc0RBOzs7S0FLQSwyQkFBQSxDQUE2QjZNLElBQTdCLENBQW1DQyxLQUFuQyxDQUEwQ0MsR0FBMUMsQ0FBK0NDLE1BQS9DLENBQXVEQyxJQUF2RCxDQUE2REMsR0FBN0QsQ0FBbUUsQ0FFbEUwcUIsT0FBTzVoRCxJQUFQLENBQWEsSUFBYixFQUVBLEtBQUtELElBQUwsQ0FBWSxvQkFBWixDQUVBLEtBQUs4aEQsSUFBTCxDQUFZLENBQVosQ0FDQSxLQUFLQyxJQUFMLENBQVksSUFBWixDQUVBLEtBQUtqckIsSUFBTCxDQUFZQSxJQUFaLENBQ0EsS0FBS0MsS0FBTCxDQUFhQSxLQUFiLENBQ0EsS0FBS0MsR0FBTCxDQUFXQSxHQUFYLENBQ0EsS0FBS0MsTUFBTCxDQUFjQSxNQUFkLENBRUEsS0FBS0MsSUFBTCxDQUFjQSxPQUFTdnpCLFNBQVgsQ0FBeUJ1ekIsSUFBekIsQ0FBZ0MsR0FBNUMsQ0FDQSxLQUFLQyxHQUFMLENBQWFBLE1BQVF4ekIsU0FBVixDQUF3Qnd6QixHQUF4QixDQUE4QixJQUF6QyxDQUVBLEtBQUs2cUIsc0JBQUwsR0FFQSxDQUVEQyxtQkFBbUIxakQsU0FBbkIsQ0FBK0JELE9BQU80bkIsTUFBUCxDQUFlNW5CLE9BQU9pQixNQUFQLENBQWVzaUQsT0FBT3RqRCxTQUF0QixDQUFmLENBQWtELENBRWhGc0MsWUFBYW9oRCxrQkFGbUUsQ0FJaEZDLHFCQUFzQixJQUowRCxDQU1oRmo0QixLQUFNLFNBQVc1ZixNQUFYLENBQW1CcTNDLFNBQW5CLENBQStCLENBRXBDRyxPQUFPdGpELFNBQVAsQ0FBaUIwckIsSUFBakIsQ0FBc0JocUIsSUFBdEIsQ0FBNEIsSUFBNUIsQ0FBa0NvSyxNQUFsQyxDQUEwQ3EzQyxTQUExQyxFQUVBLEtBQUs1cUIsSUFBTCxDQUFZenNCLE9BQU95c0IsSUFBbkIsQ0FDQSxLQUFLQyxLQUFMLENBQWExc0IsT0FBTzBzQixLQUFwQixDQUNBLEtBQUtDLEdBQUwsQ0FBVzNzQixPQUFPMnNCLEdBQWxCLENBQ0EsS0FBS0MsTUFBTCxDQUFjNXNCLE9BQU80c0IsTUFBckIsQ0FDQSxLQUFLQyxJQUFMLENBQVk3c0IsT0FBTzZzQixJQUFuQixDQUNBLEtBQUtDLEdBQUwsQ0FBVzlzQixPQUFPOHNCLEdBQWxCLENBRUEsS0FBSzJxQixJQUFMLENBQVl6M0MsT0FBT3kzQyxJQUFuQixDQUNBLEtBQUtDLElBQUwsQ0FBWTEzQyxPQUFPMDNDLElBQVAsR0FBZ0IsSUFBaEIsQ0FBdUIsSUFBdkIsQ0FBOEJ6akQsT0FBTzRuQixNQUFQLENBQWUsRUFBZixDQUFtQjdiLE9BQU8wM0MsSUFBMUIsQ0FBMUMsQ0FFQSxXQUFBLENBRUEsQ0F0QitFLENBd0JoRkksY0FBZSxTQUFXQyxTQUFYLENBQXNCQyxVQUF0QixDQUFrQ3pxQyxDQUFsQyxDQUFxQ3dRLENBQXJDLENBQXdDZ1osS0FBeEMsQ0FBK0NDLE1BQS9DLENBQXdELENBRXRFLEdBQUssS0FBSzBnQixJQUFMLEdBQWMsSUFBbkIsQ0FBMEIsQ0FFekIsS0FBS0EsSUFBTCxDQUFZLENBQ1hPLFFBQVMsSUFERSxDQUVYRixVQUFXLENBRkEsQ0FHWEMsV0FBWSxDQUhELENBSVhFLFFBQVMsQ0FKRSxDQUtYQyxRQUFTLENBTEUsQ0FNWHBoQixNQUFPLENBTkksQ0FPWEMsT0FBUSxDQVBHLENBQVosQ0FVQSxDQUVELEtBQUswZ0IsSUFBTCxDQUFVTyxPQUFWLENBQW9CLElBQXBCLENBQ0EsS0FBS1AsSUFBTCxDQUFVSyxTQUFWLENBQXNCQSxTQUF0QixDQUNBLEtBQUtMLElBQUwsQ0FBVU0sVUFBVixDQUF1QkEsVUFBdkIsQ0FDQSxLQUFLTixJQUFMLENBQVVRLE9BQVYsQ0FBb0IzcUMsQ0FBcEIsQ0FDQSxLQUFLbXFDLElBQUwsQ0FBVVMsT0FBVixDQUFvQnA2QixDQUFwQixDQUNBLEtBQUsyNUIsSUFBTCxDQUFVM2dCLEtBQVYsQ0FBa0JBLEtBQWxCLENBQ0EsS0FBSzJnQixJQUFMLENBQVUxZ0IsTUFBVixDQUFtQkEsTUFBbkIsQ0FFQSxLQUFLMmdCLHNCQUFMLEdBRUEsQ0FsRCtFLENBb0RoRlMsZ0JBQWlCLFVBQVksQ0FFNUIsR0FBSyxLQUFLVixJQUFMLEdBQWMsSUFBbkIsQ0FBMEIsQ0FFekIsS0FBS0EsSUFBTCxDQUFVTyxPQUFWLENBQW9CLEtBQXBCLENBRUEsQ0FFRCxLQUFLTixzQkFBTCxHQUVBLENBOUQrRSxDQWdFaEZBLHVCQUF3QixVQUFZLENBRW5DLE9BQVMsQ0FBRSxLQUFLanJCLEtBQUwsQ0FBYSxLQUFLRCxJQUFwQixHQUErQixFQUFJLEtBQUtnckIsSUFBeEMsQ0FBVCxDQUNBLE9BQVMsQ0FBRSxLQUFLOXFCLEdBQUwsQ0FBVyxLQUFLQyxNQUFsQixHQUErQixFQUFJLEtBQUs2cUIsSUFBeEMsQ0FBVCxDQUNBLE9BQVMsQ0FBRSxLQUFLL3FCLEtBQUwsQ0FBYSxLQUFLRCxJQUFwQixFQUE2QixDQUF0QyxDQUNBLE9BQVMsQ0FBRSxLQUFLRSxHQUFMLENBQVcsS0FBS0MsTUFBbEIsRUFBNkIsQ0FBdEMsQ0FFQSxTQUFXMkgsR0FBSzFTLEVBQWhCLENBQ0EsVUFBWTBTLEdBQUsxUyxFQUFqQixDQUNBLFFBQVUyUyxHQUFLNVMsRUFBZixDQUNBLFdBQWE0UyxHQUFLNVMsRUFBbEIsQ0FFQSxHQUFLLEtBQUs4MUIsSUFBTCxHQUFjLElBQWQsRUFBc0IsS0FBS0EsSUFBTCxDQUFVTyxPQUFyQyxDQUErQyxDQUU5QyxVQUFZLEtBQUtSLElBQUwsRUFBYyxLQUFLQyxJQUFMLENBQVUzZ0IsS0FBVixDQUFrQixLQUFLMmdCLElBQUwsQ0FBVUssU0FBMUMsQ0FBWixDQUNBLFVBQVksS0FBS04sSUFBTCxFQUFjLEtBQUtDLElBQUwsQ0FBVTFnQixNQUFWLENBQW1CLEtBQUswZ0IsSUFBTCxDQUFVTSxVQUEzQyxDQUFaLENBQ0EsV0FBYSxDQUFFLEtBQUt0ckIsS0FBTCxDQUFhLEtBQUtELElBQXBCLEVBQTZCLEtBQUtpckIsSUFBTCxDQUFVM2dCLEtBQXBELENBQ0EsV0FBYSxDQUFFLEtBQUtwSyxHQUFMLENBQVcsS0FBS0MsTUFBbEIsRUFBNkIsS0FBSzhxQixJQUFMLENBQVUxZ0IsTUFBcEQsQ0FFQXZLLE1BQVE0ckIsUUFBVyxLQUFLWCxJQUFMLENBQVVRLE9BQVYsQ0FBb0JJLEtBQS9CLENBQVIsQ0FDQTVyQixNQUFRRCxLQUFPNHJCLFFBQVcsS0FBS1gsSUFBTCxDQUFVM2dCLEtBQVYsQ0FBa0J1aEIsS0FBN0IsQ0FBZixDQUNBM3JCLEtBQU80ckIsUUFBVyxLQUFLYixJQUFMLENBQVVTLE9BQVYsQ0FBb0JLLEtBQS9CLENBQVAsQ0FDQTVyQixPQUFTRCxJQUFNNHJCLFFBQVcsS0FBS2IsSUFBTCxDQUFVMWdCLE1BQVYsQ0FBbUJ3aEIsS0FBOUIsQ0FBZixDQUVBLENBRUQsS0FBS25tQixnQkFBTCxDQUFzQnRGLGdCQUF0QixDQUF3Q04sSUFBeEMsQ0FBOENDLEtBQTlDLENBQXFEQyxHQUFyRCxDQUEwREMsTUFBMUQsQ0FBa0UsS0FBS0MsSUFBdkUsQ0FBNkUsS0FBS0MsR0FBbEYsRUFFQSxDQTVGK0UsQ0E4RmhGNEosT0FBUSxTQUFXampCLElBQVgsQ0FBa0IsQ0FFekIsU0FBV2tnQyxTQUFTei9DLFNBQVQsQ0FBbUJ3aUMsTUFBbkIsQ0FBMEI5Z0MsSUFBMUIsQ0FBZ0MsSUFBaEMsQ0FBc0M2ZCxJQUF0QyxDQUFYLENBRUFwSixLQUFLN1AsTUFBTCxDQUFZaTlDLElBQVosQ0FBbUIsS0FBS0EsSUFBeEIsQ0FDQXB0QyxLQUFLN1AsTUFBTCxDQUFZaXlCLElBQVosQ0FBbUIsS0FBS0EsSUFBeEIsQ0FDQXBpQixLQUFLN1AsTUFBTCxDQUFZa3lCLEtBQVosQ0FBb0IsS0FBS0EsS0FBekIsQ0FDQXJpQixLQUFLN1AsTUFBTCxDQUFZbXlCLEdBQVosQ0FBa0IsS0FBS0EsR0FBdkIsQ0FDQXRpQixLQUFLN1AsTUFBTCxDQUFZb3lCLE1BQVosQ0FBcUIsS0FBS0EsTUFBMUIsQ0FDQXZpQixLQUFLN1AsTUFBTCxDQUFZcXlCLElBQVosQ0FBbUIsS0FBS0EsSUFBeEIsQ0FDQXhpQixLQUFLN1AsTUFBTCxDQUFZc3lCLEdBQVosQ0FBa0IsS0FBS0EsR0FBdkIsQ0FFQSxHQUFLLEtBQUs0cUIsSUFBTCxHQUFjLElBQW5CLENBQTBCcnRDLEtBQUs3UCxNQUFMLENBQVlrOUMsSUFBWixDQUFtQnpqRCxPQUFPNG5CLE1BQVAsQ0FBZSxFQUFmLENBQW1CLEtBQUs2N0IsSUFBeEIsQ0FBbkIsQ0FFMUIsV0FBQSxDQUVBLENBOUcrRSxDQUFsRCxDQUEvQixDQWtIQTs7O0tBS0EsY0FBQSxDQUFnQmg2QyxDQUFoQixDQUFtQkYsQ0FBbkIsQ0FBc0JXLENBQXRCLENBQXlCaTFCLE1BQXpCLENBQWlDOFYsS0FBakMsQ0FBd0N1UCxhQUF4QyxDQUF3RCxDQUV2RCxLQUFLLzZDLENBQUwsQ0FBU0EsQ0FBVCxDQUNBLEtBQUtGLENBQUwsQ0FBU0EsQ0FBVCxDQUNBLEtBQUtXLENBQUwsQ0FBU0EsQ0FBVCxDQUVBLEtBQUtpMUIsTUFBTCxDQUFnQkEsUUFBVUEsT0FBTy9CLFNBQW5CLENBQWlDK0IsTUFBakMsQ0FBMEMsV0FBQSxFQUF4RCxDQUNBLEtBQUtzbEIsYUFBTCxDQUFxQjV3QyxNQUFNeU0sT0FBTixDQUFlNmUsTUFBZixFQUEwQkEsTUFBMUIsQ0FBbUMsRUFBeEQsQ0FFQSxLQUFLOFYsS0FBTCxDQUFlQSxPQUFTQSxNQUFNVixPQUFqQixDQUE2QlUsS0FBN0IsQ0FBcUMsU0FBQSxFQUFsRCxDQUNBLEtBQUt5UCxZQUFMLENBQW9CN3dDLE1BQU15TSxPQUFOLENBQWUyMEIsS0FBZixFQUF5QkEsS0FBekIsQ0FBaUMsRUFBckQsQ0FFQSxLQUFLdVAsYUFBTCxDQUFxQkEsZ0JBQWtCbi9DLFNBQWxCLENBQThCbS9DLGFBQTlCLENBQThDLENBQW5FLENBRUEsQ0FFRHhrRCxPQUFPNG5CLE1BQVAsQ0FBZSs4QixNQUFNMWtELFNBQXJCLENBQWdDLENBRS9CeXJCLE1BQU8sVUFBWSxDQUVsQixnQkFBZ0JucEIsV0FBVCxHQUF1Qm9wQixJQUF2QixDQUE2QixJQUE3QixDQUFQLENBRUEsQ0FOOEIsQ0FRL0JBLEtBQU0sU0FBVzVmLE1BQVgsQ0FBb0IsQ0FFekIsS0FBS3RDLENBQUwsQ0FBU3NDLE9BQU90QyxDQUFoQixDQUNBLEtBQUtGLENBQUwsQ0FBU3dDLE9BQU94QyxDQUFoQixDQUNBLEtBQUtXLENBQUwsQ0FBUzZCLE9BQU83QixDQUFoQixDQUVBLEtBQUtpMUIsTUFBTCxDQUFZeFQsSUFBWixDQUFrQjVmLE9BQU9vekIsTUFBekIsRUFDQSxLQUFLOFYsS0FBTCxDQUFXdHBCLElBQVgsQ0FBaUI1ZixPQUFPa3BDLEtBQXhCLEVBRUEsS0FBS3VQLGFBQUwsQ0FBcUJ6NEMsT0FBT3k0QyxhQUE1QixDQUVBLElBQU0sTUFBUSxDQUFSLENBQVdyZSxHQUFLcDZCLE9BQU8wNEMsYUFBUCxDQUFxQi85QyxNQUEzQyxDQUFtREssRUFBSW8vQixFQUF2RCxDQUEyRHAvQixHQUEzRCxDQUFrRSxDQUVqRSxLQUFLMDlDLGFBQUwsQ0FBb0IxOUMsQ0FBcEIsRUFBMEJnRixPQUFPMDRDLGFBQVAsQ0FBc0IxOUMsQ0FBdEIsRUFBMEIya0IsS0FBMUIsRUFBMUIsQ0FFQSxDQUVELElBQU0sTUFBUSxDQUFSLENBQVd5YSxHQUFLcDZCLE9BQU8yNEMsWUFBUCxDQUFvQmgrQyxNQUExQyxDQUFrREssRUFBSW8vQixFQUF0RCxDQUEwRHAvQixHQUExRCxDQUFpRSxDQUVoRSxLQUFLMjlDLFlBQUwsQ0FBbUIzOUMsQ0FBbkIsRUFBeUJnRixPQUFPMjRDLFlBQVAsQ0FBcUIzOUMsQ0FBckIsRUFBeUIya0IsS0FBekIsRUFBekIsQ0FFQSxDQUVELFdBQUEsQ0FFQSxDQWpDOEIsQ0FBaEMsRUFxQ0E7Ozs7Ozs7S0FTQSxlQUFpQixDQUFqQixDQUFvQjtFQUVwQixpQkFBQSxFQUFvQixDQUVuQjFyQixPQUFPd0ssY0FBUCxDQUF1QixJQUF2QixDQUE2QixJQUE3QixDQUFtQyxDQUFFOUcsTUFBT2toRCxZQUFjLENBQXZCLENBQW5DLEVBRUEsS0FBS3hqQixJQUFMLENBQVkxVyxNQUFNN0IsWUFBTixFQUFaLENBRUEsS0FBSzlsQixJQUFMLENBQVksRUFBWixDQUNBLEtBQUtyQixJQUFMLENBQVksVUFBWixDQUVBLEtBQUt3bEMsUUFBTCxDQUFnQixFQUFoQixDQUNBLEtBQUsyZCxNQUFMLENBQWMsRUFBZCxDQUNBLEtBQUtDLEtBQUwsQ0FBYSxFQUFiLENBQ0EsS0FBS0MsYUFBTCxDQUFxQixDQUFDLEVBQUQsQ0FBckIsQ0FFQSxLQUFLQyxZQUFMLENBQW9CLEVBQXBCLENBQ0EsS0FBS0MsWUFBTCxDQUFvQixFQUFwQixDQUVBLEtBQUtDLFdBQUwsQ0FBbUIsRUFBbkIsQ0FDQSxLQUFLQyxXQUFMLENBQW1CLEVBQW5CLENBRUEsS0FBS0MsYUFBTCxDQUFxQixFQUFyQixDQUVBLEtBQUtDLFdBQUwsQ0FBbUIsSUFBbkIsQ0FDQSxLQUFLNVksY0FBTCxDQUFzQixJQUF0QixDQUVBO0VBRUEsS0FBSzZZLGtCQUFMLENBQTBCLEtBQTFCLENBQ0EsS0FBS0Msa0JBQUwsQ0FBMEIsS0FBMUIsQ0FDQSxLQUFLQyxhQUFMLENBQXFCLEtBQXJCLENBQ0EsS0FBS0MsaUJBQUwsQ0FBeUIsS0FBekIsQ0FDQSxLQUFLQyxnQkFBTCxDQUF3QixLQUF4QixDQUNBLEtBQUtDLHVCQUFMLENBQStCLEtBQS9CLENBQ0EsS0FBS0MsZ0JBQUwsQ0FBd0IsS0FBeEIsQ0FFQSxDQUVEQyxTQUFTNWxELFNBQVQsQ0FBcUJELE9BQU80bkIsTUFBUCxDQUFlNW5CLE9BQU9pQixNQUFQLENBQWU4bUIsZ0JBQWdCOW5CLFNBQS9CLENBQWYsQ0FBMkQsQ0FFL0VzQyxZQUFhc2pELFFBRmtFLENBSS9FNWUsV0FBWSxJQUptRSxDQU0vRXlaLFlBQWEsU0FBVzFvQixNQUFYLENBQW9CLENBRWhDLGlCQUFtQixXQUFBLEdBQWNpSSxlQUFkLENBQStCakksTUFBL0IsQ0FBbkIsQ0FFQSxJQUFNLE1BQVEsQ0FBUixDQUFXbU8sR0FBSyxLQUFLZSxRQUFMLENBQWN4Z0MsTUFBcEMsQ0FBNENLLEVBQUlvL0IsRUFBaEQsQ0FBb0RwL0IsR0FBcEQsQ0FBMkQsQ0FFMUQsV0FBYSxLQUFLbWdDLFFBQUwsQ0FBZW5nQyxDQUFmLENBQWIsQ0FDQSsrQyxPQUFPbndCLFlBQVAsQ0FBcUJxQyxNQUFyQixFQUVBLENBRUQsSUFBTSxNQUFRLENBQVIsQ0FBV21PLEdBQUssS0FBSzJlLEtBQUwsQ0FBV3ArQyxNQUFqQyxDQUF5Q0ssRUFBSW8vQixFQUE3QyxDQUFpRHAvQixHQUFqRCxDQUF3RCxDQUV2RCxTQUFXLEtBQUsrOUMsS0FBTCxDQUFZLzlDLENBQVosQ0FBWCxDQUNBZy9DLEtBQUs1bUIsTUFBTCxDQUFZM1MsWUFBWixDQUEwQnVlLFlBQTFCLEVBQXlDemQsU0FBekMsR0FFQSxJQUFNLE1BQVEsQ0FBUixDQUFXMDRCLEdBQUtELEtBQUt0QixhQUFMLENBQW1CLzlDLE1BQXpDLENBQWlEaWMsRUFBSXFqQyxFQUFyRCxDQUF5RHJqQyxHQUF6RCxDQUFnRSxDQUUvRG9qQyxLQUFLdEIsYUFBTCxDQUFvQjloQyxDQUFwQixFQUF3QjZKLFlBQXhCLENBQXNDdWUsWUFBdEMsRUFBcUR6ZCxTQUFyRCxHQUVBLENBRUQsQ0FFRCxHQUFLLEtBQUsrM0IsV0FBTCxHQUFxQixJQUExQixDQUFpQyxDQUVoQyxLQUFLWSxrQkFBTCxHQUVBLENBRUQsR0FBSyxLQUFLeFosY0FBTCxHQUF3QixJQUE3QixDQUFvQyxDQUVuQyxLQUFLQyxxQkFBTCxHQUVBLENBRUQsS0FBSzZZLGtCQUFMLENBQTBCLElBQTFCLENBQ0EsS0FBS0UsaUJBQUwsQ0FBeUIsSUFBekIsQ0FFQSxXQUFBLENBRUEsQ0EvQzhFLENBaUQvRXZFLFFBQVMsVUFBWTtFQUlwQixPQUFTLFdBQUEsRUFBVCxDQUVBLHVCQUFPLENBQWtCM3pCLEtBQWxCLENBQTBCLENBRWhDdWQsR0FBRzlULGFBQUgsQ0FBa0J6SixLQUFsQixFQUVBLEtBQUttekIsV0FBTCxDQUFrQjVWLEVBQWxCLEVBRUEsV0FBQSxDQUVBLENBUkQsQ0FVQSxDQWhCUSxFQWpEc0UsQ0FtRS9FcVcsUUFBUyxVQUFZO0VBSXBCLE9BQVMsV0FBQSxFQUFULENBRUEsdUJBQU8sQ0FBa0I1ekIsS0FBbEIsQ0FBMEIsQ0FFaEN1ZCxHQUFHNVQsYUFBSCxDQUFrQjNKLEtBQWxCLEVBRUEsS0FBS216QixXQUFMLENBQWtCNVYsRUFBbEIsRUFFQSxXQUFBLENBRUEsQ0FSRCxDQVVBLENBaEJRLEVBbkVzRSxDQXFGL0VzVyxRQUFTLFVBQVk7RUFJcEIsT0FBUyxXQUFBLEVBQVQsQ0FFQSx1QkFBTyxDQUFrQjd6QixLQUFsQixDQUEwQixDQUVoQ3VkLEdBQUczVCxhQUFILENBQWtCNUosS0FBbEIsRUFFQSxLQUFLbXpCLFdBQUwsQ0FBa0I1VixFQUFsQixFQUVBLFdBQUEsQ0FFQSxDQVJELENBVUEsQ0FoQlEsRUFyRnNFLENBdUcvRXJLLFVBQVcsVUFBWTtFQUl0QixPQUFTLFdBQUEsRUFBVCxDQUVBLHlCQUFPLENBQW9Cbm5CLENBQXBCLENBQXVCd1EsQ0FBdkIsQ0FBMEI2RyxDQUExQixDQUE4QixDQUVwQ21hLEdBQUcvVCxlQUFILENBQW9CemQsQ0FBcEIsQ0FBdUJ3USxDQUF2QixDQUEwQjZHLENBQTFCLEVBRUEsS0FBSyt2QixXQUFMLENBQWtCNVYsRUFBbEIsRUFFQSxXQUFBLENBRUEsQ0FSRCxDQVVBLENBaEJVLEVBdkdvRSxDQXlIL0VwVSxNQUFPLFVBQVk7RUFJbEIsT0FBUyxXQUFBLEVBQVQsQ0FFQSxxQkFBTyxDQUFnQnBkLENBQWhCLENBQW1Cd1EsQ0FBbkIsQ0FBc0I2RyxDQUF0QixDQUEwQixDQUVoQ21hLEdBQUd0VCxTQUFILENBQWNsZSxDQUFkLENBQWlCd1EsQ0FBakIsQ0FBb0I2RyxDQUFwQixFQUVBLEtBQUsrdkIsV0FBTCxDQUFrQjVWLEVBQWxCLEVBRUEsV0FBQSxDQUVBLENBUkQsQ0FVQSxDQWhCTSxFQXpId0UsQ0EySS9FNVgsT0FBUSxVQUFZLENBRW5CLFFBQVUsWUFBQSxFQUFWLENBRUEsc0JBQU8sQ0FBaUI0RSxNQUFqQixDQUEwQixDQUVoQ3QyQixJQUFJMHhCLE1BQUosQ0FBWTRFLE1BQVosRUFFQXQyQixJQUFJZ2hDLFlBQUosR0FFQSxLQUFLa2UsV0FBTCxDQUFrQmwvQyxJQUFJdzJCLE1BQXRCLEVBRUEsQ0FSRCxDQVVBLENBZE8sRUEzSXVFLENBMkovRWt1QixtQkFBb0IsU0FBV2xmLFFBQVgsQ0FBc0IsQ0FFekMsVUFBWSxJQUFaLENBRUEsWUFBY0EsU0FBU3I1QixLQUFULEdBQW1CLElBQW5CLENBQTBCcTVCLFNBQVNyNUIsS0FBVCxDQUFlbVosS0FBekMsQ0FBaUR6aEIsU0FBL0QsQ0FDQSxlQUFpQjJoQyxTQUFTSyxVQUExQixDQUVBLGNBQWdCQSxXQUFXMVAsUUFBWCxDQUFvQjdRLEtBQXBDLENBQ0EsWUFBY3VnQixXQUFXbEksTUFBWCxHQUFzQjk1QixTQUF0QixDQUFrQ2dpQyxXQUFXbEksTUFBWCxDQUFrQnJZLEtBQXBELENBQTREemhCLFNBQTFFLENBQ0EsV0FBYWdpQyxXQUFXNE4sS0FBWCxHQUFxQjV2QyxTQUFyQixDQUFpQ2dpQyxXQUFXNE4sS0FBWCxDQUFpQm51QixLQUFsRCxDQUEwRHpoQixTQUF2RSxDQUNBLFFBQVVnaUMsV0FBVzNELEVBQVgsR0FBa0JyK0IsU0FBbEIsQ0FBOEJnaUMsV0FBVzNELEVBQVgsQ0FBYzVjLEtBQTVDLENBQW9EemhCLFNBQTlELENBQ0EsU0FBV2dpQyxXQUFXOGUsR0FBWCxHQUFtQjlnRCxTQUFuQixDQUErQmdpQyxXQUFXOGUsR0FBWCxDQUFlci9CLEtBQTlDLENBQXNEemhCLFNBQWpFLENBRUEsR0FBSytnRCxPQUFTL2dELFNBQWQsQ0FBMEIsS0FBSzAvQyxhQUFMLENBQW9CLENBQXBCLEVBQTBCLEVBQTFCLENBRTFCLGdCQUFrQixFQUFsQixDQUNBLFlBQWMsRUFBZCxDQUNBLGFBQWUsRUFBZixDQUVBLElBQU0sTUFBUSxDQUFSLENBQVdwaUMsRUFBSSxDQUFyQixDQUF3QjViLEVBQUlzL0MsVUFBVTMvQyxNQUF0QyxDQUE4Q0ssR0FBSyxDQUFMLENBQVE0YixHQUFLLENBQTNELENBQStELENBRTlEd2tCLE1BQU1ELFFBQU4sQ0FBZWhoQyxJQUFmLENBQXFCLFdBQUEsQ0FBYW1nRCxVQUFXdC9DLENBQVgsQ0FBYixDQUE2QnMvQyxVQUFXdC9DLEVBQUksQ0FBZixDQUE3QixDQUFpRHMvQyxVQUFXdC9DLEVBQUksQ0FBZixDQUFqRCxDQUFyQixFQUVBLEdBQUt1L0MsVUFBWWpoRCxTQUFqQixDQUE2QixDQUU1QmtoRCxZQUFZcmdELElBQVosQ0FBa0IsV0FBQSxDQUFhb2dELFFBQVN2L0MsQ0FBVCxDQUFiLENBQTJCdS9DLFFBQVN2L0MsRUFBSSxDQUFiLENBQTNCLENBQTZDdS9DLFFBQVN2L0MsRUFBSSxDQUFiLENBQTdDLENBQWxCLEVBRUEsQ0FFRCxHQUFLODlDLFNBQVd4L0MsU0FBaEIsQ0FBNEIsQ0FFM0I4aEMsTUFBTTBkLE1BQU4sQ0FBYTMrQyxJQUFiLENBQW1CLFNBQUEsQ0FBVzIrQyxPQUFROTlDLENBQVIsQ0FBWCxDQUF3Qjg5QyxPQUFROTlDLEVBQUksQ0FBWixDQUF4QixDQUF5Qzg5QyxPQUFROTlDLEVBQUksQ0FBWixDQUF6QyxDQUFuQixFQUVBLENBRUQsR0FBS3kvQyxNQUFRbmhELFNBQWIsQ0FBeUIsQ0FFeEJvaEQsUUFBUXZnRCxJQUFSLENBQWMsV0FBQSxDQUFhc2dELElBQUs3akMsQ0FBTCxDQUFiLENBQXVCNmpDLElBQUs3akMsRUFBSSxDQUFULENBQXZCLENBQWQsRUFFQSxDQUVELEdBQUt5akMsT0FBUy9nRCxTQUFkLENBQTBCLENBRXpCcWhELFNBQVN4Z0QsSUFBVCxDQUFlLFdBQUEsQ0FBYWtnRCxLQUFNempDLENBQU4sQ0FBYixDQUF3QnlqQyxLQUFNempDLEVBQUksQ0FBVixDQUF4QixDQUFmLEVBRUEsQ0FFRCxDQUVELGdCQUFBLENBQWtCbFosQ0FBbEIsQ0FBcUJGLENBQXJCLENBQXdCVyxDQUF4QixDQUEyQnM2QyxhQUEzQixDQUEyQyxDQUUxQyxrQkFBb0I4QixVQUFZamhELFNBQVosQ0FBd0IsQ0FBRWtoRCxZQUFhOThDLENBQWIsRUFBaUJpaUIsS0FBakIsRUFBRixDQUE0QjY2QixZQUFhaDlDLENBQWIsRUFBaUJtaUIsS0FBakIsRUFBNUIsQ0FBc0Q2NkIsWUFBYXI4QyxDQUFiLEVBQWlCd2hCLEtBQWpCLEVBQXRELENBQXhCLENBQTJHLEVBQS9ILENBQ0EsaUJBQW1CbTVCLFNBQVd4L0MsU0FBWCxDQUF1QixDQUFFOGhDLE1BQU0wZCxNQUFOLENBQWNwN0MsQ0FBZCxFQUFrQmlpQixLQUFsQixFQUFGLENBQTZCeWIsTUFBTTBkLE1BQU4sQ0FBY3Q3QyxDQUFkLEVBQWtCbWlCLEtBQWxCLEVBQTdCLENBQXdEeWIsTUFBTTBkLE1BQU4sQ0FBYzM2QyxDQUFkLEVBQWtCd2hCLEtBQWxCLEVBQXhELENBQXZCLENBQTZHLEVBQWhJLENBRUEsU0FBVyxTQUFBLENBQVdqaUIsQ0FBWCxDQUFjRixDQUFkLENBQWlCVyxDQUFqQixDQUFvQnU2QyxhQUFwQixDQUFtQ0MsWUFBbkMsQ0FBaURGLGFBQWpELENBQVgsQ0FFQXJkLE1BQU0yZCxLQUFOLENBQVk1K0MsSUFBWixDQUFrQjYvQyxJQUFsQixFQUVBLEdBQUtTLE1BQVFuaEQsU0FBYixDQUF5QixDQUV4QjhoQyxNQUFNNGQsYUFBTixDQUFxQixDQUFyQixFQUF5QjcrQyxJQUF6QixDQUErQixDQUFFdWdELFFBQVNoOUMsQ0FBVCxFQUFhaWlCLEtBQWIsRUFBRixDQUF3Qis2QixRQUFTbDlDLENBQVQsRUFBYW1pQixLQUFiLEVBQXhCLENBQThDKzZCLFFBQVN2OEMsQ0FBVCxFQUFhd2hCLEtBQWIsRUFBOUMsQ0FBL0IsRUFFQSxDQUVELEdBQUswNkIsT0FBUy9nRCxTQUFkLENBQTBCLENBRXpCOGhDLE1BQU00ZCxhQUFOLENBQXFCLENBQXJCLEVBQXlCNytDLElBQXpCLENBQStCLENBQUV3Z0QsU0FBVWo5QyxDQUFWLEVBQWNpaUIsS0FBZCxFQUFGLENBQXlCZzdCLFNBQVVuOUMsQ0FBVixFQUFjbWlCLEtBQWQsRUFBekIsQ0FBZ0RnN0IsU0FBVXg4QyxDQUFWLEVBQWN3aEIsS0FBZCxFQUFoRCxDQUEvQixFQUVBLENBRUQsQ0FFRCxXQUFhc2IsU0FBUzJmLE1BQXRCLENBRUEsR0FBS0EsT0FBT2pnRCxNQUFQLENBQWdCLENBQXJCLENBQXlCLENBRXhCLElBQU0sTUFBUSxDQUFkLENBQWlCSyxFQUFJNC9DLE9BQU9qZ0QsTUFBNUIsQ0FBb0NLLEdBQXBDLENBQTJDLENBRTFDLFVBQVk0L0MsT0FBUTUvQyxDQUFSLENBQVosQ0FFQSxVQUFZNi9DLE1BQU1yYyxLQUFsQixDQUNBLFVBQVlxYyxNQUFNbnhCLEtBQWxCLENBRUEsSUFBTSxNQUFROFUsS0FBUixDQUFleWIsR0FBS3piLE1BQVE5VSxLQUFsQyxDQUF5QzlTLEVBQUlxakMsRUFBN0MsQ0FBaURyakMsR0FBSyxDQUF0RCxDQUEwRCxDQUV6RCxHQUFLa2tDLFVBQVl4aEQsU0FBakIsQ0FBNkIsQ0FFNUJ5aEQsUUFBU0QsUUFBU2xrQyxDQUFULENBQVQsQ0FBdUJra0MsUUFBU2xrQyxFQUFJLENBQWIsQ0FBdkIsQ0FBeUNra0MsUUFBU2xrQyxFQUFJLENBQWIsQ0FBekMsQ0FBMkRpa0MsTUFBTXBDLGFBQWpFLEVBRUEsQ0FKRCxJQUlPLENBRU5zQyxRQUFTbmtDLENBQVQsQ0FBWUEsRUFBSSxDQUFoQixDQUFtQkEsRUFBSSxDQUF2QixDQUEwQmlrQyxNQUFNcEMsYUFBaEMsRUFFQSxDQUVELENBRUQsQ0FFRCxDQXpCRCxJQXlCTyxDQUVOLEdBQUtxQyxVQUFZeGhELFNBQWpCLENBQTZCLENBRTVCLElBQU0sTUFBUSxDQUFkLENBQWlCMEIsRUFBSTgvQyxRQUFRbmdELE1BQTdCLENBQXFDSyxHQUFLLENBQTFDLENBQThDLENBRTdDKy9DLFFBQVNELFFBQVM5L0MsQ0FBVCxDQUFULENBQXVCOC9DLFFBQVM5L0MsRUFBSSxDQUFiLENBQXZCLENBQXlDOC9DLFFBQVM5L0MsRUFBSSxDQUFiLENBQXpDLEVBRUEsQ0FFRCxDQVJELElBUU8sQ0FFTixJQUFNLE1BQVEsQ0FBZCxDQUFpQkEsRUFBSXMvQyxVQUFVMy9DLE1BQVYsQ0FBbUIsQ0FBeEMsQ0FBMkNLLEdBQUssQ0FBaEQsQ0FBb0QsQ0FFbkQrL0MsUUFBUy8vQyxDQUFULENBQVlBLEVBQUksQ0FBaEIsQ0FBbUJBLEVBQUksQ0FBdkIsRUFFQSxDQUVELENBRUQsQ0FFRCxLQUFLZ2dELGtCQUFMLEdBRUEsR0FBSy9mLFNBQVNxZSxXQUFULEdBQXlCLElBQTlCLENBQXFDLENBRXBDLEtBQUtBLFdBQUwsQ0FBbUJyZSxTQUFTcWUsV0FBVCxDQUFxQjM1QixLQUFyQixFQUFuQixDQUVBLENBRUQsR0FBS3NiLFNBQVN5RixjQUFULEdBQTRCLElBQWpDLENBQXdDLENBRXZDLEtBQUtBLGNBQUwsQ0FBc0J6RixTQUFTeUYsY0FBVCxDQUF3Qi9nQixLQUF4QixFQUF0QixDQUVBLENBRUQsV0FBQSxDQUVBLENBcFM4RSxDQXNTL0VrRCxPQUFRLFVBQVksQ0FFbkIsV0FBYSxXQUFBLEVBQWIsQ0FFQSxzQkFBTyxFQUFrQixDQUV4QixLQUFLcTNCLGtCQUFMLEdBRUEsS0FBS1osV0FBTCxDQUFpQnplLFNBQWpCLENBQTRCdlksTUFBNUIsRUFBcUNyQixNQUFyQyxHQUVBLEtBQUt5VCxTQUFMLENBQWdCcFMsT0FBTy9VLENBQXZCLENBQTBCK1UsT0FBT3ZFLENBQWpDLENBQW9DdUUsT0FBT3NDLENBQTNDLEVBRUEsV0FBQSxDQUVBLENBVkQsQ0FZQSxDQWhCTyxFQXRTdUUsQ0F3VC9FckQsVUFBVyxVQUFZLENBRXRCLEtBQUtvZixxQkFBTCxHQUVBLFdBQWEsS0FBS0QsY0FBTCxDQUFvQjdkLE1BQWpDLENBQ0EsV0FBYSxLQUFLNmQsY0FBTCxDQUFvQmhOLE1BQWpDLENBRUEsTUFBUUEsU0FBVyxDQUFYLENBQWUsQ0FBZixDQUFtQixJQUFNQSxNQUFqQyxDQUVBLFdBQWEsV0FBQSxFQUFiLENBQ0F6SCxPQUFPM2dCLEdBQVAsQ0FDQy9OLENBREQsQ0FDSSxDQURKLENBQ08sQ0FEUCxDQUNVLENBQUVBLENBQUYsQ0FBTXNsQixPQUFPdFYsQ0FEdkIsQ0FFQyxDQUZELENBRUloUSxDQUZKLENBRU8sQ0FGUCxDQUVVLENBQUVBLENBQUYsQ0FBTXNsQixPQUFPOUUsQ0FGdkIsQ0FHQyxDQUhELENBR0ksQ0FISixDQUdPeGdCLENBSFAsQ0FHVSxDQUFFQSxDQUFGLENBQU1zbEIsT0FBTytCLENBSHZCLENBSUMsQ0FKRCxDQUlJLENBSkosQ0FJTyxDQUpQLENBSVUsQ0FKVixFQU9BLEtBQUsrdkIsV0FBTCxDQUFrQjFvQixNQUFsQixFQUVBLFdBQUEsQ0FFQSxDQTdVOEUsQ0ErVS9FK3VCLG1CQUFvQixVQUFZLENBRS9CLE9BQVMsV0FBQSxFQUFULENBQXdCQyxHQUFLLFdBQUEsRUFBN0IsQ0FFQSxJQUFNLE1BQVEsQ0FBUixDQUFXQyxHQUFLLEtBQUtuQyxLQUFMLENBQVdwK0MsTUFBakMsQ0FBeUMrRSxFQUFJdzdDLEVBQTdDLENBQWlEeDdDLEdBQWpELENBQXdELENBRXZELFNBQVcsS0FBS3E1QyxLQUFMLENBQVlyNUMsQ0FBWixDQUFYLENBRUEsT0FBUyxLQUFLeTdCLFFBQUwsQ0FBZTZlLEtBQUt0OEMsQ0FBcEIsQ0FBVCxDQUNBLE9BQVMsS0FBS3k5QixRQUFMLENBQWU2ZSxLQUFLeDhDLENBQXBCLENBQVQsQ0FDQSxPQUFTLEtBQUsyOUIsUUFBTCxDQUFlNmUsS0FBSzc3QyxDQUFwQixDQUFULENBRUFnOUMsR0FBR2g3QixVQUFILENBQWVpN0IsRUFBZixDQUFtQkMsRUFBbkIsRUFDQUosR0FBRzk2QixVQUFILENBQWVtN0IsRUFBZixDQUFtQkQsRUFBbkIsRUFDQUYsR0FBRzFvQixLQUFILENBQVV3b0IsRUFBVixFQUVBRSxHQUFHNTVCLFNBQUgsR0FFQXk0QixLQUFLNW1CLE1BQUwsQ0FBWXhULElBQVosQ0FBa0J1N0IsRUFBbEIsRUFFQSxDQUVELENBclc4RSxDQXVXL0VJLHFCQUFzQixTQUFXQyxZQUFYLENBQTBCLENBRS9DLEdBQUtBLGVBQWlCbGlELFNBQXRCLENBQWtDa2lELGFBQWUsSUFBZixDQUVsQyxLQUFBLENBQU9DLEVBQVAsQ0FBVy83QyxDQUFYLENBQWN3N0MsRUFBZCxDQUFrQmxCLElBQWxCLENBQXdCN2UsUUFBeEIsQ0FFQUEsU0FBVyxTQUFBLENBQVcsS0FBS0EsUUFBTCxDQUFjeGdDLE1BQXpCLENBQVgsQ0FFQSxJQUFNMFMsRUFBSSxDQUFKLENBQU9vdUMsR0FBSyxLQUFLdGdCLFFBQUwsQ0FBY3hnQyxNQUFoQyxDQUF3QzBTLEVBQUlvdUMsRUFBNUMsQ0FBZ0RwdUMsR0FBaEQsQ0FBdUQsQ0FFdEQ4dEIsU0FBVTl0QixDQUFWLEVBQWdCLFdBQUEsRUFBaEIsQ0FFQSxDQUVELEdBQUttdUMsWUFBTCxDQUFvQjtFQUduQjtFQUVBLE1BQUEsQ0FBUUgsRUFBUixDQUFZRCxFQUFaLENBQ0EsT0FBUyxXQUFBLEVBQVQsQ0FBd0JILEdBQUssV0FBQSxFQUE3QixDQUVBLElBQU12N0MsRUFBSSxDQUFKLENBQU93N0MsR0FBSyxLQUFLbkMsS0FBTCxDQUFXcCtDLE1BQTdCLENBQXFDK0UsRUFBSXc3QyxFQUF6QyxDQUE2Q3g3QyxHQUE3QyxDQUFvRCxDQUVuRHM2QyxLQUFPLEtBQUtqQixLQUFMLENBQVlyNUMsQ0FBWixDQUFQLENBRUE0N0MsR0FBSyxLQUFLbmdCLFFBQUwsQ0FBZTZlLEtBQUt0OEMsQ0FBcEIsQ0FBTCxDQUNBMjlDLEdBQUssS0FBS2xnQixRQUFMLENBQWU2ZSxLQUFLeDhDLENBQXBCLENBQUwsQ0FDQTQ5QyxHQUFLLEtBQUtqZ0IsUUFBTCxDQUFlNmUsS0FBSzc3QyxDQUFwQixDQUFMLENBRUFnOUMsR0FBR2g3QixVQUFILENBQWVpN0IsRUFBZixDQUFtQkMsRUFBbkIsRUFDQUosR0FBRzk2QixVQUFILENBQWVtN0IsRUFBZixDQUFtQkQsRUFBbkIsRUFDQUYsR0FBRzFvQixLQUFILENBQVV3b0IsRUFBVixFQUVBOWYsU0FBVTZlLEtBQUt0OEMsQ0FBZixFQUFtQm1pQixHQUFuQixDQUF3QnM3QixFQUF4QixFQUNBaGdCLFNBQVU2ZSxLQUFLeDhDLENBQWYsRUFBbUJxaUIsR0FBbkIsQ0FBd0JzN0IsRUFBeEIsRUFDQWhnQixTQUFVNmUsS0FBSzc3QyxDQUFmLEVBQW1CMGhCLEdBQW5CLENBQXdCczdCLEVBQXhCLEVBRUEsQ0FFRCxDQTFCRCxJQTBCTyxDQUVOLEtBQUtILGtCQUFMLEdBRUEsSUFBTXQ3QyxFQUFJLENBQUosQ0FBT3c3QyxHQUFLLEtBQUtuQyxLQUFMLENBQVdwK0MsTUFBN0IsQ0FBcUMrRSxFQUFJdzdDLEVBQXpDLENBQTZDeDdDLEdBQTdDLENBQW9ELENBRW5EczZDLEtBQU8sS0FBS2pCLEtBQUwsQ0FBWXI1QyxDQUFaLENBQVAsQ0FFQXk3QixTQUFVNmUsS0FBS3Q4QyxDQUFmLEVBQW1CbWlCLEdBQW5CLENBQXdCbTZCLEtBQUs1bUIsTUFBN0IsRUFDQStILFNBQVU2ZSxLQUFLeDhDLENBQWYsRUFBbUJxaUIsR0FBbkIsQ0FBd0JtNkIsS0FBSzVtQixNQUE3QixFQUNBK0gsU0FBVTZlLEtBQUs3N0MsQ0FBZixFQUFtQjBoQixHQUFuQixDQUF3Qm02QixLQUFLNW1CLE1BQTdCLEVBRUEsQ0FFRCxDQUVELElBQU0vbEIsRUFBSSxDQUFKLENBQU9vdUMsR0FBSyxLQUFLdGdCLFFBQUwsQ0FBY3hnQyxNQUFoQyxDQUF3QzBTLEVBQUlvdUMsRUFBNUMsQ0FBZ0RwdUMsR0FBaEQsQ0FBdUQsQ0FFdEQ4dEIsU0FBVTl0QixDQUFWLEVBQWNrVSxTQUFkLEdBRUEsQ0FFRCxJQUFNN2hCLEVBQUksQ0FBSixDQUFPdzdDLEdBQUssS0FBS25DLEtBQUwsQ0FBV3ArQyxNQUE3QixDQUFxQytFLEVBQUl3N0MsRUFBekMsQ0FBNkN4N0MsR0FBN0MsQ0FBb0QsQ0FFbkRzNkMsS0FBTyxLQUFLakIsS0FBTCxDQUFZcjVDLENBQVosQ0FBUCxDQUVBLGtCQUFvQnM2QyxLQUFLdEIsYUFBekIsQ0FFQSxHQUFLQSxjQUFjLzlDLE1BQWQsR0FBeUIsQ0FBOUIsQ0FBa0MsQ0FFakMrOUMsY0FBZSxDQUFmLEVBQW1COTRCLElBQW5CLENBQXlCdWIsU0FBVTZlLEtBQUt0OEMsQ0FBZixDQUF6QixFQUNBZzdDLGNBQWUsQ0FBZixFQUFtQjk0QixJQUFuQixDQUF5QnViLFNBQVU2ZSxLQUFLeDhDLENBQWYsQ0FBekIsRUFDQWs3QyxjQUFlLENBQWYsRUFBbUI5NEIsSUFBbkIsQ0FBeUJ1YixTQUFVNmUsS0FBSzc3QyxDQUFmLENBQXpCLEVBRUEsQ0FORCxJQU1PLENBRU51NkMsY0FBZSxDQUFmLEVBQXFCdmQsU0FBVTZlLEtBQUt0OEMsQ0FBZixFQUFtQmlpQixLQUFuQixFQUFyQixDQUNBKzRCLGNBQWUsQ0FBZixFQUFxQnZkLFNBQVU2ZSxLQUFLeDhDLENBQWYsRUFBbUJtaUIsS0FBbkIsRUFBckIsQ0FDQSs0QixjQUFlLENBQWYsRUFBcUJ2ZCxTQUFVNmUsS0FBSzc3QyxDQUFmLEVBQW1Cd2hCLEtBQW5CLEVBQXJCLENBRUEsQ0FFRCxDQUVELEdBQUssS0FBS281QixLQUFMLENBQVdwK0MsTUFBWCxDQUFvQixDQUF6QixDQUE2QixDQUU1QixLQUFLKytDLGlCQUFMLENBQXlCLElBQXpCLENBRUEsQ0FFRCxDQWpjOEUsQ0FtYy9FZ0MseUJBQTBCLFVBQVksQ0FFckMsS0FBQSxDQUFPUixFQUFQLENBQVdsQixJQUFYLENBRUEsS0FBS2dCLGtCQUFMLEdBRUEsSUFBTXQ3QyxFQUFJLENBQUosQ0FBT3c3QyxHQUFLLEtBQUtuQyxLQUFMLENBQVdwK0MsTUFBN0IsQ0FBcUMrRSxFQUFJdzdDLEVBQXpDLENBQTZDeDdDLEdBQTdDLENBQW9ELENBRW5EczZDLEtBQU8sS0FBS2pCLEtBQUwsQ0FBWXI1QyxDQUFaLENBQVAsQ0FFQSxrQkFBb0JzNkMsS0FBS3RCLGFBQXpCLENBRUEsR0FBS0EsY0FBYy85QyxNQUFkLEdBQXlCLENBQTlCLENBQWtDLENBRWpDKzlDLGNBQWUsQ0FBZixFQUFtQjk0QixJQUFuQixDQUF5Qm82QixLQUFLNW1CLE1BQTlCLEVBQ0FzbEIsY0FBZSxDQUFmLEVBQW1COTRCLElBQW5CLENBQXlCbzZCLEtBQUs1bUIsTUFBOUIsRUFDQXNsQixjQUFlLENBQWYsRUFBbUI5NEIsSUFBbkIsQ0FBeUJvNkIsS0FBSzVtQixNQUE5QixFQUVBLENBTkQsSUFNTyxDQUVOc2xCLGNBQWUsQ0FBZixFQUFxQnNCLEtBQUs1bUIsTUFBTCxDQUFZelQsS0FBWixFQUFyQixDQUNBKzRCLGNBQWUsQ0FBZixFQUFxQnNCLEtBQUs1bUIsTUFBTCxDQUFZelQsS0FBWixFQUFyQixDQUNBKzRCLGNBQWUsQ0FBZixFQUFxQnNCLEtBQUs1bUIsTUFBTCxDQUFZelQsS0FBWixFQUFyQixDQUVBLENBRUQsQ0FFRCxHQUFLLEtBQUtvNUIsS0FBTCxDQUFXcCtDLE1BQVgsQ0FBb0IsQ0FBekIsQ0FBNkIsQ0FFNUIsS0FBSysrQyxpQkFBTCxDQUF5QixJQUF6QixDQUVBLENBRUQsQ0FyZThFLENBdWUvRWlDLG9CQUFxQixVQUFZLENBRWhDLEtBQUEsQ0FBT3ZoQixFQUFQLENBQVcxNkIsQ0FBWCxDQUFjdzdDLEVBQWQsQ0FBa0JsQixJQUFsQixDQUVBO0VBQ0E7RUFDQTtFQUVBLElBQU10NkMsRUFBSSxDQUFKLENBQU93N0MsR0FBSyxLQUFLbkMsS0FBTCxDQUFXcCtDLE1BQTdCLENBQXFDK0UsRUFBSXc3QyxFQUF6QyxDQUE2Q3g3QyxHQUE3QyxDQUFvRCxDQUVuRHM2QyxLQUFPLEtBQUtqQixLQUFMLENBQVlyNUMsQ0FBWixDQUFQLENBRUEsR0FBSyxDQUFFczZDLEtBQUs0QixvQkFBWixDQUFtQyxDQUVsQzVCLEtBQUs0QixvQkFBTCxDQUE0QjVCLEtBQUs1bUIsTUFBTCxDQUFZelQsS0FBWixFQUE1QixDQUVBLENBSkQsSUFJTyxDQUVOcTZCLEtBQUs0QixvQkFBTCxDQUEwQmg4QixJQUExQixDQUFnQ282QixLQUFLNW1CLE1BQXJDLEVBRUEsQ0FFRCxHQUFLLENBQUU0bUIsS0FBSzZCLHVCQUFaLENBQXNDN0IsS0FBSzZCLHVCQUFMLENBQStCLEVBQS9CLENBRXRDLElBQU03Z0QsRUFBSSxDQUFKLENBQU9vL0IsR0FBSzRmLEtBQUt0QixhQUFMLENBQW1CLzlDLE1BQXJDLENBQTZDSyxFQUFJby9CLEVBQWpELENBQXFEcC9CLEdBQXJELENBQTRELENBRTNELEdBQUssQ0FBRWcvQyxLQUFLNkIsdUJBQUwsQ0FBOEI3Z0QsQ0FBOUIsQ0FBUCxDQUEyQyxDQUUxQ2cvQyxLQUFLNkIsdUJBQUwsQ0FBOEI3Z0QsQ0FBOUIsRUFBb0NnL0MsS0FBS3RCLGFBQUwsQ0FBb0IxOUMsQ0FBcEIsRUFBd0Iya0IsS0FBeEIsRUFBcEMsQ0FFQSxDQUpELElBSU8sQ0FFTnE2QixLQUFLNkIsdUJBQUwsQ0FBOEI3Z0QsQ0FBOUIsRUFBa0M0a0IsSUFBbEMsQ0FBd0NvNkIsS0FBS3RCLGFBQUwsQ0FBb0IxOUMsQ0FBcEIsQ0FBeEMsRUFFQSxDQUVELENBRUQsQ0FFRDtFQUVBLFdBQWEsWUFBQSxFQUFiLENBQ0E4Z0QsT0FBTy9DLEtBQVAsQ0FBZSxLQUFLQSxLQUFwQixDQUVBLElBQU0vOUMsRUFBSSxDQUFKLENBQU9vL0IsR0FBSyxLQUFLNmUsWUFBTCxDQUFrQnQrQyxNQUFwQyxDQUE0Q0ssRUFBSW8vQixFQUFoRCxDQUFvRHAvQixHQUFwRCxDQUEyRDtFQUkxRCxHQUFLLENBQUUsS0FBS2srQyxZQUFMLENBQW1CbCtDLENBQW5CLENBQVAsQ0FBZ0MsQ0FFL0IsS0FBS2srQyxZQUFMLENBQW1CbCtDLENBQW5CLEVBQXlCLEVBQXpCLENBQ0EsS0FBS2srQyxZQUFMLENBQW1CbCtDLENBQW5CLEVBQXVCK2dELFdBQXZCLENBQXFDLEVBQXJDLENBQ0EsS0FBSzdDLFlBQUwsQ0FBbUJsK0MsQ0FBbkIsRUFBdUIwOUMsYUFBdkIsQ0FBdUMsRUFBdkMsQ0FFQSxtQkFBcUIsS0FBS1EsWUFBTCxDQUFtQmwrQyxDQUFuQixFQUF1QitnRCxXQUE1QyxDQUNBLHFCQUF1QixLQUFLN0MsWUFBTCxDQUFtQmwrQyxDQUFuQixFQUF1QjA5QyxhQUE5QyxDQUVBLGNBQUEsQ0FBZ0JBLGFBQWhCLENBRUEsSUFBTWg1QyxFQUFJLENBQUosQ0FBT3c3QyxHQUFLLEtBQUtuQyxLQUFMLENBQVdwK0MsTUFBN0IsQ0FBcUMrRSxFQUFJdzdDLEVBQXpDLENBQTZDeDdDLEdBQTdDLENBQW9ELENBRW5EczhDLFdBQWEsV0FBQSxFQUFiLENBQ0F0RCxjQUFnQixDQUFFaDdDLEVBQUcsV0FBQSxFQUFMLENBQW9CRixFQUFHLFdBQUEsRUFBdkIsQ0FBc0NXLEVBQUcsV0FBQSxFQUF6QyxDQUFoQixDQUVBODlDLGVBQWU5aEQsSUFBZixDQUFxQjZoRCxVQUFyQixFQUNBRSxpQkFBaUIvaEQsSUFBakIsQ0FBdUJ1K0MsYUFBdkIsRUFFQSxDQUVELENBRUQsaUJBQW1CLEtBQUtRLFlBQUwsQ0FBbUJsK0MsQ0FBbkIsQ0FBbkIsQ0FFQTtFQUVBOGdELE9BQU8zZ0IsUUFBUCxDQUFrQixLQUFLOGQsWUFBTCxDQUFtQmorQyxDQUFuQixFQUF1Qm1nQyxRQUF6QyxDQUVBO0VBRUEyZ0IsT0FBT2Qsa0JBQVAsR0FDQWMsT0FBT1Asb0JBQVAsR0FFQTtFQUVBLGNBQUEsQ0FBZ0I3QyxhQUFoQixDQUVBLElBQU1oNUMsRUFBSSxDQUFKLENBQU93N0MsR0FBSyxLQUFLbkMsS0FBTCxDQUFXcCtDLE1BQTdCLENBQXFDK0UsRUFBSXc3QyxFQUF6QyxDQUE2Q3g3QyxHQUE3QyxDQUFvRCxDQUVuRHM2QyxLQUFPLEtBQUtqQixLQUFMLENBQVlyNUMsQ0FBWixDQUFQLENBRUFzOEMsV0FBYTlDLGFBQWE2QyxXQUFiLENBQTBCcjhDLENBQTFCLENBQWIsQ0FDQWc1QyxjQUFnQlEsYUFBYVIsYUFBYixDQUE0Qmg1QyxDQUE1QixDQUFoQixDQUVBczhDLFdBQVdwOEIsSUFBWCxDQUFpQm82QixLQUFLNW1CLE1BQXRCLEVBRUFzbEIsY0FBY2g3QyxDQUFkLENBQWdCa2lCLElBQWhCLENBQXNCbzZCLEtBQUt0QixhQUFMLENBQW9CLENBQXBCLENBQXRCLEVBQ0FBLGNBQWNsN0MsQ0FBZCxDQUFnQm9pQixJQUFoQixDQUFzQm82QixLQUFLdEIsYUFBTCxDQUFvQixDQUFwQixDQUF0QixFQUNBQSxjQUFjdjZDLENBQWQsQ0FBZ0J5aEIsSUFBaEIsQ0FBc0JvNkIsS0FBS3RCLGFBQUwsQ0FBb0IsQ0FBcEIsQ0FBdEIsRUFFQSxDQUVELENBRUQ7RUFFQSxJQUFNaDVDLEVBQUksQ0FBSixDQUFPdzdDLEdBQUssS0FBS25DLEtBQUwsQ0FBV3ArQyxNQUE3QixDQUFxQytFLEVBQUl3N0MsRUFBekMsQ0FBNkN4N0MsR0FBN0MsQ0FBb0QsQ0FFbkRzNkMsS0FBTyxLQUFLakIsS0FBTCxDQUFZcjVDLENBQVosQ0FBUCxDQUVBczZDLEtBQUs1bUIsTUFBTCxDQUFjNG1CLEtBQUs0QixvQkFBbkIsQ0FDQTVCLEtBQUt0QixhQUFMLENBQXFCc0IsS0FBSzZCLHVCQUExQixDQUVBLENBRUQsQ0ExbEI4RSxDQTRsQi9FM0IsbUJBQW9CLFVBQVksQ0FFL0IsR0FBSyxLQUFLWixXQUFMLEdBQXFCLElBQTFCLENBQWlDLENBRWhDLEtBQUtBLFdBQUwsQ0FBbUIsUUFBQSxFQUFuQixDQUVBLENBRUQsS0FBS0EsV0FBTCxDQUFpQnJmLGFBQWpCLENBQWdDLEtBQUtrQixRQUFyQyxFQUVBLENBdG1COEUsQ0F3bUIvRXdGLHNCQUF1QixVQUFZLENBRWxDLEdBQUssS0FBS0QsY0FBTCxHQUF3QixJQUE3QixDQUFvQyxDQUVuQyxLQUFLQSxjQUFMLENBQXNCLFVBQUEsRUFBdEIsQ0FFQSxDQUVELEtBQUtBLGNBQUwsQ0FBb0J6RyxhQUFwQixDQUFtQyxLQUFLa0IsUUFBeEMsRUFFQSxDQWxuQjhFLENBb25CL0U4TSxNQUFPLFNBQVdoTixRQUFYLENBQXFCaFAsTUFBckIsQ0FBNkJrd0IsbUJBQTdCLENBQW1ELENBRXpELEdBQUssRUFBSWxoQixVQUFZQSxTQUFTQyxVQUF6QixDQUFMLENBQTZDLENBRTVDanJCLFFBQVFNLEtBQVIsQ0FBZSxxRUFBZixDQUFzRjBxQixRQUF0RixFQUNBLE9BRUEsQ0FFRCxnQkFBQSxDQUNDbWhCLGFBQWUsS0FBS2poQixRQUFMLENBQWN4Z0MsTUFEOUIsQ0FFQzBoRCxVQUFZLEtBQUtsaEIsUUFGbEIsQ0FHQ21oQixVQUFZcmhCLFNBQVNFLFFBSHRCLENBSUNvaEIsT0FBUyxLQUFLeEQsS0FKZixDQUtDeUQsT0FBU3ZoQixTQUFTOGQsS0FMbkIsQ0FNQzBELEtBQU8sS0FBS3pELGFBQUwsQ0FBb0IsQ0FBcEIsQ0FOUixDQU9DcUIsS0FBT3BmLFNBQVMrZCxhQUFULENBQXdCLENBQXhCLENBUFIsQ0FRQzBELFFBQVUsS0FBSzVELE1BUmhCLENBU0M2RCxRQUFVMWhCLFNBQVM2ZCxNQVRwQixDQVdBLEdBQUtxRCxzQkFBd0I3aUQsU0FBN0IsQ0FBeUM2aUQsb0JBQXNCLENBQXRCLENBRXpDLEdBQUtsd0IsU0FBVzN5QixTQUFoQixDQUE0QixDQUUzQjBsQyxhQUFlLFdBQUEsR0FBYzlLLGVBQWQsQ0FBK0JqSSxNQUEvQixDQUFmLENBRUEsQ0FFRDtFQUVBLElBQU0sTUFBUSxDQUFSLENBQVdtTyxHQUFLa2lCLFVBQVUzaEQsTUFBaEMsQ0FBd0NLLEVBQUlvL0IsRUFBNUMsQ0FBZ0RwL0IsR0FBaEQsQ0FBdUQsQ0FFdEQsV0FBYXNoRCxVQUFXdGhELENBQVgsQ0FBYixDQUVBLGVBQWlCKytDLE9BQU9wNkIsS0FBUCxFQUFqQixDQUVBLEdBQUtzTSxTQUFXM3lCLFNBQWhCLENBQTRCc2pELFdBQVdoekIsWUFBWCxDQUF5QnFDLE1BQXpCLEVBRTVCb3dCLFVBQVVsaUQsSUFBVixDQUFnQnlpRCxVQUFoQixFQUVBLENBRUQ7RUFFQSxJQUFNLE1BQVEsQ0FBUixDQUFXeGlCLEdBQUt1aUIsUUFBUWhpRCxNQUE5QixDQUFzQ0ssRUFBSW8vQixFQUExQyxDQUE4Q3AvQixHQUE5QyxDQUFxRCxDQUVwRDBoRCxRQUFRdmlELElBQVIsQ0FBY3dpRCxRQUFTM2hELENBQVQsRUFBYTJrQixLQUFiLEVBQWQsRUFFQSxDQUVEO0VBRUEsSUFBTTNrQixFQUFJLENBQUosQ0FBT28vQixHQUFLb2lCLE9BQU83aEQsTUFBekIsQ0FBaUNLLEVBQUlvL0IsRUFBckMsQ0FBeUNwL0IsR0FBekMsQ0FBZ0QsQ0FFL0MsU0FBV3doRCxPQUFReGhELENBQVIsQ0FBWCxDQUF3QjZoRCxRQUF4QixDQUFrQ3pwQixNQUFsQyxDQUEwQzhWLEtBQTFDLENBQ0M0VCxrQkFBb0I5QyxLQUFLdEIsYUFEMUIsQ0FFQ3FFLGlCQUFtQi9DLEtBQUtyQixZQUZ6QixDQUlBa0UsU0FBVyxTQUFBLENBQVc3QyxLQUFLdDhDLENBQUwsQ0FBUzArQyxZQUFwQixDQUFrQ3BDLEtBQUt4OEMsQ0FBTCxDQUFTNCtDLFlBQTNDLENBQXlEcEMsS0FBSzc3QyxDQUFMLENBQVNpK0MsWUFBbEUsQ0FBWCxDQUNBUyxTQUFTenBCLE1BQVQsQ0FBZ0J4VCxJQUFoQixDQUFzQm82QixLQUFLNW1CLE1BQTNCLEVBRUEsR0FBSzRMLGVBQWlCMWxDLFNBQXRCLENBQWtDLENBRWpDdWpELFNBQVN6cEIsTUFBVCxDQUFnQjNTLFlBQWhCLENBQThCdWUsWUFBOUIsRUFBNkN6ZCxTQUE3QyxHQUVBLENBRUQsSUFBTSxNQUFRLENBQVIsQ0FBVzA0QixHQUFLNkMsa0JBQWtCbmlELE1BQXhDLENBQWdEaWMsRUFBSXFqQyxFQUFwRCxDQUF3RHJqQyxHQUF4RCxDQUErRCxDQUU5RHdjLE9BQVMwcEIsa0JBQW1CbG1DLENBQW5CLEVBQXVCK0ksS0FBdkIsRUFBVCxDQUVBLEdBQUtxZixlQUFpQjFsQyxTQUF0QixDQUFrQyxDQUVqQzg1QixPQUFPM1MsWUFBUCxDQUFxQnVlLFlBQXJCLEVBQW9DemQsU0FBcEMsR0FFQSxDQUVEczdCLFNBQVNuRSxhQUFULENBQXVCditDLElBQXZCLENBQTZCaTVCLE1BQTdCLEVBRUEsQ0FFRHlwQixTQUFTM1QsS0FBVCxDQUFldHBCLElBQWYsQ0FBcUJvNkIsS0FBSzlRLEtBQTFCLEVBRUEsSUFBTSxNQUFRLENBQVIsQ0FBVytRLEdBQUs4QyxpQkFBaUJwaUQsTUFBdkMsQ0FBK0NpYyxFQUFJcWpDLEVBQW5ELENBQXVEcmpDLEdBQXZELENBQThELENBRTdEc3lCLE1BQVE2VCxpQkFBa0JubUMsQ0FBbEIsQ0FBUixDQUNBaW1DLFNBQVNsRSxZQUFULENBQXNCeCtDLElBQXRCLENBQTRCK3VDLE1BQU12cEIsS0FBTixFQUE1QixFQUVBLENBRURrOUIsU0FBU3BFLGFBQVQsQ0FBeUJ1QixLQUFLdkIsYUFBTCxDQUFxQjBELG1CQUE5QyxDQUVBSSxPQUFPcGlELElBQVAsQ0FBYTBpRCxRQUFiLEVBRUEsQ0FFRDtFQUVBLElBQU03aEQsRUFBSSxDQUFKLENBQU9vL0IsR0FBS2lnQixLQUFLMS9DLE1BQXZCLENBQStCSyxFQUFJby9CLEVBQW5DLENBQXVDcC9CLEdBQXZDLENBQThDLENBRTdDLE9BQVNxL0MsS0FBTXIvQyxDQUFOLENBQVQsQ0FBb0JnaUQsT0FBUyxFQUE3QixDQUVBLEdBQUtybEIsS0FBT3IrQixTQUFaLENBQXdCLENBRXZCLFNBRUEsQ0FFRCxJQUFNLE1BQVEsQ0FBUixDQUFXMmdELEdBQUt0aUIsR0FBR2g5QixNQUF6QixDQUFpQ2ljLEVBQUlxakMsRUFBckMsQ0FBeUNyakMsR0FBekMsQ0FBZ0QsQ0FFL0NvbUMsT0FBTzdpRCxJQUFQLENBQWF3OUIsR0FBSS9nQixDQUFKLEVBQVErSSxLQUFSLEVBQWIsRUFFQSxDQUVEODhCLEtBQUt0aUQsSUFBTCxDQUFXNmlELE1BQVgsRUFFQSxDQUVELENBMXVCOEUsQ0E0dUIvRUMsVUFBVyxTQUFXQyxJQUFYLENBQWtCLENBRTVCLEdBQUssRUFBSUEsTUFBUUEsS0FBS0MsTUFBakIsQ0FBTCxDQUFpQyxDQUVoQ2x0QyxRQUFRTSxLQUFSLENBQWUsaUVBQWYsQ0FBa0Yyc0MsSUFBbEYsRUFDQSxPQUVBLENBRUQsR0FBS0EsS0FBS2xuQixnQkFBVixDQUE2QmtuQixLQUFLem1CLFlBQUwsR0FFN0IsS0FBS3dSLEtBQUwsQ0FBWWlWLEtBQUtqaUIsUUFBakIsQ0FBMkJpaUIsS0FBS2p4QixNQUFoQyxFQUVBLENBenZCOEU7Ozs7TUFpd0IvRW14QixjQUFlLFVBQVksQ0FFMUIsZ0JBQWtCLEVBQWxCLENBQXNCO0VBQ3RCLFdBQWEsRUFBYixDQUFpQkMsUUFBVSxFQUEzQixDQUVBLEtBQUEsQ0FBTzVpRCxHQUFQLENBQ0Esb0JBQXNCLENBQXRCLENBQXlCO0VBQ3pCLGNBQWdCb0MsS0FBSzJlLEdBQUwsQ0FBVSxFQUFWLENBQWM4aEMsZUFBZCxDQUFoQixDQUNBLEtBQUEsQ0FBT2xqQixFQUFQLENBQVc0ZixJQUFYLENBQ0EsV0FBQSxDQUFhcGpDLENBQWIsQ0FBZ0JxakMsRUFBaEIsQ0FFQSxJQUFNai9DLEVBQUksQ0FBSixDQUFPby9CLEdBQUssS0FBS2UsUUFBTCxDQUFjeGdDLE1BQWhDLENBQXdDSyxFQUFJby9CLEVBQTVDLENBQWdEcC9CLEdBQWhELENBQXVELENBRXREcVMsRUFBSSxLQUFLOHRCLFFBQUwsQ0FBZW5nQyxDQUFmLENBQUosQ0FDQVAsSUFBTW9DLEtBQUtra0IsS0FBTCxDQUFZMVQsRUFBRUUsQ0FBRixDQUFNZ3dDLFNBQWxCLEVBQWdDLEdBQWhDLENBQXNDMWdELEtBQUtra0IsS0FBTCxDQUFZMVQsRUFBRTBRLENBQUYsQ0FBTXcvQixTQUFsQixDQUF0QyxDQUFzRSxHQUF0RSxDQUE0RTFnRCxLQUFLa2tCLEtBQUwsQ0FBWTFULEVBQUV1WCxDQUFGLENBQU0yNEIsU0FBbEIsQ0FBbEYsQ0FFQSxHQUFLQyxZQUFhL2lELEdBQWIsSUFBdUJuQixTQUE1QixDQUF3QyxDQUV2Q2trRCxZQUFhL2lELEdBQWIsRUFBcUJPLENBQXJCLENBQ0F5aUQsT0FBT3RqRCxJQUFQLENBQWEsS0FBS2doQyxRQUFMLENBQWVuZ0MsQ0FBZixDQUFiLEVBQ0FxaUQsUUFBU3JpRCxDQUFULEVBQWV5aUQsT0FBTzlpRCxNQUFQLENBQWdCLENBQS9CLENBRUEsQ0FORCxJQU1PO0VBR04waUQsUUFBU3JpRCxDQUFULEVBQWVxaUQsUUFBU0csWUFBYS9pRCxHQUFiLENBQVQsQ0FBZixDQUVBLENBRUQsQ0FHRDtFQUNBO0VBQ0Esd0JBQTBCLEVBQTFCLENBRUEsSUFBTU8sRUFBSSxDQUFKLENBQU9vL0IsR0FBSyxLQUFLMmUsS0FBTCxDQUFXcCtDLE1BQTdCLENBQXFDSyxFQUFJby9CLEVBQXpDLENBQTZDcC9CLEdBQTdDLENBQW9ELENBRW5EZy9DLEtBQU8sS0FBS2pCLEtBQUwsQ0FBWS85QyxDQUFaLENBQVAsQ0FFQWcvQyxLQUFLdDhDLENBQUwsQ0FBUzIvQyxRQUFTckQsS0FBS3Q4QyxDQUFkLENBQVQsQ0FDQXM4QyxLQUFLeDhDLENBQUwsQ0FBUzYvQyxRQUFTckQsS0FBS3g4QyxDQUFkLENBQVQsQ0FDQXc4QyxLQUFLNzdDLENBQUwsQ0FBU2svQyxRQUFTckQsS0FBSzc3QyxDQUFkLENBQVQsQ0FFQTI4QyxRQUFVLENBQUVkLEtBQUt0OEMsQ0FBUCxDQUFVczhDLEtBQUt4OEMsQ0FBZixDQUFrQnc4QyxLQUFLNzdDLENBQXZCLENBQVYsQ0FFQTtFQUNBO0VBQ0EsSUFBTSxNQUFRLENBQWQsQ0FBaUJvZixFQUFJLENBQXJCLENBQXdCQSxHQUF4QixDQUErQixDQUU5QixHQUFLdTlCLFFBQVN2OUIsQ0FBVCxJQUFpQnU5QixRQUFTLENBQUV2OUIsRUFBSSxDQUFOLEVBQVksQ0FBckIsQ0FBdEIsQ0FBaUQsQ0FFaERtZ0Msb0JBQW9CdmpELElBQXBCLENBQTBCYSxDQUExQixFQUNBLE1BRUEsQ0FFRCxDQUVELENBRUQsSUFBTUEsRUFBSTBpRCxvQkFBb0IvaUQsTUFBcEIsQ0FBNkIsQ0FBdkMsQ0FBMENLLEdBQUssQ0FBL0MsQ0FBa0RBLEdBQWxELENBQXlELENBRXhELFFBQVUwaUQsb0JBQXFCMWlELENBQXJCLENBQVYsQ0FFQSxLQUFLKzlDLEtBQUwsQ0FBV3o4QixNQUFYLENBQW1CcWhDLEdBQW5CLENBQXdCLENBQXhCLEVBRUEsSUFBTS9tQyxFQUFJLENBQUosQ0FBT3FqQyxHQUFLLEtBQUtqQixhQUFMLENBQW1CcitDLE1BQXJDLENBQTZDaWMsRUFBSXFqQyxFQUFqRCxDQUFxRHJqQyxHQUFyRCxDQUE0RCxDQUUzRCxLQUFLb2lDLGFBQUwsQ0FBb0JwaUMsQ0FBcEIsRUFBd0IwRixNQUF4QixDQUFnQ3FoQyxHQUFoQyxDQUFxQyxDQUFyQyxFQUVBLENBRUQsQ0FFRDtFQUVBLFNBQVcsS0FBS3hpQixRQUFMLENBQWN4Z0MsTUFBZCxDQUF1QjhpRCxPQUFPOWlELE1BQXpDLENBQ0EsS0FBS3dnQyxRQUFMLENBQWdCc2lCLE1BQWhCLENBQ0EsV0FBQSxDQUVBLENBbDFCOEUsQ0FvMUIvRXhqQixjQUFlLFNBQVdDLE1BQVgsQ0FBb0IsQ0FFbEMsS0FBS2lCLFFBQUwsQ0FBZ0IsRUFBaEIsQ0FFQSxJQUFNLE1BQVEsQ0FBUixDQUFXMTlCLEVBQUl5OEIsT0FBT3YvQixNQUE1QixDQUFvQ0ssRUFBSXlDLENBQXhDLENBQTJDekMsR0FBM0MsQ0FBa0QsQ0FFakQsVUFBWWsvQixPQUFRbC9CLENBQVIsQ0FBWixDQUNBLEtBQUttZ0MsUUFBTCxDQUFjaGhDLElBQWQsQ0FBb0IsV0FBQSxDQUFheU4sTUFBTTJGLENBQW5CLENBQXNCM0YsTUFBTW1XLENBQTVCLENBQStCblcsTUFBTWdkLENBQU4sRUFBVyxDQUExQyxDQUFwQixFQUVBLENBRUQsV0FBQSxDQUVBLENBajJCOEUsQ0FtMkIvRWc1Qix5QkFBMEIsVUFBWSxDQUVyQyxVQUFZLEtBQUs3RSxLQUFqQixDQUNBLFdBQWFBLE1BQU1wK0MsTUFBbkIsQ0FFQTtFQUVBLElBQU0sTUFBUSxDQUFkLENBQWlCSyxFQUFJTCxNQUFyQixDQUE2QkssR0FBN0IsQ0FBb0MsQ0FFbkMrOUMsTUFBTy85QyxDQUFQLEVBQVc2aUQsR0FBWCxDQUFpQjdpRCxDQUFqQixDQUVBLENBRUQ7RUFFQSwwQkFBQSxDQUE0QjBDLENBQTVCLENBQStCRixDQUEvQixDQUFtQyxDQUVsQyxTQUFTaTdDLGFBQUYsQ0FBa0JqN0MsRUFBRWk3QyxhQUEzQixDQUVBLENBRURNLE1BQU0rRSxJQUFOLENBQVlDLGlCQUFaLEVBRUE7RUFFQSxTQUFXLEtBQUsvRSxhQUFMLENBQW9CLENBQXBCLENBQVgsQ0FDQSxTQUFXLEtBQUtBLGFBQUwsQ0FBb0IsQ0FBcEIsQ0FBWCxDQUVBLFdBQUEsQ0FBYWdGLE9BQWIsQ0FFQSxHQUFLdkIsTUFBUUEsS0FBSzloRCxNQUFMLEdBQWdCQSxNQUE3QixDQUFzQ3NqRCxRQUFVLEVBQVYsQ0FDdEMsR0FBSzVELE1BQVFBLEtBQUsxL0MsTUFBTCxHQUFnQkEsTUFBN0IsQ0FBc0NxakQsUUFBVSxFQUFWLENBRXRDLElBQU0sTUFBUSxDQUFkLENBQWlCaGpELEVBQUlMLE1BQXJCLENBQTZCSyxHQUE3QixDQUFvQyxDQUVuQyxPQUFTKzlDLE1BQU8vOUMsQ0FBUCxFQUFXNmlELEdBQXBCLENBRUEsR0FBS0ksT0FBTCxDQUFlQSxRQUFROWpELElBQVIsQ0FBY3NpRCxLQUFNNzVDLEVBQU4sQ0FBZCxFQUNmLEdBQUtvN0MsT0FBTCxDQUFlQSxRQUFRN2pELElBQVIsQ0FBY2tnRCxLQUFNejNDLEVBQU4sQ0FBZCxFQUVmLENBRUQsR0FBS3E3QyxPQUFMLENBQWUsS0FBS2pGLGFBQUwsQ0FBb0IsQ0FBcEIsRUFBMEJpRixPQUExQixDQUNmLEdBQUtELE9BQUwsQ0FBZSxLQUFLaEYsYUFBTCxDQUFvQixDQUFwQixFQUEwQmdGLE9BQTFCLENBRWYsQ0FoNUI4RSxDQWs1Qi9FdG5CLE9BQVEsVUFBWSxDQUVuQixTQUFXLENBQ1ZXLFNBQVUsQ0FDVHY1QixRQUFTLEdBREEsQ0FFVG5JLEtBQU0sVUFGRyxDQUdUUCxVQUFXLGlCQUhGLENBREEsQ0FBWCxDQVFBO0VBRUFpVixLQUFLZ3JCLElBQUwsQ0FBWSxLQUFLQSxJQUFqQixDQUNBaHJCLEtBQUsxVSxJQUFMLENBQVksS0FBS0EsSUFBakIsQ0FDQSxHQUFLLEtBQUtxQixJQUFMLEdBQWMsRUFBbkIsQ0FBd0JxVCxLQUFLclQsSUFBTCxDQUFZLEtBQUtBLElBQWpCLENBRXhCLEdBQUssS0FBSysvQyxVQUFMLEdBQW9CejlDLFNBQXpCLENBQXFDLENBRXBDLGVBQWlCLEtBQUt5OUMsVUFBdEIsQ0FFQSxJQUFNLE9BQU4sY0FBQSxDQUE4QixDQUU3QixHQUFLQSxXQUFZdDhDLEdBQVosSUFBc0JuQixTQUEzQixDQUF1QytRLEtBQU01UCxHQUFOLEVBQWNzOEMsV0FBWXQ4QyxHQUFaLENBQWQsQ0FFdkMsQ0FFRCxXQUFBLENBRUEsQ0FFRCxhQUFlLEVBQWYsQ0FFQSxJQUFNLE1BQVEsQ0FBZCxDQUFpQk8sRUFBSSxLQUFLbWdDLFFBQUwsQ0FBY3hnQyxNQUFuQyxDQUEyQ0ssR0FBM0MsQ0FBa0QsQ0FFakQsV0FBYSxLQUFLbWdDLFFBQUwsQ0FBZW5nQyxDQUFmLENBQWIsQ0FDQW1nQyxTQUFTaGhDLElBQVQsQ0FBZTQvQyxPQUFPeHNDLENBQXRCLENBQXlCd3NDLE9BQU9oOEIsQ0FBaEMsQ0FBbUNnOEIsT0FBT24xQixDQUExQyxFQUVBLENBRUQsVUFBWSxFQUFaLENBQ0EsWUFBYyxFQUFkLENBQ0EsZ0JBQWtCLEVBQWxCLENBQ0EsV0FBYSxFQUFiLENBQ0EsZUFBaUIsRUFBakIsQ0FDQSxRQUFVLEVBQVYsQ0FDQSxZQUFjLEVBQWQsQ0FFQSxJQUFNLE1BQVEsQ0FBZCxDQUFpQjVwQixFQUFJLEtBQUsrOUMsS0FBTCxDQUFXcCtDLE1BQWhDLENBQXdDSyxHQUF4QyxDQUErQyxDQUU5QyxTQUFXLEtBQUsrOUMsS0FBTCxDQUFZLzlDLENBQVosQ0FBWCxDQUVBLGdCQUFrQixJQUFsQixDQUNBLGNBQWdCLEtBQWhCLENBQXVCO0VBQ3ZCLG9CQUFzQixLQUFLZytDLGFBQUwsQ0FBb0IsQ0FBcEIsRUFBeUJoK0MsQ0FBekIsSUFBaUMxQixTQUF2RCxDQUNBLGtCQUFvQjBnRCxLQUFLNW1CLE1BQUwsQ0FBWXo0QixNQUFaLEdBQXVCLENBQTNDLENBQ0Esd0JBQTBCcS9DLEtBQUt0QixhQUFMLENBQW1CLzlDLE1BQW5CLENBQTRCLENBQXRELENBQ0EsaUJBQW1CcS9DLEtBQUs5USxLQUFMLENBQVd6M0IsQ0FBWCxHQUFpQixDQUFqQixFQUFzQnVvQyxLQUFLOVEsS0FBTCxDQUFXNXNDLENBQVgsR0FBaUIsQ0FBdkMsRUFBNEMwOUMsS0FBSzlRLEtBQUwsQ0FBVzFyQyxDQUFYLEdBQWlCLENBQWhGLENBQ0EsdUJBQXlCdzhDLEtBQUtyQixZQUFMLENBQWtCaCtDLE1BQWxCLENBQTJCLENBQXBELENBRUEsYUFBZSxDQUFmLENBRUF1akQsU0FBV0MsT0FBUUQsUUFBUixDQUFrQixDQUFsQixDQUFxQixDQUFyQixDQUFYLENBQXFDO0VBQ3JDQSxTQUFXQyxPQUFRRCxRQUFSLENBQWtCLENBQWxCLENBQXFCRSxXQUFyQixDQUFYLENBQ0FGLFNBQVdDLE9BQVFELFFBQVIsQ0FBa0IsQ0FBbEIsQ0FBcUJHLFNBQXJCLENBQVgsQ0FDQUgsU0FBV0MsT0FBUUQsUUFBUixDQUFrQixDQUFsQixDQUFxQkksZUFBckIsQ0FBWCxDQUNBSixTQUFXQyxPQUFRRCxRQUFSLENBQWtCLENBQWxCLENBQXFCSyxhQUFyQixDQUFYLENBQ0FMLFNBQVdDLE9BQVFELFFBQVIsQ0FBa0IsQ0FBbEIsQ0FBcUJNLG1CQUFyQixDQUFYLENBQ0FOLFNBQVdDLE9BQVFELFFBQVIsQ0FBa0IsQ0FBbEIsQ0FBcUJPLFlBQXJCLENBQVgsQ0FDQVAsU0FBV0MsT0FBUUQsUUFBUixDQUFrQixDQUFsQixDQUFxQlEsa0JBQXJCLENBQVgsQ0FFQTNGLE1BQU01K0MsSUFBTixDQUFZK2pELFFBQVosRUFDQW5GLE1BQU01K0MsSUFBTixDQUFZNi9DLEtBQUt0OEMsQ0FBakIsQ0FBb0JzOEMsS0FBS3g4QyxDQUF6QixDQUE0Qnc4QyxLQUFLNzdDLENBQWpDLEVBQ0E0NkMsTUFBTTUrQyxJQUFOLENBQVk2L0MsS0FBS3ZCLGFBQWpCLEVBRUEsR0FBSzZGLGVBQUwsQ0FBdUIsQ0FFdEIsa0JBQW9CLEtBQUt0RixhQUFMLENBQW9CLENBQXBCLEVBQXlCaCtDLENBQXpCLENBQXBCLENBRUErOUMsTUFBTTUrQyxJQUFOLENBQ0N3a0QsV0FBWTNGLGNBQWUsQ0FBZixDQUFaLENBREQsQ0FFQzJGLFdBQVkzRixjQUFlLENBQWYsQ0FBWixDQUZELENBR0MyRixXQUFZM0YsY0FBZSxDQUFmLENBQVosQ0FIRCxFQU1BLENBRUQsR0FBS3VGLGFBQUwsQ0FBcUIsQ0FFcEJ4RixNQUFNNStDLElBQU4sQ0FBWXlrRCxlQUFnQjVFLEtBQUs1bUIsTUFBckIsQ0FBWixFQUVBLENBRUQsR0FBS29yQixtQkFBTCxDQUEyQixDQUUxQixrQkFBb0J4RSxLQUFLdEIsYUFBekIsQ0FFQUssTUFBTTUrQyxJQUFOLENBQ0N5a0QsZUFBZ0JsRyxjQUFlLENBQWYsQ0FBaEIsQ0FERCxDQUVDa0csZUFBZ0JsRyxjQUFlLENBQWYsQ0FBaEIsQ0FGRCxDQUdDa0csZUFBZ0JsRyxjQUFlLENBQWYsQ0FBaEIsQ0FIRCxFQU1BLENBRUQsR0FBSytGLFlBQUwsQ0FBb0IsQ0FFbkIxRixNQUFNNStDLElBQU4sQ0FBWTBrRCxjQUFlN0UsS0FBSzlRLEtBQXBCLENBQVosRUFFQSxDQUVELEdBQUt3VixrQkFBTCxDQUEwQixDQUV6QixpQkFBbUIxRSxLQUFLckIsWUFBeEIsQ0FFQUksTUFBTTUrQyxJQUFOLENBQ0Mwa0QsY0FBZWxHLGFBQWMsQ0FBZCxDQUFmLENBREQsQ0FFQ2tHLGNBQWVsRyxhQUFjLENBQWQsQ0FBZixDQUZELENBR0NrRyxjQUFlbEcsYUFBYyxDQUFkLENBQWYsQ0FIRCxFQU1BLENBRUQsQ0FFRCxlQUFBLENBQWlCaGhELEtBQWpCLENBQXdCaTBCLFFBQXhCLENBQWtDcXNCLE9BQWxDLENBQTRDLENBRTNDLGVBQWlCdGdELE1BQVUsR0FBS2kwQixRQUF6QixDQUFzQ2owQixNQUFVLEVBQUksR0FBS2kwQixRQUFULENBQXZELENBRUEsQ0FFRCx1QkFBQSxDQUF5QndILE1BQXpCLENBQWtDLENBRWpDLFNBQVdBLE9BQU83bEIsQ0FBUCxDQUFTNVQsUUFBVCxHQUFzQnk1QixPQUFPclYsQ0FBUCxDQUFTcGtCLFFBQVQsRUFBdEIsQ0FBNEN5NUIsT0FBT3hPLENBQVAsQ0FBU2pyQixRQUFULEVBQXZELENBRUEsR0FBS21sRCxZQUFhQyxJQUFiLElBQXdCemxELFNBQTdCLENBQXlDLENBRXhDLG1CQUFvQnlsRCxJQUFiLENBQVAsQ0FFQSxDQUVERCxZQUFhQyxJQUFiLEVBQXNCeEUsUUFBUTUvQyxNQUFSLENBQWlCLENBQXZDLENBQ0E0L0MsUUFBUXBnRCxJQUFSLENBQWNpNUIsT0FBTzdsQixDQUFyQixDQUF3QjZsQixPQUFPclYsQ0FBL0IsQ0FBa0NxVixPQUFPeE8sQ0FBekMsRUFFQSxtQkFBb0JtNkIsSUFBYixDQUFQLENBRUEsQ0FFRCxzQkFBQSxDQUF3QjdWLEtBQXhCLENBQWdDLENBRS9CLFNBQVdBLE1BQU16M0IsQ0FBTixDQUFROVgsUUFBUixHQUFxQnV2QyxNQUFNNXNDLENBQU4sQ0FBUTNDLFFBQVIsRUFBckIsQ0FBMEN1dkMsTUFBTTFyQyxDQUFOLENBQVE3RCxRQUFSLEVBQXJELENBRUEsR0FBS3FsRCxXQUFZRCxJQUFaLElBQXVCemxELFNBQTVCLENBQXdDLENBRXZDLGtCQUFtQnlsRCxJQUFaLENBQVAsQ0FFQSxDQUVEQyxXQUFZRCxJQUFaLEVBQXFCakcsT0FBT24rQyxNQUE1QixDQUNBbStDLE9BQU8zK0MsSUFBUCxDQUFhK3VDLE1BQU1XLE1BQU4sRUFBYixFQUVBLGtCQUFtQmtWLElBQVosQ0FBUCxDQUVBLENBRUQsbUJBQUEsQ0FBcUJwbkIsRUFBckIsQ0FBMEIsQ0FFekIsU0FBV0EsR0FBR3BxQixDQUFILENBQUs1VCxRQUFMLEdBQWtCZytCLEdBQUc1WixDQUFILENBQUtwa0IsUUFBTCxFQUE3QixDQUVBLEdBQUtzbEQsUUFBU0YsSUFBVCxJQUFvQnpsRCxTQUF6QixDQUFxQyxDQUVwQyxlQUFnQnlsRCxJQUFULENBQVAsQ0FFQSxDQUVERSxRQUFTRixJQUFULEVBQWtCdEUsSUFBSTkvQyxNQUFKLENBQWEsQ0FBL0IsQ0FDQTgvQyxJQUFJdGdELElBQUosQ0FBVXc5QixHQUFHcHFCLENBQWIsQ0FBZ0JvcUIsR0FBRzVaLENBQW5CLEVBRUEsZUFBZ0JnaEMsSUFBVCxDQUFQLENBRUEsQ0FFRDEwQyxLQUFLQSxJQUFMLENBQVksRUFBWixDQUVBQSxLQUFLQSxJQUFMLENBQVU4d0IsUUFBVixDQUFxQkEsUUFBckIsQ0FDQTl3QixLQUFLQSxJQUFMLENBQVVrd0MsT0FBVixDQUFvQkEsT0FBcEIsQ0FDQSxHQUFLekIsT0FBT24rQyxNQUFQLENBQWdCLENBQXJCLENBQXlCMFAsS0FBS0EsSUFBTCxDQUFVeXVDLE1BQVYsQ0FBbUJBLE1BQW5CLENBQ3pCLEdBQUsyQixJQUFJOS9DLE1BQUosQ0FBYSxDQUFsQixDQUFzQjBQLEtBQUtBLElBQUwsQ0FBVW93QyxHQUFWLENBQWdCLENBQUVBLEdBQUYsQ0FBaEIsQ0FBeUI7RUFDL0Nwd0MsS0FBS0EsSUFBTCxDQUFVMHVDLEtBQVYsQ0FBa0JBLEtBQWxCLENBRUEsV0FBQSxDQUVBLENBamxDOEUsQ0FtbEMvRXA1QixNQUFPLFVBQVk7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0EwQmxCLG1CQUFPLEdBQWVDLElBQWYsQ0FBcUIsSUFBckIsQ0FBUCxDQUVBLENBL21DOEUsQ0FpbkMvRUEsS0FBTSxTQUFXNWYsTUFBWCxDQUFvQixDQUV6QixLQUFBLENBQU9vNkIsRUFBUCxDQUFXeGpCLENBQVgsQ0FBY3FqQyxFQUFkLENBQWtCbmpDLENBQWxCLENBQXFCb29DLEVBQXJCLENBRUE7RUFFQSxLQUFLL2pCLFFBQUwsQ0FBZ0IsRUFBaEIsQ0FDQSxLQUFLMmQsTUFBTCxDQUFjLEVBQWQsQ0FDQSxLQUFLQyxLQUFMLENBQWEsRUFBYixDQUNBLEtBQUtDLGFBQUwsQ0FBcUIsQ0FBQyxFQUFELENBQXJCLENBQ0EsS0FBS0MsWUFBTCxDQUFvQixFQUFwQixDQUNBLEtBQUtDLFlBQUwsQ0FBb0IsRUFBcEIsQ0FDQSxLQUFLQyxXQUFMLENBQW1CLEVBQW5CLENBQ0EsS0FBS0MsV0FBTCxDQUFtQixFQUFuQixDQUNBLEtBQUtDLGFBQUwsQ0FBcUIsRUFBckIsQ0FDQSxLQUFLQyxXQUFMLENBQW1CLElBQW5CLENBQ0EsS0FBSzVZLGNBQUwsQ0FBc0IsSUFBdEIsQ0FFQTtFQUVBLEtBQUsxcEMsSUFBTCxDQUFZZ0osT0FBT2hKLElBQW5CLENBRUE7RUFFQSxhQUFlZ0osT0FBT203QixRQUF0QixDQUVBLElBQU1uZ0MsRUFBSSxDQUFKLENBQU9vL0IsR0FBS2UsU0FBU3hnQyxNQUEzQixDQUFtQ0ssRUFBSW8vQixFQUF2QyxDQUEyQ3AvQixHQUEzQyxDQUFrRCxDQUVqRCxLQUFLbWdDLFFBQUwsQ0FBY2hoQyxJQUFkLENBQW9CZ2hDLFNBQVVuZ0MsQ0FBVixFQUFjMmtCLEtBQWQsRUFBcEIsRUFFQSxDQUVEO0VBRUEsV0FBYTNmLE9BQU84NEMsTUFBcEIsQ0FFQSxJQUFNOTlDLEVBQUksQ0FBSixDQUFPby9CLEdBQUswZSxPQUFPbitDLE1BQXpCLENBQWlDSyxFQUFJby9CLEVBQXJDLENBQXlDcC9CLEdBQXpDLENBQWdELENBRS9DLEtBQUs4OUMsTUFBTCxDQUFZMytDLElBQVosQ0FBa0IyK0MsT0FBUTk5QyxDQUFSLEVBQVkya0IsS0FBWixFQUFsQixFQUVBLENBRUQ7RUFFQSxVQUFZM2YsT0FBTys0QyxLQUFuQixDQUVBLElBQU0vOUMsRUFBSSxDQUFKLENBQU9vL0IsR0FBSzJlLE1BQU1wK0MsTUFBeEIsQ0FBZ0NLLEVBQUlvL0IsRUFBcEMsQ0FBd0NwL0IsR0FBeEMsQ0FBK0MsQ0FFOUMsS0FBSys5QyxLQUFMLENBQVc1K0MsSUFBWCxDQUFpQjQrQyxNQUFPLzlDLENBQVAsRUFBVzJrQixLQUFYLEVBQWpCLEVBRUEsQ0FFRDtFQUVBLElBQU0za0IsRUFBSSxDQUFKLENBQU9vL0IsR0FBS3A2QixPQUFPZzVDLGFBQVAsQ0FBcUJyK0MsTUFBdkMsQ0FBK0NLLEVBQUlvL0IsRUFBbkQsQ0FBdURwL0IsR0FBdkQsQ0FBOEQsQ0FFN0Qsa0JBQW9CZ0YsT0FBT2c1QyxhQUFQLENBQXNCaCtDLENBQXRCLENBQXBCLENBRUEsR0FBSyxLQUFLZytDLGFBQUwsQ0FBb0JoK0MsQ0FBcEIsSUFBNEIxQixTQUFqQyxDQUE2QyxDQUU1QyxLQUFLMC9DLGFBQUwsQ0FBb0JoK0MsQ0FBcEIsRUFBMEIsRUFBMUIsQ0FFQSxDQUVELElBQU00YixFQUFJLENBQUosQ0FBT3FqQyxHQUFLakIsY0FBY3IrQyxNQUFoQyxDQUF3Q2ljLEVBQUlxakMsRUFBNUMsQ0FBZ0RyakMsR0FBaEQsQ0FBdUQsQ0FFdEQsUUFBVW9pQyxjQUFlcGlDLENBQWYsQ0FBVixDQUE4QnVvQyxRQUFVLEVBQXhDLENBRUEsSUFBTXJvQyxFQUFJLENBQUosQ0FBT29vQyxHQUFLekUsSUFBSTkvQyxNQUF0QixDQUE4Qm1jLEVBQUlvb0MsRUFBbEMsQ0FBc0Nwb0MsR0FBdEMsQ0FBNkMsQ0FFNUMsT0FBUzJqQyxJQUFLM2pDLENBQUwsQ0FBVCxDQUVBcW9DLFFBQVFobEQsSUFBUixDQUFjdzlCLEdBQUdoWSxLQUFILEVBQWQsRUFFQSxDQUVELEtBQUtxNUIsYUFBTCxDQUFvQmgrQyxDQUFwQixFQUF3QmIsSUFBeEIsQ0FBOEJnbEQsT0FBOUIsRUFFQSxDQUVELENBRUQ7RUFFQSxpQkFBbUJuL0MsT0FBT2k1QyxZQUExQixDQUVBLElBQU1qK0MsRUFBSSxDQUFKLENBQU9vL0IsR0FBSzZlLGFBQWF0K0MsTUFBL0IsQ0FBdUNLLEVBQUlvL0IsRUFBM0MsQ0FBK0NwL0IsR0FBL0MsQ0FBc0QsQ0FFckQsZ0JBQWtCLEVBQWxCLENBQ0Fva0QsWUFBWXBvRCxJQUFaLENBQW1CaWlELGFBQWNqK0MsQ0FBZCxFQUFrQmhFLElBQXJDLENBRUE7RUFFQSxHQUFLaWlELGFBQWNqK0MsQ0FBZCxFQUFrQm1nQyxRQUFsQixHQUErQjdoQyxTQUFwQyxDQUFnRCxDQUUvQzhsRCxZQUFZamtCLFFBQVosQ0FBdUIsRUFBdkIsQ0FFQSxJQUFNdmtCLEVBQUksQ0FBSixDQUFPcWpDLEdBQUtoQixhQUFjaitDLENBQWQsRUFBa0JtZ0MsUUFBbEIsQ0FBMkJ4Z0MsTUFBN0MsQ0FBcURpYyxFQUFJcWpDLEVBQXpELENBQTZEcmpDLEdBQTdELENBQW9FLENBRW5Fd29DLFlBQVlqa0IsUUFBWixDQUFxQmhoQyxJQUFyQixDQUEyQjgrQyxhQUFjaitDLENBQWQsRUFBa0JtZ0MsUUFBbEIsQ0FBNEJ2a0IsQ0FBNUIsRUFBZ0MrSSxLQUFoQyxFQUEzQixFQUVBLENBRUQsQ0FFRDtFQUVBLEdBQUtzNUIsYUFBY2orQyxDQUFkLEVBQWtCdS9DLE9BQWxCLEdBQThCamhELFNBQW5DLENBQStDLENBRTlDOGxELFlBQVk3RSxPQUFaLENBQXNCLEVBQXRCLENBRUEsSUFBTTNqQyxFQUFJLENBQUosQ0FBT3FqQyxHQUFLaEIsYUFBY2orQyxDQUFkLEVBQWtCdS9DLE9BQWxCLENBQTBCNS9DLE1BQTVDLENBQW9EaWMsRUFBSXFqQyxFQUF4RCxDQUE0RHJqQyxHQUE1RCxDQUFtRSxDQUVsRXdvQyxZQUFZN0UsT0FBWixDQUFvQnBnRCxJQUFwQixDQUEwQjgrQyxhQUFjaitDLENBQWQsRUFBa0J1L0MsT0FBbEIsQ0FBMkIzakMsQ0FBM0IsRUFBK0IrSSxLQUEvQixFQUExQixFQUVBLENBRUQsQ0FFRCxLQUFLczVCLFlBQUwsQ0FBa0I5K0MsSUFBbEIsQ0FBd0JpbEQsV0FBeEIsRUFFQSxDQUVEO0VBRUEsaUJBQW1CcC9DLE9BQU9rNUMsWUFBMUIsQ0FFQSxJQUFNbCtDLEVBQUksQ0FBSixDQUFPby9CLEdBQUs4ZSxhQUFhditDLE1BQS9CLENBQXVDSyxFQUFJby9CLEVBQTNDLENBQStDcC9CLEdBQS9DLENBQXNELENBRXJELGdCQUFrQixFQUFsQixDQUVBO0VBRUEsR0FBS2srQyxhQUFjbCtDLENBQWQsRUFBa0IwOUMsYUFBbEIsR0FBb0NwL0MsU0FBekMsQ0FBcUQsQ0FFcEQrbEQsWUFBWTNHLGFBQVosQ0FBNEIsRUFBNUIsQ0FFQSxJQUFNOWhDLEVBQUksQ0FBSixDQUFPcWpDLEdBQUtmLGFBQWNsK0MsQ0FBZCxFQUFrQjA5QyxhQUFsQixDQUFnQy85QyxNQUFsRCxDQUEwRGljLEVBQUlxakMsRUFBOUQsQ0FBa0VyakMsR0FBbEUsQ0FBeUUsQ0FFeEUsb0JBQXNCc2lDLGFBQWNsK0MsQ0FBZCxFQUFrQjA5QyxhQUFsQixDQUFpQzloQyxDQUFqQyxDQUF0QixDQUNBLHFCQUF1QixFQUF2QixDQUVBMG9DLGlCQUFpQjVoRCxDQUFqQixDQUFxQjZoRCxnQkFBZ0I3aEQsQ0FBaEIsQ0FBa0JpaUIsS0FBbEIsRUFBckIsQ0FDQTIvQixpQkFBaUI5aEQsQ0FBakIsQ0FBcUIraEQsZ0JBQWdCL2hELENBQWhCLENBQWtCbWlCLEtBQWxCLEVBQXJCLENBQ0EyL0IsaUJBQWlCbmhELENBQWpCLENBQXFCb2hELGdCQUFnQnBoRCxDQUFoQixDQUFrQndoQixLQUFsQixFQUFyQixDQUVBMC9CLFlBQVkzRyxhQUFaLENBQTBCditDLElBQTFCLENBQWdDbWxELGdCQUFoQyxFQUVBLENBRUQsQ0FFRDtFQUVBLEdBQUtwRyxhQUFjbCtDLENBQWQsRUFBa0IrZ0QsV0FBbEIsR0FBa0N6aUQsU0FBdkMsQ0FBbUQsQ0FFbEQrbEQsWUFBWXRELFdBQVosQ0FBMEIsRUFBMUIsQ0FFQSxJQUFNbmxDLEVBQUksQ0FBSixDQUFPcWpDLEdBQUtmLGFBQWNsK0MsQ0FBZCxFQUFrQitnRCxXQUFsQixDQUE4QnBoRCxNQUFoRCxDQUF3RGljLEVBQUlxakMsRUFBNUQsQ0FBZ0VyakMsR0FBaEUsQ0FBdUUsQ0FFdEV5b0MsWUFBWXRELFdBQVosQ0FBd0I1aEQsSUFBeEIsQ0FBOEIrK0MsYUFBY2wrQyxDQUFkLEVBQWtCK2dELFdBQWxCLENBQStCbmxDLENBQS9CLEVBQW1DK0ksS0FBbkMsRUFBOUIsRUFFQSxDQUVELENBRUQsS0FBS3U1QixZQUFMLENBQWtCLytDLElBQWxCLENBQXdCa2xELFdBQXhCLEVBRUEsQ0FFRDtFQUVBLGdCQUFrQnIvQyxPQUFPbTVDLFdBQXpCLENBRUEsSUFBTW4rQyxFQUFJLENBQUosQ0FBT28vQixHQUFLK2UsWUFBWXgrQyxNQUE5QixDQUFzQ0ssRUFBSW8vQixFQUExQyxDQUE4Q3AvQixHQUE5QyxDQUFxRCxDQUVwRCxLQUFLbStDLFdBQUwsQ0FBaUJoL0MsSUFBakIsQ0FBdUJnL0MsWUFBYW4rQyxDQUFiLEVBQWlCMmtCLEtBQWpCLEVBQXZCLEVBRUEsQ0FFRDtFQUVBLGdCQUFrQjNmLE9BQU9vNUMsV0FBekIsQ0FFQSxJQUFNcCtDLEVBQUksQ0FBSixDQUFPby9CLEdBQUtnZixZQUFZeitDLE1BQTlCLENBQXNDSyxFQUFJby9CLEVBQTFDLENBQThDcC9CLEdBQTlDLENBQXFELENBRXBELEtBQUtvK0MsV0FBTCxDQUFpQmovQyxJQUFqQixDQUF1QmkvQyxZQUFhcCtDLENBQWIsRUFBaUIya0IsS0FBakIsRUFBdkIsRUFFQSxDQUVEO0VBRUEsa0JBQW9CM2YsT0FBT3E1QyxhQUEzQixDQUVBLElBQU1yK0MsRUFBSSxDQUFKLENBQU9vL0IsR0FBS2lmLGNBQWMxK0MsTUFBaEMsQ0FBd0NLLEVBQUlvL0IsRUFBNUMsQ0FBZ0RwL0IsR0FBaEQsQ0FBdUQsQ0FFdEQsS0FBS3ErQyxhQUFMLENBQW1CbC9DLElBQW5CLENBQXlCay9DLGNBQWVyK0MsQ0FBZixDQUF6QixFQUVBLENBRUQ7RUFFQSxnQkFBa0JnRixPQUFPczVDLFdBQXpCLENBRUEsR0FBS0EsY0FBZ0IsSUFBckIsQ0FBNEIsQ0FFM0IsS0FBS0EsV0FBTCxDQUFtQkEsWUFBWTM1QixLQUFaLEVBQW5CLENBRUEsQ0FFRDtFQUVBLG1CQUFxQjNmLE9BQU8wZ0MsY0FBNUIsQ0FFQSxHQUFLQSxpQkFBbUIsSUFBeEIsQ0FBK0IsQ0FFOUIsS0FBS0EsY0FBTCxDQUFzQkEsZUFBZS9nQixLQUFmLEVBQXRCLENBRUEsQ0FFRDtFQUVBLEtBQUs0NUIsa0JBQUwsQ0FBMEJ2NUMsT0FBT3U1QyxrQkFBakMsQ0FDQSxLQUFLQyxrQkFBTCxDQUEwQng1QyxPQUFPdzVDLGtCQUFqQyxDQUNBLEtBQUtDLGFBQUwsQ0FBcUJ6NUMsT0FBT3k1QyxhQUE1QixDQUNBLEtBQUtDLGlCQUFMLENBQXlCMTVDLE9BQU8wNUMsaUJBQWhDLENBQ0EsS0FBS0MsZ0JBQUwsQ0FBd0IzNUMsT0FBTzI1QyxnQkFBL0IsQ0FDQSxLQUFLQyx1QkFBTCxDQUErQjU1QyxPQUFPNDVDLHVCQUF0QyxDQUNBLEtBQUtDLGdCQUFMLENBQXdCNzVDLE9BQU82NUMsZ0JBQS9CLENBRUEsV0FBQSxDQUVBLENBejFDOEUsQ0EyMUMvRXBpQixRQUFTLFVBQVksQ0FFcEIsS0FBS2xiLGFBQUwsQ0FBb0IsQ0FBRTVtQixLQUFNLFNBQVIsQ0FBcEIsRUFFQSxDQS8xQzhFLENBQTNELENBQXJCLENBbTJDQTs7S0FJQSx3QkFBQSxDQUEwQm9sQixLQUExQixDQUFpQ3lrQyxRQUFqQyxDQUEyQ0MsVUFBM0MsQ0FBd0QsQ0FFdkQsR0FBSzMzQyxNQUFNeU0sT0FBTixDQUFld0csS0FBZixDQUFMLENBQThCLENBRTdCLG1CQUFNLENBQWUsdURBQWYsQ0FBTixDQUVBLENBRUQsS0FBSy9qQixJQUFMLENBQVksRUFBWixDQUVBLEtBQUsrakIsS0FBTCxDQUFhQSxLQUFiLENBQ0EsS0FBS3lrQyxRQUFMLENBQWdCQSxRQUFoQixDQUNBLEtBQUs5MUIsS0FBTCxDQUFhM08sUUFBVXpoQixTQUFWLENBQXNCeWhCLE1BQU1wZ0IsTUFBTixDQUFlNmtELFFBQXJDLENBQWdELENBQTdELENBQ0EsS0FBS0MsVUFBTCxDQUFrQkEsYUFBZSxJQUFqQyxDQUVBLEtBQUszTyxPQUFMLENBQWUsS0FBZixDQUNBLEtBQUtrQixXQUFMLENBQW1CLENBQUUxdkIsT0FBUSxDQUFWLENBQWFvSCxNQUFPLENBQUUsQ0FBdEIsQ0FBbkIsQ0FFQSxLQUFLNXJCLE9BQUwsQ0FBZSxDQUFmLENBRUEsQ0FFRDdKLE9BQU93SyxjQUFQLENBQXVCaWhELGdCQUFnQnhyRCxTQUF2QyxDQUFrRCxhQUFsRCxDQUFpRSxDQUVoRW9YLElBQUssU0FBVzNULEtBQVgsQ0FBbUIsQ0FFdkIsR0FBS0EsUUFBVSxJQUFmLENBQXNCLEtBQUttRyxPQUFMLEdBRXRCLENBTitELENBQWpFLEVBVUE3SixPQUFPNG5CLE1BQVAsQ0FBZTZqQyxnQkFBZ0J4ckQsU0FBL0IsQ0FBMEMsQ0FFekN5ckQsa0JBQW1CLElBRnNCLENBSXpDck8saUJBQWtCLFVBQVksRUFKVyxDQU16Q3NPLFNBQVUsU0FBVzdrQyxLQUFYLENBQW1CLENBRTVCLEdBQUtqVCxNQUFNeU0sT0FBTixDQUFld0csS0FBZixDQUFMLENBQThCLENBRTdCLG1CQUFNLENBQWUsdURBQWYsQ0FBTixDQUVBLENBRUQsS0FBSzJPLEtBQUwsQ0FBYTNPLFFBQVV6aEIsU0FBVixDQUFzQnloQixNQUFNcGdCLE1BQU4sQ0FBZSxLQUFLNmtELFFBQTFDLENBQXFELENBQWxFLENBQ0EsS0FBS3prQyxLQUFMLENBQWFBLEtBQWIsQ0FFQSxXQUFBLENBRUEsQ0FuQndDLENBcUJ6QzhrQyxXQUFZLFNBQVdsb0QsS0FBWCxDQUFtQixDQUU5QixLQUFLbTVDLE9BQUwsQ0FBZW41QyxLQUFmLENBRUEsV0FBQSxDQUVBLENBM0J3QyxDQTZCekNpb0IsS0FBTSxTQUFXNWYsTUFBWCxDQUFvQixDQUV6QixLQUFLaEosSUFBTCxDQUFZZ0osT0FBT2hKLElBQW5CLENBQ0EsS0FBSytqQixLQUFMLENBQWEsV0FBV0EsS0FBUCxDQUFhdmtCLFdBQWpCLENBQThCd0osT0FBTythLEtBQXJDLENBQWIsQ0FDQSxLQUFLeWtDLFFBQUwsQ0FBZ0J4L0MsT0FBT3cvQyxRQUF2QixDQUNBLEtBQUs5MUIsS0FBTCxDQUFhMXBCLE9BQU8wcEIsS0FBcEIsQ0FDQSxLQUFLKzFCLFVBQUwsQ0FBa0J6L0MsT0FBT3kvQyxVQUF6QixDQUVBLEtBQUszTyxPQUFMLENBQWU5d0MsT0FBTzh3QyxPQUF0QixDQUVBLFdBQUEsQ0FFQSxDQXpDd0MsQ0EyQ3pDZ1AsT0FBUSxTQUFXQyxNQUFYLENBQW1CdDlCLFNBQW5CLENBQThCdTlCLE1BQTlCLENBQXVDLENBRTlDRCxRQUFVLEtBQUtQLFFBQWYsQ0FDQVEsUUFBVXY5QixVQUFVKzhCLFFBQXBCLENBRUEsSUFBTSxNQUFRLENBQVIsQ0FBVy9oRCxFQUFJLEtBQUsraEQsUUFBMUIsQ0FBb0N4a0QsRUFBSXlDLENBQXhDLENBQTJDekMsR0FBM0MsQ0FBa0QsQ0FFakQsS0FBSytmLEtBQUwsQ0FBWWdsQyxPQUFTL2tELENBQXJCLEVBQTJCeW5CLFVBQVUxSCxLQUFWLENBQWlCaWxDLE9BQVNobEQsQ0FBMUIsQ0FBM0IsQ0FFQSxDQUVELFdBQUEsQ0FFQSxDQXhEd0MsQ0EwRHpDaWxELFVBQVcsU0FBV2xsQyxLQUFYLENBQW1CLENBRTdCLEtBQUtBLEtBQUwsQ0FBV3pQLEdBQVgsQ0FBZ0J5UCxLQUFoQixFQUVBLFdBQUEsQ0FFQSxDQWhFd0MsQ0FrRXpDbWxDLGdCQUFpQixTQUFXcEgsTUFBWCxDQUFvQixDQUVwQyxVQUFZLEtBQUsvOUIsS0FBakIsQ0FBd0J1SCxPQUFTLENBQWpDLENBRUEsSUFBTSxNQUFRLENBQVIsQ0FBVzdrQixFQUFJcTdDLE9BQU9uK0MsTUFBNUIsQ0FBb0NLLEVBQUl5QyxDQUF4QyxDQUEyQ3pDLEdBQTNDLENBQWtELENBRWpELFVBQVk4OUMsT0FBUTk5QyxDQUFSLENBQVosQ0FFQSxHQUFLa3VDLFFBQVU1dkMsU0FBZixDQUEyQixDQUUxQjJXLFFBQVE2UCxJQUFSLENBQWMsNkRBQWQsQ0FBNkU5a0IsQ0FBN0UsRUFDQWt1QyxNQUFRLFNBQUEsRUFBUixDQUVBLENBRURudUIsTUFBT3VILFFBQVAsRUFBcUI0bUIsTUFBTXozQixDQUEzQixDQUNBc0osTUFBT3VILFFBQVAsRUFBcUI0bUIsTUFBTTVzQyxDQUEzQixDQUNBeWUsTUFBT3VILFFBQVAsRUFBcUI0bUIsTUFBTTFyQyxDQUEzQixDQUVBLENBRUQsV0FBQSxDQUVBLENBekZ3QyxDQTJGekMyaUQsa0JBQW1CLFNBQVdDLE9BQVgsQ0FBcUIsQ0FFdkMsVUFBWSxLQUFLcmxDLEtBQWpCLENBQXdCdUgsT0FBUyxDQUFqQyxDQUVBLElBQU0sTUFBUSxDQUFSLENBQVc3a0IsRUFBSTJpRCxRQUFRemxELE1BQTdCLENBQXFDSyxFQUFJeUMsQ0FBekMsQ0FBNEN6QyxHQUE1QyxDQUFtRCxDQUVsRCxXQUFhb2xELFFBQVNwbEQsQ0FBVCxDQUFiLENBRUEsR0FBSyt3QixTQUFXenlCLFNBQWhCLENBQTRCLENBRTNCMlcsUUFBUTZQLElBQVIsQ0FBYyxnRUFBZCxDQUFnRjlrQixDQUFoRixFQUNBK3dCLE9BQVMsV0FBQSxFQUFULENBRUEsQ0FFRGhSLE1BQU91SCxRQUFQLEVBQXFCeUosT0FBT3hlLENBQTVCLENBQ0F3TixNQUFPdUgsUUFBUCxFQUFxQnlKLE9BQU9oTyxDQUE1QixDQUVBLENBRUQsV0FBQSxDQUVBLENBakh3QyxDQW1IekNzaUMsa0JBQW1CLFNBQVdELE9BQVgsQ0FBcUIsQ0FFdkMsVUFBWSxLQUFLcmxDLEtBQWpCLENBQXdCdUgsT0FBUyxDQUFqQyxDQUVBLElBQU0sTUFBUSxDQUFSLENBQVc3a0IsRUFBSTJpRCxRQUFRemxELE1BQTdCLENBQXFDSyxFQUFJeUMsQ0FBekMsQ0FBNEN6QyxHQUE1QyxDQUFtRCxDQUVsRCxXQUFhb2xELFFBQVNwbEQsQ0FBVCxDQUFiLENBRUEsR0FBSyt3QixTQUFXenlCLFNBQWhCLENBQTRCLENBRTNCMlcsUUFBUTZQLElBQVIsQ0FBYyxnRUFBZCxDQUFnRjlrQixDQUFoRixFQUNBK3dCLE9BQVMsV0FBQSxFQUFULENBRUEsQ0FFRGhSLE1BQU91SCxRQUFQLEVBQXFCeUosT0FBT3hlLENBQTVCLENBQ0F3TixNQUFPdUgsUUFBUCxFQUFxQnlKLE9BQU9oTyxDQUE1QixDQUNBaEQsTUFBT3VILFFBQVAsRUFBcUJ5SixPQUFPbkgsQ0FBNUIsQ0FFQSxDQUVELFdBQUEsQ0FFQSxDQTFJd0MsQ0E0SXpDMDdCLGtCQUFtQixTQUFXRixPQUFYLENBQXFCLENBRXZDLFVBQVksS0FBS3JsQyxLQUFqQixDQUF3QnVILE9BQVMsQ0FBakMsQ0FFQSxJQUFNLE1BQVEsQ0FBUixDQUFXN2tCLEVBQUkyaUQsUUFBUXpsRCxNQUE3QixDQUFxQ0ssRUFBSXlDLENBQXpDLENBQTRDekMsR0FBNUMsQ0FBbUQsQ0FFbEQsV0FBYW9sRCxRQUFTcGxELENBQVQsQ0FBYixDQUVBLEdBQUsrd0IsU0FBV3p5QixTQUFoQixDQUE0QixDQUUzQjJXLFFBQVE2UCxJQUFSLENBQWMsZ0VBQWQsQ0FBZ0Y5a0IsQ0FBaEYsRUFDQSt3QixPQUFTLFdBQUEsRUFBVCxDQUVBLENBRURoUixNQUFPdUgsUUFBUCxFQUFxQnlKLE9BQU94ZSxDQUE1QixDQUNBd04sTUFBT3VILFFBQVAsRUFBcUJ5SixPQUFPaE8sQ0FBNUIsQ0FDQWhELE1BQU91SCxRQUFQLEVBQXFCeUosT0FBT25ILENBQTVCLENBQ0E3SixNQUFPdUgsUUFBUCxFQUFxQnlKLE9BQU96WSxDQUE1QixDQUVBLENBRUQsV0FBQSxDQUVBLENBcEt3QyxDQXNLekNoSSxJQUFLLFNBQVczVCxLQUFYLENBQWtCMnFCLE1BQWxCLENBQTJCLENBRS9CLEdBQUtBLFNBQVdocEIsU0FBaEIsQ0FBNEJncEIsT0FBUyxDQUFULENBRTVCLEtBQUt2SCxLQUFMLENBQVd6UCxHQUFYLENBQWdCM1QsS0FBaEIsQ0FBdUIycUIsTUFBdkIsRUFFQSxXQUFBLENBRUEsQ0E5S3dDLENBZ0x6Q0ksS0FBTSxTQUFXOWdCLEtBQVgsQ0FBbUIsQ0FFeEIsWUFBWW1aLEtBQUwsQ0FBWW5aLE1BQVEsS0FBSzQ5QyxRQUF6QixDQUFQLENBRUEsQ0FwTHdDLENBc0x6Q2pnQyxLQUFNLFNBQVczZCxLQUFYLENBQWtCMkwsQ0FBbEIsQ0FBc0IsQ0FFM0IsS0FBS3dOLEtBQUwsQ0FBWW5aLE1BQVEsS0FBSzQ5QyxRQUF6QixFQUFzQ2p5QyxDQUF0QyxDQUVBLFdBQUEsQ0FFQSxDQTVMd0MsQ0E4THpDb1YsS0FBTSxTQUFXL2dCLEtBQVgsQ0FBbUIsQ0FFeEIsWUFBWW1aLEtBQUwsQ0FBWW5aLE1BQVEsS0FBSzQ5QyxRQUFiLENBQXdCLENBQXBDLENBQVAsQ0FFQSxDQWxNd0MsQ0FvTXpDaGdDLEtBQU0sU0FBVzVkLEtBQVgsQ0FBa0JtYyxDQUFsQixDQUFzQixDQUUzQixLQUFLaEQsS0FBTCxDQUFZblosTUFBUSxLQUFLNDlDLFFBQWIsQ0FBd0IsQ0FBcEMsRUFBMEN6aEMsQ0FBMUMsQ0FFQSxXQUFBLENBRUEsQ0ExTXdDLENBNE16QzRMLEtBQU0sU0FBVy9uQixLQUFYLENBQW1CLENBRXhCLFlBQVltWixLQUFMLENBQVluWixNQUFRLEtBQUs0OUMsUUFBYixDQUF3QixDQUFwQyxDQUFQLENBRUEsQ0FoTndDLENBa056Q2x1QixLQUFNLFNBQVcxdkIsS0FBWCxDQUFrQmdqQixDQUFsQixDQUFzQixDQUUzQixLQUFLN0osS0FBTCxDQUFZblosTUFBUSxLQUFLNDlDLFFBQWIsQ0FBd0IsQ0FBcEMsRUFBMEM1NkIsQ0FBMUMsQ0FFQSxXQUFBLENBRUEsQ0F4TndDLENBME56Q3VULEtBQU0sU0FBV3YyQixLQUFYLENBQW1CLENBRXhCLFlBQVltWixLQUFMLENBQVluWixNQUFRLEtBQUs0OUMsUUFBYixDQUF3QixDQUFwQyxDQUFQLENBRUEsQ0E5TndDLENBZ096QzFuQixLQUFNLFNBQVdsMkIsS0FBWCxDQUFrQjBSLENBQWxCLENBQXNCLENBRTNCLEtBQUt5SCxLQUFMLENBQVluWixNQUFRLEtBQUs0OUMsUUFBYixDQUF3QixDQUFwQyxFQUEwQ2xzQyxDQUExQyxDQUVBLFdBQUEsQ0FFQSxDQXRPd0MsQ0F3T3pDaXRDLE1BQU8sU0FBVzMrQyxLQUFYLENBQWtCMkwsQ0FBbEIsQ0FBcUJ3USxDQUFyQixDQUF5QixDQUUvQm5jLE9BQVMsS0FBSzQ5QyxRQUFkLENBRUEsS0FBS3prQyxLQUFMLENBQVluWixNQUFRLENBQXBCLEVBQTBCMkwsQ0FBMUIsQ0FDQSxLQUFLd04sS0FBTCxDQUFZblosTUFBUSxDQUFwQixFQUEwQm1jLENBQTFCLENBRUEsV0FBQSxDQUVBLENBalB3QyxDQW1QekM4TCxPQUFRLFNBQVdqb0IsS0FBWCxDQUFrQjJMLENBQWxCLENBQXFCd1EsQ0FBckIsQ0FBd0I2RyxDQUF4QixDQUE0QixDQUVuQ2hqQixPQUFTLEtBQUs0OUMsUUFBZCxDQUVBLEtBQUt6a0MsS0FBTCxDQUFZblosTUFBUSxDQUFwQixFQUEwQjJMLENBQTFCLENBQ0EsS0FBS3dOLEtBQUwsQ0FBWW5aLE1BQVEsQ0FBcEIsRUFBMEJtYyxDQUExQixDQUNBLEtBQUtoRCxLQUFMLENBQVluWixNQUFRLENBQXBCLEVBQTBCZ2pCLENBQTFCLENBRUEsV0FBQSxDQUVBLENBN1B3QyxDQStQekM0N0IsUUFBUyxTQUFXNStDLEtBQVgsQ0FBa0IyTCxDQUFsQixDQUFxQndRLENBQXJCLENBQXdCNkcsQ0FBeEIsQ0FBMkJ0UixDQUEzQixDQUErQixDQUV2QzFSLE9BQVMsS0FBSzQ5QyxRQUFkLENBRUEsS0FBS3prQyxLQUFMLENBQVluWixNQUFRLENBQXBCLEVBQTBCMkwsQ0FBMUIsQ0FDQSxLQUFLd04sS0FBTCxDQUFZblosTUFBUSxDQUFwQixFQUEwQm1jLENBQTFCLENBQ0EsS0FBS2hELEtBQUwsQ0FBWW5aLE1BQVEsQ0FBcEIsRUFBMEJnakIsQ0FBMUIsQ0FDQSxLQUFLN0osS0FBTCxDQUFZblosTUFBUSxDQUFwQixFQUEwQjBSLENBQTFCLENBRUEsV0FBQSxDQUVBLENBMVF3QyxDQTRRekNtdEMsU0FBVSxTQUFXdHZCLFFBQVgsQ0FBc0IsQ0FFL0IsS0FBS21nQixnQkFBTCxDQUF3Qm5nQixRQUF4QixDQUVBLFdBQUEsQ0FFQSxDQWxSd0MsQ0FvUnpDeFIsTUFBTyxVQUFZLENBRWxCLGdCQUFnQm5wQixXQUFULENBQXNCLEtBQUt1a0IsS0FBM0IsQ0FBa0MsS0FBS3lrQyxRQUF2QyxFQUFrRDUvQixJQUFsRCxDQUF3RCxJQUF4RCxDQUFQLENBRUEsQ0F4UndDLENBQTFDLEVBNFJBO0VBRUEsNEJBQUEsQ0FBOEI3RSxLQUE5QixDQUFxQ3lrQyxRQUFyQyxDQUErQ0MsVUFBL0MsQ0FBNEQsQ0FFM0RDLGdCQUFnQjlwRCxJQUFoQixDQUFzQixJQUF0QixDQUE0QixhQUFBLENBQWVtbEIsS0FBZixDQUE1QixDQUFvRHlrQyxRQUFwRCxDQUE4REMsVUFBOUQsRUFFQSxDQUVEaUIsb0JBQW9CeHNELFNBQXBCLENBQWdDRCxPQUFPaUIsTUFBUCxDQUFld3FELGdCQUFnQnhyRCxTQUEvQixDQUFoQyxDQUNBd3NELG9CQUFvQnhzRCxTQUFwQixDQUE4QnNDLFdBQTlCLENBQTRDa3FELG1CQUE1QyxDQUdBLDZCQUFBLENBQStCM2xDLEtBQS9CLENBQXNDeWtDLFFBQXRDLENBQWdEQyxVQUFoRCxDQUE2RCxDQUU1REMsZ0JBQWdCOXBELElBQWhCLENBQXNCLElBQXRCLENBQTRCLGNBQUEsQ0FBZ0JtbEIsS0FBaEIsQ0FBNUIsQ0FBcUR5a0MsUUFBckQsQ0FBK0RDLFVBQS9ELEVBRUEsQ0FFRGtCLHFCQUFxQnpzRCxTQUFyQixDQUFpQ0QsT0FBT2lCLE1BQVAsQ0FBZXdxRCxnQkFBZ0J4ckQsU0FBL0IsQ0FBakMsQ0FDQXlzRCxxQkFBcUJ6c0QsU0FBckIsQ0FBK0JzQyxXQUEvQixDQUE2Q21xRCxvQkFBN0MsQ0FHQSxvQ0FBQSxDQUFzQzVsQyxLQUF0QyxDQUE2Q3lrQyxRQUE3QyxDQUF1REMsVUFBdkQsQ0FBb0UsQ0FFbkVDLGdCQUFnQjlwRCxJQUFoQixDQUFzQixJQUF0QixDQUE0QixxQkFBQSxDQUF1Qm1sQixLQUF2QixDQUE1QixDQUE0RHlrQyxRQUE1RCxDQUFzRUMsVUFBdEUsRUFFQSxDQUVEbUIsNEJBQTRCMXNELFNBQTVCLENBQXdDRCxPQUFPaUIsTUFBUCxDQUFld3FELGdCQUFnQnhyRCxTQUEvQixDQUF4QyxDQUNBMHNELDRCQUE0QjFzRCxTQUE1QixDQUFzQ3NDLFdBQXRDLENBQW9Eb3FELDJCQUFwRCxDQUdBLDZCQUFBLENBQStCN2xDLEtBQS9CLENBQXNDeWtDLFFBQXRDLENBQWdEQyxVQUFoRCxDQUE2RCxDQUU1REMsZ0JBQWdCOXBELElBQWhCLENBQXNCLElBQXRCLENBQTRCLGNBQUEsQ0FBZ0JtbEIsS0FBaEIsQ0FBNUIsQ0FBcUR5a0MsUUFBckQsQ0FBK0RDLFVBQS9ELEVBRUEsQ0FFRG9CLHFCQUFxQjNzRCxTQUFyQixDQUFpQ0QsT0FBT2lCLE1BQVAsQ0FBZXdxRCxnQkFBZ0J4ckQsU0FBL0IsQ0FBakMsQ0FDQTJzRCxxQkFBcUIzc0QsU0FBckIsQ0FBK0JzQyxXQUEvQixDQUE2Q3FxRCxvQkFBN0MsQ0FHQSw4QkFBQSxDQUFnQzlsQyxLQUFoQyxDQUF1Q3lrQyxRQUF2QyxDQUFpREMsVUFBakQsQ0FBOEQsQ0FFN0RDLGdCQUFnQjlwRCxJQUFoQixDQUFzQixJQUF0QixDQUE0QixlQUFBLENBQWlCbWxCLEtBQWpCLENBQTVCLENBQXNEeWtDLFFBQXRELENBQWdFQyxVQUFoRSxFQUVBLENBRURxQixzQkFBc0I1c0QsU0FBdEIsQ0FBa0NELE9BQU9pQixNQUFQLENBQWV3cUQsZ0JBQWdCeHJELFNBQS9CLENBQWxDLENBQ0E0c0Qsc0JBQXNCNXNELFNBQXRCLENBQWdDc0MsV0FBaEMsQ0FBOENzcUQscUJBQTlDLENBR0EsNkJBQUEsQ0FBK0IvbEMsS0FBL0IsQ0FBc0N5a0MsUUFBdEMsQ0FBZ0RDLFVBQWhELENBQTZELENBRTVEQyxnQkFBZ0I5cEQsSUFBaEIsQ0FBc0IsSUFBdEIsQ0FBNEIsY0FBQSxDQUFnQm1sQixLQUFoQixDQUE1QixDQUFxRHlrQyxRQUFyRCxDQUErREMsVUFBL0QsRUFFQSxDQUVEc0IscUJBQXFCN3NELFNBQXJCLENBQWlDRCxPQUFPaUIsTUFBUCxDQUFld3FELGdCQUFnQnhyRCxTQUEvQixDQUFqQyxDQUNBNnNELHFCQUFxQjdzRCxTQUFyQixDQUErQnNDLFdBQS9CLENBQTZDdXFELG9CQUE3QyxDQUdBLDhCQUFBLENBQWdDaG1DLEtBQWhDLENBQXVDeWtDLFFBQXZDLENBQWlEQyxVQUFqRCxDQUE4RCxDQUU3REMsZ0JBQWdCOXBELElBQWhCLENBQXNCLElBQXRCLENBQTRCLGVBQUEsQ0FBaUJtbEIsS0FBakIsQ0FBNUIsQ0FBc0R5a0MsUUFBdEQsQ0FBZ0VDLFVBQWhFLEVBRUEsQ0FFRHVCLHNCQUFzQjlzRCxTQUF0QixDQUFrQ0QsT0FBT2lCLE1BQVAsQ0FBZXdxRCxnQkFBZ0J4ckQsU0FBL0IsQ0FBbEMsQ0FDQThzRCxzQkFBc0I5c0QsU0FBdEIsQ0FBZ0NzQyxXQUFoQyxDQUE4Q3dxRCxxQkFBOUMsQ0FHQSwrQkFBQSxDQUFpQ2ptQyxLQUFqQyxDQUF3Q3lrQyxRQUF4QyxDQUFrREMsVUFBbEQsQ0FBK0QsQ0FFOURDLGdCQUFnQjlwRCxJQUFoQixDQUFzQixJQUF0QixDQUE0QixnQkFBQSxDQUFrQm1sQixLQUFsQixDQUE1QixDQUF1RHlrQyxRQUF2RCxDQUFpRUMsVUFBakUsRUFFQSxDQUVEd0IsdUJBQXVCL3NELFNBQXZCLENBQW1DRCxPQUFPaUIsTUFBUCxDQUFld3FELGdCQUFnQnhyRCxTQUEvQixDQUFuQyxDQUNBK3NELHVCQUF1Qi9zRCxTQUF2QixDQUFpQ3NDLFdBQWpDLENBQStDeXFELHNCQUEvQyxDQUdBLCtCQUFBLENBQWlDbG1DLEtBQWpDLENBQXdDeWtDLFFBQXhDLENBQWtEQyxVQUFsRCxDQUErRCxDQUU5REMsZ0JBQWdCOXBELElBQWhCLENBQXNCLElBQXRCLENBQTRCLGdCQUFBLENBQWtCbWxCLEtBQWxCLENBQTVCLENBQXVEeWtDLFFBQXZELENBQWlFQyxVQUFqRSxFQUVBLENBRUR5Qix1QkFBdUJodEQsU0FBdkIsQ0FBbUNELE9BQU9pQixNQUFQLENBQWV3cUQsZ0JBQWdCeHJELFNBQS9CLENBQW5DLENBQ0FndEQsdUJBQXVCaHRELFNBQXZCLENBQWlDc0MsV0FBakMsQ0FBK0MwcUQsc0JBQS9DLENBRUE7O0tBSUEsdUJBQUEsRUFBMEIsQ0FFekIsS0FBSy9sQixRQUFMLENBQWdCLEVBQWhCLENBQ0EsS0FBS29mLE9BQUwsQ0FBZSxFQUFmLENBQ0EsS0FBS3pCLE1BQUwsQ0FBYyxFQUFkLENBQ0EsS0FBSzJCLEdBQUwsQ0FBVyxFQUFYLENBQ0EsS0FBS0osSUFBTCxDQUFZLEVBQVosQ0FFQSxLQUFLTyxNQUFMLENBQWMsRUFBZCxDQUVBLEtBQUszQixZQUFMLENBQW9CLEVBQXBCLENBRUEsS0FBS0UsV0FBTCxDQUFtQixFQUFuQixDQUNBLEtBQUtDLFdBQUwsQ0FBbUIsRUFBbkIsQ0FFQTtFQUVBLEtBQUtFLFdBQUwsQ0FBbUIsSUFBbkIsQ0FDQSxLQUFLNVksY0FBTCxDQUFzQixJQUF0QixDQUVBO0VBRUEsS0FBSzhZLGtCQUFMLENBQTBCLEtBQTFCLENBQ0EsS0FBS0UsaUJBQUwsQ0FBeUIsS0FBekIsQ0FDQSxLQUFLQyxnQkFBTCxDQUF3QixLQUF4QixDQUNBLEtBQUtGLGFBQUwsQ0FBcUIsS0FBckIsQ0FDQSxLQUFLSSxnQkFBTCxDQUF3QixLQUF4QixDQUVBLENBRUQ1bEQsT0FBTzRuQixNQUFQLENBQWVzbEMsZUFBZWp0RCxTQUE5QixDQUF5QyxDQUV4Q2t0RCxjQUFlLFNBQVdubUIsUUFBWCxDQUFzQixDQUVwQyxTQUFBLENBQ0EsV0FBYSxFQUFiLENBQ0Esa0JBQW9CM2hDLFNBQXBCLENBRUEsVUFBWTJoQyxTQUFTOGQsS0FBckIsQ0FFQSxJQUFNLE1BQVEsQ0FBZCxDQUFpQi85QyxFQUFJKzlDLE1BQU1wK0MsTUFBM0IsQ0FBbUNLLEdBQW5DLENBQTBDLENBRXpDLFNBQVcrOUMsTUFBTy85QyxDQUFQLENBQVgsQ0FFQTtFQUVBLEdBQUtnL0MsS0FBS3ZCLGFBQUwsR0FBdUJBLGFBQTVCLENBQTRDLENBRTNDQSxjQUFnQnVCLEtBQUt2QixhQUFyQixDQUVBLEdBQUtvQyxRQUFVdmhELFNBQWYsQ0FBMkIsQ0FFMUJ1aEQsTUFBTW54QixLQUFOLENBQWdCMXVCLEVBQUksQ0FBTixDQUFZNi9DLE1BQU1yYyxLQUFoQyxDQUNBb2MsT0FBT3pnRCxJQUFQLENBQWEwZ0QsS0FBYixFQUVBLENBRURBLE1BQVEsQ0FDUHJjLE1BQU94akMsRUFBSSxDQURKLENBRVB5OUMsY0FBZUEsYUFGUixDQUFSLENBS0EsQ0FFRCxDQUVELEdBQUtvQyxRQUFVdmhELFNBQWYsQ0FBMkIsQ0FFMUJ1aEQsTUFBTW54QixLQUFOLENBQWdCMXVCLEVBQUksQ0FBTixDQUFZNi9DLE1BQU1yYyxLQUFoQyxDQUNBb2MsT0FBT3pnRCxJQUFQLENBQWEwZ0QsS0FBYixFQUVBLENBRUQsS0FBS0QsTUFBTCxDQUFjQSxNQUFkLENBRUEsQ0E3Q3VDLENBK0N4Q3lHLGFBQWMsU0FBV3BtQixRQUFYLENBQXNCLENBRW5DLFVBQVlBLFNBQVM4ZCxLQUFyQixDQUNBLGFBQWU5ZCxTQUFTRSxRQUF4QixDQUNBLGtCQUFvQkYsU0FBUytkLGFBQTdCLENBRUEsb0JBQXNCQSxjQUFlLENBQWYsR0FBc0JBLGNBQWUsQ0FBZixFQUFtQnIrQyxNQUFuQixDQUE0QixDQUF4RSxDQUNBLHFCQUF1QnErQyxjQUFlLENBQWYsR0FBc0JBLGNBQWUsQ0FBZixFQUFtQnIrQyxNQUFuQixDQUE0QixDQUF6RSxDQUVBO0VBRUEsaUJBQW1Cc2dDLFNBQVNnZSxZQUE1QixDQUNBLHVCQUF5QkEsYUFBYXQrQyxNQUF0QyxDQUVBLHdCQUFBLENBRUEsR0FBSzJtRCxtQkFBcUIsQ0FBMUIsQ0FBOEIsQ0FFN0JDLHFCQUF1QixFQUF2QixDQUVBLElBQU0sTUFBUSxDQUFkLENBQWlCdm1ELEVBQUlzbUQsa0JBQXJCLENBQXlDdG1ELEdBQXpDLENBQWdELENBRS9DdW1ELHFCQUFzQnZtRCxDQUF0QixFQUE0QixFQUE1QixDQUVBLENBRUQsS0FBS2krQyxZQUFMLENBQWtCcnRCLFFBQWxCLENBQTZCMjFCLG9CQUE3QixDQUVBLENBRUQsaUJBQW1CdG1CLFNBQVNpZSxZQUE1QixDQUNBLHVCQUF5QkEsYUFBYXYrQyxNQUF0QyxDQUVBLHNCQUFBLENBRUEsR0FBSzZtRCxtQkFBcUIsQ0FBMUIsQ0FBOEIsQ0FFN0JDLG1CQUFxQixFQUFyQixDQUVBLElBQU0sTUFBUSxDQUFkLENBQWlCem1ELEVBQUl3bUQsa0JBQXJCLENBQXlDeG1ELEdBQXpDLENBQWdELENBRS9DeW1ELG1CQUFvQnptRCxDQUFwQixFQUEwQixFQUExQixDQUVBLENBRUQsS0FBS2krQyxZQUFMLENBQWtCN2xCLE1BQWxCLENBQTJCcXVCLGtCQUEzQixDQUVBLENBRUQ7RUFFQSxnQkFBa0J4bUIsU0FBU21lLFdBQTNCLENBQ0EsZ0JBQWtCbmUsU0FBU2tlLFdBQTNCLENBRUEsbUJBQXFCQyxZQUFZeitDLE1BQVosR0FBdUJ3Z0MsU0FBU3hnQyxNQUFyRCxDQUNBLG1CQUFxQncrQyxZQUFZeCtDLE1BQVosR0FBdUJ3Z0MsU0FBU3hnQyxNQUFyRCxDQUVBO0VBRUEsSUFBTSxNQUFRLENBQWQsQ0FBaUJLLEVBQUkrOUMsTUFBTXArQyxNQUEzQixDQUFtQ0ssR0FBbkMsQ0FBMEMsQ0FFekMsU0FBVys5QyxNQUFPLzlDLENBQVAsQ0FBWCxDQUVBLEtBQUttZ0MsUUFBTCxDQUFjaGhDLElBQWQsQ0FBb0JnaEMsU0FBVTZlLEtBQUt0OEMsQ0FBZixDQUFwQixDQUF3Q3k5QixTQUFVNmUsS0FBS3g4QyxDQUFmLENBQXhDLENBQTREMjlCLFNBQVU2ZSxLQUFLNzdDLENBQWYsQ0FBNUQsRUFFQSxrQkFBb0I2N0MsS0FBS3RCLGFBQXpCLENBRUEsR0FBS0EsY0FBYy85QyxNQUFkLEdBQXlCLENBQTlCLENBQWtDLENBRWpDLEtBQUs0L0MsT0FBTCxDQUFhcGdELElBQWIsQ0FBbUJ1K0MsY0FBZSxDQUFmLENBQW5CLENBQXVDQSxjQUFlLENBQWYsQ0FBdkMsQ0FBMkRBLGNBQWUsQ0FBZixDQUEzRCxFQUVBLENBSkQsSUFJTyxDQUVOLFdBQWFzQixLQUFLNW1CLE1BQWxCLENBRUEsS0FBS21uQixPQUFMLENBQWFwZ0QsSUFBYixDQUFtQmk1QixNQUFuQixDQUEyQkEsTUFBM0IsQ0FBbUNBLE1BQW5DLEVBRUEsQ0FFRCxpQkFBbUI0bUIsS0FBS3JCLFlBQXhCLENBRUEsR0FBS0EsYUFBYWgrQyxNQUFiLEdBQXdCLENBQTdCLENBQWlDLENBRWhDLEtBQUttK0MsTUFBTCxDQUFZMytDLElBQVosQ0FBa0J3K0MsYUFBYyxDQUFkLENBQWxCLENBQXFDQSxhQUFjLENBQWQsQ0FBckMsQ0FBd0RBLGFBQWMsQ0FBZCxDQUF4RCxFQUVBLENBSkQsSUFJTyxDQUVOLFVBQVlxQixLQUFLOVEsS0FBakIsQ0FFQSxLQUFLNFAsTUFBTCxDQUFZMytDLElBQVosQ0FBa0IrdUMsS0FBbEIsQ0FBeUJBLEtBQXpCLENBQWdDQSxLQUFoQyxFQUVBLENBRUQsR0FBS29WLGtCQUFvQixJQUF6QixDQUFnQyxDQUUvQixjQUFnQnRGLGNBQWUsQ0FBZixFQUFvQmgrQyxDQUFwQixDQUFoQixDQUVBLEdBQUswbUQsWUFBY3BvRCxTQUFuQixDQUErQixDQUU5QixLQUFLbWhELEdBQUwsQ0FBU3RnRCxJQUFULENBQWV1bkQsVUFBVyxDQUFYLENBQWYsQ0FBK0JBLFVBQVcsQ0FBWCxDQUEvQixDQUErQ0EsVUFBVyxDQUFYLENBQS9DLEVBRUEsQ0FKRCxJQUlPLENBRU56eEMsUUFBUTZQLElBQVIsQ0FBYywwREFBZCxDQUEwRTlrQixDQUExRSxFQUVBLEtBQUt5L0MsR0FBTCxDQUFTdGdELElBQVQsQ0FBZSxXQUFBLEVBQWYsQ0FBOEIsV0FBQSxFQUE5QixDQUE2QyxXQUFBLEVBQTdDLEVBRUEsQ0FFRCxDQUVELEdBQUt3bkQsbUJBQXFCLElBQTFCLENBQWlDLENBRWhDLGNBQWdCM0ksY0FBZSxDQUFmLEVBQW9CaCtDLENBQXBCLENBQWhCLENBRUEsR0FBSzBtRCxZQUFjcG9ELFNBQW5CLENBQStCLENBRTlCLEtBQUsrZ0QsSUFBTCxDQUFVbGdELElBQVYsQ0FBZ0J1bkQsVUFBVyxDQUFYLENBQWhCLENBQWdDQSxVQUFXLENBQVgsQ0FBaEMsQ0FBZ0RBLFVBQVcsQ0FBWCxDQUFoRCxFQUVBLENBSkQsSUFJTyxDQUVOenhDLFFBQVE2UCxJQUFSLENBQWMsMkRBQWQsQ0FBMkU5a0IsQ0FBM0UsRUFFQSxLQUFLcS9DLElBQUwsQ0FBVWxnRCxJQUFWLENBQWdCLFdBQUEsRUFBaEIsQ0FBK0IsV0FBQSxFQUEvQixDQUE4QyxXQUFBLEVBQTlDLEVBRUEsQ0FFRCxDQUVEO0VBRUEsSUFBTSxNQUFRLENBQWQsQ0FBaUJ5YyxFQUFJMHFDLGtCQUFyQixDQUF5QzFxQyxHQUF6QyxDQUFnRCxDQUUvQyxnQkFBa0JxaUMsYUFBY3JpQyxDQUFkLEVBQWtCdWtCLFFBQXBDLENBRUFvbUIscUJBQXNCM3FDLENBQXRCLEVBQTBCemMsSUFBMUIsQ0FBZ0NpbEQsWUFBYXBGLEtBQUt0OEMsQ0FBbEIsQ0FBaEMsQ0FBdUQwaEQsWUFBYXBGLEtBQUt4OEMsQ0FBbEIsQ0FBdkQsQ0FBOEU0aEQsWUFBYXBGLEtBQUs3N0MsQ0FBbEIsQ0FBOUUsRUFFQSxDQUVELElBQU0sTUFBUSxDQUFkLENBQWlCeVksRUFBSTRxQyxrQkFBckIsQ0FBeUM1cUMsR0FBekMsQ0FBZ0QsQ0FFL0MsZ0JBQWtCc2lDLGFBQWN0aUMsQ0FBZCxFQUFrQjhoQyxhQUFsQixDQUFpQzE5QyxDQUFqQyxDQUFsQixDQUVBeW1ELG1CQUFvQjdxQyxDQUFwQixFQUF3QnpjLElBQXhCLENBQThCa2xELFlBQVkzaEQsQ0FBMUMsQ0FBNkMyaEQsWUFBWTdoRCxDQUF6RCxDQUE0RDZoRCxZQUFZbGhELENBQXhFLEVBRUEsQ0FFRDtFQUVBLEdBQUt5akQsY0FBTCxDQUFzQixDQUVyQixLQUFLeEksV0FBTCxDQUFpQmovQyxJQUFqQixDQUF1QmkvQyxZQUFhWSxLQUFLdDhDLENBQWxCLENBQXZCLENBQThDMDdDLFlBQWFZLEtBQUt4OEMsQ0FBbEIsQ0FBOUMsQ0FBcUU0N0MsWUFBYVksS0FBSzc3QyxDQUFsQixDQUFyRSxFQUVBLENBRUQsR0FBSzBqRCxjQUFMLENBQXNCLENBRXJCLEtBQUsxSSxXQUFMLENBQWlCaC9DLElBQWpCLENBQXVCZy9DLFlBQWFhLEtBQUt0OEMsQ0FBbEIsQ0FBdkIsQ0FBOEN5N0MsWUFBYWEsS0FBS3g4QyxDQUFsQixDQUE5QyxDQUFxRTI3QyxZQUFhYSxLQUFLNzdDLENBQWxCLENBQXJFLEVBRUEsQ0FFRCxDQUVELEtBQUtpakQsYUFBTCxDQUFvQm5tQixRQUFwQixFQUVBLEtBQUt1ZSxrQkFBTCxDQUEwQnZlLFNBQVN1ZSxrQkFBbkMsQ0FDQSxLQUFLRSxpQkFBTCxDQUF5QnplLFNBQVN5ZSxpQkFBbEMsQ0FDQSxLQUFLQyxnQkFBTCxDQUF3QjFlLFNBQVMwZSxnQkFBakMsQ0FDQSxLQUFLRixhQUFMLENBQXFCeGUsU0FBU3dlLGFBQTlCLENBQ0EsS0FBS0ksZ0JBQUwsQ0FBd0I1ZSxTQUFTNGUsZ0JBQWpDLENBRUEsV0FBQSxDQUVBLENBNU51QyxDQUF6QyxFQWdPQTs7S0FJQSxpQkFBQSxDQUFtQjkrQixLQUFuQixDQUEyQixDQUUxQixHQUFLQSxNQUFNcGdCLE1BQU4sR0FBaUIsQ0FBdEIsQ0FBMEIsT0FBTyxDQUFFMitCLFFBQVQsQ0FFMUIsUUFBVXZlLE1BQU8sQ0FBUCxDQUFWLENBRUEsSUFBTSxNQUFRLENBQVIsQ0FBV3RkLEVBQUlzZCxNQUFNcGdCLE1BQTNCLENBQW1DSyxFQUFJeUMsQ0FBdkMsQ0FBMEMsRUFBR3pDLENBQTdDLENBQWlELENBRWhELEdBQUsrZixNQUFPL2YsQ0FBUCxFQUFhMkcsR0FBbEIsQ0FBd0JBLElBQU1vWixNQUFPL2YsQ0FBUCxDQUFOLENBRXhCLENBRUQsVUFBQSxDQUVBLENBRUQ7OztLQUtBLHFCQUF1QixDQUF2QixDQUEwQjtFQUUxQix1QkFBQSxFQUEwQixDQUV6Qi9HLE9BQU93SyxjQUFQLENBQXVCLElBQXZCLENBQTZCLElBQTdCLENBQW1DLENBQUU5RyxNQUFPbXFELGtCQUFvQixDQUE3QixDQUFuQyxFQUVBLEtBQUt6c0IsSUFBTCxDQUFZMVcsTUFBTTdCLFlBQU4sRUFBWixDQUVBLEtBQUs5bEIsSUFBTCxDQUFZLEVBQVosQ0FDQSxLQUFLckIsSUFBTCxDQUFZLGdCQUFaLENBRUEsS0FBS2lNLEtBQUwsQ0FBYSxJQUFiLENBQ0EsS0FBSzA1QixVQUFMLENBQWtCLEVBQWxCLENBRUEsS0FBS3ltQixlQUFMLENBQXVCLEVBQXZCLENBRUEsS0FBS25ILE1BQUwsQ0FBYyxFQUFkLENBRUEsS0FBS3RCLFdBQUwsQ0FBbUIsSUFBbkIsQ0FDQSxLQUFLNVksY0FBTCxDQUFzQixJQUF0QixDQUVBLEtBQUtzaEIsU0FBTCxDQUFpQixDQUFFeGpCLE1BQU8sQ0FBVCxDQUFZOVUsTUFBTzRQLFFBQW5CLENBQWpCLENBRUEsQ0FFRDJvQixlQUFlL3RELFNBQWYsQ0FBMkJELE9BQU80bkIsTUFBUCxDQUFlNW5CLE9BQU9pQixNQUFQLENBQWU4bUIsZ0JBQWdCOW5CLFNBQS9CLENBQWYsQ0FBMkQsQ0FFckZzQyxZQUFheXJELGNBRndFLENBSXJGNW1CLGlCQUFrQixJQUptRSxDQU1yRjZtQixTQUFVLFVBQVksQ0FFckIsWUFBWXRnRCxLQUFaLENBRUEsQ0FWb0YsQ0FZckZ1Z0QsU0FBVSxTQUFXdmdELEtBQVgsQ0FBbUIsQ0FFNUIsR0FBS2tHLE1BQU15TSxPQUFOLENBQWUzUyxLQUFmLENBQUwsQ0FBOEIsQ0FFN0IsS0FBS0EsS0FBTCxDQUFhLElBQU13Z0QsU0FBVXhnRCxLQUFWLEVBQW9CLEtBQXBCLENBQTRCby9DLHFCQUE1QixDQUFvREYscUJBQTFELEVBQW1GbC9DLEtBQW5GLENBQTBGLENBQTFGLENBQWIsQ0FFQSxDQUpELElBSU8sQ0FFTixLQUFLQSxLQUFMLENBQWFBLEtBQWIsQ0FFQSxDQUVELENBeEJvRixDQTBCckZ5Z0QsYUFBYyxTQUFXcnJELElBQVgsQ0FBaUJ5ckIsU0FBakIsQ0FBNkIsQ0FFMUMsR0FBSyxFQUFJQSxXQUFhQSxVQUFVazlCLGlCQUEzQixHQUFrRCxFQUFJbDlCLFdBQWFBLFVBQVUwdkIsNEJBQTNCLENBQXZELENBQW1ILENBRWxIbGlDLFFBQVE2UCxJQUFSLENBQWMsd0VBQWQsRUFFQSxLQUFLdWlDLFlBQUwsQ0FBbUJyckQsSUFBbkIsQ0FBeUIsbUJBQUEsQ0FBcUJxSCxVQUFXLENBQVgsQ0FBckIsQ0FBcUNBLFVBQVcsQ0FBWCxDQUFyQyxDQUF6QixFQUVBLE9BRUEsQ0FFRCxHQUFLckgsT0FBUyxPQUFkLENBQXdCLENBRXZCaVosUUFBUTZQLElBQVIsQ0FBYyx5RUFBZCxFQUNBLEtBQUtxaUMsUUFBTCxDQUFlMS9CLFNBQWYsRUFFQSxPQUVBLENBRUQsS0FBSzZZLFVBQUwsQ0FBaUJ0a0MsSUFBakIsRUFBMEJ5ckIsU0FBMUIsQ0FFQSxXQUFBLENBRUEsQ0FuRG9GLENBcURyRjYvQixhQUFjLFNBQVd0ckQsSUFBWCxDQUFrQixDQUUvQixZQUFZc2tDLFVBQUwsQ0FBaUJ0a0MsSUFBakIsQ0FBUCxDQUVBLENBekRvRixDQTJEckZ1ckQsZ0JBQWlCLFNBQVd2ckQsSUFBWCxDQUFrQixDQUVsQyxZQUFZc2tDLFVBQUwsQ0FBaUJ0a0MsSUFBakIsQ0FBUCxDQUVBLFdBQUEsQ0FFQSxDQWpFb0YsQ0FtRXJGd3JELFNBQVUsU0FBV2hrQixLQUFYLENBQWtCOVUsS0FBbEIsQ0FBeUIrdUIsYUFBekIsQ0FBeUMsQ0FFbEQsS0FBS21DLE1BQUwsQ0FBWXpnRCxJQUFaLENBQWtCLENBRWpCcWtDLE1BQU9BLEtBRlUsQ0FHakI5VSxNQUFPQSxLQUhVLENBSWpCK3VCLGNBQWVBLGdCQUFrQm4vQyxTQUFsQixDQUE4Qm0vQyxhQUE5QixDQUE4QyxDQUo1QyxDQUFsQixFQVFBLENBN0VvRixDQStFckZnSyxZQUFhLFVBQVksQ0FFeEIsS0FBSzdILE1BQUwsQ0FBYyxFQUFkLENBRUEsQ0FuRm9GLENBcUZyRjhILGFBQWMsU0FBV2xrQixLQUFYLENBQWtCOVUsS0FBbEIsQ0FBMEIsQ0FFdkMsS0FBS3M0QixTQUFMLENBQWV4akIsS0FBZixDQUF1QkEsS0FBdkIsQ0FDQSxLQUFLd2pCLFNBQUwsQ0FBZXQ0QixLQUFmLENBQXVCQSxLQUF2QixDQUVBLENBMUZvRixDQTRGckZpckIsWUFBYSxTQUFXMW9CLE1BQVgsQ0FBb0IsQ0FFaEMsYUFBZSxLQUFLcVAsVUFBTCxDQUFnQjFQLFFBQS9CLENBRUEsR0FBS0EsV0FBYXR5QixTQUFsQixDQUE4QixDQUU3QjJ5QixPQUFPeEMsc0JBQVAsQ0FBK0JtQyxRQUEvQixFQUNBQSxTQUFTKzJCLFdBQVQsQ0FBdUIsSUFBdkIsQ0FFQSxDQUVELFdBQWEsS0FBS3JuQixVQUFMLENBQWdCbEksTUFBN0IsQ0FFQSxHQUFLQSxTQUFXOTVCLFNBQWhCLENBQTRCLENBRTNCLGlCQUFtQixXQUFBLEdBQWM0NkIsZUFBZCxDQUErQmpJLE1BQS9CLENBQW5CLENBRUErUyxhQUFhdlYsc0JBQWIsQ0FBcUMySixNQUFyQyxFQUNBQSxPQUFPdXZCLFdBQVAsQ0FBcUIsSUFBckIsQ0FFQSxDQUVELEdBQUssS0FBS3JKLFdBQUwsR0FBcUIsSUFBMUIsQ0FBaUMsQ0FFaEMsS0FBS1ksa0JBQUwsR0FFQSxDQUVELEdBQUssS0FBS3haLGNBQUwsR0FBd0IsSUFBN0IsQ0FBb0MsQ0FFbkMsS0FBS0MscUJBQUwsR0FFQSxDQUVELFdBQUEsQ0FFQSxDQWhJb0YsQ0FrSXJGd1UsUUFBUyxVQUFZO0VBSXBCLE9BQVMsV0FBQSxFQUFULENBRUEsdUJBQU8sQ0FBa0IzekIsS0FBbEIsQ0FBMEIsQ0FFaEN1ZCxHQUFHOVQsYUFBSCxDQUFrQnpKLEtBQWxCLEVBRUEsS0FBS216QixXQUFMLENBQWtCNVYsRUFBbEIsRUFFQSxXQUFBLENBRUEsQ0FSRCxDQVVBLENBaEJRLEVBbEk0RSxDQW9KckZxVyxRQUFTLFVBQVk7RUFJcEIsT0FBUyxXQUFBLEVBQVQsQ0FFQSx1QkFBTyxDQUFrQjV6QixLQUFsQixDQUEwQixDQUVoQ3VkLEdBQUc1VCxhQUFILENBQWtCM0osS0FBbEIsRUFFQSxLQUFLbXpCLFdBQUwsQ0FBa0I1VixFQUFsQixFQUVBLFdBQUEsQ0FFQSxDQVJELENBVUEsQ0FoQlEsRUFwSjRFLENBc0tyRnNXLFFBQVMsVUFBWTtFQUlwQixPQUFTLFdBQUEsRUFBVCxDQUVBLHVCQUFPLENBQWtCN3pCLEtBQWxCLENBQTBCLENBRWhDdWQsR0FBRzNULGFBQUgsQ0FBa0I1SixLQUFsQixFQUVBLEtBQUttekIsV0FBTCxDQUFrQjVWLEVBQWxCLEVBRUEsV0FBQSxDQUVBLENBUkQsQ0FVQSxDQWhCUSxFQXRLNEUsQ0F3THJGckssVUFBVyxVQUFZO0VBSXRCLE9BQVMsV0FBQSxFQUFULENBRUEseUJBQU8sQ0FBb0JubkIsQ0FBcEIsQ0FBdUJ3USxDQUF2QixDQUEwQjZHLENBQTFCLENBQThCLENBRXBDbWEsR0FBRy9ULGVBQUgsQ0FBb0J6ZCxDQUFwQixDQUF1QndRLENBQXZCLENBQTBCNkcsQ0FBMUIsRUFFQSxLQUFLK3ZCLFdBQUwsQ0FBa0I1VixFQUFsQixFQUVBLFdBQUEsQ0FFQSxDQVJELENBVUEsQ0FoQlUsRUF4TDBFLENBME1yRnBVLE1BQU8sVUFBWTtFQUlsQixPQUFTLFdBQUEsRUFBVCxDQUVBLHFCQUFPLENBQWdCcGQsQ0FBaEIsQ0FBbUJ3USxDQUFuQixDQUFzQjZHLENBQXRCLENBQTBCLENBRWhDbWEsR0FBR3RULFNBQUgsQ0FBY2xlLENBQWQsQ0FBaUJ3USxDQUFqQixDQUFvQjZHLENBQXBCLEVBRUEsS0FBSyt2QixXQUFMLENBQWtCNVYsRUFBbEIsRUFFQSxXQUFBLENBRUEsQ0FSRCxDQVVBLENBaEJNLEVBMU04RSxDQTROckY1WCxPQUFRLFVBQVksQ0FFbkIsUUFBVSxZQUFBLEVBQVYsQ0FFQSxzQkFBTyxDQUFpQjRFLE1BQWpCLENBQTBCLENBRWhDdDJCLElBQUkweEIsTUFBSixDQUFZNEUsTUFBWixFQUVBdDJCLElBQUlnaEMsWUFBSixHQUVBLEtBQUtrZSxXQUFMLENBQWtCbC9DLElBQUl3MkIsTUFBdEIsRUFFQSxDQVJELENBVUEsQ0FkTyxFQTVONkUsQ0E0T3JGcEosT0FBUSxVQUFZLENBRW5CLFdBQWEsV0FBQSxFQUFiLENBRUEsc0JBQU8sRUFBa0IsQ0FFeEIsS0FBS3EzQixrQkFBTCxHQUVBLEtBQUtaLFdBQUwsQ0FBaUJ6ZSxTQUFqQixDQUE0QnZZLE1BQTVCLEVBQXFDckIsTUFBckMsR0FFQSxLQUFLeVQsU0FBTCxDQUFnQnBTLE9BQU8vVSxDQUF2QixDQUEwQitVLE9BQU92RSxDQUFqQyxDQUFvQ3VFLE9BQU9zQyxDQUEzQyxFQUVBLFdBQUEsQ0FFQSxDQVZELENBWUEsQ0FoQk8sRUE1TzZFLENBOFByRjZWLGNBQWUsU0FBV2pnQyxNQUFYLENBQW9CO0VBSWxDLGFBQWVBLE9BQU95Z0MsUUFBdEIsQ0FFQSxHQUFLemdDLE9BQU9vb0QsUUFBUCxFQUFtQnBvRCxPQUFPcW9ELE1BQS9CLENBQXdDLENBRXZDLGNBQWdCLDBCQUFBLENBQTRCNW5CLFNBQVNFLFFBQVQsQ0FBa0J4Z0MsTUFBbEIsQ0FBMkIsQ0FBdkQsQ0FBMEQsQ0FBMUQsQ0FBaEIsQ0FDQSxXQUFhLDBCQUFBLENBQTRCc2dDLFNBQVM2ZCxNQUFULENBQWdCbitDLE1BQWhCLENBQXlCLENBQXJELENBQXdELENBQXhELENBQWIsQ0FFQSxLQUFLMG5ELFlBQUwsQ0FBbUIsVUFBbkIsQ0FBK0IvSCxVQUFVK0YsaUJBQVYsQ0FBNkJwbEIsU0FBU0UsUUFBdEMsQ0FBL0IsRUFDQSxLQUFLa25CLFlBQUwsQ0FBbUIsT0FBbkIsQ0FBNEJ2SixPQUFPb0gsZUFBUCxDQUF3QmpsQixTQUFTNmQsTUFBakMsQ0FBNUIsRUFFQSxHQUFLN2QsU0FBU29lLGFBQVQsRUFBMEJwZSxTQUFTb2UsYUFBVCxDQUF1QjErQyxNQUF2QixHQUFrQ3NnQyxTQUFTRSxRQUFULENBQWtCeGdDLE1BQW5GLENBQTRGLENBRTNGLGtCQUFvQiwwQkFBQSxDQUE0QnNnQyxTQUFTb2UsYUFBVCxDQUF1QjErQyxNQUFuRCxDQUEyRCxDQUEzRCxDQUFwQixDQUVBLEtBQUswbkQsWUFBTCxDQUFtQixjQUFuQixDQUFtQ2hKLGNBQWM0RyxTQUFkLENBQXlCaGxCLFNBQVNvZSxhQUFsQyxDQUFuQyxFQUVBLENBRUQsR0FBS3BlLFNBQVN5RixjQUFULEdBQTRCLElBQWpDLENBQXdDLENBRXZDLEtBQUtBLGNBQUwsQ0FBc0J6RixTQUFTeUYsY0FBVCxDQUF3Qi9nQixLQUF4QixFQUF0QixDQUVBLENBRUQsR0FBS3NiLFNBQVNxZSxXQUFULEdBQXlCLElBQTlCLENBQXFDLENBRXBDLEtBQUtBLFdBQUwsQ0FBbUJyZSxTQUFTcWUsV0FBVCxDQUFxQjM1QixLQUFyQixFQUFuQixDQUVBLENBRUQsQ0E1QkQsUUE0QllubEIsT0FBTzJpRCxNQUFaLENBQXFCLENBRTNCLEdBQUtsaUIsVUFBWUEsU0FBU0MsVUFBMUIsQ0FBdUMsQ0FFdEMsS0FBS21tQixZQUFMLENBQW1CcG1CLFFBQW5CLEVBRUEsQ0FFRCxDQUVELFdBQUEsQ0FFQSxDQTVTb0YsQ0E4U3JGaEIsY0FBZSxTQUFXQyxNQUFYLENBQW9CLENBRWxDLGFBQWUsRUFBZixDQUVBLElBQU0sTUFBUSxDQUFSLENBQVd6OEIsRUFBSXk4QixPQUFPdi9CLE1BQTVCLENBQW9DSyxFQUFJeUMsQ0FBeEMsQ0FBMkN6QyxHQUEzQyxDQUFrRCxDQUVqRCxVQUFZay9CLE9BQVFsL0IsQ0FBUixDQUFaLENBQ0E0d0IsU0FBU3p4QixJQUFULENBQWV5TixNQUFNMkYsQ0FBckIsQ0FBd0IzRixNQUFNbVcsQ0FBOUIsQ0FBaUNuVyxNQUFNZ2QsQ0FBTixFQUFXLENBQTVDLEVBRUEsQ0FFRCxLQUFLeTlCLFlBQUwsQ0FBbUIsVUFBbkIsQ0FBK0IsMEJBQUEsQ0FBNEJ6MkIsUUFBNUIsQ0FBc0MsQ0FBdEMsQ0FBL0IsRUFFQSxXQUFBLENBRUEsQ0E3VG9GLENBK1RyRmszQixpQkFBa0IsU0FBV3RvRCxNQUFYLENBQW9CLENBRXJDLGFBQWVBLE9BQU95Z0MsUUFBdEIsQ0FFQSxHQUFLemdDLE9BQU8yaUQsTUFBWixDQUFxQixDQUVwQixXQUFhbGlCLFNBQVM4bkIsZ0JBQXRCLENBRUEsR0FBSzluQixTQUFTc2Usa0JBQVQsR0FBZ0MsSUFBckMsQ0FBNEMsQ0FFM0N5SixPQUFTMXBELFNBQVQsQ0FDQTJoQyxTQUFTc2Usa0JBQVQsQ0FBOEIsS0FBOUIsQ0FFQSxDQUVELEdBQUt5SixTQUFXMXBELFNBQWhCLENBQTRCLENBRTNCLFlBQVkrbkQsWUFBTCxDQUFtQnBtQixRQUFuQixDQUFQLENBRUEsQ0FFRCtuQixPQUFPeEosa0JBQVAsQ0FBNEJ2ZSxTQUFTdWUsa0JBQXJDLENBQ0F3SixPQUFPdEosaUJBQVAsQ0FBMkJ6ZSxTQUFTeWUsaUJBQXBDLENBQ0FzSixPQUFPckosZ0JBQVAsQ0FBMEIxZSxTQUFTMGUsZ0JBQW5DLENBQ0FxSixPQUFPdkosYUFBUCxDQUF1QnhlLFNBQVN3ZSxhQUFoQyxDQUNBdUosT0FBT25KLGdCQUFQLENBQTBCNWUsU0FBUzRlLGdCQUFuQyxDQUVBNWUsU0FBU3VlLGtCQUFULENBQThCLEtBQTlCLENBQ0F2ZSxTQUFTeWUsaUJBQVQsQ0FBNkIsS0FBN0IsQ0FDQXplLFNBQVMwZSxnQkFBVCxDQUE0QixLQUE1QixDQUNBMWUsU0FBU3dlLGFBQVQsQ0FBeUIsS0FBekIsQ0FDQXhlLFNBQVM0ZSxnQkFBVCxDQUE0QixLQUE1QixDQUVBNWUsU0FBVytuQixNQUFYLENBRUEsQ0FFRCxhQUFBLENBRUEsR0FBSy9uQixTQUFTdWUsa0JBQVQsR0FBZ0MsSUFBckMsQ0FBNEMsQ0FFM0MvMkIsVUFBWSxLQUFLNlksVUFBTCxDQUFnQjFQLFFBQTVCLENBRUEsR0FBS25KLFlBQWNucEIsU0FBbkIsQ0FBK0IsQ0FFOUJtcEIsVUFBVTQ5QixpQkFBVixDQUE2QnBsQixTQUFTRSxRQUF0QyxFQUNBMVksVUFBVWtnQyxXQUFWLENBQXdCLElBQXhCLENBRUEsQ0FFRDFuQixTQUFTdWUsa0JBQVQsQ0FBOEIsS0FBOUIsQ0FFQSxDQUVELEdBQUt2ZSxTQUFTeWUsaUJBQVQsR0FBK0IsSUFBcEMsQ0FBMkMsQ0FFMUNqM0IsVUFBWSxLQUFLNlksVUFBTCxDQUFnQmxJLE1BQTVCLENBRUEsR0FBSzNRLFlBQWNucEIsU0FBbkIsQ0FBK0IsQ0FFOUJtcEIsVUFBVTQ5QixpQkFBVixDQUE2QnBsQixTQUFTc2YsT0FBdEMsRUFDQTkzQixVQUFVa2dDLFdBQVYsQ0FBd0IsSUFBeEIsQ0FFQSxDQUVEMW5CLFNBQVN5ZSxpQkFBVCxDQUE2QixLQUE3QixDQUVBLENBRUQsR0FBS3plLFNBQVMwZSxnQkFBVCxHQUE4QixJQUFuQyxDQUEwQyxDQUV6Q2wzQixVQUFZLEtBQUs2WSxVQUFMLENBQWdCNE4sS0FBNUIsQ0FFQSxHQUFLem1CLFlBQWNucEIsU0FBbkIsQ0FBK0IsQ0FFOUJtcEIsVUFBVXk5QixlQUFWLENBQTJCamxCLFNBQVM2ZCxNQUFwQyxFQUNBcjJCLFVBQVVrZ0MsV0FBVixDQUF3QixJQUF4QixDQUVBLENBRUQxbkIsU0FBUzBlLGdCQUFULENBQTRCLEtBQTVCLENBRUEsQ0FFRCxHQUFLMWUsU0FBU3dlLGFBQWQsQ0FBOEIsQ0FFN0JoM0IsVUFBWSxLQUFLNlksVUFBTCxDQUFnQjNELEVBQTVCLENBRUEsR0FBS2xWLFlBQWNucEIsU0FBbkIsQ0FBK0IsQ0FFOUJtcEIsVUFBVTA5QixpQkFBVixDQUE2QmxsQixTQUFTd2YsR0FBdEMsRUFDQWg0QixVQUFVa2dDLFdBQVYsQ0FBd0IsSUFBeEIsQ0FFQSxDQUVEMW5CLFNBQVN3ZSxhQUFULENBQXlCLEtBQXpCLENBRUEsQ0FFRCxHQUFLeGUsU0FBUzJlLHVCQUFkLENBQXdDLENBRXZDbjNCLFVBQVksS0FBSzZZLFVBQUwsQ0FBZ0IybkIsWUFBNUIsQ0FFQSxHQUFLeGdDLFlBQWNucEIsU0FBbkIsQ0FBK0IsQ0FFOUJtcEIsVUFBVXc5QixTQUFWLENBQXFCaGxCLFNBQVNvZSxhQUE5QixFQUNBNTJCLFVBQVVrZ0MsV0FBVixDQUF3QixJQUF4QixDQUVBLENBRUQxbkIsU0FBUzJlLHVCQUFULENBQW1DLEtBQW5DLENBRUEsQ0FFRCxHQUFLM2UsU0FBUzRlLGdCQUFkLENBQWlDLENBRWhDNWUsU0FBU21tQixhQUFULENBQXdCNW1ELE9BQU95Z0MsUUFBL0IsRUFDQSxLQUFLMmYsTUFBTCxDQUFjM2YsU0FBUzJmLE1BQXZCLENBRUEzZixTQUFTNGUsZ0JBQVQsQ0FBNEIsS0FBNUIsQ0FFQSxDQUVELFdBQUEsQ0FFQSxDQTVib0YsQ0E4YnJGd0gsYUFBYyxTQUFXcG1CLFFBQVgsQ0FBc0IsQ0FFbkNBLFNBQVM4bkIsZ0JBQVQsQ0FBNEIsa0JBQUEsR0FBcUIxQixZQUFyQixDQUFtQ3BtQixRQUFuQyxDQUE1QixDQUVBLFlBQVlpb0Isa0JBQUwsQ0FBeUJqb0IsU0FBUzhuQixnQkFBbEMsQ0FBUCxDQUVBLENBcGNvRixDQXNjckZHLG1CQUFvQixTQUFXam9CLFFBQVgsQ0FBc0IsQ0FFekMsY0FBZ0IsZ0JBQUEsQ0FBa0JBLFNBQVNFLFFBQVQsQ0FBa0J4Z0MsTUFBbEIsQ0FBMkIsQ0FBN0MsQ0FBaEIsQ0FDQSxLQUFLMG5ELFlBQUwsQ0FBbUIsVUFBbkIsQ0FBK0IsbUJBQUEsQ0FBcUIvSCxTQUFyQixDQUFnQyxDQUFoQyxFQUFvQytGLGlCQUFwQyxDQUF1RHBsQixTQUFTRSxRQUFoRSxDQUEvQixFQUVBLEdBQUtGLFNBQVNzZixPQUFULENBQWlCNS9DLE1BQWpCLENBQTBCLENBQS9CLENBQW1DLENBRWxDLFlBQWMsZ0JBQUEsQ0FBa0JzZ0MsU0FBU3NmLE9BQVQsQ0FBaUI1L0MsTUFBakIsQ0FBMEIsQ0FBNUMsQ0FBZCxDQUNBLEtBQUswbkQsWUFBTCxDQUFtQixRQUFuQixDQUE2QixtQkFBQSxDQUFxQjlILE9BQXJCLENBQThCLENBQTlCLEVBQWtDOEYsaUJBQWxDLENBQXFEcGxCLFNBQVNzZixPQUE5RCxDQUE3QixFQUVBLENBRUQsR0FBS3RmLFNBQVM2ZCxNQUFULENBQWdCbitDLE1BQWhCLENBQXlCLENBQTlCLENBQWtDLENBRWpDLFdBQWEsZ0JBQUEsQ0FBa0JzZ0MsU0FBUzZkLE1BQVQsQ0FBZ0JuK0MsTUFBaEIsQ0FBeUIsQ0FBM0MsQ0FBYixDQUNBLEtBQUswbkQsWUFBTCxDQUFtQixPQUFuQixDQUE0QixtQkFBQSxDQUFxQnZKLE1BQXJCLENBQTZCLENBQTdCLEVBQWlDb0gsZUFBakMsQ0FBa0RqbEIsU0FBUzZkLE1BQTNELENBQTVCLEVBRUEsQ0FFRCxHQUFLN2QsU0FBU3dmLEdBQVQsQ0FBYTkvQyxNQUFiLENBQXNCLENBQTNCLENBQStCLENBRTlCLFFBQVUsZ0JBQUEsQ0FBa0JzZ0MsU0FBU3dmLEdBQVQsQ0FBYTkvQyxNQUFiLENBQXNCLENBQXhDLENBQVYsQ0FDQSxLQUFLMG5ELFlBQUwsQ0FBbUIsSUFBbkIsQ0FBeUIsbUJBQUEsQ0FBcUI1SCxHQUFyQixDQUEwQixDQUExQixFQUE4QjBGLGlCQUE5QixDQUFpRGxsQixTQUFTd2YsR0FBMUQsQ0FBekIsRUFFQSxDQUVELEdBQUt4ZixTQUFTb2YsSUFBVCxDQUFjMS9DLE1BQWQsQ0FBdUIsQ0FBNUIsQ0FBZ0MsQ0FFL0IsU0FBVyxnQkFBQSxDQUFrQnNnQyxTQUFTb2YsSUFBVCxDQUFjMS9DLE1BQWQsQ0FBdUIsQ0FBekMsQ0FBWCxDQUNBLEtBQUswbkQsWUFBTCxDQUFtQixLQUFuQixDQUEwQixtQkFBQSxDQUFxQmhJLElBQXJCLENBQTJCLENBQTNCLEVBQStCOEYsaUJBQS9CLENBQWtEbGxCLFNBQVNvZixJQUEzRCxDQUExQixFQUVBLENBRUQ7RUFFQSxLQUFLTyxNQUFMLENBQWMzZixTQUFTMmYsTUFBdkIsQ0FFQTtFQUVBLElBQU0sUUFBTixhQUEyQjNCLFlBQTNCLENBQTBDLENBRXpDLFVBQVksRUFBWixDQUNBLGlCQUFtQmhlLFNBQVNnZSxZQUFULENBQXVCamlELElBQXZCLENBQW5CLENBRUEsSUFBTSxNQUFRLENBQVIsQ0FBV3lHLEVBQUl3N0MsYUFBYXQrQyxNQUFsQyxDQUEwQ0ssRUFBSXlDLENBQTlDLENBQWlEekMsR0FBakQsQ0FBd0QsQ0FFdkQsZ0JBQWtCaStDLGFBQWNqK0MsQ0FBZCxDQUFsQixDQUVBLGNBQWdCLDBCQUFBLENBQTRCb2tELFlBQVl6a0QsTUFBWixDQUFxQixDQUFqRCxDQUFvRCxDQUFwRCxDQUFoQixDQUVBb2dCLE1BQU01Z0IsSUFBTixDQUFZc29CLFVBQVU0OUIsaUJBQVYsQ0FBNkJqQixXQUE3QixDQUFaLEVBRUEsQ0FFRCxLQUFLMkMsZUFBTCxDQUFzQi9xRCxJQUF0QixFQUErQitqQixLQUEvQixDQUVBLENBRUQ7RUFFQSxHQUFLa2dCLFNBQVNtZSxXQUFULENBQXFCeitDLE1BQXJCLENBQThCLENBQW5DLENBQXVDLENBRXRDLGdCQUFrQiwwQkFBQSxDQUE0QnNnQyxTQUFTbWUsV0FBVCxDQUFxQnorQyxNQUFyQixDQUE4QixDQUExRCxDQUE2RCxDQUE3RCxDQUFsQixDQUNBLEtBQUswbkQsWUFBTCxDQUFtQixXQUFuQixDQUFnQ2pKLFlBQVlrSCxpQkFBWixDQUErQnJsQixTQUFTbWUsV0FBeEMsQ0FBaEMsRUFFQSxDQUVELEdBQUtuZSxTQUFTa2UsV0FBVCxDQUFxQngrQyxNQUFyQixDQUE4QixDQUFuQyxDQUF1QyxDQUV0QyxnQkFBa0IsMEJBQUEsQ0FBNEJzZ0MsU0FBU2tlLFdBQVQsQ0FBcUJ4K0MsTUFBckIsQ0FBOEIsQ0FBMUQsQ0FBNkQsQ0FBN0QsQ0FBbEIsQ0FDQSxLQUFLMG5ELFlBQUwsQ0FBbUIsWUFBbkIsQ0FBaUNsSixZQUFZbUgsaUJBQVosQ0FBK0JybEIsU0FBU2tlLFdBQXhDLENBQWpDLEVBRUEsQ0FFRDtFQUVBLEdBQUtsZSxTQUFTeUYsY0FBVCxHQUE0QixJQUFqQyxDQUF3QyxDQUV2QyxLQUFLQSxjQUFMLENBQXNCekYsU0FBU3lGLGNBQVQsQ0FBd0IvZ0IsS0FBeEIsRUFBdEIsQ0FFQSxDQUVELEdBQUtzYixTQUFTcWUsV0FBVCxHQUF5QixJQUE5QixDQUFxQyxDQUVwQyxLQUFLQSxXQUFMLENBQW1CcmUsU0FBU3FlLFdBQVQsQ0FBcUIzNUIsS0FBckIsRUFBbkIsQ0FFQSxDQUVELFdBQUEsQ0FFQSxDQWhpQm9GLENBa2lCckZ1NkIsbUJBQW9CLFVBQVksQ0FFL0IsR0FBSyxLQUFLWixXQUFMLEdBQXFCLElBQTFCLENBQWlDLENBRWhDLEtBQUtBLFdBQUwsQ0FBbUIsUUFBQSxFQUFuQixDQUVBLENBRUQsYUFBZSxLQUFLaGUsVUFBTCxDQUFnQjFQLFFBQS9CLENBRUEsR0FBS0EsV0FBYXR5QixTQUFsQixDQUE4QixDQUU3QixLQUFLZ2dELFdBQUwsQ0FBaUJ0ZixzQkFBakIsQ0FBeUNwTyxRQUF6QyxFQUVBLENBSkQsSUFJTyxDQUVOLEtBQUswdEIsV0FBTCxDQUFpQm5mLFNBQWpCLEdBRUEsQ0FFRCxHQUFLcC9CLE1BQU8sS0FBS3UrQyxXQUFMLENBQWlCNTNDLEdBQWpCLENBQXFCNkwsQ0FBNUIsR0FBbUN4UyxNQUFPLEtBQUt1K0MsV0FBTCxDQUFpQjUzQyxHQUFqQixDQUFxQnFjLENBQTVCLENBQW5DLEVBQXNFaGpCLE1BQU8sS0FBS3UrQyxXQUFMLENBQWlCNTNDLEdBQWpCLENBQXFCa2pCLENBQTVCLENBQTNFLENBQTZHLENBRTVHM1UsUUFBUU0sS0FBUixDQUFlLG1JQUFmLENBQW9KLElBQXBKLEVBRUEsQ0FFRCxDQTVqQm9GLENBOGpCckZvd0Isc0JBQXVCLFVBQVksQ0FFbEMsUUFBVSxRQUFBLEVBQVYsQ0FDQSxXQUFhLFdBQUEsRUFBYixDQUVBLHFDQUFPLEVBQWlDLENBRXZDLEdBQUssS0FBS0QsY0FBTCxHQUF3QixJQUE3QixDQUFvQyxDQUVuQyxLQUFLQSxjQUFMLENBQXNCLFVBQUEsRUFBdEIsQ0FFQSxDQUVELGFBQWUsS0FBS3BGLFVBQUwsQ0FBZ0IxUCxRQUEvQixDQUVBLEdBQUtBLFFBQUwsQ0FBZ0IsQ0FFZixXQUFhLEtBQUs4VSxjQUFMLENBQW9CN2QsTUFBakMsQ0FFQThYLElBQUlYLHNCQUFKLENBQTRCcE8sUUFBNUIsRUFDQStPLElBQUlFLFNBQUosQ0FBZWhZLE1BQWYsRUFFQTtFQUNBO0VBRUEsZ0JBQWtCLENBQWxCLENBRUEsSUFBTSxNQUFRLENBQVIsQ0FBV3VYLEdBQUt4TyxTQUFTbEMsS0FBL0IsQ0FBc0MxdUIsRUFBSW8vQixFQUExQyxDQUE4Q3AvQixHQUE5QyxDQUFxRCxDQUVwRCt3QixPQUFPeGUsQ0FBUCxDQUFXcWUsU0FBU2xKLElBQVQsQ0FBZTFuQixDQUFmLENBQVgsQ0FDQSt3QixPQUFPaE8sQ0FBUCxDQUFXNk4sU0FBU2pKLElBQVQsQ0FBZTNuQixDQUFmLENBQVgsQ0FDQSt3QixPQUFPbkgsQ0FBUCxDQUFXZ0gsU0FBU2pDLElBQVQsQ0FBZTN1QixDQUFmLENBQVgsQ0FDQXdpQyxZQUFjM2dDLEtBQUs4RSxHQUFMLENBQVU2N0IsV0FBVixDQUF1QjNhLE9BQU9sQixpQkFBUCxDQUEwQm9LLE1BQTFCLENBQXZCLENBQWQsQ0FFQSxDQUVELEtBQUsyVSxjQUFMLENBQW9CaE4sTUFBcEIsQ0FBNkI3MkIsS0FBS3VrQixJQUFMLENBQVdvYyxXQUFYLENBQTdCLENBRUEsR0FBS3ppQyxNQUFPLEtBQUsybEMsY0FBTCxDQUFvQmhOLE1BQTNCLENBQUwsQ0FBMkMsQ0FFMUN6akIsUUFBUU0sS0FBUixDQUFlLDhIQUFmLENBQStJLElBQS9JLEVBRUEsQ0FFRCxDQUVELENBekNELENBMkNBLENBaERzQixFQTlqQjhELENBZ25CckZ5cUMsbUJBQW9CLFVBQVk7RUFJL0IsQ0FwbkJvRixDQXNuQnJGTyxxQkFBc0IsVUFBWSxDQUVqQyxVQUFZLEtBQUszNUMsS0FBakIsQ0FDQSxlQUFpQixLQUFLMDVCLFVBQXRCLENBQ0EsV0FBYSxLQUFLc2YsTUFBbEIsQ0FFQSxHQUFLdGYsV0FBVzFQLFFBQWhCLENBQTJCLENBRTFCLGNBQWdCMFAsV0FBVzFQLFFBQVgsQ0FBb0I3USxLQUFwQyxDQUVBLEdBQUt1Z0IsV0FBV2xJLE1BQVgsR0FBc0I5NUIsU0FBM0IsQ0FBdUMsQ0FFdEMsS0FBSytvRCxZQUFMLENBQW1CLFFBQW5CLENBQTZCLG1CQUFBLENBQXFCLGdCQUFBLENBQWtCL0gsVUFBVTMvQyxNQUE1QixDQUFyQixDQUEyRCxDQUEzRCxDQUE3QixFQUVBLENBSkQsSUFJTztFQUlOLFVBQVkyZ0MsV0FBV2xJLE1BQVgsQ0FBa0JyWSxLQUE5QixDQUVBLElBQU0sTUFBUSxDQUFSLENBQVdxZixHQUFLcmYsTUFBTXBnQixNQUE1QixDQUFvQ0ssRUFBSW8vQixFQUF4QyxDQUE0Q3AvQixHQUE1QyxDQUFtRCxDQUVsRCtmLE1BQU8vZixDQUFQLEVBQWEsQ0FBYixDQUVBLENBRUQsQ0FFRCxZQUFjc2dDLFdBQVdsSSxNQUFYLENBQWtCclksS0FBaEMsQ0FFQSxNQUFBLENBQVFzZ0MsRUFBUixDQUFZRCxFQUFaLENBQ0EsT0FBUyxXQUFBLEVBQVQsQ0FBd0IrSCxHQUFLLFdBQUEsRUFBN0IsQ0FBNENDLEdBQUssV0FBQSxFQUFqRCxDQUNBLE9BQVMsV0FBQSxFQUFULENBQXdCbkksR0FBSyxXQUFBLEVBQTdCLENBRUE7RUFFQSxHQUFLcjVDLEtBQUwsQ0FBYSxDQUVaLFlBQWNBLE1BQU1tWixLQUFwQixDQUVBLEdBQUs2L0IsT0FBT2pnRCxNQUFQLEdBQWtCLENBQXZCLENBQTJCLENBRTFCLEtBQUs2bkQsUUFBTCxDQUFlLENBQWYsQ0FBa0IxSCxRQUFRbmdELE1BQTFCLEVBRUEsQ0FFRCxJQUFNLE1BQVEsQ0FBUixDQUFXcy9DLEdBQUtXLE9BQU9qZ0QsTUFBN0IsQ0FBcUNpYyxFQUFJcWpDLEVBQXpDLENBQTZDLEVBQUdyakMsQ0FBaEQsQ0FBb0QsQ0FFbkQsVUFBWWdrQyxPQUFRaGtDLENBQVIsQ0FBWixDQUVBLFVBQVlpa0MsTUFBTXJjLEtBQWxCLENBQ0EsVUFBWXFjLE1BQU1ueEIsS0FBbEIsQ0FFQSxJQUFNLE1BQVE4VSxLQUFSLENBQWVwRSxHQUFLb0UsTUFBUTlVLEtBQWxDLENBQXlDMXVCLEVBQUlvL0IsRUFBN0MsQ0FBaURwL0IsR0FBSyxDQUF0RCxDQUEwRCxDQUV6RHNnRCxHQUFLUixRQUFTOS9DLEVBQUksQ0FBYixFQUFtQixDQUF4QixDQUNBcWdELEdBQUtQLFFBQVM5L0MsRUFBSSxDQUFiLEVBQW1CLENBQXhCLENBQ0FvZ0QsR0FBS04sUUFBUzkvQyxFQUFJLENBQWIsRUFBbUIsQ0FBeEIsQ0FFQXFvRCxHQUFHaGhDLFNBQUgsQ0FBY2k0QixTQUFkLENBQXlCZ0IsRUFBekIsRUFDQTZILEdBQUc5Z0MsU0FBSCxDQUFjaTRCLFNBQWQsQ0FBeUJlLEVBQXpCLEVBQ0ErSCxHQUFHL2dDLFNBQUgsQ0FBY2k0QixTQUFkLENBQXlCYyxFQUF6QixFQUVBRCxHQUFHaDdCLFVBQUgsQ0FBZWlqQyxFQUFmLENBQW1CRCxFQUFuQixFQUNBbEksR0FBRzk2QixVQUFILENBQWVrakMsRUFBZixDQUFtQkYsRUFBbkIsRUFDQWhJLEdBQUcxb0IsS0FBSCxDQUFVd29CLEVBQVYsRUFFQVYsUUFBU2UsRUFBVCxHQUFpQkgsR0FBRzV0QyxDQUFwQixDQUNBZ3RDLFFBQVNlLEdBQUssQ0FBZCxHQUFxQkgsR0FBR3A5QixDQUF4QixDQUNBdzhCLFFBQVNlLEdBQUssQ0FBZCxHQUFxQkgsR0FBR3YyQixDQUF4QixDQUVBMjFCLFFBQVNjLEVBQVQsR0FBaUJGLEdBQUc1dEMsQ0FBcEIsQ0FDQWd0QyxRQUFTYyxHQUFLLENBQWQsR0FBcUJGLEdBQUdwOUIsQ0FBeEIsQ0FDQXc4QixRQUFTYyxHQUFLLENBQWQsR0FBcUJGLEdBQUd2MkIsQ0FBeEIsQ0FFQTIxQixRQUFTYSxFQUFULEdBQWlCRCxHQUFHNXRDLENBQXBCLENBQ0FndEMsUUFBU2EsR0FBSyxDQUFkLEdBQXFCRCxHQUFHcDlCLENBQXhCLENBQ0F3OEIsUUFBU2EsR0FBSyxDQUFkLEdBQXFCRCxHQUFHdjJCLENBQXhCLENBRUEsQ0FFRCxDQUVELENBL0NELElBK0NPO0VBSU4sSUFBTSxNQUFRLENBQVIsQ0FBV3dWLEdBQUtrZ0IsVUFBVTMvQyxNQUFoQyxDQUF3Q0ssRUFBSW8vQixFQUE1QyxDQUFnRHAvQixHQUFLLENBQXJELENBQXlELENBRXhEcW9ELEdBQUdoaEMsU0FBSCxDQUFjaTRCLFNBQWQsQ0FBeUJ0L0MsQ0FBekIsRUFDQW1vRCxHQUFHOWdDLFNBQUgsQ0FBY2k0QixTQUFkLENBQXlCdC9DLEVBQUksQ0FBN0IsRUFDQW9vRCxHQUFHL2dDLFNBQUgsQ0FBY2k0QixTQUFkLENBQXlCdC9DLEVBQUksQ0FBN0IsRUFFQW1nRCxHQUFHaDdCLFVBQUgsQ0FBZWlqQyxFQUFmLENBQW1CRCxFQUFuQixFQUNBbEksR0FBRzk2QixVQUFILENBQWVrakMsRUFBZixDQUFtQkYsRUFBbkIsRUFDQWhJLEdBQUcxb0IsS0FBSCxDQUFVd29CLEVBQVYsRUFFQVYsUUFBU3YvQyxDQUFULEVBQWVtZ0QsR0FBRzV0QyxDQUFsQixDQUNBZ3RDLFFBQVN2L0MsRUFBSSxDQUFiLEVBQW1CbWdELEdBQUdwOUIsQ0FBdEIsQ0FDQXc4QixRQUFTdi9DLEVBQUksQ0FBYixFQUFtQm1nRCxHQUFHdjJCLENBQXRCLENBRUEyMUIsUUFBU3YvQyxFQUFJLENBQWIsRUFBbUJtZ0QsR0FBRzV0QyxDQUF0QixDQUNBZ3RDLFFBQVN2L0MsRUFBSSxDQUFiLEVBQW1CbWdELEdBQUdwOUIsQ0FBdEIsQ0FDQXc4QixRQUFTdi9DLEVBQUksQ0FBYixFQUFtQm1nRCxHQUFHdjJCLENBQXRCLENBRUEyMUIsUUFBU3YvQyxFQUFJLENBQWIsRUFBbUJtZ0QsR0FBRzV0QyxDQUF0QixDQUNBZ3RDLFFBQVN2L0MsRUFBSSxDQUFiLEVBQW1CbWdELEdBQUdwOUIsQ0FBdEIsQ0FDQXc4QixRQUFTdi9DLEVBQUksQ0FBYixFQUFtQm1nRCxHQUFHdjJCLENBQXRCLENBRUEsQ0FFRCxDQUVELEtBQUswK0IsZ0JBQUwsR0FFQWhvQixXQUFXbEksTUFBWCxDQUFrQnV2QixXQUFsQixDQUFnQyxJQUFoQyxDQUVBLENBRUQsQ0E3dUJvRixDQSt1QnJGMWEsTUFBTyxTQUFXaE4sUUFBWCxDQUFxQjNZLE1BQXJCLENBQThCLENBRXBDLEdBQUssRUFBSTJZLFVBQVlBLFNBQVNJLGdCQUF6QixDQUFMLENBQW1ELENBRWxEcHJCLFFBQVFNLEtBQVIsQ0FBZSxpRkFBZixDQUFrRzBxQixRQUFsRyxFQUNBLE9BRUEsQ0FFRCxHQUFLM1ksU0FBV2hwQixTQUFoQixDQUE0QixDQUUzQmdwQixPQUFTLENBQVQsQ0FFQXJTLFFBQVE2UCxJQUFSLENBQ0Msc0ZBQ0UscUVBRkgsRUFLQSxDQUVELGVBQWlCLEtBQUt3YixVQUF0QixDQUVBLElBQU0sT0FBTixjQUFBLENBQThCLENBRTdCLEdBQUtMLFNBQVNLLFVBQVQsQ0FBcUI3Z0MsR0FBckIsSUFBK0JuQixTQUFwQyxDQUFnRCxTQUVoRCxlQUFpQmdpQyxXQUFZN2dDLEdBQVosQ0FBakIsQ0FDQSxvQkFBc0I4b0QsV0FBV3hvQyxLQUFqQyxDQUVBLGVBQWlCa2dCLFNBQVNLLFVBQVQsQ0FBcUI3Z0MsR0FBckIsQ0FBakIsQ0FDQSxvQkFBc0Irb0QsV0FBV3pvQyxLQUFqQyxDQUVBLGtCQUFvQnlvQyxXQUFXaEUsUUFBL0IsQ0FFQSxJQUFNLE1BQVEsQ0FBUixDQUFXNW9DLEVBQUk2c0MsY0FBZ0JuaEMsTUFBckMsQ0FBNkN0bkIsRUFBSTBvRCxnQkFBZ0Ivb0QsTUFBakUsQ0FBeUVLLElBQU00YixHQUEvRSxDQUFzRixDQUVyRitzQyxnQkFBaUIvc0MsQ0FBakIsRUFBdUI4c0MsZ0JBQWlCMW9ELENBQWpCLENBQXZCLENBRUEsQ0FFRCxDQUVELFdBQUEsQ0FFQSxDQTN4Qm9GLENBNnhCckZzb0QsaUJBQWtCLFVBQVksQ0FFN0IsV0FBYSxXQUFBLEVBQWIsQ0FFQSxnQ0FBTyxFQUE0QixDQUVsQyxZQUFjLEtBQUtob0IsVUFBTCxDQUFnQmxJLE1BQTlCLENBRUEsSUFBTSxNQUFRLENBQVIsQ0FBV2dILEdBQUttZ0IsUUFBUTd3QixLQUE5QixDQUFxQzF1QixFQUFJby9CLEVBQXpDLENBQTZDcC9CLEdBQTdDLENBQW9ELENBRW5EK3dCLE9BQU94ZSxDQUFQLENBQVdndEMsUUFBUTczQixJQUFSLENBQWMxbkIsQ0FBZCxDQUFYLENBQ0Erd0IsT0FBT2hPLENBQVAsQ0FBV3c4QixRQUFRNTNCLElBQVIsQ0FBYzNuQixDQUFkLENBQVgsQ0FDQSt3QixPQUFPbkgsQ0FBUCxDQUFXMjFCLFFBQVE1d0IsSUFBUixDQUFjM3VCLENBQWQsQ0FBWCxDQUVBK3dCLE9BQU94SyxTQUFQLEdBRUFnNUIsUUFBUTF3QixNQUFSLENBQWdCN3VCLENBQWhCLENBQW1CK3dCLE9BQU94ZSxDQUExQixDQUE2QndlLE9BQU9oTyxDQUFwQyxDQUF1Q2dPLE9BQU9uSCxDQUE5QyxFQUVBLENBRUQsQ0FoQkQsQ0FrQkEsQ0F0QmlCLEVBN3hCbUUsQ0FxekJyRmcvQixhQUFjLFVBQVksQ0FFekIsR0FBSyxLQUFLaGlELEtBQUwsR0FBZSxJQUFwQixDQUEyQixDQUUxQnFPLFFBQVE2UCxJQUFSLENBQWMsdUVBQWQsRUFDQSxXQUFBLENBRUEsQ0FFRCxjQUFnQixrQkFBQSxFQUFoQixDQUVBLFlBQWMsS0FBS2xlLEtBQUwsQ0FBV21aLEtBQXpCLENBQ0EsZUFBaUIsS0FBS3VnQixVQUF0QixDQUVBLElBQU0sUUFBTixjQUFBLENBQStCLENBRTlCLGNBQWdCQSxXQUFZdGtDLElBQVosQ0FBaEIsQ0FFQSxVQUFZeXJCLFVBQVUxSCxLQUF0QixDQUNBLGFBQWUwSCxVQUFVKzhCLFFBQXpCLENBRUEsV0FBYSxVQUFVaHBELFdBQVYsQ0FBdUJza0QsUUFBUW5nRCxNQUFSLENBQWlCNmtELFFBQXhDLENBQWIsQ0FFQSxVQUFZLENBQVosQ0FBZVEsT0FBUyxDQUF4QixDQUVBLElBQU0sTUFBUSxDQUFSLENBQVd2aUQsRUFBSXE5QyxRQUFRbmdELE1BQTdCLENBQXFDSyxFQUFJeUMsQ0FBekMsQ0FBNEN6QyxHQUE1QyxDQUFtRCxDQUVsRDRHLE1BQVFrNUMsUUFBUzkvQyxDQUFULEVBQWV3a0QsUUFBdkIsQ0FFQSxJQUFNLE1BQVEsQ0FBZCxDQUFpQjVvQyxFQUFJNG9DLFFBQXJCLENBQStCNW9DLEdBQS9CLENBQXNDLENBRXJDaXRDLE9BQVE3RCxRQUFSLEVBQXNCamxDLE1BQU9uWixPQUFQLENBQXRCLENBRUEsQ0FFRCxDQUVEa2lELFVBQVV6QixZQUFWLENBQXdCcnJELElBQXhCLENBQThCLG1CQUFBLENBQXFCNnNELE1BQXJCLENBQTZCckUsUUFBN0IsQ0FBOUIsRUFFQSxDQUVELFdBQWEsS0FBSzVFLE1BQWxCLENBRUEsSUFBTSxNQUFRLENBQVIsQ0FBV245QyxFQUFJbTlDLE9BQU9qZ0QsTUFBNUIsQ0FBb0NLLEVBQUl5QyxDQUF4QyxDQUEyQ3pDLEdBQTNDLENBQWtELENBRWpELFVBQVk0L0MsT0FBUTUvQyxDQUFSLENBQVosQ0FDQThvRCxVQUFVdEIsUUFBVixDQUFvQjNILE1BQU1yYyxLQUExQixDQUFpQ3FjLE1BQU1ueEIsS0FBdkMsQ0FBOENteEIsTUFBTXBDLGFBQXBELEVBRUEsQ0FFRCxnQkFBQSxDQUVBLENBejJCb0YsQ0EyMkJyRi9oQixPQUFRLFVBQVksQ0FFbkIsU0FBVyxDQUNWVyxTQUFVLENBQ1R2NUIsUUFBUyxHQURBLENBRVRuSSxLQUFNLGdCQUZHLENBR1RQLFVBQVcsdUJBSEYsQ0FEQSxDQUFYLENBUUE7RUFFQWlWLEtBQUtnckIsSUFBTCxDQUFZLEtBQUtBLElBQWpCLENBQ0FockIsS0FBSzFVLElBQUwsQ0FBWSxLQUFLQSxJQUFqQixDQUNBLEdBQUssS0FBS3FCLElBQUwsR0FBYyxFQUFuQixDQUF3QnFULEtBQUtyVCxJQUFMLENBQVksS0FBS0EsSUFBakIsQ0FFeEIsR0FBSyxLQUFLKy9DLFVBQUwsR0FBb0J6OUMsU0FBekIsQ0FBcUMsQ0FFcEMsZUFBaUIsS0FBS3k5QyxVQUF0QixDQUVBLElBQU0sT0FBTixjQUFBLENBQThCLENBRTdCLEdBQUtBLFdBQVl0OEMsR0FBWixJQUFzQm5CLFNBQTNCLENBQXVDK1EsS0FBTTVQLEdBQU4sRUFBY3M4QyxXQUFZdDhDLEdBQVosQ0FBZCxDQUV2QyxDQUVELFdBQUEsQ0FFQSxDQUVENFAsS0FBS0EsSUFBTCxDQUFZLENBQUVpeEIsV0FBWSxFQUFkLENBQVosQ0FFQSxVQUFZLEtBQUsxNUIsS0FBakIsQ0FFQSxHQUFLQSxRQUFVLElBQWYsQ0FBc0IsQ0FFckIsVUFBWWtHLE1BQU01VCxTQUFOLENBQWdCcUgsS0FBaEIsQ0FBc0IzRixJQUF0QixDQUE0QmdNLE1BQU1tWixLQUFsQyxDQUFaLENBRUExUSxLQUFLQSxJQUFMLENBQVV6SSxLQUFWLENBQWtCLENBQ2pCak0sS0FBTWlNLE1BQU1tWixLQUFOLENBQVl2a0IsV0FBWixDQUF3QlEsSUFEYixDQUVqQitqQixNQUFPQSxLQUZVLENBQWxCLENBS0EsQ0FFRCxlQUFpQixLQUFLdWdCLFVBQXRCLENBRUEsSUFBTSxPQUFOLGNBQUEsQ0FBOEIsQ0FFN0IsY0FBZ0JBLFdBQVk3Z0MsR0FBWixDQUFoQixDQUVBLFVBQVlxTixNQUFNNVQsU0FBTixDQUFnQnFILEtBQWhCLENBQXNCM0YsSUFBdEIsQ0FBNEI2c0IsVUFBVTFILEtBQXRDLENBQVosQ0FFQTFRLEtBQUtBLElBQUwsQ0FBVWl4QixVQUFWLENBQXNCN2dDLEdBQXRCLEVBQThCLENBQzdCK2tELFNBQVUvOEIsVUFBVSs4QixRQURTLENBRTdCN3BELEtBQU04c0IsVUFBVTFILEtBQVYsQ0FBZ0J2a0IsV0FBaEIsQ0FBNEJRLElBRkwsQ0FHN0IrakIsTUFBT0EsS0FIc0IsQ0FJN0Iwa0MsV0FBWWg5QixVQUFVZzlCLFVBSk8sQ0FBOUIsQ0FPQSxDQUVELFdBQWEsS0FBSzdFLE1BQWxCLENBRUEsR0FBS0EsT0FBT2pnRCxNQUFQLENBQWdCLENBQXJCLENBQXlCLENBRXhCMFAsS0FBS0EsSUFBTCxDQUFVdXdDLE1BQVYsQ0FBbUI1bEMsS0FBS3NpQyxLQUFMLENBQVl0aUMsS0FBS0UsU0FBTCxDQUFnQjBsQyxNQUFoQixDQUFaLENBQW5CLENBRUEsQ0FFRCxtQkFBcUIsS0FBS2xhLGNBQTFCLENBRUEsR0FBS0EsaUJBQW1CLElBQXhCLENBQStCLENBRTlCcjJCLEtBQUtBLElBQUwsQ0FBVXEyQixjQUFWLENBQTJCLENBQzFCN2QsT0FBUTZkLGVBQWU3ZCxNQUFmLENBQXNCTixPQUF0QixFQURrQixDQUUxQm1SLE9BQVFnTixlQUFlaE4sTUFGRyxDQUEzQixDQUtBLENBRUQsV0FBQSxDQUVBLENBOTdCb0YsQ0FnOEJyRi9ULE1BQU8sVUFBWTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQTBCbEIseUJBQU8sR0FBcUJDLElBQXJCLENBQTJCLElBQTNCLENBQVAsQ0FFQSxDQTU5Qm9GLENBODlCckZBLEtBQU0sU0FBVzVmLE1BQVgsQ0FBb0IsQ0FFekIsUUFBQSxDQUFVaEYsQ0FBVixDQUFheUMsQ0FBYixDQUVBO0VBRUEsS0FBS21FLEtBQUwsQ0FBYSxJQUFiLENBQ0EsS0FBSzA1QixVQUFMLENBQWtCLEVBQWxCLENBQ0EsS0FBS3ltQixlQUFMLENBQXVCLEVBQXZCLENBQ0EsS0FBS25ILE1BQUwsQ0FBYyxFQUFkLENBQ0EsS0FBS3RCLFdBQUwsQ0FBbUIsSUFBbkIsQ0FDQSxLQUFLNVksY0FBTCxDQUFzQixJQUF0QixDQUVBO0VBRUEsS0FBSzFwQyxJQUFMLENBQVlnSixPQUFPaEosSUFBbkIsQ0FFQTtFQUVBLFVBQVlnSixPQUFPNEIsS0FBbkIsQ0FFQSxHQUFLQSxRQUFVLElBQWYsQ0FBc0IsQ0FFckIsS0FBS3VnRCxRQUFMLENBQWV2Z0QsTUFBTStkLEtBQU4sRUFBZixFQUVBLENBRUQ7RUFFQSxlQUFpQjNmLE9BQU9zN0IsVUFBeEIsQ0FFQSxJQUFNdGtDLElBQU4sY0FBQSxDQUEyQixDQUUxQixjQUFnQnNrQyxXQUFZdGtDLElBQVosQ0FBaEIsQ0FDQSxLQUFLcXJELFlBQUwsQ0FBbUJyckQsSUFBbkIsQ0FBeUJ5ckIsVUFBVTlDLEtBQVYsRUFBekIsRUFFQSxDQUVEO0VBRUEsb0JBQXNCM2YsT0FBTytoRCxlQUE3QixDQUVBLElBQU0vcUQsSUFBTixtQkFBQSxDQUFnQyxDQUUvQixVQUFZLEVBQVosQ0FDQSxtQkFBcUIrcUQsZ0JBQWlCL3FELElBQWpCLENBQXJCLENBQThDO0VBRTlDLElBQU1nRSxFQUFJLENBQUosQ0FBT3lDLEVBQUlzbUQsZUFBZXBwRCxNQUFoQyxDQUF3Q0ssRUFBSXlDLENBQTVDLENBQStDekMsR0FBL0MsQ0FBc0QsQ0FFckQrZixNQUFNNWdCLElBQU4sQ0FBWTRwRCxlQUFnQi9vRCxDQUFoQixFQUFvQjJrQixLQUFwQixFQUFaLEVBRUEsQ0FFRCxLQUFLb2lDLGVBQUwsQ0FBc0IvcUQsSUFBdEIsRUFBK0IrakIsS0FBL0IsQ0FFQSxDQUVEO0VBRUEsV0FBYS9hLE9BQU80NkMsTUFBcEIsQ0FFQSxJQUFNNS9DLEVBQUksQ0FBSixDQUFPeUMsRUFBSW05QyxPQUFPamdELE1BQXhCLENBQWdDSyxFQUFJeUMsQ0FBcEMsQ0FBdUN6QyxHQUF2QyxDQUE4QyxDQUU3QyxVQUFZNC9DLE9BQVE1L0MsQ0FBUixDQUFaLENBQ0EsS0FBS3duRCxRQUFMLENBQWUzSCxNQUFNcmMsS0FBckIsQ0FBNEJxYyxNQUFNbnhCLEtBQWxDLENBQXlDbXhCLE1BQU1wQyxhQUEvQyxFQUVBLENBRUQ7RUFFQSxnQkFBa0J6NEMsT0FBT3M1QyxXQUF6QixDQUVBLEdBQUtBLGNBQWdCLElBQXJCLENBQTRCLENBRTNCLEtBQUtBLFdBQUwsQ0FBbUJBLFlBQVkzNUIsS0FBWixFQUFuQixDQUVBLENBRUQ7RUFFQSxtQkFBcUIzZixPQUFPMGdDLGNBQTVCLENBRUEsR0FBS0EsaUJBQW1CLElBQXhCLENBQStCLENBRTlCLEtBQUtBLGNBQUwsQ0FBc0JBLGVBQWUvZ0IsS0FBZixFQUF0QixDQUVBLENBRUQ7RUFFQSxLQUFLcWlDLFNBQUwsQ0FBZXhqQixLQUFmLENBQXVCeCtCLE9BQU9naUQsU0FBUCxDQUFpQnhqQixLQUF4QyxDQUNBLEtBQUt3akIsU0FBTCxDQUFldDRCLEtBQWYsQ0FBdUIxcEIsT0FBT2dpRCxTQUFQLENBQWlCdDRCLEtBQXhDLENBRUEsV0FBQSxDQUVBLENBN2pDb0YsQ0ErakNyRitOLFFBQVMsVUFBWSxDQUVwQixLQUFLbGIsYUFBTCxDQUFvQixDQUFFNW1CLEtBQU0sU0FBUixDQUFwQixFQUVBLENBbmtDb0YsQ0FBM0QsQ0FBM0IsQ0F1a0NBOzs7O0VBT0Esb0JBQUEsQ0FBc0JvaEMsS0FBdEIsQ0FBNkJDLE1BQTdCLENBQXFDOFksS0FBckMsQ0FBNENrVSxhQUE1QyxDQUEyREMsY0FBM0QsQ0FBMkVDLGFBQTNFLENBQTJGLENBRTFGcEssU0FBU2xrRCxJQUFULENBQWUsSUFBZixFQUVBLEtBQUtELElBQUwsQ0FBWSxhQUFaLENBRUEsS0FBS29oRCxVQUFMLENBQWtCLENBQ2pCaGdCLE1BQU9BLEtBRFUsQ0FFakJDLE9BQVFBLE1BRlMsQ0FHakI4WSxNQUFPQSxLQUhVLENBSWpCa1UsY0FBZUEsYUFKRSxDQUtqQkMsZUFBZ0JBLGNBTEMsQ0FNakJDLGNBQWVBLGFBTkUsQ0FBbEIsQ0FTQSxLQUFLL0osa0JBQUwsQ0FBeUIscUJBQUEsQ0FBdUJwakIsS0FBdkIsQ0FBOEJDLE1BQTlCLENBQXNDOFksS0FBdEMsQ0FBNkNrVSxhQUE3QyxDQUE0REMsY0FBNUQsQ0FBNEVDLGFBQTVFLENBQXpCLEVBQ0EsS0FBSzlHLGFBQUwsR0FFQSxDQUVEK0csWUFBWWp3RCxTQUFaLENBQXdCRCxPQUFPaUIsTUFBUCxDQUFlNGtELFNBQVM1bEQsU0FBeEIsQ0FBeEIsQ0FDQWl3RCxZQUFZandELFNBQVosQ0FBc0JzQyxXQUF0QixDQUFvQzJ0RCxXQUFwQyxDQUVBO0VBRUEsMEJBQUEsQ0FBNEJwdEIsS0FBNUIsQ0FBbUNDLE1BQW5DLENBQTJDOFksS0FBM0MsQ0FBa0RrVSxhQUFsRCxDQUFpRUMsY0FBakUsQ0FBaUZDLGFBQWpGLENBQWlHLENBRWhHakMsZUFBZXJzRCxJQUFmLENBQXFCLElBQXJCLEVBRUEsS0FBS0QsSUFBTCxDQUFZLG1CQUFaLENBRUEsS0FBS29oRCxVQUFMLENBQWtCLENBQ2pCaGdCLE1BQU9BLEtBRFUsQ0FFakJDLE9BQVFBLE1BRlMsQ0FHakI4WSxNQUFPQSxLQUhVLENBSWpCa1UsY0FBZUEsYUFKRSxDQUtqQkMsZUFBZ0JBLGNBTEMsQ0FNakJDLGNBQWVBLGFBTkUsQ0FBbEIsQ0FTQSxVQUFZLElBQVosQ0FFQW50QixNQUFRQSxPQUFTLENBQWpCLENBQ0FDLE9BQVNBLFFBQVUsQ0FBbkIsQ0FDQThZLE1BQVFBLE9BQVMsQ0FBakIsQ0FFQTtFQUVBa1UsY0FBZ0JubkQsS0FBS0UsS0FBTCxDQUFZaW5ELGFBQVosR0FBK0IsQ0FBL0MsQ0FDQUMsZUFBaUJwbkQsS0FBS0UsS0FBTCxDQUFZa25ELGNBQVosR0FBZ0MsQ0FBakQsQ0FDQUMsY0FBZ0JybkQsS0FBS0UsS0FBTCxDQUFZbW5ELGFBQVosR0FBK0IsQ0FBL0MsQ0FFQTtFQUVBLFlBQWMsRUFBZCxDQUNBLGFBQWUsRUFBZixDQUNBLFlBQWMsRUFBZCxDQUNBLFFBQVUsRUFBVixDQUVBO0VBRUEscUJBQXVCLENBQXZCLENBQ0EsZUFBaUIsQ0FBakIsQ0FFQTtFQUVBRSxXQUFZLEdBQVosQ0FBaUIsR0FBakIsQ0FBc0IsR0FBdEIsQ0FBMkIsQ0FBRSxDQUE3QixDQUFnQyxDQUFFLENBQWxDLENBQXFDdFUsS0FBckMsQ0FBNEM5WSxNQUE1QyxDQUFvREQsS0FBcEQsQ0FBMkRtdEIsYUFBM0QsQ0FBMEVELGNBQTFFLENBQTBGLENBQTFGLEVBQStGO0VBQy9GRyxXQUFZLEdBQVosQ0FBaUIsR0FBakIsQ0FBc0IsR0FBdEIsQ0FBMkIsQ0FBM0IsQ0FBOEIsQ0FBRSxDQUFoQyxDQUFtQ3RVLEtBQW5DLENBQTBDOVksTUFBMUMsQ0FBa0QsQ0FBRUQsS0FBcEQsQ0FBMkRtdEIsYUFBM0QsQ0FBMEVELGNBQTFFLENBQTBGLENBQTFGLEVBQStGO0VBQy9GRyxXQUFZLEdBQVosQ0FBaUIsR0FBakIsQ0FBc0IsR0FBdEIsQ0FBMkIsQ0FBM0IsQ0FBOEIsQ0FBOUIsQ0FBaUNydEIsS0FBakMsQ0FBd0MrWSxLQUF4QyxDQUErQzlZLE1BQS9DLENBQXVEZ3RCLGFBQXZELENBQXNFRSxhQUF0RSxDQUFxRixDQUFyRixFQUEwRjtFQUMxRkUsV0FBWSxHQUFaLENBQWlCLEdBQWpCLENBQXNCLEdBQXRCLENBQTJCLENBQTNCLENBQThCLENBQUUsQ0FBaEMsQ0FBbUNydEIsS0FBbkMsQ0FBMEMrWSxLQUExQyxDQUFpRCxDQUFFOVksTUFBbkQsQ0FBMkRndEIsYUFBM0QsQ0FBMEVFLGFBQTFFLENBQXlGLENBQXpGLEVBQThGO0VBQzlGRSxXQUFZLEdBQVosQ0FBaUIsR0FBakIsQ0FBc0IsR0FBdEIsQ0FBMkIsQ0FBM0IsQ0FBOEIsQ0FBRSxDQUFoQyxDQUFtQ3J0QixLQUFuQyxDQUEwQ0MsTUFBMUMsQ0FBa0Q4WSxLQUFsRCxDQUF5RGtVLGFBQXpELENBQXdFQyxjQUF4RSxDQUF3RixDQUF4RixFQUE2RjtFQUM3RkcsV0FBWSxHQUFaLENBQWlCLEdBQWpCLENBQXNCLEdBQXRCLENBQTJCLENBQUUsQ0FBN0IsQ0FBZ0MsQ0FBRSxDQUFsQyxDQUFxQ3J0QixLQUFyQyxDQUE0Q0MsTUFBNUMsQ0FBb0QsQ0FBRThZLEtBQXRELENBQTZEa1UsYUFBN0QsQ0FBNEVDLGNBQTVFLENBQTRGLENBQTVGLEVBQWlHO0VBRWpHO0VBRUEsS0FBSzlCLFFBQUwsQ0FBZXJILE9BQWYsRUFDQSxLQUFLdUgsWUFBTCxDQUFtQixVQUFuQixDQUErQiwwQkFBQSxDQUE0QmxuQixRQUE1QixDQUFzQyxDQUF0QyxDQUEvQixFQUNBLEtBQUtrbkIsWUFBTCxDQUFtQixRQUFuQixDQUE2QiwwQkFBQSxDQUE0QjlILE9BQTVCLENBQXFDLENBQXJDLENBQTdCLEVBQ0EsS0FBSzhILFlBQUwsQ0FBbUIsSUFBbkIsQ0FBeUIsMEJBQUEsQ0FBNEI1SCxHQUE1QixDQUFpQyxDQUFqQyxDQUF6QixFQUVBLG1CQUFBLENBQXFCdFMsQ0FBckIsQ0FBd0I5NkIsQ0FBeEIsQ0FBMkJpRyxDQUEzQixDQUE4Qit3QyxJQUE5QixDQUFvQ0MsSUFBcEMsQ0FBMEN2dEIsS0FBMUMsQ0FBaURDLE1BQWpELENBQXlEOFksS0FBekQsQ0FBZ0V5VSxLQUFoRSxDQUF1RUMsS0FBdkUsQ0FBOEUvTCxhQUE5RSxDQUE4RixDQUU3RixpQkFBbUIxaEIsTUFBUXd0QixLQUEzQixDQUNBLGtCQUFvQnZ0QixPQUFTd3RCLEtBQTdCLENBRUEsY0FBZ0J6dEIsTUFBUSxDQUF4QixDQUNBLGVBQWlCQyxPQUFTLENBQTFCLENBQ0EsY0FBZ0I4WSxNQUFRLENBQXhCLENBRUEsV0FBYXlVLE1BQVEsQ0FBckIsQ0FDQSxXQUFhQyxNQUFRLENBQXJCLENBRUEsa0JBQW9CLENBQXBCLENBQ0EsZUFBaUIsQ0FBakIsQ0FFQSxNQUFBLENBQVF2eUIsRUFBUixDQUVBLFdBQWEsV0FBQSxFQUFiLENBRUE7RUFFQSxJQUFNQSxHQUFLLENBQVgsQ0FBY0EsR0FBS3d5QixNQUFuQixDQUEyQnh5QixJQUEzQixDQUFtQyxDQUVsQyxNQUFRQSxHQUFLeXlCLGFBQUwsQ0FBcUJDLFVBQTdCLENBRUEsSUFBTTV5QixHQUFLLENBQVgsQ0FBY0EsR0FBSzZ5QixNQUFuQixDQUEyQjd5QixJQUEzQixDQUFtQyxDQUVsQyxNQUFRQSxHQUFLOHlCLFlBQUwsQ0FBb0JDLFNBQTVCLENBRUE7RUFFQS80QixPQUFRb2MsQ0FBUixFQUFjNTZCLEVBQUk4MkMsSUFBbEIsQ0FDQXQ0QixPQUFRMWUsQ0FBUixFQUFjMFEsRUFBSXVtQyxJQUFsQixDQUNBdjRCLE9BQVF6WSxDQUFSLEVBQWN5eEMsU0FBZCxDQUVBO0VBRUE1cEIsU0FBU2hoQyxJQUFULENBQWU0eEIsT0FBT3hlLENBQXRCLENBQXlCd2UsT0FBT2hPLENBQWhDLENBQW1DZ08sT0FBT25ILENBQTFDLEVBRUE7RUFFQW1ILE9BQVFvYyxDQUFSLEVBQWMsQ0FBZCxDQUNBcGMsT0FBUTFlLENBQVIsRUFBYyxDQUFkLENBQ0EwZSxPQUFRelksQ0FBUixFQUFjdzhCLE1BQVEsQ0FBUixDQUFZLENBQVosQ0FBZ0IsQ0FBRSxDQUFoQyxDQUVBO0VBRUF5SyxRQUFRcGdELElBQVIsQ0FBYzR4QixPQUFPeGUsQ0FBckIsQ0FBd0J3ZSxPQUFPaE8sQ0FBL0IsQ0FBa0NnTyxPQUFPbkgsQ0FBekMsRUFFQTtFQUVBNjFCLElBQUl0Z0QsSUFBSixDQUFVNDNCLEdBQUt3eUIsS0FBZixFQUNBOUosSUFBSXRnRCxJQUFKLENBQVUsRUFBTTgzQixHQUFLdXlCLEtBQXJCLEVBRUE7RUFFQVEsZUFBaUIsQ0FBakIsQ0FFQSxDQUVELENBRUQ7RUFFQTtFQUNBO0VBQ0E7RUFFQSxJQUFNL3lCLEdBQUssQ0FBWCxDQUFjQSxHQUFLdXlCLEtBQW5CLENBQTBCdnlCLElBQTFCLENBQWtDLENBRWpDLElBQU1GLEdBQUssQ0FBWCxDQUFjQSxHQUFLd3lCLEtBQW5CLENBQTBCeHlCLElBQTFCLENBQWtDLENBRWpDLE1BQVFrekIsaUJBQW1CbHpCLEVBQW5CLENBQXdCNnlCLE9BQVMzeUIsRUFBekMsQ0FDQSxNQUFRZ3pCLGlCQUFtQmx6QixFQUFuQixDQUF3QjZ5QixRQUFXM3lCLEdBQUssQ0FBaEIsQ0FBaEMsQ0FDQSxNQUFRZ3pCLGtCQUFxQmx6QixHQUFLLENBQTFCLEVBQWdDNnlCLFFBQVczeUIsR0FBSyxDQUFoQixDQUF4QyxDQUNBLE1BQVFnekIsa0JBQXFCbHpCLEdBQUssQ0FBMUIsRUFBZ0M2eUIsT0FBUzN5QixFQUFqRCxDQUVBO0VBRUE2b0IsUUFBUTNnRCxJQUFSLENBQWN1RCxDQUFkLENBQWlCRixDQUFqQixDQUFvQjRuQixDQUFwQixFQUNBMDFCLFFBQVEzZ0QsSUFBUixDQUFjcUQsQ0FBZCxDQUFpQlcsQ0FBakIsQ0FBb0JpbkIsQ0FBcEIsRUFFQTtFQUVBOC9CLFlBQWMsQ0FBZCxDQUVBLENBRUQsQ0FFRDtFQUVBOXBCLE1BQU1vbkIsUUFBTixDQUFnQjJDLFVBQWhCLENBQTRCRCxVQUE1QixDQUF3Q3pNLGFBQXhDLEVBRUE7RUFFQTBNLFlBQWNELFVBQWQsQ0FFQTtFQUVBRCxrQkFBb0JELGFBQXBCLENBRUEsQ0FFRCxDQUVESSxrQkFBa0JseEQsU0FBbEIsQ0FBOEJELE9BQU9pQixNQUFQLENBQWUrc0QsZUFBZS90RCxTQUE5QixDQUE5QixDQUNBa3hELGtCQUFrQmx4RCxTQUFsQixDQUE0QnNDLFdBQTVCLENBQTBDNHVELGlCQUExQyxDQUVBOzs7O0VBT0Esc0JBQUEsQ0FBd0JydUIsS0FBeEIsQ0FBK0JDLE1BQS9CLENBQXVDZ3RCLGFBQXZDLENBQXNEQyxjQUF0RCxDQUF1RSxDQUV0RW5LLFNBQVNsa0QsSUFBVCxDQUFlLElBQWYsRUFFQSxLQUFLRCxJQUFMLENBQVksZUFBWixDQUVBLEtBQUtvaEQsVUFBTCxDQUFrQixDQUNqQmhnQixNQUFPQSxLQURVLENBRWpCQyxPQUFRQSxNQUZTLENBR2pCZ3RCLGNBQWVBLGFBSEUsQ0FJakJDLGVBQWdCQSxjQUpDLENBQWxCLENBT0EsS0FBSzlKLGtCQUFMLENBQXlCLHVCQUFBLENBQXlCcGpCLEtBQXpCLENBQWdDQyxNQUFoQyxDQUF3Q2d0QixhQUF4QyxDQUF1REMsY0FBdkQsQ0FBekIsRUFDQSxLQUFLN0csYUFBTCxHQUVBLENBRURpSSxjQUFjbnhELFNBQWQsQ0FBMEJELE9BQU9pQixNQUFQLENBQWU0a0QsU0FBUzVsRCxTQUF4QixDQUExQixDQUNBbXhELGNBQWNueEQsU0FBZCxDQUF3QnNDLFdBQXhCLENBQXNDNnVELGFBQXRDLENBRUE7RUFFQSw0QkFBQSxDQUE4QnR1QixLQUE5QixDQUFxQ0MsTUFBckMsQ0FBNkNndEIsYUFBN0MsQ0FBNERDLGNBQTVELENBQTZFLENBRTVFaEMsZUFBZXJzRCxJQUFmLENBQXFCLElBQXJCLEVBRUEsS0FBS0QsSUFBTCxDQUFZLHFCQUFaLENBRUEsS0FBS29oRCxVQUFMLENBQWtCLENBQ2pCaGdCLE1BQU9BLEtBRFUsQ0FFakJDLE9BQVFBLE1BRlMsQ0FHakJndEIsY0FBZUEsYUFIRSxDQUlqQkMsZUFBZ0JBLGNBSkMsQ0FBbEIsQ0FPQWx0QixNQUFRQSxPQUFTLENBQWpCLENBQ0FDLE9BQVNBLFFBQVUsQ0FBbkIsQ0FFQSxlQUFpQkQsTUFBUSxDQUF6QixDQUNBLGdCQUFrQkMsT0FBUyxDQUEzQixDQUVBLFVBQVluNkIsS0FBS0UsS0FBTCxDQUFZaW5ELGFBQVosR0FBK0IsQ0FBM0MsQ0FDQSxVQUFZbm5ELEtBQUtFLEtBQUwsQ0FBWWtuRCxjQUFaLEdBQWdDLENBQTVDLENBRUEsV0FBYU0sTUFBUSxDQUFyQixDQUNBLFdBQWFDLE1BQVEsQ0FBckIsQ0FFQSxrQkFBb0J6dEIsTUFBUXd0QixLQUE1QixDQUNBLG1CQUFxQnZ0QixPQUFTd3RCLEtBQTlCLENBRUEsTUFBQSxDQUFRdnlCLEVBQVIsQ0FFQTtFQUVBLFlBQWMsRUFBZCxDQUNBLGFBQWUsRUFBZixDQUNBLFlBQWMsRUFBZCxDQUNBLFFBQVUsRUFBVixDQUVBO0VBRUEsSUFBTUEsR0FBSyxDQUFYLENBQWNBLEdBQUt3eUIsTUFBbkIsQ0FBMkJ4eUIsSUFBM0IsQ0FBbUMsQ0FFbEMsTUFBUUEsR0FBS3F6QixjQUFMLENBQXNCQyxXQUE5QixDQUVBLElBQU14ekIsR0FBSyxDQUFYLENBQWNBLEdBQUs2eUIsTUFBbkIsQ0FBMkI3eUIsSUFBM0IsQ0FBbUMsQ0FFbEMsTUFBUUEsR0FBS3l6QixhQUFMLENBQXFCQyxVQUE3QixDQUVBdHFCLFNBQVNoaEMsSUFBVCxDQUFlb1QsQ0FBZixDQUFrQixDQUFFd1EsQ0FBcEIsQ0FBdUIsQ0FBdkIsRUFFQXc4QixRQUFRcGdELElBQVIsQ0FBYyxDQUFkLENBQWlCLENBQWpCLENBQW9CLENBQXBCLEVBRUFzZ0QsSUFBSXRnRCxJQUFKLENBQVU0M0IsR0FBS3d5QixLQUFmLEVBQ0E5SixJQUFJdGdELElBQUosQ0FBVSxFQUFNODNCLEdBQUt1eUIsS0FBckIsRUFFQSxDQUVELENBRUQ7RUFFQSxJQUFNdnlCLEdBQUssQ0FBWCxDQUFjQSxHQUFLdXlCLEtBQW5CLENBQTBCdnlCLElBQTFCLENBQWtDLENBRWpDLElBQU1GLEdBQUssQ0FBWCxDQUFjQSxHQUFLd3lCLEtBQW5CLENBQTBCeHlCLElBQTFCLENBQWtDLENBRWpDLE1BQVFBLEdBQUs2eUIsT0FBUzN5QixFQUF0QixDQUNBLE1BQVFGLEdBQUs2eUIsUUFBVzN5QixHQUFLLENBQWhCLENBQWIsQ0FDQSxNQUFVRixHQUFLLENBQVAsQ0FBYTZ5QixRQUFXM3lCLEdBQUssQ0FBaEIsQ0FBckIsQ0FDQSxNQUFVRixHQUFLLENBQVAsQ0FBYTZ5QixPQUFTM3lCLEVBQTlCLENBRUE7RUFFQTZvQixRQUFRM2dELElBQVIsQ0FBY3VELENBQWQsQ0FBaUJGLENBQWpCLENBQW9CNG5CLENBQXBCLEVBQ0EwMUIsUUFBUTNnRCxJQUFSLENBQWNxRCxDQUFkLENBQWlCVyxDQUFqQixDQUFvQmluQixDQUFwQixFQUVBLENBRUQsQ0FFRDtFQUVBLEtBQUsrOEIsUUFBTCxDQUFlckgsT0FBZixFQUNBLEtBQUt1SCxZQUFMLENBQW1CLFVBQW5CLENBQStCLDBCQUFBLENBQTRCbG5CLFFBQTVCLENBQXNDLENBQXRDLENBQS9CLEVBQ0EsS0FBS2tuQixZQUFMLENBQW1CLFFBQW5CLENBQTZCLDBCQUFBLENBQTRCOUgsT0FBNUIsQ0FBcUMsQ0FBckMsQ0FBN0IsRUFDQSxLQUFLOEgsWUFBTCxDQUFtQixJQUFuQixDQUF5QiwwQkFBQSxDQUE0QjVILEdBQTVCLENBQWlDLENBQWpDLENBQXpCLEVBRUEsQ0FFRGlMLG9CQUFvQnh4RCxTQUFwQixDQUFnQ0QsT0FBT2lCLE1BQVAsQ0FBZStzRCxlQUFlL3RELFNBQTlCLENBQWhDLENBQ0F3eEQsb0JBQW9CeHhELFNBQXBCLENBQThCc0MsV0FBOUIsQ0FBNENrdkQsbUJBQTVDLENBRUE7OztLQUtBLGVBQWlCLENBQWpCLENBRUEsaUJBQUEsRUFBb0IsQ0FFbkJ6eEQsT0FBT3dLLGNBQVAsQ0FBdUIsSUFBdkIsQ0FBNkIsSUFBN0IsQ0FBbUMsQ0FBRTlHLE1BQU9ndUQsWUFBVCxDQUFuQyxFQUVBLEtBQUt0d0IsSUFBTCxDQUFZMVcsTUFBTTdCLFlBQU4sRUFBWixDQUVBLEtBQUs5bEIsSUFBTCxDQUFZLEVBQVosQ0FDQSxLQUFLckIsSUFBTCxDQUFZLFVBQVosQ0FFQSxLQUFLbTNDLEdBQUwsQ0FBVyxJQUFYLENBQ0EsS0FBS0ssTUFBTCxDQUFjLElBQWQsQ0FFQSxLQUFLeVksUUFBTCxDQUFnQkMsY0FBaEIsQ0FDQSxLQUFLQyxJQUFMLENBQVlDLFNBQVosQ0FDQSxLQUFLQyxXQUFMLENBQW1CLEtBQW5CLENBQ0EsS0FBS3JOLFlBQUwsQ0FBb0JzTixRQUFwQixDQUE4QjtFQUU5QixLQUFLdmIsT0FBTCxDQUFlLENBQWYsQ0FDQSxLQUFLd2IsV0FBTCxDQUFtQixLQUFuQixDQUVBLEtBQUtDLFFBQUwsQ0FBZ0JDLGNBQWhCLENBQ0EsS0FBS0MsUUFBTCxDQUFnQkMsc0JBQWhCLENBQ0EsS0FBS0MsYUFBTCxDQUFxQkMsV0FBckIsQ0FDQSxLQUFLQyxhQUFMLENBQXFCLElBQXJCLENBQ0EsS0FBS0MsYUFBTCxDQUFxQixJQUFyQixDQUNBLEtBQUtDLGtCQUFMLENBQTBCLElBQTFCLENBRUEsS0FBS0MsU0FBTCxDQUFpQkMsY0FBakIsQ0FDQSxLQUFLQyxTQUFMLENBQWlCLElBQWpCLENBQ0EsS0FBS0MsVUFBTCxDQUFrQixJQUFsQixDQUVBLEtBQUtDLGNBQUwsQ0FBc0IsSUFBdEIsQ0FDQSxLQUFLQyxnQkFBTCxDQUF3QixLQUF4QixDQUNBLEtBQUtDLFdBQUwsQ0FBbUIsS0FBbkIsQ0FFQSxLQUFLQyxVQUFMLENBQWtCLElBQWxCLENBRUEsS0FBS0MsVUFBTCxDQUFrQixJQUFsQixDQUVBLEtBQUs3SixTQUFMLENBQWlCLElBQWpCLENBQXVCO0VBRXZCLEtBQUs4SixhQUFMLENBQXFCLEtBQXJCLENBQ0EsS0FBS0MsbUJBQUwsQ0FBMkIsQ0FBM0IsQ0FDQSxLQUFLQyxrQkFBTCxDQUEwQixDQUExQixDQUVBLEtBQUtDLFNBQUwsQ0FBaUIsS0FBakIsQ0FFQSxLQUFLQyxTQUFMLENBQWlCLENBQWpCLENBQ0EsS0FBS0Msa0JBQUwsQ0FBMEIsS0FBMUIsQ0FFQSxLQUFLQyxRQUFMLENBQWdCLENBQWhCLENBQW1CO0VBRW5CLEtBQUt6VCxPQUFMLENBQWUsSUFBZixDQUVBLEtBQUtLLFFBQUwsQ0FBZ0IsRUFBaEIsQ0FFQSxLQUFLb08sV0FBTCxDQUFtQixJQUFuQixDQUVBLENBRURpRixTQUFTMXpELFNBQVQsQ0FBcUJELE9BQU80bkIsTUFBUCxDQUFlNW5CLE9BQU9pQixNQUFQLENBQWU4bUIsZ0JBQWdCOW5CLFNBQS9CLENBQWYsQ0FBMkQsQ0FFL0VzQyxZQUFhb3hELFFBRmtFLENBSS9FQyxXQUFZLElBSm1FLENBTS9FQyxnQkFBaUIsVUFBWSxFQU5rRCxDQVEvRUMsVUFBVyxTQUFXN3hELE1BQVgsQ0FBb0IsQ0FFOUIsR0FBS0EsU0FBV29ELFNBQWhCLENBQTRCLE9BRTVCLElBQU0sT0FBTixVQUFBLENBQTBCLENBRXpCLGFBQWVwRCxPQUFRdUUsR0FBUixDQUFmLENBRUEsR0FBS3V0RCxXQUFhMXVELFNBQWxCLENBQThCLENBRTdCMlcsUUFBUTZQLElBQVIsQ0FBYyxvQkFBc0JybEIsR0FBdEIsQ0FBNEIsMkJBQTFDLEVBQ0EsU0FFQSxDQUVEO0VBQ0EsR0FBS0EsTUFBUSxTQUFiLENBQXlCLENBRXhCd1YsUUFBUTZQLElBQVIsQ0FBYyxTQUFXLEtBQUtucUIsSUFBaEIsQ0FBdUIsb0VBQXJDLEVBQ0EsS0FBS3F3RCxXQUFMLENBQXFCZ0MsV0FBYUMsV0FBZixDQUErQixJQUEvQixDQUFzQyxLQUF6RCxDQUNBLFNBRUEsQ0FFRCxpQkFBbUIsS0FBTXh0RCxHQUFOLENBQW5CLENBRUEsR0FBS3l0RCxlQUFpQjV1RCxTQUF0QixDQUFrQyxDQUVqQzJXLFFBQVE2UCxJQUFSLENBQWMsU0FBVyxLQUFLbnFCLElBQWhCLENBQXVCLEtBQXZCLENBQStCOEUsR0FBL0IsQ0FBcUMsdUNBQW5ELEVBQ0EsU0FFQSxDQUVELEdBQUt5dEQsY0FBZ0JBLGFBQWExZixPQUFsQyxDQUE0QyxDQUUzQzBmLGFBQWE1OEMsR0FBYixDQUFrQjA4QyxRQUFsQixFQUVBLENBSkQsUUFJY0UsY0FBZ0JBLGFBQWE3MkIsU0FBL0IsRUFBZ0QyMkIsVUFBWUEsU0FBUzMyQixTQUExRSxDQUF3RixDQUU5RjYyQixhQUFhdG9DLElBQWIsQ0FBbUJvb0MsUUFBbkIsRUFFQSxDQUpNLFFBSUt2dEQsTUFBUSxVQUFiLENBQTBCO0VBR2hDLEtBQU1BLEdBQU4sRUFBYzZnQixPQUFRMHNDLFFBQVIsQ0FBZCxDQUVBLENBTE0sSUFLQSxDQUVOLEtBQU12dEQsR0FBTixFQUFjdXRELFFBQWQsQ0FFQSxDQUVELENBRUQsQ0E5RDhFLENBZ0UvRXR4QixPQUFRLFNBQVdqakIsSUFBWCxDQUFrQixDQUV6QixXQUFlQSxPQUFTbmEsU0FBVCxFQUFzQixXQUFBLEdBQWdCLFFBQXJELENBRUEsR0FBSzZ1RCxNQUFMLENBQWMsQ0FFYjEwQyxLQUFPLENBQ05takIsU0FBVSxFQURKLENBRU5VLE9BQVEsRUFGRixDQUFQLENBS0EsQ0FFRCxTQUFXLENBQ1ZELFNBQVUsQ0FDVHY1QixRQUFTLEdBREEsQ0FFVG5JLEtBQU0sVUFGRyxDQUdUUCxVQUFXLGlCQUhGLENBREEsQ0FBWCxDQVFBO0VBQ0FpVixLQUFLZ3JCLElBQUwsQ0FBWSxLQUFLQSxJQUFqQixDQUNBaHJCLEtBQUsxVSxJQUFMLENBQVksS0FBS0EsSUFBakIsQ0FFQSxHQUFLLEtBQUtxQixJQUFMLEdBQWMsRUFBbkIsQ0FBd0JxVCxLQUFLclQsSUFBTCxDQUFZLEtBQUtBLElBQWpCLENBRXhCLEdBQUssS0FBS2t5QyxLQUFMLEVBQWMsS0FBS0EsS0FBTCxDQUFXVixPQUE5QixDQUF3Q24rQixLQUFLNitCLEtBQUwsQ0FBYSxLQUFLQSxLQUFMLENBQVdXLE1BQVgsRUFBYixDQUV4QyxHQUFLLEtBQUsyRixTQUFMLEdBQW1CbDJDLFNBQXhCLENBQW9DK1EsS0FBS21sQyxTQUFMLENBQWlCLEtBQUtBLFNBQXRCLENBQ3BDLEdBQUssS0FBS0MsU0FBTCxHQUFtQm4yQyxTQUF4QixDQUFvQytRLEtBQUtvbEMsU0FBTCxDQUFpQixLQUFLQSxTQUF0QixDQUVwQyxHQUFLLEtBQUtOLFFBQUwsRUFBaUIsS0FBS0EsUUFBTCxDQUFjM0csT0FBcEMsQ0FBOENuK0IsS0FBSzhrQyxRQUFMLENBQWdCLEtBQUtBLFFBQUwsQ0FBY3RGLE1BQWQsRUFBaEIsQ0FDOUMsR0FBSyxLQUFLdWUsaUJBQUwsR0FBMkIsQ0FBaEMsQ0FBb0MvOUMsS0FBSys5QyxpQkFBTCxDQUF5QixLQUFLQSxpQkFBOUIsQ0FFcEMsR0FBSyxLQUFLL1ksUUFBTCxFQUFpQixLQUFLQSxRQUFMLENBQWM3RyxPQUFwQyxDQUE4Q24rQixLQUFLZ2xDLFFBQUwsQ0FBZ0IsS0FBS0EsUUFBTCxDQUFjeEYsTUFBZCxFQUFoQixDQUM5QyxHQUFLLEtBQUt5RixTQUFMLEdBQW1CaDJDLFNBQXhCLENBQW9DK1EsS0FBS2lsQyxTQUFMLENBQWlCLEtBQUtBLFNBQXRCLENBQ3BDLEdBQUssS0FBS29CLFNBQUwsR0FBbUJwM0MsU0FBeEIsQ0FBb0MrUSxLQUFLcW1DLFNBQUwsQ0FBaUIsS0FBS0EsU0FBdEIsQ0FDcEMsR0FBSyxLQUFLQyxrQkFBTCxHQUE0QnIzQyxTQUFqQyxDQUE2QytRLEtBQUtzbUMsa0JBQUwsQ0FBMEIsS0FBS0Esa0JBQS9CLENBRTdDLEdBQUssS0FBS2hHLEdBQUwsRUFBWSxLQUFLQSxHQUFMLENBQVNuVSxTQUExQixDQUFzQ25zQixLQUFLc2dDLEdBQUwsQ0FBVyxLQUFLQSxHQUFMLENBQVNqVSxNQUFULENBQWlCampCLElBQWpCLEVBQXdCNGhCLElBQW5DLENBQ3RDLEdBQUssS0FBS3dWLFFBQUwsRUFBaUIsS0FBS0EsUUFBTCxDQUFjclUsU0FBcEMsQ0FBZ0Ruc0IsS0FBS3dnQyxRQUFMLENBQWdCLEtBQUtBLFFBQUwsQ0FBY25VLE1BQWQsQ0FBc0JqakIsSUFBdEIsRUFBNkI0aEIsSUFBN0MsQ0FDaEQsR0FBSyxLQUFLcVcsUUFBTCxFQUFpQixLQUFLQSxRQUFMLENBQWNsVixTQUFwQyxDQUFnRG5zQixLQUFLcWhDLFFBQUwsQ0FBZ0IsS0FBS0EsUUFBTCxDQUFjaFYsTUFBZCxDQUFzQmpqQixJQUF0QixFQUE2QjRoQixJQUE3QyxDQUNoRCxHQUFLLEtBQUswVyxPQUFMLEVBQWdCLEtBQUtBLE9BQUwsQ0FBYXZWLFNBQWxDLENBQThDLENBRTdDbnNCLEtBQUswaEMsT0FBTCxDQUFlLEtBQUtBLE9BQUwsQ0FBYXJWLE1BQWIsQ0FBcUJqakIsSUFBckIsRUFBNEI0aEIsSUFBM0MsQ0FDQWhyQixLQUFLMmhDLFNBQUwsQ0FBaUIsS0FBS0EsU0FBdEIsQ0FFQSxDQUNELEdBQUssS0FBS0UsU0FBTCxFQUFrQixLQUFLQSxTQUFMLENBQWUxVixTQUF0QyxDQUFrRCxDQUVqRG5zQixLQUFLNmhDLFNBQUwsQ0FBaUIsS0FBS0EsU0FBTCxDQUFleFYsTUFBZixDQUF1QmpqQixJQUF2QixFQUE4QjRoQixJQUEvQyxDQUNBaHJCLEtBQUs4aEMsV0FBTCxDQUFtQixLQUFLQSxXQUFMLENBQWlCNXBCLE9BQWpCLEVBQW5CLENBRUEsQ0FDRCxHQUFLLEtBQUs4cEIsZUFBTCxFQUF3QixLQUFLQSxlQUFMLENBQXFCN1YsU0FBbEQsQ0FBOEQsQ0FFN0Ruc0IsS0FBS2dpQyxlQUFMLENBQXVCLEtBQUtBLGVBQUwsQ0FBcUIzVixNQUFyQixDQUE2QmpqQixJQUE3QixFQUFvQzRoQixJQUEzRCxDQUNBaHJCLEtBQUtpaUMsaUJBQUwsQ0FBeUIsS0FBS0EsaUJBQTlCLENBQ0FqaUMsS0FBS2tpQyxnQkFBTCxDQUF3QixLQUFLQSxnQkFBN0IsQ0FFQSxDQUNELEdBQUssS0FBS0UsWUFBTCxFQUFxQixLQUFLQSxZQUFMLENBQWtCalcsU0FBNUMsQ0FBd0Ruc0IsS0FBS29pQyxZQUFMLENBQW9CLEtBQUtBLFlBQUwsQ0FBa0IvVixNQUFsQixDQUEwQmpqQixJQUExQixFQUFpQzRoQixJQUFyRCxDQUN4RCxHQUFLLEtBQUtzWCxZQUFMLEVBQXFCLEtBQUtBLFlBQUwsQ0FBa0JuVyxTQUE1QyxDQUF3RG5zQixLQUFLc2lDLFlBQUwsQ0FBb0IsS0FBS0EsWUFBTCxDQUFrQmpXLE1BQWxCLENBQTBCampCLElBQTFCLEVBQWlDNGhCLElBQXJELENBRXhELEdBQUssS0FBS3dXLFdBQUwsRUFBb0IsS0FBS0EsV0FBTCxDQUFpQnJWLFNBQTFDLENBQXNEbnNCLEtBQUt3aEMsV0FBTCxDQUFtQixLQUFLQSxXQUFMLENBQWlCblYsTUFBakIsQ0FBeUJqakIsSUFBekIsRUFBZ0M0aEIsSUFBbkQsQ0FDdEQsR0FBSyxLQUFLMFYsV0FBTCxFQUFvQixLQUFLQSxXQUFMLENBQWlCdlUsU0FBMUMsQ0FBc0Ruc0IsS0FBSzBnQyxXQUFMLENBQW1CLEtBQUtBLFdBQUwsQ0FBaUJyVSxNQUFqQixDQUF5QmpqQixJQUF6QixFQUFnQzRoQixJQUFuRCxDQUV0RCxHQUFLLEtBQUs0VixNQUFMLEVBQWUsS0FBS0EsTUFBTCxDQUFZelUsU0FBaEMsQ0FBNEMsQ0FFM0Nuc0IsS0FBSzRnQyxNQUFMLENBQWMsS0FBS0EsTUFBTCxDQUFZdlUsTUFBWixDQUFvQmpqQixJQUFwQixFQUEyQjRoQixJQUF6QyxDQUNBaHJCLEtBQUs4Z0MsWUFBTCxDQUFvQixLQUFLQSxZQUF6QixDQUF1QztFQUV2QyxDQUVELEdBQUssS0FBSzBCLFdBQUwsRUFBb0IsS0FBS0EsV0FBTCxDQUFpQnJXLFNBQTFDLENBQXNELENBRXJEbnNCLEtBQUt3aUMsV0FBTCxDQUFtQixLQUFLQSxXQUFMLENBQWlCblcsTUFBakIsQ0FBeUJqakIsSUFBekIsRUFBZ0M0aEIsSUFBbkQsQ0FFQSxDQUVELEdBQUssS0FBS2tGLElBQUwsR0FBY2poQyxTQUFuQixDQUErQitRLEtBQUtrd0IsSUFBTCxDQUFZLEtBQUtBLElBQWpCLENBQy9CLEdBQUssS0FBSzh0QixlQUFMLEdBQXlCL3VELFNBQTlCLENBQTBDK1EsS0FBS2crQyxlQUFMLENBQXVCLEtBQUtBLGVBQTVCLENBRTFDLEdBQUssS0FBS3pDLFFBQUwsR0FBa0JDLGNBQXZCLENBQXdDeDdDLEtBQUt1N0MsUUFBTCxDQUFnQixLQUFLQSxRQUFyQixDQUN4QyxHQUFLLEtBQUtJLFdBQUwsR0FBcUIsSUFBMUIsQ0FBaUMzN0MsS0FBSzI3QyxXQUFMLENBQW1CLEtBQUtBLFdBQXhCLENBQ2pDLEdBQUssS0FBS0YsSUFBTCxHQUFjQyxTQUFuQixDQUErQjE3QyxLQUFLeTdDLElBQUwsQ0FBWSxLQUFLQSxJQUFqQixDQUMvQixHQUFLLEtBQUtuTixZQUFMLEdBQXNCc04sUUFBM0IsQ0FBc0M1N0MsS0FBS3N1QyxZQUFMLENBQW9CLEtBQUtBLFlBQXpCLENBRXRDLEdBQUssS0FBS2pPLE9BQUwsQ0FBZSxDQUFwQixDQUF3QnJnQyxLQUFLcWdDLE9BQUwsQ0FBZSxLQUFLQSxPQUFwQixDQUN4QixHQUFLLEtBQUt3YixXQUFMLEdBQXFCLElBQTFCLENBQWlDNzdDLEtBQUs2N0MsV0FBTCxDQUFtQixLQUFLQSxXQUF4QixDQUVqQzc3QyxLQUFLdThDLFNBQUwsQ0FBaUIsS0FBS0EsU0FBdEIsQ0FDQXY4QyxLQUFLeThDLFNBQUwsQ0FBaUIsS0FBS0EsU0FBdEIsQ0FDQXo4QyxLQUFLMDhDLFVBQUwsQ0FBa0IsS0FBS0EsVUFBdkIsQ0FFQTtFQUNBLEdBQUssS0FBS3p5QixRQUFMLEdBQWtCLENBQXZCLENBQTJCanFCLEtBQUtpcUIsUUFBTCxDQUFnQixLQUFLQSxRQUFyQixDQUUzQixHQUFLLEtBQUtnMEIsU0FBTCxHQUFtQixDQUF4QixDQUE0QmorQyxLQUFLaStDLFNBQUwsQ0FBaUIsS0FBS0EsU0FBdEIsQ0FDNUIsR0FBSyxLQUFLMVksUUFBTCxHQUFrQnQyQyxTQUF2QixDQUFtQytRLEtBQUt1bEMsUUFBTCxDQUFnQixLQUFLQSxRQUFyQixDQUNuQyxHQUFLLEtBQUsyWSxPQUFMLEdBQWlCanZELFNBQXRCLENBQWtDK1EsS0FBS2srQyxPQUFMLENBQWUsS0FBS0EsT0FBcEIsQ0FDbEMsR0FBSyxLQUFLNTlCLEtBQUwsR0FBZXJ4QixTQUFwQixDQUFnQytRLEtBQUtzZ0IsS0FBTCxDQUFhLEtBQUtBLEtBQWxCLENBRWhDLEdBQUssS0FBSzY4QixTQUFMLEdBQW1CLElBQXhCLENBQStCbjlDLEtBQUttOUMsU0FBTCxDQUFpQixJQUFqQixDQUUvQixHQUFLLEtBQUtDLFNBQUwsQ0FBaUIsQ0FBdEIsQ0FBMEJwOUMsS0FBS285QyxTQUFMLENBQWlCLEtBQUtBLFNBQXRCLENBQzFCLEdBQUssS0FBS0Msa0JBQUwsR0FBNEIsSUFBakMsQ0FBd0NyOUMsS0FBS3E5QyxrQkFBTCxDQUEwQixLQUFLQSxrQkFBL0IsQ0FFeEMsR0FBSyxLQUFLYyxTQUFMLEdBQW1CLElBQXhCLENBQStCbitDLEtBQUttK0MsU0FBTCxDQUFpQixLQUFLQSxTQUF0QixDQUMvQixHQUFLLEtBQUtDLGtCQUFMLENBQTBCLENBQS9CLENBQW1DcCtDLEtBQUtvK0Msa0JBQUwsQ0FBMEIsS0FBS0Esa0JBQS9CLENBQ25DLEdBQUssS0FBS0MsZ0JBQUwsR0FBMEIsT0FBL0IsQ0FBeUNyK0MsS0FBS3ErQyxnQkFBTCxDQUF3QixLQUFLQSxnQkFBN0IsQ0FDekMsR0FBSyxLQUFLQyxpQkFBTCxHQUEyQixPQUFoQyxDQUEwQ3QrQyxLQUFLcytDLGlCQUFMLENBQXlCLEtBQUtBLGlCQUE5QixDQUUxQyxHQUFLLEtBQUsxUCxZQUFMLEdBQXNCLElBQTNCLENBQWtDNXVDLEtBQUs0dUMsWUFBTCxDQUFvQixJQUFwQixDQUNsQyxHQUFLLEtBQUsyUCxRQUFMLEdBQWtCLElBQXZCLENBQThCditDLEtBQUt1K0MsUUFBTCxDQUFnQixJQUFoQixDQUU5QixHQUFLLEtBQUsxVSxPQUFMLEdBQWlCLEtBQXRCLENBQThCN3BDLEtBQUs2cEMsT0FBTCxDQUFlLEtBQWYsQ0FDOUIsR0FBS2wvQixLQUFLRSxTQUFMLENBQWdCLEtBQUtxL0IsUUFBckIsSUFBb0MsSUFBekMsQ0FBZ0RscUMsS0FBS2txQyxRQUFMLENBQWdCLEtBQUtBLFFBQXJCLENBRWhEO0VBRUEseUJBQUEsQ0FBMkI2QyxLQUEzQixDQUFtQyxDQUVsQyxXQUFhLEVBQWIsQ0FFQSxJQUFNLE9BQU4sU0FBQSxDQUF5QixDQUV4QixTQUFXQSxNQUFPMzhDLEdBQVAsQ0FBWCxDQUNBLFlBQVk0OEIsUUFBWixDQUNBbmhDLE9BQU9pRSxJQUFQLENBQWFrUSxJQUFiLEVBRUEsQ0FFRCxhQUFBLENBRUEsQ0FFRCxHQUFLODlDLE1BQUwsQ0FBYyxDQUViLGFBQWVoUixpQkFBa0IxakMsS0FBS21qQixRQUF2QixDQUFmLENBQ0EsV0FBYXVnQixpQkFBa0IxakMsS0FBSzZqQixNQUF2QixDQUFiLENBRUEsR0FBS1YsU0FBU2o4QixNQUFULENBQWtCLENBQXZCLENBQTJCMFAsS0FBS3VzQixRQUFMLENBQWdCQSxRQUFoQixDQUMzQixHQUFLVSxPQUFPMzhCLE1BQVAsQ0FBZ0IsQ0FBckIsQ0FBeUIwUCxLQUFLaXRCLE1BQUwsQ0FBY0EsTUFBZCxDQUV6QixDQUVELFdBQUEsQ0FFQSxDQXROOEUsQ0F3Ti9FM1gsTUFBTyxVQUFZLENBRWxCLGdCQUFnQm5wQixXQUFULEdBQXVCb3BCLElBQXZCLENBQTZCLElBQTdCLENBQVAsQ0FFQSxDQTVOOEUsQ0E4Ti9FQSxLQUFNLFNBQVc1ZixNQUFYLENBQW9CLENBRXpCLEtBQUtoSixJQUFMLENBQVlnSixPQUFPaEosSUFBbkIsQ0FFQSxLQUFLODFDLEdBQUwsQ0FBVzlzQyxPQUFPOHNDLEdBQWxCLENBQ0EsS0FBS0ssTUFBTCxDQUFjbnRDLE9BQU9tdEMsTUFBckIsQ0FFQSxLQUFLeVksUUFBTCxDQUFnQjVsRCxPQUFPNGxELFFBQXZCLENBQ0EsS0FBS0UsSUFBTCxDQUFZOWxELE9BQU84bEQsSUFBbkIsQ0FDQSxLQUFLRSxXQUFMLENBQW1CaG1ELE9BQU9nbUQsV0FBMUIsQ0FDQSxLQUFLck4sWUFBTCxDQUFvQjM0QyxPQUFPMjRDLFlBQTNCLENBRUEsS0FBS2pPLE9BQUwsQ0FBZTFxQyxPQUFPMHFDLE9BQXRCLENBQ0EsS0FBS3diLFdBQUwsQ0FBbUJsbUQsT0FBT2ttRCxXQUExQixDQUVBLEtBQUtDLFFBQUwsQ0FBZ0JubUQsT0FBT21tRCxRQUF2QixDQUNBLEtBQUtFLFFBQUwsQ0FBZ0JybUQsT0FBT3FtRCxRQUF2QixDQUNBLEtBQUtFLGFBQUwsQ0FBcUJ2bUQsT0FBT3VtRCxhQUE1QixDQUNBLEtBQUtFLGFBQUwsQ0FBcUJ6bUQsT0FBT3ltRCxhQUE1QixDQUNBLEtBQUtDLGFBQUwsQ0FBcUIxbUQsT0FBTzBtRCxhQUE1QixDQUNBLEtBQUtDLGtCQUFMLENBQTBCM21ELE9BQU8ybUQsa0JBQWpDLENBRUEsS0FBS0MsU0FBTCxDQUFpQjVtRCxPQUFPNG1ELFNBQXhCLENBQ0EsS0FBS0UsU0FBTCxDQUFpQjltRCxPQUFPOG1ELFNBQXhCLENBQ0EsS0FBS0MsVUFBTCxDQUFrQi9tRCxPQUFPK21ELFVBQXpCLENBRUEsS0FBS0ssVUFBTCxDQUFrQnBuRCxPQUFPb25ELFVBQXpCLENBRUEsS0FBSzdKLFNBQUwsQ0FBaUJ2OUMsT0FBT3U5QyxTQUF4QixDQUVBLEtBQUs4SixhQUFMLENBQXFCcm5ELE9BQU9xbkQsYUFBNUIsQ0FDQSxLQUFLQyxtQkFBTCxDQUEyQnRuRCxPQUFPc25ELG1CQUFsQyxDQUNBLEtBQUtDLGtCQUFMLENBQTBCdm5ELE9BQU91bkQsa0JBQWpDLENBRUEsS0FBS0MsU0FBTCxDQUFpQnhuRCxPQUFPd25ELFNBQXhCLENBRUEsS0FBS0MsU0FBTCxDQUFpQnpuRCxPQUFPeW5ELFNBQXhCLENBQ0EsS0FBS0Msa0JBQUwsQ0FBMEIxbkQsT0FBTzBuRCxrQkFBakMsQ0FFQSxLQUFLQyxRQUFMLENBQWdCM25ELE9BQU8ybkQsUUFBdkIsQ0FFQSxLQUFLelQsT0FBTCxDQUFlbDBDLE9BQU9rMEMsT0FBdEIsQ0FDQSxLQUFLSyxRQUFMLENBQWdCdi9CLEtBQUtzaUMsS0FBTCxDQUFZdGlDLEtBQUtFLFNBQUwsQ0FBZ0JsVixPQUFPdTBDLFFBQXZCLENBQVosQ0FBaEIsQ0FFQSxLQUFLMlMsV0FBTCxDQUFtQmxuRCxPQUFPa25ELFdBQTFCLENBQ0EsS0FBS0QsZ0JBQUwsQ0FBd0JqbkQsT0FBT2luRCxnQkFBL0IsQ0FFQSxjQUFnQmpuRCxPQUFPZ25ELGNBQXZCLENBQ0M2QixVQUFZLElBRGIsQ0FHQSxHQUFLQyxZQUFjLElBQW5CLENBQTBCLENBRXpCLE1BQVFBLFVBQVVudUQsTUFBbEIsQ0FDQWt1RCxVQUFZLFNBQUEsQ0FBV3RyQyxDQUFYLENBQVosQ0FFQSxJQUFNLE1BQVEsQ0FBZCxDQUFpQnZpQixJQUFNdWlCLENBQXZCLENBQTBCLEVBQUd2aUIsQ0FBN0IsQ0FDQzZ0RCxVQUFXN3RELENBQVgsRUFBaUI4dEQsVUFBVzl0RCxDQUFYLEVBQWUya0IsS0FBZixFQUFqQixDQUVELENBRUQsS0FBS3FuQyxjQUFMLENBQXNCNkIsU0FBdEIsQ0FFQSxLQUFLMUIsVUFBTCxDQUFrQm5uRCxPQUFPbW5ELFVBQXpCLENBRUEsV0FBQSxDQUVBLENBaFM4RSxDQWtTL0UxdkIsUUFBUyxVQUFZLENBRXBCLEtBQUtsYixhQUFMLENBQW9CLENBQUU1bUIsS0FBTSxTQUFSLENBQXBCLEVBRUEsQ0F0UzhFLENBQTNELENBQXJCLENBMFNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7S0FtQ0EsMEJBQUEsQ0FBNEJvaEQsVUFBNUIsQ0FBeUMsQ0FFeEM2USxTQUFTaHlELElBQVQsQ0FBZSxJQUFmLEVBRUEsS0FBS0QsSUFBTCxDQUFZLG1CQUFaLENBRUEsS0FBS3V6QyxLQUFMLENBQWEsU0FBQSxDQUFXLFFBQVgsQ0FBYixDQUFvQztFQUVwQyxLQUFLeUIsR0FBTCxDQUFXLElBQVgsQ0FFQSxLQUFLZSxRQUFMLENBQWdCLElBQWhCLENBQ0EsS0FBS0MsaUJBQUwsQ0FBeUIsR0FBekIsQ0FFQSxLQUFLSixLQUFMLENBQWEsSUFBYixDQUNBLEtBQUtDLGNBQUwsQ0FBc0IsR0FBdEIsQ0FFQSxLQUFLVCxXQUFMLENBQW1CLElBQW5CLENBRUEsS0FBS0YsUUFBTCxDQUFnQixJQUFoQixDQUVBLEtBQUtJLE1BQUwsQ0FBYyxJQUFkLENBQ0EsS0FBSzhkLE9BQUwsQ0FBZUMsaUJBQWYsQ0FDQSxLQUFLN2QsWUFBTCxDQUFvQixDQUFwQixDQUNBLEtBQUtDLGVBQUwsQ0FBdUIsSUFBdkIsQ0FFQSxLQUFLb2QsU0FBTCxDQUFpQixLQUFqQixDQUNBLEtBQUtDLGtCQUFMLENBQTBCLENBQTFCLENBQ0EsS0FBS0MsZ0JBQUwsQ0FBd0IsT0FBeEIsQ0FDQSxLQUFLQyxpQkFBTCxDQUF5QixPQUF6QixDQUVBLEtBQUtDLFFBQUwsQ0FBZ0IsS0FBaEIsQ0FDQSxLQUFLM1AsWUFBTCxDQUFvQixLQUFwQixDQUVBLEtBQUs5TCxNQUFMLENBQWMsS0FBZCxDQUVBLEtBQUs0YSxTQUFMLENBQWdCaFIsVUFBaEIsRUFFQSxDQUVEa1Msa0JBQWtCLzBELFNBQWxCLENBQThCRCxPQUFPaUIsTUFBUCxDQUFlMHlELFNBQVMxekQsU0FBeEIsQ0FBOUIsQ0FDQSswRCxrQkFBa0IvMEQsU0FBbEIsQ0FBNEJzQyxXQUE1QixDQUEwQ3l5RCxpQkFBMUMsQ0FFQUEsa0JBQWtCLzBELFNBQWxCLENBQTRCZzFELG1CQUE1QixDQUFrRCxJQUFsRCxDQUVBRCxrQkFBa0IvMEQsU0FBbEIsQ0FBNEIwckIsSUFBNUIsQ0FBbUMsU0FBVzVmLE1BQVgsQ0FBb0IsQ0FFdEQ0bkQsU0FBUzF6RCxTQUFULENBQW1CMHJCLElBQW5CLENBQXdCaHFCLElBQXhCLENBQThCLElBQTlCLENBQW9Db0ssTUFBcEMsRUFFQSxLQUFLa3BDLEtBQUwsQ0FBV3RwQixJQUFYLENBQWlCNWYsT0FBT2twQyxLQUF4QixFQUVBLEtBQUt5QixHQUFMLENBQVczcUMsT0FBTzJxQyxHQUFsQixDQUVBLEtBQUtlLFFBQUwsQ0FBZ0IxckMsT0FBTzByQyxRQUF2QixDQUNBLEtBQUtDLGlCQUFMLENBQXlCM3JDLE9BQU8yckMsaUJBQWhDLENBRUEsS0FBS0osS0FBTCxDQUFhdnJDLE9BQU91ckMsS0FBcEIsQ0FDQSxLQUFLQyxjQUFMLENBQXNCeHJDLE9BQU93ckMsY0FBN0IsQ0FFQSxLQUFLVCxXQUFMLENBQW1CL3FDLE9BQU8rcUMsV0FBMUIsQ0FFQSxLQUFLRixRQUFMLENBQWdCN3FDLE9BQU82cUMsUUFBdkIsQ0FFQSxLQUFLSSxNQUFMLENBQWNqckMsT0FBT2lyQyxNQUFyQixDQUNBLEtBQUs4ZCxPQUFMLENBQWUvb0QsT0FBTytvRCxPQUF0QixDQUNBLEtBQUs1ZCxZQUFMLENBQW9CbnJDLE9BQU9tckMsWUFBM0IsQ0FDQSxLQUFLQyxlQUFMLENBQXVCcHJDLE9BQU9vckMsZUFBOUIsQ0FFQSxLQUFLb2QsU0FBTCxDQUFpQnhvRCxPQUFPd29ELFNBQXhCLENBQ0EsS0FBS0Msa0JBQUwsQ0FBMEJ6b0QsT0FBT3lvRCxrQkFBakMsQ0FDQSxLQUFLQyxnQkFBTCxDQUF3QjFvRCxPQUFPMG9ELGdCQUEvQixDQUNBLEtBQUtDLGlCQUFMLENBQXlCM29ELE9BQU8yb0QsaUJBQWhDLENBRUEsS0FBS0MsUUFBTCxDQUFnQjVvRCxPQUFPNG9ELFFBQXZCLENBQ0EsS0FBSzNQLFlBQUwsQ0FBb0JqNUMsT0FBT2k1QyxZQUEzQixDQUVBLFdBQUEsQ0FFQSxDQWpDRCxDQW1DQTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztLQXFCQSx1QkFBQSxDQUF5QmxDLFVBQXpCLENBQXNDLENBRXJDNlEsU0FBU2h5RCxJQUFULENBQWUsSUFBZixFQUVBLEtBQUtELElBQUwsQ0FBWSxnQkFBWixDQUVBLEtBQUt3ekQsT0FBTCxDQUFlLEVBQWYsQ0FDQSxLQUFLamhCLFFBQUwsQ0FBZ0IsRUFBaEIsQ0FFQSxLQUFLNkcsWUFBTCxDQUFvQiwrRkFBcEIsQ0FDQSxLQUFLRSxjQUFMLENBQXNCLGdFQUF0QixDQUVBLEtBQUtxWixTQUFMLENBQWlCLENBQWpCLENBRUEsS0FBS0UsU0FBTCxDQUFpQixLQUFqQixDQUNBLEtBQUtDLGtCQUFMLENBQTBCLENBQTFCLENBRUEsS0FBSzNiLEdBQUwsQ0FBVyxLQUFYLENBQWtCO0VBQ2xCLEtBQUtLLE1BQUwsQ0FBYyxLQUFkLENBQXFCO0VBQ3JCLEtBQUtpYyxRQUFMLENBQWdCLEtBQWhCLENBQXVCO0VBRXZCLEtBQUtSLFFBQUwsQ0FBZ0IsS0FBaEIsQ0FBdUI7RUFDdkIsS0FBSzNQLFlBQUwsQ0FBb0IsS0FBcEIsQ0FBMkI7RUFDM0IsS0FBS0MsWUFBTCxDQUFvQixLQUFwQixDQUEyQjtFQUUzQixLQUFLOStCLFVBQUwsQ0FBa0IsQ0FDakJpdkMsWUFBYSxLQURJO0VBRWpCQyxVQUFXLEtBRk07RUFHakJDLFlBQWEsS0FISTtFQUlqQkMsaUJBQWtCLEtBQU07RUFKUCxDQUFsQixDQU9BO0VBQ0E7RUFDQSxLQUFLQyxzQkFBTCxDQUE4QixDQUM3QixRQUFTLENBQUUsQ0FBRixDQUFLLENBQUwsQ0FBUSxDQUFSLENBRG9CLENBRTdCLEtBQU0sQ0FBRSxDQUFGLENBQUssQ0FBTCxDQUZ1QixDQUc3QixNQUFPLENBQUUsQ0FBRixDQUFLLENBQUwsQ0FIc0IsQ0FBOUIsQ0FNQSxLQUFLQyxtQkFBTCxDQUEyQnB3RCxTQUEzQixDQUNBLEtBQUtxd0Qsa0JBQUwsQ0FBMEIsS0FBMUIsQ0FFQSxHQUFLNVMsYUFBZXo5QyxTQUFwQixDQUFnQyxDQUUvQixHQUFLeTlDLFdBQVd6YixVQUFYLEdBQTBCaGlDLFNBQS9CLENBQTJDLENBRTFDMlcsUUFBUU0sS0FBUixDQUFlLHlGQUFmLEVBRUEsQ0FFRCxLQUFLdzNDLFNBQUwsQ0FBZ0JoUixVQUFoQixFQUVBLENBRUQsQ0FFRDZTLGVBQWUxMUQsU0FBZixDQUEyQkQsT0FBT2lCLE1BQVAsQ0FBZTB5RCxTQUFTMXpELFNBQXhCLENBQTNCLENBQ0EwMUQsZUFBZTExRCxTQUFmLENBQXlCc0MsV0FBekIsQ0FBdUNvekQsY0FBdkMsQ0FFQUEsZUFBZTExRCxTQUFmLENBQXlCMjFELGdCQUF6QixDQUE0QyxJQUE1QyxDQUVBRCxlQUFlMTFELFNBQWYsQ0FBeUIwckIsSUFBekIsQ0FBZ0MsU0FBVzVmLE1BQVgsQ0FBb0IsQ0FFbkQ0bkQsU0FBUzF6RCxTQUFULENBQW1CMHJCLElBQW5CLENBQXdCaHFCLElBQXhCLENBQThCLElBQTlCLENBQW9Db0ssTUFBcEMsRUFFQSxLQUFLaXZDLGNBQUwsQ0FBc0JqdkMsT0FBT2l2QyxjQUE3QixDQUNBLEtBQUtGLFlBQUwsQ0FBb0IvdUMsT0FBTyt1QyxZQUEzQixDQUVBLEtBQUs3RyxRQUFMLENBQWdCMkcsY0FBY2x2QixLQUFkLENBQXFCM2YsT0FBT2tvQyxRQUE1QixDQUFoQixDQUVBLEtBQUtpaEIsT0FBTCxDQUFlbDFELE9BQU80bkIsTUFBUCxDQUFlLEVBQWYsQ0FBbUI3YixPQUFPbXBELE9BQTFCLENBQWYsQ0FFQSxLQUFLWCxTQUFMLENBQWlCeG9ELE9BQU93b0QsU0FBeEIsQ0FDQSxLQUFLQyxrQkFBTCxDQUEwQnpvRCxPQUFPeW9ELGtCQUFqQyxDQUVBLEtBQUt0YixNQUFMLENBQWNudEMsT0FBT210QyxNQUFyQixDQUNBLEtBQUtpYyxRQUFMLENBQWdCcHBELE9BQU9vcEQsUUFBdkIsQ0FFQSxLQUFLUixRQUFMLENBQWdCNW9ELE9BQU80b0QsUUFBdkIsQ0FFQSxLQUFLM1AsWUFBTCxDQUFvQmo1QyxPQUFPaTVDLFlBQTNCLENBQ0EsS0FBS0MsWUFBTCxDQUFvQmw1QyxPQUFPazVDLFlBQTNCLENBRUEsS0FBSzkrQixVQUFMLENBQWtCcGEsT0FBT29hLFVBQXpCLENBRUEsV0FBQSxDQUVBLENBMUJELENBNEJBd3ZDLGVBQWUxMUQsU0FBZixDQUF5QndpQyxNQUF6QixDQUFrQyxTQUFXampCLElBQVgsQ0FBa0IsQ0FFbkQsU0FBV20wQyxTQUFTMXpELFNBQVQsQ0FBbUJ3aUMsTUFBbkIsQ0FBMEI5Z0MsSUFBMUIsQ0FBZ0MsSUFBaEMsQ0FBc0M2ZCxJQUF0QyxDQUFYLENBRUFwSixLQUFLNjlCLFFBQUwsQ0FBZ0IsS0FBS0EsUUFBckIsQ0FDQTc5QixLQUFLMGtDLFlBQUwsQ0FBb0IsS0FBS0EsWUFBekIsQ0FDQTFrQyxLQUFLNGtDLGNBQUwsQ0FBc0IsS0FBS0EsY0FBM0IsQ0FFQSxXQUFBLENBRUEsQ0FWRCxDQVlBOztLQUlBLFlBQUEsQ0FBYzZhLE1BQWQsQ0FBc0J4ckIsU0FBdEIsQ0FBa0MsQ0FFakMsS0FBS3dyQixNQUFMLENBQWdCQSxTQUFXeHdELFNBQWIsQ0FBMkJ3d0QsTUFBM0IsQ0FBb0MsV0FBQSxFQUFsRCxDQUNBLEtBQUt4ckIsU0FBTCxDQUFtQkEsWUFBY2hsQyxTQUFoQixDQUE4QmdsQyxTQUE5QixDQUEwQyxXQUFBLEVBQTNELENBRUEsQ0FFRHJxQyxPQUFPNG5CLE1BQVAsQ0FBZWt1QyxJQUFJNzFELFNBQW5CLENBQThCLENBRTdCb1gsSUFBSyxTQUFXdytDLE1BQVgsQ0FBbUJ4ckIsU0FBbkIsQ0FBK0IsQ0FFbkMsS0FBS3dyQixNQUFMLENBQVlscUMsSUFBWixDQUFrQmtxQyxNQUFsQixFQUNBLEtBQUt4ckIsU0FBTCxDQUFlMWUsSUFBZixDQUFxQjBlLFNBQXJCLEVBRUEsV0FBQSxDQUVBLENBVDRCLENBVzdCM2UsTUFBTyxVQUFZLENBRWxCLGdCQUFnQm5wQixXQUFULEdBQXVCb3BCLElBQXZCLENBQTZCLElBQTdCLENBQVAsQ0FFQSxDQWY0QixDQWlCN0JBLEtBQU0sU0FBV29xQyxHQUFYLENBQWlCLENBRXRCLEtBQUtGLE1BQUwsQ0FBWWxxQyxJQUFaLENBQWtCb3FDLElBQUlGLE1BQXRCLEVBQ0EsS0FBS3hyQixTQUFMLENBQWUxZSxJQUFmLENBQXFCb3FDLElBQUkxckIsU0FBekIsRUFFQSxXQUFBLENBRUEsQ0F4QjRCLENBMEI3QjJyQixHQUFJLFNBQVdqc0MsQ0FBWCxDQUFjcGQsTUFBZCxDQUF1QixDQUUxQixHQUFLQSxTQUFXdEgsU0FBaEIsQ0FBNEIsQ0FFM0IyVyxRQUFRNlAsSUFBUixDQUFjLHlDQUFkLEVBQ0FsZixPQUFTLFdBQUEsRUFBVCxDQUVBLENBRUQsY0FBY2dmLElBQVAsQ0FBYSxLQUFLMGUsU0FBbEIsRUFBOEJoZSxjQUE5QixDQUE4Q3RDLENBQTlDLEVBQWtENkIsR0FBbEQsQ0FBdUQsS0FBS2lxQyxNQUE1RCxDQUFQLENBRUEsQ0FyQzRCLENBdUM3QjNpQyxPQUFRLFNBQVc5WixDQUFYLENBQWUsQ0FFdEIsS0FBS2l4QixTQUFMLENBQWUxZSxJQUFmLENBQXFCdlMsQ0FBckIsRUFBeUI2UyxHQUF6QixDQUE4QixLQUFLNHBDLE1BQW5DLEVBQTRDdm9DLFNBQTVDLEdBRUEsV0FBQSxDQUVBLENBN0M0QixDQStDN0Iyb0MsT0FBUSxVQUFZLENBRW5CLE9BQVMsV0FBQSxFQUFULENBRUEsc0JBQU8sQ0FBaUJsc0MsQ0FBakIsQ0FBcUIsQ0FFM0IsS0FBSzhyQyxNQUFMLENBQVlscUMsSUFBWixDQUFrQixLQUFLcXFDLEVBQUwsQ0FBU2pzQyxDQUFULENBQVlrRSxFQUFaLENBQWxCLEVBRUEsV0FBQSxDQUVBLENBTkQsQ0FRQSxDQVpPLEVBL0NxQixDQTZEN0Jpb0Msb0JBQXFCLFNBQVd2aUQsS0FBWCxDQUFrQmhILE1BQWxCLENBQTJCLENBRS9DLEdBQUtBLFNBQVd0SCxTQUFoQixDQUE0QixDQUUzQjJXLFFBQVE2UCxJQUFSLENBQWMsMERBQWQsRUFDQWxmLE9BQVMsV0FBQSxFQUFULENBRUEsQ0FFREEsT0FBT3VmLFVBQVAsQ0FBbUJ2WSxLQUFuQixDQUEwQixLQUFLa2lELE1BQS9CLEVBRUEsc0JBQXdCbHBELE9BQU9zZ0IsR0FBUCxDQUFZLEtBQUtvZCxTQUFqQixDQUF4QixDQUVBLEdBQUs4ckIsa0JBQW9CLENBQXpCLENBQTZCLENBRTVCLGNBQWN4cUMsSUFBUCxDQUFhLEtBQUtrcUMsTUFBbEIsQ0FBUCxDQUVBLENBRUQsY0FBY2xxQyxJQUFQLENBQWEsS0FBSzBlLFNBQWxCLEVBQThCaGUsY0FBOUIsQ0FBOEM4cEMsaUJBQTlDLEVBQWtFdnFDLEdBQWxFLENBQXVFLEtBQUtpcUMsTUFBNUUsQ0FBUCxDQUVBLENBbEY0QixDQW9GN0I1c0IsZ0JBQWlCLFNBQVd0MUIsS0FBWCxDQUFtQixDQUVuQyxZQUFZd1osSUFBTCxDQUFXLEtBQUtpcEMsaUJBQUwsQ0FBd0J6aUQsS0FBeEIsQ0FBWCxDQUFQLENBRUEsQ0F4RjRCLENBMEY3QnlpRCxrQkFBbUIsVUFBWSxDQUU5QixPQUFTLFdBQUEsRUFBVCxDQUVBLGlDQUFPLENBQTRCemlELEtBQTVCLENBQW9DLENBRTFDLHNCQUF3QnNhLEdBQUcvQixVQUFILENBQWV2WSxLQUFmLENBQXNCLEtBQUtraUQsTUFBM0IsRUFBb0M1b0MsR0FBcEMsQ0FBeUMsS0FBS29kLFNBQTlDLENBQXhCLENBRUE7RUFFQSxHQUFLOHJCLGtCQUFvQixDQUF6QixDQUE2QixDQUU1QixZQUFZTixNQUFMLENBQVlub0MsaUJBQVosQ0FBK0IvWixLQUEvQixDQUFQLENBRUEsQ0FFRHNhLEdBQUd0QyxJQUFILENBQVMsS0FBSzBlLFNBQWQsRUFBMEJoZSxjQUExQixDQUEwQzhwQyxpQkFBMUMsRUFBOER2cUMsR0FBOUQsQ0FBbUUsS0FBS2lxQyxNQUF4RSxFQUVBLFVBQVVub0MsaUJBQUgsQ0FBc0IvWixLQUF0QixDQUFQLENBRUEsQ0FoQkQsQ0FrQkEsQ0F0QmtCLEVBMUZVLENBa0g3QjBpRCxvQkFBcUIsVUFBWSxDQUVoQyxjQUFnQixXQUFBLEVBQWhCLENBQ0EsV0FBYSxXQUFBLEVBQWIsQ0FDQSxTQUFXLFdBQUEsRUFBWCxDQUVBLG1DQUFPLENBQThCOXRCLEVBQTlCLENBQWtDdGEsRUFBbEMsQ0FBc0Nxb0Msa0JBQXRDLENBQTBEQyxzQkFBMUQsQ0FBbUY7RUFHekY7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUVBQyxVQUFVN3FDLElBQVYsQ0FBZ0I0YyxFQUFoQixFQUFxQjNjLEdBQXJCLENBQTBCcUMsRUFBMUIsRUFBK0I1QixjQUEvQixDQUErQyxHQUEvQyxFQUNBb3FDLE9BQU85cUMsSUFBUCxDQUFhc0MsRUFBYixFQUFrQmhDLEdBQWxCLENBQXVCc2MsRUFBdkIsRUFBNEJqYixTQUE1QixHQUNBb3BDLEtBQUsvcUMsSUFBTCxDQUFXLEtBQUtrcUMsTUFBaEIsRUFBeUI1cEMsR0FBekIsQ0FBOEJ1cUMsU0FBOUIsRUFFQSxjQUFnQmp1QixHQUFHOWEsVUFBSCxDQUFlUSxFQUFmLEVBQXNCLEdBQXRDLENBQ0EsUUFBVSxDQUFFLEtBQUtvYyxTQUFMLENBQWVwZCxHQUFmLENBQW9Cd3BDLE1BQXBCLENBQVosQ0FDQSxPQUFTQyxLQUFLenBDLEdBQUwsQ0FBVSxLQUFLb2QsU0FBZixDQUFULENBQ0EsT0FBUyxDQUFFcXNCLEtBQUt6cEMsR0FBTCxDQUFVd3BDLE1BQVYsQ0FBWCxDQUNBLE1BQVFDLEtBQUt4cEMsUUFBTCxFQUFSLENBQ0EsUUFBVXRrQixLQUFLeWtCLEdBQUwsQ0FBVSxFQUFJc3BDLElBQU1BLEdBQXBCLENBQVYsQ0FDQSxNQUFBLENBQVFoOEIsRUFBUixDQUFZaThCLE9BQVosQ0FBcUJDLE1BQXJCLENBRUEsR0FBS3RnQyxJQUFNLENBQVgsQ0FBZTtFQUlkdWdDLEdBQUtILElBQU1odEMsRUFBTixDQUFXb3RDLEVBQWhCLENBQ0FwOEIsR0FBS2c4QixJQUFNSSxFQUFOLENBQVdwdEMsRUFBaEIsQ0FDQWt0QyxPQUFTRyxVQUFZemdDLEdBQXJCLENBRUEsR0FBS3VnQyxJQUFNLENBQVgsQ0FBZSxDQUVkLEdBQUtuOEIsSUFBTSxDQUFFazhCLE1BQWIsQ0FBc0IsQ0FFckIsR0FBS2w4QixJQUFNazhCLE1BQVgsQ0FBb0I7RUFHbkI7RUFFQSxXQUFhLEVBQUl0Z0MsR0FBakIsQ0FDQXVnQyxJQUFNRyxNQUFOLENBQ0F0OEIsSUFBTXM4QixNQUFOLENBQ0FMLFFBQVVFLElBQU9BLEdBQUtILElBQU1oOEIsRUFBWCxDQUFnQixFQUFJbzhCLEVBQTNCLEVBQWtDcDhCLElBQU9nOEIsSUFBTUcsRUFBTixDQUFXbjhCLEVBQVgsQ0FBZ0IsRUFBSWhSLEVBQTNCLENBQWxDLENBQW9FemYsQ0FBOUUsQ0FFQSxDQVZELElBVU87RUFJTnl3QixHQUFLcThCLFNBQUwsQ0FDQUYsR0FBS2x1RCxLQUFLOEUsR0FBTCxDQUFVLENBQVYsQ0FBYSxFQUFJaXBELElBQU1oOEIsRUFBTixDQUFXbzhCLEVBQWYsQ0FBYixDQUFMLENBQ0FILFFBQVUsQ0FBRUUsRUFBRixDQUFPQSxFQUFQLENBQVluOEIsSUFBT0EsR0FBSyxFQUFJaFIsRUFBaEIsQ0FBWixDQUFtQ3pmLENBQTdDLENBRUEsQ0FFRCxDQXRCRCxJQXNCTztFQUlOeXdCLEdBQUssQ0FBRXE4QixTQUFQLENBQ0FGLEdBQUtsdUQsS0FBSzhFLEdBQUwsQ0FBVSxDQUFWLENBQWEsRUFBSWlwRCxJQUFNaDhCLEVBQU4sQ0FBV284QixFQUFmLENBQWIsQ0FBTCxDQUNBSCxRQUFVLENBQUVFLEVBQUYsQ0FBT0EsRUFBUCxDQUFZbjhCLElBQU9BLEdBQUssRUFBSWhSLEVBQWhCLENBQVosQ0FBbUN6ZixDQUE3QyxDQUVBLENBRUQsQ0FsQ0QsSUFrQ08sQ0FFTixHQUFLeXdCLElBQU0sQ0FBRWs4QixNQUFiLENBQXNCO0VBSXJCQyxHQUFLbHVELEtBQUs4RSxHQUFMLENBQVUsQ0FBVixDQUFhLEVBQUksQ0FBRWlwRCxHQUFGLENBQVFLLFNBQVIsQ0FBb0JELEVBQXhCLENBQWIsQ0FBTCxDQUNBcDhCLEdBQU9tOEIsR0FBSyxDQUFQLENBQWEsQ0FBRUUsU0FBZixDQUEyQnB1RCxLQUFLNkUsR0FBTCxDQUFVN0UsS0FBSzhFLEdBQUwsQ0FBVSxDQUFFc3BELFNBQVosQ0FBdUIsQ0FBRXJ0QyxFQUF6QixDQUFWLENBQXlDcXRDLFNBQXpDLENBQWhDLENBQ0FKLFFBQVUsQ0FBRUUsRUFBRixDQUFPQSxFQUFQLENBQVluOEIsSUFBT0EsR0FBSyxFQUFJaFIsRUFBaEIsQ0FBWixDQUFtQ3pmLENBQTdDLENBRUEsQ0FSRCxRQVFZeXdCLElBQU1rOEIsTUFBWCxDQUFvQjtFQUkxQkMsR0FBSyxDQUFMLENBQ0FuOEIsR0FBSy94QixLQUFLNkUsR0FBTCxDQUFVN0UsS0FBSzhFLEdBQUwsQ0FBVSxDQUFFc3BELFNBQVosQ0FBdUIsQ0FBRXJ0QyxFQUF6QixDQUFWLENBQXlDcXRDLFNBQXpDLENBQUwsQ0FDQUosUUFBVWo4QixJQUFPQSxHQUFLLEVBQUloUixFQUFoQixFQUF1QnpmLENBQWpDLENBRUEsQ0FSTSxJQVFBO0VBSU40c0QsR0FBS2x1RCxLQUFLOEUsR0FBTCxDQUFVLENBQVYsQ0FBYSxFQUFJaXBELElBQU1LLFNBQU4sQ0FBa0JELEVBQXRCLENBQWIsQ0FBTCxDQUNBcDhCLEdBQU9tOEIsR0FBSyxDQUFQLENBQWFFLFNBQWIsQ0FBeUJwdUQsS0FBSzZFLEdBQUwsQ0FBVTdFLEtBQUs4RSxHQUFMLENBQVUsQ0FBRXNwRCxTQUFaLENBQXVCLENBQUVydEMsRUFBekIsQ0FBVixDQUF5Q3F0QyxTQUF6QyxDQUE5QixDQUNBSixRQUFVLENBQUVFLEVBQUYsQ0FBT0EsRUFBUCxDQUFZbjhCLElBQU9BLEdBQUssRUFBSWhSLEVBQWhCLENBQVosQ0FBbUN6ZixDQUE3QyxDQUVBLENBRUQsQ0FFRCxDQXhFRCxJQXdFTztFQUlOeXdCLEdBQU9nOEIsSUFBTSxDQUFSLENBQWMsQ0FBRUssU0FBaEIsQ0FBNEJBLFNBQWpDLENBQ0FGLEdBQUtsdUQsS0FBSzhFLEdBQUwsQ0FBVSxDQUFWLENBQWEsRUFBSWlwRCxJQUFNaDhCLEVBQU4sQ0FBV284QixFQUFmLENBQWIsQ0FBTCxDQUNBSCxRQUFVLENBQUVFLEVBQUYsQ0FBT0EsRUFBUCxDQUFZbjhCLElBQU9BLEdBQUssRUFBSWhSLEVBQWhCLENBQVosQ0FBbUN6ZixDQUE3QyxDQUVBLENBRUQsR0FBS29zRCxrQkFBTCxDQUEwQixDQUV6QkEsbUJBQW1CM3FDLElBQW5CLENBQXlCLEtBQUswZSxTQUE5QixFQUEwQ2hlLGNBQTFDLENBQTBEeXFDLEVBQTFELEVBQStEbHJDLEdBQS9ELENBQW9FLEtBQUtpcUMsTUFBekUsRUFFQSxDQUVELEdBQUtVLHNCQUFMLENBQThCLENBRTdCQSx1QkFBdUI1cUMsSUFBdkIsQ0FBNkI4cUMsTUFBN0IsRUFBc0NwcUMsY0FBdEMsQ0FBc0RzTyxFQUF0RCxFQUEyRC9PLEdBQTNELENBQWdFNHFDLFNBQWhFLEVBRUEsQ0FFRCxjQUFBLENBRUEsQ0FySEQsQ0F1SEEsQ0E3SG9CLEVBbEhRLENBaVA3QlUsZ0JBQWlCLFVBQVksQ0FFNUIsT0FBUyxXQUFBLEVBQVQsQ0FFQSwrQkFBTyxDQUEwQnJ2QixNQUExQixDQUFrQ2w3QixNQUFsQyxDQUEyQyxDQUVqRHNoQixHQUFHL0IsVUFBSCxDQUFlMmIsT0FBT2paLE1BQXRCLENBQThCLEtBQUtpbkMsTUFBbkMsRUFDQSxRQUFVNW5DLEdBQUdoQixHQUFILENBQVEsS0FBS29kLFNBQWIsQ0FBVixDQUNBLE9BQVNwYyxHQUFHaEIsR0FBSCxDQUFRZ0IsRUFBUixFQUFla3BDLElBQU1BLEdBQTlCLENBQ0EsWUFBY3R2QixPQUFPcEksTUFBUCxDQUFnQm9JLE9BQU9wSSxNQUFyQyxDQUVBLEdBQUt4VyxHQUFLbXVDLE9BQVYsQ0FBb0IsV0FBQSxDQUVwQixRQUFVeHVELEtBQUt1a0IsSUFBTCxDQUFXaXFDLFFBQVVudUMsRUFBckIsQ0FBVixDQUVBO0VBQ0EsT0FBU2t1QyxJQUFNRSxHQUFmLENBRUE7RUFDQSxPQUFTRixJQUFNRSxHQUFmLENBRUE7RUFDQSxHQUFLQyxHQUFLLENBQUwsRUFBVUMsR0FBSyxDQUFwQixDQUF3QixXQUFBLENBRXhCO0VBQ0E7RUFDQTtFQUNBLEdBQUtELEdBQUssQ0FBVixDQUFjLFlBQVl0QixFQUFMLENBQVN1QixFQUFULENBQWE1cUQsTUFBYixDQUFQLENBRWQ7RUFDQSxZQUFZcXBELEVBQUwsQ0FBU3NCLEVBQVQsQ0FBYTNxRCxNQUFiLENBQVAsQ0FFQSxDQTVCRCxDQThCQSxDQWxDZ0IsRUFqUFksQ0FxUjdCaTdCLGlCQUFrQixTQUFXQyxNQUFYLENBQW9CLENBRXJDLFlBQVlvQixlQUFMLENBQXNCcEIsT0FBT2paLE1BQTdCLEdBQXlDaVosT0FBT3BJLE1BQXZELENBRUEsQ0F6UjRCLENBMlI3QiszQixnQkFBaUIsU0FBV3Z2QixLQUFYLENBQW1CLENBRW5DLGdCQUFrQkEsTUFBTTlJLE1BQU4sQ0FBYWxTLEdBQWIsQ0FBa0IsS0FBS29kLFNBQXZCLENBQWxCLENBRUEsR0FBS0MsY0FBZ0IsQ0FBckIsQ0FBeUI7RUFHeEIsR0FBS3JDLE1BQU1nQixlQUFOLENBQXVCLEtBQUs0c0IsTUFBNUIsSUFBeUMsQ0FBOUMsQ0FBa0QsQ0FFakQsUUFBQSxDQUVBLENBRUQ7RUFFQSxXQUFBLENBRUEsQ0FFRCxNQUFRLEVBQUksS0FBS0EsTUFBTCxDQUFZNW9DLEdBQVosQ0FBaUJnYixNQUFNOUksTUFBdkIsRUFBa0M4SSxNQUFNQyxRQUE1QyxFQUF5RG9DLFdBQWpFLENBRUE7RUFFQSxVQUFZLENBQUwsQ0FBU3ZnQixDQUFULENBQWEsSUFBcEIsQ0FFQSxDQXBUNEIsQ0FzVDdCMHRDLGVBQWdCLFNBQVd4dkIsS0FBWCxDQUFrQnQ3QixNQUFsQixDQUEyQixDQUUxQyxNQUFRLEtBQUs2cUQsZUFBTCxDQUFzQnZ2QixLQUF0QixDQUFSLENBRUEsR0FBS2xlLElBQU0sSUFBWCxDQUFrQixDQUVqQixXQUFBLENBRUEsQ0FFRCxZQUFZaXNDLEVBQUwsQ0FBU2pzQyxDQUFULENBQVlwZCxNQUFaLENBQVAsQ0FFQSxDQWxVNEIsQ0FvVTdCcTdCLGdCQUFpQixTQUFXQyxLQUFYLENBQW1CO0VBSW5DLGdCQUFrQkEsTUFBTWdCLGVBQU4sQ0FBdUIsS0FBSzRzQixNQUE1QixDQUFsQixDQUVBLEdBQUs2QixjQUFnQixDQUFyQixDQUF5QixDQUV4QixXQUFBLENBRUEsQ0FFRCxnQkFBa0J6dkIsTUFBTTlJLE1BQU4sQ0FBYWxTLEdBQWIsQ0FBa0IsS0FBS29kLFNBQXZCLENBQWxCLENBRUEsR0FBS0MsWUFBY290QixXQUFkLENBQTRCLENBQWpDLENBQXFDLENBRXBDLFdBQUEsQ0FFQSxDQUVEO0VBRUEsWUFBQSxDQUVBLENBNVY0QixDQThWN0JDLGFBQWMsU0FBV2p4QixHQUFYLENBQWdCLzVCLE1BQWhCLENBQXlCLENBRXRDLFFBQUEsQ0FBVWlyRCxJQUFWLENBQWdCQyxLQUFoQixDQUF1QkMsS0FBdkIsQ0FBOEJDLEtBQTlCLENBQXFDQyxLQUFyQyxDQUVBLFlBQWMsRUFBSSxLQUFLM3RCLFNBQUwsQ0FBZS93QixDQUFqQyxDQUNDMitDLFFBQVUsRUFBSSxLQUFLNXRCLFNBQUwsQ0FBZXZnQixDQUQ5QixDQUVDb3VDLFFBQVUsRUFBSSxLQUFLN3RCLFNBQUwsQ0FBZTFaLENBRjlCLENBSUEsV0FBYSxLQUFLa2xDLE1BQWxCLENBRUEsR0FBS3NDLFNBQVcsQ0FBaEIsQ0FBb0IsQ0FFbkJDLEtBQU8sQ0FBRTF4QixJQUFJajVCLEdBQUosQ0FBUTZMLENBQVIsQ0FBWXU4QyxPQUFPdjhDLENBQXJCLEVBQTJCNitDLE9BQWxDLENBQ0FQLEtBQU8sQ0FBRWx4QixJQUFJaDVCLEdBQUosQ0FBUTRMLENBQVIsQ0FBWXU4QyxPQUFPdjhDLENBQXJCLEVBQTJCNitDLE9BQWxDLENBRUEsQ0FMRCxJQUtPLENBRU5DLEtBQU8sQ0FBRTF4QixJQUFJaDVCLEdBQUosQ0FBUTRMLENBQVIsQ0FBWXU4QyxPQUFPdjhDLENBQXJCLEVBQTJCNitDLE9BQWxDLENBQ0FQLEtBQU8sQ0FBRWx4QixJQUFJajVCLEdBQUosQ0FBUTZMLENBQVIsQ0FBWXU4QyxPQUFPdjhDLENBQXJCLEVBQTJCNitDLE9BQWxDLENBRUEsQ0FFRCxHQUFLRixTQUFXLENBQWhCLENBQW9CLENBRW5CSixNQUFRLENBQUVueEIsSUFBSWo1QixHQUFKLENBQVFxYyxDQUFSLENBQVkrckMsT0FBTy9yQyxDQUFyQixFQUEyQm11QyxPQUFuQyxDQUNBSCxNQUFRLENBQUVweEIsSUFBSWg1QixHQUFKLENBQVFvYyxDQUFSLENBQVkrckMsT0FBTy9yQyxDQUFyQixFQUEyQm11QyxPQUFuQyxDQUVBLENBTEQsSUFLTyxDQUVOSixNQUFRLENBQUVueEIsSUFBSWg1QixHQUFKLENBQVFvYyxDQUFSLENBQVkrckMsT0FBTy9yQyxDQUFyQixFQUEyQm11QyxPQUFuQyxDQUNBSCxNQUFRLENBQUVweEIsSUFBSWo1QixHQUFKLENBQVFxYyxDQUFSLENBQVkrckMsT0FBTy9yQyxDQUFyQixFQUEyQm11QyxPQUFuQyxDQUVBLENBRUQsR0FBT0csS0FBT04sS0FBVCxFQUFzQkQsTUFBUUQsSUFBbkMsQ0FBNEMsV0FBQSxDQUU1QztFQUNBO0VBRUEsR0FBS0MsTUFBUU8sSUFBUixFQUFnQkEsT0FBU0EsSUFBOUIsQ0FBcUNBLEtBQU9QLEtBQVAsQ0FFckMsR0FBS0MsTUFBUUYsSUFBUixFQUFnQkEsT0FBU0EsSUFBOUIsQ0FBcUNBLEtBQU9FLEtBQVAsQ0FFckMsR0FBS0ksU0FBVyxDQUFoQixDQUFvQixDQUVuQkgsTUFBUSxDQUFFcnhCLElBQUlqNUIsR0FBSixDQUFRa2pCLENBQVIsQ0FBWWtsQyxPQUFPbGxDLENBQXJCLEVBQTJCdW5DLE9BQW5DLENBQ0FGLE1BQVEsQ0FBRXR4QixJQUFJaDVCLEdBQUosQ0FBUWlqQixDQUFSLENBQVlrbEMsT0FBT2xsQyxDQUFyQixFQUEyQnVuQyxPQUFuQyxDQUVBLENBTEQsSUFLTyxDQUVOSCxNQUFRLENBQUVyeEIsSUFBSWg1QixHQUFKLENBQVFpakIsQ0FBUixDQUFZa2xDLE9BQU9sbEMsQ0FBckIsRUFBMkJ1bkMsT0FBbkMsQ0FDQUYsTUFBUSxDQUFFdHhCLElBQUlqNUIsR0FBSixDQUFRa2pCLENBQVIsQ0FBWWtsQyxPQUFPbGxDLENBQXJCLEVBQTJCdW5DLE9BQW5DLENBRUEsQ0FFRCxHQUFPRSxLQUFPSixLQUFULEVBQXNCRCxNQUFRSCxJQUFuQyxDQUE0QyxXQUFBLENBRTVDLEdBQUtHLE1BQVFLLElBQVIsRUFBZ0JBLE9BQVNBLElBQTlCLENBQXFDQSxLQUFPTCxLQUFQLENBRXJDLEdBQUtDLE1BQVFKLElBQVIsRUFBZ0JBLE9BQVNBLElBQTlCLENBQXFDQSxLQUFPSSxLQUFQLENBRXJDO0VBRUEsR0FBS0osS0FBTyxDQUFaLENBQWdCLFdBQUEsQ0FFaEIsWUFBWTVCLEVBQUwsQ0FBU29DLE1BQVEsQ0FBUixDQUFZQSxJQUFaLENBQW1CUixJQUE1QixDQUFrQ2pyRCxNQUFsQyxDQUFQLENBRUEsQ0FqYTRCLENBbWE3Qmc3QixjQUFpQixVQUFZLENBRTVCLE1BQVEsV0FBQSxFQUFSLENBRUEsNkJBQU8sQ0FBd0JqQixHQUF4QixDQUE4QixDQUVwQyxZQUFZaXhCLFlBQUwsQ0FBbUJqeEIsR0FBbkIsQ0FBd0J0dEIsQ0FBeEIsSUFBZ0MsSUFBdkMsQ0FFQSxDQUpELENBTUEsQ0FWYyxFQW5hYyxDQSthN0JpL0Msa0JBQW1CLFVBQVk7RUFHOUIsU0FBVyxXQUFBLEVBQVgsQ0FDQSxVQUFZLFdBQUEsRUFBWixDQUNBLFVBQVksV0FBQSxFQUFaLENBQ0EsV0FBYSxXQUFBLEVBQWIsQ0FFQSxpQ0FBTyxDQUE0QjV1RCxDQUE1QixDQUErQkYsQ0FBL0IsQ0FBa0NXLENBQWxDLENBQXFDb3VELGVBQXJDLENBQXNEM3JELE1BQXRELENBQStEO0VBSXJFNHJELE1BQU1yc0MsVUFBTixDQUFrQjNpQixDQUFsQixDQUFxQkUsQ0FBckIsRUFDQSt1RCxNQUFNdHNDLFVBQU4sQ0FBa0JoaUIsQ0FBbEIsQ0FBcUJULENBQXJCLEVBQ0EwMUIsT0FBTzlMLFlBQVAsQ0FBcUJrbEMsS0FBckIsQ0FBNEJDLEtBQTVCLEVBRUE7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBLFFBQVUsS0FBS251QixTQUFMLENBQWVwZCxHQUFmLENBQW9Ca1MsTUFBcEIsQ0FBVixDQUNBLFFBQUEsQ0FFQSxHQUFLczVCLElBQU0sQ0FBWCxDQUFlLENBRWQsR0FBS0gsZUFBTCxDQUF1QixXQUFBLENBQ3ZCNXdDLEtBQU8sQ0FBUCxDQUVBLENBTEQsUUFLWSt3QyxJQUFNLENBQVgsQ0FBZSxDQUVyQi93QyxLQUFPLENBQUUsQ0FBVCxDQUNBK3dDLElBQU0sQ0FBRUEsR0FBUixDQUVBLENBTE0sSUFLQSxDQUVOLFdBQUEsQ0FFQSxDQUVEL0IsS0FBS3hxQyxVQUFMLENBQWlCLEtBQUsycEMsTUFBdEIsQ0FBOEJwc0QsQ0FBOUIsRUFDQSxXQUFhaWUsS0FBTyxLQUFLMmlCLFNBQUwsQ0FBZXBkLEdBQWYsQ0FBb0J1ckMsTUFBTW5sQyxZQUFOLENBQW9CcWpDLElBQXBCLENBQTBCOEIsS0FBMUIsQ0FBcEIsQ0FBcEIsQ0FFQTtFQUNBLEdBQUtFLE9BQVMsQ0FBZCxDQUFrQixDQUVqQixXQUFBLENBRUEsQ0FFRCxXQUFhaHhDLEtBQU8sS0FBSzJpQixTQUFMLENBQWVwZCxHQUFmLENBQW9Cc3JDLE1BQU0vNUIsS0FBTixDQUFhazRCLElBQWIsQ0FBcEIsQ0FBcEIsQ0FFQTtFQUNBLEdBQUtpQyxPQUFTLENBQWQsQ0FBa0IsQ0FFakIsV0FBQSxDQUVBLENBRUQ7RUFDQSxHQUFLRCxPQUFTQyxNQUFULENBQWtCRixHQUF2QixDQUE2QixDQUU1QixXQUFBLENBRUEsQ0FFRDtFQUNBLFFBQVUsQ0FBRS93QyxJQUFGLENBQVNndkMsS0FBS3pwQyxHQUFMLENBQVVrUyxNQUFWLENBQW5CLENBRUE7RUFDQSxHQUFLeTVCLElBQU0sQ0FBWCxDQUFlLENBRWQsV0FBQSxDQUVBLENBRUQ7RUFDQSxZQUFZNUMsRUFBTCxDQUFTNEMsSUFBTUgsR0FBZixDQUFvQjlyRCxNQUFwQixDQUFQLENBRUEsQ0F2RUQsQ0F5RUEsQ0FqRmtCLEVBL2FVLENBa2dCN0JncEIsYUFBYyxTQUFXdUssT0FBWCxDQUFxQixDQUVsQyxLQUFLMjFCLE1BQUwsQ0FBWWxnQyxZQUFaLENBQTBCdUssT0FBMUIsRUFDQSxLQUFLbUssU0FBTCxDQUFlOUwsa0JBQWYsQ0FBbUMyQixPQUFuQyxFQUVBLFdBQUEsQ0FFQSxDQXpnQjRCLENBMmdCN0IvUixPQUFRLFNBQVc0bkMsR0FBWCxDQUFpQixDQUV4QixXQUFXRixNQUFKLENBQVcxbkMsTUFBWCxDQUFtQixLQUFLMG5DLE1BQXhCLEdBQW9DRSxJQUFJMXJCLFNBQUosQ0FBY2xjLE1BQWQsQ0FBc0IsS0FBS2tjLFNBQTNCLENBQTNDLENBRUEsQ0EvZ0I0QixDQUE5QixFQW1oQkE7O0tBSUEsY0FBQSxDQUFnQkUsS0FBaEIsQ0FBdUJFLEdBQXZCLENBQTZCLENBRTVCLEtBQUtGLEtBQUwsQ0FBZUEsUUFBVWxsQyxTQUFaLENBQTBCa2xDLEtBQTFCLENBQWtDLFdBQUEsRUFBL0MsQ0FDQSxLQUFLRSxHQUFMLENBQWFBLE1BQVFwbEMsU0FBVixDQUF3Qm9sQyxHQUF4QixDQUE4QixXQUFBLEVBQXpDLENBRUEsQ0FFRHpxQyxPQUFPNG5CLE1BQVAsQ0FBZWl4QyxNQUFNNTRELFNBQXJCLENBQWdDLENBRS9Cb1gsSUFBSyxTQUFXa3pCLEtBQVgsQ0FBa0JFLEdBQWxCLENBQXdCLENBRTVCLEtBQUtGLEtBQUwsQ0FBVzVlLElBQVgsQ0FBaUI0ZSxLQUFqQixFQUNBLEtBQUtFLEdBQUwsQ0FBUzllLElBQVQsQ0FBZThlLEdBQWYsRUFFQSxXQUFBLENBRUEsQ0FUOEIsQ0FXL0IvZSxNQUFPLFVBQVksQ0FFbEIsZ0JBQWdCbnBCLFdBQVQsR0FBdUJvcEIsSUFBdkIsQ0FBNkIsSUFBN0IsQ0FBUCxDQUVBLENBZjhCLENBaUIvQkEsS0FBTSxTQUFXd2UsSUFBWCxDQUFrQixDQUV2QixLQUFLSSxLQUFMLENBQVc1ZSxJQUFYLENBQWlCd2UsS0FBS0ksS0FBdEIsRUFDQSxLQUFLRSxHQUFMLENBQVM5ZSxJQUFULENBQWV3ZSxLQUFLTSxHQUFwQixFQUVBLFdBQUEsQ0FFQSxDQXhCOEIsQ0EwQi9CN0QsVUFBVyxTQUFXajZCLE1BQVgsQ0FBb0IsQ0FFOUIsR0FBS0EsU0FBV3RILFNBQWhCLENBQTRCLENBRTNCMlcsUUFBUTZQLElBQVIsQ0FBYyxrREFBZCxFQUNBbGYsT0FBUyxXQUFBLEVBQVQsQ0FFQSxDQUVELGNBQWNtZixVQUFQLENBQW1CLEtBQUt5ZSxLQUF4QixDQUErQixLQUFLRSxHQUFwQyxFQUEwQ3BlLGNBQTFDLENBQTBELEdBQTFELENBQVAsQ0FFQSxDQXJDOEIsQ0F1Qy9CK2QsTUFBTyxTQUFXejlCLE1BQVgsQ0FBb0IsQ0FFMUIsR0FBS0EsU0FBV3RILFNBQWhCLENBQTRCLENBRTNCMlcsUUFBUTZQLElBQVIsQ0FBYyw4Q0FBZCxFQUNBbGYsT0FBUyxXQUFBLEVBQVQsQ0FFQSxDQUVELGNBQWN1ZixVQUFQLENBQW1CLEtBQUt1ZSxHQUF4QixDQUE2QixLQUFLRixLQUFsQyxDQUFQLENBRUEsQ0FsRDhCLENBb0QvQnV1QixXQUFZLFVBQVksQ0FFdkIsWUFBWXZ1QixLQUFMLENBQVc3YyxpQkFBWCxDQUE4QixLQUFLK2MsR0FBbkMsQ0FBUCxDQUVBLENBeEQ4QixDQTBEL0JvQyxTQUFVLFVBQVksQ0FFckIsWUFBWXRDLEtBQUwsQ0FBVzljLFVBQVgsQ0FBdUIsS0FBS2dkLEdBQTVCLENBQVAsQ0FFQSxDQTlEOEIsQ0FnRS9CdXJCLEdBQUksU0FBV2pzQyxDQUFYLENBQWNwZCxNQUFkLENBQXVCLENBRTFCLEdBQUtBLFNBQVd0SCxTQUFoQixDQUE0QixDQUUzQjJXLFFBQVE2UCxJQUFSLENBQWMsMkNBQWQsRUFDQWxmLE9BQVMsV0FBQSxFQUFULENBRUEsQ0FFRCxZQUFZeTlCLEtBQUwsQ0FBWXo5QixNQUFaLEVBQXFCMGYsY0FBckIsQ0FBcUN0QyxDQUFyQyxFQUF5QzZCLEdBQXpDLENBQThDLEtBQUsyZSxLQUFuRCxDQUFQLENBRUEsQ0EzRThCLENBNkUvQnd1Qiw2QkFBOEIsVUFBWSxDQUV6QyxXQUFhLFdBQUEsRUFBYixDQUNBLGFBQWUsV0FBQSxFQUFmLENBRUEsNENBQU8sQ0FBdUNwbEQsS0FBdkMsQ0FBOENxbEQsV0FBOUMsQ0FBNEQsQ0FFbEVDLE9BQU8vc0MsVUFBUCxDQUFtQnZZLEtBQW5CLENBQTBCLEtBQUs0MkIsS0FBL0IsRUFDQTJ1QixTQUFTaHRDLFVBQVQsQ0FBcUIsS0FBS3VlLEdBQTFCLENBQStCLEtBQUtGLEtBQXBDLEVBRUEsY0FBZ0IydUIsU0FBU2pzQyxHQUFULENBQWNpc0MsUUFBZCxDQUFoQixDQUNBLG9CQUFzQkEsU0FBU2pzQyxHQUFULENBQWNnc0MsTUFBZCxDQUF0QixDQUVBLE1BQVFFLGdCQUFrQkMsU0FBMUIsQ0FFQSxHQUFLSixXQUFMLENBQW1CLENBRWxCanZDLEVBQUlXLE1BQU10QixLQUFOLENBQWFXLENBQWIsQ0FBZ0IsQ0FBaEIsQ0FBbUIsQ0FBbkIsQ0FBSixDQUVBLENBRUQsUUFBQSxDQUVBLENBbEJELENBb0JBLENBekI2QixFQTdFQyxDQXdHL0Jtc0Msb0JBQXFCLFNBQVd2aUQsS0FBWCxDQUFrQnFsRCxXQUFsQixDQUErQnJzRCxNQUEvQixDQUF3QyxDQUU1RCxNQUFRLEtBQUtvc0QsNEJBQUwsQ0FBbUNwbEQsS0FBbkMsQ0FBMENxbEQsV0FBMUMsQ0FBUixDQUVBLEdBQUtyc0QsU0FBV3RILFNBQWhCLENBQTRCLENBRTNCMlcsUUFBUTZQLElBQVIsQ0FBYyw0REFBZCxFQUNBbGYsT0FBUyxXQUFBLEVBQVQsQ0FFQSxDQUVELFlBQVl5OUIsS0FBTCxDQUFZejlCLE1BQVosRUFBcUIwZixjQUFyQixDQUFxQ3RDLENBQXJDLEVBQXlDNkIsR0FBekMsQ0FBOEMsS0FBSzJlLEtBQW5ELENBQVAsQ0FFQSxDQXJIOEIsQ0F1SC9CNVUsYUFBYyxTQUFXcUMsTUFBWCxDQUFvQixDQUVqQyxLQUFLdVMsS0FBTCxDQUFXNVUsWUFBWCxDQUF5QnFDLE1BQXpCLEVBQ0EsS0FBS3lTLEdBQUwsQ0FBUzlVLFlBQVQsQ0FBdUJxQyxNQUF2QixFQUVBLFdBQUEsQ0FFQSxDQTlIOEIsQ0FnSS9CN0osT0FBUSxTQUFXZ2MsSUFBWCxDQUFrQixDQUV6QixZQUFZSSxLQUFMLENBQVdwYyxNQUFYLENBQW1CLEtBQUtvYyxLQUF4QixHQUFtQ0osS0FBS00sR0FBTCxDQUFTdGMsTUFBVCxDQUFpQixLQUFLc2MsR0FBdEIsQ0FBMUMsQ0FFQSxDQXBJOEIsQ0FBaEMsRUF3SUE7OztLQUtBLGlCQUFBLENBQW1CaGhDLENBQW5CLENBQXNCRixDQUF0QixDQUF5QlcsQ0FBekIsQ0FBNkIsQ0FFNUIsS0FBS1QsQ0FBTCxDQUFXQSxJQUFNcEUsU0FBUixDQUFzQm9FLENBQXRCLENBQTBCLFdBQUEsRUFBbkMsQ0FDQSxLQUFLRixDQUFMLENBQVdBLElBQU1sRSxTQUFSLENBQXNCa0UsQ0FBdEIsQ0FBMEIsV0FBQSxFQUFuQyxDQUNBLEtBQUtXLENBQUwsQ0FBV0EsSUFBTTdFLFNBQVIsQ0FBc0I2RSxDQUF0QixDQUEwQixXQUFBLEVBQW5DLENBRUEsQ0FFRGxLLE9BQU80bkIsTUFBUCxDQUFleXhDLFFBQWYsQ0FBeUIsQ0FFeEJDLFVBQVcsVUFBWSxDQUV0QixPQUFTLFdBQUEsRUFBVCxDQUVBLHlCQUFPLENBQW9CN3ZELENBQXBCLENBQXVCRixDQUF2QixDQUEwQlcsQ0FBMUIsQ0FBNkJ5QyxNQUE3QixDQUFzQyxDQUU1QyxHQUFLQSxTQUFXdEgsU0FBaEIsQ0FBNEIsQ0FFM0IyVyxRQUFRNlAsSUFBUixDQUFjLHFEQUFkLEVBQ0FsZixPQUFTLFdBQUEsRUFBVCxDQUVBLENBRURBLE9BQU91ZixVQUFQLENBQW1CaGlCLENBQW5CLENBQXNCWCxDQUF0QixFQUNBZy9CLEdBQUdyYyxVQUFILENBQWV6aUIsQ0FBZixDQUFrQkYsQ0FBbEIsRUFDQW9ELE9BQU82eEIsS0FBUCxDQUFjK0osRUFBZCxFQUVBLG1CQUFxQjU3QixPQUFPdWdCLFFBQVAsRUFBckIsQ0FDQSxHQUFLcXNDLGVBQWlCLENBQXRCLENBQTBCLENBRXpCLGNBQWNsdEMsY0FBUCxDQUF1QixFQUFJempCLEtBQUt1a0IsSUFBTCxDQUFXb3NDLGNBQVgsQ0FBM0IsQ0FBUCxDQUVBLENBRUQsY0FBY2xpRCxHQUFQLENBQVksQ0FBWixDQUFlLENBQWYsQ0FBa0IsQ0FBbEIsQ0FBUCxDQUVBLENBdEJELENBd0JBLENBNUJVLEVBRmE7RUFpQ3hCO0VBQ0FtaUQsYUFBYyxVQUFZLENBRXpCLE9BQVMsV0FBQSxFQUFULENBQ0EsT0FBUyxXQUFBLEVBQVQsQ0FDQSxPQUFTLFdBQUEsRUFBVCxDQUVBLDRCQUFPLENBQXVCN2xELEtBQXZCLENBQThCbEssQ0FBOUIsQ0FBaUNGLENBQWpDLENBQW9DVyxDQUFwQyxDQUF1Q3lDLE1BQXZDLENBQWdELENBRXRENDdCLEdBQUdyYyxVQUFILENBQWVoaUIsQ0FBZixDQUFrQlQsQ0FBbEIsRUFDQXdrQixHQUFHL0IsVUFBSCxDQUFlM2lCLENBQWYsQ0FBa0JFLENBQWxCLEVBQ0F5a0IsR0FBR2hDLFVBQUgsQ0FBZXZZLEtBQWYsQ0FBc0JsSyxDQUF0QixFQUVBLFVBQVk4K0IsR0FBR3RiLEdBQUgsQ0FBUXNiLEVBQVIsQ0FBWixDQUNBLFVBQVlBLEdBQUd0YixHQUFILENBQVFnQixFQUFSLENBQVosQ0FDQSxVQUFZc2EsR0FBR3RiLEdBQUgsQ0FBUWlCLEVBQVIsQ0FBWixDQUNBLFVBQVlELEdBQUdoQixHQUFILENBQVFnQixFQUFSLENBQVosQ0FDQSxVQUFZQSxHQUFHaEIsR0FBSCxDQUFRaUIsRUFBUixDQUFaLENBRUEsVUFBY3VyQyxNQUFRQyxLQUFSLENBQWdCQyxNQUFRQSxLQUF0QyxDQUVBLEdBQUtodEQsU0FBV3RILFNBQWhCLENBQTRCLENBRTNCMlcsUUFBUTZQLElBQVIsQ0FBYyx3REFBZCxFQUNBbGYsT0FBUyxXQUFBLEVBQVQsQ0FFQSxDQUVEO0VBQ0EsR0FBS2l0RCxRQUFVLENBQWYsQ0FBbUI7RUFHbEI7RUFDQSxjQUFjdmlELEdBQVAsQ0FBWSxDQUFFLENBQWQsQ0FBaUIsQ0FBRSxDQUFuQixDQUFzQixDQUFFLENBQXhCLENBQVAsQ0FFQSxDQUVELGFBQWUsRUFBSXVpRCxLQUFuQixDQUNBLE1BQVEsQ0FBRUYsTUFBUUcsS0FBUixDQUFnQkYsTUFBUUcsS0FBMUIsRUFBb0NDLFFBQTVDLENBQ0EsTUFBUSxDQUFFTixNQUFRSyxLQUFSLENBQWdCSCxNQUFRRSxLQUExQixFQUFvQ0UsUUFBNUMsQ0FFQTtFQUNBLGNBQWMxaUQsR0FBUCxDQUFZLEVBQUk2OEIsQ0FBSixDQUFROTZCLENBQXBCLENBQXVCQSxDQUF2QixDQUEwQjg2QixDQUExQixDQUFQLENBRUEsQ0FyQ0QsQ0F1Q0EsQ0E3Q2EsRUFsQ1UsQ0FpRnhCMU0sY0FBZSxVQUFZLENBRTFCLE9BQVMsV0FBQSxFQUFULENBRUEsNkJBQU8sQ0FBd0I3ekIsS0FBeEIsQ0FBK0JsSyxDQUEvQixDQUFrQ0YsQ0FBbEMsQ0FBcUNXLENBQXJDLENBQXlDLENBRS9DbXZELFNBQVNHLFlBQVQsQ0FBdUI3bEQsS0FBdkIsQ0FBOEJsSyxDQUE5QixDQUFpQ0YsQ0FBakMsQ0FBb0NXLENBQXBDLENBQXVDK2pCLEVBQXZDLEVBRUEsVUFBWTNVLENBQUgsRUFBUSxDQUFWLEVBQW1CMlUsR0FBR25FLENBQUgsRUFBUSxDQUEzQixFQUFzQ21FLEdBQUczVSxDQUFILENBQU8yVSxHQUFHbkUsQ0FBWixFQUFtQixDQUE5RCxDQUVBLENBTkQsQ0FRQSxDQVpjLEVBakZTLENBQXpCLEVBaUdBOXBCLE9BQU80bkIsTUFBUCxDQUFleXhDLFNBQVNwNUQsU0FBeEIsQ0FBbUMsQ0FFbENvWCxJQUFLLFNBQVc1TixDQUFYLENBQWNGLENBQWQsQ0FBaUJXLENBQWpCLENBQXFCLENBRXpCLEtBQUtULENBQUwsQ0FBT2tpQixJQUFQLENBQWFsaUIsQ0FBYixFQUNBLEtBQUtGLENBQUwsQ0FBT29pQixJQUFQLENBQWFwaUIsQ0FBYixFQUNBLEtBQUtXLENBQUwsQ0FBT3loQixJQUFQLENBQWF6aEIsQ0FBYixFQUVBLFdBQUEsQ0FFQSxDQVZpQyxDQVlsQzh2RCx3QkFBeUIsU0FBVy96QixNQUFYLENBQW1CZzBCLEVBQW5CLENBQXVCQyxFQUF2QixDQUEyQkMsRUFBM0IsQ0FBZ0MsQ0FFeEQsS0FBSzF3RCxDQUFMLENBQU9raUIsSUFBUCxDQUFhc2EsT0FBUWcwQixFQUFSLENBQWIsRUFDQSxLQUFLMXdELENBQUwsQ0FBT29pQixJQUFQLENBQWFzYSxPQUFRaTBCLEVBQVIsQ0FBYixFQUNBLEtBQUtod0QsQ0FBTCxDQUFPeWhCLElBQVAsQ0FBYXNhLE9BQVFrMEIsRUFBUixDQUFiLEVBRUEsV0FBQSxDQUVBLENBcEJpQyxDQXNCbEN6dUMsTUFBTyxVQUFZLENBRWxCLGdCQUFnQm5wQixXQUFULEdBQXVCb3BCLElBQXZCLENBQTZCLElBQTdCLENBQVAsQ0FFQSxDQTFCaUMsQ0E0QmxDQSxLQUFNLFNBQVdnZCxRQUFYLENBQXNCLENBRTNCLEtBQUtsL0IsQ0FBTCxDQUFPa2lCLElBQVAsQ0FBYWdkLFNBQVNsL0IsQ0FBdEIsRUFDQSxLQUFLRixDQUFMLENBQU9vaUIsSUFBUCxDQUFhZ2QsU0FBU3AvQixDQUF0QixFQUNBLEtBQUtXLENBQUwsQ0FBT3loQixJQUFQLENBQWFnZCxTQUFTeitCLENBQXRCLEVBRUEsV0FBQSxDQUVBLENBcENpQyxDQXNDbENrd0QsUUFBUyxVQUFZLENBRXBCLE9BQVMsV0FBQSxFQUFULENBQ0EsT0FBUyxXQUFBLEVBQVQsQ0FFQSx1QkFBTyxFQUFtQixDQUV6Qjd4QixHQUFHcmMsVUFBSCxDQUFlLEtBQUtoaUIsQ0FBcEIsQ0FBdUIsS0FBS1gsQ0FBNUIsRUFDQTBrQixHQUFHL0IsVUFBSCxDQUFlLEtBQUt6aUIsQ0FBcEIsQ0FBdUIsS0FBS0YsQ0FBNUIsRUFFQSxVQUFVaTFCLEtBQUgsQ0FBVXZRLEVBQVYsRUFBZXZuQixNQUFmLEdBQTBCLEdBQWpDLENBRUEsQ0FQRCxDQVNBLENBZFEsRUF0Q3lCLENBc0RsQzJ6RCxZQUFhLFNBQVcxdEQsTUFBWCxDQUFvQixDQUVoQyxHQUFLQSxTQUFXdEgsU0FBaEIsQ0FBNEIsQ0FFM0IyVyxRQUFRNlAsSUFBUixDQUFjLHVEQUFkLEVBQ0FsZixPQUFTLFdBQUEsRUFBVCxDQUVBLENBRUQsY0FBY21mLFVBQVAsQ0FBbUIsS0FBS3JpQixDQUF4QixDQUEyQixLQUFLRixDQUFoQyxFQUFvQ3FpQixHQUFwQyxDQUF5QyxLQUFLMWhCLENBQTlDLEVBQWtEbWlCLGNBQWxELENBQWtFLEVBQUksQ0FBdEUsQ0FBUCxDQUVBLENBakVpQyxDQW1FbENpdEMsVUFBVyxTQUFXM3NELE1BQVgsQ0FBb0IsQ0FFOUIsZ0JBQWdCMnNELFNBQVQsQ0FBb0IsS0FBSzd2RCxDQUF6QixDQUE0QixLQUFLRixDQUFqQyxDQUFvQyxLQUFLVyxDQUF6QyxDQUE0Q3lDLE1BQTVDLENBQVAsQ0FFQSxDQXZFaUMsQ0F5RWxDMnRELFNBQVUsU0FBVzN0RCxNQUFYLENBQW9CLENBRTdCLEdBQUtBLFNBQVd0SCxTQUFoQixDQUE0QixDQUUzQjJXLFFBQVE2UCxJQUFSLENBQWMsb0RBQWQsRUFDQWxmLE9BQVMsV0FBQSxFQUFULENBRUEsQ0FFRCxjQUFjbTlCLHFCQUFQLENBQThCLEtBQUtyZ0MsQ0FBbkMsQ0FBc0MsS0FBS0YsQ0FBM0MsQ0FBOEMsS0FBS1csQ0FBbkQsQ0FBUCxDQUVBLENBcEZpQyxDQXNGbENzdkQsYUFBYyxTQUFXN2xELEtBQVgsQ0FBa0JoSCxNQUFsQixDQUEyQixDQUV4QyxnQkFBZ0I2c0QsWUFBVCxDQUF1QjdsRCxLQUF2QixDQUE4QixLQUFLbEssQ0FBbkMsQ0FBc0MsS0FBS0YsQ0FBM0MsQ0FBOEMsS0FBS1csQ0FBbkQsQ0FBc0R5QyxNQUF0RCxDQUFQLENBRUEsQ0ExRmlDLENBNEZsQzY2QixjQUFlLFNBQVc3ekIsS0FBWCxDQUFtQixDQUVqQyxnQkFBZ0I2ekIsYUFBVCxDQUF3Qjd6QixLQUF4QixDQUErQixLQUFLbEssQ0FBcEMsQ0FBdUMsS0FBS0YsQ0FBNUMsQ0FBK0MsS0FBS1csQ0FBcEQsQ0FBUCxDQUVBLENBaEdpQyxDQWtHbEN5OUIsY0FBZSxTQUFXakIsR0FBWCxDQUFpQixDQUUvQixXQUFXeUIsa0JBQUosQ0FBd0IsSUFBeEIsQ0FBUCxDQUVBLENBdEdpQyxDQXdHbEMrdEIsb0JBQXFCLFVBQVksQ0FFaEMsVUFBWSxTQUFBLEVBQVosQ0FDQSxhQUFlLENBQUUsU0FBQSxFQUFGLENBQWUsU0FBQSxFQUFmLENBQTRCLFNBQUEsRUFBNUIsQ0FBZixDQUNBLG1CQUFxQixXQUFBLEVBQXJCLENBQ0EsaUJBQW1CLFdBQUEsRUFBbkIsQ0FFQSxtQ0FBTyxDQUE4QnZpRCxLQUE5QixDQUFxQ2hILE1BQXJDLENBQThDLENBRXBELEdBQUtBLFNBQVd0SCxTQUFoQixDQUE0QixDQUUzQjJXLFFBQVE2UCxJQUFSLENBQWMsK0RBQWQsRUFDQWxmLE9BQVMsV0FBQSxFQUFULENBRUEsQ0FFRCxnQkFBa0IwNEIsUUFBbEIsQ0FFQTtFQUVBNEMsTUFBTTZCLHFCQUFOLENBQTZCLEtBQUtyZ0MsQ0FBbEMsQ0FBcUMsS0FBS0YsQ0FBMUMsQ0FBNkMsS0FBS1csQ0FBbEQsRUFDQSs5QixNQUFNZ0MsWUFBTixDQUFvQnQyQixLQUFwQixDQUEyQjRtRCxjQUEzQixFQUVBO0VBRUEsR0FBSyxLQUFLL3lCLGFBQUwsQ0FBb0IreUIsY0FBcEIsSUFBeUMsSUFBOUMsQ0FBcUQ7RUFJcEQ1dEQsT0FBT2dmLElBQVAsQ0FBYTR1QyxjQUFiLEVBRUEsQ0FORCxJQU1PO0VBSU5DLFNBQVUsQ0FBVixFQUFjbmpELEdBQWQsQ0FBbUIsS0FBSzVOLENBQXhCLENBQTJCLEtBQUtGLENBQWhDLEVBQ0FpeEQsU0FBVSxDQUFWLEVBQWNuakQsR0FBZCxDQUFtQixLQUFLOU4sQ0FBeEIsQ0FBMkIsS0FBS1csQ0FBaEMsRUFDQXN3RCxTQUFVLENBQVYsRUFBY25qRCxHQUFkLENBQW1CLEtBQUtuTixDQUF4QixDQUEyQixLQUFLVCxDQUFoQyxFQUVBLElBQU0sTUFBUSxDQUFkLENBQWlCMUMsRUFBSXl6RCxTQUFTOXpELE1BQTlCLENBQXNDSyxHQUF0QyxDQUE2QyxDQUU1Q3l6RCxTQUFVenpELENBQVYsRUFBY212RCxtQkFBZCxDQUFtQ3FFLGNBQW5DLENBQW1ELElBQW5ELENBQXlEeHlCLFlBQXpELEVBRUEsYUFBZXd5QixlQUFlN3NDLGlCQUFmLENBQWtDcWEsWUFBbEMsQ0FBZixDQUVBLEdBQUs4RSxTQUFXNHRCLFdBQWhCLENBQThCLENBRTdCQSxZQUFjNXRCLFFBQWQsQ0FFQWxnQyxPQUFPZ2YsSUFBUCxDQUFhb2MsWUFBYixFQUVBLENBRUQsQ0FFRCxDQUVELGFBQUEsQ0FFQSxDQXBERCxDQXNEQSxDQTdEb0IsRUF4R2EsQ0F1S2xDNVosT0FBUSxTQUFXd2EsUUFBWCxDQUFzQixDQUU3QixnQkFBZ0JsL0IsQ0FBVCxDQUFXMGtCLE1BQVgsQ0FBbUIsS0FBSzFrQixDQUF4QixHQUErQmsvQixTQUFTcC9CLENBQVQsQ0FBVzRrQixNQUFYLENBQW1CLEtBQUs1a0IsQ0FBeEIsQ0FBL0IsRUFBOERvL0IsU0FBU3orQixDQUFULENBQVdpa0IsTUFBWCxDQUFtQixLQUFLamtCLENBQXhCLENBQXJFLENBRUEsQ0EzS2lDLENBQW5DLEVBK0tBOzs7OztLQU9BLGFBQUEsQ0FBZTg4QixRQUFmLENBQXlCZ2MsUUFBekIsQ0FBb0MsQ0FFbkN0RCxTQUFTLzlDLElBQVQsQ0FBZSxJQUFmLEVBRUEsS0FBS0QsSUFBTCxDQUFZLE1BQVosQ0FFQSxLQUFLc2xDLFFBQUwsQ0FBZ0JBLFdBQWEzaEMsU0FBYixDQUF5QjJoQyxRQUF6QixDQUFvQyxrQkFBQSxFQUFwRCxDQUNBLEtBQUtnYyxRQUFMLENBQWdCQSxXQUFhMzlDLFNBQWIsQ0FBeUIyOUMsUUFBekIsQ0FBb0MscUJBQUEsQ0FBdUIsQ0FBRS9OLE1BQU9yc0MsS0FBSzZGLE1BQUwsR0FBZ0IsUUFBekIsQ0FBdkIsQ0FBcEQsQ0FFQSxLQUFLaXNELFFBQUwsQ0FBZ0JDLGlCQUFoQixDQUVBLEtBQUtDLGtCQUFMLEdBRUEsQ0FFREMsS0FBSzU2RCxTQUFMLENBQWlCRCxPQUFPNG5CLE1BQVAsQ0FBZTVuQixPQUFPaUIsTUFBUCxDQUFleStDLFNBQVN6L0MsU0FBeEIsQ0FBZixDQUFvRCxDQUVwRXNDLFlBQWFzNEQsSUFGdUQsQ0FJcEUzUixPQUFRLElBSjRELENBTXBFNFIsWUFBYSxTQUFXcDNELEtBQVgsQ0FBbUIsQ0FFL0IsS0FBS2czRCxRQUFMLENBQWdCaDNELEtBQWhCLENBRUEsQ0FWbUUsQ0FZcEVpb0IsS0FBTSxTQUFXNWYsTUFBWCxDQUFvQixDQUV6QjJ6QyxTQUFTei9DLFNBQVQsQ0FBbUIwckIsSUFBbkIsQ0FBd0JocUIsSUFBeEIsQ0FBOEIsSUFBOUIsQ0FBb0NvSyxNQUFwQyxFQUVBLEtBQUsydUQsUUFBTCxDQUFnQjN1RCxPQUFPMnVELFFBQXZCLENBRUEsR0FBSzN1RCxPQUFPZ3ZELHFCQUFQLEdBQWlDMTFELFNBQXRDLENBQWtELENBRWpELEtBQUswMUQscUJBQUwsQ0FBNkJodkQsT0FBT2d2RCxxQkFBUCxDQUE2Qnp6RCxLQUE3QixFQUE3QixDQUVBLENBRUQsR0FBS3lFLE9BQU9pdkQscUJBQVAsR0FBaUMzMUQsU0FBdEMsQ0FBa0QsQ0FFakQsS0FBSzIxRCxxQkFBTCxDQUE2Qmg3RCxPQUFPNG5CLE1BQVAsQ0FBZSxFQUFmLENBQW1CN2IsT0FBT2l2RCxxQkFBMUIsQ0FBN0IsQ0FFQSxDQUVELFdBQUEsQ0FFQSxDQWhDbUUsQ0FrQ3BFSixtQkFBb0IsVUFBWSxDQUUvQixhQUFlLEtBQUs1ekIsUUFBcEIsQ0FDQSxLQUFBLENBQU9pMEIsRUFBUCxDQUFXbDRELElBQVgsQ0FFQSxHQUFLaWtDLFNBQVNJLGdCQUFkLENBQWlDLENBRWhDLG9CQUFzQkosU0FBUzhtQixlQUEvQixDQUNBLFNBQVc5dEQsT0FBT3NHLElBQVAsQ0FBYXduRCxlQUFiLENBQVgsQ0FFQSxHQUFLeG5ELEtBQUtJLE1BQUwsQ0FBYyxDQUFuQixDQUF1QixDQUV0QixtQkFBcUJvbkQsZ0JBQWlCeG5ELEtBQU0sQ0FBTixDQUFqQixDQUFyQixDQUVBLEdBQUt3cEQsaUJBQW1CenFELFNBQXhCLENBQW9DLENBRW5DLEtBQUswMUQscUJBQUwsQ0FBNkIsRUFBN0IsQ0FDQSxLQUFLQyxxQkFBTCxDQUE2QixFQUE3QixDQUVBLElBQU16eEMsRUFBSSxDQUFKLENBQU8weEMsR0FBS25MLGVBQWVwcEQsTUFBakMsQ0FBeUM2aUIsRUFBSTB4QyxFQUE3QyxDQUFpRDF4QyxHQUFqRCxDQUF3RCxDQUV2RHhtQixLQUFPK3NELGVBQWdCdm1DLENBQWhCLEVBQW9CeG1CLElBQXBCLEVBQTRCb0csT0FBUW9nQixDQUFSLENBQW5DLENBRUEsS0FBS3d4QyxxQkFBTCxDQUEyQjcwRCxJQUEzQixDQUFpQyxDQUFqQyxFQUNBLEtBQUs4MEQscUJBQUwsQ0FBNEJqNEQsSUFBNUIsRUFBcUN3bUIsQ0FBckMsQ0FFQSxDQUVELENBRUQsQ0FFRCxDQTNCRCxJQTJCTyxDQUVOLGlCQUFtQnlkLFNBQVNnZSxZQUE1QixDQUVBLEdBQUtBLGVBQWlCMy9DLFNBQWpCLEVBQThCMi9DLGFBQWF0K0MsTUFBYixDQUFzQixDQUF6RCxDQUE2RCxDQUU1RCxLQUFLcTBELHFCQUFMLENBQTZCLEVBQTdCLENBQ0EsS0FBS0MscUJBQUwsQ0FBNkIsRUFBN0IsQ0FFQSxJQUFNenhDLEVBQUksQ0FBSixDQUFPMHhDLEdBQUtqVyxhQUFhdCtDLE1BQS9CLENBQXVDNmlCLEVBQUkweEMsRUFBM0MsQ0FBK0MxeEMsR0FBL0MsQ0FBc0QsQ0FFckR4bUIsS0FBT2lpRCxhQUFjejdCLENBQWQsRUFBa0J4bUIsSUFBbEIsRUFBMEJvRyxPQUFRb2dCLENBQVIsQ0FBakMsQ0FFQSxLQUFLd3hDLHFCQUFMLENBQTJCNzBELElBQTNCLENBQWlDLENBQWpDLEVBQ0EsS0FBSzgwRCxxQkFBTCxDQUE0Qmo0RCxJQUE1QixFQUFxQ3dtQixDQUFyQyxDQUVBLENBRUQsQ0FFRCxDQUVELENBeEZtRSxDQTBGcEU2NEIsUUFBVyxVQUFZLENBRXRCLGtCQUFvQixXQUFBLEVBQXBCLENBQ0EsUUFBVSxPQUFBLEVBQVYsQ0FDQSxXQUFhLFVBQUEsRUFBYixDQUVBLE9BQVMsV0FBQSxFQUFULENBQ0EsT0FBUyxXQUFBLEVBQVQsQ0FDQSxPQUFTLFdBQUEsRUFBVCxDQUVBLFVBQVksV0FBQSxFQUFaLENBQ0EsVUFBWSxXQUFBLEVBQVosQ0FDQSxVQUFZLFdBQUEsRUFBWixDQUVBLFFBQVUsV0FBQSxFQUFWLENBQ0EsUUFBVSxXQUFBLEVBQVYsQ0FDQSxRQUFVLFdBQUEsRUFBVixDQUVBLGNBQWdCLFdBQUEsRUFBaEIsQ0FFQSxzQkFBd0IsV0FBQSxFQUF4QixDQUNBLDJCQUE2QixXQUFBLEVBQTdCLENBRUEsdUJBQUEsQ0FBeUJ6dUMsS0FBekIsQ0FBZ0M4MEIsRUFBaEMsQ0FBb0NDLEVBQXBDLENBQXdDdUMsRUFBeEMsQ0FBNENpd0IsR0FBNUMsQ0FBaUQvVSxHQUFqRCxDQUFzRGdWLEdBQXRELENBQTRELENBRTNEOUIsU0FBU0csWUFBVCxDQUF1QjdsRCxLQUF2QixDQUE4QjgwQixFQUE5QixDQUFrQ0MsRUFBbEMsQ0FBc0N1QyxFQUF0QyxDQUEwQ213QixTQUExQyxFQUVBRixJQUFJN3VDLGNBQUosQ0FBb0IrdUMsVUFBVTloRCxDQUE5QixFQUNBNnNDLElBQUk5NUIsY0FBSixDQUFvQit1QyxVQUFVdHhDLENBQTlCLEVBQ0FxeEMsSUFBSTl1QyxjQUFKLENBQW9CK3VDLFVBQVV6cUMsQ0FBOUIsRUFFQXVxQyxJQUFJdHZDLEdBQUosQ0FBU3U2QixHQUFULEVBQWV2NkIsR0FBZixDQUFvQnV2QyxHQUFwQixFQUVBLFdBQVd6dkMsS0FBSixFQUFQLENBRUEsQ0FFRCwwQkFBQSxDQUE0Qm5sQixNQUE1QixDQUFvQ3k4QyxRQUFwQyxDQUE4Q3FZLFNBQTlDLENBQXlEdEYsR0FBekQsQ0FBOEQzRyxFQUE5RCxDQUFrRUYsRUFBbEUsQ0FBc0VDLEVBQXRFLENBQTBFeDdDLEtBQTFFLENBQWtGLENBRWpGLGFBQUEsQ0FFQSxHQUFLcXZDLFNBQVM2TyxJQUFULEdBQWtCeUosUUFBdkIsQ0FBa0MsQ0FFakNueUIsVUFBWTRzQixJQUFJc0MsaUJBQUosQ0FBdUJsSixFQUF2QixDQUEyQkQsRUFBM0IsQ0FBK0JFLEVBQS9CLENBQW1DLElBQW5DLENBQXlDejdDLEtBQXpDLENBQVosQ0FFQSxDQUpELElBSU8sQ0FFTncxQixVQUFZNHNCLElBQUlzQyxpQkFBSixDQUF1QmpKLEVBQXZCLENBQTJCRixFQUEzQixDQUErQkMsRUFBL0IsQ0FBbUNuTSxTQUFTNk8sSUFBVCxHQUFrQjBKLFVBQXJELENBQWlFNW5ELEtBQWpFLENBQVosQ0FFQSxDQUVELEdBQUt3MUIsWUFBYyxJQUFuQixDQUEwQixXQUFBLENBRTFCcXlCLHVCQUF1Qjd2QyxJQUF2QixDQUE2QmhZLEtBQTdCLEVBQ0E2bkQsdUJBQXVCN2xDLFlBQXZCLENBQXFDcHZCLE9BQU84M0IsV0FBNUMsRUFFQSxhQUFlZzlCLFVBQVV0RixHQUFWLENBQWNGLE1BQWQsQ0FBcUJwb0MsVUFBckIsQ0FBaUMrdEMsc0JBQWpDLENBQWYsQ0FFQSxHQUFLM3VCLFNBQVd3dUIsVUFBVXppQyxJQUFyQixFQUE2QmlVLFNBQVd3dUIsVUFBVXhpQyxHQUF2RCxDQUE2RCxXQUFBLENBRTdELE9BQU8sQ0FDTmdVLFNBQVVBLFFBREosQ0FFTmw1QixNQUFPNm5ELHVCQUF1Qjl2QyxLQUF2QixFQUZELENBR05ubEIsT0FBUUEsTUFIRixDQUFQLENBTUEsQ0FFRCx3Q0FBQSxDQUEwQ0EsTUFBMUMsQ0FBa0Q4MEQsU0FBbEQsQ0FBNkR0RixHQUE3RCxDQUFrRXArQixRQUFsRSxDQUE0RStMLEVBQTVFLENBQWdGajZCLENBQWhGLENBQW1GRixDQUFuRixDQUFzRlcsQ0FBdEYsQ0FBMEYsQ0FFekZtOUMsR0FBRzk0QixtQkFBSCxDQUF3Qm9KLFFBQXhCLENBQWtDbHVCLENBQWxDLEVBQ0EyOUMsR0FBRzc0QixtQkFBSCxDQUF3Qm9KLFFBQXhCLENBQWtDcHVCLENBQWxDLEVBQ0E0OUMsR0FBRzU0QixtQkFBSCxDQUF3Qm9KLFFBQXhCLENBQWtDenRCLENBQWxDLEVBRUEsaUJBQW1CdXhELGtCQUFtQmwxRCxNQUFuQixDQUEyQkEsT0FBT3k4QyxRQUFsQyxDQUE0Q3FZLFNBQTVDLENBQXVEdEYsR0FBdkQsQ0FBNEQxTyxFQUE1RCxDQUFnRUQsRUFBaEUsQ0FBb0VELEVBQXBFLENBQXdFdVUsaUJBQXhFLENBQW5CLENBRUEsR0FBS0MsWUFBTCxDQUFvQixDQUVuQixHQUFLajRCLEVBQUwsQ0FBVSxDQUVUazRCLElBQUlydEMsbUJBQUosQ0FBeUJtVixFQUF6QixDQUE2Qmo2QixDQUE3QixFQUNBb3lELElBQUl0dEMsbUJBQUosQ0FBeUJtVixFQUF6QixDQUE2Qm42QixDQUE3QixFQUNBdXlELElBQUl2dEMsbUJBQUosQ0FBeUJtVixFQUF6QixDQUE2Qng1QixDQUE3QixFQUVBeXhELGFBQWFqNEIsRUFBYixDQUFrQnE0QixlQUFnQkwsaUJBQWhCLENBQW1DclUsRUFBbkMsQ0FBdUNELEVBQXZDLENBQTJDRCxFQUEzQyxDQUErQ3lVLEdBQS9DLENBQW9EQyxHQUFwRCxDQUF5REMsR0FBekQsQ0FBbEIsQ0FFQSxDQUVELFNBQVcsU0FBQSxDQUFXcnlELENBQVgsQ0FBY0YsQ0FBZCxDQUFpQlcsQ0FBakIsQ0FBWCxDQUNBbXZELFNBQVNDLFNBQVQsQ0FBb0JqUyxFQUFwQixDQUF3QkQsRUFBeEIsQ0FBNEJELEVBQTVCLENBQWdDcEIsS0FBSzVtQixNQUFyQyxFQUVBdzhCLGFBQWE1VixJQUFiLENBQW9CQSxJQUFwQixDQUNBNFYsYUFBYUssU0FBYixDQUF5QnZ5RCxDQUF6QixDQUVBLENBRUQsbUJBQUEsQ0FFQSxDQUVELHVCQUFPLENBQWtCNHhELFNBQWxCLENBQTZCWSxVQUE3QixDQUEwQyxDQUVoRCxhQUFlLEtBQUtqMUIsUUFBcEIsQ0FDQSxhQUFlLEtBQUtnYyxRQUFwQixDQUNBLGdCQUFrQixLQUFLM2tCLFdBQXZCLENBRUEsR0FBSzJrQixXQUFhMzlDLFNBQWxCLENBQThCLE9BRTlCO0VBRUEsR0FBSzJoQyxTQUFTeUYsY0FBVCxHQUE0QixJQUFqQyxDQUF3Q3pGLFNBQVMwRixxQkFBVCxHQUV4QzdFLE9BQU9sYyxJQUFQLENBQWFxYixTQUFTeUYsY0FBdEIsRUFDQTVFLE9BQU9sUyxZQUFQLENBQXFCMEksV0FBckIsRUFFQSxHQUFLZzlCLFVBQVV0RixHQUFWLENBQWNudUIsZ0JBQWQsQ0FBZ0NDLE1BQWhDLElBQTZDLEtBQWxELENBQTBELE9BRTFEO0VBRUFxMEIsY0FBY2ptQyxVQUFkLENBQTBCb0ksV0FBMUIsRUFDQTAzQixJQUFJcHFDLElBQUosQ0FBVTB2QyxVQUFVdEYsR0FBcEIsRUFBMEJwZ0MsWUFBMUIsQ0FBd0N1bUMsYUFBeEMsRUFFQTtFQUVBLEdBQUtsMUIsU0FBU3FlLFdBQVQsR0FBeUIsSUFBOUIsQ0FBcUMsQ0FFcEMsR0FBSzBRLElBQUlwdUIsYUFBSixDQUFtQlgsU0FBU3FlLFdBQTVCLElBQThDLEtBQW5ELENBQTJELE9BRTNELENBRUQsZ0JBQUEsQ0FFQSxHQUFLcmUsU0FBU0ksZ0JBQWQsQ0FBaUMsQ0FFaEMsS0FBQSxDQUFPNzlCLENBQVAsQ0FBVVcsQ0FBVixDQUNBLFVBQVk4OEIsU0FBU3I1QixLQUFyQixDQUNBLGFBQWVxNUIsU0FBU0ssVUFBVCxDQUFvQjFQLFFBQW5DLENBQ0EsT0FBU3FQLFNBQVNLLFVBQVQsQ0FBb0IzRCxFQUE3QixDQUNBLEtBQUEsQ0FBT2w2QixDQUFQLENBRUEsR0FBS21FLFFBQVUsSUFBZixDQUFzQjtFQUlyQixJQUFNNUcsRUFBSSxDQUFKLENBQU95QyxFQUFJbUUsTUFBTThuQixLQUF2QixDQUE4QjF1QixFQUFJeUMsQ0FBbEMsQ0FBcUN6QyxHQUFLLENBQTFDLENBQThDLENBRTdDMEMsRUFBSWtFLE1BQU04Z0IsSUFBTixDQUFZMW5CLENBQVosQ0FBSixDQUNBd0MsRUFBSW9FLE1BQU04Z0IsSUFBTixDQUFZMW5CLEVBQUksQ0FBaEIsQ0FBSixDQUNBbUQsRUFBSXlELE1BQU04Z0IsSUFBTixDQUFZMW5CLEVBQUksQ0FBaEIsQ0FBSixDQUVBNDBELGFBQWVRLGdDQUFpQyxJQUFqQyxDQUF1Q2QsU0FBdkMsQ0FBa0R0RixHQUFsRCxDQUF1RHArQixRQUF2RCxDQUFpRStMLEVBQWpFLENBQXFFajZCLENBQXJFLENBQXdFRixDQUF4RSxDQUEyRVcsQ0FBM0UsQ0FBZixDQUVBLEdBQUt5eEQsWUFBTCxDQUFvQixDQUVuQkEsYUFBYUssU0FBYixDQUF5QnB6RCxLQUFLRSxLQUFMLENBQVkvQixFQUFJLENBQWhCLENBQXpCLENBQThDO0VBQzlDazFELFdBQVcvMUQsSUFBWCxDQUFpQnkxRCxZQUFqQixFQUVBLENBRUQsQ0FFRCxDQXJCRCxRQXFCWWhrQyxXQUFhdHlCLFNBQWxCLENBQThCO0VBSXBDLElBQU0wQixFQUFJLENBQUosQ0FBT3lDLEVBQUltdUIsU0FBU2xDLEtBQTFCLENBQWlDMXVCLEVBQUl5QyxDQUFyQyxDQUF3Q3pDLEdBQUssQ0FBN0MsQ0FBaUQsQ0FFaEQwQyxFQUFJMUMsQ0FBSixDQUNBd0MsRUFBSXhDLEVBQUksQ0FBUixDQUNBbUQsRUFBSW5ELEVBQUksQ0FBUixDQUVBNDBELGFBQWVRLGdDQUFpQyxJQUFqQyxDQUF1Q2QsU0FBdkMsQ0FBa0R0RixHQUFsRCxDQUF1RHArQixRQUF2RCxDQUFpRStMLEVBQWpFLENBQXFFajZCLENBQXJFLENBQXdFRixDQUF4RSxDQUEyRVcsQ0FBM0UsQ0FBZixDQUVBLEdBQUt5eEQsWUFBTCxDQUFvQk0sV0FBVy8xRCxJQUFYLENBQWlCeTFELFlBQWpCLEVBRXBCLENBRUQsQ0FFRCxDQS9DRCxRQStDWTMwQixTQUFTQyxVQUFkLENBQTJCLENBRWpDLE9BQUEsQ0FBU20xQixHQUFULENBQWNDLEdBQWQsQ0FDQSxvQkFBc0J4b0QsTUFBTXlNLE9BQU4sQ0FBZTBpQyxRQUFmLENBQXRCLENBRUEsYUFBZWhjLFNBQVNFLFFBQXhCLENBQ0EsVUFBWUYsU0FBUzhkLEtBQXJCLENBQ0EsT0FBQSxDQUVBLGtCQUFvQjlkLFNBQVMrZCxhQUFULENBQXdCLENBQXhCLENBQXBCLENBQ0EsR0FBS0EsY0FBY3IrQyxNQUFkLENBQXVCLENBQTVCLENBQWdDOC9DLElBQU16QixhQUFOLENBRWhDLElBQU0sTUFBUSxDQUFSLENBQVdrQyxHQUFLbkMsTUFBTXArQyxNQUE1QixDQUFvQytFLEVBQUl3N0MsRUFBeEMsQ0FBNEN4N0MsR0FBNUMsQ0FBbUQsQ0FFbEQsU0FBV3E1QyxNQUFPcjVDLENBQVAsQ0FBWCxDQUNBLGlCQUFtQjZ3RCxnQkFBa0J0WixTQUFVK0MsS0FBS3ZCLGFBQWYsQ0FBbEIsQ0FBbUR4QixRQUF0RSxDQUVBLEdBQUt1WixlQUFpQmwzRCxTQUF0QixDQUFrQyxTQUVsQ20zRCxJQUFNdDFCLFNBQVU2ZSxLQUFLdDhDLENBQWYsQ0FBTixDQUNBMnlELElBQU1sMUIsU0FBVTZlLEtBQUt4OEMsQ0FBZixDQUFOLENBQ0E4eUQsSUFBTW4xQixTQUFVNmUsS0FBSzc3QyxDQUFmLENBQU4sQ0FFQSxHQUFLcXlELGFBQWF2WCxZQUFiLEdBQThCLElBQW5DLENBQTBDLENBRXpDLGlCQUFtQmhlLFNBQVNnZSxZQUE1QixDQUNBLG9CQUFzQixLQUFLK1YscUJBQTNCLENBRUExVCxHQUFHaHdDLEdBQUgsQ0FBUSxDQUFSLENBQVcsQ0FBWCxDQUFjLENBQWQsRUFDQSt2QyxHQUFHL3ZDLEdBQUgsQ0FBUSxDQUFSLENBQVcsQ0FBWCxDQUFjLENBQWQsRUFDQTh2QyxHQUFHOXZDLEdBQUgsQ0FBUSxDQUFSLENBQVcsQ0FBWCxDQUFjLENBQWQsRUFFQSxJQUFNLE1BQVEsQ0FBUixDQUFXb2xELEdBQUt6WCxhQUFhdCtDLE1BQW5DLENBQTJDcWpCLEVBQUkweUMsRUFBL0MsQ0FBbUQxeUMsR0FBbkQsQ0FBMEQsQ0FFekQsY0FBZ0IyeUMsZ0JBQWlCM3lDLENBQWpCLENBQWhCLENBRUEsR0FBSzR5QyxZQUFjLENBQW5CLENBQXVCLFNBRXZCLFlBQWMzWCxhQUFjajdCLENBQWQsRUFBa0JtZCxRQUFoQyxDQUVBbWdCLEdBQUdyN0IsZUFBSCxDQUFvQjR3QyxNQUFNMXdDLFVBQU4sQ0FBa0Iyd0MsUUFBUzlXLEtBQUt0OEMsQ0FBZCxDQUFsQixDQUFxQyt5RCxHQUFyQyxDQUFwQixDQUFnRUcsU0FBaEUsRUFDQXZWLEdBQUdwN0IsZUFBSCxDQUFvQjh3QyxNQUFNNXdDLFVBQU4sQ0FBa0Iyd0MsUUFBUzlXLEtBQUt4OEMsQ0FBZCxDQUFsQixDQUFxQzZ5RCxHQUFyQyxDQUFwQixDQUFnRU8sU0FBaEUsRUFDQXhWLEdBQUduN0IsZUFBSCxDQUFvQit3QyxNQUFNN3dDLFVBQU4sQ0FBa0Iyd0MsUUFBUzlXLEtBQUs3N0MsQ0FBZCxDQUFsQixDQUFxQ215RCxHQUFyQyxDQUFwQixDQUFnRU0sU0FBaEUsRUFFQSxDQUVEdFYsR0FBR3o3QixHQUFILENBQVE0d0MsR0FBUixFQUNBcFYsR0FBR3g3QixHQUFILENBQVF3d0MsR0FBUixFQUNBalYsR0FBR3Y3QixHQUFILENBQVF5d0MsR0FBUixFQUVBRyxJQUFNblYsRUFBTixDQUNBK1UsSUFBTWhWLEVBQU4sQ0FDQWlWLElBQU1sVixFQUFOLENBRUEsQ0FFRHdVLGFBQWVGLGtCQUFtQixJQUFuQixDQUF5QmMsWUFBekIsQ0FBdUNsQixTQUF2QyxDQUFrRHRGLEdBQWxELENBQXVEeUcsR0FBdkQsQ0FBNERKLEdBQTVELENBQWlFQyxHQUFqRSxDQUFzRVgsaUJBQXRFLENBQWYsQ0FFQSxHQUFLQyxZQUFMLENBQW9CLENBRW5CLEdBQUtuVixLQUFPQSxJQUFLLzZDLENBQUwsQ0FBWixDQUF1QixDQUV0QixVQUFZKzZDLElBQUsvNkMsQ0FBTCxDQUFaLENBQ0Ftd0QsSUFBSWp3QyxJQUFKLENBQVVxeEMsTUFBTyxDQUFQLENBQVYsRUFDQW5CLElBQUlsd0MsSUFBSixDQUFVcXhDLE1BQU8sQ0FBUCxDQUFWLEVBQ0FsQixJQUFJbndDLElBQUosQ0FBVXF4QyxNQUFPLENBQVAsQ0FBVixFQUVBckIsYUFBYWo0QixFQUFiLENBQWtCcTRCLGVBQWdCTCxpQkFBaEIsQ0FBbUNjLEdBQW5DLENBQXdDSixHQUF4QyxDQUE2Q0MsR0FBN0MsQ0FBa0RULEdBQWxELENBQXVEQyxHQUF2RCxDQUE0REMsR0FBNUQsQ0FBbEIsQ0FFQSxDQUVESCxhQUFhNVYsSUFBYixDQUFvQkEsSUFBcEIsQ0FDQTRWLGFBQWFLLFNBQWIsQ0FBeUJ2d0QsQ0FBekIsQ0FDQXd3RCxXQUFXLzFELElBQVgsQ0FBaUJ5MUQsWUFBakIsRUFFQSxDQUVELENBRUQsQ0FFRCxDQWhLRCxDQWtLQSxDQXRRVSxFQTFGeUQsQ0FrV3BFandDLE1BQU8sVUFBWSxDQUVsQixnQkFBZ0JucEIsV0FBVCxDQUFzQixLQUFLeWtDLFFBQTNCLENBQXFDLEtBQUtnYyxRQUExQyxFQUFxRHIzQixJQUFyRCxDQUEyRCxJQUEzRCxDQUFQLENBRUEsQ0F0V21FLENBQXBELENBQWpCLENBMFdBOztLQUlBLHdCQUFBLENBQTBCc3hDLFFBQTFCLENBQW9DeDRELEtBQXBDLENBQTJDKzlDLFVBQTNDLENBQXVEaVIsa0JBQXZELENBQTRFLENBRTNFLGVBQWlCLFNBQUEsQ0FBVyxRQUFYLENBQWpCLENBQ0EsZUFBaUIsQ0FBakIsQ0FFQSxlQUFBLENBQWlCeUosU0FBakIsQ0FDQSxXQUFBLENBRUEsZUFBQSxDQUFpQkMsVUFBakIsQ0FBNkJDLEtBQTdCLENBQW9Dai9CLE1BQXBDLENBQTRDay9CLFVBQTVDLENBQXlELENBRXhELGVBQWlCRCxNQUFNRSxVQUF2QixDQUVBLEdBQUtBLGFBQWUsSUFBcEIsQ0FBMkIsQ0FFMUJDLFNBQVVDLFVBQVYsQ0FBc0JDLFVBQXRCLEVBRUEsQ0FKRCxRQUlZSCxZQUFjQSxXQUFXL29CLE9BQTlCLENBQXdDLENBRTlDZ3BCLFNBQVVELFVBQVYsQ0FBc0IsQ0FBdEIsRUFDQUQsV0FBYSxJQUFiLENBRUEsQ0FFRCxHQUFLSixTQUFTUyxTQUFULEVBQXNCTCxVQUEzQixDQUF3QyxDQUV2Q0osU0FBUzNsRCxLQUFULENBQWdCMmxELFNBQVNVLGNBQXpCLENBQXlDVixTQUFTVyxjQUFsRCxDQUFrRVgsU0FBU1ksZ0JBQTNFLEVBRUEsQ0FFRCxHQUFLUCxZQUFjQSxXQUFXUSxhQUE5QixDQUE4QyxDQUU3QyxHQUFLQyxVQUFZMTRELFNBQWpCLENBQTZCLENBRTVCMDRELFFBQVUsUUFBQSxDQUNULHFCQUFBLENBQXVCLENBQXZCLENBQTBCLENBQTFCLENBQTZCLENBQTdCLENBRFMsQ0FFVCxrQkFBQSxDQUFvQixDQUNuQjlwQixTQUFVc0ksVUFBVVQsSUFBVixDQUFlN0gsUUFETixDQUVuQjZHLGFBQWN5QixVQUFVVCxJQUFWLENBQWVoQixZQUZWLENBR25CRSxlQUFnQnVCLFVBQVVULElBQVYsQ0FBZWQsY0FIWixDQUluQjZXLEtBQU15SixRQUphLENBS25CekksVUFBVyxJQUxRLENBTW5CQyxXQUFZLEtBTk8sQ0FPbkJqYSxJQUFLLEtBUGMsQ0FBcEIsQ0FGUyxDQUFWLENBYUFrbEIsUUFBUS8yQixRQUFSLENBQWlCc25CLGVBQWpCLENBQWtDLFFBQWxDLEVBQ0F5UCxRQUFRLzJCLFFBQVIsQ0FBaUJzbkIsZUFBakIsQ0FBa0MsSUFBbEMsRUFFQXlQLFFBQVF2ZCxjQUFSLENBQXlCLFNBQVd5YyxRQUFYLENBQXFCRyxLQUFyQixDQUE0QmovQixNQUE1QixDQUFxQyxDQUU3RCxLQUFLRSxXQUFMLENBQWlCak8sWUFBakIsQ0FBK0IrTixPQUFPRSxXQUF0QyxFQUVBLENBSkQsQ0FNQW1rQixXQUFXOW5CLE1BQVgsQ0FBbUJxakMsUUFBUS8yQixRQUEzQixFQUVBLENBRUQrMkIsUUFBUS9hLFFBQVIsQ0FBaUIvTyxRQUFqQixDQUEwQjhILEtBQTFCLENBQWdDcjRDLEtBQWhDLENBQXdDNDVELFVBQXhDLENBRUFILFdBQVdqM0QsSUFBWCxDQUFpQjYzRCxPQUFqQixDQUEwQkEsUUFBUS8yQixRQUFsQyxDQUE0QysyQixRQUFRL2EsUUFBcEQsQ0FBOEQsQ0FBOUQsQ0FBaUUsSUFBakUsRUFFQSxDQWxDRCxRQWtDWXNhLFlBQWNBLFdBQVcvNkIsU0FBOUIsQ0FBMEMsQ0FFaEQsR0FBS3k3QixjQUFnQjM0RCxTQUFyQixDQUFpQyxDQUVoQzI0RCxZQUFjLHNCQUFBLENBQXdCLENBQUUsQ0FBMUIsQ0FBNkIsQ0FBN0IsQ0FBZ0MsQ0FBaEMsQ0FBbUMsQ0FBRSxDQUFyQyxDQUF3QyxDQUF4QyxDQUEyQyxDQUEzQyxDQUFkLENBRUFkLFVBQVksUUFBQSxDQUNYLHVCQUFBLENBQXlCLENBQXpCLENBQTRCLENBQTVCLENBRFcsQ0FFWCxxQkFBQSxDQUF1QixDQUFFckssVUFBVyxLQUFiLENBQW9CQyxXQUFZLEtBQWhDLENBQXVDamEsSUFBSyxLQUE1QyxDQUF2QixDQUZXLENBQVosQ0FLQTJKLFdBQVc5bkIsTUFBWCxDQUFtQndpQyxVQUFVbDJCLFFBQTdCLEVBRUEsQ0FFRGsyQixVQUFVbGEsUUFBVixDQUFtQnRNLEdBQW5CLENBQXlCNG1CLFVBQXpCLENBRUE7RUFFQUwsU0FBU2dCLGtCQUFULENBQTZCRCxXQUE3QixDQUEwQyxJQUExQyxDQUFnRGQsVUFBVWwyQixRQUExRCxDQUFvRWsyQixVQUFVbGEsUUFBOUUsQ0FBd0ZrYSxTQUF4RixDQUFtRyxJQUFuRyxFQUVBLENBRUQsQ0FFRCxpQkFBQSxDQUFtQmpvQixLQUFuQixDQUEwQmxuQixLQUExQixDQUFrQyxDQUVqQ3RwQixNQUFNMDVDLE9BQU4sQ0FBY2xKLEtBQWQsQ0FBb0Jzb0IsUUFBcEIsQ0FBOEJ0b0IsTUFBTXozQixDQUFwQyxDQUF1Q3kzQixNQUFNNXNDLENBQTdDLENBQWdENHNDLE1BQU0xckMsQ0FBdEQsQ0FBeUR3a0IsS0FBekQsQ0FBZ0UwbEMsa0JBQWhFLEVBRUEsQ0FFRCxPQUFPLENBRU55SyxjQUFlLFVBQVksQ0FFMUIsaUJBQUEsQ0FFQSxDQU5LLENBT05DLGNBQWUsU0FBV2xwQixLQUFYLENBQWtCbG5CLEtBQWxCLENBQTBCLENBRXhDeXZDLFdBQVdubUQsR0FBWCxDQUFnQjQ5QixLQUFoQixFQUNBd29CLFdBQWExdkMsUUFBVTFvQixTQUFWLENBQXNCMG9CLEtBQXRCLENBQThCLENBQTNDLENBQ0F3dkMsU0FBVUMsVUFBVixDQUFzQkMsVUFBdEIsRUFFQSxDQWJLLENBY05XLGNBQWUsVUFBWSxDQUUxQixpQkFBQSxDQUVBLENBbEJLLENBbUJOQyxjQUFlLFNBQVd0d0MsS0FBWCxDQUFtQixDQUVqQzB2QyxXQUFhMXZDLEtBQWIsQ0FDQXd2QyxTQUFVQyxVQUFWLENBQXNCQyxVQUF0QixFQUVBLENBeEJLLENBeUJOYSxPQUFRQSxNQXpCRixDQUFQLENBNkJBLENBRUQ7O0tBSUEsNEJBQUEsQ0FBOEIzaEIsRUFBOUIsQ0FBa0N4MkIsVUFBbEMsQ0FBOEM1Z0IsSUFBOUMsQ0FBcUQsQ0FFcEQsUUFBQSxDQUVBLGdCQUFBLENBQWtCN0IsS0FBbEIsQ0FBMEIsQ0FFekI0SyxLQUFPNUssS0FBUCxDQUVBLENBRUQsZUFBQSxDQUFpQjZtQyxLQUFqQixDQUF3QjlVLEtBQXhCLENBQWdDLENBRS9Ca25CLEdBQUc0aEIsVUFBSCxDQUFlandELElBQWYsQ0FBcUJpOEIsS0FBckIsQ0FBNEI5VSxLQUE1QixFQUVBbHdCLEtBQUttMUIsTUFBTCxDQUFhakYsS0FBYixDQUFvQm5uQixJQUFwQixFQUVBLENBRUQsd0JBQUEsQ0FBMEIwNEIsUUFBMUIsQ0FBb0N1RCxLQUFwQyxDQUEyQzlVLEtBQTNDLENBQW1ELENBRWxELGNBQWdCdFAsV0FBVzFiLEdBQVgsQ0FBZ0Isd0JBQWhCLENBQWhCLENBRUEsR0FBSzZiLFlBQWMsSUFBbkIsQ0FBMEIsQ0FFekJ0SyxRQUFRTSxLQUFSLENBQWUsZ0lBQWYsRUFDQSxPQUVBLENBRUQsYUFBZTBxQixTQUFTSyxVQUFULENBQW9CMVAsUUFBbkMsQ0FFQSxHQUFLQSxTQUFTdW1CLDRCQUFkLENBQTZDLENBRTVDem9CLE1BQVFrQyxTQUFTdmhCLElBQVQsQ0FBY3FmLEtBQXRCLENBRUFuUCxVQUFVazRDLHdCQUFWLENBQW9DbHdELElBQXBDLENBQTBDLENBQTFDLENBQTZDbW5CLEtBQTdDLENBQW9EdVIsU0FBU3kzQixpQkFBN0QsRUFFQSxDQU5ELElBTU8sQ0FFTm40QyxVQUFVazRDLHdCQUFWLENBQW9DbHdELElBQXBDLENBQTBDaThCLEtBQTFDLENBQWlEOVUsS0FBakQsQ0FBd0R1UixTQUFTeTNCLGlCQUFqRSxFQUVBLENBRURsNUQsS0FBS20xQixNQUFMLENBQWFqRixLQUFiLENBQW9Cbm5CLElBQXBCLENBQTBCMDRCLFNBQVN5M0IsaUJBQW5DLEVBRUEsQ0FFRDtFQUVBLEtBQUtDLE9BQUwsQ0FBZUEsT0FBZixDQUNBLEtBQUtKLE1BQUwsQ0FBY0EsTUFBZCxDQUNBLEtBQUtLLGVBQUwsQ0FBdUJBLGVBQXZCLENBRUEsQ0FFRDs7S0FJQSwwQkFBQSxDQUE0QmhpQixFQUE1QixDQUFnQ3gyQixVQUFoQyxDQUE0QzI4QixVQUE1QyxDQUF5RCxDQUV4RCxpQkFBQSxDQUVBLHlCQUFBLEVBQTRCLENBRTNCLEdBQUs4YixnQkFBa0J2NUQsU0FBdkIsQ0FBbUMsb0JBQUEsQ0FFbkMsY0FBZ0I4Z0IsV0FBVzFiLEdBQVgsQ0FBZ0IsZ0NBQWhCLENBQWhCLENBRUEsR0FBSzZiLFlBQWMsSUFBbkIsQ0FBMEIsQ0FFekJzNEMsY0FBZ0JqaUIsR0FBR2pWLFlBQUgsQ0FBaUJwaEIsVUFBVXU0Qyw4QkFBM0IsQ0FBaEIsQ0FFQSxDQUpELElBSU8sQ0FFTkQsY0FBZ0IsQ0FBaEIsQ0FFQSxDQUVELG9CQUFBLENBRUEsQ0FFRCx3QkFBQSxDQUEwQnRWLFNBQTFCLENBQXNDLENBRXJDLEdBQUtBLFlBQWMsT0FBbkIsQ0FBNkIsQ0FFNUIsR0FBSzNNLEdBQUdtaUIsd0JBQUgsQ0FBNkJuaUIsR0FBR29pQixhQUFoQyxDQUErQ3BpQixHQUFHcWlCLFVBQWxELEVBQStEMVYsU0FBL0QsQ0FBMkUsQ0FBM0UsRUFDQTNNLEdBQUdtaUIsd0JBQUgsQ0FBNkJuaUIsR0FBR3NpQixlQUFoQyxDQUFpRHRpQixHQUFHcWlCLFVBQXBELEVBQWlFMVYsU0FBakUsQ0FBNkUsQ0FEbEYsQ0FDc0YsQ0FFckYsT0FBTyxPQUFQLENBRUEsQ0FFREEsVUFBWSxTQUFaLENBRUEsQ0FFRCxHQUFLQSxZQUFjLFNBQW5CLENBQStCLENBRTlCLEdBQUszTSxHQUFHbWlCLHdCQUFILENBQTZCbmlCLEdBQUdvaUIsYUFBaEMsQ0FBK0NwaUIsR0FBR3VpQixZQUFsRCxFQUFpRTVWLFNBQWpFLENBQTZFLENBQTdFLEVBQ0EzTSxHQUFHbWlCLHdCQUFILENBQTZCbmlCLEdBQUdzaUIsZUFBaEMsQ0FBaUR0aUIsR0FBR3VpQixZQUFwRCxFQUFtRTVWLFNBQW5FLENBQStFLENBRHBGLENBQ3dGLENBRXZGLE9BQU8sU0FBUCxDQUVBLENBRUQsQ0FFRCxPQUFPLE1BQVAsQ0FFQSxDQUVELGNBQWdCeEcsV0FBV3dHLFNBQVgsR0FBeUJqa0QsU0FBekIsQ0FBcUN5OUMsV0FBV3dHLFNBQWhELENBQTRELE9BQTVFLENBQ0EsaUJBQW1CNlYsZ0JBQWlCN1YsU0FBakIsQ0FBbkIsQ0FFQSxHQUFLOFYsZUFBaUI5VixTQUF0QixDQUFrQyxDQUVqQ3R0QyxRQUFRNlAsSUFBUixDQUFjLHNCQUFkLENBQXNDeTlCLFNBQXRDLENBQWlELHNCQUFqRCxDQUF5RThWLFlBQXpFLENBQXVGLFVBQXZGLEVBQ0E5VixVQUFZOFYsWUFBWixDQUVBLENBRUQsMkJBQTZCdGMsV0FBV3VjLHNCQUFYLEdBQXNDLElBQW5FLENBRUEsZ0JBQWtCMWlCLEdBQUdqVixZQUFILENBQWlCaVYsR0FBRzJpQix1QkFBcEIsQ0FBbEIsQ0FDQSxzQkFBd0IzaUIsR0FBR2pWLFlBQUgsQ0FBaUJpVixHQUFHNGlCLDhCQUFwQixDQUF4QixDQUNBLG1CQUFxQjVpQixHQUFHalYsWUFBSCxDQUFpQmlWLEdBQUc2aUIsZ0JBQXBCLENBQXJCLENBQ0EsbUJBQXFCN2lCLEdBQUdqVixZQUFILENBQWlCaVYsR0FBRzhpQix5QkFBcEIsQ0FBckIsQ0FFQSxrQkFBb0I5aUIsR0FBR2pWLFlBQUgsQ0FBaUJpVixHQUFHK2lCLGtCQUFwQixDQUFwQixDQUNBLHNCQUF3Qi9pQixHQUFHalYsWUFBSCxDQUFpQmlWLEdBQUdnakIsMEJBQXBCLENBQXhCLENBQ0EsZ0JBQWtCaGpCLEdBQUdqVixZQUFILENBQWlCaVYsR0FBR2lqQixtQkFBcEIsQ0FBbEIsQ0FDQSx3QkFBMEJqakIsR0FBR2pWLFlBQUgsQ0FBaUJpVixHQUFHa2pCLDRCQUFwQixDQUExQixDQUVBLG1CQUFxQkMsa0JBQW9CLENBQXpDLENBQ0EsMEJBQTRCLENBQUMsQ0FBRTM1QyxXQUFXMWIsR0FBWCxDQUFnQixtQkFBaEIsQ0FBL0IsQ0FDQSx3QkFBMEJzMUQsZ0JBQWtCQyxxQkFBNUMsQ0FFQSxPQUFPLENBRU5DLGlCQUFrQkEsZ0JBRlosQ0FHTmQsZ0JBQWlCQSxlQUhYLENBS043VixVQUFXQSxTQUxMLENBTU4rVix1QkFBd0JBLHNCQU5sQixDQVFOYSxZQUFhQSxXQVJQLENBU05KLGtCQUFtQkEsaUJBVGIsQ0FVTkssZUFBZ0JBLGNBVlYsQ0FXTkMsZUFBZ0JBLGNBWFYsQ0FhTkMsY0FBZUEsYUFiVCxDQWNOQyxrQkFBbUJBLGlCQWRiLENBZU5DLFlBQWFBLFdBZlAsQ0FnQk5DLG9CQUFxQkEsbUJBaEJmLENBa0JOVCxlQUFnQkEsY0FsQlYsQ0FtQk5DLHNCQUF1QkEscUJBbkJqQixDQW9CTlMsb0JBQXFCQSxtQkFwQmYsQ0FBUCxDQXdCQSxDQUVEOztLQUlBLHNCQUFBLEVBQXlCLENBRXhCLFVBQVksSUFBWixDQUVDQyxZQUFjLElBRmYsQ0FHQ0MsZ0JBQWtCLENBSG5CLENBSUNDLHFCQUF1QixLQUp4QixDQUtDQyxpQkFBbUIsS0FMcEIsQ0FPQzU0QixNQUFRLFNBQUEsRUFQVCxDQVFDNjRCLGlCQUFtQixXQUFBLEVBUnBCLENBVUNDLFFBQVUsQ0FBRXI5RCxNQUFPLElBQVQsQ0FBZWdyRCxZQUFhLEtBQTVCLENBVlgsQ0FZQSxLQUFLcVMsT0FBTCxDQUFlQSxPQUFmLENBQ0EsS0FBS0MsU0FBTCxDQUFpQixDQUFqQixDQUNBLEtBQUtDLGVBQUwsQ0FBdUIsQ0FBdkIsQ0FFQSxLQUFLQyxJQUFMLENBQVksU0FBVzkxQixNQUFYLENBQW1CKzFCLG1CQUFuQixDQUF3Q2hqQyxNQUF4QyxDQUFpRCxDQUU1RCxZQUNDaU4sT0FBTzFrQyxNQUFQLEdBQWtCLENBQWxCLEVBQ0F5NkQsbUJBREE7RUFHQTtFQUNBUixrQkFBb0IsQ0FKcEIsRUFLQUMsb0JBTkQsQ0FRQUEscUJBQXVCTyxtQkFBdkIsQ0FFQVQsWUFBY1UsY0FBZWgyQixNQUFmLENBQXVCak4sTUFBdkIsQ0FBK0IsQ0FBL0IsQ0FBZCxDQUNBd2lDLGdCQUFrQnYxQixPQUFPMWtDLE1BQXpCLENBRUEsY0FBQSxDQUVBLENBakJELENBbUJBLEtBQUsyNkQsWUFBTCxDQUFvQixVQUFZLENBRS9CUixpQkFBbUIsSUFBbkIsQ0FDQU8sY0FBZSxJQUFmLEVBRUEsQ0FMRCxDQU9BLEtBQUtFLFVBQUwsQ0FBa0IsVUFBWSxDQUU3QlQsaUJBQW1CLEtBQW5CLENBQ0FVLG1CQUVBLENBTEQsQ0FPQSxLQUFLQyxRQUFMLENBQWdCLFNBQVdwMkIsTUFBWCxDQUFtQjRuQixnQkFBbkIsQ0FBcUNDLFdBQXJDLENBQWtEOTBCLE1BQWxELENBQTBEZ2xCLEtBQTFELENBQWlFc2UsU0FBakUsQ0FBNkUsQ0FFNUYsR0FBSyxDQUFFYixvQkFBRixFQUEwQngxQixTQUFXLElBQXJDLEVBQTZDQSxPQUFPMWtDLE1BQVAsR0FBa0IsQ0FBL0QsRUFBb0VtNkQsa0JBQW9CLENBQUU1TixXQUEvRixDQUE2RztFQUk1RyxHQUFLNE4sZ0JBQUwsQ0FBd0I7RUFJdkJPLGNBQWUsSUFBZixFQUVBLENBTkQsSUFNTyxDQUVORyxtQkFFQSxDQUVELENBaEJELElBZ0JPLENBRU4sWUFBY1YsaUJBQW1CLENBQW5CLENBQXVCRixlQUFyQyxDQUNDZSxRQUFVQyxRQUFVLENBRHJCLENBR0NDLFNBQVd6ZSxNQUFNMGUsYUFBTixFQUF1QixJQUhuQyxDQUtBZCxRQUFRcjlELEtBQVIsQ0FBZ0JrK0QsUUFBaEIsQ0FBMEI7RUFFMUJBLFNBQVdSLGNBQWVoMkIsTUFBZixDQUF1QmpOLE1BQXZCLENBQStCdWpDLE9BQS9CLENBQXdDRCxTQUF4QyxDQUFYLENBRUEsSUFBTSxNQUFRLENBQWQsQ0FBaUIxNkQsSUFBTTI2RCxPQUF2QixDQUFnQyxFQUFHMzZELENBQW5DLENBQXVDLENBRXRDNjZELFNBQVU3NkQsQ0FBVixFQUFnQjI1RCxZQUFhMzVELENBQWIsQ0FBaEIsQ0FFQSxDQUVEbzhDLE1BQU0wZSxhQUFOLENBQXNCRCxRQUF0QixDQUNBLEtBQUtYLGVBQUwsQ0FBdUJqTyxpQkFBbUIsS0FBS2dPLFNBQXhCLENBQW9DLENBQTNELENBQ0EsS0FBS0EsU0FBTCxFQUFrQlcsT0FBbEIsQ0FFQSxDQUdELENBMUNELENBNENBLHlCQUFBLEVBQTRCLENBRTNCLEdBQUtaLFFBQVFyOUQsS0FBUixHQUFrQmc5RCxXQUF2QixDQUFxQyxDQUVwQ0ssUUFBUXI5RCxLQUFSLENBQWdCZzlELFdBQWhCLENBQ0FLLFFBQVFyUyxXQUFSLENBQXNCaVMsZ0JBQWtCLENBQXhDLENBRUEsQ0FFRHg1QixNQUFNNjVCLFNBQU4sQ0FBa0JMLGVBQWxCLENBQ0F4NUIsTUFBTTg1QixlQUFOLENBQXdCLENBQXhCLENBRUEsQ0FFRCxzQkFBQSxDQUF3QjcxQixNQUF4QixDQUFnQ2pOLE1BQWhDLENBQXdDNUUsU0FBeEMsQ0FBbUR1b0MsYUFBbkQsQ0FBbUUsQ0FFbEUsWUFBYzEyQixTQUFXLElBQVgsQ0FBa0JBLE9BQU8xa0MsTUFBekIsQ0FBa0MsQ0FBaEQsQ0FDQ2s3RCxTQUFXLElBRFosQ0FHQSxHQUFLRyxVQUFZLENBQWpCLENBQXFCLENBRXBCSCxTQUFXYixRQUFRcjlELEtBQW5CLENBRUEsR0FBS28rRCxnQkFBa0IsSUFBbEIsRUFBMEJGLFdBQWEsSUFBNUMsQ0FBbUQsQ0FFbEQsYUFBZXJvQyxVQUFZd29DLFFBQVUsQ0FBckMsQ0FDQ0MsV0FBYTdqQyxPQUFPbWxCLGtCQURyQixDQUdBd2QsaUJBQWlCN2dDLGVBQWpCLENBQWtDK2hDLFVBQWxDLEVBRUEsR0FBS0osV0FBYSxJQUFiLEVBQXFCQSxTQUFTbDdELE1BQVQsQ0FBa0J1N0QsUUFBNUMsQ0FBdUQsQ0FFdERMLFNBQVcsZ0JBQUEsQ0FBa0JLLFFBQWxCLENBQVgsQ0FFQSxDQUVELElBQU0sTUFBUSxDQUFSLENBQVdDLEdBQUszb0MsU0FBdEIsQ0FBaUN4eUIsSUFBTWc3RCxPQUF2QyxDQUFnRCxFQUFHaDdELENBQUgsQ0FBTW03RCxJQUFNLENBQTVELENBQWdFLENBRS9EajZCLE1BQU10YyxJQUFOLENBQVl5ZixPQUFRcmtDLENBQVIsQ0FBWixFQUEwQjR1QixZQUExQixDQUF3Q3FzQyxVQUF4QyxDQUFvRGxCLGdCQUFwRCxFQUVBNzRCLE1BQU05SSxNQUFOLENBQWE3USxPQUFiLENBQXNCc3pDLFFBQXRCLENBQWdDTSxFQUFoQyxFQUNBTixTQUFVTSxHQUFLLENBQWYsRUFBcUJqNkIsTUFBTUMsUUFBM0IsQ0FFQSxDQUVELENBRUQ2NEIsUUFBUXI5RCxLQUFSLENBQWdCaytELFFBQWhCLENBQ0FiLFFBQVFyUyxXQUFSLENBQXNCLElBQXRCLENBRUEsQ0FFRHZuQixNQUFNNjVCLFNBQU4sQ0FBa0JlLE9BQWxCLENBRUEsZUFBQSxDQUVBLENBRUQsQ0FFRDs7S0FJQSx3QkFBQSxDQUEwQnBsQixFQUExQixDQUErQixDQUU5QixlQUFpQixFQUFqQixDQUVBLE9BQU8sQ0FFTmx5QyxJQUFLLFNBQVcxSCxJQUFYLENBQWtCLENBRXRCLEdBQUtvakIsV0FBWXBqQixJQUFaLElBQXVCc0MsU0FBNUIsQ0FBd0MsQ0FFdkMsa0JBQW1CdEMsSUFBWixDQUFQLENBRUEsQ0FFRCxhQUFBLENBRUEsT0FBU0EsSUFBVCxFQUVDLElBQUsscUJBQUwsQ0FDQ3VqQixVQUFZcTJCLEdBQUd3bEIsWUFBSCxDQUFpQixxQkFBakIsR0FBNEN4bEIsR0FBR3dsQixZQUFILENBQWlCLHlCQUFqQixDQUE1QyxFQUE0RnhsQixHQUFHd2xCLFlBQUgsQ0FBaUIsNEJBQWpCLENBQXhHLENBQ0EsTUFFRCxJQUFLLGdDQUFMLENBQ0M3N0MsVUFBWXEyQixHQUFHd2xCLFlBQUgsQ0FBaUIsZ0NBQWpCLEdBQXVEeGxCLEdBQUd3bEIsWUFBSCxDQUFpQixvQ0FBakIsQ0FBdkQsRUFBa0h4bEIsR0FBR3dsQixZQUFILENBQWlCLHVDQUFqQixDQUE5SCxDQUNBLE1BRUQsSUFBSywrQkFBTCxDQUNDNzdDLFVBQVlxMkIsR0FBR3dsQixZQUFILENBQWlCLCtCQUFqQixHQUFzRHhsQixHQUFHd2xCLFlBQUgsQ0FBaUIsbUNBQWpCLENBQXRELEVBQWdIeGxCLEdBQUd3bEIsWUFBSCxDQUFpQixzQ0FBakIsQ0FBNUgsQ0FDQSxNQUVELElBQUssZ0NBQUwsQ0FDQzc3QyxVQUFZcTJCLEdBQUd3bEIsWUFBSCxDQUFpQixnQ0FBakIsR0FBdUR4bEIsR0FBR3dsQixZQUFILENBQWlCLHVDQUFqQixDQUFuRSxDQUNBLE1BRUQsUUFDQzc3QyxVQUFZcTJCLEdBQUd3bEIsWUFBSCxDQUFpQnAvRCxJQUFqQixDQUFaLENBbkJGLENBdUJBLEdBQUt1akIsWUFBYyxJQUFuQixDQUEwQixDQUV6QnRLLFFBQVE2UCxJQUFSLENBQWMsd0JBQTBCOW9CLElBQTFCLENBQWlDLDJCQUEvQyxFQUVBLENBRURvakIsV0FBWXBqQixJQUFaLEVBQXFCdWpCLFNBQXJCLENBRUEsZ0JBQUEsQ0FFQSxDQTdDSyxDQUFQLENBaURBLENBRUQ7O0tBSUEsd0JBQUEsQ0FBMEJxMkIsRUFBMUIsQ0FBOEJ0VixVQUE5QixDQUEwQzloQyxJQUExQyxDQUFpRCxDQUVoRCxlQUFpQixFQUFqQixDQUNBLHdCQUEwQixFQUExQixDQUVBLDBCQUFBLENBQTRCMlEsS0FBNUIsQ0FBb0MsQ0FFbkMsYUFBZUEsTUFBTXZKLE1BQXJCLENBQ0EsbUJBQXFCNjFDLFdBQVl4YixTQUFTcjRCLEVBQXJCLENBQXJCLENBRUEsR0FBS3l6RCxlQUFlejBELEtBQWYsR0FBeUIsSUFBOUIsQ0FBcUMsQ0FFcEMwNUIsV0FBV2tYLE1BQVgsQ0FBbUI2akIsZUFBZXowRCxLQUFsQyxFQUVBLENBRUQsSUFBTSxRQUFOLG1CQUFpQzA1QixVQUFqQyxDQUE4QyxDQUU3Q0EsV0FBV2tYLE1BQVgsQ0FBbUI2akIsZUFBZS82QixVQUFmLENBQTJCdGtDLElBQTNCLENBQW5CLEVBRUEsQ0FFRGlrQyxTQUFTN2UsbUJBQVQsQ0FBOEIsU0FBOUIsQ0FBeUNrNkMsaUJBQXpDLEVBRUEsa0JBQW1CcjdCLFNBQVNyNEIsRUFBckIsQ0FBUCxDQUVBO0VBRUEsY0FBZ0IyekQsb0JBQXFCdDdCLFNBQVNyNEIsRUFBOUIsQ0FBaEIsQ0FFQSxHQUFLNmYsU0FBTCxDQUFpQixDQUVoQjZZLFdBQVdrWCxNQUFYLENBQW1CL3ZCLFNBQW5CLEVBQ0EsMkJBQTRCd1ksU0FBU3I0QixFQUE5QixDQUFQLENBRUEsQ0FFRDZmLFVBQVk4ekMsb0JBQXFCRixlQUFlenpELEVBQXBDLENBQVosQ0FFQSxHQUFLNmYsU0FBTCxDQUFpQixDQUVoQjZZLFdBQVdrWCxNQUFYLENBQW1CL3ZCLFNBQW5CLEVBQ0EsMkJBQTRCNHpDLGVBQWV6ekQsRUFBcEMsQ0FBUCxDQUVBLENBRUQ7RUFFQXBKLEtBQUtnOUQsTUFBTCxDQUFZL2YsVUFBWixHQUVBLENBRUQsWUFBQSxDQUFjajhDLE1BQWQsQ0FBc0J5Z0MsUUFBdEIsQ0FBaUMsQ0FFaEMsbUJBQXFCd2IsV0FBWXhiLFNBQVNyNEIsRUFBckIsQ0FBckIsQ0FFQSxHQUFLeXpELGNBQUwsQ0FBc0IscUJBQUEsQ0FFdEJwN0IsU0FBU2h3QixnQkFBVCxDQUEyQixTQUEzQixDQUFzQ3FyRCxpQkFBdEMsRUFFQSxHQUFLcjdCLFNBQVNJLGdCQUFkLENBQWlDLENBRWhDZzdCLGVBQWlCcDdCLFFBQWpCLENBRUEsQ0FKRCxRQUlZQSxTQUFTQyxVQUFkLENBQTJCLENBRWpDLEdBQUtELFNBQVN3N0IsZUFBVCxHQUE2Qm45RCxTQUFsQyxDQUE4QyxDQUU3QzJoQyxTQUFTdzdCLGVBQVQsQ0FBMkIsa0JBQUEsR0FBcUJoOEIsYUFBckIsQ0FBb0NqZ0MsTUFBcEMsQ0FBM0IsQ0FFQSxDQUVENjdELGVBQWlCcDdCLFNBQVN3N0IsZUFBMUIsQ0FFQSxDQUVEaGdCLFdBQVl4YixTQUFTcjRCLEVBQXJCLEVBQTRCeXpELGNBQTVCLENBRUE3OEQsS0FBS2c5RCxNQUFMLENBQVkvZixVQUFaLEdBRUEscUJBQUEsQ0FFQSxDQUVELGVBQUEsQ0FBaUJ4YixRQUFqQixDQUE0QixDQUUzQixVQUFZQSxTQUFTcjVCLEtBQXJCLENBQ0EsdUJBQXlCcTVCLFNBQVNLLFVBQWxDLENBRUEsR0FBSzE1QixRQUFVLElBQWYsQ0FBc0IsQ0FFckIwNUIsV0FBVzNNLE1BQVgsQ0FBbUIvc0IsS0FBbkIsQ0FBMEJndkMsR0FBRzhsQixvQkFBN0IsRUFFQSxDQUVELElBQU0sUUFBTixzQkFBQSxDQUF1QyxDQUV0Q3A3QixXQUFXM00sTUFBWCxDQUFtQmdvQyxtQkFBb0IzL0QsSUFBcEIsQ0FBbkIsQ0FBK0M0NUMsR0FBR2dtQixZQUFsRCxFQUVBLENBRUQ7RUFFQSxvQkFBc0IzN0IsU0FBUzhtQixlQUEvQixDQUVBLElBQU0sUUFBTixtQkFBQSxDQUFvQyxDQUVuQyxVQUFZQSxnQkFBaUIvcUQsSUFBakIsQ0FBWixDQUVBLElBQU0sTUFBUSxDQUFSLENBQVd5RyxFQUFJc2QsTUFBTXBnQixNQUEzQixDQUFtQ0ssRUFBSXlDLENBQXZDLENBQTBDekMsR0FBMUMsQ0FBaUQsQ0FFaERzZ0MsV0FBVzNNLE1BQVgsQ0FBbUI1VCxNQUFPL2YsQ0FBUCxDQUFuQixDQUErQjQxQyxHQUFHZ21CLFlBQWxDLEVBRUEsQ0FFRCxDQUVELENBRUQsOEJBQUEsQ0FBZ0MzN0IsUUFBaEMsQ0FBMkMsQ0FFMUMsY0FBZ0JzN0Isb0JBQXFCdDdCLFNBQVNyNEIsRUFBOUIsQ0FBaEIsQ0FFQSxHQUFLNmYsU0FBTCxDQUFpQixnQkFBQSxDQUVqQixZQUFjLEVBQWQsQ0FFQSxrQkFBb0J3WSxTQUFTcjVCLEtBQTdCLENBQ0EsdUJBQXlCcTVCLFNBQVNLLFVBQWxDLENBRUE7RUFFQSxHQUFLdTdCLGdCQUFrQixJQUF2QixDQUE4QixDQUU3QixVQUFZQSxjQUFjOTdDLEtBQTFCLENBRUEsSUFBTSxNQUFRLENBQVIsQ0FBV3RkLEVBQUlzZCxNQUFNcGdCLE1BQTNCLENBQW1DSyxFQUFJeUMsQ0FBdkMsQ0FBMEN6QyxHQUFLLENBQS9DLENBQW1ELENBRWxELE1BQVErZixNQUFPL2YsRUFBSSxDQUFYLENBQVIsQ0FDQSxNQUFRK2YsTUFBTy9mLEVBQUksQ0FBWCxDQUFSLENBQ0EsTUFBUStmLE1BQU8vZixFQUFJLENBQVgsQ0FBUixDQUVBOC9DLFFBQVEzZ0QsSUFBUixDQUFjdUQsQ0FBZCxDQUFpQkYsQ0FBakIsQ0FBb0JBLENBQXBCLENBQXVCVyxDQUF2QixDQUEwQkEsQ0FBMUIsQ0FBNkJULENBQTdCLEVBRUEsQ0FFRCxDQWRELElBY08sQ0FFTixVQUFZaTVELG1CQUFtQi9xQyxRQUFuQixDQUE0QjdRLEtBQXhDLENBRUEsSUFBTSxNQUFRLENBQVIsQ0FBV3RkLEVBQU1zZCxNQUFNcGdCLE1BQU4sQ0FBZSxDQUFqQixDQUF1QixDQUE1QyxDQUErQ0ssRUFBSXlDLENBQW5ELENBQXNEekMsR0FBSyxDQUEzRCxDQUErRCxDQUU5RCxNQUFRQSxFQUFJLENBQVosQ0FDQSxNQUFRQSxFQUFJLENBQVosQ0FDQSxNQUFRQSxFQUFJLENBQVosQ0FFQTgvQyxRQUFRM2dELElBQVIsQ0FBY3VELENBQWQsQ0FBaUJGLENBQWpCLENBQW9CQSxDQUFwQixDQUF1QlcsQ0FBdkIsQ0FBMEJBLENBQTFCLENBQTZCVCxDQUE3QixFQUVBLENBRUQsQ0FFRDtFQUVBK2tCLFVBQVksSUFBTTIvQixTQUFVdEgsT0FBVixFQUFzQixLQUF0QixDQUE4QmtHLHFCQUE5QixDQUFzREYscUJBQTVELEVBQXFGaEcsT0FBckYsQ0FBOEYsQ0FBOUYsQ0FBWixDQUVBeGYsV0FBVzNNLE1BQVgsQ0FBbUJsTSxTQUFuQixDQUE4Qm11QixHQUFHOGxCLG9CQUFqQyxFQUVBSCxvQkFBcUJ0N0IsU0FBU3I0QixFQUE5QixFQUFxQzZmLFNBQXJDLENBRUEsZ0JBQUEsQ0FFQSxDQUVELE9BQU8sQ0FFTi9qQixJQUFLQSxHQUZDLENBR05pd0IsT0FBUUEsTUFIRixDQUtObW9DLHNCQUF1QkEscUJBTGpCLENBQVAsQ0FTQSxDQUVEOztLQUlBLG1DQUFBLENBQXFDbG1CLEVBQXJDLENBQXlDeDJCLFVBQXpDLENBQXFENWdCLElBQXJELENBQTRELENBRTNELFFBQUEsQ0FFQSxnQkFBQSxDQUFrQjdCLEtBQWxCLENBQTBCLENBRXpCNEssS0FBTzVLLEtBQVAsQ0FFQSxDQUVELFFBQUEsQ0FBVW02QyxlQUFWLENBRUEsaUJBQUEsQ0FBbUJuNkMsS0FBbkIsQ0FBMkIsQ0FFMUJoQyxLQUFPZ0MsTUFBTWhDLElBQWIsQ0FDQW04QyxnQkFBa0JuNkMsTUFBTW02QyxlQUF4QixDQUVBLENBRUQsZUFBQSxDQUFpQnRULEtBQWpCLENBQXdCOVUsS0FBeEIsQ0FBZ0MsQ0FFL0JrbkIsR0FBR21tQixZQUFILENBQWlCeDBELElBQWpCLENBQXVCbW5CLEtBQXZCLENBQThCL3pCLElBQTlCLENBQW9DNm9DLE1BQVFzVCxlQUE1QyxFQUVBdDRDLEtBQUttMUIsTUFBTCxDQUFhakYsS0FBYixDQUFvQm5uQixJQUFwQixFQUVBLENBRUQsd0JBQUEsQ0FBMEIwNEIsUUFBMUIsQ0FBb0N1RCxLQUFwQyxDQUEyQzlVLEtBQTNDLENBQW1ELENBRWxELGNBQWdCdFAsV0FBVzFiLEdBQVgsQ0FBZ0Isd0JBQWhCLENBQWhCLENBRUEsR0FBSzZiLFlBQWMsSUFBbkIsQ0FBMEIsQ0FFekJ0SyxRQUFRTSxLQUFSLENBQWUsdUlBQWYsRUFDQSxPQUVBLENBRURnSyxVQUFVeThDLDBCQUFWLENBQXNDejBELElBQXRDLENBQTRDbW5CLEtBQTVDLENBQW1EL3pCLElBQW5ELENBQXlENm9DLE1BQVFzVCxlQUFqRSxDQUFrRjdXLFNBQVN5M0IsaUJBQTNGLEVBRUFsNUQsS0FBS20xQixNQUFMLENBQWFqRixLQUFiLENBQW9Cbm5CLElBQXBCLENBQTBCMDRCLFNBQVN5M0IsaUJBQW5DLEVBRUEsQ0FFRDtFQUVBLEtBQUtDLE9BQUwsQ0FBZUEsT0FBZixDQUNBLEtBQUt4USxRQUFMLENBQWdCQSxRQUFoQixDQUNBLEtBQUtvUSxNQUFMLENBQWNBLE1BQWQsQ0FDQSxLQUFLSyxlQUFMLENBQXVCQSxlQUF2QixDQUVBLENBRUQ7O0tBSUEsa0JBQUEsQ0FBb0JoaUIsRUFBcEIsQ0FBeUIsQ0FFeEIsV0FBYSxDQUNaNkYsV0FBWSxDQURBLENBRVo3ZixTQUFVLENBRkUsQ0FBYixDQUtBLFdBQWEsQ0FDWnFnQyxNQUFPLENBREssQ0FFWkMsTUFBTyxDQUZLLENBR1pDLFVBQVcsQ0FIQyxDQUlaajlCLE9BQVEsQ0FKSSxDQUtaazlCLE1BQU8sQ0FMSyxDQUFiLENBUUEsZUFBQSxDQUFpQjF0QyxLQUFqQixDQUF3Qm5uQixJQUF4QixDQUE4QjgwRCxhQUE5QixDQUE4QyxDQUU3Q0EsY0FBZ0JBLGVBQWlCLENBQWpDLENBRUE5RSxPQUFPMkUsS0FBUCxHQUVBLE9BQVMzMEQsSUFBVCxFQUVDLFFBQVErMEQsU0FBUixDQUNDL0UsT0FBTzRFLFNBQVAsRUFBb0JFLGVBQWtCM3RDLE1BQVEsQ0FBMUIsQ0FBcEIsQ0FDQSxNQUVELFFBQVE2dEMsY0FBUixDQUNBLFFBQVFDLFlBQVIsQ0FDQ2pGLE9BQU80RSxTQUFQLEVBQW9CRSxlQUFrQjN0QyxNQUFRLENBQTFCLENBQXBCLENBQ0EsTUFFRCxRQUFRK3RDLEtBQVIsQ0FDQ2xGLE9BQU82RSxLQUFQLEVBQWdCQyxlQUFrQjN0QyxNQUFRLENBQTFCLENBQWhCLENBQ0EsTUFFRCxRQUFRZ3VDLFVBQVIsQ0FDQ25GLE9BQU82RSxLQUFQLEVBQWdCQyxlQUFrQjN0QyxNQUFRLENBQTFCLENBQWhCLENBQ0EsTUFFRCxRQUFRaXVDLFNBQVIsQ0FDQ3BGLE9BQU82RSxLQUFQLEVBQWdCQyxjQUFnQjN0QyxLQUFoQyxDQUNBLE1BRUQsUUFBUWt1QyxNQUFSLENBQ0NyRixPQUFPcjRCLE1BQVAsRUFBaUJtOUIsY0FBZ0IzdEMsS0FBakMsQ0FDQSxNQUVELFFBQ0N6WixRQUFRTSxLQUFSLENBQWUscUNBQWYsQ0FBc0RoTyxJQUF0RCxFQUNBLE1BN0JGLENBaUNBLENBRUQsY0FBQSxFQUFpQixDQUVoQmd3RCxPQUFPMEUsS0FBUCxHQUNBMUUsT0FBTzJFLEtBQVAsQ0FBZSxDQUFmLENBQ0EzRSxPQUFPNEUsU0FBUCxDQUFtQixDQUFuQixDQUNBNUUsT0FBT3I0QixNQUFQLENBQWdCLENBQWhCLENBQ0FxNEIsT0FBTzZFLEtBQVAsQ0FBZSxDQUFmLENBRUEsQ0FFRCxPQUFPLENBQ05aLE9BQVFBLE1BREYsQ0FFTmpFLE9BQVFBLE1BRkYsQ0FHTnNGLFNBQVUsSUFISixDQUlOQyxVQUFXLElBSkwsQ0FLTng5RCxNQUFPQSxLQUxELENBTU5xMEIsT0FBUUEsTUFORixDQUFQLENBU0EsQ0FFRDs7S0FJQSx5QkFBQSxDQUEyQmp4QixDQUEzQixDQUE4QkYsQ0FBOUIsQ0FBa0MsQ0FFakMsWUFBWThqQixHQUFMLENBQVU5akIsRUFBRyxDQUFILENBQVYsRUFBcUJYLEtBQUt5a0IsR0FBTCxDQUFVNWpCLEVBQUcsQ0FBSCxDQUFWLENBQTVCLENBRUEsQ0FFRCwwQkFBQSxDQUE0Qmt6QyxFQUE1QixDQUFpQyxDQUVoQyxtQkFBcUIsRUFBckIsQ0FDQSxvQkFBc0IsZ0JBQUEsQ0FBa0IsQ0FBbEIsQ0FBdEIsQ0FFQSxlQUFBLENBQWlCcDJDLE1BQWpCLENBQXlCeWdDLFFBQXpCLENBQW1DZ2MsUUFBbkMsQ0FBNkM4Z0IsT0FBN0MsQ0FBdUQsQ0FFdEQscUJBQXVCdjlELE9BQU93MEQscUJBQTlCLENBRUEsV0FBYWdKLGlCQUFpQnI5RCxNQUE5QixDQUVBLGVBQWlCczlELGVBQWdCaDlCLFNBQVNyNEIsRUFBekIsQ0FBakIsQ0FFQSxHQUFLczFELGFBQWU1K0QsU0FBcEIsQ0FBZ0M7RUFJL0I0K0QsV0FBYSxFQUFiLENBRUEsSUFBTSxNQUFRLENBQWQsQ0FBaUJsOUQsRUFBSUwsTUFBckIsQ0FBNkJLLEdBQTdCLENBQW9DLENBRW5DazlELFdBQVlsOUQsQ0FBWixFQUFrQixDQUFFQSxDQUFGLENBQUssQ0FBTCxDQUFsQixDQUVBLENBRURpOUQsZUFBZ0JoOUIsU0FBU3I0QixFQUF6QixFQUFnQ3MxRCxVQUFoQyxDQUVBLENBRUQsaUJBQW1CamhCLFNBQVNnQyxZQUFULEVBQXlCaGUsU0FBUzhtQixlQUFULENBQXlCbjJCLFFBQXJFLENBQ0EsaUJBQW1CcXJCLFNBQVNpQyxZQUFULEVBQXlCamUsU0FBUzhtQixlQUFULENBQXlCM3VCLE1BQXJFLENBRUE7RUFFQSxJQUFNLE1BQVEsQ0FBZCxDQUFpQnA0QixFQUFJTCxNQUFyQixDQUE2QkssR0FBN0IsQ0FBb0MsQ0FFbkMsY0FBZ0JrOUQsV0FBWWw5RCxDQUFaLENBQWhCLENBRUEsR0FBSzQxRCxVQUFXLENBQVgsSUFBbUIsQ0FBeEIsQ0FBNEIsQ0FFM0IsR0FBSzNYLFlBQUwsQ0FBb0JoZSxTQUFTc25CLGVBQVQsQ0FBMEIsY0FBZ0J2bkQsQ0FBMUMsRUFDcEIsR0FBS2srQyxZQUFMLENBQW9CamUsU0FBU3NuQixlQUFULENBQTBCLGNBQWdCdm5ELENBQTFDLEVBRXBCLENBRUQsQ0FFRDtFQUVBLElBQU0sTUFBUSxDQUFkLENBQWlCQSxFQUFJTCxNQUFyQixDQUE2QkssR0FBN0IsQ0FBb0MsQ0FFbkMsY0FBZ0JrOUQsV0FBWWw5RCxDQUFaLENBQWhCLENBRUE0MUQsVUFBVyxDQUFYLEVBQWlCNTFELENBQWpCLENBQ0E0MUQsVUFBVyxDQUFYLEVBQWlCb0gsaUJBQWtCaDlELENBQWxCLENBQWpCLENBRUEsQ0FFRGs5RCxXQUFXcGEsSUFBWCxDQUFpQnFhLGdCQUFqQixFQUVBO0VBRUEsSUFBTSxNQUFRLENBQWQsQ0FBaUJuOUQsRUFBSSxDQUFyQixDQUF3QkEsR0FBeEIsQ0FBK0IsQ0FFOUIsY0FBZ0JrOUQsV0FBWWw5RCxDQUFaLENBQWhCLENBRUEsR0FBSzQxRCxTQUFMLENBQWlCLENBRWhCLFVBQVlBLFVBQVcsQ0FBWCxDQUFaLENBQ0EsVUFBWUEsVUFBVyxDQUFYLENBQVosQ0FFQSxHQUFLajVELEtBQUwsQ0FBYSxDQUVaLEdBQUtzaEQsWUFBTCxDQUFvQmhlLFNBQVNvbkIsWUFBVCxDQUF1QixjQUFnQnJuRCxDQUF2QyxDQUEwQ2krQyxhQUFjcjNDLEtBQWQsQ0FBMUMsRUFDcEIsR0FBS3MzQyxZQUFMLENBQW9CamUsU0FBU29uQixZQUFULENBQXVCLGNBQWdCcm5ELENBQXZDLENBQTBDaytDLGFBQWN0M0MsS0FBZCxDQUExQyxFQUVwQit1RCxnQkFBaUIzMUQsQ0FBakIsRUFBdUJyRCxLQUF2QixDQUNBLFNBRUEsQ0FFRCxDQUVEZzVELGdCQUFpQjMxRCxDQUFqQixFQUF1QixDQUF2QixDQUVBLENBRUQrOEQsUUFBUUssV0FBUixHQUFzQkMsUUFBdEIsQ0FBZ0N6bkIsRUFBaEMsQ0FBb0MsdUJBQXBDLENBQTZEK2YsZUFBN0QsRUFFQSxDQUVELE9BQU8sQ0FFTmhpQyxPQUFRQSxNQUZGLENBQVAsQ0FNQSxDQUVEOztLQUlBLHFCQUFBLENBQXVCOG5CLFVBQXZCLENBQW1DajlDLElBQW5DLENBQTBDLENBRXpDLGVBQWlCLEVBQWpCLENBRUEsZUFBQSxDQUFpQmdCLE1BQWpCLENBQTBCLENBRXpCLFVBQVloQixLQUFLKzRELE1BQUwsQ0FBWTBFLEtBQXhCLENBRUEsYUFBZXo4RCxPQUFPeWdDLFFBQXRCLENBQ0EsbUJBQXFCd2IsV0FBVy8zQyxHQUFYLENBQWdCbEUsTUFBaEIsQ0FBd0J5Z0MsUUFBeEIsQ0FBckIsQ0FFQTtFQUVBLEdBQUtxOUIsV0FBWWpDLGVBQWV6ekQsRUFBM0IsSUFBb0NxMEQsS0FBekMsQ0FBaUQsQ0FFaEQsR0FBS2g4QixTQUFTQyxVQUFkLENBQTJCLENBRTFCbTdCLGVBQWV2VCxnQkFBZixDQUFpQ3RvRCxNQUFqQyxFQUVBLENBRURpOEMsV0FBVzluQixNQUFYLENBQW1CMG5DLGNBQW5CLEVBRUFpQyxXQUFZakMsZUFBZXp6RCxFQUEzQixFQUFrQ3EwRCxLQUFsQyxDQUVBLENBRUQscUJBQUEsQ0FFQSxDQUVELGdCQUFBLEVBQW1CLENBRWxCcUIsV0FBYSxFQUFiLENBRUEsQ0FFRCxPQUFPLENBRU4zcEMsT0FBUUEsTUFGRixDQUdOOEksUUFBU0EsT0FISCxDQUFQLENBT0EsQ0FFRDs7S0FJQSxvQkFBQSxDQUFzQkgsTUFBdEIsQ0FBOEIxQyxPQUE5QixDQUF1Q0MsS0FBdkMsQ0FBOENDLEtBQTlDLENBQXFEQyxTQUFyRCxDQUFnRUMsU0FBaEUsQ0FBMkVDLE1BQTNFLENBQW1GdC9CLElBQW5GLENBQXlGdS9CLFVBQXpGLENBQXFHQyxRQUFyRyxDQUFnSCxDQUUvR21DLE9BQVNBLFNBQVdoK0IsU0FBWCxDQUF1QmcrQixNQUF2QixDQUFnQyxFQUF6QyxDQUNBMUMsUUFBVUEsVUFBWXQ3QixTQUFaLENBQXdCczdCLE9BQXhCLENBQWtDMmpDLHFCQUE1QyxDQUVBampDLFFBQVExL0IsSUFBUixDQUFjLElBQWQsQ0FBb0IwaEMsTUFBcEIsQ0FBNEIxQyxPQUE1QixDQUFxQ0MsS0FBckMsQ0FBNENDLEtBQTVDLENBQW1EQyxTQUFuRCxDQUE4REMsU0FBOUQsQ0FBeUVDLE1BQXpFLENBQWlGdC9CLElBQWpGLENBQXVGdS9CLFVBQXZGLENBQW1HQyxRQUFuRyxFQUVBLEtBQUtnQixLQUFMLENBQWEsS0FBYixDQUVBLENBRURxaUMsWUFBWXRrRSxTQUFaLENBQXdCRCxPQUFPaUIsTUFBUCxDQUFlb2dDLFFBQVFwaEMsU0FBdkIsQ0FBeEIsQ0FDQXNrRSxZQUFZdGtFLFNBQVosQ0FBc0JzQyxXQUF0QixDQUFvQ2dpRSxXQUFwQyxDQUVBQSxZQUFZdGtFLFNBQVosQ0FBc0I2OUQsYUFBdEIsQ0FBc0MsSUFBdEMsQ0FFQTk5RCxPQUFPd0ssY0FBUCxDQUF1Qis1RCxZQUFZdGtFLFNBQW5DLENBQThDLFFBQTlDLENBQXdELENBRXZEd0ssSUFBSyxVQUFZLENBRWhCLFlBQVlpMkIsS0FBWixDQUVBLENBTnNELENBUXZEcnBCLElBQUssU0FBVzNULEtBQVgsQ0FBbUIsQ0FFdkIsS0FBS2c5QixLQUFMLENBQWFoOUIsS0FBYixDQUVBLENBWnNELENBQXhELEVBZ0JBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztLQWlEQSxpQkFBbUIsV0FBQSxFQUFuQixDQUNBLHFCQUF1QixlQUFBLEVBQXZCLENBRUE7RUFFQSx5QkFBQSxFQUE0QixDQUUzQixLQUFLOGdFLEdBQUwsQ0FBVyxFQUFYLENBQ0EsS0FBSzl0QixHQUFMLENBQVcsRUFBWCxDQUVBLENBRUQ7RUFFQTtFQUVBLGtCQUFvQixFQUFwQixDQUNBLGtCQUFvQixFQUFwQixDQUVBO0VBRUEsY0FBZ0IsZ0JBQUEsQ0FBa0IsRUFBbEIsQ0FBaEIsQ0FDQSxjQUFnQixnQkFBQSxDQUFrQixDQUFsQixDQUFoQixDQUVBO0VBRUEsZ0JBQUEsQ0FBa0I1dkIsS0FBbEIsQ0FBeUIyOUMsT0FBekIsQ0FBa0NDLFNBQWxDLENBQThDLENBRTdDLGNBQWdCNTlDLE1BQU8sQ0FBUCxDQUFoQixDQUVBLEdBQUs2OUMsV0FBYSxDQUFiLEVBQWtCQSxVQUFZLENBQW5DLENBQXVDLFlBQUEsQ0FDdkM7RUFDQTtFQUVBLE1BQVFGLFFBQVVDLFNBQWxCLENBQ0NsbkQsRUFBSW9uRCxjQUFldDdDLENBQWYsQ0FETCxDQUdBLEdBQUs5TCxJQUFNblksU0FBWCxDQUF1QixDQUV0Qm1ZLEVBQUksZ0JBQUEsQ0FBa0I4TCxDQUFsQixDQUFKLENBQ0FzN0MsY0FBZXQ3QyxDQUFmLEVBQXFCOUwsQ0FBckIsQ0FFQSxDQUVELEdBQUtpbkQsVUFBWSxDQUFqQixDQUFxQixDQUVwQkUsVUFBVXIyQyxPQUFWLENBQW1COVEsQ0FBbkIsQ0FBc0IsQ0FBdEIsRUFFQSxJQUFNLE1BQVEsQ0FBUixDQUFXNlEsT0FBUyxDQUExQixDQUE2QnRuQixJQUFNMDlELE9BQW5DLENBQTRDLEVBQUcxOUQsQ0FBL0MsQ0FBbUQsQ0FFbERzbkIsUUFBVXEyQyxTQUFWLENBQ0E1OUMsTUFBTy9mLENBQVAsRUFBV3VuQixPQUFYLENBQW9COVEsQ0FBcEIsQ0FBdUI2USxNQUF2QixFQUVBLENBRUQsQ0FFRCxRQUFBLENBRUEsQ0FFRDtFQUVBLHNCQUFBLENBQXdCNHVDLFFBQXhCLENBQWtDM3pDLENBQWxDLENBQXNDLENBRXJDLE1BQVF1N0MsY0FBZXY3QyxDQUFmLENBQVIsQ0FFQSxHQUFLOUwsSUFBTW5ZLFNBQVgsQ0FBdUIsQ0FFdEJtWSxFQUFJLGNBQUEsQ0FBZ0I4TCxDQUFoQixDQUFKLENBQ0F1N0MsY0FBZXY3QyxDQUFmLEVBQXFCOUwsQ0FBckIsQ0FFQSxDQUVELElBQU0sTUFBUSxDQUFkLENBQWlCelcsSUFBTXVpQixDQUF2QixDQUEwQixFQUFHdmlCLENBQTdCLENBQ0N5VyxFQUFHelcsQ0FBSCxFQUFTazJELFNBQVM2SCxnQkFBVCxFQUFULENBRUQsUUFBQSxDQUVBLENBRUQ7RUFFQTtFQUNBO0VBRUE7RUFFQSxtQkFBQSxDQUFxQm5vQixFQUFyQixDQUF5QnZqQyxDQUF6QixDQUE2QixDQUU1QnVqQyxHQUFHb29CLFNBQUgsQ0FBYyxLQUFLQyxJQUFuQixDQUF5QjVyRCxDQUF6QixFQUVBLENBRUQsbUJBQUEsQ0FBcUJ1akMsRUFBckIsQ0FBeUJ2akMsQ0FBekIsQ0FBNkIsQ0FFNUJ1akMsR0FBR3NvQixTQUFILENBQWMsS0FBS0QsSUFBbkIsQ0FBeUI1ckQsQ0FBekIsRUFFQSxDQUVEO0VBRUEsb0JBQUEsQ0FBc0J1akMsRUFBdEIsQ0FBMEJ2akMsQ0FBMUIsQ0FBOEIsQ0FFN0IsR0FBS0EsRUFBRUUsQ0FBRixHQUFRalUsU0FBYixDQUF5QixDQUV4QnMzQyxHQUFHdW9CLFVBQUgsQ0FBZSxLQUFLRixJQUFwQixDQUEwQjVyRCxDQUExQixFQUVBLENBSkQsSUFJTyxDQUVOdWpDLEdBQUd3b0IsU0FBSCxDQUFjLEtBQUtILElBQW5CLENBQXlCNXJELEVBQUVFLENBQTNCLENBQThCRixFQUFFMFEsQ0FBaEMsRUFFQSxDQUVELENBRUQsb0JBQUEsQ0FBc0I2eUIsRUFBdEIsQ0FBMEJ2akMsQ0FBMUIsQ0FBOEIsQ0FFN0IsR0FBS0EsRUFBRUUsQ0FBRixHQUFRalUsU0FBYixDQUF5QixDQUV4QnMzQyxHQUFHeW9CLFNBQUgsQ0FBYyxLQUFLSixJQUFuQixDQUF5QjVyRCxFQUFFRSxDQUEzQixDQUE4QkYsRUFBRTBRLENBQWhDLENBQW1DMVEsRUFBRXVYLENBQXJDLEVBRUEsQ0FKRCxRQUlZdlgsRUFBRW9FLENBQUYsR0FBUW5ZLFNBQWIsQ0FBeUIsQ0FFL0JzM0MsR0FBR3lvQixTQUFILENBQWMsS0FBS0osSUFBbkIsQ0FBeUI1ckQsRUFBRW9FLENBQTNCLENBQThCcEUsRUFBRS9RLENBQWhDLENBQW1DK1EsRUFBRTdQLENBQXJDLEVBRUEsQ0FKTSxJQUlBLENBRU5vekMsR0FBRzBvQixVQUFILENBQWUsS0FBS0wsSUFBcEIsQ0FBMEI1ckQsQ0FBMUIsRUFFQSxDQUVELENBRUQsb0JBQUEsQ0FBc0J1akMsRUFBdEIsQ0FBMEJ2akMsQ0FBMUIsQ0FBOEIsQ0FFN0IsR0FBS0EsRUFBRUUsQ0FBRixHQUFRalUsU0FBYixDQUF5QixDQUV4QnMzQyxHQUFHMm9CLFVBQUgsQ0FBZSxLQUFLTixJQUFwQixDQUEwQjVyRCxDQUExQixFQUVBLENBSkQsSUFJTyxDQUVMdWpDLEdBQUc0b0IsU0FBSCxDQUFjLEtBQUtQLElBQW5CLENBQXlCNXJELEVBQUVFLENBQTNCLENBQThCRixFQUFFMFEsQ0FBaEMsQ0FBbUMxUSxFQUFFdVgsQ0FBckMsQ0FBd0N2WCxFQUFFaUcsQ0FBMUMsRUFFRCxDQUVELENBRUQ7RUFFQSxvQkFBQSxDQUFzQnM5QixFQUF0QixDQUEwQnZqQyxDQUExQixDQUE4QixDQUU3QnVqQyxHQUFHNm9CLGdCQUFILENBQXFCLEtBQUtSLElBQTFCLENBQWdDLEtBQWhDLENBQXVDNXJELEVBQUVxVCxRQUFGLEVBQWNyVCxDQUFyRCxFQUVBLENBRUQsb0JBQUEsQ0FBc0J1akMsRUFBdEIsQ0FBMEJ2akMsQ0FBMUIsQ0FBOEIsQ0FFN0IsR0FBS0EsRUFBRXFULFFBQUYsR0FBZXBuQixTQUFwQixDQUFnQyxDQUUvQnMzQyxHQUFHOG9CLGdCQUFILENBQXFCLEtBQUtULElBQTFCLENBQWdDLEtBQWhDLENBQXVDNXJELENBQXZDLEVBRUEsQ0FKRCxJQUlPLENBRU5zc0QsVUFBVXJ1RCxHQUFWLENBQWUrQixFQUFFcVQsUUFBakIsRUFDQWt3QixHQUFHOG9CLGdCQUFILENBQXFCLEtBQUtULElBQTFCLENBQWdDLEtBQWhDLENBQXVDVSxTQUF2QyxFQUVBLENBRUQsQ0FFRCxvQkFBQSxDQUFzQi9vQixFQUF0QixDQUEwQnZqQyxDQUExQixDQUE4QixDQUU3QixHQUFLQSxFQUFFcVQsUUFBRixHQUFlcG5CLFNBQXBCLENBQWdDLENBRS9CczNDLEdBQUdncEIsZ0JBQUgsQ0FBcUIsS0FBS1gsSUFBMUIsQ0FBZ0MsS0FBaEMsQ0FBdUM1ckQsQ0FBdkMsRUFFQSxDQUpELElBSU8sQ0FFTndzRCxVQUFVdnVELEdBQVYsQ0FBZStCLEVBQUVxVCxRQUFqQixFQUNBa3dCLEdBQUdncEIsZ0JBQUgsQ0FBcUIsS0FBS1gsSUFBMUIsQ0FBZ0MsS0FBaEMsQ0FBdUNZLFNBQXZDLEVBRUEsQ0FFRCxDQUVEO0VBRUEsbUJBQUEsQ0FBcUJqcEIsRUFBckIsQ0FBeUJ2akMsQ0FBekIsQ0FBNEI2akQsUUFBNUIsQ0FBdUMsQ0FFdEMsU0FBV0EsU0FBUzZILGdCQUFULEVBQVgsQ0FDQW5vQixHQUFHc29CLFNBQUgsQ0FBYyxLQUFLRCxJQUFuQixDQUF5QmEsSUFBekIsRUFDQTVJLFNBQVM2SSxZQUFULENBQXVCMXNELEdBQUsyc0QsWUFBNUIsQ0FBMENGLElBQTFDLEVBRUEsQ0FFRCxtQkFBQSxDQUFxQmxwQixFQUFyQixDQUF5QnZqQyxDQUF6QixDQUE0QjZqRCxRQUE1QixDQUF1QyxDQUV0QyxTQUFXQSxTQUFTNkgsZ0JBQVQsRUFBWCxDQUNBbm9CLEdBQUdzb0IsU0FBSCxDQUFjLEtBQUtELElBQW5CLENBQXlCYSxJQUF6QixFQUNBNUksU0FBUytJLGNBQVQsQ0FBeUI1c0QsR0FBSzZzRCxnQkFBOUIsQ0FBZ0RKLElBQWhELEVBRUEsQ0FFRDtFQUVBLG9CQUFBLENBQXNCbHBCLEVBQXRCLENBQTBCdmpDLENBQTFCLENBQThCLENBRTdCdWpDLEdBQUd1cEIsVUFBSCxDQUFlLEtBQUtsQixJQUFwQixDQUEwQjVyRCxDQUExQixFQUVBLENBRUQsb0JBQUEsQ0FBc0J1akMsRUFBdEIsQ0FBMEJ2akMsQ0FBMUIsQ0FBOEIsQ0FFN0J1akMsR0FBR3dwQixVQUFILENBQWUsS0FBS25CLElBQXBCLENBQTBCNXJELENBQTFCLEVBRUEsQ0FFRCxvQkFBQSxDQUFzQnVqQyxFQUF0QixDQUEwQnZqQyxDQUExQixDQUE4QixDQUU3QnVqQyxHQUFHeXBCLFVBQUgsQ0FBZSxLQUFLcEIsSUFBcEIsQ0FBMEI1ckQsQ0FBMUIsRUFFQSxDQUVEO0VBRUEsMEJBQUEsQ0FBNEIxWCxJQUE1QixDQUFtQyxDQUVsQyxPQUFTQSxJQUFULEVBRUMsV0FBQSxDQUFhLGlCQUFBLENBQW1CO0VBQ2hDLFdBQUEsQ0FBYSxrQkFBQSxDQUFvQjtFQUNqQyxXQUFBLENBQWEsa0JBQUEsQ0FBb0I7RUFDakMsV0FBQSxDQUFhLGtCQUFBLENBQW9CO0VBRWpDLFdBQUEsQ0FBYSxrQkFBQSxDQUFvQjtFQUNqQyxXQUFBLENBQWEsa0JBQUEsQ0FBb0I7RUFDakMsV0FBQSxDQUFhLGtCQUFBLENBQW9CO0VBRWpDLFdBQUEsQ0FBYSxXQUFBLENBQWEsaUJBQUEsQ0FBbUI7RUFDN0MsV0FBQSxDQUFhLGlCQUFBLENBQW1CO0VBRWhDLFdBQUEsQ0FBYSxXQUFBLENBQWEsaUJBQUEsQ0FBbUI7RUFDN0MsV0FBQSxDQUFhLFdBQUEsQ0FBYSxrQkFBQSxDQUFvQjtFQUM5QyxXQUFBLENBQWEsV0FBQSxDQUFhLGtCQUFBLENBQW9CO0VBQzlDLFdBQUEsQ0FBYSxXQUFBLENBQWEsa0JBQUEsQ0FBb0I7RUFqQi9DLENBcUJBLENBRUQ7RUFFQSxvQkFBQSxDQUFzQmk3QyxFQUF0QixDQUEwQnZqQyxDQUExQixDQUE4QixDQUU3QnVqQyxHQUFHMHBCLFVBQUgsQ0FBZSxLQUFLckIsSUFBcEIsQ0FBMEI1ckQsQ0FBMUIsRUFFQSxDQUNELG9CQUFBLENBQXNCdWpDLEVBQXRCLENBQTBCdmpDLENBQTFCLENBQThCLENBRTdCdWpDLEdBQUcycEIsVUFBSCxDQUFlLEtBQUt0QixJQUFwQixDQUEwQjVyRCxDQUExQixFQUVBLENBRUQ7RUFFQSxvQkFBQSxDQUFzQnVqQyxFQUF0QixDQUEwQnZqQyxDQUExQixDQUE4QixDQUU3QnVqQyxHQUFHdW9CLFVBQUgsQ0FBZSxLQUFLRixJQUFwQixDQUEwQnVCLFFBQVNudEQsQ0FBVCxDQUFZLEtBQUtrdEIsSUFBakIsQ0FBdUIsQ0FBdkIsQ0FBMUIsRUFFQSxDQUVELG9CQUFBLENBQXNCcVcsRUFBdEIsQ0FBMEJ2akMsQ0FBMUIsQ0FBOEIsQ0FFN0J1akMsR0FBRzBvQixVQUFILENBQWUsS0FBS0wsSUFBcEIsQ0FBMEJ1QixRQUFTbnRELENBQVQsQ0FBWSxLQUFLa3RCLElBQWpCLENBQXVCLENBQXZCLENBQTFCLEVBRUEsQ0FFRCxvQkFBQSxDQUFzQnFXLEVBQXRCLENBQTBCdmpDLENBQTFCLENBQThCLENBRTdCdWpDLEdBQUcyb0IsVUFBSCxDQUFlLEtBQUtOLElBQXBCLENBQTBCdUIsUUFBU250RCxDQUFULENBQVksS0FBS2t0QixJQUFqQixDQUF1QixDQUF2QixDQUExQixFQUVBLENBRUQ7RUFFQSxvQkFBQSxDQUFzQnFXLEVBQXRCLENBQTBCdmpDLENBQTFCLENBQThCLENBRTdCdWpDLEdBQUc2b0IsZ0JBQUgsQ0FBcUIsS0FBS1IsSUFBMUIsQ0FBZ0MsS0FBaEMsQ0FBdUN1QixRQUFTbnRELENBQVQsQ0FBWSxLQUFLa3RCLElBQWpCLENBQXVCLENBQXZCLENBQXZDLEVBRUEsQ0FFRCxvQkFBQSxDQUFzQnFXLEVBQXRCLENBQTBCdmpDLENBQTFCLENBQThCLENBRTdCdWpDLEdBQUc4b0IsZ0JBQUgsQ0FBcUIsS0FBS1QsSUFBMUIsQ0FBZ0MsS0FBaEMsQ0FBdUN1QixRQUFTbnRELENBQVQsQ0FBWSxLQUFLa3RCLElBQWpCLENBQXVCLENBQXZCLENBQXZDLEVBRUEsQ0FFRCxvQkFBQSxDQUFzQnFXLEVBQXRCLENBQTBCdmpDLENBQTFCLENBQThCLENBRTdCdWpDLEdBQUdncEIsZ0JBQUgsQ0FBcUIsS0FBS1gsSUFBMUIsQ0FBZ0MsS0FBaEMsQ0FBdUN1QixRQUFTbnRELENBQVQsQ0FBWSxLQUFLa3RCLElBQWpCLENBQXVCLEVBQXZCLENBQXZDLEVBRUEsQ0FFRDtFQUVBLG9CQUFBLENBQXNCcVcsRUFBdEIsQ0FBMEJ2akMsQ0FBMUIsQ0FBNkI2akQsUUFBN0IsQ0FBd0MsQ0FFdkMsTUFBUTdqRCxFQUFFMVMsTUFBVixDQUNDOC9ELE1BQVFDLGNBQWV4SixRQUFmLENBQXlCM3pDLENBQXpCLENBRFQsQ0FHQXF6QixHQUFHMnBCLFVBQUgsQ0FBZSxLQUFLdEIsSUFBcEIsQ0FBMEJ3QixLQUExQixFQUVBLElBQU0sTUFBUSxDQUFkLENBQWlCei9ELElBQU11aUIsQ0FBdkIsQ0FBMEIsRUFBR3ZpQixDQUE3QixDQUFpQyxDQUVoQ2syRCxTQUFTNkksWUFBVCxDQUF1QjFzRCxFQUFHclMsQ0FBSCxHQUFVZy9ELFlBQWpDLENBQStDUyxNQUFPei9ELENBQVAsQ0FBL0MsRUFFQSxDQUVELENBRUQsb0JBQUEsQ0FBc0I0MUMsRUFBdEIsQ0FBMEJ2akMsQ0FBMUIsQ0FBNkI2akQsUUFBN0IsQ0FBd0MsQ0FFdkMsTUFBUTdqRCxFQUFFMVMsTUFBVixDQUNDOC9ELE1BQVFDLGNBQWV4SixRQUFmLENBQXlCM3pDLENBQXpCLENBRFQsQ0FHQXF6QixHQUFHMnBCLFVBQUgsQ0FBZSxLQUFLdEIsSUFBcEIsQ0FBMEJ3QixLQUExQixFQUVBLElBQU0sTUFBUSxDQUFkLENBQWlCei9ELElBQU11aUIsQ0FBdkIsQ0FBMEIsRUFBR3ZpQixDQUE3QixDQUFpQyxDQUVoQ2syRCxTQUFTK0ksY0FBVCxDQUF5QjVzRCxFQUFHclMsQ0FBSCxHQUFVay9ELGdCQUFuQyxDQUFxRE8sTUFBT3ovRCxDQUFQLENBQXJELEVBRUEsQ0FFRCxDQUVEO0VBRUEsMkJBQUEsQ0FBNkJyRixJQUE3QixDQUFvQyxDQUVuQyxPQUFTQSxJQUFULEVBRUMsV0FBQSxDQUFhLGtCQUFBLENBQW9CO0VBQ2pDLFdBQUEsQ0FBYSxrQkFBQSxDQUFvQjtFQUNqQyxXQUFBLENBQWEsa0JBQUEsQ0FBb0I7RUFDakMsV0FBQSxDQUFhLGtCQUFBLENBQW9CO0VBRWpDLFdBQUEsQ0FBYSxrQkFBQSxDQUFvQjtFQUNqQyxXQUFBLENBQWEsa0JBQUEsQ0FBb0I7RUFDakMsV0FBQSxDQUFhLGtCQUFBLENBQW9CO0VBRWpDLFdBQUEsQ0FBYSxrQkFBQSxDQUFvQjtFQUNqQyxXQUFBLENBQWEsa0JBQUEsQ0FBb0I7RUFFakMsV0FBQSxDQUFhLFdBQUEsQ0FBYSxrQkFBQSxDQUFvQjtFQUM5QyxXQUFBLENBQWEsV0FBQSxDQUFhLGtCQUFBLENBQW9CO0VBQzlDLFdBQUEsQ0FBYSxXQUFBLENBQWEsa0JBQUEsQ0FBb0I7RUFDOUMsV0FBQSxDQUFhLFdBQUEsQ0FBYSxrQkFBQSxDQUFvQjtFQWpCL0MsQ0FxQkEsQ0FFRDtFQUVBLHNCQUFBLENBQXdCaU4sRUFBeEIsQ0FBNEIrM0QsVUFBNUIsQ0FBd0MxQixJQUF4QyxDQUErQyxDQUU5QyxLQUFLcjJELEVBQUwsQ0FBVUEsRUFBVixDQUNBLEtBQUtxMkQsSUFBTCxDQUFZQSxJQUFaLENBQ0EsS0FBS1osUUFBTCxDQUFnQnVDLGtCQUFtQkQsV0FBV2hsRSxJQUE5QixDQUFoQixDQUVBO0VBRUEsQ0FFRCx5QkFBQSxDQUEyQmlOLEVBQTNCLENBQStCKzNELFVBQS9CLENBQTJDMUIsSUFBM0MsQ0FBa0QsQ0FFakQsS0FBS3IyRCxFQUFMLENBQVVBLEVBQVYsQ0FDQSxLQUFLcTJELElBQUwsQ0FBWUEsSUFBWixDQUNBLEtBQUsxK0IsSUFBTCxDQUFZb2dDLFdBQVdwZ0MsSUFBdkIsQ0FDQSxLQUFLODlCLFFBQUwsQ0FBZ0J3QyxtQkFBb0JGLFdBQVdobEUsSUFBL0IsQ0FBaEIsQ0FFQTtFQUVBLENBRUQsMEJBQUEsQ0FBNEJpTixFQUE1QixDQUFpQyxDQUVoQyxLQUFLQSxFQUFMLENBQVVBLEVBQVYsQ0FFQWs0RCxpQkFBaUJsbEUsSUFBakIsQ0FBdUIsSUFBdkIsRUFBK0I7RUFFL0IsQ0FFRG1sRSxrQkFBa0I3bUUsU0FBbEIsQ0FBNEJta0UsUUFBNUIsQ0FBdUMsU0FBV3puQixFQUFYLENBQWVqNUMsS0FBZixDQUF1QjtFQUc3RDtFQUVBLFFBQVUsS0FBSzhnRSxHQUFmLENBRUEsSUFBTSxNQUFRLENBQVIsQ0FBV2w3QyxFQUFJazdDLElBQUk5OUQsTUFBekIsQ0FBaUNLLElBQU11aUIsQ0FBdkMsQ0FBMEMsRUFBR3ZpQixDQUE3QyxDQUFpRCxDQUVoRCxNQUFReTlELElBQUt6OUQsQ0FBTCxDQUFSLENBQ0FtdEMsRUFBRWt3QixRQUFGLENBQVl6bkIsRUFBWixDQUFnQmo1QyxNQUFPd3dDLEVBQUV2bEMsRUFBVCxDQUFoQixFQUVBLENBRUQsQ0FkRCxDQWdCQTtFQUVBO0VBRUEsZUFBaUIsMEJBQWpCLENBRUE7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUVBLG1CQUFBLENBQXFCbzRELFNBQXJCLENBQWdDQyxhQUFoQyxDQUFnRCxDQUUvQ0QsVUFBVXZDLEdBQVYsQ0FBY3QrRCxJQUFkLENBQW9COGdFLGFBQXBCLEVBQ0FELFVBQVVyd0IsR0FBVixDQUFlc3dCLGNBQWNyNEQsRUFBN0IsRUFBb0NxNEQsYUFBcEMsQ0FFQSxDQUVELHFCQUFBLENBQXVCTixVQUF2QixDQUFtQzFCLElBQW5DLENBQXlDK0IsU0FBekMsQ0FBcUQsQ0FFcEQsU0FBV0wsV0FBVzNqRSxJQUF0QixDQUNDa2tFLFdBQWFDLEtBQUt4Z0UsTUFEbkIsQ0FHQTtFQUNBeWdFLFdBQVdDLFNBQVgsQ0FBdUIsQ0FBdkIsQ0FFQSxPQUFZLENBRVgsVUFBWUQsV0FBVzc4RCxJQUFYLENBQWlCNDhELElBQWpCLENBQVosQ0FDQ0csU0FBV0YsV0FBV0MsU0FEdkIsQ0FHQ3o0RCxHQUFLZ1osTUFBTyxDQUFQLENBSE4sQ0FJQzIvQyxVQUFZMy9DLE1BQU8sQ0FBUCxJQUFlLEdBSjVCLENBS0M0L0MsVUFBWTUvQyxNQUFPLENBQVAsQ0FMYixDQU9BLEdBQUsyL0MsU0FBTCxDQUFpQjM0RCxHQUFLQSxHQUFLLENBQVYsQ0FBYTtFQUU5QixHQUFLNDRELFlBQWNsaUUsU0FBZCxFQUEyQmtpRSxZQUFjLEdBQWQsRUFBcUJGLFNBQVcsQ0FBWCxHQUFpQkosVUFBdEUsQ0FBbUY7RUFJbEZPLFdBQVlULFNBQVosQ0FBdUJRLFlBQWNsaUUsU0FBZCxDQUN0QixpQkFBQSxDQUFtQnNKLEVBQW5CLENBQXVCKzNELFVBQXZCLENBQW1DMUIsSUFBbkMsQ0FEc0IsQ0FFdEIsb0JBQUEsQ0FBc0JyMkQsRUFBdEIsQ0FBMEIrM0QsVUFBMUIsQ0FBc0MxQixJQUF0QyxDQUZELEVBSUEsTUFFQSxDQVZELElBVU87RUFJTixRQUFVK0IsVUFBVXJ3QixHQUFwQixDQUF5QnB5QyxLQUFPb3lDLElBQUsvbkMsRUFBTCxDQUFoQyxDQUVBLEdBQUtySyxPQUFTZSxTQUFkLENBQTBCLENBRXpCZixLQUFPLHFCQUFBLENBQXVCcUssRUFBdkIsQ0FBUCxDQUNBNjRELFdBQVlULFNBQVosQ0FBdUJ6aUUsSUFBdkIsRUFFQSxDQUVEeWlFLFVBQVl6aUUsSUFBWixDQUVBLENBRUQsQ0FFRCxDQUVEO0VBRUEsc0JBQUEsQ0FBd0JxNEMsRUFBeEIsQ0FBNEJtbkIsT0FBNUIsQ0FBcUM3RyxRQUFyQyxDQUFnRCxDQUUvQzRKLGlCQUFpQmxsRSxJQUFqQixDQUF1QixJQUF2QixFQUVBLEtBQUtzN0QsUUFBTCxDQUFnQkEsUUFBaEIsQ0FFQSxNQUFRdGdCLEdBQUc4cUIsbUJBQUgsQ0FBd0IzRCxPQUF4QixDQUFpQ25uQixHQUFHK3FCLGVBQXBDLENBQVIsQ0FFQSxJQUFNLE1BQVEsQ0FBZCxDQUFpQjNnRSxFQUFJdWlCLENBQXJCLENBQXdCLEVBQUd2aUIsQ0FBM0IsQ0FBK0IsQ0FFOUIsU0FBVzQxQyxHQUFHZ3JCLGdCQUFILENBQXFCN0QsT0FBckIsQ0FBOEIvOEQsQ0FBOUIsQ0FBWCxDQUNDaStELEtBQU9yb0IsR0FBR2lyQixrQkFBSCxDQUF1QjlELE9BQXZCLENBQWdDditELEtBQUt4QyxJQUFyQyxDQURSLENBR0E4a0UsYUFBY3RpRSxJQUFkLENBQW9CeS9ELElBQXBCLENBQTBCLElBQTFCLEVBRUEsQ0FFRCxDQUVEOEMsY0FBYzduRSxTQUFkLENBQXdCbWtFLFFBQXhCLENBQW1DLFNBQVd6bkIsRUFBWCxDQUFlNTVDLElBQWYsQ0FBcUJXLEtBQXJCLENBQTZCLENBRS9ELE1BQVEsS0FBS2d6QyxHQUFMLENBQVUzekMsSUFBVixDQUFSLENBRUEsR0FBS214QyxJQUFNN3VDLFNBQVgsQ0FBdUI2dUMsRUFBRWt3QixRQUFGLENBQVl6bkIsRUFBWixDQUFnQmo1QyxLQUFoQixDQUF1QixLQUFLdTVELFFBQTVCLEVBRXZCLENBTkQsQ0FRQTZLLGNBQWM3bkUsU0FBZCxDQUF3QjhuRSxXQUF4QixDQUFzQyxTQUFXcHJCLEVBQVgsQ0FBZXAyQyxNQUFmLENBQXVCeEQsSUFBdkIsQ0FBOEIsQ0FFbkUsTUFBUXdELE9BQVF4RCxJQUFSLENBQVIsQ0FFQSxHQUFLcVcsSUFBTS9ULFNBQVgsQ0FBdUIsS0FBSysrRCxRQUFMLENBQWV6bkIsRUFBZixDQUFtQjU1QyxJQUFuQixDQUF5QnFXLENBQXpCLEVBRXZCLENBTkQsQ0FTQTtFQUVBMHVELGNBQWNFLE1BQWQsQ0FBdUIsU0FBV3JyQixFQUFYLENBQWU2bkIsR0FBZixDQUFvQnZpRSxNQUFwQixDQUE0Qmc3RCxRQUE1QixDQUF1QyxDQUU3RCxJQUFNLE1BQVEsQ0FBUixDQUFXM3pDLEVBQUlrN0MsSUFBSTk5RCxNQUF6QixDQUFpQ0ssSUFBTXVpQixDQUF2QyxDQUEwQyxFQUFHdmlCLENBQTdDLENBQWlELENBRWhELE1BQVF5OUQsSUFBS3o5RCxDQUFMLENBQVIsQ0FDQ3FTLEVBQUluWCxPQUFRaXlDLEVBQUV2bEMsRUFBVixDQURMLENBR0EsR0FBS3lLLEVBQUVzMUMsV0FBRixHQUFrQixLQUF2QixDQUErQjtFQUc5QnhhLEVBQUVrd0IsUUFBRixDQUFZem5CLEVBQVosQ0FBZ0J2akMsRUFBRTFWLEtBQWxCLENBQXlCdTVELFFBQXpCLEVBRUEsQ0FFRCxDQUVELENBaEJELENBa0JBNkssY0FBY0csWUFBZCxDQUE2QixTQUFXekQsR0FBWCxDQUFnQnZpRSxNQUFoQixDQUF5QixDQUVyRCxNQUFRLEVBQVIsQ0FFQSxJQUFNLE1BQVEsQ0FBUixDQUFXcW5CLEVBQUlrN0MsSUFBSTk5RCxNQUF6QixDQUFpQ0ssSUFBTXVpQixDQUF2QyxDQUEwQyxFQUFHdmlCLENBQTdDLENBQWlELENBRWhELE1BQVF5OUQsSUFBS3o5RCxDQUFMLENBQVIsQ0FDQSxHQUFLbXRDLEVBQUV2bEMsRUFBRixVQUFMLENBQXNCNk8sRUFBRXRYLElBQUYsQ0FBUWd1QyxDQUFSLEVBRXRCLENBRUQsUUFBQSxDQUVBLENBYkQsQ0FlQTs7S0FJQSx1QkFBQSxDQUF5QmEsTUFBekIsQ0FBa0MsQ0FFakMsVUFBWUEsT0FBT3ZuQyxLQUFQLENBQWMsSUFBZCxDQUFaLENBRUEsSUFBTSxNQUFRLENBQWQsQ0FBaUJ6RyxFQUFJbzhELE1BQU16OEQsTUFBM0IsQ0FBbUNLLEdBQW5DLENBQTBDLENBRXpDbzhELE1BQU9wOEQsQ0FBUCxFQUFlQSxFQUFJLENBQU4sQ0FBWSxJQUFaLENBQW1CbzhELE1BQU9wOEQsQ0FBUCxDQUFoQyxDQUVBLENBRUQsYUFBYW1oRSxJQUFOLENBQVksSUFBWixDQUFQLENBRUEsQ0FFRCxvQkFBQSxDQUFzQnZyQixFQUF0QixDQUEwQmo3QyxJQUExQixDQUFnQ3F6QyxNQUFoQyxDQUF5QyxDQUV4QyxXQUFhNEgsR0FBR3dyQixZQUFILENBQWlCem1FLElBQWpCLENBQWIsQ0FFQWk3QyxHQUFHeXJCLFlBQUgsQ0FBaUJDLE1BQWpCLENBQXlCdHpCLE1BQXpCLEVBQ0E0SCxHQUFHMnJCLGFBQUgsQ0FBa0JELE1BQWxCLEVBRUEsR0FBSzFyQixHQUFHNHJCLGtCQUFILENBQXVCRixNQUF2QixDQUErQjFyQixHQUFHNnJCLGNBQWxDLElBQXVELEtBQTVELENBQW9FLENBRW5FeHNELFFBQVFNLEtBQVIsQ0FBZSw4Q0FBZixFQUVBLENBRUQsR0FBS3FnQyxHQUFHOHJCLGdCQUFILENBQXFCSixNQUFyQixJQUFrQyxFQUF2QyxDQUE0QyxDQUUzQ3JzRCxRQUFRNlAsSUFBUixDQUFjLDBDQUFkLENBQTBEbnFCLE9BQVNpN0MsR0FBR29pQixhQUFaLENBQTRCLFFBQTVCLENBQXVDLFVBQWpHLENBQTZHcGlCLEdBQUc4ckIsZ0JBQUgsQ0FBcUJKLE1BQXJCLENBQTdHLENBQTRJSyxlQUFnQjN6QixNQUFoQixDQUE1SSxFQUVBLENBRUQ7RUFDQTtFQUVBLGFBQUEsQ0FFQSxDQUVEOztLQUlBLG1CQUFxQixDQUFyQixDQUVBLDhCQUFBLENBQWdDN1QsUUFBaEMsQ0FBMkMsQ0FFMUMsT0FBU0EsUUFBVCxFQUVDLG1CQUFBLENBQ0MsT0FBTyxDQUFFLFFBQUYsQ0FBWSxXQUFaLENBQVAsQ0FDRCxpQkFBQSxDQUNDLE9BQU8sQ0FBRSxNQUFGLENBQVUsV0FBVixDQUFQLENBQ0QsaUJBQUEsQ0FDQyxPQUFPLENBQUUsTUFBRixDQUFVLFdBQVYsQ0FBUCxDQUNELGtCQUFBLENBQ0MsT0FBTyxDQUFFLE1BQUYsQ0FBVSxnQkFBVixDQUFQLENBQ0QsbUJBQUEsQ0FDQyxPQUFPLENBQUUsTUFBRixDQUFVLGlCQUFWLENBQVAsQ0FDRCxpQkFBQSxDQUNDLE9BQU8sQ0FBRSxNQUFGLENBQVUsa0JBQVYsQ0FBUCxDQUNELGtCQUFBLENBQ0MsT0FBTyxDQUFFLE9BQUYsQ0FBVyxrQ0FBWCxDQUFQLENBQ0QsUUFDQyxlQUFNLENBQVcseUJBQTJCQSxRQUF0QyxDQUFOLENBakJGLENBcUJBLENBRUQsaUNBQUEsQ0FBbUN5bkMsWUFBbkMsQ0FBaUR6bkMsUUFBakQsQ0FBNEQsQ0FFM0QsZUFBaUIwbkMsc0JBQXVCMW5DLFFBQXZCLENBQWpCLENBQ0EsT0FBTyxRQUFVeW5DLFlBQVYsQ0FBeUIsMEJBQXpCLENBQXNEenpCLFdBQVksQ0FBWixDQUF0RCxDQUF3RSxVQUF4RSxDQUFxRkEsV0FBWSxDQUFaLENBQXJGLENBQXVHLEtBQTlHLENBRUEsQ0FFRCxpQ0FBQSxDQUFtQ3l6QixZQUFuQyxDQUFpRHpuQyxRQUFqRCxDQUE0RCxDQUUzRCxlQUFpQjBuQyxzQkFBdUIxbkMsUUFBdkIsQ0FBakIsQ0FDQSxPQUFPLFFBQVV5bkMsWUFBVixDQUF5QixrQ0FBekIsQ0FBOER6ekIsV0FBWSxDQUFaLENBQTlELENBQWdGQSxXQUFZLENBQVosQ0FBaEYsQ0FBa0csS0FBekcsQ0FFQSxDQUVELCtCQUFBLENBQWlDeXpCLFlBQWpDLENBQStDRSxXQUEvQyxDQUE2RCxDQUU1RCxtQkFBQSxDQUVBLE9BQVNBLFdBQVQsRUFFQyxzQkFBQSxDQUNDQyxnQkFBa0IsUUFBbEIsQ0FDQSxNQUVELHdCQUFBLENBQ0NBLGdCQUFrQixVQUFsQixDQUNBLE1BRUQsMEJBQUEsQ0FDQ0EsZ0JBQWtCLFlBQWxCLENBQ0EsTUFFRCxzQkFBQSxDQUNDQSxnQkFBa0IsaUJBQWxCLENBQ0EsTUFFRCxRQUNDLGVBQU0sQ0FBVyw0QkFBOEJELFdBQXpDLENBQU4sQ0FuQkYsQ0F1QkEsT0FBTyxRQUFVRixZQUFWLENBQXlCLDBCQUF6QixDQUFzREcsZUFBdEQsQ0FBd0UseUJBQS9FLENBRUEsQ0FFRCwyQkFBQSxDQUE2QjNpRCxVQUE3QixDQUF5QzI4QixVQUF6QyxDQUFxRGltQixrQkFBckQsQ0FBMEUsQ0FFekU1aUQsV0FBYUEsWUFBYyxFQUEzQixDQUVBLFdBQWEsQ0FDVkEsV0FBV2l2QyxXQUFYLEVBQTBCdFMsV0FBV2ttQixZQUFyQyxFQUFxRGxtQixXQUFXaEwsT0FBaEUsRUFBMkVnTCxXQUFXN0ssU0FBdEYsRUFBbUc2SyxXQUFXaVAsV0FBaEgsQ0FBZ0ksaURBQWhJLENBQW9MLEVBRHhLLENBRVosQ0FBRTVyQyxXQUFXa3ZDLFNBQVgsRUFBd0J2UyxXQUFXdWMsc0JBQXJDLEdBQWlFMEosbUJBQW1CdCtELEdBQW5CLENBQXdCLGdCQUF4QixDQUFqRSxDQUE4Ryx1Q0FBOUcsQ0FBd0osRUFGNUksQ0FHVjBiLFdBQVdtdkMsV0FBYixFQUE4QnlULG1CQUFtQnQrRCxHQUFuQixDQUF3QixvQkFBeEIsQ0FBOUIsQ0FBK0UsMENBQS9FLENBQTRILEVBSGhILENBSVosQ0FBRTBiLFdBQVdvdkMsZ0JBQVgsRUFBK0J6UyxXQUFXOUwsTUFBNUMsR0FBd0QreEIsbUJBQW1CdCtELEdBQW5CLENBQXdCLHdCQUF4QixDQUF4RCxDQUE2RywrQ0FBN0csQ0FBK0osRUFKbkosQ0FBYixDQU9BLGNBQWN5WixNQUFQLENBQWUra0QsZUFBZixFQUFpQ2YsSUFBakMsQ0FBdUMsSUFBdkMsQ0FBUCxDQUVBLENBRUQsd0JBQUEsQ0FBMEJoVCxPQUExQixDQUFvQyxDQUVuQyxXQUFhLEVBQWIsQ0FFQSxJQUFNLFFBQU4sV0FBQSxDQUE0QixDQUUzQixVQUFZQSxRQUFTbnlELElBQVQsQ0FBWixDQUVBLEdBQUtXLFFBQVUsS0FBZixDQUF1QixTQUV2QndsRSxPQUFPaGpFLElBQVAsQ0FBYSxXQUFhbkQsSUFBYixDQUFvQixHQUFwQixDQUEwQlcsS0FBdkMsRUFFQSxDQUVELGNBQWN3a0UsSUFBUCxDQUFhLElBQWIsQ0FBUCxDQUVBLENBRUQsZ0NBQUEsQ0FBa0N2ckIsRUFBbEMsQ0FBc0NtbkIsT0FBdEMsQ0FBZ0QsQ0FFL0MsZUFBaUIsRUFBakIsQ0FFQSxNQUFRbm5CLEdBQUc4cUIsbUJBQUgsQ0FBd0IzRCxPQUF4QixDQUFpQ25uQixHQUFHd3NCLGlCQUFwQyxDQUFSLENBRUEsSUFBTSxNQUFRLENBQWQsQ0FBaUJwaUUsRUFBSXVpQixDQUFyQixDQUF3QnZpQixHQUF4QixDQUErQixDQUU5QixTQUFXNDFDLEdBQUd5c0IsZUFBSCxDQUFvQnRGLE9BQXBCLENBQTZCLzhELENBQTdCLENBQVgsQ0FDQSxTQUFXeEIsS0FBS3hDLElBQWhCLENBRUE7RUFFQXNrQyxXQUFZdGtDLElBQVosRUFBcUI0NUMsR0FBRzBzQixpQkFBSCxDQUFzQnZGLE9BQXRCLENBQStCL2dFLElBQS9CLENBQXJCLENBRUEsQ0FFRCxpQkFBQSxDQUVBLENBRUQsd0JBQUEsQ0FBMEJneUMsTUFBMUIsQ0FBbUMsQ0FFbEMsZ0JBQWtCLEVBQWxCLENBRUEsQ0FFRCx5QkFBQSxDQUEyQkEsTUFBM0IsQ0FBbUMrTixVQUFuQyxDQUFnRCxDQUUvQyxjQUNFd21CLE9BREssQ0FDSSxpQkFESixDQUN1QnhtQixXQUFXeW1CLFlBRGxDLEVBRUxELE9BRkssQ0FFSSxrQkFGSixDQUV3QnhtQixXQUFXMG1CLGFBRm5DLEVBR0xGLE9BSEssQ0FHSSx1QkFISixDQUc2QnhtQixXQUFXMm1CLGlCQUh4QyxFQUlMSCxPQUpLLENBSUksbUJBSkosQ0FJeUJ4bUIsV0FBVzRtQixjQUpwQyxFQUtMSixPQUxLLENBS0ksa0JBTEosQ0FLd0J4bUIsV0FBVzZtQixhQUxuQyxDQUFQLENBT0EsQ0FFRCxpQ0FBQSxDQUFtQzUwQixNQUFuQyxDQUEyQytOLFVBQTNDLENBQXdELENBRXZELGNBQ0V3bUIsT0FESyxDQUNJLHNCQURKLENBQzRCeG1CLFdBQVc4bUIsaUJBRHZDLEVBRUxOLE9BRkssQ0FFSSx3QkFGSixDQUVnQ3htQixXQUFXOG1CLGlCQUFYLENBQStCOW1CLFdBQVcrbUIsbUJBRjFFLENBQVAsQ0FJQSxDQUVELHNCQUFBLENBQXdCOTBCLE1BQXhCLENBQWlDLENBRWhDLFlBQWMsaUNBQWQsQ0FFQSxnQkFBQSxDQUFrQnB0QixLQUFsQixDQUF5Qm1pRCxPQUF6QixDQUFtQyxDQUVsQyxZQUFjL3VCLFlBQWErdUIsT0FBYixDQUFkLENBRUEsR0FBS1IsVUFBWWprRSxTQUFqQixDQUE2QixDQUU1QixlQUFNLENBQVcsNkJBQStCeWtFLE9BQS9CLENBQXlDLEdBQXBELENBQU4sQ0FFQSxDQUVELHFCQUFzQlIsT0FBZixDQUFQLENBRUEsQ0FFRCxjQUFjQSxPQUFQLENBQWdCUyxPQUFoQixDQUF5QlQsT0FBekIsQ0FBUCxDQUVBLENBRUQsb0JBQUEsQ0FBc0J2MEIsTUFBdEIsQ0FBK0IsQ0FFOUIsWUFBYyw4RkFBZCxDQUVBLGdCQUFBLENBQWtCcHRCLEtBQWxCLENBQXlCNGlCLEtBQXpCLENBQWdDRSxHQUFoQyxDQUFxQ3UvQixPQUFyQyxDQUErQyxDQUU5QyxXQUFhLEVBQWIsQ0FFQSxJQUFNLE1BQVE3MEIsU0FBVTVLLEtBQVYsQ0FBZCxDQUFpQ3hqQyxFQUFJb3VDLFNBQVUxSyxHQUFWLENBQXJDLENBQXNEMWpDLEdBQXRELENBQTZELENBRTVEa2pFLFFBQVVELFFBQVFWLE9BQVIsQ0FBaUIsVUFBakIsQ0FBNkIsS0FBT3ZpRSxDQUFQLENBQVcsSUFBeEMsQ0FBVixDQUVBLENBRUQsYUFBQSxDQUVBLENBRUQsY0FBY3VpRSxPQUFQLENBQWdCUyxPQUFoQixDQUF5QlQsT0FBekIsQ0FBUCxDQUVBLENBRUQscUJBQUEsQ0FBdUJyTSxRQUF2QixDQUFpQzkyQyxVQUFqQyxDQUE2QytqRCxJQUE3QyxDQUFtRGxuQixRQUFuRCxDQUE2RHFsQixNQUE3RCxDQUFxRXZsQixVQUFyRSxDQUFrRixDQUVqRixPQUFTbWEsU0FBUzM3RCxPQUFsQixDQUVBLFlBQWMwaEQsU0FBU2tTLE9BQXZCLENBRUEsaUJBQW1CbVQsT0FBT3Z0QixZQUExQixDQUNBLG1CQUFxQnV0QixPQUFPcnRCLGNBQTVCLENBRUEsd0JBQTBCLHNCQUExQixDQUVBLEdBQUs4SCxXQUFXcW5CLGFBQVgsR0FBNkJDLFlBQWxDLENBQWlELENBRWhEQyxvQkFBc0Isb0JBQXRCLENBRUEsQ0FKRCxRQUlZdm5CLFdBQVdxbkIsYUFBWCxHQUE2QkcsZ0JBQWxDLENBQXFELENBRTNERCxvQkFBc0IseUJBQXRCLENBRUEsQ0FFRCxxQkFBdUIsa0JBQXZCLENBQ0EscUJBQXVCLHdCQUF2QixDQUNBLHlCQUEyQiwwQkFBM0IsQ0FFQSxHQUFLdm5CLFdBQVc5TCxNQUFoQixDQUF5QixDQUV4QixPQUFTZ00sU0FBU2hNLE1BQVQsQ0FBZ0JyVyxPQUF6QixFQUVDLDBCQUFBLENBQ0EsMEJBQUEsQ0FDQzRwQyxpQkFBbUIsa0JBQW5CLENBQ0EsTUFFRCw0QkFBQSxDQUNBLDRCQUFBLENBQ0NBLGlCQUFtQixxQkFBbkIsQ0FDQSxNQUVELHFDQUFBLENBQ0EscUNBQUEsQ0FDQ0EsaUJBQW1CLHFCQUFuQixDQUNBLE1BRUQsK0JBQUEsQ0FDQ0EsaUJBQW1CLG9CQUFuQixDQUNBLE1BbkJGLENBdUJBLE9BQVN2bkIsU0FBU2hNLE1BQVQsQ0FBZ0JyVyxPQUF6QixFQUVDLDBCQUFBLENBQ0EscUNBQUEsQ0FDQzZwQyxpQkFBbUIsd0JBQW5CLENBQ0EsTUFMRixDQVNBLE9BQVN4bkIsU0FBUzhSLE9BQWxCLEVBRUMsc0JBQUEsQ0FDQzJWLHFCQUF1QiwwQkFBdkIsQ0FDQSxNQUVELGlCQUFBLENBQ0NBLHFCQUF1QixxQkFBdkIsQ0FDQSxNQUVELGlCQUFBLENBQ0NBLHFCQUF1QixxQkFBdkIsQ0FDQSxNQVpGLENBZ0JBLENBRUQsc0JBQTBCeE4sU0FBUzFuQixXQUFULENBQXVCLENBQXpCLENBQStCMG5CLFNBQVMxbkIsV0FBeEMsQ0FBc0QsR0FBOUUsQ0FFQTtFQUVBO0VBRUEscUJBQXVCbTFCLG1CQUFvQjFuQixTQUFTNzhCLFVBQTdCLENBQXlDMjhCLFVBQXpDLENBQXFEMzhCLFVBQXJELENBQXZCLENBRUEsa0JBQW9Cd2tELGdCQUFpQnpWLE9BQWpCLENBQXBCLENBRUE7RUFFQSxZQUFjdlksR0FBR2l1QixhQUFILEVBQWQsQ0FFQSxnQkFBQSxDQUFrQkMsY0FBbEIsQ0FFQSxHQUFLN25CLFNBQVM4bkIsbUJBQWQsQ0FBb0MsQ0FFbkNDLGFBQWUsQ0FFZEMsYUFGYyxFQUliOW1ELE1BSmEsQ0FJTCtrRCxlQUpLLEVBSWFmLElBSmIsQ0FJbUIsSUFKbkIsQ0FBZixDQU1BLEdBQUs2QyxhQUFhcmtFLE1BQWIsQ0FBc0IsQ0FBM0IsQ0FBK0IsQ0FFOUJxa0UsY0FBZ0IsSUFBaEIsQ0FFQSxDQUVERixlQUFpQixDQUVoQkksZ0JBRmdCLENBR2hCRCxhQUhnQixFQUtmOW1ELE1BTGUsQ0FLUCtrRCxlQUxPLEVBS1dmLElBTFgsQ0FLaUIsSUFMakIsQ0FBakIsQ0FPQSxHQUFLMkMsZUFBZW5rRSxNQUFmLENBQXdCLENBQTdCLENBQWlDLENBRWhDbWtFLGdCQUFrQixJQUFsQixDQUVBLENBRUQsQ0EzQkQsSUEyQk8sQ0FFTkUsYUFBZSxDQUVkLGFBQWVqb0IsV0FBV3dHLFNBQTFCLENBQXNDLFNBRnhCLENBR2QsYUFBZXhHLFdBQVd3RyxTQUExQixDQUFzQyxPQUh4QixDQUtkLHVCQUF5QitlLE9BQU90bEUsSUFMbEIsQ0FPZGlvRSxhQVBjLENBU2Rsb0IsV0FBV29vQixzQkFBWCxDQUFvQyx5QkFBcEMsQ0FBZ0UsRUFUbEQsQ0FXZCx3QkFBMEJDLGlCQVhaLENBYWQscUJBQXVCcm9CLFdBQVdzb0IsUUFicEIsQ0FjWnRvQixXQUFXdW9CLE1BQVgsRUFBcUJ2b0IsV0FBV2pLLEdBQWxDLENBQTBDLGlCQUExQyxDQUE4RCxFQWRoRCxDQWVaaUssV0FBV3VvQixNQUFYLEVBQXFCdm9CLFdBQVd3b0IsTUFBbEMsQ0FBNkMsa0JBQTdDLENBQWtFLEVBZnBELENBaUJkeG9CLFdBQVdwTSxHQUFYLENBQWlCLGlCQUFqQixDQUFxQyxFQWpCdkIsQ0FrQmRvTSxXQUFXOUwsTUFBWCxDQUFvQixvQkFBcEIsQ0FBMkMsRUFsQjdCLENBbUJkOEwsV0FBVzlMLE1BQVgsQ0FBb0IsV0FBYXd6QixnQkFBakMsQ0FBb0QsRUFuQnRDLENBb0JkMW5CLFdBQVdyTCxRQUFYLENBQXNCLHNCQUF0QixDQUErQyxFQXBCakMsQ0FxQmRxTCxXQUFXeEwsS0FBWCxDQUFtQixtQkFBbkIsQ0FBeUMsRUFyQjNCLENBc0Jkd0wsV0FBV2xMLFdBQVgsQ0FBeUIseUJBQXpCLENBQXFELEVBdEJ2QyxDQXVCZGtMLFdBQVdoTCxPQUFYLENBQXFCLHFCQUFyQixDQUE2QyxFQXZCL0IsQ0F3QmRnTCxXQUFXN0ssU0FBWCxDQUF1Qix1QkFBdkIsQ0FBaUQsRUF4Qm5DLENBeUJkNkssV0FBVzFLLGVBQVgsRUFBOEIwSyxXQUFXb29CLHNCQUF6QyxDQUFrRSw2QkFBbEUsQ0FBa0csRUF6QnBGLENBMEJkcG9CLFdBQVdoTSxXQUFYLENBQXlCLHlCQUF6QixDQUFxRCxFQTFCdkMsQ0EyQmRnTSxXQUFXdEssWUFBWCxDQUEwQiwwQkFBMUIsQ0FBdUQsRUEzQnpDLENBNEJkc0ssV0FBV3BLLFlBQVgsQ0FBMEIsMEJBQTFCLENBQXVELEVBNUJ6QyxDQTZCZG9LLFdBQVdsTSxRQUFYLENBQXNCLHNCQUF0QixDQUErQyxFQTdCakMsQ0E4QmRrTSxXQUFXNEIsWUFBWCxDQUEwQixtQkFBMUIsQ0FBZ0QsRUE5QmxDLENBZ0NkNUIsV0FBV2lQLFdBQVgsQ0FBeUIscUJBQXpCLENBQWlELEVBaENuQyxDQWtDZGpQLFdBQVc2UixRQUFYLENBQXNCLHNCQUF0QixDQUErQyxFQWxDakMsQ0FtQ2Q3UixXQUFXeW9CLGdCQUFYLENBQThCLHNCQUE5QixDQUF1RCxFQW5DekMsQ0FxQ2R6b0IsV0FBV2tDLFlBQVgsQ0FBMEIsMEJBQTFCLENBQXVELEVBckN6QyxDQXNDZGxDLFdBQVdtQyxZQUFYLEVBQTJCbkMsV0FBV2lQLFdBQVgsR0FBMkIsS0FBdEQsQ0FBOEQsMEJBQTlELENBQTJGLEVBdEM3RSxDQXVDZGpQLFdBQVcwb0IsV0FBWCxDQUF5QixzQkFBekIsQ0FBa0QsRUF2Q3BDLENBd0NkMW9CLFdBQVcyb0IsU0FBWCxDQUF1QixvQkFBdkIsQ0FBOEMsRUF4Q2hDLENBMENkM29CLFdBQVc0b0IsZ0JBQVgsQ0FBOEIsdUJBQTlCLENBQXdELEVBMUMxQyxDQTJDZDVvQixXQUFXNG9CLGdCQUFYLENBQThCLFdBQWFyQixtQkFBM0MsQ0FBaUUsRUEzQ25ELENBNkNkdm5CLFdBQVdzUixlQUFYLENBQTZCLDZCQUE3QixDQUE2RCxFQTdDL0MsQ0ErQ2R0UixXQUFXdWMsc0JBQVgsQ0FBb0MseUJBQXBDLENBQWdFLEVBL0NsRCxDQWdEZHZjLFdBQVd1YyxzQkFBWCxFQUFxQ2w1QyxXQUFXMWIsR0FBWCxDQUFnQixnQkFBaEIsQ0FBckMsQ0FBMEUsNkJBQTFFLENBQTBHLEVBaEQ1RixDQWtEZCwyQkFsRGMsQ0FtRGQsK0JBbkRjLENBb0RkLGdDQXBEYyxDQXFEZCwwQkFyRGMsQ0FzRGQsNEJBdERjLENBdURkLDhCQXZEYyxDQXlEZCwwQkF6RGMsQ0EwRGQsd0JBMURjLENBMkRkLG9CQTNEYyxDQTZEZCxrQkE3RGMsQ0ErRGQsd0JBL0RjLENBaUVkLFFBakVjLENBbUVkLHlCQW5FYyxDQXFFZCwrQkFyRWMsQ0FzRWQsK0JBdEVjLENBdUVkLCtCQXZFYyxDQXdFZCwrQkF4RWMsQ0EwRWQsMEJBMUVjLENBNEVkLGdDQTVFYyxDQTZFZCxnQ0E3RWMsQ0E4RWQsZ0NBOUVjLENBK0VkLGdDQS9FYyxDQWlGZCxRQWpGYyxDQW1GZCxnQ0FuRmMsQ0FvRmQsZ0NBcEZjLENBcUZkLGdDQXJGYyxDQXNGZCxnQ0F0RmMsQ0F3RmQsU0F4RmMsQ0EwRmQsUUExRmMsQ0E0RmQscUJBNUZjLENBOEZkLDRCQTlGYyxDQStGZCw2QkEvRmMsQ0FpR2QsUUFqR2MsQ0FtR2QsSUFuR2MsRUFxR2J5WixNQXJHYSxDQXFHTCtrRCxlQXJHSyxFQXFHYWYsSUFyR2IsQ0FxR21CLElBckduQixDQUFmLENBdUdBMkMsZUFBaUIsQ0FFaEJJLGdCQUZnQixDQUloQixhQUFlbm9CLFdBQVd3RyxTQUExQixDQUFzQyxTQUp0QixDQUtoQixhQUFleEcsV0FBV3dHLFNBQTFCLENBQXNDLE9BTHRCLENBT2hCLHVCQUF5QitlLE9BQU90bEUsSUFQaEIsQ0FTaEJpb0UsYUFUZ0IsQ0FXaEJsb0IsV0FBVzBRLFNBQVgsQ0FBdUIscUJBQXVCMVEsV0FBVzBRLFNBQXpELENBQXFFLEVBWHJELENBYWhCLHdCQUEwQjJYLGlCQWJWLENBZWRyb0IsV0FBV3VvQixNQUFYLEVBQXFCdm9CLFdBQVdqSyxHQUFsQyxDQUEwQyxpQkFBMUMsQ0FBOEQsRUFmOUMsQ0FnQmRpSyxXQUFXdW9CLE1BQVgsRUFBcUJ2b0IsV0FBV3dvQixNQUFsQyxDQUE2QyxrQkFBN0MsQ0FBa0UsRUFoQmxELENBa0JoQnhvQixXQUFXcE0sR0FBWCxDQUFpQixpQkFBakIsQ0FBcUMsRUFsQnJCLENBbUJoQm9NLFdBQVc5TCxNQUFYLENBQW9CLG9CQUFwQixDQUEyQyxFQW5CM0IsQ0FvQmhCOEwsV0FBVzlMLE1BQVgsQ0FBb0IsV0FBYXV6QixnQkFBakMsQ0FBb0QsRUFwQnBDLENBcUJoQnpuQixXQUFXOUwsTUFBWCxDQUFvQixXQUFhd3pCLGdCQUFqQyxDQUFvRCxFQXJCcEMsQ0FzQmhCMW5CLFdBQVc5TCxNQUFYLENBQW9CLFdBQWF5ekIsb0JBQWpDLENBQXdELEVBdEJ4QyxDQXVCaEIzbkIsV0FBV3JMLFFBQVgsQ0FBc0Isc0JBQXRCLENBQStDLEVBdkIvQixDQXdCaEJxTCxXQUFXeEwsS0FBWCxDQUFtQixtQkFBbkIsQ0FBeUMsRUF4QnpCLENBeUJoQndMLFdBQVdsTCxXQUFYLENBQXlCLHlCQUF6QixDQUFxRCxFQXpCckMsQ0EwQmhCa0wsV0FBV2hMLE9BQVgsQ0FBcUIscUJBQXJCLENBQTZDLEVBMUI3QixDQTJCaEJnTCxXQUFXN0ssU0FBWCxDQUF1Qix1QkFBdkIsQ0FBaUQsRUEzQmpDLENBNEJoQjZLLFdBQVdoTSxXQUFYLENBQXlCLHlCQUF6QixDQUFxRCxFQTVCckMsQ0E2QmhCZ00sV0FBV3RLLFlBQVgsQ0FBMEIsMEJBQTFCLENBQXVELEVBN0J2QyxDQThCaEJzSyxXQUFXcEssWUFBWCxDQUEwQiwwQkFBMUIsQ0FBdUQsRUE5QnZDLENBK0JoQm9LLFdBQVdsTSxRQUFYLENBQXNCLHNCQUF0QixDQUErQyxFQS9CL0IsQ0FnQ2hCa00sV0FBVzRCLFlBQVgsQ0FBMEIsbUJBQTFCLENBQWdELEVBaENoQyxDQWtDaEI1QixXQUFXbEssV0FBWCxDQUF5Qix5QkFBekIsQ0FBcUQsRUFsQ3JDLENBb0NoQmtLLFdBQVdpUCxXQUFYLENBQXlCLHFCQUF6QixDQUFpRCxFQXBDakMsQ0FzQ2hCalAsV0FBVzBvQixXQUFYLENBQXlCLHNCQUF6QixDQUFrRCxFQXRDbEMsQ0F1Q2hCMW9CLFdBQVcyb0IsU0FBWCxDQUF1QixvQkFBdkIsQ0FBOEMsRUF2QzlCLENBeUNoQjNvQixXQUFXNG9CLGdCQUFYLENBQThCLHVCQUE5QixDQUF3RCxFQXpDeEMsQ0EwQ2hCNW9CLFdBQVc0b0IsZ0JBQVgsQ0FBOEIsV0FBYXJCLG1CQUEzQyxDQUFpRSxFQTFDakQsQ0E0Q2hCdm5CLFdBQVcyUSxrQkFBWCxDQUFnQyw2QkFBaEMsQ0FBZ0UsRUE1Q2hELENBOENoQjNRLFdBQVc2b0IsdUJBQVgsQ0FBcUMsbUNBQXJDLENBQTJFLEVBOUMzRCxDQWdEaEI3b0IsV0FBV3VjLHNCQUFYLENBQW9DLHlCQUFwQyxDQUFnRSxFQWhEaEQsQ0FpRGhCdmMsV0FBV3VjLHNCQUFYLEVBQXFDbDVDLFdBQVcxYixHQUFYLENBQWdCLGdCQUFoQixDQUFyQyxDQUEwRSw2QkFBMUUsQ0FBMEcsRUFqRDFGLENBbURoQnE0QyxXQUFXOUwsTUFBWCxFQUFxQjd3QixXQUFXMWIsR0FBWCxDQUFnQix3QkFBaEIsQ0FBckIsQ0FBa0UseUJBQWxFLENBQThGLEVBbkQ5RSxDQXFEaEIsMEJBckRnQixDQXNEaEIsOEJBdERnQixDQXdEZHE0QyxXQUFXK2xCLFdBQVgsR0FBMkIrQyxhQUE3QixDQUErQyxzQkFBL0MsQ0FBd0UsRUF4RHhELENBeURkOW9CLFdBQVcrbEIsV0FBWCxHQUEyQitDLGFBQTdCLENBQStDN3dCLFlBQWEsMkJBQWIsQ0FBL0MsQ0FBNEYsRUF6RDVFO0VBMERkK0gsV0FBVytsQixXQUFYLEdBQTJCK0MsYUFBN0IsQ0FBK0NDLHVCQUF3QixhQUF4QixDQUF1Qy9vQixXQUFXK2xCLFdBQWxELENBQS9DLENBQWlILEVBMURqRyxDQTREaEIvbEIsV0FBV3lRLFNBQVgsQ0FBdUIsbUJBQXZCLENBQTZDLEVBNUQ3QixDQThEZHpRLFdBQVdncEIsY0FBWCxFQUE2QmhwQixXQUFXaXBCLFdBQXhDLEVBQXVEanBCLFdBQVdrcEIsY0FBbEUsRUFBb0ZscEIsV0FBV21wQixtQkFBakcsQ0FBeUhseEIsWUFBYSx5QkFBYixDQUF6SCxDQUFvSyxFQTlEcEo7RUErRGhCK0gsV0FBV2lwQixXQUFYLENBQXlCRyx5QkFBMEIsa0JBQTFCLENBQThDcHBCLFdBQVdpcEIsV0FBekQsQ0FBekIsQ0FBa0csRUEvRGxGLENBZ0VoQmpwQixXQUFXa3BCLGNBQVgsQ0FBNEJFLHlCQUEwQixxQkFBMUIsQ0FBaURwcEIsV0FBV2twQixjQUE1RCxDQUE1QixDQUEyRyxFQWhFM0YsQ0FpRWhCbHBCLFdBQVdtcEIsbUJBQVgsQ0FBaUNDLHlCQUEwQiwwQkFBMUIsQ0FBc0RwcEIsV0FBV21wQixtQkFBakUsQ0FBakMsQ0FBMEgsRUFqRTFHLENBa0VoQm5wQixXQUFXZ3BCLGNBQVgsQ0FBNEJLLHlCQUEwQixxQkFBMUIsQ0FBaURycEIsV0FBV2dwQixjQUE1RCxDQUE1QixDQUEyRyxFQWxFM0YsQ0FvRWhCaHBCLFdBQVdzcEIsWUFBWCxDQUEwQix5QkFBMkJwcEIsU0FBU29wQixZQUE5RCxDQUE2RSxFQXBFN0QsQ0FzRWhCLElBdEVnQixFQXdFZmxvRCxNQXhFZSxDQXdFUCtrRCxlQXhFTyxFQXdFV2YsSUF4RVgsQ0F3RWlCLElBeEVqQixDQUFqQixDQTBFQSxDQUVEcHRCLGFBQWV1eEIsY0FBZXZ4QixZQUFmLENBQWYsQ0FDQUEsYUFBZXd4QixpQkFBa0J4eEIsWUFBbEIsQ0FBZ0NnSSxVQUFoQyxDQUFmLENBQ0FoSSxhQUFleXhCLHlCQUEwQnp4QixZQUExQixDQUF3Q2dJLFVBQXhDLENBQWYsQ0FFQTlILGVBQWlCcXhCLGNBQWVyeEIsY0FBZixDQUFqQixDQUNBQSxlQUFpQnN4QixpQkFBa0J0eEIsY0FBbEIsQ0FBa0M4SCxVQUFsQyxDQUFqQixDQUNBOUgsZUFBaUJ1eEIseUJBQTBCdnhCLGNBQTFCLENBQTBDOEgsVUFBMUMsQ0FBakIsQ0FFQWhJLGFBQWUweEIsWUFBYTF4QixZQUFiLENBQWYsQ0FDQUUsZUFBaUJ3eEIsWUFBYXh4QixjQUFiLENBQWpCLENBRUEsZUFBaUIrdkIsYUFBZWp3QixZQUFoQyxDQUNBLGlCQUFtQit2QixlQUFpQjd2QixjQUFwQyxDQUVBO0VBQ0E7RUFFQSxtQkFBcUJ5eEIsWUFBYTl2QixFQUFiLENBQWlCQSxHQUFHb2lCLGFBQXBCLENBQW1DMk4sVUFBbkMsQ0FBckIsQ0FDQSxxQkFBdUJELFlBQWE5dkIsRUFBYixDQUFpQkEsR0FBR3NpQixlQUFwQixDQUFxQzBOLFlBQXJDLENBQXZCLENBRUFod0IsR0FBR2l3QixZQUFILENBQWlCOUksT0FBakIsQ0FBMEIrSSxjQUExQixFQUNBbHdCLEdBQUdpd0IsWUFBSCxDQUFpQjlJLE9BQWpCLENBQTBCZ0osZ0JBQTFCLEVBRUE7RUFFQSxHQUFLOXBCLFNBQVN5UyxtQkFBVCxHQUFpQ3B3RCxTQUF0QyxDQUFrRCxDQUVqRHMzQyxHQUFHb3dCLGtCQUFILENBQXVCakosT0FBdkIsQ0FBZ0MsQ0FBaEMsQ0FBbUM5Z0IsU0FBU3lTLG1CQUE1QyxFQUVBLENBSkQsUUFJWTNTLFdBQVdrQyxZQUFYLEdBQTRCLElBQWpDLENBQXdDO0VBRzlDckksR0FBR293QixrQkFBSCxDQUF1QmpKLE9BQXZCLENBQWdDLENBQWhDLENBQW1DLFVBQW5DLEVBRUEsQ0FFRG5uQixHQUFHcXdCLFdBQUgsQ0FBZ0JsSixPQUFoQixFQUVBLGVBQWlCbm5CLEdBQUdzd0IsaUJBQUgsQ0FBc0JuSixPQUF0QixFQUFnQ29KLElBQWhDLEVBQWpCLENBQ0EsY0FBZ0J2d0IsR0FBRzhyQixnQkFBSCxDQUFxQm9FLGNBQXJCLEVBQXNDSyxJQUF0QyxFQUFoQixDQUNBLGdCQUFrQnZ3QixHQUFHOHJCLGdCQUFILENBQXFCcUUsZ0JBQXJCLEVBQXdDSSxJQUF4QyxFQUFsQixDQUVBLGFBQWUsSUFBZixDQUNBLG9CQUFzQixJQUF0QixDQUVBO0VBQ0E7RUFFQSxHQUFLdndCLEdBQUc4cUIsbUJBQUgsQ0FBd0IzRCxPQUF4QixDQUFpQ25uQixHQUFHd3dCLFdBQXBDLElBQXNELEtBQTNELENBQW1FLENBRWxFQyxTQUFXLEtBQVgsQ0FFQXB4RCxRQUFRTSxLQUFSLENBQWUsb0NBQWYsQ0FBcURxZ0MsR0FBRzB3QixRQUFILEVBQXJELENBQW9FLG9CQUFwRSxDQUEwRjF3QixHQUFHOHFCLG1CQUFILENBQXdCM0QsT0FBeEIsQ0FBaUNubkIsR0FBRzJ3QixlQUFwQyxDQUExRixDQUFpSixzQkFBakosQ0FBeUtDLFVBQXpLLENBQXFMQyxTQUFyTCxDQUFnTUMsV0FBaE0sRUFFQSxDQU5ELFFBTVlGLGFBQWUsRUFBcEIsQ0FBeUIsQ0FFL0J2eEQsUUFBUTZQLElBQVIsQ0FBYyw0Q0FBZCxDQUE0RDBoRCxVQUE1RCxFQUVBLENBSk0sUUFJS0MsWUFBYyxFQUFkLEVBQW9CQyxjQUFnQixFQUF6QyxDQUE4QyxDQUVwREMsZ0JBQWtCLEtBQWxCLENBRUEsQ0FFRCxHQUFLQSxlQUFMLENBQXVCLENBRXRCLEtBQUtDLFdBQUwsQ0FBbUIsQ0FFbEJQLFNBQVVBLFFBRlEsQ0FHbEJwcUIsU0FBVUEsUUFIUSxDQUtsQnVxQixXQUFZQSxVQUxNLENBT2xCenlCLGFBQWMsQ0FFYi92QixJQUFLeWlELFNBRlEsQ0FHYkksT0FBUTdDLFlBSEssQ0FQSSxDQWNsQi92QixlQUFnQixDQUVmandCLElBQUswaUQsV0FGVSxDQUdmRyxPQUFRL0MsY0FITyxDQWRFLENBQW5CLENBdUJBLENBRUQ7RUFFQWx1QixHQUFHa3hCLFlBQUgsQ0FBaUJoQixjQUFqQixFQUNBbHdCLEdBQUdreEIsWUFBSCxDQUFpQmYsZ0JBQWpCLEVBRUE7RUFFQSxrQkFBQSxDQUVBLEtBQUszSSxXQUFMLENBQW1CLFVBQVksQ0FFOUIsR0FBSzJKLGlCQUFtQnpvRSxTQUF4QixDQUFvQyxDQUVuQ3lvRSxlQUFpQixpQkFBQSxDQUFtQm54QixFQUFuQixDQUF1Qm1uQixPQUF2QixDQUFnQzdHLFFBQWhDLENBQWpCLENBRUEsQ0FFRCxxQkFBQSxDQUVBLENBVkQsQ0FZQTtFQUVBLG9CQUFBLENBRUEsS0FBSzhRLGFBQUwsQ0FBcUIsVUFBWSxDQUVoQyxHQUFLQyxtQkFBcUIzb0UsU0FBMUIsQ0FBc0MsQ0FFckMyb0UsaUJBQW1CQyx3QkFBeUJ0eEIsRUFBekIsQ0FBNkJtbkIsT0FBN0IsQ0FBbkIsQ0FFQSxDQUVELHVCQUFBLENBRUEsQ0FWRCxDQVlBO0VBRUEsS0FBS29LLE9BQUwsQ0FBZSxVQUFZLENBRTFCdnhCLEdBQUd3eEIsYUFBSCxDQUFrQnJLLE9BQWxCLEVBQ0EsS0FBS0EsT0FBTCxDQUFleitELFNBQWYsQ0FFQSxDQUxELENBT0E7RUFFQXJGLE9BQU9zUCxnQkFBUCxDQUF5QixJQUF6QixDQUErQixDQUU5QjJrQyxTQUFVLENBQ1R4cEMsSUFBSyxVQUFZLENBRWhCdVIsUUFBUTZQLElBQVIsQ0FBYyxzREFBZCxFQUNBLFlBQVlzNEMsV0FBTCxFQUFQLENBRUEsQ0FOUSxDQUZvQixDQVc5Qjk4QixXQUFZLENBQ1g1OEIsSUFBSyxVQUFZLENBRWhCdVIsUUFBUTZQLElBQVIsQ0FBYywwREFBZCxFQUNBLFlBQVlraUQsYUFBTCxFQUFQLENBRUEsQ0FOVSxDQVhrQixDQUEvQixFQXVCQTtFQUVBLEtBQUtockUsSUFBTCxDQUFZc2xFLE9BQU90bEUsSUFBbkIsQ0FDQSxLQUFLNEwsRUFBTCxDQUFVeS9ELGdCQUFWLENBQ0EsS0FBS2xFLElBQUwsQ0FBWUEsSUFBWixDQUNBLEtBQUttRSxTQUFMLENBQWlCLENBQWpCLENBQ0EsS0FBS3ZLLE9BQUwsQ0FBZUEsT0FBZixDQUNBLEtBQUtocEIsWUFBTCxDQUFvQit4QixjQUFwQixDQUNBLEtBQUs3eEIsY0FBTCxDQUFzQjh4QixnQkFBdEIsQ0FFQSxXQUFBLENBRUEsQ0FFRDs7S0FJQSxzQkFBQSxDQUF3QjdQLFFBQXhCLENBQWtDOTJDLFVBQWxDLENBQThDbW9ELFlBQTlDLENBQTZELENBRTVELGFBQWUsRUFBZixDQUVBLGNBQWdCLENBQ2ZDLGtCQUFtQixPQURKLENBRWZDLHFCQUFzQixjQUZQLENBR2ZDLG1CQUFvQixRQUhMLENBSWZ6WixrQkFBbUIsT0FKSixDQUtmMFosb0JBQXFCLFNBTE4sQ0FNZkMsa0JBQW1CLE9BTkosQ0FPZkMsaUJBQWtCLE9BUEgsQ0FRZkMscUJBQXNCLFVBUlAsQ0FTZkMscUJBQXNCLFVBVFAsQ0FVZkMsa0JBQW1CLE9BVkosQ0FXZkMsbUJBQW9CLFFBWEwsQ0FZZkMsZUFBZ0IsUUFaRCxDQWFmQyxlQUFnQixRQWJELENBQWhCLENBZ0JBLG1CQUFxQixDQUNwQixXQURvQixDQUNQLHdCQURPLENBQ21CLEtBRG5CLENBQzBCLGFBRDFCLENBQ3lDLFFBRHpDLENBQ21ELFlBRG5ELENBQ2lFLGdCQURqRSxDQUVwQixVQUZvQixDQUVSLE9BRlEsQ0FFQyxhQUZELENBRWdCLHFCQUZoQixDQUV1QyxTQUZ2QyxDQUVrRCxXQUZsRCxDQUUrRCxpQkFGL0QsQ0FFa0YsYUFGbEYsQ0FHcEIsY0FIb0IsQ0FHSixjQUhJLENBR1ksYUFIWixDQUlwQixVQUpvQixDQUlSLFNBSlEsQ0FJRyxjQUpILENBSW1CLEtBSm5CLENBSTBCLFFBSjFCLENBSW9DLFFBSnBDLENBS3BCLGFBTG9CLENBS0wsaUJBTEssQ0FLYyx3QkFMZCxDQUt3QyxVQUx4QyxDQU1wQixVQU5vQixDQU1SLGtCQU5RLENBTVksY0FOWixDQU00QixjQU41QixDQU9wQixpQkFQb0IsQ0FPRCxpQkFQQyxDQU9rQixvQkFQbEIsQ0FRcEIsY0FSb0IsQ0FRSixnQkFSSSxDQVFjLGVBUmQsQ0FRK0IsZUFSL0IsQ0FRZ0QsbUJBUmhELENBU3BCLGtCQVRvQixDQVNBLGVBVEEsQ0FTaUIsYUFUakIsQ0FTZ0MseUJBVGhDLENBVXBCLFdBVm9CLENBVVAsYUFWTyxDQVVRLFdBVlIsQ0FVcUIsbUJBVnJCLENBVTBDLHFCQVYxQyxDQVVpRSxjQVZqRSxDQVVpRixXQVZqRixDQUFyQixDQWNBLHNCQUFBLENBQXdCM29FLE1BQXhCLENBQWlDLENBRWhDLGFBQWVBLE9BQU80b0UsUUFBdEIsQ0FDQSxVQUFZQSxTQUFTQyxLQUFyQixDQUVBLEdBQUtkLGFBQWE3TixtQkFBbEIsQ0FBd0MsQ0FFdkMsV0FBQSxDQUVBLENBSkQsSUFJTztFQUdOO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFFQSxvQkFBc0I2TixhQUFhaE8saUJBQW5DLENBQ0Esb0JBQXNCMTNELEtBQUtFLEtBQUwsQ0FBWSxDQUFFdW1FLGdCQUFrQixFQUFwQixFQUEyQixDQUF2QyxDQUF0QixDQUVBLGFBQWV6bUUsS0FBSzZFLEdBQUwsQ0FBVTZoRSxlQUFWLENBQTJCRixNQUFNMW9FLE1BQWpDLENBQWYsQ0FFQSxHQUFLMGtFLFNBQVdnRSxNQUFNMW9FLE1BQXRCLENBQStCLENBRTlCc1YsUUFBUTZQLElBQVIsQ0FBYyxxQ0FBdUN1akQsTUFBTTFvRSxNQUE3QyxDQUFzRCw0QkFBdEQsQ0FBcUYwa0UsUUFBckYsQ0FBZ0csR0FBOUcsRUFDQSxRQUFBLENBRUEsQ0FFRCxlQUFBLENBRUEsQ0FFRCxDQUVELGtDQUFBLENBQW9DMTBCLEdBQXBDLENBQXlDNjRCLG1CQUF6QyxDQUErRCxDQUU5RCxZQUFBLENBRUEsR0FBSyxDQUFFNzRCLEdBQVAsQ0FBYSxDQUVaeFYsU0FBV2tCLGNBQVgsQ0FFQSxDQUpELFFBSVlzVSxJQUFJblUsU0FBVCxDQUFxQixDQUUzQnJCLFNBQVd3VixJQUFJeFYsUUFBZixDQUVBLENBSk0sUUFJS3dWLElBQUk5UixtQkFBVCxDQUErQixDQUVyQzVvQixRQUFRNlAsSUFBUixDQUFjLDJIQUFkLEVBQ0FxVixTQUFXd1YsSUFBSW5TLE9BQUosQ0FBWXJELFFBQXZCLENBRUEsQ0FFRDtFQUNBLEdBQUtBLFdBQWFrQixjQUFiLEVBQStCbXRDLG1CQUFwQyxDQUEwRCxDQUV6RHJ1QyxTQUFXc3VDLGFBQVgsQ0FFQSxDQUVELGVBQUEsQ0FFQSxDQUVELEtBQUtDLGFBQUwsQ0FBcUIsU0FBV3pzQixRQUFYLENBQXFCOUosTUFBckIsQ0FBNkJ3MkIsT0FBN0IsQ0FBc0M3MkIsR0FBdEMsQ0FBMkM4MkIsV0FBM0MsQ0FBd0RDLGlCQUF4RCxDQUEyRXJwRSxNQUEzRSxDQUFvRixDQUV4RyxhQUFlc3BFLFVBQVc3c0IsU0FBU3RoRCxJQUFwQixDQUFmLENBRUE7RUFDQTtFQUVBLGFBQWU2RSxPQUFPdXBFLGFBQVAsQ0FBdUJDLGNBQWV4cEUsTUFBZixDQUF2QixDQUFpRCxDQUFoRSxDQUNBLGNBQWdCK25FLGFBQWFobEIsU0FBN0IsQ0FFQSxHQUFLdEcsU0FBU3NHLFNBQVQsR0FBdUIsSUFBNUIsQ0FBbUMsQ0FFbENBLFVBQVlnbEIsYUFBYW5QLGVBQWIsQ0FBOEJuYyxTQUFTc0csU0FBdkMsQ0FBWixDQUVBLEdBQUtBLFlBQWN0RyxTQUFTc0csU0FBNUIsQ0FBd0MsQ0FFdkN0dEMsUUFBUTZQLElBQVIsQ0FBYyxtQ0FBZCxDQUFtRG0zQixTQUFTc0csU0FBNUQsQ0FBdUUsc0JBQXZFLENBQStGQSxTQUEvRixDQUEwRyxVQUExRyxFQUVBLENBRUQsQ0FFRCx3QkFBMEIyVCxTQUFTK1MsZUFBVCxFQUExQixDQUVBLGVBQWlCLENBRWhCQyxTQUFVQSxRQUZNLENBSWhCM21CLFVBQVdBLFNBSkssQ0FLaEI0aEIsdUJBQXdCb0QsYUFBYXZPLGNBTHJCLENBTWhCK0wsZUFBZ0JvRSwwQkFBNkIsQ0FBRUMsbUJBQUosQ0FBNEIsSUFBNUIsQ0FBbUNBLG9CQUFvQjVyQyxPQUFsRixDQUEyRjA0QixTQUFTbVQsV0FBcEcsQ0FOQSxDQU9oQjE1QixJQUFLLENBQUMsQ0FBRXNNLFNBQVN0TSxHQVBELENBUWhCcTFCLFlBQWFtRSwwQkFBMkJsdEIsU0FBU3RNLEdBQXBDLENBQXlDdW1CLFNBQVNvVCxVQUFsRCxDQVJHLENBU2hCcjVCLE9BQVEsQ0FBQyxDQUFFZ00sU0FBU2hNLE1BVEosQ0FVaEJzNUIsV0FBWXR0QixTQUFTaE0sTUFBVCxFQUFtQmdNLFNBQVNoTSxNQUFULENBQWdCclcsT0FWL0IsQ0FXaEJxckMsZUFBZ0JrRSwwQkFBMkJsdEIsU0FBU2hNLE1BQXBDLENBQTRDaW1CLFNBQVNvVCxVQUFyRCxDQVhBLENBWWhCckgsYUFBZ0IsQ0FBQyxDQUFFaG1CLFNBQVNoTSxNQUFkLEdBQThCZ00sU0FBU2hNLE1BQVQsQ0FBZ0JyVyxPQUFoQixHQUE0QjR2Qyx1QkFBOUIsRUFBNkR2dEIsU0FBU2hNLE1BQVQsQ0FBZ0JyVyxPQUFoQixHQUE0QjZ2Qyx1QkFBckgsQ0FaRSxDQWFoQi80QixTQUFVLENBQUMsQ0FBRXVMLFNBQVN2TCxRQWJOLENBY2hCSCxNQUFPLENBQUMsQ0FBRTBMLFNBQVMxTCxLQWRILENBZWhCTSxZQUFhLENBQUMsQ0FBRW9MLFNBQVNwTCxXQWZULENBZ0JoQnEwQixvQkFBcUJpRSwwQkFBMkJsdEIsU0FBU3BMLFdBQXBDLENBQWlEcWxCLFNBQVNvVCxVQUExRCxDQWhCTCxDQWlCaEJ2NEIsUUFBUyxDQUFDLENBQUVrTCxTQUFTbEwsT0FqQkwsQ0FrQmhCRyxVQUFXLENBQUMsQ0FBRStLLFNBQVMvSyxTQWxCUCxDQW1CaEJHLGdCQUFpQixDQUFDLENBQUU0SyxTQUFTNUssZUFuQmIsQ0FvQmhCSSxhQUFjLENBQUMsQ0FBRXdLLFNBQVN4SyxZQXBCVixDQXFCaEJFLGFBQWMsQ0FBQyxDQUFFc0ssU0FBU3RLLFlBckJWLENBc0JoQjVCLFlBQWEsQ0FBQyxDQUFFa00sU0FBU2xNLFdBdEJULENBdUJoQkYsU0FBVSxDQUFDLENBQUVvTSxTQUFTcE0sUUF2Qk4sQ0F5QmhCZ0MsWUFBYSxDQUFDLENBQUVvSyxTQUFTcEssV0F6QlQsQ0EyQmhCa2MsUUFBUzlSLFNBQVM4UixPQTNCRixDQTZCaEJwUSxhQUFjMUIsU0FBUzBCLFlBN0JQLENBK0JoQjdMLElBQUssQ0FBQyxDQUFFQSxHQS9CUSxDQWdDaEJ3eUIsT0FBUXJvQixTQUFTbkssR0FoQ0QsQ0FpQ2hCeXlCLE9BQVV6eUIsS0FBT0EsSUFBSTQzQixTQWpDTCxDQW1DaEIxZSxZQUFhL08sU0FBUytPLFdBbkNOLENBcUNoQnFDLGdCQUFpQnBSLFNBQVNvUixlQXJDVixDQXNDaEJpTCx1QkFBd0JpUCxhQUFhalAsc0JBdENyQixDQXdDaEIxSyxTQUFVM1IsU0FBUzJSLFFBQVQsRUFBcUJ5VyxTQUFXLENBeEMxQixDQXlDaEJBLFNBQVVBLFFBekNNLENBMENoQkcsaUJBQWtCK0MsYUFBYTdOLG1CQTFDZixDQTRDaEJ6YixhQUFjaEMsU0FBU2dDLFlBNUNQLENBNkNoQkMsYUFBY2pDLFNBQVNpQyxZQTdDUCxDQThDaEJ5ckIsZ0JBQWlCelQsU0FBU3lULGVBOUNWLENBK0NoQkMsZ0JBQWlCMVQsU0FBUzBULGVBL0NWLENBaURoQnBILGFBQWNyd0IsT0FBTzAzQixXQUFQLENBQW1CbHFFLE1BakRqQixDQWtEaEJnakUsZUFBZ0J4d0IsT0FBT3ZsQyxLQUFQLENBQWFqTixNQWxEYixDQW1EaEI4aUUsY0FBZXR3QixPQUFPMjNCLElBQVAsQ0FBWW5xRSxNQW5EWCxDQW9EaEIraUUsa0JBQW1CdndCLE9BQU80M0IsUUFBUCxDQUFnQnBxRSxNQXBEbkIsQ0FxRGhCaWpFLGNBQWV6d0IsT0FBTzYzQixJQUFQLENBQVlycUUsTUFyRFgsQ0F1RGhCa2pFLGtCQUFtQitGLFdBdkRILENBd0RoQjlGLG9CQUFxQitGLGlCQXhETCxDQTBEaEJyYyxVQUFXdlEsU0FBU3VRLFNBMURKLENBNERoQm1ZLGlCQUFrQnpPLFNBQVMrVCxTQUFULENBQW1CaHRCLE9BQW5CLEVBQThCejlDLE9BQU80NUMsYUFBckMsRUFBc0R1dkIsUUFBUWhwRSxNQUFSLENBQWlCLENBNUR6RSxDQTZEaEJ5akUsY0FBZWxOLFNBQVMrVCxTQUFULENBQW1CdHZFLElBN0RsQixDQStEaEJtbkUsWUFBYTVMLFNBQVM0TCxXQS9ETixDQWdFaEI4Qyx3QkFBeUIxTyxTQUFTME8sdUJBaEVsQixDQWtFaEJsWSxtQkFBb0J6USxTQUFTeVEsa0JBbEViLENBb0VoQkQsVUFBV3hRLFNBQVN3USxTQXBFSixDQXFFaEJnWSxZQUFheG9CLFNBQVM2TyxJQUFULEdBQWtCMEosVUFyRWYsQ0FzRWhCa1EsVUFBV3pvQixTQUFTNk8sSUFBVCxHQUFrQnlKLFFBdEViLENBd0VoQjhRLGFBQWdCcHBCLFNBQVNvcEIsWUFBVCxHQUEwQi9tRSxTQUE1QixDQUEwQzI5QyxTQUFTb3BCLFlBQW5ELENBQWtFLEtBeEVoRSxDQUFqQixDQTRFQSxpQkFBQSxDQUVBLENBdEdELENBd0dBLEtBQUs2RSxjQUFMLENBQXNCLFNBQVdqdUIsUUFBWCxDQUFxQkYsVUFBckIsQ0FBa0MsQ0FFdkQsVUFBWSxFQUFaLENBRUEsR0FBS0EsV0FBV210QixRQUFoQixDQUEyQixDQUUxQm5wRCxNQUFNNWdCLElBQU4sQ0FBWTQ4QyxXQUFXbXRCLFFBQXZCLEVBRUEsQ0FKRCxJQUlPLENBRU5ucEQsTUFBTTVnQixJQUFOLENBQVk4OEMsU0FBU2hJLGNBQXJCLEVBQ0FsMEIsTUFBTTVnQixJQUFOLENBQVk4OEMsU0FBU2xJLFlBQXJCLEVBRUEsQ0FFRCxHQUFLa0ksU0FBU2tTLE9BQVQsR0FBcUI3dkQsU0FBMUIsQ0FBc0MsQ0FFckMsSUFBTSxRQUFOLGFBQTJCNnZELE9BQTNCLENBQXFDLENBRXBDcHVDLE1BQU01Z0IsSUFBTixDQUFZbkQsSUFBWixFQUNBK2pCLE1BQU01Z0IsSUFBTixDQUFZODhDLFNBQVNrUyxPQUFULENBQWtCbnlELElBQWxCLENBQVosRUFFQSxDQUVELENBRUQsSUFBTSxNQUFRLENBQWQsQ0FBaUJnRSxFQUFJbXFFLGVBQWV4cUUsTUFBcEMsQ0FBNENLLEdBQTVDLENBQW1ELENBRWxEK2YsTUFBTTVnQixJQUFOLENBQVk0OEMsV0FBWW91QixlQUFnQm5xRSxDQUFoQixDQUFaLENBQVosRUFFQSxDQUVEK2YsTUFBTTVnQixJQUFOLENBQVk4OEMsU0FBUzZRLGVBQVQsQ0FBeUJudUQsUUFBekIsRUFBWixFQUVBb2hCLE1BQU01Z0IsSUFBTixDQUFZKzJELFNBQVNtVCxXQUFyQixFQUVBLGFBQWFsSSxJQUFOLEVBQVAsQ0FFQSxDQXRDRCxDQXdDQSxLQUFLaUosY0FBTCxDQUFzQixTQUFXbnVCLFFBQVgsQ0FBcUJxbEIsTUFBckIsQ0FBNkJ2bEIsVUFBN0IsQ0FBeUNvbkIsSUFBekMsQ0FBZ0QsQ0FFckUsV0FBQSxDQUVBO0VBQ0EsSUFBTSxNQUFRLENBQVIsQ0FBV2tILEdBQUt4TixTQUFTbDlELE1BQS9CLENBQXVDa2UsRUFBSXdzRCxFQUEzQyxDQUErQ3hzRCxHQUEvQyxDQUFzRCxDQUVyRCxnQkFBa0JnL0MsU0FBVWgvQyxDQUFWLENBQWxCLENBRUEsR0FBS3lzRCxZQUFZbkgsSUFBWixHQUFxQkEsSUFBMUIsQ0FBaUMsQ0FFaENwRyxRQUFVdU4sV0FBVixDQUNBLEVBQUd2TixRQUFRdUssU0FBWCxDQUVBLE1BRUEsQ0FFRCxDQUVELEdBQUt2SyxVQUFZeitELFNBQWpCLENBQTZCLENBRTVCeStELFFBQVUsZ0JBQUEsQ0FBa0I3RyxRQUFsQixDQUE0QjkyQyxVQUE1QixDQUF3QytqRCxJQUF4QyxDQUE4Q2xuQixRQUE5QyxDQUF3RHFsQixNQUF4RCxDQUFnRXZsQixVQUFoRSxDQUFWLENBQ0E4Z0IsU0FBUzE5RCxJQUFULENBQWU0OUQsT0FBZixFQUVBLENBRUQsY0FBQSxDQUVBLENBN0JELENBK0JBLEtBQUt3TixjQUFMLENBQXNCLFNBQVd4TixPQUFYLENBQXFCLENBRTFDLEdBQUssRUFBR0EsUUFBUXVLLFNBQVgsR0FBeUIsQ0FBOUIsQ0FBa0M7RUFHakMsTUFBUXpLLFNBQVNyN0QsT0FBVCxDQUFrQnU3RCxPQUFsQixDQUFSLENBQ0FGLFNBQVU3OEQsQ0FBVixFQUFnQjY4RCxTQUFVQSxTQUFTbDlELE1BQVQsQ0FBa0IsQ0FBNUIsQ0FBaEIsQ0FDQWs5RCxTQUFTajlELEdBQVQsR0FFQTtFQUNBbTlELFFBQVFvSyxPQUFSLEdBRUEsQ0FFRCxDQWRELENBZ0JBO0VBQ0EsS0FBS3RLLFFBQUwsQ0FBZ0JBLFFBQWhCLENBRUEsQ0FFRDs7S0FJQSx3QkFBQSxFQUEyQixDQUUxQixlQUFpQixXQUFBLEVBQWpCLENBRUEsWUFBQSxDQUFjcjlELE1BQWQsQ0FBdUIsQ0FFdEIsUUFBVTh5QyxXQUFXNXVDLEdBQVgsQ0FBZ0JsRSxNQUFoQixDQUFWLENBRUEsR0FBS213QyxNQUFRcnhDLFNBQWIsQ0FBeUIsQ0FFeEJxeEMsSUFBTSxFQUFOLENBQ0EyQyxXQUFXaGlDLEdBQVgsQ0FBZ0I5USxNQUFoQixDQUF3Qm13QyxHQUF4QixFQUVBLENBRUQsVUFBQSxDQUVBLENBRUQsZUFBQSxDQUFpQm53QyxNQUFqQixDQUEwQixDQUV6Qjh5QyxXQUFXZ0YsTUFBWCxDQUFtQjkzQyxNQUFuQixFQUVBLENBRUQsZUFBQSxDQUFpQkEsTUFBakIsQ0FBeUJDLEdBQXpCLENBQThCOUMsS0FBOUIsQ0FBc0MsQ0FFckMyMUMsV0FBVzV1QyxHQUFYLENBQWdCbEUsTUFBaEIsRUFBMEJDLEdBQTFCLEVBQWtDOUMsS0FBbEMsQ0FFQSxDQUVELGdCQUFBLEVBQW1CLENBRWxCMjFDLFdBQWEsV0FBQSxFQUFiLENBRUEsQ0FFRCxPQUFPLENBQ041dUMsSUFBS0EsR0FEQyxDQUVOOHpDLE9BQVFBLE1BRkYsQ0FHTjdqQixPQUFRQSxNQUhGLENBSU44SSxRQUFTQSxPQUpILENBQVAsQ0FPQSxDQUVEOztLQUlBLDBCQUFBLENBQTRCLzVCLENBQTVCLENBQStCRixDQUEvQixDQUFtQyxDQUVsQyxHQUFLRSxFQUFFNDJDLFdBQUYsR0FBa0I5MkMsRUFBRTgyQyxXQUF6QixDQUF1QyxDQUV0QyxTQUFTQSxXQUFGLENBQWdCOTJDLEVBQUU4MkMsV0FBekIsQ0FFQSxDQUpELFFBSVk1MkMsRUFBRXE2RCxPQUFGLEVBQWF2NkQsRUFBRXU2RCxPQUFmLEVBQTBCcjZELEVBQUVxNkQsT0FBRixHQUFjdjZELEVBQUV1NkQsT0FBL0MsQ0FBeUQsQ0FFL0QsU0FBU0EsT0FBRixDQUFVbjFELEVBQVYsQ0FBZXBGLEVBQUV1NkQsT0FBRixDQUFVbjFELEVBQWhDLENBRUEsQ0FKTSxRQUlLbEYsRUFBRXU1QyxRQUFGLENBQVdyMEMsRUFBWCxHQUFrQnBGLEVBQUV5NUMsUUFBRixDQUFXcjBDLEVBQWxDLENBQXVDLENBRTdDLFNBQVNxMEMsUUFBRixDQUFXcjBDLEVBQVgsQ0FBZ0JwRixFQUFFeTVDLFFBQUYsQ0FBV3IwQyxFQUFsQyxDQUVBLENBSk0sUUFJS2xGLEVBQUVrbkIsQ0FBRixHQUFRcG5CLEVBQUVvbkIsQ0FBZixDQUFtQixDQUV6QixTQUFTQSxDQUFGLENBQU1wbkIsRUFBRW9uQixDQUFmLENBRUEsQ0FKTSxJQUlBLENBRU4sU0FBU2hpQixFQUFGLENBQU9wRixFQUFFb0YsRUFBaEIsQ0FFQSxDQUVELENBRUQsaUNBQUEsQ0FBbUNsRixDQUFuQyxDQUFzQ0YsQ0FBdEMsQ0FBMEMsQ0FFekMsR0FBS0UsRUFBRTQyQyxXQUFGLEdBQWtCOTJDLEVBQUU4MkMsV0FBekIsQ0FBdUMsQ0FFdEMsU0FBU0EsV0FBRixDQUFnQjkyQyxFQUFFODJDLFdBQXpCLENBRUEsQ0FBQyxHQUFLNTJDLEVBQUVrbkIsQ0FBRixHQUFRcG5CLEVBQUVvbkIsQ0FBZixDQUFtQixDQUVwQixTQUFTQSxDQUFGLENBQU1sbkIsRUFBRWtuQixDQUFmLENBRUEsQ0FKQyxJQUlLLENBRU4sU0FBU2hpQixFQUFGLENBQU9wRixFQUFFb0YsRUFBaEIsQ0FFQSxDQUVELENBRUQsd0JBQUEsRUFBMkIsQ0FFMUIsZ0JBQWtCLEVBQWxCLENBQ0EscUJBQXVCLENBQXZCLENBRUEsV0FBYSxFQUFiLENBQ0EsZ0JBQWtCLEVBQWxCLENBRUEsYUFBQSxFQUFnQixDQUVmNGlFLGlCQUFtQixDQUFuQixDQUVBQyxPQUFPOXFFLE1BQVAsQ0FBZ0IsQ0FBaEIsQ0FDQXVyRCxZQUFZdnJELE1BQVosQ0FBcUIsQ0FBckIsQ0FFQSxDQUVELGFBQUEsQ0FBZUgsTUFBZixDQUF1QnlnQyxRQUF2QixDQUFpQ2djLFFBQWpDLENBQTJDcnlCLENBQTNDLENBQThDaTJCLEtBQTlDLENBQXNELENBRXJELGVBQWlCNnFCLFlBQWFGLGdCQUFiLENBQWpCLENBRUEsR0FBS0csYUFBZXJzRSxTQUFwQixDQUFnQyxDQUUvQnFzRSxXQUFhLENBQ1ovaUUsR0FBSXBJLE9BQU9vSSxFQURDLENBRVpwSSxPQUFRQSxNQUZJLENBR1p5Z0MsU0FBVUEsUUFIRSxDQUlaZ2MsU0FBVUEsUUFKRSxDQUtaOGdCLFFBQVM5Z0IsU0FBUzhnQixPQUxOLENBTVp6akIsWUFBYTk1QyxPQUFPODVDLFdBTlIsQ0FPWjF2QixFQUFHQSxDQVBTLENBUVppMkIsTUFBT0EsS0FSSyxDQUFiLENBV0E2cUIsWUFBYUYsZ0JBQWIsRUFBa0NHLFVBQWxDLENBRUEsQ0FmRCxJQWVPLENBRU5BLFdBQVcvaUUsRUFBWCxDQUFnQnBJLE9BQU9vSSxFQUF2QixDQUNBK2lFLFdBQVduckUsTUFBWCxDQUFvQkEsTUFBcEIsQ0FDQW1yRSxXQUFXMXFDLFFBQVgsQ0FBc0JBLFFBQXRCLENBQ0EwcUMsV0FBVzF1QixRQUFYLENBQXNCQSxRQUF0QixDQUNBMHVCLFdBQVc1TixPQUFYLENBQXFCOWdCLFNBQVM4Z0IsT0FBOUIsQ0FDQTROLFdBQVdyeEIsV0FBWCxDQUF5Qjk1QyxPQUFPODVDLFdBQWhDLENBQ0FxeEIsV0FBVy9nRCxDQUFYLENBQWVBLENBQWYsQ0FDQStnRCxXQUFXOXFCLEtBQVgsQ0FBbUJBLEtBQW5CLENBRUEsQ0FFRCxDQUFFNUQsU0FBU2lQLFdBQVQsR0FBeUIsSUFBekIsQ0FBZ0NBLFdBQWhDLENBQThDdWYsTUFBaEQsRUFBeUR0ckUsSUFBekQsQ0FBK0R3ckUsVUFBL0QsRUFFQUgsbUJBRUEsQ0FFRCxhQUFBLEVBQWdCLENBRWYsR0FBS0MsT0FBTzlxRSxNQUFQLENBQWdCLENBQXJCLENBQXlCOHFFLE9BQU8zbkIsSUFBUCxDQUFhOG5CLGlCQUFiLEVBQ3pCLEdBQUsxZixZQUFZdnJELE1BQVosQ0FBcUIsQ0FBMUIsQ0FBOEJ1ckQsWUFBWXBJLElBQVosQ0FBa0IrbkIsd0JBQWxCLEVBRTlCLENBRUQsT0FBTyxDQUNOSixPQUFRQSxNQURGLENBRU52ZixZQUFhQSxXQUZQLENBSU5pUCxLQUFNQSxJQUpBLENBS05oN0QsS0FBTUEsSUFMQSxDQU9OMmpELEtBQU1BLElBUEEsQ0FBUCxDQVVBLENBRUQseUJBQUEsRUFBNEIsQ0FFM0IsVUFBWSxFQUFaLENBRUEsWUFBQSxDQUFjdVQsS0FBZCxDQUFxQmovQixNQUFyQixDQUE4QixDQUU3QixTQUFXaS9CLE1BQU16dUQsRUFBTixDQUFXLEdBQVgsQ0FBaUJ3dkIsT0FBT3h2QixFQUFuQyxDQUNBLFNBQVdrakUsTUFBTy9tQixJQUFQLENBQVgsQ0FFQSxHQUFLZ25CLE9BQVN6c0UsU0FBZCxDQUEwQjtFQUl6QnlzRSxLQUFPLG1CQUFBLEVBQVAsQ0FDQUQsTUFBTy9tQixJQUFQLEVBQWdCZ25CLElBQWhCLENBRUEsQ0FFRCxXQUFBLENBRUEsQ0FFRCxnQkFBQSxFQUFtQixDQUVsQkQsTUFBUSxFQUFSLENBRUEsQ0FFRCxPQUFPLENBQ05wbkUsSUFBS0EsR0FEQyxDQUVOKzRCLFFBQVNBLE9BRkgsQ0FBUCxDQUtBLENBRUQ7O0tBSUEsc0JBQUEsRUFBeUIsQ0FFeEIsV0FBYSxFQUFiLENBRUEsT0FBTyxDQUVOLzRCLElBQUssU0FBV3NuRSxLQUFYLENBQW1CLENBRXZCLEdBQUs3NEIsT0FBUTY0QixNQUFNcGpFLEVBQWQsSUFBdUJ0SixTQUE1QixDQUF3QyxDQUV2QyxjQUFlMHNFLE1BQU1wakUsRUFBZCxDQUFQLENBRUEsQ0FFRCxZQUFBLENBRUEsT0FBU29qRSxNQUFNcndFLElBQWYsRUFFQyxJQUFLLGtCQUFMLENBQ0N1eUMsU0FBVyxDQUNWNUosVUFBVyxXQUFBLEVBREQsQ0FFVjRLLE1BQU8sU0FBQSxFQUZHLENBSVZxRSxPQUFRLEtBSkUsQ0FLVkMsV0FBWSxDQUxGLENBTVZDLGFBQWMsQ0FOSixDQU9WQyxjQUFlLFdBQUEsRUFQTCxDQUFYLENBU0EsTUFFRCxJQUFLLFdBQUwsQ0FDQ3hGLFNBQVcsQ0FDVnRjLFNBQVUsV0FBQSxFQURBLENBRVYwUyxVQUFXLFdBQUEsRUFGRCxDQUdWNEssTUFBTyxTQUFBLEVBSEcsQ0FJVnBJLFNBQVUsQ0FKQSxDQUtWZ04sUUFBUyxDQUxDLENBTVZDLFlBQWEsQ0FOSCxDQU9WQyxNQUFPLENBUEcsQ0FTVlQsT0FBUSxLQVRFLENBVVZDLFdBQVksQ0FWRixDQVdWQyxhQUFjLENBWEosQ0FZVkMsY0FBZSxXQUFBLEVBWkwsQ0FBWCxDQWNBLE1BRUQsSUFBSyxZQUFMLENBQ0N4RixTQUFXLENBQ1Z0YyxTQUFVLFdBQUEsRUFEQSxDQUVWc2QsTUFBTyxTQUFBLEVBRkcsQ0FHVnBJLFNBQVUsQ0FIQSxDQUlWa04sTUFBTyxDQUpHLENBTVZULE9BQVEsS0FORSxDQU9WQyxXQUFZLENBUEYsQ0FRVkMsYUFBYyxDQVJKLENBU1ZDLGNBQWUsV0FBQSxFQVRMLENBVVZVLGlCQUFrQixDQVZSLENBV1ZDLGdCQUFpQixJQVhQLENBQVgsQ0FhQSxNQUVELElBQUssaUJBQUwsQ0FDQ25HLFNBQVcsQ0FDVjVKLFVBQVcsV0FBQSxFQURELENBRVZtUSxTQUFVLFNBQUEsRUFGQSxDQUdWQyxZQUFhLFNBQUEsRUFISCxDQUFYLENBS0EsTUFFRCxJQUFLLGVBQUwsQ0FDQ3hHLFNBQVcsQ0FDVmdCLE1BQU8sU0FBQSxFQURHLENBRVZ0ZCxTQUFVLFdBQUEsRUFGQSxDQUdWcTZDLFVBQVcsV0FBQSxFQUhELENBSVZDLFdBQVksV0FBQSxFQUNaO0VBTFUsQ0FBWCxDQU9BLE1BL0RGLENBbUVBLzRCLE9BQVE2NEIsTUFBTXBqRSxFQUFkLEVBQXFCc2xDLFFBQXJCLENBRUEsZUFBQSxDQUVBLENBbkZLLENBQVAsQ0F1RkEsQ0FFRCxVQUFZLENBQVosQ0FFQSxvQkFBQSxFQUF1QixDQUV0QixVQUFZLGlCQUFBLEVBQVosQ0FFQSxVQUFZLENBRVh0bEMsR0FBSThtQixPQUZPLENBSVhxMUIsS0FBTSxFQUpLLENBTVhvbkIsUUFBUyxDQUFFLENBQUYsQ0FBSyxDQUFMLENBQVEsQ0FBUixDQU5FLENBT1h0QixZQUFhLEVBUEYsQ0FRWGwzQixxQkFBc0IsRUFSWCxDQVNYQyx3QkFBeUIsRUFUZCxDQVVYazNCLEtBQU0sRUFWSyxDQVdYNzJCLGNBQWUsRUFYSixDQVlYQyxpQkFBa0IsRUFaUCxDQWFYNjJCLFNBQVUsRUFiQyxDQWNYbjlELE1BQU8sRUFkSSxDQWVYMG1DLGVBQWdCLEVBZkwsQ0FnQlhDLGtCQUFtQixFQWhCUixDQWlCWHkyQixLQUFNLEVBakJLLENBQVosQ0FxQkEsWUFBYyxXQUFBLEVBQWQsQ0FDQSxZQUFjLFdBQUEsRUFBZCxDQUNBLGFBQWUsV0FBQSxFQUFmLENBRUEsY0FBQSxDQUFnQjczQixNQUFoQixDQUF3QncyQixPQUF4QixDQUFpQ3Z4QyxNQUFqQyxDQUEwQyxDQUV6QyxNQUFRLENBQVIsQ0FBVzkxQixFQUFJLENBQWYsQ0FBa0JrQixFQUFJLENBQXRCLENBRUEsc0JBQXdCLENBQXhCLENBQ0EsZ0JBQWtCLENBQWxCLENBQ0EsZUFBaUIsQ0FBakIsQ0FDQSxtQkFBcUIsQ0FBckIsQ0FDQSxlQUFpQixDQUFqQixDQUVBLGVBQWlCNDBCLE9BQU9tbEIsa0JBQXhCLENBRUEsSUFBTSxNQUFRLENBQVIsQ0FBVzk1QyxFQUFJMHZDLE9BQU94eUMsTUFBNUIsQ0FBb0NLLEVBQUl5QyxDQUF4QyxDQUEyQ3pDLEdBQTNDLENBQWtELENBRWpELFVBQVlteUMsT0FBUW55QyxDQUFSLENBQVosQ0FFQSxVQUFZZ3JFLE1BQU05OEIsS0FBbEIsQ0FDQSxjQUFnQjg4QixNQUFNSSxTQUF0QixDQUNBLGFBQWVKLE1BQU1sbEMsUUFBckIsQ0FFQSxjQUFrQmtsQyxNQUFNejRCLE1BQU4sRUFBZ0J5NEIsTUFBTXo0QixNQUFOLENBQWE1QyxHQUEvQixDQUF1Q3E3QixNQUFNejRCLE1BQU4sQ0FBYTVDLEdBQWIsQ0FBaUJuUyxPQUF4RCxDQUFrRSxJQUFsRixDQUVBLEdBQUt3dEMsTUFBTUssY0FBWCxDQUE0QixDQUUzQjUwRCxHQUFLeTNCLE1BQU16M0IsQ0FBTixDQUFVMjBELFNBQWYsQ0FDQTlwRSxHQUFLNHNDLE1BQU01c0MsQ0FBTixDQUFVOHBFLFNBQWYsQ0FDQTVvRSxHQUFLMHJDLE1BQU0xckMsQ0FBTixDQUFVNG9FLFNBQWYsQ0FFQSxDQU5ELFFBTVlKLE1BQU1NLGtCQUFYLENBQWdDLENBRXRDLGFBQWVsdkIsTUFBTTE0QyxHQUFOLENBQVdzbkUsS0FBWCxDQUFmLENBRUE5OUIsU0FBU2dCLEtBQVQsQ0FBZXRwQixJQUFmLENBQXFCb21ELE1BQU05OEIsS0FBM0IsRUFBbUM1b0IsY0FBbkMsQ0FBbUQwbEQsTUFBTUksU0FBekQsRUFDQWwrQixTQUFTNUosU0FBVCxDQUFtQnpLLHFCQUFuQixDQUEwQ215QyxNQUFNMXpDLFdBQWhELEVBQ0FpMEMsUUFBUTF5QyxxQkFBUixDQUErQm15QyxNQUFNcGxFLE1BQU4sQ0FBYTB4QixXQUE1QyxFQUNBNFYsU0FBUzVKLFNBQVQsQ0FBbUJwZSxHQUFuQixDQUF3QnFtRCxPQUF4QixFQUNBcitCLFNBQVM1SixTQUFULENBQW1COUwsa0JBQW5CLENBQXVDeWpDLFVBQXZDLEVBRUEvdEIsU0FBU3FGLE1BQVQsQ0FBa0J5NEIsTUFBTTd4QixVQUF4QixDQUVBLEdBQUs2eEIsTUFBTTd4QixVQUFYLENBQXdCLENBRXZCLFdBQWE2eEIsTUFBTXo0QixNQUFuQixDQUVBckYsU0FBU3NGLFVBQVQsQ0FBc0JELE9BQU9pNUIsSUFBN0IsQ0FDQXQrQixTQUFTdUYsWUFBVCxDQUF3QkYsT0FBTzdaLE1BQS9CLENBQ0F3VSxTQUFTd0YsYUFBVCxDQUF5QkgsT0FBT2s1QixPQUFoQyxDQUVBLENBRUQvdEUsTUFBTWkxQyxvQkFBTixDQUE0Qis0QixpQkFBNUIsRUFBa0R6QixTQUFsRCxDQUNBdnNFLE1BQU1rMUMsdUJBQU4sQ0FBK0I4NEIsaUJBQS9CLEVBQXFEVixNQUFNejRCLE1BQU4sQ0FBYXRoQixNQUFsRSxDQUNBdnpCLE1BQU1tc0UsV0FBTixDQUFtQjZCLGlCQUFuQixFQUF5Q3grQixRQUF6QyxDQUVBdytCLG9CQUVBLENBNUJNLFFBNEJLVixNQUFNVyxXQUFYLENBQXlCLENBRS9CLGFBQWV2dkIsTUFBTTE0QyxHQUFOLENBQVdzbkUsS0FBWCxDQUFmLENBRUE5OUIsU0FBU3RjLFFBQVQsQ0FBa0JpSSxxQkFBbEIsQ0FBeUNteUMsTUFBTTF6QyxXQUEvQyxFQUNBNFYsU0FBU3RjLFFBQVQsQ0FBa0JoQyxZQUFsQixDQUFnQ3FzQyxVQUFoQyxFQUVBL3RCLFNBQVNnQixLQUFULENBQWV0cEIsSUFBZixDQUFxQnNwQixLQUFyQixFQUE2QjVvQixjQUE3QixDQUE2QzhsRCxTQUE3QyxFQUNBbCtCLFNBQVNwSCxRQUFULENBQW9CQSxRQUFwQixDQUVBb0gsU0FBUzVKLFNBQVQsQ0FBbUJ6SyxxQkFBbkIsQ0FBMENteUMsTUFBTTF6QyxXQUFoRCxFQUNBaTBDLFFBQVExeUMscUJBQVIsQ0FBK0JteUMsTUFBTXBsRSxNQUFOLENBQWEweEIsV0FBNUMsRUFDQTRWLFNBQVM1SixTQUFULENBQW1CcGUsR0FBbkIsQ0FBd0JxbUQsT0FBeEIsRUFDQXIrQixTQUFTNUosU0FBVCxDQUFtQjlMLGtCQUFuQixDQUF1Q3lqQyxVQUF2QyxFQUVBL3RCLFNBQVM0RixPQUFULENBQW1CanhDLEtBQUtpbUIsR0FBTCxDQUFVa2pELE1BQU14a0QsS0FBaEIsQ0FBbkIsQ0FDQTBtQixTQUFTNkYsV0FBVCxDQUF1Qmx4QyxLQUFLaW1CLEdBQUwsQ0FBVWtqRCxNQUFNeGtELEtBQU4sRUFBZ0IsRUFBSXdrRCxNQUFNWSxRQUExQixDQUFWLENBQXZCLENBQ0ExK0IsU0FBUzhGLEtBQVQsQ0FBbUJnNEIsTUFBTWxsQyxRQUFOLEdBQW1CLENBQXJCLENBQTJCLEdBQTNCLENBQWlDa2xDLE1BQU1oNEIsS0FBeEQsQ0FFQTlGLFNBQVNxRixNQUFULENBQWtCeTRCLE1BQU03eEIsVUFBeEIsQ0FFQSxHQUFLNnhCLE1BQU03eEIsVUFBWCxDQUF3QixDQUV2QixXQUFhNnhCLE1BQU16NEIsTUFBbkIsQ0FFQXJGLFNBQVNzRixVQUFULENBQXNCRCxPQUFPaTVCLElBQTdCLENBQ0F0K0IsU0FBU3VGLFlBQVQsQ0FBd0JGLE9BQU83WixNQUEvQixDQUNBd1UsU0FBU3dGLGFBQVQsQ0FBeUJILE9BQU9rNUIsT0FBaEMsQ0FFQSxDQUVEL3RFLE1BQU11MUMsYUFBTixDQUFxQjQ0QixVQUFyQixFQUFvQzVCLFNBQXBDLENBQ0F2c0UsTUFBTXcxQyxnQkFBTixDQUF3QjI0QixVQUF4QixFQUF1Q2IsTUFBTXo0QixNQUFOLENBQWF0aEIsTUFBcEQsQ0FDQXZ6QixNQUFNb3NFLElBQU4sQ0FBWStCLFVBQVosRUFBMkIzK0IsUUFBM0IsQ0FFQTIrQixhQUVBLENBckNNLFFBcUNLYixNQUFNYyxlQUFYLENBQTZCLENBRW5DLGFBQWUxdkIsTUFBTTE0QyxHQUFOLENBQVdzbkUsS0FBWCxDQUFmLENBRUE7RUFDQTtFQUVBO0VBQ0E5OUIsU0FBU2dCLEtBQVQsQ0FBZXRwQixJQUFmLENBQXFCc3BCLEtBQXJCLEVBQTZCNW9CLGNBQTdCLENBQTZDOGxELFNBQTdDLEVBRUFsK0IsU0FBU3RjLFFBQVQsQ0FBa0JpSSxxQkFBbEIsQ0FBeUNteUMsTUFBTTF6QyxXQUEvQyxFQUNBNFYsU0FBU3RjLFFBQVQsQ0FBa0JoQyxZQUFsQixDQUFnQ3FzQyxVQUFoQyxFQUVBO0VBQ0E4USxTQUFTNWlELFFBQVQsR0FDQWdRLFFBQVF2VSxJQUFSLENBQWNvbUQsTUFBTTF6QyxXQUFwQixFQUNBNkIsUUFBUTNNLFdBQVIsQ0FBcUJ5dUMsVUFBckIsRUFDQThRLFNBQVNsaUQsZUFBVCxDQUEwQnNQLE9BQTFCLEVBRUErVCxTQUFTKzlCLFNBQVQsQ0FBbUIzNkQsR0FBbkIsQ0FBd0IwNkQsTUFBTWp2QyxLQUFOLENBQWMsR0FBdEMsQ0FBMkMsR0FBM0MsQ0FBZ0QsR0FBaEQsRUFDQW1SLFNBQVNnK0IsVUFBVCxDQUFvQjU2RCxHQUFwQixDQUF5QixHQUF6QixDQUE4QjA2RCxNQUFNaHZDLE1BQU4sQ0FBZSxHQUE3QyxDQUFrRCxHQUFsRCxFQUVBa1IsU0FBUys5QixTQUFULENBQW1CcjhDLFlBQW5CLENBQWlDbTlDLFFBQWpDLEVBQ0E3K0IsU0FBU2crQixVQUFULENBQW9CdDhDLFlBQXBCLENBQWtDbTlDLFFBQWxDLEVBRUE7RUFDQTtFQUVBcnVFLE1BQU1xc0UsUUFBTixDQUFnQmlDLGNBQWhCLEVBQW1DOStCLFFBQW5DLENBRUE4K0IsaUJBRUEsQ0FoQ00sUUFnQ0toQixNQUFNaUIsWUFBWCxDQUEwQixDQUVoQyxhQUFlN3ZCLE1BQU0xNEMsR0FBTixDQUFXc25FLEtBQVgsQ0FBZixDQUVBOTlCLFNBQVN0YyxRQUFULENBQWtCaUkscUJBQWxCLENBQXlDbXlDLE1BQU0xekMsV0FBL0MsRUFDQTRWLFNBQVN0YyxRQUFULENBQWtCaEMsWUFBbEIsQ0FBZ0Nxc0MsVUFBaEMsRUFFQS90QixTQUFTZ0IsS0FBVCxDQUFldHBCLElBQWYsQ0FBcUJvbUQsTUFBTTk4QixLQUEzQixFQUFtQzVvQixjQUFuQyxDQUFtRDBsRCxNQUFNSSxTQUF6RCxFQUNBbCtCLFNBQVNwSCxRQUFULENBQW9Ca2xDLE1BQU1sbEMsUUFBMUIsQ0FDQW9ILFNBQVM4RixLQUFULENBQW1CZzRCLE1BQU1sbEMsUUFBTixHQUFtQixDQUFyQixDQUEyQixHQUEzQixDQUFpQ2tsQyxNQUFNaDRCLEtBQXhELENBRUE5RixTQUFTcUYsTUFBVCxDQUFrQnk0QixNQUFNN3hCLFVBQXhCLENBRUEsR0FBSzZ4QixNQUFNN3hCLFVBQVgsQ0FBd0IsQ0FFdkIsV0FBYTZ4QixNQUFNejRCLE1BQW5CLENBRUFyRixTQUFTc0YsVUFBVCxDQUFzQkQsT0FBT2k1QixJQUE3QixDQUNBdCtCLFNBQVN1RixZQUFULENBQXdCRixPQUFPN1osTUFBL0IsQ0FDQXdVLFNBQVN3RixhQUFULENBQXlCSCxPQUFPazVCLE9BQWhDLENBQ0F2K0IsU0FBU2tHLGdCQUFULENBQTRCYixPQUFPbmIsTUFBUCxDQUFjdkYsSUFBMUMsQ0FDQXFiLFNBQVNtRyxlQUFULENBQTJCZCxPQUFPbmIsTUFBUCxDQUFjdEYsR0FBekMsQ0FFQSxDQUVEcDBCLE1BQU00MUMsY0FBTixDQUFzQjQ0QixXQUF0QixFQUFzQ2pDLFNBQXRDLENBQ0F2c0UsTUFBTTYxQyxpQkFBTixDQUF5QjI0QixXQUF6QixFQUF5Q2xCLE1BQU16NEIsTUFBTixDQUFhdGhCLE1BQXRELENBQ0F2ekIsTUFBTWtQLEtBQU4sQ0FBYXMvRCxXQUFiLEVBQTZCaC9CLFFBQTdCLENBRUFnL0IsY0FFQSxDQS9CTSxRQStCS2xCLE1BQU1tQixpQkFBWCxDQUErQixDQUVyQyxhQUFlL3ZCLE1BQU0xNEMsR0FBTixDQUFXc25FLEtBQVgsQ0FBZixDQUVBOTlCLFNBQVM1SixTQUFULENBQW1CeksscUJBQW5CLENBQTBDbXlDLE1BQU0xekMsV0FBaEQsRUFDQTRWLFNBQVM1SixTQUFULENBQW1COUwsa0JBQW5CLENBQXVDeWpDLFVBQXZDLEVBQ0EvdEIsU0FBUzVKLFNBQVQsQ0FBbUIvYyxTQUFuQixHQUVBMm1CLFNBQVN1RyxRQUFULENBQWtCN3VCLElBQWxCLENBQXdCb21ELE1BQU05OEIsS0FBOUIsRUFBc0M1b0IsY0FBdEMsQ0FBc0Q4bEQsU0FBdEQsRUFDQWwrQixTQUFTd0csV0FBVCxDQUFxQjl1QixJQUFyQixDQUEyQm9tRCxNQUFNdDNCLFdBQWpDLEVBQStDcHVCLGNBQS9DLENBQStEOGxELFNBQS9ELEVBRUExdEUsTUFBTXNzRSxJQUFOLENBQVlvQyxVQUFaLEVBQTJCbC9CLFFBQTNCLENBRUFrL0IsYUFFQSxDQUVELENBRUQxdUUsTUFBTXl0RSxPQUFOLENBQWUsQ0FBZixFQUFxQjEwRCxDQUFyQixDQUNBL1ksTUFBTXl0RSxPQUFOLENBQWUsQ0FBZixFQUFxQjdwRSxDQUFyQixDQUNBNUQsTUFBTXl0RSxPQUFOLENBQWUsQ0FBZixFQUFxQjNvRSxDQUFyQixDQUVBOUUsTUFBTW1zRSxXQUFOLENBQWtCbHFFLE1BQWxCLENBQTJCK3JFLGlCQUEzQixDQUNBaHVFLE1BQU1vc0UsSUFBTixDQUFXbnFFLE1BQVgsQ0FBb0Jrc0UsVUFBcEIsQ0FDQW51RSxNQUFNcXNFLFFBQU4sQ0FBZXBxRSxNQUFmLENBQXdCcXNFLGNBQXhCLENBQ0F0dUUsTUFBTWtQLEtBQU4sQ0FBWWpOLE1BQVosQ0FBcUJ1c0UsV0FBckIsQ0FDQXh1RSxNQUFNc3NFLElBQU4sQ0FBV3JxRSxNQUFYLENBQW9CeXNFLFVBQXBCLENBRUExdUUsTUFBTXFtRCxJQUFOLENBQWFybUQsTUFBTWtLLEVBQU4sQ0FBVyxHQUFYLENBQWlCOGpFLGlCQUFqQixDQUFxQyxHQUFyQyxDQUEyQ1EsV0FBM0MsQ0FBeUQsR0FBekQsQ0FBK0RMLFVBQS9ELENBQTRFLEdBQTVFLENBQWtGRyxjQUFsRixDQUFtRyxHQUFuRyxDQUF5R0ksVUFBekcsQ0FBc0gsR0FBdEgsQ0FBNEh6RCxRQUFRaHBFLE1BQWpKLENBRUEsQ0FFRCxPQUFPLENBQ04wc0UsTUFBT0EsS0FERCxDQUVOM3VFLE1BQU9BLEtBRkQsQ0FBUCxDQUtBLENBRUQ7O0tBSUEseUJBQUEsRUFBNEIsQ0FFM0IsV0FBYSxlQUFBLEVBQWIsQ0FFQSxnQkFBa0IsRUFBbEIsQ0FDQSxpQkFBbUIsRUFBbkIsQ0FDQSxpQkFBbUIsRUFBbkIsQ0FFQSxhQUFBLEVBQWdCLENBRWY0dUUsWUFBWTNzRSxNQUFaLENBQXFCLENBQXJCLENBQ0E0c0UsYUFBYTVzRSxNQUFiLENBQXNCLENBQXRCLENBQ0E2c0UsYUFBYTdzRSxNQUFiLENBQXNCLENBQXRCLENBRUEsQ0FFRCxrQkFBQSxDQUFvQnFyRSxLQUFwQixDQUE0QixDQUUzQnNCLFlBQVludEUsSUFBWixDQUFrQjZyRSxLQUFsQixFQUVBLENBRUQsbUJBQUEsQ0FBcUJ5QixXQUFyQixDQUFtQyxDQUVsQ0YsYUFBYXB0RSxJQUFiLENBQW1Cc3RFLFdBQW5CLEVBRUEsQ0FFRCxtQkFBQSxDQUFxQkEsV0FBckIsQ0FBbUMsQ0FFbENELGFBQWFydEUsSUFBYixDQUFtQnN0RSxXQUFuQixFQUVBLENBRUQsb0JBQUEsQ0FBc0JyMUMsTUFBdEIsQ0FBK0IsQ0FFOUIrYSxPQUFPazZCLEtBQVAsQ0FBY0MsV0FBZCxDQUEyQkMsWUFBM0IsQ0FBeUNuMUMsTUFBekMsRUFFQSxDQUVELFVBQVksQ0FDWGsxQyxZQUFhQSxXQURGLENBRVhDLGFBQWNBLFlBRkgsQ0FHWEMsYUFBY0EsWUFISCxDQUtYcjZCLE9BQVFBLE1BTEcsQ0FBWixDQVFBLE9BQU8sQ0FDTmdvQixLQUFNQSxJQURBLENBRU56OEQsTUFBT0EsS0FGRCxDQUdOZ3ZFLFlBQWFBLFdBSFAsQ0FLTkMsVUFBV0EsU0FMTCxDQU1OQyxXQUFZQSxVQU5OLENBT05DLFdBQVlBLFVBUE4sQ0FBUCxDQVVBLENBRUQsMEJBQUEsRUFBNkIsQ0FFNUIsaUJBQW1CLEVBQW5CLENBRUEsWUFBQSxDQUFjeFcsS0FBZCxDQUFxQmovQixNQUFyQixDQUE4QixDQUU3QixTQUFXaS9CLE1BQU16dUQsRUFBTixDQUFXLEdBQVgsQ0FBaUJ3dkIsT0FBT3h2QixFQUFuQyxDQUVBLGdCQUFrQmtsRSxhQUFjL29CLElBQWQsQ0FBbEIsQ0FFQSxHQUFLZ3BCLGNBQWdCenVFLFNBQXJCLENBQWlDLENBRWhDeXVFLFlBQWMsb0JBQUEsRUFBZCxDQUNBRCxhQUFjL29CLElBQWQsRUFBdUJncEIsV0FBdkIsQ0FFQSxDQUVELGtCQUFBLENBRUEsQ0FFRCxnQkFBQSxFQUFtQixDQUVsQkQsYUFBZSxFQUFmLENBRUEsQ0FFRCxPQUFPLENBQ05wcEUsSUFBS0EsR0FEQyxDQUVOKzRCLFFBQVNBLE9BRkgsQ0FBUCxDQUtBLENBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztLQXVCQSwwQkFBQSxDQUE0QnNmLFVBQTVCLENBQXlDLENBRXhDNlEsU0FBU2h5RCxJQUFULENBQWUsSUFBZixFQUVBLEtBQUtELElBQUwsQ0FBWSxtQkFBWixDQUVBLEtBQUswcUUsWUFBTCxDQUFvQjJILGlCQUFwQixDQUVBLEtBQUtwZixRQUFMLENBQWdCLEtBQWhCLENBQ0EsS0FBSzNQLFlBQUwsQ0FBb0IsS0FBcEIsQ0FFQSxLQUFLdE8sR0FBTCxDQUFXLElBQVgsQ0FFQSxLQUFLRSxRQUFMLENBQWdCLElBQWhCLENBRUEsS0FBS3dCLGVBQUwsQ0FBdUIsSUFBdkIsQ0FDQSxLQUFLQyxpQkFBTCxDQUF5QixDQUF6QixDQUNBLEtBQUtDLGdCQUFMLENBQXdCLENBQXhCLENBRUEsS0FBS2ljLFNBQUwsQ0FBaUIsS0FBakIsQ0FDQSxLQUFLQyxrQkFBTCxDQUEwQixDQUExQixDQUVBLEtBQUszYixHQUFMLENBQVcsS0FBWCxDQUNBLEtBQUtLLE1BQUwsQ0FBYyxLQUFkLENBRUEsS0FBSzRhLFNBQUwsQ0FBZ0JoUixVQUFoQixFQUVBLENBRUR5ckIsa0JBQWtCdHVFLFNBQWxCLENBQThCRCxPQUFPaUIsTUFBUCxDQUFlMHlELFNBQVMxekQsU0FBeEIsQ0FBOUIsQ0FDQXN1RSxrQkFBa0J0dUUsU0FBbEIsQ0FBNEJzQyxXQUE1QixDQUEwQ2dzRSxpQkFBMUMsQ0FFQUEsa0JBQWtCdHVFLFNBQWxCLENBQTRCK3pFLG1CQUE1QixDQUFrRCxJQUFsRCxDQUVBekYsa0JBQWtCdHVFLFNBQWxCLENBQTRCMHJCLElBQTVCLENBQW1DLFNBQVc1ZixNQUFYLENBQW9CLENBRXRENG5ELFNBQVMxekQsU0FBVCxDQUFtQjByQixJQUFuQixDQUF3QmhxQixJQUF4QixDQUE4QixJQUE5QixDQUFvQ29LLE1BQXBDLEVBRUEsS0FBS3FnRSxZQUFMLENBQW9CcmdFLE9BQU9xZ0UsWUFBM0IsQ0FFQSxLQUFLelgsUUFBTCxDQUFnQjVvRCxPQUFPNG9ELFFBQXZCLENBQ0EsS0FBSzNQLFlBQUwsQ0FBb0JqNUMsT0FBT2k1QyxZQUEzQixDQUVBLEtBQUt0TyxHQUFMLENBQVczcUMsT0FBTzJxQyxHQUFsQixDQUVBLEtBQUtFLFFBQUwsQ0FBZ0I3cUMsT0FBTzZxQyxRQUF2QixDQUVBLEtBQUt3QixlQUFMLENBQXVCcnNDLE9BQU9xc0MsZUFBOUIsQ0FDQSxLQUFLQyxpQkFBTCxDQUF5QnRzQyxPQUFPc3NDLGlCQUFoQyxDQUNBLEtBQUtDLGdCQUFMLENBQXdCdnNDLE9BQU91c0MsZ0JBQS9CLENBRUEsS0FBS2ljLFNBQUwsQ0FBaUJ4b0QsT0FBT3dvRCxTQUF4QixDQUNBLEtBQUtDLGtCQUFMLENBQTBCem9ELE9BQU95b0Qsa0JBQWpDLENBRUEsV0FBQSxDQUVBLENBdEJELENBd0JBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7S0F1QkEsNkJBQUEsQ0FBK0IxUixVQUEvQixDQUE0QyxDQUUzQzZRLFNBQVNoeUQsSUFBVCxDQUFlLElBQWYsRUFFQSxLQUFLRCxJQUFMLENBQVksc0JBQVosQ0FFQSxLQUFLMDZDLGlCQUFMLENBQXlCLFdBQUEsRUFBekIsQ0FDQSxLQUFLQyxZQUFMLENBQW9CLENBQXBCLENBQ0EsS0FBS0MsV0FBTCxDQUFtQixJQUFuQixDQUVBLEtBQUtxWSxRQUFMLENBQWdCLEtBQWhCLENBQ0EsS0FBSzNQLFlBQUwsQ0FBb0IsS0FBcEIsQ0FFQSxLQUFLdE8sR0FBTCxDQUFXLElBQVgsQ0FFQSxLQUFLRSxRQUFMLENBQWdCLElBQWhCLENBRUEsS0FBS3dCLGVBQUwsQ0FBdUIsSUFBdkIsQ0FDQSxLQUFLQyxpQkFBTCxDQUF5QixDQUF6QixDQUNBLEtBQUtDLGdCQUFMLENBQXdCLENBQXhCLENBRUEsS0FBS08sR0FBTCxDQUFXLEtBQVgsQ0FDQSxLQUFLSyxNQUFMLENBQWMsS0FBZCxDQUVBLEtBQUs0YSxTQUFMLENBQWdCaFIsVUFBaEIsRUFFQSxDQUVEMHJCLHFCQUFxQnZ1RSxTQUFyQixDQUFpQ0QsT0FBT2lCLE1BQVAsQ0FBZTB5RCxTQUFTMXpELFNBQXhCLENBQWpDLENBQ0F1dUUscUJBQXFCdnVFLFNBQXJCLENBQStCc0MsV0FBL0IsQ0FBNkNpc0Usb0JBQTdDLENBRUFBLHFCQUFxQnZ1RSxTQUFyQixDQUErQmcwRSxzQkFBL0IsQ0FBd0QsSUFBeEQsQ0FFQXpGLHFCQUFxQnZ1RSxTQUFyQixDQUErQjByQixJQUEvQixDQUFzQyxTQUFXNWYsTUFBWCxDQUFvQixDQUV6RDRuRCxTQUFTMXpELFNBQVQsQ0FBbUIwckIsSUFBbkIsQ0FBd0JocUIsSUFBeEIsQ0FBOEIsSUFBOUIsQ0FBb0NvSyxNQUFwQyxFQUVBLEtBQUtxd0MsaUJBQUwsQ0FBdUJ6d0IsSUFBdkIsQ0FBNkI1ZixPQUFPcXdDLGlCQUFwQyxFQUNBLEtBQUtDLFlBQUwsQ0FBb0J0d0MsT0FBT3N3QyxZQUEzQixDQUNBLEtBQUtDLFdBQUwsQ0FBbUJ2d0MsT0FBT3V3QyxXQUExQixDQUVBLEtBQUtxWSxRQUFMLENBQWdCNW9ELE9BQU80b0QsUUFBdkIsQ0FDQSxLQUFLM1AsWUFBTCxDQUFvQmo1QyxPQUFPaTVDLFlBQTNCLENBRUEsS0FBS3RPLEdBQUwsQ0FBVzNxQyxPQUFPMnFDLEdBQWxCLENBRUEsS0FBS0UsUUFBTCxDQUFnQjdxQyxPQUFPNnFDLFFBQXZCLENBRUEsS0FBS3dCLGVBQUwsQ0FBdUJyc0MsT0FBT3FzQyxlQUE5QixDQUNBLEtBQUtDLGlCQUFMLENBQXlCdHNDLE9BQU9zc0MsaUJBQWhDLENBQ0EsS0FBS0MsZ0JBQUwsQ0FBd0J2c0MsT0FBT3VzQyxnQkFBL0IsQ0FFQSxXQUFBLENBRUEsQ0FyQkQsQ0F1QkE7OztLQUtBLHVCQUFBLENBQXlCNDdCLFNBQXpCLENBQW9DQyxRQUFwQyxDQUE4Q2hVLGNBQTlDLENBQStELENBRTlELGFBQWUsV0FBQSxFQUFmLENBQ0NpVSxrQkFBb0IsV0FBQSxFQURyQixDQUdDQyxlQUFpQixXQUFBLEVBSGxCLENBSUNDLGtCQUFvQixXQUFBLENBQWFuVSxjQUFiLENBQTZCQSxjQUE3QixDQUpyQixDQU1Db1UsWUFBYyxXQUFBLEVBTmYsQ0FPQ0Msb0JBQXNCLFdBQUEsRUFQdkIsQ0FTQ0MsY0FBZ0IsQ0FUakIsQ0FVQ0MsY0FBZ0IsQ0FWakIsQ0FZQ0MsMEJBQTRCLENBQUVGLGNBQWdCQyxhQUFsQixFQUFvQyxDQVpqRSxDQWNDRSxnQkFBa0IsU0FBQSxDQUFXRCx5QkFBWCxDQWRuQixDQWVDRSxtQkFBcUIsU0FBQSxDQUFXRix5QkFBWCxDQWZ0QixDQWlCQ0csZUFBaUIsRUFqQmxCLENBbUJBLGVBQWlCLENBQUUsRUFBR3haLFFBQUwsQ0FBZSxFQUFHeEosU0FBbEIsQ0FBNkIsRUFBR3lKLFVBQWhDLENBQWpCLENBRUEsbUJBQXFCLENBQ3BCLFdBQUEsQ0FBYSxDQUFiLENBQWdCLENBQWhCLENBQW1CLENBQW5CLENBRG9CLENBQ0ksV0FBQSxDQUFhLENBQUUsQ0FBZixDQUFrQixDQUFsQixDQUFxQixDQUFyQixDQURKLENBQzhCLFdBQUEsQ0FBYSxDQUFiLENBQWdCLENBQWhCLENBQW1CLENBQW5CLENBRDlCLENBRXBCLFdBQUEsQ0FBYSxDQUFiLENBQWdCLENBQWhCLENBQW1CLENBQUUsQ0FBckIsQ0FGb0IsQ0FFTSxXQUFBLENBQWEsQ0FBYixDQUFnQixDQUFoQixDQUFtQixDQUFuQixDQUZOLENBRThCLFdBQUEsQ0FBYSxDQUFiLENBQWdCLENBQUUsQ0FBbEIsQ0FBcUIsQ0FBckIsQ0FGOUIsQ0FBckIsQ0FLQSxZQUFjLENBQ2IsV0FBQSxDQUFhLENBQWIsQ0FBZ0IsQ0FBaEIsQ0FBbUIsQ0FBbkIsQ0FEYSxDQUNXLFdBQUEsQ0FBYSxDQUFiLENBQWdCLENBQWhCLENBQW1CLENBQW5CLENBRFgsQ0FDbUMsV0FBQSxDQUFhLENBQWIsQ0FBZ0IsQ0FBaEIsQ0FBbUIsQ0FBbkIsQ0FEbkMsQ0FFYixXQUFBLENBQWEsQ0FBYixDQUFnQixDQUFoQixDQUFtQixDQUFuQixDQUZhLENBRVcsV0FBQSxDQUFhLENBQWIsQ0FBZ0IsQ0FBaEIsQ0FBbUIsQ0FBbkIsQ0FGWCxDQUVtQyxXQUFBLENBQWEsQ0FBYixDQUFnQixDQUFoQixDQUFtQixDQUFFLENBQXJCLENBRm5DLENBQWQsQ0FLQSxvQkFBc0IsQ0FDckIsV0FBQSxFQURxQixDQUNOLFdBQUEsRUFETSxDQUNTLFdBQUEsRUFEVCxDQUVyQixXQUFBLEVBRnFCLENBRU4sV0FBQSxFQUZNLENBRVMsV0FBQSxFQUZULENBQXRCLENBS0E7RUFFQSxJQUFNLE1BQVEsQ0FBZCxDQUFpQngwRCxJQUFNNHRFLHlCQUF2QixDQUFrRCxFQUFHNXRFLENBQXJELENBQXlELENBRXhELGdCQUFrQixDQUFFQSxFQUFJMHRFLGFBQU4sSUFBMEIsQ0FBNUMsQ0FDQSxnQkFBa0IsQ0FBRTF0RSxFQUFJMnRFLGFBQU4sSUFBMEIsQ0FBNUMsQ0FFQSxrQkFBb0IscUJBQUEsQ0FBdUIsQ0FFMUN0SSxhQUFjMkksZ0JBRjRCLENBSTFDL3ZCLGFBQWNnd0IsV0FKNEIsQ0FLMUNyZ0IsU0FBVXNnQixXQUxnQyxDQUF2QixDQUFwQixDQVNBTCxnQkFBaUI3dEUsQ0FBakIsRUFBdUJtdUUsYUFBdkIsQ0FFQTtFQUVBLHFCQUF1Qix3QkFBQSxDQUEwQixDQUVoRGx3QixhQUFjZ3dCLFdBRmtDLENBR2hEcmdCLFNBQVVzZ0IsV0FIc0MsQ0FBMUIsQ0FBdkIsQ0FPQUosbUJBQW9COXRFLENBQXBCLEVBQTBCb3VFLGdCQUExQixDQUVBLENBRUQ7RUFFQSxVQUFZLElBQVosQ0FFQSxLQUFLbnhCLE9BQUwsQ0FBZSxLQUFmLENBRUEsS0FBS294QixVQUFMLENBQWtCLElBQWxCLENBQ0EsS0FBSzFtQixXQUFMLENBQW1CLEtBQW5CLENBRUEsS0FBS2h0RCxJQUFMLENBQVkwb0UsWUFBWixDQUVBLEtBQUs5TCxNQUFMLENBQWMsU0FBV3BsQixNQUFYLENBQW1Ca2tCLEtBQW5CLENBQTBCai9CLE1BQTFCLENBQW1DLENBRWhELEdBQUtnSixNQUFNNmMsT0FBTixHQUFrQixLQUF2QixDQUErQixPQUMvQixHQUFLN2MsTUFBTWl1QyxVQUFOLEdBQXFCLEtBQXJCLEVBQThCanVDLE1BQU11bkIsV0FBTixHQUFzQixLQUF6RCxDQUFpRSxPQUVqRSxHQUFLeFYsT0FBT3h5QyxNQUFQLEdBQWtCLENBQXZCLENBQTJCLE9BRTNCO0VBQ0EsUUFBVXd0RSxVQUFVNXlFLE9BQXBCLENBQ0EsV0FBYTR5RSxVQUFVenZFLEtBQXZCLENBRUE7RUFDQTR3RSxPQUFPLzFCLE9BQVAsQ0FBZ0JnMkIsSUFBSUMsS0FBcEIsRUFDQUYsT0FBT2wzQixPQUFQLENBQWVsSixLQUFmLENBQXFCc29CLFFBQXJCLENBQStCLENBQS9CLENBQWtDLENBQWxDLENBQXFDLENBQXJDLENBQXdDLENBQXhDLEVBQ0E4WCxPQUFPbDNCLE9BQVAsQ0FBZXRDLEtBQWYsQ0FBcUIyNUIsT0FBckIsQ0FBOEIsSUFBOUIsRUFDQUgsT0FBT0ksY0FBUCxDQUF1QixLQUF2QixFQUVBO0VBRUEsYUFBQSxDQUVBLElBQU0sTUFBUSxDQUFSLENBQVd0dkMsR0FBSytTLE9BQU94eUMsTUFBN0IsQ0FBcUNLLEVBQUlvL0IsRUFBekMsQ0FBNkNwL0IsR0FBN0MsQ0FBb0QsQ0FFbkQsVUFBWW15QyxPQUFRbnlDLENBQVIsQ0FBWixDQUNBLFdBQWFnckUsTUFBTXo0QixNQUFuQixDQUNBLGlCQUFtQnk0QixPQUFTQSxNQUFNaUIsWUFBbEMsQ0FFQSxHQUFLMTVCLFNBQVdqMEMsU0FBaEIsQ0FBNEIsQ0FFM0IyVyxRQUFRNlAsSUFBUixDQUFjLHVCQUFkLENBQXVDa21ELEtBQXZDLENBQThDLGdCQUE5QyxFQUNBLFNBRUEsQ0FFRCxpQkFBbUJ6NEIsT0FBT25iLE1BQTFCLENBRUFrMkMsZUFBZTFvRCxJQUFmLENBQXFCMnRCLE9BQU9rNUIsT0FBNUIsRUFDQTZCLGVBQWU1bUUsR0FBZixDQUFvQjZtRSxpQkFBcEIsRUFFQSxHQUFLdEIsWUFBTCxDQUFvQixDQUVuQixZQUFjcUIsZUFBZS82RCxDQUE3QixDQUNBLGFBQWUrNkQsZUFBZXZxRCxDQUE5QixDQUVBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUVBO0VBQ0E0ckQsZ0JBQWlCLENBQWpCLEVBQXFCcitELEdBQXJCLENBQTBCcytELFFBQVUsQ0FBcEMsQ0FBdUNDLFFBQXZDLENBQWlERCxPQUFqRCxDQUEwREMsUUFBMUQsRUFDQTtFQUNBRixnQkFBaUIsQ0FBakIsRUFBcUJyK0QsR0FBckIsQ0FBMEIsQ0FBMUIsQ0FBNkJ1K0QsUUFBN0IsQ0FBdUNELE9BQXZDLENBQWdEQyxRQUFoRCxFQUNBO0VBQ0FGLGdCQUFpQixDQUFqQixFQUFxQnIrRCxHQUFyQixDQUEwQnMrRCxRQUFVLENBQXBDLENBQXVDQyxRQUF2QyxDQUFpREQsT0FBakQsQ0FBMERDLFFBQTFELEVBQ0E7RUFDQUYsZ0JBQWlCLENBQWpCLEVBQXFCcitELEdBQXJCLENBQTBCcytELE9BQTFCLENBQW1DQyxRQUFuQyxDQUE2Q0QsT0FBN0MsQ0FBc0RDLFFBQXRELEVBQ0E7RUFDQUYsZ0JBQWlCLENBQWpCLEVBQXFCcitELEdBQXJCLENBQTBCcytELFFBQVUsQ0FBcEMsQ0FBdUMsQ0FBdkMsQ0FBMENBLE9BQTFDLENBQW1EQyxRQUFuRCxFQUNBO0VBQ0FGLGdCQUFpQixDQUFqQixFQUFxQnIrRCxHQUFyQixDQUEwQnMrRCxPQUExQixDQUFtQyxDQUFuQyxDQUFzQ0EsT0FBdEMsQ0FBK0NDLFFBQS9DLEVBRUF2QixlQUFlLzZELENBQWYsRUFBb0IsR0FBcEIsQ0FDQSs2RCxlQUFldnFELENBQWYsRUFBb0IsR0FBcEIsQ0FFQSxDQUVELEdBQUt3dkIsT0FBTzVDLEdBQVAsR0FBZSxJQUFwQixDQUEyQixDQUUxQixTQUFXLENBQUUzVixVQUFXbUUsYUFBYixDQUE0QnBFLFVBQVdvRSxhQUF2QyxDQUFzRGxFLE9BQVFZLFVBQTlELENBQVgsQ0FFQTBYLE9BQU81QyxHQUFQLENBQWEscUJBQUEsQ0FBdUIyOUIsZUFBZS82RCxDQUF0QyxDQUF5Qys2RCxlQUFldnFELENBQXhELENBQTJEK3JELElBQTNELENBQWIsQ0FDQXY4QixPQUFPNUMsR0FBUCxDQUFXblMsT0FBWCxDQUFtQnhoQyxJQUFuQixDQUEwQmd2RSxNQUFNaHZFLElBQU4sQ0FBYSxZQUF2QyxDQUVBK3lFLGFBQWFweUIsc0JBQWIsR0FFQSxDQUVELEdBQUtwSyxPQUFPeThCLGlCQUFaLENBQWdDLENBRS9CejhCLE9BQU81ZSxNQUFQLENBQWVxM0MsS0FBZixFQUVBLENBRUQsY0FBZ0J6NEIsT0FBTzVDLEdBQXZCLENBQ0EsaUJBQW1CNEMsT0FBT3RoQixNQUExQixDQUVBdzhDLG9CQUFvQjUwQyxxQkFBcEIsQ0FBMkNteUMsTUFBTTF6QyxXQUFqRCxFQUNBeTNDLGFBQWFuK0MsUUFBYixDQUFzQmhNLElBQXRCLENBQTRCNm9ELG1CQUE1QixFQUVBLEdBQUt4QixZQUFMLENBQW9CLENBRW5CZ0QsVUFBWSxDQUFaLENBRUE7RUFDQTtFQUVBQyxhQUFhbC9DLGVBQWIsQ0FBOEIsQ0FBRXk5QyxvQkFBb0JsN0QsQ0FBcEQsQ0FBdUQsQ0FBRWs3RCxvQkFBb0IxcUQsQ0FBN0UsQ0FBZ0YsQ0FBRTBxRCxvQkFBb0I3akQsQ0FBdEcsRUFFQSxDQVRELElBU08sQ0FFTnFsRCxVQUFZLENBQVosQ0FFQXpCLFlBQVkzMEMscUJBQVosQ0FBbUNteUMsTUFBTXBsRSxNQUFOLENBQWEweEIsV0FBaEQsRUFDQXkzQyxhQUFhNWlELE1BQWIsQ0FBcUJxaEQsV0FBckIsRUFDQXVCLGFBQWF4dUMsaUJBQWIsR0FFQTtFQUVBMnVDLGFBQWE1K0QsR0FBYixDQUNDLEdBREQsQ0FDTSxHQUROLENBQ1csR0FEWCxDQUNnQixHQURoQixDQUVDLEdBRkQsQ0FFTSxHQUZOLENBRVcsR0FGWCxDQUVnQixHQUZoQixDQUdDLEdBSEQsQ0FHTSxHQUhOLENBR1csR0FIWCxDQUdnQixHQUhoQixDQUlDLEdBSkQsQ0FJTSxHQUpOLENBSVcsR0FKWCxDQUlnQixHQUpoQixFQU9BNCtELGFBQWE3cEQsUUFBYixDQUF1QjBwRCxhQUFhMTNDLGdCQUFwQyxFQUNBNjNDLGFBQWE3cEQsUUFBYixDQUF1QjBwRCxhQUFheHlCLGtCQUFwQyxFQUVBLENBRUQ0d0IsVUFBVWdDLGVBQVYsQ0FBMkJsRixTQUEzQixFQUNBa0QsVUFBVTU4RCxLQUFWLEdBRUE7RUFDQTtFQUVBLElBQU0sU0FBVyxDQUFqQixDQUFvQnl1QyxLQUFPaXdCLFNBQTNCLENBQXNDandCLE1BQXRDLENBQWdELENBRS9DLEdBQUtpdEIsWUFBTCxDQUFvQixDQUVuQnVCLFlBQVk1b0QsSUFBWixDQUFrQm1xRCxhQUFhbitDLFFBQS9CLEVBQ0E0OEMsWUFBWTNvRCxHQUFaLENBQWlCdXFELGVBQWdCcHdCLElBQWhCLENBQWpCLEVBQ0ErdkIsYUFBYTFpRCxFQUFiLENBQWdCekgsSUFBaEIsQ0FBc0J5cUQsUUFBU3J3QixJQUFULENBQXRCLEVBQ0ErdkIsYUFBYTVpRCxNQUFiLENBQXFCcWhELFdBQXJCLEVBQ0F1QixhQUFheHVDLGlCQUFiLEdBRUEsaUJBQW1Cb3VDLGdCQUFpQjN2QixJQUFqQixDQUFuQixDQUNBc3ZCLE9BQU8vd0MsUUFBUCxDQUFpQit4QyxZQUFqQixFQUVBLENBRUQ7RUFFQWpDLGtCQUFrQjlnRCxnQkFBbEIsQ0FBb0N3aUQsYUFBYTEzQyxnQkFBakQsQ0FBbUUwM0MsYUFBYXh5QixrQkFBaEYsRUFDQWd6QixTQUFTL3FDLGFBQVQsQ0FBd0I2b0MsaUJBQXhCLEVBRUE7RUFFQW1DLGFBQWNuWixLQUFkLENBQXFCai9CLE1BQXJCLENBQTZCMjNDLFlBQTdCLENBQTJDOUMsWUFBM0MsRUFFQSxDQUVELENBRUQ3ckMsTUFBTXVuQixXQUFOLENBQW9CLEtBQXBCLENBRUEsQ0FyS0QsQ0F1S0EseUJBQUEsQ0FBMkJub0QsTUFBM0IsQ0FBbUN5OEMsUUFBbkMsQ0FBNkNnd0IsWUFBN0MsQ0FBMkR3RCxrQkFBM0QsQ0FBK0VyOEIsZ0JBQS9FLENBQWlHQyxlQUFqRyxDQUFtSCxDQUVsSCxhQUFlN3pDLE9BQU95Z0MsUUFBdEIsQ0FFQSxXQUFhLElBQWIsQ0FFQSxxQkFBdUI0dEMsZUFBdkIsQ0FDQSxtQkFBcUJydUUsT0FBT2t3RSxtQkFBNUIsQ0FFQSxHQUFLekQsWUFBTCxDQUFvQixDQUVuQjBELGlCQUFtQjdCLGtCQUFuQixDQUNBOEIsZUFBaUJwd0UsT0FBT3F3RSxzQkFBeEIsQ0FFQSxDQUVELEdBQUssQ0FBRUQsY0FBUCxDQUF3QixDQUV2QixnQkFBa0IsS0FBbEIsQ0FFQSxHQUFLM3pCLFNBQVNnQyxZQUFkLENBQTZCLENBRTVCLEdBQUtoZSxVQUFZQSxTQUFTSSxnQkFBMUIsQ0FBNkMsQ0FFNUM0dEMsWUFBY2h1QyxTQUFTOG1CLGVBQVQsRUFBNEI5bUIsU0FBUzhtQixlQUFULENBQXlCbjJCLFFBQXJELEVBQWlFcVAsU0FBUzhtQixlQUFULENBQXlCbjJCLFFBQXpCLENBQWtDanhCLE1BQWxDLENBQTJDLENBQTFILENBRUEsQ0FKRCxRQUlZc2dDLFVBQVlBLFNBQVNDLFVBQTFCLENBQXVDLENBRTdDK3RDLFlBQWNodUMsU0FBU2dlLFlBQVQsRUFBeUJoZSxTQUFTZ2UsWUFBVCxDQUFzQnQrQyxNQUF0QixDQUErQixDQUF0RSxDQUVBLENBRUQsQ0FFRCxHQUFLSCxPQUFPdXBFLGFBQVAsRUFBd0I5c0IsU0FBUzJSLFFBQVQsR0FBc0IsS0FBbkQsQ0FBMkQsQ0FFMUQzNEMsUUFBUTZQLElBQVIsQ0FBYyw4RUFBZCxDQUE4RnRsQixNQUE5RixFQUVBLENBRUQsZ0JBQWtCQSxPQUFPdXBFLGFBQVAsRUFBd0I5c0IsU0FBUzJSLFFBQW5ELENBRUEsaUJBQW1CLENBQW5CLENBRUEsR0FBS3FnQixXQUFMLENBQW1CNkIsY0FBZ0JwQyxhQUFoQixDQUNuQixHQUFLUSxXQUFMLENBQW1CNEIsY0FBZ0JuQyxhQUFoQixDQUVuQmp4RSxPQUFTaXpFLGlCQUFrQkcsWUFBbEIsQ0FBVCxDQUVBLENBakNELElBaUNPLENBRU5wekUsT0FBU2t6RSxjQUFULENBRUEsQ0FFRCxHQUFLekMsVUFBVXRULG9CQUFWLEVBQ0g1ZCxTQUFTaVEsV0FBVCxHQUF5QixJQUR0QixFQUVIalEsU0FBUytQLGNBQVQsQ0FBd0Jyc0QsTUFBeEIsR0FBbUMsQ0FGckMsQ0FFeUM7RUFHeEM7RUFFQSxTQUFXakQsT0FBTzI5QixJQUFsQixDQUF3QjAxQyxLQUFPOXpCLFNBQVM1aEIsSUFBeEMsQ0FFQSx3QkFBMEIwekMsZUFBZ0JpQyxJQUFoQixDQUExQixDQUVBLEdBQUtDLHNCQUF3QjN4RSxTQUE3QixDQUF5QyxDQUV4QzJ4RSxvQkFBc0IsRUFBdEIsQ0FDQWxDLGVBQWdCaUMsSUFBaEIsRUFBeUJDLG1CQUF6QixDQUVBLENBRUQsbUJBQXFCQSxvQkFBcUJGLElBQXJCLENBQXJCLENBRUEsR0FBS0csaUJBQW1CNXhFLFNBQXhCLENBQW9DLENBRW5DNHhFLGVBQWlCeHpFLE9BQU9pb0IsS0FBUCxFQUFqQixDQUNBc3JELG9CQUFxQkYsSUFBckIsRUFBOEJHLGNBQTlCLENBRUEsQ0FFRHh6RSxPQUFTd3pFLGNBQVQsQ0FFQSxDQUVEeHpFLE9BQU93OEMsT0FBUCxDQUFpQitDLFNBQVMvQyxPQUExQixDQUNBeDhDLE9BQU84d0QsU0FBUCxDQUFtQnZSLFNBQVN1UixTQUE1QixDQUVBOXdELE9BQU9vdUQsSUFBUCxDQUFnQjdPLFNBQVNrUSxVQUFULEVBQXVCLElBQXpCLENBQWtDbFEsU0FBU2tRLFVBQTNDLENBQXdEQSxXQUFZbFEsU0FBUzZPLElBQXJCLENBQXRFLENBRUFwdUQsT0FBT3d2RCxXQUFQLENBQXFCalEsU0FBU2lRLFdBQTlCLENBQ0F4dkQsT0FBT3N2RCxjQUFQLENBQXdCL1AsU0FBUytQLGNBQWpDLENBQ0F0dkQsT0FBT3V2RCxnQkFBUCxDQUEwQmhRLFNBQVNnUSxnQkFBbkMsQ0FFQXZ2RCxPQUFPK3dELGtCQUFQLENBQTRCeFIsU0FBU3dSLGtCQUFyQyxDQUNBL3dELE9BQU80d0QsU0FBUCxDQUFtQnJSLFNBQVNxUixTQUE1QixDQUVBLEdBQUsyZSxjQUFnQnZ2RSxPQUFPd3dFLHNCQUE1QixDQUFxRCxDQUVwRHh3RSxPQUFPMjRDLGlCQUFQLENBQXlCendCLElBQXpCLENBQStCNnFELGtCQUEvQixFQUNBL3lFLE9BQU80NEMsWUFBUCxDQUFzQmxDLGdCQUF0QixDQUNBMTJDLE9BQU82NEMsV0FBUCxDQUFxQmxDLGVBQXJCLENBRUEsQ0FFRCxhQUFBLENBRUEsQ0FFRCxxQkFBQSxDQUF1Qjd6QyxNQUF2QixDQUErQjQzQixNQUEvQixDQUF1QzIzQyxZQUF2QyxDQUFxRDlDLFlBQXJELENBQW9FLENBRW5FLEdBQUt6c0UsT0FBTzA1QyxPQUFQLEdBQW1CLEtBQXhCLENBQWdDLE9BRWhDLFlBQWMxNUMsT0FBT2c1QyxNQUFQLENBQWNoN0IsSUFBZCxDQUFvQjRaLE9BQU9vaEIsTUFBM0IsQ0FBZCxDQUVBLEdBQUtVLFVBQWExNUMsT0FBTzJpRCxNQUFQLEVBQWlCM2lELE9BQU9xb0QsTUFBeEIsRUFBa0Nyb0QsT0FBT29vRCxRQUF0RCxDQUFMLENBQXdFLENBRXZFLEdBQUtwb0QsT0FBTzI1QyxVQUFQLEdBQXVCLENBQUUzNUMsT0FBTzY1QyxhQUFULEVBQTBCazJCLFNBQVM5cEMsZ0JBQVQsQ0FBMkJqbUMsTUFBM0IsQ0FBakQsQ0FBTCxDQUE4RixDQUU3RkEsT0FBT3U1QyxlQUFQLENBQXVCeHNCLGdCQUF2QixDQUF5Q3dpRCxhQUFheHlCLGtCQUF0RCxDQUEwRS84QyxPQUFPODNCLFdBQWpGLEVBRUEsYUFBZTgxQyxTQUFTejVDLE1BQVQsQ0FBaUJuMEIsTUFBakIsQ0FBZixDQUNBLGFBQWVBLE9BQU95OEMsUUFBdEIsQ0FFQSxHQUFLbnZDLE1BQU15TSxPQUFOLENBQWUwaUMsUUFBZixDQUFMLENBQWlDLENBRWhDLFdBQWFoYyxTQUFTMmYsTUFBdEIsQ0FFQSxJQUFNLE1BQVEsQ0FBUixDQUFXc0UsR0FBS3RFLE9BQU9qZ0QsTUFBN0IsQ0FBcUNtYyxFQUFJb29DLEVBQXpDLENBQTZDcG9DLEdBQTdDLENBQW9ELENBRW5ELFVBQVk4akMsT0FBUTlqQyxDQUFSLENBQVosQ0FDQSxrQkFBb0JtZ0MsU0FBVTRELE1BQU1wQyxhQUFoQixDQUFwQixDQUVBLEdBQUsweUIsZUFBaUJBLGNBQWNqM0IsT0FBcEMsQ0FBOEMsQ0FFN0Msa0JBQW9CazNCLGlCQUFrQjV3RSxNQUFsQixDQUEwQjJ3RSxhQUExQixDQUF5Q2xFLFlBQXpDLENBQXVEd0IsbUJBQXZELENBQTRFc0IsYUFBYWw5QyxJQUF6RixDQUErRms5QyxhQUFhajlDLEdBQTVHLENBQXBCLENBQ0FxN0MsVUFBVWpXLGtCQUFWLENBQThCNlgsWUFBOUIsQ0FBNEMsSUFBNUMsQ0FBa0Q5dUMsUUFBbEQsQ0FBNERrdUMsYUFBNUQsQ0FBMkUzdUUsTUFBM0UsQ0FBbUZxZ0QsS0FBbkYsRUFFQSxDQUVELENBRUQsQ0FsQkQsUUFrQlk1RCxTQUFTL0MsT0FBZCxDQUF3QixDQUU5QixrQkFBb0JrM0IsaUJBQWtCNXdFLE1BQWxCLENBQTBCeThDLFFBQTFCLENBQW9DZ3dCLFlBQXBDLENBQWtEd0IsbUJBQWxELENBQXVFc0IsYUFBYWw5QyxJQUFwRixDQUEwRms5QyxhQUFhajlDLEdBQXZHLENBQXBCLENBQ0FxN0MsVUFBVWpXLGtCQUFWLENBQThCNlgsWUFBOUIsQ0FBNEMsSUFBNUMsQ0FBa0Q5dUMsUUFBbEQsQ0FBNERrdUMsYUFBNUQsQ0FBMkUzdUUsTUFBM0UsQ0FBbUYsSUFBbkYsRUFFQSxDQUVELENBRUQsQ0FFRCxhQUFlQSxPQUFPazVDLFFBQXRCLENBRUEsSUFBTSxNQUFRLENBQVIsQ0FBV2oyQyxFQUFJaTJDLFNBQVMvNEMsTUFBOUIsQ0FBc0NLLEVBQUl5QyxDQUExQyxDQUE2Q3pDLEdBQTdDLENBQW9ELENBRW5Ed3ZFLGFBQWM5MkIsU0FBVTE0QyxDQUFWLENBQWQsQ0FBNkJvM0IsTUFBN0IsQ0FBcUMyM0MsWUFBckMsQ0FBbUQ5QyxZQUFuRCxFQUVBLENBRUQsQ0FFRCxDQUVEOztLQUlBLHNCQUFBLENBQXdCcHdDLE1BQXhCLENBQWdDakMsT0FBaEMsQ0FBeUNDLEtBQXpDLENBQWdEQyxLQUFoRCxDQUF1REMsU0FBdkQsQ0FBa0VDLFNBQWxFLENBQTZFQyxNQUE3RSxDQUFxRnQvQixJQUFyRixDQUEyRnUvQixVQUEzRixDQUF3RyxDQUV2R0ksUUFBUTEvQixJQUFSLENBQWMsSUFBZCxDQUFvQmloQyxNQUFwQixDQUE0QmpDLE9BQTVCLENBQXFDQyxLQUFyQyxDQUE0Q0MsS0FBNUMsQ0FBbURDLFNBQW5ELENBQThEQyxTQUE5RCxDQUF5RUMsTUFBekUsQ0FBaUZ0L0IsSUFBakYsQ0FBdUZ1L0IsVUFBdkYsRUFFQSxLQUFLeXRCLFdBQUwsQ0FBbUIsSUFBbkIsQ0FFQSxDQUVEMG9CLGNBQWNuM0UsU0FBZCxDQUEwQkQsT0FBT2lCLE1BQVAsQ0FBZW9nQyxRQUFRcGhDLFNBQXZCLENBQTFCLENBQ0FtM0UsY0FBY24zRSxTQUFkLENBQXdCc0MsV0FBeEIsQ0FBc0M2MEUsYUFBdEMsQ0FFQTs7O0tBS0EsNEJBQUEsQ0FBOEJuYSxRQUE5QixDQUF3Q3RnQixFQUF4QyxDQUE0Q2w0QyxLQUE1QyxDQUFtRGsrQixRQUFuRCxDQUE2RDJyQyxZQUE3RCxDQUE0RSxDQUUzRSxnQkFBQSxDQUFrQitJLGFBQWxCLENBQ0EsV0FBQSxDQUFhaHdDLFVBQWIsQ0FBeUI0TSxRQUF6QixDQUVBLFdBQUEsQ0FFQTtFQUVBLG1CQUFxQixXQUFBLEVBQXJCLENBQ0EsbUJBQXFCLGNBQUEsRUFBckIsQ0FDQSxnQkFBa0IsV0FBQSxFQUFsQixDQUVBLGFBQUEsRUFBZ0IsQ0FFZixhQUFlLGdCQUFBLENBQWtCLENBQ2hDLENBQUUsR0FEOEIsQ0FDekIsQ0FBRSxHQUR1QixDQUNsQixDQURrQixDQUNmLENBRGUsQ0FFOUIsR0FGOEIsQ0FFekIsQ0FBRSxHQUZ1QixDQUVsQixDQUZrQixDQUVmLENBRmUsQ0FHOUIsR0FIOEIsQ0FHekIsR0FIeUIsQ0FHcEIsQ0FIb0IsQ0FHakIsQ0FIaUIsQ0FJaEMsQ0FBRSxHQUo4QixDQUl6QixHQUp5QixDQUlwQixDQUpvQixDQUlqQixDQUppQixDQUFsQixDQUFmLENBT0EsVUFBWSxlQUFBLENBQWlCLENBQzVCLENBRDRCLENBQ3pCLENBRHlCLENBQ3RCLENBRHNCLENBRTVCLENBRjRCLENBRXpCLENBRnlCLENBRXRCLENBRnNCLENBQWpCLENBQVosQ0FLQXFqQyxhQUFlMzZCLEdBQUdLLFlBQUgsRUFBZixDQUNBcTZCLGNBQWdCMTZCLEdBQUdLLFlBQUgsRUFBaEIsQ0FFQUwsR0FBR00sVUFBSCxDQUFlTixHQUFHZ21CLFlBQWxCLENBQWdDMlUsWUFBaEMsRUFDQTM2QixHQUFHUSxVQUFILENBQWVSLEdBQUdnbUIsWUFBbEIsQ0FBZ0N6N0IsUUFBaEMsQ0FBMEN5VixHQUFHSSxXQUE3QyxFQUVBSixHQUFHTSxVQUFILENBQWVOLEdBQUc4bEIsb0JBQWxCLENBQXdDNFUsYUFBeEMsRUFDQTE2QixHQUFHUSxVQUFILENBQWVSLEdBQUc4bEIsb0JBQWxCLENBQXdDM2QsS0FBeEMsQ0FBK0NuSSxHQUFHSSxXQUFsRCxFQUVBK21CLFFBQVU4RyxlQUFWLENBRUF2akMsV0FBYSxDQUNaMVAsU0FBVWdsQixHQUFHMHNCLGlCQUFILENBQXNCdkYsT0FBdEIsQ0FBK0IsVUFBL0IsQ0FERSxDQUVacGdDLEdBQUlpWixHQUFHMHNCLGlCQUFILENBQXNCdkYsT0FBdEIsQ0FBK0IsSUFBL0IsQ0FGUSxDQUFiLENBS0E3dkIsU0FBVyxDQUNWc2pDLFNBQVU1NkIsR0FBR2lyQixrQkFBSCxDQUF1QjlELE9BQXZCLENBQWdDLFVBQWhDLENBREEsQ0FFVjBULFFBQVM3NkIsR0FBR2lyQixrQkFBSCxDQUF1QjlELE9BQXZCLENBQWdDLFNBQWhDLENBRkMsQ0FJVnpqQyxTQUFVc2MsR0FBR2lyQixrQkFBSCxDQUF1QjlELE9BQXZCLENBQWdDLFVBQWhDLENBSkEsQ0FLVmwxQyxPQUFRK3RCLEdBQUdpckIsa0JBQUgsQ0FBdUI5RCxPQUF2QixDQUFnQyxRQUFoQyxDQUxFLENBTVZwdEMsTUFBT2ltQixHQUFHaXJCLGtCQUFILENBQXVCOUQsT0FBdkIsQ0FBZ0MsT0FBaEMsQ0FORyxDQVFWN3VCLE1BQU8wSCxHQUFHaXJCLGtCQUFILENBQXVCOUQsT0FBdkIsQ0FBZ0MsT0FBaEMsQ0FSRyxDQVNWcHRCLElBQUtpRyxHQUFHaXJCLGtCQUFILENBQXVCOUQsT0FBdkIsQ0FBZ0MsS0FBaEMsQ0FUSyxDQVVWcnRCLFFBQVNrRyxHQUFHaXJCLGtCQUFILENBQXVCOUQsT0FBdkIsQ0FBZ0MsU0FBaEMsQ0FWQyxDQVlWaGtCLGdCQUFpQm5ELEdBQUdpckIsa0JBQUgsQ0FBdUI5RCxPQUF2QixDQUFnQyxpQkFBaEMsQ0FaUCxDQWFWMWxDLGlCQUFrQnVlLEdBQUdpckIsa0JBQUgsQ0FBdUI5RCxPQUF2QixDQUFnQyxrQkFBaEMsQ0FiUixDQWVWMlQsUUFBUzk2QixHQUFHaXJCLGtCQUFILENBQXVCOUQsT0FBdkIsQ0FBZ0MsU0FBaEMsQ0FmQyxDQWdCVmhyQixXQUFZNkQsR0FBR2lyQixrQkFBSCxDQUF1QjlELE9BQXZCLENBQWdDLFlBQWhDLENBaEJGLENBaUJWL3FCLFFBQVM0RCxHQUFHaXJCLGtCQUFILENBQXVCOUQsT0FBdkIsQ0FBZ0MsU0FBaEMsQ0FqQkMsQ0FrQlY5cUIsT0FBUTJELEdBQUdpckIsa0JBQUgsQ0FBdUI5RCxPQUF2QixDQUFnQyxRQUFoQyxDQWxCRSxDQW1CVjdxQixTQUFVMEQsR0FBR2lyQixrQkFBSCxDQUF1QjlELE9BQXZCLENBQWdDLFVBQWhDLENBbkJBLENBb0JWNFQsU0FBVS82QixHQUFHaXJCLGtCQUFILENBQXVCOUQsT0FBdkIsQ0FBZ0MsVUFBaEMsQ0FwQkEsQ0FzQlZ0USxVQUFXN1csR0FBR2lyQixrQkFBSCxDQUF1QjlELE9BQXZCLENBQWdDLFdBQWhDLENBdEJELENBQVgsQ0F5QkEsV0FBYW41RCxTQUFTazRCLGVBQVQsQ0FBMEIsOEJBQTFCLENBQTBELFFBQTFELENBQWIsQ0FDQUQsT0FBT0UsS0FBUCxDQUFlLENBQWYsQ0FDQUYsT0FBT0csTUFBUCxDQUFnQixDQUFoQixDQUVBLFlBQWNILE9BQU9JLFVBQVAsQ0FBbUIsSUFBbkIsQ0FBZCxDQUNBMWhDLFFBQVFxMkUsU0FBUixDQUFvQixPQUFwQixDQUNBcjJFLFFBQVFzMkUsUUFBUixDQUFrQixDQUFsQixDQUFxQixDQUFyQixDQUF3QixDQUF4QixDQUEyQixDQUEzQixFQUVBcnpDLFFBQVUsaUJBQUEsQ0FBbUIzQixNQUFuQixDQUFWLENBRUEsQ0FFRCxLQUFLMDdCLE1BQUwsQ0FBYyxTQUFXdVosT0FBWCxDQUFvQnphLEtBQXBCLENBQTJCai9CLE1BQTNCLENBQW9DLENBRWpELEdBQUswNUMsUUFBUW54RSxNQUFSLEdBQW1CLENBQXhCLENBQTRCLE9BRTVCO0VBRUEsR0FBS285RCxVQUFZeitELFNBQWpCLENBQTZCLENBRTVCNjdELE9BRUEsQ0FFRHo4RCxNQUFNcXpFLFVBQU4sQ0FBa0JoVSxPQUFsQixFQUVBci9ELE1BQU1zekUsY0FBTixHQUNBdHpFLE1BQU11ekUsZUFBTixDQUF1QjN3QyxXQUFXMVAsUUFBbEMsRUFDQWx6QixNQUFNdXpFLGVBQU4sQ0FBdUIzd0MsV0FBVzNELEVBQWxDLEVBQ0FqL0IsTUFBTXd6RSx1QkFBTixHQUVBeHpFLE1BQU02NkMsT0FBTixDQUFlM0MsR0FBR3U3QixTQUFsQixFQUNBenpFLE1BQU00NkMsTUFBTixDQUFjMUMsR0FBRzQ0QixLQUFqQixFQUVBNTRCLEdBQUdNLFVBQUgsQ0FBZU4sR0FBR2dtQixZQUFsQixDQUFnQzJVLFlBQWhDLEVBQ0EzNkIsR0FBR3c3QixtQkFBSCxDQUF3Qjl3QyxXQUFXMVAsUUFBbkMsQ0FBNkMsQ0FBN0MsQ0FBZ0RnbEIsR0FBR1csS0FBbkQsQ0FBMEQsS0FBMUQsQ0FBaUUsRUFBSSxDQUFyRSxDQUF3RSxDQUF4RSxFQUNBWCxHQUFHdzdCLG1CQUFILENBQXdCOXdDLFdBQVczRCxFQUFuQyxDQUF1QyxDQUF2QyxDQUEwQ2laLEdBQUdXLEtBQTdDLENBQW9ELEtBQXBELENBQTJELEVBQUksQ0FBL0QsQ0FBa0UsQ0FBbEUsRUFFQVgsR0FBR00sVUFBSCxDQUFlTixHQUFHOGxCLG9CQUFsQixDQUF3QzRVLGFBQXhDLEVBRUExNkIsR0FBR2dwQixnQkFBSCxDQUFxQjF4QixTQUFTN1YsZ0JBQTlCLENBQWdELEtBQWhELENBQXVERCxPQUFPQyxnQkFBUCxDQUF3QjNSLFFBQS9FLEVBRUFob0IsTUFBTTJ6RSxhQUFOLENBQXFCejdCLEdBQUcwN0IsUUFBeEIsRUFDQTE3QixHQUFHc29CLFNBQUgsQ0FBY2h4QixTQUFTeUMsR0FBdkIsQ0FBNEIsQ0FBNUIsRUFFQSxlQUFpQixDQUFqQixDQUNBLGlCQUFtQixDQUFuQixDQUNBLFFBQVUwbUIsTUFBTXZrQixHQUFoQixDQUVBLEdBQUtBLEdBQUwsQ0FBVyxDQUVWOEQsR0FBR3lvQixTQUFILENBQWNueEIsU0FBU2dGLFFBQXZCLENBQWlDSixJQUFJNUQsS0FBSixDQUFVejNCLENBQTNDLENBQThDcTdCLElBQUk1RCxLQUFKLENBQVU1c0MsQ0FBeEQsQ0FBMkR3d0MsSUFBSTVELEtBQUosQ0FBVTFyQyxDQUFyRSxFQUVBLEdBQUtzdkMsSUFBSXkvQixLQUFULENBQWlCLENBRWhCMzdCLEdBQUdvb0IsU0FBSCxDQUFjOXdCLFNBQVM4RSxPQUF2QixDQUFnQ0YsSUFBSWpnQixJQUFwQyxFQUNBK2pCLEdBQUdvb0IsU0FBSCxDQUFjOXdCLFNBQVMrRSxNQUF2QixDQUErQkgsSUFBSWhnQixHQUFuQyxFQUVBOGpCLEdBQUdzb0IsU0FBSCxDQUFjaHhCLFNBQVN3akMsT0FBdkIsQ0FBZ0MsQ0FBaEMsRUFDQWMsV0FBYSxDQUFiLENBQ0FDLGFBQWUsQ0FBZixDQUVBLENBVEQsUUFTWTMvQixJQUFJNDNCLFNBQVQsQ0FBcUIsQ0FFM0I5ekIsR0FBR29vQixTQUFILENBQWM5d0IsU0FBUzZFLFVBQXZCLENBQW1DRCxJQUFJNC9CLE9BQXZDLEVBRUE5N0IsR0FBR3NvQixTQUFILENBQWNoeEIsU0FBU3dqQyxPQUF2QixDQUFnQyxDQUFoQyxFQUNBYyxXQUFhLENBQWIsQ0FDQUMsYUFBZSxDQUFmLENBRUEsQ0FFRCxDQXZCRCxJQXVCTyxDQUVONzdCLEdBQUdzb0IsU0FBSCxDQUFjaHhCLFNBQVN3akMsT0FBdkIsQ0FBZ0MsQ0FBaEMsRUFDQWMsV0FBYSxDQUFiLENBQ0FDLGFBQWUsQ0FBZixDQUVBLENBR0Q7RUFFQSxJQUFNLE1BQVEsQ0FBUixDQUFXaHZFLEVBQUlxdUUsUUFBUW54RSxNQUE3QixDQUFxQ0ssRUFBSXlDLENBQXpDLENBQTRDekMsR0FBNUMsQ0FBbUQsQ0FFbEQsV0FBYTh3RSxRQUFTOXdFLENBQVQsQ0FBYixDQUVBNmxDLE9BQU9rVCxlQUFQLENBQXVCeHNCLGdCQUF2QixDQUF5QzZLLE9BQU9tbEIsa0JBQWhELENBQW9FMVcsT0FBT3ZPLFdBQTNFLEVBQ0F1TyxPQUFPamMsQ0FBUCxDQUFXLENBQUVpYyxPQUFPa1QsZUFBUCxDQUF1QnJ6QixRQUF2QixDQUFpQyxFQUFqQyxDQUFiLENBRUEsQ0FFRG9yRCxRQUFRaHVCLElBQVIsQ0FBYzhuQixpQkFBZCxFQUVBO0VBRUEsVUFBWSxFQUFaLENBQ0EsV0FBYSxFQUFiLENBRUEsSUFBTSxNQUFRLENBQVIsQ0FBV25vRSxFQUFJcXVFLFFBQVFueEUsTUFBN0IsQ0FBcUNLLEVBQUl5QyxDQUF6QyxDQUE0Q3pDLEdBQTVDLENBQW1ELENBRWxELFdBQWE4d0UsUUFBUzl3RSxDQUFULENBQWIsQ0FDQSxhQUFlNmxDLE9BQU9vVyxRQUF0QixDQUVBLEdBQUtBLFNBQVMvQyxPQUFULEdBQXFCLEtBQTFCLENBQWtDLFNBRWxDclQsT0FBTzRULGNBQVAsQ0FBdUJ5YyxRQUF2QixDQUFpQ0csS0FBakMsQ0FBd0NqL0IsTUFBeEMsQ0FBZ0Q5NEIsU0FBaEQsQ0FBMkQyOUMsUUFBM0QsQ0FBcUUzOUMsU0FBckUsRUFFQXMzQyxHQUFHb29CLFNBQUgsQ0FBYzl3QixTQUFTdWYsU0FBdkIsQ0FBa0N4USxTQUFTd1EsU0FBM0MsRUFDQTdXLEdBQUdncEIsZ0JBQUgsQ0FBcUIxeEIsU0FBUzZMLGVBQTlCLENBQStDLEtBQS9DLENBQXNEbFQsT0FBT2tULGVBQVAsQ0FBdUJyekIsUUFBN0UsRUFFQW1nQixPQUFPdk8sV0FBUCxDQUFtQnhHLFNBQW5CLENBQThCNmdELGNBQTlCLENBQThDQyxjQUE5QyxDQUE4REMsV0FBOUQsRUFFQWxpRCxNQUFPLENBQVAsRUFBYWtpRCxZQUFZdC9ELENBQXpCLENBQ0FvZCxNQUFPLENBQVAsRUFBYWtpRCxZQUFZOXVELENBQXpCLENBRUE4RSxPQUFRLENBQVIsRUFBY2dlLE9BQU9oZSxNQUFQLENBQWN0VixDQUFkLENBQWtCLEdBQWhDLENBQ0FzVixPQUFRLENBQVIsRUFBY2dlLE9BQU9oZSxNQUFQLENBQWM5RSxDQUFkLENBQWtCLEdBQWhDLENBRUEsWUFBYyxDQUFkLENBRUEsR0FBS3N6QyxNQUFNdmtCLEdBQU4sRUFBYW1LLFNBQVNuSyxHQUEzQixDQUFpQyxDQUVoQzQrQixRQUFVZSxZQUFWLENBRUEsQ0FFRCxHQUFLRCxhQUFlZCxPQUFwQixDQUE4QixDQUU3Qjk2QixHQUFHc29CLFNBQUgsQ0FBY2h4QixTQUFTd2pDLE9BQXZCLENBQWdDQSxPQUFoQyxFQUNBYyxXQUFhZCxPQUFiLENBRUEsQ0FFRCxHQUFLejBCLFNBQVN0TSxHQUFULEdBQWlCLElBQXRCLENBQTZCLENBRTVCaUcsR0FBR3dvQixTQUFILENBQWNseEIsU0FBU3NqQyxRQUF2QixDQUFpQ3YwQixTQUFTdE0sR0FBVCxDQUFhcm9CLE1BQWIsQ0FBb0IvVSxDQUFyRCxDQUF3RDBwQyxTQUFTdE0sR0FBVCxDQUFhcm9CLE1BQWIsQ0FBb0J2RSxDQUE1RSxFQUNBNnlCLEdBQUd3b0IsU0FBSCxDQUFjbHhCLFNBQVN1akMsT0FBdkIsQ0FBZ0N4MEIsU0FBU3RNLEdBQVQsQ0FBYTVVLE1BQWIsQ0FBb0J4b0IsQ0FBcEQsQ0FBdUQwcEMsU0FBU3RNLEdBQVQsQ0FBYTVVLE1BQWIsQ0FBb0JoWSxDQUEzRSxFQUVBLENBTEQsSUFLTyxDQUVONnlCLEdBQUd3b0IsU0FBSCxDQUFjbHhCLFNBQVNzakMsUUFBdkIsQ0FBaUMsQ0FBakMsQ0FBb0MsQ0FBcEMsRUFDQTU2QixHQUFHd29CLFNBQUgsQ0FBY2x4QixTQUFTdWpDLE9BQXZCLENBQWdDLENBQWhDLENBQW1DLENBQW5DLEVBRUEsQ0FFRDc2QixHQUFHb29CLFNBQUgsQ0FBYzl3QixTQUFTd0MsT0FBdkIsQ0FBZ0N1TSxTQUFTdk0sT0FBekMsRUFDQWtHLEdBQUd5b0IsU0FBSCxDQUFjbnhCLFNBQVNnQixLQUF2QixDQUE4QitOLFNBQVMvTixLQUFULENBQWV6M0IsQ0FBN0MsQ0FBZ0R3bEMsU0FBUy9OLEtBQVQsQ0FBZTVzQyxDQUEvRCxDQUFrRTI2QyxTQUFTL04sS0FBVCxDQUFlMXJDLENBQWpGLEVBRUFvekMsR0FBR29vQixTQUFILENBQWM5d0IsU0FBUzVULFFBQXZCLENBQWlDMmlCLFNBQVMzaUIsUUFBMUMsRUFDQXNjLEdBQUd1b0IsVUFBSCxDQUFlanhCLFNBQVNybEIsTUFBeEIsQ0FBZ0NBLE1BQWhDLEVBQ0ErdEIsR0FBR3VvQixVQUFILENBQWVqeEIsU0FBU3ZkLEtBQXhCLENBQStCQSxLQUEvQixFQUVBanlCLE1BQU1vMEUsV0FBTixDQUFtQjcxQixTQUFTMk8sUUFBNUIsQ0FBc0MzTyxTQUFTc1AsYUFBL0MsQ0FBOER0UCxTQUFTa1AsUUFBdkUsQ0FBaUZsUCxTQUFTb1AsUUFBMUYsQ0FBb0dwUCxTQUFTMFAsa0JBQTdHLENBQWlJMVAsU0FBU3dQLGFBQTFJLENBQXlKeFAsU0FBU3lQLGFBQWxLLENBQWlMelAsU0FBU3lRLGtCQUExTCxFQUNBaHZELE1BQU0wNUMsT0FBTixDQUFjdEMsS0FBZCxDQUFvQjI1QixPQUFwQixDQUE2Qnh5QixTQUFTNlAsU0FBdEMsRUFDQXB1RCxNQUFNMDVDLE9BQU4sQ0FBY3RDLEtBQWQsQ0FBb0JpOUIsT0FBcEIsQ0FBNkI5MUIsU0FBUzhQLFVBQXRDLEVBQ0FydUQsTUFBTTA1QyxPQUFOLENBQWNsSixLQUFkLENBQW9CNmpDLE9BQXBCLENBQTZCOTFCLFNBQVNtUSxVQUF0QyxFQUVBeHdCLFNBQVNtakMsWUFBVCxDQUF1QjlpQixTQUFTdE0sR0FBVCxFQUFnQm5TLE9BQXZDLENBQWdELENBQWhELEVBRUFvWSxHQUFHbW1CLFlBQUgsQ0FBaUJubUIsR0FBRzBtQixTQUFwQixDQUErQixDQUEvQixDQUFrQzFtQixHQUFHWSxjQUFyQyxDQUFxRCxDQUFyRCxFQUVBM1EsT0FBTzZULGFBQVAsQ0FBc0J3YyxRQUF0QixDQUFnQ0csS0FBaEMsQ0FBdUNqL0IsTUFBdkMsQ0FBK0M5NEIsU0FBL0MsQ0FBMEQyOUMsUUFBMUQsQ0FBb0UzOUMsU0FBcEUsRUFFQSxDQUVEO0VBRUFaLE1BQU00NkMsTUFBTixDQUFjMUMsR0FBR3U3QixTQUFqQixFQUVBenpFLE1BQU00QixLQUFOLEdBRUEsQ0FoS0QsQ0FrS0Esc0JBQUEsRUFBeUIsQ0FFeEIsWUFBY3MyQyxHQUFHaXVCLGFBQUgsRUFBZCxDQUVBLGlCQUFtQmp1QixHQUFHd3JCLFlBQUgsQ0FBaUJ4ckIsR0FBR29pQixhQUFwQixDQUFuQixDQUNBLG1CQUFxQnBpQixHQUFHd3JCLFlBQUgsQ0FBaUJ4ckIsR0FBR3NpQixlQUFwQixDQUFyQixDQUVBdGlCLEdBQUd5ckIsWUFBSCxDQUFpQnR0QixZQUFqQixDQUErQixDQUU5QixhQUFld3pCLGFBQWFobEIsU0FBNUIsQ0FBd0MsU0FGVixDQUk5Qix1QkFBeUIsZ0JBSkssQ0FNOUIsK0JBTjhCLENBTzlCLGdDQVA4QixDQVE5Qix5QkFSOEIsQ0FTOUIsc0JBVDhCLENBVTlCLHFCQVY4QixDQVc5Qix3QkFYOEIsQ0FZOUIsdUJBWjhCLENBYzlCLDBCQWQ4QixDQWU5QixvQkFmOEIsQ0FpQjlCLG1CQWpCOEIsQ0FrQjlCLHlCQWxCOEIsQ0FvQjlCLGVBcEI4QixDQXNCOUIsaUNBdEI4QixDQXdCOUIsd0RBeEI4QixDQTBCOUIsd0JBMUI4QixDQTJCOUIsaUdBM0I4QixDQTRCOUIsaUdBNUI4QixDQThCOUIsbUJBOUI4QixDQWdDOUIsNkRBaEM4QixDQWlDOUIsb0NBakM4QixDQW1DOUIsK0NBbkM4QixDQXFDOUIsNkJBckM4QixDQXVDOUIsR0F2QzhCLEVBeUM3QjRlLElBekM2QixDQXlDdkIsSUF6Q3VCLENBQS9CLEVBMkNBdnJCLEdBQUd5ckIsWUFBSCxDQUFpQnB0QixjQUFqQixDQUFpQyxDQUVoQyxhQUFlc3pCLGFBQWFobEIsU0FBNUIsQ0FBd0MsU0FGUixDQUloQyx1QkFBeUIsZ0JBSk8sQ0FNaEMscUJBTmdDLENBT2hDLHdCQVBnQyxDQVFoQyx3QkFSZ0MsQ0FVaEMsc0JBVmdDLENBV2hDLHdCQVhnQyxDQVloQywyQkFaZ0MsQ0FhaEMsd0JBYmdDLENBY2hDLHVCQWRnQyxDQWVoQywwQkFmZ0MsQ0FpQmhDLG1CQWpCZ0MsQ0FrQmhDLHlCQWxCZ0MsQ0FvQmhDLGVBcEJnQyxDQXNCaEMsd0NBdEJnQyxDQXdCaEMsbUVBeEJnQyxDQTBCaEMsNkNBMUJnQyxDQTRCaEMsdUJBNUJnQyxDQThCaEMsMEJBOUJnQyxDQWdDaEMseUJBaENnQyxDQWtDaEMseURBbENnQyxDQW9DaEMsWUFwQ2dDLENBc0NoQyxpQ0F0Q2dDLENBdUNoQyxnRkF2Q2dDLENBd0NoQyxvREF4Q2dDLENBMENoQyxLQTFDZ0MsQ0E0Q2hDLG9FQTVDZ0MsQ0E4Q2hDLElBOUNnQyxDQWdEaEMsR0FoRGdDLEVBa0QvQjRlLElBbEQrQixDQWtEekIsSUFsRHlCLENBQWpDLEVBb0RBdnJCLEdBQUcyckIsYUFBSCxDQUFrQnh0QixZQUFsQixFQUNBNkIsR0FBRzJyQixhQUFILENBQWtCdHRCLGNBQWxCLEVBRUEyQixHQUFHaXdCLFlBQUgsQ0FBaUI5SSxPQUFqQixDQUEwQmhwQixZQUExQixFQUNBNkIsR0FBR2l3QixZQUFILENBQWlCOUksT0FBakIsQ0FBMEI5b0IsY0FBMUIsRUFFQTJCLEdBQUdxd0IsV0FBSCxDQUFnQmxKLE9BQWhCLEVBRUEsY0FBQSxDQUVBLENBRUQsMEJBQUEsQ0FBNEJyNkQsQ0FBNUIsQ0FBK0JGLENBQS9CLENBQW1DLENBRWxDLEdBQUtFLEVBQUU0MkMsV0FBRixHQUFrQjkyQyxFQUFFODJDLFdBQXpCLENBQXVDLENBRXRDLFNBQVNBLFdBQUYsQ0FBZ0I5MkMsRUFBRTgyQyxXQUF6QixDQUVBLENBSkQsUUFJWTUyQyxFQUFFa25CLENBQUYsR0FBUXBuQixFQUFFb25CLENBQWYsQ0FBbUIsQ0FFekIsU0FBU0EsQ0FBRixDQUFNbG5CLEVBQUVrbkIsQ0FBZixDQUVBLENBSk0sSUFJQSxDQUVOLFNBQVNoaUIsRUFBRixDQUFPbEYsRUFBRWtGLEVBQWhCLENBRUEsQ0FFRCxDQUVELENBRUQ7O0tBSUEsbUJBQUEsQ0FBcUJndUMsRUFBckIsQ0FBeUJ4MkIsVUFBekIsQ0FBcUM0eUQsS0FBckMsQ0FBNkMsQ0FFNUMsb0JBQUEsRUFBdUIsQ0FFdEIsV0FBYSxLQUFiLENBRUEsVUFBWSxXQUFBLEVBQVosQ0FDQSxxQkFBdUIsSUFBdkIsQ0FDQSxzQkFBd0IsV0FBQSxDQUFhLENBQWIsQ0FBZ0IsQ0FBaEIsQ0FBbUIsQ0FBbkIsQ0FBc0IsQ0FBdEIsQ0FBeEIsQ0FFQSxPQUFPLENBRU5ELFFBQVMsU0FBV0UsU0FBWCxDQUF1QixDQUUvQixHQUFLQyxtQkFBcUJELFNBQXJCLEVBQWtDLENBQUVFLE1BQXpDLENBQWtELENBRWpEdjhCLEdBQUdxOEIsU0FBSCxDQUFjQSxTQUFkLENBQXlCQSxTQUF6QixDQUFvQ0EsU0FBcEMsQ0FBK0NBLFNBQS9DLEVBQ0FDLGlCQUFtQkQsU0FBbkIsQ0FFQSxDQUVELENBWEssQ0FhTkcsVUFBVyxTQUFXQyxJQUFYLENBQWtCLENBRTVCRixPQUFTRSxJQUFULENBRUEsQ0FqQkssQ0FtQk43YixTQUFVLFNBQVcvL0MsQ0FBWCxDQUFjblYsQ0FBZCxDQUFpQmtCLENBQWpCLENBQW9CRSxDQUFwQixDQUF1QmdxRCxrQkFBdkIsQ0FBNEMsQ0FFckQsR0FBS0EscUJBQXVCLElBQTVCLENBQW1DLENBRWxDajJDLEdBQUsvVCxDQUFMLENBQVFwQixHQUFLb0IsQ0FBTCxDQUFRRixHQUFLRSxDQUFMLENBRWhCLENBRUR3ckMsTUFBTTU5QixHQUFOLENBQVdtRyxDQUFYLENBQWNuVixDQUFkLENBQWlCa0IsQ0FBakIsQ0FBb0JFLENBQXBCLEVBRUEsR0FBSzR2RSxrQkFBa0JsckQsTUFBbEIsQ0FBMEI4bUIsS0FBMUIsSUFBc0MsS0FBM0MsQ0FBbUQsQ0FFbEQwSCxHQUFHNmdCLFVBQUgsQ0FBZWhnRCxDQUFmLENBQWtCblYsQ0FBbEIsQ0FBcUJrQixDQUFyQixDQUF3QkUsQ0FBeEIsRUFDQTR2RSxrQkFBa0IxdEQsSUFBbEIsQ0FBd0JzcEIsS0FBeEIsRUFFQSxDQUVELENBcENLLENBc0NONXVDLE1BQU8sVUFBWSxDQUVsQjZ5RSxPQUFTLEtBQVQsQ0FFQUQsaUJBQW1CLElBQW5CLENBQ0FJLGtCQUFrQmhpRSxHQUFsQixDQUF1QixDQUFFLENBQXpCLENBQTRCLENBQTVCLENBQStCLENBQS9CLENBQWtDLENBQWxDLEVBQXVDO0VBRXZDLENBN0NLLENBQVAsQ0FpREEsQ0FFRCxvQkFBQSxFQUF1QixDQUV0QixXQUFhLEtBQWIsQ0FFQSxxQkFBdUIsSUFBdkIsQ0FDQSxxQkFBdUIsSUFBdkIsQ0FDQSxzQkFBd0IsSUFBeEIsQ0FFQSxPQUFPLENBRU5tK0QsUUFBUyxTQUFXM2lCLFNBQVgsQ0FBdUIsQ0FFL0IsR0FBS0EsU0FBTCxDQUFpQixDQUVoQnhULE9BQVExQyxHQUFHMjhCLFVBQVgsRUFFQSxDQUpELElBSU8sQ0FFTmg2QixRQUFTM0MsR0FBRzI4QixVQUFaLEVBRUEsQ0FFRCxDQWRLLENBZ0JOUixRQUFTLFNBQVdTLFNBQVgsQ0FBdUIsQ0FFL0IsR0FBS0MsbUJBQXFCRCxTQUFyQixFQUFrQyxDQUFFTCxNQUF6QyxDQUFrRCxDQUVqRHY4QixHQUFHNDhCLFNBQUgsQ0FBY0EsU0FBZCxFQUNBQyxpQkFBbUJELFNBQW5CLENBRUEsQ0FFRCxDQXpCSyxDQTJCTkUsUUFBUyxTQUFXOW1CLFNBQVgsQ0FBdUIsQ0FFL0IsR0FBSyttQixtQkFBcUIvbUIsU0FBMUIsQ0FBc0MsQ0FFckMsR0FBS0EsU0FBTCxDQUFpQixDQUVoQixPQUFTQSxTQUFULEVBRUMsZUFBQSxDQUVDaFcsR0FBR2dXLFNBQUgsQ0FBY2hXLEdBQUdnOUIsS0FBakIsRUFDQSxNQUVELGdCQUFBLENBRUNoOUIsR0FBR2dXLFNBQUgsQ0FBY2hXLEdBQUdpOUIsTUFBakIsRUFDQSxNQUVELGNBQUEsQ0FFQ2o5QixHQUFHZ1csU0FBSCxDQUFjaFcsR0FBR2s5QixJQUFqQixFQUNBLE1BRUQsbUJBQUEsQ0FFQ2w5QixHQUFHZ1csU0FBSCxDQUFjaFcsR0FBR205QixNQUFqQixFQUNBLE1BRUQsZUFBQSxDQUVDbjlCLEdBQUdnVyxTQUFILENBQWNoVyxHQUFHbzlCLEtBQWpCLEVBQ0EsTUFFRCxzQkFBQSxDQUVDcDlCLEdBQUdnVyxTQUFILENBQWNoVyxHQUFHcTlCLE1BQWpCLEVBQ0EsTUFFRCxpQkFBQSxDQUVDcjlCLEdBQUdnVyxTQUFILENBQWNoVyxHQUFHczlCLE9BQWpCLEVBQ0EsTUFFRCxrQkFBQSxDQUVDdDlCLEdBQUdnVyxTQUFILENBQWNoVyxHQUFHdTlCLFFBQWpCLEVBQ0EsTUFFRCxRQUVDdjlCLEdBQUdnVyxTQUFILENBQWNoVyxHQUFHbTlCLE1BQWpCLEVBNUNGLENBZ0RBLENBbERELElBa0RPLENBRU5uOUIsR0FBR2dXLFNBQUgsQ0FBY2hXLEdBQUdtOUIsTUFBakIsRUFFQSxDQUVESixpQkFBbUIvbUIsU0FBbkIsQ0FFQSxDQUVELENBM0ZLLENBNkZOd21CLFVBQVcsU0FBV0MsSUFBWCxDQUFrQixDQUU1QkYsT0FBU0UsSUFBVCxDQUVBLENBakdLLENBbUdON2IsU0FBVSxTQUFXMWhCLEtBQVgsQ0FBbUIsQ0FFNUIsR0FBS3MrQixvQkFBc0J0K0IsS0FBM0IsQ0FBbUMsQ0FFbENjLEdBQUd5OUIsVUFBSCxDQUFlditCLEtBQWYsRUFDQXMrQixrQkFBb0J0K0IsS0FBcEIsQ0FFQSxDQUVELENBNUdLLENBOEdOeDFDLE1BQU8sVUFBWSxDQUVsQjZ5RSxPQUFTLEtBQVQsQ0FFQU0saUJBQW1CLElBQW5CLENBQ0FFLGlCQUFtQixJQUFuQixDQUNBUyxrQkFBb0IsSUFBcEIsQ0FFQSxDQXRISyxDQUFQLENBMEhBLENBRUQsc0JBQUEsRUFBeUIsQ0FFeEIsV0FBYSxLQUFiLENBRUEsdUJBQXlCLElBQXpCLENBQ0EsdUJBQXlCLElBQXpCLENBQ0Esc0JBQXdCLElBQXhCLENBQ0EsMkJBQTZCLElBQTdCLENBQ0EsdUJBQXlCLElBQXpCLENBQ0Esd0JBQTBCLElBQTFCLENBQ0Esd0JBQTBCLElBQTFCLENBQ0Esd0JBQTBCLElBQTFCLENBRUEsT0FBTyxDQUVOM0UsUUFBUyxTQUFXNkUsV0FBWCxDQUF5QixDQUVqQyxHQUFLQSxXQUFMLENBQW1CLENBRWxCaDdCLE9BQVExQyxHQUFHMjlCLFlBQVgsRUFFQSxDQUpELElBSU8sQ0FFTmg3QixRQUFTM0MsR0FBRzI5QixZQUFaLEVBRUEsQ0FFRCxDQWRLLENBZ0JOeEIsUUFBUyxTQUFXeUIsV0FBWCxDQUF5QixDQUVqQyxHQUFLQyxxQkFBdUJELFdBQXZCLEVBQXNDLENBQUVyQixNQUE3QyxDQUFzRCxDQUVyRHY4QixHQUFHNDlCLFdBQUgsQ0FBZ0JBLFdBQWhCLEVBQ0FDLG1CQUFxQkQsV0FBckIsQ0FFQSxDQUVELENBekJLLENBMkJOZCxRQUFTLFNBQVdnQixXQUFYLENBQXdCQyxVQUF4QixDQUFvQ0gsV0FBcEMsQ0FBa0QsQ0FFMUQsR0FBS0kscUJBQXVCRixXQUF2QixFQUNBRyxvQkFBdUJGLFVBRHZCLEVBRUFHLHlCQUEyQk4sV0FGaEMsQ0FFOEMsQ0FFN0M1OUIsR0FBRzg5QixXQUFILENBQWdCQSxXQUFoQixDQUE2QkMsVUFBN0IsQ0FBeUNILFdBQXpDLEVBRUFJLG1CQUFxQkYsV0FBckIsQ0FDQUcsa0JBQW9CRixVQUFwQixDQUNBRyx1QkFBeUJOLFdBQXpCLENBRUEsQ0FFRCxDQXpDSyxDQTJDTk8sTUFBTyxTQUFXQyxXQUFYLENBQXdCQyxZQUF4QixDQUFzQ0MsWUFBdEMsQ0FBcUQsQ0FFM0QsR0FBS0MscUJBQXdCSCxXQUF4QixFQUNBSSxzQkFBd0JILFlBRHhCLEVBRUFJLHNCQUF3QkgsWUFGN0IsQ0FFNEMsQ0FFM0N0K0IsR0FBRzArQixTQUFILENBQWNOLFdBQWQsQ0FBMkJDLFlBQTNCLENBQXlDQyxZQUF6QyxFQUVBQyxtQkFBcUJILFdBQXJCLENBQ0FJLG9CQUFzQkgsWUFBdEIsQ0FDQUksb0JBQXNCSCxZQUF0QixDQUVBLENBRUQsQ0F6REssQ0EyRE45QixVQUFXLFNBQVdDLElBQVgsQ0FBa0IsQ0FFNUJGLE9BQVNFLElBQVQsQ0FFQSxDQS9ESyxDQWlFTjdiLFNBQVUsU0FBVytkLE9BQVgsQ0FBcUIsQ0FFOUIsR0FBS0Msc0JBQXdCRCxPQUE3QixDQUF1QyxDQUV0QzMrQixHQUFHNitCLFlBQUgsQ0FBaUJGLE9BQWpCLEVBQ0FDLG9CQUFzQkQsT0FBdEIsQ0FFQSxDQUVELENBMUVLLENBNEVOajFFLE1BQU8sVUFBWSxDQUVsQjZ5RSxPQUFTLEtBQVQsQ0FFQXNCLG1CQUFxQixJQUFyQixDQUNBRyxtQkFBcUIsSUFBckIsQ0FDQUMsa0JBQW9CLElBQXBCLENBQ0FDLHVCQUF5QixJQUF6QixDQUNBSyxtQkFBcUIsSUFBckIsQ0FDQUMsb0JBQXNCLElBQXRCLENBQ0FDLG9CQUFzQixJQUF0QixDQUNBRyxvQkFBc0IsSUFBdEIsQ0FFQSxDQXpGSyxDQUFQLENBNkZBLENBRUQ7RUFFQSxnQkFBa0IsZUFBQSxFQUFsQixDQUNBLGdCQUFrQixlQUFBLEVBQWxCLENBQ0Esa0JBQW9CLGlCQUFBLEVBQXBCLENBRUEsd0JBQTBCNStCLEdBQUdqVixZQUFILENBQWlCaVYsR0FBRytpQixrQkFBcEIsQ0FBMUIsQ0FDQSxrQkFBb0IsY0FBQSxDQUFnQitiLG1CQUFoQixDQUFwQixDQUNBLHNCQUF3QixjQUFBLENBQWdCQSxtQkFBaEIsQ0FBeEIsQ0FDQSxzQkFBd0IsY0FBQSxDQUFnQkEsbUJBQWhCLENBQXhCLENBRUEsaUJBQW1CLEVBQW5CLENBRUEsNkJBQStCLElBQS9CLENBRUEsbUJBQXFCLElBQXJCLENBRUEsb0JBQXNCLElBQXRCLENBQ0EseUJBQTJCLElBQTNCLENBQ0Esb0JBQXNCLElBQXRCLENBQ0Esb0JBQXNCLElBQXRCLENBQ0EsOEJBQWdDLElBQWhDLENBQ0EseUJBQTJCLElBQTNCLENBQ0EseUJBQTJCLElBQTNCLENBQ0EsNkJBQStCLEtBQS9CLENBRUEscUJBQXVCLElBQXZCLENBQ0Esb0JBQXNCLElBQXRCLENBRUEscUJBQXVCLElBQXZCLENBRUEsK0JBQWlDLElBQWpDLENBQ0EsOEJBQWdDLElBQWhDLENBRUEsZ0JBQWtCOStCLEdBQUdqVixZQUFILENBQWlCaVYsR0FBRysrQixnQ0FBcEIsQ0FBbEIsQ0FFQSx1QkFBeUIsS0FBekIsQ0FDQSxZQUFjLENBQWQsQ0FDQSxjQUFnQi8rQixHQUFHalYsWUFBSCxDQUFpQmlWLEdBQUdnL0IsT0FBcEIsQ0FBaEIsQ0FFQSxHQUFLQyxVQUFVcnpFLE9BQVYsQ0FBbUIsT0FBbkIsSUFBaUMsQ0FBRSxDQUF4QyxDQUE0QyxDQUUzQ3NCLFFBQVVtckMsV0FBWSxrQkFBa0IxcUMsSUFBbEIsQ0FBd0JzeEUsU0FBeEIsRUFBcUMsQ0FBckMsQ0FBWixDQUFWLENBQ0FDLG1CQUF1Qmh5RSxTQUFXLEdBQWxDLENBRUEsQ0FMRCxRQUtZK3hFLFVBQVVyekUsT0FBVixDQUFtQixXQUFuQixJQUFxQyxDQUFFLENBQTVDLENBQWdELENBRXREc0IsUUFBVW1yQyxXQUFZLHVCQUF1QjFxQyxJQUF2QixDQUE2QnN4RSxTQUE3QixFQUEwQyxDQUExQyxDQUFaLENBQVYsQ0FDQUMsbUJBQXVCaHlFLFNBQVcsR0FBbEMsQ0FFQSxDQUVELHVCQUF5QixJQUF6QixDQUNBLHlCQUEyQixFQUEzQixDQUVBLG1CQUFxQixXQUFBLEVBQXJCLENBQ0Esb0JBQXNCLFdBQUEsRUFBdEIsQ0FFQSxzQkFBQSxDQUF3Qm5JLElBQXhCLENBQThCaUwsTUFBOUIsQ0FBc0M4b0IsS0FBdEMsQ0FBOEMsQ0FFN0MsU0FBVyxjQUFBLENBQWdCLENBQWhCLENBQVgsQ0FBZ0M7RUFDaEMsWUFBY2tuQixHQUFHbS9CLGFBQUgsRUFBZCxDQUVBbi9CLEdBQUdvL0IsV0FBSCxDQUFnQnI2RSxJQUFoQixDQUFzQjZpQyxPQUF0QixFQUNBb1ksR0FBR3EvQixhQUFILENBQWtCdDZFLElBQWxCLENBQXdCaTdDLEdBQUdzL0Isa0JBQTNCLENBQStDdC9CLEdBQUd1L0IsT0FBbEQsRUFDQXYvQixHQUFHcS9CLGFBQUgsQ0FBa0J0NkUsSUFBbEIsQ0FBd0JpN0MsR0FBR3cvQixrQkFBM0IsQ0FBK0N4L0IsR0FBR3UvQixPQUFsRCxFQUVBLElBQU0sTUFBUSxDQUFkLENBQWlCbjFFLEVBQUkwdUIsS0FBckIsQ0FBNEIxdUIsR0FBNUIsQ0FBbUMsQ0FFbEM0MUMsR0FBR3kvQixVQUFILENBQWV6dkUsT0FBUzVGLENBQXhCLENBQTJCLENBQTNCLENBQThCNDFDLEdBQUcwL0IsSUFBakMsQ0FBdUMsQ0FBdkMsQ0FBMEMsQ0FBMUMsQ0FBNkMsQ0FBN0MsQ0FBZ0QxL0IsR0FBRzAvQixJQUFuRCxDQUF5RDEvQixHQUFHaUIsYUFBNUQsQ0FBMkV4bkMsSUFBM0UsRUFFQSxDQUVELGNBQUEsQ0FFQSxDQUVELGtCQUFvQixFQUFwQixDQUNBa21FLGNBQWUzL0IsR0FBRzQvQixVQUFsQixFQUFpQ1QsY0FBZW4vQixHQUFHNC9CLFVBQWxCLENBQThCNS9CLEdBQUc0L0IsVUFBakMsQ0FBNkMsQ0FBN0MsQ0FBakMsQ0FDQUQsY0FBZTMvQixHQUFHNi9CLGdCQUFsQixFQUF1Q1YsY0FBZW4vQixHQUFHNi9CLGdCQUFsQixDQUFvQzcvQixHQUFHOC9CLDJCQUF2QyxDQUFvRSxDQUFwRSxDQUF2QyxDQUVBO0VBRUFDLFlBQVluZixRQUFaLENBQXNCLENBQXRCLENBQXlCLENBQXpCLENBQTRCLENBQTVCLENBQStCLENBQS9CLEVBQ0EvNEIsWUFBWSs0QixRQUFaLENBQXNCLENBQXRCLEVBQ0E5NEIsY0FBYzg0QixRQUFkLENBQXdCLENBQXhCLEVBRUFsZSxPQUFRMUMsR0FBRzI4QixVQUFYLEVBQ0E5MEMsWUFBWWkxQyxPQUFaLENBQXFCN21CLGNBQXJCLEVBRUErcEIsYUFBYyxLQUFkLEVBQ0FDLFlBQWFDLFlBQWIsRUFDQXg5QixPQUFRMUMsR0FBR3U3QixTQUFYLEVBRUE3NEIsT0FBUTFDLEdBQUc0NEIsS0FBWCxFQUNBc0QsWUFBYWpuQixjQUFiLEVBRUE7RUFFQSx1QkFBQSxFQUEwQixDQUV6QixJQUFNLE1BQVEsQ0FBUixDQUFXcG9ELEVBQUlzekUsY0FBY3AyRSxNQUFuQyxDQUEyQ0ssRUFBSXlDLENBQS9DLENBQWtEekMsR0FBbEQsQ0FBeUQsQ0FFeEQrMUUsY0FBZS8xRSxDQUFmLEVBQXFCLENBQXJCLENBRUEsQ0FFRCxDQUVELHdCQUFBLENBQTBCeW5CLFNBQTFCLENBQXNDLENBRXJDc3VELGNBQWV0dUQsU0FBZixFQUE2QixDQUE3QixDQUVBLEdBQUt1dUQsa0JBQW1CdnVELFNBQW5CLElBQW1DLENBQXhDLENBQTRDLENBRTNDbXVCLEdBQUdxZ0MsdUJBQUgsQ0FBNEJ4dUQsU0FBNUIsRUFDQXV1RCxrQkFBbUJ2dUQsU0FBbkIsRUFBaUMsQ0FBakMsQ0FFQSxDQUVELEdBQUt5dUQsa0JBQW1CenVELFNBQW5CLElBQW1DLENBQXhDLENBQTRDLENBRTNDLGNBQWdCckksV0FBVzFiLEdBQVgsQ0FBZ0Isd0JBQWhCLENBQWhCLENBRUE2YixVQUFVNDJELHdCQUFWLENBQW9DMXVELFNBQXBDLENBQStDLENBQS9DLEVBQ0F5dUQsa0JBQW1CenVELFNBQW5CLEVBQWlDLENBQWpDLENBRUEsQ0FFRCxDQUVELGtDQUFBLENBQW9DQSxTQUFwQyxDQUErQzJ1RCxnQkFBL0MsQ0FBa0UsQ0FFakVMLGNBQWV0dUQsU0FBZixFQUE2QixDQUE3QixDQUVBLEdBQUt1dUQsa0JBQW1CdnVELFNBQW5CLElBQW1DLENBQXhDLENBQTRDLENBRTNDbXVCLEdBQUdxZ0MsdUJBQUgsQ0FBNEJ4dUQsU0FBNUIsRUFDQXV1RCxrQkFBbUJ2dUQsU0FBbkIsRUFBaUMsQ0FBakMsQ0FFQSxDQUVELEdBQUt5dUQsa0JBQW1CenVELFNBQW5CLElBQW1DMnVELGdCQUF4QyxDQUEyRCxDQUUxRCxjQUFnQmgzRCxXQUFXMWIsR0FBWCxDQUFnQix3QkFBaEIsQ0FBaEIsQ0FFQTZiLFVBQVU0MkQsd0JBQVYsQ0FBb0MxdUQsU0FBcEMsQ0FBK0MydUQsZ0JBQS9DLEVBQ0FGLGtCQUFtQnp1RCxTQUFuQixFQUFpQzJ1RCxnQkFBakMsQ0FFQSxDQUVELENBRUQsZ0NBQUEsRUFBbUMsQ0FFbEMsSUFBTSxNQUFRLENBQVIsQ0FBVzN6RSxFQUFJdXpFLGtCQUFrQnIyRSxNQUF2QyxDQUErQ0ssSUFBTXlDLENBQXJELENBQXdELEVBQUd6QyxDQUEzRCxDQUErRCxDQUU5RCxHQUFLZzJFLGtCQUFtQmgyRSxDQUFuQixJQUEyQisxRSxjQUFlLzFFLENBQWYsQ0FBaEMsQ0FBcUQsQ0FFcEQ0MUMsR0FBR3lnQyx3QkFBSCxDQUE2QnIyRSxDQUE3QixFQUNBZzJFLGtCQUFtQmgyRSxDQUFuQixFQUF5QixDQUF6QixDQUVBLENBRUQsQ0FFRCxDQUVELGVBQUEsQ0FBaUI0SCxFQUFqQixDQUFzQixDQUVyQixHQUFLMi9ELGFBQWMzL0QsRUFBZCxJQUF1QixJQUE1QixDQUFtQyxDQUVsQ2d1QyxHQUFHMEMsTUFBSCxDQUFXMXdDLEVBQVgsRUFDQTIvRCxhQUFjMy9ELEVBQWQsRUFBcUIsSUFBckIsQ0FFQSxDQUVELENBRUQsZ0JBQUEsQ0FBa0JBLEVBQWxCLENBQXVCLENBRXRCLEdBQUsyL0QsYUFBYzMvRCxFQUFkLElBQXVCLEtBQTVCLENBQW9DLENBRW5DZ3VDLEdBQUcyQyxPQUFILENBQVkzd0MsRUFBWixFQUNBMi9ELGFBQWMzL0QsRUFBZCxFQUFxQixLQUFyQixDQUVBLENBRUQsQ0FFRCxvQ0FBQSxFQUF1QyxDQUV0QyxHQUFLMHVFLDJCQUE2QixJQUFsQyxDQUF5QyxDQUV4Q0EseUJBQTJCLEVBQTNCLENBRUEsR0FBS2wzRCxXQUFXMWIsR0FBWCxDQUFnQixnQ0FBaEIsR0FDQTBiLFdBQVcxYixHQUFYLENBQWdCLCtCQUFoQixDQURBLEVBRUEwYixXQUFXMWIsR0FBWCxDQUFnQiwrQkFBaEIsQ0FGQSxFQUdBMGIsV0FBVzFiLEdBQVgsQ0FBZ0IsK0JBQWhCLENBSEwsQ0FHeUQsQ0FFeEQsWUFBY2t5QyxHQUFHalYsWUFBSCxDQUFpQmlWLEdBQUcyZ0MsMEJBQXBCLENBQWQsQ0FFQSxJQUFNLE1BQVEsQ0FBZCxDQUFpQnYyRSxFQUFJdzJFLFFBQVE3MkUsTUFBN0IsQ0FBcUNLLEdBQXJDLENBQTRDLENBRTNDczJFLHlCQUF5Qm4zRSxJQUF6QixDQUErQnEzRSxRQUFTeDJFLENBQVQsQ0FBL0IsRUFFQSxDQUVELENBRUQsQ0FFRCwrQkFBQSxDQUVBLENBRUQsbUJBQUEsQ0FBcUIrOEQsT0FBckIsQ0FBK0IsQ0FFOUIsR0FBSzBaLGlCQUFtQjFaLE9BQXhCLENBQWtDLENBRWpDbm5CLEdBQUdtN0IsVUFBSCxDQUFlaFUsT0FBZixFQUVBMFosZUFBaUIxWixPQUFqQixDQUVBLFdBQUEsQ0FFQSxDQUVELFlBQUEsQ0FFQSxDQUVELG9CQUFBLENBQXNCblMsUUFBdEIsQ0FBZ0NXLGFBQWhDLENBQStDSixRQUEvQyxDQUF5REUsUUFBekQsQ0FBbUVNLGtCQUFuRSxDQUF1RkYsYUFBdkYsQ0FBc0dDLGFBQXRHLENBQXFIZ0Isa0JBQXJILENBQTBJLENBRXpJLEdBQUs5QixXQUFhOHJCLFVBQWxCLENBQStCLENBRTlCcCtCLE9BQVExQyxHQUFHNDRCLEtBQVgsRUFFQSxDQUpELElBSU8sQ0FFTmoyQixRQUFTM0MsR0FBRzQ0QixLQUFaLEVBRUEsQ0FFRCxHQUFLNWpCLFdBQWErckIsY0FBbEIsQ0FBbUMsQ0FFbEMsR0FBSy9yQixXQUFhZ3NCLGVBQWIsRUFBZ0NscUIscUJBQXVCbXFCLHdCQUE1RCxDQUF1RixDQUV0RixPQUFTanNCLFFBQVQsRUFFQyxxQkFBQSxDQUVDLEdBQUs4QixrQkFBTCxDQUEwQixDQUV6QjlXLEdBQUdraEMscUJBQUgsQ0FBMEJsaEMsR0FBR21oQyxRQUE3QixDQUF1Q25oQyxHQUFHbWhDLFFBQTFDLEVBQ0FuaEMsR0FBR29oQyxpQkFBSCxDQUFzQnBoQyxHQUFHcWhDLEdBQXpCLENBQThCcmhDLEdBQUdxaEMsR0FBakMsQ0FBc0NyaEMsR0FBR3FoQyxHQUF6QyxDQUE4Q3JoQyxHQUFHcWhDLEdBQWpELEVBRUEsQ0FMRCxJQUtPLENBRU5yaEMsR0FBRzJWLGFBQUgsQ0FBa0IzVixHQUFHbWhDLFFBQXJCLEVBQ0FuaEMsR0FBR3NoQyxTQUFILENBQWN0aEMsR0FBR3VoQyxTQUFqQixDQUE0QnZoQyxHQUFHcWhDLEdBQS9CLEVBRUEsQ0FDRCxNQUVELHdCQUFBLENBRUMsR0FBS3ZxQixrQkFBTCxDQUEwQixDQUV6QjlXLEdBQUdraEMscUJBQUgsQ0FBMEJsaEMsR0FBR21oQyxRQUE3QixDQUF1Q25oQyxHQUFHbWhDLFFBQTFDLEVBQ0FuaEMsR0FBR29oQyxpQkFBSCxDQUFzQnBoQyxHQUFHd2hDLElBQXpCLENBQStCeGhDLEdBQUd3aEMsSUFBbEMsQ0FBd0N4aEMsR0FBR3loQyxtQkFBM0MsQ0FBZ0V6aEMsR0FBRzBoQyxtQkFBbkUsRUFFQSxDQUxELElBS08sQ0FFTjFoQyxHQUFHMlYsYUFBSCxDQUFrQjNWLEdBQUdtaEMsUUFBckIsRUFDQW5oQyxHQUFHc2hDLFNBQUgsQ0FBY3RoQyxHQUFHd2hDLElBQWpCLENBQXVCeGhDLEdBQUd5aEMsbUJBQTFCLEVBRUEsQ0FDRCxNQUVELHFCQUFBLENBRUMsR0FBSzNxQixrQkFBTCxDQUEwQixDQUV6QjlXLEdBQUdraEMscUJBQUgsQ0FBMEJsaEMsR0FBR21oQyxRQUE3QixDQUF1Q25oQyxHQUFHbWhDLFFBQTFDLEVBQ0FuaEMsR0FBR29oQyxpQkFBSCxDQUFzQnBoQyxHQUFHd2hDLElBQXpCLENBQStCeGhDLEdBQUcyaEMsU0FBbEMsQ0FBNkMzaEMsR0FBR3doQyxJQUFoRCxDQUFzRHhoQyxHQUFHdWhDLFNBQXpELEVBRUEsQ0FMRCxJQUtPLENBRU52aEMsR0FBRzJWLGFBQUgsQ0FBa0IzVixHQUFHbWhDLFFBQXJCLEVBQ0FuaEMsR0FBR3NoQyxTQUFILENBQWN0aEMsR0FBR3doQyxJQUFqQixDQUF1QnhoQyxHQUFHMmhDLFNBQTFCLEVBRUEsQ0FDRCxNQUVELFFBRUMsR0FBSzdxQixrQkFBTCxDQUEwQixDQUV6QjlXLEdBQUdraEMscUJBQUgsQ0FBMEJsaEMsR0FBR21oQyxRQUE3QixDQUF1Q25oQyxHQUFHbWhDLFFBQTFDLEVBQ0FuaEMsR0FBR29oQyxpQkFBSCxDQUFzQnBoQyxHQUFHcWhDLEdBQXpCLENBQThCcmhDLEdBQUcwaEMsbUJBQWpDLENBQXNEMWhDLEdBQUdxaEMsR0FBekQsQ0FBOERyaEMsR0FBRzBoQyxtQkFBakUsRUFFQSxDQUxELElBS08sQ0FFTjFoQyxHQUFHa2hDLHFCQUFILENBQTBCbGhDLEdBQUdtaEMsUUFBN0IsQ0FBdUNuaEMsR0FBR21oQyxRQUExQyxFQUNBbmhDLEdBQUdvaEMsaUJBQUgsQ0FBc0JwaEMsR0FBR3VoQyxTQUF6QixDQUFvQ3ZoQyxHQUFHMGhDLG1CQUF2QyxDQUE0RDFoQyxHQUFHcWhDLEdBQS9ELENBQW9FcmhDLEdBQUcwaEMsbUJBQXZFLEVBRUEsQ0EzREgsQ0ErREEsQ0FFREUscUJBQXVCLElBQXZCLENBQ0FDLGdCQUFrQixJQUFsQixDQUNBQyxnQkFBa0IsSUFBbEIsQ0FDQUMsMEJBQTRCLElBQTVCLENBQ0FDLHFCQUF1QixJQUF2QixDQUNBQyxxQkFBdUIsSUFBdkIsQ0FFQSxDQTVFRCxJQTRFTyxDQUVObHNCLG1CQUFxQkEsb0JBQXNCSixhQUEzQyxDQUNBRSxjQUFnQkEsZUFBaUJOLFFBQWpDLENBQ0FPLGNBQWdCQSxlQUFpQkwsUUFBakMsQ0FFQSxHQUFLRSxnQkFBa0Jpc0Isb0JBQWxCLEVBQTBDN3JCLHFCQUF1QmdzQix5QkFBdEUsQ0FBa0csQ0FFakcvaEMsR0FBR2toQyxxQkFBSCxDQUEwQjlFLE1BQU04RixPQUFOLENBQWV2c0IsYUFBZixDQUExQixDQUEwRHltQixNQUFNOEYsT0FBTixDQUFlbnNCLGtCQUFmLENBQTFELEVBRUE2ckIscUJBQXVCanNCLGFBQXZCLENBQ0Fvc0IsMEJBQTRCaHNCLGtCQUE1QixDQUVBLENBRUQsR0FBS1IsV0FBYXNzQixlQUFiLEVBQWdDcHNCLFdBQWFxc0IsZUFBN0MsRUFBZ0Vqc0IsZ0JBQWtCbXNCLG9CQUFsRixFQUEwR2xzQixnQkFBa0Jtc0Isb0JBQWpJLENBQXdKLENBRXZKamlDLEdBQUdvaEMsaUJBQUgsQ0FBc0JoRixNQUFNOEYsT0FBTixDQUFlM3NCLFFBQWYsQ0FBdEIsQ0FBaUQ2bUIsTUFBTThGLE9BQU4sQ0FBZXpzQixRQUFmLENBQWpELENBQTRFMm1CLE1BQU04RixPQUFOLENBQWVyc0IsYUFBZixDQUE1RSxDQUE0R3VtQixNQUFNOEYsT0FBTixDQUFlcHNCLGFBQWYsQ0FBNUcsRUFFQStyQixnQkFBa0J0c0IsUUFBbEIsQ0FDQXVzQixnQkFBa0Jyc0IsUUFBbEIsQ0FDQXVzQixxQkFBdUJuc0IsYUFBdkIsQ0FDQW9zQixxQkFBdUJuc0IsYUFBdkIsQ0FFQSxDQUVELENBRURrckIsZ0JBQWtCaHNCLFFBQWxCLENBQ0Fpc0IseUJBQTJCbnFCLGtCQUEzQixDQUVBLENBRUQsb0JBQUEsQ0FBc0J6USxRQUF0QixDQUFnQzg3QixXQUFoQyxDQUE4QyxDQUU3Qzk3QixTQUFTNk8sSUFBVCxHQUFrQjBKLFVBQWxCLENBQ0dqYyxRQUFTM0MsR0FBR3U3QixTQUFaLENBREgsQ0FFRzc0QixPQUFRMUMsR0FBR3U3QixTQUFYLENBRkgsQ0FJQSxjQUFrQmwxQixTQUFTNk8sSUFBVCxHQUFrQnlKLFFBQXBDLENBQ0EsR0FBS3dqQixXQUFMLENBQW1CclQsVUFBWSxDQUFFQSxTQUFkLENBRW5Ca1IsYUFBY2xSLFNBQWQsRUFFQXpvQixTQUFTaVAsV0FBVCxHQUF5QixJQUF6QixDQUNHNG1CLFlBQWE3MUIsU0FBUzJPLFFBQXRCLENBQWdDM08sU0FBU3NQLGFBQXpDLENBQXdEdFAsU0FBU2tQLFFBQWpFLENBQTJFbFAsU0FBU29QLFFBQXBGLENBQThGcFAsU0FBUzBQLGtCQUF2RyxDQUEySDFQLFNBQVN3UCxhQUFwSSxDQUFtSnhQLFNBQVN5UCxhQUE1SixDQUEyS3pQLFNBQVN5USxrQkFBcEwsQ0FESCxDQUVHb2xCLFlBQWE0RSxVQUFiLENBRkgsQ0FJQWo1QyxZQUFZaTFDLE9BQVosQ0FBcUJ6MkIsU0FBUzJQLFNBQTlCLEVBQ0FudUIsWUFBWWd4QyxPQUFaLENBQXFCeHlCLFNBQVM2UCxTQUE5QixFQUNBcnVCLFlBQVlzMEMsT0FBWixDQUFxQjkxQixTQUFTOFAsVUFBOUIsRUFDQTRwQixZQUFZNUQsT0FBWixDQUFxQjkxQixTQUFTbVEsVUFBOUIsRUFFQTRyQixpQkFBa0IvN0IsU0FBU29RLGFBQTNCLENBQTBDcFEsU0FBU3FRLG1CQUFuRCxDQUF3RXJRLFNBQVNzUSxrQkFBakYsRUFFQSxDQUVEO0VBRUEscUJBQUEsQ0FBdUJtWSxTQUF2QixDQUFtQyxDQUVsQyxHQUFLdVQsbUJBQXFCdlQsU0FBMUIsQ0FBc0MsQ0FFckMsR0FBS0EsU0FBTCxDQUFpQixDQUVoQjl1QixHQUFHc2lDLFNBQUgsQ0FBY3RpQyxHQUFHdWlDLEVBQWpCLEVBRUEsQ0FKRCxJQUlPLENBRU52aUMsR0FBR3NpQyxTQUFILENBQWN0aUMsR0FBR3dpQyxHQUFqQixFQUVBLENBRURILGlCQUFtQnZULFNBQW5CLENBRUEsQ0FFRCxDQUVELG9CQUFBLENBQXNCMlQsUUFBdEIsQ0FBaUMsQ0FFaEMsR0FBS0EsV0FBYUMsWUFBbEIsQ0FBaUMsQ0FFaENoZ0MsT0FBUTFDLEdBQUd1N0IsU0FBWCxFQUVBLEdBQUtrSCxXQUFhRSxlQUFsQixDQUFvQyxDQUVuQyxHQUFLRixXQUFhdkMsWUFBbEIsQ0FBaUMsQ0FFaENsZ0MsR0FBR3lpQyxRQUFILENBQWF6aUMsR0FBRzRpQyxJQUFoQixFQUVBLENBSkQsUUFJWUgsV0FBYUksYUFBbEIsQ0FBa0MsQ0FFeEM3aUMsR0FBR3lpQyxRQUFILENBQWF6aUMsR0FBRzhpQyxLQUFoQixFQUVBLENBSk0sSUFJQSxDQUVOOWlDLEdBQUd5aUMsUUFBSCxDQUFhemlDLEdBQUcraUMsY0FBaEIsRUFFQSxDQUVELENBRUQsQ0F0QkQsSUFzQk8sQ0FFTnBnQyxRQUFTM0MsR0FBR3U3QixTQUFaLEVBRUEsQ0FFRG9ILGdCQUFrQkYsUUFBbEIsQ0FFQSxDQUVELHFCQUFBLENBQXVCdDhDLEtBQXZCLENBQStCLENBRTlCLEdBQUtBLFFBQVU2OEMsZ0JBQWYsQ0FBa0MsQ0FFakMsR0FBSzlELGtCQUFMLENBQTBCbC9CLEdBQUdpakMsU0FBSCxDQUFjOThDLEtBQWQsRUFFMUI2OEMsaUJBQW1CNzhDLEtBQW5CLENBRUEsQ0FFRCxDQUVELHlCQUFBLENBQTJCc3dCLGFBQTNCLENBQTBDeXNCLE1BQTFDLENBQWtEclosS0FBbEQsQ0FBMEQsQ0FFekQsR0FBS3BULGFBQUwsQ0FBcUIsQ0FFcEIvVCxPQUFRMUMsR0FBR21qQyxtQkFBWCxFQUVBLEdBQUtDLDZCQUErQkYsTUFBL0IsRUFBeUNHLDRCQUE4QnhaLEtBQTVFLENBQW9GLENBRW5GN3BCLEdBQUd5VyxhQUFILENBQWtCeXNCLE1BQWxCLENBQTBCclosS0FBMUIsRUFFQXVaLDJCQUE2QkYsTUFBN0IsQ0FDQUcsMEJBQTRCeFosS0FBNUIsQ0FFQSxDQUVELENBYkQsSUFhTyxDQUVObG5CLFFBQVMzQyxHQUFHbWpDLG1CQUFaLEVBRUEsQ0FFRCxDQUVELHVCQUFBLENBQXlCejdDLFdBQXpCLENBQXVDLENBRXRDLEdBQUtBLFdBQUwsQ0FBbUIsQ0FFbEJnYixPQUFRMUMsR0FBR3NqQyxZQUFYLEVBRUEsQ0FKRCxJQUlPLENBRU4zZ0MsUUFBUzNDLEdBQUdzakMsWUFBWixFQUVBLENBRUQsQ0FFRDtFQUVBLHNCQUFBLENBQXdCQyxTQUF4QixDQUFvQyxDQUVuQyxHQUFLQSxZQUFjNzZFLFNBQW5CLENBQStCNjZFLFVBQVl2akMsR0FBRzA3QixRQUFILENBQWNuWSxXQUFkLENBQTRCLENBQXhDLENBRS9CLEdBQUtpZ0IscUJBQXVCRCxTQUE1QixDQUF3QyxDQUV2Q3ZqQyxHQUFHeTdCLGFBQUgsQ0FBa0I4SCxTQUFsQixFQUNBQyxtQkFBcUJELFNBQXJCLENBRUEsQ0FFRCxDQUVELG9CQUFBLENBQXNCRSxTQUF0QixDQUFpQ0MsWUFBakMsQ0FBZ0QsQ0FFL0MsR0FBS0YscUJBQXVCLElBQTVCLENBQW1DLENBRWxDL0gsZ0JBRUEsQ0FFRCxpQkFBbUJrSSxxQkFBc0JILGtCQUF0QixDQUFuQixDQUVBLEdBQUtJLGVBQWlCbDdFLFNBQXRCLENBQWtDLENBRWpDazdFLGFBQWUsQ0FBRTcrRSxLQUFNMkQsU0FBUixDQUFtQmsvQixRQUFTbC9CLFNBQTVCLENBQWYsQ0FDQWk3RSxxQkFBc0JILGtCQUF0QixFQUE2Q0ksWUFBN0MsQ0FFQSxDQUVELEdBQUtBLGFBQWE3K0UsSUFBYixHQUFzQjArRSxTQUF0QixFQUFtQ0csYUFBYWg4QyxPQUFiLEdBQXlCODdDLFlBQWpFLENBQWdGLENBRS9FMWpDLEdBQUdvL0IsV0FBSCxDQUFnQnFFLFNBQWhCLENBQTJCQyxjQUFnQi9ELGNBQWU4RCxTQUFmLENBQTNDLEVBRUFHLGFBQWE3K0UsSUFBYixDQUFvQjArRSxTQUFwQixDQUNBRyxhQUFhaDhDLE9BQWIsQ0FBdUI4N0MsWUFBdkIsQ0FFQSxDQUVELENBRUQsNkJBQUEsRUFBZ0MsQ0FFL0IsR0FBSSxDQUVIMWpDLEdBQUc2akMsb0JBQUgsQ0FBd0JyMkUsS0FBeEIsQ0FBK0J3eUMsRUFBL0IsQ0FBbUN2eUMsU0FBbkMsRUFFQSxDQUFDLE1BQVFrUyxLQUFSLENBQWdCLENBRWpCTixRQUFRTSxLQUFSLENBQWUsbUJBQWYsQ0FBb0NBLEtBQXBDLEVBRUEsQ0FFRCxDQUVELG1CQUFBLEVBQXNCLENBRXJCLEdBQUksQ0FFSHFnQyxHQUFHeS9CLFVBQUgsQ0FBY2p5RSxLQUFkLENBQXFCd3lDLEVBQXJCLENBQXlCdnlDLFNBQXpCLEVBRUEsQ0FBQyxNQUFRa1MsS0FBUixDQUFnQixDQUVqQk4sUUFBUU0sS0FBUixDQUFlLG1CQUFmLENBQW9DQSxLQUFwQyxFQUVBLENBRUQsQ0FFRDtFQUVBLGdCQUFBLENBQWtCOG5CLE9BQWxCLENBQTRCLENBRTNCLEdBQUtxOEMsZUFBZXR5RCxNQUFmLENBQXVCaVcsT0FBdkIsSUFBcUMsS0FBMUMsQ0FBa0QsQ0FFakR1WSxHQUFHdlksT0FBSCxDQUFZQSxRQUFROXFCLENBQXBCLENBQXVCOHFCLFFBQVF0YSxDQUEvQixDQUFrQ3NhLFFBQVF6VCxDQUExQyxDQUE2Q3lULFFBQVEva0IsQ0FBckQsRUFDQW9oRSxlQUFlOTBELElBQWYsQ0FBcUJ5WSxPQUFyQixFQUVBLENBRUQsQ0FFRCxpQkFBQSxDQUFtQkUsUUFBbkIsQ0FBOEIsQ0FFN0IsR0FBS284QyxnQkFBZ0J2eUQsTUFBaEIsQ0FBd0JtVyxRQUF4QixJQUF1QyxLQUE1QyxDQUFvRCxDQUVuRHFZLEdBQUdyWSxRQUFILENBQWFBLFNBQVNockIsQ0FBdEIsQ0FBeUJnckIsU0FBU3hhLENBQWxDLENBQXFDd2EsU0FBUzNULENBQTlDLENBQWlEMlQsU0FBU2psQixDQUExRCxFQUNBcWhFLGdCQUFnQi8wRCxJQUFoQixDQUFzQjJZLFFBQXRCLEVBRUEsQ0FFRCxDQUVEO0VBRUEsY0FBQSxFQUFpQixDQUVoQixJQUFNLE1BQVEsQ0FBZCxDQUFpQnY5QixFQUFJZzJFLGtCQUFrQnIyRSxNQUF2QyxDQUErQ0ssR0FBL0MsQ0FBc0QsQ0FFckQsR0FBS2cyRSxrQkFBbUJoMkUsQ0FBbkIsSUFBMkIsQ0FBaEMsQ0FBb0MsQ0FFbkM0MUMsR0FBR3lnQyx3QkFBSCxDQUE2QnIyRSxDQUE3QixFQUNBZzJFLGtCQUFtQmgyRSxDQUFuQixFQUF5QixDQUF6QixDQUVBLENBRUQsQ0FFRHVuRSxhQUFlLEVBQWYsQ0FFQStPLHlCQUEyQixJQUEzQixDQUVBOEMsbUJBQXFCLElBQXJCLENBQ0FHLHFCQUF1QixFQUF2QixDQUVBOUMsZUFBaUIsSUFBakIsQ0FFQUcsZ0JBQWtCLElBQWxCLENBRUFxQixpQkFBbUIsSUFBbkIsQ0FDQU0sZ0JBQWtCLElBQWxCLENBRUE1QyxZQUFZcjJFLEtBQVosR0FDQW0rQixZQUFZbitCLEtBQVosR0FDQW8rQixjQUFjcCtCLEtBQWQsR0FFQSxDQUVELE9BQU8sQ0FFTjgzQyxRQUFTLENBQ1JsSixNQUFPeW5DLFdBREMsQ0FFUjdnQyxNQUFPclgsV0FGQyxDQUdSODJDLFFBQVM3MkMsYUFIRCxDQUZILENBUU5zekMsZUFBZ0JBLGNBUlYsQ0FTTkMsZ0JBQWlCQSxlQVRYLENBVU4ySSwwQkFBMkJBLHlCQVZyQixDQVdOMUksd0JBQXlCQSx1QkFYbkIsQ0FZTjU0QixPQUFRQSxNQVpGLENBYU5DLFFBQVNBLE9BYkgsQ0FjTnNoQyw0QkFBNkJBLDJCQWR2QixDQWdCTjlJLFdBQVlBLFVBaEJOLENBa0JOZSxZQUFhQSxXQWxCUCxDQW1CTmdJLFlBQWFBLFdBbkJQLENBcUJObEUsYUFBY0EsWUFyQlIsQ0FzQk5DLFlBQWFBLFdBdEJQLENBd0JOa0UsYUFBY0EsWUF4QlIsQ0F5Qk4vQixpQkFBa0JBLGdCQXpCWixDQTJCTnRKLGVBQWdCQSxjQTNCVixDQTZCTjJDLGNBQWVBLGFBN0JULENBOEJOMkQsWUFBYUEsV0E5QlAsQ0ErQk55RSxxQkFBc0JBLG9CQS9CaEIsQ0FnQ05wRSxXQUFZQSxVQWhDTixDQWtDTmg0QyxRQUFTQSxPQWxDSCxDQW1DTkUsU0FBVUEsUUFuQ0osQ0FxQ05qK0IsTUFBT0EsS0FyQ0QsQ0FBUCxDQXlDQSxDQUVEOztLQUlBLHNCQUFBLENBQXdCaXZFLEdBQXhCLENBQTZCbnZELFVBQTdCLENBQXlDMWhCLEtBQXpDLENBQWdENDBDLFVBQWhELENBQTREaTFCLFlBQTVELENBQTBFeUssS0FBMUUsQ0FBaUZ4ekUsSUFBakYsQ0FBd0YsQ0FFdkYsY0FBa0IsNkJBQUEsR0FBa0MsV0FBbEMsRUFBaUQrdkUscUNBQW5FLENBQTRHLG1DQUM1RyxtQkFBcUIsRUFBckIsQ0FDQSxXQUFBLENBRUE7RUFFQSx1QkFBQSxDQUF5QjUwQyxLQUF6QixDQUFnQ3FnRCxPQUFoQyxDQUEwQyxDQUV6QyxHQUFLcmdELE1BQU1vQyxLQUFOLENBQWNpK0MsT0FBZCxFQUF5QnJnRCxNQUFNcUMsTUFBTixDQUFlZytDLE9BQTdDLENBQXVELENBRXRELEdBQUssY0FBTCxDQUF1QixDQUV0Qi9rRSxRQUFRNlAsSUFBUixDQUFjLHlEQUEyRDZVLE1BQU1vQyxLQUFqRSxDQUF5RSxHQUF6RSxDQUErRXBDLE1BQU1xQyxNQUFyRixDQUE4RixJQUE1RyxFQUNBLE9BRUEsQ0FFRDtFQUNBO0VBRUEsVUFBWWcrQyxRQUFVbjRFLEtBQUs4RSxHQUFMLENBQVVnekIsTUFBTW9DLEtBQWhCLENBQXVCcEMsTUFBTXFDLE1BQTdCLENBQXRCLENBRUEsV0FBYXA0QixTQUFTazRCLGVBQVQsQ0FBMEIsOEJBQTFCLENBQTBELFFBQTFELENBQWIsQ0FDQUQsT0FBT0UsS0FBUCxDQUFlbDZCLEtBQUtFLEtBQUwsQ0FBWTQzQixNQUFNb0MsS0FBTixDQUFjcE0sS0FBMUIsQ0FBZixDQUNBa00sT0FBT0csTUFBUCxDQUFnQm42QixLQUFLRSxLQUFMLENBQVk0M0IsTUFBTXFDLE1BQU4sQ0FBZXJNLEtBQTNCLENBQWhCLENBRUEsWUFBY2tNLE9BQU9JLFVBQVAsQ0FBbUIsSUFBbkIsQ0FBZCxDQUNBMWhDLFFBQVE0aEMsU0FBUixDQUFtQnhDLEtBQW5CLENBQTBCLENBQTFCLENBQTZCLENBQTdCLENBQWdDQSxNQUFNb0MsS0FBdEMsQ0FBNkNwQyxNQUFNcUMsTUFBbkQsQ0FBMkQsQ0FBM0QsQ0FBOEQsQ0FBOUQsQ0FBaUVILE9BQU9FLEtBQXhFLENBQStFRixPQUFPRyxNQUF0RixFQUVBL21CLFFBQVE2UCxJQUFSLENBQWMsMENBQTRDNlUsTUFBTW9DLEtBQWxELENBQTBELEdBQTFELENBQWdFcEMsTUFBTXFDLE1BQXRFLENBQStFLGdCQUEvRSxDQUFrR0gsT0FBT0UsS0FBekcsQ0FBaUgsR0FBakgsQ0FBdUhGLE9BQU9HLE1BQTVJLENBQW9KckMsS0FBcEosRUFFQSxhQUFBLENBRUEsQ0FFRCxZQUFBLENBRUEsQ0FFRCxxQkFBQSxDQUF1QkEsS0FBdkIsQ0FBK0IsQ0FFOUIsYUFBYTdWLFlBQU4sQ0FBb0I2VixNQUFNb0MsS0FBMUIsR0FBcUNwWSxNQUFNRyxZQUFOLENBQW9CNlYsTUFBTXFDLE1BQTFCLENBQTVDLENBRUEsQ0FFRCx1QkFBQSxDQUF5QnJDLEtBQXpCLENBQWlDLENBRWhDLEdBQUtBLGlDQUFBLEVBQXFDQSxrQ0FBckMsRUFBMkVBLDRCQUFoRixDQUErRyxDQUU5RyxHQUFLc2dELFVBQVkzN0UsU0FBakIsQ0FBNkIyN0UsUUFBVXIyRSxTQUFTazRCLGVBQVQsQ0FBMEIsOEJBQTFCLENBQTBELFFBQTFELENBQVYsQ0FFN0JtK0MsUUFBUWwrQyxLQUFSLENBQWdCcFksTUFBTU8sZUFBTixDQUF1QnlWLE1BQU1vQyxLQUE3QixDQUFoQixDQUNBaytDLFFBQVFqK0MsTUFBUixDQUFpQnJZLE1BQU1PLGVBQU4sQ0FBdUJ5VixNQUFNcUMsTUFBN0IsQ0FBakIsQ0FFQSxZQUFjaStDLFFBQVFoK0MsVUFBUixDQUFvQixJQUFwQixDQUFkLENBQ0ExaEMsUUFBUTRoQyxTQUFSLENBQW1CeEMsS0FBbkIsQ0FBMEIsQ0FBMUIsQ0FBNkIsQ0FBN0IsQ0FBZ0NzZ0QsUUFBUWwrQyxLQUF4QyxDQUErQ2srQyxRQUFRaitDLE1BQXZELEVBRUEvbUIsUUFBUTZQLElBQVIsQ0FBYyxtREFBcUQ2VSxNQUFNb0MsS0FBM0QsQ0FBbUUsR0FBbkUsQ0FBeUVwQyxNQUFNcUMsTUFBL0UsQ0FBd0YsZ0JBQXhGLENBQTJHaStDLFFBQVFsK0MsS0FBbkgsQ0FBMkgsR0FBM0gsQ0FBaUlrK0MsUUFBUWorQyxNQUF2SixDQUErSnJDLEtBQS9KLEVBRUEsY0FBQSxDQUVBLENBRUQsWUFBQSxDQUVBLENBRUQsK0JBQUEsQ0FBaUM2RCxPQUFqQyxDQUEyQyxDQUUxQyxlQUFpQjNELEtBQVIsR0FBa0JhLG1CQUFsQixFQUF5QzhDLFFBQVExRCxLQUFSLEdBQWtCWSxtQkFBN0QsRUFDSjhDLFFBQVF4RCxTQUFSLEdBQXNCbUUsYUFBdEIsRUFBdUNYLFFBQVF4RCxTQUFSLEdBQXNCVyxZQURoRSxDQUdBLENBRUQsb0NBQUEsQ0FBc0M2QyxPQUF0QyxDQUErQzFaLFlBQS9DLENBQThELENBRTdELGVBQWVtWCxlQUFSLEVBQTJCblgsWUFBM0IsRUFDTjBaLFFBQVF4RCxTQUFSLEdBQXNCbUUsYUFEaEIsRUFDaUNYLFFBQVF4RCxTQUFSLEdBQXNCVyxZQUQ5RCxDQUdBLENBRUQsdUJBQUEsQ0FBeUIvMEIsTUFBekIsQ0FBaUM0M0IsT0FBakMsQ0FBMEN6QixLQUExQyxDQUFpREMsTUFBakQsQ0FBMEQsQ0FFekR1eUMsSUFBSTJMLGNBQUosQ0FBb0J0MEUsTUFBcEIsRUFFQSxzQkFBd0Iwc0MsV0FBVzV1QyxHQUFYLENBQWdCODVCLE9BQWhCLENBQXhCLENBRUE7RUFDQTI4QyxrQkFBa0JDLGFBQWxCLENBQWtDdjRFLEtBQUttaUIsR0FBTCxDQUFVbmlCLEtBQUs4RSxHQUFMLENBQVVvMUIsS0FBVixDQUFpQkMsTUFBakIsQ0FBVixFQUF3Q242QixLQUFLdzRFLEtBQS9FLENBRUEsQ0FFRDtFQUVBLHVCQUFBLENBQXlCMzFFLENBQXpCLENBQTZCLENBRTVCLEdBQUtBLElBQU15NUIsYUFBTixFQUF1Qno1QixJQUFNNDFFLDBCQUE3QixFQUEyRDUxRSxJQUFNNjFFLHlCQUF0RSxDQUFrRyxDQUVqRyxXQUFXcEYsT0FBWCxDQUVBLENBRUQsV0FBV3FGLE1BQVgsQ0FFQSxDQUVEO0VBRUEseUJBQUEsQ0FBMkJyckUsS0FBM0IsQ0FBbUMsQ0FFbEMsWUFBY0EsTUFBTXZKLE1BQXBCLENBRUE0M0IsUUFBUXBjLG1CQUFSLENBQTZCLFNBQTdCLENBQXdDcTVELGdCQUF4QyxFQUVBQyxrQkFBbUJsOUMsT0FBbkIsRUFFQSxHQUFLQSxRQUFRbTlDLGNBQWIsQ0FBOEIsQ0FFN0Isc0JBQXVCbjlDLFFBQVE1MUIsRUFBeEIsQ0FBUCxDQUVBLENBRURwSixLQUFLZzlELE1BQUwsQ0FBWTUvQixRQUFaLEdBRUEsQ0FFRCw4QkFBQSxDQUFnQ3pzQixLQUFoQyxDQUF3QyxDQUV2QyxpQkFBbUJBLE1BQU12SixNQUF6QixDQUVBZzFFLGFBQWF4NUQsbUJBQWIsQ0FBa0MsU0FBbEMsQ0FBNkN5NUQscUJBQTdDLEVBRUFDLHVCQUF3QkYsWUFBeEIsRUFFQXA4RSxLQUFLZzlELE1BQUwsQ0FBWTUvQixRQUFaLEdBRUEsQ0FFRDtFQUVBLDBCQUFBLENBQTRCNEIsT0FBNUIsQ0FBc0MsQ0FFckMsc0JBQXdCOFUsV0FBVzV1QyxHQUFYLENBQWdCODVCLE9BQWhCLENBQXhCLENBRUEsR0FBS0EsUUFBUTdELEtBQVIsRUFBaUJ3Z0Qsa0JBQWtCWSx5QkFBeEMsQ0FBb0U7RUFJbkV4TSxJQUFJeU0sYUFBSixDQUFtQmIsa0JBQWtCWSx5QkFBckMsRUFFQSxDQU5ELElBTU87RUFJTixHQUFLWixrQkFBa0JjLFdBQWxCLEdBQWtDMzhFLFNBQXZDLENBQW1ELE9BRW5EaXdFLElBQUl5TSxhQUFKLENBQW1CYixrQkFBa0JlLGNBQXJDLEVBRUEsQ0FFRDtFQUNBNW9DLFdBQVdrRixNQUFYLENBQW1CaGEsT0FBbkIsRUFFQSxDQUVELCtCQUFBLENBQWlDbzlDLFlBQWpDLENBQWdELENBRS9DLDJCQUE2QnRvQyxXQUFXNXVDLEdBQVgsQ0FBZ0JrM0UsWUFBaEIsQ0FBN0IsQ0FDQSxzQkFBd0J0b0MsV0FBVzV1QyxHQUFYLENBQWdCazNFLGFBQWFwOUMsT0FBN0IsQ0FBeEIsQ0FFQSxHQUFLLENBQUVvOUMsWUFBUCxDQUFzQixPQUV0QixHQUFLVCxrQkFBa0JlLGNBQWxCLEdBQXFDNThFLFNBQTFDLENBQXNELENBRXJEaXdFLElBQUl5TSxhQUFKLENBQW1CYixrQkFBa0JlLGNBQXJDLEVBRUEsQ0FFRCxHQUFLTixhQUFhajlDLFlBQWxCLENBQWlDLENBRWhDaTlDLGFBQWFqOUMsWUFBYixDQUEwQmxCLE9BQTFCLEdBRUEsQ0FFRCxHQUFLbStDLGFBQWExOEMsdUJBQWxCLENBQTRDLENBRTNDLElBQU0sTUFBUSxDQUFkLENBQWlCbCtCLEVBQUksQ0FBckIsQ0FBd0JBLEdBQXhCLENBQStCLENBRTlCdXVFLElBQUk0TSxpQkFBSixDQUF1QkMsdUJBQXVCQyxrQkFBdkIsQ0FBMkNyN0UsQ0FBM0MsQ0FBdkIsRUFDQSxHQUFLbzdFLHVCQUF1QkUsa0JBQTVCLENBQWlEL00sSUFBSWdOLGtCQUFKLENBQXdCSCx1QkFBdUJFLGtCQUF2QixDQUEyQ3Q3RSxDQUEzQyxDQUF4QixFQUVqRCxDQUVELENBVEQsSUFTTyxDQUVOdXVFLElBQUk0TSxpQkFBSixDQUF1QkMsdUJBQXVCQyxrQkFBOUMsRUFDQSxHQUFLRCx1QkFBdUJFLGtCQUE1QixDQUFpRC9NLElBQUlnTixrQkFBSixDQUF3QkgsdUJBQXVCRSxrQkFBL0MsRUFFakQsQ0FFRGhwQyxXQUFXa0YsTUFBWCxDQUFtQm9qQyxhQUFhcDlDLE9BQWhDLEVBQ0E4VSxXQUFXa0YsTUFBWCxDQUFtQm9qQyxZQUFuQixFQUVBLENBRUQ7RUFJQSxxQkFBQSxDQUF1QnA5QyxPQUF2QixDQUFnQ2crQyxJQUFoQyxDQUF1QyxDQUV0QyxzQkFBd0JscEMsV0FBVzV1QyxHQUFYLENBQWdCODVCLE9BQWhCLENBQXhCLENBRUEsR0FBS0EsUUFBUW05QyxjQUFiLENBQThCYyxtQkFBb0JqK0MsT0FBcEIsRUFFOUIsR0FBS0EsUUFBUTE2QixPQUFSLENBQWtCLENBQWxCLEVBQXVCcTNFLGtCQUFrQnVCLFNBQWxCLEdBQWdDbCtDLFFBQVExNkIsT0FBcEUsQ0FBOEUsQ0FFN0UsVUFBWTA2QixRQUFRN0QsS0FBcEIsQ0FFQSxHQUFLQSxRQUFVcjdCLFNBQWYsQ0FBMkIsQ0FFMUIyVyxRQUFRNlAsSUFBUixDQUFjLHVFQUFkLENBQXVGMFksT0FBdkYsRUFFQSxDQUpELFFBSVk3RCxNQUFNejRCLFFBQU4sR0FBbUIsS0FBeEIsQ0FBZ0MsQ0FFdEMrVCxRQUFRNlAsSUFBUixDQUFjLHdFQUFkLENBQXdGMFksT0FBeEYsRUFFQSxDQUpNLElBSUEsQ0FFTm0rQyxjQUFleEIsaUJBQWYsQ0FBa0MzOEMsT0FBbEMsQ0FBMkNnK0MsSUFBM0MsRUFDQSxPQUVBLENBRUQsQ0FFRDk5RSxNQUFNMnpFLGFBQU4sQ0FBcUI5QyxJQUFJK0MsUUFBSixDQUFla0ssSUFBcEMsRUFDQTk5RSxNQUFNczNFLFdBQU4sQ0FBbUJ6RyxJQUFJaUgsVUFBdkIsQ0FBbUMyRSxrQkFBa0JlLGNBQXJELEVBRUEsQ0FFRCx1QkFBQSxDQUF5QjE5QyxPQUF6QixDQUFrQ2crQyxJQUFsQyxDQUF5QyxDQUV4QyxzQkFBd0JscEMsV0FBVzV1QyxHQUFYLENBQWdCODVCLE9BQWhCLENBQXhCLENBRUEsR0FBS0EsUUFBUTdELEtBQVIsQ0FBY2g2QixNQUFkLEdBQXlCLENBQTlCLENBQWtDLENBRWpDLEdBQUs2OUIsUUFBUTE2QixPQUFSLENBQWtCLENBQWxCLEVBQXVCcTNFLGtCQUFrQnVCLFNBQWxCLEdBQWdDbCtDLFFBQVExNkIsT0FBcEUsQ0FBOEUsQ0FFN0UsR0FBSyxDQUFFcTNFLGtCQUFrQlkseUJBQXpCLENBQXFELENBRXBEdjlDLFFBQVF2dEIsZ0JBQVIsQ0FBMEIsU0FBMUIsQ0FBcUN3cUUsZ0JBQXJDLEVBRUFOLGtCQUFrQlkseUJBQWxCLENBQThDeE0sSUFBSXdHLGFBQUosRUFBOUMsQ0FFQXYyRSxLQUFLZzlELE1BQUwsQ0FBWTUvQixRQUFaLEdBRUEsQ0FFRGwrQixNQUFNMnpFLGFBQU4sQ0FBcUI5QyxJQUFJK0MsUUFBSixDQUFla0ssSUFBcEMsRUFDQTk5RSxNQUFNczNFLFdBQU4sQ0FBbUJ6RyxJQUFJa0gsZ0JBQXZCLENBQXlDMEUsa0JBQWtCWSx5QkFBM0QsRUFFQXhNLElBQUlxTixXQUFKLENBQWlCck4sSUFBSXNOLG1CQUFyQixDQUEwQ3IrQyxRQUFRckMsS0FBbEQsRUFFQSxpQkFBcUJxQyxTQUFXQSxRQUFRcytDLG1CQUF4QyxDQUNBLGtCQUFzQnQrQyxRQUFRN0QsS0FBUixDQUFlLENBQWYsR0FBc0I2RCxRQUFRN0QsS0FBUixDQUFlLENBQWYsRUFBbUIwRSxhQUEvRCxDQUVBLGNBQWdCLEVBQWhCLENBRUEsSUFBTSxNQUFRLENBQWQsQ0FBaUJyK0IsRUFBSSxDQUFyQixDQUF3QkEsR0FBeEIsQ0FBK0IsQ0FFOUIsR0FBSyxDQUFFKzdFLFlBQUYsRUFBa0IsQ0FBRTE5QyxhQUF6QixDQUF5QyxDQUV4QzI5QyxVQUFXaDhFLENBQVgsRUFBaUJpOEUsZUFBZ0J6K0MsUUFBUTdELEtBQVIsQ0FBZTM1QixDQUFmLENBQWhCLENBQW9DdW5FLGFBQWFsTyxjQUFqRCxDQUFqQixDQUVBLENBSkQsSUFJTyxDQUVOMmlCLFVBQVdoOEUsQ0FBWCxFQUFpQnErQixjQUFnQmIsUUFBUTdELEtBQVIsQ0FBZTM1QixDQUFmLEVBQW1CMjVCLEtBQW5DLENBQTJDNkQsUUFBUTdELEtBQVIsQ0FBZTM1QixDQUFmLENBQTVELENBRUEsQ0FFRCxDQUVELFVBQVlnOEUsVUFBVyxDQUFYLENBQVosQ0FDQ0Usa0JBQW9CcDRELGFBQWM2VixLQUFkLENBRHJCLENBRUN3aUQsU0FBV25LLE1BQU04RixPQUFOLENBQWV0NkMsUUFBUXZELE1BQXZCLENBRlosQ0FHQ21pRCxPQUFTcEssTUFBTThGLE9BQU4sQ0FBZXQ2QyxRQUFRN2lDLElBQXZCLENBSFYsQ0FLQTBoRixxQkFBc0I5TixJQUFJa0gsZ0JBQTFCLENBQTRDajRDLE9BQTVDLENBQXFEMCtDLGlCQUFyRCxFQUVBLElBQU0sTUFBUSxDQUFkLENBQWlCbDhFLEVBQUksQ0FBckIsQ0FBd0JBLEdBQXhCLENBQStCLENBRTlCLEdBQUssQ0FBRSs3RSxZQUFQLENBQXNCLENBRXJCLEdBQUsxOUMsYUFBTCxDQUFxQixDQUVwQjNnQyxNQUFNMjNFLFVBQU4sQ0FBa0I5RyxJQUFJbUgsMkJBQUosQ0FBa0MxMUUsQ0FBcEQsQ0FBdUQsQ0FBdkQsQ0FBMERtOEUsUUFBMUQsQ0FBb0VILFVBQVdoOEUsQ0FBWCxFQUFlKzdCLEtBQW5GLENBQTBGaWdELFVBQVdoOEUsQ0FBWCxFQUFlZzhCLE1BQXpHLENBQWlILENBQWpILENBQW9IbWdELFFBQXBILENBQThIQyxNQUE5SCxDQUFzSUosVUFBV2g4RSxDQUFYLEVBQWVxUCxJQUFySixFQUVBLENBSkQsSUFJTyxDQUVOM1IsTUFBTTIzRSxVQUFOLENBQWtCOUcsSUFBSW1ILDJCQUFKLENBQWtDMTFFLENBQXBELENBQXVELENBQXZELENBQTBEbThFLFFBQTFELENBQW9FQSxRQUFwRSxDQUE4RUMsTUFBOUUsQ0FBc0ZKLFVBQVdoOEUsQ0FBWCxDQUF0RixFQUVBLENBRUQsQ0FaRCxJQVlPLENBRU4sVUFBQSxDQUFZdzZCLFFBQVV3aEQsVUFBV2g4RSxDQUFYLEVBQWV3NkIsT0FBckMsQ0FFQSxJQUFNLE1BQVEsQ0FBUixDQUFXeWtCLEdBQUt6a0IsUUFBUTc2QixNQUE5QixDQUFzQ2ljLEVBQUlxakMsRUFBMUMsQ0FBOENyakMsR0FBOUMsQ0FBcUQsQ0FFcEQwZ0UsT0FBUzloRCxRQUFTNWUsQ0FBVCxDQUFULENBRUEsR0FBSzRoQixRQUFRdkQsTUFBUixHQUFtQlksVUFBbkIsRUFBaUMyQyxRQUFRdkQsTUFBUixHQUFtQnNpRCxTQUF6RCxDQUFxRSxDQUVwRSxHQUFLNytFLE1BQU1tOEUsMkJBQU4sR0FBb0NyNEUsT0FBcEMsQ0FBNkMyNkUsUUFBN0MsRUFBMEQsQ0FBRSxDQUFqRSxDQUFxRSxDQUVwRXorRSxNQUFNKzdFLG9CQUFOLENBQTRCbEwsSUFBSW1ILDJCQUFKLENBQWtDMTFFLENBQTlELENBQWlFNGIsQ0FBakUsQ0FBb0V1Z0UsUUFBcEUsQ0FBOEVHLE9BQU92Z0QsS0FBckYsQ0FBNEZ1Z0QsT0FBT3RnRCxNQUFuRyxDQUEyRyxDQUEzRyxDQUE4R3NnRCxPQUFPanRFLElBQXJILEVBRUEsQ0FKRCxJQUlPLENBRU40RixRQUFRNlAsSUFBUixDQUFjLGlHQUFkLEVBRUEsQ0FFRCxDQVpELElBWU8sQ0FFTnBuQixNQUFNMjNFLFVBQU4sQ0FBa0I5RyxJQUFJbUgsMkJBQUosQ0FBa0MxMUUsQ0FBcEQsQ0FBdUQ0YixDQUF2RCxDQUEwRHVnRSxRQUExRCxDQUFvRUcsT0FBT3ZnRCxLQUEzRSxDQUFrRnVnRCxPQUFPdGdELE1BQXpGLENBQWlHLENBQWpHLENBQW9HbWdELFFBQXBHLENBQThHQyxNQUE5RyxDQUFzSEUsT0FBT2p0RSxJQUE3SCxFQUVBLENBRUQsQ0FFRCxDQUVELENBRUQsR0FBSyxDQUFFMHNFLFlBQVAsQ0FBc0IsQ0FFckI1QixrQkFBa0JDLGFBQWxCLENBQWtDLENBQWxDLENBRUEsQ0FKRCxJQUlPLENBRU5ELGtCQUFrQkMsYUFBbEIsQ0FBa0M1L0MsUUFBUTc2QixNQUFSLENBQWlCLENBQW5ELENBRUEsQ0FFRCxHQUFLNjhFLDRCQUE2QmgvQyxPQUE3QixDQUFzQzArQyxpQkFBdEMsQ0FBTCxDQUFpRTtFQUdoRWhDLGVBQWdCM0wsSUFBSWtILGdCQUFwQixDQUFzQ2o0QyxPQUF0QyxDQUErQzdELE1BQU1vQyxLQUFyRCxDQUE0RHBDLE1BQU1xQyxNQUFsRSxFQUVBLENBRURtK0Msa0JBQWtCdUIsU0FBbEIsQ0FBOEJsK0MsUUFBUTE2QixPQUF0QyxDQUVBLEdBQUswNkIsUUFBUWxDLFFBQWIsQ0FBd0JrQyxRQUFRbEMsUUFBUixDQUFrQmtDLE9BQWxCLEVBRXhCLENBOUdELElBOEdPLENBRU45L0IsTUFBTTJ6RSxhQUFOLENBQXFCOUMsSUFBSStDLFFBQUosQ0FBZWtLLElBQXBDLEVBQ0E5OUUsTUFBTXMzRSxXQUFOLENBQW1CekcsSUFBSWtILGdCQUF2QixDQUF5QzBFLGtCQUFrQlkseUJBQTNELEVBRUEsQ0FFRCxDQUVELENBRUQsOEJBQUEsQ0FBZ0N2OUMsT0FBaEMsQ0FBeUNnK0MsSUFBekMsQ0FBZ0QsQ0FFL0M5OUUsTUFBTTJ6RSxhQUFOLENBQXFCOUMsSUFBSStDLFFBQUosQ0FBZWtLLElBQXBDLEVBQ0E5OUUsTUFBTXMzRSxXQUFOLENBQW1CekcsSUFBSWtILGdCQUF2QixDQUF5Q25qQyxXQUFXNXVDLEdBQVgsQ0FBZ0I4NUIsT0FBaEIsRUFBMEIwOUMsY0FBbkUsRUFFQSxDQUVELDZCQUFBLENBQStCdUIsV0FBL0IsQ0FBNENqL0MsT0FBNUMsQ0FBcUQwK0MsaUJBQXJELENBQXlFLENBRXhFLGFBQUEsQ0FFQSxHQUFLQSxpQkFBTCxDQUF5QixDQUV4QjNOLElBQUkwRyxhQUFKLENBQW1Cd0gsV0FBbkIsQ0FBZ0NsTyxJQUFJbU8sY0FBcEMsQ0FBb0QxSyxNQUFNOEYsT0FBTixDQUFldDZDLFFBQVEzRCxLQUF2QixDQUFwRCxFQUNBMDBDLElBQUkwRyxhQUFKLENBQW1Cd0gsV0FBbkIsQ0FBZ0NsTyxJQUFJb08sY0FBcEMsQ0FBb0QzSyxNQUFNOEYsT0FBTixDQUFldDZDLFFBQVExRCxLQUF2QixDQUFwRCxFQUVBeTBDLElBQUkwRyxhQUFKLENBQW1Cd0gsV0FBbkIsQ0FBZ0NsTyxJQUFJNkcsa0JBQXBDLENBQXdEcEQsTUFBTThGLE9BQU4sQ0FBZXQ2QyxRQUFRekQsU0FBdkIsQ0FBeEQsRUFDQXcwQyxJQUFJMEcsYUFBSixDQUFtQndILFdBQW5CLENBQWdDbE8sSUFBSTJHLGtCQUFwQyxDQUF3RGxELE1BQU04RixPQUFOLENBQWV0NkMsUUFBUXhELFNBQXZCLENBQXhELEVBRUEsQ0FSRCxJQVFPLENBRU51MEMsSUFBSTBHLGFBQUosQ0FBbUJ3SCxXQUFuQixDQUFnQ2xPLElBQUltTyxjQUFwQyxDQUFvRG5PLElBQUlxTyxhQUF4RCxFQUNBck8sSUFBSTBHLGFBQUosQ0FBbUJ3SCxXQUFuQixDQUFnQ2xPLElBQUlvTyxjQUFwQyxDQUFvRHBPLElBQUlxTyxhQUF4RCxFQUVBLEdBQUtwL0MsUUFBUTNELEtBQVIsR0FBa0JhLG1CQUFsQixFQUF5QzhDLFFBQVExRCxLQUFSLEdBQWtCWSxtQkFBaEUsQ0FBc0YsQ0FFckZ6bEIsUUFBUTZQLElBQVIsQ0FBYywrSEFBZCxDQUErSTBZLE9BQS9JLEVBRUEsQ0FFRCt3QyxJQUFJMEcsYUFBSixDQUFtQndILFdBQW5CLENBQWdDbE8sSUFBSTZHLGtCQUFwQyxDQUF3RHlILGVBQWdCci9DLFFBQVF6RCxTQUF4QixDQUF4RCxFQUNBdzBDLElBQUkwRyxhQUFKLENBQW1Cd0gsV0FBbkIsQ0FBZ0NsTyxJQUFJMkcsa0JBQXBDLENBQXdEMkgsZUFBZ0JyL0MsUUFBUXhELFNBQXhCLENBQXhELEVBRUEsR0FBS3dELFFBQVF4RCxTQUFSLEdBQXNCbUUsYUFBdEIsRUFBdUNYLFFBQVF4RCxTQUFSLEdBQXNCVyxZQUFsRSxDQUFpRixDQUVoRjFsQixRQUFRNlAsSUFBUixDQUFjLGlJQUFkLENBQWlKMFksT0FBakosRUFFQSxDQUVELENBRURqZSxVQUFZSCxXQUFXMWIsR0FBWCxDQUFnQixnQ0FBaEIsQ0FBWixDQUVBLEdBQUs2YixTQUFMLENBQWlCLENBRWhCLEdBQUtpZSxRQUFRN2lDLElBQVIsR0FBaUJtaUYsU0FBakIsRUFBOEIxOUQsV0FBVzFiLEdBQVgsQ0FBZ0IsMEJBQWhCLElBQWlELElBQXBGLENBQTJGLE9BQzNGLEdBQUs4NUIsUUFBUTdpQyxJQUFSLEdBQWlCb2lGLGFBQWpCLEVBQWtDMzlELFdBQVcxYixHQUFYLENBQWdCLCtCQUFoQixJQUFzRCxJQUE3RixDQUFvRyxPQUVwRyxHQUFLODVCLFFBQVF0RCxVQUFSLENBQXFCLENBQXJCLEVBQTBCb1ksV0FBVzV1QyxHQUFYLENBQWdCODVCLE9BQWhCLEVBQTBCdy9DLG1CQUF6RCxDQUErRSxDQUU5RXpPLElBQUkwTyxhQUFKLENBQW1CUixXQUFuQixDQUFnQ2w5RCxVQUFVMjlELDBCQUExQyxDQUFzRXI3RSxLQUFLNkUsR0FBTCxDQUFVODJCLFFBQVF0RCxVQUFsQixDQUE4QnF0QyxhQUFhck8sZ0JBQWIsRUFBOUIsQ0FBdEUsRUFDQTVtQixXQUFXNXVDLEdBQVgsQ0FBZ0I4NUIsT0FBaEIsRUFBMEJ3L0MsbUJBQTFCLENBQWdEeC9DLFFBQVF0RCxVQUF4RCxDQUVBLENBRUQsQ0FFRCxDQUVELHNCQUFBLENBQXdCaWdELGlCQUF4QixDQUEyQzM4QyxPQUEzQyxDQUFvRGcrQyxJQUFwRCxDQUEyRCxDQUUxRCxHQUFLckIsa0JBQWtCYyxXQUFsQixHQUFrQzM4RSxTQUF2QyxDQUFtRCxDQUVsRDY3RSxrQkFBa0JjLFdBQWxCLENBQWdDLElBQWhDLENBRUF6OUMsUUFBUXZ0QixnQkFBUixDQUEwQixTQUExQixDQUFxQ3dxRSxnQkFBckMsRUFFQU4sa0JBQWtCZSxjQUFsQixDQUFtQzNNLElBQUl3RyxhQUFKLEVBQW5DLENBRUF2MkUsS0FBS2c5RCxNQUFMLENBQVk1L0IsUUFBWixHQUVBLENBRURsK0IsTUFBTTJ6RSxhQUFOLENBQXFCOUMsSUFBSStDLFFBQUosQ0FBZWtLLElBQXBDLEVBQ0E5OUUsTUFBTXMzRSxXQUFOLENBQW1CekcsSUFBSWlILFVBQXZCLENBQW1DMkUsa0JBQWtCZSxjQUFyRCxFQUVBM00sSUFBSXFOLFdBQUosQ0FBaUJyTixJQUFJc04sbUJBQXJCLENBQTBDcitDLFFBQVFyQyxLQUFsRCxFQUNBb3pDLElBQUlxTixXQUFKLENBQWlCck4sSUFBSTRPLDhCQUFyQixDQUFxRDMvQyxRQUFRdEMsZ0JBQTdELEVBQ0FxekMsSUFBSXFOLFdBQUosQ0FBaUJyTixJQUFJNk8sZ0JBQXJCLENBQXVDNS9DLFFBQVFwQyxlQUEvQyxFQUVBLFVBQVk2Z0QsZUFBZ0J6K0MsUUFBUTdELEtBQXhCLENBQStCNHRDLGFBQWFuTyxjQUE1QyxDQUFaLENBRUEsR0FBS2lrQix1QkFBd0I3L0MsT0FBeEIsR0FBcUMxWixhQUFjNlYsS0FBZCxJQUEwQixLQUFwRSxDQUE0RSxDQUUzRUEsTUFBUTJqRCxlQUFnQjNqRCxLQUFoQixDQUFSLENBRUEsQ0FFRCxzQkFBd0I3VixhQUFjNlYsS0FBZCxDQUF4QixDQUNDd2lELFNBQVduSyxNQUFNOEYsT0FBTixDQUFldDZDLFFBQVF2RCxNQUF2QixDQURaLENBRUNtaUQsT0FBU3BLLE1BQU04RixPQUFOLENBQWV0NkMsUUFBUTdpQyxJQUF2QixDQUZWLENBSUEwaEYscUJBQXNCOU4sSUFBSWlILFVBQTFCLENBQXNDaDRDLE9BQXRDLENBQStDMCtDLGlCQUEvQyxFQUVBLFVBQUEsQ0FBWTFoRCxRQUFVZ0QsUUFBUWhELE9BQTlCLENBRUEsR0FBS2dELFFBQVErL0MsY0FBYixDQUE4QjtFQUk3QixtQkFBcUJoUCxJQUFJaVAsZUFBekIsQ0FFQSxHQUFLaGdELFFBQVE3aUMsSUFBUixHQUFpQm1pRixTQUF0QixDQUFrQyxDQUVqQyxHQUFLLENBQUVXLFNBQVAsQ0FBbUIsZUFBTSxDQUFXLGdEQUFYLENBQU4sQ0FDbkJDLGVBQWlCblAsSUFBSW9QLGtCQUFyQixDQUVBLENBTEQsUUFLWUYsU0FBTCxDQUFpQjtFQUd2QkMsZUFBaUJuUCxJQUFJcVAsaUJBQXJCLENBRUEsQ0FFRCxHQUFLcGdELFFBQVF2RCxNQUFSLEdBQW1CNGpELFdBQW5CLEVBQWtDSCxpQkFBbUJuUCxJQUFJaVAsZUFBOUQsQ0FBZ0Y7RUFHL0U7RUFDQTtFQUNBLEdBQUtoZ0QsUUFBUTdpQyxJQUFSLEdBQWlCbWpGLGlCQUFqQixFQUFzQ3RnRCxRQUFRN2lDLElBQVIsR0FBaUJvakYsZUFBNUQsQ0FBOEUsQ0FFN0U5b0UsUUFBUTZQLElBQVIsQ0FBYyw2RkFBZCxFQUVBMFksUUFBUTdpQyxJQUFSLENBQWVtakYsaUJBQWYsQ0FDQTFCLE9BQVNwSyxNQUFNOEYsT0FBTixDQUFldDZDLFFBQVE3aUMsSUFBdkIsQ0FBVCxDQUVBLENBRUQsQ0FFRDtFQUNBO0VBQ0EsR0FBSzZpQyxRQUFRdkQsTUFBUixHQUFtQitqRCxrQkFBeEIsQ0FBNkMsQ0FFNUNOLGVBQWlCblAsSUFBSTBQLGFBQXJCLENBRUE7RUFDQTtFQUNBO0VBQ0EsR0FBS3pnRCxRQUFRN2lDLElBQVIsR0FBaUJ1akYsa0JBQXRCLENBQTJDLENBRTFDanBFLFFBQVE2UCxJQUFSLENBQWMsa0ZBQWQsRUFFQTBZLFFBQVE3aUMsSUFBUixDQUFldWpGLGtCQUFmLENBQ0E5QixPQUFTcEssTUFBTThGLE9BQU4sQ0FBZXQ2QyxRQUFRN2lDLElBQXZCLENBQVQsQ0FFQSxDQUVELENBRUQrQyxNQUFNMjNFLFVBQU4sQ0FBa0I5RyxJQUFJaUgsVUFBdEIsQ0FBa0MsQ0FBbEMsQ0FBcUNrSSxjQUFyQyxDQUFxRC9qRCxNQUFNb0MsS0FBM0QsQ0FBa0VwQyxNQUFNcUMsTUFBeEUsQ0FBZ0YsQ0FBaEYsQ0FBbUZtZ0QsUUFBbkYsQ0FBNkZDLE1BQTdGLENBQXFHLElBQXJHLEVBRUEsQ0F4REQsUUF3RFk1K0MsUUFBUWEsYUFBYixDQUE2QjtFQUduQztFQUNBO0VBRUEsR0FBSzdELFFBQVE3NkIsTUFBUixDQUFpQixDQUFqQixFQUFzQnU4RSxpQkFBM0IsQ0FBK0MsQ0FFOUMsSUFBTSxNQUFRLENBQVIsQ0FBVzk4QyxHQUFLNUUsUUFBUTc2QixNQUE5QixDQUFzQ0ssRUFBSW8vQixFQUExQyxDQUE4Q3AvQixHQUE5QyxDQUFxRCxDQUVwRHM4RSxPQUFTOWhELFFBQVN4NkIsQ0FBVCxDQUFULENBQ0F0QyxNQUFNMjNFLFVBQU4sQ0FBa0I5RyxJQUFJaUgsVUFBdEIsQ0FBa0N4MUUsQ0FBbEMsQ0FBcUNtOEUsUUFBckMsQ0FBK0NHLE9BQU92Z0QsS0FBdEQsQ0FBNkR1Z0QsT0FBT3RnRCxNQUFwRSxDQUE0RSxDQUE1RSxDQUErRW1nRCxRQUEvRSxDQUF5RkMsTUFBekYsQ0FBaUdFLE9BQU9qdEUsSUFBeEcsRUFFQSxDQUVEbXVCLFFBQVF2QyxlQUFSLENBQTBCLEtBQTFCLENBQ0FrL0Msa0JBQWtCQyxhQUFsQixDQUFrQzUvQyxRQUFRNzZCLE1BQVIsQ0FBaUIsQ0FBbkQsQ0FFQSxDQVpELElBWU8sQ0FFTmpDLE1BQU0yM0UsVUFBTixDQUFrQjlHLElBQUlpSCxVQUF0QixDQUFrQyxDQUFsQyxDQUFxQzJHLFFBQXJDLENBQStDeGlELE1BQU1vQyxLQUFyRCxDQUE0RHBDLE1BQU1xQyxNQUFsRSxDQUEwRSxDQUExRSxDQUE2RW1nRCxRQUE3RSxDQUF1RkMsTUFBdkYsQ0FBK0Z6aUQsTUFBTXRxQixJQUFyRyxFQUNBOHFFLGtCQUFrQkMsYUFBbEIsQ0FBa0MsQ0FBbEMsQ0FFQSxDQUVELENBekJNLFFBeUJLNThDLFFBQVFzK0MsbUJBQWIsQ0FBbUMsQ0FFekMsSUFBTSxNQUFRLENBQVIsQ0FBVzE4QyxHQUFLNUUsUUFBUTc2QixNQUE5QixDQUFzQ0ssRUFBSW8vQixFQUExQyxDQUE4Q3AvQixHQUE5QyxDQUFxRCxDQUVwRHM4RSxPQUFTOWhELFFBQVN4NkIsQ0FBVCxDQUFULENBRUEsR0FBS3c5QixRQUFRdkQsTUFBUixHQUFtQlksVUFBbkIsRUFBaUMyQyxRQUFRdkQsTUFBUixHQUFtQnNpRCxTQUF6RCxDQUFxRSxDQUVwRSxHQUFLNytFLE1BQU1tOEUsMkJBQU4sR0FBb0NyNEUsT0FBcEMsQ0FBNkMyNkUsUUFBN0MsRUFBMEQsQ0FBRSxDQUFqRSxDQUFxRSxDQUVwRXorRSxNQUFNKzdFLG9CQUFOLENBQTRCbEwsSUFBSWlILFVBQWhDLENBQTRDeDFFLENBQTVDLENBQStDbThFLFFBQS9DLENBQXlERyxPQUFPdmdELEtBQWhFLENBQXVFdWdELE9BQU90Z0QsTUFBOUUsQ0FBc0YsQ0FBdEYsQ0FBeUZzZ0QsT0FBT2p0RSxJQUFoRyxFQUVBLENBSkQsSUFJTyxDQUVONEYsUUFBUTZQLElBQVIsQ0FBYyxnR0FBZCxFQUVBLENBRUQsQ0FaRCxJQVlPLENBRU5wbkIsTUFBTTIzRSxVQUFOLENBQWtCOUcsSUFBSWlILFVBQXRCLENBQWtDeDFFLENBQWxDLENBQXFDbThFLFFBQXJDLENBQStDRyxPQUFPdmdELEtBQXRELENBQTZEdWdELE9BQU90Z0QsTUFBcEUsQ0FBNEUsQ0FBNUUsQ0FBK0VtZ0QsUUFBL0UsQ0FBeUZDLE1BQXpGLENBQWlHRSxPQUFPanRFLElBQXhHLEVBRUEsQ0FFRCxDQUVEOHFFLGtCQUFrQkMsYUFBbEIsQ0FBa0M1L0MsUUFBUTc2QixNQUFSLENBQWlCLENBQW5ELENBRUEsQ0E1Qk0sSUE0QkE7RUFJTjtFQUNBO0VBQ0E7RUFFQSxHQUFLNjZCLFFBQVE3NkIsTUFBUixDQUFpQixDQUFqQixFQUFzQnU4RSxpQkFBM0IsQ0FBK0MsQ0FFOUMsSUFBTSxNQUFRLENBQVIsQ0FBVzk4QyxHQUFLNUUsUUFBUTc2QixNQUE5QixDQUFzQ0ssRUFBSW8vQixFQUExQyxDQUE4Q3AvQixHQUE5QyxDQUFxRCxDQUVwRHM4RSxPQUFTOWhELFFBQVN4NkIsQ0FBVCxDQUFULENBQ0F0QyxNQUFNMjNFLFVBQU4sQ0FBa0I5RyxJQUFJaUgsVUFBdEIsQ0FBa0N4MUUsQ0FBbEMsQ0FBcUNtOEUsUUFBckMsQ0FBK0NBLFFBQS9DLENBQXlEQyxNQUF6RCxDQUFpRUUsTUFBakUsRUFFQSxDQUVEOStDLFFBQVF2QyxlQUFSLENBQTBCLEtBQTFCLENBQ0FrL0Msa0JBQWtCQyxhQUFsQixDQUFrQzUvQyxRQUFRNzZCLE1BQVIsQ0FBaUIsQ0FBbkQsQ0FFQSxDQVpELElBWU8sQ0FFTmpDLE1BQU0yM0UsVUFBTixDQUFrQjlHLElBQUlpSCxVQUF0QixDQUFrQyxDQUFsQyxDQUFxQzJHLFFBQXJDLENBQStDQSxRQUEvQyxDQUF5REMsTUFBekQsQ0FBaUV6aUQsS0FBakUsRUFDQXdnRCxrQkFBa0JDLGFBQWxCLENBQWtDLENBQWxDLENBRUEsQ0FFRCxDQUVELEdBQUtvQyw0QkFBNkJoL0MsT0FBN0IsQ0FBc0MwK0MsaUJBQXRDLENBQUwsQ0FBaUUsQ0FFaEVoQyxlQUFnQjNMLElBQUlpSCxVQUFwQixDQUFnQ2g0QyxPQUFoQyxDQUF5QzdELE1BQU1vQyxLQUEvQyxDQUFzRHBDLE1BQU1xQyxNQUE1RCxFQUVBLENBRURtK0Msa0JBQWtCdUIsU0FBbEIsQ0FBOEJsK0MsUUFBUTE2QixPQUF0QyxDQUVBLEdBQUswNkIsUUFBUWxDLFFBQWIsQ0FBd0JrQyxRQUFRbEMsUUFBUixDQUFrQmtDLE9BQWxCLEVBRXhCLENBRUQ7RUFFQTtFQUNBLGdDQUFBLENBQWtDMmdELFdBQWxDLENBQStDdkQsWUFBL0MsQ0FBNkR3RCxVQUE3RCxDQUF5RUMsYUFBekUsQ0FBeUYsQ0FFeEYsYUFBZXJNLE1BQU04RixPQUFOLENBQWU4QyxhQUFhcDlDLE9BQWIsQ0FBcUJ2RCxNQUFwQyxDQUFmLENBQ0EsV0FBYSszQyxNQUFNOEYsT0FBTixDQUFlOEMsYUFBYXA5QyxPQUFiLENBQXFCN2lDLElBQXBDLENBQWIsQ0FDQStDLE1BQU0yM0UsVUFBTixDQUFrQmdKLGFBQWxCLENBQWlDLENBQWpDLENBQW9DbEMsUUFBcEMsQ0FBOEN2QixhQUFhNytDLEtBQTNELENBQWtFNitDLGFBQWE1K0MsTUFBL0UsQ0FBdUYsQ0FBdkYsQ0FBMEZtZ0QsUUFBMUYsQ0FBb0dDLE1BQXBHLENBQTRHLElBQTVHLEVBQ0E3TixJQUFJK1AsZUFBSixDQUFxQi9QLElBQUlnUSxXQUF6QixDQUFzQ0osV0FBdEMsRUFDQTVQLElBQUlpUSxvQkFBSixDQUEwQmpRLElBQUlnUSxXQUE5QixDQUEyQ0gsVUFBM0MsQ0FBdURDLGFBQXZELENBQXNFL3JDLFdBQVc1dUMsR0FBWCxDQUFnQmszRSxhQUFhcDlDLE9BQTdCLEVBQXVDMDlDLGNBQTdHLENBQTZILENBQTdILEVBQ0EzTSxJQUFJK1AsZUFBSixDQUFxQi9QLElBQUlnUSxXQUF6QixDQUFzQyxJQUF0QyxFQUVBLENBRUQ7RUFDQSxpQ0FBQSxDQUFtQ0UsWUFBbkMsQ0FBaUQ3RCxZQUFqRCxDQUFnRSxDQUUvRHJNLElBQUltUSxnQkFBSixDQUFzQm5RLElBQUlvUSxZQUExQixDQUF3Q0YsWUFBeEMsRUFFQSxHQUFLN0QsYUFBYW45QyxXQUFiLEVBQTRCLENBQUVtOUMsYUFBYWw5QyxhQUFoRCxDQUFnRSxDQUUvRDZ3QyxJQUFJcVEsbUJBQUosQ0FBeUJyUSxJQUFJb1EsWUFBN0IsQ0FBMkNwUSxJQUFJcVAsaUJBQS9DLENBQWtFaEQsYUFBYTcrQyxLQUEvRSxDQUFzRjYrQyxhQUFhNStDLE1BQW5HLEVBQ0F1eUMsSUFBSXNRLHVCQUFKLENBQTZCdFEsSUFBSWdRLFdBQWpDLENBQThDaFEsSUFBSXVRLGdCQUFsRCxDQUFvRXZRLElBQUlvUSxZQUF4RSxDQUFzRkYsWUFBdEYsRUFFQSxDQUxELFFBS1k3RCxhQUFhbjlDLFdBQWIsRUFBNEJtOUMsYUFBYWw5QyxhQUE5QyxDQUE4RCxDQUVwRTZ3QyxJQUFJcVEsbUJBQUosQ0FBeUJyUSxJQUFJb1EsWUFBN0IsQ0FBMkNwUSxJQUFJMFAsYUFBL0MsQ0FBOERyRCxhQUFhNytDLEtBQTNFLENBQWtGNitDLGFBQWE1K0MsTUFBL0YsRUFDQXV5QyxJQUFJc1EsdUJBQUosQ0FBNkJ0USxJQUFJZ1EsV0FBakMsQ0FBOENoUSxJQUFJd1Esd0JBQWxELENBQTRFeFEsSUFBSW9RLFlBQWhGLENBQThGRixZQUE5RixFQUVBLENBTE0sSUFLQTtFQUdObFEsSUFBSXFRLG1CQUFKLENBQXlCclEsSUFBSW9RLFlBQTdCLENBQTJDcFEsSUFBSXlRLEtBQS9DLENBQXNEcEUsYUFBYTcrQyxLQUFuRSxDQUEwRTYrQyxhQUFhNStDLE1BQXZGLEVBRUEsQ0FFRHV5QyxJQUFJbVEsZ0JBQUosQ0FBc0JuUSxJQUFJb1EsWUFBMUIsQ0FBd0MsSUFBeEMsRUFFQSxDQUVEO0VBQ0EsMEJBQUEsQ0FBNEJSLFdBQTVCLENBQXlDdkQsWUFBekMsQ0FBd0QsQ0FFdkQsV0FBZUEsY0FBZ0JBLGFBQWExOEMsdUJBQTVDLENBQ0EsR0FBSytnRCxNQUFMLENBQWMsZUFBTSxDQUFXLHlEQUFYLENBQU4sQ0FFZDFRLElBQUkrUCxlQUFKLENBQXFCL1AsSUFBSWdRLFdBQXpCLENBQXNDSixXQUF0QyxFQUVBLEdBQUssRUFBSXZELGFBQWFqOUMsWUFBYixFQUE2Qmk5QyxhQUFhajlDLFlBQWIsQ0FBMEI0L0MsY0FBM0QsQ0FBTCxDQUFtRixDQUVsRixlQUFNLENBQVcscUVBQVgsQ0FBTixDQUVBLENBRUQ7RUFDQSxHQUFLLENBQUVqckMsV0FBVzV1QyxHQUFYLENBQWdCazNFLGFBQWFqOUMsWUFBN0IsRUFBNEN1OUMsY0FBOUMsRUFDSE4sYUFBYWo5QyxZQUFiLENBQTBCaEUsS0FBMUIsQ0FBZ0NvQyxLQUFoQyxHQUEwQzYrQyxhQUFhNytDLEtBRHBELEVBRUg2K0MsYUFBYWo5QyxZQUFiLENBQTBCaEUsS0FBMUIsQ0FBZ0NxQyxNQUFoQyxHQUEyQzQrQyxhQUFhNStDLE1BRjFELENBRW1FLENBRWxFNCtDLGFBQWFqOUMsWUFBYixDQUEwQmhFLEtBQTFCLENBQWdDb0MsS0FBaEMsQ0FBd0M2K0MsYUFBYTcrQyxLQUFyRCxDQUNBNitDLGFBQWFqOUMsWUFBYixDQUEwQmhFLEtBQTFCLENBQWdDcUMsTUFBaEMsQ0FBeUM0K0MsYUFBYTUrQyxNQUF0RCxDQUNBNCtDLGFBQWFqOUMsWUFBYixDQUEwQmdxQixXQUExQixDQUF3QyxJQUF4QyxDQUVBLENBRURvWCxhQUFjNmIsYUFBYWo5QyxZQUEzQixDQUF5QyxDQUF6QyxFQUVBLHNCQUF3QjJVLFdBQVc1dUMsR0FBWCxDQUFnQmszRSxhQUFhajlDLFlBQTdCLEVBQTRDdTlDLGNBQXBFLENBRUEsR0FBS04sYUFBYWo5QyxZQUFiLENBQTBCMUQsTUFBMUIsR0FBcUM0akQsV0FBMUMsQ0FBd0QsQ0FFdkR0UCxJQUFJaVEsb0JBQUosQ0FBMEJqUSxJQUFJZ1EsV0FBOUIsQ0FBMkNoUSxJQUFJdVEsZ0JBQS9DLENBQWlFdlEsSUFBSWlILFVBQXJFLENBQWlGMEosaUJBQWpGLENBQW9HLENBQXBHLEVBRUEsQ0FKRCxRQUlZdEUsYUFBYWo5QyxZQUFiLENBQTBCMUQsTUFBMUIsR0FBcUMrakQsa0JBQTFDLENBQStELENBRXJFelAsSUFBSWlRLG9CQUFKLENBQTBCalEsSUFBSWdRLFdBQTlCLENBQTJDaFEsSUFBSXdRLHdCQUEvQyxDQUF5RXhRLElBQUlpSCxVQUE3RSxDQUF5RjBKLGlCQUF6RixDQUE0RyxDQUE1RyxFQUVBLENBSk0sSUFJQSxDQUVOLGVBQU0sQ0FBVyw2QkFBWCxDQUFOLENBRUEsQ0FFRCxDQUVEO0VBQ0EsK0JBQUEsQ0FBaUN0RSxZQUFqQyxDQUFnRCxDQUUvQywyQkFBNkJ0b0MsV0FBVzV1QyxHQUFYLENBQWdCazNFLFlBQWhCLENBQTdCLENBRUEsV0FBZUEsYUFBYTE4Qyx1QkFBYixHQUF5QyxJQUF4RCxDQUVBLEdBQUswOEMsYUFBYWo5QyxZQUFsQixDQUFpQyxDQUVoQyxHQUFLc2hELE1BQUwsQ0FBYyxlQUFNLENBQVcsMERBQVgsQ0FBTixDQUVkRSxrQkFBbUIvRCx1QkFBdUJDLGtCQUExQyxDQUE4RFQsWUFBOUQsRUFFQSxDQU5ELElBTU8sQ0FFTixHQUFLcUUsTUFBTCxDQUFjLENBRWI3RCx1QkFBdUJFLGtCQUF2QixDQUE0QyxFQUE1QyxDQUVBLElBQU0sTUFBUSxDQUFkLENBQWlCdDdFLEVBQUksQ0FBckIsQ0FBd0JBLEdBQXhCLENBQStCLENBRTlCdXVFLElBQUkrUCxlQUFKLENBQXFCL1AsSUFBSWdRLFdBQXpCLENBQXNDbkQsdUJBQXVCQyxrQkFBdkIsQ0FBMkNyN0UsQ0FBM0MsQ0FBdEMsRUFDQW83RSx1QkFBdUJFLGtCQUF2QixDQUEyQ3Q3RSxDQUEzQyxFQUFpRHV1RSxJQUFJNlEsa0JBQUosRUFBakQsQ0FDQUMseUJBQTBCakUsdUJBQXVCRSxrQkFBdkIsQ0FBMkN0N0UsQ0FBM0MsQ0FBMUIsQ0FBMEU0NkUsWUFBMUUsRUFFQSxDQUVELENBWkQsSUFZTyxDQUVOck0sSUFBSStQLGVBQUosQ0FBcUIvUCxJQUFJZ1EsV0FBekIsQ0FBc0NuRCx1QkFBdUJDLGtCQUE3RCxFQUNBRCx1QkFBdUJFLGtCQUF2QixDQUE0Qy9NLElBQUk2USxrQkFBSixFQUE1QyxDQUNBQyx5QkFBMEJqRSx1QkFBdUJFLGtCQUFqRCxDQUFxRVYsWUFBckUsRUFFQSxDQUVELENBRURyTSxJQUFJK1AsZUFBSixDQUFxQi9QLElBQUlnUSxXQUF6QixDQUFzQyxJQUF0QyxFQUVBLENBRUQ7RUFDQSwwQkFBQSxDQUE0QjNELFlBQTVCLENBQTJDLENBRTFDLDJCQUE2QnRvQyxXQUFXNXVDLEdBQVgsQ0FBZ0JrM0UsWUFBaEIsQ0FBN0IsQ0FDQSxzQkFBd0J0b0MsV0FBVzV1QyxHQUFYLENBQWdCazNFLGFBQWFwOUMsT0FBN0IsQ0FBeEIsQ0FFQW85QyxhQUFhM3FFLGdCQUFiLENBQStCLFNBQS9CLENBQTBDNHFFLHFCQUExQyxFQUVBVixrQkFBa0JlLGNBQWxCLENBQW1DM00sSUFBSXdHLGFBQUosRUFBbkMsQ0FFQXYyRSxLQUFLZzlELE1BQUwsQ0FBWTUvQixRQUFaLEdBRUEsV0FBZWcvQyxhQUFhMThDLHVCQUFiLEdBQXlDLElBQXhELENBQ0EsdUJBQXlCcGEsYUFBYzgyRCxZQUFkLENBQXpCLENBRUE7RUFFQSxHQUFLcUUsTUFBTCxDQUFjLENBRWI3RCx1QkFBdUJDLGtCQUF2QixDQUE0QyxFQUE1QyxDQUVBLElBQU0sTUFBUSxDQUFkLENBQWlCcjdFLEVBQUksQ0FBckIsQ0FBd0JBLEdBQXhCLENBQStCLENBRTlCbzdFLHVCQUF1QkMsa0JBQXZCLENBQTJDcjdFLENBQTNDLEVBQWlEdXVFLElBQUkrUSxpQkFBSixFQUFqRCxDQUVBLENBRUQsQ0FWRCxJQVVPLENBRU5sRSx1QkFBdUJDLGtCQUF2QixDQUE0QzlNLElBQUkrUSxpQkFBSixFQUE1QyxDQUVBLENBRUQ7RUFFQSxHQUFLTCxNQUFMLENBQWMsQ0FFYnZoRixNQUFNczNFLFdBQU4sQ0FBbUJ6RyxJQUFJa0gsZ0JBQXZCLENBQXlDMEUsa0JBQWtCZSxjQUEzRCxFQUNBbUIscUJBQXNCOU4sSUFBSWtILGdCQUExQixDQUE0Q21GLGFBQWFwOUMsT0FBekQsQ0FBa0UraEQsa0JBQWxFLEVBRUEsSUFBTSxNQUFRLENBQWQsQ0FBaUJ2L0UsRUFBSSxDQUFyQixDQUF3QkEsR0FBeEIsQ0FBK0IsQ0FFOUJ3L0Usd0JBQXlCcEUsdUJBQXVCQyxrQkFBdkIsQ0FBMkNyN0UsQ0FBM0MsQ0FBekIsQ0FBeUU0NkUsWUFBekUsQ0FBdUZyTSxJQUFJa1IsaUJBQTNGLENBQThHbFIsSUFBSW1ILDJCQUFKLENBQWtDMTFFLENBQWhKLEVBRUEsQ0FFRCxHQUFLdzhFLDRCQUE2QjVCLGFBQWFwOUMsT0FBMUMsQ0FBbUQraEQsa0JBQW5ELENBQUwsQ0FBK0UsQ0FFOUVyRixlQUFnQjNMLElBQUlrSCxnQkFBcEIsQ0FBc0NtRixhQUFhcDlDLE9BQW5ELENBQTREbzlDLGFBQWE3K0MsS0FBekUsQ0FBZ0Y2K0MsYUFBYTUrQyxNQUE3RixFQUVBLENBRUR0K0IsTUFBTXMzRSxXQUFOLENBQW1CekcsSUFBSWtILGdCQUF2QixDQUF5QyxJQUF6QyxFQUVBLENBbkJELElBbUJPLENBRU4vM0UsTUFBTXMzRSxXQUFOLENBQW1CekcsSUFBSWlILFVBQXZCLENBQW1DMkUsa0JBQWtCZSxjQUFyRCxFQUNBbUIscUJBQXNCOU4sSUFBSWlILFVBQTFCLENBQXNDb0YsYUFBYXA5QyxPQUFuRCxDQUE0RCtoRCxrQkFBNUQsRUFDQUMsd0JBQXlCcEUsdUJBQXVCQyxrQkFBaEQsQ0FBb0VULFlBQXBFLENBQWtGck0sSUFBSWtSLGlCQUF0RixDQUF5R2xSLElBQUlpSCxVQUE3RyxFQUVBLEdBQUtnSCw0QkFBNkI1QixhQUFhcDlDLE9BQTFDLENBQW1EK2hELGtCQUFuRCxDQUFMLENBQStFLENBRTlFckYsZUFBZ0IzTCxJQUFJaUgsVUFBcEIsQ0FBZ0NvRixhQUFhcDlDLE9BQTdDLENBQXNEbzlDLGFBQWE3K0MsS0FBbkUsQ0FBMEU2K0MsYUFBYTUrQyxNQUF2RixFQUVBLENBRUR0K0IsTUFBTXMzRSxXQUFOLENBQW1CekcsSUFBSWlILFVBQXZCLENBQW1DLElBQW5DLEVBRUEsQ0FFRDtFQUVBLEdBQUtvRixhQUFhbjlDLFdBQWxCLENBQWdDLENBRS9CaWlELHVCQUF3QjlFLFlBQXhCLEVBRUEsQ0FFRCxDQUVELGlDQUFBLENBQW1DQSxZQUFuQyxDQUFrRCxDQUVqRCxZQUFjQSxhQUFhcDlDLE9BQTNCLENBQ0EsdUJBQXlCMVosYUFBYzgyRCxZQUFkLENBQXpCLENBRUEsR0FBSzRCLDRCQUE2QmgvQyxPQUE3QixDQUFzQytoRCxrQkFBdEMsQ0FBTCxDQUFrRSxDQUVqRSxXQUFhM0UsYUFBYTE4Qyx1QkFBYixDQUF1Q3F3QyxJQUFJa0gsZ0JBQTNDLENBQThEbEgsSUFBSWlILFVBQS9FLENBQ0EsaUJBQW1CbGpDLFdBQVc1dUMsR0FBWCxDQUFnQjg1QixPQUFoQixFQUEwQjA5QyxjQUE3QyxDQUVBeDlFLE1BQU1zM0UsV0FBTixDQUFtQnB2RSxNQUFuQixDQUEyQjB6RSxZQUEzQixFQUNBWSxlQUFnQnQwRSxNQUFoQixDQUF3QjQzQixPQUF4QixDQUFpQ285QyxhQUFhNytDLEtBQTlDLENBQXFENitDLGFBQWE1K0MsTUFBbEUsRUFDQXQrQixNQUFNczNFLFdBQU4sQ0FBbUJwdkUsTUFBbkIsQ0FBMkIsSUFBM0IsRUFFQSxDQUVELENBRUQsMkJBQUEsQ0FBNkI0M0IsT0FBN0IsQ0FBdUMsQ0FFdEMsT0FBU0EsUUFBUTUxQixFQUFqQixDQUNBLFVBQVlwSixLQUFLKzRELE1BQUwsQ0FBWTBFLEtBQXhCLENBRUE7RUFFQSxHQUFLMGpCLGVBQWdCLzNFLEVBQWhCLElBQXlCcTBELEtBQTlCLENBQXNDLENBRXJDMGpCLGVBQWdCLzNFLEVBQWhCLEVBQXVCcTBELEtBQXZCLENBQ0F6K0IsUUFBUTdKLE1BQVIsR0FFQSxDQUVELENBRUQsS0FBS29yQyxZQUFMLENBQW9CQSxZQUFwQixDQUNBLEtBQUtFLGNBQUwsQ0FBc0JBLGNBQXRCLENBQ0EsS0FBSzJnQixxQkFBTCxDQUE2QkEscUJBQTdCLENBQ0EsS0FBS0MsaUJBQUwsQ0FBeUJBLGlCQUF6QixDQUNBLEtBQUtDLHdCQUFMLENBQWdDQSx3QkFBaEMsQ0FFQSxDQUVEOztLQUlBLG1CQUFBLENBQXFCbHFDLEVBQXJCLENBQXlCeDJCLFVBQXpCLENBQXNDLENBRXJDLGdCQUFBLENBQWtCdkIsQ0FBbEIsQ0FBc0IsQ0FFckIsYUFBQSxDQUVBLEdBQUtBLElBQU1raUUsY0FBWCxDQUE0QixVQUFVQyxNQUFWLENBQzVCLEdBQUtuaUUsSUFBTTZjLG1CQUFYLENBQWlDLFVBQVVraUQsYUFBVixDQUNqQyxHQUFLLytELElBQU1vaUUsc0JBQVgsQ0FBb0MsVUFBVUMsZUFBVixDQUVwQyxHQUFLcmlFLElBQU1zZ0IsYUFBWCxDQUEyQixVQUFVZzNDLE9BQVYsQ0FDM0IsR0FBS3QzRCxJQUFNeThELDBCQUFYLENBQXdDLFVBQVU2RixzQkFBVixDQUN4QyxHQUFLdGlFLElBQU0wOEQseUJBQVgsQ0FBdUMsVUFBVTZGLHFCQUFWLENBRXZDLEdBQUt2aUUsSUFBTThjLFlBQVgsQ0FBMEIsVUFBVTYvQyxNQUFWLENBQzFCLEdBQUszOEQsSUFBTXdpRSx5QkFBWCxDQUF1QyxVQUFVQyxxQkFBVixDQUN2QyxHQUFLemlFLElBQU0rYyx3QkFBWCxDQUFzQyxVQUFVMmxELG9CQUFWLENBRXRDLEdBQUsxaUUsSUFBTWlkLGdCQUFYLENBQThCLFVBQVUrYixhQUFWLENBQzlCLEdBQUtoNUIsSUFBTTJpRSxxQkFBWCxDQUFtQyxVQUFVQyxzQkFBVixDQUNuQyxHQUFLNWlFLElBQU02aUUscUJBQVgsQ0FBbUMsVUFBVUMsc0JBQVYsQ0FDbkMsR0FBSzlpRSxJQUFNK2lFLG9CQUFYLENBQWtDLFVBQVVDLG9CQUFWLENBRWxDLEdBQUtoakUsSUFBTWlqRSxRQUFYLENBQXNCLFVBQVVscUMsSUFBVixDQUN0QixHQUFLLzRCLElBQU1rakUsU0FBWCxDQUF1QixVQUFVdHFDLEtBQVYsQ0FDdkIsR0FBSzU0QixJQUFNaWdFLGlCQUFYLENBQStCLFVBQVV0bkMsY0FBVixDQUMvQixHQUFLMzRCLElBQU1takUsT0FBWCxDQUFxQixVQUFVcnFDLEdBQVYsQ0FDckIsR0FBSzk0QixJQUFNa2dFLGVBQVgsQ0FBNkIsVUFBVXJuQyxZQUFWLENBQzdCLEdBQUs3NEIsSUFBTWkvRCxTQUFYLENBQXVCLFVBQVV2bUMsS0FBVixDQUV2QixHQUFLMTRCLElBQU1rL0QsYUFBWCxDQUEyQixDQUUxQng5RCxVQUFZSCxXQUFXMWIsR0FBWCxDQUFnQix3QkFBaEIsQ0FBWixDQUVBLEdBQUs2YixZQUFjLElBQW5CLENBQTBCLGlCQUFpQjBoRSxjQUFqQixDQUUxQixDQUVELEdBQUtwakUsSUFBTXFqRSxXQUFYLENBQXlCLFVBQVVDLEtBQVYsQ0FDekIsR0FBS3RqRSxJQUFNMCtELFNBQVgsQ0FBdUIsVUFBVTZFLEdBQVYsQ0FDdkIsR0FBS3ZqRSxJQUFNZ2QsVUFBWCxDQUF3QixVQUFVeTZDLElBQVYsQ0FDeEIsR0FBS3ozRCxJQUFNd2pFLGVBQVgsQ0FBNkIsVUFBVUMsU0FBVixDQUM3QixHQUFLempFLElBQU0wakUsb0JBQVgsQ0FBa0MsVUFBVUMsZUFBVixDQUNsQyxHQUFLM2pFLElBQU1nZ0UsV0FBWCxDQUF5QixVQUFVTCxlQUFWLENBQ3pCLEdBQUszL0QsSUFBTW1nRSxrQkFBWCxDQUFnQyxVQUFVQyxhQUFWLENBRWhDLEdBQUtwZ0UsSUFBTTJ0QyxXQUFYLENBQXlCLFVBQVV1ckIsUUFBVixDQUN6QixHQUFLbDVELElBQU00akUsZ0JBQVgsQ0FBOEIsVUFBVUMsYUFBVixDQUM5QixHQUFLN2pFLElBQU04akUsdUJBQVgsQ0FBcUMsVUFBVUMscUJBQVYsQ0FFckMsR0FBSy9qRSxJQUFNZ2tFLFVBQVgsQ0FBd0IsVUFBVXpLLElBQVYsQ0FDeEIsR0FBS3Y1RCxJQUFNaWtFLFNBQVgsQ0FBdUIsVUFBVTdLLEdBQVYsQ0FDdkIsR0FBS3A1RCxJQUFNa2tFLGNBQVgsQ0FBNEIsVUFBVXhLLFNBQVYsQ0FDNUIsR0FBSzE1RCxJQUFNbWtFLHNCQUFYLENBQW9DLFVBQVUzSyxtQkFBVixDQUNwQyxHQUFLeDVELElBQU11dEMsY0FBWCxDQUE0QixVQUFVK3JCLFNBQVYsQ0FDNUIsR0FBS3Q1RCxJQUFNeXRDLHNCQUFYLENBQW9DLFVBQVVnc0IsbUJBQVYsQ0FDcEMsR0FBS3o1RCxJQUFNb2tFLGNBQVgsQ0FBNEIsVUFBVUMsU0FBVixDQUM1QixHQUFLcmtFLElBQU1za0Usc0JBQVgsQ0FBb0MsVUFBVUMsbUJBQVYsQ0FFcEMsR0FBS3ZrRSxJQUFNd2tFLGNBQVgsQ0FBNEIsVUFBVUMsU0FBVixDQUM1QixHQUFLemtFLElBQU0wa0Usc0JBQVgsQ0FBb0MsVUFBVUMsbUJBQVYsQ0FDcEMsR0FBSzNrRSxJQUFNNGtFLHNCQUFYLENBQW9DLFVBQVVDLGtCQUFWLENBRXBDLEdBQUs3a0UsSUFBTThrRSxvQkFBTixFQUE4QjlrRSxJQUFNK2tFLHFCQUFwQyxFQUNKL2tFLElBQU1nbEUscUJBREYsRUFDMkJobEUsSUFBTWlsRSxxQkFEdEMsQ0FDOEQsQ0FFN0R2akUsVUFBWUgsV0FBVzFiLEdBQVgsQ0FBZ0IsK0JBQWhCLENBQVosQ0FFQSxHQUFLNmIsWUFBYyxJQUFuQixDQUEwQixDQUV6QixHQUFLMUIsSUFBTThrRSxvQkFBWCxDQUFrQyxpQkFBaUJJLDRCQUFqQixDQUNsQyxHQUFLbGxFLElBQU0ra0UscUJBQVgsQ0FBbUMsaUJBQWlCSSw2QkFBakIsQ0FDbkMsR0FBS25sRSxJQUFNZ2xFLHFCQUFYLENBQW1DLGlCQUFpQkksNkJBQWpCLENBQ25DLEdBQUtwbEUsSUFBTWlsRSxxQkFBWCxDQUFtQyxpQkFBaUJJLDZCQUFqQixDQUVuQyxDQUVELENBRUQsR0FBS3JsRSxJQUFNc2xFLHVCQUFOLEVBQWlDdGxFLElBQU11bEUsdUJBQXZDLEVBQ0p2bEUsSUFBTXdsRSx3QkFERixFQUM4QnhsRSxJQUFNeWxFLHdCQUR6QyxDQUNvRSxDQUVuRS9qRSxVQUFZSCxXQUFXMWIsR0FBWCxDQUFnQixnQ0FBaEIsQ0FBWixDQUVBLEdBQUs2YixZQUFjLElBQW5CLENBQTBCLENBRXpCLEdBQUsxQixJQUFNc2xFLHVCQUFYLENBQXFDLGlCQUFpQkksK0JBQWpCLENBQ3JDLEdBQUsxbEUsSUFBTXVsRSx1QkFBWCxDQUFxQyxpQkFBaUJJLCtCQUFqQixDQUNyQyxHQUFLM2xFLElBQU13bEUsd0JBQVgsQ0FBc0MsaUJBQWlCSSxnQ0FBakIsQ0FDdEMsR0FBSzVsRSxJQUFNeWxFLHdCQUFYLENBQXNDLGlCQUFpQkksZ0NBQWpCLENBRXRDLENBRUQsQ0FFRCxHQUFLN2xFLElBQU04bEUsZUFBWCxDQUE2QixDQUU1QnBrRSxVQUFZSCxXQUFXMWIsR0FBWCxDQUFnQiwrQkFBaEIsQ0FBWixDQUVBLEdBQUs2YixZQUFjLElBQW5CLENBQTBCLGlCQUFpQnFrRSx5QkFBakIsQ0FFMUIsQ0FFRCxHQUFLL2xFLElBQU1nbUUsb0JBQU4sRUFBOEJobUUsSUFBTWltRSxvQkFBcEMsRUFBNERqbUUsSUFBTWttRSxvQkFBbEUsRUFDSmxtRSxJQUFNbW1FLG9CQURGLEVBQzBCbm1FLElBQU1vbUUsb0JBRGhDLEVBQ3dEcG1FLElBQU1xbUUsb0JBRDlELEVBRUpybUUsSUFBTXNtRSxvQkFGRixFQUUwQnRtRSxJQUFNdW1FLG9CQUZoQyxFQUV3RHZtRSxJQUFNd21FLHFCQUY5RCxFQUdKeG1FLElBQU15bUUscUJBSEYsRUFHMkJ6bUUsSUFBTTBtRSxxQkFIakMsRUFHMEQxbUUsSUFBTTJtRSxzQkFIaEUsRUFJSjNtRSxJQUFNNG1FLHNCQUpGLEVBSTRCNW1FLElBQU02bUUsc0JBSnZDLENBSWdFLENBRS9EbmxFLFVBQVlILFdBQVcxYixHQUFYLENBQWdCLCtCQUFoQixDQUFaLENBRUEsR0FBSzZiLFlBQWMsSUFBbkIsQ0FBMEIsQ0FFekIsUUFBQSxDQUVBLENBRUQsQ0FFRCxHQUFLMUIsSUFBTThtRSxXQUFOLEVBQXFCOW1FLElBQU0rbUUsV0FBaEMsQ0FBOEMsQ0FFN0NybEUsVUFBWUgsV0FBVzFiLEdBQVgsQ0FBZ0Isa0JBQWhCLENBQVosQ0FFQSxHQUFLNmIsWUFBYyxJQUFuQixDQUEwQixDQUV6QixHQUFLMUIsSUFBTThtRSxXQUFYLENBQXlCLGlCQUFpQkUsT0FBakIsQ0FDekIsR0FBS2huRSxJQUFNK21FLFdBQVgsQ0FBeUIsaUJBQWlCRSxPQUFqQixDQUV6QixDQUVELENBRUQsR0FBS2puRSxJQUFNcWdFLGtCQUFYLENBQWdDLENBRS9CMytELFVBQVlILFdBQVcxYixHQUFYLENBQWdCLHFCQUFoQixDQUFaLENBRUEsR0FBSzZiLFlBQWMsSUFBbkIsQ0FBMEIsaUJBQWlCd2xFLHVCQUFqQixDQUUxQixDQUVELFFBQUEsQ0FFQSxDQUVELE9BQU8sQ0FBRWpOLFFBQVNBLE9BQVgsQ0FBUCxDQUVBLENBRUQ7Ozs7O0tBT0EsMEJBQUEsQ0FBNEJrTixHQUE1QixDQUFpQ0MsTUFBakMsQ0FBeUNwekQsSUFBekMsQ0FBK0NDLEdBQS9DLENBQXFELENBRXBEMHFCLE9BQU81aEQsSUFBUCxDQUFhLElBQWIsRUFFQSxLQUFLRCxJQUFMLENBQVksbUJBQVosQ0FFQSxLQUFLcXFGLEdBQUwsQ0FBV0EsTUFBUTFtRixTQUFSLENBQW9CMG1GLEdBQXBCLENBQTBCLEVBQXJDLENBQ0EsS0FBS3ZvQyxJQUFMLENBQVksQ0FBWixDQUVBLEtBQUs1cUIsSUFBTCxDQUFZQSxPQUFTdnpCLFNBQVQsQ0FBcUJ1ekIsSUFBckIsQ0FBNEIsR0FBeEMsQ0FDQSxLQUFLQyxHQUFMLENBQVdBLE1BQVF4ekIsU0FBUixDQUFvQnd6QixHQUFwQixDQUEwQixJQUFyQyxDQUNBLEtBQUtvekQsS0FBTCxDQUFhLEVBQWIsQ0FFQSxLQUFLRCxNQUFMLENBQWNBLFNBQVczbUYsU0FBWCxDQUF1QjJtRixNQUF2QixDQUFnQyxDQUE5QyxDQUNBLEtBQUt2b0MsSUFBTCxDQUFZLElBQVosQ0FFQSxLQUFLeW9DLFNBQUwsQ0FBaUIsRUFBakIsQ0FBcUI7RUFDckIsS0FBS0MsVUFBTCxDQUFrQixDQUFsQixDQUFxQjtFQUVyQixLQUFLem9DLHNCQUFMLEdBRUEsQ0FFRDBvQyxrQkFBa0Juc0YsU0FBbEIsQ0FBOEJELE9BQU80bkIsTUFBUCxDQUFlNW5CLE9BQU9pQixNQUFQLENBQWVzaUQsT0FBT3RqRCxTQUF0QixDQUFmLENBQWtELENBRS9Fc0MsWUFBYTZwRixpQkFGa0UsQ0FJL0VDLG9CQUFxQixJQUowRCxDQU0vRTFnRSxLQUFNLFNBQVc1ZixNQUFYLENBQW1CcTNDLFNBQW5CLENBQStCLENBRXBDRyxPQUFPdGpELFNBQVAsQ0FBaUIwckIsSUFBakIsQ0FBc0JocUIsSUFBdEIsQ0FBNEIsSUFBNUIsQ0FBa0NvSyxNQUFsQyxDQUEwQ3EzQyxTQUExQyxFQUVBLEtBQUsyb0MsR0FBTCxDQUFXaGdGLE9BQU9nZ0YsR0FBbEIsQ0FDQSxLQUFLdm9DLElBQUwsQ0FBWXozQyxPQUFPeTNDLElBQW5CLENBRUEsS0FBSzVxQixJQUFMLENBQVk3c0IsT0FBTzZzQixJQUFuQixDQUNBLEtBQUtDLEdBQUwsQ0FBVzlzQixPQUFPOHNCLEdBQWxCLENBQ0EsS0FBS296RCxLQUFMLENBQWFsZ0YsT0FBT2tnRixLQUFwQixDQUVBLEtBQUtELE1BQUwsQ0FBY2pnRixPQUFPaWdGLE1BQXJCLENBQ0EsS0FBS3ZvQyxJQUFMLENBQVkxM0MsT0FBTzAzQyxJQUFQLEdBQWdCLElBQWhCLENBQXVCLElBQXZCLENBQThCempELE9BQU80bkIsTUFBUCxDQUFlLEVBQWYsQ0FBbUI3YixPQUFPMDNDLElBQTFCLENBQTFDLENBRUEsS0FBS3lvQyxTQUFMLENBQWlCbmdGLE9BQU9tZ0YsU0FBeEIsQ0FDQSxLQUFLQyxVQUFMLENBQWtCcGdGLE9BQU9vZ0YsVUFBekIsQ0FFQSxXQUFBLENBRUEsQ0F6QjhFOzs7Ozs7O01BbUMvRUcsZUFBZ0IsU0FBV0MsV0FBWCxDQUF5QjtFQUd4QyxpQkFBbUIsSUFBTSxLQUFLQyxhQUFMLEVBQU4sQ0FBNkJELFdBQWhELENBRUEsS0FBS1IsR0FBTCxDQUFXcmhFLE1BQU05QixPQUFOLENBQWdCLENBQWhCLENBQW9CaGdCLEtBQUs2akYsSUFBTCxDQUFXQyxZQUFYLENBQS9CLENBQ0EsS0FBS2hwQyxzQkFBTCxHQUVBLENBM0M4RTs7TUFnRC9FaXBDLGVBQWdCLFVBQVksQ0FFM0IsaUJBQW1CL2pGLEtBQUtna0YsR0FBTCxDQUFVbGlFLE1BQU1oQyxPQUFOLENBQWdCLEdBQWhCLENBQXNCLEtBQUtxakUsR0FBckMsQ0FBbkIsQ0FFQSxXQUFhLEtBQUtTLGFBQUwsRUFBTixDQUE2QkUsWUFBcEMsQ0FFQSxDQXREOEUsQ0F3RC9FRyxnQkFBaUIsVUFBWSxDQUU1QixhQUFhamtFLE9BQU4sQ0FBZ0IsQ0FBaEIsQ0FBb0JoZ0IsS0FBSzZqRixJQUFMLENBQzFCN2pGLEtBQUtna0YsR0FBTCxDQUFVbGlFLE1BQU1oQyxPQUFOLENBQWdCLEdBQWhCLENBQXNCLEtBQUtxakUsR0FBckMsRUFBNkMsS0FBS3ZvQyxJQUR4QixDQUEzQixDQUdBLENBN0Q4RSxDQStEL0VzcEMsYUFBYyxVQUFZO0VBR3pCLFlBQVlaLFNBQUwsQ0FBaUJ0akYsS0FBSzZFLEdBQUwsQ0FBVSxLQUFLdStFLE1BQWYsQ0FBdUIsQ0FBdkIsQ0FBeEIsQ0FFQSxDQXBFOEUsQ0FzRS9FUSxjQUFlLFVBQVk7RUFHMUIsWUFBWU4sU0FBTCxDQUFpQnRqRixLQUFLOEUsR0FBTCxDQUFVLEtBQUtzK0UsTUFBZixDQUF1QixDQUF2QixDQUF4QixDQUVBLENBM0U4RTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztNQWdIL0Vub0MsY0FBZSxTQUFXQyxTQUFYLENBQXNCQyxVQUF0QixDQUFrQ3pxQyxDQUFsQyxDQUFxQ3dRLENBQXJDLENBQXdDZ1osS0FBeEMsQ0FBK0NDLE1BQS9DLENBQXdELENBRXRFLEtBQUtpcEQsTUFBTCxDQUFjbG9DLFVBQVlDLFVBQTFCLENBRUEsR0FBSyxLQUFLTixJQUFMLEdBQWMsSUFBbkIsQ0FBMEIsQ0FFekIsS0FBS0EsSUFBTCxDQUFZLENBQ1hPLFFBQVMsSUFERSxDQUVYRixVQUFXLENBRkEsQ0FHWEMsV0FBWSxDQUhELENBSVhFLFFBQVMsQ0FKRSxDQUtYQyxRQUFTLENBTEUsQ0FNWHBoQixNQUFPLENBTkksQ0FPWEMsT0FBUSxDQVBHLENBQVosQ0FVQSxDQUVELEtBQUswZ0IsSUFBTCxDQUFVTyxPQUFWLENBQW9CLElBQXBCLENBQ0EsS0FBS1AsSUFBTCxDQUFVSyxTQUFWLENBQXNCQSxTQUF0QixDQUNBLEtBQUtMLElBQUwsQ0FBVU0sVUFBVixDQUF1QkEsVUFBdkIsQ0FDQSxLQUFLTixJQUFMLENBQVVRLE9BQVYsQ0FBb0IzcUMsQ0FBcEIsQ0FDQSxLQUFLbXFDLElBQUwsQ0FBVVMsT0FBVixDQUFvQnA2QixDQUFwQixDQUNBLEtBQUsyNUIsSUFBTCxDQUFVM2dCLEtBQVYsQ0FBa0JBLEtBQWxCLENBQ0EsS0FBSzJnQixJQUFMLENBQVUxZ0IsTUFBVixDQUFtQkEsTUFBbkIsQ0FFQSxLQUFLMmdCLHNCQUFMLEdBRUEsQ0E1SThFLENBOEkvRVMsZ0JBQWlCLFVBQVksQ0FFNUIsR0FBSyxLQUFLVixJQUFMLEdBQWMsSUFBbkIsQ0FBMEIsQ0FFekIsS0FBS0EsSUFBTCxDQUFVTyxPQUFWLENBQW9CLEtBQXBCLENBRUEsQ0FFRCxLQUFLTixzQkFBTCxHQUVBLENBeEo4RSxDQTBKL0VBLHVCQUF3QixVQUFZLENBRW5DLFNBQVcsS0FBSzlxQixJQUFoQixDQUNDRixJQUFNRSxLQUFPaHdCLEtBQUtna0YsR0FBTCxDQUNabGlFLE1BQU1oQyxPQUFOLENBQWdCLEdBQWhCLENBQXNCLEtBQUtxakUsR0FEZixDQUFQLENBQzhCLEtBQUt2b0MsSUFGMUMsQ0FHQ3pnQixPQUFTLEVBQUlySyxHQUhkLENBSUNvSyxNQUFRLEtBQUtrcEQsTUFBTCxDQUFjanBELE1BSnZCLENBS0N2SyxLQUFPLENBQUUsR0FBRixDQUFRc0ssS0FMaEIsQ0FNQzJnQixLQUFPLEtBQUtBLElBTmIsQ0FRQSxHQUFLLEtBQUtBLElBQUwsR0FBYyxJQUFkLEVBQXNCLEtBQUtBLElBQUwsQ0FBVU8sT0FBckMsQ0FBK0MsQ0FFOUMsY0FBZ0JQLEtBQUtLLFNBQXJCLENBQ0NDLFdBQWFOLEtBQUtNLFVBRG5CLENBR0F2ckIsTUFBUWlyQixLQUFLUSxPQUFMLENBQWVuaEIsS0FBZixDQUF1QmdoQixTQUEvQixDQUNBcHJCLEtBQU8rcUIsS0FBS1MsT0FBTCxDQUFlbmhCLE1BQWYsQ0FBd0JnaEIsVUFBL0IsQ0FDQWpoQixPQUFTMmdCLEtBQUszZ0IsS0FBTCxDQUFhZ2hCLFNBQXRCLENBQ0EvZ0IsUUFBVTBnQixLQUFLMWdCLE1BQUwsQ0FBY2doQixVQUF4QixDQUVBLENBRUQsU0FBVyxLQUFLb29DLFVBQWhCLENBQ0EsR0FBS1ksT0FBUyxDQUFkLENBQWtCdjBELE1BQVFJLEtBQU9tMEQsSUFBUCxDQUFjLEtBQUtELFlBQUwsRUFBdEIsQ0FFbEIsS0FBSzF1RCxnQkFBTCxDQUFzQjdGLGVBQXRCLENBQXVDQyxJQUF2QyxDQUE2Q0EsS0FBT3NLLEtBQXBELENBQTJEcEssR0FBM0QsQ0FBZ0VBLElBQU1xSyxNQUF0RSxDQUE4RW5LLElBQTlFLENBQW9GLEtBQUtDLEdBQXpGLEVBRUEsQ0FyTDhFLENBdUwvRTRKLE9BQVEsU0FBV2pqQixJQUFYLENBQWtCLENBRXpCLFNBQVdrZ0MsU0FBU3ovQyxTQUFULENBQW1Cd2lDLE1BQW5CLENBQTBCOWdDLElBQTFCLENBQWdDLElBQWhDLENBQXNDNmQsSUFBdEMsQ0FBWCxDQUVBcEosS0FBSzdQLE1BQUwsQ0FBWXdsRixHQUFaLENBQWtCLEtBQUtBLEdBQXZCLENBQ0EzMUUsS0FBSzdQLE1BQUwsQ0FBWWk5QyxJQUFaLENBQW1CLEtBQUtBLElBQXhCLENBRUFwdEMsS0FBSzdQLE1BQUwsQ0FBWXF5QixJQUFaLENBQW1CLEtBQUtBLElBQXhCLENBQ0F4aUIsS0FBSzdQLE1BQUwsQ0FBWXN5QixHQUFaLENBQWtCLEtBQUtBLEdBQXZCLENBQ0F6aUIsS0FBSzdQLE1BQUwsQ0FBWTBsRixLQUFaLENBQW9CLEtBQUtBLEtBQXpCLENBRUE3MUUsS0FBSzdQLE1BQUwsQ0FBWXlsRixNQUFaLENBQXFCLEtBQUtBLE1BQTFCLENBRUEsR0FBSyxLQUFLdm9DLElBQUwsR0FBYyxJQUFuQixDQUEwQnJ0QyxLQUFLN1AsTUFBTCxDQUFZazlDLElBQVosQ0FBbUJ6akQsT0FBTzRuQixNQUFQLENBQWUsRUFBZixDQUFtQixLQUFLNjdCLElBQXhCLENBQW5CLENBRTFCcnRDLEtBQUs3UCxNQUFMLENBQVkybEYsU0FBWixDQUF3QixLQUFLQSxTQUE3QixDQUNBOTFFLEtBQUs3UCxNQUFMLENBQVk0bEYsVUFBWixDQUF5QixLQUFLQSxVQUE5QixDQUVBLFdBQUEsQ0FFQSxDQTNNOEUsQ0FBbEQsQ0FBOUIsQ0ErTUE7O0tBSUEsb0JBQUEsQ0FBc0JybEUsS0FBdEIsQ0FBOEIsQ0FFN0JzbEUsa0JBQWtCenFGLElBQWxCLENBQXdCLElBQXhCLEVBRUEsS0FBS3FyRixPQUFMLENBQWVsbUUsT0FBUyxFQUF4QixDQUVBLENBRURtbUUsWUFBWWh0RixTQUFaLENBQXdCRCxPQUFPNG5CLE1BQVAsQ0FBZTVuQixPQUFPaUIsTUFBUCxDQUFlbXJGLGtCQUFrQm5zRixTQUFqQyxDQUFmLENBQTZELENBRXBGc0MsWUFBYTBxRixXQUZ1RSxDQUlwRkMsY0FBZSxJQUpxRSxDQUE3RCxDQUF4QixDQVFBOztLQUlBLHFCQUFBLENBQXVCandCLFFBQXZCLENBQWtDLENBRWpDLFVBQVksSUFBWixDQUVBLFdBQWEsSUFBYixDQUNBLGNBQWdCLElBQWhCLENBRUEsZUFBaUIsSUFBakIsQ0FFQSxtQkFBcUIsV0FBQSxFQUFyQixDQUNBLDBCQUE0QixXQUFBLEVBQTVCLENBRUEsR0FBSyxhQUFBLEdBQWtCLFdBQWxCLEVBQWlDLHNCQUF0QyxDQUFnRSxDQUUvRGt3QixVQUFZLFdBQVdDLFdBQVgsRUFBWixDQUNBempGLE9BQU9xTixnQkFBUCxDQUF5Qix3QkFBekIsQ0FBbURxMkUsd0JBQW5ELENBQTZFLEtBQTdFLEVBRUEsQ0FFRCx1QkFBeUIsV0FBQSxFQUF6QixDQUNBLG1CQUFxQixjQUFBLEVBQXJCLENBQ0EsaUJBQW1CLFdBQUEsRUFBbkIsQ0FFQSxZQUFjLHFCQUFBLEVBQWQsQ0FDQUMsUUFBUUMsTUFBUixDQUFpQixXQUFBLENBQWEsR0FBYixDQUFrQixHQUFsQixDQUF1QixHQUF2QixDQUE0QixHQUE1QixDQUFqQixDQUNBRCxRQUFRL3RDLE1BQVIsQ0FBZUYsTUFBZixDQUF1QixDQUF2QixFQUVBLFlBQWMscUJBQUEsRUFBZCxDQUNBbXVDLFFBQVFELE1BQVIsQ0FBaUIsV0FBQSxDQUFhLEdBQWIsQ0FBa0IsR0FBbEIsQ0FBdUIsR0FBdkIsQ0FBNEIsR0FBNUIsQ0FBakIsQ0FDQUMsUUFBUWp1QyxNQUFSLENBQWVGLE1BQWYsQ0FBdUIsQ0FBdkIsRUFFQSxhQUFlLGVBQUEsQ0FBaUIsQ0FBRWl1QyxPQUFGLENBQVdFLE9BQVgsQ0FBakIsQ0FBZixDQUNBQyxTQUFTbHVDLE1BQVQsQ0FBZ0JGLE1BQWhCLENBQXdCLENBQXhCLEVBQ0FvdUMsU0FBU2x1QyxNQUFULENBQWdCRixNQUFoQixDQUF3QixDQUF4QixFQUVBO0VBRUEscUJBQUEsRUFBd0IsQ0FFdkIsZ0JBQWtCLElBQVgsRUFBbUJxdUMsT0FBT0MsWUFBUCxHQUF3QixJQUFsRCxDQUVBLENBRUQsZUFBQSxDQUFpQkMsaUJBQWpCLENBRUEsaUNBQUEsRUFBb0MsQ0FFbkMsR0FBS0QsY0FBTCxDQUFzQixDQUVyQixrQkFBb0JELE9BQU9HLGdCQUFQLENBQXlCLE1BQXpCLENBQXBCLENBQ0EsZ0JBQWtCQyxjQUFjQyxXQUFoQyxDQUNBLGlCQUFtQkQsY0FBY0UsWUFBakMsQ0FFQUosa0JBQW9CM3dCLFNBQVNneEIsYUFBVCxFQUFwQixDQUNBQyxZQUFjanhCLFNBQVNwMkIsT0FBVCxFQUFkLENBRUFvMkIsU0FBU2t4QixvQkFBVCxDQUErQkosWUFBYyxDQUE3QyxDQUFnREMsWUFBaEQsQ0FBOEQsQ0FBOUQsRUFFQSxDQVhELFFBV1k3bUQsTUFBTTZjLE9BQVgsQ0FBcUIsQ0FFM0JpWixTQUFTa3hCLG9CQUFULENBQStCRCxZQUFZcHJELEtBQTNDLENBQWtEb3JELFlBQVluckQsTUFBOUQsQ0FBc0U2cUQsaUJBQXRFLEVBRUEsQ0FFRCxDQUVEO0VBRUEsS0FBSzVwQyxPQUFMLENBQWUsS0FBZixDQUNBLEtBQUtvcUMsVUFBTCxDQUFrQixHQUFsQixDQUVBLEtBQUtDLFNBQUwsQ0FBaUIsVUFBWSxDQUU1QixhQUFBLENBRUEsQ0FKRCxDQU1BLEtBQUtDLFNBQUwsQ0FBaUIsU0FBVzVxRixLQUFYLENBQW1CLENBRW5DLEdBQUtBLFFBQVUyQixTQUFmLENBQTJCcW9GLE9BQVNocUYsS0FBVCxDQUUzQixDQUpELENBTUEsS0FBSzZxRixhQUFMLENBQXFCLFNBQVdob0YsTUFBWCxDQUFvQixDQUV4QyxHQUFLQSxTQUFXbEIsU0FBaEIsQ0FBNEJtcEYsV0FBYWpvRixNQUFiLENBRTVCLENBSkQsQ0FNQSxLQUFLa29GLFNBQUwsQ0FBaUIsU0FBV3R3RCxNQUFYLENBQW9CLENBRXBDLEdBQUt1dkQsU0FBVyxJQUFoQixDQUF1QixhQUFBLENBRXZCQSxPQUFPZ0IsU0FBUCxDQUFtQnZ3RCxPQUFPdkYsSUFBMUIsQ0FDQTgwRCxPQUFPaUIsUUFBUCxDQUFrQnh3RCxPQUFPdEYsR0FBekIsQ0FFQTYwRCxPQUFPa0IsWUFBUCxDQUFxQnpCLFNBQXJCLEVBRUE7RUFFQSxvQkFBc0JPLE9BQU9tQixlQUE3QixDQUVBLEdBQUtBLGVBQUwsQ0FBdUIsQ0FFdEJDLGVBQWUxZ0UsU0FBZixDQUEwQnlnRSxnQkFBZ0JFLDBCQUExQyxFQUVBLENBSkQsSUFJTyxDQUVORCxlQUFlLzNELGVBQWYsQ0FBZ0MsQ0FBaEMsQ0FBbUNvUSxNQUFNaW5ELFVBQXpDLENBQXFELENBQXJELEVBRUEsQ0FHRCxTQUFXakIsVUFBVTZCLElBQXJCLENBQ0EsZUFBaUJSLGFBQWUsSUFBZixDQUFzQkEsVUFBdEIsQ0FBbUNyd0QsTUFBcEQsQ0FFQTtFQUNBOHdELFdBQVdqM0QsTUFBWCxDQUFrQnJNLElBQWxCLENBQXdCbWpFLGNBQXhCLEVBQ0FHLFdBQVdqM0QsTUFBWCxDQUFrQkgsU0FBbEIsQ0FBNkJvM0QsV0FBV3QzRCxRQUF4QyxDQUFrRHMzRCxXQUFXcjNELFVBQTdELENBQXlFcTNELFdBQVd2NEQsS0FBcEYsRUFFQSxHQUFLczRELEtBQUtFLFdBQUwsR0FBcUIsSUFBMUIsQ0FBaUMsQ0FFaENDLGVBQWUvZ0UsU0FBZixDQUEwQjRnRSxLQUFLRSxXQUEvQixFQUNBRCxXQUFXcjNELFVBQVgsQ0FBc0J4TCxRQUF0QixDQUFnQytpRSxjQUFoQyxFQUVBLENBRUQsR0FBS0gsS0FBS3IzRCxRQUFMLEdBQWtCLElBQXZCLENBQThCLENBRTdCdzNELGVBQWU3MkQscUJBQWYsQ0FBc0N3MkQsY0FBdEMsRUFDQU0sYUFBYWhoRSxTQUFiLENBQXdCNGdFLEtBQUtyM0QsUUFBN0IsRUFDQXkzRCxhQUFhNXhELGVBQWIsQ0FBOEIyeEQsY0FBOUIsRUFDQUYsV0FBV3QzRCxRQUFYLENBQW9CL0wsR0FBcEIsQ0FBeUJ3akUsWUFBekIsRUFFQSxDQUVESCxXQUFXM25ELGlCQUFYLEdBRUEsR0FBS29tRCxPQUFPQyxZQUFQLEdBQXdCLEtBQTdCLENBQXFDLGFBQUEsQ0FFckM7RUFFQUwsUUFBUTEwRCxJQUFSLENBQWV1RixPQUFPdkYsSUFBdEIsQ0FDQTQwRCxRQUFRNTBELElBQVIsQ0FBZXVGLE9BQU92RixJQUF0QixDQUVBMDBELFFBQVF6MEQsR0FBUixDQUFjc0YsT0FBT3RGLEdBQXJCLENBQ0EyMEQsUUFBUTMwRCxHQUFSLENBQWNzRixPQUFPdEYsR0FBckIsQ0FFQTQwRCxTQUFTcHZELFdBQVQsQ0FBcUIxUyxJQUFyQixDQUEyQndTLE9BQU9FLFdBQWxDLEVBQ0FvdkQsU0FBU25xQyxrQkFBVCxDQUE0QjMzQixJQUE1QixDQUFrQ3dTLE9BQU9tbEIsa0JBQXpDLEVBRUFncUMsUUFBUWhxQyxrQkFBUixDQUEyQmwxQixTQUEzQixDQUFzQysrRCxVQUFVa0MsY0FBaEQsRUFDQTdCLFFBQVFscUMsa0JBQVIsQ0FBMkJsMUIsU0FBM0IsQ0FBc0MrK0QsVUFBVW1DLGVBQWhELEVBRUE7RUFFQUMsc0JBQXNCdDVELFVBQXRCLENBQWtDNjRELGNBQWxDLEVBRUF4QixRQUFRaHFDLGtCQUFSLENBQTJCbDNCLFFBQTNCLENBQXFDbWpFLHFCQUFyQyxFQUNBL0IsUUFBUWxxQyxrQkFBUixDQUEyQmwzQixRQUEzQixDQUFxQ21qRSxxQkFBckMsRUFFQSxXQUFhTixXQUFXbDNFLE1BQXhCLENBRUEsR0FBS0EsU0FBVyxJQUFoQixDQUF1QixDQUV0QnVyQyxtQkFBbUJydEIsVUFBbkIsQ0FBK0JsZSxPQUFPc21CLFdBQXRDLEVBRUFpdkQsUUFBUWhxQyxrQkFBUixDQUEyQmwzQixRQUEzQixDQUFxQ2szQixrQkFBckMsRUFDQWtxQyxRQUFRbHFDLGtCQUFSLENBQTJCbDNCLFFBQTNCLENBQXFDazNCLGtCQUFyQyxFQUVBLENBRUQ7RUFFQWdxQyxRQUFRanZELFdBQVIsQ0FBb0JwSSxVQUFwQixDQUFnQ3EzRCxRQUFRaHFDLGtCQUF4QyxFQUNBa3FDLFFBQVFudkQsV0FBUixDQUFvQnBJLFVBQXBCLENBQWdDdTNELFFBQVFscUMsa0JBQXhDLEVBRUFncUMsUUFBUWx2RCxnQkFBUixDQUF5QmhRLFNBQXpCLENBQW9DKytELFVBQVVxQyxvQkFBOUMsRUFDQWhDLFFBQVFwdkQsZ0JBQVIsQ0FBeUJoUSxTQUF6QixDQUFvQysrRCxVQUFVc0MscUJBQTlDLEVBRUE7RUFDQTtFQUVBaEMsU0FBU3J2RCxnQkFBVCxDQUEwQnpTLElBQTFCLENBQWdDMmhFLFFBQVFsdkQsZ0JBQXhDLEVBRUE7RUFFQSxXQUFhc3ZELE9BQU9nQyxTQUFQLEVBQWIsQ0FFQSxHQUFLbndDLE9BQU83NEMsTUFBWixDQUFxQixDQUVwQixVQUFZNjRDLE9BQVEsQ0FBUixDQUFaLENBRUEsR0FBS293QyxNQUFNQyxVQUFOLEdBQXFCLElBQXJCLEVBQTZCRCxNQUFNQyxVQUFOLENBQWlCbHBGLE1BQWpCLEdBQTRCLENBQTlELENBQWtFLENBRWpFNG1GLFFBQVFDLE1BQVIsQ0FBZW4vRCxTQUFmLENBQTBCdWhFLE1BQU1DLFVBQWhDLEVBRUEsQ0FFRCxHQUFLRCxNQUFNRSxXQUFOLEdBQXNCLElBQXRCLEVBQThCRixNQUFNRSxXQUFOLENBQWtCbnBGLE1BQWxCLEdBQTZCLENBQWhFLENBQW9FLENBRW5FOG1GLFFBQVFELE1BQVIsQ0FBZW4vRCxTQUFmLENBQTBCdWhFLE1BQU1FLFdBQWhDLEVBRUEsQ0FFRCxDQUVELGVBQUEsQ0FFQSxDQXhIRCxDQTBIQSxLQUFLQyxpQkFBTCxDQUF5QixVQUFZLENBRXBDLHFCQUFBLENBRUEsQ0FKRCxDQU1BLEtBQUtDLFdBQUwsQ0FBbUIsVUFBWSxDQUU5QixHQUFLcEMsY0FBTCxDQUFzQkQsT0FBT3FDLFdBQVAsR0FFdEIsQ0FKRCxDQU1BLEtBQUt2c0QsT0FBTCxDQUFlLFVBQVksQ0FFMUIsR0FBSyxhQUFBLEdBQWtCLFdBQXZCLENBQXFDLENBRXBDNzVCLE9BQU93ZSxtQkFBUCxDQUE0Qix3QkFBNUIsQ0FBc0RrbEUsd0JBQXRELEVBRUEsQ0FFRCxDQVJELENBVUEsQ0FFRDs7Ozs7O0tBUUEsc0JBQUEsQ0FBd0J2cUMsVUFBeEIsQ0FBcUMsQ0FFcEM5bUMsUUFBUStPLEdBQVIsQ0FBYSxxQkFBYixDQUFvQ2lsRSxRQUFwQyxFQUVBbHRDLFdBQWFBLFlBQWMsRUFBM0IsQ0FFQSxZQUFjQSxXQUFXbGdCLE1BQVgsR0FBc0J2OUIsU0FBdEIsQ0FBa0N5OUMsV0FBV2xnQixNQUE3QyxDQUFzRGo0QixTQUFTazRCLGVBQVQsQ0FBMEIsOEJBQTFCLENBQTBELFFBQTFELENBQXBFLENBQ0NvdEQsU0FBV250QyxXQUFXeGhELE9BQVgsR0FBdUIrRCxTQUF2QixDQUFtQ3k5QyxXQUFXeGhELE9BQTlDLENBQXdELElBRHBFLENBR0M0dUYsT0FBU3B0QyxXQUFXLzBCLEtBQVgsR0FBcUIxb0IsU0FBckIsQ0FBaUN5OUMsV0FBVy8wQixLQUE1QyxDQUFvRCxLQUg5RCxDQUlDb2lFLE9BQVNydEMsV0FBV2pILEtBQVgsR0FBcUJ4MkMsU0FBckIsQ0FBaUN5OUMsV0FBV2pILEtBQTVDLENBQW9ELElBSjlELENBS0N1MEMsU0FBV3R0QyxXQUFXdzRCLE9BQVgsR0FBdUJqMkUsU0FBdkIsQ0FBbUN5OUMsV0FBV3c0QixPQUE5QyxDQUF3RCxJQUxwRSxDQU1DK1UsV0FBYXZ0QyxXQUFXd3RDLFNBQVgsR0FBeUJqckYsU0FBekIsQ0FBcUN5OUMsV0FBV3d0QyxTQUFoRCxDQUE0RCxLQU4xRSxDQU9DQyxvQkFBc0J6dEMsV0FBVzJRLGtCQUFYLEdBQWtDcHVELFNBQWxDLENBQThDeTlDLFdBQVcyUSxrQkFBekQsQ0FBOEUsSUFQckcsQ0FRQys4Qix1QkFBeUIxdEMsV0FBVzJ0QyxxQkFBWCxHQUFxQ3ByRixTQUFyQyxDQUFpRHk5QyxXQUFXMnRDLHFCQUE1RCxDQUFvRixLQVI5RyxDQVNDQyxpQkFBbUI1dEMsV0FBVzZ0QyxlQUFYLEdBQStCdHJGLFNBQS9CLENBQTJDeTlDLFdBQVc2dEMsZUFBdEQsQ0FBd0UsU0FUNUYsQ0FXQSxzQkFBd0IsSUFBeEIsQ0FDQSx1QkFBeUIsSUFBekIsQ0FFQTtFQUVBLEtBQUtDLFVBQUwsQ0FBa0I1UCxPQUFsQixDQUNBLEtBQUsxL0UsT0FBTCxDQUFlLElBQWYsQ0FFQTtFQUVBLEtBQUtvOEQsU0FBTCxDQUFpQixJQUFqQixDQUNBLEtBQUtDLGNBQUwsQ0FBc0IsSUFBdEIsQ0FDQSxLQUFLQyxjQUFMLENBQXNCLElBQXRCLENBQ0EsS0FBS0MsZ0JBQUwsQ0FBd0IsSUFBeEIsQ0FFQTtFQUVBLEtBQUtnekIsV0FBTCxDQUFtQixJQUFuQixDQUVBO0VBRUEsS0FBSzk5QixjQUFMLENBQXNCLEVBQXRCLENBQ0EsS0FBSzZOLG9CQUFMLENBQTRCLEtBQTVCLENBRUE7RUFFQSxLQUFLcnJCLFdBQUwsQ0FBbUIsR0FBbkIsQ0FBd0I7RUFDeEIsS0FBSzg2QixVQUFMLENBQWtCLEtBQWxCLENBQ0EsS0FBS0QsV0FBTCxDQUFtQixLQUFuQixDQUVBO0VBRUEsS0FBS3pFLHVCQUFMLENBQStCLEtBQS9CLENBRUE7RUFFQSxLQUFLOUMsV0FBTCxDQUFtQmlvQixpQkFBbkIsQ0FDQSxLQUFLQyxtQkFBTCxDQUEyQixHQUEzQixDQUNBLEtBQUtDLHFCQUFMLENBQTZCLEdBQTdCLENBRUE7RUFFQSxLQUFLdGdCLGVBQUwsQ0FBdUIsQ0FBdkIsQ0FDQSxLQUFLQyxlQUFMLENBQXVCLENBQXZCLENBRUE7RUFFQSxVQUFZLElBQVosQ0FFQ3NnQixlQUFpQixLQUZsQjtFQU1DQyxxQkFBdUIsSUFOeEIsQ0FPQ0Msb0JBQXNCLElBUHZCLENBUUNDLG1CQUFxQixDQUFFLENBUnhCLENBU0NDLHdCQUEwQixFQVQzQixDQVdDQyxlQUFpQixJQVhsQixDQVlDQyxvQkFBc0IsSUFadkIsQ0FjQ0MsaUJBQW1CLFdBQUEsRUFkcEIsQ0FlQ0MsZ0JBQWtCLFdBQUEsRUFmbkIsQ0FnQkNDLG9CQUFzQixJQWhCdkI7RUFvQkNDLGtCQUFvQixDQXBCckI7RUF3QkNDLE9BQVM1USxRQUFRbCtDLEtBeEJsQixDQXlCQyt1RCxRQUFVN1EsUUFBUWorQyxNQXpCbkIsQ0EyQkMrdUQsWUFBYyxDQTNCZixDQTZCQ0MsVUFBWSxXQUFBLENBQWEsQ0FBYixDQUFnQixDQUFoQixDQUFtQkgsTUFBbkIsQ0FBMkJDLE9BQTNCLENBN0JiLENBOEJDRyxTQUFXLFdBQUEsQ0FBYSxDQUFiLENBQWdCLENBQWhCLENBQW1CSixNQUFuQixDQUEyQkMsT0FBM0IsQ0E5QlosQ0ErQkNJLGFBQWUsS0EvQmhCO0VBbUNDM2IsU0FBVyxXQUFBLEVBbkNaO0VBdUNDNGIsVUFBWSxpQkFBQSxFQXZDYixDQXdDQ0MsaUJBQW1CLEtBeENwQixDQXlDQ0Msc0JBQXdCLEtBekN6QjtFQTZDQ2hlLGtCQUFvQixXQUFBLEVBN0NyQixDQStDQ2llLFNBQVcsV0FBQSxFQS9DWixDQWlEQSw0QkFBQSxFQUErQixDQUU5Qiw4QkFBZ0MsSUFBekIsQ0FBZ0NQLFdBQWhDLENBQThDLENBQXJELENBRUEsQ0FFRDtFQUVBLE9BQUEsQ0FFQSxHQUFJLENBRUgsc0JBQXdCLENBQ3ZCL2pFLE1BQU9taUUsTUFEZ0IsQ0FFdkJyMEMsTUFBT3MwQyxNQUZnQixDQUd2QjdVLFFBQVM4VSxRQUhjLENBSXZCRSxVQUFXRCxVQUpZLENBS3ZCNThCLG1CQUFvQjg4QixtQkFMRyxDQU12QkUsc0JBQXVCRCxzQkFOQSxDQU92QkcsZ0JBQWlCRCxnQkFQTSxDQUF4QixDQVVBO0VBRUExUCxRQUFRaHFFLGdCQUFSLENBQTBCLGtCQUExQixDQUE4Q3M3RSxhQUE5QyxDQUE2RCxLQUE3RCxFQUNBdFIsUUFBUWhxRSxnQkFBUixDQUEwQixzQkFBMUIsQ0FBa0R1N0UsZ0JBQWxELENBQW9FLEtBQXBFLEVBRUFqZCxJQUFNMmEsVUFBWWpQLFFBQVFoK0MsVUFBUixDQUFvQixPQUFwQixDQUE2Qnd2RCxpQkFBN0IsQ0FBWixFQUFnRXhSLFFBQVFoK0MsVUFBUixDQUFvQixvQkFBcEIsQ0FBMEN3dkQsaUJBQTFDLENBQXRFLENBRUEsR0FBS2xkLE1BQVEsSUFBYixDQUFvQixDQUVuQixHQUFLMEwsUUFBUWgrQyxVQUFSLENBQW9CLE9BQXBCLElBQWtDLElBQXZDLENBQThDLENBRTdDLGVBQU0sQ0FBVyw2REFBWCxDQUFOLENBRUEsQ0FKRCxJQUlPLENBRU4sZUFBTSxDQUFXLCtCQUFYLENBQU4sQ0FFQSxDQUVELENBRUQ7RUFFQSxHQUFLc3lDLElBQUl4Vyx3QkFBSixHQUFpQ3o1RCxTQUF0QyxDQUFrRCxDQUVqRGl3RSxJQUFJeFcsd0JBQUosQ0FBK0IsVUFBWSxDQUUxQyxPQUFPLENBQUUsV0FBWSxDQUFkLENBQWlCLFdBQVksQ0FBN0IsQ0FBZ0MsWUFBYSxDQUE3QyxDQUFQLENBRUEsQ0FKRCxDQU1BLENBRUQsQ0FBQyxNQUFReGlELEtBQVIsQ0FBZ0IsQ0FFakJOLFFBQVFNLEtBQVIsQ0FBZSx3QkFBMEJBLE1BQU1tMkUsT0FBL0MsRUFFQSxDQUVELGNBQUEsQ0FBZ0Jua0IsWUFBaEIsQ0FBOEI3cEUsS0FBOUIsQ0FBcUNjLElBQXJDLENBQ0EsY0FBQSxDQUFnQm85QixRQUFoQixDQUEwQjBFLFVBQTFCLENBQXNDbWIsVUFBdEMsQ0FBa0Rrd0MsT0FBbEQsQ0FDQSxnQkFBQSxDQUFrQkMsV0FBbEIsQ0FBK0I5ZSxZQUEvQixDQUVBLGNBQUEsQ0FBZ0IrZSxZQUFoQixDQUE4QkMsY0FBOUIsQ0FBOENDLHFCQUE5QyxDQUNBLGtCQUFBLENBRUEsU0FBQSxDQUVBLHNCQUFBLEVBQXlCLENBRXhCM3NFLFdBQWEsbUJBQUEsQ0FBcUJtdkQsR0FBckIsQ0FBYixDQUNBbnZELFdBQVcxYixHQUFYLENBQWdCLHFCQUFoQixFQUNBMGIsV0FBVzFiLEdBQVgsQ0FBZ0IsbUJBQWhCLEVBQ0EwYixXQUFXMWIsR0FBWCxDQUFnQiwwQkFBaEIsRUFDQTBiLFdBQVcxYixHQUFYLENBQWdCLHdCQUFoQixFQUNBMGIsV0FBVzFiLEdBQVgsQ0FBZ0IsK0JBQWhCLEVBQ0EwYixXQUFXMWIsR0FBWCxDQUFnQiwwQkFBaEIsRUFDQTBiLFdBQVcxYixHQUFYLENBQWdCLHdCQUFoQixFQUNBMGIsV0FBVzFiLEdBQVgsQ0FBZ0Isd0JBQWhCLEVBRUFzdUUsTUFBUSxjQUFBLENBQWdCekQsR0FBaEIsQ0FBcUJudkQsVUFBckIsQ0FBUixDQUVBbW9ELGFBQWUscUJBQUEsQ0FBdUJnSCxHQUF2QixDQUE0Qm52RCxVQUE1QixDQUF3QzI4QixVQUF4QyxDQUFmLENBRUFyK0MsTUFBUSxjQUFBLENBQWdCNndFLEdBQWhCLENBQXFCbnZELFVBQXJCLENBQWlDNHlELEtBQWpDLENBQVIsQ0FDQXQwRSxNQUFNMi9CLE9BQU4sQ0FBZXF0RCxnQkFBZ0I5bEUsSUFBaEIsQ0FBc0JxbUUsUUFBdEIsRUFBaUMzbEUsY0FBakMsQ0FBaUR5bEUsV0FBakQsQ0FBZixFQUNBcnRGLE1BQU02L0IsUUFBTixDQUFnQmt0RCxpQkFBaUI3bEUsSUFBakIsQ0FBdUJvbUUsU0FBdkIsRUFBbUMxbEUsY0FBbkMsQ0FBbUR5bEUsV0FBbkQsQ0FBaEIsRUFFQXZzRixLQUFPLGFBQUEsQ0FBZSt2RSxHQUFmLENBQVAsQ0FDQWo4QixXQUFhLG1CQUFBLEVBQWIsQ0FDQTFXLFNBQVcsaUJBQUEsQ0FBbUIyeUMsR0FBbkIsQ0FBd0JudkQsVUFBeEIsQ0FBb0MxaEIsS0FBcEMsQ0FBMkM0MEMsVUFBM0MsQ0FBdURpMUIsWUFBdkQsQ0FBcUV5SyxLQUFyRSxDQUE0RXh6RSxJQUE1RSxDQUFYLENBQ0E4aEMsV0FBYSxtQkFBQSxDQUFxQml1QyxHQUFyQixDQUFiLENBQ0E5eUIsV0FBYSxtQkFBQSxDQUFxQjh5QixHQUFyQixDQUEwQmp1QyxVQUExQixDQUFzQzloQyxJQUF0QyxDQUFiLENBQ0FtdEYsUUFBVSxnQkFBQSxDQUFrQmx3QyxVQUFsQixDQUE4Qmo5QyxJQUE5QixDQUFWLENBQ0FxdEYsYUFBZSxxQkFBQSxDQUF1QnRkLEdBQXZCLENBQWYsQ0FDQXlkLGFBQWUsaUJBQUEsQ0FBbUJDLEtBQW5CLENBQTBCN3NFLFVBQTFCLENBQXNDbW9ELFlBQXRDLENBQWYsQ0FDQXFrQixZQUFjLG9CQUFBLEVBQWQsQ0FDQTllLGFBQWUscUJBQUEsRUFBZixDQUVBdlcsV0FBYSxtQkFBQSxDQUFxQjAxQixLQUFyQixDQUE0QnZ1RixLQUE1QixDQUFtQys5QyxVQUFuQyxDQUErQyt0QyxtQkFBL0MsQ0FBYixDQUVBc0MsZUFBaUIsdUJBQUEsQ0FBeUJ2ZCxHQUF6QixDQUE4Qm52RCxVQUE5QixDQUEwQzVnQixJQUExQyxDQUFqQixDQUNBdXRGLHNCQUF3Qiw4QkFBQSxDQUFnQ3hkLEdBQWhDLENBQXFDbnZELFVBQXJDLENBQWlENWdCLElBQWpELENBQXhCLENBRUEwdEYsZUFBaUIsdUJBQUEsQ0FBeUJELEtBQXpCLENBQWdDMWQsR0FBaEMsQ0FBcUM3d0UsS0FBckMsQ0FBNENrK0IsUUFBNUMsQ0FBc0QyckMsWUFBdEQsQ0FBakIsQ0FFQS9vRSxLQUFLcStELFFBQUwsQ0FBZ0JtdkIsYUFBYW52QixRQUE3QixDQUVBb3ZCLE1BQU0xeEYsT0FBTixDQUFnQmcwRSxHQUFoQixDQUNBMGQsTUFBTTFrQixZQUFOLENBQXFCQSxZQUFyQixDQUNBMGtCLE1BQU03c0UsVUFBTixDQUFtQkEsVUFBbkIsQ0FDQTZzRSxNQUFNMzVDLFVBQU4sQ0FBbUJBLFVBQW5CLENBQ0EyNUMsTUFBTUwsV0FBTixDQUFvQkEsV0FBcEIsQ0FDQUssTUFBTXZ1RixLQUFOLENBQWNBLEtBQWQsQ0FDQXV1RixNQUFNenRGLElBQU4sQ0FBYUEsSUFBYixDQUVBLENBRUQydEYsZ0JBRUE7RUFFQSxPQUFTLGdCQUFBLENBQWtCRixLQUFsQixDQUFULENBRUEsS0FBS0csRUFBTCxDQUFVQSxFQUFWLENBRUE7RUFFQSxjQUFnQixrQkFBQSxDQUFvQkgsS0FBcEIsQ0FBMkJOLE9BQTNCLENBQW9DcGtCLGFBQWFuTyxjQUFqRCxDQUFoQixDQUVBLEtBQUs2USxTQUFMLENBQWlCQSxTQUFqQixDQUVBO0VBRUEsS0FBS2h1QyxVQUFMLENBQWtCLFVBQVksQ0FFN0IsVUFBQSxDQUVBLENBSkQsQ0FNQSxLQUFLb3dELG9CQUFMLENBQTRCLFVBQVksQ0FFdkMsV0FBV0Esb0JBQUosRUFBUCxDQUVBLENBSkQsQ0FNQSxLQUFLQyxnQkFBTCxDQUF3QixVQUFZLENBRW5DLGNBQWdCbHRFLFdBQVcxYixHQUFYLENBQWdCLG9CQUFoQixDQUFoQixDQUNBLEdBQUs2YixTQUFMLENBQWlCQSxVQUFVZ3RFLFdBQVYsR0FFakIsQ0FMRCxDQU9BLEtBQUtDLG1CQUFMLENBQTJCLFVBQVksQ0FFdEMsY0FBZ0JwdEUsV0FBVzFiLEdBQVgsQ0FBZ0Isb0JBQWhCLENBQWhCLENBQ0EsR0FBSzZiLFNBQUwsQ0FBaUJBLFVBQVVrdEUsY0FBVixHQUVqQixDQUxELENBT0EsS0FBS3ZGLGFBQUwsQ0FBcUIsVUFBWSxDQUVoQyxrQkFBQSxDQUVBLENBSkQsQ0FNQSxLQUFLd0YsYUFBTCxDQUFxQixTQUFXL3ZGLEtBQVgsQ0FBbUIsQ0FFdkMsR0FBS0EsUUFBVTJCLFNBQWYsQ0FBMkIsT0FFM0J5c0YsWUFBY3B1RixLQUFkLENBRUEsS0FBS21oQyxPQUFMLENBQWMrc0QsTUFBZCxDQUFzQkMsT0FBdEIsQ0FBK0IsS0FBL0IsRUFFQSxDQVJELENBVUEsS0FBS2hyRCxPQUFMLENBQWUsVUFBWSxDQUUxQixPQUFPLENBQ04vRCxNQUFPOHVELE1BREQsQ0FFTjd1RCxPQUFROHVELE9BRkYsQ0FBUCxDQUtBLENBUEQsQ0FTQSxLQUFLaHRELE9BQUwsQ0FBZSxTQUFXL0IsS0FBWCxDQUFrQkMsTUFBbEIsQ0FBMEIyd0QsV0FBMUIsQ0FBd0MsQ0FFdEQsV0FBYVAsR0FBRzlFLFNBQUgsRUFBYixDQUVBLEdBQUtYLFFBQVVBLE9BQU9DLFlBQXRCLENBQXFDLENBRXBDM3hFLFFBQVE2UCxJQUFSLENBQWMsd0VBQWQsRUFDQSxPQUVBLENBRUQrbEUsT0FBUzl1RCxLQUFULENBQ0ErdUQsUUFBVTl1RCxNQUFWLENBRUFpK0MsUUFBUWwrQyxLQUFSLENBQWdCQSxNQUFRZ3ZELFdBQXhCLENBQ0E5USxRQUFRaitDLE1BQVIsQ0FBaUJBLE9BQVMrdUQsV0FBMUIsQ0FFQSxHQUFLNEIsY0FBZ0IsS0FBckIsQ0FBNkIsQ0FFNUIxUyxRQUFRbnhFLEtBQVIsQ0FBY2l6QixLQUFkLENBQXNCQSxNQUFRLElBQTlCLENBQ0FrK0MsUUFBUW54RSxLQUFSLENBQWNrekIsTUFBZCxDQUF1QkEsT0FBUyxJQUFoQyxDQUVBLENBRUQsS0FBSzR3RCxXQUFMLENBQWtCLENBQWxCLENBQXFCLENBQXJCLENBQXdCN3dELEtBQXhCLENBQStCQyxNQUEvQixFQUVBLENBMUJELENBNEJBLEtBQUs2d0Qsb0JBQUwsQ0FBNEIsVUFBWSxDQUV2QyxPQUFPLENBQ045d0QsTUFBTzh1RCxPQUFTRSxXQURWLENBRU4vdUQsT0FBUTh1RCxRQUFVQyxXQUZaLENBQVAsQ0FLQSxDQVBELENBU0EsS0FBSzNELG9CQUFMLENBQTRCLFNBQVdyckQsS0FBWCxDQUFrQkMsTUFBbEIsQ0FBMEI4d0QsVUFBMUIsQ0FBdUMsQ0FFbEVqQyxPQUFTOXVELEtBQVQsQ0FDQSt1RCxRQUFVOXVELE1BQVYsQ0FFQSt1RCxZQUFjK0IsVUFBZCxDQUVBN1MsUUFBUWwrQyxLQUFSLENBQWdCQSxNQUFRK3dELFVBQXhCLENBQ0E3UyxRQUFRaitDLE1BQVIsQ0FBaUJBLE9BQVM4d0QsVUFBMUIsQ0FFQSxLQUFLRixXQUFMLENBQWtCLENBQWxCLENBQXFCLENBQXJCLENBQXdCN3dELEtBQXhCLENBQStCQyxNQUEvQixFQUVBLENBWkQsQ0FjQSxLQUFLK3dELGtCQUFMLENBQTBCLFVBQVksQ0FFckMsdUJBQUEsQ0FFQSxDQUpELENBTUEsS0FBS0gsV0FBTCxDQUFtQixTQUFXcjZFLENBQVgsQ0FBY3dRLENBQWQsQ0FBaUJnWixLQUFqQixDQUF3QkMsTUFBeEIsQ0FBaUMsQ0FFbkRndkQsVUFBVTE2RSxHQUFWLENBQWVpQyxDQUFmLENBQWtCdTRFLFFBQVUvbkUsQ0FBVixDQUFjaVosTUFBaEMsQ0FBd0NELEtBQXhDLENBQStDQyxNQUEvQyxFQUNBdCtCLE1BQU02L0IsUUFBTixDQUFnQmt0RCxpQkFBaUI3bEUsSUFBakIsQ0FBdUJvbUUsU0FBdkIsRUFBbUMxbEUsY0FBbkMsQ0FBbUR5bEUsV0FBbkQsQ0FBaEIsRUFFQSxDQUxELENBT0EsS0FBS2lDLFVBQUwsQ0FBa0IsU0FBV3o2RSxDQUFYLENBQWN3USxDQUFkLENBQWlCZ1osS0FBakIsQ0FBd0JDLE1BQXhCLENBQWlDLENBRWxEaXZELFNBQVMzNkUsR0FBVCxDQUFjaUMsQ0FBZCxDQUFpQnU0RSxRQUFVL25FLENBQVYsQ0FBY2laLE1BQS9CLENBQXVDRCxLQUF2QyxDQUE4Q0MsTUFBOUMsRUFDQXQrQixNQUFNMi9CLE9BQU4sQ0FBZXF0RCxnQkFBZ0I5bEUsSUFBaEIsQ0FBc0JxbUUsUUFBdEIsRUFBaUMzbEUsY0FBakMsQ0FBaUR5bEUsV0FBakQsQ0FBZixFQUVBLENBTEQsQ0FPQSxLQUFLcmMsY0FBTCxDQUFzQixTQUFXdWUsT0FBWCxDQUFxQixDQUUxQ3Z2RixNQUFNZ3hFLGNBQU4sQ0FBc0J3YyxhQUFlK0IsT0FBckMsRUFFQSxDQUpELENBTUE7RUFFQSxLQUFLOTFCLGFBQUwsQ0FBcUIsVUFBWSxDQUVoQyxrQkFBa0JBLGFBQVgsRUFBUCxDQUVBLENBSkQsQ0FNQSxLQUFLQyxhQUFMLENBQXFCLFVBQVksQ0FFaENiLFdBQVdhLGFBQVgsQ0FBeUJoMEQsS0FBekIsQ0FBZ0NtekQsVUFBaEMsQ0FBNENsekQsU0FBNUMsRUFFQSxDQUpELENBTUEsS0FBS2cwRCxhQUFMLENBQXFCLFVBQVksQ0FFaEMsa0JBQWtCQSxhQUFYLEVBQVAsQ0FFQSxDQUpELENBTUEsS0FBS0MsYUFBTCxDQUFxQixVQUFZLENBRWhDZixXQUFXZSxhQUFYLENBQXlCbDBELEtBQXpCLENBQWdDbXpELFVBQWhDLENBQTRDbHpELFNBQTVDLEVBRUEsQ0FKRCxDQU1BLEtBQUtrTixLQUFMLENBQWEsU0FBVzI5QixLQUFYLENBQWtCNEcsS0FBbEIsQ0FBeUJ5L0IsT0FBekIsQ0FBbUMsQ0FFL0MsU0FBVyxDQUFYLENBRUEsR0FBS3JtQyxRQUFVNXZDLFNBQVYsRUFBdUI0dkMsS0FBNUIsQ0FBb0NnL0MsTUFBUTNlLElBQUk0ZSxnQkFBWixDQUNwQyxHQUFLcjRDLFFBQVV4MkMsU0FBVixFQUF1QncyQyxLQUE1QixDQUFvQ280QyxNQUFRM2UsSUFBSTZlLGdCQUFaLENBQ3BDLEdBQUs3WSxVQUFZajJFLFNBQVosRUFBeUJpMkUsT0FBOUIsQ0FBd0MyWSxNQUFRM2UsSUFBSThlLGtCQUFaLENBRXhDOWUsSUFBSWgrRCxLQUFKLENBQVcyOEUsSUFBWCxFQUVBLENBVkQsQ0FZQSxLQUFLejJCLFVBQUwsQ0FBa0IsVUFBWSxDQUU3QixLQUFLbG1ELEtBQUwsQ0FBWSxJQUFaLENBQWtCLEtBQWxCLENBQXlCLEtBQXpCLEVBRUEsQ0FKRCxDQU1BLEtBQUs4aUUsVUFBTCxDQUFrQixVQUFZLENBRTdCLEtBQUs5aUUsS0FBTCxDQUFZLEtBQVosQ0FBbUIsSUFBbkIsQ0FBeUIsS0FBekIsRUFFQSxDQUpELENBTUEsS0FBS2trRSxZQUFMLENBQW9CLFVBQVksQ0FFL0IsS0FBS2xrRSxLQUFMLENBQVksS0FBWixDQUFtQixLQUFuQixDQUEwQixJQUExQixFQUVBLENBSkQsQ0FNQSxLQUFLKzhFLFdBQUwsQ0FBbUIsU0FBVzFTLFlBQVgsQ0FBeUIxc0MsS0FBekIsQ0FBZ0M0RyxLQUFoQyxDQUF1Q3kvQixPQUF2QyxDQUFpRCxDQUVuRSxLQUFLcEYsZUFBTCxDQUFzQnlMLFlBQXRCLEVBQ0EsS0FBS3JxRSxLQUFMLENBQVkyOUIsS0FBWixDQUFtQjRHLEtBQW5CLENBQTBCeS9CLE9BQTFCLEVBRUEsQ0FMRCxDQU9BO0VBRUEsS0FBSzkzQyxPQUFMLENBQWUsVUFBWSxDQUUxQnc5QyxRQUFRNzRELG1CQUFSLENBQTZCLGtCQUE3QixDQUFpRG1xRSxhQUFqRCxDQUFnRSxLQUFoRSxFQUNBdFIsUUFBUTc0RCxtQkFBUixDQUE2QixzQkFBN0IsQ0FBcURvcUUsZ0JBQXJELENBQXVFLEtBQXZFLEVBRUFJLFlBQVludkQsT0FBWixHQUNBcXdDLGFBQWFyd0MsT0FBYixHQUNBNlYsV0FBVzdWLE9BQVgsR0FDQWt2RCxRQUFRbHZELE9BQVIsR0FFQTJ2RCxHQUFHM3ZELE9BQUgsR0FFQTh3RCxnQkFFQSxDQWRELENBZ0JBO0VBRUEsc0JBQUEsQ0FBd0JwK0UsS0FBeEIsQ0FBZ0MsQ0FFL0JBLE1BQU1xK0UsY0FBTixHQUVBdjRFLFFBQVErTyxHQUFSLENBQWEsb0NBQWIsRUFFQWttRSxlQUFpQixJQUFqQixDQUVBLENBRUQseUJBQUEsYUFBeUMsQ0FFeENqMUUsUUFBUStPLEdBQVIsQ0FBYSx3Q0FBYixFQUVBa21FLGVBQWlCLEtBQWpCLENBRUFpQyxnQkFFQSxDQUVELDBCQUFBLENBQTRCaDlFLEtBQTVCLENBQW9DLENBRW5DLGFBQWVBLE1BQU12SixNQUFyQixDQUVBcTJDLFNBQVM3NkIsbUJBQVQsQ0FBOEIsU0FBOUIsQ0FBeUNxc0UsaUJBQXpDLEVBRUFDLG1CQUFvQnp4QyxRQUFwQixFQUVBLENBRUQ7RUFFQSwyQkFBQSxDQUE2QkEsUUFBN0IsQ0FBd0MsQ0FFdkMweEMsZ0NBQWlDMXhDLFFBQWpDLEVBRUEzSixXQUFXa0YsTUFBWCxDQUFtQnlFLFFBQW5CLEVBRUEsQ0FHRCx3Q0FBQSxDQUEwQ0EsUUFBMUMsQ0FBcUQsQ0FFcEQsZ0JBQWtCM0osV0FBVzV1QyxHQUFYLENBQWdCdTRDLFFBQWhCLEVBQTJCOGdCLE9BQTdDLENBRUE5Z0IsU0FBUzhnQixPQUFULENBQW1CeitELFNBQW5CLENBRUEsR0FBS2dzRSxjQUFnQmhzRSxTQUFyQixDQUFpQyxDQUVoQzB0RixhQUFhemhCLGNBQWIsQ0FBNkJELFdBQTdCLEVBRUEsQ0FFRCxDQUVEO0VBRUEsOEJBQUEsQ0FBZ0M5cUUsTUFBaEMsQ0FBd0N1OUQsT0FBeEMsQ0FBaUQ5Z0IsUUFBakQsQ0FBNEQsQ0FFM0R6OEMsT0FBTyszRCxNQUFQLENBQWUsU0FBVy8zRCxNQUFYLENBQW9CLENBRWxDeXNGLE1BQU0yQixxQkFBTixDQUE2QnB1RixNQUE3QixDQUFxQ3U5RCxPQUFyQyxDQUE4QzlnQixRQUE5QyxFQUVBLENBSkQsRUFNQSxDQUVELEtBQUsyeEMscUJBQUwsQ0FBNkIsU0FBV3B1RixNQUFYLENBQW1CdTlELE9BQW5CLENBQTRCOWdCLFFBQTVCLENBQXVDLENBRW5FditDLE1BQU1zekUsY0FBTixHQUVBLFlBQWMxK0IsV0FBVzV1QyxHQUFYLENBQWdCbEUsTUFBaEIsQ0FBZCxDQUVBLEdBQUtBLE9BQU9xdUYsWUFBUCxFQUF1QixDQUFFejJDLFFBQVF4bUIsUUFBdEMsQ0FBaUR3bUIsUUFBUXhtQixRQUFSLENBQW1CMjlDLElBQUl0NEIsWUFBSixFQUFuQixDQUNqRCxHQUFLejJDLE9BQU9zdUYsVUFBUCxFQUFxQixDQUFFMTJDLFFBQVFoZixNQUFwQyxDQUE2Q2dmLFFBQVFoZixNQUFSLENBQWlCbTJDLElBQUl0NEIsWUFBSixFQUFqQixDQUM3QyxHQUFLejJDLE9BQU91dUYsTUFBUCxFQUFpQixDQUFFMzJDLFFBQVF6YSxFQUFoQyxDQUFxQ3lhLFFBQVF6YSxFQUFSLENBQWE0eEMsSUFBSXQ0QixZQUFKLEVBQWIsQ0FDckMsR0FBS3oyQyxPQUFPd3VGLFNBQVAsRUFBb0IsQ0FBRTUyQyxRQUFRbEosS0FBbkMsQ0FBMkNrSixRQUFRbEosS0FBUixDQUFnQnFnQyxJQUFJdDRCLFlBQUosRUFBaEIsQ0FFM0Msc0JBQXdCOG1CLFFBQVFpSyxhQUFSLEVBQXhCLENBRUEsR0FBS3huRSxPQUFPcXVGLFlBQVosQ0FBMkIsQ0FFMUJ0ZixJQUFJcjRCLFVBQUosQ0FBZ0JxNEIsSUFBSTNTLFlBQXBCLENBQWtDeGtCLFFBQVF4bUIsUUFBMUMsRUFDQTI5QyxJQUFJbjRCLFVBQUosQ0FBZ0JtNEIsSUFBSTNTLFlBQXBCLENBQWtDcDhELE9BQU95dUYsYUFBekMsQ0FBd0QxZixJQUFJeDRCLFlBQTVELEVBRUFyNEMsTUFBTXV6RSxlQUFOLENBQXVCaWQsa0JBQWtCdDlELFFBQXpDLEVBQ0EyOUMsSUFBSTZDLG1CQUFKLENBQXlCOGMsa0JBQWtCdDlELFFBQTNDLENBQXFELENBQXJELENBQXdEMjlDLElBQUloNEIsS0FBNUQsQ0FBbUUsS0FBbkUsQ0FBMEUsQ0FBMUUsQ0FBNkUsQ0FBN0UsRUFFQSxDQUVELEdBQUsvMkMsT0FBT3N1RixVQUFaLENBQXlCLENBRXhCdmYsSUFBSXI0QixVQUFKLENBQWdCcTRCLElBQUkzUyxZQUFwQixDQUFrQ3hrQixRQUFRaGYsTUFBMUMsRUFFQSxHQUFLLENBQUU2akIsU0FBU2t5QyxtQkFBWCxFQUNKLENBQUVseUMsU0FBU215QyxzQkFEUCxFQUVKLENBQUVueUMsU0FBU295QyxvQkFGUCxFQUdKcHlDLFNBQVMrTyxXQUFULEdBQXlCLElBSDFCLENBR2lDLENBRWhDLElBQU0sTUFBUSxDQUFSLENBQVd2b0QsRUFBSWpELE9BQU9rdkIsS0FBUCxDQUFlLENBQXBDLENBQXVDMXVCLEVBQUl5QyxDQUEzQyxDQUE4Q3pDLEdBQUssQ0FBbkQsQ0FBdUQsQ0FFdEQsVUFBWVIsT0FBTzh1RixXQUFuQixDQUVBLE9BQVMsQ0FBRXZ1RSxNQUFPL2YsRUFBSSxDQUFYLEVBQWlCK2YsTUFBTy9mLEVBQUksQ0FBWCxDQUFqQixDQUFrQytmLE1BQU8vZixFQUFJLENBQVgsQ0FBcEMsRUFBdUQsQ0FBaEUsQ0FDQSxPQUFTLENBQUUrZixNQUFPL2YsRUFBSSxDQUFYLEVBQWlCK2YsTUFBTy9mLEVBQUksQ0FBWCxDQUFqQixDQUFrQytmLE1BQU8vZixFQUFJLENBQVgsQ0FBcEMsRUFBdUQsQ0FBaEUsQ0FDQSxPQUFTLENBQUUrZixNQUFPL2YsRUFBSSxDQUFYLEVBQWlCK2YsTUFBTy9mLEVBQUksQ0FBWCxDQUFqQixDQUFrQytmLE1BQU8vZixFQUFJLENBQVgsQ0FBcEMsRUFBdUQsQ0FBaEUsQ0FFQStmLE1BQU8vZixFQUFJLENBQVgsRUFBaUJ1dUYsRUFBakIsQ0FDQXh1RSxNQUFPL2YsRUFBSSxDQUFYLEVBQWlCd3VGLEVBQWpCLENBQ0F6dUUsTUFBTy9mLEVBQUksQ0FBWCxFQUFpQnl1RixFQUFqQixDQUVBMXVFLE1BQU8vZixFQUFJLENBQVgsRUFBaUJ1dUYsRUFBakIsQ0FDQXh1RSxNQUFPL2YsRUFBSSxDQUFYLEVBQWlCd3VGLEVBQWpCLENBQ0F6dUUsTUFBTy9mLEVBQUksQ0FBWCxFQUFpQnl1RixFQUFqQixDQUVBMXVFLE1BQU8vZixFQUFJLENBQVgsRUFBaUJ1dUYsRUFBakIsQ0FDQXh1RSxNQUFPL2YsRUFBSSxDQUFYLEVBQWlCd3VGLEVBQWpCLENBQ0F6dUUsTUFBTy9mLEVBQUksQ0FBWCxFQUFpQnl1RixFQUFqQixDQUVBLENBRUQsQ0FFRGxnQixJQUFJbjRCLFVBQUosQ0FBZ0JtNEIsSUFBSTNTLFlBQXBCLENBQWtDcDhELE9BQU84dUYsV0FBekMsQ0FBc0QvZixJQUFJeDRCLFlBQTFELEVBRUFyNEMsTUFBTXV6RSxlQUFOLENBQXVCaWQsa0JBQWtCOTFELE1BQXpDLEVBRUFtMkMsSUFBSTZDLG1CQUFKLENBQXlCOGMsa0JBQWtCOTFELE1BQTNDLENBQW1ELENBQW5ELENBQXNEbTJDLElBQUloNEIsS0FBMUQsQ0FBaUUsS0FBakUsQ0FBd0UsQ0FBeEUsQ0FBMkUsQ0FBM0UsRUFFQSxDQUVELEdBQUsvMkMsT0FBT3V1RixNQUFQLEVBQWlCOXhDLFNBQVN0TSxHQUEvQixDQUFxQyxDQUVwQzQrQixJQUFJcjRCLFVBQUosQ0FBZ0JxNEIsSUFBSTNTLFlBQXBCLENBQWtDeGtCLFFBQVF6YSxFQUExQyxFQUNBNHhDLElBQUluNEIsVUFBSixDQUFnQm00QixJQUFJM1MsWUFBcEIsQ0FBa0NwOEQsT0FBT2t2RixPQUF6QyxDQUFrRG5nQixJQUFJeDRCLFlBQXRELEVBRUFyNEMsTUFBTXV6RSxlQUFOLENBQXVCaWQsa0JBQWtCdnhELEVBQXpDLEVBRUE0eEMsSUFBSTZDLG1CQUFKLENBQXlCOGMsa0JBQWtCdnhELEVBQTNDLENBQStDLENBQS9DLENBQWtENHhDLElBQUloNEIsS0FBdEQsQ0FBNkQsS0FBN0QsQ0FBb0UsQ0FBcEUsQ0FBdUUsQ0FBdkUsRUFFQSxDQUVELEdBQUsvMkMsT0FBT3d1RixTQUFQLEVBQW9CL3hDLFNBQVMwQixZQUFULEdBQTBCc04sUUFBbkQsQ0FBOEQsQ0FFN0RzakIsSUFBSXI0QixVQUFKLENBQWdCcTRCLElBQUkzUyxZQUFwQixDQUFrQ3hrQixRQUFRbEosS0FBMUMsRUFDQXFnQyxJQUFJbjRCLFVBQUosQ0FBZ0JtNEIsSUFBSTNTLFlBQXBCLENBQWtDcDhELE9BQU9tdkYsVUFBekMsQ0FBcURwZ0IsSUFBSXg0QixZQUF6RCxFQUVBcjRDLE1BQU11ekUsZUFBTixDQUF1QmlkLGtCQUFrQmhnRCxLQUF6QyxFQUVBcWdDLElBQUk2QyxtQkFBSixDQUF5QjhjLGtCQUFrQmhnRCxLQUEzQyxDQUFrRCxDQUFsRCxDQUFxRHFnQyxJQUFJaDRCLEtBQXpELENBQWdFLEtBQWhFLENBQXVFLENBQXZFLENBQTBFLENBQTFFLEVBRUEsQ0FFRDc0QyxNQUFNd3pFLHVCQUFOLEdBRUEzQyxJQUFJL1csVUFBSixDQUFnQitXLElBQUlqUyxTQUFwQixDQUErQixDQUEvQixDQUFrQzk4RCxPQUFPa3ZCLEtBQXpDLEVBRUFsdkIsT0FBT2t2QixLQUFQLENBQWUsQ0FBZixDQUVBLENBNUZELENBOEZBLEtBQUt3b0Msa0JBQUwsQ0FBMEIsU0FBVzkvQixNQUFYLENBQW1CMGEsR0FBbkIsQ0FBd0I3UixRQUF4QixDQUFrQ2djLFFBQWxDLENBQTRDejhDLE1BQTVDLENBQW9EcWdELEtBQXBELENBQTRELENBRXJGLGdCQUFvQnJnRCxPQUFPMmlELE1BQVAsRUFBaUIzaUQsT0FBTzgzQixXQUFQLENBQW1CeEksV0FBbkIsR0FBbUMsQ0FBeEUsQ0FFQXB4QixNQUFNbzhFLFdBQU4sQ0FBbUI3OUIsUUFBbkIsQ0FBNkI4N0IsV0FBN0IsRUFFQSxZQUFjNlcsV0FBWXgzRCxNQUFaLENBQW9CMGEsR0FBcEIsQ0FBeUJtSyxRQUF6QixDQUFtQ3o4QyxNQUFuQyxDQUFkLENBQ0Esb0JBQXNCeWdDLFNBQVNyNEIsRUFBVCxDQUFjLEdBQWQsQ0FBb0JtMUQsUUFBUW4xRCxFQUE1QixDQUFpQyxHQUFqQyxFQUF5Q3EwQyxTQUFTdVIsU0FBVCxHQUF1QixJQUFoRSxDQUF0QixDQUVBLGtCQUFvQixLQUFwQixDQUVBLEdBQUtxaEMsa0JBQW9CdkUsdUJBQXpCLENBQW1ELENBRWxEQSx3QkFBMEJ1RSxlQUExQixDQUNBQyxjQUFnQixJQUFoQixDQUVBLENBRUQsR0FBS3R2RixPQUFPdzBELHFCQUFaLENBQW9DLENBRW5DNjNCLGFBQWFsNEQsTUFBYixDQUFxQm4wQixNQUFyQixDQUE2QnlnQyxRQUE3QixDQUF1Q2djLFFBQXZDLENBQWlEOGdCLE9BQWpELEVBRUEreEIsY0FBZ0IsSUFBaEIsQ0FFQSxDQUVEO0VBRUEsVUFBWTd1RCxTQUFTcjVCLEtBQXJCLENBQ0EsYUFBZXE1QixTQUFTSyxVQUFULENBQW9CMVAsUUFBbkMsQ0FDQSxnQkFBa0IsQ0FBbEIsQ0FFQSxHQUFLcXJCLFNBQVN1UixTQUFULEdBQXVCLElBQTVCLENBQW1DLENBRWxDNW1ELE1BQVE2MEMsV0FBV3FnQixxQkFBWCxDQUFrQzc3QixRQUFsQyxDQUFSLENBQ0E4dUQsWUFBYyxDQUFkLENBRUEsQ0FFRCxhQUFBLENBQ0EsYUFBZWpELGNBQWYsQ0FFQSxHQUFLbGxGLFFBQVUsSUFBZixDQUFzQixDQUVyQjZnQixVQUFZNlksV0FBVzU4QixHQUFYLENBQWdCa0QsS0FBaEIsQ0FBWixDQUVBc3ZELFNBQVc2MUIscUJBQVgsQ0FDQTcxQixTQUFTL08sUUFBVCxDQUFtQjEvQixTQUFuQixFQUVBLENBRUQsR0FBS3FuRSxhQUFMLENBQXFCLENBRXBCRSxzQkFBdUIveUMsUUFBdkIsQ0FBaUM4Z0IsT0FBakMsQ0FBMEM5OEIsUUFBMUMsRUFFQSxHQUFLcjVCLFFBQVUsSUFBZixDQUFzQixDQUVyQjJuRSxJQUFJcjRCLFVBQUosQ0FBZ0JxNEIsSUFBSTdTLG9CQUFwQixDQUEwQ2owQyxVQUFVMHVCLE1BQXBELEVBRUEsQ0FFRCxDQUVEO0VBRUEsY0FBZ0I3WCxRQUFoQixDQUVBLEdBQUsxM0IsUUFBVSxJQUFmLENBQXNCLENBRXJCcW9GLFVBQVlyb0YsTUFBTThuQixLQUFsQixDQUVBLENBSkQsUUFJWWtDLFdBQWF0eUIsU0FBbEIsQ0FBOEIsQ0FFcEMyd0YsVUFBWXIrRCxTQUFTbEMsS0FBckIsQ0FFQSxDQUVELGVBQWlCdVIsU0FBUyttQixTQUFULENBQW1CeGpCLEtBQW5CLENBQTJCdXJELFdBQTVDLENBQ0EsZUFBaUI5dUQsU0FBUyttQixTQUFULENBQW1CdDRCLEtBQW5CLENBQTJCcWdFLFdBQTVDLENBRUEsZUFBaUJsdkMsUUFBVSxJQUFWLENBQWlCQSxNQUFNcmMsS0FBTixDQUFjdXJELFdBQS9CLENBQTZDLENBQTlELENBQ0EsZUFBaUJsdkMsUUFBVSxJQUFWLENBQWlCQSxNQUFNbnhCLEtBQU4sQ0FBY3FnRSxXQUEvQixDQUE2Q3p3RCxRQUE5RCxDQUVBLGNBQWdCejhCLEtBQUs4RSxHQUFMLENBQVV1b0YsVUFBVixDQUFzQi9rQyxVQUF0QixDQUFoQixDQUNBLFlBQWN0b0QsS0FBSzZFLEdBQUwsQ0FBVXVvRixTQUFWLENBQXFCQyxXQUFhQyxVQUFsQyxDQUE4Q2hsQyxXQUFhRCxVQUEzRCxFQUEwRSxDQUF4RixDQUVBLGNBQWdCcm9ELEtBQUs4RSxHQUFMLENBQVUsQ0FBVixDQUFheW9GLFFBQVVDLFNBQVYsQ0FBc0IsQ0FBbkMsQ0FBaEIsQ0FFQSxHQUFLQyxZQUFjLENBQW5CLENBQXVCLE9BRXZCO0VBRUEsR0FBSzl2RixPQUFPMmlELE1BQVosQ0FBcUIsQ0FFcEIsR0FBS2xHLFNBQVN1UixTQUFULEdBQXVCLElBQTVCLENBQW1DLENBRWxDOXZELE1BQU1xOEUsWUFBTixDQUFvQjk5QixTQUFTd1Isa0JBQVQsQ0FBOEI4aEMscUJBQWxELEVBQ0FyNUIsU0FBU3lCLE9BQVQsQ0FBa0I0VyxJQUFJOVIsS0FBdEIsRUFFQSxDQUxELElBS08sQ0FFTixPQUFTajlELE9BQU9tMEQsUUFBaEIsRUFFQyxzQkFBQSxDQUNDdUMsU0FBU3lCLE9BQVQsQ0FBa0I0VyxJQUFJalMsU0FBdEIsRUFDQSxNQUVELDBCQUFBLENBQ0NwRyxTQUFTeUIsT0FBVCxDQUFrQjRXLElBQUloUyxjQUF0QixFQUNBLE1BRUQsd0JBQUEsQ0FDQ3JHLFNBQVN5QixPQUFULENBQWtCNFcsSUFBSS9SLFlBQXRCLEVBQ0EsTUFaRixDQWdCQSxDQUdELENBNUJELFFBNEJZaDlELE9BQU9xb0QsTUFBWixDQUFxQixDQUUzQixjQUFnQjVMLFNBQVNxUixTQUF6QixDQUVBLEdBQUt1ckIsWUFBY3Y2RSxTQUFuQixDQUErQnU2RSxVQUFZLENBQVosQ0FBZTtFQUU5Q243RSxNQUFNcThFLFlBQU4sQ0FBb0JsQixVQUFZMFcscUJBQWhDLEVBRUEsR0FBSy92RixPQUFPZ3dGLGNBQVosQ0FBNkIsQ0FFNUJ0NUIsU0FBU3lCLE9BQVQsQ0FBa0I0VyxJQUFJOVIsS0FBdEIsRUFFQSxDQUpELFFBSVlqOUQsT0FBT2l3RixVQUFaLENBQXlCLENBRS9CdjVCLFNBQVN5QixPQUFULENBQWtCNFcsSUFBSTVSLFNBQXRCLEVBRUEsQ0FKTSxJQUlBLENBRU56RyxTQUFTeUIsT0FBVCxDQUFrQjRXLElBQUk3UixVQUF0QixFQUVBLENBRUQsQ0F0Qk0sUUFzQktsOUQsT0FBT29vRCxRQUFaLENBQXVCLENBRTdCc08sU0FBU3lCLE9BQVQsQ0FBa0I0VyxJQUFJM1IsTUFBdEIsRUFFQSxDQUVELEdBQUszOEIsVUFBWUEsU0FBU3l2RCx5QkFBMUIsQ0FBc0QsQ0FFckQsR0FBS3p2RCxTQUFTeTNCLGlCQUFULENBQTZCLENBQWxDLENBQXNDLENBRXJDeEIsU0FBUzBCLGVBQVQsQ0FBMEIzM0IsUUFBMUIsQ0FBb0NvdkQsU0FBcEMsQ0FBK0NDLFNBQS9DLEVBRUEsQ0FFRCxDQVJELElBUU8sQ0FFTnA1QixTQUFTcUIsTUFBVCxDQUFpQjgzQixTQUFqQixDQUE0QkMsU0FBNUIsRUFFQSxDQUVELENBbEtELENBb0tBLDhCQUFBLENBQWdDcnpDLFFBQWhDLENBQTBDOGdCLE9BQTFDLENBQW1EOThCLFFBQW5ELENBQThELENBRTdELEdBQUtBLFVBQVlBLFNBQVN5dkQseUJBQTFCLENBQXNELENBRXJELEdBQUt0d0UsV0FBVzFiLEdBQVgsQ0FBZ0Isd0JBQWhCLElBQStDLElBQXBELENBQTJELENBRTFEdVIsUUFBUU0sS0FBUixDQUFlLGdKQUFmLEVBQ0EsT0FFQSxDQUVELENBRUQ3WCxNQUFNc3pFLGNBQU4sR0FFQSx1QkFBeUIvd0MsU0FBU0ssVUFBbEMsQ0FFQSxzQkFBd0J5OEIsUUFBUWlLLGFBQVIsRUFBeEIsQ0FFQSxtQ0FBcUMvcUIsU0FBU3dTLHNCQUE5QyxDQUVBLElBQU0sUUFBTixxQkFBQSxDQUFzQyxDQUVyQyxxQkFBdUJ5L0Isa0JBQW1CbHlGLElBQW5CLENBQXZCLENBRUEsR0FBSzJ6RixrQkFBb0IsQ0FBekIsQ0FBNkIsQ0FFNUIsc0JBQXdCaDBCLG1CQUFvQjMvRCxJQUFwQixDQUF4QixDQUVBLEdBQUs0ekYsb0JBQXNCdHhGLFNBQTNCLENBQXVDLENBRXRDLGVBQWlCc3hGLGtCQUFrQm5yQyxVQUFuQyxDQUNBLFNBQVdtckMsa0JBQWtCcHJDLFFBQTdCLENBRUEsY0FBZ0Jsa0IsV0FBVzU4QixHQUFYLENBQWdCa3NGLGlCQUFoQixDQUFoQixDQUVBO0VBRUEsR0FBS25vRSxZQUFjbnBCLFNBQW5CLENBQStCLFNBRS9CLFdBQWFtcEIsVUFBVTB1QixNQUF2QixDQUNBLFNBQVcxdUIsVUFBVTlzQixJQUFyQixDQUNBLG9CQUFzQjhzQixVQUFVcXZCLGVBQWhDLENBRUEsR0FBSzg0QyxrQkFBa0J6NEMsNEJBQXZCLENBQXNELENBRXJELFNBQVd5NEMsa0JBQWtCdmdGLElBQTdCLENBQ0EsV0FBYUEsS0FBS3dnRixNQUFsQixDQUNBLFdBQWFELGtCQUFrQnRvRSxNQUEvQixDQUVBLEdBQUtqWSxNQUFRQSxLQUFLeWdGLDRCQUFsQixDQUFpRCxDQUVoRHB5RixNQUFNazhFLHlCQUFOLENBQWlDK1YsZ0JBQWpDLENBQW1EdGdGLEtBQUsrbUUsZ0JBQXhELEVBRUEsR0FBS24yQyxTQUFTeTNCLGlCQUFULEdBQStCcDVELFNBQXBDLENBQWdELENBRS9DMmhDLFNBQVN5M0IsaUJBQVQsQ0FBNkJyb0QsS0FBSyttRSxnQkFBTCxDQUF3Qi9tRSxLQUFLcWYsS0FBMUQsQ0FFQSxDQUVELENBVkQsSUFVTyxDQUVOaHhCLE1BQU11ekUsZUFBTixDQUF1QjBlLGdCQUF2QixFQUVBLENBRURwaEIsSUFBSXI0QixVQUFKLENBQWdCcTRCLElBQUkzUyxZQUFwQixDQUFrQ3psQixNQUFsQyxFQUNBbzRCLElBQUk2QyxtQkFBSixDQUF5QnVlLGdCQUF6QixDQUEyQ3B3RCxJQUEzQyxDQUFpRDVrQyxJQUFqRCxDQUF1RDhwRCxVQUF2RCxDQUFtRW9yQyxPQUFTLzRDLGVBQTVFLENBQTZGeHZCLE9BQVN3dkIsZUFBdEcsRUFFQSxDQXpCRCxJQXlCTyxDQUVOLEdBQUs4NEMsa0JBQWtCRywwQkFBdkIsQ0FBb0QsQ0FFbkRyeUYsTUFBTWs4RSx5QkFBTixDQUFpQytWLGdCQUFqQyxDQUFtREMsa0JBQWtCeFosZ0JBQXJFLEVBRUEsR0FBS24yQyxTQUFTeTNCLGlCQUFULEdBQStCcDVELFNBQXBDLENBQWdELENBRS9DMmhDLFNBQVN5M0IsaUJBQVQsQ0FBNkJrNEIsa0JBQWtCeFosZ0JBQWxCLENBQXFDd1osa0JBQWtCbGhFLEtBQXBGLENBRUEsQ0FFRCxDQVZELElBVU8sQ0FFTmh4QixNQUFNdXpFLGVBQU4sQ0FBdUIwZSxnQkFBdkIsRUFFQSxDQUVEcGhCLElBQUlyNEIsVUFBSixDQUFnQnE0QixJQUFJM1MsWUFBcEIsQ0FBa0N6bEIsTUFBbEMsRUFDQW80QixJQUFJNkMsbUJBQUosQ0FBeUJ1ZSxnQkFBekIsQ0FBMkNwd0QsSUFBM0MsQ0FBaUQ1a0MsSUFBakQsQ0FBdUQ4cEQsVUFBdkQsQ0FBbUUsQ0FBbkUsQ0FBc0UsQ0FBdEUsRUFFQSxDQUVELENBL0RELFFBK0RZdXJDLGlDQUFtQzF4RixTQUF4QyxDQUFvRCxDQUUxRCxVQUFZMHhGLCtCQUFnQ2gwRixJQUFoQyxDQUFaLENBRUEsR0FBS1csUUFBVTJCLFNBQWYsQ0FBMkIsQ0FFMUIsT0FBUzNCLE1BQU1nRCxNQUFmLEVBRUMsTUFBQSxDQUNDNHVFLElBQUkwaEIsZUFBSixDQUFxQk4sZ0JBQXJCLENBQXVDaHpGLEtBQXZDLEVBQ0EsTUFFRCxNQUFBLENBQ0M0eEUsSUFBSTJoQixlQUFKLENBQXFCUCxnQkFBckIsQ0FBdUNoekYsS0FBdkMsRUFDQSxNQUVELE1BQUEsQ0FDQzR4RSxJQUFJNGhCLGVBQUosQ0FBcUJSLGdCQUFyQixDQUF1Q2h6RixLQUF2QyxFQUNBLE1BRUQsUUFDQzR4RSxJQUFJNmhCLGVBQUosQ0FBcUJULGdCQUFyQixDQUF1Q2h6RixLQUF2QyxFQWZGLENBbUJBLENBRUQsQ0FFRCxDQUVELENBRURlLE1BQU13ekUsdUJBQU4sR0FFQSxDQUVEO0VBRUEsS0FBS21mLE9BQUwsQ0FBZSxTQUFXaDZCLEtBQVgsQ0FBa0JqL0IsTUFBbEIsQ0FBMkIsQ0FFekNrNUQsbUJBQXFCeGpCLGFBQWFwcEUsR0FBYixDQUFrQjJ5RCxLQUFsQixDQUF5QmovQixNQUF6QixDQUFyQixDQUNBazVELG1CQUFtQm4yQixJQUFuQixHQUVBOUQsTUFBTTcxQixRQUFOLENBQWdCLFNBQVdoaEMsTUFBWCxDQUFvQixDQUVuQyxHQUFLQSxPQUFPK3dGLE9BQVosQ0FBc0IsQ0FFckJELG1CQUFtQjNqQixTQUFuQixDQUE4Qm50RSxNQUE5QixFQUVBLEdBQUtBLE9BQU8yNUMsVUFBWixDQUF5QixDQUV4Qm0zQyxtQkFBbUIxakIsVUFBbkIsQ0FBK0JwdEUsTUFBL0IsRUFFQSxDQUVELENBRUQsQ0FkRCxFQWdCQTh3RixtQkFBbUI1akIsV0FBbkIsQ0FBZ0N0MUMsTUFBaEMsRUFFQWkvQixNQUFNNzFCLFFBQU4sQ0FBZ0IsU0FBV2hoQyxNQUFYLENBQW9CLENBRW5DLEdBQUtBLE9BQU95OEMsUUFBWixDQUF1QixDQUV0QixHQUFLbnZDLE1BQU15TSxPQUFOLENBQWUvWixPQUFPeThDLFFBQXRCLENBQUwsQ0FBd0MsQ0FFdkMsSUFBTSxNQUFRLENBQWQsQ0FBaUJqOEMsRUFBSVIsT0FBT3k4QyxRQUFQLENBQWdCdDhDLE1BQXJDLENBQTZDSyxHQUE3QyxDQUFvRCxDQUVuRHd3RixhQUFjaHhGLE9BQU95OEMsUUFBUCxDQUFpQmo4QyxDQUFqQixDQUFkLENBQW9DcTJELE1BQU12a0IsR0FBMUMsQ0FBK0N0eUMsTUFBL0MsRUFFQSxDQUVELENBUkQsSUFRTyxDQUVOZ3hGLGFBQWNoeEYsT0FBT3k4QyxRQUFyQixDQUErQm9hLE1BQU12a0IsR0FBckMsQ0FBMEN0eUMsTUFBMUMsRUFFQSxDQUVELENBRUQsQ0FwQkQsRUFzQkEsQ0E3Q0QsQ0ErQ0E7RUFFQSxnQkFBa0IsS0FBbEIsQ0FDQSxxQkFBdUIsSUFBdkIsQ0FFQSx1QkFBQSxFQUEwQixDQUV6QixHQUFLaXhGLFdBQUwsQ0FBbUIsT0FFbkJDLDRCQUVBRCxZQUFjLElBQWQsQ0FFQSxDQUVELHNCQUFBLEVBQXlCLENBRXhCQSxZQUFjLEtBQWQsQ0FFQSxDQUVELGtDQUFBLEVBQXFDLENBRXBDLFdBQWFyRSxHQUFHOUUsU0FBSCxFQUFiLENBRUEsR0FBS1gsUUFBVUEsT0FBT0MsWUFBdEIsQ0FBcUMsQ0FFcENELE9BQU9nSyxxQkFBUCxDQUE4QkMsYUFBOUIsRUFFQSxDQUpELElBSU8sQ0FFTmh1RixPQUFPK3RGLHFCQUFQLENBQThCQyxhQUE5QixFQUVBLENBRUQsQ0FFRCxzQkFBQSxDQUF3QkMsSUFBeEIsQ0FBK0IsQ0FFOUIsR0FBS0osY0FBZ0IsS0FBckIsQ0FBNkIsT0FFN0JLLGlCQUFrQkQsSUFBbEIsRUFFQUgsNEJBRUEsQ0FFRCxLQUFLSyxPQUFMLENBQWUsU0FBVzU2RCxRQUFYLENBQXNCLENBRXBDMjZELGlCQUFtQjM2RCxRQUFuQixDQUNBMjZELG1CQUFxQixJQUFyQixDQUE0QkUsZ0JBQTVCLENBQStDekQsZUFBL0MsQ0FFQSxDQUxELENBT0E7RUFFQSxLQUFLaDJCLE1BQUwsQ0FBYyxTQUFXbEIsS0FBWCxDQUFrQmovQixNQUFsQixDQUEwQndqRCxZQUExQixDQUF3Q3RrQixVQUF4QyxDQUFxRCxDQUVsRSxHQUFLLEVBQUlsL0IsUUFBVUEsT0FBT3dqQixRQUFyQixDQUFMLENBQXVDLENBRXRDM2xDLFFBQVFNLEtBQVIsQ0FBZSx3RUFBZixFQUNBLE9BRUEsQ0FFRCxHQUFLMjBFLGNBQUwsQ0FBc0IsT0FFdEI7RUFFQUksd0JBQTBCLEVBQTFCLENBQ0FELG1CQUFxQixDQUFFLENBQXZCLENBQ0FFLGVBQWlCLElBQWpCLENBRUE7RUFFQSxHQUFLbDBCLE1BQU1nWSxVQUFOLEdBQXFCLElBQTFCLENBQWlDaFksTUFBTTkxQixpQkFBTixHQUVqQztFQUVBLEdBQUtuSixPQUFPcG1CLE1BQVAsR0FBa0IsSUFBdkIsQ0FBOEJvbUIsT0FBT21KLGlCQUFQLEdBRTlCLEdBQUs2ckQsR0FBR252QyxPQUFSLENBQWtCLENBRWpCN2xCLE9BQVNnMUQsR0FBRzFFLFNBQUgsQ0FBY3R3RCxNQUFkLENBQVQsQ0FFQSxDQUVEO0VBRUFrNUQsbUJBQXFCeGpCLGFBQWFwcEUsR0FBYixDQUFrQjJ5RCxLQUFsQixDQUF5QmovQixNQUF6QixDQUFyQixDQUNBazVELG1CQUFtQm4yQixJQUFuQixHQUVBOUQsTUFBTTVjLGNBQU4sQ0FBc0J3eUMsS0FBdEIsQ0FBNkI1MUIsS0FBN0IsQ0FBb0NqL0IsTUFBcEMsQ0FBNEN3akQsWUFBNUMsRUFFQXZOLGtCQUFrQjlnRCxnQkFBbEIsQ0FBb0M2SyxPQUFPQyxnQkFBM0MsQ0FBNkRELE9BQU9tbEIsa0JBQXBFLEVBQ0FnekIsU0FBUy9xQyxhQUFULENBQXdCNm9DLGlCQUF4QixFQUVBZ2Usc0JBQXdCLEtBQUt4eEIsb0JBQTdCLENBQ0F1eEIsaUJBQW1CRCxVQUFVaHhCLElBQVYsQ0FBZ0IsS0FBS25PLGNBQXJCLENBQXFDcS9CLHFCQUFyQyxDQUE0RGowRCxNQUE1RCxDQUFuQixDQUVBNjVELGtCQUFvQnJGLFlBQVlsb0YsR0FBWixDQUFpQjJ5RCxLQUFqQixDQUF3QmovQixNQUF4QixDQUFwQixDQUNBNjVELGtCQUFrQjkyQixJQUFsQixHQUVBKzJCLGNBQWU3NkIsS0FBZixDQUFzQmovQixNQUF0QixDQUE4QjYwRCxNQUFNbkMsV0FBcEMsRUFFQSxHQUFLbUMsTUFBTW5DLFdBQU4sR0FBc0IsSUFBM0IsQ0FBa0MsQ0FFakNtSCxrQkFBa0JudUMsSUFBbEIsR0FFQSxDQUVEO0VBRUEsR0FBS3NvQyxnQkFBTCxDQUF3QkQsVUFBVTd3QixZQUFWLEdBRXhCLGlCQUFtQmcyQixtQkFBbUI1eUYsS0FBbkIsQ0FBeUI2dUUsWUFBNUMsQ0FFQXRDLFVBQVUxUyxNQUFWLENBQWtCZ1YsWUFBbEIsQ0FBZ0NsVyxLQUFoQyxDQUF1Q2ovQixNQUF2QyxFQUVBazVELG1CQUFtQjVqQixXQUFuQixDQUFnQ3QxQyxNQUFoQyxFQUVBLEdBQUtnMEQsZ0JBQUwsQ0FBd0JELFVBQVU1d0IsVUFBVixHQUV4QjtFQUVBLEdBQUssS0FBSy83RCxJQUFMLENBQVVzK0QsU0FBZixDQUEyQixLQUFLdCtELElBQUwsQ0FBVWMsS0FBVixHQUUzQixHQUFLczdFLGVBQWlCdDhFLFNBQXRCLENBQWtDLENBRWpDczhFLGFBQWUsSUFBZixDQUVBLENBRUQsS0FBS3pMLGVBQUwsQ0FBc0J5TCxZQUF0QixFQUVBO0VBRUFya0IsV0FBV2dCLE1BQVgsQ0FBbUIwNUIsaUJBQW5CLENBQXNDNTZCLEtBQXRDLENBQTZDai9CLE1BQTdDLENBQXFEay9CLFVBQXJELEVBRUE7RUFFQSxrQkFBb0IyNkIsa0JBQWtCeG1CLE1BQXRDLENBQ0EsdUJBQXlCd21CLGtCQUFrQi9sQyxXQUEzQyxDQUVBLEdBQUttTCxNQUFNODZCLGdCQUFYLENBQThCLENBRTdCLHFCQUF1Qjk2QixNQUFNODZCLGdCQUE3QixDQUVBLEdBQUtDLGNBQWN6eEYsTUFBbkIsQ0FBNEIweEYsY0FBZUQsYUFBZixDQUE4Qi82QixLQUE5QixDQUFxQ2ovQixNQUFyQyxDQUE2Qys1RCxnQkFBN0MsRUFDNUIsR0FBS0csbUJBQW1CM3hGLE1BQXhCLENBQWlDMHhGLGNBQWVDLGtCQUFmLENBQW1DajdCLEtBQW5DLENBQTBDai9CLE1BQTFDLENBQWtEKzVELGdCQUFsRCxFQUVqQyxDQVBELElBT087RUFJTixHQUFLQyxjQUFjenhGLE1BQW5CLENBQTRCMHhGLGNBQWVELGFBQWYsQ0FBOEIvNkIsS0FBOUIsQ0FBcUNqL0IsTUFBckMsRUFFNUI7RUFFQSxHQUFLazZELG1CQUFtQjN4RixNQUF4QixDQUFpQzB4RixjQUFlQyxrQkFBZixDQUFtQ2o3QixLQUFuQyxDQUEwQ2ovQixNQUExQyxFQUVqQyxDQUVEO0VBRUEsaUJBQW1CazVELG1CQUFtQjV5RixLQUFuQixDQUF5Qjh1RSxZQUE1QyxDQUVBMGYsZUFBZTMwQixNQUFmLENBQXVCaVYsWUFBdkIsQ0FBcUNuVyxLQUFyQyxDQUE0Q2ovQixNQUE1QyxFQUVBO0VBRUEsR0FBS3dqRCxZQUFMLENBQW9CLENBRW5CaC9DLFNBQVNra0Qsd0JBQVQsQ0FBbUNsRixZQUFuQyxFQUVBLENBRUQ7RUFFQWw5RSxNQUFNMDVDLE9BQU4sQ0FBY3RDLEtBQWQsQ0FBb0IyNUIsT0FBcEIsQ0FBNkIsSUFBN0IsRUFDQS93RSxNQUFNMDVDLE9BQU4sQ0FBY3RDLEtBQWQsQ0FBb0JpOUIsT0FBcEIsQ0FBNkIsSUFBN0IsRUFDQXIwRSxNQUFNMDVDLE9BQU4sQ0FBY2xKLEtBQWQsQ0FBb0I2akMsT0FBcEIsQ0FBNkIsSUFBN0IsRUFFQXIwRSxNQUFNczZFLGdCQUFOLENBQXdCLEtBQXhCLEVBRUEzaEIsTUFBTTNjLGFBQU4sQ0FBcUJ1eUMsS0FBckIsQ0FBNEI1MUIsS0FBNUIsQ0FBbUNqL0IsTUFBbkMsRUFFQSxHQUFLZzFELEdBQUdudkMsT0FBUixDQUFrQixDQUVqQm12QyxHQUFHcEQsV0FBSCxHQUVBLENBRUQ7RUFFQWlJLGtCQUFvQixJQUFwQixDQUNBWCxtQkFBcUIsSUFBckIsQ0FFQSxDQTlJRCxDQWdKQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7S0F1REEsc0JBQUEsQ0FBd0I5d0YsTUFBeEIsQ0FBZ0M0M0IsTUFBaEMsQ0FBd0MweUQsV0FBeEMsQ0FBc0QsQ0FFckQsR0FBS3RxRixPQUFPMDVDLE9BQVAsR0FBbUIsS0FBeEIsQ0FBZ0MsT0FFaEMsWUFBYzE1QyxPQUFPZzVDLE1BQVAsQ0FBY2g3QixJQUFkLENBQW9CNFosT0FBT29oQixNQUEzQixDQUFkLENBRUEsR0FBS1UsT0FBTCxDQUFlLENBRWQsR0FBSzE1QyxPQUFPK3dGLE9BQVosQ0FBc0IsQ0FFckJELG1CQUFtQjNqQixTQUFuQixDQUE4Qm50RSxNQUE5QixFQUVBLEdBQUtBLE9BQU8yNUMsVUFBWixDQUF5QixDQUV4Qm0zQyxtQkFBbUIxakIsVUFBbkIsQ0FBK0JwdEUsTUFBL0IsRUFFQSxDQUVELENBVkQsUUFVWUEsT0FBTyt4RixRQUFaLENBQXVCLENBRTdCLEdBQUssQ0FBRS94RixPQUFPNjVDLGFBQVQsRUFBMEJrMkIsU0FBUzNwQyxnQkFBVCxDQUEyQnBtQyxNQUEzQixDQUEvQixDQUFxRSxDQUVwRTh3RixtQkFBbUJ6akIsVUFBbkIsQ0FBK0JydEUsTUFBL0IsRUFFQSxDQUVELENBUk0sUUFRS0EsT0FBT2d5Rix1QkFBWixDQUFzQyxDQUU1QyxHQUFLMUgsV0FBTCxDQUFtQixDQUVsQndCLFNBQVN6eUQscUJBQVQsQ0FBZ0NyNUIsT0FBTzgzQixXQUF2QyxFQUNFMUksWUFERixDQUNnQnkrQyxpQkFEaEIsRUFHQSxDQUVENGpCLGtCQUFrQjl4RixJQUFsQixDQUF3QkssTUFBeEIsQ0FBZ0MsSUFBaEMsQ0FBc0NBLE9BQU95OEMsUUFBN0MsQ0FBdURxdkMsU0FBUzFoRSxDQUFoRSxDQUFtRSxJQUFuRSxFQUVBLENBWE0sUUFXS3BxQixPQUFPMmlELE1BQVAsRUFBaUIzaUQsT0FBT3FvRCxNQUF4QixFQUFrQ3JvRCxPQUFPb29ELFFBQTlDLENBQXlELENBRS9ELEdBQUtwb0QsT0FBT3VwRSxhQUFaLENBQTRCLENBRTNCdnBFLE9BQU80b0UsUUFBUCxDQUFnQnowQyxNQUFoQixHQUVBLENBRUQsR0FBSyxDQUFFbjBCLE9BQU82NUMsYUFBVCxFQUEwQmsyQixTQUFTOXBDLGdCQUFULENBQTJCam1DLE1BQTNCLENBQS9CLENBQXFFLENBRXBFLEdBQUtzcUYsV0FBTCxDQUFtQixDQUVsQndCLFNBQVN6eUQscUJBQVQsQ0FBZ0NyNUIsT0FBTzgzQixXQUF2QyxFQUNFMUksWUFERixDQUNnQnkrQyxpQkFEaEIsRUFHQSxDQUVELGFBQWVzZSxRQUFRaDRELE1BQVIsQ0FBZ0JuMEIsTUFBaEIsQ0FBZixDQUNBLGFBQWVBLE9BQU95OEMsUUFBdEIsQ0FFQSxHQUFLbnZDLE1BQU15TSxPQUFOLENBQWUwaUMsUUFBZixDQUFMLENBQWlDLENBRWhDLFdBQWFoYyxTQUFTMmYsTUFBdEIsQ0FFQSxJQUFNLE1BQVEsQ0FBUixDQUFXbjlDLEVBQUltOUMsT0FBT2pnRCxNQUE1QixDQUFvQ0ssRUFBSXlDLENBQXhDLENBQTJDekMsR0FBM0MsQ0FBa0QsQ0FFakQsVUFBWTQvQyxPQUFRNS9DLENBQVIsQ0FBWixDQUNBLGtCQUFvQmk4QyxTQUFVNEQsTUFBTXBDLGFBQWhCLENBQXBCLENBRUEsR0FBSzB5QixlQUFpQkEsY0FBY2ozQixPQUFwQyxDQUE4QyxDQUU3QyszQyxrQkFBa0I5eEYsSUFBbEIsQ0FBd0JLLE1BQXhCLENBQWdDeWdDLFFBQWhDLENBQTBDa3dDLGFBQTFDLENBQXlEbWIsU0FBUzFoRSxDQUFsRSxDQUFxRWkyQixLQUFyRSxFQUVBLENBRUQsQ0FFRCxDQWpCRCxRQWlCWTVELFNBQVMvQyxPQUFkLENBQXdCLENBRTlCKzNDLGtCQUFrQjl4RixJQUFsQixDQUF3QkssTUFBeEIsQ0FBZ0N5Z0MsUUFBaEMsQ0FBMENnYyxRQUExQyxDQUFvRHF2QyxTQUFTMWhFLENBQTdELENBQWdFLElBQWhFLEVBRUEsQ0FFRCxDQUVELENBRUQsQ0FFRCxhQUFlcHFCLE9BQU9rNUMsUUFBdEIsQ0FFQSxJQUFNLE1BQVEsQ0FBUixDQUFXajJDLEVBQUlpMkMsU0FBUy80QyxNQUE5QixDQUFzQ0ssRUFBSXlDLENBQTFDLENBQTZDekMsR0FBN0MsQ0FBb0QsQ0FFbkRreEYsY0FBZXg0QyxTQUFVMTRDLENBQVYsQ0FBZixDQUE4Qm8zQixNQUE5QixDQUFzQzB5RCxXQUF0QyxFQUVBLENBRUQsQ0FFRCxzQkFBQSxDQUF3QjF6QixVQUF4QixDQUFvQ0MsS0FBcEMsQ0FBMkNqL0IsTUFBM0MsQ0FBbUQrNUQsZ0JBQW5ELENBQXNFLENBRXJFLElBQU0sTUFBUSxDQUFSLENBQVcxdUYsRUFBSTJ6RCxXQUFXejJELE1BQWhDLENBQXdDSyxFQUFJeUMsQ0FBNUMsQ0FBK0N6QyxHQUEvQyxDQUFzRCxDQUVyRCxlQUFpQm8yRCxXQUFZcDJELENBQVosQ0FBakIsQ0FFQSxXQUFhMnFFLFdBQVduckUsTUFBeEIsQ0FDQSxhQUFlbXJFLFdBQVcxcUMsUUFBMUIsQ0FDQSxhQUFla3hELG1CQUFxQjd5RixTQUFyQixDQUFpQ3FzRSxXQUFXMXVCLFFBQTVDLENBQXVEazFDLGdCQUF0RSxDQUNBLFVBQVl4bUIsV0FBVzlxQixLQUF2QixDQUVBLEdBQUt6b0IsT0FBTyt1RCxhQUFaLENBQTRCLENBRTNCcUUsb0JBQXNCcHpELE1BQXRCLENBRUEsWUFBY0EsT0FBTzZ1RCxPQUFyQixDQUVBLElBQU0sTUFBUSxDQUFSLENBQVdobkMsR0FBS2duQyxRQUFRdG1GLE1BQTlCLENBQXNDaWMsRUFBSXFqQyxFQUExQyxDQUE4Q3JqQyxHQUE5QyxDQUFxRCxDQUVwRCxZQUFjcXFFLFFBQVNycUUsQ0FBVCxDQUFkLENBRUEsR0FBS3BjLE9BQU9nNUMsTUFBUCxDQUFjaDdCLElBQWQsQ0FBb0JpMEUsUUFBUWo1QyxNQUE1QixDQUFMLENBQTRDLENBRTNDLFdBQWFpNUMsUUFBUWpMLE1BQXJCLENBRUEsTUFBUUEsT0FBT2owRSxDQUFQLENBQVdzNEUsTUFBbkIsQ0FDQSxNQUFRckUsT0FBT3pqRSxDQUFQLENBQVcrbkUsT0FBbkIsQ0FDQSxVQUFZdEUsT0FBTzU4RCxDQUFQLENBQVdpaEUsTUFBdkIsQ0FDQSxXQUFhckUsT0FBT2x1RSxDQUFQLENBQVd3eUUsT0FBeEIsQ0FFQXB0RixNQUFNNi9CLFFBQU4sQ0FBZ0JrdEQsaUJBQWlCbjZFLEdBQWpCLENBQXNCaUMsQ0FBdEIsQ0FBeUJ3USxDQUF6QixDQUE0QmdaLEtBQTVCLENBQW1DQyxNQUFuQyxFQUE0QzFXLGNBQTVDLENBQTREeWxFLFdBQTVELENBQWhCLEVBRUF2YixhQUFjaHdFLE1BQWQsQ0FBc0I2MkQsS0FBdEIsQ0FBNkJvN0IsT0FBN0IsQ0FBc0N4eEQsUUFBdEMsQ0FBZ0RnYyxRQUFoRCxDQUEwRDRELEtBQTFELEVBRUEsQ0FFRCxDQUVELENBM0JELElBMkJPLENBRU4ycUMsb0JBQXNCLElBQXRCLENBRUFoYixhQUFjaHdFLE1BQWQsQ0FBc0I2MkQsS0FBdEIsQ0FBNkJqL0IsTUFBN0IsQ0FBcUM2SSxRQUFyQyxDQUErQ2djLFFBQS9DLENBQXlENEQsS0FBekQsRUFFQSxDQUVELENBRUQsQ0FFRCxxQkFBQSxDQUF1QnJnRCxNQUF2QixDQUErQjYyRCxLQUEvQixDQUFzQ2ovQixNQUF0QyxDQUE4QzZJLFFBQTlDLENBQXdEZ2MsUUFBeEQsQ0FBa0U0RCxLQUFsRSxDQUEwRSxDQUV6RXJnRCxPQUFPaTZDLGNBQVAsQ0FBdUJ3eUMsS0FBdkIsQ0FBOEI1MUIsS0FBOUIsQ0FBcUNqL0IsTUFBckMsQ0FBNkM2SSxRQUE3QyxDQUF1RGdjLFFBQXZELENBQWlFNEQsS0FBakUsRUFDQXl3QyxtQkFBcUJ4akIsYUFBYXBwRSxHQUFiLENBQWtCMnlELEtBQWxCLENBQXlCbTBCLHFCQUF1QnB6RCxNQUFoRCxDQUFyQixDQUVBNTNCLE9BQU91NUMsZUFBUCxDQUF1QnhzQixnQkFBdkIsQ0FBeUM2SyxPQUFPbWxCLGtCQUFoRCxDQUFvRS84QyxPQUFPODNCLFdBQTNFLEVBQ0E5M0IsT0FBT3drQyxZQUFQLENBQW9COUssZUFBcEIsQ0FBcUMxNUIsT0FBT3U1QyxlQUE1QyxFQUVBLEdBQUt2NUMsT0FBT2d5Rix1QkFBWixDQUFzQyxDQUVyQyxnQkFBb0JoeUYsT0FBTzJpRCxNQUFQLEVBQWlCM2lELE9BQU84M0IsV0FBUCxDQUFtQnhJLFdBQW5CLEdBQW1DLENBQXhFLENBRUFweEIsTUFBTW84RSxXQUFOLENBQW1CNzlCLFFBQW5CLENBQTZCODdCLFdBQTdCLEVBRUEsWUFBYzZXLFdBQVl4M0QsTUFBWixDQUFvQmkvQixNQUFNdmtCLEdBQTFCLENBQStCbUssUUFBL0IsQ0FBeUN6OEMsTUFBekMsQ0FBZCxDQUVBOHFGLHdCQUEwQixFQUExQixDQUVBb0gsc0JBQXVCbHlGLE1BQXZCLENBQStCdTlELE9BQS9CLENBQXdDOWdCLFFBQXhDLEVBRUEsQ0FaRCxJQVlPLENBRU5nd0MsTUFBTS8wQixrQkFBTixDQUEwQjkvQixNQUExQixDQUFrQ2kvQixNQUFNdmtCLEdBQXhDLENBQTZDN1IsUUFBN0MsQ0FBdURnYyxRQUF2RCxDQUFpRXo4QyxNQUFqRSxDQUF5RXFnRCxLQUF6RSxFQUVBLENBRURyZ0QsT0FBT2s2QyxhQUFQLENBQXNCdXlDLEtBQXRCLENBQTZCNTFCLEtBQTdCLENBQW9Dai9CLE1BQXBDLENBQTRDNkksUUFBNUMsQ0FBc0RnYyxRQUF0RCxDQUFnRTRELEtBQWhFLEVBQ0F5d0MsbUJBQXFCeGpCLGFBQWFwcEUsR0FBYixDQUFrQjJ5RCxLQUFsQixDQUF5Qm0wQixxQkFBdUJwekQsTUFBaEQsQ0FBckIsQ0FFQSxDQUVELHFCQUFBLENBQXVCNmtCLFFBQXZCLENBQWlDbkssR0FBakMsQ0FBc0N0eUMsTUFBdEMsQ0FBK0MsQ0FFOUMsdUJBQXlCOHlDLFdBQVc1dUMsR0FBWCxDQUFnQnU0QyxRQUFoQixDQUF6QixDQUVBLFdBQWFxMEMsbUJBQW1CNXlGLEtBQW5CLENBQXlCeTBDLE1BQXRDLENBQ0EsaUJBQW1CbStDLG1CQUFtQjV5RixLQUFuQixDQUF5QjZ1RSxZQUE1QyxDQUVBLGVBQWlCeWYsYUFBYXRqQixhQUFiLENBQ2hCenNCLFFBRGdCLENBQ045SixPQUFPejBDLEtBREQsQ0FDUTZ1RSxZQURSLENBQ3NCejZCLEdBRHRCLENBQzJCcTVDLFVBQVVseEIsU0FEckMsQ0FDZ0RreEIsVUFBVWp4QixlQUQxRCxDQUMyRTE2RCxNQUQzRSxDQUFqQixDQUdBLFNBQVd3c0YsYUFBYTloQixjQUFiLENBQTZCanVCLFFBQTdCLENBQXVDRixVQUF2QyxDQUFYLENBRUEsWUFBYzQxQyxtQkFBbUI1MEIsT0FBakMsQ0FDQSxrQkFBb0IsSUFBcEIsQ0FFQSxHQUFLQSxVQUFZeitELFNBQWpCLENBQTZCO0VBRzVCMjlDLFNBQVNoc0MsZ0JBQVQsQ0FBMkIsU0FBM0IsQ0FBc0N3OUUsaUJBQXRDLEVBRUEsQ0FMRCxRQUtZMXdCLFFBQVFvRyxJQUFSLEdBQWlCQSxJQUF0QixDQUE2QjtFQUduQ3dxQixnQ0FBaUMxeEMsUUFBakMsRUFFQSxDQUxNLFFBS0swMUMsbUJBQW1CQyxVQUFuQixHQUFrQ3ovQyxPQUFPejBDLEtBQVAsQ0FBYXFtRCxJQUFwRCxDQUEyRCxDQUVqRXpSLFdBQVczZSxNQUFYLENBQW1Cc29CLFFBQW5CLENBQTZCLFlBQTdCLENBQTJDOUosT0FBT3owQyxLQUFQLENBQWFxbUQsSUFBeEQsRUFDQTh0QyxjQUFnQixLQUFoQixDQUVBLENBTE0sUUFLSzkxQyxXQUFXbXRCLFFBQVgsR0FBd0I1cUUsU0FBN0IsQ0FBeUM7RUFHL0MsT0FFQSxDQUxNLElBS0E7RUFHTnV6RixjQUFnQixLQUFoQixDQUVBLENBRUQsR0FBS0EsYUFBTCxDQUFxQixDQUVwQixHQUFLOTFDLFdBQVdtdEIsUUFBaEIsQ0FBMkIsQ0FFMUIsV0FBYTF6QixVQUFXdUcsV0FBV210QixRQUF0QixDQUFiLENBRUF5b0IsbUJBQW1CcndCLE1BQW5CLENBQTRCLENBQzNCdGxFLEtBQU1pZ0QsU0FBU3RoRCxJQURZLENBRTNCdXlDLFNBQVUyRyxjQUFjbHZCLEtBQWQsQ0FBcUIyOEMsT0FBT3AwQixRQUE1QixDQUZpQixDQUczQjZHLGFBQWN1dEIsT0FBT3Z0QixZQUhNLENBSTNCRSxlQUFnQnF0QixPQUFPcnRCLGNBSkksQ0FBNUIsQ0FPQSxDQVhELElBV08sQ0FFTjA5QyxtQkFBbUJyd0IsTUFBbkIsQ0FBNEIsQ0FDM0J0bEUsS0FBTWlnRCxTQUFTdGhELElBRFksQ0FFM0J1eUMsU0FBVStPLFNBQVMvTyxRQUZRLENBRzNCNkcsYUFBY2tJLFNBQVNsSSxZQUhJLENBSTNCRSxlQUFnQmdJLFNBQVNoSSxjQUpFLENBQTVCLENBT0EsQ0FFRGdJLFNBQVM2USxlQUFULENBQTBCNmtDLG1CQUFtQnJ3QixNQUE3QyxDQUFxRDJxQixLQUFyRCxFQUVBbHZCLFFBQVVpdkIsYUFBYTVoQixjQUFiLENBQTZCbnVCLFFBQTdCLENBQXVDMDFDLG1CQUFtQnJ3QixNQUExRCxDQUFrRXZsQixVQUFsRSxDQUE4RW9uQixJQUE5RSxDQUFWLENBRUF3dUIsbUJBQW1CNTBCLE9BQW5CLENBQTZCQSxPQUE3QixDQUNBOWdCLFNBQVM4Z0IsT0FBVCxDQUFtQkEsT0FBbkIsQ0FFQSxDQUVELHNCQUF3QkEsUUFBUWlLLGFBQVIsRUFBeEIsQ0FFQSxHQUFLL3FCLFNBQVNnQyxZQUFkLENBQTZCLENBRTVCaEMsU0FBUzYxQyx3QkFBVCxDQUFvQyxDQUFwQyxDQUVBLElBQU0sTUFBUSxDQUFkLENBQWlCOXhGLEVBQUlpc0YsTUFBTXRpQixlQUEzQixDQUE0QzNwRSxHQUE1QyxDQUFtRCxDQUVsRCxHQUFLa3VGLGtCQUFtQixjQUFnQmx1RixDQUFuQyxHQUEwQyxDQUEvQyxDQUFtRCxDQUVsRGk4QyxTQUFTNjFDLHdCQUFULEdBRUEsQ0FFRCxDQUVELENBRUQsR0FBSzcxQyxTQUFTaUMsWUFBZCxDQUE2QixDQUU1QmpDLFNBQVM4MUMsd0JBQVQsQ0FBb0MsQ0FBcEMsQ0FFQSxJQUFNLE1BQVEsQ0FBZCxDQUFpQi94RixFQUFJaXNGLE1BQU1yaUIsZUFBM0IsQ0FBNEM1cEUsR0FBNUMsQ0FBbUQsQ0FFbEQsR0FBS2t1RixrQkFBbUIsY0FBZ0JsdUYsQ0FBbkMsR0FBMEMsQ0FBL0MsQ0FBbUQsQ0FFbERpOEMsU0FBUzgxQyx3QkFBVCxHQUVBLENBRUQsQ0FFRCxDQUVELGFBQWVKLG1CQUFtQnJ3QixNQUFuQixDQUEwQnAwQixRQUF6QyxDQUVBLEdBQUssQ0FBRStPLFNBQVM0UyxnQkFBWCxFQUNKLENBQUU1UyxTQUFTOG5CLG1CQURQLEVBRUo5bkIsU0FBU21TLFFBQVQsR0FBc0IsSUFGdkIsQ0FFOEIsQ0FFN0J1akMsbUJBQW1COXVCLGlCQUFuQixDQUF1Q3NvQixVQUFVbHhCLFNBQWpELENBQ0EwM0IsbUJBQW1CejNCLGVBQW5CLENBQXFDaXhCLFVBQVVqeEIsZUFBL0MsQ0FDQWh0QixTQUFTOGUsY0FBVCxDQUEwQm0vQixVQUFVbnhCLE9BQXBDLENBRUEsQ0FFRDIzQixtQkFBbUI3L0MsR0FBbkIsQ0FBeUJBLEdBQXpCLENBRUE7RUFFQTYvQyxtQkFBbUJDLFVBQW5CLENBQWdDei9DLE9BQU96MEMsS0FBUCxDQUFhcW1ELElBQTdDLENBRUEsR0FBSzlILFNBQVM5SixNQUFkLENBQXVCO0VBSXRCakYsU0FBU2tGLGlCQUFULENBQTJCejFDLEtBQTNCLENBQW1DdzFDLE9BQU96MEMsS0FBUCxDQUFheXRFLE9BQWhELENBQ0FqK0IsU0FBU21GLGlCQUFULENBQTJCMTFDLEtBQTNCLENBQW1DdzFDLE9BQU96MEMsS0FBUCxDQUFhbXNFLFdBQWhELENBQ0EzOEIsU0FBUzJGLFVBQVQsQ0FBb0JsMkMsS0FBcEIsQ0FBNEJ3MUMsT0FBT3owQyxLQUFQLENBQWFvc0UsSUFBekMsQ0FDQTU4QixTQUFTeUcsY0FBVCxDQUF3QmgzQyxLQUF4QixDQUFnQ3cxQyxPQUFPejBDLEtBQVAsQ0FBYXFzRSxRQUE3QyxDQUNBNzhCLFNBQVNpRyxXQUFULENBQXFCeDJDLEtBQXJCLENBQTZCdzFDLE9BQU96MEMsS0FBUCxDQUFha1AsS0FBMUMsQ0FDQXNnQyxTQUFTc0csZ0JBQVQsQ0FBMEI3MkMsS0FBMUIsQ0FBa0N3MUMsT0FBT3owQyxLQUFQLENBQWFzc0UsSUFBL0MsQ0FFQTk4QixTQUFTeUYsb0JBQVQsQ0FBOEJoMkMsS0FBOUIsQ0FBc0N3MUMsT0FBT3owQyxLQUFQLENBQWFpMUMsb0JBQW5ELENBQ0F6RixTQUFTMEYsdUJBQVQsQ0FBaUNqMkMsS0FBakMsQ0FBeUN3MUMsT0FBT3owQyxLQUFQLENBQWFrMUMsdUJBQXRELENBQ0ExRixTQUFTK0YsYUFBVCxDQUF1QnQyQyxLQUF2QixDQUErQncxQyxPQUFPejBDLEtBQVAsQ0FBYXUxQyxhQUE1QyxDQUNBL0YsU0FBU2dHLGdCQUFULENBQTBCdjJDLEtBQTFCLENBQWtDdzFDLE9BQU96MEMsS0FBUCxDQUFhdzFDLGdCQUEvQyxDQUNBaEcsU0FBU29HLGNBQVQsQ0FBd0IzMkMsS0FBeEIsQ0FBZ0N3MUMsT0FBT3owQyxLQUFQLENBQWE0MUMsY0FBN0MsQ0FDQXBHLFNBQVNxRyxpQkFBVCxDQUEyQjUyQyxLQUEzQixDQUFtQ3cxQyxPQUFPejBDLEtBQVAsQ0FBYTYxQyxpQkFBaEQsQ0FDQTtFQUVBLENBRUQsaUJBQW1CbytDLG1CQUFtQjUwQixPQUFuQixDQUEyQkssV0FBM0IsRUFBbkIsQ0FDQzQwQixhQUNDanhCLGNBQWNHLFlBQWQsQ0FBNEIrd0IsYUFBYXgwQixHQUF6QyxDQUE4Q3Z3QixRQUE5QyxDQUZGLENBSUF5a0QsbUJBQW1CSyxZQUFuQixDQUFrQ0EsWUFBbEMsQ0FFQSxDQUVELG1CQUFBLENBQXFCNTZELE1BQXJCLENBQTZCMGEsR0FBN0IsQ0FBa0NtSyxRQUFsQyxDQUE0Q3o4QyxNQUE1QyxDQUFxRCxDQUVwRG9yRixrQkFBb0IsQ0FBcEIsQ0FFQSx1QkFBeUJ0NEMsV0FBVzV1QyxHQUFYLENBQWdCdTRDLFFBQWhCLENBQXpCLENBQ0EsV0FBYXEwQyxtQkFBbUI1eUYsS0FBbkIsQ0FBeUJ5MEMsTUFBdEMsQ0FFQSxHQUFLaTVDLGdCQUFMLENBQXdCLENBRXZCLEdBQUtDLHVCQUF5QmowRCxTQUFXbXpELGNBQXpDLENBQTBELENBRXpELGFBQ0NuekQsU0FBV216RCxjQUFYLEVBQ0F0dUMsU0FBU3IwQyxFQUFULEdBQWdCeWlGLGtCQUZqQixDQUlBO0VBQ0E7RUFDQTtFQUNBYyxVQUFVMXdCLFFBQVYsQ0FDQ3hlLFNBQVMrUCxjQURWLENBQzBCL1AsU0FBU2dRLGdCQURuQyxDQUNxRGhRLFNBQVNpUSxXQUQ5RCxDQUVDOTBCLE1BRkQsQ0FFU3U2RCxrQkFGVCxDQUU2Qk8sUUFGN0IsRUFJQSxDQUVELENBRUQsR0FBS2oyQyxTQUFTMEwsV0FBVCxHQUF5QixLQUE5QixDQUFzQyxDQUVyQyxHQUFLZ3FDLG1CQUFtQjUwQixPQUFuQixHQUErQnorRCxTQUFwQyxDQUFnRCxDQUUvQzI5QyxTQUFTMEwsV0FBVCxDQUF1QixJQUF2QixDQUVBLENBSkQsUUFJWTFMLFNBQVNuSyxHQUFULEVBQWdCNi9DLG1CQUFtQjcvQyxHQUFuQixHQUEyQkEsR0FBaEQsQ0FBc0QsQ0FFNURtSyxTQUFTMEwsV0FBVCxDQUF1QixJQUF2QixDQUVBLENBSk0sUUFJSzFMLFNBQVM5SixNQUFULEVBQW1Cdy9DLG1CQUFtQkMsVUFBbkIsR0FBa0N6L0MsT0FBT3owQyxLQUFQLENBQWFxbUQsSUFBdkUsQ0FBOEUsQ0FFcEY5SCxTQUFTMEwsV0FBVCxDQUF1QixJQUF2QixDQUVBLENBSk0sUUFJS2dxQyxtQkFBbUI5dUIsaUJBQW5CLEdBQXlDdmtFLFNBQXpDLEdBQ1RxekYsbUJBQW1COXVCLGlCQUFuQixHQUF5Q3NvQixVQUFVbHhCLFNBQW5ELEVBQ0YwM0IsbUJBQW1CejNCLGVBQW5CLEdBQXVDaXhCLFVBQVVqeEIsZUFGdEMsQ0FBTCxDQUUrRCxDQUVyRWplLFNBQVMwTCxXQUFULENBQXVCLElBQXZCLENBRUEsQ0FFRCxDQUVELEdBQUsxTCxTQUFTMEwsV0FBZCxDQUE0QixDQUUzQjZvQyxhQUFjdjBDLFFBQWQsQ0FBd0JuSyxHQUF4QixDQUE2QnR5QyxNQUE3QixFQUNBeThDLFNBQVMwTCxXQUFULENBQXVCLEtBQXZCLENBRUEsQ0FFRCxtQkFBcUIsS0FBckIsQ0FDQSxvQkFBc0IsS0FBdEIsQ0FDQSxrQkFBb0IsS0FBcEIsQ0FFQSxZQUFjZ3FDLG1CQUFtQjUwQixPQUFqQyxDQUNDbzFCLFdBQWFwMUIsUUFBUUssV0FBUixFQURkLENBRUNnMUIsV0FBYVQsbUJBQW1CcndCLE1BQW5CLENBQTBCcDBCLFFBRnhDLENBSUEsR0FBS3h2QyxNQUFNcXpFLFVBQU4sQ0FBa0JoVSxRQUFRQSxPQUExQixDQUFMLENBQTJDLENBRTFDczFCLGVBQWlCLElBQWpCLENBQ0FDLGdCQUFrQixJQUFsQixDQUNBQyxjQUFnQixJQUFoQixDQUVBLENBRUQsR0FBS3QyQyxTQUFTcjBDLEVBQVQsR0FBZ0J5aUYsa0JBQXJCLENBQTBDLENBRXpDQSxtQkFBcUJwdUMsU0FBU3IwQyxFQUE5QixDQUVBMHFGLGdCQUFrQixJQUFsQixDQUVBLENBRUQsR0FBS0QsZ0JBQWtCajdELFNBQVdtekQsY0FBbEMsQ0FBbUQsQ0FFbEQ0SCxXQUFXOTBCLFFBQVgsQ0FBcUJrUixHQUFyQixDQUEwQixrQkFBMUIsQ0FBOENuM0MsT0FBT0MsZ0JBQXJELEVBRUEsR0FBS2t3QyxhQUFhalAsc0JBQWxCLENBQTJDLENBRTFDNjVCLFdBQVc5MEIsUUFBWCxDQUFxQmtSLEdBQXJCLENBQTBCLGVBQTFCLENBQ0MsS0FBUTFzRSxLQUFLbWlCLEdBQUwsQ0FBVW9ULE9BQU90RixHQUFQLENBQWEsR0FBdkIsRUFBK0Jqd0IsS0FBS29pQixHQUE1QyxDQURELEVBR0EsQ0FFRDtFQUVBLEdBQUtzbUUsa0JBQXFCQyxxQkFBdUJwekQsTUFBNUMsQ0FBTCxDQUE0RCxDQUUzRG16RCxlQUFtQkMscUJBQXVCcHpELE1BQTFDLENBRUE7RUFDQTtFQUNBO0VBRUFrN0QsZ0JBQWtCLElBQWxCLENBQXlCO0VBQ3pCQyxjQUFnQixJQUFoQixDQUF1QjtFQUV2QixDQUVEO0VBQ0E7RUFFQSxHQUFLdDJDLFNBQVM0UyxnQkFBVCxFQUNKNVMsU0FBU2t5QyxtQkFETCxFQUVKbHlDLFNBQVNteUMsc0JBRkwsRUFHSm55QyxTQUFTaE0sTUFIVixDQUdtQixDQUVsQixZQUFja2lELFdBQVd4aUQsR0FBWCxDQUFlNmlELGNBQTdCLENBRUEsR0FBS0MsVUFBWW4wRixTQUFqQixDQUE2QixDQUU1Qm0wRixRQUFRcDFCLFFBQVIsQ0FBa0JrUixHQUFsQixDQUNDK2MsU0FBU3p5RCxxQkFBVCxDQUFnQ3pCLE9BQU9FLFdBQXZDLENBREQsRUFHQSxDQUVELENBRUQsR0FBSzJrQixTQUFTa3lDLG1CQUFULEVBQ0pseUMsU0FBU3kyQyxxQkFETCxFQUVKejJDLFNBQVNpUyxtQkFGTCxFQUdKalMsU0FBU215QyxzQkFITCxFQUlKbnlDLFNBQVM0UyxnQkFKTCxFQUtKNVMsU0FBUzJSLFFBTFYsQ0FLcUIsQ0FFcEJ1a0MsV0FBVzkwQixRQUFYLENBQXFCa1IsR0FBckIsQ0FBMEIsWUFBMUIsQ0FBd0NuM0MsT0FBT21sQixrQkFBL0MsRUFFQSxDQUVELENBRUQ7RUFDQTtFQUNBO0VBRUEsR0FBS04sU0FBUzJSLFFBQWQsQ0FBeUIsQ0FFeEJ1a0MsV0FBV254QixXQUFYLENBQXdCdU4sR0FBeEIsQ0FBNkIvdUUsTUFBN0IsQ0FBcUMsWUFBckMsRUFDQTJ5RixXQUFXbnhCLFdBQVgsQ0FBd0J1TixHQUF4QixDQUE2Qi91RSxNQUE3QixDQUFxQyxtQkFBckMsRUFFQSxhQUFlQSxPQUFPNG9FLFFBQXRCLENBRUEsR0FBS0EsUUFBTCxDQUFnQixDQUVmLFVBQVlBLFNBQVNDLEtBQXJCLENBRUEsR0FBS2QsYUFBYTdOLG1CQUFsQixDQUF3QyxDQUV2QyxHQUFLME8sU0FBU3VxQixXQUFULEdBQXlCcjBGLFNBQTlCLENBQTBDO0VBR3pDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFHQSxTQUFXdUQsS0FBS3VrQixJQUFMLENBQVdpaUQsTUFBTTFvRSxNQUFOLENBQWUsQ0FBMUIsQ0FBWCxDQUEwQztFQUMxQzQvQixLQUFPNWIsTUFBTUksY0FBTixDQUFzQndiLElBQXRCLENBQVAsQ0FDQUEsS0FBTzE5QixLQUFLOEUsR0FBTCxDQUFVNDRCLElBQVYsQ0FBZ0IsQ0FBaEIsQ0FBUCxDQUVBLGlCQUFtQixnQkFBQSxDQUFrQkEsS0FBT0EsSUFBUCxDQUFjLENBQWhDLENBQW5CLENBQXdEO0VBQ3hEcXpELGFBQWF0aUYsR0FBYixDQUFrQjgzRCxTQUFTd3FCLFlBQTNCLEVBQTJDO0VBRTNDLGdCQUFrQixlQUFBLENBQWlCQSxZQUFqQixDQUErQnJ6RCxJQUEvQixDQUFxQ0EsSUFBckMsQ0FBMkMxRSxVQUEzQyxDQUF1RGlpRCxTQUF2RCxDQUFsQixDQUNBNlYsWUFBWWhyQyxXQUFaLENBQTBCLElBQTFCLENBRUF5Z0IsU0FBU3dxQixZQUFULENBQXdCQSxZQUF4QixDQUNBeHFCLFNBQVN1cUIsV0FBVCxDQUF1QkEsV0FBdkIsQ0FDQXZxQixTQUFTeXFCLGVBQVQsQ0FBMkJ0ekQsSUFBM0IsQ0FFQSxDQUVENHlELFdBQVc5MEIsUUFBWCxDQUFxQmtSLEdBQXJCLENBQTBCLGFBQTFCLENBQXlDbkcsU0FBU3VxQixXQUFsRCxFQUNBUixXQUFXOTBCLFFBQVgsQ0FBcUJrUixHQUFyQixDQUEwQixpQkFBMUIsQ0FBNkNuRyxTQUFTeXFCLGVBQXRELEVBRUEsQ0EvQkQsSUErQk8sQ0FFTlYsV0FBV254QixXQUFYLENBQXdCdU4sR0FBeEIsQ0FBNkJuRyxRQUE3QixDQUF1QyxjQUF2QyxFQUVBLENBRUQsQ0FFRCxDQUVELEdBQUtrcUIsZUFBTCxDQUF1QixDQUV0QkgsV0FBVzkwQixRQUFYLENBQXFCa1IsR0FBckIsQ0FBMEIscUJBQTFCLENBQWlEMGQsTUFBTWpDLG1CQUF2RCxFQUNBbUksV0FBVzkwQixRQUFYLENBQXFCa1IsR0FBckIsQ0FBMEIsdUJBQTFCLENBQW1EMGQsTUFBTWhDLHFCQUF6RCxFQUVBLEdBQUtodUMsU0FBUzlKLE1BQWQsQ0FBdUI7RUFJdEI7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBRUEyZ0QsOEJBQStCVixVQUEvQixDQUEyQ0csYUFBM0MsRUFFQSxDQUVEO0VBRUEsR0FBS3pnRCxLQUFPbUssU0FBU25LLEdBQXJCLENBQTJCLENBRTFCaWhELG1CQUFvQlgsVUFBcEIsQ0FBZ0N0Z0QsR0FBaEMsRUFFQSxDQUVELEdBQUttSyxTQUFTaVMsbUJBQWQsQ0FBb0MsQ0FFbkM4a0Msc0JBQXVCWixVQUF2QixDQUFtQ24yQyxRQUFuQyxFQUVBLENBSkQsUUFJWUEsU0FBU3kyQyxxQkFBZCxDQUFzQyxDQUU1Q00sc0JBQXVCWixVQUF2QixDQUFtQ24yQyxRQUFuQyxFQUNBZzNDLHVCQUF3QmIsVUFBeEIsQ0FBb0NuMkMsUUFBcEMsRUFFQSxDQUxNLFFBS0tBLFNBQVNreUMsbUJBQWQsQ0FBb0MsQ0FFMUM2RSxzQkFBdUJaLFVBQXZCLENBQW1DbjJDLFFBQW5DLEVBRUEsR0FBS0EsU0FBU2kzQyxrQkFBZCxDQUFtQyxDQUVsQ0Msb0JBQXFCZixVQUFyQixDQUFpQ24yQyxRQUFqQyxFQUVBLENBSkQsSUFJTyxDQUVObTNDLHFCQUFzQmhCLFVBQXRCLENBQWtDbjJDLFFBQWxDLEVBRUEsQ0FFRCxDQWRNLFFBY0tBLFNBQVNteUMsc0JBQWQsQ0FBdUMsQ0FFN0M0RSxzQkFBdUJaLFVBQXZCLENBQW1DbjJDLFFBQW5DLEVBRUEsR0FBS0EsU0FBU28zQyxzQkFBZCxDQUF1QyxDQUV0Q0Msd0JBQXlCbEIsVUFBekIsQ0FBcUNuMkMsUUFBckMsRUFFQSxDQUpELElBSU8sQ0FFTnMzQyx3QkFBeUJuQixVQUF6QixDQUFxQ24yQyxRQUFyQyxFQUVBLENBRUQsQ0FkTSxRQWNLQSxTQUFTZ3hCLG1CQUFkLENBQW9DLENBRTFDK2xCLHNCQUF1QlosVUFBdkIsQ0FBbUNuMkMsUUFBbkMsRUFDQXUzQyxxQkFBc0JwQixVQUF0QixDQUFrQ24yQyxRQUFsQyxFQUVBLENBTE0sUUFLS0EsU0FBU2l4QixzQkFBZCxDQUF1QyxDQUU3QzhsQixzQkFBdUJaLFVBQXZCLENBQW1DbjJDLFFBQW5DLEVBQ0F3M0Msd0JBQXlCckIsVUFBekIsQ0FBcUNuMkMsUUFBckMsRUFFQSxDQUxNLFFBS0tBLFNBQVNveUMsb0JBQWQsQ0FBcUMsQ0FFM0MyRSxzQkFBdUJaLFVBQXZCLENBQW1DbjJDLFFBQW5DLEVBQ0F5M0Msc0JBQXVCdEIsVUFBdkIsQ0FBbUNuMkMsUUFBbkMsRUFFQSxDQUxNLFFBS0tBLFNBQVMwM0MsbUJBQWQsQ0FBb0MsQ0FFMUNDLG9CQUFxQnhCLFVBQXJCLENBQWlDbjJDLFFBQWpDLEVBRUEsR0FBS0EsU0FBUzQzQyxvQkFBZCxDQUFxQyxDQUVwQ0Msb0JBQXFCMUIsVUFBckIsQ0FBaUNuMkMsUUFBakMsRUFFQSxDQUVELENBVk0sUUFVS0EsU0FBUzgzQyxnQkFBZCxDQUFpQyxDQUV2Q0Msc0JBQXVCNUIsVUFBdkIsQ0FBbUNuMkMsUUFBbkMsRUFFQSxDQUpNLFFBSUtBLFNBQVNnNEMsZ0JBQWQsQ0FBaUMsQ0FFdkM3QixXQUFXbGtELEtBQVgsQ0FBaUJ2eEMsS0FBakIsQ0FBeUJzL0MsU0FBUy9OLEtBQWxDLENBQ0Fra0QsV0FBVzFpRCxPQUFYLENBQW1CL3lDLEtBQW5CLENBQTJCcy9DLFNBQVN2TSxPQUFwQyxDQUVBLENBRUQ7RUFDQTtFQUVBLEdBQUswaUQsV0FBVzhCLEtBQVgsR0FBcUI1MUYsU0FBMUIsQ0FBc0M4ekYsV0FBVzhCLEtBQVgsQ0FBaUJ2M0YsS0FBakIsQ0FBeUJtM0MsWUFBWXFnRCxLQUFyQyxDQUN0QyxHQUFLL0IsV0FBV2dDLEtBQVgsR0FBcUI5MUYsU0FBMUIsQ0FBc0M4ekYsV0FBV2dDLEtBQVgsQ0FBaUJ6M0YsS0FBakIsQ0FBeUJtM0MsWUFBWXVnRCxLQUFyQyxDQUV0Q3R6QixjQUFjRSxNQUFkLENBQXNCc04sR0FBdEIsQ0FBMkJvakIsbUJBQW1CSyxZQUE5QyxDQUE0REksVUFBNUQsQ0FBd0VuRyxLQUF4RSxFQUVBLENBRUQsR0FBS2h3QyxTQUFTNFMsZ0JBQVQsRUFBNkI1UyxTQUFTMFMsa0JBQVQsR0FBZ0MsSUFBbEUsQ0FBeUUsQ0FFeEVvUyxjQUFjRSxNQUFkLENBQXNCc04sR0FBdEIsQ0FBMkJvakIsbUJBQW1CSyxZQUE5QyxDQUE0REksVUFBNUQsQ0FBd0VuRyxLQUF4RSxFQUNBaHdDLFNBQVMwUyxrQkFBVCxDQUE4QixLQUE5QixDQUVBLENBRUQ7RUFFQXdqQyxXQUFXOTBCLFFBQVgsQ0FBcUJrUixHQUFyQixDQUEwQixpQkFBMUIsQ0FBNkMvdUUsT0FBT3U1QyxlQUFwRCxFQUNBbzVDLFdBQVc5MEIsUUFBWCxDQUFxQmtSLEdBQXJCLENBQTBCLGNBQTFCLENBQTBDL3VFLE9BQU93a0MsWUFBakQsRUFDQW11RCxXQUFXOTBCLFFBQVgsQ0FBcUJrUixHQUFyQixDQUEwQixhQUExQixDQUF5Qy91RSxPQUFPODNCLFdBQWhELEVBRUEsY0FBQSxDQUVBLENBRUQ7RUFFQSw4QkFBQSxDQUFnQzRWLFFBQWhDLENBQTBDK08sUUFBMUMsQ0FBcUQsQ0FFcEQvTyxTQUFTd0MsT0FBVCxDQUFpQi95QyxLQUFqQixDQUF5QnMvQyxTQUFTdk0sT0FBbEMsQ0FFQSxHQUFLdU0sU0FBUy9OLEtBQWQsQ0FBc0IsQ0FFckJoQixTQUFTdUMsT0FBVCxDQUFpQjl5QyxLQUFqQixDQUF5QnMvQyxTQUFTL04sS0FBbEMsQ0FFQSxDQUVELEdBQUsrTixTQUFTOUgsUUFBZCxDQUF5QixDQUV4QmpILFNBQVNpSCxRQUFULENBQWtCeDNDLEtBQWxCLENBQXdCaW9CLElBQXhCLENBQThCcTNCLFNBQVM5SCxRQUF2QyxFQUFrRDd1QixjQUFsRCxDQUFrRTIyQixTQUFTbVIsaUJBQTNFLEVBRUEsQ0FFRCxHQUFLblIsU0FBU3RNLEdBQWQsQ0FBb0IsQ0FFbkJ6QyxTQUFTeUMsR0FBVCxDQUFhaHpDLEtBQWIsQ0FBcUJzL0MsU0FBU3RNLEdBQTlCLENBRUEsQ0FFRCxHQUFLc00sU0FBU3BNLFFBQWQsQ0FBeUIsQ0FFeEIzQyxTQUFTMkMsUUFBVCxDQUFrQmx6QyxLQUFsQixDQUEwQnMvQyxTQUFTcE0sUUFBbkMsQ0FFQSxDQUVELEdBQUtvTSxTQUFTbE0sV0FBZCxDQUE0QixDQUUzQjdDLFNBQVM2QyxXQUFULENBQXFCcHpDLEtBQXJCLENBQTZCcy9DLFNBQVNsTSxXQUF0QyxDQUVBLENBRUQsR0FBS2tNLFNBQVNoTSxNQUFkLENBQXVCLENBRXRCL0MsU0FBUytDLE1BQVQsQ0FBZ0J0ekMsS0FBaEIsQ0FBd0JzL0MsU0FBU2hNLE1BQWpDLENBRUE7RUFDQTtFQUNBO0VBQ0E7RUFDQS9DLFNBQVNnRCxVQUFULENBQW9CdnpDLEtBQXBCLENBQThCLEVBQUlzL0MsU0FBU2hNLE1BQVQsRUFBbUJnTSxTQUFTaE0sTUFBVCxDQUFnQjhtQixhQUF2QyxDQUFGLENBQTZELENBQTdELENBQWlFLENBQUUsQ0FBL0YsQ0FFQTdwQixTQUFTaUQsWUFBVCxDQUFzQnh6QyxLQUF0QixDQUE4QnMvQyxTQUFTOUwsWUFBdkMsQ0FDQWpELFNBQVNrRCxlQUFULENBQXlCenpDLEtBQXpCLENBQWlDcy9DLFNBQVM3TCxlQUExQyxDQUVBbEQsU0FBU21ELFdBQVQsQ0FBcUIxekMsS0FBckIsQ0FBNkIyMUMsV0FBVzV1QyxHQUFYLENBQWdCdTRDLFNBQVNoTSxNQUF6QixFQUFrQ21xQyxhQUEvRCxDQUVBLENBRUQsR0FBS24rQixTQUFTdkwsUUFBZCxDQUF5QixDQUV4QnhELFNBQVN3RCxRQUFULENBQWtCL3pDLEtBQWxCLENBQTBCcy9DLFNBQVN2TCxRQUFuQyxDQUNBeEQsU0FBU3lELGlCQUFULENBQTJCaDBDLEtBQTNCLENBQW1Dcy9DLFNBQVN0TCxpQkFBNUMsQ0FFQSxDQUVELEdBQUtzTCxTQUFTMUwsS0FBZCxDQUFzQixDQUVyQnJELFNBQVNxRCxLQUFULENBQWU1ekMsS0FBZixDQUF1QnMvQyxTQUFTMUwsS0FBaEMsQ0FDQXJELFNBQVNzRCxjQUFULENBQXdCN3pDLEtBQXhCLENBQWdDcy9DLFNBQVN6TCxjQUF6QyxDQUVBLENBRUQ7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFFQSxjQUFBLENBRUEsR0FBS3lMLFNBQVN0TSxHQUFkLENBQW9CLENBRW5CMmtELFdBQWFyNEMsU0FBU3RNLEdBQXRCLENBRUEsQ0FKRCxRQUlZc00sU0FBU2xNLFdBQWQsQ0FBNEIsQ0FFbEN1a0QsV0FBYXI0QyxTQUFTbE0sV0FBdEIsQ0FFQSxDQUpNLFFBSUtrTSxTQUFTNUssZUFBZCxDQUFnQyxDQUV0Q2lqRCxXQUFhcjRDLFNBQVM1SyxlQUF0QixDQUVBLENBSk0sUUFJSzRLLFNBQVMvSyxTQUFkLENBQTBCLENBRWhDb2pELFdBQWFyNEMsU0FBUy9LLFNBQXRCLENBRUEsQ0FKTSxRQUlLK0ssU0FBU2xMLE9BQWQsQ0FBd0IsQ0FFOUJ1akQsV0FBYXI0QyxTQUFTbEwsT0FBdEIsQ0FFQSxDQUpNLFFBSUtrTCxTQUFTeEssWUFBZCxDQUE2QixDQUVuQzZpRCxXQUFhcjRDLFNBQVN4SyxZQUF0QixDQUVBLENBSk0sUUFJS3dLLFNBQVN0SyxZQUFkLENBQTZCLENBRW5DMmlELFdBQWFyNEMsU0FBU3RLLFlBQXRCLENBRUEsQ0FKTSxRQUlLc0ssU0FBU3BNLFFBQWQsQ0FBeUIsQ0FFL0J5a0QsV0FBYXI0QyxTQUFTcE0sUUFBdEIsQ0FFQSxDQUpNLFFBSUtvTSxTQUFTcEwsV0FBZCxDQUE0QixDQUVsQ3lqRCxXQUFhcjRDLFNBQVNwTCxXQUF0QixDQUVBLENBRUQsR0FBS3lqRCxhQUFlaDJGLFNBQXBCLENBQWdDO0VBRy9CLEdBQUtnMkYsV0FBV3oyRCxtQkFBaEIsQ0FBc0MsQ0FFckN5MkQsV0FBYUEsV0FBVzkyRCxPQUF4QixDQUVBLENBRUQsR0FBSzgyRCxXQUFXdDVELGdCQUFYLEdBQWdDLElBQXJDLENBQTRDLENBRTNDczVELFdBQVc3NEQsWUFBWCxHQUVBLENBRUR5UixTQUFTMEMsV0FBVCxDQUFxQmp6QyxLQUFyQixDQUEyQmlvQixJQUEzQixDQUFpQzB2RSxXQUFXcmpFLE1BQTVDLEVBRUEsQ0FFRCxDQUVELDRCQUFBLENBQThCaWMsUUFBOUIsQ0FBd0MrTyxRQUF4QyxDQUFtRCxDQUVsRC9PLFNBQVN1QyxPQUFULENBQWlCOXlDLEtBQWpCLENBQXlCcy9DLFNBQVMvTixLQUFsQyxDQUNBaEIsU0FBU3dDLE9BQVQsQ0FBaUIveUMsS0FBakIsQ0FBeUJzL0MsU0FBU3ZNLE9BQWxDLENBRUEsQ0FFRCw0QkFBQSxDQUE4QnhDLFFBQTlCLENBQXdDK08sUUFBeEMsQ0FBbUQsQ0FFbEQvTyxTQUFTMEgsUUFBVCxDQUFrQmo0QyxLQUFsQixDQUEwQnMvQyxTQUFTckgsUUFBbkMsQ0FDQTFILFNBQVMySCxTQUFULENBQW1CbDRDLEtBQW5CLENBQTJCcy9DLFNBQVNySCxRQUFULENBQW9CcUgsU0FBU3NSLE9BQXhELENBQ0FyZ0IsU0FBU3ZkLEtBQVQsQ0FBZWh6QixLQUFmLENBQXVCcy9DLFNBQVN0c0IsS0FBaEMsQ0FFQSxDQUVELDhCQUFBLENBQWdDdWQsUUFBaEMsQ0FBMEMrTyxRQUExQyxDQUFxRCxDQUVwRC9PLFNBQVN1QyxPQUFULENBQWlCOXlDLEtBQWpCLENBQXlCcy9DLFNBQVMvTixLQUFsQyxDQUNBaEIsU0FBU3dDLE9BQVQsQ0FBaUIveUMsS0FBakIsQ0FBeUJzL0MsU0FBU3ZNLE9BQWxDLENBQ0F4QyxTQUFTM04sSUFBVCxDQUFjNWlDLEtBQWQsQ0FBc0JzL0MsU0FBUzFjLElBQVQsQ0FBZ0J3ckQsV0FBdEMsQ0FDQTc5QyxTQUFTdmQsS0FBVCxDQUFlaHpCLEtBQWYsQ0FBdUJtdUYsUUFBVSxHQUFqQyxDQUVBNTlDLFNBQVN5QyxHQUFULENBQWFoekMsS0FBYixDQUFxQnMvQyxTQUFTdE0sR0FBOUIsQ0FFQSxHQUFLc00sU0FBU3RNLEdBQVQsR0FBaUIsSUFBdEIsQ0FBNkIsQ0FFNUIsR0FBS3NNLFNBQVN0TSxHQUFULENBQWEzVSxnQkFBYixHQUFrQyxJQUF2QyxDQUE4QyxDQUU3Q2loQixTQUFTdE0sR0FBVCxDQUFhbFUsWUFBYixHQUVBLENBRUR5UixTQUFTMEMsV0FBVCxDQUFxQmp6QyxLQUFyQixDQUEyQmlvQixJQUEzQixDQUFpQ3EzQixTQUFTdE0sR0FBVCxDQUFhMWUsTUFBOUMsRUFFQSxDQUVELENBRUQsMkJBQUEsQ0FBNkJpYyxRQUE3QixDQUF1QzRFLEdBQXZDLENBQTZDLENBRTVDNUUsU0FBU2dGLFFBQVQsQ0FBa0J2MUMsS0FBbEIsQ0FBMEJtMUMsSUFBSTVELEtBQTlCLENBRUEsR0FBSzRELElBQUl5L0IsS0FBVCxDQUFpQixDQUVoQnJrQyxTQUFTOEUsT0FBVCxDQUFpQnIxQyxLQUFqQixDQUF5Qm0xQyxJQUFJamdCLElBQTdCLENBQ0FxYixTQUFTK0UsTUFBVCxDQUFnQnQxQyxLQUFoQixDQUF3Qm0xQyxJQUFJaGdCLEdBQTVCLENBRUEsQ0FMRCxRQUtZZ2dCLElBQUk0M0IsU0FBVCxDQUFxQixDQUUzQng4QixTQUFTNkUsVUFBVCxDQUFvQnAxQyxLQUFwQixDQUE0Qm0xQyxJQUFJNC9CLE9BQWhDLENBRUEsQ0FFRCxDQUVELCtCQUFBLENBQWlDeGtDLFFBQWpDLENBQTJDK08sUUFBM0MsQ0FBc0QsQ0FFckQsR0FBS0EsU0FBU3BMLFdBQWQsQ0FBNEIsQ0FFM0IzRCxTQUFTMkQsV0FBVCxDQUFxQmwwQyxLQUFyQixDQUE2QnMvQyxTQUFTcEwsV0FBdEMsQ0FFQSxDQUVELENBRUQsNkJBQUEsQ0FBK0IzRCxRQUEvQixDQUF5QytPLFFBQXpDLENBQW9ELENBRW5EL08sU0FBU21ILFFBQVQsQ0FBa0IxM0MsS0FBbEIsQ0FBMEJzL0MsU0FBUzVILFFBQW5DLENBQ0FuSCxTQUFTb0gsU0FBVCxDQUFtQjMzQyxLQUFuQixDQUEyQmtGLEtBQUs4RSxHQUFMLENBQVVzMUMsU0FBUzNILFNBQW5CLENBQThCLElBQTlCLENBQTNCLENBQWlFO0VBRWpFLEdBQUsySCxTQUFTcEwsV0FBZCxDQUE0QixDQUUzQjNELFNBQVMyRCxXQUFULENBQXFCbDBDLEtBQXJCLENBQTZCcy9DLFNBQVNwTCxXQUF0QyxDQUVBLENBRUQsR0FBS29MLFNBQVNsTCxPQUFkLENBQXdCLENBRXZCN0QsU0FBUzZELE9BQVQsQ0FBaUJwMEMsS0FBakIsQ0FBeUJzL0MsU0FBU2xMLE9BQWxDLENBQ0E3RCxTQUFTOEQsU0FBVCxDQUFtQnIwQyxLQUFuQixDQUEyQnMvQyxTQUFTakwsU0FBcEMsQ0FFQSxDQUVELEdBQUtpTCxTQUFTL0ssU0FBZCxDQUEwQixDQUV6QmhFLFNBQVNnRSxTQUFULENBQW1CdjBDLEtBQW5CLENBQTJCcy9DLFNBQVMvSyxTQUFwQyxDQUNBaEUsU0FBU2lFLFdBQVQsQ0FBcUJ4MEMsS0FBckIsQ0FBMkJpb0IsSUFBM0IsQ0FBaUNxM0IsU0FBUzlLLFdBQTFDLEVBRUEsQ0FFRCxHQUFLOEssU0FBUzVLLGVBQWQsQ0FBZ0MsQ0FFL0JuRSxTQUFTbUUsZUFBVCxDQUF5QjEwQyxLQUF6QixDQUFpQ3MvQyxTQUFTNUssZUFBMUMsQ0FDQW5FLFNBQVNvRSxpQkFBVCxDQUEyQjMwQyxLQUEzQixDQUFtQ3MvQyxTQUFTM0ssaUJBQTVDLENBQ0FwRSxTQUFTcUUsZ0JBQVQsQ0FBMEI1MEMsS0FBMUIsQ0FBa0NzL0MsU0FBUzFLLGdCQUEzQyxDQUVBLENBRUQsQ0FFRCw0QkFBQSxDQUE4QnJFLFFBQTlCLENBQXdDK08sUUFBeEMsQ0FBbUQsQ0FFbERtM0MscUJBQXNCbG1ELFFBQXRCLENBQWdDK08sUUFBaEMsRUFFQSxHQUFLQSxTQUFTcEssV0FBZCxDQUE0QixDQUUzQjNFLFNBQVMyRSxXQUFULENBQXFCbDFDLEtBQXJCLENBQTZCcy9DLFNBQVNwSyxXQUF0QyxDQUVBLENBRUQsQ0FFRCxnQ0FBQSxDQUFrQzNFLFFBQWxDLENBQTRDK08sUUFBNUMsQ0FBdUQsQ0FFdEQvTyxTQUFTc0gsU0FBVCxDQUFtQjczQyxLQUFuQixDQUEyQnMvQyxTQUFTekgsU0FBcEMsQ0FDQXRILFNBQVN1SCxTQUFULENBQW1COTNDLEtBQW5CLENBQTJCcy9DLFNBQVN4SCxTQUFwQyxDQUVBLEdBQUt3SCxTQUFTeEssWUFBZCxDQUE2QixDQUU1QnZFLFNBQVN1RSxZQUFULENBQXNCOTBDLEtBQXRCLENBQThCcy9DLFNBQVN4SyxZQUF2QyxDQUVBLENBRUQsR0FBS3dLLFNBQVN0SyxZQUFkLENBQTZCLENBRTVCekUsU0FBU3lFLFlBQVQsQ0FBc0JoMUMsS0FBdEIsQ0FBOEJzL0MsU0FBU3RLLFlBQXZDLENBRUEsQ0FFRCxHQUFLc0ssU0FBU3BMLFdBQWQsQ0FBNEIsQ0FFM0IzRCxTQUFTMkQsV0FBVCxDQUFxQmwwQyxLQUFyQixDQUE2QnMvQyxTQUFTcEwsV0FBdEMsQ0FFQSxDQUVELEdBQUtvTCxTQUFTbEwsT0FBZCxDQUF3QixDQUV2QjdELFNBQVM2RCxPQUFULENBQWlCcDBDLEtBQWpCLENBQXlCcy9DLFNBQVNsTCxPQUFsQyxDQUNBN0QsU0FBUzhELFNBQVQsQ0FBbUJyMEMsS0FBbkIsQ0FBMkJzL0MsU0FBU2pMLFNBQXBDLENBRUEsQ0FFRCxHQUFLaUwsU0FBUy9LLFNBQWQsQ0FBMEIsQ0FFekJoRSxTQUFTZ0UsU0FBVCxDQUFtQnYwQyxLQUFuQixDQUEyQnMvQyxTQUFTL0ssU0FBcEMsQ0FDQWhFLFNBQVNpRSxXQUFULENBQXFCeDBDLEtBQXJCLENBQTJCaW9CLElBQTNCLENBQWlDcTNCLFNBQVM5SyxXQUExQyxFQUVBLENBRUQsR0FBSzhLLFNBQVM1SyxlQUFkLENBQWdDLENBRS9CbkUsU0FBU21FLGVBQVQsQ0FBeUIxMEMsS0FBekIsQ0FBaUNzL0MsU0FBUzVLLGVBQTFDLENBQ0FuRSxTQUFTb0UsaUJBQVQsQ0FBMkIzMEMsS0FBM0IsQ0FBbUNzL0MsU0FBUzNLLGlCQUE1QyxDQUNBcEUsU0FBU3FFLGdCQUFULENBQTBCNTBDLEtBQTFCLENBQWtDcy9DLFNBQVMxSyxnQkFBM0MsQ0FFQSxDQUVELEdBQUswSyxTQUFTaE0sTUFBZCxDQUF1QjtFQUd0Qi9DLFNBQVN3SCxlQUFULENBQXlCLzNDLEtBQXpCLENBQWlDcy9DLFNBQVN2SCxlQUExQyxDQUVBLENBRUQsQ0FFRCxnQ0FBQSxDQUFrQ3hILFFBQWxDLENBQTRDK08sUUFBNUMsQ0FBdUQsQ0FFdEQvTyxTQUFTd0ksU0FBVCxDQUFtQi80QyxLQUFuQixDQUEyQnMvQyxTQUFTdkcsU0FBcEMsQ0FDQXhJLFNBQVN5SSxrQkFBVCxDQUE0Qmg1QyxLQUE1QixDQUFvQ3MvQyxTQUFTdEcsa0JBQTdDLENBRUE0OUMsd0JBQXlCcm1ELFFBQXpCLENBQW1DK08sUUFBbkMsRUFFQSxDQUVELDZCQUFBLENBQStCL08sUUFBL0IsQ0FBeUMrTyxRQUF6QyxDQUFvRCxDQUVuRCxHQUFLQSxTQUFTNUssZUFBZCxDQUFnQyxDQUUvQm5FLFNBQVNtRSxlQUFULENBQXlCMTBDLEtBQXpCLENBQWlDcy9DLFNBQVM1SyxlQUExQyxDQUNBbkUsU0FBU29FLGlCQUFULENBQTJCMzBDLEtBQTNCLENBQW1Dcy9DLFNBQVMzSyxpQkFBNUMsQ0FDQXBFLFNBQVNxRSxnQkFBVCxDQUEwQjUwQyxLQUExQixDQUFrQ3MvQyxTQUFTMUssZ0JBQTNDLENBRUEsQ0FFRCxDQUVELGdDQUFBLENBQWtDckUsUUFBbEMsQ0FBNEMrTyxRQUE1QyxDQUF1RCxDQUV0RCxHQUFLQSxTQUFTNUssZUFBZCxDQUFnQyxDQUUvQm5FLFNBQVNtRSxlQUFULENBQXlCMTBDLEtBQXpCLENBQWlDcy9DLFNBQVM1SyxlQUExQyxDQUNBbkUsU0FBU29FLGlCQUFULENBQTJCMzBDLEtBQTNCLENBQW1Dcy9DLFNBQVMzSyxpQkFBNUMsQ0FDQXBFLFNBQVNxRSxnQkFBVCxDQUEwQjUwQyxLQUExQixDQUFrQ3MvQyxTQUFTMUssZ0JBQTNDLENBRUEsQ0FFRHJFLFNBQVNtSSxpQkFBVCxDQUEyQjE0QyxLQUEzQixDQUFpQ2lvQixJQUFqQyxDQUF1Q3EzQixTQUFTNUcsaUJBQWhELEVBQ0FuSSxTQUFTb0ksWUFBVCxDQUFzQjM0QyxLQUF0QixDQUE4QnMvQyxTQUFTM0csWUFBdkMsQ0FDQXBJLFNBQVNxSSxXQUFULENBQXFCNTRDLEtBQXJCLENBQTZCcy9DLFNBQVMxRyxXQUF0QyxDQUVBLENBRUQsOEJBQUEsQ0FBZ0NySSxRQUFoQyxDQUEwQytPLFFBQTFDLENBQXFELENBRXBELEdBQUtBLFNBQVNsTCxPQUFkLENBQXdCLENBRXZCN0QsU0FBUzZELE9BQVQsQ0FBaUJwMEMsS0FBakIsQ0FBeUJzL0MsU0FBU2xMLE9BQWxDLENBQ0E3RCxTQUFTOEQsU0FBVCxDQUFtQnIwQyxLQUFuQixDQUEyQnMvQyxTQUFTakwsU0FBcEMsQ0FFQSxDQUVELEdBQUtpTCxTQUFTL0ssU0FBZCxDQUEwQixDQUV6QmhFLFNBQVNnRSxTQUFULENBQW1CdjBDLEtBQW5CLENBQTJCcy9DLFNBQVMvSyxTQUFwQyxDQUNBaEUsU0FBU2lFLFdBQVQsQ0FBcUJ4MEMsS0FBckIsQ0FBMkJpb0IsSUFBM0IsQ0FBaUNxM0IsU0FBUzlLLFdBQTFDLEVBRUEsQ0FFRCxHQUFLOEssU0FBUzVLLGVBQWQsQ0FBZ0MsQ0FFL0JuRSxTQUFTbUUsZUFBVCxDQUF5QjEwQyxLQUF6QixDQUFpQ3MvQyxTQUFTNUssZUFBMUMsQ0FDQW5FLFNBQVNvRSxpQkFBVCxDQUEyQjMwQyxLQUEzQixDQUFtQ3MvQyxTQUFTM0ssaUJBQTVDLENBQ0FwRSxTQUFTcUUsZ0JBQVQsQ0FBMEI1MEMsS0FBMUIsQ0FBa0NzL0MsU0FBUzFLLGdCQUEzQyxDQUVBLENBRUQsQ0FFRDtFQUVBLHNDQUFBLENBQXdDckUsUUFBeEMsQ0FBa0R2d0MsS0FBbEQsQ0FBMEQsQ0FFekR1d0MsU0FBU2tGLGlCQUFULENBQTJCdVYsV0FBM0IsQ0FBeUNockQsS0FBekMsQ0FFQXV3QyxTQUFTbUYsaUJBQVQsQ0FBMkJzVixXQUEzQixDQUF5Q2hyRCxLQUF6QyxDQUNBdXdDLFNBQVNpRyxXQUFULENBQXFCd1UsV0FBckIsQ0FBbUNockQsS0FBbkMsQ0FDQXV3QyxTQUFTMkYsVUFBVCxDQUFvQjhVLFdBQXBCLENBQWtDaHJELEtBQWxDLENBQ0F1d0MsU0FBU3lHLGNBQVQsQ0FBd0JnVSxXQUF4QixDQUFzQ2hyRCxLQUF0QyxDQUNBdXdDLFNBQVNzRyxnQkFBVCxDQUEwQm1VLFdBQTFCLENBQXdDaHJELEtBQXhDLENBRUEsQ0FFRDtFQUVBLHlCQUFBLEVBQTRCLENBRTNCLGdCQUFrQml1RixpQkFBbEIsQ0FFQSxHQUFLMkosYUFBZWh0QixhQUFhcE8sV0FBakMsQ0FBK0MsQ0FFOUNsa0QsUUFBUTZQLElBQVIsQ0FBYyxzQ0FBd0N5dkUsV0FBeEMsQ0FBc0QsOENBQXRELENBQXVHaHRCLGFBQWFwTyxXQUFsSSxFQUVBLENBRUR5eEIsbUJBQXFCLENBQXJCLENBRUEsa0JBQUEsQ0FFQSxDQUVELEtBQUs3c0IsZ0JBQUwsQ0FBd0JBLGdCQUF4QixDQUVBO0VBQ0EsS0FBS2dCLFlBQUwsQ0FBc0IsVUFBWSxDQUVqQyxXQUFhLEtBQWIsQ0FFQTtFQUNBLDRCQUFPLENBQXVCdmhDLE9BQXZCLENBQWdDZytDLElBQWhDLENBQXVDLENBRTdDLEdBQUtoK0MsU0FBV0EsUUFBUUssbUJBQXhCLENBQThDLENBRTdDLEdBQUssQ0FBRTIyRCxNQUFQLENBQWdCLENBRWZ2L0UsUUFBUTZQLElBQVIsQ0FBYyw4R0FBZCxFQUNBMHZFLE9BQVMsSUFBVCxDQUVBLENBRURoM0QsUUFBVUEsUUFBUUEsT0FBbEIsQ0FFQSxDQUVENUIsU0FBU21qQyxZQUFULENBQXVCdmhDLE9BQXZCLENBQWdDZytDLElBQWhDLEVBRUEsQ0FqQkQsQ0FtQkEsQ0F4QnFCLEVBQXRCLENBMEJBLEtBQUtpWixVQUFMLENBQW9CLFVBQVksQ0FFL0IsV0FBYSxLQUFiLENBRUEsMEJBQU8sQ0FBcUJqM0QsT0FBckIsQ0FBOEJnK0MsSUFBOUIsQ0FBcUMsQ0FFM0MsR0FBSyxDQUFFZ1osTUFBUCxDQUFnQixDQUVmdi9FLFFBQVE2UCxJQUFSLENBQWMsMkVBQWQsRUFDQTB2RSxPQUFTLElBQVQsQ0FFQSxDQUVENTRELFNBQVNtakMsWUFBVCxDQUF1QnZoQyxPQUF2QixDQUFnQ2crQyxJQUFoQyxFQUVBLENBWEQsQ0FhQSxDQWpCbUIsRUFBcEIsQ0FtQkEsS0FBS3ZjLGNBQUwsQ0FBd0IsVUFBWSxDQUVuQyxXQUFhLEtBQWIsQ0FFQSw4QkFBTyxDQUF5QnpoQyxPQUF6QixDQUFrQ2crQyxJQUFsQyxDQUF5QztFQUcvQyxHQUFLaCtDLFNBQVdBLFFBQVFVLHVCQUF4QixDQUFrRCxDQUVqRCxHQUFLLENBQUVzMkQsTUFBUCxDQUFnQixDQUVmdi9FLFFBQVE2UCxJQUFSLENBQWMscUhBQWQsRUFDQTB2RSxPQUFTLElBQVQsQ0FFQSxDQUVEaDNELFFBQVVBLFFBQVFBLE9BQWxCLENBRUEsQ0FFRDtFQUNBO0VBQ0EsR0FBT0EsU0FBV0EsUUFBUXU1QixhQUFyQixFQUNGanFELE1BQU15TSxPQUFOLENBQWVpa0IsUUFBUTdELEtBQXZCLEdBQWtDNkQsUUFBUTdELEtBQVIsQ0FBY2g2QixNQUFkLEdBQXlCLENBRDlELENBQ29FO0VBSW5FO0VBQ0FpOEIsU0FBU3FqQyxjQUFULENBQXlCemhDLE9BQXpCLENBQWtDZytDLElBQWxDLEVBRUEsQ0FSRCxJQVFPO0VBSU41L0MsU0FBU2drRCxxQkFBVCxDQUFnQ3BpRCxPQUFoQyxDQUF5Q2crQyxJQUF6QyxFQUVBLENBRUQsQ0FsQ0QsQ0FvQ0EsQ0F4Q3VCLEVBQXhCLENBMENBLEtBQUt2UyxlQUFMLENBQXVCLFVBQVksQ0FFbEMsMkJBQUEsQ0FFQSxDQUpELENBTUEsS0FBS2tHLGVBQUwsQ0FBdUIsU0FBV3lMLFlBQVgsQ0FBMEIsQ0FFaER1UCxxQkFBdUJ2UCxZQUF2QixDQUVBLEdBQUtBLGNBQWdCdG9DLFdBQVc1dUMsR0FBWCxDQUFnQmszRSxZQUFoQixFQUErQlMsa0JBQS9CLEdBQXNELzhFLFNBQTNFLENBQXVGLENBRXRGczlCLFNBQVNpa0QsaUJBQVQsQ0FBNEJqRixZQUE1QixFQUVBLENBRUQsZ0JBQWtCLElBQWxCLENBQ0EsV0FBYSxLQUFiLENBRUEsR0FBS0EsWUFBTCxDQUFvQixDQUVuQix1QkFBeUJ0b0MsV0FBVzV1QyxHQUFYLENBQWdCazNFLFlBQWhCLEVBQStCUyxrQkFBeEQsQ0FFQSxHQUFLVCxhQUFhMThDLHVCQUFsQixDQUE0QyxDQUUzQ2lnRCxZQUFjOUMsbUJBQW9CVCxhQUFhNzhDLGNBQWpDLENBQWQsQ0FDQWtoRCxPQUFTLElBQVQsQ0FFQSxDQUxELElBS08sQ0FFTmQsWUFBYzlDLGtCQUFkLENBRUEsQ0FFRG9QLGlCQUFpQjdsRSxJQUFqQixDQUF1QmcyRCxhQUFhcjlDLFFBQXBDLEVBQ0FtdEQsZ0JBQWdCOWxFLElBQWhCLENBQXNCZzJELGFBQWF2OUMsT0FBbkMsRUFDQXN0RCxvQkFBc0IvUCxhQUFhdDlDLFdBQW5DLENBRUEsQ0FuQkQsSUFtQk8sQ0FFTm10RCxpQkFBaUI3bEUsSUFBakIsQ0FBdUJvbUUsU0FBdkIsRUFBbUMxbEUsY0FBbkMsQ0FBbUR5bEUsV0FBbkQsRUFDQUwsZ0JBQWdCOWxFLElBQWhCLENBQXNCcW1FLFFBQXRCLEVBQWlDM2xFLGNBQWpDLENBQWlEeWxFLFdBQWpELEVBQ0FKLG9CQUFzQk8sWUFBdEIsQ0FFQSxDQUVELEdBQUtkLHNCQUF3QmpNLFdBQTdCLENBQTJDLENBRTFDNVAsSUFBSStQLGVBQUosQ0FBcUIvUCxJQUFJZ1EsV0FBekIsQ0FBc0NKLFdBQXRDLEVBQ0FpTSxvQkFBc0JqTSxXQUF0QixDQUVBLENBRUR6Z0YsTUFBTTYvQixRQUFOLENBQWdCa3RELGdCQUFoQixFQUNBL3NGLE1BQU0yL0IsT0FBTixDQUFlcXRELGVBQWYsRUFDQWh0RixNQUFNZ3hFLGNBQU4sQ0FBc0JpYyxtQkFBdEIsRUFFQSxHQUFLMUwsTUFBTCxDQUFjLENBRWIsc0JBQXdCM3NDLFdBQVc1dUMsR0FBWCxDQUFnQmszRSxhQUFhcDlDLE9BQTdCLENBQXhCLENBQ0Erd0MsSUFBSWlRLG9CQUFKLENBQTBCalEsSUFBSWdRLFdBQTlCLENBQTJDaFEsSUFBSWtSLGlCQUEvQyxDQUFrRWxSLElBQUltSCwyQkFBSixDQUFrQ2tGLGFBQWE3OEMsY0FBakgsQ0FBaUlvOEMsa0JBQWtCZSxjQUFuSixDQUFtS04sYUFBYTU4QyxpQkFBaEwsRUFFQSxDQUVELENBMURELENBNERBLEtBQUswMkQsc0JBQUwsQ0FBOEIsU0FBVzlaLFlBQVgsQ0FBeUJyb0UsQ0FBekIsQ0FBNEJ3USxDQUE1QixDQUErQmdaLEtBQS9CLENBQXNDQyxNQUF0QyxDQUE4Q21hLE1BQTlDLENBQXVELENBRXBGLEdBQUssRUFBSXlrQyxjQUFnQkEsYUFBYS84QyxtQkFBakMsQ0FBTCxDQUE4RCxDQUU3RDVvQixRQUFRTSxLQUFSLENBQWUsMEZBQWYsRUFDQSxPQUVBLENBRUQsZ0JBQWtCKzhCLFdBQVc1dUMsR0FBWCxDQUFnQmszRSxZQUFoQixFQUErQlMsa0JBQWpELENBRUEsR0FBSzhDLFdBQUwsQ0FBbUIsQ0FFbEIsWUFBYyxLQUFkLENBRUEsR0FBS0EsY0FBZ0JpTSxtQkFBckIsQ0FBMkMsQ0FFMUM3YixJQUFJK1AsZUFBSixDQUFxQi9QLElBQUlnUSxXQUF6QixDQUFzQ0osV0FBdEMsRUFFQXdXLFFBQVUsSUFBVixDQUVBLENBRUQsR0FBSSxDQUVILFlBQWMvWixhQUFhcDlDLE9BQTNCLENBQ0Esa0JBQW9CQSxRQUFRdkQsTUFBNUIsQ0FDQSxnQkFBa0J1RCxRQUFRN2lDLElBQTFCLENBRUEsR0FBS2k2RixnQkFBa0IvNUQsVUFBbEIsRUFBZ0NtM0MsTUFBTThGLE9BQU4sQ0FBZThjLGFBQWYsSUFBbUNybUIsSUFBSTV0QyxZQUFKLENBQWtCNHRDLElBQUlzbUIsZ0NBQXRCLENBQXhFLENBQW1JLENBRWxJNS9FLFFBQVFNLEtBQVIsQ0FBZSwyR0FBZixFQUNBLE9BRUEsQ0FFRCxHQUFLa25FLGNBQWdCM2hELGdCQUFoQixFQUFvQ2szQyxNQUFNOEYsT0FBTixDQUFlMkUsV0FBZixJQUFpQ2xPLElBQUk1dEMsWUFBSixDQUFrQjR0QyxJQUFJdW1CLDhCQUF0QixDQUFyRTtFQUNKLEVBQUlyWSxjQUFnQkssU0FBaEIsR0FBK0IxOUQsV0FBVzFiLEdBQVgsQ0FBZ0IsbUJBQWhCLEdBQXlDMGIsV0FBVzFiLEdBQVgsQ0FBZ0IsMEJBQWhCLENBQXhFLENBQUosQ0FESTtFQUVKLEVBQUkrNEUsY0FBZ0JNLGFBQWhCLEVBQWlDMzlELFdBQVcxYixHQUFYLENBQWdCLDZCQUFoQixDQUFyQyxDQUZELENBRTBGLENBRXpGdVIsUUFBUU0sS0FBUixDQUFlLHFIQUFmLEVBQ0EsT0FFQSxDQUVELEdBQUtnNUQsSUFBSXdtQixzQkFBSixDQUE0QnhtQixJQUFJZ1EsV0FBaEMsSUFBa0RoUSxJQUFJeW1CLG9CQUEzRCxDQUFrRjtFQUlqRixHQUFPemlGLEdBQUssQ0FBTCxFQUFVQSxHQUFPcW9FLGFBQWE3K0MsS0FBYixDQUFxQkEsS0FBeEMsRUFBdURoWixHQUFLLENBQUwsRUFBVUEsR0FBTzYzRCxhQUFhNStDLE1BQWIsQ0FBc0JBLE1BQW5HLENBQWdILENBRS9HdXlDLElBQUkwbUIsVUFBSixDQUFnQjFpRixDQUFoQixDQUFtQndRLENBQW5CLENBQXNCZ1osS0FBdEIsQ0FBNkJDLE1BQTdCLENBQXFDZzJDLE1BQU04RixPQUFOLENBQWU4YyxhQUFmLENBQXJDLENBQXFFNWlCLE1BQU04RixPQUFOLENBQWUyRSxXQUFmLENBQXJFLENBQW1HdG1DLE1BQW5HLEVBRUEsQ0FFRCxDQVZELElBVU8sQ0FFTmxoQyxRQUFRTSxLQUFSLENBQWUsNEdBQWYsRUFFQSxDQUVELENBdENELE9Bc0NVLENBRVQsR0FBS28vRSxPQUFMLENBQWUsQ0FFZHBtQixJQUFJK1AsZUFBSixDQUFxQi9QLElBQUlnUSxXQUF6QixDQUFzQzZMLG1CQUF0QyxFQUVBLENBRUQsQ0FFRCxDQUVELENBekVELENBMkVBLEtBQUs4Syx3QkFBTCxDQUFnQyxTQUFXdGtFLFFBQVgsQ0FBcUI0TSxPQUFyQixDQUE4QjIzRCxLQUE5QixDQUFzQyxDQUVyRSxVQUFZMzNELFFBQVE3RCxLQUFSLENBQWNvQyxLQUExQixDQUNBLFdBQWF5QixRQUFRN0QsS0FBUixDQUFjcUMsTUFBM0IsQ0FDQSxhQUFlZzJDLE1BQU04RixPQUFOLENBQWV0NkMsUUFBUXZELE1BQXZCLENBQWYsQ0FFQSxLQUFLOGtDLFlBQUwsQ0FBbUJ2aEMsT0FBbkIsQ0FBNEIsQ0FBNUIsRUFFQSt3QyxJQUFJNm1CLGNBQUosQ0FBb0I3bUIsSUFBSWlILFVBQXhCLENBQW9DMmYsT0FBUyxDQUE3QyxDQUFnRGhaLFFBQWhELENBQTBEdnJELFNBQVNyZSxDQUFuRSxDQUFzRXFlLFNBQVM3TixDQUEvRSxDQUFrRmdaLEtBQWxGLENBQXlGQyxNQUF6RixDQUFpRyxDQUFqRyxFQUVBLENBVkQsQ0FZQSxLQUFLcTVELG9CQUFMLENBQTRCLFNBQVd6a0UsUUFBWCxDQUFxQjBrRSxVQUFyQixDQUFpQ0MsVUFBakMsQ0FBNkNKLEtBQTdDLENBQXFELENBRWhGLFVBQVlHLFdBQVczN0QsS0FBWCxDQUFpQm9DLEtBQTdCLENBQ0EsV0FBYXU1RCxXQUFXMzdELEtBQVgsQ0FBaUJxQyxNQUE5QixDQUNBLGFBQWVnMkMsTUFBTThGLE9BQU4sQ0FBZXlkLFdBQVd0N0QsTUFBMUIsQ0FBZixDQUNBLFdBQWErM0MsTUFBTThGLE9BQU4sQ0FBZXlkLFdBQVc1NkYsSUFBMUIsQ0FBYixDQUNBLFdBQWEyNkYsV0FBV2ozRCxhQUFYLENBQTJCaTNELFdBQVczN0QsS0FBWCxDQUFpQnRxQixJQUE1QyxDQUFtRGltRixXQUFXMzdELEtBQTNFLENBRUEsS0FBS29sQyxZQUFMLENBQW1CdzJCLFVBQW5CLENBQStCLENBQS9CLEVBRUFobkIsSUFBSWluQixhQUFKLENBQW1Cam5CLElBQUlpSCxVQUF2QixDQUFtQzJmLE9BQVMsQ0FBNUMsQ0FBK0N2a0UsU0FBU3JlLENBQXhELENBQTJEcWUsU0FBUzdOLENBQXBFLENBQXVFZ1osS0FBdkUsQ0FBOEVDLE1BQTlFLENBQXNGbWdELFFBQXRGLENBQWdHQyxNQUFoRyxDQUF3R3FaLE1BQXhHLEVBRUEsQ0FaRCxDQWNBLENBRUQ7OztLQUtBLGdCQUFBLENBQWtCdm5ELEtBQWxCLENBQXlCd2pDLE9BQXpCLENBQW1DLENBRWxDLEtBQUsxMUUsSUFBTCxDQUFZLEVBQVosQ0FFQSxLQUFLa3lDLEtBQUwsQ0FBYSxTQUFBLENBQVdBLEtBQVgsQ0FBYixDQUNBLEtBQUt3akMsT0FBTCxDQUFpQkEsVUFBWXB6RSxTQUFkLENBQTRCb3pFLE9BQTVCLENBQXNDLE9BQXJELENBRUEsQ0FFRGdrQixRQUFReDhGLFNBQVIsQ0FBa0J3d0UsU0FBbEIsQ0FBOEIsSUFBOUIsQ0FFQWdzQixRQUFReDhGLFNBQVIsQ0FBa0J5ckIsS0FBbEIsQ0FBMEIsVUFBWSxDQUVyQyxrQkFBTyxDQUFhLEtBQUt1cEIsS0FBTCxDQUFXVyxNQUFYLEVBQWIsQ0FBa0MsS0FBSzZpQyxPQUF2QyxDQUFQLENBRUEsQ0FKRCxDQU1BZ2tCLFFBQVF4OEYsU0FBUixDQUFrQndpQyxNQUFsQixDQUEyQixvQkFBd0IsQ0FFbEQsT0FBTyxDQUNOL2dDLEtBQU0sU0FEQSxDQUVOdXpDLE1BQU8sS0FBS0EsS0FBTCxDQUFXVyxNQUFYLEVBRkQsQ0FHTjZpQyxRQUFTLEtBQUtBLE9BSFIsQ0FBUCxDQU1BLENBUkQsQ0FVQTs7O0tBS0EsWUFBQSxDQUFjeGpDLEtBQWQsQ0FBcUJyYyxJQUFyQixDQUEyQkMsR0FBM0IsQ0FBaUMsQ0FFaEMsS0FBSzkxQixJQUFMLENBQVksRUFBWixDQUVBLEtBQUtreUMsS0FBTCxDQUFhLFNBQUEsQ0FBV0EsS0FBWCxDQUFiLENBRUEsS0FBS3JjLElBQUwsQ0FBY0EsT0FBU3Z6QixTQUFYLENBQXlCdXpCLElBQXpCLENBQWdDLENBQTVDLENBQ0EsS0FBS0MsR0FBTCxDQUFhQSxNQUFReHpCLFNBQVYsQ0FBd0J3ekIsR0FBeEIsQ0FBOEIsSUFBekMsQ0FFQSxDQUVENmpFLElBQUl6OEYsU0FBSixDQUFjcTRFLEtBQWQsQ0FBc0IsSUFBdEIsQ0FFQW9rQixJQUFJejhGLFNBQUosQ0FBY3lyQixLQUFkLENBQXNCLFVBQVksQ0FFakMsY0FBTyxDQUFTLEtBQUt1cEIsS0FBTCxDQUFXVyxNQUFYLEVBQVQsQ0FBOEIsS0FBS2hkLElBQW5DLENBQXlDLEtBQUtDLEdBQTlDLENBQVAsQ0FFQSxDQUpELENBTUE2akUsSUFBSXo4RixTQUFKLENBQWN3aUMsTUFBZCxDQUF1QixvQkFBd0IsQ0FFOUMsT0FBTyxDQUNOL2dDLEtBQU0sS0FEQSxDQUVOdXpDLE1BQU8sS0FBS0EsS0FBTCxDQUFXVyxNQUFYLEVBRkQsQ0FHTmhkLEtBQU0sS0FBS0EsSUFITCxDQUlOQyxJQUFLLEtBQUtBLEdBSkosQ0FBUCxDQU9BLENBVEQsQ0FXQTs7S0FJQSxjQUFBLEVBQWlCLENBRWhCNm1CLFNBQVMvOUMsSUFBVCxDQUFlLElBQWYsRUFFQSxLQUFLRCxJQUFMLENBQVksT0FBWixDQUVBLEtBQUs0N0QsVUFBTCxDQUFrQixJQUFsQixDQUNBLEtBQUt6a0IsR0FBTCxDQUFXLElBQVgsQ0FDQSxLQUFLcS9DLGdCQUFMLENBQXdCLElBQXhCLENBRUEsS0FBSzlpQixVQUFMLENBQWtCLElBQWxCLENBQXdCO0VBRXhCLENBRUR1bkIsTUFBTTE4RixTQUFOLENBQWtCRCxPQUFPNG5CLE1BQVAsQ0FBZTVuQixPQUFPaUIsTUFBUCxDQUFleStDLFNBQVN6L0MsU0FBeEIsQ0FBZixDQUFvRCxDQUVyRXNDLFlBQWFvNkYsS0FGd0QsQ0FJckVoeEUsS0FBTSxTQUFXNWYsTUFBWCxDQUFtQnEzQyxTQUFuQixDQUErQixDQUVwQzFELFNBQVN6L0MsU0FBVCxDQUFtQjByQixJQUFuQixDQUF3QmhxQixJQUF4QixDQUE4QixJQUE5QixDQUFvQ29LLE1BQXBDLENBQTRDcTNDLFNBQTVDLEVBRUEsR0FBS3IzQyxPQUFPdXhELFVBQVAsR0FBc0IsSUFBM0IsQ0FBa0MsS0FBS0EsVUFBTCxDQUFrQnZ4RCxPQUFPdXhELFVBQVAsQ0FBa0I1eEMsS0FBbEIsRUFBbEIsQ0FDbEMsR0FBSzNmLE9BQU84c0MsR0FBUCxHQUFlLElBQXBCLENBQTJCLEtBQUtBLEdBQUwsQ0FBVzlzQyxPQUFPOHNDLEdBQVAsQ0FBV250QixLQUFYLEVBQVgsQ0FDM0IsR0FBSzNmLE9BQU9tc0YsZ0JBQVAsR0FBNEIsSUFBakMsQ0FBd0MsS0FBS0EsZ0JBQUwsQ0FBd0Juc0YsT0FBT21zRixnQkFBUCxDQUF3QnhzRSxLQUF4QixFQUF4QixDQUV4QyxLQUFLMHBELFVBQUwsQ0FBa0JycEUsT0FBT3FwRSxVQUF6QixDQUNBLEtBQUtyekMsZ0JBQUwsQ0FBd0JoMkIsT0FBT2cyQixnQkFBL0IsQ0FFQSxXQUFBLENBRUEsQ0FqQm9FLENBbUJyRVUsT0FBUSxTQUFXampCLElBQVgsQ0FBa0IsQ0FFekIsU0FBV2tnQyxTQUFTei9DLFNBQVQsQ0FBbUJ3aUMsTUFBbkIsQ0FBMEI5Z0MsSUFBMUIsQ0FBZ0MsSUFBaEMsQ0FBc0M2ZCxJQUF0QyxDQUFYLENBRUEsR0FBSyxLQUFLODlDLFVBQUwsR0FBb0IsSUFBekIsQ0FBZ0NsbkQsS0FBSzdQLE1BQUwsQ0FBWSsyRCxVQUFaLENBQXlCLEtBQUtBLFVBQUwsQ0FBZ0I3NkIsTUFBaEIsQ0FBd0JqakIsSUFBeEIsQ0FBekIsQ0FDaEMsR0FBSyxLQUFLcTVCLEdBQUwsR0FBYSxJQUFsQixDQUF5QnppQyxLQUFLN1AsTUFBTCxDQUFZc3lDLEdBQVosQ0FBa0IsS0FBS0EsR0FBTCxDQUFTcFcsTUFBVCxFQUFsQixDQUV6QixXQUFBLENBRUEsQ0E1Qm9FLENBQXBELENBQWxCLENBZ0NBOzs7Ozs7Ozs7OztLQWFBLHVCQUFBLENBQXlCcWdCLFVBQXpCLENBQXNDLENBRXJDNlEsU0FBU2h5RCxJQUFULENBQWUsSUFBZixFQUVBLEtBQUtELElBQUwsQ0FBWSxnQkFBWixDQUVBLEtBQUt1ekMsS0FBTCxDQUFhLFNBQUEsQ0FBVyxRQUFYLENBQWIsQ0FDQSxLQUFLeUIsR0FBTCxDQUFXLElBQVgsQ0FFQSxLQUFLclcsUUFBTCxDQUFnQixDQUFoQixDQUVBLEtBQUt3WSxHQUFMLENBQVcsS0FBWCxDQUNBLEtBQUtLLE1BQUwsQ0FBYyxLQUFkLENBRUEsS0FBSzRhLFNBQUwsQ0FBZ0JoUixVQUFoQixFQUVBLENBRUQ4NUMsZUFBZTM4RixTQUFmLENBQTJCRCxPQUFPaUIsTUFBUCxDQUFlMHlELFNBQVMxekQsU0FBeEIsQ0FBM0IsQ0FDQTI4RixlQUFlMzhGLFNBQWYsQ0FBeUJzQyxXQUF6QixDQUF1Q3E2RixjQUF2QyxDQUNBQSxlQUFlMzhGLFNBQWYsQ0FBeUI0OEYsZ0JBQXpCLENBQTRDLElBQTVDLENBRUFELGVBQWUzOEYsU0FBZixDQUF5QjByQixJQUF6QixDQUFnQyxTQUFXNWYsTUFBWCxDQUFvQixDQUVuRDRuRCxTQUFTMXpELFNBQVQsQ0FBbUIwckIsSUFBbkIsQ0FBd0JocUIsSUFBeEIsQ0FBOEIsSUFBOUIsQ0FBb0NvSyxNQUFwQyxFQUVBLEtBQUtrcEMsS0FBTCxDQUFXdHBCLElBQVgsQ0FBaUI1ZixPQUFPa3BDLEtBQXhCLEVBQ0EsS0FBS3lCLEdBQUwsQ0FBVzNxQyxPQUFPMnFDLEdBQWxCLENBRUEsS0FBS3JXLFFBQUwsQ0FBZ0J0MEIsT0FBT3MwQixRQUF2QixDQUVBLFdBQUEsQ0FFQSxDQVhELENBYUE7OztLQUtBLGVBQUEsQ0FBaUIyaUIsUUFBakIsQ0FBNEIsQ0FFM0J0RCxTQUFTLzlDLElBQVQsQ0FBZSxJQUFmLEVBRUEsS0FBS0QsSUFBTCxDQUFZLFFBQVosQ0FFQSxLQUFLc2hELFFBQUwsQ0FBa0JBLFdBQWEzOUMsU0FBZixDQUE2QjI5QyxRQUE3QixDQUF3QyxrQkFBQSxFQUF4RCxDQUVBLEtBQUtwMEIsTUFBTCxDQUFjLFdBQUEsQ0FBYSxHQUFiLENBQWtCLEdBQWxCLENBQWQsQ0FFQSxDQUVEa3VFLE9BQU83OEYsU0FBUCxDQUFtQkQsT0FBTzRuQixNQUFQLENBQWU1bkIsT0FBT2lCLE1BQVAsQ0FBZXkrQyxTQUFTei9DLFNBQXhCLENBQWYsQ0FBb0QsQ0FFdEVzQyxZQUFhdTZGLE1BRnlELENBSXRFeEUsU0FBVSxJQUo0RCxDQU10RWwyQyxRQUFXLFVBQVksQ0FFdEIsbUJBQXFCLFdBQUEsRUFBckIsQ0FDQSxrQkFBb0IsV0FBQSxFQUFwQixDQUNBLGVBQWlCLFdBQUEsRUFBakIsQ0FFQSx1QkFBTyxDQUFrQmlaLFNBQWxCLENBQTZCWSxVQUE3QixDQUEwQyxDQUVoRDhnQyxjQUFjbjlELHFCQUFkLENBQXFDLEtBQUt2QixXQUExQyxFQUNBZzlCLFVBQVV0RixHQUFWLENBQWNHLG1CQUFkLENBQW1DNm1DLGFBQW5DLENBQWtEQyxjQUFsRCxFQUVBQyxXQUFXcDlELGtCQUFYLENBQStCLEtBQUt4QixXQUFwQyxFQUNBLGdCQUFrQjQrRCxXQUFXM2pGLENBQVgsQ0FBZTJqRixXQUFXbnpFLENBQTFCLENBQThCLENBQWhELENBRUEsR0FBS2l6RSxjQUFjcnZFLGlCQUFkLENBQWlDc3ZFLGNBQWpDLEVBQW9ERSxXQUF6RCxDQUF1RSxPQUV2RSxhQUFlN2hDLFVBQVV0RixHQUFWLENBQWNGLE1BQWQsQ0FBcUJwb0MsVUFBckIsQ0FBaUN1dkUsY0FBakMsQ0FBZixDQUVBLEdBQUtud0QsU0FBV3d1QixVQUFVemlDLElBQXJCLEVBQTZCaVUsU0FBV3d1QixVQUFVeGlDLEdBQXZELENBQTZELE9BRTdEb2pDLFdBQVcvMUQsSUFBWCxDQUFpQixDQUVoQjJtQyxTQUFVQSxRQUZNLENBR2hCbDVCLE1BQU9xcEYsZUFBZXR4RSxLQUFmLEVBSFMsQ0FJaEJxNkIsS0FBTSxJQUpVLENBS2hCeC9DLE9BQVEsSUFMUSxDQUFqQixFQVNBLENBdkJELENBeUJBLENBL0JVLEVBTjJELENBdUN0RW1sQixNQUFPLFVBQVksQ0FFbEIsZ0JBQWdCbnBCLFdBQVQsQ0FBc0IsS0FBS3lnRCxRQUEzQixFQUFzQ3IzQixJQUF0QyxDQUE0QyxJQUE1QyxDQUFQLENBRUEsQ0EzQ3FFLENBNkN0RUEsS0FBTSxTQUFXNWYsTUFBWCxDQUFvQixDQUV6QjJ6QyxTQUFTei9DLFNBQVQsQ0FBbUIwckIsSUFBbkIsQ0FBd0JocUIsSUFBeEIsQ0FBOEIsSUFBOUIsQ0FBb0NvSyxNQUFwQyxFQUVBLEdBQUtBLE9BQU82aUIsTUFBUCxHQUFrQnZwQixTQUF2QixDQUFtQyxLQUFLdXBCLE1BQUwsQ0FBWWpELElBQVosQ0FBa0I1ZixPQUFPNmlCLE1BQXpCLEVBRW5DLFdBQUEsQ0FFQSxDQXJEcUUsQ0FBcEQsQ0FBbkIsQ0EwREE7Ozs7S0FNQSxZQUFBLEVBQWUsQ0FFZDh3QixTQUFTLzlDLElBQVQsQ0FBZSxJQUFmLEVBRUEsS0FBS0QsSUFBTCxDQUFZLEtBQVosQ0FFQTFCLE9BQU9zUCxnQkFBUCxDQUF5QixJQUF6QixDQUErQixDQUM5QjZ0RixPQUFRLENBQ1B4eEYsV0FBWSxJQURMLENBRVBqSSxNQUFPLEVBRkEsQ0FEc0IsQ0FBL0IsRUFPQSxDQUVEMDVGLElBQUluOUYsU0FBSixDQUFnQkQsT0FBTzRuQixNQUFQLENBQWU1bkIsT0FBT2lCLE1BQVAsQ0FBZXkrQyxTQUFTei9DLFNBQXhCLENBQWYsQ0FBb0QsQ0FFbkVzQyxZQUFhNjZGLEdBRnNELENBSW5FenhFLEtBQU0sU0FBVzVmLE1BQVgsQ0FBb0IsQ0FFekIyekMsU0FBU3ovQyxTQUFULENBQW1CMHJCLElBQW5CLENBQXdCaHFCLElBQXhCLENBQThCLElBQTlCLENBQW9Db0ssTUFBcEMsQ0FBNEMsS0FBNUMsRUFFQSxXQUFhQSxPQUFPb3hGLE1BQXBCLENBRUEsSUFBTSxNQUFRLENBQVIsQ0FBVzN6RixFQUFJMnpGLE9BQU96MkYsTUFBNUIsQ0FBb0NLLEVBQUl5QyxDQUF4QyxDQUEyQ3pDLEdBQTNDLENBQWtELENBRWpELFVBQVlvMkYsT0FBUXAyRixDQUFSLENBQVosQ0FFQSxLQUFLczJGLFFBQUwsQ0FBZW5CLE1BQU0zMUYsTUFBTixDQUFhbWxCLEtBQWIsRUFBZixDQUFxQ3d3RSxNQUFNcnZELFFBQTNDLEVBRUEsQ0FFRCxXQUFBLENBRUEsQ0FwQmtFLENBc0JuRXd3RCxTQUFVLFNBQVc5MkYsTUFBWCxDQUFtQnNtQyxRQUFuQixDQUE4QixDQUV2QyxHQUFLQSxXQUFheG5DLFNBQWxCLENBQThCd25DLFNBQVcsQ0FBWCxDQUU5QkEsU0FBV2prQyxLQUFLeWtCLEdBQUwsQ0FBVXdmLFFBQVYsQ0FBWCxDQUVBLFdBQWEsS0FBS3N3RCxNQUFsQixDQUVBLElBQU0sTUFBUSxDQUFkLENBQWlCM3pGLEVBQUkyekYsT0FBT3oyRixNQUE1QixDQUFvQzhDLEdBQXBDLENBQTJDLENBRTFDLEdBQUtxakMsU0FBV3N3RCxPQUFRM3pGLENBQVIsRUFBWXFqQyxRQUE1QixDQUF1QyxDQUV0QyxNQUVBLENBRUQsQ0FFRHN3RCxPQUFPOTBFLE1BQVAsQ0FBZTdlLENBQWYsQ0FBa0IsQ0FBbEIsQ0FBcUIsQ0FBRXFqQyxTQUFVQSxRQUFaLENBQXNCdG1DLE9BQVFBLE1BQTlCLENBQXJCLEVBRUEsS0FBS3FsQixHQUFMLENBQVVybEIsTUFBVixFQUVBLENBNUNrRSxDQThDbkUrMkYscUJBQXNCLFNBQVd6d0QsUUFBWCxDQUFzQixDQUUzQyxXQUFhLEtBQUtzd0QsTUFBbEIsQ0FFQSxJQUFNLE1BQVEsQ0FBUixDQUFXM3pGLEVBQUkyekYsT0FBT3oyRixNQUE1QixDQUFvQ0ssRUFBSXlDLENBQXhDLENBQTJDekMsR0FBM0MsQ0FBa0QsQ0FFakQsR0FBSzhsQyxTQUFXc3dELE9BQVFwMkYsQ0FBUixFQUFZOGxDLFFBQTVCLENBQXVDLENBRXRDLE1BRUEsQ0FFRCxDQUVELGNBQWU5bEMsRUFBSSxDQUFaLEVBQWdCUixNQUF2QixDQUVBLENBOURrRSxDQWdFbkU2N0MsUUFBVyxVQUFZLENBRXRCLG1CQUFxQixXQUFBLEVBQXJCLENBRUEsdUJBQU8sQ0FBa0JpWixTQUFsQixDQUE2QlksVUFBN0IsQ0FBMEMsQ0FFaERzaEMsZUFBZTM5RCxxQkFBZixDQUFzQyxLQUFLdkIsV0FBM0MsRUFFQSxhQUFlZzlCLFVBQVV0RixHQUFWLENBQWNGLE1BQWQsQ0FBcUJwb0MsVUFBckIsQ0FBaUM4dkUsY0FBakMsQ0FBZixDQUVBLEtBQUtELG9CQUFMLENBQTJCendELFFBQTNCLEVBQXNDdVYsT0FBdEMsQ0FBK0NpWixTQUEvQyxDQUEwRFksVUFBMUQsRUFFQSxDQVJELENBVUEsQ0FkVSxFQWhFd0QsQ0FnRm5FdmhDLE9BQVEsVUFBWSxDQUVuQixPQUFTLFdBQUEsRUFBVCxDQUNBLE9BQVMsV0FBQSxFQUFULENBRUEsc0JBQU8sQ0FBaUJ5RCxNQUFqQixDQUEwQixDQUVoQyxXQUFhLEtBQUtnL0QsTUFBbEIsQ0FFQSxHQUFLQSxPQUFPejJGLE1BQVAsQ0FBZ0IsQ0FBckIsQ0FBeUIsQ0FFeEJ1bkIsR0FBRzJSLHFCQUFILENBQTBCekIsT0FBT0UsV0FBakMsRUFDQW5RLEdBQUcwUixxQkFBSCxDQUEwQixLQUFLdkIsV0FBL0IsRUFFQSxhQUFlcFEsR0FBR1IsVUFBSCxDQUFlUyxFQUFmLENBQWYsQ0FFQWl2RSxPQUFRLENBQVIsRUFBWTUyRixNQUFaLENBQW1CMDVDLE9BQW5CLENBQTZCLElBQTdCLENBRUEsSUFBTSxNQUFRLENBQVIsQ0FBV3oyQyxFQUFJMnpGLE9BQU96MkYsTUFBNUIsQ0FBb0NLLEVBQUl5QyxDQUF4QyxDQUEyQ3pDLEdBQTNDLENBQWtELENBRWpELEdBQUs4bEMsVUFBWXN3RCxPQUFRcDJGLENBQVIsRUFBWThsQyxRQUE3QixDQUF3QyxDQUV2Q3N3RCxPQUFRcDJGLEVBQUksQ0FBWixFQUFnQlIsTUFBaEIsQ0FBdUIwNUMsT0FBdkIsQ0FBaUMsS0FBakMsQ0FDQWs5QyxPQUFRcDJGLENBQVIsRUFBWVIsTUFBWixDQUFtQjA1QyxPQUFuQixDQUE2QixJQUE3QixDQUVBLENBTEQsSUFLTyxDQUVOLE1BRUEsQ0FFRCxDQUVELEtBQVFsNUMsRUFBSXlDLENBQVosQ0FBZXpDLEdBQWYsQ0FBc0IsQ0FFckJvMkYsT0FBUXAyRixDQUFSLEVBQVlSLE1BQVosQ0FBbUIwNUMsT0FBbkIsQ0FBNkIsS0FBN0IsQ0FFQSxDQUVELENBRUQsQ0FwQ0QsQ0FzQ0EsQ0EzQ08sRUFoRjJELENBNkhuRXhkLE9BQVEsU0FBV2pqQixJQUFYLENBQWtCLENBRXpCLFNBQVdrZ0MsU0FBU3ovQyxTQUFULENBQW1Cd2lDLE1BQW5CLENBQTBCOWdDLElBQTFCLENBQWdDLElBQWhDLENBQXNDNmQsSUFBdEMsQ0FBWCxDQUVBcEosS0FBSzdQLE1BQUwsQ0FBWTQyRixNQUFaLENBQXFCLEVBQXJCLENBRUEsV0FBYSxLQUFLQSxNQUFsQixDQUVBLElBQU0sTUFBUSxDQUFSLENBQVczekYsRUFBSTJ6RixPQUFPejJGLE1BQTVCLENBQW9DSyxFQUFJeUMsQ0FBeEMsQ0FBMkN6QyxHQUEzQyxDQUFrRCxDQUVqRCxVQUFZbzJGLE9BQVFwMkYsQ0FBUixDQUFaLENBRUFxUCxLQUFLN1AsTUFBTCxDQUFZNDJGLE1BQVosQ0FBbUJqM0YsSUFBbkIsQ0FBeUIsQ0FDeEJLLE9BQVEyMUYsTUFBTTMxRixNQUFOLENBQWE2NkIsSUFERyxDQUV4QnlMLFNBQVVxdkQsTUFBTXJ2RCxRQUZRLENBQXpCLEVBS0EsQ0FFRCxXQUFBLENBRUEsQ0FsSmtFLENBQXBELENBQWhCLENBc0pBOzs7OztLQU9BLGlCQUFBLENBQW1CdWlDLEtBQW5CLENBQTBCb3VCLFlBQTFCLENBQXlDO0VBSXhDcHVCLE1BQVFBLE9BQVMsRUFBakIsQ0FFQSxLQUFLQSxLQUFMLENBQWFBLE1BQU05bkUsS0FBTixDQUFhLENBQWIsQ0FBYixDQUNBLEtBQUtxeUYsWUFBTCxDQUFvQixnQkFBQSxDQUFrQixLQUFLdnFCLEtBQUwsQ0FBVzFvRSxNQUFYLENBQW9CLEVBQXRDLENBQXBCLENBRUE7RUFFQSxHQUFLODJGLGVBQWlCbjRGLFNBQXRCLENBQWtDLENBRWpDLEtBQUtvNEYsaUJBQUwsR0FFQSxDQUpELElBSU8sQ0FFTixHQUFLLEtBQUtydUIsS0FBTCxDQUFXMW9FLE1BQVgsR0FBc0I4MkYsYUFBYTkyRixNQUF4QyxDQUFpRCxDQUVoRCxLQUFLODJGLFlBQUwsQ0FBb0JBLGFBQWFsMkYsS0FBYixDQUFvQixDQUFwQixDQUFwQixDQUVBLENBSkQsSUFJTyxDQUVOMFUsUUFBUTZQLElBQVIsQ0FBYyxrREFBZCxFQUVBLEtBQUsyeEUsWUFBTCxDQUFvQixFQUFwQixDQUVBLElBQU0sTUFBUSxDQUFSLENBQVdyM0QsR0FBSyxLQUFLaXBDLEtBQUwsQ0FBVzFvRSxNQUFqQyxDQUF5Q0ssRUFBSW8vQixFQUE3QyxDQUFpRHAvQixHQUFqRCxDQUF3RCxDQUV2RCxLQUFLeTJGLFlBQUwsQ0FBa0J0M0YsSUFBbEIsQ0FBd0IsV0FBQSxFQUF4QixFQUVBLENBRUQsQ0FFRCxDQUVELENBRURsRyxPQUFPNG5CLE1BQVAsQ0FBZTgxRSxTQUFTejlGLFNBQXhCLENBQW1DLENBRWxDdzlGLGtCQUFtQixVQUFZLENBRTlCLEtBQUtELFlBQUwsQ0FBb0IsRUFBcEIsQ0FFQSxJQUFNLE1BQVEsQ0FBUixDQUFXcjNELEdBQUssS0FBS2lwQyxLQUFMLENBQVcxb0UsTUFBakMsQ0FBeUNLLEVBQUlvL0IsRUFBN0MsQ0FBaURwL0IsR0FBakQsQ0FBd0QsQ0FFdkQsWUFBYyxXQUFBLEVBQWQsQ0FFQSxHQUFLLEtBQUtxb0UsS0FBTCxDQUFZcm9FLENBQVosQ0FBTCxDQUF1QixDQUV0QmsxQixRQUFRaEcsVUFBUixDQUFvQixLQUFLbTVDLEtBQUwsQ0FBWXJvRSxDQUFaLEVBQWdCczNCLFdBQXBDLEVBRUEsQ0FFRCxLQUFLbS9ELFlBQUwsQ0FBa0J0M0YsSUFBbEIsQ0FBd0IrMUIsT0FBeEIsRUFFQSxDQUVELENBcEJpQyxDQXNCbEMreUQsS0FBTSxVQUFZLENBRWpCLFFBQUEsQ0FBVWpvRixDQUFWLENBQWFvL0IsRUFBYixDQUVBO0VBRUEsSUFBTXAvQixFQUFJLENBQUosQ0FBT28vQixHQUFLLEtBQUtpcEMsS0FBTCxDQUFXMW9FLE1BQTdCLENBQXFDSyxFQUFJby9CLEVBQXpDLENBQTZDcC9CLEdBQTdDLENBQW9ELENBRW5ENDJGLEtBQU8sS0FBS3Z1QixLQUFMLENBQVlyb0UsQ0FBWixDQUFQLENBRUEsR0FBSzQyRixJQUFMLENBQVksQ0FFWEEsS0FBS3QvRCxXQUFMLENBQWlCcEksVUFBakIsQ0FBNkIsS0FBS3VuRSxZQUFMLENBQW1CejJGLENBQW5CLENBQTdCLEVBRUEsQ0FFRCxDQUVEO0VBRUEsSUFBTUEsRUFBSSxDQUFKLENBQU9vL0IsR0FBSyxLQUFLaXBDLEtBQUwsQ0FBVzFvRSxNQUE3QixDQUFxQ0ssRUFBSW8vQixFQUF6QyxDQUE2Q3AvQixHQUE3QyxDQUFvRCxDQUVuRDQyRixLQUFPLEtBQUt2dUIsS0FBTCxDQUFZcm9FLENBQVosQ0FBUCxDQUVBLEdBQUs0MkYsSUFBTCxDQUFZLENBRVgsR0FBS0EsS0FBSzVsRixNQUFMLEVBQWU0bEYsS0FBSzVsRixNQUFMLENBQVk2bEYsTUFBaEMsQ0FBeUMsQ0FFeENELEtBQUszbEUsTUFBTCxDQUFZL0IsVUFBWixDQUF3QjBuRSxLQUFLNWxGLE1BQUwsQ0FBWXNtQixXQUFwQyxFQUNBcy9ELEtBQUszbEUsTUFBTCxDQUFZNUwsUUFBWixDQUFzQnV4RSxLQUFLdC9ELFdBQTNCLEVBRUEsQ0FMRCxJQUtPLENBRU5zL0QsS0FBSzNsRSxNQUFMLENBQVlyTSxJQUFaLENBQWtCZ3lFLEtBQUt0L0QsV0FBdkIsRUFFQSxDQUVEcy9ELEtBQUszbEUsTUFBTCxDQUFZSCxTQUFaLENBQXVCOGxFLEtBQUtobUUsUUFBNUIsQ0FBc0NnbUUsS0FBSy9sRSxVQUEzQyxDQUF1RCtsRSxLQUFLam5FLEtBQTVELEVBRUEsQ0FFRCxDQUVELENBakVpQyxDQW1FbENnRSxPQUFVLFVBQVksQ0FFckIsaUJBQW1CLFdBQUEsRUFBbkIsQ0FDQSxtQkFBcUIsV0FBQSxFQUFyQixDQUVBLHNCQUFPLEVBQWtCLENBRXhCLFVBQVksS0FBSzAwQyxLQUFqQixDQUNBLGlCQUFtQixLQUFLb3VCLFlBQXhCLENBQ0EsaUJBQW1CLEtBQUs3RCxZQUF4QixDQUNBLGdCQUFrQixLQUFLRCxXQUF2QixDQUVBO0VBRUEsSUFBTSxNQUFRLENBQVIsQ0FBV3Z6RCxHQUFLaXBDLE1BQU0xb0UsTUFBNUIsQ0FBb0NLLEVBQUlvL0IsRUFBeEMsQ0FBNENwL0IsR0FBNUMsQ0FBbUQ7RUFJbEQsV0FBYXFvRSxNQUFPcm9FLENBQVAsRUFBYXFvRSxNQUFPcm9FLENBQVAsRUFBV3MzQixXQUF4QixDQUFzQ3cvRCxjQUFuRCxDQUVBQyxhQUFheHFFLGdCQUFiLENBQStCMEUsTUFBL0IsQ0FBdUN3bEUsYUFBY3oyRixDQUFkLENBQXZDLEVBQ0ErMkYsYUFBYXh2RSxPQUFiLENBQXNCcXJFLFlBQXRCLENBQW9DNXlGLEVBQUksRUFBeEMsRUFFQSxDQUVELEdBQUsyeUYsY0FBZ0JyMEYsU0FBckIsQ0FBaUMsQ0FFaENxMEYsWUFBWWhyQyxXQUFaLENBQTBCLElBQTFCLENBRUEsQ0FFRCxDQTFCRCxDQTRCQSxDQWpDTyxFQW5FMEIsQ0FzR2xDaGpDLE1BQU8sVUFBWSxDQUVsQixtQkFBTyxDQUFjLEtBQUswakQsS0FBbkIsQ0FBMEIsS0FBS291QixZQUEvQixDQUFQLENBRUEsQ0ExR2lDLENBNEdsQ08sY0FBZSxTQUFXaDdGLElBQVgsQ0FBa0IsQ0FFaEMsSUFBTSxNQUFRLENBQVIsQ0FBV29qQyxHQUFLLEtBQUtpcEMsS0FBTCxDQUFXMW9FLE1BQWpDLENBQXlDSyxFQUFJby9CLEVBQTdDLENBQWlEcC9CLEdBQWpELENBQXdELENBRXZELFNBQVcsS0FBS3FvRSxLQUFMLENBQVlyb0UsQ0FBWixDQUFYLENBRUEsR0FBSzQyRixLQUFLNTZGLElBQUwsR0FBY0EsSUFBbkIsQ0FBMEIsQ0FFekIsV0FBQSxDQUVBLENBRUQsQ0FFRCxnQkFBQSxDQUVBLENBNUhpQyxDQUFuQyxFQWdJQTs7OztLQU1BLGFBQUEsRUFBZ0IsQ0FFZjI4QyxTQUFTLzlDLElBQVQsQ0FBZSxJQUFmLEVBRUEsS0FBS0QsSUFBTCxDQUFZLE1BQVosQ0FFQSxDQUVEczhGLEtBQUsvOUYsU0FBTCxDQUFpQkQsT0FBTzRuQixNQUFQLENBQWU1bkIsT0FBT2lCLE1BQVAsQ0FBZXkrQyxTQUFTei9DLFNBQXhCLENBQWYsQ0FBb0QsQ0FFcEVzQyxZQUFheTdGLElBRnVELENBSXBFSixPQUFRLElBSjRELENBQXBELENBQWpCLENBUUE7Ozs7S0FNQSxvQkFBQSxDQUFzQjUyRCxRQUF0QixDQUFnQ2djLFFBQWhDLENBQTJDLENBRTFDNlgsS0FBS2w1RCxJQUFMLENBQVcsSUFBWCxDQUFpQnFsQyxRQUFqQixDQUEyQmdjLFFBQTNCLEVBRUEsS0FBS3RoRCxJQUFMLENBQVksYUFBWixDQUVBLEtBQUt1OEYsUUFBTCxDQUFnQixVQUFoQixDQUNBLEtBQUtDLFVBQUwsQ0FBa0IsV0FBQSxFQUFsQixDQUNBLEtBQUtDLGlCQUFMLENBQXlCLFdBQUEsRUFBekIsQ0FFQSxVQUFZLEtBQUtDLFNBQUwsRUFBWixDQUNBLGFBQWUsWUFBQSxDQUFjaHZCLEtBQWQsQ0FBZixDQUVBLEtBQUtpdkIsSUFBTCxDQUFXbHZCLFFBQVgsQ0FBcUIsS0FBSzl3QyxXQUExQixFQUVBLEtBQUtpZ0Usb0JBQUwsR0FFQSxDQUVEQyxZQUFZdCtGLFNBQVosQ0FBd0JELE9BQU80bkIsTUFBUCxDQUFlNW5CLE9BQU9pQixNQUFQLENBQWU0NUQsS0FBSzU2RCxTQUFwQixDQUFmLENBQWdELENBRXZFc0MsWUFBYWc4RixXQUYwRCxDQUl2RXp1QixjQUFlLElBSndELENBTXZFc3VCLFVBQVcsVUFBWSxDQUV0QixVQUFZLEVBQVosQ0FBZ0JULElBQWhCLENBQXNCYSxLQUF0QixDQUNBLEtBQUEsQ0FBT3I0RCxFQUFQLENBRUEsR0FBSyxLQUFLYSxRQUFMLEVBQWlCLEtBQUtBLFFBQUwsQ0FBY29vQyxLQUFkLEdBQXdCL3BFLFNBQTlDLENBQTBEO0VBSXpELElBQU0wQixFQUFJLENBQUosQ0FBT28vQixHQUFLLEtBQUthLFFBQUwsQ0FBY29vQyxLQUFkLENBQW9CMW9FLE1BQXRDLENBQThDSyxFQUFJby9CLEVBQWxELENBQXNEcC9CLEdBQXRELENBQTZELENBRTVEeTNGLE1BQVEsS0FBS3gzRCxRQUFMLENBQWNvb0MsS0FBZCxDQUFxQnJvRSxDQUFyQixDQUFSLENBRUE7RUFFQTQyRixLQUFPLFFBQUEsRUFBUCxDQUNBdnVCLE1BQU1scEUsSUFBTixDQUFZeTNGLElBQVosRUFFQTtFQUVBQSxLQUFLNTZGLElBQUwsQ0FBWXk3RixNQUFNejdGLElBQWxCLENBQ0E0NkYsS0FBS2htRSxRQUFMLENBQWN2SixTQUFkLENBQXlCb3dFLE1BQU10MUYsR0FBL0IsRUFDQXkwRixLQUFLL2xFLFVBQUwsQ0FBZ0J4SixTQUFoQixDQUEyQm93RSxNQUFNQyxJQUFqQyxFQUNBLEdBQUtELE1BQU1FLEdBQU4sR0FBY3I1RixTQUFuQixDQUErQnM0RixLQUFLam5FLEtBQUwsQ0FBV3RJLFNBQVgsQ0FBc0Jvd0UsTUFBTUUsR0FBNUIsRUFFL0IsQ0FFRDtFQUVBLElBQU0zM0YsRUFBSSxDQUFKLENBQU9vL0IsR0FBSyxLQUFLYSxRQUFMLENBQWNvb0MsS0FBZCxDQUFvQjFvRSxNQUF0QyxDQUE4Q0ssRUFBSW8vQixFQUFsRCxDQUFzRHAvQixHQUF0RCxDQUE2RCxDQUU1RHkzRixNQUFRLEtBQUt4M0QsUUFBTCxDQUFjb29DLEtBQWQsQ0FBcUJyb0UsQ0FBckIsQ0FBUixDQUVBLEdBQU95M0YsTUFBTXptRixNQUFOLEdBQWlCLENBQUUsQ0FBckIsRUFBOEJ5bUYsTUFBTXptRixNQUFOLEdBQWlCLElBQS9DLEVBQTJEcTNELE1BQU9vdkIsTUFBTXptRixNQUFiLElBQTBCMVMsU0FBMUYsQ0FBd0c7RUFJdkcrcEUsTUFBT292QixNQUFNem1GLE1BQWIsRUFBc0I2VCxHQUF0QixDQUEyQndqRCxNQUFPcm9FLENBQVAsQ0FBM0IsRUFFQSxDQU5ELElBTU87RUFJTixLQUFLNmtCLEdBQUwsQ0FBVXdqRCxNQUFPcm9FLENBQVAsQ0FBVixFQUVBLENBRUQsQ0FFRCxDQUVEO0VBQ0E7RUFFQSxLQUFLdWdDLGlCQUFMLENBQXdCLElBQXhCLEVBRUEsWUFBQSxDQUVBLENBaEVzRSxDQWtFdkUrMkQsS0FBTSxTQUFXbHZCLFFBQVgsQ0FBcUIrdUIsVUFBckIsQ0FBa0MsQ0FFdkMsS0FBSy91QixRQUFMLENBQWdCQSxRQUFoQixDQUVBLEdBQUsrdUIsYUFBZTc0RixTQUFwQixDQUFnQyxDQUUvQixLQUFLaWlDLGlCQUFMLENBQXdCLElBQXhCLEVBRUEsS0FBSzZuQyxRQUFMLENBQWNzdUIsaUJBQWQsR0FFQVMsV0FBYSxLQUFLNy9ELFdBQWxCLENBRUEsQ0FFRCxLQUFLNi9ELFVBQUwsQ0FBZ0J2eUUsSUFBaEIsQ0FBc0J1eUUsVUFBdEIsRUFDQSxLQUFLQyxpQkFBTCxDQUF1QmxvRSxVQUF2QixDQUFtQ2lvRSxVQUFuQyxFQUVBLENBbkZzRSxDQXFGdkVsUCxLQUFNLFVBQVksQ0FFakIsS0FBSzdmLFFBQUwsQ0FBYzZmLElBQWQsR0FFQSxDQXpGc0UsQ0EyRnZFc1AscUJBQXNCLFVBQVksQ0FFakMsU0FBQSxDQUFXdjNGLENBQVgsQ0FFQSxHQUFLLEtBQUtpZ0MsUUFBTCxFQUFpQixLQUFLQSxRQUFMLENBQWNDLFVBQXBDLENBQWlELENBRWhELElBQU1sZ0MsRUFBSSxDQUFWLENBQWFBLEVBQUksS0FBS2lnQyxRQUFMLENBQWNrZSxXQUFkLENBQTBCeCtDLE1BQTNDLENBQW1ESyxHQUFuRCxDQUEwRCxDQUV6RCxPQUFTLEtBQUtpZ0MsUUFBTCxDQUFja2UsV0FBZCxDQUEyQm4rQyxDQUEzQixDQUFULENBRUEydkIsTUFBUSxJQUFNaW9FLEdBQUd2eEUsZUFBSCxFQUFkLENBRUEsR0FBS3NKLFFBQVUyTyxRQUFmLENBQTBCLENBRXpCczVELEdBQUd0eUUsY0FBSCxDQUFtQnFLLEtBQW5CLEVBRUEsQ0FKRCxJQUlPLENBRU5pb0UsR0FBR3RuRixHQUFILENBQVEsQ0FBUixDQUFXLENBQVgsQ0FBYyxDQUFkLENBQWlCLENBQWpCLEVBQXNCO0VBRXRCLENBRUQsQ0FFRCxDQXBCRCxRQW9CWSxLQUFLMnZCLFFBQUwsRUFBaUIsS0FBS0EsUUFBTCxDQUFjSSxnQkFBcEMsQ0FBdUQsQ0FFN0QsUUFBVSxXQUFBLEVBQVYsQ0FFQSxlQUFpQixLQUFLSixRQUFMLENBQWNLLFVBQWQsQ0FBeUJ1M0QsVUFBMUMsQ0FFQSxJQUFNNzNGLEVBQUksQ0FBVixDQUFhQSxFQUFJNjNGLFdBQVducEUsS0FBNUIsQ0FBbUMxdUIsR0FBbkMsQ0FBMEMsQ0FFekM4M0YsSUFBSXZsRixDQUFKLENBQVFzbEYsV0FBV253RSxJQUFYLENBQWlCMW5CLENBQWpCLENBQVIsQ0FDQTgzRixJQUFJLzBFLENBQUosQ0FBUTgwRSxXQUFXbHdFLElBQVgsQ0FBaUIzbkIsQ0FBakIsQ0FBUixDQUNBODNGLElBQUlsdUUsQ0FBSixDQUFRaXVFLFdBQVdscEUsSUFBWCxDQUFpQjN1QixDQUFqQixDQUFSLENBQ0E4M0YsSUFBSXgvRSxDQUFKLENBQVF1L0UsV0FBVzE2RCxJQUFYLENBQWlCbjlCLENBQWpCLENBQVIsQ0FFQTJ2QixNQUFRLElBQU1tb0UsSUFBSXp4RSxlQUFKLEVBQWQsQ0FFQSxHQUFLc0osUUFBVTJPLFFBQWYsQ0FBMEIsQ0FFekJ3NUQsSUFBSXh5RSxjQUFKLENBQW9CcUssS0FBcEIsRUFFQSxDQUpELElBSU8sQ0FFTm1vRSxJQUFJeG5GLEdBQUosQ0FBUyxDQUFULENBQVksQ0FBWixDQUFlLENBQWYsQ0FBa0IsQ0FBbEIsRUFBdUI7RUFFdkIsQ0FFRHVuRixXQUFXcnlDLE9BQVgsQ0FBb0J4bEQsQ0FBcEIsQ0FBdUI4M0YsSUFBSXZsRixDQUEzQixDQUE4QnVsRixJQUFJLzBFLENBQWxDLENBQXFDKzBFLElBQUlsdUUsQ0FBekMsQ0FBNENrdUUsSUFBSXgvRSxDQUFoRCxFQUVBLENBRUQsQ0FFRCxDQWxKc0UsQ0FvSnZFaW9CLGtCQUFtQixTQUFXaWIsS0FBWCxDQUFtQixDQUVyQ3NZLEtBQUs1NkQsU0FBTCxDQUFlcW5DLGlCQUFmLENBQWlDM2xDLElBQWpDLENBQXVDLElBQXZDLENBQTZDNGdELEtBQTdDLEVBRUEsR0FBSyxLQUFLMDdDLFFBQUwsR0FBa0IsVUFBdkIsQ0FBb0MsQ0FFbkMsS0FBS0UsaUJBQUwsQ0FBdUJsb0UsVUFBdkIsQ0FBbUMsS0FBS29JLFdBQXhDLEVBRUEsQ0FKRCxRQUlZLEtBQUs0L0QsUUFBTCxHQUFrQixVQUF2QixDQUFvQyxDQUUxQyxLQUFLRSxpQkFBTCxDQUF1QmxvRSxVQUF2QixDQUFtQyxLQUFLaW9FLFVBQXhDLEVBRUEsQ0FKTSxJQUlBLENBRU5saUYsUUFBUTZQLElBQVIsQ0FBYyw2Q0FBK0MsS0FBS295RSxRQUFsRSxFQUVBLENBRUQsQ0F0S3NFLENBd0t2RXZ5RSxNQUFPLFVBQVksQ0FFbEIsZ0JBQWdCbnBCLFdBQVQsQ0FBc0IsS0FBS3lrQyxRQUEzQixDQUFxQyxLQUFLZ2MsUUFBMUMsRUFBcURyM0IsSUFBckQsQ0FBMkQsSUFBM0QsQ0FBUCxDQUVBLENBNUtzRSxDQUFoRCxDQUF4QixDQWdMQTs7Ozs7Ozs7Ozs7O0tBY0EsMEJBQUEsQ0FBNEJtM0IsVUFBNUIsQ0FBeUMsQ0FFeEM2USxTQUFTaHlELElBQVQsQ0FBZSxJQUFmLEVBRUEsS0FBS0QsSUFBTCxDQUFZLG1CQUFaLENBRUEsS0FBS3V6QyxLQUFMLENBQWEsU0FBQSxDQUFXLFFBQVgsQ0FBYixDQUVBLEtBQUtvZixTQUFMLENBQWlCLENBQWpCLENBQ0EsS0FBS3lxQyxPQUFMLENBQWUsT0FBZixDQUNBLEtBQUtDLFFBQUwsQ0FBZ0IsT0FBaEIsQ0FFQSxLQUFLN2xELE1BQUwsQ0FBYyxLQUFkLENBRUEsS0FBSzRhLFNBQUwsQ0FBZ0JoUixVQUFoQixFQUVBLENBRURpc0Isa0JBQWtCOXVFLFNBQWxCLENBQThCRCxPQUFPaUIsTUFBUCxDQUFlMHlELFNBQVMxekQsU0FBeEIsQ0FBOUIsQ0FDQTh1RSxrQkFBa0I5dUUsU0FBbEIsQ0FBNEJzQyxXQUE1QixDQUEwQ3dzRSxpQkFBMUMsQ0FFQUEsa0JBQWtCOXVFLFNBQWxCLENBQTRCeTZGLG1CQUE1QixDQUFrRCxJQUFsRCxDQUVBM3JCLGtCQUFrQjl1RSxTQUFsQixDQUE0QjByQixJQUE1QixDQUFtQyxTQUFXNWYsTUFBWCxDQUFvQixDQUV0RDRuRCxTQUFTMXpELFNBQVQsQ0FBbUIwckIsSUFBbkIsQ0FBd0JocUIsSUFBeEIsQ0FBOEIsSUFBOUIsQ0FBb0NvSyxNQUFwQyxFQUVBLEtBQUtrcEMsS0FBTCxDQUFXdHBCLElBQVgsQ0FBaUI1ZixPQUFPa3BDLEtBQXhCLEVBRUEsS0FBS29mLFNBQUwsQ0FBaUJ0b0QsT0FBT3NvRCxTQUF4QixDQUNBLEtBQUt5cUMsT0FBTCxDQUFlL3lGLE9BQU8reUYsT0FBdEIsQ0FDQSxLQUFLQyxRQUFMLENBQWdCaHpGLE9BQU9nekYsUUFBdkIsQ0FFQSxXQUFBLENBRUEsQ0FaRCxDQWNBOztLQUlBLGFBQUEsQ0FBZS8zRCxRQUFmLENBQXlCZ2MsUUFBekIsQ0FBbUMxMEMsSUFBbkMsQ0FBMEMsQ0FFekMsR0FBS0EsT0FBUyxDQUFkLENBQWtCLENBRWpCME4sUUFBUTZQLElBQVIsQ0FBYyxpR0FBZCxFQUNBLHVCQUFPLENBQWtCbWIsUUFBbEIsQ0FBNEJnYyxRQUE1QixDQUFQLENBRUEsQ0FFRHRELFNBQVMvOUMsSUFBVCxDQUFlLElBQWYsRUFFQSxLQUFLRCxJQUFMLENBQVksTUFBWixDQUVBLEtBQUtzbEMsUUFBTCxDQUFnQkEsV0FBYTNoQyxTQUFiLENBQXlCMmhDLFFBQXpCLENBQW9DLGtCQUFBLEVBQXBELENBQ0EsS0FBS2djLFFBQUwsQ0FBZ0JBLFdBQWEzOUMsU0FBYixDQUF5QjI5QyxRQUF6QixDQUFvQyxxQkFBQSxDQUF1QixDQUFFL04sTUFBT3JzQyxLQUFLNkYsTUFBTCxHQUFnQixRQUF6QixDQUF2QixDQUFwRCxDQUVBLENBRUR1d0YsS0FBSy8rRixTQUFMLENBQWlCRCxPQUFPNG5CLE1BQVAsQ0FBZTVuQixPQUFPaUIsTUFBUCxDQUFleStDLFNBQVN6L0MsU0FBeEIsQ0FBZixDQUFvRCxDQUVwRXNDLFlBQWF5OEYsSUFGdUQsQ0FJcEVwd0MsT0FBUSxJQUo0RCxDQU1wRXF3QyxxQkFBd0IsVUFBWSxDQUVuQyxVQUFZLFdBQUEsRUFBWixDQUNBLFFBQVUsV0FBQSxFQUFWLENBRUEsb0NBQU8sRUFBZ0MsQ0FFdEMsYUFBZSxLQUFLajRELFFBQXBCLENBRUEsR0FBS0EsU0FBU0ksZ0JBQWQsQ0FBaUM7RUFJaEMsR0FBS0osU0FBU3I1QixLQUFULEdBQW1CLElBQXhCLENBQStCLENBRTlCLHNCQUF3QnE1QixTQUFTSyxVQUFULENBQW9CMVAsUUFBNUMsQ0FDQSxrQkFBb0IsQ0FBRSxDQUFGLENBQXBCLENBRUEsSUFBTSxNQUFRLENBQVIsQ0FBV251QixFQUFJMDFGLGtCQUFrQnpwRSxLQUF2QyxDQUE4QzF1QixFQUFJeUMsQ0FBbEQsQ0FBcUR6QyxHQUFyRCxDQUE0RCxDQUUzRHdqQyxNQUFNaGMsbUJBQU4sQ0FBMkIyd0UsaUJBQTNCLENBQThDbjRGLEVBQUksQ0FBbEQsRUFDQTBqQyxJQUFJbGMsbUJBQUosQ0FBeUIyd0UsaUJBQXpCLENBQTRDbjRGLENBQTVDLEVBRUFxK0MsY0FBZXIrQyxDQUFmLEVBQXFCcStDLGNBQWVyK0MsRUFBSSxDQUFuQixDQUFyQixDQUNBcStDLGNBQWVyK0MsQ0FBZixHQUFzQndqQyxNQUFNOWMsVUFBTixDQUFrQmdkLEdBQWxCLENBQXRCLENBRUEsQ0FFRHpELFNBQVNvbkIsWUFBVCxDQUF1QixjQUF2QixDQUF1QywwQkFBQSxDQUE0QmhKLGFBQTVCLENBQTJDLENBQTNDLENBQXZDLEVBRUEsQ0FqQkQsSUFpQk8sQ0FFTnBwQyxRQUFRNlAsSUFBUixDQUFjLCtGQUFkLEVBRUEsQ0FFRCxDQTNCRCxRQTJCWW1iLFNBQVNDLFVBQWQsQ0FBMkIsQ0FFakMsYUFBZUQsU0FBU0UsUUFBeEIsQ0FDQSxrQkFBb0JGLFNBQVNvZSxhQUE3QixDQUVBQSxjQUFlLENBQWYsRUFBcUIsQ0FBckIsQ0FFQSxJQUFNLE1BQVEsQ0FBUixDQUFXNTdDLEVBQUkwOUIsU0FBU3hnQyxNQUE5QixDQUFzQ0ssRUFBSXlDLENBQTFDLENBQTZDekMsR0FBN0MsQ0FBb0QsQ0FFbkRxK0MsY0FBZXIrQyxDQUFmLEVBQXFCcStDLGNBQWVyK0MsRUFBSSxDQUFuQixDQUFyQixDQUNBcStDLGNBQWVyK0MsQ0FBZixHQUFzQm1nQyxTQUFVbmdDLEVBQUksQ0FBZCxFQUFrQjBtQixVQUFsQixDQUE4QnlaLFNBQVVuZ0MsQ0FBVixDQUE5QixDQUF0QixDQUVBLENBRUQsQ0FFRCxXQUFBLENBRUEsQ0FqREQsQ0FtREEsQ0F4RHVCLEVBTjRDLENBZ0VwRXE3QyxRQUFXLFVBQVksQ0FFdEIsa0JBQW9CLFdBQUEsRUFBcEIsQ0FDQSxRQUFVLE9BQUEsRUFBVixDQUNBLFdBQWEsVUFBQSxFQUFiLENBRUEsdUJBQU8sQ0FBa0JpWixTQUFsQixDQUE2QlksVUFBN0IsQ0FBMEMsQ0FFaEQsY0FBZ0JaLFVBQVU4akMsYUFBMUIsQ0FDQSxnQkFBa0I3MUMsVUFBWUEsU0FBOUIsQ0FFQSxhQUFlLEtBQUt0aUIsUUFBcEIsQ0FDQSxnQkFBa0IsS0FBSzNJLFdBQXZCLENBRUE7RUFFQSxHQUFLMkksU0FBU3lGLGNBQVQsR0FBNEIsSUFBakMsQ0FBd0N6RixTQUFTMEYscUJBQVQsR0FFeEM3RSxPQUFPbGMsSUFBUCxDQUFhcWIsU0FBU3lGLGNBQXRCLEVBQ0E1RSxPQUFPbFMsWUFBUCxDQUFxQjBJLFdBQXJCLEVBRUEsR0FBS2c5QixVQUFVdEYsR0FBVixDQUFjbnVCLGdCQUFkLENBQWdDQyxNQUFoQyxJQUE2QyxLQUFsRCxDQUEwRCxPQUUxRDtFQUVBcTBCLGNBQWNqbUMsVUFBZCxDQUEwQm9JLFdBQTFCLEVBQ0EwM0IsSUFBSXBxQyxJQUFKLENBQVUwdkMsVUFBVXRGLEdBQXBCLEVBQTBCcGdDLFlBQTFCLENBQXdDdW1DLGFBQXhDLEVBRUEsV0FBYSxXQUFBLEVBQWIsQ0FDQSxTQUFXLFdBQUEsRUFBWCxDQUNBLGlCQUFtQixXQUFBLEVBQW5CLENBQ0EsYUFBZSxXQUFBLEVBQWYsQ0FDQSxTQUFhLE1BQVEsS0FBS3E2QixjQUFmLENBQWtDLENBQWxDLENBQXNDLENBQWpELENBRUEsR0FBS3Z2RCxTQUFTSSxnQkFBZCxDQUFpQyxDQUVoQyxVQUFZSixTQUFTcjVCLEtBQXJCLENBQ0EsZUFBaUJxNUIsU0FBU0ssVUFBMUIsQ0FDQSxjQUFnQkEsV0FBVzFQLFFBQVgsQ0FBb0I3USxLQUFwQyxDQUVBLEdBQUtuWixRQUFVLElBQWYsQ0FBc0IsQ0FFckIsWUFBY0EsTUFBTW1aLEtBQXBCLENBRUEsSUFBTSxNQUFRLENBQVIsQ0FBV3RkLEVBQUlxOUMsUUFBUW5nRCxNQUFSLENBQWlCLENBQXRDLENBQXlDSyxFQUFJeUMsQ0FBN0MsQ0FBZ0R6QyxHQUFLa08sSUFBckQsQ0FBNEQsQ0FFM0QsTUFBUTR4QyxRQUFTOS9DLENBQVQsQ0FBUixDQUNBLE1BQVE4L0MsUUFBUzkvQyxFQUFJLENBQWIsQ0FBUixDQUVBcTRGLE9BQU9oeEUsU0FBUCxDQUFrQmk0QixTQUFsQixDQUE2QjU4QyxFQUFJLENBQWpDLEVBQ0E0MUYsS0FBS2p4RSxTQUFMLENBQWdCaTRCLFNBQWhCLENBQTJCOThDLEVBQUksQ0FBL0IsRUFFQSxXQUFhd3NELElBQUlNLG1CQUFKLENBQXlCK29DLE1BQXpCLENBQWlDQyxJQUFqQyxDQUF1Q0MsUUFBdkMsQ0FBaURDLFlBQWpELENBQWIsQ0FFQSxHQUFLQyxPQUFTQyxXQUFkLENBQTRCLFNBRTVCSCxTQUFTM3BFLFlBQVQsQ0FBdUIsS0FBSzBJLFdBQTVCLEVBQTJDO0VBRTNDLGFBQWVnOUIsVUFBVXRGLEdBQVYsQ0FBY0YsTUFBZCxDQUFxQnBvQyxVQUFyQixDQUFpQzZ4RSxRQUFqQyxDQUFmLENBRUEsR0FBS3p5RCxTQUFXd3VCLFVBQVV6aUMsSUFBckIsRUFBNkJpVSxTQUFXd3VCLFVBQVV4aUMsR0FBdkQsQ0FBNkQsU0FFN0RvakMsV0FBVy8xRCxJQUFYLENBQWlCLENBRWhCMm1DLFNBQVVBLFFBRk07RUFJaEI7RUFDQWw1QixNQUFPNHJGLGFBQWE3ekUsS0FBYixHQUFxQmlLLFlBQXJCLENBQW1DLEtBQUswSSxXQUF4QyxDQUxTLENBTWhCMXdCLE1BQU81RyxDQU5TLENBT2hCZy9DLEtBQU0sSUFQVSxDQVFoQmlXLFVBQVcsSUFSSyxDQVNoQnoxRCxPQUFRLElBVFEsQ0FBakIsRUFhQSxDQUVELENBckNELElBcUNPLENBRU4sSUFBTSxNQUFRLENBQVIsQ0FBV2lELEVBQUk2OEMsVUFBVTMvQyxNQUFWLENBQW1CLENBQW5CLENBQXVCLENBQTVDLENBQStDSyxFQUFJeUMsQ0FBbkQsQ0FBc0R6QyxHQUFLa08sSUFBM0QsQ0FBa0UsQ0FFakVtcUYsT0FBT2h4RSxTQUFQLENBQWtCaTRCLFNBQWxCLENBQTZCLEVBQUl0L0MsQ0FBakMsRUFDQXM0RixLQUFLanhFLFNBQUwsQ0FBZ0JpNEIsU0FBaEIsQ0FBMkIsRUFBSXQvQyxDQUFKLENBQVEsQ0FBbkMsRUFFQSxXQUFhZ3ZELElBQUlNLG1CQUFKLENBQXlCK29DLE1BQXpCLENBQWlDQyxJQUFqQyxDQUF1Q0MsUUFBdkMsQ0FBaURDLFlBQWpELENBQWIsQ0FFQSxHQUFLQyxPQUFTQyxXQUFkLENBQTRCLFNBRTVCSCxTQUFTM3BFLFlBQVQsQ0FBdUIsS0FBSzBJLFdBQTVCLEVBQTJDO0VBRTNDLGFBQWVnOUIsVUFBVXRGLEdBQVYsQ0FBY0YsTUFBZCxDQUFxQnBvQyxVQUFyQixDQUFpQzZ4RSxRQUFqQyxDQUFmLENBRUEsR0FBS3p5RCxTQUFXd3VCLFVBQVV6aUMsSUFBckIsRUFBNkJpVSxTQUFXd3VCLFVBQVV4aUMsR0FBdkQsQ0FBNkQsU0FFN0RvakMsV0FBVy8xRCxJQUFYLENBQWlCLENBRWhCMm1DLFNBQVVBLFFBRk07RUFJaEI7RUFDQWw1QixNQUFPNHJGLGFBQWE3ekUsS0FBYixHQUFxQmlLLFlBQXJCLENBQW1DLEtBQUswSSxXQUF4QyxDQUxTLENBTWhCMXdCLE1BQU81RyxDQU5TLENBT2hCZy9DLEtBQU0sSUFQVSxDQVFoQmlXLFVBQVcsSUFSSyxDQVNoQnoxRCxPQUFRLElBVFEsQ0FBakIsRUFhQSxDQUVELENBRUQsQ0E3RUQsUUE2RVl5Z0MsU0FBU0MsVUFBZCxDQUEyQixDQUVqQyxhQUFlRCxTQUFTRSxRQUF4QixDQUNBLGVBQWlCQSxTQUFTeGdDLE1BQTFCLENBRUEsSUFBTSxNQUFRLENBQWQsQ0FBaUJLLEVBQUkyNEYsV0FBYSxDQUFsQyxDQUFxQzM0RixHQUFLa08sSUFBMUMsQ0FBaUQsQ0FFaEQsV0FBYThnRCxJQUFJTSxtQkFBSixDQUF5Qm52QixTQUFVbmdDLENBQVYsQ0FBekIsQ0FBd0NtZ0MsU0FBVW5nQyxFQUFJLENBQWQsQ0FBeEMsQ0FBMkR1NEYsUUFBM0QsQ0FBcUVDLFlBQXJFLENBQWIsQ0FFQSxHQUFLQyxPQUFTQyxXQUFkLENBQTRCLFNBRTVCSCxTQUFTM3BFLFlBQVQsQ0FBdUIsS0FBSzBJLFdBQTVCLEVBQTJDO0VBRTNDLGFBQWVnOUIsVUFBVXRGLEdBQVYsQ0FBY0YsTUFBZCxDQUFxQnBvQyxVQUFyQixDQUFpQzZ4RSxRQUFqQyxDQUFmLENBRUEsR0FBS3p5RCxTQUFXd3VCLFVBQVV6aUMsSUFBckIsRUFBNkJpVSxTQUFXd3VCLFVBQVV4aUMsR0FBdkQsQ0FBNkQsU0FFN0RvakMsV0FBVy8xRCxJQUFYLENBQWlCLENBRWhCMm1DLFNBQVVBLFFBRk07RUFJaEI7RUFDQWw1QixNQUFPNHJGLGFBQWE3ekUsS0FBYixHQUFxQmlLLFlBQXJCLENBQW1DLEtBQUswSSxXQUF4QyxDQUxTLENBTWhCMXdCLE1BQU81RyxDQU5TLENBT2hCZy9DLEtBQU0sSUFQVSxDQVFoQmlXLFVBQVcsSUFSSyxDQVNoQnoxRCxPQUFRLElBVFEsQ0FBakIsRUFhQSxDQUVELENBRUQsQ0EzSUQsQ0E2SUEsQ0FuSlUsRUFoRXlELENBcU5wRW1sQixNQUFPLFVBQVksQ0FFbEIsZ0JBQWdCbnBCLFdBQVQsQ0FBc0IsS0FBS3lrQyxRQUEzQixDQUFxQyxLQUFLZ2MsUUFBMUMsRUFBcURyM0IsSUFBckQsQ0FBMkQsSUFBM0QsQ0FBUCxDQUVBLENBek5tRSxDQUFwRCxDQUFqQixDQTZOQTs7S0FJQSxxQkFBQSxDQUF1QnFiLFFBQXZCLENBQWlDZ2MsUUFBakMsQ0FBNEMsQ0FFM0NnOEMsS0FBS3I5RixJQUFMLENBQVcsSUFBWCxDQUFpQnFsQyxRQUFqQixDQUEyQmdjLFFBQTNCLEVBRUEsS0FBS3RoRCxJQUFMLENBQVksY0FBWixDQUVBLENBRURpK0YsYUFBYTEvRixTQUFiLENBQXlCRCxPQUFPNG5CLE1BQVAsQ0FBZTVuQixPQUFPaUIsTUFBUCxDQUFlKzlGLEtBQUsvK0YsU0FBcEIsQ0FBZixDQUFnRCxDQUV4RXNDLFlBQWFvOUYsWUFGMkQsQ0FJeEVwSixlQUFnQixJQUp3RCxDQU14RTBJLHFCQUF3QixVQUFZLENBRW5DLFVBQVksV0FBQSxFQUFaLENBQ0EsUUFBVSxXQUFBLEVBQVYsQ0FFQSxvQ0FBTyxFQUFnQyxDQUV0QyxhQUFlLEtBQUtqNEQsUUFBcEIsQ0FFQSxHQUFLQSxTQUFTSSxnQkFBZCxDQUFpQztFQUloQyxHQUFLSixTQUFTcjVCLEtBQVQsR0FBbUIsSUFBeEIsQ0FBK0IsQ0FFOUIsc0JBQXdCcTVCLFNBQVNLLFVBQVQsQ0FBb0IxUCxRQUE1QyxDQUNBLGtCQUFvQixFQUFwQixDQUVBLElBQU0sTUFBUSxDQUFSLENBQVdudUIsRUFBSTAxRixrQkFBa0J6cEUsS0FBdkMsQ0FBOEMxdUIsRUFBSXlDLENBQWxELENBQXFEekMsR0FBSyxDQUExRCxDQUE4RCxDQUU3RHdqQyxNQUFNaGMsbUJBQU4sQ0FBMkIyd0UsaUJBQTNCLENBQThDbjRGLENBQTlDLEVBQ0EwakMsSUFBSWxjLG1CQUFKLENBQXlCMndFLGlCQUF6QixDQUE0Q240RixFQUFJLENBQWhELEVBRUFxK0MsY0FBZXIrQyxDQUFmLEVBQXVCQSxJQUFNLENBQVIsQ0FBYyxDQUFkLENBQWtCcStDLGNBQWVyK0MsRUFBSSxDQUFuQixDQUF2QyxDQUNBcStDLGNBQWVyK0MsRUFBSSxDQUFuQixFQUF5QnErQyxjQUFlcitDLENBQWYsRUFBcUJ3akMsTUFBTTljLFVBQU4sQ0FBa0JnZCxHQUFsQixDQUE5QyxDQUVBLENBRUR6RCxTQUFTb25CLFlBQVQsQ0FBdUIsY0FBdkIsQ0FBdUMsMEJBQUEsQ0FBNEJoSixhQUE1QixDQUEyQyxDQUEzQyxDQUF2QyxFQUVBLENBakJELElBaUJPLENBRU5wcEMsUUFBUTZQLElBQVIsQ0FBYyx1R0FBZCxFQUVBLENBRUQsQ0EzQkQsUUEyQlltYixTQUFTQyxVQUFkLENBQTJCLENBRWpDLGFBQWVELFNBQVNFLFFBQXhCLENBQ0Esa0JBQW9CRixTQUFTb2UsYUFBN0IsQ0FFQSxJQUFNLE1BQVEsQ0FBUixDQUFXNTdDLEVBQUkwOUIsU0FBU3hnQyxNQUE5QixDQUFzQ0ssRUFBSXlDLENBQTFDLENBQTZDekMsR0FBSyxDQUFsRCxDQUFzRCxDQUVyRHdqQyxNQUFNNWUsSUFBTixDQUFZdWIsU0FBVW5nQyxDQUFWLENBQVosRUFDQTBqQyxJQUFJOWUsSUFBSixDQUFVdWIsU0FBVW5nQyxFQUFJLENBQWQsQ0FBVixFQUVBcStDLGNBQWVyK0MsQ0FBZixFQUF1QkEsSUFBTSxDQUFSLENBQWMsQ0FBZCxDQUFrQnErQyxjQUFlcitDLEVBQUksQ0FBbkIsQ0FBdkMsQ0FDQXErQyxjQUFlcitDLEVBQUksQ0FBbkIsRUFBeUJxK0MsY0FBZXIrQyxDQUFmLEVBQXFCd2pDLE1BQU05YyxVQUFOLENBQWtCZ2QsR0FBbEIsQ0FBOUMsQ0FFQSxDQUVELENBRUQsV0FBQSxDQUVBLENBbERELENBb0RBLENBekR1QixFQU5nRCxDQUFoRCxDQUF6QixDQW1FQTs7S0FJQSxpQkFBQSxDQUFtQnpELFFBQW5CLENBQTZCZ2MsUUFBN0IsQ0FBd0MsQ0FFdkNnOEMsS0FBS3I5RixJQUFMLENBQVcsSUFBWCxDQUFpQnFsQyxRQUFqQixDQUEyQmdjLFFBQTNCLEVBRUEsS0FBS3RoRCxJQUFMLENBQVksVUFBWixDQUVBLENBRURrK0YsU0FBUzMvRixTQUFULENBQXFCRCxPQUFPNG5CLE1BQVAsQ0FBZTVuQixPQUFPaUIsTUFBUCxDQUFlKzlGLEtBQUsvK0YsU0FBcEIsQ0FBZixDQUFnRCxDQUVwRXNDLFlBQWFxOUYsUUFGdUQsQ0FJcEVwSixXQUFZLElBSndELENBQWhELENBQXJCLENBUUE7Ozs7Ozs7Ozs7OztLQWNBLHVCQUFBLENBQXlCMXpDLFVBQXpCLENBQXNDLENBRXJDNlEsU0FBU2h5RCxJQUFULENBQWUsSUFBZixFQUVBLEtBQUtELElBQUwsQ0FBWSxnQkFBWixDQUVBLEtBQUt1ekMsS0FBTCxDQUFhLFNBQUEsQ0FBVyxRQUFYLENBQWIsQ0FFQSxLQUFLeUIsR0FBTCxDQUFXLElBQVgsQ0FFQSxLQUFLcFEsSUFBTCxDQUFZLENBQVosQ0FDQSxLQUFLOHRCLGVBQUwsQ0FBdUIsSUFBdkIsQ0FFQSxLQUFLbGIsTUFBTCxDQUFjLEtBQWQsQ0FFQSxLQUFLNGEsU0FBTCxDQUFnQmhSLFVBQWhCLEVBRUEsQ0FFRG1zQixlQUFlaHZFLFNBQWYsQ0FBMkJELE9BQU9pQixNQUFQLENBQWUweUQsU0FBUzF6RCxTQUF4QixDQUEzQixDQUNBZ3ZFLGVBQWVodkUsU0FBZixDQUF5QnNDLFdBQXpCLENBQXVDMHNFLGNBQXZDLENBRUFBLGVBQWVodkUsU0FBZixDQUF5QjY2RixnQkFBekIsQ0FBNEMsSUFBNUMsQ0FFQTdyQixlQUFlaHZFLFNBQWYsQ0FBeUIwckIsSUFBekIsQ0FBZ0MsU0FBVzVmLE1BQVgsQ0FBb0IsQ0FFbkQ0bkQsU0FBUzF6RCxTQUFULENBQW1CMHJCLElBQW5CLENBQXdCaHFCLElBQXhCLENBQThCLElBQTlCLENBQW9Db0ssTUFBcEMsRUFFQSxLQUFLa3BDLEtBQUwsQ0FBV3RwQixJQUFYLENBQWlCNWYsT0FBT2twQyxLQUF4QixFQUVBLEtBQUt5QixHQUFMLENBQVczcUMsT0FBTzJxQyxHQUFsQixDQUVBLEtBQUtwUSxJQUFMLENBQVl2NkIsT0FBT3U2QixJQUFuQixDQUNBLEtBQUs4dEIsZUFBTCxDQUF1QnJvRCxPQUFPcW9ELGVBQTlCLENBRUEsV0FBQSxDQUVBLENBYkQsQ0FlQTs7S0FJQSxlQUFBLENBQWlCcHRCLFFBQWpCLENBQTJCZ2MsUUFBM0IsQ0FBc0MsQ0FFckN0RCxTQUFTLzlDLElBQVQsQ0FBZSxJQUFmLEVBRUEsS0FBS0QsSUFBTCxDQUFZLFFBQVosQ0FFQSxLQUFLc2xDLFFBQUwsQ0FBZ0JBLFdBQWEzaEMsU0FBYixDQUF5QjJoQyxRQUF6QixDQUFvQyxrQkFBQSxFQUFwRCxDQUNBLEtBQUtnYyxRQUFMLENBQWdCQSxXQUFhMzlDLFNBQWIsQ0FBeUIyOUMsUUFBekIsQ0FBb0Msa0JBQUEsQ0FBb0IsQ0FBRS9OLE1BQU9yc0MsS0FBSzZGLE1BQUwsR0FBZ0IsUUFBekIsQ0FBcEIsQ0FBcEQsQ0FFQSxDQUVEb3hGLE9BQU81L0YsU0FBUCxDQUFtQkQsT0FBTzRuQixNQUFQLENBQWU1bkIsT0FBT2lCLE1BQVAsQ0FBZXkrQyxTQUFTei9DLFNBQXhCLENBQWYsQ0FBb0QsQ0FFdEVzQyxZQUFhczlGLE1BRnlELENBSXRFbHhDLFNBQVUsSUFKNEQsQ0FNdEV2TSxRQUFXLFVBQVksQ0FFdEIsa0JBQW9CLFdBQUEsRUFBcEIsQ0FDQSxRQUFVLE9BQUEsRUFBVixDQUNBLFdBQWEsVUFBQSxFQUFiLENBRUEsdUJBQU8sQ0FBa0JpWixTQUFsQixDQUE2QlksVUFBN0IsQ0FBMEMsQ0FFaEQsV0FBYSxJQUFiLENBQ0EsYUFBZSxLQUFLajFCLFFBQXBCLENBQ0EsZ0JBQWtCLEtBQUszSSxXQUF2QixDQUNBLGNBQWdCZzlCLFVBQVV5a0MsTUFBVixDQUFpQkQsTUFBakIsQ0FBd0JFLFNBQXhDLENBRUE7RUFFQSxHQUFLLzRELFNBQVN5RixjQUFULEdBQTRCLElBQWpDLENBQXdDekYsU0FBUzBGLHFCQUFULEdBRXhDN0UsT0FBT2xjLElBQVAsQ0FBYXFiLFNBQVN5RixjQUF0QixFQUNBNUUsT0FBT2xTLFlBQVAsQ0FBcUIwSSxXQUFyQixFQUNBd0osT0FBT3BJLE1BQVAsRUFBaUJzZ0UsU0FBakIsQ0FFQSxHQUFLMWtDLFVBQVV0RixHQUFWLENBQWNudUIsZ0JBQWQsQ0FBZ0NDLE1BQWhDLElBQTZDLEtBQWxELENBQTBELE9BRTFEO0VBRUFxMEIsY0FBY2ptQyxVQUFkLENBQTBCb0ksV0FBMUIsRUFDQTAzQixJQUFJcHFDLElBQUosQ0FBVTB2QyxVQUFVdEYsR0FBcEIsRUFBMEJwZ0MsWUFBMUIsQ0FBd0N1bUMsYUFBeEMsRUFFQSxtQkFBcUI2akMsV0FBYyxDQUFFLEtBQUtycEUsS0FBTCxDQUFXcGQsQ0FBWCxDQUFlLEtBQUtvZCxLQUFMLENBQVc1TSxDQUExQixDQUE4QixLQUFLNE0sS0FBTCxDQUFXL0YsQ0FBM0MsRUFBaUQsQ0FBL0QsQ0FBckIsQ0FDQSxxQkFBdUJxdkUsZUFBaUJBLGNBQXhDLENBQ0EsYUFBZSxXQUFBLEVBQWYsQ0FDQSxtQkFBcUIsV0FBQSxFQUFyQixDQUVBLGtCQUFBLENBQW9CcnNGLEtBQXBCLENBQTJCaEcsS0FBM0IsQ0FBbUMsQ0FFbEMsdUJBQXlCb29ELElBQUlLLGlCQUFKLENBQXVCemlELEtBQXZCLENBQXpCLENBRUEsR0FBS3NzRixtQkFBcUJDLGdCQUExQixDQUE2QyxDQUU1Q25xQyxJQUFJRyxtQkFBSixDQUF5QnZpRCxLQUF6QixDQUFnQ3FwRixjQUFoQyxFQUNBQSxlQUFlcm5FLFlBQWYsQ0FBNkIwSSxXQUE3QixFQUVBLGFBQWVnOUIsVUFBVXRGLEdBQVYsQ0FBY0YsTUFBZCxDQUFxQnBvQyxVQUFyQixDQUFpQ3V2RSxjQUFqQyxDQUFmLENBRUEsR0FBS253RCxTQUFXd3VCLFVBQVV6aUMsSUFBckIsRUFBNkJpVSxTQUFXd3VCLFVBQVV4aUMsR0FBdkQsQ0FBNkQsT0FFN0RvakMsV0FBVy8xRCxJQUFYLENBQWlCLENBRWhCMm1DLFNBQVVBLFFBRk0sQ0FHaEJzekQsY0FBZXYzRixLQUFLdWtCLElBQUwsQ0FBVzh5RSxrQkFBWCxDQUhDLENBSWhCdHNGLE1BQU9xcEYsZUFBZXR4RSxLQUFmLEVBSlMsQ0FLaEIvZCxNQUFPQSxLQUxTLENBTWhCbzRDLEtBQU0sSUFOVSxDQU9oQngvQyxPQUFRQSxNQVBRLENBQWpCLEVBV0EsQ0FFRCxDQUVELEdBQUt5Z0MsU0FBU0ksZ0JBQWQsQ0FBaUMsQ0FFaEMsVUFBWUosU0FBU3I1QixLQUFyQixDQUNBLGVBQWlCcTVCLFNBQVNLLFVBQTFCLENBQ0EsY0FBZ0JBLFdBQVcxUCxRQUFYLENBQW9CN1EsS0FBcEMsQ0FFQSxHQUFLblosUUFBVSxJQUFmLENBQXNCLENBRXJCLFlBQWNBLE1BQU1tWixLQUFwQixDQUVBLElBQU0sTUFBUSxDQUFSLENBQVdxZixHQUFLMGdCLFFBQVFuZ0QsTUFBOUIsQ0FBc0NLLEVBQUlvL0IsRUFBMUMsQ0FBOENwL0IsR0FBOUMsQ0FBcUQsQ0FFcEQsTUFBUTgvQyxRQUFTOS9DLENBQVQsQ0FBUixDQUVBNHdCLFNBQVN2SixTQUFULENBQW9CaTRCLFNBQXBCLENBQStCNThDLEVBQUksQ0FBbkMsRUFFQTIyRixVQUFXem9FLFFBQVgsQ0FBcUJsdUIsQ0FBckIsRUFFQSxDQUVELENBZEQsSUFjTyxDQUVOLElBQU0sTUFBUSxDQUFSLENBQVdELEVBQUk2OEMsVUFBVTMvQyxNQUFWLENBQW1CLENBQXhDLENBQTJDSyxFQUFJeUMsQ0FBL0MsQ0FBa0R6QyxHQUFsRCxDQUF5RCxDQUV4RDR3QixTQUFTdkosU0FBVCxDQUFvQmk0QixTQUFwQixDQUErQnQvQyxFQUFJLENBQW5DLEVBRUFxNUYsVUFBV3pvRSxRQUFYLENBQXFCNXdCLENBQXJCLEVBRUEsQ0FFRCxDQUVELENBaENELElBZ0NPLENBRU4sYUFBZWlnQyxTQUFTRSxRQUF4QixDQUVBLElBQU0sTUFBUSxDQUFSLENBQVcxOUIsRUFBSTA5QixTQUFTeGdDLE1BQTlCLENBQXNDSyxFQUFJeUMsQ0FBMUMsQ0FBNkN6QyxHQUE3QyxDQUFvRCxDQUVuRHE1RixVQUFXbDVELFNBQVVuZ0MsQ0FBVixDQUFYLENBQTBCQSxDQUExQixFQUVBLENBRUQsQ0FFRCxDQW5HRCxDQXFHQSxDQTNHVSxFQU4yRCxDQW1IdEUya0IsTUFBTyxVQUFZLENBRWxCLGdCQUFnQm5wQixXQUFULENBQXNCLEtBQUt5a0MsUUFBM0IsQ0FBcUMsS0FBS2djLFFBQTFDLEVBQXFEcjNCLElBQXJELENBQTJELElBQTNELENBQVAsQ0FFQSxDQXZIcUUsQ0FBcEQsQ0FBbkIsQ0EySEE7O0tBSUEsY0FBQSxFQUFpQixDQUVoQit6QixTQUFTLzlDLElBQVQsQ0FBZSxJQUFmLEVBRUEsS0FBS0QsSUFBTCxDQUFZLE9BQVosQ0FFQSxDQUVEMitGLE1BQU1wZ0csU0FBTixDQUFrQkQsT0FBTzRuQixNQUFQLENBQWU1bkIsT0FBT2lCLE1BQVAsQ0FBZXkrQyxTQUFTei9DLFNBQXhCLENBQWYsQ0FBb0QsQ0FFckVzQyxZQUFhODlGLEtBRndELENBSXJFQyxRQUFTLElBSjRELENBQXBELENBQWxCLENBUUE7O0tBSUEscUJBQUEsQ0FBdUJDLEtBQXZCLENBQThCNS9ELE9BQTlCLENBQXVDQyxLQUF2QyxDQUE4Q0MsS0FBOUMsQ0FBcURDLFNBQXJELENBQWdFQyxTQUFoRSxDQUEyRUMsTUFBM0UsQ0FBbUZ0L0IsSUFBbkYsQ0FBeUZ1L0IsVUFBekYsQ0FBc0csQ0FFckdJLFFBQVExL0IsSUFBUixDQUFjLElBQWQsQ0FBb0I0K0YsS0FBcEIsQ0FBMkI1L0QsT0FBM0IsQ0FBb0NDLEtBQXBDLENBQTJDQyxLQUEzQyxDQUFrREMsU0FBbEQsQ0FBNkRDLFNBQTdELENBQXdFQyxNQUF4RSxDQUFnRnQvQixJQUFoRixDQUFzRnUvQixVQUF0RixFQUVBLEtBQUtlLGVBQUwsQ0FBdUIsS0FBdkIsQ0FFQSxDQUVEdytELGFBQWF2Z0csU0FBYixDQUF5QkQsT0FBTzRuQixNQUFQLENBQWU1bkIsT0FBT2lCLE1BQVAsQ0FBZW9nQyxRQUFRcGhDLFNBQXZCLENBQWYsQ0FBbUQsQ0FFM0VzQyxZQUFhaStGLFlBRjhELENBSTNFOWUsZUFBZ0IsSUFKMkQsQ0FNM0VobkQsT0FBUSxVQUFZLENBRW5CLFVBQVksS0FBS2dHLEtBQWpCLENBRUEsR0FBSzYvRCxNQUFNRSxVQUFOLEVBQW9CRixNQUFNRyxpQkFBL0IsQ0FBbUQsQ0FFbEQsS0FBS2h5QyxXQUFMLENBQW1CLElBQW5CLENBRUEsQ0FFRCxDQWhCMEUsQ0FBbkQsQ0FBekIsQ0FvQkE7O0tBSUEsMEJBQUEsQ0FBNEJudEIsT0FBNUIsQ0FBcUN1QixLQUFyQyxDQUE0Q0MsTUFBNUMsQ0FBb0QvQixNQUFwRCxDQUE0RHQvQixJQUE1RCxDQUFrRWkvQixPQUFsRSxDQUEyRUMsS0FBM0UsQ0FBa0ZDLEtBQWxGLENBQXlGQyxTQUF6RixDQUFvR0MsU0FBcEcsQ0FBK0dFLFVBQS9HLENBQTJIQyxRQUEzSCxDQUFzSSxDQUVySUcsUUFBUTEvQixJQUFSLENBQWMsSUFBZCxDQUFvQixJQUFwQixDQUEwQmcvQixPQUExQixDQUFtQ0MsS0FBbkMsQ0FBMENDLEtBQTFDLENBQWlEQyxTQUFqRCxDQUE0REMsU0FBNUQsQ0FBdUVDLE1BQXZFLENBQStFdC9CLElBQS9FLENBQXFGdS9CLFVBQXJGLENBQWlHQyxRQUFqRyxFQUVBLEtBQUtSLEtBQUwsQ0FBYSxDQUFFb0MsTUFBT0EsS0FBVCxDQUFnQkMsT0FBUUEsTUFBeEIsQ0FBYixDQUNBLEtBQUt4QixPQUFMLENBQWVBLE9BQWYsQ0FFQTtFQUNBO0VBRUEsS0FBS1csS0FBTCxDQUFhLEtBQWIsQ0FFQTtFQUNBO0VBRUEsS0FBS0YsZUFBTCxDQUF1QixLQUF2QixDQUVBLENBRUQyK0Qsa0JBQWtCMWdHLFNBQWxCLENBQThCRCxPQUFPaUIsTUFBUCxDQUFlb2dDLFFBQVFwaEMsU0FBdkIsQ0FBOUIsQ0FDQTBnRyxrQkFBa0IxZ0csU0FBbEIsQ0FBNEJzQyxXQUE1QixDQUEwQ28rRixpQkFBMUMsQ0FFQUEsa0JBQWtCMWdHLFNBQWxCLENBQTRCNGlGLG1CQUE1QixDQUFrRCxJQUFsRCxDQUVBOzs7S0FLQSxxQkFBQSxDQUF1Qi8vQyxLQUF2QixDQUE4QkMsTUFBOUIsQ0FBc0NyaEMsSUFBdEMsQ0FBNENpL0IsT0FBNUMsQ0FBcURDLEtBQXJELENBQTREQyxLQUE1RCxDQUFtRUMsU0FBbkUsQ0FBOEVDLFNBQTlFLENBQXlGRSxVQUF6RixDQUFxR0QsTUFBckcsQ0FBOEcsQ0FFN0dBLE9BQVNBLFNBQVczN0IsU0FBWCxDQUF1QjI3QixNQUF2QixDQUFnQzRqRCxXQUF6QyxDQUVBLEdBQUs1akQsU0FBVzRqRCxXQUFYLEVBQTBCNWpELFNBQVcrakQsa0JBQTFDLENBQStELENBRTlELGVBQU0sQ0FBVyxrRkFBWCxDQUFOLENBRUEsQ0FFRCxHQUFLcmpGLE9BQVMyRCxTQUFULEVBQXNCMjdCLFNBQVc0akQsV0FBdEMsQ0FBb0RsakYsS0FBT21qRixpQkFBUCxDQUNwRCxHQUFLbmpGLE9BQVMyRCxTQUFULEVBQXNCMjdCLFNBQVcrakQsa0JBQXRDLENBQTJEcmpGLEtBQU91akYsa0JBQVAsQ0FFM0Q1akQsUUFBUTEvQixJQUFSLENBQWMsSUFBZCxDQUFvQixJQUFwQixDQUEwQmcvQixPQUExQixDQUFtQ0MsS0FBbkMsQ0FBMENDLEtBQTFDLENBQWlEQyxTQUFqRCxDQUE0REMsU0FBNUQsQ0FBdUVDLE1BQXZFLENBQStFdC9CLElBQS9FLENBQXFGdS9CLFVBQXJGLEVBRUEsS0FBS1AsS0FBTCxDQUFhLENBQUVvQyxNQUFPQSxLQUFULENBQWdCQyxPQUFRQSxNQUF4QixDQUFiLENBRUEsS0FBS2pDLFNBQUwsQ0FBaUJBLFlBQWN6N0IsU0FBZCxDQUEwQnk3QixTQUExQixDQUFzQ29FLGFBQXZELENBQ0EsS0FBS25FLFNBQUwsQ0FBaUJBLFlBQWMxN0IsU0FBZCxDQUEwQjA3QixTQUExQixDQUFzQ21FLGFBQXZELENBRUEsS0FBS2hELEtBQUwsQ0FBYSxLQUFiLENBQ0EsS0FBS0YsZUFBTCxDQUF1QixLQUF2QixDQUVBLENBRUQ0K0QsYUFBYTNnRyxTQUFiLENBQXlCRCxPQUFPaUIsTUFBUCxDQUFlb2dDLFFBQVFwaEMsU0FBdkIsQ0FBekIsQ0FDQTJnRyxhQUFhM2dHLFNBQWIsQ0FBdUJzQyxXQUF2QixDQUFxQ3ErRixZQUFyQyxDQUNBQSxhQUFhM2dHLFNBQWIsQ0FBdUJxa0YsY0FBdkIsQ0FBd0MsSUFBeEMsQ0FFQTs7O0tBS0EsMEJBQUEsQ0FBNEJ0OUMsUUFBNUIsQ0FBdUMsQ0FFdENnbkIsZUFBZXJzRCxJQUFmLENBQXFCLElBQXJCLEVBRUEsS0FBS0QsSUFBTCxDQUFZLG1CQUFaLENBRUE7RUFFQSxhQUFlLEVBQWYsQ0FFQTtFQUVBLEtBQUEsQ0FBT2loQixDQUFQLENBQVVuWixDQUFWLENBQWFtYixDQUFiLENBQWdCazhFLEVBQWhCLENBQ0EsU0FBVyxDQUFFLENBQUYsQ0FBSyxDQUFMLENBQVgsQ0FBcUJDLE1BQVEsRUFBN0IsQ0FBaUNwNEYsQ0FBakMsQ0FBb0M2dkQsS0FBcEMsQ0FBMkNDLEtBQTNDLENBQ0EsT0FBQSxDQUFTbHlELEtBQU8sQ0FBRSxHQUFGLENBQU8sR0FBUCxDQUFZLEdBQVosQ0FBaEIsQ0FDQSxVQUFBLENBRUE7RUFFQSxHQUFLMGdDLFVBQVlBLFNBQVNDLFVBQTFCLENBQXVDO0VBSXRDLFVBQVlELFNBQVM4ZCxLQUFyQixDQUVBLElBQU0vOUMsRUFBSSxDQUFKLENBQU95QyxFQUFJczdDLE1BQU1wK0MsTUFBdkIsQ0FBK0JLLEVBQUl5QyxDQUFuQyxDQUFzQ3pDLEdBQXRDLENBQTZDLENBRTVDLFNBQVcrOUMsTUFBTy85QyxDQUFQLENBQVgsQ0FFQSxJQUFNNGIsRUFBSSxDQUFWLENBQWFBLEVBQUksQ0FBakIsQ0FBb0JBLEdBQXBCLENBQTJCLENBRTFCNDFDLE1BQVF4UyxLQUFNei9DLEtBQU1xYyxDQUFOLENBQU4sQ0FBUixDQUNBNjFDLE1BQVF6UyxLQUFNei9DLEtBQU0sQ0FBRXFjLEVBQUksQ0FBTixFQUFZLENBQWxCLENBQU4sQ0FBUixDQUNBbytFLEtBQU0sQ0FBTixFQUFZbjRGLEtBQUs2RSxHQUFMLENBQVU4cUQsS0FBVixDQUFpQkMsS0FBakIsQ0FBWixDQUFzQztFQUN0Q3VvQyxLQUFNLENBQU4sRUFBWW40RixLQUFLOEUsR0FBTCxDQUFVNnFELEtBQVYsQ0FBaUJDLEtBQWpCLENBQVosQ0FFQWh5RCxJQUFNdTZGLEtBQU0sQ0FBTixFQUFZLEdBQVosQ0FBa0JBLEtBQU0sQ0FBTixDQUF4QixDQUVBLEdBQUtELE1BQU90NkYsR0FBUCxJQUFpQm5CLFNBQXRCLENBQWtDLENBRWpDeTdGLE1BQU90NkYsR0FBUCxFQUFlLENBQUVzbEQsT0FBUWkxQyxLQUFNLENBQU4sQ0FBVixDQUFxQmgxQyxPQUFRZzFDLEtBQU0sQ0FBTixDQUE3QixDQUFmLENBRUEsQ0FFRCxDQUVELENBRUQ7RUFFQSxJQUFNdjZGLEdBQU4sU0FBQSxDQUFxQixDQUVwQmtDLEVBQUlvNEYsTUFBT3Q2RixHQUFQLENBQUosQ0FFQXMvQyxPQUFTOWUsU0FBU0UsUUFBVCxDQUFtQngrQixFQUFFb2pELE1BQXJCLENBQVQsQ0FDQTVrQixTQUFTaGhDLElBQVQsQ0FBZTQvQyxPQUFPeHNDLENBQXRCLENBQXlCd3NDLE9BQU9oOEIsQ0FBaEMsQ0FBbUNnOEIsT0FBT24xQixDQUExQyxFQUVBbTFCLE9BQVM5ZSxTQUFTRSxRQUFULENBQW1CeCtCLEVBQUVxakQsTUFBckIsQ0FBVCxDQUNBN2tCLFNBQVNoaEMsSUFBVCxDQUFlNC9DLE9BQU94c0MsQ0FBdEIsQ0FBeUJ3c0MsT0FBT2g4QixDQUFoQyxDQUFtQ2c4QixPQUFPbjFCLENBQTFDLEVBRUEsQ0FFRCxDQTNDRCxRQTJDWXFXLFVBQVlBLFNBQVNJLGdCQUExQixDQUE2QyxDQUVuRCxZQUFBLENBQWN5ZixPQUFkLENBQXVCRixNQUF2QixDQUNBLFNBQUEsQ0FBV3BjLEtBQVgsQ0FBa0I5VSxLQUFsQixDQUNBLFVBQUEsQ0FBWXMyQixNQUFaLENBRUFqRyxPQUFTLFdBQUEsRUFBVCxDQUVBLEdBQUs5ZSxTQUFTcjVCLEtBQVQsR0FBbUIsSUFBeEIsQ0FBK0I7RUFJOUJncUIsU0FBV3FQLFNBQVNLLFVBQVQsQ0FBb0IxUCxRQUEvQixDQUNBa3ZCLFFBQVU3ZixTQUFTcjVCLEtBQW5CLENBQ0FnNUMsT0FBUzNmLFNBQVMyZixNQUFsQixDQUVBLEdBQUtBLE9BQU9qZ0QsTUFBUCxHQUFrQixDQUF2QixDQUEyQixDQUUxQmlnRCxPQUFTLENBQUUsQ0FBRXBjLE1BQU8sQ0FBVCxDQUFZOVUsTUFBT294QixRQUFRcHhCLEtBQTNCLENBQWtDK3VCLGNBQWUsQ0FBakQsQ0FBRixDQUFULENBRUEsQ0FFRDtFQUVBLElBQU03L0IsRUFBSSxDQUFKLENBQU9rOEUsR0FBS2w2QyxPQUFPamdELE1BQXpCLENBQWlDaWUsRUFBSWs4RSxFQUFyQyxDQUF5QyxFQUFHbDhFLENBQTVDLENBQWdELENBRS9DaWlDLE1BQVFELE9BQVFoaUMsQ0FBUixDQUFSLENBRUE0bEIsTUFBUXFjLE1BQU1yYyxLQUFkLENBQ0E5VSxNQUFRbXhCLE1BQU1ueEIsS0FBZCxDQUVBLElBQU0xdUIsRUFBSXdqQyxLQUFKLENBQVcvZ0MsRUFBTStnQyxNQUFROVUsS0FBL0IsQ0FBd0MxdUIsRUFBSXlDLENBQTVDLENBQStDekMsR0FBSyxDQUFwRCxDQUF3RCxDQUV2RCxJQUFNNGIsRUFBSSxDQUFWLENBQWFBLEVBQUksQ0FBakIsQ0FBb0JBLEdBQXBCLENBQTJCLENBRTFCNDFDLE1BQVExUixRQUFRcDRCLElBQVIsQ0FBYzFuQixFQUFJNGIsQ0FBbEIsQ0FBUixDQUNBNjFDLE1BQVEzUixRQUFRcDRCLElBQVIsQ0FBYzFuQixFQUFJLENBQUU0YixFQUFJLENBQU4sRUFBWSxDQUE5QixDQUFSLENBQ0FvK0UsS0FBTSxDQUFOLEVBQVluNEYsS0FBSzZFLEdBQUwsQ0FBVThxRCxLQUFWLENBQWlCQyxLQUFqQixDQUFaLENBQXNDO0VBQ3RDdW9DLEtBQU0sQ0FBTixFQUFZbjRGLEtBQUs4RSxHQUFMLENBQVU2cUQsS0FBVixDQUFpQkMsS0FBakIsQ0FBWixDQUVBaHlELElBQU11NkYsS0FBTSxDQUFOLEVBQVksR0FBWixDQUFrQkEsS0FBTSxDQUFOLENBQXhCLENBRUEsR0FBS0QsTUFBT3Q2RixHQUFQLElBQWlCbkIsU0FBdEIsQ0FBa0MsQ0FFakN5N0YsTUFBT3Q2RixHQUFQLEVBQWUsQ0FBRXNsRCxPQUFRaTFDLEtBQU0sQ0FBTixDQUFWLENBQXFCaDFDLE9BQVFnMUMsS0FBTSxDQUFOLENBQTdCLENBQWYsQ0FFQSxDQUVELENBRUQsQ0FFRCxDQUVEO0VBRUEsSUFBTXY2RixHQUFOLFNBQUEsQ0FBcUIsQ0FFcEJrQyxFQUFJbzRGLE1BQU90NkYsR0FBUCxDQUFKLENBRUFzL0MsT0FBT3YzQixtQkFBUCxDQUE0Qm9KLFFBQTVCLENBQXNDanZCLEVBQUVvakQsTUFBeEMsRUFDQTVrQixTQUFTaGhDLElBQVQsQ0FBZTQvQyxPQUFPeHNDLENBQXRCLENBQXlCd3NDLE9BQU9oOEIsQ0FBaEMsQ0FBbUNnOEIsT0FBT24xQixDQUExQyxFQUVBbTFCLE9BQU92M0IsbUJBQVAsQ0FBNEJvSixRQUE1QixDQUFzQ2p2QixFQUFFcWpELE1BQXhDLEVBQ0E3a0IsU0FBU2hoQyxJQUFULENBQWU0L0MsT0FBT3hzQyxDQUF0QixDQUF5QndzQyxPQUFPaDhCLENBQWhDLENBQW1DZzhCLE9BQU9uMUIsQ0FBMUMsRUFFQSxDQUVELENBNURELElBNERPO0VBSU5nSCxTQUFXcVAsU0FBU0ssVUFBVCxDQUFvQjFQLFFBQS9CLENBRUEsSUFBTTV3QixFQUFJLENBQUosQ0FBT3lDLEVBQU1tdUIsU0FBU2xDLEtBQVQsQ0FBaUIsQ0FBcEMsQ0FBeUMxdUIsRUFBSXlDLENBQTdDLENBQWdEekMsR0FBaEQsQ0FBdUQsQ0FFdEQsSUFBTTRiLEVBQUksQ0FBVixDQUFhQSxFQUFJLENBQWpCLENBQW9CQSxHQUFwQixDQUEyQjtFQUcxQjtFQUVBbXBDLE9BQVMsRUFBSS9rRCxDQUFKLENBQVE0YixDQUFqQixDQUNBbWpDLE9BQU92M0IsbUJBQVAsQ0FBNEJvSixRQUE1QixDQUFzQ20wQixNQUF0QyxFQUNBNWtCLFNBQVNoaEMsSUFBVCxDQUFlNC9DLE9BQU94c0MsQ0FBdEIsQ0FBeUJ3c0MsT0FBT2g4QixDQUFoQyxDQUFtQ2c4QixPQUFPbjFCLENBQTFDLEVBRUFvN0IsT0FBUyxFQUFJaGxELENBQUosQ0FBVSxDQUFFNGIsRUFBSSxDQUFOLEVBQVksQ0FBL0IsQ0FDQW1qQyxPQUFPdjNCLG1CQUFQLENBQTRCb0osUUFBNUIsQ0FBc0NvMEIsTUFBdEMsRUFDQTdrQixTQUFTaGhDLElBQVQsQ0FBZTQvQyxPQUFPeHNDLENBQXRCLENBQXlCd3NDLE9BQU9oOEIsQ0FBaEMsQ0FBbUNnOEIsT0FBT24xQixDQUExQyxFQUVBLENBRUQsQ0FFRCxDQUVELENBRUQ7RUFFQSxLQUFLeTlCLFlBQUwsQ0FBbUIsVUFBbkIsQ0FBK0IsMEJBQUEsQ0FBNEJsbkIsUUFBNUIsQ0FBc0MsQ0FBdEMsQ0FBL0IsRUFFQSxDQUVEODVELGtCQUFrQi9nRyxTQUFsQixDQUE4QkQsT0FBT2lCLE1BQVAsQ0FBZStzRCxlQUFlL3RELFNBQTlCLENBQTlCLENBQ0ErZ0csa0JBQWtCL2dHLFNBQWxCLENBQTRCc0MsV0FBNUIsQ0FBMEN5K0YsaUJBQTFDLENBRUE7Ozs7Ozs7RUFVQSwyQkFBQSxDQUE2QkMsSUFBN0IsQ0FBbUNDLE1BQW5DLENBQTJDQyxNQUEzQyxDQUFvRCxDQUVuRHQ3QyxTQUFTbGtELElBQVQsQ0FBZSxJQUFmLEVBRUEsS0FBS0QsSUFBTCxDQUFZLG9CQUFaLENBRUEsS0FBS29oRCxVQUFMLENBQWtCLENBQ2pCbStDLEtBQU1BLElBRFcsQ0FFakJDLE9BQVFBLE1BRlMsQ0FHakJDLE9BQVFBLE1BSFMsQ0FBbEIsQ0FNQSxLQUFLajdDLGtCQUFMLENBQXlCLDRCQUFBLENBQThCKzZDLElBQTlCLENBQW9DQyxNQUFwQyxDQUE0Q0MsTUFBNUMsQ0FBekIsRUFDQSxLQUFLaDRDLGFBQUwsR0FFQSxDQUVEaTRDLG1CQUFtQm5oRyxTQUFuQixDQUErQkQsT0FBT2lCLE1BQVAsQ0FBZTRrRCxTQUFTNWxELFNBQXhCLENBQS9CLENBQ0FtaEcsbUJBQW1CbmhHLFNBQW5CLENBQTZCc0MsV0FBN0IsQ0FBMkM2K0Ysa0JBQTNDLENBRUE7RUFFQSxpQ0FBQSxDQUFtQ0gsSUFBbkMsQ0FBeUNDLE1BQXpDLENBQWlEQyxNQUFqRCxDQUEwRCxDQUV6RG56QyxlQUFlcnNELElBQWYsQ0FBcUIsSUFBckIsRUFFQSxLQUFLRCxJQUFMLENBQVksMEJBQVosQ0FFQSxLQUFLb2hELFVBQUwsQ0FBa0IsQ0FDakJtK0MsS0FBTUEsSUFEVyxDQUVqQkMsT0FBUUEsTUFGUyxDQUdqQkMsT0FBUUEsTUFIUyxDQUFsQixDQU1BO0VBRUEsWUFBYyxFQUFkLENBQ0EsYUFBZSxFQUFmLENBQ0EsWUFBYyxFQUFkLENBQ0EsUUFBVSxFQUFWLENBRUEsUUFBVSxPQUFWLENBRUEsV0FBYSxXQUFBLEVBQWIsQ0FFQSxPQUFTLFdBQUEsRUFBVCxDQUF3QjE0RCxHQUFLLFdBQUEsRUFBN0IsQ0FDQSxPQUFTLFdBQUEsRUFBVCxDQUF3QjQ0RCxHQUFLLFdBQUEsRUFBN0IsQ0FFQSxLQUFBLENBQU8xK0UsQ0FBUCxDQUVBO0VBRUEsZUFBaUJ1K0UsT0FBUyxDQUExQixDQUVBLElBQU1uNkYsRUFBSSxDQUFWLENBQWFBLEdBQUtvNkYsTUFBbEIsQ0FBMEJwNkYsR0FBMUIsQ0FBaUMsQ0FFaEMsTUFBUUEsRUFBSW82RixNQUFaLENBRUEsSUFBTXgrRSxFQUFJLENBQVYsQ0FBYUEsR0FBS3UrRSxNQUFsQixDQUEwQnYrRSxHQUExQixDQUFpQyxDQUVoQyxNQUFRQSxFQUFJdStFLE1BQVosQ0FFQTtFQUVBRCxLQUFNL3NELENBQU4sQ0FBUzk2QixDQUFULENBQVlvdkIsRUFBWixFQUNBdEIsU0FBU2hoQyxJQUFULENBQWVzaUMsR0FBR2x2QixDQUFsQixDQUFxQmt2QixHQUFHMWUsQ0FBeEIsQ0FBMkIwZSxHQUFHN1gsQ0FBOUIsRUFFQTtFQUVBO0VBRUEsR0FBS3VqQixFQUFJbFksR0FBSixFQUFXLENBQWhCLENBQW9CLENBRW5CaWxFLEtBQU0vc0QsRUFBSWxZLEdBQVYsQ0FBZTVpQixDQUFmLENBQWtCcXZCLEVBQWxCLEVBQ0E2NEQsR0FBR3AxRSxVQUFILENBQWVzYyxFQUFmLENBQW1CQyxFQUFuQixFQUVBLENBTEQsSUFLTyxDQUVOdzRELEtBQU0vc0QsRUFBSWxZLEdBQVYsQ0FBZTVpQixDQUFmLENBQWtCcXZCLEVBQWxCLEVBQ0E2NEQsR0FBR3AxRSxVQUFILENBQWV1YyxFQUFmLENBQW1CRCxFQUFuQixFQUVBLENBRUQsR0FBS3B2QixFQUFJNGlCLEdBQUosRUFBVyxDQUFoQixDQUFvQixDQUVuQmlsRSxLQUFNL3NELENBQU4sQ0FBUzk2QixFQUFJNGlCLEdBQWIsQ0FBa0J5TSxFQUFsQixFQUNBNDRELEdBQUduMUUsVUFBSCxDQUFlc2MsRUFBZixDQUFtQkMsRUFBbkIsRUFFQSxDQUxELElBS08sQ0FFTnc0RCxLQUFNL3NELENBQU4sQ0FBUzk2QixFQUFJNGlCLEdBQWIsQ0FBa0J5TSxFQUFsQixFQUNBNDRELEdBQUduMUUsVUFBSCxDQUFldWMsRUFBZixDQUFtQkQsRUFBbkIsRUFFQSxDQUVEO0VBRUFySixPQUFPOUwsWUFBUCxDQUFxQml1RSxFQUFyQixDQUF5QkQsRUFBekIsRUFBOEIvekUsU0FBOUIsR0FDQWc1QixRQUFRcGdELElBQVIsQ0FBY2k1QixPQUFPN2xCLENBQXJCLENBQXdCNmxCLE9BQU9yVixDQUEvQixDQUFrQ3FWLE9BQU94TyxDQUF6QyxFQUVBO0VBRUE2MUIsSUFBSXRnRCxJQUFKLENBQVVndUMsQ0FBVixDQUFhOTZCLENBQWIsRUFFQSxDQUVELENBRUQ7RUFFQSxJQUFNclMsRUFBSSxDQUFWLENBQWFBLEVBQUlvNkYsTUFBakIsQ0FBeUJwNkYsR0FBekIsQ0FBZ0MsQ0FFL0IsSUFBTTRiLEVBQUksQ0FBVixDQUFhQSxFQUFJdStFLE1BQWpCLENBQXlCditFLEdBQXpCLENBQWdDLENBRS9CLE1BQVE1YixFQUFJdzZGLFVBQUosQ0FBaUI1K0UsQ0FBekIsQ0FDQSxNQUFRNWIsRUFBSXc2RixVQUFKLENBQWlCNStFLENBQWpCLENBQXFCLENBQTdCLENBQ0EsTUFBUSxDQUFFNWIsRUFBSSxDQUFOLEVBQVl3NkYsVUFBWixDQUF5QjUrRSxDQUF6QixDQUE2QixDQUFyQyxDQUNBLE1BQVEsQ0FBRTViLEVBQUksQ0FBTixFQUFZdzZGLFVBQVosQ0FBeUI1K0UsQ0FBakMsQ0FFQTtFQUVBa2tDLFFBQVEzZ0QsSUFBUixDQUFjdUQsQ0FBZCxDQUFpQkYsQ0FBakIsQ0FBb0I0bkIsQ0FBcEIsRUFDQTAxQixRQUFRM2dELElBQVIsQ0FBY3FELENBQWQsQ0FBaUJXLENBQWpCLENBQW9CaW5CLENBQXBCLEVBRUEsQ0FFRCxDQUVEO0VBRUEsS0FBSys4QixRQUFMLENBQWVySCxPQUFmLEVBQ0EsS0FBS3VILFlBQUwsQ0FBbUIsVUFBbkIsQ0FBK0IsMEJBQUEsQ0FBNEJsbkIsUUFBNUIsQ0FBc0MsQ0FBdEMsQ0FBL0IsRUFDQSxLQUFLa25CLFlBQUwsQ0FBbUIsUUFBbkIsQ0FBNkIsMEJBQUEsQ0FBNEI5SCxPQUE1QixDQUFxQyxDQUFyQyxDQUE3QixFQUNBLEtBQUs4SCxZQUFMLENBQW1CLElBQW5CLENBQXlCLDBCQUFBLENBQTRCNUgsR0FBNUIsQ0FBaUMsQ0FBakMsQ0FBekIsRUFFQSxDQUVEZzdDLHlCQUF5QnZoRyxTQUF6QixDQUFxQ0QsT0FBT2lCLE1BQVAsQ0FBZStzRCxlQUFlL3RELFNBQTlCLENBQXJDLENBQ0F1aEcseUJBQXlCdmhHLFNBQXpCLENBQW1Dc0MsV0FBbkMsQ0FBaURpL0Ysd0JBQWpELENBRUE7Ozs7OztFQVNBLDJCQUFBLENBQTZCdDZELFFBQTdCLENBQXVDMmYsT0FBdkMsQ0FBZ0RwbkIsTUFBaEQsQ0FBd0RnaUUsTUFBeEQsQ0FBaUUsQ0FFaEU1N0MsU0FBU2xrRCxJQUFULENBQWUsSUFBZixFQUVBLEtBQUtELElBQUwsQ0FBWSxvQkFBWixDQUVBLEtBQUtvaEQsVUFBTCxDQUFrQixDQUNqQjViLFNBQVVBLFFBRE8sQ0FFakIyZixRQUFTQSxPQUZRLENBR2pCcG5CLE9BQVFBLE1BSFMsQ0FJakJnaUUsT0FBUUEsTUFKUyxDQUFsQixDQU9BLEtBQUt2N0Msa0JBQUwsQ0FBeUIsNEJBQUEsQ0FBOEJoZixRQUE5QixDQUF3QzJmLE9BQXhDLENBQWlEcG5CLE1BQWpELENBQXlEZ2lFLE1BQXpELENBQXpCLEVBQ0EsS0FBS3Q0QyxhQUFMLEdBRUEsQ0FFRHU0QyxtQkFBbUJ6aEcsU0FBbkIsQ0FBK0JELE9BQU9pQixNQUFQLENBQWU0a0QsU0FBUzVsRCxTQUF4QixDQUEvQixDQUNBeWhHLG1CQUFtQnpoRyxTQUFuQixDQUE2QnNDLFdBQTdCLENBQTJDbS9GLGtCQUEzQyxDQUVBO0VBRUEsaUNBQUEsQ0FBbUN4NkQsUUFBbkMsQ0FBNkMyZixPQUE3QyxDQUFzRHBuQixNQUF0RCxDQUE4RGdpRSxNQUE5RCxDQUF1RSxDQUV0RXp6QyxlQUFlcnNELElBQWYsQ0FBcUIsSUFBckIsRUFFQSxLQUFLRCxJQUFMLENBQVksMEJBQVosQ0FFQSxLQUFLb2hELFVBQUwsQ0FBa0IsQ0FDakI1YixTQUFVQSxRQURPLENBRWpCMmYsUUFBU0EsT0FGUSxDQUdqQnBuQixPQUFRQSxNQUhTLENBSWpCZ2lFLE9BQVFBLE1BSlMsQ0FBbEIsQ0FPQWhpRSxPQUFTQSxRQUFVLENBQW5CLENBQ0FnaUUsT0FBU0EsUUFBVSxDQUFuQixDQUVBO0VBRUEsaUJBQW1CLEVBQW5CLENBQ0EsYUFBZSxFQUFmLENBRUE7RUFFQUUsVUFBV0YsTUFBWCxFQUVBO0VBRUFHLGFBQWNuaUUsTUFBZCxFQUVBO0VBRUFvaUUsY0FFQTtFQUVBLEtBQUt6ekMsWUFBTCxDQUFtQixVQUFuQixDQUErQiwwQkFBQSxDQUE0QmtwQixZQUE1QixDQUEwQyxDQUExQyxDQUEvQixFQUNBLEtBQUtscEIsWUFBTCxDQUFtQixRQUFuQixDQUE2QiwwQkFBQSxDQUE0QmtwQixhQUFhaHdFLEtBQWIsRUFBNUIsQ0FBa0QsQ0FBbEQsQ0FBN0IsRUFDQSxLQUFLOG1ELFlBQUwsQ0FBbUIsSUFBbkIsQ0FBeUIsMEJBQUEsQ0FBNEIwekMsUUFBNUIsQ0FBc0MsQ0FBdEMsQ0FBekIsRUFFQSxHQUFLTCxTQUFXLENBQWhCLENBQW9CLENBRW5CLEtBQUtuNkMsb0JBQUwsR0FBNkI7RUFFN0IsQ0FKRCxJQUlPLENBRU4sS0FBSytILGdCQUFMLEdBQXlCO0VBRXpCLENBRUQ7RUFFQSxrQkFBQSxDQUFvQm95QyxNQUFwQixDQUE2QixDQUU1QixNQUFRLFdBQUEsRUFBUixDQUNBLE1BQVEsV0FBQSxFQUFSLENBQ0EsTUFBUSxXQUFBLEVBQVIsQ0FFQTtFQUVBLElBQU0sTUFBUSxDQUFkLENBQWlCMTZGLEVBQUk4L0MsUUFBUW5nRCxNQUE3QixDQUFxQ0ssR0FBSyxDQUExQyxDQUE4QztFQUk3Q2c3RixpQkFBa0JsN0MsUUFBUzkvQyxFQUFJLENBQWIsQ0FBbEIsQ0FBb0MwQyxDQUFwQyxFQUNBczRGLGlCQUFrQmw3QyxRQUFTOS9DLEVBQUksQ0FBYixDQUFsQixDQUFvQ3dDLENBQXBDLEVBQ0F3NEYsaUJBQWtCbDdDLFFBQVM5L0MsRUFBSSxDQUFiLENBQWxCLENBQW9DbUQsQ0FBcEMsRUFFQTtFQUVBODNGLGNBQWV2NEYsQ0FBZixDQUFrQkYsQ0FBbEIsQ0FBcUJXLENBQXJCLENBQXdCdTNGLE1BQXhCLEVBRUEsQ0FFRCxDQUVELHNCQUFBLENBQXdCaDRGLENBQXhCLENBQTJCRixDQUEzQixDQUE4QlcsQ0FBOUIsQ0FBaUN1M0YsTUFBakMsQ0FBMEMsQ0FFekMsU0FBVzc0RixLQUFLMmUsR0FBTCxDQUFVLENBQVYsQ0FBYWs2RSxNQUFiLENBQVgsQ0FFQTtFQUVBLE1BQVEsRUFBUixDQUVBLEtBQUEsQ0FBTzkrRSxDQUFQLENBRUE7RUFFQSxJQUFNNWIsRUFBSSxDQUFWLENBQWFBLEdBQUtrN0YsSUFBbEIsQ0FBd0JsN0YsR0FBeEIsQ0FBK0IsQ0FFOUJxUyxFQUFHclMsQ0FBSCxFQUFTLEVBQVQsQ0FFQSxPQUFTMEMsRUFBRWlpQixLQUFGLEdBQVU3QixJQUFWLENBQWdCM2YsQ0FBaEIsQ0FBbUJuRCxFQUFJazdGLElBQXZCLENBQVQsQ0FDQSxPQUFTMTRGLEVBQUVtaUIsS0FBRixHQUFVN0IsSUFBVixDQUFnQjNmLENBQWhCLENBQW1CbkQsRUFBSWs3RixJQUF2QixDQUFULENBRUEsU0FBV0EsS0FBT2w3RixDQUFsQixDQUVBLElBQU00YixFQUFJLENBQVYsQ0FBYUEsR0FBS3UvRSxJQUFsQixDQUF3QnYvRSxHQUF4QixDQUErQixDQUU5QixHQUFLQSxJQUFNLENBQU4sRUFBVzViLElBQU1rN0YsSUFBdEIsQ0FBNkIsQ0FFNUI3b0YsRUFBR3JTLENBQUgsRUFBUTRiLENBQVIsRUFBY3cvRSxFQUFkLENBRUEsQ0FKRCxJQUlPLENBRU4vb0YsRUFBR3JTLENBQUgsRUFBUTRiLENBQVIsRUFBY3cvRSxHQUFHejJFLEtBQUgsR0FBVzdCLElBQVgsQ0FBaUJ1NEUsRUFBakIsQ0FBcUJ6L0UsRUFBSXUvRSxJQUF6QixDQUFkLENBRUEsQ0FFRCxDQUVELENBRUQ7RUFFQSxJQUFNbjdGLEVBQUksQ0FBVixDQUFhQSxFQUFJazdGLElBQWpCLENBQXVCbDdGLEdBQXZCLENBQThCLENBRTdCLElBQU00YixFQUFJLENBQVYsQ0FBYUEsRUFBSSxHQUFNcy9FLEtBQU9sN0YsQ0FBYixFQUFtQixDQUFwQyxDQUF1QzRiLEdBQXZDLENBQThDLENBRTdDLE1BQVEvWixLQUFLRSxLQUFMLENBQVk2WixFQUFJLENBQWhCLENBQVIsQ0FFQSxHQUFLQSxFQUFJLENBQUosR0FBVSxDQUFmLENBQW1CLENBRWxCMC9FLFdBQVlqcEYsRUFBR3JTLENBQUgsRUFBUThiLEVBQUksQ0FBWixDQUFaLEVBQ0F3L0UsV0FBWWpwRixFQUFHclMsRUFBSSxDQUFQLEVBQVk4YixDQUFaLENBQVosRUFDQXcvRSxXQUFZanBGLEVBQUdyUyxDQUFILEVBQVE4YixDQUFSLENBQVosRUFFQSxDQU5ELElBTU8sQ0FFTncvRSxXQUFZanBGLEVBQUdyUyxDQUFILEVBQVE4YixFQUFJLENBQVosQ0FBWixFQUNBdy9FLFdBQVlqcEYsRUFBR3JTLEVBQUksQ0FBUCxFQUFZOGIsRUFBSSxDQUFoQixDQUFaLEVBQ0F3L0UsV0FBWWpwRixFQUFHclMsRUFBSSxDQUFQLEVBQVk4YixDQUFaLENBQVosRUFFQSxDQUVELENBRUQsQ0FFRCxDQUVELHFCQUFBLENBQXVCNGMsTUFBdkIsQ0FBZ0MsQ0FFL0IsV0FBYSxXQUFBLEVBQWIsQ0FFQTtFQUVBLElBQU0sTUFBUSxDQUFkLENBQWlCMTRCLEVBQUl1d0UsYUFBYTV3RSxNQUFsQyxDQUEwQ0ssR0FBSyxDQUEvQyxDQUFtRCxDQUVsRCsrQyxPQUFPeHNDLENBQVAsQ0FBV2crRCxhQUFjdndFLEVBQUksQ0FBbEIsQ0FBWCxDQUNBKytDLE9BQU9oOEIsQ0FBUCxDQUFXd3RELGFBQWN2d0UsRUFBSSxDQUFsQixDQUFYLENBQ0ErK0MsT0FBT24xQixDQUFQLENBQVcybUQsYUFBY3Z3RSxFQUFJLENBQWxCLENBQVgsQ0FFQSsrQyxPQUFPeDRCLFNBQVAsR0FBbUJqQixjQUFuQixDQUFtQ29ULE1BQW5DLEVBRUE2M0MsYUFBY3Z3RSxFQUFJLENBQWxCLEVBQXdCKytDLE9BQU94c0MsQ0FBL0IsQ0FDQWcrRCxhQUFjdndFLEVBQUksQ0FBbEIsRUFBd0IrK0MsT0FBT2g4QixDQUEvQixDQUNBd3RELGFBQWN2d0UsRUFBSSxDQUFsQixFQUF3QisrQyxPQUFPbjFCLENBQS9CLENBRUEsQ0FFRCxDQUVELG9CQUFBLEVBQXVCLENBRXRCLFdBQWEsV0FBQSxFQUFiLENBRUEsSUFBTSxNQUFRLENBQWQsQ0FBaUI1cEIsRUFBSXV3RSxhQUFhNXdFLE1BQWxDLENBQTBDSyxHQUFLLENBQS9DLENBQW1ELENBRWxEKytDLE9BQU94c0MsQ0FBUCxDQUFXZytELGFBQWN2d0UsRUFBSSxDQUFsQixDQUFYLENBQ0ErK0MsT0FBT2g4QixDQUFQLENBQVd3dEQsYUFBY3Z3RSxFQUFJLENBQWxCLENBQVgsQ0FDQSsrQyxPQUFPbjFCLENBQVAsQ0FBVzJtRCxhQUFjdndFLEVBQUksQ0FBbEIsQ0FBWCxDQUVBLE1BQVF1N0YsUUFBU3g4QyxNQUFULEVBQW9CLENBQXBCLENBQXdCbDlDLEtBQUsrZixFQUE3QixDQUFrQyxHQUExQyxDQUNBLE1BQVE0NUUsWUFBYXo4QyxNQUFiLEVBQXdCbDlDLEtBQUsrZixFQUE3QixDQUFrQyxHQUExQyxDQUNBbTVFLFNBQVM1N0YsSUFBVCxDQUFlZ3VDLENBQWYsQ0FBa0IsRUFBSTk2QixDQUF0QixFQUVBLENBRURvcEYsYUFFQUMsY0FFQSxDQUVELG9CQUFBLEVBQXVCO0VBSXRCLElBQU0sTUFBUSxDQUFkLENBQWlCMTdGLEVBQUkrNkYsU0FBU3A3RixNQUE5QixDQUFzQ0ssR0FBSyxDQUEzQyxDQUErQztFQUk5QyxPQUFTKzZGLFNBQVUvNkYsRUFBSSxDQUFkLENBQVQsQ0FDQSxPQUFTKzZGLFNBQVUvNkYsRUFBSSxDQUFkLENBQVQsQ0FDQSxPQUFTKzZGLFNBQVUvNkYsRUFBSSxDQUFkLENBQVQsQ0FFQSxRQUFVNkIsS0FBSzhFLEdBQUwsQ0FBVXlzQixFQUFWLENBQWNKLEVBQWQsQ0FBa0J2SCxFQUFsQixDQUFWLENBQ0EsUUFBVTVwQixLQUFLNkUsR0FBTCxDQUFVMHNCLEVBQVYsQ0FBY0osRUFBZCxDQUFrQnZILEVBQWxCLENBQVYsQ0FFQTtFQUVBLEdBQUs5a0IsSUFBTSxHQUFOLEVBQWFELElBQU0sR0FBeEIsQ0FBOEIsQ0FFN0IsR0FBSzBzQixHQUFLLEdBQVYsQ0FBZ0IybkUsU0FBVS82RixFQUFJLENBQWQsR0FBcUIsQ0FBckIsQ0FDaEIsR0FBS2d6QixHQUFLLEdBQVYsQ0FBZ0IrbkUsU0FBVS82RixFQUFJLENBQWQsR0FBcUIsQ0FBckIsQ0FDaEIsR0FBS3lyQixHQUFLLEdBQVYsQ0FBZ0JzdkUsU0FBVS82RixFQUFJLENBQWQsR0FBcUIsQ0FBckIsQ0FFaEIsQ0FFRCxDQUVELENBRUQsbUJBQUEsQ0FBcUIrK0MsTUFBckIsQ0FBOEIsQ0FFN0J3eEIsYUFBYXB4RSxJQUFiLENBQW1CNC9DLE9BQU94c0MsQ0FBMUIsQ0FBNkJ3c0MsT0FBT2g4QixDQUFwQyxDQUF1Q2c4QixPQUFPbjFCLENBQTlDLEVBRUEsQ0FFRCx5QkFBQSxDQUEyQmhqQixLQUEzQixDQUFrQ200QyxNQUFsQyxDQUEyQyxDQUUxQyxXQUFhbjRDLE1BQVEsQ0FBckIsQ0FFQW00QyxPQUFPeHNDLENBQVAsQ0FBVzR0QixTQUFVMHZELE9BQVMsQ0FBbkIsQ0FBWCxDQUNBOXdDLE9BQU9oOEIsQ0FBUCxDQUFXb2QsU0FBVTB2RCxPQUFTLENBQW5CLENBQVgsQ0FDQTl3QyxPQUFPbjFCLENBQVAsQ0FBV3VXLFNBQVUwdkQsT0FBUyxDQUFuQixDQUFYLENBRUEsQ0FFRCxtQkFBQSxFQUFzQixDQUVyQixNQUFRLFdBQUEsRUFBUixDQUNBLE1BQVEsV0FBQSxFQUFSLENBQ0EsTUFBUSxXQUFBLEVBQVIsQ0FFQSxhQUFlLFdBQUEsRUFBZixDQUVBLFFBQVUsV0FBQSxFQUFWLENBQ0EsUUFBVSxXQUFBLEVBQVYsQ0FDQSxRQUFVLFdBQUEsRUFBVixDQUVBLElBQU0sTUFBUSxDQUFSLENBQVdqMEUsRUFBSSxDQUFyQixDQUF3QjViLEVBQUl1d0UsYUFBYTV3RSxNQUF6QyxDQUFpREssR0FBSyxDQUFMLENBQVE0YixHQUFLLENBQTlELENBQWtFLENBRWpFbFosRUFBRTROLEdBQUYsQ0FBT2lnRSxhQUFjdndFLEVBQUksQ0FBbEIsQ0FBUCxDQUE4QnV3RSxhQUFjdndFLEVBQUksQ0FBbEIsQ0FBOUIsQ0FBcUR1d0UsYUFBY3Z3RSxFQUFJLENBQWxCLENBQXJELEVBQ0F3QyxFQUFFOE4sR0FBRixDQUFPaWdFLGFBQWN2d0UsRUFBSSxDQUFsQixDQUFQLENBQThCdXdFLGFBQWN2d0UsRUFBSSxDQUFsQixDQUE5QixDQUFxRHV3RSxhQUFjdndFLEVBQUksQ0FBbEIsQ0FBckQsRUFDQW1ELEVBQUVtTixHQUFGLENBQU9pZ0UsYUFBY3Z3RSxFQUFJLENBQWxCLENBQVAsQ0FBOEJ1d0UsYUFBY3Z3RSxFQUFJLENBQWxCLENBQTlCLENBQXFEdXdFLGFBQWN2d0UsRUFBSSxDQUFsQixDQUFyRCxFQUVBNjBELElBQUl2a0QsR0FBSixDQUFTeXFGLFNBQVVuL0UsRUFBSSxDQUFkLENBQVQsQ0FBNEJtL0UsU0FBVW4vRSxFQUFJLENBQWQsQ0FBNUIsRUFDQWs1QyxJQUFJeGtELEdBQUosQ0FBU3lxRixTQUFVbi9FLEVBQUksQ0FBZCxDQUFULENBQTRCbS9FLFNBQVVuL0UsRUFBSSxDQUFkLENBQTVCLEVBQ0FtNUMsSUFBSXprRCxHQUFKLENBQVN5cUYsU0FBVW4vRSxFQUFJLENBQWQsQ0FBVCxDQUE0Qm0vRSxTQUFVbi9FLEVBQUksQ0FBZCxDQUE1QixFQUVBKy9FLFNBQVMvMkUsSUFBVCxDQUFlbGlCLENBQWYsRUFBbUJtaUIsR0FBbkIsQ0FBd0JyaUIsQ0FBeEIsRUFBNEJxaUIsR0FBNUIsQ0FBaUMxaEIsQ0FBakMsRUFBcUNxaUIsWUFBckMsQ0FBbUQsQ0FBbkQsRUFFQSxRQUFVKzFFLFFBQVNJLFFBQVQsQ0FBVixDQUVBQyxVQUFXL21DLEdBQVgsQ0FBZ0JqNUMsRUFBSSxDQUFwQixDQUF1QmxaLENBQXZCLENBQTBCbTVGLEdBQTFCLEVBQ0FELFVBQVc5bUMsR0FBWCxDQUFnQmw1QyxFQUFJLENBQXBCLENBQXVCcFosQ0FBdkIsQ0FBMEJxNUYsR0FBMUIsRUFDQUQsVUFBVzdtQyxHQUFYLENBQWdCbjVDLEVBQUksQ0FBcEIsQ0FBdUJ6WSxDQUF2QixDQUEwQjA0RixHQUExQixFQUVBLENBRUQsQ0FFRCxrQkFBQSxDQUFvQmwvRCxFQUFwQixDQUF3Qmt6RCxNQUF4QixDQUFnQzkrRCxNQUFoQyxDQUF3Q3dxRSxPQUF4QyxDQUFrRCxDQUVqRCxHQUFPQSxRQUFVLENBQVosRUFBcUI1K0QsR0FBR3BxQixDQUFILEdBQVMsQ0FBbkMsQ0FBeUMsQ0FFeEN3b0YsU0FBVWxMLE1BQVYsRUFBcUJsekQsR0FBR3BxQixDQUFILENBQU8sQ0FBNUIsQ0FFQSxDQUVELEdBQU93ZSxPQUFPeGUsQ0FBUCxHQUFhLENBQWYsRUFBd0J3ZSxPQUFPbkgsQ0FBUCxHQUFhLENBQTFDLENBQWdELENBRS9DbXhFLFNBQVVsTCxNQUFWLEVBQXFCMEwsUUFBVSxDQUFWLENBQWMxNUYsS0FBSytmLEVBQW5CLENBQXdCLEdBQTdDLENBRUEsQ0FFRCxDQUVEO0VBRUEsZ0JBQUEsQ0FBa0JtUCxNQUFsQixDQUEyQixDQUUxQixZQUFZdEssS0FBTCxDQUFZc0ssT0FBT25ILENBQW5CLENBQXNCLENBQUVtSCxPQUFPeGUsQ0FBL0IsQ0FBUCxDQUVBLENBR0Q7RUFFQSxvQkFBQSxDQUFzQndlLE1BQXRCLENBQStCLENBRTlCLFlBQVl0SyxLQUFMLENBQVksQ0FBRXNLLE9BQU9oTyxDQUFyQixDQUF3QmxoQixLQUFLdWtCLElBQUwsQ0FBYTJLLE9BQU94ZSxDQUFQLENBQVd3ZSxPQUFPeGUsQ0FBcEIsQ0FBNEJ3ZSxPQUFPbkgsQ0FBUCxDQUFXbUgsT0FBT25ILENBQXpELENBQXhCLENBQVAsQ0FFQSxDQUVELENBRURreUUseUJBQXlCNWlHLFNBQXpCLENBQXFDRCxPQUFPaUIsTUFBUCxDQUFlK3NELGVBQWUvdEQsU0FBOUIsQ0FBckMsQ0FDQTRpRyx5QkFBeUI1aUcsU0FBekIsQ0FBbUNzQyxXQUFuQyxDQUFpRHNnRyx3QkFBakQsQ0FFQTs7OztFQU9BLDRCQUFBLENBQThCcGpFLE1BQTlCLENBQXNDZ2lFLE1BQXRDLENBQStDLENBRTlDNTdDLFNBQVNsa0QsSUFBVCxDQUFlLElBQWYsRUFFQSxLQUFLRCxJQUFMLENBQVkscUJBQVosQ0FFQSxLQUFLb2hELFVBQUwsQ0FBa0IsQ0FDakJyakIsT0FBUUEsTUFEUyxDQUVqQmdpRSxPQUFRQSxNQUZTLENBQWxCLENBS0EsS0FBS3Y3QyxrQkFBTCxDQUF5Qiw2QkFBQSxDQUErQnptQixNQUEvQixDQUF1Q2dpRSxNQUF2QyxDQUF6QixFQUNBLEtBQUt0NEMsYUFBTCxHQUVBLENBRUQyNUMsb0JBQW9CN2lHLFNBQXBCLENBQWdDRCxPQUFPaUIsTUFBUCxDQUFlNGtELFNBQVM1bEQsU0FBeEIsQ0FBaEMsQ0FDQTZpRyxvQkFBb0I3aUcsU0FBcEIsQ0FBOEJzQyxXQUE5QixDQUE0Q3VnRyxtQkFBNUMsQ0FFQTtFQUVBLGtDQUFBLENBQW9DcmpFLE1BQXBDLENBQTRDZ2lFLE1BQTVDLENBQXFELENBRXBELGFBQWUsQ0FDZCxDQURjLENBQ1gsQ0FEVyxDQUNSLENBRFEsQ0FDSixDQUFFLENBREUsQ0FDQyxDQUFFLENBREgsQ0FDTSxDQUROLENBQ1UsQ0FBRSxDQURaLENBQ2UsQ0FEZixDQUNrQixDQUFFLENBRHBCLENBQ3dCLENBRHhCLENBQzJCLENBQUUsQ0FEN0IsQ0FDZ0MsQ0FBRSxDQURsQyxDQUFmLENBSUEsWUFBYyxDQUNiLENBRGEsQ0FDVixDQURVLENBQ1AsQ0FETyxDQUNILENBREcsQ0FDQSxDQURBLENBQ0csQ0FESCxDQUNNLENBRE4sQ0FDUyxDQURULENBQ1ksQ0FEWixDQUNlLENBRGYsQ0FDa0IsQ0FEbEIsQ0FDcUIsQ0FEckIsQ0FBZCxDQUlBb0IseUJBQXlCbGhHLElBQXpCLENBQStCLElBQS9CLENBQXFDdWxDLFFBQXJDLENBQStDMmYsT0FBL0MsQ0FBd0RwbkIsTUFBeEQsQ0FBZ0VnaUUsTUFBaEUsRUFFQSxLQUFLLy9GLElBQUwsQ0FBWSwyQkFBWixDQUVBLEtBQUtvaEQsVUFBTCxDQUFrQixDQUNqQnJqQixPQUFRQSxNQURTLENBRWpCZ2lFLE9BQVFBLE1BRlMsQ0FBbEIsQ0FLQSxDQUVEc0IsMEJBQTBCOWlHLFNBQTFCLENBQXNDRCxPQUFPaUIsTUFBUCxDQUFlNGhHLHlCQUF5QjVpRyxTQUF4QyxDQUF0QyxDQUNBOGlHLDBCQUEwQjlpRyxTQUExQixDQUFvQ3NDLFdBQXBDLENBQWtEd2dHLHlCQUFsRCxDQUVBOzs7O0VBT0EsMkJBQUEsQ0FBNkJ0akUsTUFBN0IsQ0FBcUNnaUUsTUFBckMsQ0FBOEMsQ0FFN0M1N0MsU0FBU2xrRCxJQUFULENBQWUsSUFBZixFQUVBLEtBQUtELElBQUwsQ0FBWSxvQkFBWixDQUVBLEtBQUtvaEQsVUFBTCxDQUFrQixDQUNqQnJqQixPQUFRQSxNQURTLENBRWpCZ2lFLE9BQVFBLE1BRlMsQ0FBbEIsQ0FLQSxLQUFLdjdDLGtCQUFMLENBQXlCLDRCQUFBLENBQThCem1CLE1BQTlCLENBQXNDZ2lFLE1BQXRDLENBQXpCLEVBQ0EsS0FBS3Q0QyxhQUFMLEdBRUEsQ0FFRDY1QyxtQkFBbUIvaUcsU0FBbkIsQ0FBK0JELE9BQU9pQixNQUFQLENBQWU0a0QsU0FBUzVsRCxTQUF4QixDQUEvQixDQUNBK2lHLG1CQUFtQi9pRyxTQUFuQixDQUE2QnNDLFdBQTdCLENBQTJDeWdHLGtCQUEzQyxDQUVBO0VBRUEsaUNBQUEsQ0FBbUN2akUsTUFBbkMsQ0FBMkNnaUUsTUFBM0MsQ0FBb0QsQ0FFbkQsYUFBZSxDQUNkLENBRGMsQ0FDWCxDQURXLENBQ1IsQ0FEUSxDQUNKLENBQUUsQ0FERSxDQUNDLENBREQsQ0FDSSxDQURKLENBQ08sQ0FEUCxDQUNVLENBRFYsQ0FDYSxDQURiLENBRWQsQ0FGYyxDQUVYLENBQUUsQ0FGUyxDQUVOLENBRk0sQ0FFRixDQUZFLENBRUMsQ0FGRCxDQUVJLENBRkosQ0FFTyxDQUZQLENBRVUsQ0FGVixDQUVhLENBQUUsQ0FGZixDQUFmLENBS0EsWUFBYyxDQUNiLENBRGEsQ0FDVixDQURVLENBQ1AsQ0FETyxDQUNKLENBREksQ0FDRCxDQURDLENBQ0UsQ0FERixDQUNLLENBREwsQ0FDUSxDQURSLENBQ1csQ0FEWCxDQUViLENBRmEsQ0FFVixDQUZVLENBRVAsQ0FGTyxDQUVKLENBRkksQ0FFRCxDQUZDLENBRUUsQ0FGRixDQUVLLENBRkwsQ0FFUSxDQUZSLENBRVcsQ0FGWCxDQUdiLENBSGEsQ0FHVixDQUhVLENBR1AsQ0FITyxDQUdKLENBSEksQ0FHRCxDQUhDLENBR0UsQ0FIRixDQUFkLENBTUFvQix5QkFBeUJsaEcsSUFBekIsQ0FBK0IsSUFBL0IsQ0FBcUN1bEMsUUFBckMsQ0FBK0MyZixPQUEvQyxDQUF3RHBuQixNQUF4RCxDQUFnRWdpRSxNQUFoRSxFQUVBLEtBQUsvL0YsSUFBTCxDQUFZLDBCQUFaLENBRUEsS0FBS29oRCxVQUFMLENBQWtCLENBQ2pCcmpCLE9BQVFBLE1BRFMsQ0FFakJnaUUsT0FBUUEsTUFGUyxDQUFsQixDQUtBLENBRUR3Qix5QkFBeUJoakcsU0FBekIsQ0FBcUNELE9BQU9pQixNQUFQLENBQWU0aEcseUJBQXlCNWlHLFNBQXhDLENBQXJDLENBQ0FnakcseUJBQXlCaGpHLFNBQXpCLENBQW1Dc0MsV0FBbkMsQ0FBaUQwZ0csd0JBQWpELENBRUE7Ozs7RUFPQSw0QkFBQSxDQUE4QnhqRSxNQUE5QixDQUFzQ2dpRSxNQUF0QyxDQUErQyxDQUU5QzU3QyxTQUFTbGtELElBQVQsQ0FBZSxJQUFmLEVBRUEsS0FBS0QsSUFBTCxDQUFZLHFCQUFaLENBRUEsS0FBS29oRCxVQUFMLENBQWtCLENBQ2pCcmpCLE9BQVFBLE1BRFMsQ0FFakJnaUUsT0FBUUEsTUFGUyxDQUFsQixDQUtBLEtBQUt2N0Msa0JBQUwsQ0FBeUIsNkJBQUEsQ0FBK0J6bUIsTUFBL0IsQ0FBdUNnaUUsTUFBdkMsQ0FBekIsRUFDQSxLQUFLdDRDLGFBQUwsR0FFQSxDQUVEKzVDLG9CQUFvQmpqRyxTQUFwQixDQUFnQ0QsT0FBT2lCLE1BQVAsQ0FBZTRrRCxTQUFTNWxELFNBQXhCLENBQWhDLENBQ0Fpakcsb0JBQW9CampHLFNBQXBCLENBQThCc0MsV0FBOUIsQ0FBNEMyZ0csbUJBQTVDLENBRUE7RUFFQSxrQ0FBQSxDQUFvQ3pqRSxNQUFwQyxDQUE0Q2dpRSxNQUE1QyxDQUFxRCxDQUVwRCxNQUFRLENBQUUsRUFBSTc0RixLQUFLdWtCLElBQUwsQ0FBVyxDQUFYLENBQU4sRUFBeUIsQ0FBakMsQ0FFQSxhQUFlLENBQ2QsQ0FBRSxDQURZLENBQ1RwRCxDQURTLENBQ04sQ0FETSxDQUNGLENBREUsQ0FDQ0EsQ0FERCxDQUNJLENBREosQ0FDUSxDQUFFLENBRFYsQ0FDYSxDQUFFQSxDQURmLENBQ2tCLENBRGxCLENBQ3NCLENBRHRCLENBQ3lCLENBQUVBLENBRDNCLENBQzhCLENBRDlCLENBRWIsQ0FGYSxDQUVWLENBQUUsQ0FGUSxDQUVMQSxDQUZLLENBRUQsQ0FGQyxDQUVFLENBRkYsQ0FFS0EsQ0FGTCxDQUVRLENBRlIsQ0FFVyxDQUFFLENBRmIsQ0FFZ0IsQ0FBRUEsQ0FGbEIsQ0FFc0IsQ0FGdEIsQ0FFeUIsQ0FGekIsQ0FFNEIsQ0FBRUEsQ0FGOUIsQ0FHYkEsQ0FIYSxDQUdWLENBSFUsQ0FHUCxDQUFFLENBSEssQ0FHREEsQ0FIQyxDQUdFLENBSEYsQ0FHSyxDQUhMLENBR1MsQ0FBRUEsQ0FIWCxDQUdjLENBSGQsQ0FHaUIsQ0FBRSxDQUhuQixDQUd1QixDQUFFQSxDQUh6QixDQUc0QixDQUg1QixDQUcrQixDQUgvQixDQUFmLENBTUEsWUFBYyxDQUNaLENBRFksQ0FDVCxFQURTLENBQ0wsQ0FESyxDQUNELENBREMsQ0FDRSxDQURGLENBQ0ssQ0FETCxDQUNTLENBRFQsQ0FDWSxDQURaLENBQ2UsQ0FEZixDQUNtQixDQURuQixDQUNzQixDQUR0QixDQUN5QixFQUR6QixDQUM4QixDQUQ5QixDQUNpQyxFQURqQyxDQUNxQyxFQURyQyxDQUVaLENBRlksQ0FFVCxDQUZTLENBRU4sQ0FGTSxDQUVGLENBRkUsQ0FFQyxFQUZELENBRUssQ0FGTCxDQUVRLEVBRlIsQ0FFWSxFQUZaLENBRWdCLENBRmhCLENBRW1CLEVBRm5CLENBRXVCLENBRnZCLENBRTBCLENBRjFCLENBRTZCLENBRjdCLENBRWdDLENBRmhDLENBRW1DLENBRm5DLENBR1osQ0FIWSxDQUdULENBSFMsQ0FHTixDQUhNLENBR0YsQ0FIRSxDQUdDLENBSEQsQ0FHSSxDQUhKLENBR08sQ0FIUCxDQUdVLENBSFYsQ0FHYSxDQUhiLENBR2dCLENBSGhCLENBR21CLENBSG5CLENBR3NCLENBSHRCLENBR3lCLENBSHpCLENBRzRCLENBSDVCLENBRytCLENBSC9CLENBSVosQ0FKWSxDQUlULENBSlMsQ0FJTixDQUpNLENBSUYsQ0FKRSxDQUlDLENBSkQsQ0FJSSxFQUpKLENBSVEsQ0FKUixDQUlXLENBSlgsQ0FJYyxFQUpkLENBSWtCLENBSmxCLENBSXFCLENBSnJCLENBSXdCLENBSnhCLENBSTJCLENBSjNCLENBSThCLENBSjlCLENBSWlDLENBSmpDLENBQWQsQ0FPQTg0RSx5QkFBeUJsaEcsSUFBekIsQ0FBK0IsSUFBL0IsQ0FBcUN1bEMsUUFBckMsQ0FBK0MyZixPQUEvQyxDQUF3RHBuQixNQUF4RCxDQUFnRWdpRSxNQUFoRSxFQUVBLEtBQUsvL0YsSUFBTCxDQUFZLDJCQUFaLENBRUEsS0FBS29oRCxVQUFMLENBQWtCLENBQ2pCcmpCLE9BQVFBLE1BRFMsQ0FFakJnaUUsT0FBUUEsTUFGUyxDQUFsQixDQUtBLENBRUQwQiwwQkFBMEJsakcsU0FBMUIsQ0FBc0NELE9BQU9pQixNQUFQLENBQWU0aEcseUJBQXlCNWlHLFNBQXhDLENBQXRDLENBQ0FrakcsMEJBQTBCbGpHLFNBQTFCLENBQW9Dc0MsV0FBcEMsQ0FBa0Q0Z0cseUJBQWxELENBRUE7Ozs7RUFPQSw2QkFBQSxDQUErQjFqRSxNQUEvQixDQUF1Q2dpRSxNQUF2QyxDQUFnRCxDQUUvQzU3QyxTQUFTbGtELElBQVQsQ0FBZSxJQUFmLEVBRUEsS0FBS0QsSUFBTCxDQUFZLHNCQUFaLENBRUEsS0FBS29oRCxVQUFMLENBQWtCLENBQ2pCcmpCLE9BQVFBLE1BRFMsQ0FFakJnaUUsT0FBUUEsTUFGUyxDQUFsQixDQUtBLEtBQUt2N0Msa0JBQUwsQ0FBeUIsOEJBQUEsQ0FBZ0N6bUIsTUFBaEMsQ0FBd0NnaUUsTUFBeEMsQ0FBekIsRUFDQSxLQUFLdDRDLGFBQUwsR0FFQSxDQUVEaTZDLHFCQUFxQm5qRyxTQUFyQixDQUFpQ0QsT0FBT2lCLE1BQVAsQ0FBZTRrRCxTQUFTNWxELFNBQXhCLENBQWpDLENBQ0FtakcscUJBQXFCbmpHLFNBQXJCLENBQStCc0MsV0FBL0IsQ0FBNkM2Z0csb0JBQTdDLENBRUE7RUFFQSxtQ0FBQSxDQUFxQzNqRSxNQUFyQyxDQUE2Q2dpRSxNQUE3QyxDQUFzRCxDQUVyRCxNQUFRLENBQUUsRUFBSTc0RixLQUFLdWtCLElBQUwsQ0FBVyxDQUFYLENBQU4sRUFBeUIsQ0FBakMsQ0FDQSxNQUFRLEVBQUlwRCxDQUFaLENBRUEsYUFBZTtFQUdkLENBQUUsQ0FIWSxDQUdULENBQUUsQ0FITyxDQUdKLENBQUUsQ0FIRSxDQUdDLENBQUUsQ0FISCxDQUdNLENBQUUsQ0FIUixDQUdXLENBSFgsQ0FJZCxDQUFFLENBSlksQ0FJVCxDQUpTLENBSU4sQ0FBRSxDQUpJLENBSUQsQ0FBRSxDQUpELENBSUksQ0FKSixDQUlPLENBSlAsQ0FLZCxDQUxjLENBS1gsQ0FBRSxDQUxTLENBS04sQ0FBRSxDQUxJLENBS0QsQ0FMQyxDQUtFLENBQUUsQ0FMSixDQUtPLENBTFAsQ0FNZCxDQU5jLENBTVgsQ0FOVyxDQU1SLENBQUUsQ0FOTSxDQU1ILENBTkcsQ0FNQSxDQU5BLENBTUcsQ0FOSDtFQVNiLENBVGEsQ0FTVixDQUFFdk0sQ0FUUSxDQVNMLENBQUV1TSxDQVRHLENBU0EsQ0FUQSxDQVNHLENBQUV2TSxDQVRMLENBU1F1TSxDQVRSLENBVWIsQ0FWYSxDQVVWdk0sQ0FWVSxDQVVQLENBQUV1TSxDQVZLLENBVUYsQ0FWRSxDQVVDdk0sQ0FWRCxDQVVJdU0sQ0FWSjtFQWFkLENBQUV2TSxDQWJZLENBYVQsQ0FBRXVNLENBYk8sQ0FhSixDQWJJLENBYUQsQ0FBRXZNLENBYkQsQ0FhSXVNLENBYkosQ0FhTyxDQWJQLENBY2J2TSxDQWRhLENBY1YsQ0FBRXVNLENBZFEsQ0FjTCxDQWRLLENBY0Z2TSxDQWRFLENBY0N1TSxDQWRELENBY0ksQ0FkSjtFQWlCZCxDQUFFQSxDQWpCWSxDQWlCVCxDQWpCUyxDQWlCTixDQUFFdk0sQ0FqQkksQ0FpQkR1TSxDQWpCQyxDQWlCRSxDQWpCRixDQWlCSyxDQUFFdk0sQ0FqQlAsQ0FrQmQsQ0FBRXVNLENBbEJZLENBa0JULENBbEJTLENBa0JOdk0sQ0FsQk0sQ0FrQkh1TSxDQWxCRyxDQWtCQSxDQWxCQSxDQWtCR3ZNLENBbEJILENBQWYsQ0FxQkEsWUFBYyxDQUNiLENBRGEsQ0FDVixFQURVLENBQ04sQ0FETSxDQUNGLENBREUsQ0FDQyxDQURELENBQ0ksRUFESixDQUNTLENBRFQsQ0FDWSxFQURaLENBQ2dCLEVBRGhCLENBRWIsQ0FGYSxDQUVWLEVBRlUsQ0FFTixFQUZNLENBRUQsQ0FGQyxDQUVFLEVBRkYsQ0FFTSxDQUZOLENBRVUsQ0FGVixDQUVhLENBRmIsQ0FFZ0IsRUFGaEIsQ0FHYixFQUhhLENBR1QsQ0FIUyxDQUdOLENBSE0sQ0FHRixFQUhFLENBR0UsQ0FIRixDQUdLLEVBSEwsQ0FHVSxFQUhWLENBR2MsRUFIZCxDQUdrQixDQUhsQixDQUliLENBSmEsQ0FJVixDQUpVLENBSVAsRUFKTyxDQUlGLENBSkUsQ0FJQyxFQUpELENBSUssQ0FKTCxDQUlTLENBSlQsQ0FJWSxDQUpaLENBSWUsRUFKZixDQUtiLENBTGEsQ0FLVixFQUxVLENBS04sQ0FMTSxDQUtGLENBTEUsQ0FLQyxDQUxELENBS0ksRUFMSixDQUtTLENBTFQsQ0FLWSxFQUxaLENBS2dCLEVBTGhCLENBTWIsQ0FOYSxDQU1WLEVBTlUsQ0FNTixDQU5NLENBTUYsQ0FORSxDQU1DLENBTkQsQ0FNSSxFQU5KLENBTVMsQ0FOVCxDQU1ZLEVBTlosQ0FNZ0IsRUFOaEIsQ0FPYixDQVBhLENBT1YsRUFQVSxDQU9OLEVBUE0sQ0FPRCxDQVBDLENBT0UsRUFQRixDQU9NLENBUE4sQ0FPVSxDQVBWLENBT2EsQ0FQYixDQU9nQixFQVBoQixDQVFiLEVBUmEsQ0FRVCxDQVJTLENBUU4sQ0FSTSxDQVFGLEVBUkUsQ0FRRSxDQVJGLENBUUssRUFSTCxDQVFVLEVBUlYsQ0FRYyxFQVJkLENBUWtCLENBUmxCLENBU2IsQ0FUYSxDQVNWLEVBVFUsQ0FTTixFQVRNLENBU0QsQ0FUQyxDQVNFLEVBVEYsQ0FTTSxDQVROLENBU1UsQ0FUVixDQVNhLENBVGIsQ0FTZ0IsQ0FUaEIsQ0FVYixFQVZhLENBVVQsQ0FWUyxDQVVOLENBVk0sQ0FVRixFQVZFLENBVUUsQ0FWRixDQVVLLEVBVkwsQ0FVVSxFQVZWLENBVWMsRUFWZCxDQVVrQixDQVZsQixDQVdiLEVBWGEsQ0FXVCxDQVhTLENBV04sRUFYTSxDQVdELEVBWEMsQ0FXRyxFQVhILENBV08sQ0FYUCxDQVdXLEVBWFgsQ0FXZSxDQVhmLENBV2tCLEVBWGxCLENBWWIsQ0FaYSxDQVlWLEVBWlUsQ0FZTixFQVpNLENBWUQsQ0FaQyxDQVlFLEVBWkYsQ0FZTSxDQVpOLENBWVUsQ0FaVixDQVlhLENBWmIsQ0FZZ0IsQ0FaaEIsQ0FBZCxDQWVBcWxGLHlCQUF5QmxoRyxJQUF6QixDQUErQixJQUEvQixDQUFxQ3VsQyxRQUFyQyxDQUErQzJmLE9BQS9DLENBQXdEcG5CLE1BQXhELENBQWdFZ2lFLE1BQWhFLEVBRUEsS0FBSy8vRixJQUFMLENBQVksNEJBQVosQ0FFQSxLQUFLb2hELFVBQUwsQ0FBa0IsQ0FDakJyakIsT0FBUUEsTUFEUyxDQUVqQmdpRSxPQUFRQSxNQUZTLENBQWxCLENBS0EsQ0FFRDRCLDJCQUEyQnBqRyxTQUEzQixDQUF1Q0QsT0FBT2lCLE1BQVAsQ0FBZTRoRyx5QkFBeUI1aUcsU0FBeEMsQ0FBdkMsQ0FDQW9qRywyQkFBMkJwakcsU0FBM0IsQ0FBcUNzQyxXQUFyQyxDQUFtRDhnRywwQkFBbkQsQ0FFQTs7Ozs7Ozs7O0VBWUEscUJBQUEsQ0FBdUJuOEIsSUFBdkIsQ0FBNkJvOEIsZUFBN0IsQ0FBOEM3akUsTUFBOUMsQ0FBc0Q4akUsY0FBdEQsQ0FBc0VDLE1BQXRFLENBQThFQyxLQUE5RSxDQUFzRixDQUVyRjU5QyxTQUFTbGtELElBQVQsQ0FBZSxJQUFmLEVBRUEsS0FBS0QsSUFBTCxDQUFZLGNBQVosQ0FFQSxLQUFLb2hELFVBQUwsQ0FBa0IsQ0FDakJva0IsS0FBTUEsSUFEVyxDQUVqQm84QixnQkFBaUJBLGVBRkEsQ0FHakI3akUsT0FBUUEsTUFIUyxDQUlqQjhqRSxlQUFnQkEsY0FKQyxDQUtqQkMsT0FBUUEsTUFMUyxDQUFsQixDQVFBLEdBQUtDLFFBQVVwK0YsU0FBZixDQUEyQjJXLFFBQVE2UCxJQUFSLENBQWMsNkNBQWQsRUFFM0IsbUJBQXFCLHNCQUFBLENBQXdCcTdDLElBQXhCLENBQThCbzhCLGVBQTlCLENBQStDN2pFLE1BQS9DLENBQXVEOGpFLGNBQXZELENBQXVFQyxNQUF2RSxDQUFyQixDQUVBO0VBRUEsS0FBS0UsUUFBTCxDQUFnQkMsZUFBZUQsUUFBL0IsQ0FDQSxLQUFLcDlDLE9BQUwsQ0FBZXE5QyxlQUFlcjlDLE9BQTlCLENBQ0EsS0FBS3M5QyxTQUFMLENBQWlCRCxlQUFlQyxTQUFoQyxDQUVBO0VBRUEsS0FBSzE5QyxrQkFBTCxDQUF5Qnk5QyxjQUF6QixFQUNBLEtBQUt4NkMsYUFBTCxHQUVBLENBRUQwNkMsYUFBYTVqRyxTQUFiLENBQXlCRCxPQUFPaUIsTUFBUCxDQUFlNGtELFNBQVM1bEQsU0FBeEIsQ0FBekIsQ0FDQTRqRyxhQUFhNWpHLFNBQWIsQ0FBdUJzQyxXQUF2QixDQUFxQ3NoRyxZQUFyQyxDQUVBO0VBRUEsMkJBQUEsQ0FBNkIzOEIsSUFBN0IsQ0FBbUNvOEIsZUFBbkMsQ0FBb0Q3akUsTUFBcEQsQ0FBNEQ4akUsY0FBNUQsQ0FBNEVDLE1BQTVFLENBQXFGLENBRXBGeDFDLGVBQWVyc0QsSUFBZixDQUFxQixJQUFyQixFQUVBLEtBQUtELElBQUwsQ0FBWSxvQkFBWixDQUVBLEtBQUtvaEQsVUFBTCxDQUFrQixDQUNqQm9rQixLQUFNQSxJQURXLENBRWpCbzhCLGdCQUFpQkEsZUFGQSxDQUdqQjdqRSxPQUFRQSxNQUhTLENBSWpCOGpFLGVBQWdCQSxjQUpDLENBS2pCQyxPQUFRQSxNQUxTLENBQWxCLENBUUFGLGdCQUFrQkEsaUJBQW1CLEVBQXJDLENBQ0E3akUsT0FBU0EsUUFBVSxDQUFuQixDQUNBOGpFLGVBQWlCQSxnQkFBa0IsQ0FBbkMsQ0FDQUMsT0FBU0EsUUFBVSxLQUFuQixDQUVBLFdBQWF0OEIsS0FBSzQ4QixtQkFBTCxDQUEwQlIsZUFBMUIsQ0FBMkNFLE1BQTNDLENBQWIsQ0FFQTtFQUVBLEtBQUtFLFFBQUwsQ0FBZ0JLLE9BQU9MLFFBQXZCLENBQ0EsS0FBS3A5QyxPQUFMLENBQWV5OUMsT0FBT3o5QyxPQUF0QixDQUNBLEtBQUtzOUMsU0FBTCxDQUFpQkcsT0FBT0gsU0FBeEIsQ0FFQTtFQUVBLFdBQWEsV0FBQSxFQUFiLENBQ0EsV0FBYSxXQUFBLEVBQWIsQ0FDQSxPQUFTLFdBQUEsRUFBVCxDQUNBLE1BQVEsV0FBQSxFQUFSLENBRUEsS0FBQSxDQUFPamhGLENBQVAsQ0FFQTtFQUVBLGFBQWUsRUFBZixDQUNBLFlBQWMsRUFBZCxDQUNBLFFBQVUsRUFBVixDQUNBLFlBQWMsRUFBZCxDQUVBO0VBRUFxaEYscUJBRUE7RUFFQSxLQUFLOTFDLFFBQUwsQ0FBZXJILE9BQWYsRUFDQSxLQUFLdUgsWUFBTCxDQUFtQixVQUFuQixDQUErQiwwQkFBQSxDQUE0QmxuQixRQUE1QixDQUFzQyxDQUF0QyxDQUEvQixFQUNBLEtBQUtrbkIsWUFBTCxDQUFtQixRQUFuQixDQUE2QiwwQkFBQSxDQUE0QjlILE9BQTVCLENBQXFDLENBQXJDLENBQTdCLEVBQ0EsS0FBSzhILFlBQUwsQ0FBbUIsSUFBbkIsQ0FBeUIsMEJBQUEsQ0FBNEI1SCxHQUE1QixDQUFpQyxDQUFqQyxDQUF6QixFQUVBO0VBRUEsMkJBQUEsRUFBOEIsQ0FFN0IsSUFBTXovQyxFQUFJLENBQVYsQ0FBYUEsRUFBSXU4RixlQUFqQixDQUFrQ3Y4RixHQUFsQyxDQUF5QyxDQUV4Q2s5RixnQkFBaUJsOUYsQ0FBakIsRUFFQSxDQUVEO0VBQ0E7RUFDQTtFQUNBO0VBRUFrOUYsZ0JBQW1CVCxTQUFXLEtBQWIsQ0FBdUJGLGVBQXZCLENBQXlDLENBQTFELEVBRUE7RUFDQTtFQUVBekIsY0FFQTtFQUVBcUMsa0JBRUEsQ0FFRCx3QkFBQSxDQUEwQm45RixDQUExQixDQUE4QjtFQUk3QnFFLEVBQUk4N0QsS0FBS2k5QixVQUFMLENBQWlCcDlGLEVBQUl1OEYsZUFBckIsQ0FBc0NsNEYsQ0FBdEMsQ0FBSixDQUVBO0VBRUEsTUFBUTI0RixPQUFPejlDLE9BQVAsQ0FBZ0J2L0MsQ0FBaEIsQ0FBUixDQUNBLE1BQVFnOUYsT0FBT0gsU0FBUCxDQUFrQjc4RixDQUFsQixDQUFSLENBRUE7RUFFQSxJQUFNNGIsRUFBSSxDQUFWLENBQWFBLEdBQUs0Z0YsY0FBbEIsQ0FBa0M1Z0YsR0FBbEMsQ0FBeUMsQ0FFeEMsTUFBUUEsRUFBSTRnRixjQUFKLENBQXFCMzZGLEtBQUsrZixFQUExQixDQUErQixDQUF2QyxDQUVBLFFBQVUvZixLQUFLa21CLEdBQUwsQ0FBVTFWLENBQVYsQ0FBVixDQUNBLFFBQVUsQ0FBRXhRLEtBQUtpbUIsR0FBTCxDQUFVelYsQ0FBVixDQUFaLENBRUE7RUFFQStsQixPQUFPN2xCLENBQVAsQ0FBYXVWLElBQU11MUUsRUFBRTlxRixDQUFSLENBQVl3VixJQUFNM2lCLEVBQUVtTixDQUFqQyxDQUNBNmxCLE9BQU9yVixDQUFQLENBQWErRSxJQUFNdTFFLEVBQUV0NkUsQ0FBUixDQUFZZ0YsSUFBTTNpQixFQUFFMmQsQ0FBakMsQ0FDQXFWLE9BQU94TyxDQUFQLENBQWE5QixJQUFNdTFFLEVBQUV6ekUsQ0FBUixDQUFZN0IsSUFBTTNpQixFQUFFd2tCLENBQWpDLENBQ0F3TyxPQUFPN1IsU0FBUCxHQUVBZzVCLFFBQVFwZ0QsSUFBUixDQUFjaTVCLE9BQU83bEIsQ0FBckIsQ0FBd0I2bEIsT0FBT3JWLENBQS9CLENBQWtDcVYsT0FBT3hPLENBQXpDLEVBRUE7RUFFQW0xQixPQUFPeHNDLENBQVAsQ0FBV2xPLEVBQUVrTyxDQUFGLENBQU1tbUIsT0FBU04sT0FBTzdsQixDQUFqQyxDQUNBd3NDLE9BQU9oOEIsQ0FBUCxDQUFXMWUsRUFBRTBlLENBQUYsQ0FBTTJWLE9BQVNOLE9BQU9yVixDQUFqQyxDQUNBZzhCLE9BQU9uMUIsQ0FBUCxDQUFXdmxCLEVBQUV1bEIsQ0FBRixDQUFNOE8sT0FBU04sT0FBT3hPLENBQWpDLENBRUF1VyxTQUFTaGhDLElBQVQsQ0FBZTQvQyxPQUFPeHNDLENBQXRCLENBQXlCd3NDLE9BQU9oOEIsQ0FBaEMsQ0FBbUNnOEIsT0FBT24xQixDQUExQyxFQUVBLENBRUQsQ0FFRCx3QkFBQSxFQUEyQixDQUUxQixJQUFNaE8sRUFBSSxDQUFWLENBQWFBLEdBQUsyZ0YsZUFBbEIsQ0FBbUMzZ0YsR0FBbkMsQ0FBMEMsQ0FFekMsSUFBTTViLEVBQUksQ0FBVixDQUFhQSxHQUFLdzhGLGNBQWxCLENBQWtDeDhGLEdBQWxDLENBQXlDLENBRXhDLE1BQVEsQ0FBRXc4RixlQUFpQixDQUFuQixHQUEyQjVnRixFQUFJLENBQS9CLEdBQXVDNWIsRUFBSSxDQUEzQyxDQUFSLENBQ0EsTUFBUSxDQUFFdzhGLGVBQWlCLENBQW5CLEVBQXlCNWdGLENBQXpCLEVBQStCNWIsRUFBSSxDQUFuQyxDQUFSLENBQ0EsTUFBUSxDQUFFdzhGLGVBQWlCLENBQW5CLEVBQXlCNWdGLENBQXpCLENBQTZCNWIsQ0FBckMsQ0FDQSxNQUFRLENBQUV3OEYsZUFBaUIsQ0FBbkIsR0FBMkI1Z0YsRUFBSSxDQUEvQixFQUFxQzViLENBQTdDLENBRUE7RUFFQTgvQyxRQUFRM2dELElBQVIsQ0FBY3VELENBQWQsQ0FBaUJGLENBQWpCLENBQW9CNG5CLENBQXBCLEVBQ0EwMUIsUUFBUTNnRCxJQUFSLENBQWNxRCxDQUFkLENBQWlCVyxDQUFqQixDQUFvQmluQixDQUFwQixFQUVBLENBRUQsQ0FFRCxDQUVELG9CQUFBLEVBQXVCLENBRXRCLElBQU1wcUIsRUFBSSxDQUFWLENBQWFBLEdBQUt1OEYsZUFBbEIsQ0FBbUN2OEYsR0FBbkMsQ0FBMEMsQ0FFekMsSUFBTTRiLEVBQUksQ0FBVixDQUFhQSxHQUFLNGdGLGNBQWxCLENBQWtDNWdGLEdBQWxDLENBQXlDLENBRXhDK2dCLEdBQUdwcUIsQ0FBSCxDQUFPdlMsRUFBSXU4RixlQUFYLENBQ0E1L0QsR0FBRzVaLENBQUgsQ0FBT25ILEVBQUk0Z0YsY0FBWCxDQUVBLzhDLElBQUl0Z0QsSUFBSixDQUFVdzlCLEdBQUdwcUIsQ0FBYixDQUFnQm9xQixHQUFHNVosQ0FBbkIsRUFFQSxDQUVELENBRUQsQ0FFRCxDQUVEdTZFLG1CQUFtQnBrRyxTQUFuQixDQUErQkQsT0FBT2lCLE1BQVAsQ0FBZStzRCxlQUFlL3RELFNBQTlCLENBQS9CLENBQ0Fva0csbUJBQW1CcGtHLFNBQW5CLENBQTZCc0MsV0FBN0IsQ0FBMkM4aEcsa0JBQTNDLENBRUE7Ozs7OztFQVNBLDBCQUFBLENBQTRCNWtFLE1BQTVCLENBQW9DNmtFLElBQXBDLENBQTBDaEIsZUFBMUMsQ0FBMkRDLGNBQTNELENBQTJFMytFLENBQTNFLENBQThFc04sQ0FBOUUsQ0FBaUZxeUUsV0FBakYsQ0FBK0YsQ0FFOUYxK0MsU0FBU2xrRCxJQUFULENBQWUsSUFBZixFQUVBLEtBQUtELElBQUwsQ0FBWSxtQkFBWixDQUVBLEtBQUtvaEQsVUFBTCxDQUFrQixDQUNqQnJqQixPQUFRQSxNQURTLENBRWpCNmtFLEtBQU1BLElBRlcsQ0FHakJoQixnQkFBaUJBLGVBSEEsQ0FJakJDLGVBQWdCQSxjQUpDLENBS2pCMytFLEVBQUdBLENBTGMsQ0FNakJzTixFQUFHQSxDQU5jLENBQWxCLENBU0EsR0FBS3F5RSxjQUFnQmwvRixTQUFyQixDQUFpQzJXLFFBQVE2UCxJQUFSLENBQWMsMEZBQWQsRUFFakMsS0FBS3E2QixrQkFBTCxDQUF5QiwyQkFBQSxDQUE2QnptQixNQUE3QixDQUFxQzZrRSxJQUFyQyxDQUEyQ2hCLGVBQTNDLENBQTREQyxjQUE1RCxDQUE0RTMrRSxDQUE1RSxDQUErRXNOLENBQS9FLENBQXpCLEVBQ0EsS0FBS2kzQixhQUFMLEdBRUEsQ0FFRHE3QyxrQkFBa0J2a0csU0FBbEIsQ0FBOEJELE9BQU9pQixNQUFQLENBQWU0a0QsU0FBUzVsRCxTQUF4QixDQUE5QixDQUNBdWtHLGtCQUFrQnZrRyxTQUFsQixDQUE0QnNDLFdBQTVCLENBQTBDaWlHLGlCQUExQyxDQUVBO0VBRUEsZ0NBQUEsQ0FBa0Mva0UsTUFBbEMsQ0FBMEM2a0UsSUFBMUMsQ0FBZ0RoQixlQUFoRCxDQUFpRUMsY0FBakUsQ0FBaUYzK0UsQ0FBakYsQ0FBb0ZzTixDQUFwRixDQUF3RixDQUV2Rjg3QixlQUFlcnNELElBQWYsQ0FBcUIsSUFBckIsRUFFQSxLQUFLRCxJQUFMLENBQVkseUJBQVosQ0FFQSxLQUFLb2hELFVBQUwsQ0FBa0IsQ0FDakJyakIsT0FBUUEsTUFEUyxDQUVqQjZrRSxLQUFNQSxJQUZXLENBR2pCaEIsZ0JBQWlCQSxlQUhBLENBSWpCQyxlQUFnQkEsY0FKQyxDQUtqQjMrRSxFQUFHQSxDQUxjLENBTWpCc04sRUFBR0EsQ0FOYyxDQUFsQixDQVNBdU4sT0FBU0EsUUFBVSxDQUFuQixDQUNBNmtFLEtBQU9BLE1BQVEsR0FBZixDQUNBaEIsZ0JBQWtCMTZGLEtBQUtFLEtBQUwsQ0FBWXc2RixlQUFaLEdBQWlDLEVBQW5ELENBQ0FDLGVBQWlCMzZGLEtBQUtFLEtBQUwsQ0FBWXk2RixjQUFaLEdBQWdDLENBQWpELENBQ0EzK0UsRUFBSUEsR0FBSyxDQUFULENBQ0FzTixFQUFJQSxHQUFLLENBQVQsQ0FFQTtFQUVBLFlBQWMsRUFBZCxDQUNBLGFBQWUsRUFBZixDQUNBLFlBQWMsRUFBZCxDQUNBLFFBQVUsRUFBVixDQUVBO0VBRUEsS0FBQSxDQUFPdlAsQ0FBUCxDQUVBLFdBQWEsV0FBQSxFQUFiLENBQ0EsV0FBYSxXQUFBLEVBQWIsQ0FFQSxPQUFTLFdBQUEsRUFBVCxDQUNBLE9BQVMsV0FBQSxFQUFULENBRUEsTUFBUSxXQUFBLEVBQVIsQ0FDQSxNQUFRLFdBQUEsRUFBUixDQUNBLE1BQVEsV0FBQSxFQUFSLENBRUE7RUFFQSxJQUFNNWIsRUFBSSxDQUFWLENBQWFBLEdBQUt1OEYsZUFBbEIsQ0FBbUMsRUFBR3Y4RixDQUF0QyxDQUEwQztFQUl6QyxNQUFRQSxFQUFJdThGLGVBQUosQ0FBc0IxK0UsQ0FBdEIsQ0FBMEJoYyxLQUFLK2YsRUFBL0IsQ0FBb0MsQ0FBNUMsQ0FFQTtFQUNBO0VBRUE4N0UseUJBQTBCdndELENBQTFCLENBQTZCdHZCLENBQTdCLENBQWdDc04sQ0FBaEMsQ0FBbUN1TixNQUFuQyxDQUEyQ2lsRSxFQUEzQyxFQUNBRCx5QkFBMEJ2d0QsRUFBSSxJQUE5QixDQUFvQ3R2QixDQUFwQyxDQUF1Q3NOLENBQXZDLENBQTBDdU4sTUFBMUMsQ0FBa0RrbEUsRUFBbEQsRUFFQTtFQUVBdndGLEVBQUU4WCxVQUFGLENBQWN5NEUsRUFBZCxDQUFrQkQsRUFBbEIsRUFDQU4sRUFBRXQ0RSxVQUFGLENBQWM2NEUsRUFBZCxDQUFrQkQsRUFBbEIsRUFDQXY0RixFQUFFa25CLFlBQUYsQ0FBZ0JqZixDQUFoQixDQUFtQmd3RixDQUFuQixFQUNBQSxFQUFFL3dFLFlBQUYsQ0FBZ0JsbkIsQ0FBaEIsQ0FBbUJpSSxDQUFuQixFQUVBO0VBRUFqSSxFQUFFbWhCLFNBQUYsR0FDQTgyRSxFQUFFOTJFLFNBQUYsR0FFQSxJQUFNM0ssRUFBSSxDQUFWLENBQWFBLEdBQUs0Z0YsY0FBbEIsQ0FBa0MsRUFBRzVnRixDQUFyQyxDQUF5QztFQUd4QztFQUVBLE1BQVFBLEVBQUk0Z0YsY0FBSixDQUFxQjM2RixLQUFLK2YsRUFBMUIsQ0FBK0IsQ0FBdkMsQ0FDQSxPQUFTLENBQUUyN0UsSUFBRixDQUFTMTdGLEtBQUtpbUIsR0FBTCxDQUFVelYsQ0FBVixDQUFsQixDQUNBLE9BQVNrckYsS0FBTzE3RixLQUFLa21CLEdBQUwsQ0FBVTFWLENBQVYsQ0FBaEIsQ0FFQTtFQUNBO0VBRUEwc0MsT0FBT3hzQyxDQUFQLENBQVdvckYsR0FBR3ByRixDQUFILEVBQVNnbkIsR0FBSzhqRSxFQUFFOXFGLENBQVAsQ0FBV2luQixHQUFLcDBCLEVBQUVtTixDQUEzQixDQUFYLENBQ0F3c0MsT0FBT2g4QixDQUFQLENBQVc0NkUsR0FBRzU2RSxDQUFILEVBQVN3VyxHQUFLOGpFLEVBQUV0NkUsQ0FBUCxDQUFXeVcsR0FBS3AwQixFQUFFMmQsQ0FBM0IsQ0FBWCxDQUNBZzhCLE9BQU9uMUIsQ0FBUCxDQUFXK3pFLEdBQUcvekUsQ0FBSCxFQUFTMlAsR0FBSzhqRSxFQUFFenpFLENBQVAsQ0FBVzRQLEdBQUtwMEIsRUFBRXdrQixDQUEzQixDQUFYLENBRUF1VyxTQUFTaGhDLElBQVQsQ0FBZTQvQyxPQUFPeHNDLENBQXRCLENBQXlCd3NDLE9BQU9oOEIsQ0FBaEMsQ0FBbUNnOEIsT0FBT24xQixDQUExQyxFQUVBO0VBRUF3TyxPQUFPalQsVUFBUCxDQUFtQjQ1QixNQUFuQixDQUEyQjQrQyxFQUEzQixFQUFnQ3AzRSxTQUFoQyxHQUVBZzVCLFFBQVFwZ0QsSUFBUixDQUFjaTVCLE9BQU83bEIsQ0FBckIsQ0FBd0I2bEIsT0FBT3JWLENBQS9CLENBQWtDcVYsT0FBT3hPLENBQXpDLEVBRUE7RUFFQTYxQixJQUFJdGdELElBQUosQ0FBVWEsRUFBSXU4RixlQUFkLEVBQ0E5OEMsSUFBSXRnRCxJQUFKLENBQVV5YyxFQUFJNGdGLGNBQWQsRUFFQSxDQUVELENBRUQ7RUFFQSxJQUFNNWdGLEVBQUksQ0FBVixDQUFhQSxHQUFLMmdGLGVBQWxCLENBQW1DM2dGLEdBQW5DLENBQTBDLENBRXpDLElBQU01YixFQUFJLENBQVYsQ0FBYUEsR0FBS3c4RixjQUFsQixDQUFrQ3g4RixHQUFsQyxDQUF5QztFQUl4QyxNQUFRLENBQUV3OEYsZUFBaUIsQ0FBbkIsR0FBMkI1Z0YsRUFBSSxDQUEvQixHQUF1QzViLEVBQUksQ0FBM0MsQ0FBUixDQUNBLE1BQVEsQ0FBRXc4RixlQUFpQixDQUFuQixFQUF5QjVnRixDQUF6QixFQUErQjViLEVBQUksQ0FBbkMsQ0FBUixDQUNBLE1BQVEsQ0FBRXc4RixlQUFpQixDQUFuQixFQUF5QjVnRixDQUF6QixDQUE2QjViLENBQXJDLENBQ0EsTUFBUSxDQUFFdzhGLGVBQWlCLENBQW5CLEdBQTJCNWdGLEVBQUksQ0FBL0IsRUFBcUM1YixDQUE3QyxDQUVBO0VBRUE4L0MsUUFBUTNnRCxJQUFSLENBQWN1RCxDQUFkLENBQWlCRixDQUFqQixDQUFvQjRuQixDQUFwQixFQUNBMDFCLFFBQVEzZ0QsSUFBUixDQUFjcUQsQ0FBZCxDQUFpQlcsQ0FBakIsQ0FBb0JpbkIsQ0FBcEIsRUFFQSxDQUVELENBRUQ7RUFFQSxLQUFLKzhCLFFBQUwsQ0FBZXJILE9BQWYsRUFDQSxLQUFLdUgsWUFBTCxDQUFtQixVQUFuQixDQUErQiwwQkFBQSxDQUE0QmxuQixRQUE1QixDQUFzQyxDQUF0QyxDQUEvQixFQUNBLEtBQUtrbkIsWUFBTCxDQUFtQixRQUFuQixDQUE2QiwwQkFBQSxDQUE0QjlILE9BQTVCLENBQXFDLENBQXJDLENBQTdCLEVBQ0EsS0FBSzhILFlBQUwsQ0FBbUIsSUFBbkIsQ0FBeUIsMEJBQUEsQ0FBNEI1SCxHQUE1QixDQUFpQyxDQUFqQyxDQUF6QixFQUVBO0VBRUEsaUNBQUEsQ0FBbUN0UyxDQUFuQyxDQUFzQ3R2QixDQUF0QyxDQUF5Q3NOLENBQXpDLENBQTRDdU4sTUFBNUMsQ0FBb0Q5SCxRQUFwRCxDQUErRCxDQUU5RCxPQUFTL3VCLEtBQUtpbUIsR0FBTCxDQUFVcWxCLENBQVYsQ0FBVCxDQUNBLE9BQVN0ckMsS0FBS2ttQixHQUFMLENBQVVvbEIsQ0FBVixDQUFULENBQ0EsWUFBY2hpQixFQUFJdE4sQ0FBSixDQUFRc3ZCLENBQXRCLENBQ0EsT0FBU3RyQyxLQUFLaW1CLEdBQUwsQ0FBVSsxRSxPQUFWLENBQVQsQ0FFQWp0RSxTQUFTcmUsQ0FBVCxDQUFhbW1CLFFBQVcsRUFBSW9sRSxFQUFmLEVBQXNCLEdBQXRCLENBQTRCQyxFQUF6QyxDQUNBbnRFLFNBQVM3TixDQUFULENBQWEyVixRQUFXLEVBQUlvbEUsRUFBZixFQUFzQkUsRUFBdEIsQ0FBMkIsR0FBeEMsQ0FDQXB0RSxTQUFTaEgsQ0FBVCxDQUFhOE8sT0FBUzcyQixLQUFLa21CLEdBQUwsQ0FBVTgxRSxPQUFWLENBQVQsQ0FBK0IsR0FBNUMsQ0FFQSxDQUVELENBRURJLHdCQUF3Qi9rRyxTQUF4QixDQUFvQ0QsT0FBT2lCLE1BQVAsQ0FBZStzRCxlQUFlL3RELFNBQTlCLENBQXBDLENBQ0Era0csd0JBQXdCL2tHLFNBQXhCLENBQWtDc0MsV0FBbEMsQ0FBZ0R5aUcsdUJBQWhELENBRUE7Ozs7O0VBUUEsc0JBQUEsQ0FBd0J2bEUsTUFBeEIsQ0FBZ0M2a0UsSUFBaEMsQ0FBc0NmLGNBQXRDLENBQXNERCxlQUF0RCxDQUF1RTJCLEdBQXZFLENBQTZFLENBRTVFcC9DLFNBQVNsa0QsSUFBVCxDQUFlLElBQWYsRUFFQSxLQUFLRCxJQUFMLENBQVksZUFBWixDQUVBLEtBQUtvaEQsVUFBTCxDQUFrQixDQUNqQnJqQixPQUFRQSxNQURTLENBRWpCNmtFLEtBQU1BLElBRlcsQ0FHakJmLGVBQWdCQSxjQUhDLENBSWpCRCxnQkFBaUJBLGVBSkEsQ0FLakIyQixJQUFLQSxHQUxZLENBQWxCLENBUUEsS0FBSy8rQyxrQkFBTCxDQUF5Qix1QkFBQSxDQUF5QnptQixNQUF6QixDQUFpQzZrRSxJQUFqQyxDQUF1Q2YsY0FBdkMsQ0FBdURELGVBQXZELENBQXdFMkIsR0FBeEUsQ0FBekIsRUFDQSxLQUFLOTdDLGFBQUwsR0FFQSxDQUVEKzdDLGNBQWNqbEcsU0FBZCxDQUEwQkQsT0FBT2lCLE1BQVAsQ0FBZTRrRCxTQUFTNWxELFNBQXhCLENBQTFCLENBQ0FpbEcsY0FBY2psRyxTQUFkLENBQXdCc0MsV0FBeEIsQ0FBc0MyaUcsYUFBdEMsQ0FFQTtFQUVBLDRCQUFBLENBQThCemxFLE1BQTlCLENBQXNDNmtFLElBQXRDLENBQTRDZixjQUE1QyxDQUE0REQsZUFBNUQsQ0FBNkUyQixHQUE3RSxDQUFtRixDQUVsRmozQyxlQUFlcnNELElBQWYsQ0FBcUIsSUFBckIsRUFFQSxLQUFLRCxJQUFMLENBQVkscUJBQVosQ0FFQSxLQUFLb2hELFVBQUwsQ0FBa0IsQ0FDakJyakIsT0FBUUEsTUFEUyxDQUVqQjZrRSxLQUFNQSxJQUZXLENBR2pCZixlQUFnQkEsY0FIQyxDQUlqQkQsZ0JBQWlCQSxlQUpBLENBS2pCMkIsSUFBS0EsR0FMWSxDQUFsQixDQVFBeGxFLE9BQVNBLFFBQVUsQ0FBbkIsQ0FDQTZrRSxLQUFPQSxNQUFRLEdBQWYsQ0FDQWYsZUFBaUIzNkYsS0FBS0UsS0FBTCxDQUFZeTZGLGNBQVosR0FBZ0MsQ0FBakQsQ0FDQUQsZ0JBQWtCMTZGLEtBQUtFLEtBQUwsQ0FBWXc2RixlQUFaLEdBQWlDLENBQW5ELENBQ0EyQixJQUFNQSxLQUFPcjhGLEtBQUsrZixFQUFMLENBQVUsQ0FBdkIsQ0FFQTtFQUVBLFlBQWMsRUFBZCxDQUNBLGFBQWUsRUFBZixDQUNBLFlBQWMsRUFBZCxDQUNBLFFBQVUsRUFBVixDQUVBO0VBRUEsV0FBYSxXQUFBLEVBQWIsQ0FDQSxXQUFhLFdBQUEsRUFBYixDQUNBLFdBQWEsV0FBQSxFQUFiLENBRUEsS0FBQSxDQUFPNWhCLENBQVAsQ0FFQTtFQUVBLElBQU00YixFQUFJLENBQVYsQ0FBYUEsR0FBSzRnRixjQUFsQixDQUFrQzVnRixHQUFsQyxDQUF5QyxDQUV4QyxJQUFNNWIsRUFBSSxDQUFWLENBQWFBLEdBQUt1OEYsZUFBbEIsQ0FBbUN2OEYsR0FBbkMsQ0FBMEMsQ0FFekMsTUFBUUEsRUFBSXU4RixlQUFKLENBQXNCMkIsR0FBOUIsQ0FDQSxNQUFRdGlGLEVBQUk0Z0YsY0FBSixDQUFxQjM2RixLQUFLK2YsRUFBMUIsQ0FBK0IsQ0FBdkMsQ0FFQTtFQUVBbTlCLE9BQU94c0MsQ0FBUCxDQUFXLENBQUVtbUIsT0FBUzZrRSxLQUFPMTdGLEtBQUtpbUIsR0FBTCxDQUFVelYsQ0FBVixDQUFsQixFQUFvQ3hRLEtBQUtpbUIsR0FBTCxDQUFVcWxCLENBQVYsQ0FBL0MsQ0FDQTRSLE9BQU9oOEIsQ0FBUCxDQUFXLENBQUUyVixPQUFTNmtFLEtBQU8xN0YsS0FBS2ltQixHQUFMLENBQVV6VixDQUFWLENBQWxCLEVBQW9DeFEsS0FBS2ttQixHQUFMLENBQVVvbEIsQ0FBVixDQUEvQyxDQUNBNFIsT0FBT24xQixDQUFQLENBQVcyekUsS0FBTzE3RixLQUFLa21CLEdBQUwsQ0FBVTFWLENBQVYsQ0FBbEIsQ0FFQTh0QixTQUFTaGhDLElBQVQsQ0FBZTQvQyxPQUFPeHNDLENBQXRCLENBQXlCd3NDLE9BQU9oOEIsQ0FBaEMsQ0FBbUNnOEIsT0FBT24xQixDQUExQyxFQUVBO0VBRUEvQixPQUFPdFYsQ0FBUCxDQUFXbW1CLE9BQVM3MkIsS0FBS2ltQixHQUFMLENBQVVxbEIsQ0FBVixDQUFwQixDQUNBdGxCLE9BQU85RSxDQUFQLENBQVcyVixPQUFTNzJCLEtBQUtrbUIsR0FBTCxDQUFVb2xCLENBQVYsQ0FBcEIsQ0FDQS9VLE9BQU9qVCxVQUFQLENBQW1CNDVCLE1BQW5CLENBQTJCbDNCLE1BQTNCLEVBQW9DdEIsU0FBcEMsR0FFQWc1QixRQUFRcGdELElBQVIsQ0FBY2k1QixPQUFPN2xCLENBQXJCLENBQXdCNmxCLE9BQU9yVixDQUEvQixDQUFrQ3FWLE9BQU94TyxDQUF6QyxFQUVBO0VBRUE2MUIsSUFBSXRnRCxJQUFKLENBQVVhLEVBQUl1OEYsZUFBZCxFQUNBOThDLElBQUl0Z0QsSUFBSixDQUFVeWMsRUFBSTRnRixjQUFkLEVBRUEsQ0FFRCxDQUVEO0VBRUEsSUFBTTVnRixFQUFJLENBQVYsQ0FBYUEsR0FBSzRnRixjQUFsQixDQUFrQzVnRixHQUFsQyxDQUF5QyxDQUV4QyxJQUFNNWIsRUFBSSxDQUFWLENBQWFBLEdBQUt1OEYsZUFBbEIsQ0FBbUN2OEYsR0FBbkMsQ0FBMEM7RUFJekMsTUFBUSxDQUFFdThGLGdCQUFrQixDQUFwQixFQUEwQjNnRixDQUExQixDQUE4QjViLENBQTlCLENBQWtDLENBQTFDLENBQ0EsTUFBUSxDQUFFdThGLGdCQUFrQixDQUFwQixHQUE0QjNnRixFQUFJLENBQWhDLEVBQXNDNWIsQ0FBdEMsQ0FBMEMsQ0FBbEQsQ0FDQSxNQUFRLENBQUV1OEYsZ0JBQWtCLENBQXBCLEdBQTRCM2dGLEVBQUksQ0FBaEMsRUFBc0M1YixDQUE5QyxDQUNBLE1BQVEsQ0FBRXU4RixnQkFBa0IsQ0FBcEIsRUFBMEIzZ0YsQ0FBMUIsQ0FBOEI1YixDQUF0QyxDQUVBO0VBRUE4L0MsUUFBUTNnRCxJQUFSLENBQWN1RCxDQUFkLENBQWlCRixDQUFqQixDQUFvQjRuQixDQUFwQixFQUNBMDFCLFFBQVEzZ0QsSUFBUixDQUFjcUQsQ0FBZCxDQUFpQlcsQ0FBakIsQ0FBb0JpbkIsQ0FBcEIsRUFFQSxDQUVELENBRUQ7RUFFQSxLQUFLKzhCLFFBQUwsQ0FBZXJILE9BQWYsRUFDQSxLQUFLdUgsWUFBTCxDQUFtQixVQUFuQixDQUErQiwwQkFBQSxDQUE0QmxuQixRQUE1QixDQUFzQyxDQUF0QyxDQUEvQixFQUNBLEtBQUtrbkIsWUFBTCxDQUFtQixRQUFuQixDQUE2QiwwQkFBQSxDQUE0QjlILE9BQTVCLENBQXFDLENBQXJDLENBQTdCLEVBQ0EsS0FBSzhILFlBQUwsQ0FBbUIsSUFBbkIsQ0FBeUIsMEJBQUEsQ0FBNEI1SCxHQUE1QixDQUFpQyxDQUFqQyxDQUF6QixFQUVBLENBRUQyK0Msb0JBQW9CbGxHLFNBQXBCLENBQWdDRCxPQUFPaUIsTUFBUCxDQUFlK3NELGVBQWUvdEQsU0FBOUIsQ0FBaEMsQ0FDQWtsRyxvQkFBb0JsbEcsU0FBcEIsQ0FBOEJzQyxXQUE5QixDQUE0QzRpRyxtQkFBNUMsQ0FFQTs7O0tBS0EsV0FBYSxDQUVaQyxZQUFhLFNBQVdodkYsSUFBWCxDQUFpQml2RixXQUFqQixDQUE4QkMsR0FBOUIsQ0FBb0MsQ0FFaERBLElBQU1BLEtBQU8sQ0FBYixDQUVBLGFBQWVELGFBQWVBLFlBQVkzK0YsTUFBMUMsQ0FDQzYrRixTQUFXQyxTQUFXSCxZQUFhLENBQWIsRUFBbUJDLEdBQTlCLENBQW9DbHZGLEtBQUsxUCxNQURyRCxDQUVDKytGLFVBQVlDLFdBQVl0dkYsSUFBWixDQUFrQixDQUFsQixDQUFxQm12RixRQUFyQixDQUErQkQsR0FBL0IsQ0FBb0MsSUFBcEMsQ0FGYixDQUdDcGlDLFVBQVksRUFIYixDQUtBLEdBQUssQ0FBRXVpQyxTQUFQLENBQW1CLGdCQUFBLENBRW5CLFFBQUEsQ0FBVS8vRCxJQUFWLENBQWdCRSxJQUFoQixDQUFzQkMsSUFBdEIsQ0FBNEJ2c0IsQ0FBNUIsQ0FBK0J3USxDQUEvQixDQUFrQzY3RSxPQUFsQyxDQUVBLEdBQUtILFFBQUwsQ0FBZ0JDLFVBQVlHLGVBQWdCeHZGLElBQWhCLENBQXNCaXZGLFdBQXRCLENBQW1DSSxTQUFuQyxDQUE4Q0gsR0FBOUMsQ0FBWixDQUVoQjtFQUVBLEdBQUtsdkYsS0FBSzFQLE1BQUwsQ0FBYyxHQUFLNCtGLEdBQXhCLENBQThCLENBRTdCNy9ELEtBQU9HLEtBQU94dkIsS0FBTSxDQUFOLENBQWQsQ0FDQXN2QixLQUFPRyxLQUFPenZCLEtBQU0sQ0FBTixDQUFkLENBRUEsSUFBTSxNQUFRa3ZGLEdBQWQsQ0FBbUJ2K0YsRUFBSXcrRixRQUF2QixDQUFpQ3grRixHQUFLdStGLEdBQXRDLENBQTRDLENBRTNDaHNGLEVBQUlsRCxLQUFNclAsQ0FBTixDQUFKLENBQ0EraUIsRUFBSTFULEtBQU1yUCxFQUFJLENBQVYsQ0FBSixDQUNBLEdBQUt1UyxFQUFJbXNCLElBQVQsQ0FBZ0JBLEtBQU9uc0IsQ0FBUCxDQUNoQixHQUFLd1EsRUFBSTRiLElBQVQsQ0FBZ0JBLEtBQU81YixDQUFQLENBQ2hCLEdBQUt4USxFQUFJc3NCLElBQVQsQ0FBZ0JBLEtBQU90c0IsQ0FBUCxDQUNoQixHQUFLd1EsRUFBSStiLElBQVQsQ0FBZ0JBLEtBQU8vYixDQUFQLENBRWhCLENBRUQ7RUFFQTY3RSxRQUFVLzhGLEtBQUs4RSxHQUFMLENBQVVrNEIsS0FBT0gsSUFBakIsQ0FBdUJJLEtBQU9ILElBQTlCLENBQVYsQ0FDQWlnRSxRQUFVQSxVQUFZLENBQVosQ0FBZ0IsRUFBSUEsT0FBcEIsQ0FBOEIsQ0FBeEMsQ0FFQSxDQUVERSxhQUFjSixTQUFkLENBQXlCdmlDLFNBQXpCLENBQW9Db2lDLEdBQXBDLENBQXlDNy9ELElBQXpDLENBQStDQyxJQUEvQyxDQUFxRGlnRSxPQUFyRCxFQUVBLGdCQUFBLENBRUEsQ0E5Q1csQ0FBYixDQWtEQTtFQUVBLG1CQUFBLENBQXFCdnZGLElBQXJCLENBQTJCbTBCLEtBQTNCLENBQWtDRSxHQUFsQyxDQUF1QzY2RCxHQUF2QyxDQUE0Q1EsU0FBNUMsQ0FBd0QsQ0FFdkQsS0FBQSxDQUFPbHVGLElBQVAsQ0FFQSxHQUFLa3VGLFlBQWdCQyxXQUFZM3ZGLElBQVosQ0FBa0JtMEIsS0FBbEIsQ0FBeUJFLEdBQXpCLENBQThCNjZELEdBQTlCLEVBQXNDLENBQTNELENBQWlFLENBRWhFLElBQU12K0YsRUFBSXdqQyxLQUFWLENBQWlCeGpDLEVBQUkwakMsR0FBckIsQ0FBMEIxakMsR0FBS3UrRixHQUEvQixDQUFxQzF0RixLQUFPb3VGLFdBQVlqL0YsQ0FBWixDQUFlcVAsS0FBTXJQLENBQU4sQ0FBZixDQUEwQnFQLEtBQU1yUCxFQUFJLENBQVYsQ0FBMUIsQ0FBeUM2USxJQUF6QyxDQUFQLENBRXJDLENBSkQsSUFJTyxDQUVOLElBQU03USxFQUFJMGpDLElBQU02NkQsR0FBaEIsQ0FBcUJ2K0YsR0FBS3dqQyxLQUExQixDQUFpQ3hqQyxHQUFLdStGLEdBQXRDLENBQTRDMXRGLEtBQU9vdUYsV0FBWWovRixDQUFaLENBQWVxUCxLQUFNclAsQ0FBTixDQUFmLENBQTBCcVAsS0FBTXJQLEVBQUksQ0FBVixDQUExQixDQUF5QzZRLElBQXpDLENBQVAsQ0FFNUMsQ0FFRCxHQUFLQSxNQUFRdVcsT0FBUXZXLElBQVIsQ0FBY0EsS0FBS3RULElBQW5CLENBQWIsQ0FBeUMsQ0FFeEMyaEcsV0FBWXJ1RixJQUFaLEVBQ0FBLEtBQU9BLEtBQUt0VCxJQUFaLENBRUEsQ0FFRCxXQUFBLENBRUEsQ0FFRDtFQUVBLHFCQUFBLENBQXVCaW1DLEtBQXZCLENBQThCRSxHQUE5QixDQUFvQyxDQUVuQyxHQUFLLENBQUVGLEtBQVAsQ0FBZSxZQUFBLENBQ2YsR0FBSyxDQUFFRSxHQUFQLENBQWFBLElBQU1GLEtBQU4sQ0FFYixNQUFRQSxLQUFSLENBQWUyN0QsS0FBZixDQUVBLEVBQUcsQ0FFRkEsTUFBUSxLQUFSLENBRUEsR0FBSyxDQUFFdGhGLEVBQUV1aEYsT0FBSixHQUFpQmg0RSxPQUFRdkosQ0FBUixDQUFXQSxFQUFFdGdCLElBQWIsR0FBdUI4aEcsS0FBTXhoRixFQUFFemQsSUFBUixDQUFjeWQsQ0FBZCxDQUFpQkEsRUFBRXRnQixJQUFuQixJQUE4QixDQUF0RSxDQUFMLENBQWlGLENBRWhGMmhHLFdBQVlyaEYsQ0FBWixFQUNBQSxFQUFJNmxCLElBQU03bEIsRUFBRXpkLElBQVosQ0FDQSxHQUFLeWQsSUFBTUEsRUFBRXRnQixJQUFiLENBQW9CLE1BQ3BCNGhHLE1BQVEsSUFBUixDQUVBLENBUEQsSUFPTyxDQUVOdGhGLEVBQUlBLEVBQUV0Z0IsSUFBTixDQUVBLENBRUQsQ0FqQkQsTUFpQlU0aEcsT0FBU3RoRixJQUFNNmxCLEdBakJ6QixFQW1CQSxVQUFBLENBRUEsQ0FFRDtFQUVBLHFCQUFBLENBQXVCNDdELEdBQXZCLENBQTRCbmpDLFNBQTVCLENBQXVDb2lDLEdBQXZDLENBQTRDNy9ELElBQTVDLENBQWtEQyxJQUFsRCxDQUF3RGlnRSxPQUF4RCxDQUFpRVcsSUFBakUsQ0FBd0UsQ0FFdkUsR0FBSyxDQUFFRCxHQUFQLENBQWEsT0FFYjtFQUVBLEdBQUssQ0FBRUMsSUFBRixFQUFVWCxPQUFmLENBQXlCWSxXQUFZRixHQUFaLENBQWlCNWdFLElBQWpCLENBQXVCQyxJQUF2QixDQUE2QmlnRSxPQUE3QixFQUV6QixTQUFXVSxHQUFYLENBQWdCbC9GLElBQWhCLENBQXNCN0MsSUFBdEIsQ0FFQTtFQUVBLE1BQVEraEcsSUFBSWwvRixJQUFKLEdBQWFrL0YsSUFBSS9oRyxJQUF6QixDQUFnQyxDQUUvQjZDLEtBQU9rL0YsSUFBSWwvRixJQUFYLENBQ0E3QyxLQUFPK2hHLElBQUkvaEcsSUFBWCxDQUVBLEdBQUtxaEcsUUFBVWEsWUFBYUgsR0FBYixDQUFrQjVnRSxJQUFsQixDQUF3QkMsSUFBeEIsQ0FBOEJpZ0UsT0FBOUIsQ0FBVixDQUFvRGMsTUFBT0osR0FBUCxDQUF6RCxDQUF3RTtFQUd2RW5qQyxVQUFVaDlELElBQVYsQ0FBZ0JpQixLQUFLSixDQUFMLENBQVN1K0YsR0FBekIsRUFDQXBpQyxVQUFVaDlELElBQVYsQ0FBZ0JtZ0csSUFBSXQvRixDQUFKLENBQVF1K0YsR0FBeEIsRUFDQXBpQyxVQUFVaDlELElBQVYsQ0FBZ0I1QixLQUFLeUMsQ0FBTCxDQUFTdStGLEdBQXpCLEVBRUFXLFdBQVlJLEdBQVosRUFFQTtFQUNBQSxJQUFNL2hHLEtBQUtBLElBQVgsQ0FDQWlELEtBQU9qRCxLQUFLQSxJQUFaLENBRUEsU0FFQSxDQUVEK2hHLElBQU0vaEcsSUFBTixDQUVBO0VBRUEsR0FBSytoRyxNQUFROStGLElBQWIsQ0FBb0I7RUFJbkIsR0FBSyxDQUFFKytGLElBQVAsQ0FBYyxDQUViVCxhQUFjYSxhQUFjTCxHQUFkLENBQWQsQ0FBbUNuakMsU0FBbkMsQ0FBOENvaUMsR0FBOUMsQ0FBbUQ3L0QsSUFBbkQsQ0FBeURDLElBQXpELENBQStEaWdFLE9BQS9ELENBQXdFLENBQXhFLEVBRUE7RUFFQSxDQU5ELFFBTVlXLE9BQVMsQ0FBZCxDQUFrQixDQUV4QkQsSUFBTU0sdUJBQXdCTixHQUF4QixDQUE2Qm5qQyxTQUE3QixDQUF3Q29pQyxHQUF4QyxDQUFOLENBQ0FPLGFBQWNRLEdBQWQsQ0FBbUJuakMsU0FBbkIsQ0FBOEJvaUMsR0FBOUIsQ0FBbUM3L0QsSUFBbkMsQ0FBeUNDLElBQXpDLENBQStDaWdFLE9BQS9DLENBQXdELENBQXhELEVBRUQ7RUFFQyxDQVBNLFFBT0tXLE9BQVMsQ0FBZCxDQUFrQixDQUV4Qk0sWUFBYVAsR0FBYixDQUFrQm5qQyxTQUFsQixDQUE2Qm9pQyxHQUE3QixDQUFrQzcvRCxJQUFsQyxDQUF3Q0MsSUFBeEMsQ0FBOENpZ0UsT0FBOUMsRUFFQSxDQUVELE1BRUEsQ0FFRCxDQUVELENBRUQ7RUFFQSxjQUFBLENBQWdCVSxHQUFoQixDQUFzQixDQUVyQixNQUFRQSxJQUFJbC9GLElBQVosQ0FDQ29DLEVBQUk4OEYsR0FETCxDQUVDbjhGLEVBQUltOEYsSUFBSS9oRyxJQUZULENBSUEsR0FBSzhoRyxLQUFNMzhGLENBQU4sQ0FBU0YsQ0FBVCxDQUFZVyxDQUFaLEdBQW1CLENBQXhCLENBQTRCLFlBQUEsQ0FBYztFQUUxQztFQUNBLE1BQVFtOEYsSUFBSS9oRyxJQUFKLENBQVNBLElBQWpCLENBRUEsTUFBUXNnQixJQUFNeWhGLElBQUlsL0YsSUFBbEIsQ0FBeUIsQ0FFeEIsR0FBSzAvRixnQkFBaUJwOUYsRUFBRTZQLENBQW5CLENBQXNCN1AsRUFBRXFnQixDQUF4QixDQUEyQnZnQixFQUFFK1AsQ0FBN0IsQ0FBZ0MvUCxFQUFFdWdCLENBQWxDLENBQXFDNWYsRUFBRW9QLENBQXZDLENBQTBDcFAsRUFBRTRmLENBQTVDLENBQStDbEYsRUFBRXRMLENBQWpELENBQW9Ec0wsRUFBRWtGLENBQXRELEdBQTZEczhFLEtBQU14aEYsRUFBRXpkLElBQVIsQ0FBY3lkLENBQWQsQ0FBaUJBLEVBQUV0Z0IsSUFBbkIsR0FBNkIsQ0FBL0YsQ0FBbUcsQ0FFbEcsWUFBQSxDQUVBLENBRURzZ0IsRUFBSUEsRUFBRXRnQixJQUFOLENBRUEsQ0FFRCxXQUFBLENBRUEsQ0FFRCxvQkFBQSxDQUFzQitoRyxHQUF0QixDQUEyQjVnRSxJQUEzQixDQUFpQ0MsSUFBakMsQ0FBdUNpZ0UsT0FBdkMsQ0FBaUQsQ0FFaEQsTUFBUVUsSUFBSWwvRixJQUFaLENBQ0NvQyxFQUFJODhGLEdBREwsQ0FFQ244RixFQUFJbThGLElBQUkvaEcsSUFGVCxDQUlBLEdBQUs4aEcsS0FBTTM4RixDQUFOLENBQVNGLENBQVQsQ0FBWVcsQ0FBWixHQUFtQixDQUF4QixDQUE0QixZQUFBLENBQWM7RUFFMUM7RUFFQSxVQUFZVCxFQUFFNlAsQ0FBRixDQUFNL1AsRUFBRStQLENBQVIsQ0FBYzdQLEVBQUU2UCxDQUFGLENBQU1wUCxFQUFFb1AsQ0FBUixDQUFZN1AsRUFBRTZQLENBQWQsQ0FBa0JwUCxFQUFFb1AsQ0FBbEMsQ0FBMEMvUCxFQUFFK1AsQ0FBRixDQUFNcFAsRUFBRW9QLENBQVIsQ0FBWS9QLEVBQUUrUCxDQUFkLENBQWtCcFAsRUFBRW9QLENBQTFFLENBQ0N3dEYsTUFBUXI5RixFQUFFcWdCLENBQUYsQ0FBTXZnQixFQUFFdWdCLENBQVIsQ0FBY3JnQixFQUFFcWdCLENBQUYsQ0FBTTVmLEVBQUU0ZixDQUFSLENBQVlyZ0IsRUFBRXFnQixDQUFkLENBQWtCNWYsRUFBRTRmLENBQWxDLENBQTBDdmdCLEVBQUV1Z0IsQ0FBRixDQUFNNWYsRUFBRTRmLENBQVIsQ0FBWXZnQixFQUFFdWdCLENBQWQsQ0FBa0I1ZixFQUFFNGYsQ0FEdkUsQ0FFQ2k5RSxNQUFRdDlGLEVBQUU2UCxDQUFGLENBQU0vUCxFQUFFK1AsQ0FBUixDQUFjN1AsRUFBRTZQLENBQUYsQ0FBTXBQLEVBQUVvUCxDQUFSLENBQVk3UCxFQUFFNlAsQ0FBZCxDQUFrQnBQLEVBQUVvUCxDQUFsQyxDQUEwQy9QLEVBQUUrUCxDQUFGLENBQU1wUCxFQUFFb1AsQ0FBUixDQUFZL1AsRUFBRStQLENBQWQsQ0FBa0JwUCxFQUFFb1AsQ0FGdkUsQ0FHQzB0RixNQUFRdjlGLEVBQUVxZ0IsQ0FBRixDQUFNdmdCLEVBQUV1Z0IsQ0FBUixDQUFjcmdCLEVBQUVxZ0IsQ0FBRixDQUFNNWYsRUFBRTRmLENBQVIsQ0FBWXJnQixFQUFFcWdCLENBQWQsQ0FBa0I1ZixFQUFFNGYsQ0FBbEMsQ0FBMEN2Z0IsRUFBRXVnQixDQUFGLENBQU01ZixFQUFFNGYsQ0FBUixDQUFZdmdCLEVBQUV1Z0IsQ0FBZCxDQUFrQjVmLEVBQUU0ZixDQUh2RSxDQUtBO0VBRUEsU0FBV205RSxPQUFRQyxLQUFSLENBQWVKLEtBQWYsQ0FBc0JyaEUsSUFBdEIsQ0FBNEJDLElBQTVCLENBQWtDaWdFLE9BQWxDLENBQVgsQ0FDQzcvRCxLQUFPbWhFLE9BQVFGLEtBQVIsQ0FBZUMsS0FBZixDQUFzQnZoRSxJQUF0QixDQUE0QkMsSUFBNUIsQ0FBa0NpZ0UsT0FBbEMsQ0FEUixDQUdBO0VBRUEsTUFBUVUsSUFBSWMsS0FBWixDQUVBLE1BQVF2aUYsR0FBS0EsRUFBRStMLENBQUYsRUFBT21WLElBQXBCLENBQTJCLENBRTFCLEdBQUtsaEIsSUFBTXloRixJQUFJbC9GLElBQVYsRUFBa0J5ZCxJQUFNeWhGLElBQUkvaEcsSUFBNUIsRUFDSHVpRyxnQkFBaUJwOUYsRUFBRTZQLENBQW5CLENBQXNCN1AsRUFBRXFnQixDQUF4QixDQUEyQnZnQixFQUFFK1AsQ0FBN0IsQ0FBZ0MvUCxFQUFFdWdCLENBQWxDLENBQXFDNWYsRUFBRW9QLENBQXZDLENBQTBDcFAsRUFBRTRmLENBQTVDLENBQStDbEYsRUFBRXRMLENBQWpELENBQW9Ec0wsRUFBRWtGLENBQXRELENBREcsRUFFSHM4RSxLQUFNeGhGLEVBQUV6ZCxJQUFSLENBQWN5ZCxDQUFkLENBQWlCQSxFQUFFdGdCLElBQW5CLEdBQTZCLENBRi9CLENBRW1DLFlBQUEsQ0FDbkNzZ0IsRUFBSUEsRUFBRXVpRixLQUFOLENBRUEsQ0FFRDtFQUVBdmlGLEVBQUl5aEYsSUFBSWUsS0FBUixDQUVBLE1BQVF4aUYsR0FBS0EsRUFBRStMLENBQUYsRUFBT2dWLElBQXBCLENBQTJCLENBRTFCLEdBQUsvZ0IsSUFBTXloRixJQUFJbC9GLElBQVYsRUFBa0J5ZCxJQUFNeWhGLElBQUkvaEcsSUFBNUIsRUFDSHVpRyxnQkFBaUJwOUYsRUFBRTZQLENBQW5CLENBQXNCN1AsRUFBRXFnQixDQUF4QixDQUEyQnZnQixFQUFFK1AsQ0FBN0IsQ0FBZ0MvUCxFQUFFdWdCLENBQWxDLENBQXFDNWYsRUFBRW9QLENBQXZDLENBQTBDcFAsRUFBRTRmLENBQTVDLENBQStDbEYsRUFBRXRMLENBQWpELENBQW9Ec0wsRUFBRWtGLENBQXRELENBREcsRUFFSHM4RSxLQUFNeGhGLEVBQUV6ZCxJQUFSLENBQWN5ZCxDQUFkLENBQWlCQSxFQUFFdGdCLElBQW5CLEdBQTZCLENBRi9CLENBRW1DLFlBQUEsQ0FFbkNzZ0IsRUFBSUEsRUFBRXdpRixLQUFOLENBRUEsQ0FFRCxXQUFBLENBRUEsQ0FFRDtFQUVBLCtCQUFBLENBQWlDNzhELEtBQWpDLENBQXdDMjRCLFNBQXhDLENBQW1Eb2lDLEdBQW5ELENBQXlELENBRXhELE1BQVEvNkQsS0FBUixDQUVBLEVBQUcsQ0FFRixNQUFRM2xCLEVBQUV6ZCxJQUFWLENBQWdCb0MsRUFBSXFiLEVBQUV0Z0IsSUFBRixDQUFPQSxJQUEzQixDQUVBLEdBQUssQ0FBRTZwQixPQUFRMWtCLENBQVIsQ0FBV0YsQ0FBWCxDQUFGLEVBQW9CMHlELFdBQVl4eUQsQ0FBWixDQUFlbWIsQ0FBZixDQUFrQkEsRUFBRXRnQixJQUFwQixDQUEwQmlGLENBQTFCLENBQXBCLEVBQXFEODlGLGNBQWU1OUYsQ0FBZixDQUFrQkYsQ0FBbEIsQ0FBckQsRUFBOEU4OUYsY0FBZTk5RixDQUFmLENBQWtCRSxDQUFsQixDQUFuRixDQUEyRyxDQUUxR3k1RCxVQUFVaDlELElBQVYsQ0FBZ0J1RCxFQUFFMUMsQ0FBRixDQUFNdStGLEdBQXRCLEVBQ0FwaUMsVUFBVWg5RCxJQUFWLENBQWdCMGUsRUFBRTdkLENBQUYsQ0FBTXUrRixHQUF0QixFQUNBcGlDLFVBQVVoOUQsSUFBVixDQUFnQnFELEVBQUV4QyxDQUFGLENBQU11K0YsR0FBdEIsRUFFQTtFQUVBVyxXQUFZcmhGLENBQVosRUFDQXFoRixXQUFZcmhGLEVBQUV0Z0IsSUFBZCxFQUVBc2dCLEVBQUkybEIsTUFBUWhoQyxDQUFaLENBRUEsQ0FFRHFiLEVBQUlBLEVBQUV0Z0IsSUFBTixDQUVBLENBckJELE1BcUJVc2dCLElBQU0ybEIsS0FyQmhCLEVBdUJBLFFBQUEsQ0FFQSxDQUVEO0VBRUEsb0JBQUEsQ0FBc0JBLEtBQXRCLENBQTZCMjRCLFNBQTdCLENBQXdDb2lDLEdBQXhDLENBQTZDNy9ELElBQTdDLENBQW1EQyxJQUFuRCxDQUF5RGlnRSxPQUF6RCxDQUFtRTtFQUlsRSxNQUFRcDdELEtBQVIsQ0FFQSxFQUFHLENBRUYsTUFBUTlnQyxFQUFFbkYsSUFBRixDQUFPQSxJQUFmLENBRUEsTUFBUWlGLElBQU1FLEVBQUV0QyxJQUFoQixDQUF1QixDQUV0QixHQUFLc0MsRUFBRTFDLENBQUYsR0FBUXdDLEVBQUV4QyxDQUFWLEVBQWV1Z0csZ0JBQWlCNzlGLENBQWpCLENBQW9CRixDQUFwQixDQUFwQixDQUE4QztFQUk3QyxNQUFRZytGLGFBQWM5OUYsQ0FBZCxDQUFpQkYsQ0FBakIsQ0FBUixDQUVBO0VBRUFFLEVBQUlpOUYsYUFBY2o5RixDQUFkLENBQWlCQSxFQUFFbkYsSUFBbkIsQ0FBSixDQUNBNEYsRUFBSXc4RixhQUFjeDhGLENBQWQsQ0FBaUJBLEVBQUU1RixJQUFuQixDQUFKLENBRUE7RUFFQXVoRyxhQUFjcDhGLENBQWQsQ0FBaUJ5NUQsU0FBakIsQ0FBNEJvaUMsR0FBNUIsQ0FBaUM3L0QsSUFBakMsQ0FBdUNDLElBQXZDLENBQTZDaWdFLE9BQTdDLEVBQ0FFLGFBQWMzN0YsQ0FBZCxDQUFpQmc1RCxTQUFqQixDQUE0Qm9pQyxHQUE1QixDQUFpQzcvRCxJQUFqQyxDQUF1Q0MsSUFBdkMsQ0FBNkNpZ0UsT0FBN0MsRUFDQSxPQUVBLENBRURwOEYsRUFBSUEsRUFBRWpGLElBQU4sQ0FFQSxDQUVEbUYsRUFBSUEsRUFBRW5GLElBQU4sQ0FFQSxDQS9CRCxNQStCVW1GLElBQU04Z0MsS0EvQmhCLEVBaUNBLENBRUQ7RUFFQSx1QkFBQSxDQUF5Qm4wQixJQUF6QixDQUErQml2RixXQUEvQixDQUE0Q0ksU0FBNUMsQ0FBdURILEdBQXZELENBQTZELENBRTVELFVBQVksRUFBWixDQUFnQnYrRixDQUFoQixDQUFtQnV6QixHQUFuQixDQUF3QmlRLEtBQXhCLENBQStCRSxHQUEvQixDQUFvQ3FuQyxJQUFwQyxDQUVBLElBQU0vcUUsRUFBSSxDQUFKLENBQU91ekIsSUFBTStxRSxZQUFZMytGLE1BQS9CLENBQXVDSyxFQUFJdXpCLEdBQTNDLENBQWdEdnpCLEdBQWhELENBQXVELENBRXREd2pDLE1BQVE4NkQsWUFBYXQrRixDQUFiLEVBQW1CdStGLEdBQTNCLENBQ0E3NkQsSUFBTTFqQyxFQUFJdXpCLElBQU0sQ0FBVixDQUFjK3FFLFlBQWF0K0YsRUFBSSxDQUFqQixFQUF1QnUrRixHQUFyQyxDQUEyQ2x2RixLQUFLMVAsTUFBdEQsQ0FDQW9yRSxLQUFPNHpCLFdBQVl0dkYsSUFBWixDQUFrQm0wQixLQUFsQixDQUF5QkUsR0FBekIsQ0FBOEI2NkQsR0FBOUIsQ0FBbUMsS0FBbkMsQ0FBUCxDQUNBLEdBQUt4ekIsT0FBU0EsS0FBS3h0RSxJQUFuQixDQUEwQnd0RSxLQUFLcTBCLE9BQUwsQ0FBZSxJQUFmLENBQzFCbHdGLE1BQU0vUCxJQUFOLENBQVlzaEcsWUFBYTExQixJQUFiLENBQVosRUFFQSxDQUVENzdELE1BQU00ekMsSUFBTixDQUFZNDlDLFFBQVosRUFFQTtFQUVBLElBQU0xZ0csRUFBSSxDQUFWLENBQWFBLEVBQUlrUCxNQUFNdlAsTUFBdkIsQ0FBK0JLLEdBQS9CLENBQXNDLENBRXJDMmdHLGNBQWV6eEYsTUFBT2xQLENBQVAsQ0FBZixDQUEyQjArRixTQUEzQixFQUNBQSxVQUFZaUIsYUFBY2pCLFNBQWQsQ0FBeUJBLFVBQVVuaEcsSUFBbkMsQ0FBWixDQUVBLENBRUQsZ0JBQUEsQ0FFQSxDQUVELGlCQUFBLENBQW1CbUYsQ0FBbkIsQ0FBc0JGLENBQXRCLENBQTBCLENBRXpCLFNBQVMrUCxDQUFGLENBQU0vUCxFQUFFK1AsQ0FBZixDQUVBLENBRUQ7RUFFQSxzQkFBQSxDQUF3QnF1RixJQUF4QixDQUE4QmxDLFNBQTlCLENBQTBDLENBRXpDQSxVQUFZbUMsZUFBZ0JELElBQWhCLENBQXNCbEMsU0FBdEIsQ0FBWixDQUVBLEdBQUtBLFNBQUwsQ0FBaUIsQ0FFaEIsTUFBUThCLGFBQWM5QixTQUFkLENBQXlCa0MsSUFBekIsQ0FBUixDQUVBakIsYUFBY245RixDQUFkLENBQWlCQSxFQUFFakYsSUFBbkIsRUFFQSxDQUVELENBRUQ7RUFFQSx1QkFBQSxDQUF5QnFqRyxJQUF6QixDQUErQmxDLFNBQS9CLENBQTJDLENBRTFDLE1BQVFBLFNBQVIsQ0FDQ29DLEdBQUtGLEtBQUtydUYsQ0FEWCxDQUVDd3VGLEdBQUtILEtBQUs3OUUsQ0FGWCxDQUdDK1QsR0FBSyxDQUFFd0gsUUFIUixDQUlDOWIsQ0FKRCxDQU1BO0VBQ0E7RUFFQSxFQUFHLENBRUYsR0FBS3UrRSxJQUFNbGpGLEVBQUVrRixDQUFSLEVBQWFnK0UsSUFBTWxqRixFQUFFdGdCLElBQUYsQ0FBT3dsQixDQUExQixFQUErQmxGLEVBQUV0Z0IsSUFBRixDQUFPd2xCLENBQVAsR0FBYWxGLEVBQUVrRixDQUFuRCxDQUF1RCxDQUV0RCxNQUFRbEYsRUFBRXRMLENBQUYsQ0FBTSxDQUFFd3VGLEdBQUtsakYsRUFBRWtGLENBQVQsR0FBaUJsRixFQUFFdGdCLElBQUYsQ0FBT2dWLENBQVAsQ0FBV3NMLEVBQUV0TCxDQUE5QixHQUFzQ3NMLEVBQUV0Z0IsSUFBRixDQUFPd2xCLENBQVAsQ0FBV2xGLEVBQUVrRixDQUFuRCxDQUFkLENBRUEsR0FBS3hRLEdBQUt1dUYsRUFBTCxFQUFXdnVGLEVBQUl1a0IsRUFBcEIsQ0FBeUIsQ0FFeEJBLEdBQUt2a0IsQ0FBTCxDQUVBLEdBQUtBLElBQU11dUYsRUFBWCxDQUFnQixDQUVmLEdBQUtDLEtBQU9sakYsRUFBRWtGLENBQWQsQ0FBa0IsUUFBQSxDQUNsQixHQUFLZytFLEtBQU9sakYsRUFBRXRnQixJQUFGLENBQU93bEIsQ0FBbkIsQ0FBdUIsU0FBU3hsQixJQUFULENBRXZCLENBRURpbEIsRUFBSTNFLEVBQUV0TCxDQUFGLENBQU1zTCxFQUFFdGdCLElBQUYsQ0FBT2dWLENBQWIsQ0FBaUJzTCxDQUFqQixDQUFxQkEsRUFBRXRnQixJQUEzQixDQUVBLENBRUQsQ0FFRHNnQixFQUFJQSxFQUFFdGdCLElBQU4sQ0FFQSxDQXpCRCxNQXlCVXNnQixJQUFNNmdGLFNBekJoQixFQTJCQSxHQUFLLENBQUVsOEUsQ0FBUCxDQUFXLFdBQUEsQ0FFWCxHQUFLcytFLEtBQU9ocUUsRUFBWixDQUFpQixTQUFTMTJCLElBQVQsQ0FBZTtFQUVoQztFQUNBO0VBQ0E7RUFFQSxTQUFXb2lCLENBQVgsQ0FDQ3crRSxHQUFLeCtFLEVBQUVqUSxDQURSLENBRUMwdUYsR0FBS3orRSxFQUFFTyxDQUZSLENBR0NtK0UsT0FBUzVpRSxRQUhWLENBSUN1bkQsR0FKRCxDQU1BaG9FLEVBQUkyRSxFQUFFamxCLElBQU4sQ0FFQSxNQUFRc2dCLElBQU1yZCxJQUFkLENBQXFCLENBRXBCLEdBQUtzZ0csSUFBTWpqRixFQUFFdEwsQ0FBUixFQUFhc0wsRUFBRXRMLENBQUYsRUFBT3l1RixFQUFwQixFQUEwQkYsS0FBT2pqRixFQUFFdEwsQ0FBbkMsRUFDRHV0RixnQkFBaUJpQixHQUFLRSxFQUFMLENBQVVILEVBQVYsQ0FBZWhxRSxFQUFoQyxDQUFvQ2lxRSxFQUFwQyxDQUF3Q0MsRUFBeEMsQ0FBNENDLEVBQTVDLENBQWdERixHQUFLRSxFQUFMLENBQVVucUUsRUFBVixDQUFlZ3FFLEVBQS9ELENBQW1FQyxFQUFuRSxDQUF1RWxqRixFQUFFdEwsQ0FBekUsQ0FBNEVzTCxFQUFFa0YsQ0FBOUUsQ0FESixDQUN3RixDQUV2RjhpRSxJQUFNaGtGLEtBQUt5a0IsR0FBTCxDQUFVeTZFLEdBQUtsakYsRUFBRWtGLENBQWpCLEdBQXlCKzlFLEdBQUtqakYsRUFBRXRMLENBQWhDLENBQU4sQ0FBMkM7RUFFM0MsR0FBSyxDQUFFc3pFLElBQU1xYixNQUFOLEVBQWtCcmIsTUFBUXFiLE1BQVIsRUFBa0JyakYsRUFBRXRMLENBQUYsQ0FBTWlRLEVBQUVqUSxDQUE5QyxHQUF1RCt0RixjQUFlemlGLENBQWYsQ0FBa0IraUYsSUFBbEIsQ0FBNUQsQ0FBdUYsQ0FFdEZwK0UsRUFBSTNFLENBQUosQ0FDQXFqRixPQUFTcmIsR0FBVCxDQUVBLENBRUQsQ0FFRGhvRSxFQUFJQSxFQUFFdGdCLElBQU4sQ0FFQSxDQUVELFFBQUEsQ0FFQSxDQUVEO0VBRUEsbUJBQUEsQ0FBcUJpbUMsS0FBckIsQ0FBNEI5RSxJQUE1QixDQUFrQ0MsSUFBbEMsQ0FBd0NpZ0UsT0FBeEMsQ0FBa0QsQ0FFakQsTUFBUXA3RCxLQUFSLENBRUEsRUFBRyxDQUVGLEdBQUszbEIsRUFBRStMLENBQUYsR0FBUSxJQUFiLENBQW9CL0wsRUFBRStMLENBQUYsQ0FBTXMyRSxPQUFRcmlGLEVBQUV0TCxDQUFWLENBQWFzTCxFQUFFa0YsQ0FBZixDQUFrQjJiLElBQWxCLENBQXdCQyxJQUF4QixDQUE4QmlnRSxPQUE5QixDQUFOLENBQ3BCL2dGLEVBQUV3aUYsS0FBRixDQUFVeGlGLEVBQUV6ZCxJQUFaLENBQ0F5ZCxFQUFFdWlGLEtBQUYsQ0FBVXZpRixFQUFFdGdCLElBQVosQ0FDQXNnQixFQUFJQSxFQUFFdGdCLElBQU4sQ0FFQSxDQVBELE1BT1VzZ0IsSUFBTTJsQixLQVBoQixFQVNBM2xCLEVBQUV3aUYsS0FBRixDQUFRRCxLQUFSLENBQWdCLElBQWhCLENBQ0F2aUYsRUFBRXdpRixLQUFGLENBQVUsSUFBVixDQUVBYyxXQUFZdGpGLENBQVosRUFFQSxDQUVEO0VBQ0E7RUFFQSxtQkFBQSxDQUFxQmt0RCxJQUFyQixDQUE0QixDQUUzQixLQUFBLENBQU9sdEQsQ0FBUCxDQUFVc04sQ0FBVixDQUFheHBCLENBQWIsQ0FBZ0J5L0YsSUFBaEIsQ0FBc0JDLFNBQXRCLENBQWlDQyxLQUFqQyxDQUF3Q0MsS0FBeEMsQ0FBK0NDLE9BQVMsQ0FBeEQsQ0FFQSxFQUFHLENBRUYzakYsRUFBSWt0RCxJQUFKLENBQ0FBLEtBQU8sSUFBUCxDQUNBcTJCLEtBQU8sSUFBUCxDQUNBQyxVQUFZLENBQVosQ0FFQSxNQUFReGpGLENBQVIsQ0FBWSxDQUVYd2pGLFlBQ0FsMkUsRUFBSXROLENBQUosQ0FDQXlqRixNQUFRLENBQVIsQ0FFQSxJQUFNdGhHLEVBQUksQ0FBVixDQUFhQSxFQUFJd2hHLE1BQWpCLENBQXlCeGhHLEdBQXpCLENBQWdDLENBRS9Cc2hHLFFBQ0FuMkUsRUFBSUEsRUFBRWkxRSxLQUFOLENBQ0EsR0FBSyxDQUFFajFFLENBQVAsQ0FBVyxNQUVYLENBRURvMkUsTUFBUUMsTUFBUixDQUVBLE1BQVFGLE1BQVEsQ0FBUixFQUFlQyxNQUFRLENBQVIsRUFBYXAyRSxDQUFwQyxDQUEwQyxDQUV6QyxHQUFLbTJFLFFBQVUsQ0FBVixHQUFpQkMsUUFBVSxDQUFWLEVBQWUsQ0FBRXAyRSxDQUFqQixFQUFzQnROLEVBQUUrTCxDQUFGLEVBQU91QixFQUFFdkIsQ0FBaEQsQ0FBTCxDQUEyRCxDQUUxRGpvQixFQUFJa2MsQ0FBSixDQUNBQSxFQUFJQSxFQUFFdWlGLEtBQU4sQ0FDQWtCLFFBRUEsQ0FORCxJQU1PLENBRU4zL0YsRUFBSXdwQixDQUFKLENBQ0FBLEVBQUlBLEVBQUVpMUUsS0FBTixDQUNBbUIsUUFFQSxDQUVELEdBQUtILElBQUwsQ0FBWUEsS0FBS2hCLEtBQUwsQ0FBYXorRixDQUFiLENBQVosVUFDWUEsQ0FBUCxDQUVMQSxFQUFFMCtGLEtBQUYsQ0FBVWUsSUFBVixDQUNBQSxLQUFPei9GLENBQVAsQ0FFQSxDQUVEa2MsRUFBSXNOLENBQUosQ0FFQSxDQUVEaTJFLEtBQUtoQixLQUFMLENBQWEsSUFBYixDQUNBb0IsUUFBVSxDQUFWLENBRUEsQ0F0REQsTUFzRFVILFVBQVksQ0F0RHRCLEVBd0RBLFdBQUEsQ0FFQSxDQUVEO0VBRUEsZUFBQSxDQUFpQjl1RixDQUFqQixDQUFvQndRLENBQXBCLENBQXVCMmIsSUFBdkIsQ0FBNkJDLElBQTdCLENBQW1DaWdFLE9BQW5DLENBQTZDO0VBSTVDcnNGLEVBQUksT0FBVUEsRUFBSW1zQixJQUFkLEVBQXVCa2dFLE9BQTNCLENBQ0E3N0UsRUFBSSxPQUFVQSxFQUFJNGIsSUFBZCxFQUF1QmlnRSxPQUEzQixDQUVBcnNGLEVBQUksQ0FBRUEsRUFBTUEsR0FBSyxDQUFiLEVBQXFCLFVBQXpCLENBQ0FBLEVBQUksQ0FBRUEsRUFBTUEsR0FBSyxDQUFiLEVBQXFCLFVBQXpCLENBQ0FBLEVBQUksQ0FBRUEsRUFBTUEsR0FBSyxDQUFiLEVBQXFCLFVBQXpCLENBQ0FBLEVBQUksQ0FBRUEsRUFBTUEsR0FBSyxDQUFiLEVBQXFCLFVBQXpCLENBRUF3USxFQUFJLENBQUVBLEVBQU1BLEdBQUssQ0FBYixFQUFxQixVQUF6QixDQUNBQSxFQUFJLENBQUVBLEVBQU1BLEdBQUssQ0FBYixFQUFxQixVQUF6QixDQUNBQSxFQUFJLENBQUVBLEVBQU1BLEdBQUssQ0FBYixFQUFxQixVQUF6QixDQUNBQSxFQUFJLENBQUVBLEVBQU1BLEdBQUssQ0FBYixFQUFxQixVQUF6QixDQUVBLFNBQWFBLEdBQUssQ0FBbEIsQ0FFQSxDQUVEO0VBRUEsb0JBQUEsQ0FBc0J5Z0IsS0FBdEIsQ0FBOEIsQ0FFN0IsTUFBUUEsS0FBUixDQUFlaStELFNBQVdqK0QsS0FBMUIsQ0FFQSxFQUFHLENBRUYsR0FBSzNsQixFQUFFdEwsQ0FBRixDQUFNa3ZGLFNBQVNsdkYsQ0FBcEIsQ0FBd0JrdkYsU0FBVzVqRixDQUFYLENBQ3hCQSxFQUFJQSxFQUFFdGdCLElBQU4sQ0FFQSxDQUxELE1BS1VzZ0IsSUFBTTJsQixLQUxoQixFQU9BLGVBQUEsQ0FFQSxDQUVEO0VBRUEsd0JBQUEsQ0FBMEJ6TCxFQUExQixDQUE4QkwsRUFBOUIsQ0FBa0NJLEVBQWxDLENBQXNDRixFQUF0QyxDQUEwQzJCLEVBQTFDLENBQThDQyxFQUE5QyxDQUFrRDN4QixFQUFsRCxDQUFzRDY1RixFQUF0RCxDQUEyRCxDQUUxRCxPQUFPLENBQUVub0UsR0FBSzF4QixFQUFQLEdBQWdCNnZCLEdBQUtncUUsRUFBckIsRUFBNEIsQ0FBRTNwRSxHQUFLbHdCLEVBQVAsR0FBZ0IyeEIsR0FBS2tvRSxFQUFyQixDQUE1QixFQUF5RCxDQUF6RCxFQUNOLENBQUUzcEUsR0FBS2x3QixFQUFQLEdBQWdCK3ZCLEdBQUs4cEUsRUFBckIsRUFBNEIsQ0FBRTVwRSxHQUFLandCLEVBQVAsR0FBZ0I2dkIsR0FBS2dxRSxFQUFyQixDQUE1QixFQUF5RCxDQURuRCxFQUVOLENBQUU1cEUsR0FBS2p3QixFQUFQLEdBQWdCMnhCLEdBQUtrb0UsRUFBckIsRUFBNEIsQ0FBRW5vRSxHQUFLMXhCLEVBQVAsR0FBZ0IrdkIsR0FBSzhwRSxFQUFyQixDQUE1QixFQUF5RCxDQUYxRCxDQUlBLENBRUQ7RUFFQSx3QkFBQSxDQUEwQmgvRixDQUExQixDQUE2QkYsQ0FBN0IsQ0FBaUMsQ0FFaEMsU0FBU2pGLElBQUYsQ0FBT3lDLENBQVAsR0FBYXdDLEVBQUV4QyxDQUFmLEVBQW9CMEMsRUFBRXRDLElBQUYsQ0FBT0osQ0FBUCxHQUFhd0MsRUFBRXhDLENBQW5DLEVBQXdDLENBQUUyaEcsa0JBQW1Cai9GLENBQW5CLENBQXNCRixDQUF0QixDQUExQyxFQUNOODlGLGNBQWU1OUYsQ0FBZixDQUFrQkYsQ0FBbEIsQ0FETSxFQUNtQjg5RixjQUFlOTlGLENBQWYsQ0FBa0JFLENBQWxCLENBRG5CLEVBQzRDay9GLGFBQWNsL0YsQ0FBZCxDQUFpQkYsQ0FBakIsQ0FEbkQsQ0FHQSxDQUVEO0VBRUEsYUFBQSxDQUFlcWIsQ0FBZixDQUFrQnNOLENBQWxCLENBQXFCMVUsQ0FBckIsQ0FBeUIsQ0FFeEIsT0FBTyxDQUFFMFUsRUFBRXBJLENBQUYsQ0FBTWxGLEVBQUVrRixDQUFWLEdBQWtCdE0sRUFBRWxFLENBQUYsQ0FBTTRZLEVBQUU1WSxDQUExQixFQUFnQyxDQUFFNFksRUFBRTVZLENBQUYsQ0FBTXNMLEVBQUV0TCxDQUFWLEdBQWtCa0UsRUFBRXNNLENBQUYsQ0FBTW9JLEVBQUVwSSxDQUExQixDQUF2QyxDQUVBLENBRUQ7RUFFQSxlQUFBLENBQWlCMmUsRUFBakIsQ0FBcUJDLEVBQXJCLENBQTBCLENBRXpCLFVBQVVwdkIsQ0FBSCxHQUFTb3ZCLEdBQUdwdkIsQ0FBWixFQUFpQm12QixHQUFHM2UsQ0FBSCxHQUFTNGUsR0FBRzVlLENBQXBDLENBRUEsQ0FFRDtFQUVBLG1CQUFBLENBQXFCMmUsRUFBckIsQ0FBeUJ1WSxFQUF6QixDQUE2QnRZLEVBQTdCLENBQWlDa2dFLEVBQWpDLENBQXNDLENBRXJDLEdBQU96NkUsT0FBUXNhLEVBQVIsQ0FBWXVZLEVBQVosR0FBb0I3eUIsT0FBUXVhLEVBQVIsQ0FBWWtnRSxFQUFaLENBQXRCLEVBQ0R6NkUsT0FBUXNhLEVBQVIsQ0FBWW1nRSxFQUFaLEdBQW9CejZFLE9BQVF1YSxFQUFSLENBQVlzWSxFQUFaLENBRHhCLENBQzZDLFdBQUEsQ0FFN0MsWUFBYXZZLEVBQU4sQ0FBVXVZLEVBQVYsQ0FBY3RZLEVBQWQsRUFBcUIsQ0FBckIsR0FBMkIwOUQsS0FBTTM5RCxFQUFOLENBQVV1WSxFQUFWLENBQWM0bkQsRUFBZCxFQUFxQixDQUFoRCxFQUNIeEMsS0FBTTE5RCxFQUFOLENBQVVrZ0UsRUFBVixDQUFjbmdFLEVBQWQsRUFBcUIsQ0FBckIsR0FBMkIyOUQsS0FBTTE5RCxFQUFOLENBQVVrZ0UsRUFBVixDQUFjNW5ELEVBQWQsRUFBcUIsQ0FEcEQsQ0FHQSxDQUVEO0VBRUEsMEJBQUEsQ0FBNEJ2M0MsQ0FBNUIsQ0FBK0JGLENBQS9CLENBQW1DLENBRWxDLE1BQVFFLENBQVIsQ0FFQSxFQUFHLENBRUYsR0FBS21iLEVBQUU3ZCxDQUFGLEdBQVEwQyxFQUFFMUMsQ0FBVixFQUFlNmQsRUFBRXRnQixJQUFGLENBQU95QyxDQUFQLEdBQWEwQyxFQUFFMUMsQ0FBOUIsRUFBbUM2ZCxFQUFFN2QsQ0FBRixHQUFRd0MsRUFBRXhDLENBQTdDLEVBQWtENmQsRUFBRXRnQixJQUFGLENBQU95QyxDQUFQLEdBQWF3QyxFQUFFeEMsQ0FBakUsRUFDRGsxRCxXQUFZcjNDLENBQVosQ0FBZUEsRUFBRXRnQixJQUFqQixDQUF1Qm1GLENBQXZCLENBQTBCRixDQUExQixDQURKLENBQ29DLENBRW5DLFdBQUEsQ0FFQSxDQUVEcWIsRUFBSUEsRUFBRXRnQixJQUFOLENBRUEsQ0FYRCxNQVdVc2dCLElBQU1uYixDQVhoQixFQWFBLFlBQUEsQ0FFQSxDQUVEO0VBRUEsc0JBQUEsQ0FBd0JBLENBQXhCLENBQTJCRixDQUEzQixDQUErQixDQUU5QixZQUFhRSxFQUFFdEMsSUFBUixDQUFjc0MsQ0FBZCxDQUFpQkEsRUFBRW5GLElBQW5CLEVBQTRCLENBQTVCLENBQ044aEcsS0FBTTM4RixDQUFOLENBQVNGLENBQVQsQ0FBWUUsRUFBRW5GLElBQWQsR0FBd0IsQ0FBeEIsRUFBNkI4aEcsS0FBTTM4RixDQUFOLENBQVNBLEVBQUV0QyxJQUFYLENBQWlCb0MsQ0FBakIsR0FBd0IsQ0FEL0MsQ0FFTjY4RixLQUFNMzhGLENBQU4sQ0FBU0YsQ0FBVCxDQUFZRSxFQUFFdEMsSUFBZCxFQUF1QixDQUF2QixFQUE0QmkvRixLQUFNMzhGLENBQU4sQ0FBU0EsRUFBRW5GLElBQVgsQ0FBaUJpRixDQUFqQixFQUF1QixDQUZwRCxDQUlBLENBRUQ7RUFFQSxxQkFBQSxDQUF1QkUsQ0FBdkIsQ0FBMEJGLENBQTFCLENBQThCLENBRTdCLE1BQVFFLENBQVIsQ0FDQ28vRixPQUFTLEtBRFYsQ0FFQ2o2RixHQUFLLENBQUVuRixFQUFFNlAsQ0FBRixDQUFNL1AsRUFBRStQLENBQVYsRUFBZ0IsQ0FGdEIsQ0FHQ212RixHQUFLLENBQUVoL0YsRUFBRXFnQixDQUFGLENBQU12Z0IsRUFBRXVnQixDQUFWLEVBQWdCLENBSHRCLENBS0EsRUFBRyxDQUVGLEdBQVNsRixFQUFFa0YsQ0FBRixDQUFNMitFLEVBQVIsR0FBbUI3akYsRUFBRXRnQixJQUFGLENBQU93bEIsQ0FBUCxDQUFXMitFLEVBQWhDLEVBQTBDN2pGLEVBQUV0Z0IsSUFBRixDQUFPd2xCLENBQVAsR0FBYWxGLEVBQUVrRixDQUF6RCxFQUNDbGIsR0FBSyxDQUFFZ1csRUFBRXRnQixJQUFGLENBQU9nVixDQUFQLENBQVdzTCxFQUFFdEwsQ0FBZixHQUF1Qm12RixHQUFLN2pGLEVBQUVrRixDQUE5QixHQUFzQ2xGLEVBQUV0Z0IsSUFBRixDQUFPd2xCLENBQVAsQ0FBV2xGLEVBQUVrRixDQUFuRCxFQUF5RGxGLEVBQUV0TCxDQUR0RSxDQUM0RSxDQUUzRXV2RixPQUFTLENBQUVBLE1BQVgsQ0FFQSxDQUVEamtGLEVBQUlBLEVBQUV0Z0IsSUFBTixDQUVBLENBWEQsTUFXVXNnQixJQUFNbmIsQ0FYaEIsRUFhQSxhQUFBLENBRUEsQ0FFRDtFQUNBO0VBRUEscUJBQUEsQ0FBdUJBLENBQXZCLENBQTBCRixDQUExQixDQUE4QixDQUU3QixPQUFTLFFBQUEsQ0FBVUUsRUFBRTFDLENBQVosQ0FBZTBDLEVBQUU2UCxDQUFqQixDQUFvQjdQLEVBQUVxZ0IsQ0FBdEIsQ0FBVCxDQUNDRixHQUFLLFFBQUEsQ0FBVXJnQixFQUFFeEMsQ0FBWixDQUFld0MsRUFBRStQLENBQWpCLENBQW9CL1AsRUFBRXVnQixDQUF0QixDQUROLENBRUNnL0UsR0FBS3IvRixFQUFFbkYsSUFGUixDQUdDeWtHLEdBQUt4L0YsRUFBRXBDLElBSFIsQ0FLQXNDLEVBQUVuRixJQUFGLENBQVNpRixDQUFULENBQ0FBLEVBQUVwQyxJQUFGLENBQVNzQyxDQUFULENBRUFpZ0IsR0FBR3BsQixJQUFILENBQVV3a0csRUFBVixDQUNBQSxHQUFHM2hHLElBQUgsQ0FBVXVpQixFQUFWLENBRUFFLEdBQUd0bEIsSUFBSCxDQUFVb2xCLEVBQVYsQ0FDQUEsR0FBR3ZpQixJQUFILENBQVV5aUIsRUFBVixDQUVBbS9FLEdBQUd6a0csSUFBSCxDQUFVc2xCLEVBQVYsQ0FDQUEsR0FBR3ppQixJQUFILENBQVU0aEcsRUFBVixDQUVBLFNBQUEsQ0FFQSxDQUVEO0VBRUEsbUJBQUEsQ0FBcUJoaUcsQ0FBckIsQ0FBd0J1UyxDQUF4QixDQUEyQndRLENBQTNCLENBQThCbFMsSUFBOUIsQ0FBcUMsQ0FFcEMsTUFBUSxRQUFBLENBQVU3USxDQUFWLENBQWF1UyxDQUFiLENBQWdCd1EsQ0FBaEIsQ0FBUixDQUVBLEdBQUssQ0FBRWxTLElBQVAsQ0FBYyxDQUViZ04sRUFBRXpkLElBQUYsQ0FBU3lkLENBQVQsQ0FDQUEsRUFBRXRnQixJQUFGLENBQVNzZ0IsQ0FBVCxDQUVBLENBTEQsSUFLTyxDQUVOQSxFQUFFdGdCLElBQUYsQ0FBU3NULEtBQUt0VCxJQUFkLENBQ0FzZ0IsRUFBRXpkLElBQUYsQ0FBU3lRLElBQVQsQ0FDQUEsS0FBS3RULElBQUwsQ0FBVTZDLElBQVYsQ0FBaUJ5ZCxDQUFqQixDQUNBaE4sS0FBS3RULElBQUwsQ0FBWXNnQixDQUFaLENBRUEsQ0FFRCxRQUFBLENBRUEsQ0FFRCxtQkFBQSxDQUFxQkEsQ0FBckIsQ0FBeUIsQ0FFeEJBLEVBQUV0Z0IsSUFBRixDQUFPNkMsSUFBUCxDQUFjeWQsRUFBRXpkLElBQWhCLENBQ0F5ZCxFQUFFemQsSUFBRixDQUFPN0MsSUFBUCxDQUFjc2dCLEVBQUV0Z0IsSUFBaEIsQ0FFQSxHQUFLc2dCLEVBQUV3aUYsS0FBUCxDQUFleGlGLEVBQUV3aUYsS0FBRixDQUFRRCxLQUFSLENBQWdCdmlGLEVBQUV1aUYsS0FBbEIsQ0FDZixHQUFLdmlGLEVBQUV1aUYsS0FBUCxDQUFldmlGLEVBQUV1aUYsS0FBRixDQUFRQyxLQUFSLENBQWdCeGlGLEVBQUV3aUYsS0FBbEIsQ0FFZixDQUVELGFBQUEsQ0FBZXJnRyxDQUFmLENBQWtCdVMsQ0FBbEIsQ0FBcUJ3USxDQUFyQixDQUF5QjtFQUd4QixLQUFLL2lCLENBQUwsQ0FBU0EsQ0FBVCxDQUVBO0VBQ0EsS0FBS3VTLENBQUwsQ0FBU0EsQ0FBVCxDQUNBLEtBQUt3USxDQUFMLENBQVNBLENBQVQsQ0FFQTtFQUNBLEtBQUszaUIsSUFBTCxDQUFZLElBQVosQ0FDQSxLQUFLN0MsSUFBTCxDQUFZLElBQVosQ0FFQTtFQUNBLEtBQUtxc0IsQ0FBTCxDQUFTLElBQVQsQ0FFQTtFQUNBLEtBQUt5MkUsS0FBTCxDQUFhLElBQWIsQ0FDQSxLQUFLRCxLQUFMLENBQWEsSUFBYixDQUVBO0VBQ0EsS0FBS2hCLE9BQUwsQ0FBZSxLQUFmLENBRUEsQ0FFRCxtQkFBQSxDQUFxQi92RixJQUFyQixDQUEyQm0wQixLQUEzQixDQUFrQ0UsR0FBbEMsQ0FBdUM2NkQsR0FBdkMsQ0FBNkMsQ0FFNUMsUUFBVSxDQUFWLENBRUEsSUFBTSxNQUFRLzZELEtBQVIsQ0FBZTVuQixFQUFJOG5CLElBQU02NkQsR0FBL0IsQ0FBb0N2K0YsRUFBSTBqQyxHQUF4QyxDQUE2QzFqQyxHQUFLdStGLEdBQWxELENBQXdELENBRXZEMEQsS0FBTyxDQUFFNXlGLEtBQU11TSxDQUFOLEVBQVl2TSxLQUFNclAsQ0FBTixDQUFkLEdBQThCcVAsS0FBTXJQLEVBQUksQ0FBVixFQUFnQnFQLEtBQU11TSxFQUFJLENBQVYsQ0FBOUMsQ0FBUCxDQUNBQSxFQUFJNWIsQ0FBSixDQUVBLENBRUQsVUFBQSxDQUVBLENBRUQ7O0tBSUEsZUFBaUI7RUFJaEJxL0YsS0FBTSxTQUFXNkMsT0FBWCxDQUFxQixDQUUxQixNQUFRQSxRQUFRdmlHLE1BQWhCLENBQ0EsTUFBUSxHQUFSLENBRUEsSUFBTSxNQUFRNGlCLEVBQUksQ0FBWixDQUFlNEksRUFBSSxDQUF6QixDQUE0QkEsRUFBSTVJLENBQWhDLENBQW1DMUUsRUFBSXNOLEdBQXZDLENBQThDLENBRTdDem9CLEdBQUt3L0YsUUFBU3JrRixDQUFULEVBQWF0TCxDQUFiLENBQWlCMnZGLFFBQVMvMkUsQ0FBVCxFQUFhcEksQ0FBOUIsQ0FBa0NtL0UsUUFBUy8yRSxDQUFULEVBQWE1WSxDQUFiLENBQWlCMnZGLFFBQVNya0YsQ0FBVCxFQUFha0YsQ0FBckUsQ0FFQSxDQUVELFNBQVcsR0FBWCxDQUVBLENBakJlLENBbUJoQm8vRSxZQUFhLFNBQVdDLEdBQVgsQ0FBaUIsQ0FFN0Isa0JBQWtCL0MsSUFBWCxDQUFpQitDLEdBQWpCLEVBQXlCLENBQWhDLENBRUEsQ0F2QmUsQ0F5QmhCQyxpQkFBa0IsU0FBV0gsT0FBWCxDQUFvQkksS0FBcEIsQ0FBNEIsQ0FFN0MsYUFBZSxFQUFmLENBQW1CO0VBQ25CLGdCQUFrQixFQUFsQixDQUFzQjtFQUN0QixVQUFZLEVBQVosQ0FBZ0I7RUFFaEJDLGdCQUFpQkwsT0FBakIsRUFDQU0sV0FBWXJpRSxRQUFaLENBQXNCK2hFLE9BQXRCLEVBRUE7RUFFQSxjQUFnQkEsUUFBUXZpRyxNQUF4QixDQUVBMmlHLE1BQU0zbUcsT0FBTixDQUFlNG1HLGVBQWYsRUFFQSxJQUFNLE1BQVEsQ0FBZCxDQUFpQnZpRyxFQUFJc2lHLE1BQU0zaUcsTUFBM0IsQ0FBbUNLLEdBQW5DLENBQTBDLENBRXpDcytGLFlBQVluL0YsSUFBWixDQUFrQnNqRyxTQUFsQixFQUNBQSxXQUFhSCxNQUFPdGlHLENBQVAsRUFBV0wsTUFBeEIsQ0FDQTZpRyxXQUFZcmlFLFFBQVosQ0FBc0JtaUUsTUFBT3RpRyxDQUFQLENBQXRCLEVBRUEsQ0FFRDtFQUVBLGNBQWdCMGlHLE9BQU9yRSxXQUFQLENBQW9CbCtELFFBQXBCLENBQThCbStELFdBQTlCLENBQWhCLENBRUE7RUFFQSxJQUFNLE1BQVEsQ0FBZCxDQUFpQnQrRixFQUFJbThELFVBQVV4OEQsTUFBL0IsQ0FBdUNLLEdBQUssQ0FBNUMsQ0FBZ0QsQ0FFL0MrOUMsTUFBTTUrQyxJQUFOLENBQVlnOUQsVUFBVTU3RCxLQUFWLENBQWlCUCxDQUFqQixDQUFvQkEsRUFBSSxDQUF4QixDQUFaLEVBRUEsQ0FFRCxZQUFBLENBRUEsQ0E5RGUsQ0FBakIsQ0FrRUEsd0JBQUEsQ0FBMEJrL0IsTUFBMUIsQ0FBbUMsQ0FFbEMsTUFBUUEsT0FBT3YvQixNQUFmLENBRUEsR0FBSzhDLEVBQUksQ0FBSixFQUFTeThCLE9BQVF6OEIsRUFBSSxDQUFaLEVBQWdCMmtCLE1BQWhCLENBQXdCOFgsT0FBUSxDQUFSLENBQXhCLENBQWQsQ0FBc0QsQ0FFckRBLE9BQU90L0IsR0FBUCxHQUVBLENBRUQsQ0FFRCxtQkFBQSxDQUFxQnVnQyxRQUFyQixDQUErQitoRSxPQUEvQixDQUF5QyxDQUV4QyxJQUFNLE1BQVEsQ0FBZCxDQUFpQmxpRyxFQUFJa2lHLFFBQVF2aUcsTUFBN0IsQ0FBcUNLLEdBQXJDLENBQTRDLENBRTNDbWdDLFNBQVNoaEMsSUFBVCxDQUFlK2lHLFFBQVNsaUcsQ0FBVCxFQUFhdVMsQ0FBNUIsRUFDQTR0QixTQUFTaGhDLElBQVQsQ0FBZStpRyxRQUFTbGlHLENBQVQsRUFBYStpQixDQUE1QixFQUVBLENBRUQsQ0FFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQXlCQSx3QkFBQSxDQUEwQjQ0QixNQUExQixDQUFrQ3ZlLE9BQWxDLENBQTRDLENBRTNDMGhCLFNBQVNsa0QsSUFBVCxDQUFlLElBQWYsRUFFQSxLQUFLRCxJQUFMLENBQVksaUJBQVosQ0FFQSxLQUFLb2hELFVBQUwsQ0FBa0IsQ0FDakJKLE9BQVFBLE1BRFMsQ0FFakJ2ZSxRQUFTQSxPQUZRLENBQWxCLENBS0EsS0FBSytoQixrQkFBTCxDQUF5Qix5QkFBQSxDQUEyQnhELE1BQTNCLENBQW1DdmUsT0FBbkMsQ0FBekIsRUFDQSxLQUFLZ2xCLGFBQUwsR0FFQSxDQUVEdWdELGdCQUFnQnpwRyxTQUFoQixDQUE0QkQsT0FBT2lCLE1BQVAsQ0FBZTRrRCxTQUFTNWxELFNBQXhCLENBQTVCLENBQ0F5cEcsZ0JBQWdCenBHLFNBQWhCLENBQTBCc0MsV0FBMUIsQ0FBd0NtbkcsZUFBeEMsQ0FFQTtFQUVBLDhCQUFBLENBQWdDaG5ELE1BQWhDLENBQXdDdmUsT0FBeEMsQ0FBa0QsQ0FFakQ2cEIsZUFBZXJzRCxJQUFmLENBQXFCLElBQXJCLEVBRUEsS0FBS0QsSUFBTCxDQUFZLHVCQUFaLENBRUEsS0FBS29oRCxVQUFMLENBQWtCLENBQ2pCSixPQUFRQSxNQURTLENBRWpCdmUsUUFBU0EsT0FGUSxDQUFsQixDQUtBdWUsT0FBUzd1QyxNQUFNeU0sT0FBTixDQUFlb2lDLE1BQWYsRUFBMEJBLE1BQTFCLENBQW1DLENBQUVBLE1BQUYsQ0FBNUMsQ0FFQSxVQUFZLElBQVosQ0FFQSxrQkFBb0IsRUFBcEIsQ0FDQSxZQUFjLEVBQWQsQ0FFQSxJQUFNLE1BQVEsQ0FBUixDQUFXbDVDLEVBQUlrNUMsT0FBT2g4QyxNQUE1QixDQUFvQ0ssRUFBSXlDLENBQXhDLENBQTJDekMsR0FBM0MsQ0FBa0QsQ0FFakQsVUFBWTI3QyxPQUFRMzdDLENBQVIsQ0FBWixDQUNBNGlHLFNBQVU1bUQsS0FBVixDQUFpQjVlLE9BQWpCLEVBRUEsQ0FFRDtFQUVBLEtBQUtpcUIsWUFBTCxDQUFtQixVQUFuQixDQUErQiwwQkFBQSxDQUE0Qnc3QyxhQUE1QixDQUEyQyxDQUEzQyxDQUEvQixFQUNBLEtBQUt4N0MsWUFBTCxDQUFtQixJQUFuQixDQUF5QiwwQkFBQSxDQUE0QnFuQyxPQUE1QixDQUFxQyxDQUFyQyxDQUF6QixFQUVBLEtBQUtudUMsb0JBQUwsR0FFQTtFQUVBLGlCQUFBLENBQW1CdkUsS0FBbkIsQ0FBMkIsQ0FFMUIsZ0JBQWtCLEVBQWxCLENBRUE7RUFFQSxrQkFBb0I1ZSxRQUFRMGxFLGFBQVIsR0FBMEJ4a0csU0FBMUIsQ0FBc0M4K0IsUUFBUTBsRSxhQUE5QyxDQUE4RCxFQUFsRixDQUNBLFVBQVkxbEUsUUFBUTJsRSxLQUFSLEdBQWtCemtHLFNBQWxCLENBQThCOCtCLFFBQVEybEUsS0FBdEMsQ0FBOEMsQ0FBMUQsQ0FDQSxXQUFhM2xFLFFBQVE0bEUsTUFBUixHQUFtQjFrRyxTQUFuQixDQUErQjgrQixRQUFRNGxFLE1BQXZDLENBQWdELEdBQTdELENBRUEsaUJBQW1CNWxFLFFBQVE2bEUsWUFBUixHQUF5QjNrRyxTQUF6QixDQUFxQzgrQixRQUFRNmxFLFlBQTdDLENBQTRELElBQS9FLENBQ0EsbUJBQXFCN2xFLFFBQVE4bEUsY0FBUixHQUEyQjVrRyxTQUEzQixDQUF1QzgrQixRQUFROGxFLGNBQS9DLENBQWdFLENBQXJGLENBQ0EsY0FBZ0I5bEUsUUFBUStsRSxTQUFSLEdBQXNCN2tHLFNBQXRCLENBQWtDOCtCLFFBQVErbEUsU0FBMUMsQ0FBc0RELGVBQWlCLENBQXZGLENBQ0Esa0JBQW9COWxFLFFBQVFnbUUsYUFBUixHQUEwQjlrRyxTQUExQixDQUFzQzgrQixRQUFRZ21FLGFBQTlDLENBQThELENBQWxGLENBRUEsZ0JBQWtCaG1FLFFBQVFpbUUsV0FBMUIsQ0FFQSxVQUFZam1FLFFBQVFrbUUsV0FBUixHQUF3QmhsRyxTQUF4QixDQUFvQzgrQixRQUFRa21FLFdBQTVDLENBQTBEQyxnQkFBdEUsQ0FFQTtFQUVBLGNBQUEsQ0FBZ0JDLGNBQWdCLEtBQWhDLENBQ0EsY0FBQSxDQUFnQkMsUUFBaEIsQ0FBMEJyckUsTUFBMUIsQ0FBa0NzckUsU0FBbEMsQ0FFQSxHQUFLTCxXQUFMLENBQW1CLENBRWxCTSxXQUFhTixZQUFZTyxlQUFaLENBQTZCYixLQUE3QixDQUFiLENBRUFTLGNBQWdCLElBQWhCLENBQ0FQLGFBQWUsS0FBZixDQUFzQjtFQUV0QjtFQUVBO0VBRUFZLFdBQWFSLFlBQVl0RyxtQkFBWixDQUFpQ2dHLEtBQWpDLENBQXdDLEtBQXhDLENBQWIsQ0FFQTtFQUVBVSxTQUFXLFdBQUEsRUFBWCxDQUNBcnJFLE9BQVMsV0FBQSxFQUFULENBQ0FzckUsVUFBWSxXQUFBLEVBQVosQ0FFQSxDQUVEO0VBRUEsR0FBSyxDQUFFVCxZQUFQLENBQXNCLENBRXJCRyxjQUFnQixDQUFoQixDQUNBRixlQUFpQixDQUFqQixDQUNBQyxVQUFZLENBQVosQ0FFQSxDQUVEO0VBRUEsU0FBQSxDQUFXbnhFLENBQVgsQ0FBYzh4RSxFQUFkLENBQWtCO0VBRWxCLGdCQUFrQjluRCxNQUFNK25ELGFBQU4sQ0FBcUJqQixhQUFyQixDQUFsQixDQUVBLGFBQWVrQixZQUFZaG9ELEtBQTNCLENBQ0EsVUFBWWdvRCxZQUFZMUIsS0FBeEIsQ0FFQSxZQUFjLENBQUUyQixXQUFXOUIsV0FBWCxDQUF3QmhpRSxRQUF4QixDQUFoQixDQUVBLEdBQUt6Z0MsT0FBTCxDQUFlLENBRWR5Z0MsU0FBV0EsU0FBU3pnQyxPQUFULEVBQVgsQ0FFQTtFQUVBLElBQU1zeUIsRUFBSSxDQUFKLENBQU84eEUsR0FBS3hCLE1BQU0zaUcsTUFBeEIsQ0FBZ0NxeUIsRUFBSTh4RSxFQUFwQyxDQUF3Qzl4RSxHQUF4QyxDQUErQyxDQUU5Q2t5RSxNQUFRNUIsTUFBT3R3RSxDQUFQLENBQVIsQ0FFQSxHQUFLaXlFLFdBQVc5QixXQUFYLENBQXdCK0IsS0FBeEIsQ0FBTCxDQUF1QyxDQUV0QzVCLE1BQU90d0UsQ0FBUCxFQUFha3lFLE1BQU14a0csT0FBTixFQUFiLENBRUEsQ0FFRCxDQUVELENBR0QsVUFBWXVrRyxXQUFXNUIsZ0JBQVgsQ0FBNkJsaUUsUUFBN0IsQ0FBdUNtaUUsS0FBdkMsQ0FBWixDQUVBLGNBRUEsWUFBY25pRSxRQUFkLENBQXdCO0VBRXhCLElBQU1uTyxFQUFJLENBQUosQ0FBTzh4RSxHQUFLeEIsTUFBTTNpRyxNQUF4QixDQUFnQ3F5QixFQUFJOHhFLEVBQXBDLENBQXdDOXhFLEdBQXhDLENBQStDLENBRTlDa3lFLE1BQVE1QixNQUFPdHdFLENBQVAsQ0FBUixDQUVBbU8sU0FBV0EsU0FBU3g0QixNQUFULENBQWlCdThGLEtBQWpCLENBQVgsQ0FFQSxDQUdELGlCQUFBLENBQW1CQyxFQUFuQixDQUF1QnJNLEdBQXZCLENBQTRCdjRELElBQTVCLENBQW1DLENBRWxDLEdBQUssQ0FBRXU0RCxHQUFQLENBQWE3aUYsUUFBUU0sS0FBUixDQUFlLDJDQUFmLEVBRWIsV0FBV29QLEtBQUosR0FBWVcsY0FBWixDQUE0QmlhLElBQTVCLEVBQW1DMWEsR0FBbkMsQ0FBd0NzL0UsRUFBeEMsQ0FBUCxDQUVBLENBRUQsS0FBQSxDQUFPQyxFQUFQLENBQVdwaEYsQ0FBWCxDQUFjNEcsQ0FBZCxDQUNDeTZFLElBREQsQ0FDT0MsS0FBT25rRSxTQUFTeGdDLE1BRHZCLENBRUNxL0MsSUFGRCxDQUVPdWxELEtBQU94bUQsTUFBTXArQyxNQUZwQixDQUtBO0VBR0Esb0JBQUEsQ0FBc0I2a0csSUFBdEIsQ0FBNEJDLE1BQTVCLENBQW9DQyxNQUFwQyxDQUE2QztFQUc1QztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBRUEsYUFBQSxDQUFlQyxTQUFmLENBQTBCQyxTQUExQixDQUFxQztFQUVyQztFQUNBO0VBRUEsYUFBZUosS0FBS2p5RixDQUFMLENBQVNreUYsT0FBT2x5RixDQUEvQixDQUNDc3lGLFNBQVdMLEtBQUt6aEYsQ0FBTCxDQUFTMGhGLE9BQU8xaEYsQ0FENUIsQ0FFQSxhQUFlMmhGLE9BQU9ueUYsQ0FBUCxDQUFXaXlGLEtBQUtqeUYsQ0FBL0IsQ0FDQ3V5RixTQUFXSixPQUFPM2hGLENBQVAsQ0FBV3loRixLQUFLemhGLENBRDVCLENBR0EsaUJBQXFCZ2lGLFNBQVdBLFFBQVgsQ0FBc0JGLFNBQVdBLFFBQXRELENBRUE7RUFDQSxlQUFtQkUsU0FBV0QsUUFBWCxDQUFzQkQsU0FBV0csUUFBcEQsQ0FFQSxHQUFLbmpHLEtBQUt5a0IsR0FBTCxDQUFVMitFLFVBQVYsRUFBeUIza0YsT0FBT0MsT0FBckMsQ0FBK0M7RUFJOUM7RUFFQSxlQUFpQjFlLEtBQUt1a0IsSUFBTCxDQUFXOCtFLFlBQVgsQ0FBakIsQ0FDQSxlQUFpQnJqRyxLQUFLdWtCLElBQUwsQ0FBVzQrRSxTQUFXQSxRQUFYLENBQXNCRixTQUFXQSxRQUE1QyxDQUFqQixDQUVBO0VBRUEsa0JBQXNCTCxPQUFPbHlGLENBQVAsQ0FBV3N5RixTQUFXTSxVQUE1QyxDQUNBLGtCQUFzQlYsT0FBTzFoRixDQUFQLENBQVdnaUYsU0FBV0ksVUFBNUMsQ0FFQSxrQkFBc0JULE9BQU9ueUYsQ0FBUCxDQUFXdXlGLFNBQVdNLFVBQTVDLENBQ0Esa0JBQXNCVixPQUFPM2hGLENBQVAsQ0FBV2lpRixTQUFXSSxVQUE1QyxDQUVBO0VBRUEsT0FBUyxDQUFFLENBQUVDLGNBQWdCQyxhQUFsQixFQUFvQ1IsUUFBcEMsQ0FDVCxDQUFFUyxjQUFnQkMsYUFBbEIsRUFBb0NSLFFBRDdCLEdBRU5ELFNBQVdELFFBQVgsQ0FBc0JELFNBQVdHLFFBRjNCLENBQVQsQ0FJQTtFQUVBUyxVQUFjSCxjQUFnQlAsU0FBV1csRUFBM0IsQ0FBZ0NsQixLQUFLanlGLENBQW5ELENBQ0FveUYsVUFBY2EsY0FBZ0JYLFNBQVdhLEVBQTNCLENBQWdDbEIsS0FBS3poRixDQUFuRCxDQUVBO0VBQ0E7RUFDQSxrQkFBc0IwaUYsVUFBWUEsU0FBWixDQUF3QmQsVUFBWUEsU0FBMUQsQ0FDQSxHQUFLZ0IsZUFBaUIsQ0FBdEIsQ0FBMEIsQ0FFekIsa0JBQU8sQ0FBYUYsU0FBYixDQUF3QmQsU0FBeEIsQ0FBUCxDQUVBLENBSkQsSUFJTyxDQUVOQyxVQUFZL2lHLEtBQUt1a0IsSUFBTCxDQUFXdS9FLGNBQWdCLENBQTNCLENBQVosQ0FFQSxDQUVELENBekNELElBeUNPO0VBSU4saUJBQW1CLEtBQW5CLENBQTBCO0VBQzFCLEdBQUtaLFNBQVd6a0YsT0FBT0MsT0FBdkIsQ0FBaUMsQ0FFaEMsR0FBS3lrRixTQUFXMWtGLE9BQU9DLE9BQXZCLENBQWlDLENBRWhDcWxGLGFBQWUsSUFBZixDQUVBLENBRUQsQ0FSRCxJQVFPLENBRU4sR0FBS2IsU0FBVyxDQUFFemtGLE9BQU9DLE9BQXpCLENBQW1DLENBRWxDLEdBQUt5a0YsU0FBVyxDQUFFMWtGLE9BQU9DLE9BQXpCLENBQW1DLENBRWxDcWxGLGFBQWUsSUFBZixDQUVBLENBRUQsQ0FSRCxJQVFPLENBRU4sR0FBSy9qRyxLQUFLOGUsSUFBTCxDQUFXa2tGLFFBQVgsSUFBMEJoakcsS0FBSzhlLElBQUwsQ0FBV21rRixRQUFYLENBQS9CLENBQXVELENBRXREYyxhQUFlLElBQWYsQ0FFQSxDQUVELENBRUQsQ0FFRCxHQUFLQSxZQUFMLENBQW9CO0VBR25CSCxVQUFZLENBQUVaLFFBQWQsQ0FDQUYsVUFBWUksUUFBWixDQUNBSCxVQUFZL2lHLEtBQUt1a0IsSUFBTCxDQUFXOCtFLFlBQVgsQ0FBWixDQUVBLENBUEQsSUFPTztFQUdOTyxVQUFZVixRQUFaLENBQ0FKLFVBQVlFLFFBQVosQ0FDQUQsVUFBWS9pRyxLQUFLdWtCLElBQUwsQ0FBVzgrRSxhQUFlLENBQTFCLENBQVosQ0FFQSxDQUVELENBRUQsa0JBQU8sQ0FBYU8sVUFBWWIsU0FBekIsQ0FBb0NELFVBQVlDLFNBQWhELENBQVAsQ0FFQSxDQUdELHFCQUF1QixFQUF2QixDQUVBLElBQU0sTUFBUSxDQUFSLENBQVd4bEUsR0FBSzhpRSxRQUFRdmlHLE1BQXhCLENBQWdDaWMsRUFBSXdqQixHQUFLLENBQXpDLENBQTRDdGpCLEVBQUk5YixFQUFJLENBQTFELENBQTZEQSxFQUFJby9CLEVBQWpFLENBQXFFcC9CLElBQU00YixHQUFOLENBQVlFLEdBQWpGLENBQXdGLENBRXZGLEdBQUtGLElBQU13akIsRUFBWCxDQUFnQnhqQixFQUFJLENBQUosQ0FDaEIsR0FBS0UsSUFBTXNqQixFQUFYLENBQWdCdGpCLEVBQUksQ0FBSixDQUVoQjtFQUNBO0VBRUErcEYsaUJBQWtCN2xHLENBQWxCLEVBQXdCOGxHLFlBQWE1RCxRQUFTbGlHLENBQVQsQ0FBYixDQUEyQmtpRyxRQUFTdG1GLENBQVQsQ0FBM0IsQ0FBeUNzbUYsUUFBU3BtRixDQUFULENBQXpDLENBQXhCLENBRUEsQ0FFRCxtQkFBcUIsRUFBckIsQ0FDQ2lxRixnQkFERCxDQUNtQkMsa0JBQW9CSCxpQkFBaUJsK0YsTUFBakIsRUFEdkMsQ0FHQSxJQUFNcXFCLEVBQUksQ0FBSixDQUFPOHhFLEdBQUt4QixNQUFNM2lHLE1BQXhCLENBQWdDcXlCLEVBQUk4eEUsRUFBcEMsQ0FBd0M5eEUsR0FBeEMsQ0FBK0MsQ0FFOUNreUUsTUFBUTVCLE1BQU90d0UsQ0FBUCxDQUFSLENBRUErekUsaUJBQW1CLEVBQW5CLENBRUEsSUFBTS9sRyxFQUFJLENBQUosQ0FBT28vQixHQUFLOGtFLE1BQU12a0csTUFBbEIsQ0FBMEJpYyxFQUFJd2pCLEdBQUssQ0FBbkMsQ0FBc0N0akIsRUFBSTliLEVBQUksQ0FBcEQsQ0FBdURBLEVBQUlvL0IsRUFBM0QsQ0FBK0RwL0IsSUFBTTRiLEdBQU4sQ0FBWUUsR0FBM0UsQ0FBa0YsQ0FFakYsR0FBS0YsSUFBTXdqQixFQUFYLENBQWdCeGpCLEVBQUksQ0FBSixDQUNoQixHQUFLRSxJQUFNc2pCLEVBQVgsQ0FBZ0J0akIsRUFBSSxDQUFKLENBRWhCO0VBQ0FpcUYsaUJBQWtCL2xHLENBQWxCLEVBQXdCOGxHLFlBQWE1QixNQUFPbGtHLENBQVAsQ0FBYixDQUF5QmtrRyxNQUFPdG9GLENBQVAsQ0FBekIsQ0FBcUNzb0YsTUFBT3BvRixDQUFQLENBQXJDLENBQXhCLENBRUEsQ0FFRG1xRixlQUFlOW1HLElBQWYsQ0FBcUI0bUcsZ0JBQXJCLEVBQ0FDLGtCQUFvQkEsa0JBQWtCcitGLE1BQWxCLENBQTBCbytGLGdCQUExQixDQUFwQixDQUVBLENBR0Q7RUFFQSxJQUFNdmpHLEVBQUksQ0FBVixDQUFhQSxFQUFJNGdHLGFBQWpCLENBQWdDNWdHLEdBQWhDLENBQXVDO0VBSXRDd2dCLEVBQUl4Z0IsRUFBSTRnRyxhQUFSLENBQ0F4NUUsRUFBSXM1RSxlQUFpQnJoRyxLQUFLaW1CLEdBQUwsQ0FBVTlFLEVBQUluaEIsS0FBSytmLEVBQVQsQ0FBYyxDQUF4QixDQUFyQixDQUNBd2lGLEdBQUtqQixVQUFZdGhHLEtBQUtrbUIsR0FBTCxDQUFVL0UsRUFBSW5oQixLQUFLK2YsRUFBVCxDQUFjLENBQXhCLENBQWpCLENBRUE7RUFFQSxJQUFNNWhCLEVBQUksQ0FBSixDQUFPby9CLEdBQUs4aUUsUUFBUXZpRyxNQUExQixDQUFrQ0ssRUFBSW8vQixFQUF0QyxDQUEwQ3AvQixHQUExQyxDQUFpRCxDQUVoRHFrRyxLQUFPNkIsU0FBVWhFLFFBQVNsaUcsQ0FBVCxDQUFWLENBQXdCNmxHLGlCQUFrQjdsRyxDQUFsQixDQUF4QixDQUErQ29rRyxFQUEvQyxDQUFQLENBRUEveEYsRUFBR2d5RixLQUFLOXhGLENBQVIsQ0FBVzh4RixLQUFLdGhGLENBQWhCLENBQW1CLENBQUU2RyxDQUFyQixFQUVBLENBRUQ7RUFFQSxJQUFNb0ksRUFBSSxDQUFKLENBQU84eEUsR0FBS3hCLE1BQU0zaUcsTUFBeEIsQ0FBZ0NxeUIsRUFBSTh4RSxFQUFwQyxDQUF3Qzl4RSxHQUF4QyxDQUErQyxDQUU5Q2t5RSxNQUFRNUIsTUFBT3R3RSxDQUFQLENBQVIsQ0FDQSt6RSxpQkFBbUJFLGVBQWdCajBFLENBQWhCLENBQW5CLENBRUEsSUFBTWh5QixFQUFJLENBQUosQ0FBT28vQixHQUFLOGtFLE1BQU12a0csTUFBeEIsQ0FBZ0NLLEVBQUlvL0IsRUFBcEMsQ0FBd0NwL0IsR0FBeEMsQ0FBK0MsQ0FFOUNxa0csS0FBTzZCLFNBQVVoQyxNQUFPbGtHLENBQVAsQ0FBVixDQUFzQitsRyxpQkFBa0IvbEcsQ0FBbEIsQ0FBdEIsQ0FBNkNva0csRUFBN0MsQ0FBUCxDQUVBL3hGLEVBQUdneUYsS0FBSzl4RixDQUFSLENBQVc4eEYsS0FBS3RoRixDQUFoQixDQUFtQixDQUFFNkcsQ0FBckIsRUFFQSxDQUVELENBRUQsQ0FFRHc2RSxHQUFLakIsU0FBTCxDQUVBO0VBRUEsSUFBTW5qRyxFQUFJLENBQVYsQ0FBYUEsRUFBSXNrRyxJQUFqQixDQUF1QnRrRyxHQUF2QixDQUE4QixDQUU3QnFrRyxLQUFPcEIsYUFBZWlELFNBQVUvbEUsU0FBVW5nQyxDQUFWLENBQVYsQ0FBeUJnbUcsa0JBQW1CaG1HLENBQW5CLENBQXpCLENBQWlEb2tHLEVBQWpELENBQWYsQ0FBdUVqa0UsU0FBVW5nQyxDQUFWLENBQTlFLENBRUEsR0FBSyxDQUFFd2pHLGFBQVAsQ0FBdUIsQ0FFdEJueEYsRUFBR2d5RixLQUFLOXhGLENBQVIsQ0FBVzh4RixLQUFLdGhGLENBQWhCLENBQW1CLENBQW5CLEVBRUEsQ0FKRCxJQUlPO0VBSU5xVixPQUFPeFQsSUFBUCxDQUFhaS9FLFdBQVd0a0QsT0FBWCxDQUFvQixDQUFwQixDQUFiLEVBQXVDajZCLGNBQXZDLENBQXVEKytFLEtBQUs5eEYsQ0FBNUQsRUFDQWt4RixTQUFTNytFLElBQVQsQ0FBZWkvRSxXQUFXaEgsU0FBWCxDQUFzQixDQUF0QixDQUFmLEVBQTJDdjNFLGNBQTNDLENBQTJEKytFLEtBQUt0aEYsQ0FBaEUsRUFFQTJnRixVQUFVOStFLElBQVYsQ0FBZ0IrK0UsV0FBWSxDQUFaLENBQWhCLEVBQWtDOStFLEdBQWxDLENBQXVDdVQsTUFBdkMsRUFBZ0R2VCxHQUFoRCxDQUFxRDQrRSxRQUFyRCxFQUVBcHhGLEVBQUdxeEYsVUFBVW54RixDQUFiLENBQWdCbXhGLFVBQVUzZ0YsQ0FBMUIsQ0FBNkIyZ0YsVUFBVTk1RSxDQUF2QyxFQUVBLENBRUQsQ0FFRDtFQUNBO0VBRUEsS0FBQSxDQUVBLElBQU1ybkIsRUFBSSxDQUFWLENBQWFBLEdBQUt3Z0csS0FBbEIsQ0FBeUJ4Z0csR0FBekIsQ0FBZ0MsQ0FFL0IsSUFBTXZDLEVBQUksQ0FBVixDQUFhQSxFQUFJc2tHLElBQWpCLENBQXVCdGtHLEdBQXZCLENBQThCLENBRTdCcWtHLEtBQU9wQixhQUFlaUQsU0FBVS9sRSxTQUFVbmdDLENBQVYsQ0FBVixDQUF5QmdtRyxrQkFBbUJobUcsQ0FBbkIsQ0FBekIsQ0FBaURva0csRUFBakQsQ0FBZixDQUF1RWprRSxTQUFVbmdDLENBQVYsQ0FBOUUsQ0FFQSxHQUFLLENBQUV3akcsYUFBUCxDQUF1QixDQUV0Qm54RixFQUFHZ3lGLEtBQUs5eEYsQ0FBUixDQUFXOHhGLEtBQUt0aEYsQ0FBaEIsQ0FBbUJpZ0YsT0FBU0QsS0FBVCxDQUFpQnhnRyxDQUFwQyxFQUVBLENBSkQsSUFJTztFQUlONjFCLE9BQU94VCxJQUFQLENBQWFpL0UsV0FBV3RrRCxPQUFYLENBQW9CaDlDLENBQXBCLENBQWIsRUFBdUMraUIsY0FBdkMsQ0FBdUQrK0UsS0FBSzl4RixDQUE1RCxFQUNBa3hGLFNBQVM3K0UsSUFBVCxDQUFlaS9FLFdBQVdoSCxTQUFYLENBQXNCdDZGLENBQXRCLENBQWYsRUFBMkMraUIsY0FBM0MsQ0FBMkQrK0UsS0FBS3RoRixDQUFoRSxFQUVBMmdGLFVBQVU5K0UsSUFBVixDQUFnQisrRSxXQUFZcGhHLENBQVosQ0FBaEIsRUFBa0NzaUIsR0FBbEMsQ0FBdUN1VCxNQUF2QyxFQUFnRHZULEdBQWhELENBQXFENCtFLFFBQXJELEVBRUFweEYsRUFBR3F4RixVQUFVbnhGLENBQWIsQ0FBZ0JteEYsVUFBVTNnRixDQUExQixDQUE2QjJnRixVQUFVOTVFLENBQXZDLEVBRUEsQ0FFRCxDQUVELENBR0Q7RUFFQTtFQUNBLElBQU1wbkIsRUFBSTRnRyxjQUFnQixDQUExQixDQUE2QjVnRyxHQUFLLENBQWxDLENBQXFDQSxHQUFyQyxDQUE0QyxDQUUzQ3dnQixFQUFJeGdCLEVBQUk0Z0csYUFBUixDQUNBeDVFLEVBQUlzNUUsZUFBaUJyaEcsS0FBS2ltQixHQUFMLENBQVU5RSxFQUFJbmhCLEtBQUsrZixFQUFULENBQWMsQ0FBeEIsQ0FBckIsQ0FDQXdpRixHQUFLakIsVUFBWXRoRyxLQUFLa21CLEdBQUwsQ0FBVS9FLEVBQUluaEIsS0FBSytmLEVBQVQsQ0FBYyxDQUF4QixDQUFqQixDQUVBO0VBRUEsSUFBTTVoQixFQUFJLENBQUosQ0FBT28vQixHQUFLOGlFLFFBQVF2aUcsTUFBMUIsQ0FBa0NLLEVBQUlvL0IsRUFBdEMsQ0FBMENwL0IsR0FBMUMsQ0FBaUQsQ0FFaERxa0csS0FBTzZCLFNBQVVoRSxRQUFTbGlHLENBQVQsQ0FBVixDQUF3QjZsRyxpQkFBa0I3bEcsQ0FBbEIsQ0FBeEIsQ0FBK0Nva0csRUFBL0MsQ0FBUCxDQUNBL3hGLEVBQUdneUYsS0FBSzl4RixDQUFSLENBQVc4eEYsS0FBS3RoRixDQUFoQixDQUFtQmlnRixPQUFTcDVFLENBQTVCLEVBRUEsQ0FFRDtFQUVBLElBQU1vSSxFQUFJLENBQUosQ0FBTzh4RSxHQUFLeEIsTUFBTTNpRyxNQUF4QixDQUFnQ3F5QixFQUFJOHhFLEVBQXBDLENBQXdDOXhFLEdBQXhDLENBQStDLENBRTlDa3lFLE1BQVE1QixNQUFPdHdFLENBQVAsQ0FBUixDQUNBK3pFLGlCQUFtQkUsZUFBZ0JqMEUsQ0FBaEIsQ0FBbkIsQ0FFQSxJQUFNaHlCLEVBQUksQ0FBSixDQUFPby9CLEdBQUs4a0UsTUFBTXZrRyxNQUF4QixDQUFnQ0ssRUFBSW8vQixFQUFwQyxDQUF3Q3AvQixHQUF4QyxDQUErQyxDQUU5Q3FrRyxLQUFPNkIsU0FBVWhDLE1BQU9sa0csQ0FBUCxDQUFWLENBQXNCK2xHLGlCQUFrQi9sRyxDQUFsQixDQUF0QixDQUE2Q29rRyxFQUE3QyxDQUFQLENBRUEsR0FBSyxDQUFFWixhQUFQLENBQXVCLENBRXRCbnhGLEVBQUdneUYsS0FBSzl4RixDQUFSLENBQVc4eEYsS0FBS3RoRixDQUFoQixDQUFtQmlnRixPQUFTcDVFLENBQTVCLEVBRUEsQ0FKRCxJQUlPLENBRU52WCxFQUFHZ3lGLEtBQUs5eEYsQ0FBUixDQUFXOHhGLEtBQUt0aEYsQ0FBTCxDQUFTNGdGLFdBQVlaLE1BQVEsQ0FBcEIsRUFBd0JoZ0YsQ0FBNUMsQ0FBK0M0Z0YsV0FBWVosTUFBUSxDQUFwQixFQUF3Qnh3RixDQUF4QixDQUE0QnFYLENBQTNFLEVBRUEsQ0FFRCxDQUVELENBRUQsQ0FFRDtFQUlBdThFLGdCQUVBO0VBRUFDLGlCQUdBO0VBRUEsc0JBQUEsRUFBeUIsQ0FFeEIsVUFBWXZELGNBQWNsakcsTUFBZCxDQUF1QixDQUFuQyxDQUVBLEdBQUtzakcsWUFBTCxDQUFvQixDQUVuQixVQUFZLENBQVosQ0FBZTtFQUNmLFdBQWFxQixLQUFPMWIsS0FBcEIsQ0FFQTtFQUVBLElBQU01b0YsRUFBSSxDQUFWLENBQWFBLEVBQUl1a0csSUFBakIsQ0FBdUJ2a0csR0FBdkIsQ0FBOEIsQ0FFN0JnL0MsS0FBT2pCLE1BQU8vOUMsQ0FBUCxDQUFQLENBQ0FxbUcsR0FBSXJuRCxLQUFNLENBQU4sRUFBWTEzQixNQUFoQixDQUF3QjAzQixLQUFNLENBQU4sRUFBWTEzQixNQUFwQyxDQUE0QzAzQixLQUFNLENBQU4sRUFBWTEzQixNQUF4RCxFQUVBLENBRURzaEUsTUFBUW1hLE1BQVFLLGNBQWdCLENBQWhDLENBQ0E5N0UsT0FBU2c5RSxLQUFPMWIsS0FBaEIsQ0FFQTtFQUVBLElBQU01b0YsRUFBSSxDQUFWLENBQWFBLEVBQUl1a0csSUFBakIsQ0FBdUJ2a0csR0FBdkIsQ0FBOEIsQ0FFN0JnL0MsS0FBT2pCLE1BQU8vOUMsQ0FBUCxDQUFQLENBQ0FxbUcsR0FBSXJuRCxLQUFNLENBQU4sRUFBWTEzQixNQUFoQixDQUF3QjAzQixLQUFNLENBQU4sRUFBWTEzQixNQUFwQyxDQUE0QzAzQixLQUFNLENBQU4sRUFBWTEzQixNQUF4RCxFQUVBLENBRUQsQ0ExQkQsSUEwQk87RUFJTixJQUFNdG5CLEVBQUksQ0FBVixDQUFhQSxFQUFJdWtHLElBQWpCLENBQXVCdmtHLEdBQXZCLENBQThCLENBRTdCZy9DLEtBQU9qQixNQUFPLzlDLENBQVAsQ0FBUCxDQUNBcW1HLEdBQUlybkQsS0FBTSxDQUFOLENBQUosQ0FBZUEsS0FBTSxDQUFOLENBQWYsQ0FBMEJBLEtBQU0sQ0FBTixDQUExQixFQUVBLENBRUQ7RUFFQSxJQUFNaC9DLEVBQUksQ0FBVixDQUFhQSxFQUFJdWtHLElBQWpCLENBQXVCdmtHLEdBQXZCLENBQThCLENBRTdCZy9DLEtBQU9qQixNQUFPLzlDLENBQVAsQ0FBUCxDQUNBcW1HLEdBQUlybkQsS0FBTSxDQUFOLEVBQVlzbEQsS0FBT3ZCLEtBQXZCLENBQThCL2pELEtBQU0sQ0FBTixFQUFZc2xELEtBQU92QixLQUFqRCxDQUF3RC9qRCxLQUFNLENBQU4sRUFBWXNsRCxLQUFPdkIsS0FBM0UsRUFFQSxDQUVELENBRUQzaUUsTUFBTW9uQixRQUFOLENBQWdCaGtCLEtBQWhCLENBQXVCcS9ELGNBQWNsakcsTUFBZCxDQUF1QixDQUF2QixDQUEyQjZqQyxLQUFsRCxDQUF5RCxDQUF6RCxFQUVBLENBRUQ7RUFFQSx1QkFBQSxFQUEwQixDQUV6QixVQUFZcS9ELGNBQWNsakcsTUFBZCxDQUF1QixDQUFuQyxDQUNBLGdCQUFrQixDQUFsQixDQUNBMm1HLFVBQVdwRSxPQUFYLENBQW9CcUUsV0FBcEIsRUFDQUEsYUFBZXJFLFFBQVF2aUcsTUFBdkIsQ0FFQSxJQUFNcXlCLEVBQUksQ0FBSixDQUFPOHhFLEdBQUt4QixNQUFNM2lHLE1BQXhCLENBQWdDcXlCLEVBQUk4eEUsRUFBcEMsQ0FBd0M5eEUsR0FBeEMsQ0FBK0MsQ0FFOUNreUUsTUFBUTVCLE1BQU90d0UsQ0FBUCxDQUFSLENBQ0FzMEUsVUFBV3BDLEtBQVgsQ0FBa0JxQyxXQUFsQixFQUVBO0VBQ0FBLGFBQWVyQyxNQUFNdmtHLE1BQXJCLENBRUEsQ0FHRHlnQyxNQUFNb25CLFFBQU4sQ0FBZ0Joa0IsS0FBaEIsQ0FBdUJxL0QsY0FBY2xqRyxNQUFkLENBQXVCLENBQXZCLENBQTJCNmpDLEtBQWxELENBQXlELENBQXpELEVBR0EsQ0FFRCxrQkFBQSxDQUFvQjArRCxPQUFwQixDQUE2QnFFLFdBQTdCLENBQTJDLENBRTFDLEtBQUEsQ0FBT3pxRixDQUFQLENBQ0E5YixFQUFJa2lHLFFBQVF2aUcsTUFBWixDQUVBLE1BQVEsRUFBR0ssQ0FBSCxFQUFRLENBQWhCLENBQW9CLENBRW5CNGIsRUFBSTViLENBQUosQ0FDQThiLEVBQUk5YixFQUFJLENBQVIsQ0FDQSxHQUFLOGIsRUFBSSxDQUFULENBQWFBLEVBQUlvbUYsUUFBUXZpRyxNQUFSLENBQWlCLENBQXJCLENBRWI7RUFFQSxNQUFRLENBQVIsQ0FDQzZtRyxHQUFLekQsTUFBUUssY0FBZ0IsQ0FEOUIsQ0FHQSxJQUFNN2dHLEVBQUksQ0FBVixDQUFhQSxFQUFJaWtHLEVBQWpCLENBQXFCamtHLEdBQXJCLENBQTRCLENBRTNCLFVBQVkraEcsS0FBTy9oRyxDQUFuQixDQUNBLFVBQVkraEcsTUFBUy9oRyxFQUFJLENBQWIsQ0FBWixDQUVBLE1BQVFna0csWUFBYzNxRixDQUFkLENBQWtCNnFGLEtBQTFCLENBQ0Nqa0csRUFBSStqRyxZQUFjenFGLENBQWQsQ0FBa0IycUYsS0FEdkIsQ0FFQ3RqRyxFQUFJb2pHLFlBQWN6cUYsQ0FBZCxDQUFrQjRxRixLQUZ2QixDQUdDdDhFLEVBQUltOEUsWUFBYzNxRixDQUFkLENBQWtCOHFGLEtBSHZCLENBS0FDLEdBQUlqa0csQ0FBSixDQUFPRixDQUFQLENBQVVXLENBQVYsQ0FBYWluQixDQUFiLEVBRUEsQ0FFRCxDQUVELENBRUQsVUFBQSxDQUFZN1gsQ0FBWixDQUFld1EsQ0FBZixDQUFrQjZHLENBQWxCLENBQXNCLENBRXJCZzlFLFlBQVl6bkcsSUFBWixDQUFrQm9ULENBQWxCLEVBQ0FxMEYsWUFBWXpuRyxJQUFaLENBQWtCNGpCLENBQWxCLEVBQ0E2akYsWUFBWXpuRyxJQUFaLENBQWtCeXFCLENBQWxCLEVBRUEsQ0FHRCxXQUFBLENBQWFsbkIsQ0FBYixDQUFnQkYsQ0FBaEIsQ0FBbUJXLENBQW5CLENBQXVCLENBRXRCMGpHLFVBQVdua0csQ0FBWCxFQUNBbWtHLFVBQVdya0csQ0FBWCxFQUNBcWtHLFVBQVcxakcsQ0FBWCxFQUVBLGNBQWdCMC9GLGNBQWNsakcsTUFBZCxDQUF1QixDQUF2QyxDQUNBLFFBQVVtbkcsTUFBTUMsYUFBTixDQUFxQjNtRSxLQUFyQixDQUE0QnlpRSxhQUE1QixDQUEyQ21FLFVBQVksQ0FBdkQsQ0FBMERBLFVBQVksQ0FBdEUsQ0FBeUVBLFVBQVksQ0FBckYsQ0FBVixDQUVBQyxNQUFPeG5ELElBQUssQ0FBTCxDQUFQLEVBQ0F3bkQsTUFBT3huRCxJQUFLLENBQUwsQ0FBUCxFQUNBd25ELE1BQU94bkQsSUFBSyxDQUFMLENBQVAsRUFFQSxDQUVELFdBQUEsQ0FBYS84QyxDQUFiLENBQWdCRixDQUFoQixDQUFtQlcsQ0FBbkIsQ0FBc0JpbkIsQ0FBdEIsQ0FBMEIsQ0FFekJ5OEUsVUFBV25rRyxDQUFYLEVBQ0Fta0csVUFBV3JrRyxDQUFYLEVBQ0Fxa0csVUFBV3o4RSxDQUFYLEVBRUF5OEUsVUFBV3JrRyxDQUFYLEVBQ0Fxa0csVUFBVzFqRyxDQUFYLEVBQ0EwakcsVUFBV3o4RSxDQUFYLEVBR0EsY0FBZ0J5NEUsY0FBY2xqRyxNQUFkLENBQXVCLENBQXZDLENBQ0EsUUFBVW1uRyxNQUFNSSxrQkFBTixDQUEwQjltRSxLQUExQixDQUFpQ3lpRSxhQUFqQyxDQUFnRG1FLFVBQVksQ0FBNUQsQ0FBK0RBLFVBQVksQ0FBM0UsQ0FBOEVBLFVBQVksQ0FBMUYsQ0FBNkZBLFVBQVksQ0FBekcsQ0FBVixDQUVBQyxNQUFPeG5ELElBQUssQ0FBTCxDQUFQLEVBQ0F3bkQsTUFBT3huRCxJQUFLLENBQUwsQ0FBUCxFQUNBd25ELE1BQU94bkQsSUFBSyxDQUFMLENBQVAsRUFFQXduRCxNQUFPeG5ELElBQUssQ0FBTCxDQUFQLEVBQ0F3bkQsTUFBT3huRCxJQUFLLENBQUwsQ0FBUCxFQUNBd25ELE1BQU94bkQsSUFBSyxDQUFMLENBQVAsRUFFQSxDQUVELGtCQUFBLENBQW9CNzRDLEtBQXBCLENBQTRCLENBRTNCaThGLGNBQWMxakcsSUFBZCxDQUFvQnluRyxZQUFhaGdHLE1BQVEsQ0FBUixDQUFZLENBQXpCLENBQXBCLEVBQ0FpOEYsY0FBYzFqRyxJQUFkLENBQW9CeW5HLFlBQWFoZ0csTUFBUSxDQUFSLENBQVksQ0FBekIsQ0FBcEIsRUFDQWk4RixjQUFjMWpHLElBQWQsQ0FBb0J5bkcsWUFBYWhnRyxNQUFRLENBQVIsQ0FBWSxDQUF6QixDQUFwQixFQUVBLENBR0QsY0FBQSxDQUFnQnVnRyxPQUFoQixDQUEwQixDQUV6QnpZLFFBQVF2dkYsSUFBUixDQUFjZ29HLFFBQVE1MEYsQ0FBdEIsRUFDQW04RSxRQUFRdnZGLElBQVIsQ0FBY2dvRyxRQUFRcGtGLENBQXRCLEVBRUEsQ0FFRCxDQUVELENBRURxa0Ysc0JBQXNCbHVHLFNBQXRCLENBQWtDRCxPQUFPaUIsTUFBUCxDQUFlK3NELGVBQWUvdEQsU0FBOUIsQ0FBbEMsQ0FDQWt1RyxzQkFBc0JsdUcsU0FBdEIsQ0FBZ0NzQyxXQUFoQyxDQUE4QzRyRyxxQkFBOUMsQ0FFQSxxQkFBdUIsQ0FFdEJMLGNBQWUsU0FBVzltRSxRQUFYLENBQXFCRSxRQUFyQixDQUErQmtuRSxNQUEvQixDQUF1Q0MsTUFBdkMsQ0FBK0NDLE1BQS9DLENBQXdELENBRXRFLFFBQVVwbkUsU0FBVWtuRSxPQUFTLENBQW5CLENBQVYsQ0FDQSxRQUFVbG5FLFNBQVVrbkUsT0FBUyxDQUFULENBQWEsQ0FBdkIsQ0FBVixDQUNBLFFBQVVsbkUsU0FBVW1uRSxPQUFTLENBQW5CLENBQVYsQ0FDQSxRQUFVbm5FLFNBQVVtbkUsT0FBUyxDQUFULENBQWEsQ0FBdkIsQ0FBVixDQUNBLFFBQVVubkUsU0FBVW9uRSxPQUFTLENBQW5CLENBQVYsQ0FDQSxRQUFVcG5FLFNBQVVvbkUsT0FBUyxDQUFULENBQWEsQ0FBdkIsQ0FBVixDQUVBLE9BQU8sQ0FDTixXQUFBLENBQWFDLEdBQWIsQ0FBa0JDLEdBQWxCLENBRE0sQ0FFTixXQUFBLENBQWFDLEdBQWIsQ0FBa0JDLEdBQWxCLENBRk0sQ0FHTixXQUFBLENBQWFDLEdBQWIsQ0FBa0JDLEdBQWxCLENBSE0sQ0FBUCxDQU1BLENBakJxQixDQW1CdEJYLG1CQUFvQixTQUFXam5FLFFBQVgsQ0FBcUJFLFFBQXJCLENBQStCa25FLE1BQS9CLENBQXVDQyxNQUF2QyxDQUErQ0MsTUFBL0MsQ0FBdURPLE1BQXZELENBQWdFLENBRW5GLFFBQVUzbkUsU0FBVWtuRSxPQUFTLENBQW5CLENBQVYsQ0FDQSxRQUFVbG5FLFNBQVVrbkUsT0FBUyxDQUFULENBQWEsQ0FBdkIsQ0FBVixDQUNBLFFBQVVsbkUsU0FBVWtuRSxPQUFTLENBQVQsQ0FBYSxDQUF2QixDQUFWLENBQ0EsUUFBVWxuRSxTQUFVbW5FLE9BQVMsQ0FBbkIsQ0FBVixDQUNBLFFBQVVubkUsU0FBVW1uRSxPQUFTLENBQVQsQ0FBYSxDQUF2QixDQUFWLENBQ0EsUUFBVW5uRSxTQUFVbW5FLE9BQVMsQ0FBVCxDQUFhLENBQXZCLENBQVYsQ0FDQSxRQUFVbm5FLFNBQVVvbkUsT0FBUyxDQUFuQixDQUFWLENBQ0EsUUFBVXBuRSxTQUFVb25FLE9BQVMsQ0FBVCxDQUFhLENBQXZCLENBQVYsQ0FDQSxRQUFVcG5FLFNBQVVvbkUsT0FBUyxDQUFULENBQWEsQ0FBdkIsQ0FBVixDQUNBLFFBQVVwbkUsU0FBVTJuRSxPQUFTLENBQW5CLENBQVYsQ0FDQSxRQUFVM25FLFNBQVUybkUsT0FBUyxDQUFULENBQWEsQ0FBdkIsQ0FBVixDQUNBLFFBQVUzbkUsU0FBVTJuRSxPQUFTLENBQVQsQ0FBYSxDQUF2QixDQUFWLENBRUEsR0FBS2ptRyxLQUFLeWtCLEdBQUwsQ0FBVW1oRixJQUFNRSxHQUFoQixFQUF3QixJQUE3QixDQUFvQyxDQUVuQyxPQUFPLENBQ04sV0FBQSxDQUFhSCxHQUFiLENBQWtCLEVBQUlPLEdBQXRCLENBRE0sQ0FFTixXQUFBLENBQWFMLEdBQWIsQ0FBa0IsRUFBSU0sR0FBdEIsQ0FGTSxDQUdOLFdBQUEsQ0FBYUosR0FBYixDQUFrQixFQUFJSyxHQUF0QixDQUhNLENBSU4sV0FBQSxDQUFhQyxHQUFiLENBQWtCLEVBQUlDLEdBQXRCLENBSk0sQ0FBUCxDQU9BLENBVEQsSUFTTyxDQUVOLE9BQU8sQ0FDTixXQUFBLENBQWFWLEdBQWIsQ0FBa0IsRUFBSU0sR0FBdEIsQ0FETSxDQUVOLFdBQUEsQ0FBYUosR0FBYixDQUFrQixFQUFJSyxHQUF0QixDQUZNLENBR04sV0FBQSxDQUFhSCxHQUFiLENBQWtCLEVBQUlJLEdBQXRCLENBSE0sQ0FJTixXQUFBLENBQWFHLEdBQWIsQ0FBa0IsRUFBSUQsR0FBdEIsQ0FKTSxDQUFQLENBT0EsQ0FFRCxDQXREcUIsQ0FBdkIsQ0F5REE7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQXFCQSxxQkFBQSxDQUF1QkUsSUFBdkIsQ0FBNkJ0c0QsVUFBN0IsQ0FBMEMsQ0FFekMrQyxTQUFTbGtELElBQVQsQ0FBZSxJQUFmLEVBRUEsS0FBS0QsSUFBTCxDQUFZLGNBQVosQ0FFQSxLQUFLb2hELFVBQUwsQ0FBa0IsQ0FDakJzc0QsS0FBTUEsSUFEVyxDQUVqQnRzRCxXQUFZQSxVQUZLLENBQWxCLENBS0EsS0FBS29ELGtCQUFMLENBQXlCLHNCQUFBLENBQXdCa3BELElBQXhCLENBQThCdHNELFVBQTlCLENBQXpCLEVBQ0EsS0FBS3FHLGFBQUwsR0FFQSxDQUVEa21ELGFBQWFwdkcsU0FBYixDQUF5QkQsT0FBT2lCLE1BQVAsQ0FBZTRrRCxTQUFTNWxELFNBQXhCLENBQXpCLENBQ0FvdkcsYUFBYXB2RyxTQUFiLENBQXVCc0MsV0FBdkIsQ0FBcUM4c0csWUFBckMsQ0FFQTtFQUVBLDJCQUFBLENBQTZCRCxJQUE3QixDQUFtQ3RzRCxVQUFuQyxDQUFnRCxDQUUvQ0EsV0FBYUEsWUFBYyxFQUEzQixDQUVBLFNBQVdBLFdBQVd3c0QsSUFBdEIsQ0FFQSxHQUFLLEVBQUlBLE1BQVFBLEtBQUtDLE1BQWpCLENBQUwsQ0FBaUMsQ0FFaEN2ekYsUUFBUU0sS0FBUixDQUFlLHNFQUFmLEVBQ0EsbUJBQU8sRUFBUCxDQUVBLENBRUQsV0FBYWd6RixLQUFLRSxjQUFMLENBQXFCSixJQUFyQixDQUEyQnRzRCxXQUFXeGMsSUFBdEMsQ0FBNEN3YyxXQUFXK21ELGFBQXZELENBQWIsQ0FFQTtFQUVBL21ELFdBQVdpbkQsTUFBWCxDQUFvQmpuRCxXQUFXL2YsTUFBWCxHQUFzQjE5QixTQUF0QixDQUFrQ3k5QyxXQUFXL2YsTUFBN0MsQ0FBc0QsRUFBMUUsQ0FFQTtFQUVBLEdBQUsrZixXQUFXbW5ELGNBQVgsR0FBOEI1a0csU0FBbkMsQ0FBK0N5OUMsV0FBV21uRCxjQUFYLENBQTRCLEVBQTVCLENBQy9DLEdBQUtubkQsV0FBV29uRCxTQUFYLEdBQXlCN2tHLFNBQTlCLENBQTBDeTlDLFdBQVdvbkQsU0FBWCxDQUF1QixDQUF2QixDQUMxQyxHQUFLcG5ELFdBQVdrbkQsWUFBWCxHQUE0QjNrRyxTQUFqQyxDQUE2Q3k5QyxXQUFXa25ELFlBQVgsQ0FBMEIsS0FBMUIsQ0FFN0NtRSxzQkFBc0J4c0csSUFBdEIsQ0FBNEIsSUFBNUIsQ0FBa0MrZ0QsTUFBbEMsQ0FBMENJLFVBQTFDLEVBRUEsS0FBS3BoRCxJQUFMLENBQVksb0JBQVosQ0FFQSxDQUVEK3RHLG1CQUFtQnh2RyxTQUFuQixDQUErQkQsT0FBT2lCLE1BQVAsQ0FBZWt0RyxzQkFBc0JsdUcsU0FBckMsQ0FBL0IsQ0FDQXd2RyxtQkFBbUJ4dkcsU0FBbkIsQ0FBNkJzQyxXQUE3QixDQUEyQ2t0RyxrQkFBM0MsQ0FFQTs7Ozs7RUFRQSx1QkFBQSxDQUF5Qmh3RSxNQUF6QixDQUFpQ3N3QixhQUFqQyxDQUFnREMsY0FBaEQsQ0FBZ0UwL0MsUUFBaEUsQ0FBMEVDLFNBQTFFLENBQXFGQyxVQUFyRixDQUFpR0MsV0FBakcsQ0FBK0csQ0FFOUdocUQsU0FBU2xrRCxJQUFULENBQWUsSUFBZixFQUVBLEtBQUtELElBQUwsQ0FBWSxnQkFBWixDQUVBLEtBQUtvaEQsVUFBTCxDQUFrQixDQUNqQnJqQixPQUFRQSxNQURTLENBRWpCc3dCLGNBQWVBLGFBRkUsQ0FHakJDLGVBQWdCQSxjQUhDLENBSWpCMC9DLFNBQVVBLFFBSk8sQ0FLakJDLFVBQVdBLFNBTE0sQ0FNakJDLFdBQVlBLFVBTkssQ0FPakJDLFlBQWFBLFdBUEksQ0FBbEIsQ0FVQSxLQUFLM3BELGtCQUFMLENBQXlCLHdCQUFBLENBQTBCem1CLE1BQTFCLENBQWtDc3dCLGFBQWxDLENBQWlEQyxjQUFqRCxDQUFpRTAvQyxRQUFqRSxDQUEyRUMsU0FBM0UsQ0FBc0ZDLFVBQXRGLENBQWtHQyxXQUFsRyxDQUF6QixFQUNBLEtBQUsxbUQsYUFBTCxHQUVBLENBRUQybUQsZUFBZTd2RyxTQUFmLENBQTJCRCxPQUFPaUIsTUFBUCxDQUFlNGtELFNBQVM1bEQsU0FBeEIsQ0FBM0IsQ0FDQTZ2RyxlQUFlN3ZHLFNBQWYsQ0FBeUJzQyxXQUF6QixDQUF1Q3V0RyxjQUF2QyxDQUVBO0VBRUEsNkJBQUEsQ0FBK0Jyd0UsTUFBL0IsQ0FBdUNzd0IsYUFBdkMsQ0FBc0RDLGNBQXRELENBQXNFMC9DLFFBQXRFLENBQWdGQyxTQUFoRixDQUEyRkMsVUFBM0YsQ0FBdUdDLFdBQXZHLENBQXFILENBRXBIN2hELGVBQWVyc0QsSUFBZixDQUFxQixJQUFyQixFQUVBLEtBQUtELElBQUwsQ0FBWSxzQkFBWixDQUVBLEtBQUtvaEQsVUFBTCxDQUFrQixDQUNqQnJqQixPQUFRQSxNQURTLENBRWpCc3dCLGNBQWVBLGFBRkUsQ0FHakJDLGVBQWdCQSxjQUhDLENBSWpCMC9DLFNBQVVBLFFBSk8sQ0FLakJDLFVBQVdBLFNBTE0sQ0FNakJDLFdBQVlBLFVBTkssQ0FPakJDLFlBQWFBLFdBUEksQ0FBbEIsQ0FVQXB3RSxPQUFTQSxRQUFVLENBQW5CLENBRUFzd0IsY0FBZ0JubkQsS0FBSzhFLEdBQUwsQ0FBVSxDQUFWLENBQWE5RSxLQUFLRSxLQUFMLENBQVlpbkQsYUFBWixHQUErQixDQUE1QyxDQUFoQixDQUNBQyxlQUFpQnBuRCxLQUFLOEUsR0FBTCxDQUFVLENBQVYsQ0FBYTlFLEtBQUtFLEtBQUwsQ0FBWWtuRCxjQUFaLEdBQWdDLENBQTdDLENBQWpCLENBRUEwL0MsU0FBV0EsV0FBYXJxRyxTQUFiLENBQXlCcXFHLFFBQXpCLENBQW9DLENBQS9DLENBQ0FDLFVBQVlBLFlBQWN0cUcsU0FBZCxDQUEwQnNxRyxTQUExQixDQUFzQy9tRyxLQUFLK2YsRUFBTCxDQUFVLENBQTVELENBRUFpbkYsV0FBYUEsYUFBZXZxRyxTQUFmLENBQTJCdXFHLFVBQTNCLENBQXdDLENBQXJELENBQ0FDLFlBQWNBLGNBQWdCeHFHLFNBQWhCLENBQTRCd3FHLFdBQTVCLENBQTBDam5HLEtBQUsrZixFQUE3RCxDQUVBLGFBQWVpbkYsV0FBYUMsV0FBNUIsQ0FFQSxNQUFBLENBQVE3eEUsRUFBUixDQUVBLFVBQVksQ0FBWixDQUNBLFNBQVcsRUFBWCxDQUVBLFdBQWEsV0FBQSxFQUFiLENBQ0EsV0FBYSxXQUFBLEVBQWIsQ0FFQTtFQUVBLFlBQWMsRUFBZCxDQUNBLGFBQWUsRUFBZixDQUNBLFlBQWMsRUFBZCxDQUNBLFFBQVUsRUFBVixDQUVBO0VBRUEsSUFBTUEsR0FBSyxDQUFYLENBQWNBLElBQU1neUIsY0FBcEIsQ0FBb0NoeUIsSUFBcEMsQ0FBNEMsQ0FFM0MsZ0JBQWtCLEVBQWxCLENBRUEsTUFBUUEsR0FBS2d5QixjQUFiLENBRUEsSUFBTWx5QixHQUFLLENBQVgsQ0FBY0EsSUFBTWl5QixhQUFwQixDQUFtQ2p5QixJQUFuQyxDQUEyQyxDQUUxQyxNQUFRQSxHQUFLaXlCLGFBQWIsQ0FFQTtFQUVBakssT0FBT3hzQyxDQUFQLENBQVcsQ0FBRW1tQixNQUFGLENBQVc3MkIsS0FBS2ltQixHQUFMLENBQVU2Z0YsU0FBV3g3RCxFQUFJeTdELFNBQXpCLENBQVgsQ0FBa0QvbUcsS0FBS2ttQixHQUFMLENBQVU4Z0YsV0FBYXgyRixFQUFJeTJGLFdBQTNCLENBQTdELENBQ0EvcEQsT0FBT2g4QixDQUFQLENBQVcyVixPQUFTNzJCLEtBQUtpbUIsR0FBTCxDQUFVK2dGLFdBQWF4MkYsRUFBSXkyRixXQUEzQixDQUFwQixDQUNBL3BELE9BQU9uMUIsQ0FBUCxDQUFXOE8sT0FBUzcyQixLQUFLa21CLEdBQUwsQ0FBVTRnRixTQUFXeDdELEVBQUl5N0QsU0FBekIsQ0FBVCxDQUFnRC9tRyxLQUFLa21CLEdBQUwsQ0FBVThnRixXQUFheDJGLEVBQUl5MkYsV0FBM0IsQ0FBM0QsQ0FFQTNvRSxTQUFTaGhDLElBQVQsQ0FBZTQvQyxPQUFPeHNDLENBQXRCLENBQXlCd3NDLE9BQU9oOEIsQ0FBaEMsQ0FBbUNnOEIsT0FBT24xQixDQUExQyxFQUVBO0VBRUF3TyxPQUFPOW5CLEdBQVAsQ0FBWXl1QyxPQUFPeHNDLENBQW5CLENBQXNCd3NDLE9BQU9oOEIsQ0FBN0IsQ0FBZ0NnOEIsT0FBT24xQixDQUF2QyxFQUEyQ3JELFNBQTNDLEdBQ0FnNUIsUUFBUXBnRCxJQUFSLENBQWNpNUIsT0FBTzdsQixDQUFyQixDQUF3QjZsQixPQUFPclYsQ0FBL0IsQ0FBa0NxVixPQUFPeE8sQ0FBekMsRUFFQTtFQUVBNjFCLElBQUl0Z0QsSUFBSixDQUFVZ3VDLENBQVYsQ0FBYSxFQUFJOTZCLENBQWpCLEVBRUEyMkYsWUFBWTdwRyxJQUFaLENBQWtCeUgsT0FBbEIsRUFFQSxDQUVEcWlHLEtBQUs5cEcsSUFBTCxDQUFXNnBHLFdBQVgsRUFFQSxDQUVEO0VBRUEsSUFBTS94RSxHQUFLLENBQVgsQ0FBY0EsR0FBS2d5QixjQUFuQixDQUFtQ2h5QixJQUFuQyxDQUEyQyxDQUUxQyxJQUFNRixHQUFLLENBQVgsQ0FBY0EsR0FBS2l5QixhQUFuQixDQUFrQ2p5QixJQUFsQyxDQUEwQyxDQUV6QyxNQUFRa3lFLEtBQU1oeUUsRUFBTixFQUFZRixHQUFLLENBQWpCLENBQVIsQ0FDQSxNQUFRa3lFLEtBQU1oeUUsRUFBTixFQUFZRixFQUFaLENBQVIsQ0FDQSxNQUFRa3lFLEtBQU1oeUUsR0FBSyxDQUFYLEVBQWdCRixFQUFoQixDQUFSLENBQ0EsTUFBUWt5RSxLQUFNaHlFLEdBQUssQ0FBWCxFQUFnQkYsR0FBSyxDQUFyQixDQUFSLENBRUEsR0FBS0UsS0FBTyxDQUFQLEVBQVk0eEUsV0FBYSxDQUE5QixDQUFrQy9vRCxRQUFRM2dELElBQVIsQ0FBY3VELENBQWQsQ0FBaUJGLENBQWpCLENBQW9CNG5CLENBQXBCLEVBQ2xDLEdBQUs2TSxLQUFPZ3lCLGVBQWlCLENBQXhCLEVBQTZCaWdELFNBQVdybkcsS0FBSytmLEVBQWxELENBQXVEaytCLFFBQVEzZ0QsSUFBUixDQUFjcUQsQ0FBZCxDQUFpQlcsQ0FBakIsQ0FBb0JpbkIsQ0FBcEIsRUFFdkQsQ0FFRCxDQUVEO0VBRUEsS0FBSys4QixRQUFMLENBQWVySCxPQUFmLEVBQ0EsS0FBS3VILFlBQUwsQ0FBbUIsVUFBbkIsQ0FBK0IsMEJBQUEsQ0FBNEJsbkIsUUFBNUIsQ0FBc0MsQ0FBdEMsQ0FBL0IsRUFDQSxLQUFLa25CLFlBQUwsQ0FBbUIsUUFBbkIsQ0FBNkIsMEJBQUEsQ0FBNEI5SCxPQUE1QixDQUFxQyxDQUFyQyxDQUE3QixFQUNBLEtBQUs4SCxZQUFMLENBQW1CLElBQW5CLENBQXlCLDBCQUFBLENBQTRCNUgsR0FBNUIsQ0FBaUMsQ0FBakMsQ0FBekIsRUFFQSxDQUVEMHBELHFCQUFxQmp3RyxTQUFyQixDQUFpQ0QsT0FBT2lCLE1BQVAsQ0FBZStzRCxlQUFlL3RELFNBQTlCLENBQWpDLENBQ0Fpd0cscUJBQXFCandHLFNBQXJCLENBQStCc0MsV0FBL0IsQ0FBNkMydEcsb0JBQTdDLENBRUE7Ozs7RUFPQSxxQkFBQSxDQUF1QkMsV0FBdkIsQ0FBb0NDLFdBQXBDLENBQWlEQyxhQUFqRCxDQUFnRUMsV0FBaEUsQ0FBNkVWLFVBQTdFLENBQXlGQyxXQUF6RixDQUF1RyxDQUV0R2hxRCxTQUFTbGtELElBQVQsQ0FBZSxJQUFmLEVBRUEsS0FBS0QsSUFBTCxDQUFZLGNBQVosQ0FFQSxLQUFLb2hELFVBQUwsQ0FBa0IsQ0FDakJxdEQsWUFBYUEsV0FESSxDQUVqQkMsWUFBYUEsV0FGSSxDQUdqQkMsY0FBZUEsYUFIRSxDQUlqQkMsWUFBYUEsV0FKSSxDQUtqQlYsV0FBWUEsVUFMSyxDQU1qQkMsWUFBYUEsV0FOSSxDQUFsQixDQVNBLEtBQUszcEQsa0JBQUwsQ0FBeUIsc0JBQUEsQ0FBd0JpcUQsV0FBeEIsQ0FBcUNDLFdBQXJDLENBQWtEQyxhQUFsRCxDQUFpRUMsV0FBakUsQ0FBOEVWLFVBQTlFLENBQTBGQyxXQUExRixDQUF6QixFQUNBLEtBQUsxbUQsYUFBTCxHQUVBLENBRURvbkQsYUFBYXR3RyxTQUFiLENBQXlCRCxPQUFPaUIsTUFBUCxDQUFlNGtELFNBQVM1bEQsU0FBeEIsQ0FBekIsQ0FDQXN3RyxhQUFhdHdHLFNBQWIsQ0FBdUJzQyxXQUF2QixDQUFxQ2d1RyxZQUFyQyxDQUVBO0VBRUEsMkJBQUEsQ0FBNkJKLFdBQTdCLENBQTBDQyxXQUExQyxDQUF1REMsYUFBdkQsQ0FBc0VDLFdBQXRFLENBQW1GVixVQUFuRixDQUErRkMsV0FBL0YsQ0FBNkcsQ0FFNUc3aEQsZUFBZXJzRCxJQUFmLENBQXFCLElBQXJCLEVBRUEsS0FBS0QsSUFBTCxDQUFZLG9CQUFaLENBRUEsS0FBS29oRCxVQUFMLENBQWtCLENBQ2pCcXRELFlBQWFBLFdBREksQ0FFakJDLFlBQWFBLFdBRkksQ0FHakJDLGNBQWVBLGFBSEUsQ0FJakJDLFlBQWFBLFdBSkksQ0FLakJWLFdBQVlBLFVBTEssQ0FNakJDLFlBQWFBLFdBTkksQ0FBbEIsQ0FTQU0sWUFBY0EsYUFBZSxHQUE3QixDQUNBQyxZQUFjQSxhQUFlLENBQTdCLENBRUFSLFdBQWFBLGFBQWV2cUcsU0FBZixDQUEyQnVxRyxVQUEzQixDQUF3QyxDQUFyRCxDQUNBQyxZQUFjQSxjQUFnQnhxRyxTQUFoQixDQUE0QndxRyxXQUE1QixDQUEwQ2puRyxLQUFLK2YsRUFBTCxDQUFVLENBQWxFLENBRUEwbkYsY0FBZ0JBLGdCQUFrQmhyRyxTQUFsQixDQUE4QnVELEtBQUs4RSxHQUFMLENBQVUsQ0FBVixDQUFhMmlHLGFBQWIsQ0FBOUIsQ0FBNkQsQ0FBN0UsQ0FDQUMsWUFBY0EsY0FBZ0JqckcsU0FBaEIsQ0FBNEJ1RCxLQUFLOEUsR0FBTCxDQUFVLENBQVYsQ0FBYTRpRyxXQUFiLENBQTVCLENBQXlELENBQXZFLENBRUE7RUFFQSxZQUFjLEVBQWQsQ0FDQSxhQUFlLEVBQWYsQ0FDQSxZQUFjLEVBQWQsQ0FDQSxRQUFVLEVBQVYsQ0FFQTtFQUVBLFdBQUEsQ0FDQSxXQUFhSCxXQUFiLENBQ0EsZUFBbUIsQ0FBRUMsWUFBY0QsV0FBaEIsRUFBZ0NHLFdBQW5ELENBQ0EsV0FBYSxXQUFBLEVBQWIsQ0FDQSxPQUFTLFdBQUEsRUFBVCxDQUNBLEtBQUEsQ0FBT3ZwRyxDQUFQLENBRUE7RUFFQSxJQUFNNGIsRUFBSSxDQUFWLENBQWFBLEdBQUsydEYsV0FBbEIsQ0FBK0IzdEYsR0FBL0IsQ0FBc0MsQ0FFckMsSUFBTTViLEVBQUksQ0FBVixDQUFhQSxHQUFLc3BHLGFBQWxCLENBQWlDdHBHLEdBQWpDLENBQXdDO0VBSXZDeXBHLFFBQVVaLFdBQWE3b0csRUFBSXNwRyxhQUFKLENBQW9CUixXQUEzQyxDQUVBO0VBRUEvcEQsT0FBT3hzQyxDQUFQLENBQVdtbUIsT0FBUzcyQixLQUFLaW1CLEdBQUwsQ0FBVTJoRixPQUFWLENBQXBCLENBQ0ExcUQsT0FBT2g4QixDQUFQLENBQVcyVixPQUFTNzJCLEtBQUtrbUIsR0FBTCxDQUFVMGhGLE9BQVYsQ0FBcEIsQ0FFQXRwRSxTQUFTaGhDLElBQVQsQ0FBZTQvQyxPQUFPeHNDLENBQXRCLENBQXlCd3NDLE9BQU9oOEIsQ0FBaEMsQ0FBbUNnOEIsT0FBT24xQixDQUExQyxFQUVBO0VBRUEyMUIsUUFBUXBnRCxJQUFSLENBQWMsQ0FBZCxDQUFpQixDQUFqQixDQUFvQixDQUFwQixFQUVBO0VBRUF3OUIsR0FBR3BxQixDQUFILENBQU8sQ0FBRXdzQyxPQUFPeHNDLENBQVAsQ0FBVzgyRixXQUFYLENBQXlCLENBQTNCLEVBQWlDLENBQXhDLENBQ0Exc0UsR0FBRzVaLENBQUgsQ0FBTyxDQUFFZzhCLE9BQU9oOEIsQ0FBUCxDQUFXc21GLFdBQVgsQ0FBeUIsQ0FBM0IsRUFBaUMsQ0FBeEMsQ0FFQTVwRCxJQUFJdGdELElBQUosQ0FBVXc5QixHQUFHcHFCLENBQWIsQ0FBZ0JvcUIsR0FBRzVaLENBQW5CLEVBRUEsQ0FFRDtFQUVBMlYsUUFBVWd4RSxVQUFWLENBRUEsQ0FFRDtFQUVBLElBQU05dEYsRUFBSSxDQUFWLENBQWFBLEVBQUkydEYsV0FBakIsQ0FBOEIzdEYsR0FBOUIsQ0FBcUMsQ0FFcEMsc0JBQXdCQSxHQUFNMHRGLGNBQWdCLENBQXRCLENBQXhCLENBRUEsSUFBTXRwRyxFQUFJLENBQVYsQ0FBYUEsRUFBSXNwRyxhQUFqQixDQUFnQ3RwRyxHQUFoQyxDQUF1QyxDQUV0Q3lwRyxRQUFVenBHLEVBQUkycEcsaUJBQWQsQ0FFQSxNQUFRRixPQUFSLENBQ0EsTUFBUUEsUUFBVUgsYUFBVixDQUEwQixDQUFsQyxDQUNBLE1BQVFHLFFBQVVILGFBQVYsQ0FBMEIsQ0FBbEMsQ0FDQSxNQUFRRyxRQUFVLENBQWxCLENBRUE7RUFFQTNwRCxRQUFRM2dELElBQVIsQ0FBY3VELENBQWQsQ0FBaUJGLENBQWpCLENBQW9CNG5CLENBQXBCLEVBQ0EwMUIsUUFBUTNnRCxJQUFSLENBQWNxRCxDQUFkLENBQWlCVyxDQUFqQixDQUFvQmluQixDQUFwQixFQUVBLENBRUQsQ0FFRDtFQUVBLEtBQUsrOEIsUUFBTCxDQUFlckgsT0FBZixFQUNBLEtBQUt1SCxZQUFMLENBQW1CLFVBQW5CLENBQStCLDBCQUFBLENBQTRCbG5CLFFBQTVCLENBQXNDLENBQXRDLENBQS9CLEVBQ0EsS0FBS2tuQixZQUFMLENBQW1CLFFBQW5CLENBQTZCLDBCQUFBLENBQTRCOUgsT0FBNUIsQ0FBcUMsQ0FBckMsQ0FBN0IsRUFDQSxLQUFLOEgsWUFBTCxDQUFtQixJQUFuQixDQUF5QiwwQkFBQSxDQUE0QjVILEdBQTVCLENBQWlDLENBQWpDLENBQXpCLEVBRUEsQ0FFRG1xRCxtQkFBbUIxd0csU0FBbkIsQ0FBK0JELE9BQU9pQixNQUFQLENBQWUrc0QsZUFBZS90RCxTQUE5QixDQUEvQixDQUNBMHdHLG1CQUFtQjF3RyxTQUFuQixDQUE2QnNDLFdBQTdCLENBQTJDb3VHLGtCQUEzQyxDQUVBOzs7Ozs7RUFTQSxzQkFBQSxDQUF3QjFxRSxNQUF4QixDQUFnQzJxRSxRQUFoQyxDQUEwQ2xCLFFBQTFDLENBQW9EQyxTQUFwRCxDQUFnRSxDQUUvRDlwRCxTQUFTbGtELElBQVQsQ0FBZSxJQUFmLEVBRUEsS0FBS0QsSUFBTCxDQUFZLGVBQVosQ0FFQSxLQUFLb2hELFVBQUwsQ0FBa0IsQ0FDakI3YyxPQUFRQSxNQURTLENBRWpCMnFFLFNBQVVBLFFBRk8sQ0FHakJsQixTQUFVQSxRQUhPLENBSWpCQyxVQUFXQSxTQUpNLENBQWxCLENBT0EsS0FBS3pwRCxrQkFBTCxDQUF5Qix1QkFBQSxDQUF5QmpnQixNQUF6QixDQUFpQzJxRSxRQUFqQyxDQUEyQ2xCLFFBQTNDLENBQXFEQyxTQUFyRCxDQUF6QixFQUNBLEtBQUt4bUQsYUFBTCxHQUVBLENBRUQwbkQsY0FBYzV3RyxTQUFkLENBQTBCRCxPQUFPaUIsTUFBUCxDQUFlNGtELFNBQVM1bEQsU0FBeEIsQ0FBMUIsQ0FDQTR3RyxjQUFjNXdHLFNBQWQsQ0FBd0JzQyxXQUF4QixDQUFzQ3N1RyxhQUF0QyxDQUVBO0VBRUEsNEJBQUEsQ0FBOEI1cUUsTUFBOUIsQ0FBc0MycUUsUUFBdEMsQ0FBZ0RsQixRQUFoRCxDQUEwREMsU0FBMUQsQ0FBc0UsQ0FFckUzaEQsZUFBZXJzRCxJQUFmLENBQXFCLElBQXJCLEVBRUEsS0FBS0QsSUFBTCxDQUFZLHFCQUFaLENBRUEsS0FBS29oRCxVQUFMLENBQWtCLENBQ2pCN2MsT0FBUUEsTUFEUyxDQUVqQjJxRSxTQUFVQSxRQUZPLENBR2pCbEIsU0FBVUEsUUFITyxDQUlqQkMsVUFBV0EsU0FKTSxDQUFsQixDQU9BaUIsU0FBV2hvRyxLQUFLRSxLQUFMLENBQVk4bkcsUUFBWixHQUEwQixFQUFyQyxDQUNBbEIsU0FBV0EsVUFBWSxDQUF2QixDQUNBQyxVQUFZQSxXQUFhL21HLEtBQUsrZixFQUFMLENBQVUsQ0FBbkMsQ0FFQTtFQUVBZ25GLFVBQVlqbEYsTUFBTXRCLEtBQU4sQ0FBYXVtRixTQUFiLENBQXdCLENBQXhCLENBQTJCL21HLEtBQUsrZixFQUFMLENBQVUsQ0FBckMsQ0FBWixDQUdBO0VBRUEsWUFBYyxFQUFkLENBQ0EsYUFBZSxFQUFmLENBQ0EsUUFBVSxFQUFWLENBRUE7RUFFQSxRQUFBLENBQ0Esb0JBQXNCLElBQU1pb0YsUUFBNUIsQ0FDQSxXQUFhLFdBQUEsRUFBYixDQUNBLE9BQVMsV0FBQSxFQUFULENBQ0EsS0FBQSxDQUFPanVGLENBQVAsQ0FFQTtFQUVBLElBQU01YixFQUFJLENBQVYsQ0FBYUEsR0FBSzZwRyxRQUFsQixDQUE0QjdwRyxHQUE1QixDQUFtQyxDQUVsQyxRQUFVMm9HLFNBQVczb0csRUFBSStwRyxlQUFKLENBQXNCbkIsU0FBM0MsQ0FFQSxRQUFVL21HLEtBQUtrbUIsR0FBTCxDQUFVMFEsR0FBVixDQUFWLENBQ0EsUUFBVTUyQixLQUFLaW1CLEdBQUwsQ0FBVTJRLEdBQVYsQ0FBVixDQUVBLElBQU03YyxFQUFJLENBQVYsQ0FBYUEsR0FBT3NqQixPQUFPdi9CLE1BQVAsQ0FBZ0IsQ0FBcEMsQ0FBeUNpYyxHQUF6QyxDQUFnRDtFQUkvQ21qQyxPQUFPeHNDLENBQVAsQ0FBVzJzQixPQUFRdGpCLENBQVIsRUFBWXJKLENBQVosQ0FBZ0J3VixHQUEzQixDQUNBZzNCLE9BQU9oOEIsQ0FBUCxDQUFXbWMsT0FBUXRqQixDQUFSLEVBQVltSCxDQUF2QixDQUNBZzhCLE9BQU9uMUIsQ0FBUCxDQUFXc1YsT0FBUXRqQixDQUFSLEVBQVlySixDQUFaLENBQWdCdVYsR0FBM0IsQ0FFQXFZLFNBQVNoaEMsSUFBVCxDQUFlNC9DLE9BQU94c0MsQ0FBdEIsQ0FBeUJ3c0MsT0FBT2g4QixDQUFoQyxDQUFtQ2c4QixPQUFPbjFCLENBQTFDLEVBRUE7RUFFQStTLEdBQUdwcUIsQ0FBSCxDQUFPdlMsRUFBSTZwRyxRQUFYLENBQ0FsdEUsR0FBRzVaLENBQUgsQ0FBT25ILEdBQU1zakIsT0FBT3YvQixNQUFQLENBQWdCLENBQXRCLENBQVAsQ0FFQTgvQyxJQUFJdGdELElBQUosQ0FBVXc5QixHQUFHcHFCLENBQWIsQ0FBZ0JvcUIsR0FBRzVaLENBQW5CLEVBR0EsQ0FFRCxDQUVEO0VBRUEsSUFBTS9pQixFQUFJLENBQVYsQ0FBYUEsRUFBSTZwRyxRQUFqQixDQUEyQjdwRyxHQUEzQixDQUFrQyxDQUVqQyxJQUFNNGIsRUFBSSxDQUFWLENBQWFBLEVBQU1zakIsT0FBT3YvQixNQUFQLENBQWdCLENBQW5DLENBQXdDaWMsR0FBeEMsQ0FBK0MsQ0FFOUNvdUYsS0FBT3B1RixFQUFJNWIsRUFBSWsvQixPQUFPdi9CLE1BQXRCLENBRUEsTUFBUXFxRyxJQUFSLENBQ0EsTUFBUUEsS0FBTzlxRSxPQUFPdi9CLE1BQXRCLENBQ0EsTUFBUXFxRyxLQUFPOXFFLE9BQU92L0IsTUFBZCxDQUF1QixDQUEvQixDQUNBLE1BQVFxcUcsS0FBTyxDQUFmLENBRUE7RUFFQWxxRCxRQUFRM2dELElBQVIsQ0FBY3VELENBQWQsQ0FBaUJGLENBQWpCLENBQW9CNG5CLENBQXBCLEVBQ0EwMUIsUUFBUTNnRCxJQUFSLENBQWNxRCxDQUFkLENBQWlCVyxDQUFqQixDQUFvQmluQixDQUFwQixFQUVBLENBRUQsQ0FFRDtFQUVBLEtBQUsrOEIsUUFBTCxDQUFlckgsT0FBZixFQUNBLEtBQUt1SCxZQUFMLENBQW1CLFVBQW5CLENBQStCLDBCQUFBLENBQTRCbG5CLFFBQTVCLENBQXNDLENBQXRDLENBQS9CLEVBQ0EsS0FBS2tuQixZQUFMLENBQW1CLElBQW5CLENBQXlCLDBCQUFBLENBQTRCNUgsR0FBNUIsQ0FBaUMsQ0FBakMsQ0FBekIsRUFFQTtFQUVBLEtBQUtjLG9CQUFMLEdBRUE7RUFDQTtFQUVBLEdBQUtxb0QsWUFBYy9tRyxLQUFLK2YsRUFBTCxDQUFVLENBQTdCLENBQWlDLENBRWhDLFlBQWMsS0FBSzBlLFVBQUwsQ0FBZ0JsSSxNQUFoQixDQUF1QnJZLEtBQXJDLENBQ0EsT0FBUyxXQUFBLEVBQVQsQ0FDQSxPQUFTLFdBQUEsRUFBVCxDQUNBLE1BQVEsV0FBQSxFQUFSLENBRUE7RUFFQWlxRixLQUFPSCxTQUFXM3FFLE9BQU92L0IsTUFBbEIsQ0FBMkIsQ0FBbEMsQ0FFQSxJQUFNSyxFQUFJLENBQUosQ0FBTzRiLEVBQUksQ0FBakIsQ0FBb0I1YixFQUFJay9CLE9BQU92L0IsTUFBL0IsQ0FBdUNLLElBQU00YixHQUFLLENBQWxELENBQXNEO0VBSXJEcXVGLEdBQUcxM0YsQ0FBSCxDQUFPZ3RDLFFBQVMzakMsRUFBSSxDQUFiLENBQVAsQ0FDQXF1RixHQUFHbG5GLENBQUgsQ0FBT3c4QixRQUFTM2pDLEVBQUksQ0FBYixDQUFQLENBQ0FxdUYsR0FBR3JnRixDQUFILENBQU8yMUIsUUFBUzNqQyxFQUFJLENBQWIsQ0FBUCxDQUVBO0VBRUFzdUYsR0FBRzMzRixDQUFILENBQU9ndEMsUUFBU3lxRCxLQUFPcHVGLENBQVAsQ0FBVyxDQUFwQixDQUFQLENBQ0FzdUYsR0FBR25uRixDQUFILENBQU93OEIsUUFBU3lxRCxLQUFPcHVGLENBQVAsQ0FBVyxDQUFwQixDQUFQLENBQ0FzdUYsR0FBR3RnRixDQUFILENBQU8yMUIsUUFBU3lxRCxLQUFPcHVGLENBQVAsQ0FBVyxDQUFwQixDQUFQLENBRUE7RUFFQTJHLEVBQUV3QyxVQUFGLENBQWNrbEYsRUFBZCxDQUFrQkMsRUFBbEIsRUFBdUIzakYsU0FBdkIsR0FFQTtFQUVBZzVCLFFBQVMzakMsRUFBSSxDQUFiLEVBQW1CMmpDLFFBQVN5cUQsS0FBT3B1RixDQUFQLENBQVcsQ0FBcEIsRUFBMEIyRyxFQUFFaFEsQ0FBL0MsQ0FDQWd0QyxRQUFTM2pDLEVBQUksQ0FBYixFQUFtQjJqQyxRQUFTeXFELEtBQU9wdUYsQ0FBUCxDQUFXLENBQXBCLEVBQTBCMkcsRUFBRVEsQ0FBL0MsQ0FDQXc4QixRQUFTM2pDLEVBQUksQ0FBYixFQUFtQjJqQyxRQUFTeXFELEtBQU9wdUYsQ0FBUCxDQUFXLENBQXBCLEVBQTBCMkcsRUFBRXFILENBQS9DLENBRUEsQ0FFRCxDQUVELENBRUR1Z0Ysb0JBQW9CanhHLFNBQXBCLENBQWdDRCxPQUFPaUIsTUFBUCxDQUFlK3NELGVBQWUvdEQsU0FBOUIsQ0FBaEMsQ0FDQWl4RyxvQkFBb0JqeEcsU0FBcEIsQ0FBOEJzQyxXQUE5QixDQUE0QzJ1RyxtQkFBNUMsQ0FFQTs7OztFQU9BLHNCQUFBLENBQXdCeHVELE1BQXhCLENBQWdDbW5ELGFBQWhDLENBQWdELENBRS9DaGtELFNBQVNsa0QsSUFBVCxDQUFlLElBQWYsRUFFQSxLQUFLRCxJQUFMLENBQVksZUFBWixDQUVBLEdBQUssb0JBQUEsR0FBeUIsUUFBOUIsQ0FBeUMsQ0FFeENzYSxRQUFRNlAsSUFBUixDQUFjLDBEQUFkLEVBRUFnK0UsY0FBZ0JBLGNBQWNBLGFBQTlCLENBRUEsQ0FFRCxLQUFLL21ELFVBQUwsQ0FBa0IsQ0FDakJKLE9BQVFBLE1BRFMsQ0FFakJtbkQsY0FBZUEsYUFGRSxDQUFsQixDQUtBLEtBQUszakQsa0JBQUwsQ0FBeUIsdUJBQUEsQ0FBeUJ4RCxNQUF6QixDQUFpQ21uRCxhQUFqQyxDQUF6QixFQUNBLEtBQUsxZ0QsYUFBTCxHQUVBLENBRURnb0QsY0FBY2x4RyxTQUFkLENBQTBCRCxPQUFPaUIsTUFBUCxDQUFlNGtELFNBQVM1bEQsU0FBeEIsQ0FBMUIsQ0FDQWt4RyxjQUFjbHhHLFNBQWQsQ0FBd0JzQyxXQUF4QixDQUFzQzR1RyxhQUF0QyxDQUVBQSxjQUFjbHhHLFNBQWQsQ0FBd0J3aUMsTUFBeEIsQ0FBaUMsVUFBWSxDQUU1QyxTQUFXb2pCLFNBQVM1bEQsU0FBVCxDQUFtQndpQyxNQUFuQixDQUEwQjlnQyxJQUExQixDQUFnQyxJQUFoQyxDQUFYLENBRUEsV0FBYSxLQUFLbWhELFVBQUwsQ0FBZ0JKLE1BQTdCLENBRUEsY0FBZUEsTUFBUixDQUFnQnRzQyxJQUFoQixDQUFQLENBRUEsQ0FSRCxDQVVBO0VBRUEsNEJBQUEsQ0FBOEJzc0MsTUFBOUIsQ0FBc0NtbkQsYUFBdEMsQ0FBc0QsQ0FFckQ3N0MsZUFBZXJzRCxJQUFmLENBQXFCLElBQXJCLEVBRUEsS0FBS0QsSUFBTCxDQUFZLHFCQUFaLENBRUEsS0FBS29oRCxVQUFMLENBQWtCLENBQ2pCSixPQUFRQSxNQURTLENBRWpCbW5ELGNBQWVBLGFBRkUsQ0FBbEIsQ0FLQUEsY0FBZ0JBLGVBQWlCLEVBQWpDLENBRUE7RUFFQSxZQUFjLEVBQWQsQ0FDQSxhQUFlLEVBQWYsQ0FDQSxZQUFjLEVBQWQsQ0FDQSxRQUFVLEVBQVYsQ0FFQTtFQUVBLGVBQWlCLENBQWpCLENBQ0EsZUFBaUIsQ0FBakIsQ0FFQTtFQUVBLEdBQUtoMkYsTUFBTXlNLE9BQU4sQ0FBZW9pQyxNQUFmLElBQTRCLEtBQWpDLENBQXlDLENBRXhDaW5ELFNBQVVqbkQsTUFBVixFQUVBLENBSkQsSUFJTyxDQUVOLElBQU0sTUFBUSxDQUFkLENBQWlCMzdDLEVBQUkyN0MsT0FBT2g4QyxNQUE1QixDQUFvQ0ssR0FBcEMsQ0FBMkMsQ0FFMUM0aUcsU0FBVWpuRCxPQUFRMzdDLENBQVIsQ0FBVixFQUVBLEtBQUt3bkQsUUFBTCxDQUFlMkMsVUFBZixDQUEyQkQsVUFBM0IsQ0FBdUNscUQsQ0FBdkMsRUFBNEM7RUFFNUNtcUQsWUFBY0QsVUFBZCxDQUNBQSxXQUFhLENBQWIsQ0FFQSxDQUVELENBRUQ7RUFFQSxLQUFLL0MsUUFBTCxDQUFlckgsT0FBZixFQUNBLEtBQUt1SCxZQUFMLENBQW1CLFVBQW5CLENBQStCLDBCQUFBLENBQTRCbG5CLFFBQTVCLENBQXNDLENBQXRDLENBQS9CLEVBQ0EsS0FBS2tuQixZQUFMLENBQW1CLFFBQW5CLENBQTZCLDBCQUFBLENBQTRCOUgsT0FBNUIsQ0FBcUMsQ0FBckMsQ0FBN0IsRUFDQSxLQUFLOEgsWUFBTCxDQUFtQixJQUFuQixDQUF5QiwwQkFBQSxDQUE0QjVILEdBQTVCLENBQWlDLENBQWpDLENBQXpCLEVBR0E7RUFFQSxpQkFBQSxDQUFtQnpELEtBQW5CLENBQTJCLENBRTFCLEtBQUEsQ0FBT3Y1QyxDQUFQLENBQVU0bkcsU0FBVixDQUVBLGdCQUFrQmxxRSxTQUFTeGdDLE1BQVQsQ0FBa0IsQ0FBcEMsQ0FDQSxXQUFhcThDLE1BQU0rbkQsYUFBTixDQUFxQmpCLGFBQXJCLENBQWIsQ0FFQSxrQkFBb0I1akUsT0FBTzhjLEtBQTNCLENBQ0EsZUFBaUI5YyxPQUFPb2pFLEtBQXhCLENBRUE7RUFFQSxHQUFLMkIsV0FBVzlCLFdBQVgsQ0FBd0JtSSxhQUF4QixJQUE0QyxLQUFqRCxDQUF5RCxDQUV4REEsY0FBZ0JBLGNBQWM1cUcsT0FBZCxFQUFoQixDQUVBO0VBRUEsSUFBTU0sRUFBSSxDQUFKLENBQU95QyxFQUFJOG5HLFdBQVc1cUcsTUFBNUIsQ0FBb0NLLEVBQUl5QyxDQUF4QyxDQUEyQ3pDLEdBQTNDLENBQWtELENBRWpEcXFHLFVBQVlFLFdBQVl2cUcsQ0FBWixDQUFaLENBRUEsR0FBS2lrRyxXQUFXOUIsV0FBWCxDQUF3QmtJLFNBQXhCLElBQXdDLElBQTdDLENBQW9ELENBRW5ERSxXQUFZdnFHLENBQVosRUFBa0JxcUcsVUFBVTNxRyxPQUFWLEVBQWxCLENBRUEsQ0FFRCxDQUVELENBRUQsVUFBWXVrRyxXQUFXNUIsZ0JBQVgsQ0FBNkJpSSxhQUE3QixDQUE0Q0MsVUFBNUMsQ0FBWixDQUVBO0VBRUEsSUFBTXZxRyxFQUFJLENBQUosQ0FBT3lDLEVBQUk4bkcsV0FBVzVxRyxNQUE1QixDQUFvQ0ssRUFBSXlDLENBQXhDLENBQTJDekMsR0FBM0MsQ0FBa0QsQ0FFakRxcUcsVUFBWUUsV0FBWXZxRyxDQUFaLENBQVosQ0FDQXNxRyxjQUFnQkEsY0FBYzNpRyxNQUFkLENBQXNCMGlHLFNBQXRCLENBQWhCLENBRUEsQ0FFRDtFQUVBLElBQU1ycUcsRUFBSSxDQUFKLENBQU95QyxFQUFJNm5HLGNBQWMzcUcsTUFBL0IsQ0FBdUNLLEVBQUl5QyxDQUEzQyxDQUE4Q3pDLEdBQTlDLENBQXFELENBRXBELFdBQWFzcUcsY0FBZXRxRyxDQUFmLENBQWIsQ0FFQW1nQyxTQUFTaGhDLElBQVQsQ0FBZTQvQyxPQUFPeHNDLENBQXRCLENBQXlCd3NDLE9BQU9oOEIsQ0FBaEMsQ0FBbUMsQ0FBbkMsRUFDQXc4QixRQUFRcGdELElBQVIsQ0FBYyxDQUFkLENBQWlCLENBQWpCLENBQW9CLENBQXBCLEVBQ0FzZ0QsSUFBSXRnRCxJQUFKLENBQVU0L0MsT0FBT3hzQyxDQUFqQixDQUFvQndzQyxPQUFPaDhCLENBQTNCLEVBQWdDO0VBRWhDLENBRUQ7RUFFQSxJQUFNL2lCLEVBQUksQ0FBSixDQUFPeUMsRUFBSXM3QyxNQUFNcCtDLE1BQXZCLENBQStCSyxFQUFJeUMsQ0FBbkMsQ0FBc0N6QyxHQUF0QyxDQUE2QyxDQUU1QyxTQUFXKzlDLE1BQU8vOUMsQ0FBUCxDQUFYLENBRUEsTUFBUWcvQyxLQUFNLENBQU4sRUFBWXdyRCxXQUFwQixDQUNBLE1BQVF4ckQsS0FBTSxDQUFOLEVBQVl3ckQsV0FBcEIsQ0FDQSxNQUFReHJELEtBQU0sQ0FBTixFQUFZd3JELFdBQXBCLENBRUExcUQsUUFBUTNnRCxJQUFSLENBQWN1RCxDQUFkLENBQWlCRixDQUFqQixDQUFvQlcsQ0FBcEIsRUFDQSttRCxZQUFjLENBQWQsQ0FFQSxDQUVELENBRUQsQ0FFRHVnRCxvQkFBb0J2eEcsU0FBcEIsQ0FBZ0NELE9BQU9pQixNQUFQLENBQWUrc0QsZUFBZS90RCxTQUE5QixDQUFoQyxDQUNBdXhHLG9CQUFvQnZ4RyxTQUFwQixDQUE4QnNDLFdBQTlCLENBQTRDaXZHLG1CQUE1QyxDQUVBQSxvQkFBb0J2eEcsU0FBcEIsQ0FBOEJ3aUMsTUFBOUIsQ0FBdUMsVUFBWSxDQUVsRCxTQUFXdXJCLGVBQWUvdEQsU0FBZixDQUF5QndpQyxNQUF6QixDQUFnQzlnQyxJQUFoQyxDQUFzQyxJQUF0QyxDQUFYLENBRUEsV0FBYSxLQUFLbWhELFVBQUwsQ0FBZ0JKLE1BQTdCLENBRUEsY0FBZUEsTUFBUixDQUFnQnRzQyxJQUFoQixDQUFQLENBRUEsQ0FSRCxDQVVBO0VBRUEsZUFBQSxDQUFpQnNzQyxNQUFqQixDQUF5QnRzQyxJQUF6QixDQUFnQyxDQUUvQkEsS0FBS3NzQyxNQUFMLENBQWMsRUFBZCxDQUVBLEdBQUs3dUMsTUFBTXlNLE9BQU4sQ0FBZW9pQyxNQUFmLENBQUwsQ0FBK0IsQ0FFOUIsSUFBTSxNQUFRLENBQVIsQ0FBV2w1QyxFQUFJazVDLE9BQU9oOEMsTUFBNUIsQ0FBb0NLLEVBQUl5QyxDQUF4QyxDQUEyQ3pDLEdBQTNDLENBQWtELENBRWpELFVBQVkyN0MsT0FBUTM3QyxDQUFSLENBQVosQ0FFQXFQLEtBQUtzc0MsTUFBTCxDQUFZeDhDLElBQVosQ0FBa0I2OEMsTUFBTTNoQixJQUF4QixFQUVBLENBRUQsQ0FWRCxJQVVPLENBRU5ockIsS0FBS3NzQyxNQUFMLENBQVl4OEMsSUFBWixDQUFrQnc4QyxPQUFPdGhCLElBQXpCLEVBRUEsQ0FFRCxXQUFBLENBRUEsQ0FFRDs7O0tBS0Esc0JBQUEsQ0FBd0I0RixRQUF4QixDQUFrQ3lxRSxjQUFsQyxDQUFtRCxDQUVsRHpqRCxlQUFlcnNELElBQWYsQ0FBcUIsSUFBckIsRUFFQSxLQUFLRCxJQUFMLENBQVksZUFBWixDQUVBLEtBQUtvaEQsVUFBTCxDQUFrQixDQUNqQjJ1RCxlQUFnQkEsY0FEQyxDQUFsQixDQUlBQSxlQUFtQkEsaUJBQW1CcHNHLFNBQXJCLENBQW1Db3NHLGNBQW5DLENBQW9ELENBQXJFLENBRUE7RUFFQSxhQUFlLEVBQWYsQ0FFQTtFQUVBLGlCQUFtQjdvRyxLQUFLaW1CLEdBQUwsQ0FBVW5FLE1BQU1oQyxPQUFOLENBQWdCK29GLGNBQTFCLENBQW5CLENBQ0EsU0FBVyxDQUFFLENBQUYsQ0FBSyxDQUFMLENBQVgsQ0FBcUIzUSxNQUFRLEVBQTdCLENBQWlDdm9DLEtBQWpDLENBQXdDQyxLQUF4QyxDQUNBLE9BQUEsQ0FBU2x5RCxLQUFPLENBQUUsR0FBRixDQUFPLEdBQVAsQ0FBWSxHQUFaLENBQWhCLENBRUE7RUFFQSxhQUFBLENBRUEsR0FBSzBnQyxTQUFTSSxnQkFBZCxDQUFpQyxDQUVoQ3lvQixVQUFZLFlBQUEsRUFBWixDQUNBQSxVQUFVM0osa0JBQVYsQ0FBOEJsZixRQUE5QixFQUVBLENBTEQsSUFLTyxDQUVONm9CLFVBQVk3b0IsU0FBU3RiLEtBQVQsRUFBWixDQUVBLENBRURta0MsVUFBVTFHLGFBQVYsR0FDQTBHLFVBQVU5SSxrQkFBVixHQUVBLG1CQUFxQjhJLFVBQVUzb0IsUUFBL0IsQ0FDQSxVQUFZMm9CLFVBQVUvSyxLQUF0QixDQUVBO0VBRUEsSUFBTSxNQUFRLENBQVIsQ0FBV3Q3QyxFQUFJczdDLE1BQU1wK0MsTUFBM0IsQ0FBbUNLLEVBQUl5QyxDQUF2QyxDQUEwQ3pDLEdBQTFDLENBQWlELENBRWhELFNBQVcrOUMsTUFBTy85QyxDQUFQLENBQVgsQ0FFQSxJQUFNLE1BQVEsQ0FBZCxDQUFpQjRiLEVBQUksQ0FBckIsQ0FBd0JBLEdBQXhCLENBQStCLENBRTlCNDFDLE1BQVF4UyxLQUFNei9DLEtBQU1xYyxDQUFOLENBQU4sQ0FBUixDQUNBNjFDLE1BQVF6UyxLQUFNei9DLEtBQU0sQ0FBRXFjLEVBQUksQ0FBTixFQUFZLENBQWxCLENBQU4sQ0FBUixDQUNBbytFLEtBQU0sQ0FBTixFQUFZbjRGLEtBQUs2RSxHQUFMLENBQVU4cUQsS0FBVixDQUFpQkMsS0FBakIsQ0FBWixDQUNBdW9DLEtBQU0sQ0FBTixFQUFZbjRGLEtBQUs4RSxHQUFMLENBQVU2cUQsS0FBVixDQUFpQkMsS0FBakIsQ0FBWixDQUVBaHlELElBQU11NkYsS0FBTSxDQUFOLEVBQVksR0FBWixDQUFrQkEsS0FBTSxDQUFOLENBQXhCLENBRUEsR0FBS0QsTUFBT3Q2RixHQUFQLElBQWlCbkIsU0FBdEIsQ0FBa0MsQ0FFakN5N0YsTUFBT3Q2RixHQUFQLEVBQWUsQ0FBRXNsRCxPQUFRaTFDLEtBQU0sQ0FBTixDQUFWLENBQXFCaDFDLE9BQVFnMUMsS0FBTSxDQUFOLENBQTdCLENBQXdDMlEsTUFBTzNxRyxDQUEvQyxDQUFrRDRxRyxNQUFPdHNHLFNBQXpELENBQWYsQ0FFQSxDQUpELElBSU8sQ0FFTnk3RixNQUFPdDZGLEdBQVAsRUFBYW1yRyxLQUFiLENBQXFCNXFHLENBQXJCLENBRUEsQ0FFRCxDQUVELENBRUQ7RUFFQSxJQUFNUCxHQUFOLFNBQUEsQ0FBcUIsQ0FFcEIsTUFBUXM2RixNQUFPdDZGLEdBQVAsQ0FBUixDQUVBO0VBRUEsR0FBS2tDLEVBQUVpcEcsS0FBRixHQUFZdHNHLFNBQVosRUFBeUJ5L0MsTUFBT3A4QyxFQUFFZ3BHLEtBQVQsRUFBaUJ2eUUsTUFBakIsQ0FBd0JsUyxHQUF4QixDQUE2QjYzQixNQUFPcDhDLEVBQUVpcEcsS0FBVCxFQUFpQnh5RSxNQUE5QyxHQUEwRHl5RSxZQUF4RixDQUF1RyxDQUV0RyxXQUFhQyxlQUFnQm5wRyxFQUFFb2pELE1BQWxCLENBQWIsQ0FDQTVrQixTQUFTaGhDLElBQVQsQ0FBZTQvQyxPQUFPeHNDLENBQXRCLENBQXlCd3NDLE9BQU9oOEIsQ0FBaEMsQ0FBbUNnOEIsT0FBT24xQixDQUExQyxFQUVBbTFCLE9BQVMrckQsZUFBZ0JucEcsRUFBRXFqRCxNQUFsQixDQUFULENBQ0E3a0IsU0FBU2hoQyxJQUFULENBQWU0L0MsT0FBT3hzQyxDQUF0QixDQUF5QndzQyxPQUFPaDhCLENBQWhDLENBQW1DZzhCLE9BQU9uMUIsQ0FBMUMsRUFFQSxDQUVELENBRUQ7RUFFQSxLQUFLeTlCLFlBQUwsQ0FBbUIsVUFBbkIsQ0FBK0IsMEJBQUEsQ0FBNEJsbkIsUUFBNUIsQ0FBc0MsQ0FBdEMsQ0FBL0IsRUFFQSxDQUVENHFFLGNBQWM3eEcsU0FBZCxDQUEwQkQsT0FBT2lCLE1BQVAsQ0FBZStzRCxlQUFlL3RELFNBQTlCLENBQTFCLENBQ0E2eEcsY0FBYzd4RyxTQUFkLENBQXdCc0MsV0FBeEIsQ0FBc0N1dkcsYUFBdEMsQ0FFQTs7OztFQU9BLHlCQUFBLENBQTJCQyxTQUEzQixDQUFzQ0MsWUFBdEMsQ0FBb0RqdkUsTUFBcEQsQ0FBNER3Z0UsY0FBNUQsQ0FBNEV2ekMsY0FBNUUsQ0FBNEZpaUQsU0FBNUYsQ0FBdUdyQyxVQUF2RyxDQUFtSEMsV0FBbkgsQ0FBaUksQ0FFaElocUQsU0FBU2xrRCxJQUFULENBQWUsSUFBZixFQUVBLEtBQUtELElBQUwsQ0FBWSxrQkFBWixDQUVBLEtBQUtvaEQsVUFBTCxDQUFrQixDQUNqQml2RCxVQUFXQSxTQURNLENBRWpCQyxhQUFjQSxZQUZHLENBR2pCanZFLE9BQVFBLE1BSFMsQ0FJakJ3Z0UsZUFBZ0JBLGNBSkMsQ0FLakJ2ekMsZUFBZ0JBLGNBTEMsQ0FNakJpaUQsVUFBV0EsU0FOTSxDQU9qQnJDLFdBQVlBLFVBUEssQ0FRakJDLFlBQWFBLFdBUkksQ0FBbEIsQ0FXQSxLQUFLM3BELGtCQUFMLENBQXlCLDBCQUFBLENBQTRCNnJELFNBQTVCLENBQXVDQyxZQUF2QyxDQUFxRGp2RSxNQUFyRCxDQUE2RHdnRSxjQUE3RCxDQUE2RXZ6QyxjQUE3RSxDQUE2RmlpRCxTQUE3RixDQUF3R3JDLFVBQXhHLENBQW9IQyxXQUFwSCxDQUF6QixFQUNBLEtBQUsxbUQsYUFBTCxHQUVBLENBRUQrb0QsaUJBQWlCanlHLFNBQWpCLENBQTZCRCxPQUFPaUIsTUFBUCxDQUFlNGtELFNBQVM1bEQsU0FBeEIsQ0FBN0IsQ0FDQWl5RyxpQkFBaUJqeUcsU0FBakIsQ0FBMkJzQyxXQUEzQixDQUF5QzJ2RyxnQkFBekMsQ0FFQTtFQUVBLCtCQUFBLENBQWlDSCxTQUFqQyxDQUE0Q0MsWUFBNUMsQ0FBMERqdkUsTUFBMUQsQ0FBa0V3Z0UsY0FBbEUsQ0FBa0Z2ekMsY0FBbEYsQ0FBa0dpaUQsU0FBbEcsQ0FBNkdyQyxVQUE3RyxDQUF5SEMsV0FBekgsQ0FBdUksQ0FFdEk3aEQsZUFBZXJzRCxJQUFmLENBQXFCLElBQXJCLEVBRUEsS0FBS0QsSUFBTCxDQUFZLHdCQUFaLENBRUEsS0FBS29oRCxVQUFMLENBQWtCLENBQ2pCaXZELFVBQVdBLFNBRE0sQ0FFakJDLGFBQWNBLFlBRkcsQ0FHakJqdkUsT0FBUUEsTUFIUyxDQUlqQndnRSxlQUFnQkEsY0FKQyxDQUtqQnZ6QyxlQUFnQkEsY0FMQyxDQU1qQmlpRCxVQUFXQSxTQU5NLENBT2pCckMsV0FBWUEsVUFQSyxDQVFqQkMsWUFBYUEsV0FSSSxDQUFsQixDQVdBLFVBQVksSUFBWixDQUVBa0MsVUFBWUEsWUFBYzFzRyxTQUFkLENBQTBCMHNHLFNBQTFCLENBQXNDLENBQWxELENBQ0FDLGFBQWVBLGVBQWlCM3NHLFNBQWpCLENBQTZCMnNHLFlBQTdCLENBQTRDLENBQTNELENBQ0FqdkUsT0FBU0EsUUFBVSxDQUFuQixDQUVBd2dFLGVBQWlCMzZGLEtBQUtFLEtBQUwsQ0FBWXk2RixjQUFaLEdBQWdDLENBQWpELENBQ0F2ekMsZUFBaUJwbkQsS0FBS0UsS0FBTCxDQUFZa25ELGNBQVosR0FBZ0MsQ0FBakQsQ0FFQWlpRCxVQUFZQSxZQUFjNXNHLFNBQWQsQ0FBMEI0c0csU0FBMUIsQ0FBc0MsS0FBbEQsQ0FDQXJDLFdBQWFBLGFBQWV2cUcsU0FBZixDQUEyQnVxRyxVQUEzQixDQUF3QyxHQUFyRCxDQUNBQyxZQUFjQSxjQUFnQnhxRyxTQUFoQixDQUE0QndxRyxXQUE1QixDQUEwQ2puRyxLQUFLK2YsRUFBTCxDQUFVLENBQWxFLENBRUE7RUFFQSxZQUFjLEVBQWQsQ0FDQSxhQUFlLEVBQWYsQ0FDQSxZQUFjLEVBQWQsQ0FDQSxRQUFVLEVBQVYsQ0FFQTtFQUVBLFVBQVksQ0FBWixDQUNBLGVBQWlCLEVBQWpCLENBQ0EsZUFBaUJvYSxPQUFTLENBQTFCLENBQ0EsZUFBaUIsQ0FBakIsQ0FFQTtFQUVBb3ZFLGdCQUVBLEdBQUtGLFlBQWMsS0FBbkIsQ0FBMkIsQ0FFMUIsR0FBS0YsVUFBWSxDQUFqQixDQUFxQkssWUFBYSxJQUFiLEVBQ3JCLEdBQUtKLGFBQWUsQ0FBcEIsQ0FBd0JJLFlBQWEsS0FBYixFQUV4QixDQUVEO0VBRUEsS0FBS2xrRCxRQUFMLENBQWVySCxPQUFmLEVBQ0EsS0FBS3VILFlBQUwsQ0FBbUIsVUFBbkIsQ0FBK0IsMEJBQUEsQ0FBNEJsbkIsUUFBNUIsQ0FBc0MsQ0FBdEMsQ0FBL0IsRUFDQSxLQUFLa25CLFlBQUwsQ0FBbUIsUUFBbkIsQ0FBNkIsMEJBQUEsQ0FBNEI5SCxPQUE1QixDQUFxQyxDQUFyQyxDQUE3QixFQUNBLEtBQUs4SCxZQUFMLENBQW1CLElBQW5CLENBQXlCLDBCQUFBLENBQTRCNUgsR0FBNUIsQ0FBaUMsQ0FBakMsQ0FBekIsRUFFQSxzQkFBQSxFQUF5QixDQUV4QixLQUFBLENBQU8xOEIsQ0FBUCxDQUNBLFdBQWEsV0FBQSxFQUFiLENBQ0EsV0FBYSxXQUFBLEVBQWIsQ0FFQSxlQUFpQixDQUFqQixDQUVBO0VBQ0EsVUFBWSxDQUFFa29GLGFBQWVELFNBQWpCLEVBQStCaHZFLE1BQTNDLENBRUE7RUFFQSxJQUFNalosRUFBSSxDQUFWLENBQWFBLEdBQUtrbUMsY0FBbEIsQ0FBa0NsbUMsR0FBbEMsQ0FBeUMsQ0FFeEMsYUFBZSxFQUFmLENBRUEsTUFBUUEsRUFBSWttQyxjQUFaLENBRUE7RUFFQSxXQUFhNTJDLEdBQU00NEYsYUFBZUQsU0FBckIsRUFBbUNBLFNBQWhELENBRUEsSUFBTXo0RixFQUFJLENBQVYsQ0FBYUEsR0FBS2lxRixjQUFsQixDQUFrQ2pxRixHQUFsQyxDQUF5QyxDQUV4QyxNQUFRQSxFQUFJaXFGLGNBQVosQ0FFQSxVQUFZcnZELEVBQUkyN0QsV0FBSixDQUFrQkQsVUFBOUIsQ0FFQSxhQUFlaG5HLEtBQUtrbUIsR0FBTCxDQUFVbUksS0FBVixDQUFmLENBQ0EsYUFBZXJ1QixLQUFLaW1CLEdBQUwsQ0FBVW9JLEtBQVYsQ0FBZixDQUVBO0VBRUE2dUIsT0FBT3hzQyxDQUFQLENBQVdtbUIsT0FBUzR5RSxRQUFwQixDQUNBdnNELE9BQU9oOEIsQ0FBUCxDQUFXLENBQUUxUSxDQUFGLENBQU0ycEIsTUFBTixDQUFla3ZDLFVBQTFCLENBQ0Fuc0IsT0FBT24xQixDQUFQLENBQVc4TyxPQUFTNnlFLFFBQXBCLENBQ0FwckUsU0FBU2hoQyxJQUFULENBQWU0L0MsT0FBT3hzQyxDQUF0QixDQUF5QndzQyxPQUFPaDhCLENBQWhDLENBQW1DZzhCLE9BQU9uMUIsQ0FBMUMsRUFFQTtFQUVBd08sT0FBTzluQixHQUFQLENBQVlnN0YsUUFBWixDQUFzQkUsS0FBdEIsQ0FBNkJELFFBQTdCLEVBQXdDaGxGLFNBQXhDLEdBQ0FnNUIsUUFBUXBnRCxJQUFSLENBQWNpNUIsT0FBTzdsQixDQUFyQixDQUF3QjZsQixPQUFPclYsQ0FBL0IsQ0FBa0NxVixPQUFPeE8sQ0FBekMsRUFFQTtFQUVBNjFCLElBQUl0Z0QsSUFBSixDQUFVZ3VDLENBQVYsQ0FBYSxFQUFJOTZCLENBQWpCLEVBRUE7RUFFQW81RixTQUFTdHNHLElBQVQsQ0FBZXlILE9BQWYsRUFFQSxDQUVEO0VBRUE4a0csV0FBV3ZzRyxJQUFYLENBQWlCc3NHLFFBQWpCLEVBRUEsQ0FFRDtFQUVBLElBQU1sNUYsRUFBSSxDQUFWLENBQWFBLEVBQUlpcUYsY0FBakIsQ0FBaUNqcUYsR0FBakMsQ0FBd0MsQ0FFdkMsSUFBTXdRLEVBQUksQ0FBVixDQUFhQSxFQUFJa21DLGNBQWpCLENBQWlDbG1DLEdBQWpDLENBQXdDO0VBSXZDLE1BQVEyb0YsV0FBWTNvRixDQUFaLEVBQWlCeFEsQ0FBakIsQ0FBUixDQUNBLE1BQVFtNUYsV0FBWTNvRixFQUFJLENBQWhCLEVBQXFCeFEsQ0FBckIsQ0FBUixDQUNBLE1BQVFtNUYsV0FBWTNvRixFQUFJLENBQWhCLEVBQXFCeFEsRUFBSSxDQUF6QixDQUFSLENBQ0EsTUFBUW01RixXQUFZM29GLENBQVosRUFBaUJ4USxFQUFJLENBQXJCLENBQVIsQ0FFQTtFQUVBdXRDLFFBQVEzZ0QsSUFBUixDQUFjdUQsQ0FBZCxDQUFpQkYsQ0FBakIsQ0FBb0I0bkIsQ0FBcEIsRUFDQTAxQixRQUFRM2dELElBQVIsQ0FBY3FELENBQWQsQ0FBaUJXLENBQWpCLENBQW9CaW5CLENBQXBCLEVBRUE7RUFFQTgvQixZQUFjLENBQWQsQ0FFQSxDQUVELENBRUQ7RUFFQTlwQixNQUFNb25CLFFBQU4sQ0FBZ0IyQyxVQUFoQixDQUE0QkQsVUFBNUIsQ0FBd0MsQ0FBeEMsRUFFQTtFQUVBQyxZQUFjRCxVQUFkLENBRUEsQ0FFRCxvQkFBQSxDQUFzQnY0QixHQUF0QixDQUE0QixDQUUzQixLQUFBLENBQU9nNkUsZ0JBQVAsQ0FBeUJDLGNBQXpCLENBRUEsT0FBUyxXQUFBLEVBQVQsQ0FDQSxXQUFhLFdBQUEsRUFBYixDQUVBLGVBQWlCLENBQWpCLENBRUEsV0FBZWo2RSxNQUFRLElBQVYsQ0FBbUJxNUUsU0FBbkIsQ0FBK0JDLFlBQTVDLENBQ0EsU0FBYXQ1RSxNQUFRLElBQVYsQ0FBbUIsQ0FBbkIsQ0FBdUIsQ0FBRSxDQUFwQyxDQUVBO0VBQ0FnNkUsaUJBQW1CL2tHLEtBQW5CLENBRUE7RUFDQTtFQUNBO0VBRUEsSUFBTTJMLEVBQUksQ0FBVixDQUFhQSxHQUFLaXFGLGNBQWxCLENBQWtDanFGLEdBQWxDLENBQXlDO0VBSXhDNHRCLFNBQVNoaEMsSUFBVCxDQUFlLENBQWYsQ0FBa0IrckUsV0FBYXZxRCxJQUEvQixDQUFxQyxDQUFyQyxFQUVBO0VBRUE0K0IsUUFBUXBnRCxJQUFSLENBQWMsQ0FBZCxDQUFpQndoQixJQUFqQixDQUF1QixDQUF2QixFQUVBO0VBRUE4K0IsSUFBSXRnRCxJQUFKLENBQVUsR0FBVixDQUFlLEdBQWYsRUFFQTtFQUVBeUgsUUFFQSxDQUVEO0VBRUFnbEcsZUFBaUJobEcsS0FBakIsQ0FFQTtFQUVBLElBQU0yTCxFQUFJLENBQVYsQ0FBYUEsR0FBS2lxRixjQUFsQixDQUFrQ2pxRixHQUFsQyxDQUF5QyxDQUV4QyxNQUFRQSxFQUFJaXFGLGNBQVosQ0FDQSxVQUFZcnZELEVBQUkyN0QsV0FBSixDQUFrQkQsVUFBOUIsQ0FFQSxhQUFlaG5HLEtBQUtpbUIsR0FBTCxDQUFVb0ksS0FBVixDQUFmLENBQ0EsYUFBZXJ1QixLQUFLa21CLEdBQUwsQ0FBVW1JLEtBQVYsQ0FBZixDQUVBO0VBRUE2dUIsT0FBT3hzQyxDQUFQLENBQVdtbUIsT0FBUzR5RSxRQUFwQixDQUNBdnNELE9BQU9oOEIsQ0FBUCxDQUFXbW9ELFdBQWF2cUQsSUFBeEIsQ0FDQW8rQixPQUFPbjFCLENBQVAsQ0FBVzhPLE9BQVM2eUUsUUFBcEIsQ0FDQXByRSxTQUFTaGhDLElBQVQsQ0FBZTQvQyxPQUFPeHNDLENBQXRCLENBQXlCd3NDLE9BQU9oOEIsQ0FBaEMsQ0FBbUNnOEIsT0FBT24xQixDQUExQyxFQUVBO0VBRUEyMUIsUUFBUXBnRCxJQUFSLENBQWMsQ0FBZCxDQUFpQndoQixJQUFqQixDQUF1QixDQUF2QixFQUVBO0VBRUFnYyxHQUFHcHFCLENBQUgsQ0FBU2c1RixTQUFXLEdBQWIsQ0FBcUIsR0FBNUIsQ0FDQTV1RSxHQUFHNVosQ0FBSCxDQUFTdW9GLFNBQVcsR0FBWCxDQUFpQjNxRixJQUFuQixDQUE0QixHQUFuQyxDQUNBOCtCLElBQUl0Z0QsSUFBSixDQUFVdzlCLEdBQUdwcUIsQ0FBYixDQUFnQm9xQixHQUFHNVosQ0FBbkIsRUFFQTtFQUVBbmMsUUFFQSxDQUVEO0VBRUEsSUFBTTJMLEVBQUksQ0FBVixDQUFhQSxFQUFJaXFGLGNBQWpCLENBQWlDanFGLEdBQWpDLENBQXdDLENBRXZDLE1BQVFvNUYsaUJBQW1CcDVGLENBQTNCLENBQ0EsTUFBUXE1RixlQUFpQnI1RixDQUF6QixDQUVBLEdBQUtvZixNQUFRLElBQWIsQ0FBb0I7RUFJbkJtdUIsUUFBUTNnRCxJQUFSLENBQWNhLENBQWQsQ0FBaUJBLEVBQUksQ0FBckIsQ0FBd0JtRCxDQUF4QixFQUVBLENBTkQsSUFNTztFQUlOMjhDLFFBQVEzZ0QsSUFBUixDQUFjYSxFQUFJLENBQWxCLENBQXFCQSxDQUFyQixDQUF3Qm1ELENBQXhCLEVBRUEsQ0FFRCttRCxZQUFjLENBQWQsQ0FFQSxDQUVEO0VBRUE5cEIsTUFBTW9uQixRQUFOLENBQWdCMkMsVUFBaEIsQ0FBNEJELFVBQTVCLENBQXdDdjRCLE1BQVEsSUFBUixDQUFlLENBQWYsQ0FBbUIsQ0FBM0QsRUFFQTtFQUVBdzRCLFlBQWNELFVBQWQsQ0FFQSxDQUVELENBRUQyaEQsdUJBQXVCM3lHLFNBQXZCLENBQW1DRCxPQUFPaUIsTUFBUCxDQUFlK3NELGVBQWUvdEQsU0FBOUIsQ0FBbkMsQ0FDQTJ5Ryx1QkFBdUIzeUcsU0FBdkIsQ0FBaUNzQyxXQUFqQyxDQUErQ3F3RyxzQkFBL0MsQ0FFQTs7O0VBTUEscUJBQUEsQ0FBdUJuekUsTUFBdkIsQ0FBK0JzRCxNQUEvQixDQUF1Q3dnRSxjQUF2QyxDQUF1RHZ6QyxjQUF2RCxDQUF1RWlpRCxTQUF2RSxDQUFrRnJDLFVBQWxGLENBQThGQyxXQUE5RixDQUE0RyxDQUUzR3FDLGlCQUFpQnZ3RyxJQUFqQixDQUF1QixJQUF2QixDQUE2QixDQUE3QixDQUFnQzg5QixNQUFoQyxDQUF3Q3NELE1BQXhDLENBQWdEd2dFLGNBQWhELENBQWdFdnpDLGNBQWhFLENBQWdGaWlELFNBQWhGLENBQTJGckMsVUFBM0YsQ0FBdUdDLFdBQXZHLEVBRUEsS0FBS251RyxJQUFMLENBQVksY0FBWixDQUVBLEtBQUtvaEQsVUFBTCxDQUFrQixDQUNqQnJqQixPQUFRQSxNQURTLENBRWpCc0QsT0FBUUEsTUFGUyxDQUdqQndnRSxlQUFnQkEsY0FIQyxDQUlqQnZ6QyxlQUFnQkEsY0FKQyxDQUtqQmlpRCxVQUFXQSxTQUxNLENBTWpCckMsV0FBWUEsVUFOSyxDQU9qQkMsWUFBYUEsV0FQSSxDQUFsQixDQVVBLENBRURnRCxhQUFhNXlHLFNBQWIsQ0FBeUJELE9BQU9pQixNQUFQLENBQWVpeEcsaUJBQWlCanlHLFNBQWhDLENBQXpCLENBQ0E0eUcsYUFBYTV5RyxTQUFiLENBQXVCc0MsV0FBdkIsQ0FBcUNzd0csWUFBckMsQ0FFQTtFQUVBLDJCQUFBLENBQTZCcHpFLE1BQTdCLENBQXFDc0QsTUFBckMsQ0FBNkN3Z0UsY0FBN0MsQ0FBNkR2ekMsY0FBN0QsQ0FBNkVpaUQsU0FBN0UsQ0FBd0ZyQyxVQUF4RixDQUFvR0MsV0FBcEcsQ0FBa0gsQ0FFakgrQyx1QkFBdUJqeEcsSUFBdkIsQ0FBNkIsSUFBN0IsQ0FBbUMsQ0FBbkMsQ0FBc0M4OUIsTUFBdEMsQ0FBOENzRCxNQUE5QyxDQUFzRHdnRSxjQUF0RCxDQUFzRXZ6QyxjQUF0RSxDQUFzRmlpRCxTQUF0RixDQUFpR3JDLFVBQWpHLENBQTZHQyxXQUE3RyxFQUVBLEtBQUtudUcsSUFBTCxDQUFZLG9CQUFaLENBRUEsS0FBS29oRCxVQUFMLENBQWtCLENBQ2pCcmpCLE9BQVFBLE1BRFMsQ0FFakJzRCxPQUFRQSxNQUZTLENBR2pCd2dFLGVBQWdCQSxjQUhDLENBSWpCdnpDLGVBQWdCQSxjQUpDLENBS2pCaWlELFVBQVdBLFNBTE0sQ0FNakJyQyxXQUFZQSxVQU5LLENBT2pCQyxZQUFhQSxXQVBJLENBQWxCLENBVUEsQ0FFRGlELG1CQUFtQjd5RyxTQUFuQixDQUErQkQsT0FBT2lCLE1BQVAsQ0FBZTJ4Ryx1QkFBdUIzeUcsU0FBdEMsQ0FBL0IsQ0FDQTZ5RyxtQkFBbUI3eUcsU0FBbkIsQ0FBNkJzQyxXQUE3QixDQUEyQ3V3RyxrQkFBM0MsQ0FFQTs7Ozs7RUFRQSx1QkFBQSxDQUF5QnJ6RSxNQUF6QixDQUFpQ214RSxRQUFqQyxDQUEyQ2hCLFVBQTNDLENBQXVEQyxXQUF2RCxDQUFxRSxDQUVwRWhxRCxTQUFTbGtELElBQVQsQ0FBZSxJQUFmLEVBRUEsS0FBS0QsSUFBTCxDQUFZLGdCQUFaLENBRUEsS0FBS29oRCxVQUFMLENBQWtCLENBQ2pCcmpCLE9BQVFBLE1BRFMsQ0FFakJteEUsU0FBVUEsUUFGTyxDQUdqQmhCLFdBQVlBLFVBSEssQ0FJakJDLFlBQWFBLFdBSkksQ0FBbEIsQ0FPQSxLQUFLM3BELGtCQUFMLENBQXlCLHdCQUFBLENBQTBCem1CLE1BQTFCLENBQWtDbXhFLFFBQWxDLENBQTRDaEIsVUFBNUMsQ0FBd0RDLFdBQXhELENBQXpCLEVBQ0EsS0FBSzFtRCxhQUFMLEdBRUEsQ0FFRDRwRCxlQUFlOXlHLFNBQWYsQ0FBMkJELE9BQU9pQixNQUFQLENBQWU0a0QsU0FBUzVsRCxTQUF4QixDQUEzQixDQUNBOHlHLGVBQWU5eUcsU0FBZixDQUF5QnNDLFdBQXpCLENBQXVDd3dHLGNBQXZDLENBRUE7RUFFQSw2QkFBQSxDQUErQnR6RSxNQUEvQixDQUF1Q214RSxRQUF2QyxDQUFpRGhCLFVBQWpELENBQTZEQyxXQUE3RCxDQUEyRSxDQUUxRTdoRCxlQUFlcnNELElBQWYsQ0FBcUIsSUFBckIsRUFFQSxLQUFLRCxJQUFMLENBQVksc0JBQVosQ0FFQSxLQUFLb2hELFVBQUwsQ0FBa0IsQ0FDakJyakIsT0FBUUEsTUFEUyxDQUVqQm14RSxTQUFVQSxRQUZPLENBR2pCaEIsV0FBWUEsVUFISyxDQUlqQkMsWUFBYUEsV0FKSSxDQUFsQixDQU9BcHdFLE9BQVNBLFFBQVUsQ0FBbkIsQ0FDQW14RSxTQUFXQSxXQUFhdnJHLFNBQWIsQ0FBeUJ1RCxLQUFLOEUsR0FBTCxDQUFVLENBQVYsQ0FBYWtqRyxRQUFiLENBQXpCLENBQW1ELENBQTlELENBRUFoQixXQUFhQSxhQUFldnFHLFNBQWYsQ0FBMkJ1cUcsVUFBM0IsQ0FBd0MsQ0FBckQsQ0FDQUMsWUFBY0EsY0FBZ0J4cUcsU0FBaEIsQ0FBNEJ3cUcsV0FBNUIsQ0FBMENqbkcsS0FBSytmLEVBQUwsQ0FBVSxDQUFsRSxDQUVBO0VBRUEsWUFBYyxFQUFkLENBQ0EsYUFBZSxFQUFmLENBQ0EsWUFBYyxFQUFkLENBQ0EsUUFBVSxFQUFWLENBRUE7RUFFQSxLQUFBLENBQU9yZixDQUFQLENBQ0EsV0FBYSxXQUFBLEVBQWIsQ0FDQSxPQUFTLFdBQUEsRUFBVCxDQUVBO0VBRUE0OUIsU0FBU2hoQyxJQUFULENBQWUsQ0FBZixDQUFrQixDQUFsQixDQUFxQixDQUFyQixFQUNBb2dELFFBQVFwZ0QsSUFBUixDQUFjLENBQWQsQ0FBaUIsQ0FBakIsQ0FBb0IsQ0FBcEIsRUFDQXNnRCxJQUFJdGdELElBQUosQ0FBVSxHQUFWLENBQWUsR0FBZixFQUVBLElBQU1vRCxFQUFJLENBQUosQ0FBT3ZDLEVBQUksQ0FBakIsQ0FBb0J1QyxHQUFLc25HLFFBQXpCLENBQW1DdG5HLElBQU12QyxHQUFLLENBQTlDLENBQWtELENBRWpELFlBQWM2b0csV0FBYXRtRyxFQUFJc25HLFFBQUosQ0FBZWYsV0FBMUMsQ0FFQTtFQUVBL3BELE9BQU94c0MsQ0FBUCxDQUFXbW1CLE9BQVM3MkIsS0FBS2ltQixHQUFMLENBQVUyaEYsT0FBVixDQUFwQixDQUNBMXFELE9BQU9oOEIsQ0FBUCxDQUFXMlYsT0FBUzcyQixLQUFLa21CLEdBQUwsQ0FBVTBoRixPQUFWLENBQXBCLENBRUF0cEUsU0FBU2hoQyxJQUFULENBQWU0L0MsT0FBT3hzQyxDQUF0QixDQUF5QndzQyxPQUFPaDhCLENBQWhDLENBQW1DZzhCLE9BQU9uMUIsQ0FBMUMsRUFFQTtFQUVBMjFCLFFBQVFwZ0QsSUFBUixDQUFjLENBQWQsQ0FBaUIsQ0FBakIsQ0FBb0IsQ0FBcEIsRUFFQTtFQUVBdzlCLEdBQUdwcUIsQ0FBSCxDQUFPLENBQUU0dEIsU0FBVW5nQyxDQUFWLEVBQWdCMDRCLE1BQWhCLENBQXlCLENBQTNCLEVBQWlDLENBQXhDLENBQ0FpRSxHQUFHNVosQ0FBSCxDQUFPLENBQUVvZCxTQUFVbmdDLEVBQUksQ0FBZCxFQUFvQjA0QixNQUFwQixDQUE2QixDQUEvQixFQUFxQyxDQUE1QyxDQUVBK21CLElBQUl0Z0QsSUFBSixDQUFVdzlCLEdBQUdwcUIsQ0FBYixDQUFnQm9xQixHQUFHNVosQ0FBbkIsRUFFQSxDQUVEO0VBRUEsSUFBTS9pQixFQUFJLENBQVYsQ0FBYUEsR0FBSzZwRyxRQUFsQixDQUE0QjdwRyxHQUE1QixDQUFtQyxDQUVsQzgvQyxRQUFRM2dELElBQVIsQ0FBY2EsQ0FBZCxDQUFpQkEsRUFBSSxDQUFyQixDQUF3QixDQUF4QixFQUVBLENBRUQ7RUFFQSxLQUFLbW5ELFFBQUwsQ0FBZXJILE9BQWYsRUFDQSxLQUFLdUgsWUFBTCxDQUFtQixVQUFuQixDQUErQiwwQkFBQSxDQUE0QmxuQixRQUE1QixDQUFzQyxDQUF0QyxDQUEvQixFQUNBLEtBQUtrbkIsWUFBTCxDQUFtQixRQUFuQixDQUE2QiwwQkFBQSxDQUE0QjlILE9BQTVCLENBQXFDLENBQXJDLENBQTdCLEVBQ0EsS0FBSzhILFlBQUwsQ0FBbUIsSUFBbkIsQ0FBeUIsMEJBQUEsQ0FBNEI1SCxHQUE1QixDQUFpQyxDQUFqQyxDQUF6QixFQUVBLENBRUR3c0QscUJBQXFCL3lHLFNBQXJCLENBQWlDRCxPQUFPaUIsTUFBUCxDQUFlK3NELGVBQWUvdEQsU0FBOUIsQ0FBakMsQ0FDQSt5RyxxQkFBcUIveUcsU0FBckIsQ0FBK0JzQyxXQUEvQixDQUE2Q3l3RyxvQkFBN0MsQ0FJQSxlQUFpQmh6RyxPQUFPaXpHLE1BQVAsQ0FBYyxDQUM5QmpTLGtCQUFtQkEsaUJBRFcsQ0FFOUJJLG1CQUFvQkEsa0JBRlUsQ0FHOUJJLHlCQUEwQkEsd0JBSEksQ0FJOUJzQixvQkFBcUJBLG1CQUpTLENBSzlCQywwQkFBMkJBLHlCQUxHLENBTTlCQyxtQkFBb0JBLGtCQU5VLENBTzlCQyx5QkFBMEJBLHdCQVBJLENBUTlCQyxvQkFBcUJBLG1CQVJTLENBUzlCQywwQkFBMkJBLHlCQVRHLENBVTlCQyxxQkFBc0JBLG9CQVZRLENBVzlCQywyQkFBNEJBLDBCQVhFLENBWTlCM0IsbUJBQW9CQSxrQkFaVSxDQWE5Qm1CLHlCQUEwQkEsd0JBYkksQ0FjOUJnQixhQUFjQSxZQWRnQixDQWU5QlEsbUJBQW9CQSxrQkFmVSxDQWdCOUJHLGtCQUFtQkEsaUJBaEJXLENBaUI5QlEsd0JBQXlCQSx1QkFqQkssQ0FrQjlCRSxjQUFlQSxhQWxCZSxDQW1COUJDLG9CQUFxQkEsbUJBbkJTLENBb0I5QmtLLGFBQWNBLFlBcEJnQixDQXFCOUJJLG1CQUFvQkEsa0JBckJVLENBc0I5QkssZUFBZ0JBLGNBdEJjLENBdUI5QkkscUJBQXNCQSxvQkF2QlEsQ0F3QjlCSyxhQUFjQSxZQXhCZ0IsQ0F5QjlCSSxtQkFBb0JBLGtCQXpCVSxDQTBCOUJ2L0MsY0FBZUEsYUExQmUsQ0EyQjlCSyxvQkFBcUJBLG1CQTNCUyxDQTRCOUJvL0MsY0FBZUEsYUE1QmUsQ0E2QjlCSyxvQkFBcUJBLG1CQTdCUyxDQThCOUJDLGNBQWVBLGFBOUJlLENBK0I5Qkssb0JBQXFCQSxtQkEvQlMsQ0FnQzlCOUgsZ0JBQWlCQSxlQWhDYSxDQWlDOUJ5RSxzQkFBdUJBLHFCQWpDTyxDQWtDOUIyRCxjQUFlQSxhQWxDZSxDQW1DOUJlLGFBQWNBLFlBbkNnQixDQW9DOUJDLG1CQUFvQkEsa0JBcENVLENBcUM5QlosaUJBQWtCQSxnQkFyQ1ksQ0FzQzlCVSx1QkFBd0JBLHNCQXRDTSxDQXVDOUJHLGVBQWdCQSxjQXZDYyxDQXdDOUJDLHFCQUFzQkEsb0JBeENRLENBeUM5QjlpRCxZQUFhQSxXQXpDaUIsQ0EwQzlCaUIsa0JBQW1CQSxpQkExQ1csQ0FBZCxDQUFqQixDQTZDQTs7Ozs7O0tBUUEsdUJBQUEsQ0FBeUJyTyxVQUF6QixDQUFzQyxDQUVyQzZRLFNBQVNoeUQsSUFBVCxDQUFlLElBQWYsRUFFQSxLQUFLRCxJQUFMLENBQVksZ0JBQVosQ0FFQSxLQUFLdXpDLEtBQUwsQ0FBYSxTQUFBLENBQVcsUUFBWCxDQUFiLENBQ0EsS0FBS2dkLFdBQUwsQ0FBbUIsSUFBbkIsQ0FFQSxLQUFLNkIsU0FBTCxDQUFnQmhSLFVBQWhCLEVBRUEsQ0FFRG9zQixlQUFlanZFLFNBQWYsQ0FBMkJELE9BQU9pQixNQUFQLENBQWUweUQsU0FBUzF6RCxTQUF4QixDQUEzQixDQUNBaXZFLGVBQWVqdkUsU0FBZixDQUF5QnNDLFdBQXpCLENBQXVDMnNFLGNBQXZDLENBRUFBLGVBQWVqdkUsU0FBZixDQUF5Qis2RixnQkFBekIsQ0FBNEMsSUFBNUMsQ0FFQTlyQixlQUFlanZFLFNBQWYsQ0FBeUIwckIsSUFBekIsQ0FBZ0MsU0FBVzVmLE1BQVgsQ0FBb0IsQ0FFbkQ0bkQsU0FBUzF6RCxTQUFULENBQW1CMHJCLElBQW5CLENBQXdCaHFCLElBQXhCLENBQThCLElBQTlCLENBQW9Db0ssTUFBcEMsRUFFQSxLQUFLa3BDLEtBQUwsQ0FBV3RwQixJQUFYLENBQWlCNWYsT0FBT2twQyxLQUF4QixFQUVBLFdBQUEsQ0FFQSxDQVJELENBVUE7O0tBSUEsMEJBQUEsQ0FBNEI2TixVQUE1QixDQUF5QyxDQUV4QzZTLGVBQWVoMEQsSUFBZixDQUFxQixJQUFyQixDQUEyQm1oRCxVQUEzQixFQUVBLEtBQUtwaEQsSUFBTCxDQUFZLG1CQUFaLENBRUEsQ0FFRHd4RyxrQkFBa0JqekcsU0FBbEIsQ0FBOEJELE9BQU9pQixNQUFQLENBQWUwMEQsZUFBZTExRCxTQUE5QixDQUE5QixDQUNBaXpHLGtCQUFrQmp6RyxTQUFsQixDQUE0QnNDLFdBQTVCLENBQTBDMndHLGlCQUExQyxDQUVBQSxrQkFBa0JqekcsU0FBbEIsQ0FBNEI2cUUsbUJBQTVCLENBQWtELElBQWxELENBRUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7S0FtREEsNkJBQUEsQ0FBK0Job0IsVUFBL0IsQ0FBNEMsQ0FFM0M2USxTQUFTaHlELElBQVQsQ0FBZSxJQUFmLEVBRUEsS0FBS3V6RCxPQUFMLENBQWUsQ0FBRSxXQUFZLEVBQWQsQ0FBZixDQUVBLEtBQUt4ekQsSUFBTCxDQUFZLHNCQUFaLENBRUEsS0FBS3V6QyxLQUFMLENBQWEsU0FBQSxDQUFXLFFBQVgsQ0FBYixDQUFvQztFQUNwQyxLQUFLc0csU0FBTCxDQUFpQixHQUFqQixDQUNBLEtBQUtDLFNBQUwsQ0FBaUIsR0FBakIsQ0FFQSxLQUFLOUUsR0FBTCxDQUFXLElBQVgsQ0FFQSxLQUFLZSxRQUFMLENBQWdCLElBQWhCLENBQ0EsS0FBS0MsaUJBQUwsQ0FBeUIsR0FBekIsQ0FFQSxLQUFLSixLQUFMLENBQWEsSUFBYixDQUNBLEtBQUtDLGNBQUwsQ0FBc0IsR0FBdEIsQ0FFQSxLQUFLMkQsUUFBTCxDQUFnQixTQUFBLENBQVcsUUFBWCxDQUFoQixDQUNBLEtBQUtpWixpQkFBTCxDQUF5QixHQUF6QixDQUNBLEtBQUt2YyxXQUFMLENBQW1CLElBQW5CLENBRUEsS0FBS0UsT0FBTCxDQUFlLElBQWYsQ0FDQSxLQUFLQyxTQUFMLENBQWlCLENBQWpCLENBRUEsS0FBS0UsU0FBTCxDQUFpQixJQUFqQixDQUNBLEtBQUtDLFdBQUwsQ0FBbUIsV0FBQSxDQUFhLENBQWIsQ0FBZ0IsQ0FBaEIsQ0FBbkIsQ0FFQSxLQUFLRSxlQUFMLENBQXVCLElBQXZCLENBQ0EsS0FBS0MsaUJBQUwsQ0FBeUIsQ0FBekIsQ0FDQSxLQUFLQyxnQkFBTCxDQUF3QixDQUF4QixDQUVBLEtBQUtFLFlBQUwsQ0FBb0IsSUFBcEIsQ0FFQSxLQUFLRSxZQUFMLENBQW9CLElBQXBCLENBRUEsS0FBSzlCLFFBQUwsQ0FBZ0IsSUFBaEIsQ0FFQSxLQUFLSSxNQUFMLENBQWMsSUFBZCxDQUNBLEtBQUt5RSxlQUFMLENBQXVCLEdBQXZCLENBRUEsS0FBS3RFLGVBQUwsQ0FBdUIsSUFBdkIsQ0FFQSxLQUFLb2QsU0FBTCxDQUFpQixLQUFqQixDQUNBLEtBQUtDLGtCQUFMLENBQTBCLENBQTFCLENBQ0EsS0FBS0MsZ0JBQUwsQ0FBd0IsT0FBeEIsQ0FDQSxLQUFLQyxpQkFBTCxDQUF5QixPQUF6QixDQUVBLEtBQUtDLFFBQUwsQ0FBZ0IsS0FBaEIsQ0FDQSxLQUFLM1AsWUFBTCxDQUFvQixLQUFwQixDQUNBLEtBQUtDLFlBQUwsQ0FBb0IsS0FBcEIsQ0FFQSxLQUFLNk8sU0FBTCxDQUFnQmhSLFVBQWhCLEVBRUEsQ0FFRCtyQixxQkFBcUI1dUUsU0FBckIsQ0FBaUNELE9BQU9pQixNQUFQLENBQWUweUQsU0FBUzF6RCxTQUF4QixDQUFqQyxDQUNBNHVFLHFCQUFxQjV1RSxTQUFyQixDQUErQnNDLFdBQS9CLENBQTZDc3NFLG9CQUE3QyxDQUVBQSxxQkFBcUI1dUUsU0FBckIsQ0FBK0JrMUYsc0JBQS9CLENBQXdELElBQXhELENBRUF0bUIscUJBQXFCNXVFLFNBQXJCLENBQStCMHJCLElBQS9CLENBQXNDLFNBQVc1ZixNQUFYLENBQW9CLENBRXpENG5ELFNBQVMxekQsU0FBVCxDQUFtQjByQixJQUFuQixDQUF3QmhxQixJQUF4QixDQUE4QixJQUE5QixDQUFvQ29LLE1BQXBDLEVBRUEsS0FBS21wRCxPQUFMLENBQWUsQ0FBRSxXQUFZLEVBQWQsQ0FBZixDQUVBLEtBQUtqZ0IsS0FBTCxDQUFXdHBCLElBQVgsQ0FBaUI1ZixPQUFPa3BDLEtBQXhCLEVBQ0EsS0FBS3NHLFNBQUwsQ0FBaUJ4dkMsT0FBT3d2QyxTQUF4QixDQUNBLEtBQUtDLFNBQUwsQ0FBaUJ6dkMsT0FBT3l2QyxTQUF4QixDQUVBLEtBQUs5RSxHQUFMLENBQVczcUMsT0FBTzJxQyxHQUFsQixDQUVBLEtBQUtlLFFBQUwsQ0FBZ0IxckMsT0FBTzByQyxRQUF2QixDQUNBLEtBQUtDLGlCQUFMLENBQXlCM3JDLE9BQU8yckMsaUJBQWhDLENBRUEsS0FBS0osS0FBTCxDQUFhdnJDLE9BQU91ckMsS0FBcEIsQ0FDQSxLQUFLQyxjQUFMLENBQXNCeHJDLE9BQU93ckMsY0FBN0IsQ0FFQSxLQUFLMkQsUUFBTCxDQUFjdnZCLElBQWQsQ0FBb0I1ZixPQUFPbXZDLFFBQTNCLEVBQ0EsS0FBS3RELFdBQUwsQ0FBbUI3ckMsT0FBTzZyQyxXQUExQixDQUNBLEtBQUt1YyxpQkFBTCxDQUF5QnBvRCxPQUFPb29ELGlCQUFoQyxDQUVBLEtBQUtyYyxPQUFMLENBQWUvckMsT0FBTytyQyxPQUF0QixDQUNBLEtBQUtDLFNBQUwsQ0FBaUJoc0MsT0FBT2dzQyxTQUF4QixDQUVBLEtBQUtFLFNBQUwsQ0FBaUJsc0MsT0FBT2tzQyxTQUF4QixDQUNBLEtBQUtDLFdBQUwsQ0FBaUJ2c0IsSUFBakIsQ0FBdUI1ZixPQUFPbXNDLFdBQTlCLEVBRUEsS0FBS0UsZUFBTCxDQUF1QnJzQyxPQUFPcXNDLGVBQTlCLENBQ0EsS0FBS0MsaUJBQUwsQ0FBeUJ0c0MsT0FBT3NzQyxpQkFBaEMsQ0FDQSxLQUFLQyxnQkFBTCxDQUF3QnZzQyxPQUFPdXNDLGdCQUEvQixDQUVBLEtBQUtFLFlBQUwsQ0FBb0J6c0MsT0FBT3lzQyxZQUEzQixDQUVBLEtBQUtFLFlBQUwsQ0FBb0Izc0MsT0FBTzJzQyxZQUEzQixDQUVBLEtBQUs5QixRQUFMLENBQWdCN3FDLE9BQU82cUMsUUFBdkIsQ0FFQSxLQUFLSSxNQUFMLENBQWNqckMsT0FBT2lyQyxNQUFyQixDQUNBLEtBQUt5RSxlQUFMLENBQXVCMXZDLE9BQU8wdkMsZUFBOUIsQ0FFQSxLQUFLdEUsZUFBTCxDQUF1QnByQyxPQUFPb3JDLGVBQTlCLENBRUEsS0FBS29kLFNBQUwsQ0FBaUJ4b0QsT0FBT3dvRCxTQUF4QixDQUNBLEtBQUtDLGtCQUFMLENBQTBCem9ELE9BQU95b0Qsa0JBQWpDLENBQ0EsS0FBS0MsZ0JBQUwsQ0FBd0Ixb0QsT0FBTzBvRCxnQkFBL0IsQ0FDQSxLQUFLQyxpQkFBTCxDQUF5QjNvRCxPQUFPMm9ELGlCQUFoQyxDQUVBLEtBQUtDLFFBQUwsQ0FBZ0I1b0QsT0FBTzRvRCxRQUF2QixDQUNBLEtBQUszUCxZQUFMLENBQW9CajVDLE9BQU9pNUMsWUFBM0IsQ0FDQSxLQUFLQyxZQUFMLENBQW9CbDVDLE9BQU9rNUMsWUFBM0IsQ0FFQSxXQUFBLENBRUEsQ0F0REQsQ0F3REE7Ozs7OztLQVFBLDZCQUFBLENBQStCbkMsVUFBL0IsQ0FBNEMsQ0FFM0MrckIscUJBQXFCbHRFLElBQXJCLENBQTJCLElBQTNCLEVBRUEsS0FBS3V6RCxPQUFMLENBQWUsQ0FBRSxXQUFZLEVBQWQsQ0FBZixDQUVBLEtBQUt4ekQsSUFBTCxDQUFZLHNCQUFaLENBRUEsS0FBS3cxQyxZQUFMLENBQW9CLEdBQXBCLENBQXlCO0VBRXpCLEtBQUt1RixTQUFMLENBQWlCLEdBQWpCLENBQ0EsS0FBS0Msa0JBQUwsQ0FBMEIsR0FBMUIsQ0FFQSxLQUFLb1gsU0FBTCxDQUFnQmhSLFVBQWhCLEVBRUEsQ0FFRGdzQixxQkFBcUI3dUUsU0FBckIsQ0FBaUNELE9BQU9pQixNQUFQLENBQWU0dEUscUJBQXFCNXVFLFNBQXBDLENBQWpDLENBQ0E2dUUscUJBQXFCN3VFLFNBQXJCLENBQStCc0MsV0FBL0IsQ0FBNkN1c0Usb0JBQTdDLENBRUFBLHFCQUFxQjd1RSxTQUFyQixDQUErQm02RixzQkFBL0IsQ0FBd0QsSUFBeEQsQ0FFQXRyQixxQkFBcUI3dUUsU0FBckIsQ0FBK0IwckIsSUFBL0IsQ0FBc0MsU0FBVzVmLE1BQVgsQ0FBb0IsQ0FFekQ4aUUscUJBQXFCNXVFLFNBQXJCLENBQStCMHJCLElBQS9CLENBQW9DaHFCLElBQXBDLENBQTBDLElBQTFDLENBQWdEb0ssTUFBaEQsRUFFQSxLQUFLbXBELE9BQUwsQ0FBZSxDQUFFLFdBQVksRUFBZCxDQUFmLENBRUEsS0FBS2hlLFlBQUwsQ0FBb0JuckMsT0FBT21yQyxZQUEzQixDQUVBLEtBQUt1RixTQUFMLENBQWlCMXdDLE9BQU8wd0MsU0FBeEIsQ0FDQSxLQUFLQyxrQkFBTCxDQUEwQjN3QyxPQUFPMndDLGtCQUFqQyxDQUVBLFdBQUEsQ0FFQSxDQWJELENBZUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztLQWtEQSwwQkFBQSxDQUE0Qm9HLFVBQTVCLENBQXlDLENBRXhDNlEsU0FBU2h5RCxJQUFULENBQWUsSUFBZixFQUVBLEtBQUtELElBQUwsQ0FBWSxtQkFBWixDQUVBLEtBQUt1ekMsS0FBTCxDQUFhLFNBQUEsQ0FBVyxRQUFYLENBQWIsQ0FBb0M7RUFDcEMsS0FBS21HLFFBQUwsQ0FBZ0IsU0FBQSxDQUFXLFFBQVgsQ0FBaEIsQ0FDQSxLQUFLQyxTQUFMLENBQWlCLEVBQWpCLENBRUEsS0FBSzNFLEdBQUwsQ0FBVyxJQUFYLENBRUEsS0FBS2UsUUFBTCxDQUFnQixJQUFoQixDQUNBLEtBQUtDLGlCQUFMLENBQXlCLEdBQXpCLENBRUEsS0FBS0osS0FBTCxDQUFhLElBQWIsQ0FDQSxLQUFLQyxjQUFMLENBQXNCLEdBQXRCLENBRUEsS0FBSzJELFFBQUwsQ0FBZ0IsU0FBQSxDQUFXLFFBQVgsQ0FBaEIsQ0FDQSxLQUFLaVosaUJBQUwsQ0FBeUIsR0FBekIsQ0FDQSxLQUFLdmMsV0FBTCxDQUFtQixJQUFuQixDQUVBLEtBQUtFLE9BQUwsQ0FBZSxJQUFmLENBQ0EsS0FBS0MsU0FBTCxDQUFpQixDQUFqQixDQUVBLEtBQUtFLFNBQUwsQ0FBaUIsSUFBakIsQ0FDQSxLQUFLQyxXQUFMLENBQW1CLFdBQUEsQ0FBYSxDQUFiLENBQWdCLENBQWhCLENBQW5CLENBRUEsS0FBS0UsZUFBTCxDQUF1QixJQUF2QixDQUNBLEtBQUtDLGlCQUFMLENBQXlCLENBQXpCLENBQ0EsS0FBS0MsZ0JBQUwsQ0FBd0IsQ0FBeEIsQ0FFQSxLQUFLeEIsV0FBTCxDQUFtQixJQUFuQixDQUVBLEtBQUtGLFFBQUwsQ0FBZ0IsSUFBaEIsQ0FFQSxLQUFLSSxNQUFMLENBQWMsSUFBZCxDQUNBLEtBQUs4ZCxPQUFMLENBQWVDLGlCQUFmLENBQ0EsS0FBSzdkLFlBQUwsQ0FBb0IsQ0FBcEIsQ0FDQSxLQUFLQyxlQUFMLENBQXVCLElBQXZCLENBRUEsS0FBS29kLFNBQUwsQ0FBaUIsS0FBakIsQ0FDQSxLQUFLQyxrQkFBTCxDQUEwQixDQUExQixDQUNBLEtBQUtDLGdCQUFMLENBQXdCLE9BQXhCLENBQ0EsS0FBS0MsaUJBQUwsQ0FBeUIsT0FBekIsQ0FFQSxLQUFLQyxRQUFMLENBQWdCLEtBQWhCLENBQ0EsS0FBSzNQLFlBQUwsQ0FBb0IsS0FBcEIsQ0FDQSxLQUFLQyxZQUFMLENBQW9CLEtBQXBCLENBRUEsS0FBSzZPLFNBQUwsQ0FBZ0JoUixVQUFoQixFQUVBLENBRUQ2ckIsa0JBQWtCMXVFLFNBQWxCLENBQThCRCxPQUFPaUIsTUFBUCxDQUFlMHlELFNBQVMxekQsU0FBeEIsQ0FBOUIsQ0FDQTB1RSxrQkFBa0IxdUUsU0FBbEIsQ0FBNEJzQyxXQUE1QixDQUEwQ29zRSxpQkFBMUMsQ0FFQUEsa0JBQWtCMXVFLFNBQWxCLENBQTRCaTFGLG1CQUE1QixDQUFrRCxJQUFsRCxDQUVBdm1CLGtCQUFrQjF1RSxTQUFsQixDQUE0QjByQixJQUE1QixDQUFtQyxTQUFXNWYsTUFBWCxDQUFvQixDQUV0RDRuRCxTQUFTMXpELFNBQVQsQ0FBbUIwckIsSUFBbkIsQ0FBd0JocUIsSUFBeEIsQ0FBOEIsSUFBOUIsQ0FBb0NvSyxNQUFwQyxFQUVBLEtBQUtrcEMsS0FBTCxDQUFXdHBCLElBQVgsQ0FBaUI1ZixPQUFPa3BDLEtBQXhCLEVBQ0EsS0FBS21HLFFBQUwsQ0FBY3p2QixJQUFkLENBQW9CNWYsT0FBT3F2QyxRQUEzQixFQUNBLEtBQUtDLFNBQUwsQ0FBaUJ0dkMsT0FBT3N2QyxTQUF4QixDQUVBLEtBQUszRSxHQUFMLENBQVczcUMsT0FBTzJxQyxHQUFsQixDQUVBLEtBQUtlLFFBQUwsQ0FBZ0IxckMsT0FBTzByQyxRQUF2QixDQUNBLEtBQUtDLGlCQUFMLENBQXlCM3JDLE9BQU8yckMsaUJBQWhDLENBRUEsS0FBS0osS0FBTCxDQUFhdnJDLE9BQU91ckMsS0FBcEIsQ0FDQSxLQUFLQyxjQUFMLENBQXNCeHJDLE9BQU93ckMsY0FBN0IsQ0FFQSxLQUFLMkQsUUFBTCxDQUFjdnZCLElBQWQsQ0FBb0I1ZixPQUFPbXZDLFFBQTNCLEVBQ0EsS0FBS3RELFdBQUwsQ0FBbUI3ckMsT0FBTzZyQyxXQUExQixDQUNBLEtBQUt1YyxpQkFBTCxDQUF5QnBvRCxPQUFPb29ELGlCQUFoQyxDQUVBLEtBQUtyYyxPQUFMLENBQWUvckMsT0FBTytyQyxPQUF0QixDQUNBLEtBQUtDLFNBQUwsQ0FBaUJoc0MsT0FBT2dzQyxTQUF4QixDQUVBLEtBQUtFLFNBQUwsQ0FBaUJsc0MsT0FBT2tzQyxTQUF4QixDQUNBLEtBQUtDLFdBQUwsQ0FBaUJ2c0IsSUFBakIsQ0FBdUI1ZixPQUFPbXNDLFdBQTlCLEVBRUEsS0FBS0UsZUFBTCxDQUF1QnJzQyxPQUFPcXNDLGVBQTlCLENBQ0EsS0FBS0MsaUJBQUwsQ0FBeUJ0c0MsT0FBT3NzQyxpQkFBaEMsQ0FDQSxLQUFLQyxnQkFBTCxDQUF3QnZzQyxPQUFPdXNDLGdCQUEvQixDQUVBLEtBQUt4QixXQUFMLENBQW1CL3FDLE9BQU8rcUMsV0FBMUIsQ0FFQSxLQUFLRixRQUFMLENBQWdCN3FDLE9BQU82cUMsUUFBdkIsQ0FFQSxLQUFLSSxNQUFMLENBQWNqckMsT0FBT2lyQyxNQUFyQixDQUNBLEtBQUs4ZCxPQUFMLENBQWUvb0QsT0FBTytvRCxPQUF0QixDQUNBLEtBQUs1ZCxZQUFMLENBQW9CbnJDLE9BQU9tckMsWUFBM0IsQ0FDQSxLQUFLQyxlQUFMLENBQXVCcHJDLE9BQU9vckMsZUFBOUIsQ0FFQSxLQUFLb2QsU0FBTCxDQUFpQnhvRCxPQUFPd29ELFNBQXhCLENBQ0EsS0FBS0Msa0JBQUwsQ0FBMEJ6b0QsT0FBT3lvRCxrQkFBakMsQ0FDQSxLQUFLQyxnQkFBTCxDQUF3QjFvRCxPQUFPMG9ELGdCQUEvQixDQUNBLEtBQUtDLGlCQUFMLENBQXlCM29ELE9BQU8yb0QsaUJBQWhDLENBRUEsS0FBS0MsUUFBTCxDQUFnQjVvRCxPQUFPNG9ELFFBQXZCLENBQ0EsS0FBSzNQLFlBQUwsQ0FBb0JqNUMsT0FBT2k1QyxZQUEzQixDQUNBLEtBQUtDLFlBQUwsQ0FBb0JsNUMsT0FBT2s1QyxZQUEzQixDQUVBLFdBQUEsQ0FFQSxDQWxERCxDQW9EQTs7Ozs7O0tBUUEseUJBQUEsQ0FBMkJuQyxVQUEzQixDQUF3QyxDQUV2QzZyQixrQkFBa0JodEUsSUFBbEIsQ0FBd0IsSUFBeEIsRUFFQSxLQUFLdXpELE9BQUwsQ0FBZSxDQUFFLE9BQVEsRUFBVixDQUFmLENBRUEsS0FBS3h6RCxJQUFMLENBQVksa0JBQVosQ0FFQSxLQUFLazNDLFdBQUwsQ0FBbUIsSUFBbkIsQ0FFQSxLQUFLa2IsU0FBTCxDQUFnQmhSLFVBQWhCLEVBRUEsQ0FFRDhyQixpQkFBaUIzdUUsU0FBakIsQ0FBNkJELE9BQU9pQixNQUFQLENBQWUwdEUsa0JBQWtCMXVFLFNBQWpDLENBQTdCLENBQ0EydUUsaUJBQWlCM3VFLFNBQWpCLENBQTJCc0MsV0FBM0IsQ0FBeUNxc0UsZ0JBQXpDLENBRUFBLGlCQUFpQjN1RSxTQUFqQixDQUEyQmc2RixrQkFBM0IsQ0FBZ0QsSUFBaEQsQ0FFQXJyQixpQkFBaUIzdUUsU0FBakIsQ0FBMkIwckIsSUFBM0IsQ0FBa0MsU0FBVzVmLE1BQVgsQ0FBb0IsQ0FFckQ0aUUsa0JBQWtCMXVFLFNBQWxCLENBQTRCMHJCLElBQTVCLENBQWlDaHFCLElBQWpDLENBQXVDLElBQXZDLENBQTZDb0ssTUFBN0MsRUFFQSxLQUFLNnNDLFdBQUwsQ0FBbUI3c0MsT0FBTzZzQyxXQUExQixDQUVBLFdBQUEsQ0FFQSxDQVJELENBVUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztLQTBCQSwyQkFBQSxDQUE2QmtLLFVBQTdCLENBQTBDLENBRXpDNlEsU0FBU2h5RCxJQUFULENBQWUsSUFBZixFQUVBLEtBQUtELElBQUwsQ0FBWSxvQkFBWixDQUVBLEtBQUtvMkMsT0FBTCxDQUFlLElBQWYsQ0FDQSxLQUFLQyxTQUFMLENBQWlCLENBQWpCLENBRUEsS0FBS0UsU0FBTCxDQUFpQixJQUFqQixDQUNBLEtBQUtDLFdBQUwsQ0FBbUIsV0FBQSxDQUFhLENBQWIsQ0FBZ0IsQ0FBaEIsQ0FBbkIsQ0FFQSxLQUFLRSxlQUFMLENBQXVCLElBQXZCLENBQ0EsS0FBS0MsaUJBQUwsQ0FBeUIsQ0FBekIsQ0FDQSxLQUFLQyxnQkFBTCxDQUF3QixDQUF4QixDQUVBLEtBQUtpYyxTQUFMLENBQWlCLEtBQWpCLENBQ0EsS0FBS0Msa0JBQUwsQ0FBMEIsQ0FBMUIsQ0FFQSxLQUFLM2IsR0FBTCxDQUFXLEtBQVgsQ0FDQSxLQUFLSyxNQUFMLENBQWMsS0FBZCxDQUVBLEtBQUt5YixRQUFMLENBQWdCLEtBQWhCLENBQ0EsS0FBSzNQLFlBQUwsQ0FBb0IsS0FBcEIsQ0FDQSxLQUFLQyxZQUFMLENBQW9CLEtBQXBCLENBRUEsS0FBSzZPLFNBQUwsQ0FBZ0JoUixVQUFoQixFQUVBLENBRUQyckIsbUJBQW1CeHVFLFNBQW5CLENBQStCRCxPQUFPaUIsTUFBUCxDQUFlMHlELFNBQVMxekQsU0FBeEIsQ0FBL0IsQ0FDQXd1RSxtQkFBbUJ4dUUsU0FBbkIsQ0FBNkJzQyxXQUE3QixDQUEyQ2tzRSxrQkFBM0MsQ0FFQUEsbUJBQW1CeHVFLFNBQW5CLENBQTZCbTFGLG9CQUE3QixDQUFvRCxJQUFwRCxDQUVBM21CLG1CQUFtQnh1RSxTQUFuQixDQUE2QjByQixJQUE3QixDQUFvQyxTQUFXNWYsTUFBWCxDQUFvQixDQUV2RDRuRCxTQUFTMXpELFNBQVQsQ0FBbUIwckIsSUFBbkIsQ0FBd0JocUIsSUFBeEIsQ0FBOEIsSUFBOUIsQ0FBb0NvSyxNQUFwQyxFQUVBLEtBQUsrckMsT0FBTCxDQUFlL3JDLE9BQU8rckMsT0FBdEIsQ0FDQSxLQUFLQyxTQUFMLENBQWlCaHNDLE9BQU9nc0MsU0FBeEIsQ0FFQSxLQUFLRSxTQUFMLENBQWlCbHNDLE9BQU9rc0MsU0FBeEIsQ0FDQSxLQUFLQyxXQUFMLENBQWlCdnNCLElBQWpCLENBQXVCNWYsT0FBT21zQyxXQUE5QixFQUVBLEtBQUtFLGVBQUwsQ0FBdUJyc0MsT0FBT3FzQyxlQUE5QixDQUNBLEtBQUtDLGlCQUFMLENBQXlCdHNDLE9BQU9zc0MsaUJBQWhDLENBQ0EsS0FBS0MsZ0JBQUwsQ0FBd0J2c0MsT0FBT3VzQyxnQkFBL0IsQ0FFQSxLQUFLaWMsU0FBTCxDQUFpQnhvRCxPQUFPd29ELFNBQXhCLENBQ0EsS0FBS0Msa0JBQUwsQ0FBMEJ6b0QsT0FBT3lvRCxrQkFBakMsQ0FFQSxLQUFLRyxRQUFMLENBQWdCNW9ELE9BQU80b0QsUUFBdkIsQ0FDQSxLQUFLM1AsWUFBTCxDQUFvQmo1QyxPQUFPaTVDLFlBQTNCLENBQ0EsS0FBS0MsWUFBTCxDQUFvQmw1QyxPQUFPazVDLFlBQTNCLENBRUEsV0FBQSxDQUVBLENBdkJELENBeUJBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7S0FzQ0EsNEJBQUEsQ0FBOEJuQyxVQUE5QixDQUEyQyxDQUUxQzZRLFNBQVNoeUQsSUFBVCxDQUFlLElBQWYsRUFFQSxLQUFLRCxJQUFMLENBQVkscUJBQVosQ0FFQSxLQUFLdXpDLEtBQUwsQ0FBYSxTQUFBLENBQVcsUUFBWCxDQUFiLENBQW9DO0VBRXBDLEtBQUt5QixHQUFMLENBQVcsSUFBWCxDQUVBLEtBQUtlLFFBQUwsQ0FBZ0IsSUFBaEIsQ0FDQSxLQUFLQyxpQkFBTCxDQUF5QixHQUF6QixDQUVBLEtBQUtKLEtBQUwsQ0FBYSxJQUFiLENBQ0EsS0FBS0MsY0FBTCxDQUFzQixHQUF0QixDQUVBLEtBQUsyRCxRQUFMLENBQWdCLFNBQUEsQ0FBVyxRQUFYLENBQWhCLENBQ0EsS0FBS2laLGlCQUFMLENBQXlCLEdBQXpCLENBQ0EsS0FBS3ZjLFdBQUwsQ0FBbUIsSUFBbkIsQ0FFQSxLQUFLZCxXQUFMLENBQW1CLElBQW5CLENBRUEsS0FBS0YsUUFBTCxDQUFnQixJQUFoQixDQUVBLEtBQUtJLE1BQUwsQ0FBYyxJQUFkLENBQ0EsS0FBSzhkLE9BQUwsQ0FBZUMsaUJBQWYsQ0FDQSxLQUFLN2QsWUFBTCxDQUFvQixDQUFwQixDQUNBLEtBQUtDLGVBQUwsQ0FBdUIsSUFBdkIsQ0FFQSxLQUFLb2QsU0FBTCxDQUFpQixLQUFqQixDQUNBLEtBQUtDLGtCQUFMLENBQTBCLENBQTFCLENBQ0EsS0FBS0MsZ0JBQUwsQ0FBd0IsT0FBeEIsQ0FDQSxLQUFLQyxpQkFBTCxDQUF5QixPQUF6QixDQUVBLEtBQUtDLFFBQUwsQ0FBZ0IsS0FBaEIsQ0FDQSxLQUFLM1AsWUFBTCxDQUFvQixLQUFwQixDQUNBLEtBQUtDLFlBQUwsQ0FBb0IsS0FBcEIsQ0FFQSxLQUFLNk8sU0FBTCxDQUFnQmhSLFVBQWhCLEVBRUEsQ0FFRDRyQixvQkFBb0J6dUUsU0FBcEIsQ0FBZ0NELE9BQU9pQixNQUFQLENBQWUweUQsU0FBUzF6RCxTQUF4QixDQUFoQyxDQUNBeXVFLG9CQUFvQnp1RSxTQUFwQixDQUE4QnNDLFdBQTlCLENBQTRDbXNFLG1CQUE1QyxDQUVBQSxvQkFBb0J6dUUsU0FBcEIsQ0FBOEJ3NUYscUJBQTlCLENBQXNELElBQXRELENBRUEvcUIsb0JBQW9CenVFLFNBQXBCLENBQThCMHJCLElBQTlCLENBQXFDLFNBQVc1ZixNQUFYLENBQW9CLENBRXhENG5ELFNBQVMxekQsU0FBVCxDQUFtQjByQixJQUFuQixDQUF3QmhxQixJQUF4QixDQUE4QixJQUE5QixDQUFvQ29LLE1BQXBDLEVBRUEsS0FBS2twQyxLQUFMLENBQVd0cEIsSUFBWCxDQUFpQjVmLE9BQU9rcEMsS0FBeEIsRUFFQSxLQUFLeUIsR0FBTCxDQUFXM3FDLE9BQU8ycUMsR0FBbEIsQ0FFQSxLQUFLZSxRQUFMLENBQWdCMXJDLE9BQU8wckMsUUFBdkIsQ0FDQSxLQUFLQyxpQkFBTCxDQUF5QjNyQyxPQUFPMnJDLGlCQUFoQyxDQUVBLEtBQUtKLEtBQUwsQ0FBYXZyQyxPQUFPdXJDLEtBQXBCLENBQ0EsS0FBS0MsY0FBTCxDQUFzQnhyQyxPQUFPd3JDLGNBQTdCLENBRUEsS0FBSzJELFFBQUwsQ0FBY3Z2QixJQUFkLENBQW9CNWYsT0FBT212QyxRQUEzQixFQUNBLEtBQUt0RCxXQUFMLENBQW1CN3JDLE9BQU82ckMsV0FBMUIsQ0FDQSxLQUFLdWMsaUJBQUwsQ0FBeUJwb0QsT0FBT29vRCxpQkFBaEMsQ0FFQSxLQUFLcmQsV0FBTCxDQUFtQi9xQyxPQUFPK3FDLFdBQTFCLENBRUEsS0FBS0YsUUFBTCxDQUFnQjdxQyxPQUFPNnFDLFFBQXZCLENBRUEsS0FBS0ksTUFBTCxDQUFjanJDLE9BQU9pckMsTUFBckIsQ0FDQSxLQUFLOGQsT0FBTCxDQUFlL29ELE9BQU8rb0QsT0FBdEIsQ0FDQSxLQUFLNWQsWUFBTCxDQUFvQm5yQyxPQUFPbXJDLFlBQTNCLENBQ0EsS0FBS0MsZUFBTCxDQUF1QnByQyxPQUFPb3JDLGVBQTlCLENBRUEsS0FBS29kLFNBQUwsQ0FBaUJ4b0QsT0FBT3dvRCxTQUF4QixDQUNBLEtBQUtDLGtCQUFMLENBQTBCem9ELE9BQU95b0Qsa0JBQWpDLENBQ0EsS0FBS0MsZ0JBQUwsQ0FBd0Ixb0QsT0FBTzBvRCxnQkFBL0IsQ0FDQSxLQUFLQyxpQkFBTCxDQUF5QjNvRCxPQUFPMm9ELGlCQUFoQyxDQUVBLEtBQUtDLFFBQUwsQ0FBZ0I1b0QsT0FBTzRvRCxRQUF2QixDQUNBLEtBQUszUCxZQUFMLENBQW9CajVDLE9BQU9pNUMsWUFBM0IsQ0FDQSxLQUFLQyxZQUFMLENBQW9CbDVDLE9BQU9rNUMsWUFBM0IsQ0FFQSxXQUFBLENBRUEsQ0F0Q0QsQ0F3Q0E7Ozs7Ozs7Ozs7Ozs7S0FlQSwyQkFBQSxDQUE2Qm5DLFVBQTdCLENBQTBDLENBRXpDaXNCLGtCQUFrQnB0RSxJQUFsQixDQUF3QixJQUF4QixFQUVBLEtBQUtELElBQUwsQ0FBWSxvQkFBWixDQUVBLEtBQUtnMUIsS0FBTCxDQUFhLENBQWIsQ0FDQSxLQUFLaWxCLFFBQUwsQ0FBZ0IsQ0FBaEIsQ0FDQSxLQUFLMlksT0FBTCxDQUFlLENBQWYsQ0FFQSxLQUFLUixTQUFMLENBQWdCaFIsVUFBaEIsRUFFQSxDQUVEa3NCLG1CQUFtQi91RSxTQUFuQixDQUErQkQsT0FBT2lCLE1BQVAsQ0FBZTh0RSxrQkFBa0I5dUUsU0FBakMsQ0FBL0IsQ0FDQSt1RSxtQkFBbUIvdUUsU0FBbkIsQ0FBNkJzQyxXQUE3QixDQUEyQ3lzRSxrQkFBM0MsQ0FFQUEsbUJBQW1CL3VFLFNBQW5CLENBQTZCMjZGLG9CQUE3QixDQUFvRCxJQUFwRCxDQUVBNXJCLG1CQUFtQi91RSxTQUFuQixDQUE2QjByQixJQUE3QixDQUFvQyxTQUFXNWYsTUFBWCxDQUFvQixDQUV2RGdqRSxrQkFBa0I5dUUsU0FBbEIsQ0FBNEIwckIsSUFBNUIsQ0FBaUNocUIsSUFBakMsQ0FBdUMsSUFBdkMsQ0FBNkNvSyxNQUE3QyxFQUVBLEtBQUsycUIsS0FBTCxDQUFhM3FCLE9BQU8ycUIsS0FBcEIsQ0FDQSxLQUFLaWxCLFFBQUwsQ0FBZ0I1dkMsT0FBTzR2QyxRQUF2QixDQUNBLEtBQUsyWSxPQUFMLENBQWV2b0QsT0FBT3VvRCxPQUF0QixDQUVBLFdBQUEsQ0FFQSxDQVZELENBY0EsY0FBZ0J0MEQsT0FBT2l6RyxNQUFQLENBQWMsQ0FDN0IvakMsZUFBZ0JBLGNBRGEsQ0FFN0IwdEIsZUFBZ0JBLGNBRmEsQ0FHN0JzVyxrQkFBbUJBLGlCQUhVLENBSTdCdjlDLGVBQWdCQSxjQUphLENBSzdCc1osZUFBZ0JBLGNBTGEsQ0FNN0JILHFCQUFzQkEsb0JBTk8sQ0FPN0JELHFCQUFzQkEsb0JBUE8sQ0FRN0JGLGtCQUFtQkEsaUJBUlUsQ0FTN0JDLGlCQUFrQkEsZ0JBVFcsQ0FVN0JILG1CQUFvQkEsa0JBVlMsQ0FXN0JDLG9CQUFxQkEsbUJBWFEsQ0FZN0JILGtCQUFtQkEsaUJBWlUsQ0FhN0JDLHFCQUFzQkEsb0JBYk8sQ0FjN0J4WixrQkFBbUJBLGlCQWRVLENBZTdCZ2EsbUJBQW9CQSxrQkFmUyxDQWdCN0JELGtCQUFtQkEsaUJBaEJVLENBaUI3QnBiLFNBQVVBLFFBakJtQixDQUFkLENBQWhCLENBb0JBOztLQUlBLFVBQVksQ0FFWDNQLFFBQVMsS0FGRSxDQUlYbXZELE1BQU8sRUFKSSxDQU1Ydm5GLElBQUssU0FBV3BsQixHQUFYLENBQWdCNHNHLElBQWhCLENBQXVCLENBRTNCLEdBQUssS0FBS3B2RCxPQUFMLEdBQWlCLEtBQXRCLENBQThCLE9BRTlCO0VBRUEsS0FBS212RCxLQUFMLENBQVkzc0csR0FBWixFQUFvQjRzRyxJQUFwQixDQUVBLENBZFUsQ0FnQlgzb0csSUFBSyxTQUFXakUsR0FBWCxDQUFpQixDQUVyQixHQUFLLEtBQUt3OUMsT0FBTCxHQUFpQixLQUF0QixDQUE4QixPQUU5QjtFQUVBLFlBQVltdkQsS0FBTCxDQUFZM3NHLEdBQVosQ0FBUCxDQUVBLENBeEJVLENBMEJYKzNDLE9BQVEsU0FBVy8zQyxHQUFYLENBQWlCLENBRXhCLFlBQVkyc0csS0FBTCxDQUFZM3NHLEdBQVosQ0FBUCxDQUVBLENBOUJVLENBZ0NYOFEsTUFBTyxVQUFZLENBRWxCLEtBQUs2N0YsS0FBTCxDQUFhLEVBQWIsQ0FFQSxDQXBDVSxDQUFaLENBd0NBOztLQUlBLHVCQUFBLENBQXlCRSxNQUF6QixDQUFpQ0MsVUFBakMsQ0FBNkNDLE9BQTdDLENBQXVELENBRXRELFVBQVksSUFBWixDQUVBLGNBQWdCLEtBQWhCLENBQ0EsZ0JBQWtCLENBQWxCLENBQ0EsZUFBaUIsQ0FBakIsQ0FDQSxnQkFBa0JsdUcsU0FBbEIsQ0FFQSxLQUFLbXVHLE9BQUwsQ0FBZW51RyxTQUFmLENBQ0EsS0FBS2d1RyxNQUFMLENBQWNBLE1BQWQsQ0FDQSxLQUFLQyxVQUFMLENBQWtCQSxVQUFsQixDQUNBLEtBQUtDLE9BQUwsQ0FBZUEsT0FBZixDQUVBLEtBQUtFLFNBQUwsQ0FBaUIsU0FBV253RSxHQUFYLENBQWlCLENBRWpDb3dFLGFBRUEsR0FBS0MsWUFBYyxLQUFuQixDQUEyQixDQUUxQixHQUFLeHNFLE1BQU1xc0UsT0FBTixHQUFrQm51RyxTQUF2QixDQUFtQyxDQUVsQzhoQyxNQUFNcXNFLE9BQU4sQ0FBZWx3RSxHQUFmLENBQW9Cc3dFLFdBQXBCLENBQWlDRixVQUFqQyxFQUVBLENBRUQsQ0FFREMsVUFBWSxJQUFaLENBRUEsQ0FoQkQsQ0FrQkEsS0FBS0UsT0FBTCxDQUFlLFNBQVd2d0UsR0FBWCxDQUFpQixDQUUvQnN3RSxjQUVBLEdBQUt6c0UsTUFBTW1zRSxVQUFOLEdBQXFCanVHLFNBQTFCLENBQXNDLENBRXJDOGhDLE1BQU1tc0UsVUFBTixDQUFrQmh3RSxHQUFsQixDQUF1QnN3RSxXQUF2QixDQUFvQ0YsVUFBcEMsRUFFQSxDQUVELEdBQUtFLGNBQWdCRixVQUFyQixDQUFrQyxDQUVqQ0MsVUFBWSxLQUFaLENBRUEsR0FBS3hzRSxNQUFNa3NFLE1BQU4sR0FBaUJodUcsU0FBdEIsQ0FBa0MsQ0FFakM4aEMsTUFBTWtzRSxNQUFOLEdBRUEsQ0FFRCxDQUVELENBdEJELENBd0JBLEtBQUtTLFNBQUwsQ0FBaUIsU0FBV3h3RSxHQUFYLENBQWlCLENBRWpDLEdBQUs2RCxNQUFNb3NFLE9BQU4sR0FBa0JsdUcsU0FBdkIsQ0FBbUMsQ0FFbEM4aEMsTUFBTW9zRSxPQUFOLENBQWVqd0UsR0FBZixFQUVBLENBRUQsQ0FSRCxDQVVBLEtBQUt5d0UsVUFBTCxDQUFrQixTQUFXendFLEdBQVgsQ0FBaUIsQ0FFbEMsR0FBSzB3RSxXQUFMLENBQW1CLENBRWxCLG1CQUFvQjF3RSxHQUFiLENBQVAsQ0FFQSxDQUVELFVBQUEsQ0FFQSxDQVZELENBWUEsS0FBSzJ3RSxjQUFMLENBQXNCLFNBQVdDLFNBQVgsQ0FBdUIsQ0FFNUNGLFlBQWNFLFNBQWQsQ0FDQSxXQUFBLENBRUEsQ0FMRCxDQU9BLENBRUQsMEJBQTRCLGtCQUFBLEVBQTVCLENBRUE7O0tBSUEsWUFBYyxFQUFkLENBRUEsbUJBQUEsQ0FBcUJDLE9BQXJCLENBQStCLENBRTlCLEtBQUtBLE9BQUwsQ0FBaUJBLFVBQVk5dUcsU0FBZCxDQUE0Qjh1RyxPQUE1QixDQUFzQ0MscUJBQXJELENBRUEsQ0FFRHAwRyxPQUFPNG5CLE1BQVAsQ0FBZXlzRixXQUFXcDBHLFNBQTFCLENBQXFDLENBRXBDcTBHLEtBQU0sU0FBV2h4RSxHQUFYLENBQWdCK3ZFLE1BQWhCLENBQXdCQyxVQUF4QixDQUFvQ0MsT0FBcEMsQ0FBOEMsQ0FFbkQsR0FBS2p3RSxNQUFRaitCLFNBQWIsQ0FBeUJpK0IsSUFBTSxFQUFOLENBRXpCLEdBQUssS0FBSzRqQyxJQUFMLEdBQWM3aEUsU0FBbkIsQ0FBK0JpK0IsSUFBTSxLQUFLNGpDLElBQUwsQ0FBWTVqQyxHQUFsQixDQUUvQkEsSUFBTSxLQUFLNndFLE9BQUwsQ0FBYUosVUFBYixDQUF5Qnp3RSxHQUF6QixDQUFOLENBRUEsVUFBWSxJQUFaLENBRUEsV0FBYWl4RSxNQUFNOXBHLEdBQU4sQ0FBVzY0QixHQUFYLENBQWIsQ0FFQSxHQUFLa3hFLFNBQVdudkcsU0FBaEIsQ0FBNEIsQ0FFM0I4aEMsTUFBTWd0RSxPQUFOLENBQWNWLFNBQWQsQ0FBeUJud0UsR0FBekIsRUFFQWxzQixXQUFZLFVBQVksQ0FFdkIsR0FBS2k4RixNQUFMLENBQWNBLE9BQVFtQixNQUFSLEVBRWRydEUsTUFBTWd0RSxPQUFOLENBQWNOLE9BQWQsQ0FBdUJ2d0UsR0FBdkIsRUFFQSxDQU5ELENBTUcsQ0FOSCxFQVFBLGFBQUEsQ0FFQSxDQUVEO0VBRUEsR0FBS214RSxRQUFTbnhFLEdBQVQsSUFBbUJqK0IsU0FBeEIsQ0FBb0MsQ0FFbkNvdkcsUUFBU254RSxHQUFULEVBQWVwOUIsSUFBZixDQUFxQixDQUVwQm10RyxPQUFRQSxNQUZZLENBR3BCQyxXQUFZQSxVQUhRLENBSXBCQyxRQUFTQSxPQUpXLENBQXJCLEVBUUEsT0FFQSxDQUVEO0VBQ0EsaUJBQW1CLDZCQUFuQixDQUNBLHVCQUF5Qmp3RSxJQUFJM2IsS0FBSixDQUFXK3NGLFlBQVgsQ0FBekIsQ0FFQTtFQUNBLEdBQUtDLGtCQUFMLENBQTBCLENBRXpCLGFBQWVBLG1CQUFvQixDQUFwQixDQUFmLENBQ0EsYUFBZSxDQUFDLENBQUVBLG1CQUFvQixDQUFwQixDQUFsQixDQUNBLFNBQVdBLG1CQUFvQixDQUFwQixDQUFYLENBRUF2K0YsS0FBT3pNLE9BQU9pckcsa0JBQVAsQ0FBMkJ4K0YsSUFBM0IsQ0FBUCxDQUVBLEdBQUt5K0YsUUFBTCxDQUFnQnorRixLQUFPek0sT0FBT21yRyxJQUFQLENBQWExK0YsSUFBYixDQUFQLENBRWhCLEdBQUksQ0FFSCxZQUFBLENBQ0EsaUJBQW1CLENBQUUsS0FBSzIrRixZQUFMLEVBQXFCLEVBQXZCLEVBQTRCQyxXQUE1QixFQUFuQixDQUVBLE9BQVNELFlBQVQsRUFFQyxJQUFLLGFBQUwsQ0FDQSxJQUFLLE1BQUwsQ0FFQyxTQUFXLGNBQUEsQ0FBZ0IzK0YsS0FBSzFQLE1BQXJCLENBQVgsQ0FFQSxJQUFNLE1BQVEsQ0FBZCxDQUFpQkssRUFBSXFQLEtBQUsxUCxNQUExQixDQUFrQ0ssR0FBbEMsQ0FBeUMsQ0FFeEMwOEMsS0FBTTE4QyxDQUFOLEVBQVlxUCxLQUFLMU0sVUFBTCxDQUFpQjNDLENBQWpCLENBQVosQ0FFQSxDQUVELEdBQUtndUcsZUFBaUIsTUFBdEIsQ0FBK0IsQ0FFOUJFLFNBQVcsUUFBQSxDQUFVLENBQUV4eEQsS0FBS3ZHLE1BQVAsQ0FBVixDQUEyQixDQUFFeDdDLEtBQU13ekcsUUFBUixDQUEzQixDQUFYLENBRUEsQ0FKRCxJQUlPLENBRU5ELFNBQVd4eEQsS0FBS3ZHLE1BQWhCLENBRUEsQ0FFRCxNQUVELElBQUssVUFBTCxDQUVDLFdBQWEsYUFBQSxFQUFiLENBQ0ErM0QsU0FBV0UsT0FBT0MsZUFBUCxDQUF3QmgvRixJQUF4QixDQUE4QjgrRixRQUE5QixDQUFYLENBRUEsTUFFRCxJQUFLLE1BQUwsQ0FFQ0QsU0FBV2wwRixLQUFLc2lDLEtBQUwsQ0FBWWp0QyxJQUFaLENBQVgsQ0FFQSxNQUVEO0VBRUM2K0YsU0FBVzcrRixJQUFYLENBRUEsTUExQ0YsQ0E4Q0E7RUFDQXpNLE9BQU95TixVQUFQLENBQW1CLFVBQVksQ0FFOUIsR0FBS2k4RixNQUFMLENBQWNBLE9BQVE0QixRQUFSLEVBRWQ5dEUsTUFBTWd0RSxPQUFOLENBQWNOLE9BQWQsQ0FBdUJ2d0UsR0FBdkIsRUFFQSxDQU5ELENBTUcsQ0FOSCxFQVFBLENBQUMsTUFBUWhuQixLQUFSLENBQWdCO0VBR2pCM1MsT0FBT3lOLFVBQVAsQ0FBbUIsVUFBWSxDQUU5QixHQUFLbThGLE9BQUwsQ0FBZUEsUUFBU2ozRixLQUFULEVBRWY2cUIsTUFBTWd0RSxPQUFOLENBQWNOLE9BQWQsQ0FBdUJ2d0UsR0FBdkIsRUFDQTZELE1BQU1ndEUsT0FBTixDQUFjTCxTQUFkLENBQXlCeHdFLEdBQXpCLEVBRUEsQ0FQRCxDQU9HLENBUEgsRUFTQSxDQUVELENBcEZELElBb0ZPO0VBSU5teEUsUUFBU254RSxHQUFULEVBQWlCLEVBQWpCLENBRUFteEUsUUFBU254RSxHQUFULEVBQWVwOUIsSUFBZixDQUFxQixDQUVwQm10RyxPQUFRQSxNQUZZLENBR3BCQyxXQUFZQSxVQUhRLENBSXBCQyxRQUFTQSxPQUpXLENBQXJCLEVBUUEsWUFBYyxrQkFBQSxFQUFkLENBRUE4QixRQUFRamxHLElBQVIsQ0FBYyxLQUFkLENBQXFCa3pCLEdBQXJCLENBQTBCLElBQTFCLEVBRUEreEUsUUFBUXIrRixnQkFBUixDQUEwQixNQUExQixDQUFrQyxTQUFXZCxLQUFYLENBQW1CLENBRXBELGFBQWUsS0FBSysrRixRQUFwQixDQUVBVixNQUFNM29GLEdBQU4sQ0FBVzBYLEdBQVgsQ0FBZ0IyeEUsUUFBaEIsRUFFQSxjQUFnQlIsUUFBU254RSxHQUFULENBQWhCLENBRUEsZUFBZ0JBLEdBQVQsQ0FBUCxDQUVBLEdBQUssS0FBS2d5RSxNQUFMLEdBQWdCLEdBQXJCLENBQTJCLENBRTFCLElBQU0sTUFBUSxDQUFSLENBQVdudkUsR0FBS292RSxVQUFVN3VHLE1BQWhDLENBQXdDSyxFQUFJby9CLEVBQTVDLENBQWdEcC9CLEdBQWhELENBQXVELENBRXRELGFBQWV3dUcsVUFBV3h1RyxDQUFYLENBQWYsQ0FDQSxHQUFLbTJCLFNBQVNtMkUsTUFBZCxDQUF1Qm4yRSxTQUFTbTJFLE1BQVQsQ0FBaUI0QixRQUFqQixFQUV2QixDQUVEOXRFLE1BQU1ndEUsT0FBTixDQUFjTixPQUFkLENBQXVCdndFLEdBQXZCLEVBRUEsQ0FYRCxRQVdZLEtBQUtneUUsTUFBTCxHQUFnQixDQUFyQixDQUF5QjtFQUcvQjtFQUVBdDVGLFFBQVE2UCxJQUFSLENBQWMsMkNBQWQsRUFFQSxJQUFNLE1BQVEsQ0FBUixDQUFXc2EsR0FBS292RSxVQUFVN3VHLE1BQWhDLENBQXdDSyxFQUFJby9CLEVBQTVDLENBQWdEcC9CLEdBQWhELENBQXVELENBRXRELGFBQWV3dUcsVUFBV3h1RyxDQUFYLENBQWYsQ0FDQSxHQUFLbTJCLFNBQVNtMkUsTUFBZCxDQUF1Qm4yRSxTQUFTbTJFLE1BQVQsQ0FBaUI0QixRQUFqQixFQUV2QixDQUVEOXRFLE1BQU1ndEUsT0FBTixDQUFjTixPQUFkLENBQXVCdndFLEdBQXZCLEVBRUEsQ0FoQk0sSUFnQkEsQ0FFTixJQUFNLE1BQVEsQ0FBUixDQUFXNkMsR0FBS292RSxVQUFVN3VHLE1BQWhDLENBQXdDSyxFQUFJby9CLEVBQTVDLENBQWdEcC9CLEdBQWhELENBQXVELENBRXRELGFBQWV3dUcsVUFBV3h1RyxDQUFYLENBQWYsQ0FDQSxHQUFLbTJCLFNBQVNxMkUsT0FBZCxDQUF3QnIyRSxTQUFTcTJFLE9BQVQsQ0FBa0JyOUYsS0FBbEIsRUFFeEIsQ0FFRGl4QixNQUFNZ3RFLE9BQU4sQ0FBY04sT0FBZCxDQUF1QnZ3RSxHQUF2QixFQUNBNkQsTUFBTWd0RSxPQUFOLENBQWNMLFNBQWQsQ0FBeUJ4d0UsR0FBekIsRUFFQSxDQUVELENBbkRELENBbURHLEtBbkRILEVBcURBK3hFLFFBQVFyK0YsZ0JBQVIsQ0FBMEIsVUFBMUIsQ0FBc0MsU0FBV2QsS0FBWCxDQUFtQixDQUV4RCxjQUFnQnUrRixRQUFTbnhFLEdBQVQsQ0FBaEIsQ0FFQSxJQUFNLE1BQVEsQ0FBUixDQUFXNkMsR0FBS292RSxVQUFVN3VHLE1BQWhDLENBQXdDSyxFQUFJby9CLEVBQTVDLENBQWdEcC9CLEdBQWhELENBQXVELENBRXRELGFBQWV3dUcsVUFBV3h1RyxDQUFYLENBQWYsQ0FDQSxHQUFLbTJCLFNBQVNvMkUsVUFBZCxDQUEyQnAyRSxTQUFTbzJFLFVBQVQsQ0FBcUJwOUYsS0FBckIsRUFFM0IsQ0FFRCxDQVhELENBV0csS0FYSCxFQWFBbS9GLFFBQVFyK0YsZ0JBQVIsQ0FBMEIsT0FBMUIsQ0FBbUMsU0FBV2QsS0FBWCxDQUFtQixDQUVyRCxjQUFnQnUrRixRQUFTbnhFLEdBQVQsQ0FBaEIsQ0FFQSxlQUFnQkEsR0FBVCxDQUFQLENBRUEsSUFBTSxNQUFRLENBQVIsQ0FBVzZDLEdBQUtvdkUsVUFBVTd1RyxNQUFoQyxDQUF3Q0ssRUFBSW8vQixFQUE1QyxDQUFnRHAvQixHQUFoRCxDQUF1RCxDQUV0RCxhQUFld3VHLFVBQVd4dUcsQ0FBWCxDQUFmLENBQ0EsR0FBS20yQixTQUFTcTJFLE9BQWQsQ0FBd0JyMkUsU0FBU3EyRSxPQUFULENBQWtCcjlGLEtBQWxCLEVBRXhCLENBRURpeEIsTUFBTWd0RSxPQUFOLENBQWNOLE9BQWQsQ0FBdUJ2d0UsR0FBdkIsRUFDQTZELE1BQU1ndEUsT0FBTixDQUFjTCxTQUFkLENBQXlCeHdFLEdBQXpCLEVBRUEsQ0FoQkQsQ0FnQkcsS0FoQkgsRUFrQkEsR0FBSyxLQUFLeXhFLFlBQUwsR0FBc0IxdkcsU0FBM0IsQ0FBdUNnd0csUUFBUU4sWUFBUixDQUF1QixLQUFLQSxZQUE1QixDQUN2QyxHQUFLLEtBQUtTLGVBQUwsR0FBeUJud0csU0FBOUIsQ0FBMENnd0csUUFBUUcsZUFBUixDQUEwQixLQUFLQSxlQUEvQixDQUUxQyxHQUFLSCxRQUFRSSxnQkFBYixDQUFnQ0osUUFBUUksZ0JBQVIsQ0FBMEIsS0FBS1AsUUFBTCxHQUFrQjd2RyxTQUFsQixDQUE4QixLQUFLNnZHLFFBQW5DLENBQThDLFlBQXhFLEVBRWhDLElBQU0sVUFBTixTQUF5QlEsYUFBekIsQ0FBeUMsQ0FFeENMLFFBQVFNLGdCQUFSLENBQTBCQyxNQUExQixDQUFrQyxLQUFLRixhQUFMLENBQW9CRSxNQUFwQixDQUFsQyxFQUVBLENBRURQLFFBQVFRLElBQVIsQ0FBYyxJQUFkLEVBRUEsQ0FFRDF1RSxNQUFNZ3RFLE9BQU4sQ0FBY1YsU0FBZCxDQUF5Qm53RSxHQUF6QixFQUVBLGNBQUEsQ0FFQSxDQWhRbUMsQ0FrUXBDd3lFLFFBQVMsU0FBV3B5RyxLQUFYLENBQW1CLENBRTNCLEtBQUt3akUsSUFBTCxDQUFZeGpFLEtBQVosQ0FDQSxXQUFBLENBRUEsQ0F2UW1DLENBeVFwQ3F5RyxnQkFBaUIsU0FBV3J5RyxLQUFYLENBQW1CLENBRW5DLEtBQUtxeEcsWUFBTCxDQUFvQnJ4RyxLQUFwQixDQUNBLFdBQUEsQ0FFQSxDQTlRbUMsQ0FnUnBDc3lHLG1CQUFvQixTQUFXdHlHLEtBQVgsQ0FBbUIsQ0FFdEMsS0FBSzh4RyxlQUFMLENBQXVCOXhHLEtBQXZCLENBQ0EsV0FBQSxDQUVBLENBclJtQyxDQXVScEN1eUcsWUFBYSxTQUFXdnlHLEtBQVgsQ0FBbUIsQ0FFL0IsS0FBS3d4RyxRQUFMLENBQWdCeHhHLEtBQWhCLENBQ0EsV0FBQSxDQUVBLENBNVJtQyxDQThScENpeUcsaUJBQWtCLFNBQVdqeUcsS0FBWCxDQUFtQixDQUVwQyxLQUFLZ3lHLGFBQUwsQ0FBcUJoeUcsS0FBckIsQ0FDQSxXQUFBLENBRUEsQ0FuU21DLENBQXJDLEVBdVNBOzs7O0tBTUEsZ0NBQUEsQ0FBa0N5d0csT0FBbEMsQ0FBNEMsQ0FFM0MsS0FBS0EsT0FBTCxDQUFpQkEsVUFBWTl1RyxTQUFkLENBQTRCOHVHLE9BQTVCLENBQXNDQyxxQkFBckQsQ0FFQTtFQUNBLEtBQUs4QixPQUFMLENBQWUsSUFBZixDQUVBLENBRURsMkcsT0FBTzRuQixNQUFQLENBQWV1dUYsd0JBQXdCbDJHLFNBQXZDLENBQWtELENBRWpEcTBHLEtBQU0sU0FBV2h4RSxHQUFYLENBQWdCK3ZFLE1BQWhCLENBQXdCQyxVQUF4QixDQUFvQ0MsT0FBcEMsQ0FBOEMsQ0FFbkQsVUFBWSxJQUFaLENBRUEsV0FBYSxFQUFiLENBRUEsWUFBYyxxQkFBQSxFQUFkLENBQ0FodkUsUUFBUTdELEtBQVIsQ0FBZ0IyQyxNQUFoQixDQUVBLFdBQWEsY0FBQSxDQUFnQixLQUFLOHdFLE9BQXJCLENBQWIsQ0FDQWlDLE9BQU9OLE9BQVAsQ0FBZ0IsS0FBSzV1QyxJQUFyQixFQUNBa3ZDLE9BQU9MLGVBQVAsQ0FBd0IsYUFBeEIsRUFFQSxvQkFBQSxDQUFzQmh2RyxDQUF0QixDQUEwQixDQUV6QnF2RyxPQUFPOUIsSUFBUCxDQUFhaHhFLElBQUt2OEIsQ0FBTCxDQUFiLENBQXVCLFNBQVdtMkMsTUFBWCxDQUFvQixDQUUxQyxhQUFlL1YsTUFBTSt1RSxPQUFOLENBQWVoNUQsTUFBZixDQUF1QixJQUF2QixDQUFmLENBRUE3WixPQUFRdDhCLENBQVIsRUFBYyxDQUNiKzdCLE1BQU91ekUsU0FBU3Z6RSxLQURILENBRWJDLE9BQVFzekUsU0FBU3R6RSxNQUZKLENBR2IvQixPQUFRcTFFLFNBQVNyMUUsTUFISixDQUliTyxRQUFTODBFLFNBQVM5MEUsT0FKTCxDQUFkLENBT0ErMEUsUUFBVSxDQUFWLENBRUEsR0FBS0EsU0FBVyxDQUFoQixDQUFvQixDQUVuQixHQUFLRCxTQUFTRSxXQUFULEdBQXlCLENBQTlCLENBQ0NoeUUsUUFBUXhELFNBQVIsQ0FBb0JXLFlBQXBCLENBRUQ2QyxRQUFRdkQsTUFBUixDQUFpQnExRSxTQUFTcjFFLE1BQTFCLENBQ0F1RCxRQUFRbXFCLFdBQVIsQ0FBc0IsSUFBdEIsQ0FFQSxHQUFLMmtELE1BQUwsQ0FBY0EsT0FBUTl1RSxPQUFSLEVBRWQsQ0FFRCxDQXpCRCxDQXlCRyt1RSxVQXpCSCxDQXlCZUMsT0F6QmYsRUEyQkEsQ0FFRCxHQUFLMS9GLE1BQU15TSxPQUFOLENBQWVnakIsR0FBZixDQUFMLENBQTRCLENBRTNCLFdBQWEsQ0FBYixDQUVBLElBQU0sTUFBUSxDQUFSLENBQVc2QyxHQUFLN0MsSUFBSTU4QixNQUExQixDQUFrQ0ssRUFBSW8vQixFQUF0QyxDQUEwQyxFQUFHcC9CLENBQTdDLENBQWlELENBRWhEeXZHLFlBQWF6dkcsQ0FBYixFQUVBLENBRUQsQ0FWRCxJQVVPO0VBSU5xdkcsT0FBTzlCLElBQVAsQ0FBYWh4RSxHQUFiLENBQWtCLFNBQVc0WixNQUFYLENBQW9CLENBRXJDLGFBQWUvVixNQUFNK3VFLE9BQU4sQ0FBZWg1RCxNQUFmLENBQXVCLElBQXZCLENBQWYsQ0FFQSxHQUFLbTVELFNBQVNJLFNBQWQsQ0FBMEIsQ0FFekIsVUFBWUosU0FBUzkwRSxPQUFULENBQWlCNzZCLE1BQWpCLENBQTBCMnZHLFNBQVNFLFdBQS9DLENBRUEsSUFBTSxNQUFRLENBQWQsQ0FBaUI5cUcsRUFBSXE1QyxLQUFyQixDQUE0QnI1QyxHQUE1QixDQUFtQyxDQUVsQzQzQixPQUFRNTNCLENBQVIsRUFBYyxDQUFFODFCLFFBQVMsRUFBWCxDQUFkLENBRUEsSUFBTSxNQUFRLENBQWQsQ0FBaUJ4NkIsRUFBSXN2RyxTQUFTRSxXQUE5QixDQUEyQ3h2RyxHQUEzQyxDQUFrRCxDQUVqRHM4QixPQUFRNTNCLENBQVIsRUFBWTgxQixPQUFaLENBQW9CcjdCLElBQXBCLENBQTBCbXdHLFNBQVM5MEUsT0FBVCxDQUFrQjkxQixFQUFJNHFHLFNBQVNFLFdBQWIsQ0FBMkJ4dkcsQ0FBN0MsQ0FBMUIsRUFDQXM4QixPQUFRNTNCLENBQVIsRUFBWXUxQixNQUFaLENBQXFCcTFFLFNBQVNyMUUsTUFBOUIsQ0FDQXFDLE9BQVE1M0IsQ0FBUixFQUFZcTNCLEtBQVosQ0FBb0J1ekUsU0FBU3Z6RSxLQUE3QixDQUNBTyxPQUFRNTNCLENBQVIsRUFBWXMzQixNQUFaLENBQXFCc3pFLFNBQVN0ekUsTUFBOUIsQ0FFQSxDQUVELENBRUQsQ0FuQkQsSUFtQk8sQ0FFTndCLFFBQVE3RCxLQUFSLENBQWNvQyxLQUFkLENBQXNCdXpFLFNBQVN2ekUsS0FBL0IsQ0FDQXlCLFFBQVE3RCxLQUFSLENBQWNxQyxNQUFkLENBQXVCc3pFLFNBQVN0ekUsTUFBaEMsQ0FDQXdCLFFBQVFoRCxPQUFSLENBQWtCODBFLFNBQVM5MEUsT0FBM0IsQ0FFQSxDQUVELEdBQUs4MEUsU0FBU0UsV0FBVCxHQUF5QixDQUE5QixDQUFrQyxDQUVqQ2h5RSxRQUFReEQsU0FBUixDQUFvQlcsWUFBcEIsQ0FFQSxDQUVENkMsUUFBUXZELE1BQVIsQ0FBaUJxMUUsU0FBU3IxRSxNQUExQixDQUNBdUQsUUFBUW1xQixXQUFSLENBQXNCLElBQXRCLENBRUEsR0FBSzJrRCxNQUFMLENBQWNBLE9BQVE5dUUsT0FBUixFQUVkLENBMUNELENBMENHK3VFLFVBMUNILENBMENlQyxPQTFDZixFQTRDQSxDQUVELGNBQUEsQ0FFQSxDQTVHZ0QsQ0E4R2pEdUMsUUFBUyxTQUFXcHlHLEtBQVgsQ0FBbUIsQ0FFM0IsS0FBS3dqRSxJQUFMLENBQVl4akUsS0FBWixDQUNBLFdBQUEsQ0FFQSxDQW5IZ0QsQ0FBbEQsRUF1SEE7Ozs7S0FNQSwwQkFBQSxDQUE0Qnl3RyxPQUE1QixDQUFzQyxDQUVyQyxLQUFLQSxPQUFMLENBQWlCQSxVQUFZOXVHLFNBQWQsQ0FBNEI4dUcsT0FBNUIsQ0FBc0NDLHFCQUFyRCxDQUVBO0VBQ0EsS0FBSzhCLE9BQUwsQ0FBZSxJQUFmLENBRUEsQ0FFRGwyRyxPQUFPNG5CLE1BQVAsQ0FBZTh1RixrQkFBa0J6MkcsU0FBakMsQ0FBNEMsQ0FFM0NxMEcsS0FBTSxTQUFXaHhFLEdBQVgsQ0FBZ0IrdkUsTUFBaEIsQ0FBd0JDLFVBQXhCLENBQW9DQyxPQUFwQyxDQUE4QyxDQUVuRCxVQUFZLElBQVosQ0FFQSxZQUFjLGVBQUEsRUFBZCxDQUVBLFdBQWEsY0FBQSxDQUFnQixLQUFLWSxPQUFyQixDQUFiLENBQ0FpQyxPQUFPTCxlQUFQLENBQXdCLGFBQXhCLEVBRUFLLE9BQU85QixJQUFQLENBQWFoeEUsR0FBYixDQUFrQixTQUFXNFosTUFBWCxDQUFvQixDQUVyQyxZQUFjL1YsTUFBTSt1RSxPQUFOLENBQWVoNUQsTUFBZixDQUFkLENBRUEsR0FBSyxDQUFFeTVELE9BQVAsQ0FBaUIsT0FFakIsR0FBS3R4RyxZQUFjc3hHLFFBQVFqMkUsS0FBM0IsQ0FBbUMsQ0FFbEM2RCxRQUFRN0QsS0FBUixDQUFnQmkyRSxRQUFRajJFLEtBQXhCLENBRUEsQ0FKRCxRQUlZcjdCLFlBQWNzeEcsUUFBUXZnRyxJQUEzQixDQUFrQyxDQUV4Q211QixRQUFRN0QsS0FBUixDQUFjb0MsS0FBZCxDQUFzQjZ6RSxRQUFRN3pFLEtBQTlCLENBQ0F5QixRQUFRN0QsS0FBUixDQUFjcUMsTUFBZCxDQUF1QjR6RSxRQUFRNXpFLE1BQS9CLENBQ0F3QixRQUFRN0QsS0FBUixDQUFjdHFCLElBQWQsQ0FBcUJ1Z0csUUFBUXZnRyxJQUE3QixDQUVBLENBRURtdUIsUUFBUTNELEtBQVIsQ0FBZ0J2N0IsWUFBY3N4RyxRQUFRLzFFLEtBQXRCLENBQThCKzFFLFFBQVEvMUUsS0FBdEMsQ0FBOENhLG1CQUE5RCxDQUNBOEMsUUFBUTFELEtBQVIsQ0FBZ0J4N0IsWUFBY3N4RyxRQUFROTFFLEtBQXRCLENBQThCODFFLFFBQVE5MUUsS0FBdEMsQ0FBOENZLG1CQUE5RCxDQUVBOEMsUUFBUXpELFNBQVIsQ0FBb0J6N0IsWUFBY3N4RyxRQUFRNzFFLFNBQXRCLENBQWtDNjFFLFFBQVE3MUUsU0FBMUMsQ0FBc0RZLFlBQTFFLENBQ0E2QyxRQUFReEQsU0FBUixDQUFvQjE3QixZQUFjc3hHLFFBQVE1MUUsU0FBdEIsQ0FBa0M0MUUsUUFBUTUxRSxTQUExQyxDQUFzRFksd0JBQTFFLENBRUE0QyxRQUFRdEQsVUFBUixDQUFxQjU3QixZQUFjc3hHLFFBQVExMUUsVUFBdEIsQ0FBbUMwMUUsUUFBUTExRSxVQUEzQyxDQUF3RCxDQUE3RSxDQUVBLEdBQUs1N0IsWUFBY3N4RyxRQUFRMzFFLE1BQTNCLENBQW9DLENBRW5DdUQsUUFBUXZELE1BQVIsQ0FBaUIyMUUsUUFBUTMxRSxNQUF6QixDQUVBLENBQ0QsR0FBSzM3QixZQUFjc3hHLFFBQVFqMUcsSUFBM0IsQ0FBa0MsQ0FFakM2aUMsUUFBUTdpQyxJQUFSLENBQWVpMUcsUUFBUWoxRyxJQUF2QixDQUVBLENBRUQsR0FBSzJELFlBQWNzeEcsUUFBUXAxRSxPQUEzQixDQUFxQyxDQUVwQ2dELFFBQVFoRCxPQUFSLENBQWtCbzFFLFFBQVFwMUUsT0FBMUIsQ0FFQSxDQUVELEdBQUssSUFBTW8xRSxRQUFRSixXQUFuQixDQUFpQyxDQUVoQ2h5RSxRQUFReEQsU0FBUixDQUFvQlcsWUFBcEIsQ0FFQSxDQUVENkMsUUFBUW1xQixXQUFSLENBQXNCLElBQXRCLENBRUEsR0FBSzJrRCxNQUFMLENBQWNBLE9BQVE5dUUsT0FBUixDQUFpQm95RSxPQUFqQixFQUVkLENBckRELENBcURHckQsVUFyREgsQ0FxRGVDLE9BckRmLEVBd0RBLGNBQUEsQ0FFQSxDQXJFMEMsQ0FBNUMsRUF5RUE7O0tBSUEsb0JBQUEsQ0FBc0JZLE9BQXRCLENBQWdDLENBRS9CLEtBQUtBLE9BQUwsQ0FBaUJBLFVBQVk5dUcsU0FBZCxDQUE0Qjh1RyxPQUE1QixDQUFzQ0MscUJBQXJELENBRUEsQ0FFRHAwRyxPQUFPNG5CLE1BQVAsQ0FBZWd2RixZQUFZMzJHLFNBQTNCLENBQXNDLENBRXJDNDJHLFlBQWEsV0FGd0IsQ0FJckN2QyxLQUFNLFNBQVdoeEUsR0FBWCxDQUFnQit2RSxNQUFoQixDQUF3QkMsVUFBeEIsQ0FBb0NDLE9BQXBDLENBQThDLENBRW5ELEdBQUtqd0UsTUFBUWorQixTQUFiLENBQXlCaStCLElBQU0sRUFBTixDQUV6QixHQUFLLEtBQUs0akMsSUFBTCxHQUFjN2hFLFNBQW5CLENBQStCaStCLElBQU0sS0FBSzRqQyxJQUFMLENBQVk1akMsR0FBbEIsQ0FFL0JBLElBQU0sS0FBSzZ3RSxPQUFMLENBQWFKLFVBQWIsQ0FBeUJ6d0UsR0FBekIsQ0FBTixDQUVBLFVBQVksSUFBWixDQUVBLFdBQWFpeEUsTUFBTTlwRyxHQUFOLENBQVc2NEIsR0FBWCxDQUFiLENBRUEsR0FBS2t4RSxTQUFXbnZHLFNBQWhCLENBQTRCLENBRTNCOGhDLE1BQU1ndEUsT0FBTixDQUFjVixTQUFkLENBQXlCbndFLEdBQXpCLEVBRUFsc0IsV0FBWSxVQUFZLENBRXZCLEdBQUtpOEYsTUFBTCxDQUFjQSxPQUFRbUIsTUFBUixFQUVkcnRFLE1BQU1ndEUsT0FBTixDQUFjTixPQUFkLENBQXVCdndFLEdBQXZCLEVBRUEsQ0FORCxDQU1HLENBTkgsRUFRQSxhQUFBLENBRUEsQ0FFRCxVQUFZMzRCLFNBQVNrNEIsZUFBVCxDQUEwQiw4QkFBMUIsQ0FBMEQsS0FBMUQsQ0FBWixDQUVBbkMsTUFBTTFwQixnQkFBTixDQUF3QixNQUF4QixDQUFnQyxVQUFZLENBRTNDdTlGLE1BQU0zb0YsR0FBTixDQUFXMFgsR0FBWCxDQUFnQixJQUFoQixFQUVBLEdBQUsrdkUsTUFBTCxDQUFjQSxPQUFRLElBQVIsRUFFZGxzRSxNQUFNZ3RFLE9BQU4sQ0FBY04sT0FBZCxDQUF1QnZ3RSxHQUF2QixFQUVBLENBUkQsQ0FRRyxLQVJILEVBVUE7Ozs7OztNQVFBNUMsTUFBTTFwQixnQkFBTixDQUF3QixPQUF4QixDQUFpQyxTQUFXZCxLQUFYLENBQW1CLENBRW5ELEdBQUtxOUYsT0FBTCxDQUFlQSxRQUFTcjlGLEtBQVQsRUFFZml4QixNQUFNZ3RFLE9BQU4sQ0FBY04sT0FBZCxDQUF1QnZ3RSxHQUF2QixFQUNBNkQsTUFBTWd0RSxPQUFOLENBQWNMLFNBQWQsQ0FBeUJ4d0UsR0FBekIsRUFFQSxDQVBELENBT0csS0FQSCxFQVNBLEdBQUtBLElBQUl3ekUsTUFBSixDQUFZLENBQVosQ0FBZSxDQUFmLElBQXVCLE9BQTVCLENBQXNDLENBRXJDLEdBQUssS0FBS0QsV0FBTCxHQUFxQnh4RyxTQUExQixDQUFzQ3E3QixNQUFNbTJFLFdBQU4sQ0FBb0IsS0FBS0EsV0FBekIsQ0FFdEMsQ0FFRDF2RSxNQUFNZ3RFLE9BQU4sQ0FBY1YsU0FBZCxDQUF5Qm53RSxHQUF6QixFQUVBNUMsTUFBTXp3QixHQUFOLENBQVlxekIsR0FBWixDQUVBLFlBQUEsQ0FFQSxDQXpFb0MsQ0EyRXJDeXpFLGVBQWdCLFNBQVdyekcsS0FBWCxDQUFtQixDQUVsQyxLQUFLbXpHLFdBQUwsQ0FBbUJuekcsS0FBbkIsQ0FDQSxXQUFBLENBRUEsQ0FoRm9DLENBa0ZyQ295RyxRQUFTLFNBQVdweUcsS0FBWCxDQUFtQixDQUUzQixLQUFLd2pFLElBQUwsQ0FBWXhqRSxLQUFaLENBQ0EsV0FBQSxDQUVBLENBdkZvQyxDQUF0QyxFQTJGQTs7S0FJQSwwQkFBQSxDQUE0Qnl3RyxPQUE1QixDQUFzQyxDQUVyQyxLQUFLQSxPQUFMLENBQWlCQSxVQUFZOXVHLFNBQWQsQ0FBNEI4dUcsT0FBNUIsQ0FBc0NDLHFCQUFyRCxDQUVBLENBRURwMEcsT0FBTzRuQixNQUFQLENBQWVvdkYsa0JBQWtCLzJHLFNBQWpDLENBQTRDLENBRTNDNDJHLFlBQWEsV0FGOEIsQ0FJM0N2QyxLQUFNLFNBQVcyQyxJQUFYLENBQWlCNUQsTUFBakIsQ0FBeUJDLFVBQXpCLENBQXFDQyxPQUFyQyxDQUErQyxDQUVwRCxZQUFjLGVBQUEsRUFBZCxDQUVBLFdBQWEsZUFBQSxDQUFpQixLQUFLWSxPQUF0QixDQUFiLENBQ0FpQyxPQUFPVyxjQUFQLENBQXVCLEtBQUtGLFdBQTVCLEVBQ0FULE9BQU9OLE9BQVAsQ0FBZ0IsS0FBSzV1QyxJQUFyQixFQUVBLFdBQWEsQ0FBYixDQUVBLG9CQUFBLENBQXNCbmdFLENBQXRCLENBQTBCLENBRXpCcXZHLE9BQU85QixJQUFQLENBQWEyQyxLQUFNbHdHLENBQU4sQ0FBYixDQUF3QixTQUFXMjVCLEtBQVgsQ0FBbUIsQ0FFMUM2RCxRQUFRbEIsTUFBUixDQUFnQnQ4QixDQUFoQixFQUFzQjI1QixLQUF0QixDQUVBNDFFLFNBRUEsR0FBS0EsU0FBVyxDQUFoQixDQUFvQixDQUVuQi94RSxRQUFRbXFCLFdBQVIsQ0FBc0IsSUFBdEIsQ0FFQSxHQUFLMmtELE1BQUwsQ0FBY0EsT0FBUTl1RSxPQUFSLEVBRWQsQ0FFRCxDQWRELENBY0dsL0IsU0FkSCxDQWNja3VHLE9BZGQsRUFnQkEsQ0FFRCxJQUFNLE1BQVEsQ0FBZCxDQUFpQnhzRyxFQUFJa3dHLEtBQUt2d0csTUFBMUIsQ0FBa0MsRUFBR0ssQ0FBckMsQ0FBeUMsQ0FFeEN5dkcsWUFBYXp2RyxDQUFiLEVBRUEsQ0FFRCxjQUFBLENBRUEsQ0ExQzBDLENBNEMzQ2d3RyxlQUFnQixTQUFXcnpHLEtBQVgsQ0FBbUIsQ0FFbEMsS0FBS216RyxXQUFMLENBQW1CbnpHLEtBQW5CLENBQ0EsV0FBQSxDQUVBLENBakQwQyxDQW1EM0NveUcsUUFBUyxTQUFXcHlHLEtBQVgsQ0FBbUIsQ0FFM0IsS0FBS3dqRSxJQUFMLENBQVl4akUsS0FBWixDQUNBLFdBQUEsQ0FFQSxDQXhEMEMsQ0FBNUMsRUE0REE7O0tBSUEsc0JBQUEsQ0FBd0J5d0csT0FBeEIsQ0FBa0MsQ0FFakMsS0FBS0EsT0FBTCxDQUFpQkEsVUFBWTl1RyxTQUFkLENBQTRCOHVHLE9BQTVCLENBQXNDQyxxQkFBckQsQ0FFQSxDQUVEcDBHLE9BQU80bkIsTUFBUCxDQUFlc3ZGLGNBQWNqM0csU0FBN0IsQ0FBd0MsQ0FFdkM0MkcsWUFBYSxXQUYwQixDQUl2Q3ZDLEtBQU0sU0FBV2h4RSxHQUFYLENBQWdCK3ZFLE1BQWhCLENBQXdCQyxVQUF4QixDQUFvQ0MsT0FBcEMsQ0FBOEMsQ0FFbkQsWUFBYyxXQUFBLEVBQWQsQ0FFQSxXQUFhLGVBQUEsQ0FBaUIsS0FBS1ksT0FBdEIsQ0FBYixDQUNBaUMsT0FBT1csY0FBUCxDQUF1QixLQUFLRixXQUE1QixFQUNBVCxPQUFPTixPQUFQLENBQWdCLEtBQUs1dUMsSUFBckIsRUFFQWt2QyxPQUFPOUIsSUFBUCxDQUFhaHhFLEdBQWIsQ0FBa0IsU0FBVzVDLEtBQVgsQ0FBbUIsQ0FFcEM2RCxRQUFRN0QsS0FBUixDQUFnQkEsS0FBaEIsQ0FFQTtFQUNBLFdBQWE0QyxJQUFJNnpFLE1BQUosQ0FBWSxlQUFaLEVBQWdDLENBQWhDLEVBQXFDN3pFLElBQUk2ekUsTUFBSixDQUFZLG9CQUFaLElBQXVDLENBQXpGLENBRUE1eUUsUUFBUXZELE1BQVIsQ0FBaUJvMkUsT0FBUzl6QixTQUFULENBQXFCMWhELFVBQXRDLENBQ0EyQyxRQUFRbXFCLFdBQVIsQ0FBc0IsSUFBdEIsQ0FFQSxHQUFLMmtELFNBQVdodUcsU0FBaEIsQ0FBNEIsQ0FFM0JndUcsT0FBUTl1RSxPQUFSLEVBRUEsQ0FFRCxDQWhCRCxDQWdCRyt1RSxVQWhCSCxDQWdCZUMsT0FoQmYsRUFrQkEsY0FBQSxDQUVBLENBaENzQyxDQWtDdkN3RCxlQUFnQixTQUFXcnpHLEtBQVgsQ0FBbUIsQ0FFbEMsS0FBS216RyxXQUFMLENBQW1CbnpHLEtBQW5CLENBQ0EsV0FBQSxDQUVBLENBdkNzQyxDQXlDdkNveUcsUUFBUyxTQUFXcHlHLEtBQVgsQ0FBbUIsQ0FFM0IsS0FBS3dqRSxJQUFMLENBQVl4akUsS0FBWixDQUNBLFdBQUEsQ0FFQSxDQTlDc0MsQ0FBeEMsRUFrREE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7a0VBbUNBLGNBQUEsRUFBaUIsQ0FFaEIsS0FBS2hDLElBQUwsQ0FBWSxPQUFaLENBRUEsS0FBSzIxRyxrQkFBTCxDQUEwQixHQUExQixDQUVBLENBRURyM0csT0FBTzRuQixNQUFQLENBQWUwdkYsTUFBTXIzRyxTQUFyQixDQUFnQztFQUcvQjtFQUVBczNHLFNBQVUsaUNBQXFDLENBRTlDdjdGLFFBQVE2UCxJQUFSLENBQWMsMkNBQWQsRUFDQSxXQUFBLENBRUEsQ0FWOEI7RUFhL0I7RUFFQXM0RSxXQUFZLFNBQVdqd0QsQ0FBWCxDQUFjc2pFLGNBQWQsQ0FBK0IsQ0FFMUMsTUFBUSxLQUFLQyxjQUFMLENBQXFCdmpFLENBQXJCLENBQVIsQ0FDQSxZQUFZcWpFLFFBQUwsQ0FBZXh0RixDQUFmLENBQWtCeXRGLGNBQWxCLENBQVAsQ0FFQSxDQXBCOEI7RUF3Qi9CRSxVQUFXLFNBQVdDLFNBQVgsQ0FBdUIsQ0FFakMsR0FBS0EsWUFBY3R5RyxTQUFuQixDQUErQnN5RyxVQUFZLENBQVosQ0FFL0IsV0FBYSxFQUFiLENBRUEsSUFBTSxNQUFRLENBQWQsQ0FBaUJ4bUYsR0FBS3dtRixTQUF0QixDQUFpQ3htRixHQUFqQyxDQUF3QyxDQUV2QzhVLE9BQU8vL0IsSUFBUCxDQUFhLEtBQUtxeEcsUUFBTCxDQUFlcG1GLEVBQUl3bUYsU0FBbkIsQ0FBYixFQUVBLENBRUQsYUFBQSxDQUVBLENBdEM4QjtFQTBDL0JoTixnQkFBaUIsU0FBV2dOLFNBQVgsQ0FBdUIsQ0FFdkMsR0FBS0EsWUFBY3R5RyxTQUFuQixDQUErQnN5RyxVQUFZLENBQVosQ0FFL0IsV0FBYSxFQUFiLENBRUEsSUFBTSxNQUFRLENBQWQsQ0FBaUJ4bUYsR0FBS3dtRixTQUF0QixDQUFpQ3htRixHQUFqQyxDQUF3QyxDQUV2QzhVLE9BQU8vL0IsSUFBUCxDQUFhLEtBQUtpK0YsVUFBTCxDQUFpQmh6RSxFQUFJd21GLFNBQXJCLENBQWIsRUFFQSxDQUVELGFBQUEsQ0FFQSxDQXhEOEI7RUE0RC9CQyxVQUFXLFVBQVksQ0FFdEIsWUFBYyxLQUFLQyxVQUFMLEVBQWQsQ0FDQSxlQUFnQkMsUUFBUXB4RyxNQUFSLENBQWlCLENBQTFCLENBQVAsQ0FFQSxDQWpFOEI7RUFxRS9CbXhHLFdBQVksU0FBV0YsU0FBWCxDQUF1QixDQUVsQyxHQUFLQSxZQUFjdHlHLFNBQW5CLENBQStCc3lHLFVBQVksS0FBS04sa0JBQWpCLENBRS9CLEdBQUssS0FBS1UsZUFBTCxFQUNGLEtBQUtBLGVBQUwsQ0FBcUJyeEcsTUFBckIsR0FBZ0NpeEcsVUFBWSxDQUQxQyxFQUVKLENBQUUsS0FBS2pwRCxXQUZSLENBRXNCLENBRXJCLFlBQVlxcEQsZUFBWixDQUVBLENBRUQsS0FBS3JwRCxXQUFMLENBQW1CLEtBQW5CLENBRUEsVUFBWSxFQUFaLENBQ0EsV0FBQSxDQUFhOTJDLEtBQU8sS0FBSzIvRixRQUFMLENBQWUsQ0FBZixDQUFwQixDQUNBLEtBQUEsQ0FBT3ZPLElBQU0sQ0FBYixDQUVBN2xELE1BQU1qOUMsSUFBTixDQUFZLENBQVosRUFFQSxJQUFNMGUsRUFBSSxDQUFWLENBQWFBLEdBQUsreUYsU0FBbEIsQ0FBNkIveUYsR0FBN0IsQ0FBb0MsQ0FFbkNvekYsUUFBVSxLQUFLVCxRQUFMLENBQWUzeUYsRUFBSSt5RixTQUFuQixDQUFWLENBQ0EzTyxLQUFPZ1AsUUFBUXZxRixVQUFSLENBQW9CN1YsSUFBcEIsQ0FBUCxDQUNBdXJDLE1BQU1qOUMsSUFBTixDQUFZOGlHLEdBQVosRUFDQXB4RixLQUFPb2dHLE9BQVAsQ0FFQSxDQUVELEtBQUtELGVBQUwsQ0FBdUI1MEQsS0FBdkIsQ0FFQSxZQUFBLENBQWM7RUFFZCxDQXRHOEIsQ0F3Ry9CODBELGlCQUFrQixVQUFZLENBRTdCLEtBQUt2cEQsV0FBTCxDQUFtQixJQUFuQixDQUNBLEtBQUttcEQsVUFBTCxHQUVBLENBN0c4QjtFQWlIL0JKLGVBQWdCLFNBQVd2akUsQ0FBWCxDQUFjckgsUUFBZCxDQUF5QixDQUV4QyxlQUFpQixLQUFLZ3JFLFVBQUwsRUFBakIsQ0FFQSxNQUFRLENBQVIsQ0FBVzF4RSxHQUFLK3hFLFdBQVd4eEcsTUFBM0IsQ0FFQSxtQkFBQSxDQUFxQjtFQUVyQixHQUFLbW1DLFFBQUwsQ0FBZ0IsQ0FFZnNyRSxnQkFBa0J0ckUsUUFBbEIsQ0FFQSxDQUpELElBSU8sQ0FFTnNyRSxnQkFBa0Jqa0UsRUFBSWdrRSxXQUFZL3hFLEdBQUssQ0FBakIsQ0FBdEIsQ0FFQSxDQUVEO0VBRUEsUUFBVSxDQUFWLENBQWEvYixLQUFPK2IsR0FBSyxDQUF6QixDQUE0Qml5RSxVQUE1QixDQUVBLE1BQVFqdUYsS0FBT0MsSUFBZixDQUFzQixDQUVyQnJqQixFQUFJNkIsS0FBS0UsS0FBTCxDQUFZcWhCLElBQU0sQ0FBRUMsS0FBT0QsR0FBVCxFQUFpQixDQUFuQyxDQUFKLENBQTRDO0VBRTVDaXVGLFdBQWFGLFdBQVlueEcsQ0FBWixFQUFrQm94RyxlQUEvQixDQUVBLEdBQUtDLFdBQWEsQ0FBbEIsQ0FBc0IsQ0FFckJqdUYsSUFBTXBqQixFQUFJLENBQVYsQ0FFQSxDQUpELFFBSVlxeEcsV0FBYSxDQUFsQixDQUFzQixDQUU1Qmh1RixLQUFPcmpCLEVBQUksQ0FBWCxDQUVBLENBSk0sSUFJQSxDQUVOcWpCLEtBQU9yakIsQ0FBUCxDQUNBLE1BRUE7RUFFQSxDQUVELENBRURBLEVBQUlxakIsSUFBSixDQUVBLEdBQUs4dEYsV0FBWW54RyxDQUFaLElBQW9Cb3hHLGVBQXpCLENBQTJDLENBRTFDLFVBQWFoeUUsR0FBSyxDQUFYLENBQVAsQ0FFQSxDQUVEO0VBRUEsaUJBQW1CK3hFLFdBQVlueEcsQ0FBWixDQUFuQixDQUNBLGdCQUFrQm14RyxXQUFZbnhHLEVBQUksQ0FBaEIsQ0FBbEIsQ0FFQSxrQkFBb0JzeEcsWUFBY0MsWUFBbEMsQ0FFQTtFQUVBLG9CQUFzQixDQUFFSCxnQkFBa0JHLFlBQXBCLEVBQXFDQyxhQUEzRCxDQUVBO0VBRUEsTUFBUSxDQUFFeHhHLEVBQUl5eEcsZUFBTixHQUE0QnJ5RSxHQUFLLENBQWpDLENBQVIsQ0FFQSxRQUFBLENBRUEsQ0F6TDhCO0VBNEwvQjtFQUNBO0VBQ0E7RUFFQXN5RSxXQUFZLFNBQVcxdUYsQ0FBWCxDQUFlLENBRTFCLFVBQVksTUFBWixDQUNBLE9BQVNBLEVBQUlxZ0IsS0FBYixDQUNBLE9BQVNyZ0IsRUFBSXFnQixLQUFiLENBRUE7RUFFQSxHQUFLbXRCLEdBQUssQ0FBVixDQUFjQSxHQUFLLENBQUwsQ0FDZCxHQUFLbWhELEdBQUssQ0FBVixDQUFjQSxHQUFLLENBQUwsQ0FFZCxRQUFVLEtBQUtuQixRQUFMLENBQWVoZ0QsRUFBZixDQUFWLENBQ0EsUUFBVSxLQUFLZ2dELFFBQUwsQ0FBZW1CLEVBQWYsQ0FBVixDQUVBLFFBQVVDLElBQUlqdEYsS0FBSixHQUFZTyxHQUFaLENBQWlCMnNGLEdBQWpCLENBQVYsQ0FDQSxXQUFXdHJGLFNBQUosRUFBUCxDQUVBLENBak44QixDQW1OL0J1ckYsYUFBYyxTQUFXM2tFLENBQVgsQ0FBZSxDQUU1QixNQUFRLEtBQUt1akUsY0FBTCxDQUFxQnZqRSxDQUFyQixDQUFSLENBQ0EsWUFBWXVrRSxVQUFMLENBQWlCMXVGLENBQWpCLENBQVAsQ0FFQSxDQXhOOEIsQ0EwTi9CKzVFLG9CQUFxQixTQUFXOE0sUUFBWCxDQUFxQnBOLE1BQXJCLENBQThCO0VBSWxELFdBQWEsV0FBQSxFQUFiLENBRUEsYUFBZSxFQUFmLENBQ0EsWUFBYyxFQUFkLENBQ0EsY0FBZ0IsRUFBaEIsQ0FFQSxRQUFVLFdBQUEsRUFBVixDQUNBLFFBQVUsV0FBQSxFQUFWLENBRUEsS0FBQSxDQUFPdHZELENBQVAsQ0FBVWpkLEtBQVYsQ0FFQTtFQUVBLElBQU1sd0IsRUFBSSxDQUFWLENBQWFBLEdBQUs2cEcsUUFBbEIsQ0FBNEI3cEcsR0FBNUIsQ0FBbUMsQ0FFbENtdEMsRUFBSW50QyxFQUFJNnBHLFFBQVIsQ0FFQWxOLFNBQVUzOEYsQ0FBVixFQUFnQixLQUFLOHhHLFlBQUwsQ0FBbUIza0UsQ0FBbkIsQ0FBaEIsQ0FDQXd2RCxTQUFVMzhGLENBQVYsRUFBY3VtQixTQUFkLEdBRUEsQ0FFRDtFQUNBO0VBRUFnNUIsUUFBUyxDQUFULEVBQWUsV0FBQSxFQUFmLENBQ0FzOUMsVUFBVyxDQUFYLEVBQWlCLFdBQUEsRUFBakIsQ0FDQSxRQUFVdjhFLE9BQU95eEYsU0FBakIsQ0FDQSxPQUFTbHdHLEtBQUt5a0IsR0FBTCxDQUFVcTJFLFNBQVUsQ0FBVixFQUFjcHFGLENBQXhCLENBQVQsQ0FDQSxPQUFTMVEsS0FBS3lrQixHQUFMLENBQVVxMkUsU0FBVSxDQUFWLEVBQWM1NUUsQ0FBeEIsQ0FBVCxDQUNBLE9BQVNsaEIsS0FBS3lrQixHQUFMLENBQVVxMkUsU0FBVSxDQUFWLEVBQWMveUUsQ0FBeEIsQ0FBVCxDQUVBLEdBQUs0RyxJQUFNOXBCLEdBQVgsQ0FBaUIsQ0FFaEJBLElBQU04cEIsRUFBTixDQUNBNEgsT0FBTzluQixHQUFQLENBQVksQ0FBWixDQUFlLENBQWYsQ0FBa0IsQ0FBbEIsRUFFQSxDQUVELEdBQUtpZ0IsSUFBTTdwQixHQUFYLENBQWlCLENBRWhCQSxJQUFNNnBCLEVBQU4sQ0FDQTZILE9BQU85bkIsR0FBUCxDQUFZLENBQVosQ0FBZSxDQUFmLENBQWtCLENBQWxCLEVBRUEsQ0FFRCxHQUFLMGhHLElBQU10ckcsR0FBWCxDQUFpQixDQUVoQjB4QixPQUFPOW5CLEdBQVAsQ0FBWSxDQUFaLENBQWUsQ0FBZixDQUFrQixDQUFsQixFQUVBLENBRUR3bkYsSUFBSXhyRSxZQUFKLENBQWtCcXdFLFNBQVUsQ0FBVixDQUFsQixDQUFpQ3ZrRSxNQUFqQyxFQUEwQzdSLFNBQTFDLEdBRUFnNUIsUUFBUyxDQUFULEVBQWFqekIsWUFBYixDQUEyQnF3RSxTQUFVLENBQVYsQ0FBM0IsQ0FBMEM3RSxHQUExQyxFQUNBK0UsVUFBVyxDQUFYLEVBQWV2d0UsWUFBZixDQUE2QnF3RSxTQUFVLENBQVYsQ0FBN0IsQ0FBNENwOUMsUUFBUyxDQUFULENBQTVDLEVBR0E7RUFFQSxJQUFNdi9DLEVBQUksQ0FBVixDQUFhQSxHQUFLNnBHLFFBQWxCLENBQTRCN3BHLEdBQTVCLENBQW1DLENBRWxDdS9DLFFBQVN2L0MsQ0FBVCxFQUFldS9DLFFBQVN2L0MsRUFBSSxDQUFiLEVBQWlCMmtCLEtBQWpCLEVBQWYsQ0FFQWs0RSxVQUFXNzhGLENBQVgsRUFBaUI2OEYsVUFBVzc4RixFQUFJLENBQWYsRUFBbUIya0IsS0FBbkIsRUFBakIsQ0FFQW16RSxJQUFJeHJFLFlBQUosQ0FBa0Jxd0UsU0FBVTM4RixFQUFJLENBQWQsQ0FBbEIsQ0FBcUMyOEYsU0FBVTM4RixDQUFWLENBQXJDLEVBRUEsR0FBSzgzRixJQUFJbjRGLE1BQUosR0FBZTJnQixPQUFPQyxPQUEzQixDQUFxQyxDQUVwQ3UzRSxJQUFJdnhFLFNBQUosR0FFQTJKLE1BQVFydUIsS0FBS3kyQixJQUFMLENBQVczVSxNQUFNdEIsS0FBTixDQUFhczZFLFNBQVUzOEYsRUFBSSxDQUFkLEVBQWtCa21CLEdBQWxCLENBQXVCeTJFLFNBQVUzOEYsQ0FBVixDQUF2QixDQUFiLENBQXFELENBQUUsQ0FBdkQsQ0FBMEQsQ0FBMUQsQ0FBWCxDQUFSLENBQW9GO0VBRXBGdS9DLFFBQVN2L0MsQ0FBVCxFQUFhNHVCLFlBQWIsQ0FBMkJxakYsSUFBSTVoRixnQkFBSixDQUFzQnluRSxHQUF0QixDQUEyQjVuRSxLQUEzQixDQUEzQixFQUVBLENBRUQyc0UsVUFBVzc4RixDQUFYLEVBQWVzc0IsWUFBZixDQUE2QnF3RSxTQUFVMzhGLENBQVYsQ0FBN0IsQ0FBNEN1L0MsUUFBU3YvQyxDQUFULENBQTVDLEVBRUEsQ0FFRDtFQUVBLEdBQUt5OEYsU0FBVyxJQUFoQixDQUF1QixDQUV0QnZzRSxNQUFRcnVCLEtBQUt5MkIsSUFBTCxDQUFXM1UsTUFBTXRCLEtBQU4sQ0FBYWs5QixRQUFTLENBQVQsRUFBYXI1QixHQUFiLENBQWtCcTVCLFFBQVNzcUQsUUFBVCxDQUFsQixDQUFiLENBQXNELENBQUUsQ0FBeEQsQ0FBMkQsQ0FBM0QsQ0FBWCxDQUFSLENBQ0EzNUUsT0FBUzI1RSxRQUFULENBRUEsR0FBS2xOLFNBQVUsQ0FBVixFQUFjejJFLEdBQWQsQ0FBbUI0eEUsSUFBSXhyRSxZQUFKLENBQWtCaXpCLFFBQVMsQ0FBVCxDQUFsQixDQUFnQ0EsUUFBU3NxRCxRQUFULENBQWhDLENBQW5CLEVBQTZFLENBQWxGLENBQXNGLENBRXJGMzVFLE1BQVEsQ0FBRUEsS0FBVixDQUVBLENBRUQsSUFBTWx3QixFQUFJLENBQVYsQ0FBYUEsR0FBSzZwRyxRQUFsQixDQUE0QjdwRyxHQUE1QixDQUFtQztFQUdsQ3UvQyxRQUFTdi9DLENBQVQsRUFBYTR1QixZQUFiLENBQTJCcWpGLElBQUk1aEYsZ0JBQUosQ0FBc0Jzc0UsU0FBVTM4RixDQUFWLENBQXRCLENBQXFDa3dCLE1BQVFsd0IsQ0FBN0MsQ0FBM0IsRUFDQTY4RixVQUFXNzhGLENBQVgsRUFBZXNzQixZQUFmLENBQTZCcXdFLFNBQVUzOEYsQ0FBVixDQUE3QixDQUE0Q3UvQyxRQUFTdi9DLENBQVQsQ0FBNUMsRUFFQSxDQUVELENBRUQsT0FBTyxDQUNOMjhGLFNBQVVBLFFBREosQ0FFTnA5QyxRQUFTQSxPQUZILENBR05zOUMsVUFBV0EsU0FITCxDQUFQLENBTUEsQ0E3VThCLENBK1UvQmw0RSxNQUFPLFVBQVksQ0FFbEIsZ0JBQWdCbnBCLFdBQVQsR0FBdUJvcEIsSUFBdkIsQ0FBNkIsSUFBN0IsQ0FBUCxDQUVBLENBblY4QixDQXFWL0JBLEtBQU0sU0FBVzVmLE1BQVgsQ0FBb0IsQ0FFekIsS0FBS3NyRyxrQkFBTCxDQUEwQnRyRyxPQUFPc3JHLGtCQUFqQyxDQUVBLFdBQUEsQ0FFQSxDQTNWOEIsQ0E2Vi9CNTBFLE9BQVEsVUFBWSxDQUVuQixTQUFXLENBQ1ZXLFNBQVUsQ0FDVHY1QixRQUFTLEdBREEsQ0FFVG5JLEtBQU0sT0FGRyxDQUdUUCxVQUFXLGNBSEYsQ0FEQSxDQUFYLENBUUFpVixLQUFLaWhHLGtCQUFMLENBQTBCLEtBQUtBLGtCQUEvQixDQUNBamhHLEtBQUsxVSxJQUFMLENBQVksS0FBS0EsSUFBakIsQ0FFQSxXQUFBLENBRUEsQ0E1VzhCLENBOFcvQnUzRyxTQUFVLFNBQVdDLElBQVgsQ0FBa0IsQ0FFM0IsS0FBSzdCLGtCQUFMLENBQTBCNkIsS0FBSzdCLGtCQUEvQixDQUVBLFdBQUEsQ0FFQSxDQXBYOEIsQ0FBaEMsRUF3WEEscUJBQUEsQ0FBdUI4QixFQUF2QixDQUEyQkMsRUFBM0IsQ0FBK0JDLE9BQS9CLENBQXdDQyxPQUF4QyxDQUFpREMsV0FBakQsQ0FBOERDLFNBQTlELENBQXlFQyxVQUF6RSxDQUFxRkMsU0FBckYsQ0FBaUcsQ0FFaEdwQyxNQUFNMzFHLElBQU4sQ0FBWSxJQUFaLEVBRUEsS0FBS0QsSUFBTCxDQUFZLGNBQVosQ0FFQSxLQUFLeTNHLEVBQUwsQ0FBVUEsSUFBTSxDQUFoQixDQUNBLEtBQUtDLEVBQUwsQ0FBVUEsSUFBTSxDQUFoQixDQUVBLEtBQUtDLE9BQUwsQ0FBZUEsU0FBVyxDQUExQixDQUNBLEtBQUtDLE9BQUwsQ0FBZUEsU0FBVyxDQUExQixDQUVBLEtBQUtDLFdBQUwsQ0FBbUJBLGFBQWUsQ0FBbEMsQ0FDQSxLQUFLQyxTQUFMLENBQWlCQSxXQUFhLEVBQUk1d0csS0FBSytmLEVBQXZDLENBRUEsS0FBSzh3RixVQUFMLENBQWtCQSxZQUFjLEtBQWhDLENBRUEsS0FBS0MsU0FBTCxDQUFpQkEsV0FBYSxDQUE5QixDQUVBLENBRURDLGFBQWExNUcsU0FBYixDQUF5QkQsT0FBT2lCLE1BQVAsQ0FBZXEyRyxNQUFNcjNHLFNBQXJCLENBQXpCLENBQ0EwNUcsYUFBYTE1RyxTQUFiLENBQXVCc0MsV0FBdkIsQ0FBcUNvM0csWUFBckMsQ0FFQUEsYUFBYTE1RyxTQUFiLENBQXVCMjVHLGNBQXZCLENBQXdDLElBQXhDLENBRUFELGFBQWExNUcsU0FBYixDQUF1QnMzRyxRQUF2QixDQUFrQyxTQUFXeHRGLENBQVgsQ0FBY3l0RixjQUFkLENBQStCLENBRWhFLFVBQVlBLGdCQUFrQixXQUFBLEVBQTlCLENBRUEsVUFBWTV1RyxLQUFLK2YsRUFBTCxDQUFVLENBQXRCLENBQ0EsZUFBaUIsS0FBSzZ3RixTQUFMLENBQWlCLEtBQUtELFdBQXZDLENBQ0EsZUFBaUIzd0csS0FBS3lrQixHQUFMLENBQVV3c0YsVUFBVixFQUF5Qnh5RixPQUFPQyxPQUFqRCxDQUVBO0VBQ0EsTUFBUXV5RixXQUFhLENBQXJCLENBQXlCQSxZQUFjQyxLQUFkLENBQ3pCLE1BQVFELFdBQWFDLEtBQXJCLENBQTZCRCxZQUFjQyxLQUFkLENBRTdCLEdBQUtELFdBQWF4eUYsT0FBT0MsT0FBekIsQ0FBbUMsQ0FFbEMsR0FBS3l5RixVQUFMLENBQWtCLENBRWpCRixXQUFhLENBQWIsQ0FFQSxDQUpELElBSU8sQ0FFTkEsV0FBYUMsS0FBYixDQUVBLENBRUQsQ0FFRCxHQUFLLEtBQUtMLFVBQUwsR0FBb0IsSUFBcEIsRUFBNEIsQ0FBRU0sVUFBbkMsQ0FBZ0QsQ0FFL0MsR0FBS0YsYUFBZUMsS0FBcEIsQ0FBNEIsQ0FFM0JELFdBQWEsQ0FBRUMsS0FBZixDQUVBLENBSkQsSUFJTyxDQUVORCxXQUFhQSxXQUFhQyxLQUExQixDQUVBLENBRUQsQ0FFRCxVQUFZLEtBQUtQLFdBQUwsQ0FBbUJ4dkYsRUFBSTh2RixVQUFuQyxDQUNBLE1BQVEsS0FBS1YsRUFBTCxDQUFVLEtBQUtFLE9BQUwsQ0FBZXp3RyxLQUFLaW1CLEdBQUwsQ0FBVXRCLEtBQVYsQ0FBakMsQ0FDQSxNQUFRLEtBQUs2ckYsRUFBTCxDQUFVLEtBQUtFLE9BQUwsQ0FBZTF3RyxLQUFLa21CLEdBQUwsQ0FBVXZCLEtBQVYsQ0FBakMsQ0FFQSxHQUFLLEtBQUttc0YsU0FBTCxHQUFtQixDQUF4QixDQUE0QixDQUUzQixRQUFVOXdHLEtBQUtpbUIsR0FBTCxDQUFVLEtBQUs2cUYsU0FBZixDQUFWLENBQ0EsUUFBVTl3RyxLQUFLa21CLEdBQUwsQ0FBVSxLQUFLNHFGLFNBQWYsQ0FBVixDQUVBLE9BQVNwZ0csRUFBSSxLQUFLNi9GLEVBQWxCLENBQ0EsT0FBU3J2RixFQUFJLEtBQUtzdkYsRUFBbEIsQ0FFQTtFQUNBOS9GLEVBQUlpZSxHQUFLMUksR0FBTCxDQUFXeUksR0FBS3hJLEdBQWhCLENBQXNCLEtBQUtxcUYsRUFBL0IsQ0FDQXJ2RixFQUFJeU4sR0FBS3pJLEdBQUwsQ0FBV3dJLEdBQUt6SSxHQUFoQixDQUFzQixLQUFLdXFGLEVBQS9CLENBRUEsQ0FFRCxhQUFhL2hHLEdBQU4sQ0FBV2lDLENBQVgsQ0FBY3dRLENBQWQsQ0FBUCxDQUVBLENBNURELENBOERBNnZGLGFBQWExNUcsU0FBYixDQUF1QjByQixJQUF2QixDQUE4QixTQUFXNWYsTUFBWCxDQUFvQixDQUVqRHVyRyxNQUFNcjNHLFNBQU4sQ0FBZ0IwckIsSUFBaEIsQ0FBcUJocUIsSUFBckIsQ0FBMkIsSUFBM0IsQ0FBaUNvSyxNQUFqQyxFQUVBLEtBQUtvdEcsRUFBTCxDQUFVcHRHLE9BQU9vdEcsRUFBakIsQ0FDQSxLQUFLQyxFQUFMLENBQVVydEcsT0FBT3F0RyxFQUFqQixDQUVBLEtBQUtDLE9BQUwsQ0FBZXR0RyxPQUFPc3RHLE9BQXRCLENBQ0EsS0FBS0MsT0FBTCxDQUFldnRHLE9BQU91dEcsT0FBdEIsQ0FFQSxLQUFLQyxXQUFMLENBQW1CeHRHLE9BQU93dEcsV0FBMUIsQ0FDQSxLQUFLQyxTQUFMLENBQWlCenRHLE9BQU95dEcsU0FBeEIsQ0FFQSxLQUFLQyxVQUFMLENBQWtCMXRHLE9BQU8wdEcsVUFBekIsQ0FFQSxLQUFLQyxTQUFMLENBQWlCM3RHLE9BQU8ydEcsU0FBeEIsQ0FFQSxXQUFBLENBRUEsQ0FuQkQsQ0FzQkFDLGFBQWExNUcsU0FBYixDQUF1QndpQyxNQUF2QixDQUFnQyxVQUFZLENBRTNDLFNBQVc2MEUsTUFBTXIzRyxTQUFOLENBQWdCd2lDLE1BQWhCLENBQXVCOWdDLElBQXZCLENBQTZCLElBQTdCLENBQVgsQ0FFQXlVLEtBQUsraUcsRUFBTCxDQUFVLEtBQUtBLEVBQWYsQ0FDQS9pRyxLQUFLZ2pHLEVBQUwsQ0FBVSxLQUFLQSxFQUFmLENBRUFoakcsS0FBS2lqRyxPQUFMLENBQWUsS0FBS0EsT0FBcEIsQ0FDQWpqRyxLQUFLa2pHLE9BQUwsQ0FBZSxLQUFLQSxPQUFwQixDQUVBbGpHLEtBQUttakcsV0FBTCxDQUFtQixLQUFLQSxXQUF4QixDQUNBbmpHLEtBQUtvakcsU0FBTCxDQUFpQixLQUFLQSxTQUF0QixDQUVBcGpHLEtBQUtxakcsVUFBTCxDQUFrQixLQUFLQSxVQUF2QixDQUVBcmpHLEtBQUtzakcsU0FBTCxDQUFpQixLQUFLQSxTQUF0QixDQUVBLFdBQUEsQ0FFQSxDQW5CRCxDQXFCQUMsYUFBYTE1RyxTQUFiLENBQXVCZzVHLFFBQXZCLENBQWtDLFNBQVdDLElBQVgsQ0FBa0IsQ0FFbkQ1QixNQUFNcjNHLFNBQU4sQ0FBZ0JnNUcsUUFBaEIsQ0FBeUJ0M0csSUFBekIsQ0FBK0IsSUFBL0IsQ0FBcUN1M0csSUFBckMsRUFFQSxLQUFLQyxFQUFMLENBQVVELEtBQUtDLEVBQWYsQ0FDQSxLQUFLQyxFQUFMLENBQVVGLEtBQUtFLEVBQWYsQ0FFQSxLQUFLQyxPQUFMLENBQWVILEtBQUtHLE9BQXBCLENBQ0EsS0FBS0MsT0FBTCxDQUFlSixLQUFLSSxPQUFwQixDQUVBLEtBQUtDLFdBQUwsQ0FBbUJMLEtBQUtLLFdBQXhCLENBQ0EsS0FBS0MsU0FBTCxDQUFpQk4sS0FBS00sU0FBdEIsQ0FFQSxLQUFLQyxVQUFMLENBQWtCUCxLQUFLTyxVQUF2QixDQUVBLEtBQUtDLFNBQUwsQ0FBaUJSLEtBQUtRLFNBQXRCLENBRUEsV0FBQSxDQUVBLENBbkJELENBcUJBLGlCQUFBLENBQW1CUCxFQUFuQixDQUF1QkMsRUFBdkIsQ0FBMkJZLE9BQTNCLENBQW9DVCxXQUFwQyxDQUFpREMsU0FBakQsQ0FBNERDLFVBQTVELENBQXlFLENBRXhFRSxhQUFhaDRHLElBQWIsQ0FBbUIsSUFBbkIsQ0FBeUJ3M0csRUFBekIsQ0FBNkJDLEVBQTdCLENBQWlDWSxPQUFqQyxDQUEwQ0EsT0FBMUMsQ0FBbURULFdBQW5ELENBQWdFQyxTQUFoRSxDQUEyRUMsVUFBM0UsRUFFQSxLQUFLLzNHLElBQUwsQ0FBWSxVQUFaLENBRUEsQ0FFRHU0RyxTQUFTaDZHLFNBQVQsQ0FBcUJELE9BQU9pQixNQUFQLENBQWUwNEcsYUFBYTE1RyxTQUE1QixDQUFyQixDQUNBZzZHLFNBQVNoNkcsU0FBVCxDQUFtQnNDLFdBQW5CLENBQWlDMDNHLFFBQWpDLENBRUFBLFNBQVNoNkcsU0FBVCxDQUFtQmk2RyxVQUFuQixDQUFnQyxJQUFoQyxDQUVBOzs7Ozs7Ozs7Ozs7Ozs7OztJQXNCQSxrQkFBQSxFQUFxQixDQUVwQixPQUFTLENBQVQsQ0FBWXAvRSxHQUFLLENBQWpCLENBQW9CRixHQUFLLENBQXpCLENBQTRCQyxHQUFLLENBQWpDLENBRUE7Ozs7Ozs7TUFRQSxhQUFBLENBQWVWLEVBQWYsQ0FBbUJKLEVBQW5CLENBQXVCdTlCLEVBQXZCLENBQTJCQyxFQUEzQixDQUFnQyxDQUUvQjRpRCxHQUFLaGdGLEVBQUwsQ0FDQVcsR0FBS3c4QixFQUFMLENBQ0ExOEIsR0FBSyxDQUFFLENBQUYsQ0FBTVQsRUFBTixDQUFXLEVBQUlKLEVBQWYsQ0FBb0IsRUFBSXU5QixFQUF4QixDQUE2QkMsRUFBbEMsQ0FDQTE4QixHQUFLLEVBQUlWLEVBQUosQ0FBUyxFQUFJSixFQUFiLENBQWtCdTlCLEVBQWxCLENBQXVCQyxFQUE1QixDQUVBLENBRUQsT0FBTyxDQUVONmlELGVBQWdCLFNBQVdqZ0YsRUFBWCxDQUFlSixFQUFmLENBQW1CdkgsRUFBbkIsQ0FBdUI2bkYsRUFBdkIsQ0FBMkJDLE9BQTNCLENBQXFDLENBRXBEcDVDLEtBQU1ubkMsRUFBTixDQUFVdkgsRUFBVixDQUFjOG5GLFNBQVk5bkYsR0FBSzJILEVBQWpCLENBQWQsQ0FBcUNtZ0YsU0FBWUQsR0FBS3RnRixFQUFqQixDQUFyQyxFQUVBLENBTkssQ0FRTndnRix5QkFBMEIsU0FBV3BnRixFQUFYLENBQWVKLEVBQWYsQ0FBbUJ2SCxFQUFuQixDQUF1QjZuRixFQUF2QixDQUEyQkcsR0FBM0IsQ0FBZ0NDLEdBQWhDLENBQXFDQyxHQUFyQyxDQUEyQztFQUdwRSxPQUFTLENBQUUzZ0YsR0FBS0ksRUFBUCxFQUFjcWdGLEdBQWQsQ0FBb0IsQ0FBRWhvRixHQUFLMkgsRUFBUCxHQUFnQnFnRixJQUFNQyxHQUF0QixDQUFwQixDQUFrRCxDQUFFam9GLEdBQUt1SCxFQUFQLEVBQWMwZ0YsR0FBekUsQ0FDQSxPQUFTLENBQUVqb0YsR0FBS3VILEVBQVAsRUFBYzBnRixHQUFkLENBQW9CLENBQUVKLEdBQUt0Z0YsRUFBUCxHQUFnQjBnRixJQUFNQyxHQUF0QixDQUFwQixDQUFrRCxDQUFFTCxHQUFLN25GLEVBQVAsRUFBY2tvRixHQUF6RSxDQUVBO0VBQ0FuakQsSUFBTWtqRCxHQUFOLENBQ0EvQixJQUFNK0IsR0FBTixDQUVBdjVDLEtBQU1ubkMsRUFBTixDQUFVdkgsRUFBVixDQUFjK2tDLEVBQWQsQ0FBa0JtaEQsRUFBbEIsRUFFQSxDQXBCSyxDQXNCTmlDLEtBQU0sU0FBVzV3RixDQUFYLENBQWUsQ0FFcEIsT0FBU0EsRUFBSUEsQ0FBYixDQUNBLE9BQVMydUYsR0FBSzN1RixDQUFkLENBQ0EsVUFBWStRLEdBQUsvUSxDQUFWLENBQWM2USxHQUFLODlFLEVBQW5CLENBQXdCNzlFLEdBQUsrL0UsRUFBcEMsQ0FFQSxDQTVCSyxDQUFQLENBZ0NBLENBRUQ7RUFFQSxRQUFVLFdBQUEsRUFBVixDQUNBLFNBQVcsYUFBQSxFQUFYLENBQ0EsT0FBUyxhQUFBLEVBQVQsQ0FDQSxPQUFTLGFBQUEsRUFBVCxDQUVBLHlCQUFBLENBQTJCMzBFLE1BQTNCLENBQW1DdTlELE1BQW5DLENBQTJDcVgsU0FBM0MsQ0FBc0RQLE9BQXRELENBQWdFLENBRS9EaEQsTUFBTTMxRyxJQUFOLENBQVksSUFBWixFQUVBLEtBQUtELElBQUwsQ0FBWSxrQkFBWixDQUVBLEtBQUt1a0MsTUFBTCxDQUFjQSxRQUFVLEVBQXhCLENBQ0EsS0FBS3U5RCxNQUFMLENBQWNBLFFBQVUsS0FBeEIsQ0FDQSxLQUFLcVgsU0FBTCxDQUFpQkEsV0FBYSxhQUE5QixDQUNBLEtBQUtQLE9BQUwsQ0FBZUEsU0FBVyxHQUExQixDQUVBLENBRURRLGlCQUFpQjc2RyxTQUFqQixDQUE2QkQsT0FBT2lCLE1BQVAsQ0FBZXEyRyxNQUFNcjNHLFNBQXJCLENBQTdCLENBQ0E2NkcsaUJBQWlCNzZHLFNBQWpCLENBQTJCc0MsV0FBM0IsQ0FBeUN1NEcsZ0JBQXpDLENBRUFBLGlCQUFpQjc2RyxTQUFqQixDQUEyQjg2RyxrQkFBM0IsQ0FBZ0QsSUFBaEQsQ0FFQUQsaUJBQWlCNzZHLFNBQWpCLENBQTJCczNHLFFBQTNCLENBQXNDLFNBQVd4dEYsQ0FBWCxDQUFjeXRGLGNBQWQsQ0FBK0IsQ0FFcEUsVUFBWUEsZ0JBQWtCLFdBQUEsRUFBOUIsQ0FFQSxXQUFhLEtBQUt2eEUsTUFBbEIsQ0FDQSxNQUFRQSxPQUFPdi9CLE1BQWYsQ0FFQSxNQUFRLENBQUU4QyxHQUFNLEtBQUtnNkYsTUFBTCxDQUFjLENBQWQsQ0FBa0IsQ0FBeEIsQ0FBRixFQUFrQ3o1RSxDQUExQyxDQUNBLGFBQWVuaEIsS0FBS0UsS0FBTCxDQUFZOGIsQ0FBWixDQUFmLENBQ0EsV0FBYUEsRUFBSW8yRixRQUFqQixDQUVBLEdBQUssS0FBS3hYLE1BQVYsQ0FBbUIsQ0FFbEJ3WCxVQUFZQSxTQUFXLENBQVgsQ0FBZSxDQUFmLENBQW1CLENBQUVweUcsS0FBS0UsS0FBTCxDQUFZRixLQUFLeWtCLEdBQUwsQ0FBVTJ0RixRQUFWLEVBQXVCeHhHLENBQW5DLEVBQXlDLENBQTNDLEVBQWlEQSxDQUFoRixDQUVBLENBSkQsUUFJWXl4RyxTQUFXLENBQVgsRUFBZ0JELFdBQWF4eEcsRUFBSSxDQUF0QyxDQUEwQyxDQUVoRHd4RyxTQUFXeHhHLEVBQUksQ0FBZixDQUNBeXhHLE9BQVMsQ0FBVCxDQUVBLENBRUQsTUFBQSxDQUFReHlFLEVBQVIsQ0FBWUMsRUFBWixDQUFnQnVDLEVBQWhCLENBQW9CO0VBRXBCLEdBQUssS0FBS3U0RCxNQUFMLEVBQWV3WCxTQUFXLENBQS9CLENBQW1DLENBRWxDeHlFLEdBQUt2QyxPQUFRLENBQUUrMEUsU0FBVyxDQUFiLEVBQW1CeHhHLENBQTNCLENBQUwsQ0FFQSxDQUpELElBSU87RUFHTnVzQixJQUFJN0osVUFBSixDQUFnQitaLE9BQVEsQ0FBUixDQUFoQixDQUE2QkEsT0FBUSxDQUFSLENBQTdCLEVBQTJDcmEsR0FBM0MsQ0FBZ0RxYSxPQUFRLENBQVIsQ0FBaEQsRUFDQXVDLEdBQUt6UyxHQUFMLENBRUEsQ0FFRDBTLEdBQUt4QyxPQUFRKzBFLFNBQVd4eEcsQ0FBbkIsQ0FBTCxDQUNBay9CLEdBQUt6QyxPQUFRLENBQUUrMEUsU0FBVyxDQUFiLEVBQW1CeHhHLENBQTNCLENBQUwsQ0FFQSxHQUFLLEtBQUtnNkYsTUFBTCxFQUFld1gsU0FBVyxDQUFYLENBQWV4eEcsQ0FBbkMsQ0FBdUMsQ0FFdEN5aEMsR0FBS2hGLE9BQVEsQ0FBRSswRSxTQUFXLENBQWIsRUFBbUJ4eEcsQ0FBM0IsQ0FBTCxDQUVBLENBSkQsSUFJTztFQUdOdXNCLElBQUk3SixVQUFKLENBQWdCK1osT0FBUXo4QixFQUFJLENBQVosQ0FBaEIsQ0FBaUN5OEIsT0FBUXo4QixFQUFJLENBQVosQ0FBakMsRUFBbURvaUIsR0FBbkQsQ0FBd0RxYSxPQUFRejhCLEVBQUksQ0FBWixDQUF4RCxFQUNBeWhDLEdBQUtsVixHQUFMLENBRUEsQ0FFRCxHQUFLLEtBQUs4a0YsU0FBTCxHQUFtQixhQUFuQixFQUFvQyxLQUFLQSxTQUFMLEdBQW1CLFNBQTVELENBQXdFO0VBR3ZFLFFBQVUsS0FBS0EsU0FBTCxHQUFtQixTQUFuQixDQUErQixHQUEvQixDQUFxQyxJQUEvQyxDQUNBLFFBQVVqeUcsS0FBSzJlLEdBQUwsQ0FBVWloQixHQUFHOWEsaUJBQUgsQ0FBc0IrYSxFQUF0QixDQUFWLENBQXNDbGhCLEdBQXRDLENBQVYsQ0FDQSxRQUFVM2UsS0FBSzJlLEdBQUwsQ0FBVWtoQixHQUFHL2EsaUJBQUgsQ0FBc0JnYixFQUF0QixDQUFWLENBQXNDbmhCLEdBQXRDLENBQVYsQ0FDQSxRQUFVM2UsS0FBSzJlLEdBQUwsQ0FBVW1oQixHQUFHaGIsaUJBQUgsQ0FBc0J1ZCxFQUF0QixDQUFWLENBQXNDMWpCLEdBQXRDLENBQVYsQ0FFQTtFQUNBLEdBQUtrekYsSUFBTSxJQUFYLENBQWtCQSxJQUFNLEdBQU4sQ0FDbEIsR0FBS0QsSUFBTSxJQUFYLENBQWtCQSxJQUFNQyxHQUFOLENBQ2xCLEdBQUtDLElBQU0sSUFBWCxDQUFrQkEsSUFBTUQsR0FBTixDQUVsQlMsS0FBS1gsd0JBQUwsQ0FBK0IveEUsR0FBR2x2QixDQUFsQyxDQUFxQ212QixHQUFHbnZCLENBQXhDLENBQTJDb3ZCLEdBQUdwdkIsQ0FBOUMsQ0FBaUQyeEIsR0FBRzN4QixDQUFwRCxDQUF1RGtoRyxHQUF2RCxDQUE0REMsR0FBNUQsQ0FBaUVDLEdBQWpFLEVBQ0FqUyxHQUFHOFIsd0JBQUgsQ0FBNkIveEUsR0FBRzFlLENBQWhDLENBQW1DMmUsR0FBRzNlLENBQXRDLENBQXlDNGUsR0FBRzVlLENBQTVDLENBQStDbWhCLEdBQUduaEIsQ0FBbEQsQ0FBcUQwd0YsR0FBckQsQ0FBMERDLEdBQTFELENBQStEQyxHQUEvRCxFQUNBUyxHQUFHWix3QkFBSCxDQUE2Qi94RSxHQUFHN1gsQ0FBaEMsQ0FBbUM4WCxHQUFHOVgsQ0FBdEMsQ0FBeUMrWCxHQUFHL1gsQ0FBNUMsQ0FBK0NzYSxHQUFHdGEsQ0FBbEQsQ0FBcUQ2cEYsR0FBckQsQ0FBMERDLEdBQTFELENBQStEQyxHQUEvRCxFQUVBLENBakJELFFBaUJZLEtBQUtHLFNBQUwsR0FBbUIsWUFBeEIsQ0FBdUMsQ0FFN0NLLEtBQUtkLGNBQUwsQ0FBcUI1eEUsR0FBR2x2QixDQUF4QixDQUEyQm12QixHQUFHbnZCLENBQTlCLENBQWlDb3ZCLEdBQUdwdkIsQ0FBcEMsQ0FBdUMyeEIsR0FBRzN4QixDQUExQyxDQUE2QyxLQUFLZ2hHLE9BQWxELEVBQ0E3UixHQUFHMlIsY0FBSCxDQUFtQjV4RSxHQUFHMWUsQ0FBdEIsQ0FBeUIyZSxHQUFHM2UsQ0FBNUIsQ0FBK0I0ZSxHQUFHNWUsQ0FBbEMsQ0FBcUNtaEIsR0FBR25oQixDQUF4QyxDQUEyQyxLQUFLd3dGLE9BQWhELEVBQ0FhLEdBQUdmLGNBQUgsQ0FBbUI1eEUsR0FBRzdYLENBQXRCLENBQXlCOFgsR0FBRzlYLENBQTVCLENBQStCK1gsR0FBRy9YLENBQWxDLENBQXFDc2EsR0FBR3RhLENBQXhDLENBQTJDLEtBQUsycEYsT0FBaEQsRUFFQSxDQUVEM21HLE1BQU0wRCxHQUFOLENBQ0M2akcsS0FBS1AsSUFBTCxDQUFXTSxNQUFYLENBREQsQ0FFQ3hTLEdBQUdrUyxJQUFILENBQVNNLE1BQVQsQ0FGRCxDQUdDRSxHQUFHUixJQUFILENBQVNNLE1BQVQsQ0FIRCxFQU1BLFlBQUEsQ0FFQSxDQXBGRCxDQXNGQUgsaUJBQWlCNzZHLFNBQWpCLENBQTJCMHJCLElBQTNCLENBQWtDLFNBQVc1ZixNQUFYLENBQW9CLENBRXJEdXJHLE1BQU1yM0csU0FBTixDQUFnQjByQixJQUFoQixDQUFxQmhxQixJQUFyQixDQUEyQixJQUEzQixDQUFpQ29LLE1BQWpDLEVBRUEsS0FBS2s2QixNQUFMLENBQWMsRUFBZCxDQUVBLElBQU0sTUFBUSxDQUFSLENBQVd6OEIsRUFBSXVDLE9BQU9rNkIsTUFBUCxDQUFjdi9CLE1BQW5DLENBQTJDSyxFQUFJeUMsQ0FBL0MsQ0FBa0R6QyxHQUFsRCxDQUF5RCxDQUV4RCxVQUFZZ0YsT0FBT2s2QixNQUFQLENBQWVsL0IsQ0FBZixDQUFaLENBRUEsS0FBS2svQixNQUFMLENBQVkvL0IsSUFBWixDQUFrQnlOLE1BQU0rWCxLQUFOLEVBQWxCLEVBRUEsQ0FFRCxLQUFLODNFLE1BQUwsQ0FBY3ozRixPQUFPeTNGLE1BQXJCLENBQ0EsS0FBS3FYLFNBQUwsQ0FBaUI5dUcsT0FBTzh1RyxTQUF4QixDQUNBLEtBQUtQLE9BQUwsQ0FBZXZ1RyxPQUFPdXVHLE9BQXRCLENBRUEsV0FBQSxDQUVBLENBcEJELENBc0JBUSxpQkFBaUI3NkcsU0FBakIsQ0FBMkJ3aUMsTUFBM0IsQ0FBb0MsVUFBWSxDQUUvQyxTQUFXNjBFLE1BQU1yM0csU0FBTixDQUFnQndpQyxNQUFoQixDQUF1QjlnQyxJQUF2QixDQUE2QixJQUE3QixDQUFYLENBRUF5VSxLQUFLNnZCLE1BQUwsQ0FBYyxFQUFkLENBRUEsSUFBTSxNQUFRLENBQVIsQ0FBV3o4QixFQUFJLEtBQUt5OEIsTUFBTCxDQUFZdi9CLE1BQWpDLENBQXlDSyxFQUFJeUMsQ0FBN0MsQ0FBZ0R6QyxHQUFoRCxDQUF1RCxDQUV0RCxVQUFZLEtBQUtrL0IsTUFBTCxDQUFhbC9CLENBQWIsQ0FBWixDQUNBcVAsS0FBSzZ2QixNQUFMLENBQVkvL0IsSUFBWixDQUFrQnlOLE1BQU0yYSxPQUFOLEVBQWxCLEVBRUEsQ0FFRGxZLEtBQUtvdEYsTUFBTCxDQUFjLEtBQUtBLE1BQW5CLENBQ0FwdEYsS0FBS3lrRyxTQUFMLENBQWlCLEtBQUtBLFNBQXRCLENBQ0F6a0csS0FBS2trRyxPQUFMLENBQWUsS0FBS0EsT0FBcEIsQ0FFQSxXQUFBLENBRUEsQ0FuQkQsQ0FxQkFRLGlCQUFpQjc2RyxTQUFqQixDQUEyQmc1RyxRQUEzQixDQUFzQyxTQUFXQyxJQUFYLENBQWtCLENBRXZENUIsTUFBTXIzRyxTQUFOLENBQWdCZzVHLFFBQWhCLENBQXlCdDNHLElBQXpCLENBQStCLElBQS9CLENBQXFDdTNHLElBQXJDLEVBRUEsS0FBS2p6RSxNQUFMLENBQWMsRUFBZCxDQUVBLElBQU0sTUFBUSxDQUFSLENBQVd6OEIsRUFBSTB2RyxLQUFLanpFLE1BQUwsQ0FBWXYvQixNQUFqQyxDQUF5Q0ssRUFBSXlDLENBQTdDLENBQWdEekMsR0FBaEQsQ0FBdUQsQ0FFdEQsVUFBWW15RyxLQUFLanpFLE1BQUwsQ0FBYWwvQixDQUFiLENBQVosQ0FDQSxLQUFLay9CLE1BQUwsQ0FBWS8vQixJQUFaLENBQWtCLFdBQUEsR0FBY2tvQixTQUFkLENBQXlCemEsS0FBekIsQ0FBbEIsRUFFQSxDQUVELEtBQUs2dkYsTUFBTCxDQUFjMFYsS0FBSzFWLE1BQW5CLENBQ0EsS0FBS3FYLFNBQUwsQ0FBaUIzQixLQUFLMkIsU0FBdEIsQ0FDQSxLQUFLUCxPQUFMLENBQWVwQixLQUFLb0IsT0FBcEIsQ0FFQSxXQUFBLENBRUEsQ0FuQkQsQ0FxQkE7Ozs7O0tBT0EsbUJBQUEsQ0FBcUJ2d0YsQ0FBckIsQ0FBd0J5ZSxFQUF4QixDQUE0QkMsRUFBNUIsQ0FBZ0NDLEVBQWhDLENBQW9DdUMsRUFBcEMsQ0FBeUMsQ0FFeEMsT0FBUyxDQUFFdkMsR0FBS0YsRUFBUCxFQUFjLEdBQXZCLENBQ0EsT0FBUyxDQUFFeUMsR0FBS3hDLEVBQVAsRUFBYyxHQUF2QixDQUNBLE9BQVMxZSxFQUFJQSxDQUFiLENBQ0EsT0FBU0EsRUFBSTJ1RixFQUFiLENBQ0EsT0FBTyxDQUFFLEVBQUlqd0UsRUFBSixDQUFTLEVBQUlDLEVBQWIsQ0FBa0JILEVBQWxCLENBQXVCdGEsRUFBekIsRUFBZ0Myc0YsRUFBaEMsQ0FBcUMsQ0FBRSxDQUFFLENBQUYsQ0FBTW55RSxFQUFOLENBQVcsRUFBSUMsRUFBZixDQUFvQixFQUFJSCxFQUF4QixDQUE2QnRhLEVBQS9CLEVBQXNDeXFGLEVBQTNFLENBQWdGbndFLEdBQUt4ZSxDQUFyRixDQUF5RjBlLEVBQWhHLENBRUEsQ0FFRDtFQUVBLDBCQUFBLENBQTRCMWUsQ0FBNUIsQ0FBK0JuRixDQUEvQixDQUFtQyxDQUVsQyxNQUFRLEVBQUltRixDQUFaLENBQ0EsU0FBV2xILENBQUosQ0FBUStCLENBQWYsQ0FFQSxDQUVELDBCQUFBLENBQTRCbUYsQ0FBNUIsQ0FBK0JuRixDQUEvQixDQUFtQyxDQUVsQyxVQUFhLEVBQUltRixDQUFWLEVBQWdCQSxDQUFoQixDQUFvQm5GLENBQTNCLENBRUEsQ0FFRCwwQkFBQSxDQUE0Qm1GLENBQTVCLENBQStCbkYsQ0FBL0IsQ0FBbUMsQ0FFbEMsU0FBV21GLENBQUosQ0FBUW5GLENBQWYsQ0FFQSxDQUVELHdCQUFBLENBQTBCbUYsQ0FBMUIsQ0FBNkJ5ZSxFQUE3QixDQUFpQ0MsRUFBakMsQ0FBcUNDLEVBQXJDLENBQTBDLENBRXpDLHlCQUEwQjNlLENBQW5CLENBQXNCeWUsRUFBdEIsRUFBNkI0eUUsa0JBQW1CcnhGLENBQW5CLENBQXNCMGUsRUFBdEIsQ0FBN0IsQ0FDTjR5RSxrQkFBbUJ0eEYsQ0FBbkIsQ0FBc0IyZSxFQUF0QixDQURELENBR0EsQ0FFRDtFQUVBLHNCQUFBLENBQXdCM2UsQ0FBeEIsQ0FBMkJuRixDQUEzQixDQUErQixDQUU5QixNQUFRLEVBQUltRixDQUFaLENBQ0EsU0FBV2xILENBQUosQ0FBUUEsQ0FBUixDQUFZK0IsQ0FBbkIsQ0FFQSxDQUVELHNCQUFBLENBQXdCbUYsQ0FBeEIsQ0FBMkJuRixDQUEzQixDQUErQixDQUU5QixNQUFRLEVBQUltRixDQUFaLENBQ0EsU0FBV2xILENBQUosQ0FBUUEsQ0FBUixDQUFZa0gsQ0FBWixDQUFnQm5GLENBQXZCLENBRUEsQ0FFRCxzQkFBQSxDQUF3Qm1GLENBQXhCLENBQTJCbkYsQ0FBM0IsQ0FBK0IsQ0FFOUIsVUFBYSxFQUFJbUYsQ0FBVixFQUFnQkEsQ0FBaEIsQ0FBb0JBLENBQXBCLENBQXdCbkYsQ0FBL0IsQ0FFQSxDQUVELHNCQUFBLENBQXdCbUYsQ0FBeEIsQ0FBMkJuRixDQUEzQixDQUErQixDQUU5QixTQUFXbUYsQ0FBSixDQUFRQSxDQUFSLENBQVluRixDQUFuQixDQUVBLENBRUQsb0JBQUEsQ0FBc0JtRixDQUF0QixDQUF5QnllLEVBQXpCLENBQTZCQyxFQUE3QixDQUFpQ0MsRUFBakMsQ0FBcUN1QyxFQUFyQyxDQUEwQyxDQUV6QyxxQkFBc0JsaEIsQ0FBZixDQUFrQnllLEVBQWxCLEVBQXlCOHlFLGNBQWV2eEYsQ0FBZixDQUFrQjBlLEVBQWxCLENBQXpCLENBQWtEOHlFLGNBQWV4eEYsQ0FBZixDQUFrQjJlLEVBQWxCLENBQWxELENBQ044eUUsY0FBZXp4RixDQUFmLENBQWtCa2hCLEVBQWxCLENBREQsQ0FHQSxDQUVELHlCQUFBLENBQTJCMUMsRUFBM0IsQ0FBK0J0YSxFQUEvQixDQUFtQ0MsRUFBbkMsQ0FBdUN1dEYsRUFBdkMsQ0FBNEMsQ0FFM0NuRSxNQUFNMzFHLElBQU4sQ0FBWSxJQUFaLEVBRUEsS0FBS0QsSUFBTCxDQUFZLGtCQUFaLENBRUEsS0FBSzZtQyxFQUFMLENBQVVBLElBQU0sV0FBQSxFQUFoQixDQUNBLEtBQUt0YSxFQUFMLENBQVVBLElBQU0sV0FBQSxFQUFoQixDQUNBLEtBQUtDLEVBQUwsQ0FBVUEsSUFBTSxXQUFBLEVBQWhCLENBQ0EsS0FBS3V0RixFQUFMLENBQVVBLElBQU0sV0FBQSxFQUFoQixDQUVBLENBRURDLGlCQUFpQno3RyxTQUFqQixDQUE2QkQsT0FBT2lCLE1BQVAsQ0FBZXEyRyxNQUFNcjNHLFNBQXJCLENBQTdCLENBQ0F5N0csaUJBQWlCejdHLFNBQWpCLENBQTJCc0MsV0FBM0IsQ0FBeUNtNUcsZ0JBQXpDLENBRUFBLGlCQUFpQno3RyxTQUFqQixDQUEyQjA3RyxrQkFBM0IsQ0FBZ0QsSUFBaEQsQ0FFQUQsaUJBQWlCejdHLFNBQWpCLENBQTJCczNHLFFBQTNCLENBQXNDLFNBQVd4dEYsQ0FBWCxDQUFjeXRGLGNBQWQsQ0FBK0IsQ0FFcEUsVUFBWUEsZ0JBQWtCLFdBQUEsRUFBOUIsQ0FFQSxPQUFTLEtBQUtqdkUsRUFBZCxDQUFrQnRhLEdBQUssS0FBS0EsRUFBNUIsQ0FBZ0NDLEdBQUssS0FBS0EsRUFBMUMsQ0FBOEN1dEYsR0FBSyxLQUFLQSxFQUF4RCxDQUVBOW5HLE1BQU0wRCxHQUFOLENBQ0N1a0csWUFBYTd4RixDQUFiLENBQWdCd2UsR0FBR2p2QixDQUFuQixDQUFzQjJVLEdBQUczVSxDQUF6QixDQUE0QjRVLEdBQUc1VSxDQUEvQixDQUFrQ21pRyxHQUFHbmlHLENBQXJDLENBREQsQ0FFQ3NpRyxZQUFhN3hGLENBQWIsQ0FBZ0J3ZSxHQUFHemUsQ0FBbkIsQ0FBc0JtRSxHQUFHbkUsQ0FBekIsQ0FBNEJvRSxHQUFHcEUsQ0FBL0IsQ0FBa0MyeEYsR0FBRzN4RixDQUFyQyxDQUZELEVBS0EsWUFBQSxDQUVBLENBYkQsQ0FlQTR4RixpQkFBaUJ6N0csU0FBakIsQ0FBMkIwckIsSUFBM0IsQ0FBa0MsU0FBVzVmLE1BQVgsQ0FBb0IsQ0FFckR1ckcsTUFBTXIzRyxTQUFOLENBQWdCMHJCLElBQWhCLENBQXFCaHFCLElBQXJCLENBQTJCLElBQTNCLENBQWlDb0ssTUFBakMsRUFFQSxLQUFLdzhCLEVBQUwsQ0FBUTVjLElBQVIsQ0FBYzVmLE9BQU93OEIsRUFBckIsRUFDQSxLQUFLdGEsRUFBTCxDQUFRdEMsSUFBUixDQUFjNWYsT0FBT2tpQixFQUFyQixFQUNBLEtBQUtDLEVBQUwsQ0FBUXZDLElBQVIsQ0FBYzVmLE9BQU9taUIsRUFBckIsRUFDQSxLQUFLdXRGLEVBQUwsQ0FBUTl2RixJQUFSLENBQWM1ZixPQUFPMHZHLEVBQXJCLEVBRUEsV0FBQSxDQUVBLENBWEQsQ0FhQUMsaUJBQWlCejdHLFNBQWpCLENBQTJCd2lDLE1BQTNCLENBQW9DLFVBQVksQ0FFL0MsU0FBVzYwRSxNQUFNcjNHLFNBQU4sQ0FBZ0J3aUMsTUFBaEIsQ0FBdUI5Z0MsSUFBdkIsQ0FBNkIsSUFBN0IsQ0FBWCxDQUVBeVUsS0FBS215QixFQUFMLENBQVUsS0FBS0EsRUFBTCxDQUFRamEsT0FBUixFQUFWLENBQ0FsWSxLQUFLNlgsRUFBTCxDQUFVLEtBQUtBLEVBQUwsQ0FBUUssT0FBUixFQUFWLENBQ0FsWSxLQUFLOFgsRUFBTCxDQUFVLEtBQUtBLEVBQUwsQ0FBUUksT0FBUixFQUFWLENBQ0FsWSxLQUFLcWxHLEVBQUwsQ0FBVSxLQUFLQSxFQUFMLENBQVFudEYsT0FBUixFQUFWLENBRUEsV0FBQSxDQUVBLENBWEQsQ0FhQW90RixpQkFBaUJ6N0csU0FBakIsQ0FBMkJnNUcsUUFBM0IsQ0FBc0MsU0FBV0MsSUFBWCxDQUFrQixDQUV2RDVCLE1BQU1yM0csU0FBTixDQUFnQmc1RyxRQUFoQixDQUF5QnQzRyxJQUF6QixDQUErQixJQUEvQixDQUFxQ3UzRyxJQUFyQyxFQUVBLEtBQUszd0UsRUFBTCxDQUFRbmEsU0FBUixDQUFtQjhxRixLQUFLM3dFLEVBQXhCLEVBQ0EsS0FBS3RhLEVBQUwsQ0FBUUcsU0FBUixDQUFtQjhxRixLQUFLanJGLEVBQXhCLEVBQ0EsS0FBS0MsRUFBTCxDQUFRRSxTQUFSLENBQW1COHFGLEtBQUtockYsRUFBeEIsRUFDQSxLQUFLdXRGLEVBQUwsQ0FBUXJ0RixTQUFSLENBQW1COHFGLEtBQUt1QyxFQUF4QixFQUVBLFdBQUEsQ0FFQSxDQVhELENBYUEsMEJBQUEsQ0FBNEJsekUsRUFBNUIsQ0FBZ0N0YSxFQUFoQyxDQUFvQ0MsRUFBcEMsQ0FBd0N1dEYsRUFBeEMsQ0FBNkMsQ0FFNUNuRSxNQUFNMzFHLElBQU4sQ0FBWSxJQUFaLEVBRUEsS0FBS0QsSUFBTCxDQUFZLG1CQUFaLENBRUEsS0FBSzZtQyxFQUFMLENBQVVBLElBQU0sV0FBQSxFQUFoQixDQUNBLEtBQUt0YSxFQUFMLENBQVVBLElBQU0sV0FBQSxFQUFoQixDQUNBLEtBQUtDLEVBQUwsQ0FBVUEsSUFBTSxXQUFBLEVBQWhCLENBQ0EsS0FBS3V0RixFQUFMLENBQVVBLElBQU0sV0FBQSxFQUFoQixDQUVBLENBRURJLGtCQUFrQjU3RyxTQUFsQixDQUE4QkQsT0FBT2lCLE1BQVAsQ0FBZXEyRyxNQUFNcjNHLFNBQXJCLENBQTlCLENBQ0E0N0csa0JBQWtCNTdHLFNBQWxCLENBQTRCc0MsV0FBNUIsQ0FBMENzNUcsaUJBQTFDLENBRUFBLGtCQUFrQjU3RyxTQUFsQixDQUE0QjY3RyxtQkFBNUIsQ0FBa0QsSUFBbEQsQ0FFQUQsa0JBQWtCNTdHLFNBQWxCLENBQTRCczNHLFFBQTVCLENBQXVDLFNBQVd4dEYsQ0FBWCxDQUFjeXRGLGNBQWQsQ0FBK0IsQ0FFckUsVUFBWUEsZ0JBQWtCLFdBQUEsRUFBOUIsQ0FFQSxPQUFTLEtBQUtqdkUsRUFBZCxDQUFrQnRhLEdBQUssS0FBS0EsRUFBNUIsQ0FBZ0NDLEdBQUssS0FBS0EsRUFBMUMsQ0FBOEN1dEYsR0FBSyxLQUFLQSxFQUF4RCxDQUVBOW5HLE1BQU0wRCxHQUFOLENBQ0N1a0csWUFBYTd4RixDQUFiLENBQWdCd2UsR0FBR2p2QixDQUFuQixDQUFzQjJVLEdBQUczVSxDQUF6QixDQUE0QjRVLEdBQUc1VSxDQUEvQixDQUFrQ21pRyxHQUFHbmlHLENBQXJDLENBREQsQ0FFQ3NpRyxZQUFhN3hGLENBQWIsQ0FBZ0J3ZSxHQUFHemUsQ0FBbkIsQ0FBc0JtRSxHQUFHbkUsQ0FBekIsQ0FBNEJvRSxHQUFHcEUsQ0FBL0IsQ0FBa0MyeEYsR0FBRzN4RixDQUFyQyxDQUZELENBR0M4eEYsWUFBYTd4RixDQUFiLENBQWdCd2UsR0FBRzVYLENBQW5CLENBQXNCMUMsR0FBRzBDLENBQXpCLENBQTRCekMsR0FBR3lDLENBQS9CLENBQWtDOHFGLEdBQUc5cUYsQ0FBckMsQ0FIRCxFQU1BLFlBQUEsQ0FFQSxDQWRELENBZ0JBa3JGLGtCQUFrQjU3RyxTQUFsQixDQUE0QjByQixJQUE1QixDQUFtQyxTQUFXNWYsTUFBWCxDQUFvQixDQUV0RHVyRyxNQUFNcjNHLFNBQU4sQ0FBZ0IwckIsSUFBaEIsQ0FBcUJocUIsSUFBckIsQ0FBMkIsSUFBM0IsQ0FBaUNvSyxNQUFqQyxFQUVBLEtBQUt3OEIsRUFBTCxDQUFRNWMsSUFBUixDQUFjNWYsT0FBT3c4QixFQUFyQixFQUNBLEtBQUt0YSxFQUFMLENBQVF0QyxJQUFSLENBQWM1ZixPQUFPa2lCLEVBQXJCLEVBQ0EsS0FBS0MsRUFBTCxDQUFRdkMsSUFBUixDQUFjNWYsT0FBT21pQixFQUFyQixFQUNBLEtBQUt1dEYsRUFBTCxDQUFROXZGLElBQVIsQ0FBYzVmLE9BQU8wdkcsRUFBckIsRUFFQSxXQUFBLENBRUEsQ0FYRCxDQWFBSSxrQkFBa0I1N0csU0FBbEIsQ0FBNEJ3aUMsTUFBNUIsQ0FBcUMsVUFBWSxDQUVoRCxTQUFXNjBFLE1BQU1yM0csU0FBTixDQUFnQndpQyxNQUFoQixDQUF1QjlnQyxJQUF2QixDQUE2QixJQUE3QixDQUFYLENBRUF5VSxLQUFLbXlCLEVBQUwsQ0FBVSxLQUFLQSxFQUFMLENBQVFqYSxPQUFSLEVBQVYsQ0FDQWxZLEtBQUs2WCxFQUFMLENBQVUsS0FBS0EsRUFBTCxDQUFRSyxPQUFSLEVBQVYsQ0FDQWxZLEtBQUs4WCxFQUFMLENBQVUsS0FBS0EsRUFBTCxDQUFRSSxPQUFSLEVBQVYsQ0FDQWxZLEtBQUtxbEcsRUFBTCxDQUFVLEtBQUtBLEVBQUwsQ0FBUW50RixPQUFSLEVBQVYsQ0FFQSxXQUFBLENBRUEsQ0FYRCxDQWFBdXRGLGtCQUFrQjU3RyxTQUFsQixDQUE0Qmc1RyxRQUE1QixDQUF1QyxTQUFXQyxJQUFYLENBQWtCLENBRXhENUIsTUFBTXIzRyxTQUFOLENBQWdCZzVHLFFBQWhCLENBQXlCdDNHLElBQXpCLENBQStCLElBQS9CLENBQXFDdTNHLElBQXJDLEVBRUEsS0FBSzN3RSxFQUFMLENBQVFuYSxTQUFSLENBQW1COHFGLEtBQUszd0UsRUFBeEIsRUFDQSxLQUFLdGEsRUFBTCxDQUFRRyxTQUFSLENBQW1COHFGLEtBQUtqckYsRUFBeEIsRUFDQSxLQUFLQyxFQUFMLENBQVFFLFNBQVIsQ0FBbUI4cUYsS0FBS2hyRixFQUF4QixFQUNBLEtBQUt1dEYsRUFBTCxDQUFRcnRGLFNBQVIsQ0FBbUI4cUYsS0FBS3VDLEVBQXhCLEVBRUEsV0FBQSxDQUVBLENBWEQsQ0FhQSxrQkFBQSxDQUFvQnh0RixFQUFwQixDQUF3QkMsRUFBeEIsQ0FBNkIsQ0FFNUJvcEYsTUFBTTMxRyxJQUFOLENBQVksSUFBWixFQUVBLEtBQUtELElBQUwsQ0FBWSxXQUFaLENBRUEsS0FBS3VzQixFQUFMLENBQVVBLElBQU0sV0FBQSxFQUFoQixDQUNBLEtBQUtDLEVBQUwsQ0FBVUEsSUFBTSxXQUFBLEVBQWhCLENBRUEsQ0FFRDZ0RixVQUFVOTdHLFNBQVYsQ0FBc0JELE9BQU9pQixNQUFQLENBQWVxMkcsTUFBTXIzRyxTQUFyQixDQUF0QixDQUNBODdHLFVBQVU5N0csU0FBVixDQUFvQnNDLFdBQXBCLENBQWtDdzVHLFNBQWxDLENBRUFBLFVBQVU5N0csU0FBVixDQUFvQis3RyxXQUFwQixDQUFrQyxJQUFsQyxDQUVBRCxVQUFVOTdHLFNBQVYsQ0FBb0JzM0csUUFBcEIsQ0FBK0IsU0FBV3h0RixDQUFYLENBQWN5dEYsY0FBZCxDQUErQixDQUU3RCxVQUFZQSxnQkFBa0IsV0FBQSxFQUE5QixDQUVBLEdBQUt6dEYsSUFBTSxDQUFYLENBQWUsQ0FFZHBXLE1BQU1nWSxJQUFOLENBQVksS0FBS3VDLEVBQWpCLEVBRUEsQ0FKRCxJQUlPLENBRU52YSxNQUFNZ1ksSUFBTixDQUFZLEtBQUt1QyxFQUFqQixFQUFzQmpDLEdBQXRCLENBQTJCLEtBQUtnQyxFQUFoQyxFQUNBdGEsTUFBTTBZLGNBQU4sQ0FBc0J0QyxDQUF0QixFQUEwQjZCLEdBQTFCLENBQStCLEtBQUtxQyxFQUFwQyxFQUVBLENBRUQsWUFBQSxDQUVBLENBakJELENBbUJBO0VBRUE4dEYsVUFBVTk3RyxTQUFWLENBQW9Ca2tHLFVBQXBCLENBQWlDLFNBQVdqd0QsQ0FBWCxDQUFjc2pFLGNBQWQsQ0FBK0IsQ0FFL0QsWUFBWUQsUUFBTCxDQUFlcmpFLENBQWYsQ0FBa0JzakUsY0FBbEIsQ0FBUCxDQUVBLENBSkQsQ0FNQXVFLFVBQVU5N0csU0FBVixDQUFvQnc0RyxVQUFwQixDQUFpQyxpQkFBcUIsQ0FFckQsWUFBYyxLQUFLdnFGLEVBQUwsQ0FBUXhDLEtBQVIsR0FBZ0JPLEdBQWhCLENBQXFCLEtBQUtnQyxFQUExQixDQUFkLENBRUEsZUFBZVgsU0FBUixFQUFQLENBRUEsQ0FORCxDQVFBeXVGLFVBQVU5N0csU0FBVixDQUFvQjByQixJQUFwQixDQUEyQixTQUFXNWYsTUFBWCxDQUFvQixDQUU5Q3VyRyxNQUFNcjNHLFNBQU4sQ0FBZ0IwckIsSUFBaEIsQ0FBcUJocUIsSUFBckIsQ0FBMkIsSUFBM0IsQ0FBaUNvSyxNQUFqQyxFQUVBLEtBQUtraUIsRUFBTCxDQUFRdEMsSUFBUixDQUFjNWYsT0FBT2tpQixFQUFyQixFQUNBLEtBQUtDLEVBQUwsQ0FBUXZDLElBQVIsQ0FBYzVmLE9BQU9taUIsRUFBckIsRUFFQSxXQUFBLENBRUEsQ0FURCxDQVdBNnRGLFVBQVU5N0csU0FBVixDQUFvQndpQyxNQUFwQixDQUE2QixVQUFZLENBRXhDLFNBQVc2MEUsTUFBTXIzRyxTQUFOLENBQWdCd2lDLE1BQWhCLENBQXVCOWdDLElBQXZCLENBQTZCLElBQTdCLENBQVgsQ0FFQXlVLEtBQUs2WCxFQUFMLENBQVUsS0FBS0EsRUFBTCxDQUFRSyxPQUFSLEVBQVYsQ0FDQWxZLEtBQUs4WCxFQUFMLENBQVUsS0FBS0EsRUFBTCxDQUFRSSxPQUFSLEVBQVYsQ0FFQSxXQUFBLENBRUEsQ0FURCxDQVdBeXRGLFVBQVU5N0csU0FBVixDQUFvQmc1RyxRQUFwQixDQUErQixTQUFXQyxJQUFYLENBQWtCLENBRWhENUIsTUFBTXIzRyxTQUFOLENBQWdCZzVHLFFBQWhCLENBQXlCdDNHLElBQXpCLENBQStCLElBQS9CLENBQXFDdTNHLElBQXJDLEVBRUEsS0FBS2pyRixFQUFMLENBQVFHLFNBQVIsQ0FBbUI4cUYsS0FBS2pyRixFQUF4QixFQUNBLEtBQUtDLEVBQUwsQ0FBUUUsU0FBUixDQUFtQjhxRixLQUFLaHJGLEVBQXhCLEVBRUEsV0FBQSxDQUVBLENBVEQsQ0FXQSxtQkFBQSxDQUFxQkQsRUFBckIsQ0FBeUJDLEVBQXpCLENBQThCLENBRTdCb3BGLE1BQU0zMUcsSUFBTixDQUFZLElBQVosRUFFQSxLQUFLRCxJQUFMLENBQVksWUFBWixDQUVBLEtBQUt1c0IsRUFBTCxDQUFVQSxJQUFNLFdBQUEsRUFBaEIsQ0FDQSxLQUFLQyxFQUFMLENBQVVBLElBQU0sV0FBQSxFQUFoQixDQUVBLENBRUQrdEYsV0FBV2g4RyxTQUFYLENBQXVCRCxPQUFPaUIsTUFBUCxDQUFlcTJHLE1BQU1yM0csU0FBckIsQ0FBdkIsQ0FDQWc4RyxXQUFXaDhHLFNBQVgsQ0FBcUJzQyxXQUFyQixDQUFtQzA1RyxVQUFuQyxDQUVBQSxXQUFXaDhHLFNBQVgsQ0FBcUJpOEcsWUFBckIsQ0FBb0MsSUFBcEMsQ0FFQUQsV0FBV2g4RyxTQUFYLENBQXFCczNHLFFBQXJCLENBQWdDLFNBQVd4dEYsQ0FBWCxDQUFjeXRGLGNBQWQsQ0FBK0IsQ0FFOUQsVUFBWUEsZ0JBQWtCLFdBQUEsRUFBOUIsQ0FFQSxHQUFLenRGLElBQU0sQ0FBWCxDQUFlLENBRWRwVyxNQUFNZ1ksSUFBTixDQUFZLEtBQUt1QyxFQUFqQixFQUVBLENBSkQsSUFJTyxDQUVOdmEsTUFBTWdZLElBQU4sQ0FBWSxLQUFLdUMsRUFBakIsRUFBc0JqQyxHQUF0QixDQUEyQixLQUFLZ0MsRUFBaEMsRUFDQXRhLE1BQU0wWSxjQUFOLENBQXNCdEMsQ0FBdEIsRUFBMEI2QixHQUExQixDQUErQixLQUFLcUMsRUFBcEMsRUFFQSxDQUVELFlBQUEsQ0FFQSxDQWpCRCxDQW1CQTtFQUVBZ3VGLFdBQVdoOEcsU0FBWCxDQUFxQmtrRyxVQUFyQixDQUFrQyxTQUFXandELENBQVgsQ0FBY3NqRSxjQUFkLENBQStCLENBRWhFLFlBQVlELFFBQUwsQ0FBZXJqRSxDQUFmLENBQWtCc2pFLGNBQWxCLENBQVAsQ0FFQSxDQUpELENBTUF5RSxXQUFXaDhHLFNBQVgsQ0FBcUIwckIsSUFBckIsQ0FBNEIsU0FBVzVmLE1BQVgsQ0FBb0IsQ0FFL0N1ckcsTUFBTXIzRyxTQUFOLENBQWdCMHJCLElBQWhCLENBQXFCaHFCLElBQXJCLENBQTJCLElBQTNCLENBQWlDb0ssTUFBakMsRUFFQSxLQUFLa2lCLEVBQUwsQ0FBUXRDLElBQVIsQ0FBYzVmLE9BQU9raUIsRUFBckIsRUFDQSxLQUFLQyxFQUFMLENBQVF2QyxJQUFSLENBQWM1ZixPQUFPbWlCLEVBQXJCLEVBRUEsV0FBQSxDQUVBLENBVEQsQ0FXQSt0RixXQUFXaDhHLFNBQVgsQ0FBcUJ3aUMsTUFBckIsQ0FBOEIsVUFBWSxDQUV6QyxTQUFXNjBFLE1BQU1yM0csU0FBTixDQUFnQndpQyxNQUFoQixDQUF1QjlnQyxJQUF2QixDQUE2QixJQUE3QixDQUFYLENBRUF5VSxLQUFLNlgsRUFBTCxDQUFVLEtBQUtBLEVBQUwsQ0FBUUssT0FBUixFQUFWLENBQ0FsWSxLQUFLOFgsRUFBTCxDQUFVLEtBQUtBLEVBQUwsQ0FBUUksT0FBUixFQUFWLENBRUEsV0FBQSxDQUVBLENBVEQsQ0FXQTJ0RixXQUFXaDhHLFNBQVgsQ0FBcUJnNUcsUUFBckIsQ0FBZ0MsU0FBV0MsSUFBWCxDQUFrQixDQUVqRDVCLE1BQU1yM0csU0FBTixDQUFnQmc1RyxRQUFoQixDQUF5QnQzRyxJQUF6QixDQUErQixJQUEvQixDQUFxQ3UzRyxJQUFyQyxFQUVBLEtBQUtqckYsRUFBTCxDQUFRRyxTQUFSLENBQW1COHFGLEtBQUtqckYsRUFBeEIsRUFDQSxLQUFLQyxFQUFMLENBQVFFLFNBQVIsQ0FBbUI4cUYsS0FBS2hyRixFQUF4QixFQUVBLFdBQUEsQ0FFQSxDQVRELENBV0EsNkJBQUEsQ0FBK0JxYSxFQUEvQixDQUFtQ3RhLEVBQW5DLENBQXVDQyxFQUF2QyxDQUE0QyxDQUUzQ29wRixNQUFNMzFHLElBQU4sQ0FBWSxJQUFaLEVBRUEsS0FBS0QsSUFBTCxDQUFZLHNCQUFaLENBRUEsS0FBSzZtQyxFQUFMLENBQVVBLElBQU0sV0FBQSxFQUFoQixDQUNBLEtBQUt0YSxFQUFMLENBQVVBLElBQU0sV0FBQSxFQUFoQixDQUNBLEtBQUtDLEVBQUwsQ0FBVUEsSUFBTSxXQUFBLEVBQWhCLENBRUEsQ0FFRGl1RixxQkFBcUJsOEcsU0FBckIsQ0FBaUNELE9BQU9pQixNQUFQLENBQWVxMkcsTUFBTXIzRyxTQUFyQixDQUFqQyxDQUNBazhHLHFCQUFxQmw4RyxTQUFyQixDQUErQnNDLFdBQS9CLENBQTZDNDVHLG9CQUE3QyxDQUVBQSxxQkFBcUJsOEcsU0FBckIsQ0FBK0JtOEcsc0JBQS9CLENBQXdELElBQXhELENBRUFELHFCQUFxQmw4RyxTQUFyQixDQUErQnMzRyxRQUEvQixDQUEwQyxTQUFXeHRGLENBQVgsQ0FBY3l0RixjQUFkLENBQStCLENBRXhFLFVBQVlBLGdCQUFrQixXQUFBLEVBQTlCLENBRUEsT0FBUyxLQUFLanZFLEVBQWQsQ0FBa0J0YSxHQUFLLEtBQUtBLEVBQTVCLENBQWdDQyxHQUFLLEtBQUtBLEVBQTFDLENBRUF2YSxNQUFNMEQsR0FBTixDQUNDZ2xHLGdCQUFpQnR5RixDQUFqQixDQUFvQndlLEdBQUdqdkIsQ0FBdkIsQ0FBMEIyVSxHQUFHM1UsQ0FBN0IsQ0FBZ0M0VSxHQUFHNVUsQ0FBbkMsQ0FERCxDQUVDK2lHLGdCQUFpQnR5RixDQUFqQixDQUFvQndlLEdBQUd6ZSxDQUF2QixDQUEwQm1FLEdBQUduRSxDQUE3QixDQUFnQ29FLEdBQUdwRSxDQUFuQyxDQUZELEVBS0EsWUFBQSxDQUVBLENBYkQsQ0FlQXF5RixxQkFBcUJsOEcsU0FBckIsQ0FBK0IwckIsSUFBL0IsQ0FBc0MsU0FBVzVmLE1BQVgsQ0FBb0IsQ0FFekR1ckcsTUFBTXIzRyxTQUFOLENBQWdCMHJCLElBQWhCLENBQXFCaHFCLElBQXJCLENBQTJCLElBQTNCLENBQWlDb0ssTUFBakMsRUFFQSxLQUFLdzhCLEVBQUwsQ0FBUTVjLElBQVIsQ0FBYzVmLE9BQU93OEIsRUFBckIsRUFDQSxLQUFLdGEsRUFBTCxDQUFRdEMsSUFBUixDQUFjNWYsT0FBT2tpQixFQUFyQixFQUNBLEtBQUtDLEVBQUwsQ0FBUXZDLElBQVIsQ0FBYzVmLE9BQU9taUIsRUFBckIsRUFFQSxXQUFBLENBRUEsQ0FWRCxDQVlBaXVGLHFCQUFxQmw4RyxTQUFyQixDQUErQndpQyxNQUEvQixDQUF3QyxVQUFZLENBRW5ELFNBQVc2MEUsTUFBTXIzRyxTQUFOLENBQWdCd2lDLE1BQWhCLENBQXVCOWdDLElBQXZCLENBQTZCLElBQTdCLENBQVgsQ0FFQXlVLEtBQUtteUIsRUFBTCxDQUFVLEtBQUtBLEVBQUwsQ0FBUWphLE9BQVIsRUFBVixDQUNBbFksS0FBSzZYLEVBQUwsQ0FBVSxLQUFLQSxFQUFMLENBQVFLLE9BQVIsRUFBVixDQUNBbFksS0FBSzhYLEVBQUwsQ0FBVSxLQUFLQSxFQUFMLENBQVFJLE9BQVIsRUFBVixDQUVBLFdBQUEsQ0FFQSxDQVZELENBWUE2dEYscUJBQXFCbDhHLFNBQXJCLENBQStCZzVHLFFBQS9CLENBQTBDLFNBQVdDLElBQVgsQ0FBa0IsQ0FFM0Q1QixNQUFNcjNHLFNBQU4sQ0FBZ0JnNUcsUUFBaEIsQ0FBeUJ0M0csSUFBekIsQ0FBK0IsSUFBL0IsQ0FBcUN1M0csSUFBckMsRUFFQSxLQUFLM3dFLEVBQUwsQ0FBUW5hLFNBQVIsQ0FBbUI4cUYsS0FBSzN3RSxFQUF4QixFQUNBLEtBQUt0YSxFQUFMLENBQVFHLFNBQVIsQ0FBbUI4cUYsS0FBS2pyRixFQUF4QixFQUNBLEtBQUtDLEVBQUwsQ0FBUUUsU0FBUixDQUFtQjhxRixLQUFLaHJGLEVBQXhCLEVBRUEsV0FBQSxDQUVBLENBVkQsQ0FZQSw4QkFBQSxDQUFnQ3FhLEVBQWhDLENBQW9DdGEsRUFBcEMsQ0FBd0NDLEVBQXhDLENBQTZDLENBRTVDb3BGLE1BQU0zMUcsSUFBTixDQUFZLElBQVosRUFFQSxLQUFLRCxJQUFMLENBQVksdUJBQVosQ0FFQSxLQUFLNm1DLEVBQUwsQ0FBVUEsSUFBTSxXQUFBLEVBQWhCLENBQ0EsS0FBS3RhLEVBQUwsQ0FBVUEsSUFBTSxXQUFBLEVBQWhCLENBQ0EsS0FBS0MsRUFBTCxDQUFVQSxJQUFNLFdBQUEsRUFBaEIsQ0FFQSxDQUVEb3VGLHNCQUFzQnI4RyxTQUF0QixDQUFrQ0QsT0FBT2lCLE1BQVAsQ0FBZXEyRyxNQUFNcjNHLFNBQXJCLENBQWxDLENBQ0FxOEcsc0JBQXNCcjhHLFNBQXRCLENBQWdDc0MsV0FBaEMsQ0FBOEMrNUcscUJBQTlDLENBRUFBLHNCQUFzQnI4RyxTQUF0QixDQUFnQ3M4Ryx1QkFBaEMsQ0FBMEQsSUFBMUQsQ0FFQUQsc0JBQXNCcjhHLFNBQXRCLENBQWdDczNHLFFBQWhDLENBQTJDLFNBQVd4dEYsQ0FBWCxDQUFjeXRGLGNBQWQsQ0FBK0IsQ0FFekUsVUFBWUEsZ0JBQWtCLFdBQUEsRUFBOUIsQ0FFQSxPQUFTLEtBQUtqdkUsRUFBZCxDQUFrQnRhLEdBQUssS0FBS0EsRUFBNUIsQ0FBZ0NDLEdBQUssS0FBS0EsRUFBMUMsQ0FFQXZhLE1BQU0wRCxHQUFOLENBQ0NnbEcsZ0JBQWlCdHlGLENBQWpCLENBQW9Cd2UsR0FBR2p2QixDQUF2QixDQUEwQjJVLEdBQUczVSxDQUE3QixDQUFnQzRVLEdBQUc1VSxDQUFuQyxDQURELENBRUMraUcsZ0JBQWlCdHlGLENBQWpCLENBQW9Cd2UsR0FBR3plLENBQXZCLENBQTBCbUUsR0FBR25FLENBQTdCLENBQWdDb0UsR0FBR3BFLENBQW5DLENBRkQsQ0FHQ3V5RixnQkFBaUJ0eUYsQ0FBakIsQ0FBb0J3ZSxHQUFHNVgsQ0FBdkIsQ0FBMEIxQyxHQUFHMEMsQ0FBN0IsQ0FBZ0N6QyxHQUFHeUMsQ0FBbkMsQ0FIRCxFQU1BLFlBQUEsQ0FFQSxDQWRELENBZ0JBMnJGLHNCQUFzQnI4RyxTQUF0QixDQUFnQzByQixJQUFoQyxDQUF1QyxTQUFXNWYsTUFBWCxDQUFvQixDQUUxRHVyRyxNQUFNcjNHLFNBQU4sQ0FBZ0IwckIsSUFBaEIsQ0FBcUJocUIsSUFBckIsQ0FBMkIsSUFBM0IsQ0FBaUNvSyxNQUFqQyxFQUVBLEtBQUt3OEIsRUFBTCxDQUFRNWMsSUFBUixDQUFjNWYsT0FBT3c4QixFQUFyQixFQUNBLEtBQUt0YSxFQUFMLENBQVF0QyxJQUFSLENBQWM1ZixPQUFPa2lCLEVBQXJCLEVBQ0EsS0FBS0MsRUFBTCxDQUFRdkMsSUFBUixDQUFjNWYsT0FBT21pQixFQUFyQixFQUVBLFdBQUEsQ0FFQSxDQVZELENBWUFvdUYsc0JBQXNCcjhHLFNBQXRCLENBQWdDd2lDLE1BQWhDLENBQXlDLFVBQVksQ0FFcEQsU0FBVzYwRSxNQUFNcjNHLFNBQU4sQ0FBZ0J3aUMsTUFBaEIsQ0FBdUI5Z0MsSUFBdkIsQ0FBNkIsSUFBN0IsQ0FBWCxDQUVBeVUsS0FBS215QixFQUFMLENBQVUsS0FBS0EsRUFBTCxDQUFRamEsT0FBUixFQUFWLENBQ0FsWSxLQUFLNlgsRUFBTCxDQUFVLEtBQUtBLEVBQUwsQ0FBUUssT0FBUixFQUFWLENBQ0FsWSxLQUFLOFgsRUFBTCxDQUFVLEtBQUtBLEVBQUwsQ0FBUUksT0FBUixFQUFWLENBRUEsV0FBQSxDQUVBLENBVkQsQ0FZQWd1RixzQkFBc0JyOEcsU0FBdEIsQ0FBZ0NnNUcsUUFBaEMsQ0FBMkMsU0FBV0MsSUFBWCxDQUFrQixDQUU1RDVCLE1BQU1yM0csU0FBTixDQUFnQmc1RyxRQUFoQixDQUF5QnQzRyxJQUF6QixDQUErQixJQUEvQixDQUFxQ3UzRyxJQUFyQyxFQUVBLEtBQUszd0UsRUFBTCxDQUFRbmEsU0FBUixDQUFtQjhxRixLQUFLM3dFLEVBQXhCLEVBQ0EsS0FBS3RhLEVBQUwsQ0FBUUcsU0FBUixDQUFtQjhxRixLQUFLanJGLEVBQXhCLEVBQ0EsS0FBS0MsRUFBTCxDQUFRRSxTQUFSLENBQW1COHFGLEtBQUtockYsRUFBeEIsRUFFQSxXQUFBLENBRUEsQ0FWRCxDQVlBLG9CQUFBLENBQXNCK1gsTUFBTyx1QkFBeUIsQ0FFckRxeEUsTUFBTTMxRyxJQUFOLENBQVksSUFBWixFQUVBLEtBQUtELElBQUwsQ0FBWSxhQUFaLENBRUEsS0FBS3VrQyxNQUFMLENBQWNBLFFBQVUsRUFBeEIsQ0FFQSxDQUVEdTJFLFlBQVl2OEcsU0FBWixDQUF3QkQsT0FBT2lCLE1BQVAsQ0FBZXEyRyxNQUFNcjNHLFNBQXJCLENBQXhCLENBQ0F1OEcsWUFBWXY4RyxTQUFaLENBQXNCc0MsV0FBdEIsQ0FBb0NpNkcsV0FBcEMsQ0FFQUEsWUFBWXY4RyxTQUFaLENBQXNCdzhHLGFBQXRCLENBQXNDLElBQXRDLENBRUFELFlBQVl2OEcsU0FBWixDQUFzQnMzRyxRQUF0QixDQUFpQyxTQUFXeHRGLENBQVgsQ0FBY3l0RixjQUFkLENBQStCLENBRS9ELFVBQVlBLGdCQUFrQixXQUFBLEVBQTlCLENBRUEsV0FBYSxLQUFLdnhFLE1BQWxCLENBQ0EsTUFBUSxDQUFFQSxPQUFPdi9CLE1BQVAsQ0FBZ0IsQ0FBbEIsRUFBd0JxakIsQ0FBaEMsQ0FFQSxhQUFlbmhCLEtBQUtFLEtBQUwsQ0FBWThiLENBQVosQ0FBZixDQUNBLFdBQWFBLEVBQUlvMkYsUUFBakIsQ0FFQSxPQUFTLzBFLE9BQVErMEUsV0FBYSxDQUFiLENBQWlCQSxRQUFqQixDQUE0QkEsU0FBVyxDQUEvQyxDQUFULENBQ0EsT0FBUy8wRSxPQUFRKzBFLFFBQVIsQ0FBVCxDQUNBLE9BQVMvMEUsT0FBUSswRSxTQUFXLzBFLE9BQU92L0IsTUFBUCxDQUFnQixDQUEzQixDQUErQnUvQixPQUFPdi9CLE1BQVAsQ0FBZ0IsQ0FBL0MsQ0FBbURzMEcsU0FBVyxDQUF0RSxDQUFULENBQ0EsT0FBUy8wRSxPQUFRKzBFLFNBQVcvMEUsT0FBT3YvQixNQUFQLENBQWdCLENBQTNCLENBQStCdS9CLE9BQU92L0IsTUFBUCxDQUFnQixDQUEvQyxDQUFtRHMwRyxTQUFXLENBQXRFLENBQVQsQ0FFQXJuRyxNQUFNMEQsR0FBTixDQUNDcWxHLFdBQVl6QixNQUFaLENBQW9CenlFLEdBQUdsdkIsQ0FBdkIsQ0FBMEJtdkIsR0FBR252QixDQUE3QixDQUFnQ292QixHQUFHcHZCLENBQW5DLENBQXNDMnhCLEdBQUczeEIsQ0FBekMsQ0FERCxDQUVDb2pHLFdBQVl6QixNQUFaLENBQW9CenlFLEdBQUcxZSxDQUF2QixDQUEwQjJlLEdBQUczZSxDQUE3QixDQUFnQzRlLEdBQUc1ZSxDQUFuQyxDQUFzQ21oQixHQUFHbmhCLENBQXpDLENBRkQsRUFLQSxZQUFBLENBRUEsQ0F0QkQsQ0F3QkEweUYsWUFBWXY4RyxTQUFaLENBQXNCMHJCLElBQXRCLENBQTZCLFNBQVc1ZixNQUFYLENBQW9CLENBRWhEdXJHLE1BQU1yM0csU0FBTixDQUFnQjByQixJQUFoQixDQUFxQmhxQixJQUFyQixDQUEyQixJQUEzQixDQUFpQ29LLE1BQWpDLEVBRUEsS0FBS2s2QixNQUFMLENBQWMsRUFBZCxDQUVBLElBQU0sTUFBUSxDQUFSLENBQVd6OEIsRUFBSXVDLE9BQU9rNkIsTUFBUCxDQUFjdi9CLE1BQW5DLENBQTJDSyxFQUFJeUMsQ0FBL0MsQ0FBa0R6QyxHQUFsRCxDQUF5RCxDQUV4RCxVQUFZZ0YsT0FBT2s2QixNQUFQLENBQWVsL0IsQ0FBZixDQUFaLENBRUEsS0FBS2svQixNQUFMLENBQVkvL0IsSUFBWixDQUFrQnlOLE1BQU0rWCxLQUFOLEVBQWxCLEVBRUEsQ0FFRCxXQUFBLENBRUEsQ0FoQkQsQ0FrQkE4d0YsWUFBWXY4RyxTQUFaLENBQXNCd2lDLE1BQXRCLENBQStCLFVBQVksQ0FFMUMsU0FBVzYwRSxNQUFNcjNHLFNBQU4sQ0FBZ0J3aUMsTUFBaEIsQ0FBdUI5Z0MsSUFBdkIsQ0FBNkIsSUFBN0IsQ0FBWCxDQUVBeVUsS0FBSzZ2QixNQUFMLENBQWMsRUFBZCxDQUVBLElBQU0sTUFBUSxDQUFSLENBQVd6OEIsRUFBSSxLQUFLeThCLE1BQUwsQ0FBWXYvQixNQUFqQyxDQUF5Q0ssRUFBSXlDLENBQTdDLENBQWdEekMsR0FBaEQsQ0FBdUQsQ0FFdEQsVUFBWSxLQUFLay9CLE1BQUwsQ0FBYWwvQixDQUFiLENBQVosQ0FDQXFQLEtBQUs2dkIsTUFBTCxDQUFZLy9CLElBQVosQ0FBa0J5TixNQUFNMmEsT0FBTixFQUFsQixFQUVBLENBRUQsV0FBQSxDQUVBLENBZkQsQ0FpQkFrdUYsWUFBWXY4RyxTQUFaLENBQXNCZzVHLFFBQXRCLENBQWlDLFNBQVdDLElBQVgsQ0FBa0IsQ0FFbEQ1QixNQUFNcjNHLFNBQU4sQ0FBZ0JnNUcsUUFBaEIsQ0FBeUJ0M0csSUFBekIsQ0FBK0IsSUFBL0IsQ0FBcUN1M0csSUFBckMsRUFFQSxLQUFLanpFLE1BQUwsQ0FBYyxFQUFkLENBRUEsSUFBTSxNQUFRLENBQVIsQ0FBV3o4QixFQUFJMHZHLEtBQUtqekUsTUFBTCxDQUFZdi9CLE1BQWpDLENBQXlDSyxFQUFJeUMsQ0FBN0MsQ0FBZ0R6QyxHQUFoRCxDQUF1RCxDQUV0RCxVQUFZbXlHLEtBQUtqekUsTUFBTCxDQUFhbC9CLENBQWIsQ0FBWixDQUNBLEtBQUtrL0IsTUFBTCxDQUFZLy9CLElBQVosQ0FBa0IsV0FBQSxHQUFja29CLFNBQWQsQ0FBeUJ6YSxLQUF6QixDQUFsQixFQUVBLENBRUQsV0FBQSxDQUVBLENBZkQsQ0FtQkEsV0FBYTNULE9BQU9pekcsTUFBUCxDQUFjLENBQzFCZ0gsU0FBVUEsUUFEZ0IsQ0FFMUJhLGlCQUFrQkEsZ0JBRlEsQ0FHMUJZLGlCQUFrQkEsZ0JBSFEsQ0FJMUJHLGtCQUFtQkEsaUJBSk8sQ0FLMUJsQyxhQUFjQSxZQUxZLENBTTFCb0MsVUFBV0EsU0FOZSxDQU8xQkUsV0FBWUEsVUFQYyxDQVExQkUscUJBQXNCQSxvQkFSSSxDQVMxQkcsc0JBQXVCQSxxQkFURyxDQVUxQkUsWUFBYUEsV0FWYSxDQUFkLENBQWIsQ0FhQTs7Ozs7O2tFQVVBLGtCQUFBLEVBQXFCLENBRXBCbEYsTUFBTTMxRyxJQUFOLENBQVksSUFBWixFQUVBLEtBQUtELElBQUwsQ0FBWSxXQUFaLENBRUEsS0FBS2k3RyxNQUFMLENBQWMsRUFBZCxDQUNBLEtBQUtDLFNBQUwsQ0FBaUIsS0FBakIsQ0FBd0I7RUFFeEIsQ0FFREMsVUFBVTU4RyxTQUFWLENBQXNCRCxPQUFPNG5CLE1BQVAsQ0FBZTVuQixPQUFPaUIsTUFBUCxDQUFlcTJHLE1BQU1yM0csU0FBckIsQ0FBZixDQUFpRCxDQUV0RXNDLFlBQWFzNkcsU0FGeUQsQ0FJdEVqeEYsSUFBSyxTQUFXa3hGLEtBQVgsQ0FBbUIsQ0FFdkIsS0FBS0gsTUFBTCxDQUFZejJHLElBQVosQ0FBa0I0MkcsS0FBbEIsRUFFQSxDQVJxRSxDQVV0RUMsVUFBVyxVQUFZO0VBR3RCLGVBQWlCLEtBQUtKLE1BQUwsQ0FBYSxDQUFiLEVBQWlCcEYsUUFBakIsQ0FBMkIsQ0FBM0IsQ0FBakIsQ0FDQSxhQUFlLEtBQUtvRixNQUFMLENBQWEsS0FBS0EsTUFBTCxDQUFZajJHLE1BQVosQ0FBcUIsQ0FBbEMsRUFBc0M2d0csUUFBdEMsQ0FBZ0QsQ0FBaEQsQ0FBZixDQUVBLEdBQUssQ0FBRXlGLFdBQVc3dUYsTUFBWCxDQUFtQjh1RixRQUFuQixDQUFQLENBQXVDLENBRXRDLEtBQUtOLE1BQUwsQ0FBWXoyRyxJQUFaLENBQWtCLGFBQUEsQ0FBZSsyRyxRQUFmLENBQXlCRCxVQUF6QixDQUFsQixFQUVBLENBRUQsQ0F0QnFFO0VBeUJ0RTtFQUNBO0VBRUE7RUFDQTtFQUNBO0VBQ0E7RUFFQXpGLFNBQVUsU0FBV3h0RixDQUFYLENBQWUsQ0FFeEIsTUFBUUEsRUFBSSxLQUFLNnRGLFNBQUwsRUFBWixDQUNBLGlCQUFtQixLQUFLc0YsZUFBTCxFQUFuQixDQUNBLE1BQVEsQ0FBUixDQUVBO0VBRUEsTUFBUW4yRyxFQUFJbzJHLGFBQWF6MkcsTUFBekIsQ0FBa0MsQ0FFakMsR0FBS3kyRyxhQUFjcDJHLENBQWQsR0FBcUJvcUIsQ0FBMUIsQ0FBOEIsQ0FFN0IsU0FBV2dzRixhQUFjcDJHLENBQWQsRUFBb0JvcUIsQ0FBL0IsQ0FDQSxVQUFZLEtBQUt3ckYsTUFBTCxDQUFhNTFHLENBQWIsQ0FBWixDQUVBLGtCQUFvQisxRyxNQUFNbEYsU0FBTixFQUFwQixDQUNBLE1BQVFXLGdCQUFrQixDQUFsQixDQUFzQixDQUF0QixDQUEwQixFQUFJN2hELEtBQU82aEQsYUFBN0MsQ0FFQSxhQUFhcFUsVUFBTixDQUFrQmp3RCxDQUFsQixDQUFQLENBRUEsQ0FFRG50QyxJQUVBLENBRUQsV0FBQSxDQUVBO0VBRUEsQ0EvRHFFO0VBa0V0RTtFQUNBO0VBRUE2d0csVUFBVyxVQUFZLENBRXRCLFNBQVcsS0FBS3NGLGVBQUwsRUFBWCxDQUNBLFlBQWFFLEtBQUsxMkcsTUFBTCxDQUFjLENBQXBCLENBQVAsQ0FFQSxDQTFFcUU7RUE2RXRFdXhHLGlCQUFrQixVQUFZLENBRTdCLEtBQUt2cEQsV0FBTCxDQUFtQixJQUFuQixDQUNBLEtBQUsydUQsWUFBTCxDQUFvQixJQUFwQixDQUNBLEtBQUtILGVBQUwsR0FFQSxDQW5GcUU7RUFzRnRFO0VBRUFBLGdCQUFpQixVQUFZO0VBSTVCLEdBQUssS0FBS0csWUFBTCxFQUFxQixLQUFLQSxZQUFMLENBQWtCMzJHLE1BQWxCLEdBQTZCLEtBQUtpMkcsTUFBTCxDQUFZajJHLE1BQW5FLENBQTRFLENBRTNFLFlBQVkyMkcsWUFBWixDQUVBLENBRUQ7RUFDQTtFQUVBLFlBQWMsRUFBZCxDQUFrQkMsS0FBTyxDQUF6QixDQUVBLElBQU0sTUFBUSxDQUFSLENBQVc5ekcsRUFBSSxLQUFLbXpHLE1BQUwsQ0FBWWoyRyxNQUFqQyxDQUF5Q0ssRUFBSXlDLENBQTdDLENBQWdEekMsR0FBaEQsQ0FBdUQsQ0FFdER1MkcsTUFBUSxLQUFLWCxNQUFMLENBQWE1MUcsQ0FBYixFQUFpQjZ3RyxTQUFqQixFQUFSLENBQ0FFLFFBQVE1eEcsSUFBUixDQUFjbzNHLElBQWQsRUFFQSxDQUVELEtBQUtELFlBQUwsQ0FBb0J2RixPQUFwQixDQUVBLGNBQUEsQ0FFQSxDQWxIcUUsQ0FvSHRFbk4sZ0JBQWlCLFNBQVdnTixTQUFYLENBQXVCLENBRXZDLEdBQUtBLFlBQWN0eUcsU0FBbkIsQ0FBK0JzeUcsVUFBWSxFQUFaLENBRS9CLFdBQWEsRUFBYixDQUVBLElBQU0sTUFBUSxDQUFkLENBQWlCNXdHLEdBQUs0d0csU0FBdEIsQ0FBaUM1d0csR0FBakMsQ0FBd0MsQ0FFdkNrL0IsT0FBTy8vQixJQUFQLENBQWEsS0FBS3F4RyxRQUFMLENBQWV4d0csRUFBSTR3RyxTQUFuQixDQUFiLEVBRUEsQ0FFRCxHQUFLLEtBQUtpRixTQUFWLENBQXNCLENBRXJCMzJFLE9BQU8vL0IsSUFBUCxDQUFhKy9CLE9BQVEsQ0FBUixDQUFiLEVBRUEsQ0FFRCxhQUFBLENBRUEsQ0F4SXFFLENBMEl0RXl4RSxVQUFXLFNBQVdDLFNBQVgsQ0FBdUIsQ0FFakNBLFVBQVlBLFdBQWEsRUFBekIsQ0FFQSxXQUFhLEVBQWIsQ0FBaUIvL0YsSUFBakIsQ0FFQSxJQUFNLE1BQVEsQ0FBUixDQUFXK2tHLE9BQVMsS0FBS0EsTUFBL0IsQ0FBdUM1MUcsRUFBSTQxRyxPQUFPajJHLE1BQWxELENBQTBESyxHQUExRCxDQUFpRSxDQUVoRSxVQUFZNDFHLE9BQVE1MUcsQ0FBUixDQUFaLENBQ0EsZUFBbUIrMUcsT0FBU0EsTUFBTWxELGNBQWpCLENBQW9DakMsVUFBWSxDQUFoRCxDQUNabUYsT0FBU0EsTUFBTWQsV0FBakIsQ0FBaUMsQ0FBakMsQ0FDR2MsT0FBU0EsTUFBTUwsYUFBakIsQ0FBbUM5RSxVQUFZbUYsTUFBTTcyRSxNQUFOLENBQWF2L0IsTUFBNUQsQ0FDQ2l4RyxTQUhMLENBS0EsUUFBVW1GLE1BQU1wRixTQUFOLENBQWlCNkYsVUFBakIsQ0FBVixDQUVBLElBQU0sTUFBUSxDQUFkLENBQWlCNTZGLEVBQUl3bUYsSUFBSXppRyxNQUF6QixDQUFpQ2ljLEdBQWpDLENBQXdDLENBRXZDLFVBQVl3bUYsSUFBS3htRixDQUFMLENBQVosQ0FFQSxHQUFLL0ssTUFBUUEsS0FBS3VXLE1BQUwsQ0FBYXhhLEtBQWIsQ0FBYixDQUFvQyxTQUFVO0VBRTlDc3lCLE9BQU8vL0IsSUFBUCxDQUFheU4sS0FBYixFQUNBaUUsS0FBT2pFLEtBQVAsQ0FFQSxDQUVELENBRUQsR0FBSyxLQUFLaXBHLFNBQUwsRUFBa0IzMkUsT0FBT3YvQixNQUFQLENBQWdCLENBQWxDLEVBQXVDLENBQUV1L0IsT0FBUUEsT0FBT3YvQixNQUFQLENBQWdCLENBQXhCLEVBQTRCeW5CLE1BQTVCLENBQW9DOFgsT0FBUSxDQUFSLENBQXBDLENBQTlDLENBQWtHLENBRWpHQSxPQUFPLy9CLElBQVAsQ0FBYSsvQixPQUFRLENBQVIsQ0FBYixFQUVBLENBRUQsYUFBQSxDQUVBLENBL0txRSxDQWlMdEV0YSxLQUFNLFNBQVc1ZixNQUFYLENBQW9CLENBRXpCdXJHLE1BQU1yM0csU0FBTixDQUFnQjByQixJQUFoQixDQUFxQmhxQixJQUFyQixDQUEyQixJQUEzQixDQUFpQ29LLE1BQWpDLEVBRUEsS0FBSzR3RyxNQUFMLENBQWMsRUFBZCxDQUVBLElBQU0sTUFBUSxDQUFSLENBQVduekcsRUFBSXVDLE9BQU80d0csTUFBUCxDQUFjajJHLE1BQW5DLENBQTJDSyxFQUFJeUMsQ0FBL0MsQ0FBa0R6QyxHQUFsRCxDQUF5RCxDQUV4RCxVQUFZZ0YsT0FBTzR3RyxNQUFQLENBQWU1MUcsQ0FBZixDQUFaLENBRUEsS0FBSzQxRyxNQUFMLENBQVl6MkcsSUFBWixDQUFrQjQyRyxNQUFNcHhGLEtBQU4sRUFBbEIsRUFFQSxDQUVELEtBQUtreEYsU0FBTCxDQUFpQjd3RyxPQUFPNndHLFNBQXhCLENBRUEsV0FBQSxDQUVBLENBbk1xRSxDQXFNdEVuNkUsT0FBUSxVQUFZLENBRW5CLFNBQVc2MEUsTUFBTXIzRyxTQUFOLENBQWdCd2lDLE1BQWhCLENBQXVCOWdDLElBQXZCLENBQTZCLElBQTdCLENBQVgsQ0FFQXlVLEtBQUt3bUcsU0FBTCxDQUFpQixLQUFLQSxTQUF0QixDQUNBeG1HLEtBQUt1bUcsTUFBTCxDQUFjLEVBQWQsQ0FFQSxJQUFNLE1BQVEsQ0FBUixDQUFXbnpHLEVBQUksS0FBS216RyxNQUFMLENBQVlqMkcsTUFBakMsQ0FBeUNLLEVBQUl5QyxDQUE3QyxDQUFnRHpDLEdBQWhELENBQXVELENBRXRELFVBQVksS0FBSzQxRyxNQUFMLENBQWE1MUcsQ0FBYixDQUFaLENBQ0FxUCxLQUFLdW1HLE1BQUwsQ0FBWXoyRyxJQUFaLENBQWtCNDJHLE1BQU1yNkUsTUFBTixFQUFsQixFQUVBLENBRUQsV0FBQSxDQUVBLENBck5xRSxDQXVOdEV3MkUsU0FBVSxTQUFXQyxJQUFYLENBQWtCLENBRTNCNUIsTUFBTXIzRyxTQUFOLENBQWdCZzVHLFFBQWhCLENBQXlCdDNHLElBQXpCLENBQStCLElBQS9CLENBQXFDdTNHLElBQXJDLEVBRUEsS0FBSzBELFNBQUwsQ0FBaUIxRCxLQUFLMEQsU0FBdEIsQ0FDQSxLQUFLRCxNQUFMLENBQWMsRUFBZCxDQUVBLElBQU0sTUFBUSxDQUFSLENBQVduekcsRUFBSTB2RyxLQUFLeUQsTUFBTCxDQUFZajJHLE1BQWpDLENBQXlDSyxFQUFJeUMsQ0FBN0MsQ0FBZ0R6QyxHQUFoRCxDQUF1RCxDQUV0RCxVQUFZbXlHLEtBQUt5RCxNQUFMLENBQWE1MUcsQ0FBYixDQUFaLENBQ0EsS0FBSzQxRyxNQUFMLENBQVl6MkcsSUFBWixDQUFrQixXQUFZNDJHLE1BQU1wN0csSUFBZCxDQUFKLEdBQTJCdTNHLFFBQTNCLENBQXFDNkQsS0FBckMsQ0FBbEIsRUFFQSxDQUVELFdBQUEsQ0FFQSxDQXZPcUUsQ0FBakQsQ0FBdEIsQ0EyT0E7OztNQUtBLGFBQUEsQ0FBZTcyRSxNQUFmLENBQXdCLENBRXZCNDJFLFVBQVVsN0csSUFBVixDQUFnQixJQUFoQixFQUVBLEtBQUtELElBQUwsQ0FBWSxNQUFaLENBRUEsS0FBSzg3RyxZQUFMLENBQW9CLFdBQUEsRUFBcEIsQ0FFQSxHQUFLdjNFLE1BQUwsQ0FBYyxDQUViLEtBQUtELGFBQUwsQ0FBb0JDLE1BQXBCLEVBRUEsQ0FFRCxDQUVEdzNFLEtBQUt4OUcsU0FBTCxDQUFpQkQsT0FBTzRuQixNQUFQLENBQWU1bkIsT0FBT2lCLE1BQVAsQ0FBZTQ3RyxVQUFVNThHLFNBQXpCLENBQWYsQ0FBcUQsQ0FFckVzQyxZQUFhazdHLElBRndELENBSXJFejNFLGNBQWUsU0FBV0MsTUFBWCxDQUFvQixDQUVsQyxLQUFLeTNFLE1BQUwsQ0FBYXozRSxPQUFRLENBQVIsRUFBWTNzQixDQUF6QixDQUE0QjJzQixPQUFRLENBQVIsRUFBWW5jLENBQXhDLEVBRUEsSUFBTSxNQUFRLENBQVIsQ0FBV3RnQixFQUFJeThCLE9BQU92L0IsTUFBNUIsQ0FBb0NLLEVBQUl5QyxDQUF4QyxDQUEyQ3pDLEdBQTNDLENBQWtELENBRWpELEtBQUs0MkcsTUFBTCxDQUFhMTNFLE9BQVFsL0IsQ0FBUixFQUFZdVMsQ0FBekIsQ0FBNEIyc0IsT0FBUWwvQixDQUFSLEVBQVkraUIsQ0FBeEMsRUFFQSxDQUVELENBZG9FLENBZ0JyRTR6RixPQUFRLFNBQVdwa0csQ0FBWCxDQUFjd1EsQ0FBZCxDQUFrQixDQUV6QixLQUFLMHpGLFlBQUwsQ0FBa0JubUcsR0FBbEIsQ0FBdUJpQyxDQUF2QixDQUEwQndRLENBQTFCLEVBQStCO0VBRS9CLENBcEJvRSxDQXNCckU2ekYsT0FBUSxTQUFXcmtHLENBQVgsQ0FBY3dRLENBQWQsQ0FBa0IsQ0FFekIsVUFBWSxhQUFBLENBQWUsS0FBSzB6RixZQUFMLENBQWtCOXhGLEtBQWxCLEVBQWYsQ0FBMEMsV0FBQSxDQUFhcFMsQ0FBYixDQUFnQndRLENBQWhCLENBQTFDLENBQVosQ0FDQSxLQUFLNnlGLE1BQUwsQ0FBWXoyRyxJQUFaLENBQWtCNDJHLEtBQWxCLEVBRUEsS0FBS1UsWUFBTCxDQUFrQm5tRyxHQUFsQixDQUF1QmlDLENBQXZCLENBQTBCd1EsQ0FBMUIsRUFFQSxDQTdCb0UsQ0ErQnJFOHpGLGlCQUFrQixTQUFXQyxJQUFYLENBQWlCQyxJQUFqQixDQUF1QjNFLEVBQXZCLENBQTJCQyxFQUEzQixDQUFnQyxDQUVqRCxVQUFZLHdCQUFBLENBQ1gsS0FBS29FLFlBQUwsQ0FBa0I5eEYsS0FBbEIsRUFEVyxDQUVYLFdBQUEsQ0FBYW15RixJQUFiLENBQW1CQyxJQUFuQixDQUZXLENBR1gsV0FBQSxDQUFhM0UsRUFBYixDQUFpQkMsRUFBakIsQ0FIVyxDQUFaLENBTUEsS0FBS3VELE1BQUwsQ0FBWXoyRyxJQUFaLENBQWtCNDJHLEtBQWxCLEVBRUEsS0FBS1UsWUFBTCxDQUFrQm5tRyxHQUFsQixDQUF1QjhoRyxFQUF2QixDQUEyQkMsRUFBM0IsRUFFQSxDQTNDb0UsQ0E2Q3JFMkUsY0FBZSxTQUFXQyxLQUFYLENBQWtCQyxLQUFsQixDQUF5QkMsS0FBekIsQ0FBZ0NDLEtBQWhDLENBQXVDaEYsRUFBdkMsQ0FBMkNDLEVBQTNDLENBQWdELENBRTlELFVBQVksb0JBQUEsQ0FDWCxLQUFLb0UsWUFBTCxDQUFrQjl4RixLQUFsQixFQURXLENBRVgsV0FBQSxDQUFhc3lGLEtBQWIsQ0FBb0JDLEtBQXBCLENBRlcsQ0FHWCxXQUFBLENBQWFDLEtBQWIsQ0FBb0JDLEtBQXBCLENBSFcsQ0FJWCxXQUFBLENBQWFoRixFQUFiLENBQWlCQyxFQUFqQixDQUpXLENBQVosQ0FPQSxLQUFLdUQsTUFBTCxDQUFZejJHLElBQVosQ0FBa0I0MkcsS0FBbEIsRUFFQSxLQUFLVSxZQUFMLENBQWtCbm1HLEdBQWxCLENBQXVCOGhHLEVBQXZCLENBQTJCQyxFQUEzQixFQUVBLENBMURvRSxDQTREckVnRixXQUFZLFNBQVdqVixHQUFJLG9CQUFzQixDQUVoRCxTQUFXLENBQUUsS0FBS3FVLFlBQUwsQ0FBa0I5eEYsS0FBbEIsRUFBRixFQUE4QmhkLE1BQTlCLENBQXNDeTZGLEdBQXRDLENBQVgsQ0FFQSxVQUFZLGVBQUEsQ0FBaUJrVixJQUFqQixDQUFaLENBQ0EsS0FBSzFCLE1BQUwsQ0FBWXoyRyxJQUFaLENBQWtCNDJHLEtBQWxCLEVBRUEsS0FBS1UsWUFBTCxDQUFrQjd4RixJQUFsQixDQUF3Qnc5RSxJQUFLQSxJQUFJemlHLE1BQUosQ0FBYSxDQUFsQixDQUF4QixFQUVBLENBckVvRSxDQXVFckV1K0YsSUFBSyxTQUFXa1UsRUFBWCxDQUFlQyxFQUFmLENBQW1CWSxPQUFuQixDQUE0QlQsV0FBNUIsQ0FBeUNDLFNBQXpDLENBQW9EQyxVQUFwRCxDQUFpRSxDQUVyRSxPQUFTLEtBQUsrRCxZQUFMLENBQWtCbGtHLENBQTNCLENBQ0EsT0FBUyxLQUFLa2tHLFlBQUwsQ0FBa0IxekYsQ0FBM0IsQ0FFQSxLQUFLdzBGLE1BQUwsQ0FBYW5GLEdBQUtoL0UsRUFBbEIsQ0FBc0JpL0UsR0FBS3gvRSxFQUEzQixDQUErQm9nRixPQUEvQixDQUNDVCxXQURELENBQ2NDLFNBRGQsQ0FDeUJDLFVBRHpCLEVBR0EsQ0EvRW9FLENBaUZyRTZFLE9BQVEsU0FBV25GLEVBQVgsQ0FBZUMsRUFBZixDQUFtQlksT0FBbkIsQ0FBNEJULFdBQTVCLENBQXlDQyxTQUF6QyxDQUFvREMsVUFBcEQsQ0FBaUUsQ0FFeEUsS0FBSzhFLFVBQUwsQ0FBaUJwRixFQUFqQixDQUFxQkMsRUFBckIsQ0FBeUJZLE9BQXpCLENBQWtDQSxPQUFsQyxDQUEyQ1QsV0FBM0MsQ0FBd0RDLFNBQXhELENBQW1FQyxVQUFuRSxFQUVBLENBckZvRSxDQXVGckUrRSxRQUFTLFNBQVdyRixFQUFYLENBQWVDLEVBQWYsQ0FBbUJDLE9BQW5CLENBQTRCQyxPQUE1QixDQUFxQ0MsV0FBckMsQ0FBa0RDLFNBQWxELENBQTZEQyxVQUE3RCxDQUF5RUMsU0FBekUsQ0FBcUYsQ0FFN0YsT0FBUyxLQUFLOEQsWUFBTCxDQUFrQmxrRyxDQUEzQixDQUNBLE9BQVMsS0FBS2trRyxZQUFMLENBQWtCMXpGLENBQTNCLENBRUEsS0FBS3kwRixVQUFMLENBQWlCcEYsR0FBS2gvRSxFQUF0QixDQUEwQmkvRSxHQUFLeC9FLEVBQS9CLENBQW1DeS9FLE9BQW5DLENBQTRDQyxPQUE1QyxDQUFxREMsV0FBckQsQ0FBa0VDLFNBQWxFLENBQTZFQyxVQUE3RSxDQUF5RkMsU0FBekYsRUFFQSxDQTlGb0UsQ0FnR3JFNkUsV0FBWSxTQUFXcEYsRUFBWCxDQUFlQyxFQUFmLENBQW1CQyxPQUFuQixDQUE0QkMsT0FBNUIsQ0FBcUNDLFdBQXJDLENBQWtEQyxTQUFsRCxDQUE2REMsVUFBN0QsQ0FBeUVDLFNBQXpFLENBQXFGLENBRWhHLFVBQVksZ0JBQUEsQ0FBa0JQLEVBQWxCLENBQXNCQyxFQUF0QixDQUEwQkMsT0FBMUIsQ0FBbUNDLE9BQW5DLENBQTRDQyxXQUE1QyxDQUF5REMsU0FBekQsQ0FBb0VDLFVBQXBFLENBQWdGQyxTQUFoRixDQUFaLENBRUEsR0FBSyxLQUFLaUQsTUFBTCxDQUFZajJHLE1BQVosQ0FBcUIsQ0FBMUIsQ0FBOEI7RUFHN0IsZUFBaUJvMkcsTUFBTXZGLFFBQU4sQ0FBZ0IsQ0FBaEIsQ0FBakIsQ0FFQSxHQUFLLENBQUVrSCxXQUFXdHdGLE1BQVgsQ0FBbUIsS0FBS3F2RixZQUF4QixDQUFQLENBQWdELENBRS9DLEtBQUtHLE1BQUwsQ0FBYWMsV0FBV25sRyxDQUF4QixDQUEyQm1sRyxXQUFXMzBGLENBQXRDLEVBRUEsQ0FFRCxDQUVELEtBQUs2eUYsTUFBTCxDQUFZejJHLElBQVosQ0FBa0I0MkcsS0FBbEIsRUFFQSxjQUFnQkEsTUFBTXZGLFFBQU4sQ0FBZ0IsQ0FBaEIsQ0FBaEIsQ0FDQSxLQUFLaUcsWUFBTCxDQUFrQjd4RixJQUFsQixDQUF3Qit5RixTQUF4QixFQUVBLENBdEhvRSxDQXdIckUveUYsS0FBTSxTQUFXNWYsTUFBWCxDQUFvQixDQUV6Qjh3RyxVQUFVNThHLFNBQVYsQ0FBb0IwckIsSUFBcEIsQ0FBeUJocUIsSUFBekIsQ0FBK0IsSUFBL0IsQ0FBcUNvSyxNQUFyQyxFQUVBLEtBQUt5eEcsWUFBTCxDQUFrQjd4RixJQUFsQixDQUF3QjVmLE9BQU95eEcsWUFBL0IsRUFFQSxXQUFBLENBRUEsQ0FoSW9FLENBa0lyRS82RSxPQUFRLFVBQVksQ0FFbkIsU0FBV282RSxVQUFVNThHLFNBQVYsQ0FBb0J3aUMsTUFBcEIsQ0FBMkI5Z0MsSUFBM0IsQ0FBaUMsSUFBakMsQ0FBWCxDQUVBeVUsS0FBS29uRyxZQUFMLENBQW9CLEtBQUtBLFlBQUwsQ0FBa0JsdkYsT0FBbEIsRUFBcEIsQ0FFQSxXQUFBLENBRUEsQ0ExSW9FLENBNElyRTJxRixTQUFVLFNBQVdDLElBQVgsQ0FBa0IsQ0FFM0IyRCxVQUFVNThHLFNBQVYsQ0FBb0JnNUcsUUFBcEIsQ0FBNkJ0M0csSUFBN0IsQ0FBbUMsSUFBbkMsQ0FBeUN1M0csSUFBekMsRUFFQSxLQUFLc0UsWUFBTCxDQUFrQnB2RixTQUFsQixDQUE2QjhxRixLQUFLc0UsWUFBbEMsRUFFQSxXQUFBLENBRUEsQ0FwSm9FLENBQXJELENBQWpCLENBd0pBOzs7O0VBTUE7RUFDQTtFQUNBO0VBQ0E7RUFFQSxjQUFBLENBQWdCdjNFLE1BQWhCLENBQXlCLENBRXhCdzNFLEtBQUs5N0csSUFBTCxDQUFXLElBQVgsQ0FBaUJza0MsTUFBakIsRUFFQSxLQUFLN0UsSUFBTCxDQUFZMVcsTUFBTTdCLFlBQU4sRUFBWixDQUVBLEtBQUtubkIsSUFBTCxDQUFZLE9BQVosQ0FFQSxLQUFLMm5HLEtBQUwsQ0FBYSxFQUFiLENBRUEsQ0FFRHNWLE1BQU0xK0csU0FBTixDQUFrQkQsT0FBTzRuQixNQUFQLENBQWU1bkIsT0FBT2lCLE1BQVAsQ0FBZXc4RyxLQUFLeDlHLFNBQXBCLENBQWYsQ0FBZ0QsQ0FFakVzQyxZQUFhbzhHLEtBRm9ELENBSWpFQyxlQUFnQixTQUFXakgsU0FBWCxDQUF1QixDQUV0QyxhQUFlLEVBQWYsQ0FFQSxJQUFNLE1BQVEsQ0FBUixDQUFXbnVHLEVBQUksS0FBSzYvRixLQUFMLENBQVczaUcsTUFBaEMsQ0FBd0NLLEVBQUl5QyxDQUE1QyxDQUErQ3pDLEdBQS9DLENBQXNELENBRXJEODNHLFNBQVU5M0csQ0FBVixFQUFnQixLQUFLc2lHLEtBQUwsQ0FBWXRpRyxDQUFaLEVBQWdCMndHLFNBQWhCLENBQTJCQyxTQUEzQixDQUFoQixDQUVBLENBRUQsZUFBQSxDQUVBLENBaEJnRTtFQW9CakU3TSxjQUFlLFNBQVc2TSxTQUFYLENBQXVCLENBRXJDLE9BQU8sQ0FFTjUwRCxNQUFPLEtBQUsyMEQsU0FBTCxDQUFnQkMsU0FBaEIsQ0FGRCxDQUdOdE8sTUFBTyxLQUFLdVYsY0FBTCxDQUFxQmpILFNBQXJCLENBSEQsQ0FBUCxDQU9BLENBN0JnRSxDQStCakVoc0YsS0FBTSxTQUFXNWYsTUFBWCxDQUFvQixDQUV6QjB4RyxLQUFLeDlHLFNBQUwsQ0FBZTByQixJQUFmLENBQW9CaHFCLElBQXBCLENBQTBCLElBQTFCLENBQWdDb0ssTUFBaEMsRUFFQSxLQUFLczlGLEtBQUwsQ0FBYSxFQUFiLENBRUEsSUFBTSxNQUFRLENBQVIsQ0FBVzcvRixFQUFJdUMsT0FBT3M5RixLQUFQLENBQWEzaUcsTUFBbEMsQ0FBMENLLEVBQUl5QyxDQUE5QyxDQUFpRHpDLEdBQWpELENBQXdELENBRXZELFNBQVdnRixPQUFPczlGLEtBQVAsQ0FBY3RpRyxDQUFkLENBQVgsQ0FFQSxLQUFLc2lHLEtBQUwsQ0FBV25qRyxJQUFYLENBQWlCeWhHLEtBQUtqOEUsS0FBTCxFQUFqQixFQUVBLENBRUQsV0FBQSxDQUVBLENBL0NnRSxDQWlEakUrVyxPQUFRLFVBQVksQ0FFbkIsU0FBV2c3RSxLQUFLeDlHLFNBQUwsQ0FBZXdpQyxNQUFmLENBQXNCOWdDLElBQXRCLENBQTRCLElBQTVCLENBQVgsQ0FFQXlVLEtBQUtnckIsSUFBTCxDQUFZLEtBQUtBLElBQWpCLENBQ0FockIsS0FBS2l6RixLQUFMLENBQWEsRUFBYixDQUVBLElBQU0sTUFBUSxDQUFSLENBQVc3L0YsRUFBSSxLQUFLNi9GLEtBQUwsQ0FBVzNpRyxNQUFoQyxDQUF3Q0ssRUFBSXlDLENBQTVDLENBQStDekMsR0FBL0MsQ0FBc0QsQ0FFckQsU0FBVyxLQUFLc2lHLEtBQUwsQ0FBWXRpRyxDQUFaLENBQVgsQ0FDQXFQLEtBQUtpekYsS0FBTCxDQUFXbmpHLElBQVgsQ0FBaUJ5aEcsS0FBS2xsRSxNQUFMLEVBQWpCLEVBRUEsQ0FFRCxXQUFBLENBRUEsQ0FqRWdFLENBbUVqRXcyRSxTQUFVLFNBQVdDLElBQVgsQ0FBa0IsQ0FFM0J1RSxLQUFLeDlHLFNBQUwsQ0FBZWc1RyxRQUFmLENBQXdCdDNHLElBQXhCLENBQThCLElBQTlCLENBQW9DdTNHLElBQXBDLEVBRUEsS0FBSzkzRSxJQUFMLENBQVk4M0UsS0FBSzkzRSxJQUFqQixDQUNBLEtBQUtpb0UsS0FBTCxDQUFhLEVBQWIsQ0FFQSxJQUFNLE1BQVEsQ0FBUixDQUFXNy9GLEVBQUkwdkcsS0FBSzdQLEtBQUwsQ0FBVzNpRyxNQUFoQyxDQUF3Q0ssRUFBSXlDLENBQTVDLENBQStDekMsR0FBL0MsQ0FBc0QsQ0FFckQsU0FBV215RyxLQUFLN1AsS0FBTCxDQUFZdGlHLENBQVosQ0FBWCxDQUNBLEtBQUtzaUcsS0FBTCxDQUFXbmpHLElBQVgsQ0FBaUIsUUFBQSxHQUFXK3lHLFFBQVgsQ0FBcUJ0UixJQUFyQixDQUFqQixFQUVBLENBRUQsV0FBQSxDQUVBLENBbkZnRSxDQUFoRCxDQUFsQixDQXVGQTs7O0tBS0EsY0FBQSxDQUFnQjF5RCxLQUFoQixDQUF1Qms5QixTQUF2QixDQUFtQyxDQUVsQ3p5QixTQUFTLzlDLElBQVQsQ0FBZSxJQUFmLEVBRUEsS0FBS0QsSUFBTCxDQUFZLE9BQVosQ0FFQSxLQUFLdXpDLEtBQUwsQ0FBYSxTQUFBLENBQVdBLEtBQVgsQ0FBYixDQUNBLEtBQUtrOUIsU0FBTCxDQUFpQkEsWUFBYzlzRSxTQUFkLENBQTBCOHNFLFNBQTFCLENBQXNDLENBQXZELENBRUEsS0FBS2h5QixhQUFMLENBQXFCOTZDLFNBQXJCLENBRUEsQ0FFRHk1RyxNQUFNNytHLFNBQU4sQ0FBa0JELE9BQU80bkIsTUFBUCxDQUFlNW5CLE9BQU9pQixNQUFQLENBQWV5K0MsU0FBU3ovQyxTQUF4QixDQUFmLENBQW9ELENBRXJFc0MsWUFBYXU4RyxLQUZ3RCxDQUlyRXhuQixRQUFTLElBSjRELENBTXJFM3JFLEtBQU0sU0FBVzVmLE1BQVgsQ0FBb0IsQ0FFekIyekMsU0FBU3ovQyxTQUFULENBQW1CMHJCLElBQW5CLENBQXdCaHFCLElBQXhCLENBQThCLElBQTlCLENBQW9Db0ssTUFBcEMsRUFFQSxLQUFLa3BDLEtBQUwsQ0FBV3RwQixJQUFYLENBQWlCNWYsT0FBT2twQyxLQUF4QixFQUNBLEtBQUtrOUIsU0FBTCxDQUFpQnBtRSxPQUFPb21FLFNBQXhCLENBRUEsV0FBQSxDQUVBLENBZm9FLENBaUJyRTF2QyxPQUFRLFNBQVdqakIsSUFBWCxDQUFrQixDQUV6QixTQUFXa2dDLFNBQVN6L0MsU0FBVCxDQUFtQndpQyxNQUFuQixDQUEwQjlnQyxJQUExQixDQUFnQyxJQUFoQyxDQUFzQzZkLElBQXRDLENBQVgsQ0FFQXBKLEtBQUs3UCxNQUFMLENBQVkwdUMsS0FBWixDQUFvQixLQUFLQSxLQUFMLENBQVdXLE1BQVgsRUFBcEIsQ0FDQXgvQixLQUFLN1AsTUFBTCxDQUFZNHJFLFNBQVosQ0FBd0IsS0FBS0EsU0FBN0IsQ0FFQSxHQUFLLEtBQUsxM0IsV0FBTCxHQUFxQnAxQyxTQUExQixDQUFzQytRLEtBQUs3UCxNQUFMLENBQVlrMEMsV0FBWixDQUEwQixLQUFLQSxXQUFMLENBQWlCN0UsTUFBakIsRUFBMUIsQ0FFdEMsR0FBSyxLQUFLL0ksUUFBTCxHQUFrQnhuQyxTQUF2QixDQUFtQytRLEtBQUs3UCxNQUFMLENBQVlzbUMsUUFBWixDQUF1QixLQUFLQSxRQUE1QixDQUNuQyxHQUFLLEtBQUt0ZixLQUFMLEdBQWVsb0IsU0FBcEIsQ0FBZ0MrUSxLQUFLN1AsTUFBTCxDQUFZZ25CLEtBQVosQ0FBb0IsS0FBS0EsS0FBekIsQ0FDaEMsR0FBSyxLQUFLd3NCLEtBQUwsR0FBZTEwQyxTQUFwQixDQUFnQytRLEtBQUs3UCxNQUFMLENBQVl3ekMsS0FBWixDQUFvQixLQUFLQSxLQUF6QixDQUNoQyxHQUFLLEtBQUs0NEIsUUFBTCxHQUFrQnR0RSxTQUF2QixDQUFtQytRLEtBQUs3UCxNQUFMLENBQVlvc0UsUUFBWixDQUF1QixLQUFLQSxRQUE1QixDQUVuQyxHQUFLLEtBQUtyNUIsTUFBTCxHQUFnQmowQyxTQUFyQixDQUFpQytRLEtBQUs3UCxNQUFMLENBQVkreUMsTUFBWixDQUFxQixLQUFLQSxNQUFMLENBQVk3VyxNQUFaLEVBQXJCLENBRWpDLFdBQUEsQ0FFQSxDQW5Db0UsQ0FBcEQsQ0FBbEIsQ0F1Q0E7O0tBSUEsd0JBQUEsQ0FBMEIrWCxRQUExQixDQUFvQ0MsV0FBcEMsQ0FBaUQwM0IsU0FBakQsQ0FBNkQsQ0FFNUQyc0MsTUFBTW45RyxJQUFOLENBQVksSUFBWixDQUFrQjY0QyxRQUFsQixDQUE0QjIzQixTQUE1QixFQUVBLEtBQUt6d0UsSUFBTCxDQUFZLGlCQUFaLENBRUEsS0FBS3crQyxVQUFMLENBQWtCNzZDLFNBQWxCLENBRUEsS0FBS3N5QixRQUFMLENBQWNoTSxJQUFkLENBQW9CK3pCLFNBQVNDLFNBQTdCLEVBQ0EsS0FBS25kLFlBQUwsR0FFQSxLQUFLaVksV0FBTCxDQUFtQixTQUFBLENBQVdBLFdBQVgsQ0FBbkIsQ0FFQSxDQUVEc2tFLGdCQUFnQjkrRyxTQUFoQixDQUE0QkQsT0FBTzRuQixNQUFQLENBQWU1bkIsT0FBT2lCLE1BQVAsQ0FBZTY5RyxNQUFNNytHLFNBQXJCLENBQWYsQ0FBaUQsQ0FFNUVzQyxZQUFhdzhHLGVBRitELENBSTVFN3JDLGtCQUFtQixJQUp5RCxDQU01RXZuRCxLQUFNLFNBQVc1ZixNQUFYLENBQW9CLENBRXpCK3lHLE1BQU03K0csU0FBTixDQUFnQjByQixJQUFoQixDQUFxQmhxQixJQUFyQixDQUEyQixJQUEzQixDQUFpQ29LLE1BQWpDLEVBRUEsS0FBSzB1QyxXQUFMLENBQWlCOXVCLElBQWpCLENBQXVCNWYsT0FBTzB1QyxXQUE5QixFQUVBLFdBQUEsQ0FFQSxDQWQyRSxDQUFqRCxDQUE1QixDQWtCQTs7S0FJQSxvQkFBQSxDQUFzQnRjLE1BQXRCLENBQStCLENBRTlCLEtBQUtBLE1BQUwsQ0FBY0EsTUFBZCxDQUVBLEtBQUtvMEMsSUFBTCxDQUFZLENBQVosQ0FDQSxLQUFLOXlDLE1BQUwsQ0FBYyxDQUFkLENBRUEsS0FBSyt5QyxPQUFMLENBQWUsV0FBQSxDQUFhLEdBQWIsQ0FBa0IsR0FBbEIsQ0FBZixDQUVBLEtBQUs5N0IsR0FBTCxDQUFXLElBQVgsQ0FDQSxLQUFLMWUsTUFBTCxDQUFjLFdBQUEsRUFBZCxDQUVBLENBRURoNEIsT0FBTzRuQixNQUFQLENBQWVvM0YsWUFBWS8rRyxTQUEzQixDQUFzQyxDQUVyQzByQixLQUFNLFNBQVc1ZixNQUFYLENBQW9CLENBRXpCLEtBQUtveUIsTUFBTCxDQUFjcHlCLE9BQU9veUIsTUFBUCxDQUFjelMsS0FBZCxFQUFkLENBRUEsS0FBSzZtRCxJQUFMLENBQVl4bUUsT0FBT3dtRSxJQUFuQixDQUNBLEtBQUs5eUMsTUFBTCxDQUFjMXpCLE9BQU8wekIsTUFBckIsQ0FFQSxLQUFLK3lDLE9BQUwsQ0FBYTdtRCxJQUFiLENBQW1CNWYsT0FBT3ltRSxPQUExQixFQUVBLFdBQUEsQ0FFQSxDQWJvQyxDQWVyQzltRCxNQUFPLFVBQVksQ0FFbEIsZ0JBQWdCbnBCLFdBQVQsR0FBdUJvcEIsSUFBdkIsQ0FBNkIsSUFBN0IsQ0FBUCxDQUVBLENBbkJvQyxDQXFCckM4VyxPQUFRLFVBQVksQ0FFbkIsV0FBYSxFQUFiLENBRUEsR0FBSyxLQUFLOHZDLElBQUwsR0FBYyxDQUFuQixDQUF1QmhzRSxPQUFPZ3NFLElBQVAsQ0FBYyxLQUFLQSxJQUFuQixDQUN2QixHQUFLLEtBQUs5eUMsTUFBTCxHQUFnQixDQUFyQixDQUF5Qmw1QixPQUFPazVCLE1BQVAsQ0FBZ0IsS0FBS0EsTUFBckIsQ0FDekIsR0FBSyxLQUFLK3lDLE9BQUwsQ0FBYWw1RCxDQUFiLEdBQW1CLEdBQW5CLEVBQTBCLEtBQUtrNUQsT0FBTCxDQUFhMW9ELENBQWIsR0FBbUIsR0FBbEQsQ0FBd0R2akIsT0FBT2lzRSxPQUFQLENBQWlCLEtBQUtBLE9BQUwsQ0FBYWxrRCxPQUFiLEVBQWpCLENBRXhEL25CLE9BQU80M0IsTUFBUCxDQUFnQixLQUFLQSxNQUFMLENBQVlzRSxNQUFaLENBQW9CLEtBQXBCLEVBQTRCbDhCLE1BQTVDLENBQ0EsY0FBYzQzQixNQUFQLENBQWNuRyxNQUFyQixDQUVBLGFBQUEsQ0FFQSxDQWxDb0MsQ0FBdEMsRUFzQ0E7O0tBSUEsd0JBQUEsRUFBMkIsQ0FFMUJnbkYsWUFBWXI5RyxJQUFaLENBQWtCLElBQWxCLENBQXdCLHFCQUFBLENBQXVCLEVBQXZCLENBQTJCLENBQTNCLENBQThCLEdBQTlCLENBQW1DLEdBQW5DLENBQXhCLEVBRUEsQ0FFRHM5RyxnQkFBZ0JoL0csU0FBaEIsQ0FBNEJELE9BQU80bkIsTUFBUCxDQUFlNW5CLE9BQU9pQixNQUFQLENBQWUrOUcsWUFBWS8rRyxTQUEzQixDQUFmLENBQXVELENBRWxGc0MsWUFBYTA4RyxlQUZxRSxDQUlsRmxwQyxrQkFBbUIsSUFKK0QsQ0FNbEZyN0MsT0FBUSxTQUFXcTNDLEtBQVgsQ0FBbUIsQ0FFMUIsV0FBYSxLQUFLNXpDLE1BQWxCLENBRUEsUUFBVXpULE1BQU05QixPQUFOLENBQWdCLENBQWhCLENBQW9CbXBELE1BQU14a0QsS0FBcEMsQ0FDQSxXQUFhLEtBQUtpbEQsT0FBTCxDQUFhMXZDLEtBQWIsQ0FBcUIsS0FBSzB2QyxPQUFMLENBQWF6dkMsTUFBL0MsQ0FDQSxRQUFVZ3ZDLE1BQU1sbEMsUUFBTixFQUFrQjFPLE9BQU90RixHQUFuQyxDQUVBLEdBQUtrekQsTUFBUTV0RCxPQUFPNHRELEdBQWYsRUFBc0JDLFNBQVc3dEQsT0FBTzZ0RCxNQUF4QyxFQUFrRG56RCxNQUFRc0YsT0FBT3RGLEdBQXRFLENBQTRFLENBRTNFc0YsT0FBTzR0RCxHQUFQLENBQWFBLEdBQWIsQ0FDQTV0RCxPQUFPNnRELE1BQVAsQ0FBZ0JBLE1BQWhCLENBQ0E3dEQsT0FBT3RGLEdBQVAsQ0FBYUEsR0FBYixDQUNBc0YsT0FBT3VsQixzQkFBUCxHQUVBLENBRUQsQ0F2QmlGLENBQXZELENBQTVCLENBMkJBOztLQUlBLGtCQUFBLENBQW9Cek8sS0FBcEIsQ0FBMkJrOUIsU0FBM0IsQ0FBc0N0bEMsUUFBdEMsQ0FBZ0R0ZixLQUFoRCxDQUF1RG9sRCxRQUF2RCxDQUFpRTU0QixLQUFqRSxDQUF5RSxDQUV4RStrRSxNQUFNbjlHLElBQU4sQ0FBWSxJQUFaLENBQWtCc3pDLEtBQWxCLENBQXlCazlCLFNBQXpCLEVBRUEsS0FBS3p3RSxJQUFMLENBQVksV0FBWixDQUVBLEtBQUtpMkIsUUFBTCxDQUFjaE0sSUFBZCxDQUFvQit6QixTQUFTQyxTQUE3QixFQUNBLEtBQUtuZCxZQUFMLEdBRUEsS0FBSzcxQixNQUFMLENBQWMsWUFBQSxFQUFkLENBRUEzTSxPQUFPd0ssY0FBUCxDQUF1QixJQUF2QixDQUE2QixPQUE3QixDQUFzQyxDQUNyQ0MsSUFBSyxVQUFZO0VBR2hCO0VBQ0EsWUFBWTBuRSxTQUFMLENBQWlCdnBFLEtBQUsrZixFQUE3QixDQUVBLENBUG9DLENBUXJDdFIsSUFBSyxTQUFXNm5HLEtBQVgsQ0FBbUI7RUFHdkI7RUFDQSxLQUFLL3NDLFNBQUwsQ0FBaUIrc0MsTUFBUXQyRyxLQUFLK2YsRUFBOUIsQ0FFQSxDQWRvQyxDQUF0QyxFQWlCQSxLQUFLa2tCLFFBQUwsQ0FBa0JBLFdBQWF4bkMsU0FBZixDQUE2QnduQyxRQUE3QixDQUF3QyxDQUF4RCxDQUNBLEtBQUt0ZixLQUFMLENBQWVBLFFBQVVsb0IsU0FBWixDQUEwQmtvQixLQUExQixDQUFrQzNrQixLQUFLK2YsRUFBTCxDQUFVLENBQXpELENBQ0EsS0FBS2dxRCxRQUFMLENBQWtCQSxXQUFhdHRFLFNBQWYsQ0FBNkJzdEUsUUFBN0IsQ0FBd0MsQ0FBeEQsQ0FDQSxLQUFLNTRCLEtBQUwsQ0FBZUEsUUFBVTEwQyxTQUFaLENBQTBCMDBDLEtBQTFCLENBQWtDLENBQS9DLENBQWtEO0VBRWxELEtBQUtULE1BQUwsQ0FBYyxtQkFBQSxFQUFkLENBRUEsQ0FFRDZsRSxVQUFVbC9HLFNBQVYsQ0FBc0JELE9BQU80bkIsTUFBUCxDQUFlNW5CLE9BQU9pQixNQUFQLENBQWU2OUcsTUFBTTcrRyxTQUFyQixDQUFmLENBQWlELENBRXRFc0MsWUFBYTQ4RyxTQUZ5RCxDQUl0RXpzQyxZQUFhLElBSnlELENBTXRFL21ELEtBQU0sU0FBVzVmLE1BQVgsQ0FBb0IsQ0FFekIreUcsTUFBTTcrRyxTQUFOLENBQWdCMHJCLElBQWhCLENBQXFCaHFCLElBQXJCLENBQTJCLElBQTNCLENBQWlDb0ssTUFBakMsRUFFQSxLQUFLOGdDLFFBQUwsQ0FBZ0I5Z0MsT0FBTzhnQyxRQUF2QixDQUNBLEtBQUt0ZixLQUFMLENBQWF4aEIsT0FBT3doQixLQUFwQixDQUNBLEtBQUtvbEQsUUFBTCxDQUFnQjVtRSxPQUFPNG1FLFFBQXZCLENBQ0EsS0FBSzU0QixLQUFMLENBQWFodUMsT0FBT2d1QyxLQUFwQixDQUVBLEtBQUtwdEMsTUFBTCxDQUFjWixPQUFPWSxNQUFQLENBQWMrZSxLQUFkLEVBQWQsQ0FFQSxLQUFLNHRCLE1BQUwsQ0FBY3Z0QyxPQUFPdXRDLE1BQVAsQ0FBYzV0QixLQUFkLEVBQWQsQ0FFQSxXQUFBLENBRUEsQ0FyQnFFLENBQWpELENBQXRCLENBeUJBOztLQUtBLG1CQUFBLENBQXFCdXBCLEtBQXJCLENBQTRCazlCLFNBQTVCLENBQXVDdGxDLFFBQXZDLENBQWlEa04sS0FBakQsQ0FBeUQsQ0FFeEQra0UsTUFBTW45RyxJQUFOLENBQVksSUFBWixDQUFrQnN6QyxLQUFsQixDQUF5Qms5QixTQUF6QixFQUVBLEtBQUt6d0UsSUFBTCxDQUFZLFlBQVosQ0FFQTFCLE9BQU93SyxjQUFQLENBQXVCLElBQXZCLENBQTZCLE9BQTdCLENBQXNDLENBQ3JDQyxJQUFLLFVBQVk7RUFHaEI7RUFDQSxZQUFZMG5FLFNBQUwsQ0FBaUIsQ0FBakIsQ0FBcUJ2cEUsS0FBSytmLEVBQWpDLENBRUEsQ0FQb0MsQ0FRckN0UixJQUFLLFNBQVc2bkcsS0FBWCxDQUFtQjtFQUd2QjtFQUNBLEtBQUsvc0MsU0FBTCxDQUFpQitzQyxPQUFVLEVBQUl0MkcsS0FBSytmLEVBQW5CLENBQWpCLENBRUEsQ0Fkb0MsQ0FBdEMsRUFpQkEsS0FBS2trQixRQUFMLENBQWtCQSxXQUFheG5DLFNBQWYsQ0FBNkJ3bkMsUUFBN0IsQ0FBd0MsQ0FBeEQsQ0FDQSxLQUFLa04sS0FBTCxDQUFlQSxRQUFVMTBDLFNBQVosQ0FBMEIwMEMsS0FBMUIsQ0FBa0MsQ0FBL0MsQ0FBa0Q7RUFFbEQsS0FBS1QsTUFBTCxDQUFjLGVBQUEsQ0FBaUIscUJBQUEsQ0FBdUIsRUFBdkIsQ0FBMkIsQ0FBM0IsQ0FBOEIsR0FBOUIsQ0FBbUMsR0FBbkMsQ0FBakIsQ0FBZCxDQUVBLENBRUQ4bEUsV0FBV24vRyxTQUFYLENBQXVCRCxPQUFPNG5CLE1BQVAsQ0FBZTVuQixPQUFPaUIsTUFBUCxDQUFlNjlHLE1BQU03K0csU0FBckIsQ0FBZixDQUFpRCxDQUV2RXNDLFlBQWE2OEcsVUFGMEQsQ0FJdkVwc0MsYUFBYyxJQUp5RCxDQU12RXJuRCxLQUFNLFNBQVc1ZixNQUFYLENBQW9CLENBRXpCK3lHLE1BQU03K0csU0FBTixDQUFnQjByQixJQUFoQixDQUFxQmhxQixJQUFyQixDQUEyQixJQUEzQixDQUFpQ29LLE1BQWpDLEVBRUEsS0FBSzhnQyxRQUFMLENBQWdCOWdDLE9BQU84Z0MsUUFBdkIsQ0FDQSxLQUFLa04sS0FBTCxDQUFhaHVDLE9BQU9ndUMsS0FBcEIsQ0FFQSxLQUFLVCxNQUFMLENBQWN2dEMsT0FBT3V0QyxNQUFQLENBQWM1dEIsS0FBZCxFQUFkLENBRUEsV0FBQSxDQUVBLENBakJzRSxDQUFqRCxDQUF2QixDQXFCQTs7S0FJQSwrQkFBQSxFQUFtQyxDQUVsQ3N6RixZQUFZcjlHLElBQVosQ0FBa0IsSUFBbEIsQ0FBd0Isc0JBQUEsQ0FBd0IsQ0FBRSxDQUExQixDQUE2QixDQUE3QixDQUFnQyxDQUFoQyxDQUFtQyxDQUFFLENBQXJDLENBQXdDLEdBQXhDLENBQTZDLEdBQTdDLENBQXhCLEVBRUEsQ0FFRDA5Ryx1QkFBdUJwL0csU0FBdkIsQ0FBbUNELE9BQU80bkIsTUFBUCxDQUFlNW5CLE9BQU9pQixNQUFQLENBQWUrOUcsWUFBWS8rRyxTQUEzQixDQUFmLENBQXVELENBRXpGc0MsWUFBYTg4RyxzQkFGNEUsQ0FBdkQsQ0FBbkMsQ0FNQTs7O0tBS0EseUJBQUEsQ0FBMkJwcUUsS0FBM0IsQ0FBa0NrOUIsU0FBbEMsQ0FBOEMsQ0FFN0Myc0MsTUFBTW45RyxJQUFOLENBQVksSUFBWixDQUFrQnN6QyxLQUFsQixDQUF5Qms5QixTQUF6QixFQUVBLEtBQUt6d0UsSUFBTCxDQUFZLGtCQUFaLENBRUEsS0FBS2kyQixRQUFMLENBQWNoTSxJQUFkLENBQW9CK3pCLFNBQVNDLFNBQTdCLEVBQ0EsS0FBS25kLFlBQUwsR0FFQSxLQUFLNzFCLE1BQUwsQ0FBYyxZQUFBLEVBQWQsQ0FFQSxLQUFLMnNDLE1BQUwsQ0FBYywwQkFBQSxFQUFkLENBRUEsQ0FFRGdtRSxpQkFBaUJyL0csU0FBakIsQ0FBNkJELE9BQU80bkIsTUFBUCxDQUFlNW5CLE9BQU9pQixNQUFQLENBQWU2OUcsTUFBTTcrRyxTQUFyQixDQUFmLENBQWlELENBRTdFc0MsWUFBYSs4RyxnQkFGZ0UsQ0FJN0VqdEMsbUJBQW9CLElBSnlELENBTTdFMW1ELEtBQU0sU0FBVzVmLE1BQVgsQ0FBb0IsQ0FFekIreUcsTUFBTTcrRyxTQUFOLENBQWdCMHJCLElBQWhCLENBQXFCaHFCLElBQXJCLENBQTJCLElBQTNCLENBQWlDb0ssTUFBakMsRUFFQSxLQUFLWSxNQUFMLENBQWNaLE9BQU9ZLE1BQVAsQ0FBYytlLEtBQWQsRUFBZCxDQUVBLEtBQUs0dEIsTUFBTCxDQUFjdnRDLE9BQU91dEMsTUFBUCxDQUFjNXRCLEtBQWQsRUFBZCxDQUVBLFdBQUEsQ0FFQSxDQWhCNEUsQ0FBakQsQ0FBN0IsQ0FvQkE7O0tBSUEscUJBQUEsQ0FBdUJ1cEIsS0FBdkIsQ0FBOEJrOUIsU0FBOUIsQ0FBMEMsQ0FFekMyc0MsTUFBTW45RyxJQUFOLENBQVksSUFBWixDQUFrQnN6QyxLQUFsQixDQUF5Qms5QixTQUF6QixFQUVBLEtBQUt6d0UsSUFBTCxDQUFZLGNBQVosQ0FFQSxLQUFLdytDLFVBQUwsQ0FBa0I3NkMsU0FBbEIsQ0FFQSxDQUVEazZHLGFBQWF0L0csU0FBYixDQUF5QkQsT0FBTzRuQixNQUFQLENBQWU1bkIsT0FBT2lCLE1BQVAsQ0FBZTY5RyxNQUFNNytHLFNBQXJCLENBQWYsQ0FBaUQsQ0FFekVzQyxZQUFhZzlHLFlBRjRELENBSXpFbnRDLGVBQWdCLElBSnlELENBQWpELENBQXpCLENBUUE7O0tBSUEsc0JBQUEsQ0FBd0JuOUIsS0FBeEIsQ0FBK0JrOUIsU0FBL0IsQ0FBMENydkMsS0FBMUMsQ0FBaURDLE1BQWpELENBQTBELENBRXpEKzdFLE1BQU1uOUcsSUFBTixDQUFZLElBQVosQ0FBa0JzekMsS0FBbEIsQ0FBeUJrOUIsU0FBekIsRUFFQSxLQUFLendFLElBQUwsQ0FBWSxlQUFaLENBRUEsS0FBS29oQyxLQUFMLENBQWVBLFFBQVV6OUIsU0FBWixDQUEwQnk5QixLQUExQixDQUFrQyxFQUEvQyxDQUNBLEtBQUtDLE1BQUwsQ0FBZ0JBLFNBQVcxOUIsU0FBYixDQUEyQjA5QixNQUEzQixDQUFvQyxFQUFsRCxDQUVBLENBRUR5OEUsY0FBY3YvRyxTQUFkLENBQTBCRCxPQUFPNG5CLE1BQVAsQ0FBZTVuQixPQUFPaUIsTUFBUCxDQUFlNjlHLE1BQU03K0csU0FBckIsQ0FBZixDQUFpRCxDQUUxRXNDLFlBQWFpOUcsYUFGNkQsQ0FJMUUzc0MsZ0JBQWlCLElBSnlELENBTTFFbG5ELEtBQU0sU0FBVzVmLE1BQVgsQ0FBb0IsQ0FFekIreUcsTUFBTTcrRyxTQUFOLENBQWdCMHJCLElBQWhCLENBQXFCaHFCLElBQXJCLENBQTJCLElBQTNCLENBQWlDb0ssTUFBakMsRUFFQSxLQUFLKzJCLEtBQUwsQ0FBYS8yQixPQUFPKzJCLEtBQXBCLENBQ0EsS0FBS0MsTUFBTCxDQUFjaDNCLE9BQU9nM0IsTUFBckIsQ0FFQSxXQUFBLENBRUEsQ0FmeUUsQ0FpQjFFTixPQUFRLFNBQVdqakIsSUFBWCxDQUFrQixDQUV6QixTQUFXcy9GLE1BQU03K0csU0FBTixDQUFnQndpQyxNQUFoQixDQUF1QjlnQyxJQUF2QixDQUE2QixJQUE3QixDQUFtQzZkLElBQW5DLENBQVgsQ0FFQXBKLEtBQUs3UCxNQUFMLENBQVl1OEIsS0FBWixDQUFvQixLQUFLQSxLQUF6QixDQUNBMXNCLEtBQUs3UCxNQUFMLENBQVl3OEIsTUFBWixDQUFxQixLQUFLQSxNQUExQixDQUVBLFdBQUEsQ0FFQSxDQTFCeUUsQ0FBakQsQ0FBMUIsQ0E4QkE7Ozs7Ozs7O0tBVUEsNEJBQUEsQ0FBOEJoZ0MsSUFBOUIsQ0FBb0MwOEcsS0FBcEMsQ0FBMkN4OUcsTUFBM0MsQ0FBbUR5OUcsYUFBbkQsQ0FBbUUsQ0FFbEVDLGNBQWNoK0csSUFBZCxDQUFvQixJQUFwQixDQUEwQm9CLElBQTFCLENBQWdDMDhHLEtBQWhDLENBQXVDeDlHLE1BQXZDLENBQStDeTlHLGFBQS9DLEVBRUEsQ0FFREUsb0JBQW9CMy9HLFNBQXBCLENBQWdDRCxPQUFPNG5CLE1BQVAsQ0FBZTVuQixPQUFPaUIsTUFBUCxDQUFlMCtHLGNBQWMxL0csU0FBN0IsQ0FBZixDQUF5RCxDQUV4RnNDLFlBQWFxOUcsbUJBRjJFLENBSXhGQyxjQUFlLFFBSnlFLENBS3hGQyxnQkFBaUJqc0csS0FMdUUsQ0FPeEZrc0cscUJBQXNCQyxtQkFQa0UsQ0FTeEZDLCtCQUFnQzU2RyxTQVR3RCxDQVd4RjY2RywrQkFBZ0M3NkcsU0FYd0QsQ0FBekQsQ0FBaEMsQ0FlQTs7Ozs7Ozs7S0FVQSw2QkFBQSxDQUErQnRDLElBQS9CLENBQXFDMDhHLEtBQXJDLENBQTRDeDlHLE1BQTVDLENBQXFELENBRXBEMDlHLGNBQWNoK0csSUFBZCxDQUFvQixJQUFwQixDQUEwQm9CLElBQTFCLENBQWdDMDhHLEtBQWhDLENBQXVDeDlHLE1BQXZDLEVBRUEsQ0FFRGsrRyxxQkFBcUJsZ0gsU0FBckIsQ0FBaUNELE9BQU80bkIsTUFBUCxDQUFlNW5CLE9BQU9pQixNQUFQLENBQWUwK0csY0FBYzEvRyxTQUE3QixDQUFmLENBQXlELENBRXpGc0MsWUFBYTQ5RyxvQkFGNEUsQ0FJekZOLGNBQWUsTUFKMEUsQ0FLekZDLGdCQUFpQmpzRyxLQUx3RSxDQU96RmtzRyxxQkFBc0JDLG1CQVBtRSxDQVN6RkMsK0JBQWdDNTZHLFNBVHlELENBVXpGNjZHLCtCQUFnQzc2RyxTQUVoQztFQUNBO0VBQ0E7RUFkeUYsQ0FBekQsQ0FBakMsQ0FrQkE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0tBc0JBLG9CQUFBLENBQXNCKzZHLGtCQUF0QixDQUEwQ0MsWUFBMUMsQ0FBd0RDLFVBQXhELENBQW9FQyxZQUFwRSxDQUFtRixDQUVsRixLQUFLSCxrQkFBTCxDQUEwQkEsa0JBQTFCLENBQ0EsS0FBS0ksWUFBTCxDQUFvQixDQUFwQixDQUVBLEtBQUtELFlBQUwsQ0FBb0JBLGVBQWlCbDdHLFNBQWpCLENBQ25CazdHLFlBRG1CLENBQ0osaUJBQWlCaCtHLFdBQWpCLENBQThCKzlHLFVBQTlCLENBRGhCLENBRUEsS0FBS0QsWUFBTCxDQUFvQkEsWUFBcEIsQ0FDQSxLQUFLSSxTQUFMLENBQWlCSCxVQUFqQixDQUVBLENBRUR0Z0gsT0FBTzRuQixNQUFQLENBQWU4NEYsWUFBWXpnSCxTQUEzQixDQUFzQyxDQUVyQzBnSCxTQUFVLFNBQVc1MkYsQ0FBWCxDQUFlLENBRXhCLE9BQVMsS0FBS3EyRixrQkFBZCxDQUNDbG1ELEdBQUssS0FBS3NtRCxZQURYLENBR0NqcEQsR0FBS3FwRCxHQUFJMW1ELEVBQUosQ0FITixDQUlDNUMsR0FBS3NwRCxHQUFJMW1ELEdBQUssQ0FBVCxDQUpOLENBTUEybUQsa0JBQW1CLENBRWxCQyxLQUFNLENBRUwsU0FBQSxDQUVBQyxZQUFhO0VBR1o7RUFDQTtFQUNBO0VBQ0FDLGFBQWMsR0FBSyxFQUFJajNGLEVBQUl3dEMsRUFBUixDQUFMLENBQW9CLENBRWpDLElBQU0sYUFBZTJDLEdBQUssQ0FBMUIsR0FBaUMsQ0FFaEMsR0FBSzNDLEtBQU9seUQsU0FBWixDQUF3QixDQUV2QixHQUFLMGtCLEVBQUl1dEMsRUFBVCxDQUFjLGtCQUFBLENBRWQ7RUFFQTRDLEdBQUswbUQsR0FBR2w2RyxNQUFSLENBQ0EsS0FBSzg1RyxZQUFMLENBQW9CdG1ELEVBQXBCLENBQ0EsWUFBWSttRCxTQUFMLENBQWdCL21ELEdBQUssQ0FBckIsQ0FBd0Jud0MsQ0FBeEIsQ0FBMkJ1dEMsRUFBM0IsQ0FBUCxDQUVBLENBRUQsR0FBSzRDLEtBQU9nbkQsUUFBWixDQUF1QixNQUFPO0VBRTlCNXBELEdBQUtDLEVBQUwsQ0FDQUEsR0FBS3FwRCxHQUFJLEVBQUcxbUQsRUFBUCxDQUFMLENBRUEsR0FBS253QyxFQUFJd3RDLEVBQVQsQ0FBYztFQUdiLFVBQUEsQ0FFQSxDQUVELENBRUQ7RUFDQTkrQixNQUFRbW9GLEdBQUdsNkcsTUFBWCxDQUNBLGlCQUFBLENBRUEsQ0FFRDtFQUNBO0VBQ0EsR0FBSyxFQUFJcWpCLEdBQUt1dEMsRUFBVCxDQUFMLENBQXFCO0VBSXBCLGFBQWVzcEQsR0FBSSxDQUFKLENBQWYsQ0FFQSxHQUFLNzJGLEVBQUlvM0YsUUFBVCxDQUFvQixDQUVuQmpuRCxHQUFLLENBQUwsQ0FBUTtFQUNSNUMsR0FBSzZwRCxRQUFMLENBRUEsQ0FFRDtFQUVBLElBQU0sYUFBZWpuRCxHQUFLLENBQTFCLEdBQWlDLENBRWhDLEdBQUs1QyxLQUFPanlELFNBQVosQ0FBd0I7RUFJdkIsS0FBS203RyxZQUFMLENBQW9CLENBQXBCLENBQ0EsWUFBWVksWUFBTCxDQUFtQixDQUFuQixDQUFzQnIzRixDQUF0QixDQUF5Qnd0QyxFQUF6QixDQUFQLENBRUEsQ0FFRCxHQUFLMkMsS0FBT2duRCxRQUFaLENBQXVCLE1BQU87RUFFOUIzcEQsR0FBS0QsRUFBTCxDQUNBQSxHQUFLc3BELEdBQUksRUFBRzFtRCxFQUFILENBQVEsQ0FBWixDQUFMLENBRUEsR0FBS253QyxHQUFLdXRDLEVBQVYsQ0FBZTtFQUdkLFVBQUEsQ0FFQSxDQUVELENBRUQ7RUFDQTcrQixNQUFReWhDLEVBQVIsQ0FDQUEsR0FBSyxDQUFMLENBQ0EsaUJBQUEsQ0FFQSxDQUVEO0VBRUEsdUJBQUEsQ0FFQSxDQUFDO0VBRUY7RUFFQSxNQUFRQSxHQUFLemhDLEtBQWIsQ0FBcUIsQ0FFcEIsUUFBWXloQyxHQUFLemhDLEtBQVAsR0FBbUIsQ0FBN0IsQ0FFQSxHQUFLMU8sRUFBSTYyRixHQUFJUyxHQUFKLENBQVQsQ0FBcUIsQ0FFcEI1b0YsTUFBUTRvRixHQUFSLENBRUEsQ0FKRCxJQUlPLENBRU5ubkQsR0FBS21uRCxJQUFNLENBQVgsQ0FFQSxDQUVELENBRUQ5cEQsR0FBS3FwRCxHQUFJMW1ELEVBQUosQ0FBTCxDQUNBNUMsR0FBS3NwRCxHQUFJMW1ELEdBQUssQ0FBVCxDQUFMLENBRUE7RUFFQSxHQUFLNUMsS0FBT2p5RCxTQUFaLENBQXdCLENBRXZCLEtBQUttN0csWUFBTCxDQUFvQixDQUFwQixDQUNBLFlBQVlZLFlBQUwsQ0FBbUIsQ0FBbkIsQ0FBc0JyM0YsQ0FBdEIsQ0FBeUJ3dEMsRUFBekIsQ0FBUCxDQUVBLENBRUQsR0FBS0EsS0FBT2x5RCxTQUFaLENBQXdCLENBRXZCNjBELEdBQUswbUQsR0FBR2w2RyxNQUFSLENBQ0EsS0FBSzg1RyxZQUFMLENBQW9CdG1ELEVBQXBCLENBQ0EsWUFBWSttRCxTQUFMLENBQWdCL21ELEdBQUssQ0FBckIsQ0FBd0I1QyxFQUF4QixDQUE0QnZ0QyxDQUE1QixDQUFQLENBRUEsQ0FFRCxDQUFDO0VBRUYsS0FBS3kyRixZQUFMLENBQW9CdG1ELEVBQXBCLENBRUEsS0FBS29uRCxnQkFBTCxDQUF1QnBuRCxFQUF2QixDQUEyQjVDLEVBQTNCLENBQStCQyxFQUEvQixFQUVBLENBQUM7RUFFRixZQUFZZ3FELFlBQUwsQ0FBbUJybkQsRUFBbkIsQ0FBdUI1QyxFQUF2QixDQUEyQnZ0QyxDQUEzQixDQUE4Qnd0QyxFQUE5QixDQUFQLENBRUEsQ0FqS29DLENBbUtyQ2lxRCxTQUFVLElBbksyQjtFQW9LckM7RUFFQTtFQUVBQyxpQkFBa0IsRUF4S21CLENBMEtyQ0MsYUFBYyxVQUFZLENBRXpCLFlBQVlGLFFBQUwsRUFBaUIsS0FBS0MsZ0JBQTdCLENBRUEsQ0E5S29DLENBZ0xyQ0UsaUJBQWtCLFNBQVdoMEcsS0FBWCxDQUFtQjtFQUlwQyxXQUFhLEtBQUs0eUcsWUFBbEIsQ0FDQ3QrRyxPQUFTLEtBQUtvK0csWUFEZixDQUVDenBCLE9BQVMsS0FBSzZwQixTQUZmLENBR0NweUYsT0FBUzFnQixNQUFRaXBGLE1BSGxCLENBS0EsSUFBTSxNQUFRLENBQWQsQ0FBaUI3dkYsSUFBTTZ2RixNQUF2QixDQUErQixFQUFHN3ZGLENBQWxDLENBQXNDLENBRXJDdEQsT0FBUXNELENBQVIsRUFBYzlFLE9BQVFvc0IsT0FBU3RuQixDQUFqQixDQUFkLENBRUEsQ0FFRCxhQUFBLENBRUEsQ0FqTW9DO0VBcU1yQ3c2RyxhQUFjLDZCQUFpQyxDQUU5QyxlQUFNLENBQVcseUJBQVgsQ0FBTixDQUNBO0VBRUEsQ0ExTW9DLENBNE1yQ0QsaUJBQWtCLDBCQUE4QjtFQUkvQyxDQWhOb0MsQ0FBdEMsRUFvTkE7RUFDQXRoSCxPQUFPNG5CLE1BQVAsQ0FBZTg0RixZQUFZemdILFNBQTNCLENBQXNDO0VBR3JDbWhILGFBQWNWLFlBQVl6Z0gsU0FBWixDQUFzQjBoSCxnQkFIQztFQU1yQ1YsVUFBV1AsWUFBWXpnSCxTQUFaLENBQXNCMGhILGdCQU5JLENBQXRDLEVBVUE7Ozs7S0FNQSxvQ0FBQSxDQUFzQ3ZCLGtCQUF0QyxDQUEwREMsWUFBMUQsQ0FBd0VDLFVBQXhFLENBQW9GQyxZQUFwRixDQUFtRyxDQUVsR0csWUFBWS8rRyxJQUFaLENBQWtCLElBQWxCLENBQXdCeStHLGtCQUF4QixDQUE0Q0MsWUFBNUMsQ0FBMERDLFVBQTFELENBQXNFQyxZQUF0RSxFQUVBLENBRURxQiw0QkFBNEIzaEgsU0FBNUIsQ0FBd0NELE9BQU80bkIsTUFBUCxDQUFlNW5CLE9BQU9pQixNQUFQLENBQWV5L0csWUFBWXpnSCxTQUEzQixDQUFmLENBQXVELENBRTlGc0MsWUFBYXEvRywyQkFGaUYsQ0FJOUZMLGFBQWMsU0FBV3JuRCxFQUFYLENBQWU1QyxFQUFmLENBQW1CdnRDLENBQW5CLENBQXNCd3RDLEVBQXRCLENBQTJCLENBRXhDLFdBQWEsS0FBS2dwRCxZQUFsQixDQUNDdCtHLE9BQVMsS0FBS28rRyxZQURmLENBRUN6cEIsT0FBUyxLQUFLNnBCLFNBRmYsQ0FJQ3B5RixPQUFTNnJDLEdBQUswOEIsTUFKZixDQU1DN29FLE1BQVEsQ0FBRWhFLEVBQUl1dEMsRUFBTixHQUFlQyxHQUFLRCxFQUFwQixDQU5ULENBUUEsSUFBTSxRQUFVanBDLE9BQVN1b0UsTUFBekIsQ0FBaUN2b0UsU0FBV29jLEdBQTVDLENBQWlEcGMsUUFBVSxDQUEzRCxDQUErRCxDQUU5RDJLLFdBQVdLLFNBQVgsQ0FBc0I1MUIsTUFBdEIsQ0FBOEIsQ0FBOUIsQ0FBaUN4QixNQUFqQyxDQUF5Q29zQixPQUFTdW9FLE1BQWxELENBQTBEMzBGLE1BQTFELENBQWtFb3NCLE1BQWxFLENBQTBFTixLQUExRSxFQUVBLENBRUQsYUFBQSxDQUVBLENBdEI2RixDQUF2RCxDQUF4QyxDQTBCQTs7Ozs7OztLQVNBLGdDQUFBLENBQWtDaHJCLElBQWxDLENBQXdDMDhHLEtBQXhDLENBQStDeDlHLE1BQS9DLENBQXVEeTlHLGFBQXZELENBQXVFLENBRXRFQyxjQUFjaCtHLElBQWQsQ0FBb0IsSUFBcEIsQ0FBMEJvQixJQUExQixDQUFnQzA4RyxLQUFoQyxDQUF1Q3g5RyxNQUF2QyxDQUErQ3k5RyxhQUEvQyxFQUVBLENBRURtQyx3QkFBd0I1aEgsU0FBeEIsQ0FBb0NELE9BQU80bkIsTUFBUCxDQUFlNW5CLE9BQU9pQixNQUFQLENBQWUwK0csY0FBYzEvRyxTQUE3QixDQUFmLENBQXlELENBRTVGc0MsWUFBYXMvRyx1QkFGK0UsQ0FJNUZoQyxjQUFlLFlBSjZFO0VBUTVGRSxxQkFBc0IrQixpQkFSc0UsQ0FVNUY3QiwrQkFBZ0MsU0FBV3g4RyxNQUFYLENBQW9CLENBRW5ELHNDQUFPLENBQWlDLEtBQUtnOEcsS0FBdEMsQ0FBNkMsS0FBS3g5RyxNQUFsRCxDQUEwRCxLQUFLOC9HLFlBQUwsRUFBMUQsQ0FBK0V0K0csTUFBL0UsQ0FBUCxDQUVBLENBZDJGLENBZ0I1Rnk4RywrQkFBZ0M3NkcsU0FBVTtFQWhCa0QsQ0FBekQsQ0FBcEMsQ0FvQkE7Ozs7Ozs7O0tBVUEsMkJBQUEsQ0FBNkJ0QyxJQUE3QixDQUFtQzA4RyxLQUFuQyxDQUEwQ3g5RyxNQUExQyxDQUFrRHk5RyxhQUFsRCxDQUFrRSxDQUVqRUMsY0FBY2grRyxJQUFkLENBQW9CLElBQXBCLENBQTBCb0IsSUFBMUIsQ0FBZ0MwOEcsS0FBaEMsQ0FBdUN4OUcsTUFBdkMsQ0FBK0N5OUcsYUFBL0MsRUFFQSxDQUVEc0MsbUJBQW1CL2hILFNBQW5CLENBQStCRCxPQUFPNG5CLE1BQVAsQ0FBZTVuQixPQUFPaUIsTUFBUCxDQUFlMCtHLGNBQWMxL0csU0FBN0IsQ0FBZixDQUF5RCxDQUV2RnNDLFlBQWF5L0csa0JBRjBFLENBSXZGbkMsY0FBZSxPQUVmO0VBRUE7RUFFQTtFQUNBO0VBWHVGLENBQXpELENBQS9CLENBZUE7Ozs7Ozs7S0FTQSw0QkFBQSxDQUE4Qjk4RyxJQUE5QixDQUFvQzA4RyxLQUFwQyxDQUEyQ3g5RyxNQUEzQyxDQUFtRHk5RyxhQUFuRCxDQUFtRSxDQUVsRUMsY0FBY2grRyxJQUFkLENBQW9CLElBQXBCLENBQTBCb0IsSUFBMUIsQ0FBZ0MwOEcsS0FBaEMsQ0FBdUN4OUcsTUFBdkMsQ0FBK0N5OUcsYUFBL0MsRUFFQSxDQUVEdUMsb0JBQW9CaGlILFNBQXBCLENBQWdDRCxPQUFPNG5CLE1BQVAsQ0FBZTVuQixPQUFPaUIsTUFBUCxDQUFlMCtHLGNBQWMxL0csU0FBN0IsQ0FBZixDQUF5RCxDQUV4RnNDLFlBQWEwL0csbUJBRjJFLENBSXhGcEMsY0FBZSxRQUVmO0VBRUE7RUFSd0YsQ0FBekQsQ0FBaEMsQ0FZQTs7Ozs7Ozs7S0FVQSx5QkFBQSxDQUEyQk8sa0JBQTNCLENBQStDQyxZQUEvQyxDQUE2REMsVUFBN0QsQ0FBeUVDLFlBQXpFLENBQXdGLENBRXZGRyxZQUFZLytHLElBQVosQ0FBa0IsSUFBbEIsQ0FBd0J5K0csa0JBQXhCLENBQTRDQyxZQUE1QyxDQUEwREMsVUFBMUQsQ0FBc0VDLFlBQXRFLEVBRUEsS0FBSzJCLFdBQUwsQ0FBbUIsQ0FBRSxDQUFyQixDQUNBLEtBQUtDLFdBQUwsQ0FBbUIsQ0FBRSxDQUFyQixDQUNBLEtBQUtDLFdBQUwsQ0FBbUIsQ0FBRSxDQUFyQixDQUNBLEtBQUtDLFdBQUwsQ0FBbUIsQ0FBRSxDQUFyQixDQUVBLENBRURDLGlCQUFpQnJpSCxTQUFqQixDQUE2QkQsT0FBTzRuQixNQUFQLENBQWU1bkIsT0FBT2lCLE1BQVAsQ0FBZXkvRyxZQUFZemdILFNBQTNCLENBQWYsQ0FBdUQsQ0FFbkZzQyxZQUFhKy9HLGdCQUZzRSxDQUluRmIsaUJBQWtCLENBRWpCYyxZQUFhQyxtQkFGSSxDQUdqQkMsVUFBV0QsbUJBSE0sQ0FKaUUsQ0FXbkZsQixpQkFBa0IsU0FBV3BuRCxFQUFYLENBQWU1QyxFQUFmLENBQW1CQyxFQUFuQixDQUF3QixDQUV6QyxPQUFTLEtBQUs2b0Qsa0JBQWQsQ0FDQ3NDLE1BQVF4b0QsR0FBSyxDQURkLENBRUN5b0QsTUFBUXpvRCxHQUFLLENBRmQsQ0FJQzBvRCxNQUFRaEMsR0FBSThCLEtBQUosQ0FKVCxDQUtDRyxNQUFRakMsR0FBSStCLEtBQUosQ0FMVCxDQU9BLEdBQUtDLFFBQVV2OUcsU0FBZixDQUEyQixDQUUxQixPQUFTLEtBQUtxOEcsWUFBTCxHQUFvQmEsV0FBN0IsRUFFQyxvQkFBQTtFQUdDRyxNQUFReG9ELEVBQVIsQ0FDQTBvRCxNQUFRLEVBQUl0ckQsRUFBSixDQUFTQyxFQUFqQixDQUVBLE1BRUQscUJBQUE7RUFHQ21yRCxNQUFROUIsR0FBR2w2RyxNQUFILENBQVksQ0FBcEIsQ0FDQWs4RyxNQUFRdHJELEdBQUtzcEQsR0FBSThCLEtBQUosQ0FBTCxDQUFtQjlCLEdBQUk4QixNQUFRLENBQVosQ0FBM0IsQ0FFQSxNQUVEO0VBRUM7RUFDQUEsTUFBUXhvRCxFQUFSLENBQ0Ewb0QsTUFBUXJyRCxFQUFSLENBdEJGLENBMEJBLENBRUQsR0FBS3NyRCxRQUFVeDlHLFNBQWYsQ0FBMkIsQ0FFMUIsT0FBUyxLQUFLcThHLFlBQUwsR0FBb0JlLFNBQTdCLEVBRUMsb0JBQUE7RUFHQ0UsTUFBUXpvRCxFQUFSLENBQ0Eyb0QsTUFBUSxFQUFJdHJELEVBQUosQ0FBU0QsRUFBakIsQ0FFQSxNQUVELHFCQUFBO0VBR0NxckQsTUFBUSxDQUFSLENBQ0FFLE1BQVF0ckQsR0FBS3FwRCxHQUFJLENBQUosQ0FBTCxDQUFlQSxHQUFJLENBQUosQ0FBdkIsQ0FFQSxNQUVEO0VBRUM7RUFDQStCLE1BQVF6b0QsR0FBSyxDQUFiLENBQ0Eyb0QsTUFBUXZyRCxFQUFSLENBdEJGLENBMEJBLENBRUQsV0FBYSxDQUFFQyxHQUFLRCxFQUFQLEVBQWMsR0FBM0IsQ0FDQ3MvQixPQUFTLEtBQUs2cEIsU0FEZixDQUdBLEtBQUt5QixXQUFMLENBQW1CWSxRQUFXeHJELEdBQUtzckQsS0FBaEIsQ0FBbkIsQ0FDQSxLQUFLUixXQUFMLENBQW1CVSxRQUFXRCxNQUFRdHJELEVBQW5CLENBQW5CLENBQ0EsS0FBSzRxRCxXQUFMLENBQW1CTyxNQUFROXJCLE1BQTNCLENBQ0EsS0FBS3lyQixXQUFMLENBQW1CTSxNQUFRL3JCLE1BQTNCLENBRUEsQ0F4RmtGLENBMEZuRjJxQixhQUFjLFNBQVdybkQsRUFBWCxDQUFlNUMsRUFBZixDQUFtQnZ0QyxDQUFuQixDQUFzQnd0QyxFQUF0QixDQUEyQixDQUV4QyxXQUFhLEtBQUtncEQsWUFBbEIsQ0FDQ3QrRyxPQUFTLEtBQUtvK0csWUFEZixDQUVDenBCLE9BQVMsS0FBSzZwQixTQUZmLENBSUNzQyxHQUFLN29ELEdBQUswOEIsTUFKWCxDQUlvQm9zQixHQUFLRCxHQUFLbnNCLE1BSjlCLENBS0Nxc0IsR0FBSyxLQUFLZCxXQUxYLENBS3lCZSxHQUFLLEtBQUtiLFdBTG5DLENBTUNjLEdBQUssS0FBS2pCLFdBTlgsQ0FNd0JrQixHQUFLLEtBQUtoQixXQU5sQyxDQVFDeDlGLEVBQUksQ0FBRW1GLEVBQUl1dEMsRUFBTixHQUFlQyxHQUFLRCxFQUFwQixDQVJMLENBU0NzcEQsR0FBS2g4RixFQUFJQSxDQVRWLENBVUN5K0YsSUFBTXpDLEdBQUtoOEYsQ0FWWixDQVlBO0VBRUEsT0FBUyxDQUFFdStGLEVBQUYsQ0FBT0UsR0FBUCxDQUFhLEVBQUlGLEVBQUosQ0FBU3ZDLEVBQXRCLENBQTJCdUMsR0FBS3YrRixDQUF6QyxDQUNBLE9BQVMsQ0FBRSxFQUFJdStGLEVBQU4sRUFBYUUsR0FBYixDQUFtQixDQUFFLENBQUUsR0FBRixDQUFRLEVBQUlGLEVBQWQsRUFBcUJ2QyxFQUF4QyxDQUE2QyxDQUFFLENBQUUsR0FBRixDQUFRdUMsRUFBVixFQUFpQnYrRixDQUE5RCxDQUFrRSxDQUEzRSxDQUNBLE9BQVMsQ0FBRSxDQUFFLENBQUYsQ0FBTXcrRixFQUFSLEVBQWVDLEdBQWYsQ0FBcUIsQ0FBRSxJQUFNRCxFQUFSLEVBQWV4QyxFQUFwQyxDQUF5QyxJQUFNaDhGLENBQXhELENBQ0EsT0FBU3crRixHQUFLQyxHQUFMLENBQVdELEdBQUt4QyxFQUF6QixDQUVBO0VBRUEsSUFBTSxNQUFRLENBQWQsQ0FBaUI3NUcsSUFBTTZ2RixNQUF2QixDQUErQixFQUFHN3ZGLENBQWxDLENBQXNDLENBRXJDdEQsT0FBUXNELENBQVIsRUFDRXU4RyxHQUFLcmhILE9BQVFnaEgsR0FBS2w4RyxDQUFiLENBQUwsQ0FDQSt2RCxHQUFLNzBELE9BQVErZ0gsR0FBS2o4RyxDQUFiLENBREwsQ0FFQTR6QixHQUFLMTRCLE9BQVE4Z0gsR0FBS2g4RyxDQUFiLENBRkwsQ0FHQXc4RyxHQUFLdGhILE9BQVFpaEgsR0FBS244RyxDQUFiLENBSlAsQ0FNQSxDQUVELGFBQUEsQ0FFQSxDQTdIa0YsQ0FBdkQsQ0FBN0IsQ0FpSUE7O0tBSUEsMEJBQUEsQ0FBNEJxNUcsa0JBQTVCLENBQWdEQyxZQUFoRCxDQUE4REMsVUFBOUQsQ0FBMEVDLFlBQTFFLENBQXlGLENBRXhGRyxZQUFZLytHLElBQVosQ0FBa0IsSUFBbEIsQ0FBd0J5K0csa0JBQXhCLENBQTRDQyxZQUE1QyxDQUEwREMsVUFBMUQsQ0FBc0VDLFlBQXRFLEVBRUEsQ0FFRGlELGtCQUFrQnZqSCxTQUFsQixDQUE4QkQsT0FBTzRuQixNQUFQLENBQWU1bkIsT0FBT2lCLE1BQVAsQ0FBZXkvRyxZQUFZemdILFNBQTNCLENBQWYsQ0FBdUQsQ0FFcEZzQyxZQUFhaWhILGlCQUZ1RSxDQUlwRmpDLGFBQWMsU0FBV3JuRCxFQUFYLENBQWU1QyxFQUFmLENBQW1CdnRDLENBQW5CLENBQXNCd3RDLEVBQXRCLENBQTJCLENBRXhDLFdBQWEsS0FBS2dwRCxZQUFsQixDQUNDdCtHLE9BQVMsS0FBS28rRyxZQURmLENBRUN6cEIsT0FBUyxLQUFLNnBCLFNBRmYsQ0FJQ2dELFFBQVV2cEQsR0FBSzA4QixNQUpoQixDQUtDOHNCLFFBQVVELFFBQVU3c0IsTUFMckIsQ0FPQytzQixRQUFVLENBQUU1NUYsRUFBSXV0QyxFQUFOLEdBQWVDLEdBQUtELEVBQXBCLENBUFgsQ0FRQ3NzRCxRQUFVLEVBQUlELE9BUmYsQ0FVQSxJQUFNLE1BQVEsQ0FBZCxDQUFpQjU4RyxJQUFNNnZGLE1BQXZCLENBQStCLEVBQUc3dkYsQ0FBbEMsQ0FBc0MsQ0FFckN0RCxPQUFRc0QsQ0FBUixFQUNFOUUsT0FBUXloSCxRQUFVMzhHLENBQWxCLEVBQXdCNjhHLE9BQXhCLENBQ0EzaEgsT0FBUXdoSCxRQUFVMThHLENBQWxCLEVBQXdCNDhHLE9BRjFCLENBSUEsQ0FFRCxhQUFBLENBRUEsQ0ExQm1GLENBQXZELENBQTlCLENBOEJBOzs7Ozs7S0FRQSw0QkFBQSxDQUE4QnZELGtCQUE5QixDQUFrREMsWUFBbEQsQ0FBZ0VDLFVBQWhFLENBQTRFQyxZQUE1RSxDQUEyRixDQUUxRkcsWUFBWS8rRyxJQUFaLENBQWtCLElBQWxCLENBQXdCeStHLGtCQUF4QixDQUE0Q0MsWUFBNUMsQ0FBMERDLFVBQTFELENBQXNFQyxZQUF0RSxFQUVBLENBRURzRCxvQkFBb0I1akgsU0FBcEIsQ0FBZ0NELE9BQU80bkIsTUFBUCxDQUFlNW5CLE9BQU9pQixNQUFQLENBQWV5L0csWUFBWXpnSCxTQUEzQixDQUFmLENBQXVELENBRXRGc0MsWUFBYXNoSCxtQkFGeUUsQ0FJdEZ0QyxhQUFjLFNBQVdybkQsRUFBRyxpQkFBbUIsQ0FFOUMsWUFBWXluRCxnQkFBTCxDQUF1QnpuRCxHQUFLLENBQTVCLENBQVAsQ0FFQSxDQVJxRixDQUF2RCxDQUFoQyxDQVlBOzs7O0tBTUEsbUJBQXFCO0VBR3BCNHBELFdBQVksU0FBV2g5RixLQUFYLENBQWtCaTlGLElBQWxCLENBQXdCQyxFQUF4QixDQUE2QixDQUV4QyxHQUFLQyxlQUFlQyxZQUFmLENBQTZCcDlGLEtBQTdCLENBQUwsQ0FBNEM7RUFHM0M7RUFDQSxpQkFBaUJ2a0IsV0FBVixDQUF1QnVrQixNQUFNbTNCLFFBQU4sQ0FBZ0I4bEUsSUFBaEIsQ0FBc0JDLEtBQU8zK0csU0FBUCxDQUFtQjIrRyxFQUFuQixDQUF3Qmw5RixNQUFNcGdCLE1BQXBELENBQXZCLENBQVAsQ0FFQSxDQUVELGFBQWFZLEtBQU4sQ0FBYXk4RyxJQUFiLENBQW1CQyxFQUFuQixDQUFQLENBRUEsQ0FmbUI7RUFrQnBCRyxhQUFjLFNBQVdyOUYsS0FBWCxDQUFrQnBsQixJQUFsQixDQUF3QjBpSCxVQUF4QixDQUFxQyxDQUVsRCxHQUFLLENBQUV0OUYsS0FBRjtFQUNILENBQUVzOUYsVUFBRixFQUFnQnQ5RixNQUFNdmtCLFdBQU4sR0FBc0JiLElBRHhDLENBQytDLFlBQUEsQ0FFL0MsR0FBSyxZQUFZbzhDLGlCQUFaLEdBQWtDLFFBQXZDLENBQWtELENBRWpELGVBQU8sQ0FBVWgzQixLQUFWLENBQVAsQ0FBMEI7RUFFMUIsQ0FFRCxhQUFhN21CLFNBQU4sQ0FBZ0JxSCxLQUFoQixDQUFzQjNGLElBQXRCLENBQTRCbWxCLEtBQTVCLENBQVAsQ0FBNEM7RUFFNUMsQ0EvQm1CLENBaUNwQm85RixhQUFjLFNBQVczOUcsTUFBWCxDQUFvQixDQUVqQyxtQkFBbUI4OUcsTUFBWixDQUFvQjk5RyxNQUFwQixHQUNMLEVBQUlBLDBCQUFKLENBREYsQ0FHQSxDQXRDbUI7RUF5Q3BCKzlHLGlCQUFrQixTQUFXN0UsS0FBWCxDQUFtQixDQUVwQyxvQkFBQSxDQUFzQjE0RyxDQUF0QixDQUF5QjRiLENBQXpCLENBQTZCLENBRTVCLGFBQWM1YixDQUFQLEVBQWEwNEcsTUFBTzk4RixDQUFQLENBQXBCLENBRUEsQ0FFRCxNQUFRODhGLE1BQU0vNEcsTUFBZCxDQUNBLFdBQWEsU0FBQSxDQUFXNGlCLENBQVgsQ0FBYixDQUNBLElBQU0sTUFBUSxDQUFkLENBQWlCdmlCLElBQU11aUIsQ0FBdkIsQ0FBMEIsRUFBR3ZpQixDQUE3QixDQUFpQ3RELE9BQVFzRCxDQUFSLEVBQWNBLENBQWQsQ0FFakN0RCxPQUFPb21ELElBQVAsQ0FBYTA2RCxXQUFiLEVBRUEsYUFBQSxDQUVBLENBekRtQjtFQTREcEJDLFlBQWEsU0FBV3ZpSCxNQUFYLENBQW1CMjBGLE1BQW5CLENBQTJCeGxFLEtBQTNCLENBQW1DLENBRS9DLFlBQWNudkIsT0FBT3lFLE1BQXJCLENBQ0EsV0FBYSxXQUFXbkUsV0FBWCxDQUF3QmtpSCxPQUF4QixDQUFiLENBRUEsSUFBTSxNQUFRLENBQVIsQ0FBV2xyRixVQUFZLENBQTdCLENBQWdDQSxZQUFja3JGLE9BQTlDLENBQXVELEVBQUcxOUcsQ0FBMUQsQ0FBOEQsQ0FFN0QsY0FBZ0JxcUIsTUFBT3JxQixDQUFQLEVBQWE2dkYsTUFBN0IsQ0FFQSxJQUFNLE1BQVEsQ0FBZCxDQUFpQmowRSxJQUFNaTBFLE1BQXZCLENBQStCLEVBQUdqMEUsQ0FBbEMsQ0FBc0MsQ0FFckNsZixPQUFRODFCLFdBQVIsRUFBeUJ0M0IsT0FBUXlpSCxVQUFZL2hHLENBQXBCLENBQXpCLENBRUEsQ0FFRCxDQUVELGFBQUEsQ0FFQSxDQS9FbUI7RUFrRnBCZ2lHLFlBQWEsU0FBV0MsUUFBWCxDQUFxQm5GLEtBQXJCLENBQTRCeDlHLE1BQTVCLENBQW9DNGlILGlCQUFwQyxDQUF3RCxDQUVwRSxNQUFRLENBQVIsQ0FBV3IrRyxJQUFNbytHLFNBQVUsQ0FBVixDQUFqQixDQUVBLE1BQVFwK0csTUFBUW5CLFNBQVIsRUFBcUJtQixJQUFLcStHLGlCQUFMLElBQTZCeC9HLFNBQTFELENBQXNFLENBRXJFbUIsSUFBTW8rRyxTQUFVNzlHLEdBQVYsQ0FBTixDQUVBLENBRUQsR0FBS1AsTUFBUW5CLFNBQWIsQ0FBeUIsT0FBUTtFQUVqQyxVQUFZbUIsSUFBS3ErRyxpQkFBTCxDQUFaLENBQ0EsR0FBS25oSCxRQUFVMkIsU0FBZixDQUEyQixPQUFRO0VBRW5DLEdBQUt3TyxNQUFNeU0sT0FBTixDQUFlNWMsS0FBZixDQUFMLENBQThCLENBRTdCLEVBQUcsQ0FFRkEsTUFBUThDLElBQUtxK0csaUJBQUwsQ0FBUixDQUVBLEdBQUtuaEgsUUFBVTJCLFNBQWYsQ0FBMkIsQ0FFMUJvNkcsTUFBTXY1RyxJQUFOLENBQVlNLElBQUlveEYsSUFBaEIsRUFDQTMxRixPQUFPaUUsSUFBUCxDQUFZaUUsS0FBWixDQUFtQmxJLE1BQW5CLENBQTJCeUIsS0FBM0IsRUFBb0M7RUFFcEMsQ0FFRDhDLElBQU1vK0csU0FBVTc5RyxHQUFWLENBQU4sQ0FFQSxDQWJELE1BYVVQLE1BQVFuQixTQWJsQixFQWVBLENBakJELFFBaUJZM0IsTUFBTTRxQixPQUFOLEdBQWtCanBCLFNBQXZCLENBQW1DO0VBSXpDLEVBQUcsQ0FFRjNCLE1BQVE4QyxJQUFLcStHLGlCQUFMLENBQVIsQ0FFQSxHQUFLbmhILFFBQVUyQixTQUFmLENBQTJCLENBRTFCbzZHLE1BQU12NUcsSUFBTixDQUFZTSxJQUFJb3hGLElBQWhCLEVBQ0FsMEYsTUFBTTRxQixPQUFOLENBQWVyc0IsTUFBZixDQUF1QkEsT0FBT3lFLE1BQTlCLEVBRUEsQ0FFREYsSUFBTW8rRyxTQUFVNzlHLEdBQVYsQ0FBTixDQUVBLENBYkQsTUFhVVAsTUFBUW5CLFNBYmxCLEVBZUEsQ0FuQk0sSUFtQkE7RUFJTixFQUFHLENBRUYzQixNQUFROEMsSUFBS3ErRyxpQkFBTCxDQUFSLENBRUEsR0FBS25oSCxRQUFVMkIsU0FBZixDQUEyQixDQUUxQm82RyxNQUFNdjVHLElBQU4sQ0FBWU0sSUFBSW94RixJQUFoQixFQUNBMzFGLE9BQU9pRSxJQUFQLENBQWF4QyxLQUFiLEVBRUEsQ0FFRDhDLElBQU1vK0csU0FBVTc5RyxHQUFWLENBQU4sQ0FFQSxDQWJELE1BYVVQLE1BQVFuQixTQWJsQixFQWVBLENBRUQsQ0ExSm1CLENBQXJCLENBOEpBOzs7Ozs7OztLQVVBLHNCQUFBLENBQXdCdEMsSUFBeEIsQ0FBOEIwOEcsS0FBOUIsQ0FBcUN4OUcsTUFBckMsQ0FBNkN5OUcsYUFBN0MsQ0FBNkQsQ0FFNUQsR0FBSzM4RyxPQUFTc0MsU0FBZCxDQUEwQixlQUFNLENBQVcsOENBQVgsQ0FBTixDQUMxQixHQUFLbzZHLFFBQVVwNkcsU0FBVixFQUF1Qm82RyxNQUFNLzRHLE1BQU4sR0FBaUIsQ0FBN0MsQ0FBaUQsZUFBTSxDQUFXLG9EQUFzRDNELElBQWpFLENBQU4sQ0FFakQsS0FBS0EsSUFBTCxDQUFZQSxJQUFaLENBRUEsS0FBSzA4RyxLQUFMLENBQWF3RSxlQUFlRSxZQUFmLENBQTZCMUUsS0FBN0IsQ0FBb0MsS0FBS3FGLGNBQXpDLENBQWIsQ0FDQSxLQUFLN2lILE1BQUwsQ0FBY2dpSCxlQUFlRSxZQUFmLENBQTZCbGlILE1BQTdCLENBQXFDLEtBQUs2OUcsZUFBMUMsQ0FBZCxDQUVBLEtBQUtpRixnQkFBTCxDQUF1QnJGLGVBQWlCLEtBQUtLLG9CQUE3QyxFQUVBLEtBQUtpRixRQUFMLEdBQ0EsS0FBS0MsUUFBTCxHQUVBLENBRUQ7RUFFQWpsSCxPQUFPNG5CLE1BQVAsQ0FBZSszRixhQUFmLENBQThCO0VBRzdCO0VBRUF0OEQsTUFBTyxTQUFXNjFELElBQVgsQ0FBa0IsQ0FFeEIsR0FBS0EsS0FBS3gzRyxJQUFMLEdBQWMyRCxTQUFuQixDQUErQixDQUU5QixlQUFNLENBQVcsMERBQVgsQ0FBTixDQUVBLENBRUQsY0FBZ0JzNkcsY0FBY3VGLDZCQUFkLENBQTZDaE0sS0FBS3gzRyxJQUFsRCxDQUFoQixDQUVBLEdBQUt3M0csS0FBS3VHLEtBQUwsR0FBZXA2RyxTQUFwQixDQUFnQyxDQUUvQixVQUFZLEVBQVosQ0FBZ0JwRCxPQUFTLEVBQXpCLENBRUFnaUgsZUFBZVUsV0FBZixDQUE0QnpMLEtBQUs1eUcsSUFBakMsQ0FBdUNtNUcsS0FBdkMsQ0FBOEN4OUcsTUFBOUMsQ0FBc0QsT0FBdEQsRUFFQWkzRyxLQUFLdUcsS0FBTCxDQUFhQSxLQUFiLENBQ0F2RyxLQUFLajNHLE1BQUwsQ0FBY0EsTUFBZCxDQUVBLENBRUQ7RUFDQSxHQUFLa2pILFVBQVU5aEUsS0FBVixHQUFvQmgrQyxTQUF6QixDQUFxQyxDQUVwQyxpQkFBaUJnK0MsS0FBVixDQUFpQjYxRCxJQUFqQixDQUFQLENBRUEsQ0FKRCxJQUlPO0VBR04sb0JBQU8sQ0FBZUEsS0FBS24yRyxJQUFwQixDQUEwQm0yRyxLQUFLdUcsS0FBL0IsQ0FBc0N2RyxLQUFLajNHLE1BQTNDLENBQW1EaTNHLEtBQUt3RyxhQUF4RCxDQUFQLENBRUEsQ0FFRCxDQXRDNEIsQ0F3QzdCajlFLE9BQVEsU0FBVzJpRixLQUFYLENBQW1CLENBRTFCLGNBQWdCQSxNQUFNN2lILFdBQXRCLENBRUEsUUFBQSxDQUVBO0VBQ0EsR0FBSzRpSCxVQUFVMWlGLE1BQVYsR0FBcUJwOUIsU0FBMUIsQ0FBc0MsQ0FFckM2ekcsS0FBT2lNLFVBQVUxaUYsTUFBVixDQUFrQjJpRixLQUFsQixDQUFQLENBRUEsQ0FKRCxJQUlPO0VBR05sTSxLQUFPLENBRU4sT0FBUWtNLE1BQU1yaUgsSUFGUixDQUdOLFFBQVNraEgsZUFBZUUsWUFBZixDQUE2QmlCLE1BQU0zRixLQUFuQyxDQUEwQzVyRyxLQUExQyxDQUhILENBSU4sU0FBVW93RyxlQUFlRSxZQUFmLENBQTZCaUIsTUFBTW5qSCxNQUFuQyxDQUEyQzRSLEtBQTNDLENBSkosQ0FBUCxDQVFBLGtCQUFvQnV4RyxNQUFNQyxnQkFBTixFQUFwQixDQUVBLEdBQUszRixnQkFBa0IwRixNQUFNckYsb0JBQTdCLENBQW9ELENBRW5EN0csS0FBS3dHLGFBQUwsQ0FBcUJBLGFBQXJCLENBRUEsQ0FFRCxDQUVEeEcsS0FBS3gzRyxJQUFMLENBQVkwakgsTUFBTXZGLGFBQWxCLENBQWlDO0VBRWpDLFdBQUEsQ0FFQSxDQTVFNEIsQ0E4RTdCcUYsOEJBQStCLFNBQVdJLFFBQVgsQ0FBc0IsQ0FFcEQsT0FBU0EsU0FBU3RRLFdBQVQsRUFBVCxFQUVDLElBQUssUUFBTCxDQUNBLElBQUssUUFBTCxDQUNBLElBQUssT0FBTCxDQUNBLElBQUssUUFBTCxDQUNBLElBQUssU0FBTCxDQUVDLDBCQUFBLENBRUQsSUFBSyxRQUFMLENBQ0EsSUFBSyxTQUFMLENBQ0EsSUFBSyxTQUFMLENBQ0EsSUFBSyxTQUFMLENBRUMsMEJBQUEsQ0FFRCxJQUFLLE9BQUwsQ0FFQyx5QkFBQSxDQUVELElBQUssWUFBTCxDQUVDLDhCQUFBLENBRUQsSUFBSyxNQUFMLENBQ0EsSUFBSyxTQUFMLENBRUMsMkJBQUEsQ0FFRCxJQUFLLFFBQUwsQ0FFQywwQkFBQSxDQWhDRixDQW9DQSxlQUFNLENBQVcsOENBQWdEc1EsUUFBM0QsQ0FBTixDQUVBLENBdEg0QixDQUE5QixFQTBIQXRsSCxPQUFPNG5CLE1BQVAsQ0FBZSszRixjQUFjMS9HLFNBQTdCLENBQXdDLENBRXZDc0MsWUFBYW85RyxhQUYwQixDQUl2Q21GLGVBQWdCUyxZQUp1QixDQU12Q3pGLGdCQUFpQnlGLFlBTnNCLENBUXZDeEYscUJBQXNCK0IsaUJBUmlCLENBVXZDMEQsaUNBQWtDLFNBQVcvaEgsTUFBWCxDQUFvQixDQUVyRCw4QkFBTyxDQUF5QixLQUFLZzhHLEtBQTlCLENBQXFDLEtBQUt4OUcsTUFBMUMsQ0FBa0QsS0FBSzgvRyxZQUFMLEVBQWxELENBQXVFdCtHLE1BQXZFLENBQVAsQ0FFQSxDQWRzQyxDQWdCdkN3OEcsK0JBQWdDLFNBQVd4OEcsTUFBWCxDQUFvQixDQUVuRCw0QkFBTyxDQUF1QixLQUFLZzhHLEtBQTVCLENBQW1DLEtBQUt4OUcsTUFBeEMsQ0FBZ0QsS0FBSzgvRyxZQUFMLEVBQWhELENBQXFFdCtHLE1BQXJFLENBQVAsQ0FFQSxDQXBCc0MsQ0FzQnZDeThHLCtCQUFnQyxTQUFXejhHLE1BQVgsQ0FBb0IsQ0FFbkQsMkJBQU8sQ0FBc0IsS0FBS2c4RyxLQUEzQixDQUFrQyxLQUFLeDlHLE1BQXZDLENBQStDLEtBQUs4L0csWUFBTCxFQUEvQyxDQUFvRXQrRyxNQUFwRSxDQUFQLENBRUEsQ0ExQnNDLENBNEJ2Q3NoSCxpQkFBa0IsU0FBV3JGLGFBQVgsQ0FBMkIsQ0FFNUMsaUJBQUEsQ0FFQSxPQUFTQSxhQUFULEVBRUMsd0JBQUEsQ0FFQytGLGNBQWdCLEtBQUtELGdDQUFyQixDQUVBLE1BRUQsc0JBQUEsQ0FFQ0MsY0FBZ0IsS0FBS3hGLDhCQUFyQixDQUVBLE1BRUQsc0JBQUEsQ0FFQ3dGLGNBQWdCLEtBQUt2Riw4QkFBckIsQ0FFQSxNQWxCRixDQXNCQSxHQUFLdUYsZ0JBQWtCcGdILFNBQXZCLENBQW1DLENBRWxDLFlBQWMsaUNBQ2IsS0FBS3c2RyxhQURRLENBQ1Esd0JBRFIsQ0FDbUMsS0FBSzk4RyxJQUR0RCxDQUdBLEdBQUssS0FBSzJpSCxpQkFBTCxHQUEyQnJnSCxTQUFoQyxDQUE0QztFQUczQyxHQUFLcTZHLGdCQUFrQixLQUFLSyxvQkFBNUIsQ0FBbUQsQ0FFbEQsS0FBS2dGLGdCQUFMLENBQXVCLEtBQUtoRixvQkFBNUIsRUFFQSxDQUpELElBSU8sQ0FFTixlQUFNLENBQVd0dEIsT0FBWCxDQUFOLENBQTRCO0VBRTVCLENBRUQsQ0FFRHoyRSxRQUFRNlAsSUFBUixDQUFjLHNCQUFkLENBQXNDNG1FLE9BQXRDLEVBQ0EsT0FFQSxDQUVELEtBQUtpekIsaUJBQUwsQ0FBeUJELGFBQXpCLENBRUEsQ0FqRnNDLENBbUZ2Q0osaUJBQWtCLFVBQVksQ0FFN0IsT0FBUyxLQUFLSyxpQkFBZCxFQUVDLFVBQVVGLGdDQUFWLENBRUMsMEJBQUEsQ0FFRCxVQUFVdkYsOEJBQVYsQ0FFQyx3QkFBQSxDQUVELFVBQVVDLDhCQUFWLENBRUMsd0JBQUEsQ0FaRixDQWdCQSxDQXJHc0MsQ0F1R3ZDNkIsYUFBYyxVQUFZLENBRXpCLFlBQVk5L0csTUFBTCxDQUFZeUUsTUFBWixDQUFxQixLQUFLKzRHLEtBQUwsQ0FBVy80RyxNQUF2QyxDQUVBLENBM0dzQztFQThHdkNpL0csTUFBTyxTQUFXQyxVQUFYLENBQXdCLENBRTlCLEdBQUtBLGFBQWUsR0FBcEIsQ0FBMEIsQ0FFekIsVUFBWSxLQUFLbkcsS0FBakIsQ0FFQSxJQUFNLE1BQVEsQ0FBUixDQUFXbjJGLEVBQUltMkYsTUFBTS80RyxNQUEzQixDQUFtQ0ssSUFBTXVpQixDQUF6QyxDQUE0QyxFQUFHdmlCLENBQS9DLENBQW1ELENBRWxEMDRHLE1BQU8xNEcsQ0FBUCxHQUFjNitHLFVBQWQsQ0FFQSxDQUVELENBRUQsV0FBQSxDQUVBLENBOUhzQztFQWlJdkNsdkYsTUFBTyxTQUFXbXZGLFNBQVgsQ0FBdUIsQ0FFN0IsR0FBS0EsWUFBYyxHQUFuQixDQUF5QixDQUV4QixVQUFZLEtBQUtwRyxLQUFqQixDQUVBLElBQU0sTUFBUSxDQUFSLENBQVduMkYsRUFBSW0yRixNQUFNLzRHLE1BQTNCLENBQW1DSyxJQUFNdWlCLENBQXpDLENBQTRDLEVBQUd2aUIsQ0FBL0MsQ0FBbUQsQ0FFbEQwNEcsTUFBTzE0RyxDQUFQLEdBQWM4K0csU0FBZCxDQUVBLENBRUQsQ0FFRCxXQUFBLENBRUEsQ0FqSnNDO0VBb0p2QztFQUNBMzRDLEtBQU0sU0FBVzQ0QyxTQUFYLENBQXNCQyxPQUF0QixDQUFnQyxDQUVyQyxVQUFZLEtBQUt0RyxLQUFqQixDQUNDdUcsTUFBUXZHLE1BQU0vNEcsTUFEZixDQUVDcTlHLEtBQU8sQ0FGUixDQUdDQyxHQUFLZ0MsTUFBUSxDQUhkLENBS0EsTUFBUWpDLE9BQVNpQyxLQUFULEVBQWtCdkcsTUFBT3NFLElBQVAsRUFBZ0IrQixTQUExQyxDQUFzRCxDQUVyRCxFQUFHL0IsSUFBSCxDQUVBLENBRUQsTUFBUUMsS0FBTyxDQUFFLENBQVQsRUFBY3ZFLE1BQU91RSxFQUFQLEVBQWMrQixPQUFwQyxDQUE4QyxDQUU3QyxFQUFHL0IsRUFBSCxDQUVBLENBRUQsRUFBR0EsRUFBSCxDQUFPO0VBRVAsR0FBS0QsT0FBUyxDQUFULEVBQWNDLEtBQU9nQyxLQUExQixDQUFrQztFQUdqQyxHQUFLakMsTUFBUUMsRUFBYixDQUFrQkEsR0FBS3A3RyxLQUFLOEUsR0FBTCxDQUFVczJHLEVBQVYsQ0FBYyxDQUFkLENBQUwsQ0FBd0JELEtBQU9DLEdBQUssQ0FBcEMsQ0FFbEIsV0FBYSxLQUFLakMsWUFBTCxFQUFiLENBQ0EsS0FBS3RDLEtBQUwsQ0FBYXdFLGVBQWVILFVBQWYsQ0FBMkJyRSxLQUEzQixDQUFrQ3NFLElBQWxDLENBQXdDQyxFQUF4QyxDQUFiLENBQ0EsS0FBSy9oSCxNQUFMLENBQWNnaUgsZUFBZUgsVUFBZixDQUEyQixLQUFLN2hILE1BQWhDLENBQXdDOGhILEtBQU9udEIsTUFBL0MsQ0FBdURvdEIsR0FBS3B0QixNQUE1RCxDQUFkLENBRUEsQ0FFRCxXQUFBLENBRUEsQ0F2THNDO0VBMEx2Q291QixTQUFVLFVBQVksQ0FFckIsVUFBWSxJQUFaLENBRUEsY0FBZ0IsS0FBS2pELFlBQUwsRUFBaEIsQ0FDQSxHQUFLdEIsVUFBWTczRyxLQUFLRSxLQUFMLENBQVkyM0csU0FBWixDQUFaLEdBQXdDLENBQTdDLENBQWlELENBRWhEemtHLFFBQVFNLEtBQVIsQ0FBZSxtREFBZixDQUFvRSxJQUFwRSxFQUNBMnBHLE1BQVEsS0FBUixDQUVBLENBRUQsVUFBWSxLQUFLeEcsS0FBakIsQ0FDQ3g5RyxPQUFTLEtBQUtBLE1BRGYsQ0FHQytqSCxNQUFRdkcsTUFBTS80RyxNQUhmLENBS0EsR0FBS3MvRyxRQUFVLENBQWYsQ0FBbUIsQ0FFbEJocUcsUUFBUU0sS0FBUixDQUFlLHNDQUFmLENBQXVELElBQXZELEVBQ0EycEcsTUFBUSxLQUFSLENBRUEsQ0FFRCxhQUFlLElBQWYsQ0FFQSxJQUFNLE1BQVEsQ0FBZCxDQUFpQmwvRyxJQUFNaS9HLEtBQXZCLENBQThCai9HLEdBQTlCLENBQXFDLENBRXBDLGFBQWUwNEcsTUFBTzE0RyxDQUFQLENBQWYsQ0FFQSxHQUFLLGVBQUEsR0FBb0IsUUFBcEIsRUFBZ0NELE1BQU9vL0csUUFBUCxDQUFyQyxDQUF5RCxDQUV4RGxxRyxRQUFRTSxLQUFSLENBQWUsa0RBQWYsQ0FBbUUsSUFBbkUsQ0FBeUV2VixDQUF6RSxDQUE0RW0vRyxRQUE1RSxFQUNBRCxNQUFRLEtBQVIsQ0FDQSxNQUVBLENBRUQsR0FBS0UsV0FBYSxJQUFiLEVBQXFCQSxTQUFXRCxRQUFyQyxDQUFnRCxDQUUvQ2xxRyxRQUFRTSxLQUFSLENBQWUseUNBQWYsQ0FBMEQsSUFBMUQsQ0FBZ0V2VixDQUFoRSxDQUFtRW0vRyxRQUFuRSxDQUE2RUMsUUFBN0UsRUFDQUYsTUFBUSxLQUFSLENBQ0EsTUFFQSxDQUVERSxTQUFXRCxRQUFYLENBRUEsQ0FFRCxHQUFLamtILFNBQVdvRCxTQUFoQixDQUE0QixDQUUzQixHQUFLNCtHLGVBQWVDLFlBQWYsQ0FBNkJqaUgsTUFBN0IsQ0FBTCxDQUE2QyxDQUU1QyxJQUFNLE1BQVEsQ0FBUixDQUFXcW5CLEVBQUlybkIsT0FBT3lFLE1BQTVCLENBQW9DSyxJQUFNdWlCLENBQTFDLENBQTZDLEVBQUd2aUIsQ0FBaEQsQ0FBb0QsQ0FFbkQsVUFBWTlFLE9BQVE4RSxDQUFSLENBQVosQ0FFQSxHQUFLRCxNQUFPcEQsS0FBUCxDQUFMLENBQXNCLENBRXJCc1ksUUFBUU0sS0FBUixDQUFlLG1EQUFmLENBQW9FLElBQXBFLENBQTBFdlYsQ0FBMUUsQ0FBNkVyRCxLQUE3RSxFQUNBdWlILE1BQVEsS0FBUixDQUNBLE1BRUEsQ0FFRCxDQUVELENBRUQsQ0FFRCxZQUFBLENBRUEsQ0FwUXNDO0VBdVF2QztFQUNBaEIsU0FBVSxVQUFZLENBRXJCLFVBQVksS0FBS3hGLEtBQWpCLENBQ0N4OUcsT0FBUyxLQUFLQSxNQURmLENBRUMyMEYsT0FBUyxLQUFLbXJCLFlBQUwsRUFGVixDQUlDcUUsb0JBQXNCLEtBQUtmLGdCQUFMLEtBQTRCZ0IsaUJBSm5ELENBTUNDLFdBQWEsQ0FOZCxDQU9DbC9DLFVBQVlxNEMsTUFBTS80RyxNQUFOLENBQWUsQ0FQNUIsQ0FTQSxJQUFNLE1BQVEsQ0FBZCxDQUFpQkssRUFBSXFnRSxTQUFyQixDQUFnQyxFQUFHcmdFLENBQW5DLENBQXVDLENBRXRDLFNBQVcsS0FBWCxDQUVBLFNBQVcwNEcsTUFBTzE0RyxDQUFQLENBQVgsQ0FDQSxhQUFlMDRHLE1BQU8xNEcsRUFBSSxDQUFYLENBQWYsQ0FFQTtFQUVBLEdBQUs2d0YsT0FBUzJ1QixRQUFULEdBQXVCeC9HLElBQU0sQ0FBTixFQUFXNndGLE9BQVNBLEtBQU0sQ0FBTixDQUEzQyxDQUFMLENBQThELENBRTdELEdBQUssQ0FBRXd1QixtQkFBUCxDQUE2QjtFQUk1QixXQUFhci9HLEVBQUk2dkYsTUFBakIsQ0FDQzR2QixRQUFVbjRGLE9BQVN1b0UsTUFEcEIsQ0FFQzZ2QixRQUFVcDRGLE9BQVN1b0UsTUFGcEIsQ0FJQSxJQUFNLE1BQVEsQ0FBZCxDQUFpQmowRSxJQUFNaTBFLE1BQXZCLENBQStCLEVBQUdqMEUsQ0FBbEMsQ0FBc0MsQ0FFckMsVUFBWTFnQixPQUFRb3NCLE9BQVMxTCxDQUFqQixDQUFaLENBRUEsR0FBS2pmLFFBQVV6QixPQUFRdWtILFFBQVU3akcsQ0FBbEIsQ0FBVixFQUNKamYsUUFBVXpCLE9BQVF3a0gsUUFBVTlqRyxDQUFsQixDQURYLENBQ21DLENBRWxDK2pHLEtBQU8sSUFBUCxDQUNBLE1BRUEsQ0FFRCxDQUVELENBdEJELElBc0JPLENBRU5BLEtBQU8sSUFBUCxDQUVBLENBRUQsQ0FFRDtFQUVBLEdBQUtBLElBQUwsQ0FBWSxDQUVYLEdBQUszL0csSUFBTXUvRyxVQUFYLENBQXdCLENBRXZCN0csTUFBTzZHLFVBQVAsRUFBc0I3RyxNQUFPMTRHLENBQVAsQ0FBdEIsQ0FFQSxlQUFpQkEsRUFBSTZ2RixNQUFyQixDQUNDK3ZCLFlBQWNMLFdBQWExdkIsTUFENUIsQ0FHQSxJQUFNLE1BQVEsQ0FBZCxDQUFpQmowRSxJQUFNaTBFLE1BQXZCLENBQStCLEVBQUdqMEUsQ0FBbEMsQ0FBc0MsQ0FFckMxZ0IsT0FBUTBrSCxZQUFjaGtHLENBQXRCLEVBQTRCMWdCLE9BQVEya0gsV0FBYWprRyxDQUFyQixDQUE1QixDQUVBLENBRUQsQ0FFRCxFQUFHMmpHLFVBQUgsQ0FFQSxDQUVELENBRUQ7RUFFQSxHQUFLbC9DLFVBQVksQ0FBakIsQ0FBcUIsQ0FFcEJxNEMsTUFBTzZHLFVBQVAsRUFBc0I3RyxNQUFPcjRDLFNBQVAsQ0FBdEIsQ0FFQSxJQUFNLGVBQWlCQSxVQUFZd3ZCLE1BQTdCLENBQXFDK3ZCLFlBQWNMLFdBQWExdkIsTUFBaEUsQ0FBd0VqMEUsRUFBSSxDQUFsRixDQUFxRkEsSUFBTWkwRSxNQUEzRixDQUFtRyxFQUFHajBFLENBQXRHLENBQTBHLENBRXpHMWdCLE9BQVEwa0gsWUFBY2hrRyxDQUF0QixFQUE0QjFnQixPQUFRMmtILFdBQWFqa0csQ0FBckIsQ0FBNUIsQ0FFQSxDQUVELEVBQUcyakcsVUFBSCxDQUVBLENBRUQsR0FBS0EsYUFBZTdHLE1BQU0vNEcsTUFBMUIsQ0FBbUMsQ0FFbEMsS0FBSys0RyxLQUFMLENBQWF3RSxlQUFlSCxVQUFmLENBQTJCckUsS0FBM0IsQ0FBa0MsQ0FBbEMsQ0FBcUM2RyxVQUFyQyxDQUFiLENBQ0EsS0FBS3JrSCxNQUFMLENBQWNnaUgsZUFBZUgsVUFBZixDQUEyQjdoSCxNQUEzQixDQUFtQyxDQUFuQyxDQUFzQ3FrSCxXQUFhMXZCLE1BQW5ELENBQWQsQ0FFQSxDQUVELFdBQUEsQ0FFQSxDQTlXc0MsQ0FBeEMsRUFrWEE7Ozs7Ozs7O0tBVUEsNEJBQUEsQ0FBOEI3ekYsSUFBOUIsQ0FBb0MwOEcsS0FBcEMsQ0FBMkN4OUcsTUFBM0MsQ0FBbUR5OUcsYUFBbkQsQ0FBbUUsQ0FFbEVDLGNBQWNoK0csSUFBZCxDQUFvQixJQUFwQixDQUEwQm9CLElBQTFCLENBQWdDMDhHLEtBQWhDLENBQXVDeDlHLE1BQXZDLENBQStDeTlHLGFBQS9DLEVBRUEsQ0FFRG1ILG9CQUFvQjVtSCxTQUFwQixDQUFnQ0QsT0FBTzRuQixNQUFQLENBQWU1bkIsT0FBT2lCLE1BQVAsQ0FBZTArRyxjQUFjMS9HLFNBQTdCLENBQWYsQ0FBeUQsQ0FFeEZzQyxZQUFhc2tILG1CQUYyRSxDQUl4RmhILGNBQWUsUUFFZjtFQUVBO0VBUndGLENBQXpELENBQWhDLENBWUE7Ozs7OztLQVFBLHNCQUFBLENBQXdCOThHLElBQXhCLENBQThCK2pILFFBQTlCLENBQXdDQyxNQUF4QyxDQUFpRCxDQUVoRCxLQUFLaGtILElBQUwsQ0FBWUEsSUFBWixDQUNBLEtBQUtna0gsTUFBTCxDQUFjQSxNQUFkLENBQ0EsS0FBS0QsUUFBTCxDQUFrQkEsV0FBYXpoSCxTQUFmLENBQTZCeWhILFFBQTdCLENBQXdDLENBQUUsQ0FBMUQsQ0FFQSxLQUFLMWxGLElBQUwsQ0FBWTFXLE1BQU03QixZQUFOLEVBQVosQ0FFQTtFQUNBLEdBQUssS0FBS2krRixRQUFMLENBQWdCLENBQXJCLENBQXlCLENBRXhCLEtBQUtFLGFBQUwsR0FFQSxDQUVELEtBQUsvQixRQUFMLEdBRUEsQ0FFRGpsSCxPQUFPNG5CLE1BQVAsQ0FBZXEvRixhQUFmLENBQThCLENBRTdCNWpFLE1BQU8sU0FBVzYxRCxJQUFYLENBQWtCLENBRXhCLFdBQWEsRUFBYixDQUNDZ08sV0FBYWhPLEtBQUs2TixNQURuQixDQUVDSSxVQUFZLEtBQVFqTyxLQUFLa08sR0FBTCxFQUFZLEdBQXBCLENBRmIsQ0FJQSxJQUFNLE1BQVEsQ0FBUixDQUFXOTlGLEVBQUk0OUYsV0FBV3hnSCxNQUFoQyxDQUF3Q0ssSUFBTXVpQixDQUE5QyxDQUFpRCxFQUFHdmlCLENBQXBELENBQXdELENBRXZEZ2dILE9BQU83Z0gsSUFBUCxDQUFheTVHLGNBQWN0OEQsS0FBZCxDQUFxQjZqRSxXQUFZbmdILENBQVosQ0FBckIsRUFBdUMydkIsS0FBdkMsQ0FBOEN5d0YsU0FBOUMsQ0FBYixFQUVBLENBRUQsd0JBQU8sQ0FBbUJqTyxLQUFLbjJHLElBQXhCLENBQThCbTJHLEtBQUs0TixRQUFuQyxDQUE2Q0MsTUFBN0MsQ0FBUCxDQUVBLENBaEI0QixDQWtCN0J0a0YsT0FBUSxTQUFXNGtGLElBQVgsQ0FBa0IsQ0FFekIsV0FBYSxFQUFiLENBQ0NDLFdBQWFELEtBQUtOLE1BRG5CLENBR0EsU0FBVyxDQUVWLE9BQVFNLEtBQUt0a0gsSUFGSCxDQUdWLFdBQVlza0gsS0FBS1AsUUFIUCxDQUlWLFNBQVVDLE1BSkEsQ0FBWCxDQVFBLElBQU0sTUFBUSxDQUFSLENBQVd6OUYsRUFBSWcrRixXQUFXNWdILE1BQWhDLENBQXdDSyxJQUFNdWlCLENBQTlDLENBQWlELEVBQUd2aUIsQ0FBcEQsQ0FBd0QsQ0FFdkRnZ0gsT0FBTzdnSCxJQUFQLENBQWF5NUcsY0FBY2w5RSxNQUFkLENBQXNCNmtGLFdBQVl2Z0gsQ0FBWixDQUF0QixDQUFiLEVBRUEsQ0FFRCxXQUFBLENBRUEsQ0F2QzRCLENBeUM3QndnSCw4QkFBK0IsU0FBV3hrSCxJQUFYLENBQWlCeWtILG1CQUFqQixDQUFzQ0osR0FBdEMsQ0FBMkNLLE1BQTNDLENBQW9ELENBRWxGLG9CQUFzQkQsb0JBQW9COWdILE1BQTFDLENBQ0EsV0FBYSxFQUFiLENBRUEsSUFBTSxNQUFRLENBQWQsQ0FBaUJLLEVBQUkyZ0gsZUFBckIsQ0FBc0MzZ0gsR0FBdEMsQ0FBNkMsQ0FFNUMsVUFBWSxFQUFaLENBQ0EsV0FBYSxFQUFiLENBRUEwNEcsTUFBTXY1RyxJQUFOLENBQ0MsQ0FBRWEsRUFBSTJnSCxlQUFKLENBQXNCLENBQXhCLEVBQThCQSxlQUQvQixDQUVDM2dILENBRkQsQ0FHQyxDQUFFQSxFQUFJLENBQU4sRUFBWTJnSCxlQUhiLEVBS0F6bEgsT0FBT2lFLElBQVAsQ0FBYSxDQUFiLENBQWdCLENBQWhCLENBQW1CLENBQW5CLEVBRUEsVUFBWSs5RyxlQUFlSyxnQkFBZixDQUFpQzdFLEtBQWpDLENBQVosQ0FDQUEsTUFBUXdFLGVBQWVPLFdBQWYsQ0FBNEIvRSxLQUE1QixDQUFtQyxDQUFuQyxDQUFzQ3J1RixLQUF0QyxDQUFSLENBQ0FudkIsT0FBU2dpSCxlQUFlTyxXQUFmLENBQTRCdmlILE1BQTVCLENBQW9DLENBQXBDLENBQXVDbXZCLEtBQXZDLENBQVQsQ0FFQTtFQUNBO0VBQ0EsR0FBSyxDQUFFcTJGLE1BQUYsRUFBWWhJLE1BQU8sQ0FBUCxJQUFlLENBQWhDLENBQW9DLENBRW5DQSxNQUFNdjVHLElBQU4sQ0FBWXdoSCxlQUFaLEVBQ0F6bEgsT0FBT2lFLElBQVAsQ0FBYWpFLE9BQVEsQ0FBUixDQUFiLEVBRUEsQ0FFRDhrSCxPQUFPN2dILElBQVAsQ0FDQyx1QkFBQSxDQUNDLDBCQUE0QnNoSCxvQkFBcUJ6Z0gsQ0FBckIsRUFBeUJoRSxJQUFyRCxDQUE0RCxHQUQ3RCxDQUVDMDhHLEtBRkQsQ0FFUXg5RyxNQUZSLEVBR0V5MEIsS0FIRixDQUdTLElBQU0wd0YsR0FIZixDQURELEVBTUEsQ0FFRCx3QkFBTyxDQUFtQnJrSCxJQUFuQixDQUF5QixDQUFFLENBQTNCLENBQThCZ2tILE1BQTlCLENBQVAsQ0FFQSxDQWpGNEIsQ0FtRjdCWSxXQUFZLFNBQVdDLGlCQUFYLENBQThCN2tILElBQTlCLENBQXFDLENBRWhELGNBQWdCNmtILGlCQUFoQixDQUVBLEdBQUssQ0FBRS96RyxNQUFNeU0sT0FBTixDQUFlc25HLGlCQUFmLENBQVAsQ0FBNEMsQ0FFM0MsTUFBUUEsaUJBQVIsQ0FDQUMsVUFBWWxqRyxFQUFFcWlCLFFBQUYsRUFBY3JpQixFQUFFcWlCLFFBQUYsQ0FBVzhnRixVQUF6QixFQUF1Q25qRyxFQUFFbWpHLFVBQXJELENBRUEsQ0FFRCxJQUFNLE1BQVEsQ0FBZCxDQUFpQi9nSCxFQUFJOGdILFVBQVVuaEgsTUFBL0IsQ0FBdUNLLEdBQXZDLENBQThDLENBRTdDLEdBQUs4Z0gsVUFBVzlnSCxDQUFYLEVBQWVoRSxJQUFmLEdBQXdCQSxJQUE3QixDQUFvQyxDQUVuQyxpQkFBa0JnRSxDQUFYLENBQVAsQ0FFQSxDQUVELENBRUQsV0FBQSxDQUVBLENBMUc0QixDQTRHN0JnaEgsb0NBQXFDLFNBQVcvaUUsWUFBWCxDQUF5Qm9pRSxHQUF6QixDQUE4QkssTUFBOUIsQ0FBdUMsQ0FFM0UsNEJBQThCLEVBQTlCLENBRUE7RUFDQTtFQUNBLFlBQWMsb0JBQWQsQ0FFQTtFQUNBO0VBQ0EsSUFBTSxNQUFRLENBQVIsQ0FBV3RoRixHQUFLNmUsYUFBYXQrQyxNQUFuQyxDQUEyQ0ssRUFBSW8vQixFQUEvQyxDQUFtRHAvQixHQUFuRCxDQUEwRCxDQUV6RCxnQkFBa0JpK0MsYUFBY2orQyxDQUFkLENBQWxCLENBQ0EsVUFBWW9rRCxZQUFZcG9ELElBQVosQ0FBaUI0a0IsS0FBakIsQ0FBd0JvaUQsT0FBeEIsQ0FBWixDQUVBLEdBQUtpK0MsT0FBU0EsTUFBTXRoSCxNQUFOLENBQWUsQ0FBN0IsQ0FBaUMsQ0FFaEMsU0FBV3NoSCxNQUFPLENBQVAsQ0FBWCxDQUVBLDBCQUE0QkMsd0JBQXlCbGxILElBQXpCLENBQTVCLENBQ0EsR0FBSyxDQUFFbWxILHFCQUFQLENBQStCLENBRTlCRCx3QkFBeUJsbEgsSUFBekIsRUFBa0NtbEgsc0JBQXdCLEVBQTFELENBRUEsQ0FFREEsc0JBQXNCaGlILElBQXRCLENBQTRCaWxELFdBQTVCLEVBRUEsQ0FFRCxDQUVELFVBQVksRUFBWixDQUVBLElBQU0sUUFBTiwyQkFBQSxDQUE0QyxDQUUzQ2c5RCxNQUFNamlILElBQU4sQ0FBWStnSCxjQUFjTSw2QkFBZCxDQUE2Q3hrSCxJQUE3QyxDQUFtRGtsSCx3QkFBeUJsbEgsSUFBekIsQ0FBbkQsQ0FBb0Zxa0gsR0FBcEYsQ0FBeUZLLE1BQXpGLENBQVosRUFFQSxDQUVELFlBQUEsQ0FFQSxDQXRKNEI7RUF5SjdCVyxlQUFnQixTQUFXQyxTQUFYLENBQXNCajVDLEtBQXRCLENBQThCLENBRTdDLEdBQUssQ0FBRWk1QyxTQUFQLENBQW1CLENBRWxCcnNHLFFBQVFNLEtBQVIsQ0FBZSx1REFBZixFQUNBLFdBQUEsQ0FFQSxDQUVELHFCQUF1QixTQUFXNm9HLFNBQVgsQ0FBc0JtRCxTQUF0QixDQUFpQ0MsYUFBakMsQ0FBZ0RDLFlBQWhELENBQThEQyxVQUE5RCxDQUEyRTtFQUdqRyxHQUFLRixjQUFjN2hILE1BQWQsR0FBeUIsQ0FBOUIsQ0FBa0MsQ0FFakMsVUFBWSxFQUFaLENBQ0EsV0FBYSxFQUFiLENBRUF1OUcsZUFBZVUsV0FBZixDQUE0QjRELGFBQTVCLENBQTJDOUksS0FBM0MsQ0FBa0R4OUcsTUFBbEQsQ0FBMER1bUgsWUFBMUQsRUFFQTtFQUNBLEdBQUsvSSxNQUFNLzRHLE1BQU4sR0FBaUIsQ0FBdEIsQ0FBMEIsQ0FFekIraEgsV0FBV3ZpSCxJQUFYLENBQWlCLGFBQUEsQ0FBZW9pSCxTQUFmLENBQTBCN0ksS0FBMUIsQ0FBaUN4OUcsTUFBakMsQ0FBakIsRUFFQSxDQUVELENBRUQsQ0FuQkQsQ0FxQkEsV0FBYSxFQUFiLENBRUEsYUFBZW9tSCxVQUFVdGxILElBQVYsRUFBa0IsU0FBakMsQ0FDQTtFQUNBLGFBQWVzbEgsVUFBVTNoSCxNQUFWLEVBQW9CLENBQUUsQ0FBckMsQ0FDQSxRQUFVMmhILFVBQVVqQixHQUFWLEVBQWlCLEVBQTNCLENBRUEsb0JBQXNCaUIsVUFBVUssU0FBVixFQUF1QixFQUE3QyxDQUVBLElBQU0sTUFBUSxDQUFkLENBQWlCM3ZGLEVBQUk0dkYsZ0JBQWdCamlILE1BQXJDLENBQTZDcXlCLEdBQTdDLENBQW9ELENBRW5ELGtCQUFvQjR2RixnQkFBaUI1dkYsQ0FBakIsRUFBcUJ6eUIsSUFBekMsQ0FFQTtFQUNBLEdBQUssQ0FBRWlpSCxhQUFGLEVBQW1CQSxjQUFjN2hILE1BQWQsR0FBeUIsQ0FBakQsQ0FBcUQsU0FFckQ7RUFDQSxHQUFLNmhILGNBQWUsQ0FBZixFQUFtQnZqRSxZQUF4QixDQUF1QztFQUd0QyxxQkFBdUIsRUFBdkIsQ0FFQSxJQUFNLE1BQVEsQ0FBZCxDQUFpQm5pQyxFQUFJMGxHLGNBQWM3aEgsTUFBbkMsQ0FBMkNtYyxHQUEzQyxDQUFrRCxDQUVqRCxHQUFLMGxHLGNBQWUxbEcsQ0FBZixFQUFtQm1pQyxZQUF4QixDQUF1QyxDQUV0QyxJQUFNLE1BQVEsQ0FBZCxDQUFpQno3QixFQUFJZy9GLGNBQWUxbEcsQ0FBZixFQUFtQm1pQyxZQUFuQixDQUFnQ3QrQyxNQUFyRCxDQUE2RDZpQixHQUE3RCxDQUFvRSxDQUVuRXEvRixpQkFBa0JMLGNBQWUxbEcsQ0FBZixFQUFtQm1pQyxZQUFuQixDQUFpQ3o3QixDQUFqQyxDQUFsQixFQUEyRCxDQUFFLENBQTdELENBRUEsQ0FFRCxDQUVELENBRUQ7RUFDQTtFQUNBO0VBQ0EsSUFBTSxtQkFBTixvQkFBQSxDQUFnRCxDQUUvQyxVQUFZLEVBQVosQ0FDQSxXQUFhLEVBQWIsQ0FFQSxJQUFNLE1BQVEsQ0FBZCxDQUFpQkEsSUFBTWcvRixjQUFlMWxHLENBQWYsRUFBbUJtaUMsWUFBbkIsQ0FBZ0N0K0MsTUFBdkQsQ0FBK0QsRUFBRzZpQixDQUFsRSxDQUFzRSxDQUVyRSxpQkFBbUJnL0YsY0FBZTFsRyxDQUFmLENBQW5CLENBRUE0OEYsTUFBTXY1RyxJQUFOLENBQVkyaUgsYUFBYWp4QixJQUF6QixFQUNBMzFGLE9BQU9pRSxJQUFQLENBQWUyaUgsYUFBYTE5RCxXQUFiLEdBQTZCMjlELGVBQS9CLENBQW1ELENBQW5ELENBQXVELENBQXBFLEVBRUEsQ0FFRC9CLE9BQU83Z0gsSUFBUCxDQUFhLHVCQUFBLENBQXlCLHlCQUEyQjRpSCxlQUEzQixDQUE2QyxHQUF0RSxDQUEyRXJKLEtBQTNFLENBQWtGeDlHLE1BQWxGLENBQWIsRUFFQSxDQUVENmtILFNBQVc4QixpQkFBaUJsaUgsTUFBakIsRUFBNEIwZ0gsS0FBTyxHQUFuQyxDQUFYLENBRUEsQ0ExQ0QsSUEwQ087RUFJTixhQUFlLFVBQVloNEMsTUFBT3IyQyxDQUFQLEVBQVdoMkIsSUFBdkIsQ0FBOEIsR0FBN0MsQ0FFQWdtSCxpQkFDQ2xDLG1CQURELENBQ3NCbUMsU0FBVyxXQURqQyxDQUVDVCxhQUZELENBRWdCLEtBRmhCLENBRXVCeEIsTUFGdkIsRUFJQWdDLGlCQUNDbEgsdUJBREQsQ0FDMEJtSCxTQUFXLGFBRHJDLENBRUNULGFBRkQsQ0FFZ0IsS0FGaEIsQ0FFdUJ4QixNQUZ2QixFQUlBZ0MsaUJBQ0NsQyxtQkFERCxDQUNzQm1DLFNBQVcsUUFEakMsQ0FFQ1QsYUFGRCxDQUVnQixLQUZoQixDQUV1QnhCLE1BRnZCLEVBSUEsQ0FFRCxDQUVELEdBQUtBLE9BQU9yZ0gsTUFBUCxHQUFrQixDQUF2QixDQUEyQixDQUUxQixXQUFBLENBRUEsQ0FFRCxTQUFXLGlCQUFBLENBQW1CdWlILFFBQW5CLENBQTZCbkMsUUFBN0IsQ0FBdUNDLE1BQXZDLENBQVgsQ0FFQSxXQUFBLENBRUEsQ0FsUjRCLENBQTlCLEVBc1JBL21ILE9BQU80bkIsTUFBUCxDQUFlcS9GLGNBQWNobkgsU0FBN0IsQ0FBd0MsQ0FFdkMrbUgsY0FBZSxVQUFZLENBRTFCLFdBQWEsS0FBS0QsTUFBbEIsQ0FBMEJELFNBQVcsQ0FBckMsQ0FFQSxJQUFNLE1BQVEsQ0FBUixDQUFXeDlGLEVBQUl5OUYsT0FBT3JnSCxNQUE1QixDQUFvQ0ssSUFBTXVpQixDQUExQyxDQUE2QyxFQUFHdmlCLENBQWhELENBQW9ELENBRW5ELFVBQVksS0FBS2dnSCxNQUFMLENBQWFoZ0gsQ0FBYixDQUFaLENBRUErL0csU0FBV2wrRyxLQUFLOEUsR0FBTCxDQUFVbzVHLFFBQVYsQ0FBb0IxQixNQUFNM0YsS0FBTixDQUFhMkYsTUFBTTNGLEtBQU4sQ0FBWS80RyxNQUFaLENBQXFCLENBQWxDLENBQXBCLENBQVgsQ0FFQSxDQUVELEtBQUtvZ0gsUUFBTCxDQUFnQkEsUUFBaEIsQ0FFQSxDQWhCc0MsQ0FrQnZDNTVDLEtBQU0sVUFBWSxDQUVqQixJQUFNLE1BQVEsQ0FBZCxDQUFpQm5tRSxFQUFJLEtBQUtnZ0gsTUFBTCxDQUFZcmdILE1BQWpDLENBQXlDSyxHQUF6QyxDQUFnRCxDQUUvQyxLQUFLZ2dILE1BQUwsQ0FBYWhnSCxDQUFiLEVBQWlCbW1FLElBQWpCLENBQXVCLENBQXZCLENBQTBCLEtBQUs0NUMsUUFBL0IsRUFFQSxDQUVELFdBQUEsQ0FFQSxDQTVCc0MsQ0E4QnZDN0IsU0FBVSxVQUFZLENBRXJCLElBQU0sTUFBUSxDQUFkLENBQWlCbCtHLEVBQUksS0FBS2dnSCxNQUFMLENBQVlyZ0gsTUFBakMsQ0FBeUNLLEdBQXpDLENBQWdELENBRS9DLEtBQUtnZ0gsTUFBTCxDQUFhaGdILENBQWIsRUFBaUJrK0csUUFBakIsR0FFQSxDQUVELFdBQUEsQ0FFQSxDQXhDc0MsQ0FBeEMsRUE0Q0E7O0tBSUEsdUJBQUEsQ0FBeUI5USxPQUF6QixDQUFtQyxDQUVsQyxLQUFLQSxPQUFMLENBQWlCQSxVQUFZOXVHLFNBQWQsQ0FBNEI4dUcsT0FBNUIsQ0FBc0NDLHFCQUFyRCxDQUNBLEtBQUt6eEUsUUFBTCxDQUFnQixFQUFoQixDQUVBLENBRUQzaUMsT0FBTzRuQixNQUFQLENBQWVzaEcsZUFBZWpwSCxTQUE5QixDQUF5QyxDQUV4Q3EwRyxLQUFNLFNBQVdoeEUsR0FBWCxDQUFnQit2RSxNQUFoQixDQUF3QkMsVUFBeEIsQ0FBb0NDLE9BQXBDLENBQThDLENBRW5ELFVBQVksSUFBWixDQUVBLFdBQWEsY0FBQSxDQUFnQnBzRSxNQUFNZ3RFLE9BQXRCLENBQWIsQ0FDQWlDLE9BQU85QixJQUFQLENBQWFoeEUsR0FBYixDQUFrQixTQUFXOHJFLElBQVgsQ0FBa0IsQ0FFbkNpRSxPQUFRbHNFLE1BQU1rYyxLQUFOLENBQWF0aUMsS0FBS3NpQyxLQUFMLENBQVkrckQsSUFBWixDQUFiLENBQVIsRUFFQSxDQUpELENBSUdrRSxVQUpILENBSWVDLE9BSmYsRUFNQSxDQWJ1QyxDQWV4QzRWLFlBQWEsU0FBV3psSCxLQUFYLENBQW1CLENBRS9CLEtBQUtpL0IsUUFBTCxDQUFnQmovQixLQUFoQixDQUVBLENBbkJ1QyxDQXFCeEMyL0MsTUFBTyxTQUFXNjFELElBQVgsQ0FBa0IsQ0FFeEIsYUFBZSxLQUFLdjJFLFFBQXBCLENBRUEsbUJBQUEsQ0FBcUI1L0IsSUFBckIsQ0FBNEIsQ0FFM0IsR0FBSzQvQixTQUFVNS9CLElBQVYsSUFBcUJzQyxTQUExQixDQUFzQyxDQUVyQzJXLFFBQVE2UCxJQUFSLENBQWMseUNBQWQsQ0FBeUQ5b0IsSUFBekQsRUFFQSxDQUVELGdCQUFpQkEsSUFBVixDQUFQLENBRUEsQ0FFRCxhQUFlLGNBQWVtMkcsS0FBS3gzRyxJQUFoQixDQUFKLEVBQWYsQ0FFQSxHQUFLdzNHLEtBQUs5M0UsSUFBTCxHQUFjLzdCLFNBQW5CLENBQStCMjlDLFNBQVM1aEIsSUFBVCxDQUFnQjgzRSxLQUFLOTNFLElBQXJCLENBQy9CLEdBQUs4M0UsS0FBS24yRyxJQUFMLEdBQWNzQyxTQUFuQixDQUErQjI5QyxTQUFTamdELElBQVQsQ0FBZ0JtMkcsS0FBS24yRyxJQUFyQixDQUMvQixHQUFLbTJHLEtBQUtqa0UsS0FBTCxHQUFlNXZDLFNBQXBCLENBQWdDMjlDLFNBQVMvTixLQUFULENBQWVQLE1BQWYsQ0FBdUJ3a0UsS0FBS2prRSxLQUE1QixFQUNoQyxHQUFLaWtFLEtBQUszOUQsU0FBTCxHQUFtQmwyQyxTQUF4QixDQUFvQzI5QyxTQUFTekgsU0FBVCxDQUFxQjI5RCxLQUFLMzlELFNBQTFCLENBQ3BDLEdBQUsyOUQsS0FBSzE5RCxTQUFMLEdBQW1CbjJDLFNBQXhCLENBQW9DMjlDLFNBQVN4SCxTQUFULENBQXFCMDlELEtBQUsxOUQsU0FBMUIsQ0FDcEMsR0FBSzA5RCxLQUFLaCtELFFBQUwsR0FBa0I3MUMsU0FBdkIsQ0FBbUMyOUMsU0FBUzlILFFBQVQsQ0FBa0J4RyxNQUFsQixDQUEwQndrRSxLQUFLaCtELFFBQS9CLEVBQ25DLEdBQUtnK0QsS0FBSzk5RCxRQUFMLEdBQWtCLzFDLFNBQXZCLENBQW1DMjlDLFNBQVM1SCxRQUFULENBQWtCMUcsTUFBbEIsQ0FBMEJ3a0UsS0FBSzk5RCxRQUEvQixFQUNuQyxHQUFLODlELEtBQUs3OUQsU0FBTCxHQUFtQmgyQyxTQUF4QixDQUFvQzI5QyxTQUFTM0gsU0FBVCxDQUFxQjY5RCxLQUFLNzlELFNBQTFCLENBQ3BDLEdBQUs2OUQsS0FBS3o4RCxTQUFMLEdBQW1CcDNDLFNBQXhCLENBQW9DMjlDLFNBQVN2RyxTQUFULENBQXFCeThELEtBQUt6OEQsU0FBMUIsQ0FDcEMsR0FBS3k4RCxLQUFLeDhELGtCQUFMLEdBQTRCcjNDLFNBQWpDLENBQTZDMjlDLFNBQVN0RyxrQkFBVCxDQUE4Qnc4RCxLQUFLeDhELGtCQUFuQyxDQUM3QyxHQUFLdzhELEtBQUtqbEUsUUFBTCxHQUFrQjV1QyxTQUF2QixDQUFtQzI5QyxTQUFTL08sUUFBVCxDQUFvQmlsRSxLQUFLamxFLFFBQXpCLENBQ25DLEdBQUtpbEUsS0FBS3ArRCxZQUFMLEdBQXNCejFDLFNBQTNCLENBQXVDMjlDLFNBQVNsSSxZQUFULENBQXdCbytELEtBQUtwK0QsWUFBN0IsQ0FDdkMsR0FBS28rRCxLQUFLbCtELGNBQUwsR0FBd0IzMUMsU0FBN0IsQ0FBeUMyOUMsU0FBU2hJLGNBQVQsQ0FBMEJrK0QsS0FBS2wrRCxjQUEvQixDQUN6QyxHQUFLaytELEtBQUt4MEQsWUFBTCxHQUFzQnIvQyxTQUEzQixDQUF1QzI5QyxTQUFTMEIsWUFBVCxDQUF3QncwRCxLQUFLeDBELFlBQTdCLENBQ3ZDLEdBQUt3MEQsS0FBS3JnRSxHQUFMLEdBQWF4ekMsU0FBbEIsQ0FBOEIyOUMsU0FBU25LLEdBQVQsQ0FBZXFnRSxLQUFLcmdFLEdBQXBCLENBQzlCLEdBQUtxZ0UsS0FBS25uRCxXQUFMLEdBQXFCMXNELFNBQTFCLENBQXNDMjlDLFNBQVMrTyxXQUFULENBQXVCbW5ELEtBQUtubkQsV0FBNUIsQ0FDdEMsR0FBS21uRCxLQUFLdm5ELFFBQUwsR0FBa0J0c0QsU0FBdkIsQ0FBbUMyOUMsU0FBUzJPLFFBQVQsQ0FBb0J1bkQsS0FBS3ZuRCxRQUF6QixDQUNuQyxHQUFLdW5ELEtBQUtybkQsSUFBTCxHQUFjeHNELFNBQW5CLENBQStCMjlDLFNBQVM2TyxJQUFULENBQWdCcW5ELEtBQUtybkQsSUFBckIsQ0FDL0IsR0FBS3FuRCxLQUFLemlFLE9BQUwsR0FBaUJweEMsU0FBdEIsQ0FBa0MyOUMsU0FBU3ZNLE9BQVQsQ0FBbUJ5aUUsS0FBS3ppRSxPQUF4QixDQUNsQyxHQUFLeWlFLEtBQUtqbkQsV0FBTCxHQUFxQjVzRCxTQUExQixDQUFzQzI5QyxTQUFTaVAsV0FBVCxDQUF1QmluRCxLQUFLam5ELFdBQTVCLENBQ3RDLEdBQUtpbkQsS0FBSzFsRCxTQUFMLEdBQW1CbnVELFNBQXhCLENBQW9DMjlDLFNBQVN3USxTQUFULENBQXFCMGxELEtBQUsxbEQsU0FBMUIsQ0FDcEMsR0FBSzBsRCxLQUFLcm1ELFNBQUwsR0FBbUJ4dEQsU0FBeEIsQ0FBb0MyOUMsU0FBUzZQLFNBQVQsQ0FBcUJxbUQsS0FBS3JtRCxTQUExQixDQUNwQyxHQUFLcW1ELEtBQUtwbUQsVUFBTCxHQUFvQnp0RCxTQUF6QixDQUFxQzI5QyxTQUFTOFAsVUFBVCxDQUFzQm9tRCxLQUFLcG1ELFVBQTNCLENBQ3JDLEdBQUtvbUQsS0FBSy9sRCxVQUFMLEdBQW9COXRELFNBQXpCLENBQXFDMjlDLFNBQVNtUSxVQUFULENBQXNCK2xELEtBQUsvbEQsVUFBM0IsQ0FDckMsR0FBSytsRCxLQUFLM2tELFNBQUwsR0FBbUJsdkQsU0FBeEIsQ0FBb0MyOUMsU0FBU3VSLFNBQVQsQ0FBcUIya0QsS0FBSzNrRCxTQUExQixDQUNwQyxHQUFLMmtELEtBQUsxa0Qsa0JBQUwsR0FBNEJudkQsU0FBakMsQ0FBNkMyOUMsU0FBU3dSLGtCQUFULENBQThCMGtELEtBQUsxa0Qsa0JBQW5DLENBQzdDLEdBQUswa0QsS0FBS3prRCxnQkFBTCxHQUEwQnB2RCxTQUEvQixDQUEyQzI5QyxTQUFTeVIsZ0JBQVQsQ0FBNEJ5a0QsS0FBS3prRCxnQkFBakMsQ0FDM0MsR0FBS3lrRCxLQUFLeGtELGlCQUFMLEdBQTJCcnZELFNBQWhDLENBQTRDMjlDLFNBQVMwUixpQkFBVCxDQUE2QndrRCxLQUFLeGtELGlCQUFsQyxDQUU1QyxHQUFLd2tELEtBQUs3NEUsUUFBTCxHQUFrQmg3QixTQUF2QixDQUFtQzI5QyxTQUFTM2lCLFFBQVQsQ0FBb0I2NEUsS0FBSzc0RSxRQUF6QixDQUVuQyxHQUFLNjRFLEtBQUs3a0QsU0FBTCxHQUFtQixDQUF4QixDQUE0QnJSLFNBQVNxUixTQUFULENBQXFCNmtELEtBQUs3a0QsU0FBMUIsQ0FDNUIsR0FBSzZrRCxLQUFLdjlELFFBQUwsR0FBa0J0MkMsU0FBdkIsQ0FBbUMyOUMsU0FBU3JILFFBQVQsQ0FBb0J1OUQsS0FBS3Y5RCxRQUF6QixDQUNuQyxHQUFLdTlELEtBQUs1a0QsT0FBTCxHQUFpQmp2RCxTQUF0QixDQUFrQzI5QyxTQUFTc1IsT0FBVCxDQUFtQjRrRCxLQUFLNWtELE9BQXhCLENBQ2xDLEdBQUs0a0QsS0FBS3hpRixLQUFMLEdBQWVyeEIsU0FBcEIsQ0FBZ0MyOUMsU0FBU3RzQixLQUFULENBQWlCd2lGLEtBQUt4aUYsS0FBdEIsQ0FFaEMsR0FBS3dpRixLQUFLOWxELGFBQUwsR0FBdUIvdEQsU0FBNUIsQ0FBd0MyOUMsU0FBU29RLGFBQVQsQ0FBeUI4bEQsS0FBSzlsRCxhQUE5QixDQUN4QyxHQUFLOGxELEtBQUs3bEQsbUJBQUwsR0FBNkJodUQsU0FBbEMsQ0FBOEMyOUMsU0FBU3FRLG1CQUFULENBQStCNmxELEtBQUs3bEQsbUJBQXBDLENBQzlDLEdBQUs2bEQsS0FBSzVsRCxrQkFBTCxHQUE0Qmp1RCxTQUFqQyxDQUE2QzI5QyxTQUFTc1Esa0JBQVQsQ0FBOEI0bEQsS0FBSzVsRCxrQkFBbkMsQ0FFN0MsR0FBSzRsRCxLQUFLdmtELFFBQUwsR0FBa0J0dkQsU0FBdkIsQ0FBbUMyOUMsU0FBUzJSLFFBQVQsQ0FBb0J1a0QsS0FBS3ZrRCxRQUF6QixDQUNuQyxHQUFLdWtELEtBQUtsMEQsWUFBTCxHQUFzQjMvQyxTQUEzQixDQUF1QzI5QyxTQUFTZ0MsWUFBVCxDQUF3QmswRCxLQUFLbDBELFlBQTdCLENBQ3ZDLEdBQUtrMEQsS0FBSzNsRCxTQUFMLEdBQW1CbHVELFNBQXhCLENBQW9DMjlDLFNBQVN1USxTQUFULENBQXFCMmxELEtBQUszbEQsU0FBMUIsQ0FFcEMsR0FBSzJsRCxLQUFLajVELE9BQUwsR0FBaUI1NkMsU0FBdEIsQ0FBa0MyOUMsU0FBUy9DLE9BQVQsQ0FBbUJpNUQsS0FBS2o1RCxPQUF4QixDQUNsQyxHQUFLaTVELEtBQUs1NEQsUUFBTCxHQUFrQmo3QyxTQUF2QixDQUFtQzI5QyxTQUFTMUMsUUFBVCxDQUFvQjQ0RCxLQUFLNTRELFFBQXpCLENBRW5DO0VBRUEsR0FBSzQ0RCxLQUFLa1EsT0FBTCxHQUFpQi9qSCxTQUF0QixDQUFrQzI5QyxTQUFTK08sV0FBVCxDQUF1Qm1uRCxLQUFLa1EsT0FBTCxHQUFpQixDQUF4QyxDQUEyQztFQUU3RTtFQUVBLEdBQUtsUSxLQUFLNXlFLElBQUwsR0FBY2poQyxTQUFuQixDQUErQjI5QyxTQUFTMWMsSUFBVCxDQUFnQjR5RSxLQUFLNXlFLElBQXJCLENBQy9CLEdBQUs0eUUsS0FBSzlrRCxlQUFMLEdBQXlCL3VELFNBQTlCLENBQTBDMjlDLFNBQVNvUixlQUFULENBQTJCOGtELEtBQUs5a0QsZUFBaEMsQ0FFMUM7RUFFQSxHQUFLOGtELEtBQUt4aUUsR0FBTCxHQUFhcnhDLFNBQWxCLENBQThCMjlDLFNBQVN0TSxHQUFULENBQWUyeUUsV0FBWW5RLEtBQUt4aUUsR0FBakIsQ0FBZixDQUU5QixHQUFLd2lFLEtBQUt0aUUsUUFBTCxHQUFrQnZ4QyxTQUF2QixDQUFtQyxDQUVsQzI5QyxTQUFTcE0sUUFBVCxDQUFvQnl5RSxXQUFZblEsS0FBS3RpRSxRQUFqQixDQUFwQixDQUNBb00sU0FBU2lQLFdBQVQsQ0FBdUIsSUFBdkIsQ0FFQSxDQUVELEdBQUtpbkQsS0FBS3BoRSxPQUFMLEdBQWlCenlDLFNBQXRCLENBQWtDMjlDLFNBQVNsTCxPQUFULENBQW1CdXhFLFdBQVluUSxLQUFLcGhFLE9BQWpCLENBQW5CLENBQ2xDLEdBQUtvaEUsS0FBS25oRSxTQUFMLEdBQW1CMXlDLFNBQXhCLENBQW9DMjlDLFNBQVNqTCxTQUFULENBQXFCbWhFLEtBQUtuaEUsU0FBMUIsQ0FFcEMsR0FBS21oRSxLQUFLamhFLFNBQUwsR0FBbUI1eUMsU0FBeEIsQ0FBb0MyOUMsU0FBUy9LLFNBQVQsQ0FBcUJveEUsV0FBWW5RLEtBQUtqaEUsU0FBakIsQ0FBckIsQ0FDcEMsR0FBS2loRSxLQUFLaGhFLFdBQUwsR0FBcUI3eUMsU0FBMUIsQ0FBc0MsQ0FFckMsZ0JBQWtCNnpHLEtBQUtoaEUsV0FBdkIsQ0FFQSxHQUFLcmtDLE1BQU15TSxPQUFOLENBQWU0M0IsV0FBZixJQUFpQyxLQUF0QyxDQUE4QztFQUk3Q0EsWUFBYyxDQUFFQSxXQUFGLENBQWVBLFdBQWYsQ0FBZCxDQUVBLENBRUQ4SyxTQUFTOUssV0FBVCxDQUF1QixXQUFBLEdBQWM5cEIsU0FBZCxDQUF5QjhwQixXQUF6QixDQUF2QixDQUVBLENBRUQsR0FBS2doRSxLQUFLOWdFLGVBQUwsR0FBeUIveUMsU0FBOUIsQ0FBMEMyOUMsU0FBUzVLLGVBQVQsQ0FBMkJpeEUsV0FBWW5RLEtBQUs5Z0UsZUFBakIsQ0FBM0IsQ0FDMUMsR0FBSzhnRSxLQUFLN2dFLGlCQUFMLEdBQTJCaHpDLFNBQWhDLENBQTRDMjlDLFNBQVMzSyxpQkFBVCxDQUE2QjZnRSxLQUFLN2dFLGlCQUFsQyxDQUM1QyxHQUFLNmdFLEtBQUs1Z0UsZ0JBQUwsR0FBMEJqekMsU0FBL0IsQ0FBMkMyOUMsU0FBUzFLLGdCQUFULENBQTRCNGdFLEtBQUs1Z0UsZ0JBQWpDLENBRTNDLEdBQUs0Z0UsS0FBSzFnRSxZQUFMLEdBQXNCbnpDLFNBQTNCLENBQXVDMjlDLFNBQVN4SyxZQUFULENBQXdCNndFLFdBQVluUSxLQUFLMWdFLFlBQWpCLENBQXhCLENBQ3ZDLEdBQUswZ0UsS0FBS3hnRSxZQUFMLEdBQXNCcnpDLFNBQTNCLENBQXVDMjlDLFNBQVN0SyxZQUFULENBQXdCMndFLFdBQVluUSxLQUFLeGdFLFlBQWpCLENBQXhCLENBRXZDLEdBQUt3Z0UsS0FBS3RoRSxXQUFMLEdBQXFCdnlDLFNBQTFCLENBQXNDMjlDLFNBQVNwTCxXQUFULENBQXVCeXhFLFdBQVluUSxLQUFLdGhFLFdBQWpCLENBQXZCLENBQ3RDLEdBQUtzaEUsS0FBSy9rRCxpQkFBTCxHQUEyQjl1RCxTQUFoQyxDQUE0QzI5QyxTQUFTbVIsaUJBQVQsQ0FBNkIra0QsS0FBSy9rRCxpQkFBbEMsQ0FFNUMsR0FBSytrRCxLQUFLcGlFLFdBQUwsR0FBcUJ6eEMsU0FBMUIsQ0FBc0MyOUMsU0FBU2xNLFdBQVQsQ0FBdUJ1eUUsV0FBWW5RLEtBQUtwaUUsV0FBakIsQ0FBdkIsQ0FFdEMsR0FBS29pRSxLQUFLbGlFLE1BQUwsR0FBZ0IzeEMsU0FBckIsQ0FBaUMyOUMsU0FBU2hNLE1BQVQsQ0FBa0JxeUUsV0FBWW5RLEtBQUtsaUUsTUFBakIsQ0FBbEIsQ0FFakMsR0FBS2tpRSxLQUFLaGlFLFlBQUwsR0FBc0I3eEMsU0FBM0IsQ0FBdUMyOUMsU0FBUzlMLFlBQVQsQ0FBd0JnaUUsS0FBS2hpRSxZQUE3QixDQUV2QyxHQUFLZ2lFLEtBQUt6aEUsUUFBTCxHQUFrQnB5QyxTQUF2QixDQUFtQzI5QyxTQUFTdkwsUUFBVCxDQUFvQjR4RSxXQUFZblEsS0FBS3poRSxRQUFqQixDQUFwQixDQUNuQyxHQUFLeWhFLEtBQUt4aEUsaUJBQUwsR0FBMkJyeUMsU0FBaEMsQ0FBNEMyOUMsU0FBU3RMLGlCQUFULENBQTZCd2hFLEtBQUt4aEUsaUJBQWxDLENBRTVDLEdBQUt3aEUsS0FBSzVoRSxLQUFMLEdBQWVqeUMsU0FBcEIsQ0FBZ0MyOUMsU0FBUzFMLEtBQVQsQ0FBaUIreEUsV0FBWW5RLEtBQUs1aEUsS0FBakIsQ0FBakIsQ0FDaEMsR0FBSzRoRSxLQUFLM2hFLGNBQUwsR0FBd0JseUMsU0FBN0IsQ0FBeUMyOUMsU0FBU3pMLGNBQVQsQ0FBMEIyaEUsS0FBSzNoRSxjQUEvQixDQUV6QyxHQUFLMmhFLEtBQUt0Z0UsV0FBTCxHQUFxQnZ6QyxTQUExQixDQUFzQzI5QyxTQUFTcEssV0FBVCxDQUF1Qnl3RSxXQUFZblEsS0FBS3RnRSxXQUFqQixDQUF2QixDQUV0QyxlQUFBLENBRUEsQ0F4SnVDLENBQXpDLEVBNEpBOztLQUlBLDZCQUFBLENBQStCdTdELE9BQS9CLENBQXlDLENBRXhDLEtBQUtBLE9BQUwsQ0FBaUJBLFVBQVk5dUcsU0FBZCxDQUE0Qjh1RyxPQUE1QixDQUFzQ0MscUJBQXJELENBRUEsQ0FFRHAwRyxPQUFPNG5CLE1BQVAsQ0FBZTBoRyxxQkFBcUJycEgsU0FBcEMsQ0FBK0MsQ0FFOUNxMEcsS0FBTSxTQUFXaHhFLEdBQVgsQ0FBZ0IrdkUsTUFBaEIsQ0FBd0JDLFVBQXhCLENBQW9DQyxPQUFwQyxDQUE4QyxDQUVuRCxVQUFZLElBQVosQ0FFQSxXQUFhLGNBQUEsQ0FBZ0Jwc0UsTUFBTWd0RSxPQUF0QixDQUFiLENBQ0FpQyxPQUFPOUIsSUFBUCxDQUFhaHhFLEdBQWIsQ0FBa0IsU0FBVzhyRSxJQUFYLENBQWtCLENBRW5DaUUsT0FBUWxzRSxNQUFNa2MsS0FBTixDQUFhdGlDLEtBQUtzaUMsS0FBTCxDQUFZK3JELElBQVosQ0FBYixDQUFSLEVBRUEsQ0FKRCxDQUlHa0UsVUFKSCxDQUllQyxPQUpmLEVBTUEsQ0FiNkMsQ0FlOUNsd0QsTUFBTyxTQUFXNjFELElBQVgsQ0FBa0IsQ0FFeEIsYUFBZSxrQkFBQSxFQUFmLENBRUEsVUFBWUEsS0FBSzlpRyxJQUFMLENBQVV6SSxLQUF0QixDQUVBLEdBQUtBLFFBQVV0SSxTQUFmLENBQTJCLENBRTFCLGVBQWlCLGlCQUFrQnNJLE1BQU1qTSxJQUFwQixDQUFKLENBQWdDaU0sTUFBTW1aLEtBQXRDLENBQWpCLENBQ0FrZ0IsU0FBU2tuQixRQUFULENBQW1CLG1CQUFBLENBQXFCcTdELFVBQXJCLENBQWlDLENBQWpDLENBQW5CLEVBRUEsQ0FFRCxlQUFpQnJRLEtBQUs5aUcsSUFBTCxDQUFVaXhCLFVBQTNCLENBRUEsSUFBTSxPQUFOLGNBQUEsQ0FBOEIsQ0FFN0IsY0FBZ0JBLFdBQVk3Z0MsR0FBWixDQUFoQixDQUNBLGVBQWlCLGlCQUFrQmdvQixVQUFVOXNCLElBQXhCLENBQUosQ0FBb0M4c0IsVUFBVTFILEtBQTlDLENBQWpCLENBRUFrZ0IsU0FBU29uQixZQUFULENBQXVCNW5ELEdBQXZCLENBQTRCLG1CQUFBLENBQXFCK2lILFVBQXJCLENBQWlDLzZGLFVBQVUrOEIsUUFBM0MsQ0FBcUQvOEIsVUFBVWc5QixVQUEvRCxDQUE1QixFQUVBLENBRUQsV0FBYTB0RCxLQUFLOWlHLElBQUwsQ0FBVXV3QyxNQUFWLEVBQW9CdXlELEtBQUs5aUcsSUFBTCxDQUFVb3pHLFNBQTlCLEVBQTJDdFEsS0FBSzlpRyxJQUFMLENBQVVxekcsT0FBbEUsQ0FFQSxHQUFLOWlFLFNBQVd0aEQsU0FBaEIsQ0FBNEIsQ0FFM0IsSUFBTSxNQUFRLENBQVIsQ0FBV2lrQixFQUFJcTlCLE9BQU9qZ0QsTUFBNUIsQ0FBb0NLLElBQU11aUIsQ0FBMUMsQ0FBNkMsRUFBR3ZpQixDQUFoRCxDQUFvRCxDQUVuRCxVQUFZNC9DLE9BQVE1L0MsQ0FBUixDQUFaLENBRUFpZ0MsU0FBU3VuQixRQUFULENBQW1CM0gsTUFBTXJjLEtBQXpCLENBQWdDcWMsTUFBTW54QixLQUF0QyxDQUE2Q214QixNQUFNcEMsYUFBbkQsRUFFQSxDQUVELENBRUQsbUJBQXFCMDBELEtBQUs5aUcsSUFBTCxDQUFVcTJCLGNBQS9CLENBRUEsR0FBS0EsaUJBQW1CcG5DLFNBQXhCLENBQW9DLENBRW5DLFdBQWEsV0FBQSxFQUFiLENBRUEsR0FBS29uQyxlQUFlN2QsTUFBZixHQUEwQnZwQixTQUEvQixDQUEyQyxDQUUxQ3VwQixPQUFPUixTQUFQLENBQWtCcWUsZUFBZTdkLE1BQWpDLEVBRUEsQ0FFRG9ZLFNBQVN5RixjQUFULENBQTBCLFVBQUEsQ0FBWTdkLE1BQVosQ0FBb0I2ZCxlQUFlaE4sTUFBbkMsQ0FBMUIsQ0FFQSxDQUVELGVBQUEsQ0FFQSxDQXZFNkMsQ0FBL0MsRUEyRUEsaUJBQW1CLENBQ2xCaXFGLFVBQVdBLFNBRE8sQ0FFbEJDLFdBQVlBLFVBRk07RUFJbEJDLGtCQUFtQix3QkFBQSxHQUE2QixXQUE3QixDQUEyQ0EsaUJBQTNDLENBQStERCxVQUpoRSxDQUtsQkUsV0FBWUEsVUFMTSxDQU1sQkMsWUFBYUEsV0FOSyxDQU9sQkMsV0FBWUEsVUFQTSxDQVFsQkMsWUFBYUEsV0FSSyxDQVNsQnpFLGFBQWNBLFlBVEksQ0FVbEIwRSxhQUFjQSxZQVZJLENBQW5CLENBYUE7O0tBSUEsZUFBQSxFQUFrQixFQUVsQkMsT0FBT0MsUUFBUCxDQUFrQixDQUVqQkMsU0FBVSxFQUZPLENBSWpCeCtGLElBQUssU0FBV3krRixLQUFYLENBQWtCalUsTUFBbEIsQ0FBMkIsQ0FFL0IsS0FBS2dVLFFBQUwsQ0FBY2xrSCxJQUFkLENBQW9CbWtILEtBQXBCLENBQTJCalUsTUFBM0IsRUFFQSxDQVJnQixDQVVqQjNyRyxJQUFLLFNBQVcyb0csSUFBWCxDQUFrQixDQUV0QixhQUFlLEtBQUtnWCxRQUFwQixDQUVBLElBQU0sTUFBUSxDQUFSLENBQVc1Z0gsRUFBSTRnSCxTQUFTMWpILE1BQTlCLENBQXNDSyxFQUFJeUMsQ0FBMUMsQ0FBNkN6QyxHQUFLLENBQWxELENBQXNELENBRXJELFVBQVlxakgsU0FBVXJqSCxDQUFWLENBQVosQ0FDQSxXQUFhcWpILFNBQVVyakgsRUFBSSxDQUFkLENBQWIsQ0FFQSxHQUFLc2pILE1BQU05bEcsSUFBTixDQUFZNnVGLElBQVosQ0FBTCxDQUEwQixDQUV6QixhQUFBLENBRUEsQ0FFRCxDQUVELFdBQUEsQ0FFQSxDQTdCZ0IsQ0FBbEIsQ0FpQ0FwekcsT0FBTzRuQixNQUFQLENBQWVzaUcsT0FBT2pxSCxTQUF0QixDQUFpQyxDQUVoQzQyRyxZQUFheHhHLFNBRm1CLENBSWhDaWxILFlBQWEsVUFBWSxFQUpPLENBTWhDQyxlQUFnQixVQUFZLEVBTkksQ0FRaENDLGVBQWdCLFVBQVksRUFSSSxDQVVoQ0MsY0FBZSxTQUFXaG9FLFNBQVgsQ0FBc0Jpb0UsV0FBdEIsQ0FBbUM3VCxXQUFuQyxDQUFpRCxDQUUvRCxVQUFZLEVBQVosQ0FFQSxJQUFNLE1BQVEsQ0FBZCxDQUFpQjl2RyxFQUFJMDdDLFVBQVUvN0MsTUFBL0IsQ0FBdUMsRUFBR0ssQ0FBMUMsQ0FBOEMsQ0FFN0MrZixNQUFPL2YsQ0FBUCxFQUFhLEtBQUs0akgsY0FBTCxDQUFxQmxvRSxVQUFXMTdDLENBQVgsQ0FBckIsQ0FBcUMyakgsV0FBckMsQ0FBa0Q3VCxXQUFsRCxDQUFiLENBRUEsQ0FFRCxZQUFBLENBRUEsQ0F0QitCLENBd0JoQzhULGVBQWtCLFVBQVksQ0FFN0IsaUJBQW1CLENBQ2xCbHRDLFdBQVlBLFVBRE0sQ0FFbEI3ckIsZUFBZ0JBLGNBRkUsQ0FHbEJnNUQsaUJBQWtCQSxnQkFIQSxDQUlsQkMsb0JBQXFCQSxtQkFKSCxDQUtsQkMsaUJBQWtCQSxnQkFMQSxDQU1sQnB0QyxlQUFnQkEsY0FORSxDQUFuQixDQVNBLFVBQVksU0FBQSxFQUFaLENBQ0Esa0JBQW9CLGlCQUFBLEVBQXBCLENBQ0EsbUJBQXFCLGtCQUFBLEVBQXJCLENBRUEsOEJBQU8sQ0FBeUJuMEQsQ0FBekIsQ0FBNEJtaEcsV0FBNUIsQ0FBeUM3VCxXQUF6QyxDQUF1RDtFQUk3RCxhQUFlLEVBQWYsQ0FFQSxvQkFBQSxDQUFzQjN2QyxJQUF0QixDQUE0QnBsQyxNQUE1QixDQUFvQ3pULE1BQXBDLENBQTRDOXNCLElBQTVDLENBQWtEMC9CLFVBQWxELENBQStELENBRTlELGFBQWV5cEYsWUFBY3hqRCxJQUE3QixDQUNBLFdBQWFnakQsT0FBT0MsUUFBUCxDQUFnQjEvRyxHQUFoQixDQUFxQnNnSCxRQUFyQixDQUFiLENBRUEsV0FBQSxDQUVBLEdBQUszVSxTQUFXLElBQWhCLENBQXVCLENBRXRCN3hFLFFBQVU2eEUsT0FBTzlCLElBQVAsQ0FBYXlXLFFBQWIsQ0FBVixDQUVBLENBSkQsSUFJTyxDQUVOQyxjQUFjalUsY0FBZCxDQUE4QkYsV0FBOUIsRUFDQXR5RSxRQUFVeW1GLGNBQWMxVyxJQUFkLENBQW9CeVcsUUFBcEIsQ0FBVixDQUVBLENBRUQsR0FBS2pwRixTQUFXejhCLFNBQWhCLENBQTRCLENBRTNCay9CLFFBQVF6QyxNQUFSLENBQWUxVCxTQUFmLENBQTBCMFQsTUFBMUIsRUFFQSxHQUFLQSxPQUFRLENBQVIsSUFBZ0IsQ0FBckIsQ0FBeUJ5QyxRQUFRM0QsS0FBUixDQUFnQmttRCxjQUFoQixDQUN6QixHQUFLaGxELE9BQVEsQ0FBUixJQUFnQixDQUFyQixDQUF5QnlDLFFBQVExRCxLQUFSLENBQWdCaW1ELGNBQWhCLENBRXpCLENBRUQsR0FBS3o0RCxTQUFXaHBCLFNBQWhCLENBQTRCLENBRTNCay9CLFFBQVFsVyxNQUFSLENBQWVELFNBQWYsQ0FBMEJDLE1BQTFCLEVBRUEsQ0FFRCxHQUFLOXNCLE9BQVM4RCxTQUFkLENBQTBCLENBRXpCLEdBQUs5RCxLQUFNLENBQU4sSUFBYyxRQUFuQixDQUE4QmdqQyxRQUFRM0QsS0FBUixDQUFnQmttRCxjQUFoQixDQUM5QixHQUFLdmxGLEtBQU0sQ0FBTixJQUFjLFFBQW5CLENBQThCZ2pDLFFBQVEzRCxLQUFSLENBQWdCb21ELHNCQUFoQixDQUU5QixHQUFLemxGLEtBQU0sQ0FBTixJQUFjLFFBQW5CLENBQThCZ2pDLFFBQVExRCxLQUFSLENBQWdCaW1ELGNBQWhCLENBQzlCLEdBQUt2bEYsS0FBTSxDQUFOLElBQWMsUUFBbkIsQ0FBOEJnakMsUUFBUTFELEtBQVIsQ0FBZ0JtbUQsc0JBQWhCLENBRTlCLENBRUQsR0FBSy9sRCxhQUFlNTdCLFNBQXBCLENBQWdDLENBRS9Cay9CLFFBQVF0RCxVQUFSLENBQXFCQSxVQUFyQixDQUVBLENBRUQsU0FBV3ZXLE1BQU03QixZQUFOLEVBQVgsQ0FFQThaLFNBQVV2QixJQUFWLEVBQW1CbUQsT0FBbkIsQ0FFQSxXQUFBLENBRUEsQ0FFRDtFQUVBLFNBQVcsQ0FDVm5ELEtBQU0xVyxNQUFNN0IsWUFBTixFQURJLENBRVZubkIsS0FBTSxxQkFGSSxDQUFYLENBS0EsSUFBTSxRQUFOLEtBQUEsQ0FBc0IsQ0FFckIsVUFBWTZuQixFQUFHeG1CLElBQUgsQ0FBWixDQUVBLE9BQVNBLElBQVQsRUFFQyxJQUFLLFVBQUwsQ0FDQSxJQUFLLFVBQUwsQ0FDQSxJQUFLLGdCQUFMLENBQ0EsSUFBSyxjQUFMLENBQ0MsTUFDRCxJQUFLLFNBQUwsQ0FDQ20yRyxLQUFLbjJHLElBQUwsQ0FBWVcsS0FBWixDQUNBLE1BQ0QsSUFBSyxVQUFMLENBQ0N3MUcsS0FBS3ZuRCxRQUFMLENBQWdCczVELGFBQWN2bkgsS0FBZCxDQUFoQixDQUNBLE1BQ0QsSUFBSyxjQUFMLENBQ0EsSUFBSyxZQUFMLENBQ0NzWSxRQUFRNlAsSUFBUixDQUFjLDhCQUFkLENBQThDOW9CLElBQTlDLENBQW9ELHlCQUFwRCxFQUNBLE1BQ0QsSUFBSyxjQUFMLENBQ0NtMkcsS0FBS2prRSxLQUFMLENBQWFBLE1BQU03bUIsU0FBTixDQUFpQjFxQixLQUFqQixFQUF5Qmt5QyxNQUF6QixFQUFiLENBQ0EsTUFDRCxJQUFLLGVBQUwsQ0FDQ3NqRSxLQUFLOTlELFFBQUwsQ0FBZ0JuRyxNQUFNN21CLFNBQU4sQ0FBaUIxcUIsS0FBakIsRUFBeUJreUMsTUFBekIsRUFBaEIsQ0FDQSxNQUNELElBQUssZUFBTCxDQUNDc2pFLEtBQUtoK0QsUUFBTCxDQUFnQmpHLE1BQU03bUIsU0FBTixDQUFpQjFxQixLQUFqQixFQUF5Qmt5QyxNQUF6QixFQUFoQixDQUNBLE1BQ0QsSUFBSyxjQUFMLENBQ0NzakUsS0FBSzc5RCxTQUFMLENBQWlCMzNDLEtBQWpCLENBQ0EsTUFDRCxJQUFLLFNBQUwsQ0FDQyxHQUFLQSxNQUFNc3hHLFdBQU4sS0FBd0IsT0FBN0IsQ0FBdUNrRSxLQUFLeDNHLElBQUwsQ0FBWSxtQkFBWixDQUN2QyxHQUFLZ0MsTUFBTXN4RyxXQUFOLEtBQXdCLE9BQTdCLENBQXVDa0UsS0FBS3gzRyxJQUFMLENBQVksbUJBQVosQ0FDdkMsR0FBS2dDLE1BQU1zeEcsV0FBTixLQUF3QixVQUE3QixDQUEwQ2tFLEtBQUt4M0csSUFBTCxDQUFZLHNCQUFaLENBQzFDLE1BQ0QsSUFBSyxZQUFMLENBQ0N3M0csS0FBS3hpRSxHQUFMLENBQVc4L0QsWUFBYTl5RyxLQUFiLENBQW9CNmxCLEVBQUUyaEcsZ0JBQXRCLENBQXdDM2hHLEVBQUU0aEcsZ0JBQTFDLENBQTRENWhHLEVBQUU2aEcsY0FBOUQsQ0FBOEU3aEcsRUFBRThoRyxvQkFBaEYsQ0FBWCxDQUNBLE1BQ0QsSUFBSyxrQkFBTCxDQUNBLElBQUssa0JBQUwsQ0FDQSxJQUFLLGdCQUFMLENBQ0EsSUFBSyxzQkFBTCxDQUNDLE1BQ0QsSUFBSyxhQUFMLENBQ0NuUyxLQUFLdGhFLFdBQUwsQ0FBbUI0K0QsWUFBYTl5RyxLQUFiLENBQW9CNmxCLEVBQUUraEcsaUJBQXRCLENBQXlDL2hHLEVBQUVnaUcsaUJBQTNDLENBQThEaGlHLEVBQUVpaUcsZUFBaEUsQ0FBaUZqaUcsRUFBRWtpRyxxQkFBbkYsQ0FBbkIsQ0FDQSxNQUNELElBQUssbUJBQUwsQ0FDQSxJQUFLLG1CQUFMLENBQ0EsSUFBSyxpQkFBTCxDQUNBLElBQUssdUJBQUwsQ0FDQyxNQUNELElBQUssVUFBTCxDQUNDdlMsS0FBS3poRSxRQUFMLENBQWdCKytELFlBQWE5eUcsS0FBYixDQUFvQjZsQixFQUFFbWlHLGNBQXRCLENBQXNDbmlHLEVBQUVvaUcsY0FBeEMsQ0FBd0RwaUcsRUFBRXFpRyxZQUExRCxDQUF3RXJpRyxFQUFFc2lHLGtCQUExRSxDQUFoQixDQUNBLE1BQ0QsSUFBSyxnQkFBTCxDQUNBLElBQUssZ0JBQUwsQ0FDQSxJQUFLLGNBQUwsQ0FDQSxJQUFLLG9CQUFMLENBQ0MsTUFDRCxJQUFLLE9BQUwsQ0FDQzNTLEtBQUs1aEUsS0FBTCxDQUFhay9ELFlBQWE5eUcsS0FBYixDQUFvQjZsQixFQUFFdWlHLFdBQXRCLENBQW1DdmlHLEVBQUV3aUcsV0FBckMsQ0FBa0R4aUcsRUFBRXlpRyxTQUFwRCxDQUErRHppRyxFQUFFMGlHLGVBQWpFLENBQWIsQ0FDQSxNQUNELElBQUssYUFBTCxDQUNBLElBQUssYUFBTCxDQUNBLElBQUssV0FBTCxDQUNBLElBQUssaUJBQUwsQ0FDQyxNQUNELElBQUssU0FBTCxDQUNDL1MsS0FBS3BoRSxPQUFMLENBQWUwK0QsWUFBYTl5RyxLQUFiLENBQW9CNmxCLEVBQUUyaUcsYUFBdEIsQ0FBcUMzaUcsRUFBRTRpRyxhQUF2QyxDQUFzRDVpRyxFQUFFNmlHLFdBQXhELENBQXFFN2lHLEVBQUU4aUcsaUJBQXZFLENBQWYsQ0FDQSxNQUNELElBQUssY0FBTCxDQUNDblQsS0FBS25oRSxTQUFMLENBQWlCcjBDLEtBQWpCLENBQ0EsTUFDRCxJQUFLLGVBQUwsQ0FDQSxJQUFLLGVBQUwsQ0FDQSxJQUFLLGFBQUwsQ0FDQSxJQUFLLG1CQUFMLENBQ0MsTUFDRCxJQUFLLFdBQUwsQ0FDQ3cxRyxLQUFLamhFLFNBQUwsQ0FBaUJ1K0QsWUFBYTl5RyxLQUFiLENBQW9CNmxCLEVBQUUraUcsZUFBdEIsQ0FBdUMvaUcsRUFBRWdqRyxlQUF6QyxDQUEwRGhqRyxFQUFFaWpHLGFBQTVELENBQTJFampHLEVBQUVrakcsbUJBQTdFLENBQWpCLENBQ0EsTUFDRCxJQUFLLGlCQUFMLENBQ0N2VCxLQUFLaGhFLFdBQUwsQ0FBbUJ4MEMsS0FBbkIsQ0FDQSxNQUNELElBQUssaUJBQUwsQ0FDQSxJQUFLLGlCQUFMLENBQ0EsSUFBSyxlQUFMLENBQ0EsSUFBSyxxQkFBTCxDQUNDLE1BQ0QsSUFBSyxhQUFMLENBQ0N3MUcsS0FBS3BpRSxXQUFMLENBQW1CMC9ELFlBQWE5eUcsS0FBYixDQUFvQjZsQixFQUFFbWpHLGlCQUF0QixDQUF5Q25qRyxFQUFFb2pHLGlCQUEzQyxDQUE4RHBqRyxFQUFFcWpHLGVBQWhFLENBQWlGcmpHLEVBQUVzakcscUJBQW5GLENBQW5CLENBQ0EsTUFDRCxJQUFLLG1CQUFMLENBQ0EsSUFBSyxtQkFBTCxDQUNBLElBQUssaUJBQUwsQ0FDQSxJQUFLLHVCQUFMLENBQ0MsTUFDRCxJQUFLLGNBQUwsQ0FDQzNULEtBQUt4Z0UsWUFBTCxDQUFvQjg5RCxZQUFhOXlHLEtBQWIsQ0FBb0I2bEIsRUFBRXVqRyxrQkFBdEIsQ0FBMEN2akcsRUFBRXdqRyxrQkFBNUMsQ0FBZ0V4akcsRUFBRXlqRyxnQkFBbEUsQ0FBb0Z6akcsRUFBRTBqRyxzQkFBdEYsQ0FBcEIsQ0FDQSxNQUNELElBQUssb0JBQUwsQ0FDQSxJQUFLLG9CQUFMLENBQ0EsSUFBSyxrQkFBTCxDQUNBLElBQUssd0JBQUwsQ0FDQyxNQUNELElBQUssY0FBTCxDQUNDL1QsS0FBSzFnRSxZQUFMLENBQW9CZytELFlBQWE5eUcsS0FBYixDQUFvQjZsQixFQUFFMmpHLGtCQUF0QixDQUEwQzNqRyxFQUFFNGpHLGtCQUE1QyxDQUFnRTVqRyxFQUFFNmpHLGdCQUFsRSxDQUFvRjdqRyxFQUFFOGpHLHNCQUF0RixDQUFwQixDQUNBLE1BQ0QsSUFBSyxvQkFBTCxDQUNBLElBQUssb0JBQUwsQ0FDQSxJQUFLLGtCQUFMLENBQ0EsSUFBSyx3QkFBTCxDQUNDLE1BQ0QsSUFBSyxVQUFMLENBQ0NuVSxLQUFLdGlFLFFBQUwsQ0FBZ0I0L0QsWUFBYTl5RyxLQUFiLENBQW9CNmxCLEVBQUUrakcsY0FBdEIsQ0FBc0MvakcsRUFBRWdrRyxjQUF4QyxDQUF3RGhrRyxFQUFFaWtHLFlBQTFELENBQXdFamtHLEVBQUVra0csa0JBQTFFLENBQWhCLENBQ0EsTUFDRCxJQUFLLGdCQUFMLENBQ0EsSUFBSyxnQkFBTCxDQUNBLElBQUssY0FBTCxDQUNBLElBQUssb0JBQUwsQ0FDQyxNQUNELElBQUssV0FBTCxDQUNDdlUsS0FBS3JuRCxJQUFMLENBQVl5SixRQUFaLENBQ0EsTUFDRCxJQUFLLGFBQUwsQ0FDQzQ5QyxLQUFLcm5ELElBQUwsQ0FBWTBKLFVBQVosQ0FDQSxNQUNELElBQUssY0FBTCxDQUNDdi9DLFFBQVE2UCxJQUFSLENBQWMsdUVBQWQsRUFDQXF0RixLQUFLemlFLE9BQUwsQ0FBZS95QyxLQUFmLENBQ0EsTUFDRCxJQUFLLFdBQUwsQ0FDQSxJQUFLLFlBQUwsQ0FDQSxJQUFLLFlBQUwsQ0FDQSxJQUFLLFNBQUwsQ0FDQSxJQUFLLGNBQUwsQ0FDQSxJQUFLLGFBQUwsQ0FDQSxJQUFLLFNBQUwsQ0FDQSxJQUFLLFdBQUwsQ0FDQ3cxRyxLQUFNbjJHLElBQU4sRUFBZVcsS0FBZixDQUNBLE1BQ0QsSUFBSyxjQUFMLENBQ0MsR0FBS0EsUUFBVSxJQUFmLENBQXNCdzFHLEtBQUt4MEQsWUFBTCxDQUFvQmdwRSxZQUFwQixDQUN0QixHQUFLaHFILFFBQVUsTUFBZixDQUF3QncxRyxLQUFLeDBELFlBQUwsQ0FBb0JpcEUsVUFBcEIsQ0FDeEIsTUFDRCxRQUNDM3hHLFFBQVFNLEtBQVIsQ0FBZSwwQ0FBZixDQUEyRHZaLElBQTNELENBQWlFVyxLQUFqRSxFQUNBLE1BbEpGLENBc0pBLENBRUQsR0FBS3cxRyxLQUFLeDNHLElBQUwsR0FBYyxtQkFBbkIsQ0FBeUMsWUFBWXc1QyxRQUFaLENBQ3pDLEdBQUtnK0QsS0FBS3gzRyxJQUFMLEdBQWMsbUJBQW5CLENBQXlDLFlBQVkwNUMsUUFBWixDQUV6QyxHQUFLODlELEtBQUt6aUUsT0FBTCxDQUFlLENBQXBCLENBQXdCeWlFLEtBQUtqbkQsV0FBTCxDQUFtQixJQUFuQixDQUV4QjI3RCxlQUFlekUsV0FBZixDQUE0QnhtRixRQUE1QixFQUVBLHNCQUFzQjBnQixLQUFmLENBQXNCNjFELElBQXRCLENBQVAsQ0FFQSxDQTNPRCxDQTZPQSxDQTVQZSxFQXhCZ0IsQ0FBakMsRUF3UkE7O0tBSUEsZ0JBQWtCLENBRWpCMlUsV0FBWSxTQUFXL21HLEtBQVgsQ0FBbUIsQ0FFOUIsR0FBSyxrQkFBQSxHQUF1QixXQUE1QixDQUEwQyxDQUV6QyxzQkFBTyxHQUFrQmduRyxNQUFsQixDQUEwQmhuRyxLQUExQixDQUFQLENBRUEsQ0FFRDtFQUNBO0VBRUEsTUFBUSxFQUFSLENBRUEsSUFBTSxNQUFRLENBQVIsQ0FBV3FmLEdBQUtyZixNQUFNcGdCLE1BQTVCLENBQW9DSyxFQUFJby9CLEVBQXhDLENBQTRDcC9CLEdBQTVDLENBQW1EO0VBR2xEdUMsR0FBS0gsT0FBTzRrSCxZQUFQLENBQXFCam5HLE1BQU8vZixDQUFQLENBQXJCLENBQUwsQ0FFQSxDQUVEO0VBQ0EsMEJBQTJCaW5ILE9BQVExa0gsQ0FBUixDQUFwQixDQUFQLENBRUEsQ0F6QmdCLENBMkJqQjJrSCxlQUFnQixTQUFXM3FGLEdBQVgsQ0FBaUIsQ0FFaEMsVUFBWUEsSUFBSTRxRixXQUFKLENBQWlCLEdBQWpCLENBQVosQ0FFQSxHQUFLdmdILFFBQVUsQ0FBRSxDQUFqQixDQUFxQixPQUFPLElBQVAsQ0FFckIsV0FBV21wRyxNQUFKLENBQVksQ0FBWixDQUFlbnBHLE1BQVEsQ0FBdkIsQ0FBUCxDQUVBLENBbkNnQixDQUFsQixDQXVDQTs7O0tBS0EsbUJBQUEsQ0FBcUJ3bUcsT0FBckIsQ0FBK0IsQ0FFOUIsR0FBSyxjQUFBLEdBQW1CLFNBQXhCLENBQW9DLENBRW5DbjRGLFFBQVE2UCxJQUFSLENBQWMsMkVBQWQsRUFDQXNvRixRQUFVOXVHLFNBQVYsQ0FFQSxDQUVELEtBQUs4dUcsT0FBTCxDQUFpQkEsVUFBWTl1RyxTQUFkLENBQTRCOHVHLE9BQTVCLENBQXNDQyxxQkFBckQsQ0FFQSxLQUFLb0IsZUFBTCxDQUF1QixLQUF2QixDQUVBLENBRUR4MUcsT0FBTzRuQixNQUFQLENBQWV1bUcsV0FBV2x1SCxTQUExQixDQUFxQyxDQUVwQ3EwRyxLQUFNLFNBQVdoeEUsR0FBWCxDQUFnQit2RSxNQUFoQixDQUF3QkMsVUFBeEIsQ0FBb0NDLE9BQXBDLENBQThDLENBRW5ELFVBQVksSUFBWixDQUVBLGdCQUFrQixLQUFLbVgsV0FBTCxFQUFzQixZQUFZQSxXQUFaLEdBQTRCLFFBQWxELENBQStELEtBQUtBLFdBQXBFLENBQWtGMEQsWUFBWUgsY0FBWixDQUE0QjNxRixHQUE1QixDQUFwRyxDQUVBLFdBQWEsY0FBQSxDQUFnQixLQUFLNndFLE9BQXJCLENBQWIsQ0FDQWlDLE9BQU9KLGtCQUFQLENBQTJCLEtBQUtSLGVBQWhDLEVBQ0FZLE9BQU85QixJQUFQLENBQWFoeEUsR0FBYixDQUFrQixTQUFXOHJFLElBQVgsQ0FBa0IsQ0FFbkMsU0FBV3J1RixLQUFLc2lDLEtBQUwsQ0FBWStyRCxJQUFaLENBQVgsQ0FDQSxhQUFlOEosS0FBSzkxRSxRQUFwQixDQUVBLEdBQUtBLFdBQWEvOUIsU0FBbEIsQ0FBOEIsQ0FFN0IsU0FBVys5QixTQUFTMWhDLElBQXBCLENBRUEsR0FBS0EsT0FBUzJELFNBQWQsQ0FBMEIsQ0FFekIsR0FBSzNELEtBQUtzekcsV0FBTCxLQUF1QixRQUE1QixDQUF1QyxDQUV0Q2g1RixRQUFRTSxLQUFSLENBQWUscUJBQXVCZ25CLEdBQXZCLENBQTZCLG9EQUE1QyxFQUNBLE9BRUEsQ0FFRCxDQUVELENBRUQsV0FBYTZELE1BQU1rYyxLQUFOLENBQWE2MUQsSUFBYixDQUFtQndSLFdBQW5CLENBQWIsQ0FDQXJYLE9BQVE5c0csT0FBT3lnQyxRQUFmLENBQXlCemdDLE9BQU9rOEMsU0FBaEMsRUFFQSxDQXpCRCxDQXlCRzZ3RCxVQXpCSCxDQXlCZUMsT0F6QmYsRUEyQkEsQ0FyQ21DLENBdUNwQzhhLGVBQWdCLFNBQVczcUgsS0FBWCxDQUFtQixDQUVsQyxLQUFLZ25ILFdBQUwsQ0FBbUJobkgsS0FBbkIsQ0FFQSxDQTNDbUMsQ0E2Q3BDMi9DLE1BQVMsVUFBWSxDQUVwQixtQkFBQSxDQUFxQjYxRCxJQUFyQixDQUEyQmx5RSxRQUEzQixDQUFzQyxDQUVyQyxpQkFBQSxDQUFtQnRqQyxLQUFuQixDQUEwQmkwQixRQUExQixDQUFxQyxDQUVwQyxhQUFpQixHQUFLQSxRQUF0QixDQUVBLENBRUQsS0FBQSxDQUFPaFYsQ0FBUCxDQUFVMnJHLEVBQVYsQ0FFQ2pnRyxNQUZELENBRVNrZ0csT0FGVCxDQUlDQyxVQUpELENBSWFDLFdBSmIsQ0FJMEJDLE9BSjFCLENBSW1DbHFFLGFBSm5DLENBTUM5aUQsSUFORCxDQU9DaXRILE1BUEQsQ0FRQ3hrRSxXQVJELENBU0NFLGVBVEQsQ0FVQ0MsYUFWRCxDQVVnQkMsbUJBVmhCLENBV0NDLFlBWEQsQ0FXZUMsa0JBWGYsQ0FhQzNFLE1BYkQsQ0FhU0MsSUFiVCxDQWFlNm9FLEtBYmYsQ0Fhc0JDLEtBYnRCLENBYTZCajZFLEdBYjdCLENBYWtDelYsTUFibEMsQ0FlQzJ2RixPQWZELENBZVVwckYsRUFmVixDQWVjd1EsQ0FmZCxDQWVpQjk2QixDQWZqQixDQWlCQzByQyxNQUFRbzBELEtBQUtwMEQsS0FqQmQsQ0FrQkM1ZCxTQUFXZ3lFLEtBQUtoeUUsUUFsQmpCLENBbUJDb2YsUUFBVTR5RCxLQUFLNXlELE9BbkJoQixDQW9CQ3pCLE9BQVNxMEQsS0FBS3IwRCxNQXBCZixDQXNCQ251QixNQUFRd2lGLEtBQUt4aUYsS0F0QmQsQ0F3QkNxNEYsVUFBWSxDQXhCYixDQTJCQSxHQUFLN1YsS0FBSzF5RCxHQUFMLEdBQWFuaEQsU0FBbEIsQ0FBOEI7RUFJN0IsSUFBTTBCLEVBQUksQ0FBVixDQUFhQSxFQUFJbXlHLEtBQUsxeUQsR0FBTCxDQUFTOS9DLE1BQTFCLENBQWtDSyxHQUFsQyxDQUF5QyxDQUV4QyxHQUFLbXlHLEtBQUsxeUQsR0FBTCxDQUFVei9DLENBQVYsRUFBY0wsTUFBbkIsQ0FBNEJxb0gsWUFFNUIsQ0FFRCxJQUFNaG9ILEVBQUksQ0FBVixDQUFhQSxFQUFJZ29ILFNBQWpCLENBQTRCaG9ILEdBQTVCLENBQW1DLENBRWxDaWdDLFNBQVMrZCxhQUFULENBQXdCaCtDLENBQXhCLEVBQThCLEVBQTlCLENBRUEsQ0FFRCxDQUVEc25CLE9BQVMsQ0FBVCxDQUNBa2dHLFFBQVVybkYsU0FBU3hnQyxNQUFuQixDQUVBLE1BQVEybkIsT0FBU2tnRyxPQUFqQixDQUEyQixDQUUxQnpvRSxPQUFTLFdBQUEsRUFBVCxDQUVBQSxPQUFPeHNDLENBQVAsQ0FBVzR0QixTQUFVN1ksUUFBVixFQUF3QnFJLEtBQW5DLENBQ0FvdkIsT0FBT2g4QixDQUFQLENBQVdvZCxTQUFVN1ksUUFBVixFQUF3QnFJLEtBQW5DLENBQ0FvdkIsT0FBT24xQixDQUFQLENBQVd1VyxTQUFVN1ksUUFBVixFQUF3QnFJLEtBQW5DLENBRUFzUSxTQUFTRSxRQUFULENBQWtCaGhDLElBQWxCLENBQXdCNC9DLE1BQXhCLEVBRUEsQ0FFRHozQixPQUFTLENBQVQsQ0FDQWtnRyxRQUFVenBFLE1BQU1wK0MsTUFBaEIsQ0FFQSxNQUFRMm5CLE9BQVNrZ0csT0FBakIsQ0FBMkIsQ0FFMUI3c0gsS0FBT29qRCxNQUFPejJCLFFBQVAsQ0FBUCxDQUVBc2dHLE9BQVNLLFNBQVV0dEgsSUFBVixDQUFnQixDQUFoQixDQUFULENBQ0F5b0QsWUFBYzZrRSxTQUFVdHRILElBQVYsQ0FBZ0IsQ0FBaEIsQ0FBZCxDQUNBMm9ELGdCQUFrQjJrRSxTQUFVdHRILElBQVYsQ0FBZ0IsQ0FBaEIsQ0FBbEIsQ0FDQTRvRCxjQUFnQjBrRSxTQUFVdHRILElBQVYsQ0FBZ0IsQ0FBaEIsQ0FBaEIsQ0FDQTZvRCxvQkFBc0J5a0UsU0FBVXR0SCxJQUFWLENBQWdCLENBQWhCLENBQXRCLENBQ0E4b0QsYUFBZXdrRSxTQUFVdHRILElBQVYsQ0FBZ0IsQ0FBaEIsQ0FBZixDQUNBK29ELG1CQUFxQnVrRSxTQUFVdHRILElBQVYsQ0FBZ0IsQ0FBaEIsQ0FBckIsQ0FFQTtFQUVBLEdBQUtpdEgsTUFBTCxDQUFjLENBRWJDLE1BQVEsU0FBQSxFQUFSLENBQ0FBLE1BQU1ubEgsQ0FBTixDQUFVcTdDLE1BQU96MkIsTUFBUCxDQUFWLENBQ0F1Z0csTUFBTXJsSCxDQUFOLENBQVV1N0MsTUFBT3oyQixPQUFTLENBQWhCLENBQVYsQ0FDQXVnRyxNQUFNMWtILENBQU4sQ0FBVTQ2QyxNQUFPejJCLE9BQVMsQ0FBaEIsQ0FBVixDQUVBd2dHLE1BQVEsU0FBQSxFQUFSLENBQ0FBLE1BQU1wbEgsQ0FBTixDQUFVcTdDLE1BQU96MkIsT0FBUyxDQUFoQixDQUFWLENBQ0F3Z0csTUFBTXRsSCxDQUFOLENBQVV1N0MsTUFBT3oyQixPQUFTLENBQWhCLENBQVYsQ0FDQXdnRyxNQUFNM2tILENBQU4sQ0FBVTQ2QyxNQUFPejJCLE9BQVMsQ0FBaEIsQ0FBVixDQUVBQSxRQUFVLENBQVYsQ0FFQSxHQUFLODdCLFdBQUwsQ0FBbUIsQ0FFbEIzRixjQUFnQk0sTUFBT3oyQixRQUFQLENBQWhCLENBQ0F1Z0csTUFBTXBxRSxhQUFOLENBQXNCQSxhQUF0QixDQUNBcXFFLE1BQU1ycUUsYUFBTixDQUFzQkEsYUFBdEIsQ0FFQSxDQUVEO0VBRUE4cEUsR0FBS3RuRixTQUFTOGQsS0FBVCxDQUFlcCtDLE1BQXBCLENBRUEsR0FBSzJqRCxlQUFMLENBQXVCLENBRXRCLElBQU10akQsRUFBSSxDQUFWLENBQWFBLEVBQUlnb0gsU0FBakIsQ0FBNEJob0gsR0FBNUIsQ0FBbUMsQ0FFbEMrbkgsUUFBVTVWLEtBQUsxeUQsR0FBTCxDQUFVei9DLENBQVYsQ0FBVixDQUVBaWdDLFNBQVMrZCxhQUFULENBQXdCaCtDLENBQXhCLEVBQTZCdW5ILEVBQTdCLEVBQW9DLEVBQXBDLENBQ0F0bkYsU0FBUytkLGFBQVQsQ0FBd0JoK0MsQ0FBeEIsRUFBNkJ1bkgsR0FBSyxDQUFsQyxFQUF3QyxFQUF4QyxDQUVBLElBQU0zckcsRUFBSSxDQUFWLENBQWFBLEVBQUksQ0FBakIsQ0FBb0JBLEdBQXBCLENBQTJCLENBRTFCK3JHLFFBQVU1cEUsTUFBT3oyQixRQUFQLENBQVYsQ0FFQTZsQixFQUFJNDZFLFFBQVNKLFFBQVUsQ0FBbkIsQ0FBSixDQUNBdDFHLEVBQUkwMUcsUUFBU0osUUFBVSxDQUFWLENBQWMsQ0FBdkIsQ0FBSixDQUVBaHJGLEdBQUssV0FBQSxDQUFhd1EsQ0FBYixDQUFnQjk2QixDQUFoQixDQUFMLENBRUEsR0FBS3VKLElBQU0sQ0FBWCxDQUFlcWtCLFNBQVMrZCxhQUFULENBQXdCaCtDLENBQXhCLEVBQTZCdW5ILEVBQTdCLEVBQWtDcG9ILElBQWxDLENBQXdDdzlCLEVBQXhDLEVBQ2YsR0FBSy9nQixJQUFNLENBQVgsQ0FBZXFrQixTQUFTK2QsYUFBVCxDQUF3QmgrQyxDQUF4QixFQUE2QnVuSCxHQUFLLENBQWxDLEVBQXNDcG9ILElBQXRDLENBQTRDdzlCLEVBQTVDLEVBRWYsQ0FFRCxDQUVELENBRUQsR0FBSzRtQixhQUFMLENBQXFCLENBRXBCbWtFLFlBQWMzcEUsTUFBT3oyQixRQUFQLEVBQXFCLENBQW5DLENBRUF1Z0csTUFBTXp2RixNQUFOLENBQWE5bkIsR0FBYixDQUNDaXZDLFFBQVNtb0UsYUFBVCxDQURELENBRUNub0UsUUFBU21vRSxhQUFULENBRkQsQ0FHQ25vRSxRQUFTbW9FLFdBQVQsQ0FIRCxFQU1BSSxNQUFNMXZGLE1BQU4sQ0FBYXhULElBQWIsQ0FBbUJpakcsTUFBTXp2RixNQUF6QixFQUVBLENBRUQsR0FBS29yQixtQkFBTCxDQUEyQixDQUUxQixJQUFNeGpELEVBQUksQ0FBVixDQUFhQSxFQUFJLENBQWpCLENBQW9CQSxHQUFwQixDQUEyQixDQUUxQjBuSCxZQUFjM3BFLE1BQU96MkIsUUFBUCxFQUFxQixDQUFuQyxDQUVBOFEsT0FBUyxXQUFBLENBQ1JtbkIsUUFBU21vRSxhQUFULENBRFEsQ0FFUm5vRSxRQUFTbW9FLGFBQVQsQ0FGUSxDQUdSbm9FLFFBQVNtb0UsV0FBVCxDQUhRLENBQVQsQ0FPQSxHQUFLMW5ILElBQU0sQ0FBWCxDQUFlNm5ILE1BQU1ucUUsYUFBTixDQUFvQnYrQyxJQUFwQixDQUEwQmk1QixNQUExQixFQUNmLEdBQUtwNEIsSUFBTSxDQUFYLENBQWU4bkgsTUFBTXBxRSxhQUFOLENBQW9CditDLElBQXBCLENBQTBCaTVCLE1BQTFCLEVBRWYsQ0FFRCxDQUdELEdBQUtxckIsWUFBTCxDQUFvQixDQUVuQmdrRSxXQUFhMXBFLE1BQU96MkIsUUFBUCxDQUFiLENBQ0F1bUIsSUFBTWlRLE9BQVEycEUsVUFBUixDQUFOLENBRUFJLE1BQU0zNUUsS0FBTixDQUFZUCxNQUFaLENBQW9CRSxHQUFwQixFQUNBaTZFLE1BQU01NUUsS0FBTixDQUFZUCxNQUFaLENBQW9CRSxHQUFwQixFQUVBLENBR0QsR0FBSzZWLGtCQUFMLENBQTBCLENBRXpCLElBQU0xakQsRUFBSSxDQUFWLENBQWFBLEVBQUksQ0FBakIsQ0FBb0JBLEdBQXBCLENBQTJCLENBRTFCeW5ILFdBQWExcEUsTUFBT3oyQixRQUFQLENBQWIsQ0FDQXVtQixJQUFNaVEsT0FBUTJwRSxVQUFSLENBQU4sQ0FFQSxHQUFLem5ILElBQU0sQ0FBWCxDQUFlNm5ILE1BQU1scUUsWUFBTixDQUFtQngrQyxJQUFuQixDQUF5QixTQUFBLENBQVcwdUMsR0FBWCxDQUF6QixFQUNmLEdBQUs3dEMsSUFBTSxDQUFYLENBQWU4bkgsTUFBTW5xRSxZQUFOLENBQW1CeCtDLElBQW5CLENBQXlCLFNBQUEsQ0FBVzB1QyxHQUFYLENBQXpCLEVBRWYsQ0FFRCxDQUVENU4sU0FBUzhkLEtBQVQsQ0FBZTUrQyxJQUFmLENBQXFCMG9ILEtBQXJCLEVBQ0E1bkYsU0FBUzhkLEtBQVQsQ0FBZTUrQyxJQUFmLENBQXFCMm9ILEtBQXJCLEVBRUEsQ0FwSEQsSUFvSE8sQ0FFTjlvRSxLQUFPLFNBQUEsRUFBUCxDQUNBQSxLQUFLdDhDLENBQUwsQ0FBU3E3QyxNQUFPejJCLFFBQVAsQ0FBVCxDQUNBMDNCLEtBQUt4OEMsQ0FBTCxDQUFTdTdDLE1BQU96MkIsUUFBUCxDQUFULENBQ0EwM0IsS0FBSzc3QyxDQUFMLENBQVM0NkMsTUFBT3oyQixRQUFQLENBQVQsQ0FFQSxHQUFLODdCLFdBQUwsQ0FBbUIsQ0FFbEIzRixjQUFnQk0sTUFBT3oyQixRQUFQLENBQWhCLENBQ0EwM0IsS0FBS3ZCLGFBQUwsQ0FBcUJBLGFBQXJCLENBRUEsQ0FFRDtFQUVBOHBFLEdBQUt0bkYsU0FBUzhkLEtBQVQsQ0FBZXArQyxNQUFwQixDQUVBLEdBQUsyakQsZUFBTCxDQUF1QixDQUV0QixJQUFNdGpELEVBQUksQ0FBVixDQUFhQSxFQUFJZ29ILFNBQWpCLENBQTRCaG9ILEdBQTVCLENBQW1DLENBRWxDK25ILFFBQVU1VixLQUFLMXlELEdBQUwsQ0FBVXovQyxDQUFWLENBQVYsQ0FFQWlnQyxTQUFTK2QsYUFBVCxDQUF3QmgrQyxDQUF4QixFQUE2QnVuSCxFQUE3QixFQUFvQyxFQUFwQyxDQUVBLElBQU0zckcsRUFBSSxDQUFWLENBQWFBLEVBQUksQ0FBakIsQ0FBb0JBLEdBQXBCLENBQTJCLENBRTFCK3JHLFFBQVU1cEUsTUFBT3oyQixRQUFQLENBQVYsQ0FFQTZsQixFQUFJNDZFLFFBQVNKLFFBQVUsQ0FBbkIsQ0FBSixDQUNBdDFHLEVBQUkwMUcsUUFBU0osUUFBVSxDQUFWLENBQWMsQ0FBdkIsQ0FBSixDQUVBaHJGLEdBQUssV0FBQSxDQUFhd1EsQ0FBYixDQUFnQjk2QixDQUFoQixDQUFMLENBRUE0dEIsU0FBUytkLGFBQVQsQ0FBd0JoK0MsQ0FBeEIsRUFBNkJ1bkgsRUFBN0IsRUFBa0Nwb0gsSUFBbEMsQ0FBd0N3OUIsRUFBeEMsRUFFQSxDQUVELENBRUQsQ0FFRCxHQUFLNG1CLGFBQUwsQ0FBcUIsQ0FFcEJta0UsWUFBYzNwRSxNQUFPejJCLFFBQVAsRUFBcUIsQ0FBbkMsQ0FFQTAzQixLQUFLNW1CLE1BQUwsQ0FBWTluQixHQUFaLENBQ0NpdkMsUUFBU21vRSxhQUFULENBREQsQ0FFQ25vRSxRQUFTbW9FLGFBQVQsQ0FGRCxDQUdDbm9FLFFBQVNtb0UsV0FBVCxDQUhELEVBTUEsQ0FFRCxHQUFLbGtFLG1CQUFMLENBQTJCLENBRTFCLElBQU14akQsRUFBSSxDQUFWLENBQWFBLEVBQUksQ0FBakIsQ0FBb0JBLEdBQXBCLENBQTJCLENBRTFCMG5ILFlBQWMzcEUsTUFBT3oyQixRQUFQLEVBQXFCLENBQW5DLENBRUE4USxPQUFTLFdBQUEsQ0FDUm1uQixRQUFTbW9FLGFBQVQsQ0FEUSxDQUVSbm9FLFFBQVNtb0UsYUFBVCxDQUZRLENBR1Jub0UsUUFBU21vRSxXQUFULENBSFEsQ0FBVCxDQU1BMW9FLEtBQUt0QixhQUFMLENBQW1CditDLElBQW5CLENBQXlCaTVCLE1BQXpCLEVBRUEsQ0FFRCxDQUdELEdBQUtxckIsWUFBTCxDQUFvQixDQUVuQmdrRSxXQUFhMXBFLE1BQU96MkIsUUFBUCxDQUFiLENBQ0EwM0IsS0FBSzlRLEtBQUwsQ0FBV1AsTUFBWCxDQUFtQm1RLE9BQVEycEUsVUFBUixDQUFuQixFQUVBLENBR0QsR0FBSy9qRSxrQkFBTCxDQUEwQixDQUV6QixJQUFNMWpELEVBQUksQ0FBVixDQUFhQSxFQUFJLENBQWpCLENBQW9CQSxHQUFwQixDQUEyQixDQUUxQnluSCxXQUFhMXBFLE1BQU96MkIsUUFBUCxDQUFiLENBQ0EwM0IsS0FBS3JCLFlBQUwsQ0FBa0J4K0MsSUFBbEIsQ0FBd0IsU0FBQSxDQUFXMitDLE9BQVEycEUsVUFBUixDQUFYLENBQXhCLEVBRUEsQ0FFRCxDQUVEeG5GLFNBQVM4ZCxLQUFULENBQWU1K0MsSUFBZixDQUFxQjYvQyxJQUFyQixFQUVBLENBRUQsQ0FFRCxDQUVELGtCQUFBLENBQW9CbXpELElBQXBCLENBQTBCbHlFLFFBQTFCLENBQXFDLENBRXBDLHdCQUE0Qmt5RSxLQUFLK1YsbUJBQUwsR0FBNkI1cEgsU0FBL0IsQ0FBNkM2ekcsS0FBSytWLG1CQUFsRCxDQUF3RSxDQUFsRyxDQUVBLEdBQUsvVixLQUFLaDBELFdBQVYsQ0FBd0IsQ0FFdkIsSUFBTSxNQUFRLENBQVIsQ0FBVzE3QyxFQUFJMHZHLEtBQUtoMEQsV0FBTCxDQUFpQngrQyxNQUF0QyxDQUE4Q0ssRUFBSXlDLENBQWxELENBQXFEekMsR0FBS2tvSCxtQkFBMUQsQ0FBZ0YsQ0FFL0UsTUFBUS9WLEtBQUtoMEQsV0FBTCxDQUFrQm4rQyxDQUFsQixDQUFSLENBQ0EsTUFBVWtvSCxvQkFBc0IsQ0FBeEIsQ0FBOEIvVixLQUFLaDBELFdBQUwsQ0FBa0JuK0MsRUFBSSxDQUF0QixDQUE5QixDQUEwRCxDQUFsRSxDQUNBLE1BQVVrb0gsb0JBQXNCLENBQXhCLENBQThCL1YsS0FBS2gwRCxXQUFMLENBQWtCbitDLEVBQUksQ0FBdEIsQ0FBOUIsQ0FBMEQsQ0FBbEUsQ0FDQSxNQUFVa29ILG9CQUFzQixDQUF4QixDQUE4Qi9WLEtBQUtoMEQsV0FBTCxDQUFrQm4rQyxFQUFJLENBQXRCLENBQTlCLENBQTBELENBQWxFLENBRUFpZ0MsU0FBU2tlLFdBQVQsQ0FBcUJoL0MsSUFBckIsQ0FBMkIsV0FBQSxDQUFhb1QsQ0FBYixDQUFnQndRLENBQWhCLENBQW1CNkcsQ0FBbkIsQ0FBc0J0UixDQUF0QixDQUEzQixFQUVBLENBRUQsQ0FFRCxHQUFLNjVGLEtBQUsvekQsV0FBVixDQUF3QixDQUV2QixJQUFNLE1BQVEsQ0FBUixDQUFXMzdDLEVBQUkwdkcsS0FBSy96RCxXQUFMLENBQWlCeitDLE1BQXRDLENBQThDSyxFQUFJeUMsQ0FBbEQsQ0FBcUR6QyxHQUFLa29ILG1CQUExRCxDQUFnRixDQUUvRSxNQUFRL1YsS0FBSy96RCxXQUFMLENBQWtCcCtDLENBQWxCLENBQVIsQ0FDQSxNQUFVa29ILG9CQUFzQixDQUF4QixDQUE4Qi9WLEtBQUsvekQsV0FBTCxDQUFrQnArQyxFQUFJLENBQXRCLENBQTlCLENBQTBELENBQWxFLENBQ0EsTUFBVWtvSCxvQkFBc0IsQ0FBeEIsQ0FBOEIvVixLQUFLL3pELFdBQUwsQ0FBa0JwK0MsRUFBSSxDQUF0QixDQUE5QixDQUEwRCxDQUFsRSxDQUNBLE1BQVVrb0gsb0JBQXNCLENBQXhCLENBQThCL1YsS0FBSy96RCxXQUFMLENBQWtCcCtDLEVBQUksQ0FBdEIsQ0FBOUIsQ0FBMEQsQ0FBbEUsQ0FFQWlnQyxTQUFTbWUsV0FBVCxDQUFxQmovQyxJQUFyQixDQUEyQixXQUFBLENBQWF1RCxDQUFiLENBQWdCRixDQUFoQixDQUFtQlcsQ0FBbkIsQ0FBc0JpbkIsQ0FBdEIsQ0FBM0IsRUFFQSxDQUVELENBRUQ2VixTQUFTb29DLEtBQVQsQ0FBaUI4cEMsS0FBSzlwQyxLQUF0QixDQUVBLEdBQUtwb0MsU0FBU29vQyxLQUFULEVBQWtCcG9DLFNBQVNvb0MsS0FBVCxDQUFlMW9FLE1BQWYsQ0FBd0IsQ0FBMUMsR0FBaURzZ0MsU0FBU2tlLFdBQVQsQ0FBcUJ4K0MsTUFBckIsR0FBZ0NzZ0MsU0FBU21lLFdBQVQsQ0FBcUJ6K0MsTUFBckQsRUFBK0RzZ0MsU0FBU21lLFdBQVQsQ0FBcUJ6K0MsTUFBckIsR0FBZ0NzZ0MsU0FBU0UsUUFBVCxDQUFrQnhnQyxNQUFsSyxDQUFMLENBQWtMLENBRWpMc1YsUUFBUTZQLElBQVIsQ0FBYyxzQ0FBd0NtYixTQUFTRSxRQUFULENBQWtCeGdDLE1BQTFELENBQW1FLGtCQUFuRSxDQUNic2dDLFNBQVNtZSxXQUFULENBQXFCeitDLE1BRFIsQ0FDaUIsc0JBRGpCLENBQzBDc2dDLFNBQVNrZSxXQUFULENBQXFCeCtDLE1BRC9ELENBQ3dFLGlCQUR0RixFQUdBLENBRUQsQ0FFRCxzQkFBQSxDQUF3Qnd5RyxJQUF4QixDQUE4Qmx5RSxRQUE5QixDQUF5QyxDQUV4QyxVQUFZa3lFLEtBQUt4aUYsS0FBakIsQ0FFQSxHQUFLd2lGLEtBQUtsMEQsWUFBTCxHQUFzQjMvQyxTQUEzQixDQUF1QyxDQUV0QyxJQUFNLE1BQVEsQ0FBUixDQUFXbUUsRUFBSTB2RyxLQUFLbDBELFlBQUwsQ0FBa0J0K0MsTUFBdkMsQ0FBK0NLLEVBQUl5QyxDQUFuRCxDQUFzRHpDLEdBQXRELENBQTZELENBRTVEaWdDLFNBQVNnZSxZQUFULENBQXVCaitDLENBQXZCLEVBQTZCLEVBQTdCLENBQ0FpZ0MsU0FBU2dlLFlBQVQsQ0FBdUJqK0MsQ0FBdkIsRUFBMkJoRSxJQUEzQixDQUFrQ20yRyxLQUFLbDBELFlBQUwsQ0FBbUJqK0MsQ0FBbkIsRUFBdUJoRSxJQUF6RCxDQUNBaWtDLFNBQVNnZSxZQUFULENBQXVCaitDLENBQXZCLEVBQTJCbWdDLFFBQTNCLENBQXNDLEVBQXRDLENBRUEsZ0JBQWtCRixTQUFTZ2UsWUFBVCxDQUF1QmorQyxDQUF2QixFQUEyQm1nQyxRQUE3QyxDQUNBLGdCQUFrQmd5RSxLQUFLbDBELFlBQUwsQ0FBbUJqK0MsQ0FBbkIsRUFBdUJtZ0MsUUFBekMsQ0FFQSxJQUFNLE1BQVEsQ0FBUixDQUFXc2dCLEdBQUswbkUsWUFBWXhvSCxNQUFsQyxDQUEwQzBTLEVBQUlvdUMsRUFBOUMsQ0FBa0RwdUMsR0FBSyxDQUF2RCxDQUEyRCxDQUUxRCxXQUFhLFdBQUEsRUFBYixDQUNBMHNDLE9BQU94c0MsQ0FBUCxDQUFXNDFHLFlBQWE5MUcsQ0FBYixFQUFtQnNkLEtBQTlCLENBQ0FvdkIsT0FBT2g4QixDQUFQLENBQVdvbEcsWUFBYTkxRyxFQUFJLENBQWpCLEVBQXVCc2QsS0FBbEMsQ0FDQW92QixPQUFPbjFCLENBQVAsQ0FBV3UrRixZQUFhOTFHLEVBQUksQ0FBakIsRUFBdUJzZCxLQUFsQyxDQUVBeTRGLFlBQVlqcEgsSUFBWixDQUFrQjQvQyxNQUFsQixFQUVBLENBRUQsQ0FFRCxDQUVELEdBQUtvekQsS0FBS2tXLFdBQUwsR0FBcUIvcEgsU0FBckIsRUFBa0M2ekcsS0FBS2tXLFdBQUwsQ0FBaUIxb0gsTUFBakIsQ0FBMEIsQ0FBakUsQ0FBcUUsQ0FFcEVzVixRQUFRNlAsSUFBUixDQUFjLGlGQUFkLEVBRUEsVUFBWW1iLFNBQVM4ZCxLQUFyQixDQUNBLGdCQUFrQm8wRCxLQUFLa1csV0FBTCxDQUFrQixDQUFsQixFQUFzQnZxRSxNQUF4QyxDQUVBLElBQU0sTUFBUSxDQUFSLENBQVdyN0MsRUFBSXM3QyxNQUFNcCtDLE1BQTNCLENBQW1DSyxFQUFJeUMsQ0FBdkMsQ0FBMEN6QyxHQUExQyxDQUFpRCxDQUVoRCs5QyxNQUFPLzlDLENBQVAsRUFBV2t1QyxLQUFYLENBQWlCN21CLFNBQWpCLENBQTRCZ2hHLFdBQTVCLENBQXlDcm9ILEVBQUksQ0FBN0MsRUFFQSxDQUVELENBRUQsQ0FFRCx3QkFBQSxDQUEwQm15RyxJQUExQixDQUFnQ2x5RSxRQUFoQyxDQUEyQyxDQUUxQyxxQkFBdUIsRUFBdkIsQ0FFQTtFQUNBLGVBQWlCLEVBQWpCLENBRUEsR0FBS2t5RSxLQUFLbVAsU0FBTCxHQUFtQmhqSCxTQUF4QixDQUFvQyxDQUVuQ3lpSCxXQUFXNWhILElBQVgsQ0FBaUJnekcsS0FBS21QLFNBQXRCLEVBRUEsQ0FFRCxHQUFLblAsS0FBSzRPLFVBQUwsR0FBb0J6aUgsU0FBekIsQ0FBcUMsQ0FFcEMsR0FBSzZ6RyxLQUFLNE8sVUFBTCxDQUFnQnBoSCxNQUFyQixDQUE4QixDQUU3Qm9oSCxXQUFhQSxXQUFXcDVHLE1BQVgsQ0FBbUJ3cUcsS0FBSzRPLFVBQXhCLENBQWIsQ0FFQSxDQUpELElBSU8sQ0FFTkEsV0FBVzVoSCxJQUFYLENBQWlCZ3pHLEtBQUs0TyxVQUF0QixFQUVBLENBRUQsQ0FFRCxJQUFNLE1BQVEsQ0FBZCxDQUFpQi9nSCxFQUFJK2dILFdBQVdwaEgsTUFBaEMsQ0FBd0NLLEdBQXhDLENBQStDLENBRTlDLFNBQVdrZ0gsY0FBY21CLGNBQWQsQ0FBOEJOLFdBQVkvZ0gsQ0FBWixDQUE5QixDQUErQ2lnQyxTQUFTb29DLEtBQXhELENBQVgsQ0FDQSxHQUFLaTRDLElBQUwsQ0FBWWdJLGlCQUFpQm5wSCxJQUFqQixDQUF1Qm1oSCxJQUF2QixFQUVaLENBRUQ7RUFDQSxHQUFLcmdGLFNBQVNnZSxZQUFkLENBQTZCO0VBRzVCLHdCQUEwQmlpRSxjQUFjYyxtQ0FBZCxDQUFtRC9nRixTQUFTZ2UsWUFBNUQsQ0FBMEUsRUFBMUUsQ0FBMUIsQ0FDQXFxRSxpQkFBbUJBLGlCQUFpQjNnSCxNQUFqQixDQUF5QjRnSCxtQkFBekIsQ0FBbkIsQ0FFQSxDQUVELEdBQUtELGlCQUFpQjNvSCxNQUFqQixDQUEwQixDQUEvQixDQUFtQ3NnQyxTQUFTOGdGLFVBQVQsQ0FBc0J1SCxnQkFBdEIsQ0FFbkMsQ0FFRCxxQkFBTyxDQUFnQm5XLElBQWhCLENBQXNCd1IsV0FBdEIsQ0FBb0MsQ0FFMUMsR0FBS3hSLEtBQUs5aUcsSUFBTCxHQUFjL1EsU0FBbkIsQ0FBK0I7RUFHOUI2ekcsS0FBT0EsS0FBSzlpRyxJQUFaLENBRUEsQ0FFRCxHQUFLOGlHLEtBQUt4aUYsS0FBTCxHQUFlcnhCLFNBQXBCLENBQWdDLENBRS9CNnpHLEtBQUt4aUYsS0FBTCxDQUFhLElBQU13aUYsS0FBS3hpRixLQUF4QixDQUVBLENBSkQsSUFJTyxDQUVOd2lGLEtBQUt4aUYsS0FBTCxDQUFhLEdBQWIsQ0FFQSxDQUVELGFBQWUsWUFBQSxFQUFmLENBRUE2NEYsV0FBWXJXLElBQVosQ0FBa0JseUUsUUFBbEIsRUFDQXdvRixVQUFXdFcsSUFBWCxDQUFpQmx5RSxRQUFqQixFQUNBeW9GLGNBQWV2VyxJQUFmLENBQXFCbHlFLFFBQXJCLEVBQ0Ewb0YsZ0JBQWlCeFcsSUFBakIsQ0FBdUJseUUsUUFBdkIsRUFFQUEsU0FBUytmLGtCQUFULEdBQ0EvZixTQUFTMEYscUJBQVQsR0FFQSxHQUFLd3NFLEtBQUt6MkQsU0FBTCxHQUFtQnA5QyxTQUFuQixFQUFnQzZ6RyxLQUFLejJELFNBQUwsQ0FBZS83QyxNQUFmLEdBQTBCLENBQS9ELENBQW1FLENBRWxFLE9BQU8sQ0FBRXNnQyxTQUFVQSxRQUFaLENBQVAsQ0FFQSxDQUpELElBSU8sQ0FFTixjQUFnQmtqRixPQUFPanFILFNBQVAsQ0FBaUJ3cUgsYUFBakIsQ0FBZ0N2UixLQUFLejJELFNBQXJDLENBQWdEaW9FLFdBQWhELENBQTZELEtBQUs3VCxXQUFsRSxDQUFoQixDQUVBLE9BQU8sQ0FBRTd2RSxTQUFVQSxRQUFaLENBQXNCeWIsVUFBV0EsU0FBakMsQ0FBUCxDQUVBLENBRUQsQ0F6Q0QsQ0EyQ0EsQ0F0ZU0sRUE3QzZCLENBQXJDLEVBdWhCQTs7S0FJQSxxQkFBQSxDQUF1QjB4RCxPQUF2QixDQUFpQyxDQUVoQyxLQUFLQSxPQUFMLENBQWlCQSxVQUFZOXVHLFNBQWQsQ0FBNEI4dUcsT0FBNUIsQ0FBc0NDLHFCQUFyRCxDQUNBLEtBQUtzVyxXQUFMLENBQW1CLEVBQW5CLENBRUEsQ0FFRDFxSCxPQUFPNG5CLE1BQVAsQ0FBZStuRyxhQUFhMXZILFNBQTVCLENBQXVDLENBRXRDcTBHLEtBQU0sU0FBV2h4RSxHQUFYLENBQWdCK3ZFLE1BQWhCLENBQXdCQyxVQUF4QixDQUFvQ0MsT0FBcEMsQ0FBOEMsQ0FFbkQsR0FBSyxLQUFLbVgsV0FBTCxHQUFxQixFQUExQixDQUErQixDQUU5QixLQUFLQSxXQUFMLENBQW1CcG5GLElBQUlzc0YsU0FBSixDQUFlLENBQWYsQ0FBa0J0c0YsSUFBSTRxRixXQUFKLENBQWlCLEdBQWpCLEVBQXlCLENBQTNDLENBQW5CLENBRUEsQ0FFRCxVQUFZLElBQVosQ0FFQSxXQUFhLGNBQUEsQ0FBZ0IvbUYsTUFBTWd0RSxPQUF0QixDQUFiLENBQ0FpQyxPQUFPOUIsSUFBUCxDQUFhaHhFLEdBQWIsQ0FBa0IsU0FBVzhyRSxJQUFYLENBQWtCLENBRW5DLFNBQVcsSUFBWCxDQUVBLEdBQUksQ0FFSDhKLEtBQU9uNEYsS0FBS3NpQyxLQUFMLENBQVkrckQsSUFBWixDQUFQLENBRUEsQ0FBQyxNQUFROXlGLEtBQVIsQ0FBZ0IsQ0FFakIsR0FBS2kzRixVQUFZbHVHLFNBQWpCLENBQTZCa3VHLFFBQVNqM0YsS0FBVCxFQUU3Qk4sUUFBUU0sS0FBUixDQUFlLG9DQUFzQ2duQixHQUF0QyxDQUE0QyxHQUEzRCxDQUFnRWhuQixNQUFNbTJFLE9BQXRFLEVBRUEsT0FFQSxDQUVELGFBQWV5bUIsS0FBSzkxRSxRQUFwQixDQUVBLEdBQUtBLFdBQWEvOUIsU0FBYixFQUEwQis5QixTQUFTMWhDLElBQVQsR0FBa0IyRCxTQUE1QyxFQUF5RCs5QixTQUFTMWhDLElBQVQsQ0FBY3N6RyxXQUFkLEtBQWdDLFVBQTlGLENBQTJHLENBRTFHaDVGLFFBQVFNLEtBQVIsQ0FBZSxtQ0FBcUNnbkIsR0FBckMsQ0FBMkMsaUNBQTFELEVBQ0EsT0FFQSxDQUVENkQsTUFBTWtjLEtBQU4sQ0FBYTYxRCxJQUFiLENBQW1CN0YsTUFBbkIsRUFFQSxDQTdCRCxDQTZCR0MsVUE3QkgsQ0E2QmVDLE9BN0JmLEVBK0JBLENBNUNxQyxDQThDdEM4YSxlQUFnQixTQUFXM3FILEtBQVgsQ0FBbUIsQ0FFbEMsS0FBS2duSCxXQUFMLENBQW1CaG5ILEtBQW5CLENBRUEsQ0FsRHFDLENBb0R0Q3F6RyxlQUFnQixTQUFXcnpHLEtBQVgsQ0FBbUIsQ0FFbEMsS0FBS216RyxXQUFMLENBQW1CbnpHLEtBQW5CLENBRUEsQ0F4RHFDLENBMER0QzIvQyxNQUFPLFNBQVc2MUQsSUFBWCxDQUFpQjdGLE1BQWpCLENBQTBCLENBRWhDLFdBQWEsS0FBS3djLFVBQUwsQ0FBaUIzVyxLQUFLeDJELE1BQXRCLENBQWIsQ0FDQSxlQUFpQixLQUFLb3RFLGVBQUwsQ0FBc0I1VyxLQUFLMTJELFVBQTNCLENBQXVDRSxNQUF2QyxDQUFqQixDQUVBLFdBQWEsS0FBS3F0RSxXQUFMLENBQWtCN1csS0FBSzcxRSxNQUF2QixDQUErQixVQUFZLENBRXZELEdBQUtnd0UsU0FBV2h1RyxTQUFoQixDQUE0Qmd1RyxPQUFROXNHLE1BQVIsRUFFNUIsQ0FKWSxDQUFiLENBTUEsYUFBZSxLQUFLeXBILGFBQUwsQ0FBb0I5VyxLQUFLdjJFLFFBQXpCLENBQW1DVSxNQUFuQyxDQUFmLENBQ0EsY0FBZ0IsS0FBSzRzRixjQUFMLENBQXFCL1csS0FBS3oyRCxTQUExQixDQUFxQzlmLFFBQXJDLENBQWhCLENBRUEsV0FBYSxLQUFLdXRGLFdBQUwsQ0FBa0JoWCxLQUFLM3lHLE1BQXZCLENBQStCaThDLFVBQS9CLENBQTJDQyxTQUEzQyxDQUFiLENBRUEsR0FBS3kyRCxLQUFLNE8sVUFBVixDQUF1QixDQUV0QnZoSCxPQUFPdWhILFVBQVAsQ0FBb0IsS0FBSzRILGVBQUwsQ0FBc0J4VyxLQUFLNE8sVUFBM0IsQ0FBcEIsQ0FFQSxDQUVELEdBQUs1TyxLQUFLNzFFLE1BQUwsR0FBZ0JoK0IsU0FBaEIsRUFBNkI2ekcsS0FBSzcxRSxNQUFMLENBQVkzOEIsTUFBWixHQUF1QixDQUF6RCxDQUE2RCxDQUU1RCxHQUFLMnNHLFNBQVdodUcsU0FBaEIsQ0FBNEJndUcsT0FBUTlzRyxNQUFSLEVBRTVCLENBRUQsYUFBQSxDQUVBLENBeEZxQyxDQTBGdENzcEgsV0FBWSxTQUFXM1csSUFBWCxDQUFrQixDQUU3QixXQUFhLEVBQWIsQ0FFQSxHQUFLQSxPQUFTN3pHLFNBQWQsQ0FBMEIsQ0FFekIsSUFBTSxNQUFRLENBQVIsQ0FBV21FLEVBQUkwdkcsS0FBS3h5RyxNQUExQixDQUFrQ0ssRUFBSXlDLENBQXRDLENBQXlDekMsR0FBekMsQ0FBZ0QsQ0FFL0MsVUFBWSxTQUFBLEdBQVlreUcsUUFBWixDQUFzQkMsS0FBTW55RyxDQUFOLENBQXRCLENBQVosQ0FFQTI3QyxPQUFRSyxNQUFNM2hCLElBQWQsRUFBdUIyaEIsS0FBdkIsQ0FFQSxDQUVELENBRUQsYUFBQSxDQUVBLENBNUdxQyxDQThHdEMrc0UsZ0JBQWlCLFNBQVc1VyxJQUFYLENBQWlCeDJELE1BQWpCLENBQTBCLENBRTFDLGVBQWlCLEVBQWpCLENBRUEsR0FBS3cyRCxPQUFTN3pHLFNBQWQsQ0FBMEIsQ0FFekIsbUJBQXFCLGNBQUEsRUFBckIsQ0FDQSx5QkFBMkIsd0JBQUEsRUFBM0IsQ0FFQSxJQUFNLE1BQVEsQ0FBUixDQUFXbUUsRUFBSTB2RyxLQUFLeHlHLE1BQTFCLENBQWtDSyxFQUFJeUMsQ0FBdEMsQ0FBeUN6QyxHQUF6QyxDQUFnRCxDQUUvQyxZQUFBLENBQ0EsU0FBV215RyxLQUFNbnlHLENBQU4sQ0FBWCxDQUVBLE9BQVNxUCxLQUFLMVUsSUFBZCxFQUVDLElBQUssZUFBTCxDQUNBLElBQUsscUJBQUwsQ0FFQ3NsQyxTQUFXLGVBQWdCNXdCLEtBQUsxVSxJQUFqQixDQUFKLENBQ1YwVSxLQUFLMHNCLEtBREssQ0FFVjFzQixLQUFLMnNCLE1BRkssQ0FHVjNzQixLQUFLMjVDLGFBSEssQ0FJVjM1QyxLQUFLNDVDLGNBSkssQ0FBWCxDQU9BLE1BRUQsSUFBSyxhQUFMLENBQ0EsSUFBSyxtQkFBTCxDQUNBLElBQUssY0FBTDtFQUVDaHBCLFNBQVcsZUFBZ0I1d0IsS0FBSzFVLElBQWpCLENBQUosQ0FDVjBVLEtBQUswc0IsS0FESyxDQUVWMXNCLEtBQUsyc0IsTUFGSyxDQUdWM3NCLEtBQUt5bEMsS0FISyxDQUlWemxDLEtBQUsyNUMsYUFKSyxDQUtWMzVDLEtBQUs0NUMsY0FMSyxDQU1WNTVDLEtBQUs2NUMsYUFOSyxDQUFYLENBU0EsTUFFRCxJQUFLLGdCQUFMLENBQ0EsSUFBSyxzQkFBTCxDQUVDanBCLFNBQVcsZUFBZ0I1d0IsS0FBSzFVLElBQWpCLENBQUosQ0FDVjBVLEtBQUtxcEIsTUFESyxDQUVWcnBCLEtBQUt3NkYsUUFGSyxDQUdWeDZGLEtBQUt3NUYsVUFISyxDQUlWeDVGLEtBQUt5NUYsV0FKSyxDQUFYLENBT0EsTUFFRCxJQUFLLGtCQUFMLENBQ0EsSUFBSyx3QkFBTCxDQUVDN29FLFNBQVcsZUFBZ0I1d0IsS0FBSzFVLElBQWpCLENBQUosQ0FDVjBVLEtBQUsyN0YsU0FESyxDQUVWMzdGLEtBQUs0N0YsWUFGSyxDQUdWNTdGLEtBQUsyc0IsTUFISyxDQUlWM3NCLEtBQUttdEYsY0FKSyxDQUtWbnRGLEtBQUs0NUMsY0FMSyxDQU1WNTVDLEtBQUs2N0YsU0FOSyxDQU9WNzdGLEtBQUt3NUYsVUFQSyxDQVFWeDVGLEtBQUt5NUYsV0FSSyxDQUFYLENBV0EsTUFFRCxJQUFLLGNBQUwsQ0FDQSxJQUFLLG9CQUFMLENBRUM3b0UsU0FBVyxlQUFnQjV3QixLQUFLMVUsSUFBakIsQ0FBSixDQUNWMFUsS0FBS3FwQixNQURLLENBRVZycEIsS0FBSzJzQixNQUZLLENBR1Yzc0IsS0FBS210RixjQUhLLENBSVZudEYsS0FBSzQ1QyxjQUpLLENBS1Y1NUMsS0FBSzY3RixTQUxLLENBTVY3N0YsS0FBS3c1RixVQU5LLENBT1Z4NUYsS0FBS3k1RixXQVBLLENBQVgsQ0FVQSxNQUVELElBQUssZ0JBQUwsQ0FDQSxJQUFLLHNCQUFMLENBRUM3b0UsU0FBVyxlQUFnQjV3QixLQUFLMVUsSUFBakIsQ0FBSixDQUNWMFUsS0FBS3FwQixNQURLLENBRVZycEIsS0FBSzI1QyxhQUZLLENBR1YzNUMsS0FBSzQ1QyxjQUhLLENBSVY1NUMsS0FBS3M1RixRQUpLLENBS1Z0NUYsS0FBS3U1RixTQUxLLENBTVZ2NUYsS0FBS3c1RixVQU5LLENBT1Z4NUYsS0FBS3k1RixXQVBLLENBQVgsQ0FVQSxNQUVELElBQUssc0JBQUwsQ0FDQSxJQUFLLDRCQUFMLENBQ0EsSUFBSyxxQkFBTCxDQUNBLElBQUssMkJBQUwsQ0FDQSxJQUFLLG9CQUFMLENBQ0EsSUFBSywwQkFBTCxDQUNBLElBQUsscUJBQUwsQ0FDQSxJQUFLLDJCQUFMLENBRUM3b0UsU0FBVyxlQUFnQjV3QixLQUFLMVUsSUFBakIsQ0FBSixDQUNWMFUsS0FBS3FwQixNQURLLENBRVZycEIsS0FBS3FyRixNQUZLLENBQVgsQ0FLQSxNQUVELElBQUssY0FBTCxDQUNBLElBQUssb0JBQUwsQ0FFQ3o2RCxTQUFXLGVBQWdCNXdCLEtBQUsxVSxJQUFqQixDQUFKLENBQ1YwVSxLQUFLKzVGLFdBREssQ0FFVi81RixLQUFLZzZGLFdBRkssQ0FHVmg2RixLQUFLaTZGLGFBSEssQ0FJVmo2RixLQUFLazZGLFdBSkssQ0FLVmw2RixLQUFLdzVGLFVBTEssQ0FNVng1RixLQUFLeTVGLFdBTkssQ0FBWCxDQVNBLE1BRUQsSUFBSyxlQUFMLENBQ0EsSUFBSyxxQkFBTCxDQUVDN29FLFNBQVcsZUFBZ0I1d0IsS0FBSzFVLElBQWpCLENBQUosQ0FDVjBVLEtBQUtxcEIsTUFESyxDQUVWcnBCLEtBQUtrdUYsSUFGSyxDQUdWbHVGLEtBQUttdEYsY0FISyxDQUlWbnRGLEtBQUtrdEYsZUFKSyxDQUtWbHRGLEtBQUs2dUYsR0FMSyxDQUFYLENBUUEsTUFFRCxJQUFLLG1CQUFMLENBQ0EsSUFBSyx5QkFBTCxDQUVDaitELFNBQVcsZUFBZ0I1d0IsS0FBSzFVLElBQWpCLENBQUosQ0FDVjBVLEtBQUtxcEIsTUFESyxDQUVWcnBCLEtBQUtrdUYsSUFGSyxDQUdWbHVGLEtBQUtrdEYsZUFISyxDQUlWbHRGLEtBQUttdEYsY0FKSyxDQUtWbnRGLEtBQUt3TyxDQUxLLENBTVZ4TyxLQUFLOGIsQ0FOSyxDQUFYLENBU0EsTUFFRCxJQUFLLGVBQUwsQ0FDQSxJQUFLLHFCQUFMLENBRUM4VSxTQUFXLGVBQWdCNXdCLEtBQUsxVSxJQUFqQixDQUFKLENBQ1YwVSxLQUFLNnZCLE1BREssQ0FFVjd2QixLQUFLdzZGLFFBRkssQ0FHVng2RixLQUFLczVGLFFBSEssQ0FJVnQ1RixLQUFLdTVGLFNBSkssQ0FBWCxDQU9BLE1BRUQsSUFBSyxvQkFBTCxDQUNBLElBQUssMEJBQUwsQ0FFQzNvRSxTQUFXLGVBQWdCNXdCLEtBQUsxVSxJQUFqQixDQUFKLENBQ1YwVSxLQUFLOHdCLFFBREssQ0FFVjl3QixLQUFLeXdDLE9BRkssQ0FHVnp3QyxLQUFLcXBCLE1BSEssQ0FJVnJwQixLQUFLKzVHLE9BSkssQ0FBWCxDQU9BLE1BRUQsSUFBSyxlQUFMLENBQ0EsSUFBSyxxQkFBTCxDQUVDLG1CQUFxQixFQUFyQixDQUVBLElBQU0sTUFBUSxDQUFSLENBQVducUUsR0FBSzV2QyxLQUFLc3NDLE1BQUwsQ0FBWWg4QyxNQUFsQyxDQUEwQ2ljLEVBQUlxakMsRUFBOUMsQ0FBa0RyakMsR0FBbEQsQ0FBeUQsQ0FFeEQsVUFBWSsvQixPQUFRdHNDLEtBQUtzc0MsTUFBTCxDQUFhLy9CLENBQWIsQ0FBUixDQUFaLENBRUF5dEcsZUFBZWxxSCxJQUFmLENBQXFCNjhDLEtBQXJCLEVBRUEsQ0FFRC9iLFNBQVcsZUFBZ0I1d0IsS0FBSzFVLElBQWpCLENBQUosQ0FDVjB1SCxjQURVLENBRVZoNkcsS0FBS3l6RixhQUZLLENBQVgsQ0FLQSxNQUVELElBQUssZ0JBQUwsQ0FFQzdpRSxTQUFXcXBGLHFCQUFxQmh0RSxLQUFyQixDQUE0Qmp0QyxJQUE1QixDQUFYLENBRUEsTUFFRCxJQUFLLFVBQUwsQ0FFQzR3QixTQUFXc3BGLGVBQWVqdEUsS0FBZixDQUFzQmp0QyxJQUF0QixDQUE0QixLQUFLczBHLFdBQWpDLEVBQStDMWpGLFFBQTFELENBRUEsTUFFRCxRQUVDaHJCLFFBQVE2UCxJQUFSLENBQWMsa0RBQW9EelYsS0FBSzFVLElBQXpELENBQWdFLEdBQTlFLEVBRUEsU0E1TUYsQ0FnTkFzbEMsU0FBUzVGLElBQVQsQ0FBZ0JockIsS0FBS2dyQixJQUFyQixDQUVBLEdBQUtockIsS0FBS3JULElBQUwsR0FBY3NDLFNBQW5CLENBQStCMmhDLFNBQVNqa0MsSUFBVCxDQUFnQnFULEtBQUtyVCxJQUFyQixDQUUvQnkvQyxXQUFZcHNDLEtBQUtnckIsSUFBakIsRUFBMEI0RixRQUExQixDQUVBLENBRUQsQ0FFRCxpQkFBQSxDQUVBLENBeFZxQyxDQTBWdENpcEYsZUFBZ0IsU0FBVy9XLElBQVgsQ0FBaUJ2MkUsUUFBakIsQ0FBNEIsQ0FFM0MsY0FBZ0IsRUFBaEIsQ0FFQSxHQUFLdTJFLE9BQVM3ekcsU0FBZCxDQUEwQixDQUV6QixXQUFhLGtCQUFBLEVBQWIsQ0FDQSt3RyxPQUFPK1MsV0FBUCxDQUFvQnhtRixRQUFwQixFQUVBLElBQU0sTUFBUSxDQUFSLENBQVduNUIsRUFBSTB2RyxLQUFLeHlHLE1BQTFCLENBQWtDSyxFQUFJeUMsQ0FBdEMsQ0FBeUN6QyxHQUF6QyxDQUFnRCxDQUUvQyxTQUFXbXlHLEtBQU1ueUcsQ0FBTixDQUFYLENBRUEsR0FBS3FQLEtBQUsxVSxJQUFMLEdBQWMsZUFBbkIsQ0FBcUM7RUFJcEMsVUFBWSxFQUFaLENBRUEsSUFBTSxNQUFRLENBQWQsQ0FBaUJpaEIsRUFBSXZNLEtBQUtxc0MsU0FBTCxDQUFlLzdDLE1BQXBDLENBQTRDaWMsR0FBNUMsQ0FBbUQsQ0FFbERtRSxNQUFNNWdCLElBQU4sQ0FBWWt3RyxPQUFPL3lELEtBQVAsQ0FBY2p0QyxLQUFLcXNDLFNBQUwsQ0FBZ0I5L0IsQ0FBaEIsQ0FBZCxDQUFaLEVBRUEsQ0FFRDgvQixVQUFXcnNDLEtBQUtnckIsSUFBaEIsRUFBeUJ0YSxLQUF6QixDQUVBLENBZEQsSUFjTyxDQUVOMjdCLFVBQVdyc0MsS0FBS2dyQixJQUFoQixFQUF5QmcxRSxPQUFPL3lELEtBQVAsQ0FBY2p0QyxJQUFkLENBQXpCLENBRUEsQ0FFRCxDQUVELENBRUQsZ0JBQUEsQ0FFQSxDQWpZcUMsQ0FtWXRDczVHLGdCQUFpQixTQUFXeFcsSUFBWCxDQUFrQixDQUVsQyxlQUFpQixFQUFqQixDQUVBLElBQU0sTUFBUSxDQUFkLENBQWlCbnlHLEVBQUlteUcsS0FBS3h5RyxNQUExQixDQUFrQ0ssR0FBbEMsQ0FBeUMsQ0FFeEMsU0FBV2tnSCxjQUFjNWpFLEtBQWQsQ0FBcUI2MUQsS0FBTW55RyxDQUFOLENBQXJCLENBQVgsQ0FFQStnSCxXQUFXNWhILElBQVgsQ0FBaUJtaEgsSUFBakIsRUFFQSxDQUVELGlCQUFBLENBRUEsQ0FqWnFDLENBbVp0QzBJLFlBQWEsU0FBVzdXLElBQVgsQ0FBaUI3RixNQUFqQixDQUEwQixDQUV0QyxVQUFZLElBQVosQ0FDQSxXQUFhLEVBQWIsQ0FFQSxrQkFBQSxDQUFvQi92RSxHQUFwQixDQUEwQixDQUV6QjZELE1BQU1ndEUsT0FBTixDQUFjVixTQUFkLENBQXlCbndFLEdBQXpCLEVBRUEsY0FBY2d4RSxJQUFQLENBQWFoeEUsR0FBYixDQUFrQixVQUFZLENBRXBDNkQsTUFBTWd0RSxPQUFOLENBQWNOLE9BQWQsQ0FBdUJ2d0UsR0FBdkIsRUFFQSxDQUpNLENBSUpqK0IsU0FKSSxDQUlPLFVBQVksQ0FFekI4aEMsTUFBTWd0RSxPQUFOLENBQWNOLE9BQWQsQ0FBdUJ2d0UsR0FBdkIsRUFDQTZELE1BQU1ndEUsT0FBTixDQUFjTCxTQUFkLENBQXlCeHdFLEdBQXpCLEVBRUEsQ0FUTSxDQUFQLENBV0EsQ0FFRCxHQUFLNDFFLE9BQVM3ekcsU0FBVCxFQUFzQjZ6RyxLQUFLeHlHLE1BQUwsQ0FBYyxDQUF6QyxDQUE2QyxDQUU1QyxZQUFjLGtCQUFBLENBQW9CMnNHLE1BQXBCLENBQWQsQ0FFQSxXQUFhLGVBQUEsQ0FBaUJjLE9BQWpCLENBQWIsQ0FDQWlDLE9BQU9XLGNBQVAsQ0FBdUIsS0FBS0YsV0FBNUIsRUFFQSxJQUFNLE1BQVEsQ0FBUixDQUFXcnRHLEVBQUkwdkcsS0FBS3h5RyxNQUExQixDQUFrQ0ssRUFBSXlDLENBQXRDLENBQXlDekMsR0FBekMsQ0FBZ0QsQ0FFL0MsVUFBWW15RyxLQUFNbnlHLENBQU4sQ0FBWixDQUNBLFNBQVcsNEJBQTRCd2QsSUFBNUIsQ0FBa0NtYyxNQUFNNEMsR0FBeEMsRUFBZ0Q1QyxNQUFNNEMsR0FBdEQsQ0FBNEQ2RCxNQUFNdWpGLFdBQU4sQ0FBb0JocUYsTUFBTTRDLEdBQWpHLENBRUFELE9BQVEzQyxNQUFNVSxJQUFkLEVBQXVCbXZGLFVBQVdycEQsSUFBWCxDQUF2QixDQUVBLENBRUQsQ0FFRCxhQUFBLENBRUEsQ0E3YnFDLENBK2J0QzhvRCxjQUFlLFNBQVc5VyxJQUFYLENBQWlCNzFFLE1BQWpCLENBQTBCLENBRXhDLHNCQUFBLENBQXdCMy9CLEtBQXhCLENBQStCaEMsSUFBL0IsQ0FBc0MsQ0FFckMsR0FBSyxZQUFBLEdBQWlCLFFBQXRCLENBQWlDLFlBQUEsQ0FFakNzYSxRQUFRNlAsSUFBUixDQUFjLHNFQUFkLENBQXNGbm9CLEtBQXRGLEVBRUEsWUFBYUEsS0FBTixDQUFQLENBRUEsQ0FFRCxhQUFlLEVBQWYsQ0FFQSxHQUFLdzFHLE9BQVM3ekcsU0FBZCxDQUEwQixDQUV6QixJQUFNLE1BQVEsQ0FBUixDQUFXbUUsRUFBSTB2RyxLQUFLeHlHLE1BQTFCLENBQWtDSyxFQUFJeUMsQ0FBdEMsQ0FBeUN6QyxHQUF6QyxDQUFnRCxDQUUvQyxTQUFXbXlHLEtBQU1ueUcsQ0FBTixDQUFYLENBRUEsR0FBS3FQLEtBQUtzcUIsS0FBTCxHQUFlcjdCLFNBQXBCLENBQWdDLENBRS9CMlcsUUFBUTZQLElBQVIsQ0FBYyw4Q0FBZCxDQUE4RHpWLEtBQUtnckIsSUFBbkUsRUFFQSxDQUVELEdBQUtpQyxPQUFRanRCLEtBQUtzcUIsS0FBYixJQUF5QnI3QixTQUE5QixDQUEwQyxDQUV6QzJXLFFBQVE2UCxJQUFSLENBQWMscUNBQWQsQ0FBcUR6VixLQUFLc3FCLEtBQTFELEVBRUEsQ0FFRCxZQUFjLFdBQUEsQ0FBYTJDLE9BQVFqdEIsS0FBS3NxQixLQUFiLENBQWIsQ0FBZCxDQUNBNkQsUUFBUW1xQixXQUFSLENBQXNCLElBQXRCLENBRUFucUIsUUFBUW5ELElBQVIsQ0FBZWhyQixLQUFLZ3JCLElBQXBCLENBRUEsR0FBS2hyQixLQUFLclQsSUFBTCxHQUFjc0MsU0FBbkIsQ0FBK0JrL0IsUUFBUXhoQyxJQUFSLENBQWVxVCxLQUFLclQsSUFBcEIsQ0FFL0IsR0FBS3FULEtBQUt1cUIsT0FBTCxHQUFpQnQ3QixTQUF0QixDQUFrQ2svQixRQUFRNUQsT0FBUixDQUFrQjZ2RixjQUFlcDZHLEtBQUt1cUIsT0FBcEIsQ0FBNkI4dkYsZUFBN0IsQ0FBbEIsQ0FFbEMsR0FBS3I2RyxLQUFLaVksTUFBTCxHQUFnQmhwQixTQUFyQixDQUFpQ2svQixRQUFRbFcsTUFBUixDQUFlRCxTQUFmLENBQTBCaFksS0FBS2lZLE1BQS9CLEVBQ2pDLEdBQUtqWSxLQUFLMHJCLE1BQUwsR0FBZ0J6OEIsU0FBckIsQ0FBaUNrL0IsUUFBUXpDLE1BQVIsQ0FBZTFULFNBQWYsQ0FBMEJoWSxLQUFLMHJCLE1BQS9CLEVBQ2pDLEdBQUsxckIsS0FBS3dZLE1BQUwsR0FBZ0J2cEIsU0FBckIsQ0FBaUNrL0IsUUFBUTNWLE1BQVIsQ0FBZVIsU0FBZixDQUEwQmhZLEtBQUt3WSxNQUEvQixFQUNqQyxHQUFLeFksS0FBS2lxQixRQUFMLEdBQWtCaDdCLFNBQXZCLENBQW1Day9CLFFBQVFsRSxRQUFSLENBQW1CanFCLEtBQUtpcUIsUUFBeEIsQ0FFbkMsR0FBS2pxQixLQUFLN1UsSUFBTCxHQUFjOEQsU0FBbkIsQ0FBK0IsQ0FFOUJrL0IsUUFBUTNELEtBQVIsQ0FBZ0I0dkYsY0FBZXA2RyxLQUFLN1UsSUFBTCxDQUFXLENBQVgsQ0FBZixDQUErQm12SCxnQkFBL0IsQ0FBaEIsQ0FDQW5zRixRQUFRMUQsS0FBUixDQUFnQjJ2RixjQUFlcDZHLEtBQUs3VSxJQUFMLENBQVcsQ0FBWCxDQUFmLENBQStCbXZILGdCQUEvQixDQUFoQixDQUVBLENBRUQsR0FBS3Q2RyxLQUFLNHFCLE1BQUwsR0FBZ0IzN0IsU0FBckIsQ0FBaUNrL0IsUUFBUXZELE1BQVIsQ0FBaUI1cUIsS0FBSzRxQixNQUF0QixDQUVqQyxHQUFLNXFCLEtBQUsycUIsU0FBTCxHQUFtQjE3QixTQUF4QixDQUFvQ2svQixRQUFReEQsU0FBUixDQUFvQnl2RixjQUFlcDZHLEtBQUsycUIsU0FBcEIsQ0FBK0I0dkYsY0FBL0IsQ0FBcEIsQ0FDcEMsR0FBS3Y2RyxLQUFLMHFCLFNBQUwsR0FBbUJ6N0IsU0FBeEIsQ0FBb0NrL0IsUUFBUXpELFNBQVIsQ0FBb0IwdkYsY0FBZXA2RyxLQUFLMHFCLFNBQXBCLENBQStCNnZGLGNBQS9CLENBQXBCLENBQ3BDLEdBQUt2NkcsS0FBSzZxQixVQUFMLEdBQW9CNTdCLFNBQXpCLENBQXFDay9CLFFBQVF0RCxVQUFSLENBQXFCN3FCLEtBQUs2cUIsVUFBMUIsQ0FFckMsR0FBSzdxQixLQUFLOHJCLEtBQUwsR0FBZTc4QixTQUFwQixDQUFnQ2svQixRQUFRckMsS0FBUixDQUFnQjlyQixLQUFLOHJCLEtBQXJCLENBRWhDUyxTQUFVdnNCLEtBQUtnckIsSUFBZixFQUF3Qm1ELE9BQXhCLENBRUEsQ0FFRCxDQUVELGVBQUEsQ0FFQSxDQXBnQnFDLENBc2dCdEMyckYsWUFBYSxTQUFXOTVHLElBQVgsQ0FBaUJvc0MsVUFBakIsQ0FBNkJDLFNBQTdCLENBQXlDLENBRXJELFVBQUEsQ0FFQSxvQkFBQSxDQUFzQjEvQyxJQUF0QixDQUE2QixDQUU1QixHQUFLeS9DLFdBQVl6L0MsSUFBWixJQUF1QnNDLFNBQTVCLENBQXdDLENBRXZDMlcsUUFBUTZQLElBQVIsQ0FBYyx3Q0FBZCxDQUF3RDlvQixJQUF4RCxFQUVBLENBRUQsa0JBQW1CQSxJQUFaLENBQVAsQ0FFQSxDQUVELG9CQUFBLENBQXNCQSxJQUF0QixDQUE2QixDQUU1QixHQUFLQSxPQUFTc0MsU0FBZCxDQUEwQixnQkFBQSxDQUUxQixHQUFLd08sTUFBTXlNLE9BQU4sQ0FBZXZkLElBQWYsQ0FBTCxDQUE2QixDQUU1QixVQUFZLEVBQVosQ0FFQSxJQUFNLE1BQVEsQ0FBUixDQUFXeUcsRUFBSXpHLEtBQUsyRCxNQUExQixDQUFrQ0ssRUFBSXlDLENBQXRDLENBQXlDekMsR0FBekMsQ0FBZ0QsQ0FFL0MsU0FBV2hFLEtBQU1nRSxDQUFOLENBQVgsQ0FFQSxHQUFLMDdDLFVBQVdyaEIsSUFBWCxJQUFzQi83QixTQUEzQixDQUF1QyxDQUV0QzJXLFFBQVE2UCxJQUFSLENBQWMsd0NBQWQsQ0FBd0R1VixJQUF4RCxFQUVBLENBRUR0YSxNQUFNNWdCLElBQU4sQ0FBWXU4QyxVQUFXcmhCLElBQVgsQ0FBWixFQUVBLENBRUQsWUFBQSxDQUVBLENBRUQsR0FBS3FoQixVQUFXMS9DLElBQVgsSUFBc0JzQyxTQUEzQixDQUF1QyxDQUV0QzJXLFFBQVE2UCxJQUFSLENBQWMsd0NBQWQsQ0FBd0Q5b0IsSUFBeEQsRUFFQSxDQUVELGlCQUFrQkEsSUFBWCxDQUFQLENBRUEsQ0FFRCxPQUFTcVQsS0FBSzFVLElBQWQsRUFFQyxJQUFLLE9BQUwsQ0FFQzZFLE9BQVMsU0FBQSxFQUFULENBRUEsR0FBSzZQLEtBQUtrbkQsVUFBTCxHQUFvQmo0RCxTQUF6QixDQUFxQyxDQUVwQyxHQUFLZ2lCLE9BQU9HLFNBQVAsQ0FBa0JwUixLQUFLa25ELFVBQXZCLENBQUwsQ0FBMkMsQ0FFMUMvMkQsT0FBTysyRCxVQUFQLENBQW9CLFNBQUEsQ0FBV2xuRCxLQUFLa25ELFVBQWhCLENBQXBCLENBRUEsQ0FFRCxDQUVELEdBQUtsbkQsS0FBS3lpQyxHQUFMLEdBQWF4ekMsU0FBbEIsQ0FBOEIsQ0FFN0IsR0FBSytRLEtBQUt5aUMsR0FBTCxDQUFTbjNDLElBQVQsR0FBa0IsS0FBdkIsQ0FBK0IsQ0FFOUI2RSxPQUFPc3lDLEdBQVAsQ0FBYSxPQUFBLENBQVN6aUMsS0FBS3lpQyxHQUFMLENBQVM1RCxLQUFsQixDQUF5QjcrQixLQUFLeWlDLEdBQUwsQ0FBU2pnQixJQUFsQyxDQUF3Q3hpQixLQUFLeWlDLEdBQUwsQ0FBU2hnQixHQUFqRCxDQUFiLENBRUEsQ0FKRCxRQUlZemlCLEtBQUt5aUMsR0FBTCxDQUFTbjNDLElBQVQsR0FBa0IsU0FBdkIsQ0FBbUMsQ0FFekM2RSxPQUFPc3lDLEdBQVAsQ0FBYSxXQUFBLENBQWF6aUMsS0FBS3lpQyxHQUFMLENBQVM1RCxLQUF0QixDQUE2QjcrQixLQUFLeWlDLEdBQUwsQ0FBUzQvQixPQUF0QyxDQUFiLENBRUEsQ0FFRCxDQUVELE1BRUQsSUFBSyxtQkFBTCxDQUVDbHlFLE9BQVMscUJBQUEsQ0FBdUI2UCxLQUFLMjFFLEdBQTVCLENBQWlDMzFFLEtBQUs0MUUsTUFBdEMsQ0FBOEM1MUUsS0FBS3dpQixJQUFuRCxDQUF5RHhpQixLQUFLeWlCLEdBQTlELENBQVQsQ0FFQSxHQUFLemlCLEtBQUs2MUUsS0FBTCxHQUFlNW1GLFNBQXBCLENBQWdDa0IsT0FBTzBsRixLQUFQLENBQWU3MUUsS0FBSzYxRSxLQUFwQixDQUNoQyxHQUFLNzFFLEtBQUtvdEMsSUFBTCxHQUFjbitDLFNBQW5CLENBQStCa0IsT0FBT2k5QyxJQUFQLENBQWNwdEMsS0FBS290QyxJQUFuQixDQUMvQixHQUFLcHRDLEtBQUs4MUUsU0FBTCxHQUFtQjdtRixTQUF4QixDQUFvQ2tCLE9BQU8ybEYsU0FBUCxDQUFtQjkxRSxLQUFLODFFLFNBQXhCLENBQ3BDLEdBQUs5MUUsS0FBSysxRSxVQUFMLEdBQW9COW1GLFNBQXpCLENBQXFDa0IsT0FBTzRsRixVQUFQLENBQW9CLzFFLEtBQUsrMUUsVUFBekIsQ0FDckMsR0FBSy8xRSxLQUFLcXRDLElBQUwsR0FBY3ArQyxTQUFuQixDQUErQmtCLE9BQU9rOUMsSUFBUCxDQUFjempELE9BQU80bkIsTUFBUCxDQUFlLEVBQWYsQ0FBbUJ4UixLQUFLcXRDLElBQXhCLENBQWQsQ0FFL0IsTUFFRCxJQUFLLG9CQUFMLENBRUNsOUMsT0FBUyxzQkFBQSxDQUF3QjZQLEtBQUtvaUIsSUFBN0IsQ0FBbUNwaUIsS0FBS3FpQixLQUF4QyxDQUErQ3JpQixLQUFLc2lCLEdBQXBELENBQXlEdGlCLEtBQUt1aUIsTUFBOUQsQ0FBc0V2aUIsS0FBS3dpQixJQUEzRSxDQUFpRnhpQixLQUFLeWlCLEdBQXRGLENBQVQsQ0FFQSxHQUFLemlCLEtBQUtvdEMsSUFBTCxHQUFjbitDLFNBQW5CLENBQStCa0IsT0FBT2k5QyxJQUFQLENBQWNwdEMsS0FBS290QyxJQUFuQixDQUMvQixHQUFLcHRDLEtBQUtxdEMsSUFBTCxHQUFjcCtDLFNBQW5CLENBQStCa0IsT0FBT2s5QyxJQUFQLENBQWN6akQsT0FBTzRuQixNQUFQLENBQWUsRUFBZixDQUFtQnhSLEtBQUtxdEMsSUFBeEIsQ0FBZCxDQUUvQixNQUVELElBQUssY0FBTCxDQUVDbDlDLE9BQVMsZ0JBQUEsQ0FBa0I2UCxLQUFLNitCLEtBQXZCLENBQThCNytCLEtBQUsrN0QsU0FBbkMsQ0FBVCxDQUVBLE1BRUQsSUFBSyxrQkFBTCxDQUVDNXJFLE9BQVMsb0JBQUEsQ0FBc0I2UCxLQUFLNitCLEtBQTNCLENBQWtDNytCLEtBQUsrN0QsU0FBdkMsQ0FBVCxDQUVBLE1BRUQsSUFBSyxZQUFMLENBRUM1ckUsT0FBUyxjQUFBLENBQWdCNlAsS0FBSzYrQixLQUFyQixDQUE0QjcrQixLQUFLKzdELFNBQWpDLENBQTRDLzdELEtBQUt5MkIsUUFBakQsQ0FBMkR6MkIsS0FBSzJqQyxLQUFoRSxDQUFULENBRUEsTUFFRCxJQUFLLGVBQUwsQ0FFQ3h6QyxPQUFTLGlCQUFBLENBQW1CNlAsS0FBSzYrQixLQUF4QixDQUErQjcrQixLQUFLKzdELFNBQXBDLENBQStDLzdELEtBQUswc0IsS0FBcEQsQ0FBMkQxc0IsS0FBSzJzQixNQUFoRSxDQUFULENBRUEsTUFFRCxJQUFLLFdBQUwsQ0FFQ3g4QixPQUFTLGFBQUEsQ0FBZTZQLEtBQUs2K0IsS0FBcEIsQ0FBMkI3K0IsS0FBSys3RCxTQUFoQyxDQUEyQy83RCxLQUFLeTJCLFFBQWhELENBQTBEejJCLEtBQUttWCxLQUEvRCxDQUFzRW5YLEtBQUt1OEQsUUFBM0UsQ0FBcUZ2OEQsS0FBSzJqQyxLQUExRixDQUFULENBRUEsTUFFRCxJQUFLLGlCQUFMLENBRUN4ekMsT0FBUyxtQkFBQSxDQUFxQjZQLEtBQUs2K0IsS0FBMUIsQ0FBaUM3K0IsS0FBS3FrQyxXQUF0QyxDQUFtRHJrQyxLQUFLKzdELFNBQXhELENBQVQsQ0FFQSxNQUVELElBQUssYUFBTCxDQUVDbjJELFFBQVE2UCxJQUFSLENBQWMsb0VBQWQsRUFFRCxJQUFLLE1BQUwsQ0FFQyxhQUFlK2tHLFlBQWF4NkcsS0FBSzR3QixRQUFsQixDQUFmLENBQ0EsYUFBZTZwRixZQUFhejZHLEtBQUs0c0MsUUFBbEIsQ0FBZixDQUVBLEdBQUtoYyxTQUFTb29DLEtBQVQsRUFBa0Jwb0MsU0FBU29vQyxLQUFULENBQWUxb0UsTUFBZixDQUF3QixDQUEvQyxDQUFtRCxDQUVsREgsT0FBUyxlQUFBLENBQWlCeWdDLFFBQWpCLENBQTJCZ2MsUUFBM0IsQ0FBVCxDQUVBLENBSkQsSUFJTyxDQUVOejhDLE9BQVMsUUFBQSxDQUFVeWdDLFFBQVYsQ0FBb0JnYyxRQUFwQixDQUFULENBRUEsQ0FFRCxNQUVELElBQUssS0FBTCxDQUVDejhDLE9BQVMsT0FBQSxFQUFULENBRUEsTUFFRCxJQUFLLE1BQUwsQ0FFQ0EsT0FBUyxRQUFBLENBQVVxcUgsWUFBYXg2RyxLQUFLNHdCLFFBQWxCLENBQVYsQ0FBd0M2cEYsWUFBYXo2RyxLQUFLNHNDLFFBQWxCLENBQXhDLENBQXNFNXNDLEtBQUs5SCxJQUEzRSxDQUFULENBRUEsTUFFRCxJQUFLLFVBQUwsQ0FFQy9ILE9BQVMsWUFBQSxDQUFjcXFILFlBQWF4NkcsS0FBSzR3QixRQUFsQixDQUFkLENBQTRDNnBGLFlBQWF6NkcsS0FBSzRzQyxRQUFsQixDQUE1QyxDQUFULENBRUEsTUFFRCxJQUFLLGNBQUwsQ0FFQ3o4QyxPQUFTLGdCQUFBLENBQWtCcXFILFlBQWF4NkcsS0FBSzR3QixRQUFsQixDQUFsQixDQUFnRDZwRixZQUFhejZHLEtBQUs0c0MsUUFBbEIsQ0FBaEQsQ0FBVCxDQUVBLE1BRUQsSUFBSyxZQUFMLENBQ0EsSUFBSyxRQUFMLENBRUN6OEMsT0FBUyxVQUFBLENBQVlxcUgsWUFBYXg2RyxLQUFLNHdCLFFBQWxCLENBQVosQ0FBMEM2cEYsWUFBYXo2RyxLQUFLNHNDLFFBQWxCLENBQTFDLENBQVQsQ0FFQSxNQUVELElBQUssUUFBTCxDQUVDejhDLE9BQVMsVUFBQSxDQUFZc3FILFlBQWF6NkcsS0FBSzRzQyxRQUFsQixDQUFaLENBQVQsQ0FFQSxNQUVELElBQUssT0FBTCxDQUVDejhDLE9BQVMsU0FBQSxFQUFULENBRUEsTUFFRCxRQUVDQSxPQUFTLFlBQUEsRUFBVCxDQTNKRixDQStKQUEsT0FBTzY2QixJQUFQLENBQWNockIsS0FBS2dyQixJQUFuQixDQUVBLEdBQUtockIsS0FBS3JULElBQUwsR0FBY3NDLFNBQW5CLENBQStCa0IsT0FBT3hELElBQVAsQ0FBY3FULEtBQUtyVCxJQUFuQixDQUUvQixHQUFLcVQsS0FBSzRoQixNQUFMLEdBQWdCM3lCLFNBQXJCLENBQWlDLENBRWhDa0IsT0FBT3l4QixNQUFQLENBQWM1SixTQUFkLENBQXlCaFksS0FBSzRoQixNQUE5QixFQUVBLEdBQUs1aEIsS0FBSzJyQixnQkFBTCxHQUEwQjE4QixTQUEvQixDQUEyQ2tCLE9BQU93N0IsZ0JBQVAsQ0FBMEIzckIsS0FBSzJyQixnQkFBL0IsQ0FDM0MsR0FBS3g3QixPQUFPdzdCLGdCQUFaLENBQStCeDdCLE9BQU95eEIsTUFBUCxDQUFjSCxTQUFkLENBQXlCdHhCLE9BQU9veEIsUUFBaEMsQ0FBMENweEIsT0FBT3F4QixVQUFqRCxDQUE2RHJ4QixPQUFPbXdCLEtBQXBFLEVBRS9CLENBUEQsSUFPTyxDQUVOLEdBQUt0Z0IsS0FBS3VoQixRQUFMLEdBQWtCdHlCLFNBQXZCLENBQW1Da0IsT0FBT294QixRQUFQLENBQWdCdkosU0FBaEIsQ0FBMkJoWSxLQUFLdWhCLFFBQWhDLEVBQ25DLEdBQUt2aEIsS0FBS2lxQixRQUFMLEdBQWtCaDdCLFNBQXZCLENBQW1Da0IsT0FBTzg1QixRQUFQLENBQWdCalMsU0FBaEIsQ0FBMkJoWSxLQUFLaXFCLFFBQWhDLEVBQ25DLEdBQUtqcUIsS0FBS3doQixVQUFMLEdBQW9CdnlCLFNBQXpCLENBQXFDa0IsT0FBT3F4QixVQUFQLENBQWtCeEosU0FBbEIsQ0FBNkJoWSxLQUFLd2hCLFVBQWxDLEVBQ3JDLEdBQUt4aEIsS0FBS3NnQixLQUFMLEdBQWVyeEIsU0FBcEIsQ0FBZ0NrQixPQUFPbXdCLEtBQVAsQ0FBYXRJLFNBQWIsQ0FBd0JoWSxLQUFLc2dCLEtBQTdCLEVBRWhDLENBRUQsR0FBS3RnQixLQUFLOHBDLFVBQUwsR0FBb0I3NkMsU0FBekIsQ0FBcUNrQixPQUFPMjVDLFVBQVAsQ0FBb0I5cEMsS0FBSzhwQyxVQUF6QixDQUNyQyxHQUFLOXBDLEtBQUsrcEMsYUFBTCxHQUF1Qjk2QyxTQUE1QixDQUF3Q2tCLE9BQU80NUMsYUFBUCxDQUF1Qi9wQyxLQUFLK3BDLGFBQTVCLENBRXhDLEdBQUsvcEMsS0FBS2tqQyxNQUFWLENBQW1CLENBRWxCLEdBQUtsakMsS0FBS2tqQyxNQUFMLENBQVlpNUIsSUFBWixHQUFxQmx0RSxTQUExQixDQUFzQ2tCLE9BQU8reUMsTUFBUCxDQUFjaTVCLElBQWQsQ0FBcUJuOEQsS0FBS2tqQyxNQUFMLENBQVlpNUIsSUFBakMsQ0FDdEMsR0FBS244RCxLQUFLa2pDLE1BQUwsQ0FBWTdaLE1BQVosR0FBdUJwNkIsU0FBNUIsQ0FBd0NrQixPQUFPK3lDLE1BQVAsQ0FBYzdaLE1BQWQsQ0FBdUJycEIsS0FBS2tqQyxNQUFMLENBQVk3WixNQUFuQyxDQUN4QyxHQUFLcnBCLEtBQUtrakMsTUFBTCxDQUFZazVCLE9BQVosR0FBd0JudEUsU0FBN0IsQ0FBeUNrQixPQUFPK3lDLE1BQVAsQ0FBY2s1QixPQUFkLENBQXNCcGtELFNBQXRCLENBQWlDaFksS0FBS2tqQyxNQUFMLENBQVlrNUIsT0FBN0MsRUFDekMsR0FBS3A4RCxLQUFLa2pDLE1BQUwsQ0FBWW5iLE1BQVosR0FBdUI5NEIsU0FBNUIsQ0FBd0NrQixPQUFPK3lDLE1BQVAsQ0FBY25iLE1BQWQsQ0FBdUIsS0FBSyt4RixXQUFMLENBQWtCOTVHLEtBQUtrakMsTUFBTCxDQUFZbmIsTUFBOUIsQ0FBdkIsQ0FFeEMsQ0FFRCxHQUFLL25CLEtBQUs2cEMsT0FBTCxHQUFpQjU2QyxTQUF0QixDQUFrQ2tCLE9BQU8wNUMsT0FBUCxDQUFpQjdwQyxLQUFLNnBDLE9BQXRCLENBQ2xDLEdBQUs3cEMsS0FBS2dxQyxhQUFMLEdBQXVCLzZDLFNBQTVCLENBQXdDa0IsT0FBTzY1QyxhQUFQLENBQXVCaHFDLEtBQUtncUMsYUFBNUIsQ0FDeEMsR0FBS2hxQyxLQUFLaXFDLFdBQUwsR0FBcUJoN0MsU0FBMUIsQ0FBc0NrQixPQUFPODVDLFdBQVAsQ0FBcUJqcUMsS0FBS2lxQyxXQUExQixDQUN0QyxHQUFLanFDLEtBQUtrcUMsUUFBTCxHQUFrQmo3QyxTQUF2QixDQUFtQ2tCLE9BQU8rNUMsUUFBUCxDQUFrQmxxQyxLQUFLa3FDLFFBQXZCLENBRW5DLEdBQUtscUMsS0FBS3FwQyxRQUFMLEdBQWtCcDZDLFNBQXZCLENBQW1DLENBRWxDLGFBQWUrUSxLQUFLcXBDLFFBQXBCLENBRUEsSUFBTSxNQUFRLENBQWQsQ0FBaUIxNEMsRUFBSTA0QyxTQUFTLzRDLE1BQTlCLENBQXNDSyxHQUF0QyxDQUE2QyxDQUU1Q1IsT0FBT3FsQixHQUFQLENBQVksS0FBS3NrRyxXQUFMLENBQWtCendFLFNBQVUxNEMsQ0FBVixDQUFsQixDQUFpQ3k3QyxVQUFqQyxDQUE2Q0MsU0FBN0MsQ0FBWixFQUVBLENBRUQsQ0FFRCxHQUFLcnNDLEtBQUsxVSxJQUFMLEdBQWMsS0FBbkIsQ0FBMkIsQ0FFMUIsV0FBYTBVLEtBQUsrbUYsTUFBbEIsQ0FFQSxJQUFNLE1BQVEsQ0FBZCxDQUFpQjN6RixFQUFJMnpGLE9BQU96MkYsTUFBNUIsQ0FBb0M4QyxHQUFwQyxDQUEyQyxDQUUxQyxVQUFZMnpGLE9BQVEzekYsQ0FBUixDQUFaLENBQ0EsVUFBWWpELE9BQU9zN0MsbUJBQVAsQ0FBNEIsTUFBNUIsQ0FBb0NxNkMsTUFBTTMxRixNQUExQyxDQUFaLENBRUEsR0FBS3c3QyxRQUFVMThDLFNBQWYsQ0FBMkIsQ0FFMUJrQixPQUFPODJGLFFBQVAsQ0FBaUJ0N0MsS0FBakIsQ0FBd0JtNkMsTUFBTXJ2RCxRQUE5QixFQUVBLENBRUQsQ0FFRCxDQUVELGFBQUEsQ0FFQSxDQS94QnFDLENBQXZDLEVBbXlCQSxvQkFBc0IsQ0FDckJ2SyxVQUFXQSxTQURVLENBRXJCZ2lDLHNCQUF1QkEscUJBRkYsQ0FHckJ3c0Qsc0JBQXVCQSxxQkFIRixDQUlyQkMsaUNBQWtDQSxnQ0FKYixDQUtyQkMsaUNBQWtDQSxnQ0FMYixDQU1yQkMsMkJBQTRCQSwwQkFOUCxDQU9yQjFnRCx3QkFBeUJBLHVCQVBKLENBUXJCQyx3QkFBeUJBLHVCQVJKLENBQXRCLENBV0EscUJBQXVCLENBQ3RCc1csZUFBZ0JBLGNBRE0sQ0FFdEJybEQsb0JBQXFCQSxtQkFGQyxDQUd0QnVsRCx1QkFBd0JBLHNCQUhGLENBQXZCLENBTUEsbUJBQXFCLENBQ3BCOWhELGNBQWVBLGFBREssQ0FFcEJtOEMsMkJBQTRCQSwwQkFGUixDQUdwQkMsMEJBQTJCQSx5QkFIUCxDQUlwQjUvQyxhQUFjQSxZQUpNLENBS3BCMGxELDBCQUEyQkEseUJBTFAsQ0FNcEJ6bEQseUJBQTBCQSx3QkFOTixDQUFyQixDQVNBOzs7TUFLQSxrQkFBQSxFQUFxQixDQUVwQixLQUFLamdDLElBQUwsQ0FBWSxXQUFaLENBRUEsS0FBS3V6QyxLQUFMLENBQWEsU0FBQSxFQUFiLENBRUEsS0FBS2k4RSxRQUFMLENBQWdCLEVBQWhCLENBQ0EsS0FBS0MsV0FBTCxDQUFtQixJQUFuQixDQUVBLENBRURueEgsT0FBTzRuQixNQUFQLENBQWV3cEcsVUFBVW54SCxTQUF6QixDQUFvQyxDQUVuQ3k5RyxPQUFRLFNBQVdwa0csQ0FBWCxDQUFjd1EsQ0FBZCxDQUFrQixDQUV6QixLQUFLcW5HLFdBQUwsQ0FBbUIsUUFBQSxFQUFuQixDQUNBLEtBQUtELFFBQUwsQ0FBY2hySCxJQUFkLENBQW9CLEtBQUtpckgsV0FBekIsRUFDQSxLQUFLQSxXQUFMLENBQWlCelQsTUFBakIsQ0FBeUJwa0csQ0FBekIsQ0FBNEJ3USxDQUE1QixFQUVBLENBUmtDLENBVW5DNnpGLE9BQVEsU0FBV3JrRyxDQUFYLENBQWN3USxDQUFkLENBQWtCLENBRXpCLEtBQUtxbkcsV0FBTCxDQUFpQnhULE1BQWpCLENBQXlCcmtHLENBQXpCLENBQTRCd1EsQ0FBNUIsRUFFQSxDQWRrQyxDQWdCbkM4ekYsaUJBQWtCLFNBQVdDLElBQVgsQ0FBaUJDLElBQWpCLENBQXVCM0UsRUFBdkIsQ0FBMkJDLEVBQTNCLENBQWdDLENBRWpELEtBQUsrWCxXQUFMLENBQWlCdlQsZ0JBQWpCLENBQW1DQyxJQUFuQyxDQUF5Q0MsSUFBekMsQ0FBK0MzRSxFQUEvQyxDQUFtREMsRUFBbkQsRUFFQSxDQXBCa0MsQ0FzQm5DMkUsY0FBZSxTQUFXQyxLQUFYLENBQWtCQyxLQUFsQixDQUF5QkMsS0FBekIsQ0FBZ0NDLEtBQWhDLENBQXVDaEYsRUFBdkMsQ0FBMkNDLEVBQTNDLENBQWdELENBRTlELEtBQUsrWCxXQUFMLENBQWlCcFQsYUFBakIsQ0FBZ0NDLEtBQWhDLENBQXVDQyxLQUF2QyxDQUE4Q0MsS0FBOUMsQ0FBcURDLEtBQXJELENBQTREaEYsRUFBNUQsQ0FBZ0VDLEVBQWhFLEVBRUEsQ0ExQmtDLENBNEJuQ2dGLFdBQVksU0FBV2pWLEdBQVgsQ0FBaUIsQ0FFNUIsS0FBS2dvQixXQUFMLENBQWlCL1MsVUFBakIsQ0FBNkJqVixHQUE3QixFQUVBLENBaENrQyxDQWtDbkNrb0IsU0FBVSxTQUFXQyxLQUFYLENBQWtCQyxPQUFsQixDQUE0QixDQUVyQyx3QkFBQSxDQUEwQkMsVUFBMUIsQ0FBdUMsQ0FFdEMsV0FBYSxFQUFiLENBRUEsSUFBTSxNQUFRLENBQVIsQ0FBV2hvSCxFQUFJZ29ILFdBQVc5cUgsTUFBaEMsQ0FBd0NLLEVBQUl5QyxDQUE1QyxDQUErQ3pDLEdBQS9DLENBQXNELENBRXJELFlBQWN5cUgsV0FBWXpxSCxDQUFaLENBQWQsQ0FFQSxhQUFlLFNBQUEsRUFBZixDQUNBMHFILFNBQVM5VSxNQUFULENBQWtCK1UsUUFBUS9VLE1BQTFCLENBRUFqNkQsT0FBT3g4QyxJQUFQLENBQWF1ckgsUUFBYixFQUVBLENBRUQsYUFBQSxDQUVBLENBRUQsNkJBQUEsQ0FBK0JsbUIsSUFBL0IsQ0FBcUNvbUIsU0FBckMsQ0FBaUQsQ0FFaEQsWUFBY0EsVUFBVWpySCxNQUF4QixDQUVBO0VBQ0E7RUFDQTtFQUNBO0VBQ0EsV0FBYSxLQUFiLENBQ0EsSUFBTSxNQUFRa3JILFFBQVUsQ0FBbEIsQ0FBcUIxL0YsRUFBSSxDQUEvQixDQUFrQ0EsRUFBSTAvRixPQUF0QyxDQUErQ2h0RyxFQUFJc04sR0FBbkQsQ0FBMEQsQ0FFekQsY0FBZ0J5L0YsVUFBVy9zRyxDQUFYLENBQWhCLENBQ0EsZUFBaUIrc0csVUFBV3ovRixDQUFYLENBQWpCLENBRUEsV0FBYTIvRixXQUFXdjRHLENBQVgsQ0FBZXc0RyxVQUFVeDRHLENBQXRDLENBQ0EsV0FBYXU0RyxXQUFXL25HLENBQVgsQ0FBZWdvRyxVQUFVaG9HLENBQXRDLENBRUEsR0FBS2xoQixLQUFLeWtCLEdBQUwsQ0FBVTBrRyxNQUFWLEVBQXFCMXFHLE9BQU9DLE9BQWpDLENBQTJDO0VBRzFDLEdBQUt5cUcsT0FBUyxDQUFkLENBQWtCLENBRWpCRCxVQUFZSCxVQUFXei9GLENBQVgsQ0FBWixDQUE0QjgvRixPQUFTLENBQUVBLE1BQVgsQ0FDNUJILFdBQWFGLFVBQVcvc0csQ0FBWCxDQUFiLENBQTZCbXRHLE9BQVMsQ0FBRUEsTUFBWCxDQUU3QixDQUNELEdBQU94bUIsS0FBS3poRixDQUFMLENBQVNnb0csVUFBVWhvRyxDQUFyQixFQUE4QnloRixLQUFLemhGLENBQUwsQ0FBUytuRyxXQUFXL25HLENBQXZELENBQStELFNBRS9ELEdBQUt5aEYsS0FBS3poRixDQUFMLEdBQVdnb0csVUFBVWhvRyxDQUExQixDQUE4QixDQUU3QixHQUFLeWhGLEtBQUtqeUYsQ0FBTCxHQUFXdzRHLFVBQVV4NEcsQ0FBMUIsQ0FBK0IsV0FBQSxDQUFjO0VBQzdDO0VBRUEsQ0FMRCxJQUtPLENBRU4sYUFBZXk0RyxRQUFXeG1CLEtBQUtqeUYsQ0FBTCxDQUFTdzRHLFVBQVV4NEcsQ0FBOUIsRUFBb0MwNEcsUUFBV3ptQixLQUFLemhGLENBQUwsQ0FBU2dvRyxVQUFVaG9HLENBQTlCLENBQW5ELENBQ0EsR0FBS21vRyxXQUFhLENBQWxCLENBQXlCLFdBQUEsQ0FBYztFQUN2QyxHQUFLQSxTQUFXLENBQWhCLENBQXdCLFNBQ3hCcHBCLE9BQVMsQ0FBRUEsTUFBWCxDQUFvQjtFQUVwQixDQUVELENBekJELElBeUJPO0VBR04sR0FBSzBDLEtBQUt6aEYsQ0FBTCxHQUFXZ29HLFVBQVVob0csQ0FBMUIsQ0FBZ0MsU0FBWTtFQUM1QztFQUNBLEdBQVMrbkcsV0FBV3Y0RyxDQUFYLEVBQWdCaXlGLEtBQUtqeUYsQ0FBdkIsRUFBZ0NpeUYsS0FBS2p5RixDQUFMLEVBQVV3NEcsVUFBVXg0RyxDQUF0RCxFQUNDdzRHLFVBQVV4NEcsQ0FBVixFQUFlaXlGLEtBQUtqeUYsQ0FBdEIsRUFBK0JpeUYsS0FBS2p5RixDQUFMLEVBQVV1NEcsV0FBV3Y0RyxDQUR4RCxDQUNpRSxXQUFBLENBQWE7RUFDOUU7RUFFQSxDQUVELENBRUQsYUFBQSxDQUVBLENBRUQsZ0JBQWtCMHhGLFdBQVc5QixXQUE3QixDQUVBLGFBQWUsS0FBS2dvQixRQUFwQixDQUNBLEdBQUtBLFNBQVN4cUgsTUFBVCxHQUFvQixDQUF6QixDQUE2QixPQUFPLEVBQVAsQ0FFN0IsR0FBSzZxSCxVQUFZLElBQWpCLENBQXdCLHVCQUF3QkwsUUFBakIsQ0FBUCxDQUd4QixTQUFBLENBQVdRLE9BQVgsQ0FBb0JELFFBQXBCLENBQThCL3VFLE9BQVMsRUFBdkMsQ0FFQSxHQUFLd3VFLFNBQVN4cUgsTUFBVCxHQUFvQixDQUF6QixDQUE2QixDQUU1QmdySCxRQUFVUixTQUFVLENBQVYsQ0FBVixDQUNBTyxTQUFXLFNBQUEsRUFBWCxDQUNBQSxTQUFTOVUsTUFBVCxDQUFrQitVLFFBQVEvVSxNQUExQixDQUNBajZELE9BQU94OEMsSUFBUCxDQUFhdXJILFFBQWIsRUFDQSxhQUFBLENBRUEsQ0FFRCxlQUFpQixDQUFFdm9CLFlBQWFnb0IsU0FBVSxDQUFWLEVBQWN4WixTQUFkLEVBQWIsQ0FBbkIsQ0FDQXdhLFdBQWFaLE1BQVEsQ0FBRVksVUFBVixDQUF1QkEsVUFBcEMsQ0FFQTtFQUVBLHFCQUF1QixFQUF2QixDQUNBLGNBQWdCLEVBQWhCLENBQ0Esa0JBQW9CLEVBQXBCLENBQ0EsWUFBYyxDQUFkLENBQ0EsYUFBQSxDQUVBQyxVQUFXQyxPQUFYLEVBQXVCL3NILFNBQXZCLENBQ0FndEgsY0FBZUQsT0FBZixFQUEyQixFQUEzQixDQUVBLElBQU0sTUFBUSxDQUFSLENBQVc1b0gsRUFBSTBuSCxTQUFTeHFILE1BQTlCLENBQXNDSyxFQUFJeUMsQ0FBMUMsQ0FBNkN6QyxHQUE3QyxDQUFvRCxDQUVuRDJxSCxRQUFVUixTQUFVbnFILENBQVYsQ0FBVixDQUNBdXJILFVBQVlaLFFBQVFoYSxTQUFSLEVBQVosQ0FDQTZhLE1BQVFycEIsWUFBYW9wQixTQUFiLENBQVIsQ0FDQUMsTUFBUWpCLE1BQVEsQ0FBRWlCLEtBQVYsQ0FBa0JBLEtBQTFCLENBRUEsR0FBS0EsS0FBTCxDQUFhLENBRVosR0FBTyxDQUFFTCxVQUFKLEVBQXNCQyxVQUFXQyxPQUFYLENBQTNCLENBQW9EQSxVQUVwREQsVUFBV0MsT0FBWCxFQUF1QixDQUFFOW9ILEVBQUcsU0FBQSxFQUFMLENBQWtCc2IsRUFBRzB0RyxTQUFyQixDQUF2QixDQUNBSCxVQUFXQyxPQUFYLEVBQXFCOW9ILENBQXJCLENBQXVCcXpHLE1BQXZCLENBQWdDK1UsUUFBUS9VLE1BQXhDLENBRUEsR0FBS3VWLFVBQUwsQ0FBa0JFLFVBQ2xCQyxjQUFlRCxPQUFmLEVBQTJCLEVBQTNCLENBRUE7RUFFQSxDQVpELElBWU8sQ0FFTkMsY0FBZUQsT0FBZixFQUF5QmxzSCxJQUF6QixDQUErQixDQUFFNnlCLEVBQUcyNEYsT0FBTCxDQUFjOXNHLEVBQUcwdEcsVUFBVyxDQUFYLENBQWpCLENBQS9CLEVBRUE7RUFFQSxDQUVELENBRUQ7RUFDQSxHQUFLLENBQUVILFVBQVcsQ0FBWCxDQUFQLENBQXdCLHVCQUF3QmpCLFFBQWpCLENBQVAsQ0FHeEIsR0FBS2lCLFVBQVV6ckgsTUFBVixDQUFtQixDQUF4QixDQUE0QixDQUUzQixjQUFnQixLQUFoQixDQUNBLGFBQWUsRUFBZixDQUVBLElBQU0sU0FBVyxDQUFYLENBQWM4ckgsS0FBT0wsVUFBVXpySCxNQUFyQyxDQUE2QytySCxLQUFPRCxJQUFwRCxDQUEwREMsTUFBMUQsQ0FBb0UsQ0FFbkVDLGlCQUFrQkQsSUFBbEIsRUFBMkIsRUFBM0IsQ0FFQSxDQUVELElBQU0sU0FBVyxDQUFYLENBQWNELEtBQU9MLFVBQVV6ckgsTUFBckMsQ0FBNkMrckgsS0FBT0QsSUFBcEQsQ0FBMERDLE1BQTFELENBQW9FLENBRW5FLFFBQVVKLGNBQWVJLElBQWYsQ0FBVixDQUVBLElBQU0sU0FBVyxDQUFqQixDQUFvQkUsS0FBT0MsSUFBSWxzSCxNQUEvQixDQUF1Q2lzSCxNQUF2QyxDQUFpRCxDQUVoRCxPQUFTQyxJQUFLRCxJQUFMLENBQVQsQ0FDQSxvQkFBc0IsSUFBdEIsQ0FFQSxJQUFNLFVBQVksQ0FBbEIsQ0FBcUJFLE1BQVFWLFVBQVV6ckgsTUFBdkMsQ0FBK0Ntc0gsT0FBL0MsQ0FBMEQsQ0FFekQsR0FBS0MscUJBQXNCQyxHQUFHbnVHLENBQXpCLENBQTRCdXRHLFVBQVdVLEtBQVgsRUFBbUJqdUcsQ0FBL0MsQ0FBTCxDQUEwRCxDQUV6RCxHQUFLNnRHLE9BQVNJLEtBQWQsQ0FBc0JHLFNBQVM5c0gsSUFBVCxDQUFlLENBQUUrc0gsTUFBT1IsSUFBVCxDQUFlUyxJQUFLTCxLQUFwQixDQUEyQmxyQixLQUFNZ3JCLElBQWpDLENBQWYsRUFDdEIsR0FBS1EsZUFBTCxDQUF1QixDQUV0QkEsZ0JBQWtCLEtBQWxCLENBQ0FULGlCQUFrQkcsS0FBbEIsRUFBMEIzc0gsSUFBMUIsQ0FBZ0M2c0gsRUFBaEMsRUFFQSxDQUxELElBS08sQ0FFTkssVUFBWSxJQUFaLENBRUEsQ0FFRCxDQUVELENBQ0QsR0FBS0QsZUFBTCxDQUF1QixDQUV0QlQsaUJBQWtCRCxJQUFsQixFQUF5QnZzSCxJQUF6QixDQUErQjZzSCxFQUEvQixFQUVBLENBRUQsQ0FFRCxDQUNEO0VBQ0EsR0FBS0MsU0FBU3RzSCxNQUFULENBQWtCLENBQXZCLENBQTJCO0VBRzFCLEdBQUssQ0FBRTBzSCxTQUFQLENBQW1CZixjQUFnQkssZ0JBQWhCLENBRW5CLENBRUQsQ0FFRCxZQUFBLENBRUEsSUFBTSxNQUFRLENBQVIsQ0FBV3ZzRixHQUFLZ3NGLFVBQVV6ckgsTUFBaEMsQ0FBd0NLLEVBQUlvL0IsRUFBNUMsQ0FBZ0RwL0IsR0FBaEQsQ0FBdUQsQ0FFdEQwcUgsU0FBV1UsVUFBV3BySCxDQUFYLEVBQWV1QyxDQUExQixDQUNBbzVDLE9BQU94OEMsSUFBUCxDQUFhdXJILFFBQWIsRUFDQTRCLFNBQVdoQixjQUFldHJILENBQWYsQ0FBWCxDQUVBLElBQU0sTUFBUSxDQUFSLENBQVdpL0MsR0FBS3F0RSxTQUFTM3NILE1BQS9CLENBQXVDaWMsRUFBSXFqQyxFQUEzQyxDQUErQ3JqQyxHQUEvQyxDQUFzRCxDQUVyRDh1RyxTQUFTcG9CLEtBQVQsQ0FBZW5qRyxJQUFmLENBQXFCbXRILFNBQVUxd0csQ0FBVixFQUFjb1csQ0FBbkMsRUFFQSxDQUVELENBRUQ7RUFFQSxhQUFBLENBRUEsQ0FuUWtDLENBQXBDLEVBdVFBOzs7S0FLQSxhQUFBLENBQWUzaUIsSUFBZixDQUFzQixDQUVyQixLQUFLMVUsSUFBTCxDQUFZLE1BQVosQ0FFQSxLQUFLMFUsSUFBTCxDQUFZQSxJQUFaLENBRUEsQ0FFRHBXLE9BQU80bkIsTUFBUCxDQUFlMHJHLEtBQUtyekgsU0FBcEIsQ0FBK0IsQ0FFOUJzdkcsT0FBUSxJQUZzQixDQUk5QkMsZUFBZ0IsU0FBV0osSUFBWCxDQUFpQjlvRSxJQUFqQixDQUF1QnF4RSxTQUF2QixDQUFtQyxDQUVsRCxHQUFLcnhFLE9BQVNqaEMsU0FBZCxDQUEwQmloQyxLQUFPLEdBQVAsQ0FDMUIsR0FBS3F4RSxZQUFjdHlHLFNBQW5CLENBQStCc3lHLFVBQVksQ0FBWixDQUUvQixXQUFhLEVBQWIsQ0FDQSxVQUFZNGIsWUFBYW5rQixJQUFiLENBQW1COW9FLElBQW5CLENBQXlCcXhFLFNBQXpCLENBQW9DLEtBQUt2aEcsSUFBekMsQ0FBWixDQUVBLElBQU0sTUFBUSxDQUFSLENBQVdnN0QsR0FBS29pRCxNQUFNOXNILE1BQTVCLENBQW9Da2UsRUFBSXdzRCxFQUF4QyxDQUE0Q3hzRCxHQUE1QyxDQUFtRCxDQUVsRC9RLE1BQU01VCxTQUFOLENBQWdCaUcsSUFBaEIsQ0FBcUJpRSxLQUFyQixDQUE0QnU0QyxNQUE1QixDQUFvQzh3RSxNQUFPNXVHLENBQVAsRUFBV3lzRyxRQUFYLEVBQXBDLEVBRUEsQ0FFRCxhQUFBLENBRUEsQ0FwQjZCLENBQS9CLEVBd0JBLG9CQUFBLENBQXNCamlCLElBQXRCLENBQTRCOW9FLElBQTVCLENBQWtDcXhFLFNBQWxDLENBQTZDdmhHLElBQTdDLENBQW9ELENBRW5ELFVBQVlqTixPQUFRaW1HLElBQVIsRUFBZTVoRyxLQUFmLENBQXNCLEVBQXRCLENBQVosQ0FDQSxVQUFZODRCLEtBQU9sd0IsS0FBS21uRyxVQUF4QixDQUNBLGdCQUFrQixDQUFFbm5HLEtBQUtpdkMsV0FBTCxDQUFpQm91RSxJQUFqQixDQUF3QnI5RyxLQUFLaXZDLFdBQUwsQ0FBaUJxdUUsSUFBekMsQ0FBZ0R0OUcsS0FBS3U5RyxrQkFBdkQsRUFBOEVqOUYsS0FBaEcsQ0FFQSxVQUFZLEVBQVosQ0FFQSxZQUFjLENBQWQsQ0FBaUJ3dEIsUUFBVSxDQUEzQixDQUVBLElBQU0sTUFBUSxDQUFkLENBQWlCbjlDLEVBQUk2c0gsTUFBTWx0SCxNQUEzQixDQUFtQ0ssR0FBbkMsQ0FBMEMsQ0FFekMsU0FBVzZzSCxNQUFPN3NILENBQVAsQ0FBWCxDQUVBLEdBQUs4c0gsT0FBUyxJQUFkLENBQXFCLENBRXBCNXZFLFFBQVUsQ0FBVixDQUNBQyxTQUFXNHZFLFdBQVgsQ0FFQSxDQUxELElBS08sQ0FFTixRQUFVQyxXQUFZRixJQUFaLENBQWtCbGMsU0FBbEIsQ0FBNkJqaEYsS0FBN0IsQ0FBb0N1dEIsT0FBcEMsQ0FBNkNDLE9BQTdDLENBQXNEOXRDLElBQXRELENBQVYsQ0FDQTZ0QyxTQUFXdnZDLElBQUl1dkMsT0FBZixDQUNBdXZFLE1BQU10dEgsSUFBTixDQUFZd08sSUFBSXd5RCxJQUFoQixFQUVBLENBRUQsQ0FFRCxZQUFBLENBRUEsQ0FFRCxtQkFBQSxDQUFxQjJzRCxJQUFyQixDQUEyQmxjLFNBQTNCLENBQXNDamhGLEtBQXRDLENBQTZDdXRCLE9BQTdDLENBQXNEQyxPQUF0RCxDQUErRDl0QyxJQUEvRCxDQUFzRSxDQUVyRSxVQUFZQSxLQUFLNDlHLE1BQUwsQ0FBYUgsSUFBYixHQUF1Qno5RyxLQUFLNDlHLE1BQUwsQ0FBYSxHQUFiLENBQW5DLENBRUEsR0FBSyxDQUFFQyxLQUFQLENBQWUsT0FFZixTQUFXLGFBQUEsRUFBWCxDQUVBLEtBQUEsQ0FBT25xRyxDQUFQLENBQVVvcUcsR0FBVixDQUFlQyxHQUFmLENBQW9CQyxJQUFwQixDQUEwQkMsSUFBMUIsQ0FBZ0NDLElBQWhDLENBQXNDQyxJQUF0QyxDQUVBLEdBQUtOLE1BQU10dkcsQ0FBWCxDQUFlLENBRWQsWUFBY3N2RyxNQUFNTyxjQUFOLEdBQTBCUCxNQUFNTyxjQUFOLENBQXVCUCxNQUFNdHZHLENBQU4sQ0FBUW5YLEtBQVIsQ0FBZSxHQUFmLENBQWpELENBQWQsQ0FFQSxJQUFNLE1BQVEsQ0FBUixDQUFXaEUsRUFBSWlySCxRQUFRL3RILE1BQTdCLENBQXFDSyxFQUFJeUMsQ0FBekMsRUFBOEMsQ0FFN0MsV0FBYWlySCxRQUFTMXRILEdBQVQsQ0FBYixDQUVBLE9BQVMydEgsTUFBVCxFQUVDLElBQUssR0FBTDtFQUVDcDdHLEVBQUltN0csUUFBUzF0SCxHQUFULEVBQWtCMnZCLEtBQWxCLENBQTBCdXRCLE9BQTlCLENBQ0FuNkIsRUFBSTJxRyxRQUFTMXRILEdBQVQsRUFBa0IydkIsS0FBbEIsQ0FBMEJ3dEIsT0FBOUIsQ0FFQWdqQixLQUFLdzJDLE1BQUwsQ0FBYXBrRyxDQUFiLENBQWdCd1EsQ0FBaEIsRUFFQSxNQUVELElBQUssR0FBTDtFQUVDeFEsRUFBSW03RyxRQUFTMXRILEdBQVQsRUFBa0IydkIsS0FBbEIsQ0FBMEJ1dEIsT0FBOUIsQ0FDQW42QixFQUFJMnFHLFFBQVMxdEgsR0FBVCxFQUFrQjJ2QixLQUFsQixDQUEwQnd0QixPQUE5QixDQUVBZ2pCLEtBQUt5MkMsTUFBTCxDQUFhcmtHLENBQWIsQ0FBZ0J3USxDQUFoQixFQUVBLE1BRUQsSUFBSyxHQUFMO0VBRUNvcUcsSUFBTU8sUUFBUzF0SCxHQUFULEVBQWtCMnZCLEtBQWxCLENBQTBCdXRCLE9BQWhDLENBQ0Frd0UsSUFBTU0sUUFBUzF0SCxHQUFULEVBQWtCMnZCLEtBQWxCLENBQTBCd3RCLE9BQWhDLENBQ0Frd0UsS0FBT0ssUUFBUzF0SCxHQUFULEVBQWtCMnZCLEtBQWxCLENBQTBCdXRCLE9BQWpDLENBQ0Fvd0UsS0FBT0ksUUFBUzF0SCxHQUFULEVBQWtCMnZCLEtBQWxCLENBQTBCd3RCLE9BQWpDLENBRUFnakIsS0FBSzAyQyxnQkFBTCxDQUF1QndXLElBQXZCLENBQTZCQyxJQUE3QixDQUFtQ0gsR0FBbkMsQ0FBd0NDLEdBQXhDLEVBRUEsTUFFRCxJQUFLLEdBQUw7RUFFQ0QsSUFBTU8sUUFBUzF0SCxHQUFULEVBQWtCMnZCLEtBQWxCLENBQTBCdXRCLE9BQWhDLENBQ0Frd0UsSUFBTU0sUUFBUzF0SCxHQUFULEVBQWtCMnZCLEtBQWxCLENBQTBCd3RCLE9BQWhDLENBQ0Frd0UsS0FBT0ssUUFBUzF0SCxHQUFULEVBQWtCMnZCLEtBQWxCLENBQTBCdXRCLE9BQWpDLENBQ0Fvd0UsS0FBT0ksUUFBUzF0SCxHQUFULEVBQWtCMnZCLEtBQWxCLENBQTBCd3RCLE9BQWpDLENBQ0Fvd0UsS0FBT0csUUFBUzF0SCxHQUFULEVBQWtCMnZCLEtBQWxCLENBQTBCdXRCLE9BQWpDLENBQ0Fzd0UsS0FBT0UsUUFBUzF0SCxHQUFULEVBQWtCMnZCLEtBQWxCLENBQTBCd3RCLE9BQWpDLENBRUFnakIsS0FBSzYyQyxhQUFMLENBQW9CcVcsSUFBcEIsQ0FBMEJDLElBQTFCLENBQWdDQyxJQUFoQyxDQUFzQ0MsSUFBdEMsQ0FBNENMLEdBQTVDLENBQWlEQyxHQUFqRCxFQUVBLE1BMUNGLENBOENBLENBRUQsQ0FFRCxPQUFPLENBQUVsd0UsUUFBU2d3RSxNQUFNVSxFQUFOLENBQVdqK0YsS0FBdEIsQ0FBNkJ3d0MsS0FBTUEsSUFBbkMsQ0FBUCxDQUVBLENBRUQ7O0tBSUEsbUJBQUEsQ0FBcUJpdEMsT0FBckIsQ0FBK0IsQ0FFOUIsS0FBS0EsT0FBTCxDQUFpQkEsVUFBWTl1RyxTQUFkLENBQTRCOHVHLE9BQTVCLENBQXNDQyxxQkFBckQsQ0FFQSxDQUVEcDBHLE9BQU80bkIsTUFBUCxDQUFlZ3RHLFdBQVczMEgsU0FBMUIsQ0FBcUMsQ0FFcENxMEcsS0FBTSxTQUFXaHhFLEdBQVgsQ0FBZ0IrdkUsTUFBaEIsQ0FBd0JDLFVBQXhCLENBQW9DQyxPQUFwQyxDQUE4QyxDQUVuRCxVQUFZLElBQVosQ0FFQSxXQUFhLGNBQUEsQ0FBZ0IsS0FBS1ksT0FBckIsQ0FBYixDQUNBaUMsT0FBT04sT0FBUCxDQUFnQixLQUFLNXVDLElBQXJCLEVBQ0FrdkMsT0FBTzlCLElBQVAsQ0FBYWh4RSxHQUFiLENBQWtCLFNBQVc4ckUsSUFBWCxDQUFrQixDQUVuQyxRQUFBLENBRUEsR0FBSSxDQUVIOEosS0FBT240RixLQUFLc2lDLEtBQUwsQ0FBWStyRCxJQUFaLENBQVAsQ0FFQSxDQUFDLE1BQVExbUcsQ0FBUixDQUFZLENBRWJzVCxRQUFRNlAsSUFBUixDQUFjLHVGQUFkLEVBQ0FxdEYsS0FBT240RixLQUFLc2lDLEtBQUwsQ0FBWStyRCxLQUFLd2dCLFNBQUwsQ0FBZ0IsRUFBaEIsQ0FBb0J4Z0IsS0FBSzFvRyxNQUFMLENBQWMsQ0FBbEMsQ0FBWixDQUFQLENBRUEsQ0FFRCxTQUFXeWdDLE1BQU1rYyxLQUFOLENBQWE2MUQsSUFBYixDQUFYLENBRUEsR0FBSzdGLE1BQUwsQ0FBY0EsT0FBUS9ELElBQVIsRUFFZCxDQW5CRCxDQW1CR2dFLFVBbkJILENBbUJlQyxPQW5CZixFQXFCQSxDQTdCbUMsQ0ErQnBDbHdELE1BQU8sU0FBVzYxRCxJQUFYLENBQWtCLENBRXhCLGVBQU8sQ0FBVUEsSUFBVixDQUFQLENBRUEsQ0FuQ21DLENBcUNwQ3BELFFBQVMsU0FBV3B5RyxLQUFYLENBQW1CLENBRTNCLEtBQUt3akUsSUFBTCxDQUFZeGpFLEtBQVosQ0FDQSxXQUFBLENBRUEsQ0ExQ21DLENBQXJDLEVBOENBOztLQUlBLFdBQUEsQ0FFQSxpQkFBbUIsQ0FFbEJzL0IsV0FBWSxVQUFZLENBRXZCLEdBQUsxaEMsVUFBWStELFNBQWpCLENBQTZCLENBRTVCL0QsUUFBVSxJQUFNcUksT0FBT2tySCxZQUFQLEVBQXVCbHJILE9BQU9tckgsa0JBQXBDLEdBQVYsQ0FFQSxDQUVELGNBQUEsQ0FFQSxDQVppQixDQWNsQkMsV0FBWSxTQUFXcnhILEtBQVgsQ0FBbUIsQ0FFOUJwQyxRQUFVb0MsS0FBVixDQUVBLENBbEJpQixDQUFuQixDQXNCQTs7S0FJQSxvQkFBQSxDQUFzQnl3RyxPQUF0QixDQUFnQyxDQUUvQixLQUFLQSxPQUFMLENBQWlCQSxVQUFZOXVHLFNBQWQsQ0FBNEI4dUcsT0FBNUIsQ0FBc0NDLHFCQUFyRCxDQUVBLENBRURwMEcsT0FBTzRuQixNQUFQLENBQWVvdEcsWUFBWS8wSCxTQUEzQixDQUFzQyxDQUVyQ3EwRyxLQUFNLFNBQVdoeEUsR0FBWCxDQUFnQit2RSxNQUFoQixDQUF3QkMsVUFBeEIsQ0FBb0NDLE9BQXBDLENBQThDLENBRW5ELFdBQWEsY0FBQSxDQUFnQixLQUFLWSxPQUFyQixDQUFiLENBQ0FpQyxPQUFPTCxlQUFQLENBQXdCLGFBQXhCLEVBQ0FLLE9BQU85QixJQUFQLENBQWFoeEUsR0FBYixDQUFrQixTQUFXNFosTUFBWCxDQUFvQixDQUVyQyxZQUFjMjNFLGFBQWE3eEYsVUFBYixFQUFkLENBRUExaEMsUUFBUTJ6SCxlQUFSLENBQXlCLzNFLE1BQXpCLENBQWlDLFNBQVdnNEUsV0FBWCxDQUF5QixDQUV6RDdoQixPQUFRNmhCLFdBQVIsRUFFQSxDQUpELEVBTUEsQ0FWRCxDQVVHNWhCLFVBVkgsQ0FVZUMsT0FWZixFQVlBLENBbEJvQyxDQUF0QyxFQXNCQTs7S0FJQSxxQkFBQSxFQUF3QixDQUV2QixLQUFLN3hHLElBQUwsQ0FBWSxjQUFaLENBRUEsS0FBS3NxRixNQUFMLENBQWMsQ0FBZCxDQUVBLEtBQUttcEMsTUFBTCxDQUFjLEtBQWQsQ0FFQSxLQUFLN25DLE9BQUwsQ0FBZSxxQkFBQSxFQUFmLENBQ0EsS0FBS0EsT0FBTCxDQUFhL3RDLE1BQWIsQ0FBb0JGLE1BQXBCLENBQTRCLENBQTVCLEVBQ0EsS0FBS2l1QyxPQUFMLENBQWF2ckQsZ0JBQWIsQ0FBZ0MsS0FBaEMsQ0FFQSxLQUFLeXJELE9BQUwsQ0FBZSxxQkFBQSxFQUFmLENBQ0EsS0FBS0EsT0FBTCxDQUFhanVDLE1BQWIsQ0FBb0JGLE1BQXBCLENBQTRCLENBQTVCLEVBQ0EsS0FBS211QyxPQUFMLENBQWF6ckQsZ0JBQWIsQ0FBZ0MsS0FBaEMsQ0FFQSxDQUVEL2hDLE9BQU80bkIsTUFBUCxDQUFld3RHLGFBQWFuMUgsU0FBNUIsQ0FBdUMsQ0FFdEN5NkIsT0FBVSxVQUFZLENBRXJCLFlBQUEsQ0FBY3V4RCxLQUFkLENBQXFCRixHQUFyQixDQUEwQkMsTUFBMUIsQ0FBa0NwekQsSUFBbEMsQ0FBd0NDLEdBQXhDLENBQTZDMnFCLElBQTdDLENBQW1EMnhFLE1BQW5ELENBRUEsYUFBZSxXQUFBLEVBQWYsQ0FDQSxZQUFjLFdBQUEsRUFBZCxDQUVBLHNCQUFPLENBQWlCaDNGLE1BQWpCLENBQTBCLENBRWhDLGdCQUFrQjlaLFdBQWEsSUFBYixFQUFxQjRuRSxRQUFVOXRELE9BQU84dEQsS0FBdEMsRUFBK0NGLE1BQVE1dEQsT0FBTzR0RCxHQUE5RCxFQUNUQyxTQUFXN3RELE9BQU82dEQsTUFBUCxDQUFnQixLQUFLQSxNQUR2QixFQUNpQ3B6RCxPQUFTdUYsT0FBT3ZGLElBRGpELEVBRVRDLE1BQVFzRixPQUFPdEYsR0FGTixFQUVhMnFCLE9BQVNybEIsT0FBT3FsQixJQUY3QixFQUVxQzJ4RSxTQUFXLEtBQUtBLE1BRnZFLENBSUEsR0FBS3ptRSxXQUFMLENBQW1CLENBRWxCcnFDLFNBQVcsSUFBWCxDQUNBNG5FLE1BQVE5dEQsT0FBTzh0RCxLQUFmLENBQ0FGLElBQU01dEQsT0FBTzR0RCxHQUFiLENBQ0FDLE9BQVM3dEQsT0FBTzZ0RCxNQUFQLENBQWdCLEtBQUtBLE1BQTlCLENBQ0FwekQsS0FBT3VGLE9BQU92RixJQUFkLENBQ0FDLElBQU1zRixPQUFPdEYsR0FBYixDQUNBMnFCLEtBQU9ybEIsT0FBT3FsQixJQUFkLENBRUE7RUFDQTtFQUVBLHFCQUF1QnJsQixPQUFPQyxnQkFBUCxDQUF3QjFTLEtBQXhCLEVBQXZCLENBQ0F5cEcsT0FBUyxLQUFLQSxNQUFMLENBQWMsQ0FBdkIsQ0FDQSx1QkFBeUJBLE9BQVN2OEYsSUFBVCxDQUFnQnF6RCxLQUF6QyxDQUNBLFNBQWFyekQsS0FBT2h3QixLQUFLZ2tGLEdBQUwsQ0FBVWxpRSxNQUFNaEMsT0FBTixDQUFnQnFqRSxHQUFoQixDQUFzQixHQUFoQyxDQUFULENBQW1Edm9DLElBQTlELENBQ0EsUUFBQSxDQUFVNnhFLElBQVYsQ0FFQTtFQUVBQyxRQUFRN29HLFFBQVIsQ0FBa0IsRUFBbEIsRUFBeUIsQ0FBRTBvRyxNQUEzQixDQUNBSSxTQUFTOW9HLFFBQVQsQ0FBbUIsRUFBbkIsRUFBMEIwb0csTUFBMUIsQ0FFQTtFQUVBSyxLQUFPLENBQUVDLElBQUYsQ0FBU3pwQyxNQUFULENBQWtCMHBDLGtCQUF6QixDQUNBTCxLQUFPSSxLQUFPenBDLE1BQVAsQ0FBZ0IwcEMsa0JBQXZCLENBRUF0M0YsaUJBQWlCM1IsUUFBakIsQ0FBMkIsQ0FBM0IsRUFBaUMsRUFBSW1NLElBQUosRUFBYXk4RixLQUFPRyxJQUFwQixDQUFqQyxDQUNBcDNGLGlCQUFpQjNSLFFBQWpCLENBQTJCLENBQTNCLEVBQWlDLENBQUU0b0csS0FBT0csSUFBVCxHQUFvQkgsS0FBT0csSUFBM0IsQ0FBakMsQ0FFQSxLQUFLbG9DLE9BQUwsQ0FBYWx2RCxnQkFBYixDQUE4QnpTLElBQTlCLENBQW9DeVMsZ0JBQXBDLEVBRUE7RUFFQW8zRixLQUFPLENBQUVDLElBQUYsQ0FBU3pwQyxNQUFULENBQWtCMHBDLGtCQUF6QixDQUNBTCxLQUFPSSxLQUFPenBDLE1BQVAsQ0FBZ0IwcEMsa0JBQXZCLENBRUF0M0YsaUJBQWlCM1IsUUFBakIsQ0FBMkIsQ0FBM0IsRUFBaUMsRUFBSW1NLElBQUosRUFBYXk4RixLQUFPRyxJQUFwQixDQUFqQyxDQUNBcDNGLGlCQUFpQjNSLFFBQWpCLENBQTJCLENBQTNCLEVBQWlDLENBQUU0b0csS0FBT0csSUFBVCxHQUFvQkgsS0FBT0csSUFBM0IsQ0FBakMsQ0FFQSxLQUFLaG9DLE9BQUwsQ0FBYXB2RCxnQkFBYixDQUE4QnpTLElBQTlCLENBQW9DeVMsZ0JBQXBDLEVBRUEsQ0FFRCxLQUFLa3ZELE9BQUwsQ0FBYWp2RCxXQUFiLENBQXlCMVMsSUFBekIsQ0FBK0J3UyxPQUFPRSxXQUF0QyxFQUFvRGpTLFFBQXBELENBQThEa3BHLE9BQTlELEVBQ0EsS0FBSzluQyxPQUFMLENBQWFudkQsV0FBYixDQUF5QjFTLElBQXpCLENBQStCd1MsT0FBT0UsV0FBdEMsRUFBb0RqUyxRQUFwRCxDQUE4RG1wRyxRQUE5RCxFQUVBLENBdkRELENBeURBLENBaEVPLEVBRjhCLENBQXZDLEVBc0VBOzs7OztLQU9BLG1CQUFBLENBQXFCMzhGLElBQXJCLENBQTJCQyxHQUEzQixDQUFnQzg4RixjQUFoQyxDQUFpRCxDQUVoRGoyRSxTQUFTLzlDLElBQVQsQ0FBZSxJQUFmLEVBRUEsS0FBS0QsSUFBTCxDQUFZLFlBQVosQ0FFQSxRQUFVLEVBQVYsQ0FBY3NxRixPQUFTLENBQXZCLENBRUEsYUFBZSxxQkFBQSxDQUF1QkQsR0FBdkIsQ0FBNEJDLE1BQTVCLENBQW9DcHpELElBQXBDLENBQTBDQyxHQUExQyxDQUFmLENBQ0ErOEYsU0FBU3hpRyxFQUFULENBQVkvYixHQUFaLENBQWlCLENBQWpCLENBQW9CLENBQUUsQ0FBdEIsQ0FBeUIsQ0FBekIsRUFDQXUrRyxTQUFTMWlHLE1BQVQsQ0FBaUIsV0FBQSxDQUFhLENBQWIsQ0FBZ0IsQ0FBaEIsQ0FBbUIsQ0FBbkIsQ0FBakIsRUFDQSxLQUFLdEgsR0FBTCxDQUFVZ3FHLFFBQVYsRUFFQSxhQUFlLHFCQUFBLENBQXVCN3BDLEdBQXZCLENBQTRCQyxNQUE1QixDQUFvQ3B6RCxJQUFwQyxDQUEwQ0MsR0FBMUMsQ0FBZixDQUNBZzlGLFNBQVN6aUcsRUFBVCxDQUFZL2IsR0FBWixDQUFpQixDQUFqQixDQUFvQixDQUFFLENBQXRCLENBQXlCLENBQXpCLEVBQ0F3K0csU0FBUzNpRyxNQUFULENBQWlCLFdBQUEsQ0FBYSxDQUFFLENBQWYsQ0FBa0IsQ0FBbEIsQ0FBcUIsQ0FBckIsQ0FBakIsRUFDQSxLQUFLdEgsR0FBTCxDQUFVaXFHLFFBQVYsRUFFQSxhQUFlLHFCQUFBLENBQXVCOXBDLEdBQXZCLENBQTRCQyxNQUE1QixDQUFvQ3B6RCxJQUFwQyxDQUEwQ0MsR0FBMUMsQ0FBZixDQUNBaTlGLFNBQVMxaUcsRUFBVCxDQUFZL2IsR0FBWixDQUFpQixDQUFqQixDQUFvQixDQUFwQixDQUF1QixDQUF2QixFQUNBeStHLFNBQVM1aUcsTUFBVCxDQUFpQixXQUFBLENBQWEsQ0FBYixDQUFnQixDQUFoQixDQUFtQixDQUFuQixDQUFqQixFQUNBLEtBQUt0SCxHQUFMLENBQVVrcUcsUUFBVixFQUVBLGFBQWUscUJBQUEsQ0FBdUIvcEMsR0FBdkIsQ0FBNEJDLE1BQTVCLENBQW9DcHpELElBQXBDLENBQTBDQyxHQUExQyxDQUFmLENBQ0FrOUYsU0FBUzNpRyxFQUFULENBQVkvYixHQUFaLENBQWlCLENBQWpCLENBQW9CLENBQXBCLENBQXVCLENBQUUsQ0FBekIsRUFDQTArRyxTQUFTN2lHLE1BQVQsQ0FBaUIsV0FBQSxDQUFhLENBQWIsQ0FBZ0IsQ0FBRSxDQUFsQixDQUFxQixDQUFyQixDQUFqQixFQUNBLEtBQUt0SCxHQUFMLENBQVVtcUcsUUFBVixFQUVBLGFBQWUscUJBQUEsQ0FBdUJocUMsR0FBdkIsQ0FBNEJDLE1BQTVCLENBQW9DcHpELElBQXBDLENBQTBDQyxHQUExQyxDQUFmLENBQ0FtOUYsU0FBUzVpRyxFQUFULENBQVkvYixHQUFaLENBQWlCLENBQWpCLENBQW9CLENBQUUsQ0FBdEIsQ0FBeUIsQ0FBekIsRUFDQTIrRyxTQUFTOWlHLE1BQVQsQ0FBaUIsV0FBQSxDQUFhLENBQWIsQ0FBZ0IsQ0FBaEIsQ0FBbUIsQ0FBbkIsQ0FBakIsRUFDQSxLQUFLdEgsR0FBTCxDQUFVb3FHLFFBQVYsRUFFQSxhQUFlLHFCQUFBLENBQXVCanFDLEdBQXZCLENBQTRCQyxNQUE1QixDQUFvQ3B6RCxJQUFwQyxDQUEwQ0MsR0FBMUMsQ0FBZixDQUNBbzlGLFNBQVM3aUcsRUFBVCxDQUFZL2IsR0FBWixDQUFpQixDQUFqQixDQUFvQixDQUFFLENBQXRCLENBQXlCLENBQXpCLEVBQ0E0K0csU0FBUy9pRyxNQUFULENBQWlCLFdBQUEsQ0FBYSxDQUFiLENBQWdCLENBQWhCLENBQW1CLENBQUUsQ0FBckIsQ0FBakIsRUFDQSxLQUFLdEgsR0FBTCxDQUFVcXFHLFFBQVYsRUFFQSxZQUFjLENBQUVqMUYsT0FBUXNpRCxTQUFWLENBQXFCeGlELFVBQVdZLFlBQWhDLENBQThDWCxVQUFXVyxZQUF6RCxDQUFkLENBRUEsS0FBS2lnRCxZQUFMLENBQW9CLHlCQUFBLENBQTJCZzBDLGNBQTNCLENBQTJDQSxjQUEzQyxDQUEyRHh4RixPQUEzRCxDQUFwQixDQUNBLEtBQUt3OUMsWUFBTCxDQUFrQnA5QyxPQUFsQixDQUEwQnhoQyxJQUExQixDQUFpQyxZQUFqQyxDQUVBLEtBQUsyM0IsTUFBTCxDQUFjLFNBQVd1aUMsUUFBWCxDQUFxQkcsS0FBckIsQ0FBNkIsQ0FFMUMsR0FBSyxLQUFLcmxELE1BQUwsR0FBZ0IsSUFBckIsQ0FBNEIsS0FBS3V2QixpQkFBTCxHQUU1QixpQkFBbUIsS0FBS3E2QyxZQUF4QixDQUNBLG9CQUFzQkEsYUFBYXA5QyxPQUFiLENBQXFCdkMsZUFBM0MsQ0FFQTIvQyxhQUFhcDlDLE9BQWIsQ0FBcUJ2QyxlQUFyQixDQUF1QyxLQUF2QyxDQUVBMi9DLGFBQWE3OEMsY0FBYixDQUE4QixDQUE5QixDQUNBbTRCLFNBQVNxQixNQUFULENBQWlCbEIsS0FBakIsQ0FBd0J3NEQsUUFBeEIsQ0FBa0NqMEMsWUFBbEMsRUFFQUEsYUFBYTc4QyxjQUFiLENBQThCLENBQTlCLENBQ0FtNEIsU0FBU3FCLE1BQVQsQ0FBaUJsQixLQUFqQixDQUF3Qnk0RCxRQUF4QixDQUFrQ2wwQyxZQUFsQyxFQUVBQSxhQUFhNzhDLGNBQWIsQ0FBOEIsQ0FBOUIsQ0FDQW00QixTQUFTcUIsTUFBVCxDQUFpQmxCLEtBQWpCLENBQXdCMDRELFFBQXhCLENBQWtDbjBDLFlBQWxDLEVBRUFBLGFBQWE3OEMsY0FBYixDQUE4QixDQUE5QixDQUNBbTRCLFNBQVNxQixNQUFULENBQWlCbEIsS0FBakIsQ0FBd0IyNEQsUUFBeEIsQ0FBa0NwMEMsWUFBbEMsRUFFQUEsYUFBYTc4QyxjQUFiLENBQThCLENBQTlCLENBQ0FtNEIsU0FBU3FCLE1BQVQsQ0FBaUJsQixLQUFqQixDQUF3QjQ0RCxRQUF4QixDQUFrQ3IwQyxZQUFsQyxFQUVBQSxhQUFhcDlDLE9BQWIsQ0FBcUJ2QyxlQUFyQixDQUF1Q0EsZUFBdkMsQ0FFQTIvQyxhQUFhNzhDLGNBQWIsQ0FBOEIsQ0FBOUIsQ0FDQW00QixTQUFTcUIsTUFBVCxDQUFpQmxCLEtBQWpCLENBQXdCNjRELFFBQXhCLENBQWtDdDBDLFlBQWxDLEVBRUExa0IsU0FBU2laLGVBQVQsQ0FBMEIsSUFBMUIsRUFFQSxDQS9CRCxDQWlDQSxLQUFLNStELEtBQUwsQ0FBYSxTQUFXMmxELFFBQVgsQ0FBcUJob0IsS0FBckIsQ0FBNEI0RyxLQUE1QixDQUFtQ3kvQixPQUFuQyxDQUE2QyxDQUV6RCxpQkFBbUIsS0FBS3FHLFlBQXhCLENBRUEsSUFBTSxNQUFRLENBQWQsQ0FBaUI1NkUsRUFBSSxDQUFyQixDQUF3QkEsR0FBeEIsQ0FBK0IsQ0FFOUI0NkUsYUFBYTc4QyxjQUFiLENBQThCLzlCLENBQTlCLENBQ0FrMkQsU0FBU2laLGVBQVQsQ0FBMEJ5TCxZQUExQixFQUVBMWtCLFNBQVMzbEQsS0FBVCxDQUFnQjI5QixLQUFoQixDQUF1QjRHLEtBQXZCLENBQThCeS9CLE9BQTlCLEVBRUEsQ0FFRHJlLFNBQVNpWixlQUFULENBQTBCLElBQTFCLEVBRUEsQ0FmRCxDQWlCQSxDQUVEZ2dELFdBQVdqMkgsU0FBWCxDQUF1QkQsT0FBT2lCLE1BQVAsQ0FBZXkrQyxTQUFTei9DLFNBQXhCLENBQXZCLENBQ0FpMkgsV0FBV2oySCxTQUFYLENBQXFCc0MsV0FBckIsQ0FBbUMyekgsVUFBbkMsQ0FFQTs7S0FJQSxzQkFBQSxFQUF5QixDQUV4QngyRSxTQUFTLzlDLElBQVQsQ0FBZSxJQUFmLEVBRUEsS0FBS0QsSUFBTCxDQUFZLGVBQVosQ0FFQSxLQUFLSixPQUFMLENBQWV1ekgsYUFBYTd4RixVQUFiLEVBQWYsQ0FFQSxLQUFLbXpGLElBQUwsQ0FBWSxLQUFLNzBILE9BQUwsQ0FBYTgwSCxVQUFiLEVBQVosQ0FDQSxLQUFLRCxJQUFMLENBQVVFLE9BQVYsQ0FBbUIsS0FBSy8wSCxPQUFMLENBQWFnMUgsV0FBaEMsRUFFQSxLQUFLcHlHLE1BQUwsQ0FBYyxJQUFkLENBRUEsQ0FFRHF5RyxjQUFjdDJILFNBQWQsQ0FBMEJELE9BQU80bkIsTUFBUCxDQUFlNW5CLE9BQU9pQixNQUFQLENBQWV5K0MsU0FBU3ovQyxTQUF4QixDQUFmLENBQW9ELENBRTdFc0MsWUFBYWcwSCxhQUZnRSxDQUk3RUMsU0FBVSxVQUFZLENBRXJCLFlBQVlMLElBQVosQ0FFQSxDQVI0RSxDQVU3RU0sYUFBYyxVQUFhLENBRTFCLEdBQUssS0FBS3Z5RyxNQUFMLEdBQWdCLElBQXJCLENBQTRCLENBRTNCLEtBQUtpeUcsSUFBTCxDQUFVTyxVQUFWLENBQXNCLEtBQUt4eUcsTUFBM0IsRUFDQSxLQUFLQSxNQUFMLENBQVl3eUcsVUFBWixDQUF3QixLQUFLcDFILE9BQUwsQ0FBYWcxSCxXQUFyQyxFQUNBLEtBQUtILElBQUwsQ0FBVUUsT0FBVixDQUFtQixLQUFLLzBILE9BQUwsQ0FBYWcxSCxXQUFoQyxFQUNBLEtBQUtweUcsTUFBTCxDQUFjLElBQWQsQ0FFQSxDQUVELENBckI0RSxDQXVCN0V5eUcsVUFBVyxVQUFZLENBRXRCLFlBQVl6eUcsTUFBWixDQUVBLENBM0I0RSxDQTZCN0UweUcsVUFBVyxTQUFXbHpILEtBQVgsQ0FBbUIsQ0FFN0IsR0FBSyxLQUFLd2dCLE1BQUwsR0FBZ0IsSUFBckIsQ0FBNEIsQ0FFM0IsS0FBS2l5RyxJQUFMLENBQVVPLFVBQVYsQ0FBc0IsS0FBS3h5RyxNQUEzQixFQUNBLEtBQUtBLE1BQUwsQ0FBWXd5RyxVQUFaLENBQXdCLEtBQUtwMUgsT0FBTCxDQUFhZzFILFdBQXJDLEVBRUEsQ0FMRCxJQUtPLENBRU4sS0FBS0gsSUFBTCxDQUFVTyxVQUFWLENBQXNCLEtBQUtwMUgsT0FBTCxDQUFhZzFILFdBQW5DLEVBRUEsQ0FFRCxLQUFLcHlHLE1BQUwsQ0FBY3hnQixLQUFkLENBQ0EsS0FBS3l5SCxJQUFMLENBQVVFLE9BQVYsQ0FBbUIsS0FBS255RyxNQUF4QixFQUNBLEtBQUtBLE1BQUwsQ0FBWW15RyxPQUFaLENBQXFCLEtBQUsvMEgsT0FBTCxDQUFhZzFILFdBQWxDLEVBRUEsQ0E5QzRFLENBZ0Q3RU8sZ0JBQWlCLFVBQVksQ0FFNUIsWUFBWVYsSUFBTCxDQUFVQSxJQUFWLENBQWV6eUgsS0FBdEIsQ0FFQSxDQXBENEUsQ0FzRDdFb3pILGdCQUFpQixTQUFXcHpILEtBQVgsQ0FBbUIsQ0FFbkMsS0FBS3l5SCxJQUFMLENBQVVBLElBQVYsQ0FBZVksZUFBZixDQUFnQ3J6SCxLQUFoQyxDQUF1QyxLQUFLcEMsT0FBTCxDQUFhMDFILFdBQXBELENBQWlFLElBQWpFLEVBRUEsQ0ExRDRFLENBNEQ3RTF2RixrQkFBcUIsVUFBWSxDQUVoQyxhQUFlLFdBQUEsRUFBZixDQUNBLGVBQWlCLGNBQUEsRUFBakIsQ0FDQSxVQUFZLFdBQUEsRUFBWixDQUVBLGdCQUFrQixXQUFBLEVBQWxCLENBRUEsaUNBQU8sQ0FBNEJpYixLQUE1QixDQUFvQyxDQUUxQzdDLFNBQVN6L0MsU0FBVCxDQUFtQnFuQyxpQkFBbkIsQ0FBcUMzbEMsSUFBckMsQ0FBMkMsSUFBM0MsQ0FBaUQ0Z0QsS0FBakQsRUFFQSxhQUFlLEtBQUtqaEQsT0FBTCxDQUFhd1YsUUFBNUIsQ0FDQSxPQUFTLEtBQUtzYyxFQUFkLENBRUEsS0FBS2lMLFdBQUwsQ0FBaUJ4RyxTQUFqQixDQUE0QkYsUUFBNUIsQ0FBc0NDLFVBQXRDLENBQWtEbEIsS0FBbEQsRUFFQXc0RCxZQUFZNzNFLEdBQVosQ0FBaUIsQ0FBakIsQ0FBb0IsQ0FBcEIsQ0FBdUIsQ0FBRSxDQUF6QixFQUE2Qm1tQixlQUE3QixDQUE4QzVGLFVBQTlDLEVBRUEsR0FBSzlnQixTQUFTbWdILFNBQWQsQ0FBMEIsQ0FFekJuZ0gsU0FBU21nSCxTQUFULENBQW1CQyxjQUFuQixDQUFtQ3YvRixTQUFTcmUsQ0FBNUMsQ0FBK0MsS0FBS2hZLE9BQUwsQ0FBYTAxSCxXQUE1RCxFQUNBbGdILFNBQVNxZ0gsU0FBVCxDQUFtQkQsY0FBbkIsQ0FBbUN2L0YsU0FBUzdOLENBQTVDLENBQStDLEtBQUt4b0IsT0FBTCxDQUFhMDFILFdBQTVELEVBQ0FsZ0gsU0FBU3NnSCxTQUFULENBQW1CRixjQUFuQixDQUFtQ3YvRixTQUFTaEgsQ0FBNUMsQ0FBK0MsS0FBS3J2QixPQUFMLENBQWEwMUgsV0FBNUQsRUFDQWxnSCxTQUFTdWdILFFBQVQsQ0FBa0JILGNBQWxCLENBQWtDaG9DLFlBQVk1MUUsQ0FBOUMsQ0FBaUQsS0FBS2hZLE9BQUwsQ0FBYTAxSCxXQUE5RCxFQUNBbGdILFNBQVN3Z0gsUUFBVCxDQUFrQkosY0FBbEIsQ0FBa0Nob0MsWUFBWXBsRSxDQUE5QyxDQUFpRCxLQUFLeG9CLE9BQUwsQ0FBYTAxSCxXQUE5RCxFQUNBbGdILFNBQVN5Z0gsUUFBVCxDQUFrQkwsY0FBbEIsQ0FBa0Nob0MsWUFBWXYrRCxDQUE5QyxDQUFpRCxLQUFLcnZCLE9BQUwsQ0FBYTAxSCxXQUE5RCxFQUNBbGdILFNBQVMwZ0gsR0FBVCxDQUFhTixjQUFiLENBQTZCOWpHLEdBQUc5WixDQUFoQyxDQUFtQyxLQUFLaFksT0FBTCxDQUFhMDFILFdBQWhELEVBQ0FsZ0gsU0FBUzJnSCxHQUFULENBQWFQLGNBQWIsQ0FBNkI5akcsR0FBR3RKLENBQWhDLENBQW1DLEtBQUt4b0IsT0FBTCxDQUFhMDFILFdBQWhELEVBQ0FsZ0gsU0FBUzRnSCxHQUFULENBQWFSLGNBQWIsQ0FBNkI5akcsR0FBR3pDLENBQWhDLENBQW1DLEtBQUtydkIsT0FBTCxDQUFhMDFILFdBQWhELEVBRUEsQ0FaRCxJQVlPLENBRU5sZ0gsU0FBU2tmLFdBQVQsQ0FBc0IyQixTQUFTcmUsQ0FBL0IsQ0FBa0NxZSxTQUFTN04sQ0FBM0MsQ0FBOEM2TixTQUFTaEgsQ0FBdkQsRUFDQTdaLFNBQVM2Z0gsY0FBVCxDQUF5QnpvQyxZQUFZNTFFLENBQXJDLENBQXdDNDFFLFlBQVlwbEUsQ0FBcEQsQ0FBdURvbEUsWUFBWXYrRCxDQUFuRSxDQUFzRXlDLEdBQUc5WixDQUF6RSxDQUE0RThaLEdBQUd0SixDQUEvRSxDQUFrRnNKLEdBQUd6QyxDQUFyRixFQUVBLENBRUQsQ0E5QkQsQ0FnQ0EsQ0F4Q2tCLEVBNUQwRCxDQUFwRCxDQUExQixDQXdHQTs7O0tBS0EsY0FBQSxDQUFnQjdaLFFBQWhCLENBQTJCLENBRTFCNG9DLFNBQVMvOUMsSUFBVCxDQUFlLElBQWYsRUFFQSxLQUFLRCxJQUFMLENBQVksT0FBWixDQUVBLEtBQUtKLE9BQUwsQ0FBZXdWLFNBQVN4VixPQUF4QixDQUVBLEtBQUs2MEgsSUFBTCxDQUFZLEtBQUs3MEgsT0FBTCxDQUFhODBILFVBQWIsRUFBWixDQUNBLEtBQUtELElBQUwsQ0FBVUUsT0FBVixDQUFtQnYvRyxTQUFTMC9HLFFBQVQsRUFBbkIsRUFFQSxLQUFLb0IsUUFBTCxDQUFnQixLQUFoQixDQUVBLEtBQUsxNkUsTUFBTCxDQUFjLElBQWQsQ0FDQSxLQUFLMjZFLElBQUwsQ0FBWSxLQUFaLENBQ0EsS0FBSy9SLFNBQUwsQ0FBaUIsQ0FBakIsQ0FDQSxLQUFLejNGLE1BQUwsQ0FBYyxDQUFkLENBQ0EsS0FBS3lwRyxZQUFMLENBQW9CLENBQXBCLENBQ0EsS0FBS0MsU0FBTCxDQUFpQixLQUFqQixDQUNBLEtBQUtDLGtCQUFMLENBQTBCLElBQTFCLENBQ0EsS0FBS0MsVUFBTCxDQUFrQixPQUFsQixDQUVBLEtBQUtDLE9BQUwsQ0FBZSxFQUFmLENBRUEsQ0FFREMsTUFBTWw0SCxTQUFOLENBQWtCRCxPQUFPNG5CLE1BQVAsQ0FBZTVuQixPQUFPaUIsTUFBUCxDQUFleStDLFNBQVN6L0MsU0FBeEIsQ0FBZixDQUFvRCxDQUVyRXNDLFlBQWE0MUgsS0FGd0QsQ0FJckVDLFVBQVcsVUFBWSxDQUV0QixZQUFZakMsSUFBWixDQUVBLENBUm9FLENBVXJFa0MsY0FBZSxTQUFXQyxTQUFYLENBQXVCLENBRXJDLEtBQUtOLGtCQUFMLENBQTBCLEtBQTFCLENBQ0EsS0FBS0MsVUFBTCxDQUFrQixXQUFsQixDQUNBLEtBQUtsc0gsTUFBTCxDQUFjdXNILFNBQWQsQ0FDQSxLQUFLakMsT0FBTCxHQUVBLFdBQUEsQ0FFQSxDQW5Cb0UsQ0FxQnJFa0MsVUFBVyxTQUFXckQsV0FBWCxDQUF5QixDQUVuQyxLQUFLaDRFLE1BQUwsQ0FBY2c0RSxXQUFkLENBQ0EsS0FBSytDLFVBQUwsQ0FBa0IsUUFBbEIsQ0FFQSxHQUFLLEtBQUtMLFFBQVYsQ0FBcUIsS0FBS1ksSUFBTCxHQUVyQixXQUFBLENBRUEsQ0E5Qm9FLENBZ0NyRUEsS0FBTSxVQUFZLENBRWpCLEdBQUssS0FBS1QsU0FBTCxHQUFtQixJQUF4QixDQUErQixDQUU5Qi83RyxRQUFRNlAsSUFBUixDQUFjLHdDQUFkLEVBQ0EsT0FFQSxDQUVELEdBQUssS0FBS21zRyxrQkFBTCxHQUE0QixLQUFqQyxDQUF5QyxDQUV4Q2g4RyxRQUFRNlAsSUFBUixDQUFjLGtEQUFkLEVBQ0EsT0FFQSxDQUVELFdBQWEsS0FBS3ZxQixPQUFMLENBQWFtM0gsa0JBQWIsRUFBYixDQUVBMXNILE9BQU9teEMsTUFBUCxDQUFnQixLQUFLQSxNQUFyQixDQUNBbnhDLE9BQU84ckgsSUFBUCxDQUFjLEtBQUtBLElBQW5CLENBQ0E5ckgsT0FBTzJzSCxPQUFQLENBQWlCLEtBQUtDLE9BQUwsQ0FBYXQ2QixJQUFiLENBQW1CLElBQW5CLENBQWpCLENBQ0F0eUYsT0FBTytySCxZQUFQLENBQW9CWixjQUFwQixDQUFvQyxLQUFLWSxZQUF6QyxDQUF1RCxLQUFLaFMsU0FBNUQsRUFDQSxLQUFLQSxTQUFMLENBQWlCLEtBQUt4a0gsT0FBTCxDQUFhMDFILFdBQTlCLENBQ0FqckgsT0FBT3crQixLQUFQLENBQWMsS0FBS3U3RSxTQUFuQixDQUE4QixLQUFLejNGLE1BQW5DLEVBRUEsS0FBSzBwRyxTQUFMLENBQWlCLElBQWpCLENBRUEsS0FBS2hzSCxNQUFMLENBQWNBLE1BQWQsQ0FFQSxZQUFZc3FILE9BQUwsRUFBUCxDQUVBLENBL0RvRSxDQWlFckV1QyxNQUFPLFVBQVksQ0FFbEIsR0FBSyxLQUFLWixrQkFBTCxHQUE0QixLQUFqQyxDQUF5QyxDQUV4Q2g4RyxRQUFRNlAsSUFBUixDQUFjLGtEQUFkLEVBQ0EsT0FFQSxDQUVELEdBQUssS0FBS2tzRyxTQUFMLEdBQW1CLElBQXhCLENBQStCLENBRTlCLEtBQUtoc0gsTUFBTCxDQUFZeEUsSUFBWixHQUNBLEtBQUs4bUIsTUFBTCxFQUFlLENBQUUsS0FBSy9zQixPQUFMLENBQWEwMUgsV0FBYixDQUEyQixLQUFLbFIsU0FBbEMsRUFBZ0QsS0FBS2dTLFlBQXBFLENBQ0EsS0FBS0MsU0FBTCxDQUFpQixLQUFqQixDQUVBLENBRUQsV0FBQSxDQUVBLENBcEZvRSxDQXNGckV4d0gsS0FBTSxVQUFZLENBRWpCLEdBQUssS0FBS3l3SCxrQkFBTCxHQUE0QixLQUFqQyxDQUF5QyxDQUV4Q2g4RyxRQUFRNlAsSUFBUixDQUFjLGtEQUFkLEVBQ0EsT0FFQSxDQUVELEtBQUs5ZixNQUFMLENBQVl4RSxJQUFaLEdBQ0EsS0FBSzhtQixNQUFMLENBQWMsQ0FBZCxDQUNBLEtBQUswcEcsU0FBTCxDQUFpQixLQUFqQixDQUVBLFdBQUEsQ0FFQSxDQXJHb0UsQ0F1R3JFMUIsUUFBUyxVQUFZLENBRXBCLEdBQUssS0FBSzZCLE9BQUwsQ0FBYXh4SCxNQUFiLENBQXNCLENBQTNCLENBQStCLENBRTlCLEtBQUtxRixNQUFMLENBQVlzcUgsT0FBWixDQUFxQixLQUFLNkIsT0FBTCxDQUFjLENBQWQsQ0FBckIsRUFFQSxJQUFNLE1BQVEsQ0FBUixDQUFXMXVILEVBQUksS0FBSzB1SCxPQUFMLENBQWF4eEgsTUFBbEMsQ0FBMENLLEVBQUl5QyxDQUE5QyxDQUFpRHpDLEdBQWpELENBQXdELENBRXZELEtBQUtteEgsT0FBTCxDQUFjbnhILEVBQUksQ0FBbEIsRUFBc0JzdkgsT0FBdEIsQ0FBK0IsS0FBSzZCLE9BQUwsQ0FBY254SCxDQUFkLENBQS9CLEVBRUEsQ0FFRCxLQUFLbXhILE9BQUwsQ0FBYyxLQUFLQSxPQUFMLENBQWF4eEgsTUFBYixDQUFzQixDQUFwQyxFQUF3QzJ2SCxPQUF4QyxDQUFpRCxLQUFLK0IsU0FBTCxFQUFqRCxFQUVBLENBWkQsSUFZTyxDQUVOLEtBQUtyc0gsTUFBTCxDQUFZc3FILE9BQVosQ0FBcUIsS0FBSytCLFNBQUwsRUFBckIsRUFFQSxDQUVELFdBQUEsQ0FFQSxDQTdIb0UsQ0ErSHJFMUIsV0FBWSxVQUFZLENBRXZCLEdBQUssS0FBS3dCLE9BQUwsQ0FBYXh4SCxNQUFiLENBQXNCLENBQTNCLENBQStCLENBRTlCLEtBQUtxRixNQUFMLENBQVkycUgsVUFBWixDQUF3QixLQUFLd0IsT0FBTCxDQUFjLENBQWQsQ0FBeEIsRUFFQSxJQUFNLE1BQVEsQ0FBUixDQUFXMXVILEVBQUksS0FBSzB1SCxPQUFMLENBQWF4eEgsTUFBbEMsQ0FBMENLLEVBQUl5QyxDQUE5QyxDQUFpRHpDLEdBQWpELENBQXdELENBRXZELEtBQUtteEgsT0FBTCxDQUFjbnhILEVBQUksQ0FBbEIsRUFBc0IydkgsVUFBdEIsQ0FBa0MsS0FBS3dCLE9BQUwsQ0FBY254SCxDQUFkLENBQWxDLEVBRUEsQ0FFRCxLQUFLbXhILE9BQUwsQ0FBYyxLQUFLQSxPQUFMLENBQWF4eEgsTUFBYixDQUFzQixDQUFwQyxFQUF3Q2d3SCxVQUF4QyxDQUFvRCxLQUFLMEIsU0FBTCxFQUFwRCxFQUVBLENBWkQsSUFZTyxDQUVOLEtBQUtyc0gsTUFBTCxDQUFZMnFILFVBQVosQ0FBd0IsS0FBSzBCLFNBQUwsRUFBeEIsRUFFQSxDQUVELFdBQUEsQ0FFQSxDQXJKb0UsQ0F1SnJFUyxXQUFZLFVBQVksQ0FFdkIsWUFBWVgsT0FBWixDQUVBLENBM0pvRSxDQTZKckVZLFdBQVksU0FBV3AxSCxLQUFYLENBQW1CLENBRTlCLEdBQUssQ0FBRUEsS0FBUCxDQUFlQSxNQUFRLEVBQVIsQ0FFZixHQUFLLEtBQUtxMEgsU0FBTCxHQUFtQixJQUF4QixDQUErQixDQUU5QixLQUFLckIsVUFBTCxHQUNBLEtBQUt3QixPQUFMLENBQWV4MEgsS0FBZixDQUNBLEtBQUsyeUgsT0FBTCxHQUVBLENBTkQsSUFNTyxDQUVOLEtBQUs2QixPQUFMLENBQWV4MEgsS0FBZixDQUVBLENBRUQsV0FBQSxDQUVBLENBL0tvRSxDQWlMckVpekgsVUFBVyxVQUFZLENBRXRCLFlBQVlrQyxVQUFMLEdBQW1CLENBQW5CLENBQVAsQ0FFQSxDQXJMb0UsQ0F1THJFakMsVUFBVyxTQUFXMXlHLE1BQVgsQ0FBb0IsQ0FFOUIsWUFBWTQwRyxVQUFMLENBQWlCNTBHLE9BQVMsQ0FBRUEsTUFBRixDQUFULENBQXNCLEVBQXZDLENBQVAsQ0FFQSxDQTNMb0UsQ0E2THJFNjBHLGdCQUFpQixTQUFXcjFILEtBQVgsQ0FBbUIsQ0FFbkMsR0FBSyxLQUFLczBILGtCQUFMLEdBQTRCLEtBQWpDLENBQXlDLENBRXhDaDhHLFFBQVE2UCxJQUFSLENBQWMsa0RBQWQsRUFDQSxPQUVBLENBRUQsS0FBS2lzRyxZQUFMLENBQW9CcDBILEtBQXBCLENBRUEsR0FBSyxLQUFLcTBILFNBQUwsR0FBbUIsSUFBeEIsQ0FBK0IsQ0FFOUIsS0FBS2hzSCxNQUFMLENBQVkrckgsWUFBWixDQUF5QlosY0FBekIsQ0FBeUMsS0FBS1ksWUFBOUMsQ0FBNEQsS0FBS3gySCxPQUFMLENBQWEwMUgsV0FBekUsRUFFQSxDQUVELFdBQUEsQ0FFQSxDQWhOb0UsQ0FrTnJFZ0MsZ0JBQWlCLFVBQVksQ0FFNUIsWUFBWWxCLFlBQVosQ0FFQSxDQXROb0UsQ0F3TnJFYSxRQUFTLFVBQVksQ0FFcEIsS0FBS1osU0FBTCxDQUFpQixLQUFqQixDQUVBLENBNU5vRSxDQThOckVrQixRQUFTLFVBQVksQ0FFcEIsR0FBSyxLQUFLakIsa0JBQUwsR0FBNEIsS0FBakMsQ0FBeUMsQ0FFeENoOEcsUUFBUTZQLElBQVIsQ0FBYyxrREFBZCxFQUNBLFlBQUEsQ0FFQSxDQUVELFlBQVlnc0csSUFBWixDQUVBLENBek9vRSxDQTJPckVxQixRQUFTLFNBQVd4MUgsS0FBWCxDQUFtQixDQUUzQixHQUFLLEtBQUtzMEgsa0JBQUwsR0FBNEIsS0FBakMsQ0FBeUMsQ0FFeENoOEcsUUFBUTZQLElBQVIsQ0FBYyxrREFBZCxFQUNBLE9BRUEsQ0FFRCxLQUFLZ3NHLElBQUwsQ0FBWW4wSCxLQUFaLENBRUEsR0FBSyxLQUFLcTBILFNBQUwsR0FBbUIsSUFBeEIsQ0FBK0IsQ0FFOUIsS0FBS2hzSCxNQUFMLENBQVk4ckgsSUFBWixDQUFtQixLQUFLQSxJQUF4QixDQUVBLENBRUQsV0FBQSxDQUVBLENBOVBvRSxDQWdRckVzQixVQUFXLFVBQVksQ0FFdEIsWUFBWWhELElBQUwsQ0FBVUEsSUFBVixDQUFlenlILEtBQXRCLENBRUEsQ0FwUW9FLENBc1FyRTAxSCxVQUFXLFNBQVcxMUgsS0FBWCxDQUFtQixDQUU3QixLQUFLeXlILElBQUwsQ0FBVUEsSUFBVixDQUFlWSxlQUFmLENBQWdDcnpILEtBQWhDLENBQXVDLEtBQUtwQyxPQUFMLENBQWEwMUgsV0FBcEQsQ0FBaUUsSUFBakUsRUFFQSxXQUFBLENBRUEsQ0E1UW9FLENBQXBELENBQWxCLENBZ1JBOztLQUlBLHdCQUFBLENBQTBCbGdILFFBQTFCLENBQXFDLENBRXBDcWhILE1BQU14MkgsSUFBTixDQUFZLElBQVosQ0FBa0JtVixRQUFsQixFQUVBLEtBQUt1aUgsTUFBTCxDQUFjLEtBQUsvM0gsT0FBTCxDQUFhZzRILFlBQWIsRUFBZCxDQUNBLEtBQUtELE1BQUwsQ0FBWWhELE9BQVosQ0FBcUIsS0FBS0YsSUFBMUIsRUFFQSxDQUVEb0QsZ0JBQWdCdDVILFNBQWhCLENBQTRCRCxPQUFPNG5CLE1BQVAsQ0FBZTVuQixPQUFPaUIsTUFBUCxDQUFlazNILE1BQU1sNEgsU0FBckIsQ0FBZixDQUFpRCxDQUU1RXNDLFlBQWFnM0gsZUFGK0QsQ0FJNUVuQixVQUFXLFVBQVksQ0FFdEIsWUFBWWlCLE1BQVosQ0FFQSxDQVIyRSxDQVU1RUcsZUFBZ0IsVUFBWSxDQUUzQixZQUFZSCxNQUFMLENBQVlJLFdBQW5CLENBRUEsQ0FkMkUsQ0FnQjVFQyxlQUFnQixTQUFXaDJILEtBQVgsQ0FBbUIsQ0FFbEMsS0FBSzIxSCxNQUFMLENBQVlJLFdBQVosQ0FBMEIvMUgsS0FBMUIsQ0FFQSxDQXBCMkUsQ0FzQjVFaTJILGlCQUFrQixVQUFZLENBRTdCLFlBQVlOLE1BQUwsQ0FBWU8sYUFBbkIsQ0FFQSxDQTFCMkUsQ0E0QjVFQyxpQkFBa0IsU0FBV24ySCxLQUFYLENBQW1CLENBRXBDLEtBQUsyMUgsTUFBTCxDQUFZTyxhQUFaLENBQTRCbDJILEtBQTVCLENBRUEsQ0FoQzJFLENBa0M1RW8ySCxpQkFBa0IsVUFBWSxDQUU3QixZQUFZVCxNQUFMLENBQVlVLGFBQW5CLENBRUEsQ0F0QzJFLENBd0M1RUMsaUJBQWtCLFNBQVd0MkgsS0FBWCxDQUFtQixDQUVwQyxLQUFLMjFILE1BQUwsQ0FBWVUsYUFBWixDQUE0QnIySCxLQUE1QixDQUVBLENBNUMyRSxDQThDNUV1MkgsZUFBZ0IsVUFBWSxDQUUzQixZQUFZWixNQUFMLENBQVlhLFdBQW5CLENBRUEsQ0FsRDJFLENBb0Q1RUMsZUFBZ0IsU0FBV3oySCxLQUFYLENBQW1CLENBRWxDLEtBQUsyMUgsTUFBTCxDQUFZYSxXQUFaLENBQTBCeDJILEtBQTFCLENBRUEsQ0F4RDJFLENBMEQ1RTRqQyxrQkFBcUIsVUFBWSxDQUVoQyxhQUFlLFdBQUEsRUFBZixDQUVBLGlDQUFPLENBQTRCaWIsS0FBNUIsQ0FBb0MsQ0FFMUM3QyxTQUFTei9DLFNBQVQsQ0FBbUJxbkMsaUJBQW5CLENBQXFDM2xDLElBQXJDLENBQTJDLElBQTNDLENBQWlENGdELEtBQWpELEVBRUE1cUIsU0FBU2lJLHFCQUFULENBQWdDLEtBQUt2QixXQUFyQyxFQUVBLEtBQUtnN0YsTUFBTCxDQUFZcmpHLFdBQVosQ0FBeUIyQixTQUFTcmUsQ0FBbEMsQ0FBcUNxZSxTQUFTN04sQ0FBOUMsQ0FBaUQ2TixTQUFTaEgsQ0FBMUQsRUFFQSxDQVJELENBVUEsQ0Fka0IsRUExRHlELENBQWpELENBQTVCLENBNkVBOztLQUlBLHNCQUFBLENBQXdCeXBHLEtBQXhCLENBQStCQyxPQUEvQixDQUF5QyxDQUV4QyxLQUFLQyxRQUFMLENBQWdCRixNQUFNOTRILE9BQU4sQ0FBY2k1SCxjQUFkLEVBQWhCLENBQ0EsS0FBS0QsUUFBTCxDQUFjRCxPQUFkLENBQXdCQSxVQUFZaDFILFNBQVosQ0FBd0JnMUgsT0FBeEIsQ0FBa0MsSUFBMUQsQ0FFQSxLQUFLamtILElBQUwsQ0FBWSxjQUFBLENBQWdCLEtBQUtra0gsUUFBTCxDQUFjRSxpQkFBOUIsQ0FBWixDQUVBSixNQUFNaEMsU0FBTixHQUFrQi9CLE9BQWxCLENBQTJCLEtBQUtpRSxRQUFoQyxFQUVBLENBRUR0NkgsT0FBTzRuQixNQUFQLENBQWU2eUcsY0FBY3g2SCxTQUE3QixDQUF3QyxDQUV2Q3k2SCxpQkFBa0IsVUFBWSxDQUU3QixLQUFLSixRQUFMLENBQWNLLG9CQUFkLENBQW9DLEtBQUt2a0gsSUFBekMsRUFFQSxZQUFZQSxJQUFaLENBRUEsQ0FSc0MsQ0FVdkN3a0gsb0JBQXFCLFVBQVksQ0FFaEMsVUFBWSxDQUFaLENBQWV4a0gsS0FBTyxLQUFLc2tILGdCQUFMLEVBQXRCLENBRUEsSUFBTSxNQUFRLENBQWQsQ0FBaUIzekgsRUFBSXFQLEtBQUsxUCxNQUExQixDQUFrQ0ssR0FBbEMsQ0FBeUMsQ0FFeENyRCxPQUFTMFMsS0FBTXJQLENBQU4sQ0FBVCxDQUVBLENBRUQsYUFBZXFQLEtBQUsxUCxNQUFwQixDQUVBLENBdEJzQyxDQUF4QyxFQTBCQTs7Ozs7Ozs7S0FVQSxzQkFBQSxDQUF3Qm0wSCxPQUF4QixDQUFpQ3ZWLFFBQWpDLENBQTJDN0UsU0FBM0MsQ0FBdUQsQ0FFdEQsS0FBS29hLE9BQUwsQ0FBZUEsT0FBZixDQUNBLEtBQUtwYSxTQUFMLENBQWlCQSxTQUFqQixDQUVBLGVBQWlCd0osWUFBakIsQ0FDQzZRLFdBREQsQ0FHQSxPQUFTeFYsUUFBVCxFQUVDLElBQUssWUFBTCxDQUNDd1YsWUFBYyxLQUFLQyxNQUFuQixDQUNBLE1BRUQsSUFBSyxRQUFMLENBQ0EsSUFBSyxNQUFMLENBQ0NuK0UsV0FBYS9vQyxLQUFiLENBQ0FpbkgsWUFBYyxLQUFLRSxPQUFuQixDQUNBLE1BRUQsUUFDQ0YsWUFBYyxLQUFLRyxLQUFuQixDQWJGLENBaUJBLEtBQUsvOUUsTUFBTCxDQUFjLGNBQUEsQ0FBZ0J1akUsVUFBWSxDQUE1QixDQUFkLENBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFFQSxLQUFLeWEsZ0JBQUwsQ0FBd0JKLFdBQXhCLENBRUEsS0FBS0ssZ0JBQUwsQ0FBd0IsQ0FBeEIsQ0FFQSxLQUFLQyxRQUFMLENBQWdCLENBQWhCLENBQ0EsS0FBS0MsY0FBTCxDQUFzQixDQUF0QixDQUVBLENBRURyN0gsT0FBTzRuQixNQUFQLENBQWUwekcsY0FBY3I3SCxTQUE3QixDQUF3QztFQUd2Q3M3SCxXQUFZLFNBQVdDLFNBQVgsQ0FBc0J2Z0IsTUFBdEIsQ0FBK0I7RUFHMUM7RUFFQSxXQUFhLEtBQUsvOUQsTUFBbEIsQ0FDQzA1QyxPQUFTLEtBQUs2cEIsU0FEZixDQUVDcHlGLE9BQVNtdEcsVUFBWTVrQyxNQUFaLENBQXFCQSxNQUYvQixDQUlDNmtDLGNBQWdCLEtBQUtOLGdCQUp0QixDQU1BLEdBQUtNLGdCQUFrQixDQUF2QixDQUEyQjtFQUkxQixJQUFNLE1BQVEsQ0FBZCxDQUFpQjEwSCxJQUFNNnZGLE1BQXZCLENBQStCLEVBQUc3dkYsQ0FBbEMsQ0FBc0MsQ0FFckNtMkMsT0FBUTd1QixPQUFTdG5CLENBQWpCLEVBQXVCbTJDLE9BQVFuMkMsQ0FBUixDQUF2QixDQUVBLENBRUQwMEgsY0FBZ0J4Z0IsTUFBaEIsQ0FFQSxDQVpELElBWU87RUFJTndnQixlQUFpQnhnQixNQUFqQixDQUNBLFFBQVVBLE9BQVN3Z0IsYUFBbkIsQ0FDQSxLQUFLUCxnQkFBTCxDQUF1QmgrRSxNQUF2QixDQUErQjd1QixNQUEvQixDQUF1QyxDQUF2QyxDQUEwQ3F0RyxHQUExQyxDQUErQzlrQyxNQUEvQyxFQUVBLENBRUQsS0FBS3VrQyxnQkFBTCxDQUF3Qk0sYUFBeEIsQ0FFQSxDQXRDc0M7RUF5Q3ZDdHhILE1BQU8sU0FBV3F4SCxTQUFYLENBQXVCLENBRTdCLFdBQWEsS0FBSy9hLFNBQWxCLENBQ0N2akUsT0FBUyxLQUFLQSxNQURmLENBRUM3dUIsT0FBU210RyxVQUFZNWtDLE1BQVosQ0FBcUJBLE1BRi9CLENBSUNxa0IsT0FBUyxLQUFLa2dCLGdCQUpmLENBTUNOLFFBQVUsS0FBS0EsT0FOaEIsQ0FRQSxLQUFLTSxnQkFBTCxDQUF3QixDQUF4QixDQUVBLEdBQUtsZ0IsT0FBUyxDQUFkLENBQWtCO0VBSWpCLHdCQUEwQnJrQixPQUFTLENBQW5DLENBRUEsS0FBS3NrQyxnQkFBTCxDQUNDaCtFLE1BREQsQ0FDUzd1QixNQURULENBQ2lCc3RHLG1CQURqQixDQUNzQyxFQUFJMWdCLE1BRDFDLENBQ2tEcmtCLE1BRGxELEVBR0EsQ0FFRCxJQUFNLE1BQVFBLE1BQVIsQ0FBZ0JsdUYsRUFBSWt1RixPQUFTQSxNQUFuQyxDQUEyQzd2RixJQUFNMkIsQ0FBakQsQ0FBb0QsRUFBRzNCLENBQXZELENBQTJELENBRTFELEdBQUttMkMsT0FBUW4yQyxDQUFSLElBQWdCbTJDLE9BQVFuMkMsRUFBSTZ2RixNQUFaLENBQXJCLENBQTRDO0VBSTNDaWtDLFFBQVF6MkQsUUFBUixDQUFrQmxuQixNQUFsQixDQUEwQjd1QixNQUExQixFQUNBLE1BRUEsQ0FFRCxDQUVELENBN0VzQztFQWdGdkN1dEcsa0JBQW1CLFVBQVksQ0FFOUIsWUFBYyxLQUFLZixPQUFuQixDQUVBLFdBQWEsS0FBSzM5RSxNQUFsQixDQUNDMDVDLE9BQVMsS0FBSzZwQixTQURmLENBR0NrYixvQkFBc0Iva0MsT0FBUyxDQUhoQyxDQUtBaWtDLFFBQVFnQixRQUFSLENBQWtCMytFLE1BQWxCLENBQTBCeStFLG1CQUExQixFQUVBO0VBQ0EsSUFBTSxNQUFRL2tDLE1BQVIsQ0FBZ0JsdUYsRUFBSWl6SCxtQkFBMUIsQ0FBK0M1MEgsSUFBTTJCLENBQXJELENBQXdELEVBQUczQixDQUEzRCxDQUErRCxDQUU5RG0yQyxPQUFRbjJDLENBQVIsRUFBY20yQyxPQUFReStFLG9CQUF3QjUwSCxFQUFJNnZGLE1BQXBDLENBQWQsQ0FFQSxDQUVELEtBQUt1a0MsZ0JBQUwsQ0FBd0IsQ0FBeEIsQ0FFQSxDQXBHc0M7RUF1R3ZDVyxxQkFBc0IsVUFBWSxDQUVqQyx3QkFBMEIsS0FBS3JiLFNBQUwsQ0FBaUIsQ0FBM0MsQ0FDQSxLQUFLb2EsT0FBTCxDQUFhejJELFFBQWIsQ0FBdUIsS0FBS2xuQixNQUE1QixDQUFvQ3krRSxtQkFBcEMsRUFFQSxDQTVHc0M7RUFpSHZDWCxRQUFTLFNBQVc5OUUsTUFBWCxDQUFtQjNqQixTQUFuQixDQUE4Qm1yRixTQUE5QixDQUF5QzM2RixDQUF6QyxDQUE0QzZzRSxNQUE1QyxDQUFxRCxDQUU3RCxHQUFLN3NFLEdBQUssR0FBVixDQUFnQixDQUVmLElBQU0sTUFBUSxDQUFkLENBQWlCaGpCLElBQU02dkYsTUFBdkIsQ0FBK0IsRUFBRzd2RixDQUFsQyxDQUFzQyxDQUVyQ20yQyxPQUFRM2pCLFVBQVl4eUIsQ0FBcEIsRUFBMEJtMkMsT0FBUXduRSxVQUFZMzlHLENBQXBCLENBQTFCLENBRUEsQ0FFRCxDQUVELENBN0hzQyxDQStIdkNnMEgsT0FBUSxTQUFXNzlFLE1BQVgsQ0FBbUIzakIsU0FBbkIsQ0FBOEJtckYsU0FBOUIsQ0FBeUMzNkYsQ0FBekMsQ0FBNkMsQ0FFcERpUCxXQUFXSyxTQUFYLENBQXNCNmpCLE1BQXRCLENBQThCM2pCLFNBQTlCLENBQXlDMmpCLE1BQXpDLENBQWlEM2pCLFNBQWpELENBQTREMmpCLE1BQTVELENBQW9Fd25FLFNBQXBFLENBQStFMzZGLENBQS9FLEVBRUEsQ0FuSXNDLENBcUl2Q2t4RyxNQUFPLFNBQVcvOUUsTUFBWCxDQUFtQjNqQixTQUFuQixDQUE4Qm1yRixTQUE5QixDQUF5QzM2RixDQUF6QyxDQUE0QzZzRSxNQUE1QyxDQUFxRCxDQUUzRCxNQUFRLEVBQUk3c0UsQ0FBWixDQUVBLElBQU0sTUFBUSxDQUFkLENBQWlCaGpCLElBQU02dkYsTUFBdkIsQ0FBK0IsRUFBRzd2RixDQUFsQyxDQUFzQyxDQUVyQyxNQUFRd3lCLFVBQVl4eUIsQ0FBcEIsQ0FFQW0yQyxPQUFRdjZCLENBQVIsRUFBY3U2QixPQUFRdjZCLENBQVIsRUFBY3JaLENBQWQsQ0FBa0I0ekMsT0FBUXduRSxVQUFZMzlHLENBQXBCLEVBQTBCZ2pCLENBQTFELENBRUEsQ0FFRCxDQWpKc0MsQ0FBeEMsRUFxSkE7Ozs7Ozs7OztFQVdBLHNCQUF3QixlQUF4QixDQUVBLGtCQUFBLENBQW9CZ3lHLFdBQXBCLENBQWlDNzBELElBQWpDLENBQXVDODBELGtCQUF2QyxDQUE0RCxDQUUzRCxlQUFpQkEsb0JBQXNCQyxnQkFBZ0JDLGNBQWhCLENBQWdDaDFELElBQWhDLENBQXZDLENBRUEsS0FBS2kxRCxZQUFMLENBQW9CSixXQUFwQixDQUNBLEtBQUtLLFNBQUwsQ0FBaUJMLFlBQVlNLFVBQVosQ0FBd0JuMUQsSUFBeEIsQ0FBOEJvMUQsVUFBOUIsQ0FBakIsQ0FFQSxDQUVEdDhILE9BQU80bkIsTUFBUCxDQUFlMjBHLFVBQVV0OEgsU0FBekIsQ0FBb0MsQ0FFbkM0N0gsU0FBVSxTQUFXLzBHLEtBQVgsQ0FBa0J1SCxNQUFsQixDQUEyQixDQUVwQyxLQUFLZ3dFLElBQUwsR0FBYTtFQUViLG9CQUFzQixLQUFLODlCLFlBQUwsQ0FBa0JLLGVBQXhDLENBQ0MzQixRQUFVLEtBQUt1QixTQUFMLENBQWdCSyxlQUFoQixDQURYLENBR0E7RUFDQSxHQUFLNUIsVUFBWXgxSCxTQUFqQixDQUE2QncxSCxRQUFRZ0IsUUFBUixDQUFrQi8wRyxLQUFsQixDQUF5QnVILE1BQXpCLEVBRTdCLENBWmtDLENBY25DKzFDLFNBQVUsU0FBV3Q5QyxLQUFYLENBQWtCdUgsTUFBbEIsQ0FBMkIsQ0FFcEMsYUFBZSxLQUFLK3RHLFNBQXBCLENBRUEsSUFBTSxNQUFRLEtBQUtELFlBQUwsQ0FBa0JLLGVBQTFCLENBQ0ZsekcsRUFBSW96RyxTQUFTaDJILE1BRGpCLENBQ3lCSyxJQUFNdWlCLENBRC9CLENBQ2tDLEVBQUd2aUIsQ0FEckMsQ0FDeUMsQ0FFeEMyMUgsU0FBVTMxSCxDQUFWLEVBQWNxOUQsUUFBZCxDQUF3QnQ5QyxLQUF4QixDQUErQnVILE1BQS9CLEVBRUEsQ0FFRCxDQXpCa0MsQ0EyQm5DZ3dFLEtBQU0sVUFBWSxDQUVqQixhQUFlLEtBQUsrOUIsU0FBcEIsQ0FFQSxJQUFNLE1BQVEsS0FBS0QsWUFBTCxDQUFrQkssZUFBMUIsQ0FDRmx6RyxFQUFJb3pHLFNBQVNoMkgsTUFEakIsQ0FDeUJLLElBQU11aUIsQ0FEL0IsQ0FDa0MsRUFBR3ZpQixDQURyQyxDQUN5QyxDQUV4QzIxSCxTQUFVMzFILENBQVYsRUFBY3MzRixJQUFkLEdBRUEsQ0FFRCxDQXRDa0MsQ0F3Q25DcytCLE9BQVEsVUFBWSxDQUVuQixhQUFlLEtBQUtQLFNBQXBCLENBRUEsSUFBTSxNQUFRLEtBQUtELFlBQUwsQ0FBa0JLLGVBQTFCLENBQ0ZsekcsRUFBSW96RyxTQUFTaDJILE1BRGpCLENBQ3lCSyxJQUFNdWlCLENBRC9CLENBQ2tDLEVBQUd2aUIsQ0FEckMsQ0FDeUMsQ0FFeEMyMUgsU0FBVTMxSCxDQUFWLEVBQWM0MUgsTUFBZCxHQUVBLENBRUQsQ0FuRGtDLENBQXBDLEVBd0RBLHdCQUFBLENBQTBCQyxRQUExQixDQUFvQzExRCxJQUFwQyxDQUEwQ28xRCxVQUExQyxDQUF1RCxDQUV0RCxLQUFLcDFELElBQUwsQ0FBWUEsSUFBWixDQUNBLEtBQUtvMUQsVUFBTCxDQUFrQkEsWUFBY0wsZ0JBQWdCQyxjQUFoQixDQUFnQ2gxRCxJQUFoQyxDQUFoQyxDQUVBLEtBQUt4dUQsSUFBTCxDQUFZdWpILGdCQUFnQlksUUFBaEIsQ0FBMEJELFFBQTFCLENBQW9DLEtBQUtOLFVBQUwsQ0FBZ0JRLFFBQXBELEdBQWtFRixRQUE5RSxDQUVBLEtBQUtBLFFBQUwsQ0FBZ0JBLFFBQWhCLENBRUEsQ0FFRDU4SCxPQUFPNG5CLE1BQVAsQ0FBZXEwRyxlQUFmLENBQWdDLENBRS9CTSxVQUFXQSxTQUZvQixDQUkvQnQ3SCxPQUFRLFNBQVc4N0gsSUFBWCxDQUFpQjcxRCxJQUFqQixDQUF1Qm8xRCxVQUF2QixDQUFvQyxDQUUzQyxHQUFLLEVBQUlTLE1BQVFBLEtBQUtDLHNCQUFqQixDQUFMLENBQWlELENBRWhELDBCQUFPLENBQXFCRCxJQUFyQixDQUEyQjcxRCxJQUEzQixDQUFpQ28xRCxVQUFqQyxDQUFQLENBRUEsQ0FKRCxJQUlPLENBRU4sMkJBQTJCQyxTQUFwQixDQUErQlEsSUFBL0IsQ0FBcUM3MUQsSUFBckMsQ0FBMkNvMUQsVUFBM0MsQ0FBUCxDQUVBLENBRUQsQ0FoQjhCOzs7Ozs7TUF5Qi9CVyxpQkFBb0IsVUFBWSxDQUUvQixlQUFpQixVQUFBLENBQVksSUFBTUMsaUJBQU4sQ0FBMEIsR0FBdEMsQ0FBMkMsR0FBM0MsQ0FBakIsQ0FFQSxnQ0FBTyxDQUEyQm42SCxJQUEzQixDQUFrQyxDQUV4QyxZQUFZdW1FLE9BQUwsQ0FBYyxLQUFkLENBQXFCLEdBQXJCLEVBQTJCQSxPQUEzQixDQUFvQzZ6RCxVQUFwQyxDQUFnRCxFQUFoRCxDQUFQLENBRUEsQ0FKRCxDQU1BLENBVm1CLEVBekJXLENBcUMvQmpCLGVBQWdCLFVBQVk7RUFHM0I7RUFDQTtFQUNBLGFBQWUsS0FBT2dCLGlCQUFQLENBQTJCLEdBQTFDLENBQ0Esa0JBQW9CLEtBQU9BLGtCQUFrQjV6RCxPQUFsQixDQUEyQixLQUEzQixDQUFrQyxFQUFsQyxDQUFQLENBQWdELEdBQXBFLENBRUE7RUFDQTtFQUNBLGdCQUFrQixrQkFBa0J2OUQsTUFBbEIsQ0FBeUJ1OUQsT0FBekIsQ0FBa0MsSUFBbEMsQ0FBd0M4ekQsUUFBeEMsQ0FBbEIsQ0FFQTtFQUNBLFdBQWEsV0FBV3J4SCxNQUFYLENBQWtCdTlELE9BQWxCLENBQTJCLE1BQTNCLENBQW1DK3pELGFBQW5DLENBQWIsQ0FFQTtFQUNBO0VBQ0EsYUFBZSw0QkFBNEJ0eEgsTUFBNUIsQ0FBbUN1OUQsT0FBbkMsQ0FBNEMsSUFBNUMsQ0FBa0Q4ekQsUUFBbEQsQ0FBZixDQUVBO0VBQ0E7RUFDQSxlQUFpQix1QkFBdUJyeEgsTUFBdkIsQ0FBOEJ1OUQsT0FBOUIsQ0FBdUMsSUFBdkMsQ0FBNkM4ekQsUUFBN0MsQ0FBakIsQ0FFQSxZQUFjLFVBQUEsQ0FBWSxHQUN2QixHQUR1QixDQUV2QkUsV0FGdUIsQ0FHdkJDLE1BSHVCLENBSXZCQyxRQUp1QixDQUt2QkMsVUFMdUIsQ0FNdkIsR0FOVyxDQUFkLENBU0EseUJBQTJCLENBQUUsVUFBRixDQUFjLFdBQWQsQ0FBMkIsT0FBM0IsQ0FBM0IsQ0FFQSw4QkFBTyxDQUF5Qm5WLFNBQXpCLENBQXFDLENBRTNDLFlBQWNvVixRQUFRcHpILElBQVIsQ0FBY2crRyxTQUFkLENBQWQsQ0FFQSxHQUFLLENBQUVxVixPQUFQLENBQWlCLENBRWhCLGVBQU0sQ0FBVyw0Q0FBOENyVixTQUF6RCxDQUFOLENBRUEsQ0FFRCxZQUFjO0VBRWJ3VSxTQUFVYSxRQUFTLENBQVQsQ0FGRyxDQUdiQyxXQUFZRCxRQUFTLENBQVQsQ0FIQyxDQUliRSxZQUFhRixRQUFTLENBQVQsQ0FKQSxDQUtiblYsYUFBY21WLFFBQVMsQ0FBVCxDQUxEO0VBTWJHLGNBQWVILFFBQVMsQ0FBVCxDQU5GLENBQWQsQ0FTQSxZQUFjSSxRQUFRakIsUUFBUixFQUFvQmlCLFFBQVFqQixRQUFSLENBQWlCNU8sV0FBakIsQ0FBOEIsR0FBOUIsQ0FBbEMsQ0FFQSxHQUFLOFAsVUFBWTM0SCxTQUFaLEVBQXlCMjRILFVBQVksQ0FBRSxDQUE1QyxDQUFnRCxDQUUvQyxlQUFpQkQsUUFBUWpCLFFBQVIsQ0FBaUJsTixTQUFqQixDQUE0Qm9PLFFBQVUsQ0FBdEMsQ0FBakIsQ0FFQTtFQUNBO0VBQ0E7RUFDQTtFQUNBLEdBQUtDLHFCQUFxQjExSCxPQUFyQixDQUE4QnExSCxVQUE5QixJQUErQyxDQUFFLENBQXRELENBQTBELENBRXpERyxRQUFRakIsUUFBUixDQUFtQmlCLFFBQVFqQixRQUFSLENBQWlCbE4sU0FBakIsQ0FBNEIsQ0FBNUIsQ0FBK0JvTyxPQUEvQixDQUFuQixDQUNBRCxRQUFRSCxVQUFSLENBQXFCQSxVQUFyQixDQUVBLENBRUQsQ0FFRCxHQUFLRyxRQUFRdlYsWUFBUixHQUF5QixJQUF6QixFQUFpQ3VWLFFBQVF2VixZQUFSLENBQXFCOWhILE1BQXJCLEdBQWdDLENBQXRFLENBQTBFLENBRXpFLGVBQU0sQ0FBVywrREFBaUU0aEgsU0FBNUUsQ0FBTixDQUVBLENBRUQsY0FBQSxDQUVBLENBOUNELENBZ0RBLENBbEZlLEVBckNlLENBeUgvQnVVLFNBQVUsU0FBV0UsSUFBWCxDQUFpQkQsUUFBakIsQ0FBNEIsQ0FFckMsR0FBSyxDQUFFQSxRQUFGLEVBQWNBLFdBQWEsRUFBM0IsRUFBaUNBLFdBQWEsTUFBOUMsRUFBd0RBLFdBQWEsR0FBckUsRUFBNEVBLFdBQWEsQ0FBRSxDQUEzRixFQUFnR0EsV0FBYUMsS0FBS2g2SCxJQUFsSCxFQUEwSCs1SCxXQUFhQyxLQUFLMzdGLElBQWpKLENBQXdKLENBRXZKLFdBQUEsQ0FFQSxDQUVEO0VBQ0EsR0FBSzI3RixLQUFLNXRELFFBQVYsQ0FBcUIsQ0FFcEIsU0FBVzR0RCxLQUFLNXRELFFBQUwsQ0FBYzR1QixhQUFkLENBQTZCKytCLFFBQTdCLENBQVgsQ0FFQSxHQUFLbi9CLE9BQVN0NEYsU0FBZCxDQUEwQixDQUV6QixXQUFBLENBRUEsQ0FFRCxDQUVEO0VBQ0EsR0FBSzAzSCxLQUFLdDlFLFFBQVYsQ0FBcUIsQ0FFcEIsc0JBQXdCLFNBQVdBLFFBQVgsQ0FBc0IsQ0FFN0MsSUFBTSxNQUFRLENBQWQsQ0FBaUIxNEMsRUFBSTA0QyxTQUFTLzRDLE1BQTlCLENBQXNDSyxHQUF0QyxDQUE2QyxDQUU1QyxjQUFnQjA0QyxTQUFVMTRDLENBQVYsQ0FBaEIsQ0FFQSxHQUFLbTNILFVBQVVuN0gsSUFBVixHQUFtQis1SCxRQUFuQixFQUErQm9CLFVBQVU5OEYsSUFBVixHQUFtQjA3RixRQUF2RCxDQUFrRSxDQUVqRSxnQkFBQSxDQUVBLENBRUQsV0FBYXFCLGtCQUFtQkQsVUFBVXorRSxRQUE3QixDQUFiLENBRUEsR0FBS2g4QyxNQUFMLENBQWMsYUFBQSxDQUVkLENBRUQsV0FBQSxDQUVBLENBcEJELENBc0JBLGdCQUFrQjA2SCxrQkFBbUJwQixLQUFLdDlFLFFBQXhCLENBQWxCLENBRUEsR0FBSzIrRSxXQUFMLENBQW1CLENBRWxCLGtCQUFBLENBRUEsQ0FFRCxDQUVELFdBQUEsQ0FFQSxDQW5MOEIsQ0FBaEMsRUF1TEFwK0gsT0FBTzRuQixNQUFQLENBQWVxMEcsZ0JBQWdCaDhILFNBQS9CLENBQTBDO0VBRXpDO0VBQ0FvK0gsc0JBQXVCLFVBQVksRUFITSxDQUl6Q0Msc0JBQXVCLFVBQVksRUFKTSxDQU16Q0MsWUFBYSxDQUNaQyxPQUFRLENBREksQ0FFWkMsWUFBYSxDQUZELENBR1pDLGFBQWMsQ0FIRixDQUlaQyxlQUFnQixDQUpKLENBTjRCLENBYXpDQyxXQUFZLENBQ1hDLEtBQU0sQ0FESyxDQUVYQyxZQUFhLENBRkYsQ0FHWEMsdUJBQXdCLENBSGIsQ0FiNkIsQ0FtQnpDQyxvQkFBcUIsQ0FFcEIsd0JBQUEsQ0FBMEI5aEYsTUFBMUIsQ0FBa0M3dUIsTUFBbEMsQ0FBMkMsQ0FFMUM2dUIsT0FBUTd1QixNQUFSLEVBQW1CLEtBQUszVixJQUFMLENBQVcsS0FBSzh2RyxZQUFoQixDQUFuQixDQUVBLENBTm1CLENBUXBCLHVCQUFBLENBQXlCdHJFLE1BQXpCLENBQWlDN3VCLE1BQWpDLENBQTBDLENBRXpDLFdBQWEsS0FBSzR3RyxnQkFBbEIsQ0FFQSxJQUFNLE1BQVEsQ0FBUixDQUFXMzFHLEVBQUl2ZCxPQUFPckYsTUFBNUIsQ0FBb0NLLElBQU11aUIsQ0FBMUMsQ0FBNkMsRUFBR3ZpQixDQUFoRCxDQUFvRCxDQUVuRG0yQyxPQUFRN3VCLFFBQVIsRUFBc0J0aUIsT0FBUWhGLENBQVIsQ0FBdEIsQ0FFQSxDQUVELENBbEJtQixDQW9CcEIsOEJBQUEsQ0FBZ0NtMkMsTUFBaEMsQ0FBd0M3dUIsTUFBeEMsQ0FBaUQsQ0FFaEQ2dUIsT0FBUTd1QixNQUFSLEVBQW1CLEtBQUs0d0csZ0JBQUwsQ0FBdUIsS0FBS25CLGFBQTVCLENBQW5CLENBRUEsQ0F4Qm1CLENBMEJwQix5QkFBQSxDQUEyQjVnRixNQUEzQixDQUFtQzd1QixNQUFuQyxDQUE0QyxDQUUzQyxLQUFLNHdHLGdCQUFMLENBQXNCM3dHLE9BQXRCLENBQStCNHVCLE1BQS9CLENBQXVDN3VCLE1BQXZDLEVBRUEsQ0E5Qm1CLENBbkJvQixDQXFEekM2d0csaUNBQWtDLENBRWpDO0VBR0Msd0JBQUEsQ0FBMEJoaUYsTUFBMUIsQ0FBa0M3dUIsTUFBbEMsQ0FBMkMsQ0FFMUMsS0FBSzh3RyxZQUFMLENBQW1CLEtBQUszVyxZQUF4QixFQUF5Q3RyRSxPQUFRN3VCLE1BQVIsQ0FBekMsQ0FFQSxDQVBGLENBU0MsdUNBQUEsQ0FBeUM2dUIsTUFBekMsQ0FBaUQ3dUIsTUFBakQsQ0FBMEQsQ0FFekQsS0FBSzh3RyxZQUFMLENBQW1CLEtBQUszVyxZQUF4QixFQUF5Q3RyRSxPQUFRN3VCLE1BQVIsQ0FBekMsQ0FDQSxLQUFLOHdHLFlBQUwsQ0FBa0J6d0UsV0FBbEIsQ0FBZ0MsSUFBaEMsQ0FFQSxDQWRGLENBZ0JDLGtEQUFBLENBQW9EeFIsTUFBcEQsQ0FBNEQ3dUIsTUFBNUQsQ0FBcUUsQ0FFcEUsS0FBSzh3RyxZQUFMLENBQW1CLEtBQUszVyxZQUF4QixFQUF5Q3RyRSxPQUFRN3VCLE1BQVIsQ0FBekMsQ0FDQSxLQUFLOHdHLFlBQUwsQ0FBa0JuL0Usc0JBQWxCLENBQTJDLElBQTNDLENBRUEsQ0FyQkYsQ0FGaUMsQ0F5QjlCO0VBSUYsdUJBQUEsQ0FBeUI5QyxNQUF6QixDQUFpQzd1QixNQUFqQyxDQUEwQyxDQUV6QyxTQUFXLEtBQUs0d0csZ0JBQWhCLENBRUEsSUFBTSxNQUFRLENBQVIsQ0FBVzMxRyxFQUFJODFHLEtBQUsxNEgsTUFBMUIsQ0FBa0NLLElBQU11aUIsQ0FBeEMsQ0FBMkMsRUFBR3ZpQixDQUE5QyxDQUFrRCxDQUVqRHE0SCxLQUFNcjRILENBQU4sRUFBWW0yQyxPQUFRN3VCLFFBQVIsQ0FBWixDQUVBLENBRUQsQ0FkQyxDQWdCRixzQ0FBQSxDQUF3QzZ1QixNQUF4QyxDQUFnRDd1QixNQUFoRCxDQUF5RCxDQUV4RCxTQUFXLEtBQUs0d0csZ0JBQWhCLENBRUEsSUFBTSxNQUFRLENBQVIsQ0FBVzMxRyxFQUFJODFHLEtBQUsxNEgsTUFBMUIsQ0FBa0NLLElBQU11aUIsQ0FBeEMsQ0FBMkMsRUFBR3ZpQixDQUE5QyxDQUFrRCxDQUVqRHE0SCxLQUFNcjRILENBQU4sRUFBWW0yQyxPQUFRN3VCLFFBQVIsQ0FBWixDQUVBLENBRUQsS0FBSzh3RyxZQUFMLENBQWtCendFLFdBQWxCLENBQWdDLElBQWhDLENBRUEsQ0E1QkMsQ0E4QkYsaURBQUEsQ0FBbUR4UixNQUFuRCxDQUEyRDd1QixNQUEzRCxDQUFvRSxDQUVuRSxTQUFXLEtBQUs0d0csZ0JBQWhCLENBRUEsSUFBTSxNQUFRLENBQVIsQ0FBVzMxRyxFQUFJODFHLEtBQUsxNEgsTUFBMUIsQ0FBa0NLLElBQU11aUIsQ0FBeEMsQ0FBMkMsRUFBR3ZpQixDQUE5QyxDQUFrRCxDQUVqRHE0SCxLQUFNcjRILENBQU4sRUFBWW0yQyxPQUFRN3VCLFFBQVIsQ0FBWixDQUVBLENBRUQsS0FBSzh3RyxZQUFMLENBQWtCbi9FLHNCQUFsQixDQUEyQyxJQUEzQyxDQUVBLENBMUNDLENBekI4QixDQXFFOUI7RUFJRiw4QkFBQSxDQUFnQzlDLE1BQWhDLENBQXdDN3VCLE1BQXhDLENBQWlELENBRWhELEtBQUs0d0csZ0JBQUwsQ0FBdUIsS0FBS25CLGFBQTVCLEVBQThDNWdGLE9BQVE3dUIsTUFBUixDQUE5QyxDQUVBLENBUkMsQ0FVRiw2Q0FBQSxDQUErQzZ1QixNQUEvQyxDQUF1RDd1QixNQUF2RCxDQUFnRSxDQUUvRCxLQUFLNHdHLGdCQUFMLENBQXVCLEtBQUtuQixhQUE1QixFQUE4QzVnRixPQUFRN3VCLE1BQVIsQ0FBOUMsQ0FDQSxLQUFLOHdHLFlBQUwsQ0FBa0J6d0UsV0FBbEIsQ0FBZ0MsSUFBaEMsQ0FFQSxDQWZDLENBaUJGLHdEQUFBLENBQTBEeFIsTUFBMUQsQ0FBa0U3dUIsTUFBbEUsQ0FBMkUsQ0FFMUUsS0FBSzR3RyxnQkFBTCxDQUF1QixLQUFLbkIsYUFBNUIsRUFBOEM1Z0YsT0FBUTd1QixNQUFSLENBQTlDLENBQ0EsS0FBSzh3RyxZQUFMLENBQWtCbi9FLHNCQUFsQixDQUEyQyxJQUEzQyxDQUVBLENBdEJDLENBckU4QixDQTZGOUI7RUFJRiwyQkFBQSxDQUE2QjlDLE1BQTdCLENBQXFDN3VCLE1BQXJDLENBQThDLENBRTdDLEtBQUs0d0csZ0JBQUwsQ0FBc0I3d0csU0FBdEIsQ0FBaUM4dUIsTUFBakMsQ0FBeUM3dUIsTUFBekMsRUFFQSxDQVJDLENBVUYsMENBQUEsQ0FBNEM2dUIsTUFBNUMsQ0FBb0Q3dUIsTUFBcEQsQ0FBNkQsQ0FFNUQsS0FBSzR3RyxnQkFBTCxDQUFzQjd3RyxTQUF0QixDQUFpQzh1QixNQUFqQyxDQUF5Qzd1QixNQUF6QyxFQUNBLEtBQUs4d0csWUFBTCxDQUFrQnp3RSxXQUFsQixDQUFnQyxJQUFoQyxDQUVBLENBZkMsQ0FpQkYscURBQUEsQ0FBdUR4UixNQUF2RCxDQUErRDd1QixNQUEvRCxDQUF3RSxDQUV2RSxLQUFLNHdHLGdCQUFMLENBQXNCN3dHLFNBQXRCLENBQWlDOHVCLE1BQWpDLENBQXlDN3VCLE1BQXpDLEVBQ0EsS0FBSzh3RyxZQUFMLENBQWtCbi9FLHNCQUFsQixDQUEyQyxJQUEzQyxDQUVBLENBdEJDLENBN0Y4QixDQXJETyxDQThLekM2N0UsU0FBVSx5QkFBQSxDQUEyQndELFdBQTNCLENBQXdDaHhHLE1BQXhDLENBQWlELENBRTFELEtBQUtnd0UsSUFBTCxHQUNBLEtBQUt3OUIsUUFBTCxDQUFld0QsV0FBZixDQUE0Qmh4RyxNQUE1QixFQUVBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFFQSxDQXpMd0MsQ0EyTHpDKzFDLFNBQVUseUJBQUEsQ0FBMkJrN0QsV0FBM0IsQ0FBd0NqeEcsTUFBeEMsQ0FBaUQsQ0FFMUQsS0FBS2d3RSxJQUFMLEdBQ0EsS0FBS2o2QixRQUFMLENBQWVrN0QsV0FBZixDQUE0Qmp4RyxNQUE1QixFQUVBLENBaE13QztFQW1NekNnd0UsS0FBTSxVQUFZLENBRWpCLGlCQUFtQixLQUFLM2xGLElBQXhCLENBQ0M0akgsV0FBYSxLQUFLQSxVQURuQixDQUdDc0IsV0FBYXRCLFdBQVdzQixVQUh6QixDQUlDcFYsYUFBZThULFdBQVc5VCxZQUozQixDQUtDc1YsY0FBZ0J4QixXQUFXd0IsYUFMNUIsQ0FPQSxHQUFLLENBQUVxQixZQUFQLENBQXNCLENBRXJCQSxhQUFlbEQsZ0JBQWdCWSxRQUFoQixDQUEwQixLQUFLRCxRQUEvQixDQUF5Q04sV0FBV1EsUUFBcEQsR0FBa0UsS0FBS0YsUUFBdEYsQ0FFQSxLQUFLbGtILElBQUwsQ0FBWXltSCxZQUFaLENBRUEsQ0FFRDtFQUNBLEtBQUt0RCxRQUFMLENBQWdCLEtBQUt3QyxxQkFBckIsQ0FDQSxLQUFLajZELFFBQUwsQ0FBZ0IsS0FBS2s2RCxxQkFBckIsQ0FFQTtFQUNBLEdBQUssQ0FBRWEsWUFBUCxDQUFzQixDQUVyQm5qSCxRQUFRTSxLQUFSLENBQWUsMkRBQTZELEtBQUs0cUQsSUFBbEUsQ0FBeUUsd0JBQXhGLEVBQ0EsT0FFQSxDQUVELEdBQUswMkQsVUFBTCxDQUFrQixDQUVqQixnQkFBa0J0QixXQUFXdUIsV0FBN0IsQ0FFQTtFQUNBLE9BQVNELFVBQVQsRUFFQyxJQUFLLFdBQUwsQ0FFQyxHQUFLLENBQUV1QixhQUFhbjhFLFFBQXBCLENBQStCLENBRTlCaG5DLFFBQVFNLEtBQVIsQ0FBZSxtRkFBZixDQUFvRyxJQUFwRyxFQUNBLE9BRUEsQ0FFRCxHQUFLLENBQUU2aUgsYUFBYW44RSxRQUFiLENBQXNCUCxTQUE3QixDQUF5QyxDQUV4Q3ptQyxRQUFRTSxLQUFSLENBQWUsNkdBQWYsQ0FBOEgsSUFBOUgsRUFDQSxPQUVBLENBRUQ2aUgsYUFBZUEsYUFBYW44RSxRQUFiLENBQXNCUCxTQUFyQyxDQUVBLE1BRUQsSUFBSyxPQUFMLENBRUMsR0FBSyxDQUFFMDhFLGFBQWFod0QsUUFBcEIsQ0FBK0IsQ0FFOUJuekQsUUFBUU0sS0FBUixDQUFlLGdGQUFmLENBQWlHLElBQWpHLEVBQ0EsT0FFQSxDQUVEO0VBQ0E7RUFFQTZpSCxhQUFlQSxhQUFhaHdELFFBQWIsQ0FBc0JDLEtBQXJDLENBRUE7RUFDQSxJQUFNLE1BQVEsQ0FBZCxDQUFpQnJvRSxFQUFJbzRILGFBQWF6NEgsTUFBbEMsQ0FBMENLLEdBQTFDLENBQWlELENBRWhELEdBQUtvNEgsYUFBY3A0SCxDQUFkLEVBQWtCaEUsSUFBbEIsR0FBMkI4NkgsV0FBaEMsQ0FBOEMsQ0FFN0NBLFlBQWM5MkgsQ0FBZCxDQUNBLE1BRUEsQ0FFRCxDQUVELE1BRUQsUUFFQyxHQUFLbzRILGFBQWN2QixVQUFkLElBQStCdjRILFNBQXBDLENBQWdELENBRS9DMlcsUUFBUU0sS0FBUixDQUFlLHNFQUFmLENBQXVGLElBQXZGLEVBQ0EsT0FFQSxDQUVENmlILGFBQWVBLGFBQWN2QixVQUFkLENBQWYsQ0EzREYsQ0FnRUEsR0FBS0MsY0FBZ0J4NEgsU0FBckIsQ0FBaUMsQ0FFaEMsR0FBSzg1SCxhQUFjdEIsV0FBZCxJQUFnQ3g0SCxTQUFyQyxDQUFpRCxDQUVoRDJXLFFBQVFNLEtBQVIsQ0FBZSx1RkFBZixDQUF3RyxJQUF4RyxDQUE4RzZpSCxZQUE5RyxFQUNBLE9BRUEsQ0FFREEsYUFBZUEsYUFBY3RCLFdBQWQsQ0FBZixDQUVBLENBRUQsQ0FFRDtFQUNBLGlCQUFtQnNCLGFBQWMzVyxZQUFkLENBQW5CLENBRUEsR0FBSytXLGVBQWlCbDZILFNBQXRCLENBQWtDLENBRWpDLGFBQWVpM0gsV0FBV1EsUUFBMUIsQ0FFQTlnSCxRQUFRTSxLQUFSLENBQWUsK0RBQWlFd2dILFFBQWpFLENBQ2QsR0FEYyxDQUNSdFUsWUFEUSxDQUNPLHdCQUR0QixDQUNnRDJXLFlBRGhELEVBRUEsT0FFQSxDQUVEO0VBQ0EsZUFBaUIsS0FBS1AsVUFBTCxDQUFnQkMsSUFBakMsQ0FFQSxHQUFLTSxhQUFhendFLFdBQWIsR0FBNkJycEQsU0FBbEMsQ0FBOEM7RUFFN0NtNkgsV0FBYSxLQUFLWixVQUFMLENBQWdCRSxXQUE3QixDQUNBLEtBQUtLLFlBQUwsQ0FBb0JBLFlBQXBCLENBRUEsQ0FMRCxRQUtZQSxhQUFhbi9FLHNCQUFiLEdBQXdDMzZDLFNBQTdDLENBQXlEO0VBRS9EbTZILFdBQWEsS0FBS1osVUFBTCxDQUFnQkcsc0JBQTdCLENBQ0EsS0FBS0ksWUFBTCxDQUFvQkEsWUFBcEIsQ0FFQSxDQUVEO0VBQ0EsZ0JBQWtCLEtBQUtaLFdBQUwsQ0FBaUJDLE1BQW5DLENBRUEsR0FBS1YsZ0JBQWtCejRILFNBQXZCLENBQW1DO0VBSWxDLEdBQUttakgsZUFBaUIsdUJBQXRCLENBQWdEO0VBSS9DO0VBQ0EsR0FBSyxDQUFFMlcsYUFBYW40RixRQUFwQixDQUErQixDQUU5QmhyQixRQUFRTSxLQUFSLENBQWUscUdBQWYsQ0FBc0gsSUFBdEgsRUFDQSxPQUVBLENBRUQsR0FBSzZpSCxhQUFhbjRGLFFBQWIsQ0FBc0JJLGdCQUEzQixDQUE4QyxDQUU3QyxHQUFLLENBQUUrM0YsYUFBYW40RixRQUFiLENBQXNCOG1CLGVBQTdCLENBQStDLENBRTlDOXhDLFFBQVFNLEtBQVIsQ0FBZSxxSEFBZixDQUFzSSxJQUF0SSxFQUNBLE9BRUEsQ0FFRCxJQUFNLE1BQVEsQ0FBZCxDQUFpQnZWLEVBQUksS0FBSzJSLElBQUwsQ0FBVXN1QixRQUFWLENBQW1COG1CLGVBQW5CLENBQW1DbjJCLFFBQW5DLENBQTRDanhCLE1BQWpFLENBQXlFSyxHQUF6RSxDQUFnRixDQUUvRSxHQUFLbzRILGFBQWFuNEYsUUFBYixDQUFzQjhtQixlQUF0QixDQUFzQ24yQixRQUF0QyxDQUFnRDV3QixDQUFoRCxFQUFvRGhFLElBQXBELEdBQTZEKzZILGFBQWxFLENBQWtGLENBRWpGQSxjQUFnQi8ySCxDQUFoQixDQUNBLE1BRUEsQ0FFRCxDQUdELENBckJELElBcUJPLENBRU4sR0FBSyxDQUFFbzRILGFBQWFuNEYsUUFBYixDQUFzQmdlLFlBQTdCLENBQTRDLENBRTNDaHBDLFFBQVFNLEtBQVIsQ0FBZSxrSEFBZixDQUFtSSxJQUFuSSxFQUNBLE9BRUEsQ0FFRCxJQUFNLE1BQVEsQ0FBZCxDQUFpQnZWLEVBQUksS0FBSzJSLElBQUwsQ0FBVXN1QixRQUFWLENBQW1CZ2UsWUFBbkIsQ0FBZ0N0K0MsTUFBckQsQ0FBNkRLLEdBQTdELENBQW9FLENBRW5FLEdBQUtvNEgsYUFBYW40RixRQUFiLENBQXNCZ2UsWUFBdEIsQ0FBb0NqK0MsQ0FBcEMsRUFBd0NoRSxJQUF4QyxHQUFpRCs2SCxhQUF0RCxDQUFzRSxDQUVyRUEsY0FBZ0IvMkgsQ0FBaEIsQ0FDQSxNQUVBLENBRUQsQ0FFRCxDQUVELENBRUQwNEgsWUFBYyxLQUFLbEIsV0FBTCxDQUFpQkcsWUFBL0IsQ0FFQSxLQUFLTyxnQkFBTCxDQUF3Qk0sWUFBeEIsQ0FDQSxLQUFLekIsYUFBTCxDQUFxQkEsYUFBckIsQ0FFQSxDQWxFRCxRQWtFWXlCLGFBQWFueEcsU0FBYixHQUEyQi9vQixTQUEzQixFQUF3Q2s2SCxhQUFhanhHLE9BQWIsR0FBeUJqcEIsU0FBdEUsQ0FBa0Y7RUFJeEZvNkgsWUFBYyxLQUFLbEIsV0FBTCxDQUFpQkksY0FBL0IsQ0FFQSxLQUFLTSxnQkFBTCxDQUF3Qk0sWUFBeEIsQ0FFQSxDQVJNLFFBUUsxckgsTUFBTXlNLE9BQU4sQ0FBZWkvRyxZQUFmLENBQUwsQ0FBcUMsQ0FFM0NFLFlBQWMsS0FBS2xCLFdBQUwsQ0FBaUJFLFdBQS9CLENBRUEsS0FBS1EsZ0JBQUwsQ0FBd0JNLFlBQXhCLENBRUEsQ0FOTSxJQU1BLENBRU4sS0FBSy9XLFlBQUwsQ0FBb0JBLFlBQXBCLENBRUEsQ0FFRDtFQUNBLEtBQUtxVCxRQUFMLENBQWdCLEtBQUttRCxtQkFBTCxDQUEwQlMsV0FBMUIsQ0FBaEIsQ0FDQSxLQUFLcjdELFFBQUwsQ0FBZ0IsS0FBSzg2RCxnQ0FBTCxDQUF1Q08sV0FBdkMsRUFBc0RELFVBQXRELENBQWhCLENBRUEsQ0E3YXdDLENBK2F6QzdDLE9BQVEsVUFBWSxDQUVuQixLQUFLamtILElBQUwsQ0FBWSxJQUFaLENBRUE7RUFDQTtFQUNBLEtBQUttakgsUUFBTCxDQUFnQixLQUFLNkQsaUJBQXJCLENBQ0EsS0FBS3Q3RCxRQUFMLENBQWdCLEtBQUt1N0QsaUJBQXJCLENBRUEsQ0F4YndDLENBQTFDLEVBNGJBO0VBQ0EzL0gsT0FBTzRuQixNQUFQLENBQWVxMEcsZ0JBQWdCaDhILFNBQS9CLENBQTBDO0VBR3pDeS9ILGtCQUFtQnpELGdCQUFnQmg4SCxTQUFoQixDQUEwQjQ3SCxRQUhKLENBSXpDOEQsa0JBQW1CMUQsZ0JBQWdCaDhILFNBQWhCLENBQTBCbWtFLFFBSkosQ0FBMUMsRUFRQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7S0ErQkEsNkJBQUEsRUFBZ0MsQ0FFL0IsS0FBS2hqQyxJQUFMLENBQVkxVyxNQUFNN0IsWUFBTixFQUFaLENBRUE7RUFDQSxLQUFLc3JELFFBQUwsQ0FBZ0J0Z0UsTUFBTTVULFNBQU4sQ0FBZ0JxSCxLQUFoQixDQUFzQjNGLElBQXRCLENBQTRCeUksU0FBNUIsQ0FBaEIsQ0FFQSxLQUFLb3lILGVBQUwsQ0FBdUIsQ0FBdkIsQ0FBNEI7RUFDNUI7RUFFQSxZQUFjLEVBQWQsQ0FDQSxLQUFLb0QsY0FBTCxDQUFzQi80RSxPQUF0QixDQUFnQztFQUVoQyxJQUFNLE1BQVEsQ0FBUixDQUFXdjlCLEVBQUlsZixVQUFVMUQsTUFBL0IsQ0FBdUNLLElBQU11aUIsQ0FBN0MsQ0FBZ0QsRUFBR3ZpQixDQUFuRCxDQUF1RCxDQUV0RDgvQyxRQUFTejhDLFVBQVdyRCxDQUFYLEVBQWVxNkIsSUFBeEIsRUFBaUNyNkIsQ0FBakMsQ0FFQSxDQUVELEtBQUs4NEgsTUFBTCxDQUFjLEVBQWQsQ0FBc0I7RUFDdEIsS0FBS0MsWUFBTCxDQUFvQixFQUFwQixDQUEyQjtFQUMzQixLQUFLMUQsU0FBTCxDQUFpQixFQUFqQixDQUF5QjtFQUN6QixLQUFLMkQsc0JBQUwsQ0FBOEIsRUFBOUIsQ0FBbUM7RUFFbkMsVUFBWSxJQUFaLENBRUEsS0FBS0MsS0FBTCxDQUFhLENBRVp0dEMsUUFBUyxDQUNSLFNBQUEsRUFBWSxDQUVYLGFBQWF2ZSxRQUFOLENBQWV6dEUsTUFBdEIsQ0FFQSxDQUxPLENBTVIsU0FBQSxFQUFZLENBRVgsWUFBWXU1SCxLQUFMLENBQWE5NEYsTUFBTXExRixlQUExQixDQUVBLENBVk8sQ0FGRyxDQWNaLHFCQUFBLEVBQXdCLENBRXZCLGFBQWFKLFNBQU4sQ0FBZ0IxMUgsTUFBdkIsQ0FFQSxDQWxCVyxDQUFiLENBc0JBLENBRUQxRyxPQUFPNG5CLE1BQVAsQ0FBZXM0RyxxQkFBcUJqZ0ksU0FBcEMsQ0FBK0MsQ0FFOUMrOEgsdUJBQXdCLElBRnNCLENBSTlDcHhHLElBQUssVUFBWSxDQUVoQixZQUFjLEtBQUt1b0QsUUFBbkIsQ0FDQ2dzRCxTQUFXenRDLFFBQVFoc0YsTUFEcEIsQ0FFQzA1SCxlQUFpQixLQUFLNUQsZUFGdkIsQ0FHQzZELGNBQWdCLEtBQUtULGNBSHRCLENBSUNwTSxNQUFRLEtBQUtxTSxNQUpkLENBS0NTLFlBQWMsS0FBS1IsWUFMcEIsQ0FNQ3BELFNBQVcsS0FBS04sU0FOakIsQ0FPQ21FLFVBQVk3RCxTQUFTaDJILE1BUHRCLENBUUM4NUgsWUFBY243SCxTQVJmLENBVUEsSUFBTSxNQUFRLENBQVIsQ0FBV2lrQixFQUFJbGYsVUFBVTFELE1BQS9CLENBQXVDSyxJQUFNdWlCLENBQTdDLENBQWdELEVBQUd2aUIsQ0FBbkQsQ0FBdUQsQ0FFdEQsV0FBYXFELFVBQVdyRCxDQUFYLENBQWIsQ0FDQ3E2QixLQUFPNzZCLE9BQU82NkIsSUFEZixDQUVDenpCLE1BQVEweUgsY0FBZWovRixJQUFmLENBRlQsQ0FJQSxHQUFLenpCLFFBQVV0SSxTQUFmLENBQTJCO0VBSTFCc0ksTUFBUXd5SCxVQUFSLENBQ0FFLGNBQWVqL0YsSUFBZixFQUF3Qnp6QixLQUF4QixDQUNBK2tGLFFBQVF4c0YsSUFBUixDQUFjSyxNQUFkLEVBRUE7RUFFQSxJQUFNLE1BQVEsQ0FBUixDQUFXZ2pCLEVBQUlnM0csU0FBckIsQ0FBZ0M1OUcsSUFBTTRHLENBQXRDLENBQXlDLEVBQUc1RyxDQUE1QyxDQUFnRCxDQUUvQys1RyxTQUFVLzVHLENBQVYsRUFBY3pjLElBQWQsQ0FBb0IsbUJBQUEsQ0FBcUJLLE1BQXJCLENBQTZCaXRILE1BQU83d0csQ0FBUCxDQUE3QixDQUF5QzI5RyxZQUFhMzlHLENBQWIsQ0FBekMsQ0FBcEIsRUFFQSxDQUVELENBaEJELFFBZ0JZaFYsTUFBUXl5SCxjQUFiLENBQThCLENBRXBDSSxZQUFjOXRDLFFBQVMva0YsS0FBVCxDQUFkLENBRUE7RUFFQSxxQkFBdUIsRUFBR3l5SCxjQUExQixDQUNDSyxpQkFBbUIvdEMsUUFBU2d1QyxnQkFBVCxDQURwQixDQUdBTCxjQUFlSSxpQkFBaUJyL0YsSUFBaEMsRUFBeUN6ekIsS0FBekMsQ0FDQStrRixRQUFTL2tGLEtBQVQsRUFBbUI4eUgsZ0JBQW5CLENBRUFKLGNBQWVqL0YsSUFBZixFQUF3QnMvRixnQkFBeEIsQ0FDQWh1QyxRQUFTZ3VDLGdCQUFULEVBQThCbjZILE1BQTlCLENBRUE7RUFFQSxJQUFNLE1BQVEsQ0FBUixDQUFXZ2pCLEVBQUlnM0csU0FBckIsQ0FBZ0M1OUcsSUFBTTRHLENBQXRDLENBQXlDLEVBQUc1RyxDQUE1QyxDQUFnRCxDQUUvQyxvQkFBc0IrNUcsU0FBVS81RyxDQUFWLENBQXRCLENBQ0NnK0csV0FBYUMsZ0JBQWlCRixnQkFBakIsQ0FEZCxDQUVDN0YsUUFBVStGLGdCQUFpQmp6SCxLQUFqQixDQUZYLENBSUFpekgsZ0JBQWlCanpILEtBQWpCLEVBQTJCZ3pILFVBQTNCLENBRUEsR0FBSzlGLFVBQVl4MUgsU0FBakIsQ0FBNkI7RUFHNUI7RUFDQTtFQUVBdzFILFFBQVUsbUJBQUEsQ0FBcUJ0MEgsTUFBckIsQ0FBNkJpdEgsTUFBTzd3RyxDQUFQLENBQTdCLENBQXlDMjlHLFlBQWEzOUcsQ0FBYixDQUF6QyxDQUFWLENBRUEsQ0FFRGkrRyxnQkFBaUJGLGdCQUFqQixFQUFzQzdGLE9BQXRDLENBRUEsQ0FFRCxDQXZDTSxRQXVDS25vQyxRQUFTL2tGLEtBQVQsSUFBcUI2eUgsV0FBMUIsQ0FBd0MsQ0FFOUN4a0gsUUFBUU0sS0FBUixDQUFlLG9FQUNiLG1GQURGLEVBR0EsQ0FBQztFQUVGLENBQUM7RUFFRixLQUFLa2dILGVBQUwsQ0FBdUI0RCxjQUF2QixDQUVBLENBeEY2QyxDQTBGOUM3aEYsT0FBUSxVQUFZLENBRW5CLFlBQWMsS0FBSzQxQixRQUFuQixDQUNDaXNELGVBQWlCLEtBQUs1RCxlQUR2QixDQUVDNkQsY0FBZ0IsS0FBS1QsY0FGdEIsQ0FHQ2xELFNBQVcsS0FBS04sU0FIakIsQ0FJQ21FLFVBQVk3RCxTQUFTaDJILE1BSnRCLENBTUEsSUFBTSxNQUFRLENBQVIsQ0FBVzRpQixFQUFJbGYsVUFBVTFELE1BQS9CLENBQXVDSyxJQUFNdWlCLENBQTdDLENBQWdELEVBQUd2aUIsQ0FBbkQsQ0FBdUQsQ0FFdEQsV0FBYXFELFVBQVdyRCxDQUFYLENBQWIsQ0FDQ3E2QixLQUFPNzZCLE9BQU82NkIsSUFEZixDQUVDenpCLE1BQVEweUgsY0FBZWovRixJQUFmLENBRlQsQ0FJQSxHQUFLenpCLFFBQVV0SSxTQUFWLEVBQXVCc0ksT0FBU3l5SCxjQUFyQyxDQUFzRDtFQUlyRCxvQkFBc0JBLGdCQUF0QixDQUNDUyxrQkFBb0JudUMsUUFBU291QyxlQUFULENBRHJCLENBR0FULGNBQWVRLGtCQUFrQnovRixJQUFqQyxFQUEwQ3p6QixLQUExQyxDQUNBK2tGLFFBQVMva0YsS0FBVCxFQUFtQmt6SCxpQkFBbkIsQ0FFQVIsY0FBZWovRixJQUFmLEVBQXdCMC9GLGVBQXhCLENBQ0FwdUMsUUFBU291QyxlQUFULEVBQTZCdjZILE1BQTdCLENBRUE7RUFFQSxJQUFNLE1BQVEsQ0FBUixDQUFXZ2pCLEVBQUlnM0csU0FBckIsQ0FBZ0M1OUcsSUFBTTRHLENBQXRDLENBQXlDLEVBQUc1RyxDQUE1QyxDQUFnRCxDQUUvQyxvQkFBc0IrNUcsU0FBVS81RyxDQUFWLENBQXRCLENBQ0NvK0csWUFBY0gsZ0JBQWlCRSxlQUFqQixDQURmLENBRUNqRyxRQUFVK0YsZ0JBQWlCanpILEtBQWpCLENBRlgsQ0FJQWl6SCxnQkFBaUJqekgsS0FBakIsRUFBMkJvekgsV0FBM0IsQ0FDQUgsZ0JBQWlCRSxlQUFqQixFQUFxQ2pHLE9BQXJDLENBRUEsQ0FFRCxDQUVELENBQUM7RUFFRixLQUFLMkIsZUFBTCxDQUF1QjRELGNBQXZCLENBRUEsQ0F4STZDO0VBMkk5Q1ksUUFBUyxVQUFZLENBRXBCLFlBQWMsS0FBSzdzRCxRQUFuQixDQUNDZ3NELFNBQVd6dEMsUUFBUWhzRixNQURwQixDQUVDMDVILGVBQWlCLEtBQUs1RCxlQUZ2QixDQUdDNkQsY0FBZ0IsS0FBS1QsY0FIdEIsQ0FJQ2xELFNBQVcsS0FBS04sU0FKakIsQ0FLQ21FLFVBQVk3RCxTQUFTaDJILE1BTHRCLENBT0EsSUFBTSxNQUFRLENBQVIsQ0FBVzRpQixFQUFJbGYsVUFBVTFELE1BQS9CLENBQXVDSyxJQUFNdWlCLENBQTdDLENBQWdELEVBQUd2aUIsQ0FBbkQsQ0FBdUQsQ0FFdEQsV0FBYXFELFVBQVdyRCxDQUFYLENBQWIsQ0FDQ3E2QixLQUFPNzZCLE9BQU82NkIsSUFEZixDQUVDenpCLE1BQVEweUgsY0FBZWovRixJQUFmLENBRlQsQ0FJQSxHQUFLenpCLFFBQVV0SSxTQUFmLENBQTJCLENBRTFCLHFCQUFzQis3QixJQUFmLENBQVAsQ0FFQSxHQUFLenpCLE1BQVF5eUgsY0FBYixDQUE4QjtFQUk3QixxQkFBdUIsRUFBR0EsY0FBMUIsQ0FDQ0ssaUJBQW1CL3RDLFFBQVNndUMsZ0JBQVQsQ0FEcEIsQ0FFQ3Q1RCxVQUFZLEVBQUcrNEQsUUFGaEIsQ0FHQ2MsV0FBYXZ1QyxRQUFTdHJCLFNBQVQsQ0FIZCxDQUtBO0VBQ0FpNUQsY0FBZUksaUJBQWlCci9GLElBQWhDLEVBQXlDenpCLEtBQXpDLENBQ0Era0YsUUFBUy9rRixLQUFULEVBQW1COHlILGdCQUFuQixDQUVBO0VBQ0FKLGNBQWVZLFdBQVc3L0YsSUFBMUIsRUFBbUNzL0YsZ0JBQW5DLENBQ0FodUMsUUFBU2d1QyxnQkFBVCxFQUE4Qk8sVUFBOUIsQ0FDQXZ1QyxRQUFRL3JGLEdBQVIsR0FFQTtFQUVBLElBQU0sTUFBUSxDQUFSLENBQVc0aUIsRUFBSWczRyxTQUFyQixDQUFnQzU5RyxJQUFNNEcsQ0FBdEMsQ0FBeUMsRUFBRzVHLENBQTVDLENBQWdELENBRS9DLG9CQUFzQis1RyxTQUFVLzVHLENBQVYsQ0FBdEIsQ0FDQ2crRyxXQUFhQyxnQkFBaUJGLGdCQUFqQixDQURkLENBRUM5b0gsS0FBT2dwSCxnQkFBaUJ4NUQsU0FBakIsQ0FGUixDQUlBdzVELGdCQUFpQmp6SCxLQUFqQixFQUEyQmd6SCxVQUEzQixDQUNBQyxnQkFBaUJGLGdCQUFqQixFQUFzQzlvSCxJQUF0QyxDQUNBZ3BILGdCQUFnQmo2SCxHQUFoQixHQUVBLENBRUQsQ0FoQ0QsSUFnQ087RUFJTixjQUFnQixFQUFHdzVILFFBQW5CLENBQ0NjLFdBQWF2dUMsUUFBU3RyQixTQUFULENBRGQsQ0FHQWk1RCxjQUFlWSxXQUFXNy9GLElBQTFCLEVBQW1DenpCLEtBQW5DLENBQ0Era0YsUUFBUy9rRixLQUFULEVBQW1Cc3pILFVBQW5CLENBQ0F2dUMsUUFBUS9yRixHQUFSLEdBRUE7RUFFQSxJQUFNLE1BQVEsQ0FBUixDQUFXNGlCLEVBQUlnM0csU0FBckIsQ0FBZ0M1OUcsSUFBTTRHLENBQXRDLENBQXlDLEVBQUc1RyxDQUE1QyxDQUFnRCxDQUUvQyxvQkFBc0IrNUcsU0FBVS81RyxDQUFWLENBQXRCLENBRUFpK0csZ0JBQWlCanpILEtBQWpCLEVBQTJCaXpILGdCQUFpQng1RCxTQUFqQixDQUEzQixDQUNBdzVELGdCQUFnQmo2SCxHQUFoQixHQUVBLENBRUQsQ0FBQztFQUVGLENBQUM7RUFFRixDQUFDO0VBRUYsS0FBSzYxSCxlQUFMLENBQXVCNEQsY0FBdkIsQ0FFQSxDQTVONkM7RUFnTzlDL0QsV0FBWSxTQUFXbjFELElBQVgsQ0FBaUJvMUQsVUFBakIsQ0FBOEI7RUFHekM7RUFFQSxrQkFBb0IsS0FBS3lELHNCQUF6QixDQUNDcHlILE1BQVF1ekgsY0FBZWg2RCxJQUFmLENBRFQsQ0FFQ3cxRCxTQUFXLEtBQUtOLFNBRmpCLENBSUEsR0FBS3p1SCxRQUFVdEksU0FBZixDQUEyQixnQkFBaUJzSSxLQUFWLENBQVAsQ0FFM0IsVUFBWSxLQUFLa3lILE1BQWpCLENBQ0NTLFlBQWMsS0FBS1IsWUFEcEIsQ0FFQ3B0QyxRQUFVLEtBQUt2ZSxRQUZoQixDQUdDZ3NELFNBQVd6dEMsUUFBUWhzRixNQUhwQixDQUlDMDVILGVBQWlCLEtBQUs1RCxlQUp2QixDQUtDb0UsZ0JBQWtCLFNBQUEsQ0FBV1QsUUFBWCxDQUxuQixDQU9BeHlILE1BQVErdUgsU0FBU2gySCxNQUFqQixDQUVBdzZILGNBQWVoNkQsSUFBZixFQUF3QnY1RCxLQUF4QixDQUVBNmxILE1BQU10dEgsSUFBTixDQUFZZ2hFLElBQVosRUFDQW81RCxZQUFZcDZILElBQVosQ0FBa0JvMkgsVUFBbEIsRUFDQUksU0FBU3gySCxJQUFULENBQWUwNkgsZUFBZixFQUVBLElBQU0sTUFBUVIsY0FBUixDQUF3QjkyRyxFQUFJb3BFLFFBQVFoc0YsTUFBMUMsQ0FBa0RLLElBQU11aUIsQ0FBeEQsQ0FBMkQsRUFBR3ZpQixDQUE5RCxDQUFrRSxDQUVqRSxXQUFhMnJGLFFBQVMzckYsQ0FBVCxDQUFiLENBQ0E2NUgsZ0JBQWlCNzVILENBQWpCLEVBQXVCLG1CQUFBLENBQXFCUixNQUFyQixDQUE2QjJnRSxJQUE3QixDQUFtQ28xRCxVQUFuQyxDQUF2QixDQUVBLENBRUQsc0JBQUEsQ0FFQSxDQW5RNkMsQ0FxUTlDNkUsYUFBYyxTQUFXajZELElBQVgsQ0FBa0I7RUFHL0I7RUFFQSxrQkFBb0IsS0FBSzY0RCxzQkFBekIsQ0FDQ3B5SCxNQUFRdXpILGNBQWVoNkQsSUFBZixDQURULENBR0EsR0FBS3Y1RCxRQUFVdEksU0FBZixDQUEyQixDQUUxQixVQUFZLEtBQUt3NkgsTUFBakIsQ0FDQ1MsWUFBYyxLQUFLUixZQURwQixDQUVDcEQsU0FBVyxLQUFLTixTQUZqQixDQUdDZ0Ysa0JBQW9CMUUsU0FBU2gySCxNQUFULENBQWtCLENBSHZDLENBSUMyNkgsYUFBZTNFLFNBQVUwRSxpQkFBVixDQUpoQixDQUtDRSxpQkFBbUJwNkQsS0FBTWs2RCxpQkFBTixDQUxwQixDQU9BRixjQUFlSSxnQkFBZixFQUFvQzN6SCxLQUFwQyxDQUVBK3VILFNBQVUvdUgsS0FBVixFQUFvQjB6SCxZQUFwQixDQUNBM0UsU0FBUy8xSCxHQUFULEdBRUEyNUgsWUFBYTN5SCxLQUFiLEVBQXVCMnlILFlBQWFjLGlCQUFiLENBQXZCLENBQ0FkLFlBQVkzNUgsR0FBWixHQUVBNnNILE1BQU83bEgsS0FBUCxFQUFpQjZsSCxNQUFPNE4saUJBQVAsQ0FBakIsQ0FDQTVOLE1BQU03c0gsR0FBTixHQUVBLENBRUQsQ0FuUzZDLENBQS9DLEVBdVNBOzs7Ozs7Ozs7S0FXQSx3QkFBQSxDQUEwQjQ2SCxLQUExQixDQUFpQ2xhLElBQWpDLENBQXVDbWEsU0FBdkMsQ0FBbUQsQ0FFbEQsS0FBS0MsTUFBTCxDQUFjRixLQUFkLENBQ0EsS0FBS0csS0FBTCxDQUFhcmEsSUFBYixDQUNBLEtBQUtzYSxVQUFMLENBQWtCSCxXQUFhLElBQS9CLENBRUEsV0FBYW5hLEtBQUtOLE1BQWxCLENBQ0M2YSxRQUFVN2EsT0FBT3JnSCxNQURsQixDQUVDbTdILGFBQWUsU0FBQSxDQUFXRCxPQUFYLENBRmhCLENBSUEsd0JBQTBCLENBQ3pCcmYsWUFBYUMsbUJBRFksQ0FFekJDLFVBQVdELG1CQUZjLENBQTFCLENBS0EsSUFBTSxNQUFRLENBQWQsQ0FBaUJ6N0csSUFBTTY2SCxPQUF2QixDQUFnQyxFQUFHNzZILENBQW5DLENBQXVDLENBRXRDLGdCQUFrQmdnSCxPQUFRaGdILENBQVIsRUFBWTIrRyxpQkFBWixDQUErQixJQUEvQixDQUFsQixDQUNBbWMsYUFBYzk2SCxDQUFkLEVBQW9CKzZILFdBQXBCLENBQ0FBLFlBQVl0Z0IsUUFBWixDQUF1QnVnQixtQkFBdkIsQ0FFQSxDQUVELEtBQUtDLG9CQUFMLENBQTRCRCxtQkFBNUIsQ0FFQSxLQUFLRSxhQUFMLENBQXFCSixZQUFyQixDQUFtQztFQUVuQztFQUNBLEtBQUtLLGlCQUFMLENBQXlCLFNBQUEsQ0FBV04sT0FBWCxDQUF6QixDQUVBLEtBQUtPLFdBQUwsQ0FBbUIsSUFBbkIsQ0FBMkI7RUFDM0IsS0FBS0MsaUJBQUwsQ0FBeUIsSUFBekIsQ0FBZ0M7RUFFaEMsS0FBS0MscUJBQUwsQ0FBNkIsSUFBN0IsQ0FDQSxLQUFLQyxrQkFBTCxDQUEwQixJQUExQixDQUVBLEtBQUt6SyxJQUFMLENBQVkwSyxVQUFaLENBQ0EsS0FBS0MsVUFBTCxDQUFrQixDQUFFLENBQXBCLENBRUE7RUFDQTtFQUNBLEtBQUtDLFVBQUwsQ0FBa0IsSUFBbEIsQ0FFQTtFQUNBO0VBQ0EsS0FBSzdxQyxJQUFMLENBQVksQ0FBWixDQUVBLEtBQUtpdUIsU0FBTCxDQUFpQixDQUFqQixDQUNBLEtBQUs2YyxtQkFBTCxDQUEyQixDQUEzQixDQUVBLEtBQUt6bkIsTUFBTCxDQUFjLENBQWQsQ0FDQSxLQUFLMG5CLGdCQUFMLENBQXdCLENBQXhCLENBRUEsS0FBS0MsV0FBTCxDQUFtQnY5RixRQUFuQixDQUErQjtFQUUvQixLQUFLdzlGLE1BQUwsQ0FBYyxLQUFkLENBQXdCO0VBQ3hCLEtBQUs3K0UsT0FBTCxDQUFlLElBQWYsQ0FBd0I7RUFFeEIsS0FBSzgrRSxpQkFBTCxDQUEwQixLQUExQixDQUFpQztFQUVqQyxLQUFLQyxnQkFBTCxDQUF5QixJQUF6QixDQUFnQztFQUNoQyxLQUFLQyxjQUFMLENBQXVCLElBQXZCLENBQThCO0VBRTlCLENBRURoakksT0FBTzRuQixNQUFQLENBQWVxN0csZ0JBQWdCaGpJLFNBQS9CLENBQTBDO0VBSXpDdTRILEtBQU0sVUFBWSxDQUVqQixLQUFLaUosTUFBTCxDQUFZeUIsZUFBWixDQUE2QixJQUE3QixFQUVBLFdBQUEsQ0FFQSxDQVZ3QyxDQVl6QzM3SCxLQUFNLFVBQVksQ0FFakIsS0FBS2s2SCxNQUFMLENBQVkwQixpQkFBWixDQUErQixJQUEvQixFQUVBLFlBQVk5OEgsS0FBTCxFQUFQLENBRUEsQ0FsQndDLENBb0J6Q0EsTUFBTyxVQUFZLENBRWxCLEtBQUt3OEgsTUFBTCxDQUFjLEtBQWQsQ0FDQSxLQUFLNytFLE9BQUwsQ0FBZSxJQUFmLENBRUEsS0FBSzR6QyxJQUFMLENBQVksQ0FBWixDQUFpQjtFQUNqQixLQUFLNHFDLFVBQUwsQ0FBa0IsQ0FBRSxDQUFwQixDQUF1QjtFQUN2QixLQUFLQyxVQUFMLENBQWtCLElBQWxCLENBQXdCO0VBRXhCLFlBQVlXLFVBQUwsR0FBa0JDLFdBQWxCLEVBQVAsQ0FFQSxDQS9Cd0MsQ0FpQ3pDQyxVQUFXLFVBQVksQ0FFdEIsWUFBWXQvRSxPQUFMLEVBQWdCLENBQUUsS0FBSzYrRSxNQUF2QixFQUFpQyxLQUFLaGQsU0FBTCxHQUFtQixDQUFwRCxFQUNMLEtBQUs0YyxVQUFMLEdBQW9CLElBRGYsRUFDdUIsS0FBS2hCLE1BQUwsQ0FBWThCLGVBQVosQ0FBNkIsSUFBN0IsQ0FEOUIsQ0FHQSxDQXRDd0M7RUF5Q3pDQyxZQUFhLFVBQVksQ0FFeEIsWUFBWS9CLE1BQUwsQ0FBWThCLGVBQVosQ0FBNkIsSUFBN0IsQ0FBUCxDQUVBLENBN0N3QyxDQStDekNFLFFBQVMsU0FBVzdyQyxJQUFYLENBQWtCLENBRTFCLEtBQUs2cUMsVUFBTCxDQUFrQjdxQyxJQUFsQixDQUVBLFdBQUEsQ0FFQSxDQXJEd0MsQ0F1RHpDc2hDLFFBQVMsU0FBVzVxSCxJQUFYLENBQWlCczBILFdBQWpCLENBQStCLENBRXZDLEtBQUsvSyxJQUFMLENBQVl2cEgsSUFBWixDQUNBLEtBQUtzMEgsV0FBTCxDQUFtQkEsV0FBbkIsQ0FFQSxXQUFBLENBRUEsQ0E5RHdDO0VBa0V6QztFQUNBO0VBQ0E7RUFDQWMsbUJBQW9CLFNBQVd6b0IsTUFBWCxDQUFvQixDQUV2QyxLQUFLQSxNQUFMLENBQWNBLE1BQWQsQ0FFQTtFQUNBLEtBQUswbkIsZ0JBQUwsQ0FBd0IsS0FBSzMrRSxPQUFMLENBQWVpM0QsTUFBZixDQUF3QixDQUFoRCxDQUVBLFlBQVltb0IsVUFBTCxFQUFQLENBRUEsQ0E5RXdDO0VBaUZ6Q08sbUJBQW9CLFVBQVksQ0FFL0IsWUFBWWhCLGdCQUFaLENBRUEsQ0FyRndDLENBdUZ6Q2lCLE9BQVEsU0FBVzljLFFBQVgsQ0FBc0IsQ0FFN0IsWUFBWStjLGVBQUwsQ0FBc0IvYyxRQUF0QixDQUFnQyxDQUFoQyxDQUFtQyxDQUFuQyxDQUFQLENBRUEsQ0EzRndDLENBNkZ6Q2dkLFFBQVMsU0FBV2hkLFFBQVgsQ0FBc0IsQ0FFOUIsWUFBWStjLGVBQUwsQ0FBc0IvYyxRQUF0QixDQUFnQyxDQUFoQyxDQUFtQyxDQUFuQyxDQUFQLENBRUEsQ0FqR3dDLENBbUd6Q2lkLGNBQWUsU0FBV0MsYUFBWCxDQUEwQmxkLFFBQTFCLENBQW9DbWQsSUFBcEMsQ0FBMkMsQ0FFekRELGNBQWNGLE9BQWQsQ0FBdUJoZCxRQUF2QixFQUNBLEtBQUs4YyxNQUFMLENBQWE5YyxRQUFiLEVBRUEsR0FBS21kLElBQUwsQ0FBWSxDQUVYLG1CQUFxQixLQUFLdkMsS0FBTCxDQUFXNWEsUUFBaEMsQ0FDQ29kLGdCQUFrQkYsY0FBY3RDLEtBQWQsQ0FBb0I1YSxRQUR2QyxDQUdDcWQsY0FBZ0JELGdCQUFrQkUsY0FIbkMsQ0FJQ0MsY0FBZ0JELGVBQWlCRixlQUpsQyxDQU1BRixjQUFjQyxJQUFkLENBQW9CLEdBQXBCLENBQXlCRSxhQUF6QixDQUF3Q3JkLFFBQXhDLEVBQ0EsS0FBS21kLElBQUwsQ0FBV0ksYUFBWCxDQUEwQixHQUExQixDQUErQnZkLFFBQS9CLEVBRUEsQ0FFRCxXQUFBLENBRUEsQ0F2SHdDLENBeUh6Q3dkLFlBQWEsU0FBV0MsWUFBWCxDQUF5QnpkLFFBQXpCLENBQW1DbWQsSUFBbkMsQ0FBMEMsQ0FFdEQsb0JBQW9CRixhQUFiLENBQTRCLElBQTVCLENBQWtDamQsUUFBbEMsQ0FBNENtZCxJQUE1QyxDQUFQLENBRUEsQ0E3SHdDLENBK0h6Q2IsV0FBWSxVQUFZLENBRXZCLHNCQUF3QixLQUFLZCxrQkFBN0IsQ0FFQSxHQUFLa0Msb0JBQXNCLElBQTNCLENBQWtDLENBRWpDLEtBQUtsQyxrQkFBTCxDQUEwQixJQUExQixDQUNBLEtBQUtiLE1BQUwsQ0FBWWdELDJCQUFaLENBQXlDRCxpQkFBekMsRUFFQSxDQUVELFdBQUEsQ0FFQSxDQTVJd0M7RUFnSnpDO0VBQ0E7RUFDQTtFQUNBRSxzQkFBdUIsU0FBVzdlLFNBQVgsQ0FBdUIsQ0FFN0MsS0FBS0EsU0FBTCxDQUFpQkEsU0FBakIsQ0FDQSxLQUFLNmMsbUJBQUwsQ0FBMkIsS0FBS0csTUFBTCxDQUFjLENBQWQsQ0FBa0JoZCxTQUE3QyxDQUVBLFlBQVl3ZCxXQUFMLEVBQVAsQ0FFQSxDQTFKd0M7RUE2SnpDc0Isc0JBQXVCLFVBQVksQ0FFbEMsWUFBWWpDLG1CQUFaLENBRUEsQ0FqS3dDLENBbUt6Q2tDLFlBQWEsU0FBVzlkLFFBQVgsQ0FBc0IsQ0FFbEMsS0FBS2pCLFNBQUwsQ0FBaUIsS0FBSzZiLEtBQUwsQ0FBVzVhLFFBQVgsQ0FBc0JBLFFBQXZDLENBRUEsWUFBWXVjLFdBQUwsRUFBUCxDQUVBLENBekt3QyxDQTJLekN3QixTQUFVLFNBQVduUSxNQUFYLENBQW9CLENBRTdCLEtBQUs5OEIsSUFBTCxDQUFZODhCLE9BQU85OEIsSUFBbkIsQ0FDQSxLQUFLaXVCLFNBQUwsQ0FBaUI2TyxPQUFPN08sU0FBeEIsQ0FFQSxZQUFZd2QsV0FBTCxFQUFQLENBRUEsQ0FsTHdDLENBb0x6Q3lCLEtBQU0sU0FBV2hlLFFBQVgsQ0FBc0IsQ0FFM0IsWUFBWW1kLElBQUwsQ0FBVyxLQUFLdkIsbUJBQWhCLENBQXFDLENBQXJDLENBQXdDNWIsUUFBeEMsQ0FBUCxDQUVBLENBeEx3QyxDQTBMekNtZCxLQUFNLFNBQVdjLGNBQVgsQ0FBMkJDLFlBQTNCLENBQXlDbGUsUUFBekMsQ0FBb0QsQ0FFekQsVUFBWSxLQUFLMmEsTUFBakIsQ0FBeUIvcUgsSUFBTTZxSCxNQUFNM3BDLElBQXJDLENBQ0NrcUMsWUFBYyxLQUFLTyxxQkFEcEIsQ0FHQ3hjLFVBQVksS0FBS0EsU0FIbEIsQ0FLQSxHQUFLaWMsY0FBZ0IsSUFBckIsQ0FBNEIsQ0FFM0JBLFlBQWNQLE1BQU0wRCx1QkFBTixFQUFkLENBQ0EsS0FBSzVDLHFCQUFMLENBQTZCUCxXQUE3QixDQUVBLENBRUQsVUFBWUEsWUFBWTFoQixrQkFBeEIsQ0FDQ24rRyxPQUFTNi9ILFlBQVl6aEIsWUFEdEIsQ0FHQVosTUFBTyxDQUFQLEVBQWEvb0csR0FBYixDQUNBK29HLE1BQU8sQ0FBUCxFQUFhL29HLElBQU1vd0csUUFBbkIsQ0FFQTdrSCxPQUFRLENBQVIsRUFBYzhpSSxlQUFpQmxmLFNBQS9CLENBQ0E1akgsT0FBUSxDQUFSLEVBQWMraUksYUFBZW5mLFNBQTdCLENBRUEsV0FBQSxDQUVBLENBbk53QyxDQXFOekN3ZCxZQUFhLFVBQVksQ0FFeEIseUJBQTJCLEtBQUtoQixxQkFBaEMsQ0FFQSxHQUFLNkMsdUJBQXlCLElBQTlCLENBQXFDLENBRXBDLEtBQUs3QyxxQkFBTCxDQUE2QixJQUE3QixDQUNBLEtBQUtaLE1BQUwsQ0FBWWdELDJCQUFaLENBQXlDUyxvQkFBekMsRUFFQSxDQUVELFdBQUEsQ0FFQSxDQWxPd0M7RUFzT3pDQyxTQUFVLFVBQVksQ0FFckIsWUFBWTFELE1BQVosQ0FFQSxDQTFPd0MsQ0E0T3pDMkQsUUFBUyxVQUFZLENBRXBCLFlBQVkxRCxLQUFaLENBRUEsQ0FoUHdDLENBa1B6QzJELFFBQVMsVUFBWSxDQUVwQixZQUFZMUQsVUFBTCxFQUFtQixLQUFLRixNQUFMLENBQVk2RCxLQUF0QyxDQUVBLENBdFB3QztFQTBQekNDLFFBQVMsU0FBVzN0QyxJQUFYLENBQWlCNHRDLFNBQWpCLENBQTRCQyxhQUE1QixDQUEyQ2pLLFNBQTNDLENBQXVEO0VBSS9ELEdBQUssQ0FBRSxLQUFLeDNFLE9BQVosQ0FBc0I7RUFJckIsS0FBSzBoRixhQUFMLENBQW9COXRDLElBQXBCLEVBQ0EsT0FFQSxDQUVELGNBQWdCLEtBQUs2cUMsVUFBckIsQ0FFQSxHQUFLM2MsWUFBYyxJQUFuQixDQUEwQjtFQUl6QixnQkFBa0IsQ0FBRWx1QixLQUFPa3VCLFNBQVQsRUFBdUIyZixhQUF6QyxDQUNBLEdBQUtFLFlBQWMsQ0FBZCxFQUFtQkYsZ0JBQWtCLENBQTFDLENBQThDLENBRTdDLE9BQVE7RUFFUixDQUVEO0VBRUEsS0FBS2hELFVBQUwsQ0FBa0IsSUFBbEIsQ0FBd0I7RUFDeEIrQyxVQUFZQyxjQUFnQkUsV0FBNUIsQ0FFQSxDQUVEO0VBRUFILFdBQWEsS0FBS0ksZ0JBQUwsQ0FBdUJodUMsSUFBdkIsQ0FBYixDQUNBLGFBQWUsS0FBS2l1QyxXQUFMLENBQWtCTCxTQUFsQixDQUFmLENBRUE7RUFDQTtFQUVBLFdBQWEsS0FBS0UsYUFBTCxDQUFvQjl0QyxJQUFwQixDQUFiLENBRUEsR0FBS3FqQixPQUFTLENBQWQsQ0FBa0IsQ0FFakIsaUJBQW1CLEtBQUtnbkIsYUFBeEIsQ0FDQSxtQkFBcUIsS0FBS0MsaUJBQTFCLENBRUEsSUFBTSxNQUFRLENBQVIsQ0FBVzM0RyxFQUFJczRHLGFBQWFuN0gsTUFBbEMsQ0FBMENpYyxJQUFNNEcsQ0FBaEQsQ0FBbUQsRUFBRzVHLENBQXRELENBQTBELENBRXpEay9HLGFBQWNsL0csQ0FBZCxFQUFrQmcrRixRQUFsQixDQUE0Qm1sQixRQUE1QixFQUNBQyxlQUFnQnBqSCxDQUFoQixFQUFvQjQ0RyxVQUFwQixDQUFnQ0MsU0FBaEMsQ0FBMkN2Z0IsTUFBM0MsRUFFQSxDQUVELENBRUQsQ0FuVHdDLENBcVR6Q3lxQixjQUFlLFNBQVc5dEMsSUFBWCxDQUFrQixDQUVoQyxXQUFhLENBQWIsQ0FFQSxHQUFLLEtBQUs1ekMsT0FBVixDQUFvQixDQUVuQmkzRCxPQUFTLEtBQUtBLE1BQWQsQ0FDQSxnQkFBa0IsS0FBS3FuQixrQkFBdkIsQ0FFQSxHQUFLUixjQUFnQixJQUFyQixDQUE0QixDQUUzQixxQkFBdUJBLFlBQVluaEIsUUFBWixDQUFzQi9vQixJQUF0QixFQUE4QixDQUE5QixDQUF2QixDQUVBcWpCLFFBQVUrcUIsZ0JBQVYsQ0FFQSxHQUFLcHVDLEtBQU9rcUMsWUFBWTFoQixrQkFBWixDQUFnQyxDQUFoQyxDQUFaLENBQWtELENBRWpELEtBQUtnakIsVUFBTCxHQUVBLEdBQUs0QyxtQkFBcUIsQ0FBMUIsQ0FBOEI7RUFHN0IsS0FBS2hpRixPQUFMLENBQWUsS0FBZixDQUVBLENBRUQsQ0FFRCxDQUVELENBRUQsS0FBSzIrRSxnQkFBTCxDQUF3QjFuQixNQUF4QixDQUNBLGFBQUEsQ0FFQSxDQXhWd0MsQ0EwVnpDMnFCLGlCQUFrQixTQUFXaHVDLElBQVgsQ0FBa0IsQ0FFbkMsY0FBZ0IsQ0FBaEIsQ0FFQSxHQUFLLENBQUUsS0FBS2lyQyxNQUFaLENBQXFCLENBRXBCaGQsVUFBWSxLQUFLQSxTQUFqQixDQUVBLGdCQUFrQixLQUFLd2MscUJBQXZCLENBRUEsR0FBS1AsY0FBZ0IsSUFBckIsQ0FBNEIsQ0FFM0IscUJBQXVCQSxZQUFZbmhCLFFBQVosQ0FBc0Ivb0IsSUFBdEIsRUFBOEIsQ0FBOUIsQ0FBdkIsQ0FFQWl1QixXQUFhbWdCLGdCQUFiLENBRUEsR0FBS3B1QyxLQUFPa3FDLFlBQVkxaEIsa0JBQVosQ0FBZ0MsQ0FBaEMsQ0FBWixDQUFrRCxDQUVqRCxLQUFLaWpCLFdBQUwsR0FFQSxHQUFLeGQsWUFBYyxDQUFuQixDQUF1QjtFQUd0QixLQUFLZ2QsTUFBTCxDQUFjLElBQWQsQ0FFQSxDQUxELElBS087RUFHTixLQUFLaGQsU0FBTCxDQUFpQkEsU0FBakIsQ0FFQSxDQUVELENBRUQsQ0FFRCxDQUVELEtBQUs2YyxtQkFBTCxDQUEyQjdjLFNBQTNCLENBQ0EsZ0JBQUEsQ0FFQSxDQW5Zd0MsQ0FxWXpDZ2dCLFlBQWEsU0FBV0wsU0FBWCxDQUF1QixDQUVuQyxTQUFXLEtBQUs1dEMsSUFBTCxDQUFZNHRDLFNBQXZCLENBRUEsR0FBS0EsWUFBYyxDQUFuQixDQUF1QixXQUFBLENBRXZCLGFBQWUsS0FBSzlELEtBQUwsQ0FBVzVhLFFBQTFCLENBRUMrUSxLQUFPLEtBQUtBLElBRmIsQ0FHQ29PLFVBQVksS0FBS3pELFVBSGxCLENBS0EsR0FBSzNLLE9BQVNxTyxRQUFkLENBQXlCLENBRXhCLEdBQUtELFlBQWMsQ0FBRSxDQUFyQixDQUF5QjtFQUl4QixLQUFLekQsVUFBTCxDQUFrQixDQUFsQixDQUNBLEtBQUsyRCxXQUFMLENBQWtCLElBQWxCLENBQXdCLElBQXhCLENBQThCLEtBQTlCLEVBRUEsQ0FFREMsWUFBYSxDQUVaLEdBQUt4dUMsTUFBUWt2QixRQUFiLENBQXdCLENBRXZCbHZCLEtBQU9rdkIsUUFBUCxDQUVBLENBSkQsUUFJWWx2QixLQUFPLENBQVosQ0FBZ0IsQ0FFdEJBLEtBQU8sQ0FBUCxDQUVBLENBSk0sc0JBSUEsQ0FFUCxHQUFLLEtBQUtrckMsaUJBQVYsQ0FBOEIsS0FBS0QsTUFBTCxDQUFjLElBQWQsQ0FBOUIsVUFDVTcrRSxPQUFMLENBQWUsS0FBZixDQUVMLEtBQUt5OUUsTUFBTCxDQUFZbjVHLGFBQVosQ0FBMkIsQ0FDMUI1bUIsS0FBTSxVQURvQixDQUNSZ3pILE9BQVEsSUFEQSxDQUUxQnJxRixVQUFXbTdGLFVBQVksQ0FBWixDQUFnQixDQUFFLENBQWxCLENBQXNCLENBRlAsQ0FBM0IsRUFLQSxDQUVELENBakNELElBaUNPO0VBRU4sYUFBaUIzTixPQUFTd08sWUFBMUIsQ0FFQSxHQUFLSixZQUFjLENBQUUsQ0FBckIsQ0FBeUI7RUFJeEIsR0FBS1QsV0FBYSxDQUFsQixDQUFzQixDQUVyQlMsVUFBWSxDQUFaLENBRUEsS0FBS0UsV0FBTCxDQUFrQixJQUFsQixDQUF3QixLQUFLdkQsV0FBTCxHQUFxQixDQUE3QyxDQUFnRDBELFFBQWhELEVBRUEsQ0FORCxJQU1PO0VBR047RUFDQTtFQUVBLEtBQUtILFdBQUwsQ0FBa0IsS0FBS3ZELFdBQUwsR0FBcUIsQ0FBdkMsQ0FBMEMsSUFBMUMsQ0FBZ0QwRCxRQUFoRCxFQUVBLENBRUQsQ0FFRCxHQUFLMXVDLE1BQVFrdkIsUUFBUixFQUFvQmx2QixLQUFPLENBQWhDLENBQW9DO0VBSW5DLGNBQWdCaHZGLEtBQUtFLEtBQUwsQ0FBWTh1RixLQUFPa3ZCLFFBQW5CLENBQWhCLENBQStDO0VBQy9DbHZCLE1BQVFrdkIsU0FBV3lmLFNBQW5CLENBRUFOLFdBQWFyOUgsS0FBS3lrQixHQUFMLENBQVVrNUcsU0FBVixDQUFiLENBRUEsWUFBYyxLQUFLM0QsV0FBTCxDQUFtQnFELFNBQWpDLENBRUEsR0FBS08sU0FBVyxDQUFoQixDQUFvQjtFQUluQixHQUFLLEtBQUsxRCxpQkFBVixDQUE4QixLQUFLRCxNQUFMLENBQWMsSUFBZCxDQUE5QixVQUNVNytFLE9BQUwsQ0FBZSxLQUFmLENBRUw0ekMsS0FBTzR0QyxVQUFZLENBQVosQ0FBZ0IxZSxRQUFoQixDQUEyQixDQUFsQyxDQUVBLEtBQUsyYSxNQUFMLENBQVluNUcsYUFBWixDQUEyQixDQUMxQjVtQixLQUFNLFVBRG9CLENBQ1JnekgsT0FBUSxJQURBLENBRTFCcnFGLFVBQVdtN0YsVUFBWSxDQUFaLENBQWdCLENBQWhCLENBQW9CLENBQUUsQ0FGUCxDQUEzQixFQUtBLENBZEQsSUFjTztFQUlOLEdBQUtnQixVQUFZLENBQWpCLENBQXFCO0VBSXBCLFlBQWNoQixVQUFZLENBQTFCLENBQ0EsS0FBS1csV0FBTCxDQUFrQk0sT0FBbEIsQ0FBMkIsQ0FBRUEsT0FBN0IsQ0FBc0NILFFBQXRDLEVBRUEsQ0FQRCxJQU9PLENBRU4sS0FBS0gsV0FBTCxDQUFrQixLQUFsQixDQUF5QixLQUF6QixDQUFnQ0csUUFBaEMsRUFFQSxDQUVELEtBQUs5RCxVQUFMLENBQWtCeUQsU0FBbEIsQ0FFQSxLQUFLeEUsTUFBTCxDQUFZbjVHLGFBQVosQ0FBMkIsQ0FDMUI1bUIsS0FBTSxNQURvQixDQUNaZ3pILE9BQVEsSUFESSxDQUNFNlIsVUFBV0EsU0FEYixDQUEzQixFQUlBLENBRUQsQ0FFRCxHQUFLRCxVQUFZLENBQUVMLFVBQVksQ0FBZCxJQUFzQixDQUF2QyxDQUEyQztFQUkxQyxLQUFLcnVDLElBQUwsQ0FBWUEsSUFBWixDQUNBLGdCQUFrQkEsSUFBbEIsQ0FFQSxDQUVELENBRUQsS0FBS0EsSUFBTCxDQUFZQSxJQUFaLENBQ0EsV0FBQSxDQUVBLENBN2dCd0MsQ0ErZ0J6Q3V1QyxZQUFhLFNBQVdNLE9BQVgsQ0FBb0JDLEtBQXBCLENBQTJCSixRQUEzQixDQUFzQyxDQUVsRCxhQUFlLEtBQUt0RSxvQkFBcEIsQ0FFQSxHQUFLc0UsUUFBTCxDQUFnQixDQUVmOWtCLFNBQVNlLFdBQVQsQ0FBd0Jva0IsZUFBeEIsQ0FDQW5sQixTQUFTaUIsU0FBVCxDQUFzQmtrQixlQUF0QixDQUVBLENBTEQsSUFLTztFQUlOLEdBQUtGLE9BQUwsQ0FBZSxDQUVkamxCLFNBQVNlLFdBQVQsQ0FBdUIsS0FBS3dnQixnQkFBTCxDQUF3QjRELGVBQXhCLENBQTBDbmtCLG1CQUFqRSxDQUVBLENBSkQsSUFJTyxDQUVOaEIsU0FBU2UsV0FBVCxDQUF1QnFrQixnQkFBdkIsQ0FFQSxDQUVELEdBQUtGLEtBQUwsQ0FBYSxDQUVabGxCLFNBQVNpQixTQUFULENBQXFCLEtBQUt1Z0IsY0FBTCxDQUFzQjJELGVBQXRCLENBQXdDbmtCLG1CQUE3RCxDQUVBLENBSkQsSUFJTyxDQUVOaEIsU0FBU2lCLFNBQVQsQ0FBdUJta0IsZ0JBQXZCLENBRUEsQ0FFRCxDQUVELENBbGpCd0MsQ0FvakJ6Qy9DLGdCQUFpQixTQUFXL2MsUUFBWCxDQUFxQitmLFNBQXJCLENBQWdDQyxVQUFoQyxDQUE2QyxDQUU3RCxVQUFZLEtBQUtyRixNQUFqQixDQUF5Qi9xSCxJQUFNNnFILE1BQU0zcEMsSUFBckMsQ0FDQ2txQyxZQUFjLEtBQUtRLGtCQURwQixDQUdBLEdBQUtSLGNBQWdCLElBQXJCLENBQTRCLENBRTNCQSxZQUFjUCxNQUFNMEQsdUJBQU4sRUFBZCxDQUNBLEtBQUszQyxrQkFBTCxDQUEwQlIsV0FBMUIsQ0FFQSxDQUVELFVBQVlBLFlBQVkxaEIsa0JBQXhCLENBQ0NuK0csT0FBUzYvSCxZQUFZemhCLFlBRHRCLENBR0FaLE1BQU8sQ0FBUCxFQUFhL29HLEdBQWIsQ0FBc0J6VSxPQUFRLENBQVIsRUFBYzRrSSxTQUFkLENBQ3RCcG5CLE1BQU8sQ0FBUCxFQUFhL29HLElBQU1vd0csUUFBbkIsQ0FBNkI3a0gsT0FBUSxDQUFSLEVBQWM2a0ksVUFBZCxDQUU3QixXQUFBLENBRUEsQ0F4a0J3QyxDQUExQyxFQTRrQkE7Ozs7Ozs7O0tBVUEsdUJBQUEsQ0FBeUIvSixJQUF6QixDQUFnQyxDQUUvQixLQUFLdUksS0FBTCxDQUFhdkksSUFBYixDQUNBLEtBQUtnSyxrQkFBTCxHQUNBLEtBQUtDLFVBQUwsQ0FBa0IsQ0FBbEIsQ0FFQSxLQUFLcHZDLElBQUwsQ0FBWSxDQUFaLENBRUEsS0FBS2l1QixTQUFMLENBQWlCLEdBQWpCLENBRUEsQ0FFRG9oQixlQUFlaG5JLFNBQWYsQ0FBMkJELE9BQU80bkIsTUFBUCxDQUFlNW5CLE9BQU9pQixNQUFQLENBQWU4bUIsZ0JBQWdCOW5CLFNBQS9CLENBQWYsQ0FBMkQsQ0FFckZzQyxZQUFhMGtJLGNBRndFLENBSXJGQyxZQUFhLFNBQVd4UyxNQUFYLENBQW1CeVMsZUFBbkIsQ0FBcUMsQ0FFakQsU0FBV3pTLE9BQU9pTixVQUFQLEVBQXFCLEtBQUsyRCxLQUFyQyxDQUNDdmUsT0FBUzJOLE9BQU9nTixLQUFQLENBQWEzYSxNQUR2QixDQUVDNmEsUUFBVTdhLE9BQU9yZ0gsTUFGbEIsQ0FHQ2cySCxTQUFXaEksT0FBT3dOLGlCQUhuQixDQUlDTCxhQUFlbk4sT0FBT3VOLGFBSnZCLENBS0NtRixTQUFXckssS0FBSzM3RixJQUxqQixDQU1DaW1HLGVBQWlCLEtBQUtDLHNCQU52QixDQU9DQyxlQUFpQkYsZUFBZ0JELFFBQWhCLENBUGxCLENBU0EsR0FBS0csaUJBQW1CbGlJLFNBQXhCLENBQW9DLENBRW5Da2lJLGVBQWlCLEVBQWpCLENBQ0FGLGVBQWdCRCxRQUFoQixFQUE2QkcsY0FBN0IsQ0FFQSxDQUVELElBQU0sTUFBUSxDQUFkLENBQWlCeGdJLElBQU02NkgsT0FBdkIsQ0FBZ0MsRUFBRzc2SCxDQUFuQyxDQUF1QyxDQUV0QyxVQUFZZ2dILE9BQVFoZ0gsQ0FBUixDQUFaLENBQ0N1aEgsVUFBWWxELE1BQU1yaUgsSUFEbkIsQ0FFQzgzSCxRQUFVME0sZUFBZ0JqZixTQUFoQixDQUZYLENBSUEsR0FBS3VTLFVBQVl4MUgsU0FBakIsQ0FBNkIsQ0FFNUJxM0gsU0FBVTMxSCxDQUFWLEVBQWdCOHpILE9BQWhCLENBRUEsQ0FKRCxJQUlPLENBRU5BLFFBQVU2QixTQUFVMzFILENBQVYsQ0FBVixDQUVBLEdBQUs4ekgsVUFBWXgxSCxTQUFqQixDQUE2QjtFQUk1QixHQUFLdzFILFFBQVFzSCxXQUFSLEdBQXdCLElBQTdCLENBQW9DLENBRW5DLEVBQUd0SCxRQUFRUSxjQUFYLENBQ0EsS0FBS21NLG1CQUFMLENBQTBCM00sT0FBMUIsQ0FBbUN1TSxRQUFuQyxDQUE2QzllLFNBQTdDLEVBRUEsQ0FFRCxTQUVBLENBRUQsU0FBVzZlLGlCQUFtQkEsZ0JBQzdCakYsaUJBRDZCLENBQ1ZuN0gsQ0FEVSxFQUNOOHpILE9BRE0sQ0FDRXlCLFVBRGhDLENBR0F6QixRQUFVLGlCQUFBLENBQ1RvQixnQkFBZ0JoN0gsTUFBaEIsQ0FBd0I4N0gsSUFBeEIsQ0FBOEJ6VSxTQUE5QixDQUF5Q3BoRCxJQUF6QyxDQURTLENBRVRrK0MsTUFBTXZGLGFBRkcsQ0FFWXVGLE1BQU1yRCxZQUFOLEVBRlosQ0FBVixDQUlBLEVBQUc4WSxRQUFRUSxjQUFYLENBQ0EsS0FBS21NLG1CQUFMLENBQTBCM00sT0FBMUIsQ0FBbUN1TSxRQUFuQyxDQUE2QzllLFNBQTdDLEVBRUFvVSxTQUFVMzFILENBQVYsRUFBZ0I4ekgsT0FBaEIsQ0FFQSxDQUVEZ0gsYUFBYzk2SCxDQUFkLEVBQWtCdzVHLFlBQWxCLENBQWlDc2EsUUFBUTM5RSxNQUF6QyxDQUVBLENBRUQsQ0FyRW9GLENBdUVyRmdtRixnQkFBaUIsU0FBV3hPLE1BQVgsQ0FBb0IsQ0FFcEMsR0FBSyxDQUFFLEtBQUs2TyxlQUFMLENBQXNCN08sTUFBdEIsQ0FBUCxDQUF3QyxDQUV2QyxHQUFLQSxPQUFPeU4sV0FBUCxHQUF1QixJQUE1QixDQUFtQztFQUdsQztFQUVBLGFBQWUsQ0FBRXpOLE9BQU9pTixVQUFQLEVBQXFCLEtBQUsyRCxLQUE1QixFQUFvQ2xrRyxJQUFuRCxDQUNDcW1HLFNBQVcvUyxPQUFPZ04sS0FBUCxDQUFhdGdHLElBRHpCLENBRUNzbUcsZUFBaUIsS0FBS0MsY0FBTCxDQUFxQkYsUUFBckIsQ0FGbEIsQ0FJQSxLQUFLUCxXQUFMLENBQWtCeFMsTUFBbEIsQ0FDQ2dULGdCQUFrQkEsZUFBZUUsWUFBZixDQUE2QixDQUE3QixDQURuQixFQUdBLEtBQUtDLGtCQUFMLENBQXlCblQsTUFBekIsQ0FBaUMrUyxRQUFqQyxDQUEyQ0wsUUFBM0MsRUFFQSxDQUVELGFBQWUxUyxPQUFPd04saUJBQXRCLENBRUE7RUFDQSxJQUFNLE1BQVEsQ0FBUixDQUFXNTRHLEVBQUlvekcsU0FBU2gySCxNQUE5QixDQUFzQ0ssSUFBTXVpQixDQUE1QyxDQUErQyxFQUFHdmlCLENBQWxELENBQXNELENBRXJELFlBQWMyMUgsU0FBVTMxSCxDQUFWLENBQWQsQ0FFQSxHQUFLOHpILFFBQVFPLFFBQVIsS0FBd0IsQ0FBN0IsQ0FBaUMsQ0FFaEMsS0FBSzBNLFlBQUwsQ0FBbUJqTixPQUFuQixFQUNBQSxRQUFRZSxpQkFBUixHQUVBLENBRUQsQ0FFRCxLQUFLbU0sV0FBTCxDQUFrQnJULE1BQWxCLEVBRUEsQ0FFRCxDQS9Hb0YsQ0FpSHJGeU8sa0JBQW1CLFNBQVd6TyxNQUFYLENBQW9CLENBRXRDLEdBQUssS0FBSzZPLGVBQUwsQ0FBc0I3TyxNQUF0QixDQUFMLENBQXNDLENBRXJDLGFBQWVBLE9BQU93TixpQkFBdEIsQ0FFQTtFQUNBLElBQU0sTUFBUSxDQUFSLENBQVc1NEcsRUFBSW96RyxTQUFTaDJILE1BQTlCLENBQXNDSyxJQUFNdWlCLENBQTVDLENBQStDLEVBQUd2aUIsQ0FBbEQsQ0FBc0QsQ0FFckQsWUFBYzIxSCxTQUFVMzFILENBQVYsQ0FBZCxDQUVBLEdBQUssRUFBRzh6SCxRQUFRTyxRQUFYLEdBQXdCLENBQTdCLENBQWlDLENBRWhDUCxRQUFRaUIsb0JBQVIsR0FDQSxLQUFLa00sZ0JBQUwsQ0FBdUJuTixPQUF2QixFQUVBLENBRUQsQ0FFRCxLQUFLb04sZUFBTCxDQUFzQnZULE1BQXRCLEVBRUEsQ0FFRCxDQXpJb0Y7RUE2SXJGcVMsbUJBQW9CLFVBQVksQ0FFL0IsS0FBS21CLFFBQUwsQ0FBZ0IsRUFBaEIsQ0FBb0I7RUFDcEIsS0FBS0MsZUFBTCxDQUF1QixDQUF2QixDQUVBLEtBQUtSLGNBQUwsQ0FBc0IsRUFBdEIsQ0FDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBR0EsS0FBS3ZMLFNBQUwsQ0FBaUIsRUFBakIsQ0FBcUI7RUFDckIsS0FBS2dNLGdCQUFMLENBQXdCLENBQXhCLENBRUEsS0FBS2Qsc0JBQUwsQ0FBOEIsRUFBOUIsQ0FBa0M7RUFHbEMsS0FBS2Usb0JBQUwsQ0FBNEIsRUFBNUIsQ0FBZ0M7RUFDaEMsS0FBS0MsMkJBQUwsQ0FBbUMsQ0FBbkMsQ0FFQSxVQUFZLElBQVosQ0FFQSxLQUFLdEksS0FBTCxDQUFhLENBRVp1SSxRQUFTLENBQ1IsU0FBQSxFQUFZLENBRVgsYUFBYUwsUUFBTixDQUFleGhJLE1BQXRCLENBRUEsQ0FMTyxDQU1SLFNBQUEsRUFBWSxDQUVYLGFBQWF5aEksZUFBYixDQUVBLENBVk8sQ0FGRyxDQWNaekwsU0FBVSxDQUNULFNBQUEsRUFBWSxDQUVYLGFBQWFOLFNBQU4sQ0FBZ0IxMUgsTUFBdkIsQ0FFQSxDQUxRLENBTVQsU0FBQSxFQUFZLENBRVgsYUFBYTBoSSxnQkFBYixDQUVBLENBVlEsQ0FkRSxDQTBCWkksb0JBQXFCLENBQ3BCLFNBQUEsRUFBWSxDQUVYLGFBQWFILG9CQUFOLENBQTJCM2hJLE1BQWxDLENBRUEsQ0FMbUIsQ0FNcEIsU0FBQSxFQUFZLENBRVgsYUFBYTRoSSwyQkFBYixDQUVBLENBVm1CLENBMUJULENBQWIsQ0F5Q0EsQ0E5TW9GO0VBa05yRi9FLGdCQUFpQixTQUFXN08sTUFBWCxDQUFvQixDQUVwQyxVQUFZQSxPQUFPeU4sV0FBbkIsQ0FDQSxlQUFpQixJQUFWLEVBQWtCeDBILE1BQVEsS0FBS3c2SCxlQUF0QyxDQUVBLENBdk5vRixDQXlOckZOLG1CQUFvQixTQUFXblQsTUFBWCxDQUFtQitTLFFBQW5CLENBQTZCTCxRQUE3QixDQUF3QyxDQUUzRCxZQUFjLEtBQUtjLFFBQW5CLENBQ0NPLGNBQWdCLEtBQUtkLGNBRHRCLENBRUNELGVBQWlCZSxjQUFlaEIsUUFBZixDQUZsQixDQUlBLEdBQUtDLGlCQUFtQnJpSSxTQUF4QixDQUFvQyxDQUVuQ3FpSSxlQUFpQixDQUVoQkUsYUFBYyxDQUFFbFQsTUFBRixDQUZFLENBR2hCZ1UsYUFBYyxFQUhFLENBQWpCLENBT0FoVSxPQUFPME4saUJBQVAsQ0FBMkIsQ0FBM0IsQ0FFQXFHLGNBQWVoQixRQUFmLEVBQTRCQyxjQUE1QixDQUVBLENBYkQsSUFhTyxDQUVOLGlCQUFtQkEsZUFBZUUsWUFBbEMsQ0FFQWxULE9BQU8wTixpQkFBUCxDQUEyQndGLGFBQWFsaEksTUFBeEMsQ0FDQWtoSSxhQUFhMWhJLElBQWIsQ0FBbUJ3dUgsTUFBbkIsRUFFQSxDQUVEQSxPQUFPeU4sV0FBUCxDQUFxQm9HLFFBQVE3aEksTUFBN0IsQ0FDQTZoSSxRQUFRcmlJLElBQVIsQ0FBY3d1SCxNQUFkLEVBRUFnVCxlQUFlZ0IsWUFBZixDQUE2QnRCLFFBQTdCLEVBQTBDMVMsTUFBMUMsQ0FFQSxDQTFQb0YsQ0E0UHJGaVUsc0JBQXVCLFNBQVdqVSxNQUFYLENBQW9CLENBRTFDLFlBQWMsS0FBS3dULFFBQW5CLENBQ0NVLG1CQUFxQkwsUUFBU0EsUUFBUTdoSSxNQUFSLENBQWlCLENBQTFCLENBRHRCLENBRUNtaUksV0FBYW5VLE9BQU95TixXQUZyQixDQUlBeUcsbUJBQW1CekcsV0FBbkIsQ0FBaUMwRyxVQUFqQyxDQUNBTixRQUFTTSxVQUFULEVBQXdCRCxrQkFBeEIsQ0FDQUwsUUFBUTVoSSxHQUFSLEdBRUErdEgsT0FBT3lOLFdBQVAsQ0FBcUIsSUFBckIsQ0FHQSxhQUFlek4sT0FBT2dOLEtBQVAsQ0FBYXRnRyxJQUE1QixDQUNDcW5HLGNBQWdCLEtBQUtkLGNBRHRCLENBRUNELGVBQWlCZSxjQUFlaEIsUUFBZixDQUZsQixDQUdDcUIsb0JBQXNCcEIsZUFBZUUsWUFIdEMsQ0FLQ21CLGdCQUNDRCxvQkFBcUJBLG9CQUFvQnBpSSxNQUFwQixDQUE2QixDQUFsRCxDQU5GLENBUUNzaUksaUJBQW1CdFUsT0FBTzBOLGlCQVIzQixDQVVBMkcsZ0JBQWdCM0csaUJBQWhCLENBQW9DNEcsZ0JBQXBDLENBQ0FGLG9CQUFxQkUsZ0JBQXJCLEVBQTBDRCxlQUExQyxDQUNBRCxvQkFBb0JuaUksR0FBcEIsR0FFQSt0SCxPQUFPME4saUJBQVAsQ0FBMkIsSUFBM0IsQ0FHQSxpQkFBbUJzRixlQUFlZ0IsWUFBbEMsQ0FDQ3RCLFNBQVcsQ0FBRTFTLE9BQU9pTixVQUFQLEVBQXFCLEtBQUsyRCxLQUE1QixFQUFvQ2xrRyxJQURoRCxDQUdBLG9CQUFxQmdtRyxRQUFkLENBQVAsQ0FFQSxHQUFLMEIsb0JBQW9CcGlJLE1BQXBCLEdBQStCLENBQXBDLENBQXdDLENBRXZDLHFCQUFzQitnSSxRQUFmLENBQVAsQ0FFQSxDQUVELEtBQUt3QixnQ0FBTCxDQUF1Q3ZVLE1BQXZDLEVBRUEsQ0F2U29GLENBeVNyRnVVLGlDQUFrQyxTQUFXdlUsTUFBWCxDQUFvQixDQUVyRCxhQUFlQSxPQUFPd04saUJBQXRCLENBQ0EsSUFBTSxNQUFRLENBQVIsQ0FBVzU0RyxFQUFJb3pHLFNBQVNoMkgsTUFBOUIsQ0FBc0NLLElBQU11aUIsQ0FBNUMsQ0FBK0MsRUFBR3ZpQixDQUFsRCxDQUFzRCxDQUVyRCxZQUFjMjFILFNBQVUzMUgsQ0FBVixDQUFkLENBRUEsR0FBSyxFQUFHOHpILFFBQVFRLGNBQVgsR0FBOEIsQ0FBbkMsQ0FBdUMsQ0FFdEMsS0FBSzZOLHNCQUFMLENBQTZCck8sT0FBN0IsRUFFQSxDQUVELENBRUQsQ0F4VG9GLENBMFRyRmtOLFlBQWEsU0FBV3JULE1BQVgsQ0FBb0I7RUFHaEM7RUFDQTtFQUNBO0VBQ0E7RUFFQSxZQUFjLEtBQUt3VCxRQUFuQixDQUNDaUIsVUFBWXpVLE9BQU95TixXQURwQixDQUdDaUgsZ0JBQWtCLEtBQUtqQixlQUFMLEVBSG5CLENBS0NrQixvQkFBc0JkLFFBQVNhLGVBQVQsQ0FMdkIsQ0FPQTFVLE9BQU95TixXQUFQLENBQXFCaUgsZUFBckIsQ0FDQWIsUUFBU2EsZUFBVCxFQUE2QjFVLE1BQTdCLENBRUEyVSxvQkFBb0JsSCxXQUFwQixDQUFrQ2dILFNBQWxDLENBQ0FaLFFBQVNZLFNBQVQsRUFBdUJFLG1CQUF2QixDQUVBLENBL1VvRixDQWlWckZwQixnQkFBaUIsU0FBV3ZULE1BQVgsQ0FBb0I7RUFHcEM7RUFDQTtFQUNBO0VBQ0E7RUFFQSxZQUFjLEtBQUt3VCxRQUFuQixDQUNDaUIsVUFBWXpVLE9BQU95TixXQURwQixDQUdDbUgsbUJBQXFCLEVBQUcsS0FBS25CLGVBSDlCLENBS0NvQixpQkFBbUJoQixRQUFTZSxrQkFBVCxDQUxwQixDQU9BNVUsT0FBT3lOLFdBQVAsQ0FBcUJtSCxrQkFBckIsQ0FDQWYsUUFBU2Usa0JBQVQsRUFBZ0M1VSxNQUFoQyxDQUVBNlUsaUJBQWlCcEgsV0FBakIsQ0FBK0JnSCxTQUEvQixDQUNBWixRQUFTWSxTQUFULEVBQXVCSSxnQkFBdkIsQ0FFQSxDQXRXb0Y7RUEwV3JGL0Isb0JBQXFCLFNBQVczTSxPQUFYLENBQW9CdU0sUUFBcEIsQ0FBOEI5ZSxTQUE5QixDQUEwQyxDQUU5RCxtQkFBcUIsS0FBS2dmLHNCQUExQixDQUNDa0MsY0FBZ0JuQyxlQUFnQkQsUUFBaEIsQ0FEakIsQ0FHQzFLLFNBQVcsS0FBS04sU0FIakIsQ0FLQSxHQUFLb04sZ0JBQWtCbmtJLFNBQXZCLENBQW1DLENBRWxDbWtJLGNBQWdCLEVBQWhCLENBQ0FuQyxlQUFnQkQsUUFBaEIsRUFBNkJvQyxhQUE3QixDQUVBLENBRURBLGNBQWVsaEIsU0FBZixFQUE2QnVTLE9BQTdCLENBRUFBLFFBQVFzSCxXQUFSLENBQXNCekYsU0FBU2gySCxNQUEvQixDQUNBZzJILFNBQVN4MkgsSUFBVCxDQUFlMjBILE9BQWYsRUFFQSxDQTdYb0YsQ0ErWHJGcU8sdUJBQXdCLFNBQVdyTyxPQUFYLENBQXFCLENBRTVDLGFBQWUsS0FBS3VCLFNBQXBCLENBQ0NxTixZQUFjNU8sUUFBUUEsT0FEdkIsQ0FFQ3VNLFNBQVdxQyxZQUFZN00sUUFBWixDQUFxQng3RixJQUZqQyxDQUdDa25GLFVBQVltaEIsWUFBWXZpRSxJQUh6QixDQUlDbWdFLGVBQWlCLEtBQUtDLHNCQUp2QixDQUtDa0MsY0FBZ0JuQyxlQUFnQkQsUUFBaEIsQ0FMakIsQ0FPQ3NDLG9CQUFzQmhOLFNBQVVBLFNBQVNoMkgsTUFBVCxDQUFrQixDQUE1QixDQVB2QixDQVFDbWlJLFdBQWFoTyxRQUFRc0gsV0FSdEIsQ0FVQXVILG9CQUFvQnZILFdBQXBCLENBQWtDMEcsVUFBbEMsQ0FDQW5NLFNBQVVtTSxVQUFWLEVBQXlCYSxtQkFBekIsQ0FDQWhOLFNBQVMvMUgsR0FBVCxHQUVBLHFCQUFzQjJoSCxTQUFmLENBQVAsQ0FFQXFoQixpQkFBa0IsQ0FFakIsSUFBTSxLQUFOLGlCQUFBLENBQStCLHNCQUFBLENBQXdCO0VBRXZELHNCQUF1QnZDLFFBQWhCLENBQVAsQ0FFQSxDQUVELENBelpvRixDQTJackZVLGFBQWMsU0FBV2pOLE9BQVgsQ0FBcUIsQ0FFbEMsYUFBZSxLQUFLdUIsU0FBcEIsQ0FDQytNLFVBQVl0TyxRQUFRc0gsV0FEckIsQ0FHQ2lILGdCQUFrQixLQUFLaEIsZ0JBQUwsRUFIbkIsQ0FLQ3dCLHFCQUF1QmxOLFNBQVUwTSxlQUFWLENBTHhCLENBT0F2TyxRQUFRc0gsV0FBUixDQUFzQmlILGVBQXRCLENBQ0ExTSxTQUFVME0sZUFBVixFQUE4QnZPLE9BQTlCLENBRUErTyxxQkFBcUJ6SCxXQUFyQixDQUFtQ2dILFNBQW5DLENBQ0F6TSxTQUFVeU0sU0FBVixFQUF3QlMsb0JBQXhCLENBRUEsQ0ExYW9GLENBNGFyRjVCLGlCQUFrQixTQUFXbk4sT0FBWCxDQUFxQixDQUV0QyxhQUFlLEtBQUt1QixTQUFwQixDQUNDK00sVUFBWXRPLFFBQVFzSCxXQURyQixDQUdDbUgsbUJBQXFCLEVBQUcsS0FBS2xCLGdCQUg5QixDQUtDeUIsa0JBQW9Cbk4sU0FBVTRNLGtCQUFWLENBTHJCLENBT0F6TyxRQUFRc0gsV0FBUixDQUFzQm1ILGtCQUF0QixDQUNBNU0sU0FBVTRNLGtCQUFWLEVBQWlDek8sT0FBakMsQ0FFQWdQLGtCQUFrQjFILFdBQWxCLENBQWdDZ0gsU0FBaEMsQ0FDQXpNLFNBQVV5TSxTQUFWLEVBQXdCVSxpQkFBeEIsQ0FFQSxDQTNib0Y7RUFnY3JGNUUsd0JBQXlCLFVBQVksQ0FFcEMsaUJBQW1CLEtBQUtvRCxvQkFBeEIsQ0FDQ2UsZ0JBQWtCLEtBQUtkLDJCQUFMLEVBRG5CLENBRUN4RyxZQUFjRCxhQUFjdUgsZUFBZCxDQUZmLENBSUEsR0FBS3RILGNBQWdCejhILFNBQXJCLENBQWlDLENBRWhDeThILFlBQWMscUJBQUEsQ0FDYixnQkFBQSxDQUFrQixDQUFsQixDQURhLENBQ1UsZ0JBQUEsQ0FBa0IsQ0FBbEIsQ0FEVixDQUViLENBRmEsQ0FFVixLQUFLZ0ksZ0NBRkssQ0FBZCxDQUlBaEksWUFBWWlJLFlBQVosQ0FBMkJYLGVBQTNCLENBQ0F2SCxhQUFjdUgsZUFBZCxFQUFrQ3RILFdBQWxDLENBRUEsQ0FFRCxrQkFBQSxDQUVBLENBbmRvRixDQXFkckYyQyw0QkFBNkIsU0FBVzNDLFdBQVgsQ0FBeUIsQ0FFckQsaUJBQW1CLEtBQUt1RyxvQkFBeEIsQ0FDQ2MsVUFBWXJILFlBQVlpSSxZQUR6QixDQUdDVCxtQkFBcUIsRUFBRyxLQUFLaEIsMkJBSDlCLENBS0MwQixzQkFBd0JuSSxhQUFjeUgsa0JBQWQsQ0FMekIsQ0FPQXhILFlBQVlpSSxZQUFaLENBQTJCVCxrQkFBM0IsQ0FDQXpILGFBQWN5SCxrQkFBZCxFQUFxQ3hILFdBQXJDLENBRUFrSSxzQkFBc0JELFlBQXRCLENBQXFDWixTQUFyQyxDQUNBdEgsYUFBY3NILFNBQWQsRUFBNEJhLHFCQUE1QixDQUVBLENBcGVvRixDQXNlckZGLGlDQUFrQyxnQkFBQSxDQUFrQixDQUFsQixDQXRlbUQ7RUF5ZXJGO0VBQ0E7RUFDQUcsV0FBWSxTQUFXNWlCLElBQVgsQ0FBaUI2aUIsWUFBakIsQ0FBZ0MsQ0FFM0MsU0FBV0EsY0FBZ0IsS0FBSzVFLEtBQWhDLENBQ0M4QixTQUFXckssS0FBSzM3RixJQURqQixDQUdDK29HLFdBQWEsV0FBQSxHQUFnQixRQUFoQixDQUNabGpCLGNBQWNVLFVBQWQsQ0FBMEJvVixJQUExQixDQUFnQzFWLElBQWhDLENBRFksQ0FDNkJBLElBSjNDLENBTUNvZ0IsU0FBVzBDLGFBQWUsSUFBZixDQUFzQkEsV0FBVy9vRyxJQUFqQyxDQUF3Q2ltRixJQU5wRCxDQVFDcWdCLGVBQWlCLEtBQUtDLGNBQUwsQ0FBcUJGLFFBQXJCLENBUmxCLENBU0NOLGdCQUFrQixJQVRuQixDQVdBLEdBQUtPLGlCQUFtQnJpSSxTQUF4QixDQUFvQyxDQUVuQyxtQkFDRXFpSSxlQUFlZ0IsWUFBZixDQUE2QnRCLFFBQTdCLENBREYsQ0FHQSxHQUFLZ0QsaUJBQW1CL2tJLFNBQXhCLENBQW9DLENBRW5DLHFCQUFBLENBRUEsQ0FFRDtFQUNBO0VBQ0E4aEksZ0JBQWtCTyxlQUFlRSxZQUFmLENBQTZCLENBQTdCLENBQWxCLENBRUE7RUFDQSxHQUFLdUMsYUFBZSxJQUFwQixDQUNDQSxXQUFhaEQsZ0JBQWdCekYsS0FBN0IsQ0FFRCxDQUVEO0VBQ0EsR0FBS3lJLGFBQWUsSUFBcEIsQ0FBMkIsV0FBQSxDQUUzQjtFQUNBLGNBQWdCLG1CQUFBLENBQXFCLElBQXJCLENBQTJCQSxVQUEzQixDQUF1Q0QsWUFBdkMsQ0FBaEIsQ0FFQSxLQUFLaEQsV0FBTCxDQUFrQm1ELFNBQWxCLENBQTZCbEQsZUFBN0IsRUFFQTtFQUNBLEtBQUtVLGtCQUFMLENBQXlCd0MsU0FBekIsQ0FBb0M1QyxRQUFwQyxDQUE4Q0wsUUFBOUMsRUFFQSxnQkFBQSxDQUVBLENBMWhCb0Y7RUE2aEJyRmdELGVBQWdCLFNBQVcvaUIsSUFBWCxDQUFpQjZpQixZQUFqQixDQUFnQyxDQUUvQyxTQUFXQSxjQUFnQixLQUFLNUUsS0FBaEMsQ0FDQzhCLFNBQVdySyxLQUFLMzdGLElBRGpCLENBR0Mrb0csV0FBYSxXQUFBLEdBQWdCLFFBQWhCLENBQ1psakIsY0FBY1UsVUFBZCxDQUEwQm9WLElBQTFCLENBQWdDMVYsSUFBaEMsQ0FEWSxDQUM2QkEsSUFKM0MsQ0FNQ29nQixTQUFXMEMsV0FBYUEsV0FBVy9vRyxJQUF4QixDQUErQmltRixJQU4zQyxDQVFDcWdCLGVBQWlCLEtBQUtDLGNBQUwsQ0FBcUJGLFFBQXJCLENBUmxCLENBVUEsR0FBS0MsaUJBQW1CcmlJLFNBQXhCLENBQW9DLENBRW5DLHNCQUFzQnFqSSxZQUFmLENBQTZCdEIsUUFBN0IsR0FBMkMsSUFBbEQsQ0FFQSxDQUVELFdBQUEsQ0FFQSxDQWpqQm9GO0VBb2pCckZrRCxjQUFlLFVBQVksQ0FFMUIsWUFBYyxLQUFLcEMsUUFBbkIsQ0FDQ3FDLFNBQVcsS0FBS3BDLGVBRGpCLENBRUN6TCxTQUFXLEtBQUtOLFNBRmpCLENBR0NtRSxVQUFZLEtBQUs2SCxnQkFIbEIsQ0FLQSxLQUFLRCxlQUFMLENBQXVCLENBQXZCLENBQ0EsS0FBS0MsZ0JBQUwsQ0FBd0IsQ0FBeEIsQ0FFQSxJQUFNLE1BQVEsQ0FBZCxDQUFpQnJoSSxJQUFNd2pJLFFBQXZCLENBQWlDLEVBQUd4akksQ0FBcEMsQ0FBd0MsQ0FFdkN3aEksUUFBU3hoSSxDQUFULEVBQWFWLEtBQWIsR0FFQSxDQUVELElBQU0sTUFBUSxDQUFkLENBQWlCVSxJQUFNdzVILFNBQXZCLENBQWtDLEVBQUd4NUgsQ0FBckMsQ0FBeUMsQ0FFeEMyMUgsU0FBVTMxSCxDQUFWLEVBQWNxMEgsUUFBZCxDQUF5QixDQUF6QixDQUVBLENBRUQsV0FBQSxDQUVBLENBNWtCb0Y7RUEra0JyRjFnRyxPQUFRLFNBQVc4cUcsU0FBWCxDQUF1QixDQUU5QkEsV0FBYSxLQUFLM2YsU0FBbEIsQ0FFQSxZQUFjLEtBQUtxaUIsUUFBbkIsQ0FDQ3FDLFNBQVcsS0FBS3BDLGVBRGpCLENBR0N2d0MsS0FBTyxLQUFLQSxJQUFMLEVBQWE0dEMsU0FIckIsQ0FJQ0MsY0FBZ0I3OEgsS0FBSzhlLElBQUwsQ0FBVzg5RyxTQUFYLENBSmpCLENBTUNoSyxVQUFZLEtBQUt3TCxVQUFMLEVBQW1CLENBTmhDLENBUUE7RUFFQSxJQUFNLE1BQVEsQ0FBZCxDQUFpQmpnSSxJQUFNd2pJLFFBQXZCLENBQWlDLEVBQUd4akksQ0FBcEMsQ0FBd0MsQ0FFdkMsV0FBYXdoSSxRQUFTeGhJLENBQVQsQ0FBYixDQUVBMnRILE9BQU82USxPQUFQLENBQWdCM3RDLElBQWhCLENBQXNCNHRDLFNBQXRCLENBQWlDQyxhQUFqQyxDQUFnRGpLLFNBQWhELEVBRUEsQ0FFRDtFQUVBLGFBQWUsS0FBS1ksU0FBcEIsQ0FDQ21FLFVBQVksS0FBSzZILGdCQURsQixDQUdBLElBQU0sTUFBUSxDQUFkLENBQWlCcmhJLElBQU13NUgsU0FBdkIsQ0FBa0MsRUFBR3g1SCxDQUFyQyxDQUF5QyxDQUV4QzIxSCxTQUFVMzFILENBQVYsRUFBY29ELEtBQWQsQ0FBcUJxeEgsU0FBckIsRUFFQSxDQUVELFdBQUEsQ0FFQSxDQWxuQm9GO0VBcW5CckY2SixRQUFTLFVBQVksQ0FFcEIsWUFBWUMsS0FBWixDQUVBLENBem5Cb0Y7RUE0bkJyRmtGLFlBQWEsU0FBV25qQixJQUFYLENBQWtCLENBRTlCLFlBQWMsS0FBSzZnQixRQUFuQixDQUNDVCxTQUFXcGdCLEtBQUtqbUYsSUFEakIsQ0FFQ3FuRyxjQUFnQixLQUFLZCxjQUZ0QixDQUdDRCxlQUFpQmUsY0FBZWhCLFFBQWYsQ0FIbEIsQ0FLQSxHQUFLQyxpQkFBbUJyaUksU0FBeEIsQ0FBb0M7RUFHbkM7RUFDQTtFQUVBLG9CQUFzQnFpSSxlQUFlRSxZQUFyQyxDQUVBLElBQU0sTUFBUSxDQUFSLENBQVd0K0csRUFBSW1oSCxnQkFBZ0IvakksTUFBckMsQ0FBNkNLLElBQU11aUIsQ0FBbkQsQ0FBc0QsRUFBR3ZpQixDQUF6RCxDQUE2RCxDQUU1RCxXQUFhMGpJLGdCQUFpQjFqSSxDQUFqQixDQUFiLENBRUEsS0FBS284SCxpQkFBTCxDQUF3QnpPLE1BQXhCLEVBRUEsZUFBaUJBLE9BQU95TixXQUF4QixDQUNDeUcsbUJBQXFCTCxRQUFTQSxRQUFRN2hJLE1BQVIsQ0FBaUIsQ0FBMUIsQ0FEdEIsQ0FHQWd1SCxPQUFPeU4sV0FBUCxDQUFxQixJQUFyQixDQUNBek4sT0FBTzBOLGlCQUFQLENBQTJCLElBQTNCLENBRUF3RyxtQkFBbUJ6RyxXQUFuQixDQUFpQzBHLFVBQWpDLENBQ0FOLFFBQVNNLFVBQVQsRUFBd0JELGtCQUF4QixDQUNBTCxRQUFRNWhJLEdBQVIsR0FFQSxLQUFLc2lJLGdDQUFMLENBQXVDdlUsTUFBdkMsRUFFQSxDQUVELHFCQUFzQitTLFFBQWYsQ0FBUCxDQUVBLENBRUQsQ0FucUJvRjtFQXNxQnJGaUQsWUFBYSxTQUFXM04sSUFBWCxDQUFrQixDQUU5QixhQUFlQSxLQUFLMzdGLElBQXBCLENBQ0NxbkcsY0FBZ0IsS0FBS2QsY0FEdEIsQ0FHQSxJQUFNLFlBQU4saUJBQUEsQ0FBc0MsQ0FFckMsaUJBQW1CYyxjQUFlaEIsUUFBZixFQUEwQmlCLFlBQTdDLENBQ0NoVSxPQUFTZ1UsYUFBY3RCLFFBQWQsQ0FEVixDQUdBLEdBQUsxUyxTQUFXcnZILFNBQWhCLENBQTRCLENBRTNCLEtBQUs4OUgsaUJBQUwsQ0FBd0J6TyxNQUF4QixFQUNBLEtBQUtpVSxxQkFBTCxDQUE0QmpVLE1BQTVCLEVBRUEsQ0FFRCxDQUVELG1CQUFxQixLQUFLNFMsc0JBQTFCLENBQ0NrQyxjQUFnQm5DLGVBQWdCRCxRQUFoQixDQURqQixDQUdBLEdBQUtvQyxnQkFBa0Jua0ksU0FBdkIsQ0FBbUMsQ0FFbEMsSUFBTSxhQUFOLGlCQUFBLENBQXVDLENBRXRDLFlBQWNta0ksY0FBZWxoQixTQUFmLENBQWQsQ0FDQXVTLFFBQVFpQixvQkFBUixHQUNBLEtBQUtvTixzQkFBTCxDQUE2QnJPLE9BQTdCLEVBRUEsQ0FFRCxDQUVELENBeHNCb0Y7RUEyc0JyRjhQLGNBQWUsU0FBV3RqQixJQUFYLENBQWlCNmlCLFlBQWpCLENBQWdDLENBRTlDLFdBQWEsS0FBS0UsY0FBTCxDQUFxQi9pQixJQUFyQixDQUEyQjZpQixZQUEzQixDQUFiLENBRUEsR0FBS3hWLFNBQVcsSUFBaEIsQ0FBdUIsQ0FFdEIsS0FBS3lPLGlCQUFMLENBQXdCek8sTUFBeEIsRUFDQSxLQUFLaVUscUJBQUwsQ0FBNEJqVSxNQUE1QixFQUVBLENBRUQsQ0F0dEJvRixDQUEzRCxDQUEzQixDQTB0QkE7O0tBSUEsZ0JBQUEsQ0FBa0JoeEgsS0FBbEIsQ0FBMEIsQ0FFekIsR0FBSyxZQUFBLEdBQWlCLFFBQXRCLENBQWlDLENBRWhDc1ksUUFBUTZQLElBQVIsQ0FBYyxvREFBZCxFQUNBbm9CLE1BQVEwRyxVQUFXLENBQVgsQ0FBUixDQUVBLENBRUQsS0FBSzFHLEtBQUwsQ0FBYUEsS0FBYixDQUVBLENBRURrbkksUUFBUTNxSSxTQUFSLENBQWtCeXJCLEtBQWxCLENBQTBCLFVBQVksQ0FFckMsa0JBQU8sQ0FBYSxLQUFLaG9CLEtBQUwsQ0FBV2dvQixLQUFYLEdBQXFCcm1CLFNBQXJCLENBQWlDLEtBQUszQixLQUF0QyxDQUE4QyxLQUFLQSxLQUFMLENBQVdnb0IsS0FBWCxFQUEzRCxDQUFQLENBRUEsQ0FKRCxDQU1BOztLQUlBLGdDQUFBLEVBQW1DLENBRWxDc2lDLGVBQWVyc0QsSUFBZixDQUFxQixJQUFyQixFQUVBLEtBQUtELElBQUwsQ0FBWSx5QkFBWixDQUNBLEtBQUsrOEQsaUJBQUwsQ0FBeUJwNUQsU0FBekIsQ0FFQSxDQUVEd2xJLHdCQUF3QjVxSSxTQUF4QixDQUFvQ0QsT0FBTzRuQixNQUFQLENBQWU1bkIsT0FBT2lCLE1BQVAsQ0FBZStzRCxlQUFlL3RELFNBQTlCLENBQWYsQ0FBMEQsQ0FFN0ZzQyxZQUFhc29JLHVCQUZnRixDQUk3RnAwQywwQkFBMkIsSUFKa0UsQ0FNN0Y5cUUsS0FBTSxTQUFXNWYsTUFBWCxDQUFvQixDQUV6QmlpRCxlQUFlL3RELFNBQWYsQ0FBeUIwckIsSUFBekIsQ0FBOEJocUIsSUFBOUIsQ0FBb0MsSUFBcEMsQ0FBMENvSyxNQUExQyxFQUVBLEtBQUsweUQsaUJBQUwsQ0FBeUIxeUQsT0FBTzB5RCxpQkFBaEMsQ0FFQSxXQUFBLENBRUEsQ0FkNEYsQ0FnQjdGL3lDLE1BQU8sVUFBWSxDQUVsQixnQkFBZ0JucEIsV0FBVCxHQUF1Qm9wQixJQUF2QixDQUE2QixJQUE3QixDQUFQLENBRUEsQ0FwQjRGLENBQTFELENBQXBDLENBd0JBOztLQUlBLG1DQUFBLENBQXFDbS9HLGlCQUFyQyxDQUF3RHYvRSxRQUF4RCxDQUFrRWw5QixNQUFsRSxDQUEwRW05QixVQUExRSxDQUF1RixDQUV0RixLQUFLcDFDLElBQUwsQ0FBWTAwSCxpQkFBWixDQUNBLEtBQUt2L0UsUUFBTCxDQUFnQkEsUUFBaEIsQ0FDQSxLQUFLbDlCLE1BQUwsQ0FBY0EsTUFBZCxDQUVBLEtBQUttOUIsVUFBTCxDQUFrQkEsYUFBZSxJQUFqQyxDQUVBLENBRUR4ckQsT0FBT3NQLGdCQUFQLENBQXlCeTdILDJCQUEyQjlxSSxTQUFwRCxDQUErRCxDQUU5RHcxQixNQUFPLENBRU5ockIsSUFBSyxVQUFZLENBRWhCLFlBQVkyTCxJQUFMLENBQVVxZixLQUFqQixDQUVBLENBTkssQ0FGdUQsQ0FZOUQzTyxNQUFPLENBRU5yYyxJQUFLLFVBQVksQ0FFaEIsWUFBWTJMLElBQUwsQ0FBVTBRLEtBQWpCLENBRUEsQ0FOSyxDQVp1RCxDQUEvRCxFQXdCQTltQixPQUFPNG5CLE1BQVAsQ0FBZW1qSCwyQkFBMkI5cUksU0FBMUMsQ0FBcUQsQ0FFcERpK0MsNkJBQThCLElBRnNCLENBSXBENXlCLEtBQU0sU0FBVzNkLEtBQVgsQ0FBa0IyTCxDQUFsQixDQUFzQixDQUUzQixLQUFLbEQsSUFBTCxDQUFVMFEsS0FBVixDQUFpQm5aLE1BQVEsS0FBS3lJLElBQUwsQ0FBVXdnRixNQUFsQixDQUEyQixLQUFLdm9FLE1BQWpELEVBQTREL1UsQ0FBNUQsQ0FFQSxXQUFBLENBRUEsQ0FWbUQsQ0FZcERpUyxLQUFNLFNBQVc1ZCxLQUFYLENBQWtCbWMsQ0FBbEIsQ0FBc0IsQ0FFM0IsS0FBSzFULElBQUwsQ0FBVTBRLEtBQVYsQ0FBaUJuWixNQUFRLEtBQUt5SSxJQUFMLENBQVV3Z0YsTUFBbEIsQ0FBMkIsS0FBS3ZvRSxNQUFoQyxDQUF5QyxDQUExRCxFQUFnRXZFLENBQWhFLENBRUEsV0FBQSxDQUVBLENBbEJtRCxDQW9CcER1VCxLQUFNLFNBQVcxdkIsS0FBWCxDQUFrQmdqQixDQUFsQixDQUFzQixDQUUzQixLQUFLdmEsSUFBTCxDQUFVMFEsS0FBVixDQUFpQm5aLE1BQVEsS0FBS3lJLElBQUwsQ0FBVXdnRixNQUFsQixDQUEyQixLQUFLdm9FLE1BQWhDLENBQXlDLENBQTFELEVBQWdFc0MsQ0FBaEUsQ0FFQSxXQUFBLENBRUEsQ0ExQm1ELENBNEJwRGtULEtBQU0sU0FBV2wyQixLQUFYLENBQWtCMFIsQ0FBbEIsQ0FBc0IsQ0FFM0IsS0FBS2pKLElBQUwsQ0FBVTBRLEtBQVYsQ0FBaUJuWixNQUFRLEtBQUt5SSxJQUFMLENBQVV3Z0YsTUFBbEIsQ0FBMkIsS0FBS3ZvRSxNQUFoQyxDQUF5QyxDQUExRCxFQUFnRWhQLENBQWhFLENBRUEsV0FBQSxDQUVBLENBbENtRCxDQW9DcERvUCxLQUFNLFNBQVc5Z0IsS0FBWCxDQUFtQixDQUV4QixZQUFZeUksSUFBTCxDQUFVMFEsS0FBVixDQUFpQm5aLE1BQVEsS0FBS3lJLElBQUwsQ0FBVXdnRixNQUFsQixDQUEyQixLQUFLdm9FLE1BQWpELENBQVAsQ0FFQSxDQXhDbUQsQ0EwQ3BESyxLQUFNLFNBQVcvZ0IsS0FBWCxDQUFtQixDQUV4QixZQUFZeUksSUFBTCxDQUFVMFEsS0FBVixDQUFpQm5aLE1BQVEsS0FBS3lJLElBQUwsQ0FBVXdnRixNQUFsQixDQUEyQixLQUFLdm9FLE1BQWhDLENBQXlDLENBQTFELENBQVAsQ0FFQSxDQTlDbUQsQ0FnRHBEcUgsS0FBTSxTQUFXL25CLEtBQVgsQ0FBbUIsQ0FFeEIsWUFBWXlJLElBQUwsQ0FBVTBRLEtBQVYsQ0FBaUJuWixNQUFRLEtBQUt5SSxJQUFMLENBQVV3Z0YsTUFBbEIsQ0FBMkIsS0FBS3ZvRSxNQUFoQyxDQUF5QyxDQUExRCxDQUFQLENBRUEsQ0FwRG1ELENBc0RwRDZWLEtBQU0sU0FBV3YyQixLQUFYLENBQW1CLENBRXhCLFlBQVl5SSxJQUFMLENBQVUwUSxLQUFWLENBQWlCblosTUFBUSxLQUFLeUksSUFBTCxDQUFVd2dGLE1BQWxCLENBQTJCLEtBQUt2b0UsTUFBaEMsQ0FBeUMsQ0FBMUQsQ0FBUCxDQUVBLENBMURtRCxDQTREcERpK0IsTUFBTyxTQUFXMytDLEtBQVgsQ0FBa0IyTCxDQUFsQixDQUFxQndRLENBQXJCLENBQXlCLENBRS9CbmMsTUFBUUEsTUFBUSxLQUFLeUksSUFBTCxDQUFVd2dGLE1BQWxCLENBQTJCLEtBQUt2b0UsTUFBeEMsQ0FFQSxLQUFLalksSUFBTCxDQUFVMFEsS0FBVixDQUFpQm5aLE1BQVEsQ0FBekIsRUFBK0IyTCxDQUEvQixDQUNBLEtBQUtsRCxJQUFMLENBQVUwUSxLQUFWLENBQWlCblosTUFBUSxDQUF6QixFQUErQm1jLENBQS9CLENBRUEsV0FBQSxDQUVBLENBckVtRCxDQXVFcEQ4TCxPQUFRLFNBQVdqb0IsS0FBWCxDQUFrQjJMLENBQWxCLENBQXFCd1EsQ0FBckIsQ0FBd0I2RyxDQUF4QixDQUE0QixDQUVuQ2hqQixNQUFRQSxNQUFRLEtBQUt5SSxJQUFMLENBQVV3Z0YsTUFBbEIsQ0FBMkIsS0FBS3ZvRSxNQUF4QyxDQUVBLEtBQUtqWSxJQUFMLENBQVUwUSxLQUFWLENBQWlCblosTUFBUSxDQUF6QixFQUErQjJMLENBQS9CLENBQ0EsS0FBS2xELElBQUwsQ0FBVTBRLEtBQVYsQ0FBaUJuWixNQUFRLENBQXpCLEVBQStCbWMsQ0FBL0IsQ0FDQSxLQUFLMVQsSUFBTCxDQUFVMFEsS0FBVixDQUFpQm5aLE1BQVEsQ0FBekIsRUFBK0JnakIsQ0FBL0IsQ0FFQSxXQUFBLENBRUEsQ0FqRm1ELENBbUZwRDQ3QixRQUFTLFNBQVc1K0MsS0FBWCxDQUFrQjJMLENBQWxCLENBQXFCd1EsQ0FBckIsQ0FBd0I2RyxDQUF4QixDQUEyQnRSLENBQTNCLENBQStCLENBRXZDMVIsTUFBUUEsTUFBUSxLQUFLeUksSUFBTCxDQUFVd2dGLE1BQWxCLENBQTJCLEtBQUt2b0UsTUFBeEMsQ0FFQSxLQUFLalksSUFBTCxDQUFVMFEsS0FBVixDQUFpQm5aLE1BQVEsQ0FBekIsRUFBK0IyTCxDQUEvQixDQUNBLEtBQUtsRCxJQUFMLENBQVUwUSxLQUFWLENBQWlCblosTUFBUSxDQUF6QixFQUErQm1jLENBQS9CLENBQ0EsS0FBSzFULElBQUwsQ0FBVTBRLEtBQVYsQ0FBaUJuWixNQUFRLENBQXpCLEVBQStCZ2pCLENBQS9CLENBQ0EsS0FBS3ZhLElBQUwsQ0FBVTBRLEtBQVYsQ0FBaUJuWixNQUFRLENBQXpCLEVBQStCMFIsQ0FBL0IsQ0FFQSxXQUFBLENBRUEsQ0E5Rm1ELENBQXJELEVBa0dBOztLQUlBLDBCQUFBLENBQTRCeUgsS0FBNUIsQ0FBbUM4dkUsTUFBbkMsQ0FBNEMsQ0FFM0MsS0FBSzl2RSxLQUFMLENBQWFBLEtBQWIsQ0FDQSxLQUFLOHZFLE1BQUwsQ0FBY0EsTUFBZCxDQUNBLEtBQUtuaEUsS0FBTCxDQUFhM08sUUFBVXpoQixTQUFWLENBQXNCeWhCLE1BQU1wZ0IsTUFBTixDQUFla3dGLE1BQXJDLENBQThDLENBQTNELENBRUEsS0FBSy81QyxPQUFMLENBQWUsS0FBZixDQUNBLEtBQUtrQixXQUFMLENBQW1CLENBQUUxdkIsT0FBUSxDQUFWLENBQWFvSCxNQUFPLENBQUUsQ0FBdEIsQ0FBbkIsQ0FFQSxLQUFLNXJCLE9BQUwsQ0FBZSxDQUFmLENBRUEsQ0FFRDdKLE9BQU93SyxjQUFQLENBQXVCd2dJLGtCQUFrQi9xSSxTQUF6QyxDQUFvRCxhQUFwRCxDQUFtRSxDQUVsRW9YLElBQUssU0FBVzNULEtBQVgsQ0FBbUIsQ0FFdkIsR0FBS0EsUUFBVSxJQUFmLENBQXNCLEtBQUttRyxPQUFMLEdBRXRCLENBTmlFLENBQW5FLEVBVUE3SixPQUFPNG5CLE1BQVAsQ0FBZW9qSCxrQkFBa0IvcUksU0FBakMsQ0FBNEMsQ0FFM0Nnckksb0JBQXFCLElBRnNCLENBSTNDNXRGLGlCQUFrQixVQUFZLEVBSmEsQ0FNM0NzTyxTQUFVLFNBQVc3a0MsS0FBWCxDQUFtQixDQUU1QixHQUFLalQsTUFBTXlNLE9BQU4sQ0FBZXdHLEtBQWYsQ0FBTCxDQUE4QixDQUU3QixtQkFBTSxDQUFlLHVEQUFmLENBQU4sQ0FFQSxDQUVELEtBQUsyTyxLQUFMLENBQWEzTyxRQUFVemhCLFNBQVYsQ0FBc0J5aEIsTUFBTXBnQixNQUFOLENBQWUsS0FBS2t3RixNQUExQyxDQUFtRCxDQUFoRSxDQUNBLEtBQUs5dkUsS0FBTCxDQUFhQSxLQUFiLENBRUEsV0FBQSxDQUVBLENBbkIwQyxDQXFCM0M4a0MsV0FBWSxTQUFXbG9ELEtBQVgsQ0FBbUIsQ0FFOUIsS0FBS201QyxPQUFMLENBQWVuNUMsS0FBZixDQUVBLFdBQUEsQ0FFQSxDQTNCMEMsQ0E2QjNDaW9CLEtBQU0sU0FBVzVmLE1BQVgsQ0FBb0IsQ0FFekIsS0FBSythLEtBQUwsQ0FBYSxXQUFXQSxLQUFQLENBQWF2a0IsV0FBakIsQ0FBOEJ3SixPQUFPK2EsS0FBckMsQ0FBYixDQUNBLEtBQUsyTyxLQUFMLENBQWExcEIsT0FBTzBwQixLQUFwQixDQUNBLEtBQUttaEUsTUFBTCxDQUFjN3FGLE9BQU82cUYsTUFBckIsQ0FDQSxLQUFLLzVDLE9BQUwsQ0FBZTl3QyxPQUFPOHdDLE9BQXRCLENBRUEsV0FBQSxDQUVBLENBdEMwQyxDQXdDM0NnUCxPQUFRLFNBQVdDLE1BQVgsQ0FBbUJ0OUIsU0FBbkIsQ0FBOEJ1OUIsTUFBOUIsQ0FBdUMsQ0FFOUNELFFBQVUsS0FBSzhxQyxNQUFmLENBQ0E3cUMsUUFBVXY5QixVQUFVb29FLE1BQXBCLENBRUEsSUFBTSxNQUFRLENBQVIsQ0FBV3B0RixFQUFJLEtBQUtvdEYsTUFBMUIsQ0FBa0M3dkYsRUFBSXlDLENBQXRDLENBQXlDekMsR0FBekMsQ0FBZ0QsQ0FFL0MsS0FBSytmLEtBQUwsQ0FBWWdsQyxPQUFTL2tELENBQXJCLEVBQTJCeW5CLFVBQVUxSCxLQUFWLENBQWlCaWxDLE9BQVNobEQsQ0FBMUIsQ0FBM0IsQ0FFQSxDQUVELFdBQUEsQ0FFQSxDQXJEMEMsQ0F1RDNDc1EsSUFBSyxTQUFXM1QsS0FBWCxDQUFrQjJxQixNQUFsQixDQUEyQixDQUUvQixHQUFLQSxTQUFXaHBCLFNBQWhCLENBQTRCZ3BCLE9BQVMsQ0FBVCxDQUU1QixLQUFLdkgsS0FBTCxDQUFXelAsR0FBWCxDQUFnQjNULEtBQWhCLENBQXVCMnFCLE1BQXZCLEVBRUEsV0FBQSxDQUVBLENBL0QwQyxDQWlFM0MzQyxNQUFPLFVBQVksQ0FFbEIsZ0JBQWdCbnBCLFdBQVQsR0FBdUJvcEIsSUFBdkIsQ0FBNkIsSUFBN0IsQ0FBUCxDQUVBLENBckUwQyxDQXVFM0M2Z0MsU0FBVSxTQUFXdHZCLFFBQVgsQ0FBc0IsQ0FFL0IsS0FBS21nQixnQkFBTCxDQUF3Qm5nQixRQUF4QixDQUVBLFdBQUEsQ0FFQSxDQTdFMEMsQ0FBNUMsRUFpRkE7O0tBSUEsbUNBQUEsQ0FBcUNwVyxLQUFyQyxDQUE0Qzh2RSxNQUE1QyxDQUFvRHpaLGdCQUFwRCxDQUF1RSxDQUV0RTZ0RCxrQkFBa0JycEksSUFBbEIsQ0FBd0IsSUFBeEIsQ0FBOEJtbEIsS0FBOUIsQ0FBcUM4dkUsTUFBckMsRUFFQSxLQUFLelosZ0JBQUwsQ0FBd0JBLGtCQUFvQixDQUE1QyxDQUVBLENBRUQrdEQsMkJBQTJCanJJLFNBQTNCLENBQXVDRCxPQUFPNG5CLE1BQVAsQ0FBZTVuQixPQUFPaUIsTUFBUCxDQUFlK3BJLGtCQUFrQi9xSSxTQUFqQyxDQUFmLENBQTZELENBRW5Hc0MsWUFBYTJvSSwwQkFGc0YsQ0FJbkdyMEMsNkJBQThCLElBSnFFLENBTW5HbHJFLEtBQU0sU0FBVzVmLE1BQVgsQ0FBb0IsQ0FFekJpL0gsa0JBQWtCL3FJLFNBQWxCLENBQTRCMHJCLElBQTVCLENBQWlDaHFCLElBQWpDLENBQXVDLElBQXZDLENBQTZDb0ssTUFBN0MsRUFFQSxLQUFLb3hFLGdCQUFMLENBQXdCcHhFLE9BQU9veEUsZ0JBQS9CLENBRUEsV0FBQSxDQUVBLENBZGtHLENBQTdELENBQXZDLENBa0JBOztLQUlBLGlDQUFBLENBQW1DcjJELEtBQW5DLENBQTBDeWtDLFFBQTFDLENBQW9ENHhCLGdCQUFwRCxDQUF1RSxDQUV0RTF4QixnQkFBZ0I5cEQsSUFBaEIsQ0FBc0IsSUFBdEIsQ0FBNEJtbEIsS0FBNUIsQ0FBbUN5a0MsUUFBbkMsRUFFQSxLQUFLNHhCLGdCQUFMLENBQXdCQSxrQkFBb0IsQ0FBNUMsQ0FFQSxDQUVEZ3VELHlCQUF5QmxySSxTQUF6QixDQUFxQ0QsT0FBTzRuQixNQUFQLENBQWU1bkIsT0FBT2lCLE1BQVAsQ0FBZXdxRCxnQkFBZ0J4ckQsU0FBL0IsQ0FBZixDQUEyRCxDQUUvRnNDLFlBQWE0b0ksd0JBRmtGLENBSS9GcjBDLDJCQUE0QixJQUptRSxDQU0vRm5yRSxLQUFNLFNBQVc1ZixNQUFYLENBQW9CLENBRXpCMC9DLGdCQUFnQnhyRCxTQUFoQixDQUEwQjByQixJQUExQixDQUErQmhxQixJQUEvQixDQUFxQyxJQUFyQyxDQUEyQ29LLE1BQTNDLEVBRUEsS0FBS294RSxnQkFBTCxDQUF3QnB4RSxPQUFPb3hFLGdCQUEvQixDQUVBLFdBQUEsQ0FFQSxDQWQ4RixDQUEzRCxDQUFyQyxDQWtCQTs7OztLQU1BLGtCQUFBLENBQW9CdG5CLE1BQXBCLENBQTRCeHJCLFNBQTVCLENBQXVDelIsSUFBdkMsQ0FBNkNDLEdBQTdDLENBQW1ELENBRWxELEtBQUtrOUIsR0FBTCxDQUFXLE9BQUEsQ0FBU0YsTUFBVCxDQUFpQnhyQixTQUFqQixDQUFYLENBQ0E7RUFFQSxLQUFLelIsSUFBTCxDQUFZQSxNQUFRLENBQXBCLENBQ0EsS0FBS0MsR0FBTCxDQUFXQSxLQUFPd00sUUFBbEIsQ0FFQSxLQUFLeTZELE1BQUwsQ0FBYyxDQUNiamxDLEtBQU0sRUFETyxDQUVibWtDLEtBQU0sRUFGTyxDQUdiNUIsSUFBSyxFQUhRLENBSWJ5QyxPQUFRLENBQUVFLFVBQVcsQ0FBYixDQUpLLENBS2JqRCxPQUFRLEVBTEssQ0FBZCxDQVFBOThGLE9BQU9zUCxnQkFBUCxDQUF5QixLQUFLd3dGLE1BQTlCLENBQXNDLENBQ3JDc3JDLFdBQVksQ0FDWDNnSSxJQUFLLFVBQVksQ0FFaEJ1UixRQUFRNlAsSUFBUixDQUFjLHVFQUFkLEVBQ0EsWUFBWWcwRSxNQUFaLENBRUEsQ0FOVSxDQUR5QixDQUF0QyxFQVdBLENBRUQsZ0JBQUEsQ0FBa0JwMkYsQ0FBbEIsQ0FBcUJGLENBQXJCLENBQXlCLENBRXhCLFNBQVNzakMsUUFBRixDQUFhdGpDLEVBQUVzakMsUUFBdEIsQ0FFQSxDQUVELHdCQUFBLENBQTBCdG1DLE1BQTFCLENBQWtDODBELFNBQWxDLENBQTZDWSxVQUE3QyxDQUF5RDdZLFNBQXpELENBQXFFLENBRXBFLEdBQUs3OEMsT0FBTzA1QyxPQUFQLEdBQW1CLEtBQXhCLENBQWdDLE9BRWhDMTVDLE9BQU82N0MsT0FBUCxDQUFnQmlaLFNBQWhCLENBQTJCWSxVQUEzQixFQUVBLEdBQUs3WSxZQUFjLElBQW5CLENBQTBCLENBRXpCLGFBQWU3OEMsT0FBT2s1QyxRQUF0QixDQUVBLElBQU0sTUFBUSxDQUFSLENBQVdqMkMsRUFBSWkyQyxTQUFTLzRDLE1BQTlCLENBQXNDSyxFQUFJeUMsQ0FBMUMsQ0FBNkN6QyxHQUE3QyxDQUFvRCxDQUVuRHNrSSxnQkFBaUI1ckYsU0FBVTE0QyxDQUFWLENBQWpCLENBQWdDczBELFNBQWhDLENBQTJDWSxVQUEzQyxDQUF1RCxJQUF2RCxFQUVBLENBRUQsQ0FFRCxDQUVEajhELE9BQU80bkIsTUFBUCxDQUFlMGpILFVBQVVyckksU0FBekIsQ0FBb0MsQ0FFbkNrL0YsY0FBZSxDQUZvQixDQUluQzluRixJQUFLLFNBQVd3K0MsTUFBWCxDQUFtQnhyQixTQUFuQixDQUErQjtFQUluQyxLQUFLMHJCLEdBQUwsQ0FBUzErQyxHQUFULENBQWN3K0MsTUFBZCxDQUFzQnhyQixTQUF0QixFQUVBLENBVmtDLENBWW5Da2hHLGNBQWUsU0FBV0MsTUFBWCxDQUFtQnJ0RyxNQUFuQixDQUE0QixDQUUxQyxHQUFPQSxRQUFVQSxPQUFPa3VELG1CQUF4QixDQUFnRCxDQUUvQyxLQUFLdDJCLEdBQUwsQ0FBU0YsTUFBVCxDQUFnQmoyQixxQkFBaEIsQ0FBdUN6QixPQUFPRSxXQUE5QyxFQUNBLEtBQUswM0IsR0FBTCxDQUFTMXJCLFNBQVQsQ0FBbUJoekIsR0FBbkIsQ0FBd0JtMEgsT0FBT2x5SCxDQUEvQixDQUFrQ2t5SCxPQUFPMWhILENBQXpDLENBQTRDLEdBQTVDLEVBQWtEd1UsU0FBbEQsQ0FBNkRILE1BQTdELEVBQXNFbFMsR0FBdEUsQ0FBMkUsS0FBSzhwQyxHQUFMLENBQVNGLE1BQXBGLEVBQTZGdm9DLFNBQTdGLEdBRUEsQ0FMRCxRQUtjNlEsUUFBVUEsT0FBT3lsQixvQkFBeEIsQ0FBaUQsQ0FFdkQsS0FBS21TLEdBQUwsQ0FBU0YsTUFBVCxDQUFnQngrQyxHQUFoQixDQUFxQm0wSCxPQUFPbHlILENBQTVCLENBQStCa3lILE9BQU8xaEgsQ0FBdEMsQ0FBeUMsQ0FBRXFVLE9BQU92RixJQUFQLENBQWN1RixPQUFPdEYsR0FBdkIsR0FBaUNzRixPQUFPdkYsSUFBUCxDQUFjdUYsT0FBT3RGLEdBQXRELENBQXpDLEVBQXVHeUYsU0FBdkcsQ0FBa0hILE1BQWxILEVBQTRIO0VBQzVILEtBQUs0M0IsR0FBTCxDQUFTMXJCLFNBQVQsQ0FBbUJoekIsR0FBbkIsQ0FBd0IsQ0FBeEIsQ0FBMkIsQ0FBM0IsQ0FBOEIsQ0FBRSxDQUFoQyxFQUFvQ2tuQixrQkFBcEMsQ0FBd0RKLE9BQU9FLFdBQS9ELEVBRUEsQ0FMTSxJQUtBLENBRU5yaUIsUUFBUU0sS0FBUixDQUFlLDJDQUFmLEVBRUEsQ0FFRCxDQTlCa0MsQ0FnQ25DK3VILGdCQUFpQixTQUFXOWtJLE1BQVgsQ0FBbUI2OEMsU0FBbkIsQ0FBOEJvMEQsY0FBOUIsQ0FBK0MsQ0FFL0QsZUFBaUJBLGdCQUFrQixFQUFuQyxDQUVBNnpCLGdCQUFpQjlrSSxNQUFqQixDQUF5QixJQUF6QixDQUErQjAxRCxVQUEvQixDQUEyQzdZLFNBQTNDLEVBRUE2WSxXQUFXcFMsSUFBWCxDQUFpQjRoRixPQUFqQixFQUVBLGlCQUFBLENBRUEsQ0ExQ2tDLENBNENuQ0MsaUJBQWtCLFNBQVdoNUMsT0FBWCxDQUFvQnR2QyxTQUFwQixDQUErQm8wRCxjQUEvQixDQUFnRCxDQUVqRSxlQUFpQkEsZ0JBQWtCLEVBQW5DLENBRUEsR0FBSzNqRyxNQUFNeU0sT0FBTixDQUFlb3lFLE9BQWYsSUFBNkIsS0FBbEMsQ0FBMEMsQ0FFekMxMkUsUUFBUTZQLElBQVIsQ0FBYyw0REFBZCxFQUNBLGlCQUFBLENBRUEsQ0FFRCxJQUFNLE1BQVEsQ0FBUixDQUFXcmlCLEVBQUlrcEYsUUFBUWhzRixNQUE3QixDQUFxQ0ssRUFBSXlDLENBQXpDLENBQTRDekMsR0FBNUMsQ0FBbUQsQ0FFbERza0ksZ0JBQWlCMzRDLFFBQVMzckYsQ0FBVCxDQUFqQixDQUErQixJQUEvQixDQUFxQ2sxRCxVQUFyQyxDQUFpRDdZLFNBQWpELEVBRUEsQ0FFRDZZLFdBQVdwUyxJQUFYLENBQWlCNGhGLE9BQWpCLEVBRUEsaUJBQUEsQ0FFQSxDQWpFa0MsQ0FBcEMsRUFxRUE7O0tBSUEsY0FBQSxDQUFnQkUsU0FBaEIsQ0FBNEIsQ0FFM0IsS0FBS0EsU0FBTCxDQUFtQkEsWUFBY3RtSSxTQUFoQixDQUE4QnNtSSxTQUE5QixDQUEwQyxJQUEzRCxDQUVBLEtBQUs3bEIsU0FBTCxDQUFpQixDQUFqQixDQUNBLEtBQUs4bEIsT0FBTCxDQUFlLENBQWYsQ0FDQSxLQUFLQyxXQUFMLENBQW1CLENBQW5CLENBRUEsS0FBS0MsT0FBTCxDQUFlLEtBQWYsQ0FFQSxDQUVEOXJJLE9BQU80bkIsTUFBUCxDQUFlbWtILE1BQU05ckksU0FBckIsQ0FBZ0MsQ0FFL0JzcUMsTUFBTyxVQUFZLENBRWxCLEtBQUt1N0UsU0FBTCxDQUFpQixDQUFFLGtCQUFBLEdBQXVCLFdBQXZCLENBQXFDa21CLElBQXJDLENBQTRDQyxXQUE5QyxFQUE0RHYxSCxHQUE1RCxFQUFqQixDQUFvRjtFQUVwRixLQUFLazFILE9BQUwsQ0FBZSxLQUFLOWxCLFNBQXBCLENBQ0EsS0FBSytsQixXQUFMLENBQW1CLENBQW5CLENBQ0EsS0FBS0MsT0FBTCxDQUFlLElBQWYsQ0FFQSxDQVY4QixDQVkvQnZrSSxLQUFNLFVBQVksQ0FFakIsS0FBSzJrSSxjQUFMLEdBQ0EsS0FBS0osT0FBTCxDQUFlLEtBQWYsQ0FDQSxLQUFLSCxTQUFMLENBQWlCLEtBQWpCLENBRUEsQ0FsQjhCLENBb0IvQk8sZUFBZ0IsVUFBWSxDQUUzQixLQUFLQyxRQUFMLEdBQ0EsWUFBWU4sV0FBWixDQUVBLENBekI4QixDQTJCL0JNLFNBQVUsVUFBWSxDQUVyQixTQUFXLENBQVgsQ0FFQSxHQUFLLEtBQUtSLFNBQUwsRUFBa0IsQ0FBRSxLQUFLRyxPQUE5QixDQUF3QyxDQUV2QyxLQUFLdmhHLEtBQUwsR0FDQSxRQUFBLENBRUEsQ0FFRCxHQUFLLEtBQUt1aEcsT0FBVixDQUFvQixDQUVuQixZQUFjLENBQUUsa0JBQUEsR0FBdUIsV0FBdkIsQ0FBcUNFLElBQXJDLENBQTRDQyxXQUE5QyxFQUE0RHYxSCxHQUE1RCxFQUFkLENBRUFnZ0QsS0FBTyxDQUFFMDFFLFFBQVUsS0FBS1IsT0FBakIsRUFBNkIsSUFBcEMsQ0FDQSxLQUFLQSxPQUFMLENBQWVRLE9BQWYsQ0FFQSxLQUFLUCxXQUFMLEVBQW9CbjFFLElBQXBCLENBRUEsQ0FFRCxXQUFBLENBRUEsQ0FuRDhCLENBQWhDLEVBdURBOzs7Ozs7OztLQVVBLGtCQUFBLENBQW9CajNCLE1BQXBCLENBQTRCRCxHQUE1QixDQUFpQ3ZJLEtBQWpDLENBQXlDLENBRXhDLEtBQUt3SSxNQUFMLENBQWdCQSxTQUFXcDZCLFNBQWIsQ0FBMkJvNkIsTUFBM0IsQ0FBb0MsR0FBbEQsQ0FDQSxLQUFLRCxHQUFMLENBQWFBLE1BQVFuNkIsU0FBVixDQUF3Qm02QixHQUF4QixDQUE4QixDQUF6QyxDQUE0QztFQUM1QyxLQUFLdkksS0FBTCxDQUFlQSxRQUFVNXhCLFNBQVosQ0FBMEI0eEIsS0FBMUIsQ0FBa0MsQ0FBL0MsQ0FBa0Q7RUFFbEQsV0FBQSxDQUVBLENBRURqM0IsT0FBTzRuQixNQUFQLENBQWV5a0gsVUFBVXBzSSxTQUF6QixDQUFvQyxDQUVuQ29YLElBQUssU0FBV29vQixNQUFYLENBQW1CRCxHQUFuQixDQUF3QnZJLEtBQXhCLENBQWdDLENBRXBDLEtBQUt3SSxNQUFMLENBQWNBLE1BQWQsQ0FDQSxLQUFLRCxHQUFMLENBQVdBLEdBQVgsQ0FDQSxLQUFLdkksS0FBTCxDQUFhQSxLQUFiLENBRUEsV0FBQSxDQUVBLENBVmtDLENBWW5DdkwsTUFBTyxVQUFZLENBRWxCLGdCQUFnQm5wQixXQUFULEdBQXVCb3BCLElBQXZCLENBQTZCLElBQTdCLENBQVAsQ0FFQSxDQWhCa0MsQ0FrQm5DQSxLQUFNLFNBQVcyZ0gsS0FBWCxDQUFtQixDQUV4QixLQUFLN3NHLE1BQUwsQ0FBYzZzRyxNQUFNN3NHLE1BQXBCLENBQ0EsS0FBS0QsR0FBTCxDQUFXOHNHLE1BQU05c0csR0FBakIsQ0FDQSxLQUFLdkksS0FBTCxDQUFhcTFHLE1BQU1yMUcsS0FBbkIsQ0FFQSxXQUFBLENBRUEsQ0ExQmtDO0VBNkJuQ3MxRyxTQUFVLFVBQVksQ0FFckIsUUFBVSxRQUFWLENBQ0EsS0FBSy9zRyxHQUFMLENBQVc1MkIsS0FBSzhFLEdBQUwsQ0FBVXN1QixHQUFWLENBQWVwekIsS0FBSzZFLEdBQUwsQ0FBVTdFLEtBQUsrZixFQUFMLENBQVVxVCxHQUFwQixDQUF5QixLQUFLd0QsR0FBOUIsQ0FBZixDQUFYLENBRUEsV0FBQSxDQUVBLENBcENrQyxDQXNDbkNzZixlQUFnQixTQUFXMHRGLElBQVgsQ0FBa0IsQ0FFakMsS0FBSy9zRyxNQUFMLENBQWMrc0csS0FBSzlsSSxNQUFMLEVBQWQsQ0FFQSxHQUFLLEtBQUsrNEIsTUFBTCxHQUFnQixDQUFyQixDQUF5QixDQUV4QixLQUFLeEksS0FBTCxDQUFhLENBQWIsQ0FDQSxLQUFLdUksR0FBTCxDQUFXLENBQVgsQ0FFQSxDQUxELElBS08sQ0FFTixLQUFLdkksS0FBTCxDQUFhcnVCLEtBQUs0a0IsS0FBTCxDQUFZZy9HLEtBQUtsekgsQ0FBakIsQ0FBb0JrekgsS0FBSzc3RyxDQUF6QixDQUFiLENBQTJDO0VBQzNDLEtBQUs2TyxHQUFMLENBQVc1MkIsS0FBS3kyQixJQUFMLENBQVczVSxNQUFNdEIsS0FBTixDQUFhb2pILEtBQUsxaUgsQ0FBTCxDQUFTLEtBQUsyVixNQUEzQixDQUFtQyxDQUFFLENBQXJDLENBQXdDLENBQXhDLENBQVgsQ0FBWCxDQUFxRTtFQUVyRSxDQUVELFdBQUEsQ0FFQSxDQXhEa0MsQ0FBcEMsRUE0REE7Ozs7O0tBT0Esb0JBQUEsQ0FBc0JBLE1BQXRCLENBQThCeEksS0FBOUIsQ0FBcUNuTixDQUFyQyxDQUF5QyxDQUV4QyxLQUFLMlYsTUFBTCxDQUFnQkEsU0FBV3A2QixTQUFiLENBQTJCbzZCLE1BQTNCLENBQW9DLEdBQWxELENBQXVEO0VBQ3ZELEtBQUt4SSxLQUFMLENBQWVBLFFBQVU1eEIsU0FBWixDQUEwQjR4QixLQUExQixDQUFrQyxDQUEvQyxDQUFrRDtFQUNsRCxLQUFLbk4sQ0FBTCxDQUFXQSxJQUFNemtCLFNBQVIsQ0FBc0J5a0IsQ0FBdEIsQ0FBMEIsQ0FBbkMsQ0FBc0M7RUFFdEMsV0FBQSxDQUVBLENBRUQ5cEIsT0FBTzRuQixNQUFQLENBQWU2a0gsWUFBWXhzSSxTQUEzQixDQUFzQyxDQUVyQ29YLElBQUssU0FBV29vQixNQUFYLENBQW1CeEksS0FBbkIsQ0FBMEJuTixDQUExQixDQUE4QixDQUVsQyxLQUFLMlYsTUFBTCxDQUFjQSxNQUFkLENBQ0EsS0FBS3hJLEtBQUwsQ0FBYUEsS0FBYixDQUNBLEtBQUtuTixDQUFMLENBQVNBLENBQVQsQ0FFQSxXQUFBLENBRUEsQ0FWb0MsQ0FZckM0QixNQUFPLFVBQVksQ0FFbEIsZ0JBQWdCbnBCLFdBQVQsR0FBdUJvcEIsSUFBdkIsQ0FBNkIsSUFBN0IsQ0FBUCxDQUVBLENBaEJvQyxDQWtCckNBLEtBQU0sU0FBVzJnSCxLQUFYLENBQW1CLENBRXhCLEtBQUs3c0csTUFBTCxDQUFjNnNHLE1BQU03c0csTUFBcEIsQ0FDQSxLQUFLeEksS0FBTCxDQUFhcTFHLE1BQU1yMUcsS0FBbkIsQ0FDQSxLQUFLbk4sQ0FBTCxDQUFTd2lILE1BQU14aUgsQ0FBZixDQUVBLFdBQUEsQ0FFQSxDQTFCb0MsQ0E0QnJDZzFCLGVBQWdCLFNBQVcwdEYsSUFBWCxDQUFrQixDQUVqQyxLQUFLL3NHLE1BQUwsQ0FBYzcyQixLQUFLdWtCLElBQUwsQ0FBV3EvRyxLQUFLbHpILENBQUwsQ0FBU2t6SCxLQUFLbHpILENBQWQsQ0FBa0JrekgsS0FBSzc3RyxDQUFMLENBQVM2N0csS0FBSzc3RyxDQUEzQyxDQUFkLENBQ0EsS0FBS3NHLEtBQUwsQ0FBYXJ1QixLQUFLNGtCLEtBQUwsQ0FBWWcvRyxLQUFLbHpILENBQWpCLENBQW9Ca3pILEtBQUs3N0csQ0FBekIsQ0FBYixDQUNBLEtBQUs3RyxDQUFMLENBQVMwaUgsS0FBSzFpSCxDQUFkLENBRUEsV0FBQSxDQUVBLENBcENvQyxDQUF0QyxFQXdDQTs7S0FJQSxhQUFBLENBQWVyYyxHQUFmLENBQW9CQyxHQUFwQixDQUEwQixDQUV6QixLQUFLRCxHQUFMLENBQWFBLE1BQVFwSSxTQUFWLENBQXdCb0ksR0FBeEIsQ0FBOEIsV0FBQSxDQUFhLENBQUU0M0IsUUFBZixDQUF5QixDQUFFQSxRQUEzQixDQUF6QyxDQUNBLEtBQUszM0IsR0FBTCxDQUFhQSxNQUFRckksU0FBVixDQUF3QnFJLEdBQXhCLENBQThCLFdBQUEsQ0FBYSxDQUFFMjNCLFFBQWYsQ0FBeUIsQ0FBRUEsUUFBM0IsQ0FBekMsQ0FFQSxDQUVEcmxDLE9BQU80bkIsTUFBUCxDQUFlOGtILEtBQUt6c0ksU0FBcEIsQ0FBK0IsQ0FFOUJvWCxJQUFLLFNBQVc1SixHQUFYLENBQWdCQyxHQUFoQixDQUFzQixDQUUxQixLQUFLRCxHQUFMLENBQVNrZSxJQUFULENBQWVsZSxHQUFmLEVBQ0EsS0FBS0MsR0FBTCxDQUFTaWUsSUFBVCxDQUFlamUsR0FBZixFQUVBLFdBQUEsQ0FFQSxDQVQ2QixDQVc5QnM0QixjQUFlLFNBQVdDLE1BQVgsQ0FBb0IsQ0FFbEMsS0FBS0MsU0FBTCxHQUVBLElBQU0sTUFBUSxDQUFSLENBQVdDLEdBQUtGLE9BQU92L0IsTUFBN0IsQ0FBcUNLLEVBQUlvL0IsRUFBekMsQ0FBNkNwL0IsR0FBN0MsQ0FBb0QsQ0FFbkQsS0FBS3EvQixhQUFMLENBQW9CSCxPQUFRbC9CLENBQVIsQ0FBcEIsRUFFQSxDQUVELFdBQUEsQ0FFQSxDQXZCNkIsQ0F5QjlCcy9CLHFCQUFzQixVQUFZLENBRWpDLE9BQVMsV0FBQSxFQUFULENBRUEsb0NBQU8sQ0FBK0J6WCxNQUEvQixDQUF1QzBYLElBQXZDLENBQThDLENBRXBELGFBQWVyWSxHQUFHdEMsSUFBSCxDQUFTMmEsSUFBVCxFQUFnQmphLGNBQWhCLENBQWdDLEdBQWhDLENBQWYsQ0FDQSxLQUFLNWUsR0FBTCxDQUFTa2UsSUFBVCxDQUFlaUQsTUFBZixFQUF3QjNDLEdBQXhCLENBQTZCc2EsUUFBN0IsRUFDQSxLQUFLNzRCLEdBQUwsQ0FBU2llLElBQVQsQ0FBZWlELE1BQWYsRUFBd0JoRCxHQUF4QixDQUE2QjJhLFFBQTdCLEVBRUEsV0FBQSxDQUVBLENBUkQsQ0FVQSxDQWRxQixFQXpCUSxDQXlDOUI3YSxNQUFPLFVBQVksQ0FFbEIsZ0JBQWdCbnBCLFdBQVQsR0FBdUJvcEIsSUFBdkIsQ0FBNkIsSUFBN0IsQ0FBUCxDQUVBLENBN0M2QixDQStDOUJBLEtBQU0sU0FBVythLEdBQVgsQ0FBaUIsQ0FFdEIsS0FBS2o1QixHQUFMLENBQVNrZSxJQUFULENBQWUrYSxJQUFJajVCLEdBQW5CLEVBQ0EsS0FBS0MsR0FBTCxDQUFTaWUsSUFBVCxDQUFlK2EsSUFBSWg1QixHQUFuQixFQUVBLFdBQUEsQ0FFQSxDQXRENkIsQ0F3RDlCdzRCLFVBQVcsVUFBWSxDQUV0QixLQUFLejRCLEdBQUwsQ0FBUzZMLENBQVQsQ0FBYSxLQUFLN0wsR0FBTCxDQUFTcWMsQ0FBVCxDQUFhLENBQUV1YixRQUE1QixDQUNBLEtBQUszM0IsR0FBTCxDQUFTNEwsQ0FBVCxDQUFhLEtBQUs1TCxHQUFMLENBQVNvYyxDQUFULENBQWEsQ0FBRXViLFFBQTVCLENBRUEsV0FBQSxDQUVBLENBL0Q2QixDQWlFOUJzQixRQUFTLFVBQVk7RUFJcEIsWUFBY2o1QixHQUFMLENBQVM0TCxDQUFULENBQWEsS0FBSzdMLEdBQUwsQ0FBUzZMLENBQXhCLEVBQWlDLEtBQUs1TCxHQUFMLENBQVNvYyxDQUFULENBQWEsS0FBS3JjLEdBQUwsQ0FBU3FjLENBQTlELENBRUEsQ0F2RTZCLENBeUU5QjhjLFVBQVcsU0FBV2o2QixNQUFYLENBQW9CLENBRTlCLEdBQUtBLFNBQVd0SCxTQUFoQixDQUE0QixDQUUzQjJXLFFBQVE2UCxJQUFSLENBQWMsaURBQWQsRUFDQWxmLE9BQVMsV0FBQSxFQUFULENBRUEsQ0FFRCxZQUFZZzZCLE9BQUwsR0FBaUJoNkIsT0FBTzBLLEdBQVAsQ0FBWSxDQUFaLENBQWUsQ0FBZixDQUFqQixDQUFzQzFLLE9BQU9tZixVQUFQLENBQW1CLEtBQUtyZSxHQUF4QixDQUE2QixLQUFLQyxHQUFsQyxFQUF3QzJlLGNBQXhDLENBQXdELEdBQXhELENBQTdDLENBRUEsQ0FwRjZCLENBc0Y5QndhLFFBQVMsU0FBV2w2QixNQUFYLENBQW9CLENBRTVCLEdBQUtBLFNBQVd0SCxTQUFoQixDQUE0QixDQUUzQjJXLFFBQVE2UCxJQUFSLENBQWMsK0NBQWQsRUFDQWxmLE9BQVMsV0FBQSxFQUFULENBRUEsQ0FFRCxZQUFZZzZCLE9BQUwsR0FBaUJoNkIsT0FBTzBLLEdBQVAsQ0FBWSxDQUFaLENBQWUsQ0FBZixDQUFqQixDQUFzQzFLLE9BQU91ZixVQUFQLENBQW1CLEtBQUt4ZSxHQUF4QixDQUE2QixLQUFLRCxHQUFsQyxDQUE3QyxDQUVBLENBakc2QixDQW1HOUIyNEIsY0FBZSxTQUFXenlCLEtBQVgsQ0FBbUIsQ0FFakMsS0FBS2xHLEdBQUwsQ0FBU0EsR0FBVCxDQUFja0csS0FBZCxFQUNBLEtBQUtqRyxHQUFMLENBQVNBLEdBQVQsQ0FBY2lHLEtBQWQsRUFFQSxXQUFBLENBRUEsQ0ExRzZCLENBNEc5Qm16QixlQUFnQixTQUFXaFAsTUFBWCxDQUFvQixDQUVuQyxLQUFLcnFCLEdBQUwsQ0FBU3dlLEdBQVQsQ0FBYzZMLE1BQWQsRUFDQSxLQUFLcHFCLEdBQUwsQ0FBU2tlLEdBQVQsQ0FBY2tNLE1BQWQsRUFFQSxXQUFBLENBRUEsQ0FuSDZCLENBcUg5QmlQLGVBQWdCLFNBQVcxYixNQUFYLENBQW9CLENBRW5DLEtBQUs1ZCxHQUFMLENBQVNzZSxTQUFULENBQW9CLENBQUVWLE1BQXRCLEVBQ0EsS0FBSzNkLEdBQUwsQ0FBU3FlLFNBQVQsQ0FBb0JWLE1BQXBCLEVBRUEsV0FBQSxDQUVBLENBNUg2QixDQThIOUJtYyxjQUFlLFNBQVc3ekIsS0FBWCxDQUFtQixDQUVqQyxhQUFhMkYsQ0FBTixDQUFVLEtBQUs3TCxHQUFMLENBQVM2TCxDQUFuQixFQUF3QjNGLE1BQU0yRixDQUFOLENBQVUsS0FBSzVMLEdBQUwsQ0FBUzRMLENBQTNDLEVBQ04zRixNQUFNbVcsQ0FBTixDQUFVLEtBQUtyYyxHQUFMLENBQVNxYyxDQURiLEVBQ2tCblcsTUFBTW1XLENBQU4sQ0FBVSxLQUFLcGMsR0FBTCxDQUFTb2MsQ0FEckMsQ0FDeUMsS0FEekMsQ0FDaUQsSUFEeEQsQ0FHQSxDQW5JNkIsQ0FxSTlCMmQsWUFBYSxTQUFXZixHQUFYLENBQWlCLENBRTdCLFlBQVlqNUIsR0FBTCxDQUFTNkwsQ0FBVCxFQUFjb3RCLElBQUlqNUIsR0FBSixDQUFRNkwsQ0FBdEIsRUFBMkJvdEIsSUFBSWg1QixHQUFKLENBQVE0TCxDQUFSLEVBQWEsS0FBSzVMLEdBQUwsQ0FBUzRMLENBQWpELEVBQ04sS0FBSzdMLEdBQUwsQ0FBU3FjLENBQVQsRUFBYzRjLElBQUlqNUIsR0FBSixDQUFRcWMsQ0FEaEIsRUFDcUI0YyxJQUFJaDVCLEdBQUosQ0FBUW9jLENBQVIsRUFBYSxLQUFLcGMsR0FBTCxDQUFTb2MsQ0FEbEQsQ0FHQSxDQTFJNkIsQ0E0STlCNGQsYUFBYyxTQUFXL3pCLEtBQVgsQ0FBa0JoSCxNQUFsQixDQUEyQjtFQUd4QztFQUVBLEdBQUtBLFNBQVd0SCxTQUFoQixDQUE0QixDQUUzQjJXLFFBQVE2UCxJQUFSLENBQWMsb0RBQWQsRUFDQWxmLE9BQVMsV0FBQSxFQUFULENBRUEsQ0FFRCxjQUFjMEssR0FBUCxDQUNOLENBQUUxRCxNQUFNMkYsQ0FBTixDQUFVLEtBQUs3TCxHQUFMLENBQVM2TCxDQUFyQixHQUE2QixLQUFLNUwsR0FBTCxDQUFTNEwsQ0FBVCxDQUFhLEtBQUs3TCxHQUFMLENBQVM2TCxDQUFuRCxDQURNLENBRU4sQ0FBRTNGLE1BQU1tVyxDQUFOLENBQVUsS0FBS3JjLEdBQUwsQ0FBU3FjLENBQXJCLEdBQTZCLEtBQUtwYyxHQUFMLENBQVNvYyxDQUFULENBQWEsS0FBS3JjLEdBQUwsQ0FBU3FjLENBQW5ELENBRk0sQ0FBUCxDQUtBLENBN0o2QixDQStKOUI2ZCxjQUFlLFNBQVdqQixHQUFYLENBQWlCO0VBSS9CLFdBQVdoNUIsR0FBSixDQUFRNEwsQ0FBUixDQUFZLEtBQUs3TCxHQUFMLENBQVM2TCxDQUFyQixFQUEwQm90QixJQUFJajVCLEdBQUosQ0FBUTZMLENBQVIsQ0FBWSxLQUFLNUwsR0FBTCxDQUFTNEwsQ0FBL0MsRUFDTm90QixJQUFJaDVCLEdBQUosQ0FBUW9jLENBQVIsQ0FBWSxLQUFLcmMsR0FBTCxDQUFTcWMsQ0FEZixFQUNvQjRjLElBQUlqNUIsR0FBSixDQUFRcWMsQ0FBUixDQUFZLEtBQUtwYyxHQUFMLENBQVNvYyxDQUR6QyxDQUM2QyxLQUQ3QyxDQUNxRCxJQUQ1RCxDQUdBLENBdEs2QixDQXdLOUJnZSxXQUFZLFNBQVduMEIsS0FBWCxDQUFrQmhILE1BQWxCLENBQTJCLENBRXRDLEdBQUtBLFNBQVd0SCxTQUFoQixDQUE0QixDQUUzQjJXLFFBQVE2UCxJQUFSLENBQWMsa0RBQWQsRUFDQWxmLE9BQVMsV0FBQSxFQUFULENBRUEsQ0FFRCxjQUFjZ2YsSUFBUCxDQUFhaFksS0FBYixFQUFxQnlWLEtBQXJCLENBQTRCLEtBQUszYixHQUFqQyxDQUFzQyxLQUFLQyxHQUEzQyxDQUFQLENBRUEsQ0FuTDZCLENBcUw5QnU3QixnQkFBaUIsVUFBWSxDQUU1QixPQUFTLFdBQUEsRUFBVCxDQUVBLCtCQUFPLENBQTBCdDFCLEtBQTFCLENBQWtDLENBRXhDLGlCQUFtQnNhLEdBQUd0QyxJQUFILENBQVNoWSxLQUFULEVBQWlCeVYsS0FBakIsQ0FBd0IsS0FBSzNiLEdBQTdCLENBQWtDLEtBQUtDLEdBQXZDLENBQW5CLENBQ0Esb0JBQW9CdWUsR0FBYixDQUFrQnRZLEtBQWxCLEVBQTBCak4sTUFBMUIsRUFBUCxDQUVBLENBTEQsQ0FPQSxDQVhnQixFQXJMYSxDQWtNOUJ5aUMsVUFBVyxTQUFXekMsR0FBWCxDQUFpQixDQUUzQixLQUFLajVCLEdBQUwsQ0FBU0MsR0FBVCxDQUFjZzVCLElBQUlqNUIsR0FBbEIsRUFDQSxLQUFLQyxHQUFMLENBQVNELEdBQVQsQ0FBY2k1QixJQUFJaDVCLEdBQWxCLEVBRUEsV0FBQSxDQUVBLENBek02QixDQTJNOUIwN0IsTUFBTyxTQUFXMUMsR0FBWCxDQUFpQixDQUV2QixLQUFLajVCLEdBQUwsQ0FBU0EsR0FBVCxDQUFjaTVCLElBQUlqNUIsR0FBbEIsRUFDQSxLQUFLQyxHQUFMLENBQVNBLEdBQVQsQ0FBY2c1QixJQUFJaDVCLEdBQWxCLEVBRUEsV0FBQSxDQUVBLENBbE42QixDQW9OOUIreUIsVUFBVyxTQUFXcFMsTUFBWCxDQUFvQixDQUU5QixLQUFLNWdCLEdBQUwsQ0FBU21lLEdBQVQsQ0FBY3lDLE1BQWQsRUFDQSxLQUFLM2dCLEdBQUwsQ0FBU2tlLEdBQVQsQ0FBY3lDLE1BQWQsRUFFQSxXQUFBLENBRUEsQ0EzTjZCLENBNk45QkYsT0FBUSxTQUFXdVksR0FBWCxDQUFpQixDQUV4QixXQUFXajVCLEdBQUosQ0FBUTBnQixNQUFSLENBQWdCLEtBQUsxZ0IsR0FBckIsR0FBOEJpNUIsSUFBSWg1QixHQUFKLENBQVF5Z0IsTUFBUixDQUFnQixLQUFLemdCLEdBQXJCLENBQXJDLENBRUEsQ0FqTzZCLENBQS9CLEVBcU9BOztLQUlBLDhCQUFBLENBQWdDczFDLFFBQWhDLENBQTJDLENBRTFDdEQsU0FBUy85QyxJQUFULENBQWUsSUFBZixFQUVBLEtBQUtxaEQsUUFBTCxDQUFnQkEsUUFBaEIsQ0FDQSxLQUFLc2IsTUFBTCxDQUFjLDhCQUFrQyxFQUFoRCxDQUVBLENBRURxdUUsc0JBQXNCMXNJLFNBQXRCLENBQWtDRCxPQUFPaUIsTUFBUCxDQUFleStDLFNBQVN6L0MsU0FBeEIsQ0FBbEMsQ0FDQTBzSSxzQkFBc0Ixc0ksU0FBdEIsQ0FBZ0NzQyxXQUFoQyxDQUE4Q29xSSxxQkFBOUMsQ0FFQUEsc0JBQXNCMXNJLFNBQXRCLENBQWdDczRGLHVCQUFoQyxDQUEwRCxJQUExRCxDQUVBOzs7S0FLQSw0QkFBQSxDQUE4Qmh5RixNQUE5QixDQUFzQysvQixJQUF0QyxDQUE0Q3NPLEdBQTVDLENBQWlEeWYsU0FBakQsQ0FBNkQsQ0FFNUQsS0FBSzl0RCxNQUFMLENBQWNBLE1BQWQsQ0FFQSxLQUFLKy9CLElBQUwsQ0FBY0EsT0FBU2poQyxTQUFYLENBQXlCaWhDLElBQXpCLENBQWdDLENBQTVDLENBRUEsVUFBY3NPLE1BQVF2dkMsU0FBVixDQUF3QnV2QyxHQUF4QixDQUE4QixRQUExQyxDQUVBLFVBQWN5ZixZQUFjaHZELFNBQWhCLENBQThCZ3ZELFNBQTlCLENBQTBDLENBQXRELENBRUE7RUFFQSxhQUFlLENBQWYsQ0FFQSxnQkFBa0IsS0FBSzl0RCxNQUFMLENBQVl5Z0MsUUFBOUIsQ0FFQSxHQUFLNGxHLGFBQWVBLFlBQVkzbEcsVUFBaEMsQ0FBNkMsQ0FFNUM0bEcsU0FBV0QsWUFBWTluRixLQUFaLENBQWtCcCtDLE1BQWxCLENBQTJCLENBQXRDLENBRUEsQ0FKRCxRQUlZa21JLGFBQWVBLFlBQVl4bEcsZ0JBQWhDLENBQW1ELENBRXpEeWxHLFNBQVdELFlBQVl2bEcsVUFBWixDQUF1QmxJLE1BQXZCLENBQThCMUosS0FBekMsQ0FFQSxDQUVEO0VBRUEsYUFBZSxrQkFBQSxFQUFmLENBRUEsY0FBZ0IsMEJBQUEsQ0FBNEJvM0csU0FBVyxDQUFYLENBQWUsQ0FBM0MsQ0FBOEMsQ0FBOUMsQ0FBaEIsQ0FFQTdsRyxTQUFTb25CLFlBQVQsQ0FBdUIsVUFBdkIsQ0FBbUMvSCxTQUFuQyxFQUVBczVDLGFBQWFoK0YsSUFBYixDQUFtQixJQUFuQixDQUF5QnFsQyxRQUF6QixDQUFtQyxxQkFBQSxDQUF1QixDQUFFaU8sTUFBT0EsS0FBVCxDQUFnQm9mLFVBQVd2eEIsS0FBM0IsQ0FBdkIsQ0FBbkMsRUFFQTtFQUVBLEtBQUtmLGdCQUFMLENBQXdCLEtBQXhCLENBRUEsS0FBS3JILE1BQUwsR0FFQSxDQUVEb3lHLG9CQUFvQjdzSSxTQUFwQixDQUFnQ0QsT0FBT2lCLE1BQVAsQ0FBZTArRixhQUFhMS9GLFNBQTVCLENBQWhDLENBQ0E2c0ksb0JBQW9CN3NJLFNBQXBCLENBQThCc0MsV0FBOUIsQ0FBNEN1cUksbUJBQTVDLENBRUFBLG9CQUFvQjdzSSxTQUFwQixDQUE4Qnk2QixNQUE5QixDQUF5QyxVQUFZLENBRXBELE9BQVMsV0FBQSxFQUFULENBQ0EsT0FBUyxXQUFBLEVBQVQsQ0FDQSxpQkFBbUIsV0FBQSxFQUFuQixDQUVBLHNCQUFPLEVBQWtCLENBRXhCLFNBQVcsQ0FBRSxHQUFGLENBQU8sR0FBUCxDQUFZLEdBQVosQ0FBWCxDQUVBLEtBQUtuMEIsTUFBTCxDQUFZK2dDLGlCQUFaLENBQStCLElBQS9CLEVBRUF5RCxhQUFhOUssZUFBYixDQUE4QixLQUFLMTVCLE1BQUwsQ0FBWTgzQixXQUExQyxFQUVBLGdCQUFrQixLQUFLOTNCLE1BQUwsQ0FBWTgzQixXQUE5QixDQUVBLGFBQWUsS0FBSzJJLFFBQUwsQ0FBY0ssVUFBZCxDQUF5QjFQLFFBQXhDLENBRUE7RUFFQSxnQkFBa0IsS0FBS3B4QixNQUFMLENBQVl5Z0MsUUFBOUIsQ0FFQSxHQUFLNGxHLGFBQWVBLFlBQVkzbEcsVUFBaEMsQ0FBNkMsQ0FFNUMsYUFBZTJsRyxZQUFZMWxHLFFBQTNCLENBRUEsVUFBWTBsRyxZQUFZOW5GLEtBQXhCLENBRUEsUUFBVSxDQUFWLENBRUEsSUFBTSxNQUFRLENBQVIsQ0FBV3Q3QyxFQUFJczdDLE1BQU1wK0MsTUFBM0IsQ0FBbUNLLEVBQUl5QyxDQUF2QyxDQUEwQ3pDLEdBQTFDLENBQWlELENBRWhELFNBQVcrOUMsTUFBTy85QyxDQUFQLENBQVgsQ0FFQSxJQUFNLE1BQVEsQ0FBUixDQUFXaS9DLEdBQUtELEtBQUt0QixhQUFMLENBQW1CLzlDLE1BQXpDLENBQWlEaWMsRUFBSXFqQyxFQUFyRCxDQUF5RHJqQyxHQUF6RCxDQUFnRSxDQUUvRCxXQUFhdWtCLFNBQVU2ZSxLQUFNei9DLEtBQU1xYyxDQUFOLENBQU4sQ0FBVixDQUFiLENBRUEsV0FBYW9qQyxLQUFLdEIsYUFBTCxDQUFvQjloQyxDQUFwQixDQUFiLENBRUFzTCxHQUFHdEMsSUFBSCxDQUFTbTZCLE1BQVQsRUFBa0Jud0IsWUFBbEIsQ0FBZ0MwSSxXQUFoQyxFQUVBblEsR0FBR3ZDLElBQUgsQ0FBU3dULE1BQVQsRUFBa0IzUyxZQUFsQixDQUFnQ3VlLFlBQWhDLEVBQStDemQsU0FBL0MsR0FBMkRqQixjQUEzRCxDQUEyRSxLQUFLaWEsSUFBaEYsRUFBdUYxYSxHQUF2RixDQUE0RnFDLEVBQTVGLEVBRUEwSixTQUFTL0IsTUFBVCxDQUFpQjh6QixHQUFqQixDQUFzQno3QixHQUFHM1UsQ0FBekIsQ0FBNEIyVSxHQUFHbkUsQ0FBL0IsQ0FBa0NtRSxHQUFHMEMsQ0FBckMsRUFFQSs0QixJQUFNQSxJQUFNLENBQVosQ0FFQS94QixTQUFTL0IsTUFBVCxDQUFpQjh6QixHQUFqQixDQUFzQng3QixHQUFHNVUsQ0FBekIsQ0FBNEI0VSxHQUFHcEUsQ0FBL0IsQ0FBa0NvRSxHQUFHeUMsQ0FBckMsRUFFQSs0QixJQUFNQSxJQUFNLENBQVosQ0FFQSxDQUVELENBRUQsQ0FsQ0QsUUFrQ1lrakYsYUFBZUEsWUFBWXhsRyxnQkFBaEMsQ0FBbUQsQ0FFekQsV0FBYXdsRyxZQUFZdmxHLFVBQVosQ0FBdUIxUCxRQUFwQyxDQUVBLFlBQWNpMUcsWUFBWXZsRyxVQUFaLENBQXVCbEksTUFBckMsQ0FFQSxRQUFVLENBQVYsQ0FFQTtFQUVBLElBQU0sTUFBUSxDQUFSLENBQVc2bUIsR0FBSyttRixPQUFPdDNHLEtBQTdCLENBQW9DOVMsRUFBSXFqQyxFQUF4QyxDQUE0Q3JqQyxHQUE1QyxDQUFtRCxDQUVsRHNMLEdBQUc1VyxHQUFILENBQVEwMUgsT0FBT3QrRyxJQUFQLENBQWE5TCxDQUFiLENBQVIsQ0FBMEJvcUgsT0FBT3IrRyxJQUFQLENBQWEvTCxDQUFiLENBQTFCLENBQTRDb3FILE9BQU9yM0csSUFBUCxDQUFhL1MsQ0FBYixDQUE1QyxFQUErRGdULFlBQS9ELENBQTZFMEksV0FBN0UsRUFFQW5RLEdBQUc3VyxHQUFILENBQVEyMUgsUUFBUXYrRyxJQUFSLENBQWM5TCxDQUFkLENBQVIsQ0FBMkJxcUgsUUFBUXQrRyxJQUFSLENBQWMvTCxDQUFkLENBQTNCLENBQThDcXFILFFBQVF0M0csSUFBUixDQUFjL1MsQ0FBZCxDQUE5QyxFQUVBdUwsR0FBRzFCLFlBQUgsQ0FBaUJ1ZSxZQUFqQixFQUFnQ3pkLFNBQWhDLEdBQTRDakIsY0FBNUMsQ0FBNEQsS0FBS2lhLElBQWpFLEVBQXdFMWEsR0FBeEUsQ0FBNkVxQyxFQUE3RSxFQUVBMEosU0FBUy9CLE1BQVQsQ0FBaUI4ekIsR0FBakIsQ0FBc0J6N0IsR0FBRzNVLENBQXpCLENBQTRCMlUsR0FBR25FLENBQS9CLENBQWtDbUUsR0FBRzBDLENBQXJDLEVBRUErNEIsSUFBTUEsSUFBTSxDQUFaLENBRUEveEIsU0FBUy9CLE1BQVQsQ0FBaUI4ekIsR0FBakIsQ0FBc0J4N0IsR0FBRzVVLENBQXpCLENBQTRCNFUsR0FBR3BFLENBQS9CLENBQWtDb0UsR0FBR3lDLENBQXJDLEVBRUErNEIsSUFBTUEsSUFBTSxDQUFaLENBRUEsQ0FFRCxDQUVEL3hCLFNBQVMrMkIsV0FBVCxDQUF1QixJQUF2QixDQUVBLENBbEZELENBb0ZBLENBMUZ3QyxFQUF6QyxDQTRGQTs7OztLQU1BLHdCQUFBLENBQTBCcWpCLEtBQTFCLENBQWlDOThCLEtBQWpDLENBQXlDLENBRXhDeUssU0FBUy85QyxJQUFULENBQWUsSUFBZixFQUVBLEtBQUtvd0UsS0FBTCxDQUFhQSxLQUFiLENBQ0EsS0FBS0EsS0FBTCxDQUFXenFDLGlCQUFYLEdBRUEsS0FBS3RQLE1BQUwsQ0FBYys1QyxNQUFNMXpDLFdBQXBCLENBQ0EsS0FBSzBELGdCQUFMLENBQXdCLEtBQXhCLENBRUEsS0FBS2tULEtBQUwsQ0FBYUEsS0FBYixDQUVBLGFBQWUsa0JBQUEsRUFBZixDQUVBLGNBQWdCLENBQ2YsQ0FEZSxDQUNaLENBRFksQ0FDVCxDQURTLENBQ0wsQ0FESyxDQUNGLENBREUsQ0FDQyxDQURELENBRWYsQ0FGZSxDQUVaLENBRlksQ0FFVCxDQUZTLENBRUwsQ0FGSyxDQUVGLENBRkUsQ0FFQyxDQUZELENBR2YsQ0FIZSxDQUdaLENBSFksQ0FHVCxDQUhTLENBR04sQ0FBRSxDQUhJLENBR0QsQ0FIQyxDQUdFLENBSEYsQ0FJZixDQUplLENBSVosQ0FKWSxDQUlULENBSlMsQ0FJTCxDQUpLLENBSUYsQ0FKRSxDQUlDLENBSkQsQ0FLZixDQUxlLENBS1osQ0FMWSxDQUtULENBTFMsQ0FLTCxDQUxLLENBS0YsQ0FBRSxDQUxBLENBS0csQ0FMSCxDQUFoQixDQVFBLElBQU0sTUFBUSxDQUFSLENBQVd0eUIsRUFBSSxDQUFmLENBQWtCblosRUFBSSxFQUE1QixDQUFnQ3pDLEVBQUl5QyxDQUFwQyxDQUF1Q3pDLElBQU00YixHQUE3QyxDQUFvRCxDQUVuRCxPQUFXNWIsRUFBSXlDLENBQU4sQ0FBWVosS0FBSytmLEVBQWpCLENBQXNCLENBQS9CLENBQ0EsT0FBV2hHLEVBQUluWixDQUFOLENBQVlaLEtBQUsrZixFQUFqQixDQUFzQixDQUEvQixDQUVBMDlCLFVBQVVuZ0QsSUFBVixDQUNDMEMsS0FBS2ltQixHQUFMLENBQVU0WixFQUFWLENBREQsQ0FDaUI3L0IsS0FBS2ttQixHQUFMLENBQVUyWixFQUFWLENBRGpCLENBQ2lDLENBRGpDLENBRUM3L0IsS0FBS2ltQixHQUFMLENBQVU2WixFQUFWLENBRkQsQ0FFaUI5L0IsS0FBS2ttQixHQUFMLENBQVU0WixFQUFWLENBRmpCLENBRWlDLENBRmpDLEVBS0EsQ0FFRDFCLFNBQVNvbkIsWUFBVCxDQUF1QixVQUF2QixDQUFtQywwQkFBQSxDQUE0Qi9ILFNBQTVCLENBQXVDLENBQXZDLENBQW5DLEVBRUEsYUFBZSxxQkFBQSxDQUF1QixDQUFFeE4sSUFBSyxLQUFQLENBQXZCLENBQWYsQ0FFQSxLQUFLbzBGLElBQUwsQ0FBWSxnQkFBQSxDQUFrQmptRyxRQUFsQixDQUE0QmdjLFFBQTVCLENBQVosQ0FDQSxLQUFLcDNCLEdBQUwsQ0FBVSxLQUFLcWhILElBQWYsRUFFQSxLQUFLdnlHLE1BQUwsR0FFQSxDQUVEd3lHLGdCQUFnQmp0SSxTQUFoQixDQUE0QkQsT0FBT2lCLE1BQVAsQ0FBZXkrQyxTQUFTei9DLFNBQXhCLENBQTVCLENBQ0FpdEksZ0JBQWdCanRJLFNBQWhCLENBQTBCc0MsV0FBMUIsQ0FBd0MycUksZUFBeEMsQ0FFQUEsZ0JBQWdCanRJLFNBQWhCLENBQTBCdWpDLE9BQTFCLENBQW9DLFVBQVksQ0FFL0MsS0FBS3lwRyxJQUFMLENBQVVqbUcsUUFBVixDQUFtQnhELE9BQW5CLEdBQ0EsS0FBS3lwRyxJQUFMLENBQVVqcUYsUUFBVixDQUFtQnhmLE9BQW5CLEdBRUEsQ0FMRCxDQU9BMHBHLGdCQUFnQmp0SSxTQUFoQixDQUEwQnk2QixNQUExQixDQUFtQyxVQUFZLENBRTlDLFdBQWEsV0FBQSxFQUFiLENBQ0EsWUFBYyxXQUFBLEVBQWQsQ0FFQSxzQkFBTyxFQUFrQixDQUV4QixLQUFLcTNDLEtBQUwsQ0FBV3pxQyxpQkFBWCxHQUVBLGVBQWlCLEtBQUt5cUMsS0FBTCxDQUFXbGxDLFFBQVgsQ0FBc0IsS0FBS2tsQyxLQUFMLENBQVdsbEMsUUFBakMsQ0FBNEMsSUFBN0QsQ0FDQSxjQUFnQnNnRyxXQUFhdmtJLEtBQUtna0YsR0FBTCxDQUFVLEtBQUs3YSxLQUFMLENBQVd4a0QsS0FBckIsQ0FBN0IsQ0FFQSxLQUFLMC9HLElBQUwsQ0FBVXYyRyxLQUFWLENBQWdCcmYsR0FBaEIsQ0FBcUIrMUgsU0FBckIsQ0FBZ0NBLFNBQWhDLENBQTJDRCxVQUEzQyxFQUVBcjFHLE9BQU84SCxxQkFBUCxDQUE4QixLQUFLbXlDLEtBQUwsQ0FBVzF6QyxXQUF6QyxFQUNBNnZFLFFBQVF0dUUscUJBQVIsQ0FBK0IsS0FBS215QyxLQUFMLENBQVdwbEUsTUFBWCxDQUFrQjB4QixXQUFqRCxFQUVBLEtBQUs0dUcsSUFBTCxDQUFVLzVHLE1BQVYsQ0FBa0JnN0UsUUFBUWppRixHQUFSLENBQWE2TCxNQUFiLENBQWxCLEVBRUEsR0FBSyxLQUFLbWQsS0FBTCxHQUFlNXZDLFNBQXBCLENBQWdDLENBRS9CLEtBQUs0bkksSUFBTCxDQUFVanFGLFFBQVYsQ0FBbUIvTixLQUFuQixDQUF5QjU5QixHQUF6QixDQUE4QixLQUFLNDlCLEtBQW5DLEVBRUEsQ0FKRCxJQUlPLENBRU4sS0FBS2c0RixJQUFMLENBQVVqcUYsUUFBVixDQUFtQi9OLEtBQW5CLENBQXlCdHBCLElBQXpCLENBQStCLEtBQUtvbUQsS0FBTCxDQUFXOThCLEtBQTFDLEVBRUEsQ0FFRCxDQXhCRCxDQTBCQSxDQS9Ca0MsRUFBbkMsQ0FpQ0E7Ozs7OztLQVFBLG9CQUFBLENBQXNCMXVDLE1BQXRCLENBQStCLENBRTlCLGFBQWUsRUFBZixDQUVBLEdBQUtBLFFBQVVBLE9BQU9xM0YsTUFBdEIsQ0FBK0IsQ0FFOUJ5dkMsU0FBU25uSSxJQUFULENBQWVLLE1BQWYsRUFFQSxDQUVELElBQU0sTUFBUSxDQUFkLENBQWlCUSxFQUFJUixPQUFPazVDLFFBQVAsQ0FBZ0IvNEMsTUFBckMsQ0FBNkNLLEdBQTdDLENBQW9ELENBRW5Ec21JLFNBQVNubkksSUFBVCxDQUFjaUUsS0FBZCxDQUFxQmtqSSxRQUFyQixDQUErQkMsWUFBYS9tSSxPQUFPazVDLFFBQVAsQ0FBaUIxNEMsQ0FBakIsQ0FBYixDQUEvQixFQUVBLENBRUQsZUFBQSxDQUVBLENBRUQsdUJBQUEsQ0FBeUJSLE1BQXpCLENBQWtDLENBRWpDLFVBQVkrbUksWUFBYS9tSSxNQUFiLENBQVosQ0FFQSxhQUFlLGtCQUFBLEVBQWYsQ0FFQSxhQUFlLEVBQWYsQ0FDQSxXQUFhLEVBQWIsQ0FFQSxXQUFhLFNBQUEsQ0FBVyxDQUFYLENBQWMsQ0FBZCxDQUFpQixDQUFqQixDQUFiLENBQ0EsV0FBYSxTQUFBLENBQVcsQ0FBWCxDQUFjLENBQWQsQ0FBaUIsQ0FBakIsQ0FBYixDQUVBLElBQU0sTUFBUSxDQUFkLENBQWlCUSxFQUFJcW9FLE1BQU0xb0UsTUFBM0IsQ0FBbUNLLEdBQW5DLENBQTBDLENBRXpDLFNBQVdxb0UsTUFBT3JvRSxDQUFQLENBQVgsQ0FFQSxHQUFLNDJGLEtBQUs1bEYsTUFBTCxFQUFlNGxGLEtBQUs1bEYsTUFBTCxDQUFZNmxGLE1BQWhDLENBQXlDLENBRXhDMTJELFNBQVNoaEMsSUFBVCxDQUFlLENBQWYsQ0FBa0IsQ0FBbEIsQ0FBcUIsQ0FBckIsRUFDQWdoQyxTQUFTaGhDLElBQVQsQ0FBZSxDQUFmLENBQWtCLENBQWxCLENBQXFCLENBQXJCLEVBQ0EyK0MsT0FBTzMrQyxJQUFQLENBQWFvd0MsT0FBTzk0QixDQUFwQixDQUF1Qjg0QixPQUFPanVDLENBQTlCLENBQWlDaXVDLE9BQU8vc0MsQ0FBeEMsRUFDQXM3QyxPQUFPMytDLElBQVAsQ0FBYXF3QyxPQUFPLzRCLENBQXBCLENBQXVCKzRCLE9BQU9sdUMsQ0FBOUIsQ0FBaUNrdUMsT0FBT2h0QyxDQUF4QyxFQUVBLENBRUQsQ0FFRHk5QixTQUFTb25CLFlBQVQsQ0FBdUIsVUFBdkIsQ0FBbUMsMEJBQUEsQ0FBNEJsbkIsUUFBNUIsQ0FBc0MsQ0FBdEMsQ0FBbkMsRUFDQUYsU0FBU29uQixZQUFULENBQXVCLE9BQXZCLENBQWdDLDBCQUFBLENBQTRCdkosTUFBNUIsQ0FBb0MsQ0FBcEMsQ0FBaEMsRUFFQSxhQUFlLHFCQUFBLENBQXVCLENBQUVILGFBQWNncEUsWUFBaEIsQ0FBOEI3NkQsVUFBVyxLQUF6QyxDQUFnREMsV0FBWSxLQUE1RCxDQUFtRWIsWUFBYSxJQUFoRixDQUF2QixDQUFmLENBRUEwdEMsYUFBYWgrRixJQUFiLENBQW1CLElBQW5CLENBQXlCcWxDLFFBQXpCLENBQW1DZ2MsUUFBbkMsRUFFQSxLQUFLKzVFLElBQUwsQ0FBWXgySCxNQUFaLENBQ0EsS0FBSzZvRSxLQUFMLENBQWFBLEtBQWIsQ0FFQSxLQUFLcDNDLE1BQUwsQ0FBY3p4QixPQUFPODNCLFdBQXJCLENBQ0EsS0FBSzBELGdCQUFMLENBQXdCLEtBQXhCLENBRUEsQ0FFRHdyRyxlQUFldHRJLFNBQWYsQ0FBMkJELE9BQU9pQixNQUFQLENBQWUwK0YsYUFBYTEvRixTQUE1QixDQUEzQixDQUNBc3RJLGVBQWV0dEksU0FBZixDQUF5QnNDLFdBQXpCLENBQXVDZ3JJLGNBQXZDLENBRUFBLGVBQWV0dEksU0FBZixDQUF5QnFuQyxpQkFBekIsQ0FBNkMsVUFBWSxDQUV4RCxXQUFhLFdBQUEsRUFBYixDQUVBLGVBQWlCLFdBQUEsRUFBakIsQ0FDQSxtQkFBcUIsV0FBQSxFQUFyQixDQUVBLGlDQUFPLENBQTRCaWIsS0FBNUIsQ0FBb0MsQ0FFMUMsVUFBWSxLQUFLNnNCLEtBQWpCLENBRUEsYUFBZSxLQUFLcG9DLFFBQXBCLENBQ0EsYUFBZUEsU0FBU3FuQixZQUFULENBQXVCLFVBQXZCLENBQWYsQ0FFQW0vRSxlQUFldjNHLFVBQWYsQ0FBMkIsS0FBSzhtRyxJQUFMLENBQVUxK0YsV0FBckMsRUFFQSxJQUFNLE1BQVEsQ0FBUixDQUFXMWIsRUFBSSxDQUFyQixDQUF3QjViLEVBQUlxb0UsTUFBTTFvRSxNQUFsQyxDQUEwQ0ssR0FBMUMsQ0FBaUQsQ0FFaEQsU0FBV3FvRSxNQUFPcm9FLENBQVAsQ0FBWCxDQUVBLEdBQUs0MkYsS0FBSzVsRixNQUFMLEVBQWU0bEYsS0FBSzVsRixNQUFMLENBQVk2bEYsTUFBaEMsQ0FBeUMsQ0FFeEM2dkMsV0FBV242RyxnQkFBWCxDQUE2Qms2RyxjQUE3QixDQUE2Qzd2QyxLQUFLdC9ELFdBQWxELEVBQ0F2RyxPQUFPOEgscUJBQVAsQ0FBOEI2dEcsVUFBOUIsRUFDQTkxRyxTQUFTL0IsTUFBVCxDQUFpQmpULENBQWpCLENBQW9CbVYsT0FBT3hlLENBQTNCLENBQThCd2UsT0FBT2hPLENBQXJDLENBQXdDZ08sT0FBT25ILENBQS9DLEVBRUE4OEcsV0FBV242RyxnQkFBWCxDQUE2Qms2RyxjQUE3QixDQUE2Qzd2QyxLQUFLNWxGLE1BQUwsQ0FBWXNtQixXQUF6RCxFQUNBdkcsT0FBTzhILHFCQUFQLENBQThCNnRHLFVBQTlCLEVBQ0E5MUcsU0FBUy9CLE1BQVQsQ0FBaUJqVCxFQUFJLENBQXJCLENBQXdCbVYsT0FBT3hlLENBQS9CLENBQWtDd2UsT0FBT2hPLENBQXpDLENBQTRDZ08sT0FBT25ILENBQW5ELEVBRUFoTyxHQUFLLENBQUwsQ0FFQSxDQUVELENBRURxa0IsU0FBU3FuQixZQUFULENBQXVCLFVBQXZCLEVBQW9DSyxXQUFwQyxDQUFrRCxJQUFsRCxDQUVBaFAsU0FBU3ovQyxTQUFULENBQW1CcW5DLGlCQUFuQixDQUFxQzNsQyxJQUFyQyxDQUEyQyxJQUEzQyxDQUFpRDRnRCxLQUFqRCxFQUVBLENBakNELENBbUNBLENBMUM0QyxFQUE3QyxDQTRDQTs7O0tBS0EseUJBQUEsQ0FBMkJ3dkIsS0FBM0IsQ0FBa0MyN0QsVUFBbEMsQ0FBOEN6NEYsS0FBOUMsQ0FBc0QsQ0FFckQsS0FBSzg4QixLQUFMLENBQWFBLEtBQWIsQ0FDQSxLQUFLQSxLQUFMLENBQVd6cUMsaUJBQVgsR0FFQSxLQUFLMk4sS0FBTCxDQUFhQSxLQUFiLENBRUEsYUFBZSx3QkFBQSxDQUEwQnk0RixVQUExQixDQUFzQyxDQUF0QyxDQUF5QyxDQUF6QyxDQUFmLENBQ0EsYUFBZSxxQkFBQSxDQUF1QixDQUFFbjVFLFVBQVcsSUFBYixDQUFtQjFiLElBQUssS0FBeEIsQ0FBdkIsQ0FBZixDQUVBZ2lCLEtBQUtsNUQsSUFBTCxDQUFXLElBQVgsQ0FBaUJxbEMsUUFBakIsQ0FBMkJnYyxRQUEzQixFQUVBLEtBQUtockIsTUFBTCxDQUFjLEtBQUsrNUMsS0FBTCxDQUFXMXpDLFdBQXpCLENBQ0EsS0FBSzBELGdCQUFMLENBQXdCLEtBQXhCLENBRUEsS0FBS3JILE1BQUwsR0FHQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7TUF3QkRpekcsaUJBQWlCMXRJLFNBQWpCLENBQTZCRCxPQUFPaUIsTUFBUCxDQUFlNDVELEtBQUs1NkQsU0FBcEIsQ0FBN0IsQ0FDQTB0SSxpQkFBaUIxdEksU0FBakIsQ0FBMkJzQyxXQUEzQixDQUF5Q29ySSxnQkFBekMsQ0FFQUEsaUJBQWlCMXRJLFNBQWpCLENBQTJCdWpDLE9BQTNCLENBQXFDLFVBQVksQ0FFaEQsS0FBS3dELFFBQUwsQ0FBY3hELE9BQWQsR0FDQSxLQUFLd2YsUUFBTCxDQUFjeGYsT0FBZCxHQUVBLENBTEQsQ0FPQW1xRyxpQkFBaUIxdEksU0FBakIsQ0FBMkJ5NkIsTUFBM0IsQ0FBb0MsVUFBWSxDQUUvQyxHQUFLLEtBQUt1YSxLQUFMLEdBQWU1dkMsU0FBcEIsQ0FBZ0MsQ0FFL0IsS0FBSzI5QyxRQUFMLENBQWMvTixLQUFkLENBQW9CNTlCLEdBQXBCLENBQXlCLEtBQUs0OUIsS0FBOUIsRUFFQSxDQUpELElBSU8sQ0FFTixLQUFLK04sUUFBTCxDQUFjL04sS0FBZCxDQUFvQnRwQixJQUFwQixDQUEwQixLQUFLb21ELEtBQUwsQ0FBVzk4QixLQUFyQyxFQUVBLENBRUQ7Ozs7Ozs7Ozs7Ozs7TUFaRCxDQTZCQTs7OztLQU1BLDRCQUFBLENBQThCODhCLEtBQTlCLENBQXFDOThCLEtBQXJDLENBQTZDLENBRTVDeUssU0FBUy85QyxJQUFULENBQWUsSUFBZixFQUVBLEtBQUtvd0UsS0FBTCxDQUFhQSxLQUFiLENBQ0EsS0FBS0EsS0FBTCxDQUFXenFDLGlCQUFYLEdBRUEsS0FBS3RQLE1BQUwsQ0FBYys1QyxNQUFNMXpDLFdBQXBCLENBQ0EsS0FBSzBELGdCQUFMLENBQXdCLEtBQXhCLENBRUEsS0FBS2tULEtBQUwsQ0FBYUEsS0FBYixDQUVBLGFBQWUscUJBQUEsQ0FBdUIsQ0FBRTRELElBQUssS0FBUCxDQUF2QixDQUFmLENBRUEsYUFBZSxrQkFBQSxFQUFmLENBRUE3UixTQUFTb25CLFlBQVQsQ0FBdUIsVUFBdkIsQ0FBbUMsbUJBQUEsQ0FBcUIsZ0JBQUEsQ0FBa0IsRUFBSSxDQUF0QixDQUFyQixDQUFnRCxDQUFoRCxDQUFuQyxFQUVBLEtBQUtqa0IsSUFBTCxDQUFZLFFBQUEsQ0FBVW5ELFFBQVYsQ0FBb0JnYyxRQUFwQixDQUFaLENBQ0EsS0FBS3AzQixHQUFMLENBQVUsS0FBS3VlLElBQWYsRUFHQSxLQUFLelAsTUFBTCxHQUVBLENBRURrekcsb0JBQW9CM3RJLFNBQXBCLENBQWdDRCxPQUFPaUIsTUFBUCxDQUFleStDLFNBQVN6L0MsU0FBeEIsQ0FBaEMsQ0FDQTJ0SSxvQkFBb0IzdEksU0FBcEIsQ0FBOEJzQyxXQUE5QixDQUE0Q3FySSxtQkFBNUMsQ0FFQUEsb0JBQW9CM3RJLFNBQXBCLENBQThCdWpDLE9BQTlCLENBQXdDLFVBQVksQ0FFbkQsS0FBS2ljLFFBQUwsQ0FBZSxDQUFmLEVBQW1CelksUUFBbkIsQ0FBNEJ4RCxPQUE1QixHQUNBLEtBQUtpYyxRQUFMLENBQWUsQ0FBZixFQUFtQnVELFFBQW5CLENBQTRCeGYsT0FBNUIsR0FFQSxDQUxELENBT0FvcUcsb0JBQW9CM3RJLFNBQXBCLENBQThCeTZCLE1BQTlCLENBQXVDLFVBQVk7RUFJbEQsT0FBUyxLQUFLcTNDLEtBQUwsQ0FBV2p2QyxLQUFYLENBQW1CLEdBQTVCLENBQ0EsT0FBUyxLQUFLaXZDLEtBQUwsQ0FBV2h2QyxNQUFYLENBQW9CLEdBQTdCLENBRUEsYUFBZSxLQUFLb0gsSUFBTCxDQUFVbkQsUUFBVixDQUFtQkssVUFBbkIsQ0FBOEIxUCxRQUE3QyxDQUNBLFVBQVlBLFNBQVM3USxLQUFyQixDQUVBO0VBRUFBLE1BQU8sQ0FBUCxFQUFhK2dGLEVBQWIsQ0FBaUIvZ0YsTUFBTyxDQUFQLEVBQWEsQ0FBRWdoRixFQUFmLENBQW1CaGhGLE1BQU8sQ0FBUCxFQUFhLENBQWIsQ0FDcENBLE1BQU8sQ0FBUCxFQUFhK2dGLEVBQWIsQ0FBaUIvZ0YsTUFBTyxDQUFQLEVBQWFnaEYsRUFBYixDQUFpQmhoRixNQUFPLENBQVAsRUFBYSxDQUFiLENBQ2xDQSxNQUFPLENBQVAsRUFBYSxDQUFFK2dGLEVBQWYsQ0FBbUIvZ0YsTUFBTyxDQUFQLEVBQWFnaEYsRUFBYixDQUFpQmhoRixNQUFPLENBQVAsRUFBYSxDQUFiLENBQ3BDQSxNQUFPLENBQVAsRUFBYSxDQUFFK2dGLEVBQWYsQ0FBbUIvZ0YsTUFBTyxFQUFQLEVBQWMsQ0FBRWdoRixFQUFoQixDQUFvQmhoRixNQUFPLEVBQVAsRUFBYyxDQUFkLENBQ3ZDQSxNQUFPLEVBQVAsRUFBYytnRixFQUFkLENBQWtCL2dGLE1BQU8sRUFBUCxFQUFjLENBQUVnaEYsRUFBaEIsQ0FBb0JoaEYsTUFBTyxFQUFQLEVBQWMsQ0FBZCxDQUV0QzZRLFNBQVMrMkIsV0FBVCxDQUF1QixJQUF2QixDQUVBLEdBQUssS0FBS3paLEtBQUwsR0FBZTV2QyxTQUFwQixDQUFnQyxDQUUvQixLQUFLOGtDLElBQUwsQ0FBVTZZLFFBQVYsQ0FBbUIvTixLQUFuQixDQUF5QjU5QixHQUF6QixDQUE4QixLQUFLNDlCLEtBQW5DLEVBRUEsQ0FKRCxJQUlPLENBRU4sS0FBSzlLLElBQUwsQ0FBVTZZLFFBQVYsQ0FBbUIvTixLQUFuQixDQUF5QnRwQixJQUF6QixDQUErQixLQUFLb21ELEtBQUwsQ0FBVzk4QixLQUExQyxFQUVBLENBRUQsQ0E5QkQsQ0FnQ0E7Ozs7S0FNQSw4QkFBQSxDQUFnQzg4QixLQUFoQyxDQUF1Q3pyQyxJQUF2QyxDQUE2QzJPLEtBQTdDLENBQXFELENBRXBEeUssU0FBUy85QyxJQUFULENBQWUsSUFBZixFQUVBLEtBQUtvd0UsS0FBTCxDQUFhQSxLQUFiLENBQ0EsS0FBS0EsS0FBTCxDQUFXenFDLGlCQUFYLEdBRUEsS0FBS3RQLE1BQUwsQ0FBYys1QyxNQUFNMXpDLFdBQXBCLENBQ0EsS0FBSzBELGdCQUFMLENBQXdCLEtBQXhCLENBRUEsS0FBS2tULEtBQUwsQ0FBYUEsS0FBYixDQUVBLGFBQWUsNEJBQUEsQ0FBOEIzTyxJQUE5QixDQUFmLENBQ0FVLFNBQVNtYSxPQUFULENBQWtCdjRDLEtBQUsrZixFQUFMLENBQVUsR0FBNUIsRUFFQSxLQUFLcTZCLFFBQUwsQ0FBZ0IscUJBQUEsQ0FBdUIsQ0FBRXVSLFVBQVcsSUFBYixDQUFtQjFiLElBQUssS0FBeEIsQ0FBdkIsQ0FBaEIsQ0FDQSxHQUFLLEtBQUs1RCxLQUFMLEdBQWU1dkMsU0FBcEIsQ0FBZ0MsS0FBSzI5QyxRQUFMLENBQWMwQixZQUFkLENBQTZCZ3BFLFlBQTdCLENBRWhDLGFBQWUxbUYsU0FBU3FuQixZQUFULENBQXVCLFVBQXZCLENBQWYsQ0FDQSxXQUFhLGdCQUFBLENBQWtCMTJCLFNBQVNsQyxLQUFULENBQWlCLENBQW5DLENBQWIsQ0FFQXVSLFNBQVNvbkIsWUFBVCxDQUF1QixPQUF2QixDQUFnQyxtQkFBQSxDQUFxQnZKLE1BQXJCLENBQTZCLENBQTdCLENBQWhDLEVBRUEsS0FBS2o1QixHQUFMLENBQVUsUUFBQSxDQUFVb2IsUUFBVixDQUFvQixLQUFLZ2MsUUFBekIsQ0FBVixFQUVBLEtBQUt0b0IsTUFBTCxHQUVBLENBRURtekcsc0JBQXNCNXRJLFNBQXRCLENBQWtDRCxPQUFPaUIsTUFBUCxDQUFleStDLFNBQVN6L0MsU0FBeEIsQ0FBbEMsQ0FDQTR0SSxzQkFBc0I1dEksU0FBdEIsQ0FBZ0NzQyxXQUFoQyxDQUE4Q3NySSxxQkFBOUMsQ0FFQUEsc0JBQXNCNXRJLFNBQXRCLENBQWdDdWpDLE9BQWhDLENBQTBDLFVBQVksQ0FFckQsS0FBS2ljLFFBQUwsQ0FBZSxDQUFmLEVBQW1CelksUUFBbkIsQ0FBNEJ4RCxPQUE1QixHQUNBLEtBQUtpYyxRQUFMLENBQWUsQ0FBZixFQUFtQnVELFFBQW5CLENBQTRCeGYsT0FBNUIsR0FFQSxDQUxELENBT0FxcUcsc0JBQXNCNXRJLFNBQXRCLENBQWdDeTZCLE1BQWhDLENBQXlDLFVBQVksQ0FFcEQsV0FBYSxXQUFBLEVBQWIsQ0FFQSxXQUFhLFNBQUEsRUFBYixDQUNBLFdBQWEsU0FBQSxFQUFiLENBRUEsc0JBQU8sRUFBa0IsQ0FFeEIsU0FBVyxLQUFLK2tCLFFBQUwsQ0FBZSxDQUFmLENBQVgsQ0FFQSxHQUFLLEtBQUt4SyxLQUFMLEdBQWU1dkMsU0FBcEIsQ0FBZ0MsQ0FFL0IsS0FBSzI5QyxRQUFMLENBQWMvTixLQUFkLENBQW9CNTlCLEdBQXBCLENBQXlCLEtBQUs0OUIsS0FBOUIsRUFFQSxDQUpELElBSU8sQ0FFTixXQUFhZ1UsS0FBS2ppQixRQUFMLENBQWNxbkIsWUFBZCxDQUE0QixPQUE1QixDQUFiLENBRUEvWCxPQUFPM3FCLElBQVAsQ0FBYSxLQUFLb21ELEtBQUwsQ0FBVzk4QixLQUF4QixFQUNBc0IsT0FBTzVxQixJQUFQLENBQWEsS0FBS29tRCxLQUFMLENBQVd0M0IsV0FBeEIsRUFFQSxJQUFNLE1BQVEsQ0FBUixDQUFXanhDLEVBQUlxN0MsT0FBT3B2QixLQUE1QixDQUFtQzF1QixFQUFJeUMsQ0FBdkMsQ0FBMEN6QyxHQUExQyxDQUFpRCxDQUVoRCxVQUFjQSxFQUFNeUMsRUFBSSxDQUFaLENBQW9COHNDLE1BQXBCLENBQTZCQyxNQUF6QyxDQUVBc08sT0FBT2p2QixNQUFQLENBQWU3dUIsQ0FBZixDQUFrQmt1QyxNQUFNejNCLENBQXhCLENBQTJCeTNCLE1BQU01c0MsQ0FBakMsQ0FBb0M0c0MsTUFBTTFyQyxDQUExQyxFQUVBLENBRURzN0MsT0FBTzZKLFdBQVAsQ0FBcUIsSUFBckIsQ0FFQSxDQUVEekYsS0FBSy8xQixNQUFMLENBQWE0RSxPQUFPOEgscUJBQVAsQ0FBOEIsS0FBS215QyxLQUFMLENBQVcxekMsV0FBekMsRUFBdURyUixNQUF2RCxFQUFiLEVBRUEsQ0E3QkQsQ0ErQkEsQ0F0Q3dDLEVBQXpDLENBd0NBOztLQUlBLG1CQUFBLENBQXFCc1osSUFBckIsQ0FBMkJxeEUsU0FBM0IsQ0FBc0NyaEUsTUFBdEMsQ0FBOENDLE1BQTlDLENBQXVELENBRXREalEsS0FBT0EsTUFBUSxFQUFmLENBQ0FxeEUsVUFBWUEsV0FBYSxFQUF6QixDQUNBcmhFLE9BQVMsU0FBQSxDQUFXQSxTQUFXanhDLFNBQVgsQ0FBdUJpeEMsTUFBdkIsQ0FBZ0MsUUFBM0MsQ0FBVCxDQUNBQyxPQUFTLFNBQUEsQ0FBV0EsU0FBV2x4QyxTQUFYLENBQXVCa3hDLE1BQXZCLENBQWdDLFFBQTNDLENBQVQsQ0FFQSxXQUFhb2hFLFVBQVksQ0FBekIsQ0FDQSxTQUFXcnhFLEtBQU9xeEUsU0FBbEIsQ0FDQSxhQUFlcnhFLEtBQU8sQ0FBdEIsQ0FFQSxhQUFlLEVBQWYsQ0FBbUJ1ZSxPQUFTLEVBQTVCLENBRUEsSUFBTSxNQUFRLENBQVIsQ0FBV2xpQyxFQUFJLENBQWYsQ0FBa0JFLEVBQUksQ0FBRTBqQixRQUE5QixDQUF3Q3gvQixHQUFLNHdHLFNBQTdDLENBQXdENXdHLElBQU04YixHQUFLNU4sSUFBbkUsQ0FBMEUsQ0FFekVpeUIsU0FBU2hoQyxJQUFULENBQWUsQ0FBRXFnQyxRQUFqQixDQUEyQixDQUEzQixDQUE4QjFqQixDQUE5QixDQUFpQzBqQixRQUFqQyxDQUEyQyxDQUEzQyxDQUE4QzFqQixDQUE5QyxFQUNBcWtCLFNBQVNoaEMsSUFBVCxDQUFlMmMsQ0FBZixDQUFrQixDQUFsQixDQUFxQixDQUFFMGpCLFFBQXZCLENBQWlDMWpCLENBQWpDLENBQW9DLENBQXBDLENBQXVDMGpCLFFBQXZDLEVBRUEsVUFBWXgvQixJQUFNNm5CLE1BQU4sQ0FBZTBuQixNQUFmLENBQXdCQyxNQUFwQyxDQUVBdEIsTUFBTTNtQixPQUFOLENBQWV1MkIsTUFBZixDQUF1QmxpQyxDQUF2QixFQUE0QkEsR0FBSyxDQUFMLENBQzVCc3lCLE1BQU0zbUIsT0FBTixDQUFldTJCLE1BQWYsQ0FBdUJsaUMsQ0FBdkIsRUFBNEJBLEdBQUssQ0FBTCxDQUM1QnN5QixNQUFNM21CLE9BQU4sQ0FBZXUyQixNQUFmLENBQXVCbGlDLENBQXZCLEVBQTRCQSxHQUFLLENBQUwsQ0FDNUJzeUIsTUFBTTNtQixPQUFOLENBQWV1MkIsTUFBZixDQUF1QmxpQyxDQUF2QixFQUE0QkEsR0FBSyxDQUFMLENBRTVCLENBRUQsYUFBZSxrQkFBQSxFQUFmLENBQ0Fxa0IsU0FBU29uQixZQUFULENBQXVCLFVBQXZCLENBQW1DLDBCQUFBLENBQTRCbG5CLFFBQTVCLENBQXNDLENBQXRDLENBQW5DLEVBQ0FGLFNBQVNvbkIsWUFBVCxDQUF1QixPQUF2QixDQUFnQywwQkFBQSxDQUE0QnZKLE1BQTVCLENBQW9DLENBQXBDLENBQWhDLEVBRUEsYUFBZSxxQkFBQSxDQUF1QixDQUFFSCxhQUFjZ3BFLFlBQWhCLENBQXZCLENBQWYsQ0FFQS90QixhQUFhaCtGLElBQWIsQ0FBbUIsSUFBbkIsQ0FBeUJxbEMsUUFBekIsQ0FBbUNnYyxRQUFuQyxFQUVBLENBRUQ4cUYsV0FBVzd0SSxTQUFYLENBQXVCRCxPQUFPaUIsTUFBUCxDQUFlMCtGLGFBQWExL0YsU0FBNUIsQ0FBdkIsQ0FDQTZ0SSxXQUFXN3RJLFNBQVgsQ0FBcUJzQyxXQUFyQixDQUFtQ3VySSxVQUFuQyxDQUVBOzs7O0tBTUEsd0JBQUEsQ0FBMEJydUcsTUFBMUIsQ0FBa0NzdUcsT0FBbEMsQ0FBMkNDLE9BQTNDLENBQW9EcjJCLFNBQXBELENBQStEcmhFLE1BQS9ELENBQXVFQyxNQUF2RSxDQUFnRixDQUUvRTlXLE9BQVNBLFFBQVUsRUFBbkIsQ0FDQXN1RyxRQUFVQSxTQUFXLEVBQXJCLENBQ0FDLFFBQVVBLFNBQVcsQ0FBckIsQ0FDQXIyQixVQUFZQSxXQUFhLEVBQXpCLENBQ0FyaEUsT0FBUyxTQUFBLENBQVdBLFNBQVdqeEMsU0FBWCxDQUF1Qml4QyxNQUF2QixDQUFnQyxRQUEzQyxDQUFULENBQ0FDLE9BQVMsU0FBQSxDQUFXQSxTQUFXbHhDLFNBQVgsQ0FBdUJreEMsTUFBdkIsQ0FBZ0MsUUFBM0MsQ0FBVCxDQUVBLGFBQWUsRUFBZixDQUNBLFdBQWEsRUFBYixDQUVBLEtBQUEsQ0FBTzVsQixDQUFQLENBQ0EsS0FBQSxDQUFPNXBCLENBQVAsQ0FBVTRiLENBQVYsQ0FBYW5GLENBQWIsQ0FBZ0J5M0IsS0FBaEIsQ0FFQTtFQUVBLElBQU1sdUMsRUFBSSxDQUFWLENBQWFBLEdBQUtnbkksT0FBbEIsQ0FBMkJobkksR0FBM0IsQ0FBa0MsQ0FFakNxUyxFQUFNclMsRUFBSWduSSxPQUFOLEVBQW9CbmxJLEtBQUsrZixFQUFMLENBQVUsQ0FBOUIsQ0FBSixDQUVBclAsRUFBSTFRLEtBQUtrbUIsR0FBTCxDQUFVMVYsQ0FBVixFQUFnQnFtQixNQUFwQixDQUNBOU8sRUFBSS9uQixLQUFLaW1CLEdBQUwsQ0FBVXpWLENBQVYsRUFBZ0JxbUIsTUFBcEIsQ0FFQXlILFNBQVNoaEMsSUFBVCxDQUFlLENBQWYsQ0FBa0IsQ0FBbEIsQ0FBcUIsQ0FBckIsRUFDQWdoQyxTQUFTaGhDLElBQVQsQ0FBZW9ULENBQWYsQ0FBa0IsQ0FBbEIsQ0FBcUJxWCxDQUFyQixFQUVBc2tCLE1BQVVsdUMsRUFBSSxDQUFOLENBQVl1dkMsTUFBWixDQUFxQkMsTUFBN0IsQ0FFQXNPLE9BQU8zK0MsSUFBUCxDQUFhK3VDLE1BQU16M0IsQ0FBbkIsQ0FBc0J5M0IsTUFBTTVzQyxDQUE1QixDQUErQjRzQyxNQUFNMXJDLENBQXJDLEVBQ0FzN0MsT0FBTzMrQyxJQUFQLENBQWErdUMsTUFBTXozQixDQUFuQixDQUFzQnkzQixNQUFNNXNDLENBQTVCLENBQStCNHNDLE1BQU0xckMsQ0FBckMsRUFFQSxDQUVEO0VBRUEsSUFBTXhDLEVBQUksQ0FBVixDQUFhQSxHQUFLaW5JLE9BQWxCLENBQTJCam5JLEdBQTNCLENBQWtDLENBRWpDa3VDLE1BQVVsdUMsRUFBSSxDQUFOLENBQVl1dkMsTUFBWixDQUFxQkMsTUFBN0IsQ0FFQS80QixFQUFJaWlCLE9BQVdBLE9BQVN1dUcsT0FBVCxDQUFtQmpuSSxDQUFsQyxDQUVBLElBQU00YixFQUFJLENBQVYsQ0FBYUEsRUFBSWcxRixTQUFqQixDQUE0QmgxRixHQUE1QixDQUFtQztFQUlsQ3ZKLEVBQU11SixFQUFJZzFGLFNBQU4sRUFBc0IvdUcsS0FBSytmLEVBQUwsQ0FBVSxDQUFoQyxDQUFKLENBRUFyUCxFQUFJMVEsS0FBS2ttQixHQUFMLENBQVUxVixDQUFWLEVBQWdCb0UsQ0FBcEIsQ0FDQW1ULEVBQUkvbkIsS0FBS2ltQixHQUFMLENBQVV6VixDQUFWLEVBQWdCb0UsQ0FBcEIsQ0FFQTBwQixTQUFTaGhDLElBQVQsQ0FBZW9ULENBQWYsQ0FBa0IsQ0FBbEIsQ0FBcUJxWCxDQUFyQixFQUNBazBCLE9BQU8zK0MsSUFBUCxDQUFhK3VDLE1BQU16M0IsQ0FBbkIsQ0FBc0J5M0IsTUFBTTVzQyxDQUE1QixDQUErQjRzQyxNQUFNMXJDLENBQXJDLEVBRUE7RUFFQTZQLEVBQU0sQ0FBRXVKLEVBQUksQ0FBTixFQUFZZzFGLFNBQWQsRUFBOEIvdUcsS0FBSytmLEVBQUwsQ0FBVSxDQUF4QyxDQUFKLENBRUFyUCxFQUFJMVEsS0FBS2ttQixHQUFMLENBQVUxVixDQUFWLEVBQWdCb0UsQ0FBcEIsQ0FDQW1ULEVBQUkvbkIsS0FBS2ltQixHQUFMLENBQVV6VixDQUFWLEVBQWdCb0UsQ0FBcEIsQ0FFQTBwQixTQUFTaGhDLElBQVQsQ0FBZW9ULENBQWYsQ0FBa0IsQ0FBbEIsQ0FBcUJxWCxDQUFyQixFQUNBazBCLE9BQU8zK0MsSUFBUCxDQUFhK3VDLE1BQU16M0IsQ0FBbkIsQ0FBc0J5M0IsTUFBTTVzQyxDQUE1QixDQUErQjRzQyxNQUFNMXJDLENBQXJDLEVBRUEsQ0FFRCxDQUVELGFBQWUsa0JBQUEsRUFBZixDQUNBeTlCLFNBQVNvbkIsWUFBVCxDQUF1QixVQUF2QixDQUFtQywwQkFBQSxDQUE0QmxuQixRQUE1QixDQUFzQyxDQUF0QyxDQUFuQyxFQUNBRixTQUFTb25CLFlBQVQsQ0FBdUIsT0FBdkIsQ0FBZ0MsMEJBQUEsQ0FBNEJ2SixNQUE1QixDQUFvQyxDQUFwQyxDQUFoQyxFQUVBLGFBQWUscUJBQUEsQ0FBdUIsQ0FBRUgsYUFBY2dwRSxZQUFoQixDQUF2QixDQUFmLENBRUEvdEIsYUFBYWgrRixJQUFiLENBQW1CLElBQW5CLENBQXlCcWxDLFFBQXpCLENBQW1DZ2MsUUFBbkMsRUFFQSxDQUVEaXJGLGdCQUFnQmh1SSxTQUFoQixDQUE0QkQsT0FBT2lCLE1BQVAsQ0FBZTArRixhQUFhMS9GLFNBQTVCLENBQTVCLENBQ0FndUksZ0JBQWdCaHVJLFNBQWhCLENBQTBCc0MsV0FBMUIsQ0FBd0MwckksZUFBeEMsQ0FFQTs7O0tBS0EsMEJBQUEsQ0FBNEIxbkksTUFBNUIsQ0FBb0MrL0IsSUFBcEMsQ0FBMENzTyxHQUExQyxDQUErQ3lmLFNBQS9DLENBQTJEO0VBSTFELEtBQUs5dEQsTUFBTCxDQUFjQSxNQUFkLENBRUEsS0FBSysvQixJQUFMLENBQWNBLE9BQVNqaEMsU0FBWCxDQUF5QmloQyxJQUF6QixDQUFnQyxDQUE1QyxDQUVBLFVBQWNzTyxNQUFRdnZDLFNBQVYsQ0FBd0J1dkMsR0FBeEIsQ0FBOEIsUUFBMUMsQ0FFQSxVQUFjeWYsWUFBY2h2RCxTQUFoQixDQUE4Qmd2RCxTQUE5QixDQUEwQyxDQUF0RCxDQUVBO0VBRUEsYUFBZSxDQUFmLENBRUEsZ0JBQWtCLEtBQUs5dEQsTUFBTCxDQUFZeWdDLFFBQTlCLENBRUEsR0FBSzRsRyxhQUFlQSxZQUFZM2xHLFVBQWhDLENBQTZDLENBRTVDNGxHLFNBQVdELFlBQVk5bkYsS0FBWixDQUFrQnArQyxNQUE3QixDQUVBLENBSkQsSUFJTyxDQUVOc1YsUUFBUTZQLElBQVIsQ0FBYyxvR0FBZCxFQUVBLENBRUQ7RUFFQSxhQUFlLGtCQUFBLEVBQWYsQ0FFQSxjQUFnQiwwQkFBQSxDQUE0QmdoSCxTQUFXLENBQVgsQ0FBZSxDQUEzQyxDQUE4QyxDQUE5QyxDQUFoQixDQUVBN2xHLFNBQVNvbkIsWUFBVCxDQUF1QixVQUF2QixDQUFtQy9ILFNBQW5DLEVBRUFzNUMsYUFBYWgrRixJQUFiLENBQW1CLElBQW5CLENBQXlCcWxDLFFBQXpCLENBQW1DLHFCQUFBLENBQXVCLENBQUVpTyxNQUFPQSxLQUFULENBQWdCb2YsVUFBV3Z4QixLQUEzQixDQUF2QixDQUFuQyxFQUVBO0VBRUEsS0FBS2YsZ0JBQUwsQ0FBd0IsS0FBeEIsQ0FDQSxLQUFLckgsTUFBTCxHQUVBLENBRUR3ekcsa0JBQWtCanVJLFNBQWxCLENBQThCRCxPQUFPaUIsTUFBUCxDQUFlMCtGLGFBQWExL0YsU0FBNUIsQ0FBOUIsQ0FDQWl1SSxrQkFBa0JqdUksU0FBbEIsQ0FBNEJzQyxXQUE1QixDQUEwQzJySSxpQkFBMUMsQ0FFQUEsa0JBQWtCanVJLFNBQWxCLENBQTRCeTZCLE1BQTVCLENBQXVDLFVBQVksQ0FFbEQsT0FBUyxXQUFBLEVBQVQsQ0FDQSxPQUFTLFdBQUEsRUFBVCxDQUNBLGlCQUFtQixXQUFBLEVBQW5CLENBRUEsc0JBQU8sRUFBa0IsQ0FFeEIsS0FBS24wQixNQUFMLENBQVkrZ0MsaUJBQVosQ0FBK0IsSUFBL0IsRUFFQXlELGFBQWE5SyxlQUFiLENBQThCLEtBQUsxNUIsTUFBTCxDQUFZODNCLFdBQTFDLEVBRUEsZ0JBQWtCLEtBQUs5M0IsTUFBTCxDQUFZODNCLFdBQTlCLENBRUEsYUFBZSxLQUFLMkksUUFBTCxDQUFjSyxVQUFkLENBQXlCMVAsUUFBeEMsQ0FFQTtFQUVBLGdCQUFrQixLQUFLcHhCLE1BQUwsQ0FBWXlnQyxRQUE5QixDQUVBLGFBQWU0bEcsWUFBWTFsRyxRQUEzQixDQUVBLFVBQVkwbEcsWUFBWTluRixLQUF4QixDQUVBLFFBQVUsQ0FBVixDQUVBLElBQU0sTUFBUSxDQUFSLENBQVd0N0MsRUFBSXM3QyxNQUFNcCtDLE1BQTNCLENBQW1DSyxFQUFJeUMsQ0FBdkMsQ0FBMEN6QyxHQUExQyxDQUFpRCxDQUVoRCxTQUFXKzlDLE1BQU8vOUMsQ0FBUCxDQUFYLENBRUEsV0FBYWcvQyxLQUFLNW1CLE1BQWxCLENBRUFsUixHQUFHdEMsSUFBSCxDQUFTdWIsU0FBVTZlLEtBQUt0OEMsQ0FBZixDQUFULEVBQ0VtaUIsR0FERixDQUNPc2IsU0FBVTZlLEtBQUt4OEMsQ0FBZixDQURQLEVBRUVxaUIsR0FGRixDQUVPc2IsU0FBVTZlLEtBQUs3N0MsQ0FBZixDQUZQLEVBR0VxaUIsWUFIRixDQUdnQixDQUhoQixFQUlFb0osWUFKRixDQUlnQjBJLFdBSmhCLEVBTUFuUSxHQUFHdkMsSUFBSCxDQUFTd1QsTUFBVCxFQUFrQjNTLFlBQWxCLENBQWdDdWUsWUFBaEMsRUFBK0N6ZCxTQUEvQyxHQUEyRGpCLGNBQTNELENBQTJFLEtBQUtpYSxJQUFoRixFQUF1RjFhLEdBQXZGLENBQTRGcUMsRUFBNUYsRUFFQTBKLFNBQVMvQixNQUFULENBQWlCOHpCLEdBQWpCLENBQXNCejdCLEdBQUczVSxDQUF6QixDQUE0QjJVLEdBQUduRSxDQUEvQixDQUFrQ21FLEdBQUcwQyxDQUFyQyxFQUVBKzRCLElBQU1BLElBQU0sQ0FBWixDQUVBL3hCLFNBQVMvQixNQUFULENBQWlCOHpCLEdBQWpCLENBQXNCeDdCLEdBQUc1VSxDQUF6QixDQUE0QjRVLEdBQUdwRSxDQUEvQixDQUFrQ29FLEdBQUd5QyxDQUFyQyxFQUVBKzRCLElBQU1BLElBQU0sQ0FBWixDQUVBLENBRUQveEIsU0FBUysyQixXQUFULENBQXVCLElBQXZCLENBRUEsQ0E5Q0QsQ0FnREEsQ0F0RHNDLEVBQXZDLENBd0RBOzs7O0tBTUEsK0JBQUEsQ0FBaUNxakIsS0FBakMsQ0FBd0N6ckMsSUFBeEMsQ0FBOEMyTyxLQUE5QyxDQUFzRCxDQUVyRHlLLFNBQVMvOUMsSUFBVCxDQUFlLElBQWYsRUFFQSxLQUFLb3dFLEtBQUwsQ0FBYUEsS0FBYixDQUNBLEtBQUtBLEtBQUwsQ0FBV3pxQyxpQkFBWCxHQUVBLEtBQUt0UCxNQUFMLENBQWMrNUMsTUFBTTF6QyxXQUFwQixDQUNBLEtBQUswRCxnQkFBTCxDQUF3QixLQUF4QixDQUVBLEtBQUtrVCxLQUFMLENBQWFBLEtBQWIsQ0FFQSxHQUFLM08sT0FBU2poQyxTQUFkLENBQTBCaWhDLEtBQU8sQ0FBUCxDQUUxQixhQUFlLGtCQUFBLEVBQWYsQ0FDQVUsU0FBU29uQixZQUFULENBQXVCLFVBQXZCLENBQW1DLDBCQUFBLENBQTRCLENBQzlELENBQUU5bkIsSUFENEQsQ0FDdERBLElBRHNELENBQ2hELENBRGdELENBRTlEQSxJQUY4RCxDQUV4REEsSUFGd0QsQ0FFbEQsQ0FGa0QsQ0FHOURBLElBSDhELENBR3hELENBQUVBLElBSHNELENBR2hELENBSGdELENBSTlELENBQUVBLElBSjRELENBSXRELENBQUVBLElBSm9ELENBSTlDLENBSjhDLENBSzlELENBQUVBLElBTDRELENBS3REQSxJQUxzRCxDQUtoRCxDQUxnRCxDQUE1QixDQU1oQyxDQU5nQyxDQUFuQyxFQVFBLGFBQWUscUJBQUEsQ0FBdUIsQ0FBRXVTLElBQUssS0FBUCxDQUF2QixDQUFmLENBRUEsS0FBS3MxRixVQUFMLENBQWtCLFFBQUEsQ0FBVW5uRyxRQUFWLENBQW9CZ2MsUUFBcEIsQ0FBbEIsQ0FDQSxLQUFLcDNCLEdBQUwsQ0FBVSxLQUFLdWlILFVBQWYsRUFFQW5uRyxTQUFXLGtCQUFBLEVBQVgsQ0FDQUEsU0FBU29uQixZQUFULENBQXVCLFVBQXZCLENBQW1DLDBCQUFBLENBQTRCLENBQUUsQ0FBRixDQUFLLENBQUwsQ0FBUSxDQUFSLENBQVcsQ0FBWCxDQUFjLENBQWQsQ0FBaUIsQ0FBakIsQ0FBNUIsQ0FBa0QsQ0FBbEQsQ0FBbkMsRUFFQSxLQUFLZ2dGLFVBQUwsQ0FBa0IsUUFBQSxDQUFVcG5HLFFBQVYsQ0FBb0JnYyxRQUFwQixDQUFsQixDQUNBLEtBQUtwM0IsR0FBTCxDQUFVLEtBQUt3aUgsVUFBZixFQUVBLEtBQUsxekcsTUFBTCxHQUVBLENBRUQyekcsdUJBQXVCcHVJLFNBQXZCLENBQW1DRCxPQUFPaUIsTUFBUCxDQUFleStDLFNBQVN6L0MsU0FBeEIsQ0FBbkMsQ0FDQW91SSx1QkFBdUJwdUksU0FBdkIsQ0FBaUNzQyxXQUFqQyxDQUErQzhySSxzQkFBL0MsQ0FFQUEsdUJBQXVCcHVJLFNBQXZCLENBQWlDdWpDLE9BQWpDLENBQTJDLFVBQVksQ0FFdEQsS0FBSzJxRyxVQUFMLENBQWdCbm5HLFFBQWhCLENBQXlCeEQsT0FBekIsR0FDQSxLQUFLMnFHLFVBQUwsQ0FBZ0JuckYsUUFBaEIsQ0FBeUJ4ZixPQUF6QixHQUNBLEtBQUs0cUcsVUFBTCxDQUFnQnBuRyxRQUFoQixDQUF5QnhELE9BQXpCLEdBQ0EsS0FBSzRxRyxVQUFMLENBQWdCcHJGLFFBQWhCLENBQXlCeGYsT0FBekIsR0FFQSxDQVBELENBU0E2cUcsdUJBQXVCcHVJLFNBQXZCLENBQWlDeTZCLE1BQWpDLENBQTBDLFVBQVksQ0FFckQsT0FBUyxXQUFBLEVBQVQsQ0FDQSxPQUFTLFdBQUEsRUFBVCxDQUNBLE9BQVMsV0FBQSxFQUFULENBRUEsc0JBQU8sRUFBa0IsQ0FFeEJ6TSxHQUFHMlIscUJBQUgsQ0FBMEIsS0FBS215QyxLQUFMLENBQVcxekMsV0FBckMsRUFDQW5RLEdBQUcwUixxQkFBSCxDQUEwQixLQUFLbXlDLEtBQUwsQ0FBV3BsRSxNQUFYLENBQWtCMHhCLFdBQTVDLEVBQ0FvOUUsR0FBR3Z2RixVQUFILENBQWVnQyxFQUFmLENBQW1CRCxFQUFuQixFQUVBLEtBQUtrZ0gsVUFBTCxDQUFnQmo3RyxNQUFoQixDQUF3QnVvRixFQUF4QixFQUVBLEdBQUssS0FBS3htRSxLQUFMLEdBQWU1dkMsU0FBcEIsQ0FBZ0MsQ0FFL0IsS0FBSzhvSSxVQUFMLENBQWdCbnJGLFFBQWhCLENBQXlCL04sS0FBekIsQ0FBK0I1OUIsR0FBL0IsQ0FBb0MsS0FBSzQ5QixLQUF6QyxFQUNBLEtBQUttNUYsVUFBTCxDQUFnQnByRixRQUFoQixDQUF5Qi9OLEtBQXpCLENBQStCNTlCLEdBQS9CLENBQW9DLEtBQUs0OUIsS0FBekMsRUFFQSxDQUxELElBS08sQ0FFTixLQUFLazVGLFVBQUwsQ0FBZ0JuckYsUUFBaEIsQ0FBeUIvTixLQUF6QixDQUErQnRwQixJQUEvQixDQUFxQyxLQUFLb21ELEtBQUwsQ0FBVzk4QixLQUFoRCxFQUNBLEtBQUttNUYsVUFBTCxDQUFnQnByRixRQUFoQixDQUF5Qi9OLEtBQXpCLENBQStCdHBCLElBQS9CLENBQXFDLEtBQUtvbUQsS0FBTCxDQUFXOThCLEtBQWhELEVBRUEsQ0FFRCxLQUFLbTVGLFVBQUwsQ0FBZ0JsN0csTUFBaEIsQ0FBd0J1b0YsRUFBeEIsRUFDQSxLQUFLMnlCLFVBQUwsQ0FBZ0IxM0csS0FBaEIsQ0FBc0IvRixDQUF0QixDQUEwQjhxRixHQUFHLzBHLE1BQUgsRUFBMUIsQ0FFQSxDQXZCRCxDQXlCQSxDQS9CeUMsRUFBMUMsQ0FpQ0E7Ozs7Ozs7O0tBVUEscUJBQUEsQ0FBdUJ5M0IsTUFBdkIsQ0FBZ0MsQ0FFL0IsYUFBZSxrQkFBQSxFQUFmLENBQ0EsYUFBZSxxQkFBQSxDQUF1QixDQUFFOFcsTUFBTyxRQUFULENBQW1CeVAsYUFBY2lwRSxVQUFqQyxDQUF2QixDQUFmLENBRUEsYUFBZSxFQUFmLENBQ0EsV0FBYSxFQUFiLENBRUEsYUFBZSxFQUFmLENBRUE7RUFFQSxpQkFBbUIsU0FBQSxDQUFXLFFBQVgsQ0FBbkIsQ0FDQSxjQUFnQixTQUFBLENBQVcsUUFBWCxDQUFoQixDQUNBLFlBQWMsU0FBQSxDQUFXLFFBQVgsQ0FBZCxDQUNBLGdCQUFrQixTQUFBLENBQVcsUUFBWCxDQUFsQixDQUNBLGVBQWlCLFNBQUEsQ0FBVyxRQUFYLENBQWpCLENBRUE7RUFFQTJnQixRQUFTLElBQVQsQ0FBZSxJQUFmLENBQXFCQyxZQUFyQixFQUNBRCxRQUFTLElBQVQsQ0FBZSxJQUFmLENBQXFCQyxZQUFyQixFQUNBRCxRQUFTLElBQVQsQ0FBZSxJQUFmLENBQXFCQyxZQUFyQixFQUNBRCxRQUFTLElBQVQsQ0FBZSxJQUFmLENBQXFCQyxZQUFyQixFQUVBO0VBRUFELFFBQVMsSUFBVCxDQUFlLElBQWYsQ0FBcUJDLFlBQXJCLEVBQ0FELFFBQVMsSUFBVCxDQUFlLElBQWYsQ0FBcUJDLFlBQXJCLEVBQ0FELFFBQVMsSUFBVCxDQUFlLElBQWYsQ0FBcUJDLFlBQXJCLEVBQ0FELFFBQVMsSUFBVCxDQUFlLElBQWYsQ0FBcUJDLFlBQXJCLEVBRUE7RUFFQUQsUUFBUyxJQUFULENBQWUsSUFBZixDQUFxQkMsWUFBckIsRUFDQUQsUUFBUyxJQUFULENBQWUsSUFBZixDQUFxQkMsWUFBckIsRUFDQUQsUUFBUyxJQUFULENBQWUsSUFBZixDQUFxQkMsWUFBckIsRUFDQUQsUUFBUyxJQUFULENBQWUsSUFBZixDQUFxQkMsWUFBckIsRUFFQTtFQUVBRCxRQUFTLEdBQVQsQ0FBYyxJQUFkLENBQW9CRSxTQUFwQixFQUNBRixRQUFTLEdBQVQsQ0FBYyxJQUFkLENBQW9CRSxTQUFwQixFQUNBRixRQUFTLEdBQVQsQ0FBYyxJQUFkLENBQW9CRSxTQUFwQixFQUNBRixRQUFTLEdBQVQsQ0FBYyxJQUFkLENBQW9CRSxTQUFwQixFQUVBO0VBRUFGLFFBQVMsSUFBVCxDQUFlLElBQWYsQ0FBcUJHLE9BQXJCLEVBQ0FILFFBQVMsSUFBVCxDQUFlLElBQWYsQ0FBcUJHLE9BQXJCLEVBQ0FILFFBQVMsSUFBVCxDQUFlLElBQWYsQ0FBcUJHLE9BQXJCLEVBRUE7RUFFQUgsUUFBUyxHQUFULENBQWMsR0FBZCxDQUFtQkksV0FBbkIsRUFDQUosUUFBUyxHQUFULENBQWMsR0FBZCxDQUFtQkssVUFBbkIsRUFFQTtFQUVBTCxRQUFTLEtBQVQsQ0FBZ0IsS0FBaEIsQ0FBdUJLLFVBQXZCLEVBQ0FMLFFBQVMsS0FBVCxDQUFnQixLQUFoQixDQUF1QkssVUFBdkIsRUFFQUwsUUFBUyxLQUFULENBQWdCLEtBQWhCLENBQXVCSyxVQUF2QixFQUNBTCxRQUFTLEtBQVQsQ0FBZ0IsS0FBaEIsQ0FBdUJLLFVBQXZCLEVBRUEsZ0JBQUEsQ0FBa0JsbEksQ0FBbEIsQ0FBcUJGLENBQXJCLENBQXdCMHJDLEtBQXhCLENBQWdDLENBRS9CMjVGLFNBQVVubEksQ0FBVixDQUFhd3JDLEtBQWIsRUFDQTI1RixTQUFVcmxJLENBQVYsQ0FBYTByQyxLQUFiLEVBRUEsQ0FFRCxpQkFBQSxDQUFtQnRtQyxFQUFuQixDQUF1QnNtQyxLQUF2QixDQUErQixDQUU5Qi9OLFNBQVNoaEMsSUFBVCxDQUFlLENBQWYsQ0FBa0IsQ0FBbEIsQ0FBcUIsQ0FBckIsRUFDQTIrQyxPQUFPMytDLElBQVAsQ0FBYSt1QyxNQUFNejNCLENBQW5CLENBQXNCeTNCLE1BQU01c0MsQ0FBNUIsQ0FBK0I0c0MsTUFBTTFyQyxDQUFyQyxFQUVBLEdBQUtzbEksU0FBVWxnSSxFQUFWLElBQW1CdEosU0FBeEIsQ0FBb0MsQ0FFbkN3cEksU0FBVWxnSSxFQUFWLEVBQWlCLEVBQWpCLENBRUEsQ0FFRGtnSSxTQUFVbGdJLEVBQVYsRUFBZXpJLElBQWYsQ0FBdUJnaEMsU0FBU3hnQyxNQUFULENBQWtCLENBQXBCLENBQTBCLENBQS9DLEVBRUEsQ0FFRHNnQyxTQUFTb25CLFlBQVQsQ0FBdUIsVUFBdkIsQ0FBbUMsMEJBQUEsQ0FBNEJsbkIsUUFBNUIsQ0FBc0MsQ0FBdEMsQ0FBbkMsRUFDQUYsU0FBU29uQixZQUFULENBQXVCLE9BQXZCLENBQWdDLDBCQUFBLENBQTRCdkosTUFBNUIsQ0FBb0MsQ0FBcEMsQ0FBaEMsRUFFQTg2QyxhQUFhaCtGLElBQWIsQ0FBbUIsSUFBbkIsQ0FBeUJxbEMsUUFBekIsQ0FBbUNnYyxRQUFuQyxFQUVBLEtBQUs3a0IsTUFBTCxDQUFjQSxNQUFkLENBQ0EsR0FBSyxLQUFLQSxNQUFMLENBQVl1bEIsc0JBQWpCLENBQTBDLEtBQUt2bEIsTUFBTCxDQUFZdWxCLHNCQUFaLEdBRTFDLEtBQUsxckIsTUFBTCxDQUFjbUcsT0FBT0UsV0FBckIsQ0FDQSxLQUFLMEQsZ0JBQUwsQ0FBd0IsS0FBeEIsQ0FFQSxLQUFLOHNHLFFBQUwsQ0FBZ0JBLFFBQWhCLENBRUEsS0FBS24wRyxNQUFMLEdBRUEsQ0FFRG8wRyxhQUFhN3VJLFNBQWIsQ0FBeUJELE9BQU9pQixNQUFQLENBQWUwK0YsYUFBYTEvRixTQUE1QixDQUF6QixDQUNBNnVJLGFBQWE3dUksU0FBYixDQUF1QnNDLFdBQXZCLENBQXFDdXNJLFlBQXJDLENBRUFBLGFBQWE3dUksU0FBYixDQUF1Qnk2QixNQUF2QixDQUFnQyxVQUFZLENBRTNDLFlBQUEsQ0FBY20wRyxRQUFkLENBRUEsV0FBYSxXQUFBLEVBQWIsQ0FDQSxXQUFhLFVBQUEsRUFBYixDQUVBLGlCQUFBLENBQW1CbDdILEtBQW5CLENBQTBCMkYsQ0FBMUIsQ0FBNkJ3USxDQUE3QixDQUFnQzZHLENBQWhDLENBQW9DLENBRW5DbUgsT0FBT3pnQixHQUFQLENBQVlpQyxDQUFaLENBQWV3USxDQUFmLENBQWtCNkcsQ0FBbEIsRUFBc0IyTixTQUF0QixDQUFpQ0gsTUFBakMsRUFFQSxXQUFhMHdHLFNBQVVsN0gsS0FBVixDQUFiLENBRUEsR0FBS3N5QixTQUFXNWdDLFNBQWhCLENBQTRCLENBRTNCLGFBQWUyaEMsU0FBU3FuQixZQUFULENBQXVCLFVBQXZCLENBQWYsQ0FFQSxJQUFNLE1BQVEsQ0FBUixDQUFXN2tELEVBQUl5OEIsT0FBT3YvQixNQUE1QixDQUFvQ0ssRUFBSXlDLENBQXhDLENBQTJDekMsR0FBM0MsQ0FBa0QsQ0FFakQ0d0IsU0FBUy9CLE1BQVQsQ0FBaUJxUSxPQUFRbC9CLENBQVIsQ0FBakIsQ0FBOEIrd0IsT0FBT3hlLENBQXJDLENBQXdDd2UsT0FBT2hPLENBQS9DLENBQWtEZ08sT0FBT25ILENBQXpELEVBRUEsQ0FFRCxDQUVELENBRUQsc0JBQU8sRUFBa0IsQ0FFeEJxVyxTQUFXLEtBQUtBLFFBQWhCLENBQ0E2bkcsU0FBVyxLQUFLQSxRQUFoQixDQUVBLE1BQVEsQ0FBUixDQUFXOTFHLEVBQUksQ0FBZixDQUVBO0VBQ0E7RUFFQW9GLE9BQU9DLGdCQUFQLENBQXdCelMsSUFBeEIsQ0FBOEIsS0FBS3dTLE1BQUwsQ0FBWUMsZ0JBQTFDLEVBRUE7RUFFQTJ3RyxTQUFVLEdBQVYsQ0FBZSxDQUFmLENBQWtCLENBQWxCLENBQXFCLENBQUUsQ0FBdkIsRUFDQUEsU0FBVSxHQUFWLENBQWUsQ0FBZixDQUFrQixDQUFsQixDQUFxQixDQUFyQixFQUVBO0VBRUFBLFNBQVUsSUFBVixDQUFnQixDQUFFMXZILENBQWxCLENBQXFCLENBQUUwWixDQUF2QixDQUEwQixDQUFFLENBQTVCLEVBQ0FnMkcsU0FBVSxJQUFWLENBQWdCMXZILENBQWhCLENBQW1CLENBQUUwWixDQUFyQixDQUF3QixDQUFFLENBQTFCLEVBQ0FnMkcsU0FBVSxJQUFWLENBQWdCLENBQUUxdkgsQ0FBbEIsQ0FBcUIwWixDQUFyQixDQUF3QixDQUFFLENBQTFCLEVBQ0FnMkcsU0FBVSxJQUFWLENBQWdCMXZILENBQWhCLENBQW1CMFosQ0FBbkIsQ0FBc0IsQ0FBRSxDQUF4QixFQUVBO0VBRUFnMkcsU0FBVSxJQUFWLENBQWdCLENBQUUxdkgsQ0FBbEIsQ0FBcUIsQ0FBRTBaLENBQXZCLENBQTBCLENBQTFCLEVBQ0FnMkcsU0FBVSxJQUFWLENBQWdCMXZILENBQWhCLENBQW1CLENBQUUwWixDQUFyQixDQUF3QixDQUF4QixFQUNBZzJHLFNBQVUsSUFBVixDQUFnQixDQUFFMXZILENBQWxCLENBQXFCMFosQ0FBckIsQ0FBd0IsQ0FBeEIsRUFDQWcyRyxTQUFVLElBQVYsQ0FBZ0IxdkgsQ0FBaEIsQ0FBbUIwWixDQUFuQixDQUFzQixDQUF0QixFQUVBO0VBRUFnMkcsU0FBVSxJQUFWLENBQWdCMXZILEVBQUksR0FBcEIsQ0FBeUIwWixFQUFJLEdBQTdCLENBQWtDLENBQUUsQ0FBcEMsRUFDQWcyRyxTQUFVLElBQVYsQ0FBZ0IsQ0FBRTF2SCxDQUFGLENBQU0sR0FBdEIsQ0FBMkIwWixFQUFJLEdBQS9CLENBQW9DLENBQUUsQ0FBdEMsRUFDQWcyRyxTQUFVLElBQVYsQ0FBZ0IsQ0FBaEIsQ0FBbUJoMkcsRUFBSSxDQUF2QixDQUEwQixDQUFFLENBQTVCLEVBRUE7RUFFQWcyRyxTQUFVLEtBQVYsQ0FBaUIsQ0FBRTF2SCxDQUFuQixDQUFzQixDQUF0QixDQUF5QixDQUF6QixFQUNBMHZILFNBQVUsS0FBVixDQUFpQjF2SCxDQUFqQixDQUFvQixDQUFwQixDQUF1QixDQUF2QixFQUNBMHZILFNBQVUsS0FBVixDQUFpQixDQUFqQixDQUFvQixDQUFFaDJHLENBQXRCLENBQXlCLENBQXpCLEVBQ0FnMkcsU0FBVSxLQUFWLENBQWlCLENBQWpCLENBQW9CaDJHLENBQXBCLENBQXVCLENBQXZCLEVBRUFnMkcsU0FBVSxLQUFWLENBQWlCLENBQUUxdkgsQ0FBbkIsQ0FBc0IsQ0FBdEIsQ0FBeUIsQ0FBRSxDQUEzQixFQUNBMHZILFNBQVUsS0FBVixDQUFpQjF2SCxDQUFqQixDQUFvQixDQUFwQixDQUF1QixDQUFFLENBQXpCLEVBQ0EwdkgsU0FBVSxLQUFWLENBQWlCLENBQWpCLENBQW9CLENBQUVoMkcsQ0FBdEIsQ0FBeUIsQ0FBRSxDQUEzQixFQUNBZzJHLFNBQVUsS0FBVixDQUFpQixDQUFqQixDQUFvQmgyRyxDQUFwQixDQUF1QixDQUFFLENBQXpCLEVBRUFpTyxTQUFTcW5CLFlBQVQsQ0FBdUIsVUFBdkIsRUFBb0NLLFdBQXBDLENBQWtELElBQWxELENBRUEsQ0FuREQsQ0FxREEsQ0FoRitCLEVBQWhDLENBa0ZBOzs7S0FLQSxrQkFBQSxDQUFvQm5vRCxNQUFwQixDQUE0QjB1QyxLQUE1QixDQUFvQyxDQUVuQyxLQUFLMXVDLE1BQUwsQ0FBY0EsTUFBZCxDQUVBLEdBQUswdUMsUUFBVTV2QyxTQUFmLENBQTJCNHZDLE1BQVEsUUFBUixDQUUzQixZQUFjLGVBQUEsQ0FBaUIsQ0FBRSxDQUFGLENBQUssQ0FBTCxDQUFRLENBQVIsQ0FBVyxDQUFYLENBQWMsQ0FBZCxDQUFpQixDQUFqQixDQUFvQixDQUFwQixDQUF1QixDQUF2QixDQUEwQixDQUExQixDQUE2QixDQUE3QixDQUFnQyxDQUFoQyxDQUFtQyxDQUFuQyxDQUFzQyxDQUF0QyxDQUF5QyxDQUF6QyxDQUE0QyxDQUE1QyxDQUErQyxDQUEvQyxDQUFrRCxDQUFsRCxDQUFxRCxDQUFyRCxDQUF3RCxDQUF4RCxDQUEyRCxDQUEzRCxDQUE4RCxDQUE5RCxDQUFpRSxDQUFqRSxDQUFvRSxDQUFwRSxDQUF1RSxDQUF2RSxDQUFqQixDQUFkLENBQ0EsY0FBZ0IsZ0JBQUEsQ0FBa0IsRUFBSSxDQUF0QixDQUFoQixDQUVBLGFBQWUsa0JBQUEsRUFBZixDQUNBak8sU0FBU2tuQixRQUFULENBQW1CLG1CQUFBLENBQXFCckgsT0FBckIsQ0FBOEIsQ0FBOUIsQ0FBbkIsRUFDQTdmLFNBQVNvbkIsWUFBVCxDQUF1QixVQUF2QixDQUFtQyxtQkFBQSxDQUFxQi9ILFNBQXJCLENBQWdDLENBQWhDLENBQW5DLEVBRUFzNUMsYUFBYWgrRixJQUFiLENBQW1CLElBQW5CLENBQXlCcWxDLFFBQXpCLENBQW1DLHFCQUFBLENBQXVCLENBQUVpTyxNQUFPQSxLQUFULENBQXZCLENBQW5DLEVBRUEsS0FBS2xULGdCQUFMLENBQXdCLEtBQXhCLENBRUEsS0FBS3JILE1BQUwsR0FFQSxDQUVEczBHLFVBQVUvdUksU0FBVixDQUFzQkQsT0FBT2lCLE1BQVAsQ0FBZTArRixhQUFhMS9GLFNBQTVCLENBQXRCLENBQ0ErdUksVUFBVS91SSxTQUFWLENBQW9Cc0MsV0FBcEIsQ0FBa0N5c0ksU0FBbEMsQ0FFQUEsVUFBVS91SSxTQUFWLENBQW9CeTZCLE1BQXBCLENBQStCLFVBQVksQ0FFMUMsUUFBVSxRQUFBLEVBQVYsQ0FFQSxzQkFBTyxDQUFpQm4wQixNQUFqQixDQUEwQixDQUVoQyxHQUFLQSxTQUFXbEIsU0FBaEIsQ0FBNEIsQ0FFM0IyVyxRQUFRNlAsSUFBUixDQUFjLHFEQUFkLEVBRUEsQ0FFRCxHQUFLLEtBQUt0bEIsTUFBTCxHQUFnQmxCLFNBQXJCLENBQWlDLENBRWhDcWhDLElBQUlGLGFBQUosQ0FBbUIsS0FBS2pnQyxNQUF4QixFQUVBLENBRUQsR0FBS21nQyxJQUFJQyxPQUFKLEVBQUwsQ0FBcUIsT0FFckIsUUFBVUQsSUFBSWo1QixHQUFkLENBQ0EsUUFBVWk1QixJQUFJaDVCLEdBQWQsQ0FFQTs7Ozs7Ozs7Ozs7Ozs7TUFnQkEsYUFBZSxLQUFLczVCLFFBQUwsQ0FBY0ssVUFBZCxDQUF5QjFQLFFBQXhDLENBQ0EsVUFBWUEsU0FBUzdRLEtBQXJCLENBRUFBLE1BQU8sQ0FBUCxFQUFhcFosSUFBSTRMLENBQWpCLENBQW9Cd04sTUFBTyxDQUFQLEVBQWFwWixJQUFJb2MsQ0FBakIsQ0FBb0JoRCxNQUFPLENBQVAsRUFBYXBaLElBQUlpakIsQ0FBakIsQ0FDeEM3SixNQUFPLENBQVAsRUFBYXJaLElBQUk2TCxDQUFqQixDQUFvQndOLE1BQU8sQ0FBUCxFQUFhcFosSUFBSW9jLENBQWpCLENBQW9CaEQsTUFBTyxDQUFQLEVBQWFwWixJQUFJaWpCLENBQWpCLENBQ3hDN0osTUFBTyxDQUFQLEVBQWFyWixJQUFJNkwsQ0FBakIsQ0FBb0J3TixNQUFPLENBQVAsRUFBYXJaLElBQUlxYyxDQUFqQixDQUFvQmhELE1BQU8sQ0FBUCxFQUFhcFosSUFBSWlqQixDQUFqQixDQUN4QzdKLE1BQU8sQ0FBUCxFQUFhcFosSUFBSTRMLENBQWpCLENBQW9Cd04sTUFBTyxFQUFQLEVBQWNyWixJQUFJcWMsQ0FBbEIsQ0FBcUJoRCxNQUFPLEVBQVAsRUFBY3BaLElBQUlpakIsQ0FBbEIsQ0FDekM3SixNQUFPLEVBQVAsRUFBY3BaLElBQUk0TCxDQUFsQixDQUFxQndOLE1BQU8sRUFBUCxFQUFjcFosSUFBSW9jLENBQWxCLENBQXFCaEQsTUFBTyxFQUFQLEVBQWNyWixJQUFJa2pCLENBQWxCLENBQzFDN0osTUFBTyxFQUFQLEVBQWNyWixJQUFJNkwsQ0FBbEIsQ0FBcUJ3TixNQUFPLEVBQVAsRUFBY3BaLElBQUlvYyxDQUFsQixDQUFxQmhELE1BQU8sRUFBUCxFQUFjclosSUFBSWtqQixDQUFsQixDQUMxQzdKLE1BQU8sRUFBUCxFQUFjclosSUFBSTZMLENBQWxCLENBQXFCd04sTUFBTyxFQUFQLEVBQWNyWixJQUFJcWMsQ0FBbEIsQ0FBcUJoRCxNQUFPLEVBQVAsRUFBY3JaLElBQUlrakIsQ0FBbEIsQ0FDMUM3SixNQUFPLEVBQVAsRUFBY3BaLElBQUk0TCxDQUFsQixDQUFxQndOLE1BQU8sRUFBUCxFQUFjclosSUFBSXFjLENBQWxCLENBQXFCaEQsTUFBTyxFQUFQLEVBQWNyWixJQUFJa2pCLENBQWxCLENBRTFDZ0gsU0FBUysyQixXQUFULENBQXVCLElBQXZCLENBRUEsS0FBSzFuQixRQUFMLENBQWMwRixxQkFBZCxHQUVBLENBbkRELENBcURBLENBekQ0QixFQUE3QixDQTJEQXNpRyxVQUFVL3VJLFNBQVYsQ0FBb0J1bUMsYUFBcEIsQ0FBb0MsU0FBV2pnQyxNQUFYLENBQW9CLENBRXZELEtBQUtBLE1BQUwsQ0FBY0EsTUFBZCxDQUNBLEtBQUttMEIsTUFBTCxHQUVBLFdBQUEsQ0FFQSxDQVBELENBU0E7O0tBSUEsbUJBQUEsQ0FBcUJnTSxHQUFyQixDQUEwQmtPLEdBQTFCLENBQWdDLENBRS9CLEtBQUtsekMsSUFBTCxDQUFZLFlBQVosQ0FFQSxLQUFLZ2xDLEdBQUwsQ0FBV0EsR0FBWCxDQUVBLFVBQWNrTyxNQUFRdnZDLFNBQVYsQ0FBd0J1dkMsR0FBeEIsQ0FBOEIsUUFBMUMsQ0FFQSxZQUFjLGVBQUEsQ0FBaUIsQ0FBRSxDQUFGLENBQUssQ0FBTCxDQUFRLENBQVIsQ0FBVyxDQUFYLENBQWMsQ0FBZCxDQUFpQixDQUFqQixDQUFvQixDQUFwQixDQUF1QixDQUF2QixDQUEwQixDQUExQixDQUE2QixDQUE3QixDQUFnQyxDQUFoQyxDQUFtQyxDQUFuQyxDQUFzQyxDQUF0QyxDQUF5QyxDQUF6QyxDQUE0QyxDQUE1QyxDQUErQyxDQUEvQyxDQUFrRCxDQUFsRCxDQUFxRCxDQUFyRCxDQUF3RCxDQUF4RCxDQUEyRCxDQUEzRCxDQUE4RCxDQUE5RCxDQUFpRSxDQUFqRSxDQUFvRSxDQUFwRSxDQUF1RSxDQUF2RSxDQUFqQixDQUFkLENBRUEsY0FBZ0IsQ0FBRSxDQUFGLENBQUssQ0FBTCxDQUFRLENBQVIsQ0FBVyxDQUFFLENBQWIsQ0FBZ0IsQ0FBaEIsQ0FBbUIsQ0FBbkIsQ0FBc0IsQ0FBRSxDQUF4QixDQUEyQixDQUFFLENBQTdCLENBQWdDLENBQWhDLENBQW1DLENBQW5DLENBQXNDLENBQUUsQ0FBeEMsQ0FBMkMsQ0FBM0MsQ0FBOEMsQ0FBOUMsQ0FBaUQsQ0FBakQsQ0FBb0QsQ0FBRSxDQUF0RCxDQUF5RCxDQUFFLENBQTNELENBQThELENBQTlELENBQWlFLENBQUUsQ0FBbkUsQ0FBc0UsQ0FBRSxDQUF4RSxDQUEyRSxDQUFFLENBQTdFLENBQWdGLENBQUUsQ0FBbEYsQ0FBcUYsQ0FBckYsQ0FBd0YsQ0FBRSxDQUExRixDQUE2RixDQUFFLENBQS9GLENBQWhCLENBRUEsYUFBZSxrQkFBQSxFQUFmLENBRUE1TixTQUFTa25CLFFBQVQsQ0FBbUIsbUJBQUEsQ0FBcUJySCxPQUFyQixDQUE4QixDQUE5QixDQUFuQixFQUVBN2YsU0FBU29uQixZQUFULENBQXVCLFVBQXZCLENBQW1DLDBCQUFBLENBQTRCL0gsU0FBNUIsQ0FBdUMsQ0FBdkMsQ0FBbkMsRUFFQXM1QyxhQUFhaCtGLElBQWIsQ0FBbUIsSUFBbkIsQ0FBeUJxbEMsUUFBekIsQ0FBbUMscUJBQUEsQ0FBdUIsQ0FBRWlPLE1BQU9BLEtBQVQsQ0FBdkIsQ0FBbkMsRUFFQSxLQUFLak8sUUFBTCxDQUFjMEYscUJBQWQsR0FFQSxDQUVEdWlHLFdBQVdodkksU0FBWCxDQUF1QkQsT0FBT2lCLE1BQVAsQ0FBZTArRixhQUFhMS9GLFNBQTVCLENBQXZCLENBQ0FndkksV0FBV2h2SSxTQUFYLENBQXFCc0MsV0FBckIsQ0FBbUMwc0ksVUFBbkMsQ0FFQUEsV0FBV2h2SSxTQUFYLENBQXFCcW5DLGlCQUFyQixDQUF5QyxTQUFXaWIsS0FBWCxDQUFtQixDQUUzRCxRQUFVLEtBQUs3YixHQUFmLENBRUEsR0FBS0EsSUFBSUMsT0FBSixFQUFMLENBQXFCLE9BRXJCRCxJQUFJRSxTQUFKLENBQWUsS0FBS2pQLFFBQXBCLEVBRUErTyxJQUFJRyxPQUFKLENBQWEsS0FBS25RLEtBQWxCLEVBRUEsS0FBS0EsS0FBTCxDQUFXckssY0FBWCxDQUEyQixHQUEzQixFQUVBcXpCLFNBQVN6L0MsU0FBVCxDQUFtQnFuQyxpQkFBbkIsQ0FBcUMzbEMsSUFBckMsQ0FBMkMsSUFBM0MsQ0FBaUQ0Z0QsS0FBakQsRUFFQSxDQWRELENBZ0JBOztLQUlBLG9CQUFBLENBQXNCdGEsS0FBdEIsQ0FBNkIzQixJQUE3QixDQUFtQ3NPLEdBQW5DLENBQXlDLENBRXhDLEtBQUtsekMsSUFBTCxDQUFZLGFBQVosQ0FFQSxLQUFLdW1DLEtBQUwsQ0FBYUEsS0FBYixDQUVBLEtBQUszQixJQUFMLENBQWNBLE9BQVNqaEMsU0FBWCxDQUF5QixDQUF6QixDQUE2QmloQyxJQUF6QyxDQUVBLFVBQWNzTyxNQUFRdnZDLFNBQVYsQ0FBd0J1dkMsR0FBeEIsQ0FBOEIsUUFBMUMsQ0FFQSxjQUFnQixDQUFFLENBQUYsQ0FBSyxDQUFFLENBQVAsQ0FBVSxDQUFWLENBQWEsQ0FBRSxDQUFmLENBQWtCLENBQWxCLENBQXFCLENBQXJCLENBQXdCLENBQUUsQ0FBMUIsQ0FBNkIsQ0FBRSxDQUEvQixDQUFrQyxDQUFsQyxDQUFxQyxDQUFyQyxDQUF3QyxDQUF4QyxDQUEyQyxDQUEzQyxDQUE4QyxDQUFFLENBQWhELENBQW1ELENBQW5ELENBQXNELENBQXRELENBQXlELENBQUUsQ0FBM0QsQ0FBOEQsQ0FBRSxDQUFoRSxDQUFtRSxDQUFuRSxDQUFzRSxDQUF0RSxDQUF5RSxDQUFFLENBQTNFLENBQThFLENBQTlFLENBQWlGLENBQWpGLENBQW9GLENBQXBGLENBQXVGLENBQXZGLENBQTBGLENBQTFGLENBQTZGLENBQTdGLENBQWdHLENBQWhHLENBQW1HLENBQW5HLENBQXNHLENBQXRHLENBQXlHLENBQXpHLENBQWhCLENBRUEsYUFBZSxrQkFBQSxFQUFmLENBQ0E1TixTQUFTb25CLFlBQVQsQ0FBdUIsVUFBdkIsQ0FBbUMsMEJBQUEsQ0FBNEIvSCxTQUE1QixDQUF1QyxDQUF2QyxDQUFuQyxFQUNBcmYsU0FBUzBGLHFCQUFULEdBRUFzeUQsS0FBS3I5RixJQUFMLENBQVcsSUFBWCxDQUFpQnFsQyxRQUFqQixDQUEyQixxQkFBQSxDQUF1QixDQUFFaU8sTUFBT0EsS0FBVCxDQUF2QixDQUEzQixFQUVBO0VBRUEsZUFBaUIsQ0FBRSxDQUFGLENBQUssQ0FBTCxDQUFRLENBQVIsQ0FBVyxDQUFFLENBQWIsQ0FBZ0IsQ0FBaEIsQ0FBbUIsQ0FBbkIsQ0FBc0IsQ0FBRSxDQUF4QixDQUEyQixDQUFFLENBQTdCLENBQWdDLENBQWhDLENBQW1DLENBQW5DLENBQXNDLENBQXRDLENBQXlDLENBQXpDLENBQTRDLENBQUUsQ0FBOUMsQ0FBaUQsQ0FBRSxDQUFuRCxDQUFzRCxDQUF0RCxDQUF5RCxDQUF6RCxDQUE0RCxDQUFFLENBQTlELENBQWlFLENBQWpFLENBQWpCLENBRUEsY0FBZ0Isa0JBQUEsRUFBaEIsQ0FDQTRhLFVBQVV6QixZQUFWLENBQXdCLFVBQXhCLENBQW9DLDBCQUFBLENBQTRCOGdGLFVBQTVCLENBQXdDLENBQXhDLENBQXBDLEVBQ0FyL0UsVUFBVW5qQixxQkFBVixHQUVBLEtBQUs5Z0IsR0FBTCxDQUFVLFFBQUEsQ0FBVWlrQyxTQUFWLENBQXFCLHFCQUFBLENBQXVCLENBQUU1YSxNQUFPQSxLQUFULENBQWdCd0IsUUFBUyxHQUF6QixDQUE4QndiLFlBQWEsSUFBM0MsQ0FBaURhLFdBQVksS0FBN0QsQ0FBdkIsQ0FBckIsQ0FBVixFQUVBLENBRURxOEUsWUFBWWx2SSxTQUFaLENBQXdCRCxPQUFPaUIsTUFBUCxDQUFlKzlGLEtBQUsvK0YsU0FBcEIsQ0FBeEIsQ0FDQWt2SSxZQUFZbHZJLFNBQVosQ0FBc0JzQyxXQUF0QixDQUFvQzRzSSxXQUFwQyxDQUVBQSxZQUFZbHZJLFNBQVosQ0FBc0JxbkMsaUJBQXRCLENBQTBDLFNBQVdpYixLQUFYLENBQW1CLENBRTVELFVBQVksQ0FBRSxLQUFLdGEsS0FBTCxDQUFXQyxRQUF6QixDQUVBLEdBQUt0L0IsS0FBS3lrQixHQUFMLENBQVVxSixLQUFWLEVBQW9CLElBQXpCLENBQWdDQSxNQUFRLElBQVIsQ0FBYztFQUU5QyxLQUFLQSxLQUFMLENBQVdyZixHQUFYLENBQWdCLElBQU0sS0FBS2l2QixJQUEzQixDQUFpQyxJQUFNLEtBQUtBLElBQTVDLENBQWtENVAsS0FBbEQsRUFFQSxLQUFLeEQsTUFBTCxDQUFhLEtBQUsrVSxLQUFMLENBQVc5SSxNQUF4QixFQUVBdWdCLFNBQVN6L0MsU0FBVCxDQUFtQnFuQyxpQkFBbkIsQ0FBcUMzbEMsSUFBckMsQ0FBMkMsSUFBM0MsQ0FBaUQ0Z0QsS0FBakQsRUFFQSxDQVpELENBY0E7Ozs7Ozs7Ozs7Ozs7O0tBZ0JBLGdCQUFBLENBQ0EsZ0JBQUEsQ0FFQSxvQkFBQSxDQUFzQm5vQixHQUF0QixDQUEyQnk3QixNQUEzQixDQUFtQ252RCxNQUFuQyxDQUEyQ3V1QyxLQUEzQyxDQUFrRG02RixVQUFsRCxDQUE4REMsU0FBOUQsQ0FBMEU7RUFJekUzdkYsU0FBUy85QyxJQUFULENBQWUsSUFBZixFQUVBLEdBQUtzekMsUUFBVTV2QyxTQUFmLENBQTJCNHZDLE1BQVEsUUFBUixDQUMzQixHQUFLdnVDLFNBQVdyQixTQUFoQixDQUE0QnFCLE9BQVMsQ0FBVCxDQUM1QixHQUFLMG9JLGFBQWUvcEksU0FBcEIsQ0FBZ0MrcEksV0FBYSxJQUFNMW9JLE1BQW5CLENBQ2hDLEdBQUsyb0ksWUFBY2hxSSxTQUFuQixDQUErQmdxSSxVQUFZLElBQU1ELFVBQWxCLENBRS9CLEdBQUtFLGVBQWlCanFJLFNBQXRCLENBQWtDLENBRWpDaXFJLGFBQWUsa0JBQUEsRUFBZixDQUNBQSxhQUFhbGhGLFlBQWIsQ0FBMkIsVUFBM0IsQ0FBdUMsMEJBQUEsQ0FBNEIsQ0FBRSxDQUFGLENBQUssQ0FBTCxDQUFRLENBQVIsQ0FBVyxDQUFYLENBQWMsQ0FBZCxDQUFpQixDQUFqQixDQUE1QixDQUFrRCxDQUFsRCxDQUF2QyxFQUVBbWhGLGFBQWUsMEJBQUEsQ0FBNEIsQ0FBNUIsQ0FBK0IsR0FBL0IsQ0FBb0MsQ0FBcEMsQ0FBdUMsQ0FBdkMsQ0FBMEMsQ0FBMUMsQ0FBZixDQUNBQSxhQUFhOXVHLFNBQWIsQ0FBd0IsQ0FBeEIsQ0FBMkIsQ0FBRSxHQUE3QixDQUFrQyxDQUFsQyxFQUVBLENBRUQsS0FBSzlJLFFBQUwsQ0FBY2hNLElBQWQsQ0FBb0JrcUMsTUFBcEIsRUFFQSxLQUFLMXJCLElBQUwsQ0FBWSxRQUFBLENBQVVtbEcsWUFBVixDQUF3QixxQkFBQSxDQUF1QixDQUFFcjZGLE1BQU9BLEtBQVQsQ0FBdkIsQ0FBeEIsQ0FBWixDQUNBLEtBQUs5SyxJQUFMLENBQVVwSSxnQkFBVixDQUE2QixLQUE3QixDQUNBLEtBQUtuVyxHQUFMLENBQVUsS0FBS3VlLElBQWYsRUFFQSxLQUFLOGlHLElBQUwsQ0FBWSxRQUFBLENBQVVzQyxZQUFWLENBQXdCLHFCQUFBLENBQXVCLENBQUV0NkYsTUFBT0EsS0FBVCxDQUF2QixDQUF4QixDQUFaLENBQ0EsS0FBS2c0RixJQUFMLENBQVVsckcsZ0JBQVYsQ0FBNkIsS0FBN0IsQ0FDQSxLQUFLblcsR0FBTCxDQUFVLEtBQUtxaEgsSUFBZixFQUVBLEtBQUt1QyxZQUFMLENBQW1CcDFHLEdBQW5CLEVBQ0EsS0FBS3RNLFNBQUwsQ0FBZ0JwbkIsTUFBaEIsQ0FBd0Iwb0ksVUFBeEIsQ0FBb0NDLFNBQXBDLEVBRUEsQ0FFREksWUFBWXh2SSxTQUFaLENBQXdCRCxPQUFPaUIsTUFBUCxDQUFleStDLFNBQVN6L0MsU0FBeEIsQ0FBeEIsQ0FDQXd2SSxZQUFZeHZJLFNBQVosQ0FBc0JzQyxXQUF0QixDQUFvQ2t0SSxXQUFwQyxDQUVBQSxZQUFZeHZJLFNBQVosQ0FBc0J1dkksWUFBdEIsQ0FBdUMsVUFBWSxDQUVsRCxTQUFXLFdBQUEsRUFBWCxDQUNBLFdBQUEsQ0FFQSw0QkFBTyxDQUF1QnAxRyxHQUF2QixDQUE2QjtFQUluQyxHQUFLQSxJQUFJdFEsQ0FBSixDQUFRLE9BQWIsQ0FBdUIsQ0FFdEIsS0FBSzhOLFVBQUwsQ0FBZ0J2Z0IsR0FBaEIsQ0FBcUIsQ0FBckIsQ0FBd0IsQ0FBeEIsQ0FBMkIsQ0FBM0IsQ0FBOEIsQ0FBOUIsRUFFQSxDQUpELFFBSVkraUIsSUFBSXRRLENBQUosQ0FBUSxDQUFFLE9BQWYsQ0FBeUIsQ0FFL0IsS0FBSzhOLFVBQUwsQ0FBZ0J2Z0IsR0FBaEIsQ0FBcUIsQ0FBckIsQ0FBd0IsQ0FBeEIsQ0FBMkIsQ0FBM0IsQ0FBOEIsQ0FBOUIsRUFFQSxDQUpNLElBSUEsQ0FFTmdnQixLQUFLaGdCLEdBQUwsQ0FBVStpQixJQUFJekosQ0FBZCxDQUFpQixDQUFqQixDQUFvQixDQUFFeUosSUFBSTlnQixDQUExQixFQUE4QmdVLFNBQTlCLEdBRUExQyxRQUFVaGlCLEtBQUt5MkIsSUFBTCxDQUFXakYsSUFBSXRRLENBQWYsQ0FBVixDQUVBLEtBQUs4TixVQUFMLENBQWdCcUQsZ0JBQWhCLENBQWtDNUQsSUFBbEMsQ0FBd0N6TSxPQUF4QyxFQUVBLENBRUQsQ0F0QkQsQ0F3QkEsQ0E3QnNDLEVBQXZDLENBK0JBNmtILFlBQVl4dkksU0FBWixDQUFzQjZ0QixTQUF0QixDQUFrQyxTQUFXcG5CLE1BQVgsQ0FBbUIwb0ksVUFBbkIsQ0FBK0JDLFNBQS9CLENBQTJDLENBRTVFLEdBQUtELGFBQWUvcEksU0FBcEIsQ0FBZ0MrcEksV0FBYSxJQUFNMW9JLE1BQW5CLENBQ2hDLEdBQUsyb0ksWUFBY2hxSSxTQUFuQixDQUErQmdxSSxVQUFZLElBQU1ELFVBQWxCLENBRS9CLEtBQUtqbEcsSUFBTCxDQUFVelQsS0FBVixDQUFnQnJmLEdBQWhCLENBQXFCLENBQXJCLENBQXdCek8sS0FBSzhFLEdBQUwsQ0FBVSxDQUFWLENBQWFoSCxPQUFTMG9JLFVBQXRCLENBQXhCLENBQTRELENBQTVELEVBQ0EsS0FBS2psRyxJQUFMLENBQVUzSCxZQUFWLEdBRUEsS0FBS3lxRyxJQUFMLENBQVV2MkcsS0FBVixDQUFnQnJmLEdBQWhCLENBQXFCZzRILFNBQXJCLENBQWdDRCxVQUFoQyxDQUE0Q0MsU0FBNUMsRUFDQSxLQUFLcEMsSUFBTCxDQUFVdDFHLFFBQVYsQ0FBbUI3TixDQUFuQixDQUF1QnBqQixNQUF2QixDQUNBLEtBQUt1bUksSUFBTCxDQUFVenFHLFlBQVYsR0FFQSxDQVpELENBY0FpdEcsWUFBWXh2SSxTQUFaLENBQXNCeXZJLFFBQXRCLENBQWlDLFNBQVd6NkYsS0FBWCxDQUFtQixDQUVuRCxLQUFLOUssSUFBTCxDQUFVNlksUUFBVixDQUFtQi9OLEtBQW5CLENBQXlCdHBCLElBQXpCLENBQStCc3BCLEtBQS9CLEVBQ0EsS0FBS2c0RixJQUFMLENBQVVqcUYsUUFBVixDQUFtQi9OLEtBQW5CLENBQXlCdHBCLElBQXpCLENBQStCc3BCLEtBQS9CLEVBRUEsQ0FMRCxDQU9BOzs7S0FLQSxtQkFBQSxDQUFxQjNPLElBQXJCLENBQTRCLENBRTNCQSxLQUFPQSxNQUFRLENBQWYsQ0FFQSxhQUFlLENBQ2QsQ0FEYyxDQUNYLENBRFcsQ0FDUixDQURRLENBQ0xBLElBREssQ0FDQyxDQURELENBQ0ksQ0FESixDQUVkLENBRmMsQ0FFWCxDQUZXLENBRVIsQ0FGUSxDQUVMLENBRkssQ0FFRkEsSUFGRSxDQUVJLENBRkosQ0FHZCxDQUhjLENBR1gsQ0FIVyxDQUdSLENBSFEsQ0FHTCxDQUhLLENBR0YsQ0FIRSxDQUdDQSxJQUhELENBQWYsQ0FNQSxXQUFhLENBQ1osQ0FEWSxDQUNULENBRFMsQ0FDTixDQURNLENBQ0gsQ0FERyxDQUNBLEdBREEsQ0FDSyxDQURMLENBRVosQ0FGWSxDQUVULENBRlMsQ0FFTixDQUZNLENBRUgsR0FGRyxDQUVFLENBRkYsQ0FFSyxDQUZMLENBR1osQ0FIWSxDQUdULENBSFMsQ0FHTixDQUhNLENBR0gsQ0FIRyxDQUdBLEdBSEEsQ0FHSyxDQUhMLENBQWIsQ0FNQSxhQUFlLGtCQUFBLEVBQWYsQ0FDQVUsU0FBU29uQixZQUFULENBQXVCLFVBQXZCLENBQW1DLDBCQUFBLENBQTRCbG5CLFFBQTVCLENBQXNDLENBQXRDLENBQW5DLEVBQ0FGLFNBQVNvbkIsWUFBVCxDQUF1QixPQUF2QixDQUFnQywwQkFBQSxDQUE0QnZKLE1BQTVCLENBQW9DLENBQXBDLENBQWhDLEVBRUEsYUFBZSxxQkFBQSxDQUF1QixDQUFFSCxhQUFjZ3BFLFlBQWhCLENBQXZCLENBQWYsQ0FFQS90QixhQUFhaCtGLElBQWIsQ0FBbUIsSUFBbkIsQ0FBeUJxbEMsUUFBekIsQ0FBbUNnYyxRQUFuQyxFQUVBLENBRUQyc0YsV0FBVzF2SSxTQUFYLENBQXVCRCxPQUFPaUIsTUFBUCxDQUFlMCtGLGFBQWExL0YsU0FBNUIsQ0FBdkIsQ0FDQTB2SSxXQUFXMXZJLFNBQVgsQ0FBcUJzQyxXQUFyQixDQUFtQ290SSxVQUFuQyxDQUVBO0VBRUFyNEIsTUFBTXIyRyxNQUFOLENBQWUsU0FBVzJ1SSxTQUFYLENBQXNCcjRCLFFBQXRCLENBQWlDLENBRS9DdjdGLFFBQVErTyxHQUFSLENBQWEsMENBQWIsRUFFQTZrSCxVQUFVM3ZJLFNBQVYsQ0FBc0JELE9BQU9pQixNQUFQLENBQWVxMkcsTUFBTXIzRyxTQUFyQixDQUF0QixDQUNBMnZJLFVBQVUzdkksU0FBVixDQUFvQnNDLFdBQXBCLENBQWtDcXRJLFNBQWxDLENBQ0FBLFVBQVUzdkksU0FBVixDQUFvQnMzRyxRQUFwQixDQUErQkEsUUFBL0IsQ0FFQSxnQkFBQSxDQUVBLENBVkQsQ0FZQTtFQUVBdjNHLE9BQU80bkIsTUFBUCxDQUFlaTFGLFVBQVU1OEcsU0FBekIsQ0FBb0MsQ0FFbkM0dkkscUJBQXNCLFNBQVdsNEIsU0FBWCxDQUF1QixDQUU1QzM3RixRQUFRNlAsSUFBUixDQUFjLHNIQUFkLEVBRUE7RUFFQSxRQUFVLEtBQUs2ckYsU0FBTCxDQUFnQkMsU0FBaEIsQ0FBVixDQUNBLFlBQVltNEIsY0FBTCxDQUFxQjNtQyxHQUFyQixDQUFQLENBRUEsQ0FYa0MsQ0FhbkM0bUMsMkJBQTRCLFNBQVdwNEIsU0FBWCxDQUF1QixDQUVsRDM3RixRQUFRNlAsSUFBUixDQUFjLDRIQUFkLEVBRUE7RUFFQSxRQUFVLEtBQUs4K0UsZUFBTCxDQUFzQmdOLFNBQXRCLENBQVYsQ0FDQSxZQUFZbTRCLGNBQUwsQ0FBcUIzbUMsR0FBckIsQ0FBUCxDQUVBLENBdEJrQyxDQXdCbkMybUMsZUFBZ0IsU0FBVzdwRyxNQUFYLENBQW9CLENBRW5DanFCLFFBQVE2UCxJQUFSLENBQWMsZ0hBQWQsRUFFQSxhQUFlLFlBQUEsRUFBZixDQUVBLElBQU0sTUFBUSxDQUFSLENBQVdyaUIsRUFBSXk4QixPQUFPdi9CLE1BQTVCLENBQW9DSyxFQUFJeUMsQ0FBeEMsQ0FBMkN6QyxHQUEzQyxDQUFrRCxDQUVqRCxVQUFZay9CLE9BQVFsL0IsQ0FBUixDQUFaLENBQ0FpZ0MsU0FBU0UsUUFBVCxDQUFrQmhoQyxJQUFsQixDQUF3QixXQUFBLENBQWF5TixNQUFNMkYsQ0FBbkIsQ0FBc0IzRixNQUFNbVcsQ0FBNUIsQ0FBK0JuVyxNQUFNZ2QsQ0FBTixFQUFXLENBQTFDLENBQXhCLEVBRUEsQ0FFRCxlQUFBLENBRUEsQ0F2Q2tDLENBQXBDLEVBMkNBO0VBRUEzd0IsT0FBTzRuQixNQUFQLENBQWU2MUYsS0FBS3g5RyxTQUFwQixDQUErQixDQUU5Qit2SSxXQUFZLFNBQVcvcEcsTUFBWCxDQUFvQixDQUUvQmpxQixRQUFRNlAsSUFBUixDQUFjLGlFQUFkLEVBQ0EsS0FBS21hLGFBQUwsQ0FBb0JDLE1BQXBCLEVBRUEsQ0FQNkIsQ0FBL0IsRUFXQTtFQUVBLGVBQUEsQ0FBaUJBLE1BQWpCLENBQTBCLENBRXpCanFCLFFBQVE2UCxJQUFSLENBQWMsb0VBQWQsRUFFQWl2RixpQkFBaUJuNUcsSUFBakIsQ0FBdUIsSUFBdkIsQ0FBNkJza0MsTUFBN0IsRUFDQSxLQUFLdmtDLElBQUwsQ0FBWSxZQUFaLENBRUEsQ0FFRHV1SSxPQUFPaHdJLFNBQVAsQ0FBbUJELE9BQU9pQixNQUFQLENBQWU2NUcsaUJBQWlCNzZHLFNBQWhDLENBQW5CLENBRUFELE9BQU80bkIsTUFBUCxDQUFlcW9ILE9BQU9od0ksU0FBdEIsQ0FBaUMsQ0FFaENpd0ksY0FBZSxpQkFBcUIsQ0FFbkNsMEgsUUFBUU0sS0FBUixDQUFlLGtEQUFmLEVBRUEsQ0FOK0IsQ0FPaEM2ekgsc0JBQXVCLDhCQUFrQyxDQUV4RG4wSCxRQUFRTSxLQUFSLENBQWUsMERBQWYsRUFFQSxDQVgrQixDQVloQzh6SCx5QkFBMEIsNEJBQWdDLENBRXpEcDBILFFBQVFNLEtBQVIsQ0FBZSw2REFBZixFQUVBLENBaEIrQixDQUFqQyxFQW9CQXd4SCxXQUFXN3RJLFNBQVgsQ0FBcUJvd0ksU0FBckIsQ0FBaUMsVUFBWSxDQUU1Q3IwSCxRQUFRTSxLQUFSLENBQWUsMEZBQWYsRUFFQSxDQUpELENBTUFpeEgsZUFBZXR0SSxTQUFmLENBQXlCeTZCLE1BQXpCLENBQWtDLFVBQVksQ0FFN0MxZSxRQUFRTSxLQUFSLENBQWUsOERBQWYsRUFFQSxDQUpELENBTUE7RUFFQXRjLE9BQU80bkIsTUFBUCxDQUFlc2lHLE9BQU9qcUgsU0FBdEIsQ0FBaUMsQ0FFaENndUgsZUFBZ0IsU0FBVzNxRixHQUFYLENBQWlCLENBRWhDdG5CLFFBQVE2UCxJQUFSLENBQWMsc0dBQWQsRUFDQSxtQkFBbUJvaUcsY0FBWixDQUE0QjNxRixHQUE1QixDQUFQLENBRUEsQ0FQK0IsQ0FBakMsRUFXQTtFQUVBdGpDLE9BQU80bkIsTUFBUCxDQUFlOGtILEtBQUt6c0ksU0FBcEIsQ0FBK0IsQ0FFOUIydUIsT0FBUSxTQUFXNG9GLGNBQVgsQ0FBNEIsQ0FFbkN4N0YsUUFBUTZQLElBQVIsQ0FBYyx5REFBZCxFQUNBLFlBQVkrYSxTQUFMLENBQWdCNHdFLGNBQWhCLENBQVAsQ0FFQSxDQVA2QixDQVE5Qjc4RixNQUFPLFVBQVksQ0FFbEJxQixRQUFRNlAsSUFBUixDQUFjLHNEQUFkLEVBQ0EsWUFBWThhLE9BQUwsRUFBUCxDQUVBLENBYjZCLENBYzlCMnBHLGtCQUFtQixTQUFXNXBHLEdBQVgsQ0FBaUIsQ0FFbkMxcUIsUUFBUTZQLElBQVIsQ0FBYyx3RUFBZCxFQUNBLFlBQVk4YixhQUFMLENBQW9CakIsR0FBcEIsQ0FBUCxDQUVBLENBbkI2QixDQW9COUJKLEtBQU0sU0FBV2t4RSxjQUFYLENBQTRCLENBRWpDeDdGLFFBQVE2UCxJQUFSLENBQWMscURBQWQsRUFDQSxZQUFZZ2IsT0FBTCxDQUFjMndFLGNBQWQsQ0FBUCxDQUVBLENBekI2QixDQUEvQixFQTRCQXgzRyxPQUFPNG5CLE1BQVAsQ0FBZTBkLEtBQUtybEMsU0FBcEIsQ0FBK0IsQ0FFOUIydUIsT0FBUSxTQUFXNG9GLGNBQVgsQ0FBNEIsQ0FFbkN4N0YsUUFBUTZQLElBQVIsQ0FBYyx5REFBZCxFQUNBLFlBQVkrYSxTQUFMLENBQWdCNHdFLGNBQWhCLENBQVAsQ0FFQSxDQVA2QixDQVE5Qjc4RixNQUFPLFVBQVksQ0FFbEJxQixRQUFRNlAsSUFBUixDQUFjLHNEQUFkLEVBQ0EsWUFBWThhLE9BQUwsRUFBUCxDQUVBLENBYjZCLENBYzlCMnBHLGtCQUFtQixTQUFXNXBHLEdBQVgsQ0FBaUIsQ0FFbkMxcUIsUUFBUTZQLElBQVIsQ0FBYyx3RUFBZCxFQUNBLFlBQVk4YixhQUFMLENBQW9CakIsR0FBcEIsQ0FBUCxDQUVBLENBbkI2QixDQW9COUI2cEcscUJBQXNCLFNBQVcxb0csTUFBWCxDQUFvQixDQUV6QzdyQixRQUFRNlAsSUFBUixDQUFjLDhFQUFkLEVBQ0EsWUFBWStiLGdCQUFMLENBQXVCQyxNQUF2QixDQUFQLENBRUEsQ0F6QjZCLENBMEI5QnZCLEtBQU0sU0FBV2t4RSxjQUFYLENBQTRCLENBRWpDeDdGLFFBQVE2UCxJQUFSLENBQWMscURBQWQsRUFDQSxZQUFZZ2IsT0FBTCxDQUFjMndFLGNBQWQsQ0FBUCxDQUVBLENBL0I2QixDQUEvQixFQWtDQTMrQyxNQUFNNTRELFNBQU4sQ0FBZ0IydUIsTUFBaEIsQ0FBeUIsU0FBVzRvRixjQUFYLENBQTRCLENBRXBEeDdGLFFBQVE2UCxJQUFSLENBQWMsMERBQWQsRUFDQSxZQUFZK2EsU0FBTCxDQUFnQjR3RSxjQUFoQixDQUFQLENBRUEsQ0FMRCxDQU9BeDNHLE9BQU80bkIsTUFBUCxDQUFlOEMsS0FBZixDQUFzQixDQUVyQjhsSCxTQUFVLFVBQVksQ0FFckJ4MEgsUUFBUTZQLElBQVIsQ0FBYyx5RUFBZCxFQUNBLFlBQVlwZCxNQUFMLEVBQVAsQ0FFQSxDQVBvQixDQVNyQmdpSSxrQkFBbUIsU0FBVy9zSSxLQUFYLENBQW1CLENBRXJDc1ksUUFBUTZQLElBQVIsQ0FBYywwRUFBZCxFQUNBLGFBQWFaLGVBQU4sQ0FBdUJ2bkIsS0FBdkIsQ0FBUCxDQUVBLENBZG9CLENBZ0JyQmd0SSxlQUFnQixTQUFXaHRJLEtBQVgsQ0FBbUIsQ0FFbENzWSxRQUFRNlAsSUFBUixDQUFjLHNFQUFkLEVBQ0EsYUFBYWYsY0FBTixDQUFzQnBuQixLQUF0QixDQUFQLENBRUEsQ0FyQm9CLENBQXRCLEVBeUJBMUQsT0FBTzRuQixNQUFQLENBQWVrWSxRQUFRNy9CLFNBQXZCLENBQWtDLENBRWpDMHdJLHFCQUFzQixTQUFXN3BILEtBQVgsQ0FBa0J1SCxNQUFsQixDQUEyQixDQUVoRHJTLFFBQVE2UCxJQUFSLENBQWMscUZBQWQsRUFDQSxZQUFZeUMsT0FBTCxDQUFjeEgsS0FBZCxDQUFxQnVILE1BQXJCLENBQVAsQ0FFQSxDQVBnQyxDQVFqQ3VpSCxnQkFBaUIsU0FBVzk0RyxNQUFYLENBQW9CLENBRXBDOWIsUUFBUTZQLElBQVIsQ0FBYyxnR0FBZCxFQUNBLGNBQWNXLFlBQVAsQ0FBcUIsSUFBckIsQ0FBUCxDQUVBLENBYmdDLENBY2pDcWtILHFCQUFzQixpQkFBcUIsQ0FFMUM3MEgsUUFBUU0sS0FBUixDQUFlLDBEQUFmLEVBRUEsQ0FsQmdDLENBbUJqQ3cwSCxjQUFlLFNBQVc1ekYsTUFBTyxzQkFBd0IsQ0FFeERsaEMsUUFBUTZQLElBQVIsQ0FBYywyR0FBZCxFQUNBLFlBQVkySixzQkFBTCxDQUE2QjBuQixNQUE3QixDQUFQLENBRUEsQ0F4QmdDLENBeUJqQzZ6RixvQkFBcUIscUNBQXlDLENBRTdELzBILFFBQVFNLEtBQVIsQ0FBZSx5REFBZixFQUVBLENBN0JnQyxDQUFsQyxFQWlDQXRjLE9BQU80bkIsTUFBUCxDQUFlbUgsUUFBUTl1QixTQUF2QixDQUFrQyxDQUVqQyt3SSxnQkFBaUIsU0FBV3puSCxDQUFYLENBQWUsQ0FFL0J2TixRQUFRNlAsSUFBUixDQUFjLHdFQUFkLEVBQ0EsWUFBWXVFLFlBQUwsQ0FBbUI3RyxDQUFuQixDQUFQLENBRUEsQ0FQZ0MsQ0FRakNvbkgscUJBQXNCLFNBQVc3cEgsS0FBWCxDQUFrQnVILE1BQWxCLENBQTJCLENBRWhEclMsUUFBUTZQLElBQVIsQ0FBYyxxRkFBZCxFQUNBLFlBQVl5QyxPQUFMLENBQWN4SCxLQUFkLENBQXFCdUgsTUFBckIsQ0FBUCxDQUVBLENBYmdDLENBY2pDNGlILFlBQWEsVUFBWSxDQUV4QixNQUFBLENBRUEsMkJBQU8sRUFBdUIsQ0FFN0IsR0FBS2hqSCxLQUFPNW9CLFNBQVosQ0FBd0I0b0IsR0FBSyxXQUFBLEVBQUwsQ0FDeEJqUyxRQUFRNlAsSUFBUixDQUFjLHNHQUFkLEVBQ0EsVUFBVTRFLG1CQUFILENBQXdCLElBQXhCLENBQThCLENBQTlCLENBQVAsQ0FFQSxDQU5ELENBUUEsQ0FaWSxFQWRvQixDQTJCakNxd0IsMEJBQTJCLFNBQVc1dUIsQ0FBWCxDQUFlLENBRXpDbFcsUUFBUTZQLElBQVIsQ0FBYyxnR0FBZCxFQUNBLFlBQVlvRywwQkFBTCxDQUFpQ0MsQ0FBakMsQ0FBUCxDQUVBLENBaENnQyxDQWlDakNnL0csZ0JBQWlCLFVBQVksQ0FFNUJsMUgsUUFBUTZQLElBQVIsQ0FBYyxxREFBZCxFQUVBLENBckNnQyxDQXNDakMra0gsZ0JBQWlCLFNBQVc5NEcsTUFBWCxDQUFvQixDQUVwQzliLFFBQVE2UCxJQUFSLENBQWMsZ0dBQWQsRUFDQSxjQUFjOEosWUFBUCxDQUFxQixJQUFyQixDQUFQLENBRUEsQ0EzQ2dDLENBNENqQ3c3RyxnQkFBaUIsU0FBV3I1RyxNQUFYLENBQW9CLENBRXBDOWIsUUFBUTZQLElBQVIsQ0FBYyxnR0FBZCxFQUNBLGNBQWM4SixZQUFQLENBQXFCLElBQXJCLENBQVAsQ0FFQSxDQWpEZ0MsQ0FrRGpDazdHLHFCQUFzQixpQkFBcUIsQ0FFMUM3MEgsUUFBUU0sS0FBUixDQUFlLDBEQUFmLEVBRUEsQ0F0RGdDLENBdURqQzgwSCxXQUFZLFNBQVdoNEgsQ0FBWCxDQUFlLENBRTFCNEMsUUFBUTZQLElBQVIsQ0FBYyxrR0FBZCxFQUNBelMsRUFBRW1sQixrQkFBRixDQUFzQixJQUF0QixFQUVBLENBNURnQyxDQTZEakM4eUcsWUFBYSxTQUFXdjVHLE1BQVgsQ0FBb0IsQ0FFaEM5YixRQUFRNlAsSUFBUixDQUFjLDRGQUFkLEVBQ0EsY0FBYzhKLFlBQVAsQ0FBcUIsSUFBckIsQ0FBUCxDQUVBLENBbEVnQyxDQW1FakM4SyxVQUFXLFVBQVksQ0FFdEJ6a0IsUUFBUU0sS0FBUixDQUFlLCtDQUFmLEVBRUEsQ0F2RWdDLENBd0VqQzRrQyxRQUFTLFVBQVksQ0FFcEJsbEMsUUFBUU0sS0FBUixDQUFlLDZDQUFmLEVBRUEsQ0E1RWdDLENBNkVqQzZrQyxRQUFTLFVBQVksQ0FFcEJubEMsUUFBUU0sS0FBUixDQUFlLDZDQUFmLEVBRUEsQ0FqRmdDLENBa0ZqQzhrQyxRQUFTLFVBQVksQ0FFcEJwbEMsUUFBUU0sS0FBUixDQUFlLDZDQUFmLEVBRUEsQ0F0RmdDLENBdUZqQ2cxSCxhQUFjLFVBQVksQ0FFekJ0MUgsUUFBUU0sS0FBUixDQUFlLGtEQUFmLEVBRUEsQ0EzRmdDLENBNEZqQ3cwSCxjQUFlLFNBQVc1ekYsTUFBTyxzQkFBd0IsQ0FFeERsaEMsUUFBUTZQLElBQVIsQ0FBYywyR0FBZCxFQUNBLFlBQVkySixzQkFBTCxDQUE2QjBuQixNQUE3QixDQUFQLENBRUEsQ0FqR2dDLENBa0dqQzZ6RixvQkFBcUIscUNBQXlDLENBRTdELzBILFFBQVFNLEtBQVIsQ0FBZSx5REFBZixFQUVBLENBdEdnQyxDQXVHakNpMUgsWUFBYSxTQUFXLzRHLElBQVgsQ0FBaUJDLEtBQWpCLENBQXdCRSxNQUF4QixDQUFnQ0QsR0FBaEMsQ0FBcUNFLElBQXJDLENBQTJDQyxHQUEzQyxDQUFpRCxDQUU3RDdjLFFBQVE2UCxJQUFSLENBQWMsc0hBQWQsRUFDQSxZQUFZME0sZUFBTCxDQUFzQkMsSUFBdEIsQ0FBNEJDLEtBQTVCLENBQW1DQyxHQUFuQyxDQUF3Q0MsTUFBeEMsQ0FBZ0RDLElBQWhELENBQXNEQyxHQUF0RCxDQUFQLENBRUEsQ0E1R2dDLENBQWxDLEVBZ0hBOFEsTUFBTTFwQyxTQUFOLENBQWdCdXhJLGtCQUFoQixDQUFxQyxTQUFXcm5HLElBQVgsQ0FBa0IsQ0FFdERudUIsUUFBUTZQLElBQVIsQ0FBYywyRUFBZCxFQUNBLFlBQVkyZSxjQUFMLENBQXFCTCxJQUFyQixDQUFQLENBRUEsQ0FMRCxDQU9BblIsV0FBVy80QixTQUFYLENBQXFCMndJLGVBQXJCLENBQXVDLFNBQVc5NEcsTUFBWCxDQUFvQixDQUUxRDliLFFBQVE2UCxJQUFSLENBQWMsaUhBQWQsRUFDQSxjQUFjMlIsZUFBUCxDQUF3QixJQUF4QixDQUFQLENBRUEsQ0FMRCxDQU9BeDlCLE9BQU80bkIsTUFBUCxDQUFla3VDLElBQUk3MUQsU0FBbkIsQ0FBOEIsQ0FFN0Jxd0ksa0JBQW1CLFNBQVc1cEcsR0FBWCxDQUFpQixDQUVuQzFxQixRQUFRNlAsSUFBUixDQUFjLHVFQUFkLEVBQ0EsWUFBWThiLGFBQUwsQ0FBb0JqQixHQUFwQixDQUFQLENBRUEsQ0FQNEIsQ0FRN0IrcUcsb0JBQXFCLFNBQVd4cEcsS0FBWCxDQUFtQixDQUV2Q2pzQixRQUFRNlAsSUFBUixDQUFjLDJFQUFkLEVBQ0EsWUFBWW1jLGVBQUwsQ0FBc0JDLEtBQXRCLENBQVAsQ0FFQSxDQWI0QixDQWM3QnNvRyxxQkFBc0IsU0FBVzFvRyxNQUFYLENBQW9CLENBRXpDN3JCLFFBQVE2UCxJQUFSLENBQWMsNkVBQWQsRUFDQSxZQUFZK2IsZ0JBQUwsQ0FBdUJDLE1BQXZCLENBQVAsQ0FFQSxDQW5CNEIsQ0FBOUIsRUF1QkE3bkMsT0FBTzRuQixNQUFQLENBQWV5eEMsU0FBU3A1RCxTQUF4QixDQUFtQyxDQUVsQ21tRyxLQUFNLFVBQVksQ0FFakJwcUYsUUFBUTZQLElBQVIsQ0FBYyx5REFBZCxFQUNBLFlBQVl1dUMsT0FBTCxFQUFQLENBRUEsQ0FQaUMsQ0FRbENzM0UsbUJBQW9CLFNBQVcvOUgsS0FBWCxDQUFrQmhILE1BQWxCLENBQTJCLENBRTlDcVAsUUFBUTZQLElBQVIsQ0FBYyw0RUFBZCxFQUNBLFlBQVkydEMsWUFBTCxDQUFtQjdsRCxLQUFuQixDQUEwQmhILE1BQTFCLENBQVAsQ0FFQSxDQWJpQyxDQWNsQ2dsSSxTQUFVLFNBQVdobEksTUFBWCxDQUFvQixDQUU3QnFQLFFBQVE2UCxJQUFSLENBQWMsaUVBQWQsRUFDQSxZQUFZd3VDLFdBQUwsQ0FBa0IxdEQsTUFBbEIsQ0FBUCxDQUVBLENBbkJpQyxDQW9CbEN3eUIsT0FBUSxTQUFXeHlCLE1BQVgsQ0FBb0IsQ0FFM0JxUCxRQUFRNlAsSUFBUixDQUFjLDZEQUFkLEVBQ0EsWUFBWXl0QyxTQUFMLENBQWdCM3NELE1BQWhCLENBQVAsQ0FFQSxDQXpCaUMsQ0EwQmxDczdCLE1BQU8sU0FBV3Q3QixNQUFYLENBQW9CLENBRTFCcVAsUUFBUTZQLElBQVIsQ0FBYywyREFBZCxFQUNBLFlBQVl5dUMsUUFBTCxDQUFlM3RELE1BQWYsQ0FBUCxDQUVBLENBL0JpQyxDQUFuQyxFQW1DQTNNLE9BQU80bkIsTUFBUCxDQUFleXhDLFFBQWYsQ0FBeUIsQ0FFeEJxNEUsbUJBQW9CLFNBQVcvOUgsS0FBWCxDQUFrQmxLLENBQWxCLENBQXFCRixDQUFyQixDQUF3QlcsQ0FBeEIsQ0FBMkJ5QyxNQUEzQixDQUFvQyxDQUV2RHFQLFFBQVE2UCxJQUFSLENBQWMsNEVBQWQsRUFDQSxnQkFBZ0IydEMsWUFBVCxDQUF1QjdsRCxLQUF2QixDQUE4QmxLLENBQTlCLENBQWlDRixDQUFqQyxDQUFvQ1csQ0FBcEMsQ0FBdUN5QyxNQUF2QyxDQUFQLENBRUEsQ0FQdUIsQ0FReEJ3eUIsT0FBUSxTQUFXMTFCLENBQVgsQ0FBY0YsQ0FBZCxDQUFpQlcsQ0FBakIsQ0FBb0J5QyxNQUFwQixDQUE2QixDQUVwQ3FQLFFBQVE2UCxJQUFSLENBQWMsNkRBQWQsRUFDQSxnQkFBZ0J5dEMsU0FBVCxDQUFvQjd2RCxDQUFwQixDQUF1QkYsQ0FBdkIsQ0FBMEJXLENBQTFCLENBQTZCeUMsTUFBN0IsQ0FBUCxDQUVBLENBYnVCLENBQXpCLEVBaUJBM00sT0FBTzRuQixNQUFQLENBQWUrMkYsTUFBTTErRyxTQUFyQixDQUFnQyxDQUUvQjJ4SSxpQkFBa0IsU0FBV2o2QixTQUFYLENBQXVCLENBRXhDMzdGLFFBQVE2UCxJQUFSLENBQWMsa0ZBQWQsRUFDQSxZQUFZaS9FLGFBQUwsQ0FBb0I2TSxTQUFwQixDQUFQLENBRUEsQ0FQOEIsQ0FRL0JrNkIsUUFBUyxTQUFXMXRHLE9BQVgsQ0FBcUIsQ0FFN0Jub0IsUUFBUTZQLElBQVIsQ0FBYywwRUFBZCxFQUNBLDBCQUFPLENBQXFCLElBQXJCLENBQTJCc1ksT0FBM0IsQ0FBUCxDQUVBLENBYjhCLENBYy9CMnRHLGFBQWMsU0FBVzN0RyxPQUFYLENBQXFCLENBRWxDbm9CLFFBQVE2UCxJQUFSLENBQWMsNkVBQWQsRUFDQSx3QkFBTyxDQUFtQixJQUFuQixDQUF5QnNZLE9BQXpCLENBQVAsQ0FFQSxDQW5COEIsQ0FBaEMsRUF1QkFua0MsT0FBTzRuQixNQUFQLENBQWVzRCxRQUFRanJCLFNBQXZCLENBQWtDLENBRWpDOHhJLGNBQWUsU0FBV3ZqSCxTQUFYLENBQXNCN2dCLEtBQXRCLENBQTZCMGdCLE1BQTdCLENBQXNDLENBRXBEclMsUUFBUTZQLElBQVIsQ0FBYyw2RUFBZCxFQUNBLFlBQVkwQyxtQkFBTCxDQUEwQkMsU0FBMUIsQ0FBcUM3Z0IsS0FBckMsQ0FBNEMwZ0IsTUFBNUMsQ0FBUCxDQUVBLENBUGdDLENBUWpDMmpILG9CQUFxQixTQUFXNTRILENBQVgsQ0FBZSxDQUVuQzRDLFFBQVE2UCxJQUFSLENBQWMsbUZBQWQsRUFDQSxZQUFZZ0MsbUJBQUwsQ0FBMEJ6VSxDQUExQixDQUFQLENBRUEsQ0FiZ0MsQ0FjakM2NEgsZ0JBQWlCLFVBQVksQ0FFNUJqMkgsUUFBUTZQLElBQVIsQ0FBYywyRUFBZCxFQUNBLFlBQVl1QixlQUFMLEVBQVAsQ0FFQSxDQW5CZ0MsQ0FBbEMsRUF1QkFwdEIsT0FBTzRuQixNQUFQLENBQWV1VixRQUFRbDlCLFNBQXZCLENBQWtDLENBRWpDaXlJLDJCQUE0QixVQUFZLENBRXZDbDJILFFBQVFNLEtBQVIsQ0FBZSwyR0FBZixFQUVBLENBTmdDLENBT2pDNjFILHVCQUF3QixVQUFZLENBRW5DbjJILFFBQVFNLEtBQVIsQ0FBZSxtR0FBZixFQUVBLENBWGdDLENBWWpDODFILHNCQUF1QixTQUFXN29ILENBQVgsQ0FBZSxDQUVyQ3ZOLFFBQVE2UCxJQUFSLENBQWMsdUZBQWQsRUFDQSxZQUFZK1QscUJBQUwsQ0FBNEJyVyxDQUE1QixDQUFQLENBRUEsQ0FqQmdDLENBa0JqQzhvSCxtQkFBb0IsU0FBVzlvSCxDQUFYLENBQWUsQ0FFbEN2TixRQUFRNlAsSUFBUixDQUFjLGlGQUFkLEVBQ0EsWUFBWWdVLGtCQUFMLENBQXlCdFcsQ0FBekIsQ0FBUCxDQUVBLENBdkJnQyxDQXdCakMrb0gsb0JBQXFCLFNBQVcza0ksS0FBWCxDQUFrQnFxQixNQUFsQixDQUEyQixDQUUvQ2hjLFFBQVE2UCxJQUFSLENBQWMsbUZBQWQsRUFDQSxZQUFZNEUsbUJBQUwsQ0FBMEJ1SCxNQUExQixDQUFrQ3JxQixLQUFsQyxDQUFQLENBRUEsQ0E3QmdDLENBOEJqQzRrSSxnQkFBaUIsU0FBV2hwSCxDQUFYLENBQWUsQ0FFL0J2TixRQUFRNlAsSUFBUixDQUFjLHFGQUFkLEVBQ0EsWUFBWThKLFlBQUwsQ0FBbUJwTSxDQUFuQixDQUFQLENBRUEsQ0FuQ2dDLENBb0NqQ3dvSCxjQUFlLFNBQVd2akgsU0FBWCxDQUFzQjdnQixLQUF0QixDQUE2QjBnQixNQUE3QixDQUFzQyxDQUVwRHJTLFFBQVE2UCxJQUFSLENBQWMsNkVBQWQsRUFDQSxZQUFZMEMsbUJBQUwsQ0FBMEJDLFNBQTFCLENBQXFDN2dCLEtBQXJDLENBQTRDMGdCLE1BQTVDLENBQVAsQ0FFQSxDQXpDZ0MsQ0EwQ2pDMmpILG9CQUFxQixTQUFXNTRILENBQVgsQ0FBZSxDQUVuQzRDLFFBQVE2UCxJQUFSLENBQWMsbUZBQWQsRUFDQSxZQUFZZ0MsbUJBQUwsQ0FBMEJ6VSxDQUExQixDQUFQLENBRUEsQ0EvQ2dDLENBZ0RqQzY0SCxnQkFBaUIsVUFBWSxDQUU1QmoySCxRQUFRNlAsSUFBUixDQUFjLDJFQUFkLEVBQ0EsWUFBWXVCLGVBQUwsRUFBUCxDQUVBLENBckRnQyxDQUFsQyxFQXlEQXB0QixPQUFPNG5CLE1BQVAsQ0FBZStiLFFBQVExakMsU0FBdkIsQ0FBa0MsQ0FFakM4eEksY0FBZSxTQUFXdmpILFNBQVgsQ0FBc0I3Z0IsS0FBdEIsQ0FBNkIwZ0IsTUFBN0IsQ0FBc0MsQ0FFcERyUyxRQUFRNlAsSUFBUixDQUFjLDZFQUFkLEVBQ0EsWUFBWTBDLG1CQUFMLENBQTBCQyxTQUExQixDQUFxQzdnQixLQUFyQyxDQUE0QzBnQixNQUE1QyxDQUFQLENBRUEsQ0FQZ0MsQ0FRakM0akgsZ0JBQWlCLFVBQVksQ0FFNUJqMkgsUUFBUTZQLElBQVIsQ0FBYywyRUFBZCxFQUNBLFlBQVl1QixlQUFMLEVBQVAsQ0FFQSxDQWJnQyxDQUFsQyxFQWlCQTtFQUVBcHRCLE9BQU80bkIsTUFBUCxDQUFlaStCLFNBQVM1bEQsU0FBeEIsQ0FBbUMsQ0FFbEN1eUksZ0JBQWlCLFVBQVksQ0FFNUJ4MkgsUUFBUU0sS0FBUixDQUFlLHNEQUFmLEVBRUEsQ0FOaUMsQ0FPbEMyaUYscUJBQXNCLFVBQVksQ0FFakNqakYsUUFBUU0sS0FBUixDQUFlLDBHQUFmLEVBRUEsQ0FYaUMsQ0FBbkMsRUFlQXRjLE9BQU80bkIsTUFBUCxDQUFlODNCLFNBQVN6L0MsU0FBeEIsQ0FBbUMsQ0FFbEN3eUksZUFBZ0IsU0FBVzF2SSxJQUFYLENBQWtCLENBRWpDaVosUUFBUTZQLElBQVIsQ0FBYywyRUFBZCxFQUNBLFlBQVlpMkIsZUFBTCxDQUFzQi8rQyxJQUF0QixDQUFQLENBRUEsQ0FQaUMsQ0FRbEMydkksWUFBYSxVQUFZLENBRXhCMTJILFFBQVE2UCxJQUFSLENBQWMsMkVBQWQsRUFFQSxDQVppQyxDQWFsQzRVLFVBQVcsU0FBV29NLFFBQVgsQ0FBcUJ4VixJQUFyQixDQUE0QixDQUV0Q3JiLFFBQVE2UCxJQUFSLENBQWMsZ0dBQWQsRUFDQSxZQUFZdzFCLGVBQUwsQ0FBc0JocUIsSUFBdEIsQ0FBNEJ3VixRQUE1QixDQUFQLENBRUEsQ0FsQmlDLENBbUJsQzhsRyxpQkFBa0IsVUFBWSxDQUU3QjMySCxRQUFRTSxLQUFSLENBQWUsZ0hBQWYsRUFFQSxDQXZCaUMsQ0FBbkMsRUEyQkF0YyxPQUFPc1AsZ0JBQVAsQ0FBeUJvd0MsU0FBU3ovQyxTQUFsQyxDQUE2QyxDQUU1QzJ5SSxXQUFZLENBQ1hub0ksSUFBSyxVQUFZLENBRWhCdVIsUUFBUTZQLElBQVIsQ0FBYyxxREFBZCxFQUNBLFlBQVl3VSxRQUFMLENBQWNqUCxLQUFyQixDQUVBLENBTlUsQ0FPWC9aLElBQUssU0FBVzNULEtBQVgsQ0FBbUIsQ0FFdkJzWSxRQUFRNlAsSUFBUixDQUFjLHFEQUFkLEVBQ0EsS0FBS3dVLFFBQUwsQ0FBY2pQLEtBQWQsQ0FBc0IxdEIsS0FBdEIsQ0FFQSxDQVpVLENBRmdDLENBZ0I1Q212SSxjQUFlLENBQ2Rwb0ksSUFBSyxVQUFZLENBRWhCdVIsUUFBUTZQLElBQVIsQ0FBYywrRkFBZCxFQUVBLENBTGEsQ0FNZHhVLElBQUssVUFBWSxDQUVoQjJFLFFBQVE2UCxJQUFSLENBQWMsK0ZBQWQsRUFFQSxDQVZhLENBaEI2QixDQUE3QyxFQStCQTdyQixPQUFPc1AsZ0JBQVAsQ0FBeUI4dEYsSUFBSW45RixTQUE3QixDQUF3QyxDQUV2Q3l5RixRQUFTLENBQ1Jqb0YsSUFBSyxVQUFZLENBRWhCdVIsUUFBUTZQLElBQVIsQ0FBYyxrREFBZCxFQUNBLFlBQVlzeEUsTUFBWixDQUVBLENBTk8sQ0FGOEIsQ0FBeEMsRUFhQW45RixPQUFPd0ssY0FBUCxDQUF1Qmt6RixTQUFTejlGLFNBQWhDLENBQTJDLGtCQUEzQyxDQUErRCxDQUU5RHdLLElBQUssVUFBWSxDQUVoQnVSLFFBQVE2UCxJQUFSLENBQWMsb0RBQWQsRUFFQSxDQU42RCxDQU85RHhVLElBQUssVUFBWSxDQUVoQjJFLFFBQVE2UCxJQUFSLENBQWMsb0RBQWQsRUFFQSxDQVg2RCxDQUEvRCxFQWVBN3JCLE9BQU93SyxjQUFQLENBQXVCOHNHLE1BQU1yM0csU0FBN0IsQ0FBd0Msc0JBQXhDLENBQWdFLENBRS9Ed0ssSUFBSyxVQUFZLENBRWhCdVIsUUFBUTZQLElBQVIsQ0FBYyxnRUFBZCxFQUNBLFlBQVl3ckYsa0JBQVosQ0FFQSxDQVA4RCxDQVEvRGhnRyxJQUFLLFNBQVczVCxLQUFYLENBQW1CLENBRXZCc1ksUUFBUTZQLElBQVIsQ0FBYyxnRUFBZCxFQUNBLEtBQUt3ckYsa0JBQUwsQ0FBMEIzekcsS0FBMUIsQ0FFQSxDQWI4RCxDQUFoRSxFQWlCQTtFQUVBMG9GLGtCQUFrQm5zRixTQUFsQixDQUE0QjZ5SSxPQUE1QixDQUFzQyxTQUFXdm1ELFdBQVgsQ0FBd0JMLFNBQXhCLENBQW9DLENBRXpFbHdFLFFBQVE2UCxJQUFSLENBQWMsa0RBQ1osOERBREYsRUFHQSxHQUFLcWdFLFlBQWM3bUYsU0FBbkIsQ0FBK0IsS0FBSzZtRixTQUFMLENBQWlCQSxTQUFqQixDQUMvQixLQUFLSSxjQUFMLENBQXFCQyxXQUFyQixFQUVBLENBUkQsQ0FVQTtFQUVBdnNGLE9BQU9zUCxnQkFBUCxDQUF5Qnd2RyxNQUFNNytHLFNBQS9CLENBQTBDLENBQ3pDOHlJLFdBQVksQ0FDWDE3SCxJQUFLLFVBQVksQ0FFaEIyRSxRQUFRNlAsSUFBUixDQUFjLDRDQUFkLEVBRUEsQ0FMVSxDQUQ2QixDQVF6Q21uSCxnQkFBaUIsQ0FDaEIzN0gsSUFBSyxTQUFXM1QsS0FBWCxDQUFtQixDQUV2QnNZLFFBQVE2UCxJQUFSLENBQWMsMERBQWQsRUFDQSxLQUFLeXRCLE1BQUwsQ0FBWW5iLE1BQVosQ0FBbUI0dEQsR0FBbkIsQ0FBeUJyb0YsS0FBekIsQ0FFQSxDQU5lLENBUndCLENBZ0J6Q3V2SSxpQkFBa0IsQ0FDakI1N0gsSUFBSyxTQUFXM1QsS0FBWCxDQUFtQixDQUV2QnNZLFFBQVE2UCxJQUFSLENBQWMsNERBQWQsRUFDQSxLQUFLeXRCLE1BQUwsQ0FBWW5iLE1BQVosQ0FBbUIzRixJQUFuQixDQUEwQjkwQixLQUExQixDQUVBLENBTmdCLENBaEJ1QixDQXdCekN3dkksa0JBQW1CLENBQ2xCNzdILElBQUssU0FBVzNULEtBQVgsQ0FBbUIsQ0FFdkJzWSxRQUFRNlAsSUFBUixDQUFjLDhEQUFkLEVBQ0EsS0FBS3l0QixNQUFMLENBQVluYixNQUFaLENBQW1CMUYsS0FBbkIsQ0FBMkIvMEIsS0FBM0IsQ0FFQSxDQU5pQixDQXhCc0IsQ0FnQ3pDeXZJLGdCQUFpQixDQUNoQjk3SCxJQUFLLFNBQVczVCxLQUFYLENBQW1CLENBRXZCc1ksUUFBUTZQLElBQVIsQ0FBYywwREFBZCxFQUNBLEtBQUt5dEIsTUFBTCxDQUFZbmIsTUFBWixDQUFtQnpGLEdBQW5CLENBQXlCaDFCLEtBQXpCLENBRUEsQ0FOZSxDQWhDd0IsQ0F3Q3pDMHZJLG1CQUFvQixDQUNuQi83SCxJQUFLLFNBQVczVCxLQUFYLENBQW1CLENBRXZCc1ksUUFBUTZQLElBQVIsQ0FBYyxnRUFBZCxFQUNBLEtBQUt5dEIsTUFBTCxDQUFZbmIsTUFBWixDQUFtQnhGLE1BQW5CLENBQTRCajFCLEtBQTVCLENBRUEsQ0FOa0IsQ0F4Q3FCLENBZ0R6Q3kyQyxpQkFBa0IsQ0FDakI5aUMsSUFBSyxTQUFXM1QsS0FBWCxDQUFtQixDQUV2QnNZLFFBQVE2UCxJQUFSLENBQWMsNERBQWQsRUFDQSxLQUFLeXRCLE1BQUwsQ0FBWW5iLE1BQVosQ0FBbUJ2RixJQUFuQixDQUEwQmwxQixLQUExQixDQUVBLENBTmdCLENBaER1QixDQXdEekMwMkMsZ0JBQWlCLENBQ2hCL2lDLElBQUssU0FBVzNULEtBQVgsQ0FBbUIsQ0FFdkJzWSxRQUFRNlAsSUFBUixDQUFjLDBEQUFkLEVBQ0EsS0FBS3l0QixNQUFMLENBQVluYixNQUFaLENBQW1CdEYsR0FBbkIsQ0FBeUJuMUIsS0FBekIsQ0FFQSxDQU5lLENBeER3QixDQWdFekMydkksb0JBQXFCLENBQ3BCaDhILElBQUssVUFBWSxDQUVoQjJFLFFBQVE2UCxJQUFSLENBQWMsZ0hBQWQsRUFFQSxDQUxtQixDQWhFb0IsQ0F1RXpDMHRCLFdBQVksQ0FDWGxpQyxJQUFLLFNBQVczVCxLQUFYLENBQW1CLENBRXZCc1ksUUFBUTZQLElBQVIsQ0FBYywrQ0FBZCxFQUNBLEtBQUt5dEIsTUFBTCxDQUFZaTVCLElBQVosQ0FBbUI3dUUsS0FBbkIsQ0FFQSxDQU5VLENBdkU2QixDQStFekM0dkksZUFBZ0IsQ0FDZmo4SCxJQUFLLFVBQVksQ0FFaEIyRSxRQUFRNlAsSUFBUixDQUFjLGdEQUFkLEVBRUEsQ0FMYyxDQS9FeUIsQ0FzRnpDMG5ILGVBQWdCLENBQ2ZsOEgsSUFBSyxTQUFXM1QsS0FBWCxDQUFtQixDQUV2QnNZLFFBQVE2UCxJQUFSLENBQWMsNERBQWQsRUFDQSxLQUFLeXRCLE1BQUwsQ0FBWWs1QixPQUFaLENBQW9CMXZDLEtBQXBCLENBQTRCcC9CLEtBQTVCLENBRUEsQ0FOYyxDQXRGeUIsQ0E4RnpDOHZJLGdCQUFpQixDQUNoQm44SCxJQUFLLFNBQVczVCxLQUFYLENBQW1CLENBRXZCc1ksUUFBUTZQLElBQVIsQ0FBYyw4REFBZCxFQUNBLEtBQUt5dEIsTUFBTCxDQUFZazVCLE9BQVosQ0FBb0J6dkMsTUFBcEIsQ0FBNkJyL0IsS0FBN0IsQ0FFQSxDQU5lLENBOUZ3QixDQUExQyxFQXdHQTtFQUVBMUQsT0FBT3NQLGdCQUFQLENBQXlCbThDLGdCQUFnQnhyRCxTQUF6QyxDQUFvRCxDQUVuRHlHLE9BQVEsQ0FDUCtELElBQUssVUFBWSxDQUVoQnVSLFFBQVE2UCxJQUFSLENBQWMseUVBQWQsRUFDQSxZQUFZL0UsS0FBTCxDQUFXcGdCLE1BQWxCLENBRUEsQ0FOTSxDQUYyQyxDQVVuRCtzSSxpQkFBa0IsdUJBQTJCLENBRTVDejNILFFBQVFNLEtBQVIsQ0FBZSw4REFBZixFQUVBLENBZGtELENBQXBELEVBa0JBdGMsT0FBTzRuQixNQUFQLENBQWVvbUMsZUFBZS90RCxTQUE5QixDQUF5QyxDQUV4Q3l6SSxTQUFVLFNBQVcvbEksS0FBWCxDQUFtQixDQUU1QnFPLFFBQVE2UCxJQUFSLENBQWMsb0VBQWQsRUFDQSxLQUFLcWlDLFFBQUwsQ0FBZXZnRCxLQUFmLEVBRUEsQ0FQdUMsQ0FReENnbUksWUFBYSxTQUFXcHBHLEtBQVgsQ0FBa0I5VSxLQUFsQixDQUF5Qjg3RSxXQUF6QixDQUF1QyxDQUVuRCxHQUFLQSxjQUFnQmxzRyxTQUFyQixDQUFpQyxDQUVoQzJXLFFBQVE2UCxJQUFSLENBQWMsc0VBQWQsRUFFQSxDQUNEN1AsUUFBUTZQLElBQVIsQ0FBYywwREFBZCxFQUNBLEtBQUswaUMsUUFBTCxDQUFlaGtCLEtBQWYsQ0FBc0I5VSxLQUF0QixFQUVBLENBbEJ1QyxDQW1CeENtK0csZUFBZ0IsVUFBWSxDQUUzQjUzSCxRQUFRNlAsSUFBUixDQUFjLGdFQUFkLEVBQ0EsS0FBSzJpQyxXQUFMLEdBRUEsQ0F4QnVDLENBeUJ4Q2drRixnQkFBaUIsVUFBWSxDQUU1QngySCxRQUFRNlAsSUFBUixDQUFjLDREQUFkLEVBRUEsQ0E3QnVDLENBOEJ4Q2dvSCxlQUFnQixVQUFZLENBRTNCNzNILFFBQVE2UCxJQUFSLENBQWMsMkRBQWQsRUFFQSxDQWxDdUMsQ0FBekMsRUFzQ0E3ckIsT0FBT3NQLGdCQUFQLENBQXlCMCtDLGVBQWUvdEQsU0FBeEMsQ0FBbUQsQ0FFbER1cEgsVUFBVyxDQUNWLytHLElBQUssVUFBWSxDQUVoQnVSLFFBQVFNLEtBQVIsQ0FBZSwrREFBZixFQUNBLFlBQVlxcUMsTUFBWixDQUVBLENBTlMsQ0FGdUMsQ0FVbEQ4aUUsUUFBUyxDQUNSaC9HLElBQUssVUFBWSxDQUVoQnVSLFFBQVE2UCxJQUFSLENBQWMsNkRBQWQsRUFDQSxZQUFZODZCLE1BQVosQ0FFQSxDQU5PLENBVnlDLENBQW5ELEVBcUJBO0VBRUEzbUQsT0FBTzRuQixNQUFQLENBQWV1bUYsc0JBQXNCbHVHLFNBQXJDLENBQWdELENBRS9DNnpJLFVBQVcsVUFBWSxDQUV0QjkzSCxRQUFRTSxLQUFSLENBQWUsNkRBQWYsRUFFQSxDQU44QyxDQVEvQ3kzSCxhQUFjLFVBQVksQ0FFekIvM0gsUUFBUU0sS0FBUixDQUFlLGdFQUFmLEVBRUEsQ0FaOEMsQ0FjL0NxdEYsU0FBVSxVQUFZLENBRXJCM3RGLFFBQVFNLEtBQVIsQ0FBZSw0REFBZixFQUVBLENBbEI4QyxDQUFoRCxFQXNCQTtFQUVBdGMsT0FBT3NQLGdCQUFQLENBQXlCczdILFFBQVEzcUksU0FBakMsQ0FBNEMsQ0FFM0M0OEMsUUFBUyxDQUNSeGxDLElBQUssVUFBWSxDQUVoQjJFLFFBQVE2UCxJQUFSLENBQWMsZ0ZBQWQsRUFFQSxDQUxPLENBRmtDLENBUzNDd1csU0FBVSxDQUNUMytCLE1BQU8sVUFBWSxDQUVsQnNZLFFBQVE2UCxJQUFSLENBQWMsbUZBQWQsRUFDQSxXQUFBLENBRUEsQ0FOUSxDQVRpQyxDQUE1QyxFQW9CQTtFQUVBN3JCLE9BQU9zUCxnQkFBUCxDQUF5QnFrRCxTQUFTMXpELFNBQWxDLENBQTZDLENBRTVDK3pJLFdBQVksQ0FDWHZwSSxJQUFLLFVBQVksQ0FFaEJ1UixRQUFRNlAsSUFBUixDQUFjLCtDQUFkLEVBRUEsQ0FMVSxDQU1YeFUsSUFBSyxVQUFZLENBRWhCMkUsUUFBUTZQLElBQVIsQ0FBYywrQ0FBZCxFQUVBLENBVlUsQ0FGZ0MsQ0FjNUNvb0gsUUFBUyxDQUNSeHBJLElBQUssVUFBWSxDQUVoQnVSLFFBQVE2UCxJQUFSLENBQWMsNENBQWQsRUFDQSxnQkFBTyxFQUFQLENBRUEsQ0FOTyxDQWRtQyxDQXVCNUN1OUYsUUFBUyxDQUNSMytHLElBQUssVUFBWSxDQUVoQnVSLFFBQVFNLEtBQVIsQ0FBZSxTQUFXLEtBQUs1YSxJQUFoQixDQUF1QixvRUFBdEMsRUFFQSxDQUxPLENBTVIyVixJQUFLLFNBQVczVCxLQUFYLENBQW1CLENBRXZCc1ksUUFBUTZQLElBQVIsQ0FBYyxTQUFXLEtBQUtucUIsSUFBaEIsQ0FBdUIsb0VBQXJDLEVBQ0EsS0FBS3F3RCxXQUFMLENBQXFCcnVELFFBQVVzd0QsV0FBL0IsQ0FFQSxDQVhPLENBdkJtQyxDQUE3QyxFQXVDQWgwRCxPQUFPc1AsZ0JBQVAsQ0FBeUJxL0Qsa0JBQWtCMXVFLFNBQTNDLENBQXNELENBRXJEaTBJLE1BQU8sQ0FDTnpwSSxJQUFLLFVBQVksQ0FFaEJ1UixRQUFRNlAsSUFBUixDQUFjLDJGQUFkLEVBQ0EsWUFBQSxDQUVBLENBTkssQ0FPTnhVLElBQUssVUFBWSxDQUVoQjJFLFFBQVE2UCxJQUFSLENBQWMsMEZBQWQsRUFFQSxDQVhLLENBRjhDLENBQXRELEVBa0JBN3JCLE9BQU9zUCxnQkFBUCxDQUF5QnFtRCxlQUFlMTFELFNBQXhDLENBQW1ELENBRWxEbTFELFlBQWEsQ0FDWjNxRCxJQUFLLFVBQVksQ0FFaEJ1UixRQUFRNlAsSUFBUixDQUFjLCtFQUFkLEVBQ0EsWUFBWTFGLFVBQUwsQ0FBZ0JpdkMsV0FBdkIsQ0FFQSxDQU5XLENBT1ovOUMsSUFBSyxTQUFXM1QsS0FBWCxDQUFtQixDQUV2QnNZLFFBQVE2UCxJQUFSLENBQWMsZ0ZBQWQsRUFDQSxLQUFLMUYsVUFBTCxDQUFnQml2QyxXQUFoQixDQUE4QjF4RCxLQUE5QixDQUVBLENBWlcsQ0FGcUMsQ0FBbkQsRUFtQkE7RUFFQTFELE9BQU80bkIsTUFBUCxDQUFldXNILGNBQWNsMEksU0FBN0IsQ0FBd0MsQ0FFdkNtMEksdUJBQXdCLFVBQVksQ0FFbkNwNEgsUUFBUTZQLElBQVIsQ0FBYywyRUFBZCxFQUNBLFlBQVlta0QsZUFBTCxFQUFQLENBRUEsQ0FQc0MsQ0FTdkMvUCxpQkFBa0IsVUFBWSxDQUU3QmprRCxRQUFRNlAsSUFBUixDQUFjLG1GQUFkLEVBQ0EsWUFBWXlpRCxZQUFMLENBQWtCck8sZ0JBQWxCLEVBQVAsQ0FFQSxDQWRzQyxDQWdCdkNvMEUsYUFBYyxVQUFZLENBRXpCcjRILFFBQVE2UCxJQUFSLENBQWMsc0VBQWQsRUFDQSxZQUFZeWlELFlBQUwsQ0FBa0JobEIsU0FBekIsQ0FFQSxDQXJCc0MsQ0F1QnZDZ3JGLGFBQWMsVUFBWSxDQUV6QnQ0SCxRQUFRNlAsSUFBUixDQUFjLDZEQUFkLEVBQ0EsWUFBWXBuQixLQUFMLENBQVc0QixLQUFYLEVBQVAsQ0FFQSxDQTVCc0MsQ0E4QnZDa3VJLHNCQUF1QixVQUFZLENBRWxDdjRILFFBQVE2UCxJQUFSLENBQWMsZ0dBQWQsRUFDQSxZQUFZMUYsVUFBTCxDQUFnQjFiLEdBQWhCLENBQXFCLG1CQUFyQixDQUFQLENBRUEsQ0FuQ3NDLENBb0N2QytwSSwwQkFBMkIsVUFBWSxDQUV0Q3g0SCxRQUFRNlAsSUFBUixDQUFjLHlHQUFkLEVBQ0EsWUFBWTFGLFVBQUwsQ0FBZ0IxYixHQUFoQixDQUFxQix3QkFBckIsQ0FBUCxDQUVBLENBekNzQyxDQTBDdkNncUksNEJBQTZCLFVBQVksQ0FFeEN6NEgsUUFBUTZQLElBQVIsQ0FBYyw2R0FBZCxFQUNBLFlBQVkxRixVQUFMLENBQWdCMWIsR0FBaEIsQ0FBcUIsMEJBQXJCLENBQVAsQ0FFQSxDQS9Dc0MsQ0FnRHZDaXFJLDhCQUErQixVQUFZLENBRTFDMTRILFFBQVE2UCxJQUFSLENBQWMsb0hBQWQsRUFDQSxZQUFZMUYsVUFBTCxDQUFnQjFiLEdBQWhCLENBQXFCLCtCQUFyQixDQUFQLENBRUEsQ0FyRHNDLENBc0R2Q2txSSwrQkFBZ0MsVUFBWSxDQUUzQzM0SCxRQUFRNlAsSUFBUixDQUFjLHNIQUFkLEVBQ0EsWUFBWTFGLFVBQUwsQ0FBZ0IxYixHQUFoQixDQUFxQixnQ0FBckIsQ0FBUCxDQUVBLENBM0RzQyxDQTREdkNtcUksb0JBQXFCLFVBQVksQ0FFaEM1NEgsUUFBUTZQLElBQVIsQ0FBYyw2RkFBZCxFQUNBLFlBQVkxRixVQUFMLENBQWdCMWIsR0FBaEIsQ0FBcUIsa0JBQXJCLENBQVAsQ0FFQSxDQWpFc0MsQ0FrRXZDeWdFLHVCQUF3QixVQUFZLENBRW5DbHZELFFBQVE2UCxJQUFSLENBQWMscUZBQWQsRUFDQSxZQUFZeWlELFlBQUwsQ0FBa0J2TyxjQUF6QixDQUVBLENBdkVzQyxDQXdFdkM4MEUsd0JBQXlCLFVBQVksQ0FFcEM3NEgsUUFBUTZQLElBQVIsQ0FBYyx1R0FBZCxFQUNBLFlBQVkxRixVQUFMLENBQWdCMWIsR0FBaEIsQ0FBcUIsd0JBQXJCLENBQVAsQ0FFQSxDQTdFc0MsQ0E4RXZDcXFJLGtCQUFtQixTQUFXOWdELE9BQVgsQ0FBcUIsQ0FFdkNoNEUsUUFBUTZQLElBQVIsQ0FBYyxxRUFBZCxFQUNBLEtBQUs0cEQsY0FBTCxDQUFxQnVlLE9BQXJCLEVBRUEsQ0FuRnNDLENBb0Z2Q3VELGFBQWMsVUFBWSxDQUV6QnY3RSxRQUFRNlAsSUFBUixDQUFjLHdEQUFkLEVBRUEsQ0F4RnNDLENBeUZ2Q2twSCxhQUFjLFVBQVksQ0FFekIvNEgsUUFBUTZQLElBQVIsQ0FBYyx3REFBZCxFQUVBLENBN0ZzQyxDQThGdkNtcEgsY0FBZSxVQUFZLENBRTFCaDVILFFBQVE2UCxJQUFSLENBQWMseURBQWQsRUFFQSxDQWxHc0MsQ0FtR3ZDb3BILGdCQUFpQixVQUFZLENBRTVCajVILFFBQVE2UCxJQUFSLENBQWMsMkRBQWQsRUFFQSxDQXZHc0MsQ0F3R3ZDcXBILGVBQWdCLFVBQVksQ0FFM0JsNUgsUUFBUTZQLElBQVIsQ0FBYywwREFBZCxFQUVBLENBNUdzQyxDQUF4QyxFQWdIQTdyQixPQUFPc1AsZ0JBQVAsQ0FBeUI2a0ksY0FBY2wwSSxTQUF2QyxDQUFrRCxDQUVqRHlyRSxpQkFBa0IsQ0FDakJqaEUsSUFBSyxVQUFZLENBRWhCLFlBQVl1bUUsU0FBTCxDQUFlaHRCLE9BQXRCLENBRUEsQ0FMZ0IsQ0FNakIzc0MsSUFBSyxTQUFXM1QsS0FBWCxDQUFtQixDQUV2QnNZLFFBQVE2UCxJQUFSLENBQWMsbUVBQWQsRUFDQSxLQUFLbWxELFNBQUwsQ0FBZWh0QixPQUFmLENBQXlCdGdELEtBQXpCLENBRUEsQ0FYZ0IsQ0FGK0IsQ0FlakR5bUUsY0FBZSxDQUNkMS9ELElBQUssVUFBWSxDQUVoQixZQUFZdW1FLFNBQUwsQ0FBZXR2RSxJQUF0QixDQUVBLENBTGEsQ0FNZDJWLElBQUssU0FBVzNULEtBQVgsQ0FBbUIsQ0FFdkJzWSxRQUFRNlAsSUFBUixDQUFjLDZEQUFkLEVBQ0EsS0FBS21sRCxTQUFMLENBQWV0dkUsSUFBZixDQUFzQmdDLEtBQXRCLENBRUEsQ0FYYSxDQWZrQyxDQTRCakR5eEksa0JBQW1CLENBQ2xCMXFJLElBQUssVUFBWSxDQUVoQnVSLFFBQVE2UCxJQUFSLENBQWMsNEZBQWQsRUFDQSxnQkFBQSxDQUVBLENBTmlCLENBT2xCeFUsSUFBSyxxQkFBeUIsQ0FFN0IyRSxRQUFRNlAsSUFBUixDQUFjLDRGQUFkLEVBRUEsQ0FYaUIsQ0E1QjhCLENBQWxELEVBMkNBN3JCLE9BQU9zUCxnQkFBUCxDQUF5QjhsSSxlQUFlbjFJLFNBQXhDLENBQW1ELENBRWxEbS9FLFNBQVUsQ0FDVDMwRSxJQUFLLFVBQVksQ0FFaEJ1UixRQUFRNlAsSUFBUixDQUFjLDZGQUFkLEVBQ0EsZ0JBQUEsQ0FFQSxDQU5RLENBT1R4VSxJQUFLLHdCQUE0QixDQUVoQzJFLFFBQVE2UCxJQUFSLENBQWMsNkZBQWQsRUFFQSxDQVhRLENBRndDLENBZWxEd3BILG1CQUFvQixDQUNuQjVxSSxJQUFLLFVBQVksQ0FFaEJ1UixRQUFRNlAsSUFBUixDQUFjLHVHQUFkLEVBQ0EsZ0JBQUEsQ0FFQSxDQU5rQixDQU9uQnhVLElBQUssVUFBWSxDQUVoQjJFLFFBQVE2UCxJQUFSLENBQWMsdUdBQWQsRUFFQSxDQVhrQixDQWY4QixDQTRCbER5cEgsa0JBQW1CLENBQ2xCN3FJLElBQUssVUFBWSxDQUVoQnVSLFFBQVE2UCxJQUFSLENBQWMsc0dBQWQsRUFDQSxnQkFBQSxDQUVBLENBTmlCLENBT2xCeFUsSUFBSyxVQUFZLENBRWhCMkUsUUFBUTZQLElBQVIsQ0FBYyxzR0FBZCxFQUVBLENBWGlCLENBNUIrQixDQUFuRCxFQTRDQTtFQUVBN3JCLE9BQU9zUCxnQkFBUCxDQUF5QnExQixrQkFBa0Ixa0MsU0FBM0MsQ0FBc0QsQ0FFckQyZ0MsTUFBTyxDQUNObjJCLElBQUssVUFBWSxDQUVoQnVSLFFBQVE2UCxJQUFSLENBQWMsd0RBQWQsRUFDQSxZQUFZMFksT0FBTCxDQUFhM0QsS0FBcEIsQ0FFQSxDQU5LLENBT052cEIsSUFBSyxTQUFXM1QsS0FBWCxDQUFtQixDQUV2QnNZLFFBQVE2UCxJQUFSLENBQWMsd0RBQWQsRUFDQSxLQUFLMFksT0FBTCxDQUFhM0QsS0FBYixDQUFxQmw5QixLQUFyQixDQUVBLENBWkssQ0FGOEMsQ0FnQnJEbTlCLE1BQU8sQ0FDTnAyQixJQUFLLFVBQVksQ0FFaEJ1UixRQUFRNlAsSUFBUixDQUFjLHdEQUFkLEVBQ0EsWUFBWTBZLE9BQUwsQ0FBYTFELEtBQXBCLENBRUEsQ0FOSyxDQU9OeHBCLElBQUssU0FBVzNULEtBQVgsQ0FBbUIsQ0FFdkJzWSxRQUFRNlAsSUFBUixDQUFjLHdEQUFkLEVBQ0EsS0FBSzBZLE9BQUwsQ0FBYTFELEtBQWIsQ0FBcUJuOUIsS0FBckIsQ0FFQSxDQVpLLENBaEI4QyxDQThCckRvOUIsVUFBVyxDQUNWcjJCLElBQUssVUFBWSxDQUVoQnVSLFFBQVE2UCxJQUFSLENBQWMsZ0VBQWQsRUFDQSxZQUFZMFksT0FBTCxDQUFhekQsU0FBcEIsQ0FFQSxDQU5TLENBT1Z6cEIsSUFBSyxTQUFXM1QsS0FBWCxDQUFtQixDQUV2QnNZLFFBQVE2UCxJQUFSLENBQWMsZ0VBQWQsRUFDQSxLQUFLMFksT0FBTCxDQUFhekQsU0FBYixDQUF5QnA5QixLQUF6QixDQUVBLENBWlMsQ0E5QjBDLENBNENyRHE5QixVQUFXLENBQ1Z0MkIsSUFBSyxVQUFZLENBRWhCdVIsUUFBUTZQLElBQVIsQ0FBYyxnRUFBZCxFQUNBLFlBQVkwWSxPQUFMLENBQWF4RCxTQUFwQixDQUVBLENBTlMsQ0FPVjFwQixJQUFLLFNBQVczVCxLQUFYLENBQW1CLENBRXZCc1ksUUFBUTZQLElBQVIsQ0FBYyxnRUFBZCxFQUNBLEtBQUswWSxPQUFMLENBQWF4RCxTQUFiLENBQXlCcjlCLEtBQXpCLENBRUEsQ0FaUyxDQTVDMEMsQ0EwRHJEdTlCLFdBQVksQ0FDWHgyQixJQUFLLFVBQVksQ0FFaEJ1UixRQUFRNlAsSUFBUixDQUFjLGtFQUFkLEVBQ0EsWUFBWTBZLE9BQUwsQ0FBYXRELFVBQXBCLENBRUEsQ0FOVSxDQU9YNXBCLElBQUssU0FBVzNULEtBQVgsQ0FBbUIsQ0FFdkJzWSxRQUFRNlAsSUFBUixDQUFjLGtFQUFkLEVBQ0EsS0FBSzBZLE9BQUwsQ0FBYXRELFVBQWIsQ0FBMEJ2OUIsS0FBMUIsQ0FFQSxDQVpVLENBMUR5QyxDQXdFckQycUIsT0FBUSxDQUNQNWpCLElBQUssVUFBWSxDQUVoQnVSLFFBQVE2UCxJQUFSLENBQWMsMERBQWQsRUFDQSxZQUFZMFksT0FBTCxDQUFhbFcsTUFBcEIsQ0FFQSxDQU5NLENBT1BoWCxJQUFLLFNBQVczVCxLQUFYLENBQW1CLENBRXZCc1ksUUFBUTZQLElBQVIsQ0FBYywwREFBZCxFQUNBLEtBQUswWSxPQUFMLENBQWFsVyxNQUFiLENBQXNCM3FCLEtBQXRCLENBRUEsQ0FaTSxDQXhFNkMsQ0FzRnJEbytCLE9BQVEsQ0FDUHIzQixJQUFLLFVBQVksQ0FFaEJ1UixRQUFRNlAsSUFBUixDQUFjLDBEQUFkLEVBQ0EsWUFBWTBZLE9BQUwsQ0FBYXpDLE1BQXBCLENBRUEsQ0FOTSxDQU9QenFCLElBQUssU0FBVzNULEtBQVgsQ0FBbUIsQ0FFdkJzWSxRQUFRNlAsSUFBUixDQUFjLDBEQUFkLEVBQ0EsS0FBSzBZLE9BQUwsQ0FBYXpDLE1BQWIsQ0FBc0JwK0IsS0FBdEIsQ0FFQSxDQVpNLENBdEY2QyxDQW9HckRzOUIsT0FBUSxDQUNQdjJCLElBQUssVUFBWSxDQUVoQnVSLFFBQVE2UCxJQUFSLENBQWMsMERBQWQsRUFDQSxZQUFZMFksT0FBTCxDQUFhdkQsTUFBcEIsQ0FFQSxDQU5NLENBT1AzcEIsSUFBSyxTQUFXM1QsS0FBWCxDQUFtQixDQUV2QnNZLFFBQVE2UCxJQUFSLENBQWMsMERBQWQsRUFDQSxLQUFLMFksT0FBTCxDQUFhdkQsTUFBYixDQUFzQnQ5QixLQUF0QixDQUVBLENBWk0sQ0FwRzZDLENBa0hyRGhDLEtBQU0sQ0FDTCtJLElBQUssVUFBWSxDQUVoQnVSLFFBQVE2UCxJQUFSLENBQWMsc0RBQWQsRUFDQSxZQUFZMFksT0FBTCxDQUFhN2lDLElBQXBCLENBRUEsQ0FOSSxDQU9MMlYsSUFBSyxTQUFXM1QsS0FBWCxDQUFtQixDQUV2QnNZLFFBQVE2UCxJQUFSLENBQWMsc0RBQWQsRUFDQSxLQUFLMFksT0FBTCxDQUFhN2lDLElBQWIsQ0FBb0JnQyxLQUFwQixDQUVBLENBWkksQ0FsSCtDLENBZ0lyRHMrQixnQkFBaUIsQ0FDaEJ2M0IsSUFBSyxVQUFZLENBRWhCdVIsUUFBUTZQLElBQVIsQ0FBYyw0RUFBZCxFQUNBLFlBQVkwWSxPQUFMLENBQWF2QyxlQUFwQixDQUVBLENBTmUsQ0FPaEIzcUIsSUFBSyxTQUFXM1QsS0FBWCxDQUFtQixDQUV2QnNZLFFBQVE2UCxJQUFSLENBQWMsNEVBQWQsRUFDQSxLQUFLMFksT0FBTCxDQUFhdkMsZUFBYixDQUErQnQrQixLQUEvQixDQUVBLENBWmUsQ0FoSW9DLENBQXRELEVBaUpBO0VBRUExRCxPQUFPc1AsZ0JBQVAsQ0FBeUJpbUksYUFBYXQxSSxTQUF0QyxDQUFpRCxDQUVoRHUxSSxTQUFVLENBQ1RuK0gsSUFBSyxxQkFBeUIsQ0FFN0IyRSxRQUFRNlAsSUFBUixDQUFjLGlEQUFkLEVBRUEsQ0FMUSxDQUZzQyxDQUFqRCxFQVlBO0VBRUFzc0csTUFBTWw0SCxTQUFOLENBQWdCcTBHLElBQWhCLENBQXVCLFNBQVdsQixJQUFYLENBQWtCLENBRXhDcDNGLFFBQVE2UCxJQUFSLENBQWMsd0VBQWQsRUFDQSxVQUFZLElBQVosQ0FDQSxnQkFBa0IsZUFBQSxFQUFsQixDQUNBNHBILFlBQVluaEMsSUFBWixDQUFrQmxCLElBQWxCLENBQXdCLFNBQVdsMkQsTUFBWCxDQUFvQixDQUUzQy9WLE1BQU1veEYsU0FBTixDQUFpQnI3RSxNQUFqQixFQUVBLENBSkQsRUFLQSxXQUFBLENBRUEsQ0FaRCxDQWNBdTlFLGNBQWN4NkgsU0FBZCxDQUF3QnkxSSxPQUF4QixDQUFrQyxVQUFZLENBRTdDMTVILFFBQVE2UCxJQUFSLENBQWMsNkRBQWQsRUFDQSxZQUFZNnVHLGdCQUFMLEVBQVAsQ0FFQSxDQUxELENBT0E7RUFFQXhFLFdBQVdqMkgsU0FBWCxDQUFxQjAxSSxhQUFyQixDQUFxQyxTQUFXMTRFLFFBQVgsQ0FBcUJHLEtBQXJCLENBQTZCLENBRWpFcGhELFFBQVE2UCxJQUFSLENBQWMsc0RBQWQsRUFDQSxZQUFZNk8sTUFBTCxDQUFhdWlDLFFBQWIsQ0FBdUJHLEtBQXZCLENBQVAsQ0FFQSxDQUxELENBT0EsdUJBQXlCLGVBQUEsQ0FBZ0J6d0QsTUFBaEIsQ0FBdUIsQ0FDOUMsV0FBYSxFQUFiLENBQWlCZ08sTUFBUSxFQUF6QixDQUNBaE8sT0FBU0EsUUFBVSxJQUFuQixDQUNBOztPQUdBQSxPQUFPaXBJLEVBQVAsQ0FBWSxTQUFTbDBJLElBQVQsQ0FBZXUvRixJQUFmLENBQXFCNDBDLEdBQXJCLENBQXlCLENBQ25DLENBQUNDLE9BQU9wMEksSUFBUCxFQUFlbzBJLE9BQU9wMEksSUFBUCxHQUFnQixFQUFoQyxFQUFvQ3dFLElBQXBDLENBQXlDLENBQUMrNkYsSUFBRCxDQUFPNDBDLEdBQVAsQ0FBekMsRUFDQSxhQUFBLENBQ0QsQ0FIRCxDQUlBOztPQUdBbHBJLE9BQU9vcEksR0FBUCxDQUFhLFNBQVNyMEksSUFBVCxDQUFldS9GLElBQWYsQ0FBb0IsQ0FDL0J2L0YsT0FBU28wSSxPQUFTLEVBQWxCLEVBQ0EsU0FBV0EsT0FBT3AwSSxJQUFQLEdBQWdCaVosS0FBM0IsQ0FDSTVULEVBQUkrcUUsS0FBS3ByRSxNQUFMLENBQWN1NkYsS0FBT252QixLQUFLcHJFLE1BQVosQ0FBcUIsQ0FEM0MsQ0FFQSxNQUFNSyxHQUFOLENBQVdrNkYsTUFBUW52QixLQUFLL3FFLENBQUwsRUFBUSxDQUFSLENBQVIsRUFBc0IrcUUsS0FBS3pwRCxNQUFMLENBQVl0aEIsQ0FBWixDQUFjLENBQWQsQ0FBdEIsQ0FDWCxhQUFBLENBQ0QsQ0FORCxDQU9BOztPQUdBNEYsT0FBT3dQLElBQVAsQ0FBYyxTQUFTemEsSUFBVCxDQUFjLENBQzFCLE1BQVFvMEksT0FBT3AwSSxJQUFQLEdBQWdCaVosS0FBeEIsQ0FBK0JtM0QsS0FBT3BwRSxFQUFFaEMsTUFBRixDQUFXLENBQVgsQ0FBZWdDLEVBQUVwQixLQUFGLENBQVEsQ0FBUixDQUFXb0IsRUFBRWhDLE1BQWIsQ0FBZixDQUFzQ2dDLENBQTVFLENBQStFM0IsRUFBRSxDQUFqRixDQUFvRjRiLENBQXBGLENBQ0EsTUFBTUEsRUFBRW12RCxLQUFLL3FFLEdBQUwsQ0FBUixDQUFtQjRiLEVBQUUsQ0FBRixFQUFLeFksS0FBTCxDQUFXd1ksRUFBRSxDQUFGLENBQVgsQ0FBaUJoSSxNQUFNclQsS0FBTixDQUFZM0YsSUFBWixDQUFpQnlJLFNBQWpCLENBQTRCLENBQTVCLENBQWpCLEVBQ25CLGFBQUEsQ0FDRCxDQUpELENBS0QsQ0E1QkQsQ0E4QkE7RUFDQWlKLFFBQVFBLFFBQVFySSxDQUFoQixDQUFtQixRQUFuQixDQUE2QixDQUFFL0osT0FBUXNRLGFBQVYsQ0FBN0IsRUFFQSxjQUFnQnZILE1BQU1oSyxNQUF0QixDQUNBLFdBQWEsZUFBQSxDQUFnQm9MLENBQWhCLENBQW1CbUssQ0FBbkIsQ0FBc0IsQ0FDakMsaUJBQWlCdFUsTUFBVixDQUFpQm1LLENBQWpCLENBQW9CbUssQ0FBcEIsQ0FBUCxDQUNELENBRkQsQ0FJQSxhQUFldFUsTUFBZixDQUVBLHdCQUEwQixTQUFVOEgsRUFBVixDQUFjaXRJLElBQWQsQ0FBb0IsQ0FDNUMsR0FBSSxDQUFDM3JJLFVBQVV0QixFQUFWLENBQUQsRUFBa0JBLEdBQUcwSyxFQUFILEdBQVV1aUksSUFBaEMsQ0FBc0MsZ0JBQWdCLDBCQUE0QkEsSUFBNUIsQ0FBbUMsWUFBN0MsQ0FBTixDQUN0QyxTQUFBLENBQ0QsQ0FIRCxDQUtBLFNBQVd2bUksVUFBVWhFLENBQXJCLENBVUEsWUFBY29VLE1BQU1ILE9BQXBCLENBRUEsU0FBVzVVLGFBQWUsSUFBZixDQUFzQixNQUFqQyxDQUVBLGFBQWUsU0FBVTdCLElBQVYsQ0FBZ0J6QyxHQUFoQixDQUFxQjtFQUVsQyxVQUFZa1osUUFBUWxaLEdBQVIsQ0FBWixDQUNBLFNBQUEsQ0FDQSxHQUFJbUgsUUFBVSxHQUFkLENBQW1CLFlBQVkrRixFQUFMLENBQVEvRixLQUFSLENBQVAsQ0FDbkI7RUFDQSxJQUFLOUgsTUFBUW9ELEtBQUtndEksRUFBbEIsQ0FBc0Jwd0ksS0FBdEIsQ0FBNkJBLE1BQVFBLE1BQU15akIsQ0FBM0MsQ0FBOEMsQ0FDNUMsR0FBSXpqQixNQUFNZ2QsQ0FBTixFQUFXcmMsR0FBZixDQUFvQixZQUFBLENBQ3JCLENBQ0YsQ0FURCxDQVdBLHNCQUF3QixDQUN0QjB2SSxlQUFnQixTQUFVdDVILE9BQVYsQ0FBbUJ0TCxJQUFuQixDQUF5QjZrSSxNQUF6QixDQUFpQ0MsS0FBakMsQ0FBd0MsQ0FDdEQsTUFBUXg1SCxRQUFRLFNBQVUzVCxJQUFWLENBQWdCckMsUUFBaEIsQ0FBMEIsQ0FDeENvVyxZQUFZL1QsSUFBWixDQUFrQitELENBQWxCLENBQXFCc0UsSUFBckIsQ0FBMkIsSUFBM0IsRUFDQXJJLEtBQUt3SyxFQUFMLENBQVVuQyxJQUFWLENBQXdCO0VBQ3hCckksS0FBS3lLLEVBQUwsQ0FBVW5DLGNBQWMsSUFBZCxDQUFWLENBQStCO0VBQy9CdEksS0FBS2d0SSxFQUFMLENBQVU1d0ksU0FBVixDQUF3QjtFQUN4QjRELEtBQUtvdEksRUFBTCxDQUFVaHhJLFNBQVYsQ0FBd0I7RUFDeEI0RCxLQUFLcXRJLElBQUwsRUFBYSxDQUFiLENBQXdCO0VBQ3hCLEdBQUkxdkksVUFBWXZCLFNBQWhCLENBQTJCdVksT0FBT2hYLFFBQVAsQ0FBaUJ1dkksTUFBakIsQ0FBeUJsdEksS0FBS210SSxLQUFMLENBQXpCLENBQXNDbnRJLElBQXRDLEVBQzVCLENBUk8sQ0FBUixDQVNBaVUsYUFBYWxRLEVBQUUvTSxTQUFmLENBQTBCO0VBRXhCO0VBQ0FxWCxNQUFPLGNBQUEsRUFBaUIsQ0FDdEIsSUFBSyxTQUFXaS9ILG9CQUFvQixJQUFwQixDQUEwQmpsSSxJQUExQixDQUFYLENBQTRDOEUsS0FBT25OLEtBQUt5SyxFQUF4RCxDQUE0RDdOLE1BQVFvRCxLQUFLZ3RJLEVBQTlFLENBQWtGcHdJLEtBQWxGLENBQXlGQSxNQUFRQSxNQUFNeWpCLENBQXZHLENBQTBHLENBQ3hHempCLE1BQU0yWCxDQUFOLENBQVUsSUFBVixDQUNBLEdBQUkzWCxNQUFNK2UsQ0FBVixDQUFhL2UsTUFBTStlLENBQU4sQ0FBVS9lLE1BQU0rZSxDQUFOLENBQVEwRSxDQUFSLENBQVlqa0IsU0FBdEIsQ0FDYixZQUFZUSxNQUFNa0IsQ0FBWCxDQUFQLENBQ0QsQ0FDRGtDLEtBQUtndEksRUFBTCxDQUFVaHRJLEtBQUtvdEksRUFBTCxDQUFVaHhJLFNBQXBCLENBQ0E0RCxLQUFLcXRJLElBQUwsRUFBYSxDQUFiLENBQ0QsQ0FYdUI7RUFheEI7RUFDQSxTQUFVLFNBQVU5dkksR0FBVixDQUFlLENBQ3ZCLFNBQVcrdkksb0JBQW9CLElBQXBCLENBQTBCamxJLElBQTFCLENBQVgsQ0FDQSxVQUFZa2xJLFNBQVN2dEksSUFBVCxDQUFlekMsR0FBZixDQUFaLENBQ0EsR0FBSVgsS0FBSixDQUFXLENBQ1QsU0FBV0EsTUFBTXlqQixDQUFqQixDQUNBLFNBQVd6akIsTUFBTStlLENBQWpCLENBQ0EsWUFBWWxSLEVBQUwsQ0FBUTdOLE1BQU1rQixDQUFkLENBQVAsQ0FDQWxCLE1BQU0yWCxDQUFOLENBQVUsSUFBVixDQUNBLEdBQUlyVyxJQUFKLENBQVVBLEtBQUttaUIsQ0FBTCxDQUFTaGxCLElBQVQsQ0FDVixHQUFJQSxJQUFKLENBQVVBLEtBQUtzZ0IsQ0FBTCxDQUFTemQsSUFBVCxDQUNWLEdBQUk4QixLQUFLZ3RJLEVBQUwsRUFBV3B3SSxLQUFmLENBQXNCb0QsS0FBS2d0SSxFQUFMLENBQVUzeEksSUFBVixDQUN0QixHQUFJMkUsS0FBS290SSxFQUFMLEVBQVd4d0ksS0FBZixDQUFzQm9ELEtBQUtvdEksRUFBTCxDQUFVbHZJLElBQVYsQ0FDdEI4QixLQUFLcXRJLElBQUwsSUFDRCxDQUFDLE9BQU8sQ0FBQyxDQUFDendJLEtBQVQsQ0FDSCxDQTVCdUI7RUE4QnhCO0VBQ0FuRCxRQUFTLGdCQUFBLENBQWlCeWIsVUFBVyx5QkFBMEIsQ0FDN0RvNEgsb0JBQW9CLElBQXBCLENBQTBCamxJLElBQTFCLEVBQ0EsTUFBUXhFLEtBQUtxUixVQUFMLENBQWlCL1QsVUFBVTFELE1BQVYsQ0FBbUIsQ0FBbkIsQ0FBdUIwRCxVQUFVLENBQVYsQ0FBdkIsQ0FBc0MvRSxTQUF2RCxDQUFrRSxDQUFsRSxDQUFSLENBQ0EsU0FBQSxDQUNBLE1BQU9RLE1BQVFBLE1BQVFBLE1BQU15akIsQ0FBZCxDQUFrQixLQUFLMnNILEVBQXRDLENBQTBDLENBQ3hDeHFJLEVBQUU1RixNQUFNdVQsQ0FBUixDQUFXdlQsTUFBTWdkLENBQWpCLENBQW9CLElBQXBCLEVBQ0E7RUFDQSxNQUFPaGQsT0FBU0EsTUFBTTJYLENBQXRCLENBQXlCM1gsTUFBUUEsTUFBTStlLENBQWQsQ0FDMUIsQ0FDRixDQXhDdUI7RUEwQ3hCO0VBQ0E2eEgsSUFBSyxZQUFBLENBQWFqd0ksR0FBYixDQUFrQixDQUNyQixPQUFPLENBQUMsQ0FBQ2d3SSxTQUFTRCxvQkFBb0IsSUFBcEIsQ0FBMEJqbEksSUFBMUIsQ0FBVCxDQUEwQzlLLEdBQTFDLENBQVQsQ0FDRCxDQTdDdUIsQ0FBMUIsRUErQ0EsR0FBSXNFLFlBQUosQ0FBa0I0ckksS0FBSzFwSSxFQUFFL00sU0FBUCxDQUFrQixNQUFsQixDQUEwQixDQUMxQ3dLLElBQUssVUFBWSxDQUNmLDJCQUEyQixJQUFwQixDQUEwQjZHLElBQTFCLEVBQWdDZ2xJLElBQWhDLENBQVAsQ0FDRCxDQUh5QyxDQUExQixFQUtsQixRQUFBLENBQ0QsQ0FoRXFCLENBaUV0QmxsSSxJQUFLLFNBQVVuSSxJQUFWLENBQWdCekMsR0FBaEIsQ0FBcUI5QyxLQUFyQixDQUE0QixDQUMvQixVQUFZOHlJLFNBQVN2dEksSUFBVCxDQUFlekMsR0FBZixDQUFaLENBQ0EsUUFBQSxDQUFVbUgsS0FBVixDQUNBO0VBQ0EsR0FBSTlILEtBQUosQ0FBVyxDQUNUQSxNQUFNdVQsQ0FBTixDQUFVMVYsS0FBVixDQUNGO0VBQ0MsQ0FIRCxJQUdPLENBQ0x1RixLQUFLb3RJLEVBQUwsQ0FBVXh3SSxNQUFRLENBQ2hCa0IsRUFBRzRHLE1BQVErUixRQUFRbFosR0FBUixDQUFhLElBQWIsQ0FESztFQUVoQnFjLEVBQUdyYyxHQUZhO0VBR2hCNFMsRUFBRzFWLEtBSGE7RUFJaEJraEIsRUFBR3pkLEtBQU84QixLQUFLb3RJLEVBSkM7RUFLaEIvc0gsRUFBR2prQixTQUxhO0VBTWhCbVksRUFBRyxLQUE0QjtFQU5mLENBQWxCLENBUUEsR0FBSSxDQUFDdlUsS0FBS2d0SSxFQUFWLENBQWNodEksS0FBS2d0SSxFQUFMLENBQVVwd0ksS0FBVixDQUNkLEdBQUlzQixJQUFKLENBQVVBLEtBQUttaUIsQ0FBTCxDQUFTempCLEtBQVQsQ0FDVm9ELEtBQUtxdEksSUFBTCxJQUNBO0VBQ0EsR0FBSTNvSSxRQUFVLEdBQWQsQ0FBbUIxRSxLQUFLeUssRUFBTCxDQUFRL0YsS0FBUixFQUFpQjlILEtBQWpCLENBQ3BCLENBQUMsV0FBQSxDQUNILENBdkZxQixDQXdGdEIyd0ksU0FBVUEsUUF4RlksQ0F5RnRCRyxVQUFXLFNBQVUzcEksQ0FBVixDQUFhc0UsSUFBYixDQUFtQjZrSSxNQUFuQixDQUEyQjtFQUVwQztFQUNBNWlJLFlBQVl2RyxDQUFaLENBQWVzRSxJQUFmLENBQXFCLFNBQVVrQyxRQUFWLENBQW9CdkIsSUFBcEIsQ0FBMEIsQ0FDN0MsS0FBS3dCLEVBQUwsQ0FBVThpSSxvQkFBb0IvaUksUUFBcEIsQ0FBOEJsQyxJQUE5QixDQUFWLENBQStDO0VBQy9DLEtBQUt3QyxFQUFMLENBQVU3QixJQUFWLENBQW9DO0VBQ3BDLEtBQUtva0ksRUFBTCxDQUFVaHhJLFNBQVYsQ0FBb0M7RUFDckMsQ0FKRCxDQUlHLFVBQVksQ0FDYixTQUFXLElBQVgsQ0FDQSxTQUFXNEQsS0FBSzZLLEVBQWhCLENBQ0EsVUFBWTdLLEtBQUtvdEksRUFBakIsQ0FDQTtFQUNBLE1BQU94d0ksT0FBU0EsTUFBTTJYLENBQXRCLENBQXlCM1gsTUFBUUEsTUFBTStlLENBQWQsQ0FDekI7RUFDQSxHQUFJLENBQUMzYixLQUFLd0ssRUFBTixFQUFZLEVBQUV4SyxLQUFLb3RJLEVBQUwsQ0FBVXh3SSxNQUFRQSxNQUFRQSxNQUFNeWpCLENBQWQsQ0FBa0JyZ0IsS0FBS3dLLEVBQUwsQ0FBUXdpSSxFQUE5QyxDQUFoQixDQUFtRTtFQUVqRWh0SSxLQUFLd0ssRUFBTCxDQUFVcE8sU0FBVixDQUNBLGlCQUFpQixDQUFWLENBQVAsQ0FDRCxDQUNEO0VBQ0EsR0FBSTRNLE1BQVEsTUFBWixDQUFvQixpQkFBaUIsQ0FBVixDQUFhcE0sTUFBTWdkLENBQW5CLENBQVAsQ0FDcEIsR0FBSTVRLE1BQVEsUUFBWixDQUFzQixpQkFBaUIsQ0FBVixDQUFhcE0sTUFBTXVULENBQW5CLENBQVAsQ0FDdEIsaUJBQWlCLENBQVYsQ0FBYSxDQUFDdlQsTUFBTWdkLENBQVAsQ0FBVWhkLE1BQU11VCxDQUFoQixDQUFiLENBQVAsQ0FDRCxDQXBCRCxDQW9CRys4SCxPQUFTLFNBQVQsQ0FBcUIsUUFwQnhCLENBb0JrQyxDQUFDQSxNQXBCbkMsQ0FvQjJDLElBcEIzQyxFQXNCQTtFQUNBNTRILFlBQVlqTSxJQUFaLEVBQ0QsQ0FwSHFCLENBQXhCLENBdUhBLGNBQWdCTixLQUFLLFNBQUwsQ0FBaEIsQ0FFQSw2QkFBK0IsU0FBVTRsSSxRQUFWLENBQW9CLENBQ2pELEtBQUEsQ0FDQSxHQUFJbnpILFNBQVNtekgsUUFBVCxDQUFKLENBQXdCLENBQ3RCNXBJLEVBQUk0cEksU0FBU3IwSSxXQUFiLENBQ0E7RUFDQSxHQUFJLFFBQUEsRUFBWSxVQUFaLEdBQTJCeUssSUFBTTZHLEtBQU4sRUFBZTRQLFNBQVN6VyxFQUFFL00sU0FBWCxDQUExQyxDQUFKLENBQXNFK00sRUFBSTNILFNBQUosQ0FDdEUsR0FBSWdGLFVBQVUyQyxDQUFWLENBQUosQ0FBa0IsQ0FDaEJBLEVBQUlBLEVBQUU2cEksU0FBRixDQUFKLENBQ0EsR0FBSTdwSSxJQUFNLElBQVYsQ0FBZ0JBLEVBQUkzSCxTQUFKLENBQ2pCLENBQ0YsQ0FBQyxXQUFhQSxTQUFOLENBQWtCd08sS0FBbEIsQ0FBMEI3RyxDQUFqQyxDQUNILENBWEQsQ0FhQTtFQUdBLHdCQUEwQixTQUFVNHBJLFFBQVYsQ0FBb0Jsd0ksTUFBcEIsQ0FBNEIsQ0FDcEQsV0FBWW93SSx5QkFBeUJGLFFBQXpCLENBQUwsRUFBeUNsd0ksTUFBekMsQ0FBUCxDQUNELENBRkQsQ0FJQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQU1BLGtCQUFvQixTQUFVc3ZJLElBQVYsQ0FBZ0IzeUgsT0FBaEIsQ0FBeUIsQ0FDM0MsV0FBYTJ5SCxNQUFRLENBQXJCLENBQ0EsY0FBZ0JBLE1BQVEsQ0FBeEIsQ0FDQSxZQUFjQSxNQUFRLENBQXRCLENBQ0EsYUFBZUEsTUFBUSxDQUF2QixDQUNBLGtCQUFvQkEsTUFBUSxDQUE1QixDQUNBLGFBQWVBLE1BQVEsQ0FBUixFQUFhZSxhQUE1QixDQUNBLFdBQWExekgsU0FBVzJ6SCxtQkFBeEIsQ0FDQSxnQkFBaUJscEksS0FBVixDQUFpQnFRLFVBQWpCLENBQTZCbFYsSUFBN0IsQ0FBbUMsQ0FDeEMsTUFBUXdJLFVBQVUzRCxLQUFWLENBQVIsQ0FDQSxTQUFXbXBJLFNBQVM5ckksQ0FBVCxDQUFYLENBQ0EsTUFBUTJCLEtBQUtxUixVQUFMLENBQWlCbFYsSUFBakIsQ0FBdUIsQ0FBdkIsQ0FBUixDQUNBLFdBQWFpRixVQUFVcE4sS0FBSzRGLE1BQWYsQ0FBYixDQUNBLFVBQVksQ0FBWixDQUNBLFdBQWF5dkksT0FBU2wxSSxPQUFPNk0sS0FBUCxDQUFjcEgsTUFBZCxDQUFULENBQWlDd3dJLFVBQVlqMkksT0FBTzZNLEtBQVAsQ0FBYyxDQUFkLENBQVosQ0FBK0J6SSxTQUE3RSxDQUNBLE9BQUEsQ0FBUzh4SSxHQUFULENBQ0EsS0FBTXp3SSxPQUFTaUgsS0FBZixDQUFzQkEsT0FBdEIsQ0FBK0IsR0FBSXlwSSxVQUFZenBJLGFBQWhCLENBQStCLENBQzVEMUMsSUFBTW5LLEtBQUs2TSxLQUFMLENBQU4sQ0FDQXdwSSxJQUFNMXJJLEVBQUVSLEdBQUYsQ0FBTzBDLEtBQVAsQ0FBY3hDLENBQWQsQ0FBTixDQUNBLEdBQUk2cUksSUFBSixDQUFVLENBQ1IsR0FBSUcsTUFBSixDQUFZMXlJLE9BQU9rSyxLQUFQLEVBQWdCd3BJLEdBQWhCLENBQXVCO0VBQW5DLFFBQ1NBLEdBQUosQ0FBUyxPQUFRbkIsSUFBUixFQUNaLE1BQUEsQ0FBUSxXQUFBLENBQXlCO0VBQ2pDLE1BQUEsQ0FBUSxVQUFBLENBQXlCO0VBQ2pDLE1BQUEsQ0FBUSxZQUFBLENBQXlCO0VBQ2pDLE1BQUEsQ0FBUXZ5SSxPQUFPeUMsSUFBUCxDQUFZK0UsR0FBWixFQUF5QjtFQUpyQixDQUFULFFBS01vc0ksUUFBSixDQUFjLFlBQUEsQ0FBYztFQUNwQyxDQUNGLENBQ0QscUJBQXVCLENBQUMsQ0FBakIsQ0FBcUJDLFNBQVdELFFBQVgsQ0FBc0JBLFFBQXRCLENBQWlDNXpJLE1BQTdELENBQ0QsQ0F0QkQsQ0F1QkQsQ0EvQkQsQ0FpQ0EsU0FBV2dNLFVBQVVoRSxDQUFyQixDQUNBLFNBQVc4ckksY0FBYyxDQUFkLENBQVgsQ0FHQSxnQkFBa0IsU0FBVWptSSxJQUFWLENBQWdCc0wsT0FBaEIsQ0FBeUIzSixPQUF6QixDQUFrQys2QixNQUFsQyxDQUEwQ21vRyxNQUExQyxDQUFrRHFCLE9BQWxELENBQTJELENBQzNFLFNBQVc5c0ksUUFBUTRHLElBQVIsQ0FBWCxDQUNBLE1BQVFNLElBQVIsQ0FDQSxVQUFZdWtJLE9BQVMsS0FBVCxDQUFpQixLQUE3QixDQUNBLFVBQVlucEksR0FBS0EsRUFBRS9NLFNBQW5CLENBQ0EsTUFBUSxFQUFSLENBQ0EsR0FBSSxDQUFDNkssWUFBRCxFQUFpQixRQUFBLEVBQVksVUFBN0IsRUFBMkMsRUFBRTBzSSxTQUFXcGxJLE1BQU0xUCxPQUFOLEVBQWlCLENBQUM2SCxPQUFPLFVBQVksQ0FDL0YsS0FBQSxHQUFRb0ksT0FBUixHQUFrQnJPLElBQWxCLEdBQ0QsQ0FGNkUsQ0FBL0IsQ0FBL0MsQ0FFSztFQUVIMEksRUFBSWdoQyxPQUFPa29HLGNBQVAsQ0FBc0J0NUgsT0FBdEIsQ0FBK0J0TCxJQUEvQixDQUFxQzZrSSxNQUFyQyxDQUE2Q0MsS0FBN0MsQ0FBSixDQUNBbDVILGFBQWFsUSxFQUFFL00sU0FBZixDQUEwQmdULE9BQTFCLEVBQ0E0TSxNQUFNSixJQUFOLENBQWEsSUFBYixDQUNELENBUEQsSUFPTyxDQUNMelMsRUFBSTRQLFFBQVEsU0FBVWpRLE1BQVYsQ0FBa0IvRixRQUFsQixDQUE0QixDQUN0Q29XLFlBQVlyUSxNQUFaLENBQW9CSyxDQUFwQixDQUF1QnNFLElBQXZCLENBQTZCLElBQTdCLEVBQ0EzRSxPQUFPcU8sRUFBUCxDQUFZLFFBQUEsRUFBWixDQUNBLEdBQUlwVSxVQUFZdkIsU0FBaEIsQ0FBMkJ1WSxPQUFPaFgsUUFBUCxDQUFpQnV2SSxNQUFqQixDQUF5QnhwSSxPQUFPeXBJLEtBQVAsQ0FBekIsQ0FBd0N6cEksTUFBeEMsRUFDNUIsQ0FKRyxDQUFKLENBS0E4cUksS0FBSyxrRUFBa0VqcUksS0FBbEUsQ0FBd0UsR0FBeEUsQ0FBTCxDQUFtRixTQUFVa00sR0FBVixDQUFlLENBQ2hHLGFBQWVBLEtBQU8sS0FBUCxFQUFnQkEsS0FBTyxLQUF0QyxDQUNBLEdBQUlBLFlBQUEsRUFBZ0IsRUFBRTg5SCxTQUFXOTlILEtBQU8sT0FBcEIsQ0FBcEIsQ0FBa0RyTSxNQUFNTCxFQUFFL00sU0FBUixDQUFtQnlaLEdBQW5CLENBQXdCLFNBQVVqUSxDQUFWLENBQWFGLENBQWIsQ0FBZ0IsQ0FDeEZ5VCxZQUFZLElBQVosQ0FBa0JoUSxDQUFsQixDQUFxQjBNLEdBQXJCLEVBQ0EsR0FBSSxDQUFDZytILFFBQUQsRUFBYUYsT0FBYixFQUF3QixDQUFDbnRJLFVBQVVaLENBQVYsQ0FBN0IsQ0FBMkMsWUFBYyxLQUFQLENBQWVwRSxTQUFmLENBQTJCLEtBQWxDLENBQzNDLFdBQWEsS0FBSzJWLEVBQUwsQ0FBUXRCLEdBQVIsRUFBYWpRLElBQU0sQ0FBTixDQUFVLENBQVYsQ0FBY0EsQ0FBM0IsQ0FBOEJGLENBQTlCLENBQWIsQ0FDQSxnQkFBa0IsSUFBWCxDQUFrQjlGLE1BQXpCLENBQ0QsQ0FMaUQsRUFNbkQsQ0FSRCxFQVNBK3pJLFNBQVdHLEtBQUszcUksRUFBRS9NLFNBQVAsQ0FBa0IsTUFBbEIsQ0FBMEIsQ0FDbkN3SyxJQUFLLFVBQVksQ0FDZixZQUFZdVEsRUFBTCxDQUFRc3JCLElBQWYsQ0FDRCxDQUhrQyxDQUExQixDQUFYLENBS0QsQ0FFRDkwQixnQkFBZ0J4RSxDQUFoQixDQUFtQnNFLElBQW5CLEVBRUFuRyxFQUFFbUcsSUFBRixFQUFVdEUsQ0FBVixDQUNBcUcsUUFBUUEsUUFBUW5ILENBQVIsQ0FBWW1ILFFBQVFqSCxDQUFwQixDQUF3QmlILFFBQVFwSCxDQUF4QyxDQUEyQ2QsQ0FBM0MsRUFFQSxHQUFJLENBQUNxc0ksT0FBTCxDQUFjeHBHLE9BQU8yb0csU0FBUCxDQUFpQjNwSSxDQUFqQixDQUFvQnNFLElBQXBCLENBQTBCNmtJLE1BQTFCLEVBRWQsUUFBQSxDQUNELENBM0NELENBNkNBLFFBQVUsS0FBVixDQUVBO0VBQ0EsWUFBY3lCLFlBQVlDLEdBQVosQ0FBaUIsU0FBVXB0SSxHQUFWLENBQWUsQ0FDNUMsbUJBQU8sRUFBZSxDQUFFLFdBQVcsSUFBSixDQUFVTCxVQUFVMUQsTUFBVixDQUFtQixDQUFuQixDQUF1QjBELFVBQVUsQ0FBVixDQUF2QixDQUFzQy9FLFNBQWhELENBQVAsQ0FBb0UsQ0FBNUYsQ0FDRCxDQUZhLENBRVg7RUFFRG9GLElBQUssWUFBQSxDQUFhakUsR0FBYixDQUFrQixDQUNyQixVQUFZc3hJLGtCQUFrQnRCLFFBQWxCLENBQTJCRCxvQkFBb0IsSUFBcEIsQ0FBMEJzQixHQUExQixDQUEzQixDQUEyRHJ4SSxHQUEzRCxDQUFaLENBQ0EsY0FBZ0JYLE1BQU11VCxDQUF0QixDQUNELENBTEE7RUFPRC9CLElBQUssWUFBQSxDQUFhN1EsR0FBYixDQUFrQjlDLEtBQWxCLENBQXlCLENBQzVCLHlCQUF5QjBOLEdBQWxCLENBQXNCbWxJLG9CQUFvQixJQUFwQixDQUEwQnNCLEdBQTFCLENBQXRCLENBQXNEcnhJLE1BQVEsQ0FBUixDQUFZLENBQVosQ0FBZ0JBLEdBQXRFLENBQTJFOUMsS0FBM0UsQ0FBUCxDQUNELENBVEEsQ0FGVyxDQVlYbzBJLGlCQVpXLENBWVEsSUFaUixDQUFkLENBY0EsdUJBQXlCLFNBQVV6ekksSUFBVixDQUFnQmdPLFFBQWhCLENBQTBCLENBQ2pELFdBQWEsRUFBYixDQUNBdUwsT0FBT3ZaLElBQVAsQ0FBYSxLQUFiLENBQW9CWixPQUFPeUMsSUFBM0IsQ0FBaUN6QyxNQUFqQyxDQUF5QzRPLFFBQXpDLEVBQ0EsYUFBQSxDQUNELENBSkQsQ0FNQTtFQUdBLHNCQUF3QixTQUFVZixJQUFWLENBQWdCLENBQ3RDLHNCQUFPLEVBQWtCLENBQ3ZCLEdBQUl5RCxTQUFTLElBQVQsR0FBa0J6RCxJQUF0QixDQUE0QixnQkFBZ0JBLEtBQU8sdUJBQWpCLENBQU4sQ0FDNUIsMEJBQTBCLElBQW5CLENBQVAsQ0FDRCxDQUhELENBSUQsQ0FMRCxDQU9BO0VBR0ErQixRQUFRQSxRQUFRakksQ0FBUixDQUFZaUksUUFBUWxHLENBQTVCLENBQStCLEtBQS9CLENBQXNDLENBQUVzMUIsT0FBUXMxRyxrQkFBa0IsS0FBbEIsQ0FBVixDQUF0QyxFQUVBO0VBR0EscUJBQXVCLFNBQVVDLFVBQVYsQ0FBc0IsQ0FDM0Mza0ksUUFBUUEsUUFBUXJJLENBQWhCLENBQW1CZ3RJLFVBQW5CLENBQStCLENBQUVDLEdBQUksV0FBQSxFQUFjLENBQ2pELFdBQWE3dEksVUFBVTFELE1BQXZCLENBQ0EsTUFBUSxTQUFBLENBQVVBLE1BQVYsQ0FBUixDQUNBLE1BQU9BLFFBQVAsQ0FBaUJ3eEksRUFBRXh4SSxNQUFGLEVBQVkwRCxVQUFVMUQsTUFBVixDQUFaLENBQ2pCLGVBQU8sQ0FBU3d4SSxDQUFULENBQVAsQ0FDRCxDQUw4QixDQUEvQixFQU1ELENBUEQsQ0FTQTtFQUNBQyxpQkFBaUIsS0FBakIsRUFFQTtFQU1BLHVCQUF5QixTQUFVSCxVQUFWLENBQXNCLENBQzdDM2tJLFFBQVFBLFFBQVFySSxDQUFoQixDQUFtQmd0SSxVQUFuQixDQUErQixDQUFFajBCLEtBQU0sYUFBQSxDQUFjaDRHLE1BQU8sdUJBQXdCLENBQ2xGLFVBQVkzQixVQUFVLENBQVYsQ0FBWixDQUNBLFdBQUEsQ0FBYTh0SSxDQUFiLENBQWdCNXVILENBQWhCLENBQW1CNDlCLEVBQW5CLENBQ0FqOUMsV0FBVyxJQUFYLEVBQ0EwMkIsUUFBVXkzRyxRQUFVL3lJLFNBQXBCLENBQ0EsR0FBSXM3QixPQUFKLENBQWExMkIsV0FBV211SSxLQUFYLEVBQ2IsR0FBSXJzSSxRQUFVMUcsU0FBZCxDQUF5QixlQUFPLEVBQVAsQ0FDekI2eUksRUFBSSxFQUFKLENBQ0EsR0FBSXYzRyxPQUFKLENBQWEsQ0FDWHJYLEVBQUksQ0FBSixDQUNBNDlCLEdBQUtwNkMsS0FBS3NySSxLQUFMLENBQVlodUksVUFBVSxDQUFWLENBQVosQ0FBMEIsQ0FBMUIsQ0FBTCxDQUNBd1QsT0FBTzdSLE1BQVAsQ0FBZSxLQUFmLENBQXNCLFNBQVVzc0ksUUFBVixDQUFvQixDQUN4Q0gsRUFBRWh5SSxJQUFGLENBQU9naEQsR0FBR214RixRQUFILENBQWEvdUgsR0FBYixDQUFQLEVBQ0QsQ0FGRCxFQUdELENBTkQsSUFNTyxDQUNMMUwsT0FBTzdSLE1BQVAsQ0FBZSxLQUFmLENBQXNCbXNJLEVBQUVoeUksSUFBeEIsQ0FBOEJneUksQ0FBOUIsRUFDRCxDQUNELGVBQU8sQ0FBU0EsQ0FBVCxDQUFQLENBQ0QsQ0FsQjhCLENBQS9CLEVBbUJELENBcEJELENBc0JBO0VBQ0FJLG1CQUFtQixLQUFuQixFQUVBLFFBQVV0dUksTUFBTXV1SSxHQUFoQixDQUVBLFVBQVk3aEcsR0FBWixDQUVBLGVBQWlCLEdBQUdwdkMsS0FBcEIsQ0FDQSxjQUFnQixFQUFoQixDQUVBLGNBQWdCLFNBQVUyRSxDQUFWLENBQWFxdUIsR0FBYixDQUFrQjdrQixJQUFsQixDQUF3QixDQUN0QyxHQUFJLEVBQUU2a0IsZ0JBQUYsQ0FBSixDQUF5QixDQUN2QixJQUFLLE1BQVEsRUFBUixDQUFZdnpCLEVBQUksQ0FBckIsQ0FBd0JBLEVBQUl1ekIsR0FBNUIsQ0FBaUN2ekIsR0FBakMsQ0FBc0N1aUIsRUFBRXZpQixDQUFGLEVBQU8sS0FBT0EsQ0FBUCxDQUFXLEdBQWxCLENBQ3RDO0VBQ0F5eEksVUFBVWwrRyxHQUFWLEVBQWlCbHlCLFNBQVMsS0FBVCxDQUFnQixnQkFBa0JraEIsRUFBRTQrQyxJQUFGLENBQU8sR0FBUCxDQUFsQixDQUFnQyxHQUFoRCxDQUFqQixDQUNELENBQUMsaUJBQWlCNXRDLEdBQVYsRUFBZXJ1QixDQUFmLENBQWtCd0osSUFBbEIsQ0FBUCxDQUNILENBTkQsQ0FRQSxVQUFZck4sU0FBU2kyRixJQUFULEVBQWlCLGFBQUEsQ0FBY3AxRixJQUFLLGdCQUFpQixDQUMvRCxPQUFTZ0IsV0FBVyxJQUFYLENBQVQsQ0FDQSxhQUFlNjVHLFdBQVduaUgsSUFBWCxDQUFnQnlJLFNBQWhCLENBQTJCLENBQTNCLENBQWYsQ0FDQSxVQUFZLHVCQUF5QixDQUNuQyxTQUFXcXVJLFNBQVMvcEksTUFBVCxDQUFnQm8xRyxXQUFXbmlILElBQVgsQ0FBZ0J5SSxTQUFoQixDQUFoQixDQUFYLENBQ0EsNEJBQU8sQ0FBd0J3bEksVUFBVWp3SSxFQUFWLENBQWM4VixLQUFLL08sTUFBbkIsQ0FBMkIrTyxJQUEzQixDQUF4QixDQUEyRHJVLFFBQVF6QixFQUFSLENBQVk4VixJQUFaLENBQWtCeE0sSUFBbEIsQ0FBbEUsQ0FDRCxDQUhELENBSUEsR0FBSW9CLFVBQVUxSyxHQUFHTSxTQUFiLENBQUosQ0FBNkJ5NEksTUFBTXo0SSxTQUFOLENBQWtCTixHQUFHTSxTQUFyQixDQUM3QixZQUFBLENBQ0QsQ0FURCxDQVdBO0VBUUEsZUFBaUIsQ0FBQ3lLLFFBQVFpdUksT0FBUixFQUFtQixFQUFwQixFQUF3Qi9JLFNBQXpDLENBRUE7RUFDQTtFQUNBLG1CQUFxQnJsSSxPQUFPLFVBQVksQ0FDdEMsVUFBQSxFQUFhLGFBQ2IsT0FBTyxFQUFFcXVJLFdBQVcsVUFBWSxhQUF2QixDQUF3QyxFQUF4QyxDQUE0QzNzSSxDQUE1QyxhQUFGLENBQVAsQ0FDRCxDQUhvQixDQUFyQixDQUlBLGFBQWUsQ0FBQzFCLE9BQU8sVUFBWSxDQUNqQ3F1SSxXQUFXLFVBQVksYUFBdkIsRUFDRCxDQUZlLENBQWhCLENBSUF2bEksUUFBUUEsUUFBUXJJLENBQVIsQ0FBWXFJLFFBQVFwSCxDQUFSLEVBQWE0c0ksZ0JBQWtCQyxRQUEvQixDQUFwQixDQUE4RCxTQUE5RCxDQUF5RSxDQUN2RWxKLFVBQVcsa0JBQUEsQ0FBbUJtSixNQUFuQixDQUEyQnRqSSxJQUFLLGtCQUFtQixDQUM1RHhMLFdBQVc4dUksTUFBWCxFQUNBenRJLFVBQVVtSyxJQUFWLEVBQ0EsY0FBZ0JyTCxVQUFVMUQsTUFBVixDQUFtQixDQUFuQixDQUF1QnF5SSxNQUF2QixDQUFnQzl1SSxXQUFXRyxVQUFVLENBQVYsQ0FBWCxDQUFoRCxDQUNBLEdBQUkwdUksVUFBWSxDQUFDRCxjQUFqQixDQUFpQyxrQkFBa0JFLE1BQVgsQ0FBbUJ0akksSUFBbkIsQ0FBeUJ1akksU0FBekIsQ0FBUCxDQUNqQyxHQUFJRCxRQUFVQyxTQUFkLENBQXlCO0VBRXZCLE9BQVF2akksS0FBSy9PLE1BQWIsRUFDRSxNQUFBLENBQVEsaUJBQU8sRUFBUCxDQUNSLE1BQUEsQ0FBUSxpQkFBTyxDQUFXK08sS0FBSyxDQUFMLENBQVgsQ0FBUCxDQUNSLE1BQUEsQ0FBUSxpQkFBTyxDQUFXQSxLQUFLLENBQUwsQ0FBWCxDQUFvQkEsS0FBSyxDQUFMLENBQXBCLENBQVAsQ0FDUixNQUFBLENBQVEsaUJBQU8sQ0FBV0EsS0FBSyxDQUFMLENBQVgsQ0FBb0JBLEtBQUssQ0FBTCxDQUFwQixDQUE2QkEsS0FBSyxDQUFMLENBQTdCLENBQVAsQ0FDUixNQUFBLENBQVEsaUJBQU8sQ0FBV0EsS0FBSyxDQUFMLENBQVgsQ0FBb0JBLEtBQUssQ0FBTCxDQUFwQixDQUE2QkEsS0FBSyxDQUFMLENBQTdCLENBQXNDQSxLQUFLLENBQUwsQ0FBdEMsQ0FBUCxDQUxWLENBT0E7RUFDQSxVQUFZLENBQUMsSUFBRCxDQUFaLENBQ0F3akksTUFBTS95SSxJQUFOLENBQVdpRSxLQUFYLENBQWlCOHVJLEtBQWpCLENBQXdCeGpJLElBQXhCLEVBQ0EsV0FBWXlqSSxNQUFNL3VJLEtBQU4sQ0FBWTR1SSxNQUFaLENBQW9CRSxLQUFwQixDQUFMLEdBQVAsQ0FDRCxDQUNEO0VBQ0EsVUFBWUQsVUFBVS80SSxTQUF0QixDQUNBLGFBQWVzUixjQUFjbEgsVUFBVStILEtBQVYsRUFBbUJBLEtBQW5CLENBQTJCcFMsT0FBT0MsU0FBaEQsQ0FBZixDQUNBLFdBQWFtSSxTQUFTK0IsS0FBVCxDQUFleEksSUFBZixDQUFvQm8zSSxNQUFwQixDQUE0QjEwSCxRQUE1QixDQUFzQzVPLElBQXRDLENBQWIsQ0FDQSxpQkFBaUJoUyxNQUFWLEVBQW9CQSxNQUFwQixDQUE2QjRnQixRQUFwQyxDQUNELENBekJzRSxDQUF6RSxFQTRCQSxnQkFBa0JyYSxNQUFNMnVJLE9BQU4sQ0FBYy9JLFNBQWhDLENBRUEsZ0JBQWtCdUosV0FBbEIsQ0FFQSxnQkFBa0JyNUkscUJBQXFCLFNBQVVGLE1BQVYsQ0FBa0IsQ0FDekQsc0JBQUEsQ0FBb0J3NUksTUFBcEIsQ0FBNEIzakksSUFBNUIsQ0FBa0M0akksS0FBbEMsQ0FBeUMsQ0FDdkMsR0FBSSxjQUFBLEdBQW1CLFdBQW5CLEVBQWtDQyxXQUF0QyxDQUFtRCxDQUNqRDE1SSxPQUFPQyxPQUFQLENBQWlCMDVJLGNBQWFELFdBQTlCLENBQ0QsQ0FGRCxJQUVPLENBQ0wxNUksT0FBT0MsT0FBUCxDQUFpQjA1SSxjQUFhLHNCQUFBLENBQW9CSCxNQUFwQixDQUE0QjNqSSxJQUE1QixDQUFrQzRqSSxLQUFsQyxDQUF5QyxDQUNyRSxNQUFRLENBQUMsSUFBRCxDQUFSLENBQ0E1dkksRUFBRXZELElBQUYsQ0FBT2lFLEtBQVAsQ0FBYVYsQ0FBYixDQUFnQmdNLElBQWhCLEVBQ0EsZ0JBQWtCMmpJLE9BQU8vNkMsSUFBUCxDQUFZbDBGLEtBQVosQ0FBa0JpdkksTUFBbEIsQ0FBMEIzdkksQ0FBMUIsQ0FBbEIsQ0FDQSxhQUFlLGVBQUEsRUFBZixDQUNBLEdBQUk0dkksS0FBSixDQUFXcDBILGlCQUFpQlosUUFBakIsQ0FBMkJnMUgsTUFBTXA1SSxTQUFqQyxFQUNYLGVBQUEsQ0FDRCxDQVBELENBUUQsQ0FFRCxxQkFBa0JrSyxLQUFYLENBQWlCLElBQWpCLENBQXVCQyxTQUF2QixDQUFQLENBQ0QsQ0FFRHhLLE9BQU9DLE9BQVAsQ0FBaUIwNUksYUFBakIsQ0FDQyxDQW5CaUIsQ0FBbEIsQ0FxQkEsb0JBQXNCejVJLHFCQUFxQixTQUFVRixNQUFWLENBQWtCLENBQzdELDRCQUFBLENBQTBCeTVJLEtBQTFCLENBQWlDLENBQy9CLFdBQWEsWUFBQSxHQUFpQixVQUFqQixDQUE4QixTQUFBLEVBQTlCLENBQTRDaDBJLFNBQXpELENBRUF6RixPQUFPQyxPQUFQLENBQWlCMjVJLG9CQUFtQiw0QkFBQSxDQUEwQkgsS0FBMUIsQ0FBaUMsQ0FDbkUsR0FBSSxZQUFBLEdBQWlCLFVBQXJCLENBQWlDLENBQy9CLG1CQUFNLENBQWMsb0RBQWQsQ0FBTixDQUNELENBRUQsR0FBSSxhQUFBLEdBQWtCLFdBQXRCLENBQW1DLENBQ2pDLEdBQUlJLE9BQU9oRCxHQUFQLENBQVc0QyxLQUFYLENBQUosQ0FBdUIsY0FBYzV1SSxHQUFQLENBQVc0dUksS0FBWCxDQUFQLENBRXZCSSxPQUFPcGlJLEdBQVAsQ0FBV2dpSSxLQUFYLENBQWtCNStILE9BQWxCLEVBQ0QsQ0FFRCxnQkFBQSxFQUFtQixFQUVuQkEsUUFBUXhhLFNBQVIsQ0FBb0J5NUksU0FBU0wsTUFBTXA1SSxTQUFmLENBQTBCLENBQzVDc0MsWUFBYSxDQUNYbUIsTUFBTytXLE9BREksQ0FFWDlPLFdBQVksS0FGRCxDQUdYRSxTQUFVLElBSEMsQ0FJWEQsYUFBYyxJQUpILENBRCtCLENBQTFCLENBQXBCLENBUUEsd0JBQXdCNk8sT0FBakIsQ0FBMEJ3SyxpQkFBaUIsY0FBQSxFQUFpQixDQUNqRSxtQkFBbUJvMEgsS0FBWixDQUFtQmp2SSxTQUFuQixDQUE4QnV2SSxpQkFBaUIsSUFBakIsRUFBdUJwM0ksV0FBckQsQ0FBUCxDQUNELENBRmdDLENBRTlCODJJLEtBRjhCLENBQTFCLENBQVAsQ0FHRCxDQXhCRCxDQTBCQSwyQkFBd0JBLEtBQWpCLENBQVAsQ0FDRCxDQUVEejVJLE9BQU9DLE9BQVAsQ0FBaUIyNUksbUJBQWpCLENBQ0MsQ0FsQ3FCLENBQXRCLENBb0NBLG9DQUVBLFNBQVVJLE1BQVYsQ0FBa0IsQ0FDaEIseUJBQUEsQ0FBMEJDLGFBQTFCLENBQXlDcG5ELE9BQXpDLENBQWtEcW5ELFNBQWxELENBQTZELENBQzNELFNBQUEsQ0FFQUMsZUFBZSxJQUFmLENBQXFCQyxnQkFBckIsRUFFQWhuRCxNQUFRaW5ELDBCQUEwQixJQUExQixDQUFnQ04saUJBQWlCSyxnQkFBakIsRUFBbUNyNEksSUFBbkMsQ0FBd0MsSUFBeEMsQ0FBOEMsSUFBSStNLE1BQUosQ0FBV21ySSxhQUFYLENBQTBCLElBQTFCLEVBQWdDbnJJLE1BQWhDLENBQXVDK2pGLE9BQXZDLENBQTlDLENBQWhDLENBQVIsQ0FFQSxlQUFpQk8sTUFBTWtuRCxLQUFOLENBQVkxc0ksS0FBWixDQUFrQixJQUFsQixDQUFqQixDQUVBMnNJLFdBQVc5eEgsTUFBWCxDQUFrQixDQUFsQixDQUFxQixDQUFyQixFQUNBMnFFLE1BQU1rbkQsS0FBTixDQUFjQyxXQUFXanlFLElBQVgsQ0FBZ0IsSUFBaEIsQ0FBZCxDQUNBLEdBQUlsc0QsT0FBSixDQUFhQSxRQUFRTSxLQUFSLENBQWMsWUFBZCxDQUE0Qnc5SCxTQUE1QixFQUNiOW1ELE1BQU1qd0YsSUFBTixDQUFhLGtCQUFiLENBQ0EsWUFBQSxDQUNELENBRURxM0ksU0FBU0osZ0JBQVQsQ0FBMkJKLE1BQTNCLEVBRUEsdUJBQUEsQ0FDRCxDQXBCRCxDQW9CRVMsZ0JBQWdCQyxLQUFoQixDQXBCRixDQUZBLENBdUJBLGlDQUVBLFNBQVVDLE9BQVYsQ0FBbUIsQ0FDakIsd0JBQUEsQ0FBeUJWLGFBQXpCLENBQXdDcG5ELE9BQXhDLENBQWlEK25ELFlBQWpELENBQStELENBQzdELFVBQUEsQ0FFQSxxQkFBdUJwd0ksVUFBVTFELE1BQVYsQ0FBbUIsQ0FBbkIsRUFBd0IwRCxVQUFVLENBQVYsSUFBaUIvRSxTQUF6QyxDQUFxRCtFLFVBQVUsQ0FBVixDQUFyRCxDQUFvRSxLQUEzRixDQUVBMnZJLGVBQWUsSUFBZixDQUFxQlUsZUFBckIsRUFFQUMsT0FBU1QsMEJBQTBCLElBQTFCLENBQWdDTixpQkFBaUJjLGVBQWpCLEVBQWtDOTRJLElBQWxDLENBQXVDLElBQXZDLENBQTZDLElBQUkrTSxNQUFKLENBQVdtckksYUFBWCxDQUEwQixJQUExQixFQUFnQ25ySSxNQUFoQyxDQUF1QytqRixPQUF2QyxDQUE3QyxDQUFoQyxDQUFULENBRUEsZUFBaUJpb0QsT0FBT1IsS0FBUCxDQUFhMXNJLEtBQWIsQ0FBbUIsSUFBbkIsQ0FBakIsQ0FFQTJzSSxXQUFXOXhILE1BQVgsQ0FBa0IsQ0FBbEIsQ0FBcUIsQ0FBckIsRUFDQXF5SCxPQUFPUixLQUFQLENBQWVDLFdBQVdqeUUsSUFBWCxDQUFnQixJQUFoQixDQUFmLENBQ0EsR0FBSWxzRCxPQUFKLENBQWFBLFFBQVFNLEtBQVIsQ0FBYyxnQkFBZCxDQUFnQ2srSCxZQUFoQyxFQUNiLEdBQUl4K0gsU0FBVzIrSCxnQkFBZixDQUFpQzMrSCxRQUFRTSxLQUFSLENBQWMsaUNBQWQsQ0FBaURxK0gsZ0JBQWpELEVBQ2pDRCxPQUFPMzNJLElBQVAsQ0FBYyxpQkFBZCxDQUNBLGFBQUEsQ0FDRCxDQUVEcTNJLFNBQVNLLGVBQVQsQ0FBMEJGLE9BQTFCLEVBRUEsc0JBQUEsQ0FDRCxDQXZCRCxDQXVCRUYsZ0JBQWdCQyxLQUFoQixDQXZCRixDQUZBLENBMEJBLDhCQUVBLFNBQVVNLE9BQVYsQ0FBbUIsQ0FDakIscUJBQUEsQ0FBc0JmLGFBQXRCLENBQXFDcG5ELE9BQXJDLENBQThDcW5ELFNBQTlDLENBQXlELENBQ3ZELFVBQUEsQ0FFQSxpQkFBbUIxdkksVUFBVTFELE1BQVYsQ0FBbUIsQ0FBbkIsRUFBd0IwRCxVQUFVLENBQVYsSUFBaUIvRSxTQUF6QyxDQUFxRCtFLFVBQVUsQ0FBVixDQUFyRCxDQUFvRSxLQUF2RixDQUVBMnZJLGVBQWUsSUFBZixDQUFxQmMsWUFBckIsRUFFQUMsT0FBU2IsMEJBQTBCLElBQTFCLENBQWdDTixpQkFBaUJrQixZQUFqQixFQUErQmw1SSxJQUEvQixDQUFvQyxJQUFwQyxDQUEwQyxJQUFJK00sTUFBSixDQUFXbXJJLGFBQVgsQ0FBMEIsSUFBMUIsRUFBZ0NuckksTUFBaEMsQ0FBdUMrakYsT0FBdkMsQ0FBMUMsQ0FBaEMsQ0FBVCxDQUVBLGVBQWlCcW9ELE9BQU9aLEtBQVAsQ0FBYTFzSSxLQUFiLENBQW1CLElBQW5CLENBQWpCLENBRUEyc0ksV0FBVzl4SCxNQUFYLENBQWtCLENBQWxCLENBQXFCLENBQXJCLEVBQ0F5eUgsT0FBT1osS0FBUCxDQUFlQyxXQUFXanlFLElBQVgsQ0FBZ0IsSUFBaEIsQ0FBZixDQUNBLEdBQUlsc0QsT0FBSixDQUFhQSxRQUFRTSxLQUFSLENBQWMsWUFBZCxDQUE0Qnc5SCxTQUE1QixFQUNiLEdBQUk5OUgsU0FBV3crSCxZQUFmLENBQTZCeCtILFFBQVFNLEtBQVIsQ0FBYyxnQkFBZCxDQUFnQ2srSCxZQUFoQyxFQUM3Qk0sT0FBTy8zSSxJQUFQLENBQWMsY0FBZCxDQUNBLGFBQUEsQ0FDRCxDQUVEcTNJLFNBQVNTLFlBQVQsQ0FBdUJELE9BQXZCLEVBRUEsbUJBQUEsQ0FDRCxDQXZCRCxDQXVCRVAsZ0JBQWdCQyxLQUFoQixDQXZCRixDQUZBLENBMkJBLGFBQWUsaUJBQUEsRUFBb0IsQ0FDakMsZUFBTSxDQUFVLHFFQUFWLENBQU4sQ0FDRCxDQUZELENBSUEsR0FBSSxDQUNGLEFBQ0QsQ0FBQyxNQUFPMTRJLEdBQVAsQ0FBWSxDQUNabTVJLFdBQ0QsQ0FDRDs7Ozs7Ozs7S0FXQSw4QkFFQSxTQUFVQyxPQUFWLENBQW1CLENBQ2pCLHFCQUFBLEVBQXdCLENBQ3RCakIsZUFBZSxJQUFmLENBQXFCa0IsWUFBckIsRUFFQSxpQ0FBaUMsSUFBMUIsQ0FBZ0N0QixpQkFBaUJzQixZQUFqQixFQUErQjl3SSxLQUEvQixDQUFxQyxJQUFyQyxDQUEyQ0MsU0FBM0MsQ0FBaEMsQ0FBUCxDQUNELENBRUQ4d0ksWUFBWUQsWUFBWixDQUEwQixDQUFDLENBQ3pCejBJLElBQUssa0JBRG9CO0VBSXpCOzs7Ozs7U0FPQTlDLE1BQU8seUJBQUEsQ0FBMEJxSSxNQUExQixDQUFrQyxDQUN2QyxHQUFJLENBQUMsS0FBS292SSxPQUFOLEVBQWlCLENBQUNwdkksTUFBdEIsQ0FBOEIsT0FDOUIsR0FBSUEsUUFBVUEsT0FBT292SSxPQUFyQixDQUE4QixLQUFLQSxPQUFMLENBQWVwdkksT0FBT292SSxPQUFQLENBQWU3ekksS0FBZixDQUFxQixDQUFyQixDQUFmLENBRTlCLEdBQUksS0FBSzZ6SSxPQUFULENBQWtCLENBQ2hCLElBQUssTUFBUSxDQUFSLENBQVd6dEksSUFBTSxLQUFLeXRJLE9BQUwsQ0FBYXowSSxNQUFuQyxDQUEyQ0ssRUFBSTJHLEdBQS9DLENBQW9EM0csR0FBcEQsQ0FBeUQsQ0FDdkQsS0FBS3EwSSxXQUFMLENBQWlCLEtBQUtELE9BQUwsQ0FBYXAwSSxDQUFiLENBQWpCLENBQWtDLEtBQWxDLEVBQ0QsQ0FDRixDQUVELEdBQUlnRixNQUFKLENBQVksS0FBS3N2SSxXQUFMLENBQWlCLENBQzNCQyxPQUFRdnZJLE1BRG1CLENBQWpCLEVBR2IsQ0FBQztFQUVGOzs7Ozs7O1VBMUJ3QixDQW1DdkIsQ0FDRHZGLElBQUssYUFESixDQUVEOUMsTUFBTyxvQkFBQSxFQUF1QixDQUM1QixjQUFnQjBHLFVBQVUxRCxNQUFWLENBQW1CLENBQW5CLEVBQXdCMEQsVUFBVSxDQUFWLElBQWlCL0UsU0FBekMsQ0FBcUQrRSxVQUFVLENBQVYsQ0FBckQsQ0FBb0UsRUFBcEYsQ0FDQSxZQUFjLEtBQUsrd0ksT0FBbkIsQ0FDQSxHQUFJLENBQUNBLE9BQUwsQ0FBYyxnQkFBQSxDQUVkLElBQUssTUFBUSxDQUFSLENBQVd6dEksSUFBTXl0SSxRQUFRejBJLE1BQTlCLENBQXNDSyxFQUFJMkcsR0FBMUMsQ0FBK0MzRyxHQUEvQyxDQUFvRCxDQUNsRCxJQUFLLE9BQUwsYUFBQSxDQUEyQixDQUN6QixHQUFJdzBJLFVBQVUvMEksR0FBVixDQUFKLENBQW9CLENBQ2xCLFdBQWEyMEksUUFBUXAwSSxDQUFSLENBQWIsQ0FDQSxHQUFJbkgsUUFBVUEsT0FBTzQ3SSxNQUFqQixFQUEyQjU3SSxPQUFPNDdJLE1BQVAsQ0FBY2gxSSxHQUFkLENBQS9CLENBQW1EKzBJLFVBQVUvMEksR0FBVixFQUFpQjVHLE9BQU80N0ksTUFBUCxDQUFjaDFJLEdBQWQsRUFBbUIyRCxLQUFuQixDQUF5QixJQUF6QixDQUErQixDQUFDb3hJLFVBQVUvMEksR0FBVixDQUFELENBQWlCNUcsTUFBakIsQ0FBL0IsQ0FBakIsQ0FDcEQsQ0FDRixDQUNGLENBRUQsZ0JBQUEsQ0FDRCxDQUNEOzs7Ozs7O1VBckR3QixDQThEdkIsQ0FDRDRHLElBQUssY0FESixDQUVEOUMsTUFBTyxxQkFBQSxDQUFzQlgsSUFBdEIsQ0FBNEIsQ0FDakMsVUFBWSxJQUFaLENBRUEsT0FBU3FILFVBQVUxRCxNQUFWLENBQW1CLENBQW5CLEVBQXdCMEQsVUFBVSxDQUFWLElBQWlCL0UsU0FBekMsQ0FBcUQrRSxVQUFVLENBQVYsQ0FBckQsQ0FBb0UsU0FBVTYyRixJQUFWLENBQWdCdzZDLFdBQWhCLENBQTZCLENBQ3hHLFlBQVl0eEksS0FBTCxDQUFXNm9GLEtBQVgsQ0FBa0IsQ0FBQ3lvRCxXQUFELENBQWxCLENBQVAsQ0FDRCxDQUZELENBR0EsWUFBYyxLQUFLTixPQUFuQixDQUNBLEdBQUksQ0FBQ0EsT0FBTCxDQUFjLE9BRWQsSUFBSyxNQUFRLENBQVIsQ0FBV3p0SSxJQUFNeXRJLFFBQVF6MEksTUFBOUIsQ0FBc0NLLEVBQUkyRyxHQUExQyxDQUErQzNHLEdBQS9DLENBQW9ELENBQ2xELFdBQWFvMEksUUFBUXAwSSxDQUFSLENBQWIsQ0FDQSxHQUFJaEUsY0FBSixDQUFvQm1rRCxHQUFHdG5ELE9BQU9tRCxJQUFQLENBQUgsQ0FBaUJuRCxNQUFqQixFQUNyQixDQUNGLENBQ0Q7Ozs7Ozs7Ozs7VUE5RXdCLENBMEZ2QixDQUNENEcsSUFBSyxhQURKLENBRUQ5QyxNQUFPLG9CQUFBLENBQXFCOUQsTUFBckIsQ0FBNkIsQ0FDbEMsU0FBV3dLLFVBQVUxRCxNQUFWLENBQW1CLENBQW5CLEVBQXdCMEQsVUFBVSxDQUFWLElBQWlCL0UsU0FBekMsQ0FBcUQrRSxVQUFVLENBQVYsQ0FBckQsQ0FBb0UsSUFBL0UsQ0FDQSxHQUFJLENBQUN4SyxNQUFMLENBQWEsT0FDYixHQUFJc0csTUFBUSxLQUFLaTFJLE9BQWpCLENBQTBCLEtBQUtBLE9BQUwsQ0FBYWoxSSxJQUFiLENBQWtCdEcsTUFBbEIsRUFBMUIsUUFBNkRzRyxJQUFKLENBQVUsS0FBS2kxSSxPQUFMLENBQWUsQ0FBQ3Y3SSxNQUFELENBQWYsQ0FDbkUsR0FBSSxLQUFLdTBHLE9BQVQsQ0FBa0IsS0FBS0EsT0FBTCxDQUFhdW5DLE1BQWIsQ0FBb0I5N0ksTUFBcEIsRUFDbEIsR0FBSUEsT0FBT3UwRyxPQUFQLEVBQWtCLEtBQUtBLE9BQTNCLENBQW9DdjBHLE9BQU91MEcsT0FBUCxDQUFlLEtBQUtBLE9BQXBCLEVBQXBDLFFBQTBFdjBHLE9BQU91MEcsT0FBWCxDQUFvQixDQUN4RixzQkFBTSxDQUFpQixXQUFqQixDQUE4QixxRUFBOUIsQ0FBcUcsSUFBckcsQ0FBMkd2MEcsTUFBM0csQ0FBTixDQUNELENBQ0QsR0FBSUEsT0FBTys3SSxTQUFYLENBQXNCLzdJLE9BQU8rN0ksU0FBUCxDQUFpQnQ5QyxJQUFqQixDQUFzQixJQUF0QixFQUE0QnorRixNQUE1QixFQUN0QixhQUFBLENBQ0QsQ0FDRDs7Ozs7VUF2R3dCLENBOEd2QixDQUNENEcsSUFBSyxnQkFESixDQUVEOUMsTUFBTyx1QkFBQSxFQUEwQixDQUMvQixNQUFPLEtBQUt5M0ksT0FBTCxDQUFhejBJLE1BQXBCLENBQTRCLENBQzFCLEtBQUtrMUksYUFBTCxDQUFtQixLQUFLVCxPQUFMLENBQWEsQ0FBYixDQUFuQixFQUNELENBQ0YsQ0FDRDs7Ozs7OztVQXJId0IsQ0E4SHZCLENBQ0QzMEksSUFBSyxlQURKLENBRUQ5QyxNQUFPLHNCQUFBLENBQXVCOUQsTUFBdkIsQ0FBK0IsQ0FDcEMsR0FBSSxDQUFDQSxNQUFMLENBQWEsT0FDYixLQUFLdTdJLE9BQUwsQ0FBYTl5SCxNQUFiLENBQW9CLEtBQUs4eUgsT0FBTCxDQUFhNXlJLE9BQWIsQ0FBcUIzSSxNQUFyQixDQUFwQixDQUFrRCxDQUFsRCxFQUNBLEdBQUlBLE9BQU80akMsT0FBWCxDQUFvQjVqQyxPQUFPNGpDLE9BQVAsQ0FBZTY2RCxJQUFmLENBQW9CLElBQXBCLEVBQTBCeitGLE1BQTFCLEVBQ3BCLGFBQUEsQ0FDRCxDQUFDO0VBRUY7Ozs7Ozs7Ozs7Ozs7VUF2SXdCLENBc0p2QixDQUNENEcsSUFBSyxRQURKLENBRUQ5QyxNQUFPLGVBQUEsQ0FBZ0JtNEksT0FBaEIsQ0FBeUIsQ0FDOUIsS0FBS1QsV0FBTCxDQUFpQlMsT0FBakIsRUFDQSxXQUFBLENBQ0QsQ0FMQSxDQXRKdUIsQ0FBMUIsRUE4SkF6QixTQUFTYSxZQUFULENBQXVCRCxPQUF2QixFQUVBLG1CQUFBLENBQ0QsQ0F4S0QsQ0F3S0VjLGtCQXhLRixDQUZBLENBNEtBLDBCQUFBLENBQXlCOWhJLEdBQXpCLENBQThCLENBQzVCLEdBQUluRyxNQUFNeU0sT0FBTixDQUFjdEcsR0FBZCxDQUFKLENBQXdCLFVBQUEsQ0FDekIsQ0FFRCxtQkFBcUIraEksaUJBQXJCLENBRUEscUJBQXVCL3hJLE1BQU1neUksV0FBTixDQUFvQixTQUFVanpJLEVBQVYsQ0FBYyxDQUN2RCxXQUFhaU0sdUJBQXVCak0sRUFBdkIsQ0FBYixDQUNBLEdBQUksYUFBQSxFQUFpQixVQUFyQixDQUFpQyxnQkFBZ0JBLEdBQUssbUJBQWYsQ0FBTixDQUNqQyxpQkFBaUJvTSxPQUFPeFQsSUFBUCxDQUFZb0gsRUFBWixDQUFWLENBQVAsQ0FDRCxDQUpELENBTUEsZ0JBQWtCa3pJLGdCQUFsQixDQUVBLGtCQUFvQkQsV0FBcEIsQ0FFQSxnQ0FBQSxDQUErQmhpSSxHQUEvQixDQUFvQ2pULENBQXBDLENBQXVDLENBQ3JDLFNBQVcsRUFBWCxDQUNBLE9BQVMsSUFBVCxDQUNBLE9BQVMsS0FBVCxDQUNBLE9BQVMxQixTQUFULENBRUEsR0FBSSxDQUNGLElBQUssT0FBUzYySSxjQUFjbGlJLEdBQWQsQ0FBVCxDQUE2Qm1CLEVBQWxDLENBQXNDLEVBQUVKLEdBQUssQ0FBQ0ksR0FBS3pILEdBQUdwUCxJQUFILEVBQU4sRUFBaUJDLElBQXhCLENBQXRDLENBQXFFd1csR0FBSyxJQUExRSxDQUFnRixDQUM5RW9oSSxLQUFLajJJLElBQUwsQ0FBVWlWLEdBQUd6WCxLQUFiLEVBRUEsR0FBSXFELEdBQUtvMUksS0FBS3oxSSxNQUFMLEdBQWdCSyxDQUF6QixDQUE0QixNQUM3QixDQUNGLENBQUMsTUFBT25GLEdBQVAsQ0FBWSxDQUNaNmEsR0FBSyxJQUFMLENBQ0EyL0gsR0FBS3g2SSxHQUFMLENBQ0QsQ0FURCxPQVNVLENBQ1IsR0FBSSxDQUNGLEdBQUksQ0FBQ21aLEVBQUQsRUFBT3JILEdBQUcsUUFBSCxHQUFnQixJQUEzQixDQUFpQ0EsR0FBRyxRQUFILElBQ2xDLENBRkQsT0FFVSxDQUNSLEdBQUkrSSxFQUFKLENBQVEsUUFBQSxDQUNULENBQ0YsQ0FFRCxXQUFBLENBQ0QsQ0FFRCx5QkFBMkI0L0gsdUJBQTNCLENBRUEsMkJBQUEsRUFBNEIsQ0FDMUIsbUJBQU0sQ0FBYyxzREFBZCxDQUFOLENBQ0QsQ0FFRCxvQkFBc0JDLGtCQUF0QixDQUVBLHlCQUFBLENBQXdCdGlJLEdBQXhCLENBQTZCalQsQ0FBN0IsQ0FBZ0MsQ0FDOUIsc0JBQXNCaVQsR0FBZixHQUF1QnVpSSxxQkFBcUJ2aUksR0FBckIsQ0FBMEJqVCxDQUExQixDQUF2QixFQUF1RHkxSSxpQkFBOUQsQ0FDRCxDQUVELGtCQUFvQkMsZ0JBQXBCLENBRUEsaUNBQUEsQ0FBa0MxZixJQUFsQyxDQUF3QyxDQUN2QyxVQUFBLENBQ0EsV0FBYUEsS0FBSzM4SCxNQUFsQixDQUVBLEdBQUksYUFBQSxHQUFrQixVQUF0QixDQUFrQyxDQUNqQyxHQUFJQSxPQUFPczhJLFVBQVgsQ0FBdUIsQ0FDdEJqNUksT0FBU3JELE9BQU9zOEksVUFBaEIsQ0FDQSxDQUZELElBRU8sQ0FDTmo1SSxPQUFTckQsT0FBTyxZQUFQLENBQVQsQ0FDQUEsT0FBT3M4SSxVQUFQLENBQW9CajVJLE1BQXBCLENBQ0EsQ0FDRCxDQVBELElBT08sQ0FDTkEsT0FBUyxjQUFULENBQ0EsQ0FFRCxhQUFBLENBQ0EsQ0FFRCxtQkFFQSxRQUFBLENBRUEsR0FBSSxXQUFBLEdBQWdCLFdBQXBCLENBQWlDLENBQy9CczVILEtBQU9qOEgsSUFBUCxDQUNELENBRkQsUUFFVyxhQUFBLEdBQWtCLFdBQXRCLENBQW1DLENBQ3hDaThILEtBQU9wekgsTUFBUCxDQUNELENBRk0sUUFFSSxhQUFBLEdBQWtCLFdBQXRCLENBQW1DLENBQ3hDb3pILEtBQU9oOUgsTUFBUCxDQUNELENBRk0sUUFFSSxhQUFBLEdBQWtCLFdBQXRCLENBQW1DLENBQ3hDZzlILEtBQU9uOUgsTUFBUCxDQUNELENBRk0sSUFFQSxDQUNMbTlILEtBQU8zMEgsU0FBUyxhQUFULEdBQVAsQ0FDRCxDQUVELFdBQWF1MEkseUJBQXlCNWYsSUFBekIsQ0FBYixDQUVBOzs7OztLQU1BLGdCQUFrQixDQUNoQjZmLEtBQU0sZUFBaUJoMEksS0FBSzZGLE1BQUwsR0FBYy9JLFFBQWQsQ0FBdUIsRUFBdkIsRUFBMkJrcUgsU0FBM0IsQ0FBcUMsQ0FBckMsRUFBd0NwaUgsS0FBeEMsQ0FBOEMsRUFBOUMsRUFBa0QwNkQsSUFBbEQsQ0FBdUQsR0FBdkQsQ0FEUCxDQUVoQjIwRSxRQUFTLGtCQUFvQmowSSxLQUFLNkYsTUFBTCxHQUFjL0ksUUFBZCxDQUF1QixFQUF2QixFQUEyQmtxSCxTQUEzQixDQUFxQyxDQUFyQyxFQUF3Q3BpSCxLQUF4QyxDQUE4QyxFQUE5QyxFQUFrRDA2RCxJQUFsRCxDQUF1RCxHQUF2RCxDQUZiLENBQWxCLENBS0EsY0FBYyxhQUFBLEdBQWtCLFVBQWxCLEVBQWdDLGNBQWM1bkUsUUFBZCxHQUEyQixRQUEzRCxDQUFzRSxTQUFVa0IsR0FBVixDQUFlLENBQ2pHLGlCQUFBLENBQ0QsQ0FGYSxDQUVWLFNBQVVBLEdBQVYsQ0FBZSxDQUNqQixZQUFjLGFBQUEsR0FBa0IsVUFBekIsRUFBdUNBLElBQUllLFdBQUosR0FBb0JuQyxNQUEzRCxFQUFxRW9CLE1BQVFwQixPQUFPSCxTQUFwRixDQUFnRyxRQUFoRyxDQUEyRyxVQUFsSCxDQUNELENBSkQsQ0FNQTs7O0tBSUEsc0JBQUEsQ0FBdUJ1QixHQUF2QixDQUE0QixDQUMxQixHQUFJLENBQUMsVUFBQSxHQUFlLFdBQWYsQ0FBNkIsV0FBN0IsQ0FBMkNxa0IsVUFBUXJrQixHQUFSLENBQTVDLElBQThELFFBQTlELEVBQTBFQSxNQUFRLElBQXRGLENBQTRGLFlBQUEsQ0FFNUYsVUFBWUEsR0FBWixDQUNBLE1BQU94QixPQUFPK0IsY0FBUCxDQUFzQnFRLEtBQXRCLElBQWlDLElBQXhDLENBQThDLENBQzVDQSxNQUFRcFMsT0FBTytCLGNBQVAsQ0FBc0JxUSxLQUF0QixDQUFSLENBQ0QsQ0FFRCxjQUFjclEsY0FBUCxDQUFzQlAsR0FBdEIsSUFBK0I0USxLQUF0QyxDQUNELENBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztLQXlCQSxvQkFBQSxDQUFxQjBxSSxPQUFyQixDQUE4QkMsY0FBOUIsQ0FBOENDLFFBQTlDLENBQXdELENBQ3RELFNBQUEsQ0FFQSxHQUFJLHFCQUFBLEdBQTBCLFVBQTFCLEVBQXdDLGVBQUEsR0FBb0IsV0FBaEUsQ0FBNkUsQ0FDM0VBLFNBQVdELGNBQVgsQ0FDQUEsZUFBaUIxM0ksU0FBakIsQ0FDRCxDQUVELEdBQUksZUFBQSxHQUFvQixXQUF4QixDQUFxQyxDQUNuQyxHQUFJLGVBQUEsR0FBb0IsVUFBeEIsQ0FBb0MsQ0FDbEMsZUFBTSxDQUFVLHlDQUFWLENBQU4sQ0FDRCxDQUVELGdCQUFnQjQzSSxXQUFULEVBQXNCSCxPQUF0QixDQUErQkMsY0FBL0IsQ0FBUCxDQUNELENBRUQsR0FBSSxjQUFBLEdBQW1CLFVBQXZCLENBQW1DLENBQ2pDLGVBQU0sQ0FBVSx3Q0FBVixDQUFOLENBQ0QsQ0FFRCxtQkFBcUJELE9BQXJCLENBQ0EsaUJBQW1CQyxjQUFuQixDQUNBLHFCQUF1QixFQUF2QixDQUNBLGtCQUFvQkcsZ0JBQXBCLENBQ0Esa0JBQW9CLEtBQXBCLENBRUEscUNBQUEsRUFBd0MsQ0FDdEMsR0FBSUMsZ0JBQWtCRCxnQkFBdEIsQ0FBd0MsQ0FDdENDLGNBQWdCRCxpQkFBaUI1MUksS0FBakIsRUFBaEIsQ0FDRCxDQUNGLENBRUQ7Ozs7T0FLQSxpQkFBQSxFQUFvQixDQUNsQixHQUFJODFJLGFBQUosQ0FBbUIsQ0FDakIsZUFBTSxDQUFVLHFFQUF1RSw2REFBdkUsQ0FBdUkseUVBQWpKLENBQU4sQ0FDRCxDQUVELG1CQUFBLENBQ0QsQ0FFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQXVCQSxrQkFBQSxDQUFtQnRtSSxRQUFuQixDQUE2QixDQUMzQixHQUFJLGVBQUEsR0FBb0IsVUFBeEIsQ0FBb0MsQ0FDbEMsZUFBTSxDQUFVLHlDQUFWLENBQU4sQ0FDRCxDQUVELEdBQUlzbUksYUFBSixDQUFtQixDQUNqQixlQUFNLENBQVUsc0VBQXdFLHNGQUF4RSxDQUFpSyxvRkFBakssQ0FBd1Asb0ZBQWxRLENBQU4sQ0FDRCxDQUVELGlCQUFtQixJQUFuQixDQUVBQywrQkFDQUYsY0FBY2ozSSxJQUFkLENBQW1CNFEsUUFBbkIsRUFFQSwyQkFBTyxFQUF1QixDQUM1QixHQUFJLENBQUN3bUksWUFBTCxDQUFtQixDQUNqQixPQUNELENBRUQsR0FBSUYsYUFBSixDQUFtQixDQUNqQixlQUFNLENBQVUsaUZBQW1GLG9GQUE3RixDQUFOLENBQ0QsQ0FFREUsYUFBZSxLQUFmLENBRUFELCtCQUNBLFVBQVlGLGNBQWM1MEksT0FBZCxDQUFzQnVPLFFBQXRCLENBQVosQ0FDQXFtSSxjQUFjOTBILE1BQWQsQ0FBcUIxYSxLQUFyQixDQUE0QixDQUE1QixFQUNELENBZEQsQ0FlRCxDQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0F5QkEsaUJBQUEsQ0FBa0IrbUgsTUFBbEIsQ0FBMEIsQ0FDeEIsR0FBSSxDQUFDNm9CLGNBQWM3b0IsTUFBZCxDQUFMLENBQTRCLENBQzFCLGVBQU0sQ0FBVSxrQ0FBb0MsMENBQTlDLENBQU4sQ0FDRCxDQUVELEdBQUksY0FBY2h6SCxJQUFkLEdBQXVCLFdBQTNCLENBQXdDLENBQ3RDLGVBQU0sQ0FBVSxzREFBd0QsaUNBQWxFLENBQU4sQ0FDRCxDQUVELEdBQUkwN0ksYUFBSixDQUFtQixDQUNqQixlQUFNLENBQVUsb0NBQVYsQ0FBTixDQUNELENBRUQsR0FBSSxDQUNGQSxjQUFnQixJQUFoQixDQUNBSSxhQUFlQyxlQUFlRCxZQUFmLENBQTZCOW9CLE1BQTdCLENBQWYsQ0FDRCxDQUhELE9BR1UsQ0FDUjBvQixjQUFnQixLQUFoQixDQUNELENBRUQsY0FBZ0JGLGlCQUFtQkMsYUFBbkMsQ0FDQSxJQUFLLE1BQVEsQ0FBYixDQUFnQnAySSxFQUFJa2hCLFVBQVV2aEIsTUFBOUIsQ0FBc0NLLEdBQXRDLENBQTJDLENBQ3pDLGFBQWVraEIsVUFBVWxoQixDQUFWLENBQWYsQ0FDQStQLFdBQ0QsQ0FFRCxhQUFBLENBQ0QsQ0FFRDs7Ozs7Ozs7O09BVUEsdUJBQUEsQ0FBd0I0bUksV0FBeEIsQ0FBcUMsQ0FDbkMsR0FBSSxrQkFBQSxHQUF1QixVQUEzQixDQUF1QyxDQUNyQyxlQUFNLENBQVUsNENBQVYsQ0FBTixDQUNELENBRURELGVBQWlCQyxXQUFqQixDQUNBQyxTQUFTLENBQUVqOEksS0FBTWs4SSxZQUFZZixPQUFwQixDQUFULEVBQ0QsQ0FFRDs7Ozs7T0FNQSxtQkFBQSxFQUFzQixDQUNwQixRQUFBLENBRUEsbUJBQXFCZ0IsU0FBckIsQ0FDQSxZQUFjOzs7Ozs7O1dBU1pBLFVBQVcsa0JBQUEsQ0FBbUJDLFFBQW5CLENBQTZCLENBQ3RDLEdBQUksQ0FBQyxlQUFBLEdBQW9CLFdBQXBCLENBQWtDLFdBQWxDLENBQWdEajRILFVBQVFpNEgsUUFBUixDQUFqRCxJQUF3RSxRQUF4RSxFQUFvRkEsV0FBYSxJQUFyRyxDQUEyRyxDQUN6RyxtQkFBTSxDQUFjLHdDQUFkLENBQU4sQ0FDRCxDQUVELHFCQUFBLEVBQXdCLENBQ3RCLEdBQUlBLFNBQVN4NUksSUFBYixDQUFtQixDQUNqQnc1SSxTQUFTeDVJLElBQVQsQ0FBY3k1SSxVQUFkLEVBQ0QsQ0FDRixDQUVEQyxlQUNBLGdCQUFrQkMsZUFBZUQsWUFBZixDQUFsQixDQUNBLE9BQU8sQ0FBRUUsWUFBYUEsV0FBZixDQUFQLENBQ0QsQ0F2QlcsQ0FBUCxDQXdCSkMsS0FBSzE2SSxNQUFMLEVBQWUsVUFBWSxDQUM1QixXQUFBLENBQ0QsQ0ExQk0sQ0EwQkowNkksSUExQkgsQ0EyQkQsQ0FFRDtFQUNBO0VBQ0E7RUFDQVIsU0FBUyxDQUFFajhJLEtBQU1rOEksWUFBWWhCLElBQXBCLENBQVQsRUFFQSxhQUFlLENBQ2JlLFNBQVVBLFFBREcsQ0FFYkUsVUFBV0EsU0FGRSxDQUdiRSxTQUFVQSxRQUhHLENBSWJLLGVBQWdCQSxjQUpILENBQVIsQ0FLSkMsTUFBTTU2SSxNQUFOLEVBQWdCaTVJLFVBTFosQ0FLd0IyQixLQUwvQixDQU1ELENBRUQ7Ozs7OztLQVFBLCtCQUVBLFVBQVksQ0FDVixzQkFBQSxDQUF1QjkzSSxNQUF2QixDQUErQixDQUM3Qnd6SSxlQUFlLElBQWYsQ0FBcUJ1RSxhQUFyQixFQUVBLEtBQUs5aUksT0FBTCxDQUFlalYsTUFBZixDQUNBLEtBQUtnNEksYUFBTCxDQUFxQixJQUFyQixDQUNBLEtBQUtsd0ksS0FBTCxDQUFhNHVJLFlBQVksVUFBWSxDQUNuQyxVQUFZN3lJLFVBQVUxRCxNQUFWLENBQW1CLENBQW5CLEVBQXdCMEQsVUFBVSxDQUFWLElBQWlCL0UsU0FBekMsQ0FBcUQrRSxVQUFVLENBQVYsQ0FBckQsQ0FBb0UsQ0FBQyxFQUFELENBQUssRUFBTCxDQUFoRixDQUNBLFdBQWFBLFVBQVUxRCxNQUFWLENBQW1CLENBQW5CLENBQXVCMEQsVUFBVSxDQUFWLENBQXZCLENBQXNDL0UsU0FBbkQsQ0FDQVosTUFBTSxDQUFOLEVBQVNpd0gsT0FBT2x1SCxHQUFoQixFQUF1Qmt1SCxPQUFPdCtHLElBQTlCLENBQ0EzUixNQUFNLENBQU4sRUFBV2l3SCxPQUFPbHVILEdBQWxCLENBQ0EsWUFBQSxDQUNELENBTlksQ0FBYixDQU9BLEtBQUsyMEksT0FBTCxDQUFlLEVBQWYsQ0FDRCxDQUNEOzs7Ozs7T0FTQUQsWUFBWW9ELGFBQVosQ0FBMkIsQ0FBQyxDQUMxQjkzSSxJQUFLLFFBRHFCLENBRTFCOUMsTUFBTyxlQUFBLENBQWdCOUQsTUFBaEIsQ0FBd0IsQ0FDN0IsS0FBSzIrSSxhQUFMLENBQXFCMytJLE1BQXJCLENBQ0QsQ0FDRDs7Ozs7VUFMeUIsQ0FZeEIsQ0FDRDRHLElBQUssT0FESixDQUVEOUMsTUFBTyxjQUFBLEVBQWlCLENBQ3RCLEtBQUs2NkksYUFBTCxDQUFxQixJQUFyQixDQUNELENBQ0Q7Ozs7OztVQWpCeUIsQ0F5QnhCLENBQ0QvM0ksSUFBSyxRQURKLENBRUQ5QyxNQUFPLGVBQUEsQ0FBZ0JYLElBQWhCLENBQXNCLENBQzNCLEtBQUtvNEksT0FBTCxDQUFhcDRJLElBQWIsRUFBcUIsS0FBS3c3SSxhQUExQixDQUNELENBQ0Q7Ozs7OztVQTlCeUIsQ0FzQ3hCLENBQ0QvM0ksSUFBSyxLQURKLENBRUQ5QyxNQUFPLFlBQUEsQ0FBYVgsSUFBYixDQUFtQixDQUN4QixZQUFZbzRJLE9BQUwsQ0FBYXA0SSxJQUFiLENBQVAsQ0FDRCxDQUNEOzs7Ozs7Ozs7VUEzQ3lCLENBc0R4QixDQUNEeUQsSUFBSyxLQURKLENBRUQ5QyxNQUFPLFlBQUEsQ0FBYThDLEdBQWIsQ0FBa0I0UCxJQUFsQixDQUF3QixDQUM3QixLQUFLL0gsS0FBTCxDQUFXc3ZJLFFBQVgsQ0FBb0IsQ0FDbEJqOEksS0FBTSxLQURZLENBRWxCOEUsSUFBS0EsR0FGYSxDQUdsQjRQLEtBQU1BLElBSFksQ0FBcEIsRUFLRCxDQUNEOzs7Ozs7Ozs7O1VBL0R5QixDQTJFeEIsQ0FDRDVQLElBQUssS0FESixDQUVEOUMsTUFBTyxZQUFBLENBQWE4QyxHQUFiLENBQWtCLENBQ3ZCLEdBQUksQ0FBQyxLQUFLNkgsS0FBTCxDQUFXMHZJLFFBQVgsR0FBc0IsQ0FBdEIsRUFBeUJ2M0ksR0FBekIsQ0FBTCxDQUFvQyxDQUNsQyx5QkFBTSxDQUFvQixlQUFwQixDQUFxQyxvQkFBb0JrSSxNQUFwQixDQUEyQmxJLEdBQTNCLENBQWdDLGNBQWhDLENBQXJDLENBQXNGLEtBQUsrM0ksYUFBM0YsQ0FBTixDQUNELENBRUQsWUFBWWx3SSxLQUFMLENBQVcwdkksUUFBWCxHQUFzQixDQUF0QixFQUF5QnYzSSxHQUF6QixDQUFQLENBQ0QsQ0FDRDs7Ozs7Ozs7O1VBcEZ5QixDQStGeEIsQ0FDREEsSUFBSyxLQURKLENBRUQ5QyxNQUFPLFlBQUEsQ0FBYThDLEdBQWIsQ0FBa0IsQ0FDdkIsZUFBZSxLQUFLNkgsS0FBTCxDQUFXMHZJLFFBQVgsR0FBc0IsQ0FBdEIsRUFBeUJ2M0ksR0FBekIsQ0FBUixDQUFQLENBQ0QsQ0FDRDs7Ozs7O1VBcEd5QixDQTRHeEIsQ0FDREEsSUFBSyxRQURKLENBRUQ5QyxNQUFPLGVBQUEsRUFBa0IsQ0FDdkIsVUFBWSxJQUFaLENBRUEsWUFBYzBHLFVBQVUxRCxNQUFWLENBQW1CLENBQW5CLEVBQXdCMEQsVUFBVSxDQUFWLElBQWlCL0UsU0FBekMsQ0FBcUQrRSxVQUFVLENBQVYsQ0FBckQsQ0FBb0UsRUFBbEYsQ0FDQSxLQUFLaUUsS0FBTCxDQUFXd3ZJLFNBQVgsQ0FBcUIsVUFBWSxDQUMvQix5QkFBMkI3cUQsTUFBTTNrRixLQUFOLENBQVkwdkksUUFBWixFQUEzQixDQUNJUyxzQkFBd0JDLGNBQWNDLG9CQUFkLENBQW9DLENBQXBDLENBRDVCLENBRUl0b0ksS0FBT29vSSxzQkFBc0IsQ0FBdEIsQ0FGWCxDQUdJRyxXQUFhSCxzQkFBc0IsQ0FBdEIsQ0FIakIsQ0FLQSxhQUFlSSxRQUFRRCxVQUFSLENBQWYsQ0FDQSxHQUFJemhILFFBQUosQ0FBY0EsU0FBUzltQixLQUFLdW9JLFVBQUwsQ0FBVCxFQUNmLENBUkQsRUFTRCxDQUNEOzs7O1VBNUh5QixDQWtJeEIsQ0FDRG40SSxJQUFLLEtBREosQ0FFRDlDLE1BQU8sWUFBQSxFQUFlLENBQ3BCc1ksUUFBUTZQLElBQVIsQ0FBYSxpREFBYixFQUNBLFlBQVl4VSxHQUFMLENBQVNsTixLQUFULENBQWUsSUFBZixDQUFxQkMsU0FBckIsQ0FBUCxDQUNELENBQ0Q7Ozs7Ozs7VUF4SXlCLENBaUp4QixDQUNENUQsSUFBSyxTQURKLENBRUQ5QyxNQUFPLGdCQUFBLENBQWlCWCxJQUFqQixDQUF1Qjg3SSxjQUF2QixDQUF1QyxDQUM1QyxHQUFJLEtBQUtDLEdBQUwsQ0FBUy83SSxJQUFULElBQW1Cc0MsU0FBdkIsQ0FBa0MsS0FBS21XLE9BQUwsQ0FBYTQvSCxXQUFiLENBQXlCeUQsZ0JBQXpCLEVBQ25DLENBSkEsQ0FqSndCLENBQTNCLEVBd0pBLG9CQUFBLENBQ0QsQ0FqTEQsRUFGQSxDQXFMQTs7Ozs7OztLQVNBLDJCQUVBLFNBQVVFLGFBQVYsQ0FBeUI7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQXlCdkI7Ozs7O0VBT0E7Ozs7O0VBTUEsa0JBQUEsRUFBcUIsQ0FDbkIsU0FBQSxDQUVBLFdBQWEzMEksVUFBVTFELE1BQVYsQ0FBbUIsQ0FBbkIsRUFBd0IwRCxVQUFVLENBQVYsSUFBaUIvRSxTQUF6QyxDQUFxRCtFLFVBQVUsQ0FBVixDQUFyRCxDQUFvRSxFQUFqRixDQUNBLGFBQWVBLFVBQVUxRCxNQUFWLENBQW1CLENBQW5CLEVBQXdCMEQsVUFBVSxDQUFWLElBQWlCL0UsU0FBekMsQ0FBcUQrRSxVQUFVLENBQVYsQ0FBckQsQ0FBb0U0MEksVUFBVUMsUUFBN0YsQ0FDQSxpQkFBbUI3MEksVUFBVTFELE1BQVYsQ0FBbUIsQ0FBbkIsRUFBd0IwRCxVQUFVLENBQVYsSUFBaUIvRSxTQUF6QyxDQUFxRCtFLFVBQVUsQ0FBVixDQUFyRCxDQUFvRTQwSSxVQUFVOTNILFlBQWpHLENBRUE2eUgsZUFBZSxJQUFmLENBQXFCaUYsU0FBckIsRUFFQWhzRCxNQUFRaW5ELDBCQUEwQixJQUExQixDQUFnQ04saUJBQWlCcUYsU0FBakIsRUFBNEJyOUksSUFBNUIsQ0FBaUMsSUFBakMsQ0FBaEMsQ0FBUixDQUFpRjtFQUVqRndpQixpQkFBaUJBLGlCQUFpQkEsaUJBQWlCKzZILHNCQUFzQkEsc0JBQXNCbHNELEtBQXRCLENBQXRCLENBQWpCLENBQXNFLE9BQXRFLENBQStFLEVBQS9FLENBQWpCLENBQXFHLFNBQXJHLENBQWdILEVBQWhILENBQWpCLENBQXNJLFVBQXRJLENBQWtKLEVBQWxKLEVBRUFBLE1BQU04TSxNQUFOLENBQWVuNUUsT0FBT1MsY0FBYzA0RSxNQUFkLENBQXNCNTRFLFlBQXRCLENBQVAsQ0FBNEMrM0gsUUFBNUMsQ0FBZixDQUNBLEdBQUlqc0QsTUFBTThNLE1BQU4sQ0FBYXFVLE9BQWpCLENBQTBCbmhCLE1BQU1taEIsT0FBTixDQUFnQixpQkFBQSxDQUFrQitxQyxzQkFBc0JBLHNCQUFzQmxzRCxLQUF0QixDQUF0QixDQUFsQixDQUFoQixDQUMxQkEsTUFBTW1vRCxPQUFOLENBQWdCbm9ELE1BQU04TSxNQUFOLENBQWFxN0MsT0FBN0IsQ0FFQW5vRCxNQUFNbXNELGdCQUFOLEdBRUEsWUFBQSxDQUNELENBQ0Q7Ozs7Ozs7T0FVQWpFLFlBQVk4RCxTQUFaLENBQXVCLENBQUMsQ0FDdEJ4NEksSUFBSyxNQURpQixDQUV0QjlDLE1BQU8sYUFBQSxDQUFjb1YsT0FBZCxDQUF1QixDQUM1QixHQUFJQSxPQUFKLENBQWEsS0FBS3NtSSxLQUFMLENBQVdsNUksSUFBWCxDQUFnQjRTLE9BQWhCLEVBQ2IsZUFBZTZFLEdBQVIsQ0FBWSxLQUFLeWhJLEtBQWpCLENBQVAsQ0FDRCxDQUNEOzs7Ozs7VUFOcUIsQ0FjcEIsQ0FDRDU0SSxJQUFLLE9BREosQ0FFRDlDLE1BQU8sY0FBQSxDQUFldTlGLElBQWYsQ0FBcUIsQ0FDMUIsV0FBYSxJQUFiLENBRUEsR0FBSSxLQUFLbytDLFVBQVQsQ0FBcUIsS0FBS0MsSUFBTCxHQUFZMzdJLElBQVosQ0FBaUIsVUFBWSxDQUNoRCxZQUFZKzJJLE1BQUwsQ0FBUCxDQUNELENBRm9CLEVBQXJCLFVBRWEsSUFBTCxFQUNULENBQUM7RUFFRjs7Ozs7O1VBeEJxQixDQWdDcEIsQ0FDRGwwSSxJQUFLLGNBREosQ0FFRDlDLE1BQU8scUJBQUEsRUFBd0IsQ0FDN0IsV0FBYTBHLFVBQVUxRCxNQUFWLENBQW1CLENBQW5CLEVBQXdCMEQsVUFBVSxDQUFWLElBQWlCL0UsU0FBekMsQ0FBcUQrRSxVQUFVLENBQVYsQ0FBckQsQ0FBb0UsRUFBakYsQ0FDQSxLQUFLMDFGLE1BQUwsQ0FBY241RSxPQUFPbTVFLE1BQVAsQ0FBZSxLQUFLQSxNQUFwQixDQUFkLENBQ0EsWUFBWUEsTUFBWixDQUNELENBQUM7RUFFRjs7Ozs7O1VBeENxQixDQWdEcEIsQ0FDRHQ1RixJQUFLLE9BREosQ0FFRDlDLE1BQU8sY0FBQSxFQUFpQixDQUN0QixnQkFBZ0JuQixXQUFULENBQXFCLEtBQUt1OUYsTUFBMUIsRUFBa0NuMEUsSUFBbEMsQ0FBdUMsSUFBdkMsQ0FBUCxDQUNELENBQ0Q7Ozs7Ozs7O1VBckRxQixDQStEcEIsQ0FDRG5sQixJQUFLLE1BREosQ0FFRDlDLE1BQU8sYUFBQSxDQUFjcUksTUFBZCxDQUFzQnd6SSxTQUF0QixDQUFpQyxDQUN0QyxLQUFLei9DLE1BQUwsQ0FBYzAvQyxhQUFhLEVBQWIsQ0FBaUJ6ekksT0FBTyt6RixNQUF4QixDQUFkLENBQ0EsR0FBSS96RixPQUFPMHpJLE1BQVgsQ0FBbUIsS0FBS0EsTUFBTCxDQUFjMXpJLE9BQU8wekksTUFBUCxDQUFjL3pILEtBQWQsQ0FBb0IzZixPQUFPK3pGLE1BQTNCLENBQWQsQ0FDbkIsR0FBSXkvQyxTQUFKLENBQWVBLFlBQ2YsS0FBS0osZ0JBQUwsQ0FBc0JwekksTUFBdEIsRUFDQSxXQUFBLENBQ0QsQ0FDRDs7Ozs7OztVQXhFcUIsQ0FpRnBCLENBQ0R2RixJQUFLLEtBREosQ0FFRDlDLE1BQU8sVUFBWSxDQUNqQixTQUFXZzhJLDhCQUVYQyxZQUFZMzhJLElBQVosQ0FBaUIsZ0JBQUEsQ0FBaUJ1RCxNQUFqQixDQUF5QixDQUN4QyxtQkFBbUJoRixJQUFaLENBQWlCLGlCQUFBLENBQWtCMHVGLFFBQWxCLENBQTRCLENBQ2xELE1BQU8sQ0FBUCxDQUFVLENBQ1IsT0FBUUEsU0FBUzlvRixJQUFULENBQWdCOG9GLFNBQVMzckYsSUFBakMsRUFDRSxNQUFBLENBQ0UsR0FBSSxDQUFDaUMsT0FBT3dSLE1BQVosQ0FBb0IsQ0FDbEJrNEUsU0FBUzNyRixJQUFULENBQWdCLENBQWhCLENBQ0EsTUFDRCxDQUVEMnJGLFNBQVMzckYsSUFBVCxDQUFnQixDQUFoQixDQUNBLGNBQWN5VCxNQUFQLENBQWN3bUMsTUFBZCxDQUFxQmg0QyxNQUFyQixDQUFQLENBRUYsTUFBQSxDQUNFMHBGLFNBQVMzckYsSUFBVCxDQUFnQixDQUFoQixDQUNBLFlBQVlnN0ksSUFBTCxFQUFQLENBRUYsTUFBQSxDQUNFcnZELFNBQVMzckYsSUFBVCxDQUFnQixDQUFoQixDQUNBLGNBQWNnN0ksSUFBUCxFQUFQLENBRUYsTUFBQSxDQUNFLEdBQUkvNEksT0FBT2s1SSxNQUFYLENBQW1CLENBQ2pCeHZELFNBQVMzckYsSUFBVCxDQUFnQixDQUFoQixDQUNBLE1BQ0QsQ0FFRCw0QkFBTSxDQUF1QixXQUF2QixDQUFvQywyQkFBcEMsQ0FBaUUsSUFBakUsQ0FBTixDQUVGLE1BQUEsQ0FDRWlDLE9BQU93UixNQUFQLENBQWdCLElBQWhCLENBQ0FrNEUsU0FBUzNyRixJQUFULENBQWdCLEVBQWhCLENBQ0EsWUFBWSsySSxXQUFMLENBQWlCLENBQ3RCdUUsTUFBT3I1SSxNQURlLENBQWpCLEVBRUpxNUksS0FGSCxDQUlGLE9BQUEsQ0FDRSxLQUFLSCxNQUFMLENBQVk3ekgsR0FBWixDQUFnQnJsQixPQUFPazVJLE1BQXZCLEVBQ0EsS0FBS2hnRyxRQUFMLENBQWN2NUMsSUFBZCxDQUFtQkssTUFBbkIsRUFDQSxnQkFBZ0JwQixNQUFULENBQWdCLFFBQWhCLENBQTBCb0IsTUFBMUIsQ0FBUCxDQUVGLE9BQUEsQ0FDQSxJQUFLLEtBQUwsQ0FDRSxnQkFBZ0JnQixJQUFULEVBQVAsQ0F4Q0osQ0EwQ0QsQ0FDRixDQTdDTSxDQTZDSnM0SSxPQTdDSSxDQTZDSyxJQTdDTCxDQUFQLENBOENELENBL0NELENBRlcsQ0FBWCxDQW1EQSxtQkFBTyxDQUFhMXRILEVBQWIsQ0FBaUIsQ0FDdEIsWUFBWWhvQixLQUFMLENBQVcsSUFBWCxDQUFpQkMsU0FBakIsQ0FBUCxDQUNELENBRkQsQ0FHRCxDQXZETSxFQXdEUDs7Ozs7OztVQTNJcUIsQ0FvSnBCLENBQ0Q1RCxJQUFLLFFBREosQ0FFRDlDLE1BQU8sVUFBWSxDQUNqQixZQUFjZzhJLDhCQUVkQyxZQUFZMzhJLElBQVosQ0FBaUIsaUJBQUEsQ0FBa0J1RCxNQUFsQixDQUEwQixDQUN6QyxtQkFBbUJoRixJQUFaLENBQWlCLGtCQUFBLENBQW1CdStJLFNBQW5CLENBQThCLENBQ3BELE1BQU8sQ0FBUCxDQUFVLENBQ1IsT0FBUUEsVUFBVTM0SSxJQUFWLENBQWlCMjRJLFVBQVV4N0ksSUFBbkMsRUFDRSxNQUFBLENBQ0UsR0FBSSxFQUFFaUMsT0FBT3dSLE1BQVAsR0FBa0IsSUFBcEIsQ0FBSixDQUErQixDQUM3QituSSxVQUFVeDdJLElBQVYsQ0FBaUIsQ0FBakIsQ0FDQSxNQUNELENBRUQsaUJBQWlCYSxNQUFWLENBQWlCLFFBQWpCLENBQVAsQ0FFRixNQUFBLENBQ0UyNkksVUFBVXg3SSxJQUFWLENBQWlCLENBQWpCLENBQ0EsWUFBWWc3SSxJQUFMLEVBQVAsQ0FFRixNQUFBLENBQ0VRLFVBQVV4N0ksSUFBVixDQUFpQixDQUFqQixDQUNBLGNBQWNnN0ksSUFBUCxFQUFQLENBRUYsTUFBQSxDQUNFLzRJLE9BQU93UixNQUFQLENBQWdCLElBQWhCLENBQ0EsS0FBSzBuSSxNQUFMLENBQVlsaEcsTUFBWixDQUFtQmg0QyxPQUFPazVJLE1BQTFCLEVBQ0EsS0FBS2hnRyxRQUFMLENBQWNwM0IsTUFBZCxDQUFxQixLQUFLbzNCLFFBQUwsQ0FBY2wzQyxPQUFkLENBQXNCaEMsTUFBdEIsQ0FBckIsQ0FBb0QsQ0FBcEQsRUFFRixNQUFBLENBQ0EsSUFBSyxLQUFMLENBQ0UsaUJBQWlCZ0IsSUFBVixFQUFQLENBeEJKLENBMEJELENBQ0YsQ0E3Qk0sQ0E2Qkp3NEksUUE3QkksQ0E2Qk0sSUE3Qk4sQ0FBUCxDQThCRCxDQS9CRCxDQUZjLENBQWQsQ0FtQ0Esc0JBQU8sQ0FBZ0JDLEdBQWhCLENBQXFCLENBQzFCLGVBQWU3MUksS0FBUixDQUFjLElBQWQsQ0FBb0JDLFNBQXBCLENBQVAsQ0FDRCxDQUZELENBR0QsQ0F2Q00sRUF3Q1A7Ozs7OztVQTlMcUIsQ0FzTXBCLENBQ0Q1RCxJQUFLLE9BREosQ0FFRDlDLE1BQU8sY0FBQSxDQUFlNkMsTUFBZixDQUF1QixDQUM1QixjQUFjcWxCLEdBQVAsQ0FBVyxJQUFYLENBQVAsQ0FDRCxDQUpBLENBdE1vQixDQTJNcEIsQ0FDRHBsQixJQUFLLEtBREosQ0FFRDlDLE1BQU8sWUFBQSxDQUFhOEMsR0FBYixDQUFrQixDQUN2QixZQUFZMnRHLE9BQUwsQ0FBYTFwRyxHQUFiLENBQWlCakUsR0FBakIsQ0FBUCxDQUNELENBSkEsQ0EzTW9CLENBZ05wQixDQUNEQSxJQUFLLEtBREosQ0FFRDlDLE1BQU8sWUFBQSxDQUFhOEMsR0FBYixDQUFrQixDQUN2QixZQUFZMnRHLE9BQUwsQ0FBYTJxQyxHQUFiLENBQWlCdDRJLEdBQWpCLENBQVAsQ0FDRCxDQUNEOzs7VUFyTnFCLENBME5wQixDQUNEQSxJQUFLLFlBREosQ0FFRGlFLElBQUssWUFBQSxFQUFlLENBQ2xCLFlBQVkyMEksS0FBTCxDQUFXMTRJLE1BQVgsQ0FBb0IsQ0FBM0IsQ0FDRCxDQUNEOzs7O1VBL05xQixDQXFPcEIsQ0FDREYsSUFBSyxTQURKLENBRURpRSxJQUFLLFlBQUEsRUFBZSxDQUNsQixHQUFJLEtBQUt3MUksUUFBVCxDQUFtQixZQUFZQSxRQUFaLENBQ25CLHNCQUFNLENBQWlCLFdBQWpCLENBQThCLDBGQUE5QixDQUEwSCxJQUExSCxDQUFOLENBQ0QsQ0FMQSxDQU1ENW9JLElBQUssWUFBQSxDQUFhODhGLE9BQWIsQ0FBc0IsQ0FDekIsS0FBSzhyQyxRQUFMLENBQWdCOXJDLE9BQWhCLENBQ0QsQ0FDRDs7O1VBOU9xQixDQW1QcEIsQ0FDRDN0RyxJQUFLLFFBREosQ0FFRGlFLElBQUssWUFBQSxFQUFlLENBQ2xCLFlBQVl5MUksT0FBWixDQUNELENBSkEsQ0FLRDdvSSxJQUFLLFlBQUEsQ0FBYTR4QyxJQUFiLENBQW1CLENBQ3RCLEtBQUtpM0YsT0FBTCxDQUFlajNGLElBQWYsQ0FDQSxLQUFLaTNGLE9BQUwsQ0FBYXBHLFNBQWIsQ0FBeUIsSUFBekIsQ0FDQSxZQUFZb0csT0FBWixDQUNELENBVEEsQ0FuUG9CLENBQXZCLEVBK1BBOUYsU0FBUzRFLFNBQVQsQ0FBb0JELGFBQXBCLEVBRUEsZ0JBQUEsQ0FDRCxDQXZVRCxDQXVVRTlELFlBdlVGLENBRkEsQ0EyVUE5MkgsaUJBQWlCQSxpQkFBaUI2NkgsU0FBakIsQ0FBNEIsVUFBNUIsQ0FBd0MsQ0FDdkQ3RCxRQUFTLElBRDhDLENBRXZEaG5DLFFBQVMsSUFGOEMsQ0FBeEMsQ0FBakIsQ0FHSSxjQUhKLENBR29CLEVBSHBCLEVBS0E7RUFRQSxZQUFBLENBQWF4bkcsTUFBYixDQUFxQnd6SSxXQUFZLGlCQUFrQixDQUNqRCxhQUFlLzFJLFVBQVUxRCxNQUFWLENBQW1CLENBQW5CLENBQXVCaUcsTUFBdkIsQ0FBZ0N2QyxVQUFVLENBQVYsQ0FBL0MsQ0FDQSxRQUFBLENBQVVnSSxLQUFWLENBQ0EsR0FBSTlHLFVBQVVxQixNQUFWLElBQXNCeXpJLFFBQTFCLENBQW9DLGNBQWNELFdBQVAsQ0FBUCxDQUNwQyxHQUFJeDhILEtBQU81RSxZQUFZdFQsQ0FBWixDQUFja0IsTUFBZCxDQUFzQnd6SSxXQUF0QixDQUFYLENBQStDLFlBQVl4OEgsSUFBTCxDQUFXLE9BQVgsRUFDbERBLEtBQUtqZ0IsS0FENkMsQ0FFbERpZ0IsS0FBS2xaLEdBQUwsR0FBYXBGLFNBQWIsQ0FDRXNlLEtBQUtsWixHQUFMLENBQVM5SSxJQUFULENBQWN5K0ksUUFBZCxDQURGLENBRUUvNkksU0FKeUMsQ0FLL0MsR0FBSWdGLFVBQVUrSCxNQUFRUyxXQUFXbEcsTUFBWCxDQUFsQixDQUFKLENBQTJDLFdBQVd5RixLQUFKLENBQVcrdEksV0FBWCxDQUF3QkMsUUFBeEIsQ0FBUCxDQUM1QyxDQUVEL3NJLFFBQVFBLFFBQVFySSxDQUFoQixDQUFtQixTQUFuQixDQUE4QixDQUFFUCxJQUFLQSxHQUFQLENBQTlCLEVBRUEsVUFBWVQsTUFBTTJ1SSxPQUFOLENBQWNsdUksR0FBMUIsQ0FFQSxVQUFZNDFJLEtBQVosQ0FFQSx5QkFBQSxDQUF3Qjk1SSxNQUF4QixDQUFnQys1SSxRQUFoQyxDQUEwQyxDQUN4QyxNQUFPLENBQUN0Z0osT0FBT0MsU0FBUCxDQUFpQkUsY0FBakIsQ0FBZ0N3QixJQUFoQyxDQUFxQzRFLE1BQXJDLENBQTZDKzVJLFFBQTdDLENBQVIsQ0FBZ0UsQ0FDOUQvNUksT0FBU296SSxpQkFBaUJwekksTUFBakIsQ0FBVCxDQUNBLEdBQUlBLFNBQVcsSUFBZixDQUFxQixNQUN0QixDQUVELGFBQUEsQ0FDRCxDQUVELGtCQUFvQmc2SSxnQkFBcEIsQ0FFQSxVQUFZemdKLHFCQUFxQixTQUFVRixNQUFWLENBQWtCLENBQ25ELGdCQUFBLENBQWMrTSxNQUFkLENBQXNCMnpJLFFBQXRCLENBQWdDRixRQUFoQyxDQUEwQyxDQUN4QyxHQUFJLGNBQUEsR0FBbUIsV0FBbkIsRUFBa0NJLEtBQXRDLENBQTZDLENBQzNDNWdKLE9BQU9DLE9BQVAsQ0FBaUI0Z0osUUFBT0QsS0FBeEIsQ0FDRCxDQUZELElBRU8sQ0FDTDVnSixPQUFPQyxPQUFQLENBQWlCNGdKLFFBQU8sZ0JBQUEsQ0FBYzl6SSxNQUFkLENBQXNCMnpJLFFBQXRCLENBQWdDRixRQUFoQyxDQUEwQyxDQUNoRSxTQUFXTSxjQUFjL3pJLE1BQWQsQ0FBc0IyekksUUFBdEIsQ0FBWCxDQUNBLEdBQUksQ0FBQ3Z2QyxJQUFMLENBQVcsT0FFWCxTQUFXNHZDLDJCQUEyQjV2QyxJQUEzQixDQUFpQ3V2QyxRQUFqQyxDQUFYLENBRUEsR0FBSTM4SCxLQUFLbFosR0FBVCxDQUFjLENBQ1osWUFBWUEsR0FBTCxDQUFTOUksSUFBVCxDQUFjeStJLFFBQWQsQ0FBUCxDQUNELENBRUQsWUFBWTE4SSxLQUFaLENBQ0QsQ0FYRCxDQVlELENBRUQsZUFBWWlKLE1BQUwsQ0FBYTJ6SSxRQUFiLENBQXVCRixVQUFZenpJLE1BQW5DLENBQVAsQ0FDRCxDQUVEL00sT0FBT0MsT0FBUCxDQUFpQjRnSixPQUFqQixDQUNDLENBdkJXLENBQVosQ0F5QkEsbUJBQUEsRUFBc0IsQ0FDcEIsSUFBSyxTQUFXcjJJLFVBQVUxRCxNQUFyQixDQUE2Qms2SSxRQUFVLFNBQUEsQ0FBVXg2SCxJQUFWLENBQXZDLENBQXdEQyxLQUFPLENBQXBFLENBQXVFQSxLQUFPRCxJQUE5RSxDQUFvRkMsTUFBcEYsQ0FBNEYsQ0FDMUZ1NkgsUUFBUXY2SCxJQUFSLEVBQWdCamMsVUFBVWljLElBQVYsQ0FBaEIsQ0FDRCxDQUVELGdCQUFpQjFaLE1BQVYsQ0FBa0IsQ0FDdkIsSUFBSyxNQUFRLENBQWIsQ0FBZ0I1RixFQUFJNjVJLFFBQVFsNkksTUFBNUIsQ0FBb0NLLEdBQXBDLENBQXlDLENBQ3ZDLFdBQWE2NUksUUFBUTc1SSxDQUFSLENBQWIsQ0FFQSxJQUFLLE1BQVEsQ0FBYixDQUFnQjhiLEVBQUlnK0gsT0FBT25xRyxHQUFQLENBQVdod0MsTUFBL0IsQ0FBdUNtYyxHQUF2QyxDQUE0QyxDQUMxQyxjQUFnQmcrSCxPQUFPbnFHLEdBQVAsQ0FBVzd6QixDQUFYLENBQWhCLENBQ0E3aUIsT0FBT3dLLGNBQVAsQ0FBc0JtQyxPQUFPMU0sU0FBN0IsQ0FBd0N1dUIsU0FBeEMsQ0FBbUQsQ0FDakQvakIsSUFBS28ySSxPQUFPQyxNQUFQLENBQWN0eUgsU0FBZCxDQUQ0QyxDQUVqRG5YLElBQUt3cEksT0FBT3YrSCxNQUFQLENBQWNrTSxTQUFkLENBRjRDLENBR2pENWlCLGFBQWNpMUksT0FBT2oxSSxZQUg0QixDQUlqREQsV0FBWWsxSSxPQUFPbDFJLFVBSjhCLENBQW5ELEVBTUQsQ0FDRixDQUNGLENBZEQsQ0FlRCxDQUNELGFBQUEsRUFBZ0IsQ0FDZCxJQUFLLFVBQVl2QixVQUFVMUQsTUFBdEIsQ0FBOEJnd0MsSUFBTSxTQUFBLENBQVVxcUcsS0FBVixDQUFwQyxDQUFzREMsTUFBUSxDQUFuRSxDQUFzRUEsTUFBUUQsS0FBOUUsQ0FBcUZDLE9BQXJGLENBQThGLENBQzVGdHFHLElBQUlzcUcsS0FBSixFQUFhNTJJLFVBQVU0MkksS0FBVixDQUFiLENBQ0QsQ0FFRCxPQUFPLENBQ0x0cUcsSUFBS0EsR0FEQSxDQUVMb3FHLE9BQVEsZUFBQSxDQUFnQi85SSxJQUFoQixDQUFzQixDQUM1QixpQkFBbUIsQ0FDakIsWUFBWTA4SSxNQUFMLENBQVkxOEksSUFBWixDQUFQLENBQ0QsQ0FGRCxDQUdELENBTkksQ0FPTHVmLE9BQVEsZUFBQSxDQUFnQnZmLElBQWhCLENBQXNCLENBQzVCLGdCQUFpQlcsS0FBVixDQUFpQixDQUN0QixLQUFLKzdJLE1BQUwsQ0FBWTE4SSxJQUFaLEVBQWtCNG9CLElBQWxCLENBQXVCam9CLEtBQXZCLEVBQ0QsQ0FGRCxDQUdELENBWEksQ0FZTGtJLGFBQWMsSUFaVCxDQWFMRCxXQUFZLElBYlAsQ0FBUCxDQWVELENBQ0QsZUFBQSxFQUFrQixDQUNoQixJQUFLLFVBQVl2QixVQUFVMUQsTUFBdEIsQ0FBOEJnd0MsSUFBTSxTQUFBLENBQVV1cUcsS0FBVixDQUFwQyxDQUFzREMsTUFBUSxDQUFuRSxDQUFzRUEsTUFBUUQsS0FBOUUsQ0FBcUZDLE9BQXJGLENBQThGLENBQzVGeHFHLElBQUl3cUcsS0FBSixFQUFhOTJJLFVBQVU4MkksS0FBVixDQUFiLENBQ0QsQ0FFRCxPQUFPLENBQ0x4cUcsSUFBS0EsR0FEQSxDQUVMb3FHLE9BQVEsZUFBQSxDQUFnQi85SSxJQUFoQixDQUFzQixDQUM1QixpQkFBbUIsQ0FDakIsWUFBWTA4SSxNQUFMLENBQVkxOEksSUFBWixDQUFQLENBQ0QsQ0FGRCxDQUdELENBTkksQ0FPTHVmLE9BQVEsZUFBQSxDQUFnQnZmLElBQWhCLENBQXNCLENBQzVCLGdCQUFpQlcsS0FBVixDQUFpQixDQUN0QixLQUFLKzdJLE1BQUwsQ0FBWTE4SSxJQUFaLEVBQW9CVyxLQUFwQixDQUNELENBRkQsQ0FHRCxDQVhJLENBWUxrSSxhQUFjLElBWlQsQ0FhTEQsV0FBWSxJQWJQLENBQVAsQ0FlRCxDQUVELFFBQUEsQ0FBVXcxSSxNQUFWLENBQ0E7Ozs7Ozs7S0FTQUMsZUFBaUJDLEtBQU9oNkcsV0FBVzFiLEtBQUssVUFBTCxDQUFpQixVQUFqQixDQUE2QixZQUE3QixDQUEyQyxPQUEzQyxDQUFYLENBQWdFMjFILE9BQU8sVUFBUCxDQUFtQixVQUFuQixDQUFoRSxDQUFQLENBQXdHRCxLQUFLRixvQkFFOUgsU0FBVUksVUFBVixDQUFzQixDQUNwQnJHLFlBQVlrRyxhQUFaLENBQTJCLElBQTNCLENBQWlDLENBQUMsQ0FDaEM1NkksSUFBSyxRQUQyQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBb0NoQzlDLE1BQU8sZUFBQSxDQUFnQjg5SSxJQUFoQixDQUFzQixDQUMzQixnQkFBa0JwM0ksVUFBVTFELE1BQVYsQ0FBbUIsQ0FBbkIsRUFBd0IwRCxVQUFVLENBQVYsSUFBaUIvRSxTQUF6QyxDQUFxRCtFLFVBQVUsQ0FBVixDQUFyRCxDQUFvRXl3RCxJQUF0RixDQUNBLG9CQUVFLFNBQVU0bUYsY0FBVixDQUEwQixDQUN4QixnQkFBQSxFQUFtQixDQUNqQjFILGVBQWUsSUFBZixDQUFxQjJILE9BQXJCLEVBRUEsaUNBQWlDLElBQTFCLENBQWdDL0gsaUJBQWlCK0gsT0FBakIsRUFBMEJ2M0ksS0FBMUIsQ0FBZ0MsSUFBaEMsQ0FBc0NDLFNBQXRDLENBQWhDLENBQVAsQ0FDRCxDQUVEOHdJLFlBQVl3RyxPQUFaLENBQXFCLENBQUMsQ0FDcEJsN0ksSUFBSyxPQURlLENBRXBCOUMsTUFBTyxjQUFBLEVBQWlCLENBQ3RCLFdBQWEwRyxVQUFVMUQsTUFBVixDQUFtQixDQUFuQixFQUF3QjBELFVBQVUsQ0FBVixJQUFpQi9FLFNBQXpDLENBQXFEK0UsVUFBVSxDQUFWLENBQXJELENBQW9FLEtBQUswMUYsTUFBdEYsQ0FFQSxzQkFBd0IsS0FBS3U3QyxXQUFMLENBQWlCLENBQ3ZDcjBHLFNBQVV3NkcsSUFENkIsQ0FFdkN4K0YsU0FBVTg4QyxPQUFPOThDLFFBRnNCLENBQWpCLENBQXhCLENBSUloYyxTQUFXMjZHLGtCQUFrQjM2RyxRQUpqQyxDQUtJZ2MsU0FBVzIrRixrQkFBa0IzK0YsUUFMakMsQ0FPQSxZQUFZcTRGLFdBQUwsQ0FBaUIsQ0FDdEJweUYsS0FBTSxlQUFBLENBQWdCamlCLFFBQWhCLENBQTBCZ2MsUUFBMUIsQ0FEZ0IsQ0FBakIsRUFFSmlHLElBRkgsQ0FHRCxDQWZtQixDQUFELENBQXJCLEVBa0JBbXhGLFNBQVNzSCxPQUFULENBQWtCRCxjQUFsQixFQUVBLGNBQUEsQ0FDRCxDQTVCRCxDQTRCRUwsYUE1QkYsQ0FGRixFQWdDRCxDQXRFK0IsQ0FBRCxDQXVFOUIsQ0FDRDU2SSxJQUFLLFFBREosQ0FFRDlDLE1BQU8sZUFBQSxDQUFnQjg5SSxJQUFoQixDQUFzQjFoRCxNQUF0QixDQUE4QnY5RixXQUE5QixDQUEyQyxDQUNoRCxXQUFZNitJLGNBQWNRLE1BQWQsQ0FBcUJKLElBQXJCLENBQTJCai9JLFdBQTNCLENBQUwsRUFBOEN1OUYsTUFBOUMsQ0FBUCxDQUNELENBSkEsQ0F2RThCLENBNEU5QixDQUNEdDVGLElBQUssTUFESixDQUVEOUMsTUFBTyxhQUFBLENBQWN1bEQsSUFBZCxDQUFvQixDQUN6QixXQUFhNytDLFVBQVUxRCxNQUFWLENBQW1CLENBQW5CLEVBQXdCMEQsVUFBVSxDQUFWLElBQWlCL0UsU0FBekMsQ0FBcUQrRSxVQUFVLENBQVYsQ0FBckQsQ0FBb0UsRUFBakYsQ0FDQTAxRixPQUFPK2hELEtBQVAsQ0FBZSxLQUFmLENBQ0EsY0FBZ0IsaUJBQUEsQ0FBa0IvaEQsTUFBbEIsQ0FBaEIsQ0FDQWc2QyxVQUFVMkYsTUFBVixDQUFtQngyRixJQUFuQixDQUNBNndGLFVBQVV2NEksSUFBVixHQUNBLGdCQUFBLENBQ0QsQ0FUQSxDQTVFOEIsQ0FBakMsRUF3RkEsc0JBQUEsQ0FBdUJ1K0YsTUFBdkIsQ0FBK0IsQ0FDN0IsU0FBQSxDQUVBLGFBQWUxMUYsVUFBVTFELE1BQVYsQ0FBbUIsQ0FBbkIsRUFBd0IwRCxVQUFVLENBQVYsSUFBaUIvRSxTQUF6QyxDQUFxRCtFLFVBQVUsQ0FBVixDQUFyRCxDQUFvRWczSSxjQUFjbkMsUUFBakcsQ0FDQSxpQkFBbUI3MEksVUFBVTFELE1BQVYsQ0FBbUIsQ0FBbkIsRUFBd0IwRCxVQUFVLENBQVYsSUFBaUIvRSxTQUF6QyxDQUFxRCtFLFVBQVUsQ0FBVixDQUFyRCxDQUFvRWczSSxjQUFjbDZILFlBQXJHLENBRUE2eUgsZUFBZSxJQUFmLENBQXFCcUgsYUFBckIsRUFFQXB1RCxNQUFRaW5ELDBCQUEwQixJQUExQixDQUFnQ04saUJBQWlCeUgsYUFBakIsRUFBZ0N6L0ksSUFBaEMsQ0FBcUMsSUFBckMsQ0FBMkNtK0YsTUFBM0MsQ0FBbURtL0MsUUFBbkQsQ0FBNkQvM0gsWUFBN0QsQ0FBaEMsQ0FBUixDQUVBLEdBQUk4ckUsTUFBTThNLE1BQU4sQ0FBYStoRCxLQUFqQixDQUF3QixDQUN0QixVQUFZN3VELE1BQU02dUQsS0FBTixDQUFZN3VELE1BQU04TSxNQUFsQixDQUFaLENBRUEsR0FBSSxDQUFDK2hELEtBQUwsQ0FBWSxDQUNWLDRCQUFNLENBQXVCLGVBQXZCLENBQXdDLDJGQUF4QyxDQUFxSTNDLHNCQUFzQkEsc0JBQXNCbHNELEtBQXRCLENBQXRCLENBQXJJLENBQU4sQ0FDRCxDQUVELEdBQUk2dUQsd0JBQUosQ0FBOEIsQ0FDNUI3dUQsTUFBTXNzRCxJQUFOLENBQVd1QyxLQUFYLEVBRUE3dUQsTUFBTXNzRCxJQUFOLENBQVcsV0FBQSxDQUFZLFNBQVVqOEksT0FBVixDQUFtQixDQUN4Q3crSSxNQUFNbCtJLElBQU4sQ0FBVyxTQUFVODdJLE1BQVYsQ0FBa0IsQ0FDM0J6c0QsTUFBTXlzRCxNQUFOLENBQWVBLE1BQWYsQ0FFQXpzRCxNQUFNenhGLElBQU4sR0FBYW9DLElBQWIsQ0FBa0JOLE9BQWxCLEVBQ0QsQ0FKRCxFQUtELENBTlUsQ0FBWCxFQU9ELENBVkQsSUFVTyxDQUNMMnZGLE1BQU15c0QsTUFBTixDQUFlb0MsS0FBZixDQUVBN3VELE1BQU1zc0QsSUFBTixDQUFXdHNELE1BQU16eEYsSUFBTixFQUFYLEVBQ0QsQ0FDRixDQUVEeXhGLE1BQU04dUQsWUFBTixDQUFtQixlQUFuQixFQUVBLFlBQUEsQ0FDRCxDQUFDO0VBRUY7Ozs7O09BUUE1RyxZQUFZa0csYUFBWixDQUEyQixDQUFDLENBQzFCNTZJLElBQUssT0FEcUIsQ0FFMUI5QyxNQUFPLGNBQUEsRUFBaUIsQ0FDdEIsNEJBQU0sQ0FBdUIsZUFBdkIsQ0FBd0MsMENBQXhDLENBQW9GLElBQXBGLENBQU4sQ0FDRCxDQUNEOzs7Ozs7VUFMeUIsQ0FheEIsQ0FDRDhDLElBQUssTUFESixDQUVEOUMsTUFBTyxhQUFBLEVBQWdCLENBQ3JCLFdBQWEsSUFBYixDQUVBLGtCQUFPLENBQVksU0FBVUwsT0FBVixDQUFtQjtFQUVwQztFQUNBLGtCQUFvQnEzSSxPQUFPNTZDLE1BQTNCLENBQ0lub0UsU0FBV29xSCxjQUFjcHFILFFBRDdCLENBRUkwSSxTQUFXMGhILGNBQWMxaEgsUUFGN0IsQ0FHSTNKLE1BQVFxckgsY0FBY3JySCxLQUgxQixDQUlJNGlCLE9BQVN5b0csY0FBY3pvRyxNQUozQixDQU1Bb2hHLE9BQU8vaUgsUUFBUCxDQUFnQnRnQixHQUFoQixDQUFvQnNnQixTQUFTcmUsQ0FBN0IsQ0FBZ0NxZSxTQUFTN04sQ0FBekMsQ0FBNEM2TixTQUFTaEgsQ0FBckQsRUFFQStwSCxPQUFPcjZHLFFBQVAsQ0FBZ0JocEIsR0FBaEIsQ0FBb0JncEIsU0FBUy9tQixDQUE3QixDQUFnQyttQixTQUFTdlcsQ0FBekMsQ0FBNEN1VyxTQUFTMVAsQ0FBckQsRUFFQStwSCxPQUFPaGtILEtBQVAsQ0FBYXJmLEdBQWIsQ0FBaUJxZixNQUFNcGQsQ0FBdkIsQ0FBMEJvZCxNQUFNNU0sQ0FBaEMsQ0FBbUM0TSxNQUFNL0YsQ0FBekMsRUFFQStwSCxPQUFPK0UsTUFBUCxDQUFjdi9GLFVBQWQsQ0FBMkI1RyxPQUFPMG9HLElBQWxDLENBQ0F0SCxPQUFPK0UsTUFBUCxDQUFjdC9GLGFBQWQsQ0FBOEI3RyxPQUFPMm9HLE9BQXJDLENBRUF2SCxPQUFPVyxXQUFQLENBQW1CLENBQ2pCNkcsT0FBUSxDQURTLENBQW5CLEVBSUE3K0ksUUFBUXEzSSxNQUFSLEVBQWlCO0VBQ2xCLENBdkJNLENBQVAsQ0F3QkQsQ0FBQztFQUVGOzs7Ozs7VUE1Q3lCLENBb0R4QixDQUNEbDBJLElBQUssTUFESixDQUVEOUMsTUFBTyxnQkFBQSxDQUFpQnFJLE1BQWpCLENBQXlCLENBQzlCLFdBQWEsSUFBYixDQUVBLGFBQWE0dEksaUJBQWlCeUgsY0FBY25oSixTQUEvQixDQUFOLENBQWlELE1BQWpELENBQXlELElBQXpELEVBQStEMEIsSUFBL0QsQ0FBb0UsSUFBcEUsQ0FBMEVvSyxNQUExRSxDQUFrRixVQUFZLENBQ25HK3VJLE9BQU9uakgsUUFBUCxDQUFnQmhNLElBQWhCLENBQXFCNWYsT0FBTzRyQixRQUE1QixFQUVBbWpILE9BQU96NkcsUUFBUCxDQUFnQjFVLElBQWhCLENBQXFCNWYsT0FBT3MwQixRQUE1QixFQUVBeTZHLE9BQU9sakgsVUFBUCxDQUFrQmpNLElBQWxCLENBQXVCNWYsT0FBTzZyQixVQUE5QixFQUNELENBTk0sQ0FBUCxDQU9ELENBQ0Q7Ozs7OztVQWpFeUIsQ0F5RXhCLENBQ0RweEIsSUFBSyxPQURKLENBRUQ5QyxNQUFPLGNBQUEsQ0FBZXNqQyxRQUFmLENBQXlCZ2MsUUFBekIsQ0FBbUMsQ0FDeEMsU0FBVyxTQUFTemdELFdBQVQsQ0FBcUIsQ0FDOUJzL0ksTUFBTyxLQUR1QixDQUFyQixFQUVSbDJILElBRlEsQ0FFSCxJQUZHLENBQVgsQ0FHQSxHQUFJcWIsUUFBSixDQUFjbzRGLEtBQUtwNEYsUUFBTCxDQUFnQm80RixLQUFLcDRGLFFBQUwsQ0FBY3RiLEtBQWQsRUFBaEIsQ0FDZCxHQUFJczNCLFFBQUosQ0FBY284RSxLQUFLcDhFLFFBQUwsQ0FBZ0JvOEUsS0FBS3A4RSxRQUFMLENBQWN0M0IsS0FBZCxFQUFoQixDQUNkLFdBQUEsQ0FDRCxDQVRBLENBekV3QixDQUEzQixFQXFGQTB1SCxTQUFTZ0gsYUFBVCxDQUF3QkcsVUFBeEIsRUFFQSxvQkFBQSxDQUNELENBaE9ELENBZ09FdkMsU0FoT0YsQ0FGeUgsR0FrT3hHbUMsTUFsT2pCLENBVEEsQ0E2T0FoOUgsaUJBQWlCQSxpQkFBaUJpOUgsYUFBakIsQ0FBZ0MsVUFBaEMsQ0FBNEM1QixhQUFhLEVBQWIsQ0FBaUJSLFVBQVVDLFFBQTNCLENBQXFDLENBQ2hHNEMsTUFBTyxJQUR5RixDQUVoRzc2RyxTQUFVLEVBRnNGLENBR2hHZ2MsU0FBVSxLQUhzRixDQUloRzFKLE9BQVEsQ0FDTjBvRyxLQUFNLElBREEsQ0FFTkMsUUFBUyxJQUZILENBSndGLENBUWhHdHFILFNBQVUsQ0FDUnJlLEVBQUcsQ0FESyxDQUVSd1EsRUFBRyxDQUZLLENBR1I2RyxFQUFHLENBSEssQ0FSc0YsQ0FhaEcwUCxTQUFVLENBQ1IvbUIsRUFBRyxDQURLLENBRVJ3USxFQUFHLENBRkssQ0FHUjZHLEVBQUcsQ0FISyxDQWJzRixDQWtCaEcrRixNQUFPLENBQ0xwZCxFQUFHLENBREUsQ0FFTHdRLEVBQUcsQ0FGRSxDQUdMNkcsRUFBRyxDQUhFLENBbEJ5RixDQUFyQyxDQUE1QyxDQUFqQixDQXVCSyxjQXZCTCxDQXVCcUIsQ0FDbkJnSCxTQUFVLENBQUMsR0FBRCxDQUFNLEdBQU4sQ0FBVyxHQUFYLENBRFMsQ0FFbkIwSSxTQUFVLENBQUMsR0FBRCxDQUFNLEdBQU4sQ0FBVyxHQUFYLENBRlMsQ0FHbkIzSixNQUFPLENBQUMsR0FBRCxDQUFNLEdBQU4sQ0FBVyxHQUFYLENBSFksQ0F2QnJCLEVBNkJBLFVBQUEsQ0FBWXlySCxRQUFaLENBQ0E7Ozs7Ozs7S0FTQUMsZ0JBQWtCQyxPQUFTaDdHLFdBQVcxYixLQUFLLFVBQUwsQ0FBaUIsVUFBakIsQ0FBNkIsWUFBN0IsQ0FBMkMsUUFBM0MsQ0FBWCxDQUFULENBQTJFMDJILE9BQU9GLHNCQUVwRyxTQUFVWixVQUFWLENBQXNCLENBQ3BCckcsWUFBWWtILGNBQVosQ0FBNEIsSUFBNUIsQ0FBa0MsQ0FBQyxDQUNqQzU3SSxJQUFLLE1BRDRCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O1NBaURqQzlDLE1BQU8sYUFBQSxDQUFjcXVFLEtBQWQsQ0FBcUIsQ0FDMUIsV0FBYTNuRSxVQUFVMUQsTUFBVixDQUFtQixDQUFuQixFQUF3QjBELFVBQVUsQ0FBVixJQUFpQi9FLFNBQXpDLENBQXFEK0UsVUFBVSxDQUFWLENBQXJELENBQW9FLEVBQWpGLENBQ0EsZUFBaUJBLFVBQVUxRCxNQUFWLENBQW1CLENBQW5CLEVBQXdCMEQsVUFBVSxDQUFWLElBQWlCL0UsU0FBekMsQ0FBcUQrRSxVQUFVLENBQVYsQ0FBckQsQ0FBb0UsSUFBckYsQ0FDQTAxRixPQUFPK2hELEtBQVAsQ0FBZSxLQUFmLENBQ0EsY0FBZ0Isa0JBQUEsQ0FBbUIvaEQsTUFBbkIsQ0FBaEIsQ0FDQWc2QyxVQUFVMkYsTUFBVixDQUFtQjF0RSxLQUFuQixDQUNBK25FLFVBQVV2NEksSUFBVixHQUNBLEdBQUkrZ0osVUFBSixDQUFnQnhJLFVBQVV3SSxVQUFWLEdBQ2hCLGdCQUFBLENBQ0QsQ0ExRGdDLENBQUQsQ0FBbEMsRUE2REEsdUJBQUEsQ0FBd0J4aUQsTUFBeEIsQ0FBZ0MsQ0FDOUIsU0FBQSxDQUVBLGFBQWUxMUYsVUFBVTFELE1BQVYsQ0FBbUIsQ0FBbkIsRUFBd0IwRCxVQUFVLENBQVYsSUFBaUIvRSxTQUF6QyxDQUFxRCtFLFVBQVUsQ0FBVixDQUFyRCxDQUFvRWc0SSxlQUFlbkQsUUFBbEcsQ0FDQSxpQkFBbUI3MEksVUFBVTFELE1BQVYsQ0FBbUIsQ0FBbkIsRUFBd0IwRCxVQUFVLENBQVYsSUFBaUIvRSxTQUF6QyxDQUFxRCtFLFVBQVUsQ0FBVixDQUFyRCxDQUFvRWc0SSxlQUFlbDdILFlBQXRHLENBRUE2eUgsZUFBZSxJQUFmLENBQXFCcUksY0FBckIsRUFFQXB2RCxNQUFRaW5ELDBCQUEwQixJQUExQixDQUFnQ04saUJBQWlCeUksY0FBakIsRUFBaUN6Z0osSUFBakMsQ0FBc0MsSUFBdEMsQ0FBNENtK0YsTUFBNUMsQ0FBb0RtL0MsUUFBcEQsQ0FBOEQvM0gsWUFBOUQsQ0FBaEMsQ0FBUixDQUVBLEdBQUk4ckUsTUFBTThNLE1BQU4sQ0FBYStoRCxLQUFqQixDQUF3QixDQUN0QixVQUFZN3VELE1BQU02dUQsS0FBTixDQUFZN3VELE1BQU04TSxNQUFsQixDQUFaLENBRUEsR0FBSSxDQUFDK2hELEtBQUwsQ0FBWSxDQUNWLDRCQUFNLENBQXVCLGdCQUF2QixDQUF5QywyRkFBekMsQ0FBc0kzQyxzQkFBc0JBLHNCQUFzQmxzRCxLQUF0QixDQUF0QixDQUF0SSxDQUFOLENBQ0QsQ0FFRCxHQUFJNnVELHdCQUFKLENBQThCLENBQzVCQSxNQUFNbCtJLElBQU4sQ0FBVyxTQUFVODdJLE1BQVYsQ0FBa0IsQ0FDM0J6c0QsTUFBTXlzRCxNQUFOLENBQWVBLE1BQWYsQ0FDRCxDQUZELEVBR0QsQ0FKRCxXQUlhQSxNQUFOLENBQWVvQyxLQUFmLENBRVA3dUQsTUFBTXNzRCxJQUFOLENBQVd0c0QsTUFBTXp4RixJQUFOLEVBQVgsRUFDRCxDQUVEeXhGLE1BQU04dUQsWUFBTixDQUFtQixlQUFuQixFQUVBLFlBQUEsQ0FDRCxDQUFDO0VBRUY7Ozs7OztPQVNBNUcsWUFBWWtILGNBQVosQ0FBNEIsQ0FBQyxDQUMzQjU3SSxJQUFLLE9BRHNCLENBRTNCOUMsTUFBTyxjQUFBLEVBQWlCLENBQ3RCLDRCQUFNLENBQXVCLGVBQXZCLENBQXdDLDBDQUF4QyxDQUFvRixJQUFwRixDQUFOLENBQ0QsQ0FDRDs7Ozs7O1VBTDBCLENBYXpCLENBQ0Q4QyxJQUFLLE1BREosQ0FFRDlDLE1BQU8sYUFBQSxFQUFnQixDQUNyQixXQUFhLElBQWIsQ0FFQSxrQkFBTyxDQUFZLFNBQVVMLE9BQVYsQ0FBbUIsQ0FDcENxM0ksT0FBT2xrSSxLQUFQLENBQWEsVUFBWSxDQUN2QixrQkFBb0Jra0ksT0FBTzU2QyxNQUEzQixDQUNJbm9FLFNBQVdvcUgsY0FBY3BxSCxRQUQ3QixDQUVJMEksU0FBVzBoSCxjQUFjMWhILFFBRjdCLENBSUFxNkcsT0FBTy9pSCxRQUFQLENBQWdCdGdCLEdBQWhCLENBQW9Cc2dCLFNBQVNyZSxDQUE3QixDQUFnQ3FlLFNBQVM3TixDQUF6QyxDQUE0QzZOLFNBQVNoSCxDQUFyRCxFQUVBK3BILE9BQU9yNkcsUUFBUCxDQUFnQmhwQixHQUFoQixDQUFvQmdwQixTQUFTL21CLENBQTdCLENBQWdDK21CLFNBQVN2VyxDQUF6QyxDQUE0Q3VXLFNBQVMxUCxDQUFyRCxFQUVBK3BILE9BQU9XLFdBQVAsQ0FBbUIsQ0FDakI2RyxPQUFRLENBRFMsQ0FBbkIsRUFJQTcrSSxRQUFRcTNJLE1BQVIsRUFDRCxDQWRELEVBZUQsQ0FoQk0sQ0FBUCxDQWlCRCxDQUNEOzs7OztVQXBDMEIsQ0EyQ3pCLENBQ0RsMEksSUFBSyxZQURKLENBRUQ5QyxNQUFPLG1CQUFBLEVBQXNCLENBQzNCLFdBQWEsS0FBSys3SSxNQUFsQixDQUNJbm1HLE9BQVMsS0FBS3dtRCxNQUFMLENBQVl4bUQsTUFEekIsQ0FFQW1tRyxPQUFPdi9GLFVBQVAsQ0FBb0I1RyxPQUFPMG9HLElBQTNCLENBQ0F2QyxPQUFPbm1HLE1BQVAsQ0FBY2s1QixPQUFkLENBQXNCMXZDLEtBQXRCLENBQThCd1csT0FBT2s1QixPQUFQLENBQWUxdkMsS0FBN0MsQ0FDQTI4RyxPQUFPbm1HLE1BQVAsQ0FBY2s1QixPQUFkLENBQXNCenZDLE1BQXRCLENBQStCdVcsT0FBT2s1QixPQUFQLENBQWV6dkMsTUFBOUMsQ0FDQTA4RyxPQUFPbm1HLE1BQVAsQ0FBY2k1QixJQUFkLENBQXFCajVCLE9BQU9pNUIsSUFBNUIsQ0FDQWt0RSxPQUFPbm1HLE1BQVAsQ0FBYzdaLE1BQWQsQ0FBdUI2WixPQUFPN1osTUFBOUIsQ0FDQSxpQkFBbUJnZ0gsT0FBT25tRyxNQUFQLENBQWNuYixNQUFqQyxDQUNBLFdBQWFtYixPQUFPbmIsTUFBcEIsQ0FDQTIzQyxhQUFhbDlDLElBQWIsQ0FBb0J1RixPQUFPdkYsSUFBM0IsQ0FDQWs5QyxhQUFhajlDLEdBQWIsQ0FBbUJzRixPQUFPdEYsR0FBMUIsQ0FDQWk5QyxhQUFhaVcsR0FBYixDQUFtQjV0RCxPQUFPNHRELEdBQTFCLENBQ0FqVyxhQUFhdDlDLElBQWIsQ0FBb0IyRixPQUFPM0YsSUFBM0IsQ0FDQXM5QyxhQUFhcjlDLEtBQWIsQ0FBcUIwRixPQUFPMUYsS0FBNUIsQ0FDQXE5QyxhQUFhcDlDLEdBQWIsQ0FBbUJ5RixPQUFPekYsR0FBMUIsQ0FDQW85QyxhQUFhbjlDLE1BQWIsQ0FBc0J3RixPQUFPeEYsTUFBN0IsQ0FDRCxDQUFDO0VBRUY7Ozs7OztVQWhFMEIsQ0F3RXpCLENBQ0RueUIsSUFBSyxNQURKLENBRUQ5QyxNQUFPLGdCQUFBLENBQWlCcUksTUFBakIsQ0FBeUIsQ0FDOUIsV0FBYSxJQUFiLENBRUEsYUFBYTR0SSxpQkFBaUJ5SSxlQUFlbmlKLFNBQWhDLENBQU4sQ0FBa0QsTUFBbEQsQ0FBMEQsSUFBMUQsRUFBZ0UwQixJQUFoRSxDQUFxRSxJQUFyRSxDQUEyRW9LLE1BQTNFLENBQW1GLFVBQVksQ0FDcEcsR0FBSSt1SSxPQUFPbnVJLE1BQVgsQ0FBbUJtdUksT0FBT251SSxNQUFQLENBQWNnZixJQUFkLENBQW1CNWYsT0FBT1ksTUFBUCxFQUFuQixFQUVuQm11SSxPQUFPbmpILFFBQVAsQ0FBZ0JoTSxJQUFoQixDQUFxQjVmLE9BQU80ckIsUUFBNUIsRUFFQW1qSCxPQUFPejZHLFFBQVAsQ0FBZ0IxVSxJQUFoQixDQUFxQjVmLE9BQU9zMEIsUUFBNUIsRUFFQXk2RyxPQUFPbGpILFVBQVAsQ0FBa0JqTSxJQUFsQixDQUF1QjVmLE9BQU82ckIsVUFBOUIsRUFDRCxDQVJNLENBQVAsQ0FTRCxDQUNEOzs7Ozs7VUF2RjBCLENBK0Z6QixDQUNEcHhCLElBQUssT0FESixDQUVEOUMsTUFBTyxjQUFBLEVBQWlCLENBQ3RCLGdCQUFnQm5CLFdBQVQsQ0FBcUIsQ0FDMUJzL0ksTUFBTyxLQURtQixDQUFyQixFQUVKbDJILElBRkksQ0FFQyxJQUZELENBQVAsQ0FHRCxDQU5BLENBL0Z5QixDQUE1QixFQXdHQXl1SCxTQUFTZ0ksY0FBVCxDQUF5QmIsVUFBekIsRUFFQSxxQkFBQSxDQUNELENBak5ELENBaU5FdkMsU0FqTkYsQ0FGNkYsR0FtTjVFbUQsUUFuTmpCLENBVEEsQ0E4TkFoK0gsaUJBQWlCQSxpQkFBaUJpK0gsY0FBakIsQ0FBaUMsVUFBakMsQ0FBNkM1QyxhQUFhLEVBQWIsQ0FBaUJSLFVBQVVDLFFBQTNCLENBQXFDLENBQ2pHNEMsTUFBTyxJQUQwRixDQUVqR3ZvRyxPQUFRLENBQ04wb0csS0FBTSxJQURBLENBRU56dkUsS0FBTSxDQUZBLENBR045eUMsT0FBUSxDQUhGLENBSU4reUMsUUFBUyxDQUNQMXZDLE1BQU8sSUFEQSxDQUVQQyxPQUFRLElBRkQsQ0FKSCxDQVFONUUsT0FBUSxDQUNOdkYsS0FBTSxJQURBLENBRU5DLElBQUssR0FGQyxDQUdOa3pELElBQUssRUFIQyxDQUlOcnpELElBQUssR0FKQyxDQUtOQyxPQUFRLENBQUMsR0FMSCxDQU1OSCxLQUFNLENBQUMsR0FORCxDQU9OQyxNQUFPLEdBUEQsQ0FSRixDQUZ5RixDQW9CakdkLFNBQVUsQ0FDUnJlLEVBQUcsQ0FESyxDQUVSd1EsRUFBRyxDQUZLLENBR1I2RyxFQUFHLENBSEssQ0FwQnVGLENBeUJqRzBQLFNBQVUsQ0FDUi9tQixFQUFHLENBREssQ0FFUndRLEVBQUcsQ0FGSyxDQUdSNkcsRUFBRyxDQUhLLENBekJ1RixDQUFyQyxDQUE3QyxDQUFqQixDQThCSyxjQTlCTCxDQThCcUIsQ0FDbkJnSCxTQUFVLENBQUMsR0FBRCxDQUFNLEdBQU4sQ0FBVyxHQUFYLENBRFMsQ0FFbkIwSSxTQUFVLENBQUMsR0FBRCxDQUFNLEdBQU4sQ0FBVyxHQUFYLENBRlMsQ0E5QnJCLEVBbUNBLFVBQUEsQ0FBWWtpSCxRQUFaLENBQ0E7Ozs7Ozs7S0FTQUMsaUJBQW1CQyxPQUFTcDdHLFdBQVcxYixLQUFLLFVBQUwsQ0FBaUIsVUFBakIsQ0FBNkIsWUFBN0IsQ0FBMkMsUUFBM0MsQ0FBWCxDQUFULENBQTJFODJILE9BQU9GLHNCQUVyRyxTQUFVaEIsVUFBVixDQUFzQixDQUNwQnJHLFlBQVlzSCxlQUFaLENBQTZCLElBQTdCLENBQW1DLENBQUMsQ0FDbENoOEksSUFBSyxNQUQ2Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O1NBMkJsQzlDLE1BQU8sYUFBQSxDQUFjeTZCLE1BQWQsQ0FBc0IsQ0FDM0IsV0FBYS96QixVQUFVMUQsTUFBVixDQUFtQixDQUFuQixFQUF3QjBELFVBQVUsQ0FBVixJQUFpQi9FLFNBQXpDLENBQXFEK0UsVUFBVSxDQUFWLENBQXJELENBQW9FLEVBQWpGLENBQ0EwMUYsT0FBTytoRCxLQUFQLENBQWUsS0FBZixDQUNBLGNBQWdCLG1CQUFBLENBQW9CL2hELE1BQXBCLENBQWhCLENBQ0FnNkMsVUFBVTJGLE1BQVYsQ0FBbUJ0aEgsTUFBbkIsQ0FDQTI3RyxVQUFVdjRJLElBQVYsR0FDQSxnQkFBQSxDQUNELENBbENpQyxDQUFELENBQW5DLEVBcUNBLHdCQUFBLENBQXlCdStGLE1BQXpCLENBQWlDLENBQy9CLFNBQUEsQ0FFQSxhQUFlMTFGLFVBQVUxRCxNQUFWLENBQW1CLENBQW5CLEVBQXdCMEQsVUFBVSxDQUFWLElBQWlCL0UsU0FBekMsQ0FBcUQrRSxVQUFVLENBQVYsQ0FBckQsQ0FBb0VvNEksZ0JBQWdCdkQsUUFBbkcsQ0FDQSxpQkFBbUI3MEksVUFBVTFELE1BQVYsQ0FBbUIsQ0FBbkIsRUFBd0IwRCxVQUFVLENBQVYsSUFBaUIvRSxTQUF6QyxDQUFxRCtFLFVBQVUsQ0FBVixDQUFyRCxDQUFvRW80SSxnQkFBZ0J0N0gsWUFBdkcsQ0FFQTZ5SCxlQUFlLElBQWYsQ0FBcUJ5SSxlQUFyQixFQUVBeHZELE1BQVFpbkQsMEJBQTBCLElBQTFCLENBQWdDTixpQkFBaUI2SSxlQUFqQixFQUFrQzdnSixJQUFsQyxDQUF1QyxJQUF2QyxDQUE2Q20rRixNQUE3QyxDQUFxRG0vQyxRQUFyRCxDQUErRC8zSCxZQUEvRCxDQUFoQyxDQUFSLENBRUEsR0FBSThyRSxNQUFNOE0sTUFBTixDQUFhK2hELEtBQWpCLENBQXdCLENBQ3RCLFVBQVk3dUQsTUFBTTZ1RCxLQUFOLENBQVk3dUQsTUFBTThNLE1BQWxCLENBQVosQ0FFQSxHQUFJLENBQUMraEQsS0FBTCxDQUFZLENBQ1YsNEJBQU0sQ0FBdUIsaUJBQXZCLENBQTBDLDJGQUExQyxDQUF1STNDLHNCQUFzQkEsc0JBQXNCbHNELEtBQXRCLENBQXRCLENBQXZJLENBQU4sQ0FDRCxDQUVELEdBQUk2dUQsd0JBQUosQ0FBOEIsQ0FDNUJBLE1BQU1sK0ksSUFBTixDQUFXLFNBQVU4N0ksTUFBVixDQUFrQixDQUMzQnpzRCxNQUFNeXNELE1BQU4sQ0FBZUEsTUFBZixDQUNELENBRkQsRUFHRCxDQUpELFdBSWFBLE1BQU4sQ0FBZW9DLEtBQWYsQ0FFUDd1RCxNQUFNc3NELElBQU4sQ0FBV3RzRCxNQUFNenhGLElBQU4sRUFBWCxFQUNELENBRUR5eEYsTUFBTTh1RCxZQUFOLENBQW1CLGVBQW5CLEVBRUEsWUFBQSxDQUNELENBQUM7RUFFRjs7Ozs7O09BU0E1RyxZQUFZc0gsZUFBWixDQUE2QixDQUFDLENBQzVCaDhJLElBQUssT0FEdUIsQ0FFNUI5QyxNQUFPLGNBQUEsRUFBaUIsQ0FDdEIsNEJBQU0sQ0FBdUIsaUJBQXZCLENBQTBDLDBDQUExQyxDQUFzRixJQUF0RixDQUFOLENBQ0QsQ0FDRDs7Ozs7O1VBTDJCLENBYTFCLENBQ0Q4QyxJQUFLLE1BREosQ0FFRDlDLE1BQU8sYUFBQSxFQUFnQixDQUNyQixXQUFhLElBQWIsQ0FFQSxrQkFBTyxDQUFZLFNBQVVMLE9BQVYsQ0FBbUIsQ0FDcENxM0ksT0FBT2xrSSxLQUFQLENBQWEsVUFBWSxDQUN2QmtrSSxPQUFPL2lILFFBQVAsQ0FBZ0J0Z0IsR0FBaEIsQ0FBb0JxakksT0FBTzU2QyxNQUFQLENBQWNub0UsUUFBZCxDQUF1QnJlLENBQTNDLENBQThDb2hJLE9BQU81NkMsTUFBUCxDQUFjbm9FLFFBQWQsQ0FBdUI3TixDQUFyRSxDQUF3RTR3SCxPQUFPNTZDLE1BQVAsQ0FBY25vRSxRQUFkLENBQXVCaEgsQ0FBL0YsRUFFQStwSCxPQUFPcjZHLFFBQVAsQ0FBZ0JocEIsR0FBaEIsQ0FBb0JxakksT0FBTzU2QyxNQUFQLENBQWN6L0QsUUFBZCxDQUF1Qi9tQixDQUEzQyxDQUE4Q29oSSxPQUFPNTZDLE1BQVAsQ0FBY3ovRCxRQUFkLENBQXVCdlcsQ0FBckUsQ0FBd0U0d0gsT0FBTzU2QyxNQUFQLENBQWN6L0QsUUFBZCxDQUF1QjFQLENBQS9GLEVBRUErcEgsT0FBT1csV0FBUCxDQUFtQixDQUNqQjZHLE9BQVEsQ0FEUyxDQUFuQixFQUlBNytJLFFBQVFxM0ksTUFBUixFQUNELENBVkQsRUFXRCxDQVpNLENBQVAsQ0FhRCxDQUNEOzs7Ozs7VUFoQzJCLENBd0MxQixDQUNEbDBJLElBQUssTUFESixDQUVEOUMsTUFBTyxnQkFBQSxDQUFpQnFJLE1BQWpCLENBQXlCLENBQzlCLFdBQWEsSUFBYixDQUVBLGFBQWE0dEksaUJBQWlCNkksZ0JBQWdCdmlKLFNBQWpDLENBQU4sQ0FBbUQsTUFBbkQsQ0FBMkQsSUFBM0QsRUFBaUUwQixJQUFqRSxDQUFzRSxJQUF0RSxDQUE0RW9LLE1BQTVFLENBQW9GLFVBQVksQ0FDckcsR0FBSSt1SSxPQUFPbnVJLE1BQVgsQ0FBbUJtdUksT0FBT251SSxNQUFQLENBQWNnZixJQUFkLENBQW1CNWYsT0FBT1ksTUFBUCxFQUFuQixFQUVuQm11SSxPQUFPbmpILFFBQVAsQ0FBZ0JoTSxJQUFoQixDQUFxQjVmLE9BQU80ckIsUUFBNUIsRUFFQW1qSCxPQUFPejZHLFFBQVAsQ0FBZ0IxVSxJQUFoQixDQUFxQjVmLE9BQU9zMEIsUUFBNUIsRUFFQXk2RyxPQUFPbGpILFVBQVAsQ0FBa0JqTSxJQUFsQixDQUF1QjVmLE9BQU82ckIsVUFBOUIsRUFDRCxDQVJNLENBQVAsQ0FTRCxDQUNEOzs7Ozs7VUF2RDJCLENBK0QxQixDQUNEcHhCLElBQUssT0FESixDQUVEOUMsTUFBTyxjQUFBLEVBQWlCLENBQ3RCLGdCQUFnQm5CLFdBQVQsQ0FBcUIsQ0FDMUJzL0ksTUFBTyxLQURtQixDQUFyQixFQUVKbDJILElBRkksQ0FFQyxJQUZELENBQVAsQ0FHRCxDQU5BLENBL0QwQixDQUE3QixFQXdFQXl1SCxTQUFTb0ksZUFBVCxDQUEwQmpCLFVBQTFCLEVBRUEsc0JBQUEsQ0FDRCxDQXpKRCxDQXlKRXZDLFNBekpGLENBRjhGLEdBMko3RXVELFFBM0pqQixDQVRBLENBc0tBcCtILGlCQUFpQkEsaUJBQWlCcStILGVBQWpCLENBQWtDLFVBQWxDLENBQThDaEQsYUFBYSxFQUFiLENBQWlCUixVQUFVQyxRQUEzQixDQUFxQyxDQUNsRzRDLE1BQU8sSUFEMkYsQ0FFbEdscUgsU0FBVSxDQUNScmUsRUFBRyxDQURLLENBRVJ3USxFQUFHLENBRkssQ0FHUjZHLEVBQUcsQ0FISyxDQUZ3RixDQU9sRzBQLFNBQVUsQ0FDUi9tQixFQUFHLENBREssQ0FFUndRLEVBQUcsQ0FGSyxDQUdSNkcsRUFBRyxDQUhLLENBUHdGLENBQXJDLENBQTlDLENBQWpCLENBWUssY0FaTCxDQVlxQixDQUNuQmdILFNBQVUsQ0FBQyxHQUFELENBQU0sR0FBTixDQUFXLEdBQVgsQ0FEUyxDQUVuQjBJLFNBQVUsQ0FBQyxHQUFELENBQU0sR0FBTixDQUFXLEdBQVgsQ0FGUyxDQUduQjNKLE1BQU8sQ0FBQyxHQUFELENBQU0sR0FBTixDQUFXLEdBQVgsQ0FIWSxDQVpyQixFQWtCQSxjQUFnQixlQUFoQixDQUVBLFdBQWEsQ0FDWC9zQixPQUFRLGFBQUEsR0FBa0IsV0FBbEIsQ0FBZ0M1SixNQUFoQyxDQUF5QzRKLE1BRHRDLENBQWIsQ0FJQTs7Ozs7OztLQVNBLHFCQUVBLFNBQVVvMUksYUFBVixDQUF5Qjs7Ozs7Ozs7O09BYXZCLFlBQUEsRUFBZSxDQUNiLFNBQUEsQ0FFQSxZQUFjMzBJLFVBQVUxRCxNQUFWLENBQW1CLENBQW5CLEVBQXdCMEQsVUFBVSxDQUFWLElBQWlCL0UsU0FBekMsQ0FBcUQrRSxVQUFVLENBQVYsQ0FBckQsQ0FBb0UsRUFBbEYsQ0FFQTJ2SSxlQUFlLElBQWYsQ0FBcUIySSxHQUFyQixFQUVBMW1JLFFBQVErTyxHQUFSLENBQVksV0FBV3JjLE1BQVgsQ0FBa0I3RSxPQUFsQixDQUFaLEVBQ0FtcEYsTUFBUWluRCwwQkFBMEIsSUFBMUIsQ0FBZ0NOLGlCQUFpQitJLEdBQWpCLEVBQXNCL2dKLElBQXRCLENBQTJCLElBQTNCLENBQWhDLENBQVIsQ0FFQXdpQixpQkFBaUJBLGlCQUFpQis2SCxzQkFBc0JBLHNCQUFzQmxzRCxLQUF0QixDQUF0QixDQUFqQixDQUFzRSxTQUF0RSxDQUFpRixJQUFqRixDQUFqQixDQUF5RyxPQUF6RyxDQUFrSCxFQUFsSCxFQUVBQSxNQUFNbWhCLE9BQU4sQ0FBZ0IsaUJBQUEsQ0FBa0IrcUMsc0JBQXNCQSxzQkFBc0Jsc0QsS0FBdEIsQ0FBdEIsQ0FBbEIsQ0FBaEIsQ0FDQUEsTUFBTW1vRCxPQUFOLENBQWdCQSxPQUFoQixDQUVBbm9ELE1BQU1tc0QsZ0JBQU4sR0FFQSxZQUFBLENBQ0QsQ0FBQztFQUVGOzs7O09BT0FqRSxZQUFZd0gsR0FBWixDQUFpQixDQUFDLENBQ2hCbDhJLElBQUssT0FEVyxDQUVoQjlDLE1BQU8sY0FBQSxFQUFpQixDQUN0QixxQkFBdUIsVUFBWSxDQUNqQyxjQUFjaUcsTUFBUCxDQUFjK3RGLHFCQUFkLEVBQXVDaXJELE9BQU9oNUksTUFBUCxDQUFjaTVJLDJCQUFyRCxFQUFvRkQsT0FBT2g1SSxNQUFQLENBQWNrNUksd0JBQWxHLEVBQThILFNBQVUzbEgsUUFBVixDQUFvQixDQUN2SnlsSCxPQUFPaDVJLE1BQVAsQ0FBY3lOLFVBQWQsQ0FBeUI4bEIsUUFBekIsQ0FBbUMsS0FBTyxFQUExQyxFQUNELENBRkQsQ0FHRCxDQUpzQixFQUF2QixDQU1BLFVBQVksS0FBSzRsSCxLQUFqQixDQUNJOStGLFFBQVUsS0FBS0EsT0FEbkIsQ0FHQSxnQkFBQSxFQUFtQixDQUNqQisrRixpQkFBaUJydEksT0FBakIsRUFDQSxHQUFJLENBQUNzdUMsT0FBTCxDQUFjLE9BRWQsSUFBSyxNQUFRLENBQVIsQ0FBV2cvRixHQUFLRixNQUFNcDhJLE1BQTNCLENBQW1DSyxFQUFJaThJLEVBQXZDLENBQTJDajhJLEdBQTNDLENBQWdELENBQzlDLE1BQVErN0ksTUFBTS83SSxDQUFOLENBQVIsQ0FDQSxHQUFJMkIsRUFBRXM3QyxPQUFOLENBQWV0N0MsRUFBRXU2SSxPQUFGLENBQVV2NkksRUFBRXc2SSxLQUFaLEVBQ2hCLENBQ0YsQ0FFRCxLQUFLbC9GLE9BQUwsQ0FBZSxJQUFmLENBQ0F0dUMsVUFDRCxDQUNEOzs7O1VBekJlLENBK0JkLENBQ0RsUCxJQUFLLE1BREosQ0FFRDlDLE1BQU8sYUFBQSxFQUFnQixDQUNyQixLQUFLc2dELE9BQUwsQ0FBZSxLQUFmLENBQ0QsQ0FDRDs7Ozs7Ozs7Ozs7Ozs7O1VBcENlLENBcURkLENBQ0R4OUMsSUFBSyxTQURKLENBRUQ5QyxNQUFPLGdCQUFBLENBQWlCbTBILElBQWpCLENBQXVCLENBQzVCLFdBQWEsSUFBYixDQUVBLGtCQUFPLENBQVksU0FBVXgwSCxPQUFWLENBQW1CLENBQ3BDcTNJLE9BQU9vSSxLQUFQLENBQWE1OEksSUFBYixDQUFrQjJ4SCxJQUFsQixFQUVBeDBILFFBQVF3MEgsSUFBUixFQUNELENBSk0sQ0FBUCxDQUtELENBQ0Q7Ozs7OztVQWhFZSxDQXdFZCxDQUNEcnhILElBQUssWUFESixDQUVEOUMsTUFBTyxtQkFBQSxDQUFvQm0wSCxJQUFwQixDQUEwQixDQUMvQixXQUFhLElBQWIsQ0FFQSxrQkFBTyxDQUFZLFNBQVV4MEgsT0FBVixDQUFtQixDQUNwQyxVQUFZeTNJLE9BQU9nSSxLQUFQLENBQWF2NkksT0FBYixDQUFxQnN2SCxJQUFyQixDQUFaLENBRUEsR0FBSWxxSCxRQUFVLENBQUMsQ0FBZixDQUFrQm10SSxPQUFPZ0ksS0FBUCxDQUFhejZILE1BQWIsQ0FBb0IxYSxLQUFwQixDQUEyQixDQUEzQixFQUNsQnRLLFFBQVF3MEgsSUFBUixFQUNELENBTE0sQ0FBUCxDQU1ELENBWEEsQ0F4RWMsQ0FvRmQsQ0FDRHJ4SCxJQUFLLEtBREosQ0FFRDlDLE1BQU8sWUFBQSxDQUFhOEMsR0FBYixDQUFrQixDQUN2QixZQUFZMnRHLE9BQUwsQ0FBYTFwRyxHQUFiLENBQWlCakUsR0FBakIsQ0FBUCxDQUNELENBSkEsQ0FwRmMsQ0F5RmQsQ0FDREEsSUFBSyxLQURKLENBRUQ5QyxNQUFPLFlBQUEsQ0FBYThDLEdBQWIsQ0FBa0IsQ0FDdkIsWUFBWTJ0RyxPQUFMLENBQWEycUMsR0FBYixDQUFpQnQ0SSxHQUFqQixDQUFQLENBQ0QsQ0FKQSxDQXpGYyxDQUFqQixFQWdHQTR6SSxTQUFTc0ksR0FBVCxDQUFjM0QsYUFBZCxFQUVBLFVBQUEsQ0FDRCxDQTNJRCxDQTJJRTlELFlBM0lGLENBRkEsQ0ErSUE7Ozs7OztLQVFBLHNCQUVBLFVBQVksQ0FDVixhQUFBLENBQWNoNkMsSUFBZCxDQUFvQixDQUNsQixhQUFlNzJGLFVBQVUxRCxNQUFWLENBQW1CLENBQW5CLEVBQXdCMEQsVUFBVSxDQUFWLElBQWlCL0UsU0FBekMsQ0FBcUQrRSxVQUFVLENBQVYsQ0FBckQsQ0FBb0UsSUFBbkYsQ0FFQTJ2SSxlQUFlLElBQWYsQ0FBcUJvSixJQUFyQixFQUVBLEtBQUtsaUQsSUFBTCxDQUFZQSxJQUFaLENBQ0EsS0FBS2lpRCxLQUFMLENBQWFFLFNBQVcsU0FBQSxFQUFYLENBQXlCLElBQXRDLENBQ0EsS0FBS3AvRixPQUFMLENBQWUsS0FBZixDQUNELENBQUM7RUFFRjs7Ozs7O09BU0FrM0YsWUFBWWlJLElBQVosQ0FBa0IsQ0FBQyxDQUNqQjM4SSxJQUFLLE9BRFksQ0FFakI5QyxNQUFPLGNBQUEsQ0FBZTIvSSxLQUFmLENBQXNCLENBQzNCLEdBQUksS0FBS3IvRixPQUFULENBQWtCLE9BQ2xCLEdBQUlxL0YsS0FBSixDQUFXQSxNQUFNQyxPQUFOLENBQWMsSUFBZCxFQUNYLEdBQUksS0FBS0osS0FBVCxDQUFnQixLQUFLQSxLQUFMLENBQVczNEcsS0FBWCxHQUNoQixLQUFLeVosT0FBTCxDQUFlLElBQWYsQ0FDRCxDQUNEOzs7Ozs7VUFSZ0IsQ0FnQmYsQ0FDRHg5QyxJQUFLLE1BREosQ0FFRDlDLE1BQU8sYUFBQSxDQUFjMi9JLEtBQWQsQ0FBcUIsQ0FDMUIsR0FBSSxDQUFDLEtBQUtyL0YsT0FBVixDQUFtQixPQUNuQixHQUFJLEtBQUtrL0YsS0FBVCxDQUFnQixLQUFLQSxLQUFMLENBQVczN0ksSUFBWCxHQUNoQixLQUFLeThDLE9BQUwsQ0FBZSxLQUFmLENBQ0EsR0FBSXEvRixLQUFKLENBQVdBLE1BQU1FLFVBQU4sQ0FBaUIsSUFBakIsRUFDWixDQUFDO0VBRUY7Ozs7OztVQXpCZ0IsQ0FpQ2YsQ0FDRC84SSxJQUFLLFNBREosQ0FFRDlDLE1BQU8sZ0JBQUEsRUFBbUIsQ0FDeEIsWUFBWXU5RixJQUFMLENBQVUsS0FBS2lpRCxLQUFmLENBQVAsQ0FDRCxDQUpBLENBakNlLENBQWxCLEVBd0NBLFdBQUEsQ0FDRCxDQTdERCxFQUZBLENBaUVBOzs7Ozs7Ozs7Ozs7OztLQWtCQSxnQ0FFQSxTQUFVTSxlQUFWLENBQTJCLENBQ3pCLHdCQUFBLEVBQTJCLENBQ3pCLFdBQWFwNUksVUFBVTFELE1BQVYsQ0FBbUIsQ0FBbkIsRUFBd0IwRCxVQUFVLENBQVYsSUFBaUIvRSxTQUF6QyxDQUFxRCtFLFVBQVUsQ0FBVixDQUFyRCxDQUFvRSxFQUFqRixDQUVBMnZJLGVBQWUsSUFBZixDQUFxQjBKLGVBQXJCLEVBRUEsaUNBQWlDLElBQTFCLENBQWdDOUosaUJBQWlCOEosZUFBakIsRUFBa0M5aEosSUFBbEMsQ0FBdUMsSUFBdkMsQ0FBNkNtK0YsTUFBN0MsQ0FBcUQyakQsZ0JBQWdCeEUsUUFBckUsQ0FBaEMsQ0FBUCxDQUNELENBRUQvRCxZQUFZdUksZUFBWixDQUE2QixDQUFDLENBQzVCajlJLElBQUssT0FEdUIsQ0FFNUI5QyxNQUFPLGNBQUEsRUFBaUIsQ0FDdEIsV0FBYTBHLFVBQVUxRCxNQUFWLENBQW1CLENBQW5CLEVBQXdCMEQsVUFBVSxDQUFWLElBQWlCL0UsU0FBekMsQ0FBcUQrRSxVQUFVLENBQVYsQ0FBckQsQ0FBb0UsRUFBakYsQ0FDQSxZQUFZaXhJLFdBQUwsQ0FBaUIsQ0FDdEJ0cEUsTUFBTyxnQkFBQSxDQUFpQit0QixPQUFPN3FELEtBQXhCLENBQStCNnFELE9BQU8zdEIsU0FBdEMsQ0FEZSxDQUFqQixFQUVKSixLQUZILENBR0QsQ0FQMkIsQ0FBRCxDQUE3QixFQVVBcW9FLFNBQVNxSixlQUFULENBQTBCRCxlQUExQixFQUVBLHNCQUFBLENBQ0QsQ0F0QkQsQ0FzQkVwQixjQXRCRixDQUZBLENBMEJBaitILGlCQUFpQnUvSCxjQUFqQixDQUFpQyxVQUFqQyxDQUE2Q2xFLGFBQWEsRUFBYixDQUFpQjRDLGVBQWVuRCxRQUFoQyxDQUEwQyxDQUNyRmhxRyxNQUFPLFFBRDhFLENBRXJGazlCLFVBQVcsQ0FGMEUsQ0FBMUMsQ0FBN0MsRUFLQTs7Ozs7Ozs7Ozs7Ozs7Ozs7S0FtQkEsb0NBRUEsU0FBVXF4RSxlQUFWLENBQTJCLENBQ3pCLDRCQUFBLEVBQStCLENBQzdCLFNBQUEsQ0FFQSxXQUFhcDVJLFVBQVUxRCxNQUFWLENBQW1CLENBQW5CLEVBQXdCMEQsVUFBVSxDQUFWLElBQWlCL0UsU0FBekMsQ0FBcUQrRSxVQUFVLENBQVYsQ0FBckQsQ0FBb0UsRUFBakYsQ0FFQTJ2SSxlQUFlLElBQWYsQ0FBcUI0SixtQkFBckIsRUFFQTN3RCxNQUFRaW5ELDBCQUEwQixJQUExQixDQUFnQ04saUJBQWlCZ0ssbUJBQWpCLEVBQXNDaGlKLElBQXRDLENBQTJDLElBQTNDLENBQWlEbStGLE1BQWpELENBQXlENmpELG9CQUFvQjFFLFFBQTdFLENBQWhDLENBQVIsQ0FFQWpzRCxNQUFNc3ZELFVBQU4sR0FFQSxZQUFBLENBQ0QsQ0FFRHBILFlBQVl5SSxtQkFBWixDQUFpQyxDQUFDLENBQ2hDbjlJLElBQUssT0FEMkIsQ0FFaEM5QyxNQUFPLGNBQUEsRUFBaUIsQ0FDdEIsV0FBYTBHLFVBQVUxRCxNQUFWLENBQW1CLENBQW5CLEVBQXdCMEQsVUFBVSxDQUFWLElBQWlCL0UsU0FBekMsQ0FBcUQrRSxVQUFVLENBQVYsQ0FBckQsQ0FBb0UsRUFBakYsQ0FDQSxZQUFZaXhJLFdBQUwsQ0FBaUIsQ0FDdEJ0cEUsTUFBTyxvQkFBQSxDQUFxQit0QixPQUFPN3FELEtBQTVCLENBQW1DNnFELE9BQU8zdEIsU0FBMUMsQ0FEZSxDQUFqQixFQUVKSixLQUZILENBR0QsQ0FQK0IsQ0FBRCxDQUFqQyxFQVVBcW9FLFNBQVN1SixtQkFBVCxDQUE4QkgsZUFBOUIsRUFFQSwwQkFBQSxDQUNELENBNUJELENBNEJFcEIsY0E1QkYsQ0FGQSxDQWdDQWorSCxpQkFBaUJ5L0gsa0JBQWpCLENBQXFDLFVBQXJDLENBQWlEcEUsYUFBYSxFQUFiLENBQWlCNEMsZUFBZW5ELFFBQWhDLENBQTBDLENBQ3pGaHFHLE1BQU8sUUFEa0YsQ0FFekZrOUIsVUFBVyxDQUY4RSxDQUExQyxDQUFqRCxFQUtBOzs7Ozs7Ozs7Ozs7Ozs7O0tBa0JBLG1DQUVBLFNBQVVxeEUsZUFBVixDQUEyQixDQUN6QiwyQkFBQSxFQUE4QixDQUM1QixXQUFhcDVJLFVBQVUxRCxNQUFWLENBQW1CLENBQW5CLEVBQXdCMEQsVUFBVSxDQUFWLElBQWlCL0UsU0FBekMsQ0FBcUQrRSxVQUFVLENBQVYsQ0FBckQsQ0FBb0UsRUFBakYsQ0FFQTJ2SSxlQUFlLElBQWYsQ0FBcUI4SixrQkFBckIsRUFFQSxpQ0FBaUMsSUFBMUIsQ0FBZ0NsSyxpQkFBaUJrSyxrQkFBakIsRUFBcUNsaUosSUFBckMsQ0FBMEMsSUFBMUMsQ0FBZ0RtK0YsTUFBaEQsQ0FBd0QrakQsbUJBQW1CNUUsUUFBM0UsQ0FBaEMsQ0FBUCxDQUNELENBRUQvRCxZQUFZMkksa0JBQVosQ0FBZ0MsQ0FBQyxDQUMvQnI5SSxJQUFLLE9BRDBCLENBRS9COUMsTUFBTyxjQUFBLEVBQWlCLENBQ3RCLFdBQWEwRyxVQUFVMUQsTUFBVixDQUFtQixDQUFuQixFQUF3QjBELFVBQVUsQ0FBVixJQUFpQi9FLFNBQXpDLENBQXFEK0UsVUFBVSxDQUFWLENBQXJELENBQW9FLEVBQWpGLENBQ0EsWUFBWWl4SSxXQUFMLENBQWlCLENBQ3RCdHBFLE1BQU8sbUJBQUEsQ0FBb0IrdEIsT0FBT3RsRCxRQUEzQixDQUFxQ3NsRCxPQUFPcmxELFdBQTVDLENBQXlEcWxELE9BQU8zdEIsU0FBaEUsQ0FEZSxDQUFqQixFQUVKSixLQUZILENBR0QsQ0FQOEIsQ0FBRCxDQUFoQyxFQVVBcW9FLFNBQVN5SixrQkFBVCxDQUE2QkwsZUFBN0IsRUFFQSx5QkFBQSxDQUNELENBdEJELENBc0JFcEIsY0F0QkYsQ0FGQSxDQTBCQWorSCxpQkFBaUIyL0gsaUJBQWpCLENBQW9DLFVBQXBDLENBQWdEdEUsYUFBYSxFQUFiLENBQWlCNEMsZUFBZW5ELFFBQWhDLENBQTBDLENBQ3hGemtHLFNBQVUsUUFEOEUsQ0FFeEZDLFlBQWEsUUFGMkUsQ0FHeEYwM0IsVUFBVyxDQUg2RSxDQUExQyxDQUFoRCxFQU1BOzs7Ozs7Ozs7Ozs7Ozs7O0tBa0JBLDhCQUVBLFNBQVVxeEUsZUFBVixDQUEyQixDQUN6QixzQkFBQSxFQUF5QixDQUN2QixTQUFBLENBRUEsV0FBYXA1SSxVQUFVMUQsTUFBVixDQUFtQixDQUFuQixFQUF3QjBELFVBQVUsQ0FBVixJQUFpQi9FLFNBQXpDLENBQXFEK0UsVUFBVSxDQUFWLENBQXJELENBQW9FLEVBQWpGLENBRUEydkksZUFBZSxJQUFmLENBQXFCZ0ssYUFBckIsRUFFQS93RCxNQUFRaW5ELDBCQUEwQixJQUExQixDQUFnQ04saUJBQWlCb0ssYUFBakIsRUFBZ0NwaUosSUFBaEMsQ0FBcUMsSUFBckMsQ0FBMkNtK0YsTUFBM0MsQ0FBbURpa0QsY0FBYzlFLFFBQWpFLENBQWhDLENBQVIsQ0FFQWpzRCxNQUFNc3ZELFVBQU4sR0FFQSxZQUFBLENBQ0QsQ0FFRHBILFlBQVk2SSxhQUFaLENBQTJCLENBQUMsQ0FDMUJ2OUksSUFBSyxPQURxQixDQUUxQjlDLE1BQU8sY0FBQSxFQUFpQixDQUN0QixXQUFhMEcsVUFBVTFELE1BQVYsQ0FBbUIsQ0FBbkIsRUFBd0IwRCxVQUFVLENBQVYsSUFBaUIvRSxTQUF6QyxDQUFxRCtFLFVBQVUsQ0FBVixDQUFyRCxDQUFvRSxFQUFqRixDQUNBLFlBQVlpeEksV0FBTCxDQUFpQixDQUN0QnRwRSxNQUFPLGNBQUEsQ0FBZSt0QixPQUFPN3FELEtBQXRCLENBQTZCNnFELE9BQU8zdEIsU0FBcEMsQ0FBK0MydEIsT0FBT2p6RCxRQUF0RCxDQUFnRWl6RCxPQUFPL2xELEtBQXZFLENBRGUsQ0FBakIsRUFFSmc0QixLQUZILENBR0QsQ0FQeUIsQ0FBRCxDQUEzQixFQVVBcW9FLFNBQVMySixhQUFULENBQXdCUCxlQUF4QixFQUVBLG9CQUFBLENBQ0QsQ0E1QkQsQ0E0QkVwQixjQTVCRixDQUZBLENBZ0NBaitILGlCQUFpQjYvSCxZQUFqQixDQUErQixVQUEvQixDQUEyQ3hFLGFBQWEsRUFBYixDQUFpQjRDLGVBQWVuRCxRQUFoQyxDQUEwQyxDQUNuRmhxRyxNQUFPLFFBRDRFLENBRW5GazlCLFVBQVcsQ0FGd0UsQ0FHbkZ0bEMsU0FBVSxHQUh5RSxDQUluRmtOLE1BQU8sQ0FKNEUsQ0FBMUMsQ0FBM0MsRUFPQTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztLQXFCQSw2QkFFQSxTQUFVeXBHLGVBQVYsQ0FBMkIsQ0FDekIscUJBQUEsRUFBd0IsQ0FDdEIsU0FBQSxDQUVBLFdBQWFwNUksVUFBVTFELE1BQVYsQ0FBbUIsQ0FBbkIsRUFBd0IwRCxVQUFVLENBQVYsSUFBaUIvRSxTQUF6QyxDQUFxRCtFLFVBQVUsQ0FBVixDQUFyRCxDQUFvRSxFQUFqRixDQUVBMnZJLGVBQWUsSUFBZixDQUFxQmtLLFlBQXJCLEVBRUFqeEQsTUFBUWluRCwwQkFBMEIsSUFBMUIsQ0FBZ0NOLGlCQUFpQnNLLFlBQWpCLEVBQStCdGlKLElBQS9CLENBQW9DLElBQXBDLENBQTBDbStGLE1BQTFDLENBQWtEbWtELGFBQWFoRixRQUEvRCxDQUFoQyxDQUFSLENBRUFqc0QsTUFBTXN2RCxVQUFOLEdBRUEsWUFBQSxDQUNELENBRURwSCxZQUFZK0ksWUFBWixDQUEwQixDQUFDLENBQ3pCejlJLElBQUssT0FEb0IsQ0FFekI5QyxNQUFPLGNBQUEsRUFBaUIsQ0FDdEIsV0FBYTBHLFVBQVUxRCxNQUFWLENBQW1CLENBQW5CLEVBQXdCMEQsVUFBVSxDQUFWLElBQWlCL0UsU0FBekMsQ0FBcUQrRSxVQUFVLENBQVYsQ0FBckQsQ0FBb0UsRUFBakYsQ0FDQSxZQUFZaXhJLFdBQUwsQ0FBaUIsQ0FDdEJ0cEUsTUFBTyxhQUFBLENBQWMrdEIsT0FBTzdxRCxLQUFyQixDQUE0QjZxRCxPQUFPM3RCLFNBQW5DLENBQThDMnRCLE9BQU9qekQsUUFBckQsQ0FBK0RpekQsT0FBT3Z5RSxLQUF0RSxDQUE2RXV5RSxPQUFPb2tELFFBQXBGLENBQThGcGtELE9BQU8vbEQsS0FBckcsQ0FEZSxDQUFqQixFQUVKZzRCLEtBRkgsQ0FHRCxDQVB3QixDQUFELENBQTFCLEVBVUFxb0UsU0FBUzZKLFlBQVQsQ0FBdUJULGVBQXZCLEVBRUEsbUJBQUEsQ0FDRCxDQTVCRCxDQTRCRXBCLGNBNUJGLENBRkEsQ0FnQ0FqK0gsaUJBQWlCZ2dJLFdBQWpCLENBQThCLFVBQTlCLENBQTBDM0UsYUFBYSxFQUFiLENBQWlCNEMsZUFBZW5ELFFBQWhDLENBQTBDLENBQ2xGaHFHLE1BQU8sUUFEMkUsQ0FFbEZrOUIsVUFBVyxDQUZ1RSxDQUdsRnRsQyxTQUFVLEdBSHdFLENBSWxGdGYsTUFBTzNrQixLQUFLK2YsRUFBTCxDQUFVLENBSmlFLENBS2xGdTdILFNBQVUsQ0FMd0UsQ0FNbEZucUcsTUFBTyxDQU4yRSxDQUExQyxDQUExQyxFQVNBLDJCQUVBLFNBQVV5cEcsZUFBVixDQUEyQixDQUN6QixrQkFBQSxFQUFxQixDQUNuQixXQUFhcDVJLFVBQVUxRCxNQUFWLENBQW1CLENBQW5CLEVBQXdCMEQsVUFBVSxDQUFWLElBQWlCL0UsU0FBekMsQ0FBcUQrRSxVQUFVLENBQVYsQ0FBckQsQ0FBb0UsRUFBakYsQ0FFQTJ2SSxlQUFlLElBQWYsQ0FBcUJxSyxTQUFyQixFQUVBLGlDQUFpQyxJQUExQixDQUFnQ3pLLGlCQUFpQnlLLFNBQWpCLEVBQTRCemlKLElBQTVCLENBQWlDLElBQWpDLENBQXVDbStGLE1BQXZDLENBQStDc2tELFVBQVVuRixRQUF6RCxDQUFoQyxDQUFQLENBQ0QsQ0FFRC9ELFlBQVlrSixTQUFaLENBQXVCLENBQUMsQ0FDdEI1OUksSUFBSyxPQURpQixDQUV0QjlDLE1BQU8sY0FBQSxFQUFpQixDQUN0QixXQUFhMEcsVUFBVTFELE1BQVYsQ0FBbUIsQ0FBbkIsRUFBd0IwRCxVQUFVLENBQVYsSUFBaUIvRSxTQUF6QyxDQUFxRCtFLFVBQVUsQ0FBVixDQUFyRCxDQUFvRSxFQUFqRixDQUNBLFlBQVlpeEksV0FBTCxDQUFpQixDQUN0QnRwRSxNQUFPLGlCQUFBLENBQWtCK3RCLE9BQU83cUQsS0FBekIsQ0FBZ0M2cUQsT0FBTzN0QixTQUF2QyxDQUFrRDJ0QixPQUFPaDlELEtBQXpELENBQWdFZzlELE9BQU8vOEQsTUFBdkUsQ0FEZSxDQUFqQixFQUVKZ3ZDLEtBRkgsQ0FHRCxDQVBxQixDQUFELENBQXZCLEVBVUFxb0UsU0FBU2dLLFNBQVQsQ0FBb0JaLGVBQXBCLEVBRUEsZ0JBQUEsQ0FDRCxDQXRCRCxDQXNCRXBCLGNBdEJGLENBRkEsQ0EwQkFqK0gsaUJBQWlCaWdJLFNBQWpCLENBQTRCLFVBQTVCLENBQXdDNUUsYUFBYSxFQUFiLENBQWlCNEMsZUFBZW5ELFFBQWhDLENBQTBDLENBQ2hGaHFHLE1BQU8sUUFEeUUsQ0FFaEZrOUIsVUFBVyxDQUZxRSxDQUdoRnJ2QyxNQUFPLEVBSHlFLENBSWhGQyxPQUFRLEVBSndFLENBQTFDLENBQXhDLEVBT0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztLQXlCQSw4QkFFQSxTQUFVc2hILGdCQUFWLENBQTRCOzs7Ozs7Ozs7Ozs7T0FjMUIsc0JBQUEsRUFBeUIsQ0FDdkIsV0FBYWo2SSxVQUFVMUQsTUFBVixDQUFtQixDQUFuQixFQUF3QjBELFVBQVUsQ0FBVixJQUFpQi9FLFNBQXpDLENBQXFEK0UsVUFBVSxDQUFWLENBQXJELENBQW9FLEVBQWpGLENBRUEydkksZUFBZSxJQUFmLENBQXFCdUssYUFBckIsRUFFQSxpQ0FBaUMsSUFBMUIsQ0FBZ0MzSyxpQkFBaUIySyxhQUFqQixFQUFnQzNpSixJQUFoQyxDQUFxQyxJQUFyQyxDQUEyQ20rRixNQUEzQyxDQUFtRHdrRCxjQUFjckYsUUFBakUsQ0FBaEMsQ0FBUCxDQUNELENBRUQvRCxZQUFZb0osYUFBWixDQUEyQixDQUFDLENBQzFCOTlJLElBQUssT0FEcUIsQ0FFMUI5QyxNQUFPLGNBQUEsRUFBaUIsQ0FDdEIsV0FBYTBHLFVBQVUxRCxNQUFWLENBQW1CLENBQW5CLEVBQXdCMEQsVUFBVSxDQUFWLElBQWlCL0UsU0FBekMsQ0FBcUQrRSxVQUFVLENBQVYsQ0FBckQsQ0FBb0UsRUFBakYsQ0FDQSxZQUFZaXhJLFdBQUwsQ0FBaUIsQ0FDdEJsOUcsT0FBUSxjQUFBLENBQWUyaEUsT0FBT2xuRSxJQUF0QixDQUE0QmtuRSxPQUFPam5FLEdBQW5DLENBQXdDaW5FLE9BQU82MUIsY0FBL0MsQ0FEYyxDQUFqQixFQUVKeDNGLE1BRkgsQ0FHRCxDQVB5QixDQUFELENBQTNCLEVBVUFpOEcsU0FBU2tLLGFBQVQsQ0FBd0JELGdCQUF4QixFQUVBLG9CQUFBLENBQ0QsQ0FuQ0QsQ0FtQ0U3QixlQW5DRixDQUZBLENBdUNBcitILGlCQUFpQm9nSSxZQUFqQixDQUErQixVQUEvQixDQUEyQy9FLGFBQWEsRUFBYixDQUFpQmdELGdCQUFnQnZELFFBQWpDLENBQTJDLENBQ3BGcm1ILEtBQU0sQ0FEOEUsQ0FFcEZDLElBQUssSUFGK0UsQ0FHcEY4OEYsZUFBZ0IsR0FIb0UsQ0FBM0MsQ0FBM0MsRUFNQTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztLQXFCQSxzQ0FFQSxTQUFVMHVCLGdCQUFWLENBQTRCOzs7Ozs7Ozs7Ozs7O09BZTFCLDhCQUFBLEVBQWlDLENBQy9CLFdBQWFqNkksVUFBVTFELE1BQVYsQ0FBbUIsQ0FBbkIsRUFBd0IwRCxVQUFVLENBQVYsSUFBaUIvRSxTQUF6QyxDQUFxRCtFLFVBQVUsQ0FBVixDQUFyRCxDQUFvRSxFQUFqRixDQUVBMnZJLGVBQWUsSUFBZixDQUFxQnlLLHFCQUFyQixFQUVBLGlDQUFpQyxJQUExQixDQUFnQzdLLGlCQUFpQjZLLHFCQUFqQixFQUF3QzdpSixJQUF4QyxDQUE2QyxJQUE3QyxDQUFtRG0rRixNQUFuRCxDQUEyRDBrRCxzQkFBc0J2RixRQUFqRixDQUFoQyxDQUFQLENBQ0QsQ0FFRC9ELFlBQVlzSixxQkFBWixDQUFtQyxDQUFDLENBQ2xDaCtJLElBQUssT0FENkIsQ0FFbEM5QyxNQUFPLGNBQUEsRUFBaUIsQ0FDdEIsV0FBYTBHLFVBQVUxRCxNQUFWLENBQW1CLENBQW5CLEVBQXdCMEQsVUFBVSxDQUFWLElBQWlCL0UsU0FBekMsQ0FBcUQrRSxVQUFVLENBQVYsQ0FBckQsQ0FBb0UsRUFBakYsQ0FDQSxZQUFZaXhJLFdBQUwsQ0FBaUIsQ0FDdEJsOUcsT0FBUSxzQkFBQSxDQUF1QjJoRSxPQUFPdG5FLElBQTlCLENBQW9Dc25FLE9BQU9ybkUsS0FBM0MsQ0FBa0RxbkUsT0FBT3BuRSxHQUF6RCxDQUE4RG9uRSxPQUFPbm5FLE1BQXJFLENBQTZFbW5FLE9BQU9sbkUsSUFBcEYsQ0FBMEZrbkUsT0FBT2puRSxHQUFqRyxDQURjLENBQWpCLEVBRUpzRixNQUZILENBR0QsQ0FQaUMsQ0FBRCxDQUFuQyxFQVVBaThHLFNBQVNvSyxxQkFBVCxDQUFnQ0gsZ0JBQWhDLEVBRUEsNEJBQUEsQ0FDRCxDQXBDRCxDQW9DRTdCLGVBcENGLENBRkEsQ0F3Q0FyK0gsaUJBQWlCc2dJLG9CQUFqQixDQUF1QyxVQUF2QyxDQUFtRGpGLGFBQWEsRUFBYixDQUFpQmdELGdCQUFnQnZELFFBQWpDLENBQTJDLENBQzVGcm1ILEtBQU0sQ0FEc0YsQ0FFNUZDLElBQUssSUFGdUYsQ0FHNUZMLEtBQU1tcUgsT0FBT2g1SSxNQUFQLENBQWMrNkksVUFBZCxDQUEyQixDQUFDLENBSDBELENBSTVGanNILE1BQU9rcUgsT0FBT2g1SSxNQUFQLENBQWMrNkksVUFBZCxDQUEyQixDQUowRCxDQUs1RmhzSCxJQUFLaXFILE9BQU9oNUksTUFBUCxDQUFjZzdJLFdBQWQsQ0FBNEIsQ0FMMkQsQ0FNNUZoc0gsT0FBUWdxSCxPQUFPaDVJLE1BQVAsQ0FBY2c3SSxXQUFkLENBQTRCLENBQUMsQ0FOdUQsQ0FBM0MsQ0FBbkQsRUFTQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7S0FzQkEscUNBRUEsU0FBVU4sZ0JBQVYsQ0FBNEI7Ozs7Ozs7Ozs7O09BYTFCLDZCQUFBLEVBQWdDLENBQzlCLFdBQWFqNkksVUFBVTFELE1BQVYsQ0FBbUIsQ0FBbkIsRUFBd0IwRCxVQUFVLENBQVYsSUFBaUIvRSxTQUF6QyxDQUFxRCtFLFVBQVUsQ0FBVixDQUFyRCxDQUFvRSxFQUFqRixDQUVBMnZJLGVBQWUsSUFBZixDQUFxQjZLLG9CQUFyQixFQUVBLGlDQUFpQyxJQUExQixDQUFnQ2pMLGlCQUFpQmlMLG9CQUFqQixFQUF1Q2pqSixJQUF2QyxDQUE0QyxJQUE1QyxDQUFrRG0rRixNQUFsRCxDQUEwRDhrRCxxQkFBcUIzRixRQUEvRSxDQUFoQyxDQUFQLENBQ0QsQ0FFRC9ELFlBQVkwSixvQkFBWixDQUFrQyxDQUFDLENBQ2pDcCtJLElBQUssT0FENEIsQ0FFakM5QyxNQUFPLGNBQUEsRUFBaUIsQ0FDdEIsV0FBYTBHLFVBQVUxRCxNQUFWLENBQW1CLENBQW5CLEVBQXdCMEQsVUFBVSxDQUFWLElBQWlCL0UsU0FBekMsQ0FBcUQrRSxVQUFVLENBQVYsQ0FBckQsQ0FBb0UsRUFBakYsQ0FDQSxZQUFZaXhJLFdBQUwsQ0FBaUIsQ0FDdEJsOUcsT0FBUSxxQkFBQSxDQUFzQjJoRSxPQUFPL1QsR0FBN0IsQ0FBa0MrVCxPQUFPOVQsTUFBekMsQ0FBaUQ4VCxPQUFPbG5FLElBQXhELENBQThEa25FLE9BQU9qbkUsR0FBckUsQ0FEYyxDQUFqQixFQUVKc0YsTUFGSCxDQUdELENBUGdDLENBQUQsQ0FBbEMsRUFVQWk4RyxTQUFTd0ssb0JBQVQsQ0FBK0JQLGdCQUEvQixFQUVBLDJCQUFBLENBQ0QsQ0FsQ0QsQ0FrQ0U3QixlQWxDRixDQUZBLENBc0NBcitILGlCQUFpQjBnSSxtQkFBakIsQ0FBc0MsVUFBdEMsQ0FBa0RyRixhQUFhLEVBQWIsQ0FBaUJnRCxnQkFBZ0J2RCxRQUFqQyxDQUEyQyxDQUMzRnJtSCxLQUFNLENBRHFGLENBRTNGQyxJQUFLLElBRnNGLENBRzNGa3pELElBQUssRUFIc0YsQ0FJM0ZDLE9BQVEyMkQsT0FBT2g1SSxNQUFQLENBQWMrNkksVUFBZCxDQUEyQi9CLE9BQU9oNUksTUFBUCxDQUFjZzdJLFdBSjBDLENBQTNDLENBQWxELEVBT0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztLQTRCQSxxQkFFQSxTQUFVbEQsY0FBVixDQUEwQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0F3QnhCLFlBQUEsRUFBZSxDQUNiLFdBQWFyM0ksVUFBVTFELE1BQVYsQ0FBbUIsQ0FBbkIsRUFBd0IwRCxVQUFVLENBQVYsSUFBaUIvRSxTQUF6QyxDQUFxRCtFLFVBQVUsQ0FBVixDQUFyRCxDQUFvRSxFQUFqRixDQUVBMnZJLGVBQWUsSUFBZixDQUFxQitLLEdBQXJCLEVBRUEsaUNBQWlDLElBQTFCLENBQWdDbkwsaUJBQWlCbUwsR0FBakIsRUFBc0JuakosSUFBdEIsQ0FBMkIsSUFBM0IsQ0FBaUNtK0YsTUFBakMsQ0FBeUNnbEQsSUFBSTdGLFFBQTdDLENBQXVENkYsSUFBSTU5SCxZQUEzRCxDQUFoQyxDQUFQLENBQ0QsQ0FDRDs7Ozs7O09BU0FnMEgsWUFBWTRKLEdBQVosQ0FBaUIsQ0FBQyxDQUNoQnQrSSxJQUFLLE9BRFcsQ0FFaEI5QyxNQUFPLGNBQUEsRUFBaUIsQ0FDdEIsV0FBYTBHLFVBQVUxRCxNQUFWLENBQW1CLENBQW5CLEVBQXdCMEQsVUFBVSxDQUFWLElBQWlCL0UsU0FBekMsQ0FBcUQrRSxVQUFVLENBQVYsQ0FBckQsQ0FBb0UsS0FBSzAxRixNQUF0RixDQUVBLHNCQUF3QixLQUFLdTdDLFdBQUwsQ0FBaUIsQ0FDdkNyMEcsU0FBVSxLQUFLKzlHLGFBQUwsQ0FBbUJqbEQsTUFBbkIsQ0FENkIsQ0FFdkM5OEMsU0FBVTg4QyxPQUFPOThDLFFBRnNCLENBQWpCLENBQXhCLENBSUloYyxTQUFXMjZHLGtCQUFrQjM2RyxRQUpqQyxDQUtJZ2MsU0FBVzIrRixrQkFBa0IzK0YsUUFMakMsQ0FPQSxZQUFZcTRGLFdBQUwsQ0FBaUIsQ0FDdEJweUYsS0FBTSxRQUFBLENBQVNqaUIsUUFBVCxDQUFtQmdjLFFBQW5CLENBRGdCLENBQWpCLEVBRUppRyxJQUZILENBR0QsQ0FmZSxDQUFELENBZ0JkLENBQ0R6aUQsSUFBSyxlQURKLENBRUQ5QyxNQUFPLHNCQUFBLEVBQXlCLENBQzlCLFdBQWEwRyxVQUFVMUQsTUFBVixDQUFtQixDQUFuQixFQUF3QjBELFVBQVUsQ0FBVixJQUFpQi9FLFNBQXpDLENBQXFEK0UsVUFBVSxDQUFWLENBQXJELENBQW9FLEVBQWpGLENBQ0EsYUFBZSxJQUFLMDFGLE9BQU81aUQsTUFBUCxDQUFnQmlVLGlCQUFoQixDQUFvQ2pCLFdBQXpDLEVBQXNENHZDLE9BQU85NEQsUUFBUCxDQUFnQmxFLEtBQXRFLENBQTZFZzlELE9BQU85NEQsUUFBUCxDQUFnQmpFLE1BQTdGLENBQXFHKzhELE9BQU85NEQsUUFBUCxDQUFnQjZVLEtBQXJILENBQTRIaWtELE9BQU85NEQsUUFBUCxDQUFnQitvQixhQUE1SSxDQUEySit2QyxPQUFPOTRELFFBQVAsQ0FBZ0JncEIsY0FBM0ssQ0FBMkw4dkMsT0FBTzk0RCxRQUFQLENBQWdCaXBCLGFBQTNNLENBQWYsQ0FDQSxlQUFBLENBQ0QsQ0FOQSxDQWhCYyxDQUFqQixFQXlCQW1xRixTQUFTMEssR0FBVCxDQUFjckQsY0FBZCxFQUVBLFVBQUEsQ0FDRCxDQXBFRCxDQW9FRUwsYUFwRUYsQ0FGQSxDQXdFQWo5SCxpQkFBaUJBLGlCQUFpQjJnSSxHQUFqQixDQUFzQixVQUF0QixDQUFrQ3RGLGFBQWEsRUFBYixDQUFpQjRCLGNBQWNuQyxRQUEvQixDQUF5QyxDQUMxRmo0RyxTQUFVLENBQ1JsRSxNQUFPLENBREMsQ0FFUkMsT0FBUSxDQUZBLENBR1I4WSxNQUFPLENBSEMsQ0FJUmtVLGNBQWUsQ0FKUCxDQUtSQyxlQUFnQixDQUxSLENBTVJDLGNBQWUsQ0FOUCxDQURnRixDQUF6QyxDQUFsQyxDQUFqQixDQVNLLGNBVEwsQ0FTcUJ1dkYsYUFBYSxFQUFiLENBQWlCNEIsY0FBY2w2SCxZQUEvQixDQUE2QyxDQUNoRThmLFNBQVUsQ0FBQyxPQUFELENBQVUsUUFBVixDQUFvQixPQUFwQixDQUE2QixlQUE3QixDQUE4QyxnQkFBOUMsQ0FBZ0UsZ0JBQWhFLENBRHNELENBQTdDLENBVHJCLEVBYUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0tBeUJBLHdCQUVBLFNBQVV5NkcsY0FBVixDQUEwQjs7Ozs7Ozs7Ozs7Ozs7Ozs7O09Bc0J4QixlQUFBLEVBQWtCLENBQ2hCLFdBQWFyM0ksVUFBVTFELE1BQVYsQ0FBbUIsQ0FBbkIsRUFBd0IwRCxVQUFVLENBQVYsSUFBaUIvRSxTQUF6QyxDQUFxRCtFLFVBQVUsQ0FBVixDQUFyRCxDQUFvRSxFQUFqRixDQUVBMnZJLGVBQWUsSUFBZixDQUFxQmlMLE1BQXJCLEVBRUEsaUNBQWlDLElBQTFCLENBQWdDckwsaUJBQWlCcUwsTUFBakIsRUFBeUJyakosSUFBekIsQ0FBOEIsSUFBOUIsQ0FBb0NtK0YsTUFBcEMsQ0FBNENrbEQsT0FBTy9GLFFBQW5ELENBQTZEK0YsT0FBTzk5SCxZQUFwRSxDQUFoQyxDQUFQLENBQ0QsQ0FDRDs7Ozs7O09BU0FnMEgsWUFBWThKLE1BQVosQ0FBb0IsQ0FBQyxDQUNuQngrSSxJQUFLLE9BRGMsQ0FFbkI5QyxNQUFPLGNBQUEsRUFBaUIsQ0FDdEIsV0FBYTBHLFVBQVUxRCxNQUFWLENBQW1CLENBQW5CLEVBQXdCMEQsVUFBVSxDQUFWLElBQWlCL0UsU0FBekMsQ0FBcUQrRSxVQUFVLENBQVYsQ0FBckQsQ0FBb0UsS0FBSzAxRixNQUF0RixDQUVBLHNCQUF3QixLQUFLdTdDLFdBQUwsQ0FBaUIsQ0FDdkNyMEcsU0FBVSxLQUFLKzlHLGFBQUwsQ0FBbUJqbEQsTUFBbkIsQ0FENkIsQ0FFdkM5OEMsU0FBVTg4QyxPQUFPOThDLFFBRnNCLENBQWpCLENBQXhCLENBSUloYyxTQUFXMjZHLGtCQUFrQjM2RyxRQUpqQyxDQUtJZ2MsU0FBVzIrRixrQkFBa0IzK0YsUUFMakMsQ0FPQSxZQUFZcTRGLFdBQUwsQ0FBaUIsQ0FDdEJweUYsS0FBTSxRQUFBLENBQVNqaUIsUUFBVCxDQUFtQmdjLFFBQW5CLENBRGdCLENBQWpCLEVBRUppRyxJQUZILENBR0QsQ0Fma0IsQ0FBRCxDQWdCakIsQ0FDRHppRCxJQUFLLGVBREosQ0FFRDlDLE1BQU8sc0JBQUEsRUFBeUIsQ0FDOUIsV0FBYTBHLFVBQVUxRCxNQUFWLENBQW1CLENBQW5CLEVBQXdCMEQsVUFBVSxDQUFWLElBQWlCL0UsU0FBekMsQ0FBcUQrRSxVQUFVLENBQVYsQ0FBckQsQ0FBb0UsRUFBakYsQ0FDQSxhQUFlLElBQUswMUYsT0FBTzVpRCxNQUFQLENBQWdCODFELG9CQUFoQixDQUF1Q0QsY0FBNUMsRUFBNERqVCxPQUFPOTRELFFBQVAsQ0FBZ0J2SCxNQUE1RSxDQUFvRnFnRSxPQUFPOTRELFFBQVAsQ0FBZ0I0cEUsUUFBcEcsQ0FBOEc5USxPQUFPOTRELFFBQVAsQ0FBZ0I0b0UsVUFBOUgsQ0FBMEk5UCxPQUFPOTRELFFBQVAsQ0FBZ0I2b0UsV0FBMUosQ0FBZixDQUNBLGVBQUEsQ0FDRCxDQU5BLENBaEJpQixDQUFwQixFQXlCQXVxQyxTQUFTNEssTUFBVCxDQUFpQnZELGNBQWpCLEVBRUEsYUFBQSxDQUNELENBbEVELENBa0VFTCxhQWxFRixDQUZBLENBc0VBajlILGlCQUFpQkEsaUJBQWlCNmdJLE1BQWpCLENBQXlCLFVBQXpCLENBQXFDeEYsYUFBYSxFQUFiLENBQWlCNEIsY0FBY25DLFFBQS9CLENBQXlDLENBQzdGajRHLFNBQVUsQ0FDUnZILE9BQVEsRUFEQSxDQUVSbXhFLFNBQVUsQ0FGRixDQUdSaEIsV0FBWSxDQUhKLENBSVJDLFlBQWFqbkcsS0FBSytmLEVBQUwsQ0FBVSxDQUpmLENBRG1GLENBQXpDLENBQXJDLENBQWpCLENBT0ssY0FQTCxDQU9xQjYySCxhQUFhLEVBQWIsQ0FBaUI0QixjQUFjbDZILFlBQS9CLENBQTZDLENBQ2hFOGYsU0FBVSxDQUFDLFFBQUQsQ0FBVyxVQUFYLENBQXVCLFlBQXZCLENBQXFDLGFBQXJDLENBRHNELENBQTdDLENBUHJCLEVBV0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7S0EyQkEsc0JBRUEsU0FBVXk2RyxjQUFWLENBQTBCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09BbUN4QixhQUFBLEVBQWdCLENBQ2QsU0FBQSxDQUVBLFdBQWFyM0ksVUFBVTFELE1BQVYsQ0FBbUIsQ0FBbkIsRUFBd0IwRCxVQUFVLENBQVYsSUFBaUIvRSxTQUF6QyxDQUFxRCtFLFVBQVUsQ0FBVixDQUFyRCxDQUFvRSxFQUFqRixDQUVBMnZJLGVBQWUsSUFBZixDQUFxQmtMLElBQXJCLEVBRUFqeUQsTUFBUWluRCwwQkFBMEIsSUFBMUIsQ0FBZ0NOLGlCQUFpQnNMLElBQWpCLEVBQXVCdGpKLElBQXZCLENBQTRCLElBQTVCLENBQWtDbStGLE1BQWxDLENBQTBDbWxELEtBQUtoRyxRQUEvQyxDQUF5RGdHLEtBQUsvOUgsWUFBOUQsQ0FBaEMsQ0FBUixDQUVBLEdBQUk0NEUsT0FBTytoRCxLQUFYLENBQWtCLENBQ2hCN3VELE1BQU02dUQsS0FBTixDQUFZL2hELE1BQVosRUFFQW9sRCxNQUFNdkwsaUJBQWlCc0wsS0FBS2hsSixTQUF0QixDQUFOLENBQXdDLE1BQXhDLENBQWdEaS9JLHNCQUFzQmxzRCxLQUF0QixDQUFoRCxFQUE4RXJ4RixJQUE5RSxDQUFtRnU5SSxzQkFBc0Jsc0QsS0FBdEIsQ0FBbkYsRUFDRCxDQUVELFlBQUEsQ0FDRCxDQUNEOzs7Ozs7T0FTQWtvRCxZQUFZK0osSUFBWixDQUFrQixDQUFDLENBQ2pCeitJLElBQUssT0FEWSxDQUVqQjlDLE1BQU8sY0FBQSxFQUFpQixDQUN0QixXQUFhMEcsVUFBVTFELE1BQVYsQ0FBbUIsQ0FBbkIsRUFBd0IwRCxVQUFVLENBQVYsSUFBaUIvRSxTQUF6QyxDQUFxRCtFLFVBQVUsQ0FBVixDQUFyRCxDQUFvRSxLQUFLMDFGLE1BQXRGLENBRUEsc0JBQXdCLEtBQUt1N0MsV0FBTCxDQUFpQixDQUN2Q3IwRyxTQUFVLEtBQUsrOUcsYUFBTCxDQUFtQmpsRCxNQUFuQixDQUQ2QixDQUV2Qzk4QyxTQUFVODhDLE9BQU85OEMsUUFGc0IsQ0FBakIsQ0FBeEIsQ0FJSWhjLFNBQVcyNkcsa0JBQWtCMzZHLFFBSmpDLENBS0lnYyxTQUFXMitGLGtCQUFrQjMrRixRQUxqQyxDQU9BLFlBQVlxNEYsV0FBTCxDQUFpQixDQUN0QnB5RixLQUFNLFFBQUEsQ0FBU2ppQixRQUFULENBQW1CZ2MsUUFBbkIsQ0FEZ0IsQ0FBakIsRUFFSmlHLElBRkgsQ0FHRCxDQWZnQixDQUFELENBZ0JmLENBQ0R6aUQsSUFBSyxlQURKLENBRUQ5QyxNQUFPLHNCQUFBLEVBQXlCLENBQzlCLFdBQWEwRyxVQUFVMUQsTUFBVixDQUFtQixDQUFuQixFQUF3QjBELFVBQVUsQ0FBVixJQUFpQi9FLFNBQXpDLENBQXFEK0UsVUFBVSxDQUFWLENBQXJELENBQW9FLEVBQWpGLENBQ0EsYUFBZSxJQUFLMDFGLE9BQU81aUQsTUFBUCxDQUFnQjQxRCxrQkFBaEIsQ0FBcUNELFlBQTFDLEVBQXdEL1MsT0FBTzk0RCxRQUFQLENBQWdCdkgsTUFBeEUsQ0FBZ0ZxZ0UsT0FBTzk0RCxRQUFQLENBQWdCakUsTUFBaEcsQ0FBd0crOEQsT0FBTzk0RCxRQUFQLENBQWdCbStHLGNBQXhILENBQXdJcmxELE9BQU85NEQsUUFBUCxDQUFnQmdwQixjQUF4SixDQUF3Szh2QyxPQUFPOTRELFFBQVAsQ0FBZ0JpckUsU0FBeEwsQ0FBbU1uUyxPQUFPOTRELFFBQVAsQ0FBZ0I0b0UsVUFBbk4sQ0FBK045UCxPQUFPOTRELFFBQVAsQ0FBZ0I2b0UsV0FBL08sQ0FBZixDQUNBLGVBQUEsQ0FDRCxDQU5BLENBaEJlLENBQWxCLEVBeUJBdXFDLFNBQVM2SyxJQUFULENBQWV4RCxjQUFmLEVBRUEsV0FBQSxDQUNELENBekZELENBeUZFTCxhQXpGRixDQUZBLENBNkZBajlILGlCQUFpQkEsaUJBQWlCOGdJLElBQWpCLENBQXVCLFVBQXZCLENBQW1DekYsYUFBYSxFQUFiLENBQWlCNEIsY0FBY25DLFFBQS9CLENBQXlDLENBQzNGajRHLFNBQVUsQ0FDUnZILE9BQVEsRUFEQSxDQUVSc0QsT0FBUSxHQUZBLENBR1JvaUgsZUFBZ0IsRUFIUixDQUlSbjFGLGVBQWdCLENBSlIsQ0FLUmlpRCxVQUFXLEtBTEgsQ0FNUnJDLFdBQVksQ0FOSixDQU9SQyxZQUFham5HLEtBQUsrZixFQUFMLENBQVUsQ0FQZixDQURpRixDQUF6QyxDQUFuQyxDQUFqQixDQVVLLGNBVkwsQ0FVcUI2MkgsYUFBYSxFQUFiLENBQWlCNEIsY0FBY2w2SCxZQUEvQixDQUE2QyxDQUNoRThmLFNBQVUsQ0FBQyxRQUFELENBQVcsUUFBWCxDQUFxQixnQkFBckIsQ0FBdUMsZ0JBQXZDLENBQXlELFdBQXpELENBQXNFLFlBQXRFLENBQW9GLGFBQXBGLENBRHNELENBQTdDLENBVnJCLEVBY0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7S0EyQkEsMEJBRUEsU0FBVXk2RyxjQUFWLENBQTBCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0FxQ3hCLGlCQUFBLEVBQW9CLENBQ2xCLFNBQUEsQ0FFQSxXQUFhcjNJLFVBQVUxRCxNQUFWLENBQW1CLENBQW5CLEVBQXdCMEQsVUFBVSxDQUFWLElBQWlCL0UsU0FBekMsQ0FBcUQrRSxVQUFVLENBQVYsQ0FBckQsQ0FBb0UsRUFBakYsQ0FFQTJ2SSxlQUFlLElBQWYsQ0FBcUJxTCxRQUFyQixFQUVBcHlELE1BQVFpbkQsMEJBQTBCLElBQTFCLENBQWdDTixpQkFBaUJ5TCxRQUFqQixFQUEyQnpqSixJQUEzQixDQUFnQyxJQUFoQyxDQUFzQ20rRixNQUF0QyxDQUE4Q3NsRCxTQUFTbkcsUUFBdkQsQ0FBaUVtRyxTQUFTbCtILFlBQTFFLENBQWhDLENBQVIsQ0FFQSxHQUFJNDRFLE9BQU8raEQsS0FBWCxDQUFrQixDQUNoQjd1RCxNQUFNNnVELEtBQU4sQ0FBWS9oRCxNQUFaLEVBRUFvbEQsTUFBTXZMLGlCQUFpQnlMLFNBQVNubEosU0FBMUIsQ0FBTixDQUE0QyxNQUE1QyxDQUFvRGkvSSxzQkFBc0Jsc0QsS0FBdEIsQ0FBcEQsRUFBa0ZyeEYsSUFBbEYsQ0FBdUZ1OUksc0JBQXNCbHNELEtBQXRCLENBQXZGLEVBQ0QsQ0FFRCxZQUFBLENBQ0QsQ0FDRDs7Ozs7O09BU0Frb0QsWUFBWWtLLFFBQVosQ0FBc0IsQ0FBQyxDQUNyQjUrSSxJQUFLLE9BRGdCLENBRXJCOUMsTUFBTyxjQUFBLEVBQWlCLENBQ3RCLFdBQWEwRyxVQUFVMUQsTUFBVixDQUFtQixDQUFuQixFQUF3QjBELFVBQVUsQ0FBVixJQUFpQi9FLFNBQXpDLENBQXFEK0UsVUFBVSxDQUFWLENBQXJELENBQW9FLEtBQUswMUYsTUFBdEYsQ0FFQSxzQkFBd0IsS0FBS3U3QyxXQUFMLENBQWlCLENBQ3ZDcjBHLFNBQVUsS0FBSys5RyxhQUFMLENBQW1CamxELE1BQW5CLENBRDZCLENBRXZDOThDLFNBQVU4OEMsT0FBTzk4QyxRQUZzQixDQUFqQixDQUF4QixDQUlJaGMsU0FBVzI2RyxrQkFBa0IzNkcsUUFKakMsQ0FLSWdjLFNBQVcyK0Ysa0JBQWtCMytGLFFBTGpDLENBT0EsWUFBWXE0RixXQUFMLENBQWlCLENBQ3RCcHlGLEtBQU0sUUFBQSxDQUFTamlCLFFBQVQsQ0FBbUJnYyxRQUFuQixDQURnQixDQUFqQixFQUVKaUcsSUFGSCxDQUdELENBZm9CLENBQUQsQ0FnQm5CLENBQ0R6aUQsSUFBSyxlQURKLENBRUQ5QyxNQUFPLHNCQUFBLEVBQXlCLENBQzlCLFdBQWEwRyxVQUFVMUQsTUFBVixDQUFtQixDQUFuQixFQUF3QjBELFVBQVUsQ0FBVixJQUFpQi9FLFNBQXpDLENBQXFEK0UsVUFBVSxDQUFWLENBQXJELENBQW9FLEVBQWpGLENBQ0EsYUFBZSxJQUFLMDFGLE9BQU81aUQsTUFBUCxDQUFnQjAxRCxzQkFBaEIsQ0FBeUNWLGdCQUE5QyxFQUFnRXBTLE9BQU85NEQsUUFBUCxDQUFnQitxRSxTQUFoRixDQUEyRmpTLE9BQU85NEQsUUFBUCxDQUFnQmdyRSxZQUEzRyxDQUF5SGxTLE9BQU85NEQsUUFBUCxDQUFnQmpFLE1BQXpJLENBQWlKKzhELE9BQU85NEQsUUFBUCxDQUFnQm0rRyxjQUFqSyxDQUFpTHJsRCxPQUFPOTRELFFBQVAsQ0FBZ0JncEIsY0FBak0sQ0FBaU44dkMsT0FBTzk0RCxRQUFQLENBQWdCaXJFLFNBQWpPLENBQTRPblMsT0FBTzk0RCxRQUFQLENBQWdCNG9FLFVBQTVQLENBQXdROVAsT0FBTzk0RCxRQUFQLENBQWdCNm9FLFdBQXhSLENBQWYsQ0FDQSxlQUFBLENBQ0QsQ0FOQSxDQWhCbUIsQ0FBdEIsRUF5QkF1cUMsU0FBU2dMLFFBQVQsQ0FBbUIzRCxjQUFuQixFQUVBLGVBQUEsQ0FDRCxDQTNGRCxDQTJGRUwsYUEzRkYsQ0FGQSxDQStGQWo5SCxpQkFBaUJBLGlCQUFpQmloSSxRQUFqQixDQUEyQixVQUEzQixDQUF1QzVGLGFBQWEsRUFBYixDQUFpQjRCLGNBQWNuQyxRQUEvQixDQUF5QyxDQUMvRmo0RyxTQUFVLENBQ1IrcUUsVUFBVyxDQURILENBRVJDLGFBQWMsQ0FGTixDQUdSanZFLE9BQVEsQ0FIQSxDQUlSb2lILGVBQWdCLEVBSlIsQ0FLUm4xRixlQUFnQixDQUxSLENBTVJpaUQsVUFBVyxLQU5ILENBT1JyQyxXQUFZLENBUEosQ0FRUkMsWUFBYWpuRyxLQUFLK2YsRUFBTCxDQUFVLENBUmYsQ0FEcUYsQ0FBekMsQ0FBdkMsQ0FBakIsQ0FXSyxjQVhMLENBV3FCNjJILGFBQWEsRUFBYixDQUFpQjRCLGNBQWNsNkgsWUFBL0IsQ0FBNkMsQ0FDaEU4ZixTQUFVLENBQUMsV0FBRCxDQUFjLGNBQWQsQ0FBOEIsUUFBOUIsQ0FBd0MsZ0JBQXhDLENBQTBELGdCQUExRCxDQUE0RSxXQUE1RSxDQUF5RixZQUF6RixDQUF1RyxhQUF2RyxDQURzRCxDQUE3QyxDQVhyQixFQWVBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7S0E2QkEsOEJBRUEsU0FBVXk2RyxjQUFWLENBQTBCOzs7Ozs7Ozs7Ozs7Ozs7OztPQXFCeEIscUJBQUEsRUFBd0IsQ0FDdEIsU0FBQSxDQUVBLFdBQWFyM0ksVUFBVTFELE1BQVYsQ0FBbUIsQ0FBbkIsRUFBd0IwRCxVQUFVLENBQVYsSUFBaUIvRSxTQUF6QyxDQUFxRCtFLFVBQVUsQ0FBVixDQUFyRCxDQUFvRSxFQUFqRixDQUVBMnZJLGVBQWUsSUFBZixDQUFxQnNMLFlBQXJCLEVBRUFyeUQsTUFBUWluRCwwQkFBMEIsSUFBMUIsQ0FBZ0NOLGlCQUFpQjBMLFlBQWpCLEVBQStCMWpKLElBQS9CLENBQW9DLElBQXBDLENBQTBDbStGLE1BQTFDLENBQWtEdWxELGFBQWFwRyxRQUEvRCxDQUF5RW9HLGFBQWFuK0gsWUFBdEYsQ0FBaEMsQ0FBUixDQUVBLEdBQUk0NEUsT0FBTytoRCxLQUFYLENBQWtCLENBQ2hCN3VELE1BQU02dUQsS0FBTixDQUFZL2hELE1BQVosRUFFQW9sRCxNQUFNdkwsaUJBQWlCMEwsYUFBYXBsSixTQUE5QixDQUFOLENBQWdELE1BQWhELENBQXdEaS9JLHNCQUFzQmxzRCxLQUF0QixDQUF4RCxFQUFzRnJ4RixJQUF0RixDQUEyRnU5SSxzQkFBc0Jsc0QsS0FBdEIsQ0FBM0YsRUFDRCxDQUVELFlBQUEsQ0FDRCxDQUNEOzs7Ozs7T0FTQWtvRCxZQUFZbUssWUFBWixDQUEwQixDQUFDLENBQ3pCNytJLElBQUssT0FEb0IsQ0FFekI5QyxNQUFPLGNBQUEsRUFBaUIsQ0FDdEIsV0FBYTBHLFVBQVUxRCxNQUFWLENBQW1CLENBQW5CLEVBQXdCMEQsVUFBVSxDQUFWLElBQWlCL0UsU0FBekMsQ0FBcUQrRSxVQUFVLENBQVYsQ0FBckQsQ0FBb0UsS0FBSzAxRixNQUF0RixDQUVBLHNCQUF3QixLQUFLdTdDLFdBQUwsQ0FBaUIsQ0FDdkNyMEcsU0FBVSxLQUFLKzlHLGFBQUwsQ0FBbUJqbEQsTUFBbkIsQ0FENkIsQ0FFdkM5OEMsU0FBVTg4QyxPQUFPOThDLFFBRnNCLENBQWpCLENBQXhCLENBSUloYyxTQUFXMjZHLGtCQUFrQjM2RyxRQUpqQyxDQUtJZ2MsU0FBVzIrRixrQkFBa0IzK0YsUUFMakMsQ0FPQSxZQUFZcTRGLFdBQUwsQ0FBaUIsQ0FDdEJweUYsS0FBTSxRQUFBLENBQVNqaUIsUUFBVCxDQUFtQmdjLFFBQW5CLENBRGdCLENBQWpCLEVBRUppRyxJQUZILENBR0QsQ0Fmd0IsQ0FBRCxDQWdCdkIsQ0FDRHppRCxJQUFLLGVBREosQ0FFRDlDLE1BQU8sc0JBQUEsRUFBeUIsQ0FDOUIsV0FBYTBHLFVBQVUxRCxNQUFWLENBQW1CLENBQW5CLEVBQXdCMEQsVUFBVSxDQUFWLElBQWlCL0UsU0FBekMsQ0FBcUQrRSxVQUFVLENBQVYsQ0FBckQsQ0FBb0UsRUFBakYsQ0FDQSxXQUFZMDFGLE9BQU81aUQsTUFBUCxDQUFnQm1tRCwwQkFBaEIsQ0FBNkNELG9CQUFsRCxFQUF3RXRELE9BQU85NEQsUUFBUCxDQUFnQnZILE1BQXhGLENBQWdHcWdFLE9BQU85NEQsUUFBUCxDQUFnQnk2RCxNQUFoSCxDQUFQLENBQ0QsQ0FMQSxDQWhCdUIsQ0FBMUIsRUF3QkEyNEMsU0FBU2lMLFlBQVQsQ0FBdUI1RCxjQUF2QixFQUVBLG1CQUFBLENBQ0QsQ0ExRUQsQ0EwRUVMLGFBMUVGLENBRkEsQ0E4RUFqOUgsaUJBQWlCQSxpQkFBaUJraEksWUFBakIsQ0FBK0IsVUFBL0IsQ0FBMkM3RixhQUFhLEVBQWIsQ0FBaUI0QixjQUFjbkMsUUFBL0IsQ0FBeUMsQ0FDbkdqNEcsU0FBVSxDQUNSdkgsT0FBUSxDQURBLENBRVJnaUUsT0FBUSxDQUZBLENBRHlGLENBQXpDLENBQTNDLENBQWpCLENBS0ssY0FMTCxDQUtxQis5QyxhQUFhLEVBQWIsQ0FBaUI0QixjQUFjbDZILFlBQS9CLENBQTZDLENBQ2hFOGYsU0FBVSxDQUFDLFFBQUQsQ0FBVyxRQUFYLENBRHNELENBQTdDLENBTHJCLEVBU0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztLQWtEQSx5QkFFQSxTQUFVeTZHLGNBQVYsQ0FBMEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQXlCeEIsZ0JBQUEsRUFBbUIsQ0FDakIsU0FBQSxDQUVBLFdBQWFyM0ksVUFBVTFELE1BQVYsQ0FBbUIsQ0FBbkIsRUFBd0IwRCxVQUFVLENBQVYsSUFBaUIvRSxTQUF6QyxDQUFxRCtFLFVBQVUsQ0FBVixDQUFyRCxDQUFvRSxFQUFqRixDQUVBMnZJLGVBQWUsSUFBZixDQUFxQnVMLE9BQXJCLEVBRUF0eUQsTUFBUWluRCwwQkFBMEIsSUFBMUIsQ0FBZ0NOLGlCQUFpQjJMLE9BQWpCLEVBQTBCM2pKLElBQTFCLENBQStCLElBQS9CLENBQXFDbStGLE1BQXJDLENBQTZDd2xELFFBQVFyRyxRQUFyRCxDQUErRHFHLFFBQVFwK0gsWUFBdkUsQ0FBaEMsQ0FBUixDQUVBLEdBQUk0NEUsT0FBTytoRCxLQUFYLENBQWtCLENBQ2hCN3VELE1BQU02dUQsS0FBTixDQUFZL2hELE1BQVosRUFFQW9sRCxNQUFNdkwsaUJBQWlCMkwsUUFBUXJsSixTQUF6QixDQUFOLENBQTJDLE1BQTNDLENBQW1EaS9JLHNCQUFzQmxzRCxLQUF0QixDQUFuRCxFQUFpRnJ4RixJQUFqRixDQUFzRnU5SSxzQkFBc0Jsc0QsS0FBdEIsQ0FBdEYsRUFDRCxDQUVELFlBQUEsQ0FDRCxDQUNEOzs7Ozs7T0FTQWtvRCxZQUFZb0ssT0FBWixDQUFxQixDQUFDLENBQ3BCOStJLElBQUssT0FEZSxDQUVwQjlDLE1BQU8sY0FBQSxFQUFpQixDQUN0QixXQUFhMEcsVUFBVTFELE1BQVYsQ0FBbUIsQ0FBbkIsRUFBd0IwRCxVQUFVLENBQVYsSUFBaUIvRSxTQUF6QyxDQUFxRCtFLFVBQVUsQ0FBVixDQUFyRCxDQUFvRSxLQUFLMDFGLE1BQXRGLENBRUEsc0JBQXdCLEtBQUt1N0MsV0FBTCxDQUFpQixDQUN2Q3IwRyxTQUFVLEtBQUsrOUcsYUFBTCxDQUFtQmpsRCxNQUFuQixDQUQ2QixDQUV2Qzk4QyxTQUFVODhDLE9BQU85OEMsUUFGc0IsQ0FBakIsQ0FBeEIsQ0FJSWhjLFNBQVcyNkcsa0JBQWtCMzZHLFFBSmpDLENBS0lnYyxTQUFXMitGLGtCQUFrQjMrRixRQUxqQyxDQU9BLFlBQVlxNEYsV0FBTCxDQUFpQixDQUN0QnB5RixLQUFNLFFBQUEsQ0FBU2ppQixRQUFULENBQW1CZ2MsUUFBbkIsQ0FEZ0IsQ0FBakIsRUFFSmlHLElBRkgsQ0FHRCxDQWZtQixDQUFELENBZ0JsQixDQUNEemlELElBQUssZUFESixDQUVEOUMsTUFBTyxzQkFBQSxFQUF5QixDQUM5QixXQUFhMEcsVUFBVTFELE1BQVYsQ0FBbUIsQ0FBbkIsRUFBd0IwRCxVQUFVLENBQVYsSUFBaUIvRSxTQUF6QyxDQUFxRCtFLFVBQVUsQ0FBVixDQUFyRCxDQUFvRSxFQUFqRixDQUNBLGFBQWUsbUJBQUEsQ0FBb0IwMUYsT0FBTzk0RCxRQUFQLENBQWdCMGIsTUFBcEMsQ0FBNENvOUMsT0FBTzk0RCxRQUFQLENBQWdCN0MsT0FBNUQsQ0FBZixDQUNBLGNBQWMrWSxNQUFQLENBQWdCLGtCQUFBLEdBQXFCa1EsWUFBckIsQ0FBa0NwbUIsUUFBbEMsQ0FBaEIsQ0FBOERBLFFBQXJFLENBQ0QsQ0FOQSxDQWhCa0IsQ0FBckIsRUF5QkFvekcsU0FBU2tMLE9BQVQsQ0FBa0I3RCxjQUFsQixFQUVBLGNBQUEsQ0FDRCxDQS9FRCxDQStFRUwsYUEvRUYsQ0FGQSxDQW1GQWo5SCxpQkFBaUJBLGlCQUFpQm1oSSxPQUFqQixDQUEwQixVQUExQixDQUFzQzlGLGFBQWEsRUFBYixDQUFpQjRCLGNBQWNuQyxRQUEvQixDQUF5QyxDQUM5Rmo0RyxTQUFVLENBQ1IwYixPQUFRLEVBREEsQ0FFUnZlLFFBQVMsRUFGRCxDQURvRixDQUF6QyxDQUF0QyxDQUFqQixDQUtLLGNBTEwsQ0FLcUJxN0csYUFBYSxFQUFiLENBQWlCNEIsY0FBY2w2SCxZQUEvQixDQUE2QyxDQUNoRThmLFNBQVUsQ0FBQyxRQUFELENBQVcsU0FBWCxDQURzRCxDQUE3QyxDQUxyQixFQVNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7S0EwQkEsNkJBRUEsU0FBVXk2RyxjQUFWLENBQTBCOzs7Ozs7Ozs7Ozs7Ozs7O09Bb0J4QixvQkFBQSxFQUF1QixDQUNyQixTQUFBLENBRUEsV0FBYXIzSSxVQUFVMUQsTUFBVixDQUFtQixDQUFuQixFQUF3QjBELFVBQVUsQ0FBVixJQUFpQi9FLFNBQXpDLENBQXFEK0UsVUFBVSxDQUFWLENBQXJELENBQW9FLEVBQWpGLENBRUEydkksZUFBZSxJQUFmLENBQXFCd0wsV0FBckIsRUFFQXZ5RCxNQUFRaW5ELDBCQUEwQixJQUExQixDQUFnQ04saUJBQWlCNEwsV0FBakIsRUFBOEI1akosSUFBOUIsQ0FBbUMsSUFBbkMsQ0FBeUNtK0YsTUFBekMsQ0FBaUR5bEQsWUFBWXRHLFFBQTdELENBQXVFc0csWUFBWXIrSCxZQUFuRixDQUFoQyxDQUFSLENBRUEsR0FBSTQ0RSxPQUFPK2hELEtBQVgsQ0FBa0IsQ0FDaEI3dUQsTUFBTTZ1RCxLQUFOLENBQVkvaEQsTUFBWixFQUVBb2xELE1BQU12TCxpQkFBaUI0TCxZQUFZdGxKLFNBQTdCLENBQU4sQ0FBK0MsTUFBL0MsQ0FBdURpL0ksc0JBQXNCbHNELEtBQXRCLENBQXZELEVBQXFGcnhGLElBQXJGLENBQTBGdTlJLHNCQUFzQmxzRCxLQUF0QixDQUExRixFQUNELENBRUQsWUFBQSxDQUNELENBQ0Q7Ozs7OztPQVNBa29ELFlBQVlxSyxXQUFaLENBQXlCLENBQUMsQ0FDeEIvK0ksSUFBSyxPQURtQixDQUV4QjlDLE1BQU8sY0FBQSxFQUFpQixDQUN0QixXQUFhMEcsVUFBVTFELE1BQVYsQ0FBbUIsQ0FBbkIsRUFBd0IwRCxVQUFVLENBQVYsSUFBaUIvRSxTQUF6QyxDQUFxRCtFLFVBQVUsQ0FBVixDQUFyRCxDQUFvRSxLQUFLMDFGLE1BQXRGLENBRUEsc0JBQXdCLEtBQUt1N0MsV0FBTCxDQUFpQixDQUN2Q3IwRyxTQUFVLEtBQUsrOUcsYUFBTCxDQUFtQmpsRCxNQUFuQixDQUQ2QixDQUV2Qzk4QyxTQUFVODhDLE9BQU85OEMsUUFGc0IsQ0FBakIsQ0FBeEIsQ0FJSWhjLFNBQVcyNkcsa0JBQWtCMzZHLFFBSmpDLENBS0lnYyxTQUFXMitGLGtCQUFrQjMrRixRQUxqQyxDQU9BLFlBQVlxNEYsV0FBTCxDQUFpQixDQUN0QnB5RixLQUFNLFFBQUEsQ0FBU2ppQixRQUFULENBQW1CZ2MsUUFBbkIsQ0FEZ0IsQ0FBakIsRUFFSmlHLElBRkgsQ0FHRCxDQWZ1QixDQUFELENBZ0J0QixDQUNEemlELElBQUssZUFESixDQUVEOUMsTUFBTyxzQkFBQSxFQUF5QixDQUM5QixXQUFhMEcsVUFBVTFELE1BQVYsQ0FBbUIsQ0FBbkIsRUFBd0IwRCxVQUFVLENBQVYsSUFBaUIvRSxTQUF6QyxDQUFxRCtFLFVBQVUsQ0FBVixDQUFyRCxDQUFvRSxFQUFqRixDQUNBLFdBQVkwMUYsT0FBTzVpRCxNQUFQLENBQWdCaW1ELHlCQUFoQixDQUE0Q0QsbUJBQWpELEVBQXNFcEQsT0FBTzk0RCxRQUFQLENBQWdCdkgsTUFBdEYsQ0FBOEZxZ0UsT0FBTzk0RCxRQUFQLENBQWdCeTZELE1BQTlHLENBQVAsQ0FDRCxDQUxBLENBaEJzQixDQUF6QixFQXdCQTI0QyxTQUFTbUwsV0FBVCxDQUFzQjlELGNBQXRCLEVBRUEsa0JBQUEsQ0FDRCxDQXpFRCxDQXlFRUwsYUF6RUYsQ0FGQSxDQTZFQWo5SCxpQkFBaUJBLGlCQUFpQm9oSSxXQUFqQixDQUE4QixVQUE5QixDQUEwQy9GLGFBQWEsRUFBYixDQUFpQjRCLGNBQWNuQyxRQUEvQixDQUF5QyxDQUNsR2o0RyxTQUFVLENBQ1J2SCxPQUFRLENBREEsQ0FFUmdpRSxPQUFRLENBRkEsQ0FEd0YsQ0FBekMsQ0FBMUMsQ0FBakIsQ0FLSyxjQUxMLENBS3FCKzlDLGFBQWEsRUFBYixDQUFpQjRCLGNBQWNsNkgsWUFBL0IsQ0FBNkMsQ0FDaEU4ZixTQUFVLENBQUMsUUFBRCxDQUFXLFFBQVgsQ0FEc0QsQ0FBN0MsQ0FMckIsRUFTQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztLQXVDQSx1QkFFQSxTQUFVeTZHLGNBQVYsQ0FBMEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0F1QnhCLGNBQUEsRUFBaUIsQ0FDZixTQUFBLENBRUEsV0FBYXIzSSxVQUFVMUQsTUFBVixDQUFtQixDQUFuQixFQUF3QjBELFVBQVUsQ0FBVixJQUFpQi9FLFNBQXpDLENBQXFEK0UsVUFBVSxDQUFWLENBQXJELENBQW9FLEVBQWpGLENBRUEydkksZUFBZSxJQUFmLENBQXFCeUwsS0FBckIsRUFFQXh5RCxNQUFRaW5ELDBCQUEwQixJQUExQixDQUFnQ04saUJBQWlCNkwsS0FBakIsRUFBd0I3akosSUFBeEIsQ0FBNkIsSUFBN0IsQ0FBbUNtK0YsTUFBbkMsQ0FBMkMwbEQsTUFBTXZHLFFBQWpELENBQTJEdUcsTUFBTXQrSCxZQUFqRSxDQUFoQyxDQUFSLENBRUEsR0FBSTQ0RSxPQUFPK2hELEtBQVgsQ0FBa0IsQ0FDaEI3dUQsTUFBTTZ1RCxLQUFOLENBQVkvaEQsTUFBWixFQUVBb2xELE1BQU12TCxpQkFBaUI2TCxNQUFNdmxKLFNBQXZCLENBQU4sQ0FBeUMsTUFBekMsQ0FBaURpL0ksc0JBQXNCbHNELEtBQXRCLENBQWpELEVBQStFcnhGLElBQS9FLENBQW9GdTlJLHNCQUFzQmxzRCxLQUF0QixDQUFwRixFQUNELENBRUQsWUFBQSxDQUNELENBQ0Q7Ozs7OztPQVNBa29ELFlBQVlzSyxLQUFaLENBQW1CLENBQUMsQ0FDbEJoL0ksSUFBSyxPQURhLENBRWxCOUMsTUFBTyxjQUFBLEVBQWlCLENBQ3RCLFdBQWEwRyxVQUFVMUQsTUFBVixDQUFtQixDQUFuQixFQUF3QjBELFVBQVUsQ0FBVixJQUFpQi9FLFNBQXpDLENBQXFEK0UsVUFBVSxDQUFWLENBQXJELENBQW9FLEtBQUswMUYsTUFBdEYsQ0FFQSxzQkFBd0IsS0FBS3U3QyxXQUFMLENBQWlCLENBQ3ZDcjBHLFNBQVUsS0FBSys5RyxhQUFMLENBQW1CamxELE1BQW5CLENBRDZCLENBRXZDOThDLFNBQVU4OEMsT0FBTzk4QyxRQUZzQixDQUFqQixDQUF4QixDQUlJaGMsU0FBVzI2RyxrQkFBa0IzNkcsUUFKakMsQ0FLSWdjLFNBQVcyK0Ysa0JBQWtCMytGLFFBTGpDLENBT0EsWUFBWXE0RixXQUFMLENBQWlCLENBQ3RCcHlGLEtBQU0sUUFBQSxDQUFTamlCLFFBQVQsQ0FBbUJnYyxRQUFuQixDQURnQixDQUFqQixFQUVKaUcsSUFGSCxDQUdELENBZmlCLENBQUQsQ0FnQmhCLENBQ0R6aUQsSUFBSyxlQURKLENBRUQ5QyxNQUFPLHNCQUFBLEVBQXlCLENBQzlCLFdBQWEwRyxVQUFVMUQsTUFBVixDQUFtQixDQUFuQixFQUF3QjBELFVBQVUsQ0FBVixJQUFpQi9FLFNBQXpDLENBQXFEK0UsVUFBVSxDQUFWLENBQXJELENBQW9FLEVBQWpGLENBQ0EsV0FBWTAxRixPQUFPNWlELE1BQVAsQ0FBZ0JnMEQsbUJBQWhCLENBQXNDTCxhQUEzQyxFQUEwRC9RLE9BQU85NEQsUUFBUCxDQUFnQmYsTUFBMUUsQ0FBUCxDQUNELENBTEEsQ0FoQmdCLENBQW5CLEVBd0JBbTBHLFNBQVNvTCxLQUFULENBQWdCL0QsY0FBaEIsRUFFQSxZQUFBLENBQ0QsQ0E1RUQsQ0E0RUVMLGFBNUVGLENBRkEsQ0FnRkFqOUgsaUJBQWlCQSxpQkFBaUJxaEksS0FBakIsQ0FBd0IsVUFBeEIsQ0FBb0NoRyxhQUFhLEVBQWIsQ0FBaUI0QixjQUFjbkMsUUFBL0IsQ0FBeUMsQ0FDNUZqNEcsU0FBVSxDQUNSZixPQUFRLEVBREEsQ0FEa0YsQ0FBekMsQ0FBcEMsQ0FBakIsQ0FJSyxjQUpMLENBSXFCdTVHLGFBQWEsRUFBYixDQUFpQjRCLGNBQWNsNkgsWUFBL0IsQ0FBNkMsQ0FDaEU4ZixTQUFVLENBQUMsUUFBRCxDQURzRCxDQUE3QyxDQUpyQixFQVFBOzs7Ozs7Ozs7Ozs7Ozs7OztLQW1CQSx3QkFFQSxTQUFVeTZHLGNBQVYsQ0FBMEI7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQXNCeEIsZ0JBQUEsQ0FBaUIzaEQsTUFBakIsQ0FBeUIsQ0FDdkJpNkMsZUFBZSxJQUFmLENBQXFCMEwsT0FBckIsRUFFQSxpQ0FBaUMsSUFBMUIsQ0FBZ0M5TCxpQkFBaUI4TCxPQUFqQixFQUEwQjlqSixJQUExQixDQUErQixJQUEvQixDQUFxQ20rRixNQUFyQyxDQUE2QzJsRCxRQUFReEcsUUFBckQsQ0FBK0R3RyxRQUFRditILFlBQXZFLENBQWhDLENBQVAsQ0FDRCxDQUNEOzs7Ozs7T0FTQWcwSCxZQUFZdUssT0FBWixDQUFxQixDQUFDLENBQ3BCai9JLElBQUssT0FEZSxDQUVwQjlDLE1BQU8sY0FBQSxFQUFpQixDQUN0QixXQUFhMEcsVUFBVTFELE1BQVYsQ0FBbUIsQ0FBbkIsRUFBd0IwRCxVQUFVLENBQVYsSUFBaUIvRSxTQUF6QyxDQUFxRCtFLFVBQVUsQ0FBVixDQUFyRCxDQUFvRSxLQUFLMDFGLE1BQXRGLENBRUEsc0JBQXdCLEtBQUt1N0MsV0FBTCxDQUFpQixDQUN2Q3IwRyxTQUFVLEtBQUsrOUcsYUFBTCxDQUFtQmpsRCxNQUFuQixDQUQ2QixDQUV2Qzk4QyxTQUFVODhDLE9BQU85OEMsUUFGc0IsQ0FBakIsQ0FBeEIsQ0FJSWhjLFNBQVcyNkcsa0JBQWtCMzZHLFFBSmpDLENBS0lnYyxTQUFXMitGLGtCQUFrQjMrRixRQUxqQyxDQU9BLFlBQVlxNEYsV0FBTCxDQUFpQixDQUN0QnB5RixLQUFNLFFBQUEsQ0FBU2ppQixRQUFULENBQW1CZ2MsUUFBbkIsQ0FEZ0IsQ0FBakIsRUFFSmlHLElBRkgsQ0FHRCxDQWZtQixDQUFELENBZ0JsQixDQUNEemlELElBQUssZUFESixDQUVEOUMsTUFBTyxzQkFBQSxFQUF5QixDQUM5QixXQUFhMEcsVUFBVTFELE1BQVYsQ0FBbUIsQ0FBbkIsRUFBd0IwRCxVQUFVLENBQVYsSUFBaUIvRSxTQUF6QyxDQUFxRCtFLFVBQVUsQ0FBVixDQUFyRCxDQUFvRSxFQUFqRixDQUNBLGFBQWUwMUYsT0FBTzVpRCxNQUFQLENBQWdCLGtCQUFBLEVBQWhCLENBQXVDLFlBQUEsRUFBdEQsQ0FFQSxHQUFJNGlELE9BQU81aUQsTUFBWCxDQUFtQixDQUNqQixPQUFTNGlELE9BQU9nZCxLQUFQLENBQWFwRixTQUFiLENBQXVCNVgsT0FBTzc1RCxNQUE5QixDQUFULENBQ0EsVUFBWSxnQkFBQSxDQUFpQjI2RSxHQUFHbDZHLE1BQUgsQ0FBWSxDQUE3QixDQUFaLENBRUEsSUFBSyxNQUFRLENBQVIsQ0FBV2dILElBQU1rekcsR0FBR2w2RyxNQUF6QixDQUFpQ0ssRUFBSTJHLEdBQXJDLENBQTBDM0csR0FBMUMsQ0FBK0MsQ0FDN0MsT0FBU0EsRUFBSSxDQUFiLENBQ0EyK0ksTUFBTUMsRUFBTixFQUFZL2tDLEdBQUc3NUcsQ0FBSCxFQUFNdVMsQ0FBbEIsQ0FDQW9zSSxNQUFNQyxHQUFLLENBQVgsRUFBZ0Iva0MsR0FBRzc1RyxDQUFILEVBQU0raUIsQ0FBdEIsQ0FDQTQ3SCxNQUFNQyxHQUFLLENBQVgsRUFBZ0Iva0MsR0FBRzc1RyxDQUFILEVBQU00cEIsQ0FBdEIsQ0FDRCxDQUVEcVcsU0FBU29uQixZQUFULENBQXNCLFVBQXRCLENBQWtDLG1CQUFBLENBQW9CczNGLEtBQXBCLENBQTJCLENBQTNCLENBQWxDLEVBQ0QsQ0FaRCxjQVlnQngrRyxRQUFULENBQW9CNDRELE9BQU9nZCxLQUFQLENBQWFwRixTQUFiLENBQXVCNVgsT0FBTzc1RCxNQUE5QixDQUFwQixDQUVQLGVBQUEsQ0FDRCxDQXJCQSxDQWhCa0IsQ0FBckIsRUF3Q0FtMEcsU0FBU3FMLE9BQVQsQ0FBa0JoRSxjQUFsQixFQUVBLGNBQUEsQ0FDRCxDQS9FRCxDQStFRUwsYUEvRUYsQ0FGQSxDQW1GQWo5SCxpQkFBaUJBLGlCQUFpQnloSSxNQUFqQixDQUF5QixVQUF6QixDQUFxQ3BHLGFBQWEsRUFBYixDQUFpQjRCLGNBQWNuQyxRQUEvQixDQUF5QyxDQUM3Rm5pQyxNQUFPLElBRHNGLENBRTdGNzJFLE9BQVEsRUFGcUYsQ0FBekMsQ0FBckMsQ0FBakIsQ0FHSyxjQUhMLENBR3FCdTVHLGFBQWEsRUFBYixDQUFpQjRCLGNBQWNsNkgsWUFBL0IsQ0FBNkMsQ0FDaEU4ZixTQUFVLENBQUMsT0FBRCxDQUFVLFFBQVYsQ0FEc0QsQ0FBN0MsQ0FIckIsRUFPQTs7Ozs7Ozs7Ozs7Ozs7Ozs7S0FtQkEsMEJBRUEsU0FBVXk2RyxjQUFWLENBQTBCLENBQ3hCdkcsWUFBWTJLLFFBQVosQ0FBc0IsSUFBdEIsQ0FBNEIsQ0FBQyxDQUMzQnIvSSxJQUFLLFFBRHNCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztTQTRDM0I5QyxNQUFPLGVBQUEsQ0FBZ0I2QyxNQUFoQixDQUF3QnUvSSxPQUF4QixDQUFpQyxDQUN0QyxrQkFBb0Isc0JBQUEsQ0FBdUJ2L0ksTUFBdkIsQ0FBK0IsQ0FDakRBLE9BQU9rNUMsUUFBUCxDQUFnQi84QyxPQUFoQixDQUF3QixTQUFVcUwsRUFBVixDQUFjSixLQUFkLENBQXFCLENBQzNDLEdBQUlJLEdBQUcweEMsUUFBUCxDQUFpQnNtRyxjQUFjaDRJLEVBQWQsRUFDakIsR0FBSSxDQUFDKzNJLFFBQVEvM0ksRUFBUixDQUFMLENBQWtCeEgsT0FBT2s1QyxRQUFQLENBQWdCcDNCLE1BQWhCLENBQXVCMWEsS0FBdkIsQ0FBOEIsQ0FBOUIsRUFDbkIsQ0FIRCxFQUlBLGFBQUEsQ0FDRCxDQU5ELENBUUEscUJBQXFCcEgsTUFBZCxDQUFQLENBQ0QsQ0F0RDBCLENBQUQsQ0FBNUIsRUF5REEsaUJBQUEsRUFBb0IsQ0FDbEIsV0FBYTZELFVBQVUxRCxNQUFWLENBQW1CLENBQW5CLEVBQXdCMEQsVUFBVSxDQUFWLElBQWlCL0UsU0FBekMsQ0FBcUQrRSxVQUFVLENBQVYsQ0FBckQsQ0FBb0UsRUFBakYsQ0FFQTJ2SSxlQUFlLElBQWYsQ0FBcUI4TCxRQUFyQixFQUVBLGlDQUFpQyxJQUExQixDQUFnQ2xNLGlCQUFpQmtNLFFBQWpCLEVBQTJCbGtKLElBQTNCLENBQWdDLElBQWhDLENBQXNDbStGLE1BQXRDLENBQThDK2xELFNBQVM1RyxRQUF2RCxDQUFpRTRHLFNBQVMzK0gsWUFBMUUsQ0FBd0YsS0FBeEYsQ0FBaEMsQ0FBUCxDQUNELENBQ0Q7Ozs7OztPQVNBZzBILFlBQVkySyxRQUFaLENBQXNCLENBQUMsQ0FDckJyL0ksSUFBSyxPQURnQixDQUVyQjlDLE1BQU8sY0FBQSxFQUFpQixDQUN0QixVQUFZLElBQVosQ0FFQSxXQUFhMEcsVUFBVTFELE1BQVYsQ0FBbUIsQ0FBbkIsRUFBd0IwRCxVQUFVLENBQVYsSUFBaUIvRSxTQUF6QyxDQUFxRCtFLFVBQVUsQ0FBVixDQUFyRCxDQUFvRSxFQUFqRixDQUNBLGtCQUFPLENBQVksU0FBVS9HLE9BQVYsQ0FBbUIsQ0FDcEMsR0FBSXk4RixPQUFPNHFCLFdBQVgsQ0FBd0I1cUIsT0FBT3NXLE1BQVAsQ0FBY2lZLGNBQWQsQ0FBNkJ2dUIsT0FBTzRxQixXQUFwQyxFQUN4QjVxQixPQUFPc1csTUFBUCxDQUFjOUIsSUFBZCxDQUFtQnhVLE9BQU94OEQsR0FBMUIsQ0FBK0IsVUFBWSxDQUN6QyxJQUFLLFNBQVdsNUIsVUFBVTFELE1BQXJCLENBQTZCMFAsS0FBTyxTQUFBLENBQVVnUSxJQUFWLENBQXBDLENBQXFEQyxLQUFPLENBQWpFLENBQW9FQSxLQUFPRCxJQUEzRSxDQUFpRkMsTUFBakYsQ0FBeUYsQ0FDdkZqUSxLQUFLaVEsSUFBTCxFQUFhamMsVUFBVWljLElBQVYsQ0FBYixDQUNELENBRUQ7RUFDQXk1RSxPQUFPdVQsTUFBUCxDQUFjbHBHLEtBQWQsQ0FBb0IyMUYsTUFBcEIsQ0FBNEIxcEYsSUFBNUIsRUFDQSxXQUFhMHBGLE9BQU9xVixNQUFQLENBQWNockcsS0FBZCxDQUFvQjZvRixLQUFwQixDQUEyQjU4RSxJQUEzQixDQUFiLENBQ0EsR0FBSTBwRixPQUFPOThDLFFBQVgsQ0FBcUJ6OEMsT0FBT3k4QyxRQUFQLENBQWtCZ3dDLE1BQU1xb0QsV0FBTixDQUFrQixDQUN2RHI0RixTQUFVODhDLE9BQU85OEMsUUFEc0MsQ0FBbEIsRUFFcENBLFFBRmtCLENBR3JCMy9DLFFBQVFrRCxNQUFSLEVBQ0QsQ0FaRCxDQVlHdTVGLE9BQU93VCxVQVpWLENBWXNCeFQsT0FBT3lULE9BWjdCLEVBYUQsQ0FmTSxDQUFQLENBZ0JELENBdEJvQixDQUFELENBQXRCLEVBeUJBNm1DLFNBQVN5TCxRQUFULENBQW1CcEUsY0FBbkIsRUFFQSxlQUFBLENBQ0QsQ0F0R0QsQ0FzR0VMLGFBdEdGLENBRkEsQ0EwR0FqOUgsaUJBQWlCQSxpQkFBaUIwaEksUUFBakIsQ0FBMkIsVUFBM0IsQ0FBdUNyRyxhQUFhLEVBQWIsQ0FBaUI0QixjQUFjbkMsUUFBL0IsQ0FBeUMsQ0FDL0YzN0csSUFBSyxFQUQwRixDQUUvRjh5RSxPQUFRLGNBQUEsRUFGdUYsQ0FHL0YvQyxPQUFRLGVBQUEsRUFBa0IsRUFIcUUsQ0FJL0ZDLFdBQVksbUJBQUEsRUFBc0IsRUFKNkQ7RUFNL0ZDLFFBQVMsZ0JBQUEsRUFBbUIsRUFObUUsQ0FPL0ZtWCxZQUFhLElBUGtGLENBUS9GczdCLGtCQUFtQixLQVI0RSxDQVMvRjd3QyxPQUFRLGVBQUEsQ0FBZ0JudUUsUUFBaEIsQ0FBMEJnYyxRQUExQixDQUFvQyxDQUMxQyxzQkFBd0IsS0FBS3E0RixXQUFMLENBQWlCLENBQ3ZDcjBHLFNBQVVBLFFBRDZCLENBRXZDZ2MsU0FBVUEsUUFGNkIsQ0FBakIsQ0FBeEIsQ0FJSXcrRixLQUFPRyxrQkFBa0IzNkcsUUFKN0IsQ0FLSWd5RSxJQUFNMm9DLGtCQUFrQjMrRixRQUw1QixDQU9BLFlBQVlxNEYsV0FBTCxDQUFpQixDQUN0QnB5RixLQUFNdTRGLEtBQUtweUUsS0FBTCxDQUFhLGVBQUEsQ0FBZ0JveUUsSUFBaEIsQ0FBc0J4b0MsR0FBdEIsQ0FBYixDQUEwQyxRQUFBLENBQVN3b0MsSUFBVCxDQUFleG9DLEdBQWYsQ0FEMUIsQ0FBakIsRUFFSi92RCxJQUZILENBR0QsQ0FwQjhGLENBQXpDLENBQXZDLENBQWpCLENBcUJLLGNBckJMLENBcUJxQnUyRixhQUFhLEVBQWIsQ0FBaUI0QixjQUFjbDZILFlBQS9CLENBckJyQixFQXVCQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztLQTJCQSw0QkFFQSxTQUFVdTZILGNBQVYsQ0FBMEI7Ozs7Ozs7Ozs7OztPQWN4QixtQkFBQSxFQUFzQixDQUNwQixTQUFBLENBRUEsV0FBYXIzSSxVQUFVMUQsTUFBVixDQUFtQixDQUFuQixFQUF3QjBELFVBQVUsQ0FBVixJQUFpQi9FLFNBQXpDLENBQXFEK0UsVUFBVSxDQUFWLENBQXJELENBQW9FLEVBQWpGLENBRUEydkksZUFBZSxJQUFmLENBQXFCa00sVUFBckIsRUFFQWp6RCxNQUFRaW5ELDBCQUEwQixJQUExQixDQUFnQ04saUJBQWlCc00sVUFBakIsRUFBNkJ0a0osSUFBN0IsQ0FBa0MsSUFBbEMsQ0FBd0NtK0YsTUFBeEMsQ0FBZ0RtbUQsV0FBV2hILFFBQTNELENBQXFFZ0gsV0FBVy8rSCxZQUFoRixDQUFoQyxDQUFSLENBRUEsR0FBSTQ0RSxPQUFPK2hELEtBQVgsQ0FBa0IsQ0FDaEI3dUQsTUFBTTZ1RCxLQUFOLENBQVkvaEQsTUFBWixFQUVBb2xELE1BQU12TCxpQkFBaUJzTSxXQUFXaG1KLFNBQTVCLENBQU4sQ0FBOEMsTUFBOUMsQ0FBc0RpL0ksc0JBQXNCbHNELEtBQXRCLENBQXRELEVBQW9GcnhGLElBQXBGLENBQXlGdTlJLHNCQUFzQmxzRCxLQUF0QixDQUF6RixFQUNELENBRUQsWUFBQSxDQUNELENBQ0Q7Ozs7OztPQVNBa29ELFlBQVkrSyxVQUFaLENBQXdCLENBQUMsQ0FDdkJ6L0ksSUFBSyxPQURrQixDQUV2QjlDLE1BQU8sY0FBQSxFQUFpQixDQUN0QixXQUFhMEcsVUFBVTFELE1BQVYsQ0FBbUIsQ0FBbkIsRUFBd0IwRCxVQUFVLENBQVYsSUFBaUIvRSxTQUF6QyxDQUFxRCtFLFVBQVUsQ0FBVixDQUFyRCxDQUFvRSxLQUFLMDFGLE1BQXRGLENBRUEsc0JBQXdCLEtBQUt1N0MsV0FBTCxDQUFpQixDQUN2Q3IwRyxTQUFVLEtBQUsrOUcsYUFBTCxDQUFtQmpsRCxNQUFuQixDQUQ2QixDQUV2Qzk4QyxTQUFVODhDLE9BQU85OEMsUUFGc0IsQ0FBakIsQ0FBeEIsQ0FJSWhjLFNBQVcyNkcsa0JBQWtCMzZHLFFBSmpDLENBS0lnYyxTQUFXMitGLGtCQUFrQjMrRixRQUxqQyxDQU9BLFlBQVlxNEYsV0FBTCxDQUFpQixDQUN0QnB5RixLQUFNLFFBQUEsQ0FBU2ppQixRQUFULENBQW1CZ2MsUUFBbkIsQ0FEZ0IsQ0FBakIsRUFFSmlHLElBRkgsQ0FHRCxDQWZzQixDQUFELENBZ0JyQixDQUNEemlELElBQUssZUFESixDQUVEOUMsTUFBTyxzQkFBQSxFQUF5QixDQUM5QixXQUFhMEcsVUFBVTFELE1BQVYsQ0FBbUIsQ0FBbkIsRUFBd0IwRCxVQUFVLENBQVYsSUFBaUIvRSxTQUF6QyxDQUFxRCtFLFVBQVUsQ0FBVixDQUFyRCxDQUFvRSxFQUFqRixDQUNBLFdBQVkwMUYsT0FBTzVpRCxNQUFQLENBQWdCK2xELHdCQUFoQixDQUEyQ0Qsa0JBQWhELEVBQW9FbEQsT0FBTzk0RCxRQUFQLENBQWdCdkgsTUFBcEYsQ0FBNEZxZ0UsT0FBTzk0RCxRQUFQLENBQWdCeTZELE1BQTVHLENBQVAsQ0FDRCxDQUxBLENBaEJxQixDQUF4QixFQXdCQTI0QyxTQUFTNkwsVUFBVCxDQUFxQnhFLGNBQXJCLEVBRUEsaUJBQUEsQ0FDRCxDQW5FRCxDQW1FRUwsYUFuRUYsQ0FGQSxDQXVFQWo5SCxpQkFBaUI4aEksVUFBakIsQ0FBNkIsVUFBN0IsQ0FBeUN6RyxhQUFhLEVBQWIsQ0FBaUI0QixjQUFjbkMsUUFBL0IsQ0FBeUMsQ0FDaEZqNEcsU0FBVSxDQUNSdkgsT0FBUSxDQURBLENBRVJnaUUsT0FBUSxDQUZBLENBRHNFLENBQXpDLENBQXpDLEVBT0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztLQW1DQSw0QkFFQSxTQUFVZ2dELGNBQVYsQ0FBMEI7Ozs7Ozs7Ozs7Ozs7T0FleEIsbUJBQUEsRUFBc0IsQ0FDcEIsV0FBYXIzSSxVQUFVMUQsTUFBVixDQUFtQixDQUFuQixFQUF3QjBELFVBQVUsQ0FBVixJQUFpQi9FLFNBQXpDLENBQXFEK0UsVUFBVSxDQUFWLENBQXJELENBQW9FLEVBQWpGLENBRUEydkksZUFBZSxJQUFmLENBQXFCbU0sVUFBckIsRUFFQSxpQ0FBaUMsSUFBMUIsQ0FBZ0N2TSxpQkFBaUJ1TSxVQUFqQixFQUE2QnZrSixJQUE3QixDQUFrQyxJQUFsQyxDQUF3Q20rRixNQUF4QyxDQUFnRG9tRCxXQUFXakgsUUFBM0QsQ0FBcUVpSCxXQUFXaC9ILFlBQWhGLENBQWhDLENBQVAsQ0FDRCxDQUNEOzs7Ozs7T0FTQWcwSCxZQUFZZ0wsVUFBWixDQUF3QixDQUFDLENBQ3ZCMS9JLElBQUssT0FEa0IsQ0FFdkI5QyxNQUFPLGNBQUEsRUFBaUIsQ0FDdEIsV0FBYTBHLFVBQVUxRCxNQUFWLENBQW1CLENBQW5CLEVBQXdCMEQsVUFBVSxDQUFWLElBQWlCL0UsU0FBekMsQ0FBcUQrRSxVQUFVLENBQVYsQ0FBckQsQ0FBb0UsS0FBSzAxRixNQUF0RixDQUVBLHNCQUF3QixLQUFLdTdDLFdBQUwsQ0FBaUIsQ0FDdkNyMEcsU0FBVSxLQUFLKzlHLGFBQUwsQ0FBbUJqbEQsTUFBbkIsQ0FENkIsQ0FFdkM5OEMsU0FBVTg4QyxPQUFPOThDLFFBRnNCLENBQWpCLENBQXhCLENBSUloYyxTQUFXMjZHLGtCQUFrQjM2RyxRQUpqQyxDQUtJZ2MsU0FBVzIrRixrQkFBa0IzK0YsUUFMakMsQ0FPQSxZQUFZcTRGLFdBQUwsQ0FBaUIsQ0FDdEJweUYsS0FBTSxRQUFBLENBQVNqaUIsUUFBVCxDQUFtQmdjLFFBQW5CLENBRGdCLENBQWpCLEVBRUppRyxJQUZILENBR0QsQ0Fmc0IsQ0FBRCxDQWdCckIsQ0FDRHppRCxJQUFLLGVBREosQ0FFRDlDLE1BQU8sc0JBQUEsRUFBeUIsQ0FDOUIsV0FBYTBHLFVBQVUxRCxNQUFWLENBQW1CLENBQW5CLEVBQXdCMEQsVUFBVSxDQUFWLElBQWlCL0UsU0FBekMsQ0FBcUQrRSxVQUFVLENBQVYsQ0FBckQsQ0FBb0UsRUFBakYsQ0FDQSxXQUFZMDFGLE9BQU81aUQsTUFBUCxDQUFnQnNrRCx3QkFBaEIsQ0FBMkNKLGtCQUFoRCxFQUFvRXRCLE9BQU85NEQsUUFBUCxDQUFnQmk2RCxJQUFwRixDQUEwRm5CLE9BQU85NEQsUUFBUCxDQUFnQms2RCxNQUExRyxDQUFrSHBCLE9BQU85NEQsUUFBUCxDQUFnQm02RCxNQUFsSSxDQUFQLENBQ0QsQ0FMQSxDQWhCcUIsQ0FBeEIsRUF3QkFpNUMsU0FBUzhMLFVBQVQsQ0FBcUJ6RSxjQUFyQixFQUVBLGlCQUFBLENBQ0QsQ0ExREQsQ0EwREVMLGFBMURGLENBRkEsQ0E4REFqOUgsaUJBQWlCK2hJLFVBQWpCLENBQTZCLFVBQTdCLENBQXlDMUcsYUFBYSxFQUFiLENBQWlCNEIsY0FBY25DLFFBQS9CLENBQXlDLENBQ2hGajRHLFNBQVUsQ0FDUmk2RCxLQUFNLGFBQUEsQ0FBYy9zRCxDQUFkLENBQWlCOTZCLENBQWpCLENBQW9CLENBQ3hCLGtCQUFPLENBQVk4NkIsQ0FBWixDQUFlOTZCLENBQWYsQ0FBa0IsQ0FBbEIsQ0FBUCxDQUNELENBSE8sQ0FJUjhuRixPQUFRLEVBSkEsQ0FLUkMsT0FBUSxFQUxBLENBRHNFLENBQXpDLENBQXpDLEVBVUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0tBc0JBLHlCQUVBLFNBQVVzZ0QsY0FBVixDQUEwQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0EyQnhCLGlCQUFBLEVBQW9CLENBQ2xCLFNBQUEsQ0FFQSxXQUFhcjNJLFVBQVUxRCxNQUFWLENBQW1CLENBQW5CLEVBQXdCMEQsVUFBVSxDQUFWLElBQWlCL0UsU0FBekMsQ0FBcUQrRSxVQUFVLENBQVYsQ0FBckQsQ0FBb0UsRUFBakYsQ0FFQTJ2SSxlQUFlLElBQWYsQ0FBcUJvTSxRQUFyQixFQUVBbnpELE1BQVFpbkQsMEJBQTBCLElBQTFCLENBQWdDTixpQkFBaUJ3TSxRQUFqQixFQUEyQnhrSixJQUEzQixDQUFnQyxJQUFoQyxDQUFzQ20rRixNQUF0QyxDQUE4Q3FtRCxTQUFTbEgsUUFBdkQsQ0FBaUVrSCxTQUFTai9ILFlBQTFFLENBQWhDLENBQVIsQ0FFQSxHQUFJNDRFLE9BQU8raEQsS0FBWCxDQUFrQixDQUNoQjd1RCxNQUFNNnVELEtBQU4sQ0FBWS9oRCxNQUFaLEVBRUFvbEQsTUFBTXZMLGlCQUFpQndNLFNBQVNsbUosU0FBMUIsQ0FBTixDQUE0QyxNQUE1QyxDQUFvRGkvSSxzQkFBc0Jsc0QsS0FBdEIsQ0FBcEQsRUFBa0ZyeEYsSUFBbEYsQ0FBdUZ1OUksc0JBQXNCbHNELEtBQXRCLENBQXZGLEVBQ0QsQ0FFRCxZQUFBLENBQ0QsQ0FDRDs7Ozs7O09BU0Frb0QsWUFBWWlMLFFBQVosQ0FBc0IsQ0FBQyxDQUNyQjMvSSxJQUFLLE9BRGdCLENBRXJCOUMsTUFBTyxjQUFBLEVBQWlCLENBQ3RCLFdBQWEwRyxVQUFVMUQsTUFBVixDQUFtQixDQUFuQixFQUF3QjBELFVBQVUsQ0FBVixJQUFpQi9FLFNBQXpDLENBQXFEK0UsVUFBVSxDQUFWLENBQXJELENBQW9FLEtBQUswMUYsTUFBdEYsQ0FFQSxzQkFBd0IsS0FBS3U3QyxXQUFMLENBQWlCLENBQ3ZDcjBHLFNBQVUsS0FBSys5RyxhQUFMLENBQW1CamxELE1BQW5CLENBRDZCLENBRXZDOThDLFNBQVU4OEMsT0FBTzk4QyxRQUZzQixDQUFqQixDQUF4QixDQUlJaGMsU0FBVzI2RyxrQkFBa0IzNkcsUUFKakMsQ0FLSWdjLFNBQVcyK0Ysa0JBQWtCMytGLFFBTGpDLENBT0EsWUFBWXE0RixXQUFMLENBQWlCLENBQ3RCcHlGLEtBQU0sUUFBQSxDQUFTamlCLFFBQVQsQ0FBbUJnYyxRQUFuQixDQURnQixDQUFqQixFQUVKaUcsSUFGSCxDQUdELENBZm9CLENBQUQsQ0FnQm5CLENBQ0R6aUQsSUFBSyxlQURKLENBRUQ5QyxNQUFPLHNCQUFBLEVBQXlCLENBQzlCLFdBQWEwRyxVQUFVMUQsTUFBVixDQUFtQixDQUFuQixFQUF3QjBELFVBQVUsQ0FBVixJQUFpQi9FLFNBQXpDLENBQXFEK0UsVUFBVSxDQUFWLENBQXJELENBQW9FLEVBQWpGLENBQ0EsYUFBZSxJQUFLMDFGLE9BQU81aUQsTUFBUCxDQUFnQnVVLG1CQUFoQixDQUFzQ0wsYUFBM0MsRUFBMEQwdUMsT0FBTzk0RCxRQUFQLENBQWdCbEUsS0FBMUUsQ0FBaUZnOUQsT0FBTzk0RCxRQUFQLENBQWdCakUsTUFBakcsQ0FBeUcrOEQsT0FBTzk0RCxRQUFQLENBQWdCby9HLFNBQXpILENBQW9JdG1ELE9BQU85NEQsUUFBUCxDQUFnQnEvRyxTQUFwSixDQUFmLENBQ0EsZUFBQSxDQUNELENBTkEsQ0FoQm1CLENBQXRCLEVBeUJBak0sU0FBUytMLFFBQVQsQ0FBbUIxRSxjQUFuQixFQUVBLGVBQUEsQ0FDRCxDQWpGRCxDQWlGRUwsYUFqRkYsQ0FGQSxDQXFGQWo5SCxpQkFBaUJBLGlCQUFpQm1pSSxPQUFqQixDQUEwQixVQUExQixDQUFzQzlHLGFBQWEsRUFBYixDQUFpQjRCLGNBQWNuQyxRQUEvQixDQUF5QyxDQUM5Rmo0RyxTQUFVLENBQ1JsRSxNQUFPLEVBREMsQ0FFUkMsT0FBUSxFQUZBLENBR1JxakgsVUFBVyxDQUhILENBSVJDLFVBQVcsQ0FKSCxDQURvRixDQUF6QyxDQUF0QyxDQUFqQixDQU9LLGNBUEwsQ0FPcUI3RyxhQUFhLEVBQWIsQ0FBaUI0QixjQUFjbDZILFlBQS9CLENBQTZDLENBQ2hFOGYsU0FBVSxDQUFDLE9BQUQsQ0FBVSxRQUFWLENBQW9CLFdBQXBCLENBQWlDLFdBQWpDLENBRHNELENBQTdDLENBUHJCLEVBV0EsbUJBQXFCLENBQUMsQ0FBQyxDQUFGLENBQUssQ0FBQyxDQUFOLENBQVMsQ0FBQyxDQUFWLENBQWEsQ0FBYixDQUFnQixDQUFDLENBQWpCLENBQW9CLENBQUMsQ0FBckIsQ0FBd0IsQ0FBeEIsQ0FBMkIsQ0FBM0IsQ0FBOEIsQ0FBQyxDQUEvQixDQUFrQyxDQUFDLENBQW5DLENBQXNDLENBQXRDLENBQXlDLENBQUMsQ0FBMUMsQ0FBNkMsQ0FBQyxDQUE5QyxDQUFpRCxDQUFDLENBQWxELENBQXFELENBQXJELENBQXdELENBQXhELENBQTJELENBQUMsQ0FBNUQsQ0FBK0QsQ0FBL0QsQ0FBa0UsQ0FBbEUsQ0FBcUUsQ0FBckUsQ0FBd0UsQ0FBeEUsQ0FBMkUsQ0FBQyxDQUE1RSxDQUErRSxDQUEvRSxDQUFrRixDQUFsRixDQUFyQixDQUNJdS9HLGVBQWlCLENBQUMsQ0FBRCxDQUFJLENBQUosQ0FBTyxDQUFQLENBQVUsQ0FBVixDQUFhLENBQWIsQ0FBZ0IsQ0FBaEIsQ0FBbUIsQ0FBbkIsQ0FBc0IsQ0FBdEIsQ0FBeUIsQ0FBekIsQ0FBNEIsQ0FBNUIsQ0FBK0IsQ0FBL0IsQ0FBa0MsQ0FBbEMsQ0FBcUMsQ0FBckMsQ0FBd0MsQ0FBeEMsQ0FBMkMsQ0FBM0MsQ0FBOEMsQ0FBOUMsQ0FBaUQsQ0FBakQsQ0FBb0QsQ0FBcEQsQ0FBdUQsQ0FBdkQsQ0FBMEQsQ0FBMUQsQ0FBNkQsQ0FBN0QsQ0FBZ0UsQ0FBaEUsQ0FBbUUsQ0FBbkUsQ0FBc0UsQ0FBdEUsQ0FBeUUsQ0FBekUsQ0FBNEUsQ0FBNUUsQ0FBK0UsQ0FBL0UsQ0FBa0YsQ0FBbEYsQ0FBcUYsQ0FBckYsQ0FBd0YsQ0FBeEYsQ0FBMkYsQ0FBM0YsQ0FBOEYsQ0FBOUYsQ0FBaUcsQ0FBakcsQ0FBb0csQ0FBcEcsQ0FBdUcsQ0FBdkcsQ0FBMEcsQ0FBMUcsQ0FEckIsQ0FFQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7S0F5QkEsNEJBRUEsU0FBVTlFLGNBQVYsQ0FBMEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09BdUN4QixtQkFBQSxFQUFzQixDQUNwQixTQUFBLENBRUEsV0FBYXIzSSxVQUFVMUQsTUFBVixDQUFtQixDQUFuQixFQUF3QjBELFVBQVUsQ0FBVixJQUFpQi9FLFNBQXpDLENBQXFEK0UsVUFBVSxDQUFWLENBQXJELENBQW9FLEVBQWpGLENBRUEydkksZUFBZSxJQUFmLENBQXFCeU0sVUFBckIsRUFFQXh6RCxNQUFRaW5ELDBCQUEwQixJQUExQixDQUFnQ04saUJBQWlCNk0sVUFBakIsRUFBNkI3a0osSUFBN0IsQ0FBa0MsSUFBbEMsQ0FBd0NtK0YsTUFBeEMsQ0FBZ0QwbUQsV0FBV3ZILFFBQTNELENBQXFFdUgsV0FBV3QvSCxZQUFoRixDQUFoQyxDQUFSLENBRUEsR0FBSTQ0RSxPQUFPK2hELEtBQVgsQ0FBa0IsQ0FDaEI3dUQsTUFBTTZ1RCxLQUFOLENBQVkvaEQsTUFBWixFQUVBb2xELE1BQU12TCxpQkFBaUI2TSxXQUFXdm1KLFNBQTVCLENBQU4sQ0FBOEMsTUFBOUMsQ0FBc0RpL0ksc0JBQXNCbHNELEtBQXRCLENBQXRELEVBQW9GcnhGLElBQXBGLENBQXlGdTlJLHNCQUFzQmxzRCxLQUF0QixDQUF6RixFQUNELENBRUQsWUFBQSxDQUNELENBQ0Q7Ozs7OztPQVNBa29ELFlBQVlzTCxVQUFaLENBQXdCLENBQUMsQ0FDdkJoZ0osSUFBSyxPQURrQixDQUV2QjlDLE1BQU8sY0FBQSxFQUFpQixDQUN0QixXQUFhMEcsVUFBVTFELE1BQVYsQ0FBbUIsQ0FBbkIsRUFBd0IwRCxVQUFVLENBQVYsSUFBaUIvRSxTQUF6QyxDQUFxRCtFLFVBQVUsQ0FBVixDQUFyRCxDQUFvRSxLQUFLMDFGLE1BQXRGLENBRUEsc0JBQXdCLEtBQUt1N0MsV0FBTCxDQUFpQixDQUN2Q3IwRyxTQUFVLEtBQUsrOUcsYUFBTCxDQUFtQmpsRCxNQUFuQixDQUQ2QixDQUV2Qzk4QyxTQUFVODhDLE9BQU85OEMsUUFGc0IsQ0FBakIsQ0FBeEIsQ0FJSWhjLFNBQVcyNkcsa0JBQWtCMzZHLFFBSmpDLENBS0lnYyxTQUFXMitGLGtCQUFrQjMrRixRQUxqQyxDQU9BLFlBQVlxNEYsV0FBTCxDQUFpQixDQUN0QnB5RixLQUFNLFFBQUEsQ0FBU2ppQixRQUFULENBQW1CZ2MsUUFBbkIsQ0FEZ0IsQ0FBakIsRUFFSmlHLElBRkgsQ0FHRCxDQWZzQixDQUFELENBZ0JyQixDQUNEemlELElBQUssZUFESixDQUVEOUMsTUFBTyxzQkFBQSxFQUF5QixDQUM5QixXQUFhMEcsVUFBVTFELE1BQVYsQ0FBbUIsQ0FBbkIsRUFBd0IwRCxVQUFVLENBQVYsSUFBaUIvRSxTQUF6QyxDQUFxRCtFLFVBQVUsQ0FBVixDQUFyRCxDQUFvRSxFQUFqRixDQUNBLFdBQVkwMUYsT0FBTzVpRCxNQUFQLENBQWdCMmxELHdCQUFoQixDQUEyQ25CLGtCQUFoRCxFQUFvRTVCLE9BQU85NEQsUUFBUCxDQUFnQnkvRyxjQUFwRixDQUFvRzNtRCxPQUFPOTRELFFBQVAsQ0FBZ0J1L0csY0FBcEgsQ0FBb0l6bUQsT0FBTzk0RCxRQUFQLENBQWdCdkgsTUFBcEosQ0FBNEpxZ0UsT0FBTzk0RCxRQUFQLENBQWdCeTZELE1BQTVLLENBQVAsQ0FDRCxDQUxBLENBaEJxQixDQUF4QixFQXdCQTI0QyxTQUFTb00sVUFBVCxDQUFxQi9FLGNBQXJCLEVBRUEsaUJBQUEsQ0FDRCxDQTVGRCxDQTRGRUwsYUE1RkYsQ0FGQSxDQWdHQWo5SCxpQkFBaUJBLGlCQUFpQkEsaUJBQWlCQSxpQkFBaUJxaUksVUFBakIsQ0FBNkIsZ0JBQTdCLENBQStDQyxjQUEvQyxDQUFqQixDQUFpRixnQkFBakYsQ0FBbUdGLGNBQW5HLENBQWpCLENBQXFJLFVBQXJJLENBQWlKL0csYUFBYSxFQUFiLENBQWlCNEIsY0FBY25DLFFBQS9CLENBQXlDLENBQ3pNajRHLFNBQVUsQ0FDUnkvRyxlQUFnQkEsY0FEUixDQUVSRixlQUFnQkEsY0FGUixDQUdSOW1ILE9BQVEsQ0FIQSxDQUlSZ2lFLE9BQVEsQ0FKQSxDQUQrTCxDQUF6QyxDQUFqSixDQUFqQixDQU9LLGNBUEwsQ0FPcUIrOUMsYUFBYSxFQUFiLENBQWlCNEIsY0FBY2w2SCxZQUEvQixDQUE2QyxDQUNoRThmLFNBQVUsQ0FBQyxnQkFBRCxDQUFtQixnQkFBbkIsQ0FBcUMsUUFBckMsQ0FBK0MsUUFBL0MsQ0FEc0QsQ0FBN0MsQ0FQckIsRUFXQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0tBNkJBLHNCQUVBLFNBQVV5NkcsY0FBVixDQUEwQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0FvQ3hCLGFBQUEsRUFBZ0IsQ0FDZCxTQUFBLENBRUEsV0FBYXIzSSxVQUFVMUQsTUFBVixDQUFtQixDQUFuQixFQUF3QjBELFVBQVUsQ0FBVixJQUFpQi9FLFNBQXpDLENBQXFEK0UsVUFBVSxDQUFWLENBQXJELENBQW9FLEVBQWpGLENBRUEydkksZUFBZSxJQUFmLENBQXFCMk0sSUFBckIsRUFFQTF6RCxNQUFRaW5ELDBCQUEwQixJQUExQixDQUFnQ04saUJBQWlCK00sSUFBakIsRUFBdUIva0osSUFBdkIsQ0FBNEIsSUFBNUIsQ0FBa0NtK0YsTUFBbEMsQ0FBMEM0bUQsS0FBS3pILFFBQS9DLENBQXlEeUgsS0FBS3gvSCxZQUE5RCxDQUFoQyxDQUFSLENBRUEsR0FBSTQ0RSxPQUFPK2hELEtBQVgsQ0FBa0IsQ0FDaEI3dUQsTUFBTTZ1RCxLQUFOLENBQVkvaEQsTUFBWixFQUVBb2xELE1BQU12TCxpQkFBaUIrTSxLQUFLem1KLFNBQXRCLENBQU4sQ0FBd0MsTUFBeEMsQ0FBZ0RpL0ksc0JBQXNCbHNELEtBQXRCLENBQWhELEVBQThFcnhGLElBQTlFLENBQW1GdTlJLHNCQUFzQmxzRCxLQUF0QixDQUFuRixFQUNELENBRUQsWUFBQSxDQUNELENBQ0Q7Ozs7OztPQVNBa29ELFlBQVl3TCxJQUFaLENBQWtCLENBQUMsQ0FDakJsZ0osSUFBSyxPQURZLENBRWpCOUMsTUFBTyxjQUFBLEVBQWlCLENBQ3RCLFdBQWEwRyxVQUFVMUQsTUFBVixDQUFtQixDQUFuQixFQUF3QjBELFVBQVUsQ0FBVixJQUFpQi9FLFNBQXpDLENBQXFEK0UsVUFBVSxDQUFWLENBQXJELENBQW9FLEtBQUswMUYsTUFBdEYsQ0FFQSxzQkFBd0IsS0FBS3U3QyxXQUFMLENBQWlCLENBQ3ZDcjBHLFNBQVUsS0FBSys5RyxhQUFMLENBQW1CamxELE1BQW5CLENBRDZCLENBRXZDOThDLFNBQVU4OEMsT0FBTzk4QyxRQUZzQixDQUFqQixDQUF4QixDQUlJaGMsU0FBVzI2RyxrQkFBa0IzNkcsUUFKakMsQ0FLSWdjLFNBQVcyK0Ysa0JBQWtCMytGLFFBTGpDLENBT0EsWUFBWXE0RixXQUFMLENBQWlCLENBQ3RCcHlGLEtBQU0sUUFBQSxDQUFTamlCLFFBQVQsQ0FBbUJnYyxRQUFuQixDQURnQixDQUFqQixFQUVKaUcsSUFGSCxDQUdELENBZmdCLENBQUQsQ0FnQmYsQ0FDRHppRCxJQUFLLGVBREosQ0FFRDlDLE1BQU8sc0JBQUEsRUFBeUIsQ0FDOUIsV0FBYTBHLFVBQVUxRCxNQUFWLENBQW1CLENBQW5CLEVBQXdCMEQsVUFBVSxDQUFWLElBQWlCL0UsU0FBekMsQ0FBcUQrRSxVQUFVLENBQVYsQ0FBckQsQ0FBb0UsRUFBakYsQ0FDQSxXQUFZMDFGLE9BQU81aUQsTUFBUCxDQUFnQnl6RCxrQkFBaEIsQ0FBcUNKLFlBQTFDLEVBQXdEelEsT0FBTzk0RCxRQUFQLENBQWdCbXBFLFdBQXhFLENBQXFGclEsT0FBTzk0RCxRQUFQLENBQWdCb3BFLFdBQXJHLENBQWtIdFEsT0FBTzk0RCxRQUFQLENBQWdCcXBFLGFBQWxJLENBQWlKdlEsT0FBTzk0RCxRQUFQLENBQWdCc3BFLFdBQWpLLENBQThLeFEsT0FBTzk0RCxRQUFQLENBQWdCNG9FLFVBQTlMLENBQTBNOVAsT0FBTzk0RCxRQUFQLENBQWdCNm9FLFdBQTFOLENBQVAsQ0FDRCxDQUxBLENBaEJlLENBQWxCLEVBd0JBdXFDLFNBQVNzTSxJQUFULENBQWVqRixjQUFmLEVBRUEsV0FBQSxDQUNELENBekZELENBeUZFTCxhQXpGRixDQUZBLENBNkZBajlILGlCQUFpQkEsaUJBQWlCdWlJLElBQWpCLENBQXVCLFVBQXZCLENBQW1DbEgsYUFBYSxFQUFiLENBQWlCNEIsY0FBY25DLFFBQS9CLENBQXlDLENBQzNGajRHLFNBQVUsQ0FDUm1wRSxZQUFhLENBREwsQ0FFUkMsWUFBYSxFQUZMLENBR1JDLGNBQWUsQ0FIUCxDQUlSQyxZQUFhLENBSkwsQ0FLUlYsV0FBWSxDQUxKLENBTVJDLFlBQWFqbkcsS0FBSytmLEVBQUwsQ0FBVSxDQU5mLENBRGlGLENBQXpDLENBQW5DLENBQWpCLENBU0ssY0FUTCxDQVNxQjYySCxhQUFhLEVBQWIsQ0FBaUI0QixjQUFjbkMsUUFBL0IsQ0FBeUMsQ0FDNURqNEcsU0FBVSxDQUFDLGFBQUQsQ0FBZ0IsYUFBaEIsQ0FBK0IsZUFBL0IsQ0FBZ0QsYUFBaEQsQ0FBK0QsWUFBL0QsQ0FBNkUsYUFBN0UsQ0FEa0QsQ0FBekMsQ0FUckIsRUFhQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7S0FrQ0EseUJBRUEsU0FBVXk2RyxjQUFWLENBQTBCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O09BdUJ4QixpQkFBQSxFQUFvQixDQUNsQixTQUFBLENBRUEsV0FBYXIzSSxVQUFVMUQsTUFBVixDQUFtQixDQUFuQixFQUF3QjBELFVBQVUsQ0FBVixJQUFpQi9FLFNBQXpDLENBQXFEK0UsVUFBVSxDQUFWLENBQXJELENBQW9FLEVBQWpGLENBRUEydkksZUFBZSxJQUFmLENBQXFCNE0sUUFBckIsRUFFQTN6RCxNQUFRaW5ELDBCQUEwQixJQUExQixDQUFnQ04saUJBQWlCZ04sUUFBakIsRUFBMkJobEosSUFBM0IsQ0FBZ0MsSUFBaEMsQ0FBc0NtK0YsTUFBdEMsQ0FBOEM2bUQsU0FBUzFILFFBQXZELENBQWlFMEgsU0FBU3ovSCxZQUExRSxDQUFoQyxDQUFSLENBRUEsR0FBSTQ0RSxPQUFPK2hELEtBQVgsQ0FBa0IsQ0FDaEI3dUQsTUFBTTZ1RCxLQUFOLENBQVkvaEQsTUFBWixFQUVBb2xELE1BQU12TCxpQkFBaUJnTixTQUFTMW1KLFNBQTFCLENBQU4sQ0FBNEMsTUFBNUMsQ0FBb0RpL0ksc0JBQXNCbHNELEtBQXRCLENBQXBELEVBQWtGcnhGLElBQWxGLENBQXVGdTlJLHNCQUFzQmxzRCxLQUF0QixDQUF2RixFQUNELENBRUQsWUFBQSxDQUNELENBQ0Q7Ozs7OztPQVNBa29ELFlBQVl5TCxRQUFaLENBQXNCLENBQUMsQ0FDckJuZ0osSUFBSyxPQURnQixDQUVyQjlDLE1BQU8sY0FBQSxFQUFpQixDQUN0QixXQUFhMEcsVUFBVTFELE1BQVYsQ0FBbUIsQ0FBbkIsRUFBd0IwRCxVQUFVLENBQVYsSUFBaUIvRSxTQUF6QyxDQUFxRCtFLFVBQVUsQ0FBVixDQUFyRCxDQUFvRSxLQUFLMDFGLE1BQXRGLENBRUEsc0JBQXdCLEtBQUt1N0MsV0FBTCxDQUFpQixDQUN2Q3IwRyxTQUFVLEtBQUsrOUcsYUFBTCxDQUFtQmpsRCxNQUFuQixDQUQ2QixDQUV2Qzk4QyxTQUFVODhDLE9BQU85OEMsUUFGc0IsQ0FBakIsQ0FBeEIsQ0FJSWhjLFNBQVcyNkcsa0JBQWtCMzZHLFFBSmpDLENBS0lnYyxTQUFXMitGLGtCQUFrQjMrRixRQUxqQyxDQU9BLFlBQVlxNEYsV0FBTCxDQUFpQixDQUN0QnB5RixLQUFNLFFBQUEsQ0FBU2ppQixRQUFULENBQW1CZ2MsUUFBbkIsQ0FEZ0IsQ0FBakIsRUFFSmlHLElBRkgsQ0FHRCxDQWZvQixDQUFELENBZ0JuQixDQUNEemlELElBQUssZUFESixDQUVEOUMsTUFBTyxzQkFBQSxFQUF5QixDQUM5QixXQUFhMEcsVUFBVTFELE1BQVYsQ0FBbUIsQ0FBbkIsRUFBd0IwRCxVQUFVLENBQVYsSUFBaUIvRSxTQUF6QyxDQUFxRCtFLFVBQVUsQ0FBVixDQUFyRCxDQUFvRSxFQUFqRixDQUNBLFdBQVkwMUYsT0FBTzVpRCxNQUFQLENBQWdCczBELG1CQUFoQixDQUFzQ0wsYUFBM0MsRUFBMERyUixPQUFPOTRELFFBQVAsQ0FBZ0IwYixNQUExRSxDQUFQLENBQ0QsQ0FMQSxDQWhCbUIsQ0FBdEIsRUF3QkEwM0YsU0FBU3VNLFFBQVQsQ0FBbUJsRixjQUFuQixFQUVBLGVBQUEsQ0FDRCxDQTVFRCxDQTRFRUwsYUE1RUYsQ0FGQSxDQWdGQWo5SCxpQkFBaUJBLGlCQUFpQnlpSSxPQUFqQixDQUEwQixVQUExQixDQUFzQ3BILGFBQWEsRUFBYixDQUFpQjRCLGNBQWNuQyxRQUEvQixDQUF5QyxDQUM5Rmo0RyxTQUFVLENBQ1IwYixPQUFRLEVBREEsQ0FEb0YsQ0FBekMsQ0FBdEMsQ0FBakIsQ0FJSyxjQUpMLENBSXFCODhGLGFBQWEsRUFBYixDQUFpQjRCLGNBQWNsNkgsWUFBL0IsQ0FBNkMsQ0FDaEU4ZixTQUFVLENBQUMsUUFBRCxDQURzRCxDQUE3QyxDQUpyQixFQVFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0tBOEJBLDBCQUVBLFNBQVV5NkcsY0FBVixDQUEwQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09BeUJ4QixrQkFBQSxFQUFxQixDQUNuQixXQUFhcjNJLFVBQVUxRCxNQUFWLENBQW1CLENBQW5CLEVBQXdCMEQsVUFBVSxDQUFWLElBQWlCL0UsU0FBekMsQ0FBcUQrRSxVQUFVLENBQVYsQ0FBckQsQ0FBb0UsRUFBakYsQ0FFQTJ2SSxlQUFlLElBQWYsQ0FBcUI4TSxTQUFyQixFQUVBLGlDQUFpQyxJQUExQixDQUFnQ2xOLGlCQUFpQmtOLFNBQWpCLEVBQTRCbGxKLElBQTVCLENBQWlDLElBQWpDLENBQXVDbStGLE1BQXZDLENBQStDK21ELFVBQVU1SCxRQUF6RCxDQUFtRTRILFVBQVUzL0gsWUFBN0UsQ0FBaEMsQ0FBUCxDQUNELENBQ0Q7Ozs7OztPQVNBZzBILFlBQVkyTCxTQUFaLENBQXVCLENBQUMsQ0FDdEJyZ0osSUFBSyxPQURpQixDQUV0QjlDLE1BQU8sY0FBQSxFQUFpQixDQUN0QixXQUFhMEcsVUFBVTFELE1BQVYsQ0FBbUIsQ0FBbkIsRUFBd0IwRCxVQUFVLENBQVYsSUFBaUIvRSxTQUF6QyxDQUFxRCtFLFVBQVUsQ0FBVixDQUFyRCxDQUFvRSxLQUFLMDFGLE1BQXRGLENBRUEsc0JBQXdCLEtBQUt1N0MsV0FBTCxDQUFpQixDQUN2Q3IwRyxTQUFVLEtBQUsrOUcsYUFBTCxDQUFtQmpsRCxNQUFuQixDQUQ2QixDQUV2Qzk4QyxTQUFVODhDLE9BQU85OEMsUUFGc0IsQ0FBakIsQ0FBeEIsQ0FJSWhjLFNBQVcyNkcsa0JBQWtCMzZHLFFBSmpDLENBS0lnYyxTQUFXMitGLGtCQUFrQjMrRixRQUxqQyxDQU9BLFlBQVlxNEYsV0FBTCxDQUFpQixDQUN0QnB5RixLQUFNLFFBQUEsQ0FBU2ppQixRQUFULENBQW1CZ2MsUUFBbkIsQ0FEZ0IsQ0FBakIsRUFFSmlHLElBRkgsQ0FHRCxDQWZxQixDQUFELENBZ0JwQixDQUNEemlELElBQUssZUFESixDQUVEOUMsTUFBTyxzQkFBQSxFQUF5QixDQUM5QixXQUFhMEcsVUFBVTFELE1BQVYsQ0FBbUIsQ0FBbkIsRUFBd0IwRCxVQUFVLENBQVYsSUFBaUIvRSxTQUF6QyxDQUFxRCtFLFVBQVUsQ0FBVixDQUFyRCxDQUFvRSxFQUFqRixDQUNBLGFBQWUsSUFBSzAxRixPQUFPNWlELE1BQVAsQ0FBZ0JnekQsb0JBQWhCLENBQXVDSixjQUE1QyxFQUE0RGhRLE9BQU85NEQsUUFBUCxDQUFnQnZILE1BQTVFLENBQW9GcWdFLE9BQU85NEQsUUFBUCxDQUFnQitvQixhQUFwRyxDQUFtSCt2QyxPQUFPOTRELFFBQVAsQ0FBZ0JncEIsY0FBbkksQ0FBZixDQUNBLGVBQUEsQ0FDRCxDQU5BLENBaEJvQixDQUF2QixFQXlCQW9xRixTQUFTeU0sU0FBVCxDQUFvQnBGLGNBQXBCLEVBRUEsZ0JBQUEsQ0FDRCxDQXJFRCxDQXFFRUwsYUFyRUYsQ0FGQSxDQXlFQWo5SCxpQkFBaUJBLGlCQUFpQjJpSSxRQUFqQixDQUEyQixVQUEzQixDQUF1Q3RILGFBQWEsRUFBYixDQUFpQjRCLGNBQWNuQyxRQUEvQixDQUF5QyxDQUMvRmo0RyxTQUFVLENBQ1J2SCxPQUFRLENBREEsQ0FFUnN3QixjQUFlLENBRlAsQ0FHUkMsZUFBZ0IsQ0FIUixDQURxRixDQUF6QyxDQUF2QyxDQUFqQixDQU1LLGNBTkwsQ0FNcUJ3dkYsYUFBYSxFQUFiLENBQWlCNEIsY0FBY2w2SCxZQUEvQixDQUE2QyxDQUNoRThmLFNBQVUsQ0FBQyxRQUFELENBQVcsZUFBWCxDQUE0QixnQkFBNUIsQ0FEc0QsQ0FBN0MsQ0FOckIsRUFVQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7S0ErQkEsNkJBRUEsU0FBVXk2RyxjQUFWLENBQTBCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQXdCeEIsb0JBQUEsRUFBdUIsQ0FDckIsU0FBQSxDQUVBLFdBQWFyM0ksVUFBVTFELE1BQVYsQ0FBbUIsQ0FBbkIsRUFBd0IwRCxVQUFVLENBQVYsSUFBaUIvRSxTQUF6QyxDQUFxRCtFLFVBQVUsQ0FBVixDQUFyRCxDQUFvRSxFQUFqRixDQUVBMnZJLGVBQWUsSUFBZixDQUFxQmdOLFdBQXJCLEVBRUEvekQsTUFBUWluRCwwQkFBMEIsSUFBMUIsQ0FBZ0NOLGlCQUFpQm9OLFdBQWpCLEVBQThCcGxKLElBQTlCLENBQW1DLElBQW5DLENBQXlDbStGLE1BQXpDLENBQWlEaW5ELFlBQVk5SCxRQUE3RCxDQUF1RThILFlBQVk3L0gsWUFBbkYsQ0FBaEMsQ0FBUixDQUVBLEdBQUk0NEUsT0FBTytoRCxLQUFYLENBQWtCLENBQ2hCN3VELE1BQU02dUQsS0FBTixDQUFZL2hELE1BQVosRUFFQW9sRCxNQUFNdkwsaUJBQWlCb04sWUFBWTltSixTQUE3QixDQUFOLENBQStDLE1BQS9DLENBQXVEaS9JLHNCQUFzQmxzRCxLQUF0QixDQUF2RCxFQUFxRnJ4RixJQUFyRixDQUEwRnU5SSxzQkFBc0Jsc0QsS0FBdEIsQ0FBMUYsRUFDRCxDQUVELFlBQUEsQ0FDRCxDQUNEOzs7Ozs7T0FTQWtvRCxZQUFZNkwsV0FBWixDQUF5QixDQUFDLENBQ3hCdmdKLElBQUssT0FEbUIsQ0FFeEI5QyxNQUFPLGNBQUEsRUFBaUIsQ0FDdEIsV0FBYTBHLFVBQVUxRCxNQUFWLENBQW1CLENBQW5CLEVBQXdCMEQsVUFBVSxDQUFWLElBQWlCL0UsU0FBekMsQ0FBcUQrRSxVQUFVLENBQVYsQ0FBckQsQ0FBb0UsS0FBSzAxRixNQUF0RixDQUVBLHNCQUF3QixLQUFLdTdDLFdBQUwsQ0FBaUIsQ0FDdkNyMEcsU0FBVSxLQUFLKzlHLGFBQUwsQ0FBbUJqbEQsTUFBbkIsQ0FENkIsQ0FFdkM5OEMsU0FBVTg4QyxPQUFPOThDLFFBRnNCLENBQWpCLENBQXhCLENBSUloYyxTQUFXMjZHLGtCQUFrQjM2RyxRQUpqQyxDQUtJZ2MsU0FBVzIrRixrQkFBa0IzK0YsUUFMakMsQ0FPQSxZQUFZcTRGLFdBQUwsQ0FBaUIsQ0FDdEJweUYsS0FBTSxRQUFBLENBQVNqaUIsUUFBVCxDQUFtQmdjLFFBQW5CLENBRGdCLENBQWpCLEVBRUppRyxJQUZILENBR0QsQ0FmdUIsQ0FBRCxDQWdCdEIsQ0FDRHppRCxJQUFLLGVBREosQ0FFRDlDLE1BQU8sc0JBQUEsRUFBeUIsQ0FDOUIsV0FBYTBHLFVBQVUxRCxNQUFWLENBQW1CLENBQW5CLEVBQXdCMEQsVUFBVSxDQUFWLElBQWlCL0UsU0FBekMsQ0FBcUQrRSxVQUFVLENBQVYsQ0FBckQsQ0FBb0UsRUFBakYsQ0FDQSxXQUFZMDFGLE9BQU81aUQsTUFBUCxDQUFnQjZsRCx5QkFBaEIsQ0FBNENELG1CQUFqRCxFQUFzRWhELE9BQU85NEQsUUFBUCxDQUFnQnZILE1BQXRGLENBQThGcWdFLE9BQU85NEQsUUFBUCxDQUFnQnk2RCxNQUE5RyxDQUFQLENBQ0QsQ0FMQSxDQWhCc0IsQ0FBekIsRUF3QkEyNEMsU0FBUzJNLFdBQVQsQ0FBc0J0RixjQUF0QixFQUVBLGtCQUFBLENBQ0QsQ0E3RUQsQ0E2RUVMLGFBN0VGLENBRkEsQ0FpRkFqOUgsaUJBQWlCQSxpQkFBaUI0aUksV0FBakIsQ0FBOEIsVUFBOUIsQ0FBMEN2SCxhQUFhLEVBQWIsQ0FBaUI0QixjQUFjbkMsUUFBL0IsQ0FBeUMsQ0FDbEdqNEcsU0FBVSxDQUNSdkgsT0FBUSxDQURBLENBRVJnaUUsT0FBUSxDQUZBLENBRHdGLENBQXpDLENBQTFDLENBQWpCLENBS0ssY0FMTCxDQUtxQis5QyxhQUFhLEVBQWIsQ0FBaUI0QixjQUFjbDZILFlBQS9CLENBQTZDLENBQ2hFOGYsU0FBVSxDQUFDLFFBQUQsQ0FBVyxRQUFYLENBRHNELENBQTdDLENBTHJCLEVBU0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0tBa0NBLHNCQUVBLFNBQVV5NkcsY0FBVixDQUEwQixDQUN4QnZHLFlBQVk4TCxJQUFaLENBQWtCLElBQWxCLENBQXdCLENBQUMsQ0FDdkJ4Z0osSUFBSyxNQURrQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7U0F3Q3ZCOUMsTUFBTyxhQUFBLENBQWN3akUsSUFBZCxDQUFvQixDQUN6QixXQUFhOThELFVBQVUxRCxNQUFWLENBQW1CLENBQW5CLEVBQXdCMEQsVUFBVSxDQUFWLElBQWlCL0UsU0FBekMsQ0FBcUQrRSxVQUFVLENBQVYsQ0FBckQsQ0FBb0U0OEksS0FBSzV3QyxNQUF0RixDQUNBLGtCQUFPLENBQVksU0FBVS95RyxPQUFWLENBQW1CLENBQ3BDK3lHLE9BQU85QixJQUFQLENBQVlwdEMsSUFBWixDQUFrQjdqRSxPQUFsQixFQUNELENBRk0sQ0FBUCxDQUdELENBN0NzQixDQUFELENBQXhCLEVBZ0RBLGFBQUEsRUFBZ0IsQ0FDZCxXQUFhK0csVUFBVTFELE1BQVYsQ0FBbUIsQ0FBbkIsRUFBd0IwRCxVQUFVLENBQVYsSUFBaUIvRSxTQUF6QyxDQUFxRCtFLFVBQVUsQ0FBVixDQUFyRCxDQUFvRSxFQUFqRixDQUVBMnZJLGVBQWUsSUFBZixDQUFxQmlOLElBQXJCLEVBRUEsaUNBQWlDLElBQTFCLENBQWdDck4saUJBQWlCcU4sSUFBakIsRUFBdUJybEosSUFBdkIsQ0FBNEIsSUFBNUIsQ0FBa0NtK0YsTUFBbEMsQ0FBMENrbkQsS0FBSy9ILFFBQS9DLENBQXlEK0gsS0FBSzkvSCxZQUE5RCxDQUFoQyxDQUFQLENBQ0QsQ0FDRDs7Ozs7O09BU0FnMEgsWUFBWThMLElBQVosQ0FBa0IsQ0FBQyxDQUNqQnhnSixJQUFLLE9BRFksQ0FFakI5QyxNQUFPLGNBQUEsRUFBaUIsQ0FDdEIsVUFBWSxJQUFaLENBRUEsV0FBYTBHLFVBQVUxRCxNQUFWLENBQW1CLENBQW5CLEVBQXdCMEQsVUFBVSxDQUFWLElBQWlCL0UsU0FBekMsQ0FBcUQrRSxVQUFVLENBQVYsQ0FBckQsQ0FBb0UsS0FBSzAxRixNQUF0RixDQUNBLFlBQWMsV0FBQSxDQUFZLFNBQVV6OEYsT0FBVixDQUFtQixDQUMzQyxDQUFDeThGLE9BQU93UCxJQUFQLG1CQUFBLENBQWlDeFAsT0FBT3dQLElBQXhDLENBQStDNTNGLFFBQVFyVSxPQUFSLENBQWdCeThGLE9BQU93UCxJQUF2QixDQUFoRCxFQUE4RTNyRyxJQUE5RSxDQUFtRixTQUFVMnJHLElBQVYsQ0FBZ0IsQ0FDakcsc0JBQXdCdGMsTUFBTXFvRCxXQUFOLENBQWtCLENBQ3hDcjBHLFNBQVUsZ0JBQUEsQ0FBaUI4NEQsT0FBT3NQLElBQXhCLENBQThCcHZHLE9BQU80bkIsTUFBUCxDQUFjazRFLE9BQU85NEQsUUFBckIsQ0FBK0IsQ0FDckVzb0UsS0FBTUEsSUFEK0QsQ0FBL0IsQ0FBOUIsQ0FEOEIsQ0FJeEN0c0QsU0FBVTg4QyxPQUFPOThDLFFBSnVCLENBQWxCLENBQXhCLENBTUloYyxTQUFXMjZHLGtCQUFrQjM2RyxRQU5qQyxDQU9JZ2MsU0FBVzIrRixrQkFBa0IzK0YsUUFQakMsQ0FTQTMvQyxRQUFRMnZGLE1BQU1xb0QsV0FBTixDQUFrQixDQUN4QnB5RixLQUFNLFFBQUEsQ0FBU2ppQixRQUFULENBQW1CZ2MsUUFBbkIsQ0FEa0IsQ0FBbEIsRUFFTGlHLElBRkgsRUFHRCxDQWJELEVBY0QsQ0FmYSxDQUFkLENBaUJBaThGLE1BQU12TCxpQkFBaUJxTixLQUFLL21KLFNBQXRCLENBQU4sQ0FBd0MsTUFBeEMsQ0FBZ0QsSUFBaEQsRUFBc0QwQixJQUF0RCxDQUEyRCxJQUEzRCxDQUFpRW1YLE9BQWpFLEVBRUEsY0FBQSxDQUNELENBMUJnQixDQUFELENBQWxCLEVBNkJBc2hJLFNBQVM0TSxJQUFULENBQWV2RixjQUFmLEVBRUEsV0FBQSxDQUNELENBakdELENBaUdFTCxhQWpHRixDQUZBLENBcUdBajlILGlCQUFpQkEsaUJBQWlCQSxpQkFBaUI2aUksSUFBakIsQ0FBdUIsVUFBdkIsQ0FBbUN4SCxhQUFhLEVBQWIsQ0FBaUI0QixjQUFjbkMsUUFBL0IsQ0FBeUMsQ0FDNUc3dkMsS0FBTSxjQURzRyxDQUU1R0UsS0FBTSxJQUZzRyxDQUc1R3RvRSxTQUFVLENBQ1JWLEtBQU0sRUFERSxDQUVSdkQsT0FBUSxFQUZBLENBR1I4bUUsY0FBZSxFQUhQLENBSVJ5RixLQUFNLFFBQUEsRUFKRSxDQUtSdEYsYUFBYyxLQUxOLENBTVJDLGVBQWdCLEVBTlIsQ0FPUkMsVUFBVyxDQVBILENBSGtHLENBQXpDLENBQW5DLENBQWpCLENBWVosY0FaWSxDQVlJczFDLGFBQWEsRUFBYixDQUFpQjRCLGNBQWNsNkgsWUFBL0IsQ0FaSixDQUFqQixDQVlvRSxRQVpwRSxDQVk4RSxjQUFBLEVBWjlFLEVBY0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztLQTBCQSx1QkFFQSxTQUFVdTZILGNBQVYsQ0FBMEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQWtDeEIsY0FBQSxFQUFpQixDQUNmLFNBQUEsQ0FFQSxXQUFhcjNJLFVBQVUxRCxNQUFWLENBQW1CLENBQW5CLEVBQXdCMEQsVUFBVSxDQUFWLElBQWlCL0UsU0FBekMsQ0FBcUQrRSxVQUFVLENBQVYsQ0FBckQsQ0FBb0UsRUFBakYsQ0FFQTJ2SSxlQUFlLElBQWYsQ0FBcUJrTixLQUFyQixFQUVBajBELE1BQVFpbkQsMEJBQTBCLElBQTFCLENBQWdDTixpQkFBaUJzTixLQUFqQixFQUF3QnRsSixJQUF4QixDQUE2QixJQUE3QixDQUFtQ20rRixNQUFuQyxDQUEyQ21uRCxNQUFNaEksUUFBakQsQ0FBMkRnSSxNQUFNLy9ILFlBQWpFLENBQWhDLENBQVIsQ0FFQSxHQUFJNDRFLE9BQU8raEQsS0FBWCxDQUFrQixDQUNoQjd1RCxNQUFNNnVELEtBQU4sQ0FBWS9oRCxNQUFaLEVBRUFvbEQsTUFBTXZMLGlCQUFpQnNOLE1BQU1obkosU0FBdkIsQ0FBTixDQUF5QyxNQUF6QyxDQUFpRGkvSSxzQkFBc0Jsc0QsS0FBdEIsQ0FBakQsRUFBK0VyeEYsSUFBL0UsQ0FBb0Z1OUksc0JBQXNCbHNELEtBQXRCLENBQXBGLEVBQ0QsQ0FFRCxZQUFBLENBQ0QsQ0FDRDs7Ozs7O09BU0Frb0QsWUFBWStMLEtBQVosQ0FBbUIsQ0FBQyxDQUNsQnpnSixJQUFLLE9BRGEsQ0FFbEI5QyxNQUFPLGNBQUEsRUFBaUIsQ0FDdEIsV0FBYTBHLFVBQVUxRCxNQUFWLENBQW1CLENBQW5CLEVBQXdCMEQsVUFBVSxDQUFWLElBQWlCL0UsU0FBekMsQ0FBcUQrRSxVQUFVLENBQVYsQ0FBckQsQ0FBb0UsS0FBSzAxRixNQUF0RixDQUVBLHNCQUF3QixLQUFLdTdDLFdBQUwsQ0FBaUIsQ0FDdkNyMEcsU0FBVSxLQUFLKzlHLGFBQUwsQ0FBbUJqbEQsTUFBbkIsQ0FENkIsQ0FFdkM5OEMsU0FBVTg4QyxPQUFPOThDLFFBRnNCLENBQWpCLENBQXhCLENBSUloYyxTQUFXMjZHLGtCQUFrQjM2RyxRQUpqQyxDQUtJZ2MsU0FBVzIrRixrQkFBa0IzK0YsUUFMakMsQ0FPQSxZQUFZcTRGLFdBQUwsQ0FBaUIsQ0FDdEJweUYsS0FBTSxRQUFBLENBQVNqaUIsUUFBVCxDQUFtQmdjLFFBQW5CLENBRGdCLENBQWpCLEVBRUppRyxJQUZILENBR0QsQ0FmaUIsQ0FBRCxDQWdCaEIsQ0FDRHppRCxJQUFLLGVBREosQ0FFRDlDLE1BQU8sc0JBQUEsRUFBeUIsQ0FDOUIsV0FBYTBHLFVBQVUxRCxNQUFWLENBQW1CLENBQW5CLEVBQXdCMEQsVUFBVSxDQUFWLElBQWlCL0UsU0FBekMsQ0FBcUQrRSxVQUFVLENBQVYsQ0FBckQsQ0FBb0UsRUFBakYsQ0FDQSx3QkFBTyxDQUFrQjAxRixPQUFPOTRELFFBQVAsQ0FBZ0J2SCxNQUFsQyxDQUEwQ3FnRSxPQUFPOTRELFFBQVAsQ0FBZ0JzOUQsSUFBMUQsQ0FBZ0V4RSxPQUFPOTRELFFBQVAsQ0FBZ0J1OEQsY0FBaEYsQ0FBZ0d6RCxPQUFPOTRELFFBQVAsQ0FBZ0JzOEQsZUFBaEgsQ0FBaUl4RCxPQUFPOTRELFFBQVAsQ0FBZ0JpK0QsR0FBakosQ0FBUCxDQUNELENBTEEsQ0FoQmdCLENBQW5CLEVBd0JBbTFDLFNBQVM2TSxLQUFULENBQWdCeEYsY0FBaEIsRUFFQSxZQUFBLENBQ0QsQ0F2RkQsQ0F1RkVMLGFBdkZGLENBRkEsQ0EyRkFqOUgsaUJBQWlCQSxpQkFBaUI4aUksS0FBakIsQ0FBd0IsVUFBeEIsQ0FBb0N6SCxhQUFhLEVBQWIsQ0FBaUI0QixjQUFjbkMsUUFBL0IsQ0FBeUMsQ0FDNUZqNEcsU0FBVSxDQUNSdkgsT0FBUSxHQURBLENBRVI2a0UsS0FBTSxFQUZFLENBR1JmLGVBQWdCLENBSFIsQ0FJUkQsZ0JBQWlCLENBSlQsQ0FLUjJCLElBQUtyOEYsS0FBSytmLEVBQUwsQ0FBVSxDQUxQLENBRGtGLENBQXpDLENBQXBDLENBQWpCLENBUUssY0FSTCxDQVFxQjYySCxhQUFhLEVBQWIsQ0FBaUI0QixjQUFjbDZILFlBQS9CLENBQTZDLENBQ2hFOGYsU0FBVSxDQUFDLFFBQUQsQ0FBVyxNQUFYLENBQW1CLGdCQUFuQixDQUFxQyxpQkFBckMsQ0FBd0QsS0FBeEQsQ0FEc0QsQ0FBN0MsQ0FSckIsRUFZQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0tBMEJBLDJCQUVBLFNBQVV5NkcsY0FBVixDQUEwQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0FvQ3hCLGtCQUFBLEVBQXFCLENBQ25CLFNBQUEsQ0FFQSxXQUFhcjNJLFVBQVUxRCxNQUFWLENBQW1CLENBQW5CLEVBQXdCMEQsVUFBVSxDQUFWLElBQWlCL0UsU0FBekMsQ0FBcUQrRSxVQUFVLENBQVYsQ0FBckQsQ0FBb0UsRUFBakYsQ0FFQTJ2SSxlQUFlLElBQWYsQ0FBcUJtTixTQUFyQixFQUVBbDBELE1BQVFpbkQsMEJBQTBCLElBQTFCLENBQWdDTixpQkFBaUJ1TixTQUFqQixFQUE0QnZsSixJQUE1QixDQUFpQyxJQUFqQyxDQUF1Q20rRixNQUF2QyxDQUErQ29uRCxVQUFVakksUUFBekQsQ0FBbUVpSSxVQUFVaGdJLFlBQTdFLENBQWhDLENBQVIsQ0FFQSxHQUFJNDRFLE9BQU8raEQsS0FBWCxDQUFrQixDQUNoQjd1RCxNQUFNNnVELEtBQU4sQ0FBWS9oRCxNQUFaLEVBRUFvbEQsTUFBTXZMLGlCQUFpQnVOLFVBQVVqbkosU0FBM0IsQ0FBTixDQUE2QyxNQUE3QyxDQUFxRGkvSSxzQkFBc0Jsc0QsS0FBdEIsQ0FBckQsRUFBbUZyeEYsSUFBbkYsQ0FBd0Z1OUksc0JBQXNCbHNELEtBQXRCLENBQXhGLEVBQ0QsQ0FFRCxZQUFBLENBQ0QsQ0FDRDs7Ozs7O09BU0Frb0QsWUFBWWdNLFNBQVosQ0FBdUIsQ0FBQyxDQUN0QjFnSixJQUFLLE9BRGlCLENBRXRCOUMsTUFBTyxjQUFBLEVBQWlCLENBQ3RCLFdBQWEwRyxVQUFVMUQsTUFBVixDQUFtQixDQUFuQixFQUF3QjBELFVBQVUsQ0FBVixJQUFpQi9FLFNBQXpDLENBQXFEK0UsVUFBVSxDQUFWLENBQXJELENBQW9FLEtBQUswMUYsTUFBdEYsQ0FFQSxzQkFBd0IsS0FBS3U3QyxXQUFMLENBQWlCLENBQ3ZDcjBHLFNBQVUsS0FBSys5RyxhQUFMLENBQW1CamxELE1BQW5CLENBRDZCLENBRXZDOThDLFNBQVU4OEMsT0FBTzk4QyxRQUZzQixDQUFqQixDQUF4QixDQUlJaGMsU0FBVzI2RyxrQkFBa0IzNkcsUUFKakMsQ0FLSWdjLFNBQVcyK0Ysa0JBQWtCMytGLFFBTGpDLENBT0EsWUFBWXE0RixXQUFMLENBQWlCLENBQ3RCcHlGLEtBQU0sUUFBQSxDQUFTamlCLFFBQVQsQ0FBbUJnYyxRQUFuQixDQURnQixDQUFqQixFQUVKaUcsSUFGSCxDQUdELENBZnFCLENBQUQsQ0FnQnBCLENBQ0R6aUQsSUFBSyxlQURKLENBRUQ5QyxNQUFPLHNCQUFBLEVBQXlCLENBQzlCLFdBQWEwRyxVQUFVMUQsTUFBVixDQUFtQixDQUFuQixFQUF3QjBELFVBQVUsQ0FBVixJQUFpQi9FLFNBQXpDLENBQXFEK0UsVUFBVSxDQUFWLENBQXJELENBQW9FLEVBQWpGLENBQ0EsZUFBaUIwMUYsT0FBTzVpRCxNQUFQLENBQWdCOG5ELHVCQUFoQixDQUEwQ1IsaUJBQTNELENBQ0EscUJBQU8sQ0FBZTFFLE9BQU85NEQsUUFBUCxDQUFnQnZILE1BQS9CLENBQXVDcWdFLE9BQU85NEQsUUFBUCxDQUFnQnM5RCxJQUF2RCxDQUE2RHhFLE9BQU85NEQsUUFBUCxDQUFnQnU4RCxjQUE3RSxDQUE2RnpELE9BQU85NEQsUUFBUCxDQUFnQnM4RCxlQUE3RyxDQUE4SHhELE9BQU85NEQsUUFBUCxDQUFnQnBpQixDQUE5SSxDQUFpSms3RSxPQUFPOTRELFFBQVAsQ0FBZ0I5VSxDQUFqSyxDQUFQLENBQ0QsQ0FOQSxDQWhCb0IsQ0FBdkIsRUF5QkFrb0gsU0FBUzhNLFNBQVQsQ0FBb0J6RixjQUFwQixFQUVBLGdCQUFBLENBQ0QsQ0ExRkQsQ0EwRkVMLGFBMUZGLENBRkEsQ0E4RkFqOUgsaUJBQWlCQSxpQkFBaUIraUksU0FBakIsQ0FBNEIsVUFBNUIsQ0FBd0MxSCxhQUFhLEVBQWIsQ0FBaUI0QixjQUFjbkMsUUFBL0IsQ0FBeUMsQ0FDaEdqNEcsU0FBVSxDQUNSdkgsT0FBUSxHQURBLENBRVI2a0UsS0FBTSxFQUZFLENBR1JmLGVBQWdCLEVBSFIsQ0FJUkQsZ0JBQWlCLENBSlQsQ0FLUjErRSxFQUFHLENBTEssQ0FNUnNOLEVBQUcsQ0FOSyxDQURzRixDQUF6QyxDQUF4QyxDQUFqQixDQVNLLGNBVEwsQ0FTcUJzdEgsYUFBYSxFQUFiLENBQWlCNEIsY0FBY2w2SCxZQUEvQixDQUE2QyxDQUNoRThmLFNBQVUsQ0FBQyxRQUFELENBQVcsTUFBWCxDQUFtQixnQkFBbkIsQ0FBcUMsaUJBQXJDLENBQXdELEdBQXhELENBQTZELEdBQTdELENBRHNELENBQTdDLENBVHJCLEVBYUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0tBcUNBLHNCQUVBLFNBQVV5NkcsY0FBVixDQUEwQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09Ba0N4QixhQUFBLEVBQWdCLENBQ2QsU0FBQSxDQUVBLFdBQWFyM0ksVUFBVTFELE1BQVYsQ0FBbUIsQ0FBbkIsRUFBd0IwRCxVQUFVLENBQVYsSUFBaUIvRSxTQUF6QyxDQUFxRCtFLFVBQVUsQ0FBVixDQUFyRCxDQUFvRSxFQUFqRixDQUVBMnZJLGVBQWUsSUFBZixDQUFxQm9OLElBQXJCLEVBRUFuMEQsTUFBUWluRCwwQkFBMEIsSUFBMUIsQ0FBZ0NOLGlCQUFpQndOLElBQWpCLEVBQXVCeGxKLElBQXZCLENBQTRCLElBQTVCLENBQWtDbStGLE1BQWxDLENBQTBDcW5ELEtBQUtsSSxRQUEvQyxDQUF5RGtJLEtBQUtqZ0ksWUFBOUQsQ0FBaEMsQ0FBUixDQUVBLEdBQUk0NEUsT0FBTytoRCxLQUFYLENBQWtCLENBQ2hCN3VELE1BQU02dUQsS0FBTixDQUFZL2hELE1BQVosRUFFQW9sRCxNQUFNdkwsaUJBQWlCd04sS0FBS2xuSixTQUF0QixDQUFOLENBQXdDLE1BQXhDLENBQWdEaS9JLHNCQUFzQmxzRCxLQUF0QixDQUFoRCxFQUE4RXJ4RixJQUE5RSxDQUFtRnU5SSxzQkFBc0Jsc0QsS0FBdEIsQ0FBbkYsRUFDRCxDQUVELFlBQUEsQ0FDRCxDQUNEOzs7Ozs7T0FTQWtvRCxZQUFZaU0sSUFBWixDQUFrQixDQUFDLENBQ2pCM2dKLElBQUssT0FEWSxDQUVqQjlDLE1BQU8sY0FBQSxFQUFpQixDQUN0QixXQUFhMEcsVUFBVTFELE1BQVYsQ0FBbUIsQ0FBbkIsRUFBd0IwRCxVQUFVLENBQVYsSUFBaUIvRSxTQUF6QyxDQUFxRCtFLFVBQVUsQ0FBVixDQUFyRCxDQUFvRSxLQUFLMDFGLE1BQXRGLENBRUEsc0JBQXdCLEtBQUt1N0MsV0FBTCxDQUFpQixDQUN2Q3IwRyxTQUFVLEtBQUsrOUcsYUFBTCxDQUFtQmpsRCxNQUFuQixDQUQ2QixDQUV2Qzk4QyxTQUFVODhDLE9BQU85OEMsUUFGc0IsQ0FBakIsQ0FBeEIsQ0FJSWhjLFNBQVcyNkcsa0JBQWtCMzZHLFFBSmpDLENBS0lnYyxTQUFXMitGLGtCQUFrQjMrRixRQUxqQyxDQU9BLFlBQVlxNEYsV0FBTCxDQUFpQixDQUN0QnB5RixLQUFNLFFBQUEsQ0FBU2ppQixRQUFULENBQW1CZ2MsUUFBbkIsQ0FEZ0IsQ0FBakIsRUFFSmlHLElBRkgsQ0FHRCxDQWZnQixDQUFELENBZ0JmLENBQ0R6aUQsSUFBSyxlQURKLENBRUQ5QyxNQUFPLHNCQUFBLEVBQXlCLENBQzlCLFdBQWEwRyxVQUFVMUQsTUFBVixDQUFtQixDQUFuQixFQUF3QjBELFVBQVUsQ0FBVixJQUFpQi9FLFNBQXpDLENBQXFEK0UsVUFBVSxDQUFWLENBQXJELENBQW9FLEVBQWpGLENBQ0EsYUFBZSxJQUFLMDFGLE9BQU81aUQsTUFBUCxDQUFnQm1uRCxrQkFBaEIsQ0FBcUNSLFlBQTFDLEVBQXdEL0QsT0FBTzk0RCxRQUFQLENBQWdCa2dDLElBQXhFLENBQThFNDRCLE9BQU85NEQsUUFBUCxDQUFnQjRwRSxRQUE5RixDQUF3RzlRLE9BQU85NEQsUUFBUCxDQUFnQnZILE1BQXhILENBQWdJcWdFLE9BQU85NEQsUUFBUCxDQUFnQm0rRyxjQUFoSixDQUFnS3JsRCxPQUFPOTRELFFBQVAsQ0FBZ0J3OEQsTUFBaEwsQ0FBZixDQUNBLGVBQUEsQ0FDRCxDQU5BLENBaEJlLENBQWxCLEVBeUJBNDJDLFNBQVMrTSxJQUFULENBQWUxRixjQUFmLEVBRUEsV0FBQSxDQUNELENBeEZELENBd0ZFTCxhQXhGRixDQUZBLENBNEZBajlILGlCQUFpQkEsaUJBQWlCZ2pJLElBQWpCLENBQXVCLFVBQXZCLENBQW1DM0gsYUFBYSxFQUFiLENBQWlCNEIsY0FBY25DLFFBQS9CLENBQXlDLENBQzNGajRHLFNBQVUsQ0FDUmtnQyxLQUFNLGNBQUEsQ0FBZSxXQUFBLENBQVksQ0FBWixDQUFlLENBQWYsQ0FBa0IsQ0FBbEIsQ0FBZixDQUFxQyxXQUFBLENBQVksQ0FBWixDQUFlLENBQWYsQ0FBa0IsQ0FBbEIsQ0FBckMsQ0FERSxDQUVSMHBDLFNBQVUsRUFGRixDQUdSbnhFLE9BQVEsQ0FIQSxDQUlSMGxILGVBQWdCLENBSlIsQ0FLUjNoRCxPQUFRLEtBTEEsQ0FEaUYsQ0FBekMsQ0FBbkMsQ0FBakIsQ0FRSyxjQVJMLENBUXFCZzhDLGFBQWEsRUFBYixDQUFpQjRCLGNBQWNsNkgsWUFBL0IsQ0FBNkMsQ0FDaEU4ZixTQUFVLENBQUMsTUFBRCxDQUFTLFVBQVQsQ0FBcUIsUUFBckIsQ0FBK0IsZ0JBQS9CLENBQWlELFFBQWpELENBRHNELENBQTdDLENBUnJCLEVBWUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0tBc0JBLHlCQUVBLFNBQVV5NkcsY0FBVixDQUEwQixDQUN4QixpQkFBQSxFQUFvQixDQUNsQixTQUFBLENBRUExSCxlQUFlLElBQWYsQ0FBcUJxTixRQUFyQixFQUVBcDBELE1BQVFpbkQsMEJBQTBCLElBQTFCLENBQWdDTixpQkFBaUJ5TixRQUFqQixFQUEyQnpsSixJQUEzQixDQUFnQyxJQUFoQyxDQUFzQyxFQUF0QyxDQUFoQyxDQUFSLENBRUEsSUFBSyxNQUFRLENBQWIsQ0FBZ0JvRixFQUFJcUQsVUFBVTFELE1BQTlCLENBQXNDSyxHQUF0QyxDQUEyQyxDQUN6QyxRQUFVQSxFQUFJLENBQUosRUFBU3FELFVBQVUxRCxNQUFWLEVBQW9CSyxDQUE3QixDQUFpQzFCLFNBQWpDLENBQTZDK0UsVUFBVXJELENBQVYsQ0FBdkQsQ0FDQSxHQUFJdkYsd0JBQUosQ0FBOEJBLElBQUk2bEosS0FBSixDQUFVbkksc0JBQXNCQSxzQkFBc0Jsc0QsS0FBdEIsQ0FBdEIsQ0FBVixFQUE5QixRQUFzR3h4Rix1QkFBSixDQUE2Qnd4RixNQUFNeXNELE1BQU4sQ0FBYTd6SCxHQUFiLENBQWlCcHFCLEdBQWpCLEVBQ2hJLENBRUQsWUFBQSxDQUNELENBRUQwNUksWUFBWWtNLFFBQVosQ0FBc0IsQ0FBQyxDQUNyQjVnSixJQUFLLE9BRGdCLENBRXJCOUMsTUFBTyxjQUFBLEVBQWlCLENBQ3RCLG1CQUFPLEVBQVAsQ0FDRCxDQUpvQixDQUFELENBQXRCLEVBT0EwMkksU0FBU2dOLFFBQVQsQ0FBbUIzRixjQUFuQixFQUVBLGVBQUEsQ0FDRCxDQTFCRCxDQTBCRUwsYUExQkYsQ0FGQSxDQThCQTs7Ozs7Ozs7O0tBWUEsK0JBRUEsVUFBWSxDQUNWLHNCQUFBLEVBQXlCLENBQ3ZCLGNBQWdCaDNJLFVBQVUxRCxNQUFWLENBQW1CLENBQW5CLEVBQXdCMEQsVUFBVSxDQUFWLElBQWlCL0UsU0FBekMsQ0FBcUQrRSxVQUFVLENBQVYsQ0FBckQsQ0FBb0VPLFNBQVMyOEksSUFBN0YsQ0FFQXZOLGVBQWUsSUFBZixDQUFxQndOLGFBQXJCLEVBRUEsR0FBSXhnRixVQUFVQSxTQUFkLENBQXlCLENBQ3ZCL3FELFFBQVE2UCxJQUFSLENBQWEscUZBQWIsRUFDQSxLQUFLazdDLFNBQUwsQ0FBaUJBLFVBQVVBLFNBQTNCLENBQ0QsQ0FIRCxVQUdZQSxTQUFMLENBQWlCQSxTQUFqQixDQUVQLEtBQUtsOEQsYUFBTCxHQUNELENBQ0Q7Ozs7O09BUUFxd0ksWUFBWXFNLGFBQVosQ0FBMkIsQ0FBQyxDQUMxQi9nSixJQUFLLGVBRHFCLENBRTFCOUMsTUFBTyxzQkFBQSxFQUF5QixDQUM5QixLQUFLay9DLE9BQUwsQ0FBZWo1QyxPQUFPZ0IsUUFBUCxDQUFnQkUsYUFBaEIsQ0FBOEIsS0FBOUIsQ0FBZixDQUNBLEtBQUsrM0MsT0FBTCxDQUFhNGtHLFNBQWIsQ0FBeUIsU0FBekIsQ0FDQSxLQUFLNWtHLE9BQUwsQ0FBYS95QyxLQUFiLENBQW1CaXpCLEtBQW5CLENBQTJCLFNBQTNCLENBQ0EsS0FBSzhmLE9BQUwsQ0FBYS95QyxLQUFiLENBQW1Ca3pCLE1BQW5CLENBQTRCLFNBQTVCLENBQ0EsS0FBSzZmLE9BQUwsQ0FBYS95QyxLQUFiLENBQW1COG5CLFFBQW5CLENBQThCLFVBQTlCLENBQ0QsQ0FSeUIsQ0FBRCxDQVN4QixDQUNEbnhCLElBQUssU0FESixDQUVEOUMsTUFBTyxnQkFBQSxDQUFpQnU4SSxRQUFqQixDQUEyQixDQUNoQ0EsU0FBUzVvSSxHQUFULENBQWEsU0FBYixDQUF3QixLQUFLdXJDLE9BQTdCLEVBRUFxOUYsU0FBUzVvSSxHQUFULENBQWEsV0FBYixDQUEwQixLQUFLMHZELFNBQS9CLEVBQ0QsQ0FOQSxDQVR3QixDQWdCeEIsQ0FDRHZnRSxJQUFLLFdBREosQ0FFRDlDLE1BQU8sa0JBQUEsQ0FBbUI1QyxJQUFuQixDQUF5QixDQUM5QkEsS0FBS2ltRSxTQUFMLENBQWUvMkQsV0FBZixDQUEyQmxQLEtBQUs4aEQsT0FBaEMsRUFDRCxDQUpBLENBaEJ3QixDQUEzQixFQXVCQSxvQkFBQSxDQUNELENBN0NELEVBRkEsQ0FpREE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztLQXVCQSxpQ0FFQSxVQUFZOzs7Ozs7Ozs7OztPQWVWLHdCQUFBLEVBQTJCLENBQ3pCLFdBQWF4NEMsVUFBVTFELE1BQVYsQ0FBbUIsQ0FBbkIsRUFBd0IwRCxVQUFVLENBQVYsSUFBaUIvRSxTQUF6QyxDQUFxRCtFLFVBQVUsQ0FBVixDQUFyRCxDQUFvRSxFQUFqRixDQUNBLGVBQWlCQSxVQUFVMUQsTUFBVixDQUFtQixDQUFuQixDQUF1QjBELFVBQVUsQ0FBVixDQUF2QixDQUFzQy9FLFNBQXZELENBRUEwMEksZUFBZSxJQUFmLENBQXFCME4sZUFBckIsRUFFQXRqSSxpQkFBaUIsSUFBakIsQ0FBdUIsU0FBdkIsQ0FBa0MsSUFBbEMsRUFFQSxLQUFLMjdFLE1BQUwsQ0FBYzkvRixPQUFPNG5CLE1BQVAsQ0FBYyxDQUMxQmtiLE1BQU9uNUIsT0FBTys2SSxVQURZLENBRTFCM2hILE9BQVFwNUIsT0FBT2c3SSxXQUZXLENBRzFCcG5DLFdBQVksV0FBQSxDQUFZLENBQVosQ0FBZSxDQUFmLENBSGMsQ0FJMUIxcEIsV0FBWWxxRixPQUFPKzlJLGdCQUpPLENBSzFCQyxRQUFTLFFBTGlCLENBTTFCQyxVQUFXLENBTmUsQ0FPMUIzcUYsU0FBVSxFQVBnQixDQVExQjRxRixJQUFLLFlBQUEsRUFBZSxFQVJNLENBQWQsQ0FTWC9uRCxNQVRXLENBQWQsQ0FVQSxpQkFBbUIsS0FBS0EsTUFBeEIsQ0FDSTZuRCxRQUFVRyxhQUFhSCxPQUQzQixDQUVJQyxVQUFZRSxhQUFhRixTQUY3QixDQUdJMXpFLFVBQVk0ekUsYUFBYTdxRixRQUg3QixDQUlJNDJCLFdBQWFpMEQsYUFBYWowRCxVQUo5QixDQUtJL3dELE1BQVFnbEgsYUFBYWhsSCxLQUx6QixDQU1JQyxPQUFTK2tILGFBQWEva0gsTUFOMUIsQ0FPSXc2RSxXQUFhdXFDLGFBQWF2cUMsVUFQOUIsQ0FRSXNxQyxJQUFNQyxhQUFhRCxHQVJ2QixDQVNBLEtBQUs1cUYsUUFBTCxDQUFnQixpQkFBQSxDQUFrQmlYLFNBQWxCLENBQWhCLENBQ0EsS0FBSzZ6RSxPQUFMLENBQWUsRUFBZixDQUNBLEtBQUs5cUYsUUFBTCxDQUFja0IsYUFBZCxDQUE0QndwRixPQUE1QixDQUFxQ0MsU0FBckMsRUFDQSxHQUFJL3pELFVBQUosQ0FBZ0IsS0FBSzUyQixRQUFMLENBQWN3MkIsYUFBZCxDQUE0QkksVUFBNUIsRUFDaEIsS0FBS2h2RCxPQUFMLENBQWF4ZCxPQUFPeWIsTUFBUXk2RSxXQUFXamtHLENBQTFCLEVBQTZCMHVJLE9BQTdCLEVBQWIsQ0FBcUQzZ0ksT0FBTzBiLE9BQVN3NkUsV0FBV3p6RixDQUEzQixFQUE4QmsrSCxPQUE5QixFQUFyRCxFQUVBLElBQUssT0FBTCxjQUFBLENBQTRCLENBQzFCLEdBQUlDLFdBQVd6aEosR0FBWCxDQUFKLENBQXFCLEtBQUswaEosZUFBTCxDQUFxQjFoSixHQUFyQixFQUN0QixDQUVEcWhKLElBQUksS0FBSzVxRixRQUFULEVBQ0QsQ0FDRDs7Ozs7O09BU0FpK0UsWUFBWXVNLGVBQVosQ0FBNkIsQ0FBQyxDQUM1QmpoSixJQUFLLGlCQUR1QixDQUU1QjlDLE1BQU8sd0JBQUEsQ0FBeUJYLElBQXpCLENBQStCLENBQ3BDMGtKLGdCQUFnQlEsVUFBaEIsQ0FBMkJsbEosSUFBM0IsRUFBaUNvSCxLQUFqQyxDQUF1QyxJQUF2QyxDQUE2QyxDQUFDLEtBQUs4eUQsUUFBTixDQUE3QyxFQUNELENBQ0Q7Ozs7Ozs7O1VBTDJCLENBZTFCLENBQ0R6MkQsSUFBSyxtQkFESixDQUVEOUMsTUFBTywwQkFBQSxDQUEyQmsvQyxPQUEzQixDQUFvQ3dhLEtBQXBDLENBQTJDai9CLE1BQTNDLENBQW1ELENBQ3hELFVBQVksSUFBWixDQUVBLEtBQUtpL0IsS0FBTCxDQUFhQSxLQUFiLENBQ0EsS0FBS2ovQixNQUFMLENBQWNBLE1BQWQsQ0FDQSxLQUFLZ3FILGNBQUwsQ0FBb0J2bEcsT0FBcEIsRUFDQSxlQUFPLENBQVMsVUFBWSxDQUMxQixhQUFhcWEsUUFBTixDQUFlcUIsTUFBZixDQUFzQjAwQixNQUFNNTFCLEtBQTVCLENBQW1DNDFCLE1BQU03MEQsTUFBekMsQ0FBUCxDQUNELENBRk0sQ0FBUCxDQUdELENBQ0Q7Ozs7Ozs7VUEzQjJCLENBb0MxQixDQUNEMzNCLElBQUssUUFESixDQUVEOUMsTUFBTyxlQUFBLENBQWdCMGtKLE9BQWhCLENBQXlCLENBQzlCLFdBQWEsSUFBYixDQUVBLGVBQWlCaCtJLFVBQVUxRCxNQUFWLENBQW1CLENBQW5CLEVBQXdCMEQsVUFBVSxDQUFWLElBQWlCL0UsU0FBekMsQ0FBcUQrRSxVQUFVLENBQVYsQ0FBckQsQ0FBb0UsVUFBWSxDQUMvRmcrSSxRQUFROXBGLE1BQVIsQ0FBZW84RSxPQUFPdDlFLEtBQXRCLENBQTZCczlFLE9BQU92OEcsTUFBcEMsRUFDRCxDQUZELENBR0EsS0FBS2txSCxVQUFMLENBQWdCOWdKLElBQWhCLEdBQ0EsU0FBVyxLQUFLMDFELFFBQUwsQ0FBY3AyQixPQUFkLEVBQVgsQ0FFQXVoSCxRQUFRdmpILE9BQVIsQ0FBZ0J5QixLQUFLeEQsS0FBckIsQ0FBNEJ3RCxLQUFLdkQsTUFBakMsRUFFQSxTQUFXLFFBQUEsQ0FBU3VsSCxVQUFULENBQVgsQ0FDQSxLQUFLUCxPQUFMLENBQWE3aEosSUFBYixDQUFrQjJ4SCxJQUFsQixFQUNBLEdBQUksS0FBSzd6RSxPQUFULENBQWtCNnpFLEtBQUt0dEYsS0FBTCxDQUFXLEtBQUtnK0csR0FBaEIsRUFDbEIsV0FBQSxDQUNELENBQ0Q7Ozs7OztVQXREMkIsQ0E4RDFCLENBQ0QvaEosSUFBSyxTQURKLENBRUQ5QyxNQUFPLGdCQUFBLENBQWlCby9CLEtBQWpCLENBQXdCQyxNQUF4QixDQUFnQyxDQUNyQyxHQUFJLEtBQUtrNkIsUUFBVCxDQUFtQixLQUFLQSxRQUFMLENBQWNwNEIsT0FBZCxDQUFzQi9CLEtBQXRCLENBQTZCQyxNQUE3QixFQUNwQixDQUNEOzs7OztVQW5FMkIsQ0EwRTFCLENBQ0R2OEIsSUFBSyxnQkFESixDQUVEOUMsTUFBTyx1QkFBQSxDQUF3QmsvQyxPQUF4QixDQUFpQyxDQUN0QyxXQUFhLEtBQUtxYSxRQUFMLENBQWMyekIsVUFBM0IsQ0FBdUM7RUFFdkNodUMsUUFBUTV5QyxXQUFSLENBQW9CNHlCLE1BQXBCLEVBQ0FBLE9BQU8veUIsS0FBUCxDQUFhaXpCLEtBQWIsQ0FBcUIsTUFBckIsQ0FDQUYsT0FBTy95QixLQUFQLENBQWFrekIsTUFBYixDQUFzQixNQUF0QixDQUNELENBQ0Q7Ozs7VUFuRjJCLENBeUYxQixDQUNEdjhCLElBQUssTUFESixDQUVEOUMsTUFBTyxhQUFBLEVBQWdCLENBQ3JCLEtBQUtzZ0QsT0FBTCxDQUFlLEtBQWYsQ0FDQSxLQUFLcWtHLFVBQUwsQ0FBZ0I5Z0osSUFBaEIsR0FDQSxLQUFLd2dKLE9BQUwsQ0FBYXJsSixPQUFiLENBQXFCLFNBQVVtMUgsSUFBVixDQUFnQixDQUNuQyxZQUFZdHdILElBQUwsRUFBUCxDQUNELENBRkQsRUFHRCxDQUNEOzs7O1VBbEcyQixDQXdHMUIsQ0FDRGYsSUFBSyxNQURKLENBRUQ5QyxNQUFPLGFBQUEsRUFBZ0IsQ0FDckIsS0FBS3NnRCxPQUFMLENBQWUsSUFBZixDQUNBLEtBQUtxa0csVUFBTCxDQUFnQjk5RyxLQUFoQixHQUNBLEtBQUt3OUcsT0FBTCxDQUFhcmxKLE9BQWIsQ0FBcUIsU0FBVW0xSCxJQUFWLENBQWdCLENBQ25DLFlBQVl0dEYsS0FBTCxFQUFQLENBQ0QsQ0FGRCxFQUdELENBUkEsQ0F4RzBCLENBaUgxQixDQUNEL2pDLElBQUssU0FESixDQUVEOUMsTUFBTyxnQkFBQSxDQUFpQnU4SSxRQUFqQixDQUEyQixDQUNoQyxXQUFhLElBQWIsQ0FFQUEsU0FBU3VJLE1BQVQsQ0FBZ0IsV0FBaEIsRUFFQXZJLFNBQVM1b0ksR0FBVCxDQUFhLFVBQWIsQ0FBeUIsS0FBSzRsRCxRQUE5QixFQUVBLEtBQUtzckYsR0FBTCxDQUFXdEksU0FBU3prSSxPQUFwQixDQUNBLEtBQUs2c0ksVUFBTCxDQUFrQixLQUFLSSxpQkFBTCxDQUF1QnhJLFNBQVN4MUksR0FBVCxDQUFhLFNBQWIsQ0FBdkIsQ0FBZ0R3MUksU0FBU3gxSSxHQUFULENBQWEsT0FBYixDQUFoRCxDQUF1RXcxSSxTQUFTeDFJLEdBQVQsQ0FBYSxRQUFiLEVBQXVCZzFJLE1BQTlGLENBQWxCLENBRUFRLFNBQVN2bEgsTUFBVCxDQUFnQixDQUNka29CLFFBQVMsZ0JBQUEsQ0FBaUI4bEcsUUFBakIsQ0FBMkIsQ0FDbEM1TixPQUFPcU4sY0FBUCxDQUFzQk8sUUFBdEIsRUFDRCxDQUhhLENBSWR0ckYsTUFBTyxjQUFBLENBQWV1ckYsTUFBZixDQUF1QixDQUM1QjdOLE9BQU8xOUUsS0FBUCxDQUFldXJGLE1BQWYsQ0FDRCxDQU5hLENBT2R4cUgsT0FBUSxlQUFBLENBQWdCeXFILE9BQWhCLENBQXlCLENBQy9COU4sT0FBTzM4RyxNQUFQLENBQWdCeXFILFFBQVFuSixNQUF4QixDQUNELENBVGEsQ0FBaEIsRUFXRCxDQXZCQSxDQWpIMEIsQ0F5STFCLENBQ0RqNUksSUFBSyxXQURKLENBRUQ5QyxNQUFPLGtCQUFBLENBQW1CNUMsSUFBbkIsQ0FBeUIsQ0FDOUIsV0FBYSxJQUFiLENBRUFBLEtBQUt1bkosVUFBTCxDQUFnQjk5RyxLQUFoQixDQUFzQixJQUF0QixFQUNBenBDLEtBQUtpbkosT0FBTCxDQUFhcmxKLE9BQWIsQ0FBcUIsU0FBVW0xSCxJQUFWLENBQWdCLENBQ25DLFlBQVl0dEYsS0FBTCxDQUFXcytHLE1BQVgsQ0FBUCxDQUNELENBRkQsRUFHRCxDQUNEOzs7O1VBbkoyQixDQXlKMUIsQ0FDRHJpSixJQUFLLFNBREosQ0FFRDlDLE1BQU8sZ0JBQUEsRUFBbUIsQ0FDeEIsS0FBSzZELElBQUwsR0FDQSxLQUFLMDFELFFBQUwsQ0FBY28yQixnQkFBZCxHQUNELENBTEEsQ0F6SjBCLENBQTdCLEVBaUtBLHNCQUFBLENBQ0QsQ0FqT0QsRUFGQSxDQXFPQWx2RSxpQkFBaUJzakksZUFBakIsQ0FBa0MsWUFBbEMsQ0FBZ0QsQ0FDOUNudUcsT0FBUSxlQUFBLENBQWdCMmpCLFFBQWhCLENBQTBCLENBQ2hDQSxTQUFTK1QsU0FBVCxDQUFtQmh0QixPQUFuQixDQUE2QixJQUE3QixDQUNELENBSDZDLENBQWhELEVBTUEsOEJBQWdDNWpELE9BQU8sMkJBQVAsQ0FBaEMsQ0FDQTs7Ozs7S0FPQSw2QkFFQSxVQUFZLENBQ1Ysb0JBQUEsRUFBdUIsQ0FDckIsd0JBQTBCZ0ssVUFBVTFELE1BQVYsQ0FBbUIsQ0FBbkIsRUFBd0IwRCxVQUFVLENBQVYsSUFBaUIvRSxTQUF6QyxDQUFxRCtFLFVBQVUsQ0FBVixDQUFyRCxDQUFvRSxLQUE5RixDQUVBMnZJLGVBQWUsSUFBZixDQUFxQitPLFdBQXJCLEVBRUEsS0FBSzFyRixLQUFMLENBQWEyckYsb0JBQXNCLElBQXRCLENBQTZCLFNBQUEsRUFBMUMsQ0FDRCxDQUVEN04sWUFBWTROLFdBQVosQ0FBeUIsQ0FBQyxDQUN4QnRpSixJQUFLLFNBRG1CLENBRXhCOUMsTUFBTyxnQkFBQSxDQUFpQnU4SSxRQUFqQixDQUEyQixDQUNoQ0EsU0FBUzVvSSxHQUFULENBQWEsT0FBYixDQUFzQixLQUFLK2xELEtBQTNCLEVBQ0QsQ0FKdUIsQ0FBRCxDQUt0QixDQUNENTJELElBQUssV0FESixDQUVEOUMsTUFBTyxrQkFBQSxDQUFtQjVDLElBQW5CLENBQXlCLENBQzlCZCxPQUFPNG5CLE1BQVAsQ0FBYyxJQUFkLENBQW9CLENBQ2xCZ0UsSUFBSyxZQUFBLENBQWFybEIsTUFBYixDQUFxQixDQUN4QixVQUFZLElBQVosQ0FFQSxxQ0FFQW81SSxZQUFZMzhJLElBQVosQ0FBaUIsZ0JBQUEsRUFBbUIsQ0FDbEMsbUJBQW1CekIsSUFBWixDQUFpQixpQkFBQSxDQUFrQjB1RixRQUFsQixDQUE0QixDQUNsRCxNQUFPLENBQVAsQ0FBVSxDQUNSLE9BQVFBLFNBQVM5b0YsSUFBVCxDQUFnQjhvRixTQUFTM3JGLElBQWpDLEVBQ0UsTUFBQSxDQUNFLEdBQUksQ0FBQ2lDLE9BQU93UixNQUFaLENBQW9CLENBQ2xCazRFLFNBQVMzckYsSUFBVCxDQUFnQixDQUFoQixDQUNBLE1BQ0QsQ0FFRDJyRixTQUFTM3JGLElBQVQsQ0FBZ0IsQ0FBaEIsQ0FDQSxjQUFjeVQsTUFBUCxDQUFjd21DLE1BQWQsQ0FBcUJoNEMsTUFBckIsQ0FBUCxDQUVGLE1BQUEsQ0FDRTBwRixTQUFTM3JGLElBQVQsQ0FBZ0IsQ0FBaEIsQ0FDQSxjQUFjZzdJLElBQVAsRUFBUCxDQUVGLE1BQUEsQ0FDRSxHQUFJLzRJLE9BQU9rNUksTUFBWCxDQUFtQixDQUNqQnh2RCxTQUFTM3JGLElBQVQsQ0FBZ0IsQ0FBaEIsQ0FDQSxNQUNELENBRUQsMEJBQU0sQ0FBcUIsYUFBckIsQ0FBb0MsMkJBQXBDLENBQWlFMHVGLEtBQWpFLENBQU4sQ0FFRixNQUFBLENBQ0V6c0YsT0FBT3dSLE1BQVAsQ0FBZ0JpN0UsS0FBaEIsQ0FDQS9DLFNBQVMzckYsSUFBVCxDQUFnQixFQUFoQixDQUNBLGFBQWErMkksV0FBTixDQUFrQixDQUN2QnVFLE1BQU9yNUksTUFEZ0IsQ0FBbEIsRUFFSnE1SSxLQUZILENBSUYsT0FBQSxDQUNFOStJLEtBQUtzOEQsS0FBTCxDQUFXeHhDLEdBQVgsQ0FBZXJsQixPQUFPazVJLE1BQXRCLEVBRUF6c0QsTUFBTXZ6QyxRQUFOLENBQWV2NUMsSUFBZixDQUFvQkssTUFBcEIsRUFFQSxnQkFBZ0JwQixNQUFULENBQWdCLFFBQWhCLENBQTBCb0IsTUFBMUIsQ0FBUCxDQUVGLE9BQUEsQ0FDQSxJQUFLLEtBQUwsQ0FDRSxnQkFBZ0JnQixJQUFULEVBQVAsQ0F0Q0osQ0F3Q0QsQ0FDRixDQTNDTSxDQTJDSnM0SSxPQTNDSSxDQTJDSyxJQTNDTCxDQUFQLENBNENELENBN0NELENBRk8sR0FBUCxDQWdERCxDQXBEaUIsQ0FxRGxCdGhHLE9BQVEsZUFBQSxDQUFnQmg0QyxNQUFoQixDQUF3QixDQUM5QixXQUFhLElBQWIsQ0FFQSxxQ0FFQW81SSxZQUFZMzhJLElBQVosQ0FBaUIsaUJBQUEsRUFBb0IsQ0FDbkMsbUJBQW1CekIsSUFBWixDQUFpQixrQkFBQSxDQUFtQnUrSSxTQUFuQixDQUE4QixDQUNwRCxNQUFPLENBQVAsQ0FBVSxDQUNSLE9BQVFBLFVBQVUzNEksSUFBVixDQUFpQjI0SSxVQUFVeDdJLElBQW5DLEVBQ0UsTUFBQSxDQUNFLEdBQUksRUFBRWlDLE9BQU93UixNQUFQLEdBQWtCMmlJLE1BQXBCLENBQUosQ0FBaUMsQ0FDL0JvRixVQUFVeDdJLElBQVYsQ0FBaUIsQ0FBakIsQ0FDQSxNQUNELENBRUQsaUJBQWlCYSxNQUFWLENBQWlCLFFBQWpCLENBQVAsQ0FFRixNQUFBLENBQ0UyNkksVUFBVXg3SSxJQUFWLENBQWlCLENBQWpCLENBQ0EsY0FBY2c3SSxJQUFQLEVBQVAsQ0FFRixNQUFBLENBQ0UvNEksT0FBT3dSLE1BQVAsQ0FBZ0IsSUFBaEIsQ0FDQWpYLEtBQUtzOEQsS0FBTCxDQUFXN2UsTUFBWCxDQUFrQmg0QyxPQUFPazVJLE1BQXpCLEVBRUEvRSxPQUFPajdGLFFBQVAsQ0FBZ0JwM0IsTUFBaEIsQ0FBdUJxeUgsT0FBT2o3RixRQUFQLENBQWdCbDNDLE9BQWhCLENBQXdCaEMsTUFBeEIsQ0FBdkIsQ0FBd0QsQ0FBeEQsRUFFRixNQUFBLENBQ0EsSUFBSyxLQUFMLENBQ0UsaUJBQWlCZ0IsSUFBVixFQUFQLENBckJKLENBdUJELENBQ0YsQ0ExQk0sQ0EwQkp3NEksUUExQkksQ0EwQk0sSUExQk4sQ0FBUCxDQTJCRCxDQTVCRCxDQUZPLEdBQVAsQ0ErQkQsQ0F2RmlCLENBd0ZsQmlKLFVBQVcsa0JBQUEsQ0FBbUI1ckYsS0FBbkIsQ0FBMEIsQ0FDbkMsS0FBSzNkLFFBQUwsQ0FBZ0IyZCxNQUFNNnJGLHlCQUFOLEVBQW1DN3JGLE1BQU02ckYseUJBQU4sR0FBb0MsRUFBdkYsQ0FDQW5vSixLQUFLczhELEtBQUwsQ0FBYUEsS0FBYixDQUNELENBM0ZpQixDQTRGbEI4ckYsU0FBVSxpQkFBQSxDQUFrQjlyRixLQUFsQixDQUF5QixDQUNqQyxLQUFLNHJGLFNBQUwsQ0FBZTVyRixLQUFmLEVBRUEsS0FBSysyQyxPQUFMLENBQWE5OEYsR0FBYixDQUFpQixPQUFqQixDQUEwQitsRCxLQUExQixFQUNELENBaEdpQixDQWlHbEIrckYsU0FBVSxpQkFBQSxFQUFvQixDQUM1QixZQUFZL3JGLEtBQVosQ0FDRCxDQW5HaUIsQ0FBcEIsRUFxR0EsR0FBSXQ4RCxLQUFLczhELEtBQVQsQ0FBZ0IsS0FBSzRyRixTQUFMLENBQWVsb0osS0FBS3M4RCxLQUFwQixFQUNqQixDQXpHQSxDQUxzQixDQUF6QixFQWlIQSxrQkFBQSxDQUNELENBM0hELEVBRkEsQ0ErSEE7RUFFQTs7Ozs7S0FNQSw4QkFFQSxVQUFZLENBQ1YscUJBQUEsRUFBd0IsQ0FDdEIsV0FBYWh6RCxVQUFVMUQsTUFBVixDQUFtQixDQUFuQixFQUF3QjBELFVBQVUsQ0FBVixJQUFpQi9FLFNBQXpDLENBQXFEK0UsVUFBVSxDQUFWLENBQXJELENBQW9FLEVBQWpGLENBRUEydkksZUFBZSxJQUFmLENBQXFCcVAsWUFBckIsRUFFQSxLQUFLdHBELE1BQUwsQ0FBYzkvRixPQUFPNG5CLE1BQVAsQ0FBYyxDQUMxQnloSSxLQUFNLElBRG9CLENBQWQsQ0FFWHZwRCxNQUZXLENBQWQsQ0FHQSxLQUFLeVYsU0FBTCxDQUFpQixDQUFDLEtBQUsxd0UsT0FBTCxDQUFhdzVELElBQWIsQ0FBa0IsSUFBbEIsQ0FBRCxDQUFqQixDQUNELENBQ0Q7Ozs7Ozs7T0FVQTY4QyxZQUFZa08sWUFBWixDQUEwQixDQUFDLENBQ3pCNWlKLElBQUssU0FEb0IsQ0FFekI5QyxNQUFPLGdCQUFBLEVBQW1CLENBQ3hCLFVBQVkwRyxVQUFVMUQsTUFBVixDQUFtQixDQUFuQixFQUF3QjBELFVBQVUsQ0FBVixJQUFpQi9FLFNBQXpDLENBQXFEK0UsVUFBVSxDQUFWLENBQXJELENBQW9FLENBQWhGLENBQ0EsV0FBYUEsVUFBVTFELE1BQVYsQ0FBbUIsQ0FBbkIsRUFBd0IwRCxVQUFVLENBQVYsSUFBaUIvRSxTQUF6QyxDQUFxRCtFLFVBQVUsQ0FBVixDQUFyRCxDQUFvRSxDQUFqRixDQUNBLEtBQUsrekIsTUFBTCxDQUFZc2hILE1BQVosQ0FBbUJ6ekQsTUFBbkIsQ0FBNEJscEQsTUFBUUMsTUFBcEMsQ0FDQSxLQUFLNUUsTUFBTCxDQUFZc2hILE1BQVosQ0FBbUIvN0Ysc0JBQW5CLEdBQ0EsR0FBSSxLQUFLNGxHLFNBQVQsQ0FBb0IsS0FBS0EsU0FBTCxDQUFlemtILE9BQWYsQ0FBdUIvQixLQUF2QixDQUE4QkMsTUFBOUIsRUFDckIsQ0FDRDs7Ozs7O1VBVHdCLENBaUJ2QixDQUNEdjhCLElBQUssU0FESixDQUVEOUMsTUFBTyxnQkFBQSxFQUFtQixDQUN4QixvQkFBc0IsS0FBS3FqRSxTQUEzQixDQUNJd2lGLFlBQWNDLGdCQUFnQkQsV0FEbEMsQ0FFSUUsYUFBZUQsZ0JBQWdCQyxZQUZuQyxDQUdJbHNDLFdBQWEsS0FBS0EsVUFIdEIsQ0FJQSxVQUFZbDJGLE9BQU9raUksWUFBY2hzQyxXQUFXamtHLENBQWhDLEVBQW1DMHVJLE9BQW5DLEVBQVosQ0FDQSxXQUFhM2dJLE9BQU9vaUksYUFBZWxzQyxXQUFXenpGLENBQWpDLEVBQW9DaytILE9BQXBDLEVBQWIsQ0FDQSxLQUFLenlDLFNBQUwsQ0FBZTd5RyxPQUFmLENBQXVCLFNBQVV3a0QsRUFBVixDQUFjLENBQ25DQSxHQUFHcGtCLEtBQUgsQ0FBVUMsTUFBVixFQUNELENBRkQsRUFHRCxDQUNEOzs7OztVQTlCd0IsQ0FxQ3ZCLENBQ0R2OEIsSUFBSyxlQURKLENBRUQ5QyxNQUFPLHNCQUFBLEVBQXlCLENBQzlCLEtBQUtxakUsU0FBTCxDQUFpQixLQUFLMmlGLFlBQUwsRUFBakIsQ0FDQSxLQUFLbnNDLFVBQUwsQ0FBa0IsS0FBS29zQyxhQUFMLEVBQWxCLENBQ0EsR0FBSSxLQUFLN3BELE1BQUwsQ0FBWXVwRCxJQUFoQixDQUFzQjEvSSxPQUFPcU4sZ0JBQVAsQ0FBd0IsUUFBeEIsQ0FBa0MsS0FBSzR5SSxPQUFMLENBQWF2ckQsSUFBYixDQUFrQixJQUFsQixDQUFsQyxFQUN2QixDQUNEOzs7Ozs7VUE1Q3dCLENBb0R2QixDQUNENzNGLElBQUssYUFESixDQUVEOUMsTUFBTyxvQkFBQSxDQUFxQnU5RixJQUFyQixDQUEyQixDQUNoQyxLQUFLc1UsU0FBTCxDQUFlcnZHLElBQWYsQ0FBb0IrNkYsSUFBcEIsRUFDRCxDQUpBLENBcER1QixDQXlEdkIsQ0FDRHo2RixJQUFLLFNBREosQ0FFRDlDLE1BQU8sZ0JBQUEsQ0FBaUJ1OEksUUFBakIsQ0FBMkIsQ0FDaEMsVUFBWSxJQUFaLENBRUFBLFNBQVN1SSxNQUFULENBQWdCLFFBQWhCLEVBRUEsS0FBS2MsU0FBTCxDQUFpQnJKLFNBQVN4MUksR0FBVCxDQUFhLFVBQWIsQ0FBakIsQ0FDQSxLQUFLMHpCLE1BQUwsQ0FBYzhoSCxTQUFTeDFJLEdBQVQsQ0FBYSxRQUFiLENBQWQsQ0FFQSxLQUFLay9JLGFBQUwsQ0FBcUIsVUFBWSxDQUMvQixnQkFBZ0I3SyxHQUFULENBQWEsV0FBYixFQUEwQmgvQyxNQUExQixDQUFpQ3lkLFVBQXhDLENBQ0QsQ0FGRCxDQUlBLEtBQUttc0MsWUFBTCxDQUFvQixVQUFZLENBQzlCLGdCQUFnQmovSSxHQUFULENBQWEsV0FBYixDQUFQLENBQ0QsQ0FGRCxDQUlBdzFJLFNBQVN2bEgsTUFBVCxDQUFnQixDQUNkcXNDLFVBQVcsa0JBQUEsQ0FBbUI4aUYsVUFBbkIsQ0FBK0IsQ0FDeEM3MkQsTUFBTWpzQixTQUFOLENBQWtCOGlGLFVBQWxCLENBQ0QsQ0FIYSxDQUFoQixFQU1BLEtBQUtDLGFBQUwsR0FDRCxDQXpCQSxDQXpEdUIsQ0FBMUIsRUFxRkEsbUJBQUEsQ0FDRCxDQTNHRCxFQUZBLENBK0dBLGFBQWUsc29CQUFmLENBQ0EsV0FBYSxxSkFBYixDQUNBOztLQUlBLDRDQUVBLFNBQVVDLGVBQVYsQ0FBMkI7O09BSXpCLG1DQUFBLEVBQXNDLENBQ3BDaFEsZUFBZSxJQUFmLENBQXFCaVEsMEJBQXJCLEVBRUEsaUNBQWlDLElBQTFCLENBQWdDclEsaUJBQWlCcVEsMEJBQWpCLEVBQTZDcm9KLElBQTdDLENBQWtELElBQWxELENBQXdELENBQzdGRCxLQUFNLDRCQUR1RixDQUU3Rnd6RCxRQUFTLENBQ1ArMEYsY0FBZSxLQURSLENBRm9GLENBSzdGaDJHLFNBQVUsQ0FDUmkyRyxhQUFjLFdBQUEsQ0FBWSxJQUFaLENBRE4sQ0FFUkMsWUFBYSxXQUFBLENBQVksSUFBWixDQUZMLENBR1JDLGFBQWMsV0FBQSxDQUFZLElBQVosQ0FITixDQUlSaGdILE1BQU8sV0FBQSxDQUFZLEdBQVosQ0FKQyxDQUtSaWdILElBQUssV0FBQSxDQUFZLEdBQVosQ0FMRyxDQUxtRixDQVk3RnJ2RyxlQUFnQnN2RyxRQVo2RSxDQWE3Rnh2RyxhQUFjZ0wsTUFiK0UsQ0FjN0ZnTixXQUFZLEtBZGlGLENBZTdGRCxVQUFXLEtBZmtGLENBQXhELENBQWhDLENBQVAsQ0FpQkQsQ0FFRHVuRixTQUFTNFAsMEJBQVQsQ0FBcUNELGVBQXJDLEVBRUEsaUNBQUEsQ0FDRCxDQTdCRCxDQTZCRXAwRixjQTdCRixDQUZBLENBaUNBLGVBQWlCLDZsS0FBakIsQ0FDQSxhQUFlLHFKQUFmLENBQ0E7Ozs7O0tBT0EsK0JBRUEsU0FBVW8wRixlQUFWLENBQTJCOzs7Ozs7Ozs7T0FXekIsc0JBQUEsQ0FBdUI1ckgsTUFBdkIsQ0FBK0IsQ0FDN0IsU0FBQSxDQUVBLFlBQWMvekIsVUFBVTFELE1BQVYsQ0FBbUIsQ0FBbkIsRUFBd0IwRCxVQUFVLENBQVYsSUFBaUIvRSxTQUF6QyxDQUFxRCtFLFVBQVUsQ0FBVixDQUFyRCxDQUFvRSxFQUFsRixDQUVBMnZJLGVBQWUsSUFBZixDQUFxQndRLGFBQXJCLEVBRUEsYUFBZXZxSixPQUFPNG5CLE1BQVAsQ0FBYyxDQUMzQnFrRSxNQUFPLEdBRG9CLENBRTNCdStELElBQUssSUFGc0IsQ0FHM0JDLFNBQVUsS0FIaUIsQ0FJM0JDLFFBQVMsR0FKa0IsQ0FBZCxDQUtadm1ILE9BTFksQ0FBZixDQU1BNnVELE1BQVFpbkQsMEJBQTBCLElBQTFCLENBQWdDTixpQkFBaUI0USxhQUFqQixFQUFnQzVvSixJQUFoQyxDQUFxQyxJQUFyQyxDQUEyQyxDQUNqRkQsS0FBTSxlQUQyRSxDQUVqRnV5QyxTQUFVLENBQ1IwMkcsV0FBWSxXQUFBLENBQVksR0FBWixDQURKLENBRVJDLFVBQVcsV0FBQSxDQUFZLElBQVosQ0FGSCxDQUdSNStELE9BQVEsV0FBQSxDQUFZLEdBQVosQ0FIQSxDQUlSNitELFNBQVUsV0FBQSxDQUFZLElBQVosQ0FKRixDQUtSQyxPQUFRLFdBQUEsQ0FBWSxJQUFaLENBTEEsQ0FNUjcrRCxNQUFPLFdBQUEsQ0FBWXUxQixTQUFTdjFCLEtBQXJCLENBTkMsQ0FPUnUrRCxJQUFLLFdBQUEsQ0FBWWhwQyxTQUFTZ3BDLEdBQXJCLENBUEcsQ0FRUkMsU0FBVSxXQUFBLENBQVlqcEMsU0FBU2lwQyxRQUFyQixDQVJGLENBU1JDLFFBQVMsV0FBQSxDQUFZbHBDLFNBQVNrcEMsT0FBckIsQ0FURCxDQUZ1RSxDQWFqRjF2RyxlQUFnQit2RyxVQWJpRSxDQWNqRmp3RyxhQUFja3dHLFFBZG1FLENBZWpGbDRGLFdBQVksS0FmcUUsQ0FnQmpGRCxVQUFXLEtBaEJzRSxDQUEzQyxDQUFoQyxDQUFSLENBbUJBbWdDLE1BQU1pNEQsbUJBQU4sQ0FBMEI5c0gsTUFBMUIsRUFFQSxZQUFBLENBQ0QsQ0FDRDs7OztPQU9BKzhHLFlBQVlxUCxhQUFaLENBQTJCLENBQUMsQ0FDMUIvakosSUFBSyxxQkFEcUIsQ0FFMUI5QyxNQUFPLDRCQUFBLEVBQStCLENBQ3BDLFdBQWEwRyxVQUFVMUQsTUFBVixDQUFtQixDQUFuQixFQUF3QjBELFVBQVUsQ0FBVixJQUFpQi9FLFNBQXpDLENBQXFEK0UsVUFBVSxDQUFWLENBQXJELENBQW9FLElBQWpGLENBRUEsR0FBSSt6QixTQUFXLElBQWYsQ0FBcUIsQ0FDbkIsS0FBSzhWLFFBQUwsQ0FBYzAyRyxVQUFkLENBQXlCam5KLEtBQXpCLENBQWlDeTZCLE9BQU92RixJQUF4QyxDQUNBLEtBQUtxYixRQUFMLENBQWMyMkcsU0FBZCxDQUF3QmxuSixLQUF4QixDQUFnQ3k2QixPQUFPdEYsR0FBdkMsQ0FDQSxLQUFLb2IsUUFBTCxDQUFjKzNDLE1BQWQsQ0FBcUJ0b0YsS0FBckIsQ0FBNkJ5NkIsT0FBTzZ0RCxNQUFwQyxDQUNELENBQ0YsQ0FWeUIsQ0FBRCxDQUEzQixFQWFBb3VELFNBQVNtUSxhQUFULENBQXdCUixlQUF4QixFQUVBLG9CQUFBLENBQ0QsQ0F0RUQsQ0FzRUVwMEYsY0F0RUYsQ0FGQSxDQTBFQSxlQUFpQixpc0RBQWpCLENBQ0EsYUFBZSxnaEJBQWYsQ0FDQTs7OztLQU1BLG9DQUVBLFNBQVVvMEYsZUFBVixDQUEyQjs7OztPQU16QiwyQkFBQSxFQUE4QixDQUM1QixjQUFnQjMvSSxVQUFVMUQsTUFBVixDQUFtQixDQUFuQixFQUF3QjBELFVBQVUsQ0FBVixJQUFpQi9FLFNBQXpDLENBQXFEK0UsVUFBVSxDQUFWLENBQXJELENBQW9FLFdBQUEsRUFBcEYsQ0FFQTJ2SSxlQUFlLElBQWYsQ0FBcUJtUixrQkFBckIsRUFFQSxpQ0FBaUMsSUFBMUIsQ0FBZ0N2UixpQkFBaUJ1UixrQkFBakIsRUFBcUN2cEosSUFBckMsQ0FBMEMsSUFBMUMsQ0FBZ0QsQ0FDckZELEtBQU0sb0JBRCtFLENBRXJGd3pELFFBQVMsQ0FDUGkyRixlQUFnQixLQURULENBRjRFLENBS3JGbDNHLFNBQVUsQ0FDUjQyRyxTQUFVLFdBQUEsQ0FBWSxJQUFaLENBREYsQ0FFUk8sVUFBVyxXQUFBLENBQVlBLFNBQVosQ0FGSCxDQUwyRSxDQVNyRnB3RyxlQUFnQnF3RyxVQVRxRSxDQVVyRnZ3RyxhQUFjd3dHLFFBVnVFLENBV3JGeDRGLFdBQVksS0FYeUUsQ0FZckZELFVBQVcsS0FaMEUsQ0FBaEQsQ0FBaEMsQ0FBUCxDQWNELENBQ0Q7Ozs7Ozs7Ozs7Ozs7T0FnQkFxb0YsWUFBWWdRLGtCQUFaLENBQWdDLENBQUMsQ0FDL0Ixa0osSUFBSywyQkFEMEIsQ0FFL0I5QyxNQUFPLGtDQUFBLENBQW1DcThGLFNBQW5DLENBQThDLENBQ25ELEtBQUs3cUMsT0FBTCxDQUFhaTJGLGNBQWIsQ0FBOEJwckQsVUFBVWlvRCxPQUFWLENBQWtCLEdBQWxCLENBQTlCLENBQ0EsS0FBS3Q1RixXQUFMLENBQW1CLElBQW5CLENBQ0QsQ0FMOEIsQ0FBRCxDQUFoQyxFQVFBMHJGLFNBQVM4USxrQkFBVCxDQUE2Qm5CLGVBQTdCLEVBRUEseUJBQUEsQ0FDRCxDQXJERCxDQXFERXAwRixjQXJERixDQUZBLENBeURBLGVBQWlCLDZuQkFBakIsQ0FDQSxhQUFlLHFKQUFmLENBQ0E7Ozs7Ozs7O0tBVUEsaUNBRUEsU0FBVW8wRixlQUFWLENBQTJCOzs7O09BTXpCLHdCQUFBLEVBQTJCLENBQ3pCLFNBQUEsQ0FFQSxlQUFpQjMvSSxVQUFVMUQsTUFBVixDQUFtQixDQUFuQixFQUF3QjBELFVBQVUsQ0FBVixJQUFpQi9FLFNBQXpDLENBQXFEK0UsVUFBVSxDQUFWLENBQXJELENBQW9FLEtBQXJGLENBRUEydkksZUFBZSxJQUFmLENBQXFCd1IsZUFBckIsRUFFQXY0RCxNQUFRaW5ELDBCQUEwQixJQUExQixDQUFnQ04saUJBQWlCNFIsZUFBakIsRUFBa0M1cEosSUFBbEMsQ0FBdUMsSUFBdkMsQ0FBNkMsQ0FDbkZELEtBQU0saUJBRDZFLENBRW5GdXlDLFNBQVUsQ0FDUnUzRyxTQUFVLFdBQUEsQ0FBWSxJQUFaLENBREYsQ0FFUkMsU0FBVSxXQUFBLENBQVksSUFBWixDQUZGLENBR1JDLFNBQVUsV0FBQSxDQUFZLEdBQVosQ0FIRixDQUlSQyxTQUFVLFdBQUEsQ0FBWSxHQUFaLENBSkYsQ0FGeUUsQ0FRbkYzd0csZUFBZ0I0d0csVUFSbUUsQ0FTbkY5d0csYUFBYyt3RyxRQVRxRSxDQVVuRi80RixXQUFZLEtBVnVFLENBV25GRCxVQUFXLEtBWHdFLENBQTdDLENBQWhDLENBQVIsQ0FjQW1nQyxNQUFNODRELG9CQUFOLENBQTJCQyxVQUEzQixFQUVBLFlBQUEsQ0FDRCxDQUNEOzs7O09BT0E3USxZQUFZcVEsZUFBWixDQUE2QixDQUFDLENBQzVCL2tKLElBQUssc0JBRHVCLENBRTVCOUMsTUFBTyw2QkFBQSxDQUE4QnNnRCxPQUE5QixDQUF1QyxDQUM1QyxHQUFJQSxPQUFKLENBQWEsQ0FDWCxLQUFLa1IsT0FBTCxDQUFhODJGLFdBQWIsQ0FBMkIsR0FBM0IsQ0FDRCxDQUZELElBRU8sQ0FDTCxZQUFZOTJGLE9BQUwsQ0FBYTgyRixXQUFwQixDQUNELENBRUQsS0FBS3Q5RixXQUFMLENBQW1CLElBQW5CLENBQ0QsQ0FWMkIsQ0FBRCxDQUE3QixFQWFBMHJGLFNBQVNtUixlQUFULENBQTBCeEIsZUFBMUIsRUFFQSxzQkFBQSxDQUNELENBdERELENBc0RFcDBGLGNBdERGLENBRkEsQ0EwREEsZUFBaUIsc25CQUFqQixDQUNBLGFBQWUsNGhCQUFmLENBQ0E7Ozs7Ozs7Ozs7OztLQWNBLHFDQUVBLFNBQVVvMEYsZUFBVixDQUEyQjs7OztPQU16Qiw0QkFBQSxFQUErQixDQUM3QixTQUFBLENBRUEsY0FBZ0IzL0ksVUFBVTFELE1BQVYsQ0FBbUIsQ0FBbkIsRUFBd0IwRCxVQUFVLENBQVYsSUFBaUIvRSxTQUF6QyxDQUFxRCtFLFVBQVUsQ0FBVixDQUFyRCxDQUFvRSxXQUFBLEVBQXBGLENBRUEydkksZUFBZSxJQUFmLENBQXFCa1MsbUJBQXJCLEVBRUFqNUQsTUFBUWluRCwwQkFBMEIsSUFBMUIsQ0FBZ0NOLGlCQUFpQnNTLG1CQUFqQixFQUFzQ3RxSixJQUF0QyxDQUEyQyxJQUEzQyxDQUFpRCxDQUN2RkQsS0FBTSxxQkFEaUYsQ0FFdkZ1eUMsU0FBVSxDQUNSNDJHLFNBQVUsV0FBQSxDQUFZLElBQVosQ0FERixDQUVSTyxVQUFXLFdBQUEsQ0FBWSxXQUFBLEVBQVosQ0FGSCxDQUdSYyxjQUFlLFdBQUEsQ0FBWSxXQUFBLEVBQVosQ0FIUCxDQUlSQyxPQUFRLFdBQUEsQ0FBWSxHQUFaLENBSkEsQ0FGNkUsQ0FRdkZueEcsZUFBZ0JveEcsVUFSdUUsQ0FTdkZ0eEcsYUFBY3V4RyxRQVR5RSxDQVV2RnY1RixXQUFZLEtBVjJFLENBV3ZGRCxVQUFXLEtBWDRFLENBQWpELENBQWhDLENBQVIsQ0FjQW1nQyxNQUFNczVELFlBQU4sQ0FBbUJsQixVQUFVOXhJLENBQTdCLENBQWdDOHhJLFVBQVV0aEksQ0FBMUMsRUFDQTs7Ozs7U0FRQWtwRSxNQUFNdTVELFVBQU4sQ0FBbUJDLFdBQVdDLEtBQTlCLENBQ0EsWUFBQSxDQUNELENBQ0Q7Ozs7T0FPQXZSLFlBQVkrUSxtQkFBWixDQUFpQyxDQUFDLENBQ2hDemxKLElBQUssV0FEMkIsQ0FFaEM5QyxNQUFPLGtCQUFBLEVBQXFCLENBQzFCLHFCQUFxQixLQUFLNm9KLFVBQW5CLENBQVAsQ0FDRCxDQUNEOzs7OztVQUwrQixDQVk5QixDQUNEL2xKLElBQUssY0FESixDQUVEOUMsTUFBTyxxQkFBQSxDQUFzQjRWLENBQXRCLENBQXlCd1EsQ0FBekIsQ0FBNEIsQ0FDakMsS0FBS21xQixRQUFMLENBQWNtM0csU0FBZCxDQUF3QjFuSixLQUF4QixDQUE4QjJULEdBQTlCLENBQWtDaUMsQ0FBbEMsQ0FBcUN3USxDQUFyQyxFQUNBLEtBQUttcUIsUUFBTCxDQUFjaTRHLGFBQWQsQ0FBNEJ4b0osS0FBNUIsQ0FBa0MyVCxHQUFsQyxDQUFzQ2lDLENBQXRDLENBQXlDd1EsQ0FBekMsRUFBNEN1QyxjQUE1QyxDQUEyRCxHQUEzRCxFQUNELENBTEEsQ0FaOEIsQ0FBakMsRUFvQkErdEgsU0FBUzZSLG1CQUFULENBQThCbEMsZUFBOUIsRUFFQSwwQkFBQSxDQUNELENBckVELENBcUVFcDBGLGNBckVGLENBRkEsQ0F3RUE7Ozs7O0tBT0Esa0JBQW9CLENBQUMsZ0JBQUEsQ0FBaUIsQ0FBQyxHQUFELENBQU0sR0FBTixDQUFqQixDQUFELENBQStCLGdCQUFBLENBQWlCLENBQUMsR0FBRCxDQUFNLEdBQU4sQ0FBVyxHQUFYLENBQWpCLENBQS9CLENBQWtFLGdCQUFBLENBQWlCLENBQUMsR0FBRCxDQUFNLEdBQU4sQ0FBVyxHQUFYLENBQWdCLEdBQWhCLENBQWpCLENBQWxFLENBQTBHLGdCQUFBLENBQWlCLENBQUMsR0FBRCxDQUFNLEdBQU4sQ0FBVyxHQUFYLENBQWdCLEdBQWhCLENBQXFCLEdBQXJCLENBQWpCLENBQTFHLENBQXVKLGdCQUFBLENBQWlCLENBQUMsR0FBRCxDQUFNLEdBQU4sQ0FBVyxHQUFYLENBQWdCLEdBQWhCLENBQXFCLEdBQXJCLENBQTBCLEdBQTFCLENBQStCLEdBQS9CLENBQWpCLENBQXZKLENBQThNLGdCQUFBLENBQWlCLENBQUMsR0FBRCxDQUFNLEdBQU4sQ0FBVyxHQUFYLENBQWdCLEdBQWhCLENBQXFCLEdBQXJCLENBQTBCLEdBQTFCLENBQStCLEdBQS9CLENBQW9DLEdBQXBDLENBQXlDLEdBQXpDLENBQThDLElBQTlDLENBQWpCLENBQTlNLENBQXBCLENBQ0E7Ozs7Ozs7Ozs7S0FZQSxlQUFpQixDQUNmKzJGLFdBQVksQ0FERyxDQUVmQyxNQUFPLENBRlEsQ0FHZkMsT0FBUSxDQUhPLENBSWZILE1BQU8sQ0FKUSxDQUtmSSxXQUFZLENBTEcsQ0FNZkMsS0FBTSxDQU5TLENBQWpCLENBU0EsZUFBaUIsdU1BQWpCLENBQ0EsYUFBZSxxSkFBZixDQUNBOztLQUlBLDhCQUVBLFNBQVUvQyxlQUFWLENBQTJCOztPQUl6QixxQkFBQSxFQUF3QixDQUN0QmhRLGVBQWUsSUFBZixDQUFxQmdULFlBQXJCLEVBRUEsaUNBQWlDLElBQTFCLENBQWdDcFQsaUJBQWlCb1QsWUFBakIsRUFBK0JwckosSUFBL0IsQ0FBb0MsSUFBcEMsQ0FBMEMsQ0FDL0VELEtBQU0sY0FEeUUsQ0FFL0V1eUMsU0FBVSxDQUNSNDJHLFNBQVUsV0FBQSxDQUFZLElBQVosQ0FERixDQUVScDBHLFFBQVMsV0FBQSxDQUFZLEdBQVosQ0FGRCxDQUZxRSxDQU0vRXVFLGVBQWdCZ3lHLFVBTitELENBTy9FbHlHLGFBQWNteUcsUUFQaUUsQ0FRL0VuNkYsV0FBWSxLQVJtRSxDQVMvRUQsVUFBVyxLQVRvRSxDQUExQyxDQUFoQyxDQUFQLENBV0QsQ0FFRHVuRixTQUFTMlMsWUFBVCxDQUF1QmhELGVBQXZCLEVBRUEsbUJBQUEsQ0FDRCxDQXZCRCxDQXVCRXAwRixjQXZCRixDQUZBLENBMkJBLGVBQWlCLHM1QkFBakIsQ0FDQSxhQUFlLHdmQUFmLENBQ0E7O0tBSUEseUNBRUEsU0FBVW8wRixlQUFWLENBQTJCOzs7OztPQU96QixnQ0FBQSxFQUFtQyxDQUNqQyxTQUFBLENBRUEsaUJBQW1CMy9JLFVBQVUxRCxNQUFWLENBQW1CLENBQW5CLEVBQXdCMEQsVUFBVSxDQUFWLElBQWlCL0UsU0FBekMsQ0FBcUQrRSxVQUFVLENBQVYsQ0FBckQsQ0FBb0UsSUFBdkYsQ0FDQSxXQUFhQSxVQUFVMUQsTUFBVixDQUFtQixDQUFuQixDQUF1QjBELFVBQVUsQ0FBVixDQUF2QixDQUFzQy9FLFNBQW5ELENBRUEwMEksZUFBZSxJQUFmLENBQXFCbVQsdUJBQXJCLEVBRUFsNkQsTUFBUWluRCwwQkFBMEIsSUFBMUIsQ0FBZ0NOLGlCQUFpQnVULHVCQUFqQixFQUEwQ3ZySixJQUExQyxDQUErQyxJQUEvQyxDQUFxRCxDQUMzRkQsS0FBTSx5QkFEcUYsQ0FFM0Z1eUMsU0FBVSxDQUNSNjJHLE9BQVEsV0FBQSxDQUFZcG1ILFlBQVosQ0FEQSxDQUVSaW1ILFdBQVksV0FBQSxDQUFZLEdBQVosQ0FGSixDQUdSQyxVQUFXLFdBQUEsQ0FBWSxJQUFaLENBSEgsQ0FGaUYsQ0FPM0Y1dkcsZUFBZ0JteUcsVUFQMkUsQ0FRM0ZyeUcsYUFBY3N5RyxRQVI2RSxDQVMzRnQ2RixXQUFZLEtBVCtFLENBVTNGRCxVQUFXLEtBVmdGLENBVzNGN04sYUFBYyxJQVg2RSxDQVkzRjJQLFNBQVUsSUFaaUYsQ0FBckQsQ0FBaEMsQ0FBUixDQWVBcStCLE1BQU1pNEQsbUJBQU4sQ0FBMEI5c0gsTUFBMUIsRUFFQSxZQUFBLENBQ0QsQ0FDRDs7OztPQU9BKzhHLFlBQVlnUyx1QkFBWixDQUFxQyxDQUFDLENBQ3BDMW1KLElBQUsscUJBRCtCLENBRXBDOUMsTUFBTyw0QkFBQSxFQUErQixDQUNwQyxXQUFhMEcsVUFBVTFELE1BQVYsQ0FBbUIsQ0FBbkIsRUFBd0IwRCxVQUFVLENBQVYsSUFBaUIvRSxTQUF6QyxDQUFxRCtFLFVBQVUsQ0FBVixDQUFyRCxDQUFvRSxJQUFqRixDQUVBLEdBQUkrekIsU0FBVyxJQUFmLENBQXFCLENBQ25CLEtBQUs4VixRQUFMLENBQWMwMkcsVUFBZCxDQUF5QmpuSixLQUF6QixDQUFpQ3k2QixPQUFPdkYsSUFBeEMsQ0FDQSxLQUFLcWIsUUFBTCxDQUFjMjJHLFNBQWQsQ0FBd0JsbkosS0FBeEIsQ0FBZ0N5NkIsT0FBT3RGLEdBQXZDLENBRUEsR0FBSXNGLG1DQUFKLENBQXlDLENBQ3ZDLEtBQUsrMkIsT0FBTCxDQUFhbTRGLGtCQUFiLENBQWtDLEdBQWxDLENBQ0QsQ0FGRCxJQUVPLENBQ0wsWUFBWW40RixPQUFMLENBQWFtNEYsa0JBQXBCLENBQ0QsQ0FDRixDQUNGLENBZm1DLENBQUQsQ0FBckMsRUFrQkFqVCxTQUFTOFMsdUJBQVQsQ0FBa0NuRCxlQUFsQyxFQUVBLDhCQUFBLENBQ0QsQ0E5REQsQ0E4REVwMEYsY0E5REYsQ0FGQSxDQWtFQSxlQUFpQixxeEJBQWpCLENBQ0EsYUFBZSw2UUFBZixDQUNBOztLQUlBLG1DQUVBLFNBQVVvMEYsZUFBVixDQUEyQjs7Ozs7Ozs7T0FVekIsMEJBQUEsRUFBNkIsQ0FDM0IsU0FBQSxDQUVBLFlBQWMzL0ksVUFBVTFELE1BQVYsQ0FBbUIsQ0FBbkIsRUFBd0IwRCxVQUFVLENBQVYsSUFBaUIvRSxTQUF6QyxDQUFxRCtFLFVBQVUsQ0FBVixDQUFyRCxDQUFvRSxFQUFsRixDQUVBMnZJLGVBQWUsSUFBZixDQUFxQnVULGlCQUFyQixFQUVBLGFBQWV0dEosT0FBTzRuQixNQUFQLENBQWMsQ0FDM0IybEksUUFBUyxLQURrQixDQUUzQmhnSSxNQUFPLElBRm9CLENBRzNCbUosTUFBTyxHQUhvQixDQUkzQnk3QyxVQUFXLEdBSmdCLENBQWQsQ0FLWmh1QyxPQUxZLENBQWYsQ0FNQTZ1RCxNQUFRaW5ELDBCQUEwQixJQUExQixDQUFnQ04saUJBQWlCMlQsaUJBQWpCLEVBQW9DM3JKLElBQXBDLENBQXlDLElBQXpDLENBQStDLENBQ3JGRCxLQUFNLG1CQUQrRSxDQUVyRnV5QyxTQUFVLENBQ1I0MkcsU0FBVSxXQUFBLENBQVksSUFBWixDQURGLENBRVJ0OUgsTUFBTyxXQUFBLENBQVlpMEYsU0FBU2owRixLQUFyQixDQUZDLENBR1JtSixNQUFPLFdBQUEsQ0FBWThxRixTQUFTOXFGLEtBQXJCLENBSEMsQ0FJUnk3QyxVQUFXLFdBQUEsQ0FBWXF2QyxTQUFTcnZDLFNBQXJCLENBSkgsQ0FLUnE3RSxhQUFjLFdBQUEsQ0FBWSxXQUFBLENBQVksR0FBWixDQUFpQixHQUFqQixDQUFzQixHQUF0QixDQUEyQixHQUEzQixDQUFaLENBTE4sQ0FGMkUsQ0FTckZ4eUcsZUFBZ0J5eUcsVUFUcUUsQ0FVckYzeUcsYUFBYzR5RyxRQVZ1RSxDQVdyRjU2RixXQUFZLEtBWHlFLENBWXJGRCxVQUFXLEtBWjBFLENBQS9DLENBQWhDLENBQVIsQ0FlQW1nQyxNQUFNMjZELGlCQUFOLENBQXdCbnNDLFNBQVMrckMsT0FBakMsRUFFQSxZQUFBLENBQ0QsQ0FDRDs7OztPQU9BclMsWUFBWW9TLGlCQUFaLENBQStCLENBQUMsQ0FDOUI5bUosSUFBSyxtQkFEeUIsQ0FFOUI5QyxNQUFPLDBCQUFBLENBQTJCc2dELE9BQTNCLENBQW9DLENBQ3pDLEdBQUlBLE9BQUosQ0FBYSxDQUNYLEtBQUtrUixPQUFMLENBQWEwNEYsT0FBYixDQUF1QixHQUF2QixDQUNELENBRkQsSUFFTyxDQUNMLFlBQVkxNEYsT0FBTCxDQUFhMDRGLE9BQXBCLENBQ0QsQ0FFRCxLQUFLbC9GLFdBQUwsQ0FBbUIsSUFBbkIsQ0FDRCxDQVY2QixDQUFELENBQS9CLEVBYUEwckYsU0FBU2tULGlCQUFULENBQTRCdkQsZUFBNUIsRUFFQSx3QkFBQSxDQUNELENBakVELENBaUVFcDBGLGNBakVGLENBRkEsQ0FxRUEsZUFBaUIseWdHQUFqQixDQUNBLGFBQWUscUpBQWYsQ0FDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7S0FzQkEsOEJBRUEsU0FBVW8wRixlQUFWLENBQTJCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O09BcUJ6QixxQkFBQSxFQUF3QixDQUN0QixTQUFBLENBRUEsWUFBYzMvSSxVQUFVMUQsTUFBVixDQUFtQixDQUFuQixFQUF3QjBELFVBQVUsQ0FBVixJQUFpQi9FLFNBQXpDLENBQXFEK0UsVUFBVSxDQUFWLENBQXJELENBQW9FLEVBQWxGLENBRUEydkksZUFBZSxJQUFmLENBQXFCOFQsWUFBckIsRUFFQSxhQUFlN3RKLE9BQU80bkIsTUFBUCxDQUFjLENBQzNCbWtJLFdBQVksSUFEZSxDQUUzQitCLE1BQU8sSUFGb0IsQ0FHM0JDLFVBQVcsSUFIZ0IsQ0FJM0IvOUMsS0FBTSxLQUpxQixDQUszQmcrQyxVQUFXLEtBTGdCLENBTTNCQyxNQUFPLEtBTm9CLENBTzNCQyxTQUFVLEtBUGlCLENBUTNCQyxNQUFPLEtBUm9CLENBUzNCQyxlQUFnQixHQVRXLENBVTNCQyxrQkFBbUIsSUFWUSxDQVczQkMsY0FBZSxHQVhZLENBWTNCQyxtQkFBb0IsR0FaTyxDQWEzQkMsZUFBZ0IsR0FiVyxDQWMzQkMsZUFBZ0IsR0FkVyxDQWUzQkMsaUJBQWtCLEdBZlMsQ0FBZCxDQWdCWnZxSCxPQWhCWSxDQUFmLENBaUJBNnVELE1BQVFpbkQsMEJBQTBCLElBQTFCLENBQWdDTixpQkFBaUJrVSxZQUFqQixFQUErQmxzSixJQUEvQixDQUFvQyxJQUFwQyxDQUEwQyxDQUNoRkQsS0FBTSxjQUQwRSxDQUVoRnV5QyxTQUFVLENBQ1I0MkcsU0FBVSxXQUFBLENBQVksSUFBWixDQURGLENBRVJqekQsS0FBTSxXQUFBLENBQVksR0FBWixDQUZFLENBR1J3MkQsZUFBZ0IsV0FBQSxDQUFZNXNDLFNBQVM0c0MsY0FBckIsQ0FIUixDQUlSQyxrQkFBbUIsV0FBQSxDQUFZN3NDLFNBQVM2c0MsaUJBQXJCLENBSlgsQ0FLUkMsY0FBZSxXQUFBLENBQVk5c0MsU0FBUzhzQyxhQUFyQixDQUxQLENBTVJLLGNBQWUsV0FBQSxDQUFZLEdBQVosQ0FOUCxDQU9SQyxVQUFXLFdBQUEsQ0FBWSxXQUFBLEVBQVosQ0FQSCxDQVFSQyxjQUFlLFdBQUEsQ0FBWSxHQUFaLENBUlAsQ0FTUk4sbUJBQW9CLFdBQUEsQ0FBWS9zQyxTQUFTK3NDLGtCQUFyQixDQVRaLENBVVJDLGVBQWdCLFdBQUEsQ0FBWWh0QyxTQUFTZ3RDLGNBQXJCLENBVlIsQ0FXUkMsZUFBZ0IsV0FBQSxDQUFZanRDLFNBQVNpdEMsY0FBckIsQ0FYUixDQVlSQyxpQkFBa0IsV0FBQSxDQUFZbHRDLFNBQVNrdEMsZ0JBQXJCLENBWlYsQ0FGc0UsQ0FnQmhGMXpHLGVBQWdCOHpHLFVBaEJnRSxDQWlCaEZoMEcsYUFBY2kwRyxRQWpCa0UsQ0FrQmhGajhGLFdBQVksS0FsQm9FLENBbUJoRkQsVUFBVyxLQW5CcUUsQ0FBMUMsQ0FBaEMsQ0FBUixDQXNCQW1nQyxNQUFNODRELG9CQUFOLENBQTJCdHFDLFNBQVN1cUMsVUFBcEMsRUFFQS80RCxNQUFNZzhELGVBQU4sQ0FBc0J4dEMsU0FBU3NzQyxLQUEvQixFQUVBOTZELE1BQU1pOEQsbUJBQU4sQ0FBMEJ6dEMsU0FBU3VzQyxTQUFuQyxFQUVBLzZELE1BQU1rOEQsY0FBTixDQUFxQjF0QyxTQUFTeFIsSUFBOUIsRUFFQWhkLE1BQU1tOEQsbUJBQU4sQ0FBMEIzdEMsU0FBU3dzQyxTQUFuQyxFQUVBaDdELE1BQU1vOEQsZUFBTixDQUFzQjV0QyxTQUFTeXNDLEtBQS9CLEVBRUFqN0QsTUFBTXE4RCxrQkFBTixDQUF5Qjd0QyxTQUFTMHNDLFFBQWxDLEVBRUFsN0QsTUFBTXM4RCxlQUFOLENBQXNCOXRDLFNBQVMyc0MsS0FBL0IsRUFFQSxZQUFBLENBQ0QsQ0FDRDs7OztPQU9BalQsWUFBWTJTLFlBQVosQ0FBMEIsQ0FBQyxDQUN6QnJuSixJQUFLLHNCQURvQixDQUV6QjlDLE1BQU8sNkJBQUEsQ0FBOEJzZ0QsT0FBOUIsQ0FBdUMsQ0FDNUMsR0FBSUEsT0FBSixDQUFhLENBQ1gsS0FBS2tSLE9BQUwsQ0FBYTgyRixXQUFiLENBQTJCLEdBQTNCLENBQ0QsQ0FGRCxJQUVPLENBQ0wsWUFBWTkyRixPQUFMLENBQWE4MkYsV0FBcEIsQ0FDRCxDQUVELEtBQUt0OUYsV0FBTCxDQUFtQixJQUFuQixDQUNELENBQ0Q7Ozs7VUFYd0IsQ0FpQnZCLENBQ0Rsb0QsSUFBSyxpQkFESixDQUVEOUMsTUFBTyx3QkFBQSxDQUF5QnNnRCxPQUF6QixDQUFrQyxDQUN2QyxHQUFJQSxPQUFKLENBQWEsQ0FDWCxLQUFLa1IsT0FBTCxDQUFhcTZGLEtBQWIsQ0FBcUIsR0FBckIsQ0FDRCxDQUZELElBRU8sQ0FDTCxZQUFZcjZGLE9BQUwsQ0FBYXE2RixLQUFwQixDQUNELENBRUQsS0FBSzdnRyxXQUFMLENBQW1CLElBQW5CLENBQ0QsQ0FDRDs7OztVQTVCd0IsQ0FrQ3ZCLENBQ0Rsb0QsSUFBSyxxQkFESixDQUVEOUMsTUFBTyw0QkFBQSxDQUE2QnNnRCxPQUE3QixDQUFzQyxDQUMzQyxHQUFJQSxPQUFKLENBQWEsQ0FDWCxLQUFLa1IsT0FBTCxDQUFhczZGLFNBQWIsQ0FBeUIsR0FBekIsQ0FDRCxDQUZELElBRU8sQ0FDTCxZQUFZdDZGLE9BQUwsQ0FBYXM2RixTQUFwQixDQUNELENBRUQsS0FBSzlnRyxXQUFMLENBQW1CLElBQW5CLENBQ0QsQ0FDRDs7OztVQTdDd0IsQ0FtRHZCLENBQ0Rsb0QsSUFBSyxnQkFESixDQUVEOUMsTUFBTyx1QkFBQSxDQUF3QnNnRCxPQUF4QixDQUFpQyxDQUN0QyxHQUFJQSxPQUFKLENBQWEsQ0FDWCxLQUFLa1IsT0FBTCxDQUFhdTZGLElBQWIsQ0FBb0IsR0FBcEIsQ0FDRCxDQUZELElBRU8sQ0FDTCxZQUFZdjZGLE9BQUwsQ0FBYXU2RixJQUFwQixDQUNELENBRUQsS0FBSy9nRyxXQUFMLENBQW1CLElBQW5CLENBQ0QsQ0FDRDs7OztVQTlEd0IsQ0FvRXZCLENBQ0Rsb0QsSUFBSyxxQkFESixDQUVEOUMsTUFBTyw0QkFBQSxDQUE2QnNnRCxPQUE3QixDQUFzQyxDQUMzQyxHQUFJQSxPQUFKLENBQWEsQ0FDWCxLQUFLa1IsT0FBTCxDQUFhdzZGLFNBQWIsQ0FBeUIsR0FBekIsQ0FDRCxDQUZELElBRU8sQ0FDTCxZQUFZeDZGLE9BQUwsQ0FBYXc2RixTQUFwQixDQUNELENBRUQsS0FBS2hoRyxXQUFMLENBQW1CLElBQW5CLENBQ0QsQ0FDRDs7OztVQS9Fd0IsQ0FxRnZCLENBQ0Rsb0QsSUFBSyxpQkFESixDQUVEOUMsTUFBTyx3QkFBQSxDQUF5QnNnRCxPQUF6QixDQUFrQyxDQUN2QyxHQUFJQSxPQUFKLENBQWEsQ0FDWCxLQUFLa1IsT0FBTCxDQUFheTZGLEtBQWIsQ0FBcUIsR0FBckIsQ0FDRCxDQUZELElBRU8sQ0FDTCxZQUFZejZGLE9BQUwsQ0FBYXk2RixLQUFwQixDQUNELENBRUQsS0FBS2poRyxXQUFMLENBQW1CLElBQW5CLENBQ0QsQ0FDRDs7OztVQWhHd0IsQ0FzR3ZCLENBQ0Rsb0QsSUFBSyxvQkFESixDQUVEOUMsTUFBTywyQkFBQSxDQUE0QnNnRCxPQUE1QixDQUFxQyxDQUMxQyxHQUFJQSxPQUFKLENBQWEsQ0FDWCxLQUFLa1IsT0FBTCxDQUFhMDZGLFFBQWIsQ0FBd0IsR0FBeEIsQ0FDRCxDQUZELElBRU8sQ0FDTCxZQUFZMTZGLE9BQUwsQ0FBYTA2RixRQUFwQixDQUNELENBRUQsS0FBS2xoRyxXQUFMLENBQW1CLElBQW5CLENBQ0QsQ0FDRDs7Ozs7O1VBakh3QixDQXlIdkIsQ0FDRGxvRCxJQUFLLGlCQURKLENBRUQ5QyxNQUFPLHdCQUFBLENBQXlCc2dELE9BQXpCLENBQWtDLENBQ3ZDLEdBQUlBLE9BQUosQ0FBYSxDQUNYLEtBQUtrUixPQUFMLENBQWEyNkYsS0FBYixDQUFxQixHQUFyQixDQUNELENBRkQsSUFFTyxDQUNMLFlBQVkzNkYsT0FBTCxDQUFhMjZGLEtBQXBCLENBQ0QsQ0FFRCxLQUFLbmhHLFdBQUwsQ0FBbUIsSUFBbkIsQ0FDRCxDQVZBLENBekh1QixDQUExQixFQXNJQTByRixTQUFTeVQsWUFBVCxDQUF1QjlELGVBQXZCLEVBRUEsbUJBQUEsQ0FDRCxDQXJPRCxDQXFPRXAwRixjQXJPRixDQUZBLENBeU9BLGVBQWlCLG02REFBakIsQ0FDQSxhQUFlLHFKQUFmLENBQ0E7Ozs7O0tBT0EsZ0NBRUEsU0FBVW8wRixlQUFWLENBQTJCOztPQUl6Qix1QkFBQSxFQUEwQixDQUN4QmhRLGVBQWUsSUFBZixDQUFxQitWLGNBQXJCLEVBRUEsaUNBQWlDLElBQTFCLENBQWdDblcsaUJBQWlCbVcsY0FBakIsRUFBaUNudUosSUFBakMsQ0FBc0MsSUFBdEMsQ0FBNEMsQ0FDakZELEtBQU0sZ0JBRDJFLENBRWpGdXlDLFNBQVUsQ0FDUjQyRyxTQUFVLFdBQUEsQ0FBWSxJQUFaLENBREYsQ0FFUmtGLFNBQVUsV0FBQSxDQUFZLElBQVosQ0FGRixDQUdSclUsT0FBUSxXQUFBLENBQVksQ0FBWixDQUhBLENBSVIzeEMsT0FBUSxXQUFBLENBQVksR0FBWixDQUpBLENBS1J4OEUsTUFBTyxXQUFBLENBQVksSUFBWixDQUxDLENBTVJ5aUksS0FBTSxXQUFBLENBQVksSUFBWixDQU5FLENBT1JDLE1BQU8sV0FBQSxDQUFZLElBQVosQ0FQQyxDQVFSQyxNQUFPLFdBQUEsQ0FBWSxJQUFaLENBUkMsQ0FTUkMsWUFBYSxXQUFBLENBQVksR0FBWixDQVRMLENBVVJDLFlBQWEsV0FBQSxDQUFZLEdBQVosQ0FWTCxDQVdSQyxLQUFNLFdBQUEsQ0FBWSxJQUFaLENBWEUsQ0FGdUUsQ0FlakZyMUcsZUFBZ0JzMUcsVUFmaUUsQ0FnQmpGeDFHLGFBQWN5MUcsUUFoQm1FLENBaUJqRno5RixXQUFZLEtBakJxRSxDQWtCakZELFVBQVcsS0FsQnNFLENBQTVDLENBQWhDLENBQVAsQ0FvQkQsQ0FFRHVuRixTQUFTMFYsY0FBVCxDQUF5Qi9GLGVBQXpCLEVBRUEscUJBQUEsQ0FDRCxDQWhDRCxDQWdDRXAwRixjQWhDRixDQUZBLENBb0NBLGdCQUFrQix5dENBQWxCLENBQ0EsY0FBZ0IscUpBQWhCLENBQ0E7Ozs7Ozs7Ozs7Ozs7O0tBZ0JBLGlDQUVBLFNBQVVvMEYsZUFBVixDQUEyQjs7Ozs7Ozs7O09BV3pCLHdCQUFBLEVBQTJCLENBQ3pCLFlBQWMzL0ksVUFBVTFELE1BQVYsQ0FBbUIsQ0FBbkIsRUFBd0IwRCxVQUFVLENBQVYsSUFBaUIvRSxTQUF6QyxDQUFxRCtFLFVBQVUsQ0FBVixDQUFyRCxDQUFvRSxFQUFsRixDQUVBMnZJLGVBQWUsSUFBZixDQUFxQnlXLGVBQXJCLEVBRUEsYUFBZXh3SixPQUFPNG5CLE1BQVAsQ0FBYyxDQUMzQjZvSSxTQUFVLEdBRGlCLENBRTNCaDRFLFFBQVMsSUFGa0IsQ0FHM0IxK0IsTUFBTyxJQUhvQixDQUkzQmtoRSxPQUFRLEdBSm1CLENBSzNCeTFDLFNBQVUsR0FMaUIsQ0FBZCxDQU1adnNILE9BTlksQ0FBZixDQU9BLGlDQUFpQyxJQUExQixDQUFnQ3cxRyxpQkFBaUI2VyxlQUFqQixFQUFrQzd1SixJQUFsQyxDQUF1QyxJQUF2QyxDQUE2QyxDQUNsRkQsS0FBTSxpQkFENEUsQ0FFbEZ3ekQsUUFBUyxDQUNQeTdGLGtCQUFtQixNQURaLENBRVBDLGdCQUFpQixJQUZWLENBRnlFLENBTWxGMzhHLFNBQVUsQ0FDUjQyRyxTQUFVLFdBQUEsQ0FBWSxJQUFaLENBREYsQ0FFUmdHLGNBQWUsV0FBQSxDQUFZLElBQVosQ0FGUCxDQUdSSixTQUFVLFdBQUEsQ0FBWWp2QyxTQUFTaXZDLFFBQXJCLENBSEYsQ0FJUjEyRyxNQUFPLFdBQUEsQ0FBWXluRSxTQUFTem5FLEtBQXJCLENBSkMsQ0FLUjArQixRQUFTLFdBQUEsQ0FBWStvQyxTQUFTL29DLE9BQXJCLENBTEQsQ0FNUndpQyxPQUFRLFdBQUEsQ0FBWXVHLFNBQVN2RyxNQUFyQixDQU5BLENBT1J5MUMsU0FBVSxXQUFBLENBQVlsdkMsU0FBU2t2QyxRQUFyQixDQVBGLENBTndFLENBZWxGMTFHLGVBQWdCODFHLFdBZmtFLENBZ0JsRmgyRyxhQUFjaTJHLFNBaEJvRSxDQWlCbEZqK0YsV0FBWSxLQWpCc0UsQ0FrQmxGRCxVQUFXLEtBbEJ1RSxDQUE3QyxDQUFoQyxDQUFQLENBb0JELENBRUR1bkYsU0FBU29XLGVBQVQsQ0FBMEJ6RyxlQUExQixFQUVBLHNCQUFBLENBQ0QsQ0FoREQsQ0FnREVwMEYsY0FoREYsQ0FGQSxDQW9EQSxnQkFBa0IsNG5CQUFsQixDQUNBLGNBQWdCLHFKQUFoQixDQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7S0FvQkEsb0NBRUEsU0FBVW8wRixlQUFWLENBQTJCOzs7OztPQU96QiwyQkFBQSxFQUE4QixDQUM1QixTQUFBLENBRUEsZ0JBQWtCMy9JLFVBQVUxRCxNQUFWLENBQW1CLENBQW5CLEVBQXdCMEQsVUFBVSxDQUFWLElBQWlCL0UsU0FBekMsQ0FBcUQrRSxVQUFVLENBQVYsQ0FBckQsQ0FBb0UsS0FBdEYsQ0FDQSxtQkFBcUJBLFVBQVUxRCxNQUFWLENBQW1CLENBQW5CLEVBQXdCMEQsVUFBVSxDQUFWLElBQWlCL0UsU0FBekMsQ0FBcUQrRSxVQUFVLENBQVYsQ0FBckQsQ0FBb0UsSUFBekYsQ0FFQTJ2SSxlQUFlLElBQWYsQ0FBcUJpWCxrQkFBckIsRUFFQSxrQkFBb0JDLGlCQUFtQixJQUF2QyxDQUNBaitELE1BQVFpbkQsMEJBQTBCLElBQTFCLENBQWdDTixpQkFBaUJxWCxrQkFBakIsRUFBcUNydkosSUFBckMsQ0FBMEMsSUFBMUMsQ0FBZ0QsQ0FDdEZELEtBQU0sb0JBRGdGLENBRXRGdXlDLFNBQVUsQ0FDUjQyRyxTQUFVLFdBQUEsQ0FBWSxJQUFaLENBREYsQ0FFUnFHLFlBQWEsV0FBQSxDQUFZLEdBQVosQ0FGTCxDQUdSM21JLE1BQU8sV0FBQSxDQUFZNG1JLGNBQWdCRixjQUFoQixDQUFpQyxXQUFBLEVBQTdDLENBSEMsQ0FGNEUsQ0FPdEZqMkcsZUFBZ0JvMkcsV0FQc0UsQ0FRdEZ0MkcsYUFBY3UyRyxTQVJ3RSxDQUFoRCxDQUFoQyxDQUFSLENBV0FyK0QsTUFBTXMrRCxxQkFBTixDQUE0QkMsV0FBNUIsRUFFQXYrRCxNQUFNdytELHdCQUFOLENBQStCTCxhQUEvQixFQUVBLFlBQUEsQ0FDRCxDQUNEOzs7O09BT0FqVyxZQUFZOFYsa0JBQVosQ0FBZ0MsQ0FBQyxDQUMvQnhxSixJQUFLLHVCQUQwQixDQUUvQjlDLE1BQU8sOEJBQUEsQ0FBK0JzZ0QsT0FBL0IsQ0FBd0MsQ0FDN0MsR0FBSUEsT0FBSixDQUFhLENBQ1gsS0FBS2tSLE9BQUwsQ0FBYXU4RixLQUFiLENBQXFCLEdBQXJCLENBQ0QsQ0FGRCxJQUVPLENBQ0wsWUFBWXY4RixPQUFMLENBQWF1OEYsS0FBcEIsQ0FDRCxDQUVELEtBQUsvaUcsV0FBTCxDQUFtQixJQUFuQixDQUNELENBQ0Q7Ozs7VUFYOEIsQ0FpQjdCLENBQ0Rsb0QsSUFBSywwQkFESixDQUVEOUMsTUFBTyxpQ0FBQSxDQUFrQ3NnRCxPQUFsQyxDQUEyQyxDQUNoRCxHQUFJQSxPQUFKLENBQWEsQ0FDWCxLQUFLa1IsT0FBTCxDQUFhdzhGLEtBQWIsQ0FBcUIsR0FBckIsQ0FDRCxDQUZELElBRU8sQ0FDTCxZQUFZeDhGLE9BQUwsQ0FBYXc4RixLQUFwQixDQUNELENBRUQsS0FBS2hqRyxXQUFMLENBQW1CLElBQW5CLENBQ0QsQ0FWQSxDQWpCNkIsQ0FBaEMsRUE4QkEwckYsU0FBUzRXLGtCQUFULENBQTZCakgsZUFBN0IsRUFFQSx5QkFBQSxDQUNELENBekVELENBeUVFcDBGLGNBekVGLENBRkEsQ0E2RUEsZ0JBQWtCLCt5Q0FBbEIsQ0FDQSxjQUFnQixpY0FBaEIsQ0FDQTs7S0FJQSxzQ0FFQSxTQUFVbzBGLGVBQVYsQ0FBMkI7Ozs7Ozs7Ozs7T0FZekIsNkJBQUEsRUFBZ0MsQ0FDOUIsU0FBQSxDQUVBLFlBQWMzL0ksVUFBVTFELE1BQVYsQ0FBbUIsQ0FBbkIsRUFBd0IwRCxVQUFVLENBQVYsSUFBaUIvRSxTQUF6QyxDQUFxRCtFLFVBQVUsQ0FBVixDQUFyRCxDQUFvRSxFQUFsRixDQUVBMnZJLGVBQWUsSUFBZixDQUFxQjRYLG9CQUFyQixFQUVBLGFBQWUzeEosT0FBTzRuQixNQUFQLENBQWMsQ0FDM0JncUksYUFBYyxHQURhLENBRTNCQyxhQUFjLEdBRmEsQ0FHM0JDLGlCQUFrQixRQUhTLENBSTNCQyxnQkFBaUIsUUFKVSxDQUszQkMsY0FBZSxLQUxZLENBTTNCQyxLQUFNLElBTnFCLENBQWQsQ0FPWjl0SCxPQVBZLENBQWYsQ0FRQTZ1RCxNQUFRaW5ELDBCQUEwQixJQUExQixDQUFnQ04saUJBQWlCZ1ksb0JBQWpCLEVBQXVDaHdKLElBQXZDLENBQTRDLElBQTVDLENBQWtELENBQ3hGRCxLQUFNLHNCQURrRixDQUV4RnV5QyxTQUFVLENBQ1JpK0csTUFBTyxXQUFBLENBQVksR0FBWixDQURDLENBRVJsbUUsT0FBUSxXQUFBLENBQVksR0FBWixDQUZBLENBR1I2K0QsU0FBVSxXQUFBLENBQVksSUFBWixDQUhGLENBSVJzSCxNQUFPLFdBQUEsQ0FBWSxJQUFaLENBSkMsQ0FLUkMsT0FBUSxXQUFBLENBQVksSUFBWixDQUxBLENBTVJDLFNBQVUsV0FBQSxDQUFZLElBQVosQ0FORixDQU9SVCxhQUFjLFdBQUEsQ0FBWXB3QyxTQUFTb3dDLFlBQXJCLENBUE4sQ0FRUkMsYUFBYyxXQUFBLENBQVlyd0MsU0FBU3F3QyxZQUFyQixDQVJOLENBU1JDLGlCQUFrQixXQUFBLENBQVksU0FBQSxDQUFVdHdDLFNBQVNzd0MsZ0JBQW5CLENBQVosQ0FUVixDQVVSQyxnQkFBaUIsV0FBQSxDQUFZLFNBQUEsQ0FBVXZ3QyxTQUFTdXdDLGVBQW5CLENBQVosQ0FWVCxDQUY4RSxDQWN4Ri8yRyxlQUFnQnMzRyxXQWR3RSxDQWV4RngzRyxhQUFjeTNHLFNBZjBFLENBZ0J4RnovRixXQUFZLEtBaEI0RSxDQWlCeEZELFVBQVcsS0FqQjZFLENBQWxELENBQWhDLENBQVIsQ0FvQkFtZ0MsTUFBTXcvRCx1QkFBTixDQUE4Qmh4QyxTQUFTd3dDLGFBQXZDLEVBRUFoL0QsTUFBTXkvRCxjQUFOLENBQXFCanhDLFNBQVN5d0MsSUFBOUIsRUFFQSxZQUFBLENBQ0QsQ0FDRDs7OztPQU9BL1csWUFBWXlXLG9CQUFaLENBQWtDLENBQUMsQ0FDakNuckosSUFBSyx5QkFENEIsQ0FFakM5QyxNQUFPLGdDQUFBLENBQWlDc2dELE9BQWpDLENBQTBDLENBQy9DLEdBQUlBLE9BQUosQ0FBYSxDQUNYLEtBQUtrUixPQUFMLENBQWF3OUYsY0FBYixDQUE4QixHQUE5QixDQUNELENBRkQsSUFFTyxDQUNMLFlBQVl4OUYsT0FBTCxDQUFhdzlGLGNBQXBCLENBQ0QsQ0FFRCxLQUFLaGtHLFdBQUwsQ0FBbUIsSUFBbkIsQ0FDRCxDQUNEOzs7O1VBWGdDLENBaUIvQixDQUNEbG9ELElBQUssZ0JBREosQ0FFRDlDLE1BQU8sdUJBQUEsQ0FBd0JzZ0QsT0FBeEIsQ0FBaUMsQ0FDdEMsR0FBSUEsT0FBSixDQUFhLENBQ1gsS0FBS2tSLE9BQUwsQ0FBYXk5RixLQUFiLENBQXFCLEdBQXJCLENBQ0QsQ0FGRCxJQUVPLENBQ0wsWUFBWXo5RixPQUFMLENBQWF5OUYsS0FBcEIsQ0FDRCxDQUVELEtBQUtqa0csV0FBTCxDQUFtQixJQUFuQixDQUNELENBQ0Q7Ozs7VUE1QmdDLENBa0MvQixDQUNEbG9ELElBQUssbUJBREosQ0FFRDlDLE1BQU8sMEJBQUEsRUFBNkIsQ0FDbEMsWUFBYzBHLFVBQVUxRCxNQUFWLENBQW1CLENBQW5CLEVBQXdCMEQsVUFBVSxDQUFWLElBQWlCL0UsU0FBekMsQ0FBcUQrRSxVQUFVLENBQVYsQ0FBckQsQ0FBb0UsSUFBbEYsQ0FFQSxHQUFJbTZCLFVBQVksSUFBaEIsQ0FBc0IsQ0FDcEIsS0FBSzJ3QixPQUFMLENBQWEwOUYsV0FBYixDQUEyQixHQUEzQixDQUNELENBRkQsSUFFTyxDQUNMLFlBQVkxOUYsT0FBTCxDQUFhMDlGLFdBQXBCLENBQ0QsQ0FFRCxLQUFLMytHLFFBQUwsQ0FBY28rRyxRQUFkLENBQXVCM3VKLEtBQXZCLENBQStCNmdDLE9BQS9CLENBQ0EsS0FBS21xQixXQUFMLENBQW1CLElBQW5CLENBQ0QsQ0FiQSxDQWxDK0IsQ0FBbEMsRUFrREEwckYsU0FBU3VYLG9CQUFULENBQStCNUgsZUFBL0IsRUFFQSwyQkFBQSxDQUNELENBakhELENBaUhFcDBGLGNBakhGLENBRkEsQ0FxSEEsZ0JBQWtCLG1vQkFBbEIsQ0FDQSxjQUFnQiw0WkFBaEIsQ0FDQTs7S0FJQSxzQ0FFQSxTQUFVbzBGLGVBQVYsQ0FBMkI7Ozs7T0FNekIsNkJBQUEsRUFBZ0MsQ0FDOUIsU0FBQSxDQUVBLGNBQWdCMy9JLFVBQVUxRCxNQUFWLENBQW1CLENBQW5CLEVBQXdCMEQsVUFBVSxDQUFWLElBQWlCL0UsU0FBekMsQ0FBcUQrRSxVQUFVLENBQVYsQ0FBckQsQ0FBb0UsV0FBQSxFQUFwRixDQUVBMnZJLGVBQWUsSUFBZixDQUFxQjhZLG9CQUFyQixFQUVBNy9ELE1BQVFpbkQsMEJBQTBCLElBQTFCLENBQWdDTixpQkFBaUJrWixvQkFBakIsRUFBdUNseEosSUFBdkMsQ0FBNEMsSUFBNUMsQ0FBa0QsQ0FDeEZELEtBQU0sc0JBRGtGLENBRXhGdXlDLFNBQVUsQ0FDUmsrRyxNQUFPLFdBQUEsQ0FBWSxJQUFaLENBREMsQ0FFUi9HLFVBQVcsV0FBQSxDQUFZLFdBQUEsRUFBWixDQUZILENBRjhFLENBTXhGcHdHLGVBQWdCODNHLFdBTndFLENBT3hGaDRHLGFBQWNpNEcsU0FQMEUsQ0FReEZqZ0csV0FBWSxLQVI0RSxDQVN4RkQsVUFBVyxLQVQ2RSxDQUFsRCxDQUFoQyxDQUFSLENBWUFtZ0MsTUFBTXM1RCxZQUFOLENBQW1CbEIsVUFBVTl4SSxDQUE3QixDQUFnQzh4SSxVQUFVdGhJLENBQTFDLEVBRUEsWUFBQSxDQUNELENBQ0Q7Ozs7O09BUUFveEgsWUFBWTJYLG9CQUFaLENBQWtDLENBQUMsQ0FDakNyc0osSUFBSyxjQUQ0QixDQUVqQzlDLE1BQU8scUJBQUEsQ0FBc0I0VixDQUF0QixDQUF5QndRLENBQXpCLENBQTRCLENBQ2pDLEtBQUttcUIsUUFBTCxDQUFjbTNHLFNBQWQsQ0FBd0IxbkosS0FBeEIsQ0FBOEIyVCxHQUE5QixDQUFrQ2lDLENBQWxDLENBQXFDd1EsQ0FBckMsRUFDRCxDQUpnQyxDQUFELENBQWxDLEVBT0Fzd0gsU0FBU3lZLG9CQUFULENBQStCOUksZUFBL0IsRUFFQSwyQkFBQSxDQUNELENBL0NELENBK0NFcDBGLGNBL0NGLENBRkEsQ0FtREEsZ0JBQWtCLHVlQUFsQixDQUNBLGNBQWdCLHFKQUFoQixDQUNBOzs7OztLQU9BLG9DQUVBLFNBQVVvMEYsZUFBVixDQUEyQjs7T0FJekIsMkJBQUEsRUFBOEIsQ0FDNUJoUSxlQUFlLElBQWYsQ0FBcUJpWixrQkFBckIsRUFFQSxpQ0FBaUMsSUFBMUIsQ0FBZ0NyWixpQkFBaUJxWixrQkFBakIsRUFBcUNyeEosSUFBckMsQ0FBMEMsSUFBMUMsQ0FBZ0QsQ0FDckZELEtBQU0sb0JBRCtFLENBRXJGdXlDLFNBQVUsQ0FDUjQyRyxTQUFVLFdBQUEsQ0FBWSxJQUFaLENBREYsQ0FFUm9JLFlBQWEsV0FBQSxDQUFZLEdBQVosQ0FGTCxDQUdSMTFDLFdBQVksV0FBQSxDQUFZLFdBQUEsQ0FBWSxHQUFaLENBQWlCLEdBQWpCLENBQVosQ0FISixDQUlSM3ZGLEdBQUksV0FBQSxDQUFZLEdBQVosQ0FKSSxDQUtSRCxHQUFJLFdBQUEsQ0FBWSxHQUFaLENBTEksQ0FGMkUsQ0FTckZxdEIsZUFBZ0JrNEcsV0FUcUUsQ0FVckZwNEcsYUFBY3E0RyxTQVZ1RSxDQVdyRnJnRyxXQUFZLEtBWHlFLENBWXJGRCxVQUFXLEtBWjBFLENBQWhELENBQWhDLENBQVAsQ0FjRCxDQUNEOzs7O09BT0Fxb0YsWUFBWThYLGtCQUFaLENBQWdDLENBQUMsQ0FDL0J4c0osSUFBSyxlQUQwQjs7Ozs7U0FTL0I5QyxNQUFPLHNCQUFBLENBQXVCby9CLEtBQXZCLENBQThCQyxNQUE5QixDQUFzQyxDQUMzQyxLQUFLa1IsUUFBTCxDQUFjc3BFLFVBQWQsQ0FBeUI3NUcsS0FBekIsQ0FBK0IyVCxHQUEvQixDQUFtQ3lyQixLQUFuQyxDQUEwQ0MsTUFBMUMsRUFDQSxLQUFLa3dILFdBQUwsQ0FBbUIsS0FBS0EsV0FBeEIsQ0FDRCxDQVo4QixDQUFELENBYTdCLENBQ0R6c0osSUFBSyxhQURKLENBRURpRSxJQUFLLFlBQUEsRUFBZSxDQUNsQixZQUFZd3BDLFFBQUwsQ0FBY2cvRyxXQUFkLENBQTBCdnZKLEtBQWpDLENBQ0QsQ0FDRDs7OztVQU1BMlQsSUFBSyxZQUFBLENBQWFpQyxDQUFiLENBQWdCLENBQ25CLGFBQWUsS0FBSzI2QixRQUFwQixDQUNBLGVBQWlCQSxTQUFTc3BFLFVBQVQsQ0FBb0I3NUcsS0FBckMsQ0FDQXV3QyxTQUFTZy9HLFdBQVQsQ0FBcUJ2dkosS0FBckIsQ0FBNkI0VixDQUE3QixDQUNBMjZCLFNBQVNybUIsRUFBVCxDQUFZbHFCLEtBQVosQ0FBb0I0VixFQUFJaWtHLFdBQVdqa0csQ0FBbkMsQ0FDQTI2QixTQUFTdG1CLEVBQVQsQ0FBWWpxQixLQUFaLENBQW9CNFYsRUFBSWlrRyxXQUFXenpGLENBQW5DLENBQ0QsQ0FqQkEsQ0FiNkIsQ0FBaEMsRUFpQ0Fzd0gsU0FBUzRZLGtCQUFULENBQTZCakosZUFBN0IsRUFFQSx5QkFBQSxDQUNELENBakVELENBaUVFcDBGLGNBakVGLENBRkEsQ0FxRUEsZ0JBQWtCLDQ4T0FBbEIsQ0FDQSxjQUFnQixxSkFBaEIsQ0FDQTs7Ozs7S0FPQSx3Q0FFQSxTQUFVbzBGLGVBQVYsQ0FBMkI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09Bc0J6QiwrQkFBQSxFQUFrQyxDQUNoQyxTQUFBLENBRUEsV0FBYTMvSSxVQUFVMUQsTUFBVixDQUFtQixDQUFuQixFQUF3QjBELFVBQVUsQ0FBVixJQUFpQi9FLFNBQXpDLENBQXFEK0UsVUFBVSxDQUFWLENBQXJELENBQW9FLElBQWpGLENBQ0EsWUFBY0EsVUFBVTFELE1BQVYsQ0FBbUIsQ0FBbkIsRUFBd0IwRCxVQUFVLENBQVYsSUFBaUIvRSxTQUF6QyxDQUFxRCtFLFVBQVUsQ0FBVixDQUFyRCxDQUFvRSxFQUFsRixDQUVBMnZJLGVBQWUsSUFBZixDQUFxQnFaLHNCQUFyQixFQUVBLGFBQWVwekosT0FBTzRuQixNQUFQLENBQWMsQ0FDM0J3akksVUFBVyxJQURnQixDQUUzQmlJLE1BQU8sQ0FGb0IsQ0FHM0JDLFFBQVMsQ0FIa0IsQ0FJM0JDLFVBQVcsS0FKZ0IsQ0FLM0JDLFVBQVcsS0FMZ0IsQ0FNM0J0RixTQUFVLEtBTmlCLENBTzNCdUYsU0FBVSxLQVBpQixDQVEzQkMsWUFBYSxJQVJjLENBUzNCNUYsTUFBTyxJQVRvQixDQVUzQnBELFFBQVMsR0FWa0IsQ0FXM0JpSixtQkFBb0IsR0FYTyxDQVkzQkMsY0FBZSxHQVpZLENBYTNCcmhGLEtBQU0sR0FicUIsQ0FjM0JzaEYsT0FBUSxHQWRtQixDQWUzQkMsZUFBZ0IsTUFmVyxDQUFkLENBZ0JaM3ZILE9BaEJZLENBQWYsQ0FpQkE2dUQsTUFBUWluRCwwQkFBMEIsSUFBMUIsQ0FBZ0NOLGlCQUFpQnlaLHNCQUFqQixFQUF5Q3p4SixJQUF6QyxDQUE4QyxJQUE5QyxDQUFvRCxDQUMxRkQsS0FBTSx3QkFEb0YsQ0FFMUZ3ekQsUUFBUyxDQUNQNitGLFVBQVd2eUMsU0FBUzZ4QyxLQUFULENBQWVyTCxPQUFmLENBQXVCLENBQXZCLENBREosQ0FFUGdNLFlBQWF4eUMsU0FBUzZ4QyxLQUFULENBQWVyTCxPQUFmLENBQXVCLENBQXZCLENBRk4sQ0FHUGlNLFlBQWF6eUMsU0FBUzh4QyxPQUFULENBQWlCdEwsT0FBakIsQ0FBeUIsQ0FBekIsQ0FITixDQUlQa00sY0FBZTF5QyxTQUFTOHhDLE9BQVQsQ0FBaUJ0TCxPQUFqQixDQUF5QixDQUF6QixDQUpSLENBRmlGLENBUTFGL3pHLFNBQVUsQ0FDUjQyRyxTQUFVLFdBQUEsQ0FBWSxJQUFaLENBREYsQ0FFUkMsT0FBUSxXQUFBLENBQVksSUFBWixDQUZBLENBR1JNLFVBQVcsV0FBQSxDQUFZLFdBQUEsRUFBWixDQUhILENBSVJjLGNBQWUsV0FBQSxDQUFZLFdBQUEsRUFBWixDQUpQLENBS1J2QixXQUFZLFdBQUEsQ0FBWSxHQUFaLENBTEosQ0FNUkMsVUFBVyxXQUFBLENBQVksSUFBWixDQU5ILENBT1JyK0QsWUFBYSxXQUFBLENBQVksSUFBWixDQVBMLENBUVI0bkUsVUFBVyxXQUFBLENBQVksR0FBWixDQVJILENBU1J6SixRQUFTLFdBQUEsQ0FBWWxwQyxTQUFTa3BDLE9BQXJCLENBVEQsQ0FVUmlKLG1CQUFvQixXQUFBLENBQVlueUMsU0FBU215QyxrQkFBckIsQ0FWWixDQVdSQyxjQUFlLFdBQUEsQ0FBWXB5QyxTQUFTb3lDLGFBQXJCLENBWFAsQ0FZUnJoRixLQUFNLFdBQUEsQ0FBWWl2QyxTQUFTanZDLElBQXJCLENBWkUsQ0FhUnNoRixPQUFRLFdBQUEsQ0FBWXJ5QyxTQUFTcXlDLE1BQXJCLENBYkEsQ0FjUkMsZUFBZ0IsV0FBQSxDQUFZdHlDLFNBQVNzeUMsY0FBckIsQ0FkUixDQWVSTSxZQUFhLFdBQUEsQ0FBWSxXQUFBLENBQVksR0FBWixDQUFpQixHQUFqQixDQUFaLENBZkwsQ0FnQlJDLFdBQVksV0FBQSxDQUFZLEdBQVosQ0FoQkosQ0FSZ0YsQ0EwQjFGcjVHLGVBQWdCczVHLFdBMUIwRSxDQTJCMUZ4NUcsYUFBY3k1RyxTQTNCNEUsQ0E0QjFGemhHLFdBQVksS0E1QjhFLENBNkIxRkQsVUFBVyxLQTdCK0UsQ0FBcEQsQ0FBaEMsQ0FBUixDQWdDQW1nQyxNQUFNd2hFLG1CQUFOLENBQTBCaHpDLFNBQVMreEMsU0FBbkMsRUFFQXZnRSxNQUFNeWhFLDRCQUFOLENBQW1DanpDLFNBQVNneUMsU0FBNUMsRUFFQXhnRSxNQUFNcThELGtCQUFOLENBQXlCN3RDLFNBQVMwc0MsUUFBbEMsRUFFQWw3RCxNQUFNMGhFLGtCQUFOLENBQXlCbHpDLFNBQVNpeUMsUUFBbEMsRUFFQXpnRSxNQUFNMmhFLHFCQUFOLENBQTRCbnpDLFNBQVNreUMsV0FBckMsRUFFQTFnRSxNQUFNZzhELGVBQU4sQ0FBc0J4dEMsU0FBU3NzQyxLQUEvQixFQUVBLEdBQUl0c0MsU0FBUzRwQyxTQUFULEdBQXVCLElBQTNCLENBQWlDLENBQy9CcDRELE1BQU1zNUQsWUFBTixDQUFtQjlxQyxTQUFTNHBDLFNBQVQsQ0FBbUI5eEksQ0FBdEMsQ0FBeUNrb0csU0FBUzRwQyxTQUFULENBQW1CdGhJLENBQTVELEVBQ0QsQ0FFRGtwRSxNQUFNaTRELG1CQUFOLENBQTBCOXNILE1BQTFCLEVBRUEsWUFBQSxDQUNELENBQ0Q7Ozs7T0FPQSs4RyxZQUFZa1ksc0JBQVosQ0FBb0MsQ0FBQyxDQUNuQzVzSixJQUFLLHFCQUQ4QixDQUVuQzlDLE1BQU8sNEJBQUEsQ0FBNkJzZ0QsT0FBN0IsQ0FBc0MsQ0FDM0MsR0FBSUEsT0FBSixDQUFhLENBQ1gsS0FBS2tSLE9BQUwsQ0FBYTAvRixVQUFiLENBQTBCLEdBQTFCLENBQ0QsQ0FGRCxJQUVPLENBQ0wsWUFBWTEvRixPQUFMLENBQWEwL0YsVUFBcEIsQ0FDRCxDQUVELEtBQUtsbUcsV0FBTCxDQUFtQixJQUFuQixDQUNELENBQ0Q7Ozs7VUFYa0MsQ0FpQmpDLENBQ0Rsb0QsSUFBSyw4QkFESixDQUVEOUMsTUFBTyxxQ0FBQSxDQUFzQ3NnRCxPQUF0QyxDQUErQyxDQUNwRCxHQUFJQSxPQUFKLENBQWEsQ0FDWCxLQUFLa1IsT0FBTCxDQUFhMi9GLFVBQWIsQ0FBMEIsR0FBMUIsQ0FDRCxDQUZELElBRU8sQ0FDTCxZQUFZMy9GLE9BQUwsQ0FBYTIvRixVQUFwQixDQUNELENBRUQsS0FBS25tRyxXQUFMLENBQW1CLElBQW5CLENBQ0QsQ0FDRDs7OztVQTVCa0MsQ0FrQ2pDLENBQ0Rsb0QsSUFBSyxvQkFESixDQUVEOUMsTUFBTywyQkFBQSxDQUE0QnNnRCxPQUE1QixDQUFxQyxDQUMxQyxHQUFJQSxPQUFKLENBQWEsQ0FDWCxLQUFLa1IsT0FBTCxDQUFhMDZGLFFBQWIsQ0FBd0IsR0FBeEIsQ0FDRCxDQUZELElBRU8sQ0FDTCxZQUFZMTZGLE9BQUwsQ0FBYTA2RixRQUFwQixDQUNELENBRUQsS0FBS2xoRyxXQUFMLENBQW1CLElBQW5CLENBQ0QsQ0FDRDs7OztVQTdDa0MsQ0FtRGpDLENBQ0Rsb0QsSUFBSyxvQkFESixDQUVEOUMsTUFBTywyQkFBQSxDQUE0QnNnRCxPQUE1QixDQUFxQyxDQUMxQyxHQUFJQSxPQUFKLENBQWEsQ0FDWCxLQUFLa1IsT0FBTCxDQUFhNC9GLFFBQWIsQ0FBd0IsR0FBeEIsQ0FDRCxDQUZELElBRU8sQ0FDTCxZQUFZNS9GLE9BQUwsQ0FBYTQvRixRQUFwQixDQUNELENBRUQsS0FBS3BtRyxXQUFMLENBQW1CLElBQW5CLENBQ0QsQ0FDRDs7OztVQTlEa0MsQ0FvRWpDLENBQ0Rsb0QsSUFBSyx1QkFESixDQUVEOUMsTUFBTyw4QkFBQSxDQUErQnNnRCxPQUEvQixDQUF3QyxDQUM3QyxHQUFJQSxPQUFKLENBQWEsQ0FDWCxLQUFLa1IsT0FBTCxDQUFhNi9GLFlBQWIsQ0FBNEIsR0FBNUIsQ0FDRCxDQUZELElBRU8sQ0FDTCxZQUFZNy9GLE9BQUwsQ0FBYTYvRixZQUFwQixDQUNELENBRUQsS0FBS3JtRyxXQUFMLENBQW1CLElBQW5CLENBQ0QsQ0FDRDs7OztVQS9Fa0MsQ0FxRmpDLENBQ0Rsb0QsSUFBSyxpQkFESixDQUVEOUMsTUFBTyx3QkFBQSxDQUF5QnNnRCxPQUF6QixDQUFrQyxDQUN2QyxHQUFJQSxPQUFKLENBQWEsQ0FDWCxLQUFLa1IsT0FBTCxDQUFhcTZGLEtBQWIsQ0FBcUIsR0FBckIsQ0FDRCxDQUZELElBRU8sQ0FDTCxZQUFZcjZGLE9BQUwsQ0FBYXE2RixLQUFwQixDQUNELENBRUQsS0FBSzdnRyxXQUFMLENBQW1CLElBQW5CLENBQ0QsQ0FDRDs7Ozs7VUFoR2tDLENBdUdqQyxDQUNEbG9ELElBQUssY0FESixDQUVEOUMsTUFBTyxxQkFBQSxDQUFzQjRWLENBQXRCLENBQXlCd1EsQ0FBekIsQ0FBNEIsQ0FDakMsS0FBS21xQixRQUFMLENBQWNtM0csU0FBZCxDQUF3QjFuSixLQUF4QixDQUE4QjJULEdBQTlCLENBQWtDaUMsQ0FBbEMsQ0FBcUN3USxDQUFyQyxFQUNBLEtBQUttcUIsUUFBTCxDQUFjaTRHLGFBQWQsQ0FBNEJ4b0osS0FBNUIsQ0FBa0MyVCxHQUFsQyxDQUFzQ2lDLENBQXRDLENBQXlDd1EsQ0FBekMsRUFBNEN1QyxjQUE1QyxDQUEyRCxHQUEzRCxFQUNELENBQ0Q7Ozs7VUE3R2tDLENBbUhqQyxDQUNEN2xCLElBQUsscUJBREosQ0FFRDlDLE1BQU8sNEJBQUEsQ0FBNkJ5NkIsTUFBN0IsQ0FBcUMsQ0FDMUMsR0FBSUEsU0FBVyxJQUFmLENBQXFCLENBQ25CLEtBQUs4VixRQUFMLENBQWMwMkcsVUFBZCxDQUF5QmpuSixLQUF6QixDQUFpQ3k2QixPQUFPdkYsSUFBeEMsQ0FDQSxLQUFLcWIsUUFBTCxDQUFjMjJHLFNBQWQsQ0FBd0JsbkosS0FBeEIsQ0FBZ0N5NkIsT0FBT3RGLEdBQXZDLENBQ0EsS0FBS29iLFFBQUwsQ0FBY3M0QyxXQUFkLENBQTBCN29GLEtBQTFCLENBQWtDeTZCLE9BQU93dUQsY0FBUCxFQUFsQyxDQUEyRDtFQUM1RCxDQUNGLENBUkEsQ0FuSGlDLENBQXBDLEVBOEhBeXRELFNBQVNnWixzQkFBVCxDQUFpQ3JKLGVBQWpDLEVBRUEsNkJBQUEsQ0FDRCxDQTNPRCxDQTJPRXAwRixjQTNPRixDQUZBLENBK09BLGdCQUFrQiwyL0JBQWxCLENBQ0EsY0FBZ0IsNlNBQWhCLENBQ0E7Ozs7O0tBT0EsbUNBRUEsU0FBVW8wRixlQUFWLENBQTJCOzs7Ozs7T0FRekIsMEJBQUEsRUFBNkIsQ0FDM0IsWUFBYzMvSSxVQUFVMUQsTUFBVixDQUFtQixDQUFuQixFQUF3QjBELFVBQVUsQ0FBVixJQUFpQi9FLFNBQXpDLENBQXFEK0UsVUFBVSxDQUFWLENBQXJELENBQW9FLEVBQWxGLENBRUEydkksZUFBZSxJQUFmLENBQXFCaWIsaUJBQXJCLEVBRUEsYUFBZWgxSixPQUFPNG5CLE1BQVAsQ0FBYyxDQUMzQnF0SSxVQUFXLEdBRGdCLENBRTNCQyxTQUFVLEdBRmlCLENBRzNCQyxVQUFXLElBSGdCLENBQWQsQ0FJWmh4SCxPQUpZLENBQWYsQ0FLQSxpQ0FBaUMsSUFBMUIsQ0FBZ0N3MUcsaUJBQWlCcWIsaUJBQWpCLEVBQW9DcnpKLElBQXBDLENBQXlDLElBQXpDLENBQStDLENBQ3BGRCxLQUFNLG1CQUQ4RSxDQUVwRnV5QyxTQUFVLENBQ1I0MkcsU0FBVSxXQUFBLENBQVksSUFBWixDQURGLENBRVJqOEgsT0FBUSxXQUFBLENBQVksV0FBQSxDQUFZLEdBQVosQ0FBaUIsR0FBakIsQ0FBWixDQUZBLENBR1JvOUQsT0FBUSxXQUFBLENBQVksR0FBWixDQUhBLENBSVJvcEUsZUFBZ0IsV0FBQSxDQUFZLEdBQVosQ0FKUixDQUtSOXVILEtBQU0sV0FBQSxDQUFZLEdBQVosQ0FMRSxDQU1SN0csT0FBUSxXQUFBLENBQVksQ0FBQytoRixTQUFTMHpDLFFBQXRCLENBTkEsQ0FPUkQsVUFBVyxXQUFBLENBQVl6ekMsU0FBU3l6QyxTQUFyQixDQVBILENBUVJDLFNBQVUsV0FBQSxDQUFZMXpDLFNBQVMwekMsUUFBckIsQ0FSRixDQVNSQyxVQUFXLFdBQUEsQ0FBWTN6QyxTQUFTMnpDLFNBQXJCLENBVEgsQ0FGMEUsQ0FhcEZuNkcsZUFBZ0JxNkcsV0Fib0UsQ0FjcEZ2NkcsYUFBY3c2RyxTQWRzRSxDQWVwRnhpRyxXQUFZLEtBZndFLENBZ0JwRkQsVUFBVyxLQWhCeUUsQ0FBL0MsQ0FBaEMsQ0FBUCxDQWtCRCxDQUVEdW5GLFNBQVM0YSxpQkFBVCxDQUE0QmpMLGVBQTVCLEVBRUEsd0JBQUEsQ0FDRCxDQXpDRCxDQXlDRXAwRixjQXpDRixDQUZBLENBNkNBLGdCQUFrQiwwckRBQWxCLENBQ0EsY0FBZ0IsMFRBQWhCLENBQ0E7Ozs7S0FNQSxtQ0FFQSxTQUFVbzBGLGVBQVYsQ0FBMkI7Ozs7T0FNekIsMEJBQUEsRUFBNkIsQ0FDM0IsY0FBZ0IzL0ksVUFBVTFELE1BQVYsQ0FBbUIsQ0FBbkIsRUFBd0IwRCxVQUFVLENBQVYsSUFBaUIvRSxTQUF6QyxDQUFxRCtFLFVBQVUsQ0FBVixDQUFyRCxDQUFvRSxXQUFBLEVBQXBGLENBRUEydkksZUFBZSxJQUFmLENBQXFCd2IsaUJBQXJCLEVBRUEsaUNBQWlDLElBQTFCLENBQWdDNWIsaUJBQWlCNGIsaUJBQWpCLEVBQW9DNXpKLElBQXBDLENBQXlDLElBQXpDLENBQStDLENBQ3BGRCxLQUFNLG1CQUQ4RSxDQUVwRnV5QyxTQUFVLENBQ1I0MkcsU0FBVSxXQUFBLENBQVksSUFBWixDQURGLENBRVIySyxTQUFVLFdBQUEsQ0FBWSxJQUFaLENBRkYsQ0FHUnBLLFVBQVcsV0FBQSxDQUFZQSxTQUFaLENBSEgsQ0FGMEUsQ0FPcEZwd0csZUFBZ0J5NkcsV0FQb0UsQ0FRcEYzNkcsYUFBYzQ2RyxTQVJzRSxDQVNwRjVpRyxXQUFZLEtBVHdFLENBVXBGRCxVQUFXLEtBVnlFLENBQS9DLENBQWhDLENBQVAsQ0FZRCxDQUVEdW5GLFNBQVNtYixpQkFBVCxDQUE0QnhMLGVBQTVCLEVBRUEsd0JBQUEsQ0FDRCxDQTVCRCxDQTRCRXAwRixjQTVCRixDQUZBLENBZ0NBLGdCQUFrQiw2K01BQWxCLENBQ0EsY0FBZ0IsMHVCQUFoQixDQUNBOzs7O0tBTUEscUNBRUEsU0FBVW8wRixlQUFWLENBQTJCOzs7O09BTXpCLDRCQUFBLEVBQStCLENBQzdCLGNBQWdCMy9JLFVBQVUxRCxNQUFWLENBQW1CLENBQW5CLEVBQXdCMEQsVUFBVSxDQUFWLElBQWlCL0UsU0FBekMsQ0FBcUQrRSxVQUFVLENBQVYsQ0FBckQsQ0FBb0UsV0FBQSxFQUFwRixDQUVBMnZJLGVBQWUsSUFBZixDQUFxQjRiLG1CQUFyQixFQUVBLGlDQUFpQyxJQUExQixDQUFnQ2hjLGlCQUFpQmdjLG1CQUFqQixFQUFzQ2gwSixJQUF0QyxDQUEyQyxJQUEzQyxDQUFpRCxDQUN0RkQsS0FBTSxxQkFEZ0YsQ0FFdEZ3ekQsUUFBUztFQUVQMGdHLHFCQUFzQixHQUZmLENBR1BDLHVCQUF3QixLQUhqQjtFQUtQQyxxQkFBc0IsTUFMZixDQU1QQyxtQkFBb0IsNEJBTmIsQ0FPUEMsb0JBQXFCLGFBUGQsQ0FRUEMsZUFBZ0Isa0JBUlQsQ0FTUEMsc0JBQXVCLGtCQVRoQixDQUY2RSxDQWF0RmppSCxTQUFVLENBQ1I0MkcsU0FBVSxXQUFBLENBQVksSUFBWixDQURGLENBRVJzTCxNQUFPLFdBQUEsQ0FBWSxJQUFaLENBRkMsQ0FHUkMsUUFBUyxXQUFBLENBQVksSUFBWixDQUhELENBSVJoTCxVQUFXLFdBQUEsQ0FBWUEsU0FBWixDQUpILENBYjRFLENBbUJ0RnB3RyxlQUFnQnE3RyxXQW5Cc0UsQ0FvQnRGdjdHLGFBQWN3N0csU0FwQndFLENBcUJ0RnhqRyxXQUFZLEtBckIwRSxDQXNCdEZELFVBQVcsS0F0QjJFLENBQWpELENBQWhDLENBQVAsQ0F3QkQsQ0FDRDs7Ozs7Ozs7O09BWUFxb0YsWUFBWXlhLG1CQUFaLENBQWlDLENBQUMsQ0FDaENudkosSUFBSywwQkFEMkIsQ0FFaEM5QyxNQUFPLGlDQUFBLENBQWtDb21HLEtBQWxDLENBQXlDLENBQzlDLEtBQUs1MEMsT0FBTCxDQUFhMGdHLG9CQUFiLENBQW9DOXJELE1BQU1rK0MsT0FBTixDQUFjLEdBQWQsQ0FBcEMsQ0FDQSxLQUFLOXlGLE9BQUwsQ0FBYTJnRyxzQkFBYixDQUFzQy9yRCxNQUFNaytDLE9BQU4sQ0FBYyxHQUFkLENBQXRDLENBQ0EsS0FBS3Q1RixXQUFMLENBQW1CLElBQW5CLENBQ0QsQ0FOK0IsQ0FBRCxDQUFqQyxFQVNBMHJGLFNBQVN1YixtQkFBVCxDQUE4QjVMLGVBQTlCLEVBRUEsMEJBQUEsQ0FDRCxDQTVERCxDQTRERXAwRixjQTVERixDQUZBLENBZ0VBLGdCQUFrQixtb0NBQWxCLENBQ0EsY0FBZ0IscUpBQWhCLENBQ0E7Ozs7Ozs7S0FTQSxxQ0FFQSxTQUFVbzBGLGVBQVYsQ0FBMkI7O09BSXpCLDRCQUFBLEVBQStCLENBQzdCaFEsZUFBZSxJQUFmLENBQXFCd2MsbUJBQXJCLEVBRUEsaUNBQWlDLElBQTFCLENBQWdDNWMsaUJBQWlCNGMsbUJBQWpCLEVBQXNDNTBKLElBQXRDLENBQTJDLElBQTNDLENBQWlELENBQ3RGRCxLQUFNLHFCQURnRixDQUV0RnV5QyxTQUFVLENBQ1I0MkcsU0FBVSxXQUFBLENBQVksSUFBWixDQURGLENBRVIyTCxhQUFjLFdBQUEsQ0FBWSxJQUFaLENBRk4sQ0FHUkMsaUJBQWtCLFdBQUEsQ0FBWSxHQUFaLENBSFYsQ0FJUkMsYUFBYyxXQUFBLENBQVksSUFBWixDQUpOLENBS1JDLFdBQVksV0FBQSxDQUFZLEdBQVosQ0FMSixDQUY0RSxDQVN0RjM3RyxlQUFnQjQ3RyxXQVRzRSxDQVV0Rjk3RyxhQUFjKzdHLFNBVndFLENBV3RGL2pHLFdBQVksS0FYMEUsQ0FZdEZELFVBQVcsS0FaMkUsQ0FBakQsQ0FBaEMsQ0FBUCxDQWNELENBRUR1bkYsU0FBU21jLG1CQUFULENBQThCeE0sZUFBOUIsRUFFQSwwQkFBQSxDQUNELENBMUJELENBMEJFcDBGLGNBMUJGLENBRkEsQ0E4QkE7Ozs7Ozs7Ozs7OztLQWdCQSxzQkFFQSxVQUFZOzs7Ozs7O09BU1YsYUFBQSxFQUFnQixDQUNkLFNBQVd2ckQsVUFBVTFELE1BQVYsQ0FBbUIsQ0FBbkIsRUFBd0IwRCxVQUFVLENBQVYsSUFBaUIvRSxTQUF6QyxDQUFxRCtFLFVBQVUsQ0FBVixDQUFyRCxDQUFvRSxNQUEvRSxDQUNBLFVBQVlBLFVBQVUxRCxNQUFWLENBQW1CLENBQW5CLEVBQXdCMEQsVUFBVSxDQUFWLElBQWlCL0UsU0FBekMsQ0FBcUQrRSxVQUFVLENBQVYsQ0FBckQsQ0FBb0UsU0FBQSxFQUFoRixDQUNBLFdBQWFBLFVBQVUxRCxNQUFWLENBQW1CLENBQW5CLEVBQXdCMEQsVUFBVSxDQUFWLElBQWlCL0UsU0FBekMsQ0FBcUQrRSxVQUFVLENBQVYsQ0FBckQsQ0FBb0Usc0JBQUEsQ0FBdUIsQ0FBQyxDQUF4QixDQUEyQixDQUEzQixDQUE4QixDQUE5QixDQUFpQyxDQUFDLENBQWxDLENBQXFDLENBQXJDLENBQXdDLENBQXhDLENBQWpGLENBQ0EsU0FBV0EsVUFBVTFELE1BQVYsQ0FBbUIsQ0FBbkIsRUFBd0IwRCxVQUFVLENBQVYsSUFBaUIvRSxTQUF6QyxDQUFxRCtFLFVBQVUsQ0FBVixDQUFyRCxDQUFvRSxRQUFBLENBQVMsdUJBQUEsQ0FBd0IsQ0FBeEIsQ0FBMkIsQ0FBM0IsQ0FBVCxDQUF3QyxJQUF4QyxDQUEvRSxDQUVBMnZJLGVBQWUsSUFBZixDQUFxQitjLElBQXJCLEVBRUE7Ozs7U0FLQSxLQUFLL3pKLElBQUwsQ0FBWUEsSUFBWixDQUNBOzs7OztTQU9BLEtBQUtxNkQsS0FBTCxDQUFhQSxLQUFiLENBQ0E7Ozs7O1NBT0EsS0FBS2ovQixNQUFMLENBQWNBLE1BQWQsQ0FDQTs7Ozs7U0FPQSxLQUFLNDRILElBQUwsQ0FBWUEsSUFBWixDQUVBLEdBQUksS0FBS0EsSUFBTCxHQUFjLElBQWxCLENBQXdCLENBQ3RCLEtBQUtBLElBQUwsQ0FBVTMyRyxhQUFWLENBQTBCLEtBQTFCLENBRUEsR0FBSSxLQUFLZ2QsS0FBTCxHQUFlLElBQW5CLENBQXlCLENBQ3ZCLEtBQUtBLEtBQUwsQ0FBV3h4QyxHQUFYLENBQWUsS0FBS21ySSxJQUFwQixFQUNELENBQ0YsQ0FDRDs7OztTQU9BLEtBQUtDLGNBQUwsQ0FBc0IsS0FBdEIsQ0FDQTs7OztTQU1BLEtBQUtoekcsT0FBTCxDQUFlLElBQWYsQ0FDQTs7Ozs7Ozs7U0FVQSxLQUFLaXpHLFNBQUwsQ0FBaUIsSUFBakIsQ0FDRCxDQUNEOzs7O09BT0EvYixZQUFZNGIsSUFBWixDQUFrQixDQUFDLENBQ2pCdHdKLElBQUssUUFEWTs7Ozs7Ozs7Ozs7O1NBZ0JqQjlDLE1BQU8sZUFBQSxDQUFnQnU1RCxRQUFoQixDQUEwQmk2RixXQUExQixDQUF1Q0MsWUFBdkMsQ0FBcUQvc0gsS0FBckQsQ0FBNERpd0MsV0FBNUQsQ0FBeUUsQ0FDOUUsZUFBTSxDQUFVLGdDQUFWLENBQU4sQ0FDRCxDQUNEOzs7Ozs7Ozs7Ozs7VUFuQmdCLENBaUNmLENBQ0Q3ekUsSUFBSyxTQURKLENBRUQ5QyxNQUFPLGdCQUFBLENBQWlCby9CLEtBQWpCLENBQXdCQyxNQUF4QixDQUFnQyxFQUN2Qzs7Ozs7Ozs7Ozs7Ozs7OztVQXBDZ0IsQ0FzRGYsQ0FDRHY4QixJQUFLLFlBREosQ0FFRDlDLE1BQU8sbUJBQUEsQ0FBb0J1NUQsUUFBcEIsQ0FBOEJsdkMsS0FBOUIsQ0FBcUMsRUFDNUM7Ozs7Ozs7Ozs7OztVQXpEZ0IsQ0F1RWYsQ0FDRHZuQixJQUFLLFNBREosQ0FFRDlDLE1BQU8sZ0JBQUEsRUFBbUIsQ0FDeEIsT0FBQSxDQUVBLFNBQVcxRCxPQUFPc0csSUFBUCxDQUFZLElBQVosQ0FBWCxDQUVBLElBQUssT0FBUyxDQUFkLENBQWlCb04sR0FBS3lvSSxLQUFLejFJLE1BQTNCLENBQW1DZ04sSUFBbkMsQ0FBeUMsQ0FDdkNsTixJQUFNMjFJLEtBQUt6b0ksRUFBTCxDQUFOLENBRUEsR0FBSSxLQUFLbE4sR0FBTCxJQUFjLElBQWQsRUFBc0IsWUFBWUEsR0FBTCxFQUFVZzlCLE9BQWpCLEdBQTZCLFVBQXZELENBQW1FLENBQ2pFLEtBQUtoOUIsR0FBTCxFQUFVZzlCLE9BQVYsR0FDQSxLQUFLaDlCLEdBQUwsRUFBWSxJQUFaLENBQ0QsQ0FDRixDQUVELEdBQUksS0FBS3c4QyxRQUFMLEdBQWtCLElBQXRCLENBQTRCLENBQzFCLEtBQUtBLFFBQUwsQ0FBY3hmLE9BQWQsR0FDRCxDQUNGLENBbkJBLENBdkVlLENBMkZmLENBQ0RoOUIsSUFBSyxVQURKLENBRURpRSxJQUFLLFlBQUEsRUFBZSxDQUNsQixZQUFZc3NKLElBQUwsR0FBYyxJQUFkLENBQXFCLEtBQUtBLElBQUwsQ0FBVS96RyxRQUEvQixDQUEwQyxJQUFqRCxDQUNELENBQ0Q7Ozs7OztVQVFBM3JDLElBQUssWUFBQSxDQUFhM1QsS0FBYixDQUFvQixDQUN2QixHQUFJLEtBQUtxekosSUFBTCxHQUFjLElBQWxCLENBQXdCLENBQ3RCLEtBQUtBLElBQUwsQ0FBVS96RyxRQUFWLENBQXFCdC9DLEtBQXJCLENBQ0QsQ0FDRixDQWpCQSxDQTNGZSxDQUFsQixFQStHQSxXQUFBLENBQ0QsQ0F6TUQsRUFGQSxDQTZNQTs7OztLQU1BLDBCQUVBLFNBQVUwekosS0FBVixDQUFpQjs7Ozs7O09BUWYsaUJBQUEsRUFBb0IsQ0FDbEIsU0FBQSxDQUVBLFlBQWNodEosVUFBVTFELE1BQVYsQ0FBbUIsQ0FBbkIsRUFBd0IwRCxVQUFVLENBQVYsSUFBaUIvRSxTQUF6QyxDQUFxRCtFLFVBQVUsQ0FBVixDQUFyRCxDQUFvRSxFQUFsRixDQUVBMnZJLGVBQWUsSUFBZixDQUFxQnNkLFFBQXJCLEVBRUFya0UsTUFBUWluRCwwQkFBMEIsSUFBMUIsQ0FBZ0NOLGlCQUFpQjBkLFFBQWpCLEVBQTJCMTFKLElBQTNCLENBQWdDLElBQWhDLENBQXNDLFVBQXRDLENBQWhDLENBQVIsQ0FDQTs7Ozs7U0FPQXF4RixNQUFNc2tFLGFBQU4sQ0FBc0IscUJBQUEsQ0FBc0IsQ0FBdEIsQ0FBeUIsQ0FBekIsQ0FBNEIsQ0FDaER2MkgsVUFBV1csWUFEcUMsQ0FFaERaLFVBQVdZLFlBRnFDLENBR2hEK0MsY0FBZSxLQUhpQyxDQUloREQsWUFBYSxLQUptQyxDQUE1QixDQUF0QixDQU1Bd3VELE1BQU1za0UsYUFBTixDQUFvQi95SCxPQUFwQixDQUE0QnhoQyxJQUE1QixDQUFtQyxjQUFuQyxDQUNBaXdGLE1BQU1za0UsYUFBTixDQUFvQi95SCxPQUFwQixDQUE0QnZDLGVBQTVCLENBQThDLEtBQTlDLENBQ0E7Ozs7O1NBT0FneEQsTUFBTXVrRSxhQUFOLENBQXNCdmtFLE1BQU1za0UsYUFBTixDQUFvQjVySSxLQUFwQixFQUF0QixDQUNBc25FLE1BQU11a0UsYUFBTixDQUFvQmh6SCxPQUFwQixDQUE0QnhoQyxJQUE1QixDQUFtQyxjQUFuQyxDQUNBOzs7Ozs7O1NBU0Fpd0YsTUFBTXdrRSxlQUFOLENBQXdCcnpILFFBQVFxekgsZUFBUixHQUE0Qm55SixTQUE1QixDQUF3QzgrQixRQUFRcXpILGVBQWhELENBQWtFLEdBQTFGLENBQ0E7Ozs7O1NBT0F4a0UsTUFBTXlrRSxtQkFBTixDQUE0Qix1QkFBQSxFQUE1QixDQUNBOzs7OztTQU9BemtFLE1BQU0wa0UsMkJBQU4sQ0FBb0MsdUJBQUEsRUFBcEMsQ0FDQTFrRSxNQUFNMGtFLDJCQUFOLENBQWtDbmtHLFNBQWxDLENBQThDLElBQTlDLENBQ0E7Ozs7U0FNQXkvQixNQUFNei9CLFNBQU4sQ0FBa0IsS0FBbEIsQ0FDQXkvQixNQUFNdTVELFVBQU4sQ0FBbUJwb0gsUUFBUW9vSCxVQUEzQixDQUNBLFlBQUEsQ0FDRCxDQUNEOzs7O09BT0FyUixZQUFZbWMsUUFBWixDQUFzQixDQUFDLENBQ3JCN3dKLElBQUssUUFEZ0I7Ozs7Ozs7OztTQWFyQjlDLE1BQU8sZUFBQSxDQUFnQnU1RCxRQUFoQixDQUEwQmk2RixXQUExQixDQUF1Q0MsWUFBdkMsQ0FBcUQvc0gsS0FBckQsQ0FBNERpd0MsV0FBNUQsQ0FBeUUsQ0FDOUUsVUFBWSxLQUFLamQsS0FBakIsQ0FDQSxXQUFhLEtBQUtqL0IsTUFBbEIsQ0FDQSxrQkFBb0IsS0FBS201SCxhQUF6QixDQUNBLGtCQUFvQixLQUFLQyxhQUF6QixDQUNBLGFBQWUsS0FBS0UsbUJBQXBCLENBQ0EsYUFBZXowRyxTQUFTL08sUUFBeEIsQ0FDQSxXQUFhK08sU0FBUzIwRyxTQUFULEVBQWIsQ0FDQSxXQUFhVCxXQUFiLENBQ0EsVUFBQSxDQUNBLEtBQUEsQ0FBTzF0SixDQUFQLENBQ0EsS0FBS3c1QyxRQUFMLENBQWdCQSxRQUFoQixDQUEwQjtFQUUxQixJQUFLajhDLEVBQUksQ0FBSixDQUFPeUMsRUFBSTJpSixPQUFPemxKLE1BQVAsQ0FBZ0IsQ0FBaEMsQ0FBbUNLLEVBQUl5QyxDQUF2QyxDQUEwQyxFQUFFekMsQ0FBNUMsQ0FBK0M7RUFFN0M2d0osT0FBUzd3SixFQUFJLENBQUosR0FBVSxDQUFWLENBQWN1d0osYUFBZCxDQUE4QkMsYUFBdkMsQ0FDQXRqSCxTQUFTazRHLE1BQVQsQ0FBZ0J6b0osS0FBaEIsQ0FBd0J5b0osT0FBT3BsSixDQUFQLENBQXhCLENBQ0FrdEMsU0FBUzQyRyxRQUFULENBQWtCbm5KLEtBQWxCLENBQTBCbTBKLE9BQU90ekgsT0FBakMsQ0FDQTA0QixTQUFTcUIsTUFBVCxDQUFnQmxCLEtBQWhCLENBQXVCai9CLE1BQXZCLENBQStCeTVILE1BQS9CLEVBQ0FDLE9BQVNELE1BQVQsQ0FDRCxDQUVELEdBQUksS0FBS3JrRyxTQUFULENBQW9CLENBQ2xCdlEsU0FBVyxLQUFLMDBHLDJCQUFoQixDQUNBempILFNBQVcrTyxTQUFTL08sUUFBcEIsQ0FDQSxLQUFLK08sUUFBTCxDQUFnQkEsUUFBaEIsQ0FDRCxDQUVEL08sU0FBU2s0RyxNQUFULENBQWdCem9KLEtBQWhCLENBQXdCeW9KLE9BQU9wbEosQ0FBUCxDQUF4QixDQUNBa3RDLFNBQVM0MkcsUUFBVCxDQUFrQm5uSixLQUFsQixDQUEwQm0wSixPQUFPdHpILE9BQWpDLENBQ0EwNEIsU0FBU3FCLE1BQVQsQ0FBZ0JsQixLQUFoQixDQUF1QmovQixNQUF2QixDQUErQixLQUFLNjRILGNBQUwsQ0FBc0IsSUFBdEIsQ0FBNkJHLFlBQTVELEVBQ0QsQ0FDRDs7Ozs7VUE3Q29CLENBb0RuQixDQUNEM3dKLElBQUssU0FESixDQUVEOUMsTUFBTyxnQkFBQSxDQUFpQm8vQixLQUFqQixDQUF3QkMsTUFBeEIsQ0FBZ0MsQ0FDckNELE1BQVFsNkIsS0FBSzhFLEdBQUwsQ0FBUyxDQUFULENBQVk5RSxLQUFLRSxLQUFMLENBQVdnNkIsTUFBUSxLQUFLMDBILGVBQXhCLENBQVosQ0FBUixDQUNBejBILE9BQVNuNkIsS0FBSzhFLEdBQUwsQ0FBUyxDQUFULENBQVk5RSxLQUFLRSxLQUFMLENBQVdpNkIsT0FBUyxLQUFLeTBILGVBQXpCLENBQVosQ0FBVCxDQUNBLEtBQUtGLGFBQUwsQ0FBbUJ6eUgsT0FBbkIsQ0FBMkIvQixLQUEzQixDQUFrQ0MsTUFBbEMsRUFDQSxLQUFLdzBILGFBQUwsQ0FBbUIxeUgsT0FBbkIsQ0FBMkIvQixLQUEzQixDQUFrQ0MsTUFBbEMsRUFDQSxLQUFLMDBILG1CQUFMLENBQXlCbkwsWUFBekIsQ0FBc0MsSUFBTXhwSCxLQUE1QyxDQUFtRCxJQUFNQyxNQUF6RCxFQUNBLEtBQUsyMEgsMkJBQUwsQ0FBaUNwTCxZQUFqQyxDQUE4QyxJQUFNeHBILEtBQXBELENBQTJELElBQU1DLE1BQWpFLEVBQ0QsQ0FDRDs7Ozs7VUE5RG9CLENBcUVuQixDQUNEdjhCLElBQUssWUFESixDQUVEOUMsTUFBTyxtQkFBQSxDQUFvQnU1RCxRQUFwQixDQUE4Qmx2QyxLQUE5QixDQUFxQyxDQUMxQyxHQUFJLENBQUNBLEtBQUwsQ0FBWSxDQUNWLEtBQUt1cEksYUFBTCxDQUFtQi95SCxPQUFuQixDQUEyQnZELE1BQTNCLENBQW9Dc2lELFNBQXBDLENBQ0EsS0FBS2kwRSxhQUFMLENBQW1CaHpILE9BQW5CLENBQTJCdkQsTUFBM0IsQ0FBb0NzaUQsU0FBcEMsQ0FDRCxDQUNGLENBUEEsQ0FyRW1CLENBNkVuQixDQUNEOThFLElBQUssT0FESixDQUVEaUUsSUFBSyxZQUFBLEVBQWUsQ0FDbEIsWUFBWTZzSixhQUFMLENBQW1CeDBILEtBQTFCLENBQ0QsQ0FDRDs7OztVQWxGb0IsQ0F3Rm5CLENBQ0R0OEIsSUFBSyxRQURKLENBRURpRSxJQUFLLFlBQUEsRUFBZSxDQUNsQixZQUFZNnNKLGFBQUwsQ0FBbUJ2MEgsTUFBMUIsQ0FDRCxDQUNEOzs7O1VBN0ZvQixDQW1HbkIsQ0FDRHY4QixJQUFLLFlBREosQ0FFRGlFLElBQUssWUFBQSxFQUFlLENBQ2xCLFlBQVlndEosbUJBQUwsQ0FBeUJsTCxVQUFoQyxDQUNELENBQ0Q7O1VBSUFsMUksSUFBSyxZQUFBLEVBQWUsQ0FDbEIsVUFBWWpOLFVBQVUxRCxNQUFWLENBQW1CLENBQW5CLEVBQXdCMEQsVUFBVSxDQUFWLElBQWlCL0UsU0FBekMsQ0FBcUQrRSxVQUFVLENBQVYsQ0FBckQsQ0FBb0VvaUosV0FBV0MsS0FBM0YsQ0FDQSxLQUFLZ0wsbUJBQUwsQ0FBeUJsTCxVQUF6QixDQUFzQzdvSixLQUF0QyxDQUNBLEtBQUtnMEosMkJBQUwsQ0FBaUNuTCxVQUFqQyxDQUE4QzdvSixLQUE5QyxDQUNELENBYkEsQ0FuR21CLENBQXRCLEVBbUhBMDJJLFNBQVNpZCxRQUFULENBQW1CRCxLQUFuQixFQUVBLGVBQUEsQ0FDRCxDQTFNRCxDQTBNRU4sSUExTUYsQ0FGQSxDQThNQTs7Ozs7S0FPQSwyQkFFQSxTQUFVTSxLQUFWLENBQWlCOzs7Ozs7Ozs7T0FXZixrQkFBQSxFQUFxQixDQUNuQixTQUFBLENBRUEsWUFBY2h0SixVQUFVMUQsTUFBVixDQUFtQixDQUFuQixFQUF3QjBELFVBQVUsQ0FBVixJQUFpQi9FLFNBQXpDLENBQXFEK0UsVUFBVSxDQUFWLENBQXJELENBQW9FLEVBQWxGLENBRUEydkksZUFBZSxJQUFmLENBQXFCK2QsU0FBckIsRUFFQTlrRSxNQUFRaW5ELDBCQUEwQixJQUExQixDQUFnQ04saUJBQWlCbWUsU0FBakIsRUFBNEJuMkosSUFBNUIsQ0FBaUMsSUFBakMsQ0FBdUMsV0FBdkMsQ0FBaEMsQ0FBUixDQUNBOzs7OztTQU9BcXhGLE1BQU1yUixZQUFOLENBQXFCLHFCQUFBLENBQXNCLENBQXRCLENBQXlCLENBQXpCLENBQTRCLENBQy9DNWdELFVBQVdXLFlBRG9DLENBRS9DWixVQUFXWSxZQUZvQyxDQUcvQytDLGNBQWUsS0FIZ0MsQ0FJL0NELFlBQWEsS0FKa0MsQ0FBNUIsQ0FBckIsQ0FNQXd1RCxNQUFNclIsWUFBTixDQUFtQnA5QyxPQUFuQixDQUEyQnhoQyxJQUEzQixDQUFrQyxjQUFsQyxDQUNBaXdGLE1BQU1yUixZQUFOLENBQW1CcDlDLE9BQW5CLENBQTJCdkMsZUFBM0IsQ0FBNkMsS0FBN0MsQ0FDQTs7Ozs7U0FPQWd4RCxNQUFNK2tFLFFBQU4sQ0FBaUIsWUFBQSxDQUFhNXpILE9BQWIsQ0FBakIsQ0FDQTs7Ozs7U0FPQTZ1RCxNQUFNZ2xFLGVBQU4sQ0FBd0IsbUJBQUEsQ0FBb0I3ekgsUUFBUTRuSCxVQUFSLEdBQXVCMW1KLFNBQXZCLENBQW1DOCtCLFFBQVE0bkgsVUFBM0MsQ0FBd0QsSUFBNUUsQ0FBeEIsQ0FDQS80RCxNQUFNN2dCLFNBQU4sQ0FBa0JodUMsUUFBUWd1QyxTQUExQixDQUNBOzs7OztTQU9BNmdCLE1BQU1pbEUsa0JBQU4sQ0FBMkIsc0JBQUEsQ0FBdUIsSUFBdkIsQ0FBM0IsQ0FDQWpsRSxNQUFNaytELFdBQU4sQ0FBb0Ivc0gsUUFBUStzSCxXQUE1QixDQUNBLFlBQUEsQ0FDRCxDQUNEOzs7O09BT0FoVyxZQUFZNGMsU0FBWixDQUF1QixDQUFDLENBQ3RCdHhKLElBQUssUUFEaUI7Ozs7Ozs7O1NBWXRCOUMsTUFBTyxlQUFBLENBQWdCdTVELFFBQWhCLENBQTBCaTZGLFdBQTFCLENBQXVDQyxZQUF2QyxDQUFxRC9zSCxLQUFyRCxDQUE0RGl3QyxXQUE1RCxDQUF5RSxDQUM5RSxVQUFZLEtBQUtqZCxLQUFqQixDQUNBLFdBQWEsS0FBS2ovQixNQUFsQixDQUNBLGFBQWUsS0FBSzQ1SCxRQUFwQixDQUNBLHVCQUF5QixLQUFLRSxrQkFBOUIsQ0FDQSxvQkFBc0IsS0FBS0QsZUFBM0IsQ0FDQSxpQkFBbUIsS0FBS3IyRSxZQUF4QixDQUFzQztFQUV0QyxLQUFLMytCLFFBQUwsQ0FBZ0JpMUcsa0JBQWhCLENBQ0FBLG1CQUFtQmhrSCxRQUFuQixDQUE0QjQyRyxRQUE1QixDQUFxQ25uSixLQUFyQyxDQUE2Q3d6SixZQUFZM3lILE9BQXpELENBQ0EwNEIsU0FBU3FCLE1BQVQsQ0FBZ0JsQixLQUFoQixDQUF1QmovQixNQUF2QixDQUErQndqRCxZQUEvQixFQUE4QztFQUU5Q28yRSxTQUFTejVGLE1BQVQsQ0FBZ0JyQixRQUFoQixDQUEwQjBrQixZQUExQixDQUF3Q0EsWUFBeEMsRUFFQSxHQUFJLEtBQUt1MkUsS0FBVCxDQUFnQjtFQUVkLEtBQUtsMUcsUUFBTCxDQUFnQmcxRyxlQUFoQixDQUNBQSxnQkFBZ0IvakgsUUFBaEIsQ0FBeUJ1M0csUUFBekIsQ0FBa0M5bkosS0FBbEMsQ0FBMEN3ekosWUFBWTN5SCxPQUF0RCxDQUNBeXpILGdCQUFnQi9qSCxRQUFoQixDQUF5QnczRyxRQUF6QixDQUFrQy9uSixLQUFsQyxDQUEwQ2krRSxhQUFhcDlDLE9BQXZELENBQ0EwNEIsU0FBU3FCLE1BQVQsQ0FBZ0JsQixLQUFoQixDQUF1QmovQixNQUF2QixDQUErQixLQUFLNjRILGNBQUwsQ0FBc0IsSUFBdEIsQ0FBNkJHLFlBQTVELEVBQ0QsQ0FDRixDQUNEOzs7OztVQWxDcUIsQ0F5Q3BCLENBQ0Qzd0osSUFBSyxTQURKLENBRUQ5QyxNQUFPLGdCQUFBLENBQWlCby9CLEtBQWpCLENBQXdCQyxNQUF4QixDQUFnQyxDQUNyQyxLQUFLZzFILFFBQUwsQ0FBY2x6SCxPQUFkLENBQXNCL0IsS0FBdEIsQ0FBNkJDLE1BQTdCLEVBQ0FELE1BQVEsS0FBS2kxSCxRQUFMLENBQWNqMUgsS0FBdEIsQ0FDQUMsT0FBUyxLQUFLZzFILFFBQUwsQ0FBY2gxSCxNQUF2QixDQUNBLEtBQUs0K0MsWUFBTCxDQUFrQjk4QyxPQUFsQixDQUEwQi9CLEtBQTFCLENBQWlDQyxNQUFqQyxFQUNELENBQ0Q7Ozs7O1VBakRxQixDQXdEcEIsQ0FDRHY4QixJQUFLLFlBREosQ0FFRDlDLE1BQU8sbUJBQUEsQ0FBb0J1NUQsUUFBcEIsQ0FBOEJsdkMsS0FBOUIsQ0FBcUMsQ0FDMUMsS0FBS2dxSSxRQUFMLENBQWNJLFVBQWQsQ0FBeUJsN0YsUUFBekIsQ0FBbUNsdkMsS0FBbkMsRUFFQSxHQUFJLENBQUNBLEtBQUwsQ0FBWSxDQUNWLEtBQUs0ekQsWUFBTCxDQUFrQnA5QyxPQUFsQixDQUEwQnZELE1BQTFCLENBQW1Dc2lELFNBQW5DLENBQ0QsQ0FDRixDQVJBLENBeERvQixDQWlFcEIsQ0FDRDk4RSxJQUFLLGlCQURKLENBRURpRSxJQUFLLFlBQUEsRUFBZSxDQUNsQixZQUFZc3RKLFFBQUwsQ0FBY1AsZUFBckIsQ0FDRCxDQUNEOzs7O1VBTUFuZ0osSUFBSyxZQUFBLEVBQWUsQ0FDbEIsVUFBWWpOLFVBQVUxRCxNQUFWLENBQW1CLENBQW5CLEVBQXdCMEQsVUFBVSxDQUFWLElBQWlCL0UsU0FBekMsQ0FBcUQrRSxVQUFVLENBQVYsQ0FBckQsQ0FBb0UsR0FBaEYsQ0FDQSxLQUFLMnRKLFFBQUwsQ0FBY1AsZUFBZCxDQUFnQzl6SixLQUFoQyxDQUNELENBQ0Q7Ozs7VUFoRnFCLENBc0ZwQixDQUNEOEMsSUFBSyxZQURKLENBRURpRSxJQUFLLFlBQUEsRUFBZSxDQUNsQixZQUFZc3RKLFFBQUwsQ0FBY3hMLFVBQXJCLENBQ0QsQ0FDRDs7VUFJQWwxSSxJQUFLLFlBQUEsRUFBZSxDQUNsQixVQUFZak4sVUFBVTFELE1BQVYsQ0FBbUIsQ0FBbkIsRUFBd0IwRCxVQUFVLENBQVYsSUFBaUIvRSxTQUF6QyxDQUFxRCtFLFVBQVUsQ0FBVixDQUFyRCxDQUFvRW9pSixXQUFXQyxLQUEzRixDQUNBLEtBQUtzTCxRQUFMLENBQWN4TCxVQUFkLENBQTJCN29KLEtBQTNCLENBQ0QsQ0FDRDs7OztVQW5HcUIsQ0F5R3BCLENBQ0Q4QyxJQUFLLFdBREosQ0FFRGlFLElBQUssWUFBQSxFQUFlLENBQ2xCLFlBQVl1dEosZUFBTCxDQUFxQi9qSCxRQUFyQixDQUE4QjAzRyxRQUE5QixDQUF1Q2pvSixLQUE5QyxDQUNELENBQ0Q7O1VBSUEyVCxJQUFLLFlBQUEsRUFBZSxDQUNsQixVQUFZak4sVUFBVTFELE1BQVYsQ0FBbUIsQ0FBbkIsRUFBd0IwRCxVQUFVLENBQVYsSUFBaUIvRSxTQUF6QyxDQUFxRCtFLFVBQVUsQ0FBVixDQUFyRCxDQUFvRSxHQUFoRixDQUNBLEtBQUs0dEosZUFBTCxDQUFxQi9qSCxRQUFyQixDQUE4QjAzRyxRQUE5QixDQUF1Q2pvSixLQUF2QyxDQUErQ0EsS0FBL0MsQ0FDRCxDQUNEOzs7O1VBdEhxQixDQTRIcEIsQ0FDRDhDLElBQUssYUFESixDQUVEaUUsSUFBSyxZQUFBLEVBQWUsQ0FDbEIsWUFBWXd0SixrQkFBTCxDQUF3QmhrSCxRQUF4QixDQUFpQ2k5RyxXQUFqQyxDQUE2Q3h0SixLQUFwRCxDQUNELENBQ0Q7O1VBSUEyVCxJQUFLLFlBQUEsRUFBZSxDQUNsQixVQUFZak4sVUFBVTFELE1BQVYsQ0FBbUIsQ0FBbkIsRUFBd0IwRCxVQUFVLENBQVYsSUFBaUIvRSxTQUF6QyxDQUFxRCtFLFVBQVUsQ0FBVixDQUFyRCxDQUFvRSxHQUFoRixDQUNBLEtBQUs2dEosa0JBQUwsQ0FBd0Joa0gsUUFBeEIsQ0FBaUNpOUcsV0FBakMsQ0FBNkN4dEosS0FBN0MsQ0FBcURBLEtBQXJELENBQ0QsQ0FDRDs7OztVQXpJcUIsQ0ErSXBCLENBQ0Q4QyxJQUFLLFdBREosQ0FFRGlFLElBQUssWUFBQSxFQUFlLENBQ2xCLFlBQVlzdEosUUFBTCxDQUFjeGtHLFNBQXJCLENBQ0QsQ0FDRDs7OztVQU1BbDhDLElBQUssWUFBQSxDQUFhM1QsS0FBYixDQUFvQixDQUN2QixLQUFLcTBKLFFBQUwsQ0FBY3hrRyxTQUFkLENBQTBCN3ZELEtBQTFCLENBQ0QsQ0FDRDs7OztVQTdKcUIsQ0FtS3BCLENBQ0Q4QyxJQUFLLE9BREosQ0FFRGlFLElBQUssWUFBQSxFQUFlLENBQ2xCLFlBQVl3c0osU0FBWixDQUNELENBQ0Q7Ozs7Ozs7VUFTQTUvSSxJQUFLLFlBQUEsQ0FBYTNULEtBQWIsQ0FBb0IsQ0FDdkIsS0FBS3V6SixTQUFMLENBQWlCdnpKLEtBQWpCLENBQ0QsQ0FDRDs7OztVQXBMcUIsQ0EwTHBCLENBQ0Q4QyxJQUFLLFNBREosQ0FFRGlFLElBQUssWUFBQSxFQUFlLENBQ2xCLFlBQVlrM0UsWUFBTCxDQUFrQnA5QyxPQUF6QixDQUNELENBSkEsQ0ExTG9CLENBQXZCLEVBaU1BNjFHLFNBQVMwZCxTQUFULENBQW9CVixLQUFwQixFQUVBLGdCQUFBLENBQ0QsQ0F6UUQsQ0F5UUVOLElBelFGLENBRkEsQ0E2UUE7Ozs7S0FNQSwyQkFFQSxTQUFVTSxLQUFWLENBQWlCOzs7OztPQU9mLGtCQUFBLENBQW1CajVILE1BQW5CLENBQTJCLENBQ3pCLFNBQUEsQ0FFQSxZQUFjL3pCLFVBQVUxRCxNQUFWLENBQW1CLENBQW5CLEVBQXdCMEQsVUFBVSxDQUFWLElBQWlCL0UsU0FBekMsQ0FBcUQrRSxVQUFVLENBQVYsQ0FBckQsQ0FBb0UsRUFBbEYsQ0FFQTJ2SSxlQUFlLElBQWYsQ0FBcUJxZSxTQUFyQixFQUVBcGxFLE1BQVFpbkQsMEJBQTBCLElBQTFCLENBQWdDTixpQkFBaUJ5ZSxTQUFqQixFQUE0QnoySixJQUE1QixDQUFpQyxJQUFqQyxDQUF1QyxXQUF2QyxDQUFoQyxDQUFSLENBQ0FxeEYsTUFBTWh3QyxRQUFOLENBQWlCLGlCQUFBLENBQWtCN2tCLE1BQWxCLENBQTBCZ0csT0FBMUIsQ0FBakIsQ0FDQSxZQUFBLENBQ0QsQ0FDRDs7Ozs7Ozs7T0FXQSsyRyxZQUFZa2QsU0FBWixDQUF1QixDQUFDLENBQ3RCNXhKLElBQUssUUFEaUIsQ0FFdEI5QyxNQUFPLGVBQUEsQ0FBZ0J1NUQsUUFBaEIsQ0FBMEJpNkYsV0FBMUIsQ0FBdUNDLFlBQXZDLENBQXFEL3NILEtBQXJELENBQTREaXdDLFdBQTVELENBQXlFLENBQzlFLEtBQUtyM0IsUUFBTCxDQUFjL08sUUFBZCxDQUF1QjQyRyxRQUF2QixDQUFnQ25uSixLQUFoQyxDQUF3Q3d6SixZQUFZM3lILE9BQXBELENBQ0EsS0FBS3llLFFBQUwsQ0FBYy9PLFFBQWQsQ0FBdUI2MkcsTUFBdkIsQ0FBOEJwbkosS0FBOUIsQ0FBc0N3ekosWUFBWXh5SCxZQUFsRCxDQUNBdTRCLFNBQVNxQixNQUFULENBQWdCLEtBQUtsQixLQUFyQixDQUE0QixLQUFLai9CLE1BQWpDLENBQXlDLEtBQUs2NEgsY0FBTCxDQUFzQixJQUF0QixDQUE2QkcsWUFBdEUsRUFDRCxDQUNEOzs7OztVQVBxQixDQWNwQixDQUNEM3dKLElBQUssU0FESixDQUVEOUMsTUFBTyxnQkFBQSxDQUFpQm8vQixLQUFqQixDQUF3QkMsTUFBeEIsQ0FBZ0MsQ0FDckMsS0FBS2lnQixRQUFMLENBQWMvTyxRQUFkLENBQXVCKzNDLE1BQXZCLENBQThCdG9GLEtBQTlCLENBQXNDby9CLE1BQVFDLE1BQTlDLENBQ0QsQ0FKQSxDQWRvQixDQUF2QixFQXFCQXEzRyxTQUFTZ2UsU0FBVCxDQUFvQmhCLEtBQXBCLEVBRUEsZ0JBQUEsQ0FDRCxDQXJERCxDQXFERU4sSUFyREYsQ0FGQSxDQXlEQTs7S0FJQSwrQkFFQSxTQUFVTSxLQUFWLENBQWlCOztPQUlmLHNCQUFBLEVBQXlCLENBQ3ZCLFNBQUEsQ0FFQXJkLGVBQWUsSUFBZixDQUFxQnNlLGFBQXJCLEVBRUFybEUsTUFBUWluRCwwQkFBMEIsSUFBMUIsQ0FBZ0NOLGlCQUFpQjBlLGFBQWpCLEVBQWdDMTJKLElBQWhDLENBQXFDLElBQXJDLENBQTJDLGVBQTNDLENBQTRELElBQTVELENBQWtFLElBQWxFLENBQXdFLElBQXhFLENBQWhDLENBQVIsQ0FDQXF4RixNQUFNaWtFLFNBQU4sQ0FBa0IsS0FBbEIsQ0FDQSxZQUFBLENBQ0QsQ0FDRDs7Ozs7Ozs7T0FXQS9iLFlBQVltZCxhQUFaLENBQTJCLENBQUMsQ0FDMUI3eEosSUFBSyxRQURxQixDQUUxQjlDLE1BQU8sZUFBQSxDQUFnQnU1RCxRQUFoQixDQUEwQmk2RixXQUExQixDQUF1Q0MsWUFBdkMsQ0FBcUQvc0gsS0FBckQsQ0FBNERpd0MsV0FBNUQsQ0FBeUUsQ0FDOUVwZCxTQUFTeDRELEtBQVQsQ0FBZTA1QyxPQUFmLENBQXVCbTlCLE9BQXZCLENBQStCOUYsT0FBL0IsQ0FBdUMsS0FBdkMsRUFDRCxDQUp5QixDQUFELENBQTNCLEVBT0E0a0UsU0FBU2llLGFBQVQsQ0FBd0JqQixLQUF4QixFQUVBLG9CQUFBLENBQ0QsQ0FsQ0QsQ0FrQ0VOLElBbENGLENBRkEsQ0FzQ0E7Ozs7O0tBT0EsVUFBWSxTQUFBLEVBQVosQ0FDQTs7Ozs7O0tBUUEsMkJBRUEsU0FBVU0sS0FBVixDQUFpQjs7Ozs7O09BUWYsa0JBQUEsRUFBcUIsQ0FDbkIsU0FBQSxDQUVBLFlBQWNodEosVUFBVTFELE1BQVYsQ0FBbUIsQ0FBbkIsRUFBd0IwRCxVQUFVLENBQVYsSUFBaUIvRSxTQUF6QyxDQUFxRCtFLFVBQVUsQ0FBVixDQUFyRCxDQUFvRSxFQUFsRixDQUVBMnZJLGVBQWUsSUFBZixDQUFxQnVlLFNBQXJCLEVBRUF0bEUsTUFBUWluRCwwQkFBMEIsSUFBMUIsQ0FBZ0NOLGlCQUFpQjJlLFNBQWpCLEVBQTRCMzJKLElBQTVCLENBQWlDLElBQWpDLENBQXVDLFdBQXZDLENBQW9ELElBQXBELENBQTBELElBQTFELENBQWdFLElBQWhFLENBQWhDLENBQVIsQ0FDQXF4RixNQUFNaWtFLFNBQU4sQ0FBa0IsS0FBbEIsQ0FDQTs7OztTQU1BamtFLE1BQU14MUIsVUFBTixDQUFtQnI1QixRQUFRcTVCLFVBQVIsR0FBdUJuNEQsU0FBdkIsQ0FBbUM4K0IsUUFBUXE1QixVQUEzQyxDQUF3RCxJQUEzRSxDQUNBOzs7O1NBTUF3MUIsTUFBTXYxQixVQUFOLENBQW1CdDVCLFFBQVFzNUIsVUFBUixHQUF1QnA0RCxTQUF2QixDQUFtQzgrQixRQUFRczVCLFVBQTNDLENBQXdELEdBQTNFLENBQ0EsWUFBQSxDQUNELENBQ0Q7Ozs7Ozs7O09BV0F5OUUsWUFBWW9kLFNBQVosQ0FBdUIsQ0FBQyxDQUN0Qjl4SixJQUFLLFFBRGlCLENBRXRCOUMsTUFBTyxlQUFBLENBQWdCdTVELFFBQWhCLENBQTBCaTZGLFdBQTFCLENBQXVDQyxZQUF2QyxDQUFxRC9zSCxLQUFyRCxDQUE0RGl3QyxXQUE1RCxDQUF5RSxDQUM5RSxlQUFpQixLQUFLN2MsVUFBdEIsQ0FDQSxjQUFBLENBRUEsR0FBSUEsYUFBZSxJQUFuQixDQUF5QixDQUN2QnZvQixNQUFNdHBCLElBQU4sQ0FBV3N4QyxTQUFTaUIsYUFBVCxFQUFYLEVBQ0FULFdBQWFSLFNBQVNtQixhQUFULEVBQWIsQ0FDQW5CLFNBQVNrQixhQUFULENBQXVCWCxVQUF2QixDQUFtQyxLQUFLQyxVQUF4QyxFQUNELENBRURSLFNBQVNpWixlQUFULENBQXlCLEtBQUs4Z0YsY0FBTCxDQUFzQixJQUF0QixDQUE2QkUsV0FBdEQsRUFDQWo2RixTQUFTM2xELEtBQVQsR0FFQSxHQUFJa21ELGFBQWUsSUFBbkIsQ0FBeUIsQ0FDdkJQLFNBQVNrQixhQUFULENBQXVCbHBCLEtBQXZCLENBQThCd29CLFVBQTlCLEVBQ0QsQ0FDRixDQWxCcUIsQ0FBRCxDQUF2QixFQXFCQTI4RSxTQUFTa2UsU0FBVCxDQUFvQmxCLEtBQXBCLEVBRUEsZ0JBQUEsQ0FDRCxDQXBFRCxDQW9FRU4sSUFwRUYsQ0FGQSxDQXdFQTs7S0FJQSwrQkFFQSxTQUFVTSxLQUFWLENBQWlCOzs7Ozs7OztPQVVmLHNCQUFBLEVBQXlCLENBQ3ZCLFNBQUEsQ0FFQSxZQUFjaHRKLFVBQVUxRCxNQUFWLENBQW1CLENBQW5CLEVBQXdCMEQsVUFBVSxDQUFWLElBQWlCL0UsU0FBekMsQ0FBcUQrRSxVQUFVLENBQVYsQ0FBckQsQ0FBb0UsRUFBbEYsQ0FFQTJ2SSxlQUFlLElBQWYsQ0FBcUJ3ZSxhQUFyQixFQUVBdmxFLE1BQVFpbkQsMEJBQTBCLElBQTFCLENBQWdDTixpQkFBaUI0ZSxhQUFqQixFQUFnQzUySixJQUFoQyxDQUFxQyxJQUFyQyxDQUEyQyxlQUEzQyxDQUFoQyxDQUFSLENBQ0FxeEYsTUFBTWh3QyxRQUFOLENBQWlCLHFCQUFBLENBQXNCN2UsT0FBdEIsQ0FBakIsQ0FDQSxZQUFBLENBQ0QsQ0FDRDs7Ozs7Ozs7T0FXQSsyRyxZQUFZcWQsYUFBWixDQUEyQixDQUFDLENBQzFCL3hKLElBQUssUUFEcUIsQ0FFMUI5QyxNQUFPLGVBQUEsQ0FBZ0J1NUQsUUFBaEIsQ0FBMEJpNkYsV0FBMUIsQ0FBdUNDLFlBQXZDLENBQXFEL3NILEtBQXJELENBQTREaXdDLFdBQTVELENBQXlFLENBQzlFLEtBQUtyM0IsUUFBTCxDQUFjL08sUUFBZCxDQUF1QjQyRyxRQUF2QixDQUFnQ25uSixLQUFoQyxDQUF3Q3d6SixZQUFZM3lILE9BQXBELENBQ0EwNEIsU0FBU3FCLE1BQVQsQ0FBZ0IsS0FBS2xCLEtBQXJCLENBQTRCLEtBQUtqL0IsTUFBakMsQ0FBeUMsS0FBSzY0SCxjQUFMLENBQXNCLElBQXRCLENBQTZCRyxZQUF0RSxFQUNELENBQ0Q7Ozs7O1VBTnlCLENBYXhCLENBQ0Qzd0osSUFBSyxTQURKLENBRUQ5QyxNQUFPLGdCQUFBLENBQWlCby9CLEtBQWpCLENBQXdCQyxNQUF4QixDQUFnQyxDQUNyQ0QsTUFBUWw2QixLQUFLOEUsR0FBTCxDQUFTLENBQVQsQ0FBWW8xQixLQUFaLENBQVIsQ0FDQUMsT0FBU242QixLQUFLOEUsR0FBTCxDQUFTLENBQVQsQ0FBWXExQixNQUFaLENBQVQsQ0FDQSxLQUFLaWdCLFFBQUwsQ0FBYy9PLFFBQWQsQ0FBdUJ1NUcsWUFBdkIsQ0FBb0M5cEosS0FBcEMsQ0FBMENpdEIsQ0FBMUMsQ0FBOENtUyxLQUE5QyxDQUNBLEtBQUtrZ0IsUUFBTCxDQUFjL08sUUFBZCxDQUF1QnU1RyxZQUF2QixDQUFvQzlwSixLQUFwQyxDQUEwQzJiLENBQTFDLENBQThDMGpCLE1BQTlDLENBQ0QsQ0FQQSxDQWJ3QixDQUEzQixFQXVCQXEzRyxTQUFTbWUsYUFBVCxDQUF3Qm5CLEtBQXhCLEVBRUEsb0JBQUEsQ0FDRCxDQTFERCxDQTBERU4sSUExREYsQ0FGQSxDQThEQTs7OztLQU1BLDBCQUVBLFNBQVVNLEtBQVYsQ0FBaUI7Ozs7Ozs7T0FTZixpQkFBQSxFQUFvQixDQUNsQixTQUFBLENBRUEsWUFBY2h0SixVQUFVMUQsTUFBVixDQUFtQixDQUFuQixFQUF3QjBELFVBQVUsQ0FBVixJQUFpQi9FLFNBQXpDLENBQXFEK0UsVUFBVSxDQUFWLENBQXJELENBQW9FLEVBQWxGLENBRUEydkksZUFBZSxJQUFmLENBQXFCeWUsUUFBckIsRUFFQXhsRSxNQUFRaW5ELDBCQUEwQixJQUExQixDQUFnQ04saUJBQWlCNmUsUUFBakIsRUFBMkI3MkosSUFBM0IsQ0FBZ0MsSUFBaEMsQ0FBc0MsVUFBdEMsQ0FBaEMsQ0FBUixDQUNBcXhGLE1BQU1od0MsUUFBTixDQUFpQixnQkFBQSxDQUFpQjdlLE9BQWpCLENBQWpCLENBQ0E7Ozs7Ozs7U0FTQTZ1RCxNQUFNeWxFLGVBQU4sQ0FBd0J0MEgsUUFBUXMwSCxlQUFSLEdBQTRCcHpKLFNBQTVCLENBQXdDLElBQXhDLENBQStDOCtCLFFBQVFzMEgsZUFBL0UsQ0FDQTs7Ozs7OztTQVNBemxFLE1BQU00N0QsU0FBTixDQUFrQnpxSCxRQUFReXFILFNBQVIsR0FBc0J2cEosU0FBdEIsQ0FBa0MsR0FBbEMsQ0FBd0N1RCxLQUFLOEUsR0FBTCxDQUFTeTJCLFFBQVF5cUgsU0FBakIsQ0FBNEIsSUFBNUIsQ0FBMUQsQ0FDQTs7Ozs7OztTQVNBNTdELE1BQU02N0QsYUFBTixDQUFzQjFxSCxRQUFRMHFILGFBQVIsR0FBMEJ4cEosU0FBMUIsQ0FBc0MsR0FBdEMsQ0FBNEN1RCxLQUFLOEUsR0FBTCxDQUFTeTJCLFFBQVEwcUgsYUFBakIsQ0FBZ0MsR0FBaEMsQ0FBbEUsQ0FDQSxZQUFBLENBQ0QsQ0FDRDs7Ozs7Ozs7T0FXQTNULFlBQVlzZCxRQUFaLENBQXNCLENBQUMsQ0FDckJoeUosSUFBSyxRQURnQixDQUVyQjlDLE1BQU8sZUFBQSxDQUFnQnU1RCxRQUFoQixDQUEwQmk2RixXQUExQixDQUF1Q0MsWUFBdkMsQ0FBcUQvc0gsS0FBckQsQ0FBNERpd0MsV0FBNUQsQ0FBeUUsQ0FDOUUsS0FBS3IzQixRQUFMLENBQWMvTyxRQUFkLENBQXVCNDJHLFFBQXZCLENBQWdDbm5KLEtBQWhDLENBQXdDd3pKLFlBQVkzeUgsT0FBcEQsQ0FDQSxLQUFLeWUsUUFBTCxDQUFjL08sUUFBZCxDQUF1QjJqRCxJQUF2QixDQUE0QmwwRixLQUE1QixFQUFxQzBtQyxLQUFyQyxDQUNBNnlCLFNBQVNxQixNQUFULENBQWdCLEtBQUtsQixLQUFyQixDQUE0QixLQUFLai9CLE1BQWpDLENBQXlDLEtBQUs2NEgsY0FBTCxDQUFzQixJQUF0QixDQUE2QkcsWUFBdEUsRUFDRCxDQUNEOzs7OztVQVBvQixDQWNuQixDQUNEM3dKLElBQUssU0FESixDQUVEOUMsTUFBTyxnQkFBQSxDQUFpQm8vQixLQUFqQixDQUF3QkMsTUFBeEIsQ0FBZ0MsQ0FDckMsV0FBYUQsTUFBUUMsTUFBckIsQ0FDQSxjQUFnQixLQUFLNnJILFNBQUwsRUFBa0I3ckgsT0FBUyxLQUEzQixDQUFoQixDQUNBLEtBQUtpZ0IsUUFBTCxDQUFjL08sUUFBZCxDQUF1QjA2RyxhQUF2QixDQUFxQ2pySixLQUFyQyxDQUE2Q2tGLEtBQUtra0IsS0FBTCxDQUFXaVcsT0FBUyxLQUFLMDFILGVBQXpCLENBQTdDLENBQ0EsS0FBS3oxRyxRQUFMLENBQWMvTyxRQUFkLENBQXVCMjZHLFNBQXZCLENBQWlDbHJKLEtBQWpDLENBQXVDMlQsR0FBdkMsQ0FBMkMyMEUsT0FBUzRpRSxTQUFwRCxDQUErREEsU0FBL0QsRUFDQSxLQUFLNXJHLFFBQUwsQ0FBYy9PLFFBQWQsQ0FBdUI0NkcsYUFBdkIsQ0FBcUNuckosS0FBckMsQ0FBNkNrckosVUFBWTdySCxNQUFaLENBQXFCLEtBQUs4ckgsYUFBdkUsQ0FDRCxDQVJBLENBZG1CLENBQXRCLEVBeUJBelUsU0FBU29lLFFBQVQsQ0FBbUJwQixLQUFuQixFQUVBLGVBQUEsQ0FDRCxDQXpGRCxDQXlGRU4sSUF6RkYsQ0FGQSxDQTZGQTs7Ozs7OztLQVNBLGtCQUFBLENBQW1CM3NJLEdBQW5CLENBQXdCQyxJQUF4QixDQUE4QixDQUM1QixXQUFheGhCLEtBQUtFLEtBQUwsQ0FBV0YsS0FBSzZGLE1BQUwsSUFBaUIyYixLQUFPRCxHQUFQLENBQWEsQ0FBOUIsQ0FBWCxDQUFiLENBQ0QsQ0FDRDs7Ozs7OztLQVVBLG9CQUFBLENBQXFCQSxHQUFyQixDQUEwQkMsSUFBMUIsQ0FBZ0MsQ0FDOUIsV0FBYXhoQixLQUFLNkYsTUFBTCxJQUFpQjJiLEtBQU9ELEdBQXhCLENBQWIsQ0FDRCxDQUNEOztLQUtBLDRCQUVBLFNBQVVpdEksS0FBVixDQUFpQjs7Ozs7O09BUWYsbUJBQUEsRUFBc0IsQ0FDcEIsU0FBQSxDQUVBLFlBQWNodEosVUFBVTFELE1BQVYsQ0FBbUIsQ0FBbkIsRUFBd0IwRCxVQUFVLENBQVYsSUFBaUIvRSxTQUF6QyxDQUFxRCtFLFVBQVUsQ0FBVixDQUFyRCxDQUFvRSxFQUFsRixDQUVBMnZJLGVBQWUsSUFBZixDQUFxQjJlLFVBQXJCLEVBRUExbEUsTUFBUWluRCwwQkFBMEIsSUFBMUIsQ0FBZ0NOLGlCQUFpQitlLFVBQWpCLEVBQTZCLzJKLElBQTdCLENBQWtDLElBQWxDLENBQXdDLFlBQXhDLENBQWhDLENBQVIsQ0FDQXF4RixNQUFNaHdDLFFBQU4sQ0FBaUIsa0JBQUEsRUFBakIsQ0FDQTs7Ozs7U0FPQWd3QyxNQUFNenVELE9BQU4sQ0FBZ0IsSUFBaEIsQ0FDQXl1RCxNQUFNMmxFLFVBQU4sQ0FBbUJ4MEgsUUFBUXcwSCxVQUFSLEdBQXVCdHpKLFNBQXZCLENBQW1DOCtCLFFBQVF3MEgsVUFBM0MsQ0FBd0QzbEUsTUFBTTRsRSxrQkFBTixDQUF5QnowSCxRQUFRMDBILE1BQWpDLENBQTNFLENBQ0E3bEUsTUFBTTJsRSxVQUFOLENBQWlCNTFKLElBQWpCLENBQXdCLHFCQUF4QixDQUNBaXdGLE1BQU0ybEUsVUFBTixDQUFpQjMySCxlQUFqQixDQUFtQyxLQUFuQyxDQUNBOzs7O1NBTUFneEQsTUFBTTFrRixJQUFOLENBQWF3cUosV0FBV0MsUUFBeEIsQ0FDQTs7Ozs7U0FPQS9sRSxNQUFNejhFLE9BQU4sQ0FBZ0IsQ0FBaEIsQ0FDQTs7Ozs7U0FPQXk4RSxNQUFNZ21FLFVBQU4sQ0FBbUJDLFVBQVUsR0FBVixDQUFlLEdBQWYsQ0FBbkIsQ0FDQSxZQUFBLENBQ0QsQ0FDRDs7OztPQU9BL2QsWUFBWXdkLFVBQVosQ0FBd0IsQ0FBQyxDQUN2Qmx5SixJQUFLLG9CQURrQjs7Ozs7U0FTdkI5QyxNQUFPLDJCQUFBLEVBQThCLENBQ25DLFNBQVcwRyxVQUFVMUQsTUFBVixDQUFtQixDQUFuQixFQUF3QjBELFVBQVUsQ0FBVixJQUFpQi9FLFNBQXpDLENBQXFEK0UsVUFBVSxDQUFWLENBQXJELENBQW9FLEVBQS9FLENBQ0EsV0FBYWs4QixLQUFPQSxJQUFwQixDQUNBLFNBQVcsZ0JBQUEsQ0FBaUJrMkQsT0FBUyxDQUExQixDQUFYLENBQ0EsT0FBUyxLQUFLbThELFVBQWQsQ0FDQSxLQUFBLENBQU9yL0ksQ0FBUCxDQUVBLElBQUt2UyxFQUFJLENBQVQsQ0FBWUEsRUFBSXkxRixNQUFoQixDQUF3QixFQUFFejFGLENBQTFCLENBQTZCLENBQzNCdVMsRUFBSTFRLEtBQUs2RixNQUFMLEVBQUosQ0FDQTJILEtBQUtyUCxFQUFJLENBQVQsRUFBY3VTLENBQWQsQ0FDQWxELEtBQUtyUCxFQUFJLENBQUosQ0FBUSxDQUFiLEVBQWtCdVMsQ0FBbEIsQ0FDQWxELEtBQUtyUCxFQUFJLENBQUosQ0FBUSxDQUFiLEVBQWtCdVMsQ0FBbEIsQ0FDRCxDQUVELEdBQUk0L0ksS0FBTyxJQUFYLENBQWlCLENBQ2ZBLEdBQUcxMUgsT0FBSCxHQUNELENBRUQwMUgsR0FBSyxlQUFBLENBQWdCOWlKLElBQWhCLENBQXNCa3dCLElBQXRCLENBQTRCQSxJQUE1QixDQUFrQ2c5QyxTQUFsQyxDQUE2Q08sU0FBN0MsQ0FBTCxDQUNBcTFFLEdBQUd4cUcsV0FBSCxDQUFpQixJQUFqQixDQUNBLEtBQUtpcUcsVUFBTCxDQUFrQk8sRUFBbEIsQ0FDQSxTQUFBLENBQ0QsQ0FDRDs7Ozs7Ozs7VUFoQ3NCLENBMENyQixDQUNEMXlKLElBQUssUUFESixDQUVEOUMsTUFBTyxlQUFBLENBQWdCdTVELFFBQWhCLENBQTBCaTZGLFdBQTFCLENBQXVDQyxZQUF2QyxDQUFxRC9zSCxLQUFyRCxDQUE0RGl3QyxXQUE1RCxDQUF5RSxDQUM5RSxTQUFXLEtBQUsvckUsSUFBaEIsQ0FDQSxZQUFjLEtBQUtpSSxPQUFuQixDQUNBLGVBQWlCLEtBQUt5aUosVUFBdEIsQ0FDQSxhQUFlLEtBQUtoMkcsUUFBTCxDQUFjL08sUUFBN0IsQ0FDQUEsU0FBUzQyRyxRQUFULENBQWtCbm5KLEtBQWxCLENBQTBCd3pKLFlBQVkzeUgsT0FBdEMsQ0FDQTBQLFNBQVMrN0csSUFBVCxDQUFjdHNKLEtBQWQsQ0FBc0JrRixLQUFLNkYsTUFBTCxFQUF0QixDQUNBd2xDLFNBQVN5bkcsTUFBVCxDQUFnQmg0SSxLQUFoQixDQUF3QixJQUF4QixDQUVBLEdBQUk2UyxRQUFVeWlKLFVBQVYsR0FBeUIsQ0FBekIsRUFBOEIxcUosT0FBU3dxSixXQUFXSyxhQUF0RCxDQUFxRSxDQUNuRWxsSCxTQUFTODFELE1BQVQsQ0FBZ0JybUcsS0FBaEIsQ0FBd0JrRixLQUFLNkYsTUFBTCxHQUFnQixJQUF4QyxDQUNBd2xDLFNBQVMxbUIsS0FBVCxDQUFlN3BCLEtBQWYsQ0FBdUIwMUosWUFBWSxDQUFDeHdKLEtBQUsrZixFQUFsQixDQUFzQi9mLEtBQUsrZixFQUEzQixDQUF2QixDQUNBc3JCLFNBQVNnOEcsS0FBVCxDQUFldnNKLEtBQWYsQ0FBdUIwMUosWUFBWSxDQUFDLEdBQWIsQ0FBa0IsR0FBbEIsQ0FBdkIsQ0FDQW5sSCxTQUFTaThHLEtBQVQsQ0FBZXhzSixLQUFmLENBQXVCMDFKLFlBQVksQ0FBQyxHQUFiLENBQWtCLEdBQWxCLENBQXZCLENBQ0FubEgsU0FBU2s4RyxXQUFULENBQXFCenNKLEtBQXJCLENBQTZCMDFKLFlBQVksR0FBWixDQUFpQixHQUFqQixDQUE3QixDQUNBbmxILFNBQVNtOEcsV0FBVCxDQUFxQjFzSixLQUFyQixDQUE2QjAxSixZQUFZLEdBQVosQ0FBaUIsR0FBakIsQ0FBN0IsQ0FDQSxLQUFLSixVQUFMLENBQWtCQyxVQUFVLEdBQVYsQ0FBZSxHQUFmLENBQWxCLENBQ0EsS0FBSzFpSixPQUFMLENBQWUsQ0FBZixDQUNELENBVEQsSUFTTyxDQUNMLEdBQUlBLFFBQVV5aUosVUFBVixDQUF1QkEsV0FBYSxDQUFwQyxFQUF5QzFxSixPQUFTd3FKLFdBQVdPLGFBQWpFLENBQWdGLENBQzlFcGxILFNBQVM4MUQsTUFBVCxDQUFnQnJtRyxLQUFoQixDQUF3QmtGLEtBQUs2RixNQUFMLEdBQWdCLElBQXhDLENBQ0F3bEMsU0FBUzFtQixLQUFULENBQWU3cEIsS0FBZixDQUF1QjAxSixZQUFZLENBQUN4d0osS0FBSytmLEVBQWxCLENBQXNCL2YsS0FBSytmLEVBQTNCLENBQXZCLENBQ0FzckIsU0FBU2s4RyxXQUFULENBQXFCenNKLEtBQXJCLENBQTZCMDFKLFlBQVksR0FBWixDQUFpQixHQUFqQixDQUE3QixDQUNBbmxILFNBQVNtOEcsV0FBVCxDQUFxQjFzSixLQUFyQixDQUE2QjAxSixZQUFZLEdBQVosQ0FBaUIsR0FBakIsQ0FBN0IsQ0FDQW5sSCxTQUFTZzhHLEtBQVQsQ0FBZXZzSixLQUFmLENBQXVCMDFKLFlBQVksQ0FBQyxHQUFiLENBQWtCLEdBQWxCLENBQXZCLENBQ0FubEgsU0FBU2k4RyxLQUFULENBQWV4c0osS0FBZixDQUF1QjAxSixZQUFZLENBQUMsR0FBYixDQUFrQixHQUFsQixDQUF2QixDQUNELENBUEQsSUFPTztFQUVMbmxILFNBQVN5bkcsTUFBVCxDQUFnQmg0SSxLQUFoQixDQUF3QixLQUF4QixDQUNELENBQ0YsQ0FFRCxFQUFFLEtBQUs2UyxPQUFQLENBQ0EwbUQsU0FBU3FCLE1BQVQsQ0FBZ0IsS0FBS2xCLEtBQXJCLENBQTRCLEtBQUtqL0IsTUFBakMsQ0FBeUMsS0FBSzY0SCxjQUFMLENBQXNCLElBQXRCLENBQTZCRyxZQUF0RSxFQUNELENBcENBLENBMUNxQixDQStFckIsQ0FDRDN3SixJQUFLLFlBREosQ0FFRGlFLElBQUssWUFBQSxFQUFlLENBQ2xCLFlBQVk4NUIsT0FBWixDQUNELENBQ0Q7Ozs7VUFNQWx0QixJQUFLLFlBQUEsQ0FBYTNULEtBQWIsQ0FBb0IsQ0FDdkIsS0FBSzZnQyxPQUFMLENBQWU3Z0MsS0FBZixDQUNBLEtBQUtzL0MsUUFBTCxDQUFjL08sUUFBZCxDQUF1Qjg3RyxRQUF2QixDQUFnQ3JzSixLQUFoQyxDQUF3Q0EsS0FBeEMsQ0FDRCxDQWRBLENBL0VxQixDQUF4QixFQWdHQTAySSxTQUFTc2UsVUFBVCxDQUFxQnRCLEtBQXJCLEVBRUEsaUJBQUEsQ0FDRCxDQS9KRCxDQStKRU4sSUEvSkYsQ0FGQSxDQWtLQTs7Ozs7OztLQVNBLGVBQWlCLENBQ2ZpQyxTQUFVLENBREssQ0FFZk0sY0FBZSxDQUZBLENBR2ZGLGNBQWUsQ0FIQSxDQUFqQixDQU1BOzs7S0FLQSw0QkFFQSxTQUFVL0IsS0FBVixDQUFpQjs7Ozs7Ozs7Ozs7T0FhZixtQkFBQSxDQUFvQmg2RixLQUFwQixDQUEyQmovQixNQUEzQixDQUFtQyxDQUNqQyxTQUFBLENBRUEsWUFBYy96QixVQUFVMUQsTUFBVixDQUFtQixDQUFuQixFQUF3QjBELFVBQVUsQ0FBVixJQUFpQi9FLFNBQXpDLENBQXFEK0UsVUFBVSxDQUFWLENBQXJELENBQW9FLEVBQWxGLENBRUEydkksZUFBZSxJQUFmLENBQXFCdWYsVUFBckIsRUFFQXRtRSxNQUFRaW5ELDBCQUEwQixJQUExQixDQUFnQ04saUJBQWlCMmYsVUFBakIsRUFBNkIzM0osSUFBN0IsQ0FBa0MsSUFBbEMsQ0FBd0MsWUFBeEMsQ0FBc0R5N0QsS0FBdEQsQ0FBNkRqL0IsTUFBN0QsQ0FBcUUsSUFBckUsQ0FBaEMsQ0FBUixDQUNBNjBELE1BQU1pa0UsU0FBTixDQUFrQixLQUFsQixDQUNBOzs7O1NBTUFqa0UsTUFBTXVtRSxTQUFOLENBQWtCLGFBQUEsQ0FBY3AxSCxPQUFkLENBQWxCLENBQ0E7Ozs7U0FNQTZ1RCxNQUFNa0YsZ0JBQU4sQ0FBeUIvekQsUUFBUSt6RCxnQkFBUixHQUE2Qjd5RixTQUE3QixDQUF5QzgrQixRQUFRK3pELGdCQUFqRCxDQUFvRSxJQUE3RixDQUNBOzs7O1NBTUFsRixNQUFNNVksVUFBTixDQUFtQmoyQyxRQUFRaTJDLFVBQVIsR0FBdUIvMEUsU0FBdkIsQ0FBbUM4K0IsUUFBUWkyQyxVQUEzQyxDQUF3RCxLQUEzRSxDQUNBOzs7Ozs7OztTQVVBNFksTUFBTTE3RSxLQUFOLENBQWM2c0IsUUFBUTdzQixLQUFSLEdBQWtCalMsU0FBbEIsQ0FBOEI4K0IsUUFBUTdzQixLQUF0QyxDQUE4QyxJQUE1RCxDQUNBLFlBQUEsQ0FDRCxDQUNEOzs7Ozs7OztPQVdBNGpJLFlBQVlvZSxVQUFaLENBQXdCLENBQUMsQ0FDdkI5eUosSUFBSyxRQURrQixDQUV2QjlDLE1BQU8sZUFBQSxDQUFnQnU1RCxRQUFoQixDQUEwQmk2RixXQUExQixDQUF1Q0MsWUFBdkMsQ0FBcUQvc0gsS0FBckQsQ0FBNERpd0MsV0FBNUQsQ0FBeUUsQ0FDOUUsVUFBWSxLQUFLamQsS0FBakIsQ0FDQSxpQkFBbUIsS0FBSzQ1RixjQUFMLENBQXNCLElBQXRCLENBQTZCRSxXQUFoRCxDQUNBLHFCQUF1Qjk1RixNQUFNODZCLGdCQUE3QixDQUVBLEdBQUksS0FBSzVnRixLQUFULENBQWdCLENBQ2QsS0FBS2lpSixTQUFMLENBQWV2QyxjQUFmLENBQWdDLEtBQUtBLGNBQXJDLENBQ0EsS0FBS3VDLFNBQUwsQ0FBZWo3RixNQUFmLENBQXNCckIsUUFBdEIsQ0FBZ0NpNkYsV0FBaEMsRUFDRCxDQUhELFFBR1csS0FBSzk4RSxVQUFULENBQXFCLENBQzFCbmQsU0FBU2laLGVBQVQsQ0FBeUJ5TCxZQUF6QixFQUNBMWtCLFNBQVNtZCxVQUFULEdBQ0QsQ0FFRGhkLE1BQU04NkIsZ0JBQU4sQ0FBeUIsS0FBS0EsZ0JBQTlCLENBQ0FqN0IsU0FBU3FCLE1BQVQsQ0FBZ0JsQixLQUFoQixDQUF1QixLQUFLai9CLE1BQTVCLENBQW9Dd2pELFlBQXBDLEVBQ0F2a0IsTUFBTTg2QixnQkFBTixDQUF5QkEsZ0JBQXpCLENBQ0QsQ0FsQnNCLENBQUQsQ0FBeEIsRUFxQkFraUQsU0FBU2tmLFVBQVQsQ0FBcUJsQyxLQUFyQixFQUVBLGlCQUFBLENBQ0QsQ0EzRkQsQ0EyRkVOLElBM0ZGLENBRkEsQ0ErRkE7Ozs7Ozs7O0tBVUEsY0FBQSxDQUFlcHpKLEtBQWYsQ0FBc0IrSixHQUF0QixDQUEyQkMsR0FBM0IsQ0FBZ0MsQ0FDOUIsWUFBWUEsR0FBTCxDQUFTRCxHQUFULENBQWM3RSxLQUFLNkUsR0FBTCxDQUFTQyxHQUFULENBQWNoSyxLQUFkLENBQWQsQ0FBUCxDQUNELENBQ0Q7O0tBS0EsNkJBRUEsU0FBVTB6SixLQUFWLENBQWlCOzs7Ozs7Ozs7Ozs7Ozs7OztPQW1CZixvQkFBQSxDQUFxQmg2RixLQUFyQixDQUE0QmovQixNQUE1QixDQUFvQ3E3SCxXQUFwQyxDQUFpRCxDQUMvQyxTQUFBLENBRUEsWUFBY3B2SixVQUFVMUQsTUFBVixDQUFtQixDQUFuQixFQUF3QjBELFVBQVUsQ0FBVixJQUFpQi9FLFNBQXpDLENBQXFEK0UsVUFBVSxDQUFWLENBQXJELENBQW9FLEVBQWxGLENBRUEydkksZUFBZSxJQUFmLENBQXFCMGYsV0FBckIsRUFFQXptRSxNQUFRaW5ELDBCQUEwQixJQUExQixDQUFnQ04saUJBQWlCOGYsV0FBakIsRUFBOEI5M0osSUFBOUIsQ0FBbUMsSUFBbkMsQ0FBeUMsYUFBekMsQ0FBaEMsQ0FBUixDQUNBOzs7OztTQU9BcXhGLE1BQU0wbUUsVUFBTixDQUFtQixTQUFBLEVBQW5CLENBQ0E7Ozs7O1NBT0ExbUUsTUFBTTJtRSxTQUFOLENBQWtCdjhGLEtBQWxCLENBQ0E7Ozs7O1NBT0E0MUIsTUFBTTRtRSxVQUFOLENBQW1CejdILE1BQW5CLENBQ0E7Ozs7O1NBT0E2MEQsTUFBTXNrRSxhQUFOLENBQXNCLHFCQUFBLENBQXNCLENBQXRCLENBQXlCLENBQXpCLENBQTRCLENBQ2hEdjJILFVBQVdXLFlBRHFDLENBRWhEWixVQUFXWSxZQUZxQyxDQUdoRCtDLGNBQWUsS0FIaUMsQ0FJaERELFlBQWEsS0FKbUMsQ0FBNUIsQ0FBdEIsQ0FNQXd1RCxNQUFNc2tFLGFBQU4sQ0FBb0IveUgsT0FBcEIsQ0FBNEJ4aEMsSUFBNUIsQ0FBbUMsaUJBQW5DLENBQ0Fpd0YsTUFBTXNrRSxhQUFOLENBQW9CL3lILE9BQXBCLENBQTRCdkMsZUFBNUIsQ0FBOEMsS0FBOUMsQ0FDQTs7Ozs7U0FPQWd4RCxNQUFNdWtFLGFBQU4sQ0FBc0J2a0UsTUFBTXNrRSxhQUFOLENBQW9CNXJJLEtBQXBCLEVBQXRCLENBQ0FzbkUsTUFBTXVrRSxhQUFOLENBQW9CaHpILE9BQXBCLENBQTRCeGhDLElBQTVCLENBQW1DLGlCQUFuQyxDQUNBOzs7OztTQU9BaXdGLE1BQU02bUUsZ0JBQU4sQ0FBeUIscUJBQUEsQ0FBc0IsQ0FBdEIsQ0FBeUIsQ0FBekIsQ0FBNEIsQ0FDbkQ5NEgsVUFBV1csWUFEd0MsQ0FFbkRaLFVBQVdZLFlBRndDLENBQTVCLENBQXpCLENBSUFzeEQsTUFBTTZtRSxnQkFBTixDQUF1QnQxSCxPQUF2QixDQUErQnhoQyxJQUEvQixDQUFzQyxjQUF0QyxDQUNBaXdGLE1BQU02bUUsZ0JBQU4sQ0FBdUJ0MUgsT0FBdkIsQ0FBK0J2QyxlQUEvQixDQUFpRCxLQUFqRCxDQUNBOzs7OztTQU9BZ3hELE1BQU04bUUsZUFBTixDQUF3QixjQUFBLENBQWU5bUUsTUFBTTBtRSxVQUFyQixDQUFpQzFtRSxNQUFNNG1FLFVBQXZDLENBQW1ELENBQ3pFcDhGLFdBQVksU0FBQSxDQUFVLFFBQVYsQ0FENkQsQ0FBbkQsQ0FBeEIsQ0FHQTs7Ozs7U0FPQXcxQixNQUFNK21FLGNBQU4sQ0FBdUIsY0FBQSxDQUFlL21FLE1BQU0ybUUsU0FBckIsQ0FBZ0MzbUUsTUFBTTRtRSxVQUF0QyxDQUFrRCxDQUN2RTFoRSxpQkFBa0IscUJBQUEsQ0FBc0IsQ0FDdENqakQsTUFBTyxRQUQrQixDQUF0QixDQURxRCxDQUFsRCxDQUF2QixDQUtBKzlDLE1BQU0rbUUsY0FBTixDQUFxQnppSixLQUFyQixDQUE2QixLQUE3QixDQUNBOzs7OztTQU9BMDdFLE1BQU0ra0UsUUFBTixDQUFpQixZQUFBLENBQWE1ekgsT0FBYixDQUFqQixDQUNBOzs7O1NBTUE2dUQsTUFBTXdtRSxXQUFOLENBQW9CQSxXQUFwQixDQUNBOzs7OztTQU9BeG1FLE1BQU1nbkUsY0FBTixDQUF1QixXQUFBLEVBQXZCLENBQ0E7Ozs7O1NBT0FobkUsTUFBTWluRSxlQUFOLENBQXdCLG1CQUFBLENBQW9COTFILE9BQXBCLENBQXhCLENBQ0E2dUQsTUFBTWluRSxlQUFOLENBQXNCaG1ILFFBQXRCLENBQStCNDhHLGFBQS9CLENBQTZDbnRKLEtBQTdDLENBQXFEc3ZGLE1BQU1nbkUsY0FBM0QsQ0FDQWhuRSxNQUFNc2dFLE9BQU4sQ0FBZ0JudkgsUUFBUW12SCxPQUF4QixDQUNBOzs7OztTQU9BdGdFLE1BQU1nbEUsZUFBTixDQUF3QixtQkFBQSxDQUFvQjd6SCxRQUFRNG5ILFVBQVIsR0FBdUIxbUosU0FBdkIsQ0FBbUM4K0IsUUFBUTRuSCxVQUEzQyxDQUF3RCxJQUE1RSxDQUF4QixDQUNBLzRELE1BQU03Z0IsU0FBTixDQUFrQmh1QyxRQUFRZ3VDLFNBQTFCLENBQ0EsWUFBQSxDQUNELENBQ0Q7Ozs7T0FPQStvRSxZQUFZdWUsV0FBWixDQUF5QixDQUFDLENBQ3hCanpKLElBQUssUUFEbUI7Ozs7Ozs7O1NBWXhCOUMsTUFBTyxlQUFBLENBQWdCdTVELFFBQWhCLENBQTBCaTZGLFdBQTFCLENBQXVDQyxZQUF2QyxDQUFxRC9zSCxLQUFyRCxDQUE0RGl3QyxXQUE1RCxDQUF5RSxDQUM5RSxVQUFZLEtBQUtqZCxLQUFqQixDQUNBLFdBQWEsS0FBS2ovQixNQUFsQixDQUNBLGNBQWdCLEtBQUt3N0gsU0FBckIsQ0FDQSxnQkFBa0IsS0FBS0gsV0FBdkIsQ0FDQSxtQkFBcUIsS0FBS1EsY0FBMUIsQ0FDQSxvQkFBc0IsS0FBS0MsZUFBM0IsQ0FDQSxvQkFBc0IsS0FBS2pDLGVBQTNCLENBQ0EscUJBQXVCLEtBQUs2QixnQkFBNUIsQ0FDQSxrQkFBb0IsS0FBS3ZDLGFBQXpCLENBQ0Esa0JBQW9CLEtBQUtDLGFBQXpCLENBQ0EsY0FBQSxDQUFnQngvSSxNQUFoQixDQUF3QjtFQUV4QmlpSixlQUFlcnVJLElBQWYsQ0FBb0I2dEksWUFBWTdoSSxRQUFoQyxFQUEwQ3VHLE9BQTFDLENBQWtELEtBQUswN0gsVUFBdkQsRUFDQUksZUFBZTFnSixDQUFmLENBQW1COFAsTUFBTSxDQUFDNHdJLGVBQWUxZ0osQ0FBZixDQUFtQixHQUFwQixFQUEyQixHQUFqQyxDQUFzQyxHQUF0QyxDQUEyQyxHQUEzQyxDQUFuQixDQUNBMGdKLGVBQWVsd0ksQ0FBZixDQUFtQlYsTUFBTSxDQUFDNHdJLGVBQWVsd0ksQ0FBZixDQUFtQixHQUFwQixFQUEyQixHQUFqQyxDQUFzQyxHQUF0QyxDQUEyQyxHQUEzQyxDQUFuQixDQUNBL1IsT0FBU3loSixZQUFZemhKLE1BQXJCLENBQ0F1bEQsV0FBYXE4RixVQUFVcjhGLFVBQXZCLENBQ0FxOEYsVUFBVXI4RixVQUFWLENBQXVCLElBQXZCLENBQ0EsS0FBS284RixVQUFMLENBQWdCOXRJLEdBQWhCLENBQW9CNHRJLFdBQXBCLEVBQ0E7eUVBR0EsS0FBS00sZUFBTCxDQUFxQng3RixNQUFyQixDQUE0QnJCLFFBQTVCLENBQXNDNDhGLGdCQUF0QyxFQUNBLEtBQUtFLGNBQUwsQ0FBb0J6N0YsTUFBcEIsQ0FBMkJyQixRQUEzQixDQUFxQzQ4RixnQkFBckMsRUFFQSxHQUFJOWhKLFNBQVcsSUFBZixDQUFxQixDQUNuQkEsT0FBTzZULEdBQVAsQ0FBVzR0SSxXQUFYLEVBQ0QsQ0FFREcsVUFBVXI4RixVQUFWLENBQXVCQSxVQUF2QixDQUFtQztFQUVuQyxLQUFLeTZGLFFBQUwsQ0FBY3o1RixNQUFkLENBQXFCckIsUUFBckIsQ0FBK0IsS0FBSzQ4RixnQkFBcEMsQ0FBc0R2QyxhQUF0RCxFQUFzRTtFQUV0RSxLQUFLdDBHLFFBQUwsQ0FBZ0JpM0csZUFBaEIsQ0FDQUEsZ0JBQWdCaG1ILFFBQWhCLENBQXlCNDJHLFFBQXpCLENBQWtDbm5KLEtBQWxDLENBQTBDNHpKLGNBQWMveUgsT0FBeEQsQ0FDQTA0QixTQUFTcUIsTUFBVCxDQUFnQmxCLEtBQWhCLENBQXVCai9CLE1BQXZCLENBQStCbzVILGFBQS9CLEVBRUEsR0FBSSxLQUFLVyxLQUFULENBQWdCO0VBRWQsS0FBS2wxRyxRQUFMLENBQWdCZzFHLGVBQWhCLENBQ0FBLGdCQUFnQi9qSCxRQUFoQixDQUF5QnUzRyxRQUF6QixDQUFrQzluSixLQUFsQyxDQUEwQ3d6SixZQUFZM3lILE9BQXRELENBQ0F5ekgsZ0JBQWdCL2pILFFBQWhCLENBQXlCdzNHLFFBQXpCLENBQWtDL25KLEtBQWxDLENBQTBDNnpKLGNBQWNoekgsT0FBeEQsQ0FDQTA0QixTQUFTcUIsTUFBVCxDQUFnQmxCLEtBQWhCLENBQXVCai9CLE1BQXZCLENBQStCLEtBQUs2NEgsY0FBTCxDQUFzQixJQUF0QixDQUE2QkcsWUFBNUQsRUFDRCxDQUNGLENBQ0Q7Ozs7O1VBMUR1QixDQWlFdEIsQ0FDRDN3SixJQUFLLFNBREosQ0FFRDlDLE1BQU8sZ0JBQUEsQ0FBaUJvL0IsS0FBakIsQ0FBd0JDLE1BQXhCLENBQWdDLENBQ3JDLEtBQUsrMkgsZUFBTCxDQUFxQmoxSCxPQUFyQixDQUE2Qi9CLEtBQTdCLENBQW9DQyxNQUFwQyxFQUNBLEtBQUtnM0gsY0FBTCxDQUFvQmwxSCxPQUFwQixDQUE0Qi9CLEtBQTVCLENBQW1DQyxNQUFuQyxFQUNBLEtBQUtnMUgsUUFBTCxDQUFjbHpILE9BQWQsQ0FBc0IvQixLQUF0QixDQUE2QkMsTUFBN0IsRUFDQUQsTUFBUSxLQUFLaTFILFFBQUwsQ0FBY2oxSCxLQUF0QixDQUNBQyxPQUFTLEtBQUtnMUgsUUFBTCxDQUFjaDFILE1BQXZCLENBQ0EsS0FBSzgySCxnQkFBTCxDQUFzQmgxSCxPQUF0QixDQUE4Qi9CLEtBQTlCLENBQXFDQyxNQUFyQyxFQUNBLEtBQUt1MEgsYUFBTCxDQUFtQnp5SCxPQUFuQixDQUEyQi9CLEtBQTNCLENBQWtDQyxNQUFsQyxFQUNBLEtBQUt3MEgsYUFBTCxDQUFtQjF5SCxPQUFuQixDQUEyQi9CLEtBQTNCLENBQWtDQyxNQUFsQyxFQUNELENBQ0Q7Ozs7O1VBN0V1QixDQW9GdEIsQ0FDRHY4QixJQUFLLFlBREosQ0FFRDlDLE1BQU8sbUJBQUEsQ0FBb0J1NUQsUUFBcEIsQ0FBOEJsdkMsS0FBOUIsQ0FBcUMsQ0FDMUMsS0FBSytySSxlQUFMLENBQXFCM0IsVUFBckIsQ0FBZ0NsN0YsUUFBaEMsQ0FBMENsdkMsS0FBMUMsRUFDQSxLQUFLZ3NJLGNBQUwsQ0FBb0I1QixVQUFwQixDQUErQmw3RixRQUEvQixDQUF5Q2x2QyxLQUF6QyxFQUNBLEtBQUtncUksUUFBTCxDQUFjSSxVQUFkLENBQXlCbDdGLFFBQXpCLENBQW1DbHZDLEtBQW5DLEVBRUEsR0FBSSxDQUFDQSxLQUFMLENBQVksQ0FDVixLQUFLOHJJLGdCQUFMLENBQXNCdDFILE9BQXRCLENBQThCdkQsTUFBOUIsQ0FBdUNzaUQsU0FBdkMsQ0FDQSxLQUFLZzBFLGFBQUwsQ0FBbUIveUgsT0FBbkIsQ0FBMkJ2RCxNQUEzQixDQUFvQ3NpRCxTQUFwQyxDQUNBLEtBQUtpMEUsYUFBTCxDQUFtQmh6SCxPQUFuQixDQUEyQnZELE1BQTNCLENBQW9Dc2lELFNBQXBDLENBQ0QsQ0FDRixDQVpBLENBcEZzQixDQWlHdEIsQ0FDRDk4RSxJQUFLLGlCQURKLENBRURpRSxJQUFLLFlBQUEsRUFBZSxDQUNsQixZQUFZc3RKLFFBQUwsQ0FBY1AsZUFBckIsQ0FDRCxDQUNEOzs7O1VBTUFuZ0osSUFBSyxZQUFBLEVBQWUsQ0FDbEIsVUFBWWpOLFVBQVUxRCxNQUFWLENBQW1CLENBQW5CLEVBQXdCMEQsVUFBVSxDQUFWLElBQWlCL0UsU0FBekMsQ0FBcUQrRSxVQUFVLENBQVYsQ0FBckQsQ0FBb0UsR0FBaEYsQ0FDQSxLQUFLMnRKLFFBQUwsQ0FBY1AsZUFBZCxDQUFnQzl6SixLQUFoQyxDQUNELENBQ0Q7Ozs7VUFoSHVCLENBc0h0QixDQUNEOEMsSUFBSyxZQURKLENBRURpRSxJQUFLLFlBQUEsRUFBZSxDQUNsQixZQUFZc3RKLFFBQUwsQ0FBY3hMLFVBQXJCLENBQ0QsQ0FDRDs7VUFJQWwxSSxJQUFLLFlBQUEsRUFBZSxDQUNsQixVQUFZak4sVUFBVTFELE1BQVYsQ0FBbUIsQ0FBbkIsRUFBd0IwRCxVQUFVLENBQVYsSUFBaUIvRSxTQUF6QyxDQUFxRCtFLFVBQVUsQ0FBVixDQUFyRCxDQUFvRW9pSixXQUFXQyxLQUEzRixDQUNBLEtBQUtzTCxRQUFMLENBQWN4TCxVQUFkLENBQTJCN29KLEtBQTNCLENBQ0QsQ0FDRDs7OztVQW5JdUIsQ0F5SXRCLENBQ0Q4QyxJQUFLLFdBREosQ0FFRGlFLElBQUssWUFBQSxFQUFlLENBQ2xCLFlBQVl1dEosZUFBTCxDQUFxQi9qSCxRQUFyQixDQUE4QjAzRyxRQUE5QixDQUF1Q2pvSixLQUE5QyxDQUNELENBQ0Q7O1VBSUEyVCxJQUFLLFlBQUEsRUFBZSxDQUNsQixVQUFZak4sVUFBVTFELE1BQVYsQ0FBbUIsQ0FBbkIsRUFBd0IwRCxVQUFVLENBQVYsSUFBaUIvRSxTQUF6QyxDQUFxRCtFLFVBQVUsQ0FBVixDQUFyRCxDQUFvRSxHQUFoRixDQUNBLEtBQUs0dEosZUFBTCxDQUFxQi9qSCxRQUFyQixDQUE4QjAzRyxRQUE5QixDQUF1Q2pvSixLQUF2QyxDQUErQ0EsS0FBL0MsQ0FDRCxDQUNEOzs7O1VBdEp1QixDQTRKdEIsQ0FDRDhDLElBQUssU0FESixDQUVEaUUsSUFBSyxZQUFBLEVBQWUsQ0FDbEIsY0FBYzBxQyxRQUFQLENBQWdCLEtBQUs4a0gsZUFBTCxDQUFxQi9rRyxPQUFyQixDQUE2QjA3RixlQUE3QyxDQUFQLENBQ0QsQ0FDRDs7Ozs7VUFPQXY1SSxJQUFLLFlBQUEsRUFBZSxDQUNsQixVQUFZak4sVUFBVTFELE1BQVYsQ0FBbUIsQ0FBbkIsRUFBd0IwRCxVQUFVLENBQVYsSUFBaUIvRSxTQUF6QyxDQUFxRCtFLFVBQVUsQ0FBVixDQUFyRCxDQUFvRSxFQUFoRixDQUNBMUcsTUFBUWtGLEtBQUtFLEtBQUwsQ0FBV3BGLEtBQVgsQ0FBUixDQUNBLEtBQUt1MkosZUFBTCxDQUFxQi9rRyxPQUFyQixDQUE2Qnk3RixpQkFBN0IsQ0FBaURqdEosTUFBTXNrSixPQUFOLENBQWMsQ0FBZCxDQUFqRCxDQUNBLEtBQUtpUyxlQUFMLENBQXFCL2tHLE9BQXJCLENBQTZCMDdGLGVBQTdCLENBQStDbHRKLE1BQU1za0osT0FBTixDQUFjLENBQWQsQ0FBL0MsQ0FDQSxLQUFLaVMsZUFBTCxDQUFxQnZyRyxXQUFyQixDQUFtQyxJQUFuQyxDQUNELENBQ0Q7Ozs7VUEvS3VCLENBcUx0QixDQUNEbG9ELElBQUssV0FESixDQUVEaUUsSUFBSyxZQUFBLEVBQWUsQ0FDbEIsWUFBWXd2SixlQUFMLENBQXFCMW1HLFNBQTVCLENBQ0QsQ0FDRDs7OztVQU1BbDhDLElBQUssWUFBQSxDQUFhM1QsS0FBYixDQUFvQixDQUN2QixHQUFJLEtBQUs2dkQsU0FBTCxHQUFtQjd2RCxLQUF2QixDQUE4QixDQUM1QixLQUFLdTJKLGVBQUwsQ0FBcUIxbUcsU0FBckIsQ0FBaUM3dkQsS0FBakMsQ0FDQSxLQUFLdTJKLGVBQUwsQ0FBcUJ2ckcsV0FBckIsQ0FBbUMsSUFBbkMsQ0FDRCxDQUNGLENBQ0Q7Ozs7VUF0TXVCLENBNE10QixDQUNEbG9ELElBQUssT0FESixDQUVEaUUsSUFBSyxZQUFBLEVBQWUsQ0FDbEIsWUFBWXdzSixTQUFaLENBQ0QsQ0FDRDs7Ozs7OztVQVNBNS9JLElBQUssWUFBQSxDQUFhM1QsS0FBYixDQUFvQixDQUN2QixLQUFLdXpKLFNBQUwsQ0FBaUJ2ekosS0FBakIsQ0FDRCxDQUNEOzs7O1VBN051QixDQW1PdEIsQ0FDRDhDLElBQUssU0FESixDQUVEaUUsSUFBSyxZQUFBLEVBQWUsQ0FDbEIsWUFBWThzSixhQUFMLENBQW1CaHpILE9BQTFCLENBQ0QsQ0FKQSxDQW5Pc0IsQ0FBekIsRUEwT0E2MUcsU0FBU3FmLFdBQVQsQ0FBc0JyQyxLQUF0QixFQUVBLGtCQUFBLENBQ0QsQ0EvWUQsQ0ErWUVOLElBL1lGLENBRkEsQ0FtWkE7O0tBSUEsMEJBRUEsU0FBVU0sS0FBVixDQUFpQjs7Ozs7T0FPZixpQkFBQSxDQUFrQmg2RixLQUFsQixDQUF5QmovQixNQUF6QixDQUFpQyxDQUMvQixTQUFBLENBRUE0N0csZUFBZSxJQUFmLENBQXFCbWdCLFFBQXJCLEVBRUFsbkUsTUFBUWluRCwwQkFBMEIsSUFBMUIsQ0FBZ0NOLGlCQUFpQnVnQixRQUFqQixFQUEyQnY0SixJQUEzQixDQUFnQyxJQUFoQyxDQUFzQyxVQUF0QyxDQUFrRHk3RCxLQUFsRCxDQUF5RGovQixNQUF6RCxDQUFpRSxJQUFqRSxDQUFoQyxDQUFSLENBQ0E2MEQsTUFBTWlrRSxTQUFOLENBQWtCLEtBQWxCLENBQ0E7Ozs7U0FNQWprRSxNQUFNLzJELE9BQU4sQ0FBZ0IsS0FBaEIsQ0FDQTs7OztTQU1BKzJELE1BQU14WCxZQUFOLENBQXFCLElBQXJCLENBQ0EsWUFBQSxDQUNELENBQ0Q7Ozs7Ozs7O09BV0EwL0QsWUFBWWdmLFFBQVosQ0FBc0IsQ0FBQyxDQUNyQjF6SixJQUFLLFFBRGdCLENBRXJCOUMsTUFBTyxlQUFBLENBQWdCdTVELFFBQWhCLENBQTBCaTZGLFdBQTFCLENBQXVDQyxZQUF2QyxDQUFxRC9zSCxLQUFyRCxDQUE0RGl3QyxXQUE1RCxDQUF5RSxDQUM5RSxZQUFjcGQsU0FBUzM3RCxPQUF2QixDQUNBLFVBQVkyN0QsU0FBU3g0RCxLQUFyQixDQUNBLFVBQVksS0FBSzI0RCxLQUFqQixDQUNBLFdBQWEsS0FBS2ovQixNQUFsQixDQUNBLGVBQWlCLEtBQUtsQyxPQUFMLENBQWUsQ0FBZixDQUFtQixDQUFwQyxDQUNBLGVBQWlCLEVBQUlrK0gsVUFBckIsQ0FBaUM7RUFFakMxMUosTUFBTTA1QyxPQUFOLENBQWNsSixLQUFkLENBQW9CNmpDLE9BQXBCLENBQTRCLEtBQTVCLEVBQ0FyMEUsTUFBTTA1QyxPQUFOLENBQWN0QyxLQUFkLENBQW9CaTlCLE9BQXBCLENBQTRCLEtBQTVCLEVBQW9DO0VBRXBDcjBFLE1BQU0wNUMsT0FBTixDQUFjbEosS0FBZCxDQUFvQmtrQyxTQUFwQixDQUE4QixJQUE5QixFQUNBMTBFLE1BQU0wNUMsT0FBTixDQUFjdEMsS0FBZCxDQUFvQnM5QixTQUFwQixDQUE4QixJQUE5QixFQUFxQztFQUVyQzEwRSxNQUFNMDVDLE9BQU4sQ0FBY205QixPQUFkLENBQXNCOUYsT0FBdEIsQ0FBOEIsSUFBOUIsRUFDQS93RSxNQUFNMDVDLE9BQU4sQ0FBY205QixPQUFkLENBQXNCUixLQUF0QixDQUE0Qng1RSxRQUFRdTdJLE9BQXBDLENBQTZDdjdJLFFBQVF1N0ksT0FBckQsQ0FBOER2N0ksUUFBUXU3SSxPQUF0RSxFQUNBcDRJLE1BQU0wNUMsT0FBTixDQUFjbTlCLE9BQWQsQ0FBc0I3QixPQUF0QixDQUE4Qm40RSxRQUFRczRFLE1BQXRDLENBQThDdWdGLFVBQTlDLENBQTBELFVBQTFELEVBQ0ExMUosTUFBTTA1QyxPQUFOLENBQWNtOUIsT0FBZCxDQUFzQi9kLFFBQXRCLENBQStCNjhGLFVBQS9CLEVBQTRDO0VBRTVDLEdBQUksS0FBSzUrRSxZQUFULENBQXVCLENBQ3JCLEdBQUksS0FBS3c3RSxjQUFULENBQXlCLENBQ3ZCLzVGLFNBQVNpWixlQUFULENBQXlCLElBQXpCLEVBQ0FqWixTQUFTdWUsWUFBVCxHQUNELENBSEQsSUFHTyxDQUNMdmUsU0FBU2laLGVBQVQsQ0FBeUJnaEYsV0FBekIsRUFDQWo2RixTQUFTdWUsWUFBVCxHQUNBdmUsU0FBU2laLGVBQVQsQ0FBeUJpaEYsWUFBekIsRUFDQWw2RixTQUFTdWUsWUFBVCxHQUNELENBQ0YsQ0FBQztFQUdGLEdBQUksS0FBS3c3RSxjQUFULENBQXlCLENBQ3ZCLzVGLFNBQVNxQixNQUFULENBQWdCbEIsS0FBaEIsQ0FBdUJqL0IsTUFBdkIsQ0FBK0IsSUFBL0IsRUFDRCxDQUZELElBRU8sQ0FDTDgrQixTQUFTcUIsTUFBVCxDQUFnQmxCLEtBQWhCLENBQXVCai9CLE1BQXZCLENBQStCKzRILFdBQS9CLEVBQ0FqNkYsU0FBU3FCLE1BQVQsQ0FBZ0JsQixLQUFoQixDQUF1QmovQixNQUF2QixDQUErQmc1SCxZQUEvQixFQUNELENBQUM7RUFHRjF5SixNQUFNMDVDLE9BQU4sQ0FBY2xKLEtBQWQsQ0FBb0Jra0MsU0FBcEIsQ0FBOEIsS0FBOUIsRUFDQTEwRSxNQUFNMDVDLE9BQU4sQ0FBY3RDLEtBQWQsQ0FBb0JzOUIsU0FBcEIsQ0FBOEIsS0FBOUIsRUFBc0M7RUFFdEMxMEUsTUFBTTA1QyxPQUFOLENBQWNtOUIsT0FBZCxDQUFzQjdCLE9BQXRCLENBQThCbjRFLFFBQVF5NEUsS0FBdEMsQ0FBNkMsQ0FBN0MsQ0FBZ0QsVUFBaEQsRUFDQXQxRSxNQUFNMDVDLE9BQU4sQ0FBY205QixPQUFkLENBQXNCUixLQUF0QixDQUE0Qng1RSxRQUFRKzRKLElBQXBDLENBQTBDLzRKLFFBQVErNEosSUFBbEQsQ0FBd0QvNEosUUFBUSs0SixJQUFoRSxFQUNELENBL0NvQixDQUFELENBQXRCLEVBa0RBamdCLFNBQVM4ZixRQUFULENBQW1COUMsS0FBbkIsRUFFQSxlQUFBLENBQ0QsQ0E5RkQsQ0E4RkVOLElBOUZGLENBRkEsQ0FrR0E7Ozs7S0FNQSw0QkFFQSxTQUFVTSxLQUFWLENBQWlCOzs7OztPQU9mLG1CQUFBLENBQW9CcDBHLFFBQXBCLENBQThCLENBQzVCLFNBQUEsQ0FFQSxjQUFnQjU0QyxVQUFVMUQsTUFBVixDQUFtQixDQUFuQixFQUF3QjBELFVBQVUsQ0FBVixJQUFpQi9FLFNBQXpDLENBQXFEK0UsVUFBVSxDQUFWLENBQXJELENBQW9FLFVBQXBGLENBRUEydkksZUFBZSxJQUFmLENBQXFCdWdCLFVBQXJCLEVBRUF0bkUsTUFBUWluRCwwQkFBMEIsSUFBMUIsQ0FBZ0NOLGlCQUFpQjJnQixVQUFqQixFQUE2QjM0SixJQUE3QixDQUFrQyxJQUFsQyxDQUF3QyxZQUF4QyxDQUFoQyxDQUFSLENBQ0FxeEYsTUFBTWh3QyxRQUFOLENBQWlCQSxRQUFqQixDQUNBOzs7O1NBTUFnd0MsTUFBTXVuRSxTQUFOLENBQWtCQSxTQUFsQixDQUNBLFlBQUEsQ0FDRCxDQUNEOzs7Ozs7OztPQVdBcmYsWUFBWW9mLFVBQVosQ0FBd0IsQ0FBQyxDQUN2Qjl6SixJQUFLLFFBRGtCLENBRXZCOUMsTUFBTyxlQUFBLENBQWdCdTVELFFBQWhCLENBQTBCaTZGLFdBQTFCLENBQXVDQyxZQUF2QyxDQUFxRC9zSCxLQUFyRCxDQUE0RGl3QyxXQUE1RCxDQUF5RSxDQUM5RSxHQUFJLEtBQUtyM0IsUUFBTCxDQUFjL08sUUFBZCxDQUF1QixLQUFLc21ILFNBQTVCLElBQTJDbDFKLFNBQS9DLENBQTBELENBQ3hELEtBQUsyOUMsUUFBTCxDQUFjL08sUUFBZCxDQUF1QixLQUFLc21ILFNBQTVCLEVBQXVDNzJKLEtBQXZDLENBQStDd3pKLFlBQVkzeUgsT0FBM0QsQ0FDRCxDQUVEMDRCLFNBQVNxQixNQUFULENBQWdCLEtBQUtsQixLQUFyQixDQUE0QixLQUFLai9CLE1BQWpDLENBQXlDLEtBQUs2NEgsY0FBTCxDQUFzQixJQUF0QixDQUE2QkcsWUFBdEUsRUFDRCxDQVJzQixDQUFELENBQXhCLEVBV0EvYyxTQUFTa2dCLFVBQVQsQ0FBcUJsRCxLQUFyQixFQUVBLGlCQUFBLENBQ0QsQ0FsREQsQ0FrREVOLElBbERGLENBRkEsQ0FzREE7O0tBSUEsNkJBRUEsU0FBVU0sS0FBVixDQUFpQjs7Ozs7Ozs7T0FVZixvQkFBQSxDQUFxQmg2RixLQUFyQixDQUE0QmovQixNQUE1QixDQUFvQyxDQUNsQyxTQUFBLENBRUEsWUFBYy96QixVQUFVMUQsTUFBVixDQUFtQixDQUFuQixFQUF3QjBELFVBQVUsQ0FBVixJQUFpQi9FLFNBQXpDLENBQXFEK0UsVUFBVSxDQUFWLENBQXJELENBQW9FLEVBQWxGLENBRUEydkksZUFBZSxJQUFmLENBQXFCeWdCLFdBQXJCLEVBRUF4bkUsTUFBUWluRCwwQkFBMEIsSUFBMUIsQ0FBZ0NOLGlCQUFpQjZnQixXQUFqQixFQUE4Qjc0SixJQUE5QixDQUFtQyxJQUFuQyxDQUF5QyxhQUF6QyxDQUFoQyxDQUFSLENBQ0E7Ozs7O1NBT0FxeEYsTUFBTTJtRSxTQUFOLENBQWtCdjhGLEtBQWxCLENBQ0E7Ozs7O1NBT0E0MUIsTUFBTTRtRSxVQUFOLENBQW1CejdILE1BQW5CLENBQ0E7Ozs7O1NBT0E2MEQsTUFBTXluRSxpQkFBTixDQUEwQixxQkFBQSxDQUFzQixDQUF0QixDQUF5QixDQUF6QixDQUE0QixDQUNwRDE1SCxVQUFXVyxZQUR5QyxDQUVwRFosVUFBV1ksWUFGeUMsQ0FBNUIsQ0FBMUIsQ0FJQXN4RCxNQUFNeW5FLGlCQUFOLENBQXdCbDJILE9BQXhCLENBQWdDeGhDLElBQWhDLENBQXVDLGVBQXZDLENBQ0Fpd0YsTUFBTXluRSxpQkFBTixDQUF3QmwySCxPQUF4QixDQUFnQ3ZDLGVBQWhDLENBQWtELEtBQWxELENBQ0E7Ozs7O1NBT0FneEQsTUFBTTZtRSxnQkFBTixDQUF5QjdtRSxNQUFNeW5FLGlCQUFOLENBQXdCL3VJLEtBQXhCLEVBQXpCLENBQ0FzbkUsTUFBTTZtRSxnQkFBTixDQUF1QnQxSCxPQUF2QixDQUErQnZELE1BQS9CLENBQXdDc2lELFNBQXhDLENBQ0EwUCxNQUFNNm1FLGdCQUFOLENBQXVCdDFILE9BQXZCLENBQStCeGhDLElBQS9CLENBQXNDLGNBQXRDLENBQ0E7Ozs7O1NBT0Fpd0YsTUFBTTBuRSxpQkFBTixDQUEwQixxQkFBQSxDQUFzQixDQUF0QixDQUF5QixDQUF6QixDQUE0QixDQUNwRDM1SCxVQUFXVyxZQUR5QyxDQUVwRFosVUFBV1ksWUFGeUMsQ0FHcEQrQyxjQUFlLEtBSHFDLENBSXBERCxZQUFhLEtBSnVDLENBS3BEeEQsT0FBUXNpRCxTQUw0QyxDQUE1QixDQUExQixDQU9BMFAsTUFBTTBuRSxpQkFBTixDQUF3Qm4ySCxPQUF4QixDQUFnQ3hoQyxJQUFoQyxDQUF1QyxlQUF2QyxDQUNBaXdGLE1BQU0wbkUsaUJBQU4sQ0FBd0JuMkgsT0FBeEIsQ0FBZ0N2QyxlQUFoQyxDQUFrRCxLQUFsRCxDQUNBOzs7OztTQU9BZ3hELE1BQU0ybkUsd0JBQU4sQ0FBaUMzbkUsTUFBTTBuRSxpQkFBTixDQUF3Qmh2SSxLQUF4QixFQUFqQyxDQUNBc25FLE1BQU0ybkUsd0JBQU4sQ0FBK0JwMkgsT0FBL0IsQ0FBdUN4aEMsSUFBdkMsQ0FBOEMsc0JBQTlDLENBQ0E7Ozs7O1NBT0Fpd0YsTUFBTTRuRSxlQUFOLENBQXdCLGNBQUEsQ0FBZTVuRSxNQUFNMm1FLFNBQXJCLENBQWdDM21FLE1BQU00bUUsVUFBdEMsQ0FBa0QsQ0FDeEUxaEUsaUJBQWtCLHFCQUFBLENBQXNCLENBQ3RDOXJCLGFBQWMySSxnQkFEd0IsQ0FFdEMvdkIsYUFBYyxJQUZ3QixDQUd0QzJQLFNBQVUsSUFINEIsQ0FBdEIsQ0FEc0QsQ0FNeEU2SSxXQUFZLFNBQUEsQ0FBVSxRQUFWLENBTjRELENBT3hFQyxXQUFZLEdBUDRELENBQWxELENBQXhCLENBU0E7Ozs7O1NBT0F1MUIsTUFBTSttRSxjQUFOLENBQXVCLGNBQUEsQ0FBZS9tRSxNQUFNMm1FLFNBQXJCLENBQWdDM21FLE1BQU00bUUsVUFBdEMsQ0FBa0QsQ0FDdkUxaEUsaUJBQWtCLDJCQUFBLENBQTRCbEYsTUFBTXluRSxpQkFBTixDQUF3QmwySCxPQUFwRCxDQUE2RHl1RCxNQUFNNG1FLFVBQW5FLENBRHFELENBRXZFcDhGLFdBQVksU0FBQSxDQUFVLFFBQVYsQ0FGMkQsQ0FHdkVDLFdBQVksR0FIMkQsQ0FBbEQsQ0FBdkIsQ0FLQTs7Ozs7U0FPQXUxQixNQUFNK2tFLFFBQU4sQ0FBaUIsWUFBQSxDQUFhNXpILE9BQWIsQ0FBakIsQ0FDQTZ1RCxNQUFNdTVELFVBQU4sQ0FBbUJwb0gsUUFBUW9vSCxVQUEzQixDQUNBOzs7OztTQU9BdjVELE1BQU02bkUsUUFBTixDQUFpQixjQUFBLENBQWUsZ0JBQUEsRUFBZixDQUFqQixDQUNBN25FLE1BQU02bkUsUUFBTixDQUFlN0QsY0FBZixDQUFnQyxJQUFoQyxDQUNBOzs7OztTQU9BaGtFLE1BQU04bkUsb0JBQU4sQ0FBNkIsd0JBQUEsQ0FBeUIzMkgsT0FBekIsQ0FBN0IsQ0FDQTZ1RCxNQUFNOG5FLG9CQUFOLENBQTJCN21ILFFBQTNCLENBQW9DaytHLEtBQXBDLENBQTBDenVKLEtBQTFDLENBQWtEc3ZGLE1BQU02bUUsZ0JBQU4sQ0FBdUJ0MUgsT0FBekUsQ0FDQTs7Ozs7U0FPQXl1RCxNQUFNK25FLG9CQUFOLENBQTZCLHdCQUFBLENBQXlCNTJILE9BQXpCLENBQTdCLENBQ0E2dUQsTUFBTStuRSxvQkFBTixDQUEyQjltSCxRQUEzQixDQUFvQ2srRyxLQUFwQyxDQUEwQ3p1SixLQUExQyxDQUFrRHN2RixNQUFNNm1FLGdCQUFOLENBQXVCdDFILE9BQXpFLENBQ0F5dUQsTUFBTWdvRSxJQUFOLENBQWE3MkgsUUFBUTYySCxJQUFSLEdBQWlCMzFKLFNBQWpCLENBQTZCOCtCLFFBQVE2MkgsSUFBckMsQ0FBNEMsSUFBekQsQ0FDQTs7Ozs7U0FPQWhvRSxNQUFNaW9FLFNBQU4sQ0FBa0IsRUFBbEIsQ0FDQTs7Ozs7U0FPQWpvRSxNQUFNNEUsSUFBTixDQUFhLEdBQWIsQ0FDQTs7OztTQU1BNUUsTUFBTWtvRSxVQUFOLENBQW1CLzJILFFBQVErMkgsVUFBUixHQUF1QjcxSixTQUF2QixDQUFtQzgrQixRQUFRKzJILFVBQTNDLENBQXdELEdBQTNFLENBQ0E7Ozs7Ozs7U0FTQWxvRSxNQUFNbW9FLGNBQU4sQ0FBdUIsRUFBdkIsQ0FDQSxZQUFBLENBQ0QsQ0FDRDs7OztPQU9BamdCLFlBQVlzZixXQUFaLENBQXlCLENBQUMsQ0FDeEJoMEosSUFBSyxtQkFEbUI7Ozs7U0FReEI5QyxNQUFPLDBCQUFBLEVBQTZCLENBQ2xDLFlBQWMwRyxVQUFVMUQsTUFBVixDQUFtQixDQUFuQixFQUF3QjBELFVBQVUsQ0FBVixJQUFpQi9FLFNBQXpDLENBQXFEK0UsVUFBVSxDQUFWLENBQXJELENBQW9FLElBQWxGLENBQ0EsS0FBSzJ3SixvQkFBTCxDQUEwQkssaUJBQTFCLENBQTRDNzJILE9BQTVDLEVBQ0QsQ0FDRDs7Ozs7VUFadUIsQ0FtQnRCLENBQ0QvOUIsSUFBSyxjQURKLENBRUQ5QyxNQUFPLHFCQUFBLENBQXNCZ3ZGLE9BQXRCLENBQStCLENBQ3BDLGNBQWdCQSxRQUFRcHJGLEtBQVIsQ0FBYyxDQUFkLENBQWhCLENBQ0EsbUJBQXFCLEtBQUs2ekosY0FBMUIsQ0FDQSxLQUFBLENBQU8zeEosQ0FBUCxDQUNBLEtBQUs2eEosY0FBTCxHQUVBLElBQUt0MEosRUFBSSxDQUFKLENBQU95QyxFQUFJeXhKLFVBQVV2MEosTUFBMUIsQ0FBa0NLLEVBQUl5QyxDQUF0QyxDQUF5QyxFQUFFekMsQ0FBM0MsQ0FBOEMsQ0FDNUNrMEosVUFBVWwwSixDQUFWLEVBQWF3NEMsTUFBYixDQUFvQkYsTUFBcEIsQ0FBMkI4N0csY0FBM0IsRUFDRCxDQUVELEtBQUtGLFNBQUwsQ0FBaUJBLFNBQWpCLENBQ0EsV0FBQSxDQUNELENBQ0Q7Ozs7VUFsQ3VCLENBd0N0QixDQUNEejBKLElBQUssZ0JBREosQ0FFRDlDLE1BQU8sdUJBQUEsRUFBMEIsQ0FDL0IsY0FBZ0IsS0FBS3UzSixTQUFyQixDQUNBLG1CQUFxQixLQUFLRSxjQUExQixDQUNBLEtBQUEsQ0FBTzN4SixDQUFQLENBRUEsSUFBS3pDLEVBQUksQ0FBSixDQUFPeUMsRUFBSXl4SixVQUFVdjBKLE1BQTFCLENBQWtDSyxFQUFJeUMsQ0FBdEMsQ0FBeUMsRUFBRXpDLENBQTNDLENBQThDLENBQzVDazBKLFVBQVVsMEosQ0FBVixFQUFhdzRDLE1BQWIsQ0FBb0JELE9BQXBCLENBQTRCNjdHLGNBQTVCLEVBQ0QsQ0FFRCxLQUFLRixTQUFMLENBQWlCLEVBQWpCLENBQ0EsS0FBS3JqRSxJQUFMLENBQVksR0FBWixDQUNBLFdBQUEsQ0FDRCxDQUNEOzs7OztVQXZEdUIsQ0E4RHRCLENBQ0RweEYsSUFBSyxjQURKLENBRUQ5QyxNQUFPLHFCQUFBLENBQXNCNkMsTUFBdEIsQ0FBOEIsQ0FDbkNBLE9BQU9nNUMsTUFBUCxDQUFjRixNQUFkLENBQXFCLEtBQUs4N0csY0FBMUIsRUFDQSxLQUFLRixTQUFMLENBQWUvMEosSUFBZixDQUFvQkssTUFBcEIsRUFDQSxXQUFBLENBQ0QsQ0FDRDs7Ozs7VUFyRXVCLENBNEV0QixDQUNEQyxJQUFLLGdCQURKLENBRUQ5QyxNQUFPLHVCQUFBLENBQXdCNkMsTUFBeEIsQ0FBZ0MsQ0FDckMsY0FBZ0IsS0FBSzAwSixTQUFyQixDQUNBLFVBQVlBLFVBQVUxeUosT0FBVixDQUFrQmhDLE1BQWxCLENBQVosQ0FFQSxHQUFJb0gsT0FBUyxDQUFiLENBQWdCLENBQ2RzdEosVUFBVXR0SixLQUFWLEVBQWlCNHhDLE1BQWpCLENBQXdCRCxPQUF4QixDQUFnQyxLQUFLNjdHLGNBQXJDLEVBQ0FGLFVBQVU1eUksTUFBVixDQUFpQjFhLEtBQWpCLENBQXdCLENBQXhCLEVBRUEsR0FBSXN0SixVQUFVdjBKLE1BQVYsR0FBcUIsQ0FBekIsQ0FBNEIsQ0FDMUIsS0FBS2t4RixJQUFMLENBQVksR0FBWixDQUNELENBQ0YsQ0FFRCxXQUFBLENBQ0QsQ0FDRDs7Ozs7VUE3RnVCLENBb0d0QixDQUNEcHhGLElBQUsscUJBREosQ0FFRDlDLE1BQU8sNEJBQUEsQ0FBNkJ1OEMsT0FBN0IsQ0FBc0MsQ0FDM0MsY0FBZ0IsS0FBS2c3RyxTQUFyQixDQUNBLEtBQUEsQ0FBT3p4SixDQUFQLENBRUEsSUFBS3pDLEVBQUksQ0FBSixDQUFPeUMsRUFBSXl4SixVQUFVdjBKLE1BQTFCLENBQWtDSyxFQUFJeUMsQ0FBdEMsQ0FBeUMsRUFBRXpDLENBQTNDLENBQThDLENBQzVDLEdBQUlrNUMsT0FBSixDQUFhLENBQ1hnN0csVUFBVWwwSixDQUFWLEVBQWF3NEMsTUFBYixDQUFvQkYsTUFBcEIsQ0FBMkIsQ0FBM0IsRUFDRCxDQUZELElBRU8sQ0FDTDQ3RyxVQUFVbDBKLENBQVYsRUFBYXc0QyxNQUFiLENBQW9CRCxPQUFwQixDQUE0QixDQUE1QixFQUNELENBQ0YsQ0FDRixDQUNEOzs7Ozs7OztVQWxIdUIsQ0E0SHRCLENBQ0Q5NEMsSUFBSyxRQURKLENBRUQ5QyxNQUFPLGVBQUEsQ0FBZ0J1NUQsUUFBaEIsQ0FBMEJpNkYsV0FBMUIsQ0FBdUNDLFlBQXZDLENBQXFEL3NILEtBQXJELENBQTREaXdDLFdBQTVELENBQXlFLENBQzlFLGNBQWdCLEtBQUtzL0UsU0FBckIsQ0FDQSxlQUFpQixLQUFLQyxVQUF0QixDQUNBLFVBQVksS0FBS21CLG9CQUFMLENBQTBCOW1ILFFBQTFCLENBQW1DaStHLEtBQS9DLENBQ0EsY0FBQSxDQUFnQi95RyxJQUFoQixDQUVBLEdBQUksS0FBSzg3RyxTQUFMLENBQWV2MEosTUFBZixDQUF3QixDQUE1QixDQUErQixDQUM3QjQyRCxXQUFhcThGLFVBQVVyOEYsVUFBdkIsQ0FDQW5lLEtBQU95NkcsV0FBV3I2RyxNQUFYLENBQWtCSixJQUF6QixDQUNBdzZHLFVBQVVyOEYsVUFBVixDQUF1QixJQUF2QixDQUNBNDBGLE1BQU14dUosS0FBTixDQUFjLEdBQWQsQ0FFQSxHQUFJLEtBQUt3M0osVUFBTCxDQUFrQixHQUF0QixDQUEyQixDQUN6QmhKLE1BQU14dUosS0FBTixDQUFjLE1BQVFrRixLQUFLaW1CLEdBQUwsQ0FBUyxLQUFLK29FLElBQUwsQ0FBWSxLQUFLc2pFLFVBQWpCLENBQThCLElBQXZDLEVBQStDLEtBQXJFLENBQ0EsS0FBS3RqRSxJQUFMLEVBQWF4dEQsS0FBYixDQUNELENBQUM7RUFHRixLQUFLa3hILG1CQUFMLENBQXlCLEtBQXpCLEVBQ0EsS0FBS1YsZUFBTCxDQUFxQnQ4RixNQUFyQixDQUE0QnJCLFFBQTVCLENBQXNDLEtBQUt3OUYsaUJBQTNDLEVBQ0EsS0FBS2EsbUJBQUwsQ0FBeUIsSUFBekIsRUFBZ0M7RUFFaEMxQixXQUFXcjZHLE1BQVgsQ0FBa0JKLElBQWxCLENBQXlCLEdBQUssS0FBS2c4RyxjQUFuQyxDQUNBLEtBQUtwQixjQUFMLENBQW9CejdGLE1BQXBCLENBQTJCckIsUUFBM0IsQ0FBcUMsS0FBSzQ4RixnQkFBMUMsRUFBNkQ7RUFFN0RELFdBQVdyNkcsTUFBWCxDQUFrQkosSUFBbEIsQ0FBeUJBLElBQXpCLENBQ0F3NkcsVUFBVXI4RixVQUFWLENBQXVCQSxVQUF2QixDQUFtQztFQUVuQyxLQUFLdGEsUUFBTCxDQUFnQixLQUFLODNHLG9CQUFyQixDQUNBNzlGLFNBQVNxQixNQUFULENBQWdCLEtBQUtsQixLQUFyQixDQUE0QixLQUFLai9CLE1BQWpDLENBQXlDLEtBQUt1OEgsaUJBQTlDLEVBRUEsR0FBSSxLQUFLM0MsUUFBTCxDQUFjL3pHLE9BQWxCLENBQTJCO0VBRXpCLEtBQUsrekcsUUFBTCxDQUFjejVGLE1BQWQsQ0FBcUJyQixRQUFyQixDQUErQixLQUFLeTlGLGlCQUFwQyxDQUF1RCxLQUFLQyx3QkFBNUQsRUFDRCxDQUVELEdBQUksS0FBS3pDLEtBQVQsQ0FBZ0I7RUFFZCxLQUFLbDFHLFFBQUwsQ0FBZ0IsS0FBSyszRyxvQkFBckIsQ0FDQSxLQUFLQSxvQkFBTCxDQUEwQjltSCxRQUExQixDQUFtQzQyRyxRQUFuQyxDQUE0Q25uSixLQUE1QyxDQUFvRHd6SixZQUFZM3lILE9BQWhFLENBQ0EwNEIsU0FBU3FCLE1BQVQsQ0FBZ0IsS0FBS2xCLEtBQXJCLENBQTRCLEtBQUtqL0IsTUFBakMsQ0FBeUMsS0FBSzY0SCxjQUFMLENBQXNCLElBQXRCLENBQTZCLEtBQUtHLFlBQTNFLEVBQ0QsQ0FDRixDQXBDRCxRQW9DVyxLQUFLSCxjQUFULENBQXlCO0VBRTlCLEtBQUs2RCxRQUFMLENBQWN2OEYsTUFBZCxDQUFxQnJCLFFBQXJCLENBQStCaTZGLFdBQS9CLEVBQ0QsQ0FDRixDQUNEOzs7OztVQTdLdUIsQ0FvTHRCLENBQ0Qxd0osSUFBSyxTQURKLENBRUQ5QyxNQUFPLGdCQUFBLENBQWlCby9CLEtBQWpCLENBQXdCQyxNQUF4QixDQUFnQyxDQUNyQyxLQUFLMDNILGlCQUFMLENBQXVCNTFILE9BQXZCLENBQStCL0IsS0FBL0IsQ0FBc0NDLE1BQXRDLEVBQ0EsS0FBSzgySCxnQkFBTCxDQUFzQmgxSCxPQUF0QixDQUE4Qi9CLEtBQTlCLENBQXFDQyxNQUFyQyxFQUNBLEtBQUs2M0gsZUFBTCxDQUFxQi8xSCxPQUFyQixDQUE2Qi9CLEtBQTdCLENBQW9DQyxNQUFwQyxFQUNBLEtBQUtnM0gsY0FBTCxDQUFvQmwxSCxPQUFwQixDQUE0Qi9CLEtBQTVCLENBQW1DQyxNQUFuQyxFQUNBLEtBQUtnMUgsUUFBTCxDQUFjbHpILE9BQWQsQ0FBc0IvQixLQUF0QixDQUE2QkMsTUFBN0IsRUFDQUQsTUFBUSxLQUFLaTFILFFBQUwsQ0FBY2oxSCxLQUF0QixDQUNBQyxPQUFTLEtBQUtnMUgsUUFBTCxDQUFjaDFILE1BQXZCLENBQ0EsS0FBSzIzSCxpQkFBTCxDQUF1QjcxSCxPQUF2QixDQUErQi9CLEtBQS9CLENBQXNDQyxNQUF0QyxFQUNBLEtBQUs0M0gsd0JBQUwsQ0FBOEI5MUgsT0FBOUIsQ0FBc0MvQixLQUF0QyxDQUE2Q0MsTUFBN0MsRUFDQSxLQUFLZzRILG9CQUFMLENBQTBCOW1ILFFBQTFCLENBQW1DKzNDLE1BQW5DLENBQTBDdG9GLEtBQTFDLENBQWtEby9CLE1BQVFDLE1BQTFELENBQ0EsS0FBSyszSCxvQkFBTCxDQUEwQnhPLFlBQTFCLENBQXVDLElBQU14cEgsS0FBN0MsQ0FBb0QsSUFBTUMsTUFBMUQsRUFDRCxDQUNEOzs7OztVQW5NdUIsQ0EwTXRCLENBQ0R2OEIsSUFBSyxZQURKLENBRUQ5QyxNQUFPLG1CQUFBLENBQW9CdTVELFFBQXBCLENBQThCbHZDLEtBQTlCLENBQXFDLENBQzFDLEtBQUs2c0ksZUFBTCxDQUFxQnpDLFVBQXJCLENBQWdDbDdGLFFBQWhDLENBQTBDbHZDLEtBQTFDLEVBQ0EsS0FBS2dzSSxjQUFMLENBQW9CNUIsVUFBcEIsQ0FBK0JsN0YsUUFBL0IsQ0FBeUNsdkMsS0FBekMsRUFDQSxLQUFLZ3FJLFFBQUwsQ0FBY0ksVUFBZCxDQUF5Qmw3RixRQUF6QixDQUFtQ2x2QyxLQUFuQyxFQUNELENBTkEsQ0ExTXNCLENBaU50QixDQUNEdm5CLElBQUssaUJBREosQ0FFRGlFLElBQUssWUFBQSxFQUFlLENBQ2xCLFlBQVlzdEosUUFBTCxDQUFjUCxlQUFyQixDQUNELENBQ0Q7Ozs7VUFNQW5nSixJQUFLLFlBQUEsRUFBZSxDQUNsQixVQUFZak4sVUFBVTFELE1BQVYsQ0FBbUIsQ0FBbkIsRUFBd0IwRCxVQUFVLENBQVYsSUFBaUIvRSxTQUF6QyxDQUFxRCtFLFVBQVUsQ0FBVixDQUFyRCxDQUFvRSxHQUFoRixDQUNBLEtBQUsydEosUUFBTCxDQUFjUCxlQUFkLENBQWdDOXpKLEtBQWhDLENBQ0QsQ0FDRDs7OztVQWhPdUIsQ0FzT3RCLENBQ0Q4QyxJQUFLLFlBREosQ0FFRGlFLElBQUssWUFBQSxFQUFlLENBQ2xCLFlBQVlzdEosUUFBTCxDQUFjeEwsVUFBckIsQ0FDRCxDQUNEOztVQUlBbDFJLElBQUssWUFBQSxFQUFlLENBQ2xCLFVBQVlqTixVQUFVMUQsTUFBVixDQUFtQixDQUFuQixFQUF3QjBELFVBQVUsQ0FBVixJQUFpQi9FLFNBQXpDLENBQXFEK0UsVUFBVSxDQUFWLENBQXJELENBQW9Fb2lKLFdBQVdFLFVBQTNGLENBQ0EsS0FBS3FMLFFBQUwsQ0FBY3hMLFVBQWQsQ0FBMkI3b0osS0FBM0IsQ0FDRCxDQUNEOzs7O1VBblB1QixDQXlQdEIsQ0FDRDhDLElBQUssTUFESixDQUVEaUUsSUFBSyxZQUFBLEVBQWUsQ0FDbEIsWUFBWXN0SixRQUFMLENBQWMvekcsT0FBckIsQ0FDRCxDQUNEOztVQUlBM3NDLElBQUssWUFBQSxDQUFhM1QsS0FBYixDQUFvQixDQUN2QixLQUFLcTBKLFFBQUwsQ0FBYy96RyxPQUFkLENBQXdCdGdELEtBQXhCLENBQ0EsS0FBS3EzSixvQkFBTCxDQUEwQjltSCxRQUExQixDQUFtQ20rRyxNQUFuQyxDQUEwQzF1SixLQUExQyxDQUFrREEsTUFBUSxLQUFLaTNKLHdCQUFMLENBQThCcDJILE9BQXRDLENBQWdELEtBQUttMkgsaUJBQUwsQ0FBdUJuMkgsT0FBekgsQ0FDRCxDQUNEOzs7O1VBdFF1QixDQTRRdEIsQ0FDRC85QixJQUFLLFdBREosQ0FFRGlFLElBQUssWUFBQSxFQUFlLENBQ2xCLFlBQVlzdEosUUFBTCxDQUFjeGtHLFNBQXJCLENBQ0QsQ0FDRDs7OztVQU1BbDhDLElBQUssWUFBQSxDQUFhM1QsS0FBYixDQUFvQixDQUN2QixLQUFLcTBKLFFBQUwsQ0FBY3hrRyxTQUFkLENBQTBCN3ZELEtBQTFCLENBQ0QsQ0FDRDs7OztVQTFSdUIsQ0FnU3RCLENBQ0Q4QyxJQUFLLE9BREosQ0FFRGlFLElBQUssWUFBQSxFQUFlLENBQ2xCLFlBQVl3c0osU0FBWixDQUNELENBQ0Q7Ozs7Ozs7VUFTQTUvSSxJQUFLLFlBQUEsQ0FBYTNULEtBQWIsQ0FBb0IsQ0FDdkIsS0FBS3V6SixTQUFMLENBQWlCdnpKLEtBQWpCLENBQ0QsQ0FDRDs7OztVQWpUdUIsQ0F1VHRCLENBQ0Q4QyxJQUFLLFNBREosQ0FFRGlFLElBQUssWUFBQSxFQUFlLENBQ2xCLFlBQVlzd0osb0JBQUwsQ0FBMEI5bUgsUUFBMUIsQ0FBbUNtK0csTUFBbkMsQ0FBMEMxdUosS0FBakQsQ0FDRCxDQUpBLENBdlRzQixDQUF6QixFQThUQTAySSxTQUFTb2dCLFdBQVQsQ0FBc0JwRCxLQUF0QixFQUVBLGtCQUFBLENBQ0QsQ0E5ZkQsQ0E4ZkVOLElBOWZGLENBRkEsQ0FrZ0JBOztLQUlBLGdDQUVBLFNBQVVNLEtBQVYsQ0FBaUI7Ozs7T0FNZix1QkFBQSxFQUEwQixDQUN4QixTQUFBLENBRUEsZ0JBQWtCaHRKLFVBQVUxRCxNQUFWLENBQW1CLENBQW5CLEVBQXdCMEQsVUFBVSxDQUFWLElBQWlCL0UsU0FBekMsQ0FBcUQrRSxVQUFVLENBQVYsQ0FBckQsQ0FBb0UsSUFBdEYsQ0FFQTJ2SSxlQUFlLElBQWYsQ0FBcUJ3aEIsY0FBckIsRUFFQXZvRSxNQUFRaW5ELDBCQUEwQixJQUExQixDQUFnQ04saUJBQWlCNGhCLGNBQWpCLEVBQWlDNTVKLElBQWpDLENBQXNDLElBQXRDLENBQTRDLGdCQUE1QyxDQUFoQyxDQUFSLENBQ0FxeEYsTUFBTWh3QyxRQUFOLENBQWlCLHNCQUFBLEVBQWpCLENBQ0Fnd0MsTUFBTWlnRSxXQUFOLENBQW9CQSxXQUFwQixDQUNBLFlBQUEsQ0FDRCxDQUNEOzs7O09BT0EvWCxZQUFZcWdCLGNBQVosQ0FBNEIsQ0FBQyxDQUMzQi8wSixJQUFLLFFBRHNCOzs7Ozs7OztTQVkzQjlDLE1BQU8sZUFBQSxDQUFnQnU1RCxRQUFoQixDQUEwQmk2RixXQUExQixDQUF1Q0MsWUFBdkMsQ0FBcUQvc0gsS0FBckQsQ0FBNERpd0MsV0FBNUQsQ0FBeUUsQ0FDOUUsS0FBS3IzQixRQUFMLENBQWMvTyxRQUFkLENBQXVCNDJHLFFBQXZCLENBQWdDbm5KLEtBQWhDLENBQXdDd3pKLFlBQVkzeUgsT0FBcEQsQ0FDQTA0QixTQUFTcUIsTUFBVCxDQUFnQixLQUFLbEIsS0FBckIsQ0FBNEIsS0FBS2ovQixNQUFqQyxDQUF5QyxLQUFLNjRILGNBQUwsQ0FBc0IsSUFBdEIsQ0FBNkJHLFlBQXRFLEVBQ0QsQ0FDRDs7Ozs7VUFoQjBCLENBdUJ6QixDQUNEM3dKLElBQUssU0FESixDQUVEOUMsTUFBTyxnQkFBQSxDQUFpQm8vQixLQUFqQixDQUF3QkMsTUFBeEIsQ0FBZ0MsQ0FDckMsS0FBS2lnQixRQUFMLENBQWN3NEcsYUFBZCxDQUE0QjE0SCxLQUE1QixDQUFtQ0MsTUFBbkMsRUFDRCxDQUpBLENBdkJ5QixDQTRCekIsQ0FDRHY4QixJQUFLLGFBREosQ0FFRGlFLElBQUssWUFBQSxFQUFlLENBQ2xCLFlBQVl1NEMsUUFBTCxDQUFjaXdHLFdBQXJCLENBQ0QsQ0FDRDs7OztVQU1BNTdJLElBQUssWUFBQSxFQUFlLENBQ2xCLFVBQVlqTixVQUFVMUQsTUFBVixDQUFtQixDQUFuQixFQUF3QjBELFVBQVUsQ0FBVixJQUFpQi9FLFNBQXpDLENBQXFEK0UsVUFBVSxDQUFWLENBQXJELENBQW9FLEVBQWhGLENBQ0ExRyxNQUFRa0YsS0FBS0UsS0FBTCxDQUFXcEYsS0FBWCxDQUFSLENBRUEsR0FBSUEsTUFBUSxDQUFSLENBQVksQ0FBaEIsQ0FBbUIsQ0FDakJBLE9BQVMsQ0FBVCxDQUNELENBRUQsS0FBS3MvQyxRQUFMLENBQWNpd0csV0FBZCxDQUE0QnZ2SixLQUE1QixDQUNELENBcEJBLENBNUJ5QixDQUE1QixFQW1EQTAySSxTQUFTbWhCLGNBQVQsQ0FBeUJuRSxLQUF6QixFQUVBLHFCQUFBLENBQ0QsQ0EvRUQsQ0ErRUVOLElBL0VGLENBRkEsQ0FtRkE7Ozs7OztLQVFBLG9DQUVBLFNBQVVNLEtBQVYsQ0FBaUI7Ozs7O09BT2YsMkJBQUEsQ0FBNEJqNUgsTUFBNUIsQ0FBb0MsQ0FDbEMsU0FBQSxDQUVBLFlBQWMvekIsVUFBVTFELE1BQVYsQ0FBbUIsQ0FBbkIsRUFBd0IwRCxVQUFVLENBQVYsSUFBaUIvRSxTQUF6QyxDQUFxRCtFLFVBQVUsQ0FBVixDQUFyRCxDQUFvRSxFQUFsRixDQUVBMnZJLGVBQWUsSUFBZixDQUFxQjBoQixrQkFBckIsRUFFQXpvRSxNQUFRaW5ELDBCQUEwQixJQUExQixDQUFnQ04saUJBQWlCOGhCLGtCQUFqQixFQUFxQzk1SixJQUFyQyxDQUEwQyxJQUExQyxDQUFnRCxvQkFBaEQsQ0FBaEMsQ0FBUixDQUNBcXhGLE1BQU1od0MsUUFBTixDQUFpQiwwQkFBQSxDQUEyQjdrQixNQUEzQixDQUFtQ2dHLE9BQW5DLENBQWpCLENBQ0EsWUFBQSxDQUNELENBQ0Q7Ozs7Ozs7O09BV0ErMkcsWUFBWXVnQixrQkFBWixDQUFnQyxDQUFDLENBQy9CajFKLElBQUssUUFEMEIsQ0FFL0I5QyxNQUFPLGVBQUEsQ0FBZ0J1NUQsUUFBaEIsQ0FBMEJpNkYsV0FBMUIsQ0FBdUNDLFlBQXZDLENBQXFEL3NILEtBQXJELENBQTREaXdDLFdBQTVELENBQXlFLENBQzlFLEtBQUtyM0IsUUFBTCxDQUFjL08sUUFBZCxDQUF1QjQyRyxRQUF2QixDQUFnQ25uSixLQUFoQyxDQUF3Q3d6SixZQUFZM3lILE9BQXBELENBQ0EsS0FBS3llLFFBQUwsQ0FBYy9PLFFBQWQsQ0FBdUI2MkcsTUFBdkIsQ0FBOEJwbkosS0FBOUIsQ0FBc0N3ekosWUFBWXh5SCxZQUFsRCxDQUNBdTRCLFNBQVNxQixNQUFULENBQWdCLEtBQUtsQixLQUFyQixDQUE0QixLQUFLai9CLE1BQWpDLENBQXlDLEtBQUs2NEgsY0FBTCxDQUFzQixJQUF0QixDQUE2QkcsWUFBdEUsRUFDRCxDQUNEOzs7OztVQVA4QixDQWM3QixDQUNEM3dKLElBQUssU0FESixDQUVEOUMsTUFBTyxnQkFBQSxDQUFpQm8vQixLQUFqQixDQUF3QkMsTUFBeEIsQ0FBZ0MsQ0FDckMsS0FBS2lnQixRQUFMLENBQWNzcEcsWUFBZCxDQUEyQixJQUFNeHBILEtBQWpDLENBQXdDLElBQU1DLE1BQTlDLEVBQ0QsQ0FKQSxDQWQ2QixDQUFoQyxFQXFCQXEzRyxTQUFTcWhCLGtCQUFULENBQTZCckUsS0FBN0IsRUFFQSx5QkFBQSxDQUNELENBckRELENBcURFTixJQXJERixDQUZBLENBeURBOztLQUlBLDBCQUVBLFNBQVVNLEtBQVYsQ0FBaUI7Ozs7O09BT2YsaUJBQUEsQ0FBa0J6MUUsWUFBbEIsQ0FBZ0MsQ0FDOUIsU0FBQSxDQUVBLFdBQWF2M0UsVUFBVTFELE1BQVYsQ0FBbUIsQ0FBbkIsRUFBd0IwRCxVQUFVLENBQVYsSUFBaUIvRSxTQUF6QyxDQUFxRCtFLFVBQVUsQ0FBVixDQUFyRCxDQUFvRSxJQUFqRixDQUVBMnZJLGVBQWUsSUFBZixDQUFxQjJoQixRQUFyQixFQUVBMW9FLE1BQVFpbkQsMEJBQTBCLElBQTFCLENBQWdDTixpQkFBaUIraEIsUUFBakIsRUFBMkIvNUosSUFBM0IsQ0FBZ0MsSUFBaEMsQ0FBc0MsVUFBdEMsQ0FBaEMsQ0FBUixDQUNBcXhGLE1BQU1od0MsUUFBTixDQUFpQixnQkFBQSxFQUFqQixDQUNBZ3dDLE1BQU1pa0UsU0FBTixDQUFrQixLQUFsQixDQUNBOzs7O1NBTUFqa0UsTUFBTXJSLFlBQU4sQ0FBcUJBLGVBQWlCdDhFLFNBQWpCLENBQTZCczhFLFlBQTdCLENBQTRDLHFCQUFBLENBQXNCLENBQXRCLENBQXlCLENBQXpCLENBQTRCLENBQzNGNWdELFVBQVdXLFlBRGdGLENBRTNGWixVQUFXWSxZQUZnRixDQUczRitDLGNBQWUsS0FINEUsQ0FJM0ZELFlBQWEsS0FKOEUsQ0FBNUIsQ0FBakUsQ0FNQXd1RCxNQUFNclIsWUFBTixDQUFtQnA5QyxPQUFuQixDQUEyQnhoQyxJQUEzQixDQUFrQyxhQUFsQyxDQUNBaXdGLE1BQU1yUixZQUFOLENBQW1CcDlDLE9BQW5CLENBQTJCdkMsZUFBM0IsQ0FBNkMsS0FBN0MsQ0FDQTs7Ozs7U0FPQWd4RCxNQUFNMm9FLE1BQU4sQ0FBZUEsTUFBZixDQUNBLFlBQUEsQ0FDRCxDQUNEOzs7Ozs7OztPQVdBemdCLFlBQVl3Z0IsUUFBWixDQUFzQixDQUFDLENBQ3JCbDFKLElBQUssUUFEZ0IsQ0FFckI5QyxNQUFPLGVBQUEsQ0FBZ0J1NUQsUUFBaEIsQ0FBMEJpNkYsV0FBMUIsQ0FBdUNDLFlBQXZDLENBQXFEL3NILEtBQXJELENBQTREaXdDLFdBQTVELENBQXlFLENBQzlFLEtBQUtyM0IsUUFBTCxDQUFjL08sUUFBZCxDQUF1QjQyRyxRQUF2QixDQUFnQ25uSixLQUFoQyxDQUF3Q3d6SixZQUFZM3lILE9BQXBELENBQ0EwNEIsU0FBU3FCLE1BQVQsQ0FBZ0IsS0FBS2xCLEtBQXJCLENBQTRCLEtBQUtqL0IsTUFBakMsQ0FBeUMsS0FBS3dqRCxZQUE5QyxFQUNELENBQ0Q7Ozs7O1VBTm9CLENBYW5CLENBQ0RuN0UsSUFBSyxTQURKLENBRUQ5QyxNQUFPLGdCQUFBLENBQWlCby9CLEtBQWpCLENBQXdCQyxNQUF4QixDQUFnQyxDQUNyQyxHQUFJLEtBQUs0NEgsTUFBVCxDQUFpQixDQUNmNzRILE1BQVFsNkIsS0FBSzhFLEdBQUwsQ0FBUyxDQUFULENBQVlvMUIsS0FBWixDQUFSLENBQ0FDLE9BQVNuNkIsS0FBSzhFLEdBQUwsQ0FBUyxDQUFULENBQVlxMUIsTUFBWixDQUFULENBQ0EsS0FBSzQrQyxZQUFMLENBQWtCOThDLE9BQWxCLENBQTBCL0IsS0FBMUIsQ0FBaUNDLE1BQWpDLEVBQ0QsQ0FDRixDQUNEOzs7OztVQXRCb0IsQ0E2Qm5CLENBQ0R2OEIsSUFBSyxZQURKLENBRUQ5QyxNQUFPLG1CQUFBLENBQW9CdTVELFFBQXBCLENBQThCbHZDLEtBQTlCLENBQXFDLENBQzFDLEdBQUksQ0FBQ0EsS0FBTCxDQUFZLENBQ1YsS0FBSzR6RCxZQUFMLENBQWtCcDlDLE9BQWxCLENBQTBCdkQsTUFBMUIsQ0FBbUNzaUQsU0FBbkMsQ0FDRCxDQUNGLENBTkEsQ0E3Qm1CLENBQXRCLEVBc0NBODJELFNBQVNzaEIsUUFBVCxDQUFtQnRFLEtBQW5CLEVBRUEsZUFBQSxDQUNELENBN0ZELENBNkZFTixJQTdGRixDQUZBLENBaUdBOzs7OztLQU9BLFlBQWNsdUosS0FBSytmLEVBQUwsQ0FBVSxHQUF4QixDQUNBOzs7OztLQU9BLE1BQVEsV0FBQSxFQUFSLENBQ0E7Ozs7O0tBT0EsT0FBUyxXQUFBLEVBQVQsQ0FDQTs7S0FJQSwrQkFFQSxTQUFVeXVJLEtBQVYsQ0FBaUI7Ozs7Ozs7Ozs7T0FZZixzQkFBQSxDQUF1Qmo1SCxNQUF2QixDQUErQixDQUM3QixTQUFBLENBRUEsY0FBZ0IvekIsVUFBVTFELE1BQVYsQ0FBbUIsQ0FBbkIsRUFBd0IwRCxVQUFVLENBQVYsSUFBaUIvRSxTQUF6QyxDQUFxRCtFLFVBQVUsQ0FBVixDQUFyRCxDQUFvRSxXQUFBLEVBQXBGLENBQ0EsWUFBY0EsVUFBVTFELE1BQVYsQ0FBbUIsQ0FBbkIsRUFBd0IwRCxVQUFVLENBQVYsSUFBaUIvRSxTQUF6QyxDQUFxRCtFLFVBQVUsQ0FBVixDQUFyRCxDQUFvRSxFQUFsRixDQUVBMnZJLGVBQWUsSUFBZixDQUFxQjZoQixhQUFyQixFQUVBNW9FLE1BQVFpbkQsMEJBQTBCLElBQTFCLENBQWdDTixpQkFBaUJpaUIsYUFBakIsRUFBZ0NqNkosSUFBaEMsQ0FBcUMsSUFBckMsQ0FBMkMsZUFBM0MsQ0FBaEMsQ0FBUixDQUNBOzs7O1NBTUFxeEYsTUFBTTRtRSxVQUFOLENBQW1CejdILE1BQW5CLENBQ0E7Ozs7O1NBT0E2MEQsTUFBTTZvRSxTQUFOLENBQWtCQSxTQUFsQixDQUNBOzs7OztTQU9BN29FLE1BQU1nbkUsY0FBTixDQUF1QixXQUFBLEVBQXZCLENBQ0E7Ozs7U0FNQWhuRSxNQUFNOG9FLEtBQU4sQ0FBYzMzSCxRQUFRMjNILEtBQVIsR0FBa0J6MkosU0FBbEIsQ0FBOEI4K0IsUUFBUTIzSCxLQUF0QyxDQUE4QyxHQUE1RCxDQUNBOzs7OztTQU9BOW9FLE1BQU00RSxJQUFOLENBQWEsR0FBYixDQUNBOzs7OztTQU9BNUUsTUFBTTBvRCxNQUFOLENBQWUsS0FBZixDQUNBOzs7OztTQU9BMW9ELE1BQU0rb0UsaUJBQU4sQ0FBMEIscUJBQUEsQ0FBc0I1M0gsT0FBdEIsQ0FBMUIsQ0FDQTZ1RCxNQUFNK29FLGlCQUFOLENBQXdCOW5ILFFBQXhCLENBQWlDcmxCLE1BQWpDLENBQXdDbHJCLEtBQXhDLENBQWdEc3ZGLE1BQU1nbkUsY0FBdEQsQ0FDQTs7Ozs7U0FPQWhuRSxNQUFNZ3BFLFlBQU4sQ0FBcUIsZ0JBQUEsRUFBckIsQ0FDQSxZQUFBLENBQ0QsQ0FDRDs7T0FLQTlnQixZQUFZMGdCLGFBQVosQ0FBMkIsQ0FBQyxDQUMxQnAxSixJQUFLLFNBRHFCLENBRTFCOUMsTUFBTyxnQkFBQSxFQUFtQixDQUN4QixLQUFLazBGLElBQUwsQ0FBWSxHQUFaLENBQ0EsS0FBSzhqRCxNQUFMLENBQWMsSUFBZCxDQUNELENBQ0Q7Ozs7Ozs7O1VBTnlCLENBZ0J4QixDQUNEbDFJLElBQUssUUFESixDQUVEOUMsTUFBTyxlQUFBLENBQWdCdTVELFFBQWhCLENBQTBCaTZGLFdBQTFCLENBQXVDQyxZQUF2QyxDQUFxRC9zSCxLQUFyRCxDQUE0RGl3QyxXQUE1RCxDQUF5RSxDQUM5RSxjQUFnQixLQUFLd2hGLFNBQXJCLENBQ0EsZUFBaUIsS0FBS2pDLFVBQXRCLENBQ0EsbUJBQXFCLEtBQUtJLGNBQTFCLENBQ0Esc0JBQXdCLEtBQUsrQixpQkFBN0IsQ0FDQSxhQUFlQSxrQkFBa0I5bkgsUUFBakMsQ0FDQSxXQUFhQSxTQUFTcmxCLE1BQXRCLENBQ0EsV0FBYXFsQixTQUFTeFUsTUFBdEIsQ0FDQSxjQUFnQndVLFNBQVNnaEgsU0FBekIsQ0FDQSxhQUFlaGhILFNBQVNpaEgsUUFBeEIsQ0FDQSxLQUFLOEcsWUFBTCxDQUFrQi9uSCxRQUFsQixDQUEyQjQyRyxRQUEzQixDQUFvQ25uSixLQUFwQyxDQUE0Q3d6SixZQUFZM3lILE9BQXhELENBQ0EsS0FBS3llLFFBQUwsQ0FBZ0IsS0FBS2c1RyxZQUFyQixDQUVBLEdBQUksS0FBS3RnQixNQUFULENBQWlCO0VBRWZrZSxXQUFXejNHLGlCQUFYLENBQTZCL29DLENBQTdCLEVBQ0E0dEMsR0FBR3I3QixJQUFILENBQVFpdUksV0FBV2ppSSxRQUFuQixFQUE2QjFMLEdBQTdCLENBQWlDNHZJLFNBQWpDLEVBQTZDO0VBRTdDLEdBQUl6aUosRUFBRWdtQixPQUFGLENBQVU0bkIsRUFBVixFQUFnQmkxRyxPQUFwQixDQUE2QjtFQUUzQmhvSCxTQUFTbWhILGNBQVQsQ0FBd0IxeEosS0FBeEIsQ0FBZ0NrMkosV0FBV2ppSSxRQUFYLENBQW9CbEssVUFBcEIsQ0FBK0JvdUksU0FBL0IsQ0FBaEMsQ0FBMkU7RUFFM0U3QixlQUFlcnVJLElBQWYsQ0FBb0Jrd0ksU0FBcEIsRUFBK0IzOUgsT0FBL0IsQ0FBdUMwN0gsVUFBdkMsRUFDQWhySSxPQUFPbHJCLEtBQVAsQ0FBYTRWLENBQWIsQ0FBaUIsQ0FBQzBnSixlQUFlMWdKLENBQWYsQ0FBbUIsR0FBcEIsRUFBMkIsR0FBNUMsQ0FDQXNWLE9BQU9sckIsS0FBUCxDQUFhb21CLENBQWIsQ0FBaUIsQ0FBQ2t3SSxlQUFlbHdJLENBQWYsQ0FBbUIsR0FBcEIsRUFBMkIsR0FBNUMsQ0FDQW1xQixTQUFTNDJHLFFBQVQsQ0FBa0JubkosS0FBbEIsQ0FBMEJ3ekosWUFBWTN5SCxPQUF0QyxDQUNBLEtBQUt5ZSxRQUFMLENBQWdCKzRHLGlCQUFoQixDQUNELENBQUM7RUFHRixLQUFLbmtFLElBQUwsRUFBYXh0RCxNQUFRLEtBQUsweEgsS0FBMUIsQ0FDQXI4SCxPQUFPLzdCLEtBQVAsQ0FBZSxLQUFLazBGLElBQUwsQ0FBWXM5RCxTQUFTeHhKLEtBQXBDLENBRUEsR0FBSSs3QixPQUFPLzdCLEtBQVAsRUFBZ0IsQ0FBQ3V4SixVQUFVdnhKLEtBQVYsQ0FBa0J3eEosU0FBU3h4SixLQUE1QixFQUFxQyxDQUF6RCxDQUE0RCxDQUMxRCxLQUFLZzRJLE1BQUwsQ0FBYyxLQUFkLENBQ0QsQ0FDRixDQUVEeitFLFNBQVNxQixNQUFULENBQWdCLEtBQUtsQixLQUFyQixDQUE0QixLQUFLai9CLE1BQWpDLENBQXlDLEtBQUs2NEgsY0FBTCxDQUFzQixJQUF0QixDQUE2QkcsWUFBdEUsRUFDRCxDQUNEOzs7OztVQTFEeUIsQ0FpRXhCLENBQ0Qzd0osSUFBSyxTQURKLENBRUQ5QyxNQUFPLGdCQUFBLENBQWlCby9CLEtBQWpCLENBQXdCQyxNQUF4QixDQUFnQyxDQUNyQyxLQUFLZzVILGlCQUFMLENBQXVCOW5ILFFBQXZCLENBQWdDKzNDLE1BQWhDLENBQXVDdG9GLEtBQXZDLENBQStDby9CLE1BQVFDLE1BQXZELENBQ0QsQ0FKQSxDQWpFd0IsQ0FBM0IsRUF3RUFxM0csU0FBU3doQixhQUFULENBQXdCeEUsS0FBeEIsRUFFQSxvQkFBQSxDQUNELENBdEtELENBc0tFTixJQXRLRixDQUZBLENBMEtBO0VBQ0EsdUJBQXlCLCtLQUF6QixDQUVBO0VBQ0EscUJBQXVCLDR0aUVBQXZCLENBRUE7Ozs7O0tBT0EsMEJBRUEsU0FBVU0sS0FBVixDQUFpQjs7Ozs7T0FPZixpQkFBQSxDQUFrQjhFLFdBQWxCLENBQStCQyxTQUEvQixDQUEwQyxDQUN4QyxTQUFBLENBRUFwaUIsZUFBZSxJQUFmLENBQXFCcWlCLFFBQXJCLEVBRUFwcEUsTUFBUWluRCwwQkFBMEIsSUFBMUIsQ0FBZ0NOLGlCQUFpQnlpQixRQUFqQixFQUEyQno2SixJQUEzQixDQUFnQyxJQUFoQyxDQUFzQyxVQUF0QyxDQUFoQyxDQUFSLENBQ0E7Ozs7O1NBT0FxeEYsTUFBTXVtRSxTQUFOLENBQWtCLGFBQUEsQ0FBYyxDQUM5Qi83RixXQUFZLFNBQUEsQ0FBVSxRQUFWLENBRGtCLENBRTlCQyxXQUFZLEdBRmtCLENBQWQsQ0FBbEIsQ0FJQTs7Ozs7U0FPQXUxQixNQUFNcXBFLHNCQUFOLENBQStCLHFCQUFBLENBQXNCLENBQXRCLENBQXlCLENBQXpCLENBQTRCLENBQ3pEdDdILFVBQVdXLFlBRDhDLENBRXpEVixPQUFRc2lELFNBRmlELENBR3pENytDLGNBQWUsS0FIMEMsQ0FJekRELFlBQWEsS0FKNEMsQ0FBNUIsQ0FBL0IsQ0FNQXd1RCxNQUFNcXBFLHNCQUFOLENBQTZCOTNILE9BQTdCLENBQXFDeGhDLElBQXJDLENBQTRDLGlCQUE1QyxDQUNBaXdGLE1BQU1xcEUsc0JBQU4sQ0FBNkI5M0gsT0FBN0IsQ0FBcUN2QyxlQUFyQyxDQUF1RCxLQUF2RCxDQUNBOzs7OztTQU9BZ3hELE1BQU1zcEUsbUJBQU4sQ0FBNEJ0cEUsTUFBTXFwRSxzQkFBTixDQUE2QjN3SSxLQUE3QixFQUE1QixDQUNBc25FLE1BQU1zcEUsbUJBQU4sQ0FBMEIvM0gsT0FBMUIsQ0FBa0N4aEMsSUFBbEMsQ0FBeUMsY0FBekMsQ0FDQWl3RixNQUFNc3BFLG1CQUFOLENBQTBCLzNILE9BQTFCLENBQWtDdkQsTUFBbEMsQ0FBMkNZLFVBQTNDLENBQ0E7Ozs7O1NBT0FveEQsTUFBTXVwRSxrQkFBTixDQUEyQixzQkFBQSxFQUEzQixDQUNBOzs7OztTQU9BdnBFLE1BQU13cEUsZUFBTixDQUF3Qix1QkFBQSxFQUF4QixDQUNBeHBFLE1BQU13cEUsZUFBTixDQUFzQnZvSCxRQUF0QixDQUErQjQyRyxRQUEvQixDQUF3Q25uSixLQUF4QyxDQUFnRHN2RixNQUFNcXBFLHNCQUFOLENBQTZCOTNILE9BQTdFLENBQ0E7Ozs7O1NBT0F5dUQsTUFBTXlwRSxhQUFOLENBQXNCLFdBQUEsQ0FBWVAsV0FBWixDQUF0QixDQUNBbHBFLE1BQU15cEUsYUFBTixDQUFvQjE1SixJQUFwQixDQUEyQixhQUEzQixDQUNBaXdGLE1BQU15cEUsYUFBTixDQUFvQjM3SCxTQUFwQixDQUFnQ29FLGFBQWhDLENBQ0E4dEQsTUFBTXlwRSxhQUFOLENBQW9CMTdILFNBQXBCLENBQWdDbUUsYUFBaEMsQ0FDQTh0RCxNQUFNeXBFLGFBQU4sQ0FBb0J6N0gsTUFBcEIsQ0FBNkJZLFVBQTdCLENBQ0FveEQsTUFBTXlwRSxhQUFOLENBQW9CejZILGVBQXBCLENBQXNDLEtBQXRDLENBQ0FneEQsTUFBTXlwRSxhQUFOLENBQW9CL3RHLFdBQXBCLENBQWtDLElBQWxDLENBQ0Fza0MsTUFBTXlwRSxhQUFOLENBQW9CdjZILEtBQXBCLENBQTRCLEtBQTVCLENBQ0E4d0QsTUFBTXdwRSxlQUFOLENBQXNCdm9ILFFBQXRCLENBQStCbWlILE9BQS9CLENBQXVDMXlKLEtBQXZDLENBQStDc3ZGLE1BQU15cEUsYUFBckQsQ0FDQTs7Ozs7U0FPQXpwRSxNQUFNMHBFLFdBQU4sQ0FBb0IsV0FBQSxDQUFZUCxTQUFaLENBQXBCLENBQ0FucEUsTUFBTTBwRSxXQUFOLENBQWtCMzVKLElBQWxCLENBQXlCLFdBQXpCLENBQ0Fpd0YsTUFBTTBwRSxXQUFOLENBQWtCMzdILFNBQWxCLENBQThCVyxZQUE5QixDQUNBc3hELE1BQU0wcEUsV0FBTixDQUFrQjE3SCxNQUFsQixDQUEyQlksVUFBM0IsQ0FDQW94RCxNQUFNMHBFLFdBQU4sQ0FBa0IxNkgsZUFBbEIsQ0FBb0MsS0FBcEMsQ0FDQWd4RCxNQUFNMHBFLFdBQU4sQ0FBa0JodUcsV0FBbEIsQ0FBZ0MsSUFBaEMsQ0FDQXNrQyxNQUFNMHBFLFdBQU4sQ0FBa0J4NkgsS0FBbEIsQ0FBMEIsS0FBMUIsQ0FDQTh3RCxNQUFNd3BFLGVBQU4sQ0FBc0J2b0gsUUFBdEIsQ0FBK0JraUgsS0FBL0IsQ0FBcUN6eUosS0FBckMsQ0FBNkNzdkYsTUFBTTBwRSxXQUFuRCxDQUNBOzs7OztTQU9BMXBFLE1BQU0ycEUsYUFBTixDQUFzQixxQkFBQSxFQUF0QixDQUNBM3BFLE1BQU0ycEUsYUFBTixDQUFvQjFvSCxRQUFwQixDQUE2QnVoSCxRQUE3QixDQUFzQzl4SixLQUF0QyxDQUE4Q3N2RixNQUFNc3BFLG1CQUFOLENBQTBCLzNILE9BQXhFLENBQ0EsWUFBQSxDQUNELENBQ0Q7Ozs7Ozs7O09BV0EyMkcsWUFBWWtoQixRQUFaLENBQXNCLENBQUMsQ0FDckI1MUosSUFBSyxRQURnQixDQUVyQjlDLE1BQU8sZUFBQSxDQUFnQnU1RCxRQUFoQixDQUEwQmk2RixXQUExQixDQUF1Q0MsWUFBdkMsQ0FBcUQvc0gsS0FBckQsQ0FBNERpd0MsV0FBNUQsQ0FBeUU7RUFFOUUsS0FBS3IzQixRQUFMLENBQWdCLEtBQUt1NUcsa0JBQXJCLENBQ0EsS0FBS0Esa0JBQUwsQ0FBd0J0b0gsUUFBeEIsQ0FBaUM0MkcsUUFBakMsQ0FBMENubkosS0FBMUMsQ0FBa0R3ekosWUFBWTN5SCxPQUE5RCxDQUNBLEtBQUtnMUgsU0FBTCxDQUFlajdGLE1BQWYsQ0FBc0JyQixRQUF0QixDQUFnQyxLQUFLby9GLHNCQUFyQyxFQUNBcC9GLFNBQVNxQixNQUFULENBQWdCLEtBQUtsQixLQUFyQixDQUE0QixLQUFLai9CLE1BQWpDLENBQXlDLEtBQUtrK0gsc0JBQTlDLEVBQXVFO0VBRXZFLEtBQUtyNUcsUUFBTCxDQUFnQixLQUFLdzVHLGVBQXJCLENBQ0F2L0YsU0FBU3FCLE1BQVQsQ0FBZ0IsS0FBS2xCLEtBQXJCLENBQTRCLEtBQUtqL0IsTUFBakMsQ0FBeUMsS0FBS20rSCxtQkFBOUMsRUFBb0U7RUFFcEUsS0FBS3Q1RyxRQUFMLENBQWdCLEtBQUsyNUcsYUFBckIsQ0FDQSxLQUFLQSxhQUFMLENBQW1CMW9ILFFBQW5CLENBQTRCNDJHLFFBQTVCLENBQXFDbm5KLEtBQXJDLENBQTZDd3pKLFlBQVkzeUgsT0FBekQsQ0FDQTA0QixTQUFTcUIsTUFBVCxDQUFnQixLQUFLbEIsS0FBckIsQ0FBNEIsS0FBS2ovQixNQUFqQyxDQUF5QyxLQUFLNjRILGNBQUwsQ0FBc0IsSUFBdEIsQ0FBNkJHLFlBQXRFLEVBQ0QsQ0FDRDs7Ozs7VUFoQm9CLENBdUJuQixDQUNEM3dKLElBQUssU0FESixDQUVEOUMsTUFBTyxnQkFBQSxDQUFpQm8vQixLQUFqQixDQUF3QkMsTUFBeEIsQ0FBZ0MsQ0FDckMsS0FBS3M1SCxzQkFBTCxDQUE0QngzSCxPQUE1QixDQUFvQy9CLEtBQXBDLENBQTJDQyxNQUEzQyxFQUNBLEtBQUt1NUgsbUJBQUwsQ0FBeUJ6M0gsT0FBekIsQ0FBaUMvQixLQUFqQyxDQUF3Q0MsTUFBeEMsRUFDQSxLQUFLdzVILGtCQUFMLENBQXdCdG9ILFFBQXhCLENBQWlDbTNHLFNBQWpDLENBQTJDMW5KLEtBQTNDLENBQWlEaW9CLElBQWpELENBQXNELEtBQUs2d0ksZUFBTCxDQUFxQnZvSCxRQUFyQixDQUE4Qm0zRyxTQUE5QixDQUF3QzFuSixLQUF4QyxDQUE4Q2lvQixJQUE5QyxDQUFtRCxLQUFLZ3hJLGFBQUwsQ0FBbUIxb0gsUUFBbkIsQ0FBNEJtM0csU0FBNUIsQ0FBc0MxbkosS0FBdEMsQ0FBNEMyVCxHQUE1QyxDQUFnRCxJQUFNeXJCLEtBQXRELENBQTZELElBQU1DLE1BQW5FLENBQW5ELENBQXRELEVBQ0QsQ0FDRDs7Ozs7Ozs7Ozs7VUE5Qm9CLENBQXRCLENBMkNJLENBQUMsQ0FDSHY4QixJQUFLLG9CQURGLENBRUhpRSxJQUFLLFlBQUEsRUFBZSxDQUNsQix5QkFBQSxDQUNELENBQ0Q7Ozs7Ozs7Ozs7O1VBTEUsQ0FrQkQsQ0FDRGpFLElBQUssa0JBREosQ0FFRGlFLElBQUssWUFBQSxFQUFlLENBQ2xCLHVCQUFBLENBQ0QsQ0FKQSxDQWxCQyxDQTNDSixFQW9FQTJ2SSxTQUFTZ2lCLFFBQVQsQ0FBbUJoRixLQUFuQixFQUVBLGVBQUEsQ0FDRCxDQTlMRCxDQThMRU4sSUE5TEYsQ0FGQSxDQWtNQTs7S0FJQSw2QkFFQSxTQUFVTSxLQUFWLENBQWlCOzs7Ozs7T0FRZixvQkFBQSxDQUFxQjd5SCxPQUFyQixDQUE4QixDQUM1QixTQUFBLENBRUEsWUFBY242QixVQUFVMUQsTUFBVixDQUFtQixDQUFuQixFQUF3QjBELFVBQVUsQ0FBVixJQUFpQi9FLFNBQXpDLENBQXFEK0UsVUFBVSxDQUFWLENBQXJELENBQW9FLEdBQWxGLENBQ0EsZUFBaUJBLFVBQVUxRCxNQUFWLENBQW1CLENBQW5CLEVBQXdCMEQsVUFBVSxDQUFWLElBQWlCL0UsU0FBekMsQ0FBcUQrRSxVQUFVLENBQVYsQ0FBckQsQ0FBb0UsSUFBckYsQ0FFQTJ2SSxlQUFlLElBQWYsQ0FBcUI2aUIsV0FBckIsRUFFQTVwRSxNQUFRaW5ELDBCQUEwQixJQUExQixDQUFnQ04saUJBQWlCaWpCLFdBQWpCLEVBQThCajdKLElBQTlCLENBQW1DLElBQW5DLENBQXlDLGFBQXpDLENBQWhDLENBQVIsQ0FDQXF4RixNQUFNaHdDLFFBQU4sQ0FBaUIsbUJBQUEsQ0FBb0Irb0csVUFBcEIsQ0FBakIsQ0FDQS80RCxNQUFNenVELE9BQU4sQ0FBZ0JBLE9BQWhCLENBQ0F5dUQsTUFBTTZwRSxhQUFOLENBQXNCcG1ILE9BQXRCLENBQ0EsWUFBQSxDQUNELENBQ0Q7Ozs7T0FPQXlrRyxZQUFZMGhCLFdBQVosQ0FBeUIsQ0FBQyxDQUN4QnAySixJQUFLLFFBRG1COzs7Ozs7OztTQVl4QjlDLE1BQU8sZUFBQSxDQUFnQnU1RCxRQUFoQixDQUEwQmk2RixXQUExQixDQUF1Q0MsWUFBdkMsQ0FBcUQvc0gsS0FBckQsQ0FBNERpd0MsV0FBNUQsQ0FBeUUsQ0FDOUUsS0FBS3IzQixRQUFMLENBQWMvTyxRQUFkLENBQXVCdTNHLFFBQXZCLENBQWdDOW5KLEtBQWhDLENBQXdDd3pKLFlBQVkzeUgsT0FBcEQsQ0FDQTA0QixTQUFTcUIsTUFBVCxDQUFnQixLQUFLbEIsS0FBckIsQ0FBNEIsS0FBS2ovQixNQUFqQyxDQUF5QyxLQUFLNjRILGNBQUwsQ0FBc0IsSUFBdEIsQ0FBNkJHLFlBQXRFLEVBQ0QsQ0FmdUIsQ0FBRCxDQWdCdEIsQ0FDRDN3SixJQUFLLFNBREosQ0FFRGlFLElBQUssWUFBQSxFQUFlLENBQ2xCLFlBQVl1NEMsUUFBTCxDQUFjL08sUUFBZCxDQUF1QnczRyxRQUF2QixDQUFnQy9uSixLQUF2QyxDQUNELENBQ0Q7O1VBSUEyVCxJQUFLLFlBQUEsQ0FBYTNULEtBQWIsQ0FBb0IsQ0FDdkIsS0FBS3MvQyxRQUFMLENBQWMvTyxRQUFkLENBQXVCdzNHLFFBQXZCLENBQWdDL25KLEtBQWhDLENBQXdDQSxLQUF4QyxDQUNELENBQ0Q7Ozs7OztVQTVCdUIsQ0FvQ3RCLENBQ0Q4QyxJQUFLLG9CQURKLENBRURpRSxJQUFLLFlBQUEsRUFBZSxDQUNsQixZQUFZdTRDLFFBQUwsQ0FBYy9PLFFBQWQsQ0FBdUJ5M0csUUFBdkIsQ0FBZ0Nob0osS0FBdkMsQ0FDRCxDQUNEOztVQUlBMlQsSUFBSyxZQUFBLEVBQWUsQ0FDbEIsVUFBWWpOLFVBQVUxRCxNQUFWLENBQW1CLENBQW5CLEVBQXdCMEQsVUFBVSxDQUFWLElBQWlCL0UsU0FBekMsQ0FBcUQrRSxVQUFVLENBQVYsQ0FBckQsQ0FBb0UsR0FBaEYsQ0FDQSxLQUFLNDRDLFFBQUwsQ0FBYy9PLFFBQWQsQ0FBdUJ5M0csUUFBdkIsQ0FBZ0Nob0osS0FBaEMsQ0FBd0NBLEtBQXhDLENBQ0QsQ0FDRDs7Ozs7O1VBakR1QixDQXlEdEIsQ0FDRDhDLElBQUssZUFESixDQUVEaUUsSUFBSyxZQUFBLEVBQWUsQ0FDbEIsWUFBWXU0QyxRQUFMLENBQWMvTyxRQUFkLENBQXVCMDNHLFFBQXZCLENBQWdDam9KLEtBQXZDLENBQ0QsQ0FDRDs7VUFJQTJULElBQUssWUFBQSxFQUFlLENBQ2xCLFVBQVlqTixVQUFVMUQsTUFBVixDQUFtQixDQUFuQixFQUF3QjBELFVBQVUsQ0FBVixJQUFpQi9FLFNBQXpDLENBQXFEK0UsVUFBVSxDQUFWLENBQXJELENBQW9FLEdBQWhGLENBQ0EsS0FBSzQ0QyxRQUFMLENBQWMvTyxRQUFkLENBQXVCMDNHLFFBQXZCLENBQWdDam9KLEtBQWhDLENBQXdDQSxLQUF4QyxDQUNELENBWkEsQ0F6RHNCLENBQXpCLEVBd0VBMDJJLFNBQVN3aUIsV0FBVCxDQUFzQnhGLEtBQXRCLEVBRUEsa0JBQUEsQ0FDRCxDQXhHRCxDQXdHRU4sSUF4R0YsQ0FGQSxDQTRHQTs7Ozs7Ozs7OztLQVlBLGlDQUVBLFNBQVVNLEtBQVYsQ0FBaUI7Ozs7Ozs7T0FTZix3QkFBQSxFQUEyQixDQUN6QixTQUFBLENBRUEsWUFBY2h0SixVQUFVMUQsTUFBVixDQUFtQixDQUFuQixFQUF3QjBELFVBQVUsQ0FBVixJQUFpQi9FLFNBQXpDLENBQXFEK0UsVUFBVSxDQUFWLENBQXJELENBQW9FLEVBQWxGLENBRUEydkksZUFBZSxJQUFmLENBQXFCK2lCLGVBQXJCLEVBRUE5cEUsTUFBUWluRCwwQkFBMEIsSUFBMUIsQ0FBZ0NOLGlCQUFpQm1qQixlQUFqQixFQUFrQ243SixJQUFsQyxDQUF1QyxJQUF2QyxDQUE2QyxpQkFBN0MsQ0FBaEMsQ0FBUixDQUNBOzs7Ozs7U0FRQXF4RixNQUFNK3BFLHNCQUFOLENBQStCLHFCQUFBLENBQXNCLENBQXRCLENBQXlCLENBQXpCLENBQTRCLENBQ3pEaDhILFVBQVdZLHdCQUQ4QyxDQUV6RGIsVUFBV1ksWUFGOEMsQ0FHekRWLE9BQVFzaUQsU0FIaUQsQ0FJekQ3K0MsY0FBZSxLQUowQyxDQUt6REQsWUFBYSxLQUw0QyxDQUE1QixDQUEvQixDQU9Bd3VELE1BQU0rcEUsc0JBQU4sQ0FBNkJ4NEgsT0FBN0IsQ0FBcUN4aEMsSUFBckMsQ0FBNEMsd0JBQTVDLENBQ0E7Ozs7O1NBT0Fpd0YsTUFBTWdxRSxtQkFBTixDQUE0QmhxRSxNQUFNK3BFLHNCQUFOLENBQTZCcnhJLEtBQTdCLEVBQTVCLENBQ0FzbkUsTUFBTWdxRSxtQkFBTixDQUEwQno0SCxPQUExQixDQUFrQ3hoQyxJQUFsQyxDQUF5QywrQkFBekMsQ0FDQWl3RixNQUFNZ3FFLG1CQUFOLENBQTBCejRILE9BQTFCLENBQWtDdkMsZUFBbEMsQ0FBb0QsS0FBcEQsQ0FDQWd4RCxNQUFNZ3FFLG1CQUFOLENBQTBCejRILE9BQTFCLENBQWtDeEQsU0FBbEMsQ0FBOENXLFlBQTlDLENBQ0E7Ozs7O1NBT0FzeEQsTUFBTWlxRSxvQkFBTixDQUE2QmpxRSxNQUFNZ3FFLG1CQUFOLENBQTBCdHhJLEtBQTFCLEVBQTdCLENBQ0FzbkUsTUFBTWlxRSxvQkFBTixDQUEyQjE0SCxPQUEzQixDQUFtQ3hoQyxJQUFuQyxDQUEwQyxnQ0FBMUMsQ0FDQTs7Ozs7U0FPQWl3RixNQUFNZ3BFLFlBQU4sQ0FBcUIsZ0JBQUEsRUFBckIsQ0FDQTs7Ozs7U0FPQWhwRSxNQUFNaWxFLGtCQUFOLENBQTJCLHNCQUFBLEVBQTNCLENBQ0FqbEUsTUFBTWlsRSxrQkFBTixDQUF5QmhrSCxRQUF6QixDQUFrQ2k5RyxXQUFsQyxDQUE4Q3h0SixLQUE5QyxDQUFzRHlnQyxRQUFRK3NILFdBQVIsR0FBd0I3ckosU0FBeEIsQ0FBb0M4K0IsUUFBUStzSCxXQUE1QyxDQUEwRCxHQUFoSCxDQUNBOzs7OztTQU9BbCtELE1BQU1rcUUsMEJBQU4sQ0FBbUMsOEJBQUEsRUFBbkMsQ0FDQWxxRSxNQUFNdXFCLFVBQU4sQ0FBbUJwNUUsUUFBUW81RSxVQUEzQixDQUNBOzs7OztTQU9BdnFCLE1BQU1tcUUsbUJBQU4sQ0FBNEIsdUJBQUEsRUFBNUIsQ0FDQW5xRSxNQUFNb3FFLFFBQU4sQ0FBaUJqNUgsUUFBUWk1SCxRQUF6QixDQUNBLFlBQUEsQ0FDRCxDQUNEOzs7O09BT0FsaUIsWUFBWTRoQixlQUFaLENBQTZCLENBQUMsQ0FDNUJ0MkosSUFBSyxRQUR1Qjs7Ozs7Ozs7U0FZNUI5QyxNQUFPLGVBQUEsQ0FBZ0J1NUQsUUFBaEIsQ0FBMEJpNkYsV0FBMUIsQ0FBdUNDLFlBQXZDLENBQXFEL3NILEtBQXJELENBQTREaXdDLFdBQTVELENBQXlFLENBQzlFLFVBQVksS0FBS2pkLEtBQWpCLENBQ0EsV0FBYSxLQUFLai9CLE1BQWxCLENBQ0EsK0JBQWlDLEtBQUsrK0gsMEJBQXRDLENBQ0EsdUJBQXlCLEtBQUtqRixrQkFBOUIsQ0FDQSx3QkFBMEIsS0FBS2tGLG1CQUEvQixDQUNBLGlCQUFtQixLQUFLbkIsWUFBeEIsQ0FDQSx5QkFBMkIsS0FBS2lCLG9CQUFoQyxDQUNBLDJCQUE2QixLQUFLRixzQkFBbEMsQ0FDQSx3QkFBMEIsS0FBS0MsbUJBQS9CLENBRUEsR0FBSSxLQUFLSSxRQUFULENBQW1CO0VBRWpCLEtBQUtwNkcsUUFBTCxDQUFnQmkxRyxrQkFBaEIsQ0FDQUEsbUJBQW1CaGtILFFBQW5CLENBQTRCNDJHLFFBQTVCLENBQXFDbm5KLEtBQXJDLENBQTZDd3pKLFlBQVkzeUgsT0FBekQsQ0FDQTA0QixTQUFTcUIsTUFBVCxDQUFnQmxCLEtBQWhCLENBQXVCai9CLE1BQXZCLENBQStCNCtILHNCQUEvQixFQUF3RDtFQUV4RCxLQUFLLzVHLFFBQUwsQ0FBZ0JrNkcsMEJBQWhCLENBQ0FBLDJCQUEyQmpwSCxRQUEzQixDQUFvQzdKLEtBQXBDLENBQTBDMW1DLEtBQTFDLENBQWtEMG1DLEtBQWxELENBQ0E4eUgsMkJBQTJCanBILFFBQTNCLENBQW9DaTJHLFlBQXBDLENBQWlEeG1KLEtBQWpELENBQXlEdTVKLHFCQUFxQjE0SCxPQUE5RSxDQUNBMjRILDJCQUEyQmpwSCxRQUEzQixDQUFvQ2syRyxXQUFwQyxDQUFnRHptSixLQUFoRCxDQUF3RHE1Six1QkFBdUJ4NEgsT0FBL0UsQ0FDQTA0QixTQUFTcUIsTUFBVCxDQUFnQmxCLEtBQWhCLENBQXVCai9CLE1BQXZCLENBQStCNitILG1CQUEvQixFQUFxRDtFQUVyRCxLQUFLaDZHLFFBQUwsQ0FBZ0JnNUcsWUFBaEIsQ0FDQUEsYUFBYS9uSCxRQUFiLENBQXNCNDJHLFFBQXRCLENBQStCbm5KLEtBQS9CLENBQXVDczVKLG9CQUFvQno0SCxPQUEzRCxDQUNBMDRCLFNBQVNxQixNQUFULENBQWdCbEIsS0FBaEIsQ0FBdUJqL0IsTUFBdkIsQ0FBK0I4K0gsb0JBQS9CLEVBQ0QsQ0FBQztFQUdGLEtBQUtqNkcsUUFBTCxDQUFnQm02RyxtQkFBaEIsQ0FDQUEsb0JBQW9CbHBILFFBQXBCLENBQTZCNDJHLFFBQTdCLENBQXNDbm5KLEtBQXRDLENBQThDd3pKLFlBQVkzeUgsT0FBMUQsQ0FDQTA0QixTQUFTcUIsTUFBVCxDQUFnQixLQUFLbEIsS0FBckIsQ0FBNEIsS0FBS2ovQixNQUFqQyxDQUF5QyxLQUFLNjRILGNBQUwsQ0FBc0IsSUFBdEIsQ0FBNkJHLFlBQXRFLEVBQ0QsQ0FDRDs7Ozs7VUE3QzJCLENBb0QxQixDQUNEM3dKLElBQUssWUFESixDQUVEOUMsTUFBTyxtQkFBQSxDQUFvQnU1RCxRQUFwQixDQUE4Qmx2QyxLQUE5QixDQUFxQyxDQUMxQyxLQUFLaTFCLFFBQUwsQ0FBZ0IscUJBQUEsQ0FBc0IsQ0FDcEMvTixNQUFPLFFBRDZCLENBQXRCLENBQWhCLENBR0Fnb0IsU0FBU3FCLE1BQVQsQ0FBZ0IsS0FBS2xCLEtBQXJCLENBQTRCLEtBQUtqL0IsTUFBakMsQ0FBeUMsS0FBSzgrSCxvQkFBOUMsRUFDQSxLQUFLajZHLFFBQUwsQ0FBY3hmLE9BQWQsR0FDRCxDQVJBLENBcEQwQixDQTZEMUIsQ0FDRGg5QixJQUFLLFlBREosQ0FFRGlFLElBQUssWUFBQSxFQUFlLENBQ2xCLFlBQVlzeUosc0JBQUwsQ0FBNEJqNkgsS0FBbkMsQ0FDRCxDQUNEOzs7O1VBTUF6ckIsSUFBSyxZQUFBLEVBQWUsQ0FDbEIsVUFBWWpOLFVBQVUxRCxNQUFWLENBQW1CLENBQW5CLEVBQXdCMEQsVUFBVSxDQUFWLElBQWlCL0UsU0FBekMsQ0FBcUQrRSxVQUFVLENBQVYsQ0FBckQsQ0FBb0UsR0FBaEYsQ0FDQTtFQUNBLGFBQWV4QixLQUFLOEUsR0FBTCxDQUFTLENBQVQsQ0FBWTlFLEtBQUtDLElBQUwsQ0FBVUQsS0FBS3kwSixJQUFMLENBQVUzNUosS0FBVixDQUFWLENBQVosQ0FBZixDQUNBQSxNQUFRa0YsS0FBSzJlLEdBQUwsQ0FBUyxDQUFULENBQVkyOEgsUUFBWixDQUFSLENBQ0EsS0FBSzZZLHNCQUFMLENBQTRCbDRILE9BQTVCLENBQW9DbmhDLEtBQXBDLENBQTJDQSxLQUEzQyxFQUNBLEtBQUt1NUosb0JBQUwsQ0FBMEJwNEgsT0FBMUIsQ0FBa0NuaEMsS0FBbEMsQ0FBeUNBLEtBQXpDLEVBQ0EsS0FBS3M1SixtQkFBTCxDQUF5Qm40SCxPQUF6QixDQUFpQ25oQyxLQUFqQyxDQUF3Q0EsS0FBeEMsRUFDQSxLQUFLdzVKLDBCQUFMLENBQWdDaG9HLE9BQWhDLENBQXdDKzBGLGFBQXhDLENBQXdEL0YsU0FBUzhELE9BQVQsQ0FBaUIsQ0FBakIsQ0FBeEQsQ0FDQSxLQUFLa1YsMEJBQUwsQ0FBZ0N4dUcsV0FBaEMsQ0FBOEMsSUFBOUMsQ0FDRCxDQUNEOzs7OztVQW5GMkIsQ0EwRjFCLENBQ0Rsb0QsSUFBSyxVQURKLENBRURpRSxJQUFLLFlBQUEsRUFBZSxDQUNsQixZQUFZMHlKLG1CQUFMLENBQXlCam9HLE9BQXpCLENBQWlDb29HLGlCQUFqQyxHQUF1RGo0SixTQUE5RCxDQUNELENBQ0Q7Ozs7VUFNQWdTLElBQUssWUFBQSxFQUFlLENBQ2xCLFVBQVlqTixVQUFVMUQsTUFBVixDQUFtQixDQUFuQixFQUF3QjBELFVBQVUsQ0FBVixJQUFpQi9FLFNBQXpDLENBQXFEK0UsVUFBVSxDQUFWLENBQXJELENBQW9FLElBQWhGLENBRUEsR0FBSTFHLEtBQUosQ0FBVyxDQUNULEtBQUt5NUosbUJBQUwsQ0FBeUJqb0csT0FBekIsQ0FBaUNvb0csaUJBQWpDLENBQXFELEdBQXJELENBQ0EsS0FBS0gsbUJBQUwsQ0FBeUJscEgsUUFBekIsQ0FBa0N1aUgsWUFBbEMsQ0FBK0M5eUosS0FBL0MsQ0FBdUQsS0FBS3M1SixtQkFBTCxDQUF5Qno0SCxPQUFoRixDQUNELENBSEQsSUFHTyxDQUNMLFlBQVk0NEgsbUJBQUwsQ0FBeUJqb0csT0FBekIsQ0FBaUNvb0csaUJBQXhDLENBQ0EsS0FBS0gsbUJBQUwsQ0FBeUJscEgsUUFBekIsQ0FBa0N1aUgsWUFBbEMsQ0FBK0M5eUosS0FBL0MsQ0FBdUQsSUFBdkQsQ0FDRCxDQUVELEtBQUt5NUosbUJBQUwsQ0FBeUJ6dUcsV0FBekIsQ0FBdUMsSUFBdkMsQ0FDRCxDQUNEOzs7O1VBbEgyQixDQXdIMUIsQ0FDRGxvRCxJQUFLLFdBREosQ0FFRGlFLElBQUssWUFBQSxFQUFlLENBQ2xCLFlBQVkweUosbUJBQUwsQ0FBeUI1cEcsU0FBaEMsQ0FDRCxDQUNEOzs7O1VBTUFsOEMsSUFBSyxZQUFBLENBQWEzVCxLQUFiLENBQW9CLENBQ3ZCLEdBQUksS0FBSzZ2RCxTQUFMLEdBQW1CN3ZELEtBQXZCLENBQThCLENBQzVCLEtBQUt5NUosbUJBQUwsQ0FBeUI1cEcsU0FBekIsQ0FBcUM3dkQsS0FBckMsQ0FDQSxLQUFLeTVKLG1CQUFMLENBQXlCenVHLFdBQXpCLENBQXVDLElBQXZDLENBQ0QsQ0FDRixDQWhCQSxDQXhIMEIsQ0FBN0IsRUEySUEwckYsU0FBUzBpQixlQUFULENBQTBCMUYsS0FBMUIsRUFFQSxzQkFBQSxDQUNELENBL09ELENBK09FTixJQS9PRixDQUZBLENBbVBBOzs7Ozs7Ozs7Ozs7Ozs7O0tBb0JBLGdDQUVBLFVBQVk7Ozs7Ozs7O09BVVYsdUJBQUEsRUFBMEIsQ0FDeEIsYUFBZTFzSixVQUFVMUQsTUFBVixDQUFtQixDQUFuQixFQUF3QjBELFVBQVUsQ0FBVixJQUFpQi9FLFNBQXpDLENBQXFEK0UsVUFBVSxDQUFWLENBQXJELENBQW9FLElBQW5GLENBQ0EsWUFBY0EsVUFBVTFELE1BQVYsQ0FBbUIsQ0FBbkIsRUFBd0IwRCxVQUFVLENBQVYsSUFBaUIvRSxTQUF6QyxDQUFxRCtFLFVBQVUsQ0FBVixDQUFyRCxDQUFvRSxFQUFsRixDQUVBMnZJLGVBQWUsSUFBZixDQUFxQndqQixjQUFyQixFQUVBOzs7Ozs7O1NBUUEsS0FBS3RnRyxRQUFMLENBQWdCQSxRQUFoQixDQUNBOzs7Ozs7OztTQVVBLEtBQUtpNkYsV0FBTCxDQUFtQixJQUFuQixDQUNBOzs7OztTQU9BLEtBQUtDLFlBQUwsQ0FBb0IsSUFBcEIsQ0FFQSxHQUFJLEtBQUtsNkYsUUFBTCxHQUFrQixJQUF0QixDQUE0QixDQUMxQixLQUFLQSxRQUFMLENBQWNTLFNBQWQsQ0FBMEIsS0FBMUIsQ0FDQSxLQUFLdzVGLFdBQUwsQ0FBbUIsS0FBS2w2RyxZQUFMLENBQWtCN1ksUUFBUUssV0FBUixHQUF3Qm4vQixTQUF4QixDQUFvQzgrQixRQUFRSyxXQUE1QyxDQUEwRCxJQUE1RSxDQUFrRkwsUUFBUU0sYUFBUixHQUEwQnAvQixTQUExQixDQUFzQzgrQixRQUFRTSxhQUE5QyxDQUE4RCxLQUFoSixDQUF1Sk4sUUFBUU8sWUFBUixHQUF5QnIvQixTQUF6QixDQUFxQzgrQixRQUFRTyxZQUE3QyxDQUE0RCxLQUFuTixDQUFuQixDQUNBLEtBQUt5eUgsWUFBTCxDQUFvQixLQUFLRCxXQUFMLENBQWlCeHJJLEtBQWpCLEVBQXBCLENBQ0QsQ0FDRDs7Ozs7U0FRQSxLQUFLbXZJLFFBQUwsQ0FBZ0IsY0FBQSxDQUFlLGdCQUFBLEVBQWYsQ0FBaEIsQ0FDQTs7Ozs7U0FPQSxLQUFLMkMsTUFBTCxDQUFjLEVBQWQsQ0FDRCxDQUNEOzs7O09BT0F0aUIsWUFBWXFpQixjQUFaLENBQTRCLENBQUMsQ0FDM0IvMkosSUFBSyxpQkFEc0I7Ozs7Ozs7Ozs7OztTQWdCM0I5QyxNQUFPLHdCQUFBLENBQXlCdTVELFFBQXpCLENBQW1DLENBQ3hDLGdCQUFrQixLQUFLQSxRQUF2QixDQUNBLFVBQUEsQ0FBWXdnRyxPQUFaLENBQXFCQyxPQUFyQixDQUVBLEdBQUlDLGNBQWdCLElBQWhCLEVBQXdCQSxjQUFnQjFnRyxRQUE1QyxDQUFzRCxDQUNwRCxLQUFLQSxRQUFMLENBQWdCQSxRQUFoQixDQUNBLEtBQUtBLFFBQUwsQ0FBY1MsU0FBZCxDQUEwQixLQUExQixDQUNBM2xELE9BQVM0bEosWUFBWS9zRSxVQUFaLENBQXVCZ3RFLFVBQWhDLENBQ0FILFFBQVVFLFlBQVk5MkgsT0FBWixFQUFWLENBQ0E2MkgsUUFBVXpnRyxTQUFTcDJCLE9BQVQsRUFBVixDQUVBLEdBQUk5dUIsU0FBVyxJQUFmLENBQXFCLENBQ25CQSxPQUFPWixXQUFQLENBQW1Cd21KLFlBQVkvc0UsVUFBL0IsRUFDQTc0RSxPQUFPL0gsV0FBUCxDQUFtQml0RCxTQUFTMnpCLFVBQTVCLEVBQ0QsQ0FFRCxHQUFJNnNFLFFBQVEzNkgsS0FBUixHQUFrQjQ2SCxRQUFRNTZILEtBQTFCLEVBQW1DMjZILFFBQVExNkgsTUFBUixHQUFtQjI2SCxRQUFRMzZILE1BQWxFLENBQTBFLENBQ3hFLEtBQUs4QixPQUFMLEdBQ0QsQ0FDRixDQUVELGtCQUFBLENBQ0QsQ0FDRDs7Ozs7Ozs7Ozs7VUF2QzBCLENBb0R6QixDQUNEcitCLElBQUssY0FESixDQUVEOUMsTUFBTyxxQkFBQSxDQUFzQjhnQyxXQUF0QixDQUFtQ0MsYUFBbkMsQ0FBa0RDLFlBQWxELENBQWdFLENBQ3JFLHNCQUF3QixLQUFLdTRCLFFBQUwsQ0FBYzIyQixvQkFBZCxFQUF4QixDQUNBLFVBQVksS0FBSzMyQixRQUFMLENBQWMzN0QsT0FBZCxDQUFzQjh4RixvQkFBdEIsR0FBNkNybEUsS0FBekQsQ0FDQSxpQkFBbUIscUJBQUEsQ0FBc0I4dkksa0JBQWtCLzZILEtBQXhDLENBQStDKzZILGtCQUFrQjk2SCxNQUFqRSxDQUF5RSxDQUMxRmhDLFVBQVdXLFlBRCtFLENBRTFGWixVQUFXWSxZQUYrRSxDQUcxRlYsT0FBUWpULE1BQVE2VCxVQUFSLENBQXFCMGhELFNBSDZELENBSTFGOStDLFlBQWFBLFdBSjZFLENBSzFGQyxjQUFlQSxhQUwyRSxDQU0xRkMsYUFBY0EsYUFBZSxnQkFBQSxFQUFmLENBQW9DLElBTndDLENBQXpFLENBQW5CLENBU0EsR0FBSUEsY0FBZ0JELGFBQXBCLENBQW1DLENBQ2pDazlDLGFBQWFqOUMsWUFBYixDQUEwQjFELE1BQTFCLENBQW1DK2pELGtCQUFuQyxDQUNBcEQsYUFBYWo5QyxZQUFiLENBQTBCaGpDLElBQTFCLENBQWlDdWpGLGtCQUFqQyxDQUNELENBRUR0RCxhQUFhcDlDLE9BQWIsQ0FBcUJ4aEMsSUFBckIsQ0FBNEIsdUJBQTVCLENBQ0E0K0UsYUFBYXA5QyxPQUFiLENBQXFCdkMsZUFBckIsQ0FBdUMsS0FBdkMsQ0FDQSxtQkFBQSxDQUNELENBQ0Q7Ozs7O1VBM0UwQixDQWtGekIsQ0FDRHg3QixJQUFLLFNBREosQ0FFRDlDLE1BQU8sZ0JBQUEsQ0FBaUI0aUcsSUFBakIsQ0FBdUIzNEYsS0FBdkIsQ0FBOEIsQ0FDbkMsYUFBZSxLQUFLc3ZELFFBQXBCLENBQ0Esc0JBQXdCQSxTQUFTMjJCLG9CQUFULEVBQXhCLENBQ0EwUyxLQUFLemhFLE9BQUwsQ0FBYWc1SCxrQkFBa0IvNkgsS0FBL0IsQ0FBc0MrNkgsa0JBQWtCOTZILE1BQXhELEVBQ0F1akUsS0FBSzZ4RCxVQUFMLENBQWdCbDdGLFFBQWhCLENBQTBCQSxTQUFTMzdELE9BQVQsQ0FBaUI4eEYsb0JBQWpCLEdBQXdDcmxFLEtBQWxFLEVBRUEsR0FBSXBnQixRQUFVdEksU0FBZCxDQUF5QixDQUN2QixLQUFLbTRKLE1BQUwsQ0FBWW4xSSxNQUFaLENBQW1CMWEsS0FBbkIsQ0FBMEIsQ0FBMUIsQ0FBNkIyNEYsSUFBN0IsRUFDRCxDQUZELElBRU8sQ0FDTCxLQUFLazNELE1BQUwsQ0FBWXQzSixJQUFaLENBQWlCb2dHLElBQWpCLEVBQ0QsQ0FDRixDQUNEOzs7O1VBaEcwQixDQXNHekIsQ0FDRDkvRixJQUFLLFlBREosQ0FFRDlDLE1BQU8sbUJBQUEsQ0FBb0I0aUcsSUFBcEIsQ0FBMEIsQ0FDL0IsS0FBS2szRCxNQUFMLENBQVluMUksTUFBWixDQUFtQixLQUFLbTFJLE1BQUwsQ0FBWWoxSixPQUFaLENBQW9CKzlGLElBQXBCLENBQW5CLENBQThDLENBQTlDLEVBQ0QsQ0FDRDs7OztVQTNHMEIsQ0FpSHpCLENBQ0Q5L0YsSUFBSyxRQURKLENBRUQ5QyxNQUFPLGVBQUEsQ0FBZ0IwbUMsS0FBaEIsQ0FBdUIsQ0FDNUIsV0FBYSxLQUFLb3pILE1BQWxCLENBQ0EsYUFBZSxLQUFLM0MsUUFBcEIsQ0FDQSxhQUFlLEtBQUs1OUYsUUFBcEIsQ0FDQSxnQkFBa0IsS0FBS2k2RixXQUF2QixDQUNBLGlCQUFtQixLQUFLQyxZQUF4QixDQUNBLGdCQUFrQixLQUFsQixDQUNBLFFBQUEsQ0FBVTcxSixPQUFWLENBQW1CbUQsS0FBbkIsQ0FBMEJ5NEMsTUFBMUIsQ0FDQSxLQUFBLENBQU8xekMsQ0FBUCxDQUVBLElBQUt6QyxFQUFJLENBQUosQ0FBT3lDLEVBQUlnMEosT0FBTzkySixNQUF2QixDQUErQkssRUFBSXlDLENBQW5DLENBQXNDLEVBQUV6QyxDQUF4QyxDQUEyQyxDQUN6Q3UvRixLQUFPazNELE9BQU96MkosQ0FBUCxDQUFQLENBRUEsR0FBSXUvRixLQUFLdGlELE9BQVQsQ0FBa0IsQ0FDaEJzaUQsS0FBS2hvQyxNQUFMLENBQVlyQixRQUFaLENBQXNCaTZGLFdBQXRCLENBQW1DQyxZQUFuQyxDQUFpRC9zSCxLQUFqRCxDQUF3RGl3QyxXQUF4RCxFQUVBLEdBQUlpc0IsS0FBSzJ3RCxTQUFULENBQW9CLENBQ2xCLEdBQUk1OEUsV0FBSixDQUFpQixDQUNmd2dGLFNBQVM3RCxjQUFULENBQTBCMXdELEtBQUswd0QsY0FBL0IsQ0FDQTExSixRQUFVMjdELFNBQVMzN0QsT0FBbkIsQ0FDQW1ELE1BQVF3NEQsU0FBU3g0RCxLQUFqQixDQUF3QjtFQUV4QkEsTUFBTTA1QyxPQUFOLENBQWNtOUIsT0FBZCxDQUFzQjdCLE9BQXRCLENBQThCbjRFLFFBQVE0NEUsUUFBdEMsQ0FBZ0QsQ0FBaEQsQ0FBbUQsVUFBbkQsRUFDQTJnRixTQUFTdjhGLE1BQVQsQ0FBZ0JyQixRQUFoQixDQUEwQmk2RixXQUExQixDQUF1Q0MsWUFBdkMsQ0FBcUQvc0gsS0FBckQsQ0FBNERpd0MsV0FBNUQsRUFDQTUxRSxNQUFNMDVDLE9BQU4sQ0FBY205QixPQUFkLENBQXNCN0IsT0FBdEIsQ0FBOEJuNEUsUUFBUXk0RSxLQUF0QyxDQUE2QyxDQUE3QyxDQUFnRCxVQUFoRCxFQUNELENBRUQ3OEIsT0FBU2c2RyxXQUFULENBQ0FBLFlBQWNDLFlBQWQsQ0FDQUEsYUFBZWo2RyxNQUFmLENBQ0QsQ0FFRCxHQUFJb3BELHdCQUFKLENBQThCLENBQzVCanNCLFlBQWMsSUFBZCxDQUNELENBRkQsUUFFV2lzQiw2QkFBSixDQUFtQyxDQUN4Q2pzQixZQUFjLEtBQWQsQ0FDRCxDQUNGLENBQ0YsQ0FDRixDQUNEOzs7Ozs7Ozs7OztVQTNKMEIsQ0F3S3pCLENBQ0Q3ekUsSUFBSyxTQURKLENBRUQ5QyxNQUFPLGdCQUFBLENBQWlCby9CLEtBQWpCLENBQXdCQyxNQUF4QixDQUFnQyxDQUNyQyxXQUFhLEtBQUt5NkgsTUFBbEIsQ0FDQSxhQUFlLEtBQUt2Z0csUUFBcEIsQ0FDQSxRQUFBLENBQVU0Z0csaUJBQVYsQ0FDQSxLQUFBLENBQU9yMEosQ0FBUCxDQUVBLEdBQUlzNUIsUUFBVXo5QixTQUFWLEVBQXVCMDlCLFNBQVcxOUIsU0FBdEMsQ0FBaUQsQ0FDL0NpaEMsS0FBTzIyQixTQUFTcDJCLE9BQVQsRUFBUCxDQUNBL0QsTUFBUXdELEtBQUt4RCxLQUFiLENBQ0FDLE9BQVN1RCxLQUFLdkQsTUFBZCxDQUNELENBQUM7RUFHRms2QixTQUFTcDRCLE9BQVQsQ0FBaUIvQixLQUFqQixDQUF3QkMsTUFBeEIsRUFBaUM7RUFFakM4Nkgsa0JBQW9CNWdHLFNBQVMyMkIsb0JBQVQsRUFBcEIsQ0FDQSxLQUFLc2pFLFdBQUwsQ0FBaUJyeUgsT0FBakIsQ0FBeUJnNUgsa0JBQWtCLzZILEtBQTNDLENBQWtEKzZILGtCQUFrQjk2SCxNQUFwRSxFQUNBLEtBQUtvMEgsWUFBTCxDQUFrQnR5SCxPQUFsQixDQUEwQmc1SCxrQkFBa0IvNkgsS0FBNUMsQ0FBbUQrNkgsa0JBQWtCOTZILE1BQXJFLEVBRUEsSUFBS2g4QixFQUFJLENBQUosQ0FBT3lDLEVBQUlnMEosT0FBTzkySixNQUF2QixDQUErQkssRUFBSXlDLENBQW5DLENBQXNDLEVBQUV6QyxDQUF4QyxDQUEyQyxDQUN6Q3kySixPQUFPejJKLENBQVAsRUFBVTg5QixPQUFWLENBQWtCZzVILGtCQUFrQi82SCxLQUFwQyxDQUEyQys2SCxrQkFBa0I5NkgsTUFBN0QsRUFDRCxDQUNGLENBQ0Q7O1VBak0wQixDQXFNekIsQ0FDRHY4QixJQUFLLE9BREosQ0FFRDlDLE1BQU8sY0FBQSxFQUFpQixDQUN0QixpQkFBbUIsS0FBS3M1QyxZQUFMLENBQWtCLEtBQUtrNkcsV0FBTCxDQUFpQjF5SCxXQUFuQyxDQUFnRCxLQUFLMHlILFdBQUwsQ0FBaUJ6eUgsYUFBakUsQ0FBZ0YsS0FBS3l5SCxXQUFMLENBQWlCeHlILFlBQWpCLEdBQWtDLElBQWxILENBQW5CLENBQ0EsS0FBS2xCLE9BQUwsR0FBZ0I7RUFFaEIsS0FBSzB6SCxXQUFMLENBQW1CdjFFLFlBQW5CLENBQ0EsS0FBS3cxRSxZQUFMLENBQW9CeDFFLGFBQWFqMkQsS0FBYixFQUFwQixDQUNBLEtBQUttdkksUUFBTCxDQUFnQixjQUFBLENBQWUsZ0JBQUEsRUFBZixDQUFoQixDQUNELENBQ0Q7Ozs7O1VBL00wQixDQXNOekIsQ0FDRHIwSixJQUFLLFNBREosQ0FFRDlDLE1BQU8sZ0JBQUEsRUFBbUIsQ0FDeEIsV0FBYSxLQUFLODVKLE1BQWxCLENBQ0EsS0FBQSxDQUFPaDBKLENBQVAsQ0FFQSxJQUFLekMsRUFBSSxDQUFKLENBQU95QyxFQUFJZzBKLE9BQU85MkosTUFBdkIsQ0FBK0JLLEVBQUl5QyxDQUFuQyxDQUFzQyxFQUFFekMsQ0FBeEMsQ0FBMkMsQ0FDekN5MkosT0FBT3oySixDQUFQLEVBQVV5OEIsT0FBVixHQUNELENBRUQsS0FBS2c2SCxNQUFMLENBQWMsRUFBZCxDQUVBLEdBQUksS0FBS3RHLFdBQUwsR0FBcUIsSUFBekIsQ0FBK0IsQ0FDN0IsS0FBS0EsV0FBTCxDQUFpQjF6SCxPQUFqQixHQUNBLEtBQUswekgsV0FBTCxDQUFtQixJQUFuQixDQUNELENBRUQsR0FBSSxLQUFLQyxZQUFMLEdBQXNCLElBQTFCLENBQWdDLENBQzlCLEtBQUtBLFlBQUwsQ0FBa0IzekgsT0FBbEIsR0FDQSxLQUFLMnpILFlBQUwsQ0FBb0IsSUFBcEIsQ0FDRCxDQUVELEtBQUswRCxRQUFMLENBQWNyM0gsT0FBZCxHQUNELENBdkJBLENBdE55QixDQThPekIsQ0FDRGg5QixJQUFLLGNBREosQ0FFRGlFLElBQUssWUFBQSxFQUFlLENBQ2xCLFlBQVl5c0osV0FBTCxDQUFpQnh5SCxZQUF4QixDQUNELENBQ0Q7Ozs7Ozs7Ozs7VUFZQXJ0QixJQUFLLFlBQUEsQ0FBYWlDLENBQWIsQ0FBZ0IsQ0FDbkIsS0FBSzQ5SSxXQUFMLENBQWlCeHlILFlBQWpCLENBQWdDcHJCLENBQWhDLENBQ0EsS0FBSzY5SSxZQUFMLENBQWtCenlILFlBQWxCLENBQWlDcHJCLENBQWpDLENBQ0QsQ0FwQkEsQ0E5T3lCLENBQTVCLEVBcVFBLHFCQUFBLENBQ0QsQ0FqVkQsRUFGQSxDQXFWQSxhQUFlLGlCQUFBLENBQWtCL1MsTUFBbEIsQ0FBMEI1RCxNQUExQixDQUFrQyxDQUMvQyxhQUFleUgsVUFBVTFELE1BQVYsQ0FBbUIsQ0FBbkIsRUFBd0IwRCxVQUFVLENBQVYsSUFBaUIvRSxTQUF6QyxDQUFxRCtFLFVBQVUsQ0FBVixDQUFyRCxDQUFvRSxJQUFuRixDQUNBLEdBQUk3RCxPQUFPNUQsTUFBUCxDQUFKLENBQW9CLE9BQ3BCLEdBQUltN0osUUFBSixDQUFjOWhKLFFBQVE2UCxJQUFSLENBQWEsOEJBQThCbmQsTUFBOUIsQ0FBcUMvTCxNQUFyQyxDQUE2QyxtQkFBN0MsQ0FBYixDQUFnRjRELE1BQWhGLEVBRWRBLE9BQU81RCxNQUFQLEVBQWlCLFVBQVksRUFBN0IsQ0FDRCxDQU5ELENBT0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0tBMEJBLHFDQUVBLFVBQVksQ0FDViw0QkFBQSxFQUErQixDQUM3QixVQUFZLElBQVosQ0FFQSxXQUFheUgsVUFBVTFELE1BQVYsQ0FBbUIsQ0FBbkIsRUFBd0IwRCxVQUFVLENBQVYsSUFBaUIvRSxTQUF6QyxDQUFxRCtFLFVBQVUsQ0FBVixDQUFyRCxDQUFvRTJ6SixvQkFBb0I5ZSxRQUFyRyxDQUVBbEYsZUFBZSxJQUFmLENBQXFCZ2tCLG1CQUFyQixFQUVBNTVJLGlCQUFpQkEsaUJBQWlCLElBQWpCLENBQXVCLGFBQXZCLENBQXNDLElBQXRDLENBQWpCLENBQThELE9BQTlELENBQXVFLFdBQUEsQ0FBWSxTQUFVOWdCLE9BQVYsQ0FBbUIsQ0FDcEcydkYsTUFBTTN2RixPQUFOLENBQWdCQSxPQUFoQixDQUNELENBRnNFLENBQXZFLEVBSUEsS0FBSzI2SixLQUFMLENBQWFsK0QsT0FBT2srRCxLQUFwQixDQUNBLEtBQUtsK0QsTUFBTCxDQUFjQSxNQUFkLENBQ0QsQ0FFRG83QyxZQUFZNmlCLG1CQUFaLENBQWlDLENBQUMsQ0FDaEN2M0osSUFBSyxTQUQyQixDQUVoQzlDLE1BQU8sZ0JBQUEsQ0FBaUJ1OEksUUFBakIsQ0FBMkIsQ0FDaEMsV0FBYSxJQUFiLENBRUFBLFNBQVN1SSxNQUFULENBQWdCLGVBQWhCLEVBRUEsS0FBS1QsT0FBTCxDQUFlOUgsU0FBU25CLEdBQVQsQ0FBYSxXQUFiLEVBQTBCaUosT0FBekMsQ0FDQSxLQUFLOXFGLFFBQUwsQ0FBZ0JnakYsU0FBU3gxSSxHQUFULENBQWEsVUFBYixDQUFoQixDQUNBLEtBQUsyeUQsS0FBTCxDQUFhNmlGLFNBQVN4MUksR0FBVCxDQUFhLE9BQWIsQ0FBYixDQUNBLEtBQUswekIsTUFBTCxDQUFjOGhILFNBQVN4MUksR0FBVCxDQUFhLFFBQWIsQ0FBZCxDQUNBLEtBQUt3ekosUUFBTCxDQUFnQixrQkFBQSxDQUFtQixLQUFLaGhHLFFBQXhCLENBQWtDLEtBQUs2aUMsTUFBdkMsQ0FBaEIsQ0FFQW1nRCxTQUFTbkIsR0FBVCxDQUFhLFdBQWIsRUFBMEJ2M0ksSUFBMUIsR0FFQSxhQUFlLEtBQUswMkosUUFBcEIsQ0FDQSxLQUFLNVYsVUFBTCxDQUFrQixRQUFBLENBQVMsU0FBVW5GLEtBQVYsQ0FBaUIsQ0FDMUMsZ0JBQWdCNWtGLE1BQVQsQ0FBZ0I0a0YsTUFBTS9XLFFBQU4sRUFBaEIsQ0FBUCxDQUNELENBRmlCLEVBRWY1aEcsS0FGZSxDQUVUMDFHLFNBQVN6a0ksT0FGQSxDQUFsQixDQUlBeWtJLFNBQVN2bEgsTUFBVCxDQUFnQixDQUNkdWlDLFNBQVUsaUJBQUEsQ0FBa0JpWCxTQUFsQixDQUE2QixDQUNyQ3dtRSxPQUFPdWpCLFFBQVAsQ0FBZ0JDLGVBQWhCLENBQWdDaHFGLFNBQWhDLEVBQ0QsQ0FIYSxDQUlkOVcsTUFBTyxjQUFBLENBQWV1ckYsTUFBZixDQUF1QixDQUM1QmpPLE9BQU90OUUsS0FBUCxDQUFldXJGLE1BQWYsQ0FDRCxDQU5hLENBT2R4cUgsT0FBUSxlQUFBLENBQWdCeXFILE9BQWhCLENBQXlCLENBQy9CbE8sT0FBT3Y4RyxNQUFQLENBQWdCeXFILE9BQWhCLENBQ0QsQ0FUYSxDQUFoQixFQVlBLEtBQUt2bEosT0FBTCxHQUNELENBQ0Q7Ozs7O1VBbEMrQixDQXlDOUIsQ0FDRG1ELElBQUssUUFESixDQUVEOUMsTUFBTyxlQUFBLEVBQWtCLENBQ3ZCLFdBQWEsSUFBYixDQUVBLEtBQUs4UyxLQUFMLENBQVc3UyxJQUFYLENBQWdCLFVBQVksQ0FDMUIsU0FBVyxjQUFBLENBQWVtM0ksT0FBTzE5RSxLQUF0QixDQUE2QjA5RSxPQUFPMzhHLE1BQVAsQ0FBY3NoSCxNQUEzQyxDQUFYLENBQStEO0VBRS9EM0UsT0FBT21qQixRQUFQLENBQWdCRSxPQUFoQixDQUF3QjczRCxJQUF4QixFQUVBdzBDLE9BQU9zakIsV0FBUCxDQUFxQjkzRCxJQUFyQixDQUNELENBTkQsRUFPQSxXQUFBLENBQ0QsQ0FDRDs7Ozs7O1VBdkQrQixDQStEOUIsQ0FDRDkvRixJQUFLLE1BREosQ0FFRDlDLE1BQU8sYUFBQSxDQUFjMjZKLEtBQWQsQ0FBcUIsQ0FDMUIsV0FBYSxJQUFiLENBRUEsS0FBSzduSixLQUFMLENBQVc3UyxJQUFYLENBQWdCLFVBQVksQ0FDMUIyNkosU0FBU0QsS0FBVCxDQUFnQixTQUFoQixDQUEyQnhWLE9BQU9tVixLQUFsQyxFQUNBTSxTQUFTRCxLQUFULENBQWdCLFlBQWhCLENBQThCeFYsT0FBT21WLEtBQXJDLEVBRUFuVixPQUFPb1YsUUFBUCxDQUFnQkUsT0FBaEIsQ0FBd0JFLEtBQXhCLEVBRUF4VixPQUFPdVYsV0FBUCxDQUFxQkMsS0FBckIsQ0FDRCxDQVBELEVBUUEsV0FBQSxDQUNELENBQ0Q7Ozs7Ozs7VUE5RStCLENBdUY5QixDQUNENzNKLElBQUssUUFESixDQUVEOUMsTUFBTyxlQUFBLENBQWdCcy9DLFFBQWhCLENBQTBCLENBQy9CLFdBQWEsSUFBYixDQUVBLGNBQWdCNTRDLFVBQVUxRCxNQUFWLENBQW1CLENBQW5CLEVBQXdCMEQsVUFBVSxDQUFWLElBQWlCL0UsU0FBekMsQ0FBcUQrRSxVQUFVLENBQVYsQ0FBckQsQ0FBb0UsWUFBcEYsQ0FDQSxLQUFLb00sS0FBTCxDQUFXN1MsSUFBWCxDQUFnQixVQUFZLENBQzFCLEdBQUksQ0FBQ3EvQyxTQUFTL08sUUFBVCxDQUFrQnNtSCxTQUFsQixDQUFMLENBQW1DdjNHLFNBQVMvTyxRQUFULENBQWtCc21ILFNBQWxCLEVBQStCLENBQ2hFNzJKLE1BQU8sSUFEeUQsQ0FBL0IsQ0FHbkMsU0FBVyxjQUFBLENBQWVzL0MsUUFBZixDQUF5QnUzRyxTQUF6QixDQUFYLENBRUFnRSxPQUFPTixRQUFQLENBQWdCRSxPQUFoQixDQUF3QjczRCxJQUF4QixFQUVBaTRELE9BQU9ILFdBQVAsQ0FBcUI5M0QsSUFBckIsQ0FDRCxDQVRELEVBVUEsV0FBQSxDQUNELENBQ0Q7Ozs7OztVQXpHK0IsQ0FpSDlCLENBQ0Q5L0YsSUFBSyxLQURKLENBRUQ5QyxNQUFPLFlBQUEsQ0FBYVgsSUFBYixDQUFtQixDQUN4QixZQUFjLEtBQUtrN0osUUFBTCxDQUFjVCxNQUFkLENBQXFCdDVJLE1BQXJCLENBQTRCLFNBQVVvaUYsSUFBVixDQUFnQixDQUN4RCxZQUFZdmpHLElBQUwsR0FBY0EsSUFBckIsQ0FDRCxDQUZhLEVBRVgsQ0FGVyxDQUFQLENBRUMsS0FBS3E3SixXQUZiLENBR0QsQ0FDRDs7Ozs7O1VBeEgrQixDQWdJOUIsQ0FDRDUzSixJQUFLLGdCQURKLENBRUQ5QyxNQUFPLHVCQUFBLEVBQTBCLENBQy9CLFdBQWEsSUFBYixDQUVBLFNBQVcwRyxVQUFVMUQsTUFBVixDQUFtQixDQUFuQixFQUF3QjBELFVBQVUsQ0FBVixJQUFpQi9FLFNBQXpDLENBQXFEK0UsVUFBVSxDQUFWLENBQXJELENBQW9FLElBQS9FLENBQ0EsS0FBS29NLEtBQUwsQ0FBVzdTLElBQVgsQ0FBZ0IsVUFBWSxDQUMxQjY2SixPQUFPSixXQUFQLENBQW1CcEgsY0FBbkIsQ0FBb0N5SCxJQUFwQyxDQUNELENBRkQsRUFHQSxXQUFBLENBQ0QsQ0FWQSxDQWhJOEIsQ0FBakMsRUE2SUEsMEJBQUEsQ0FDRCxDQTlKRCxFQUZBLENBa0tBdDZJLGlCQUFpQjQ1SSxtQkFBakIsQ0FBc0MsVUFBdEMsQ0FBa0QsQ0FDaERDLE1BQU8sSUFEeUMsQ0FBbEQsRUFJQTs7Ozs7S0FNQSxtQ0FFQSxVQUFZLENBQ1YsMEJBQUEsRUFBNkIsQ0FDM0Jqa0IsZUFBZSxJQUFmLENBQXFCMmtCLGlCQUFyQixFQUNELENBRUR4akIsWUFBWXdqQixpQkFBWixDQUErQixDQUFDLENBQzlCbDRKLElBQUssU0FEeUIsQ0FFOUI5QyxNQUFPLGdCQUFBLENBQWlCdThJLFFBQWpCLENBQTJCLENBQ2hDQSxTQUFTdUksTUFBVCxDQUFnQixRQUFoQixFQUVBLEtBQUs1bEcsT0FBTCxDQUFlcTlGLFNBQVN4MUksR0FBVCxDQUFhLFVBQWIsRUFBeUJtbUYsVUFBeEMsQ0FDRCxDQUNEOzs7Ozs7O1VBUDZCLENBZ0I1QixDQUNEcHFGLElBQUssYUFESixDQUVEOUMsTUFBTyxvQkFBQSxDQUFxQmk3SixZQUFyQixDQUFtQyxDQUN4QyxlQUFpQnYwSixVQUFVMUQsTUFBVixDQUFtQixDQUFuQixFQUF3QjBELFVBQVUsQ0FBVixJQUFpQi9FLFNBQXpDLENBQXFEK0UsVUFBVSxDQUFWLENBQXJELENBQW9FLElBQXJGLENBQ0EsV0FBYUEsVUFBVTFELE1BQVYsQ0FBbUIsQ0FBbkIsRUFBd0IwRCxVQUFVLENBQVYsSUFBaUIvRSxTQUF6QyxDQUFxRCtFLFVBQVUsQ0FBVixDQUFyRCxDQUFvRSxFQUFqRixDQUNBMHJJLE9BQU9wekksT0FBUCxDQUFlLFNBQVV3VCxLQUFWLENBQWlCLENBQzlCLG9CQUFvQmMsZ0JBQWIsQ0FBOEJkLEtBQTlCLENBQXFDLFNBQVV4TixDQUFWLENBQWEsQ0FDdkQsa0JBQWtCeVQsSUFBWCxDQUFnQmpHLEtBQWhCLENBQXVCeE4sQ0FBdkIsQ0FBUCxDQUNELENBRk0sQ0FBUCxDQUdELENBSkQsRUFLRCxDQVZBLENBaEI0QixDQTJCNUIsQ0FDRGxDLElBQUssV0FESixDQUVEOUMsTUFBTyxrQkFBQSxDQUFtQjVDLElBQW5CLENBQXlCLENBQzlCLFlBQWNBLEtBQUs4aEQsT0FBbkIsQ0FDSWc4RyxZQUFjOTlKLEtBQUs4OUosV0FEdkIsQ0FFQUEsWUFBWWg4RyxPQUFaLENBQXFCLElBQXJCLENBQTJCLENBQUMsV0FBRCxDQUFjLFNBQWQsQ0FBeUIsYUFBekIsQ0FBd0MsV0FBeEMsQ0FBcUQsT0FBckQsQ0FBOEQsT0FBOUQsQ0FBdUUsWUFBdkUsQ0FBcUYsVUFBckYsQ0FBaUcsV0FBakcsQ0FBOEcsU0FBOUcsQ0FBeUgsT0FBekgsQ0FBa0ksVUFBbEksQ0FBM0IsRUFDRCxDQU5BLENBM0I0QixDQUEvQixFQW9DQSx3QkFBQSxDQUNELENBMUNELEVBRkEsQ0E4Q0E7Ozs7OztLQVFBLG9DQUVBLFNBQVVvNEYsT0FBVixDQUFtQixDQUNqQiwyQkFBQSxFQUE4QixDQUM1QixTQUFBLENBRUEsbUJBQXFCNXdJLFVBQVUxRCxNQUFWLENBQW1CLENBQW5CLEVBQXdCMEQsVUFBVSxDQUFWLElBQWlCL0UsU0FBekMsQ0FBcUQrRSxVQUFVLENBQVYsQ0FBckQsQ0FBb0UsS0FBekYsQ0FFQTJ2SSxlQUFlLElBQWYsQ0FBcUI4a0Isa0JBQXJCLEVBRUE3ckUsTUFBUWluRCwwQkFBMEIsSUFBMUIsQ0FBZ0NOLGlCQUFpQmtsQixrQkFBakIsRUFBcUNsOUosSUFBckMsQ0FBMEMsSUFBMUMsQ0FBaEMsQ0FBUixDQUVBd2lCLGlCQUFpQkEsaUJBQWlCQSxpQkFBaUJBLGlCQUFpQkEsaUJBQWlCKzZILHNCQUFzQkEsc0JBQXNCbHNELEtBQXRCLENBQXRCLENBQWpCLENBQXNFLE9BQXRFLENBQStFLFdBQUEsRUFBL0UsQ0FBakIsQ0FBZ0gsV0FBaEgsQ0FBNkgsYUFBQSxFQUE3SCxDQUFqQixDQUFnSyxPQUFoSyxDQUF5SyxJQUF6SyxDQUFqQixDQUFpTSxRQUFqTSxDQUEyTSxJQUEzTSxDQUFqQixDQUFtTyxpQkFBbk8sQ0FBc1AsU0FBQSxDQUFVLFdBQUEsQ0FBWSxDQUFaLENBQWUsQ0FBZixDQUFrQixDQUFsQixDQUFWLENBQWdDLENBQWhDLENBQXRQLEVBRUFBLE1BQU04ckUsY0FBTixDQUF1QkEsY0FBdkIsQ0FDQSxZQUFBLENBQ0QsQ0FFRDVqQixZQUFZMmpCLGtCQUFaLENBQWdDLENBQUMsQ0FDL0JyNEosSUFBSyxRQUQwQixDQUUvQjlDLE1BQU8sZUFBQSxDQUFnQmdGLENBQWhCLENBQW1CcTJKLE9BQW5CLENBQTRCQyxPQUE1QixDQUFxQyxDQUMxQyxTQUFXLEtBQUtwOEgsTUFBTCxDQUFZcThILHFCQUFaLEVBQVgsQ0FDQSxNQUFRRixTQUFXcjJKLEVBQUV3MkosT0FBckIsQ0FDQSxNQUFRRixTQUFXdDJKLEVBQUV5MkosT0FBckIsQ0FDQSxLQUFLQyxLQUFMLENBQVc5bEosQ0FBWCxDQUFlLENBQUNBLEVBQUkrbEosS0FBSzdtSSxJQUFWLEdBQW1CNm1JLEtBQUs1bUksS0FBTCxDQUFhNG1JLEtBQUs3bUksSUFBckMsRUFBNkMsQ0FBN0MsQ0FBaUQsQ0FBaEUsQ0FDQSxLQUFLNG1JLEtBQUwsQ0FBV3QxSSxDQUFYLENBQWUsRUFBRSxDQUFDQSxFQUFJdTFJLEtBQUszbUksR0FBVixHQUFrQjJtSSxLQUFLMW1JLE1BQUwsQ0FBYzBtSSxLQUFLM21JLEdBQXJDLENBQUYsRUFBK0MsQ0FBL0MsQ0FBbUQsQ0FBbEUsQ0FDQSxLQUFLNG1JLGVBQUwsQ0FBcUJuZ0ksTUFBckIsQ0FBNEJ4VCxJQUE1QixDQUFpQyxLQUFLd1MsTUFBTCxDQUFZZ2tCLGlCQUFaLEVBQWpDLEVBQ0EsS0FBS2taLFNBQUwsQ0FBZWt3RSxhQUFmLENBQTZCLEtBQUs2ekIsS0FBbEMsQ0FBeUMsS0FBS2poSSxNQUE5QyxFQUNBLEtBQUtoaUIsSUFBTCxDQUFVLE1BQVYsRUFDRCxDQVg4QixDQUFELENBWTdCLENBQ0QzVixJQUFLLFNBREosQ0FFRDlDLE1BQU8sZ0JBQUEsQ0FBaUJ1OEksUUFBakIsQ0FBMkIsQ0FDaENBLFNBQVN1SSxNQUFULENBQWdCLE9BQWhCLEVBRUF2SSxTQUFTc2YsT0FBVCxDQUFpQixRQUFqQixDQUEyQixVQUFZLENBQ3JDLDRCQUFPLEVBQVAsQ0FDRCxDQUZELEVBSUEsS0FBSzM4SCxNQUFMLENBQWNxOUcsU0FBU3gxSSxHQUFULENBQWEsVUFBYixFQUF5Qm1tRixVQUF2QyxDQUNBLEtBQUt6eUQsTUFBTCxDQUFjOGhILFNBQVN4MUksR0FBVCxDQUFhLFFBQWIsRUFBdUJnMUksTUFBckMsQ0FDRCxDQVhBLENBWjZCLENBd0I3QixDQUNEajVJLElBQUssV0FESixDQUVEOUMsTUFBTyxrQkFBQSxDQUFtQjVDLElBQW5CLENBQXlCLENBQzlCLFdBQWEsSUFBYixDQUVBLENBQUMsT0FBRCxDQUFVLFdBQVYsQ0FBdUIsU0FBdkIsQ0FBa0MsV0FBbEMsRUFBK0M0QixPQUEvQyxDQUF1RCxTQUFVODhKLEVBQVYsQ0FBYyxDQUNuRSxjQUFjNXBCLEVBQVAsQ0FBVTRwQixFQUFWLENBQWMsU0FBVTkySixDQUFWLENBQWEsQ0FDaEMsWUFBWXlULElBQUwsQ0FBVXFqSixFQUFWLENBQWM5MkosQ0FBZCxDQUFQLENBQ0QsQ0FGTSxDQUFQLENBR0QsQ0FKRCxFQUtBNUgsS0FBSzIrSixPQUFMLENBQWUsQ0FBZixDQUNBMytKLEtBQUs0K0osT0FBTCxDQUFlLENBQWYsQ0FDQSxLQUFLOXBCLEVBQUwsQ0FBUSxXQUFSLENBQXFCLFNBQVVsdEksQ0FBVixDQUFhLENBQ2hDLEdBQUlpQyxTQUFTZzFKLGtCQUFULEdBQWdDLElBQXBDLENBQTBDLENBQ3hDNytKLEtBQUsyK0osT0FBTCxFQUFnQi8ySixFQUFFazNKLFNBQWxCLENBQ0E5K0osS0FBSzQrSixPQUFMLEVBQWdCaDNKLEVBQUVtM0osU0FBbEIsQ0FDQS8rSixLQUFLNDVCLE1BQUwsQ0FBWWh5QixDQUFaLENBQWU1SCxLQUFLMitKLE9BQXBCLENBQTZCMytKLEtBQUs0K0osT0FBbEMsRUFDRCxDQUpELFVBSVlobEksTUFBTCxDQUFZaHlCLENBQVosRUFDUixDQU5ELEVBT0QsQ0FDRDs7Ozs7O1VBNUM4QixDQW9EN0IsQ0FDRGxDLElBQUssT0FESixDQUVEOUMsTUFBTyxjQUFBLENBQWVvMkksU0FBZixDQUEwQixDQUMvQixXQUFhLElBQWIsQ0FFQSxXQUFhMXZJLFVBQVUxRCxNQUFWLENBQW1CLENBQW5CLEVBQXdCMEQsVUFBVSxDQUFWLElBQWlCL0UsU0FBekMsQ0FBcUQrRSxVQUFVLENBQVYsQ0FBckQsQ0FBb0UsSUFBakYsQ0FDQSxjQUFnQixLQUFoQixDQUNBLEtBQUt3ckksRUFBTCxDQUFRLE1BQVIsQ0FBZ0IsVUFBWSxDQUMxQixHQUFJa0YsT0FBT2dsQixNQUFQLENBQWNobUIsU0FBZCxDQUF5QmltQixNQUF6QixDQUFKLENBQXNDLENBQ3BDLEdBQUlDLFNBQUosQ0FBZWxtQixVQUFVMzlILElBQVYsQ0FBZSxXQUFmLEVBQWYsSUFBZ0QsQ0FDOUMyOUgsVUFBVTM5SCxJQUFWLENBQWUsV0FBZixFQUNBNmpKLFVBQVksSUFBWixDQUNELENBQ0YsQ0FMRCxRQUtXQSxTQUFKLENBQWUsQ0FDcEJsbUIsVUFBVTM5SCxJQUFWLENBQWUsVUFBZixFQUNBNmpKLFVBQVksS0FBWixDQUNELENBQ0YsQ0FWRCxFQVdBLEtBQUtwcUIsRUFBTCxDQUFRLE9BQVIsQ0FBaUIsVUFBWSxDQUMzQixHQUFJb3FCLFNBQUosQ0FBZWxtQixVQUFVMzlILElBQVYsQ0FBZSxPQUFmLEVBQWYsZUFBc0RBLElBQVYsQ0FBZSxVQUFmLEVBQzdDLENBRkQsRUFHQSxLQUFLeTVILEVBQUwsQ0FBUSxXQUFSLENBQXFCLFVBQVksQ0FDL0IsR0FBSW9xQixTQUFKLENBQWVsbUIsVUFBVTM5SCxJQUFWLENBQWUsV0FBZixFQUNoQixDQUZELEVBR0EsS0FBS3k1SCxFQUFMLENBQVEsU0FBUixDQUFtQixVQUFZLENBQzdCLEdBQUlvcUIsU0FBSixDQUFlbG1CLFVBQVUzOUgsSUFBVixDQUFlLFNBQWYsRUFDaEIsQ0FGRCxFQUdELENBQ0Q7Ozs7Ozs7VUFoRjhCLENBeUY3QixDQUNEM1YsSUFBSyxjQURKLENBRUQ5QyxNQUFPLHFCQUFBLENBQXNCeTZJLElBQXRCLENBQTRCLENBQ2pDLFdBQWFBLEtBQUtzQixNQUFsQixDQUNBLFdBQWFyMUksVUFBVTFELE1BQVYsQ0FBbUIsQ0FBbkIsRUFBd0IwRCxVQUFVLENBQVYsSUFBaUIvRSxTQUF6QyxDQUFxRCtFLFVBQVUsQ0FBVixDQUFyRCxDQUFvRSxJQUFqRixDQUVBLEdBQUlxMUksT0FBT2hnRyxRQUFQLENBQWdCLzRDLE1BQWhCLENBQXlCLENBQXpCLEVBQThCcTVKLE1BQWxDLENBQTBDLENBQ3hDLFlBQWMsRUFBZCxDQUNBdGdCLE9BQU9sNEcsUUFBUCxDQUFnQixTQUFVd2EsS0FBVixDQUFpQixDQUMvQixlQUFlNzdDLElBQVIsQ0FBYTY3QyxLQUFiLENBQVAsQ0FDRCxDQUZELEVBR0EsWUFBWXNaLFNBQUwsQ0FBZXF3RSxnQkFBZixDQUFnQ2g1QyxPQUFoQyxDQUFQLENBQ0QsQ0FFRCxZQUFZcjNCLFNBQUwsQ0FBZWd3RSxlQUFmLENBQStCb1UsTUFBL0IsQ0FBUCxDQUNELENBQ0Q7Ozs7Ozs7VUF6RzhCLENBa0g3QixDQUNEajVJLElBQUssU0FESixDQUVEOUMsTUFBTyxnQkFBQSxFQUFtQixDQUN4QixVQUFZMEcsVUFBVTFELE1BQVYsQ0FBbUIsQ0FBbkIsRUFBd0IwRCxVQUFVLENBQVYsSUFBaUIvRSxTQUF6QyxDQUFxRCtFLFVBQVUsQ0FBVixDQUFyRCxDQUFvRSxLQUFLazFKLGVBQXJGLENBQ0EsV0FBYWwxSixVQUFVMUQsTUFBVixDQUFtQixDQUFuQixDQUF1QjBELFVBQVUsQ0FBVixDQUF2QixDQUFzQy9FLFNBQW5ELENBQ0EsWUFBWWcyRCxTQUFMLENBQWV0RixHQUFmLENBQW1CMEIsY0FBbkIsQ0FBa0N4dkIsS0FBbEMsQ0FBeUN0N0IsTUFBekMsQ0FBUCxDQUNELENBQ0Q7Ozs7Ozs7VUF6SDhCLENBa0k3QixDQUNEbkcsSUFBSyxRQURKLENBRUQ5QyxNQUFPLGVBQUEsQ0FBZ0JvMkksU0FBaEIsQ0FBMkIsQ0FDaEMsV0FBYTF2SSxVQUFVMUQsTUFBVixDQUFtQixDQUFuQixFQUF3QjBELFVBQVUsQ0FBVixJQUFpQi9FLFNBQXpDLENBQXFEK0UsVUFBVSxDQUFWLENBQXJELENBQW9FLElBQWpGLENBQ0EsWUFBWXV4RCxZQUFMLENBQWtCbStFLFNBQWxCLENBQTZCaW1CLE1BQTdCLEVBQXFDcjVKLE1BQXJDLENBQThDLENBQXJELENBQ0QsQ0FDRDs7OztVQXhJOEIsQ0E4STdCLENBQ0RGLElBQUssS0FESixDQUVEaUUsSUFBSyxZQUFBLEVBQWUsQ0FDbEIsWUFBWTR3RCxTQUFMLENBQWV0RixHQUF0QixDQUNELENBQ0Q7Ozs7VUFuSjhCLENBeUo3QixDQUNEdnZELElBQUssR0FESixDQUVEaUUsSUFBSyxZQUFBLEVBQWUsQ0FDbEIsWUFBWTIwSixLQUFMLENBQVc5bEosQ0FBbEIsQ0FDRCxDQUNEOzs7O1VBOUo4QixDQW9LN0IsQ0FDRDlTLElBQUssR0FESixDQUVEaUUsSUFBSyxZQUFBLEVBQWUsQ0FDbEIsWUFBWTIwSixLQUFMLENBQVd0MUksQ0FBbEIsQ0FDRCxDQUpBLENBcEs2QixDQUFoQyxFQTJLQXN3SCxTQUFTeWtCLGtCQUFULENBQTZCN2pCLE9BQTdCLEVBRUEseUJBQUEsQ0FDRCxDQTlMRCxDQThMRWMsa0JBOUxGLENBRkEsQ0FrTUE7Ozs7Ozs7Ozs7Ozs7Ozs7S0FrQkEsZ0NBRUEsVUFBWSxDQUNWWixZQUFZK2tCLGNBQVosQ0FBNEIsSUFBNUIsQ0FBa0MsQ0FBQyxDQUNqQ3o1SixJQUFLLE1BRDRCLENBRWpDOUMsTUFBTyxhQUFBLENBQWN3OEosUUFBZCxDQUF3QixDQUM3Qix5QkFBTyxDQUFtQixDQUN4QkEsU0FBVUEsUUFEYyxDQUFuQixDQUFQLENBR0QsQ0FOZ0MsQ0FBRCxDQUFsQyxFQVNBLHVCQUFBLEVBQTBCLENBQ3hCLFdBQWE5MUosVUFBVTFELE1BQVYsQ0FBbUIsQ0FBbkIsRUFBd0IwRCxVQUFVLENBQVYsSUFBaUIvRSxTQUF6QyxDQUFxRCtFLFVBQVUsQ0FBVixDQUFyRCxDQUFvRSxFQUFqRixDQUVBMnZJLGVBQWUsSUFBZixDQUFxQmttQixjQUFyQixFQUVBLEtBQUtuZ0UsTUFBTCxDQUFjOS9GLE9BQU80bkIsTUFBUCxDQUFjLENBQzFCczRJLFNBQVUsS0FEZ0IsQ0FFMUJyWSxJQUFLLFlBQUEsQ0FBYXFZLFFBQWIsQ0FBdUIsQ0FDMUIsZUFBQSxDQUNELENBSnlCLENBSzFCeGxJLE9BQVEsZUFBQSxDQUFnQnh3QixDQUFoQixDQUFtQixDQUN6QixLQUFLZzJKLFFBQUwsQ0FBY3hsSSxNQUFkLENBQXFCeHdCLEVBQUVpaUksUUFBRixFQUFyQixFQUNELENBUHlCLENBQWQsQ0FRWHJzQyxNQVJXLENBQWQsQ0FTQSxLQUFLb2dFLFFBQUwsQ0FBZ0IsS0FBS3BnRSxNQUFMLENBQVlvZ0UsUUFBNUIsQ0FDQSxLQUFLeGxJLE1BQUwsQ0FBYyxLQUFLb2xFLE1BQUwsQ0FBWXBsRSxNQUExQixDQUNELENBRUR3Z0gsWUFBWStrQixjQUFaLENBQTRCLENBQUMsQ0FDM0J6NUosSUFBSyxTQURzQixDQUUzQjlDLE1BQU8sZ0JBQUEsQ0FBaUJ1OEksUUFBakIsQ0FBMkIsQ0FDaENBLFNBQVN1SSxNQUFULENBQWdCLFVBQWhCLEVBRUF2SSxTQUFTc2YsT0FBVCxDQUFpQixRQUFqQixDQUEyQixVQUFZLENBQ3JDLDRCQUFPLEVBQVAsQ0FDRCxDQUZELEVBR0QsQ0FDRDs7Ozs7O1VBVDBCLENBaUJ6QixDQUNELzRKLElBQUssYUFESixDQUVEOUMsTUFBTyxvQkFBQSxDQUFxQnc4SixRQUFyQixDQUErQixDQUNwQyxLQUFLQSxRQUFMLENBQWdCQSxRQUFoQixDQUNBLFdBQUEsQ0FDRCxDQUNEOzs7Ozs7VUF2QjBCLENBK0J6QixDQUNEMTVKLElBQUssV0FESixDQUVEOUMsTUFBTyxrQkFBQSxDQUFtQmczQixNQUFuQixDQUEyQixDQUNoQyxLQUFLQSxNQUFMLENBQWNBLE1BQWQsQ0FDQSxXQUFBLENBQ0QsQ0FMQSxDQS9CeUIsQ0FxQ3pCLENBQ0RsMEIsSUFBSyxXQURKLENBRUQ5QyxNQUFPLGtCQUFBLENBQW1CNUMsSUFBbkIsQ0FBeUIsQ0FDOUJBLEtBQUtxL0osVUFBTCxDQUFrQixRQUFBLENBQVNyL0osS0FBSzQ1QixNQUFMLENBQVkyakUsSUFBWixDQUFpQnY5RixJQUFqQixDQUFULENBQWxCLENBQ0FBLEtBQUtxL0osVUFBTCxDQUFnQjUxSCxLQUFoQixDQUFzQixJQUF0QixFQUNELENBTEEsQ0FyQ3lCLENBQTVCLEVBNkNBLHFCQUFBLENBQ0QsQ0ExRUQsRUFGQSxDQThFQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0tBb0JBLDJCQUVBLFVBQVksQ0FDVixrQkFBQSxFQUFxQixDQUNuQixXQUFhbmdDLFVBQVUxRCxNQUFWLENBQW1CLENBQW5CLEVBQXdCMEQsVUFBVSxDQUFWLElBQWlCL0UsU0FBekMsQ0FBcUQrRSxVQUFVLENBQVYsQ0FBckQsQ0FBb0UsRUFBakYsQ0FDQSxTQUFXQSxVQUFVMUQsTUFBVixDQUFtQixDQUFuQixDQUF1QjBELFVBQVUsQ0FBVixDQUF2QixDQUFzQy9FLFNBQWpELENBRUEwMEksZUFBZSxJQUFmLENBQXFCcW1CLFNBQXJCLEVBRUEsS0FBS3RnRSxNQUFMLENBQWM5L0YsT0FBTzRuQixNQUFQLENBQWMsQ0FDMUJxdEIsTUFBTyxRQURtQixDQUUxQndqQyxRQUFTLEtBRmlCLENBRzFCNy9DLEtBQU0sRUFIb0IsQ0FJMUJDLElBQUssSUFKcUIsQ0FBZCxDQUtYaW5FLE1BTFcsQ0FBZCxDQU1BLEdBQUksQ0FBQ3ArRixJQUFELEVBQVNBLE9BQVMsTUFBdEIsQ0FBOEIsS0FBS20zQyxHQUFMLENBQVcsV0FBQSxDQUFZLEtBQUtpbkQsTUFBTCxDQUFZN3FELEtBQXhCLENBQStCLEtBQUs2cUQsTUFBTCxDQUFZcm5CLE9BQTNDLENBQVgsQ0FBOUIsUUFBc0cvMkUsT0FBUyxRQUFiLENBQXVCLEtBQUttM0MsR0FBTCxDQUFXLE9BQUEsQ0FBUSxLQUFLaW5ELE1BQUwsQ0FBWTdxRCxLQUFwQixDQUEyQixLQUFLNnFELE1BQUwsQ0FBWWxuRSxJQUF2QyxDQUE2QyxLQUFLa25FLE1BQUwsQ0FBWWpuRSxHQUF6RCxDQUFYLENBQzFILENBRURxaUgsWUFBWWtsQixTQUFaLENBQXVCLENBQUMsQ0FDdEI1NUosSUFBSyxTQURpQixDQUV0QjlDLE1BQU8sZ0JBQUEsQ0FBaUJ1OEksUUFBakIsQ0FBMkIsQ0FDaENBLFNBQVM1b0ksR0FBVCxDQUFhLEtBQWIsQ0FBb0IsS0FBS3doQyxHQUF6QixFQUVBb25HLFNBQVN4MUksR0FBVCxDQUFhLE9BQWIsRUFBc0JvdUMsR0FBdEIsQ0FBNEIsS0FBS0EsR0FBakMsQ0FDRCxDQU5xQixDQUFELENBQXZCLEVBU0EsZ0JBQUEsQ0FDRCxDQTFCRCxFQUZBLENBOEJBLG1CQUFxQix1QkFBQSxDQUF3QnB2QyxDQUF4QixDQUEyQkYsQ0FBM0IsQ0FBOEIsQ0FDakQsR0FBSUUsSUFBTUYsQ0FBVixDQUFhLFdBQUEsQ0FBYixRQUFrQ0UsR0FBS0EsRUFBRTBrQixNQUFQLEVBQWlCMWtCLEVBQUUwa0IsTUFBRixDQUFTNWtCLENBQVQsQ0FBckIsQ0FBa0MsV0FBQSxDQUNoRSxZQUFBLENBQ0QsQ0FIRCxDQUlBOzs7Ozs7Ozs7Ozs7Ozs7S0FrQkEsNkJBRUEsVUFBWSxDQUNWMnhJLFlBQVltbEIsV0FBWixDQUF5QixJQUF6QixDQUErQixDQUFDLENBQzlCNzVKLElBQUssZ0JBRHlCLENBRTlCOUMsTUFBTyx1QkFBQSxDQUF3QjQ4SixPQUF4QixDQUFpQyxDQUN0QyxpQkFBbUIsQ0FDakIsVUFBWWwySixVQUFVMUQsTUFBVixDQUFtQixDQUFuQixFQUF3QjBELFVBQVUsQ0FBVixJQUFpQi9FLFNBQXpDLENBQXFEK0UsVUFBVSxDQUFWLENBQXJELENBQW9FLENBQUMsRUFBRCxDQUFLLEVBQUwsQ0FBaEYsQ0FFQSxTQUFXQSxVQUFVMUQsTUFBVixDQUFtQixDQUFuQixDQUF1QjBELFVBQVUsQ0FBVixDQUF2QixDQUFzQy9FLFNBQWpELENBQ0ltQixJQUFNMjNJLEtBQUszM0ksR0FEZixDQUVJNFAsS0FBTytuSSxLQUFLL25JLElBRmhCLENBSUEsR0FBSWtxSixRQUFRNzdKLE1BQU0sQ0FBTixFQUFTK0IsR0FBVCxDQUFSLENBQXVCNFAsSUFBdkIsQ0FBSixDQUFrQyxZQUFBLENBQ2xDM1IsTUFBTSxDQUFOLEVBQVMrQixHQUFULEVBQWdCNFAsSUFBaEIsQ0FDQTNSLE1BQU0sQ0FBTixFQUFXK0IsR0FBWCxDQUNBLFlBQUEsQ0FDRCxDQVhELENBWUQsQ0FmNkIsQ0FBRCxDQUEvQixFQWtCQSxvQkFBQSxFQUF1QixDQUNyQixlQUFpQjRELFVBQVUxRCxNQUFWLENBQW1CLENBQW5CLEVBQXdCMEQsVUFBVSxDQUFWLElBQWlCL0UsU0FBekMsQ0FBcUQrRSxVQUFVLENBQVYsQ0FBckQsQ0FBb0VtMkosY0FBckYsQ0FFQXhtQixlQUFlLElBQWYsQ0FBcUJzbUIsV0FBckIsRUFFQSxLQUFLaHlKLEtBQUwsQ0FBYTR1SSxZQUFZb2pCLFlBQVlHLGNBQVosQ0FBMkJDLFVBQTNCLENBQVosQ0FBYixDQUNBLEtBQUtDLGFBQUwsQ0FBcUIsRUFBckIsQ0FDQSxLQUFLQyxhQUFMLENBQXFCLFNBQXJCLENBQ0EsS0FBS0MsVUFBTCxDQUFrQixTQUFsQixDQUNELENBQ0Q7Ozs7Ozs7Ozs7T0FhQTFsQixZQUFZbWxCLFdBQVosQ0FBeUIsQ0FBQyxDQUN4Qjc1SixJQUFLLFNBRG1CLENBRXhCOUMsTUFBTyxpQkFBQSxDQUFrQjBTLElBQWxCLENBQXdCLENBQzdCLEtBQUt5cUosTUFBTCxDQUFZLENBQ1ZDLFFBQVMxcUosSUFEQyxDQUFaLEVBR0EsV0FBQSxDQUNELENBQ0Q7Ozs7O1VBUnVCLENBZXRCLENBQ0Q1UCxJQUFLLGVBREosQ0FFRDlDLE1BQU8sc0JBQUEsQ0FBdUJ1OUYsSUFBdkIsQ0FBNkIsQ0FDbEMsS0FBSzV5RixLQUFMLENBQVcrdkksY0FBWCxDQUEwQmlpQixZQUFZRyxjQUFaLENBQTJCdi9ELElBQTNCLENBQTFCLEVBQ0QsQ0FKQSxDQWZzQixDQW9CdEIsQ0FDRHo2RixJQUFLLFNBREosQ0FFRDlDLE1BQU8sZ0JBQUEsQ0FBaUJ1OEksUUFBakIsQ0FBMkIsQ0FDaENBLFNBQVN1SSxNQUFULENBQWdCLE9BQWhCLEVBQ0QsQ0FDRDs7Ozs7Ozs7Ozs7O1VBekJ1QixDQXVDdEIsQ0FDRGhpSixJQUFLLFFBREosQ0FFRDlDLE1BQU8sZUFBQSxDQUFnQnE5SixPQUFoQixDQUF5QixDQUM5QixJQUFLLE9BQUwsV0FBQSxDQUF5QixDQUN2QixHQUFJdjZKLEdBQUosQ0FBUyxDQUNQLEtBQUtrNkosYUFBTCxDQUFtQmw2SixHQUFuQixFQUEwQkEsTUFBUSxTQUFSLENBQW9CdTZKLFFBQVF2NkosR0FBUixDQUFwQixDQUFtQ3hHLE9BQU80bkIsTUFBUCxDQUFjLEVBQWQsQ0FBa0IsS0FBSzg0SSxhQUFMLENBQW1CSSxPQUFyQyxDQUE4Q0MsUUFBUXY2SixHQUFSLENBQTlDLENBQTdELENBQ0QsQ0FDRixDQUNGLENBQ0Q7Ozs7Ozs7OztVQWhEdUIsQ0EyRHRCLENBQ0RBLElBQUssUUFESixDQUVEOUMsTUFBTyxlQUFBLEVBQWtCLENBQ3ZCLFVBQVksSUFBWixDQUVBLFlBQWMwRyxVQUFVMUQsTUFBVixDQUFtQixDQUFuQixFQUF3QjBELFVBQVUsQ0FBVixJQUFpQi9FLFNBQXpDLENBQXFEK0UsVUFBVSxDQUFWLENBQXJELENBQW9FLEVBQWxGLENBQ0EsS0FBS2lFLEtBQUwsQ0FBV3d2SSxTQUFYLENBQXFCLFVBQVksQ0FDL0IseUJBQTJCN3FELE1BQU0za0YsS0FBTixDQUFZMHZJLFFBQVosRUFBM0IsQ0FDSVMsc0JBQXdCQyxjQUFjQyxvQkFBZCxDQUFvQyxDQUFwQyxDQUQ1QixDQUVJdG9JLEtBQU9vb0ksc0JBQXNCLENBQXRCLENBRlgsQ0FHSUcsV0FBYUgsc0JBQXNCLENBQXRCLENBSGpCLENBS0EsYUFBZXdpQixRQUFRcmlCLFVBQVIsQ0FBZixDQUNBLEdBQUl6aEgsUUFBSixDQUFjQSxTQUFTOW1CLEtBQUt1b0ksVUFBTCxDQUFULEVBQ2YsQ0FSRCxFQVNELENBQ0Q7Ozs7Ozs7VUEzRXVCLENBb0Z0QixDQUNEbjRJLElBQUssSUFESixDQUVEOUMsTUFBTyxXQUFBLENBQVl1OUosVUFBWixDQUF3QixDQUM3QixLQUFLTCxVQUFMLENBQWtCLEtBQUtELGFBQXZCLENBQ0EsS0FBS0EsYUFBTCxDQUFxQk0sVUFBckIsQ0FDQSxXQUFhLEtBQUtQLGFBQUwsQ0FBbUJPLFVBQW5CLEVBQWlDLEtBQUtQLGFBQUwsQ0FBbUJPLFVBQW5CLENBQWpDLENBQWtFLEtBQUtQLGFBQUwsQ0FBbUJJLE9BQWxHLENBQ0EsS0FBS3pwSixHQUFMLENBQVN3cEosTUFBVCxFQUNELENBQ0Q7Ozs7Ozs7OztVQTVGdUIsQ0F1R3RCLENBQ0RyNkosSUFBSyxLQURKLENBRUQ5QyxNQUFPLFlBQUEsQ0FBYTBTLElBQWIsQ0FBbUIsQ0FDeEIsSUFBSyxPQUFMLFFBQUEsQ0FBc0IsQ0FDcEIsR0FBSTVQLEdBQUosQ0FBUyxLQUFLNkgsS0FBTCxDQUFXc3ZJLFFBQVgsQ0FBb0IsQ0FDM0JqOEksS0FBTSxLQURxQixDQUUzQjhFLElBQUtBLEdBRnNCLENBRzNCNFAsS0FBTUEsS0FBSzVQLEdBQUwsQ0FIcUIsQ0FBcEIsRUFLVixDQUNGLENBQ0Q7Ozs7Ozs7VUFsSHVCLENBMkh0QixDQUNEQSxJQUFLLEtBREosQ0FFRDlDLE1BQU8sWUFBQSxDQUFhOEMsR0FBYixDQUFrQixDQUN2QixZQUFZNkgsS0FBTCxDQUFXMHZJLFFBQVgsR0FBc0IsQ0FBdEIsRUFBeUJ2M0ksR0FBekIsQ0FBUCxDQUNELENBQ0Q7Ozs7Ozs7VUFoSXVCLENBeUl0QixDQUNEQSxJQUFLLE1BREosQ0FFRDlDLE1BQU8sYUFBQSxDQUFjbTlKLE1BQWQsQ0FBc0JLLE9BQXRCLENBQStCQyxRQUEvQixDQUF5QyxDQUM5QyxZQUFZUCxVQUFMLEdBQW9CQyxNQUFwQixDQUE2QkssT0FBN0IsQ0FBdUNDLFFBQTlDLENBQ0QsQ0FDRDs7Ozs7OztVQTlJdUIsQ0F1SnRCLENBQ0QzNkosSUFBSyxTQURKLENBRUQ5QyxNQUFPLGdCQUFBLENBQWlCbTlKLE1BQWpCLENBQXlCSyxPQUF6QixDQUFrQ0MsUUFBbEMsQ0FBNEMsQ0FDakQsWUFBWVIsYUFBTCxHQUF1QkUsTUFBdkIsQ0FBZ0NLLE9BQWhDLENBQTBDQyxRQUFqRCxDQUNELENBSkEsQ0F2SnNCLENBQXpCLEVBOEpBLGtCQUFBLENBQ0QsQ0F6TUQsRUFGQSxDQTZNQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBRUEsb0NBRUEsU0FBVUMsZ0JBQVYsQ0FBNEIsQ0FDMUIsMkJBQUEsQ0FBNEI3NkosTUFBNUIsQ0FBb0NxcUYsVUFBcEMsQ0FBZ0R5d0UsWUFBaEQsQ0FBOEQsQ0FDNUQsU0FBQSxDQUVBdG5CLGVBQWUsSUFBZixDQUFxQnVuQixrQkFBckIsRUFFQXR1RSxNQUFRaW5ELDBCQUEwQixJQUExQixDQUFnQ04saUJBQWlCMm5CLGtCQUFqQixFQUFxQzMvSixJQUFyQyxDQUEwQyxJQUExQyxDQUFoQyxDQUFSLENBQ0FxeEYsTUFBTXpzRixNQUFOLENBQWVBLE1BQWYsQ0FDQXlzRixNQUFNcEMsVUFBTixDQUFtQkEsYUFBZXZyRixTQUFmLENBQTJCc0YsUUFBM0IsQ0FBc0NpbUYsVUFBekQsQ0FDQW9DLE1BQU1xdUUsWUFBTixDQUFxQkEsWUFBckIsQ0FBbUM7RUFFbkNydUUsTUFBTWh2QyxPQUFOLENBQWdCLElBQWhCLENBQXNCO0VBRXRCZ3ZDLE1BQU1ybUYsTUFBTixDQUFlLFdBQUEsRUFBZixDQUE4QjtFQUU5QnFtRixNQUFNdjRCLFdBQU4sQ0FBb0IsQ0FBcEIsQ0FDQXU0QixNQUFNa25DLFdBQU4sQ0FBb0I3MEYsUUFBcEIsQ0FBOEI7RUFFOUIydEQsTUFBTXV1RSxPQUFOLENBQWdCLENBQWhCLENBQ0F2dUUsTUFBTXd1RSxPQUFOLENBQWdCbjhILFFBQWhCLENBQTBCO0VBQzFCO0VBRUEydEQsTUFBTXl1RSxhQUFOLENBQXNCLENBQXRCLENBQXlCO0VBRXpCenVFLE1BQU0wdUUsYUFBTixDQUFzQjk0SixLQUFLK2YsRUFBM0IsQ0FBK0I7RUFDL0I7RUFDQTtFQUVBcXFFLE1BQU0ydUUsZUFBTixDQUF3QixDQUFDdDhILFFBQXpCLENBQW1DO0VBRW5DMnRELE1BQU00dUUsZUFBTixDQUF3QnY4SCxRQUF4QixDQUFrQztFQUNsQztFQUNBO0VBRUEydEQsTUFBTTZ1RSxhQUFOLENBQXNCLEtBQXRCLENBQ0E3dUUsTUFBTTh1RSxhQUFOLENBQXNCLElBQXRCLENBQTRCO0VBQzVCO0VBRUE5dUUsTUFBTSt1RSxVQUFOLENBQW1CLElBQW5CLENBQ0EvdUUsTUFBTWd2RSxTQUFOLENBQWtCLEdBQWxCLENBQXVCO0VBRXZCaHZFLE1BQU1pdkUsWUFBTixDQUFxQixJQUFyQixDQUNBanZFLE1BQU1rdkUsV0FBTixDQUFvQixHQUFwQixDQUF5QjtFQUV6Qmx2RSxNQUFNbXZFLFNBQU4sQ0FBa0IsSUFBbEIsQ0FDQW52RSxNQUFNb3ZFLFdBQU4sQ0FBb0IsR0FBcEIsQ0FBeUI7RUFDekI7RUFDQTtFQUVBcHZFLE1BQU1xdkUsVUFBTixDQUFtQixLQUFuQixDQUNBcnZFLE1BQU1zdkUsZUFBTixDQUF3QixHQUF4QixDQUE2QjtFQUM3QjtFQUVBdHZFLE1BQU11dkUsVUFBTixDQUFtQixJQUFuQixDQUF5QjtFQUV6QnZ2RSxNQUFNMXNGLElBQU4sQ0FBYSxDQUNYaWlCLEtBQU0sRUFESyxDQUVYaTZJLEdBQUksRUFGTyxDQUdYLzVJLE1BQU8sRUFISSxDQUlYZzZJLE9BQVEsRUFKRyxDQUFiLENBS0c7RUFFSHp2RSxNQUFNMHZFLFlBQU4sQ0FBcUIsQ0FDbkJDLE1BQU9DLE1BQU1yNkksSUFETSxDQUVuQnM2SSxLQUFNRCxNQUFNcDZJLE1BRk8sQ0FHbkJzNkksSUFBS0YsTUFBTW42SSxLQUhRLENBQXJCLENBSUc7RUFFSHVxRSxNQUFNK3ZFLE9BQU4sQ0FBZ0IvdkUsTUFBTXJtRixNQUFOLENBQWErZSxLQUFiLEVBQWhCLENBQ0FzbkUsTUFBTWd3RSxTQUFOLENBQWtCaHdFLE1BQU16c0YsTUFBTixDQUFhb3hCLFFBQWIsQ0FBc0JqTSxLQUF0QixFQUFsQixDQUNBc25FLE1BQU1pd0UsS0FBTixDQUFjandFLE1BQU16c0YsTUFBTixDQUFhaTlDLElBQTNCLENBQWlDO0VBQ2pDO0VBQ0E7RUFFQXd2QyxNQUFNa3dFLGFBQU4sQ0FBc0IsVUFBWSxDQUNoQyxpQkFBaUIxakksR0FBakIsQ0FDRCxDQUZELENBSUF3ekQsTUFBTW13RSxpQkFBTixDQUEwQixVQUFZLENBQ3BDLGlCQUFpQmxzSSxLQUFqQixDQUNELENBRkQsQ0FJQSs3RCxNQUFNM3NGLEtBQU4sQ0FBYyxVQUFZLENBQ3hCMnNGLE1BQU1ybUYsTUFBTixDQUFhZ2YsSUFBYixDQUFrQnFuRSxNQUFNK3ZFLE9BQXhCLEVBRUEvdkUsTUFBTXpzRixNQUFOLENBQWFveEIsUUFBYixDQUFzQmhNLElBQXRCLENBQTJCcW5FLE1BQU1nd0UsU0FBakMsRUFFQWh3RSxNQUFNenNGLE1BQU4sQ0FBYWk5QyxJQUFiLENBQW9Cd3ZDLE1BQU1pd0UsS0FBMUIsQ0FFQWp3RSxNQUFNenNGLE1BQU4sQ0FBYW05QyxzQkFBYixHQUVBc3ZDLE1BQU0xcUUsYUFBTixDQUFvQjg2SSxXQUFwQixFQUVBcHdFLE1BQU10NEQsTUFBTixHQUVBajJCLE1BQVE0K0osTUFBTUMsSUFBZCxDQUNELENBZEQsQ0FjRztFQUdIdHdFLE1BQU10NEQsTUFBTixDQUFlLFVBQVksQ0FDekIsV0FBYSxXQUFBLEVBQWIsQ0FBNEI7RUFFNUIsU0FBVyxjQUFBLEdBQWlCbUIsa0JBQWpCLENBQW9DdDFCLE9BQU82c0IsRUFBM0MsQ0FBK0MsV0FBQSxDQUFZLENBQVosQ0FBZSxDQUFmLENBQWtCLENBQWxCLENBQS9DLENBQVgsQ0FDQSxnQkFBa0Jtd0ksS0FBSzczSSxLQUFMLEdBQWF1USxPQUFiLEVBQWxCLENBQ0EsaUJBQW1CLFdBQUEsRUFBbkIsQ0FDQSxtQkFBcUIsY0FBQSxFQUFyQixDQUNBLGlCQUFtQixDQUNqQixhQUFlKzJELE1BQU16c0YsTUFBTixDQUFhb3hCLFFBQTVCLENBQ0F0SixPQUFPMUMsSUFBUCxDQUFZZ00sUUFBWixFQUFzQjFMLEdBQXRCLENBQTBCK21FLE1BQU1ybUYsTUFBaEMsRUFBeUM7RUFFekMwaEIsT0FBT21QLGVBQVAsQ0FBdUIrbEksSUFBdkIsRUFBOEI7RUFFOUJDLFVBQVUxa0gsY0FBVixDQUF5Qnp3QixNQUF6QixFQUNBLEdBQUkya0UsTUFBTXF2RSxVQUFOLEVBQW9CNTlKLFFBQVU0K0osTUFBTUMsSUFBeEMsQ0FBOENHLFdBQVdDLHNCQUFYLEVBQzlDRixVQUFVdnNJLEtBQVYsRUFBbUIwc0ksZUFBZTFzSSxLQUFsQyxDQUNBdXNJLFVBQVVoa0ksR0FBVixFQUFpQm1rSSxlQUFlbmtJLEdBQWhDLENBQXFDO0VBRXJDZ2tJLFVBQVV2c0ksS0FBVixDQUFrQnJ1QixLQUFLOEUsR0FBTCxDQUFTc2xGLE1BQU0ydUUsZUFBZixDQUFnQy80SixLQUFLNkUsR0FBTCxDQUFTdWxGLE1BQU00dUUsZUFBZixDQUFnQzRCLFVBQVV2c0ksS0FBMUMsQ0FBaEMsQ0FBbEIsQ0FBcUc7RUFFckd1c0ksVUFBVWhrSSxHQUFWLENBQWdCNTJCLEtBQUs4RSxHQUFMLENBQVNzbEYsTUFBTXl1RSxhQUFmLENBQThCNzRKLEtBQUs2RSxHQUFMLENBQVN1bEYsTUFBTTB1RSxhQUFmLENBQThCOEIsVUFBVWhrSSxHQUF4QyxDQUE5QixDQUFoQixDQUNBZ2tJLFVBQVVqM0IsUUFBVixHQUNBaTNCLFVBQVUvakksTUFBVixFQUFvQi9JLEtBQXBCLENBQTJCO0VBRTNCOHNJLFVBQVUvakksTUFBVixDQUFtQjcyQixLQUFLOEUsR0FBTCxDQUFTc2xGLE1BQU12NEIsV0FBZixDQUE0Qjd4RCxLQUFLNkUsR0FBTCxDQUFTdWxGLE1BQU1rbkMsV0FBZixDQUE0QnNwQyxVQUFVL2pJLE1BQXRDLENBQTVCLENBQW5CLENBQStGO0VBRS9GdXpELE1BQU1ybUYsTUFBTixDQUFhaWYsR0FBYixDQUFpQmc0SSxTQUFqQixFQUVBdjFJLE9BQU9rUixnQkFBUCxDQUF3QmlrSSxTQUF4QixFQUFvQztFQUVwQ24xSSxPQUFPbVAsZUFBUCxDQUF1QnFtSSxXQUF2QixFQUNBbHNJLFNBQVNoTSxJQUFULENBQWNxbkUsTUFBTXJtRixNQUFwQixFQUE0QmlmLEdBQTVCLENBQWdDeUMsTUFBaEMsRUFFQTJrRSxNQUFNenNGLE1BQU4sQ0FBYTJzQixNQUFiLENBQW9COC9ELE1BQU1ybUYsTUFBMUIsRUFFQSxHQUFJcW1GLE1BQU02dUUsYUFBTixHQUF3QixJQUE1QixDQUFrQyxDQUNoQzhCLGVBQWUxc0ksS0FBZixFQUF3QixFQUFJKzdELE1BQU04dUUsYUFBbEMsQ0FDQTZCLGVBQWVua0ksR0FBZixFQUFzQixFQUFJd3pELE1BQU04dUUsYUFBaEMsQ0FDRCxDQUhELG9CQUdzQnpxSixHQUFmLENBQW1CLENBQW5CLENBQXNCLENBQXRCLENBQXlCLENBQXpCLEVBRVBxZixNQUFRLENBQVIsQ0FDQWt0SSxVQUFVdnNKLEdBQVYsQ0FBYyxDQUFkLENBQWlCLENBQWpCLENBQW9CLENBQXBCLEVBQXdCO0VBQ3hCO0VBQ0E7RUFFQSxHQUFJeXNKLGFBQWVDLGFBQWFyMkksaUJBQWIsQ0FBK0JzbEUsTUFBTXpzRixNQUFOLENBQWFveEIsUUFBNUMsRUFBd0RxRSxHQUF2RSxFQUE4RSxHQUFLLEVBQUlnb0ksZUFBZS8ySSxHQUFmLENBQW1CK2xFLE1BQU16c0YsTUFBTixDQUFhcXhCLFVBQWhDLENBQVQsRUFBd0RvRSxHQUExSSxDQUErSSxDQUM3SWczRCxNQUFNMXFFLGFBQU4sQ0FBb0I4NkksV0FBcEIsRUFFQVcsYUFBYXA0SSxJQUFiLENBQWtCcW5FLE1BQU16c0YsTUFBTixDQUFhb3hCLFFBQS9CLEVBQ0Fxc0ksZUFBZXI0SSxJQUFmLENBQW9CcW5FLE1BQU16c0YsTUFBTixDQUFhcXhCLFVBQWpDLEVBQ0Frc0ksWUFBYyxLQUFkLENBQ0EsV0FBQSxDQUNELENBRUQsWUFBQSxDQUNELENBaERNLEVBQVAsQ0FpREQsQ0F4REQsQ0EwREE5d0UsTUFBTXh2RCxPQUFOLENBQWdCLFVBQVksQ0FDMUJ3dkQsTUFBTXBDLFVBQU4sQ0FBaUJ6b0UsbUJBQWpCLENBQXFDLGFBQXJDLENBQW9EODdJLGFBQXBELENBQW1FLEtBQW5FLEVBRUFqeEUsTUFBTXBDLFVBQU4sQ0FBaUJ6b0UsbUJBQWpCLENBQXFDLFdBQXJDLENBQWtEKzdJLFdBQWxELENBQStELEtBQS9ELEVBRUFseEUsTUFBTXBDLFVBQU4sQ0FBaUJ6b0UsbUJBQWpCLENBQXFDLE9BQXJDLENBQThDZzhJLFlBQTlDLENBQTRELEtBQTVELEVBRUFueEUsTUFBTXBDLFVBQU4sQ0FBaUJ6b0UsbUJBQWpCLENBQXFDLFlBQXJDLENBQW1EaThJLFlBQW5ELENBQWlFLEtBQWpFLEVBRUFweEUsTUFBTXBDLFVBQU4sQ0FBaUJ6b0UsbUJBQWpCLENBQXFDLFVBQXJDLENBQWlEazhJLFVBQWpELENBQTZELEtBQTdELEVBRUFyeEUsTUFBTXBDLFVBQU4sQ0FBaUJ6b0UsbUJBQWpCLENBQXFDLFdBQXJDLENBQWtEbThJLFdBQWxELENBQStELEtBQS9ELEVBRUEzNUosU0FBU3dkLG1CQUFULENBQTZCLFdBQTdCLENBQTBDbzhJLFdBQTFDLENBQXVELEtBQXZELEVBQ0E1NUosU0FBU3dkLG1CQUFULENBQTZCLFNBQTdCLENBQXdDcThJLFNBQXhDLENBQW1ELEtBQW5ELEVBQ0E3NkosT0FBT3dlLG1CQUFQLENBQTJCLFNBQTNCLENBQXNDczhJLFNBQXRDLENBQWlELEtBQWpELEVBQXlEO0VBQzFELENBaEJELENBZ0JHO0VBQ0g7RUFDQTtFQUdBLGdCQUFrQixDQUNoQi9pSyxLQUFNLFFBRFUsQ0FBbEIsQ0FHQSxlQUFpQixDQUNmQSxLQUFNLE9BRFMsQ0FBakIsQ0FHQSxhQUFlLENBQ2JBLEtBQU0sS0FETyxDQUFmLENBR0EsVUFBWSxDQUNWNGhLLEtBQU0sQ0FBQyxDQURHLENBRVZvQixPQUFRLENBRkUsQ0FHVkMsTUFBTyxDQUhHLENBSVY3QixJQUFLLENBSkssQ0FLVjhCLGFBQWMsQ0FMSixDQU1WQyxZQUFhLENBTkgsQ0FPVkMsVUFBVyxDQVBELENBQVosQ0FTQSxVQUFZekIsTUFBTUMsSUFBbEIsQ0FDQSxRQUFVLFFBQVYsQ0FBb0I7RUFFcEIsY0FBZ0IsYUFBQSxFQUFoQixDQUNBLG1CQUFxQixhQUFBLEVBQXJCLENBQ0EsVUFBWSxDQUFaLENBQ0EsY0FBZ0IsV0FBQSxFQUFoQixDQUNBLGdCQUFrQixLQUFsQixDQUNBLGdCQUFrQixXQUFBLEVBQWxCLENBQ0EsY0FBZ0IsV0FBQSxFQUFoQixDQUNBLGdCQUFrQixXQUFBLEVBQWxCLENBQ0EsYUFBZSxXQUFBLEVBQWYsQ0FDQSxXQUFhLFdBQUEsRUFBYixDQUNBLGFBQWUsV0FBQSxFQUFmLENBQ0EsZUFBaUIsV0FBQSxFQUFqQixDQUNBLGFBQWUsV0FBQSxFQUFmLENBQ0EsZUFBaUIsV0FBQSxFQUFqQixDQUVBLHlCQUEyQiw2QkFBQSxFQUFnQyxDQUN6RCxTQUFXMTZKLEtBQUsrZixFQUFULENBQWMsRUFBZCxDQUFtQixFQUFuQixDQUF3QnFxRSxNQUFNc3ZFLGVBQXJDLENBQ0QsQ0FGRCxDQUlBLGlCQUFtQixxQkFBQSxFQUF3QixDQUN6QyxZQUFZLzZJLEdBQUwsQ0FBUyxJQUFULENBQWV5ckUsTUFBTWd2RSxTQUFyQixDQUFQLENBQ0QsQ0FGRCxDQUlBLGVBQWlCLG1CQUFBLENBQW9CejBJLEtBQXBCLENBQTJCLENBQzFDbzJJLGVBQWUxc0ksS0FBZixFQUF3QjFKLEtBQXhCLENBQ0QsQ0FGRCxDQUlBLGFBQWUsaUJBQUEsQ0FBa0JBLEtBQWxCLENBQXlCLENBQ3RDbzJJLGVBQWVua0ksR0FBZixFQUFzQmpTLEtBQXRCLENBQ0QsQ0FGRCxDQUlBLFlBQWMsVUFBWSxDQUN4QixNQUFRLFdBQUEsRUFBUixDQUNBLGdCQUFpQnNmLFFBQVYsQ0FBb0JrNEgsWUFBcEIsQ0FBa0MsQ0FDdkMzckosRUFBRXFYLG1CQUFGLENBQXNCczBJLFlBQXRCLENBQW9DLENBQXBDLEVBQXdDO0VBRXhDM3JKLEVBQUVpVCxjQUFGLENBQWlCLENBQUN3Z0IsUUFBbEIsRUFDQSsySCxVQUFVaDRJLEdBQVYsQ0FBY3hTLENBQWQsRUFDRCxDQUxELENBTUQsQ0FSYSxFQUFkLENBVUEsVUFBWSxVQUFZLENBQ3RCLE1BQVEsV0FBQSxFQUFSLENBQ0EsZ0JBQWlCeXpCLFFBQVYsQ0FBb0JrNEgsWUFBcEIsQ0FBa0MsQ0FDdkMzckosRUFBRXFYLG1CQUFGLENBQXNCczBJLFlBQXRCLENBQW9DLENBQXBDLEVBQXdDO0VBRXhDM3JKLEVBQUVpVCxjQUFGLENBQWlCd2dCLFFBQWpCLEVBQ0ErMkgsVUFBVWg0SSxHQUFWLENBQWN4UyxDQUFkLEVBQ0QsQ0FMRCxDQU1ELENBUlcsRUFBWixDQVFLO0VBR0wsUUFBVSxVQUFZLENBQ3BCLFdBQWEsV0FBQSxFQUFiLENBQ0EsZ0JBQWlCNHJKLE1BQVYsQ0FBa0JDLE1BQWxCLENBQTBCLENBQy9CLFlBQWNqeUUsTUFBTXBDLFVBQU4sR0FBcUJqbUYsUUFBckIsQ0FBZ0Nxb0YsTUFBTXBDLFVBQU4sQ0FBaUIwMkQsSUFBakQsQ0FBd0R0MEQsTUFBTXBDLFVBQTVFLENBRUEsR0FBSW9DLE1BQU16c0YsTUFBTiw2QkFBSixDQUErQztFQUU3QyxhQUFleXNGLE1BQU16c0YsTUFBTixDQUFhb3hCLFFBQTVCLENBQ0F0SixPQUFPMUMsSUFBUCxDQUFZZ00sUUFBWixFQUFzQjFMLEdBQXRCLENBQTBCK21FLE1BQU1ybUYsTUFBaEMsRUFDQSxtQkFBcUIwaEIsT0FBTzNuQixNQUFQLEVBQXJCLENBQXNDO0VBRXRDdytKLGdCQUFrQnQ4SixLQUFLZ2tGLEdBQUwsQ0FBU29HLE1BQU16c0YsTUFBTixDQUFhd2xGLEdBQWIsQ0FBbUIsQ0FBbkIsQ0FBdUJuakYsS0FBSytmLEVBQTVCLENBQWlDLEtBQTFDLENBQWxCLENBQW9FO0VBRXBFdzhJLFFBQVEsRUFBSUgsTUFBSixDQUFhRSxjQUFiLENBQThCdGlILFFBQVF3aUgsWUFBOUMsQ0FBNERweUUsTUFBTXpzRixNQUFOLENBQWF5eEIsTUFBekUsRUFDQXF0SSxNQUFNLEVBQUlKLE1BQUosQ0FBYUMsY0FBYixDQUE4QnRpSCxRQUFRd2lILFlBQTVDLENBQTBEcHlFLE1BQU16c0YsTUFBTixDQUFheXhCLE1BQXZFLEVBQ0QsQ0FWRCxRQVVXZzdELE1BQU16c0YsTUFBTiw4QkFBSixDQUFnRDtFQUVyRDQrSixRQUFRSCxRQUFVaHlFLE1BQU16c0YsTUFBTixDQUFha3lCLEtBQWIsQ0FBcUJ1NkQsTUFBTXpzRixNQUFOLENBQWFpeUIsSUFBNUMsRUFBb0R3NkQsTUFBTXpzRixNQUFOLENBQWFpOUMsSUFBakUsQ0FBd0VaLFFBQVEwaUgsV0FBeEYsQ0FBcUd0eUUsTUFBTXpzRixNQUFOLENBQWF5eEIsTUFBbEgsRUFDQXF0SSxNQUFNSixRQUFVanlFLE1BQU16c0YsTUFBTixDQUFhbXlCLEdBQWIsQ0FBbUJzNkQsTUFBTXpzRixNQUFOLENBQWFveUIsTUFBMUMsRUFBb0RxNkQsTUFBTXpzRixNQUFOLENBQWFpOUMsSUFBakUsQ0FBd0VaLFFBQVF3aUgsWUFBdEYsQ0FBb0dweUUsTUFBTXpzRixNQUFOLENBQWF5eEIsTUFBakgsRUFDRCxDQUpNLElBSUE7RUFFTGhjLFFBQVE2UCxJQUFSLENBQWEsb0ZBQWIsRUFDQW1uRSxNQUFNbXZFLFNBQU4sQ0FBa0IsS0FBbEIsQ0FDRCxDQUNGLENBdEJELENBdUJELENBekJTLEVBQVYsQ0EyQkEsWUFBYyxnQkFBQSxDQUFpQm9ELFVBQWpCLENBQTZCLENBQ3pDLEdBQUl2eUUsTUFBTXpzRixNQUFOLDZCQUFKLENBQStDbXdCLE9BQVM2dUksVUFBVCxDQUEvQyxRQUE0RXZ5RSxNQUFNenNGLE1BQU4sOEJBQUosQ0FBZ0QsQ0FDdEh5c0YsTUFBTXpzRixNQUFOLENBQWFpOUMsSUFBYixDQUFvQjU2QyxLQUFLOEUsR0FBTCxDQUFTc2xGLE1BQU11dUUsT0FBZixDQUF3QjM0SixLQUFLNkUsR0FBTCxDQUFTdWxGLE1BQU13dUUsT0FBZixDQUF3Qnh1RSxNQUFNenNGLE1BQU4sQ0FBYWk5QyxJQUFiLENBQW9CK2hILFVBQTVDLENBQXhCLENBQXBCLENBRUF2eUUsTUFBTXpzRixNQUFOLENBQWFtOUMsc0JBQWIsR0FFQW9nSCxZQUFjLElBQWQsQ0FDRCxDQU51RSxJQU1qRSxDQUNMOW5KLFFBQVE2UCxJQUFSLENBQWEsMkZBQWIsRUFDQW1uRSxNQUFNK3VFLFVBQU4sQ0FBbUIsS0FBbkIsQ0FDRCxDQUNGLENBWEQsQ0FhQSxhQUFlLGlCQUFBLENBQWtCd0QsVUFBbEIsQ0FBOEIsQ0FDM0MsR0FBSXZ5RSxNQUFNenNGLE1BQU4sNkJBQUosQ0FBK0Ntd0IsT0FBUzZ1SSxVQUFULENBQS9DLFFBQTRFdnlFLE1BQU16c0YsTUFBTiw4QkFBSixDQUFnRCxDQUN0SHlzRixNQUFNenNGLE1BQU4sQ0FBYWk5QyxJQUFiLENBQW9CNTZDLEtBQUs4RSxHQUFMLENBQVNzbEYsTUFBTXV1RSxPQUFmLENBQXdCMzRKLEtBQUs2RSxHQUFMLENBQVN1bEYsTUFBTXd1RSxPQUFmLENBQXdCeHVFLE1BQU16c0YsTUFBTixDQUFhaTlDLElBQWIsQ0FBb0IraEgsVUFBNUMsQ0FBeEIsQ0FBcEIsQ0FFQXZ5RSxNQUFNenNGLE1BQU4sQ0FBYW05QyxzQkFBYixHQUVBb2dILFlBQWMsSUFBZCxDQUNELENBTnVFLElBTWpFLENBQ0w5bkosUUFBUTZQLElBQVIsQ0FBYSwyRkFBYixFQUNBbW5FLE1BQU0rdUUsVUFBTixDQUFtQixLQUFuQixDQUNELENBQ0YsQ0FYRCxDQVdHO0VBQ0g7RUFDQTtFQUdBLDBCQUE0Qiw4QkFBQSxDQUErQjdySixLQUEvQixDQUFzQztFQUVoRXN2SixZQUFZbnVKLEdBQVosQ0FBZ0JuQixNQUFNZ3BKLE9BQXRCLENBQStCaHBKLE1BQU1pcEosT0FBckMsRUFDRCxDQUhELENBS0EseUJBQTJCLDZCQUFBLENBQThCanBKLEtBQTlCLENBQXFDO0VBRTlEdXZKLFdBQVdwdUosR0FBWCxDQUFlbkIsTUFBTWdwSixPQUFyQixDQUE4QmhwSixNQUFNaXBKLE9BQXBDLEVBQ0QsQ0FIRCxDQUtBLHVCQUF5QiwyQkFBQSxDQUE0QmpwSixLQUE1QixDQUFtQztFQUUxRHd2SixTQUFTcnVKLEdBQVQsQ0FBYW5CLE1BQU1ncEosT0FBbkIsQ0FBNEJocEosTUFBTWlwSixPQUFsQyxFQUNELENBSEQsQ0FLQSwwQkFBNEIsOEJBQUEsQ0FBK0JqcEosS0FBL0IsQ0FBc0M7RUFFaEV5dkosVUFBVXR1SixHQUFWLENBQWNuQixNQUFNZ3BKLE9BQXBCLENBQTZCaHBKLE1BQU1pcEosT0FBbkMsRUFDQXlHLFlBQVkxNUksVUFBWixDQUF1Qnk1SSxTQUF2QixDQUFrQ0gsV0FBbEMsRUFDQSxZQUFjeHlFLE1BQU1wQyxVQUFOLEdBQXFCam1GLFFBQXJCLENBQWdDcW9GLE1BQU1wQyxVQUFOLENBQWlCMDJELElBQWpELENBQXdEdDBELE1BQU1wQyxVQUE1RSxDQUF3RjtFQUV4RjZ5RSxXQUFXLEVBQUk3NkosS0FBSytmLEVBQVQsQ0FBY2k5SSxZQUFZdHNKLENBQTFCLENBQThCc3BDLFFBQVEwaUgsV0FBdEMsQ0FBb0R0eUUsTUFBTWt2RSxXQUFyRSxFQUFtRjtFQUVuRjJELFNBQVMsRUFBSWo5SixLQUFLK2YsRUFBVCxDQUFjaTlJLFlBQVk5N0ksQ0FBMUIsQ0FBOEI4NEIsUUFBUXdpSCxZQUF0QyxDQUFxRHB5RSxNQUFNa3ZFLFdBQXBFLEVBQ0FzRCxZQUFZNzVJLElBQVosQ0FBaUJnNkksU0FBakIsRUFFQTN5RSxNQUFNdDRELE1BQU4sR0FDRCxDQVpELENBY0EseUJBQTJCLDZCQUFBLENBQThCeGtCLEtBQTlCLENBQXFDO0VBRTlENHZKLFNBQVN6dUosR0FBVCxDQUFhbkIsTUFBTWdwSixPQUFuQixDQUE0QmhwSixNQUFNaXBKLE9BQWxDLEVBQ0E0RyxXQUFXNzVJLFVBQVgsQ0FBc0I0NUksUUFBdEIsQ0FBZ0NMLFVBQWhDLEVBQ0EsR0FBSU0sV0FBV2o4SSxDQUFYLENBQWUsQ0FBbkIsQ0FBc0JrOEksUUFBUUMsY0FBUixFQUF0QixRQUF1REYsV0FBV2o4SSxDQUFYLENBQWUsQ0FBbkIsQ0FBc0JvOEksU0FBU0QsY0FBVCxFQUN6RVIsV0FBVzk1SSxJQUFYLENBQWdCbTZJLFFBQWhCLEVBRUE5eUUsTUFBTXQ0RCxNQUFOLEdBQ0QsQ0FSRCxDQVVBLHVCQUF5QiwyQkFBQSxDQUE0QnhrQixLQUE1QixDQUFtQztFQUUxRGl3SixPQUFPOXVKLEdBQVAsQ0FBV25CLE1BQU1ncEosT0FBakIsQ0FBMEJocEosTUFBTWlwSixPQUFoQyxFQUNBaUgsU0FBU2w2SSxVQUFULENBQW9CaTZJLE1BQXBCLENBQTRCVCxRQUE1QixFQUNBVyxJQUFJRCxTQUFTOXNKLENBQWIsQ0FBZ0I4c0osU0FBU3Q4SSxDQUF6QixFQUNBNDdJLFNBQVMvNUksSUFBVCxDQUFjdzZJLE1BQWQsRUFFQW56RSxNQUFNdDRELE1BQU4sR0FDRCxDQVJELENBVUEscUJBQXVCLHlCQUFBLENBQTBCeGtCLEtBQTFCLENBQWlDO0VBRXRELEdBQUlBLE1BQU0rdUosTUFBTixDQUFlLENBQW5CLENBQXNCaUIsU0FBU0QsY0FBVCxFQUF0QixRQUF3RC92SixNQUFNK3VKLE1BQU4sQ0FBZSxDQUFuQixDQUFzQmUsUUFBUUMsY0FBUixFQUUxRWp6RSxNQUFNdDRELE1BQU4sR0FDRCxDQUxELENBT0Esa0JBQW9CLHNCQUFBLENBQXVCeGtCLEtBQXZCLENBQThCO0VBRWhELE9BQVFBLE1BQU1vd0osT0FBZCxFQUNFLFdBQVdoZ0ssSUFBTixDQUFXazhKLEVBQWhCLENBQ0U2RCxJQUFJLENBQUosQ0FBT3J6RSxNQUFNb3ZFLFdBQWIsRUFFQXB2RSxNQUFNdDRELE1BQU4sR0FFQSxNQUVGLFdBQVdwMEIsSUFBTixDQUFXbThKLE1BQWhCLENBQ0U0RCxJQUFJLENBQUosQ0FBTyxDQUFDcnpFLE1BQU1vdkUsV0FBZCxFQUVBcHZFLE1BQU10NEQsTUFBTixHQUVBLE1BRUYsV0FBV3AwQixJQUFOLENBQVdpaUIsSUFBaEIsQ0FDRTg5SSxJQUFJcnpFLE1BQU1vdkUsV0FBVixDQUF1QixDQUF2QixFQUVBcHZFLE1BQU10NEQsTUFBTixHQUVBLE1BRUYsV0FBV3AwQixJQUFOLENBQVdtaUIsS0FBaEIsQ0FDRTQ5SSxJQUFJLENBQUNyekUsTUFBTW92RSxXQUFYLENBQXdCLENBQXhCLEVBRUFwdkUsTUFBTXQ0RCxNQUFOLEdBRUEsTUEzQkosQ0E2QkQsQ0EvQkQsQ0FpQ0EsMkJBQTZCLCtCQUFBLENBQWdDeGtCLEtBQWhDLENBQXVDO0VBRWxFc3ZKLFlBQVludUosR0FBWixDQUFnQm5CLE1BQU1xd0osT0FBTixDQUFjLENBQWQsRUFBaUJDLEtBQWpDLENBQXdDdHdKLE1BQU1xd0osT0FBTixDQUFjLENBQWQsRUFBaUJFLEtBQXpELEVBQ0QsQ0FIRCxDQUtBLDBCQUE0Qiw4QkFBQSxDQUErQnZ3SixLQUEvQixDQUFzQztFQUVoRSxPQUFTQSxNQUFNcXdKLE9BQU4sQ0FBYyxDQUFkLEVBQWlCQyxLQUFqQixDQUF5QnR3SixNQUFNcXdKLE9BQU4sQ0FBYyxDQUFkLEVBQWlCQyxLQUFuRCxDQUNBLE9BQVN0d0osTUFBTXF3SixPQUFOLENBQWMsQ0FBZCxFQUFpQkUsS0FBakIsQ0FBeUJ2d0osTUFBTXF3SixPQUFOLENBQWMsQ0FBZCxFQUFpQkUsS0FBbkQsQ0FDQSxhQUFlNzlKLEtBQUt1a0IsSUFBTCxDQUFVUyxHQUFLQSxFQUFMLENBQVVELEdBQUtBLEVBQXpCLENBQWYsQ0FDQTgzSSxXQUFXcHVKLEdBQVgsQ0FBZSxDQUFmLENBQWtCdzFCLFFBQWxCLEVBQ0QsQ0FORCxDQVFBLHdCQUEwQiw0QkFBQSxDQUE2QjMyQixLQUE3QixDQUFvQztFQUU1RHd2SixTQUFTcnVKLEdBQVQsQ0FBYW5CLE1BQU1xd0osT0FBTixDQUFjLENBQWQsRUFBaUJDLEtBQTlCLENBQXFDdHdKLE1BQU1xd0osT0FBTixDQUFjLENBQWQsRUFBaUJFLEtBQXRELEVBQ0QsQ0FIRCxDQUtBLDBCQUE0Qiw4QkFBQSxDQUErQnZ3SixLQUEvQixDQUFzQztFQUVoRXl2SixVQUFVdHVKLEdBQVYsQ0FBY25CLE1BQU1xd0osT0FBTixDQUFjLENBQWQsRUFBaUJDLEtBQS9CLENBQXNDdHdKLE1BQU1xd0osT0FBTixDQUFjLENBQWQsRUFBaUJFLEtBQXZELEVBQ0FiLFlBQVkxNUksVUFBWixDQUF1Qnk1SSxTQUF2QixDQUFrQ0gsV0FBbEMsRUFDQSxZQUFjeHlFLE1BQU1wQyxVQUFOLEdBQXFCam1GLFFBQXJCLENBQWdDcW9GLE1BQU1wQyxVQUFOLENBQWlCMDJELElBQWpELENBQXdEdDBELE1BQU1wQyxVQUE1RSxDQUF3RjtFQUV4RjZ5RSxXQUFXLEVBQUk3NkosS0FBSytmLEVBQVQsQ0FBY2k5SSxZQUFZdHNKLENBQTFCLENBQThCc3BDLFFBQVEwaUgsV0FBdEMsQ0FBb0R0eUUsTUFBTWt2RSxXQUFyRSxFQUFtRjtFQUVuRjJELFNBQVMsRUFBSWo5SixLQUFLK2YsRUFBVCxDQUFjaTlJLFlBQVk5N0ksQ0FBMUIsQ0FBOEI4NEIsUUFBUXdpSCxZQUF0QyxDQUFxRHB5RSxNQUFNa3ZFLFdBQXBFLEVBQ0FzRCxZQUFZNzVJLElBQVosQ0FBaUJnNkksU0FBakIsRUFFQTN5RSxNQUFNdDRELE1BQU4sR0FDRCxDQVpELENBY0EseUJBQTJCLDZCQUFBLENBQThCeGtCLEtBQTlCLENBQXFDO0VBRTlELE9BQVNBLE1BQU1xd0osT0FBTixDQUFjLENBQWQsRUFBaUJDLEtBQWpCLENBQXlCdHdKLE1BQU1xd0osT0FBTixDQUFjLENBQWQsRUFBaUJDLEtBQW5ELENBQ0EsT0FBU3R3SixNQUFNcXdKLE9BQU4sQ0FBYyxDQUFkLEVBQWlCRSxLQUFqQixDQUF5QnZ3SixNQUFNcXdKLE9BQU4sQ0FBYyxDQUFkLEVBQWlCRSxLQUFuRCxDQUNBLGFBQWU3OUosS0FBS3VrQixJQUFMLENBQVVTLEdBQUtBLEVBQUwsQ0FBVUQsR0FBS0EsRUFBekIsQ0FBZixDQUNBbTRJLFNBQVN6dUosR0FBVCxDQUFhLENBQWIsQ0FBZ0J3MUIsUUFBaEIsRUFDQWs1SCxXQUFXNzVJLFVBQVgsQ0FBc0I0NUksUUFBdEIsQ0FBZ0NMLFVBQWhDLEVBQ0EsR0FBSU0sV0FBV2o4SSxDQUFYLENBQWUsQ0FBbkIsQ0FBc0JvOEksU0FBU0QsY0FBVCxFQUF0QixRQUF3REYsV0FBV2o4SSxDQUFYLENBQWUsQ0FBbkIsQ0FBc0JrOEksUUFBUUMsY0FBUixFQUMxRVIsV0FBVzk1SSxJQUFYLENBQWdCbTZJLFFBQWhCLEVBRUE5eUUsTUFBTXQ0RCxNQUFOLEdBQ0QsQ0FYRCxDQWFBLHVCQUF5QiwyQkFBQSxDQUE0QnhrQixLQUE1QixDQUFtQztFQUUxRGl3SixPQUFPOXVKLEdBQVAsQ0FBV25CLE1BQU1xd0osT0FBTixDQUFjLENBQWQsRUFBaUJDLEtBQTVCLENBQW1DdHdKLE1BQU1xd0osT0FBTixDQUFjLENBQWQsRUFBaUJFLEtBQXBELEVBQ0FMLFNBQVNsNkksVUFBVCxDQUFvQmk2SSxNQUFwQixDQUE0QlQsUUFBNUIsRUFDQVcsSUFBSUQsU0FBUzlzSixDQUFiLENBQWdCOHNKLFNBQVN0OEksQ0FBekIsRUFDQTQ3SSxTQUFTLzVJLElBQVQsQ0FBY3c2SSxNQUFkLEVBRUFuekUsTUFBTXQ0RCxNQUFOLEdBQ0QsQ0FSRCxDQVNBO0VBQ0E7RUFHQSxnQkFBa0Isb0JBQUEsQ0FBcUJ4a0IsS0FBckIsQ0FBNEIsQ0FDNUMsR0FBSTg4RSxNQUFNaHZDLE9BQU4sR0FBa0IsS0FBdEIsQ0FBNkIsT0FDN0I5dEMsTUFBTXErRSxjQUFOLEdBRUEsR0FBSXIrRSxNQUFNd3dKLE1BQU4sR0FBaUIxekUsTUFBTTB2RSxZQUFOLENBQW1CQyxLQUF4QyxDQUErQyxDQUM3QyxHQUFJM3ZFLE1BQU1pdkUsWUFBTixHQUF1QixLQUEzQixDQUFrQyxPQUNsQzBFLHNCQUFzQnp3SixLQUF0QixFQUNBelIsTUFBUTQrSixNQUFNcUIsTUFBZCxDQUNELENBSkQsUUFJV3h1SixNQUFNd3dKLE1BQU4sR0FBaUIxekUsTUFBTTB2RSxZQUFOLENBQW1CRyxJQUF4QyxDQUE4QyxDQUNuRCxHQUFJN3ZFLE1BQU0rdUUsVUFBTixHQUFxQixLQUF6QixDQUFnQyxPQUNoQzZFLHFCQUFxQjF3SixLQUFyQixFQUNBelIsTUFBUTQrSixNQUFNc0IsS0FBZCxDQUNELENBSk0sUUFJSXp1SixNQUFNd3dKLE1BQU4sR0FBaUIxekUsTUFBTTB2RSxZQUFOLENBQW1CSSxHQUF4QyxDQUE2QyxDQUNsRCxHQUFJOXZFLE1BQU1tdkUsU0FBTixHQUFvQixLQUF4QixDQUErQixPQUMvQjBFLG1CQUFtQjN3SixLQUFuQixFQUNBelIsTUFBUTQrSixNQUFNUCxHQUFkLENBQ0QsQ0FFRCxHQUFJcitKLFFBQVU0K0osTUFBTUMsSUFBcEIsQ0FBMEIsQ0FDeEJ0d0UsTUFBTXF1RSxZQUFOLENBQW1CenJCLEVBQW5CLENBQXNCLFdBQXRCLENBQW1DMnVCLFdBQW5DLENBQWdELEtBQWhELEVBRUF2eEUsTUFBTXF1RSxZQUFOLENBQW1CenJCLEVBQW5CLENBQXNCLFNBQXRCLENBQWlDNHVCLFNBQWpDLENBQTRDLEtBQTVDLEVBRUF4eEUsTUFBTTFxRSxhQUFOLENBQW9CdytJLFVBQXBCLEVBQ0QsQ0FDRixDQXpCRCxDQTJCQSxnQkFBa0Isb0JBQUEsQ0FBcUI1d0osS0FBckIsQ0FBNEIsQ0FDNUMsR0FBSTg4RSxNQUFNaHZDLE9BQU4sR0FBa0IsS0FBdEIsQ0FBNkIsT0FDN0I5dEMsTUFBTXErRSxjQUFOLEdBRUEsR0FBSTl2RixRQUFVNCtKLE1BQU1xQixNQUFwQixDQUE0QixDQUMxQixHQUFJMXhFLE1BQU1pdkUsWUFBTixHQUF1QixLQUEzQixDQUFrQyxPQUNsQzhFLHNCQUFzQjd3SixLQUF0QixFQUNELENBSEQsUUFHV3pSLFFBQVU0K0osTUFBTXNCLEtBQXBCLENBQTJCLENBQ2hDLEdBQUkzeEUsTUFBTSt1RSxVQUFOLEdBQXFCLEtBQXpCLENBQWdDLE9BQ2hDaUYscUJBQXFCOXdKLEtBQXJCLEVBQ0QsQ0FITSxRQUdJelIsUUFBVTQrSixNQUFNUCxHQUFwQixDQUF5QixDQUM5QixHQUFJOXZFLE1BQU1tdkUsU0FBTixHQUFvQixLQUF4QixDQUErQixPQUMvQjhFLG1CQUFtQi93SixLQUFuQixFQUNELENBQ0YsQ0FkRCxDQWdCQSxjQUFnQixrQkFBQSxDQUFtQkEsS0FBbkIsQ0FBMEIsQ0FDeEMsR0FBSTg4RSxNQUFNaHZDLE9BQU4sR0FBa0IsS0FBdEIsQ0FBNkIsT0FDN0JyNUMsU0FBU3dkLG1CQUFULENBQTZCLFdBQTdCLENBQTBDbzhJLFdBQTFDLENBQXVELEtBQXZELEVBQ0E1NUosU0FBU3dkLG1CQUFULENBQTZCLFNBQTdCLENBQXdDcThJLFNBQXhDLENBQW1ELEtBQW5ELEVBRUF4eEUsTUFBTTFxRSxhQUFOLENBQW9CNCtJLFFBQXBCLEVBRUF6aUssTUFBUTQrSixNQUFNQyxJQUFkLENBQ0QsQ0FSRCxDQVVBLGlCQUFtQixxQkFBQSxDQUFzQnB0SixLQUF0QixDQUE2QixDQUM5QyxHQUFJODhFLE1BQU1odkMsT0FBTixHQUFrQixLQUFsQixFQUEyQmd2QyxNQUFNK3VFLFVBQU4sR0FBcUIsS0FBaEQsRUFBeUR0OUosUUFBVTQrSixNQUFNQyxJQUFoQixFQUF3QjcrSixRQUFVNCtKLE1BQU1xQixNQUFyRyxDQUE2RyxPQUM3R3h1SixNQUFNcStFLGNBQU4sR0FDQXIrRSxNQUFNaXhKLGVBQU4sR0FDQUMsaUJBQWlCbHhKLEtBQWpCLEVBRUE4OEUsTUFBTTFxRSxhQUFOLENBQW9CdytJLFVBQXBCLEVBQWlDO0VBR2pDOXpFLE1BQU0xcUUsYUFBTixDQUFvQjQrSSxRQUFwQixFQUNELENBVkQsQ0FZQSxjQUFnQixrQkFBQSxDQUFtQmh4SixLQUFuQixDQUEwQixDQUN4QyxHQUFJODhFLE1BQU1odkMsT0FBTixHQUFrQixLQUFsQixFQUEyQmd2QyxNQUFNdXZFLFVBQU4sR0FBcUIsS0FBaEQsRUFBeUR2dkUsTUFBTW12RSxTQUFOLEdBQW9CLEtBQWpGLENBQXdGLE9BQ3hGa0YsY0FBY254SixLQUFkLEVBQ0QsQ0FIRCxDQUtBLGlCQUFtQixxQkFBQSxDQUFzQkEsS0FBdEIsQ0FBNkIsQ0FDOUMsR0FBSTg4RSxNQUFNaHZDLE9BQU4sR0FBa0IsS0FBdEIsQ0FBNkIsT0FFN0IsT0FBUTl0QyxNQUFNcXdKLE9BQU4sQ0FBYzcvSixNQUF0QixFQUNFLE1BQUE7RUFFRSxHQUFJc3NGLE1BQU1pdkUsWUFBTixHQUF1QixLQUEzQixDQUFrQyxPQUNsQ3FGLHVCQUF1QnB4SixLQUF2QixFQUNBelIsTUFBUTQrSixNQUFNdUIsWUFBZCxDQUNBLE1BRUYsTUFBQTtFQUVFLEdBQUk1eEUsTUFBTSt1RSxVQUFOLEdBQXFCLEtBQXpCLENBQWdDLE9BQ2hDd0Ysc0JBQXNCcnhKLEtBQXRCLEVBQ0F6UixNQUFRNCtKLE1BQU13QixXQUFkLENBQ0EsTUFFRixNQUFBO0VBRUUsR0FBSTd4RSxNQUFNbXZFLFNBQU4sR0FBb0IsS0FBeEIsQ0FBK0IsT0FDL0JxRixvQkFBb0J0eEosS0FBcEIsRUFDQXpSLE1BQVE0K0osTUFBTXlCLFNBQWQsQ0FDQSxNQUVGLFFBQ0VyZ0ssTUFBUTQrSixNQUFNQyxJQUFkLENBdkJKLENBMEJBLEdBQUk3K0osUUFBVTQrSixNQUFNQyxJQUFwQixDQUEwQnR3RSxNQUFNMXFFLGFBQU4sQ0FBb0J3K0ksVUFBcEIsRUFDM0IsQ0E5QkQsQ0FnQ0EsZ0JBQWtCLG9CQUFBLENBQXFCNXdKLEtBQXJCLENBQTRCLENBQzVDLEdBQUk4OEUsTUFBTWh2QyxPQUFOLEdBQWtCLEtBQXRCLENBQTZCLE9BQzdCOXRDLE1BQU1xK0UsY0FBTixHQUNBcitFLE1BQU1peEosZUFBTixHQUVBLE9BQVFqeEosTUFBTXF3SixPQUFOLENBQWM3L0osTUFBdEIsRUFDRSxNQUFBO0VBRUUsR0FBSXNzRixNQUFNaXZFLFlBQU4sR0FBdUIsS0FBM0IsQ0FBa0MsT0FDbEMsR0FBSXg5SixRQUFVNCtKLE1BQU11QixZQUFwQixDQUFrQyxPQUFRO0VBRTFDNkMsc0JBQXNCdnhKLEtBQXRCLEVBQ0EsTUFFRixNQUFBO0VBRUUsR0FBSTg4RSxNQUFNK3VFLFVBQU4sR0FBcUIsS0FBekIsQ0FBZ0MsT0FDaEMsR0FBSXQ5SixRQUFVNCtKLE1BQU13QixXQUFwQixDQUFpQyxPQUFRO0VBRXpDNkMscUJBQXFCeHhKLEtBQXJCLEVBQ0EsTUFFRixNQUFBO0VBRUUsR0FBSTg4RSxNQUFNbXZFLFNBQU4sR0FBb0IsS0FBeEIsQ0FBK0IsT0FDL0IsR0FBSTE5SixRQUFVNCtKLE1BQU15QixTQUFwQixDQUErQixPQUFRO0VBRXZDNkMsbUJBQW1CenhKLEtBQW5CLEVBQ0EsTUFFRixRQUNFelIsTUFBUTQrSixNQUFNQyxJQUFkLENBMUJKLENBNEJELENBakNELENBbUNBLGVBQWlCLG1CQUFBLENBQW9CcHRKLEtBQXBCLENBQTJCLENBQzFDLEdBQUk4OEUsTUFBTWh2QyxPQUFOLEdBQWtCLEtBQXRCLENBQTZCLE9BRTdCZ3ZDLE1BQU0xcUUsYUFBTixDQUFvQjQrSSxRQUFwQixFQUVBemlLLE1BQVE0K0osTUFBTUMsSUFBZCxDQUNELENBTkQsQ0FRQSxrQkFBb0Isc0JBQUEsQ0FBdUJwdEosS0FBdkIsQ0FBOEIsQ0FDaERBLE1BQU1xK0UsY0FBTixHQUNELENBRkQsQ0FFRztFQUdIdkIsTUFBTXF1RSxZQUFOLENBQW1CenJCLEVBQW5CLENBQXNCLGFBQXRCLENBQXFDcXVCLGFBQXJDLENBQW9ELEtBQXBELEVBRUFqeEUsTUFBTXF1RSxZQUFOLENBQW1CenJCLEVBQW5CLENBQXNCLFdBQXRCLENBQW1Dc3VCLFdBQW5DLENBQWdELEtBQWhELEVBRUFseEUsTUFBTXF1RSxZQUFOLENBQW1CenJCLEVBQW5CLENBQXNCLE9BQXRCLENBQStCdXVCLFlBQS9CLENBQTZDLEtBQTdDLEVBRUFueEUsTUFBTXF1RSxZQUFOLENBQW1CenJCLEVBQW5CLENBQXNCLFlBQXRCLENBQW9Dd3VCLFlBQXBDLENBQWtELEtBQWxELEVBRUFweEUsTUFBTXF1RSxZQUFOLENBQW1CenJCLEVBQW5CLENBQXNCLFVBQXRCLENBQWtDeXVCLFVBQWxDLENBQThDLEtBQTlDLEVBRUFyeEUsTUFBTXF1RSxZQUFOLENBQW1CenJCLEVBQW5CLENBQXNCLFdBQXRCLENBQW1DMHVCLFdBQW5DLENBQWdELEtBQWhELEVBRUF0eEUsTUFBTXF1RSxZQUFOLENBQW1CenJCLEVBQW5CLENBQXNCLFNBQXRCLENBQWlDNnVCLFNBQWpDLENBQTRDLEtBQTVDLEVBQW9EO0VBR3BEenhFLE1BQU10NEQsTUFBTixHQUVBLFlBQUEsQ0FDRCxDQUVEd2dILFlBQVlvbUIsa0JBQVosQ0FBZ0MsQ0FBQyxDQUMvQjk2SixJQUFLLFFBRDBCLENBRS9CaUUsSUFBSyxZQUFBLEVBQWUsQ0FDbEJ1UixRQUFRNlAsSUFBUixDQUFhLG9EQUFiLEVBQ0EsWUFBWWxmLE1BQVosQ0FDRCxDQUw4QixDQUFELENBTTdCLENBQ0RuRyxJQUFLLFFBREosQ0FFRGlFLElBQUssWUFBQSxFQUFlLENBQ2xCdVIsUUFBUTZQLElBQVIsQ0FBYSxzRUFBYixFQUNBLE9BQU8sQ0FBQyxLQUFLazJJLFVBQWIsQ0FDRCxDQUxBLENBTUQxcUosSUFBSyxZQUFBLENBQWEzVCxLQUFiLENBQW9CLENBQ3ZCc1ksUUFBUTZQLElBQVIsQ0FBYSxzRUFBYixFQUNBLEtBQUtrMkksVUFBTCxDQUFrQixDQUFDcitKLEtBQW5CLENBQ0QsQ0FUQSxDQU42QixDQWdCN0IsQ0FDRDhDLElBQUssVUFESixDQUVEaUUsSUFBSyxZQUFBLEVBQWUsQ0FDbEJ1UixRQUFRNlAsSUFBUixDQUFhLDBFQUFiLEVBQ0EsT0FBTyxDQUFDLEtBQUtvMkksWUFBYixDQUNELENBTEEsQ0FNRDVxSixJQUFLLFlBQUEsQ0FBYTNULEtBQWIsQ0FBb0IsQ0FDdkJzWSxRQUFRNlAsSUFBUixDQUFhLDBFQUFiLEVBQ0EsS0FBS28ySSxZQUFMLENBQW9CLENBQUN2K0osS0FBckIsQ0FDRCxDQVRBLENBaEI2QixDQTBCN0IsQ0FDRDhDLElBQUssT0FESixDQUVEaUUsSUFBSyxZQUFBLEVBQWUsQ0FDbEJ1UixRQUFRNlAsSUFBUixDQUFhLG9FQUFiLEVBQ0EsT0FBTyxDQUFDLEtBQUtzMkksU0FBYixDQUNELENBTEEsQ0FNRDlxSixJQUFLLFlBQUEsQ0FBYTNULEtBQWIsQ0FBb0IsQ0FDdkJzWSxRQUFRNlAsSUFBUixDQUFhLG9FQUFiLEVBQ0EsS0FBS3MySSxTQUFMLENBQWlCLENBQUN6K0osS0FBbEIsQ0FDRCxDQVRBLENBMUI2QixDQW9DN0IsQ0FDRDhDLElBQUssUUFESixDQUVEaUUsSUFBSyxZQUFBLEVBQWUsQ0FDbEJ1UixRQUFRNlAsSUFBUixDQUFhLHNFQUFiLEVBQ0EsT0FBTyxDQUFDLEtBQUswMkksVUFBYixDQUNELENBTEEsQ0FNRGxySixJQUFLLFlBQUEsQ0FBYTNULEtBQWIsQ0FBb0IsQ0FDdkJzWSxRQUFRNlAsSUFBUixDQUFhLHNFQUFiLEVBQ0EsS0FBSzAySSxVQUFMLENBQWtCLENBQUM3K0osS0FBbkIsQ0FDRCxDQVRBLENBcEM2QixDQThDN0IsQ0FDRDhDLElBQUssY0FESixDQUVEaUUsSUFBSyxZQUFBLEVBQWUsQ0FDbEJ1UixRQUFRNlAsSUFBUixDQUFhLCtFQUFiLEVBQ0EsT0FBTyxDQUFDLEtBQUtnMkksYUFBYixDQUNELENBTEEsQ0FNRHhxSixJQUFLLFlBQUEsQ0FBYTNULEtBQWIsQ0FBb0IsQ0FDdkJzWSxRQUFRNlAsSUFBUixDQUFhLCtFQUFiLEVBQ0EsS0FBS2cySSxhQUFMLENBQXFCLENBQUNuK0osS0FBdEIsQ0FDRCxDQVRBLENBOUM2QixDQXdEN0IsQ0FDRDhDLElBQUssc0JBREosQ0FFRGlFLElBQUssWUFBQSxFQUFlLENBQ2xCdVIsUUFBUTZQLElBQVIsQ0FBYSxvRkFBYixFQUNBLFlBQVlpMkksYUFBWixDQUNELENBTEEsQ0FNRHpxSixJQUFLLFlBQUEsQ0FBYTNULEtBQWIsQ0FBb0IsQ0FDdkJzWSxRQUFRNlAsSUFBUixDQUFhLG9GQUFiLEVBQ0EsS0FBS2kySSxhQUFMLENBQXFCcCtKLEtBQXJCLENBQ0QsQ0FUQSxDQXhENkIsQ0FBaEMsRUFvRUEwMkksU0FBU2tuQixrQkFBVCxDQUE2QkYsZ0JBQTdCLEVBRUEseUJBQUEsQ0FDRCxDQXZyQkQsQ0F1ckJFcjVJLGVBdnJCRixDQUZBLENBMnJCQTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztLQXFCQSxxQ0FFQSxTQUFVNi9JLGVBQVYsQ0FBMkIsQ0FDekIsNEJBQUEsRUFBK0IsQ0FDN0IsU0FBQSxDQUVBLFdBQWF4OUosVUFBVTFELE1BQVYsQ0FBbUIsQ0FBbkIsRUFBd0IwRCxVQUFVLENBQVYsSUFBaUIvRSxTQUF6QyxDQUFxRCtFLFVBQVUsQ0FBVixDQUFyRCxDQUFvRSxFQUFqRixDQUVBMnZJLGVBQWUsSUFBZixDQUFxQjh0QixtQkFBckIsRUFFQTcwRSxNQUFRaW5ELDBCQUEwQixJQUExQixDQUFnQ04saUJBQWlCa3VCLG1CQUFqQixFQUFzQ2xtSyxJQUF0QyxDQUEyQyxJQUEzQyxDQUFpRG0rRixNQUFqRCxDQUFoQyxDQUFSLENBQ0E5TSxNQUFNOE0sTUFBTixDQUFlOS9GLE9BQU80bkIsTUFBUCxDQUFjLENBQzNCa2dKLE9BQVEsS0FEbUIsQ0FFM0J2aEssT0FBUSxJQUZtQixDQUczQm9HLE9BQVEsV0FBQSxFQUhtQixDQUFkLENBSVptekYsTUFKWSxDQUFmLENBS0EsWUFBQSxDQUNELENBRURvN0MsWUFBWTJzQixtQkFBWixDQUFpQyxDQUFDLENBQ2hDcmhLLElBQUssU0FEMkIsQ0FFaEM5QyxNQUFPLGdCQUFBLENBQWlCdThJLFFBQWpCLENBQTJCLENBQ2hDaUYsTUFBTXZMLGlCQUFpQmt1QixvQkFBb0I1bkssU0FBckMsQ0FBTixDQUF1RCxTQUF2RCxDQUFrRSxJQUFsRSxFQUF3RTBCLElBQXhFLENBQTZFLElBQTdFLENBQW1GcytJLFFBQW5GLEVBRUEsaUJBQW1CLEtBQUtuZ0QsTUFBeEIsQ0FDSXQrRixJQUFNc21KLGFBQWF2aEosTUFEdkIsQ0FFSXVoSyxPQUFTaGdCLGFBQWFnZ0IsTUFGMUIsQ0FHSW43SixPQUFTbTdJLGFBQWFuN0ksTUFIMUIsQ0FJQSxXQUFhbkwsSUFBTUEsSUFBSWkrSSxNQUFWLENBQW1CUSxTQUFTeDFJLEdBQVQsQ0FBYSxRQUFiLEVBQXVCZzFJLE1BQXZELENBQ0EsYUFBZSxzQkFBQSxDQUF1Qmw1SSxNQUF2QixDQUErQjA1SSxTQUFTeDFJLEdBQVQsQ0FBYSxTQUFiLENBQS9CLENBQXdEdzFJLFNBQVN6a0ksT0FBakUsQ0FBZixDQUNBLG9CQUFzQnNzSixPQUFTLFNBQVU1OUosQ0FBVixDQUFhLENBQzFDZzJKLFNBQVN4bEksTUFBVCxDQUFnQnh3QixFQUFFaWlJLFFBQUYsRUFBaEIsRUFDQSt6QixTQUFTdnpKLE1BQVQsQ0FBZ0JnZixJQUFoQixDQUFxQmhmLE1BQXJCLEVBQ0QsQ0FIcUIsQ0FHbEIsU0FBVXpDLENBQVYsQ0FBYSxDQUNmZzJKLFNBQVN4bEksTUFBVCxDQUFnQnh3QixFQUFFaWlJLFFBQUYsRUFBaEIsRUFDRCxDQUxELENBTUEsS0FBSzQ3QixXQUFMLENBQWlCN0gsUUFBakIsRUFDQSxLQUFLOEgsU0FBTCxDQUFlQyxlQUFmLEVBRUFob0IsU0FBU3ZsSCxNQUFULENBQWdCLENBQ2R5RCxPQUFRLGVBQUEsQ0FBZ0J5cUgsT0FBaEIsQ0FBeUIsQ0FDL0IsR0FBSXBuSixHQUFKLENBQVMsT0FDVDArSixTQUFTMzVKLE1BQVQsQ0FBa0JxaUosUUFBUW5KLE1BQTFCLENBQ0QsQ0FKYSxDQUtkNzhGLFFBQVMsZ0JBQUEsQ0FBaUI4bEcsUUFBakIsQ0FBMkIsQ0FDbEN3WCxTQUFTdHZFLFVBQVQsQ0FBc0I4M0QsUUFBdEIsQ0FDRCxDQVBhLENBQWhCLEVBVUF3WCxTQUFTdnpKLE1BQVQsQ0FBZ0JnZixJQUFoQixDQUFxQmhmLE1BQXJCLEVBQ0QsQ0EvQitCLENBQUQsQ0FBakMsRUFrQ0F5dEksU0FBU3l0QixtQkFBVCxDQUE4QkQsZUFBOUIsRUFFQSwwQkFBQSxDQUNELENBdERELENBc0RFM0gsY0F0REYsQ0FGQSxDQTBEQTs7Ozs7O0tBV0EsdUNBRUEsVUFBWSxDQUNWLDhCQUFBLEVBQWlDLENBQy9CLFdBQWE3MUosVUFBVTFELE1BQVYsQ0FBbUIsQ0FBbkIsRUFBd0IwRCxVQUFVLENBQVYsSUFBaUIvRSxTQUF6QyxDQUFxRCtFLFVBQVUsQ0FBVixDQUFyRCxDQUFvRSxFQUFqRixDQUVBMnZJLGVBQWUsSUFBZixDQUFxQm11QixxQkFBckIsRUFFQSxLQUFLcG9FLE1BQUwsQ0FBYzkvRixPQUFPNG5CLE1BQVAsQ0FBYyxDQUMxQnlmLFdBQVksS0FEYyxDQUFkLENBRVh5NEQsTUFGVyxDQUFkLENBR0QsQ0FFRG83QyxZQUFZZ3RCLHFCQUFaLENBQW1DLENBQUMsQ0FDbEMxaEssSUFBSyxXQUQ2QixDQUVsQzlDLE1BQU8sa0JBQUEsQ0FBbUI1QyxJQUFuQixDQUF5QixDQUM5QixVQUFZLElBQVosQ0FFQSxXQUFhQSxLQUFLZy9GLE1BQWxCLENBRUEsS0FBS3FvRSxFQUFMLENBQVUsVUFBWSxDQUNwQixXQUFhLzlKLFVBQVUxRCxNQUFWLENBQW1CLENBQW5CLEVBQXdCMEQsVUFBVSxDQUFWLElBQWlCL0UsU0FBekMsQ0FBcUQrRSxVQUFVLENBQVYsQ0FBckQsQ0FBb0UsRUFBakYsQ0FFQSxHQUFJLEtBQUsyNkksYUFBVCxDQUF3QixDQUN0QixLQUFLdEYsTUFBTCxDQUFZejRHLFFBQVosQ0FBdUIsS0FBSys5RyxhQUFMLENBQW1CLEtBQUtxakIsWUFBTCxDQUFrQixDQUMxRHBoSSxTQUFVODRELE1BRGdELENBQWxCLENBQW5CLENBQXZCLENBR0QsQ0FDRixDQVJELENBVUEsR0FBSUEsT0FBT3o0RCxVQUFYLENBQXVCLENBQ3JCLFVBQVksY0FBQSxDQUFlN2dDLEdBQWYsQ0FBb0IsQ0FDOUIsR0FBSUEsR0FBSixDQUFTLENBQ1B4RyxPQUFPd0ssY0FBUCxDQUFzQndvRixLQUF0QixDQUE2QixLQUFLdGtGLE1BQUwsQ0FBWWxJLEdBQVosQ0FBN0IsQ0FBK0MsQ0FDN0NpRSxJQUFLLFlBQUEsRUFBZSxDQUNsQixZQUFZZzFJLE1BQUwsQ0FBWXo0RyxRQUFaLENBQXFCOGIsVUFBckIsQ0FBZ0N0OEMsR0FBaEMsQ0FBUCxDQUNELENBSDRDLENBSTdDNlEsSUFBSyxZQUFBLENBQWEzVCxLQUFiLENBQW9CLENBQ3ZCLEtBQUsrN0ksTUFBTCxDQUFZejRHLFFBQVosQ0FBdUIsS0FBSys5RyxhQUFMLENBQW1CLEtBQUtxakIsWUFBTCxDQUFrQixDQUMxRHBoSSxTQUFVN2lCLGlCQUFpQixFQUFqQixDQUFxQjNkLEdBQXJCLENBQTBCOUMsS0FBMUIsQ0FEZ0QsQ0FBbEIsQ0FBbkIsQ0FBdkIsQ0FHRCxDQVI0QyxDQVM3Q2tJLGFBQWMsSUFUK0IsQ0FVN0NELFdBQVksSUFWaUMsQ0FBL0MsRUFZRCxDQUNGLENBZkQsQ0FpQkEsSUFBSyxPQUFMLFNBQXFCbTBGLE1BQUwsQ0FBWTk0RCxRQUE1QixDQUFzQyxDQUNwQ3FoSSxNQUFNN2hLLEdBQU4sRUFDRCxDQUNGLENBQ0YsQ0F2Q2lDLENBQUQsQ0FBbkMsRUEwQ0EsNEJBQUEsQ0FDRCxDQXRERCxFQUZBLENBMERBLFdBQWEsaUJBQUEsRUFBYixDQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0tBOEJBLCtCQUVBLFVBQVksQ0FDVjAwSSxZQUFZb3RCLGFBQVosQ0FBMkIsSUFBM0IsQ0FBaUMsQ0FBQyxDQUNoQzloSyxJQUFLLE1BRDJCLENBRWhDOUMsTUFBTyxhQUFBLENBQWM0L0IsR0FBZCxDQUFtQixDQUN4Qix3QkFBTyxDQUFrQixDQUN2QkEsSUFBS0EsR0FEa0IsQ0FBbEIsRUFFSlgsUUFGSSxDQUVLLENBRkwsRUFFUSxDQUZSLENBQVAsQ0FHRCxDQU4rQixDQUFELENBQWpDLEVBU0Esc0JBQUEsRUFBeUIsQ0FDdkIsVUFBWSxJQUFaLENBRUFvM0csZUFBZSxJQUFmLENBQXFCdXVCLGFBQXJCLEVBRUFua0osaUJBQWlCQSxpQkFBaUIsSUFBakIsQ0FBdUIsVUFBdkIsQ0FBbUMsRUFBbkMsQ0FBakIsQ0FBeUQsUUFBekQsQ0FBbUUsQ0FDakU2K0IsU0FBVSxpQkFBQSxDQUFrQnVsSCxTQUFsQixDQUE2QnpuSyxJQUE3QixDQUFtQyxDQUMzQ0EsS0FBSzZoQyxRQUFMLENBQWNqZ0MsT0FBZCxDQUFzQixTQUFVNmhDLE9BQVYsQ0FBbUIsQ0FDdkNna0ksVUFBVWhrSSxRQUFRLENBQVIsQ0FBVixFQUF3QkEsUUFBUSxDQUFSLENBQXhCLENBQ0QsQ0FGRCxFQUdBZ2tJLFVBQVU3NUcsV0FBVixDQUF3QixJQUF4QixDQUNBLGdCQUFBLENBQ0QsQ0FQZ0UsQ0FBbkUsRUFVQSxJQUFLLFNBQVd0a0QsVUFBVTFELE1BQXJCLENBQTZCaThCLFNBQVcsU0FBQSxDQUFVdmMsSUFBVixDQUF4QyxDQUF5REMsS0FBTyxDQUFyRSxDQUF3RUEsS0FBT0QsSUFBL0UsQ0FBcUZDLE1BQXJGLENBQTZGLENBQzNGc2MsU0FBU3RjLElBQVQsRUFBaUJqYyxVQUFVaWMsSUFBVixDQUFqQixDQUNELENBRURzYyxTQUFTamdDLE9BQVQsQ0FBaUIsU0FBVXk3SSxJQUFWLENBQWdCLENBQy9CLFFBQVVBLEtBQUs3NkcsR0FBZixDQUNJa2xJLFVBQVlycUIsS0FBS3o4SSxJQURyQixDQUVJQSxLQUFPOG1LLFlBQWMsTUFBZCxDQUF1QixLQUF2QixDQUErQkEsU0FGMUMsQ0FHSUMsWUFBY3RxQixLQUFLOXZILE1BSHZCLENBSUlBLE9BQVNvNkksY0FBZ0IsTUFBaEIsQ0FBeUIsV0FBQSxDQUFZLENBQVosQ0FBZSxDQUFmLENBQXpCLENBQTZDQSxXQUoxRCxDQUtJQyxZQUFjdnFCLEtBQUtyOEcsTUFMdkIsQ0FNSUEsT0FBUzRtSSxjQUFnQixNQUFoQixDQUF5QixXQUFBLENBQVksQ0FBWixDQUFlLENBQWYsQ0FBekIsQ0FBNkNBLFdBTjFELENBT0lDLFVBQVl4cUIsS0FBSzU4SSxJQVByQixDQVFJQSxLQUFPb25LLFlBQWMsTUFBZCxDQUF1QjdoRixjQUF2QixDQUF3QzZoRixTQVJuRCxDQVNJQyxhQUFlenFCLEtBQUt4OUcsT0FUeEIsQ0FVSUEsUUFBVWlvSSxlQUFpQixNQUFqQixDQUEwQnRtSSxTQUExQixDQUFzQ3NtSSxZQVZwRCxDQVdJQyxTQUFXMXFCLEtBQUswSixHQVhwQixDQVlJQSxJQUFNZ2hCLFdBQWEsTUFBYixDQUFzQixTQUFVQyxHQUFWLENBQWUsQ0FDN0MsVUFBQSxDQUNELENBRlMsQ0FFTkQsUUFkSixDQWVBLFlBQWN6eUQsT0FBTzlCLElBQVAsQ0FBWWh4RSxHQUFaLENBQWQsQ0FFQSxHQUFJL2hDLEtBQUttRixNQUFMLENBQWMsQ0FBbEIsQ0FBcUIsQ0FDbkI2OUIsUUFBUTNELEtBQVIsQ0FBZ0JyL0IsS0FBSyxDQUFMLENBQWhCLENBQ0FnakMsUUFBUTFELEtBQVIsQ0FBZ0J0L0IsS0FBSyxDQUFMLENBQWhCLENBQ0QsQ0FIRCxhQUdlcS9CLEtBQVIsQ0FBZ0IyRCxRQUFRMUQsS0FBUixDQUFnQnQvQixJQUFoQyxDQUVQZ2pDLFFBQVE1RCxPQUFSLENBQWtCQSxPQUFsQixDQUNBNEQsUUFBUWxXLE1BQVIsQ0FBZTFDLElBQWYsQ0FBb0IwQyxNQUFwQixFQUNBa1csUUFBUXpDLE1BQVIsQ0FBZW5XLElBQWYsQ0FBb0JtVyxNQUFwQixFQUNBeUMsUUFBUXpELFNBQVIsQ0FBb0JvRSxhQUFwQixDQUNBWCxRQUFReEQsU0FBUixDQUFvQlksd0JBQXBCLENBRUFxeEQsTUFBTXJ3RCxRQUFOLENBQWV6OEIsSUFBZixDQUFvQixDQUFDeEUsSUFBRCxDQUFPbW1KLElBQUl0akgsT0FBSixDQUFQLENBQXBCLEVBQ0QsQ0E5QkQsRUErQkQsQ0FFRCxvQkFBQSxDQUNELENBL0RELEVBRkEsQ0FtRUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7S0FpQ0EsaUNBRUEsVUFBWSxDQUNWLHdCQUFBLENBQXlCZ2tILEdBQXpCLENBQThCd2dCLFVBQTlCLENBQTBDLENBQ3hDLFdBQWEzK0osVUFBVTFELE1BQVYsQ0FBbUIsQ0FBbkIsRUFBd0IwRCxVQUFVLENBQVYsSUFBaUIvRSxTQUF6QyxDQUFxRCtFLFVBQVUsQ0FBVixDQUFyRCxDQUFvRSxFQUFqRixDQUVBMnZJLGVBQWUsSUFBZixDQUFxQml2QixlQUFyQixFQUVBN2tKLGlCQUFpQixJQUFqQixDQUF1QixRQUF2QixDQUFpQyxDQUMvQjhrQyxLQUFNLGFBQUEsQ0FBY2dnSCxLQUFkLENBQXFCbm9LLElBQXJCLENBQTJCLENBQy9CbW9LLE1BQU1qaUksUUFBTixDQUFlbW9DLFFBQWYsQ0FBMEI4NUYsTUFBTTk1RixRQUFoQyxDQUNBcnVFLEtBQUt5Z0ksS0FBTCxDQUFhLGtCQUFBLENBQW1CMG5DLE1BQU1qaUksUUFBekIsQ0FBYixDQUNBbG1DLEtBQUtxbkgsS0FBTCxDQUFhOGdELE1BQU1qaUksUUFBTixDQUFlOGdGLFVBQTVCLENBQ0EsWUFBQSxDQUNELENBTjhCLENBQWpDLEVBU0EsS0FBS2hvQixNQUFMLENBQWM5L0YsT0FBTzRuQixNQUFQLENBQWMsQ0FDMUJrMEksTUFBTyxDQURtQixDQUFkLENBRVhoOEQsTUFGVyxDQUFkLENBR0EsS0FBS29qRCxLQUFMLENBQWEsU0FBQSxFQUFiLENBQ0EsS0FBS3FGLEdBQUwsQ0FBV0EsR0FBWCxDQUNBLEtBQUt3Z0IsVUFBTCxDQUFrQkEsVUFBbEIsQ0FDRCxDQUNEOzs7Ozs7O09BVUE3dEIsWUFBWTh0QixlQUFaLENBQTZCLENBQUMsQ0FDNUJ4aUssSUFBSyxNQUR1QixDQUU1QjlDLE1BQU8sYUFBQSxDQUFjdWxILFFBQWQsQ0FBd0IsQ0FDN0IsU0FBV2hDLGNBQWNVLFVBQWQsQ0FBeUIsS0FBS1EsS0FBOUIsQ0FBcUNjLFFBQXJDLENBQVgsQ0FDQSxZQUFZc1ksS0FBTCxDQUFXMEksVUFBWCxDQUFzQjVpQixJQUF0QixFQUE0Qm1SLElBQTVCLEVBQVAsQ0FDRCxDQUNEOzs7OztVQU4yQixDQWExQixDQUNEaHlILElBQUssUUFESixDQUVEOUMsTUFBTyxlQUFBLEVBQWtCLENBQ3ZCLEdBQUksS0FBSzY5SCxLQUFULENBQWdCLEtBQUtBLEtBQUwsQ0FBVzdtRyxNQUFYLENBQWtCLEtBQUt3b0gsS0FBTCxDQUFXL1csUUFBWCxHQUF3QixLQUFLcnNDLE1BQUwsQ0FBWWc4RCxLQUF0RCxFQUNqQixDQUpBLENBYjBCLENBa0IxQixDQUNEdDFKLElBQUssV0FESixDQUVEOUMsTUFBTyxrQkFBQSxDQUFtQjVDLElBQW5CLENBQXlCLENBQzlCQSxLQUFLKzJILElBQUwsQ0FBWSxRQUFBLENBQVMsVUFBWSxDQUMvQi8ySCxLQUFLNDVCLE1BQUwsR0FDRCxDQUZXLENBQVosQ0FHQSxHQUFJLENBQUM1NUIsS0FBS2lvSyxVQUFWLENBQXNCam9LLEtBQUsrMkgsSUFBTCxDQUFVdHRGLEtBQVYsQ0FBZ0J6cEMsS0FBS3luSixHQUFyQixFQUN2QixDQVBBLENBbEIwQixDQTBCMUIsQ0FDRC9oSixJQUFLLFNBREosQ0FFRDlDLE1BQU8sZ0JBQUEsQ0FBaUJ1OEksUUFBakIsQ0FBMkIsQ0FDaENBLFNBQVN1SSxNQUFULENBQWdCLFdBQWhCLEVBQ0QsQ0FKQSxDQTFCMEIsQ0FBN0IsRUFpQ0Esc0JBQUEsQ0FDRCxDQWxFRCxFQUZBLENBc0VBOzs7Ozs7Ozs7OztLQWNBLDhCQUVBLFVBQVksQ0FDVixxQkFBQSxDQUFzQnpsSixJQUF0QixDQUE0QnFULElBQTVCLENBQWtDLENBQ2hDMmpJLGVBQWUsSUFBZixDQUFxQm12QixZQUFyQixFQUVBLEtBQUtubUssSUFBTCxDQUFZQSxJQUFaLENBQ0EsS0FBS3FULElBQUwsQ0FBWUEsSUFBWixDQUNELENBRUQ4a0ksWUFBWWd1QixZQUFaLENBQTBCLENBQUMsQ0FDekIxaUssSUFBSyxTQURvQixDQUV6QjlDLE1BQU8sZ0JBQUEsQ0FBaUJ1OEksUUFBakIsQ0FBMkIsQ0FDaENBLFNBQVM1b0ksR0FBVCxDQUFhLEtBQUt0VSxJQUFsQixDQUF3QixLQUFLcVQsSUFBN0IsRUFDRCxDQUp3QixDQUFELENBQTFCLEVBT0EsbUJBQUEsQ0FDRCxDQWhCRCxFQUZBLENBb0JBLHNCQUVBLHVCQUVBLFNBQVUreUosU0FBVixDQUFxQixDQUNuQixjQUFBLENBQWVycEUsTUFBZixDQUF1QixDQUNyQixvQkFBQSxDQUVBaTZDLGVBQWUsSUFBZixDQUFxQnF2QixLQUFyQixFQUVBcHRKLFFBQVE2UCxJQUFSLENBQWEsNENBQWIsRUFFQSxHQUFJaTBFLE9BQU85NEQsUUFBWCxDQUFxQixDQUNuQjg0RCxPQUFPeDhELEdBQVAsQ0FBYXc4RCxPQUFPOTRELFFBQVAsQ0FBZ0JrZ0MsSUFBN0IsQ0FDQTQ0QixPQUFPc1csTUFBUCxDQUFnQnRXLE9BQU85NEQsUUFBUCxDQUFnQm92RSxNQUFoQyxDQUNELENBRUQsSUFBSyxTQUFXaHNHLFVBQVUxRCxNQUFyQixDQUE2QnVoSixXQUFhLFNBQUEsQ0FBVTdoSSxLQUFPLENBQVAsQ0FBV0EsS0FBTyxDQUFsQixDQUFzQixDQUFoQyxDQUExQyxDQUE4RUMsS0FBTyxDQUExRixDQUE2RkEsS0FBT0QsSUFBcEcsQ0FBMEdDLE1BQTFHLENBQWtILENBQ2hINGhJLFdBQVc1aEksS0FBTyxDQUFsQixFQUF1QmpjLFVBQVVpYyxJQUFWLENBQXZCLENBQ0QsQ0FFRCxpQ0FBaUMsSUFBMUIsQ0FBZ0MsQ0FBQ2dqSixpQkFBbUIxdkIsaUJBQWlCeXZCLEtBQWpCLENBQXBCLEVBQTZDem5LLElBQTdDLENBQWtEd0ksS0FBbEQsQ0FBd0RrL0osZ0JBQXhELENBQTBFLENBQUMsSUFBRCxDQUFPdnBFLE1BQVAsRUFBZXB4RixNQUFmLENBQXNCdTVJLFVBQXRCLENBQTFFLENBQWhDLENBQVAsQ0FDRCxDQUVEN04sU0FBU2d2QixLQUFULENBQWdCRCxTQUFoQixFQUVBLFlBQUEsQ0FDRCxDQXZCRCxDQXVCRXRqQixRQXZCRixDQUZBLENBMEJBLDhCQUVBLFVBQVksQ0FDVixxQkFBQSxFQUF3QixDQUN0QixXQUFhejdJLFVBQVUxRCxNQUFWLENBQW1CLENBQW5CLEVBQXdCMEQsVUFBVSxDQUFWLElBQWlCL0UsU0FBekMsQ0FBcUQrRSxVQUFVLENBQVYsQ0FBckQsQ0FBb0UsRUFBakYsQ0FFQTJ2SSxlQUFlLElBQWYsQ0FBcUJ1dkIsWUFBckIsRUFFQXR0SixRQUFRNlAsSUFBUixDQUFhLHVEQUFiLEVBQ0EsS0FBS3NTLE1BQUwsQ0FBYyx1QkFBQSxDQUF3QjJoRSxNQUF4QixDQUFkLENBQ0QsQ0FFRG83QyxZQUFZb3VCLFlBQVosQ0FBMEIsQ0FBQyxDQUN6QjlpSyxJQUFLLFdBRG9CLENBRXpCOUMsTUFBTyxrQkFBQSxDQUFtQjVDLElBQW5CLENBQXlCLENBQzlCLEtBQUs4cUIsR0FBTCxDQUFTOXFCLEtBQUtxOUIsTUFBZCxFQUNELENBSndCLENBQUQsQ0FLdkIsQ0FDRDMzQixJQUFLLFNBREosQ0FFRDlDLE1BQU8sZ0JBQUEsQ0FBaUJ1OEksUUFBakIsQ0FBMkIsQ0FDaENBLFNBQVM1b0ksR0FBVCxDQUFhLFFBQWIsQ0FBdUIsS0FBSzhtQixNQUE1QixFQUNELENBSkEsQ0FMdUIsQ0FBMUIsRUFZQSxtQkFBQSxDQUNELENBdkJELEVBRkEsQ0EyQkE7O0VDeDM1REE7O0VBRUEsS0FBSyxNQUFNLENBQUMsT0FBTyxLQUFLLFNBQVMsR0FBRzs7RUFFcEMsQ0FBQyxNQUFNLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7O0VBRXRDLENBQUM7O0VBRUQsS0FBSyxNQUFNLENBQUMsU0FBUyxLQUFLLFNBQVMsR0FBRzs7RUFFdEM7RUFDQTs7RUFFQSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEdBQUcsV0FBVyxLQUFLLEdBQUc7O0VBRXZDLEVBQUUsT0FBTyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksUUFBUSxFQUFFLEtBQUssRUFBRSxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssS0FBSyxDQUFDOztFQUV6RixFQUFFLENBQUM7O0VBRUgsQ0FBQzs7RUFFRDs7RUFFQSxLQUFLLElBQUksQ0FBQyxJQUFJLEtBQUssU0FBUyxHQUFHOztFQUUvQjs7RUFFQSxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsV0FBVyxDQUFDLEdBQUc7O0VBRTVCLEVBQUUsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQzs7RUFFL0MsRUFBRSxDQUFDOztFQUVILENBQUM7O0VBRUQsS0FBSyxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksS0FBSyxTQUFTLEdBQUc7O0VBRTdDO0VBQ0E7O0VBRUEsQ0FBQyxNQUFNLENBQUMsY0FBYyxFQUFFLFFBQVEsQ0FBQyxTQUFTLEVBQUUsTUFBTSxFQUFFOztFQUVwRCxFQUFFLEdBQUcsRUFBRSxZQUFZOztFQUVuQixHQUFHLE9BQU8sSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLEtBQUssRUFBRSwyQkFBMkIsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDOztFQUVwRSxHQUFHOztFQUVILEVBQUUsRUFBRSxDQUFDOztFQUVMLENBQUM7O0VBRUQsS0FBSyxNQUFNLENBQUMsTUFBTSxLQUFLLFNBQVMsR0FBRzs7RUFFbkM7RUFDQTs7RUFFQSxDQUFDLEVBQUUsWUFBWTs7RUFFZixFQUFFLE1BQU0sQ0FBQyxNQUFNLEdBQUcsV0FBVyxNQUFNLEdBQUc7QUFDdEMsQUFFQTtFQUNBLEdBQUcsS0FBSyxNQUFNLEtBQUssU0FBUyxJQUFJLE1BQU0sS0FBSyxJQUFJLEdBQUc7O0VBRWxELElBQUksTUFBTSxJQUFJLFNBQVMsRUFBRSw0Q0FBNEMsRUFBRSxDQUFDOztFQUV4RSxJQUFJOztFQUVKLEdBQUcsSUFBSSxNQUFNLEdBQUcsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDOztFQUVqQyxHQUFHLE1BQU0sSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLEtBQUssR0FBRyxHQUFHOztFQUU3RCxJQUFJLElBQUksTUFBTSxHQUFHLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQzs7RUFFcEMsSUFBSSxLQUFLLE1BQU0sS0FBSyxTQUFTLElBQUksTUFBTSxLQUFLLElBQUksR0FBRzs7RUFFbkQsS0FBSyxNQUFNLElBQUksT0FBTyxJQUFJLE1BQU0sR0FBRzs7RUFFbkMsTUFBTSxLQUFLLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUc7O0VBRXJFLE9BQU8sTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLE1BQU0sRUFBRSxPQUFPLEVBQUUsQ0FBQzs7RUFFN0MsT0FBTzs7RUFFUCxNQUFNOztFQUVOLEtBQUs7O0VBRUwsSUFBSTs7RUFFSixHQUFHLE9BQU8sTUFBTSxDQUFDOztFQUVqQixHQUFHLENBQUM7O0VBRUosRUFBRSxJQUFJLENBQUM7O0VBRVAsQ0FBQzs7RUFFRDtFQUNBO0VBQ0E7O0VBRUEsU0FBU3BXLGlCQUFlLEdBQUcsRUFBRTs7RUFFN0IsTUFBTSxDQUFDLE1BQU0sRUFBRUEsaUJBQWUsQ0FBQyxTQUFTLEVBQUU7O0VBRTFDLENBQUMsZ0JBQWdCLEVBQUUsV0FBVyxJQUFJLEVBQUUsUUFBUSxHQUFHOztFQUUvQyxFQUFFLEtBQUssSUFBSSxDQUFDLFVBQVUsS0FBSyxTQUFTLEdBQUcsSUFBSSxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUM7O0VBRTVELEVBQUUsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQzs7RUFFbEMsRUFBRSxLQUFLLFNBQVMsRUFBRSxJQUFJLEVBQUUsS0FBSyxTQUFTLEdBQUc7O0VBRXpDLEdBQUcsU0FBUyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQzs7RUFFMUIsR0FBRzs7RUFFSCxFQUFFLEtBQUssU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUMsR0FBRzs7RUFFdkQsR0FBRyxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDOztFQUV0QyxHQUFHOztFQUVILEVBQUU7O0VBRUYsQ0FBQyxnQkFBZ0IsRUFBRSxXQUFXLElBQUksRUFBRSxRQUFRLEdBQUc7O0VBRS9DLEVBQUUsS0FBSyxJQUFJLENBQUMsVUFBVSxLQUFLLFNBQVMsR0FBRyxPQUFPLEtBQUssQ0FBQzs7RUFFcEQsRUFBRSxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDOztFQUVsQyxFQUFFLE9BQU8sU0FBUyxFQUFFLElBQUksRUFBRSxLQUFLLFNBQVMsSUFBSSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDOztFQUUxRixFQUFFOztFQUVGLENBQUMsbUJBQW1CLEVBQUUsV0FBVyxJQUFJLEVBQUUsUUFBUSxHQUFHOztFQUVsRCxFQUFFLEtBQUssSUFBSSxDQUFDLFVBQVUsS0FBSyxTQUFTLEdBQUcsT0FBTzs7RUFFOUMsRUFBRSxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO0VBQ2xDLEVBQUUsSUFBSSxhQUFhLEdBQUcsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDOztFQUV4QyxFQUFFLEtBQUssYUFBYSxLQUFLLFNBQVMsR0FBRzs7RUFFckMsR0FBRyxJQUFJLEtBQUssR0FBRyxhQUFhLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxDQUFDOztFQUVqRCxHQUFHLEtBQUssS0FBSyxLQUFLLEVBQUUsQ0FBQyxHQUFHOztFQUV4QixJQUFJLGFBQWEsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDOztFQUVyQyxJQUFJOztFQUVKLEdBQUc7O0VBRUgsRUFBRTs7RUFFRixDQUFDLGFBQWEsRUFBRSxXQUFXLEtBQUssR0FBRzs7RUFFbkMsRUFBRSxLQUFLLElBQUksQ0FBQyxVQUFVLEtBQUssU0FBUyxHQUFHLE9BQU87O0VBRTlDLEVBQUUsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztFQUNsQyxFQUFFLElBQUksYUFBYSxHQUFHLFNBQVMsRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7O0VBRTlDLEVBQUUsS0FBSyxhQUFhLEtBQUssU0FBUyxHQUFHOztFQUVyQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDOztFQUV2QixHQUFHLElBQUksS0FBSyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ3pCLEdBQUcsSUFBSSxNQUFNLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FBQzs7RUFFckMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sRUFBRSxDQUFDLEdBQUcsR0FBRzs7RUFFbkMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEdBQUcsYUFBYSxFQUFFLENBQUMsRUFBRSxDQUFDOztFQUVwQyxJQUFJOztFQUVKLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0VBRW5DLElBQUksS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUM7O0VBRW5DLElBQUk7O0VBRUosR0FBRzs7RUFFSCxFQUFFOztFQUVGLENBQUMsRUFBRSxDQUFDOztFQUVKLElBQUlpb0UsVUFBUSxHQUFHLElBQUksQ0FBQztBQUNwQixFQUNBLElBQUkzUSxjQUFZLEdBQUcsQ0FBQyxDQUFDO0VBQ3JCLElBQUl4QyxjQUFZLEdBQUcsQ0FBQyxDQUFDO0VBQ3JCLElBQUkyQyxlQUFhLEdBQUcsQ0FBQyxDQUFDO0FBQ3RCLEVBQ0EsSUFBSSxvQkFBb0IsR0FBRyxDQUFDLENBQUM7QUFDN0IsRUFFQSxJQUFJcFYsY0FBWSxHQUFHLENBQUMsQ0FBQztFQUNyQixJQUFJRSxrQkFBZ0IsR0FBRyxDQUFDLENBQUM7RUFDekIsSUFBSXhZLFdBQVMsR0FBRyxDQUFDLENBQUM7RUFDbEIsSUFBSXdKLFVBQVEsR0FBRyxDQUFDLENBQUM7RUFDakIsSUFBSUMsWUFBVSxHQUFHLENBQUMsQ0FBQztFQUNuQixJQUFJdkgsYUFBVyxHQUFHLENBQUMsQ0FBQztFQUNwQixJQUFJLGFBQWEsR0FBRyxDQUFDLENBQUM7RUFDdEIsSUFBSWhDLFVBQVEsR0FBRyxDQUFDLENBQUM7RUFDakIsSUFBSTI3RCxZQUFVLEdBQUcsQ0FBQyxDQUFDO0VBQ25CLElBQUlELGNBQVksR0FBRyxDQUFDLENBQUM7RUFDckIsSUFBSWp3QyxZQUFVLEdBQUcsQ0FBQyxDQUFDO0VBQ25CLElBQUk3ckIsZ0JBQWMsR0FBRyxDQUFDLENBQUM7RUFDdkIsSUFBSWc1RCxrQkFBZ0IsR0FBRyxDQUFDLENBQUM7RUFDekIsSUFBSUMscUJBQW1CLEdBQUcsQ0FBQyxDQUFDO0VBQzVCLElBQUlDLGtCQUFnQixHQUFHLENBQUMsQ0FBQztFQUN6QixJQUFJcHRDLGdCQUFjLEdBQUcsQ0FBQyxDQUFDO0VBQ3ZCLElBQUluckIsYUFBVyxHQUFHLEdBQUcsQ0FBQztFQUN0QixJQUFJaTJCLGtCQUFnQixHQUFHLEdBQUcsQ0FBQztFQUMzQixJQUFJRSx5QkFBdUIsR0FBRyxHQUFHLENBQUM7RUFDbEMsSUFBSWdELGFBQVcsR0FBRyxHQUFHLENBQUM7RUFDdEIsSUFBSUMsYUFBVyxHQUFHLEdBQUcsQ0FBQztFQUN0QixJQUFJL0MsWUFBVSxHQUFHLEdBQUcsQ0FBQztFQUNyQixJQUFJQyxXQUFTLEdBQUcsR0FBRyxDQUFDO0VBQ3BCLElBQUlDLGdCQUFjLEdBQUcsR0FBRyxDQUFDO0VBQ3pCLElBQUlDLHdCQUFzQixHQUFHLEdBQUcsQ0FBQztFQUNqQyxJQUFJNTJCLGdCQUFjLEdBQUcsR0FBRyxDQUFDO0VBQ3pCLElBQUlFLHdCQUFzQixHQUFHLEdBQUcsQ0FBQztFQUNqQyxJQUFJMjJCLGdCQUFjLEdBQUcsR0FBRyxDQUFDO0VBQ3pCLElBQUlFLHdCQUFzQixHQUFHLEdBQUcsQ0FBQztFQUNqQyxJQUFJRSxnQkFBYyxHQUFHLEdBQUcsQ0FBQztFQUN6QixJQUFJRSx3QkFBc0IsR0FBRyxHQUFHLENBQUM7RUFDakMsSUFBSUUsd0JBQXNCLEdBQUcsR0FBRyxDQUFDO0VBQ2pDLElBQUkrL0UsWUFBVSxHQUFHLENBQUMsQ0FBQztFQUNuQixJQUFJQyxhQUFXLEdBQUcsQ0FBQyxDQUFDO0VBQ3BCLElBQUlDLFdBQVMsR0FBRyxDQUFDLENBQUM7RUFDbEIsSUFBSTcyRyxnQkFBYyxHQUFHLENBQUMsQ0FBQztFQUN2QixJQUFJODJHLFlBQVUsR0FBRyxDQUFDLENBQUM7RUFDbkIsSUFBSUMsbUJBQWlCLEdBQUcsQ0FBQyxDQUFDO0VBQzFCLElBQUlDLGNBQVksR0FBRyxDQUFDLENBQUM7RUFDckIsSUFBSUMsZUFBYSxHQUFHLENBQUMsQ0FBQztFQUN0QixJQUFJOTBHLG1CQUFpQixHQUFHLENBQUMsQ0FBQztFQUMxQixJQUFJKzBHLGNBQVksR0FBRyxDQUFDLENBQUM7RUFDckIsSUFBSUMsY0FBWSxHQUFHLENBQUMsQ0FBQztFQUNyQixJQUFJbitGLGVBQWEsR0FBRyxDQUFDLENBQUM7RUFDdEIsSUFBSWtsQixtQkFBaUIsR0FBRyxDQUFDLENBQUM7RUFDMUIsSUFBSWs1RSxxQkFBbUIsR0FBRyxDQUFDLENBQUM7RUFDNUIsSUFBSUMsdUJBQXFCLEdBQUcsQ0FBQyxDQUFDO0VBQzlCLElBQUlDLG1CQUFpQixHQUFHLENBQUMsQ0FBQztFQUMxQixJQUFJNW5JLFdBQVMsR0FBRyxHQUFHLENBQUM7RUFDcEIsSUFBSWdpQyx1QkFBcUIsR0FBRyxHQUFHLENBQUM7RUFDaEMsSUFBSXdzRCx1QkFBcUIsR0FBRyxHQUFHLENBQUM7RUFDaEMsSUFBSUMsa0NBQWdDLEdBQUcsR0FBRyxDQUFDO0VBQzNDLElBQUlDLGtDQUFnQyxHQUFHLEdBQUcsQ0FBQztFQUMzQyxJQUFJQyw0QkFBMEIsR0FBRyxHQUFHLENBQUM7RUFDckMsSUFBSTFnRCx5QkFBdUIsR0FBRyxHQUFHLENBQUM7RUFDbEMsSUFBSUMseUJBQXVCLEdBQUcsR0FBRyxDQUFDO0VBQ2xDLElBQUlzVyxnQkFBYyxHQUFHLElBQUksQ0FBQztFQUMxQixJQUFJcmxELHFCQUFtQixHQUFHLElBQUksQ0FBQztFQUMvQixJQUFJdWxELHdCQUFzQixHQUFHLElBQUksQ0FBQztFQUNsQyxJQUFJOWhELGVBQWEsR0FBRyxJQUFJLENBQUM7RUFDekIsSUFBSW04Qyw0QkFBMEIsR0FBRyxJQUFJLENBQUM7RUFDdEMsSUFBSUMsMkJBQXlCLEdBQUcsSUFBSSxDQUFDO0VBQ3JDLElBQUk1L0MsY0FBWSxHQUFHLElBQUksQ0FBQztFQUN4QixJQUFJMGxELDJCQUF5QixHQUFHLElBQUksQ0FBQztFQUNyQyxJQUFJemxELDBCQUF3QixHQUFHLElBQUksQ0FBQztFQUNwQyxJQUFJRSxrQkFBZ0IsR0FBRyxJQUFJLENBQUM7RUFDNUIsSUFBSWdtRCxVQUFRLEdBQUcsSUFBSSxDQUFDO0VBQ3BCLElBQUlDLFdBQVMsR0FBRyxJQUFJLENBQUM7RUFDckIsSUFBSWpELG1CQUFpQixHQUFHLElBQUksQ0FBQztFQUM3QixJQUFJa0QsU0FBTyxHQUFHLElBQUksQ0FBQztFQUNuQixJQUFJakQsaUJBQWUsR0FBRyxJQUFJLENBQUM7RUFDM0IsSUFBSWpCLFdBQVMsR0FBRyxJQUFJLENBQUM7RUFDckIsSUFBSUMsZUFBYSxHQUFHLElBQUksQ0FBQztFQUN6QixJQUFJeUQsdUJBQXFCLEdBQUcsSUFBSSxDQUFDO0VBQ2pDLElBQUlFLHVCQUFxQixHQUFHLElBQUksQ0FBQztFQUNqQyxJQUFJRSxzQkFBb0IsR0FBRyxJQUFJLENBQUM7RUFDaEMsSUFBSTFDLG9CQUFrQixHQUFHLElBQUksQ0FBQztFQUM5QixJQUFJZ0QsYUFBVyxHQUFHLElBQUksQ0FBQztFQUN2QixJQUFJM0UsV0FBUyxHQUFHLElBQUksQ0FBQztFQUNyQixJQUFJMWhELFlBQVUsR0FBRyxJQUFJLENBQUM7RUFDdEIsSUFBSXdtRCxpQkFBZSxHQUFHLElBQUksQ0FBQztFQUMzQixJQUFJRSxzQkFBb0IsR0FBRyxJQUFJLENBQUM7QUFDaEMsRUFDQSxJQUFJMUQsYUFBVyxHQUFHLElBQUksQ0FBQztFQUN2QixJQUFJRyxvQkFBa0IsR0FBRyxJQUFJLENBQUM7RUFDOUIsSUFBSTJFLHNCQUFvQixHQUFHLElBQUksQ0FBQztFQUNoQyxJQUFJQyx1QkFBcUIsR0FBRyxJQUFJLENBQUM7RUFDakMsSUFBSUMsdUJBQXFCLEdBQUcsSUFBSSxDQUFDO0VBQ2pDLElBQUlDLHVCQUFxQixHQUFHLElBQUksQ0FBQztFQUNqQyxJQUFJSyx5QkFBdUIsR0FBRyxJQUFJLENBQUM7RUFDbkMsSUFBSUMseUJBQXVCLEdBQUcsSUFBSSxDQUFDO0VBQ25DLElBQUlDLDBCQUF3QixHQUFHLElBQUksQ0FBQztFQUNwQyxJQUFJQywwQkFBd0IsR0FBRyxJQUFJLENBQUM7RUFDcEMsSUFBSUssaUJBQWUsR0FBRyxJQUFJLENBQUM7RUFDM0IsSUFBSXc3QyxVQUFRLEdBQUcsSUFBSSxDQUFDO0VBQ3BCLElBQUkzRCxZQUFVLEdBQUcsSUFBSSxDQUFDO0VBQ3RCLElBQUk4RCxjQUFZLEdBQUcsSUFBSSxDQUFDO0VBQ3hCLElBQUlybUIscUJBQW1CLEdBQUcsSUFBSSxDQUFDO0VBQy9CLElBQUk4QixtQkFBaUIsR0FBRyxJQUFJLENBQUM7RUFDN0IsSUFBSXVFLG1CQUFpQixHQUFHLElBQUksQ0FBQztFQUM3QixJQUFJN0QscUJBQW1CLEdBQUcsSUFBSSxDQUFDO0VBQy9CLElBQUlta0IsaUJBQWUsR0FBRyxJQUFJLENBQUM7RUFDM0IsSUFBSUMsa0JBQWdCLEdBQUcsSUFBSSxDQUFDO0VBQzVCLElBQUlqc0UsbUJBQWlCLEdBQUcsQ0FBQyxDQUFDO0VBQzFCLElBQUl3dkcsdUJBQXFCLEdBQUcsQ0FBQyxDQUFDO0VBQzlCLElBQUlDLHFCQUFtQixHQUFHLENBQUMsQ0FBQztFQUM1QixJQUFJaG9JLGdCQUFjLEdBQUcsSUFBSSxDQUFDO0VBQzFCLElBQUlpb0ksY0FBWSxHQUFHLElBQUksQ0FBQztFQUN4QixJQUFJNzZGLGVBQWEsR0FBRyxJQUFJLENBQUM7RUFDekIsSUFBSTg2RixjQUFZLEdBQUcsSUFBSSxDQUFDO0FBQ3hCLEVBQ0EsSUFBSUMsZUFBYSxHQUFHLElBQUksQ0FBQztFQUN6QixJQUFJQyxnQkFBYyxHQUFHLElBQUksQ0FBQztFQUMxQixJQUFJQyxjQUFZLEdBQUcsSUFBSSxDQUFDO0VBQ3hCLElBQUkxMkYsbUJBQWlCLEdBQUcsSUFBSSxDQUFDO0VBQzdCLElBQUlnQixrQkFBZ0IsR0FBRyxJQUFJLENBQUM7O0VBRTVCO0VBQ0E7RUFDQTtFQUNBOztFQUVBLElBQUlycUQsT0FBSyxHQUFHOztFQUVaLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxFQUFFLEdBQUcsR0FBRztFQUN2QixDQUFDLE9BQU8sRUFBRSxHQUFHLEdBQUcsSUFBSSxDQUFDLEVBQUU7O0VBRXZCLENBQUMsWUFBWSxFQUFFLFlBQVk7O0VBRTNCOztFQUVBLEVBQUUsSUFBSSxLQUFLLEdBQUcsZ0VBQWdFLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxDQUFDO0VBQzNGLEVBQUUsSUFBSSxJQUFJLEdBQUcsSUFBSSxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUM7RUFDN0IsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDOztFQUVqQixFQUFFLE9BQU8sU0FBUyxZQUFZLEdBQUc7O0VBRWpDLEdBQUcsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRzs7RUFFbkMsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLEdBQUc7O0VBRXZELEtBQUssSUFBSSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQzs7RUFFckIsS0FBSyxNQUFNLEtBQUssQ0FBQyxLQUFLLEVBQUUsR0FBRzs7RUFFM0IsS0FBSyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDOztFQUVyQixLQUFLLE1BQU07O0VBRVgsS0FBSyxLQUFLLEdBQUcsSUFBSSxJQUFJLEdBQUcsR0FBRyxHQUFHLFNBQVMsS0FBSyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0VBQzVFLEtBQUssQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7RUFDbkIsS0FBSyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQztFQUNwQixLQUFLLElBQUksRUFBRSxDQUFDLEVBQUUsR0FBRyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQyxHQUFHLEdBQUcsS0FBSyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUM7O0VBRS9ELEtBQUs7O0VBRUwsSUFBSTs7RUFFSixHQUFHLE9BQU8sSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQzs7RUFFMUIsR0FBRyxDQUFDOztFQUVKLEVBQUUsRUFBRTs7RUFFSixDQUFDLEtBQUssRUFBRSxXQUFXLEtBQUssRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHOztFQUVyQyxFQUFFLE9BQU8sSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQzs7RUFFakQsRUFBRTs7RUFFRjtFQUNBOztFQUVBLENBQUMsZUFBZSxFQUFFLFdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRzs7RUFFcEMsRUFBRSxPQUFPLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7O0VBRS9CLEVBQUU7O0VBRUY7O0VBRUEsQ0FBQyxTQUFTLEVBQUUsV0FBVyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHOztFQUUzQyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDOztFQUVyRCxFQUFFOztFQUVGOztFQUVBLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUc7O0VBRTVCLEVBQUUsT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7O0VBRS9CLEVBQUU7O0VBRUY7O0VBRUEsQ0FBQyxVQUFVLEVBQUUsV0FBVyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRzs7RUFFdEMsRUFBRSxLQUFLLENBQUMsSUFBSSxHQUFHLEdBQUcsT0FBTyxDQUFDLENBQUM7RUFDM0IsRUFBRSxLQUFLLENBQUMsSUFBSSxHQUFHLEdBQUcsT0FBTyxDQUFDLENBQUM7O0VBRTNCLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsT0FBTyxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUM7O0VBRWxDLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7O0VBRS9CLEVBQUU7O0VBRUYsQ0FBQyxZQUFZLEVBQUUsV0FBVyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRzs7RUFFeEMsRUFBRSxLQUFLLENBQUMsSUFBSSxHQUFHLEdBQUcsT0FBTyxDQUFDLENBQUM7RUFDM0IsRUFBRSxLQUFLLENBQUMsSUFBSSxHQUFHLEdBQUcsT0FBTyxDQUFDLENBQUM7O0VBRTNCLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsT0FBTyxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUM7O0VBRWxDLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQzs7RUFFakQsRUFBRTs7RUFFRjs7RUFFQSxDQUFDLE9BQU8sRUFBRSxXQUFXLEdBQUcsRUFBRSxJQUFJLEdBQUc7O0VBRWpDLEVBQUUsT0FBTyxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssSUFBSSxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDOztFQUVoRSxFQUFFOztFQUVGOztFQUVBLENBQUMsU0FBUyxFQUFFLFdBQVcsR0FBRyxFQUFFLElBQUksR0FBRzs7RUFFbkMsRUFBRSxPQUFPLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDOztFQUU5QyxFQUFFOztFQUVGOztFQUVBLENBQUMsZUFBZSxFQUFFLFdBQVcsS0FBSyxHQUFHOztFQUVyQyxFQUFFLE9BQU8sS0FBSyxLQUFLLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQzs7RUFFekMsRUFBRTs7RUFFRixDQUFDLFFBQVEsRUFBRSxXQUFXLE9BQU8sR0FBRzs7RUFFaEMsRUFBRSxPQUFPLE9BQU8sR0FBR0EsT0FBSyxDQUFDLE9BQU8sQ0FBQzs7RUFFakMsRUFBRTs7RUFFRixDQUFDLFFBQVEsRUFBRSxXQUFXLE9BQU8sR0FBRzs7RUFFaEMsRUFBRSxPQUFPLE9BQU8sR0FBR0EsT0FBSyxDQUFDLE9BQU8sQ0FBQzs7RUFFakMsRUFBRTs7RUFFRixDQUFDLFlBQVksRUFBRSxXQUFXLEtBQUssR0FBRzs7RUFFbEMsRUFBRSxPQUFPLEVBQUUsS0FBSyxLQUFLLEtBQUssR0FBRyxDQUFDLEVBQUUsT0FBTyxDQUFDLElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQzs7RUFFeEQsRUFBRTs7RUFFRixDQUFDLGlCQUFpQixFQUFFLFdBQVcsS0FBSyxHQUFHOztFQUV2QyxFQUFFLE9BQU8sSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDOztFQUVuRSxFQUFFOztFQUVGLENBQUMsY0FBYyxFQUFFLFdBQVcsS0FBSyxHQUFHOztFQUVwQyxFQUFFLEtBQUssR0FBRyxDQUFDO0VBQ1gsRUFBRSxLQUFLLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQztFQUN0QixFQUFFLEtBQUssSUFBSSxLQUFLLElBQUksQ0FBQyxDQUFDO0VBQ3RCLEVBQUUsS0FBSyxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUM7RUFDdEIsRUFBRSxLQUFLLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQztFQUN0QixFQUFFLEtBQUssSUFBSSxLQUFLLElBQUksRUFBRSxDQUFDO0VBQ3ZCLEVBQUUsS0FBSyxHQUFHLENBQUM7O0VBRVgsRUFBRSxPQUFPLEtBQUssQ0FBQzs7RUFFZixFQUFFOztFQUVGLENBQUMsQ0FBQzs7RUFFRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUEsU0FBU1EsU0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUc7O0VBRXpCLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0VBQ2pCLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDOztFQUVqQixDQUFDOztFQUVELE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRUEsU0FBTyxDQUFDLFNBQVMsRUFBRTs7RUFFNUMsQ0FBQyxPQUFPLEdBQUc7O0VBRVgsRUFBRSxHQUFHLEVBQUUsWUFBWTs7RUFFbkIsR0FBRyxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUM7O0VBRWpCLEdBQUc7O0VBRUgsRUFBRSxHQUFHLEVBQUUsV0FBVyxLQUFLLEdBQUc7O0VBRTFCLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7O0VBRWxCLEdBQUc7O0VBRUgsRUFBRTs7RUFFRixDQUFDLFFBQVEsR0FBRzs7RUFFWixFQUFFLEdBQUcsRUFBRSxZQUFZOztFQUVuQixHQUFHLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQzs7RUFFakIsR0FBRzs7RUFFSCxFQUFFLEdBQUcsRUFBRSxXQUFXLEtBQUssR0FBRzs7RUFFMUIsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQzs7RUFFbEIsR0FBRzs7RUFFSCxFQUFFOztFQUVGLENBQUMsRUFBRSxDQUFDOztFQUVKLE1BQU0sQ0FBQyxNQUFNLEVBQUVBLFNBQU8sQ0FBQyxTQUFTLEVBQUU7O0VBRWxDLENBQUMsU0FBUyxFQUFFLElBQUk7O0VBRWhCLENBQUMsR0FBRyxFQUFFLFdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRzs7RUFFeEIsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNiLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7O0VBRWIsRUFBRSxPQUFPLElBQUksQ0FBQzs7RUFFZCxFQUFFOztFQUVGLENBQUMsU0FBUyxFQUFFLFdBQVcsTUFBTSxHQUFHOztFQUVoQyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDO0VBQ2xCLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUM7O0VBRWxCLEVBQUUsT0FBTyxJQUFJLENBQUM7O0VBRWQsRUFBRTs7RUFFRixDQUFDLElBQUksRUFBRSxXQUFXLENBQUMsR0FBRzs7RUFFdEIsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7RUFFYixFQUFFLE9BQU8sSUFBSSxDQUFDOztFQUVkLEVBQUU7O0VBRUYsQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLEdBQUc7O0VBRXRCLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7O0VBRWIsRUFBRSxPQUFPLElBQUksQ0FBQzs7RUFFZCxFQUFFOztFQUVGLENBQUMsWUFBWSxFQUFFLFdBQVcsS0FBSyxFQUFFLEtBQUssR0FBRzs7RUFFekMsRUFBRSxTQUFTLEtBQUs7O0VBRWhCLEdBQUcsS0FBSyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxNQUFNO0VBQ2pDLEdBQUcsS0FBSyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxNQUFNO0VBQ2pDLEdBQUcsU0FBUyxNQUFNLElBQUksS0FBSyxFQUFFLHlCQUF5QixHQUFHLEtBQUssRUFBRSxDQUFDOztFQUVqRSxHQUFHOztFQUVILEVBQUUsT0FBTyxJQUFJLENBQUM7O0VBRWQsRUFBRTs7RUFFRixDQUFDLFlBQVksRUFBRSxXQUFXLEtBQUssR0FBRzs7RUFFbEMsRUFBRSxTQUFTLEtBQUs7O0VBRWhCLEdBQUcsS0FBSyxDQUFDLEVBQUUsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDO0VBQ3pCLEdBQUcsS0FBSyxDQUFDLEVBQUUsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDO0VBQ3pCLEdBQUcsU0FBUyxNQUFNLElBQUksS0FBSyxFQUFFLHlCQUF5QixHQUFHLEtBQUssRUFBRSxDQUFDOztFQUVqRSxHQUFHOztFQUVILEVBQUU7O0VBRUYsQ0FBQyxLQUFLLEVBQUUsWUFBWTs7RUFFcEIsRUFBRSxPQUFPLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7RUFFaEQsRUFBRTs7RUFFRixDQUFDLElBQUksRUFBRSxXQUFXLENBQUMsR0FBRzs7RUFFdEIsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZixFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7RUFFZixFQUFFLE9BQU8sSUFBSSxDQUFDOztFQUVkLEVBQUU7O0VBRUYsQ0FBQyxHQUFHLEVBQUUsV0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHOztFQUV4QixFQUFFLEtBQUssQ0FBQyxLQUFLLFNBQVMsR0FBRzs7RUFFekIsR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLHVGQUF1RixFQUFFLENBQUM7RUFDM0csR0FBRyxPQUFPLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDOztFQUVsQyxHQUFHOztFQUVILEVBQUUsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2hCLEVBQUUsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDOztFQUVoQixFQUFFLE9BQU8sSUFBSSxDQUFDOztFQUVkLEVBQUU7O0VBRUYsQ0FBQyxTQUFTLEVBQUUsV0FBVyxDQUFDLEdBQUc7O0VBRTNCLEVBQUUsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7RUFDZCxFQUFFLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDOztFQUVkLEVBQUUsT0FBTyxJQUFJLENBQUM7O0VBRWQsRUFBRTs7RUFFRixDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMsRUFBRSxDQUFDLEdBQUc7O0VBRS9CLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDckIsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7RUFFckIsRUFBRSxPQUFPLElBQUksQ0FBQzs7RUFFZCxFQUFFOztFQUVGLENBQUMsZUFBZSxFQUFFLFdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRzs7RUFFcEMsRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ3BCLEVBQUUsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7RUFFcEIsRUFBRSxPQUFPLElBQUksQ0FBQzs7RUFFZCxFQUFFOztFQUVGLENBQUMsR0FBRyxFQUFFLFdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRzs7RUFFeEIsRUFBRSxLQUFLLENBQUMsS0FBSyxTQUFTLEdBQUc7O0VBRXpCLEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRSx1RkFBdUYsRUFBRSxDQUFDO0VBQzNHLEdBQUcsT0FBTyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7RUFFbEMsR0FBRzs7RUFFSCxFQUFFLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNoQixFQUFFLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQzs7RUFFaEIsRUFBRSxPQUFPLElBQUksQ0FBQzs7RUFFZCxFQUFFOztFQUVGLENBQUMsU0FBUyxFQUFFLFdBQVcsQ0FBQyxHQUFHOztFQUUzQixFQUFFLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0VBQ2QsRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQzs7RUFFZCxFQUFFLE9BQU8sSUFBSSxDQUFDOztFQUVkLEVBQUU7O0VBRUYsQ0FBQyxVQUFVLEVBQUUsV0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHOztFQUUvQixFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3JCLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7O0VBRXJCLEVBQUUsT0FBTyxJQUFJLENBQUM7O0VBRWQsRUFBRTs7RUFFRixDQUFDLFFBQVEsRUFBRSxXQUFXLENBQUMsR0FBRzs7RUFFMUIsRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDaEIsRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7O0VBRWhCLEVBQUUsT0FBTyxJQUFJLENBQUM7O0VBRWQsRUFBRTs7RUFFRixDQUFDLGNBQWMsRUFBRSxXQUFXLE1BQU0sR0FBRzs7RUFFckMsRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQztFQUNuQixFQUFFLElBQUksQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDOztFQUVuQixFQUFFLE9BQU8sSUFBSSxDQUFDOztFQUVkLEVBQUU7O0VBRUYsQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDLEdBQUc7O0VBRXhCLEVBQUUsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2hCLEVBQUUsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDOztFQUVoQixFQUFFLE9BQU8sSUFBSSxDQUFDOztFQUVkLEVBQUU7O0VBRUYsQ0FBQyxZQUFZLEVBQUUsV0FBVyxNQUFNLEdBQUc7O0VBRW5DLEVBQUUsT0FBTyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsR0FBRyxNQUFNLEVBQUUsQ0FBQzs7RUFFM0MsRUFBRTs7RUFFRixDQUFDLEdBQUcsRUFBRSxXQUFXLENBQUMsR0FBRzs7RUFFckIsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7RUFDbkMsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7O0VBRW5DLEVBQUUsT0FBTyxJQUFJLENBQUM7O0VBRWQsRUFBRTs7RUFFRixDQUFDLEdBQUcsRUFBRSxXQUFXLENBQUMsR0FBRzs7RUFFckIsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7RUFDbkMsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7O0VBRW5DLEVBQUUsT0FBTyxJQUFJLENBQUM7O0VBRWQsRUFBRTs7RUFFRixDQUFDLEtBQUssRUFBRSxXQUFXLEdBQUcsRUFBRSxHQUFHLEdBQUc7O0VBRTlCOztFQUVBLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDO0VBQ3hELEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDOztFQUV4RCxFQUFFLE9BQU8sSUFBSSxDQUFDOztFQUVkLEVBQUU7O0VBRUYsQ0FBQyxXQUFXLEVBQUUsWUFBWTs7RUFFMUIsRUFBRSxJQUFJLEdBQUcsR0FBRyxJQUFJQSxTQUFPLEVBQUUsQ0FBQztFQUMxQixFQUFFLElBQUksR0FBRyxHQUFHLElBQUlBLFNBQU8sRUFBRSxDQUFDOztFQUUxQixFQUFFLE9BQU8sU0FBUyxXQUFXLEVBQUUsTUFBTSxFQUFFLE1BQU0sR0FBRzs7RUFFaEQsR0FBRyxHQUFHLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQztFQUM3QixHQUFHLEdBQUcsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDOztFQUU3QixHQUFHLE9BQU8sSUFBSSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7O0VBRWpDLEdBQUcsQ0FBQzs7RUFFSixFQUFFLEVBQUU7O0VBRUosQ0FBQyxXQUFXLEVBQUUsV0FBVyxHQUFHLEVBQUUsR0FBRyxHQUFHOztFQUVwQyxFQUFFLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQzs7RUFFN0IsRUFBRSxPQUFPLElBQUksQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLEVBQUUsR0FBRyxNQUFNLEVBQUUsQ0FBQzs7RUFFbEYsRUFBRTs7RUFFRixDQUFDLEtBQUssRUFBRSxZQUFZOztFQUVwQixFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7RUFDaEMsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDOztFQUVoQyxFQUFFLE9BQU8sSUFBSSxDQUFDOztFQUVkLEVBQUU7O0VBRUYsQ0FBQyxJQUFJLEVBQUUsWUFBWTs7RUFFbkIsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDO0VBQy9CLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7RUFFL0IsRUFBRSxPQUFPLElBQUksQ0FBQzs7RUFFZCxFQUFFOztFQUVGLENBQUMsS0FBSyxFQUFFLFlBQVk7O0VBRXBCLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQztFQUNoQyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7O0VBRWhDLEVBQUUsT0FBTyxJQUFJLENBQUM7O0VBRWQsRUFBRTs7RUFFRixDQUFDLFdBQVcsRUFBRSxZQUFZOztFQUUxQixFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQztFQUN2RSxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7RUFFdkUsRUFBRSxPQUFPLElBQUksQ0FBQzs7RUFFZCxFQUFFOztFQUVGLENBQUMsTUFBTSxFQUFFLFlBQVk7O0VBRXJCLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7RUFDcEIsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQzs7RUFFcEIsRUFBRSxPQUFPLElBQUksQ0FBQzs7RUFFZCxFQUFFOztFQUVGLENBQUMsR0FBRyxFQUFFLFdBQVcsQ0FBQyxHQUFHOztFQUVyQixFQUFFLE9BQU8sSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7RUFFckMsRUFBRTs7RUFFRixDQUFDLFFBQVEsRUFBRSxZQUFZOztFQUV2QixFQUFFLE9BQU8sSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQzs7RUFFM0MsRUFBRTs7RUFFRixDQUFDLE1BQU0sRUFBRSxZQUFZOztFQUVyQixFQUFFLE9BQU8sSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7O0VBRXhELEVBQUU7O0VBRUYsQ0FBQyxlQUFlLEVBQUUsV0FBVzs7RUFFN0IsRUFBRSxPQUFPLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDOztFQUVqRCxFQUFFOztFQUVGLENBQUMsU0FBUyxFQUFFLFlBQVk7O0VBRXhCLEVBQUUsT0FBTyxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDOztFQUU1QyxFQUFFOztFQUVGLENBQUMsS0FBSyxFQUFFLFlBQVk7O0VBRXBCOztFQUVBLEVBQUUsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7RUFFM0MsRUFBRSxLQUFLLEtBQUssR0FBRyxDQUFDLEdBQUcsS0FBSyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDOztFQUV4QyxFQUFFLE9BQU8sS0FBSyxDQUFDOztFQUVmLEVBQUU7O0VBRUYsQ0FBQyxVQUFVLEVBQUUsV0FBVyxDQUFDLEdBQUc7O0VBRTVCLEVBQUUsT0FBTyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDOztFQUVsRCxFQUFFOztFQUVGLENBQUMsaUJBQWlCLEVBQUUsV0FBVyxDQUFDLEdBQUc7O0VBRW5DLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDM0MsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQzs7RUFFM0IsRUFBRTs7RUFFRixDQUFDLG1CQUFtQixFQUFFLFdBQVcsQ0FBQyxHQUFHOztFQUVyQyxFQUFFLE9BQU8sSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDOztFQUU3RCxFQUFFOztFQUVGLENBQUMsU0FBUyxFQUFFLFdBQVcsTUFBTSxHQUFHOztFQUVoQyxFQUFFLE9BQU8sSUFBSSxDQUFDLGNBQWMsRUFBRSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUM7O0VBRXZELEVBQUU7O0VBRUYsQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLEVBQUUsS0FBSyxHQUFHOztFQUU3QixFQUFFLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEtBQUssS0FBSyxDQUFDO0VBQ3JDLEVBQUUsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsS0FBSyxLQUFLLENBQUM7O0VBRXJDLEVBQUUsT0FBTyxJQUFJLENBQUM7O0VBRWQsRUFBRTs7RUFFRixDQUFDLFdBQVcsRUFBRSxXQUFXLEVBQUUsRUFBRSxFQUFFLEVBQUUsS0FBSyxHQUFHOztFQUV6QyxFQUFFLE9BQU8sSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsY0FBYyxFQUFFLEtBQUssRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQzs7RUFFckUsRUFBRTs7RUFFRixDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsR0FBRzs7RUFFeEIsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsRUFBRSxHQUFHOztFQUV0RCxFQUFFOztFQUVGLENBQUMsU0FBUyxFQUFFLFdBQVcsS0FBSyxFQUFFLE1BQU0sR0FBRzs7RUFFdkMsRUFBRSxLQUFLLE1BQU0sS0FBSyxTQUFTLEdBQUcsTUFBTSxHQUFHLENBQUMsQ0FBQzs7RUFFekMsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQztFQUMzQixFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsS0FBSyxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQzs7RUFFL0IsRUFBRSxPQUFPLElBQUksQ0FBQzs7RUFFZCxFQUFFOztFQUVGLENBQUMsT0FBTyxFQUFFLFdBQVcsS0FBSyxFQUFFLE1BQU0sR0FBRzs7RUFFckMsRUFBRSxLQUFLLEtBQUssS0FBSyxTQUFTLEdBQUcsS0FBSyxHQUFHLEVBQUUsQ0FBQztFQUN4QyxFQUFFLEtBQUssTUFBTSxLQUFLLFNBQVMsR0FBRyxNQUFNLEdBQUcsQ0FBQyxDQUFDOztFQUV6QyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO0VBQzNCLEVBQUUsS0FBSyxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDOztFQUUvQixFQUFFLE9BQU8sS0FBSyxDQUFDOztFQUVmLEVBQUU7O0VBRUYsQ0FBQyxtQkFBbUIsRUFBRSxXQUFXLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxHQUFHOztFQUU1RCxFQUFFLEtBQUssTUFBTSxLQUFLLFNBQVMsR0FBRzs7RUFFOUIsR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLHFFQUFxRSxFQUFFLENBQUM7O0VBRXpGLEdBQUc7O0VBRUgsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUM7RUFDbkMsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUM7O0VBRW5DLEVBQUUsT0FBTyxJQUFJLENBQUM7O0VBRWQsRUFBRTs7RUFFRixDQUFDLFlBQVksRUFBRSxXQUFXLE1BQU0sRUFBRSxLQUFLLEdBQUc7O0VBRTFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQzs7RUFFbkQsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUM7RUFDNUIsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUM7O0VBRTVCLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQztFQUNwQyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUM7O0VBRXBDLEVBQUUsT0FBTyxJQUFJLENBQUM7O0VBRWQsRUFBRTs7RUFFRixDQUFDLEVBQUUsQ0FBQzs7RUFFSjtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVBLElBQUlpVyxXQUFTLEdBQUcsQ0FBQyxDQUFDOztFQUVsQixTQUFTRSxTQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsUUFBUSxHQUFHOztFQUUzRyxDQUFDLE1BQU0sQ0FBQyxjQUFjLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLEtBQUssRUFBRUYsV0FBUyxHQUFHLEVBQUUsRUFBRSxDQUFDOztFQUU5RCxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUd6VyxPQUFLLENBQUMsWUFBWSxFQUFFLENBQUM7O0VBRWxDLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUM7O0VBRWhCLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLEtBQUssU0FBUyxHQUFHLEtBQUssR0FBRzJXLFNBQU8sQ0FBQyxhQUFhLENBQUM7RUFDbEUsQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQzs7RUFFbkIsQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sS0FBSyxTQUFTLEdBQUcsT0FBTyxHQUFHQSxTQUFPLENBQUMsZUFBZSxDQUFDOztFQUUxRSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxLQUFLLFNBQVMsR0FBRyxLQUFLLEdBQUdJLHFCQUFtQixDQUFDO0VBQ2hFLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLEtBQUssU0FBUyxHQUFHLEtBQUssR0FBR0EscUJBQW1CLENBQUM7O0VBRWhFLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLEtBQUssU0FBUyxHQUFHLFNBQVMsR0FBR0MsY0FBWSxDQUFDO0VBQ3JFLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLEtBQUssU0FBUyxHQUFHLFNBQVMsR0FBR0MsMEJBQXdCLENBQUM7O0VBRWpGLENBQUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLEtBQUssU0FBUyxHQUFHLFVBQVUsR0FBRyxDQUFDLENBQUM7O0VBRTdELENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLEtBQUssU0FBUyxHQUFHLE1BQU0sR0FBR0MsWUFBVSxDQUFDO0VBQzFELENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLEtBQUssU0FBUyxHQUFHLElBQUksR0FBR0Msa0JBQWdCLENBQUM7O0VBRTFELENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJM1csU0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztFQUNuQyxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSUEsU0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7RUFFbkMsQ0FBQyxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztFQUM3QixDQUFDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7RUFDL0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztFQUNuQixDQUFDLElBQUksQ0FBQyxlQUFlLEdBQUcsQ0FBQyxDQUFDOztFQUUxQjtFQUNBO0VBQ0E7RUFDQTtFQUNBLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLEtBQUssU0FBUyxHQUFHLFFBQVEsR0FBR2tYLGdCQUFjLENBQUM7O0VBRXBFLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7RUFDbEIsQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQzs7RUFFdEIsQ0FBQzs7QUFFRGYsV0FBTyxDQUFDLGFBQWEsR0FBRyxTQUFTLENBQUM7QUFDbENBLFdBQU8sQ0FBQyxlQUFlLEdBQUdpQixXQUFTLENBQUM7O0VBRXBDLE1BQU0sQ0FBQyxjQUFjLEVBQUVqQixTQUFPLENBQUMsU0FBUyxFQUFFLGFBQWEsRUFBRTs7RUFFekQsQ0FBQyxHQUFHLEVBQUUsV0FBVyxLQUFLLEdBQUc7O0VBRXpCLEVBQUUsS0FBSyxLQUFLLEtBQUssSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQzs7RUFFeEMsRUFBRTs7RUFFRixDQUFDLEVBQUUsQ0FBQzs7RUFFSixNQUFNLENBQUMsTUFBTSxFQUFFQSxTQUFPLENBQUMsU0FBUyxFQUFFdFosaUJBQWUsQ0FBQyxTQUFTLEVBQUU7O0VBRTdELENBQUMsV0FBVyxFQUFFc1osU0FBTzs7RUFFckIsQ0FBQyxTQUFTLEVBQUUsSUFBSTs7RUFFaEIsQ0FBQyxLQUFLLEVBQUUsWUFBWTs7RUFFcEIsRUFBRSxPQUFPLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQzs7RUFFN0MsRUFBRTs7RUFFRixDQUFDLElBQUksRUFBRSxXQUFXLE1BQU0sR0FBRzs7RUFFM0IsRUFBRSxJQUFJLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7O0VBRTFCLEVBQUUsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDO0VBQzVCLEVBQUUsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQzs7RUFFM0MsRUFBRSxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUM7O0VBRWhDLEVBQUUsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDO0VBQzVCLEVBQUUsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDOztFQUU1QixFQUFFLElBQUksQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQztFQUNwQyxFQUFFLElBQUksQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQzs7RUFFcEMsRUFBRSxJQUFJLENBQUMsVUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUM7O0VBRXRDLEVBQUUsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0VBQzlCLEVBQUUsSUFBSSxDQUFDLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDOztFQUUxQixFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztFQUNwQyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQzs7RUFFcEMsRUFBRSxJQUFJLENBQUMsZUFBZSxHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUM7RUFDaEQsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDO0VBQ2xELEVBQUUsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDO0VBQzVCLEVBQUUsSUFBSSxDQUFDLGVBQWUsR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDO0VBQ2hELEVBQUUsSUFBSSxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDOztFQUVsQyxFQUFFLE9BQU8sSUFBSSxDQUFDOztFQUVkLEVBQUU7O0VBRUYsQ0FBQyxNQUFNLEVBQUUsV0FBVyxJQUFJLEdBQUc7O0VBRTNCLEVBQUUsS0FBSyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxTQUFTLEdBQUc7O0VBRWxELEdBQUcsT0FBTyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQzs7RUFFckMsR0FBRzs7RUFFSCxFQUFFLFNBQVMsVUFBVSxFQUFFLEtBQUssR0FBRzs7RUFFL0IsR0FBRyxJQUFJLE1BQU0sQ0FBQzs7RUFFZCxHQUFHLEtBQUssS0FBSyxDQUFDLFNBQVMsS0FBSyxTQUFTLEdBQUc7O0VBRXhDLElBQUksTUFBTSxHQUFHLEtBQUssQ0FBQzs7RUFFbkIsSUFBSSxNQUFNOztFQUVWLElBQUksTUFBTSxHQUFHLFFBQVEsQ0FBQyxlQUFlLEVBQUUsOEJBQThCLEVBQUUsUUFBUSxFQUFFLENBQUM7RUFDbEYsSUFBSSxNQUFNLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7RUFDL0IsSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7O0VBRWpDLElBQUksTUFBTSxDQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7O0VBRWxGLElBQUk7O0VBRUosR0FBRyxLQUFLLE1BQU0sQ0FBQyxLQUFLLEdBQUcsSUFBSSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsSUFBSSxHQUFHOztFQUV0RCxJQUFJLE9BQU8sTUFBTSxDQUFDLFNBQVMsRUFBRSxZQUFZLEVBQUUsR0FBRyxFQUFFLENBQUM7O0VBRWpELElBQUksTUFBTTs7RUFFVixJQUFJLE9BQU8sTUFBTSxDQUFDLFNBQVMsRUFBRSxXQUFXLEVBQUUsQ0FBQzs7RUFFM0MsSUFBSTs7RUFFSixHQUFHOztFQUVILEVBQUUsSUFBSSxNQUFNLEdBQUc7RUFDZixHQUFHLFFBQVEsRUFBRTtFQUNiLElBQUksT0FBTyxFQUFFLEdBQUc7RUFDaEIsSUFBSSxJQUFJLEVBQUUsU0FBUztFQUNuQixJQUFJLFNBQVMsRUFBRSxnQkFBZ0I7RUFDL0IsSUFBSTs7RUFFSixHQUFHLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtFQUNsQixHQUFHLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTs7RUFFbEIsR0FBRyxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87O0VBRXhCLEdBQUcsTUFBTSxFQUFFLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUU7RUFDM0MsR0FBRyxNQUFNLEVBQUUsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRTtFQUMzQyxHQUFHLElBQUksRUFBRSxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRTs7RUFFbkMsR0FBRyxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7RUFDNUIsR0FBRyxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7RUFDNUIsR0FBRyxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVU7O0VBRTlCLEdBQUcsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO0VBQ3BCLEdBQUcsQ0FBQzs7RUFFSixFQUFFLEtBQUssSUFBSSxDQUFDLEtBQUssS0FBSyxTQUFTLEdBQUc7O0VBRWxDOztFQUVBLEdBQUcsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQzs7RUFFMUIsR0FBRyxLQUFLLEtBQUssQ0FBQyxJQUFJLEtBQUssU0FBUyxHQUFHOztFQUVuQyxJQUFJLEtBQUssQ0FBQyxJQUFJLEdBQUczVyxPQUFLLENBQUMsWUFBWSxFQUFFLENBQUM7O0VBRXRDLElBQUk7O0VBRUosR0FBRyxLQUFLLElBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxLQUFLLFNBQVMsR0FBRzs7RUFFbEQsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsR0FBRztFQUNoQyxLQUFLLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSTtFQUNyQixLQUFLLEdBQUcsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFO0VBQzdCLEtBQUssQ0FBQzs7RUFFTixJQUFJOztFQUVKLEdBQUcsTUFBTSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDOztFQUU3QixHQUFHOztFQUVILEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLEdBQUcsTUFBTSxDQUFDOztFQUV0QyxFQUFFLE9BQU8sTUFBTSxDQUFDOztFQUVoQixFQUFFOztFQUVGLENBQUMsT0FBTyxFQUFFLFlBQVk7O0VBRXRCLEVBQUUsSUFBSSxDQUFDLGFBQWEsRUFBRSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsRUFBRSxDQUFDOztFQUU1QyxFQUFFOztFQUVGLENBQUMsV0FBVyxFQUFFLFdBQVcsRUFBRSxHQUFHOztFQUU5QixFQUFFLEtBQUssSUFBSSxDQUFDLE9BQU8sS0FBSzRYLFdBQVMsR0FBRyxPQUFPOztFQUUzQyxFQUFFLEVBQUUsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO0VBQzdCLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7O0VBRXhCLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRzs7RUFFOUIsR0FBRyxTQUFTLElBQUksQ0FBQyxLQUFLOztFQUV0QixJQUFJLEtBQUt3a0QsZ0JBQWM7O0VBRXZCLEtBQUssRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDO0VBQ3RDLEtBQUssTUFBTTs7RUFFWCxJQUFJLEtBQUtybEQscUJBQW1COztFQUU1QixLQUFLLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUM3QixLQUFLLE1BQU07O0VBRVgsSUFBSSxLQUFLdWxELHdCQUFzQjs7RUFFL0IsS0FBSyxLQUFLLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEtBQUssQ0FBQyxHQUFHOztFQUVyRCxNQUFNLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQzs7RUFFdEMsTUFBTSxNQUFNOztFQUVaLE1BQU0sRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDOztFQUV2QyxNQUFNO0VBQ04sS0FBSyxNQUFNOztFQUVYLElBQUk7O0VBRUosR0FBRzs7RUFFSCxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUc7O0VBRTlCLEdBQUcsU0FBUyxJQUFJLENBQUMsS0FBSzs7RUFFdEIsSUFBSSxLQUFLRixnQkFBYzs7RUFFdkIsS0FBSyxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7RUFDdEMsS0FBSyxNQUFNOztFQUVYLElBQUksS0FBS3JsRCxxQkFBbUI7O0VBRTVCLEtBQUssRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQzdCLEtBQUssTUFBTTs7RUFFWCxJQUFJLEtBQUt1bEQsd0JBQXNCOztFQUUvQixLQUFLLEtBQUssSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsS0FBSyxDQUFDLEdBQUc7O0VBRXJELE1BQU0sRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDOztFQUV0QyxNQUFNLE1BQU07O0VBRVosTUFBTSxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7O0VBRXZDLE1BQU07RUFDTixLQUFLLE1BQU07O0VBRVgsSUFBSTs7RUFFSixHQUFHOztFQUVILEVBQUUsS0FBSyxJQUFJLENBQUMsS0FBSyxHQUFHOztFQUVwQixHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7O0VBRW5CLEdBQUc7O0VBRUgsRUFBRTs7RUFFRixDQUFDLEVBQUUsQ0FBQzs7RUFFSjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFQSxTQUFTcmpELFNBQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUc7O0VBRS9CLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0VBQ2pCLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0VBQ2pCLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0VBQ2pCLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxTQUFTLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQzs7RUFFdEMsQ0FBQzs7RUFFRCxNQUFNLENBQUMsTUFBTSxFQUFFQSxTQUFPLENBQUMsU0FBUyxFQUFFOztFQUVsQyxDQUFDLFNBQVMsRUFBRSxJQUFJOztFQUVoQixDQUFDLEdBQUcsRUFBRSxXQUFXLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRzs7RUFFOUIsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNiLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDYixFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ2IsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7RUFFYixFQUFFLE9BQU8sSUFBSSxDQUFDOztFQUVkLEVBQUU7O0VBRUYsQ0FBQyxTQUFTLEVBQUUsV0FBVyxNQUFNLEdBQUc7O0VBRWhDLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUM7RUFDbEIsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQztFQUNsQixFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDO0VBQ2xCLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUM7O0VBRWxCLEVBQUUsT0FBTyxJQUFJLENBQUM7O0VBRWQsRUFBRTs7RUFFRixDQUFDLElBQUksRUFBRSxXQUFXLENBQUMsR0FBRzs7RUFFdEIsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7RUFFYixFQUFFLE9BQU8sSUFBSSxDQUFDOztFQUVkLEVBQUU7O0VBRUYsQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLEdBQUc7O0VBRXRCLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7O0VBRWIsRUFBRSxPQUFPLElBQUksQ0FBQzs7RUFFZCxFQUFFOztFQUVGLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxHQUFHOztFQUV0QixFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDOztFQUViLEVBQUUsT0FBTyxJQUFJLENBQUM7O0VBRWQsRUFBRTs7RUFFRixDQUFDLElBQUksRUFBRSxXQUFXLENBQUMsR0FBRzs7RUFFdEIsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7RUFFYixFQUFFLE9BQU8sSUFBSSxDQUFDOztFQUVkLEVBQUU7O0VBRUYsQ0FBQyxZQUFZLEVBQUUsV0FBVyxLQUFLLEVBQUUsS0FBSyxHQUFHOztFQUV6QyxFQUFFLFNBQVMsS0FBSzs7RUFFaEIsR0FBRyxLQUFLLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLE1BQU07RUFDakMsR0FBRyxLQUFLLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLE1BQU07RUFDakMsR0FBRyxLQUFLLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLE1BQU07RUFDakMsR0FBRyxLQUFLLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLE1BQU07RUFDakMsR0FBRyxTQUFTLE1BQU0sSUFBSSxLQUFLLEVBQUUseUJBQXlCLEdBQUcsS0FBSyxFQUFFLENBQUM7O0VBRWpFLEdBQUc7O0VBRUgsRUFBRSxPQUFPLElBQUksQ0FBQzs7RUFFZCxFQUFFOztFQUVGLENBQUMsWUFBWSxFQUFFLFdBQVcsS0FBSyxHQUFHOztFQUVsQyxFQUFFLFNBQVMsS0FBSzs7RUFFaEIsR0FBRyxLQUFLLENBQUMsRUFBRSxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUM7RUFDekIsR0FBRyxLQUFLLENBQUMsRUFBRSxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUM7RUFDekIsR0FBRyxLQUFLLENBQUMsRUFBRSxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUM7RUFDekIsR0FBRyxLQUFLLENBQUMsRUFBRSxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUM7RUFDekIsR0FBRyxTQUFTLE1BQU0sSUFBSSxLQUFLLEVBQUUseUJBQXlCLEdBQUcsS0FBSyxFQUFFLENBQUM7O0VBRWpFLEdBQUc7O0VBRUgsRUFBRTs7RUFFRixDQUFDLEtBQUssRUFBRSxZQUFZOztFQUVwQixFQUFFLE9BQU8sSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7RUFFaEUsRUFBRTs7RUFFRixDQUFDLElBQUksRUFBRSxXQUFXLENBQUMsR0FBRzs7RUFFdEIsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDZixFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNmLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2YsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7O0VBRTNDLEVBQUUsT0FBTyxJQUFJLENBQUM7O0VBRWQsRUFBRTs7RUFFRixDQUFDLEdBQUcsRUFBRSxXQUFXLENBQUMsRUFBRSxDQUFDLEdBQUc7O0VBRXhCLEVBQUUsS0FBSyxDQUFDLEtBQUssU0FBUyxHQUFHOztFQUV6QixHQUFHLE9BQU8sQ0FBQyxJQUFJLEVBQUUsdUZBQXVGLEVBQUUsQ0FBQztFQUMzRyxHQUFHLE9BQU8sSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0VBRWxDLEdBQUc7O0VBRUgsRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDaEIsRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDaEIsRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDaEIsRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7O0VBRWhCLEVBQUUsT0FBTyxJQUFJLENBQUM7O0VBRWQsRUFBRTs7RUFFRixDQUFDLFNBQVMsRUFBRSxXQUFXLENBQUMsR0FBRzs7RUFFM0IsRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztFQUNkLEVBQUUsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7RUFDZCxFQUFFLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0VBQ2QsRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQzs7RUFFZCxFQUFFLE9BQU8sSUFBSSxDQUFDOztFQUVkLEVBQUU7O0VBRUYsQ0FBQyxVQUFVLEVBQUUsV0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHOztFQUUvQixFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3JCLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDckIsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNyQixFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDOztFQUVyQixFQUFFLE9BQU8sSUFBSSxDQUFDOztFQUVkLEVBQUU7O0VBRUYsQ0FBQyxlQUFlLEVBQUUsV0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHOztFQUVwQyxFQUFFLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDcEIsRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ3BCLEVBQUUsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNwQixFQUFFLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7O0VBRXBCLEVBQUUsT0FBTyxJQUFJLENBQUM7O0VBRWQsRUFBRTs7RUFFRixDQUFDLEdBQUcsRUFBRSxXQUFXLENBQUMsRUFBRSxDQUFDLEdBQUc7O0VBRXhCLEVBQUUsS0FBSyxDQUFDLEtBQUssU0FBUyxHQUFHOztFQUV6QixHQUFHLE9BQU8sQ0FBQyxJQUFJLEVBQUUsdUZBQXVGLEVBQUUsQ0FBQztFQUMzRyxHQUFHLE9BQU8sSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0VBRWxDLEdBQUc7O0VBRUgsRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDaEIsRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDaEIsRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDaEIsRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7O0VBRWhCLEVBQUUsT0FBTyxJQUFJLENBQUM7O0VBRWQsRUFBRTs7RUFFRixDQUFDLFNBQVMsRUFBRSxXQUFXLENBQUMsR0FBRzs7RUFFM0IsRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztFQUNkLEVBQUUsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7RUFDZCxFQUFFLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0VBQ2QsRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQzs7RUFFZCxFQUFFLE9BQU8sSUFBSSxDQUFDOztFQUVkLEVBQUU7O0VBRUYsQ0FBQyxVQUFVLEVBQUUsV0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHOztFQUUvQixFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ3JCLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDckIsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNyQixFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDOztFQUVyQixFQUFFLE9BQU8sSUFBSSxDQUFDOztFQUVkLEVBQUU7O0VBRUYsQ0FBQyxjQUFjLEVBQUUsV0FBVyxNQUFNLEdBQUc7O0VBRXJDLEVBQUUsSUFBSSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUM7RUFDbkIsRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQztFQUNuQixFQUFFLElBQUksQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDO0VBQ25CLEVBQUUsSUFBSSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUM7O0VBRW5CLEVBQUUsT0FBTyxJQUFJLENBQUM7O0VBRWQsRUFBRTs7RUFFRixDQUFDLFlBQVksRUFBRSxXQUFXLENBQUMsR0FBRzs7RUFFOUIsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO0VBQ3JELEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQzs7RUFFckIsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7RUFDOUQsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7RUFDOUQsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7RUFDL0QsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7O0VBRS9ELEVBQUUsT0FBTyxJQUFJLENBQUM7O0VBRWQsRUFBRTs7RUFFRixDQUFDLFlBQVksRUFBRSxXQUFXLE1BQU0sR0FBRzs7RUFFbkMsRUFBRSxPQUFPLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxHQUFHLE1BQU0sRUFBRSxDQUFDOztFQUUzQyxFQUFFOztFQUVGLENBQUMsMEJBQTBCLEVBQUUsV0FBVyxDQUFDLEdBQUc7O0VBRTVDOztFQUVBOztFQUVBLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7O0VBRWhDLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7O0VBRXJDLEVBQUUsS0FBSyxDQUFDLEdBQUcsTUFBTSxHQUFHOztFQUVwQixJQUFJLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ2YsSUFBSSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNmLElBQUksSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7O0VBRWYsR0FBRyxNQUFNOztFQUVULElBQUksSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNyQixJQUFJLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDckIsSUFBSSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDOztFQUVyQixHQUFHOztFQUVILEVBQUUsT0FBTyxJQUFJLENBQUM7O0VBRWQsRUFBRTs7RUFFRixDQUFDLDhCQUE4QixFQUFFLFdBQVcsQ0FBQyxHQUFHOztFQUVoRDs7RUFFQTs7RUFFQSxFQUFFLElBQUksS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztFQUNwQixHQUFHLE9BQU8sR0FBRyxJQUFJO0VBQ2pCLEdBQUcsUUFBUSxHQUFHLEdBQUc7O0VBRWpCLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFROztFQUVsQixHQUFHLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRTtFQUM5QyxHQUFHLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRTtFQUM5QyxHQUFHLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDOztFQUVoRCxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxPQUFPO0VBQ3hDLFNBQVMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsT0FBTyxFQUFFO0VBQzFDLFNBQVMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsT0FBTyxFQUFFLEdBQUc7O0VBRTdDO0VBQ0E7RUFDQTs7RUFFQSxHQUFHLEtBQUssRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxRQUFRO0VBQzFDLFVBQVUsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsUUFBUSxFQUFFO0VBQzVDLFVBQVUsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsUUFBUSxFQUFFO0VBQzVDLFVBQVUsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsR0FBRyxRQUFRLEVBQUUsR0FBRzs7RUFFekQ7O0VBRUEsSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxD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QUNsRCxxQkFBcUIsRUFBRSxHQUFHLEdBQUcsR0FBRyxPQUFPLEdBQUcsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDOztFQUVyRCxFQUFFLEtBQUssSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxLQUFLLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7RUFFckM7RUFDQTs7RUFFQSxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQztFQUM3QixFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQztFQUM3QixFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQztFQUM3QixFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQzs7RUFFcEQsRUFBRSxPQUFPLElBQUksQ0FBQzs7RUFFZCxFQUFFOztFQUVGLENBQUMsR0FBRyxFQUFFLFdBQVcsQ0FBQyxHQUFHOztFQUVyQixFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztFQUNuQyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztFQUNuQyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztFQUNuQyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7RUFFbkMsRUFBRSxPQUFPLElBQUksQ0FBQzs7RUFFZCxFQUFFOztFQUVGLENBQUMsR0FBRyxFQUFFLFdBQVcsQ0FBQyxHQUFHOztFQUVyQixFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztFQUNuQyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztFQUNuQyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztFQUNuQyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7RUFFbkMsRUFBRSxPQUFPLElBQUksQ0FBQzs7RUFFZCxFQUFFOztFQUVGLENBQUMsS0FBSyxFQUFFLFdBQVcsR0FBRyxFQUFFLEdBQUcsR0FBRzs7RUFFOUI7O0VBRUEsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7RUFDeEQsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7RUFDeEQsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FB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QUVkLEVBQUU7O0VBRUYsQ0FBQyxXQUFXLEVBQUUsWUFBWTs7RUFFMUIsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7RUFDdkUsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7RUFDdkUsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7RUFDdkUsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7O0VBRXZFLEVBQUUsT0FBTyxJQUFJLENBQUM7O0VBRWQsRUFBRTs7RUFFRixDQUFDLE1BQU0sRUFBRSxZQUFZOztFQUVyQixFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO0VBQ3BCLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7RUFDcEIsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztFQUNwQixF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QUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQzs7RUFFckUsRUFBRTs7RUFFRixDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsR0FBRzs7RUFFeEIsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsRUFBRSxHQUFHOztFQUVsRyxFQUFFOztFQUVGLENBQUMsU0FBUyxFQUFFLFdBQVcsS0FBSyxFQUFFLE1BQU0sR0FBRzs7RUFFdkMsRUFBRSxLQUFLLE1BQU0sS0FBSyxTQUFTLEdBQUcsTUFBTSxHQUFHLENBQUMsQ0FBQzs7RUFFekMsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQztFQUMzQixFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsS0FBSyxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztFQUMvQixFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsS0FBSyxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztFQUMvQixFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsS0FBSyxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQzs7RUFFL0IsRUFBRSxPQUFPLElBQUksQ0FBQzs7RUFFZCxFQUFFOztFQUVGLENBQUMsT0FBTyxFQUFFLFdBQVcsS0FBSyxFQUFFLE1BQU0sR0FBRzs7RUFFckMsRUFBRSxLQUFLLEtBQUssS0FBSyxTQUFTLEdBQUcsS0FBSyxHQUFHLEVBQUUsQ0FBQztFQUN4QyxFQUFFLEtBQUssTUFBTSxLQUFLLFNBQVMsR0FBRyxNQUFNLEdBQUcsQ0FBQyxDQUFDOztFQUV6QyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO0VB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bEMsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7RUFDbEIsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7RUFDbEIsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7RUFDbEIsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxLQUFLLFNBQVMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDOztFQUV2QyxDQUFDOztFQUVELE1BQU0sQ0FBQyxNQUFNLEVBQUVBLFlBQVUsRUFBRTs7RUFFM0IsQ0FBQyxLQUFLLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUc7O0VBRW5DLEVBQUUsT0FBTyxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0VBRXRDLEVBQUU7O0VBRUYsQ0FBQyxTQUFTLEVBQUUsV0FBVyxHQUFHLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxDQUFDLEdBQUc7O0VBRS9FOztFQUVBLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxFQUFFLFVBQVUsR0FBRyxDQUFDLEVBQUU7RUFDakMsR0FBRyxFQUFFLEdBQUcsSUFBSSxFQUFFLFVBQVUsR0FBRyxDQUFDLEVBQUU7RUFDOUIsR0FBRyxFQUFFLEdBQUcsSUFBSSxFQUFFLFVBQVUsR0FBRyxDQUFDLEVBQUU7RUFDOUIsR0FBRyxFQUFFLEdBQUcsSUFBSSxFQUFFLFVBQVUsR0FBRyxDQUFDLEVBQUU7O0VBRTlCLEdBQUcsRUFBRSxHQUFHLElBQUksRUFBRSxVQUFVLEdBQUcsQ0FBQyxFQUFFO0VBQzlCLEdBQUcsRUFBRSxHQUFHLElBQUksRUFBRSxVQUFVLEdBQUcsQ0FBQyxFQUFFO0VBQzlCLEdBQUcsRUFBRSxHQUFHLElBQUksRUFBRSxVQUFVLEdBQUcsQ0FBQyxFQUFFO0VBQzlCLEdBQUcsRUFBRSxHQUFHLElBQUksRUFBRSxVQUFVLEdBQUcsQ0FBQyxFQUFFLENBQUM7O0VBRS9CLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHOztFQUUxRCxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDOztFQUVoQixJQUFJLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRTs7RUFFL0MsSUFBSSxHQUFHLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUU7RUFDaEMsSUFBSSxNQUFNLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7O0VBRTNCO0VBQ0EsR0FBRyxLQUFLLE1BQU0sR0FBRyxNQUFNLENBQUMsT0FBTyxHQUFHOztFQUVsQyxJQUFJLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFO0VBQ2pDLEtBQUssR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQzs7RUFFeEMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDO0VBQ2xDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQzs7RUFFbEMsSUFBSTs7RUFFSixHQUFHLElBQUksSUFBSSxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7O0VBRXRCLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztFQUMzQixHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7RUFDM0IsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0VBQzNCLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQzs7RUFFM0I7RUFDQSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUc7O0VBRXRCLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDOztFQUVuRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7RUFDWixJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7RUFDWixJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7RUFDWixJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7O0VBRVosSUFBSTs7RUFFSixHQUFHOztFQUVILEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsQ0FBQztFQUN4QixFQUFFLEdBQUcsRUFBRSxTQUFTLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDO0VBQzVCLEVBQUUsR0FBRyxFQUFFLFNBQVMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7RUFDNUIsRUFBRSxHQUFHLEVBQUUsU0FBUyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQzs7RUFFNUIsRUFBRTs7RUFFRixDQUFDLEVBQUUsQ0FBQzs7RUFFSixNQUFNLENBQUMsZ0JBQWdCLEVBQUVBLFlBQVUsQ0FBQyxTQUFTLEVBQUU7O0VBRS9DLENBQUMsQ0FBQyxFQUFFOztFQUVKLEVBQUUsR0FBRyxFQUFFLFlBQVk7O0VBRW5CLEdBQUcsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDOztFQUVsQixHQUFHOztFQUVILEVBQUUs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RTlDLEdBQUcsTUFBTSxJQUFJLEtBQUssRUFBRSxrR0FBa0csRUFBRSxDQUFDOztFQUV6SCxHQUFHOztFQUVILEVBQUUsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsRUFBRSxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQzs7RUFFcEU7RUFDQTtFQUNBOztFQUVBLEVBQUUsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztFQUNyQixFQUFFLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7O0VBRXJCLEVBQUUsSUFBSSxFQUFFLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztFQUN4QixFQUFFLElBQUksRUFBRSxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7RUFDeEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDOztFQUV4QixFQUFFLElBQUksRUFBRSxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7RUFDeEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO0VBQ3hCLEVBQUUsSUFBSSxFQUFFLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQzs7RUFFeEIsRUFBRSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7O0VBRXpCLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztFQUN6QyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7RUFDekMsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0VBQ3pDLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQzs7RUFFekMsR0FBRyxNQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRzs7RUFFaEMsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0VBQ3pDLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztFQUN6QyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7RUFDekMsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDOztFQUV6QyxHQUFHLE1BQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHOztFQUVoQyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7RUFDekMsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0VBQ3pDLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztFQUN6QyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7O0VBRXpDLEdBQUcsTUFBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEdBQUc7O0VBRWhDLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztFQUN6QyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7RUFDekMsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0VBQ3pDLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQzs7RUFFekMsR0FBRyxNQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRzs7RUFFaEMsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0VBQ3pDLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztFQUN6QyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7RUFDekMsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDOztFQUV6QyxHQUFHLE1BQU0sS0FBSyxLQUFLLEtBQUssS0FBSyxHQUFHOztFQUVoQyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7RUFDekMsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0VBQ3pDLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztFQUN6QyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7O0VBRXpDLEdBQUc7O0VBRUgsRUFBRSxLQUFLLE1BQU0sS0FBSyxLQUFLLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7O0VBRWxELEVBQUUsT0FBTyxJQUFJLENBQUM7O0VBRWQsRUFBRTs7RUFFRixDQUFDLGdCQUFnQixFQUFFLFdBQVcsSUFBSSxFQUFFLEtBQUssR0FBRzs7RUFFNUM7O0VBRUE7O0VBRUEsRUFBRSxJQUFJLFNBQVMsR0FBRyxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLFNBQVMsRUFBRSxDQUFDOztFQUV2RCxFQUFFLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDdkIsRUFBRSxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ3ZCLEVBQUUsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUN2QixFQUFFLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxTQUFTLEVBQUUsQ0FBQzs7RUFFbEMsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQzs7RUFFMUIsRUFBRSxPQUFPLElBQUksQ0FBQzs7RUFFZCxFQUFFOztFQUVGLENBQUMscUJBQXFCLEVBQUUsV0FBVyxDQUFDLEdBQUc7O0VBRXZDOztFQUVBOztFQUVBLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVE7O0VBRXJCLEdBQUcsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFO0VBQzlDLEdBQUcsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFO0VBQzlDLEdBQUcsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFOztFQUUvQyxHQUFHLEtBQUssR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7RUFDMUIsR0FBRyxDQUFDLENBQUM7O0VBRUwsRUFBRSxLQUFLLEtBQUssR0FBRyxDQUFDLEdBQUc7O0VBRW5CLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssR0FBRyxHQUFHLEVBQUUsQ0FBQzs7RUFFdEMsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksR0FBRyxDQUFDLENBQUM7RUFDdEIsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUM7RUFDL0IsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUM7RUFDL0IsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUM7O0VBRS9CLEdBQUcsTUFBTSxLQUFLLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRzs7RUFFdkMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUM7O0VBRWhELEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDO0VBQy9CLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0VBQ3RCLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDO0VBQy9CLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDOztFQUUvQixHQUFHLE1BQU0sS0FBSyxHQUFHLEdBQUcsR0FBRyxHQUFHOztFQUUxQixHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQzs7RUFFaEQsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUM7RUFDL0IsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUM7RUFDL0IsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksR0FBRyxDQUFDLENBQUM7RUFDdEIsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUM7O0VBRS9CLEdBQUcsTUFBTTs7RUFFVCxHQUFHLENBQUMsR0FBRyxHQUFHLEdB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QUFHOztFQUV4Qzs7RUFFQSxFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7RUFDckQsRUFBRSxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDOztFQUVyRCxFQUFFLElBQUksQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztFQUMxRCxFQUFFLElBQUksQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztFQUMxRCxFQUFFLElBQUksQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztFQUMxRCxFQUFFLElBQUksQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQzs7RUFFMUQsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQzs7RUFFMUIsRUFBRSxPQUFPLElBQUksQ0FBQzs7RUFFZCxFQUFFOztFQUVGLENBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRSxFQUFFLENBQUMsR0FBRzs7RUFFM0IsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsT0FBTyxJQUFJLENB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QUMsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDOztFQUVyQixFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDO0VBQzNELEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUM7RUFDM0QsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQztFQUMzRCxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQzs7RUFFM0QsRUFBRSxPQUFPLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0VBRWhDLEVBQUU7O0VBRUYsQ0FBQyxlQUFlLEVBQUUsV0FBVyxDQUFDLEdBQUc7O0VBRWpDLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztFQUN6QyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7O0VBRTdDOztFQUVBLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7RUFDckMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztFQUNyQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0VBQ3JDLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQzs7RUFFdEM7O0VBRUEsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUM7RUFDdkQsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUM7RUFDdkQsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUM7O0VBRXZELEVBQUUsT0FBTyxJQUFJLENBQUM7O0VBRWQsRUFBRTs7RUFFRixDQUFD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Q0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztFQUNuQyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7RUFFbkMsRUFBRSxPQUFPLElBQUksQ0FBQzs7RUFFZCxFQUFFOztFQUVGLENBQUMsR0FBRyxFQUFFLFdBQVcsQ0FBQyxHQUFHOztFQUVyQixFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztFQUNuQyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztFQUNuQyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7RUFFbkMsRUFBRSxPQUFPLElBQUksQ0FBQzs7RUFFZCxFQUFFOztFQUVGLENBQUMsS0FBSyxFQUFFLFdBQVcsR0FBRyxFQUFFLEdBQUcsR0FBRzs7RUFFOUI7O0VBRUEsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7RUFDeEQsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7RUFDeEQsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLElB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RUFDWixFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0VBRVosRUFBRSxDQUFDOztFQUVILENBQUMsS0FBSyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRzs7RUFFN0IsRUFBRSxPQUFPLENBQUMsS0FBSyxFQUFFLCtFQUErRSxFQUFFLENBQUM7O0VBRW5HLEVBQUU7O0VBRUYsQ0FBQzs7RUFFRCxNQUFNLENBQUMsTUFBTSxFQUFFQSxTQUFPLENBQUMsU0FBUyxFQUFFOztFQUVsQyxDQUFDLFNBQVMsRUFBRSxJQUFJOztFQUVoQixDQUFDLEdBQUcsRUFBRSxXQUFXLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRzs7RUFFbEcsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDOztFQUV6QixFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUM7RUFDOUQsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDO0VBQzlELEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQztFQUMvRCxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUM7O0VBRS9ELEVBQUUsT0FBTyxJQUFJLENBQUM7O0VBRWQsRUFBRTs7RUFFRixDQUFDLFFBQVEsRUFBRSxZQUFZOztFQUV2QixFQUFFLElBQUksQ0FBQyxHQUFHOztFQUVWLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztFQUNiLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztFQUNiLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztFQUNiLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7RUFFYixHQUFHLENBQUM7O0VBRUosRUFBRSxPQUFPLElBQUksQ0FBQzs7RUFFZCxFQUFFOztFQUVGLENBQUMsS0FBSyxFQUFFLFlBQVk7O0VBRXBCLEVBQUUsT0FBTyxJQUFJQSxTQUFPLEVBQUUsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDOztFQUVsRCxFQUFFOztFQUVGLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxHQUFHOztFQUV0QixFQUFFLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7RUFDekIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDOztFQUV0QixFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7RUFDN0UsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0VBQzdFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQztFQUNqRixFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7O0VBRXJGLEVBQUUsT0FBTyxJQUFJLENBQUM7O0VBRWQsRUFBRTs7RUFFRixDQUFDLFlBQVksRUFBRSxXQUFXLENBQUMsR0FBRzs7RUFF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Q0FBQztFQUMzQyxFQUFFLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0VBRTNDLEVBQUUsS0FBSyxLQUFLLENBQUMsS0FBSyxLQUFLLEtBQUssR0FBRzs7RUFFL0IsR0FBRyxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDOztFQUV0RCxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ25CLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNyQixHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7O0VBRWYsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7RUFDekIsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7RUFDekIsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDOztFQUVyQixHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztFQUN6QixHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztFQUN6QixHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDOztFQUVwQixHQUFHLE1BQU0sS0FBSyxLQUFLLENBQUMsS0FBSyxLQUFLLEtBQUssR0FBRzs7RUFFdEMsR0FBRyxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDOztFQUV0RCxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztFQUN6QixHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztFQUN6QixHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDOztFQUVuQixHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ25CLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDbkIsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7O0VBRWpCLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0VBQ3pCLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0VBQ3pCLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7O0VBRXBCLEdBQUcsTUFBTSxLQUFLLEtBQUssQ0FBQyxLQUFLLEtBQUssS0FBSyxHQUFHOztFQUV0QyxHQUFHLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7O0VBRXRELEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0VBQ3pCLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNyQixHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQzs7RUFFekIsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7RUFDekIsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNuQixHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQzs7RUFFekIsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ3JCLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztFQUNmLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7O0VBRXBCLEdBQUcsTUFBTSxLQUFLLEtBQUssQ0FBQyxLQUFLLEtBQUssS0FBSyxHQUFHOztFQUV0QyxHQUFHLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7O0VBRXRELEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDbkIsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7RUFDekIsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7O0VBRXpCLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDbkIsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7RUFDekIsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7O0VBRXpCLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0VBQ2pCLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDbkIsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7RUFFcEIsR0FBRyxNQUFNLEtBQUssS0FBSyxDQUFDLEtBQUssS0FBSyxLQUFLLEdBQUc7O0VBRXRDLEdBQUcsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7RUFFdEQsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNuQixHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztFQUN6QixHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQzs7RUFFekIsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0VBQ2YsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNuQixHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7O0VBRXJCLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNyQixHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztFQUN6QixHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQzs7RUFFMUIsR0FBRyxNQUFNLEtBQUssS0FBSyxDQUFDLEtBQUssS0FBSyxLQUFLLEdBQUc7O0VBRXRDLEdBQUcsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQzs7RUFFdEQsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUNuQixHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztFQUNqQixHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDOztFQUVuQixHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztFQUN6QixHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ25CLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDOztFQUV6QixHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztFQUN6QixHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ25CLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDOztFQUUxQixHQUFHOztFQUVIO0VBQ0EsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0VBQ2QsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0VBQ2QsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDOztFQUVmO0VBQ0EsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0VBQ2YsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0VBQ2YsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0VBQ2YsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDOztFQUVmLEVBQUUsT0FBTyxJQUFJLENBQUM7O0VBRWQsRUFBRTs7RUFFRixDQUFDLDBCQUEwQixFQUFFLFdBQVcsQ0FBQyxHQUFHOztFQUU1QyxFQUFFLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7O0VBRXpCLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztFQUM3QyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDekMsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0VBQzVDLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztFQUM1QyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7O0VBRTVDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUM7RUFDNUIsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztFQUNwQixFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDOztFQUVwQixFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0VBQ3BCLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUM7RUFDNUIsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQzs7RUFFcEIsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztFQUNwQixFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0VBQ3BCLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUM7O0VBRTdCO0VBQ0EsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0VBQ2QsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0VBQ2QsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDOztFQUVmO0VBQ0EsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0VBQ2YsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFF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QU8sSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7RUFFMUMsRUFBRTs7RUFFRixDQUFDLGdCQUFnQixFQUFFLFdBQVcsQ0FBQyxFQUFFLENBQUMsR0FBRzs7RUFFckMsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDO0VBQ3RCLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQztFQUN0QixFQUFFLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7O0VBRXpCLEVBQUUsSUFBSSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO0VBQ2xFLEVBQUUsSUFBSSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO0VBQ2xFLEVBQUUsSUFBSSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO0VBQ25FLEVBQUUsSUFBSSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDOztFQUVuRSxFQUFFLElBQUksR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQztFQUNsRSxFQUFFLElBQUksR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQztFQUNsRSxFQUFFLElBQUksR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQztFQUNuRSxFQUFFLElBQUksR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQzs7RUFFbkUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztFQUMxRCxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0VBQzFELEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7RUFDMUQsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQzs7RUFFM0QsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztFQUMxRCxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0VBQzFELEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7RUFDMUQsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQzs7RUFFM0QsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztFQUMxRCxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0VBQzFELEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7RUFDM0QsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQzs7RUFFM0QsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztFQUMxRCxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0VBQzFELEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7RUFDM0QsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQzs7RUFFM0QsRUFBRSxPQUFPLElBQUksQ0FBQzs7RUFFZCxFQUFFOztFQUVGLENBQUMsY0FBYyxFQUFFLFdBQVcsQ0FBQyxHQUFHOztFQUVoQyxFQUFFLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7O0VBRXpCLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztFQUMxRCxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7RUFDMUQsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO0VBQzNELEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQzs7RUFFM0QsRUFBRSxPQUFPLElBQUksQ0FBQzs7RUFFZCxFQUFFOztFQUVGLENBQUMsc0JBQXNCLEVBQUUsWUFBWTs7RUFFckMsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJQSxTQUFPLEVBQUUsQ0FBQzs7RUFFekIsRUFBRSxPQUFPLFNBQVMsc0JBQXNCLEVBQUUsU0FBUyxHQUFHOztFQUV0RCxHQUFHLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0VBRXZELElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDO0VBQy9CLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDO0VBQy9CLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDOztFQUUvQixJQUFJLEVBQUUsQ0FBQyxZQUFZLEVBQUUsSUFBSSxFQUFFLENBQUM7O0VBRTVCLElBQUksU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7RUFFNUMsSUFBSTs7RUFFSixHQUFHLE9BQU8sU0FBUyxDQUFDOztFQUVwQixHQUFHLENBQUM7O0VBRUosRUFBRSxFQUFFOztFQUVKLENBQUMsV0FBVyxFQUFFLFlBQVk7O0VBRTFCLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQzs7RUFFekIsRUFBRSxJQUFJLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7RUFDbEUsRUFBRSxJQUFJLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7RUFDbEUsRUFBRSxJQUFJLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7RUFDbkUsRUFBRSxJQUFJLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7O0VBRW5FO0VBQ0E7O0VBRUEsRUFBRTtFQUNGLEdBQUcsR0FBRztFQUNOLElBQUksRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7RUFDckIsT0FBTyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7RUFDdEIsT0FBTyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7RUFDdEIsT0FBTyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7RUFDdEIsT0FBTyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7RUFDdEIsT0FBTyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7RUFDdEIsSUFBSTtFQUNKLEdBQUcsR0FBRztFQUNOLElBQUksRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7RUFDckIsT0FBTyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7RUFDdEIsT0FBTyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7RUFDdEIsT0FBTyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7RUFDdEIsT0FBTyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7RUFDdEIsT0FBTyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7RUFDdEIsSUFBSTtFQUNKLEdBQUcsR0FBRztFQUNOLElBQUksRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7RUFDckIsT0FBTyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7RUFDdEIsT0FBTyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7RUFDdEIsT0FBTyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7RUFDdEIsT0FBTyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7RUFDdEIsT0FBTyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7RUFDdEIsSUFBSTtFQUNKLEdBQUcsR0FBRztFQUNOLElBQUksRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7RUFDckIsT0FBTyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7RUFDdEIsT0FBTyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7RUFDdEIsT0FBTyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7RUFDdEIsT0FBTyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7RUFDdEIsT0FBTyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7RUFDdEIsSUFBSTs7RUFFSixJQUFJOztFQUVKLEVBQUU7O0VBRUYsQ0FBQyxTQUFTLEVBQUUsWUFBWTs7RUFFeEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO0VBQ3pCLEVBQUUsSUFBSSxHQUFHLENBQUM7O0VBRVYsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUM7RUFDbEQsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUM7RUFDbEQsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUM7O0VBRWxELEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDO0VBQ3BELEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDO0VBQ3BELEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDOztFQUV0RCxFQUFFLE9BQU8sSUFBSSxDQUFDOztFQUVkLEVBQUU7O0VBRUYsQ0FBQyxXQUFXLEVBQUUsV0FBVyxDQUFDLEdBQUc7O0VBRTdCLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQzs7RUFFekIsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUNqQixFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2pCLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7O0VBRWpCLEVBQUUsT0FBTyxJQUFJLENBQUM7O0VBRWQsRUFBRTs7RUFFRixDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMsRUFBRSxpQkFBaUIsR0FBRzs7RUFFL0M7RUFDQSxFQUFFLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRO0VBQ3hCLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFROztFQUVsQixHQUFHLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFO0VBQzdELEdBQUcsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUU7RUFDN0QsR0FBRyxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRTtFQUMvRCxHQUFHLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFOztFQUVqRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7RUFDbEgsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0VBQ2xILEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRztFQUNsSCxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQzs7RUFFbkgsRUFBRSxJQUFJLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDOztFQUUxRCxFQUFFLEtBQUssR0FBRyxLQUFLLENBQUMsR0FBRzs7RUFFbkIsR0FBRyxJQUFJLEdBQUcsR0FBRyxtRUFBbUUsQ0FBQzs7RUFFakYsR0FBRyxLQUFLLGlCQUFpQixLQUFLLElBQUksR0FBRzs7RUFFckMsSUFBSSxNQUFNLElBQUksS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDOztFQUUzQixJQUFJLE1BQU07O0VBRVYsSUFBSSxPQUFPLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDOztFQUV4QixJQUFJOztFQUVKLEdBQUcsT0FBTyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7O0VBRTFCLEdBQUc7O0VBRUgsRUFBRSxJQUFJLE1BQU0sR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDOztFQUV2QixFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsTUFBTSxDQUFDO0VBQ3pCLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEtBQUssTUFBTSxDQUFDO0VBQ25JLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEtBQUssTUFBTSxDQUFDO0VBQ25JLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEtBQUssTUFBTSxDQUFDOztFQUVuSSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsTUFBTSxDQUFDO0VBQ3pCLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEtBQUssTUFBTSxDQUFDO0VBQ25JLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEtBQUssTUFBTSxDQUFDO0VBQ25JLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEtBQUssTUFBTSxDQUFDOztFQUVuSSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsTUFBTSxDQUFDO0VBQ3pCLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEtBQUssTUFBTSxDQUFDO0VBQ25JLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEtBQUssTUFBTSxDQUFDO0VBQ3BJLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEtBQUssTUFBTSxDQUFDOztFQUVwSSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLEdBQUcsTUFBTSxDQUFDO0VBQzFCLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEtBQUssTUFBTSxDQUFDO0VBQ3BJLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEtBQUssTUFBTSxDQUFDO0VBQ3BJLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEtBQUssTUFBTSxDQUFDOztFQUVwSSxFQUFFLE9BQU8sSUFBSSxDQUFDOztFQUVkLEVBQUU7O0VBRUYsQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLEdBQUc7O0VBRXZCLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztFQUN6QixFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7O0VBRWhDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0VBQzNDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0VBQzNDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO0VBQzVDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFF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QU0sQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztFQUM3RCxHQUFHLElBQUksRUFBRSxHQUFHLE1BQU0sQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQzs7RUFFOUQ7RUFDQSxHQUFHLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztFQUNoQyxHQUFHLEtBQUssR0FBRyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUM7O0VBRTVCLEdBQUcsUUFBUSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7RUFDekIsR0FBRyxRQUFRLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQztFQUN6QixHQUFHLFFBQVEsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDOztFQUV6QjtFQUNBLEdBQUcsTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQzs7RUFFdkIsR0FBRyxJQUFJLEtBQUssR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0VBQ3RCLEdBQUcsSUFBSSxLQUFLLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztFQUN0QixHQUFHLElBQUksS0FBSyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7O0VBRXRCLEdBQUcsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUsSUFBSSxLQUFLLENBQUM7RUFDakMsR0FBRyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxJQUFJLEtBQUssQ0FBQztFQUNqQyxHQUFHLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFLElBQUksS0FBSyxDQUFDOztFQUVqQyxHQUFHLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFLElBQUksS0FBSyxDQUFDO0VBQ2pDLEdBQUcsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUsSUFBSSxLQUFLLENBQUM7RUFDakMsR0FBRyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxJQUFJLEtBQUssQ0FBQzs7RUFFakMsR0FBRyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxJQUFJLEtBQUssQ0FBQztFQUNqQyxHQUFHLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFLElBQUksS0FBSyxDQUFDO0VBQ2pDLEdBQUcsTUFBTSxDQUFDLFFBQVEsRUFBRSxFQUFFLEVBQUUsSUFBSSxLQUFLLENBQUM7O0VBRWxDLEdBQUcsVUFBVSxDQUFDLHFCQUFxQixFQUFFLE1BQU0sRUFBRSxDQUFDOztFQUU5QyxHQUFHLEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDO0VBQ2hCLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7RUFDaEIsR0FBRyxLQUFLLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQzs7RUFFaEIsR0FBRyxPQUFPLElBQUksQ0FBQzs7RUFFZixHQUFHLENBQUM7O0VBRUosRUFBRSxFQUFFOztFQUVKLENBQUMsZUFBZSxFQUFFLFdBQVcsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLEdBQUc7O0VBRW5FLEVBQUUsS0FBSyxHQUFHLEtBQUssU0FBUyxHQUFHOztFQUUzQixHQUFHLE9BQU8sQ0FBQyxJQUFJLEVBQUUsc0dBQXNHLEVBQUUsQ0FBQzs7RUFFMUgsR0FBRzs7RUFFSCxFQUFFLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7RUFDekIsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxLQUFLLEtBQUssR0FBRyxJQUFJLEVBQUUsQ0FBQztFQUN0QyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLEtBQUssR0FBRyxHQUFHLE1BQU0sRUFBRSxDQUFDOztFQUV0QyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsS0FBSyxHQUFHLElBQUksT0FBTyxLQUFLLEdBQUcsSUFBSSxFQUFFLENBQUM7RUFDOUMsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxNQUFNLE9BQU8sR0FBRyxHQUFHLE1BQU0sRUFBRSxDQUFDO0VBQzlDLEVBQUUsSUFBSSxDQUFDLEdBQUcsSUFBSSxHQUFHLEdBQUcsSUFBSSxFQUFFLEtBQUssR0FBRyxHQUFHLElBQUksRUFBRSxDQUFDO0VBQzVDLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksS0FBSyxHQUFHLEdBQUcsSUFBSSxFQUFFLENBQUM7O0VBRTVDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztFQUN0RCxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7RUFDdEQsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0VBQ3ZELEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLENB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Q2hDLEVBQUUsS0FBSyxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7RUFDaEMsRUFBRSxLQUFLLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7RUFFaEMsRUFBRSxLQUFLLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztFQUNoQyxFQUFFLEtBQUssRUFBRSxNQUFNLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0VBQ2hDLEVBQUUsS0FBSyxFQUFFLE1BQU0sR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7RUFDbEMsRUFBRSxLQUFLLEVBQUUsTUFBTSxHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQzs7RUFFbEMsRUFBRSxLQUFLLEVBQUUsTUFBTSxHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQztFQUNsQyxFQUFFLEtBQUssRUFBRSxNQUFNLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO0VBQ2xDLEVBQUUsS0FBSyxFQUFFLE1BQU0sR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7RUFDbEMsRUFBRSxLQUFLLEVBQUUsTUFBTSxHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQzs7RUFFbEMsRUFBRSxPQUFPLEtBQUssQ0FBQzs7RUFFZixFQUFFOztFQUVGLENBQUMsRUFBRSxDQUFDOztFQUVKO0VBQ0E7RUFDQTs7RUFFQSxTQUFTb1csYUFBVyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLFNB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Q0FBQyxFQUFFO0VBQzlELFNBQVNDLFlBQVUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7O0VBRTlEOztFQUVBLFNBQVNDLGFBQVcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHOztFQUU5QixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLEdBQUcsRUFBRSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDO0VBQ3hELE1BQU0sRUFBRSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDOztFQUUxQyxDQUFDOztFQUVELFNBQVNDLGFBQVcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHOztFQUU5QixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTO0VBQ3ZCLEVBQUUsRUFBRSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7RUFDM0MsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssU0FBUztFQUM1QixFQUFFLEVBQUUsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0VBQzNDO0VBQ0EsRUFBRSxFQUFFLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0VBRWhDLENBQUM7O0VBRUQsU0FBU0MsYUFBVyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUc7O0VBRTlCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMs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O0VBRWQsRUFBRTs7RUFFRixDQUFDLFNBQVMsRUFBRSxXQUFXLENBQUMsR0FBRzs7RUFFM0IsRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztFQUNkLEVBQUUsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7RUFDZCxFQUFFLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDOztFQUVkLEVBQUUsT0FBTyxJQUFJLENBQUM7O0VBRWQsRUFBRTs7RUFFRixDQUFDLEdBQUcsRUFBRSxVQUFVLEtBQUssR0FBRzs7RUFFeEIsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO0VBQzNDLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztFQUMzQyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7O0VBRTNDLEVBQUUsT0FBTyxJQUFJLENBQUM7O0VBRWQsRUFBRTs7RUFFRixDQUFDLFFBQVEsRUFBRSxXQUFXLEtBQUssR0FBRzs7RUFFOUIsRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUM7RUFDcEIsRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUM7RUFDcEIsRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUM7O0VBRXBCLEVBQUUsT0FBTyxJQUFJLENBQUM7O0VBRWQsRUFBRTs7RUFFRixDQUFDLGNBQWMsRUFBRSxXQUFXLENBQUMsR0FBRzs7RUFFaEMsRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMs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LEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ3JELEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUssR0FBRyxJQUFJLENBQUM7O0VBRS9ELEVBQUU7O0VBRUYsQ0FBQyxXQUFXLEVBQUUsV0FBVyxHQUFHLEdBQUc7O0VBRS9CLEVBQUUsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7RUFDM0QsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQzs7RUFFdEQsRUFBRTs7RUFFRixDQUFDLFlBQVksRUFBRSxXQUFXLEtBQUssRUFBRSxjQUFjLEdBQUc7O0VBRWxEO0VBQ0E7O0VBRUEsRUFBRSxJQUFJLE1BQU0sR0FBRyxjQUFjLElBQUksSUFBSUEsU0FBTyxFQUFFLENBQUM7O0VBRS9DLEVBQUUsT0FBTyxNQUFNLENBQUMsR0FBRztFQUNuQixHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTtFQUN6RCxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTtFQUN6RCxHQUFHLENBQUM7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QUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztFQUNyQyxHQUFHLEdBQUcsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQzs7RUFFckMsR0FBRzs7RUFFSCxFQUFFLEtBQUssS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHOztFQUU1QixHQUFHLEdBQUcsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztFQUN0QyxHQUFHLEdBQUcsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQzs7RUFFdEMsR0FBRyxNQUFNOztFQUVULEdBQUcsR0FBRyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0VBQ3RDLEdBQUcsR0FBRyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDOztFQUV0QyxHQUFHOztFQUVILEVBQUUsS0FBSyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUc7O0VBRTVCLEdBQUcsR0FBRyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0VBQ3RDLEdBQUcsR0FBRyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDOztFQUV0QyxHQUFHLE1BQU07O0VBRVQsR0FBRyxHQUFHLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7RUFDdEMsR0FBRyxHQUFHLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcs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QUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztFQUMxRCxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztFQUMxRCxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7RUFFMUQsRUFBRSxPQUFPLElBQUksQ0FBQzs7RUFFZCxFQUFFOztFQUVGLENBQUMsY0FBYyxFQUFFLFdBQVcsQ0FBQyxHQUFHOztFQUVoQyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUM7O0VBRXRCLEVBQUUsSUFBSSxDQUFDLEdBQUc7O0VBRVYsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLEVBQUU7RUFDN0IsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLEVBQUU7RUFDN0IsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUU7O0VBRTdCLEdBQUcsQ0FBQzs7RUFFSixFQUFFLE9BQU8sSUFBSSxDQUFDOztFQUVkLEVBQUU7O0VBRUYsQ0FBQyxzQkFBc0IsRUFBRSxZQUFZOztFQUVyQyxFQUFFLElBQUksRUFBRSxHQUFHLElBQUkzQyxTQUFPLEVBQUUsQ0FBQzs7RUFFekIsRUFBRSxPQUFPLFNBQVMsc0JBQXNCLEVBQUUsU0FBUyxHQUFHOztFQUV0RCxHQUFHLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0VBRXZELElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDO0VBQy9CLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDO0VBQy9CLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDOztFQUUvQixJQUFJLEVBQUUsQ0FBQyxZQUFZLEVBQUUsSUFBSSxFQUFFLENBQUM7O0VBRTVCLElBQUksU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7RUFFNUMsSUFBSTs7RUFFSixHQUFHLE9BQU8sU0FBUyxDQUFDOztFQUVwQixHQUFHLENBQUM7O0VBRUosRUFBRSxFQUFFOztFQUVKLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxHQUFHOztFQUUxQixFQUFFLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQzs7RUFFMUMsRUFBRTs7RUFFRixDQUFDLFdBQVcsRUFBRSxXQUFXLENBQUMsR0FBRzs7RUFFN0IsRUFBRSxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUM7O0VBRTFDLEVBQUU7O0VBRUYsQ0FBQyxnQkFBZ0IsRUFBRSxXQUFXLENBQUMsRUFBRSxDQUFDLEdBQUc7O0VBRXJDLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQztFQUN0QixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUM7RUFDdEIsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDOztFQUV6QixFQUFFLElBQUksR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7RUFDbEQsRUFBRSxJQUFJLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0VBQ2xELEVBQUUsSUFBSSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7RUFFbEQsRUFBRSxJQUFJLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0VBQ2xELEVBQUUsSUFBSSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztFQUNsRCxFQUFFLElBQUksR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0VBRWxELEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0VBQzlDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0VBQzlDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDOztFQUU5QyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztFQUM5QyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztFQUM5QyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQzs7RUFFOUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7RUFDOUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7RUFDOUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7O0VBRTlDLEVBQUUsT0FBTyxJQUFJLENBQUM7O0VBRWQsRUFBRTs7RUFFRixDQUFDLGNBQWMsRUFBRSxXQUFXLENBQUMsR0FBRzs7RUFFaEMsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDOztFQUV6QixFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztFQUMzQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztFQUMzQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQzs7RUFFM0MsRUFBRSxPQUFPLElBQUksQ0FBQzs7RUFFZCxFQUFFOztFQUVGLENBQUMsV0FBVyxFQUFFLFlBQVk7O0VBRTFCLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQzs7RUFFekIsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRTtFQUMzQyxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRTtFQUN4QyxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxF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R0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsS0FBSyxNQUFNLENBQUM7O0VBRS9DLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxNQUFNLENBQUM7RUFDekIsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEtBQUssTUFBTSxDQUFDO0VBQy9DLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxLQUFLLE1BQU0sQ0FBQzs7RUFFL0MsRUFBRSxPQUFPLElBQUksQ0FBQzs7RUFFZCxFQUFFOztFQUVGLENBQUMsU0FBUyxFQUFFLFlBQVk7O0VBRXhCLEVBQUUsSUFBSSxHQUFHLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7O0VBRTdCLEVBQUUsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDO0VBQzlDLEVBQUUsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDO0VBQzlDLEVBQUUsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDOztFQUU5QyxFQUFFLE9BQU8sSUFBSSxDQUFDOztFQUVkLEVBQUU7O0VBRUYsQ0FBQyxlQUFlLEVB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QUUsSUFBSSxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDOztFQUV6RSxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxhQUFhLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLElBQUksR0FBRyxHQUFHLEVBQUUsSUFBSSxHQUFHLElBQUksRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDO0VBQ3pGLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLGFBQWEsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxHQUFHLEdBQUcsRUFBRSxJQUFJLEdBQUcsSUFBSSxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUM7RUFDekYsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLEdBQUcsR0FBRyxFQUFFLElBQUksR0FBRyxJQUFJLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQztFQUN6RixFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxhQUFhLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLElBQUksR0FBRyxHQUFHLEVBQUUsSUFBSSxHQUFHLElBQUksRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDO0VBQ3pGLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLGFBQWEsRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsSUFBSSxHQUFHLElBQUksRUFBRSxJQUFJLEdBQUcsSUFBSSxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUM7RUFDMUYsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxJQUFJLEdBQUcs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LENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztFQUN0RCxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0VBQ3RELElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7RUFDdEQsSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztFQUN0RCxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0VBQ3RELElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7O0VBRXRELElBQUksSUFBSSxFQUFFLEdBQUcsS0FBSyxDQUFDLGVBQWUsRUFBRSxFQUFFLEVBQUUsQ0FBQztFQUN6QyxJQUFJLElBQUksRUFBRSxHQUFHLEtBQUssQ0FBQyxlQUFlLEVBQUUsRUFBRSxFQUFFLENBQUM7O0VBRXpDOztFQUVBLElBQUksS0FBSyxFQUFFLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUc7O0VBRTVCLEtBQUssT0FBTyxLQUFLLENBQUM7O0VBRWxCLEtBQUs7O0VBRUwsSUFBSTs7RUFFSixHQUFHLE9BQU8sSUFBSSxDQUFDOztFQUVmLEdBQUcsQ0FBQzs7RUFFSixFQUFFLEVBQUU7O0VBRUosQ0FBQyxhQUFhLEVBQUUsV0FBVyxLQUFLLEdBQUc7O0VBRW5DLEVBQUUsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQzs7RUFFM0IsRUFBRSxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHOztFQUVqQyxHQUFHLEtBQUssTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLGVBQWUsRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLEdBQUc7O0VBRW5ELElBQUksT0FBTyxLQUFLLENBQUM7O0VBRWpCLElBQUk7O0VBRUosR0FBRzs7RUFFSCxFQUFFLE9BQU8sSUFBSSxDQUFDOztFQUVkLEVBQUU7O0VBRUYsQ0FBQyxFQUFFLENBQUM7O0VBRUo7RUFDQTtFQUNBO0VBQ0E7O0VBRUEsU0FBU2k0RyxnQkFBYyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFlBQVksR0FBRzs7RUFFdEUsQ0FBQyxJQUFJLEdBQUcsR0FBRyxTQUFTLENBQUMsT0FBTztFQUM1QixFQUFFLE1BQU0sR0FBRyxTQUFTLENBQUMsS0FBSztFQUMxQixFQUFFLFFBQVEsR0FBRyxJQUFJL3BHLFNBQU8sRUFBRTtFQUMxQixFQUFFLGlCQUFpQixHQUFHLElBQUl0YyxTQUFPLEVBQUU7O0VBRW5DLEVBQUUsYUFBYSxHQUFHLE9BQU8sQ0FBQyxPQUFPOztFQUVqQyxFQUFFLGNBQWMsR0FBRyxJQUFJN0QsU0FBTyxFQUFFO0VBQ2hDLEVBQUUsaUJBQWlCLEdBQUcsSUFBSUEsU0FBTyxFQUFFLFlBQVksQ0FBQyxjQUFjLEVBQUUsWUFBWSxDQUFDLGNBQWMsRUFBRTs7RUFFN0YsRUFBRSxXQUFXLEdBQUcsSUFBSWlTLFNBQU8sRUFBRTtFQUM3QixFQUFFLG1CQUFtQixHQUFHLElBQUlBLFNBQU8sRUFBRTs7RUFFckMsRUFBRSxhQUFhLEdBQUcsQ0FBQztFQUNuQixFQUFFLGFBQWEsR0FBRyxDQUFDOztFQUVuQixFQUFFLHlCQUF5QixHQUFHLEVBQUUsYUFBYSxHQUFHLGFBQWEsS0FBSyxDQUFDOztFQUVuRSxFQUFFLGVBQWUsR0FBRyxJQUFJLEtBQUssRUFBRSx5QkFBeUIsRUFBRTtFQUMxRCxFQUFFLGtCQUFrQixHQUFHLElBQUksS0FBSyxFQUFFLHlCQUF5QixFQUFFOztFQUU3RCxFQUFFLGNBQWMsR0FBRyxFQUFFLENBQUM7O0VBRXRCLENBQUMsSUFBSSxjQUFjLEdBQUc7RUFDdEIsRUFBRSxJQUFJQSxTQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxJQUFJQSxTQUFPLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLElBQUlBLFNBQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtFQUMxRSxFQUFFLElBQUlBLFNBQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsSUFBSUEsU0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsSUFBSUEsU0FBTyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7RUFDNUUsRUFBRSxDQUFDOztFQUVILENBQUMsSUFBSSxPQUFPLEdBQUc7RUFDZixFQUFFLElBQUlBLFNBQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLElBQUlBLFNBQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLElBQUlBLFNBQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRTtFQUN4RSxFQUFFLElBQUlBLFNBQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLElBQUlBLFNBQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLElBQUlBLFNBQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFO0VBQzFFLEVBQUUsQ0FBQzs7RUFFSCxDQUFDLElBQUksZUFBZSxHQUFHO0VBQ3ZCLEVBQUUsSUFBSXdHLFNBQU8sRUFBRSxFQUFFLElBQUlBLFNBQU8sRUFBRSxFQUFFLElBQUlBLFNBQU8sRUFBRTtFQUM3QyxFQUFFLElBQUlBLFNBQU8sRUFBRSxFQUFFLElBQUlBLFNBQU8sRUFBRSxFQUFFLElBQUlBLFNBQU8sRUFBRTtFQUM3QyxFQUFFLENBQUM7O0VBRUg7O0VBRUEsQ0FBQyxJQUFJLHFCQUFxQixHQUFHLElBQUk0cUMsbUJBQWlCLEVBQUUsQ0FBQztFQUNyRCxDQUFDLHFCQUFxQixDQUFDLFlBQVksR0FBR3dHLGtCQUFnQixDQUFDO0VBQ3ZELENBQUMscUJBQXFCLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQzs7RUFFdkMsQ0FBQyxJQUFJLGNBQWMsR0FBR3g0QixXQUFTLEVBQUUsY0FBYyxFQUFFLENBQUM7RUFDbEQsQ0FBQyxJQUFJLGdCQUFnQixHQUFHM0IsZUFBYSxDQUFDLEtBQUssRUFBRSxjQUFjLENBQUMsUUFBUSxFQUFFLENBQUM7O0VBRXZFLENBQUMsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxLQUFLLHlCQUF5QixFQUFFLEdBQUcsQ0FBQyxHQUFHOztFQUUxRCxFQUFFLElBQUksV0FBVyxHQUFHLEVBQUUsQ0FBQyxHQUFHLGFBQWEsT0FBTyxDQUFDLENBQUM7RUFDaEQsRUFBRSxJQUFJLFdBQVcsR0FBRyxFQUFFLENBQUMsR0FBRyxhQUFhLE9BQU8sQ0FBQyxDQUFDOztFQUVoRCxFQUFFLElBQUksYUFBYSxHQUFHLHFCQUFxQixDQUFDLEtBQUssRUFBRSxDQUFDO0VBQ3BELEVBQUUsYUFBYSxDQUFDLFlBQVksR0FBRyxXQUFXLENBQUM7RUFDM0MsRUFBRSxhQUFhLENBQUMsUUFBUSxHQUFHLFdBQVcsQ0FBQzs7RUFFdkMsRUFBRSxlQUFlLEVBQUUsQ0FBQyxFQUFFLEdBQUcsYUFBYSxDQUFDOztFQUV2QyxFQUFFLElBQUksZ0JBQWdCLEdBQUcsSUFBSSthLGdCQUFjLEVBQUU7RUFDN0MsR0FBRyxPQUFPLEVBQUU7RUFDWixJQUFJLGVBQWUsRUFBRSxFQUFFO0VBQ3ZCLElBQUk7RUFDSixHQUFHLFFBQVEsRUFBRSxnQkFBZ0I7RUFDN0IsR0FBRyxZQUFZLEVBQUUsY0FBYyxDQUFDLFlBQVk7RUFDNUMsR0FBRyxjQUFjLEVBQUUsY0FBYyxDQUFDLGNBQWM7RUFDaEQsR0FBRyxZQUFZLEVBQUUsV0FBVztFQUM1QixHQUFHLFFBQVEsRUFBRSxXQUFXO0VBQ3hCLEdBQUcsUUFBUSxFQUFFLElBQUk7RUFDakIsR0FBRyxFQUFFLENBQUM7O0VBRU4sRUFBRSxrQkFBa0IsRUFBRSxDQUFDLEVBQUUsR0FBRyxnQkFBZ0IsQ0FBQzs7RUFFN0MsRUFBRTs7RUFFRjs7RUFFQSxDQUFDLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQzs7RUFFbEIsQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQzs7RUFFdEIsQ0FBQyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztFQUN4QixDQUFDLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDOztFQUUxQixDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUd5VSxjQUFZLENBQUM7O0VBRTFCLENBQUMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQztFQUNoQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7O0VBRS9CLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxXQUFXLEtBQUssRUFBRSxNQUFNLEdBQUc7O0VBRTFDLEVBQUUsS0FBSyxLQUFLLENBQUMsT0FBTyxLQUFLLEtBQUssR0FBRyxPQUFPO0VBQ3hDLEVBQUUsS0FBSyxLQUFLLENBQUMsVUFBVSxLQUFLLEtBQUssSUFBSSxLQUFLLENBQUMsV0FBVyxLQUFLLEtBQUssR0FBRyxPQUFPOztFQUUxRSxFQUFFLEtBQUssYUFBYSxDQUFDLE1BQU0sS0FBSyxDQUFDLEdBQUcsT0FBTzs7RUFFM0M7RUFDQSxFQUFFLE1BQU0sQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDO0VBQzlCLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0VBQzlDLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDO0VBQ3ZDLEVBQUUsTUFBTSxDQUFDLGNBQWMsRUFBRSxLQUFLLEVBQUUsQ0FBQzs7RUFFakM7O0VBRUEsRUFBRSxJQUFJLFNBQVMsRUFBRSxZQUFZLENBQUM7O0VBRTlCLEVBQUUsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLGFBQWEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRzs7RUFFN0QsR0FBRyxJQUFJLEtBQUssR0FBRyxhQUFhLEVBQUUsQ0FBQyxFQUFFLENBQUM7RUFDbEMsR0FBRyxJQUFJLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDOztFQUU3QixHQUFHLEtBQUssTUFBTSxLQUFLLFNBQVMsR0FBRzs7RUFFL0IsSUFBSSxPQUFPLENBQUMsSUFBSSxFQUFFLHVCQUF1QixFQUFFLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxDQUFDO0VBQ3JFLElBQUksU0FBUzs7RUFFYixJQUFJOztFQUVKLEdBQUcsSUFBSSxZQUFZLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztFQUNwQyxHQUFHLElBQUksWUFBWSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7O0VBRXBDLEdBQUcsbUJBQW1CLENBQUMscUJBQXFCLEVBQUUsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO0VBQ2xFLEdBQUcsWUFBWSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsbUJBQW1CLEVBQUUsQ0FBQzs7RUFFckQsR0FBRyxjQUFjLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztFQUN6QyxHQUFHLGNBQWMsQ0FBQyxHQUFHLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQzs7RUFFM0MsR0FBRyxLQUFLLEtBQUssSUFBSSxLQUFLLENBQUMsWUFBWSxHQUFHOztFQUV0QyxJQUFJLFNBQVMsR0FBRyxDQUFDLENBQUM7RUFDbEIsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDOztFQUV4QixJQUFJLElBQUksT0FBTyxHQUFHLGNBQWMsQ0FBQyxDQUFDLENBQUM7RUFDbkMsSUFBSSxJQUFJLFFBQVEsR0FBRyxjQUFjLENBQUMsQ0FBQyxDQUFDOztFQUVwQztFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUE7RUFDQSxJQUFJLGVBQWUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsT0FBTyxHQUFHLENBQUMsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxDQUFDO0VBQ3pFO0VBQ0EsSUFBSSxlQUFlLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxDQUFDO0VBQy9EO0VBQ0EsSUFBSSxlQUFlLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLE9BQU8sR0FBRyxDQUFDLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsQ0FBQztFQUN6RTtFQUNBLElBQUksZUFBZSxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsQ0FBQztFQUNyRTtFQUNBLElBQUksZUFBZSxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxPQUFPLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLENBQUM7RUFDbEU7RUFDQSxJQUFJLGVBQWUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLENBQUM7O0VBRTlELElBQUksY0FBYyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUM7RUFDNUIsSUFBSSxjQUFjLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQzs7O0VBRzVCO0VBQ0E7O0VBRUEsSUFBSSxZQUFZLENBQUMsZUFBZSxFQUFFLEVBQUUsbUJBQW1CLENBQUMsQ0FBQyxFQUFFLEVBQUUsbUJBQW1CLENBQUMsQ0FBQyxFQUFFLEVBQUUsbUJBQW1CLENBQUMsQ0FBQyxFQUFFLENBQUM7O0VBRTlHLElBQUksTUFBTTs7RUFFVixJQUFJLFNBQVMsR0FBRyxDQUFDLENBQUM7RUFDbEIsSUFBSSxZQUFZLEdBQUcsS0FBSyxDQUFDOztFQUV6QixJQUFJLFdBQVcsQ0FBQyxxQkFBcUIsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDO0VBQ2xFLElBQUksWUFBWSxDQUFDLE1BQU0sRUFBRSxXQUFXLEVBQUUsQ0FBQztFQUN2QyxJQUFJLFlBQVksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO0VBQ3JDLElBQUksWUFBWSxDQUFDLGtCQUFrQixDQUFDLFVBQVUsRUFBRSxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUM7O0VBRTNFOztFQUVBLElBQUksWUFBWSxDQUFDLEdBQUc7RUFDcEIsS0FBSyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHO0VBQ3ZCLEtBQUssR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRztFQUN2QixLQUFLLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUc7RUFDdkIsS0FBSyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHO0VBQ3ZCLEtBQUssQ0FBQzs7RUFFTixJQUFJLFlBQVksQ0FBQyxRQUFRLEVBQUUsWUFBWSxDQUFDLGdCQUFnQixFQUFFLENBQUM7RUFDM0QsSUFBSSxZQUFZLENBQUMsUUFBUSxFQUFFLFlBQVksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDOztFQUU3RCxJQUFJOztFQUVKLEdBQUcsS0FBSyxNQUFNLENBQUMsR0FBRyxLQUFLLElBQUksR0FBRzs7RUFFOUIsSUFBSSxJQUFJLElBQUksR0FBRyxFQUFFLFNBQVMsRUFBRWxsQyxlQUFhLEVBQUUsU0FBUyxFQUFFQSxlQUFhLEVBQUUsTUFBTSxFQUFFdEQsWUFBVSxFQUFFLENBQUM7O0VBRTFGLElBQUksTUFBTSxDQUFDLEdBQUcsR0FBRyxJQUFJK0MsbUJBQWlCLEVBQUUsY0FBYyxDQUFDLENBQUMsRUFBRSxjQUFjLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDO0VBQ25GLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLEdBQUcsWUFBWSxDQUFDOztFQUV4RCxJQUFJLFlBQVksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDOztFQUUxQyxJQUFJOztFQUVKLEdBQUcsS0FBSyxNQUFNLENBQUMsaUJBQWlCLEdBQUc7O0VBRW5DLElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQzs7RUFFM0IsSUFBSTs7RUFFSixHQUFHLElBQUksU0FBUyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUM7O0VBRTlCLEdBQUcsU0FBUyxDQUFDLGVBQWUsRUFBRSxTQUFTLEVBQUUsQ0FBQztFQUMxQyxHQUFHLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQzs7RUFFckI7RUFDQTs7RUFFQSxHQUFHLE1BQU0sSUFBSSxJQUFJLEdBQUcsQ0FBQyxFQUFFLElBQUksR0FBRyxTQUFTLEVBQUUsSUFBSSxHQUFHLEdBQUc7O0VBRW5ELElBQUksS0FBSyxZQUFZLEdBQUc7O0VBRXhCLEtBQUssV0FBVyxDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsUUFBUSxFQUFFLENBQUM7RUFDL0MsS0FBSyxXQUFXLENBQUMsR0FBRyxFQUFFLGNBQWMsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDO0VBQy9DLEtBQUssWUFBWSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUM7RUFDN0MsS0FBSyxZQUFZLENBQUMsTUFBTSxFQUFFLFdBQVcsRUFBRSxDQUFDO0VBQ3hDLEtBQUssWUFBWSxDQUFDLGlCQUFpQixFQUFFLENBQUM7RUFDdEMsS0FBSyxZQUFZLENBQUMsa0JBQWtCLENBQUMsVUFBVSxFQUFFLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQzs7RUFFNUUsS0FBSyxJQUFJLFlBQVksR0FBRyxlQUFlLEVBQUUsSUFBSSxFQUFFLENBQUM7RUFDaEQsS0FBSyxNQUFNLENBQUMsUUFBUSxFQUFFLFlBQVksRUFBRSxDQUFDOztFQUVyQyxLQUFLOztFQUVMOztFQUVBLElBQUksaUJBQWlCLENBQUMsZ0JBQWdCLEVBQUUsWUFBWSxDQUFDLGdCQUFnQixFQUFFLFlBQVksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0VBQ3pHLElBQUksUUFBUSxDQUFDLGFBQWEsRUFBRSxpQkFBaUIsRUFBRSxDQUFDOztFQUVoRDs7RUFFQSxJQUFJLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsQ0FBQzs7RUFFOUQsSUFBSTs7RUFFSixHQUFHOztFQUVIO0VBQ0EsRUFBRSxJQUFJLFVBQVUsR0FBRyxTQUFTLENBQUMsYUFBYSxFQUFFLENBQUM7RUFDN0MsRUFBRSxJQUFJLFVBQVUsR0FBRyxTQUFTLENBQUMsYUFBYSxFQUFFLENBQUM7RUFDN0MsRUFBRSxTQUFTLENBQUMsYUFBYSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsQ0FBQzs7RUFFcEQsRUFBRSxLQUFLLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQzs7RUFFNUIsRUFBRSxDQUFDOztFQUVILENBQUMsU0FBUyxnQkFBZ0IsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxrQkFBa0IsR0FBRzs7RUFFakYsRUFBRSxJQUFJLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDOztFQUVqQyxFQUFFLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQzs7RUFFcEIsRUFBRSxJQUFJLGdCQUFnQixHQUFHLGVBQWUsQ0FBQztFQUN6QyxFQUFFLElBQUksY0FBYyxHQUFHLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQzs7RUFFbEQsRUFBRSxLQUFLLFlBQVksR0FBRzs7RUFFdEIsR0FBRyxnQkFBZ0IsR0FBRyxrQkFBa0IsQ0FBQztFQUN6QyxHQUFHLGNBQWMsR0FBRyxNQUFNLENBQUMsc0JBQXNCLENBQUM7O0VBRWxELEdBQUc7O0VBRUgsRUFBRSxLQUFLLEVBQUUsY0FBYyxHQUFHOztFQUUxQixHQUFHLElBQUksV0FBVyxHQUFHLEtBQUssQ0FBQzs7RUFFM0IsR0FBRyxLQUFLLFFBQVEsQ0FBQyxZQUFZLEdBQUc7O0VBRWhDLElBQUksS0FBSyxRQUFRLElBQUksUUFBUSxDQUFDLGdCQUFnQixHQUFHOztFQUVqRCxLQUFLLFdBQVcsR0FBRyxRQUFRLENBQUMsZUFBZSxJQUFJLFFBQVEsQ0FBQyxlQUFlLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7O0VBRWpJLEtBQUssTUFBTSxLQUFLLFFBQVEsSUFBSSxRQUFRLENBQUMsVUFBVSxHQUFHOztFQUVsRCxLQUFLLFdBQVcsR0FBRyxRQUFRLENBQUMsWUFBWSxJQUFJLFFBQVEsQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQzs7RUFFN0UsS0FBSzs7RUFFTCxJQUFJOztFQUVKLEdBQUcsS0FBSyxNQUFNLENBQUMsYUFBYSxJQUFJLFFBQVEsQ0FBQyxRQUFRLEtBQUssS0FBSyxHQUFHOztFQUU5RCxJQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQUUsOEVBQThFLEVBQUUsTUFBTSxFQUFFLENBQUM7O0VBRTNHLElBQUk7O0VBRUosR0FBRyxJQUFJLFdBQVcsR0FBRyxNQUFNLENBQUMsYUFBYSxJQUFJLFFBQVEsQ0FBQyxRQUFRLENBQUM7O0VBRS9ELEdBQUcsSUFBSSxZQUFZLEdBQUcsQ0FBQyxDQUFDOztFQUV4QixHQUFHLEtBQUssV0FBVyxHQUFHLFlBQVksSUFBSSxhQUFhLENBQUM7RUFDcEQsR0FBRyxLQUFLLFdBQVcsR0FBRyxZQUFZLElBQUksYUFBYSxDQUFDOztFQUVwRCxHQUFHLE1BQU0sR0FBRyxnQkFBZ0IsRUFBRSxZQUFZLEVBQUUsQ0FBQzs7RUFFN0MsR0FBRyxNQUFNOztFQUVULEdBQUcsTUFBTSxHQUFHLGNBQWMsQ0FBQzs7RUFFM0IsR0FBRzs7RUFFSCxFQUFFLEtBQUssU0FBUyxDQUFDLG9CQUFvQjtFQUNyQyxJQUFJLFFBQVEsQ0FBQyxXQUFXLEtBQUssSUFBSTtFQUNqQyxJQUFJLFFBQVEsQ0FBQyxjQUFjLENBQUMsTUFBTSxLQUFLLENBQUMsR0FBRzs7RUFFM0M7RUFDQTs7RUFFQSxHQUFHLElBQUksSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUM7O0VBRWhELEdBQUcsSUFBSSxtQkFBbUIsR0FBRyxjQUFjLEVBQUUsSUFBSSxFQUFFLENBQUM7O0VBRXBELEdBQUcsS0FBSyxtQkFBbUIsS0FBSyxTQUFTLEdBQUc7O0VBRTVDLElBQUksbUJBQW1CLEdBQUcsRUFBRSxDQUFDO0VBQzdCLElBQUksY0FBYyxFQUFFLElBQUksRUFBRSxHQUFHLG1CQUFtQixDQUFDOztFQUVqRCxJQUFJOztFQUVKLEdBQUcsSUFBSSxjQUFjLEdBQUcsbUJBQW1CLEVBQUUsSUFBSSxFQUFFLENBQUM7O0VBRXBELEdBQUcsS0FBSyxjQUFjLEtBQUssU0FBUyxHQUFHOztFQUV2QyxJQUFJLGNBQWMsR0FBRyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7RUFDcEMsSUFBSSxtQkFBbUIsRUFBRSxJQUFJLEVBQUUsR0FBRyxjQUFjLENBQUM7O0VBRWpELElBQUk7O0VBRUosR0FBRyxNQUFNLEdBQUcsY0FBYyxDQUFDOztFQUUzQixHQUFHOztFQUVILEVBQUUsTUFBTSxDQUFDLE9BQU8sR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDO0VBQ3BDLEVBQUUsTUFBTSxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDOztFQUV4QyxFQUFFLElBQUksSUFBSSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUM7O0VBRTNCLEVBQUUsS0FBSyxLQUFLLENBQUMsaUJBQWlCLElBQUksSUFBSSxJQUFJNDJCLFlBQVUsR0FBRzs7RUFFdkQsR0FBRyxJQUFJLEdBQUd6SixXQUFTLENBQUM7O0VBRXBCLEdBQUc7O0VBRUgsRUFBRSxLQUFLLEtBQUssQ0FBQyxrQkFBa0IsR0FBRzs7RUFFbEMsR0FBRyxLQUFLLElBQUksS0FBS0EsV0FBUyxHQUFHLElBQUksR0FBR3dKLFVBQVEsQ0FBQztFQUM3QyxRQUFRLEtBQUssSUFBSSxLQUFLQSxVQUFRLEdBQUcsSUFBSSxHQUFHeEosV0FBUyxDQUFDOztFQUVsRCxHQUFHOztFQUVILEVBQUUsTUFBTSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7O0VBRXJCLEVBQUUsTUFBTSxDQUFDLFdBQVcsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDO0VBQzVDLEVBQUUsTUFBTSxDQUFDLGNBQWMsR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDOztFQUVsRCxFQUFFLE1BQU0sQ0FBQyxrQkFBa0IsR0FBRyxRQUFRLENBQUMsa0JBQWtCLENBQUM7RUFDMUQsRUFBRSxNQUFNLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUM7O0VBRXhDLEVBQUUsS0FBSyxZQUFZLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEtBQUssU0FBUyxHQUFHOztFQUVoRSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQzs7RUFFN0QsR0FBRzs7RUFFSCxFQUFFLE9BQU8sTUFBTSxDQUFDOztFQUVoQixFQUFFOztFQUVGLENBQUMsU0FBUyxZQUFZLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsWUFBWSxHQUFHOztFQUVyRSxFQUFFLEtBQUssTUFBTSxDQUFDLE9BQU8sS0FBSyxLQUFLLEdBQUcsT0FBTzs7RUFFekMsRUFBRSxJQUFJLE9BQU8sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7O0VBRXBELEVBQUUsS0FBSyxPQUFPLE1BQU0sTUFBTSxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxRQUFRLEVBQUUsR0FBRzs7RUFFMUUsR0FBRyxLQUFLLE1BQU0sQ0FBQyxVQUFVLE1BQU0sRUFBRSxNQUFNLENBQUMsYUFBYSxJQUFJLFFBQVEsQ0FBQyxnQkFBZ0IsRUFBRSxNQUFNLEVBQUUsRUFBRSxHQUFHOztFQUVqRyxJQUFJLE1BQU0sQ0FBQyxlQUFlLENBQUMsZ0JBQWdCLEVBQUUsWUFBWSxDQUFDLGtCQUFrQixFQUFFLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQzs7RUFFbkcsSUFBSSxJQUFJLFFBQVEsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDO0VBQzdDLElBQUksSUFBSSxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQzs7RUFFbkMsSUFBSSxLQUFLLEtBQUssQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLEdBQUc7O0VBRXJDLEtBQUssSUFBSSxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQzs7RUFFbEMsS0FBSyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHOztFQUV6RCxNQUFNLElBQUksS0FBSyxHQUFHLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQztFQUM5QixNQUFNLElBQUksYUFBYSxHQUFHLFFBQVEsRUFBRSxLQUFLLENBQUMsYUFBYSxFQUFFLENBQUM7O0VBRTFELE1BQU0sS0FBSyxhQUFhLElBQUksYUFBYSxDQUFDLE9BQU8sR0FBRzs7RUFFcEQsT0FBTyxJQUFJLGFBQWEsR0FBRyxnQkFBZ0IsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxtQkFBbUIsRUFBRSxDQUFDO0VBQ3hHLE9BQU8sU0FBUyxDQUFDLGtCQUFrQixFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUM7O0VBRWxHLE9BQU87O0VBRVAsTUFBTTs7RUFFTixLQUFLLE1BQU0sS0FBSyxRQUFRLENBQUMsT0FBTyxHQUFHOztFQUVuQyxLQUFLLElBQUksYUFBYSxHQUFHLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLG1CQUFtQixFQUFFLENBQUM7RUFDakcsS0FBSyxTQUFTLENBQUMsa0JBQWtCLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQzs7RUFFL0YsS0FBSzs7RUFFTCxJQUFJOztFQUVKLEdBQUc7O0VBRUgsRUFBRSxJQUFJLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDOztFQUVqQyxFQUFFLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0VBRXRELEdBQUcsWUFBWSxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxDQUFDOztFQUVyRSxHQUFHOztFQUVILEVBQUU7O0VBRUYsQ0FBQzs7RUFFRDtFQUNBO0VBQ0E7O0VBRUEsU0FBU2dFLEtBQUcsRUFBRSxNQUFNLEVBQUUsU0FBUyxHQUFHOztFQUVsQyxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxNQUFNLEtBQUssU0FBUyxLQUFLLE1BQU0sR0FBRyxJQUFJMzRCLFNBQU8sRUFBRSxDQUFDO0VBQ2pFLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLFNBQVMsS0FBSyxTQUFTLEtBQUssU0FBUyxHQUFHLElBQUlBLFNBQU8sRUFBRSxDQUFDOztFQUUxRSxDQUFDOztFQUVELE1BQU0sQ0FBQyxNQUFNLEVBQUUyNEIsS0FBRyxDQUFDLFNBQVMsRUFBRTs7RUFFOUIsQ0FBQyxHQUFHLEVBQUUsV0FBVyxNQUFNLEVBQUUsU0FBUyxHQUFHOztFQUVyQyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDO0VBQzdCLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUM7O0VBRW5DLEVBQUUsT0FBTyxJQUFJLENBQUM7O0VBRWQsRUFBRTs7RUFFRixDQUFDLEtBQUssRUFBRSxZQUFZOztFQUVwQixFQUFFLE9BQU8sSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDOztFQUU3QyxFQUFFOztFQUVGLENBQUMsSUFBSSxFQUFFLFdBQVcsR0FBRyxHQUFHOztFQUV4QixFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQztFQUNqQyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxTQUFTLEVBQUUsQ0FBQzs7RUFFdkMsRUFBRSxPQUFPLElBQUksQ0FBQzs7RUFFZCxFQUFFOztFQUVGLENBQUMsRUFBRSxFQUFFLFdBQVcsQ0FBQyxFQUFFLGNBQWMsR0FBRzs7RUFFcEMsRUFBRSxJQUFJLE1BQU0sR0FBRyxjQUFjLElBQUksSUFBSTM0QixTQUFPLEVBQUUsQ0FBQzs7RUFFL0MsRUFBRSxPQUFPLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLGNBQWMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDOztFQUU5RSxFQUFFOztFQUVGLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQyxHQUFHOztFQUV4QixFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUM7O0VBRTFELEVBQUUsT0FBTyxJQUFJLENBQUM7O0VBRWQsRUFBRTs7RUFFRixDQUFDLE1BQU0sRUFBRSxZQUFZOztFQUVyQixFQUFFLElBQUksRUFBRSxHQUFHLElBQUlBLFNBQU8sRUFBRSxDQUFDOztFQUV6QixFQUFFLE9BQU8sU0FBUyxNQUFNLEVBQUUsQ0FBQyxHQUFHOztFQUU5QixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7O0VBRXhDLEdBQUcsT0FBTyxJQUFJLENBQUM7O0VBRWYsR0FBRyxDQUFDOztFQUVKLEVBQUUsRUFBRTs7RUFFSixDQUFDLG1CQUFtQixFQUFFLFdBQVcsS0FBSyxFQUFFLGNBQWMsR0FBRzs7RUFFekQsRUFBRSxJQUFJLE1BQU0sR0FBRyxjQUFjLElBQUksSUFBSUEsU0FBTyxFQUFFLENBQUM7RUFDL0MsRUFBRSxNQUFNLENBQUMsVUFBVSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7RUFDMUMsRUFBRSxJQUFJLGlCQUFpQixHQUFHLE1BQU0sQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDOztFQUV2RCxFQUFFLEtBQUssaUJBQWlCLEdBQUcsQ0FBQyxHQUFHOztFQUUvQixHQUFHLE9BQU8sTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7O0VBRXJDLEdBQUc7O0VBRUgsRUFBRSxPQUFPLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLGNBQWMsRUFBRSxpQkFBaUIsRUFBRSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7O0VBRTlGLEVBQUU7O0VBRUYsQ0FBQyxlQUFlLEVBQUUsV0FBVyxLQUFLLEdBQUc7O0VBRXJDLEVBQUUsT0FBTyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDOztFQUV0RCxFQUFFOztFQUVGLENBQUMsaUJBQWlCLEVBQUUsWUFBWTs7RUFFaEMsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJQSxTQUFPLEVBQUUsQ0FBQzs7RUFFekIsRUFBRSxPQUFPLFNBQVMsaUJBQWlCLEVBQUUsS0FBSyxHQUFHOztFQUU3QyxHQUFHLElBQUksaUJBQWlCLEdBQUcsRUFBRSxDQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7O0VBRXJGOztFQUVBLEdBQUcsS0FBSyxpQkFBaUIsR0FBRyxDQUFDLEdBQUc7O0VBRWhDLElBQUksT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixFQUFFLEtBQUssRUFBRSxDQUFDOztFQUVsRCxJQUFJOztFQUVKLEdBQUcsRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsY0FBYyxFQUFFLGlCQUFpQixFQUFFLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQzs7RUFFcEYsR0FBRyxPQUFPLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxLQUFLLEVBQUUsQ0FBQzs7RUFFeEMsR0FBRyxDQUFDOztFQUVKLEVBQUUsRUFBRTs7RUFFSixDQUFDLG1CQUFtQixFQUFFLFlBQVk7O0VBRWxDLEVBQUUsSUFBSSxTQUFTLEdBQUcsSUFBSUEsU0FBTyxFQUFFLENBQUM7RUFDaEMsRUFBRSxJQUFJLE1BQU0sR0FBRyxJQUFJQSxTQUFPLEVBQUUsQ0FBQztFQUM3QixFQUFFLElBQUksSUFBSSxHQUFHLElBQUlBLFNBQU8sRUFBRSxDQUFDOztFQUUzQixFQUFFLE9BQU8sU0FBUyxtQkFBbUIsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLGtCQUFrQixFQUFFLHNCQUFzQixHQUFHOztFQUU1RjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUEsR0FBRyxTQUFTLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxjQUFjLEVBQUUsR0FBRyxFQUFFLENBQUM7RUFDeEQsR0FBRyxNQUFNLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQztFQUMzQyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxTQUFTLEVBQUUsQ0FBQzs7RUFFN0MsR0FBRyxJQUFJLFNBQVMsR0FBRyxFQUFFLENBQUMsVUFBVSxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQztFQUM3QyxHQUFHLElBQUksR0FBRyxHQUFHLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUM7RUFDNUMsR0FBRyxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztFQUN2QyxHQUFHLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsQ0FBQztFQUNqQyxHQUFHLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztFQUMzQixHQUFHLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQztFQUN2QyxHQUFHLElBQUksRUFBRSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDOztFQUUvQixHQUFHLEtBQUssR0FBRyxHQUFHLENBQUMsR0FBRzs7RUFFbEI7O0VBRUEsSUFBSSxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7RUFDdkIsSUFBSSxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7RUFDdkIsSUFBSSxNQUFNLEdBQUcsU0FBUyxHQUFHLEdBQUcsQ0FBQzs7RUFFN0IsSUFBSSxLQUFLLEVBQUUsSUFBSSxDQUFDLEdBQUc7O0VBRW5CLEtBQUssS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLEdBQUc7O0VBRTNCLE1BQU0sS0FBSyxFQUFFLElBQUksTUFBTSxHQUFHOztFQUUxQjtFQUNBOztFQUVBLE9BQU8sSUFBSSxNQUFNLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztFQUM1QixPQUFPLEVBQUUsSUFBSSxNQUFNLENBQUM7RUFDcEIsT0FBTyxFQUFFLElBQUksTUFBTSxDQUFDO0VBQ3BCLE9BQU8sT0FBTyxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxLQUFLLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7O0VBRXZGLE9BQU8sTUFBTTs7RUFFYjs7RUFFQSxPQUFPLEVBQUUsR0FBRyxTQUFTLENBQUM7RUFDdEIsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsSUFBSSxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUM7RUFDL0MsT0FBTyxPQUFPLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQzs7RUFFdEQsT0FBTzs7RUFFUCxNQUFNLE1BQU07O0VBRVo7O0VBRUEsTUFBTSxFQUFFLEdBQUcsRUFBRSxTQUFTLENBQUM7RUFDdkIsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsSUFBSSxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUM7RUFDOUMsTUFBTSxPQUFPLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQzs7RUFFckQsTUFBTTs7RUFFTixLQUFLLE1BQU07O0VBRVgsS0FBSyxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0sR0FBRzs7RUFFM0I7O0VBRUEsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEdBQUcsR0FBRyxTQUFTLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQztFQUN2RCxNQUFNLEVBQUUsR0FBRyxFQUFFLEVBQUUsR0FBRyxDQUFDLEtBQUssRUFBRSxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLENBQUM7RUFDM0YsTUFBTSxPQUFPLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQzs7RUFFckQsTUFBTSxNQUFNLEtBQUssRUFBRSxJQUFJLE1BQU0sR0FBRzs7RUFFaEM7O0VBRUEsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0VBQ2IsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLENBQUM7RUFDaEUsTUFBTSxPQUFPLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDOztFQUV6QyxNQUFNLE1BQU07O0VBRVo7O0VBRUEsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsSUFBSSxHQUFHLEdBQUcsU0FB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QyxHQUFHLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLEtBQUssT0FBTyxDQUFDO0VBQzdDLEdBQUcsSUFBSSxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsS0FBSyxPQUFPLENBQUM7O0VBRTdDLEdBQUcsTUFBTTs7RUFFVCxHQUFHLElBQUksR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLEtBQUssT0FBTyxDQUFDO0VBQzdDLEdBQUcsSUFBSSxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsS0FBSyxPQUFPLENBQUM7O0VBRTdDLEdBQUc7O0VBRUgsRUFBRSxLQUFLLE9BQU8sSUFBSSxDQUFDLEdBQUc7O0VBRXRCLEdBQUcsS0FBSyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsS0FBSyxPQUFPLENBQUM7RUFDOUMsR0FBRyxLQUFLLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxLQUFLLE9BQU8sQ0FBQzs7RUFFOUMsR0FBRyxNQUFNOztFQUVULEdBQUcsS0FBSyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsS0FBSyxPQUFPLENBQUM7RUFDOUMsR0FBRyxLQUFLLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxLQUFLLE9BQU8sQ0FBQzs7RUFFOUMsR0FBRzs7RUFFSCxFQUFFLEtBQUssRUFBRSxJQUFJLEdBQUcsS0FBSyxRQUFRLEtBQUssR0FBRyxJQUFJLEVBQUUsR0FBRyxPQUFPLElBQUksQ0FBQzs7RUFFMUQ7RUFDQTs7RUFFQSxFQUFFLEtBQUssS0FBSyxHQUFHLElBQUksSUFBSSxJQUFJLEtBQUssSUFBSSxHQUFHLElBQUksR0FBRyxLQUFLLENBQUM7O0VBRXBELEVBQUUsS0FBSyxLQUFLLEdBQUcsSUFBSSxJQUFJLElBQUksS0FBSyxJQUFJLEdBQUcsSUFBSSxHQUFHLEtBQUssQ0FBQzs7RUFFcEQsRUFBRSxLQUFLLE9BQU8sSUFBSSxDQUFDLEdBQUc7O0VBRXRCLEdBQUcsS0FBSyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsS0FBSyxPQUFPLENBQUM7RUFDOUMsR0FBRyxLQUFLLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxLQUFLLE9BQU8sQ0FBQzs7RUFFOUMsR0FBRyxNQUFNOztFQUVULEdBQUcsS0FBSyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsS0FBSyxPQUFPLENBQUM7RUFDOUMsR0FBRyxLQUFLLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxLQUFLLE9BQU8sQ0FBQzs7RUFFOUMsR0FBRzs7RUFFSCxFQUFFLEtBQUssRUFBRSxJQUFJLEdBQUcsS0FBSyxRQUFRLEtBQUssR0FBRyxJQUFJLEVBQUUsR0FBRyxPQUFPLElBQUksQ0FBQzs7RUFFMUQsRUFBRSxLQUFLLEtBQUssR0FBRyxJQUFJLElBQUksSUFBSSxLQUFLLElBQUksR0FBRyxJQUFJLEdBQUcsS0FBSyxDQUFDOztFQUVwRCxFQUFFLEtBQUssS0FBSyxHQUFHLElBQUksSUFBSSxJQUFJLEtBQUssSUFBSSxHQUFHLElBQUksR0FBRyxLQUFLLENBQUM7O0VBRXBEOztFQUVBLEVBQUUsS0FBSyxJQUFJLEdBQUcsQ0FBQyxHQUFHLE9BQU8sSUFBSSxDQUFDOztFQUU5QixFQUFFLE9BQU8sSUFBSSxDQUFDLEVBQUUsRUFBRSxJQUFJLElBQUksQ0FBQyxHQUFHLElBQUksR0FBRyxJQUFJLEVBQUUsY0FBYyxFQUFFLENBQUM7O0VBRTVELEVB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QUFFLEdBQUcsRUFBRSxDQUFDO0VBQ3JDLElBQUksSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQzs7RUFFckMsSUFBSSxNQUFNOztFQUVWLElBQUksSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7RUFDaEIsSUFBSSxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7O0VBRXZDLElBQUk7O0VBRUosR0FBRyxNQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRzs7RUFFaEMsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDOztFQUUvQyxHQUFHLEtBQUssSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxPQUFPLEdBQUc7O0VBRXBDLElBQUksSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0VBQ3ZDLElBQUksSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDOztFQUV2QyxJQUFJLE1BQU07O0VBRVYsSUFBSSxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztFQUNoQixJQUFJLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7O0VBRXJDLElBQUk7O0VBRUosR0FBRyxNQUFNLEtBQUssS0FBSyxLQUFLLEtBQUssR0FBRzs7RUFFaEMsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENB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Q0FBQyxJQUFJLEVBQUUsV0FBVyxNQUFNLEdBQUc7O0VBRTNCLEVBQUUsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztFQUM1RCxFQUFFLElBQUksQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQztFQUNsQyxFQUFFLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQztFQUM1QixFQUFFLElBQUksQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQzs7RUFFdEMsRUFBRSxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUM7O0VBRWhDLEVBQUUsT0FBTyxJQUFJLENBQUM7O0VBRWQsRUFBRTs7RUFFRixDQUFDLE1BQU0sRUFBRSxXQUFXLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxHQUFHOztFQUVoRCxFQUFFLE1BQU0sSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDO0VBQzFCLEVBQUUsTUFBTSxJQUFJLFNBQVMsQ0FBQyxRQUFRLENBQUM7O0VBRS9CLEVBQUUsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRzs7RUFFcEQsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUUsR0FBRyxTQUFTLENBQUMsS0FBSyxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQzs7RUFFNUQsR0FBRzs7RUFFSCxFQUFFLE9BQU8sSUFBSSxDQUFDOztFQUVkLEVBQUU7O0VBRUYsQ0FBQyxTQUFTLEVBQUUsV0FBVyxLQUFLLEdBQUc7O0VBRS9CLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUM7O0VBRTFCLEVBQUUsT0FBTyxJQUFJLENBQUM7O0VBRWQsRUFBRTs7RUFFRixD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RUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHOztFQUVqQyxFQUFFLEtBQUssSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDOztFQUV6QixFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztFQUM5QixFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQzs7RUFFOUIsRUFBRSxPQUFPLElBQUksQ0FBQzs7RUFFZCxFQUFFOztFQUVGLENBQUMsTUFBTSxFQUFFLFdBQVcsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHOztFQUVyQyxFQUFFLEtBQUssSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDOztFQUV6QixFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztFQUM5QixFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztFQUM5QixFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQzs7RUFFOUIsRUFBRSxPQUFPLElBQUksQ0FBQzs7RUFFZCxFQUFFOztFQUVGLENBQUMsT0FBTyxFQUFFLFdBQVcsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRzs7RUFFekMsRUFBRSxLQUFLLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQzs7RUFFekIsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLEtBQUssR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7RUFDOUIsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLEtBQUssR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7RUFDOUIsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLEtBQUssR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7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RUFBRSxDQUFDO0VBQ2pDLElBQUksUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUM7O0VBRWpDLElBQUk7O0VBRUosR0FBRyxNQUFNOztFQUVULEdBQUcsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7O0VBRTdCLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHOztFQUV2RCxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDOztFQUUzQixJQUFJLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztFQUMxQyxJQUFJLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztFQUMxQyxJQUFJLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQzs7RUFFMUMsSUFBSTs7RUFFSixHQUFHOztFQUVILEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHOztFQUV6RCxHQUFHLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQzs7RUFFN0IsR0FBRzs7RUFFSCxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRzs7RUFFdEQsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFD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LEdBQUcsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUc7O0VBRTdELEtBQUssRUFBRSxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLENBQUM7RUFDbEMsS0FBSyxFQUFFLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7RUFDdEMsS0FBSyxFQUFFLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7O0VBRXRDLEtBQUssRUFBRSxDQUFDLFVBQVUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7RUFDN0IsS0FBSyxFQUFFLENBQUMsVUFBVSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQztFQUM3QixLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUM7O0VBRXBCLEtBQUssT0FBTyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7RUFDekIsS0FBSyxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7RUFDN0IsS0FBSyxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7O0VBRTdCLEtBQUssT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO0VBQzdCLEtBQUssT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO0VBQzdCLEtBQUssT0FBTyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDOztFQUU3QixLQUFLLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztFQUM3QixLQUFLLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMs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QUcsQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7O0VBRXRELEdBQUcsS0FBSyxFQUFFLFFBQVEsQ0FBQyxtQkFBbUI7RUFDdEMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxzQkFBc0I7RUFDckMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxvQkFBb0I7RUFDbkMsSUFBSSxRQUFRLENBQUMsT0FBTyxLQUFLcGhGLGFBQVcsR0FBRzs7RUFFdkMsSUFBSSxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHOztFQUUzRCxLQUFLLElBQUksS0FBSyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUM7O0VBRXBDLEtBQUssSUFBSSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7RUFDdkUsS0FBSyxJQUFJLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztFQUN2RSxLQUFLLElBQUksRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDOztFQUV2RSxLQUFLLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDO0VBQ3pCLEtBQUssS0FBSyxFQUFFLENB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Q0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUM7RUFDekMsR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDOztFQUUzRCxHQUFHOztFQUVIO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVBLEVBQUUsSUFBSSxVQUFVLENBQUM7O0VBRWpCLEVBQUUsS0FBSyxRQUFRLENBQUMsR0FBRyxHQUFHOztFQUV0QixHQUFHLFVBQVUsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDOztFQUU3QixHQUFHLE1BQU0sS0FBSyxRQUFRLENBQUMsV0FBVyxHQUFHOztFQUVyQyxHQUFHLFVBQVUsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDOztFQUVyQyxHQUFHLE1BQU0sS0FBSyxRQUFRLENBQUMsZUFBZSxHQUFHOztFQUV6QyxHQUFHLFVBQVUsR0FBRyxRQUFRLENBQUMsZUFBZSxDQUFDOztFQUV6QyxHQUFHLE1BQU0sS0FBSyxRQUFRLENBQUMsU0FBUyxHQUFHOztFQUVuQyxHQUFHLFVBQVUsR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDOztFQUVuQyxHQUFHLE1BQU0sS0FBSyxRQUFRLENBQUMsT0FBTyxHQUFHOztFQUVqQyxHQUFHLFVBQVUsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDOztFQUVqQyxHQUFHLE1BQU0sS0FBSyxRQUFRLENBQUMsWUFBWSxHQUFHOztFQUV0QyxHQUFHLFVBQVUsR0FBRyxRQUFRLENBQUMsWUFBWSxDQUFDOztFQUV0QyxHQUFHLE1BQU0sS0FBSyxRQUFRLENBQUMsWUFBWSxHQUFHOztFQUV0QyxHQUFHLFVBQVUsR0FBRyxRQUFRLENBQUMsWUFBWSxDQUFDOztFQUV0QyxHQUFHLE1BQU0sS0FBSyxRQUFRLENBQUMsUUFBUSxHQUFHOztFQUVsQyxHQUFHLFVBQVUsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDOztFQUVsQyxHQUFHLE1BQU0sS0FBSyxRQUFRLENBQUMsV0FBVyxHQUFHOztFQUVyQyxHQUFHLFVBQVUsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDOztFQUVyQyxHQUFHOztFQUVILEVBQUUsS0FBSyxVQUFVLEtBQUssU0FBUyxHQUFHOztFQUVsQztFQUNBLEdBQUcsS0FBSyxVQUFVLENBQUMsbUJBQW1CLEdBQUc7O0VBRXpDLElBQUksVUFBVSxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUM7O0VBRXBDLElBQUk7O0VBRUosR0FBRyxJQUFJLE1BQU0sR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDO0VBQ2xDLEdBQUcsSUFBSSxNQUFNLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQzs7RUFFbEMsR0FBRyxRQUFRLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDOztFQUU3RSxHQUFHOztFQUVILEVBQUUsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQzs7RUFFMUM7RUFDQTtFQUNBO0VBQ0E7RUFDQSxFQUFFLFFBQVEsQ0FBQyxVQUFVLENBQUMsS0FBSyxHQUFHLEVBQUUsSUFBSSxRQUFRLENBQUMsTUFBTSxJQUFJLFFBQVEsQ0FBQyxNQUFNLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDOztFQUVuRyxFQUFFLFFBQVEsQ0FBQyxZQUFZLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUM7RUFDdEQsRUFBRSxRQUFRLENBQUMsZUFBZSxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsZUFBZSxDQUFDOztFQUU1RCxFQUFFOztFQUVGLENBQUMsU0FBUyxtQkFBbUIsRUFBRSxRQUFRLEVBQUUsUUFBUSxHQUFHOztFQUVwRCxFQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUM7RUFDMUMsRUFBRSxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDOztFQUU1QyxFQUFFOztFQUVGLENBQUMsU0FBUyxtQkFBbUIsRUFBRSxRQUFRLEVBQUUsUUFBUSxHQUFHOztFQUVwRCxFQUFFLFFBQVEsQ0FBQyxRQUFRLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUM7RUFDOUMsRUFBRSxRQUFRLENBQUMsU0FBUyxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUM7RUFDbEUsRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDOztFQUV4QyxFQUFFOztFQUVGLENBQUMsU0FBUyxxQkFBcUIsRUFBRSxRQUFRLEVBQUUsUUFBUSxHQUFHOztFQUV0RCxFQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUM7RUFDMUMsRUFBRSxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDO0VBQzVDLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLElBQUksR0FBRyxXQUFXLENBQUM7RUFDcEQsRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxPQUFPLEdBQUcsR0FBRyxDQUFDOztFQUV2QyxFQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUM7O0VBRXBDLEVBQUUsS0FBSyxRQUFRLENBQUMsR0FBRyxLQUFLLElBQUksR0FBRzs7RUFFL0IsR0FBRyxJQUFJLE1BQU0sR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQztFQUNwQyxHQUFHLElBQUksTUFBTSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDOztFQUVwQyxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUM7O0VBRTdFLEdBQUc7O0VBRUgsRUFBRTs7RUFFRixDQUFDLFNBQVMsa0JBQWtCLEVBQUUsUUFBUSxFQUFFLEdBQUcsR0FBRzs7RUFFOUMsRUFBRSxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDOztFQUV0QyxFQUFFLEtBQUssR0FBRyxDQUFDLEtBQUssR0FBRzs7RUFFbkIsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDO0VBQ3JDLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQzs7RUFFbkMsR0FBRyxNQUFNLEtBQUssR0FBRyxDQUFDLFNBQVMsR0FBRzs7RUFFOUIsR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDOztFQUUzQyxHQUFHOztFQUVILEVBQUU7O0VBRUYsQ0FBQyxTQUFTLHNCQUFzQixFQUFFLFFBQVEsRUFBRSxRQUFRLEdBQUc7O0VBRXZELEVBQUUsS0FBSyxRQUFRLENBQUMsV0FBVyxHQUFHOztFQUU5QixHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUM7O0VBRXJELEdBQUc7O0VBRUgsRUFBRTs7RUFFRixDQUFDLFNBQVMsb0JBQW9CLEVBQUUsUUFBUSxFQUFFLFFBQVEsR0FBRzs7RUFFckQsRUFBRSxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDO0VBQzlDLEVBQUUsUUFBUSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDOztFQUVsRSxFQUFFLEtBQUssUUFBUSxDQUFDLFdBQVcsR0FBRzs7RUFFOUIsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDOztFQUVyRCxHQUFHOztFQUVILEVBQUUsS0FBSyxRQUFRLENBQUMsT0FBTyxHQUFHOztFQUUxQixHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUM7RUFDN0MsR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDOztFQUVqRCxHQUFHOztFQUVILEVBQUUsS0FBSyxRQUFRLENBQUMsU0FBUyxHQUFHOztFQUU1QixHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUM7RUFDakQsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDOztFQUUzRCxHQUFHOztFQUVILEVBQUUsS0FBSyxRQUFRLENBQUMsZUFBZSxHQUFHOztFQUVsQyxHQUFHLFFBQVEsQ0FBQyxlQUFlLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxlQUFlLENBQUM7RUFDN0QsR0FBRyxRQUFRLENBQUMsaUJBQWlCLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQztFQUNqRSxHQUFHLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLGdCQUFnQixDQUFDOztFQUUvRCxHQUFHOztFQUVILEVBQUU7O0VBRUYsQ0FBQyxTQUFTLG1CQUFtQixFQUFFLFFBQVEsRUFBRSxRQUFRLEdBQUc7O0VBRXBELEVBQUUsb0JBQW9CLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxDQUFDOztFQUU3QyxFQUFFLEtBQUssUUFBUSxDQUFDLFdBQVcsR0FBRzs7RUFFOUIsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDOztFQUVyRCxHQUFHOztFQUVILEVBQUU7O0VBRUYsQ0FBQyxTQUFTLHVCQUF1QixFQUFFLFFBQVEsRUFBRSxRQUFRLEdBQUc7O0VBRXhELEVBQUUsUUFBUSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQztFQUNoRCxFQUFFLFFBQVEsQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUM7O0VBRWhELEVBQUUsS0FBSyxRQUFRLENBQUMsWUFBWSxHQUFHOztFQUUvQixHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUM7O0VBRXZELEdBQUc7O0VBRUgsRUFBRSxLQUFLLFFBQVEsQ0FBQyxZQUFZLEdBQUc7O0VBRS9CLEdBQUcsUUFBUSxDQUFDLFlBQVksQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLFlBQVksQ0FBQzs7RUFFdkQsR0FBRzs7RUFFSCxFQUFFLEtBQUssUUFBUSxDQUFDLFdBQVcsR0FBRzs7RUFFOUIsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDOztFQUVyRCxHQUFHOztFQUVILEVBQUUsS0FBSyxRQUFRLENBQUMsT0FBTyxHQUFHOztFQUUxQixHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUM7RUFDN0MsR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDOztFQUVqRCxHQUFHOztFQUVILEVBQUUsS0FBSyxRQUFRLENBQUMsU0FBUyxHQUFHOztFQUU1QixHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUM7RUFDakQsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDOztFQUUzRCxHQUFHOztFQUVILEVBQUUsS0FBSyxRQUFRLENBQUMsZUFBZSxHQUFHOztFQUVsQyxHQUFHLFFBQVEsQ0FBQyxlQUFlLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxlQUFlLENBQUM7RUFDN0QsR0FBRyxRQUFRLENBQUMsaUJBQWlCLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQztFQUNqRSxHQUFHLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLGdCQUFnQixDQUFDOztFQUUvRCxHQUFHOztFQUVILEVBQUUsS0FBSyxRQUFRLENBQUMsTUFBTSxHQUFHOztFQUV6QjtFQUNBLEdBQUcsUUFBUSxDQUFDLGVBQWUsQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLGVBQWUsQ0FBQzs7RUFFN0QsR0FBRzs7RUFFSCxFQUFFOztFQUVGLENBQUMsU0FBUyx1QkFBdUIsRUFBRSxRQUFRLEVBQUUsUUFBUSxHQUFHOztFQUV4RCxFQUFFLFFBQVEsQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUM7RUFDaEQsRUFBRSxRQUFRLENBQUMsa0JBQWtCLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQzs7RUFFbEUsRUFBRSx1QkFBdUIsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLENBQUM7O0VBRWhELEVBQUU7O0VBRUYsQ0FBQyxTQUFTLHFCQUFxQixFQUFFLFFBQVEsRUFBRSxRQUFRLEdBQUc7O0VBRXRELEVBQUUsS0FBSyxRQUFRLENBQUMsT0FBTyxHQUFHOztFQUUxQixHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUM7RUFDN0MsR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDOztFQUVqRCxHQUFHOztFQUVILEVBQUUsS0FBSyxRQUFRLENBQUMsU0FBUyxHQUFHOztFQUU1QixHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUM7RUFDakQsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDOztFQUUzRCxHQUFHOztFQUVILEVBQUUsS0FBSyxRQUFRLENBQUMsZUFBZSxHQUFHOztFQUVsQyxHQUFHLFFBQVEsQ0FBQyxlQUFlLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxlQUFlLENBQUM7RUFDN0QsR0FBRyxRQUFRLENBQUMsaUJBQWlCLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQztFQUNqRSxHQUFHLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLGdCQUFnQixDQUFDOztFQUUvRCxHQUFHOztFQUVILEVBQUU7O0VBRUY7O0VBRUEsQ0FBQyxTQUFTLDZCQUE2QixFQUFFLFFBQVEsRUFBRSxLQUFLLEdBQUc7O0VBRTNELEVBQUUsUUFBUSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7O0VBRWpELEVBQUUsUUFBUSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7RUFDakQsRUFBRSxRQUFRLENBQUMsV0FBVyxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7RUFDM0MsRUFBRSxRQUFRLENBQUMsVUFBVSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7RUFDMUMsRUFBRSxRQUFRLENBQUMsY0FBYyxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7RUFDOUMsRUFBRSxRQUFRLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQzs7RUFFaEQsRUFBRTs7RUFFRjs7RUFFQSxDQUFDLFNBQVMsWUFBWSxFQUFFLE1BQU0sR0FBRzs7RUFFakMsRUFBRSxJQUFJLGtCQUFrQixHQUFHLENBQUMsQ0FBQzs7RUFFN0IsRUFBRSxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHOztFQUVwRCxHQUFHLElBQUksS0FBSyxHQUFHLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQzs7RUFFM0IsR0FBRyxLQUFLLEtBQUssQ0FBQyxVQUFVLEdBQUc7O0VBRTNCLElBQUksT0FBTyxDQUFDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxHQUFHLEtBQUssQ0FBQztFQUNsRCxJQUFJLGtCQUFrQixHQUFHLENBQUM7O0VBRTFCLElBQUk7O0VBRUosR0FBRzs7RUFFSCxFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLGtCQUFrQixDQUFDOztFQUU5QyxFQUFFOztFQUVGLENBQUMsU0FBUyxXQUFXLEVBQUUsTUFBTSxFQUFFLE1BQU0sR0FBRzs7RUFFeEMsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLE1BQU07RUFDMUIsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUM7RUFDdEIsR0FBRyxLQUFLO0VBQ1IsR0FBRyxTQUFTO0VBQ1osR0FBRyxRQUFRO0VBQ1gsR0FBRyxTQUFTOztFQUVaLEdBQUcsVUFBVSxHQUFHLE1BQU0sQ0FBQyxrQkFBa0I7O0VBRXpDLEdBQUcsaUJBQWlCLEdBQUcsQ0FBQztFQUN4QixHQUFHLFdBQVcsR0FBRyxDQUFDO0VBQ2xCLEdBQUcsVUFBVSxHQUFHLENBQUM7RUFDakIsR0FBRyxjQUFjLEdBQUcsQ0FBQztFQUNyQixHQUFHLFVBQVUsR0FBRyxDQUFDLENBQUM7O0VBRWxCLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0VBRWxELEdBQUcsS0FBSyxHQUFHLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQzs7RUFFdkIsR0FBRyxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztFQUN2QixHQUFHLFNBQVMsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDO0VBQy9CLEdBQUcsUUFBUSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUM7O0VBRTdCLEdBQUcsU0FBUyxHQUFHLEVBQUUsS0FBSyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsS0FBSyxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDOztFQUV0RixHQUFHLEtBQUssS0FBSyxDQUFDLGNBQWMsR0FBRzs7RUFFL0IsSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUM7RUFDN0IsSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUM7RUFDN0IsSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUM7O0VBRTdCLElBQUksTUFBTSxLQUFLLEtBQUssQ0FBQyxrQkFBa0IsR0FBRzs7RUFFMUMsSUFBSSxJQUFJLFFBQVEsR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDOztFQUUzQyxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQyxjQUFjLEVBQUUsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDO0VBQ3pFLElBQUksUUFBUSxDQUFDLFNBQVMsQ0FBQyxxQkFBcUIsRUFBRSxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7RUFDbEUsSUFBSSxRQUFRLENBQUMscUJBQXFCLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQztFQUMvRCxJQUFJLFFBQVEsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxDQUFDO0VBQ3ZDLElBQUksUUFBUSxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsRUFBRSxVQUFVLEVBQUUsQ0FBQzs7RUFFeEQsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUM7O0VBRXZDLElBQUksS0FBSyxLQUFLLENBQUMsVUFBVSxHQUFHOztFQUU1QixLQUFLLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDOztFQUUzQixLQUFLLFFBQVEsQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQztFQUN2QyxLQUFLLFFBQVEsQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztFQUMzQyxLQUFLLFFBQVEsQ0FBQyxhQUFhLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQzs7RUFFN0MsS0FBSzs7RUFFTCxJQUFJLE9BQU8sQ0FBQyxvQkFBb0IsRUFBRSxpQkFBaUIsRUFBRSxHQUFHLFNBQVMsQ0FBQztFQUNsRSxJQUFJLE9BQU8sQ0FBQyx1QkFBdUIsRUFBRSxpQkFBaUIsRUFBRSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO0VBQy9FLElBQUksT0FBTyxDQUFDLFdBQVcsRUFBRSxpQkFBaUIsRUFBRSxHQUFHLFFBQVEsQ0FBQzs7RUFFeEQsSUFBSSxpQkFBaUIsR0FBRyxDQUFDOztFQUV6QixJQUFJLE1BQU0sS0FBSyxLQUFLLENBQUMsV0FBVyxHQUFHOztFQUVuQyxJQUFJLElBQUksUUFBUSxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUM7O0VBRTNDLElBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQyxxQkFBcUIsRUFBRSxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7RUFDakUsSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxVQUFVLEVBQUUsQ0FBQzs7RUFFakQsSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxjQUFjLEVBQUUsU0FBUyxFQUFFLENBQUM7RUFDN0QsSUFBSSxRQUFRLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQzs7RUFFakMsSUFBSSxRQUFRLENBQUMsU0FBUyxDQUFDLHFCQUFxQixFQUFFLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztFQUNsRSxJQUFJLFFBQVEsQ0FBQyxxQkFBcUIsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDO0VBQy9ELElBQUksUUFBUSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsUUFBUSxFQUFFLENBQUM7RUFDdkMsSUFBSSxRQUFRLENBQUMsU0FBUyxDQUFDLGtCQUFrQixFQUFFLFVBQVUsRUFBRSxDQUFDOztFQUV4RCxJQUFJLFFBQVEsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7RUFDL0MsSUFBSSxRQUFRLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEtBQUssS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUM7RUFDNUUsSUFBSSxRQUFRLENBQUMsS0FBSyxHQUFHLEVBQUUsS0FBSyxDQUFDLFFBQVEsS0FBSyxDQUFDLEtBQUssR0FBRyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7O0VBRWxFLElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsVUFBVSxDQUFDOztFQUV2QyxJQUFJLEtBQUssS0FBSyxDQUFDLFVBQVUsR0FBRzs7RUFFNUIsS0FBSyxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQzs7RUFFM0IsS0FBSyxRQUFRLENBQUMsVUFBVSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUM7RUFDdkMsS0FBSyxRQUFRLENBQUMsWUFBWSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7RUFDM0MsS0FBSyxRQUFRLENBQUMsYUFBYSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUM7O0VBRTdDLEtBQUs7O0VBRUwsSUFBSSxPQUFPLENBQUMsYUFBYSxFQUFFLFVBQVUsRUFBRSxHQUFHLFNBQVMsQ0FBQztFQUNwRCxJQUFJLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxVQUFVLEVBQUUsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQztFQUNqRSxJQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLEdBQUcsUUFBUSxDQUFDOztFQUUxQyxJQUFJLFVBQVUsR0FBRyxDQUFDOztFQUVsQixJQUFJLE1BQU0sS0FBSyxLQUFLLENBQUMsZUFBZSxHQUFHOztFQUV2QyxJQUFJLElBQUksUUFBUSxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUM7O0VBRTNDO0VBQ0EsSUFBSSxRQUFRLENBQUMsS0FBSztFQUNsQixNQUFNLElBQUksRUFBRSxLQUFLLEVBQUU7RUFDbkIsTUFBTSxjQUFjLEVBQUUsU0FBUyxLQUFLLEtBQUssQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUM7O0VBRW5FO0VBQ0E7O0VBRUEsSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLHFCQUFxQixFQUFFLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztFQUNqRSxJQUFJLFFBQVEsQ0FBQyxRQUFRLENBQUMsWUFBWSxFQUFFLFVBQVUsRUFBRSxDQUFDOztFQUVqRDtFQUNBLElBQUksU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDO0VBQ3pCLElBQUksUUFBUSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7RUFDdkMsSUFBSSxRQUFRLENBQUMsV0FBVyxFQUFFLFVBQVUsRUFBRSxDQUFDO0VBQ3ZDLElBQUksU0FBUyxDQUFDLGVBQWUsRUFBRSxRQUFRLEVBQUUsQ0FBQzs7RUFFMUMsSUFBSSxRQUFRLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsS0FBSyxHQUFHLEdBQUcsaUJBQWlCLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztFQUN6RSxJQUFJLFFBQVEsQ0FBQyxVQUFVLENBQUMsR0FBRyxlQUFlLEdBQUcsRUFBRSxLQUFLLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQzs7RUFFekUsSUFBSSxRQUFRLENBQUMsU0FBUyxDQUFDLFlBQVksRUFBRSxTQUFTLEVBQUUsQ0FBQztFQUNqRCxJQUFJLFFBQVEsQ0FBQyxVQUFVLENBQUMsWUFBWSxFQUFFLFNBQVMsRUFBRSxDQUFDOztFQUVsRDtFQUNBOztFQUVBLElBQUksT0FBTyxDQUFDLFFBQVEsRUFBRSxjQUFjLEVBQUUsR0FBRyxRQUFRLENBQUM7O0VBRWxELElBQUksY0FBYyxHQUFHLENBQUM7O0VBRXRCLElBQUksTUFBTSxLQUFLLEtBQUssQ0FBQyxZQUFZLEdBQUc7O0VBRXBDLElBQUksSUFBSSxRQUFRLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQzs7RUFFM0MsSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLHFCQUFxQixFQUFFLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztFQUNqRSxJQUFJLFFBQVEsQ0FBQyxRQUFRLENBQUMsWUFBWSxFQUFFLFVBQVUsRUFBRSxDQUFDOztFQUVqRCxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQyxjQUFjLEVBQUUsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDO0VBQ3pFLElBQUksUUFBUSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDO0VBQ3ZDLElBQUksUUFBUSxDQUFDLEtBQUssR0FBRyxFQUFFLEtBQUssQ0FBQyxRQUFRLEtBQUssQ0FBQyxLQUFLLEdBQUcsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDOztFQUVsRSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQzs7RUFFdkMsSUFBSSxLQUFLLEtBQUssQ0FBQyxVQUFVLEdBQUc7O0VBRTVCLEtBQUssTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7O0VBRTNCLEtBQUssUUFBUSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO0VBQ3ZDLEtBQUssUUFBUSxDQUFDLFlBQVksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0VBQzNDLEtBQUssUUFBUSxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDOztFQUU3QyxLQUFLOztFQUVMLElBQUksT0FB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Q0FBQyxTQUFTLEVBQUUsWUFBWTs7RUFFeEIsRUFBRSxJQUFJLEtBQUssR0FBRyxFQUFFLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQztFQUM5QixFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7RUFFWixFQUFFLEtBQUssSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssS0FBSyxTQUFTLEdBQUc7O0VBRTVEOztFQUVBLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRzs7RUFFaEUsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0VBRXJDOztFQUVBLElBQUksSUFBSSxHQUFHLElBQUlQLE1BQUksRUFBRSxDQUFDO0VBQ3RCLElBQUksS0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQzs7RUFFdkI7O0VBRUEsSUFBSSxJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7RUFDM0IsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUM7RUFDekMsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7RUFDNUMsSUFBSSxLQUFLLEtBQUssQ0FBQyxHQUFHLEtBQUssU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQzs7RUFFckUsSUFBSTs7RUFFSjs7RUFFQSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxH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LElBQUksSUFBSSxLQUFLLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQztFQUMvQixJQUFJLElBQUksVUFBVSxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUM7RUFDekMsSUFBSSxJQUFJLFNBQVMsR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQzs7RUFFOUMsSUFBSSxLQUFLLEtBQUssS0FBSyxJQUFJLEdBQUc7O0VBRTFCLEtBQUssSUFBSSxPQUFPLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQzs7RUFFL0IsS0FBSyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHOztFQUUxRCxNQUFNLElBQUksQ0FBQyxHQUFHLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQzs7RUFFM0IsTUFBTSxRQUFRLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7O0VBRTdDLE1BQU0sU0FBUyxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7RUFFL0IsTUFBTTs7RUFFTixLQUFLLE1BQU07O0VBRVgsS0FBSyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRzs7RUFFOUQsTUFBTSxRQUFRLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7O0VBRTdDLE1BQU0sU0FBUyxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7RUFFL0IsTUFBTTs7RUFFTixLQUFLOztFQUVMLElBQUksTUFBTTs7RUFFVixJQUFJLElBQUksUUFBUSxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUM7O0VBRXJDLElBQUksTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEs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SSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7RUFDOUIsSUFBSSxLQUFLLEdBQUcsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQztFQUMxQyxJQUFJLElBQUksRUFBRSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQztFQUN6QyxJQUFJLElBQUksRUFBRSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQzs7RUFFekMsSUFBSSxHQUFHLEdBQUcsSUFBSSxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsR0FBRyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0VBRXRDLElBQUksS0FBSyxLQUFLLEVBQUUsR0FBRyxFQUFFLEtBQUssU0FBUyxHQUFHOztFQUV0QyxLQUFLLEtBQUssRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDOztFQUU3RCxLQUFLOztFQUVMLElBQUk7O0VBRUosR0FBRzs7RUFFSDs7RUFFQSxFQUFFLE1BQU0sR0FBRyxJQUFJLEtBQUssR0FBRzs7RUFFdkIsR0FBRyxDQUFDLEdBQUcsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDOztFQUVwQixHQUFHLE1BQU0sR0FBRyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztFQUMxQyxHQUFHLFFBQVEsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7RUFFakQsR0FBRyxNQUFNLEdBQUcsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7RUFDMUMsR0FBRyxRQUFRLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUM7O0VBRWpELEdBQUc7O0VBRUgsRUFBRSxNQUFNLEtBQUssUUFBUSxJQUFJLFFBQVEsQ0FBQyxnQkFBZ0IsR0FBRzs7RUFFckQsRUFBRSxJQUFJLFFBQVEsRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDO0VBQ2hDLEVBQUUsSUFBSSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQztFQUMxQixFQUFFLElBQUksTUFBTSxFQUFFLE1BQU0sQ0FBQzs7RUFFckIsRUFBRSxNQUFNLEdBQUcsSUFBSTd3QixTQUFPLEVBQUUsQ0FBQzs7RUFFekIsRUFBRSxLQUFLLFFBQVEsQ0FBQyxLQUFLLEtBQUssSUFBSSxHQUFHOztFQUVqQzs7RUFFQSxHQUFHLFFBQVEsR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQztFQUMzQyxHQUFHLE9BQU8sR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDO0VBQzVCLEdBQUcsTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7O0VBRTVCLEdBQUcsS0FBSyxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsR0FBRzs7RUFFOUIsSUFBSSxNQUFNLEdBQUcsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLLEVBQUUsYUFBYSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7O0VBRXRFLElBQUk7O0VBRUo7O0VBRUEsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRzs7RUFFbkQsSUFBSSxLQUFLLEdBQUcsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDOztFQUV4QixJQUFJLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO0VBQ3hCLElBQUksS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7O0VBRXhCLElBQUksTUFBTSxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUMsS0FBSyxLQUFLLEdBQUcsS0FBSyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHOztFQUU1RCxLQUFLLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHOztFQUVoQyxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztFQUNwQyxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7RUFDaEQsTUFBTSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUM7RUFDM0MsTUFBTSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUM7O0VBRTNDLE1BQU0sR0FBRyxHQUFHLElBQUksRUFBRSxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDOztFQUV4QyxNQUFNLEtBQUssS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLFNBQVMsR0FBRzs7RUFFeEMsT0FBTyxLQUFLLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7RUFFL0QsT0FBTzs7RUFFUCxNQUFNOztFQUVOLEtBQUs7O0VBRUwsSUFBSTs7RUFFSjs7RUFFQSxHQUFHLE1BQU0sR0FBRyxJQUFJLEtBQUssR0FBRzs7RUFFeEIsSUFBSSxDQUFDLEdBQUcsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDOztFQUVyQixJQUFJLE1BQU0sQ0FBQyxtQkFBbUIsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO0VBQ3JELElBQUksUUFBUSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDOztFQUVsRCxJQUFJLE1BQU0sQ0FBQyxtQkFBbUIsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO0VBQ3JELElBQUksUUFBUSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDOztFQUVsRCxJQUFJOztFQUVKLEdBQUcsTUFBTTs7RUFFVDs7RUFFQSxHQUFHLFFBQVEsR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQzs7RUFFM0MsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxLQUFLLFFBQVEsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRzs7RUFFMUQsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRzs7RUFFL0I7RUFDQTs7RUFFQSxLQUFLLE1BQU0sR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztFQUN4QixLQUFLLE1BQU0sQ0FBQyxtQkFBbUIsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLENBQUM7RUFDcEQsS0FBSyxRQUFRLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUM7O0VBRW5ELEtBQUssTUFBTSxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFD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LENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxNQUFNLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0VBRWxDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQzs7RUFFckIsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLE1BQU0sRUFBRSxDQUFDLEdBQUcsR0FBRzs7RUFFbkMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDOztFQUV0Qjs7RUFFQSxHQUFHLEVBQUUsR0FBRyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQztFQUN6QixHQUFHLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7RUFFckM7O0VBRUE7O0VBRUEsR0FBRyxLQUFLLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHOztFQUV2QixJQUFJLEVBQUUsR0FBRyxJQUFJLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUM7RUFDaEMsSUFBSSxFQUFFLENBQUMsVUFBVSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQzs7RUFFNUIsSUFBSSxNQUFNOztFQUVWLElBQUksRUFBRSxHQUFHLElBQUksRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQztFQUNoQyxJQUFJLEVBQUUsQ0FBQyxVQUFVLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDOztFQUU1QixJQUFJOztFQUVKLEdBQUcsS0FBSyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRzs7RUFFdkIsSUFBSSxFQUFFLEdBQUcsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDO0VBQ2hDLElBQUksRUFBRSxDQUFDLFVB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QUFFLEdBQUcsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDOztFQUVuRCxLQUFLOztFQUVMLElBQUk7O0VBRUosR0FBRzs7RUFFSDs7RUFFQSxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsR0FBRyxHQUFHOztFQUVoQyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLElBQUksR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0VBRWpELElBQUksSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7O0VBRWhDLElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRzs7RUFFdkIsS0FBSyxVQUFVLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDO0VBQ25DLEtBQUssVUFBVSxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztFQUNuQyxLQUFLLFVBQVUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7RUFFL0IsS0FBSyxNQUFNOztFQUVYLEtBQUssVUFBVSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQztFQUNuQyxLQUFLLFVBQVUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDO0VBQ3ZDLEtBQUssVUFBVSxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7RUFFbkMsS0FBSzs7RUFFTCxJQUFJOztFQUVKLEdBQUc7O0VBRUgsRUFBRTs7RUFFRixDQUFDLFNBQVMsWUFBWSxFQUFFLE1BQU0sR0FBRzs7RUFFakMsRUFBRSxJQUFJLE1BQU0sR0FBRyxJQUFJQSxTQUFPLEVBQUUsQ0FBQzs7RUFFN0I7O0VBRUEsRUFBRSxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHOztFQUVyRCxHQUFHLE1BQU0sQ0FBQyxDQUFDLEdBQUcsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztFQUNwQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLEdBQUcsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztFQUNwQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLEdBQUcsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQzs7RUFFcEMsR0FBRyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUMsY0FBYyxFQUFFLE1BQU0sRUFBRSxDQUFDOztFQUUvQyxHQUFHLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQztFQUNwQyxHQUFHLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQztFQUNwQyxHQUFHLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQzs7RUFFcEMsR0FBRzs7RUFFSCxFQUFFOztFQUVGLENBQUMsU0FBUyxXQUFXLEdBQUc7O0VBRXhCLEVBQUUsSUFBSSxNQUFNLEdBQUcsSUFBSUEsU0FBTyxFQUFFLENBQUM7O0VBRTdCLEVBQUUsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRzs7RUFFckQsR0FBRyxNQUFNLENBQUMsQ0FBQyxHQUFHLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7RUFDcEMsR0FBRyxNQUFNLENBQUMsQ0FBQyxHQUFHLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7RUFDcEMsR0FBRyxNQUFNLENBQUMsQ0FBQyxHQUFHLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7O0VBRXBDLEdBQUcsSUFBSSxDQUFDLEdBQUcsT0FBTyxFQUFFLE1BQU0sRUFBRSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQztFQUNqRCxHQUFHLElBQUksQ0FBQyxHQUFHLFdBQVcsRUFBRSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQztFQUNqRCxHQUFHLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQzs7RUFFN0IsR0FBRzs7RUFFSCxFQUFFLFVBQVUsRUFBRSxDQUFDOztFQUVmLEVBQUUsV0FBVyxFQUFFLENBQUM7O0VBRWhCLEVBQUU7O0VBRUYsQ0FBQyxTQUFTLFdBQVcsR0FBRzs7RUFFeEI7O0VBRUEsRUFBRSxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHOztFQUVqRDs7RUFFQSxHQUFHLElBQUksRUFBRSxHQUFHLFFBQVEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7RUFDOUIsR0FBRyxJQUFJLEVBQUUsR0FBRyxRQUFRLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO0VBQzlCLEdBQUcsSUFBSSxFQUFFLEdBQUcsUUFBUSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQzs7RUFFOUIsR0FBRyxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7RUFDcEMsR0FBRyxJQUFJLEdBQUcsR0FB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LEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLFFBQVEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQztFQUNuRCxHQUFHLEdBQUcsQ0FBQyxHQUFHLEVBQUUsUUFBUSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUM7RUFDbkQsR0FBRyxHQUFHLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsUUFBUSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDOztFQUVuRCxHQUFHLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0VBRTFELEdBQUcsSUFBSSxHQUFHLEdBQUcsT0FBTyxFQUFFLFFBQVEsRUFBRSxDQUFDOztFQUVqQyxHQUFHLFNBQVMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7RUFDbkMsR0FBRyxTQUFTLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDO0VBQ25DLEdBQUcsU0FBUyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQzs7RUFFbkMsR0FBRzs7RUFFSCxFQUFFOztFQUVGLENBQUMsU0FBUyxTQUFTLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxHQUFHOztFQUVuRCxFQUFFLEtBQUssRUFBRSxPQUFPLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUc7O0VBRTNDLEdBQUcsUUFBUSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxD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LEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUM7RUFDMUQsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztFQUMxRCxFQUFFLENBQUM7O0VBRUgsQ0FBQyxJQUFJLE9BQU8sR0FBRztFQUNmLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFO0VBQ3BFLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO0VBQ3BFLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO0VBQ3BFLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO0VBQ3BFLEVBQUUsQ0FBQzs7RUFFSCxDQUFDTiwwQkFBd0IsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDOztFQUUxRSxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsMkJBQTJCLENBQUM7O0VBRXpDLENBQUMsSUFBSSxDQUFDLFVBQVUsR0FBRztFQUNuQixFQUFFLE1BQU0sRUFBRSxNQUFNO0VBQ2hCLEVBQUUsTUFBTSxFQUFFLE1BQU07RUFDaEIsRUFBRSxDQUFDOztFQUVILENBQUM7O0FBRURNLDZCQUF5QixDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFTiwwQkFBd0IsQ0FBQyxTQUFTLEVBQUUsQ0FBQztBQUMxRk0sNkJBQXlCLENBQUMsU0FBUyxDQUFDLFdBQVcsR0FBR0EsMkJBQXlCLENBQUM7O0VBRTVFO0VBQ0E7RUFDQTtFQUNBOztFQUVBOztFQUVBLFNBQVNDLHNCQUFvQixFQUFFLE1BQU0sRUFBRSxNQUFNLEdBQUc7O0VBRWhELENBQUN2OUMsVUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQzs7RUFFdkIsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLHNCQUFzQixDQUFDOztFQUVwQyxDQUFDLElBQUksQ0FBQyxVQUFVLEdBQUc7RUFDbkIsRUFBRSxNQUFNLEVBQUUsTUFBTTtFQUNoQixFQUFFLE1BQU0sRUFBRSxNQUFNO0VBQ2hCLEVBQUUsQ0FBQzs7RUFFSCxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxJQUFJdzlDLDRCQUEwQixFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFDO0VBQzdFLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDOztFQUV0QixDQUFDOztBQUVERCx3QkFBb0IsQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRXY5QyxVQUFRLENBQUMsU0FBUyxFQUFFLENBQUM7QUFDckV1OUMsd0JBQW9CLENBQUMsU0FBUyxDQUFDLFdBQVcsR0FBR0Esc0JBQW9CLENBQUM7O0VBRWxFOztFQUVBLFNBQVNDLDRCQUEwQixFQUFFLE1BQU0sRUFBRSxNQUFNLEdBQUc7O0VBRXRELENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7RUFDcEMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDOztFQUVmLENBQUMsSUFBSSxRQUFRLEdBQUc7O0VBRWhCO0VBQ0EsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDO0VBQ2hDLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO0VBQzlCLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDO0VBQy9CLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7O0VBRTdCO0VBQ0EsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUM7RUFDOUIsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQzs7RUFFNUI7RUFDQSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztFQUM5QixHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDOztFQUU1QjtFQUNBLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDO0VBQzlCLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7RUFDNUIsRUFBRSxDQUFDOztFQUVILENBQUMsSUFBSSxPQUFPLEdBQUc7RUFDZixHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRTtFQUM1QyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxPQUFPLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRTtFQUM1QyxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQztFQUM1QyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRTtFQUM1QyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRTtFQUM1QyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRTtFQUM1QyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxPQUFPLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRTtFQUM1QyxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQztFQUM1QyxHQUFHLENB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RyxFQUFFLENBQUMsRUFBRSxDQUFDOztFQUVqQztFQUNBOztFQUVBLEdBQUcsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7RUFDN0MsR0FBRyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztFQUM3QyxHQUFHLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDOztFQUU3QyxHQUFHLFFBQVEsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7RUFFakQ7O0VBRUEsR0FBRyxNQUFNLENBQUMsVUFBVSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQzs7RUFFL0MsR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUM7O0VBRWhEOztFQUVBLEdBQUcsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLEdBQUcsZUFBZSxFQUFFLENBQUM7RUFDbkMsR0FBRyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxjQUFjLEVBQUUsQ0FBQzs7RUFFbEMsR0FBRzs7RUFFSCxFQUFFOztFQUVGOztFQUVBLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxlQUFlLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0VBRTNDLEVBQUUsTUFBTSxDQUFDLEdBQUcs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R0FBRyxFQUFFLENBQUMsRUFBRSxLQUFLLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUM7RUFDaEUsR0FBRyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsTUFBTSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxLQUFLLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUM7RUFDaEUsR0FBRyxNQUFNLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDOztFQUVuQyxHQUFHLFFBQVEsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7RUFFakQ7O0VBRUEsR0FBRyxNQUFNLENBQUMsQ0FBQyxHQUFHLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDO0VBQ3JDLEdBQUcsTUFBTSxDQUFDLENBQUMsR0FBRyxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQztFQUNyQyxHQUFHLE1BQU0sQ0FBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDOztFQUVuRCxHQUFHLE9BQU8sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7RUFFaEQ7O0VBRUEsR0FBRyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxlQUFlLEVBQUUsQ0FBQztFQUNuQyxHQUFHLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLGNBQWMsRUFBRSxDQUFDOztFQUVsQyxHQUFHOztFQUVILEVBQUU7O0VBRUY7O0VBRUEsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLGNBQWMsRUFBRSxDQUFDLEdBQUcs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QU8sR0FBRyxTQUFTLENBQUMsQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQzs7RUFFcEQsTUFBTTs7RUFFTixLQUFLLE1BQU07O0VBRVg7RUFDQSxLQUFLLEtBQUssU0FBUyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxHQUFHOztFQUV0QyxNQUFNLE9BQU8sR0FBRyxTQUFTLENBQUMsQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQztFQUNwRCxNQUFNLE9BQU8sR0FBRyxTQUFTLENBQUMsQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQzs7RUFFcEQsTUFBTSxNQUFNOztFQUVaLE1BQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQyxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDO0VBQ3BELE1BQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQyxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDOztFQUVwRCxNQUFNO0VBQ04sS0FBSyxLQUFLLFNBQVMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsR0FBRzs7RUFFdEMsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUM7RUFDcEQsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUM7O0VBRXBELE1BQU0sTUFBTTs7RUFFWixNQUFNLE9BQU8sR0FBRyxTQUFTLENBQUMsQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQztFQUNwRCxNQUFNLE9BQU8sR0FBRyxTQUFTLENBQUMsQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQzs7RUFFcEQsTUFBTTs7RUFFTixLQUFLO0VBQ0wsSUFBSSxLQUFLLFVBQVUsSUFBSSxVQUFVLEdBQUc7O0VBRXBDLEtBQUssS0FBSyxVQUFVLElBQUksVUFBVSxHQUFHLE9BQU8sRUFBRSxDQUFDO0VBQy9DLEtBQUssS0FBSyxV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QUFFLElBQUksR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDOzs7RUFHNUI7OztFQUdBLENBQUMsU0FBUyxXQUFXLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNLEdBQUc7O0VBRTlDO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFQSxFQUFFLElBQUksU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEdBQUcsQ0FBQyxDQUFDOztFQUUxQztFQUNBOztFQUVBLEVBQUUsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQztFQUNsQyxHQUFHLFFBQVEsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUM7RUFDaEMsRUFBRSxJQUFJLFFBQVEsR0FBRyxNQUFNLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO0VBQ2xDLEdBQUcsUUFBUSxHQUFHLE1BQU0sQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQzs7RUFFaEMsRUFBRSxJQUFJLFlBQVksS0FBSyxRQUFRLEdBQUcsUUFBUSxHQUFHLFFBQVEsR0FBRyxRQUFRLEVBQUUsQ0FBQzs7RUFFbkU7RUFDQSxFQUFFLElBQUksVUFBVSxLQUFLLFFBQVEsR0FBRyxRQUFRLEdBQUcsUUFBUSxHQUFHLFFBQVEsRUFBRSxDQUFDOztFQUVqRSxFQUFFLEtBQUssSUFBSSxDQUFDLEdBQUcsRUFBRSxVQUFVLEVBQUUsR0FBRyxNQUFNLENBQUMsT0FBTyxHQUFHOztFQUVqRDs7RUFFQTs7RUFFQSxHQUFHLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7RUFDOUMsR0FBRyxJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLFFBQVEsR0FBRyxRQUFRLEdBQUcsUUFBUSxHQUFHLFFBQVEsRUFBRSxDQUFDOztFQUUzRTs7RUFFQSxHQUFHLElBQUksYUFBYSxLQUFLLE1BQU0sQ0FBQyxDQUFDLEdBQUcsUUFBUSxHQUFHLFVBQVUsRUFB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QUFFLEtBQUssRUFBRSxhQUFhLEdBQUc7O0VBRXpCLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7RUFFMUIsR0FBRyxNQUFNOztFQUVUOztFQUVBLEdBQUcsTUFBTSxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQztFQUNuRSxHQUFHLFFBQVEsQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLFNBQVMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7O0VBRXZFLEdBQUcsU0FBUyxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxDQUFDOztFQUVuRSxHQUFHLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDOztFQUU5QyxHQUFHOztFQUVILEVBQUU7O0VBRUY7RUFDQTs7RUFFQSxDQUFDLElBQUksQ0FBQyxDQUFDOztFQUVQLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0VBRWpDLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0VBRWhDLEdBQUcsSUFBSSxHQUFHLFlBQVksR0FBRyxRQUFRLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxFQUFFLGlCQUFpQixFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7RUFFL0YsR0FBRyxLQUFLLEVBQUUsYUFBYSxH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QUUsQ0FBQztFQUN0QixJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEdBQUcsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsR0FBRyxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxHQUFHLE1BQU0sRUFBRSxDQUFDOztFQUVyRSxJQUFJOztFQUVKLEdBQUcsTUFBTTs7RUFFVDs7RUFFQSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsR0FBRyxHQUFHOztFQUVqQyxJQUFJLElBQUksR0FBRyxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUM7RUFDdEIsSUFBSSxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7RUFFMUMsSUFBSTs7RUFFSjs7RUFFQSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsR0FBRyxHQUFHOztFQUVqQyxJQUFJLElBQUksR0FBRyxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUM7RUFDdEIsSUFBSSxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxHQUFHLElBQUksR0FBRyxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxHQUFHLElBQUksR0FBRyxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxHQUFHLElBQUksR0FBRyxLQUFLLEVBQUUsQ0FBQzs7RUFFdkYsSUFBSTs7RUFFSixHQUFHOztFQUVILEVBQUUsS0FBSyxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxRQUFRLEtBQUssU0FBUyxHQUFHLE9BQU8sQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUM7O0VBRS9HLEVBQUU7O0VBRUY7O0VBRUEsQ0FBQyxTQUFTLGNBQWMsR0FB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QUFNLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0VBRWxEOztFQUVBLEdBQUcsTUFBTSxDQUFDLENBQUMsR0FBRyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztFQUNsQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLEdBQUcsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztFQUM1QixHQUFHLE1BQU0sQ0FBQyxDQUFDLEdBQUcsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7O0VBRWxDLEdBQUcsUUFBUSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDOztFQUVqRDs7RUFFQSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQztFQUN2QixHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7O0VBRXBDLEdBQUcsR0FBRyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7O0VBRzFCLEdBQUc7O0VBRUgsRUFBRTs7RUFFRjs7RUFFQSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxFQUFFLENBQUMsR0FBRyxHQUFHOztFQUVuQyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEtBQUssTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRzs7RUFFakQsR0FBRyxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDOztFQUVoQyxHQUFHLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQztFQUNoQixHQUFHLElBQUksQ0FBQyxHQUFHLElBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0VBQ2hDLEdBQUcsSUFBSSxDQUFDLEdBQUcsSUFBSSxHQUFHLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0VBQ3BDLEdBQUcsSUFBSSxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQzs7RUFFcEI7O0VBRUEsR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7RUFDM0IsR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0VBRTNCLEdBQUc7O0VBRUgsRUFBRTs7RUFFRjs7RUFFQSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLENBQUM7RUFDMUIsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLFVBQVUsRUFBRSxJQUFJOGhDLHdCQUFzQixFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO0VBQzVFLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLEVBQUUsSUFBSUEsd0JBQXNCLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7O0VBRWpFOztFQUVBLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7O0VBRTdCO0VBQ0E7O0VBRUEsQ0FBQyxLQUFLLFNBQVMsS0FBSyxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRzs7RUFFbEMsRUFBRSxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7RUFDN0MsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJN3ZCLFNBQU8sRUFBRSxDQUFDO0VBQ3pCLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSUEsU0FBTyxFQUFFLENBQUM7RUFDekIsRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJQSxTQUFPLEVBQUUsQ0FBQzs7RUFFeEI7O0VBRUEsRUFBRSxJQUFJLEdBQUcsUUFBUSxHQUFHLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDOztFQUV0QyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUc7O0VBRXhEOztFQUVBLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO0VBQzNCLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO0VBQzNCLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDOztFQUUzQjs7RUFFQSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsT0FBTyxFQUFFLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7RUFDbEMsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLE9BQU8sRUFBRSxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO0VBQ2xDLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxPQUFPLEVBQUUsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQzs7RUFFbEM7O0VBRUEsR0FBRyxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQzs7RUFFdEM7O0VBRUEsR0FBRyxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLE9BQU8sRUFBRSxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDcEQsR0FBRyxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLE9BQU8sRUFBRSxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDcEQsR0FB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LEVBQUUsWUFBWSxHQUFHLFNBQVMsS0FBSyxNQUFNLENBQUM7O0VBRXBEOztFQUVBLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxjQUFjLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0VBRTNDLEdBQUcsSUFBSSxRQUFRLEdBQUcsRUFBRSxDQUFDOztFQUVyQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxjQUFjLENBQUM7O0VBRTlCOztFQUVBLEdBQUcsSUFBSSxNQUFNLEdBQUcsQ0FBQyxLQUFLLFlBQVksR0FBRyxTQUFTLEVBQUUsR0FBRyxTQUFTLENBQUM7O0VBRTdELEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxjQUFjLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0VBRTVDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLGNBQWMsQ0FBQzs7RUFFL0IsSUFBSSxJQUFJLEtBQUssR0FBRyxDQUFDLEdBQUcsV0FBVyxHQUFHLFVBQVUsQ0FBQzs7RUFFN0MsSUFBSSxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDO0VBQ3JDLElBQUksSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQzs7RUFFckM7O0VBRUEsSUFBSSxNQUFNLENBQUMsQ0FBQyxHQUFHLE1BQU0sR0FBRyxRQUFRLENBQUM7RUFDakMsSUFBSSxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLE1BQU0sR0FBRyxVQUFVLENBQUM7RUFDekMsSUFBSSxNQUFNLENBQUMsQ0FBQyxHQUFHLE1BQU0sR0FBRyxRQUFRLENBQUM7RUFDakMsSUFBSSxRQUFRLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUM7O0VBRWxEOztFQUVBLElBQUksTUFBTSxDQUFDLEdBQUcsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDO0VBQ3hELElBQUksT0FBTyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDOztFQUVqRDs7RUFFQSxJQUFJLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQzs7RUFFekI7O0VBRUEsSUFBSSxRQUFRLENBQUMsSUFBSSxFQUFFLEtBQUssR0FBRyxFQUFFLENBQUM7O0VBRTlCLElBQUk7O0VBRUo7O0VBRUEsR0FBRyxVQUFVLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDOztFQUUvQixHQUFHOztFQUVIOztFQUVBLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxjQUFjLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0VBRTFDLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxjQUFjLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0VBRTNDOztFQUVBLElBQUksSUFBSSxDQUFDLEdBQUcsVUFBVSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0VBQ2pDLElBQUksSUFBSSxDQUFDLEdBQUcsVUFBVSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztFQUNyQyxJQUFJLElBQUksQ0FBQyxHQUFHLFVBQVUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO0VBQ3pDLElBQUksSUFBSSxDQUFDLEdBQUcsVUFBVSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQzs7RUFFckM7O0VBRUEsSUFBSSxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7RUFDNUIsSUFBSSxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0VBRTVCOztFQUVBLElBQUksVUFBVSxJQUFJLENBQUMsQ0FBQzs7RUFFcEIsSUFBSTs7RUFFSixHQUFHOztFQUVIOztFQUVBLEVBQUUsS0FBSyxDQUFDLFFBQVEsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxDQUFDOztFQUU5Qzs7RUFFQSxFQUFFLFVBQVUsSUFBSSxVQUFVLENBQUM7O0VBRTNCLEVBQUU7O0VBRUYsQ0FBQyxTQUFTLFdBQVcsRUFBRSxHQUFHLEdBQUc7O0VBRTdCLEVBQUUsSUFBSSxDQUFDLEVBQUUsZ0JBQWdCLEVBQUUsY0FBYyxDQUFDOztFQUUxQyxFQUFFLElBQUksRUFBRSxHQUFHLElBQUlqUyxTQUFPLEVBQUUsQ0FBQztFQUN6QixFQUFFLElBQUksTUFBTSxHQUFHLElBQUlpUyxTQUFPLEVBQUUsQ0FBQzs7RUFFN0IsRUFBRSxJQUFJLFVBQVUsR0FBRyxDQUFDLENBQUM7O0VBRXJCLEVBQUUsSUFBSSxNQUFNLEdBQUcsRUFBRSxHQUFHLEtBQUssSUFBSSxLQUFLLFNBQVMsR0FBRyxZQUFZLENBQUM7RUFDM0QsRUFBRSxJQUFJLElBQUksR0FBRyxFQUFFLEdBQUcsS0FBSyxJQUFJLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDOztFQUV4QztFQUNBLEVBQUUsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDOztFQUUzQjtFQUNBO0VBQ0E7O0VBRUEsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLGNBQWMsRUFBRSxDQUFDLEdBQUcsR0FBRzs7RUFFM0M7O0VBRUEsR0FBRyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxVQUFVLEdBQUcsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDOztFQUU1Qzs7RUFFQSxHQUFHLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQzs7RUFFOUI7O0VBRUEsR0FBRyxHQUFHLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQzs7RUFFeEI7O0VBRUEsR0FBRyxLQUFLLEdBQUcsQ0FBQzs7RUFFWixHQUFHOztFQUVIOztFQUVBLEVBQUUsY0FBYyxHQUFHLEtBQUssQ0FBQzs7RUFFekI7O0VBRUEsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLGNBQWMsRUFBRSxDQUFDLEdBQUcsR0FBRzs7RUFFM0MsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsY0FBYyxDQUFDO0VBQzlCLEdBQUcsSUFBSSxLQUFLLEdBQUcsQ0FBQyxHQUFHLFdBQVcsR0FBRyxVQUFVLENBQUM7O0VBRTVDLEdBQUcsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQztFQUNwQyxHQUFHLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUM7O0VBRXBDOztFQUVBLEdBQUcsTUFBTSxDQUFDLENBQUMsR0FBRyxNQUFNLEdBQUcsUUFBUSxDQUFDO0VBQ2hDLEdBQUcsTUFBTSxDQUFDLENBQUMsR0FBRyxVQUFVLEdBQUcsSUFBSSxDQUFDO0VBQ2hDLEdBQUcsTUFBTSxDQUFDLENBQUMsR0FBRyxNQUFNLEdBQUcsUUFBUSxDQUFDO0VBQ2hDLEdBQUcsUUFBUSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDOztFQUVqRDs7RUFFQSxHQUFHLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQzs7RUFFOUI7O0VBRUEsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsUUFBUSxHQUFHLEdBQUcsS0FBSyxHQUFHLENBQUM7RUFDbkMsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsUUFBUSxHQUFHLEdBQUcsR0FBRyxJQUFJLEtBQUssR0FBRyxDQUFDO0VBQzFDLEdBQUcsR0FBRyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7RUFFMUI7O0VBRUEsR0FBRyxLQUFLLEdBQUcsQ0FBQzs7RUFFWixHQUFHOztFQUVIOztFQUVBLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxjQUFjLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0VBRTFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO0VBQ2hDLEdBQUcsSUFBSSxDQUFDLEdBQUcsY0FBYyxHQUFHLENBQUMsQ0FBQzs7RUFFOUIsR0FBRyxLQUFLLEdBQUcsS0FBSyxJQUFJLEdBQUc7O0VBRXZCOztFQUVBLElBQUksT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7RUFFaEMsSUFBSSxNQUFNOztFQUVWOztFQUVBLElBQUksT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7RUFFaEMsSUFBSTs7RUFFSixHQUFHLFVBQVUsSUFBSSxDQUFDLENBQUM7O0VBRW5CLEdBQUc7O0VBRUg7O0VBRUEsRUFBRSxLQUFLLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsR0FBRyxLQUFLLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7O0VBRWpFOztFQUVBLEVBQUUsVUFBVSxJQUFJLFVBQVUsQ0FBQzs7RUFFM0IsRUFBRTs7RUFFRixDQUFDOztBQUVEeTFFLDBCQUFzQixDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFNWtELGdCQUFjLENBQUMsU0FBUyxFQUFFLENBQUM7QUFDN0U0a0QsMEJBQXNCLENBQUMsU0FBUyxDQUFDLFdBQVcsR0FBR0Esd0JBQXNCLENBQUM7O0VBRXRFO0VBQ0E7RUFDQTs7RUFFQTs7RUFFQSxTQUFTQyxjQUFZLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsV0FBVyxHQUFHOztFQUU1RyxDQUFDWCxrQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsQ0FBQzs7RUFFdEgsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLGNBQWMsQ0FBQzs7RUFFNUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxHQUFHO0VBQ25CLEVBQUUsTUFBTSxFQUFFLE1BQU07RUFDaEIsRUFBRSxNQUFNLEVBQUUsTUFBTTtFQUNoQixFQUFFLGNBQWMsRUFBRSxjQUFjO0VBQ2hDLEVBQUUsY0FBYyxFQUFFLGNBQWM7RUFDaEMsRUFBRSxTQUFTLEVBQUUsU0FBUztFQUN0QixFQUFFLFVBQVUsRUFBRSxVQUFVO0VBQ3hCLEVBQUUsV0FBVyxFQUFFLFdBQVc7RUFDMUIsRUFBRSxDQUFDOztFQUVILENBQUM7O0FBRURXLGdCQUFZLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUVYLGtCQUFnQixDQUFDLFNBQVMsRUFBRSxDQUFDO0FBQ3JFVyxnQkFBWSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEdBQUdBLGNBQVksQ0FBQzs7RUFFbEQ7O0VBRUEsU0FBU0Msb0JBQWtCLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsV0FBVyxHQUFHOztFQUVsSCxDQUFDRix3QkFBc0IsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsQ0FBQzs7RUFFNUgsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLG9CQUFvQixDQUFDOztFQUVsQyxDQUFDLElBQUksQ0FBQyxVQUFVLEdBQUc7RUFDbkIsRUFBRSxNQUFNLEVBQUUsTUFBTTtFQUNoQixFQUFFLE1BQU0sRUFBRSxNQUFNO0VBQ2hCLEVBQUUsY0FBYyxFQUFFLGNBQWM7RUFDaEMsRUFBRSxjQUFjLEVBQUUsY0FBYztFQUNoQyxFQUFFLFNBQVMsRUFBRSxTQUFTO0VBQ3RCLEVBQUUsVUFBVSxFQUFFLFVBQVU7RUFDeEIsRUFBRSxXQUFXLEVBQUUsV0FBVztFQUMxQixFQUFFLENBQUM7O0VBRUgsQ0FBQzs7QUFFREUsc0JBQWtCLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUVGLHdCQUFzQixDQUFDLFNBQVMsRUFBRSxDQUFDO0FBQ2pGRSxzQkFBa0IsQ0FBQyxTQUFTLENBQUMsV0FBVyxHQUFHQSxvQkFBa0IsQ0FBQzs7RUFFOUQ7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFQTs7RUFFQSxTQUFTQyxnQkFBYyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLFdBQVcsR0FBRzs7RUFFckUsQ0FBQ2x0RCxVQUFRLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDOztFQUV2QixDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsZ0JBQWdCLENBQUM7O0VBRTlCLENBQUMsSUFBSSxDQUFDLFVBQVUsR0FBRztFQUNuQixFQUFFLE1BQU0sRUFBRSxNQUFNO0VBQ2hCLEVBQUUsUUFBUSxFQUFFLFFBQVE7RUFDcEIsRUFBRSxVQUFVLEVBQUUsVUFBVTtFQUN4QixFQUFFLFdBQVcsRUFBRSxXQUFXO0VBQzFCLEVBQUUsQ0FBQzs7RUFFSCxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxJQUFJbXRELHNCQUFvQixFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxFQUFFLENBQUM7RUFDbEcsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7O0VBRXRCLENBQUM7O0FBRURELGtCQUFjLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUVsdEQsVUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDO0FBQy9Ea3RELGtCQUFjLENBQUMsU0FBUyxDQUFDLFdBQVcsR0FBR0EsZ0JBQWMsQ0FBQzs7RUFFdEQ7O0VBRUEsU0FBU0Msc0JBQW9CLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsV0FBVyxHQUFHOztFQUUzRSxDQUFDaGxELGdCQUFjLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDOztFQUU3QixDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsc0JBQXNCLENBQUM7O0VBRXBDLENBQUMsSUFBSSxDQUFDLFVBQVUsR0FBRztFQUNuQixFQUFFLE1BQU0sRUFBRSxNQUFNO0VBQ2hCLEVBQUUsUUFBUSxFQUFFLFFBQVE7RUFDcEIsRUFBRSxVQUFVLEVBQUUsVUFBVTtFQUN4QixFQUFFLFdBQVcsRUFBRSxXQUFXO0VBQzFCLEVBQUUsQ0FBQzs7RUFFSCxDQUFDLE1BQU0sR0FBRyxNQUFNLElBQUksRUFBRSxDQUFDO0VBQ3ZCLENBQUMsUUFBUSxHQUFHLFFBQVEsS0FBSyxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDOztFQUVqRSxDQUFDLFVBQVUsR0FBRyxVQUFVLEtBQUssU0FBUyxHQUFHLFVBQVUsR0FBRyxDQUFDLENBQUM7RUFDeEQsQ0FBQyxXQUFXLEdBQUcsV0FBVyxLQUFLLFNBQVMsR0FBRyxXQUFXLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7O0VBRXJFOztFQUVBLENBQUMsSUFBSSxPQUFPLEdBQUcsRUFBRSxDQUFDO0VBQ2xCLENBQUMsSUFBSSxRQUFRLEdBQUcsRUFBRSxDQUFDO0VBQ25CLENBQUMsSUFBSSxPQUFPLEdBQUcsRUFBRSxDQUFDO0VBQ2xCLENBQUMsSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDOztFQUVkOztFQUVBLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0VBQ1YsQ0FBQyxJQUFJLE1BQU0sR0FBRyxJQUFJN3dCLFNBQU8sRUFBRSxDQUFDO0VBQzVCLENBQUMsSUFBSSxFQUFFLEdBQUcsSUFBSWpTLFNBQU8sRUFBRSxDQUFDOztFQUV4Qjs7RUFFQSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztFQUMxQixDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztFQUN6QixDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDOztFQUV0QixDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxRQUFRLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRzs7RUFFbkQsRUFBRSxJQUFJLE9BQU8sR0FBRyxVQUFVLEdBQUcsQ0FBQyxHQUFHLFFBQVEsR0FBRyxXQUFXLENBQUM7O0VBRXhEOztFQUVBLEVBQUUsTUFBTSxDQUFDLENBQUMsR0FBRyxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUUsQ0FBQztFQUMxQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEdBQUcsTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLENBQUM7O0VBRTFDLEVBQUUsUUFBUSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDOztFQUVoRDs7RUFFQSxFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7RUFFMUI7O0VBRUEsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxHQUFHLE1BQU0sR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0VBQzVDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsTUFBTSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7O0VBRWhELEVBQUUsR0FBRyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7RUFFekIsRUFBRTs7RUFFRjs7RUFFQSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksUUFBUSxFQUFFLENBQUMsR0FBRyxHQUFHOztFQUVwQyxFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0VBRTlCLEVBQUU7O0VBRUY7O0VBRUEsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxDQUFDO0VBQzFCLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxVQUFVLEVBQUUsSUFBSThoQyx3QkFBc0IsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztFQUM1RSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsUUFBUSxFQUFFLElBQUlBLHdCQUFzQixFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO0VBQ3pFLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLEVBQUUsSUFBSUEsd0JBQXNCLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7O0VBRWpFLENBQUM7O0FBRURnbUQsd0JBQW9CLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUVobEQsZ0JBQWMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztBQUMzRWdsRCx3QkFBb0IsQ0FBQyxTQUFTLENBQUMsV0FBVyxHQUFHQSxzQkFBb0IsQ0FBQzs7OztFQUlsRSxJQUFJbTZELFlBQVUsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0VBQy9CLENBQUMsaUJBQWlCLEVBQUVuc0UsbUJBQWlCO0VBQ3JDLENBQUMsa0JBQWtCLEVBQUVJLG9CQUFrQjtFQUN2QyxDQUFDLHdCQUF3QixFQUFFSSwwQkFBd0I7RUFDbkQsQ0FBQyxtQkFBbUIsRUFBRXNCLHFCQUFtQjtFQUN6QyxDQUFDLHlCQUF5QixFQUFFQywyQkFBeUI7RUFDckQsQ0FBQyxrQkFBa0IsRUFBRUMsb0JBQWtCO0VBQ3ZDLENBQUMsd0JBQXdCLEVBQUVDLDBCQUF3QjtFQUNuRCxDQUFDLG1CQUFtQixFQUFFQyxxQkFBbUI7RUFDekMsQ0FBQyx5QkFBeUIsRUFBRUMsMkJBQXlCO0VBQ3JELENBQUMsb0JBQW9CLEVBQUVDLHNCQUFvQjtFQUMzQyxDQUFDLDBCQUEwQixFQUFFQyw0QkFBMEI7RUFDdkQsQ0FBQyxrQkFBa0IsRUFBRTNCLG9CQUFrQjtFQUN2QyxDQUFDLHdCQUF3QixFQUFFbUIsMEJBQXdCO0VBQ25ELENBQUMsWUFBWSxFQUFFZ0IsY0FBWTtFQUMzQixDQUFDLGtCQUFrQixFQUFFUSxvQkFBa0I7RUFDdkMsQ0FBQyxpQkFBaUIsRUFBRUcsbUJBQWlCO0VBQ3JDLENBQUMsdUJBQXVCLEVBQUVRLHlCQUF1QjtFQUNqRCxDQUFDLGFBQWEsRUFBRUUsZUFBYTtFQUM3QixDQUFDLG1CQUFtQixFQUFFQyxxQkFBbUI7RUFDekMsQ0FBQyxZQUFZLEVBQUVrSyxjQUFZO0VBQzNCLENBQUMsa0JBQWtCLEVBQUVJLG9CQUFrQjtFQUN2QyxDQUFDLGNBQWMsRUFBRUssZ0JBQWM7RUFDL0IsQ0FBQyxvQkFBb0IsRUFBRUksc0JBQW9CO0VBQzNDLENBQUMsWUFBWSxFQUFFSyxjQUFZO0VBQzNCLENBQUMsa0JBQWtCLEVBQUVJLG9CQUFrQjtFQUN2QyxDQUFDLGFBQWEsRUFBRXYvQyxlQUFhO0VBQzdCLENBQUMsbUJBQW1CLEVBQUVLLHFCQUFtQjtFQUN6QyxDQUFDLGFBQWEsRUFBRW8vQyxlQUFhO0VBQzdCLENBQUMsbUJBQW1CLEVBQUVLLHFCQUFtQjtFQUN6QyxDQUFDLGFBQWEsRUFBRUMsZUFBYTtFQUM3QixDQUFDLG1CQUFtQixFQUFFSyxxQkFBbUI7RUFDekMsQ0FBQyxlQUFlLEVBQUU5SCxpQkFBZTtFQUNqQyxDQUFDLHFCQUFxQixFQUFFeUUsdUJBQXFCO0VBQzdDLENBQUMsYUFBYSxFQUFFMkQsZUFBYTtFQUM3QixDQUFDLFlBQVksRUFBRWUsY0FBWTtFQUMzQixDQUFDLGtCQUFrQixFQUFFQyxvQkFBa0I7RUFDdkMsQ0FBQyxnQkFBZ0IsRUFBRVosa0JBQWdCO0VBQ25DLENBQUMsc0JBQXNCLEVBQUVVLHdCQUFzQjtFQUMvQyxDQUFDLGNBQWMsRUFBRUcsZ0JBQWM7RUFDL0IsQ0FBQyxvQkFBb0IsRUFBRUMsc0JBQW9CO0VBQzNDLENBQUMsV0FBVyxFQUFFOWlELGFBQVc7RUFDekIsQ0FBQyxpQkFBaUIsRUFBRWlCLG1CQUFpQjtFQUNyQyxDQUFDLENBQUMsQ0FBQzs7RUFFSDtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFQSxTQUFTK2QsZ0JBQWMsRUFBRSxVQUFVLEdBQUc7O0VBRXRDLENBQUN2WixnQkFBYyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUU7RUFDNUIsRUFBRSxRQUFRLEVBQUUvYSxlQUFhLENBQUMsS0FBSyxFQUFFO0VBQ2pDLEdBQUdDLGFBQVcsQ0FBQyxNQUFNO0VBQ3JCLEdBQUc7RUFDSCxJQUFJLE9BQU8sRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUU7RUFDM0IsSUFBSTtFQUNKLEdBQUcsRUFBRTtFQUNMLEVBQUUsWUFBWSxFQUFFRSxhQUFXLEVBQUUsYUFBYSxFQUFFO0VBQzVDLEVBQUUsY0FBYyxFQUFFQSxhQUFXLEVBQUUsYUFBYSxFQUFFO0VBQzlDLEVBQUUsRUFBRSxDQUFDOztFQUVMLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7RUFDcEIsQ0FBQyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQzs7RUFFekIsQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxFQUFFO0VBQ2hDLEVBQUUsT0FBTyxFQUFFO0VBQ1gsR0FBRyxVQUFVLEVBQUUsSUFBSTtFQUNuQixHQUFHLEdBQUcsRUFBRSxZQUFZO0VBQ3BCLElBQUksT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7RUFDdkMsSUFBSTtFQUNKLEdBQUcsR0FBRyxFQUFFLFdBQVcsS0FBSyxHQUFHO0VBQzNCLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztFQUN4QyxJQUFJO0VBQ0osR0FBRztFQUNILEVBQUUsRUFBRSxDQUFDOztFQUVMLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxVQUFVLEVBQUUsQ0FBQzs7RUFFOUIsQ0FBQzs7QUFFRG0wQixrQkFBYyxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFdlosZ0JBQWMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztBQUNyRXVaLGtCQUFjLENBQUMsU0FBUyxDQUFDLFdBQVcsR0FBR0EsZ0JBQWMsQ0FBQzs7QUFFdERBLGtCQUFjLENBQUMsU0FBUyxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQzs7RUFFakQ7RUFDQTtFQUNBOztFQUVBLFNBQVNna0MsbUJBQWlCLEVBQUUsVUFBVSxHQUFHOztFQUV6QyxDQUFDdjlDLGdCQUFjLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsQ0FBQzs7RUFFekMsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLG1CQUFtQixDQUFDOztFQUVqQyxDQUFDOztBQUVEdTlDLHFCQUFpQixDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFdjlDLGdCQUFjLENBQUMsU0FBUyxFQUFFLENBQUM7QUFDeEV1OUMscUJBQWlCLENBQUMsU0FBUyxDQUFDLFdBQVcsR0FBR0EsbUJBQWlCLENBQUM7O0FBRTVEQSxxQkFBaUIsQ0FBQyxTQUFTLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDOztFQUV2RDtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVBLFNBQVNya0Msc0JBQW9CLEVBQUUsVUFBVSxHQUFHOztFQUU1QyxDQUFDbGIsVUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQzs7RUFFdkIsQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBRSxDQUFDOztFQUVuQyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsc0JBQXNCLENBQUM7O0VBRXBDLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJbGYsT0FBSyxFQUFFLFFBQVEsRUFBRSxDQUFDO0VBQ3BDLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxHQUFHLENBQUM7RUFDdEIsQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLEdBQUcsQ0FBQzs7RUFFdEIsQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQzs7RUFFakIsQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztFQUN0QixDQUFDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxHQUFHLENBQUM7O0VBRTlCLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7RUFDbkIsQ0FBQyxJQUFJLENBQUMsY0FBYyxHQUFHLEdBQUcsQ0FBQzs7RUFFM0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUlBLE9BQUssRUFBRSxRQUFRLEVBQUUsQ0FBQztFQUN2QyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxHQUFHLENBQUM7RUFDOUIsQ0FBQyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQzs7RUFFekIsQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztFQUNyQixDQUFDLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDOztFQUVwQixDQUFDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO0VBQ3ZCLENBQUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJdnBCLFNBQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0VBRXhDLENBQUMsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7RUFDN0IsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsQ0FBQyxDQUFDO0VBQzVCLENBQUMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLENBQUMsQ0FBQzs7RUFFM0IsQ0FBQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQzs7RUFFMUIsQ0FBQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQzs7RUFFMUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQzs7RUFFdEIsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztFQUNwQixDQUFDLElBQUksQ0FBQyxlQUFlLEdBQUcsR0FBRyxDQUFDOztFQUU1QixDQUFDLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDOztFQUU3QixDQUFDLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO0VBQ3hCLENBQUMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLENBQUMsQ0FBQztFQUM3QixDQUFDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxPQUFPLENBQUM7RUFDakMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsT0FBTyxDQUFDOztFQUVsQyxDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO0VBQ3ZCLENBQUMsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7RUFDM0IsQ0FBQyxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQzs7RUFFM0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxDQUFDOztFQUU5QixDQUFDOztBQUVEMmpELHdCQUFvQixDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFbGIsVUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDO0FBQ3JFa2Isd0JBQW9CLENBQUMsU0FBUyxDQUFDLFdBQVcsR0FBR0Esc0JBQW9CLENBQUM7O0FBRWxFQSx3QkFBb0IsQ0FBQyxTQUFTLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxDQUFDOztBQUU3REEsd0JBQW9CLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRyxXQUFXLE1BQU0sR0FBRzs7RUFFMUQsQ0FBQ2xiLFVBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7O0VBRTlDLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsQ0FBQzs7RUFFbkMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7RUFDakMsQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUM7RUFDbkMsQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUM7O0VBRW5DLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDOztFQUV2QixDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQztFQUNqQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUM7O0VBRW5ELENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDO0VBQzNCLENBQUMsSUFBSSxDQUFDLGNBQWMsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDOztFQUU3QyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztFQUN2QyxDQUFDLElBQUksQ0FBQyxXQUFXLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQztFQUN2QyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUM7O0VBRW5ELENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDO0VBQy9CLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDOztFQUVuQyxDQUFDLElBQUksQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQztFQUNuQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQzs7RUFFN0MsQ0FBQyxJQUFJLENBQUMsZUFBZSxHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUM7RUFDL0MsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDO0VBQ25ELENBQUMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQzs7RUFFakQsQ0FBQyxJQUFJLENBQUMsWUFBWSxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUM7O0VBRXpDLENBQUMsSUFBSSxDQUFDLFlBQVksR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDOztFQUV6QyxDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQzs7RUFFakMsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7RUFDN0IsQ0FBQyxJQUFJLENBQUMsZUFBZSxHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUM7O0VBRS9DLENBQUMsSUFBSSxDQUFDLGVBQWUsR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDOztFQUUvQyxDQUFDLElBQUksQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQztFQUNuQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxNQUFNLENBQUMsa0JBQWtCLENBQUM7RUFDckQsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDO0VBQ2pELENBQUMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQzs7RUFFbkQsQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUM7RUFDakMsQ0FBQyxJQUFJLENBQUMsWUFBWSxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUM7RUFDekMsQ0FBQyxJQUFJLENBQUMsWUFBWSxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUM7O0VBRXpDLENBQUMsT0FBTyxJQUFJLENBQUM7O0VBRWIsQ0FBQyxDQUFDOztFQUVGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVBLFNBQVNtYixzQkFBb0IsRUFBRSxVQUFVLEdBQUc7O0VBRTVDLENBQUNELHNCQUFvQixDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQzs7RUFFbkMsQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBRSxDQUFDOztFQUVuQyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsc0JBQXNCLENBQUM7O0VBRXBDLENBQUMsSUFBSSxDQUFDLFlBQVksR0FBRyxHQUFHLENBQUM7O0VBRXpCLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxHQUFHLENBQUM7RUFDdEIsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsR0FBRyxDQUFDOztFQUUvQixDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsVUFBVSxFQUFFLENBQUM7O0VBRTlCLENBQUM7O0FBRURDLHdCQUFvQixDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFRCxzQkFBb0IsQ0FBQyxTQUFTLEVBQUUsQ0FBQztBQUNqRkMsd0JBQW9CLENBQUMsU0FBUyxDQUFDLFdBQVcsR0FBR0Esc0JBQW9CLENBQUM7O0FBRWxFQSx3QkFBb0IsQ0FBQyxTQUFTLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxDQUFDOztBQUU3REEsd0JBQW9CLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRyxXQUFXLE1BQU0sR0FBRzs7RUFFMUQsQ0FBQ0Qsc0JBQW9CLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDOztFQUUxRCxDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLENBQUM7O0VBRW5DLENBQUMsSUFBSSxDQUFDLFlBQVksR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDOztFQUV6QyxDQUFDLElBQUksQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQztFQUNuQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxNQUFNLENBQUMsa0JBQWtCLENBQUM7O0VBRXJELENBQUMsT0FBTyxJQUFJLENBQUM7O0VBRWIsQ0FBQyxDQUFDOztFQUVGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVBLFNBQVNGLG1CQUFpQixFQUFFLFVBQVUsR0FBRzs7RUFFekMsQ0FBQ2hiLFVBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7O0VBRXZCLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxtQkFBbUIsQ0FBQzs7RUFFakMsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUlsZixPQUFLLEVBQUUsUUFBUSxFQUFFLENBQUM7RUFDcEMsQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUlBLE9BQUssRUFBRSxRQUFRLEVBQUUsQ0FBQztFQUN2QyxDQUFDLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDOztFQUVyQixDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDOztFQUVqQixDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO0VBQ3RCLENBQUMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEdBQUcsQ0FBQzs7RUFFOUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztFQUNuQixDQUFDLElBQUksQ0FBQyxjQUFjLEdBQUcsR0FBRyxDQUFDOztFQUUzQixDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSUEsT0FBSyxFQUFFLFFBQVEsRUFBRSxDQUFDO0VBQ3ZDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEdBQUcsQ0FBQztFQUM5QixDQUFDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDOztFQUV6QixDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO0VBQ3JCLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7O0VBRXBCLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7RUFDdkIsQ0FBQyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUl2cEIsU0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7RUFFeEMsQ0FBQyxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztFQUM3QixDQUFDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxDQUFDLENBQUM7RUFDNUIsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDOztFQUUzQixDQUFDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDOztFQUV6QixDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDOztFQUV0QixDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO0VBQ3BCLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRzZwQyxtQkFBaUIsQ0FBQztFQUNsQyxDQUFDLElBQUksQ0FBQyxZQUFZLEdBQUcsQ0FBQyxDQUFDO0VBQ3ZCLENBQUMsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7O0VBRTdCLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7RUFDeEIsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsQ0FBQyxDQUFDO0VBQzdCLENBQUMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLE9BQU8sQ0FBQztFQUNqQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxPQUFPLENBQUM7O0VBRWxDLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7RUFDdkIsQ0FBQyxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztFQUMzQixDQUFDLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDOztFQUUzQixDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsVUFBVSxFQUFFLENBQUM7O0VBRTlCLENBQUM7O0FBRUQ0WixxQkFBaUIsQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRWhiLFVBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQztBQUNsRWdiLHFCQUFpQixDQUFDLFNBQVMsQ0FBQyxXQUFXLEdBQUdBLG1CQUFpQixDQUFDOztBQUU1REEscUJBQWlCLENBQUMsU0FBUyxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQzs7QUFFdkRBLHFCQUFpQixDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUcsV0FBVyxNQUFNLEdBQUc7O0VBRXZELENBQUNoYixVQUFRLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDOztFQUU5QyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztFQUNqQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztFQUN2QyxDQUFDLElBQUksQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQzs7RUFFbkMsQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUM7O0VBRXZCLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDO0VBQ2pDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQzs7RUFFbkQsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUM7RUFDM0IsQ0FBQyxJQUFJLENBQUMsY0FBYyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUM7O0VBRTdDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO0VBQ3ZDLENBQUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDO0VBQ3ZDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQzs7RUFFbkQsQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUM7RUFDL0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUM7O0VBRW5DLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDO0VBQ25DLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDOztFQUU3QyxDQUFDLElBQUksQ0FBQyxlQUFlLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQztFQUMvQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUM7RUFDbkQsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDOztFQUVqRCxDQUFDLElBQUksQ0FBQyxXQUFXLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQzs7RUFFdkMsQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUM7O0VBRWpDLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0VBQzdCLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDO0VBQy9CLENBQUMsSUFBSSxDQUFDLFlBQVksR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDO0VBQ3pDLENBQUMsSUFBSSxDQUFDLGVBQWUsR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDOztFQUUvQyxDQUFDLElBQUksQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQztFQUNuQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxNQUFNLENBQUMsa0JBQWtCLENBQUM7RUFDckQsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDO0VBQ2pELENBQUMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQzs7RUFFbkQsQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUM7RUFDakMsQ0FBQyxJQUFJLENBQUMsWUFBWSxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUM7RUFDekMsQ0FBQyxJQUFJLENBQUMsWUFBWSxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUM7O0VBRXpDLENBQUMsT0FBTyxJQUFJLENBQUM7O0VBRWIsQ0FBQyxDQUFDOztFQUVGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVBLFNBQVNpYixrQkFBZ0IsRUFBRSxVQUFVLEdBQUc7O0VBRXhDLENBQUNELG1CQUFpQixDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQzs7RUFFaEMsQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxDQUFDOztFQUUvQixDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsa0JBQWtCLENBQUM7O0VBRWhDLENBQUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7O0VBRXpCLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxVQUFVLEVBQUUsQ0FBQzs7RUFFOUIsQ0FBQzs7QUFFREMsb0JBQWdCLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUVELG1CQUFpQixDQUFDLFNBQVMsRUFBRSxDQUFDO0FBQzFFQyxvQkFBZ0IsQ0FBQyxTQUFTLENBQUMsV0FBVyxHQUFHQSxrQkFBZ0IsQ0FBQzs7QUFFMURBLG9CQUFnQixDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUM7O0FBRXJEQSxvQkFBZ0IsQ0FBQyxTQUFTLENBQUMsSUFBSSxHQUFHLFdBQVcsTUFBTSxHQUFHOztFQUV0RCxDQUFDRCxtQkFBaUIsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7O0VBRXZELENBQUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDOztFQUV2QyxDQUFDLE9BQU8sSUFBSSxDQUFDOztFQUViLENBQUMsQ0FBQzs7RUFFRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFQSxTQUFTRixvQkFBa0IsRUFBRSxVQUFVLEdBQUc7O0VBRTFDLENBQUM5YSxVQUFRLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsQ0FBQzs7RUFFbkMsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLG9CQUFvQixDQUFDOztFQUVsQyxDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO0VBQ3JCLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7O0VBRXBCLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7RUFDdkIsQ0FBQyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUl6b0MsU0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7RUFFeEMsQ0FBQyxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztFQUM3QixDQUFDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxDQUFDLENBQUM7RUFDNUIsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDOztFQUUzQixDQUFDLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO0VBQ3hCLENBQUMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLENBQUMsQ0FBQzs7RUFFN0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQztFQUNsQixDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDOztFQUVyQixDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO0VBQ3ZCLENBQUMsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7RUFDM0IsQ0FBQyxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQzs7RUFFM0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxDQUFDOztFQUU5QixDQUFDOztBQUVEdWpELHNCQUFrQixDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFOWEsVUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDO0FBQ25FOGEsc0JBQWtCLENBQUMsU0FBUyxDQUFDLFdBQVcsR0FBR0Esb0JBQWtCLENBQUM7O0FBRTlEQSxzQkFBa0IsQ0FBQyxTQUFTLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDOztBQUV6REEsc0JBQWtCLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRyxXQUFXLE1BQU0sR0FBRzs7RUFFeEQsQ0FBQzlhLFVBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7O0VBRTlDLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDO0VBQy9CLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDOztFQUVuQyxDQUFDLElBQUksQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQztFQUNuQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQzs7RUFFN0MsQ0FBQyxJQUFJLENBQUMsZUFBZSxHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUM7RUFDL0MsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDO0VBQ25ELENBQUMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQzs7RUFFakQsQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUM7RUFDbkMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsTUFBTSxDQUFDLGtCQUFrQixDQUFDOztFQUVyRCxDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQztFQUNqQyxDQUFDLElBQUksQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQztFQUN6QyxDQUFDLElBQUksQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQzs7RUFFekMsQ0FBQyxPQUFPLElBQUksQ0FBQzs7RUFFYixDQUFDLENBQUM7O0VBRUY7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUEsU0FBUythLHFCQUFtQixFQUFFLFVBQVUsR0FBRzs7RUFFM0MsQ0FBQy9hLFVBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7O0VBRXZCLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxxQkFBcUIsQ0FBQzs7RUFFbkMsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUlsZixPQUFLLEVBQUUsUUFBUSxFQUFFLENBQUM7O0VBRXBDLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUM7O0VBRWpCLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7RUFDdEIsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsR0FBRyxDQUFDOztFQUU5QixDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO0VBQ25CLENBQUMsSUFBSSxDQUFDLGNBQWMsR0FBRyxHQUFHLENBQUM7O0VBRTNCLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJQSxPQUFLLEVBQUUsUUFBUSxFQUFFLENBQUM7RUFDdkMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsR0FBRyxDQUFDO0VBQzlCLENBQUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7O0VBRXpCLENBQUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7O0VBRXpCLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7O0VBRXRCLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7RUFDcEIsQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHc2dCLG1CQUFpQixDQUFDO0VBQ2xDLENBQUMsSUFBSSxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUM7RUFDdkIsQ0FBQyxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQzs7RUFFN0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztFQUN4QixDQUFDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxDQUFDLENBQUM7RUFDN0IsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsT0FBTyxDQUFDO0VBQ2pDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLE9BQU8sQ0FBQzs7RUFFbEMsQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztFQUN2QixDQUFDLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO0VBQzNCLENBQUMsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7O0VBRTNCLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxVQUFVLEVBQUUsQ0FBQzs7RUFFOUIsQ0FBQzs7QUFFRDJaLHVCQUFtQixDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFL2EsVUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDO0FBQ3BFK2EsdUJBQW1CLENBQUMsU0FBUyxDQUFDLFdBQVcsR0FBR0EscUJBQW1CLENBQUM7O0FBRWhFQSx1QkFBbUIsQ0FBQyxTQUFTLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDOztBQUUzREEsdUJBQW1CLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRyxXQUFXLE1BQU0sR0FBRzs7RUFFekQsQ0FBQy9hLFVBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7O0VBRTlDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDOztFQUVqQyxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQzs7RUFFdkIsQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUM7RUFDakMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDOztFQUVuRCxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQztFQUMzQixDQUFDLElBQUksQ0FBQyxjQUFjLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQzs7RUFFN0MsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7RUFDdkMsQ0FBQyxJQUFJLENBQUMsV0FBVyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUM7RUFDdkMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDOztFQUVuRCxDQUFDLElBQUksQ0FBQyxXQUFXLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQzs7RUFFdkMsQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUM7O0VBRWpDLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0VBQzdCLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDO0VBQy9CLENBQUMsSUFBSSxDQUFDLFlBQVksR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDO0VBQ3pDLENBQUMsSUFBSSxDQUFDLGVBQWUsR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDOztFQUUvQyxDQUFDLElBQUksQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQztFQUNuQyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxNQUFNLENBQUMsa0JBQWtCLENBQUM7RUFDckQsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDO0VBQ2pELENBQUMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQzs7RUFFbkQsQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUM7RUFDakMsQ0FBQyxJQUFJLENBQUMsWUFBWSxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUM7RUFDekMsQ0FBQyxJQUFJLENBQUMsWUFBWSxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUM7O0VBRXpDLENBQUMsT0FBTyxJQUFJLENBQUM7O0VBRWIsQ0FBQyxDQUFDOztFQUVGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUEsU0FBU3FiLG9CQUFrQixFQUFFLFVBQVUsR0FBRzs7RUFFMUMsQ0FBQ3JiLFVBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7O0VBRXZCLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxvQkFBb0IsQ0FBQzs7RUFFbEMsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUlsZixPQUFLLEVBQUUsUUFBUSxFQUFFLENBQUM7O0VBRXBDLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7O0VBRXBCLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7RUFDaEIsQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQztFQUNuQixDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDOztFQUVsQixDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDOztFQUVyQixDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsVUFBVSxFQUFFLENBQUM7O0VBRTlCLENBQUM7O0FBRUR1NkIsc0JBQWtCLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUVyYixVQUFRLENBQUMsU0FBUyxFQUFFLENBQUM7QUFDbkVxYixzQkFBa0IsQ0FBQyxTQUFTLENBQUMsV0FBVyxHQUFHQSxvQkFBa0IsQ0FBQzs7QUFFOURBLHNCQUFrQixDQUFDLFNBQVMsQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUM7O0FBRXpEQSxzQkFBa0IsQ0FBQyxTQUFTLENBQUMsSUFBSSxHQUFHLFdBQVcsTUFBTSxHQUFHOztFQUV4RCxDQUFDcmIsVUFBUSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQzs7RUFFOUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7O0VBRWpDLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDOztFQUVuQyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQztFQUMzQixDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQztFQUNqQyxDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQzs7RUFFL0IsQ0FBQyxPQUFPLElBQUksQ0FBQzs7RUFFYixDQUFDLENBQUM7Ozs7RUFJRixJQUFJeTVHLFdBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0VBQzlCLENBQUMsY0FBYyxFQUFFbCtGLGdCQUFjO0VBQy9CLENBQUMsY0FBYyxFQUFFMHRCLGdCQUFjO0VBQy9CLENBQUMsaUJBQWlCLEVBQUVzVyxtQkFBaUI7RUFDckMsQ0FBQyxjQUFjLEVBQUV2OUMsZ0JBQWM7RUFDL0IsQ0FBQyxjQUFjLEVBQUVzWixnQkFBYztFQUMvQixDQUFDLG9CQUFvQixFQUFFSCxzQkFBb0I7RUFDM0MsQ0FBQyxvQkFBb0IsRUFBRUQsc0JBQW9CO0VBQzNDLENBQUMsaUJBQWlCLEVBQUVGLG1CQUFpQjtFQUNyQyxDQUFDLGdCQUFnQixFQUFFQyxrQkFBZ0I7RUFDbkMsQ0FBQyxrQkFBa0IsRUFBRUgsb0JBQWtCO0VBQ3ZDLENBQUMsbUJBQW1CLEVBQUVDLHFCQUFtQjtFQUN6QyxDQUFDLGlCQUFpQixFQUFFSCxtQkFBaUI7RUFDckMsQ0FBQyxpQkFBaUIsRUFBRXZaLG1CQUFpQjtFQUNyQyxDQUFDLGtCQUFrQixFQUFFZ2Esb0JBQWtCO0VBQ3ZDLENBQUMsaUJBQWlCLEVBQUVELG1CQUFpQjtFQUNyQyxDQUFDLFFBQVEsRUFBRXBiLFVBQVE7RUFDbkIsQ0FBQyxDQUFDLENBQUM7O0VBRUg7RUFDQTtFQUNBOztFQUVBLElBQUk0Z0QsT0FBSyxHQUFHOztFQUVaLENBQUMsT0FBTyxFQUFFLEtBQUs7O0VBRWYsQ0FBQyxLQUFLLEVBQUUsRUFBRTs7RUFFVixDQUFDLEdBQUcsRUFBRSxXQUFXLEdBQUcsRUFBRSxJQUFJLEdBQUc7O0VBRTdCLEVBQUUsS0FBSyxJQUFJLENBQUMsT0FBTyxLQUFLLEtBQUssR0FBRyxPQUFPOztFQUV2Qzs7RUFFQSxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDOztFQUUzQixFQUFFOztFQUVGLENBQUMsR0FBRyxFQUFFLFdBQVcsR0FBRyxHQUFHOztFQUV2QixFQUFFLEtBQUssSUFBSSxDQUFDLE9BQU8sS0FBSyxLQUFLLEdBQUcsT0FBTzs7RUFFdkM7O0VBRUEsRUFBRSxPQUFPLElBQUksQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUM7O0VBRTNCLEVBQUU7O0VBRUYsQ0FBQyxNQUFNLEVBQUUsV0FBVyxHQUFHLEdBQUc7O0VBRTFCLEVBQUUsT0FBTyxJQUFJLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDOztFQUUzQixFQUFFOztFQUVGLENBQUMsS0FBSyxFQUFFLFlBQVk7O0VBRXBCLEVBQUUsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7O0VBRWxCLEVBQUU7O0VBRUYsQ0FBQyxDQUFDOztFQUVGO0VBQ0E7RUFDQTs7RUFFQSxTQUFTODRELGdCQUFjLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxPQUFPLEdBQUc7O0VBRXZELENBQUMsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDOztFQUVsQixDQUFDLElBQUksU0FBUyxHQUFHLEtBQUssRUFBRSxXQUFXLEdBQUcsQ0FBQyxFQUFFLFVBQVUsR0FBRyxDQUFDLENBQUM7O0VBRXhELENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxTQUFTLENBQUM7RUFDMUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztFQUN0QixDQUFDLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO0VBQzlCLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7O0VBRXhCLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxXQUFXLEdBQUcsR0FBRzs7RUFFbkMsRUFBRSxVQUFVLEdBQUcsQ0FBQzs7RUFFaEIsRUFBRSxLQUFLLFNBQVMsS0FBSyxLQUFLLEdBQUc7O0VBRTdCLEdBQUcsS0FBSyxLQUFLLENBQUMsT0FBTyxLQUFLLFNBQVMsR0FBRzs7RUFFdEMsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLENBQUM7O0VBRWxELElBQUk7O0VBRUosR0FBRzs7RUFFSCxFQUFFLFNBQVMsR0FBRyxJQUFJLENBQUM7O0VBRW5CLEVBQUUsQ0FBQzs7RUFFSCxDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsV0FBVyxHQUFHLEdBQUc7O0VBRWpDLEVBQUUsV0FBVyxHQUFHLENBQUM7O0VBRWpCLEVBQUUsS0FBSyxLQUFLLENBQUMsVUFBVSxLQUFLLFNBQVMsR0FBRzs7RUFFeEMsR0FBRyxLQUFLLENBQUMsVUFBVSxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLENBQUM7O0VBRXBELEdBQUc7O0VBRUgsRUFBRSxLQUFLLFdBQVcsS0FBSyxVQUFVLEdBQUc7O0VBRXBDLEdBQUcsU0FBUyxHQUFHLEtBQUssQ0FBQzs7RUFFckIsR0FBRyxLQUFLLEtBQUssQ0FBQyxNQUFNLEtBQUssU0FBUyxHQUFHOztFQUVyQyxJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQzs7RUFFbkIsSUFBSTs7RUFFSixHQUFHOztFQUVILEVBQUUsQ0FBQzs7RUFFSCxDQUFDLElBQUksQ0FBQyxTQUFTLEdBQUcsV0FBVyxHQUFHLEdBQUc7O0VBRW5DLEVBQUUsS0FBSyxLQUFLLENBQUMsT0FBTyxLQUFLLFNBQVMsR0FBRzs7RUFFckMsR0FBRyxLQUFLLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDOztFQUV4QixHQUFHOztFQUVILEVBQUUsQ0FBQzs7RUFFSCxDQUFDOztFQUVELElBQUlqNUQsdUJBQXFCLEdBQUcsSUFBSWk1RCxnQkFBYyxFQUFFLENBQUM7O0VBRWpEO0VBQ0E7RUFDQTs7RUFFQSxTQUFTaDVELFlBQVUsRUFBRSxPQUFPLEdBQUc7O0VBRS9CLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLE9BQU8sS0FBSyxTQUFTLEtBQUssT0FBTyxHQUFHRCx1QkFBcUIsQ0FBQzs7RUFFNUUsQ0FBQzs7RUFFRCxNQUFNLENBQUMsTUFBTSxFQUFFQyxZQUFVLENBQUMsU0FBUyxFQUFFOztFQUVyQyxDQUFDLElBQUksRUFBRSxXQUFXLEdBQUcsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE9BQU8sR0FBRzs7RUFFckQsRUFBRSxLQUFLLEdBQUcsS0FBSyxTQUFTLEdBQUcsR0FBRyxHQUFHLEVBQUUsQ0FBQzs7RUFFcEMsRUFBRSxLQUFLLElBQUksQ0FBQyxJQUFJLEtBQUssU0FBUyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQzs7RUFFdkQsRUFBRSxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUM7O0VBRW5CLEVBQUUsSUFBSSxNQUFNLEdBQUdFLE9BQUssQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7O0VBRWhDLEVBQUUsS0FBSyxNQUFNLEtBQUssU0FBUyxHQUFHOztFQUU5QixHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLEdBQUcsRUFBRSxDQUFDOztFQUVsQyxHQUFHLFVBQVUsRUFBRSxZQUFZOztFQUUzQixJQUFJLEtBQUssTUFBTSxHQUFHLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQzs7RUFFbkMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQzs7RUFFakMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDOztFQUVWLEdBQUcsT0FBTyxNQUFNLENBQUM7O0VBRWpCLEdBQUc7O0VBRUg7RUFDQSxFQUFFLElBQUksWUFBWSxHQUFHLDZCQUE2QixDQUFDO0VBQ25ELEVBQUUsSUFBSSxrQkFBa0IsR0FBRyxHQUFHLENBQUMsS0FBSyxFQUFFLFlBQVksRUFBRSxDQUFDOztFQUVyRDtFQUNBLEVBQUUsS0FBSyxrQkFBa0IsR0FBRzs7RUFFNUIsR0FBRyxJQUFJLFFBQVEsR0FBRyxrQkFBa0IsRUFBRSxDQUFDLEVBQUUsQ0FBQztFQUMxQyxHQUFHLElBQUksUUFBUSxHQUFHLENBQUMsRUFBRSxrQkFBa0IsRUFBRSxDQUFDLEVBQUUsQ0FBQztFQUM3QyxHQUFHLElBQUksSUFBSSxHQUFHLGtCQUFrQixFQUFFLENBQUMsRUFBRSxDQUFDOztFQUV0QyxHQUFHLElBQUksR0FBRyxNQUFNLENBQUMsa0JBQWtCLEVBQUUsSUFBSSxFQUFFLENBQUM7O0VBRTVDLEdBQUcsS0FBSyxRQUFRLEdBQUcsSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7O0VBRTlDLEdBQUcsSUFBSTs7RUFFUCxJQUFJLElBQUksUUFBUSxDQUFDO0VBQ2pCLElBQUksSUFBSSxZQUFZLEdBQUcsRUFBRSxJQUFJLENBQUMsWUFBWSxJQUFJLEVBQUUsR0FBRyxXQUFXLEVBQUUsQ0FBQzs7RUFFakUsSUFBSSxTQUFTLFlBQVk7O0VBRXpCLEtBQUssS0FBSyxhQUFhLENBQUM7RUFDeEIsS0FBSyxLQUFLLE1BQU07O0VBRWhCLE9BQU8sUUFBUSxHQUFHLElBQUksV0FBVyxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQzs7RUFFakQsTUFBTSxJQUFJLElBQUksR0FBRyxJQUFJLFVBQVUsRUFBRSxRQUFRLEVBQUUsQ0FBQzs7RUFFNUMsTUFBTSxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsR0FBRzs7RUFFL0MsT0FBTyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7RUFFeEMsT0FBTzs7RUFFUCxNQUFNLEtBQUssWUFBWSxLQUFLLE1BQU0sR0FBRzs7RUFFckMsT0FBTyxRQUFRLEdBQUcsSUFBSSxJQUFJLEVBQUUsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsRUFBRSxDQUFDOztFQUUvRCxPQUFPOztFQUVQLE1BQU0sTUFBTTs7RUFFWixLQUFLLEtBQUssVUFBVTs7RUFFcEIsTUFBTSxJQUFJLE1BQU0sR0FBRyxJQUFJLFNBQVMsRUFBRSxDQUFDO0VBQ25DLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxlQUFlLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDOztFQUUxRCxNQUFNLE1BQU07O0VBRVosS0FBSyxLQUFLLE1BQU07O0VBRWhCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUM7O0VBRXBDLE1BQU0sTUFBTTs7RUFFWixLQUFLOztFQUVMLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQzs7RUFFdEIsTUFBTSxNQUFNOztFQUVaLEtBQUs7O0VBRUw7RUFDQSxJQUFJLE1BQU0sQ0FBQyxVQUFVLEVBQUUsWUFBWTs7RUFFbkMsS0FBSyxLQUFLLE1BQU0sR0FBRyxNQUFNLEVBQUUsUUFBUSxFQUFFLENBQUM7O0VBRXRDLEtBQUssS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUM7O0VBRWxDLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQzs7RUFFWCxJQUFJLENBQUMsUUFBUSxLQUFLLEdBQUc7O0VBRXJCO0VBQ0EsSUFBSSxNQUFNLENBQUMsVUFBVSxFQUFFLFlBQVk7O0VBRW5DLEtBQUssS0FBSyxPQUFPLEdBQUcsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDOztFQUVyQyxLQUFLLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDO0VBQ2xDLEtBQUssS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsR0FBRyxFQUFFLENBQUM7O0VBRXBDLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQzs7RUFFWCxJQUFJOztFQUVKLEdBQUcsTUFBTTs7RUFFVCxHQUFHLElBQUksT0FBTyxHQUFHLElBQUksY0FBYyxFQUFFLENBQUM7RUFDdEMsR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUM7O0VBRXBDLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxXQUFXLEtBQUssR0FBRzs7RUFFeEQsSUFBSSxJQUFJLFFBQVEsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQzs7RUFFekMsSUFBSUEsT0FBSyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLENBQUM7O0VBRS9CLElBQUksS0FBSyxJQUFJLENBQUMsTUFBTSxLQUFLLEdBQUcsR0FBRzs7RUFFL0IsS0FBSyxLQUFLLE1BQU0sR0FBRyxNQUFNLEVBQUUsUUFBUSxFQUFFLENBQUM7O0VBRXRDLEtBQUssS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUM7O0VBRWxDLEtBQUssTUFBTSxLQUFLLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxHQUFHOztFQUVwQztFQUNBOztFQUVBLEtBQUssT0FBTyxDQUFDLElBQUksRUFBRSwyQ0FBMkMsRUFBRSxDQUFDOztFQUVqRSxLQUFLLEtBQUssTUFBTSxHQUFHLE1BQU0sRUFBRSxRQUFRLEVBQUUsQ0FBQzs7RUFFdEMsS0FBSyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQzs7RUFFbEMsS0FBSyxNQUFNOztFQUVYLEtBQUssS0FBSyxPQUFPLEdBQUcsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDOztFQUVyQyxLQUFLLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDO0VBQ2xDLEtBQUssS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsR0FBRyxFQUFFLENBQUM7O0VBRXBDLEtBQUs7O0VBRUwsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDOztFQUVkLEdBQUcsS0FBSyxVQUFVLEtBQUssU0FBUyxHQUFHOztFQUVuQyxJQUFJLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxVQUFVLEVBQUUsV0FBVyxLQUFLLEdBQUc7O0VBRTdELEtBQUssVUFBVSxFQUFFLEtBQUssRUFBRSxDQUFDOztFQUV6QixLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUM7O0VBRWYsSUFBSTs7RUFFSixHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxPQUFPLEVBQUUsV0FBVyxLQUFLLEdBQUc7O0VBRXpELElBQUksS0FBSyxPQUFPLEdBQUcsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDOztFQUVwQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDO0VBQ2pDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsR0FBRyxFQUFFLENBQUM7O0VBRW5DLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQzs7RUFFZCxHQUFHLEtBQUssSUFBSSxDQUFDLFlBQVksS0FBSyxTQUFTLEdBQUcsT0FBTyxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO0VBQ25GLEdBQUcsS0FBSyxJQUFJLENBQUMsZUFBZSxLQUFLLFNBQVMsR0FBRyxPQUFPLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUM7O0VBRTVGLEdBQUcsS0FBSyxPQUFPLENBQUMsZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxRQUFRLEtBQUssU0FBUyxHQUFHLElBQUksQ0FBQyxRQUFRLEdBQUcsWUFBWSxFQUFFLENBQUM7O0VBRTFILEdBQUcsTUFBTSxJQUFJLE1BQU0sSUFBSSxJQUFJLENBQUMsYUFBYSxHQUFHOztFQUU1QyxJQUFJLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLGFBQWEsRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFDOztFQUVyRSxJQUFJOztFQUVKLEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQzs7RUFFeEIsR0FBRzs7RUFFSCxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLEdBQUcsRUFBRSxDQUFDOztFQUVqQyxFQUFFLE9BQU8sT0FBTyxDQUFDOztFQUVqQixFQUFFOztFQUVGLENBQUMsT0FBTyxFQUFFLFdBQVcsS0FBSyxHQUFHOztFQUU3QixFQUFFLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDO0VBQ3BCLEVBQUUsT0FBTyxJQUFJLENBQUM7O0VBRWQsRUFBRTs7RUFFRixDQUFDLGVBQWUsRUFBRSxXQUFXLEtBQUssR0FBRzs7RUFFckMsRUFBRSxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztFQUM1QixFQUFFLE9BQU8sSUFBSSxDQUFDOztFQUVkLEVBQUU7O0VBRUYsQ0FBQyxrQkFBa0IsRUFBRSxXQUFXLEtBQUssR0FBRzs7RUFFeEMsRUFBRSxJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztFQUMvQixFQUFFLE9BQU8sSUFBSSxDQUFDOztFQUVkLEVBQUU7O0VBRUYsQ0FBQyxXQUFXLEVBQUUsV0FBVyxLQUFLLEdBQUc7O0VBRWpDLEVBQUUsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7RUFDeEIsRUFBRSxPQUFPLElBQUksQ0FBQzs7RUFFZCxFQUFFOztFQUVGLENBQUMsZ0JBQWdCLEVBQUUsV0FBVyxLQUFLLEdBQUc7O0VBRXRDLEVBQUUsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7RUFDN0IsRUFBRSxPQUFPLElBQUksQ0FBQzs7RUFFZCxFQUFFOztFQUVGLENBQUMsRUFBRSxDQUFDOztFQUVKO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUEsU0FBUzRCLHlCQUF1QixFQUFFLE9BQU8sR0FBRzs7RUFFNUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsT0FBTyxLQUFLLFNBQVMsS0FBSyxPQUFPLEdBQUcvQix1QkFBcUIsQ0FBQzs7RUFFNUU7RUFDQSxDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDOztFQUVyQixDQUFDOztFQUVELE1BQU0sQ0FBQyxNQUFNLEVBQUUrQix5QkFBdUIsQ0FBQyxTQUFTLEVBQUU7O0VBRWxELENBQUMsSUFBSSxFQUFFLFdBQVcsR0FBRyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsT0FBTyxHQUFHOztFQUVyRCxFQUFFLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQzs7RUFFbkIsRUFBRSxJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7O0VBRWxCLEVBQUUsSUFBSSxPQUFPLEdBQUcsSUFBSXhWLG1CQUFpQixFQUFFLENBQUM7RUFDeEMsRUFBRSxPQUFPLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQzs7RUFFekIsRUFBRSxJQUFJLE1BQU0sR0FBRyxJQUFJMFQsWUFBVSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztFQUM5QyxFQUFFLE1BQU0sQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0VBQzlCLEVBQUUsTUFBTSxDQUFDLGVBQWUsRUFBRSxhQUFhLEVBQUUsQ0FBQzs7RUFFMUMsRUFBRSxTQUFTLFdBQVcsRUFBRSxDQUFDLEdBQUc7O0VBRTVCLEdBQUcsTUFBTSxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsV0FBVyxNQUFNLEdBQUc7O0VBRTlDLElBQUksSUFBSSxRQUFRLEdBQUcsS0FBSyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUM7O0VBRWpELElBQUksTUFBTSxFQUFFLENBQUMsRUFBRSxHQUFHO0VBQ2xCLEtBQUssS0FBSyxFQUFFLFFBQVEsQ0FBQyxLQUFLO0VBQzFCLEtBQUssTUFBTSxFQUFFLFFBQVEsQ0FBQyxNQUFNO0VBQzVCLEtBQUssTUFBTSxFQUFFLFFBQVEsQ0FBQyxNQUFNO0VBQzVCLEtBQUssT0FBTyxFQUFFLFFBQVEsQ0FBQyxPQUFPO0VBQzlCLEtBQUssQ0FBQzs7RUFFTixJQUFJLE1BQU0sSUFBSSxDQUFDLENBQUM7O0VBRWhCLElBQUksS0FBSyxNQUFNLEtBQUssQ0FBQyxHQUFHOztFQUV4QixLQUFLLEtBQUssUUFBUSxDQUFDLFdBQVcsS0FBSyxDQUFDO0VBQ3BDLE1BQU0sT0FBTyxDQUFDLFNBQVMsR0FBRzN5RSxjQUFZLENBQUM7O0VBRXZDLEtBQUssT0FBTyxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO0VBQ3RDLEtBQUssT0FBTyxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7O0VBRWhDLEtBQUssS0FBSyxNQUFNLEdBQUcsTUFBTSxFQUFFLE9BQU8sRUFBRSxDQUFDOztFQUVyQyxLQUFLOztFQUVMLElBQUksRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLENBQUM7O0VBRTVCLEdBQUc7O0VBRUgsRUFBRSxLQUFLLEtBQUssQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLEdBQUc7O0VBRTlCLEdBQUcsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDOztFQUVsQixHQUFHLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUc7O0VBRXBELElBQUksV0FBVyxFQUFFLENBQUMsRUFBRSxDQUFDOztFQUVyQixJQUFJOztFQUVKLEdBQUcsTUFBTTs7RUFFVDs7RUFFQSxHQUFHLE1BQU0sQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLFdBQVcsTUFBTSxHQUFHOztFQUV6QyxJQUFJLElBQUksUUFBUSxHQUFHLEtBQUssQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDOztFQUVqRCxJQUFJLEtBQUssUUFBUSxDQUFDLFNBQVMsR0FBRzs7RUFFOUIsS0FBSyxJQUFJLEtBQUssR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDOztFQUVoRSxLQUFLLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0VBRXhDLE1BQU0sTUFBTSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsT0FBTyxHQUFHLEVBQUUsRUFBRSxDQUFDOztFQUVyQyxNQUFNLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUMsR0FBRyxHQUFHOztFQUV4RCxPQUFPLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxXQUFXLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQztFQUNwRixPQUFPLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztFQUM1QyxPQUFPLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQztFQUMxQyxPQUFPLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQzs7RUFFNUMsT0FBTzs7RUFFUCxNQUFNOztFQUVOLEtBQUssTUFBTTs7RUFFWCxLQUFLLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUM7RUFDMUMsS0FBSyxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO0VBQzVDLEtBQUssT0FBTyxDQUFDLE9BQU8sR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDOztFQUV4QyxLQUFLOztFQUVMLElBQUksS0FBSyxRQUFRLENBQUMsV0FBVyxLQUFLLENBQUMsR0FBRzs7RUFFdEMsS0FBSyxPQUFPLENBQUMsU0FBUyxHQUFHQSxjQUFZLENBQUM7O0VBRXRDLEtBQUs7O0VBRUwsSUFBSSxPQUFPLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7RUFDckMsSUFBSSxPQUFPLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQzs7RUFFL0IsSUFBSSxLQUFLLE1BQU0sR0FBRyxNQUFNLEVBQUUsT0FBTyxFQUFFLENBQUM7O0VBRXBDLElBQUksRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLENBQUM7O0VBRTVCLEdBQUc7O0VBRUgsRUFBRSxPQUFPLE9BQU8sQ0FBQzs7RUFFakIsRUFBRTs7RUFFRixDQUFDLE9BQU8sRUFBRSxXQUFXLEtBQUssR0FBRzs7RUFFN0IsRUFBRSxJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQztFQUNwQixFQUFFLE9BQU8sSUFBSSxDQUFDOztFQUVkLEVBQUU7O0VBRUYsQ0FBQyxFQUFFLENBQUM7O0VBRUo7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFQSxTQUFTZzFFLG1CQUFpQixFQUFFLE9BQU8sR0FBRzs7RUFFdEMsQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsT0FBTyxLQUFLLFNBQVMsS0FBSyxPQUFPLEdBQUd0Qyx1QkFBcUIsQ0FBQzs7RUFFNUU7RUFDQSxDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDOztFQUVyQixDQUFDOztFQUVELE1BQU0sQ0FBQyxNQUFNLEVBQUVzQyxtQkFBaUIsQ0FBQyxTQUFTLEVBQUU7O0VBRTVDLENBQUMsSUFBSSxFQUFFLFdBQVcsR0FBRyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsT0FBTyxHQUFHOztFQUVyRCxFQUFFLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQzs7RUFFbkIsRUFBRSxJQUFJLE9BQU8sR0FBRyxJQUFJdnhFLGFBQVcsRUFBRSxDQUFDOztFQUVsQyxFQUFFLElBQUksTUFBTSxHQUFHLElBQUlrdkUsWUFBVSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztFQUM5QyxFQUFFLE1BQU0sQ0FBQyxlQUFlLEVBQUUsYUFBYSxFQUFFLENBQUM7O0VBRTFDLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsV0FBVyxNQUFNLEdBQUc7O0VBRXhDLEdBQUcsSUFBSSxPQUFPLEdBQUcsS0FBSyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQzs7RUFFekMsR0FBRyxLQUFLLEVBQUUsT0FBTyxHQUFHLE9BQU87O0VBRTNCLEdBQUcsS0FBSyxTQUFTLEtBQUssT0FBTyxDQUFDLEtBQUssR0FBRzs7RUFFdEMsSUFBSSxPQUFPLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUM7O0VBRWxDLElBQUksTUFBTSxLQUFLLFNBQVMsS0FBSyxPQUFPLENBQUMsSUFBSSxHQUFHOztFQUU1QyxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUM7RUFDeEMsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDO0VBQzFDLElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQzs7RUFFdEMsSUFBSTs7RUFFSixHQUFHLE9BQU8sQ0FBQyxLQUFLLEdBQUcsU0FBUyxLQUFLLE9BQU8sQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssR0FBRzV5RSxxQkFBbUIsQ0FBQztFQUNyRixHQUFHLE9BQU8sQ0FBQyxLQUFLLEdBQUcsU0FBUyxLQUFLLE9BQU8sQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssR0FBR0EscUJBQW1CLENBQUM7O0VBRXJGLEdBQUcsT0FBTyxDQUFDLFNBQVMsR0FBRyxTQUFTLEtBQUssT0FBTyxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUMsU0FBUyxHQUFHQyxjQUFZLENBQUM7RUFDMUYsR0FBRyxPQUFPLENBQUMsU0FBUyxHQUFHLFNBQVMsS0FBSyxPQUFPLENBQUMsU0FBUyxHQUFHLE9BQU8sQ0FBQyxTQUFTLEdBQUdDLDBCQUF3QixDQUFDOztFQUV0RyxHQUFHLE9BQU8sQ0FBQyxVQUFVLEdBQUcsU0FBUyxLQUFLLE9BQU8sQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUM7O0VBRWxGLEdBQUcsS0FBSyxTQUFTLEtBQUssT0FBTyxDQUFDLE1BQU0sR0FBRzs7RUFFdkMsSUFBSSxPQUFPLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUM7O0VBRXBDLElBQUk7RUFDSixHQUFHLEtBQUssU0FBUyxLQUFLLE9BQU8sQ0FBQyxJQUFJLEdBQUc7O0VBRXJDLElBQUksT0FBTyxDQUFDLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDOztFQUVoQyxJQUFJOztFQUVKLEdBQUcsS0FBSyxTQUFTLEtBQUssT0FBTyxDQUFDLE9BQU8sR0FBRzs7RUFFeEMsSUFBSSxPQUFPLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUM7O0VBRXRDLElBQUk7O0VBRUosR0FBRyxLQUFLLENBQUMsS0FBSyxPQUFPLENBQUMsV0FBVyxHQUFHOztFQUVwQyxJQUFJLE9BQU8sQ0FBQyxTQUFTLEdBQUdELGNBQVksQ0FBQzs7RUFFckMsSUFBSTs7RUFFSixHQUFHLE9BQU8sQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDOztFQUU5QixHQUFHLEtBQUssTUFBTSxHQUFHLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUM7O0VBRTVDLEdBQUcsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLENBQUM7OztFQUczQixFQUFFLE9BQU8sT0FBTyxDQUFDOztFQUVqQixFQUFFOztFQUVGLENBQUMsRUFBRSxDQUFDOztFQUVKO0VBQ0E7RUFDQTs7RUFFQSxTQUFTazFFLGFBQVcsRUFBRSxPQUFPLEdBQUc7O0VBRWhDLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLE9BQU8sS0FBSyxTQUFTLEtBQUssT0FBTyxHQUFHeEMsdUJBQXFCLENBQUM7O0VBRTVFLENBQUM7O0VBRUQsTUFBTSxDQUFDLE1BQU0sRUFBRXdDLGFBQVcsQ0FBQyxTQUFTLEVBQUU7O0VBRXRDLENBQUMsSUFBSSxFQUFFLFdBQVcsR0FBRyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsT0FBTyxHQUFHOztFQUVyRCxFQUFFLEtBQUssR0FBRyxLQUFLLFNBQVMsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDOztFQUVwQyxFQUFFLEtBQUssSUFBSSxDQUFDLElBQUksS0FBSyxTQUFTLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDOztFQUV2RCxFQUFFLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQzs7RUFFbkIsRUFBRSxJQUFJLE1BQU0sR0FBR3JDLE9BQUssQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7O0VBRWhDLEVBQUUsS0FBSyxNQUFNLEtBQUssU0FBUyxHQUFHOztFQUU5QixHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLEdBQUcsRUFBRSxDQUFDOztFQUVsQyxHQUFHLFVBQVUsRUFBRSxZQUFZOztFQUUzQixJQUFJLEtBQUssTUFBTSxHQUFHLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQzs7RUFFbkMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQzs7RUFFakMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDOztFQUVWLEdBQUcsT0FBTyxNQUFNLENBQUM7O0VBRWpCLEdBQUc7O0VBRUgsRUFBRSxJQUFJLEtBQUssR0FBRyxRQUFRLENBQUMsZUFBZSxFQUFFLDhCQUE4QixFQUFFLEtBQUssRUFBRSxDQUFDOztFQUVoRixFQUFFLEtBQUssQ0FBQyxnQkFBZ0IsRUFBRSxNQUFNLEVBQUUsWUFBWTs7RUFFOUMsR0FBR0EsT0FBSyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUM7O0VBRTFCLEdBQUcsS0FBSyxNQUFNLEdBQUcsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDOztFQUVoQyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDOztFQUVoQyxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUM7O0VBRWI7RUFDQTs7RUFFQTs7RUFFQTtFQUNBOztFQUVBLEVBQUUsS0FBSyxDQUFDLGdCQUFnQixFQUFFLE9BQU8sRUFBRSxXQUFXLEtBQUssR0FBRzs7RUFFdEQsR0FBRyxLQUFLLE9BQU8sR0FBRyxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUM7O0VBRW5DLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUM7RUFDaEMsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUUsQ0FBQzs7RUFFbEMsR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDOztFQUViLEVBQUUsS0FBSyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxPQUFPLEdBQUc7O0VBRXhDLEdBQUcsS0FBSyxJQUFJLENBQUMsV0FBVyxLQUFLLFNBQVMsR0FBRyxLQUFLLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7O0VBRTlFLEdBQUc7O0VBRUgsRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUUsQ0FBQzs7RUFFakMsRUFBRSxLQUFLLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQzs7RUFFbEIsRUFBRSxPQUFPLEtBQUssQ0FBQzs7RUFFZixFQUFFOztFQUVGLENBQUMsY0FBYyxFQUFFLFdBQVcsS0FBSyxHQUFHOztFQUVwQyxFQUFFLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO0VBQzNCLEVBQUUsT0FBTyxJQUFJLENBQUM7O0VBRWQsRUFBRTs7RUFFRixDQUFDLE9BQU8sRUFBRSxXQUFXLEtBQUssR0FBRzs7RUFFN0IsRUFBRSxJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQztFQUNwQixFQUFFLE9BQU8sSUFBSSxDQUFDOztFQUVkLEVBQUU7O0VBRUYsQ0FBQyxFQUFFLENBQUM7O0VBRUo7RUFDQTtFQUNBOztFQUVBLFNBQVN5QyxtQkFBaUIsRUFBRSxPQUFPLEdBQUc7O0VBRXRDLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLE9BQU8sS0FBSyxTQUFTLEtBQUssT0FBTyxHQUFHNUMsdUJBQXFCLENBQUM7O0VBRTVFLENBQUM7O0VBRUQsTUFBTSxDQUFDLE1BQU0sRUFBRTRDLG1CQUFpQixDQUFDLFNBQVMsRUFBRTs7RUFFNUMsQ0FBQyxJQUFJLEVBQUUsV0FBVyxJQUFJLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxPQUFPLEdBQUc7O0VBRXRELEVBQUUsSUFBSSxPQUFPLEdBQUcsSUFBSXp5QyxhQUFXLEVBQUUsQ0FBQzs7RUFFbEMsRUFBRSxJQUFJLE1BQU0sR0FBRyxJQUFJcXlDLGFBQVcsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7RUFDL0MsRUFBRSxNQUFNLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztFQUM1QyxFQUFFLE1BQU0sQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDOztFQUU5QixFQUFFLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQzs7RUFFakIsRUFBRSxTQUFTLFdBQVcsRUFBRSxDQUFDLEdBQUc7O0VBRTVCLEdBQUcsTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsV0FBVyxLQUFLLEdBQUc7O0VBRTlDLElBQUksT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsR0FBRyxLQUFLLENBQUM7O0VBRWhDLElBQUksTUFBTSxHQUFHLENBQUM7O0VBRWQsSUFBSSxLQUFLLE1BQU0sS0FBSyxDQUFDLEdBQUc7O0VBRXhCLEtBQUssT0FBTyxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7O0VBRWhDLEtBQUssS0FBSyxNQUFNLEdBQUcsTUFBTSxFQUFFLE9BQU8sRUFBRSxDQUFDOztFQUVyQyxLQUFLOztFQUVMLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLENBQUM7O0VBRTNCLEdBQUc7O0VBRUgsRUFBRSxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsR0FBRzs7RUFFM0MsR0FBRyxXQUFXLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0VBRXBCLEdBQUc7O0VBRUgsRUFBRSxPQUFPLE9BQU8sQ0FBQzs7RUFFakIsRUFBRTs7RUFFRixDQUFDLGNBQWMsRUFBRSxXQUFXLEtBQUssR0FBRzs7RUFFcEMsRUFBRSxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztFQUMzQixFQUFFLE9BQU8sSUFBSSxDQUFDOztFQUVkLEVBQUU7O0VBRUYsQ0FBQyxPQUFPLEVBQUUsV0FBVyxLQUFLLEdBQUc7O0VBRTdCLEVBQUUsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUM7RUFDcEIsRUFBRSxPQUFPLElBQUksQ0FBQzs7RUFFZCxFQUFFOztFQUVGLENBQUMsRUFBRSxDQUFDOztFQUVKO0VBQ0E7RUFDQTs7RUFFQSxTQUFTTSxlQUFhLEVBQUUsT0FBTyxHQUFHOztFQUVsQyxDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRSxPQUFPLEtBQUssU0FBUyxLQUFLLE9BQU8sR0FBRzlDLHVCQUFxQixDQUFDOztFQUU1RSxDQUFDOztFQUVELE1BQU0sQ0FBQyxNQUFNLEVBQUU4QyxlQUFhLENBQUMsU0FBUyxFQUFFOztFQUV4QyxDQUFDLElBQUksRUFBRSxXQUFXLEdBQUcsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE9BQU8sR0FBRzs7RUFFckQsRUFBRSxJQUFJLE1BQU0sR0FBRyxJQUFJTixhQUFXLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO0VBQy9DLEVBQUUsTUFBTSxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7RUFDNUMsRUFBRSxNQUFNLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQzs7RUFFOUIsRUFBRSxJQUFJLE9BQU8sR0FBRyxJQUFJdjFFLFNBQU8sRUFBRSxDQUFDO0VBQzlCLEVBQUUsT0FBTyxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxZQUFZOztFQUVoRDtFQUNBLEdBQUcsSUFBSSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxlQUFlLEVBQUUsR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDLE1BQU0sRUFBRSxvQkFBb0IsRUFBRSxLQUFLLENBQUMsQ0FBQzs7RUFFOUYsR0FBRyxPQUFPLENBQUMsTUFBTSxHQUFHLE1BQU0sR0FBR2lpRCxXQUFTLEdBQUcxaEQsWUFBVSxDQUFDO0VBQ3BELEdBQUcsT0FBTyxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7O0VBRTlCLEdBQUcsS0FBSyxNQUFNLEtBQUssU0FBUyxHQUFHOztFQUUvQixJQUFJLE1BQU0sRUFBRSxPQUFPLEVBQUUsQ0FBQzs7RUFFdEIsSUFBSTs7RUFFSixHQUFHLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxDQUFDOztFQUUzQixFQUFFLE9BQU8sT0FBTyxDQUFDOztFQUVqQixFQUFFOztFQUVGLENBQUMsY0FBYyxFQUFFLFdBQVcsS0FBSyxHQUFHOztFQUVwQyxFQUFFLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO0VBQzNCLEVBQUUsT0FBTyxJQUFJLENBQUM7O0VBRWQsRUFBRTs7RUFFRixDQUFDLE9BQU8sRUFBRSxXQUFXLEtBQUssR0FBRzs7RUFFN0IsRUFBRSxJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQztFQUNwQixFQUFFLE9BQU8sSUFBSSxDQUFDOztFQUVkLEVBQUU7O0VBRUYsQ0FBQyxFQUFFLENBQUM7O0VBRUo7RUFDQTtFQUNBO0VBQ0E7O0VBRUEsU0FBU2s5RSxPQUFLLEVBQUUsS0FBSyxFQUFFLFNBQVMsR0FBRzs7RUFFbkMsQ0FBQ3AvRCxVQUFRLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDOztFQUV2QixDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDOztFQUVyQixDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSWpMLE9BQUssRUFBRSxLQUFLLEVBQUUsQ0FBQztFQUNqQyxDQUFDLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxLQUFLLFNBQVMsR0FBRyxTQUFTLEdBQUcsQ0FBQyxDQUFDOztFQUUxRCxDQUFDLElBQUksQ0FBQyxhQUFhLEdBQUcsU0FBUyxDQUFDOztFQUVoQyxDQUFDOztBQUVEcXFFLFNBQUssQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFcC9ELFVBQVEsQ0FBQyxTQUFTLEVBQUUsRUFBRTs7RUFFdEUsQ0FBQyxXQUFXLEVBQUVvL0QsT0FBSzs7RUFFbkIsQ0FBQyxPQUFPLEVBQUUsSUFBSTs7RUFFZCxDQUFDLElBQUksRUFBRSxXQUFXLE1BQU0sR0FBRzs7RUFFM0IsRUFBRXAvRCxVQUFRLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDOztFQUUvQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztFQUNsQyxFQUFFLElBQUksQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQzs7RUFFcEMsRUFBRSxPQUFPLElBQUksQ0FBQzs7RUFFZCxFQUFFOztFQUVGLENBQUMsTUFBTSxFQUFFLFdBQVcsSUFBSSxHQUFHOztFQUUzQixFQUFFLElBQUksSUFBSSxHQUFHQSxVQUFRLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDOztFQUUxRCxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7RUFDMUMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDOztFQUV6QyxFQUFFLEtBQUssSUFBSSxDQUFDLFdBQVcsS0FBSyxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQzs7RUFFNUYsRUFBRSxLQUFLLElBQUksQ0FBQyxRQUFRLEtBQUssU0FBUyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7RUFDMUUsRUFBRSxLQUFLLElBQUksQ0FBQyxLQUFLLEtBQUssU0FBUyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7RUFDakUsRUFBRSxLQUFLLElBQUksQ0FBQyxLQUFLLEtBQUssU0FBUyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7RUFDakUsRUFBRSxLQUFLLElBQUksQ0FBQyxRQUFRLEtBQUssU0FBUyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7O0VBRTFFLEVBQUUsS0FBSyxJQUFJLENBQUMsTUFBTSxLQUFLLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDOztFQUU3RSxFQUFFLE9BQU8sSUFBSSxDQUFDOztFQUVkLEVBQUU7O0VBRUYsQ0FBQyxFQUFFLENBQUM7O0VBRUo7RUFDQTtFQUNBOztFQUVBLFNBQVNxL0QsaUJBQWUsRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLFNBQVMsR0FBRzs7RUFFN0QsQ0FBQ0QsT0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxDQUFDOztFQUV6QyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsaUJBQWlCLENBQUM7O0VBRS9CLENBQUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7O0VBRTdCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUVwL0QsVUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDO0VBQzFDLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDOztFQUVyQixDQUFDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSWpMLE9BQUssRUFBRSxXQUFXLEVBQUUsQ0FBQzs7RUFFN0MsQ0FBQzs7QUFFRHNxRSxtQkFBZSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUVELE9BQUssQ0FBQyxTQUFTLEVBQUUsRUFBRTs7RUFFN0UsQ0FBQyxXQUFXLEVBQUVDLGlCQUFlOztFQUU3QixDQUFDLGlCQUFpQixFQUFFLElBQUk7O0VBRXhCLENBQUMsSUFBSSxFQUFFLFdBQVcsTUFBTSxHQUFHOztFQUUzQixFQUFFRCxPQUFLLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDOztFQUU1QyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQzs7RUFFOUMsRUFBRSxPQUFPLElBQUksQ0FBQzs7RUFFZCxFQUFFOztFQUVGLENBQUMsRUFBRSxDQUFDOztFQUVKO0VBQ0E7RUFDQTs7RUFFQSxTQUFTRSxhQUFXLEVBQUUsTUFBTSxHQUFHOztFQUUvQixDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDOztFQUV0QixDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0VBQ2YsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQzs7RUFFakIsQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUk5ekYsU0FBTyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQzs7RUFFeEMsQ0FBQyxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQztFQUNqQixDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSTZELFNBQU8sRUFBRSxDQUFDOztFQUU3QixDQUFDOztFQUVELE1BQU0sQ0FBQyxNQUFNLEVBQUVpd0YsYUFBVyxDQUFDLFNBQVMsRUFBRTs7RUFFdEMsQ0FBQyxJQUFJLEVBQUUsV0FBVyxNQUFNLEdBQUc7O0VBRTNCLEVBQUUsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDOztFQUV0QyxFQUFFLElBQUksQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQztFQUMxQixFQUFFLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQzs7RUFFOUIsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7O0VBRXRDLEVBQUUsT0FBTyxJQUFJLENBQUM7O0VBRWQsRUFBRTs7RUFFRixDQUFDLEtBQUssRUFBRSxZQUFZOztFQUVwQixFQUFFLE9BQU8sSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDOztFQUU3QyxFQUFFOztFQUVGLENBQUMsTUFBTSxFQUFFLFlBQVk7O0VBRXJCLEVBQUUsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDOztFQUVsQixFQUFFLEtBQUssSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDLEdBQUcsTUFBTSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO0VBQ2pELEVBQUUsS0FBSyxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7RUFDdkQsRUFBRSxLQUFLLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxHQUFHLEdBQUcsTUFBTSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDOztFQUVsRyxFQUFFLE1BQU0sQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUMsTUFBTSxDQUFDO0VBQ3JELEVBQUUsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQzs7RUFFOUIsRUFBRSxPQUFPLE1BQU0sQ0FBQzs7RUFFaEIsRUFBRTs7RUFFRixDQUFDLEVBQUUsQ0FBQzs7RUFFSjtFQUNBO0VBQ0E7O0VBRUEsU0FBU0MsaUJBQWUsR0FBRzs7RUFFM0IsQ0FBQ0QsYUFBVyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSTV5QixtQkFBaUIsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDOztFQUVwRSxDQUFDOztBQUVENnlCLG1CQUFlLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRUQsYUFBVyxDQUFDLFNBQVMsRUFBRSxFQUFFOztFQUVuRixDQUFDLFdBQVcsRUFBRUMsaUJBQWU7O0VBRTdCLENBQUMsaUJBQWlCLEVBQUUsSUFBSTs7RUFFeEIsQ0FBQyxNQUFNLEVBQUUsV0FBVyxLQUFLLEdBQUc7O0VBRTVCLEVBQUUsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQzs7RUFFM0IsRUFBRSxJQUFJLEdBQUcsR0FBR3YwRixPQUFLLENBQUMsT0FBTyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO0VBQzVDLEVBQUUsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7RUFDeEQsRUFBRSxJQUFJLEdBQUcsR0FBRyxLQUFLLENBQUMsUUFBUSxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUM7O0VBRXpDLEVBQUUsS0FBSyxHQUFHLEtBQUssTUFBTSxDQUFDLEdBQUcsSUFBSSxNQUFNLEtBQUssTUFBTSxDQUFDLE1BQU0sSUFBSSxHQUFHLEtBQUssTUFBTSxDQUFDLEdBQUcsR0FBRzs7RUFFOUUsR0FBRyxNQUFNLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztFQUNwQixHQUFHLE1BQU0sQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0VBQzFCLEdBQUcsTUFBTSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7RUFDcEIsR0FBRyxNQUFNLENBQUMsc0JBQXNCLEVBQUUsQ0FBQzs7RUFFbkMsR0FBRzs7RUFFSCxFQUFFOztFQUVGLENBQUMsRUFBRSxDQUFDOztFQUVKO0VBQ0E7RUFDQTs7RUFFQSxTQUFTeTBGLFdBQVMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEtBQUssR0FBRzs7RUFFekUsQ0FBQ0wsT0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxDQUFDOztFQUV0QyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsV0FBVyxDQUFDOztFQUV6QixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFcC9ELFVBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQztFQUMxQyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQzs7RUFFckIsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUlBLFVBQVEsRUFBRSxDQUFDOztFQUU5QixDQUFDLE1BQU0sQ0FBQyxjQUFjLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRTtFQUN2QyxFQUFFLEdBQUcsRUFBRSxZQUFZO0VBQ25CO0VBQ0E7RUFDQSxHQUFHLE9BQU8sSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO0VBQ25DLEdBQUc7RUFDSCxFQUFFLEdBQUcsRUFBRSxXQUFXLEtBQUssR0FBRztFQUMxQjtFQUNBO0VBQ0EsR0FBRyxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO0VBQ3BDLEdBQUc7RUFDSCxFQUFFLEVBQUUsQ0FBQzs7RUFFTCxDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxRQUFRLEtBQUssU0FBUyxLQUFLLFFBQVEsR0FBRyxDQUFDLENBQUM7RUFDM0QsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsS0FBSyxLQUFLLFNBQVMsS0FBSyxLQUFLLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7RUFDNUQsQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsUUFBUSxLQUFLLFNBQVMsS0FBSyxRQUFRLEdBQUcsQ0FBQyxDQUFDO0VBQzNELENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLEtBQUssS0FBSyxTQUFTLEtBQUssS0FBSyxHQUFHLENBQUMsQ0FBQzs7RUFFbEQsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUl1L0QsaUJBQWUsRUFBRSxDQUFDOztFQUVyQyxDQUFDOztBQUVERSxhQUFTLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRUwsT0FBSyxDQUFDLFNBQVMsRUFBRSxFQUFFOztFQUV2RSxDQUFDLFdBQVcsRUFBRUssV0FBUzs7RUFFdkIsQ0FBQyxXQUFXLEVBQUUsSUFBSTs7RUFFbEIsQ0FBQyxJQUFJLEVBQUUsV0FBVyxNQUFNLEdBQUc7O0VBRTNCLEVBQUVMLE9BQUssQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7O0VBRTVDLEVBQUUsSUFBSSxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDO0VBQ2xDLEVBQUUsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDO0VBQzVCLEVBQUUsSUFBSSxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDO0VBQ2xDLEVBQUUsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDOztFQUU1QixFQUFFLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQzs7RUFFdEMsRUFBRSxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7O0VBRXRDLEVBQUUsT0FBTyxJQUFJLENBQUM7O0VBRWQsRUFBRTs7RUFFRixDQUFDLEVBQUUsQ0FBQzs7RUFFSjtFQUNBO0VBQ0E7OztFQUdBLFNBQVNNLFlBQVUsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxLQUFLLEdBQUc7O0VBRXpELENBQUNOLE9BQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsQ0FBQzs7RUFFdEMsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLFlBQVksQ0FBQzs7RUFFMUIsQ0FBQyxNQUFNLENBQUMsY0FBYyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUU7RUFDdkMsRUFBRSxHQUFHLEVBQUUsWUFBWTtFQUNuQjtFQUNBO0VBQ0EsR0FBRyxPQUFPLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUM7O0VBRXZDLEdBQUc7RUFDSCxFQUFFLEdBQUcsRUFBRSxXQUFXLEtBQUssR0FBRztFQUMxQjtFQUNBO0VBQ0EsR0FBRyxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDO0VBQzVDLEdBQUc7RUFDSCxFQUFFLEVBQUUsQ0FBQzs7RUFFTCxDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxRQUFRLEtBQUssU0FBUyxLQUFLLFFBQVEsR0FBRyxDQUFDLENBQUM7RUFDM0QsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsS0FBSyxLQUFLLFNBQVMsS0FBSyxLQUFLLEdBQUcsQ0FBQyxDQUFDOztFQUVsRCxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSUUsYUFBVyxFQUFFLElBQUk1eUIsbUJBQWlCLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQzs7RUFFM0UsQ0FBQzs7QUFFRGd6QixjQUFVLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRU4sT0FBSyxDQUFDLFNBQVMsRUFBRSxFQUFFOztFQUV4RSxDQUFDLFdBQVcsRUFBRU0sWUFBVTs7RUFFeEIsQ0FBQyxZQUFZLEVBQUUsSUFBSTs7RUFFbkIsQ0FBQyxJQUFJLEVBQUUsV0FBVyxNQUFNLEdBQUc7O0VBRTNCLEVBQUVOLE9BQUssQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7O0VBRTVDLEVBQUUsSUFBSSxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDO0VBQ2xDLEVBQUUsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDOztFQUU1QixFQUFFLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQzs7RUFFdEMsRUFBRSxPQUFPLElBQUksQ0FBQzs7RUFFZCxFQUFFOztFQUVGLENBQUMsRUFBRSxDQUFDOztFQUVKO0VBQ0E7RUFDQTs7RUFFQSxTQUFTTyx3QkFBc0IsSUFBSTs7RUFFbkMsQ0FBQ0wsYUFBVyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSXI3RCxvQkFBa0IsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDOztFQUU5RSxDQUFDOztBQUVEMDdELDBCQUFzQixDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUVMLGFBQVcsQ0FBQyxTQUFTLEVBQUUsRUFBRTs7RUFFMUYsQ0FBQyxXQUFXLEVBQUVLLHdCQUFzQjs7RUFFcEMsQ0FBQyxFQUFFLENBQUM7O0VBRUo7RUFDQTtFQUNBO0VBQ0E7O0VBRUEsU0FBU0Msa0JBQWdCLEVBQUUsS0FBSyxFQUFFLFNBQVMsR0FBRzs7RUFFOUMsQ0FBQ1IsT0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxDQUFDOztFQUV0QyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsa0JBQWtCLENBQUM7O0VBRWhDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUVwL0QsVUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDO0VBQzFDLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDOztFQUVyQixDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSUEsVUFBUSxFQUFFLENBQUM7O0VBRTlCLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJMi9ELHdCQUFzQixFQUFFLENBQUM7O0VBRTVDLENBQUM7O0FBRURDLG9CQUFnQixDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUVSLE9BQUssQ0FBQyxTQUFTLEVBQUUsRUFBRTs7RUFFOUUsQ0FBQyxXQUFXLEVBQUVRLGtCQUFnQjs7RUFFOUIsQ0FBQyxrQkFBa0IsRUFBRSxJQUFJOztFQUV6QixDQUFDLElBQUksRUFBRSxXQUFXLE1BQU0sR0FBRzs7RUFFM0IsRUFBRVIsT0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQzs7RUFFNUMsRUFBRSxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7O0VBRXRDLEVBQUUsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDOztFQUV0QyxFQUFFLE9BQU8sSUFBSSxDQUFDOztFQUVkLEVBQUU7O0VBRUYsQ0FBQyxFQUFFLENBQUM7O0VBRUo7RUFDQTtFQUNBOztFQUVBLFNBQVNTLGNBQVksRUFBRSxLQUFLLEVBQUUsU0FBUyxHQUFHOztFQUUxQyxDQUFDVCxPQUFLLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLENBQUM7O0VBRXRDLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxjQUFjLENBQUM7O0VBRTVCLENBQUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7O0VBRTdCLENBQUM7O0FBRURTLGdCQUFZLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRVQsT0FBSyxDQUFDLFNBQVMsRUFBRSxFQUFFOztFQUUxRSxDQUFDLFdBQVcsRUFBRVMsY0FBWTs7RUFFMUIsQ0FBQyxjQUFjLEVBQUUsSUFBSTs7RUFFckIsQ0FBQyxFQUFFLENBQUM7O0VBRUo7RUFDQTtFQUNBOztFQUVBLFNBQVNDLGVBQWEsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEdBQUc7O0VBRTFELENBQUNWLE9BQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsQ0FBQzs7RUFFdEMsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLGVBQWUsQ0FBQzs7RUFFN0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0VBQzlCLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDOztFQUVyQixDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxLQUFLLEtBQUssU0FBUyxLQUFLLEtBQUssR0FBRyxFQUFFLENBQUM7RUFDbkQsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsTUFBTSxLQUFLLFNBQVMsS0FBSyxNQUFNLEdBQUcsRUFBRSxDQUFDOztFQUV0RDs7RUFFQTs7RUFFQTs7RUFFQSxDQUFDOztFQUVEO0FBQ0FVLGlCQUFhLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRVYsT0FBSyxDQUFDLFNBQVMsRUFBRSxFQUFFOztFQUUzRSxDQUFDLFdBQVcsRUFBRVUsZUFBYTs7RUFFM0IsQ0FBQyxlQUFlLEVBQUUsSUFBSTs7RUFFdEIsQ0FBQyxJQUFJLEVBQUUsV0FBVyxNQUFNLEdBQUc7O0VBRTNCLEVBQUVWLE9BQUssQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7O0VBRTVDLEVBQUUsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDO0VBQzVCLEVBQUUsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDOztFQUU5QixFQUFFLE9BQU8sSUFBSSxDQUFDOztFQUVkLEVBQUU7O0VBRUYsQ0FBQyxNQUFNLEVBQUUsV0FBVyxJQUFJLEdBQUc7O0VBRTNCLEVBQUUsSUFBSSxJQUFJLEdBQUdBLE9BQUssQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7O0VBRXZELEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztFQUNqQyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7O0VBRW5DLEVBQUUsT0FBTyxJQUFJLENBQUM7O0VBRWQsRUFBRTs7RUFFRixDQUFDLEVBQUUsQ0FBQzs7RUFFSjtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVBLElBQUltRixnQkFBYyxHQUFHOztFQUVyQjtFQUNBLENBQUMsVUFBVSxFQUFFLFdBQVcsS0FBSyxFQUFFLElBQUksRUFBRSxFQUFFLEdBQUc7O0VBRTFDLEVBQUUsS0FBS0EsZ0JBQWMsQ0FBQyxZQUFZLEVBQUUsS0FBSyxFQUFFLEdBQUc7O0VBRTlDO0VBQ0E7RUFDQSxHQUFHLE9BQU8sSUFBSSxLQUFLLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLEVBQUUsS0FBSyxTQUFTLEdBQUcsRUFBRSxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDOztFQUVoRyxHQUFHOztFQUVILEVBQUUsT0FBTyxLQUFLLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQzs7RUFFakMsRUFBRTs7RUFFRjtFQUNBLENBQUMsWUFBWSxFQUFFLFdBQVcsS0FBSyxFQUFFLElBQUksRUFBRSxVQUFVLEdBQUc7O0VBRXBELEVBQUUsS0FBSyxFQUFFLEtBQUs7RUFDZCxJQUFJLEVBQUUsVUFBVSxJQUFJLEtBQUssQ0FBQyxXQUFXLEtBQUssSUFBSSxHQUFHLE9BQU8sS0FBSyxDQUFDOztFQUU5RCxFQUFFLEtBQUssT0FBTyxJQUFJLENBQUMsaUJBQWlCLEtBQUssUUFBUSxHQUFHOztFQUVwRCxHQUFHLE9BQU8sSUFBSSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUM7O0VBRTVCLEdBQUc7O0VBRUgsRUFBRSxPQUFPLEtBQUssQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQzs7RUFFN0MsRUFBRTs7RUFFRixDQUFDLFlBQVksRUFBRSxXQUFXLE1BQU0sR0FBRzs7RUFFbkMsRUFBRSxPQUFPLFdBQVcsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFO0VBQ3JDLElBQUksSUFBSSxNQUFNLFlBQVksUUFBUSxFQUFFLENBQUM7O0VBRXJDLEVBQUU7O0VBRUY7RUFDQSxDQUFDLGdCQUFnQixFQUFFLFdBQVcsS0FBSyxHQUFHOztFQUV0QyxFQUFFLFNBQVMsV0FBVyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUc7O0VBRS9CLEdBQUcsT0FBTyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEdBQUcsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDOztFQUVsQyxHQUFHOztFQUVILEVBQUUsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztFQUN2QixFQUFFLElBQUksTUFBTSxHQUFHLElBQUksS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDO0VBQzlCLEVBQUUsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDOztFQUVuRCxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUFFLENBQUM7O0VBRTdCLEVBQUUsT0FBTyxNQUFNLENBQUM7O0VBRWhCLEVBQUU7O0VBRUY7RUFDQSxDQUFDLFdBQVcsRUFBRSxXQUFXLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxHQUFHOztFQUVqRCxFQUFFLElBQUksT0FBTyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7RUFDOUIsRUFBRSxJQUFJLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxXQUFXLEVBQUUsT0FBTyxFQUFFLENBQUM7O0VBRWpELEVBQUUsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsU0FBUyxHQUFHLENBQUMsRUFBRSxTQUFTLEtBQUssT0FBTyxFQUFFLEdBQUcsQ0FBQyxHQUFHOztFQUVoRSxHQUFHLElBQUksU0FBUyxHQUFHLEtBQUssRUFBRSxDQUFDLEVBQUUsR0FBRyxNQUFNLENBQUM7O0VBRXZDLEdBQUcsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxLQUFLLE1BQU0sRUFBRSxHQUFHLENBQUMsR0FBRzs7RUFFekMsSUFBSSxNQUFNLEVBQUUsU0FBUyxHQUFHLEVBQUUsR0FBRyxNQUFNLEVBQUUsU0FBUyxHQUFHLENBQUMsRUFBRSxDQUFDOztFQUVyRCxJQUFJOztFQUVKLEdBQUc7O0VBRUgsRUFBRSxPQUFPLE1BQU0sQ0FBQzs7RUFFaEIsRUFBRTs7RUFFRjtFQUNBLENBQUMsV0FBVyxFQUFFLFdBQVcsUUFBUSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsaUJBQWlCLEdBQUc7O0VBRXRFLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxRQUFRLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0VBRWpDLEVBQUUsUUFBUSxHQUFHLEtBQUssU0FBUyxJQUFJLEdBQUcsRUFBRSxpQkFBaUIsRUFBRSxLQUFLLFNBQVMsR0FBRzs7RUFFeEUsR0FBRyxHQUFHLEdBQUcsUUFBUSxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7O0VBRTFCLEdBQUc7O0VBRUgsRUFBRSxLQUFLLEdBQUcsS0FBSyxTQUFTLEdBQUcsT0FBTzs7RUFFbEMsRUFBRSxJQUFJLEtBQUssR0FBRyxHQUFHLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQztFQUN2QyxFQUFFLEtBQUssS0FBSyxLQUFLLFNBQVMsR0FBRyxPQUFPOztFQUVwQyxFQUFFLEtBQUssS0FBSyxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsR0FBRzs7RUFFaEMsR0FBRyxHQUFHOztFQUVOLElBQUksS0FBSyxHQUFHLEdBQUcsRUFBRSxpQkFBaUIsRUFBRSxDQUFDOztFQUVyQyxJQUFJLEtBQUssS0FBSyxLQUFLLFNBQVMsR0FBRzs7RUFFL0IsS0FBSyxLQUFLLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztFQUM1QixLQUFLLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQzs7RUFFeEMsS0FBSzs7RUFFTCxJQUFJLEdBQUcsR0FBRyxRQUFRLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQzs7RUFFM0IsSUFBSSxTQUFTLEdBQUcsS0FBSyxTQUFTLEdBQUc7O0VBRWpDLEdBQUcsTUFBTSxLQUFLLEtBQUssQ0FBQyxPQUFPLEtBQUssU0FBUyxHQUFHOztFQUU1Qzs7RUFFQSxHQUFHLEdBQUc7O0VBRU4sSUFBSSxLQUFLLEdBQUcsR0FBRyxFQUFFLGlCQUFpQixFQUFFLENBQUM7O0VBRXJDLElBQUksS0FBSyxLQUFLLEtBQUssU0FBUyxHQUFHOztFQUUvQixLQUFLLEtBQUssQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO0VBQzVCLEtBQUssS0FBSyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDOztFQUU1QyxLQUFLOztFQUVMLElBQUksR0FBRyxHQUFHLFFBQVEsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDOztFQUUzQixJQUFJLFNBQVMsR0FBRyxLQUFLLFNBQVMsR0FBRzs7RUFFakMsR0FBRyxNQUFNOztFQUVUOztFQUVBLEdBQUcsR0FBRzs7RUFFTixJQUFJLEtBQUssR0FBRyxHQUFHLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQzs7RUFFckMsSUFBSSxLQUFLLEtBQUssS0FBSyxTQUFTLEdBQUc7O0VBRS9CLEtBQUssS0FBSyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7RUFDNUIsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDOztFQUUxQixLQUFLOztFQUVMLElBQUksR0FBRyxHQUFHLFFBQVEsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDOztFQUUzQixJQUFJLFNBQVMsR0FBRyxLQUFLLFNBQVMsR0FBRzs7RUFFakMsR0FBRzs7RUFFSCxFQUFFOztFQUVGLENBQUMsQ0FBQzs7RUFFRjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUEsU0FBU3ZELGFBQVcsRUFBRSxrQkFBa0IsRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLFlBQVksR0FBRzs7RUFFbkYsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsa0JBQWtCLENBQUM7RUFDOUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQzs7RUFFdkIsQ0FBQyxJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksS0FBSyxTQUFTO0VBQy9DLEdBQUcsWUFBWSxHQUFHLElBQUksWUFBWSxDQUFDLFdBQVcsRUFBRSxVQUFVLEVBQUUsQ0FBQztFQUM3RCxDQUFDLElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO0VBQ2xDLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxVQUFVLENBQUM7O0VBRTdCLENBQUM7O0VBRUQsTUFBTSxDQUFDLE1BQU0sRUFBRUEsYUFBVyxDQUFDLFNBQVMsRUFBRTs7RUFFdEMsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLEdBQUc7O0VBRXpCLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLGtCQUFrQjtFQUNsQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsWUFBWTs7RUFFekIsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSTtFQUNwQixHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDOztFQUVyQixFQUFFLGlCQUFpQixFQUFFOztFQUVyQixHQUFHLElBQUksRUFBRTs7RUFFVCxJQUFJLElBQUksS0FBSyxDQUFDOztFQUVkLElBQUksV0FBVyxFQUFFO0VBQ2pCO0VBQ0E7RUFDQTtFQUNBO0VBQ0EsS0FBSyxZQUFZLEVBQUUsS0FBSyxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsR0FBRzs7RUFFdkMsTUFBTSxNQUFNLElBQUksUUFBUSxHQUFHLEVBQUUsR0FBRyxDQUFDLEtBQUs7O0VBRXRDLE9BQU8sS0FBSyxFQUFFLEtBQUssU0FBUyxHQUFHOztFQUUvQixRQUFRLEtBQUssQ0FBQyxHQUFHLEVBQUUsR0FBRyxNQUFNLFlBQVksQ0FBQzs7RUFFekM7O0VBRUEsUUFBUSxFQUFFLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQztFQUN2QixRQUFRLElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFDO0VBQy9CLFFBQVEsT0FBTyxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDOztFQUUvQyxRQUFROztFQUVSLE9BQU8sS0FBSyxFQUFFLEtBQUssUUFBUSxHQUFHLE1BQU07O0VBRXBDLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQztFQUNmLE9BQU8sRUFBRSxHQUFHLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDOztFQUV4QixPQUFPLEtBQUssQ0FBQyxHQUFHLEVBQUUsR0FBRzs7RUFFckI7RUFDQSxRQUFRLE1BQU0sSUFBSSxDQUFDOztFQUVuQixRQUFROztFQUVSLE9BQU87O0VBRVA7RUFDQSxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDO0VBQ3hCLE1BQU0sTUFBTSxXQUFXLENBQUM7O0VBRXhCLE1BQU07O0VBRU47RUFDQTtFQUNBLEtBQUssS0FBSyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsR0FBRzs7RUFFMUI7O0VBRUEsTUFBTSxJQUFJLFFBQVEsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0VBRTdCLE1BQU0sS0FBSyxDQUFDLEdBQUcsUUFBUSxHQUFHOztFQUUxQixPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUM7RUFDZCxPQUFPLEVBQUUsR0FBRyxRQUFRLENBQUM7O0VBRXJCLE9BQU87O0VBRVA7O0VBRUEsTUFBTSxNQUFNLElBQUksUUFBUSxHQUFHLEVBQUUsR0FBRyxDQUFDLEtBQUs7O0VBRXRDLE9BQU8sS0FBSyxFQUFFLEtBQUssU0FBUyxHQUFHOztFQUUvQjs7RUFFQSxRQUFRLElBQUksQ0FBQyxZQUFZLEdBQUcsQ0FBQyxDQUFDO0VBQzlCLFFBQVEsT0FBTyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUM7O0VBRTdDLFFBQVE7O0VBRVIsT0FBTyxLQUFLLEVBQUUsS0FBSyxRQUFRLEdBQUcsTUFBTTs7RUFFcEMsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDO0VBQ2YsT0FBTyxFQUFFLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDOztFQUU1QixPQUFPLEtBQUssQ0FBQyxJQUFJLEVBQUUsR0FBRzs7RUFFdEI7RUFDQSxRQUFRLE1BQU0sSUFBSSxDQUFDOztFQUVuQixRQUFROztFQUVSLE9BQU87O0VBRVA7RUFDQSxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUM7RUFDakIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0VBQ2IsTUFBTSxNQUFNLFdBQVcsQ0FBQzs7RUFFeEIsTUFBTTs7RUFFTjs7RUFFQSxLQUFLLE1BQU0saUJBQWlCLENBQUM7O0VBRTdCLEtBQUs7O0VBRUw7O0VBRUEsSUFBSSxRQUFRLEVBQUUsR0FBRyxLQUFLLEdBQUc7O0VBRXpCLEtBQUssSUFBSSxHQUFHLEdBQUcsRUFBRSxFQUFFLEdBQUcsS0FBSyxPQUFPLENBQUMsQ0FBQzs7RUFFcEMsS0FBSyxLQUFLLENBQUMsR0FBRyxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUc7O0VBRTFCLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQzs7RUFFbEIsTUFBTSxNQUFNOztFQUVaLE1BQU0sRUFBRSxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7O0VBRW5CLE1BQU07O0VBRU4sS0FBSzs7RUFFTCxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUM7RUFDdEIsSUFBSSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQzs7RUFFdEI7O0VBRUEsSUFBSSxLQUFLLEVBQUUsS0FBSyxTQUFTLEdBQUc7O0VBRTVCLEtBQUssSUFBSSxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUM7RUFDM0IsS0FBSyxPQUFPLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQzs7RUFFMUMsS0FBSzs7RUFFTCxJQUFJLEtBQUssRUFBRSxLQUFLLFNBQVMsR0FBRzs7RUFFNUIsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQztFQUNwQixLQUFLLElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFDO0VBQzVCLEtBQUssT0FBTyxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDOztFQUU1QyxLQUFLOztFQUVMLElBQUk7O0VBRUosR0FBRyxJQUFJLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQzs7RUFFMUIsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQzs7RUFFdkMsR0FBRzs7RUFFSCxFQUFFLE9BQU8sSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQzs7RUFFNUMsRUFBRTs7RUFFRixDQUFDLFFBQVEsRUFBRSxJQUFJO0VBQ2Y7O0VBRUE7O0VBRUEsQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFOztFQUVyQixDQUFDLFlBQVksRUFBRSxXQUFXOztFQUUxQixFQUFFLE9BQU8sSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUM7O0VBRWhELEVBQUU7O0VBRUYsQ0FBQyxnQkFBZ0IsRUFBRSxVQUFVLEtBQUssR0FBRzs7RUFFckM7O0VBRUEsRUFBRSxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsWUFBWTtFQUNoQyxHQUFHLE1BQU0sR0FBRyxJQUFJLENBQUMsWUFBWTtFQUM3QixHQUFHLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUztFQUMxQixHQUFHLE1BQU0sR0FBRyxLQUFLLEdBQUcsTUFBTSxDQUFDOztFQUUzQixFQUFFLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsS0FBSyxNQUFNLEVBQUUsR0FBRyxDQUFDLEdBQUc7O0VBRXhDLEdBQUcsTUFBTSxFQUFFLENBQUMsRUFBRSxHQUFHLE1BQU0sRUFBRSxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7O0VBRXRDLEdBQUc7O0VBRUgsRUFBRSxPQUFPLE1BQU0sQ0FBQzs7RUFFaEIsRUFBRTs7RUFFRjs7RUFFQSxDQUFDLFlBQVksRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRzs7RUFFekMsRUFBRSxNQUFNLElBQUksS0FBSyxFQUFFLHlCQUF5QixFQUFFLENBQUM7RUFDL0M7O0VBRUEsRUFBRTs7RUFFRixDQUFDLGdCQUFnQixFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUc7O0VBRTFDOztFQUVBLEVBQUU7O0VBRUYsQ0FBQyxFQUFFLENBQUM7O0VBRUo7RUFDQSxNQUFNLENBQUMsTUFBTSxFQUFFQSxhQUFXLENBQUMsU0FBUyxFQUFFOztFQUV0QztFQUNBLENBQUMsWUFBWSxFQUFFQSxhQUFXLENBQUMsU0FBUyxDQUFDLGdCQUFnQjs7RUFFckQ7RUFDQSxDQUFDLFNBQVMsRUFBRUEsYUFBVyxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0I7O0VBRWxELENBQUMsRUFBRSxDQUFDOztFQUVKO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFQSxTQUFTNEIsa0JBQWdCLEVBQUUsa0JBQWtCLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxZQUFZLEdBQUc7O0VBRXhGLENBQUM1QixhQUFXLENBQUMsSUFBSTtFQUNqQixHQUFHLElBQUksRUFBRSxrQkFBa0IsRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxDQUFDOztFQUV0RSxDQUFDLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDLENBQUM7RUFDdkIsQ0FBQyxJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQyxDQUFDO0VBQ3ZCLENBQUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQztFQUN2QixDQUFDLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDLENBQUM7O0VBRXZCLENBQUM7O0FBRUQ0QixvQkFBZ0IsQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFNUIsYUFBVyxDQUFDLFNBQVMsRUFBRSxFQUFFOztFQUVwRixDQUFDLFdBQVcsRUFBRTRCLGtCQUFnQjs7RUFFOUIsQ0FBQyxnQkFBZ0IsRUFBRTs7RUFFbkIsRUFBRSxXQUFXLEdBQUdFLHFCQUFtQjtFQUNuQyxFQUFFLFNBQVMsR0FBR0EscUJBQW1COztFQUVqQyxFQUFFOztFQUVGLENBQUMsZ0JBQWdCLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRzs7RUFFMUMsRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsa0JBQWtCO0VBQ2xDLEdBQUcsS0FBSyxHQUFHLEVBQUUsR0FBRyxDQUFDO0VBQ2pCLEdBQUcsS0FBSyxHQUFHLEVBQUUsR0FBRyxDQUFDOztFQUVqQixHQUFHLEtBQUssR0FBRyxFQUFFLEVBQUUsS0FBSyxFQUFFO0VBQ3RCLEdBQUcsS0FBSyxHQUFHLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQzs7RUFFdkIsRUFBRSxLQUFLLEtBQUssS0FBSyxTQUFTLEdBQUc7O0VBRTdCLEdBQUcsU0FBUyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsV0FBVzs7RUFFM0MsSUFBSSxLQUFLbWtCLGlCQUFlOztFQUV4QjtFQUNBLEtBQUssS0FBSyxHQUFHLEVBQUUsQ0FBQztFQUNoQixLQUFLLEtBQUssR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQzs7RUFFekIsS0FBSyxNQUFNOztFQUVYLElBQUksS0FBS0Msa0JBQWdCOztFQUV6QjtFQUNBLEtBQUssS0FBSyxHQUFHLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0VBQzNCLEtBQUssS0FBSyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQzs7RUFFaEQsS0FBSyxNQUFNOztFQUVYLElBQUk7O0VBRUo7RUFDQSxLQUFLLEtBQUssR0FBRyxFQUFFLENBQUM7RUFDaEIsS0FBSyxLQUFLLEdBQUcsRUFBRSxDQUFDOztFQUVoQixJQUFJOztFQUVKLEdBQUc7O0VBRUgsRUFBRSxLQUFLLEtBQUssS0FBSyxTQUFTLEdBQUc7O0VBRTdCLEdBQUcsU0FBUyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsU0FBUzs7RUFFekMsSUFBSSxLQUFLRCxpQkFBZTs7RUFFeEI7RUFDQSxLQUFLLEtBQUssR0FBRyxFQUFFLENBQUM7RUFDaEIsS0FBSyxLQUFLLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7O0VBRXpCLEtBQUssTUFBTTs7RUFFWCxJQUFJLEtBQUtDLGtCQUFnQjs7RUFFekI7RUFDQSxLQUFLLEtBQUssR0FBRyxDQUFDLENBQUM7RUFDZixLQUFLLEtBQUssR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7RUFFcEMsS0FBSyxNQUFNOztFQUVYLElBQUk7O0VBRUo7RUFDQSxLQUFLLEtBQUssR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0VBQ3BCLEtBQUssS0FBSyxHQUFHLEVBQUUsQ0FBQzs7RUFFaEIsSUFBSTs7RUFFSixHQUFHOztFQUVILEVBQUUsSUFBSSxNQUFNLEdBQUcsRUFBRSxFQUFFLEdBQUcsRUFBRSxLQUFLLEdBQUc7RUFDaEMsR0FBRyxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQzs7RUFFM0IsRUFBRSxJQUFJLENBQUMsV0FBVyxHQUFHLE1BQU0sS0FBSyxFQUFFLEdBQUcsS0FBSyxFQUFFLENBQUM7RUFDN0MsRUFBRSxJQUFJLENBQUMsV0FBVyxHQUFHLE1BQU0sS0FBSyxLQUFLLEdBQUcsRUFBRSxFQUFFLENBQUM7RUFDN0MsRUFBRSxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssR0FBRyxNQUFNLENBQUM7RUFDcEMsRUFBRSxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssR0FBRyxNQUFNLENBQUM7O0VBRXBDLEVBQUU7O0VBRUYsQ0FBQyxZQUFZLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUc7O0VBRXpDLEVBQUUsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVk7RUFDaEMsR0FBRyxNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVk7RUFDN0IsR0FBRyxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVM7O0VBRTFCLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxNQUFNLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxNQUFNO0VBQ3RDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxXQUFXO0VBQ2hELEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxXQUFXOztFQUUvQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsRUFBRTtFQUMvQixHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQztFQUNiLEdBQUcsR0FBRyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7O0VBRWhCOztFQUVBLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxFQUFFLEtBQUssR0FBRyxhQUFhLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxlQUFlLEVBQUUsS0FBSyxDQUFDLENBQUM7RUFDOUUsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLEtBQUssR0FBRyxLQUFLLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztFQUN0RixFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLEdBQUcsS0FBSyxFQUFFLEdBQUcsS0FBSyxFQUFFLFFBQVEsRUFBRSxTQUFTLEdBQUcsVUFBVSxDQUFDLENBQUM7RUFDOUUsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEtBQUssR0FBRyxlQUFlLEVBQUUsUUFBUSxFQUFFLENBQUM7O0VBRXZEOztFQUVBLEVBQUUsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxLQUFLLE1BQU0sRUFBRSxHQUFHLENBQUMsR0FBRzs7RUFFeEMsR0FBRyxNQUFNLEVBQUUsQ0FBQyxFQUFFO0VBQ2QsS0FBSyxFQUFFLEdBQUcsTUFBTSxFQUFFLEVBQUUsR0FBRyxDQUFDLEVBQUU7RUFDMUIsS0FBSyxFQUFFLEdBQUcsTUFBTSxFQUFFLEVBQUUsR0FBRyxDQUFDLEVBQUU7RUFDMUIsS0FBSyxFQUFFLEdBQUcsTUFBTSxFQUFFLEVBQUUsR0FBRyxDQUFDLEVBQUU7RUFDMUIsS0FBSyxFQUFFLEdBQUcsTUFBTSxFQUFFLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQzs7RUFFM0IsR0FBRzs7RUFFSCxFQUFFLE9BQU8sTUFBTSxDQUFDOztFQUVoQixFQUFFOztFQUVGLENBQUMsRUFBRSxDQUFDOztFQUVKO0VBQ0E7RUFDQTs7RUFFQSxTQUFTcGpCLG1CQUFpQixFQUFFLGtCQUFrQixFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsWUFBWSxHQUFHOztFQUV6RixDQUFDOUMsYUFBVyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsa0JBQWtCLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsQ0FBQzs7RUFFdEYsQ0FBQzs7QUFFRDhDLHFCQUFpQixDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUU5QyxhQUFXLENBQUMsU0FBUyxFQUFFLEVBQUU7O0VBRXJGLENBQUMsV0FBVyxFQUFFOEMsbUJBQWlCOztFQUUvQixDQUFDLFlBQVksRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRzs7RUFFekMsRUFBRSxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsWUFBWTtFQUNoQyxHQUFHLE1BQU0sR0FBRyxJQUFJLENBQUMsWUFBWTtFQUM3QixHQUFHLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUzs7RUFFMUIsR0FBRyxPQUFPLEdBQUcsRUFBRSxHQUFHLE1BQU07RUFDeEIsR0FBRyxPQUFPLEdBQUcsT0FBTyxHQUFHLE1BQU07O0VBRTdCLEdBQUcsT0FBTyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxFQUFFO0VBQ3JDLEdBQUcsT0FBTyxHQUFHLENBQUMsR0FBRyxPQUFPLENBQUM7O0VBRXpCLEVBQUUsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxLQUFLLE1BQU0sRUFBRSxHQUFHLENBQUMsR0FBRzs7RUFFeEMsR0FBRyxNQUFNLEVBQUUsQ0FBQyxFQUFFO0VBQ2QsS0FBSyxNQUFNLEVBQUUsT0FBTyxHQUFHLENBQUMsRUFBRSxHQUFHLE9BQU87RUFDcEMsS0FBSyxNQUFNLEVBQUUsT0FBTyxHQUFHLENBQUMsRUFBRSxHQUFHLE9BQU8sQ0FBQzs7RUFFckMsR0FBRzs7RUFFSCxFQUFFLE9BQU8sTUFBTSxDQUFDOztFQUVoQixFQUFFOztFQUVGLENBQUMsRUFBRSxDQUFDOztFQUVKO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVBLFNBQVNLLHFCQUFtQixFQUFFLGtCQUFrQixFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsWUFBWSxHQUFHOztFQUUzRixDQUFDbkQsYUFBVyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsa0JBQWtCLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsQ0FBQzs7RUFFdEYsQ0FBQzs7QUFFRG1ELHVCQUFtQixDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUVuRCxhQUFXLENBQUMsU0FBUyxFQUFFLEVBQUU7O0VBRXZGLENBQUMsV0FBVyxFQUFFbUQscUJBQW1COztFQUVqQyxDQUFDLFlBQVksRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRzs7RUFFekMsRUFBRSxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUM7O0VBRXpDLEVBQUU7O0VBRUYsQ0FBQyxFQUFFLENBQUM7O0VBRUosSUFBSSxzQkFBc0IsQ0FBQzs7RUFFM0Isc0JBQXNCLEdBQUc7O0VBRXpCLENBQUMsY0FBYyxFQUFFLFlBQVk7RUFDN0IsQ0FBQyxlQUFlLEVBQUUsWUFBWTs7RUFFOUIsQ0FBQyxvQkFBb0IsRUFBRS9CLG1CQUFpQjs7RUFFeEMsQ0FBQyxnQ0FBZ0MsRUFBRSxXQUFXLE1BQU0sR0FBRzs7RUFFdkQsRUFBRSxPQUFPLElBQUkrQixxQkFBbUI7RUFDaEMsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDOztFQUUzRCxFQUFFOztFQUVGLENBQUMsOEJBQThCLEVBQUUsV0FBVyxNQUFNLEdBQUc7O0VBRXJELEVBQUUsT0FBTyxJQUFJTCxtQkFBaUI7RUFDOUIsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDOztFQUUzRCxFQUFFOztFQUVGLENBQUMsOEJBQThCLEVBQUUsV0FBVyxNQUFNLEdBQUc7O0VBRXJELEVBQUUsT0FBTyxJQUFJbEIsa0JBQWdCO0VBQzdCLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQzs7RUFFM0QsRUFBRTs7RUFFRixDQUFDLGdCQUFnQixFQUFFLFdBQVcsYUFBYSxHQUFHOztFQUU5QyxFQUFFLElBQUksYUFBYSxDQUFDOztFQUVwQixFQUFFLFNBQVMsYUFBYTs7RUFFeEIsR0FBRyxLQUFLdEMscUJBQW1COztFQUUzQixJQUFJLGFBQWEsR0FBRyxJQUFJLENBQUMsZ0NBQWdDLENBQUM7O0VBRTFELElBQUksTUFBTTs7RUFFVixHQUFHLEtBQUs4QixtQkFBaUI7O0VBRXpCLElBQUksYUFBYSxHQUFHLElBQUksQ0FBQyw4QkFBOEIsQ0FBQzs7RUFFeEQsSUFBSSxNQUFNOztFQUVWLEdBQUcsS0FBS3VFLG1CQUFpQjs7RUFFekIsSUFBSSxhQUFhLEdBQUcsSUFBSSxDQUFDLDhCQUE4QixDQUFDOztFQUV4RCxJQUFJLE1BQU07O0VBRVYsR0FBRzs7RUFFSCxFQUFFLEtBQUssYUFBYSxLQUFLLFNBQVMsR0FBRzs7RUFFckMsR0FBRyxJQUFJLE9BQU8sR0FBRyxnQ0FBZ0M7RUFDakQsS0FBSyxJQUFJLENBQUMsYUFBYSxHQUFHLHdCQUF3QixHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7O0VBRS9ELEdBQUcsS0FBSyxJQUFJLENBQUMsaUJBQWlCLEtBQUssU0FBUyxHQUFHOztFQUUvQztFQUNBLElBQUksS0FBSyxhQUFhLEtBQUssSUFBSSxDQUFDLG9CQUFvQixHQUFHOztFQUV2RCxLQUFLLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQzs7RUFFeEQsS0FBSyxNQUFNOztFQUVYLEtBQUssTUFBTSxJQUFJLEtBQUssRUFBRSxPQUFPLEVBQUUsQ0FBQzs7RUFFaEMsS0FBSzs7RUFFTCxJQUFJOztFQUVKLEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQztFQUMzQixHQUFHLE9BQU87O0VBRVYsR0FBRzs7RUFFSCxFQUFFLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxhQUFhLENBQUM7O0VBRXpDLEVBQUU7O0VBRUYsQ0FBQyxnQkFBZ0IsRUFBRSxZQUFZOztFQUUvQixFQUFFLFNBQVMsSUFBSSxDQUFDLGlCQUFpQjs7RUFFakMsR0FBRyxLQUFLLElBQUksQ0FBQyxnQ0FBZ0M7O0VBRTdDLElBQUksT0FBT3JHLHFCQUFtQixDQUFDOztFQUUvQixHQUFHLEtBQUssSUFBSSxDQUFDLDhCQUE4Qjs7RUFFM0MsSUFBSSxPQUFPOEIsbUJBQWlCLENBQUM7O0VBRTdCLEdBQUcsS0FBSyxJQUFJLENBQUMsOEJBQThCOztFQUUzQyxJQUFJLE9BQU91RSxtQkFBaUIsQ0FBQzs7RUFFN0IsR0FBRzs7RUFFSCxFQUFFOztFQUVGLENBQUMsWUFBWSxFQUFFLFlBQVk7O0VBRTNCLEVBQUUsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQzs7RUFFaEQsRUFBRTs7RUFFRjtFQUNBLENBQUMsS0FBSyxFQUFFLFdBQVcsVUFBVSxHQUFHOztFQUVoQyxFQUFFLEtBQUssVUFBVSxLQUFLLEdBQUcsR0FBRzs7RUFFNUIsR0FBRyxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDOztFQUUxQixHQUFHLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUc7O0VBRXRELElBQUksS0FBSyxFQUFFLENBQUMsRUFBRSxJQUFJLFVBQVUsQ0FBQzs7RUFFN0IsSUFBSTs7RUFFSixHQUFHOztFQUVILEVBQUUsT0FBTyxJQUFJLENBQUM7O0VBRWQsRUFBRTs7RUFFRjtFQUNBLENBQUMsS0FBSyxFQUFFLFdBQVcsU0FBUyxHQUFHOztFQUUvQixFQUFFLEtBQUssU0FBUyxLQUFLLEdBQUcsR0FBRzs7RUFFM0IsR0FBRyxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDOztFQUUxQixHQUFHLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUc7O0VBRXRELElBQUksS0FBSyxFQUFFLENBQUMsRUFBRSxJQUFJLFNBQVMsQ0FBQzs7RUFFNUIsSUFBSTs7RUFFSixHQUFHOztFQUVILEVBQUUsT0FBTyxJQUFJLENBQUM7O0VBRWQsRUFBRTs7RUFFRjtFQUNBO0VBQ0EsQ0FBQyxJQUFJLEVBQUUsV0FBVyxTQUFTLEVBQUUsT0FBTyxHQUFHOztFQUV2QyxFQUFFLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLO0VBQ3hCLEdBQUcsS0FBSyxHQUFHLEtBQUssQ0FBQyxNQUFNO0VBQ3ZCLEdBQUcsSUFBSSxHQUFHLENBQUM7RUFDWCxHQUFHLEVBQUUsR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFDOztFQUVsQixFQUFFLFFBQVEsSUFBSSxLQUFLLEtBQUssSUFBSSxLQUFLLEVBQUUsSUFBSSxFQUFFLEdBQUcsU0FBUyxHQUFHLEdBQUcsSUFBSSxDQUFDO0VBQ2hFLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLElBQUksS0FBSyxFQUFFLEVBQUUsRUFBRSxHQUFHLE9BQU8sR0FBRyxHQUFHLEVBQUUsQ0FBQzs7RUFFdEQsRUFBRSxHQUFHLEVBQUUsQ0FBQzs7RUFFUixFQUFFLEtBQUssSUFBSSxLQUFLLENBQUMsSUFBSSxFQUFFLEtBQUssS0FBSyxHQUFHOztFQUVwQztFQUNBLEdBQUcsS0FBSyxJQUFJLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxJQUFJLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQzs7RUFFM0QsR0FBRyxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7RUFDcEMsR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHcEMsZ0JBQWMsQ0FBQyxVQUFVLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQztFQUM3RCxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUdBLGdCQUFjO0VBQy9CLEtBQUssVUFBVSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxHQUFHLE1BQU0sRUFBRSxFQUFFLEdBQUcsTUFBTSxFQUFFLENBQUM7O0VBRTNELEdBQUc7O0VBRUgsRUFBRSxPQUFPLElBQUksQ0FBQzs7RUFFZCxFQUFFOztFQUVGO0VBQ0EsQ0FBQyxRQUFRLEVBQUUsWUFBWTs7RUFFdkIsRUFBRSxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUM7O0VBRW5CLEVBQUUsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0VBQ3RDLEVBQUUsS0FBSyxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsS0FBSyxDQUFDLEdBQUc7O0VBRW5ELEdBQUcsT0FBTyxDQUFDLEtBQUssRUFBRSw2QkFBNkIsRUFBRSxJQUFJLEVBQUUsQ0FBQztFQUN4RCxHQUFHLEtBQUssR0FBRyxLQUFLLENBQUM7O0VBRWpCLEdBQUc7O0VBRUgsRUFBRSxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSztFQUN4QixHQUFHLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTTs7RUFFdkIsR0FBRyxLQUFLLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQzs7RUFFeEIsRUFBRSxLQUFLLEtBQUssS0FBSyxDQUFDLEdBQUc7O0VBRXJCLEdBQUcsT0FBTyxDQUFDLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxJQUFJLEVBQUUsQ0FBQztFQUMzQyxHQUFHLEtBQUssR0FBRyxLQUFLLENBQUM7O0VBRWpCLEdBQUc7O0VBRUgsRUFBRSxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUM7O0VBRXRCLEVBQUUsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEtBQUssRUFBRSxDQUFDLEdBQUcsR0FBRzs7RUFFdkMsR0FBRyxJQUFJLFFBQVEsR0FBRyxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0VBRTdCLEdBQUcsS0FBSyxPQUFPLFFBQVEsS0FBSyxRQUFRLElBQUksS0FBSyxFQUFFLFFBQVEsRUFBRSxHQUFHOztFQUU1RCxJQUFJLE9BQU8sQ0FBQyxLQUFLLEVBQUUsNEJBQTRCLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQztFQUNyRSxJQUFJLEtBQUssR0FBRyxLQUFLLENBQUM7RUFDbEIsSUFBSSxNQUFNOztFQUVWLElBQUk7O0VBRUosR0FBRyxLQUFLLFFBQVEsS0FBSyxJQUFJLElBQUksUUFBUSxHQUFHLFFBQVEsR0FBRzs7RUFFbkQsSUFBSSxPQUFPLENBQUMsS0FBSyxFQUFFLG1CQUFtQixFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxDQUFDO0VBQ3RFLElBQUksS0FBSyxHQUFHLEtBQUssQ0FBQztFQUNsQixJQUFJLE1BQU07O0VBRVYsSUFBSTs7RUFFSixHQUFHLFFBQVEsR0FBRyxRQUFRLENBQUM7O0VBRXZCLEdBQUc7O0VBRUgsRUFBRSxLQUFLLE1BQU0sS0FBSyxTQUFTLEdBQUc7O0VBRTlCLEdBQUcsS0FBS0EsZ0JBQWMsQ0FBQyxZQUFZLEVBQUUsTUFBTSxFQUFFLEdBQUc7O0VBRWhELElBQUksTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRzs7RUFFeEQsS0FBSyxJQUFJLEtBQUssR0FBRyxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0VBRTdCLEtBQUssS0FBSyxLQUFLLEVBQUUsS0FBSyxFQUFFLEdBQUc7O0VBRTNCLE1BQU0sT0FBTyxDQUFDLEtBQUssRUFBRSw2QkFBNkIsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDO0VBQ3JFLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQztFQUNwQixNQUFNLE1BQU07O0VBRVosTUFBTTs7RUFFTixLQUFLOztFQUVMLElBQUk7O0VBRUosR0FBRzs7RUFFSCxFQUFFLE9BQU8sS0FBSyxDQUFDOztFQUVmLEVBQUU7O0VBRUY7RUFDQTtFQUNBLENBQUMsUUFBUSxFQUFFLFlBQVk7O0VBRXZCLEVBQUUsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUs7RUFDeEIsR0FBRyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU07RUFDdkIsR0FBRyxNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRTs7RUFFL0IsR0FBRyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsS0FBS29DLG1CQUFpQjs7RUFFdEUsR0FBRyxVQUFVLEdBQUcsQ0FBQztFQUNqQixHQUFHLFNBQVMsR0FBRyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQzs7RUFFaEMsRUFBRSxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxFQUFFLEdBQUcsQ0FBQyxHQUFHOztFQUV6QyxHQUFHLElBQUksSUFBSSxHQUFHLEtBQUssQ0FBQzs7RUFFcEIsR0FBRyxJQUFJLElBQUksR0FBRyxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUM7RUFDekIsR0FBRyxJQUFJLFFBQVEsR0FBRyxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDOztFQUVqQzs7RUFFQSxHQUFHLEtBQUssSUFBSSxLQUFLLFFBQVEsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksS0FBSyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRzs7RUFFakUsSUFBSSxLQUFLLEVBQUUsbUJBQW1CLEdBQUc7O0VBRWpDOztFQUVBLEtBQUssSUFBSSxNQUFNLEdBQUcsQ0FBQyxHQUFHLE1BQU07RUFDNUIsTUFBTSxPQUFPLEdBQUcsTUFBTSxHQUFHLE1BQU07RUFDL0IsTUFBTSxPQUFPLEdBQUcsTUFBTSxHQUFHLE1BQU0sQ0FBQzs7RUFFaEMsS0FBSyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEtBQUssTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHOztFQUUzQyxNQUFNLElBQUksS0FBSyxHQUFHLE1BQU0sRUFBRSxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7O0VBRXZDLE1BQU0sS0FBSyxLQUFLLEtBQUssTUFBTSxFQUFFLE9BQU8sR0FBRyxDQUFDLEVBQUU7RUFDMUMsUUFBUSxLQUFLLEtBQUssTUFBTSxFQUFFLE9BQU8sR0FBRyxDQUFDLEVBQUUsR0FBRzs7RUFFMUMsT0FBTyxJQUFJLEdBQUcsSUFBSSxDQUFDO0VBQ25CLE9BQU8sTUFBTTs7RUFFYixPQUFPOztFQUVQLE1BQU07O0VBRU4sS0FBSyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUM7O0VBRXZCLElBQUk7O0VBRUo7O0VBRUEsR0FBRyxLQUFLLElBQUksR0FBRzs7RUFFZixJQUFJLEtBQUssQ0FBQyxLQUFLLFVBQVUsR0FBRzs7RUFFNUIsS0FBSyxLQUFLLEVBQUUsVUFBVSxFQUFFLEdBQUcsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDOztFQUV0QyxLQUFLLElBQUksVUFBVSxHQUFHLENBQUMsR0FBRyxNQUFNO0VBQ2hDLE1BQU0sV0FBVyxHQUFHLFVBQVUsR0FBRyxNQUFNLENBQUM7O0VBRXhDLEtBQUssTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxLQUFLLE1BQU0sRUFBRSxHQUFHLENBQUM7O0VBRXhDLE1BQU0sTUFBTSxFQUFFLFdBQVcsR0FBRyxDQUFDLEVBQUUsR0FBRyxNQUFNLEVBQUUsVUFBVSxHQUFHLENBQUMsRUFBRSxDQUFDOztFQUUzRCxLQUFLOztFQUVMLElBQUksR0FBRyxVQUFVLENBQUM7O0VBRWxCLElBQUk7O0VBRUosR0FBRzs7RUFFSDs7RUFFQSxFQUFFLEtBQUssU0FBUyxHQUFHLENBQUMsR0FBRzs7RUFFdkIsR0FBRyxLQUFLLEVBQUUsVUFBVSxFQUFFLEdBQUcsS0FBSyxFQUFFLFNBQVMsRUFBRSxDQUFDOztFQUU1QyxHQUFHLE1BQU0sSUFBSSxVQUFVLEdBQUcsU0FBUyxHQUFHLE1BQU0sRUFBRSxXQUFXLEdBQUcsVUFBVSxHQUFHLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsS0FBSyxNQUFNLEVBQUUsR0FBRyxDQUFDOztFQUUxRyxJQUFJLE1BQU0sRUFBRSxXQUFXLEdBQUcsQ0FBQyxFQUFFLEdBQUcsTUFBTSxFQUFFLFVBQVUsR0FBRyxDQUFDLEVBQUUsQ0FBQzs7RUFFekQsR0FBRyxHQUFHLFVBQVUsQ0FBQzs7RUFFakIsR0FBRzs7RUFFSCxFQUFFLEtBQUssVUFBVSxLQUFLLEtBQUssQ0FBQyxNQUFNLEdBQUc7O0VBRXJDLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBR3BDLGdCQUFjLENBQUMsVUFBVSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUM7RUFDbEUsR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHQSxnQkFBYyxDQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLFVBQVUsR0FBRyxNQUFNLEVBQUUsQ0FBQzs7RUFFN0UsR0FBRzs7RUFFSCxFQUFFLE9BQU8sSUFBSSxDQUFDOztFQUVkLEVBQUU7O0VBRUYsQ0FBQyxDQUFDOztFQUVGLFNBQVMsd0JBQXdCLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsYUFBYSxHQUFHOztFQUV4RSxDQUFDLEtBQUssSUFBSSxLQUFLLFNBQVMsR0FBRyxNQUFNLElBQUksS0FBSyxFQUFFLHlCQUF5QixFQUFFLENBQUM7O0VBRXhFLENBQUMsS0FBSyxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxHQUFHOztFQUVsRCxFQUFFLE1BQU0sSUFBSSxLQUFLLEVBQUUsOEJBQThCLEdBQUcsSUFBSSxFQUFFLENBQUM7O0VBRTNELEVBQUU7O0VBRUYsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQzs7RUFFbEIsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHQSxnQkFBYyxDQUFDLFlBQVksRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO0VBQ3hFLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBR0EsZ0JBQWMsQ0FBQyxZQUFZLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQzs7RUFFM0UsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsYUFBYSxJQUFJLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDOztFQUVyRSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztFQUNqQixDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQzs7RUFFakIsQ0FBQzs7RUFFRDtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUEsU0FBUzRDLHFCQUFtQixFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLGFBQWEsR0FBRzs7RUFFbkUsQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxDQUFDOztFQUUzRSxDQUFDOztBQUVEQSx1QkFBbUIsQ0FBQyxTQUFTO0VBQzdCLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFLHNCQUFzQixFQUFFLEVBQUU7O0VBRTFELENBQUMsV0FBVyxFQUFFQSxxQkFBbUI7O0VBRWpDLENBQUMsYUFBYSxFQUFFLFFBQVE7O0VBRXhCOztFQUVBOztFQUVBLENBQUMsRUFBRSxDQUFDOztFQUVKO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUEsU0FBU2pGLDZCQUEyQixFQUFFLGtCQUFrQixFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsWUFBWSxHQUFHOztFQUVuRyxDQUFDbEIsYUFBVyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsa0JBQWtCLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsQ0FBQzs7RUFFdEYsQ0FBQzs7QUFFRGtCLCtCQUEyQixDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUVsQixhQUFXLENBQUMsU0FBUyxFQUFFLEVBQUU7O0VBRS9GLENBQUMsV0FBVyxFQUFFa0IsNkJBQTJCOztFQUV6QyxDQUFDLFlBQVksRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRzs7RUFFekMsRUFBRSxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsWUFBWTtFQUNoQyxHQUFHLE1BQU0sR0FBRyxJQUFJLENBQUMsWUFBWTtFQUM3QixHQUFHLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUzs7RUFFMUIsR0FBRyxNQUFNLEdBQUcsRUFBRSxHQUFHLE1BQU07O0VBRXZCLEdBQUcsS0FBSyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUM7O0VBRXBDLEVBQUUsTUFBTSxJQUFJLEdBQUcsR0FBRyxNQUFNLEdBQUcsTUFBTSxFQUFFLE1BQU0sS0FBSyxHQUFHLEVBQUUsTUFBTSxJQUFJLENBQUMsR0FBRzs7RUFFakUsR0FBRzVvRixZQUFVLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxDQUFDO0VBQ2xDLEtBQUssTUFBTSxFQUFFLE1BQU0sR0FBRyxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQzs7RUFFdEQsR0FBRzs7RUFFSCxFQUFFLE9BQU8sTUFBTSxDQUFDOztFQUVoQixFQUFFOztFQUVGLENBQUMsRUFBRSxDQUFDOztFQUVKO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUEsU0FBUzZvRix5QkFBdUIsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxhQUFhLEdBQUc7O0VBRXZFLENBQUMsd0JBQXdCLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsQ0FBQzs7RUFFM0UsQ0FBQzs7QUFFREEsMkJBQXVCLENBQUMsU0FBUztFQUNqQyxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxzQkFBc0IsRUFBRSxFQUFFOztFQUUxRCxDQUFDLFdBQVcsRUFBRUEseUJBQXVCOztFQUVyQyxDQUFDLGFBQWEsRUFBRSxZQUFZOztFQUU1Qjs7RUFFQSxDQUFDLG9CQUFvQixFQUFFQyxtQkFBaUI7O0VBRXhDLENBQUMsOEJBQThCLEVBQUUsVUFBVSxNQUFNLEdBQUc7O0VBRXBELEVBQUUsT0FBTyxJQUFJRiw2QkFBMkI7RUFDeEMsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDOztFQUUzRCxFQUFFOztFQUVGLENBQUMsOEJBQThCLEVBQUUsU0FBUzs7RUFFMUMsQ0FBQyxFQUFFLENBQUM7O0VBRUo7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFQSxTQUFTSyxxQkFBbUIsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxhQUFhLEdBQUc7O0VBRW5FLENBQUMsd0JBQXdCLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsQ0FBQzs7RUFFM0UsQ0FBQzs7QUFFREEsdUJBQW1CLENBQUMsU0FBUztFQUM3QixFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxzQkFBc0IsRUFBRSxFQUFFOztFQUUxRCxDQUFDLFdBQVcsRUFBRUEscUJBQW1COztFQUVqQyxDQUFDLGFBQWEsRUFBRSxRQUFROztFQUV4Qjs7RUFFQTs7RUFFQSxDQUFDLEVBQUUsQ0FBQzs7RUFFSjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUEsU0FBU3JDLHFCQUFtQixFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLGFBQWEsR0FBRzs7RUFFbkUsQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxDQUFDOztFQUUzRSxDQUFDOztBQUVEQSx1QkFBbUIsQ0FBQyxTQUFTO0VBQzdCLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFLHNCQUFzQixFQUFFLEVBQUU7O0VBRTFELENBQUMsV0FBVyxFQUFFQSxxQkFBbUI7O0VBRWpDLENBQUMsYUFBYSxFQUFFLFFBQVE7RUFDeEIsQ0FBQyxlQUFlLEVBQUUsS0FBSzs7RUFFdkIsQ0FBQyxvQkFBb0IsRUFBRUkscUJBQW1COztFQUUxQyxDQUFDLDhCQUE4QixFQUFFLFNBQVM7O0VBRTFDLENBQUMsOEJBQThCLEVBQUUsU0FBUzs7RUFFMUMsQ0FBQyxFQUFFLENBQUM7O0VBRUo7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVBLFNBQVNHLHNCQUFvQixFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxHQUFHOztFQUVyRCxDQUFDLHdCQUF3QixDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQzs7RUFFNUQsQ0FBQzs7QUFFREEsd0JBQW9CLENBQUMsU0FBUztFQUM5QixFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxzQkFBc0IsRUFBRSxFQUFFOztFQUUxRCxDQUFDLFdBQVcsRUFBRUEsc0JBQW9COztFQUVsQyxDQUFDLGFBQWEsRUFBRSxNQUFNO0VBQ3RCLENBQUMsZUFBZSxFQUFFLEtBQUs7O0VBRXZCLENBQUMsb0JBQW9CLEVBQUVILHFCQUFtQjs7RUFFMUMsQ0FBQyw4QkFBOEIsRUFBRSxTQUFTO0VBQzFDLENBQUMsOEJBQThCLEVBQUUsU0FBUzs7RUFFMUM7RUFDQTtFQUNBOztFQUVBLENBQUMsRUFBRSxDQUFDOztFQUVKO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7RUFFQSxTQUFTZ0Msb0JBQWtCLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsYUFBYSxHQUFHOztFQUVsRSxDQUFDLHdCQUF3QixDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLENBQUM7O0VBRTNFLENBQUM7O0FBRURBLHNCQUFrQixDQUFDLFNBQVM7RUFDNUIsRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsc0JBQXNCLEVBQUUsRUFBRTs7RUFFMUQsQ0FBQyxXQUFXLEVBQUVBLG9CQUFrQjs7RUFFaEMsQ0FBQyxhQUFhLEVBQUUsT0FBTzs7RUFFdkI7O0VBRUE7OztFQUdBO0VBQ0E7O0VBRUEsQ0FBQyxFQUFFLENBQUM7O0VBRUo7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVBLFNBQVNyQyxlQUFhLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsYUFBYSxHQUFHOztFQUU3RCxDQUFDLHdCQUF3QixDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUM7O0VBRW5ELENBQUM7O0FBRURBLGlCQUFhLENBQUMsU0FBUyxHQUFHLHNCQUFzQixDQUFDO0VBQ2pELHNCQUFzQixDQUFDLFdBQVcsR0FBR0EsZUFBYSxDQUFDOztFQUVuRDs7RUFFQSxNQUFNLENBQUMsTUFBTSxFQUFFQSxlQUFhLEVBQUU7O0VBRTlCO0VBQ0E7O0VBRUEsQ0FBQyxLQUFLLEVBQUUsVUFBVSxJQUFJLEdBQUc7O0VBRXpCLEVBQUUsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLFNBQVMsR0FBRzs7RUFFaEMsR0FBRyxNQUFNLElBQUksS0FBSyxFQUFFLHFDQUFxQyxFQUFFLENBQUM7O0VBRTVELEdBQUc7O0VBRUgsRUFBRSxJQUFJLFNBQVMsR0FBR0EsZUFBYSxDQUFDLDZCQUE2QixFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQzs7RUFFM0UsRUFBRSxLQUFLLElBQUksQ0FBQyxLQUFLLEtBQUssU0FBUyxHQUFHOztFQUVsQyxHQUFHLElBQUksS0FBSyxHQUFHLEVBQUUsRUFBRSxNQUFNLEdBQUcsRUFBRSxDQUFDOztFQUUvQixHQUFHc0UsZ0JBQWMsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxDQUFDOztFQUVuRSxHQUFHLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0VBQ3RCLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7O0VBRXhCLEdBQUc7O0VBRUg7RUFDQSxFQUFFLEtBQUssU0FBUyxDQUFDLEtBQUssS0FBSyxTQUFTLEdBQUc7O0VBRXZDLEdBQUcsT0FBTyxTQUFTLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDOztFQUVsQyxHQUFHLE1BQU07O0VBRVQ7RUFDQSxHQUFHLE9BQU8sSUFBSSxTQUFTO0VBQ3ZCLEtBQUssSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDOztFQUU5RCxHQUFHOztFQUVILEVBQUU7O0VBRUYsQ0FBQyxNQUFNLEVBQUUsVUFBVSxLQUFLLEdBQUc7O0VBRTNCLEVBQUUsSUFBSSxTQUFTLEdBQUcsS0FBSyxDQUFDLFdBQVcsQ0FBQzs7RUFFcEMsRUFBRSxJQUFJLElBQUksQ0FBQzs7RUFFWDtFQUNBLEVBQUUsS0FBSyxTQUFTLENBQUMsTUFBTSxLQUFLLFNBQVMsR0FBRzs7RUFFeEMsR0FBRyxJQUFJLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQzs7RUFFcEMsR0FBRyxNQUFNOztFQUVUO0VBQ0EsR0FBRyxJQUFJLEdBQUc7O0VBRVYsSUFBSSxNQUFNLEVBQUUsS0FBSyxDQUFDLElBQUk7RUFDdEIsSUFBSSxPQUFPLEVBQUVBLGdCQUFjLENBQUMsWUFBWSxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFO0VBQzlELElBQUksUUFBUSxFQUFFQSxnQkFBYyxDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRTs7RUFFaEUsSUFBSSxDQUFDOztFQUVMLEdBQUcsSUFBSSxhQUFhLEdBQUcsS0FBSyxDQUFDLGdCQUFnQixFQUFFLENBQUM7O0VBRWhELEdBQUcsS0FBSyxhQUFhLEtBQUssS0FBSyxDQUFDLG9CQUFvQixHQUFHOztFQUV2RCxJQUFJLElBQUksQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFDOztFQUV2QyxJQUFJOztFQUVKLEdBQUc7O0VBRUgsRUFBRSxJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxhQUFhLENBQUM7O0VBRWxDLEVBQUUsT0FBTyxJQUFJLENBQUM7O0VBRWQsRUFBRTs7RUFFRixDQUFDLDZCQUE2QixFQUFFLFVBQVUsUUFBUSxHQUFHOztFQUVyRCxFQUFFLFFBQVEsUUFBUSxDQUFDLFdBQVcsRUFBRTs7RUFFaEMsR0FBRyxLQUFLLFFBQVEsQ0FBQztFQUNqQixHQUFHLEtBQUssUUFBUSxDQUFDO0VBQ2pCLEdBQUcsS0FBSyxPQUFPLENBQUM7RUFDaEIsR0FBRyxLQUFLLFFBQVEsQ0FBQztFQUNqQixHQUFHLEtBQUssU0FBUzs7RUFFakIsSUFBSSxPQUFPaEMscUJBQW1CLENBQUM7O0VBRS9CLEdBQUcsS0FBSyxRQUFRLENBQUM7RUFDakIsR0FBRyxLQUFLLFNBQVMsQ0FBQztFQUNsQixHQUFHLEtBQUssU0FBUyxDQUFDO0VBQ2xCLEdBQUcsS0FBSyxTQUFTOztFQUVqQixJQUFJLE9BQU80RSxxQkFBbUIsQ0FBQzs7RUFFL0IsR0FBRyxLQUFLLE9BQU87O0VBRWYsSUFBSSxPQUFPN0Usb0JBQWtCLENBQUM7O0VBRTlCLEdBQUcsS0FBSyxZQUFZOztFQUVwQixJQUFJLE9BQU9ILHlCQUF1QixDQUFDOztFQUVuQyxHQUFHLEtBQUssTUFBTSxDQUFDO0VBQ2YsR0FBRyxLQUFLLFNBQVM7O0VBRWpCLElBQUksT0FBTzFCLHNCQUFvQixDQUFDOztFQUVoQyxHQUFHLEtBQUssUUFBUTs7RUFFaEIsSUFBSSxPQUFPUCxxQkFBbUIsQ0FBQzs7RUFFL0IsR0FBRzs7RUFFSCxFQUFFLE1BQU0sSUFBSSxLQUFLLEVBQUUsd0JBQXdCLEdBQUcsUUFBUSxFQUFFLENBQUM7O0VBRXpELEVBQUU7O0VBRUYsQ0FBQyxFQUFFLENBQUM7O0VBRUo7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUEsU0FBU3FILGVBQWEsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE1BQU0sR0FBRzs7RUFFakQsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztFQUNsQixDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0VBQ3RCLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLFFBQVEsS0FBSyxTQUFTLEtBQUssUUFBUSxHQUFHLEVBQUUsQ0FBQyxDQUFDOztFQUU3RCxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUd2OEYsT0FBSyxDQUFDLFlBQVksRUFBRSxDQUFDOztFQUVsQztFQUNBLENBQUMsS0FBSyxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsR0FBRzs7RUFFMUIsRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7O0VBRXZCLEVBQUU7O0VBRUYsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7O0VBRWpCLENBQUM7O0VBRUQsTUFBTSxDQUFDLE1BQU0sRUFBRXU4RixlQUFhLEVBQUU7O0VBRTlCLENBQUMsS0FBSyxFQUFFLFdBQVcsSUFBSSxHQUFHOztFQUUxQixFQUFFLElBQUksTUFBTSxHQUFHLEVBQUU7RUFDakIsR0FBRyxVQUFVLEdBQUcsSUFBSSxDQUFDLE1BQU07RUFDM0IsR0FBRyxTQUFTLEdBQUcsR0FBRyxLQUFLLElBQUksQ0FBQyxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7O0VBRXpDLEVBQUUsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRzs7RUFFMUQsR0FBRyxNQUFNLENBQUMsSUFBSSxFQUFFdEgsZUFBYSxDQUFDLEtBQUssRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLEVBQUUsQ0FBQzs7RUFFNUUsR0FBRzs7RUFFSCxFQUFFLE9BQU8sSUFBSXNILGVBQWEsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLENBQUM7O0VBRS9ELEVBQUU7O0VBRUYsQ0FBQyxNQUFNLEVBQUUsV0FBVyxJQUFJLEdBQUc7O0VBRTNCLEVBQUUsSUFBSSxNQUFNLEdBQUcsRUFBRTtFQUNqQixHQUFHLFVBQVUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDOztFQUU1QixFQUFFLElBQUksSUFBSSxHQUFHOztFQUViLEdBQUcsTUFBTSxFQUFFLElBQUksQ0FBQyxJQUFJO0VBQ3BCLEdBQUcsVUFBVSxFQUFFLElBQUksQ0FBQyxRQUFRO0VBQzVCLEdBQUcsUUFBUSxFQUFFLE1BQU07O0VBRW5CLEdBQUcsQ0FBQzs7RUFFSixFQUFFLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUc7O0VBRTFELEdBQUcsTUFBTSxDQUFDLElBQUksRUFBRXRILGVBQWEsQ0FBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQzs7RUFFMUQsR0FBRzs7RUFFSCxFQUFFLE9BQU8sSUFBSSxDQUFDOztFQUVkLEVBQUU7O0VBRUYsQ0FBQyw2QkFBNkIsRUFBRSxXQUFXLElBQUksRUFBRSxtQkFBbUIsRUFBRSxHQUFHLEVBQUUsTUFBTSxHQUFHOztFQUVwRixFQUFFLElBQUksZUFBZSxHQUFHLG1CQUFtQixDQUFDLE1BQU0sQ0FBQztFQUNuRCxFQUFFLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQzs7RUFFbEIsRUFBRSxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsZUFBZSxFQUFFLENBQUMsR0FBRyxHQUFHOztFQUUvQyxHQUFHLElBQUksS0FBSyxHQUFHLEVBQUUsQ0FBQztFQUNsQixHQUFHLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQzs7RUFFbkIsR0FBRyxLQUFLLENBQUMsSUFBSTtFQUNiLEtBQUssRUFBRSxDQUFDLEdBQUcsZUFBZSxHQUFHLENBQUMsS0FBSyxlQUFlO0VBQ2xELEtBQUssQ0FBQztFQUNOLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLGVBQWUsRUFBRSxDQUFDOztFQUVuQyxHQUFHLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7RUFFMUIsR0FBRyxJQUFJLEtBQUssR0FBR3NFLGdCQUFjLENBQUMsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLENBQUM7RUFDeEQsR0FBRyxLQUFLLEdBQUdBLGdCQUFjLENBQUMsV0FBVyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUM7RUFDekQsR0FBRyxNQUFNLEdBQUdBLGdCQUFjLENBQUMsV0FBVyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUM7O0VBRTNEO0VBQ0E7RUFDQSxHQUFHLEtBQUssRUFBRSxNQUFNLElBQUksS0FBSyxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsR0FBRzs7RUFFdkMsSUFBSSxLQUFLLENBQUMsSUFBSSxFQUFFLGVBQWUsRUFBRSxDQUFDO0VBQ2xDLElBQUksTUFBTSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7RUFFL0IsSUFBSTs7RUFFSixHQUFHLE1BQU0sQ0FBQyxJQUFJO0VBQ2QsS0FBSyxJQUFJaEMscUJBQW1CO0VBQzVCLE1BQU0seUJBQXlCLEdBQUcsbUJBQW1CLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxHQUFHLEdBQUc7RUFDckUsTUFBTSxLQUFLLEVBQUUsTUFBTTtFQUNuQixNQUFNLENBQUMsS0FBSyxFQUFFLEdBQUcsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDOztFQUU1QixHQUFHOztFQUVILEVBQUUsT0FBTyxJQUFJZ0YsZUFBYSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQzs7RUFFaEQsRUFBRTs7RUFFRixDQUFDLFVBQVUsRUFBRSxXQUFXLGlCQUFpQixFQUFFLElBQUksR0FBRzs7RUFFbEQsRUFBRSxJQUFJLFNBQVMsR0FBRyxpQkFBaUIsQ0FBQzs7RUFFcEMsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxHQUFHOztFQUU5QyxHQUFHLElBQUksQ0FBQyxHQUFHLGlCQUFpQixDQUFDO0VBQzdCLEdBQUcsU0FBUyxHQUFHLENBQUMsQ0FBQyxRQUFRLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxVQUFVLElBQUksQ0FBQyxDQUFDLFVBQVUsQ0FBQzs7RUFFbkUsR0FBRzs7RUFFSCxFQUFFLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxHQUFHOztFQUVoRCxHQUFHLEtBQUssU0FBUyxFQUFFLENBQUMsRUFBRSxDQUFDLElBQUksS0FBSyxJQUFJLEdBQUc7O0VBRXZDLElBQUksT0FBTyxTQUFTLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0VBRTFCLElBQUk7O0VBRUosR0FBRzs7RUFFSCxFQUFFLE9BQU8sSUFBSSxDQUFDOztFQUVkLEVBQUU7O0VBRUYsQ0FBQyxtQ0FBbUMsRUFBRSxXQUFXLFlBQVksRUFBRSxHQUFHLEVBQUUsTUFBTSxHQUFHOztFQUU3RSxFQUFFLElBQUksdUJBQXVCLEdBQUcsRUFBRSxDQUFDOztFQUVuQztFQUNBO0VBQ0EsRUFBRSxJQUFJLE9BQU8sR0FBRyxvQkFBb0IsQ0FBQzs7RUFFckM7RUFDQTtFQUNBLEVBQUUsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRzs7RUFFNUQsR0FBRyxJQUFJLFdBQVcsR0FBRyxZQUFZLEVBQUUsQ0FBQyxFQUFFLENBQUM7RUFDdkMsR0FBRyxJQUFJLEtBQUssR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsQ0FBQzs7RUFFakQsR0FBRyxLQUFLLEtBQUssSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRzs7RUFFcEMsSUFBSSxJQUFJLElBQUksR0FBRyxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0VBRTFCLElBQUksSUFBSSxxQkFBcUIsR0FBRyx1QkFBdUIsRUFBRSxJQUFJLEVBQUUsQ0FBQztFQUNoRSxJQUFJLEtBQUssRUFBRSxxQkFBcUIsR0FBRzs7RUFFbkMsS0FBSyx1QkFBdUIsRUFBRSxJQUFJLEVBQUUsR0FBRyxxQkFBcUIsR0FBRyxFQUFFLENBQUM7O0VBRWxFLEtBQUs7O0VBRUwsSUFBSSxxQkFBcUIsQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUFFLENBQUM7O0VBRTlDLElBQUk7O0VBRUosR0FBRzs7RUFFSCxFQUFFLElBQUksS0FBSyxHQUFHLEVBQUUsQ0FBQzs7RUFFakIsRUFBRSxNQUFNLElBQUksSUFBSSxJQUFJLHVCQUF1QixHQUFHOztFQUU5QyxHQUFHLEtBQUssQ0FBQyxJQUFJLEVBQUVBLGVBQWEsQ0FBQyw2QkFBNkIsRUFBRSxJQUFJLEVBQUUsdUJBQXVCLEVBQUUsSUFBSSxFQUFFLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxFQUFFLENBQUM7O0VBRW5ILEdBQUc7O0VBRUgsRUFBRSxPQUFPLEtBQUssQ0FBQzs7RUFFZixFQUFFOztFQUVGO0VBQ0EsQ0FBQyxjQUFjLEVBQUUsV0FBVyxTQUFTLEVBQUUsS0FBSyxHQUFHOztFQUUvQyxFQUFFLEtBQUssRUFBRSxTQUFTLEdBQUc7O0VBRXJCLEdBQUcsT0FBTyxDQUFDLEtBQUssRUFBRSxtQ0FBbUMsRUFBRSxDQUFDO0VBQ3hELEdBQUcsT0FBTyxJQUFJLENBQUM7O0VBRWYsR0FBRzs7RUFFSCxFQUFFLElBQUksZ0JBQWdCLEdBQUcsV0FBVyxTQUFTLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsVUFBVSxHQUFHOztFQUVwRztFQUNBLEdBQUcsS0FBSyxhQUFhLENBQUMsTUFBTSxLQUFLLENBQUMsR0FBRzs7RUFFckMsSUFBSSxJQUFJLEtBQUssR0FBRyxFQUFFLENBQUM7RUFDbkIsSUFBSSxJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7O0VBRXBCLElBQUloRCxnQkFBYyxDQUFDLFdBQVcsRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsQ0FBQzs7RUFFN0U7RUFDQSxJQUFJLEtBQUssS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEdBQUc7O0VBRTlCLEtBQUssVUFBVSxDQUFDLElBQUksRUFBRSxJQUFJLFNBQVMsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxFQUFFLENBQUM7O0VBRWxFLEtBQUs7O0VBRUwsSUFBSTs7RUFFSixHQUFHLENBQUM7O0VBRUosRUFBRSxJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7O0VBRWxCLEVBQUUsSUFBSSxRQUFRLEdBQUcsU0FBUyxDQUFDLElBQUksSUFBSSxTQUFTLENBQUM7RUFDN0M7RUFDQSxFQUFFLElBQUksUUFBUSxHQUFHLFNBQVMsQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDLENBQUM7RUFDekMsRUFBRSxJQUFJLEdBQUcsR0FBRyxTQUFTLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQzs7RUFFaEMsRUFBRSxJQUFJLGVBQWUsR0FBRyxTQUFTLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQzs7RUFFbEQsRUFBRSxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsZUFBZSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsR0FBRzs7RUFFdEQsR0FBRyxJQUFJLGFBQWEsR0FBRyxlQUFlLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDOztFQUVqRDtFQUNBLEdBQUcsS0FBSyxFQUFFLGFBQWEsSUFBSSxhQUFhLENBQUMsTUFBTSxLQUFLLENBQUMsR0FBRyxTQUFTOztFQUVqRTtFQUNBO0VBQ0EsR0FBRyxLQUFLLGFBQWEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxZQUFZLEdBQUc7O0VBRTFDO0VBQ0EsSUFBSSxJQUFJLGdCQUFnQixHQUFHLEVBQUUsQ0FBQzs7RUFFOUIsSUFBSSxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsYUFBYSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsR0FBRzs7RUFFdEQsS0FBSyxLQUFLLGFBQWEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxZQUFZLEdBQUc7O0VBRTVDLE1BQU0sTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGFBQWEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxHQUFHOztFQUUxRSxPQUFPLGdCQUFnQixFQUFFLGFBQWEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQzs7RUFFdEUsT0FBTzs7RUFFUCxNQUFNOztFQUVOLEtBQUs7O0VBRUw7RUFDQTtFQUNBO0VBQ0EsSUFBSSxNQUFNLElBQUksZUFBZSxJQUFJLGdCQUFnQixHQUFHOztFQUVwRCxLQUFLLElBQUksS0FBSyxHQUFHLEVBQUUsQ0FBQztFQUNwQixLQUFLLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQzs7RUFFckIsS0FBSyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEtBQUssYUFBYSxFQUFFLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLEdBQUc7O0VBRTNFLE1BQU0sSUFBSSxZQUFZLEdBQUcsYUFBYSxFQUFFLENBQUMsRUFBRSxDQUFDOztFQUU1QyxNQUFNLEtBQUssQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDO0VBQ3RDLE1BQU0sTUFBTSxDQUFDLElBQUksRUFBRSxFQUFFLFlBQVksQ0FBQyxXQUFXLEtBQUssZUFBZSxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQzs7RUFFOUUsTUFBTTs7RUFFTixLQUFLLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSWhDLHFCQUFtQixFQUFFLHdCQUF3QixHQUFHLGVBQWUsR0FBRyxHQUFHLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxFQUFFLENBQUM7O0VBRS9HLEtBQUs7O0VBRUwsSUFBSSxRQUFRLEdBQUcsZ0JBQWdCLENBQUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQzs7RUFFeEQsSUFBSSxNQUFNOztFQUVWOztFQUVBLElBQUksSUFBSSxRQUFRLEdBQUcsU0FBUyxHQUFHLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDOztFQUVyRCxJQUFJLGdCQUFnQjtFQUNwQixNQUFNNEUscUJBQW1CLEVBQUUsUUFBUSxHQUFHLFdBQVc7RUFDakQsTUFBTSxhQUFhLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDOztFQUVyQyxJQUFJLGdCQUFnQjtFQUNwQixNQUFNaEYseUJBQXVCLEVBQUUsUUFBUSxHQUFHLGFBQWE7RUFDdkQsTUFBTSxhQUFhLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDOztFQUVyQyxJQUFJLGdCQUFnQjtFQUNwQixNQUFNZ0YscUJBQW1CLEVBQUUsUUFBUSxHQUFHLFFBQVE7RUFDOUMsTUFBTSxhQUFhLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDOztFQUVyQyxJQUFJOztFQUVKLEdBQUc7O0VBRUgsRUFBRSxLQUFLLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxHQUFHOztFQUU3QixHQUFHLE9BQU8sSUFBSSxDQUFDOztFQUVmLEdBQUc7O0VBRUgsRUFBRSxJQUFJLElBQUksR0FBRyxJQUFJSSxlQUFhLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsQ0FBQzs7RUFFN0QsRUFBRSxPQUFPLElBQUksQ0FBQzs7RUFFZCxFQUFFOztFQUVGLENBQUMsRUFBRSxDQUFDOztFQUVKLE1BQU0sQ0FBQyxNQUFNLEVBQUVBLGVBQWEsQ0FBQyxTQUFTLEVBQUU7O0VBRXhDLENBQUMsYUFBYSxFQUFFLFlBQVk7O0VBRTVCLEVBQUUsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxRQUFRLEdBQUcsQ0FBQyxDQUFDOztFQUV6QyxFQUFFLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUc7O0VBRXRELEdBQUcsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQzs7RUFFaEMsR0FBRyxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxRQUFRLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDOztFQUUxRSxHQUFHOztFQUVILEVBQUUsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7O0VBRTNCLEVBQUU7O0VBRUYsQ0FBQyxJQUFJLEVBQUUsWUFBWTs7RUFFbkIsRUFBRSxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0VBRWxELEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQzs7RUFFN0MsR0FBRzs7RUFFSCxFQUFFLE9BQU8sSUFBSSxDQUFDOztFQUVkLEVBQUU7O0VBRUYsQ0FBQyxRQUFRLEVBQUUsWUFBWTs7RUFFdkIsRUFBRSxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0VBRWxELEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQzs7RUFFL0IsR0FBRzs7RUFFSCxFQUFFLE9BQU8sSUFBSSxDQUFDOztFQUVkLEVBQUU7O0VBRUYsQ0FBQyxFQUFFLENBQUM7O0VBRUo7RUFDQTtFQUNBOztFQUVBLFNBQVNpQyxnQkFBYyxFQUFFLE9BQU8sR0FBRzs7RUFFbkMsQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsT0FBTyxLQUFLLFNBQVMsS0FBSyxPQUFPLEdBQUc5VSx1QkFBcUIsQ0FBQztFQUM1RSxDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDOztFQUVwQixDQUFDOztFQUVELE1BQU0sQ0FBQyxNQUFNLEVBQUU4VSxnQkFBYyxDQUFDLFNBQVMsRUFBRTs7RUFFekMsQ0FBQyxJQUFJLEVBQUUsV0FBVyxHQUFHLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxPQUFPLEdBQUc7O0VBRXJELEVBQUUsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDOztFQUVuQixFQUFFLElBQUksTUFBTSxHQUFHLElBQUk3VSxZQUFVLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO0VBQy9DLEVBQUUsTUFBTSxDQUFDLGVBQWUsRUFBRSxNQUFNLEVBQUUsQ0FBQztFQUNuQyxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLFdBQVcsSUFBSSxHQUFHOztFQUV0QyxHQUFHLE1BQU0sRUFBRSxLQUFLLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUM7O0VBRWpDLEdBQUcsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLENBQUM7O0VBRTNCLEVBQUU7O0VBRUYsQ0FBQyxXQUFXLEVBQUUsV0FBVyxLQUFLLEdBQUc7O0VBRWpDLEVBQUUsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7O0VBRXhCLEVBQUU7O0VBRUYsQ0FBQyxLQUFLLEVBQUUsV0FBVyxJQUFJLEdBQUc7O0VBRTFCLEVBQUUsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQzs7RUFFL0IsRUFBRSxTQUFTLFVBQVUsRUFBRSxJQUFJLEdBQUc7O0VBRTlCLEdBQUcsS0FBSyxRQUFRLEVBQUUsSUFBSSxFQUFFLEtBQUssU0FBUyxHQUFHOztFQUV6QyxJQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQUUseUNBQXlDLEVBQUUsSUFBSSxFQUFFLENBQUM7O0VBRXBFLElBQUk7O0VBRUosR0FBRyxPQUFPLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQzs7RUFFM0IsR0FBRzs7RUFFSCxFQUFFLElBQUksUUFBUSxHQUFHLElBQUkrNEQsV0FBUyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDOztFQUU5QyxFQUFFLEtBQUssSUFBSSxDQUFDLElBQUksS0FBSyxTQUFTLEdBQUcsUUFBUSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO0VBQzNELEVBQUUsS0FBSyxJQUFJLENBQUMsSUFBSSxLQUFLLFNBQVMsR0FBRyxRQUFRLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7RUFDM0QsRUFBRSxLQUFLLElBQUksQ0FBQyxLQUFLLEtBQUssU0FBUyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztFQUN0RSxFQUFFLEtBQUssSUFBSSxDQUFDLFNBQVMsS0FBSyxTQUFTLEdBQUcsUUFBUSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO0VBQzFFLEVBQUUsS0FBSyxJQUFJLENBQUMsU0FBUyxLQUFLLFNBQVMsR0FBRyxRQUFRLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7RUFDMUUsRUFBRSxLQUFLLElBQUksQ0FBQyxRQUFRLEtBQUssU0FBUyxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztFQUMvRSxFQUFFLEtBQUssSUFBSSxDQUFDLFFBQVEsS0FBSyxTQUFTLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0VBQy9FLEVBQUUsS0FBSyxJQUFJLENBQUMsU0FBUyxLQUFLLFNBQVMsR0FBRyxRQUFRLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7RUFDMUUsRUFBRSxLQUFLLElBQUksQ0FBQyxTQUFTLEtBQUssU0FBUyxHQUFHLFFBQVEsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztFQUMxRSxFQUFFLEtBQUssSUFBSSxDQUFDLGtCQUFrQixLQUFLLFNBQVMsR0FBRyxRQUFRLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDO0VBQ3JHLEVBQUUsS0FBSyxJQUFJLENBQUMsUUFBUSxLQUFLLFNBQVMsR0FBRyxRQUFRLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7RUFDdkUsRUFBRSxLQUFLLElBQUksQ0FBQyxZQUFZLEtBQUssU0FBUyxHQUFHLFFBQVEsQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztFQUNuRixFQUFFLEtBQUssSUFBSSxDQUFDLGNBQWMsS0FBSyxTQUFTLEdBQUcsUUFBUSxDQUFD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LFFBQVEsR0FBRzs7RUFFM0MsR0FBRyxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDOztFQUUxQixHQUFHLEtBQUssSUFBSSxDQUFDLFlBQVksS0FBSyxTQUFTLEdBQUc7O0VBRTFDLElBQUksTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0VBRWpFLEtBQUssUUFBUSxDQUFDLFlBQVksRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7RUFDckMsS0FBSyxRQUFRLENBQUMsWUFBWSxFQUFFLENBQUMsRUFBRSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQztFQUNuRSxLQUFLLFFBQVEsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxFQUFFLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQzs7RUFFOUMsS0FBSyxJQUFJLFdBQVcsR0FBRyxRQUFRLENBQUMsWUFBWSxFQUFFLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQztFQUMzRCxLQUFLLElBQUksV0FBVyxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDOztFQUV2RCxLQUFLLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRzs7RUFFaEUsTUFBTSxJQUFJLE1BQU0sR0FBRyxJQUFJeEcsU0FBTyxFQUFFLENBQUM7RUFDakMsTUFBTSxNQUFNLENBQUMsQ0FBQyxHQUFHLFdBQVcsRUFBRSxDQUFDLEVBQUUsR0FBRyxLQUFLLENBQUM7RUFDMUMsTUFBTSxNQUFNLENBQUMsQ0FBQyxHQUFHLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsS0FBSyxDQUFDO0VBQzlDLE1B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QUFDLENBQUMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDO0VBQzlFLElBQUksUUFBUSxDQUFDLFNBQVMsQ0FBQyxjQUFjLEVBQUUsUUFBUSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDO0VBQzlFLElBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQyxjQUFjLEVBQUUsV0FBVyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDO0VBQ2hGLElBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQyxjQUFjLEVBQUUsV0FBVyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDO0VBQ2hGLElBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQyxjQUFjLEVBQUUsV0FBVyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDO0VBQ2hGLElBQUksUUFBUSxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDO0VBQ2xFLElBQUksUUFBUSxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDO0VBQ2xFLElBQUksUUFBUSxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDOztFQUVsRSxJQUFJLE1BQU07O0VBRVYsSUFBSSxRQUFRLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUM7RUFDL0QsSUFBSSxRQUFRLENBQUMsY0FBYyxFQUFFLFdBQVcsQ0FBQyxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUMs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QUFDLFNBQVMsQ0FBQyxlQUFlLEdBQUcsV0FBVyxJQUFJLEVBQUUsR0FBRyxHQUFHOztFQUVsRSxDQUFDLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsSUFBSSxFQUFFLENBQUM7O0VBRTVDLENBQUMsS0FBSyxTQUFTLEdBQUc7O0VBRWxCLEVBQUUsU0FBUyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7RUFDdEIsRUFBRSxTQUFTLENBQUMsUUFBUSxHQUFHLEVBQUUsU0FBUyxDQUFDLEdBQUcsR0FBRyxTQUFTLENBQUMsS0FBSyxLQUFLLFNBQVMsQ0FBQyxHQUFHLENBQUM7O0VBRTNFLEVBQUU7O0VBRUYsQ0FBQyxDQUFDOztFQUVGLGNBQWMsQ0FBQyxTQUFTLENBQUMsb0JBQW9CLEdBQUcsV0FBVyxJQUFJLEVBQUUsUUFBUSxHQUFHOztFQUU1RSxDQUFDLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsSUFBSSxFQUFFLENBQUM7O0VBRTVDLENBQUMsS0FBSyxTQUFTLEdBQUc7O0VBRWxCLEVBQUUsU0FBUyxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7RUFDaEMsRUFBRSxTQUFTLENBQUMsR0FBRyxHQUFHLEVBQUUsU0FBUyxDQUFDLEdBQUcsR0FBRyxTQUFTLENBQUMsS0FBSyxLQUFLLFNBQVMsQ0FBQyxRQUFRLENBQUM7O0VBRTNFLEVBQUU7O0VBRUYsQ0FBQyxDQUFDOztFQUVGLGNBQWMsQ0FBQyxTQUFTLENBQUMsa0JBQWtCLEdBQUcsV0FBVyxJQUFJLEVBQUUsTUFBTSxHQUFHOztFQUV4RSxDQUFDLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsSUFBSSxFQUFFLENBQUM7O0VBRTVDLENBQUMsS0FBSyxTQUFTLEdBQUc7O0VBRWxCLEVBQUUsU0FBUyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7O0VBRTVCLEVBQUU7O0VBRUYsQ0FBQyxDQUFDOztFQUVGLGNBQWMsQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLEdBQUcsV0FBVyxJQUFJLEVBQUUsSUFB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RSxJQUFJLEVBQUUsQ0FBQzs7RUFFeEMsRUFBRSxZQUFZLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUM7O0VBRTFELEVBQUUsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUM7O0VBRTVDLEVBQUUsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDOztFQUVuRDs7RUFFQSxFQUFFLElBQUksV0FBVyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDOztFQUV6QyxFQUFFLEtBQUssV0FBVyxJQUFJLFdBQVcsQ0FBQyxVQUFVLEdBQUc7O0VBRS9DLEdBQUcsSUFBSSxRQUFRLEdBQUcsV0FBVyxDQUFDLFFBQVEsQ0FBQzs7RUFFdkMsR0FBRyxJQUFJLEtBQUssR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDOztFQUVqQyxHQUFHLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQzs7RUFFZixHQUFHLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0VBRXBELElBQUksSUFBSSxJQUFJLEdBQUcsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDOztFQUUxQixJQUFJLE1BQU0sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHOztFQUVwRSxLQUFLLElBQUksTUFBTSxHQUFHLFFBQVEsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQzs7RUFFaEQsS0FBSyxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsRUFBRSxDQUFDOztFQUUxQyxLQUFLLEVBQUUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUMsWUFBWSxFQUFFLFdBQVcsRUFBRSxDQUFDOztFQUVuRCxLQUFLLEVBQUUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUMsWUFBWSxFQUFFLFlBQVksRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDOztFQUV0RyxLQUFLLFFBQVEsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7O0VBRTlDLEtBQUssR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7O0VBRW5CLEtBQUssUUFBUSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7RUFFOUMsS0FBSyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQzs7RUFFbkIsS0FBSzs7RUFFTCxJQUFJOztFQUVKLEdBQUcsTUFBTSxLQUFLLFdBQVcsSUFBSSxXQUFXLENBQUMsZ0JBQWdCLEdBQUc7O0VBRTVELEdBQUcsSUFBSSxNQUFNLEdBQUcsV0FBVyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUM7O0VBRWhELEdBQUcsSUFBSSxPQUFPLEdBQUcsV0FBVyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUM7O0VBRS9DLEdBQUcsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDOztFQUVmOztFQUVBLEdBQUcsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRzs7RUFFdEQsSUFBSSxFQUFFLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsWUFBWSxFQUFFLFdBQVcsRUFBRSxDQUFDOztFQUUvRixJQUFJLEVBQUUsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7RUFFdEUsSUFBSSxFQUFFLENBQUMsWUFBWSxFQUFFLFlBQVksRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDOztFQUV0RixJQUFJLFFBQVEsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7O0VBRTdDLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7O0VBRWxCLElBQUksUUFBUSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7RUFFN0MsSUFBSSxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQzs7RUFFbEIsSUFBSTs7RUFFSixHQUFHOztFQUVILEVBQUUsUUFBUSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7O0VBRTlCLEVBQUUsQ0FBQzs7RUFFSCxDQUFDLEVBQUUsRUFBRSxDQUFDOztFQUVOO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUEsU0FBU290RyxpQkFBZSxFQUFFLEtBQUssR0FBRzs7RUFFbEMsQ0FBQ3h0RixVQUFRLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDOztFQUV2QixDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0VBQ3BCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxDQUFDOztFQUVoQyxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLFdBQVcsQ0FBQztFQUNqQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7O0VBRS9CLENBQUMsSUFBSSxRQUFRLEdBQUcsSUFBSXNPLGdCQUFjLEVBQUUsQ0FBQzs7RUFFckMsQ0FBQyxJQUFJLFNBQVMsR0FBRztFQUNqQixFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztFQUN4QixFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztFQUN4QixFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO0VBQ3hCLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO0VBQ3hCLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUM7RUFDeEIsRUFBRSxDQUFDOztFQUVILENBQUMsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0VBRXJELEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0VBQ25DLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDOztFQUVuQyxFQUFFLFNBQVMsQ0FBQyxJQUFJO0VBQ2hCLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7RUFDcEMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQztFQUNwQyxHQUFHLENBQUM7O0VBRUosRUFBRTs7RUFFRixDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsVUFBVSxFQUFFLElBQUloQix3QkFBc0IsRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7RUFFakYsQ0FBQyxJQUFJLFFBQVEsR0FBRyxJQUFJK2hCLG1CQUFpQixFQUFFLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUM7O0VBRXhELENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJNHdCLGNBQVksRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLENBQUM7RUFDcEQsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQzs7RUFFdkIsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7O0VBRWYsQ0FBQzs7QUFFRHV0QyxtQkFBZSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFeHRGLFVBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQztBQUNoRXd0RixtQkFBZSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEdBQUdBLGlCQUFlLENBQUM7O0FBRXhEQSxtQkFBZSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEdBQUcsWUFBWTs7RUFFaEQsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztFQUM5QixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDOztFQUU5QixDQUFDLENBQUM7O0FBRUZBLG1CQUFlLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxZQUFZOztFQUUvQyxDQUFDLElBQUksTUFBTSxHQUFHLElBQUkvdkcsU0FBTyxFQUFFLENBQUM7RUFDNUIsQ0FBQyxJQUFJLE9BQU8sR0FBRyxJQUFJQSxTQUFPLEVBQUUsQ0FBQzs7RUFFN0IsQ0FBQyxPQUFPLFNBQVMsTUFBTSxHQUFHOztFQUUxQixFQUFFLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztFQUNwRSxFQUFFLElBQUksU0FBUyxHQUFHLFVBQVUsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7O0VBRTVELEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLENBQUM7O0VBRTFELEVBQUUsTUFBTSxDQUFDLHFCQUFxQixFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7RUFDekQsRUFBRSxPQUFPLENBQUMscUJBQXFCLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUM7O0VBRWpFLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFDOztFQUU1QyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQzs7RUFFcEQsRUFBRSxDQUFDOztFQUVILENBQUMsRUFBRSxDQUFDOztFQUVKO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztFQUVBLFNBQVNvd0csZ0JBQWMsRUFBRSxNQUFNLEdBQUc7O0VBRWxDLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLE1BQU0sRUFBRSxDQUFDOztFQUV6QyxDQUFDLElBQUksUUFBUSxHQUFHLElBQUl2L0UsZ0JBQWMsRUFBRSxDQUFDOztFQUVyQyxDQUFDLElBQUksUUFBUSxHQUFHLEVBQUUsQ0FBQztFQUNuQixDQUFDLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQzs7RUFFakIsQ0FBQyxJQUFJLE1BQU0sR0FBRyxJQUFJdlosT0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7RUFDbkMsQ0FBQyxJQUFJLE1BQU0sR0FBRyxJQUFJQSxPQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQzs7RUFFbkMsQ0FBQyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0VBRWhELEVBQUUsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQzs7RUFFN0IsRUFBRSxLQUFLLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUc7O0VBRTNDLEdBQUcsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0VBQzVCLEdBQUcsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0VBQzVCLEdBQUcsTUFBTSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDO0VBQy9DLEdBQUcsTUFBTSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDOztFQUUvQyxHQUFHOztFQUVILEVBQUU7O0VBRUYsQ0FBQyxRQUFRLENBQUMsWUFBWSxFQUFFLFVBQVUsRUFBRSxJQUFJdVksd0JBQXNCLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7RUFDaEYsQ0FBQyxRQUFRLENBQUMsWUFBWSxFQUFFLE9BQU8sRUFBRSxJQUFJQSx3QkFBc0IsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQzs7RUFFM0UsQ0FBQyxJQUFJLFFBQVEsR0FBRyxJQUFJK2hCLG1CQUFpQixFQUFFLEVBQUUsWUFBWSxFQUFFMitDLGNBQVksRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUM7O0VBRWhJLENBQUMvdEIsY0FBWSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxDQUFDOztFQUUvQyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDOztFQUVwQixDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQztFQUNsQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7O0VBRS9CLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDOztFQUVmLENBQUM7OztBQUdENHRDLGtCQUFjLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUU1dEMsY0FBWSxDQUFDLFNBQVMsRUFBRSxDQUFDO0FBQ25FNHRDLGtCQUFjLENBQUMsU0FBUyxDQUFDLFdBQVcsR0FBR0EsZ0JBQWMsQ0FBQzs7QUFFdERBLGtCQUFjLENBQUMsU0FBUyxDQUFDLFdBQVcsR0FBRyxVQUFVLE1BQU0sR0FBRzs7RUFFMUQsQ0FBQyxJQUFJLFFBQVEsR0FBRyxFQUFFLENBQUM7O0VBRW5CLENBQUMsS0FBSyxNQUFNLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRzs7RUFFaEMsRUFBRSxRQUFRLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDOztFQUUxQixFQUFFOztFQUVGLENBQUMsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxHQUFHOztFQUVyRCxFQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDOztFQUU1RSxFQUFFOztFQUVGLENBQUMsT0FBTyxRQUFRLENBQUM7O0VBRWpCLENBQUMsQ0FBQzs7QUFFRkEsa0JBQWMsQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLFlBQVk7O0VBRTlDLENBQUMsSUFBSSxNQUFNLEdBQUcsSUFBSXB3RyxTQUFPLEVBQUUsQ0FBQzs7RUFFNUIsQ0FBQyxJQUFJLFVBQVUsR0FBRyxJQUFJcE8sU0FBTyxFQUFFLENBQUM7RUFDaEMsQ0FBQyxJQUFJLGNBQWMsR0FBRyxJQUFJQSxTQUFPLEVBQUUsQ0FBQzs7RUFFcEMsQ0FBQyxPQUFPLFNBQVMsTUFBTSxHQUFHOztFQUUxQixFQUFFLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7RUFDL0IsRUFBRSxJQUFJLFFBQVEsR0FBRyxRQUFRLENBQUMsWUFBWSxFQUFFLFVBQVUsRUFBRSxDQUFDOztFQUVyRCxFQUFFLGNBQWMsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQzs7RUFFckQsRUFBRSxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsR0FBRzs7RUFFeEQsR0FBRyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDOztFQUU5QixHQUFHLEtBQUssSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRzs7RUFFNUMsSUFBSSxVQUFVLENBQUMsZ0JBQWdCLEVBQUUsY0FBYyxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztFQUNwRSxJQUFJLE1BQU0sQ0FBQyxxQkFBcUIsRUFBRSxVQUFVLEVBQUUsQ0FBQztFQUMvQyxJQUFJLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUM7O0VBRXZELElBQUksVUFBVSxDQUFDLGdCQUFnQixFQUFFLGNBQWMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDO0VBQzNFLElBQUksTUFBTSxDQUFDLHFCQUFxQixFQUFFLFVBQVUsRUFBRSxDQUFDO0VBQy9DLElBQUksUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUM7O0VBRTNELElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzs7RUFFWCxJQUFJOztFQUVKLEdBQUc7O0VBRUgsRUFBRSxRQUFRLENBQUMsWUFBWSxFQUFFLFVBQVUsRUFBRSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7O0VBRXpELEVBQUUsQ0FBQzs7RUFFSCxDQUFDLEVBQUUsQ0FBQzs7RUFFSjtFQUNBO0VBQ0E7RUFDQTs7RUFFQSxTQUFTNCtHLGtCQUFnQixFQUFFLEtBQUssRUFBRSxVQUFVLEdBQUc7O0VBRS9DLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7RUFDcEIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGlCQUFpQixFQUFFLENBQUM7O0VBRWhDLENBQUMsSUFBSSxRQUFRLEdBQUcsSUFBSXo5QixzQkFBb0IsRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0VBQzdELENBQUMsSUFBSSxRQUFRLEdBQUcsSUFBSWw3QyxtQkFBaUIsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUM7RUFDekUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDOztFQUV6QyxDQUFDNkYsTUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxDQUFDOztFQUV2QyxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUM7RUFDdEMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDOztFQUUvQjtFQUNBO0VBQ0E7O0VBRUE7RUFDQTs7RUFFQTs7RUFFQTs7RUFFQTs7RUFFQTs7RUFFQTs7RUFFQTs7RUFFQTtFQUNBOztFQUVBLENBQUM7O0FBRUQ4eUUsb0JBQWdCLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUU5eUUsTUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0FBQzdEOHlFLG9CQUFnQixDQUFDLFNBQVMsQ0FBQyxXQUFXLEdBQUdBLGtCQUFnQixDQUFDOztBQUUxREEsb0JBQWdCLENBQUMsU0FBUyxDQUFDLE9BQU8sR0FBRyxZQUFZOztFQUVqRCxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7RUFDekIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDOztFQUV6QixDQUFDLENBQUM7O0FBRUZBLG9CQUFnQixDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsWUFBWTs7RUFFaEQsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQzs7RUFFOUM7RUFDQTs7RUFFQTs7RUFFQTs7RUFFQTs7RUFFQTtFQUNBOztFQUVBO0VBQ0E7O0VBRUEsQ0FBQyxDQUFDOztFQUVGO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0VBRUEsU0FBU0MscUJBQW1CLEVBQUUsS0FBSyxHQUFHOztFQUV0QyxDQUFDbHVGLFVBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7O0VBRXZCLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7RUFDcEIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGlCQUFpQixFQUFFLENBQUM7O0VBRWhDLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsV0FBVyxDQUFDO0VBQ2pDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQzs7RUFFL0IsQ0FBQyxJQUFJLFFBQVEsR0FBRyxJQUFJcXZCLG1CQUFpQixFQUFFLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDOztFQUVoRSxDQUFDLElBQUksUUFBUSxHQUFHLElBQUkvZ0IsZ0JBQWMsRUFBRSxDQUFDOztFQUVyQyxDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsVUFBVSxFQUFFLElBQUl2QyxpQkFBZSxFQUFFLElBQUksWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDOztFQUUxRixDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSXV6QyxNQUFJLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxFQUFFLENBQUM7O0VBRTVDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDOztFQUVmLENBQUM7O0FBRUQ0dUMsdUJBQW1CLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUVsdUYsVUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDO0FBQ3BFa3VGLHVCQUFtQixDQUFDLFNBQVMsQ0FBQyxXQUFXLEdBQUdBLHFCQUFtQixDQUFDOztBQUVoRUEsdUJBQW1CLENBQUMsU0FBUyxDQUFDLE9BQU8sR0FBRyxZQUFZOztFQUVwRCxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDO0VBQ3ZDLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7O0VBRXZDLENBQUMsQ0FBQzs7QUFFRkEsdUJBQW1CLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxZQUFZOztFQUVuRCxDQUFDLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0VBRS9COztFQUVBLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7O0VBRTlDOztFQUVBLENBQUMsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDO0VBQ2pDLENBQUMsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDOztFQUVsQyxDQUFDLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQztFQUNsRCxDQUFDLElBQUksS0FBSyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUM7O0VBRTVCOztFQUVBLENBQUMsS0FBSyxHQUFHLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7RUFDekQsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7RUFDekQsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFD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RSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0VBRTNCLEVBQUUsS0FBSyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxNQUFNLEdBQUcsTUFBTSxDQUFDOztFQUV0QyxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztFQUMzQyxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQzs7RUFFM0MsRUFBRTs7RUFFRjs7RUFFQSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksT0FBTyxFQUFFLENBQUMsR0FBRyxHQUFHOztFQUVuQyxFQUFFLEtBQUssR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssTUFBTSxHQUFHLE1BQU0sQ0FBQzs7RUFFdEMsRUFBRSxDQUFDLEdBQUcsTUFBTSxLQUFLLE1BQU0sR0FBRyxPQUFPLEdBQUcsQ0FBQyxFQUFFLENBQUM7O0VBRXhDLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLEVBQUUsQ0FBQyxHQUFHLEdBQUc7O0VBRXJDOztFQUVBLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLFNBQVMsT0FBTyxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDOztFQUUzQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztFQUN6QixHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQzs7RUFFekIsR0FBRyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7RUFDNUIsR0FBRyxNQUFNLENBQUMsSUFBSSxFQUFF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QUUsWUFBWSxFQUFFLENBQUM7RUFDckMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQzs7RUFFckM7O0VBRUEsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQztFQUNyQyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDO0VBQ3JDLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7RUFDckMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQzs7RUFFckM7O0VBRUEsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQztFQUNyQyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDO0VBQ3JDLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLENBQUM7RUFDckMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsQ0FBQzs7RUFFckM7O0VBRUEsQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQztFQUNqQyxDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDO0VBQ2pDLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUM7RUFDakMsQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQzs7RUFFakM7O0VBRUEsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQztFQUNoQyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxDQUFDO0VBQ2hDLENBQUMsT0FB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QSxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0VBQzdCLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDOztFQUU1Qjs7RUFFQSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztFQUNsQyxFQUFFLFFBQVEsRUFBRSxJQUFJLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7RUFDbEMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDO0VBQ2xDLEVBQUUsUUFBUSxFQUFFLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0VBRWxDOztFQUVBLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQztFQUNoQyxFQUFFLFFBQVEsRUFBRSxJQUFJLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO0VBQ2hDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7RUFDaEMsRUFBRSxRQUFRLEVBQUUsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7O0VBRWhDOztFQUVBLEVBQUUsUUFBUSxFQUFFLElBQUksSUFBSSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztFQUM1QyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxH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QUFDO0VBQ2hFLEVBQUUsS0FBSyxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0VBQ2hFLEVBQUUsS0FBSyxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0VBQ2hFLEVBQUUsS0FBSyxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0VBQ2hFLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0VBQ2hFLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0VBQ2hFLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUss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QUFDLElBQUksRUFBRSwwREFBMEQsRUFBRSxDQUFDO0VBQzlFLEdBQUcsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQzs7RUFFOUIsR0FBRztFQUNILEVBQUUsR0FBRyxFQUFFLFdBQVcsS0FBSyxHQUFHOztFQUUxQixHQUFHLE9BQU8sQ0FBQyxJQUFJLEVBQUUsMERBQTBELEVBQUUsQ0FBQztFQUM5RSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQzs7RUFFL0IsR0FBRztFQUNILEVBQUU7RUFDRixDQUFDLE1BQU0sRUFBRTtFQUNULEVBQUUsR0FBRyxFQUFFLFlBQVk7O0VBRW5CLEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRSwwREFBMEQsRUFBRSxDQUFDO0VBQzlFLEdBQUcsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQzs7RUFFOUIsR0FBRztFQUNILEVBQUUsR0FBRyxFQUFFLFdBQVcsS0FBSyxHQUFHOztFQUUxQixHQUFHLE9BQU8sQ0FBQyxJQUFJLEVBQUUsMERBQTBELEVBQUUsQ0FBQztFQUM5RSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQzs7RUFFL0IsR0FBRztFQUNILEVBQUU7RUFDRixDQUFDLElBQUksRUFBRTtFQUNQLEVBQUUsR0FBRyxFQUFFLFlBQVk7O0VBRW5CLEdBQUcsT0FBTyxDQUFDLElBQUksRUFBRSxzREFBc0QsRUFBRSxDQUFDO0VBQzFFLEdBQUcsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQzs7RUFFNUIsR0FBRztFQUNILEVBQUUsR0FBRyxFQUFFLFdBQVcsS0FBSyxHQUFHOztFQUUxQixHQUFHLE9BQU8sQ0FBQyxJQUFJLEVBQUUsc0RBQXNELEVBQUUsQ0FBQztFQUMxRSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQzs7RUFFN0IsR0FBRztFQUNILEVBQUU7RUFDRixDQUFDLGVBQWUsRUFBRTtFQUNsQixFQUFFLEdBQUcsRUFBRSxZQUFZOztFQUVuQixHQUFHLE9BQU8sQ0FBQyxJQUFJLEVBQUUsNEVBQTRFLEVBQUUsQ0FBQztFQUNoRyxHQUFHLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUM7O0VBRXZDLEdBQUc7RUFDSCxFQUFFLEdBQUcsRUFBRSxXQUFXLEtBQUssR0FBRzs7RUFFMUIsR0FBRyxPQUFPLENBQUMsSUFBSSxFQUFFLDRFQUE0RSxFQUFFLENBQUM7RUFDaEcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUM7O0VBRXhDLEdBQUc7RUFDSCxFQUFFOztFQUVGLENBQUMsRUFBRSxDQUFDOztFQUVKOztBQUVBd3pGLFNBQUssQ0FBQyxTQUFTLENBQUMsSUFBSSxHQUFHLFdBQVcsSUFBSSxHQUFHOztFQUV6QyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsd0VBQXdFLEVBQUUsQ0FBQztFQUMxRixDQUFDLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQztFQUNsQixDQUFDLElBQUksV0FBVyxHQUFHLElBQUluRCxhQUFXLEVBQUUsQ0FBQztFQUNyQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLFdBQVcsTUFBTSxHQUFHOztFQUU3QyxFQUFFLEtBQUssQ0FBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLENBQUM7O0VBRTVCLEVBQUUsRUFBRSxDQUFDO0VBQ0wsQ0FBQyxPQUFPLElBQUksQ0FBQzs7RUFFYixDQUFDLENBQUM7O0FBRUZ5RixpQkFBYSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEdBQUcsWUFBWTs7RUFFOUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLDZEQUE2RCxFQUFFLENBQUM7RUFDL0UsQ0FBQyxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDOztFQUVoQyxDQUFDLENBQUM7O0VDbnEwQ0Y7Ozs7Ozs7Ozs7QUFXQSxFQU1PLElBQU1pekMsV0FBVyxTQUFYQSxRQUFXLENBQVd6d0csUUFBWCxFQUFxQnMyQyxPQUFyQixFQUErQjtFQUV0RCxNQUFJbzZELFNBQUosRUFBZUMsVUFBZjtFQUNBLE1BQUlDLGtCQUFrQixJQUFJMXdJLFNBQUosRUFBdEI7RUFDQSxNQUFJMndJLGtCQUFrQixJQUFJM3dJLFNBQUosRUFBdEI7RUFDQSxNQUFJNHdJLFdBQUosRUFBaUJDLFdBQWpCO0VBRUEsTUFBSTdnRixZQUFZLElBQWhCOztFQUVBLE1BQUssaUJBQWlCeGpGLE1BQXRCLEVBQStCO0VBRTlCd2pGLGdCQUFZLElBQUlDLFdBQUosRUFBWjtFQUVBOztFQUVELFdBQVM2Z0YsYUFBVCxDQUF3QkMsUUFBeEIsRUFBbUM7RUFFbENOLGlCQUFhTSxRQUFiOztFQUVBLFFBQUtBLFNBQVN4bkssTUFBVCxHQUFrQixDQUF2QixFQUEyQjtFQUUxQmluSyxrQkFBWU8sU0FBVSxDQUFWLENBQVo7RUFFQSxLQUpELE1BSU87RUFFTixVQUFLMzZELE9BQUwsRUFBZUEsUUFBUyxtQkFBVDtFQUVmO0VBRUQ7O0VBRUQsTUFBS2o3RixVQUFVNjFKLGFBQWYsRUFBK0I7RUFFOUI3MUosY0FBVTYxSixhQUFWLEdBQTBCeHFLLElBQTFCLENBQWdDc3FLLGFBQWhDLEVBQWdERyxLQUFoRCxDQUF3RCxZQUFZO0VBRW5FcHlKLGNBQVE2UCxJQUFSLENBQWMsMkNBQWQ7RUFFQSxLQUpEO0VBTUEsR0F2Q3FEOzs7RUEyQ3RELE9BQUs4aEUsWUFBTCxHQUFvQixLQUFwQjtFQUNBLE9BQUtqM0QsS0FBTCxHQUFhLENBQWI7RUFFQSxNQUFJeVEsUUFBUSxJQUFaO0VBRUEsTUFBSWtuSSxlQUFlcHhHLFNBQVNwMkIsT0FBVCxFQUFuQjtFQUNBLE1BQUl5bkksc0JBQXNCLEtBQTFCO0VBQ0EsTUFBSUMscUJBQXFCdHhHLFNBQVNneEIsYUFBVCxFQUF6Qjs7RUFFQSxPQUFLdWdGLFlBQUwsR0FBb0IsWUFBWTtFQUUvQixXQUFPYixTQUFQO0VBRUEsR0FKRDs7RUFNQSxPQUFLYyxZQUFMLEdBQW9CLFVBQVcvcUssS0FBWCxFQUFtQjtFQUV0Q2lxSyxnQkFBWWpxSyxLQUFaO0VBRUEsR0FKRDs7RUFNQSxPQUFLeXFLLGFBQUwsR0FBcUIsWUFBWTtFQUVoQ255SixZQUFRNlAsSUFBUixDQUFjLHNEQUFkO0VBQ0EsV0FBTytoSixVQUFQO0VBRUEsR0FMRDs7RUFPQSxPQUFLL29JLE9BQUwsR0FBZSxVQUFXL0IsS0FBWCxFQUFrQkMsTUFBbEIsRUFBMEIyd0QsV0FBMUIsRUFBd0M7RUFFdEQyNkUsbUJBQWU7RUFBRXZySSxhQUFPQSxLQUFUO0VBQWdCQyxjQUFRQTtFQUF4QixLQUFmO0VBQ0F1ckksMEJBQXNCNTZFLFdBQXRCOztFQUVBLFFBQUt2c0QsTUFBTXdtRCxZQUFYLEVBQTBCO0VBRXpCLFVBQUkrZ0YsYUFBYWYsVUFBVTkvRSxnQkFBVixDQUE0QixNQUE1QixDQUFqQjtFQUNBNXdCLGVBQVN3MkIsYUFBVCxDQUF3QixDQUF4QjtFQUNBeDJCLGVBQVNwNEIsT0FBVCxDQUFrQjZwSSxXQUFXM2dGLFdBQVgsR0FBeUIsQ0FBM0MsRUFBOEMyZ0YsV0FBVzFnRixZQUF6RCxFQUF1RSxLQUF2RTtFQUVBLEtBTkQsTUFNTztFQUVOL3dCLGVBQVN3MkIsYUFBVCxDQUF3Qjg2RSxrQkFBeEI7RUFDQXR4RyxlQUFTcDRCLE9BQVQsQ0FBa0IvQixLQUFsQixFQUF5QkMsTUFBekIsRUFBaUMyd0QsV0FBakM7RUFFQTtFQUVELEdBbEJELENBdkVzRDs7O0VBNkZ0RCxNQUFJOXdELFNBQVNxNkIsU0FBUzJ6QixVQUF0QjtBQUNBLEVBR0EsTUFBSSs5RSxvQkFBb0IsQ0FBRSxHQUFGLEVBQU8sR0FBUCxFQUFZLEdBQVosRUFBaUIsR0FBakIsQ0FBeEI7RUFDQSxNQUFJQyxxQkFBcUIsQ0FBRSxHQUFGLEVBQU8sR0FBUCxFQUFZLEdBQVosRUFBaUIsR0FBakIsQ0FBekI7O0VBRUEsV0FBU3ZoRix3QkFBVCxHQUFvQztFQUVuQyxRQUFJd2hGLGdCQUFnQjFuSSxNQUFNd21ELFlBQTFCO0VBQ0F4bUQsVUFBTXdtRCxZQUFOLEdBQXFCZ2dGLGNBQWN0b0ssU0FBZCxJQUEyQnNvSyxVQUFVaGdGLFlBQTFEOztFQUVBLFFBQUt4bUQsTUFBTXdtRCxZQUFYLEVBQTBCO0VBRXpCLFVBQUkrZ0YsYUFBYWYsVUFBVTkvRSxnQkFBVixDQUE0QixNQUE1QixDQUFqQjtFQUNBLFVBQUlpaEYsV0FBV0osV0FBVzNnRixXQUExQjtFQUNBLFVBQUlnaEYsWUFBWUwsV0FBVzFnRixZQUEzQjs7RUFFQSxVQUFLLENBQUM2Z0YsYUFBTixFQUFzQjtFQUVyQk4sNkJBQXFCdHhHLFNBQVNneEIsYUFBVCxFQUFyQjtFQUNBb2dGLHVCQUFlcHhHLFNBQVNwMkIsT0FBVCxFQUFmO0VBRUFvMkIsaUJBQVN3MkIsYUFBVCxDQUF3QixDQUF4QjtFQUNBeDJCLGlCQUFTcDRCLE9BQVQsQ0FBa0JpcUksV0FBVyxDQUE3QixFQUFnQ0MsU0FBaEMsRUFBMkMsS0FBM0M7RUFFQTtFQUVELEtBaEJELE1BZ0JPLElBQUtGLGFBQUwsRUFBcUI7RUFFM0I1eEcsZUFBU3cyQixhQUFULENBQXdCODZFLGtCQUF4QjtFQUNBdHhHLGVBQVNwNEIsT0FBVCxDQUFrQndwSSxhQUFhdnJJLEtBQS9CLEVBQXNDdXJJLGFBQWF0ckksTUFBbkQsRUFBMkR1ckksbUJBQTNEO0VBRUE7RUFFRDs7RUFFRDNrSyxTQUFPcU4sZ0JBQVAsQ0FBeUIsd0JBQXpCLEVBQW1EcTJFLHdCQUFuRCxFQUE2RSxLQUE3RTs7RUFFQSxPQUFLMmhGLGFBQUwsR0FBcUIsVUFBV2g3RSxPQUFYLEVBQXFCO0VBRXpDLFdBQU8sSUFBSXQ4RSxPQUFKLENBQWEsVUFBV3JVLE9BQVgsRUFBb0JDLE1BQXBCLEVBQTZCO0VBRWhELFVBQUtxcUssY0FBY3RvSyxTQUFuQixFQUErQjtFQUU5Qi9CLGVBQVEsSUFBSWczSSxLQUFKLENBQVcsdUJBQVgsQ0FBUjtFQUNBO0VBRUE7O0VBRUQsVUFBS256RyxNQUFNd21ELFlBQU4sS0FBdUJxRyxPQUE1QixFQUFzQztFQUVyQzN3RjtFQUNBO0VBRUE7O0VBRUQsVUFBSzJ3RixPQUFMLEVBQWU7RUFFZDN3RixnQkFBU3NxSyxVQUFVc0IsY0FBVixDQUEwQixDQUFFO0VBQUVsakssa0JBQVE2MkI7RUFBVixTQUFGLENBQTFCLENBQVQ7RUFFQSxPQUpELE1BSU87RUFFTnYvQixnQkFBU3NxSyxVQUFVdUIsV0FBVixFQUFUO0VBRUE7RUFFRCxLQTFCTSxDQUFQO0VBNEJBLEdBOUJEOztFQWdDQSxPQUFLRCxjQUFMLEdBQXNCLFlBQVk7RUFFakMsV0FBTyxLQUFLRCxhQUFMLENBQW9CLElBQXBCLENBQVA7RUFFQSxHQUpEOztFQU1BLE9BQUtFLFdBQUwsR0FBbUIsWUFBWTtFQUU5QixXQUFPLEtBQUtGLGFBQUwsQ0FBb0IsS0FBcEIsQ0FBUDtFQUVBLEdBSkQ7O0VBTUEsT0FBS3QzRSxxQkFBTCxHQUE2QixVQUFXanNGLENBQVgsRUFBZTtFQUUzQyxRQUFLa2lLLGNBQWN0b0ssU0FBbkIsRUFBK0I7RUFFOUIsYUFBT3NvSyxVQUFVajJFLHFCQUFWLENBQWlDanNGLENBQWpDLENBQVA7RUFFQSxLQUpELE1BSU87RUFFTixhQUFPOUIsT0FBTyt0RixxQkFBUCxDQUE4QmpzRixDQUE5QixDQUFQO0VBRUE7RUFFRCxHQVpEOztFQWNBLE9BQUswakssb0JBQUwsR0FBNEIsVUFBV3AySSxDQUFYLEVBQWU7RUFFMUMsUUFBSzQwSSxjQUFjdG9LLFNBQW5CLEVBQStCO0VBRTlCc29LLGdCQUFVd0Isb0JBQVYsQ0FBZ0NwMkksQ0FBaEM7RUFFQSxLQUpELE1BSU87RUFFTnB2QixhQUFPd2xLLG9CQUFQLENBQTZCcDJJLENBQTdCO0VBRUE7RUFFRCxHQVpEOztFQWNBLE9BQUtnM0QsV0FBTCxHQUFtQixZQUFZO0VBRTlCLFFBQUs0OUUsY0FBY3RvSyxTQUFkLElBQTJCOGhDLE1BQU13bUQsWUFBdEMsRUFBcUQ7RUFFcERnZ0YsZ0JBQVU1OUUsV0FBVjtFQUVBO0VBRUQsR0FSRDs7RUFVQSxPQUFLcS9FLGVBQUwsR0FBdUIsSUFBdkIsQ0F0TnNEOztFQTBOdEQsTUFBSTloRixVQUFVLElBQUlsQixtQkFBSixFQUFkO0VBQ0FrQixVQUFRL3RDLE1BQVIsQ0FBZUYsTUFBZixDQUF1QixDQUF2QjtFQUVBLE1BQUltdUMsVUFBVSxJQUFJcEIsbUJBQUosRUFBZDtFQUNBb0IsVUFBUWp1QyxNQUFSLENBQWVGLE1BQWYsQ0FBdUIsQ0FBdkI7O0VBRUEsT0FBS2lmLE1BQUwsR0FBYyxVQUFXbEIsS0FBWCxFQUFrQmovQixNQUFsQixFQUEwQndqRCxZQUExQixFQUF3Q3RrQixVQUF4QyxFQUFxRDtFQUVsRSxRQUFLc3dHLGFBQWF4bUksTUFBTXdtRCxZQUF4QixFQUF1QztFQUV0QyxVQUFJdlksYUFBYWhZLE1BQU1nWSxVQUF2Qjs7RUFFQSxVQUFLQSxVQUFMLEVBQWtCO0VBRWpCaFksY0FBTTkxQixpQkFBTjtFQUNBODFCLGNBQU1nWSxVQUFOLEdBQW1CLEtBQW5CO0VBRUE7O0VBRUQsVUFBSXM1RixhQUFhZixVQUFVOS9FLGdCQUFWLENBQTRCLE1BQTVCLENBQWpCO0VBQ0EsVUFBSXdoRixhQUFhMUIsVUFBVTkvRSxnQkFBVixDQUE0QixPQUE1QixDQUFqQjtFQUVBZ2dGLHNCQUFnQnovSSxTQUFoQixDQUEyQnNnSixXQUFXcmdKLE1BQXRDO0VBQ0F5L0ksc0JBQWdCMS9JLFNBQWhCLENBQTJCaWhKLFdBQVdoaEosTUFBdEM7O0VBRUEsVUFBS3hhLE1BQU15TSxPQUFOLENBQWU4OEMsS0FBZixDQUFMLEVBQThCO0VBRTdCcGhELGdCQUFRNlAsSUFBUixDQUFjLCtFQUFkO0VBQ0F1eEMsZ0JBQVFBLE1BQU8sQ0FBUCxDQUFSO0VBRUEsT0F0QnFDO0VBeUJ0Qzs7O0VBQ0EsVUFBSTkyQixPQUFPMjJCLFNBQVNwMkIsT0FBVCxFQUFYO0VBQ0EsVUFBSTBZLFNBQVNvdUgsVUFBVWorRSxTQUFWLEVBQWI7RUFDQSxVQUFJRSxVQUFKO0VBQ0EsVUFBSUMsV0FBSjs7RUFFQSxVQUFLdHdDLE9BQU83NEMsTUFBWixFQUFxQjtFQUVwQixZQUFJaXBGLFFBQVFwd0MsT0FBUSxDQUFSLENBQVo7RUFFQXF3QyxxQkFBYUQsTUFBTUMsVUFBTixLQUFxQixJQUFyQixJQUE2QkQsTUFBTUMsVUFBTixDQUFpQmxwRixNQUFqQixLQUE0QixDQUF6RCxHQUE2RGlwRixNQUFNQyxVQUFuRSxHQUFnRisrRSxpQkFBN0Y7RUFDQTkrRSxzQkFBY0YsTUFBTUUsV0FBTixLQUFzQixJQUF0QixJQUE4QkYsTUFBTUUsV0FBTixDQUFrQm5wRixNQUFsQixLQUE2QixDQUEzRCxHQUErRGlwRixNQUFNRSxXQUFyRSxHQUFtRisrRSxrQkFBakc7RUFFQSxPQVBELE1BT087RUFFTmgvRSxxQkFBYSsrRSxpQkFBYjtFQUNBOStFLHNCQUFjKytFLGtCQUFkO0VBRUE7O0VBRURiLG9CQUFjO0VBQ2J6MEosV0FBRzFRLEtBQUtra0IsS0FBTCxDQUFZd1osS0FBS3hELEtBQUwsR0FBYThzRCxXQUFZLENBQVosQ0FBekIsQ0FEVTtFQUViOWxFLFdBQUdsaEIsS0FBS2trQixLQUFMLENBQVl3WixLQUFLdkQsTUFBTCxHQUFjNnNELFdBQVksQ0FBWixDQUExQixDQUZVO0VBR2I5c0QsZUFBT2w2QixLQUFLa2tCLEtBQUwsQ0FBWXdaLEtBQUt4RCxLQUFMLEdBQWE4c0QsV0FBWSxDQUFaLENBQXpCLENBSE07RUFJYjdzRCxnQkFBUW42QixLQUFLa2tCLEtBQUwsQ0FBV3daLEtBQUt2RCxNQUFMLEdBQWM2c0QsV0FBWSxDQUFaLENBQXpCO0VBSkssT0FBZDtFQU1BbytFLG9CQUFjO0VBQ2IxMEosV0FBRzFRLEtBQUtra0IsS0FBTCxDQUFZd1osS0FBS3hELEtBQUwsR0FBYStzRCxZQUFhLENBQWIsQ0FBekIsQ0FEVTtFQUViL2xFLFdBQUdsaEIsS0FBS2trQixLQUFMLENBQVl3WixLQUFLdkQsTUFBTCxHQUFjOHNELFlBQWEsQ0FBYixDQUExQixDQUZVO0VBR2Ivc0QsZUFBT2w2QixLQUFLa2tCLEtBQUwsQ0FBWXdaLEtBQUt4RCxLQUFMLEdBQWErc0QsWUFBYSxDQUFiLENBQXpCLENBSE07RUFJYjlzRCxnQkFBUW42QixLQUFLa2tCLEtBQUwsQ0FBV3daLEtBQUt2RCxNQUFMLEdBQWM4c0QsWUFBYSxDQUFiLENBQXpCO0VBSkssT0FBZDs7RUFPQSxVQUFLbE8sWUFBTCxFQUFvQjtFQUVuQjFrQixpQkFBU2laLGVBQVQsQ0FBMEJ5TCxZQUExQjtFQUNBQSxxQkFBYXQ5QyxXQUFiLEdBQTJCLElBQTNCO0VBRUEsT0FMRCxNQUtPO0VBRU40NEIsaUJBQVNpWixlQUFULENBQTBCLElBQTFCO0VBQ0FqWixpQkFBU3dZLGNBQVQsQ0FBeUIsSUFBekI7RUFFQTs7RUFFRCxVQUFLeFksU0FBU1MsU0FBVCxJQUFzQkwsVUFBM0IsRUFBd0NKLFNBQVMzbEQsS0FBVDtFQUV4QyxVQUFLNm1CLE9BQU9wbUIsTUFBUCxLQUFrQixJQUF2QixFQUE4Qm9tQixPQUFPbUosaUJBQVA7RUFFOUJuSixhQUFPRSxXQUFQLENBQW1CeEcsU0FBbkIsQ0FBOEJ5MUQsUUFBUTMxRCxRQUF0QyxFQUFnRDIxRCxRQUFRMTFELFVBQXhELEVBQW9FMDFELFFBQVE1MkQsS0FBNUU7RUFDQXlILGFBQU9FLFdBQVAsQ0FBbUJ4RyxTQUFuQixDQUE4QjIxRCxRQUFRNzFELFFBQXRDLEVBQWdENjFELFFBQVE1MUQsVUFBeEQsRUFBb0U0MUQsUUFBUTkyRCxLQUE1RTtFQUVBLFVBQUlBLFFBQVEsS0FBS0EsS0FBakI7RUFDQTQyRCxjQUFRanNDLGVBQVIsQ0FBeUJ3c0gsZUFBekIsRUFBMENuM0ksS0FBMUM7RUFDQTgyRCxjQUFRbnNDLGVBQVIsQ0FBeUJ5c0gsZUFBekIsRUFBMENwM0ksS0FBMUM7O0VBRUEsVUFBS2kzSSxVQUFVLytFLFlBQWYsRUFBOEI7RUFFN0IrK0Usa0JBQVVqL0UsU0FBVixHQUFzQnZ3RCxPQUFPdkYsSUFBN0I7RUFDQSswSSxrQkFBVWgvRSxRQUFWLEdBQXFCeHdELE9BQU90RixHQUE1QjtFQUVBODBJLGtCQUFVLytFLFlBQVYsQ0FBd0J6QixTQUF4QjtFQUVBRyxnQkFBUWx2RCxnQkFBUixDQUF5QjNSLFFBQXpCLEdBQW9DMGdFLFVBQVVxQyxvQkFBOUM7RUFDQWhDLGdCQUFRcHZELGdCQUFSLENBQXlCM1IsUUFBekIsR0FBb0MwZ0UsVUFBVXNDLHFCQUE5QztFQUVBLE9BVkQsTUFVTztFQUVObkMsZ0JBQVFsdkQsZ0JBQVIsR0FBMkJreEksZ0JBQWlCWixXQUFXYSxXQUE1QixFQUF5QyxJQUF6QyxFQUErQ3B4SSxPQUFPdkYsSUFBdEQsRUFBNER1RixPQUFPdEYsR0FBbkUsQ0FBM0I7RUFDQTIwRCxnQkFBUXB2RCxnQkFBUixHQUEyQmt4SSxnQkFBaUJELFdBQVdFLFdBQTVCLEVBQXlDLElBQXpDLEVBQStDcHhJLE9BQU92RixJQUF0RCxFQUE0RHVGLE9BQU90RixHQUFuRSxDQUEzQjtFQUVBLE9BaEdxQzs7O0VBbUd0QyxVQUFLOG9ELFlBQUwsRUFBb0I7RUFFbkJBLHFCQUFhcjlDLFFBQWIsQ0FBc0JqdEIsR0FBdEIsQ0FBMkIwMkosWUFBWXowSixDQUF2QyxFQUEwQ3kwSixZQUFZamtKLENBQXRELEVBQXlEaWtKLFlBQVlqckksS0FBckUsRUFBNEVpckksWUFBWWhySSxNQUF4RjtFQUNBNCtDLHFCQUFhdjlDLE9BQWIsQ0FBcUIvc0IsR0FBckIsQ0FBMEIwMkosWUFBWXowSixDQUF0QyxFQUF5Q3kwSixZQUFZamtKLENBQXJELEVBQXdEaWtKLFlBQVlqckksS0FBcEUsRUFBMkVpckksWUFBWWhySSxNQUF2RjtFQUVBLE9BTEQsTUFLTztFQUVOazZCLGlCQUFTMDJCLFdBQVQsQ0FBc0JvNkUsWUFBWXowSixDQUFsQyxFQUFxQ3kwSixZQUFZamtKLENBQWpELEVBQW9EaWtKLFlBQVlqckksS0FBaEUsRUFBdUVpckksWUFBWWhySSxNQUFuRjtFQUNBazZCLGlCQUFTODJCLFVBQVQsQ0FBcUJnNkUsWUFBWXowSixDQUFqQyxFQUFvQ3kwSixZQUFZamtKLENBQWhELEVBQW1EaWtKLFlBQVlqckksS0FBL0QsRUFBc0VpckksWUFBWWhySSxNQUFsRjtFQUVBOztFQUNEazZCLGVBQVNxQixNQUFULENBQWlCbEIsS0FBakIsRUFBd0Jrd0IsT0FBeEIsRUFBaUMzTCxZQUFqQyxFQUErQ3RrQixVQUEvQyxFQTlHc0M7O0VBaUh0QyxVQUFLc2tCLFlBQUwsRUFBb0I7RUFFbkJBLHFCQUFhcjlDLFFBQWIsQ0FBc0JqdEIsR0FBdEIsQ0FBMkIyMkosWUFBWTEwSixDQUF2QyxFQUEwQzAwSixZQUFZbGtKLENBQXRELEVBQXlEa2tKLFlBQVlsckksS0FBckUsRUFBNEVrckksWUFBWWpySSxNQUF4RjtFQUNBNCtDLHFCQUFhdjlDLE9BQWIsQ0FBcUIvc0IsR0FBckIsQ0FBMEIyMkosWUFBWTEwSixDQUF0QyxFQUF5QzAwSixZQUFZbGtKLENBQXJELEVBQXdEa2tKLFlBQVlsckksS0FBcEUsRUFBMkVrckksWUFBWWpySSxNQUF2RjtFQUVBLE9BTEQsTUFLTztFQUVOazZCLGlCQUFTMDJCLFdBQVQsQ0FBc0JxNkUsWUFBWTEwSixDQUFsQyxFQUFxQzAwSixZQUFZbGtKLENBQWpELEVBQW9Ea2tKLFlBQVlsckksS0FBaEUsRUFBdUVrckksWUFBWWpySSxNQUFuRjtFQUNBazZCLGlCQUFTODJCLFVBQVQsQ0FBcUJpNkUsWUFBWTEwSixDQUFqQyxFQUFvQzAwSixZQUFZbGtKLENBQWhELEVBQW1Ea2tKLFlBQVlsckksS0FBL0QsRUFBc0VrckksWUFBWWpySSxNQUFsRjtFQUVBOztFQUNEazZCLGVBQVNxQixNQUFULENBQWlCbEIsS0FBakIsRUFBd0Jvd0IsT0FBeEIsRUFBaUM3TCxZQUFqQyxFQUErQ3RrQixVQUEvQzs7RUFFQSxVQUFLc2tCLFlBQUwsRUFBb0I7RUFFbkJBLHFCQUFhcjlDLFFBQWIsQ0FBc0JqdEIsR0FBdEIsQ0FBMkIsQ0FBM0IsRUFBOEIsQ0FBOUIsRUFBaUNpdkIsS0FBS3hELEtBQXRDLEVBQTZDd0QsS0FBS3ZELE1BQWxEO0VBQ0E0K0MscUJBQWF2OUMsT0FBYixDQUFxQi9zQixHQUFyQixDQUEwQixDQUExQixFQUE2QixDQUE3QixFQUFnQ2l2QixLQUFLeEQsS0FBckMsRUFBNEN3RCxLQUFLdkQsTUFBakQ7RUFDQTQrQyxxQkFBYXQ5QyxXQUFiLEdBQTJCLEtBQTNCO0VBQ0E0NEIsaUJBQVNpWixlQUFULENBQTBCLElBQTFCO0VBRUEsT0FQRCxNQU9PO0VBRU5qWixpQkFBUzAyQixXQUFULENBQXNCLENBQXRCLEVBQXlCLENBQXpCLEVBQTRCcnRELEtBQUt4RCxLQUFqQyxFQUF3Q3dELEtBQUt2RCxNQUE3QztFQUNBazZCLGlCQUFTd1ksY0FBVCxDQUF5QixLQUF6QjtFQUVBOztFQUVELFVBQUtMLFVBQUwsRUFBa0I7RUFFakJoWSxjQUFNZ1ksVUFBTixHQUFtQixJQUFuQjtFQUVBOztFQUVELFVBQUtqdUMsTUFBTWlvSSxlQUFYLEVBQTZCO0VBRTVCam9JLGNBQU00b0QsV0FBTjtFQUVBOztFQUVEO0VBRUEsS0E1SmlFOzs7RUFnS2xFOXlCLGFBQVNxQixNQUFULENBQWlCbEIsS0FBakIsRUFBd0JqL0IsTUFBeEIsRUFBZ0N3akQsWUFBaEMsRUFBOEN0a0IsVUFBOUM7RUFFQSxHQWxLRDs7RUFvS0EsT0FBSzc1QixPQUFMLEdBQWUsWUFBWTtFQUUxQjc1QixXQUFPd2UsbUJBQVAsQ0FBNEIsd0JBQTVCLEVBQXNEa2xFLHdCQUF0RCxFQUFnRixLQUFoRjtFQUVBLEdBSkQsQ0FwWXNEOzs7RUE0WXRELFdBQVNtaUYsbUJBQVQsQ0FBOEJ6akYsR0FBOUIsRUFBb0M7RUFFbkMsUUFBSTBqRixVQUFVLE9BQVExakYsSUFBSTJqRixPQUFKLEdBQWMzakYsSUFBSTRqRixRQUExQixDQUFkO0VBQ0EsUUFBSUMsV0FBVyxDQUFFN2pGLElBQUkyakYsT0FBSixHQUFjM2pGLElBQUk0akYsUUFBcEIsSUFBaUNGLE9BQWpDLEdBQTJDLEdBQTFEO0VBQ0EsUUFBSUksVUFBVSxPQUFROWpGLElBQUkrakYsS0FBSixHQUFZL2pGLElBQUlna0YsT0FBeEIsQ0FBZDtFQUNBLFFBQUlDLFdBQVcsQ0FBRWprRixJQUFJK2pGLEtBQUosR0FBWS9qRixJQUFJZ2tGLE9BQWxCLElBQThCRixPQUE5QixHQUF3QyxHQUF2RDtFQUNBLFdBQU87RUFBRW41SSxhQUFPLENBQUUrNEksT0FBRixFQUFXSSxPQUFYLENBQVQ7RUFBK0J4aEosY0FBUSxDQUFFdWhKLFFBQUYsRUFBWUksUUFBWjtFQUF2QyxLQUFQO0VBRUE7O0VBRUQsV0FBU0MsbUJBQVQsQ0FBOEJsa0YsR0FBOUIsRUFBbUNta0YsV0FBbkMsRUFBZ0RDLEtBQWhELEVBQXVEQyxJQUF2RCxFQUE4RDtFQUU3REYsa0JBQWNBLGdCQUFnQjdxSyxTQUFoQixHQUE0QixJQUE1QixHQUFtQzZxSyxXQUFqRDtFQUNBQyxZQUFRQSxVQUFVOXFLLFNBQVYsR0FBc0IsSUFBdEIsR0FBNkI4cUssS0FBckM7RUFDQUMsV0FBT0EsU0FBUy9xSyxTQUFULEdBQXFCLE9BQXJCLEdBQStCK3FLLElBQXRDO0VBRUEsUUFBSUMsa0JBQWtCSCxjQUFjLENBQUUsR0FBaEIsR0FBc0IsR0FBNUMsQ0FONkQ7O0VBUzdELFFBQUlJLE9BQU8sSUFBSXZoSixTQUFKLEVBQVg7RUFDQSxRQUFJeEYsSUFBSSttSixLQUFLN2pKLFFBQWIsQ0FWNkQ7O0VBYTdELFFBQUk4akosaUJBQWlCZixvQkFBcUJ6akYsR0FBckIsQ0FBckIsQ0FiNkQ7O0VBZ0I3RHhpRSxNQUFHLElBQUksQ0FBSixHQUFRLENBQVgsSUFBaUJnbkosZUFBZTc1SSxLQUFmLENBQXNCLENBQXRCLENBQWpCO0VBQ0FuTixNQUFHLElBQUksQ0FBSixHQUFRLENBQVgsSUFBaUIsR0FBakI7RUFDQUEsTUFBRyxJQUFJLENBQUosR0FBUSxDQUFYLElBQWlCZ25KLGVBQWVsaUosTUFBZixDQUF1QixDQUF2QixJQUE2QmdpSixlQUE5QztFQUNBOW1KLE1BQUcsSUFBSSxDQUFKLEdBQVEsQ0FBWCxJQUFpQixHQUFqQixDQW5CNkQ7RUFzQjdEO0VBQ0E7O0VBQ0FBLE1BQUcsSUFBSSxDQUFKLEdBQVEsQ0FBWCxJQUFpQixHQUFqQjtFQUNBQSxNQUFHLElBQUksQ0FBSixHQUFRLENBQVgsSUFBaUJnbkosZUFBZTc1SSxLQUFmLENBQXNCLENBQXRCLENBQWpCO0VBQ0FuTixNQUFHLElBQUksQ0FBSixHQUFRLENBQVgsSUFBaUIsQ0FBRWduSixlQUFlbGlKLE1BQWYsQ0FBdUIsQ0FBdkIsQ0FBRixHQUErQmdpSixlQUFoRDtFQUNBOW1KLE1BQUcsSUFBSSxDQUFKLEdBQVEsQ0FBWCxJQUFpQixHQUFqQixDQTNCNkQ7O0VBOEI3REEsTUFBRyxJQUFJLENBQUosR0FBUSxDQUFYLElBQWlCLEdBQWpCO0VBQ0FBLE1BQUcsSUFBSSxDQUFKLEdBQVEsQ0FBWCxJQUFpQixHQUFqQjtFQUNBQSxNQUFHLElBQUksQ0FBSixHQUFRLENBQVgsSUFBaUI2bUosUUFBU0QsUUFBUUMsSUFBakIsSUFBMEIsQ0FBRUMsZUFBN0M7RUFDQTltSixNQUFHLElBQUksQ0FBSixHQUFRLENBQVgsSUFBbUI2bUosT0FBT0QsS0FBVCxJQUFxQkEsUUFBUUMsSUFBN0IsQ0FBakIsQ0FqQzZEOztFQW9DN0Q3bUosTUFBRyxJQUFJLENBQUosR0FBUSxDQUFYLElBQWlCLEdBQWpCO0VBQ0FBLE1BQUcsSUFBSSxDQUFKLEdBQVEsQ0FBWCxJQUFpQixHQUFqQjtFQUNBQSxNQUFHLElBQUksQ0FBSixHQUFRLENBQVgsSUFBaUI4bUosZUFBakI7RUFDQTltSixNQUFHLElBQUksQ0FBSixHQUFRLENBQVgsSUFBaUIsR0FBakI7RUFFQSttSixTQUFLeDZJLFNBQUw7RUFFQSxXQUFPdzZJLElBQVA7RUFFQTs7RUFFRCxXQUFTaEIsZUFBVCxDQUEwQnZqRixHQUExQixFQUErQm1rRixXQUEvQixFQUE0Q0MsS0FBNUMsRUFBbURDLElBQW5ELEVBQTBEO0VBRXpELFFBQUkxbkosVUFBVTlmLEtBQUsrZixFQUFMLEdBQVUsS0FBeEI7RUFFQSxRQUFJNm5KLFVBQVU7RUFDYlYsYUFBT2xuSyxLQUFLZ2tGLEdBQUwsQ0FBVWIsSUFBSTBrRixTQUFKLEdBQWdCL25KLE9BQTFCLENBRE07RUFFYnFuSixlQUFTbm5LLEtBQUtna0YsR0FBTCxDQUFVYixJQUFJMmtGLFdBQUosR0FBa0Job0osT0FBNUIsQ0FGSTtFQUdiZ25KLGVBQVM5bUssS0FBS2drRixHQUFMLENBQVViLElBQUk0a0YsV0FBSixHQUFrQmpvSixPQUE1QixDQUhJO0VBSWJpbkosZ0JBQVUvbUssS0FBS2drRixHQUFMLENBQVViLElBQUk2a0YsWUFBSixHQUFtQmxvSixPQUE3QjtFQUpHLEtBQWQ7RUFPQSxXQUFPdW5KLG9CQUFxQk8sT0FBckIsRUFBOEJOLFdBQTlCLEVBQTJDQyxLQUEzQyxFQUFrREMsSUFBbEQsQ0FBUDtFQUVBO0VBRUQsQ0FwZE07O0VDZkg7RUFDSjtFQUNBO0VBQ0E7RUFDQTs7QUFFQSxFQUFlLE1BQU0sVUFBVSxDQUFDO0VBQ2hDLEVBQUUsV0FBVyxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUU7RUFDL0IsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztFQUN6QixJQUFJLElBQUksQ0FBQyxTQUFTLENBQUM7RUFDbkIsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDO0VBQ3BCLElBQUksSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJcmhKLFNBQU8sRUFBRSxDQUFDO0VBQ3hDLElBQUksSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7O0VBRTFCLElBQUksSUFBSSxhQUFhLElBQUksTUFBTSxFQUFFO0VBQ2pDLE1BQU0sSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO0VBQ3pDLEtBQUs7O0VBRUwsSUFBSSxJQUFJLFNBQVMsQ0FBQyxhQUFhLEVBQUU7RUFDakMsTUFBTSxTQUFTO0VBQ2YsU0FBUyxhQUFhLEVBQUU7RUFDeEIsU0FBUyxJQUFJLENBQUMsQ0FBQyxRQUFRLEtBQUs7RUFDNUIsVUFBVSxJQUFJLENBQUMsVUFBVSxHQUFHLFFBQVEsQ0FBQztFQUNyQyxVQUFVLElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7RUFDbkMsWUFBWSxJQUFJLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUN6QyxXQUFXLE1BQU07RUFDakIsWUFBWSxJQUFJLE9BQU8sRUFBRSxPQUFPLENBQUMseUJBQXlCLENBQUMsQ0FBQztFQUM1RCxXQUFXO0VBQ1gsU0FBUyxDQUFDO0VBQ1YsU0FBUyxLQUFLLENBQUMsTUFBTTtFQUNyQixVQUFVLE9BQU8sQ0FBQyxJQUFJLENBQUMsdUNBQXVDLENBQUMsQ0FBQztFQUNoRSxTQUFTLENBQUMsQ0FBQztFQUNYLEtBQUs7O0VBRUw7RUFDQTtFQUNBO0VBQ0EsSUFBSSxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQzs7RUFFbkI7RUFDQTtFQUNBLElBQUksSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7O0VBRTFCO0VBQ0E7RUFDQSxJQUFJLElBQUksQ0FBQyxVQUFVLEdBQUcsR0FBRyxDQUFDO0VBQzFCLEdBQUc7O0VBRUgsRUFBRSxZQUFZLEdBQUc7RUFDakIsSUFBSSxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7RUFDMUIsR0FBRzs7RUFFSCxFQUFFLFlBQVksQ0FBQyxLQUFLLEVBQUU7RUFDdEIsSUFBSSxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztFQUMzQixHQUFHOztFQUVILEVBQUUsYUFBYSxHQUFHO0VBQ2xCLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxrREFBa0QsQ0FBQyxDQUFDO0VBQ3JFLElBQUksT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO0VBQzNCLEdBQUc7O0VBRUgsRUFBRSxpQkFBaUIsR0FBRztFQUN0QixJQUFJLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQztFQUMvQixHQUFHOztFQUVILEVBQUUsTUFBTSxHQUFHO0VBQ1gsSUFBSSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDOztFQUUvQixJQUFJLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtFQUN4QixNQUFNLElBQUksSUFBSSxDQUFDO0VBQ2YsTUFBTSxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxFQUFFO0VBQ3ZDLFFBQVEsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0VBQ3BELFFBQVEsSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDO0VBQ25DLE9BQU8sTUFBTSxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFO0VBQ3pDLFFBQVEsSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLENBQUM7RUFDeEMsT0FBTztFQUNQLE1BQU0sSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLElBQUksRUFBRTtFQUNyQyxRQUFRLE1BQU0sQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztFQUN0RCxPQUFPO0VBQ1AsTUFBTSxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssSUFBSSxFQUFFO0VBQ2xDLFFBQVEsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0VBQ2pELE9BQU8sTUFBTTtFQUNiLFFBQVEsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztFQUNyQyxPQUFPO0VBQ1AsTUFBTSxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7RUFDekIsUUFBUSxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsZUFBZSxFQUFFO0VBQzVDLFVBQVUsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDO0VBQ2hDLFVBQVUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsMEJBQTBCLENBQUMsQ0FBQztFQUNuRyxVQUFVLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0VBQ2xELFNBQVMsTUFBTTtFQUNmLFVBQVUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0VBQ3BFLFNBQVM7RUFDVCxPQUFPO0VBQ1AsTUFBTSxNQUFNLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7RUFDakQsS0FBSztFQUNMLEdBQUc7O0VBRUgsRUFBRSxPQUFPLEdBQUc7RUFDWixJQUFJLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO0VBQzFCLEdBQUc7RUFDSCxDQUFDOztFQ3RHRDs7Ozs7O0FBT0EsTUFBYThoSixRQUFRO0VBRXBCQyxlQUFhLHVCQUFZO0VBRXhCOTBKLFlBQVE2UCxJQUFSLENBQWMsNkVBQWQ7RUFDQSxXQUFPdlQsVUFBVTYxSixhQUFWLEtBQTRCOW9LLFNBQW5DO0VBRUEsR0FQbUI7RUFTcEIwcksscUJBQW1CLDZCQUFZO0VBRTlCLFdBQU8sSUFBSXI1SixPQUFKLENBQWEsVUFBVXJVLE9BQVYsRUFBbUJDLE1BQW5CLEVBQTRCO0VBRS9DLFVBQUtnVixVQUFVNjFKLGFBQVYsS0FBNEI5b0ssU0FBakMsRUFBNkM7RUFFNUNpVCxrQkFBVTYxSixhQUFWLEdBQTBCeHFLLElBQTFCLENBQWdDLFVBQVd1cUssUUFBWCxFQUFzQjtFQUVyRCxjQUFLQSxTQUFTeG5LLE1BQVQsS0FBb0IsQ0FBekIsRUFBNkI7RUFFNUJwRCxtQkFBUSwyQ0FBUjtFQUVBLFdBSkQsTUFJTztFQUVORDtFQUVBO0VBRUQsU0FaRDtFQWNBLE9BaEJELE1BZ0JPO0VBRU5DLGVBQVEsc0dBQVI7RUFFQTtFQUVELEtBeEJNLENBQVA7RUEwQkEsR0FyQ21CO0VBdUNwQmtySyxnQkFBYyxzQkFBV3dDLFNBQVgsRUFBdUI7RUFFcEMsUUFBSyxtQkFBbUIxNEosU0FBeEIsRUFBb0M7RUFFbkNBLGdCQUFVNjFKLGFBQVYsR0FDRXhxSyxJQURGLENBQ1EsVUFBV3VxSyxRQUFYLEVBQXNCO0VBQzVCOEMsa0JBQVc5QyxTQUFVLENBQVYsQ0FBWDtFQUNBLE9BSEY7RUFLQTtFQUVELEdBbERtQjtFQW9EcEIrQyxjQUFZLHNCQUFZO0VBRXZCajFKLFlBQVE2UCxJQUFSLENBQWMsdUZBQWQ7RUFFQSxRQUFJNG1FLE9BQUo7O0VBRUEsUUFBS242RSxVQUFVNjFKLGFBQWYsRUFBK0I7RUFFOUI3MUosZ0JBQVU2MUosYUFBVixHQUEwQnhxSyxJQUExQixDQUFnQyxVQUFXdXFLLFFBQVgsRUFBc0I7RUFFckQsWUFBS0EsU0FBU3huSyxNQUFULEtBQW9CLENBQXpCLEVBQTZCK3JGLFVBQVUsMkNBQVY7RUFFN0IsT0FKRDtFQU1BLEtBUkQsTUFRTztFQUVOQSxnQkFBVSxxR0FBVjtFQUVBOztFQUVELFFBQUtBLFlBQVlwdEYsU0FBakIsRUFBNkI7RUFFNUIsVUFBSTBoRSxZQUFZcDhELFNBQVNFLGFBQVQsQ0FBd0IsS0FBeEIsQ0FBaEI7RUFDQWs4RCxnQkFBVWwzRCxLQUFWLENBQWdCOG5CLFFBQWhCLEdBQTJCLFVBQTNCO0VBQ0FvdkMsZ0JBQVVsM0QsS0FBVixDQUFnQjJvQixJQUFoQixHQUF1QixHQUF2QjtFQUNBdXVDLGdCQUFVbDNELEtBQVYsQ0FBZ0I2b0IsR0FBaEIsR0FBc0IsR0FBdEI7RUFDQXF1QyxnQkFBVWwzRCxLQUFWLENBQWdCNG9CLEtBQWhCLEdBQXdCLEdBQXhCO0VBQ0FzdUMsZ0JBQVVsM0QsS0FBVixDQUFnQnFoSyxNQUFoQixHQUF5QixLQUF6QjtFQUNBbnFHLGdCQUFVb3FHLEtBQVYsR0FBa0IsUUFBbEI7RUFFQSxVQUFJNzBKLFFBQVEzUixTQUFTRSxhQUFULENBQXdCLEtBQXhCLENBQVo7RUFDQXlSLFlBQU16TSxLQUFOLENBQVl1aEssVUFBWixHQUF5QixZQUF6QjtFQUNBOTBKLFlBQU16TSxLQUFOLENBQVl3aEssUUFBWixHQUF1QixNQUF2QjtFQUNBLzBKLFlBQU16TSxLQUFOLENBQVl5aEssU0FBWixHQUF3QixRQUF4QjtFQUNBaDFKLFlBQU16TSxLQUFOLENBQVkwaEssVUFBWixHQUF5QixNQUF6QjtFQUNBajFKLFlBQU16TSxLQUFOLENBQVkyaEssZUFBWixHQUE4QixNQUE5QjtFQUNBbDFKLFlBQU16TSxLQUFOLENBQVlvbEMsS0FBWixHQUFvQixNQUFwQjtFQUNBMzRCLFlBQU16TSxLQUFOLENBQVk0aEssT0FBWixHQUFzQixXQUF0QjtFQUNBbjFKLFlBQU16TSxLQUFOLENBQVk2aEssTUFBWixHQUFxQixNQUFyQjtFQUNBcDFKLFlBQU16TSxLQUFOLENBQVlDLE9BQVosR0FBc0IsY0FBdEI7RUFDQXdNLFlBQU1xMUosU0FBTixHQUFrQmwvRSxPQUFsQjtFQUNBMXJCLGdCQUFVLzJELFdBQVYsQ0FBdUJzTSxLQUF2QjtFQUVBLGFBQU95cUQsU0FBUDtFQUVBO0VBRUQsR0FuR21CO0VBcUdwQjZxRyx1QkFBcUIsNkJBQVduL0UsT0FBWCxFQUFxQjtFQUV6QyxRQUFJMXJCLFlBQVlwOEQsU0FBU0UsYUFBVCxDQUF3QixLQUF4QixDQUFoQjtFQUNBazhELGNBQVVsM0QsS0FBVixDQUFnQjhuQixRQUFoQixHQUEyQixVQUEzQjtFQUNBb3ZDLGNBQVVsM0QsS0FBVixDQUFnQjJvQixJQUFoQixHQUF1QixHQUF2QjtFQUNBdXVDLGNBQVVsM0QsS0FBVixDQUFnQjZvQixHQUFoQixHQUFzQixHQUF0QjtFQUNBcXVDLGNBQVVsM0QsS0FBVixDQUFnQjRvQixLQUFoQixHQUF3QixHQUF4QjtFQUNBc3VDLGNBQVVsM0QsS0FBVixDQUFnQnFoSyxNQUFoQixHQUF5QixLQUF6QjtFQUNBbnFHLGNBQVVvcUcsS0FBVixHQUFrQixRQUFsQjtFQUVBLFFBQUk3MEosUUFBUTNSLFNBQVNFLGFBQVQsQ0FBd0IsS0FBeEIsQ0FBWjtFQUNBeVIsVUFBTXpNLEtBQU4sQ0FBWXVoSyxVQUFaLEdBQXlCLFlBQXpCO0VBQ0E5MEosVUFBTXpNLEtBQU4sQ0FBWXdoSyxRQUFaLEdBQXVCLE1BQXZCO0VBQ0EvMEosVUFBTXpNLEtBQU4sQ0FBWXloSyxTQUFaLEdBQXdCLFFBQXhCO0VBQ0FoMUosVUFBTXpNLEtBQU4sQ0FBWTBoSyxVQUFaLEdBQXlCLE1BQXpCO0VBQ0FqMUosVUFBTXpNLEtBQU4sQ0FBWTJoSyxlQUFaLEdBQThCLE1BQTlCO0VBQ0FsMUosVUFBTXpNLEtBQU4sQ0FBWW9sQyxLQUFaLEdBQW9CLE1BQXBCO0VBQ0EzNEIsVUFBTXpNLEtBQU4sQ0FBWTRoSyxPQUFaLEdBQXNCLFdBQXRCO0VBQ0FuMUosVUFBTXpNLEtBQU4sQ0FBWTZoSyxNQUFaLEdBQXFCLE1BQXJCO0VBQ0FwMUosVUFBTXpNLEtBQU4sQ0FBWUMsT0FBWixHQUFzQixjQUF0QjtFQUNBd00sVUFBTXExSixTQUFOLEdBQWtCbC9FLE9BQWxCO0VBQ0ExckIsY0FBVS8yRCxXQUFWLENBQXVCc00sS0FBdkI7RUFFQSxXQUFPeXFELFNBQVA7RUFFQSxHQTlIbUI7RUFnSXBCOHFHLGFBQVcsbUJBQVcvaEssT0FBWCxFQUFvQjh5QixNQUFwQixFQUE2QjtFQUV2QyxRQUFLLGNBQWNrdkksS0FBZCxJQUF1QmhpSyxtQkFBbUJnaUssTUFBTXBFLFFBQXJELEVBQWdFO0VBRS9EMXhKLGNBQVFNLEtBQVIsQ0FBZSw0Q0FBZjtFQUNBLGFBQU8zUixTQUFTRSxhQUFULENBQXdCLFFBQXhCLENBQVA7RUFFQTs7RUFFRCxRQUFJNjdKLFNBQVMvN0osU0FBU0UsYUFBVCxDQUF3QixRQUF4QixDQUFiO0VBQ0E2N0osV0FBTzcySixLQUFQLENBQWE4bkIsUUFBYixHQUF3QixVQUF4QjtFQUNBK3VJLFdBQU83MkosS0FBUCxDQUFhMm9CLElBQWIsR0FBb0Isa0JBQXBCO0VBQ0FrdUksV0FBTzcySixLQUFQLENBQWE4b0IsTUFBYixHQUFzQixNQUF0QjtFQUNBK3RJLFdBQU83MkosS0FBUCxDQUFhaXpCLEtBQWIsR0FBcUIsT0FBckI7RUFDQTRqSSxXQUFPNzJKLEtBQVAsQ0FBYWtpSyxNQUFiLEdBQXNCLEdBQXRCO0VBQ0FyTCxXQUFPNzJKLEtBQVAsQ0FBYTRoSyxPQUFiLEdBQXVCLEtBQXZCO0VBQ0EvSyxXQUFPNzJKLEtBQVAsQ0FBYW1pSyxNQUFiLEdBQXNCLFNBQXRCO0VBQ0F0TCxXQUFPNzJKLEtBQVAsQ0FBYTJoSyxlQUFiLEdBQStCLE1BQS9CO0VBQ0E5SyxXQUFPNzJKLEtBQVAsQ0FBYW9sQyxLQUFiLEdBQXFCLE1BQXJCO0VBQ0F5eEgsV0FBTzcySixLQUFQLENBQWF1aEssVUFBYixHQUEwQixZQUExQjtFQUNBMUssV0FBTzcySixLQUFQLENBQWF3aEssUUFBYixHQUF3QixNQUF4QjtFQUNBM0ssV0FBTzcySixLQUFQLENBQWF5aEssU0FBYixHQUF5QixRQUF6QjtFQUNBNUssV0FBTzcySixLQUFQLENBQWFvaUssU0FBYixHQUF5QixRQUF6QjtFQUNBdkwsV0FBTzcySixLQUFQLENBQWFxaEssTUFBYixHQUFzQixLQUF0Qjs7RUFFQSxRQUFLcGhLLE9BQUwsRUFBZTtFQUVkNDJKLGFBQU93TCxXQUFQLEdBQXFCLFVBQXJCOztFQUNBeEwsYUFBT3lMLE9BQVAsR0FBaUIsWUFBWTtFQUU1QnJpSyxnQkFBUTY5RSxZQUFSLEdBQXVCNzlFLFFBQVFvL0osV0FBUixFQUF2QixHQUErQ3AvSixRQUFRbS9KLGNBQVIsQ0FBd0IsQ0FBRTtFQUFFbGpLLGtCQUFRNjJCO0VBQVYsU0FBRixDQUF4QixDQUEvQztFQUVBLE9BSkQ7O0VBTUFqNUIsYUFBT3FOLGdCQUFQLENBQXlCLHdCQUF6QixFQUFtRCxZQUFZO0VBRTlEMHZKLGVBQU93TCxXQUFQLEdBQXFCcGlLLFFBQVE2OUUsWUFBUixHQUF1QixTQUF2QixHQUFtQyxVQUF4RDtFQUVBLE9BSkQsRUFJRyxLQUpIO0VBTUEsS0FmRCxNQWVPO0VBRU4rNEUsYUFBT3dMLFdBQVAsR0FBcUIsZUFBckI7RUFFQTs7RUFFRCxXQUFPeEwsTUFBUDtFQUVBO0VBaExtQixDQUFkOztNQ0lNMEwsUUFBYjtFQUFBO0VBQUE7RUFDRSxzQkFBeUI7RUFBQSxRQUFidHlFLE1BQWEsdUVBQUosRUFBSTtFQUFBO0VBQ3ZCLFNBQUtBLE1BQUwsR0FBYzkvRixPQUFPNG5CLE1BQVAsQ0FBY2s0RSxNQUFkLEVBQXNCO0VBQ2xDck4sZUFBUyxJQUR5QjtFQUVsQ2kwRSxjQUFRO0VBRjBCLEtBQXRCLENBQWQ7RUFLQSxTQUFLdHBHLEtBQUwsR0FBYSxJQUFiO0VBQ0EsU0FBS2ovQixNQUFMLEdBQWMsSUFBZDtFQUNBLFNBQUtrMEksTUFBTCxHQUFjLElBQWQ7RUFDRDs7RUFWSDtFQUFBO0VBQUEsNEJBWVVsK0QsUUFaVixFQVltQjtFQUFBOztFQUNmQSxlQUFRcTBDLE1BQVIsQ0FBZSxJQUFmOztFQUlBLFVBQU1jLFlBQVluMUMsU0FBUTJxQyxHQUFSLENBQVksV0FBWixDQUFsQjs7RUFDQSxVQUFNN2hGLFdBQVdrM0MsU0FBUTFwRyxHQUFSLENBQVksVUFBWixDQUFqQjs7RUFFQSxVQUFNa3hKLFNBQVN4bkQsU0FBUTJxQyxHQUFSLENBQVksUUFBWixDQUFmOztFQUVBLFdBQUt1ekIsTUFBTCxHQUFjLElBQUkzRSxRQUFKLENBQWF6d0csUUFBYixDQUFkO0VBRUEsV0FBS0csS0FBTCxHQUFhKzJDLFNBQVExcEcsR0FBUixDQUFZLE9BQVosQ0FBYjtFQUNBLFdBQUswekIsTUFBTCxHQUFjZzJFLFNBQVExcEcsR0FBUixDQUFZLFFBQVosQ0FBZDtFQUVBNitJLGdCQUFVK29CLE1BQVYsQ0FBaUIsS0FBS0EsTUFBdEIsRUFmZTs7RUFtQmYxVyxhQUFPMlcsV0FBUCxDQUFtQixVQUFDeHZJLEtBQUQsRUFBUUMsTUFBUixFQUFtQjtFQUNwQyxjQUFLc3ZJLE1BQUwsQ0FBWXh0SSxPQUFaLENBQW9CLENBQUMvQixLQUFyQixFQUE0QixDQUFDQyxNQUE3QjtFQUNELE9BRkQsRUFuQmU7O0VBQUEseUJBd0JXLEtBQUsrOEQsTUF4QmhCO0VBQUEsVUF3QlJyTixPQXhCUSxnQkF3QlJBLE9BeEJRO0VBQUEsVUF3QkNpMEUsTUF4QkQsZ0JBd0JDQSxNQXhCRDtFQTBCZixVQUFJajBFLE9BQUosRUFBYW8rRSxNQUFNRSxpQkFBTixHQUEwQjNDLEtBQTFCLENBQWdDLG1CQUFXO0VBQ3pEempLLGlCQUFTMjhJLElBQVQsQ0FBY3QzSSxXQUFkLENBQTBCNmdLLE1BQU1lLG1CQUFOLENBQTBCbi9FLE9BQTFCLENBQTFCO0VBQ0EsT0FGYztFQUliLFVBQUlpMEUsTUFBSixFQUFZbUssTUFBTXJDLFlBQU4sQ0FBbUIsbUJBQVc7RUFDeEMsWUFBTStELFFBQVExQixNQUFNZ0IsU0FBTixDQUFnQi9oSyxPQUFoQixFQUF5Qm10RCxTQUFTMnpCLFVBQWxDLENBQWQ7RUFDQTJoRixjQUFNL3FCLFNBQU4sR0FBa0IsUUFBbEI7RUFFQTc4SSxpQkFBUzI4SSxJQUFULENBQWN0M0ksV0FBZCxDQUEwQnVpSyxLQUExQjtFQUNELE9BTFc7RUFNYjtFQWhESDtFQUFBO0VBQUE7QUFtREEsTUFBYUMsU0FBYjtFQUFBO0VBQUE7RUFDRSx1QkFBYztFQUFBO0VBQ1osU0FBSzFpSyxPQUFMLEdBQWUsSUFBSTRILE9BQUosQ0FBWTtFQUFBLGFBQVdtNUosTUFBTXJDLFlBQU4sQ0FBbUI7RUFBQSxlQUFXbnJLLFFBQVF5TSxPQUFSLENBQVg7RUFBQSxPQUFuQixDQUFYO0VBQUEsS0FBWixDQUFmO0VBQ0Q7O0VBSEg7RUFBQTtFQUFBLDRCQUtVcWtHLFNBTFYsRUFLbUI7RUFDZkEsZ0JBQVFxMEMsTUFBUixDQUFlLElBQWY7O0VBRUEsVUFBTXZyRixXQUFXazNDLFVBQVExcEcsR0FBUixDQUFZLFVBQVosQ0FBakI7O0VBQ0F3eUQsZUFBU2syQixFQUFULENBQVludkMsT0FBWixHQUFzQixJQUF0QjtFQUNBaG9DLGNBQVErTyxHQUFSLENBQVlpbEUsVUFBWjtFQUNBaDBFLGNBQVErTyxHQUFSLENBQVksQ0FBWjtFQUVBLFdBQUtqYixPQUFMLENBQWFuTSxJQUFiLENBQWtCLG1CQUFXO0VBQzNCczVELGlCQUFTazJCLEVBQVQsQ0FBWTdFLFNBQVosQ0FBc0J4K0UsT0FBdEI7RUFFQSxZQUFNeWlLLFFBQVExQixNQUFNZ0IsU0FBTixDQUFnQi9oSyxPQUFoQixFQUF5Qm10RCxTQUFTMnpCLFVBQWxDLENBQWQ7RUFDQTJoRixjQUFNL3FCLFNBQU4sR0FBa0IsUUFBbEI7RUFFQTc4SSxpQkFBUzI4SSxJQUFULENBQWN0M0ksV0FBZCxDQUEwQnVpSyxLQUExQjtFQUNELE9BUEQ7RUFRRDtFQXJCSDtFQUFBO0VBQUE7QUF3QkEsTUFBYUUsWUFBYjtFQUFBO0VBQUE7RUFDRSwrQkFBMEM7RUFBQSxRQUE3QmxzSyxNQUE2QixRQUE3QkEsTUFBNkI7RUFBQSxRQUFyQmd0RyxPQUFxQixRQUFyQkEsT0FBcUI7RUFBQSxRQUFacGhDLFNBQVksUUFBWkEsU0FBWTtFQUFBO0VBQ3hDLFFBQU0rdEYsV0FBVyxJQUFJd1MsVUFBSixDQUFxQm5zSyxPQUFPazVJLE1BQTVCLEVBQW9DbHNDLE9BQXBDLENBQWpCO0VBRUEyc0QsYUFBUzFxQixRQUFULEdBQW9CLElBQXBCO0VBQ0EwcUIsYUFBU3hwSSxLQUFULEdBQWlCeTdDLFNBQWpCO0VBSndDLHNGQU1sQztFQUFDK3RGO0VBQUQsS0FOa0M7RUFPekM7O0VBUkg7RUFBQTtFQUFBLEVBQWdDRCxjQUFoQzs7Ozs7Ozs7Ozs7Ozs7OyJ9